summaryrefslogtreecommitdiffstats
path: root/gnu/usr.bin/perl
diff options
context:
space:
mode:
authormillert <millert@openbsd.org>2001-05-24 18:21:31 +0000
committermillert <millert@openbsd.org>2001-05-24 18:21:31 +0000
commitc48bdce47de487644c5bf49fc71f7db60e4f07d6 (patch)
tree1044cea90429d4b1485356ed038fb38b7dba2eb2 /gnu/usr.bin/perl
parentAdd isakmpd.pid to the FILES section. (diff)
downloadwireguard-openbsd-c48bdce47de487644c5bf49fc71f7db60e4f07d6.tar.xz
wireguard-openbsd-c48bdce47de487644c5bf49fc71f7db60e4f07d6.zip
stock perl 5.6.1
Diffstat (limited to 'gnu/usr.bin/perl')
-rw-r--r--gnu/usr.bin/perl/AUTHORS677
-rw-r--r--gnu/usr.bin/perl/Changes5.0042
-rw-r--r--gnu/usr.bin/perl/Policy_sh.SH52
-rw-r--r--gnu/usr.bin/perl/Porting/Contract2
-rw-r--r--gnu/usr.bin/perl/Porting/config.sh147
-rw-r--r--gnu/usr.bin/perl/Porting/genlog26
-rw-r--r--gnu/usr.bin/perl/Porting/p4desc43
-rw-r--r--gnu/usr.bin/perl/Porting/patching.pod32
-rw-r--r--gnu/usr.bin/perl/Porting/repository.pod327
-rw-r--r--gnu/usr.bin/perl/README.Y2K2
-rw-r--r--gnu/usr.bin/perl/README.aix174
-rw-r--r--gnu/usr.bin/perl/README.bs2000202
-rw-r--r--gnu/usr.bin/perl/README.cygwin277
-rw-r--r--gnu/usr.bin/perl/README.dos154
-rw-r--r--gnu/usr.bin/perl/README.epoc267
-rw-r--r--gnu/usr.bin/perl/README.hpux262
-rw-r--r--gnu/usr.bin/perl/README.machten18
-rw-r--r--gnu/usr.bin/perl/README.macos60
-rw-r--r--gnu/usr.bin/perl/README.mpeix841
-rw-r--r--gnu/usr.bin/perl/README.os390316
-rw-r--r--gnu/usr.bin/perl/README.solaris526
-rw-r--r--gnu/usr.bin/perl/README.vmesa118
-rw-r--r--gnu/usr.bin/perl/README.vos241
-rw-r--r--gnu/usr.bin/perl/Todo-5.672
-rw-r--r--gnu/usr.bin/perl/bytecode.pl229
-rw-r--r--gnu/usr.bin/perl/configure.com4379
-rw-r--r--gnu/usr.bin/perl/cygwin/Makefile.SHs20
-rw-r--r--gnu/usr.bin/perl/cygwin/cygwin.c127
-rw-r--r--gnu/usr.bin/perl/djgpp/config.over5
-rw-r--r--gnu/usr.bin/perl/djgpp/djgpp.c20
-rw-r--r--gnu/usr.bin/perl/emacs/ptags4
-rw-r--r--gnu/usr.bin/perl/embedvar.h77
-rw-r--r--gnu/usr.bin/perl/epoc/config.sh287
-rw-r--r--gnu/usr.bin/perl/epoc/createpkg.pl14
-rw-r--r--gnu/usr.bin/perl/epoc/epoc.c152
-rw-r--r--gnu/usr.bin/perl/epoc/epoc_stubs.c4
-rw-r--r--gnu/usr.bin/perl/epoc/epocish.c64
-rw-r--r--gnu/usr.bin/perl/epoc/epocish.h16
-rw-r--r--gnu/usr.bin/perl/epoc/link.pl6
-rw-r--r--gnu/usr.bin/perl/ext/B/B.pm77
-rw-r--r--gnu/usr.bin/perl/ext/B/B.xs51
-rw-r--r--gnu/usr.bin/perl/ext/B/B/Asmdata.pm185
-rw-r--r--gnu/usr.bin/perl/ext/B/B/Assembler.pm119
-rw-r--r--gnu/usr.bin/perl/ext/B/B/Bytecode.pm415
-rw-r--r--gnu/usr.bin/perl/ext/B/B/C.pm30
-rw-r--r--gnu/usr.bin/perl/ext/B/B/CC.pm2
-rw-r--r--gnu/usr.bin/perl/ext/B/B/Concise.pm823
-rw-r--r--gnu/usr.bin/perl/ext/B/B/Debug.pm17
-rw-r--r--gnu/usr.bin/perl/ext/B/B/Deparse.pm448
-rw-r--r--gnu/usr.bin/perl/ext/B/B/Disassembler.pm7
-rw-r--r--gnu/usr.bin/perl/ext/B/B/Lint.pm6
-rw-r--r--gnu/usr.bin/perl/ext/B/B/Showlex.pm23
-rw-r--r--gnu/usr.bin/perl/ext/B/B/Stash.pm10
-rw-r--r--gnu/usr.bin/perl/ext/B/B/Terse.pm13
-rw-r--r--gnu/usr.bin/perl/ext/B/Makefile.PL20
-rw-r--r--gnu/usr.bin/perl/ext/B/O.pm3
-rw-r--r--gnu/usr.bin/perl/ext/B/defsubs_h.PL13
-rw-r--r--gnu/usr.bin/perl/ext/B/ramblings/flip-flop4
-rw-r--r--gnu/usr.bin/perl/ext/ByteLoader/ByteLoader.pm6
-rw-r--r--gnu/usr.bin/perl/ext/ByteLoader/ByteLoader.xs104
-rw-r--r--gnu/usr.bin/perl/ext/ByteLoader/bytecode.h170
-rw-r--r--gnu/usr.bin/perl/ext/ByteLoader/byterun.c411
-rw-r--r--gnu/usr.bin/perl/ext/ByteLoader/byterun.h209
-rw-r--r--gnu/usr.bin/perl/ext/DB_File/Changes43
-rw-r--r--gnu/usr.bin/perl/ext/DB_File/dbinfo18
-rw-r--r--gnu/usr.bin/perl/ext/DB_File/version.c12
-rw-r--r--gnu/usr.bin/perl/ext/Data/Dumper/Dumper.pm11
-rw-r--r--gnu/usr.bin/perl/ext/Data/Dumper/Dumper.xs8
-rw-r--r--gnu/usr.bin/perl/ext/Devel/DProf/DProf.xs16
-rw-r--r--gnu/usr.bin/perl/ext/Devel/Peek/Makefile.PL1
-rw-r--r--gnu/usr.bin/perl/ext/Devel/Peek/Peek.pm74
-rw-r--r--gnu/usr.bin/perl/ext/Devel/Peek/Peek.xs194
-rw-r--r--gnu/usr.bin/perl/ext/DynaLoader/DynaLoader_pm.PL138
-rw-r--r--gnu/usr.bin/perl/ext/DynaLoader/XSLoader_pm.PL6
-rw-r--r--gnu/usr.bin/perl/ext/DynaLoader/dl_dllload.xs189
-rw-r--r--gnu/usr.bin/perl/ext/DynaLoader/dl_mac.xs137
-rw-r--r--gnu/usr.bin/perl/ext/DynaLoader/hints/aix.pl6
-rw-r--r--gnu/usr.bin/perl/ext/DynaLoader/hints/netbsd.pl3
-rw-r--r--gnu/usr.bin/perl/ext/Errno/ChangeLog5
-rw-r--r--gnu/usr.bin/perl/ext/Errno/Errno_pm.PL82
-rw-r--r--gnu/usr.bin/perl/ext/File/Glob/Changes2
-rw-r--r--gnu/usr.bin/perl/ext/File/Glob/Glob.pm112
-rw-r--r--gnu/usr.bin/perl/ext/File/Glob/Glob.xs15
-rw-r--r--gnu/usr.bin/perl/ext/File/Glob/bsd_glob.c44
-rw-r--r--gnu/usr.bin/perl/ext/File/Glob/bsd_glob.h1
-rw-r--r--gnu/usr.bin/perl/ext/GDBM_File/GDBM_File.xs12
-rw-r--r--gnu/usr.bin/perl/ext/IO/lib/IO/Poll.pm73
-rw-r--r--gnu/usr.bin/perl/ext/IO/lib/IO/Socket/UNIX.pm2
-rw-r--r--gnu/usr.bin/perl/ext/IPC/SysV/SysV.xs8
-rw-r--r--gnu/usr.bin/perl/ext/NDBM_File/Makefile.PL1
-rw-r--r--gnu/usr.bin/perl/ext/NDBM_File/NDBM_File.xs5
-rw-r--r--gnu/usr.bin/perl/ext/ODBM_File/typemap10
-rw-r--r--gnu/usr.bin/perl/ext/POSIX/Makefile.PL7
-rw-r--r--gnu/usr.bin/perl/ext/POSIX/hints/svr4.pl12
-rw-r--r--gnu/usr.bin/perl/ext/POSIX/typemap1
-rw-r--r--gnu/usr.bin/perl/ext/SDBM_File/SDBM_File.xs2
-rw-r--r--gnu/usr.bin/perl/ext/SDBM_File/sdbm/dbm.c37
-rw-r--r--gnu/usr.bin/perl/ext/SDBM_File/sdbm/dbm.h37
-rw-r--r--gnu/usr.bin/perl/ext/Sys/Syslog/Syslog.xs3
-rw-r--r--gnu/usr.bin/perl/ext/Thread/Thread.pm11
-rw-r--r--gnu/usr.bin/perl/ext/Thread/Thread.xs14
-rw-r--r--gnu/usr.bin/perl/ext/re/Makefile.PL39
-rw-r--r--gnu/usr.bin/perl/ext/re/hints/aix.pl22
-rw-r--r--gnu/usr.bin/perl/ext/re/re.xs2
-rw-r--r--gnu/usr.bin/perl/globals.c9
-rw-r--r--gnu/usr.bin/perl/hints/cygwin.sh13
-rw-r--r--gnu/usr.bin/perl/hints/darwin.sh2
-rw-r--r--gnu/usr.bin/perl/hints/dos_djgpp.sh5
-rw-r--r--gnu/usr.bin/perl/hints/mint.sh1
-rw-r--r--gnu/usr.bin/perl/hints/nonstopux.sh17
-rw-r--r--gnu/usr.bin/perl/hints/posix-bc.sh84
-rw-r--r--gnu/usr.bin/perl/hints/uts.sh20
-rw-r--r--gnu/usr.bin/perl/hints/vmesa.sh3
-rw-r--r--gnu/usr.bin/perl/intrpvar.h68
-rw-r--r--gnu/usr.bin/perl/iperlsys.h28
-rw-r--r--gnu/usr.bin/perl/jpl/ChangeLog30
-rw-r--r--gnu/usr.bin/perl/jpl/JNI/JNI.pm63
-rw-r--r--gnu/usr.bin/perl/jpl/JNI/JNI.xs968
-rw-r--r--gnu/usr.bin/perl/jpl/JNI/Makefile.PL196
-rw-r--r--gnu/usr.bin/perl/jpl/PerlInterpreter/PerlInterpreter.h1
-rw-r--r--gnu/usr.bin/perl/jpl/README117
-rw-r--r--gnu/usr.bin/perl/jpl/README.JUST-JNI113
-rw-r--r--gnu/usr.bin/perl/jpl/docs/Tutorial.pod1047
-rw-r--r--gnu/usr.bin/perl/lib/CGI/Cookie.pm139
-rw-r--r--gnu/usr.bin/perl/lib/CGI/Pretty.pm23
-rw-r--r--gnu/usr.bin/perl/lib/CGI/Util.pm258
-rw-r--r--gnu/usr.bin/perl/lib/Carp/Heavy.pm14
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/MM_Cygwin.pm2
-rw-r--r--gnu/usr.bin/perl/lib/File/Spec.pm5
-rw-r--r--gnu/usr.bin/perl/lib/File/Spec/Epoc.pm378
-rw-r--r--gnu/usr.bin/perl/lib/File/Spec/Functions.pm4
-rw-r--r--gnu/usr.bin/perl/lib/File/Spec/Mac.pm61
-rw-r--r--gnu/usr.bin/perl/lib/File/Spec/OS2.pm5
-rw-r--r--gnu/usr.bin/perl/lib/File/Spec/Unix.pm46
-rw-r--r--gnu/usr.bin/perl/lib/File/Spec/VMS.pm69
-rw-r--r--gnu/usr.bin/perl/lib/File/Spec/Win32.pm86
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigFloat.pm84
-rw-r--r--gnu/usr.bin/perl/lib/Pod/Checker.pm113
-rw-r--r--gnu/usr.bin/perl/lib/Pod/Find.pm307
-rw-r--r--gnu/usr.bin/perl/lib/Pod/LaTeX.pm1591
-rw-r--r--gnu/usr.bin/perl/lib/Pod/ParseUtils.pm114
-rw-r--r--gnu/usr.bin/perl/lib/Pod/Parser.pm11
-rw-r--r--gnu/usr.bin/perl/lib/Pod/Select.pm24
-rw-r--r--gnu/usr.bin/perl/lib/Pod/Text/Overstrike.pm160
-rw-r--r--gnu/usr.bin/perl/lib/Pod/Usage.pm29
-rw-r--r--gnu/usr.bin/perl/lib/Test.pm21
-rw-r--r--gnu/usr.bin/perl/lib/Tie/Array.pm160
-rw-r--r--gnu/usr.bin/perl/lib/Tie/Handle.pm26
-rw-r--r--gnu/usr.bin/perl/lib/Win32.pod287
-rw-r--r--gnu/usr.bin/perl/lib/bytes.pm27
-rw-r--r--gnu/usr.bin/perl/lib/charnames.pm15
-rw-r--r--gnu/usr.bin/perl/lib/fields.pm3
-rw-r--r--gnu/usr.bin/perl/lib/integer.pm89
-rw-r--r--gnu/usr.bin/perl/lib/unicode/ArabLink.pl9
-rw-r--r--gnu/usr.bin/perl/lib/unicode/ArabLnkGrp.pl5
-rw-r--r--gnu/usr.bin/perl/lib/unicode/ArabShap.txt35
-rw-r--r--gnu/usr.bin/perl/lib/unicode/BidiMirr.txt238
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Bidirectional.pl4
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Block.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/CaseFold.txt821
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Category.pl4
-rw-r--r--gnu/usr.bin/perl/lib/unicode/CombiningClass.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/CompExcl.txt6
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Decomposition.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/AlphabeticPresentationForms.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Arabic.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/ArabicPresentationForms-A.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/ArabicPresentationForms-B.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Armenian.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Arrows.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/BasicLatin.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Bengali.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/BlockElements.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Bopomofo.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/BopomofoExtended.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/BoxDrawing.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/BraillePatterns.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/CJKCompatibility.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/CJKCompatibilityForms.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/CJKCompatibilityIdeographs.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/CJKRadicalsSupplement.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/CJKSymbolsandPunctuation.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/CJKUnifiedIdeographs.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/CJKUnifiedIdeographsExtensionA.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Cherokee.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/CombiningDiacriticalMarks.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/CombiningHalfMarks.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/CombiningMarksforSymbols.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/ControlPictures.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/CurrencySymbols.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Cyrillic.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Devanagari.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Dingbats.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/EnclosedAlphanumerics.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/EnclosedCJKLettersandMonths.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Ethiopic.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/GeneralPunctuation.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/GeometricShapes.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Georgian.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Greek.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/GreekExtended.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Gujarati.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Gurmukhi.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/HalfwidthandFullwidthForms.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/HangulCompatibilityJamo.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/HangulJamo.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/HangulSyllables.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Hebrew.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/HighPrivateUseSurrogates.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/HighSurrogates.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Hiragana.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/IPAExtensions.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/IdeographicDescriptionCharacters.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Kanbun.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/KangxiRadicals.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Kannada.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Katakana.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Khmer.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Lao.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Latin-1Supplement.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/LatinExtended-A.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/LatinExtended-B.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/LatinExtendedAdditional.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/LetterlikeSymbols.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/LowSurrogates.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Malayalam.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/MathematicalOperators.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/MiscellaneousSymbols.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/MiscellaneousTechnical.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Mongolian.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Myanmar.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/NumberForms.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Ogham.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/OpticalCharacterRecognition.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Oriya.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/PrivateUse.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Runic.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Sinhala.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/SmallFormVariants.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/SpacingModifierLetters.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Specials.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/SuperscriptsandSubscripts.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Syriac.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Tamil.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Telugu.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Thaana.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Thai.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/Tibetan.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/UnifiedCanadianAboriginalSyllabics.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/YiRadicals.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/In/YiSyllables.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/ASCII.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Alnum.pl184
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Alpha.pl159
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/BidiAL.pl25
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/BidiAN.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/BidiB.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/BidiBN.pl15
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/BidiCS.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/BidiEN.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/BidiES.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/BidiET.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/BidiL.pl4
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/BidiLRE.pl6
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/BidiLRO.pl6
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/BidiNSM.pl97
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/BidiON.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/BidiPDF.pl6
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/BidiR.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/BidiRLE.pl6
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/BidiRLO.pl6
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/BidiS.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/BidiWS.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Blank.pl12
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/C.pl4
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Cc.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Cf.pl12
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Cn.pl370
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Cntrl.pl4
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Co.pl4
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Cs.pl8
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/DCcircle.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/DCcompat.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/DCfinal.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/DCfont.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/DCfraction.pl7
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/DCinitial.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/DCisolated.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/DCmedial.pl59
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/DCnarrow.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/DCnoBreak.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/DCsmall.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/DCsquare.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/DCsub.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/DCsuper.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/DCvertical.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/DCwide.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/DecoCanon.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/DecoCompat.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Digit.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Graph.pl16
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/L.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/LbrkAI.pl139
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/LbrkAL.pl387
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/LbrkB2.pl6
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/LbrkBA.pl19
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/LbrkBB.pl8
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/LbrkBK.pl7
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/LbrkCB.pl6
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/LbrkCL.pl47
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/LbrkCM.pl117
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/LbrkCR.pl6
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/LbrkEX.pl10
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/LbrkGL.pl11
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/LbrkHY.pl6
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/LbrkID.pl81
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/LbrkIN.pl6
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/LbrkIS.pl9
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/LbrkLF.pl6
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/LbrkNS.pl41
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/LbrkNU.pl24
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/LbrkOP.pl43
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/LbrkPO.pl16
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/LbrkPR.pl21
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/LbrkQU.pl13
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/LbrkSA.pl30
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/LbrkSG.pl8
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/LbrkSP.pl6
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/LbrkSY.pl6
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/LbrkXX.pl5
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/LbrkZW.pl6
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Ll.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Lm.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Lo.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Lower.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Lt.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Lu.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/M.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Mc.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Me.pl9
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Mirrored.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Mn.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/N.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Nd.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Nl.pl9
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/No.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/P.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Pc.pl12
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Pd.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Pe.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Pf.pl9
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Pi.pl10
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Po.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Print.pl7
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Ps.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Punct.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/S.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Sc.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Sk.pl27
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Sm.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/So.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Space.pl5
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/SpacePerl.pl14
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/SylA.pl155
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/SylAA.pl25
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/SylAAI.pl19
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/SylAI.pl7
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/SylC.pl67
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/SylE.pl144
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/SylEE.pl34
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/SylI.pl151
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/SylII.pl25
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/SylN.pl6
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/SylO.pl154
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/SylOO.pl25
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/SylU.pl119
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/SylV.pl51
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/SylWA.pl46
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/SylWAA.pl19
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/SylWC.pl10
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/SylWE.pl20
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/SylWEE.pl6
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/SylWI.pl19
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/SylWII.pl15
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/SylWO.pl16
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/SylWOO.pl15
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/SylWU.pl6
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/SylWV.pl8
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Upper.pl19
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Word.pl184
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/XDigit.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Z.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Zl.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Zp.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Is/Zs.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Jamo.txt158
-rw-r--r--gnu/usr.bin/perl/lib/unicode/JamoShort.pl136
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Makefile3
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Name.pl4
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Number.pl48
-rw-r--r--gnu/usr.bin/perl/lib/unicode/PropList.txt3592
-rw-r--r--gnu/usr.bin/perl/lib/unicode/README.perl37
-rw-r--r--gnu/usr.bin/perl/lib/unicode/ReadMe.txt40
-rw-r--r--gnu/usr.bin/perl/lib/unicode/SpecCase.txt37
-rw-r--r--gnu/usr.bin/perl/lib/unicode/To/Digit.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/To/Lower.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/To/Title.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/To/Upper.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicode/UCD301.html201
-rw-r--r--gnu/usr.bin/perl/lib/unicode/UCDFF301.html1025
-rw-r--r--gnu/usr.bin/perl/lib/unicode/Unicode.30110621
-rw-r--r--gnu/usr.bin/perl/lib/unicode/mktables.PL174
-rw-r--r--gnu/usr.bin/perl/lib/unicode/syllables.txt2658
-rw-r--r--gnu/usr.bin/perl/lib/utf8.pm11
-rw-r--r--gnu/usr.bin/perl/lib/warnings.pm187
-rw-r--r--gnu/usr.bin/perl/lib/warnings/register.pm8
-rw-r--r--gnu/usr.bin/perl/makedef.pl113
-rw-r--r--gnu/usr.bin/perl/mpeix/relink9
-rw-r--r--gnu/usr.bin/perl/myconfig.SH13
-rw-r--r--gnu/usr.bin/perl/objXSUB.h103
-rw-r--r--gnu/usr.bin/perl/opnames.h46
-rw-r--r--gnu/usr.bin/perl/os2/OS2/ExtAttr/typemap2
-rw-r--r--gnu/usr.bin/perl/os2/OS2/REXX/t/rx_cmprt.t12
-rw-r--r--gnu/usr.bin/perl/os2/os2.sym2
-rw-r--r--gnu/usr.bin/perl/os2/os2add.sym9
-rw-r--r--gnu/usr.bin/perl/perlapi.c219
-rw-r--r--gnu/usr.bin/perl/perlapi.h38
-rw-r--r--gnu/usr.bin/perl/perly_c.diff16
-rw-r--r--gnu/usr.bin/perl/pod/Makefile.SH167
-rw-r--r--gnu/usr.bin/perl/pod/buildtoc.PL492
-rw-r--r--gnu/usr.bin/perl/pod/perl5004delta.pod39
-rw-r--r--gnu/usr.bin/perl/pod/perl5005delta.pod28
-rw-r--r--gnu/usr.bin/perl/pod/perlapi.pod1438
-rw-r--r--gnu/usr.bin/perl/pod/perlboot.pod10
-rw-r--r--gnu/usr.bin/perl/pod/perlclib.pod197
-rw-r--r--gnu/usr.bin/perl/pod/perlcompile.pod11
-rw-r--r--gnu/usr.bin/perl/pod/perldbmfilter.pod2
-rw-r--r--gnu/usr.bin/perl/pod/perldebguts.pod48
-rw-r--r--gnu/usr.bin/perl/pod/perldebtut.pod721
-rw-r--r--gnu/usr.bin/perl/pod/perlebcdic.pod1235
-rw-r--r--gnu/usr.bin/perl/pod/perlfilter.pod1
-rw-r--r--gnu/usr.bin/perl/pod/perlfork.pod22
-rw-r--r--gnu/usr.bin/perl/pod/perlhack.pod1500
-rw-r--r--gnu/usr.bin/perl/pod/perlintern.pod98
-rw-r--r--gnu/usr.bin/perl/pod/perllexwarn.pod145
-rw-r--r--gnu/usr.bin/perl/pod/perlmodinstall.pod169
-rw-r--r--gnu/usr.bin/perl/pod/perlmodlib.PL1383
-rw-r--r--gnu/usr.bin/perl/pod/perlnewmod.pod282
-rw-r--r--gnu/usr.bin/perl/pod/perlnumber.pod8
-rw-r--r--gnu/usr.bin/perl/pod/perlopentut.pod26
-rw-r--r--gnu/usr.bin/perl/pod/perlport.pod223
-rw-r--r--gnu/usr.bin/perl/pod/perlreftut.pod2
-rw-r--r--gnu/usr.bin/perl/pod/perlrequick.pod503
-rw-r--r--gnu/usr.bin/perl/pod/perlretut.pod2504
-rw-r--r--gnu/usr.bin/perl/pod/perlthrtut.pod6
-rw-r--r--gnu/usr.bin/perl/pod/perltodo.pod18
-rw-r--r--gnu/usr.bin/perl/pod/perltootc.pod18
-rw-r--r--gnu/usr.bin/perl/pod/perlunicode.pod48
-rw-r--r--gnu/usr.bin/perl/pod/perlutil.pod185
-rw-r--r--gnu/usr.bin/perl/pod/pod2usage.PL2
-rw-r--r--gnu/usr.bin/perl/pod/podchecker.PL32
-rw-r--r--gnu/usr.bin/perl/pod/podselect.PL2
-rw-r--r--gnu/usr.bin/perl/pp.sym2
-rw-r--r--gnu/usr.bin/perl/pp_proto.h2
-rw-r--r--gnu/usr.bin/perl/regcomp.pl8
-rw-r--r--gnu/usr.bin/perl/regnodes.h8
-rw-r--r--gnu/usr.bin/perl/t/UTEST5
-rw-r--r--gnu/usr.bin/perl/t/base/rs.t2
-rw-r--r--gnu/usr.bin/perl/t/comp/bproto.t2
-rw-r--r--gnu/usr.bin/perl/t/comp/require.t31
-rw-r--r--gnu/usr.bin/perl/t/io/openpid.t16
-rw-r--r--gnu/usr.bin/perl/t/lib/ansicolor.t16
-rw-r--r--gnu/usr.bin/perl/t/lib/attrs.t2
-rw-r--r--gnu/usr.bin/perl/t/lib/b.t163
-rw-r--r--gnu/usr.bin/perl/t/lib/bigfltpm.t89
-rw-r--r--gnu/usr.bin/perl/t/lib/bigint.t2
-rw-r--r--gnu/usr.bin/perl/t/lib/cgi-esc.t56
-rw-r--r--gnu/usr.bin/perl/t/lib/cgi-form.t69
-rw-r--r--gnu/usr.bin/perl/t/lib/cgi-function.t77
-rw-r--r--gnu/usr.bin/perl/t/lib/cgi-html.t102
-rw-r--r--gnu/usr.bin/perl/t/lib/cgi-pretty.t41
-rw-r--r--gnu/usr.bin/perl/t/lib/cgi-request.t69
-rw-r--r--gnu/usr.bin/perl/t/lib/charnames.t44
-rw-r--r--gnu/usr.bin/perl/t/lib/class-struct.t66
-rw-r--r--gnu/usr.bin/perl/t/lib/dprof.t24
-rw-r--r--gnu/usr.bin/perl/t/lib/dprof/V.pm8
-rw-r--r--gnu/usr.bin/perl/t/lib/dumper-ovl.t7
-rw-r--r--gnu/usr.bin/perl/t/lib/dumper.t31
-rw-r--r--gnu/usr.bin/perl/t/lib/english.t4
-rw-r--r--gnu/usr.bin/perl/t/lib/env-array.t2
-rw-r--r--gnu/usr.bin/perl/t/lib/errno.t6
-rw-r--r--gnu/usr.bin/perl/t/lib/fatal.t2
-rw-r--r--gnu/usr.bin/perl/t/lib/fields.t2
-rw-r--r--gnu/usr.bin/perl/t/lib/filefunc.t2
-rw-r--r--gnu/usr.bin/perl/t/lib/filespec.t2
-rw-r--r--gnu/usr.bin/perl/t/lib/ftmp-mktemp.t114
-rw-r--r--gnu/usr.bin/perl/t/lib/ftmp-posix.t81
-rw-r--r--gnu/usr.bin/perl/t/lib/ftmp-security.t140
-rw-r--r--gnu/usr.bin/perl/t/lib/ftmp-tempfile.t145
-rw-r--r--gnu/usr.bin/perl/t/lib/glob-basic.t36
-rw-r--r--gnu/usr.bin/perl/t/lib/glob-case.t17
-rw-r--r--gnu/usr.bin/perl/t/lib/glob-global.t88
-rw-r--r--gnu/usr.bin/perl/t/lib/glob-taint.t9
-rw-r--r--gnu/usr.bin/perl/t/lib/gol-basic.t10
-rw-r--r--gnu/usr.bin/perl/t/lib/gol-compat.t4
-rw-r--r--gnu/usr.bin/perl/t/lib/gol-linkage.t4
-rw-r--r--gnu/usr.bin/perl/t/lib/gol-oo.t26
-rw-r--r--gnu/usr.bin/perl/t/lib/h2ph.t2
-rw-r--r--gnu/usr.bin/perl/t/lib/io_const.t2
-rw-r--r--gnu/usr.bin/perl/t/lib/io_dir.t2
-rw-r--r--gnu/usr.bin/perl/t/lib/io_linenum.t2
-rw-r--r--gnu/usr.bin/perl/t/lib/io_multihomed.t2
-rw-r--r--gnu/usr.bin/perl/t/lib/io_poll.t9
-rw-r--r--gnu/usr.bin/perl/t/lib/io_unix.t2
-rw-r--r--gnu/usr.bin/perl/t/lib/ipc_sysv.t6
-rw-r--r--gnu/usr.bin/perl/t/lib/peek.t312
-rw-r--r--gnu/usr.bin/perl/t/lib/ph.t2
-rw-r--r--gnu/usr.bin/perl/t/lib/selfloader.t201
-rw-r--r--gnu/usr.bin/perl/t/lib/syslfs.t112
-rw-r--r--gnu/usr.bin/perl/t/lib/textfill.t2
-rw-r--r--gnu/usr.bin/perl/t/lib/thr5005.t19
-rw-r--r--gnu/usr.bin/perl/t/lib/tie-push.t3
-rw-r--r--gnu/usr.bin/perl/t/lib/tie-refhash.t305
-rw-r--r--gnu/usr.bin/perl/t/lib/tie-splice.t17
-rw-r--r--gnu/usr.bin/perl/t/lib/tie-stdarray.t3
-rw-r--r--gnu/usr.bin/perl/t/lib/tie-stdhandle.t12
-rw-r--r--gnu/usr.bin/perl/t/lib/tie-stdpush.t3
-rw-r--r--gnu/usr.bin/perl/t/lib/tie-substrhash.t111
-rw-r--r--gnu/usr.bin/perl/t/op/64bitint.t225
-rw-r--r--gnu/usr.bin/perl/t/op/anonsub.t93
-rw-r--r--gnu/usr.bin/perl/t/op/args.t23
-rw-r--r--gnu/usr.bin/perl/t/op/attrs.t2
-rw-r--r--gnu/usr.bin/perl/t/op/avhv.t2
-rw-r--r--gnu/usr.bin/perl/t/op/concat.t100
-rw-r--r--gnu/usr.bin/perl/t/op/defins.t2
-rw-r--r--gnu/usr.bin/perl/t/op/die_exit.t2
-rw-r--r--gnu/usr.bin/perl/t/op/exists_sub.t2
-rw-r--r--gnu/usr.bin/perl/t/op/filetest.t2
-rw-r--r--gnu/usr.bin/perl/t/op/grent.t37
-rw-r--r--gnu/usr.bin/perl/t/op/hashwarn.t2
-rw-r--r--gnu/usr.bin/perl/t/op/length.t85
-rw-r--r--gnu/usr.bin/perl/t/op/lex_assign.t17
-rw-r--r--gnu/usr.bin/perl/t/op/lfs.t102
-rw-r--r--gnu/usr.bin/perl/t/op/lop.t2
-rw-r--r--gnu/usr.bin/perl/t/op/my_stash.t31
-rw-r--r--gnu/usr.bin/perl/t/op/nothr5005.t2
-rw-r--r--gnu/usr.bin/perl/t/op/numconvert.t8
-rw-r--r--gnu/usr.bin/perl/t/op/pos.t9
-rw-r--r--gnu/usr.bin/perl/t/op/pwent.t45
-rw-r--r--gnu/usr.bin/perl/t/op/regmesg.t179
-rw-r--r--gnu/usr.bin/perl/t/op/reverse.t33
-rw-r--r--gnu/usr.bin/perl/t/op/subst_amp.t2
-rw-r--r--gnu/usr.bin/perl/t/op/tiearray.t2
-rw-r--r--gnu/usr.bin/perl/t/op/tiehandle.t20
-rw-r--r--gnu/usr.bin/perl/t/op/tr.t276
-rw-r--r--gnu/usr.bin/perl/t/op/utf8decode.t183
-rw-r--r--gnu/usr.bin/perl/t/op/ver.t121
-rw-r--r--gnu/usr.bin/perl/t/op/wantarray.t6
-rw-r--r--gnu/usr.bin/perl/t/pod/emptycmd.t4
-rw-r--r--gnu/usr.bin/perl/t/pod/find.t119
-rw-r--r--gnu/usr.bin/perl/t/pod/for.t4
-rw-r--r--gnu/usr.bin/perl/t/pod/headings.t4
-rw-r--r--gnu/usr.bin/perl/t/pod/include.t4
-rw-r--r--gnu/usr.bin/perl/t/pod/included.t4
-rw-r--r--gnu/usr.bin/perl/t/pod/lref.t4
-rw-r--r--gnu/usr.bin/perl/t/pod/multiline_items.t4
-rw-r--r--gnu/usr.bin/perl/t/pod/nested_items.t4
-rw-r--r--gnu/usr.bin/perl/t/pod/nested_seqs.t4
-rw-r--r--gnu/usr.bin/perl/t/pod/oneline_cmds.t4
-rw-r--r--gnu/usr.bin/perl/t/pod/pod2usage.t4
-rw-r--r--gnu/usr.bin/perl/t/pod/poderrs.t83
-rw-r--r--gnu/usr.bin/perl/t/pod/poderrs.xr79
-rw-r--r--gnu/usr.bin/perl/t/pod/podselect.t4
-rw-r--r--gnu/usr.bin/perl/t/pod/special_seqs.t7
-rw-r--r--gnu/usr.bin/perl/t/pod/special_seqs.xr3
-rw-r--r--gnu/usr.bin/perl/t/pod/testp2pt.pl10
-rw-r--r--gnu/usr.bin/perl/t/pragma/diagnostics.t4
-rw-r--r--gnu/usr.bin/perl/t/pragma/sub_lval.t159
-rw-r--r--gnu/usr.bin/perl/t/pragma/utf8.t351
-rw-r--r--gnu/usr.bin/perl/t/pragma/warn/2use212
-rw-r--r--gnu/usr.bin/perl/t/pragma/warn/3both69
-rw-r--r--gnu/usr.bin/perl/t/pragma/warn/4lint116
-rw-r--r--gnu/usr.bin/perl/t/pragma/warn/5nolint108
-rw-r--r--gnu/usr.bin/perl/t/pragma/warn/6default68
-rw-r--r--gnu/usr.bin/perl/t/pragma/warn/7fatal70
-rw-r--r--gnu/usr.bin/perl/t/pragma/warn/9enabled347
-rw-r--r--gnu/usr.bin/perl/t/pragma/warn/doio40
-rw-r--r--gnu/usr.bin/perl/t/pragma/warn/op17
-rw-r--r--gnu/usr.bin/perl/t/pragma/warn/perl15
-rw-r--r--gnu/usr.bin/perl/t/pragma/warn/pp_ctl15
-rw-r--r--gnu/usr.bin/perl/t/pragma/warn/pp_hot34
-rw-r--r--gnu/usr.bin/perl/t/pragma/warn/pp_sys137
-rw-r--r--gnu/usr.bin/perl/t/pragma/warn/regcomp92
-rw-r--r--gnu/usr.bin/perl/t/pragma/warn/sv2
-rw-r--r--gnu/usr.bin/perl/t/pragma/warn/toke62
-rw-r--r--gnu/usr.bin/perl/t/pragma/warn/utf810
-rw-r--r--gnu/usr.bin/perl/t/pragma/warnings.t6
-rw-r--r--gnu/usr.bin/perl/t/run/runenv.t147
-rw-r--r--gnu/usr.bin/perl/thrdvar.h17
-rw-r--r--gnu/usr.bin/perl/thread.h42
-rw-r--r--gnu/usr.bin/perl/utf8.c665
-rw-r--r--gnu/usr.bin/perl/utf8.h90
-rw-r--r--gnu/usr.bin/perl/utils/perlcc.PL1378
-rw-r--r--gnu/usr.bin/perl/vmesa/vmesa.c12
-rw-r--r--gnu/usr.bin/perl/vms/descrip_mms.template84
-rw-r--r--gnu/usr.bin/perl/vms/ext/Stdio/Makefile.PL2
-rw-r--r--gnu/usr.bin/perl/vms/munchconfig.c3
-rw-r--r--gnu/usr.bin/perl/vms/vmspipe.com20
-rw-r--r--gnu/usr.bin/perl/vos/Changes26
-rw-r--r--gnu/usr.bin/perl/vos/build.cm80
-rw-r--r--gnu/usr.bin/perl/vos/compile_perl.cm10
-rw-r--r--gnu/usr.bin/perl/vos/config.alpha.def492
-rw-r--r--gnu/usr.bin/perl/vos/config.alpha.h3219
-rw-r--r--gnu/usr.bin/perl/vos/config.ga.def492
-rw-r--r--gnu/usr.bin/perl/vos/config.ga.h3219
-rw-r--r--gnu/usr.bin/perl/vos/config.pl35
-rw-r--r--gnu/usr.bin/perl/vos/configure_perl.cm31
-rw-r--r--gnu/usr.bin/perl/vos/install_perl.cm69
-rw-r--r--gnu/usr.bin/perl/vos/perl.bind5
-rw-r--r--gnu/usr.bin/perl/vos/vosish.h141
-rw-r--r--gnu/usr.bin/perl/warnings.h74
-rw-r--r--gnu/usr.bin/perl/warnings.pl265
-rw-r--r--gnu/usr.bin/perl/win32/config.gc72
-rw-r--r--gnu/usr.bin/perl/win32/perlhost.h51
-rw-r--r--gnu/usr.bin/perl/win32/sncfnmcs.pl63
-rw-r--r--gnu/usr.bin/perl/win32/vdir.h106
-rw-r--r--gnu/usr.bin/perl/win32/win32thread.h5
-rw-r--r--gnu/usr.bin/perl/x2p/proto.h2
-rw-r--r--gnu/usr.bin/perl/xsutils.c2
629 files changed, 66148 insertions, 9273 deletions
diff --git a/gnu/usr.bin/perl/AUTHORS b/gnu/usr.bin/perl/AUTHORS
index f978b51bd89..331f3aff244 100644
--- a/gnu/usr.bin/perl/AUTHORS
+++ b/gnu/usr.bin/perl/AUTHORS
@@ -1,120 +1,557 @@
-# 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
+# To give due honor to those who have made Perl 5 what is is today,
+# here are easily-from-changelogs-extractable people and their
+# (hopefully) current and preferred email addresses (as of late 2000
+# if known) from the Changes files. These people have either submitted
+# patches or suggestions, or their bug reports or comments have inspired
+# the appropriate patches. Corrections, additions, deletions welcome.
+#
+--
+Aaron B. Dossett <aaron@iglou.com>
+Abigail <abigail@foad.org>
+Achim Bohnet <ach@mpe.mpg.de>
+Adam Krolnik <adamk@gypsy.cyrix.com>
+Akim Demaille <akim@epita.fr>
+Alan Burlison <Alan.Burlison@uk.sun.com>
+Alan Champion <achampio@lehman.com>
+Alan Harder <Alan.Harder@Ebay.Sun.COM>
+Alan Modra
+Albert Chin-A-Young <china@thewrittenword.com>
+Albert Dvornik <bert@genscan.com>
+Alexander Smishlajev <als@turnhere.com>
+Allen Smith <easmith@beatrice.rutgers.edu>
+Ambrose Kofi Laing
+Andreas Klussmann <andreas@infosys.heitec.de>
+Andreas König <a.koenig@mind.de>
+Andreas Schwab <schwab@suse.de>
+Andrew Bettison <andrewb@zip.com.au>
+Andrew Cohen <cohen@andy.bu.edu>
+Andrew M. Langmead <aml@world.std.com>
+Andrew Pimlott <pimlott@abel.math.harvard.edu>
+Andrew Vignaux <ajv@nz.sangacorp.com>
+Andrew Wilcox <awilcox@maine.com>
+Andy Dougherty <doughera@lafayette.edu>
+Anno Siegel <anno4000@lublin.zrz.tu-berlin.de>
+Anthony David <adavid@netinfo.com.au>
+Anton Berezin <tobez@tobez.org>
+Art Green <Art_Green@mercmarine.com>
+Artur <artur@vogon-solutions.com>
+Barrie Slaymaker <barries@slaysys.com>
+Barry Friedman
+Ben Tilly <ben_tilly@hotmail.com>
+Benjamin Low <b.d.low@unsw.edu.au>
+Benjamin Stuhl <sho_pi@hotmail.com>
+Benjamin Sugars <bsugars@canoe.ca>
+Bernard Quatermass <bernard@quatermass.co.uk>
+Bill Campbell <bill@celestial.com>
+Bill Glicker <billg@burrelles.com>
+Billy Constantine <wdconsta@cs.adelaide.edu.au>
+Blair Zajac <bzajac@geostaff.com>
+Boyd Gerber <gerberb@zenez.com>
+Brad Appleton <bradapp@enteract.com>
+Brad Howerter <bhower@wgc.woodward.com>
+Brad Hughes <brad@tgsmc.com>
+Brad Lanam <bll@gentoo.com>
+Brent B. Powers <powers@ml.com>
+Brian Callaghan <callagh@itginc.com>
+Brian Clarke <clarke@appliedmeta.com>
+Brian Grossman
+Brian Harrison <brie@corp.home.net>
+Brian Jepson <bjepson@home.com>
+Brian Katzung
+Brian Reichert <reichert@internet.com>
+Brian S. Cashman <bsc@umich.edu>
+Bruce Barnett <barnett@grymoire.crd.ge.com>
+Bruce J. Keeler <bkeelerx@iwa.dp.intel.com>
+Bruce P. Schuck <bruce@aps.org>
+Bud Huff <BAHUFF@us.oracle.com>
+Byron Brummer <byron@omix.com>
+Calle Dybedahl <calle@lysator.liu.se>
+Carl M. Fongheiser <cmf@ins.infonet.net>
+Carl Witty <cwitty@newtonlabs.com>
+Cary D. Renzema <caryr@mxim.com>
+Casey R. Tweten <crt@kiski.net>
+Castor Fu
+Chaim Frenkel <chaimf@pobox.com>
+Charles Bailey <bailey@newman.upenn.edu>
+Charles F. Randall <crandall@free.click-n-call.com>
+Charles Lane <lane@DUPHY4.Physics.Drexel.Edu>
+Charles Wilson <cwilson@ece.gatech.edu>
+Chip Salzenberg <chip@pobox.com>
+Chris Faylor <cgf@bbc.com>
+Chris Nandor <pudge@pobox.com>
+Chris Wick <cwick@lmc.com>
+Christian Kirsch <ck@held.mind.de>
+Christopher Chan-Nui <channui@austin.ibm.com>
+Christopher Davis <ckd@loiosh.kei.com>
+Chuck D. Phillips <cdp@hpescdp.fc.hp.com>
+Chuck Phillips <cdp@fc.hp.com>
+Chunhui Teng <cteng@nortel.ca>
+Clark Cooper <coopercc@netheaven.com>
+Clinton Pierce <cpierce1@ford.com>
+Colin Kuskie <ckuskie@cadence.com>
+Conrad Augustin
+Conrad E. Kimball <cek@tblv021.ca.boeing.com>
+Craig A. Berry <craig.berry@psinetcs.com>
+Craig Milo Rogers <Rogers@ISI.EDU>
+Dale Amon <amon@vnl.com>
+Damian Conway <damian@cs.monash.edu.au>
+Damon Atkins <Damon.Atkins@nabaus.com.au>
+Dan Boorstein <dan_boo@bellsouth.net>
+Dan Carson <dbc@tc.fluke.COM>
+Dan Schmidt <dfan@harmonixmusic.com>
+Dan Sugalski <dan@sidhe.org>
+Daniel Chetlin <daniel@chetlin.com>
+Daniel Grisinger <dgris@dimensional.com>
+Daniel Muiño <dmuino@afip.gov.ar>
+Daniel S. Lewart <lewart@vadds.cvm.uiuc.edu>
+Daniel Yacob <dmulholl@cs.indiana.edu>
+Danny R. Faught <faught@mailhost.rsn.hp.com>
+Danny Sadinoff <sadinoff@olf.com>
+Darrell Kindred <dkindred+@cmu.edu>
+Darrell Schiebel <drs@nrao.edu>
+Darren/Torin/Who Ever... <torin@daft.com>
+Dave Bianchi
+Dave Hartnoll <Dave_Hartnoll@3b2.com>
+Dave Nelson <David.Nelson@bellcow.com>
+Dave Schweisguth <dcs@neutron.chem.yale.edu>
+David Billinghurst <David.Billinghurst@riotinto.com.au>
+David Campbell
+David Couture
+David Denholm <denholm@conmat.phys.soton.ac.uk>
+David Dyck <dcd@tc.fluke.com>
+David F. Haertig <dfh@dwroll.lucent.com>
+David Filo
+David Glasser <me@davidglasser.net>
+David Hammen <hammen@gothamcity.jsc.nasa.gov>
+David J. Fiander <davidf@mks.com>
+David Kerry <davidk@tor.securecomputing.com>
+David Muir Sharnoff <muir@idiom.com>
+David R. Favor <dfavor@austin.ibm.com>
+David Sparks <daves@ActiveState.com>
+David Starks-Browning <dstarks@rc.tudelft.nl>
+David Sundstrom <sunds@asictest.sc.ti.com>
+Davin Milun <milun@cs.Buffalo.EDU>
+Dean Roehrich <roehrich@cray.com>
+Dennis Marsa <dennism@cyrix.com>
+dive <dive@ender.com>
+Dominic Dunlop <domo@computer.org>
+Dominique Dumont <Dominique_Dumont@grenoble.hp.com>
+Doug Campbell <soup@ampersand.com>
+Doug MacEachern <dougm@covalent.net>
+Douglas E. Wegscheid <wegscd@whirlpool.com>
+Douglas Lankshear <dougl@activestate.com>
+Dov Grobgeld <dov@Orbotech.Co.IL>
+Drago Goricanec <drago@raptor.otsd.ts.fujitsu.co.jp>
+Ed Mooring <mooring@Lynx.COM>
+Ed Peschko <epeschko@den-mdev1>
+Elaine -HFB- Ashton <elaine@chaos.wustl.edu>
+Eric Arnold <eric.arnold@sun.com>
+Eric Bartley <bartley@icd.cc.purdue.edu>
+Eric E. Coe <Eric.Coe@oracle.com>
+Eric Fifer <egf7@columbia.edu>
+Erich Rickheit
+Eryq <eryq@zeegee.com>
+Etienne Grossman <etienne@isr.isr.ist.utl.pt>
+Eugene Alterman <Eugene.Alterman@bremer-inc.com>
+Fabien Tassin <tassin@eerie.fr>
+Felix Gallo <fgallo@etoys.com>
+Florent Guillaume
+Frank Crawford
+Frank Ridderbusch <Frank.Ridderbusch@pdb.siemens.de>
+Frank Tobin <ftobin@uiuc.edu>
+François Désarménien <desar@club-internet.fr>
+Fréderic Chauveau <fmc@pasteur.fr>
+G. Del Merritt <del@intranetics.com>
+Gabe Schaffer
+Gary Clark <GaryC@mail.jeld-wen.com>
+Gary Ng <71564.1743@compuserve.com>
+Gerben Wierda <G.C.Th.Wierda@AWT.nl>
+Gerd Knops <gerti@BITart.com>
+Giles Lean <giles@nemeton.com.au>
+Gisle Aas <gisle@aas.no>
+Gordon J. Miller <gjm@cray.com>
+Grace Lee <grace@hal.com>
+Graham Barr <gbarr@pobox.com>
+Graham TerMarsch <grahamt@ActiveState.com>
+Greg Bacon <gbacon@itsc.uah.edu>
+Greg Chapman <glc@well.com>
+Greg Earle
+Greg Kuperberg
+Greg Seibert <seibert@Lynx.COM>
+Greg Ward <gward@ase.com>
+Gregory Martin Pfeil <pfeilgm@technomadic.org>
+Guenter Schmidt <gsc@bruker.de>
+Guido Flohr <gufl0000@stud.uni-sb.de>
+Gurusamy Sarathy <gsar@activestate.com>
+Gustaf Neumann
+Guy Decoux <decoux@moulon.inra.fr>
+H.J. Lu <hjl@nynexst.com>
+H.Merijn Brand <h.m.brand@hccnet.nl>
+Hal Pomeranz <pomeranz@netcom.com>
+Hallvard B Furuseth <h.b.furuseth@usit.uio.no>
+Hannu Napari <Hannu.Napari@hut.fi>
+Hans Mulder <hansmu@xs4all.nl>
+Hans de Graaff <J.J.deGraaff@twi.tudelft.nl>
+Harold O Morris <hom00@utsglobal.com>
+Harry Edmon <harry@atmos.washington.edu>
+Helmut Jarausch <jarausch@numa1.igpm.rwth-aachen.de>
+Henrik Tougaard <ht.000@foa.dk>
+Hershel Walters <walters@smd4d.wes.army.mil>
+Holger Bechtold
+Horst von Brand <vonbrand@sleipnir.valparaiso.cl>
+Hubert Feyrer <hubert.feyrer@informatik.fh-regensburg.de>
+Hugo van der Sanden <hv@crypt0.demon.co.uk>
+Hunter Kelly <retnuh@zule.pixar.com>
+Huw Rogers <count0@gremlin.straylight.co.jp>
+Ian Maloney <ian.malonet@ubs.com>
+Ian Phillipps <ian@dial.pipex.com>
+Ignasi Roca <ignasi.roca@fujitsu.siemens.es>
+Ilya Sandler <Ilya.Sandler@etak.com>
+Ilya Zakharevich <ilya@math.ohio-state.edu>
+Inaba Hiroto <inaba@st.rim.or.jp>
+Irving Reid <irving@tor.securecomputing.com>
+J. David Blackstone <jdb@dfwnet.sbms.sbc.com>
+J. van Krieken <John.van.Krieken@ATComputing.nl>
+JD Laub <jdl@access-health.com>
+JT McDuffie <jt@kpc.com>
+Jack Shirazi <JackS@GemStone.com>
+Jacqui Caren <Jacqui.Caren@ig.co.uk>
+Jake Hamby <jehamby@lightside.com>
+James FitzGibbon <james@ican.net>
+Jamshid Afshar
+Jan D. <jan.djarv@mbox200.swipnet.se>
+Jan Dubois <jand@activestate.com>
+Jan Pazdziora <adelton@fi.muni.cz>
+Jan-Erik Karlsson <trg@privat.utfors.se>
+Jan-Pieter Cornet <johnpc@xs4all.nl>
+Jared Rhine <jared@organic.com>
+Jarkko Hietaniemi <jhi@iki.fi>
+Jason A. Smith <smithj4@rpi.edu>
+Jason Shirk
+Jason Stewart <jasons@cs.unm.edu>
+Jason Varsoke <jjv@caesun10.msd.ray.com>
+Jay Rogers <jay@rgrs.com>
+Jeff Bouis
+Jeff McDougal <jmcdo@cris.com>
+Jeff Okamoto <okamoto@corp.hp.com>
+Jeff Pinyan <japhy@pobox.com>
+Jeff Urlwin <jurlwin@access.digex.net>
+Jeffrey Friedl <jfriedl@yahoo-inc.com>
+Jeffrey S. Haemer <jsh@woodcock.boulder.qms.com>
+Jens Hamisch <jens@Strawberry.COM>
+Jens T. Berger Thielemann <jensthi@ifi.uio.no>
+Jens Thomsen <jens@fiend.cis.com>
+Jens-Uwe Mager <jum@helios.de>
+Jeremy D. Zawodny <jzawodn@wcnet.org>
+Jerome Abela <abela@hsc.fr>
+Jim Anderson <jander@ml.com>
+Jim Avera <avera@hal.com>
+Jim Balter
+Jim Meyering <meyering@asic.sc.ti.com>
+Jim Miner <jfm@winternet.com>
+Jim Richardson
+Joachim Huober
+Jochen Wiedmann <joe@ispsoft.de>
+Joe Buehler <jbuehler@hekimian.com>
+Joe Smith <jsmith@inwap.com>
+Joel Rosi-Schwartz <j.schwartz@agonet.it>
+Joerg Porath <Joerg.Porath@informatik.tu-chemnitz.de>
+Joergen Haegg
+Johan Holtman
+Johan Vromans <jvromans@squirrel.nl>
+Johann Klasek <jk@auto.tuwien.ac.at>
+John Bley <jbb6@acpub.duke.edu>
+John Borwick <jhborwic@unity.ncsu.edu>
+John Cerney <j-cerney1@ti.com>
+John D Groenveld <groenvel@cse.psu.edu>
+John Hasstedt <John.Hasstedt@sunysb.edu>
+John Hughes <john@AtlanTech.COM>
+John L. Allen <allen@grumman.com>
+John Macdonald <jmm@revenge.elegant.com>
+John Nolan <jpnolan@Op.Net>
+John Peacock <jpeacock@rowman.com>
+John Pfuntner <pfuntner@vnet.ibm.com>
+John Rowe
+John Salinas <jsalinas@cray.com>
+John Stoffel <jfs@fluent.com>
+John Tobey <jtobey@john-edwin-tobey.org>
+Jon Orwant <orwant@oreilly.com>
+Jonathan Biggar <jon@sems.com>
+Jonathan D Johnston <jdjohnston2@juno.com>
+Jonathan Fine <jfine@borders.com>
+Jonathan I. Kamens <jik@kamens.brookline.ma.us>
+Jonathan Roy <roy@idle.com>
+Joseph N. Hall <joseph@cscaper.com>
+Joseph S. Myers <jsm28@hermes.cam.ac.uk>
+Joshua Pritikin <joshua.pritikin@db.com>
+Juan Gallego <Little.Boss@physics.mcgill.ca>
+Julian Yip <julian@imoney.com>
+Justin Banks <justinb@cray.com>
+Ka-Ping Yee <kpyee@aw.sgi.com>
+Karl Glazebrook <kgb@aaossz.aao.GOV.AU>
+Karl Heuer <kwzh@gnu.org>
+Karl Simon Berg <karl@it.kth.se>
+Karsten Sperling <spiff@phreax.net>
+Kaveh Ghazi <ghazi@caip.rutgers.edu>
+Keith Neufeld <neufeld@fast.pvi.org>
+Keith Thompson <kst@cts.com>
+Ken Estes <estes@ms.com>
+Ken Fox <kfox@ford.com>
+Ken MacLeod <ken@bitsko.slc.ut.us>
+Ken Shan <ken@digitas.harvard.edu>
+Kenneth Albanowski <kjahds@kjahds.com>
+Kenneth Duda <kjd@cisco.com>
+Keong Lim <Keong.Lim@sr.com.au>
+Kevin O'Gorman <kevin.kosman@nrc.com>
+Kevin White <klwhite@magnus.acs.ohio-state.edu>
+Kim Frutiger
+Kragen Sitaker <kragen@dnaco.net>
+Krishna Sethuraman <krishna@sgi.com>
+Kurt D. Starsinic <kstar@smithrenaud.com>
+Kyriakos Georgiou
+Larry Parmelee <parmelee@CS.Cornell.EDU>
+Larry Schuler
+Larry Schwimmer <rosebud@cyclone.Stanford.EDU>
+Larry W. Virden <lvirden@cas.org>
+Larry Wall <larry@wall.org>
+Lars Hecking <lhecking@nmrc.ucc.ie>
+Laszlo Molnar <laszlo.molnar@eth.ericsson.se>
+Len Johnson <lenjay@ibm.net>
+Les Peters <lpeters@aol.net>
+Lincoln D. Stein <lstein@cshl.org>
+Lionel Cons <lionel.cons@cern.ch>
+Luca Fini
+Lupe Christoph <lupe@lupe-christoph.de>
+Luther Huffman <lutherh@stratcom.com>
+M. J. T. Guy <mjtg@cam.ac.uk>
+Major Sébastien <sebastien.major@crdp.ac-caen.fr>
+Makoto MATSUSHITA <matusita@ics.es.osaka-u.ac.jp>
+Malcolm Beattie <mbeattie@sable.ox.ac.uk>
+Marc Lehmann <pcg@goof.com>
+Marc Paquette <Marc.Paquette@Softimage.COM>
+Marcel Grunauer <marcel@codewerk.com>
+Mark A Biggar <mab@wdl.loral.com>
+Mark Bixby <mark@bixby.org>
+Mark Dickinson <dickins3@fas.harvard.edu>
+Mark Hanson
+Mark K Trettin <mkt@lucent.com>
+Mark Kaehny <kaehny@execpc.com>
+Mark Kettenis <kettenis@wins.uva.nl>
+Mark Klein <mklein@dis.com>
+Mark Knutsen <knutsen@pilot.njin.net>
+Mark Kvale <kvale@phy.ucsf.edu>
+Mark Leighton Fisher <fisherm@tce.com>
+Mark Murray <mark@grondar.za>
+Mark P. Lutz <mark.p.lutz@boeing.com>
+Mark Pease <peasem@primenet.com>
+Mark Pizzolato <mark@infocomm.com>
+Mark R. Levinson <mrl@isc.upenn.edu>
+Mark-Jason Dominus <mjd@plover.com>
+Martijn Koster <mak@excitecorp.com>
+Martin J. Bligh <mbligh@sequent.com>
+Martin Jost <Martin.Jost@icn.siemens.de>
+Martin Lichtin <lichtin@bivio.com>
+Martin Plechsmid <plechsmi@karlin.mff.cuni.cz>
+Marty Lucich <marty@netcom.com>
+Martyn Pearce <martyn@inpharmatica.co.uk>
+Masahiro KAJIURA <masahiro.kajiura@toshiba.co.jp>
+Mathias Koerber <mathias@dnssec1.singnet.com.sg>
+Matt Kimball
+Matthew Black <black@csulb.edu>
+Matthew Green <mrg@splode.eterna.com.au>
+Matthew T Harden <mthard@mthard1.monsanto.com>
+Matthias Ulrich Neeracher <neeri@iis.ee.ethz.ch>
+Matthias Urlichs <smurf@noris.net>
+Maurizio Loreti <maurizio.loreti@pd.infn.it>
+Michael Cook <mcook@cognex.com>
+Michael De La Rue <mikedlr@tardis.ed.ac.uk>
+Michael Engel <engel@nms1.cc.huji.ac.il>
+Michael G Schwern <schwern@pobox.com>
+Michael H. Moran <mhm@austin.ibm.com>
+Michael Mahan <mahanm@nextwork.rose-hulman.edu>
+Michael Stevens <mstevens@globnix.org>
+Michele Sardo
+Mik Firestone <fireston@lexmark.com>
+Mike Fletcher <fletch@phydeaux.org>
+Mike Hopkirk <hops@sco.com>
+Mike Rogers
+Mike Stok <mike@stok.co.uk>
+Mike W Ellwood <mwe@rl.ac.uk>
+Milton Hankins <webtools@uewrhp03.msd.ray.com>
+Milton L. Hankins <mlh@swl.msd.ray.com>
+Molnar Laszlo <molnarl@cdata.tvnet.hu>
+Murray Nesbitt <mjn@pathcom.com>
+Nathan Kurz <nate@valleytel.net>
+Nathan Torkington <gnat@frii.com>
+Neale Ferguson <neale@VMA.TABNSW.COM.AU>
+Neil Bowers <neilb@cre.canon.co.uk>
+Nicholas Clark <nick@ccl4.org>
+Nick Duffek
+Nick Gianniotis
+Nick Ing-Simmons <nick@ing-simmons.net>
+Norbert Pueschel <pueschel@imsdd.meb.uni-bonn.de>
+Norton T. Allen <allen@huarp.harvard.edu>
+Olaf Flebbe <o.flebbe@science-computing.de>
+Olaf Titz <olaf@bigred.inka.de>
+Ollivier Robert <roberto@keltia.freenix.fr>
+Owen Taylor <owt1@cornell.edu>
+Patrick Hayes <Patrick.Hayes.CAP_SESA@renault.fr>
+Patrick O'Brien <pdo@cs.umd.edu>
+Paul A Sand <pas@unh.edu>
+Paul David Fardy <pdf@morgan.ucs.mun.ca>
+Paul Green <Paul_Green@stratus.com>
+Paul Hoffman <phoffman@proper.com>
+Paul Holser <Paul.Holser.pholser@nortelnetworks.com>
+Paul Johnson <paul@pjcj.net>
+Paul Marquess <Paul.Marquess@btinternet.com>
+Paul Moore <Paul.Moore@uk.origin-it.com>
+Paul Rogers <Paul.Rogers@Central.Sun.COM>
+Paul Saab <ps@yahoo-inc.com>
+Paul Schinder <schinder@pobox.com>
+Pete Peterson <petersonp@genrad.com>
+Peter Chines <pchines@nhgri.nih.gov>
+Peter Gordon <peter@valor.com>
+Peter Haworth <pmh@edison.ioppublishing.com>
+Peter J. Farley III <pjfarley@banet.net>
+Peter Jaspers-Fayer
+Peter Prymmer <pvhp@forte.com>
+Peter Scott <Peter@PSDT.com>
+Peter Wolfe <wolfe@teloseng.com>
+Peter van Heusden <pvh@junior.uwc.ac.za>
+Petter Reinholdtsen <pere@hungry.com>
+Phil Lobbes <phil@finchcomputer.com>
+Philip Hazel <ph10@cus.cam.ac.uk>
+Philip Newton <pne@cpan.org>
+Piers Cawley <pdcawley@bofh.org.uk>
+Piotr Klaban <makler@oryl.man.torun.pl>
+Prymmer/Kahn <pvhp@best.com>
+Quentin Fennessy <quentin@arrakeen.amd.com>
+Radu Greab <radu@netsoft.ro>
+Ralf S. Engelschall <rse@engelschall.com>
+Randal L. Schwartz <merlyn@stonehenge.com>
+Randy J. Ray <rjray@redhat.com>
+Raphael Manfredi <Raphael.Manfredi@pobox.com>
+Raymund Will <ray@caldera.de>
+Rex Dieter <rdieter@math.unl.edu>
+Rich Morin <rdm@cfcl.com>
+Rich Salz <rsalz@bbn.com>
+Richard A. Wells <Rwells@uhs.harvard.edu>
+Richard Foley <Richard.Foley@m.dasa.de>
+Richard L. England <richard_england@mentorg.com>
+Richard L. Maus, Jr. <rmaus@monmouth.com>
+Richard Soderberg <rs@crystalflame.net>
+Richard Yeh <rcyeh@cco.caltech.edu>
+Rick Delaney <rick@consumercontact.com>
+Rick Pluta
+Rickard Westman
+Rob Henderson <robh@cs.indiana.edu>
+Robert Partington <rjp@riffraff.plig.net>
+Robert Sanders <Robert.Sanders@linux.org>
+Robert Spier <rspier@pobox.com>
+Robin Barker <rmb1@cise.npl.co.uk>
+Robin Houston <robin@kitsite.com>
+Rocco Caputo <troc@netrus.net>
+Roderick Schertler <roderick@argon.org>
+Rodger Anderson <rodger@boi.hp.com>
+Ronald F. Guilmette <rfg@monkeys.com>
+Ronald J. Kimball <rjk@linguist.dartmouth.edu>
+Ruben Schattevoy <schattev@imb-jena.de>
+Rujith S. de Silva <desilva@netbox.com>
+Russ Allbery <rra@stanford.edu>
+Russell Fulton <russell@ccu1.auckland.ac.nz>
+Russell Mosemann
+Ryan Herbert <rherbert@sycamorehq.com>
+SAKAI Kiyotaka <ksakai@netwk.ntt-at.co.jp>
+Samuli Kärkkäinen <skarkkai@woods.iki.fi>
+Scott Gifford <sgifford@tir.com>
+Scott Henry <scotth@sgi.com>
+Sean Robinson <robinson_s@sc.maricopa.edu>
+Sean Sheedy <seans@ncube.com>
+Sebastien Barre <Sebastien.Barre@utc.fr>
+Shigeya Suzuki <shigeya@foretune.co.jp>
+Shimpei Yamashita <shimpei@socrates.patnet.caltech.edu>
+Shishir Gundavaram <shishir@ruby.ora.com>
+Simon Cozens <simon@cozens.net>
+Simon Leinen
+Simon Parsons <S.Parsons@ftel.co.uk>
+Slaven Rezic <eserte@cs.tu-berlin.de>
+Spider Boardman <spider@orb.nashua.nh.us>
+Stephane Payrard <stef@francenet.fr>
+Stephanie Beals <bealzy@us.ibm.com>
+Stephen McCamant <alias@mcs.com>
+Stephen O. Lidie <lusol@turkey.cc.Lehigh.EDU>
+Stephen P. Potter <spp@ds.net>
+Stephen Zander <gibreel@pobox.com>
+Steve A Fink <sfink@cs.berkeley.edu>
+Steve Kelem <steve.kelem@xilinx.com>
+Steve McDougall <swmcd@world.std.com>
+Steve Nielsen <spn@enteract.com>
+Steve Pearlmutter
+Steve Vinoski
+Steven Hirsch <hirschs@btv.ibm.com>
+Steven Knight <knight@theopera.baldmt.citilink.com>
+Steven Morlock <newspost@morlock.net>
+Steven N. Hirsch <hirschs@stargate.btv.ibm.com>
+Steven Parkes <parkes@sierravista.com>
+Sven Verdoolaege <skimo@breughel.ufsia.ac.be>
+SynaptiCAD, Inc. <sales@syncad.com>
+Taro KAWAGISHI
+Ted Ashton <ashted@southern.edu>
+Ted Law <tedlaw@cibcwg.com>
+Teun Burgers <burgers@ecn.nl>
+Thad Floryan <thad@thadlabs.com>
+Thomas Bowditch <bowditch@inmet.com>
+Thomas Conté <tom@fr.uu.net>
+Thomas Dorner <Thomas.Dorner@start.de>
+Thomas Kofler
+Thomas König
+Tim Adye <T.J.Adye@rl.ac.uk>
+Tim Ayers <tayers@bridge.com>
+Tim Bunce <Tim.Bunce@ig.co.uk>
+Tim Conrow <tim@spindrift.srl.caltech.edu>
+Tim Freeman <tfreeman@infoseek.com>
+Tim Jenness <t.jenness@jach.hawaii.edu>
+Tim Mooney <mooney@dogbert.cc.ndsu.NoDak.edu>
+Tim Witham <twitham@pcocd2.intel.com>
+Timur I. Bakeyev <bsdi@listserv.bat.ru>
+Tkil <tkil@reptile.scrye.com>
+Todd C. Miller <Todd.Miller@courtesan.com>
+Tom Bates <tom_bates@att.net>
+Tom Christiansen <tchrist@perl.com>
+Tom Horsley <Tom.Horsley@mail.ccur.com>
+Tom Hughes <tom@compton.nu>
+Tom Phoenix <rootbeer@teleport.com>
+Tom Spindler <dogcow@isi.net>
+Tony Camas
+Tony Cook <tony@develop-help.com>
+Tony Sanders <sanders@bsdi.com>
+Tor Lillqvist <tml@hemuli.tte.vtt.fi>
+Trevor Blackwell <tlb@viaweb.com>
+Tuomas J. Lukka <tjl@lukka.student.harvard.edu>
+Tye McQueen <tye@metronet.com>
+Ulrich Kunitz <kunitz@mai-koeln.com>
+Ulrich Pfeifer <pfeifer@wait.de>
+Vadim Konovalov <vkonovalov@lucent.com>
+Valeriy E. Ushakov <uwe@ptc.spbu.ru>
+Vishal Bhatia <vishal@deja.com>
+Vlad Harchev <hvv@hippo.ru>
+Vladimir Alexiev <vladimir@cs.ualberta.ca>
+W. Phillip Moore <wpm@ms.com>
+Warren Hyde <whyde@pezz.sps.mot.com>
+Warren Jones <wjones@tc.fluke.com>
+Wayne Berke <berke@panix.com>
+Wayne Scott <wscott@ichips.intel.com>
+Wayne Thompson <Wayne.Thompson@Ebay.sun.com>
+Wilfredo Sánchez <wsanchez@apple.com>
+William J. Middleton <William.Middleton@oslo.mobil.telenor.no>
+William Mann <wmann@avici.com>
+William R Ward <hermit@BayView.COM>
+William Setzer <William_Setzer@ncsu.edu>
+Winfried König <win@in.rhein-main.de>
+Wolfgang Laun <Wolfgang.Laun@alcatel.at>
+Yary Hluchan
+Yasushi Nakajima <sey@jkc.co.jp>
+Yitzchak Scott-Thoennes <sthoenna@efn.org>
+Yutaka OIWA <oiwa@is.s.u-tokyo.ac.jp>
+Yutao Feng
+Zachary Miller <zcmiller@simon.er.usgs.gov>
diff --git a/gnu/usr.bin/perl/Changes5.004 b/gnu/usr.bin/perl/Changes5.004
index d0601663ecf..2d578b43ab7 100644
--- a/gnu/usr.bin/perl/Changes5.004
+++ b/gnu/usr.bin/perl/Changes5.004
@@ -8031,7 +8031,7 @@ This release is beta candidate #5: Our last, best hope for a beta.
From: Chip Salzenberg
Files: pp_hot.c
- Title: "Fix grep() with refs in array context"
+ Title: "Fix grep() with refs in list context"
From: Chip Salzenberg
Files: pp.c
diff --git a/gnu/usr.bin/perl/Policy_sh.SH b/gnu/usr.bin/perl/Policy_sh.SH
index 0d9c1dfbc75..fec18b93857 100644
--- a/gnu/usr.bin/perl/Policy_sh.SH
+++ b/gnu/usr.bin/perl/Policy_sh.SH
@@ -7,18 +7,33 @@ $startsh
#
# This file was produced by running the Policy_sh.SH script, which
# gets its values from config.sh, which is generally produced by
-# running Configure. The Policy.sh file gets overwritten each time
-# Configure is run. Any variables you add to Policy.sh will be lost
-# unless you copy Policy.sh somewhere else before running Configure.
+# running Configure.
#
# The idea here is to distill in one place the common site-wide
# "policy" answers (such as installation directories) that are
# to be "sticky". If you keep the file Policy.sh around in
# the same directory as you are building Perl, then Configure will
# (by default) load up the Policy.sh file just before the
-# platform-specific hints file.
+# platform-specific hints file and rewrite it at the end.
+#
+# The sequence of events is as follows:
+# A: If you are NOT re-using an old config.sh:
+# 1. At start-up, Configure loads up the defaults from the
+# os-specific hints/osname_osvers.sh file and any previous
+# Policy.sh file.
+# 2. At the end, Configure runs Policy_sh.SH, which creates
+# Policy.sh, overwriting a previous Policy.sh if necessary.
+#
+# B: If you are re-using an old config.sh:
+# 1. At start-up, Configure loads up the defaults from config.sh,
+# ignoring any previous Policy.sh file.
+# 2. At the end, Configure runs Policy_sh.SH, which creates
+# Policy.sh, overwriting a previous Policy.sh if necessary.
+#
+# Thus the Policy.sh file gets overwritten each time
+# Configure is run. Any variables you add to Policy.sh will be lost
+# unless you copy Policy.sh somewhere else before running Configure.
#
-
# Allow Configure command-line overrides; usually these won't be
# needed, but something like -Dprefix=/test/location can be quite
# useful for testing out new versions.
@@ -37,16 +52,37 @@ esac
case "\$prefix" in
'') prefix='$prefix' ;;
esac
+
+# By default, the next three are the same as \$prefix.
+# If the user changes \$prefix, and previously \$siteprefix was the
+# same as \$prefix, then change \$siteprefix as well.
+# Use similar logic for \$vendorprefix and \$installprefix.
+
case "\$siteprefix" in
-'') siteprefix='$siteprefix' ;;
+'') if test "$siteprefix" = "$prefix"; then
+ siteprefix="\$prefix"
+ else
+ siteprefix='$siteprefix'
+ fi
+ ;;
esac
case "\$vendorprefix" in
-'') vendorprefix='$vendorprefix' ;;
+'') if test "$vendorprefix" = "$prefix"; then
+ vendorprefix="\$prefix"
+ else
+ vendorprefix='$vendorprefix'
+ fi
+ ;;
esac
# Where installperl puts things.
case "\$installprefix" in
-'') installprefix='$installprefix' ;;
+'') if test "$installprefix" = "$prefix"; then
+ installprefix="\$prefix"
+ else
+ installprefix='$installprefix'
+ fi
+ ;;
esac
# Installation directives. Note that each one comes in three flavors.
diff --git a/gnu/usr.bin/perl/Porting/Contract b/gnu/usr.bin/perl/Porting/Contract
index cc91af26bca..2b619fd0ff4 100644
--- a/gnu/usr.bin/perl/Porting/Contract
+++ b/gnu/usr.bin/perl/Porting/Contract
@@ -19,7 +19,7 @@ community, mutual respect, trust, and good-faith cooperation.
We recognize that the Perl core, defined as the software distributed with
the heart of Perl itself, is a joint project on the part of all of us.
->From time to time, a script, module, or set of modules (hereafter referred
+From time to time, a script, module, or set of modules (hereafter referred
to simply as a "module") will prove so widely useful and/or so integral to
the correct functioning of Perl itself that it should be distributed with
Perl core. This should never be done without the author's explicit
diff --git a/gnu/usr.bin/perl/Porting/config.sh b/gnu/usr.bin/perl/Porting/config.sh
index 3f29888e6c6..297a3e269a3 100644
--- a/gnu/usr.bin/perl/Porting/config.sh
+++ b/gnu/usr.bin/perl/Porting/config.sh
@@ -8,7 +8,7 @@
# Package name : perl5
# Source directory : .
-# Configuration time: Tue Mar 21 23:22:20 EET 2000
+# Configuration time: Sat Mar 3 01:13:55 EET 2001
# Configured by : jhi
# Target system : osf1 alpha.hut.fi v4.0 878 alpha
@@ -35,10 +35,10 @@ api_subversion='0'
api_version='5'
api_versionstring='5.005'
ar='ar'
-archlib='/opt/perl/lib/5.6.0/alpha-dec_osf-thread-multi'
-archlibexp='/opt/perl/lib/5.6.0/alpha-dec_osf-thread-multi'
+archlib='/opt/perl/lib/5.6.1/alpha-dec_osf-thread'
+archlibexp='/opt/perl/lib/5.6.1/alpha-dec_osf-thread'
archname64=''
-archname='alpha-dec_osf-thread-multi'
+archname='alpha-dec_osf-thread'
archobjs=''
awk='awk'
baserev='5.0'
@@ -46,7 +46,7 @@ bash=''
bin='/opt/perl/bin'
bincompat5005='undef'
binexp='/opt/perl/bin'
-bison=''
+bison='bison'
byacc='byacc'
byteorder='12345678'
c='\c'
@@ -54,12 +54,15 @@ castflags='0'
cat='cat'
cc='cc'
cccdlflags=' '
-ccdlflags=' -Wl,-rpath,/opt/perl/lib/5.6.0/alpha-dec_osf-thread-multi/CORE'
+ccdlflags=' -Wl,-rpath,/opt/perl/lib/5.6.1/alpha-dec_osf-thread/CORE'
ccflags='-pthread -std -DLANGUAGE_C'
+ccflags_uselargefiles=''
+ccname='cc'
ccsymbols='__alpha=1 __LANGUAGE_C__=1 __osf__=1 __unix__=1 _LONGLONG=1 _SYSTYPE_BSD=1 SYSTYPE_BSD=1 unix=1'
+ccversion='V5.6-082'
cf_by='jhi'
cf_email='yourname@yourhost.yourplace.com'
-cf_time='Tue Mar 21 23:22:20 EET 2000'
+cf_time='Sat Mar 3 01:13:55 EET 2001'
charsize='1'
chgrp=''
chmod=''
@@ -83,10 +86,10 @@ crosscompile='undef'
cryptlib=''
csh='csh'
d_Gconvert='gcvt((x),(n),(b))'
-d_PRIEldbl='define'
-d_PRIFldbl='define'
-d_PRIGldbl='define'
-d_PRIX64='define'
+d_PRIEUldbl='define'
+d_PRIFUldbl='define'
+d_PRIGUldbl='define'
+d_PRIXU64='define'
d_PRId64='define'
d_PRIeldbl='define'
d_PRIfldbl='define'
@@ -95,6 +98,8 @@ d_PRIi64='define'
d_PRIo64='define'
d_PRIu64='define'
d_PRIx64='define'
+d_SCNfldbl='define'
+d__fwalk='undef'
d_access='define'
d_accessx='undef'
d_alarm='define'
@@ -136,12 +141,12 @@ d_endnent='define'
d_endpent='define'
d_endpwent='define'
d_endsent='define'
-d_endspent='undef'
d_eofnblk='define'
d_eunice='undef'
d_fchmod='define'
d_fchown='define'
d_fcntl='define'
+d_fcntl_can_lock='define'
d_fd_macros='define'
d_fd_set='define'
d_fds_bits='define'
@@ -151,14 +156,17 @@ d_flock='define'
d_fork='define'
d_fpathconf='define'
d_fpos64_t='undef'
+d_frexpl='define'
d_fs_data_s='undef'
d_fseeko='undef'
d_fsetpos='define'
d_fstatfs='define'
d_fstatvfs='define'
+d_fsync='define'
d_ftello='undef'
d_ftime='undef'
d_getcwd='define'
+d_getespwnam='undef'
d_getfsstat='define'
d_getgrent='define'
d_getgrps='define'
@@ -174,6 +182,7 @@ d_getnbyaddr='define'
d_getnbyname='define'
d_getnent='define'
d_getnetprotos='define'
+d_getpagsz='define'
d_getpbyname='define'
d_getpbynumber='define'
d_getpent='define'
@@ -183,12 +192,12 @@ d_getpgrp='define'
d_getppid='define'
d_getprior='define'
d_getprotoprotos='define'
+d_getprpwnam='undef'
d_getpwent='define'
d_getsbyname='define'
d_getsbyport='define'
d_getsent='define'
d_getservprotos='define'
-d_getspent='undef'
d_getspnam='undef'
d_gettimeod='define'
d_gnulibc='undef'
@@ -200,6 +209,8 @@ d_index='undef'
d_inetaton='define'
d_int64_t='undef'
d_isascii='define'
+d_isnan='define'
+d_isnanl='define'
d_killpg='define'
d_lchown='define'
d_ldbl_dig='define'
@@ -226,6 +237,7 @@ d_mkstemp='define'
d_mkstemps='undef'
d_mktime='define'
d_mmap='define'
+d_modfl='define'
d_mprotect='define'
d_msg='define'
d_msg_ctrunc='define'
@@ -242,6 +254,7 @@ d_munmap='define'
d_mymalloc='undef'
d_nice='define'
d_nv_preserves_uv='undef'
+d_nv_preserves_uv_bits='53'
d_off64_t='undef'
d_old_pthread_create_joinable='undef'
d_oldpthreads='undef'
@@ -249,6 +262,7 @@ d_oldsock='undef'
d_open3='define'
d_pathconf='define'
d_pause='define'
+d_perl_otherlibdirs='undef'
d_phostname='undef'
d_pipe='define'
d_poll='define'
@@ -272,6 +286,7 @@ d_rmdir='define'
d_safebcpy='define'
d_safemcpy='undef'
d_sanemcmp='define'
+d_sbrkproto='define'
d_sched_yield='define'
d_scm_rights='define'
d_seekdir='define'
@@ -295,6 +310,7 @@ d_setpgid='define'
d_setpgrp2='undef'
d_setpgrp='define'
d_setprior='define'
+d_setproctitle='undef'
d_setpwent='define'
d_setregid='define'
d_setresgid='undef'
@@ -304,7 +320,6 @@ d_setrgid='define'
d_setruid='define'
d_setsent='define'
d_setsid='define'
-d_setspent='undef'
d_setvbuf='define'
d_sfio='undef'
d_shm='define'
@@ -318,6 +333,7 @@ d_sigsetjmp='define'
d_socket='define'
d_socklen_t='undef'
d_sockpair='define'
+d_socks5_init='undef'
d_sqrtl='define'
d_statblks='define'
d_statfs_f_flags='define'
@@ -325,6 +341,8 @@ d_statfs_s='define'
d_statvfs='define'
d_stdio_cnt_lval='define'
d_stdio_ptr_lval='define'
+d_stdio_ptr_lval_nochange_cnt='define'
+d_stdio_ptr_lval_sets_cnt='undef'
d_stdio_stream_array='define'
d_stdiobase='define'
d_stdstdio='define'
@@ -404,6 +422,7 @@ freetype='void'
full_ar='/usr/bin/ar'
full_csh='/usr/bin/csh'
full_sed='/usr/bin/sed'
+gccosandvers=''
gccversion=''
gidformat='"u"'
gidsign='1'
@@ -418,7 +437,6 @@ h_fcntl='false'
h_sysfile='true'
hint='recommended'
hostcat='cat /etc/hosts'
-huge=''
i16size='2'
i16type='short'
i32size='4'
@@ -441,6 +459,7 @@ i_grp='define'
i_iconv='define'
i_ieeefp='undef'
i_inttypes='undef'
+i_libutil='undef'
i_limits='define'
i_locale='define'
i_machcthr='undef'
@@ -454,6 +473,7 @@ i_neterrno='undef'
i_netinettcp='define'
i_niin='define'
i_poll='define'
+i_prot='define'
i_pthread='define'
i_pwd='define'
i_rpcsvcdbm='undef'
@@ -509,44 +529,46 @@ inc_version_list=' '
inc_version_list_init='0'
incpath=''
inews=''
-installarchlib='/opt/perl/lib/5.6.0/alpha-dec_osf-thread-multi'
+installarchlib='/opt/perl/lib/5.6.1/alpha-dec_osf-thread'
installbin='/opt/perl/bin'
installman1dir='/opt/perl/man/man1'
installman3dir='/opt/perl/man/man3'
installprefix='/opt/perl'
installprefixexp='/opt/perl'
-installprivlib='/opt/perl/lib/5.6.0'
+installprivlib='/opt/perl/lib/5.6.1'
installscript='/opt/perl/bin'
-installsitearch='/opt/perl/lib/site_perl/5.6.0/alpha-dec_osf-thread-multi'
+installsitearch='/opt/perl/lib/site_perl/5.6.1/alpha-dec_osf-thread'
installsitebin='/opt/perl/bin'
-installsitelib='/opt/perl/lib/site_perl/5.6.0'
+installsitelib='/opt/perl/lib/site_perl/5.6.1'
installstyle='lib'
installusrbinperl='define'
installvendorarch=''
installvendorbin=''
installvendorlib=''
intsize='4'
+issymlink='-h'
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='ld'
lddlflags='-shared -expect_unresolved "*" -msym -std -s'
ldflags=''
+ldflags_uselargefiles=''
ldlibpthname='LD_LIBRARY_PATH'
less='less'
lib_ext='.a'
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'
+libs='-lgdbm -ldbm -ldb -lm -liconv -lutil -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'
+libsfiles=' libgdbm.so libdbm.a libdb.so libm.so libiconv.so libutil.a 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/ccs/lib/libutil.a /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'
+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 util pthread exc'
+libswanted_uselargefiles=''
line=''
lint=''
lkflags=''
@@ -575,11 +597,9 @@ man1ext='1'
man3dir='/opt/perl/man/man3'
man3direxp='/opt/perl/man/man3'
man3ext='3'
-medium=''
mips_type=''
mkdir='mkdir'
mmaptype='void *'
-models='none'
modetype='mode_t'
more='more'
multiarch='undef'
@@ -598,6 +618,12 @@ nm_opt='-p'
nm_so_opt=''
nonxs_ext='Errno'
nroff='nroff'
+nvEUformat='"E"'
+nvFUformat='"F"'
+nvGUformat='"G"'
+nveformat='"e"'
+nvfformat='"f"'
+nvgformat='"g"'
nvsize='8'
nvtype='double'
o_nonblock='O_NONBLOCK'
@@ -607,6 +633,7 @@ optimize='-O'
orderlib='false'
osname='dec_osf'
osvers='4.0'
+otherlibdirs=' '
package='perl5'
pager='/c/bin/less'
passcat='cat /etc/passwd'
@@ -615,6 +642,7 @@ path_sep=':'
perl5='/u/vieraat/vieraat/jhi/Perl/bin/perl'
perl=''
perladmin='yourname@yourhost.yourplace.com'
+perllibs='-lm -liconv -lutil -lpthread -lexc'
perlpath='/opt/perl/bin/perl'
pg='pg'
phostname=''
@@ -625,8 +653,8 @@ pmake=''
pr=''
prefix='/opt/perl'
prefixexp='/opt/perl'
-privlib='/opt/perl/lib/5.6.0'
-privlibexp='/opt/perl/lib/5.6.0'
+privlib='/opt/perl/lib/5.6.1'
+privlibexp='/opt/perl/lib/5.6.1'
prototype='define'
ptrsize='8'
quadkind='2'
@@ -640,10 +668,10 @@ revision='5'
rm='rm'
rmail=''
runnm='true'
-sPRIEldbl='"E"'
-sPRIFldbl='"F"'
-sPRIGldbl='"G"'
-sPRIX64='"lX"'
+sPRIEUldbl='"E"'
+sPRIFUldbl='"F"'
+sPRIGUldbl='"G"'
+sPRIXU64='"lX"'
sPRId64='"ld"'
sPRIeldbl='"e"'
sPRIfldbl='"f"'
@@ -652,6 +680,7 @@ sPRIi64='"li"'
sPRIo64='"lo"'
sPRIu64='"lu"'
sPRIx64='"lx"'
+sSCNfldbl='"f"'
sched_yield='sched_yield()'
scriptdir='/opt/perl/bin'
scriptdirexp='/opt/perl/bin'
@@ -673,20 +702,19 @@ sig_name_init='"ZERO", "HUP", "INT", "QUIT", "ILL", "TRAP", "ABRT", "EMT", "FPE"
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.6.0/alpha-dec_osf-thread-multi'
-sitearchexp='/opt/perl/lib/site_perl/5.6.0/alpha-dec_osf-thread-multi'
+sitearch='/opt/perl/lib/site_perl/5.6.1/alpha-dec_osf-thread'
+sitearchexp='/opt/perl/lib/site_perl/5.6.1/alpha-dec_osf-thread'
sitebin='/opt/perl/bin'
sitebinexp='/opt/perl/bin'
-sitelib='/opt/perl/lib/site_perl/5.6.0'
+sitelib='/opt/perl/lib/site_perl/5.6.1'
sitelib_stem='/opt/perl/lib/site_perl'
-sitelibexp='/opt/perl/lib/site_perl/5.6.0'
+sitelibexp='/opt/perl/lib/site_perl/5.6.1'
siteprefix='/opt/perl'
siteprefixexp='/opt/perl'
sizesize='8'
sizetype='size_t'
sleep=''
smail=''
-small=''
so='so'
sockethdr=''
socketlib=''
@@ -694,8 +722,7 @@ socksizetype='int'
sort='sort'
spackage='Perl5'
spitshell='cat'
-split=''
-src='.'
+src='/m/fs/work/work/permanent/perl/pp4/maint-5.6/perl'
ssizetype='ssize_t'
startperl='#!/opt/perl/bin/perl'
startsh='#!/bin/sh'
@@ -709,7 +736,7 @@ stdio_ptr='((fp)->_ptr)'
stdio_stream_array='_iob'
strings='/usr/include/string.h'
submit=''
-subversion='0'
+subversion='1'
sysman='/usr/man/man1'
tail=''
tar=''
@@ -737,15 +764,15 @@ uidtype='uid_t'
uname='uname'
uniq='uniq'
uquadtype='unsigned long'
-use5005threads='undef'
+use5005threads='define'
use64bitall='define'
use64bitint='define'
usedl='define'
-useithreads='define'
+useithreads='undef'
uselargefiles='define'
uselongdouble='undef'
usemorebits='undef'
-usemultiplicity='define'
+usemultiplicity='undef'
usemymalloc='n'
usenm='true'
useopcode='true'
@@ -759,6 +786,7 @@ usevendorprefix='undef'
usevfork='false'
usrinc='/usr/include'
uuname=''
+uvXUformat='"lX"'
uvoformat='"lo"'
uvsize='8'
uvtype='unsigned long'
@@ -773,31 +801,36 @@ vendorlib_stem=''
vendorlibexp=''
vendorprefix=''
vendorprefixexp=''
-version='5.6.0'
+version='5.6.1'
+versiononly='undef'
vi=''
voidflags='15'
xlibpth='/usr/lib/386 /lib/386'
-xs_apiversion='5.6.0'
+xs_apiversion='5.6.1'
+yacc='/u/vieraat/vieraat/jhi/Perl/bin/byacc'
+yaccflags=''
zcat=''
zip='zip'
# Configure command line arguments.
-config_arg0='Configure'
-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_arg0='./Configure'
+config_args='-Dprefix=/opt/perl -Doptimize=-O -Dusethreads -Duse5005threads -Duse64bitint -Duselargefiles -Dcf_by=yourname -Dcf_email=yourname@yourhost.yourplace.com -Dperladmin=yourname@yourhost.yourplace.com -Dmydomain=.yourplace.com -Dmyhostname=yourhost -dE -Dusedevel'
+config_argc=13
config_arg1='-Dprefix=/opt/perl'
config_arg2='-Doptimize=-O'
config_arg3='-Dusethreads'
-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'
+config_arg4='-Duse5005threads'
+config_arg5='-Duse64bitint'
+config_arg6='-Duselargefiles'
+config_arg7='-Dcf_by=yourname'
+config_arg8='-Dcf_email=yourname@yourhost.yourplace.com'
+config_arg9='-Dperladmin=yourname@yourhost.yourplace.com'
+config_arg10='-Dmydomain=.yourplace.com'
+config_arg11='-Dmyhostname=yourhost'
+config_arg12='-dE'
+config_arg13='-Dusedevel'
PERL_REVISION=5
PERL_VERSION=6
-PERL_SUBVERSION=0
+PERL_SUBVERSION=1
PERL_API_REVISION=5
PERL_API_VERSION=5
PERL_API_SUBVERSION=0
diff --git a/gnu/usr.bin/perl/Porting/genlog b/gnu/usr.bin/perl/Porting/genlog
index efb7ef8e108..e040b9ef2cf 100644
--- a/gnu/usr.bin/perl/Porting/genlog
+++ b/gnu/usr.bin/perl/Porting/genlog
@@ -20,7 +20,7 @@ use Text::Wrap;
$0 =~ s|^.*/||;
unless (@ARGV) {
die <<USAGE;
- $0 [-p \$P4PORT] <change numbers or from..to>
+ $0 [-p \$P4PORT] [-bi branch_include] [-be branch_exclude] <change numbers or from..to>
USAGE
}
@@ -32,6 +32,11 @@ my %editkind;
my $p4port = $ENV{P4PORT} || 'localhost:1666';
+my @branch_include;
+my @branch_exclude;
+my %branch_include;
+my %branch_exclude;
+
while (@ARGV) {
$_ = shift;
if (/^(\d+)\.\.(\d+)$/) {
@@ -43,6 +48,12 @@ while (@ARGV) {
elsif (/^-p(.*)$/) {
$p4port = $1 || shift;
}
+ elsif (/^-bi(.*)$/) {
+ push @branch_include, $1 || shift;
+ }
+ elsif (/^-be(.*)$/) {
+ push @branch_exclude, $1 || shift;
+ }
else {
warn "Arguments must be change numbers, ignoring `$_'\n";
}
@@ -50,6 +61,9 @@ while (@ARGV) {
@changes = sort { $b <=> $a } @changes;
+@branch_include{@branch_include} = @branch_include if @branch_include;
+@branch_exclude{@branch_exclude} = @branch_exclude if @branch_exclude;
+
my @desc = `p4 -p $p4port describe -s @changes`;
if ($?) {
die "$0: `p4 -p $p4port describe -s @changes` failed, status[$?]\n";
@@ -58,6 +72,8 @@ else {
chomp @desc;
while (@desc) {
my ($change,$who,$date,$time,@log,$branch,$file,$type,%files);
+ my $skip = 0;
+ my $nbranch = 0;
$_ = shift @desc;
if (/^Change (\d+) by (\w+)\@.+ on (\S+) (\S+)\s*$/) {
($change, $who, $date, $time) = ($1,$2,$3,$4);
@@ -73,6 +89,12 @@ else {
last unless /^\.\.\./;
if (m{^\.\.\. //depot/(.*?perl|[^/]*)/([^#]+)#\d+ (\w+)\s*$}) {
($branch,$file,$type) = ($1,$2,$3);
+ $nbranch++;
+ if (exists $branch_exclude{$branch} or
+ @branch_include and
+ not exists $branch_include{$branch}) {
+ $skip++;
+ }
$files{$branch} = {} unless exists $files{$branch};
$files{$branch}{$type} = [] unless exists $files{$branch}{$type};
push @{$files{$branch}{$type}}, $file;
@@ -83,7 +105,7 @@ else {
}
}
}
- next unless $change;
+ next if not $change or $skip == $nbranch;
print "_" x 76, "\n";
printf <<EOT, $change, $who, $date, $time;
[%6s] By: %-25s on %9s %9s
diff --git a/gnu/usr.bin/perl/Porting/p4desc b/gnu/usr.bin/perl/Porting/p4desc
index 0bf79da2e00..2d1c9d8219f 100644
--- a/gnu/usr.bin/perl/Porting/p4desc
+++ b/gnu/usr.bin/perl/Porting/p4desc
@@ -6,7 +6,8 @@
# Gurusamy Sarathy <gsar@activestate.com>
#
-use vars qw($thisfile $change $file $fnum $h $v $p4port @addfiles);
+use vars qw($thisfile $change $file $fnum $h $v $p4port @addfiles
+ $branches $skip);
BEGIN {
$0 =~ s|^.*/||;
@@ -18,6 +19,9 @@ BEGIN {
elsif (/^-p(.*)$/) {
$p4port = $1 || ' ';
}
+ elsif (/^-b(.*)$/) {
+ $branches = $1;
+ }
elsif (/^-v$/) {
$v++;
}
@@ -30,20 +34,28 @@ BEGIN {
}
unless (@files) { @files = '-'; undef $^I; }
@ARGV = @files;
+ $branches = '//depot/perl/' unless defined $branches;
if ($h) {
print STDERR <<USAGE;
Usage: $0 [-p \$P4PORT] [-v] [-h] [files]
- -p host:port p4 port (e.g. myhost:1666)
+ -phost:port p4 port (e.g. myhost:1666)
-h print this help
-v output progress messages
+ -bbranch(es) which branches to include (regex)
+ (default: //depot/perl/)
+ -h show this help
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.
+WARNING 1: Currently only emits unified diffs (diff -u).
+
+WARNING 2: By default only the changes in the //depot/perl branch
+are shown. To include all the branches, supply "-b." arguments
+to $0.
Examples:
p4 describe -du 123 | $0 > change-123.desc
@@ -65,14 +77,28 @@ 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$/;
+ if (m|^\.\.\. |) {
+ if (m|$branches|) {
+ if (m{^\.\.\. (//depot/.+?\#\d+) (add|branch)$}) {
+ my $newfile = $1;
+ push @addfiles, $newfile;
+ warn "$newfile add, revision != 1!\n" unless $newfile =~ /#1$/;
+ }
+ } else {
+ push @skipped, "# $_";
+ $_ = '';
+ }
}
warn "file [$file] line [$cur] file# [$fnum]\n" if $v;
}
+if (m|^==== //depot/|) {
+ $skip = !m|$branches|;
+ print "# Skipped because not under branches: $branches\n" if $skip;
+}
+
+$_ = "# $_" if $skip;
+
if (/^Change (\d+) by/) {
$_ = "\n\n" . $_ if $change; # start of a new change list
$change = $1;
@@ -84,6 +110,9 @@ if (/^Change (\d+) by/) {
if (eof) {
$_ .= newfiles();
+ $_ .= join('', "\n",
+ "# Skipped because not under branches: $branches\n",
+ @skipped, "\n") if @skipped;
}
sub newfiles {
diff --git a/gnu/usr.bin/perl/Porting/patching.pod b/gnu/usr.bin/perl/Porting/patching.pod
index 5659f23c60e..7fd376b1a4d 100644
--- a/gnu/usr.bin/perl/Porting/patching.pod
+++ b/gnu/usr.bin/perl/Porting/patching.pod
@@ -94,12 +94,7 @@ diffs. Some examples using GNU diff:
# show function name in every hunk (safer, more informative)
% diff -u -F '^[_a-zA-Z0-9]+ *(' old/file new/file
-
-=item Directories
-
-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.
+=item Derived Files
Many files in the distribution are derivative--avoid patching them.
Patch the originals instead. Most utilities (like perldoc) are in
@@ -120,6 +115,31 @@ 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.
+=item Directories
+
+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.
+
+For larger patches that are dealing with multiple files or
+directories, Johan Vromans has written a powerful utility: makepatch.
+See the JV directory on CPAN for the current version. If you have this
+program available, it is recommended to create a duplicate of the perl
+directory tree against which you are intending to provide a patch and
+let makepatch figure out all the changes you made to your copy of the
+sources. As perl comes with a MANIFEST file, you need not delete
+object files and other derivative files from the two directory trees,
+makepatch is smart about them.
+
+Say, you have created a directory perl-5.7.1@8685/ for the perl you
+are taking as the base and a directory perl-5.7.1@8685-withfoo/ where
+you have your changes, you would run makepatch as follows:
+
+ makepatch -oldman perl-5.7.1@8685/MANIFEST \
+ -newman perl-5.7.1@8685-withfoo/MANIFEST \
+ -diff "diff -u" \
+ perl-5.7.1@8685 perl-5.7.1@8685-withfoo
+
=item Try it yourself
Just to make sure your patch "works", be sure to apply it to the Perl
diff --git a/gnu/usr.bin/perl/Porting/repository.pod b/gnu/usr.bin/perl/Porting/repository.pod
new file mode 100644
index 00000000000..5f1338dd640
--- /dev/null
+++ b/gnu/usr.bin/perl/Porting/repository.pod
@@ -0,0 +1,327 @@
+=head1 NAME
+
+repository - Using the Perl repository
+
+This document describes what a Perl Porter needs to do
+to start using the Perl repository.
+
+=head1 Prerequisites
+
+You'll need to get hold of the following software.
+
+=over 4
+
+=item Perforce
+
+Download a perforce client from:
+
+ http://www.perforce.com/perforce/loadprog.html
+
+You'll probably also want to look at:
+
+ http://www.perforce.com/perforce/technical.html
+
+where you can look at or download its documentation.
+
+=item ssh
+
+If you don't already have access to an ssh client, then look at its
+home site C<http://www.cs.hut.fi/ssh> which mentions ftp sites from
+which it's available. You only need to build the client parts (ssh
+and ssh-keygen should suffice).
+
+=back
+
+=head1 Creating an SSH Key Pair
+
+If you already use ssh and want to use the same key pair for perl
+repository access then you can skip the rest of this section.
+Otherwise, generate an ssh key pair for use with the repository
+by typing the command
+
+ ssh-keygen
+
+After generating a key pair and testing it, ssh-keygen will ask you
+to enter a filename in which to save the key. The default it offers
+will be the file F<~/.ssh/identity> which is suitable unless you
+particularly want to keep separate ssh identities for some reason.
+If so, you could save the perl repository private key in the file
+F<~/.ssh/perl>, for example, but I will use the standard filename
+in the remainder of the examples of this document.
+
+After typing in the filename, it will prompt you to type in a
+passphrase. The private key will itself be encrypted so that it is
+usable only when that passphrase is typed. (When using ssh, you will
+be prompted when it requires a pass phrase to unlock a private key.)
+If you provide a blank passphrase then no passphrase will be needed
+to unlock the key and, as a consequence, anyone who gains access to
+the key file gains access to accounts protected with that key
+(barring additional configuration to restrict access by IP address).
+
+When you have typed the passphrase in twice, ssh-keygen will confirm
+where it has saved the private key (in the filename you gave and
+with permissions set to be only readable by you), what your public
+key is (don't worry: you don't need to memorise it) and where it
+has saved the corresponding public key. The public key is saved in
+a filename corresponding to your private key's filename but with
+".pub" appended, usually F<~/.ssh/identity.pub>. That public key
+can be (but need not be) world readable. It is not used by your
+own system at all.
+
+=head1 Notifying the Repository Keeper
+
+Mail the contents of that public key file to the keeper of the perl
+repository (see L</Contact Information> below).
+When the key is added to the repository host's configuration file,
+you will be able to connect to it with ssh by using the corresponding
+private key file (after unlocking it with your chosen passphrase).
+
+=head1 Connecting to the Repository
+
+Connections to the repository are made by using ssh to provide a
+TCP "tunnel" rather than by using ssh to login to or invoke any
+ordinary commands on the repository. When you want to start a
+session using the repository, use the command
+
+ ssh -l perlrep -f -q -x -L 1666:127.0.0.1:1666 sickle.activestate.com
+foo
+
+If you are not using the default filename of F<~/.ssh/identity>
+to hold your perl repository private key then you'll need to add
+the option B<-i filename> to tell ssh where it is. Unless you chose
+a blank passphrase for that private key, ssh will prompt you for the
+passphrase to unlock that key. Then ssh will fork and put itself
+in the background, returning you (silently) to your shell prompt.
+The tunnel for repository access is now ready for use.
+
+For the sake of completeness (and for the case where the chosen
+port of 1666 is already in use on your machine), I'll briefly
+describe what all those ssh arguments are for.
+
+=over 4
+
+=item B<-l perl>
+
+Use a remote username of perl. The account on the repository which
+provides the end-point of the ssh tunnel is named "perl".
+
+=item B<-f>
+
+Tells ssh to fork and remain running in the background. Since ssh
+is only being used for its tunnelling capabilities, the command
+that ssh runs never does any I/O and can sit silently in the
+background.
+
+=item B<-q>
+
+Tells ssh to be quiet. Without this option, ssh will output a
+message each time you use a p4 command (since each p4 command
+tunnels over the ssh connection to reach the repository).
+
+=item B<-x>
+
+Tells ssh not to bother to set up a tunnel for X11 connections.
+The repository doesn't allow this anyway.
+
+=item B<-L 1666:127.0.0.1:1666>
+
+This is the important option. It tells ssh to listen out for
+connections made to port 1666 on your local machine. When such
+a connection is made, the ssh client tells the remote side
+(the corresponding ssh daemon on the repository) to make a
+connection to IP address 127.0.0.1, port 1666. Data flowing
+along that connection is tunnelled over the ssh connection
+(encrypted). The perforce daemon running on the repository
+only accepts connections from localhost and that is exactly
+where ssh-tunnelled connections appear to come from.
+
+If port 1666 is already in use on your machine then you can
+choose any non-privileged port (a number between 1024 and 65535)
+which happens to be free on your machine. It's the first of the
+three colon separated values that you should change. Picking
+port 2345 would mean changing the option to
+B<-L 2345:127.0.0.1:1666>. Whatever port number you choose should
+be used for the value of the P4PORT environment variable (q.v.).
+
+=item sickle.activestate.com
+
+This is the canonical IP name of the host on which the perl
+repository runs. Its IP number is 199.60.48.20.
+
+=item foo
+
+This is a dummy place holder argument. Without an argument
+here, ssh will try to perform an interactive login to the
+repository which is not allowed. Ordinarily, this argument
+is for the one-off command which is to be executed on the
+remote host. However, the repository's ssh configuration
+file uses the "command=" option to force a particular
+command to run so the actual value of the argument is
+ignored. The command that's actually run merely pauses and
+waits for the ssh connection to drop, then exits.
+
+=back
+
+=head1 Problems
+
+You should normally get a prompt that asks for the passphrase
+for your RSA key when you connect with the ssh command shown
+above. If you see a prompt that looks like:
+
+ perlrep@sickle.activestate.com's password:
+
+Then you either don't have a ~/.ssh/identity file corresponding
+to your public key, or your ~/.ssh/identity file is not readable.
+Fix the problem and try again.
+
+=head1 Using the Perforce Client
+
+Remember to read the documentation for Perforce. You need
+to make sure that three environment variable are set
+correctly before using the p4 client with the perl repository.
+
+=over 4
+
+=item P4PORT
+
+Set this to localhost:1666 (the port for your ssh client to listen on)
+unless that port is already in use on your host. If it is, see
+the section above on the B<-L 1666:127.0.0.1:1666> option to ssh.
+
+=item P4CLIENT
+
+The value of this is the name by which Perforce knows your
+host's workspace. You need to pick a name (for example, your
+hostname unless that clashes with someone else's client name)
+when you first start using the perl repository and then
+stick with it. If you connect from multiple hosts (with
+different workspaces) then maybe you could have multiple
+clients. There is a licence limit on the number of perforce
+clients which can be created. Although we have been told that
+Perforce will raise our licence limits within reason, it's
+probably best not to use additional clients unless needed.
+
+Note that perforce only needs the client name so that it can
+find the directory under which your client files are stored.
+If you have multiple hosts sharing the same directory structure
+via NFS then only one client name is necessary.
+
+The C<p4 clients> command lists all currently known clients.
+
+=item P4USER
+
+This is the username by which perforce knows you. Use your
+username if you have a well known or obvious one or else pick
+a new one which other perl5-porters will recognise. There is
+a licence limit on the number of these usernames. Perforce
+doesn't enforce security between usernames. If you set P4USER
+to be somebody else's username then perforce will believe you
+completely with regard to access control, logging and so on.
+
+The C<p4 users> command lists all currently known users.
+
+=back
+
+Once these three environment variables are set, you can use the
+perforce p4 client exactly as described in its documentation.
+After setting these variables and connecting to the repository
+for the first time, you should use the C<p4 user> and
+C<p4 client> commands to tell perforce the details of your
+new username and your new client workspace specifications.
+
+=head1 Ending a Repository Session
+
+When you have finished a session using the repository, you
+should kill off the ssh client process to break the tunnel.
+Since ssh forked itself into the background, you'll need to use
+something like ps with the appropriate options to find the ssh
+process and then kill it manually. The default signal of
+SIGTERM is fine.
+
+=head1 Overview of the Repository
+
+Please read at least the introductory sections of the Perforce
+User Guide (and perhaps the Quick Start Guide as well) before
+reading this section.
+
+Every repository user typically "owns" a "branch" of the mainline
+code in the repository. They hold the "pumpkin" for things in this
+area, and are usually the only user who will modify files there.
+This is not strictly enforced in order to allow the flexibility
+of other users stealing the pumpkin for short periods with the
+owner's permission.
+
+Here is the current structure of the repository:
+
+ /----+-----perl - Mainline development (bleadperl)
+ +-----cfgperl - Configure Pumpkin's Perl
+ +-----vmsperl - VMS Pumpkin's Perl
+ +-----maint-5.004------perl - Maintainance branches
+ +-----maint-5.005------perl
+ +-----maint-5.6------perl
+
+Perforce uses a branching model that simply tracks relationships
+between files. It does not care about directories at all, so
+any file can be a branch of any other file--the fully qualified
+depot path name (of the form //depot/foo/bar.c) uniquely determines
+a file for the purpose of establishing branching relationships.
+Since a branch usually involves hundreds of files, such relationships
+are typically specified en masse using a branch map (try `p4 help branch`).
+`p4 branches` lists the existing branches that have been set up.
+`p4 branch -o branchname` can be used to view the map for a particular
+branch, if you want to determine the ancestor for a particular set of
+files.
+
+The mainline (aka "trunk") code in the Perl repository is under
+"//depot/perl/...". Most branches typically map its entire
+contents under a directory that goes by the same name as the branch
+name. Thus the contents of the cfgperl branch are to be found
+in //depot/cfgperl.
+
+Run `p4 client` to specify how the repository contents should map to
+your local disk. Most users will typically have a client map that
+includes at least their entire branch and the contents of the mainline.
+
+Run `p4 changes -l -m10` to check on the activity in the repository.
+//depot/perl/Porting/genlog is useful to get an annotated changelog
+that shows files and branches. You can use this listing to determine
+if there are any changes in the mainline that you need to merge into
+your own branch. A typical merging session looks like this:
+
+ % cd ~/p4view/cfgperl
+ % p4 integrate -b cfgperl # to bring parent changes into cfgperl
+ % p4 resolve -a ./... # auto merge the changes
+ % p4 resolve ./... # manual merge conflicting changes
+ % p4 submit ./... # check in
+
+If the owner of the mainline wants to bring the changes in cfgperl
+back into the mainline, they do:
+
+ % p4 integrate -r -b cfgperl
+ ...
+
+Generating a patch for change#42 is done as follows:
+
+ % p4 describe -du 42 | p4desc | p4d2p > change-42.patch
+
+p4desc and p4d2p are to be found in //depot/perl/Porting/.
+
+=head1 Contact Information
+
+The mail alias <perl-repository-keepers@perl.org> can be used to reach
+all current users of the repository.
+
+The repository keeper is currently Gurusamy Sarathy
+<gsar@activestate.com>.
+
+=head1 AUTHORS
+
+Malcolm Beattie, mbeattie@sable.ox.ac.uk, 24 June 1997.
+
+Gurusamy Sarathy, gsar@activestate.com, 8 May 1999.
+
+Slightly updated by Simon Cozens, simon@brecon.co.uk, 3 July 2000
+
+=cut
+
+
diff --git a/gnu/usr.bin/perl/README.Y2K b/gnu/usr.bin/perl/README.Y2K
index 378db15c11a..be7ff51b68a 100644
--- a/gnu/usr.bin/perl/README.Y2K
+++ b/gnu/usr.bin/perl/README.Y2K
@@ -21,7 +21,7 @@ Long answer: The question belies a true understanding of the
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
+ when used in a list 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.
diff --git a/gnu/usr.bin/perl/README.aix b/gnu/usr.bin/perl/README.aix
new file mode 100644
index 00000000000..bf83535e43e
--- /dev/null
+++ b/gnu/usr.bin/perl/README.aix
@@ -0,0 +1,174 @@
+If you read this file _as_is_, just ignore the funny characters you see.
+It is written in the POD format (see pod/perlpod.pod) which is specially
+designed to be readable as is.
+
+=head1 NAME
+
+README.aix - Perl version 5 on IBM Unix (AIX) systems
+
+=head1 DESCRIPTION
+
+This document describes various features of IBM's Unix operating
+system (AIX) that will affect how Perl version 5 (hereafter just Perl)
+is compiled and/or runs.
+
+=head2 Compiling Perl 5 on AIX
+
+When compiling Perl, you must use an ANSI C compiler. AIX does not ship
+an ANSI compliant C-compiler with AIX by default, but binary builds of
+gcc for AIX are widely available.
+
+At the moment of writing, AIX supports two different native C compilers,
+for which you have to pay: B<xlc> and B<VAC>. If you decide to use eiter
+of these two (which is quite a lot easier than using gcc), be sure to
+upgrade to the latest available patch level. Currently:
+
+ xlC.C 3.1.4.0
+ vac.C 4.4.0.3 (5.0 is already available)
+
+Perl can be compiled with either IBM's ANSI C compiler or with gcc.
+The former is recommended, as not only can it compile Perl with no
+difficulty, but also can take advantage of features listed later that
+require the use of IBM compiler-specific command-line flags.
+
+If you decide to use gcc, make sure your installation is recent and
+complete, and be sure to read the Perl README file for more gcc-specific
+details.
+
+=head2 OS level
+
+Before installing the patches to the IBM C-compiler you need to know the
+level of patching for the Operating System. IBM's command 'oslevel' will
+show the base, but is not always complete:
+
+ # oslevel
+ 4.3.0.0
+ # lslpp -l | grep 'bos.rte '
+ bos.rte 4.3.2.1 COMMITTED Base Operating System Runtime
+ bos.rte 4.3.2.0 COMMITTED Base Operating System Runtime
+ #
+
+=head2 Building Dynamic Extensions on AIX
+
+AIX supports dynamically loadable libraries (shared libraries).
+Shared libraries end with the suffix .a, which is a bit misleading,
+because *all* libraries are shared ;-).
+
+=head2 The IBM ANSI C Compiler
+
+All defaults for Configure can be used.
+
+If you've chosen to use vac 4, be sure to run 4.4.0.3. Older versions
+will turn up nasty later on.
+
+Here's a brief lead of how to upgrade the compiler to the latest
+level. Of course this is subject to changes. You can only upgrade
+versions from ftp-available updates if the first three digit groups
+are the same (in where you can skip intermediate unlike the patches
+in the developer snapshots of perl), or to one version up where the
+`base' is available. In other words, the AIX compiler patches are
+cumulative.
+
+ vac.C.4.4.0.1 => vac.C.4.4.0.3 is OK (vac.C.4.4.0.2 not needed)
+ xlC.C.3.1.3.3 => xlC.C.3.1.4.10 is NOT OK (xlC.C.3.1.4.0 is not available)
+
+ # ftp ftp.software.ibm.com
+ Connected to service.boulder.ibm.com.
+ : welcome message ...
+ Name (ftp.software.ibm.com:merijn): anonymous
+ 331 Guest login ok, send your complete e-mail address as password.
+ Password:
+ ... accepted login stuff
+ ftp> cd /aix/fixes/v4/
+ ftp> dir other other.ll
+ output to local-file: other.ll? y
+ 200 PORT command successful.
+ 150 Opening ASCII mode data connection for /bin/ls.
+ 226 Transfer complete.
+ ftp> dir xlc xlc.ll
+ output to local-file: xlc.ll? y
+ 200 PORT command successful.
+ 150 Opening ASCII mode data connection for /bin/ls.
+ 226 Transfer complete.
+ ftp> bye
+ ... goodbye messages
+ # ls -l *.ll
+ -rw-rw-rw- 1 merijn system 1169432 Nov 2 17:29 other.ll
+ -rw-rw-rw- 1 merijn system 29170 Nov 2 17:29 xlc.ll
+
+On AIX 4.2 using xlC, we continue:
+
+ # lslpp -l | fgrep 'xlC.C '
+ xlC.C 3.1.4.9 COMMITTED C for AIX Compiler
+ xlC.C 3.1.4.0 COMMITTED C for AIX Compiler
+ # grep 'xlC.C.3.1.4.*.bff' xlc.ll
+ -rw-r--r-- 1 45776101 1 6286336 Jul 22 1996 xlC.C.3.1.4.1.bff
+ -rw-rw-r-- 1 45776101 1 6173696 Aug 24 1998 xlC.C.3.1.4.10.bff
+ -rw-r--r-- 1 45776101 1 6319104 Aug 14 1996 xlC.C.3.1.4.2.bff
+ -rw-r--r-- 1 45776101 1 6316032 Oct 21 1996 xlC.C.3.1.4.3.bff
+ -rw-r--r-- 1 45776101 1 6315008 Dec 20 1996 xlC.C.3.1.4.4.bff
+ -rw-rw-r-- 1 45776101 1 6178816 Mar 28 1997 xlC.C.3.1.4.5.bff
+ -rw-rw-r-- 1 45776101 1 6188032 May 22 1997 xlC.C.3.1.4.6.bff
+ -rw-rw-r-- 1 45776101 1 6191104 Sep 5 1997 xlC.C.3.1.4.7.bff
+ -rw-rw-r-- 1 45776101 1 6185984 Jan 13 1998 xlC.C.3.1.4.8.bff
+ -rw-rw-r-- 1 45776101 1 6169600 May 27 1998 xlC.C.3.1.4.9.bff
+ # wget ftp://ftp.software.ibm.com/aix/fixes/v4/xlc/xlC.C.3.1.4.10.bff
+ #
+
+On AIX 4.3 using vac, we continue:
+
+ # lslpp -l | fgrep 'vac.C '
+ vac.C 4.4.0.2 COMMITTED C for AIX Compiler
+ vac.C 4.4.0.0 COMMITTED C for AIX Compiler
+ # grep 'vac.C.4.4.0.*.bff' other.ll
+ -rw-rw-r-- 1 45776101 1 13466624 May 26 1999 vac.C.4.4.0.1.bff
+ -rw-rw-r-- 1 45776101 1 13473792 Aug 31 1999 vac.C.4.4.0.2.bff
+ -rw-rw-r-- 1 45776101 1 13480960 May 19 20:32 vac.C.4.4.0.3.bff
+ # wget ftp://ftp.software.ibm.com/aix/fixes/v4/other/vac.C.4.4.0.3.bff
+ #
+
+Then execute the following command, and fill in its choices
+
+ # smit install_update
+ -> Install and Update from LATEST Available Software
+ * INPUT device / directory for software [ vac.C.4.4.0.3.bff ]
+ [ OK ]
+ [ OK ]
+
+Follow the messages ... and you're done.
+
+=head2 Using GNU's gcc for building perl
+
+... ?
+
+=head2 Using Large Files with Perl
+
+... ?
+
+=head2 Threaded Perl
+
+... ?
+
+=head2 64-bit Perl
+
+... ?
+
+=head2 GDBM and Threads
+
+... ?
+
+=head2 NFS filesystems and utime(2)
+
+... ?
+
+=head1 AUTHOR
+
+H.Merijn Brand <h.m.brand@hccnet.nl>
+
+Structure copied from README.hpux
+
+=head1 DATE
+
+Version 0.0.1: 16-10-2000
+
+=cut
diff --git a/gnu/usr.bin/perl/README.bs2000 b/gnu/usr.bin/perl/README.bs2000
new file mode 100644
index 00000000000..566ba212de3
--- /dev/null
+++ b/gnu/usr.bin/perl/README.bs2000
@@ -0,0 +1,202 @@
+This document is written in pod format hence there are punctuation
+characters in in odd places. Do not worry, you've apparently got the
+ASCII->EBCDIC translation worked out correctly. You can read more
+about pod in pod/perlpod.pod or the short summary in the INSTALL file.
+
+=head1 NAME
+
+README.BS2000 - building and installing Perl for BS2000.
+
+=head1 SYNOPSIS
+
+This document will help you Configure, build, test and install Perl
+on BS2000 in the POSIX subsystem.
+
+=head1 DESCRIPTION
+
+This is a ported perl for the POSIX subsystem in BS2000 VERSION OSD
+V3.1A or later. It may work on other versions, but we started porting
+and testing it with 3.1A and are currently using Version V4.0A.
+
+You may need the following GNU programs in order to install perl:
+
+=head2 gzip
+
+We used version 1.2.4, which could be installed out of the box with
+one failure during 'make check'.
+
+=head2 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. See below for more details
+concerning yacc.
+
+=head2 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 created automatically anyway.
+
+After extracting the archive you copy the whole directory tree to your
+EBCDIC filesystem. B<This time you use I/O-conversion>:
+
+cd /usr/local/src
+IO_CONVERSION=YES
+cp -r /usr/local/ascii/perl5.005_02 ./
+
+=head2 Compiling
+
+There is a "hints" file for BS2000 called hints.posix-bc (because
+posix-bc is the OS name given by `uname`) that specifies the correct
+values for most things. The major problem is (of course) the EBCDIC
+character set. We have german EBCDIC version.
+
+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 GNU make. We tried the native make once and it
+worked too.
+
+=head2 Testing
+
+We still got a few errors during C<make test>. Some of them are the
+result of using bison. Bison prints I<parser error> instead of I<syntax
+error>, so we may ignore them. The following list shows
+our errors, your results may differ:
+
+op/numconvert.......FAILED tests 1409-1440
+op/regexp...........FAILED tests 483, 496
+op/regexp_noamp.....FAILED tests 483, 496
+pragma/overload.....FAILED tests 152-153, 170-171
+pragma/warnings.....FAILED tests 14, 82, 129, 155, 192, 205, 207
+lib/bigfloat........FAILED tests 351-352, 355
+lib/bigfltpm........FAILED tests 354-355, 358
+lib/complex.........FAILED tests 267, 487
+lib/dumper..........FAILED tests 43, 45
+Failed 11/231 test scripts, 95.24% okay. 57/10595 subtests failed, 99.46% okay.
+
+=head2 Install
+
+We have no nroff on BS2000 POSIX (yet), so we ignored any errors while
+installing the documentation.
+
+
+=head2 Using Perl in the Posix-Shell
+
+BS2000 POSIX doesn't support the shebang notation
+(C<#!/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;
+
+=head2 Using Perl in "native" BS2000
+
+We don't have much experience with this yet, but try the following:
+
+Copy your Perl executable to a BS2000 LLM using bs2cp:
+
+C<bs2cp /usr/local/bin/perl 'bs2:perl(perl,l)'>
+
+Now you can start it with the following (SDF) command:
+
+C</START-PROG FROM-FILE=*MODULE(PERL,PERL),PROG-MODE=*ANY,RUN-MODE=*ADV>
+
+First you get the BS2000 commandline prompt ('*'). Here you may enter
+your parameters, e.g. C<-e 'print "Hello World!\\n";'> (note the
+double backslash!) or C<-w> and the name of your Perl script.
+Filenames starting with C</> are searched in in the Posix filesystem,
+others are searched in the BS2000 filesystem. You may even use
+wildcards if you put a C<%> in front of your filename (e.g. C<-w
+checkfiles.pl %*.c>). Read your C/C++ manual for additional
+possibilities of the commandline prompt (look for
+PARAMETER-PROMPTING).
+
+=head2 Floating point anomalies
+
+There appears to be a bug in the floating point implementation on BS2000 POSIX
+systems such that calling int() on the product of a number and a small
+magnitude number is not the same as calling int() on the quotient of
+that number and a large magnitude number. For example, in the following
+Perl code:
+
+ my $x = 100000.0;
+ my $y = int($x * 1e-5) * 1e5; # '0'
+ my $z = int($x / 1e+5) * 1e5; # '100000'
+ print "\$y is $y and \$z is $z\n"; # $y is 0 and $z is 100000
+
+Although one would expect the quantities $y and $z to be the same and equal
+to 100000 they will differ and instead will be 0 and 100000 respectively.
+
+=head1 AUTHORS
+
+Thomas Dorner
+
+=head1 SEE ALSO
+
+L<INSTALL>, L<perlport>.
+
+=head2 Mailing list
+
+The Perl Institute (http://www.perl.org/) maintains a perl-mvs mailing
+list of interest to all folks building and/or using perl on EBCDIC
+platforms. To subscribe, send a message of:
+
+ subscribe perl-mvs
+
+to majordomo@perl.org.
+
+=head1 HISTORY
+
+This document was originally written by Thomas Dorner for the 5.005
+release of Perl.
+
+This document was podified for the 5.6 release of perl 11 July 2000.
+
+=cut
diff --git a/gnu/usr.bin/perl/README.cygwin b/gnu/usr.bin/perl/README.cygwin
index 514e01328e6..6264a15788b 100644
--- a/gnu/usr.bin/perl/README.cygwin
+++ b/gnu/usr.bin/perl/README.cygwin
@@ -13,7 +13,7 @@ on Cygwin. This document also describes features of Cygwin that will
affect how Perl behaves at runtime.
B<NOTE:> There are pre-built Perl packages available for Cygwin and a
-version of Perl is provided on the Cygwin CD. If you have no need to
+version of Perl is provided on the Cygwin CD. If you do not need to
customize the configuration, consider using one of these packages:
http://cygutils.netpedia.net/
@@ -27,31 +27,19 @@ platforms. They run thanks to the Cygwin library which provides the UNIX
system calls and environment these programs expect. More information
about this project can be found at:
- http://sourceware.cygnus.com/cygwin/
+ http://www.cygwin.com/
A recent net or commercial release of Cygwin is required.
-At the time this document was written, the port required recent
-development snapshots that were expected to stabilize early in 2000 and
-be released to the net as B21 and commercially as v1.1.
+At the time this document was last updated, Cygwin 1.1.5 was current.
B<NOTE:> At this point, minimal effort has been made to provide
compatibility with old (beta) Cygwin releases. The focus has been to
provide a high quality release and not worry about working around old
-Cygwin bugs. If you wish to use Perl with Cygwin B20.1 or earlier,
-consider using either perl5.005_03 or perl5.005_62, which are available
-in source and binary form at C<http://cygutils.netpedia.net/> or on the
-Cygwin CD. If there is significant demand, a patch kit can be developed
-to port back to earlier Cygwin versions.
-
-=head2 Compiler
-
-A recent net or commercial release of I<gcc> is required.
-
-At the time this document was written, I<gcc-2.95.2> was current and
-could be downloaded from:
-
- ftp://ftp.xraylith.wisc.edu/pub/khan/gnu-win32/cygwin/gcc-2.95.2/
+bugs. If you wish to use Perl with Cygwin B20.1 or earlier, consider
+using perl5.005_03, which is available in source and binary form at
+C<http://cygutils.netpedia.net/>. If there is significant demand,
+a patch kit can be developed to port back to earlier Cygwin versions.
=head2 Cygwin Configuration
@@ -60,15 +48,11 @@ that Perl builds cleanly. These changes are B<not> required for normal
Perl usage.
B<NOTE:> The binaries that are built will run on all Win32 versions.
-They do not depend on your host system (Win9x, WinNT) or your Cygwin
-configuration (I<ntea>, I<ntsec>, binary/text mounts). The only
-dependencies come from hardcoded pathnames like C</usr/local>. However,
-your host system and Cygwin configuration will affect Perl's runtime
-behavior (see L</"TEST">). Some regression tests may fail in different
-ways depending on your setup. For now, the test suite does not skip
-tests that do not make sense given a particular setup. If a test can
-pass in some Cygwin setup, it is left in and explainable test failures
-are documented.
+They do not depend on your host system (Win9x/WinME, WinNT/Win2K)
+or your Cygwin configuration (I<ntea>, I<ntsec>, binary/text mounts).
+The only dependencies come from hard-coded pathnames like C</usr/local>.
+However, your host system and Cygwin configuration will affect Perl's
+runtime behavior (see L</"TEST">).
=over 4
@@ -78,29 +62,16 @@ Set the C<PATH> environment variable so that Configure finds the Cygwin
versions of programs. Any Windows directories should be removed or
moved to the end of your C<PATH>.
-=item * F</bin/cat.exe>
-
-There should be an instance of I<cat> in F</bin> (or F</usr/bin>).
-Configure tests C<#!/bin/cat> and if it is not found, you will see
-the error:
-
- Configure: ./try: No such file or directory
-
-=item * F</usr/bin>
-
-If you do not have a F</usr/bin> directory, Configure will B<not> prompt
-you to install I<perl> into F</usr/bin>.
-
=item * I<nroff>
If you do not have I<nroff> (which is part of the I<groff> package),
-Configure will B<not> prompt you to install man pages.
+Configure will B<not> prompt you to install I<man> pages.
=item * Permissions
On WinNT with either the I<ntea> or I<ntsec> C<CYGWIN> settings, directory
and file permissions may not be set correctly. Since the build process
-creates files and directories, to be safe you may want to run a `C<chmod
+creates directories and files, to be safe you may want to run a `C<chmod
-R +w *>' on the entire Perl source tree.
Also, it is a well known WinNT "feature" that files created by a login
@@ -123,7 +94,7 @@ This will run Configure and keep a record:
./Configure 2>&1 | tee log.configure
-If you are willing to accept all the defaults add a B<-d> option.
+If you are willing to accept all the defaults run Configure with B<-de>.
However, several useful customizations are available.
=head2 Strip Binaries
@@ -153,22 +124,21 @@ C<http://cygutils.netpedia.net/>.
=item * C<-lcrypt>
-The crypt libraries in GNU libc have been ported to Cygwin.
+The crypt package distributed with Cygwin is a Linux compatible 56-bit
+DES crypt port by Corinna Vinschen.
+
+Alternatively, the crypt libraries in GNU libc have been ported to Cygwin.
The DES based Ultra Fast Crypt port was done by Alexey Truhan:
- http://dome.weeg.uiowa.edu/pub/domestic/sos/cw32crypt-dist-0.tgz
+ ftp://ftp.franken.de/pub/win32/develop/gnuwin32/cygwin/porters/Okhapkin_Sergey/cw32crypt-dist-0.tgz
NOTE: There are various export restrictions on DES implementations,
see the glibc README for more details.
The MD5 port was done by Andy Piper:
- http://dome.weeg.uiowa.edu/pub/domestic/sos/libcrypt.tgz
-
-More information can also be found at:
-
- http://miracle.geol.msu.ru/sos/
+ ftp://ftp.franken.de/pub/win32/develop/gnuwin32/cygwin/porters/Okhapkin_Sergey/libcrypt.tgz
=item * C<-lgdbm> (C<use GDBM_File>)
@@ -176,18 +146,25 @@ GDBM is available for Cygwin. GDBM's ndbm/dbm compatibility feature
also makes C<NDBM_File> and C<ODBM_File> possible (although they add
little extra value).
+NOTE: The ndbm/dbm emulations only completely work on NTFS partitions.
+
=item * C<-ldb> (C<use DB_File>)
BerkeleyDB is available for Cygwin. Some details can be found in
F<ext/DB_File/DB_File.pm>.
+NOTE: The BerkeleyDB library only completely works on NTFS partitions.
+
=item * C<-lcygipc> (C<use IPC::SysV>)
A port of SysV IPC is available for Cygwin.
NOTE: This has B<not> been extensively tested. In particular,
-C<d_semctl_semun> is undefined because it fails a configure test and on
-Win9x the shm*() functions seem to hang.
+C<d_semctl_semun> is undefined because it fails a Configure test
+and on Win9x the I<shm*()> functions seem to hang. It also creates
+a compile time dependency because F<perl.h> includes F<<sys/ipc.h>>
+and F<<sys/sem.h>> (which will be required in the future when compiling
+CPAN modules).
=back
@@ -228,7 +205,7 @@ These are B<not> yet available with Cygwin.
I<gcc> supports long doubles (12 bytes). However, several additional
long double math functions are necessary to use them within Perl
-(I<{atan2,cos,exp,floor,fmod,frexp,log,modf,pow,sin,sqrt}l,strtold>).
+(I<{atan2,cos,exp,floor,fmod,frexp,isnan,log,modf,pow,sin,sqrt}l,strtold>).
These are B<not> yet available with Cygwin.
=item * C<-Dusethreads>
@@ -248,32 +225,20 @@ You may see some messages during Configure that seem suspicious.
=over 4
-=item * Whoa There
-
-Cygwin does not yet implement chroot(), setegid() or seteuid()
-functionality, but has stub functions that return C<ENOSYS>. You will
-see a message when Configure detects that its guess conflicts with the
-hint file.
-
- *** WHOA THERE!!! ***
- The recommended value for $d_chroot on this machine was "undef"!
- Keep the recommended value? [y]
-
-You should keep the recommended value.
-
-=item * dlsym
+=item * I<dlsym()>
I<ld2> is needed to build dynamic libraries, but it does not exist
when dlsym() checking occurs (it is not created until `C<make>' runs).
You will see the following message:
Checking whether your dlsym() needs a leading underscore ...
+ ld2: not found
I can't compile and run the test program.
I'm guessing that dlsym doesn't need a leading underscore.
Since the guess is correct, this is not a problem.
-=item * Win9x and d_eofnblk
+=item * Win9x and C<d_eofnblk>
Win9x does not correctly report C<EOF> with a non-blocking read on a
closed pipe. You will see the following messages:
@@ -288,21 +253,13 @@ closed pipe. You will see the following messages:
At least for consistency with WinNT, you should keep the recommended
value.
-=item * Checking how std your stdio is...
-
-Configure reports:
-
- Your stdio doesn't appear very std.
-
-This is correct.
-
=item * Compiler/Preprocessor defines
The following error occurs because of the Cygwin C<#define> of
C<_LONG_DOUBLE>:
Guessing which symbols your C compiler and preprocessor define...
- try.c:3847: parse error
+ try.c:<line#>: parse error
This failure does not seem to cause any problems.
@@ -310,7 +267,7 @@ This failure does not seem to cause any problems.
=head1 MAKE
-Simply run make and wait:
+Simply run I<make> and wait:
make 2>&1 | tee log.make
@@ -321,8 +278,8 @@ Warnings like these are normal:
warning: overriding commands for target <file>
warning: ignoring old commands for target <file>
- Warning: no export definition file provided
- dllwrap will create one, but may not be what you want
+ dllwrap: no export definition file provided
+ dllwrap: creating one, but that may not be what you want
=head2 ld2
@@ -332,9 +289,9 @@ wait until the `C<make install>' process to install the I<ld2> script,
this is because the remainder of the `C<make>' refers to I<ld2> without
fully specifying its path and does this from multiple subdirectories.
The assumption is that $installbin is in your current C<PATH>. If this
-is not the case or if you do not have an I<install> program, `C<make>'
-will fail at some point. If this happens, just manually copy I<ld2>
-from the source directory to someplace in your C<PATH>.
+is not the case `C<make>' will fail at some point. If this happens,
+just manually copy I<ld2> from the source directory to somewhere in
+your C<PATH>.
=head1 TEST
@@ -348,21 +305,23 @@ The same tests are run both times, but more information is provided when
running as `C<./perl harness>'.
Test results vary depending on your host system and your Cygwin
-configuration. It is possible that Cygwin will pass all the tests,
-but it is more likely that some tests will fail for one of these reasons.
+configuration. If a test can pass in some Cygwin setup, it is always
+attempted and explainable test failures are documented. It is possible
+for Perl to pass all the tests, but it is more likely that some tests
+will fail for one of the reasons listed below.
=head2 File Permissions
UNIX file permissions are based on sets of mode bits for
-{read,write,execute} for each {user,group,other}. By default Cygwin only
-tracks the Win32 readonly attribute represented as the UNIX file user
-write bit (files are always readable, files are executable if they have
-a F<.{com,bat,exe}> extension or begin with C<#!>, directories are always
-readable and executable). On WinNT with the I<ntea> C<CYGWIN> setting,
-the remaining mode bits are stored as extended attributes. On WinNT
-with the I<ntsec> C<CYGWIN> setting, permissions use the standard WinNT
-security descriptors and access control lists. Without one of these
-options, these tests will fail:
+{read,write,execute} for each {user,group,other}. By default Cygwin
+only tracks the Win32 read-only attribute represented as the UNIX file
+user write bit (files are always readable, files are executable if they
+have a F<.{com,bat,exe}> extension or begin with C<#!>, directories are
+always readable and executable). On WinNT with the I<ntea> C<CYGWIN>
+setting, the additional mode bits are stored as extended file attributes.
+On WinNT with the I<ntsec> C<CYGWIN> setting, permissions use the standard
+WinNT security descriptors and access control lists. Without one of
+these options, these tests will fail:
Failed Test List of failed
------------------------------------
@@ -380,7 +339,10 @@ options, these tests will fail:
=head2 Hard Links
FAT partitions do not support hard links (whereas NTFS does), in which
-case Cygwin implements link() by copying the file. These tests will fail:
+case Cygwin implements link() by copying the file. On remote (network)
+drives Cygwin's stat() always sets C<st_nlink> to 1, so the link count
+for remote directories and files is not available. In either case,
+these tests will fail:
Failed Test List of failed
------------------------------------
@@ -408,7 +370,7 @@ the system with messages like:
A required .DLL file, CYGWIN1.DLL, was not found
WinNT
- perl.exe or sh.exe - Unable to Locate DLL
+ perl.exe - Unable to Locate DLL
The dynamic link library cygwin1.dll could not be found in the
specified path ...
@@ -420,8 +382,13 @@ will fail:
------------------------------------
op/taint.t 1, 3, 31, 37
-Alternatively, you can copy F<cygwin1.dll> into one of the Windows system
-directories (although, this is B<not> recommended).
+Alternatively, you can copy F<cygwin1.dll> into the directory where the
+tests run:
+
+ cp /bin/cygwin1.dll t
+
+or one of the Windows system directories (although, this is B<not>
+recommended).
=head2 /etc/group
@@ -433,19 +400,12 @@ see entries that use the members field, otherwise this test will fail:
------------------------------------
op/grent.t 1
-=head2 Unexplained Failures
-
-Any additional tests that fail are likely due to bugs in Cygwin or the
-optional libraries. It is expected that by the time of the next net
-release most of these will be solved so they are not described here.
-
=head2 Script Portability
-Cygwin does an outstanding job of providing UNIX-like semantics on
-top of Win32 systems. However, in addition to the items noted above,
-there are some differences that you should know about. This is only a
-very brief guide to portability, more information can be found in the
-Cygwin documentation.
+Cygwin does an outstanding job of providing UNIX-like semantics on top of
+Win32 systems. However, in addition to the items noted above, there are
+some differences that you should know about. This is a very brief guide
+to portability, more information can be found in the Cygwin documentation.
=over 4
@@ -454,20 +414,15 @@ Cygwin documentation.
Cygwin pathnames can be separated by forward (F</>) or backward (F<\>)
slashes. They may also begin with drive letters (F<C:>) or Universal
Naming Codes (F<//UNC>). DOS device names (F<aux>, F<con>, F<prn>,
-F<com*>, F<lpt?>) are invalid as base filenames. However, they can be
-used in extensions (e.g., F<hello.aux>). Names may not contain these
-characters:
+F<com*>, F<lpt?>, F<nul>) are invalid as base filenames. However, they
+can be used in extensions (e.g., F<hello.aux>). Names may contain all
+printable characters except these:
: * ? " < > |
-File names are case insensitive, but case preserving. With the I<mixed>
-C<CYGWIN> setting, file names are mixed-case (although, directory names
-remain case insensitive).
-
-The I<mixed> setting is only available with the "coolview" version of
-F<cygwin1.dll> provided by Sergey Okhapkin at:
-
- ftp://ftp.franken.de/pub/win32/develop/gnuwin32/cygwin/porters/Okhapkin_Sergey/
+File names are case insensitive, but case preserving. A pathname that
+contains a backslash or drive letter is a Win32 pathname (and not subject
+to the translations applied to POSIX style pathnames).
=item * Text/Binary
@@ -486,23 +441,18 @@ The text/binary issue is covered at length in the Cygwin documentation.
=item * F<.exe>
-The Cygwin stat() makes the F<.exe> extension transparent by looking for
-a F<foo.exe> when you ask for F<foo> (unless a F<foo> also exists).
-Cygwin does not require a F<.exe> extension, but I<gcc> adds it
-automatically when building a program. However, when accessing an
-executable as a normal file (e.g., I<install> or I<cp> in a makefile)
-the F<.exe> is not transparent.
-
-NOTE: There is a version of I<install> that understands the F<.exe>
-semantics, it can be found at:
-
- ftp://ftp.franken.de/pub/win32/develop/gnuwin32/cygwin/porters/Humblet_Pierre_A/
+The Cygwin stat(), lstat() and readlink() functions make the F<.exe>
+extension transparent by looking for F<foo.exe> when you ask for F<foo>
+(unless a F<foo> also exists). Cygwin does not require a F<.exe>
+extension, but I<gcc> adds it automatically when building a program.
+However, when accessing an executable as a normal file (e.g., I<cp>
+in a makefile) the F<.exe> is not transparent. The I<install> included
+with Cygwin automatically appends a F<.exe> when necessary.
=item * chown()
-On WinNT with the I<ntsec> C<CYGWIN> setting, chown() can change a file's
-user and group IDs. In all other configurations chown() is a no-op,
-although this is appropriate on Win9x since there is no security model.
+On WinNT chown() can change a file's user and group IDs. On Win9x chown()
+is a no-op, although this is appropriate since there is no security model.
=item * Miscellaneous
@@ -511,11 +461,14 @@ returns C<ENOSYS>.
Win9x can not rename() an open file (although WinNT can).
+The Cygwin chroot() implementation has holes (it can not restrict file
+access by native Win32 programs).
+
=back
=head1 INSTALL
-This will install Perl, including man pages.
+This will install Perl, including I<man> pages.
make install | tee log.make-install
@@ -539,11 +492,11 @@ be kept as clean as possible.
=item Documentation
- INSTALL README.cygwin
- Changes Changes5.005 Changes5.004
- AUTHORS MAINTAIN MANIFEST README.win32
- pod/perl.pod pod/perlfaq3.pod pod/perlhist.pod pod/perlmodlib.pod
- pod/perlport.pod pod/perltoc.pod pod/perl5004delta.pod
+ INSTALL README.cygwin README.win32 MANIFEST
+ Changes Changes5.005 Changes5.004 Changes5.6
+ pod/perl.pod pod/perlport.pod pod/perlfaq3.pod
+ pod/perldelta.pod pod/perl5004delta.pod pod/perl56delta.pod
+ pod/perlhist.pod pod/perlmodlib.pod pod/buildtoc.PL pod/perltoc.pod
=item Build, Configure, Make, Install
@@ -565,6 +518,7 @@ be kept as clean as possible.
=item Tests
t/io/tell.t - binmode
+ t/lib/b.t - ignore Cwd from os_extras
t/lib/glob-basic.t - Win32 directory list access differs from read mode
t/op/magic.t - $^X/symlink WORKAROUND, s/.exe//
t/op/stat.t - no /dev, skip Win32 ftCreationTime quirk
@@ -575,14 +529,12 @@ be kept as clean as possible.
EXTERN.h - __declspec(dllimport)
XSUB.h - __declspec(dllexport)
- cygwin/cygwin.c - os_extras (getcwd)
+ cygwin/cygwin.c - os_extras (getcwd, spawn)
perl.c - os_extras
perl.h - binmode
doio.c - win9x can not rename a file when it is open
- pp_sys.c - do not define h_errno
- mg.c - environ WORKAROUND
- unixish.h - environ WORKAROUND
- util.c - environ WORKAROUND
+ pp_sys.c - do not define h_errno, pp_system with spawn
+ util.c - use setenv
=item Compiled Module Source
@@ -599,33 +551,42 @@ be kept as clean as possible.
- require MM_Cygwin.pm
lib/ExtUtils/MM_Cygwin.pm
- canonpath, cflags, manifypods, perl_archive
+ lib/File/Find.pm - on remote drives stat() always sets st_nlink to 1
lib/File/Spec/Unix.pm - preserve //unc
+ lib/File/Temp.pm - no directory sticky bit
lib/perl5db.pl - use stdin not /dev/tty
- utils/perlcc.PL - DynaLoader.a in compile, -DUSEIMPORTLIB
utils/perldoc.PL - version comment
=back
=head1 BUGS
-Upon each start, I<make> warns that a rule for F<perlmain.o> is overridden
-(but there seems to be no better solution than adding an explicit define).
+When I<make> starts, it warns about overriding commands for F<perlmain.o>.
-`C<make clean>' does not remove library F<.def> and F<.exe.stackdump>
+`C<make clean>' does not remove library F<.def> or F<.exe.stackdump>
files.
The I<ld2> script contains references to the source directory. You should
-change these to C</usr/local/bin> (or whatever) after install.
+change these to $installbin after `C<make install>'.
+
+Support for swapping real and effective user and group IDs is incomplete.
+On WinNT Cygwin provides setuid(), seteuid(), setgid() and setegid().
+However, additional Cygwin calls for manipulating WinNT access tokens
+and security contexts are required.
+
+When building DLLs, `C<dllwrap --export-all-symbols>' is used to export
+global symbols. It might be better to generate an explicit F<.def> file
+(see F<makedef.pl>). Also, DLLs can now be build with `C<gcc -shared>'.
=head1 AUTHORS
-Charles Wilson E<lt>cwilson@ece.gatech.eduE<gt>,
-Eric Fifer E<lt>efifer@sanwaint.comE<gt>,
-alexander smishlajev E<lt>als@turnhere.comE<gt>,
-Steven Morlock E<lt>newspost@morlock.netE<gt>,
-Sebastien Barre E<lt>Sebastien.Barre@utc.frE<gt>,
-Teun Burgers E<lt>burgers@ecn.nlE<gt>.
+Charles Wilson <cwilson@ece.gatech.edu>,
+Eric Fifer <egf7@columbia.edu>,
+alexander smishlajev <als@turnhere.com>,
+Steven Morlock <newspost@morlock.net>,
+Sebastien Barre <Sebastien.Barre@utc.fr>,
+Teun Burgers <burgers@ecn.nl>.
=head1 HISTORY
-Last updated: 1 March 2000
+Last updated: 9 November 2000
diff --git a/gnu/usr.bin/perl/README.dos b/gnu/usr.bin/perl/README.dos
index 269b891fa66..fd5b08ef165 100644
--- a/gnu/usr.bin/perl/README.dos
+++ b/gnu/usr.bin/perl/README.dos
@@ -9,7 +9,7 @@ perldos - Perl under DOS, W31, W95.
=head1 SYNOPSIS
These are instructions for building Perl under DOS (or w??), using
-DJGPP v2.01 or later. Under w95 long filenames are supported.
+DJGPP v2.03 or later. Under w95 long filenames are supported.
=head1 DESCRIPTION
@@ -22,6 +22,10 @@ This port currently supports MakeMaker (the set of modules that
is used to build extensions to perl). Therefore, you should be
able to build and install most extensions found in the CPAN sites.
+Detailed instructions on how to build and install perl extension
+modules, including XS-type modules, is included. See 'BUILDING AND
+INSTALLING MODULES'.
+
=head2 Prerequisites
=over 4
@@ -46,19 +50,19 @@ the world. Like:
You need the following files to build perl (or add new modules):
- v2/djdev202.zip
- v2/bnu27b.zip
- v2gnu/gcc2721b.zip
- v2gnu/bsh1147b.zip
- v2gnu/mak3761b.zip
+ v2/djdev203.zip
+ v2/bnu2951b.zip
+ v2gnu/gcc2952b.zip
+ v2gnu/bsh204b.zip
+ v2gnu/mak3791b.zip
v2gnu/fil316b.zip
- v2gnu/sed118b.zip
- v2gnu/txt122b.zip
- v2gnu/dif271b.zip
- v2gnu/grep21b.zip
+ v2gnu/sed302b.zip
+ v2gnu/txt20b.zip
+ v2gnu/dif272b.zip
+ v2gnu/grep24b.zip
v2gnu/shl112b.zip
v2gnu/gawk303b.zip
- v2misc/csdpmi4b.zip
+ v2misc/csdpmi4b.zip
or possibly any newer version.
@@ -100,9 +104,11 @@ sockets
=item *
Unpack the source package F<perl5.6*.tar.gz> with djtarx. If you want
-to use long file names under w95, don't forget to use
+to use long file names under w95 and also to get Perl to pass all its
+tests, don't forget to use
set LFN=y
+ set FNCASE=y
before unpacking the archive.
@@ -113,6 +119,9 @@ directory.
ln -s bash.exe sh.exe
+[If you have the recommended version of bash for DJGPP, this is already
+done for you.]
+
And make the C<SHELL> environment variable point to this F<sh.exe>:
set SHELL=c:/djgpp/bin/sh.exe (use full path name!)
@@ -129,20 +138,34 @@ F<split.exe> to F<djsplit.exe>, and F<gsplit.exe> to F<split.exe>.
Copy or link F<gecho.exe> to F<echo.exe> if you don't have F<echo.exe>.
Copy or link F<gawk.exe> to F<awk.exe> if you don't have F<awk.exe>.
+[If you have the recommended versions of djdev, shell utilities and
+gawk, all these are already done for you, and you will not need to do
+anything.]
+
=item *
Chdir to the djgpp subdirectory of perl toplevel and type the following
-command:
+commands:
+ set FNCASE=y
configure.bat
This will do some preprocessing then run the Configure script for you.
-The Configure script is interactive, but in most cases you
-just need to press ENTER.
+The Configure script is interactive, but in most cases you just need to
+press ENTER. The "set" command ensures that DJGPP preserves the letter
+case of file names when reading directories. If you already issued this
+set command when unpacking the archive, and you are in the same DOS
+session as when you unpacked the archive, you don't have to issue the
+set command again. This command is necessary *before* you start to
+(re)configure or (re)build perl in order to ensure both that perl builds
+correctly and that building XS-type modules can succeed. See the DJGPP
+info entry for "_preserve_fncase" for more information:
+
+ info libc alphabetical _preserve_fncase
If the script says that your package is incomplete, and asks whether
to continue, just answer with Y (this can only happen if you don't use
-long filenames).
+long filenames or forget to issue "set FNCASE=y" first).
When Configure asks about the extensions, I suggest IO and Fcntl,
and if you want database handling then SDBM_File or GDBM_File
@@ -201,9 +224,106 @@ directory structure. Perl.exe and the utilities go into C<($DJDIR)/bin>,
and the library goes under C<($DJDIR)/lib/perl5>. The pod documentation
goes under C<($DJDIR)/lib/perl5/pod>.
+=head1 BUILDING AND INSTALLING MODULES
+
+
+=head2 Prerequisites
+
+For building and installing non-XS modules, all you need is a working
+perl under DJGPP. Non-XS modules do not require re-linking the perl
+binary, and so are simpler to build and install.
+
+XS-type modules do require re-linking the perl binary, because part of
+an XS module is written in "C", and has to be linked together with the
+perl binary to be executed. This is required because perl under DJGPP
+is built with the "static link" option, due to the lack of "dynamic
+linking" in the DJGPP environment.
+
+Because XS modules require re-linking of the perl binary, you need both
+the perl binary distribution and the perl source distribution to build
+an XS extension module. In addition, you will have to have built your
+perl binary from the source distribution so that all of the components
+of the perl binary are available for the required link step.
+
+=head2 Unpacking CPAN Modules
+
+First, download the module package from CPAN (e.g., the "Comma Separated
+Value" text package, Text-CSV-0.01.tar.gz). Then expand the contents of
+the package into some location on your disk. Most CPAN modules are
+built with an internal directory structure, so it is usually safe to
+expand it in the root of your DJGPP installation. Some people prefer to
+locate source trees under /usr/src (i.e., C<($DJDIR)/usr/src>), but you may
+put it wherever seems most logical to you, *EXCEPT* under the same
+directory as your perl source code. There are special rules that apply
+to modules which live in the perl source tree that do not apply to most
+of the modules in CPAN.
+
+Unlike other DJGPP packages, which are normal "zip" files, most CPAN
+module packages are "gzipped tarballs". Recent versions of WinZip will
+safely unpack and expand them, *UNLESS* they have zero-length files. It
+is a known WinZip bug (as of v7.0) that it will not extract zero-length
+files.
+
+From the command line, you can use the djtar utility provided with DJGPP
+to unpack and expand these files. For example:
+
+ C:\djgpp>djtarx -v Text-CSV-0.01.tar.gz
+
+This will create the new directory C<($DJDIR)/Text-CSV-0.01>, filling
+it with the source for this module.
+
+=head2 Building Non-XS Modules
+
+To build a non-XS module, you can use the standard module-building
+instructions distributed with perl modules.
+
+ perl Makefile.PL
+ make
+ make test
+ make install
+
+This is sufficient because non-XS modules install only ".pm" files and
+(sometimes) pod and/or man documentation. No re-linking of the perl
+binary is needed to build, install or use non-XS modules.
+
+=head2 Building XS Modules
+
+To build an XS module, you must use the standard module-building
+instructions distributed with perl modules *PLUS* three extra
+instructions specific to the DJGPP "static link" build environment.
+
+ set FNCASE=y
+ perl Makefile.PL
+ make
+ make perl
+ make test
+ make -f Makefile.aperl inst_perl MAP_TARGET=perl.exe
+ make install
+
+The first extra instruction sets DJGPP's FNCASE environment variable so
+that the new perl binary which you must build for an XS-type module will
+build correctly. The second extra instruction re-builds the perl binary
+in your module directory before you run "make test", so that you are
+testing with the new module code you built with "make". The third extra
+instruction installs the perl binary from your module directory into the
+standard DJGPP binary directory, C<($DJDIR)/bin>, replacing your
+previous perl binary.
+
+Note that the MAP_TARGET value *must* have the ".exe" extension or you
+will not create a "perl.exe" to replace the one in C<($DJDIR)/bin>.
+
+When you are done, the XS-module install process will have added information
+to yout "perllocal" information telling that the perl binary has been replaced,
+and what module was installed. you can view this information at any time
+by using the command:
+
+ perl -S perldoc perllocal
+
=head1 AUTHOR
-Laszlo Molnar, F<laszlo.molnar@eth.ericsson.se>
+Laszlo Molnar, F<laszlo.molnar@eth.ericsson.se> [Installing/building perl]
+
+Peter J. Farley III F<pjfarley@banet.net> [Building/installing modules]
=head1 SEE ALSO
diff --git a/gnu/usr.bin/perl/README.epoc b/gnu/usr.bin/perl/README.epoc
index b4bcca60e4a..2d8f8f37877 100644
--- a/gnu/usr.bin/perl/README.epoc
+++ b/gnu/usr.bin/perl/README.epoc
@@ -1,49 +1,79 @@
-=====================================================================
-Perl 5 README file for the EPOC operating system.
-=====================================================================
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see pod/perlpod.pod) which is
+specially designed to be readable as is.
+
+=head1 NAME
+
+README.epoc - Perl for EPOC
-Olaf Flebbe <o.flebbe@gmx.de>
-http://www.linuxstart.com/~oflebbe/perl/perl5.html
-2000-02-20
+=head1 SYNOPSIS
+
+Perl 5 README file for the EPOC operating system.
-=====================================================================
-Introduction
-=====================================================================
+=head1 INTRODUCTION
EPOC is a OS for palmtops and mobile phones. For more informations look at:
http://www.symbian.com/
-This is a port of Perl version 5.5.650 to EPOC. It runs on the Perl
-Series 5, Series 5mx and the Psion Revo. I have no reports for other
-EPOC devices.
+This is a port of perl to EPOC. It runs on ER5 machines: Psion 5mx,
+5mx Pro, Psion Revo and on the Ericson M128. I have no report about
+the Psion Netbook or the S7. It runs on ER3 Hardware (Series 5
+classic), too. For more information about this hardware please refer
+to http://www.psion.com.
+
+Vendors which like to have support for their devices are free to send
+me a sample.
+
+=head1 INSTALLING PERL ON EPOC
+
+You can download a ready-to-install version from
+http://www.science-computing.de/o.flebbe/perl. You may find other
+versions with some CPAN modules included at this location.
+
+You will need at least 4MB free space in order to install and run
+perl.
+
+Install perl.sis on the EPOC machine. If you do not know how to do
+that, consult your PsiWin documentation.
-Features are left out, because of restrictions of the POSIX support.
+Perl itself and its standard library is using 2.9 MB disk space.
+Unicode support and some other modules are left out. (For details,
+please look into epoc/createpkg.pl). If you like to use these modules,
+you are free to copy them from a current perl release.
-=====================================================================
-Installation/Usage
-=====================================================================
+=head1 STARTING PERL ON EPOC
-You will need ~4MB free space in order to install and run perl.
+For ER5 machines, you can get the software Perlstart
+http://www.science-computing.de/o.flebbe/perl. It contains file
+recognizers for files with the extension .pl and .pm. With it you can
+start perl with a double click on the camel icon. Be sure to configure
+the perl installation drive first. You can even provide a script with
+a special commandline, if needed.
-Install perl.sis on the EPOC machine (most likely a PSION Series 5,
-5mx). If you do not know how to do that, you are on your own.
+Alternativly you can get ESHELL from symbian:
+http://developer.epocworld.com/downloads/progs/Eshell.zip
-Perl itself and its standard library are using 2.5 MB disk space. I
-left out unicode support modules and modules which will not work with
-this version. (For details look into epoc/createpkg.pl). If you like
-to use them, you are free to copy them from a current perl release.
+Running ESHELL you can enter: perl -de 0 in order to run the perl
+debugger. If you are leaving perl, you get into the system screen. You
+have to switch back manually to ESHELL. When perl is running, you will
+see a task with the name STDOUT in the task list.
-Copy eshell.exe from the same page you got perl to your EPOC device.
-Start eshell.exe with a double tap.
+If you have a ER3 machine (i.e. a PSION 5), you may have to supply the
+full path to the perl executable C:\system\programs\perl.exe.
-Now you can enter: perl -de 0 in order to run the perl debugger. If
-you are leaving perl, you get into the system screen. You have to
-switch back manually to eshell.exe When perl is running, you will see
-a task with the name STDOUT in the task list.
+If you need to set the current directory of perl, please use the
+command line switch '-x'. See L<perlrun> for details.
-======================================================================
-IO Redirection
-======================================================================
+=head1 STOPPING PERL ON EPOC
+
+You can stop a running perl process in the task list by closing the
+application `STDOUT'. You cannot stop a running perl process if it has
+not written anyting to stdout or stderr! Be very cautious with I/O
+redirection. You will have to reboot the PDA!
+
+=head1 USING PERL ON EPOC
+
+=head2 I/O Redirection
You can redirect the output with the UNIX bourne shell syntax (this is
built into perl rather then eshell) For instance the following command
@@ -52,109 +82,150 @@ stdout_file, the errors to stderr_file and input from stdin_file.
perl test.pl >stdout_file <stdin_file 2>stderr_file
-Alternativly you can use 2>&1 in order to add the standard error
+Alternatively you can use 2>&1 in order to add the standard error
output to stdout.
-======================================================================
-PATH Names
-======================================================================
+=head2 PATH Names
+
+ESHELL looks for executables in ?:/System/Programs. The SIS file
+installs perl in this special folder directory. The default drive and
+path are the same as folder the executable resides. The EPOC
+filesystem is case-preserving, not case-sensitive.
+
+The EPOC estdlib uses the ?: syntax for establishing a search order:
+First in C: (RAM), then on D: (CF Card, if present) and last in Z:
+(ROM). For instance ?:\a.txt searches for C:\a.txt, D:\a.txt (and
+Z:\a.txt)
+
+The perl @INC search path is implemented with '?:'. Your perl
+executable can live on a different drive than the perl library or even
+your scripts.
+
+ESHELL paths have to be written with backslashes '\', file arguments
+to perl with slashes '/'. Remember that I/O redirection is done
+internally in perl, so please use slashes for redirects.
+
+perl.exe C:/test.pl >C:/output.txt
+
+=head2 Editors
-Pathnames to executables in eshell.exe have to be written with
-backslashes '\', file arguments to perl with slashes '/'. The default
-drive of perl is the same as the drive perl.exe is located on, the
-default path seems to be '/'.
+A suitable text editor can be downloaded from symbian
+ http://developer.epocworld.com/downloads/progs/Editor.zip
-i.e. command lines look a little bit funny:
+=head2 Features
-D:\perl.exe C:/test.pl >C:/output.txt
+The built-in function EPOC::getcwd returns the current directory.
-You can automatically search for file on all EPOC drives with a ? as
-the driver letter. For instance ?:\a.txt seraches for C:\a.txt,
-D:\b.txt (and Z:\a.txt).
+=head2 Restrictions
-======================================================================
-Editors
-======================================================================
+Features are left out, because of restrictions of the POSIX support in
+EPOC:
-You may have a problem to create perl scripts. A cumbersome workaround
-is to use the OPL Editor and exporting to text.
+=over 4
-The OPL+ Editor is quite good. (Shareware: http://www.twiddlebit.com)
-There is a port of vim around:
- http://www.starship.freeserve.co.uk/index.html
+=item *
-======================================================================
-Restrictions
-======================================================================
+backquoting, pipes etc.
-The following things are left out of this perl port:
+=item *
-+ backquoting, pipes etc.
+system() does not inherit ressources like: file descriptors,
+environment etc.
-+ system() does not inherit ressources like: file descriptors,
- environment etc.
+=item *
-+ signal, kill, alarm. Do not try to use them. This may be
- impossible to implement on EPOC.
+signal, kill, alarm. Do not try to use them. This may be
+impossible to implement on EPOC.
-+ select is missing.
+=item *
-+ binmode does not exist. (No CR LF to LF translation for text files)
+select is missing.
-+ EPOC does not handle the notion of current drive and current
- directory very well (i.e. not at all, but it tries hard to emulate
- one) See PATH.
+=item *
-+ You need the shell eshell.exe in order to run perl.exe and supply
- it with arguments.
+binmode does not exist. (No CR LF to LF translation for text files)
-+ Heap is limited to 4MB.
+=item *
-===================================================================
-Compiling Perl 5 on the EPOC cross compiling envionment.
-===================================================================
+EPOC does not handle the notion of current drive and current
+directory very well (i.e. not at all, but it tries hard to emulate
+one) See PATH.
+
+=item *
+
+Heap is limited to 4MB.
+
+=item *
+
+Dynamic loading is not implemented.
+
+=back
+
+=head2 Compiling Perl 5 on the EPOC cross compiling environment
Sorry, this is far too short.
- You will need the C++ SDK from http://developer.epocworld.com/.
+=over 4
+
+=item *
+
+You will need the C++ SDK from http://developer.epocworld.com/.
+
+=item *
- You will need to set up the cross SDK from
- http://www.linuxstart.com/~oflebbe
+You will need to set up the cross SDK from
+http://www.science-computing.de/o.flebbe/sdk
- You may have to adjust config.sh (cc, cppflags) for your epoc
- install location.
+=item *
- You may have to adjust config.sh for your cross SDK location
+You may have to adjust config.sh (cc, cppflags) to reflect your epoc
+and SDK location.
- Get the Perl sources from your nearest CPAN site.
+=item *
- Unpack the sources.
+Get the Perl sources from your nearest CPAN site.
+
+=item *
+
+Unpack the sources.
+
+=item *
+
+Build a native perl from this sources... Make sure to save the
+miniperl executable as miniperl.native.
+
+Start again from scratch
- Build a native perl from this sources...
cp epoc/* .
./Configure -S
- make perl
+ make
cp miniperl.native miniperl
- make perl
+ make
+ make ext/Errno/pm_to_blib
perl link.pl perlmain.o lib/auto/DynaLoader/DynaLoader.a \
- lib/auto/Data/Dumper.a \
+ lib/auto/Data/Dumper/Dumper.a \
lib/auto/File/Glob/Glob.a lib/auto/IO/IO.a \
- lib/auto/Socket/Socket.a perl.a `cat ext.libs`
+ lib/auto/Socket/Socket.a \
+ lib/auto/Fcntl/Fcntl.a lib/auto/Sys/Hostname/Hostname.a \
+ perl.a `cat ext.libs`
perl createpkg.pl
- wine "G:/bin/makesis perl.pkg perl.sis"
+ wine G:/bin/makesis perl.pkg perl.sis
+
+=back
+
+=head1 SUPPORT STATUS
+
+I'm offering this port "as is". You can ask me questions, but I can't
+guarantee I'll be able to answer them.
+
+=head1 AUTHOR
-====================================================================
-Wish List
-====================================================================
+Olaf Flebbe <o.flebbe@science-computing.de>
+http://www.science-computing.de/o.flebbe/perl/
-- Threads ?
-- Acess to the GUI?
+=head1 LAST UPDATE
-====================================================================
-Support Status
-====================================================================
+2001-02-26
-I'm offering this port "as is". You can ask me questions, but I can't
-guarantee I'll be able to answer them; I don't know much about Perl
-internals myself;
+=cut
diff --git a/gnu/usr.bin/perl/README.hpux b/gnu/usr.bin/perl/README.hpux
index 4cdcf58d9b0..7d0198353c7 100644
--- a/gnu/usr.bin/perl/README.hpux
+++ b/gnu/usr.bin/perl/README.hpux
@@ -1,6 +1,6 @@
-If you read this file _as_is_, just ignore the funny characters you
-see. It is written in the POD format (see pod/perlpod.pod) which is
-specially designed to be readable as is.
+If you read this file _as_is_, just ignore the funny characters you see.
+It is written in the POD format (see pod/perlpod.pod) which is specially
+designed to be readable as is.
=head1 NAME
@@ -8,33 +8,35 @@ README.hpux - Perl version 5 on Hewlett-Packard Unix (HP-UX) systems
=head1 DESCRIPTION
-This document describes various features of HP's Unix operating system (HP-UX)
-that will affect how Perl version 5 (hereafter just Perl) is compiled and/or
-runs.
+This document describes various features of HP's Unix operating system
+(HP-UX) that will affect how Perl version 5 (hereafter just Perl) is
+compiled and/or runs.
=head2 Compiling Perl 5 on HP-UX
-When compiling Perl, the use of an ANSI C compiler is highly recommended.
-The C compiler that ships with all HP-UX systems is a K&R compiler that
-should only be used to build new kernels.
+When compiling Perl, you must use an ANSI C compiler. The C compiler
+that ships with all HP-UX systems is a K&R compiler that should only be
+used to build new kernels.
Perl can be compiled with either HP's ANSI C compiler or with gcc. The
-former is recommended, as not only can it compile Perl with no difficulty,
-but also can take advantage of features listed later that require the use
-of HP compiler-specific command-line flags.
+former is recommended, as not only can it compile Perl with no
+difficulty, but also can take advantage of features listed later that
+require the use of HP compiler-specific command-line flags.
-If you decide to use gcc, make sure your installation is recent and complete,
-and be sure to read the Perl README file for more gcc-specific details.
+If you decide to use gcc, make sure your installation is recent and
+complete, and be sure to read the Perl README file for more gcc-specific
+details.
=head2 PA-RISC
-HP's current Unix systems run on its own Precision Architecture (PA-RISC) chip.
-HP-UX used to run on the Motorola MC68000 family of chips, but any machine with
-this chip in it is quite obsolete and this document will not attempt to address
-issues for compiling Perl on the Motorola chipset.
+HP's current Unix systems run on its own Precision Architecture
+(PA-RISC) chip. HP-UX used to run on the Motorola MC68000 family of
+chips, but any machine with this chip in it is quite obsolete and this
+document will not attempt to address issues for compiling Perl on the
+Motorola chipset.
-The most recent version of PA-RISC at the time of this document's last update
-is 2.0.
+The most recent version of PA-RISC at the time of this document's last
+update is 2.0.
=head2 PA-RISC 1.0
@@ -42,8 +44,8 @@ The original version of PA-RISC, HP no longer sells any system with this chip.
The following systems contain PA-RISC 1.0 chips:
- 600, 635, 645, 800, 808, 815, 822, 825, 832, 834, 835, 840,
- 842, 845, 850, 852, 855, 860, 865, 870, 890
+ 600, 635, 645, 808, 815, 822, 825, 832, 834, 835, 840, 842, 845, 850, 852,
+ 855, 860, 865, 870, 890
=head2 PA-RISC 1.1
@@ -52,52 +54,58 @@ system.
The following systems contain with PA-RISC 1.1 chips:
- 705, 710, 712, 715, 720, 722, 725, 728, 730, 735, 743, 745, 747, 750,
- 755, 770, 807S, 817S, 827S, 837S, 847S, 857S, 867S, 877S, 887S, 897S,
- D200, D210, D220, D230, D250, D260, D310, D320, D330, D350, D360, D400,
- E25, E35, E45, E55, F10, F20, F30, G30, G40, G50, G60, G70, H30, H40,
- H50, H60, H70, I30, I40, I50, I60, I70, K100, K200, K210, K220, K400,
- K410, K420, T500, T520
-
+ 705, 710, 712, 715, 720, 722, 725, 728, 730, 735, 742, 743, 745, 747, 750,
+ 755, 770, 777, 778, 779, 800, 801, 803, 806, 807, 809, 811, 813, 816, 817,
+ 819, 821, 826, 827, 829, 831, 837, 839, 841, 847, 849, 851, 856, 857, 859,
+ 867, 869, 877, 887, 891, 892, 897, A180, A180C, B115, B120, B132L, B132L+,
+ B160L, B180L, C100, C110, C115, C120, C160L, D200, D210, D220, D230, D250,
+ D260, D310, D320, D330, D350, D360, D410, DX0, DX5, DZO, E25, E35, E45,
+ E55, F10, F20, F30, G30, G40, G50, G60, G70, H20, H30, H40, H50, H60, H70,
+ I30, I40, I50, I60, I70, J200, J210, J210XC, K100, K200, K210, K220, K230,
+ K400, K410, K420, S700i, S715, S724, S760, T500, T520
=head2 PA-RISC 2.0
-The most recent upgrade to the PA-RISC design, it added support for 64-bit
-integer data.
+The most recent upgrade to the PA-RISC design, it added support for
+64-bit integer data.
-The following systems contain PA-RISC 2.0 chips (this is very likely to be
-out of date):
+As of the date of this document's last update, the following systems
+contain PA-RISC 2.0 chips (this is very likely to be out of date):
- D270, D280, D370, D380, K250, K260, K370, K380, K450, K460, K570, K580,
- T600, V2200
+ 700, 780, 781, 782, 783, 785, 802, 804, 810, 820, 861, 871, 879, 889, 893,
+ 895, 896, 898, 899, B1000, C130, C140, C160, C180, C180+, C180-XP, C200+,
+ C400+, C3000, C360, CB260, D270, D280, D370, D380, D390, D650, J220, J2240,
+ J280, J282, J400, J410, J5000, J7000, K250, K260, K260-EG, K270, K360,
+ K370, K380, K450, K460, K460-EG, K460-XP, K470, K570, K580, L1000, L2000,
+ N4000, R380, R390, T540, T600, V2000, V2200, V2250, V2500
A complete list of models at the time the OS was built is in the file
-/opt/langtools/lib/sched.models.
-The first column corresponds to the output of the "uname -m" command
-(without the leading "9000/").
-The second column is the PA-RISC version
-and the third column is the exact chip type used.
+/opt/langtools/lib/sched.models. The first column corresponds to the
+output of the "uname -m" command (without the leading "9000/"). The
+second column is the PA-RISC version and the third column is the exact
+chip type used.
=head2 Portability Between PA-RISC Versions
An executable compiled on a PA-RISC 2.0 platform will not execute on a
-PA-RISC 1.1 platform, even if they are running the same version of HP-UX.
-If you are building Perl on a PA-RISC 2.0 platform and want that Perl to
-to also run on a PA-RISC 1.1, the compiler flags +DAportable and +DS32
-should be used.
+PA-RISC 1.1 platform, even if they are running the same version of
+HP-UX. If you are building Perl on a PA-RISC 2.0 platform and want that
+Perl to to also run on a PA-RISC 1.1, the compiler flags +DAportable and
++DS32 should be used.
-It is no longer possible to compile PA-RISC 1.0 executables on either the
-PA-RISC 1.1 or 2.0 platforms.
+It is no longer possible to compile PA-RISC 1.0 executables on either
+the PA-RISC 1.1 or 2.0 platforms.
=head2 Building Dynamic Extensions on HP-UX
HP-UX supports dynamically loadable libraries (shared libraries).
Shared libraries end with the suffix .sl.
-Shared libraries created on a platform using a particular PA-RISC version
-are not usable on platforms using an earlier PA-RISC version by default.
-However, this backwards compatibility may be enabled using the same
-+DAportable compiler flag (with the same PA-RISC 1.0 caveat mentioned above).
+Shared libraries created on a platform using a particular PA-RISC
+version are not usable on platforms using an earlier PA-RISC version by
+default. However, this backwards compatibility may be enabled using the
+same +DAportable compiler flag (with the same PA-RISC 1.0 caveat
+mentioned above).
To create a shared library, the following steps must be performed:
@@ -116,47 +124,46 @@ If these dependent libraries are not listed at shared library creation
time, you will get fatal "Unresolved symbol" errors at run time when the
library is loaded.
-You may create a shared library that referers to another library, which
-may be either an archive library or a shared library. If it is a
-shared library, this is called a "dependent library".
-The dependent library's name is recorded in the main shared library,
-but it is not linked into the shared library.
-Instead, it is loaded when the main shared library is loaded.
+You may create a shared library that refers to another library, which
+may be either an archive library or a shared library. If this second
+library is a shared library, this is called a "dependent library". The
+dependent library's name is recorded in the main shared library, but it
+is not linked into the shared library. Instead, it is loaded when the
+main shared library is loaded. This can cause problems if you build an
+extension on one system and move it to another system where the
+libraries may not be located in the same place as on the first system.
If the referred library is an archive library, then it is treated as a
simple collection of .o modules (all of which must contain PIC). These
modules are then linked into the shared library.
-Note that it is okay to create a library which contains a dependent library
-that is already linked into perl.
+Note that it is okay to create a library which contains a dependent
+library that is already linked into perl.
It is no longer possible to link PA-RISC 1.0 shared libraries.
=head2 The HP ANSI C Compiler
-When using this compiler to build Perl, you should make sure that
-the flag -Aa is added to the cpprun and cppstdin variables in the
-config.sh file.
+When using this compiler to build Perl, you should make sure that the
+flag -Aa is added to the cpprun and cppstdin variables in the config.sh
+file (though see the section on 64-bit perl below).
=head2 Using Large Files with Perl
-Beginning with HP-UX version 10.20, files larger than 2GB (2^31) may be
-created and manipulated.
-Three separate methods of doing this are available.
-Of these methods,
-the best method for Perl is to compile using the -D_FILE_OFFSET_BITS=64
-compiler flag.
-This causes Perl to be compiled using structures and functions in which
-these are 64 bits wide, rather than 32 bits wide.
-
-There are only two drawbacks to this approach:
-the first is that the seek and tell functions (both the builtin version
-and the POSIX module's version) will not correctly
-function for these large files
-(the offset arguments in seek and tell are implemented as type long).
-The second is that any extension which calls any file-manipulating C function
-will need to be recompiled using the above-mentioned -D_FILE_OFFSET_BITS=64
-flag.
+Beginning with HP-UX version 10.20, files larger than 2GB (2^31 bytes)
+may be created and manipulated. Three separate methods of doing this
+are available. Of these methods, the best method for Perl is to compile
+using the -Duselargefiles flag to Configure. This causes Perl to be
+compiled using structures and functions in which these are 64 bits wide,
+rather than 32 bits wide. (Note that this will only work with HP's ANSI
+C compiler. If you want to compile Perl using gcc, you will have to get
+a version of the compiler that support 64-bit operations.)
+
+There are some drawbacks to this approach. One is that any extension
+which calls any file-manipulating C function will need to be recompiled
+(just follow the usual "perl Makefile.PL; make; make test; make install"
+procedure).
+
The list of functions that will need to recompiled is:
creat, fgetpos, fopen,
freopen, fsetpos, fstat,
@@ -167,51 +174,98 @@ open, prealloc, stat,
statvfs, statvfsdev, tmpfile,
truncate, getrlimit, setrlimit
+Another drawback is only valid for Perl versions before 5.6.0. This
+drawback is that the seek and tell functions (both the builtin version
+and POSIX module version) will not perform correctly.
+
+It is strongly recommended that you use this flag when you run
+Configure. If you do not do this, but later answer the question about
+large files when Configure asks you, you may get a configuration that
+cannot be compiled, or that does not function as expected.
+
=head2 Threaded Perl
-It is impossible to compile a version of threaded Perl on any version of
-HP-UX before 10.30, and it is strongly suggested that you be running on
+It is possible to compile a version of threaded Perl on any version of
+HP-UX before 10.30, but it is strongly suggested that you be running on
HP-UX 11.00 at least.
-To compile Perl with thread, add -Dusethreads to the arguments of Configure.
-Ensure that the -D_POSIX_C_SOURCE=199506L compiler flag is automatically
-added to the list of flags. Also make sure that -lpthread is listed before
--lc in the list of libraries to link Perl with.
+To compile Perl with threads, add -Dusethreads to the arguments of
+Configure. Verify that the -D_POSIX_C_SOURCE=199506L compiler flag is
+automatically added to the list of flags. Also make sure that -lpthread
+is listed before -lc in the list of libraries to link Perl with.
+
+As of the date of this document, Perl threads are not fully supported on
+HP-UX.
-As of the date of this document, Perl threads are not fully supported on HP-UX.
+HP-UX versions before 10.30 require a seperate installation of a POSIX
+threads library package. Two examples are the HP DCE package, available
+on "HP-UX Hardware Extensions 3.0, Install and Core OS, Release 10.20,
+April 1999 (B3920-13941)" or the Freely available PTH package, available
+though worldwide HP-UX mirrors of precompiled packages
+(e.g. http://hpux.tn.tudelft.nl/hppd/hpux/alpha.html)
=head2 64-bit Perl
-Beginning with HP-UX 11.00, programs compiled under HP-UX can take advantage
-of the LP64 programming environment (LP64 means Longs and Pointers are 64 bits
-wide).
+Beginning with HP-UX 11.00, programs compiled under HP-UX can take
+advantage of the LP64 programming environment (LP64 means Longs and
+Pointers are 64 bits wide).
-Work is being performed on Perl to make it 64-bit compliant on all versions
-of Unix. Once this is complete, scalar variables will be able to hold
-numbers larger than 2^32 with complete precision.
+Work is being performed on Perl to make it 64-bit compliant on all
+versions of Unix. Once this is complete, scalar variables will be able
+to hold numbers larger than 2^32 with complete precision.
As of the date of this document, Perl is not 64-bit compliant on HP-UX.
-Should a user wish to experiment with compiling Perl in the LP64 environment,
-the following steps must be taken: libraries must be searched only within
-/lib/pa20_64, the compiler flag +DD64 must be used, and the C library is
-now located at /lib/pa20_64/libc.sl.
+Should a user wish to experiment with compiling Perl in the LP64
+environment, use the -Duse64bitall flag to Configure. This will force
+Perl to be compiled in a pure LP64 environment (via the +DD64 flag).
+
+You can also use the -Duse64bitint flag to Configure. Although there
+are some minor differences between compiling Perl with this flag versus
+the -Duse64bitall flag, they should not be noticeable from a Perl user's
+perspective.
+
+In both cases, it is strongly recommended that you use these flags when
+you run Configure. If you do not use do this, but later answer the
+questions about 64-bit numbers when Configure asks you, you may get a
+configuration that cannot be compiled, or that does not function as
+expected.
-On the brighter side, the large file problem goes away, as longs are now
-64 bits wide.
+(Note that these Configure flags will only work with HP's ANSI C
+compiler. If you want to compile Perl using gcc, you will have to get a
+version of the compiler that support 64-bit operations.)
=head2 GDBM and Threads
-If you attempt to compile Perl with threads on an 11.X system and also link
-in the GDBM library, then Perl will immediately core dump when it starts up.
-The only workaround at this point is to relink the GDBM library under 11.X,
-then relink it into Perl.
+If you attempt to compile Perl with threads on an 11.X system and also
+link in the GDBM library, then Perl will immediately core dump when it
+starts up. The only workaround at this point is to relink the GDBM
+library under 11.X, then relink it into Perl.
=head2 NFS filesystems and utime(2)
If you are compiling Perl on a remotely-mounted NFS filesystem, the test
-io/fs.t may fail on test #18.
-This appears to be a bug in HP-UX and no fix is currently available.
+io/fs.t may fail on test #18. This appears to be a bug in HP-UX and no
+fix is currently available.
+
+=head2 perl -P and //
+
+In HP-UX Perl is compiled with flags that will cause problems if the
+-P flag of Perl (preprocess Perl code with the C preprocessor before
+perl sees it) is used. The problem is that C<//>, being a C++-style
+until-end-of-line comment, will disappear along with the remainder
+of the line. This means that common Perl constructs like
+
+ s/foo//;
+
+will turn into illegal code
+
+ s/foo
+
+The workaround is to use some other quoting separator than C<"/">,
+like for example C<"!">:
+
+ s!foo!!;
=head1 AUTHOR
@@ -221,6 +275,6 @@ With much assistance regarding shared libraries from Marc Sabatella.
=head1 DATE
-Version 0.2: 1999/03/01
+Version 0.6.2: 2001-02-02
=cut
diff --git a/gnu/usr.bin/perl/README.machten b/gnu/usr.bin/perl/README.machten
index 4310bbcde38..8e14fc7117d 100644
--- a/gnu/usr.bin/perl/README.machten
+++ b/gnu/usr.bin/perl/README.machten
@@ -57,25 +57,13 @@ and limited in its effect on practical Perl programs.
=back
-=head2 Using external modules
-
-If warnings are enabled with Perl's C<-w> command-line flag, you are
-likely to see warnings when using external modules containing XS
-(compiled) code:
-
- Subroutine DynaLoader::dl_error redefined at /usr/local/lib/perl5/5.6.0/powerpc-machten/DynaLoader.pm line 93.
-
-This is a harmless consequence of the static linking used for MachTen
-perl. You can suppress the warnings by using the more modern
-C<-Mwarnings> instead of the traditional C<-w>. (See L<perllexwarn>.)
-
=head2 Building external modules
To add an external module to perl, build in the normal way, which
is documented in L<ExtUtils::MakeMaker>, or which can be driven
automatically by the CPAN module (see L<CPAN>), which is part of the
-standard distribution. If wou want to install a
-module contains XS code (C or C++ source which compiles to object code
+standard distribution. If you want to install a module which
+contains XS code (C or C++ source which compiles to object code
for linking with perl), you will have to replace your perl binary with
a new version containing the new statically-linked object module. The
build process tells you how to do this.
@@ -98,4 +86,4 @@ Dominic Dunlop <domo@computer.org>
=head1 DATE
-Version 1.0 2000-03-22
+Version 1.0.1 2000-03-27
diff --git a/gnu/usr.bin/perl/README.macos b/gnu/usr.bin/perl/README.macos
new file mode 100644
index 00000000000..cc8121be1cf
--- /dev/null
+++ b/gnu/usr.bin/perl/README.macos
@@ -0,0 +1,60 @@
+If you read this file _as_is_, just ignore the funny characters you see.
+It is written in the POD format (see pod/perlpod.pod) which is specially
+designed to be readable as is.
+
+=head1 NAME
+
+README.macos - Perl under Mac OS (Classic)
+
+
+=head1 SYNOPSIS
+
+This document briefly describes perl under Mac OS (Classic).
+If you are running perl under Mac OS X, you don't want to be
+here (unless you are in the Classic environment under Mac OS X).
+
+When we say "Mac OS" below, we mean pre-Mac OS X, which includes
+Mac OS 7, 8, and 9.
+
+
+=head1 DESCRIPTION
+
+The perl 5.6.1 source itself builds on Mac OS, with some additional
+pieces. Support for Mac OS is now in the perl core, and MacPerl will be
+able to, in the future, keep in closer sync with regular perl releases.
+
+At this time, though, it is very buggy, and is under development. An
+alpha release is coming very soon.
+
+To build perl for Mac OS (as an MPW tool), you will need the addition
+of the "macos" subdirectory, distributed separately. It includes extra
+source files, config files, and make files. It also includes a lot of
+extra Mac-specific modules.
+
+To build the MacPerl application, you will also need the "macperl"
+directory, which includes the source files for creating the
+application itself.
+
+All of this is also available from the SourceForge site, via
+HTTP, FTP, and anonymous CVS.
+
+ http://macperl.sourceforge.net/
+
+You will also need compilers and libraries, all of them freely
+available. These are linked to from the SourceForge site. Go that site
+for all things having to do with MacPerl development.
+
+MacPerl 5.2.0r4 is available on the CPAN and on SourceForge. It
+is based on perl 5.004.
+
+
+=head1 AUTHOR
+
+perl was ported to Mac OS by Matthias Neeracher
+E<lt>neeracher@mac.comE<gt>. It is currently maintained by Chris
+Nandor E<lt>pudge@pobox.comE<gt>.
+
+
+=head1 DATE
+
+Last modified 2001.04.05.
diff --git a/gnu/usr.bin/perl/README.mpeix b/gnu/usr.bin/perl/README.mpeix
index 9e0b51d796b..7976db54ad8 100644
--- a/gnu/usr.bin/perl/README.mpeix
+++ b/gnu/usr.bin/perl/README.mpeix
@@ -1,260 +1,675 @@
-Perl/iX for HP 3000 MPE
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see perlpod manpage) which is
+specially designed to be readable as is.
-http://www.cccd.edu/~markb/perlix.html
-Perl language for MPE
-Last updated July 15, 1998 @ 2030 UTC
+=head1 NAME
- ------------------------------------------------------------------------
+README.mpeix - Perl/iX for HP e3000 MPE
+
+=head1 SYNOPSIS
-What's New
+ http://www.bixby.org/mark/perlix.html
+ Perl language for MPE
+ Last updated June 2, 2000 @ 0400 UTC
+
+=head1 NOTE
- * July 15, 1998
- o Changed startperl to #!/PERL/PUB/perl so that Perl will recognize
- scripts more easily and efficiently.
- * July 8, 1998
- o Updated to version 5.004_70 (internal developer release) which is
- now MPE-ready. The next public freeware release of Perl should
- compile "straight out of the box" on MPE. Note that this version
- of Perl/iX was strictly internal to me and never publicly
- released. Note that BIND/iX is now required (well, the include
- files and libbind.a) if you wish to compile Perl/iX.
- * November 6, 1997
- o Updated to version 5.004_04. No changes in MPE-specific
- functionality.
+This is a podified version of the above-mentioned web page,
+podified by Jarkko Hietaniemi 2001-Jan-01.
- ------------------------------------------------------------------------
+=head1 What's New
-Welcome
+June 1, 2000
+
+=over 4
-This is the official home page for the HP 3000 MPE port of the Perl
-scripting language which gives you all of the power of C, awk, sed, and sh
-in a single language. Check here for the latest news, implemented
-functionality, known bugs, to-do list, etc. Status reports about major
-milestones will also be posted to the HP3000-L mailing list and its
-associated gatewayed newsgroup comp.sys.hp.mpe.
+=item *
-I'm doing this port because I can't live without Perl on the HPUX machines
-that I administer for the Coast Community College District, and I want to
-have the same power available to me on MPE.
+Rebuilt to be compatible with mod_perl. If you plan on using
+mod_perl, you MUST download and install this version of Perl/iX!
+
+=item *
-Please send your comments, questions, and bug reports directly to me, Mark
-Bixby, by e-mailing to markb@cccd.edu. Or just post them to HP3000-L. You
-can also telephone me at +1 714 438-4647 Monday-Friday 0815-1745 PDT
-(1615-0145 UTC).
+bincompat5005="undef": sorry, but you will have to recompile any
+binary 5.005 extensions that you may be using (if any; there is no
+5.005 code in what you download from bixby.org)
+uselargefiles="undef": not available in MPE for POSIX files yet.
+
+=item *
-The platform I'm using to do this port is an HP 3000 969KS200 running
-MPE/iX 5.5 and using the gcc 2.8 compiler from
-http://www.interex.org/sources/freeware.html.
+Now bundled with various add-on packages:
-The combined porting wisdom from all of my ports can be found in my MPE/iX
-Porting Guide.
+=over 8
- ------------------------------------------------------------------------
+=item *
-System Requirements
+libnet (http://www.gbarr.demon.co.uk/libnet/FAQ.html)
- * MPE/iX 5.5 or later. This version of Perl/iX does NOT run on MPE/iX
- 5.0 or earlier, nor does it run on "classic" MPE/V machines.
- * The Perl binary requires that you must have converted your NMRL
- libraries in /lib/lib*.a and /usr/lib/lib*.a to NMXL libraries
- /lib/lib*.sl and /usr/lib/lib*.sl via the LIBSHP3K script that comes
- with the GNUCORE portion of the FREEWARE tape.
- * If you wish to recompile Perl, you must install both GNUCORE and
- GNUGCC from the FREEWARE tape.
- * Perl/iX will be happier if you install the MPEKX76A additional POSIX
- filename characters patch, but this is optional.
- * If you will be compiling Perl/iX yourself, you will also need the
- /BIND/PUB/include and /BIND/PUB/lib portions of BIND/iX.
+=item *
- ------------------------------------------------------------------------
+libwww-perl (LWP) which lets Perl programs behave like web browsers:
+
+ 1. #!/PERL/PUB/perl
+ 2. use LWP::Simple;
+ 3. $doc = get('http://www.bixby.org/mark/perlix.html'); # reads the
+ web page into variable $doc
+
+(http://www.bixby.org/mark/perlix.html)
-Demos
+=item *
-Here is a brief selection of some sample Perl/iX uses:
+mod_perl (just the perl portion; the actual DSO will be released
+soon with Apache/iX 1.3.12 from bixby.org). This module allows you to
+write high performance persistent Perl CGI scripts and all sorts of
+cool things. (http://perl.apache.org/)
+
+and much much more hiding under /PERL/PUB/.cpan/
+
+=item *
- * A web feedback CGI form that lets a web browser user enter some data
- and send e-mail to the person responsible for reading the feedback
- comments. The CGI is written in Perl and requires Sendmail/iX.
+The CPAN module now works for automatic downloading and
+installing of add-on packages:
- ------------------------------------------------------------------------
+ 1. export FTP_PASSIVE=1
+ 2. perl -MCPAN -e shell
+ 3. Ignore any terminal I/O related complaints!
+
+(http://theoryx5.uwinnipeg.ca/CPAN/data/perl/CPAN.html)
-How to Obtain Perl/iX
+=back
- 1. Download Perl using either FTP.ARPA.SYS or some other client
- 2. Extract the installation script
- 3. Edit the installation script
- 4. Run the installation script
+=back
+
+May 20, 2000
+
+=over 4
+
+=item *
+
+Updated to version 5.6.0. Builds straight out of the box on MPE/iX.
+
+=item *
+
+Perl's getpwnam() function which had regressed to being
+unimplemented on MPE is now implemented once again.
+
+=back
+
+September 17, 1999
+
+=over 4
+
+=item *
+
+Migrated from cccd.edu to bixby.org.
+
+=back
+
+=head1 Welcome
+
+This is the official home page for the HP e3000 MPE/iX
+(http://www.businessservers.hp.com/) port of the Perl scripting
+language (http://www.perl.com/) which gives you all of the power of C,
+awk, sed, and sh in a single language. Check here for the latest news,
+implemented functionality, known bugs, to-do list, etc. Status reports
+about major milestones will also be posted to the HP3000-L mailing list
+(http://www.lsoft.com/scripts/wl.exe?SL1=HP3000-L&H=RAVEN.UTC.EDU) and
+its associated gatewayed newsgroup comp.sys.hp.mpe.
+
+I'm doing this port because I can't live without Perl on the Unix
+machines that I administer, and I want to have the same power
+available to me on MPE.
+
+Please send your comments, questions, and bug reports directly to me,
+Mark Bixby (http://www.bixby.org/mark/), by e-mailing to
+mark@bixby.org. Or just post them to HP3000-L.
+
+The platform I'm using to do this port is an HP 3000 957RX running
+MPE/iX 6.0 and using the GNU gcc C compiler
+(http://jazz.external.hp.com/src/gnu/gnuframe.html).
+
+The combined porting wisdom from all of my ports can be found in my
+MPE/iX Porting Guide (http://www.bixby.org/mark/porting.html).
+
+IMPORTANT NOTICE: Yes, I do work for the HP CSY R&D lab, but ALL of
+the software you download from bixby.org is my personal freeware that
+is NOT supported by HP.
+
+=head1 System Requirements
+
+=over 4
+
+=item *
+
+MPE/iX 5.5 or later. This version of Perl/iX does NOT run on
+MPE/iX 5.0 or earlier, nor does it run on "classic" MPE/V machines.
+
+=item *
+
+If you wish to recompile Perl, you must install both GNUCORE and
+GNUGCC from jazz (http://jazz.external.hp.com/src/gnu/gnuframe.html).
+
+=item *
+
+Perl/iX will be happier on MPE/iX 5.5 if you install the MPEKX40B
+extended POSIX filename characters patch, but this is optional.
+
+=item *
+
+Patch LBCJXT6A is required on MPE/iX 5.5 machines in order to
+prevent Perl/iX from dying with an unresolved external reference
+to _getenv_libc.
+
+=item *
+
+If you will be compiling Perl/iX yourself, you will also need
+Syslog/iX (http://www.bixby.org/mark/syslogix.html) and the
+/BIND/PUB/include and /BIND/PUB/lib portions of BIND/iX
+(http://www.bixby.org/mark/bindix.html).
+
+=back
+
+=head1 How to Obtain Perl/iX
+
+=over 4
+
+=item 1.
+
+Download Perl using either FTP.ARPA.SYS or some other client
+
+=item 2.
+
+Extract the installation script
+
+=item 3.
+
+Edit the installation script
+
+=item 4.
+
+Run the installation script
+
+=item 5.
+
+Convert your *.a system archive libraries to *.sl shared libraries
+
+=back
Download Perl using FTP.ARPA.SYS from your HP 3000 (the preferred
method).....
-
-:HELLO MANAGER.SYS
-:XEQ FTP.ARPA.SYS
-open ftp.cccd.edu
-anonymous
-your@email.address
-bytestream
-cd /pub/mpe
-get perl5.005.tar.Z /tmp/perl.tar.Z
-exit
+
+ :HELLO MANAGER.SYS
+ :XEQ FTP.ARPA.SYS
+ open ftp.bixby.org
+ anonymous
+ your@email.address
+ bytestream
+ cd /pub/mpe
+ get perl-5.6.0-mpe.tar.Z /tmp/perl.tar.Z;disc=2147483647
+ exit
.....Or download using some other generic web or ftp client (the alternate
method)
-
+
Download the following files (make sure that you use "binary mode" or
whatever client feature that is 8-bit clean):
- * Perl from http://www.cccd.edu/ftp/pub/mpe/perl5.005.tar.Z or
- ftp://ftp.cccd.edu/pub/mpe/perl5.005.tar.Z
+=over 4
+
+=item *
+
+Perl from
+
+ http://www.bixby.org/ftp/pub/mpe/perl-5.6.0-mpe.tar.Z
+
+or
+
+ ftp://ftp.bixby.org/pub/mpe/perl-5.6.0-mpe.tar.Z
+
+=item *
Upload those files to your HP 3000 in an 8-bit clean bytestream manner to:
- * /tmp/perl.tar.Z
+ /tmp/perl.tar.Z
+
+=item *
Then extract the installation script (after both download methods)
+
+ :CHDIR /tmp
+ :XEQ TAR.HPBIN.SYS 'xvfopz /tmp/perl.tar.Z INSTALL'
-:CHDIR /tmp
-:XEQ TAR.HPBIN.SYS 'xvfopz /tmp/perl.tar.Z INSTALL'
+=item *
Edit the installation script
+
+Examine the accounting structure creation commands and modify if
+necessary (adding additional capabilities, choosing a non-system
+volume set, etc).
-Examine the accounting structure creation commands and modify if necessary
-(adding additional capabilities, choosing a non-system volume set, etc).
+ :XEQ VI.HPBIN.SYS /tmp/INSTALL
-:XEQ VI.HPBIN.SYS /tmp/INSTALL
-
-Run the installation script
+=item *
+Run the installation script.
+
The accounting structure will be created and then all files will be
extracted from the archive.
-:XEQ SH.HPBIN.SYS /tmp/INSTALL
-
- ------------------------------------------------------------------------
-
-Distribution Contents Highlights
-
-README
- The file you're reading now.
-INSTALL
- Perl/iX Installation script.
-PERL
- Perl NMPRG executable. A version-numbered backup copy also exists.
- You might wish to "ln -s /PERL/PUB/PERL /usr/local/bin/perl".
-lib/
- Perl libraries, both core and add-on.
-man/
- Perl man page documentation.
-public_html/feedback.cgi
- Sample feedback CGI form written in Perl.
-src/perl5.005
- Source code.
-
- ------------------------------------------------------------------------
-
-How to Compile Perl/iX
-
- 1. cd src/perl5.005
- 2. Read the INSTALL file for the official instructions
- 3. ./Configure
- 4. make
- 5. ./mpeix/relink
- 6. make test (expect 31 out of 5899 subtests to fail, mostly due to MPE
- not supporting hard links and handling exit() return codes improperly)
- 7. make install
- 8. Optionally create symbolic links that point to the Perl executable,
- i.e. ln -s /usr/local/bin/perl /PERL/PUB/PERL
+ :XEQ SH.HPBIN.SYS /tmp/INSTALL
+
+=item *
+
+Convert your *.a system archive libraries to *.sl shared libraries
+
+You only have to do this ONCE on your MPE/iX 5.5 machine in order to
+convert /lib/lib*.a and /usr/lib/lib*.a libraries to their *.sl
+equivalents. This step should not be necessary on MPE/iX 6.0 or later
+machines because the 6.0 or later update process does it for you.
+
+ :XEQ SH.HPBIN.SYS /PERL/PUB/LIBSHP3K
+
+=back
+
+=head1 Distribution Contents Highlights
+
+=over 4
+
+=item README
+
+The file you're reading now.
+
+=item INSTALL
+
+Perl/iX Installation script.
+
+=item LIBSHP3K
+
+Script to convert *.a system archive libraries to *.sl shared libraries.
+
+=item PERL
+
+Perl NMPRG executable. A version-numbered backup copy also
+exists. You might wish to "ln -s /PERL/PUB/PERL /usr/local/bin/perl".
+
+=item .cpan/
+
+Much add-on source code downloaded with the CPAN module.
+
+=item lib/
+
+Perl libraries, both core and add-on.
+
+=item man/
+
+Perl man page documentation.
+
+=item public_html/feedback.cgi
+
+Sample feedback CGI form written in Perl.
+
+=item src/perl-5.6.0-mpe
+
+Source code.
+
+=back
+
+=head1 How to Compile Perl/iX
+
+=over 4
+
+=item 1.
+
+cd src/perl-5.6.0-mpe
+
+=item 2.
+
+Read the INSTALL file for the official instructions
+
+=item 3.
+
+./Configure -d
+
+=item 4.
+
+make
+
+=item 5.
+
+./mpeix/relink
+
+=item 6.
+
+make test (expect approximately 15 out of 11306 subtests to fail,
+mostly due to MPE not supporting hard links, UDP socket problems,
+and handling exit() return codes improperly)
+
+=item 7.
+
+make install
+
+=item 8.
+
+Optionally create symbolic links that point to the Perl
+executable, i.e. ln -s /PERL/PUB/PERL /usr/local/bin/perl
+
+=back
The summary test results from "cd t; ./perl -I../lib harness":
-Failed Test Status Wstat Total Fail Failed List of failed
--------------------------------------------------------------------------------
-io/fs.t 26 8 30.77% 2-5, 7-9, 11
-io/pipe.t 12 2 16.67% 11-12
-lib/posix.t 18 1 5.56% 12
-op/die_exit.t 16 16 100.00% 1-16
-op/exec.t 8 2 25.00% 5-6
-op/stat.t 58 2 3.45% 3, 35
-Failed 6/183 test scripts, 96.72% okay. 31/5899 subtests failed, 99.47% okay.
-
- ------------------------------------------------------------------------
-
-Getting Started with Perl/iX
-
-Create your Perl script files with "#!/PERL/PUB/perl" (or an equivalent
-symbolic link) as the first line. Use the chmod command to make sure that
-your script has execute permission. Run your script!
-
-If you want to use Perl to write web server CGI scripts, obtain and install
-CGI.pm. Build CGI.pm and all other add-on modules below /PERL/PUB/src/.
-
-Be sure to take a look at the CPAN module list. A wide variety of free Perl
-software is available.
-
- ------------------------------------------------------------------------
-
-MPE/iX Implementation Considerations
-
-There some minor functionality issues to be aware of when comparing Perl
-for Unix (Perl/UX) to Perl/iX:
-
- * MPE gcc/ld doesn't properly support linking NMPRG executables against
- NMXL dynamic libraries, so you must manually run mpeix/relink after
- each re-build of Perl.
- * Perl/iX File::Copy will use MPE's /bin/cp command to copy files by
- name in order to preserve file attributes like file code.
- * MPE (and thus Perl/iX) lacks support for setgrent(), endgrent(),
- setpwent(), endpwent().
- * MPE (and thus Perl/iX) lacks support for hard links.
- * MPE requires GETPRIVMODE() in order to bind() to ports less than
- 1024. Perl/iX will call GETPRIVMODE() automatically on your behalf if
- you attempt to bind() to these low-numbered ports. Note that the
- Perl/iX executable and the PERL account do not normally have CAP=PM,
- so if you will be bind()-ing to these privileged ports, you will
- manually need to add PM capability as appropriate.
- * MPE requires that you bind() to an IP address of zero. Perl/iX
- automatically replaces the IP address that you pass to bind() with a
- zero.
- * If you use Perl/iX fcntl() against a socket it will fail, because MPE
- requires that you use sfcntl() instead. Perl/iX does not presently
- support sfcntl().
- * MPE requires GETPRIVMODE() in order to setuid(). There are too many
- calls to setuid() within Perl/iX, so I have not attempted an automatic
- GETPRIVMODE() solution similar to bind().
-
- ------------------------------------------------------------------------
-
-Known Bugs Under Investigation
-
- * None
-
- ------------------------------------------------------------------------
-
-To-Do List
-
- * Make setuid()/setgid() support work.
- * Make sure that fcntl() against a socket descriptor is redirected to
- sfcntl().
- * Add support for Berkeley DB once I've finished porting Berkeley DB.
- * Write an MPE XS extension library containing miscellaneous important
- MPE functions like GETPRIVMODE(), GETUSERMODE(), and sfcntl().
-
- ------------------------------------------------------------------------
-
-Change History
-
- * October 16, 1997
- o Added Demos section to the Perl/iX home page so you can see some
- sample Perl applications running on my 3000.
- * October 3, 1997
- o Added System Requirements section to the Perl/iX home page just
- so the prerequisites stand out more. Various other home page
- tweaks.
- * October 2, 1997
- o Initial public release.
- * September 1997
- o Porting begins.
-
- ------------------------------------------------------------------------
-
-Mark Bixby, markb@cccd.edu
+ Failed Test Status Wstat Total Fail Failed List of failed
+ ---------------------------------------------------------------------------
+ io/fs.t 29 8 27.59% 2-5, 7-9, 11
+ io/openpid.t 10 1 10.00% 7
+ lib/io_sock.t 14 1 7.14% 13
+ lib/io_udp.t 7 2 28.57% 3, 5
+ lib/posix.t 27 1 3.70% 12
+ op/lex_assign.t 187 1 0.53% 13
+ op/stat.t 58 1 1.72% 3
+ 15 tests and 94 subtests skipped.
+ Failed 7/236 test scripts, 97.03% okay. 15/11306 subtests failed, 99.87% okay.
+
+=head1 Getting Started with Perl/iX
+
+Create your Perl script files with "#!/PERL/PUB/perl" (or an
+equivalent symbolic link) as the first line. Use the chmod command to
+make sure that your script has execute permission. Run your script!
+
+Be sure to take a look at the CPAN module list
+(http://www.cpan.org/CPAN.html). A wide variety of free Perl software
+is available. You can automatically download these packages by using
+the CPAN module (http://theoryx5.uwinnipeg.ca/CPAN/data/perl/CPAN.html).
+
+=head1 MPE/iX Implementation Considerations
+
+There some minor functionality issues to be aware of when comparing
+Perl for Unix (Perl/UX) to Perl/iX:
+
+=over 4
+
+=item *
+
+MPE gcc/ld doesn't properly support linking NMPRG executables against
+NMXL dynamic libraries, so you must manually run mpeix/relink after
+each re-build of Perl.
+
+=item *
+
+Perl/iX File::Copy will use MPE's /bin/cp command to copy files by
+name in order to preserve file attributes like file code.
+
+=item *
+
+MPE (and thus Perl/iX) lacks support for setgrent(), endgrent(),
+setpwent(), endpwent().
+
+=item *
+
+MPE (and thus Perl/iX) lacks support for hard links.
+
+=item *
+
+MPE requires GETPRIVMODE() in order to bind() to ports less than 1024.
+Perl/iX will call GETPRIVMODE() automatically on your behalf if you
+attempt to bind() to these low-numbered ports. Note that the Perl/iX
+executable and the PERL account do not normally have CAP=PM, so if you
+will be bind()-ing to these privileged ports, you will manually need
+to add PM capability as appropriate.
+
+=item *
+
+MPE requires that you bind() to an IP address of zero. Perl/iX
+automatically replaces the IP address that you pass to bind() with
+a zero.
+
+=item *
+
+If you use Perl/iX fcntl() against a socket it will fail, because MPE
+requires that you use sfcntl() instead. Perl/iX does not presently
+support sfcntl().
+
+=item *
+
+MPE requires GETPRIVMODE() in order to setuid(). There are too many
+calls to setuid() within Perl/iX, so I have not attempted an automatic
+GETPRIVMODE() solution similar to bind().
+
+=back
+
+=head1 Known Bugs Under Investigation
+
+None.
+
+=head1 To-Do List
+
+=over 4
+
+=item *
+
+Make setuid()/setgid() support work.
+
+=item *
+
+Make sure that fcntl() against a socket descriptor is redirected to sfcntl().
+
+=item *
+
+Add support for Berkeley DB once I've finished porting Berkeley DB.
+
+=item *
+
+Write an MPE XS extension library containing miscellaneous important
+MPE functions like GETPRIVMODE(), GETUSERMODE(), and sfcntl().
+
+=back
+
+=head1 Change History
+
+May 6, 1999
+
+=over 4
+
+=item *
+
+Patch LBCJXT6A is required on MPE/iX 5.5 machines in order to prevent
+Perl/iX from dying with an unresolved external reference to _getenv_libc.
+
+=back
+
+April 7, 1999
+
+=over 4
+
+=item *
+
+Updated to version 5.005_03.
+
+=item *
+
+The official source distribution once again compiles "straight out
+of the box" for MPE.
+
+=item *
+
+The current incarnation of the 5.5 POSIX filename extended
+characters patch is now MPEKX40B.
+
+=item *
+
+The LIBSHP3K *.a -> *.sl library conversion script is now included
+as /PERL/PUB/LIBSHP3K.
+
+=back
+
+November 20, 1998
+
+=over 4
+
+=item *
+
+Updated to version 5.005_02.
+
+=item *
+
+Fixed a DynaLoader bug that was unable to load symbols from relative
+path name libraries.
+
+=item *
+
+Fixed a .xs compilation bug where the mpeixish.sh include file wasn't
+being installed into the proper directory.
+
+=item *
+
+All bugfixes will be submitted back to the official Perl developers.
+
+=item *
+
+The current incarnation of the POSIX filename extended characters
+patch is now MPEKXJ3A.
+
+=back
+
+August 14, 1998
+
+=over 4
+
+=item *
+
+The previous POSIX filename extended characters patch MPEKX44C has
+been superseded by MPEKXB5A.
+
+=back
+
+August 7, 1998
+
+=over 4
+
+=item *
+
+The previous POSIX filename extended characters patch MPEKX76A has
+been superseded by MPEKX44C.
+
+=over 4
+
+=back
+
+July 28, 1998
+
+=item *
+
+Updated to version 5.005_01.
+
+=back
+
+July 23, 1998
+
+=over 4
+
+=item *
+
+Updated to version 5.005 (production release). The public
+freeware sources are now 100% MPE-ready "straight out of the box".
+
+=back
+
+July 17, 1998
+
+=over 4
+
+=item *
+
+Updated to version 5.005b1 (public beta release). The public
+freeware sources are now 99.9% MPE-ready. By installing and
+testing this beta on your own HP3000, you will be helping to
+insure that the final release of 5.005 will be 100% MPE-ready and
+100% bug free.
+
+=item *
+
+My MPE binary release is now extracted using my standard INSTALL script.
+
+=back
+
+July 15, 1998
+
+=over 4
+
+=item *
+
+Changed startperl to #!/PERL/PUB/perl so that Perl will recognize
+scripts more easily and efficiently.
+
+=back
+
+July 8, 1998
+
+=over 4
+
+=item *
+
+Updated to version 5.004_70 (internal developer release) which is now
+MPE-ready. The next public freeware release of Perl should compile
+"straight out of the box" on MPE. Note that this version of Perl/iX
+was strictly internal to me and never publicly released. Note that
+[21]BIND/iX is now required (well, the include files and libbind.a) if
+you wish to compile Perl/iX.
+
+=back
+
+November 6, 1997
+
+=over 4
+
+=item *
+
+Updated to version 5.004_04. No changes in MPE-specific functionality.
+
+=back
+
+October 16, 1997
+
+=over 4
+
+=item *
+
+Added Demos section to the Perl/iX home page so you can see some
+sample Perl applications running on my 3000.
+
+=back
+
+October 3, 1997
+
+=over 4
+
+=item *
+
+Added System Requirements section to the Perl/iX home page just so the
+prerequisites stand out more. Various other home page tweaks.
+
+=back
+
+October 2, 1997
+
+=over 4
+
+=item *
+
+Initial public release.
+
+=back
+
+September 1997
+
+=over 4
+
+=item *
+
+Porting begins.
+
+=back
+
+=head1 Author
+
+Mark Bixby, mark@bixby.org
+
diff --git a/gnu/usr.bin/perl/README.os390 b/gnu/usr.bin/perl/README.os390
index 5fcdfc01216..61a97096c3f 100644
--- a/gnu/usr.bin/perl/README.os390
+++ b/gnu/usr.bin/perl/README.os390
@@ -1,5 +1,6 @@
+
This document is written in pod format hence there are punctuation
-characters in in odd places. Do not worry, you've apparently got
+characters in odd places. Do not worry, you've apparently got
the ASCII->EBCDIC translation worked out correctly. You can read
more about pod in pod/perlpod.pod or the short summary in the
INSTALL file.
@@ -15,12 +16,12 @@ on OS/390 Unix System Services.
=head1 DESCRIPTION
-This is a fully ported perl for OS/390 Release 3, 5 and 6.
-It may work on other versions, but those are the ones we've
-tested it on.
+This is a fully ported Perl for OS/390 Version 2 Release 3, 5, 6, 7,
+8, and 9. It may work on other versions or releases, but those are
+the ones we've tested it on.
You may need to carry out some system configuration tasks before
-running the Configure script for perl.
+running the Configure script for Perl.
=head2 Unpacking
@@ -41,12 +42,51 @@ parser template files. If you have not already done so then be sure to:
This may also be a good time to ensure that your /etc/protocol file
and either your /etc/resolv.conf or /etc/hosts files are in place.
+The IBM document that described such USS system setup issues was
+SC28-1890-07 "OS/390 UNIX System Services Planning", in particular
+Chapter 6 on customizing the OE shell.
-GNU make for OS/390, which may be required for the build of perl,
-is available from:
+GNU make for OS/390, which is recommended for the build of perl (as well as
+building CPAN modules and extensions), is available from:
http://www.mks.com/s390/gnu/index.htm
+Some people have reported encountering "Out of memory!" errors while
+trying to build Perl using GNU make binaries. If you encounter such
+trouble then try to download the source code kit and build GNU make
+from source to eliminate any such trouble. You might also find GNU make
+(as well as Perl and Apache) in the red-piece/book "Open Source Software
+for OS/390 UNIX", SG24-5944-00 from IBM.
+
+If instead of the recommended GNU make you would like to use the system
+supplied make program then be sure to install the default rules file
+properly via the shell command:
+
+ cp /samples/startup.mk /etc
+
+and be sure to also set the environment variable _C89_CCMODE=1 (exporting
+_C89_CCMODE=1 is also a good idea for users of GNU make).
+
+You might also want to have GNU groff for OS/390 installed before
+running the `make install` step for Perl.
+
+There is a syntax error in the /usr/include/sys/socket.h header file
+that IBM supplies with USS V2R7, V2R8, and possibly V2R9. The problem with
+the header file is that near the definition of the SO_REUSEPORT constant
+there is a spurious extra '/' character outside of a comment like so:
+
+ #define SO_REUSEPORT 0x0200 /* allow local address & port
+ reuse */ /
+
+You could edit that header yourself to remove that last '/', or you might
+note that Language Environment (LE) APAR PQ39997 describes the problem
+and PTF's UQ46272 and UQ46271 are the (R8 at least) fixes and apply them.
+If left unattended that syntax error will turn up as an inability for Perl
+to build its "Socket" extension.
+
+For successful testing you may need to turn on the sticky bit for your
+world readable /tmp directory if you have not already done so (see man chmod).
+
=head2 Configure
Once you've unpacked the distribution, run "sh Configure" (see INSTALL
@@ -58,25 +98,46 @@ to watch out for include:
=item *
+A message of the form:
+
+ (I see you are using the Korn shell. Some ksh's blow up on Configure,
+ mainly on older exotic systems. If yours does, try the Bourne shell instead.)
+
+is nothing to worry about at all.
+
+=item *
+
Some of the parser default template files in /samples are needed in /etc.
In particular be sure that you at least copy /samples/yyparse.c to /etc
-before running perl's Configure. This step ensures successful extraction
-of EBCDIC versions of parser files such as perly.c.
+before running Perl's Configure. This step ensures successful extraction
+of EBCDIC versions of parser files such as perly.c, perly.h, and x2p/a2p.c.
+This has to be done before running Configure the first time. If you failed
+to do so then the easiest way to re-Configure Perl is to delete your
+misconfigured build root and re-extract the source from the tar ball.
+Then you must ensure that /etc/yyparse.c is properly in place before
+attempting to re-run Configure.
=item *
-This port doesn't support dynamic loading. Although
-OS/390 has support for DLLs, there are some differences
-that cause problems for perl.
+This port will support dynamic loading, but it is not selected by
+default. If you would like to experiment with dynamic loading then
+be sure to specify -Dusedl in the arguments to the Configure script.
+See the comments in hints/os390.sh for more information on dynamic loading.
+If you build with dynamic loading then you will need to add the
+$archlibexp/CORE directory to your LIBPATH environment variable in order
+for perl to work. See the config.sh file for the value of $archlibexp.
+If in trying to use Perl you see an error message similar to:
-=item *
+ CEE3501S The module libperl.dll was not found.
+ From entry point __dllstaticinit at compile unit offset +00000194 at
-You may see a "WHOA THERE!!!" message for $d_shmatprototype
-it is OK to keep the recommended "define".
+then your LIBPATH does not have the location of libperl.x and either
+libperl.dll or libperl.so in it. Add that directory to your LIBPATH and
+proceed.
=item *
-Don't turn on the compiler optimization flag "-O". There's
+Do not turn on the compiler optimization flag "-O". There is
a bug in either the optimizer or perl that causes perl to
not work correctly when the optimizer is on.
@@ -85,10 +146,13 @@ not work correctly when the optimizer is on.
Some of the configuration files in /etc used by the
networking APIs are either missing or have the wrong
names. In particular, make sure that there's either
-an /etc/resolv.conf or and /etc/hosts, so that
+an /etc/resolv.conf or an /etc/hosts, so that
gethostbyname() works, and make sure that the file
/etc/proto has been renamed to /etc/protocol (NOT
/etc/protocols, as used by other Unix systems).
+You may have to look for things like HOSTNAME and DOMAINORIGIN
+in the "//'SYS1.TCPPARMS(TCPDATA)'" PDS member in order to
+properly set up your /etc networking files.
=back
@@ -100,7 +164,7 @@ Simply put:
make
make test
-if everything looks ok then:
+if everything looks ok (see the next section for test/IVP diagnosis) then:
make install
@@ -108,51 +172,235 @@ this last step may or may not require UID=0 privileges depending
on how you answered the questions that Configure asked and whether
or not you have write access to the directories you specified.
+=head2 build anomalies
+
+"Out of memory!" messages during the build of Perl are most often fixed
+by re building the GNU make utility for OS/390 from a source code kit.
+
+Another memory limiting item to check is your MAXASSIZE parameter in your
+'SYS1.PARMLIB(BPXPRMxx)' data set (note too that as of V2R8 address space
+limits can be set on a per user ID basis in the USS segment of a RACF
+profile). People have reported successful builds of Perl with MAXASSIZE
+parameters as small as 503316480 (and it may be possible to build Perl
+with a MAXASSIZE smaller than that).
+
+Within USS your /etc/profile or $HOME/.profile may limit your ulimit
+settings. Check that the following command returns reasonable values:
+
+ ulimit -a
+
+To conserve memory you should have your compiler modules loaded into the
+Link Pack Area (LPA/ELPA) rather than in a link list or step lib.
+
+If the c89 compiler complains of syntax errors during the build of the
+Socket extension then be sure to fix the syntax error in the system
+header /usr/include/sys/socket.h.
+
+=head2 testing anomalies
+
+The `make test` step runs a Perl Verification Procedure, usually before
+installation. You might encounter STDERR messages even during a successful
+run of `make test`. Here is a guide to some of the more commonly seen
+anomalies:
+
+=over 4
+
+=item *
+
+A message of the form:
+
+ comp/cpp.............ERROR CBC3191 ./.301989890.c:1 The character $ is not a
+ valid C source character.
+ FSUM3065 The COMPILE step ended with return code 12.
+ FSUM3017 Could not compile .301989890.c. Correct the errors and try again.
+ ok
+
+indicates that the t/comp/cpp.t test of Perl's -P command line switch has
+passed but that the particular invocation of c89 -E in the cpp script does
+not suppress the C compiler check of source code validity.
+
+=item *
+
+A message of the form:
+
+ io/openpid...........CEE5210S The signal SIGHUP was received.
+ CEE5210S The signal SIGHUP was received.
+ CEE5210S The signal SIGHUP was received.
+ ok
+
+indicates that the t/io/openpid.t test of Perl has passed but done so
+with extraneous messages on stderr from CEE.
+
+=item *
+
+A message of the form:
+
+ lib/ftmp-security....File::Temp::_gettemp: Parent directory (/tmp/) is not safe
+ (sticky bit not set when world writable?) at lib/ftmp-security.t line 100
+ File::Temp::_gettemp: Parent directory (/tmp/) is not safe (sticky bit not
+ set when world writable?) at lib/ftmp-security.t line 100
+ ok
+
+indicates a problem with the permissions on your /tmp directory within the HFS.
+To correct that problem issue the command:
+
+ chmod a+t /tmp
+
+from an account with write access to the directory entry for /tmp.
+
+=back
+
+=head2 installation anomalies
+
+The installman script will try to run on OS/390. There will be fewer errors
+if you have a roff utility installed. You can obtain GNU groff from the
+Redbook SG24-5944-00 ftp site.
+
=head2 Usage Hints
When using perl on OS/390 please keep in mind that the EBCDIC and ASCII
-character sets are different. Perl builtin functions that may behave
-differently under EBCDIC are mentioned in the perlport.pod document.
+character sets are different. See perlebcdic.pod for more on such character
+set issues. Perl builtin functions that may behave differently under
+EBCDIC are also mentioned in the perlport.pod document.
-OpenEdition (UNIX System Services) does not (yet) support the #! means
-of script invokation.
-See:
+Open Edition (UNIX System Services) from V2R8 onward does support
+#!/path/to/perl script invocation. There is a PTF available from
+IBM for V2R7 that will allow shell/kernel support for #!. USS
+releases prior to V2R7 did not support the #! means of script invocation.
+If you are running V2R6 or earlier then see:
head `whence perldoc`
for an example of how to use the "eval exec" trick to ask the shell to
-have perl run your scripts for you.
+have Perl run your scripts on those older releases of Unix System Services.
+
+If you are having trouble with square brackets then consider switching your
+rlogin or telnet client. Try to avoid older 3270 emulators and ISHELL for
+working with Perl on USS.
+
+=head2 Floating point anomalies
+
+There appears to be a bug in the floating point implementation on S/390
+systems such that calling int() on the product of a number and a small
+magnitude number is not the same as calling int() on the quotient of
+that number and a large magnitude number. For example, in the following
+Perl code:
+
+ my $x = 100000.0;
+ my $y = int($x * 1e-5) * 1e5; # '0'
+ my $z = int($x / 1e+5) * 1e5; # '100000'
+ print "\$y is $y and \$z is $z\n"; # $y is 0 and $z is 100000
+
+Although one would expect the quantities $y and $z to be the same and equal
+to 100000 they will differ and instead will be 0 and 100000 respectively.
+
+The problem can be further examined in a roughly equivalent C program:
+
+ #include <stdio.h>
+ #include <math.h>
+ main()
+ {
+ double r1,r2;
+ double x = 100000.0;
+ double y = 0.0;
+ double z = 0.0;
+ x = 100000.0 * 1e-5;
+ r1 = modf (x,&y);
+ x = 100000.0 / 1e+5;
+ r2 = modf (x,&z);
+ printf("y is %e and z is %e\n",y*1e5,z*1e5);
+ /* y is 0.000000e+00 and z is 1.000000e+05 (with c89) */
+ }
+
+=head2 Modules and Extensions
+
+Pure pure (that is non xs) modules may be installed via the usual:
+
+ perl Makefile.PL
+ make
+ make test
+ make install
-=head2 Extensions
+If you built perl with dynamic loading capability then that would also
+be the way to build xs based extensions. However, if you built perl with
+the default static linking you can still build xs based extensions for OS/390
+but you will need to follow the instructions in ExtUtils::MakeMaker for
+building statically linked perl binaries. In the simplest configurations
+building a static perl + xs extension boils down to:
-You can build xs based extensions to Perl for OS/390 but will need to
-follow the instructions in ExtUtils::MakeMaker for building statically
-linked perl binaries. In most cases people have reported better
-results with GNU make rather than the system's /bin/make.
+ perl Makefile.PL
+ make
+ make perl
+ make test
+ make install
+ make -f Makefile.aperl inst_perl MAP_TARGET=perl
+
+In most cases people have reported better results with GNU make rather
+than the system's /bin/make program, whether for plain modules or for
+xs based extensions.
+
+If the make process encounters trouble with either compilation or
+linking then try setting the _C89_CCMODE to 1. Assuming sh is your
+login shell then run:
+
+ export _C89_CCMODE=1
+
+If tcsh is your login shell then use the setenv command.
=head1 AUTHORS
-David Fiander and Peter Prymmer.
+David Fiander and Peter Prymmer with thanks to Dennis Longnecker
+and William Raffloer for valuable reports, LPAR and PTF feedback.
+Thanks to Mike MacIsaac and Egon Terwedow for SG24-5944-00.
+Thanks to Ignasi Roca for pointing out the floating point problems.
+Thanks to John Goodyear for dynamic loading help.
=head1 SEE ALSO
-L<INSTALL>, L<perlport>, L<ExtUtils::MakeMaker>.
+L<INSTALL>, L<perlport>, L<perlebcdic>, L<ExtUtils::MakeMaker>.
+
+ http://www.mks.com/s390/gnu/index.htm
+
+ http://www.redbooks.ibm.com/abstracts/sg245944.html
+
+ http://www.s390.ibm.com/products/oe/bpxa1ty1.html#opensrc
+
+ http://www.s390.ibm.com/products/oe/portbk/bpxacenv.html
+
+ http://www.xray.mpe.mpg.de/mailing-lists/perl-mvs/
=head2 Mailing list
The Perl Institute (http://www.perl.org/) maintains a perl-mvs
mailing list of interest to all folks building and/or
-using perl on EBCDIC platforms. To subscibe, send a message of:
+using perl on all EBCDIC platforms (not just OS/390).
+To subscribe, send a message of:
subscribe perl-mvs
-to majordomo@perl.org.
+to majordomo@perl.org. See also:
+
+ http://lists.perl.org/showlist.cgi?name=perl-mvs
+
+There are web archives of the mailing list at:
+
+ http://www.xray.mpe.mpg.de/mailing-lists/perl-mvs/
+ http://archive.develooper.com/perl-mvs@perl.org/
=head1 HISTORY
This document was originally written by David Fiander for the 5.005
release of Perl.
-This document was podified for the 5.005_03 release of perl 11 March 1999.
+This document was podified for the 5.005_03 release of Perl 11 March 1999.
+
+Updated 12 November 2000 for the 5.7.1 release of Perl.
+
+Updated 15 January 2001 for the 5.7.1 release of Perl.
+
+Updated 24 January 2001 to mention dynamic loading.
+
+Updated 12 March 2001 to mention //'SYS1.TCPPARMS(TCPDATA)'.
=cut
+
diff --git a/gnu/usr.bin/perl/README.solaris b/gnu/usr.bin/perl/README.solaris
new file mode 100644
index 00000000000..86b7d9b48c9
--- /dev/null
+++ b/gnu/usr.bin/perl/README.solaris
@@ -0,0 +1,526 @@
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see pod/perlpod.pod) which is
+specifically designed to be readable as is.
+
+=head1 NAME
+
+README.solaris - Perl version 5 on Solaris systems
+
+=head1 DESCRIPTION
+
+This document describes various features of Sun's Solaris operating system
+that will affect how Perl version 5 (hereafter just perl) is
+compiled and/or runs. Some issues relating to the older SunOS 4.x are
+also discussed, though they may be out of date.
+
+For the most part, everything should just work.
+
+Starting with Solaris 8, perl5.00503 (or higher) is supplied with the
+operating system, so you might not even need to build a newer version
+of perl at all. The Sun-supplied version is installed in /usr/perl5
+with /usr/bin/perl pointing to /usr/perl5/bin/perl. Do not disturb
+that installation unless you really know what you are doing. If you
+remove the perl supplied with the OS, there is a good chance you will
+render some bits of your system inoperable. If you wish to install a
+newer version of perl, install it under a different prefix from
+/usr/perl5. Common prefixes to use are /usr/local and /opt/perl.
+
+You may wish to put your version of perl in the PATH of all users by
+changing the link /usr/bin/perl. This is OK, as all Perl scripts
+shipped with Solaris use /usr/perl5/bin/perl.
+
+=head2 Solaris Version Numbers.
+
+For consistency with common usage, perl's Configure script performs
+some minor manipulations on the operating system name and version
+number as reported by uname. Here's a partial translation table:
+
+ Sun: perl's Configure:
+ uname uname -r Name osname osvers
+ SunOS 4.1.3 Solaris 1.1 sunos 4.1.3
+ SunOS 5.6 Solaris 2.6 solaris 2.6
+ SunOS 5.8 Solaris 8 solaris 2.8
+
+The complete table can be found in the Sun Managers' FAQ
+L<ftp://ftp.cs.toronto.edu/pub/jdd/sun-managers/faq> under
+"9.1) Which Sun models run which versions of SunOS?".
+
+=head1 RESOURCES
+
+There are many, many source for Solaris information. A few of the
+important ones for perl:
+
+=over 4
+
+=item Solaris FAQ
+
+The Solaris FAQ is available at
+L<http://www.science.uva.nl/pub/solaris/solaris2.html>.
+
+The Sun Managers' FAQ is available at
+L<ftp://ftp.cs.toronto.edu/pub/jdd/sun-managers/faq>
+
+=item Precompiled Binaries
+
+Precompiled binaries, links to many sites, and much, much more is
+available at L<http://www.sunfreeware.com>.
+
+=item Solaris Documentation
+
+All Solaris documentation is available on-line at L<http://docs.sun.com>.
+
+=back
+
+=head1 SETTING UP
+
+=head2 File Extraction Problems.
+
+Be sure to use a tar program compiled under Solaris (not SunOS 4.x)
+to extract the perl-5.x.x.tar.gz file. Do not use GNU tar compiled
+for SunOS4 on Solaris. (GNU tar compiled for Solaris should be fine.)
+When you run SunOS4 binaries on Solaris, the run-time system magically
+alters pathnames matching m#lib/locale# so that when tar tries to create
+lib/locale.pm, a file named lib/oldlocale.pm gets created instead.
+If you found this advice it too late and used a SunOS4-compiled tar
+anyway, you must find the incorrectly renamed file and move it back
+to lib/locale.pm.
+
+=head2 Compiler and Related Tools.
+
+You must use an ANSI C compiler to build perl. Perl can be compiled
+with either Sun's add-on C compiler or with gcc. The C compiler that
+shipped with SunOS4 will not do.
+
+=head3 Include /usr/ccs/bin/ in your PATH.
+
+Several tools needed to build perl are located in /usr/ccs/bin/: ar,
+as, ld, and make. Make sure that /usr/ccs/bin/ is in your PATH.
+
+You need to make sure the following packages are installed
+(this info is extracted from the Solaris FAQ):
+
+for tools (sccs, lex, yacc, make, nm, truss, ld, as): SUNWbtool,
+SUNWsprot, SUNWtoo
+
+for libraries & headers: SUNWhea, SUNWarc, SUNWlibm, SUNWlibms, SUNWdfbh,
+SUNWcg6h, SUNWxwinc, SUNWolinc
+
+for 64 bit development: SUNWarcx, SUNWbtoox, SUNWdplx, SUNWscpux,
+SUNWsprox, SUNWtoox, SUNWlmsx, SUNWlmx, SUNWlibCx
+
+If you are in doubt which package contains a file you are missing,
+try to find an installation that has that file. Then do a
+
+ grep /my/missing/file /var/sadm/install/contents
+
+This will display a line like this:
+
+/usr/include/sys/errno.h f none 0644 root bin 7471 37605 956241356 SUNWhea
+
+The last item listed (SUNWhea in this example) is the package you need.
+
+=head3 Avoid /usr/ucb/cc.
+
+You don't need to have /usr/ucb/ in your PATH to build perl. If you
+want /usr/ucb/ in your PATH anyway, make sure that /usr/ucb/ is NOT
+in your PATH before the directory containing the right C compiler.
+
+=head3 Sun's C Compiler
+
+If you use Sun's C compiler, make sure the correct directory
+(usually /opt/SUNWspro/bin/) is in your PATH (before /usr/ucb/).
+
+=head3 GCC
+
+If you use gcc, make sure your installation is recent and
+complete. As a point of reference, perl-5.6.0 built fine with
+gcc-2.8.1 on both Solaris 2.6 and Solaris 8. You'll be able to
+Configure perl with
+
+ sh Configure -Dcc=gcc
+
+If you have updated your Solaris version, you may also have to update
+your GCC. For example, if you are running Solaris 2.6 and your gcc is
+installed under /usr/local, check in /usr/local/lib/gcc-lib and make
+sure you have the appropriate directory, sparc-sun-solaris2.6/ or
+i386-pc-solaris2.6/. If gcc's directory is for a different version of
+Solaris than you are running, then you will need to rebuild gcc for
+your new version of Solaris.
+
+You can get a precompiled version of gcc from
+L<http://www.sunfreeware.com/>. Make sure you pick up the package for
+your Solaris release.
+
+=head3 GNU as and GNU ld
+
+The versions of as and ld supplied with Solaris work fine for building
+perl. There is normally no need to install the GNU versions.
+
+If you decide to ignore this advice and use the GNU versions anyway,
+then be sure that they are relatively recent. Versions newer than 2.7
+are apparently new enough. Older versions may have trouble with
+dynamic loading.
+
+If your gcc is configured to use GNU as and ld but you want to use the
+Solaris ones instead to build perl, then you'll need to add
+-B/usr/ccs/bin/ to the gcc command line. One convenient way to do
+that is with
+
+ sh Configure -Dcc='gcc -B/usr/ccs/bin/'
+
+Note that the trailing slash is required. This will result in some
+harmless warnings as Configure is run:
+
+ gcc: file path prefix `/usr/ccs/bin/' never used
+
+These messages may safely be ignored.
+(Note that for a SunOS4 system, you must use -B/bin/ instead.)
+
+Alternatively, you can use the GCC_EXEC_PREFIX environment variable to
+ensure that Sun's as and ld are used. Consult your gcc documentation
+for further information on the -B option and the GCC_EXEC_PREFIX variable.
+
+=head3 GNU make
+
+Sun's make works fine for building perl.
+If you wish to use GNU make anyway, be sure that the set-group-id bit is not
+set. If it is, then arrange your PATH so that /usr/ccs/bin/make is
+before GNU make or else have the system administrator disable the
+set-group-id bit on GNU make.
+
+=head3 Avoid libucb.
+
+Solaris provides some BSD-compatibility functions in /usr/ucblib/libucb.a.
+Perl will not build and run correctly if linked against -lucb since it
+contains routines that are incompatible with the standard Solaris libc.
+Normally this is not a problem since the solaris hints file prevents
+Configure from even looking in /usr/ucblib for libraries, and also
+explicitly omits -lucb.
+
+=head2 Environment
+
+=head3 PATH
+
+Make sure your PATH includes the compiler (/opt/SUNWspro/bin/ if you're
+using Sun's compiler) as well as /usr/ccs/bin/ to pick up the other
+development tools (such as make, ar, as, and ld). Make sure your path
+either doesn't include /usr/ucb or that it includes it after the
+compiler and compiler tools and other standard Solaris directories.
+You definitely don't want /usr/ucb/cc.
+
+=head3 LD_LIBRARY_PATH
+
+If you have the LD_LIBRARY_PATH environment variable set, be sure that
+it does NOT include /lib or /usr/lib. If you will be building
+extensions that call third-party shared libraries (e.g. Berkeley DB)
+then make sure that your LD_LIBRARY_PATH environment variable includes
+the directory with that library (e.g. /usr/local/lib).
+
+If you get an error message
+
+ dlopen: stub interception failed
+
+it is probably because your LD_LIBRARY_PATH environment variable
+includes a directory which is a symlink to /usr/lib (such as /lib).
+The reason this causes a problem is quite subtle. The file
+libdl.so.1.0 actually *only* contains functions which generate 'stub
+interception failed' errors! The runtime linker intercepts links to
+"/usr/lib/libdl.so.1.0" and links in internal implementations of those
+functions instead. [Thanks to Tim Bunce for this explanation.]
+
+=head1 RUN CONFIGURE.
+
+See the INSTALL file for general information regarding Configure.
+Only Solaris-specific issues are discussed here. Usually, the
+defaults should be fine.
+
+=head2 64-bit Issues.
+
+See the INSTALL file for general information regarding 64-bit compiles.
+In general, the defaults should be fine for most people.
+
+By default, perl-5.6.0 (or later) is compiled as a 32-bit application
+with largefile and long-long support.
+
+=head3 General 32-bit vs. 64-bit issues.
+
+Solaris 7 and above will run in either 32 bit or 64 bit mode on SPARC
+CPUs, via a reboot. You can build 64 bit apps whilst running 32 bit
+mode and vice-versa. 32 bit apps will run under Solaris running in
+either 32 or 64 bit mode. 64 bit apps require Solaris to be running
+64 bit mode.
+
+Existing 32 bit apps are properly known as LP32, i.e. Longs and
+Pointers are 32 bit. 64-bit apps are more properly known as LP64.
+The discriminating feature of a LP64 bit app is its ability to utilise a
+64-bit address space. It is perfectly possible to have a LP32 bit app
+that supports both 64-bit integers (long long) and largefiles (> 2GB),
+and this is the default for perl-5.6.0.
+
+For a more complete explanation of 64-bit issues, see the Solaris 64-bit
+Developer's Guide at http://docs.sun.com:80/ab2/coll.45.13/SOL64TRANS/
+
+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
+
+By default, perl will be compiled as a 32-bit application. Unless you
+want to allocate more than ~ 4GB of memory inside Perl, you probably
+don't need Perl to be a 64-bit app.
+
+=head3 Large File Suppprt
+
+For Solaris 2.6 and onwards, there are two different ways for 32-bit
+applications to manipulate large files (files whose size is > 2GByte).
+(A 64-bit application automatically has largefile support built in
+by default.)
+
+First is the "transitional compilation environment", described in
+lfcompile64(5). According to the man page,
+
+ The transitional compilation environment exports all the
+ explicit 64-bit functions (xxx64()) and types in addition to
+ all the regular functions (xxx()) and types. Both xxx() and
+ xxx64() functions are available to the program source. A
+ 32-bit application must use the xxx64() functions in order
+ to access large files. See the lf64(5) manual page for a
+ complete listing of the 64-bit transitional interfaces.
+
+The transitional compilation environment is obtained with the
+following compiler and linker flags:
+
+ getconf LFS64_CFLAGS -D_LARGEFILE64_SOURCE
+ getconf LFS64_LDFLAG # nothing special needed
+ getconf LFS64_LIBS # nothing special needed
+
+Second is the "large file compilation environment", described in
+lfcompile(5). According to the man page,
+
+ Each interface named xxx() that needs to access 64-bit entities
+ to access large files maps to a xxx64() call in the
+ resulting binary. All relevant data types are defined to be
+ of correct size (for example, off_t has a typedef definition
+ for a 64-bit entity).
+
+ An application compiled in this environment is able to use
+ the xxx() source interfaces to access both large and small
+ files, rather than having to explicitly utilize the transitional
+ xxx64() interface calls to access large files.
+
+Two exceptions are fseek() and ftell(). 32-bit applications should
+use fseeko(3C) and ftello(3C). These will get automatically mapped
+to fseeko64() and ftello64().
+
+The large file compilation environment is obtained with
+
+ getconf LFS_CFLAGS -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
+ getconf LFS_LDFLAGS # nothing special needed
+ getconf LFS_LIBS # nothing special needed
+
+By default, perl uses the large file compilation environment and
+relies on Solaris to do the underlying mapping of interfaces.
+
+=head3 Building an LP64 Perl
+
+To compile a 64-bit application on an UltraSparc with a recent Sun Compiler,
+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
+
+This flag is supported in Sun WorkShop Compilers 5.0 and onwards
+(now marketed under the name Forte) when used on Solaris 7 or later on
+UltraSparc systems.
+
+If you are using gcc, you would need to use -mcpu=v9 -m64 instead. This
+option is not yet supported as of gcc 2.95.2; from install/SPECIFIC
+in that release:
+
+GCC version 2.95 is not able to compile code correctly for sparc64
+targets. Users of the Linux kernel, at least, can use the sparc32
+program to start up a new shell invocation with an environment that
+causes configure to recognize (via uname -a) the system as sparc-*-*
+instead.
+
+All this should be handled automatically by the hints file, if
+requested.
+
+If you do want to be able to allocate more than 4GB memory inside
+perl, then you should use the Solaris malloc, since the perl
+malloc breaks when dealing with more than 2GB of memory. You can do
+this with
+
+ sh Configure -Uusemymalloc
+
+Note that this will break binary compatibility with any version that
+was not compiled with -Uusemymalloc.
+
+=head3 Long Doubles.
+
+As of 5.6.0, long doubles are not working.
+
+=head2 Threads.
+
+It is possible to build a threaded version of perl on Solaris. The entire
+perl thread implementation is still experimental, however, so beware.
+Perl uses the sched_yield(3RT) function. In versions of Solaris up
+to 2.6, that function is in -lposix4. Starting with Solaris 7, it is
+in -lrt. The hints file should handle adding this automatically.
+
+=head2 Malloc Issues.
+
+You should not use perl's malloc if you are building with gcc. There
+are reports of core dumps, especially in the PDL module. The problem
+appears to go away under -DDEBUGGING, so it has been difficult to
+track down. Sun's compiler appears to be ok with or without perl's
+malloc. [XXX further investigation is needed here.]
+
+You should also not use perl's malloc if you are building perl as
+an LP64 application, since perl's malloc has trouble allocating more
+than 2GB of memory.
+
+You can avoid perl's malloc by Configuring with
+
+ sh Configure -Uusemymalloc
+
+See the note about binary compatibility above. This option will be
+enabled by default beginning with 5.7.1.
+
+=head1 MAKE PROBLEMS.
+
+=over 4
+
+=item Dynamic Loading Problems With GNU as and GNU ld
+
+If you have problems with dynamic loading using gcc on SunOS or
+Solaris, and you are using GNU as and GNU ld, see the section
+L<"GNU as and GNU ld"> above.
+
+=item ld.so.1: ./perl: fatal: relocation error:
+
+If you get this message on SunOS or Solaris, and you're using gcc,
+it's probably the GNU as or GNU ld problem in the previous item
+L<"GNU as and GNU ld">.
+
+=item dlopen: stub interception failed
+
+The primary cause of the 'dlopen: stub interception failed' message is
+that the LD_LIBRARY_PATH environment variable includes a directory
+which is a symlink to /usr/lib (such as /lib). See
+L<"LD_LIBRARY_PATH"> above.
+
+=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 sh: ar: not found
+
+This is a message from your shell telling you that the command 'ar'
+was not found. You need to check your PATH environment variable to
+make sure that it includes the directory with the 'ar' command. This
+is a common problem on Solaris, where 'ar' is in the /usr/ccs/bin/
+directory.
+
+=back
+
+=head1 MAKE TEST
+
+=head2 op/stat.t test 4
+
+op/stat.t test 4 may fail if you are on a tmpfs of some sort.
+Building in /tmp sometimes shows this behavior. The
+test suite detects if you are building in /tmp, but it may not be able
+to catch all tmpfs situations.
+
+=head1 PREBUILT BINARIES.
+
+You can pick up prebuilt binaries for Solaris from
+L<http://www.sunfreeware.com/>, ActiveState L<http://www.activestate.com/>,
+and L<http://www.perl.com/> under the Binaries list at the top of the page.
+There are probably other sources as well. Please note that these sites
+are under the control of their respective owners, not the perl developers.
+
+=head1 RUNTIME ISSUES.
+
+=head2 Limits on Numbers of Open Files.
+
+The stdio(3C) manpage notes that only 255 files may be opened using
+fopen(), and only file descriptors 0 through 255 can be used in a
+stream. Since perl calls open() and then fdopen(3C) with the
+resulting file descriptor, perl is limited to 255 simultaneous open
+files.
+
+=head1 SOLARIS-SPECIFIC MODULES.
+
+See the modules under the Solaris:: namespace on CPAN,
+L<http://www.cpan.org/modules/by-module/Solaris/>.
+
+=head1 SOLARIS-SPECIFIC PROBLEMS WITH MODULES.
+
+=head2 Proc::ProcessTable
+
+Proc::ProcessTable does not compile on Solaris with perl5.6.0 and higher
+if you have LARGEFILES defined. Since largefile support is the
+default in 5.6.0 and later, you have to take special steps to use this
+module.
+
+The problem is that various structures visible via procfs use off_t,
+and if you compile with largefile support these change from 32 bits to
+64 bits. Thus what you get back from procfs doesn't match up with
+the structures in perl, resulting in garbage. See proc(4) for further
+discussion.
+
+A fix for Proc::ProcessTable is to edit Makefile to
+explicitly remove the largefile flags from the ones MakeMaker picks up
+from Config.pm. This will result in Proc::ProcessTable being built
+under the correct environment. Everything should then be OK as long as
+Proc::ProcessTable doesn't try to share off_t's with the rest of perl,
+or if it does they should be explicitly specified as off64_t.
+
+=head2 BSD::Resource
+
+BSD::Resource versions earlier than 1.09 do not compile on Solaris
+with perl 5.6.0 and higher, for the same reasons as Proc::ProcessTable.
+BSD::Resource versions starting from 1.09 have a workaround for the problem.
+
+=head2 Net::SSLeay
+
+Net::SSLeay requires a /dev/urandom to be present. This device is not
+part of Solaris. You can either get the package SUNWski (packaged with
+several Sun software products, for example the Sun WebServer, which is
+part of the Solaris Server Intranet Extension, or the Sun Directory
+Services, part of Solaris for ISPs) or download the ANDIrand package
+from L<http://www.cosy.sbg.ac.at/~andi/>. If you use SUNWski, make a
+symbolic link /dev/urandom pointing to /dev/random.
+
+It may be possible to use the Entropy Gathering Daemon (written in
+Perl!), available from L<http://www.lothar.com/tech/crypto/>.
+
+=head1 AUTHOR
+
+The original was written by Andy Dougherty F<doughera@lafayette.edu>
+drawing heavily on advice from Alan Burlison, Nick Ing-Simmons, Tim Bunce,
+and many other Solaris users over the years.
+
+Please report any errors, updates, or suggestions to F<perlbug@perl.org>.
+
+=head1 LAST MODIFIED
+
+$Id: README.solaris,v 1.4 2000/11/11 20:29:58 doughera Exp $
diff --git a/gnu/usr.bin/perl/README.vmesa b/gnu/usr.bin/perl/README.vmesa
index a6bb96b37f4..201748490b9 100644
--- a/gnu/usr.bin/perl/README.vmesa
+++ b/gnu/usr.bin/perl/README.vmesa
@@ -1,4 +1,20 @@
-README.vmesa
+
+This document is written in pod format hence there are punctuation
+characters in odd places. Do not worry, you've apparently got
+the ASCII->EBCDIC translation worked out correctly. You can read
+more about pod in pod/perlpod.pod or the short summary in the
+INSTALL file.
+
+=head1 NAME
+
+README.vmesa - building and installing Perl for VM/ESA.
+
+=head1 SYNOPSIS
+
+This document will help you Configure, build, test and install Perl
+on VM/ESA.
+
+=head1 DESCRIPTION
This is a fully ported perl for VM/ESA 2.3.0. It may work on
other versions, but that's the one we've tested it on.
@@ -10,48 +26,77 @@ the source code below /usr/local (though that is where it will be
installed by default). You may need to worry about the networking
configuration files discussed in the last bullet below.
+=head2 Unpacking
+
To extract an ASCII tar archive on VM/ESA, try this:
pax -o to=IBM-1047,from=ISO8859-1 -r < latest.tar
+=head2 Setup and utilities
+
GNU make for VM/ESA, which may be required for the build of perl,
is available from:
http://pucc.princeton.edu/~neale/vmoe.html
+=head2 Configure
+
Once you've unpacked the distribution, run Configure (see INSTALL for
full discussion of the Configure options), and then run make, then
"make test" then "make install" (this last step may require UID=0
-privileges)
+privileges).
There is a "hints" file for vmesa that specifies the correct values
-for most things. Some things to watch out for are
-
- - this port does support dynamic loading but it's not had much testing
-
- - Don't turn on the compiler optimization flag "-O". There's
- a bug in the compiler (APAR PQ18812) that generates some bad code
- the optimizer is on.
-
- - As VM/ESA doesn't fully support the fork() API programs relying on
- this call will not work. I've replaced fork()/exec() with spawn()
- and the standalone exec() with spawn(). This has a side effect when
- opening unnamed pipes in a shell script: there is no child process
- generated under.
-
- - At the moment the hints file for VM/ESA basically bypasses all of the
- automatic configuration process. This is because Configure relies on:
- 1. The header files living in the Byte File System (you could put the
- there if you want;
- 2. The C preprocessor including the #include statements in the
- preprocessor output (.i) file.
+for most things. Some things to watch out for are:
+
+=over 4
+
+=item *
+
+this port does support dynamic loading but it's not had much testing
+
+=item *
+
+Don't turn on the compiler optimization flag "-O". There's
+a bug in the compiler (APAR PQ18812) that generates some bad code
+the optimizer is on.
+
+=item *
+
+As VM/ESA doesn't fully support the fork() API programs relying on
+this call will not work. I've replaced fork()/exec() with spawn()
+and the standalone exec() with spawn(). This has a side effect when
+opening unnamed pipes in a shell script: there is no child process
+generated under.
+
+=item *
+
+At the moment the hints file for VM/ESA basically bypasses all of the
+automatic configuration process. This is because Configure relies on:
+1. The header files living in the Byte File System (you could put the
+there if you want); 2. The C preprocessor including the #include
+statements in the preprocessor output (.i) file.
+
+=back
+
+=head2 testing anomalies
+
+The `make test` step runs a Perl Verification Procedure, usually before
+installation. As the 5.6.1 kit was was being assembled
+the following "failures" were known to appear on some machines
+during `make test` (mostly due to ASCII vs. EBCDIC conflicts),
+your results may differ:
+
+[the list of failures being compiled]
+
+=head2 Usage Hints
When using perl on VM/ESA please keep in mind that the EBCDIC and ASCII
character sets are different. Perl builtin functions that may behave
differently under EBCDIC are mentioned in the perlport.pod document.
OpenEdition (UNIX System Services) does not (yet) support the #! means
-of script invokation.
+of script invocation.
See:
head `whence perldoc`
@@ -59,18 +104,33 @@ See:
for an example of how to use the "eval exec" trick to ask the shell to
have perl run your scripts for you.
+=head1 AUTHORS
+
+Neale Ferguson.
+
+=head1 SEE ALSO
+
+L<INSTALL>, L<perlport>, L<perlebcdic>.
+
+=head2 Mailing list
+
If you are interested in the VM and OS/390 ports of perl then see the
perl-mvs mailing list: The Perl Institute (http://www.perl.org/)
maintains a mailing list of interest to all folks building and/or
-using perl on EBCDIC platforms. To subscibe, send a message of:
+using perl on EBCDIC platforms. To subscribe, send a message of:
subscribe perl-mvs
to majordomo@perl.org.
-Regression tests: as the 5.005 kit was was being assembled
-the following "failures" were known to appear on some machines
-during `make test` (mostly due to ASCII vs. EBCDIC conflicts),
-your results may differ:
+ See also:
+
+ http://lists.perl.org/showlist.cgi?name=perl-mvs
+
+There are web archives of the mailing list at:
+
+ http://www.xray.mpe.mpg.de/mailing-lists/perl-mvs/
+ http://archive.develooper.com/perl-mvs@perl.org/
+
+=cut
-[the list of failures being compiled]
diff --git a/gnu/usr.bin/perl/README.vos b/gnu/usr.bin/perl/README.vos
index 99abf0d6c5b..99588b64d2d 100644
--- a/gnu/usr.bin/perl/README.vos
+++ b/gnu/usr.bin/perl/README.vos
@@ -1,128 +1,189 @@
-Perl 5 README file for the Stratus VOS operating system.
-Paul Green (Paul_Green@stratus.com)
-February 3, 2000
+If you read this file _as_is_, just ignore the funny characters you
+see. It is written in the POD format (see pod/perlpod.pod) which is
+specially designed to be readable as is.
+
+=head1 NAME
+
+README.vos - Perl for Stratus VOS
+
+=head1 SYNOPSIS
+This is a port of Perl version 5 to VOS. Perl is a scripting or
+macro language that is popular on many systems. See your local
+computer bookstore for a number of good books on Perl.
-Introduction
-------------
-This is a port of Perl version 5, revision 005-63, to VOS. Perl
-is a scripting or macro language that is popular on many
-systems. See your local computer bookstore for a number of good
-books on Perl.
+=head2 Stratus POSIX Support
-Most of the Perl features should work on VOS. However, any
+Note that there are two different implementations of POSIX.1
+support on VOS. There is an alpha version of POSIX that is
+available from the Stratus anonymous ftp site
+(ftp://ftp.stratus.com/pub/vos/posix/alpha/alpha.html). There
+is a generally-available version of POSIX that comes with the
+VOS Standard C compiler and C runtime in VOS Release 14.3.0 or
+higher. This port of POSIX will compile and bind with either
+version of POSIX.
+
+Most of the Perl features should work on VOS regardless of which
+version of POSIX that you are using. However, the alpha version
+of POSIX is missing a number of key functions, and therefore any
attempt by perl.pm to call the following unimplemented POSIX
functions will result in an error message and an immediate and
fatal call to the VOS debugger. They are "dup", "fork", and
"waitpid". The lack of these functions pretty much prevents you
from starting VOS commands and grabbing their output in perl.
The workaround is to run the commands outside of perl, then have
-perl process the output file.
+perl process the output file. These functions are all available
+in the generally-available version of POSIX.
+
+=head1 INSTALLING PERL IN VOS
+=head2 Compiling Perl 5 on VOS
-Compiling Perl 5 on VOS
------------------------
Before you can build Perl 5 on VOS, you need to have or acquire the
following additional items.
-1. The VOS Standard C Compiler and Runtime, or the VOS Standard C
- Cross-Compiler. This is a standard Stratus product.
+=over 5
+
+=item 1
+
+The VOS Standard C Compiler and Runtime, or the VOS Standard C
+Cross-Compiler. This is a standard Stratus product.
-2. The VOS OS TCP/IP product set. While the necessary header
- files are included with VOS POSIX.1, you still need the
- appropriate object files in order to bind perl.pm. This is
- a standard Stratus product.
+=item 2
-3. The VOS POSIX.1 environment. As of this writing, this is
- available on the VOS FTP site. Login anonymously to
- ftp.stratus.com and get the file
- /pub/vos/alpha/posix.save.evf.gz in binary file-transfer
- mode. Or use the Uniform Resource Locator (URL)
- ftp://ftp.stratus.com/pub/vos/alpha/posix.save.evf.gz from
- your web browser. This is not a standard Stratus product.
+Either the VOS OS TCP/IP or STCP product set. If you are
+building with the alpha version of POSIX you need the OS
+TCP/IP product set. If you are building with the
+generally-available version of POSIX you need the STCP
+product set. These are standard Stratus products.
- Instructions for unbundling this file are at
- ftp://ftp.stratus.com/pub/vos/utility/utility.html.
+=item 3
-4. You must compile this version of Perl 5 on VOS Release
- 14.1.0 or higher because some of the perl source files
- contain more than 32,767 source lines. Due to VOS
- release-compatibility rules, this port of perl may not
- execute on VOS Release 12 or earlier.
+Either the alpha or generally-available version of the VOS
+POSIX.1 environment.
+
+The alpha version of POSIX.1 support is available on the
+Stratus FTP site. Login anonymously to ftp.stratus.com and
+get the file /pub/vos/posix/alpha/posix.save.evf.gz in
+binary file-transfer mode. Or use the Uniform Resource
+Locator (URL)
+ftp://ftp.stratus.com/pub/vos/alpha/posix.save.evf.gz from
+your web browser. Instructions for unbundling this file
+are at ftp://ftp.stratus.com/pub/vos/utility/utility.html.
+This is not a standard Stratus product.
+
+The generally-available version of POSIX.1 support is
+bundled with the VOS Standard C compiler and Runtime (or
+Cross-Compiler) in VOS Release 14.3.0 or higher. This is a
+standard Stratus product.
+
+=item 4
+
+You must compile this version of Perl 5 on VOS Release
+14.1.0 or higher because some of the perl source files
+contain more than 32,767 source lines. Due to VOS
+release-compatibility rules, this port of perl may not
+execute on VOS Release 12 or earlier.
+
+=back
To build perl 5, change to the "vos" subdirectory and type the
command "compile_perl -processor X", where X is the processor
type (mc68020, i80860, pa7100, pa8000) that you wish to use.
+Note that the generally-available version of POSIX.1 support is
+not available for the mc68020 or i80860 processors.
+
+You must have purchased the VOS Standard C Cross Compiler in
+order to compile perl for a processor type that is different
+from the processor type of the module.
+
Note that code compiled for the pa7100 processor type can
-execute on the PA7100, PA8000, and PA8500 processors, and that
-code compiled for the pa8000 processor type can execute on the
-PA8000 and PA8500 processors.
+execute on the PA7100, PA8000, PA8500 and PA8600 processors, and
+that code compiled for the pa8000 processor type can execute on
+the PA8000, PA8500 and PA8600 processors.
+=head2 Installing Perl 5 on VOS
-Installing Perl 5 on VOS
-------------------------
-1. Create the directory >system>ported>command_library.
+=over 4
-2. Copy the appropriate version of the perl program module to
- this directory. For example, with your current directory
- set to the top-level directory of Perl 5, to install the
- executable program module for the Motorola 68K
- architecture, enter:
+=item 1
+
+Create the directory >system>ported>command_library.
+
+=item 2
+
+Copy the appropriate version of the perl program module to
+this directory. For example, with your current directory
+set to the top-level directory of Perl 5, to install the
+executable program module for the Motorola 68K
+architecture, enter:
!copy_file vos>obj>perl.pm >system>ported>command_library>*
- (If you wish to use both Perl version 4 and Perl version 5,
- you must give them different names; for example, perl.pm
- and perl5.pm).
+(If you wish to use both Perl version 4 and Perl version 5,
+you must give them different names; for example, perl.pm
+and perl5.pm).
+
+=item 3
+
+Create the directory >system>ported>perl>lib.
+
+=item 4
+
+Copy all of the files and subdirectories from the lib
+subdirectory into this new directory. For example, with
+the current directory set to the top-level directory of the
+perl distribution, enter:
+
+ !copy_dir lib >system>ported>perl>lib>5.6
-3. Create the directory >system>ported>perl>lib.
+=item 5
-4. Copy all of the files and subdirectories from the lib
- subdirectory into this new directory. For example, with
- the current directory set to the top-level directory of the
- perl distribution, enter:
+While there are currently no architecture-specific
+extensions or modules distributed with perl, the following
+directories can be used to hold such files:
- !copy_dir lib >system>ported>perl>lib>5.005
+ >system>ported>perl>lib>5.6.68k
+ >system>ported>perl>lib>5.6.860
+ >system>ported>perl>lib>5.6.7100
+ >system>ported>perl>lib>5.6.8000
-5. While there are currently no architecture-specific
- extensions or modules distributed with perl, the following
- directories can be used to hold such files:
+=item 6
- >system>ported>perl>lib>5.005.68k
- >system>ported>perl>lib>5.005.860
- >system>ported>perl>lib>5.005.7100
- >system>ported>perl>lib>5.005.8000
+Site-specific perl extensions and modules can be installed in one of
+two places. Put architecture-independent files into:
-6. Site-specific perl extensions and modules can be installed
- in one of two places. Put architecture-independent files
- into:
+ >system>ported>perl>lib>site>5.6
- >system>ported>perl>lib>site>5.005
+Put architecture-dependent files into one of the following
+directories:
- Put architecture-dependent files into one of the following
- directories:
+ >system>ported>perl>lib>site>5.6.68k
+ >system>ported>perl>lib>site>5.6.860
+ >system>ported>perl>lib>site>5.6.7100
+ >system>ported>perl>lib>site>5.6.8000
- >system>ported>perl>lib>site>5.005.68k
- >system>ported>perl>lib>site>5.005.860
- >system>ported>perl>lib>site>5.005.7100
- >system>ported>perl>lib>site>5.005.8000
+=item 7
-7. You can examine the @INC variable from within a perl program
- to see the order in which Perl searches these directories.
+You can examine the @INC variable from within a perl program
+to see the order in which Perl searches these directories.
+=back
-Unimplemented Features
-----------------------
-If Perl 5 attempts to call an unimplemented VOS POSIX.1 function,
-it will print a fatal error message and enter the VOS debugger.
-This error is not recoverable. See vos_dummies.c for a list of
-the unimplemented POSIX.1 functions. To see what functions are
-unimplemented and what the error message looks like, compile and
-execute "test_vos_dummies.c".
+=head1 USING PERL IN VOS
+=head2 Unimplemented Features
+
+If perl is built with the alpha version of VOS POSIX.1 support
+and if it attempts to call an unimplemented VOS POSIX.1
+function, it will print a fatal error message and enter the VOS
+debugger. This error is not recoverable. See vos_dummies.c for
+a list of the unimplemented POSIX.1 functions. To see what
+functions are unimplemented and what the error message looks
+like, compile and execute "test_vos_dummies.c".
+
+=head2 Restrictions
-Restrictions
-------------
This port of Perl version 5 to VOS prefers Unix-style,
slash-separated pathnames over VOS-style greater-than-separated
pathnames. VOS-style pathnames should work in most contexts, but
@@ -139,13 +200,19 @@ supported epoch is January 1, 1980 to January 17, 2038.
See the file pod/perlport.pod for more information about the VOS
port of Perl.
+=head1 SUPPORT STATUS
-Support Status
---------------
I'm offering this port "as is". You can ask me questions, but I
-can't guarantee I'll be able to answer them; I don't know much
-about Perl itself; I'm still learning that. There are some
+can't guarantee I'll be able to answer them. There are some
excellent books available on the Perl language; consult a book
seller.
-(end)
+=head1 AUTHOR
+
+Paul Green (Paul_Green@stratus.com)
+
+=head1 LAST UPDATE
+
+February 13, 2001
+
+=cut
diff --git a/gnu/usr.bin/perl/Todo-5.6 b/gnu/usr.bin/perl/Todo-5.6
index 9abeb55ebb7..71aca9cb016 100644
--- a/gnu/usr.bin/perl/Todo-5.6
+++ b/gnu/usr.bin/perl/Todo-5.6
@@ -1,6 +1,5 @@
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:
@@ -12,7 +11,25 @@ Unicode support
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")
+ make \uXXXX (and \u{XXXX}?) where XXXX are hex digits
+ to work similarly to Unicode tech reports and Java
+ notation \uXXXX (and already existing \x{XXXX))?
+ more than four hexdigits? make also \U+XXXX work?
+ overloadable regex assertions? e.g. in Thai \b cannot
+ be deduced by any simple character class boundary rules,
+ word boundaries must algorithmically computed
+
+ see ext/Encode/Todo for notes and references about proper detection
+ of malformed UTF-8
+
+ SCSU? http://www.unicode.org/unicode/reports/tr6/
+ Collation? http://www.unicode.org/unicode/reports/tr10/
+ Normalization? http://www.unicode.org/unicode/reports/tr15/
+ EBCDIC? http://www.unicode.org/unicode/reports/tr16/
+ Regexes? http://www.unicode.org/unicode/reports/tr18/
+ Case Mappings? http://www.unicode.org/unicode/reports/tr21/
+
+ See also "Locales", "Regexen", and "Miscellaneous".
Multi-threading
support "use Thread;" under useithreads
@@ -39,17 +56,18 @@ Namespace cleanup
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)
+ PREFERABLY AS AN EXTENSION
UNIX98 support: reader-writer locks, realtime/asynchronous IO
+ PREFERABLY AS AN EXTENSION
IPv6 support: see RFC2292, RFC2553
+ PREFERABLY AS AN EXTENSION
+ there already is Socket6 in CPAN
Long doubles
figure out where the PV->NV->PV conversion gets it wrong at least
@@ -60,6 +78,7 @@ Long doubles
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.
+ more pain: long_long, u_long_long.
Locales
deprecate traditional/legacy locales?
@@ -67,15 +86,16 @@ Locales
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:
+ 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))".
+ 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).
+ There is also the iconv interface, 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>.
@@ -101,6 +121,9 @@ Regexen
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'
+ trie optimization: factor out common suffixes (and prefixes?)
+ from |-alternating groups (both for exact strings and character
+ classes, use lookaheads?)
approximate matching
Security
@@ -120,22 +143,27 @@ Win32 stuff
work out DLL versioning
Miscellaneous
+ introduce @( and @) because group names can have spaces
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.
+ At least the following interfaces exist: fp_classify(), fp_class(),
+ class(), isinf(), isfinite(), finite(), isnormal(), unordered(),
+ <ieeefp.h>, <fp_class.h> (there are metaconfig units for all these),
+ fp_setmask(), fp_getmask(), fp_setround(), fp_getround()
+ (no metaconfig units yet for these).
+ Don't forget finitel(), fp_classl(), fp_class_l(), (yes, both do,
+ unfortunately, exist), and unorderedl().
+ PREFERABLY AS AN EXTENSION.
+ As of 5.6.1 there is cpp macro Perl_isnan().
fix the basic arithmetics (+ - * / %) to preserve IVness/UVness if
- both arguments are IVs/UVs
+ both arguments are IVs/UVs: it sucks that one cannot see
+ the 'carry flag' (or equivalent) of the CPU from C,
+ C is too high-level...
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)
@@ -154,3 +182,5 @@ Documentation
spot-check all new modules for completeness
better docs for pack()/unpack()
reorg tutorials vs. reference sections
+ make roffitall to be dynamical about its pods and libs
+
diff --git a/gnu/usr.bin/perl/bytecode.pl b/gnu/usr.bin/perl/bytecode.pl
index d1e1c708c0d..4b00e14b9a1 100644
--- a/gnu/usr.bin/perl/bytecode.pl
+++ b/gnu/usr.bin/perl/bytecode.pl
@@ -13,7 +13,7 @@ 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).
-my @specialsv = qw(Nullsv &PL_sv_undef &PL_sv_yes &PL_sv_no);
+my @specialsv = qw(Nullsv &PL_sv_undef &PL_sv_yes &PL_sv_no pWARN_ALL pWARN_NONE);
my (%alias_from, $from, $tos);
while (($from, $tos) = each %alias_to) {
@@ -82,7 +82,7 @@ print BYTERUN_C $c_header, <<'EOT';
#include "bytecode.h"
-static int optype_size[] = {
+static const int optype_size[] = {
EOT
my $i = 0;
for ($i = 0; $i < @optype - 1; $i++) {
@@ -92,33 +92,27 @@ 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(pTHXo_ void *obj, I32 ix)
+bset_obj_store(pTHXo_ struct byteloader_state *bstate, 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;
+ if (ix > bstate->bs_obj_list_fill) {
+ Renew(bstate->bs_obj_list, ix + 32, void*);
+ bstate->bs_obj_list_fill = ix + 31;
}
- bytecode_obj_list[ix] = obj;
+ bstate->bs_obj_list[ix] = obj;
return obj;
}
void
-byterun(pTHXo_ struct bytestream bs)
+byterun(pTHXo_ register struct byteloader_state *bstate)
{
- dTHR;
- int insn;
+ register int insn;
+ U32 ix;
+ SV *specialsv_list[6];
+
+ BYTECODE_HEADER_CHECK; /* croak if incorrect platform */
+ New(666, bstate->bs_obj_list, 32, void*); /* set op objlist */
+ bstate->bs_obj_list_fill = 31;
EOT
@@ -198,13 +192,25 @@ EOT
#
open(BYTERUN_H, ">ext/ByteLoader/byterun.h") or die "ext/ByteLoader/byterun.h: $!";
print BYTERUN_H $c_header, <<'EOT';
-struct bytestream {
- void *data;
- int (*pfgetc)(void *);
- int (*pfread)(char *, size_t, size_t, void *);
- void (*pfreadpv)(U32, void *, XPV *);
+struct byteloader_fdata {
+ SV *datasv;
+ int next_out;
+ int idx;
};
+struct byteloader_state {
+ struct byteloader_fdata *bs_fdata;
+ SV *bs_sv;
+ void **bs_obj_list;
+ int bs_obj_list_fill;
+ XPV bs_pv;
+ int bs_iv_overflows;
+};
+
+int bl_getc(struct byteloader_fdata *);
+int bl_read(struct byteloader_fdata *, char *, size_t, size_t);
+extern void byterun(pTHXo_ struct byteloader_state *);
+
enum {
EOT
@@ -233,18 +239,6 @@ for ($i = 0; $i < @optype - 1; $i++) {
}
printf BYTERUN_H " OPt_%s\t\t/* %d */\n};\n\n", $optype[$i], $i;
-print BYTERUN_H <<'EOT';
-extern void byterun(pTHXo_ struct bytestream bs);
-
-#define INIT_SPECIALSV_LIST STMT_START { \
-EOT
-for ($i = 0; $i < @specialsv; $i++) {
- print BYTERUN_H "\tPL_specialsv_list[$i] = $specialsv[$i]; \\\n";
-}
-print BYTERUN_H <<'EOT';
- } STMT_END
-EOT
-
#
# Finish off insn_data and create array initialisers in Asmdata.pm
#
@@ -294,85 +288,86 @@ nop none none
#opcode lvalue argtype flags
#
ret none none x
-ldsv bytecode_sv svindex
+ldsv bstate->bs_sv svindex
ldop PL_op opindex
-stsv bytecode_sv U32 s
+stsv bstate->bs_sv U32 s
stop PL_op U32 s
-ldspecsv bytecode_sv U8 x
-newsv bytecode_sv U8 x
+stpv bstate->bs_pv.xpv_pv U32 x
+ldspecsv bstate->bs_sv U8 x
+newsv bstate->bs_sv U8 x
newop PL_op U8 x
newopn PL_op U8 x
newpv none PV
-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
+pv_cur bstate->bs_pv.xpv_cur STRLEN
+pv_free bstate->bs_pv none x
+sv_upgrade bstate->bs_sv char x
+sv_refcnt SvREFCNT(bstate->bs_sv) U32
+sv_refcnt_add SvREFCNT(bstate->bs_sv) I32 x
+sv_flags SvFLAGS(bstate->bs_sv) U32
+xrv SvRV(bstate->bs_sv) svindex
+xpv bstate->bs_sv none x
+xiv32 SvIVX(bstate->bs_sv) I32
+xiv64 SvIVX(bstate->bs_sv) IV64
+xnv SvNVX(bstate->bs_sv) NV
+xlv_targoff LvTARGOFF(bstate->bs_sv) STRLEN
+xlv_targlen LvTARGLEN(bstate->bs_sv) STRLEN
+xlv_targ LvTARG(bstate->bs_sv) svindex
+xlv_type LvTYPE(bstate->bs_sv) char
+xbm_useful BmUSEFUL(bstate->bs_sv) I32
+xbm_previous BmPREVIOUS(bstate->bs_sv) U16
+xbm_rare BmRARE(bstate->bs_sv) U8
+xfm_lines FmLINES(bstate->bs_sv) I32
+xio_lines IoLINES(bstate->bs_sv) long
+xio_page IoPAGE(bstate->bs_sv) long
+xio_page_len IoPAGE_LEN(bstate->bs_sv) long
+xio_lines_left IoLINES_LEFT(bstate->bs_sv) long
+xio_top_name IoTOP_NAME(bstate->bs_sv) pvcontents
+xio_top_gv *(SV**)&IoTOP_GV(bstate->bs_sv) svindex
+xio_fmt_name IoFMT_NAME(bstate->bs_sv) pvcontents
+xio_fmt_gv *(SV**)&IoFMT_GV(bstate->bs_sv) svindex
+xio_bottom_name IoBOTTOM_NAME(bstate->bs_sv) pvcontents
+xio_bottom_gv *(SV**)&IoBOTTOM_GV(bstate->bs_sv) svindex
+xio_subprocess IoSUBPROCESS(bstate->bs_sv) short
+xio_type IoTYPE(bstate->bs_sv) char
+xio_flags IoFLAGS(bstate->bs_sv) char
+xcv_stash *(SV**)&CvSTASH(bstate->bs_sv) svindex
+xcv_start CvSTART(bstate->bs_sv) opindex
+xcv_root CvROOT(bstate->bs_sv) opindex
+xcv_gv *(SV**)&CvGV(bstate->bs_sv) svindex
+xcv_file CvFILE(bstate->bs_sv) pvindex
+xcv_depth CvDEPTH(bstate->bs_sv) long
+xcv_padlist *(SV**)&CvPADLIST(bstate->bs_sv) svindex
+xcv_outside *(SV**)&CvOUTSIDE(bstate->bs_sv) svindex
+xcv_flags CvFLAGS(bstate->bs_sv) U16
+av_extend bstate->bs_sv SSize_t x
+av_push bstate->bs_sv svindex x
+xav_fill AvFILLp(bstate->bs_sv) SSize_t
+xav_max AvMAX(bstate->bs_sv) SSize_t
+xav_flags AvFLAGS(bstate->bs_sv) U8
+xhv_riter HvRITER(bstate->bs_sv) I32
+xhv_name HvNAME(bstate->bs_sv) pvcontents
+hv_store bstate->bs_sv svindex x
+sv_magic bstate->bs_sv char x
+mg_obj SvMAGIC(bstate->bs_sv)->mg_obj svindex
+mg_private SvMAGIC(bstate->bs_sv)->mg_private U16
+mg_flags SvMAGIC(bstate->bs_sv)->mg_flags U8
+mg_pv SvMAGIC(bstate->bs_sv) pvcontents x
+xmg_stash *(SV**)&SvSTASH(bstate->bs_sv) svindex
+gv_fetchpv bstate->bs_sv strconst x
+gv_stashpv bstate->bs_sv strconst x
+gp_sv GvSV(bstate->bs_sv) svindex
+gp_refcnt GvREFCNT(bstate->bs_sv) U32
+gp_refcnt_add GvREFCNT(bstate->bs_sv) I32 x
+gp_av *(SV**)&GvAV(bstate->bs_sv) svindex
+gp_hv *(SV**)&GvHV(bstate->bs_sv) svindex
+gp_cv *(SV**)&GvCV(bstate->bs_sv) svindex
+gp_file GvFILE(bstate->bs_sv) pvindex
+gp_io *(SV**)&GvIOp(bstate->bs_sv) svindex
+gp_form *(SV**)&GvFORM(bstate->bs_sv) svindex
+gp_cvgen GvCVGEN(bstate->bs_sv) U32
+gp_line GvLINE(bstate->bs_sv) line_t
+gp_share bstate->bs_sv svindex x
+xgv_flags GvFLAGS(bstate->bs_sv) U8
op_next PL_op->op_next opindex
op_sibling PL_op->op_sibling opindex
op_ppaddr PL_op->op_ppaddr strconst x
@@ -384,7 +379,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_children cLISTOP->op_children U32
op_pmreplroot cPMOP->op_pmreplroot opindex
op_pmreplrootgv *(SV**)&cPMOP->op_pmreplroot svindex
op_pmreplstart cPMOP->op_pmreplstart opindex
@@ -399,9 +393,9 @@ 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_stashpv cCOP pvcontents x
-cop_file cCOP pvcontents x
+cop_label cCOP->cop_label pvindex
+cop_stashpv cCOP pvindex x
+cop_file cCOP pvindex x
cop_seq cCOP->cop_seq U32
cop_arybase cCOP->cop_arybase I32
cop_line cCOP line_t x
@@ -409,3 +403,6 @@ cop_warnings cCOP->cop_warnings svindex
main_start PL_main_start opindex
main_root PL_main_root opindex
curpad PL_curpad svindex x
+push_begin PL_beginav svindex x
+push_init PL_initav svindex x
+push_end PL_endav svindex x
diff --git a/gnu/usr.bin/perl/configure.com b/gnu/usr.bin/perl/configure.com
index 003a047bbe8..62ebaccb1cb 100644
--- a/gnu/usr.bin/perl/configure.com
+++ b/gnu/usr.bin/perl/configure.com
@@ -1,7 +1,7 @@
$ sav_ver = 'F$VERIFY(0)'
$! SET VERIFY
$!
-$! For example, if you unpacked perl into: [USER.PERL5_00n...] then you will
+$! For example, if you unpacked perl into: [USER.PERL-5n...] then you will
$! want to cd into the tree and execute Configure:
$!
$! $ SET DEFAULT [USER.PERL5_xxx]
@@ -30,12 +30,12 @@ $! with much valuable help from Charles Bailey &
$! the whole VMSPerl crew.
$! Extended and messed about with by Dan Sugalski
$!
-$ sav_ver = F$VERIFY(0)
-$!
$! VMS-isms we will need:
$ echo = "write sys$output "
$ cat = "type"
+$ delete := delete ! local symbol overrides globals with qualifiers
$ gcc_symbol = "gcc"
+$ ld = "Link"
$ ans = ""
$ macros = ""
$ extra_flags = ""
@@ -50,12 +50,20 @@ $ Thread_Live_Dangerously = "MT="
$ use_two_pot_malloc = "N"
$ use_pack_malloc = "N"
$ use_debugmalloc = "N"
-$ d_secintgenv = "N"
-$ cc_flags = ""
-$ use_multiplicity = "N"
+$ ccflags = ""
+$ static_ext = ""
$ vms_default_directory_name = F$ENVIRONMENT("DEFAULT")
-$ 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]
+$ max_allowed_dir_depth = 3 ! e.g. [A.B.PERLxxx] not [A.B.C.PERLxxx]
+$! max_allowed_dir_depth = 2 ! e.g. [A.PERLxxx] not [A.B.PERLxxx]
+$!
+$! Sebastian Bazley's request: close the CONFIG handle with /NOLOG
+$! qualifier "just in case" (configure.com is re @ed in a bad state).
+$! This construct was tested to be not a problem as far back as
+$! VMS V5.5-2, hopefully earlier versions are OK as well.
+$!
+$ CLOSE/NOLOG CONFIG
+$!
+$! Now keep track of open files
$!
$ vms_filcnt = F$GETJPI ("","FILCNT")
$!
@@ -118,16 +126,16 @@ $!: set up default values
$ fastread=""
$ reuseval="false"
$ maniskip = "false"
-$ config_sh=""
+$ IF F$TYPE(config_sh) .EQS. "" THEN config_sh=""
$ alldone=""
$ error=""
$ silent=""
$ extractsh=""
$ override=""
$ knowitall=""
-$ Using_Dec_C = ""
-$ Using_Gnu_C = ""
+$ ccname="VAX"
$ Dec_C_Version = ""
+$ cxxversion = ""
$ use_threads = "F"
$ use_5005_threads = "N"
$ use_ithreads = "N"
@@ -170,7 +178,7 @@ $ gotopt = "t"
$ P'i' = P'i' - "e"
$ gotshortopt = "t"
$ ENDIF
-$ IF (F$EXTRACT(0,1,P'i') .EQS. "f") !"-f")
+$ IF (F$EXTRACT(0,1,P'i') .EQS. "f") ! "-f"
$ THEN
$ P'i' = P'i' - "f"
$ config_sh = P'i'
@@ -179,6 +187,7 @@ $ THEN
$ test_config_sh = F$FILE_ATTRIBUTES(config_sh,"PRO")
$ IF (F$LOCATE("R",test_config_sh).NE.F$LENGTH(test_config_sh))
$ THEN
+$ config_dflt = "y"
$ CONTINUE !at this point check UIC && if test allows...
$ !to be continued ?
$ ELSE
@@ -191,100 +200,103 @@ $ error="true"
$ ENDIF
$ gotopt = "t"
$ ENDIF
-$ IF (F$EXTRACT(0,1,P'i') .EQS. "h")
+$ IF (F$EXTRACT(0,1,P'i') .EQS. "h") ! "-h"
$ THEN
$ error = "true"
$ gotopt = "t"
$ P'i' = P'i' - "h"
$ gotshortopt = "t"
$ ENDIF
-$ IF (F$EXTRACT(0,1,P'i') .EQS. "m")
+$ IF (F$EXTRACT(0,1,P'i') .EQS. "m") ! "-m"
$ THEN
$ maniskip = "true"
$ gotopt = "t"
$ P'i' = P'i' - "m"
$ gotshortopt = "t"
$ ENDIF
-$ IF (F$EXTRACT(0,1,P'i') .EQS. "r")
+$ IF (F$EXTRACT(0,1,P'i') .EQS. "r") ! "-r"
$ THEN
$ reuseval = "true"
$ gotopt = "t"
$ P'i' = P'i' - "r"
$ gotshortopt = "t"
$ ENDIF
-$ IF (F$EXTRACT(0,1,P'i') .EQS. "s")
+$ IF (F$EXTRACT(0,1,P'i') .EQS. "s") ! "-s"
$ THEN
$ silent = "true"
$ gotopt = "t"
$ P'i' = P'i' - "s"
$ gotshortopt = "t"
$ ENDIF
-$ IF (F$EXTRACT(0,1,P'i') .EQS. "E") !"-E")
+$ IF (F$EXTRACT(0,1,P'i') .EQS. "E") ! "-E"
$ THEN
$ alldone = "exit"
$ gotopt = "t"
$ ENDIF
-$ IF (F$EXTRACT(0,1,P'i') .EQS. "K") !"-K")
+$ IF (F$EXTRACT(0,1,P'i') .EQS. "K") ! "-K"
$ THEN
$ knowitall = "true"
$ gotopt = "t"
$ P'i' = P'i' - "K"
$ gotshortopt = "t"
$ ENDIF
-$ IF (F$EXTRACT(0,1,P'i') .EQS. "O")
+$ IF (F$EXTRACT(0,1,P'i') .EQS. "O") ! "-O"
$ THEN
$ override = "true"
$ gotopt = "t"
$ P'i' = P'i' - "O"
$ gotshortopt = "t"
$ ENDIF
-$ IF (F$EXTRACT(0,1,P'i') .EQS. "S") !"-S")
+$ IF (F$EXTRACT(0,1,P'i') .EQS. "S") ! "-S"
$ THEN
-$ extractsh = "true" !VMS?
+$ extractsh = "true" !VMS? Yes with munchconfig
$ gotopt = "t"
$ P'i' = P'i' - "S"
$ gotshortopt = "t"
$ ENDIF
-$ IF (F$EXTRACT(0,1,P'i') .EQS. "D") !"-D")
+$ IF (F$EXTRACT(0,1,P'i') .EQS. "D") ! "-D"
$ THEN
$ P'i' = P'i' - "D"
-$!Hmm.. this part needs work
-$! P'i'
$ IF (F$LOCATE("=",P'i') .EQ. F$LENGTH(P'i'))
$ THEN
-$ P'i' = "define"
+$ tmp = P'i' + "=""define"""
+$ 'tmp'
+$ DELETE/SYMBOL tmp
$ ELSE
$ IF (F$LOCATE("=",P'i') .EQ. (F$LENGTH(P'i') - 1))
$ THEN
$ me = F$PARSE(me,,,"NAME") + F$PARSE(me,,,"TYPE")
-$ echo "''me': use '-Usymbol=val' not '-Dsymbol='."
+$ echo "''me': use ""-Usymbol=val"" not ""-Dsymbol=""."
$ echo "''me': ignoring -D",P'i'
$ ELSE
-$!Hmm.. this part needs work
-$! 'F$EXTRACT(0,F$LOCATE("=",P'i'),P'i')' = -
-$! 'F$EXTRACT(F$LOCATE("=",P'i'),P'i'),F$LENGTH(P'i'),P'i')'
+$ tmp = F$EXTRACT(0,F$LOCATE("=",P'i'),P'i')
+$ tmp = tmp + "=""" + F$EXTRACT(F$LOCATE("=",P'i')+1,F$LENGTH(P'i'),P'i') + """"
+$ 'tmp'
+$ DELETE/SYMBOL tmp
$ ENDIF
$ ENDIF
-$ ECHO "P''i' =>",P'i',"<=" !Diag
$ gotopt = "t"
$ ENDIF
-$ IF (F$EXTRACT(0,1,P'i') .EQS. "U") !"-U")
+$ IF (F$EXTRACT(0,1,P'i') .EQS. "U") ! "-U"
$ THEN
$ P'i' = P'i' - "U"
$ IF (F$LOCATE("=",P'i') .EQ. F$LENGTH(P'i'))
$ THEN
-$ P'i' = ""
+$ tmp = P'i' + "="""""
+$ 'tmp'
+$ DELETE/SYMBOL tmp
$ ELSE
$ IF (F$LOCATE("=",P'i') .LT. (F$LENGTH(P'i') - 1))
$ THEN
$ me = F$PARSE(me,,,"NAME") + F$PARSE(me,,,"TYPE")
-$ echo "''me': use '-Dsymbol=val' not '-Usymbol=val'."
+$ echo "''me': use ""-Dsymbol=val"" not ""-Usymbol=val""."
$ echo "''me': ignoring -U",P'i'
$ ELSE
-$ P'i' = "undef"
+$ tmp = P'i' + "=""undef"""
+$ 'tmp'
+$ DELETE/SYMBOL tmp
$ ENDIF
$ ENDIF
-$ ECHO "P''i' =>",P'i',"<=" !Diag
$ gotopt = "t"
$ ENDIF
$ IF (F$EXTRACT(0,1,P'i') .EQS. "V")
@@ -292,7 +304,7 @@ $ THEN
$ me = F$PARSE(me,,,"NAME") + F$PARSE(me,,,"TYPE")
$ echo "''me' generated by an unknown version of EDT."
$ STOP
-$ EXIT !0
+$ EXIT
$ ENDIF
$ IF .NOT.gotopt
$ THEN
@@ -309,9 +321,10 @@ $!
$ IF (error)
$ THEN
$ me = F$PARSE(me,,,"DIRECTORY")+ F$PARSE(me,,,"NAME")
-$ echo "Usage: @''me' [-dehmrEKOSV] [-fconfig.sh] [-Dsymbol] [-Dsymbol=value]"
+$ echo "Usage: @''me' [-dehmr""EKOSV""] [-fconfig.sh] [""-Dsymbol""] [""-Dsymbol=value""]"
$ echo " [-Usymbol] [-Usymbol=]"
-$ TYPE SYS$INPUT
+$ TYPE SYS$INPUT:
+$ DECK
"-d" : use defaults for all answers.
"-e" : go on without questioning past the production of config.sh. *
"-f" : specify an alternate default configuration file.
@@ -330,6 +343,7 @@ $ TYPE SYS$INPUT
-"Usymbol" symbol gets the value 'undef'
-"Usymbol=" symbol gets completely empty
-V : print version number and exit (with a zero status).
+$ EOD
$ echo "%Config-I-VMS, lower case switches must be enclosed"
$ echo "-Config-I-VMS, in double quotation marks, e.g.:"
$ echo "-Config-I-VMS, @Configure ""-des"""
@@ -344,7 +358,8 @@ $!
$Shut_up:
$ IF F$Mode() .eqs. "BATCH"
$ THEN
-$ STDOUT = F$GetQuI("DISPLAY_JOB","LOG_SPECIFICATION",,"THIS_JOB")
+$ STDOUT = F$PARSE(F$GETQUI("DISPLAY_ENTRY", "JOB_NAME"), -
+ F$GETQUI("DISPLAY_ENTRY", "LOG_SPECIFICATION"), ".LOG")
$ 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
@@ -393,7 +408,7 @@ $ echo ""
$ echo4 "First let's make sure your kit is complete. Checking..."
$ manifestfound = ""
$ miss_list = ""
-$! Here I assume we are in the [foo.PERL5xxx.VMS...] tree
+$! Here I assume we are in the [foo.PERLxxx...] tree
$! because the search routine simply does set def [-] if necessary.
$ file_2_find = "MANIFEST" !I hope this one is not in [foo.PERL5xxx.VMS...]
$Research_manifest:
@@ -418,10 +433,12 @@ $ IF (tmp .GES. "7.2") .AND. (F$GETSYI("HW_MODEL") .GE. 1024) THEN GOTO Beyond_d
$ IF (F$ELEMENT(max_allowed_dir_depth,".",F$ENVIRONMENT("Default")).nes.".")
$ THEN
$ TYPE SYS$INPUT:
+$ DECK
%Config-E-VMS, ERROR:
Sorry! It apears as though your perl build sub-directory is already too
deep into the VMS file system. Please try moving stuff into a shallower
directory (or altering the "max_allowed_dir_depth" parameter).
+$ EOD
$ echo4 "ABORTING..."
$ SET DEFAULT 'vms_default_directory_name' !be kind rewind
$ STOP
@@ -537,6 +554,8 @@ $ ENDIF
$ IF ((miss_list .NES. "").OR.(manifestfound .EQS. ""))
$ THEN
$ TYPE SYS$INPUT:
+$ DECK
+
THIS PACKAGE SEEMS TO BE INCOMPLETE.
@@ -545,6 +564,7 @@ distinct possibility that your kit is damaged, by typing 'y'es. If you
do, don't blame me if something goes wrong. I advise you to type 'n'o
and contact the author (dan@sidhe.org)
+$ EOD
$ READ SYS$COMMAND/PROMPT="Continue? [n] " ans
$ IF ans
$ THEN
@@ -575,13 +595,23 @@ $ If (fastread)
$ Then
$ echo4 "''rp'"
$ Else
-$ If (silent)
-$ Then
+$ If (.NOT. silent) Then echo ""
+$ READ SYS$COMMAND/PROMPT="''rp'" ans
+$ IF (ans .EQS. "&-d")
+$ THEN
+$ echo4 "(OK, I will run with -d after this question.)"
+$ IF (.NOT. silent) THEN echo ""
$ READ SYS$COMMAND/PROMPT="''rp'" ans
-$ Else
+$ fastread := yes
+$ ENDIF
+$ IF (ans .EQS. "&-s")
+$ THEN
+$ echo4 "(OK, I will run with -s after this question.)"
$ echo ""
$ READ SYS$COMMAND/PROMPT="''rp'" ans
-$ Endif
+$ silent := true
+$ GOSUB Shut_up
+$ ENDIF
$ Endif
$ RETURN
$!
@@ -602,6 +632,58 @@ $ WRITE CONFIG -
$ CLOSE CONFIG
$ ENDIF
$!
+$ IF F$TYPE(usedevel) .EQS. "" THEN usedevel := n
+$ patchlevel_h = F$SEARCH("[-]patchlevel.h")
+$ IF (patchlevel_h.NES."")
+$ THEN
+$ SEARCH 'patchlevel_h' "define","PERL_VERSION","epoch"/match=and/out=[]ver.out
+$ IF .NOT. usedevel .AND. usedevel .NES. "define"
+$ THEN
+$ OPEN/READ CONFIG []ver.out
+$ READ CONFIG line
+$ CLOSE CONFIG
+$ tmp = F$EDIT(line,"TRIM,COMPRESS")
+$ xpatchlevel = F$INTEGER(F$ELEMENT(2," ",tmp))
+$ line = xpatchlevel / 2
+$ tmp = xpatchlevel - ( line * 2 )
+$ IF tmp .NE. 0
+$ THEN
+$ echo4 "patchlevel is " + F$STRING(xpatchlevel)
+$ cat4 SYS$INPUT:
+$ DECK
+*** WHOA THERE!!! ***
+
+ This is an UNSTABLE DEVELOPMENT release.
+ (The patchlevel, is odd--as opposed to even,
+ and that signifies a development release. If you want a
+ maintenance release, you want an even-numbered release.)
+
+ Do ***NOT*** install this into production use.
+ Data corruption and crashes are possible.
+
+ It is most seriously suggested that you do not continue any further
+ unless you want to help in developing and debugging Perl.
+
+$ EOD
+$ dflt="n"
+$ rp="Do you really want to continue? [''dflt'] "
+$ IF (fastread) THEN fastread := FALSE
+$ GOSUB myread
+$ IF ans .EQS. "" THEN ans = dflt
+$ IF ans
+$ THEN
+$ echo4 "Okay, continuing."
+$ ELSE
+$ echo4 "Okay, bye."
+$ DELETE/NOLOG/NOCONFIRM []ver.out;
+$ GOTO Clean_up
+$ ENDIF
+$ ENDIF
+$ DELETE/SYMBOL line
+$ DELETE/SYMBOL tmp
+$ ENDIF
+$ DELETE/NOLOG/NOCONFIRM []ver.out;
+$ ENDIF
$!: general instructions
$ needman = "true"
$ firsttime = "true"
@@ -626,6 +708,7 @@ $!
$ IF (needman)
$ THEN
$ TYPE SYS$INPUT:
+$ DECK
This installation shell script will examine your system and ask you questions
to determine how the perl5 package should be installed. If you get
@@ -634,16 +717,20 @@ process, edit something, then restart this process as you just did.
Many of the questions will have default answers in square
brackets; typing carriage return will give you the default.
+$ EOD
$ READ SYS$COMMAND/PROMPT="Type carriage return to continue " ans
$ TYPE SYS$INPUT:
+$ DECK
In a hurry? You may run '@Configure "-d"'. This will bypass nearly all
the questions and use the computed defaults (or the previous answers provided
there was already a config.sh file). Type '@Configure "-h"' for a list of
options.
+$ EOD
$ READ SYS$COMMAND/PROMPT="Type carriage return to continue " ans
$ TYPE SYS$INPUT:
+$ DECK
Much effort has been expended to ensure that this shell script will
run on any VMS system. If despite that it blows up on yours, your
@@ -651,6 +738,7 @@ best bet is to edit Configure.com and @ it again. Whatever problems
you have with Configure.com, let me (dan@sidhe.org) know how I blew
it.
+$ EOD
$!This installation script affects things in two ways:
$!
$!1) it may do direct variable substitutions on some of the files included
@@ -675,7 +763,7 @@ $ sharpbang = "$ "
$!: figure out how to guarantee sh startup !sfn
$!: find out where common programs are !sfn
$!loclist="awk/cat/comm/cp/echo/expr/find/grep/ln/ls/mkdir/rm/sed/sort/touch/tr/uniq"
-$!trylist="Mcc/byacc/cpp/csh/date/egrep/less/line/more/nroff/perl/pg/sendmail/test/uname"
+$!trylist="byacc/cpp/csh/date/egrep/less/line/more/nroff/perl/pg/sendmail/test/uname"
$! echo "I don't know where '$file' is, and my life depends on it."
$! echo "Go find a public domain implementation or fix your PATH setting!"
$! echo ""
@@ -699,15 +787,49 @@ $ configshfound = F$SEARCH(config_sh)
$ IF (configshfound.NES."") THEN GOTO Config_sh_found
$ ENDIF
$ IF (i.LT.max) THEN GOTO Config_sh_look
-$ IF (configshfound.EQS."") THEN GOTO Beyond_config_sh
+$! genconfig.pl has "osname='VMS'"
+$ osname = F$EDIT(F$GETSYI("NODE_SWTYPE"),"COLLAPSE")
+$ IF (configshfound.EQS."")
+$ THEN
+$ config_sh = "[-]config.sh" ! the fallback default
+$ GOTO Beyond_config_sh
+$ ENDIF
$Config_sh_found:
-$ echo ""
-$ echo "Fetching default answers from ''config_sh'..."
+$ IF F$TYPE(osname) .EQS. "" THEN osname = F$EDIT(F$GETSYI("NODE_SWTYPE"),"COLLAPSE")
+$ IF F$TYPE(config_dflt) .EQS. "" THEN config_dflt = "n"
+$ rp = "Shall I @ ''config_sh' for default answers? [''config_dflt'] "
+$ GOSUB myread
+$ IF ans .EQS. "" THEN ans = config_dflt
+$ IF ans
+$ THEN
+$ echo ""
+$ echo "Fetching default answers from ''config_sh'..."
+$!
+$! This @ is why config_sh must employ DCL syntax. Note that for
+$! symbols to be returned to this procedure they must be global.
+$! Which implies that assignments must be of the :== or == variety.
+$! Note further that the [-]config.sh file written by this procedure
+$! employs shell syntax. In order to convert shell syntax to DCL
+$! you might try:
+$!
+$! perl -ni -e "s/^#/!#/;s/='/==""/;s/'$/""/;print ""\$ $_"";" config.sh
+$!
+$! However, watch out for sig_nam, sig_nam_init, sig_num, startperl
+$! and any of the lower case double quoted variables such as the *format
+$! variables in such a config."sh".
+$!
+$ @'config_sh'
+$!
+$ ENDIF
+$ DELETE/SYMBOL config_dflt
+$!
$!we actually do not have "hints/" for VMS
$! TYPE SYS$INPUT:
+$! DECK
$!
$!First time through, eh? I have some defaults handy for the following systems:
$!
+$! EOD
$! echo " ","VMS_VAX"
$! echo " ","VMS_AXP"
$! : Now look for a hint file osname_osvers, unless one has been
@@ -723,20 +845,20 @@ $Beyond_config_sh:
$!
$!: Restore computed paths !sfn
$!
-$! genconfig.pl has "osname='VMS'"
-$ osname = F$EDIT(F$GETSYI("NODE_SWTYPE"),"COLLAPSE")
$! %Config-I-VMS, a necessary error trap (could be PC running VCL)
$!
$ IF (osname .NES. "VMS")
$ THEN
$ echo4 "Hmm.. I wonder what ''osname' is (?)"
$ TYPE SYS$INPUT:
+$ DECK
%Config-E-VMS, ERROR:
Err, you do not appear to be running VMS!
This procedure is intended to Configure the building of Perl for VMS.
+$ EOD
$ READ SYS$COMMAND/PROMPT="Continue anyway? [n] " ans
$ IF ans
$ THEN
@@ -750,11 +872,13 @@ $ ENDIF
$ ELSE !we are on VMS huzzah!
$ IF .NOT.silent
$ THEN TYPE SYS$INPUT:
+$ DECK
Configure uses the operating system name and version to set some defaults.
The default value is probably right if the name rings a bell. Otherwise,
since spelling matters for me, either accept the default or answer "none"
to leave it blank.
+$ EOD
$ ENDIF
$ rp = "Operating system name? [''osname'] "
$ GOSUB myread
@@ -768,9 +892,7 @@ $ ENDIF
$ ENDIF !(osname .NES./.EQS. "VMS")
$!
$!: who configured the system
-$! see 'user' above.
$ cf_by = F$EDIT(user,"LOWERCASE")
-$! cf_time = F$CVTIME() !superceded by procedure below
$ osvers = F$EDIT(F$GETSYI("VERSION"),"TRIM")
$!
$! Peter Prymmer has seen:
@@ -793,7 +915,6 @@ $! "WIN$Time_Zone"
$!
$! This snippet o' DCL returns a string in default Unix `date` format,
$! and it will prompt to set SYS$TIMEZONE_DIFFERENTIAL.
-$! Peter Prymmer pvhp@lns62.lns.cornell.edu
$!
$ MIN_TZO = -840 !units are minutes here
$ MAX_TZO = 840
@@ -832,7 +953,6 @@ $ tzhour = -1*tzhour !keeps !UL happy
$ direction = "west of "
$ ENDIF
$ echo ""
-$ echo "%Config-I-VMS,"
$ echo "According to the setting of your ""SYS$TIMEZONE_DIFFERENTIAL"" (= ''systz')"
$ IF tzminrem.ne.0
$ THEN
@@ -842,7 +962,7 @@ $ tzspan = "''tzhour' hours"
$ ENDIF
$ dflt = "y"
$ echo "Your system is ''tzspan' ''direction'UTC in England."
-$ rp = "%Config-I-VMS, (''systz') Is this UTC Time Zone Offset correct? [''dflt'] "
+$ rp = "(''systz') Is this UTC Time Zone Offset correct? [''dflt'] "
$ GOSUB myread
$ IF ans.OR.(ans.EQS."")
$ THEN
@@ -852,7 +972,6 @@ $ GOTO Beyond_TimeZone
$ ENDIF
$ ELSE
$ echo ""
-$ echo4 "%Config-I-VMS,"
$ echo4 """SYS$TIMEZONE_DIFFERENTIAL"" does not appear to be DEFINEd on your system"
$ ENDIF
$!
@@ -899,6 +1018,8 @@ $ cf_time = "''wkday' ''mon' ''mday' ''hour':''min':''sec' ''tz' ''year'"
$!
$!: determine the architecture name
$! genconfig.pl has either archname='VMS_AXP' or 'VMS_VAX'
+$! Note that DCL in VMS V5.4 does not have F$GETSYI("ARCH_NAME")
+$! but does have F$GETSYI("HW_MODEL").
$!
$ IF (F$GETSYI("HW_MODEL") .LT. 1024)
$ THEN
@@ -923,7 +1044,9 @@ $ echo4 "I'll go with ''archname' anyway..."
$ ENDIF
$ ENDIF
$ dflt = "n"
-$ rp = "Will you be sharing your PERL_ROOT with ''otherarch'? [''dflt'] "
+$ vms_prefix = "perl_root"
+$ vms_prefixup = F$EDIT(vms_prefix,"UPCASE")
+$ rp = "Will you be sharing your ''vms_prefixup' with ''otherarch'? [''dflt'] "
$ GOSUB myread
$ if ans.NES.""
$ THEN
@@ -946,22 +1069,26 @@ $!: 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 + ".]"
+$ IF F$TYPE(prefix) .EQS. ""
+$ THEN
+$ prefix = F$ENVIRONMENT("DEFAULT") - ".UU]" + "]"
+$ prefix = F$PARSE(prefix,,,,"NO_CONCEAL") - "][" - ".;"
+$ prefixbase = prefix - "]"
+$ prefix = prefixbase + ".]"
+$ ENDIF
+$ src = prefix
$!: 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 "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 "On ''osname' the prefix is used to DEFINE the ''vms_prefixup' 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' ] "
+$ rp = "Installation prefix to use (for ''vms_prefixup')? [ ''dflt' ] "
$ GOSUB myread
$ IF ans.NES.""
$ THEN
@@ -970,6 +1097,7 @@ $ IF F$LOCATE(".]",ans) .EQ. F$LENGTH(ans) THEN prefix = prefix - "]" + ".]"
$ ELSE
$ prefix = dflt
$ ENDIF
+$ perl_root = prefix
$!
$! Check here for pre-existing PERL_ROOT.
$! -> ask if removal desired.
@@ -979,7 +1107,7 @@ $!
$ vms_skip_install = "true"
$ dflt = "y"
$! echo ""
-$ rp = "%Config-I-VMS, Skip the remaining """"where install"""" questions? [''dflt'] "
+$ rp = "Skip the remaining """"where install"""" questions? [''dflt'] "
$ GOSUB myread
$ IF (.NOT.ans).AND.(ans.NES."") THEN vms_skip_install = "false"
$ IF (.NOT.vms_skip_install)
@@ -991,12 +1119,18 @@ $!: determine where private library files go
$!: Usual default is /usr/local/lib/perl5. Also allow things like
$!: /opt/perl/lib, since /opt/perl/lib/perl5 would be redundant.
$ IF .NOT.silent
-$ THEN TYPE SYS$INPUT:
+$ THEN
+$ TYPE SYS$INPUT:
+$ DECK
There are some auxiliary files for perl5 that need to be put into a
private library directory that is accessible by everyone.
+$ EOD
+$ ENDIF
+$ IF F$TYPE(privlib) .NES. ""
+$ THEN dflt = privlib
+$ ELSE dflt = "''vms_prefix':[lib]"
$ ENDIF
-$ dflt = prefix - ".]" + ".LIB]"
$ rp = "Pathname where the private library files will reside? "
$ rp = F$FAO("!AS!/!AS",rp,"[ ''dflt' ] ")
$ GOSUB myread
@@ -1013,12 +1147,12 @@ $ 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."
+$ echo "You may choose to write ''packageup'_SETUP.COM to assign a foreign"
+$ echo "symbol to invoke ''package', which is the usual method."
+$ echO "If you do not do so then you would need a DCL command verb at the"
+$ echo "process or the system wide level."
$ ENDIF
-$ rp = "Invoke perl as a global symbol foreign command [''dflt'] "
+$ rp = "Invoke perl as a global symbol foreign command? [''dflt'] "
$ GOSUB myread
$ IF (.NOT.ans).AND.(ans.NES."") THEN perl_symbol = "false"
$!
@@ -1028,11 +1162,11 @@ $ 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)."
+$ echo "Since you won't be using a symbol you must choose to put the ''packageup'"
+$ echo "verb in a per-process table or in the system wide DCLTABLES (which"
+$ echo "would require write privilege)."
$ ENDIF
-$ rp = "Invoke perl as a per process command verb [ ''dflt' ] "
+$ rp = "Invoke perl as a per process command verb? [ ''dflt' ] "
$ GOSUB myread
$ IF (.NOT.ans).AND.(ans.NES."")
$ THEN perl_verb = "DCLTABLES"
@@ -1045,7 +1179,7 @@ $ baserev="5.0"
$ revision = baserev - ".0"
$!: get the patchlevel
$ echo ""
-$ echo4 "Getting the current patchlevel..." !>&4
+$ echo4 "Getting the current patchlevel..."
$ patchlevel_h = F$SEARCH("[-]patchlevel.h")
$ IF (patchlevel_h.NES."")
$ THEN
@@ -1056,7 +1190,7 @@ $ got_api_version = "false"
$ got_api_subversion = "false"
$ OPEN/READONLY CONFIG 'patchlevel_h'
$Patchlevel_h_loop:
-$ READ/END_Of_File=Close_patch CONFIG line
+$ READ/END_Of_File=Close_patch/ERROR=Close_patch CONFIG line
$ IF ((F$LOCATE("#define PERL_VERSION",line).NE.F$LENGTH(line)).AND.(.NOT.got_patch))
$ THEN
$ line = F$EDIT(line,"COMPRESS, TRIM")
@@ -1087,12 +1221,20 @@ $ 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
+$ IF (.NOT. got_patch) .OR. -
+ (.NOT. got_sub) .OR. -
+ (.NOT. got_api_revision) .OR. -
+ (.NOT. got_api_version) .OR. -
+ (.NOT. got_api_subversion) -
+ THEN GOTO Patchlevel_h_loop
$Close_patch:
$ CLOSE CONFIG
-$ ELSE
-$ patchlevel="0"
-$ subversion="0"
+$ ELSE
+$ patchlevel="0"
+$ subversion="0"
+$ api_revision="0"
+$ api_version="0"
+$ api_subversion="0"
$ ENDIF
$ IF (F$STRING(subversion) .NES. "0")
$ THEN
@@ -1105,7 +1247,6 @@ $ version = revision + "_" + patchlevel + "_" + subversion
$!
$ IF (.NOT.vms_skip_install)
$ THEN
-$!: set the prefixup variable, to restore leading tilda escape !sfn
$!: set the prefixup variable, to restore leading tilde escape !sfn
$!
$!: determine where public architecture dependent libraries go
@@ -1115,12 +1256,18 @@ $ echo ""
$ echo "''package' contains architecture-dependent library files. If you are"
$ ENDIF
$ IF (.NOT.silent)
-$ THEN TYPE SYS$INPUT:
+$ THEN
+$ TYPE SYS$INPUT:
+$ DECK
sharing libraries in a heterogeneous environment, you might store
these files in a separate location. Otherwise, you can just include
them with the rest of the public library files.
+$ EOD
+$ ENDIF
+$ IF F$TYPE(archlib) .NES. ""
+$ THEN dflt = archlib
+$ ELSE dflt = privlib - "]" + "." + archname + "." + version + "]"
$ ENDIF
-$ dflt = privlib - "]" + "." + archname + "." + version + "]"
$ rp = "Where do you want to put the public architecture-dependent libraries? "
$ rp = F$FAO("!AS!/!AS",rp,"[ ''dflt' ] ")
$ GOSUB myread
@@ -1129,16 +1276,16 @@ $ THEN archlib = ans
$ ELSE archlib = dflt
$ ENDIF
$!
-$!: set up the script used to warn in case of inconsistency !sfn
-$!: function used to set $1 to $val !sfn
-$!
$ ENDIF !%Config-I-VMS, skip "where install" questions
+$!
$! This quotation from Configure has to be included on VMS:
+$!
$ TYPE SYS$INPUT:
+$ DECK
There is, however, a strange, musty smell in the air that reminds me of
something...hmm...yes...I've got it...there's a VMS nearby, or I'm a Blit.
-$ CONTINUE
+$ EOD
$ IF (.NOT.vms_skip_install)
$ THEN
$!: it so happens the Eunice I know will not run shell scripts in Unix format
@@ -1148,14 +1295,20 @@ $!: now see if they want to do setuid emulation !sfn
$!
$!: determine where site specific libraries go.
$ IF .NOT.silent
-$ THEN TYPE SYS$INPUT:
+$ THEN
+$ TYPE SYS$INPUT:
+$ DECK
The installation process will also create a directory for
site-specific extensions and modules. Some users find it convenient
to place all local files in this directory rather than in the main
distribution directory.
+$ EOD
+$ ENDIF
+$ IF F$TYPE(sitelib) .NES. ""
+$ THEN dflt = sitelib
+$ ELSE dflt = privlib - "]" + ".SITE_PERL]"
$ ENDIF
-$ dflt = privlib - "]" + ".SITE_PERL]"
$ rp = "Pathname for the site-specific library files? "
$ rp = F$FAO("!AS!/!AS",rp,"[ ''dflt' ] ")
$ GOSUB myread
@@ -1167,11 +1320,16 @@ $!
$!: determine where site specific architecture-dependent libraries go.
$ IF .NOT.silent
$ THEN TYPE SYS$INPUT:
+$ DECK
The installation process will also create a directory for
architecture-dependent site-specific extensions and modules.
+$ EOD
+$ ENDIF
+$ IF F$TYPE(sitearch) .NES. ""
+$ THEN dflt = sitearch
+$ ELSE dflt = sitelib - "]" + "." + archname + "]"
$ ENDIF
-$ dflt = sitelib - "]" + "." + archname + "]"
$ rp = "Pathname for the site-specific architecture-dependent library files? "
$ rp = F$FAO("!AS!/!AS",rp,"[ ''dflt' ] ")
$ GOSUB myread
@@ -1183,7 +1341,11 @@ $!
$!: determine where old public architecture dependent libraries might be
$!
$!: determine where public executables go
-$ dflt = prefix - ".]" + ".BIN]"
+$ IF F$TYPE(bin) .NES. ""
+$ THEN dflt = bin
+$! ELSE dflt = prefix - ".]" + ".BIN]"
+$ ELSE dflt = "/''vms_prefix'/000000"
+$ ENDIF
$ rp = "Pathname where the public executables will reside? "
$ rp = F$FAO("!AS!/!AS",rp,"[ ''dflt' ] ")
$ GOSUB myread
@@ -1199,8 +1361,57 @@ $!: determine where library module manual pages go
$!: What suffix to use on installed man pages
$!: see what memory models we can support
$!
+$ ELSE ! skipping "where install" questions, we must set some symbols
+$ IF F$TYPE(archlib).EQS."" THEN -
+ archlib="''vms_prefix':[lib.''archname'.''version']"
+$ IF F$TYPE(bin) .EQS. "" THEN -
+ bin="/''vms_prefix'/000000"
+$ IF F$TYPE(privlib) .EQS. "" THEN -
+ privlib ="''vms_prefix':[lib]"
+$ IF F$TYPE(sitearch) .EQS. "" THEN -
+ sitearch="''vms_prefix':[lib.site_perl.''archname']"
+$ IF F$TYPE(sitelib) .EQS. "" THEN -
+ sitelib ="''vms_prefix':[lib.site_perl]"
$ ENDIF !%Config-I-VMS, skip "where install" questions
$!
+$! These derived locations can be set whether we've opted to
+$! skip the where install questions or not.
+$!
+$ IF F$TYPE(archlibexp) .EQS. "" THEN -
+ archlibexp="''vms_prefix':[lib.''archname'.''version']"
+$ IF F$TYPE(binexp) .EQS. "" THEN -
+ binexp ="''vms_prefix':[000000]"
+$ IF F$TYPE(builddir) .EQS. "" THEN -
+ builddir ="''vms_prefix':[000000]"
+$ IF F$TYPE(installarchlib) .EQS. "" THEN -
+ installarchlib="''vms_prefix':[lib.''archname'.''version']"
+$ IF F$TYPE(installbin) .EQS. "" THEN -
+ installbin ="''vms_prefix':[000000]"
+$ IF F$TYPE(installscript) .EQS. "" THEN -
+ installscript ="''vms_prefix':[utils]"
+$ IF F$TYPE(installman1dir) .EQS. "" THEN -
+ installman1dir ="''vms_prefix':[man.man1]"
+$ IF F$TYPE(installman3dir) .EQS. "" THEN -
+ installman3dir ="''vms_prefix':[man.man3]"
+$ IF F$TYPE(installprivlib) .EQS. "" THEN -
+ installprivlib ="''vms_prefix':[lib]"
+$ IF F$TYPE(installsitearch) .EQS. "" THEN -
+ installsitearch="''vms_prefix':[lib.site_perl.''archname']"
+$ IF F$TYPE(installsitelib) .EQS. "" THEN -
+ installsitelib ="''vms_prefix':[lib.site_perl]"
+$ IF F$TYPE(oldarchlib) .EQS. "" THEN -
+ oldarchlib="''vms_prefix':[lib.''archname']"
+$ IF F$TYPE(oldarchlibexp) .EQS. "" THEN -
+ oldarchlibexp="''vms_prefix':[lib.''archname']"
+$ IF F$TYPE(privlibexp) .EQS. "" THEN -
+ privlibexp ="''vms_prefix':[lib]"
+$ IF F$TYPE(sitearchexp) .EQS. "" THEN -
+ sitearchexp ="''vms_prefix':[lib.site_perl.''archname']"
+$ IF F$TYPE(sitelib_stem) .EQS. "" THEN -
+ sitelib_stem ="''vms_prefix':[lib.site_perl]"
+$ IF F$TYPE(sitelibexp) .EQS. "" THEN -
+ sitelibexp ="''vms_prefix':[lib.site_perl]"
+$!
$!: see if we need a special compiler
$! cc_list = "cc/decc|gcc" !%Config-I-VMS, compiler symbols/commands
$!
@@ -1209,7 +1420,9 @@ $ vms_cc_dflt = ""
$ vms_cc_available = ""
$!
$ OPEN/WRITE CONFIG ccvms.c
+$ WRITE CONFIG "#ifdef __DECC"
$ WRITE CONFIG "#include <stdlib.h>" !DECC is sooo picky
+$ WRITE CONFIG "#endif"
$ WRITE CONFIG "#include <stdio.h>"
$ WRITE CONFIG "int main() {"
$ WRITE CONFIG "#ifdef __DECC"
@@ -1228,8 +1441,6 @@ $ tmp = $status
$! DEASSIGN SYS$OUTPUT
$! DEASSIGN SYS$ERROR
$ IF (silent) THEN GOSUB Shut_up
-$! echo "%Config-I-VMS, After cc compile $status = >''tmp'<" !diagnostic
-$!
$ IF tmp.NE.%X10B90001
$ THEN
$ IF tmp.NE.%X10000001
@@ -1241,28 +1452,26 @@ $ ENDIF
$!
$ GOSUB List_Parse
$ IF .NOT.silent THEN echo ""
-$ echo "%Config-I-VMS, Default ""cc"" is ''line' ''archsufx' ''F$GETSYI("VERSION")'"
+$ echo "Default ""cc"" is ''line' ''archsufx' ''F$GETSYI("VERSION")'"
$ IF F$LOCATE("VAX",line).NE.F$LENGTH(line)
$ THEN
$ IF .NOT.silent
$ THEN
-$ echo "%Config-I-VMS, Will try cc/decc..."
+$ echo "Will try cc/decc..."
$ ENDIF
-$ DEFINE SYS$ERROR _NLA0:
-$ DEFINE SYS$OUTPUT _NLA0:
+$ DEFINE/USER_MODE SYS$ERROR NL:
+$ DEFINE/USER_MODE SYS$OUTPUT NL:
$ SET NOON
$ cc/decc/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."
+$ echo "Apparently you don't have that one."
$ ELSE
$ GOSUB List_parse
-$ echo "%Config-I-VMS, You also have: ''line' ''archsufx' ''F$GETSYI("VERSION")'"
+$ echo "You also have: ''line' ''archsufx' ''F$GETSYI("VERSION")'"
$ vms_cc_available = vms_cc_available + "cc/decc "
$ ENDIF
$ ELSE
@@ -1274,20 +1483,19 @@ $ ENDIF
$ ENDIF
$!
$Gcc_initial_check:
-$ echo "%Config-I-VMS, Checking for Gcc"
+$ echo "Checking for gcc"
$ OPEN/WRITE CONFIG gccvers.lis
-$ DEFINE SYS$ERROR CONFIG
-$ DEFINE SYS$OUTPUT CONFIG
+$ DEFINE/USER_MODE SYS$ERROR CONFIG
+$ DEFINE/USER_MODE SYS$OUTPUT CONFIG
$ 'gcc_symbol'/noobj/version _nla0:
$ tmp = $status
-$ DEASSIGN SYS$OUTPUT
-$ DEASSIGN SYS$ERROR
$ IF (silent) THEN GOSUB Shut_up
$ CLOSE CONFIG
$ IF (tmp.NE.%X10000001).and.(tmp.ne.%X00030001)
$ THEN
-$ echo "%Config-I-VMS, Symbol ""''gcc_symbol'"" is not defined. I guess you don't have it."
-$ goto cc_cleanup
+$ echo "Symbol ""''gcc_symbol'"" is not defined. I guess you do not have it."
+$ DELETE/NOLOG/NOCONFIRM gccvers.lis;
+$ GOTO Cxx_initial_check
$ ENDIF
$ OPEN/READ CONFIG gccvers.lis
$GCC_List_Read:
@@ -1299,12 +1507,93 @@ $ echo line
$ vms_cc_available = vms_cc_available + "''gcc_symbol' "
$ DELETE/NOLOG/NOCONFIRM gccvers.lis;
$!
+$Cxx_initial_check:
+$!
+$! Do note that [vms]perl source files have a ways to go before they will
+$! compile under CXX.
+$! In order to test Configure.com with CXX invoke it with "-Dtry_cxx" on
+$! the command line.
+$!
+$ IF F$TYPE(try_cxx) .EQS. "" THEN try_cxx := n
+$ IF try_cxx .OR. try_cxx .EQS. "define"
+$!
+$ THEN
+$!
+$ echo "Checking for CXX..."
+$ OPEN/WRITE CONFIG ccvms.c
+$ WRITE CONFIG "#include <iostream>"
+$ WRITE CONFIG "int main() {"
+$ WRITE CONFIG "#ifdef __DECCXX"
+$ WRITE CONFIG " cout << __DECCXX, endl;"
+$ WRITE CONFIG "#else"
+$ WRITE CONFIG " cout << 0,endl;"
+$ WRITE CONFIG "#endif"
+$! Todo: add G++ identifier check ??
+$ WRITE CONFIG " return(0);"
+$ WRITE CONFIG "}"
+$ CLOSE CONFIG
+$ SET NOON
+$ DEFINE/USER_MODE SYS$OUTPUT NL:
+$ DEFINE/USER_MODE SYS$ERROR NL:
+$ cxx ccvms.c
+$ tmp = $status
+$ SET ON
+$! success $status with:
+$! DEC C++ V1.1-001 on VMS VAX V5.5-2
+$! DEC C++ V5.6-013 on OpenVMS VAX V7.1
+$! DEC C++ V6.1-003 on OpenVMS Alpha V7.1
+$! Compaq C++ V6.2-016 for OpenVMS Alpha V7.2-1
+$ IF tmp .eq. %X15F60001
+$ THEN
+$! Which linker?
+$ SET NOON
+$ DEFINE/USER_MODE SYS$OUTPUT NL:
+$ DEFINE/USER_MODE SYS$ERROR NL:
+$ link ccvms.obj
+$ tmp = $status
+$ SET ON
+$ ! success $status with:
+$ ! link && DEC C++ V1.1-001 on VMS VAX V5.5-2
+$ ! link && DEC C++ V5.6-013 on OpenVMS VAX V7.1
+$ IF tmp .eq. %X10000001
+$ THEN
+$ ld_try = "Link"
+$ vms_cc_available = vms_cc_available + "cxx "
+$ echo "CXX and LINK are available."
+$ ELSE
+$ IF F$SEARCH("ccvms.exe") .NES. "" THEN DELETE/NOLOG/NOCONFIRM ccvms.exe;
+$ SET NOON
+$ DEFINE/USER_MODE SYS$OUTPUT NL:
+$ DEFINE/USER_MODE SYS$ERROR NL:
+$ cxxlink ccvms.obj
+$ tmp = $status
+$ SET ON
+$ ! success $status with:
+$ ! cxxlink && DEC C++ V6.1-003 on OpenVMS Alpha V7.1
+$ ! cxxlink && Compaq C++ V6.2-016 for OpenVMS Alpha V7.2-1
+$ IF tmp .eq. %X10000001
+$ THEN
+$ ld_try = "cxxlink"
+$ vms_cc_available = vms_cc_available + "cxx "
+$ echo "CXX and CXXLINK are available."
+$ ENDIF
+$ ENDIF
+$ IF F$SEARCH("ccvms.exe") .NES. "" THEN DELETE/NOLOG/NOCONFIRM ccvms.exe;
+$ ELSE
+$ echo "Nope."
+$ ENDIF
+$ DELETE/NOLOG/NOCONFIRM ccvms.c;
+$ IF F$SEARCH("ccvms.obj") .NES. "" THEN DELETE/NOLOG/NOCONFIRM ccvms.obj;
+$ CALL Cxx_demangler_cleanup
+$!
+$ ENDIF ! 1 .eq. 0 or 1 .eq. 1
+$!
$CC_Cleanup:
$ DELETE/NOLOG/NOCONFIRM ccvms.*;
$CC_Desired:
$!: see if we need a special compiler
$! echo ""
-$ echo "%Config-I-VMS, available compiler(s):"
+$ echo "Available compiler(s):"
$ echo "( ''vms_cc_available')"
$ IF .NOT.nocc
$ THEN
@@ -1321,42 +1610,53 @@ $ Mcc = 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"
+$! CPQ ?
+$ ccname := DEC
$ C_COMPILER_Replace = "CC=cc=''Mcc'"
$ ENDIF
-$ IF Mcc.NES.dflt
+$ IF F$LOCATE("cxx",F$EDIT(ans,"COLLAPSE,LOWERCASE")) .NE. F$LENGTH(ans)
$ THEN
-$ IF (F$LOCATE("dec",dflt).NE.F$LENGTH(dflt)).or(F$LOCATE("compaq",dflt).NE.F$LENGTH(dflt))
-$ THEN
-$ C_COMPILER_Replace = "CC=cc=''Mcc'"
-$ ELSE
-$ Using_Dec_C = "Yes"
-$ ENDIF
-$ ELSE
-$ IF Mcc .EQS. "cc/decc"
+$ Mcc = "cxx"
+$ ccname := CXX
+$ ld = ld_try
+$ C_COMPILER_Replace = "CC=cc=''Mcc'"
+$ ELSE ! Not_cxx
+$ IF Mcc.NES.dflt
$ THEN
-$ Using_Dec_C = "Yes"
-$ C_COMPILER_Replace = "CC=cc=''Mcc'"
+$ IF F$LOCATE("dec",dflt) .NE. F$LENGTH(dflt) .or. -
+ F$LOCATE("compaq",dflt) .NE. F$LENGTH(dflt)
+$ THEN
+$ C_COMPILER_Replace = "CC=cc=''Mcc'"
+$ ELSE
+$ ccname := DEC
+$ ENDIF
+$ ELSE
+$ IF Mcc .EQS. "cc/decc"
+$ THEN
+$ ccname := DEC
+$ C_COMPILER_Replace = "CC=cc=''Mcc'"
+$ ENDIF
$ ENDIF
$ ENDIF
$ ELSE
$ Mcc = dflt
$ IF Mcc .EQS. "cc/decc"
$ THEN
-$ Using_Dec_C = "Yes"
+$ ccname := DEC
$ C_COMPILER_Replace = "CC=cc=''Mcc'"
$ ENDIF
$ IF Mcc .EQS. "gcc"
$ THEN
-$ Using_Gnu_C = "Yes"
+$ ccname := GCC
$ C_COMPILER_Replace = "CC=cc=''Mcc'"
$ ENDIF
$ ENDIF
$Decc_Version_check:
-$ IF "''Using_Dec_C'".EQS."Yes"
+$ ccversion=""
+$ IF ccname .EQS. "DEC"
$ THEN
$ echo ""
-$ echo4 "Checking for Dec C's version number..." !>&4
+$ echo4 "Checking for the Dec C version number..."
$ OPEN/WRITE CONFIG deccvers.c
$ WRITE CONFIG "#include <stdlib.h>" !DECC is sooo picky
$ WRITE CONFIG "#include <stdio.h>"
@@ -1371,153 +1671,219 @@ $ WRITE CONFIG "#endif"
$ WRITE CONFIG " exit(0);"
$ WRITE CONFIG "}"
$ CLOSE CONFIG
-$ DEFINE SYS$ERROR _NLA0:
-$ DEFINE SYS$OUTPUT _NLA0:
+$ SET NOON
+$ DEFINE/USER_MODE SYS$ERROR NL:
+$ DEFINE/USER_MODE SYS$OUTPUT NL:
$ 'Mcc' deccvers.c
$ tmp = $status
-$ DEASSIGN SYS$ERROR _NLA0:
-$ DEASSIGN SYS$OUTPUT _NLA0:
$ IF (silent) THEN GOSUB Shut_up
-$ DEFINE SYS$ERROR _NLA0:
-$ DEFINE SYS$OUTPUT _NLA0:
+$ DEFINE/USER_MODE SYS$ERROR NL:
+$ DEFINE/USER_MODE SYS$OUTPUT NL:
$ link deccvers.obj
$ tmp = $status
-$ DEASSIGN SYS$ERROR
-$ DEASSIGN SYS$OUTPUT
$ IF (silent) THEN GOSUB Shut_up
$ OPEN/WRITE CONFIG deccvers.out
-$ DEFINE SYS$ERROR CONFIG
-$ DEFINE SYS$OUTPUT CONFIG
+$ DEFINE/USER_MODE SYS$ERROR CONFIG
+$ DEFINE/USER_MODE SYS$OUTPUT CONFIG
$ mcr []deccvers.exe
$ tmp = $status
+$ SET ON
$ CLOSE CONFIG
-$ DEASSIGN SYS$OUTPUT
-$ DEASSIGN SYS$ERROR
$ IF (silent) THEN GOSUB Shut_up
$ OPEN/READ CONFIG deccvers.out
$ READ/END_OF_FILE=Dec_c_cleanup CONFIG line
$Dec_c_cleanup:
$ CLOSE CONFIG
-$! DELETE/NOLOG/NOCONFIRM deccvers.*;
$ echo "You are using Dec C ''line'"
-$ Dec_C_Version = line
-$ Dec_C_Version = Dec_C_Version + 0
-$ if Dec_C_Version.ge.60200000 THEN CC_FLAGS = CC_FLAGS + "/NOANSI_ALIAS"
+$ ccversion = line
+$ Dec_C_Version = F$INTEGER(line)
+$ IF Dec_C_Version .GE. 60200000
+$ THEN
+$ echo4 "adding /NOANSI_ALIAS qualifier to ccflags."
+$ ccflags = ccflags + "/NOANSI_ALIAS"
+$ ENDIF
+$ DELETE/NOLOG/NOCONFIRM deccvers.*;
$ ENDIF
$Gcc_check:
-$ if "''using_gnu_c'" .eqs. "Yes"
+$ gccversion = ""
+$ IF ccname .EQS. "GCC"
$ THEN
-$ vaxcrtl_olb = F$SEARCH("SYS$LIBRARY:VAXCRTL.OLB")
-$ vaxcrtl_exe = F$SEARCH("SYS$SHARE:VAXCRTL.EXE")
-$ gcclib_olb = F$SEARCH("GNU_CC:[000000]GCCLIB.OLB")
-$ IF gcclib_olb .EQS. ""
-$ THEN
-$! These objects/libs come w/ gcc 2.7.2 for AXP:
-$ tmp = F$SEARCH("GNU_CC:[000000]libgcc2.olb")
-$ IF tmp .NES. "" then gcclib_olb = tmp
-$ tmp = F$SEARCH("GNU_CC:[000000]libgcclib.olb")
-$ IF tmp .NES. ""
+$ vaxcrtl_olb = F$SEARCH("SYS$LIBRARY:VAXCRTL.OLB")
+$ vaxcrtl_exe = F$SEARCH("SYS$SHARE:VAXCRTL.EXE")
+$ gcclib_olb = F$SEARCH("GNU_CC:[000000]GCCLIB.OLB")
+$ IF gcclib_olb .EQS. ""
$ THEN
-$ IF gcclib_olb .EQS. ""
-$ THEN gcclib_olb = tmp
-$ ELSE gcclib_olb = gcclib_olb + "/lib," + tmp
+$! These objects/libs come w/ gcc 2.7.2 for AXP:
+$ tmp = F$SEARCH("GNU_CC:[000000]libgcc2.olb")
+$ IF tmp .NES. "" then gcclib_olb = tmp
+$ tmp = F$SEARCH("GNU_CC:[000000]libgcclib.olb")
+$ IF tmp .NES. ""
+$ THEN
+$ IF gcclib_olb .EQS. ""
+$ THEN gcclib_olb = tmp
+$ ELSE gcclib_olb = gcclib_olb + "/lib," + tmp
+$ ENDIF
$ ENDIF
-$ ENDIF
-$ tmp = F$SEARCH("SYS$LIBRARY:VAXCRTL.OLB")
-$ IF tmp .NES. ""
-$ THEN
-$ IF gcclib_olb .EQS. ""
-$ THEN gcclib_olb = tmp
-$ ELSE gcclib_olb = gcclib_olb + "/lib," + tmp
+$ tmp = F$SEARCH("SYS$LIBRARY:VAXCRTL.OLB")
+$ IF tmp .NES. ""
+$ THEN
+$ IF gcclib_olb .EQS. ""
+$ THEN gcclib_olb = tmp
+$ ELSE gcclib_olb = gcclib_olb + "/lib," + tmp
+$ ENDIF
$ ENDIF
-$ ENDIF
-$ tmp = F$SEARCH("GNU_CC:[000000]crt0.obj")
-$ IF tmp .NES. ""
-$ THEN
-$ IF gcclib_olb .EQS. ""
-$ THEN gcclib_olb = tmp
-$ ELSE gcclib_olb = gcclib_olb + "/lib," + tmp
+$ tmp = F$SEARCH("GNU_CC:[000000]crt0.obj")
+$ IF tmp .NES. ""
+$ THEN
+$ IF gcclib_olb .EQS. ""
+$ THEN gcclib_olb = tmp
+$ ELSE gcclib_olb = gcclib_olb + "/lib," + tmp
+$ ENDIF
$ ENDIF
+$ IF gcclib_olb .EQS. vaxcrtl_olb THEN gcclib_olb = "" !goofy order of axplibs
+$ ELSE
+$ gcclib_olb = gcclib_olb + "/lib"
$ ENDIF
-$ IF gcclib_olb .EQS. vaxcrtl_olb THEN gcclib_olb = "" !goofy order of axplibs
-$ ELSE
-$ gcclib_olb = gcclib_olb + "/lib"
-$ ENDIF
-$ IF gcclib_olb .NES. "" .AND. -
+$ IF gcclib_olb .NES. "" .AND. -
(vaxcrtl_olb .NES. "" .OR. -
vaxcrtl_exe .NES. "" )
+$ THEN
+$ echo ""
+$ echo4 "Checking for GNU cc in disguise and/or its version number..." !>&4
+$ OPEN/WRITE CONFIG gccvers.c
+$ WRITE CONFIG "#include <stdio.h>"
+$ WRITE CONFIG "int main() {"
+$ WRITE CONFIG "#ifdef __GNUC__"
+$ WRITE CONFIG "#ifdef __VERSION__"
+$ WRITE CONFIG " printf(""%s\n"", __VERSION__);"
+$ WRITE CONFIG "#else"
+$ WRITE CONFIG " printf(""%s\n"", ""1"");"
+$ WRITE CONFIG "#endif"
+$ WRITE CONFIG "#endif"
+$ WRITE CONFIG " exit(0);"
+$ WRITE CONFIG "}"
+$ CLOSE CONFIG
+$ DEFINE SYS$ERROR _NLA0:
+$ DEFINE SYS$OUTPUT _NLA0:
+$ 'Mcc' gccvers.c
+$ tmp = $status
+$ DEASSIGN SYS$ERROR _NLA0:
+$ DEASSIGN SYS$OUTPUT _NLA0:
+$ IF (silent) THEN GOSUB Shut_up
+$ DEFINE SYS$ERROR _NLA0:
+$ DEFINE SYS$OUTPUT _NLA0:
+$ IF vaxcrtl_exe .EQS. ""
+$ THEN
+$ IF F$LOCATE("VAXCRTL",gcclib_olb).NE.F$LENGTH(gcclib_olb)
+$ THEN
+$ link gccvers.obj,'gcclib_olb',SYS$LIBRARY:VAXCRTL/Library
+$ tmp = $status
+$ ELSE
+$ link gccvers.obj,'gcclib_olb'
+$ tmp = $status
+$ ENDIF
+$ ELSE
+$ OPEN/WRITE CONFIG GCCVERS.OPT
+$ WRITE CONFIG "SYS$SHARE:VAXCRTL/SHARE"
+$ CLOSE CONFIG
+$ link gccvers.obj,GCCVERS.OPT/OPT,'gcclib_olb'
+$ tmp = $status
+$ ENDIF
+$ DEASSIGN SYS$ERROR
+$ DEASSIGN SYS$OUTPUT
+$ IF (silent) THEN GOSUB Shut_up
+$ OPEN/WRITE CONFIG gccvers.out
+$ DEFINE SYS$ERROR CONFIG
+$ DEFINE SYS$OUTPUT CONFIG
+$ mcr []gccvers.exe
+$ tmp = $status
+$ CLOSE CONFIG
+$ DEASSIGN SYS$OUTPUT
+$ DEASSIGN SYS$ERROR
+$ IF (silent) THEN GOSUB Shut_up
+$ OPEN/READ CONFIG gccvers.out
+$ READ/END_OF_FILE=Gcc_cleanup CONFIG line
+$Gcc_cleanup:
+$ CLOSE CONFIG
+$ DELETE/NOLOG/NOCONFIRM gccvers.*;
+$ IF F$LOCATE("GNU C version ",line).NE.F$LENGTH(line)
+$ THEN
+$ echo "You are not using GNU cc."
+$ GOTO Host_name
+$ ELSE
+$ echo "You are using GNU cc ''line'"
+$ gccversion = line
+$ ccname := "GCC"
+$ C_COMPILER_Replace = "CC=cc=''Mcc'"
+$ GOTO Include_dirs
+$ ENDIF
+$ ENDIF
+$ ENDIF
+$Cxx_Version_check:
+$ IF ccname .EQS. "CXX"
$ THEN
-$ echo ""
-$ echo4 "Checking for GNU cc in disguise and/or its version number..." !>&4
-$ OPEN/WRITE CONFIG gccvers.c
-$ WRITE CONFIG "#include <stdlib.h>" !DECC is sooo picky
+$ OPEN/WRITE CONFIG cxxvers.c
$ WRITE CONFIG "#include <stdio.h>"
$ WRITE CONFIG "int main() {"
-$ WRITE CONFIG "#ifdef __GNUC__"
-$ WRITE CONFIG "#ifdef __VERSION__"
-$ WRITE CONFIG " printf(""%s\n"", __VERSION__);"
+$ WRITE CONFIG "#ifdef __DECCXX_VER"
+$ WRITE CONFIG " printf(""%i\n"", __DECCXX_VER);"
$ WRITE CONFIG "#else"
-$ WRITE CONFIG " printf(""%s\n"", ""1"");"
-$ WRITE CONFIG "#endif"
+$ WRITE CONFIG " printf(""%i\n"", ""0"");"
$ WRITE CONFIG "#endif"
-$ WRITE CONFIG " exit(0);"
+$ WRITE CONFIG " return(0);"
$ WRITE CONFIG "}"
$ CLOSE CONFIG
-$ DEFINE SYS$ERROR _NLA0:
-$ DEFINE SYS$OUTPUT _NLA0:
-$ 'Mcc' gccvers.c
+$ SET NOON
+$ DEFINE/USER_MODE SYS$ERROR NL:
+$ DEFINE/USER_MODE SYS$OUTPUT NL:
+$ 'Mcc' cxxvers.c
$ tmp = $status
-$ DEASSIGN SYS$ERROR _NLA0:
-$ DEASSIGN SYS$OUTPUT _NLA0:
+$ SET ON
$ IF (silent) THEN GOSUB Shut_up
-$ DEFINE SYS$ERROR _NLA0:
-$ DEFINE SYS$OUTPUT _NLA0:
-$ IF vaxcrtl_exe .EQS. ""
-$ THEN
-$ IF F$LOCATE("VAXCRTL",gcclib_olb).NE.F$LENGTH(gcclib_olb)
-$ THEN
-$ link gccvers.obj,'gcclib_olb',SYS$LIBRARY:VAXCRTL/Library
-$ tmp = $status
-$ ELSE
-$ link gccvers.obj,'gcclib_olb'
-$ tmp = $status
-$ ENDIF
-$ ELSE
-$ OPEN/WRITE CONFIG GCCVERS.OPT
-$ WRITE CONFIG "SYS$SHARE:VAXCRTL/SHARE"
-$ CLOSE CONFIG
-$ link gccvers.obj,GCCVERS.OPT/OPT,'gcclib_olb'
-$ tmp = $status
-$ ENDIF
-$ DEASSIGN SYS$ERROR
-$ DEASSIGN SYS$OUTPUT
+$ SET NOON
+$ DEFINE/USER_MODE SYS$ERROR NL:
+$ DEFINE/USER_MODE SYS$OUTPUT NL:
+$ 'ld' cxxvers.obj
+$ tmp = $status
+$ SET ON
$ IF (silent) THEN GOSUB Shut_up
-$ OPEN/WRITE CONFIG gccvers.out
-$ DEFINE SYS$ERROR CONFIG
-$ DEFINE SYS$OUTPUT CONFIG
-$ mcr []gccvers.exe
+$ OPEN/WRITE CONFIG cxxvers.out
+$ SET NOON
+$ DEFINE/USER_MODE SYS$ERROR CONFIG
+$ DEFINE/USER_MODE SYS$OUTPUT CONFIG
+$ mcr []cxxvers.exe
$ tmp = $status
+$ SET ON
$ CLOSE CONFIG
-$ DEASSIGN SYS$OUTPUT
-$ DEASSIGN SYS$ERROR
$ IF (silent) THEN GOSUB Shut_up
-$ OPEN/READ CONFIG gccvers.out
-$ READ/END_OF_FILE=Gcc_cleanup CONFIG line
-$Gcc_cleanup:
+$ OPEN/READ CONFIG cxxvers.out
+$ READ/END_OF_FILE=Cxx_cleanup CONFIG line
+$Cxx_cleanup:
$ CLOSE CONFIG
-$ DELETE/NOLOG/NOCONFIRM gccvers.*;
-$ IF F$LOCATE("GNU C version ",line).NE.F$LENGTH(line)
-$ THEN
-$ echo "You are not using GNU cc."
-$ GOTO Host_name
-$ ELSE
-$ echo "You are using GNU cc ''line'"
-$ Using_Gnu_C = "Yes"
-$ C_COMPILER_Replace = "CC=cc=''Mcc'"
-$ GOTO Include_dirs
-$ ENDIF
+$ DELETE/NOLOG/NOCONFIRM cxxvers.*;
+$ echo "You are using CXX ''line'"
+$ cxxversion = line
+$ ccversion = line
+$ CALL Cxx_demangler_cleanup
$ ENDIF
-$endif
+$!
+$Cxx_demangler_cleanup: SUBROUTINE
+$!
+$! If we do build with CXX these demangler Dbs will be left all over.
+$! However, configure.com does try to remove the [.UU] sub directory.
+$! Be sure to set default to the correct place before calling this sub.
+$!
+$ SET NOON
+$ IF F$SEARCH("[.CXX_REPOSITORY]*.*") .NES. "" THEN DELETE/NOLOG/NOCONFIRM [.CXX_REPOSITORY]*.*;*
+$ IF F$SEARCH("CXX_REPOSITORY.DIR") .NES. ""
+$ THEN
+$ SET PROTECTION=(SYSTEM:RWED,OWNER:RWED) CXX_REPOSITORY.DIR
+$ DELETE/NOLOG/NOCONFIRM CXX_REPOSITORY.DIR;
+$ ENDIF
+$ SET ON
+$ EXIT
+$ ENDSUBROUTINE ! Cxx_demangler_cleanup
+$!
$ GOTO Host_name
$!
$List_Parse:
@@ -1542,7 +1908,7 @@ $ DELETE/NOLOG/NOCONFIRM ccvms.lis;
$ RETURN
$!
$Include_dirs:
-$!: What should the include directory be ?
+$!: What should the include directory be ? (.TLB text libraries)
$ dflt = gcclib_olb
$ rp = "Where are the include files you want to use? "
$ IF f$length( rp + "[''dflt'] " ).gt.76
@@ -1608,30 +1974,39 @@ $ ENDIF
$ myhostname = myhostname - mydomain
$ echo "(Trimming domain name from host name--host name is now ''myhostname')"
$ IF .NOT.silent
-$ THEN TYPE SYS$INPUT:
+$ THEN
+$ TYPE SYS$INPUT:
+$ DECK
I need to get your e-mail address in Internet format if possible, i.e.
something like user@host.domain. Please answer accurately since I have
no easy means to double check it. The default value provided below
is most probably close to the reality but may not be valid from outside
your organization...
+$ EOD
$ ENDIF
-$ dflt = "''cf_by'@''myhostname'"+"''mydomain'"
-$ rp = "What is your e-mail address? [''dflt'] "
-$ GOSUB myread
-$ IF ans .nes. ""
-$ THEN cf_email = ans
-$ ELSE cf_email = dflt
+$ IF F$TYPE(cf_email) .EQS. ""
+$ THEN
+$ dflt = "''cf_by'@''myhostname'"+"''mydomain'"
+$ rp = "What is your e-mail address? [''dflt'] "
+$ GOSUB myread
+$ IF ans .nes. ""
+$ THEN cf_email = ans
+$ ELSE cf_email = dflt
+$ ENDIF
$ ENDIF
$!
$ IF .NOT.silent
-$ THEN TYPE SYS$INPUT:
+$ THEN
+$ TYPE SYS$INPUT:
+$ DECK
If you or somebody else will be maintaining perl at your site, please
fill in the correct e-mail address here so that they may be contacted
if necessary. Currently, the "perlbug" program included with perl
will send mail to this address in addition to perlbug@perl.com. You may
enter "none" for no administrator.
+$ EOD
$ ENDIF
$ dflt = "''cf_email'"
$ rp = "Perl administrator e-mail address [''dflt'] "
@@ -1667,40 +2042,49 @@ $!: see if we have sigaction
$!: see whether socketshr exists
$ IF (F$SEARCH(F$PARSE("SocketShr","Sys$Share:.Exe")).NES."")
$ THEN
-$ has_socketshr = "T"
+$ Has_socketshr = "T"
$ echo ""
-$ echo4 "Hmm... Looks like you have SOCKETSHR's Berkeley networking support."
-$ endif
-$ if (Dec_C_Version .ge. 50200000)
+$ echo4 "Hmm... Looks like you have SOCKETSHR Berkeley networking support."
+$ ELSE
+$ Has_socketshr = "F"
+$ ENDIF
+$ IF (ccname .EQS. "DEC" .AND. Dec_C_Version .GE. 50200000) .OR. -
+ (ccname .EQS. "CXX")
$ THEN
$ Has_Dec_C_Sockets = "T"
$ echo ""
-$ echo4 "Hmm... Looks like you've got Dec C's Berkeley networking support."
+$ echo4 "Hmm... Looks like you have Dec C Berkeley networking support."
+$ ELSE
+$ Has_Dec_C_Sockets = "F"
$ ENDIF
$ ! Hey, we've got both. Default to Dec C, then, since it's better
-$ if ("''Has_socketshr'".eq."T") .or.("''has_dec_c_sockets'".eq."T")
+$ IF Has_socketshr .OR. Has_Dec_C_Sockets
$ THEN
$ echo ""
-$ echo "You've got sockets available. Which socket stack do you want to"
-$ echo "build into perl?"
-$ if "''has_dec_c_sockets'".eqs."T"
+$ echo "You have sockets available. Which socket stack do you want to"
+$ echo "build into Perl?"
+$ IF Has_Dec_C_Sockets
$ THEN
$ dflt = "DECC"
$ else
$ dflt = "SOCKETSHR"
$ endif
$ rp = "Choose socket stack (NONE"
-$ if "''has_socketshr'".eqs."T" THEN rp = rp + ",SOCKETSHR"
-$ if "''has_dec_c_sockets'".eqs."T" THEN rp = rp + ",DECC"
+$ IF Has_socketshr THEN rp = rp + ",SOCKETSHR"
+$ IF Has_Dec_C_Sockets THEN rp = rp + ",DECC"
$ rp = rp + ") [''dflt'] "
$ GOSUB myread
-$ IF "''ans'".eqs."" THEN ans = "''dflt'"
-$ has_dec_c_sockets = "F"
-$ has_socketshr = "F"
+$ IF ans .EQS. "" THEN ans = "''dflt'"
+$ Has_Dec_C_Sockets = "F"
+$ Has_socketshr = "F"
$ ans = F$EDIT(ans,"TRIM,COMPRESS,LOWERCASE")
-$ IF ans.eqs."decc" then has_dec_c_sockets = "T"
-$ IF ans.eqs."socketshr" then has_socketshr = "T"
-$ endif
+$ IF ans.eqs."decc" then Has_Dec_C_Sockets = "T"
+$ IF ans.eqs."socketshr" then Has_socketshr = "T"
+$ ENDIF
+$ IF Has_Dec_C_Sockets .or. Has_socketshr
+$ THEN
+$ static_ext = f$edit(static_ext+" "+"Socket","trim,compress")
+$ ENDIF
$!
$!
$! Ask if they want to build with VMS_DEBUG perl
@@ -1723,11 +2107,11 @@ $ ENDIF
$!
$! Ask if they want to build with DEBUGGING
$ echo ""
-$ echo "Perl can be built with extra runtime debugging enabled. This
-$ echo "enables the -D switch, at the cost of some performance. It
-$ echo "was mandatory on perl 5.005 and before on VMS, but is now
-$ echo "optional. If you don't generally use it you should probably
-$ echo "leave this off and gain a bit of extra speed.
+$ echo "Perl can be built with extra runtime debugging enabled. This"
+$ echo "enables the -D switch, at the cost of some performance. It"
+$ echo "was mandatory on perl 5.005 and before on VMS, but is now"
+$ echo "optional. If you do not generally use it you should probably"
+$ echo "leave this off and gain a bit of extra speed."
$ dflt = "y"
$ rp = "Build a DEBUGGING version of Perl? [''dflt'] "
$ GOSUB myread
@@ -1741,77 +2125,72 @@ $ 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."
+$ echo "Perl can be built so that multiple Perl interpreters can coexist"
+$ echo "within the same Perl executable."
+$ echo "There is some performance overhead, however, so you"
+$ echo "probably do not want to choose this unless you are going to be"
+$ echo "doing things with embedded perl."
$ dflt = "n"
-$ rp = "Build with MULTIPLICITY? [''dflt'] "
+$ rp = "Build Perl for multiplicity? [''dflt'] "
$ GOSUB myread
-$ if ans.eqs."" then ans = dflt
-$ IF F$EXTRACT(0, 1, F$EDIT(ans,"COLLAPSE,UPCASE")) .eqs. "Y"
+$ IF ans.eqs."" then ans = dflt
+$ IF ans
$ THEN
-$ use_multiplicity="Y"
+$ usemultiplicity="define"
$ ELSE
-$ use_multiplicity="N"
+$ usemultiplicity="undef"
$ 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")
+$ 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 "You can have native 64-bit long integers."
$ echo ""
-$ echo "Perl can be built to take advantage of 64-bit integer types
-$ echo "on some systems, which provide a much larger range for perl's
-$ echo "mathematical operations. (Note that does *not* enable 64-bit
+$ echo "Perl can be built to take advantage of 64-bit integer types"
+$ echo "on some systems, which provide a much larger range for perl's"
+$ echo "mathematical operations. (Note that does *not* enable 64-bit"
$ echo "fileops at the moment, as Dec C doesn't do that yet)."
-$ echo "Choosing this option will most probably introduce binary incompatibilities.
+$ echo "Choosing this option will most probably introduce binary incompatibilities."
$ echo ""
-$ echo "If this doesn't make any sense to you, just accept the default ''dflt'.
+$ echo "If this does not make any sense to you, just accept the default ''dflt'."
$ rp = "Try to use 64-bit integers, if available? [''dflt'] "
$ GOSUB myread
$ IF ans .EQS. "" THEN ans = dflt
-$ IF (f$extract(0, 1, f$edit(ans,"COLLAPSE,UPCASE")) .EQS. "Y")
-$ THEN
-$ use64bitint="Y"
-$ ELSE
-$ use64bitint="N"
+$ IF ans
+$ THEN use64bitint="Y"
+$ ELSE use64bitint="N"
$ ENDIF
$ IF (use64bitint)
$ THEN
$ dflt = use64bitall
$ echo ""
-$ echo "Since you chose 64-bitness you may want to try maximal 64-bitness.
-$ echo "What you have chosen is minimal 64-bitness which means just enough
-$ echo "to get 64-bit integers. The maximal means using as much 64-bitness
-$ echo "as is possible on the platform. This in turn means even more binary
-$ echo "incompatibilities. On the other hand, your platform may not have
-$ echo "any more maximal 64-bitness than what you already have chosen.
+$ echo "Since you chose 64-bitness you may want to try maximal 64-bitness."
+$ echo "What you have chosen is minimal 64-bitness which means just enough"
+$ echo "to get 64-bit integers. The maximal means using as much 64-bitness"
+$ echo "as is possible on the platform. This in turn means even more binary"
+$ echo "incompatibilities. On the other hand, your platform may not have"
+$ echo "any more maximal 64-bitness than what you already have chosen."
$ echo ""
-$ echo "If this doesn't make any sense to you, just accept the default ''dflt'.
+$ echo "If this does not make any sense to you, just accept the default ''dflt'."
$ rp = "Try to use full 64-bit support, if available? [''dflt'] "
$ GOSUB myread
$ IF ans .EQS. "" THEN ans = dflt
-$ IF (f$extract(0, 1, f$edit(ans,"COLLAPSE,UPCASE")) .EQS. "Y")
-$ THEN
-$ use64bitall="Y"
-$ ELSE
-$ use64bitall="N"
+$ IF ans
+$ THEN use64bitall="Y"
+$ ELSE use64bitall="N"
$ ENDIF
$ ENDIF
$ ENDIF ! AXP && >= 7.1
$!
$! Ask about threads, if appropriate
-$ if (Using_Dec_C.eqs."Yes")
+$ IF ccname .EQS. "DEC" .OR. ccname .EQS. "CXX"
$ THEN
$ echo ""
-$ echo "This version of Perl can be built with threads. While really nifty,
-$ echo "they are a beta feature, and there is a speed penalty for perl
-$ echo "programs if you build with threads *even if you don't use them*
+$ echo "This version of Perl can be built with threads. While really nifty,"
+$ echo "they are a beta feature, and there is a speed penalty for perl"
+$ echo "programs if you build with threads *even if you do not use them*."
$ dflt = "n"
$ rp = "Build with threads? [''dflt'] "
$ GOSUB myread
@@ -1819,22 +2198,21 @@ $ if ans.eqs."" then ans = dflt
$ if (f$extract(0, 1, "''ans'").eqs."Y").or.(f$extract(0, 1, "''ans'").eqs."y")
$ THEN
$ use_threads="T"
-$!
$ ! Shall we do the 5.005-stype threads, or IThreads?
-$ echo "As of 5.5.640, Perl has two different internal threading
-$ echo "implementations, the 5.005 version (5005threads) and an
-$ echo "interpreter-based version (ithreads) that has one
-$ echo "interpreter per thread. Both are very experimental. This
-$ echo "arrangement exists to help developers work out which one
-$ echo "is better.
-$ echo "
-$ echo "If you're a casual user, you probably don't want
-$ echo "interpreter-threads at this time. There doesn't yet exist
-$ echo "a way to create threads from within Perl in this model,
-$ echo "i.e., ""use Thread;"" will NOT work.
-$ echo "
+$ echo "As of 5.5.640, Perl has two different internal threading"
+$ echo "implementations, the 5.005 version (5005threads) and an"
+$ echo "interpreter-based version (ithreads) that has one"
+$ echo "interpreter per thread. Both are very experimental. This"
+$ echo "arrangement exists to help developers work out which one"
+$ echo "is better."
+$ echo ""
+$ echo "If you are a casual user, you probably do not want"
+$ echo "interpreter-threads at this time. There doesn't yet exist"
+$ echo "a way to create threads from within Perl in this model,"
+$ echo "i.e., ""use Thread;"" will NOT work."
+$ echo ""
$ dflt = "n"
-$ rp = "Build with Interpreter threads? [''dflt']
+$ rp = "Build with Interpreter threads? [''dflt'] "
$ GOSUB myread
$ if ans.eqs."" then ans = dflt
$ if (f$extract(0, 1, "''ans'").eqs."Y").or.(f$extract(0, 1, "''ans'").eqs."y")
@@ -1846,17 +2224,17 @@ $ 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")
+$ if (archname.eqs."VMS_AXP").and.("''f$extract(1,3, f$getsyi(""version""))'".ges."7.1")
$ THEN
$ echo ""
-$ echo "Threaded perl can be linked to use multiple kernel threads
-$ echo "and system upcalls on VMS 7.1+ on Alpha systems. This feature
-$ echo "allows multiple threads to execute simultaneously on an SMP
-$ echo "system as well as preventing a single thread from blocking
-$ echo "all the threads in a program, even on a single-processor
-$ echo "machine. Unfortunately this feature isn't safe on an
-$ echo "unpatched 7.1 system. (Several OS patches were required when
-$ echo "this procedure was written)
+$ echo "Threaded perl can be linked to use multiple kernel threads"
+$ echo "and system upcalls on VMS 7.1+ on Alpha systems. This feature"
+$ echo "allows multiple threads to execute simultaneously on an SMP"
+$ echo "system as well as preventing a single thread from blocking"
+$ echo "all the threads in a program, even on a single-processor"
+$ echo "machine. Unfortunately, this feature isn't safe on an"
+$ echo "unpatched 7.1 system (several OS patches were required when"
+$ echo "this procedure was written)."
$ dflt = "n"
$ rp = "Enable multiple kernel threads and upcalls? [''dflt'] "
$ gosub myread
@@ -1868,47 +2246,48 @@ $ ENDIF
$ ENDIF
$ ENDIF
$ ENDIF
-$ if archname .eqs. "VMS_AXP"
-$ then
-$!
+$ IF archname .EQS. "VMS_AXP"
+$ THEN
$! Case sensitive?
-$ echo ""
-$ echo "By default, perl (and pretty much everything else on VMS) uses
-$ echo "case-insensitive linker symbols. Which is to say, when the
-$ echo "underlying C code makes a call to a routine called Perl_foo in
-$ echo "the source, the name in the object modules or shareable images
-$ echo "is really PERL_FOO. There are some packages that use an
-$ echo "embedded perl interpreter that instead require case-sensitive
-$ echo "linker symbols.
-$ echo ""
-$ echo "If you have no idea what this means, and don't have
-$ echo "any program requiring anything, choose the default.
-$ dflt = be_case_sensitive
-$ rp = "Case-sensitive symbols [''dflt'] "
-$ gosub myread
-$ if ans.eqs."" then ans="''dflt'"
-$ be_case_sensitive = "''ans'"
-$!
+$ echo ""
+$ echo "By default, perl (and pretty much everything else on VMS) uses"
+$ echo "case-insensitive linker symbols. Which is to say, when the"
+$ echo "underlying C code makes a call to a routine called Perl_foo in"
+$ echo "the source, the name in the object modules or shareable images"
+$ echo "is really PERL_FOO. There are some packages that use an"
+$ echo "embedded perl interpreter that instead require case-sensitive"
+$ echo "linker symbols."
+$ echo ""
+$ echo "If you have no idea what this means, and do not have"
+$ echo "any program requiring anything, choose the default."
+$ dflt = be_case_sensitive
+$ rp = "Build with case-sensitive symbols? [''dflt'] "
+$ GOSUB myread
+$ IF ans .EQS. "" THEN ans="''dflt'"
+$ be_case_sensitive = "''ans'"
$! IEEE math?
-$ echo ""
-$ echo "Perl normally uses G_FLOAT format floating point numbers
-$ echo "internally, as do most things on VMS. You can, however, build
-$ echo "with IEEE floating point numbers instead if you need to.
-$ dflt = use_ieee_math
-$ rp = "Use IEEE math [''dflt'] "
-$ gosub myread
-$ if ans.eqs."" then ans="''dflt'"
-$ use_ieee_math = "''ans'"
-$ endif
+$ echo ""
+$ echo "Perl normally uses G_FLOAT format floating point numbers"
+$ echo "internally, as do most things on VMS. You can, however, build"
+$ echo "with IEEE floating point numbers instead if you need to."
+$ dflt = use_ieee_math
+$ rp = "Use IEEE math? [''dflt'] "
+$ GOSUB myread
+$ IF ans .eqs. "" THEN ans = "''dflt'"
+$ use_ieee_math = "''ans'"
+$ ENDIF
$! CC Flags
$ echo ""
-$ echo "You can, if you need to, pass extra flags on to the C
-$ echo "compiler. In general you should only do this if you really,
-$ echo "really know what you're doing.
+$ echo "Your compiler may want other flags. For this question you should include"
+$ echo "/INCLUDE=(whatever) and /DEFINE=(whatever), flags and any other flags"
+$ echo "or qualifiers used by the compiler."
+$ echo ""
+$ echo "To use no flags, specify the word ""none""."
$ dflt = user_c_flags
-$ rp = "Extra C flags [''dflt'] "
-$ gosub myread
-$ if ans.eqs."" then ans="''dflt'"
+$ rp = "Any additional cc flags? [''dflt'] "
+$ GOSUB myread
+$ IF ans .EQS. "" THEN ans = "''dflt'"
+$ IF ans .EQS. "none" THEN ans = ""
$ user_c_flags = "''ans'"
$!
$! Ask whether they want to use secure logical translation when tainting
@@ -1929,8 +2308,11 @@ $ 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"))
+$ IF ans .eqs. "" THEN ans = dflt
+$ IF ans
+$ THEN d_secintgenv := Y
+$ ELSE d_secintgenv := N
+$ ENDIF
$!
$! Ask whether they want to default filetypes
$ echo ""
@@ -1942,47 +2324,56 @@ $ 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"
+$ echo "This is currently broken in some configurations. Only enable it if"
+$ echo "you know what you are doing."
+$ dflt = "n"
$ rp = "Always use default file types? [''dflt'] "
$ GOSUB myread
-$ if ans.eqs."" then ans="''dflt'"
-$ d_alwdeftype = f$extract(0, 1, f$edit(ans,"COLLAPSE,UPCASE"))
-$!
+$ IF ans .EQS. "" THEN ans = dflt
+$ IF ans
+$ THEN d_alwdeftype := Y
+$ ELSE d_alwdeftype := N
+$ ENDIF
$! Ask if they want to use perl's memory allocator
$ echo ""
-$ echo "Perl has a built-in memory allocator that's tuned for perl's
-$ echo "normal memory usage. It's oftentimes better than the standard
-$ echo "system memory allocator. It also has the advantage of providing
-$ echo "memory allocation statistics, if you choose to enable them.
+$ echo "Perl has a built-in memory allocator that is tuned for normal"
+$ echo "memory usage. It is oftentimes better than the standard system"
+$ echo "memory allocator. It also has the advantage of providing memory"
+$ echo "allocation statistics, if you choose to enable them."
$ dflt = "n"
-$ rp = "Build with perl's memory allocator? [''dflt'] "
+$ IF F$TYPE(usemymalloc) .EQS. "STRING"
+$ THEN
+$ IF usemymalloc THEN dflt = "y"
+$ ENDIF
+$ rp = "Do you wish to attempt to use the malloc that comes with ''package'? [''dflt'] "
$ GOSUB myread
-$ if ans.eqs."" then ans="''dflt'"
-$ mymalloc = f$extract(0, 1, f$edit(ans,"COLLAPSE,UPCASE"))
-$ if mymalloc.eqs."Y"
+$ IF ans .eqs. "" THEN ans = dflt
+$ IF ans
+$ THEN mymalloc := Y
+$ ELSE mymalloc := N
+$ ENDIF
+$ IF mymalloc
$ THEN
-$ if use_debugging_perl.eqs."Y"
+$ IF use_debugging_perl
$ THEN
$ echo ""
-$ echo "Perl can keep statistics on memory usage if you choose to use
-$ echo "them. This is useful for debugging, but does have some
-$ echo "performance overhead.
+$ echo "Perl can keep statistics on memory usage if you choose to use"
+$ echo "them. This is useful for debugging, but does have some"
+$ echo "performance overhead."
$ dflt = "n"
$ rp = "Do you want the debugging memory allocator? [''dflt'] "
$ gosub myread
-$ if ans.eqs."" then ans="''dflt'"
+$ IF ans .eqs. "" THEN ans = "''dflt'"
$ use_debugmalloc = f$extract(0, 1, f$edit(ans, "COLLAPSE,UPCASE"))
$ ENDIF
$ ! Check which memory allocator we want
$ echo ""
-$ echo "There are currently three different memory allocators: the
-$ echo "default (which is a pretty good general-purpose memory manager),
-$ echo "the TWO_POT allocator (which is optimized to save memory for
-$ echo "larger allocations), and PACK_MALLOC (which is optimized to save
-$ echo "memory for smaller allocations). They're all good, but if your
-$ echo "usage tends towards larger chunks use TWO_POT, otherwise use
+$ echo "There are currently three different memory allocators: the"
+$ echo "default (which is a pretty good general-purpose memory manager),"
+$ echo "the TWO_POT allocator (which is optimized to save memory for"
+$ echo "larger allocations), and PACK_MALLOC (which is optimized to save"
+$ echo "memory for smaller allocations). They're all good, but if your"
+$ echo "usage tends towards larger chunks use TWO_POT, otherwise use"
$ echo "PACK_MALLOC."
$ dflt = "DEFAULT"
$ rp = "Memory allocator (DEFAULT, TWO_POT, PACK_MALLOC) [''dflt'] "
@@ -1994,17 +2385,15 @@ $ ENDIF
$!
$! Ask for their default list of extensions to build
$ echo ""
-$ echo "It's time to specify which modules you want to build into
-$ echo "perl. Most of these are standard and should be chosen, though
-$ echo "you might, for example, want to build GDBM_File instead of
-$ echo "SDBM_File if you have the GDBM library built on your machine.
-$ echo "Whatever you do, make sure the re module is first or things will
-$ echo "break badly"
-$ echo "
+$ echo "It is time to specify which modules you want to build into"
+$ echo "perl. Most of these are standard and should be chosen, though"
+$ echo "you might, for example, want to build GDBM_File instead of"
+$ echo "SDBM_File if you have the GDBM library built on your machine."
+$ echo ""
$ echo "Which modules do you want to build into perl?"
$! dflt = "Fcntl Errno File::Glob IO Opcode Byteloader Devel::Peek Devel::DProf Data::Dumper attrs re VMS::Stdio VMS::DCLsym B SDBM_File"
$ dflt = "re Fcntl Errno File::Glob IO Opcode Devel::Peek Devel::DProf Data::Dumper attrs VMS::Stdio VMS::DCLsym B SDBM_File Thread Sys::Hostname"
-$ if Using_Dec_C.eqs."Yes"
+$ IF ccname .EQS. "DEC" .OR. ccname .EQS. "CXX"
$ THEN
$ dflt = dflt + " POSIX"
$ ENDIF
@@ -2046,11 +2435,11 @@ $ exloop3:
$ dflt = f$edit(a,"trim")
$!
$ extensions = "''ans'"
-$ perl_known_extensions = "''dflt'"
+$ known_extensions = "''dflt'"
$!
$! %Config-I-VMS, determine build/make utility here (make gmake mmk mms)
$ echo ""
-$ echo "%Config-I-VMS, Checking your ""make"" utilities..."
+$ echo "Checking your ""make"" utilities..."
$! If the 'build' that you use is not here add it and it's test
$! switch to the _END_ of these strings (and increment max_build)
$! (e.g. builders = builders + "/FOOMAKE"
@@ -2073,11 +2462,16 @@ $Build_probe:
$ build = F$ELEMENT(n,"/",builders)
$ probe = F$ELEMENT(n,"!",probers)
$ echo "Testing whether you have ''build' on your system..."
+$!
+$! Noted with GNU Make version 3.60 that the $status and $severity
+$! with the 'probe' Makefile appear to be: $STATUS == "%X1000000C"
+$! $SEVERITY == "4".
+$!
$ SET NOON
$ ON CONTROL_Y THEN GOTO Reenable_messages_build
$ SET MESSAGE/NOFAC/NOSEV/NOIDENT/NOTEXT
$ 'build' 'probe'
-$ IF ($SEVERITY .EQ. 1)
+$ IF ($SEVERITY .EQ. 1) ! not adequate?
$ THEN
$ echo "OK."
$ IF (build .EQS. orig_dflt)
@@ -2101,7 +2495,7 @@ $ IF (ok_builders .NES. "")
$ THEN
$ echo "Here is the list of builders you can apparently use:"
$ echo "(",ok_builders," )"
-$ rp = "Which """"make"""" utility do you wish to use [''dflt']? "
+$ rp = "Which """"make"""" utility do you wish to use? [''dflt'] "
$ GOSUB myread
$ ans = F$EDIT(ans,"TRIM, COMPRESS")
$ ans = F$EXTRACT(0,F$LOCATE(" ",ans),ans) !throw out "-f Makefile." here
@@ -2111,18 +2505,20 @@ $ ELSE build = ans
$ ENDIF
$ ELSE
$ TYPE SYS$INPUT:
+$ DECK
%Config-E-VMS, ERROR:
Well this looks pretty serious. Perl5 cannot be compiled without a "make"
utility of some sort and after checking my "builders" list I cannot find
the symbol or command you use on your system to compile programs.
-$ READ SYS$COMMAND/PROMPT="%Config-I-VMS, Which ""MMS"" do you use? " ans
+$ EOD
+$ READ SYS$COMMAND/PROMPT="Which ""MMS"" do you use? " ans
$ ans = F$EDIT(ans,"TRIM, COMPRESS")
$ ans = F$EXTRACT(0,F$LOCATE(" ",ans),ans) !throw out "-f Makefile." here
$ IF (ans .EQS. "")
$ THEN build = dflt
-$ echo "I don't know where 'make' is, and my life depends on it."
+$ echo "I do not know where ""make"" is, and my life depends on it."
$ echo "Go find a make program or fix your DCL$PATH setting!"
$ echo "ABORTING..."
$ SET DEFAULT 'vms_default_directory_name' !be kind rewind
@@ -2137,13 +2533,17 @@ $ DELETE/NOLOG Makefile.;
$ GOTO Beyond_open
$Open_error:
$ TYPE SYS$INPUT:
+$ DECK
There seems to be trouble. I just tried to create a file in
+$ EOD
$ echo4 'F$ENVIRONMENT("DEFAULT")'
$ TYPE SYS$INPUT:
+$ DECK
but was unsuccessful. I am stopping now. Please check that directories'
PROTECTION bits. I will leave you in the directory where you started
Configure.com
+$ EOD
$ echo4 "ABORTING..."
$ GOTO Clean_up
$ STOP
@@ -2155,7 +2555,17 @@ $ make = F$EDIT(build,"UPCASE")
$!
$!: locate the preferred pager for this system
$!pagers = "most|more|less|type/page"
-$!rp='What pager is used on your system?'
+$ dflt = "type/page"
+$! assume that the presence of a most symbol indicates the presence
+$! of the pager.
+$ IF F$TYPE(most) .EQS. "STRING" THEN dflt = "most"
+$ IF F$TYPE(pager) .EQS. "STRING" THEN dflt = pager
+$ rp="What pager is used on your system? [''dflt'] "
+$ GOSUB myread
+$ IF (ans .EQS. "")
+$ THEN pager = dflt
+$ ELSE pager = ans
+$ ENDIF
$!
$! update [.vms]config.vms here
$!
@@ -2167,38 +2577,3066 @@ $ THEN
$ makefile = "" !wrt MANIFEST dir
$ UUmakefile = "[-]DESCRIP.MMS" !wrt CWD dir
$ DEFmakefile = "DESCRIP.MMS" !wrt DEF dir (?)
+$ Makefile_SH = "descrip_mms.template"
$ ELSE
$ makefile = " -f Makefile." !wrt MANIFEST dir
$ UUmakefile = "[-]Makefile." !wrt CWD dir
$ DEFmakefile = "Makefile." !wrt DEF dir (?)
+$ Makefile_SH = "Makefile.in"
$ ENDIF
$!
-$ IF macros.NES.""
-$ THEN
+$ IF macros .NES. ""
+$ THEN
$ tmp = F$LENGTH(macros)
$ macros = F$EXTRACT(0,(tmp-1),macros) !miss trailing comma
$ macros = "/macro=(" + macros + ")"
$ ENDIF
$! Build up the extra C flags
$!
-$ if use_ieee_math
-$ then
+$ IF use_ieee_math
+$ THEN
$ extra_flags = "''extra_flags'" + "/float=ieee/ieee=denorm_results"
-$ endif
-$ if be_case_sensitive
-$ then
+$ ENDIF
+$ IF be_case_sensitive
+$ THEN
$ extra_flags = "''extra_flags'" + "/Names=As_Is"
-$ endif
+$ ENDIF
$ extra_flags = "''extra_flags'" + "''user_c_flags'"
$!
-$! Invoke the subconfig piece
+$ min_pgflquota = "100000"
+$ pgflquota = F$STRING(F$GETJPI("","PGFLQUOTA"))
+$ IF pgflquota .LES. min_pgflquota
+$ THEN
+$ echo4 "Your PGFLQUOTA of ''pgflquota' appears too small to build ''package'."
+$ READ SYS$COMMAND/PROMPT="Continue? [n] " ans
+$ IF ans
+$ THEN
+$ echo4 "Continuing..."
+$ ELSE
+$ echo4 "ABORTING..."
+$ GOTO Clean_up
+$ ENDIF
+$ ENDIF
$!
$ echo ""
-$ echo4 "Checking the C run-time library"
-$ dflt = F$ENVIRONMENT("DEFAULT")
-$ SET DEFAULT [-.vms]
-$ @subconfigure
-$ SET DEFAULT 'dflt
+$ echo4 "Checking the C run-time library."
+$!
+$! Former SUBCONFIGURE.COM
+$!
+$! - build a config.sh for VMS Perl.
+$! - use built config.sh to take config_h.SH -> config.h
+$! - also take vms/descrip_mms.template -> descrip.mms (VMS Makefile)
+$! vms/Makefile.in -> Makefile. (VMS GNU Makefile?)
+$! vms/Makefile.SH -> Makefile. (VMS GNU Makefile?)
+$! - build make_ext.com extension builder procedure.
+$!
+$! Note for folks from other platforms changing things in here:
+$!
+$! Fancy changes (based on compiler capabilities or VMS version or
+$! whatever) are tricky, so go ahead and punt on those.
+$!
+$! Simple changes, though (say, always setting something to 1, or undef,
+$! or something like that) are straightforward. Adding a new constant
+$! item for the ultimately created config.sh requires at least one
+$! (possibly more) line(s) to this file.
+$!
+$! Add a line in the format:
+$!
+$! $ WC "foo='undef'"
+$!
+$! somewhere between the line tagged '##BEGIN WRITE NEW CONSTANTS HERE##'
+$! and the one tagged '##END WRITE NEW CONSTANTS HERE##' (note the order
+$! is sorted ASCII and corresponds to the output of config.sh in the
+$! Bourne shell version of Configure).
+$! Be very careful with quoting, as it can be tricky.
+$! For example if instead of a constant string like 'undef' or 'define'
+$! you wanted to add something to VMS's config.sh that looks like:
+$!
+$! blank_string=''
+$!
+$! then add a line that looks like this before the
+$! '##END WRITE NEW CONSTANTS HERE##' tagged line:
+$!
+$! $ WC "blank_string='" + "'"
+$!
+$! (+ is the string concatenator and "''var'" has the effect
+$! of "${var}" in perl or sh, but "'const'" is not interpolated).
+$!
+$! Note that unitialized variables, such as a line like:
+$!
+$! $ WC "new_var='" + new_var + "'"
+$!
+$! should be avoided unless new_var has a value assigned prior
+$! to that line (think of perl's -w warnings).
+$!
+$! %DCL-W-UNDSYM, undefined symbol - check validity and spelling
+$! \NEW_VAR\
+$!
+$!
+$ vms_ver = F$EXTRACT(1,3, osvers)
+$ IF F$LENGTH(Mcc) .EQ. 0 THEN Mcc := "cc"
+$ MCC = f$edit(mcc, "UPCASE")
+$ C_Compiler_Replace := "CC=CC=''Mcc'''ccflags'"
+$ IF ccname .EQS. "DEC"
+$ THEN
+$ Checkcc := "''Mcc'/prefix=all"
+$ ELSE
+$ IF ccname .EQS. "CXX"
+$ THEN
+$ Checkcc := cxx
+$ ELSE
+$ Checkcc := "''Mcc'"
+$ ENDIF
+$ ENDIF
+$ ccflags = ccflags + extra_flags
+$ IF be_case_sensitive
+$ THEN
+$ d_vms_be_case_sensitive = "define"
+$ ELSE
+$ d_vms_be_case_sensitive = "undef"
+$ ENDIF
+$! Some constant defaults.
+$ hwname = f$getsyi("HW_NAME")
+$ myname = myhostname
+$ IF myname .EQS. "" THEN myname = F$TRNLNM("SYS$NODE")
+$!
+$ ccdlflags=""
+$ cccdlflags=""
+$!
+$ IF use64bitint .OR. use64bitint .EQS. "define"
+$ THEN
+$ use64bitint = "define"
+$ uselargefiles = "define"
+$ uselongdouble = "define"
+$ alignbytes="16"
+$ usemorebits = "define"
+$ ELSE
+$ use64bitint = "undef"
+$ uselargefiles = "undef"
+$ uselongdouble = "undef"
+$ usemorebits = "undef"
+$ ENDIF
+$ IF use64bitall .OR. use64bitall .EQS. "define"
+$ THEN
+$ use64bitall = "define"
+$ ELSE
+$ use64bitall = "undef"
+$ ENDIF
+$!
+$ usemymalloc=mymalloc
+$!
+$ perl_cc=Mcc
+$!
+$ IF (sharedperl .AND. F$GETSYI("HW_MODEL") .GE. 1024)
+$ THEN
+$ obj_ext=".abj"
+$ so="axe"
+$ dlext="axe"
+$ exe_ext=".axe"
+$ lib_ext=".alb"
+$ ELSE
+$ obj_ext=".obj"
+$ so="exe"
+$ dlext="exe"
+$ exe_ext=".exe"
+$ lib_ext=".olb"
+$ ENDIF
+$ dlobj="dl_vms''obj_ext'"
+$!
+$ cppstdin="''perl_cc'/noobj/preprocess=sys$output sys$input"
+$ cppminus=" "
+$ cpprun="''perl_cc'/noobj/preprocess=sys$output sys$input"
+$ cpplast=" "
+$!
+$ timetype="time_t"
+$ signal_t="void"
+$ stdchar="char"
+$!
+$ IF mymalloc
+$ THEN d_mymalloc="define"
+$ ELSE d_mymalloc="undef"
+$ ENDIF
+$!
+$ usedl="define"
+$ startperl="""$ perl 'f$env(\""procedure\"")' \""'"+"'p1'\"" \""'"+"'p2'\"" \""'"+"'p3'\"" \""'"+"'p4'\"" \""'"+"'p5'\"" \""'"+"'p6'\"" \""'"+"'p7'\"" \""'"+"'p8'\""!\n"
+$ startperl=startperl + "$ exit++ + ++$status!=0 and $exit=$status=undef; while($#ARGV != -1 and $ARGV[$#ARGV] eq '"+"'){pop @ARGV;}"""
+$!
+$ IF ((Use_Threads) .AND. (vms_ver .LES. "6.2"))
+$ THEN
+$ libs="SYS$SHARE:CMA$LIB_SHR.EXE/SHARE SYS$SHARE:CMA$RTL.EXE/SHARE SYS$SHARE:CMA$OPEN_LIB_SHR.exe/SHARE SYS$SHARE:CMA$OPEN_RTL.exe/SHARE"
+$ ELSE
+$ libs=" "
+$ ENDIF
+$ IF ccname .EQS. "DEC" .OR. ccname .EQS. "CXX"
+$ THEN
+$ libc="(DECCRTL)"
+$ ELSE
+$ libc=" "
+$ ENDIF
+$!
+$! perllibs should be libs with all non-core libs (such as gdbm) removed.
+$!
+$ perllibs=libs
+$!
+$! Are we 64 bit?
+$!
+$ IF use64bitint .OR. use64bitint .EQS. "define"
+$ THEN
+$ d_PRId64 = "define"
+$ d_PRIEUldbl = "define"
+$ d_PRIFUldbl = "define"
+$ d_PRIGUldbl = "define"
+$ d_PRIXU64 = "define"
+$ d_PRIeldbl = "define"
+$ d_PRIfldbl = "define"
+$ d_PRIgldbl = "define"
+$ d_PRIu64 = "define"
+$ d_PRIo64 = "define"
+$ d_PRIx64 = "define"
+$ sPRId64 = """Ld"""
+$ sPRIEUldbl = """LE"""
+$ sPRIFUldbl = """LF"""
+$ sPRIGUldbl = """LG"""
+$ sPRIXU64 = """LX"""
+$ sPRIeldbl = """Le"""
+$ sPRIfldbl = """Lf"""
+$ sPRIgldbl = """Lg"""
+$ sPRIi64 = """Li"""
+$ sPRIo64 = """Lo"""
+$ sPRIu64 = """Lu"""
+$ sPRIx64 = """Lx"""
+$ d_quad = "define"
+$ quadtype = "long long"
+$ uquadtype = "unsigned long long"
+$ quadkind = "QUAD_IS_LONG_LONG"
+$ d_frexpl = "define"
+$ d_isnan = "define"
+$ d_isnanl = "define"
+$ d_modfl = "define"
+$ ELSE
+$ d_PRId64 = "undef"
+$ d_PRIEUldbl = "define"
+$ d_PRIFUldbl = "define"
+$ d_PRIGUldbl = "define"
+$ d_PRIXU64 = "undef"
+$ d_PRIeldbl = "define"
+$ d_PRIfldbl = "undef"
+$ d_PRIgldbl = "undef"
+$ d_PRIu64 = "undef"
+$ d_PRIo64 = "undef"
+$ d_PRIx64 = "undef"
+$ sPRId64 = ""
+$ sPRIEUldbl = """E"""
+$ sPRIFUldbl = """F"""
+$ sPRIGUldbl = """G"""
+$ sPRIXU64 = """lX"""
+$ sPRIeldbl = """e"""
+$ sPRIfldbl = """f"""
+$ sPRIgldbl = """g"""
+$ sPRIi64 = ""
+$ sPRIo64 = ""
+$ sPRIu64 = ""
+$ sPRIx64 = ""
+$ d_quad = "undef"
+$ quadtype = "long"
+$ uquadtype = "unsigned long"
+$ quadkind = "QUAD_IS_LONG"
+$ d_frexpl = "undef"
+$ d_isnan = "undef"
+$ d_isnanl = "undef"
+$ d_modfl = "undef"
+$ ENDIF
+$ d_SCNfldbl = d_PRIfldbl
+$ sSCNfldbl = sPRIfldbl ! expect consistency
+$!
+$! Now some that we build up
+$!
+$ IF Use_Threads
+$ THEN
+$ IF use_5005_threads
+$ THEN
+$ arch = "''arch'-thread"
+$ archname = "''archname'-thread"
+$ d_old_pthread_create_joinable = "undef"
+$ old_pthread_create_joinable = " "
+$ use5005threads = "define"
+$ useithreads = "undef"
+$ ELSE
+$ arch = "''arch'-ithread"
+$ archname = "''archname'-ithread"
+$ d_old_pthread_create_joinable = "undef"
+$ old_pthread_create_joinable = " "
+$ use5005threads = "undef"
+$ useithreads = "define"
+$ ENDIF
+$ ELSE
+$ d_old_pthread_create_joinable = "undef"
+$ old_pthread_create_joinable = " "
+$ use5005threads = "undef"
+$ useithreads = "undef"
+$ ENDIF
+$!
+$! Some that we need to invoke the compiler for
+$!
+$!
+$! handy construction aliases/symbols
+$!
+$ OS := "open/write CONFIG []try.c"
+$ WS := "write CONFIG"
+$ CS := "close CONFIG"
+$ DS := "delete/nolog/noconfirm []try.*;*"
+$ Needs_Opt := N
+$ good_compile = %X10B90001
+$ IF ccname .EQS. "GCC"
+$ THEN
+$ open/write OPTCHAN []try.opt
+$ write OPTCHAN "Gnu_CC:[000000]gcclib.olb/library"
+$ write OPTCHAN "Sys$Share:VAXCRTL/Share"
+$ Close OPTCHAN
+$ Needs_Opt := Y
+$ good_compile = %X10000001
+$ ENDIF
+$ IF ccname .EQS. "CXX"
+$ THEN
+$ good_compile = %X15F60001
+$ ENDIF
+$ good_link = %X10000001
+$ tmp = "" ! null string default
+$!
+$ GOTO beyond_compile_ok
+$!
+$! Check for type sizes
+$!
+$type_size_check:
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "printf(""%d\n"", sizeof(''tmp'));"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ GOSUB compile
+$ RETURN
+$!
+$!: locate header file
+$findhdr:
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <''tmp'>"
+$ WS "int main()"
+$ WS "{"
+$ WS "printf(""define\n"");"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ GOSUB link_ok
+$ RETURN
+$!
+$!: define an alternate in-header-list? function
+$inhdr:
+$!
+$ GOSUB findhdr
+$ IF compile_status .EQ. good_compile .AND. link_status .EQ. good_link
+$ THEN
+$ echo4 "<''tmp'> found."
+$ tmp = "define"
+$ ELSE
+$ echo4 "<''tmp'> NOT found."
+$ tmp = "undef"
+$ ENDIF
+$ RETURN
+$!
+$!: define an is-in-libc? function
+$inlibc:
+$ GOSUB link_ok
+$ IF compile_status .EQ. good_compile .AND. link_status .EQ. good_link
+$ THEN
+$ echo4 "''tmp'() found."
+$ tmp = "define"
+$ ELSE
+$ echo4 "''tmp'() NOT found."
+$ tmp = "undef"
+$ ENDIF
+$ RETURN
+$!
+$!: define a shorthand compile call
+$compile:
+$ GOSUB link_ok
+$just_mcr_it:
+$ IF compile_status .EQ. good_compile .AND. link_status .EQ. good_link
+$ THEN
+$ OPEN/WRITE CONFIG []try.out
+$ DEFINE/USER_MODE SYS$ERROR CONFIG
+$ DEFINE/USER_MODE SYS$OUTPUT CONFIG
+$ MCR []try.exe
+$ CLOSE CONFIG
+$ OPEN/READ CONFIG []try.out
+$ READ CONFIG tmp
+$ CLOSE CONFIG
+$ DELETE/NOLOG/NOCONFIRM []try.out;
+$ DELETE/NOLOG/NOCONFIRM []try.exe;
+$ ELSE
+$ tmp = "" ! null string default
+$ ENDIF
+$ RETURN
+$!
+$link_ok:
+$ GOSUB compile_ok
+$ DEFINE/USER_MODE SYS$ERROR _NLA0:
+$ DEFINE/USER_MODE SYS$OUTPUT _NLA0:
+$ SET NOON
+$ IF Needs_Opt
+$ THEN
+$ 'ld' try.obj,try.opt/opt
+$ link_status = $status
+$ ELSE
+$ 'ld' try.obj
+$ link_status = $status
+$ ENDIF
+$ SET ON
+$ IF F$SEARCH("try.obj") .NES. "" THEN DELETE/NOLOG/NOCONFIRM try.obj;
+$ RETURN
+$!
+$!: define a shorthand compile call for compilations that should be ok.
+$compile_ok:
+$ DEFINE/USER_MODE SYS$ERROR _NLA0:
+$ DEFINE/USER_MODE SYS$OUTPUT _NLA0:
+$ SET NOON
+$ 'Checkcc' try.c
+$ compile_status = $status
+$ SET ON
+$ DELETE/NOLOG/NOCONFIRM try.c;
+$ RETURN
+$!
+$beyond_compile_ok:
+$!
+$! Check for __STDC__
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "#ifdef __STDC__"
+$ WS "printf(""42\n"");"
+$ WS "#else"
+$ WS "printf(""1\n"");"
+$ WS "#endif"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ GOSUB compile
+$ cpp_stuff=tmp
+$ IF F$INTEGER(tmp) .eq. 42
+$ THEN
+$ echo4 "Your C compiler and pre-processor defines the symbol:"
+$ echo4 "__STDC__"
+$ ENDIF
+$!
+$! Check for double size
+$!
+$ echo4 "Checking to see how big your double precision numbers are..."
+$ tmp="double"
+$ GOSUB type_size_check
+$ doublesize = tmp
+$ echo "Your double is ''doublesize' bytes long."
+$!
+$! Check for long double size
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "printf(""%d\n"", sizeof(long double));"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ echo4 "Checking to see if you have long double..."
+$ GOSUB link_ok
+$ IF link_status .NE. good_link
+$ THEN
+$ longdblsize="0"
+$ d_longdbl="undef"
+$ echo "You do not have long double."
+$ ELSE
+$ echo "You have long double."
+$ echo4 "Checking to see how big your long doubles are..."
+$ GOSUB just_mcr_it
+$ longdblsize = tmp
+$ d_longdbl = "define"
+$ echo "Your long doubles are ''longdblsize' bytes long."
+$ ENDIF
+$!
+$!: check for long long
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "printf(""%d\n"", sizeof(long long));"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ echo4 "Checking to see if you have long long..."
+$ GOSUB link_ok
+$ IF link_status .NE. good_link
+$ THEN
+$ longlongsize="0"
+$ d_longlong="undef"
+$ echo "You do not have long long."
+$ ELSE
+$ echo "You have long long."
+$ echo4 "Checking to see how big your long longs are..."
+$ GOSUB just_mcr_it
+$ longlongsize = tmp
+$ d_longlong = "define"
+$ echo "Your long longs are ''longlongsize' bytes long."
+$ ENDIF
+$!
+$! Check the prototype for getgid
+$!
+$ echo "Looking for the type for group ids returned by getgid()."
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <types.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "gid_t foo;"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ GOSUB compile_ok
+$ IF compile_status .NE. good_compile
+$ THEN
+$! Okay, gid_t failed. Must be unsigned int
+$ gidtype = "unsigned int"
+$ echo4 "assuming ""''gidtype'""."
+$ ELSE
+$ gidtype = "gid_t"
+$ echo4 "gid_t found."
+$ ENDIF
+$!
+$! Check to see if we've got dev_t
+$!
+$ echo "Looking for the type for dev."
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <types.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "dev_t foo;"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ GOSUB compile_ok
+$ IF compile_status .NE. good_compile
+$ THEN
+$! Okay, dev_t failed. Must be unsigned int
+$ devtype = "unsigned int"
+$ echo4 "assuming ""''devtype'""."
+$ ELSE
+$ devtype = "dev_t"
+$ echo4 "dev_t found."
+$ ENDIF
+$!
+$! Check to see if we've got unistd.h (which we ought to, but you never know)
+$!
+$ i_netdb = "undef"
+$ tmp = "unistd.h"
+$ GOSUB inhdr
+$ i_unistd = tmp
+$!
+$!: see if this is a libutil.h system
+$!
+$ tmp = "libutil.h"
+$ GOSUB inhdr
+$ i_libutil = tmp
+$!
+$! Check to see if we've got shadow.h (probably not, but...)
+$!
+$ tmp = "shadow.h"
+$ GOSUB inhdr
+$ i_shadow = tmp
+$!
+$! Check to see if we've got socks.h (probably not, but...)
+$!
+$ tmp = "socks.h"
+$ GOSUB inhdr
+$ i_socks = tmp
+$!
+$! Check the prototype for select
+$!
+$ IF Has_Dec_C_Sockets .OR. Has_Socketshr
+$ THEN
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <types.h>"
+$ IF i_unistd .EQS. "define" THEN WS "#include <unistd.h>"
+$ IF Has_Socketshr
+$ THEN
+$ WS "#include <socketshr.h>"
+$ ELSE
+$ WS "#include <time.h>"
+$ WS "#include <socket.h>"
+$ ENDIF
+$ WS "int main()"
+$ WS "{"
+$ WS "fd_set *foo;"
+$ WS "int bar;"
+$ WS "foo = NULL;"
+$ WS "bar = select(2, foo, foo, foo, NULL);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ GOSUB compile_ok
+$ IF compile_status .NE. good_compile
+$ THEN
+$! Okay, select failed. Must be an int *
+$ selecttype = "int *"
+$ echo4 "select() NOT found."
+$ ELSE
+$ selecttype="fd_set *"
+$ echo4 "select() found."
+$ ENDIF
+$ ELSE
+$ ! No sockets, so stick in an int * : no select, so pick a harmless default
+$ selecttype = "int *"
+$ ENDIF
+$!
+$! Check to see if fd_set exists
+$!
+$ echo "Checking to see how well your C compiler handles fd_set and friends ..."
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <types.h>"
+$ IF Has_Socketshr
+$ THEN
+$ WS "#include <socketshr.h>"
+$ ENDIF
+$ IF Has_Dec_C_Sockets
+$ THEN
+$ WS "#include <time.h>"
+$ WS "#include <socket.h>"
+$ ENDIF
+$ WS "int main()"
+$ WS "{"
+$ WS "fd_set *foo;"
+$ WS "int bar;"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ GOSUB compile_ok
+$ IF compile_status .ne. good_compile
+$ THEN
+$! Okay, fd_set failed. Must not exist
+$ d_fd_set = "undef"
+$ echo4 "Hmm, your compiler has some difficulty with fd_set."
+$ ELSE
+$ d_fd_set="define"
+$ echo4 "Well, your system knows about the normal fd_set typedef..."
+$ ENDIF
+$!
+$! Check for inttypes.h
+$!
+$ tmp = "inttypes.h"
+$ GOSUB inhdr
+$ i_inttypes = tmp
+$!
+$! Check to see if off64_t exists
+$!
+$ echo4 "Checking to see if you have off64_t..."
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <types.h>"
+$ WS "#''i_inttypes' IIH"
+$ WS "#ifdef IIH"
+$ WS "#include <inttypes.h>"
+$ WS "#endif"
+$ WS "int main()"
+$ WS "{"
+$ WS "off64_t bar;"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ GOSUB compile_ok
+$ IF compile_status .EQ. good_compile
+$ THEN
+$ d_off64_t="define"
+$ echo "You have off64_t."
+$ ELSE
+$ d_off64_t = "undef"
+$ echo "You do not have off64_t."
+$ ENDIF
+$!
+$! Check to see if fpos64_t exists
+$!
+$ echo4 "Checking to see if you have fpos64_t..."
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <types.h>"
+$ WS "#''i_inttypes' IIH"
+$ WS "#ifdef IIH"
+$ WS "#include <inttypes.h>"
+$ WS "#endif"
+$ WS "int main()"
+$ WS "{"
+$ WS "fpos64_t bar;"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ GOSUB compile_ok
+$ IF compile_status .EQ. good_compile
+$ THEN
+$ d_fpos64_t="define"
+$ echo "You have fpos64_t."
+$ ELSE
+$ d_fpos64_t = "undef"
+$ echo "You do not have fpos64_t."
+$ ENDIF
+$!
+$! Check to see if int64_t exists
+$!
+$ echo4 "Checking to see if you have int64_t..."
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <types.h>"
+$ WS "#''i_inttypes' IIH"
+$ WS "#ifdef IIH"
+$ WS "#include <inttypes.h>"
+$ WS "#endif"
+$ WS "int main()"
+$ WS "{"
+$ WS "int64_t bar;"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ GOSUB compile_ok
+$ IF compile_status .EQ. good_compile
+$ THEN
+$ d_int64_t="define"
+$ echo "You have int64_t."
+$ ELSE
+$ d_int64_t = "undef"
+$ echo "You do not have int64_t."
+$ ENDIF
+$!
+$!: see if this is a netdb.h system
+$ IF Has_Dec_C_Sockets
+$ THEN
+$ tmp = "netdb.h"
+$ GOSUB inhdr
+$ i_netdb = tmp
+$ ENDIF
+$!
+$! Check for h_errno
+$!
+$ echo4 "Checking to see if you have h_errno..."
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ IF i_unistd .EQS. "define" THEN WS "#include <unistd.h>"
+$ IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "h_errno = 3;"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ GOSUB link_ok
+$ IF compile_status .EQ. good_compile .AND. link_status .EQ. good_link
+$ THEN
+$ d_herrno="define"
+$ echo "You have h_errno."
+$ ELSE
+$ d_herrno="undef"
+$ echo "You do not have h_errno."
+$ ENDIF
+$!
+$! Check to see if gethostname exists
+$!
+$ IF Has_Dec_C_Sockets .OR. Has_Socketshr
+$ THEN
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <types.h>"
+$ IF Has_Socketshr
+$ THEN
+$ WS "#include <socketshr.h>"
+$ ELSE
+$ WS "#include <time.h>"
+$ WS "#include <socket.h>"
+$ ENDIF
+$ WS "int main()"
+$ WS "{"
+$ WS "char name[100];"
+$ WS "int bar, baz;"
+$ WS "bar = 100;"
+$ WS "baz = gethostname(name, bar);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ GOSUB link_ok
+$ IF compile_status .EQ. good_compile .AND. link_status .EQ. good_link
+$ THEN
+$ d_gethname="define"
+$ echo4 "gethostname() found."
+$ ELSE
+$ d_gethname="undef"
+$ ENDIF
+$ ELSE
+$ ! No sockets, so no gethname
+$ d_gethname = "undef"
+$ ENDIF
+$!
+$! Check for sys/file.h
+$!
+$ tmp = "sys/file.h"
+$ GOSUB inhdr
+$ i_sysfile = tmp
+$!
+$! Check for sys/utsname.h
+$!
+$ tmp = "sys/utsname.h"
+$ GOSUB inhdr
+$ i_sysutsname = tmp
+$!
+$! Check for syslog.h
+$!
+$ tmp = "syslog.h"
+$ GOSUB inhdr
+$ i_syslog = tmp
+$!
+$! Check for poll.h
+$!
+$ tmp = "poll.h"
+$ GOSUB inhdr
+$ i_poll = tmp
+$!
+$! Check for sys/uio.h
+$!
+$ tmp = "sys/uio.h"
+$ GOSUB inhdr
+$ i_sysuio = tmp
+$!
+$! Check for sys/mode.h
+$!
+$ tmp = "sys/mode.h"
+$ GOSUB inhdr
+$ i_sysmode = tmp
+$!
+$! Check for sys/access.h
+$!
+$ tmp = "sys/access.h"
+$ GOSUB inhdr
+$ i_sysaccess = tmp
+$!
+$! Check for sys/security.h
+$!
+$ tmp = "sys/security.h"
+$ GOSUB inhdr
+$ i_syssecrt = tmp
+$!
+$! Check for fcntl.h
+$!
+$ tmp = "fcntl.h"
+$ GOSUB inhdr
+$ i_fcntl = tmp
+$!
+$! Check for fcntl
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <fcntl.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "fcntl(1,2,3);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "fcntl"
+$ GOSUB inlibc
+$ d_fcntl = tmp
+$!
+$! Check for fcntl locking capability
+$!
+$ echo4 "Checking if fcntl-based file locking works... "
+$ tmp = "undef"
+$ IF d_fcntl .EQS. "define"
+$ THEN
+$ OS
+$ WS "#include <stdio.h>"
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <fcntl.h>"
+$ WS "#include <unistd.h>"
+$ WS "int main() {"
+$ WS "#if defined(F_SETLK) && defined(F_SETLKW)"
+$ WS " struct flock flock;"
+$ WS " int retval, fd;"
+$ WS " fd = open(""try.c"", O_RDONLY);"
+$ WS " flock.l_type = F_RDLCK;"
+$ WS " flock.l_whence = SEEK_SET;"
+$ WS " flock.l_start = flock.l_len = 0;"
+$ WS " retval = fcntl(fd, F_SETLK, &flock);"
+$ WS " close(fd);"
+$ WS " (retval < 0 ? printf(""undef\n"") : printf(""define\n""));"
+$ WS "#else"
+$ WS " printf(""undef\n"");"
+$ WS "#endif"
+$ WS "}"
+$ CS
+$ GOSUB link_ok
+$ IF compile_status .EQ. good_compile .AND. link_status .EQ. good_link
+$ THEN
+$ GOSUB just_mcr_it
+$ IF tmp .EQS. "define"
+$ THEN
+$ echo4 "Yes, it seems to work."
+$ ELSE
+$ echo4 "Nope, it didn't work."
+$ ENDIF
+$ ELSE
+$ echo4 "I'm unable to compile the test program, so I'll assume not."
+$ tmp = "undef"
+$ ENDIF
+$ ELSE
+$ echo4 "Nope, since you don't even have fcntl()."
+$ ENDIF
+$ d_fcntl_can_lock = tmp
+$!
+$! Check for memchr
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <string.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "char * place;"
+$ WS "place = memchr(""foo"", 47, 3)"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "memchr"
+$ GOSUB inlibc
+$ d_memchr = tmp
+$!
+$! Check for strtoull
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <string.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "unsigned __int64 result;"
+$ WS "result = strtoull(""123123"", NULL, 10);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "strtoull"
+$ GOSUB inlibc
+$ d_strtoull = tmp
+$!
+$! Check for strtouq
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <string.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "unsigned __int64 result;"
+$ WS "result = strtouq(""123123"", NULL, 10);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "strtouq"
+$ GOSUB inlibc
+$ d_strtouq = tmp
+$!
+$! Check for strtoll
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <string.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "__int64 result;"
+$ WS "result = strtoll(""123123"", NULL, 10);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "strtoll"
+$ GOSUB inlibc
+$ d_strtoll = tmp
+$!
+$! Check for strtold
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <string.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "long double result;"
+$ WS "result = strtold(""123123"", NULL, 10);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "strtold"
+$ GOSUB inlibc
+$ d_strtold = tmp
+$!
+$! Check for atoll
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <string.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS " __int64 result;"
+$ WS "result = atoll(""123123"");"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "atoll"
+$ GOSUB inlibc
+$ d_atoll = tmp
+$!
+$! Check for atolf
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <string.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "long double"
+$ WS "result = atolf(""123123"");"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "atolf"
+$ GOSUB inlibc
+$ d_atolf = tmp
+$!
+$! Check for access
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "access(""foo"", F_OK);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "acess"
+$ GOSUB inlibc
+$ d_access = tmp
+$!
+$! Check for bzero
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <strings.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "char foo[10];"
+$ WS "bzero(foo, 10);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "bzero"
+$ GOSUB inlibc
+$ d_bzero = tmp
+$!
+$! Check for bcopy
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <strings.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "char foo[10], bar[10];"
+$ WS "bcopy(""foo"", bar, 3);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "bcopy"
+$ GOSUB inlibc
+$ d_bcopy = tmp
+$!
+$! Check for mkstemp
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "mkstemp(""foo"");"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "mkstemp"
+$ GOSUB inlibc
+$ d_mkstemp = tmp
+$!
+$! Check for mkstemps
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "mkstemps(""foo"", 1);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "mkstemps"
+$ GOSUB inlibc
+$ d_mkstemps = tmp
+$!
+$! Check for iconv
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <iconv.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS " iconv_t cd = (iconv_t)0;"
+$ WS " char *inbuf, *outbuf;"
+$ WS " size_t inleft, outleft;"
+$ WS " iconv(cd, &inbuf, &inleft, &outbuf, &outleft);"
+$ WS " exit(0);"
+$ WS "}"
+$ CS
+$ GOSUB link_ok
+$ IF compile_status .ne. good_compile
+$ THEN
+$ d_iconv="undef"
+$ i_iconv="undef"
+$ ELSE
+$ IF link_status .ne. good_link
+$ THEN
+$ d_iconv="undef"
+$ i_iconv="undef"
+$ ELSE
+$ d_iconv="define"
+$ i_iconv="define"
+$ ENDIF
+$ ENDIF
+$ IF i_iconv .eqs. "define"
+$ THEN echo4 "<iconv.h> found."
+$ ELSE echo4 "<iconv.h> NOT found."
+$ ENDIF
+$!
+$! Check for mkdtemp
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "mkdtemp(""foo"");"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "mkdtemp"
+$ GOSUB inlibc
+$ d_mkdtemp = tmp
+$!
+$! Check for setvbuf
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "FILE *foo;"
+$ WS "char Buffer[99];"
+$ WS "foo = fopen(""foo"", ""r"");"
+$ WS "setvbuf(foo, Buffer, 0, 0);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "setvbuf"
+$ GOSUB inlibc
+$ d_setvbuf = tmp
+$!
+$! Check for setenv
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "setenv(""FOO"", ""BAR"", 0);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "setenv"
+$ GOSUB inlibc
+$ d_setenv = tmp
+$!
+$! Check for setproctitle
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "setproctitle(""%s"", ""FOO"");"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "setproctitle"
+$ GOSUB inlibc
+$ d_setproctitle = tmp
+$!
+$! Check for <netinet/in.h>
+$!
+$ IF Has_Dec_C_Sockets .or. Has_Socketshr
+$ THEN
+$ tmp = "netinet/in.h"
+$ GOSUB inhdr
+$ i_niin = tmp
+$ ELSE
+$ i_niin="undef"
+$ ENDIF
+$!
+$! Check for <netinet/tcp.h>
+$!
+$ IF Has_Dec_C_Sockets .or. Has_Socketshr
+$ THEN
+$ tmp = "netinet/tcp.h"
+$ GOSUB inhdr
+$ i_netinettcp = tmp
+$ ELSE
+$ i_netinettcp="undef"
+$ ENDIF
+$!
+$! Check for endhostent
+$!
+$ IF Has_Dec_C_Sockets .or. Has_Socketshr
+$ THEN
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ IF Has_Socketshr
+$ THEN WS "#include <socketshr.h>"
+$ ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
+$ ENDIF
+$ WS "int main()"
+$ WS "{"
+$ WS "endhostent();"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "endhostent"
+$ GOSUB inlibc
+$ d_endhent = tmp
+$ ELSE
+$ d_endhent="undef"
+$ ENDIF
+$!
+$! Check for endnetent
+$!
+$ IF Has_Dec_C_Sockets .or. Has_Socketshr
+$ THEN
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ IF Has_Socketshr
+$ THEN WS "#include <socketshr.h>"
+$ ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
+$ ENDIF
+$ WS "int main()"
+$ WS "{"
+$ WS "endnetent();"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "endnetent"
+$ GOSUB inlibc
+$ d_endnent = tmp
+$ ELSE
+$ d_endnent="undef"
+$ ENDIF
+$!
+$! Check for endprotoent
+$!
+$ IF Has_Dec_C_Sockets .OR. Has_Socketshr
+$ THEN
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ IF Has_Socketshr
+$ THEN WS "#include <socketshr.h>"
+$ ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
+$ ENDIF
+$ WS "int main()"
+$ WS "{"
+$ WS "endprotoent();"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "endprotoent"
+$ GOSUB inlibc
+$ d_endpent = tmp
+$ ELSE
+$ d_endpent="undef"
+$ ENDIF
+$!
+$! Check for endservent
+$!
+$ IF Has_Dec_C_Sockets .OR. Has_Socketshr
+$ THEN
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ IF Has_Socketshr
+$ THEN WS "#include <socketshr.h>"
+$ ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
+$ ENDIF
+$ WS "int main()"
+$ WS "{"
+$ WS "endservent();"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "endservent"
+$ GOSUB inlibc
+$ d_endsent = tmp
+$ ELSE
+$ d_endsent="undef"
+$ ENDIF
+$!
+$! Check for sethostent
+$!
+$ IF Has_Dec_C_Sockets .OR. Has_Socketshr
+$ THEN
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ IF Has_Socketshr
+$ THEN WS "#include <socketshr.h>"
+$ ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
+$ ENDIF
+$ WS "int main()"
+$ WS "{"
+$ WS "sethostent(1);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "sethostent"
+$ GOSUB inlibc
+$ d_sethent = tmp
+$ ELSE
+$ d_sethent="undef"
+$ ENDIF
+$!
+$! Check for setnetent
+$!
+$ IF Has_Dec_C_Sockets .OR. Has_Socketshr
+$ THEN
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ IF Has_Socketshr
+$ THEN WS "#include <socketshr.h>"
+$ ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
+$ ENDIF
+$ WS "int main()"
+$ WS "{"
+$ WS "setnetent(1);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "setnetent"
+$ GOSUB inlibc
+$ d_setnent = tmp
+$ ELSE
+$ d_setnent="undef"
+$ ENDIF
+$!
+$! Check for setprotoent
+$!
+$ IF Has_Dec_C_Sockets .OR. Has_Socketshr
+$ THEN
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ IF Has_Socketshr
+$ THEN WS "#include <socketshr.h>"
+$ ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
+$ ENDIF
+$ WS "int main()"
+$ WS "{"
+$ WS "setprotoent(1);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "setprotoent"
+$ GOSUB inlibc
+$ d_setpent = tmp
+$ ELSE
+$ d_setpent="undef"
+$ ENDIF
+$!
+$! Check for setservent
+$!
+$ IF Has_Dec_C_Sockets .OR. Has_Socketshr
+$ THEN
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ IF Has_Socketshr
+$ THEN WS "#include <socketshr.h>"
+$ ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
+$ ENDIF
+$ WS "int main()"
+$ WS "{"
+$ WS "setservent(1);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "setservent"
+$ GOSUB inlibc
+$ d_setsent = tmp
+$ ELSE
+$ d_setsent="undef"
+$ ENDIF
+$!
+$! Check for gethostent
+$!
+$ IF Has_Dec_C_Sockets .OR. Has_Socketshr
+$ THEN
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ IF Has_Socketshr
+$ THEN WS "#include <socketshr.h>"
+$ ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
+$ ENDIF
+$ WS "int main()"
+$ WS "{"
+$ WS "gethostent();"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "gethostent"
+$ GOSUB inlibc
+$ d_gethent = tmp
+$ ELSE
+$ d_gethent="undef"
+$ ENDIF
+$!
+$! Check for getnetent
+$!
+$ IF Has_Dec_C_Sockets .OR. Has_Socketshr
+$ THEN
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ IF Has_Socketshr
+$ THEN WS "#include <socketshr.h>"
+$ ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
+$ ENDIF
+$ WS "int main()"
+$ WS "{"
+$ WS "getnetent();"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "getnetent"
+$ GOSUB inlibc
+$ d_getnent = tmp
+$ ELSE
+$ d_getnent="undef"
+$ ENDIF
+$!
+$! Check for getprotoent
+$!
+$ IF Has_Dec_C_Sockets .OR. Has_Socketshr
+$ THEN
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ IF Has_Socketshr
+$ THEN WS "#include <socketshr.h>"
+$ ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
+$ ENDIF
+$ WS "int main()"
+$ WS "{"
+$ WS "getprotoent();"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "getprotoent"
+$ GOSUB inlibc
+$ d_getpent = tmp
+$ ELSE
+$ d_getpent="undef"
+$ ENDIF
+$!
+$! Check for getservent
+$!
+$ IF Has_Dec_C_Sockets .OR. Has_Socketshr
+$ THEN
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ IF Has_Socketshr
+$ THEN WS "#include <socketshr.h>"
+$ ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
+$ ENDIF
+$ WS "int main()"
+$ WS "{"
+$ WS "getservent();"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "getservent"
+$ GOSUB inlibc
+$ d_getsent = tmp
+$ ELSE
+$ d_getsent="undef"
+$ ENDIF
+$!
+$! Check for socklen_t
+$!
+$ IF Has_Dec_C_Sockets .OR. Has_Socketshr
+$ THEN
+$ echo4 "Checking to see if you have socklen_t..."
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ IF Has_Socketshr
+$ THEN WS "#include <socketshr.h>"
+$ ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
+$ ENDIF
+$ WS "int main()"
+$ WS "{"
+$ WS "socklen_t x = 16;"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ GOSUB link_ok
+$ IF compile_status .EQ. good_compile .AND. link_status .EQ. good_link
+$ THEN
+$ d_socklen_t="define"
+$ echo "You have socklen_t."
+$ ELSE
+$ d_socklen_t="undef"
+$ echo "You do not have socklen_t."
+$ ENDIF
+$ ELSE
+$ d_socklen_t="undef"
+$ ENDIF
+$!
+$! Check for pthread_yield
+$!
+$ IF use_threads
+$ THEN
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <pthread.h>"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "pthread_yield();"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "pthread_yield"
+$ GOSUB inlibc
+$ d_pthread_yield = tmp
+$ ELSE
+$ d_pthread_yield="undef"
+$ ENDIF
+$!
+$! Check for sched_yield
+$!
+$ IF use_threads
+$ THEN
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <pthread.h>"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "sched_yield();"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "sched_yield"
+$ GOSUB inlibc
+$ d_sched_yield = tmp
+$ IF d_sched_yield .EQS. "define"
+$ THEN sched_yield = "sched_yield"
+$ ELSE sched_yield = " "
+$ ENDIF
+$ ELSE
+$ d_sched_yield="undef"
+$ sched_yield = " "
+$ ENDIF
+$!
+$! Check for generic pointer size
+$!
+$ echo4 "Checking to see how big your pointers are..."
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "int foo;"
+$ WS "foo = sizeof(char *);"
+$ WS "printf(""%d\n"", foo);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "char *"
+$ GOSUB type_size_check
+$ ptrsize = tmp
+$ echo "Your pointers are ''ptrsize' bytes long."
+$!
+$! Check for size_t size
+$!
+$ tmp = "size_t"
+$ zzz = tmp
+$ echo4 "Checking the size of ''zzz'..."
+$ GOSUB type_size_check
+$ sizesize = tmp
+$ echo "Your ''zzz' size is ''sizesize' bytes."
+$!
+$! Check rand48 and its ilk
+$!
+$ echo4 "Looking for a random number function..."
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "srand48(12L);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ GOSUB link_ok
+$ IF compile_status .EQ. good_compile .AND. link_status .EQ. good_link
+$ THEN
+$ drand01 = "drand48()"
+$ randseedtype = "long int"
+$ seedfunc = "srand48"
+$ echo4 "Good, found drand48()."
+$ d_drand48proto = "define"
+$ ELSE
+$ d_drand48proto = "undef"
+$ drand01="random()"
+$ randseedtype = "unsigned"
+$ seedfunc = "srandom"
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "srandom(12);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ GOSUB link_ok
+$ IF compile_status .EQ. good_compile .AND. link_status .EQ. good_link
+$ THEN
+$ echo4 "OK, found random()."
+$ ELSE
+$ drand01="(((float)rand())/((float)RAND_MAX))"
+$ randseedtype = "unsigned"
+$ seedfunc = "srand"
+$ echo4 "Yick, looks like I have to use rand()."
+$ ENDIF
+$ ENDIF
+$! Done with compiler checks. Clean up.
+$ IF F$SEARCH("try.c") .NES."" THEN DELETE/NOLOG/NOCONFIRM try.c;*
+$ IF F$SEARCH("try.obj").NES."" THEN DELETE/NOLOG/NOCONFIRM try.obj;*
+$ IF F$SEARCH("try.exe").NES."" THEN DELETE/NOLOG/NOCONFIRM try.exe;*
+$ IF F$SEARCH("try.opt").NES."" THEN DELETE/NOLOG/NOCONFIRM try.opt;*
+$ IF F$SEARCH("try.out").NES."" THEN DELETE/NOLOG/NOCONFIRM try.out;*
+$ IF ccname .EQS. "CXX"
+$ THEN
+$ CALL Cxx_demangler_cleanup
+$ ENDIF
+$!
+$! Some that are compiler or VMS version sensitive
+$!
+$! Gnu C stuff
+$ IF ccname .EQS. "GCC"
+$ THEN
+$ d_attribut="define"
+$ vms_cc_type="gcc"
+$ ELSE
+$ vms_cc_type="cc"
+$ d_attribut="undef"
+$ ENDIF
+$!
+$! Dec C >= 5.2 and VMS ver >= 7.0
+$ IF (ccname .EQS. "DEC") .AND. -
+ (F$INTEGER(Dec_C_Version).GE.50200000) .AND. (vms_ver .GES. "7.0")
+$ THEN
+$ d_bcmp="define"
+$ d_gettimeod="define"
+$ d_uname="define"
+$ d_sigaction="define"
+$ d_truncate="define"
+$ d_wait4="define"
+$ d_index="define"
+$ pidtype="pid_t"
+$ sig_name="ZERO HUP INT QUIT ILL TRAP IOT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM ABRT USR1 USR2 SPARE18 SPARE19 CHLD CONT STOP TSTP TTIN TTOU DEBUG SPARE27 SPARE28 SPARE29 SPARE30 SPARE31 SPARE32 RTMIN RTMAX"",0"
+$ psnwc1="""ZERO"",""HUP"",""INT"",""QUIT"",""ILL"",""TRAP"",""IOT"",""EMT"",""FPE"",""KILL"",""BUS"",""SEGV"",""SYS"","
+$ psnwc2="""PIPE"",""ALRM"",""TERM"",""ABRT"",""USR1"",""USR2"",""SPARE18"",""SPARE19"",""CHLD"",""CONT"",""STOP"",""TSTP"","
+$ psnwc3="""TTIN"",""TTOU"",""DEBUG"",""SPARE27"",""SPARE28"",""SPARE29"",""SPARE30"",""SPARE31"",""SPARE32"",""RTMIN"",""RTMAX"",0"
+$ sig_name_init = psnwc1 + psnwc2 + psnwc3
+$ sig_num="0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 6 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 64"",0"
+$ sig_num_init="0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,6,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,64,0"
+$! perl_sig_num_with_commas=sig_num_init
+$ uidtype="uid_t"
+$ d_pathconf="define"
+$ d_fpathconf="define"
+$ d_sysconf="define"
+$ d_sigsetjmp="define"
+$ ELSE
+$ pidtype="unsigned int"
+$ d_gettimeod="undef"
+$ d_bcmp="undef"
+$ d_uname="undef"
+$ d_sigaction="undef"
+$ d_truncate="undef"
+$ d_wait4="undef"
+$ d_index="undef"
+$ sig_name="ZERO HUP INT QUIT ILL TRAP IOT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM ABRT USR1 USR2"",0"
+$ psnwc1="""ZERO"",""HUP"",""INT"",""QUIT"",""ILL"",""TRAP"",""IOT"",""EMT"",""FPE"",""KILL"",""BUS"",""SEGV"",""SYS"","
+$ psnwc2="""PIPE"",""ALRM"",""TERM"",""ABRT"",""USR1"",""USR2"",0"
+$ sig_name_init = psnwc1 + psnwc2
+$ sig_num="0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 6 16 17"",0"
+$ sig_num_init="0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,6,16,17,0"
+$! perl_sig_num_with_commas=sig_num_init
+$ uidtype="unsigned int"
+$ d_pathconf="undef"
+$ d_fpathconf="undef"
+$ d_sysconf="undef"
+$ d_sigsetjmp="undef"
+$ ENDIF
+$!
+$ IF d_gethname .EQS. "undef" .AND. d_uname .EQS. "undef"
+$ THEN
+$ d_phostname="define"
+$ ELSE
+$ d_phostname="undef"
+$ ENDIF
+$!
+$! Dec C alone
+$ IF ccname .EQS. "DEC"
+$ THEN
+$ d_mbstowcs="define"
+$ d_mbtowc="define"
+$ d_stdiobase="define"
+$ d_stdio_cnt_lval="define"
+$ d_stdio_ptr_lval="define"
+$ d_stdstdio="define"
+$ d_wcstombs="define"
+$ d_mblen="define"
+$ d_mktime="define"
+$ d_strcoll="define"
+$ d_strxfrm="define"
+$ d_wctomb="define"
+$ i_locale="define"
+$ d_locconv="define"
+$ d_setlocale="define"
+$ vms_cc_type="decc"
+$ ELSE
+$ d_mbstowcs="undef"
+$ d_mbtowc="undef"
+$ d_stdiobase="undef"
+$ d_stdio_cnt_lval="undef"
+$ d_stdio_ptr_lval="undef"
+$ d_stdstdio="undef"
+$ d_wcstombs="undef"
+$ d_mblen="undef"
+$ d_mktime="undef"
+$ d_strcoll="undef"
+$ d_strxfrm="undef"
+$ d_wctomb="undef"
+$ i_locale="undef"
+$ d_locconv="undef"
+$ d_setlocale="undef"
+$ ENDIF
+$ d_stdio_ptr_lval_sets_cnt="undef"
+$ d_stdio_ptr_lval_nochange_cnt="undef"
+$!
+$! Sockets?
+$ if Has_Socketshr .OR. Has_Dec_C_Sockets
+$ THEN
+$ d_vms_do_sockets="define"
+$ d_htonl="define"
+$ d_socket="define"
+$ d_select="define"
+$ netdb_hlen_type="int"
+$ netdb_host_type="char *"
+$ netdb_name_type="char *"
+$ netdb_net_type="long"
+$ d_gethbyaddr="define"
+$ d_gethbyname="define"
+$ d_getnbyaddr="define"
+$ d_getnbyname="define"
+$ d_getpbynumber="define"
+$ d_getpbyname="define"
+$ d_getsbyport="define"
+$ d_getsbyname="define"
+$ d_gethostprotos="define"
+$ d_getnetprotos="define"
+$ d_getprotoprotos="define"
+$ d_getservprotos="define"
+$ IF ccname .EQS. "DEC" .OR. ccname .EQS. "CXX"
+$ THEN
+$ socksizetype="unsigned int"
+$ ELSE
+$ socksizetype="int *"
+$ ENDIF
+$ ELSE
+$ d_vms_do_sockets="undef"
+$ d_htonl="undef"
+$ d_socket="undef"
+$ d_select="undef"
+$ netdb_hlen_type="int"
+$ netdb_host_type="char *"
+$ netdb_name_type="char *"
+$ netdb_net_type="long"
+$ d_gethbyaddr="undef"
+$ d_gethbyname="undef"
+$ d_getnbyaddr="undef"
+$ d_getnbyname="undef"
+$ d_getpbynumber="undef"
+$ d_getpbyname="undef"
+$ d_getsbyport="undef"
+$ d_getsbyname="undef"
+$ d_gethostprotos="undef"
+$ d_getnetprotos="undef"
+$ d_getprotoprotos="undef"
+$ d_getservprotos="undef"
+$ socksizetype="undef"
+$ ENDIF
+$! Threads
+$ IF use_threads
+$ THEN
+$ usethreads="define"
+$ d_pthreads_created_joinable="define"
+$ if (vms_ver .GES. "7.0")
+$ THEN
+$ d_oldpthreads="undef"
+$ ELSE
+$ d_oldpthreads="define"
+$ ENDIF
+$ ELSE
+$ d_oldpthreads="undef"
+$ usethreads="undef"
+$ d_pthreads_created_joinable="undef"
+$ ENDIF
+$!
+$! new (5.005_62++) typedefs for primitives
+$!
+$ echo "Choosing the C types to be used for Perl's internal types..."
+$ ivtype="long"
+$ uvtype="unsigned long"
+$ i8type="char"
+$ u8type="unsigned char"
+$ i16type="short"
+$ u16type="unsigned short"
+$ i32type="int"
+$ u32type="unsigned int"
+$ i64type="long long"
+$ u64type="unsigned long long"
+$ nvtype="double"
+$!
+$ IF use64bitint .OR. use64bitint .EQS. "define"
+$ THEN
+$ ivtype = "''i64type'"
+$ uvtype = "''u64type'"
+$ nvtype="long double"
+$ ELSE
+$ i64size="undef"
+$ u64size="undef"
+$ ENDIF
+$!
+$ tmp = "''ivtype'"
+$ GOSUB type_size_check
+$ ivsize = tmp
+$ IF use64bitint .OR. use64bitint .EQS. "define" THEN i64size = tmp
+$ IF ivtype .eqs. "long"
+$ THEN longsize = tmp
+$ ELSE
+$ tmp = "long"
+$ GOSUB type_size_check
+$ longsize = tmp
+$ ENDIF
+$!
+$ tmp = "''uvtype'"
+$ GOSUB type_size_check
+$ uvsize = tmp
+$ IF use64bitint .OR. use64bitint .EQS. "define" THEN u64size = tmp
+$!
+$ tmp = "''i8type'"
+$ GOSUB type_size_check
+$ i8size = tmp
+$!
+$ tmp = "''u8type'"
+$ GOSUB type_size_check
+$ u8size = tmp
+$!
+$ tmp = "''i16type'"
+$ GOSUB type_size_check
+$ i16size = tmp
+$ IF i16type .eqs. "short"
+$ THEN shortsize = tmp
+$ ELSE
+$ tmp = "short"
+$ gosub type_size_check
+$ shortsize = tmp
+$ ENDIF
+$!
+$ tmp = "''u16type'"
+$ GOSUB type_size_check
+$ u16size = tmp
+$!
+$ tmp = "''i32type'"
+$ GOSUB type_size_check
+$ i32size = tmp
+$ IF i32type .eqs. "int"
+$ THEN intsize = tmp
+$ ELSE
+$ tmp = "int"
+$ gosub type_size_check
+$ intsize = tmp
+$ ENDIF
+$!
+$ tmp = "''u32type'"
+$ gosub type_size_check
+$ u32size = tmp
+$!
+$ tmp = "''nvtype'"
+$ GOSUB type_size_check
+$ nvsize = tmp
+$!
+$ echo "(IV will be ""''ivtype'"", ''ivsize' bytes)"
+$ echo "(UV will be ""''uvtype'"", ''uvsize' bytes)"
+$ echo "(NV will be ""''nvtype'"", ''nvsize' bytes)"
+$!
+$ echo4 "Checking whether your NVs can preserve your UVs..."
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main() {"
+$ WS " ''uvtype' k = (''uvtype')~0, l;"
+$ WS " ''nvtype' d;"
+$ WS " l = k;"
+$ WS " d = (''nvtype')l;"
+$ WS " l = (''uvtype')d;"
+$ WS " if (l == k)"
+$ WS " printf(""preserve\n"");"
+$ WS " exit(0);"
+$ WS "}"
+$ CS
+$ GOSUB compile
+$ IF tmp .EQS. "preserve"
+$ THEN
+$ d_nv_preserves_uv = "define"
+$ echo "Yes, they can."
+$ d_nv_preserves_uv_bits = F$STRING(F$INTEGER(uvsize) * 8)
+$ ELSE
+$ d_nv_preserves_uv = "undef"
+$ echo "No, they can't."
+$ echo4 "Checking how many bits of your UVs your NVs can preserve..."
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main() {"
+$ WS " ''uvtype' u = 0;"
+$ WS " int n = 8 * ''uvsize';"
+$ WS " int i;"
+$ WS " for (i = 0; i < n; i++) {"
+$ WS " u = u << 1 | (''uvtype')1;"
+$ WS " if ((''uvtype')(''nvtype')u != u)"
+$ WS " break;"
+$ WS " }"
+$ WS " printf(""%d\n"", i);"
+$ WS " exit(0);"
+$ WS "}"
+$ GOSUB compile
+$ d_nv_preserves_uv_bits = tmp
+$ ENDIF
+$ DELETE/SYMBOL tmp
+$!
+$ ivdformat="""ld"""
+$ uvuformat="""lu"""
+$ uvoformat="""lo"""
+$ uvxformat="""lx"""
+$ uvXUformat="""lX"""
+$! uselongdouble?
+$ nveformat="""e"""
+$ nvfformat="""f"""
+$ nvgformat="""g"""
+$!
+$! Finally the composite ones. All config
+$!
+$ myuname="''osname' ''myname' ''osvers' ''F$EDIT(hwname, "TRIM")'"
+$!
+$ IF ccname .EQS. "DEC"
+$ THEN
+$ ccflags="/Include=[]/Standard=Relaxed_ANSI/Prefix=All/Obj=''obj_ext'/NoList''ccflags'"
+$ ENDIF
+$ i_dirent = "undef"
+$ IF ccname .EQS. "CXX"
+$ THEN
+$ i_dirent = "define"
+$ ccflags="/Include=[]/Standard=ANSI/Prefix=All/Obj=''obj_ext'/NoList''ccflags'"
+$ ENDIF
+$ IF use_vmsdebug_perl
+$ THEN
+$ optimize="/Debug/NoOpt"
+$ ldflags="/Debug/Trace/Map"
+$ dbgprefix = "DBG"
+$ ELSE
+$ optimize= ""
+$ ldflags="/NoTrace/NoMap"
+$ dbgprefix = ""
+$ ENDIF
+$!
+$! Okay, we've got everything configured. Now go write out a config.sh.
+$ basename_config_sh = F$PARSE(config_sh,,,"NAME",)+F$PARSE(config_sh,,,"TYPE",)
+$ echo4 "Creating ''basename_config_sh'..."
+$ open/write CONFIG 'config_sh'
+$ WC := write CONFIG
+$!
+$! ##BEGIN WRITE NEW CONSTANTS HERE##
+$!
+$ WC "#!/bin/sh"
+$ WC "#"
+$ WC "# This file was produced by Configure.COM on a ''osname' system."
+$ WC "#"
+$ WC "# Package name : ''package'"
+$ WC "# Source directory : ''src'"
+$ WC "# Configuration time: " + cf_time
+$ WC "# Configuration by : " + cf_by
+$ WC "# Target system : " + myuname
+$ WC ""
+$ WC "CONFIG='true'"
+$ WC "Makefile_SH='" + Makefile_SH + "'"
+$ WC "Mcc='" + Mcc + "'"
+$ WC "PERL_REVISION='" + revision + "'"
+$ WC "PERL_VERSION='" + patchlevel + "'"
+$ WC "PERL_SUBVERSION='" + subversion + "'"
+$ WC "PERL_API_VERSION='" + api_version + "'"
+$ WC "PERL_API_SUBVERSION='" + api_subversion + "'"
+$ WC "alignbytes='" + alignbytes + "'"
+$ WC "aphostname='write sys$output f$edit(f$getsyi(\""SCSNODE\""),\""TRIM,LOWERCASE\"")'"
+$ WC "ar='" + "'"
+$ WC "archlib='" + archlib + "'"
+$ WC "archlibexp='" + archlibexp + "'"
+$ WC "archname='" + archname + "'"
+$ WC "baserev='" + baserev + "'"
+$ WC "bin='" + bin + "'"
+$ WC "binexp='" + binexp + "'"
+$ WC "builddir='" + builddir + "'"
+$ WC "byteorder='1234'"
+$ WC "castflags='0'"
+$ WC "cc='" + perl_cc + "'"
+$ WC "cccdlflags='" + cccdlflags + "'"
+$ WC "ccdlflags='" + ccdlflags + "'"
+$ WC "ccflags='" + ccflags + "'"
+$ WC "ccname='" + ccname + "'"
+$ WC "ccversion='" + ccversion + "'"
+$ WC "cf_by='" + cf_by + "'"
+$ WC "cf_email='" + cf_email + "'"
+$ WC "cf_time='" + cf_time + "'"
+$ WC "config_args='" + config_args + "'"
+$ WC "config_sh='" + config_sh + "'"
+$ WC "cpp_stuff='" + cpp_stuff + "'"
+$ WC "cpplast='" + cpplast + "'"
+$ WC "cppminus='" + cppminus + "'"
+$ WC "cpprun='" + cpprun + "'"
+$ WC "cppstdin='" + cppstdin + "'"
+$ WC "crosscompile='undef'"
+$ WC "d__fwalk='undef'"
+$ WC "d_Gconvert='my_gconvert(x,n,t,b)'"
+$ WC "d_PRId64='" + d_PRId64 + "'"
+$ WC "d_PRIEldbl='" + d_PRIEUldbl + "'"
+$ WC "d_PRIFldbl='" + d_PRIFUldbl + "'"
+$ WC "d_PRIGldbl='" + d_PRIGUldbl + "'"
+$ WC "d_PRIX64='" + d_PRIXU64 + "'"
+$ WC "d_PRIeldbl='" + d_PRIeldbl + "'"
+$ WC "d_PRIfldbl='" + d_PRIfldbl + "'"
+$ WC "d_PRIgldbl='" + d_PRIgldbl + "'"
+$ WC "d_PRIo64='" + d_PRIo64 + "'"
+$ WC "d_PRIu64='" + d_PRIu64 + "'"
+$ WC "d_PRIx64='" + d_PRIx64 + "'"
+$ WC "d_SCNfldbl='" + d_SCNfldbl + "'"
+$ WC "d_access='" + d_access + "'"
+$ WC "d_accessx='undef'"
+$ WC "d_alarm='define'"
+$ WC "d_archlib='define'"
+$ WC "d_atolf='" + d_atolf + "'"
+$ WC "d_atoll='" + d_atoll + "'"
+$ WC "d_attribut='" + d_attribut + "'"
+$ WC "d_bcmp='" + d_bcmp + "'"
+$ WC "d_bcopy='" + d_bcopy + "'"
+$ WC "d_bincompat3='undef'"
+$ WC "d_bincompat5005='undef'"
+$ WC "d_bsdgetpgrp='undef'"
+$! WC "d_bsdpgrp='undef'"
+$ WC "d_bsdsetpgrp='undef'"
+$ WC "d_bzero='" + d_bzero + "'"
+$ WC "d_casti32='define'"
+$ WC "d_castneg='define'"
+$ WC "d_charvspr='undef'"
+$ WC "d_chown='define'"
+$ WC "d_chroot='undef'"
+$ WC "d_chsize='undef'"
+$ WC "d_cmsghdr_s='undef'"
+$ WC "d_const='define'"
+$ WC "d_crypt='define'"
+$ WC "d_csh='undef'"
+$ WC "d_cuserid='define'"
+$ WC "d_dbl_dig='define'"
+$ WC "d_difftime='define'"
+$ WC "d_dirnamlen='define'"
+$ WC "d_dlerror='undef'"
+$ WC "d_dlsymun='undef'"
+$ WC "d_dosuid='undef'"
+$ WC "d_drand48proto='" + d_drand48proto + "'"
+$ WC "d_dup2='define'"
+$ WC "d_eaccess='undef'"
+$ WC "d_endgrent='define'"
+$ WC "d_endhent='" + d_endhent + "'"
+$ WC "d_endnent='" + d_endnent + "'"
+$ WC "d_endpent='" + d_endpent + "'"
+$ WC "d_endpwent='define'"
+$ WC "d_endsent='" + d_endsent + "'"
+$ WC "d_eofnblk='undef'"
+$ WC "d_eunice='undef'"
+$ WC "d_fchmod='undef'"
+$ WC "d_fchown='undef'"
+$ WC "d_fcntl='" + d_fcntl + "'"
+$ WC "d_fcntl_can_lock='" + d_fcntl_can_lock + "'"
+$ WC "d_fd_set='" + d_fd_set + "'"
+$ WC "d_fgetpos='define'"
+$ WC "d_flexfnam='define'"
+$ WC "d_flock='undef'"
+$ WC "d_fork='undef'"
+$ WC "d_fpathconf='" + d_fpathconf + "'"
+$ WC "d_fpos64_t='" + d_fpos64_t + "'"
+$ WC "d_frexpl='" + d_frexpl + "'"
+$ WC "d_fs_data_s='undef'"
+$ WC "d_fseeko='undef'"
+$ WC "d_fsetpos='define'"
+$ WC "d_fstatfs='undef'"
+$ WC "d_fstatvfs='undef'"
+$ WC "d_fsync='undef'"
+$ WC "d_ftello='undef'"
+$ WC "d_getcwd='undef'"
+$ WC "d_getespwnam='undef'"
+$ WC "d_getfsstat='undef'"
+$ WC "d_getgrent='define'"
+$ WC "d_getgrps='undef'"
+$ WC "d_gethbyaddr='" + d_gethbyaddr + "'"
+$ WC "d_gethbyname='" + d_gethbyname + "'"
+$ WC "d_gethent='" + d_gethent + "'"
+$ WC "d_gethname='" + d_gethname + "'"
+$ WC "d_gethostprotos='" + d_gethostprotos + "'"
+$ WC "d_getlogin='define'"
+$ WC "d_getmnt='undef'"
+$ WC "d_getmntent='undef'"
+$ WC "d_getnbyaddr='" + d_getnbyaddr + "'"
+$ WC "d_getnbyname='" + d_getnbyname + "'"
+$ WC "d_getnent='" + d_getnent + "'"
+$ WC "d_getnetprotos='" + d_getnetprotos + "'"
+$ WC "d_getpagsz='undef'"
+$ WC "d_getpbyname='" + d_getpbyname + "'"
+$ WC "d_getpbynumber='" + d_getpbynumber + "'"
+$ WC "d_getpent='" + d_getpent + "'"
+$ WC "d_getpgid='undef'"
+$ WC "d_getpgrp2='undef'"
+$ WC "d_getpgrp='undef'"
+$ WC "d_getppid='undef'"
+$ WC "d_getprior='undef'"
+$ WC "d_getprotoprotos='" + d_getprotoprotos + "'"
+$ WC "d_getprpwnam='undef'"
+$ WC "d_getpwent='define'"
+$ WC "d_getsbyname='" + d_getsbyname + "'"
+$ WC "d_getsbyport='" + d_getsbyport + "'"
+$ WC "d_getsent='" + d_getsent + "'"
+$ WC "d_getservprotos='" + d_getservprotos + "'"
+$ WC "d_getspnam='undef'"
+$ WC "d_gettimeod='" + d_gettimeod + "'"
+$ WC "d_gnulibc='undef'"
+$ WC "d_grpasswd='undef'"
+$ WC "d_hasmntopt='undef'"
+$ WC "d_htonl='" + d_htonl + "'"
+$ WC "d_iconv='" + d_iconv +"'"
+$ WC "d_index='" + d_index + "'"
+$ WC "d_inetaton='undef'"
+$ WC "d_int64_t='" + d_int64_t + "'"
+$ WC "d_isascii='define'"
+$ WC "d_isnan='" + d_isnan + "'"
+$ WC "d_isnanl='" + d_isnanl + "'"
+$ WC "d_killpg='undef'"
+$ WC "d_lchown='undef'"
+$ WC "d_ldbl_dig='define'"
+$ WC "d_link='undef'"
+$ WC "d_llseek='undef'"
+$ WC "d_locconv='" + d_locconv + "'"
+$ WC "d_lockf='undef'"
+$ WC "d_longdbl='" + d_longdbl + "'"
+$ WC "d_longlong='" + d_longlong + "'"
+$ WC "d_lseekproto='define'"
+$ WC "d_lstat='undef'"
+$ WC "d_madvise='undef'"
+$ WC "d_mblen='" + d_mblen + "'"
+$ WC "d_mbstowcs='" + d_mbstowcs + "'"
+$ WC "d_mbtowc='" + d_mbtowc + "'"
+$ WC "d_memchr='" + d_memchr + "'"
+$ WC "d_memcmp='define'"
+$ WC "d_memcpy='define'"
+$ WC "d_memmove='define'"
+$ WC "d_memset='define'"
+$ WC "d_mkdir='define'"
+$ WC "d_mkdtemp='" + d_mkdtemp + "'"
+$ WC "d_mkfifo='undef'"
+$ WC "d_mknod='undef'"
+$ WC "d_mkstemp='" + d_mkstemp + "'"
+$ WC "d_mkstemps='" + d_mkstemps + "'"
+$ WC "d_mktime='" + d_mktime + "'"
+$ WC "d_mmap='undef'"
+$ WC "d_modfl='" + d_modfl + "'"
+$ WC "d_mprotect='undef'"
+$ WC "d_msg='undef'"
+$ WC "d_msg_ctrunc='undef'"
+$ WC "d_msg_dontroute='undef'"
+$ WC "d_msg_oob='undef'"
+$ WC "d_msg_peek='undef'"
+$ WC "d_msg_proxy='undef'"
+$ WC "d_msghdr_s='undef'"
+$ WC "d_msync='undef'"
+$ WC "d_munmap='undef'"
+$ WC "d_mymalloc='" + d_mymalloc + "'"
+$ WC "d_nice='define'"
+$ WC "d_nv_preserves_uv='" + d_nv_preserves_uv + "'"
+$ WC "d_nv_preserves_uv_bits='" + d_nv_preserves_uv_bits + "'"
+$ WC "d_off64_t='" + d_off64_t + "'"
+$ WC "d_old_pthread_create_joinable='" + d_old_pthread_create_joinable + "'"
+$ WC "d_oldarchlib='define'"
+$ WC "d_oldpthreads='" + d_oldpthreads + "'"
+$ WC "d_open3='define'"
+$ WC "d_pathconf='" + d_pathconf + "'"
+$ WC "d_pause='define'"
+$ WC "d_perl_otherlibdirs='undef'"
+$ WC "d_phostname='" + d_phostname + "'"
+$ WC "d_pipe='define'"
+$ WC "d_poll='undef'"
+$ WC "d_pthread_yield='" + d_pthread_yield + "'"
+$ WC "d_pthreads_created_joinable='" + d_pthreads_created_joinable + "'"
+$ WC "d_pwage='undef'"
+$ WC "d_pwchange='undef'"
+$ WC "d_pwclass='undef'"
+$ WC "d_pwcomment='define'"
+$ WC "d_pwexpire='undef'"
+$ WC "d_pwgecos='define'"
+$ WC "d_pwpasswd='define'"
+$ WC "d_pwquota='undef'"
+$ WC "d_qgcvt='undef'"
+$ WC "d_quad='" + d_quad + "'"
+$ WC "d_readdir='define'"
+$ WC "d_readlink='undef'"
+$ WC "d_readv='undef'"
+$ WC "d_recvmsg='undef'"
+$ WC "d_rename='define'"
+$ WC "d_rewinddir='define'"
+$ WC "d_rmdir='define'"
+$ WC "d_safebcpy='undef'"
+$ WC "d_safemcpy='define'"
+$ WC "d_sanemcmp='define'"
+$ WC "d_sbrkproto='define'"
+$ WC "d_sched_yield='" + d_sched_yield + "'"
+$ WC "d_scm_rights='undef'"
+$ WC "d_seekdir='define'"
+$ WC "d_select='" + d_select + "'"
+$ WC "d_sem='undef'"
+$ WC "d_semctl_semid_ds='undef'"
+$ WC "d_semctl_semun='undef'"
+$ WC "d_sendmsg='undef'"
+$ WC "d_setegid='undef'"
+$ WC "d_setenv='" + d_setenv + "'"
+$ WC "d_seteuid='undef'"
+$ WC "d_setgrent='undef'"
+$ WC "d_setgrps='undef'"
+$ WC "d_sethent='" + d_sethent + "'"
+$ WC "d_setlinebuf='undef'"
+$ WC "d_setlocale='" + d_setlocale + "'"
+$ WC "d_setnent='" + d_setnent + "'"
+$ WC "d_setpent='" + d_setpent + "'"
+$ WC "d_setpgid='undef'"
+$ WC "d_setpgrp2='undef'"
+$ WC "d_setpgrp='undef'"
+$ WC "d_setprior='undef'"
+$ WC "d_setproctitle='" + d_setproctitle + "'"
+$ WC "d_setpwent='define'"
+$ WC "d_setregid='undef'"
+$ WC "d_setresgid='undef'"
+$ WC "d_setresuid='undef'"
+$ WC "d_setreuid='undef'"
+$ WC "d_setrgid='undef'"
+$ WC "d_setruid='undef'"
+$ WC "d_setsent='" + d_setsent + "'"
+$ WC "d_setsid='undef'"
+$ WC "d_setvbuf='" + d_setvbuf + "'"
+$ WC "d_sfio='undef'"
+$ WC "d_shm='undef'"
+$ WC "d_shmatprototype='undef'"
+$ WC "d_sigaction='" + d_sigaction + "'"
+$ WC "d_sigsetjmp='" + d_sigsetjmp + "'"
+$ WC "d_socket='" + d_socket + "'"
+$ WC "d_socklen_t='" + d_socklen_t + "'"
+$ WC "d_sockpair='undef'"
+$ WC "d_socks5_init='undef'"
+$ WC "d_sqrtl='define'"
+$ WC "d_statblks='undef'"
+$ WC "d_statfs_f_flags='undef'"
+$ WC "d_statfs_s='undef'"
+$ WC "d_statfsflags='undef'"
+$ WC "d_stdio_cnt_lval='" + d_stdio_cnt_lval + "'"
+$ WC "d_stdio_ptr_lval='" + d_stdio_ptr_lval + "'"
+$ WC "d_stdio_ptr_lval_sets_cnt='" + d_stdio_ptr_lval_sets_cnt + "'"
+$ WC "d_stdio_ptr_lval_nochange_cnt='" + d_stdio_ptr_lval_nochange_cnt + "'"
+$ WC "d_stdio_stream_array='undef'"
+$ WC "d_stdiobase='" + d_stdiobase + "'"
+$ WC "d_stdstdio='" + d_stdstdio + "'"
+$ WC "d_strchr='define'"
+$ WC "d_strcoll='" + d_strcoll + "'"
+$ WC "d_strctcpy='define'"
+$ WC "d_strerrm='strerror((e),vaxc$errno)'"
+$ WC "d_strerror='define'"
+$ WC "d_strtod='define'"
+$ WC "d_strtol='define'"
+$ WC "d_strtold='" + d_strtold + "'"
+$ WC "d_strtoll='" + d_strtoll + "'"
+$ WC "d_strtoul='define'"
+$ WC "d_strtoull='" + d_strtoull + "'"
+$ WC "d_strtouq='" + d_strtouq + "'"
+$ WC "d_strxfrm='" + d_strxfrm + "'"
+$ WC "d_suidsafe='undef'"
+$ WC "d_symlink='undef'"
+$ WC "d_syscall='undef'"
+$ WC "d_sysconf='" + d_sysconf + "'"
+$ WC "d_syserrlst='undef'"
+$ WC "d_system='define'"
+$ WC "d_tcgetpgrp='undef'"
+$ WC "d_tcsetpgrp='undef'"
+$ WC "d_telldir='define'"
+$ WC "d_telldirproto='define'"
+$ WC "d_times='define'"
+$ WC "d_truncate='" + d_truncate + "'"
+$ WC "d_tzname='undef'"
+$ WC "d_umask='define'"
+$ WC "d_uname='" + d_uname + "'"
+$ WC "d_union_semun='undef'"
+$ WC "d_unlink_all_versions='undef'"
+$ WC "d_ustat='undef'"
+$ WC "d_vendorarch='undef'"
+$ WC "d_vendorlib='undef'"
+$ WC "d_vfork='define'"
+$ WC "d_vms_case_sensitive_symbols='" + d_vms_be_case_sensitive + "'" ! VMS
+$ WC "d_vms_do_sockets='" + d_vms_do_sockets + "'" ! VMS
+$ WC "d_void_closedir='define'"
+$ WC "d_volatile='define'"
+$ WC "d_vprintf='define'"
+$ WC "d_wait4='" + d_wait4 + "'"
+$ WC "d_waitpid='define'"
+$ WC "d_wcstombs='" + d_wcstombs + "'"
+$ WC "d_wctomb='" + d_wctomb + "'"
+$ WC "d_writev='undef'"
+$ WC "db_hashtype=' '"
+$ WC "db_prefixtype=' '"
+$ WC "dbgprefix='" + dbgprefix + "'"
+$ WC "defvoidused='15'"
+$ WC "devtype='" + devtype + "'"
+$ WC "direntrytype='struct dirent'"
+$ WC "dlext='" + dlext + "'"
+$ WC "dlobj='" + dlobj + "'"
+$ WC "dlsrc='dl_vms.c'"
+$ WC "doublesize='" + doublesize + "'"
+$ WC "drand01='" + drand01 + "'"
+$ WC "dynamic_ext='" + extensions + "'"
+$ WC "eagain=' '"
+$ WC "ebcdic='undef'"
+$ WC "embedmymalloc='" + mymalloc + "'"
+$ WC "eunicefix=':'"
+$ WC "exe_ext='" + exe_ext + "'"
+$ WC "extensions='" + extensions + "'"
+$ WC "fflushNULL='define'"
+$ WC "fflushall='undef'"
+$ WC "fpostype='fpos_t'"
+$ WC "freetype='void'"
+$ WC "full_ar='" + "'"
+$ WC "full_csh='" + " '"
+$ WC "full_sed='_NLA0:'"
+$ WC "gccversion='" + gccversion + "'"
+$ WC "gidformat='lu'"
+$ WC "gidsign='1'"
+$ WC "gidsize='4'"
+$ WC "gidtype='" + gidtype + "'"
+$ WC "groupstype='Gid_t'"
+$ WC "hint='none'"
+$ WC "hintfile='" + "'"
+$ WC "i16size='" + i16size + "'"
+$ WC "i16type='" + i16type + "'"
+$ WC "i32size='" + i32size + "'"
+$ WC "i32type='" + i32type + "'"
+$ WC "i64size='" + i64size + "'"
+$ WC "i64type='" + i64type + "'"
+$ WC "i8size='" + i8size + "'"
+$ WC "i8type='" + i8type + "'"
+$ WC "i_arpainet='undef'"
+$ WC "i_dbm='undef'"
+$ WC "i_dirent='" + i_dirent + "'"
+$ WC "i_dlfcn='undef'"
+$ WC "i_fcntl='" + i_fcntl + "'"
+$ WC "i_float='define'"
+$ WC "i_grp='undef'"
+$ WC "i_iconv='" + i_iconv +"'"
+$ WC "i_ieeefp='undef'"
+$ WC "i_inttypes='" + i_inttypes + "'"
+$ WC "i_libutil='" + i_libutil + "'"
+$ WC "i_limits='define'"
+$ WC "i_locale='" + i_locale + "'"
+$ WC "i_machcthr='undef'"
+$ WC "i_machcthreads='undef'"
+$ WC "i_math='define'"
+$ WC "i_memory='undef'"
+$ WC "i_mntent='undef'"
+$ WC "i_ndbm='undef'"
+$ WC "i_netdb='" + i_netdb + "'"
+$ WC "i_neterrno='define'"
+$ WC "i_netinettcp='" + i_netinettcp + "'"
+$ WC "i_niin='" + i_niin + "'"
+$ WC "i_poll='" + i_poll + "'"
+$ WC "i_prot='undef'"
+$ WC "i_pthread='define'"
+$ WC "i_pwd='undef'"
+$ WC "i_rpcsvcdbm='undef'"
+$ WC "i_sfio='undef'"
+$ WC "i_sgtty='undef'"
+$ WC "i_shadow='" + i_shadow + "'"
+$ WC "i_socks='" + i_socks + "'"
+$ WC "i_stdarg='define'"
+$ WC "i_stddef='define'"
+$ WC "i_stdlib='define'"
+$ WC "i_string='define'"
+$ WC "i_sunmath='undef'"
+$ WC "i_sysaccess='" + i_sysaccess + "'"
+$ WC "i_sysdir='undef'"
+$ WC "i_sysfile='" + i_sysfile + "'"
+$ WC "i_sysioctl='undef'"
+$ WC "i_syslog='" + i_syslog + "'"
+$ WC "i_sysmman='undef'"
+$ WC "i_sysmode='" + i_sysmode + "'"
+$ WC "i_sysmount='undef'"
+$ WC "i_sysndir='undef'"
+$ WC "i_sysparam='undef'"
+$ WC "i_sysresrc='undef'"
+$ WC "i_syssecrt='" + i_syssecrt + "'"
+$ WC "i_sysselct='undef'"
+$ WC "i_sysstat='define'"
+$ WC "i_sysstatfs='undef'"
+$ WC "i_sysstatvfs='undef'"
+$ WC "i_systime='undef'"
+$ WC "i_systimek='undef'"
+$ WC "i_systimes='undef'"
+$ WC "i_systypes='define'"
+$ WC "i_sysuio='" + i_sysuio + "'"
+$ WC "i_sysun='undef'"
+$ WC "i_sysutsname='" + i_sysutsname + "'"
+$ WC "i_sysvfs='undef'"
+$ WC "i_syswait='undef'"
+$ WC "i_termio='undef'"
+$ WC "i_termios='undef'"
+$ WC "i_time='define'"
+$ WC "i_unistd='" + i_unistd + "'"
+$ WC "i_ustat='undef'"
+$ WC "i_utime='undef'"
+$ WC "i_values='undef'"
+$ WC "i_varargs='undef'"
+$ WC "i_vfork='undef'"
+$ WC "inc_version_list='0'"
+$ WC "inc_version_list_init='0'"
+$ WC "installarchlib='" + installarchlib + "'"
+$ WC "installbin='" + installbin + "'"
+$ WC "installman1dir='" + installman1dir + "'"
+$ WC "installman3dir='" + installman3dir + "'"
+$ WC "installprivlib='" + installprivlib + "'"
+$ WC "installscript='" + installscript + "'"
+$ WC "installsitearch='" + installsitearch + "'"
+$ WC "installsitelib='" + installsitelib + "'"
+$ WC "installusrbinperl='undef'"
+$ WC "intsize='" + intsize + "'"
+$ WC "ivdformat='" + ivdformat + "'"
+$ WC "ivsize='" + ivsize + "'"
+$ WC "ivtype='" + ivtype + "'"
+$ WC "known_extensions='" + known_extensions + "'"
+$ WC "ld='" + ld + "'"
+$ WC "lddlflags='/Share'"
+$ WC "ldflags='" + ldflags + "'"
+$ WC "lib_ext='" + lib_ext + "'"
+$ WC "libc='" + libc + "'"
+$ WC "libpth='/sys$share /sys$library'"
+$ WC "libs='" + libs + "'"
+$ WC "longdblsize='" + longdblsize + "'"
+$ WC "longlongsize='" + longlongsize + "'"
+$ WC "longsize='" + longsize + "'"
+$ WC "lseeksize='4'"
+$ WC "lseektype='int'"
+$ WC "mab='" + "'"
+$ WC "make='" + make + "'"
+$ WC "malloctype='void *'"
+$ WC "man1ext='rno'"
+$ WC "man3ext='rno'"
+$ WC "mmaptype=' " + "'"
+$ WC "modetype='unsigned int'"
+$ WC "multiarch='undef'"
+$ WC "mydomain='" + mydomain + "'"
+$ WC "myhostname='" + myhostname + "'"
+$ WC "myuname='" + myuname + "'"
+$ WC "netdb_hlen_type='" + netdb_hlen_type + "'"
+$ WC "netdb_host_type='" + netdb_host_type + "'"
+$ WC "netdb_name_type='" + netdb_name_type + "'"
+$ WC "netdb_net_type='" + netdb_net_type + "'"
+$ WC "nveformat='" + nveformat + "'"
+$ WC "nvfformat='" + nvfformat + "'"
+$ WC "nvgformat='" + nvgformat + "'"
+$ WC "nvsize='" + nvsize + "'"
+$ WC "nvtype='" + nvtype + "'"
+$ WC "o_nonblock=' '"
+$ WC "obj_ext='" + obj_ext + "'"
+$ WC "old_pthread_create_joinable='" + old_pthread_create_joinable + "'"
+$ WC "oldarchlib='" + oldarchlib + "'"
+$ WC "oldarchlibexp='" + oldarchlibexp + "'"
+$ WC "optimize='" + optimize + "'"
+$ WC "osname='" + osname + "'"
+$ WC "osvers='" + osvers + "'"
+$ WC "otherlibdirs='" + "'"
+$ WC "package='" + package + "'"
+$ WC "pager='" + pager + "'"
+$ WC "patchlevel='" + patchlevel + "'"
+$ WC "path_sep='|'"
+$ WC "perl_root='" + perl_root + "'" ! VMS specific $trnlnm()
+$ WC "perladmin='" + perladmin + "'"
+$ WC "perllibs='" + perllibs + "'"
+$ WC "pgflquota='" + pgflquota + "'"
+$ WC "pidtype='" + pidtype + "'"
+$ WC "pm_apiversion='" + version + "'"
+$! WC "prefix='" + vms_prefix + "'"
+$ WC "prefix='" + prefix + "'"
+$ WC "privlib='" + privlib + "'"
+$ WC "privlibexp='" + privlibexp + "'"
+$ WC "prototype='define'"
+$ WC "ptrsize='" + ptrsize + "'"
+$ WC "quadkind='" + quadkind + "'"
+$ WC "quadtype='" + quadtype + "'"
+$ WC "randbits='31'"
+$ WC "randseedtype='" + randseedtype + "'"
+$ WC "ranlib='" + "'"
+$ WC "rd_nodata=' '"
+$ WC "revision='" + revision + "'"
+$ WC "sPRId64='" + sPRId64 + "'"
+$ WC "sPRIEldbl='" + sPRIEUldbl + "'"
+$ WC "sPRIFldbl='" + sPRIFUldbl + "'"
+$ WC "sPRIGldbl='" + sPRIGUldbl + "'"
+$ WC "sPRIX64='" + sPRIXU64 + "'"
+$ WC "sPRIeldbl='" + sPRIeldbl + "'"
+$ WC "sPRIfldbl='" + sPRIfldbl + "'"
+$ WC "sPRIgldbl='" + sPRIgldbl + "'"
+$! WC "sPRIi64='" + sPRIi64 + "'"
+$ WC "sPRIo64='" + sPRIo64 + "'"
+$ WC "sPRIu64='" + sPRIu64 + "'"
+$ WC "sPRIx64='" + sPRIx64 + "'"
+$ WC "sSCNfldbl='" + sSCNfldbl + "'"
+$ WC "sched_yield='" + sched_yield + "'"
+$ WC "seedfunc='" + seedfunc + "'"
+$ WC "selectminbits='32'"
+$ WC "selecttype='" + selecttype + "'"
+$ WC "sh='MCR'"
+$ WC "shmattype='" + " '"
+$ WC "shortsize='" + shortsize + "'"
+$ WC "shrplib='define'"
+$ WC "sig_name='" + sig_name + "'"
+$ tmp = "sig_name_init='" + sig_name_init + "'"
+$ WC/symbol tmp
+$ DELETE/SYMBOL tmp
+$ WC "sig_num='" + sig_num + "'"
+$ WC "sig_num_init='" + sig_num_init + "'"
+$ WC "signal_t='" + signal_t + "'"
+$ WC "sitearch='" + sitearch + "'"
+$ WC "sitearchexp='" + sitearchexp + "'"
+$ WC "sitelib='" + sitelib + "'"
+$ WC "sitelib_stem='" + sitelib_stem + "'"
+$ WC "sitelibexp='" + sitelibexp + "'"
+$ WC "sizesize='" + sizesize + "'"
+$ WC "sizetype='size_t'"
+$ WC "so='" + so + "'"
+$ WC "socksizetype='" + socksizetype + "'"
+$ WC "spitshell='write sys$output '"
+$ WC "src='" + src + "'"
+$ WC "ssizetype='int'"
+$ WC "startperl=" + startperl ! This one's special--no enclosing single quotes
+$ WC "static_ext='" + static_ext + "'"
+$ WC "stdchar='" + stdchar + "'"
+$ WC "stdio_base='((*fp)->_base)'"
+$ WC "stdio_bufsiz='((*fp)->_cnt + (*fp)->_ptr - (*fp)->_base)'"
+$ WC "stdio_cnt='((*fp)->_cnt)'"
+$ WC "stdio_ptr='((*fp)->_ptr)'"
+$ WC "stdio_stream_array=' " + "'"
+$ WC "subversion='" + subversion + "'"
+$ WC "timetype='" + timetype + "'"
+$ WC "u16size='" + u16size + "'"
+$ WC "u16type='" + u16type + "'"
+$ WC "u32size='" + u32size + "'"
+$ WC "u32type='" + u32type + "'"
+$ WC "u64size='" + u64size + "'"
+$ WC "u64type='" + u64type + "'"
+$ WC "u8size='" + u8size + "'"
+$ WC "u8type='" + u8type + "'"
+$ WC "uidformat='lu'"
+$ WC "uidsign='1'"
+$ WC "uidsize='4'"
+$ WC "uidtype='" + uidtype + "'"
+$ WC "uquadtype='" + uquadtype + "'"
+$ WC "use5005threads='" + use5005threads + "'"
+$ WC "use64bitall='" + use64bitall + "'"
+$ WC "use64bitint='" + use64bitint + "'"
+$ WC "usedebugging_perl='" + use_debugging_perl + "'"
+$ WC "usedl='" + usedl + "'"
+$ WC "useithreads='" + useithreads + "'"
+$ WC "uselargefiles='" + uselargefiles + "'"
+$ WC "uselongdouble='" + uselongdouble + "'"
+$ WC "usemorebits='" + usemorebits + "'"
+$ WC "usemultiplicity='" + usemultiplicity + "'"
+$ WC "usemymalloc='" + usemymalloc + "'"
+$ WC "useperlio='undef'"
+$ WC "useposix='false'"
+$ WC "usesocks='undef'"
+$ WC "usethreads='" + usethreads + "'"
+$ WC "usevfork='true'"
+$ WC "uvoformat='" + uvoformat + "'"
+$ WC "uvsize='" + uvsize + "'"
+$ WC "uvtype='" + uvtype + "'"
+$ WC "uvuformat='" + uvuformat + "'"
+$ WC "uvxformat='" + uvxformat + "'"
+$ WC "uvXUformat='" + uvXUformat + "'"
+$ WC "vendorarchexp='" + "'"
+$ WC "vendorlib_stem='" + "'"
+$ WC "vendorlibexp='" + "'"
+$ WC "version='" + version + "'"
+$ WC "vms_cc_type='" + vms_cc_type + "'" ! VMS specific
+$ WC "vms_prefix='" + vms_prefix + "'" ! VMS specific
+$ WC "vms_ver='" + vms_ver + "'" ! VMS specific
+$ WC "voidflags='15'"
+$ WC "xs_apiversion='" + version + "'"
+$ WC "CONFIGDOTSH='true'"
+$!
+$! ##END WRITE NEW CONSTANTS HERE##
+$!
+$ CLOSE CONFIG
+$!
+$! Okay, we've gotten here. Build munchconfig.exe
+$ COPY/NOLOG [-.vms]munchconfig.c []
+$ COPY/NOLOG [-.vms]'Makefile_SH' []
+$ 'Perl_CC' munchconfig.c
+$ IF Needs_Opt
+$ THEN
+$ OPEN/WRITE CONFIG []munchconfig.opt
+$ IF ccname .EQS. "GCC"
+$ THEN
+$ WRITE CONFIG "Gnu_CC:[000000]gcclib.olb/library"
+$ ENDIF
+$ WRITE CONFIG "Sys$Share:VAXCRTL/Share"
+$ CLOSE CONFIG
+$ 'ld' munchconfig.obj,munchconfig.opt/opt
+$ DELETE/NOLOG/NOCONFIRM munchconfig.opt;
+$ ELSE
+$ 'ld' munchconfig.obj
+$ ENDIF
+$ IF F$SEARCH("munchconfig.obj") .NES. "" THEN DELETE/NOLOG/NOCONFIRM munchconfig.obj;
+$ IF F$SEARCH("munchconfig.c") .NES. "" THEN DELETE/NOLOG/NOCONFIRM munchconfig.c;
+$ IF ccname .EQS. "CXX"
+$ THEN
+$ CALL Cxx_demangler_cleanup
+$ ENDIF
+$!
+$ IF alldone .EQS. ""
+$ THEN
+$ cat4 SYS$INPUT:
+$ DECK
+
+If you'd like to make any changes to the config.sh file before I begin
+to configure things, answer yes to the following question.
+
+$ EOD
+$ dflt="n"
+$ rp="Do you wish to edit ''basename_config_sh'? [''dflt'] "
+$ GOSUB myread
+$ IF ans .EQS. "" then ans = dflt
+$ IF ans
+$ THEN
+$ echo4 ""
+$ echo4 "Be sure to type LOGOUT after you have edited the file,"
+$ echo4 "then this procedure will resume."
+$ echo4 ""
+$ default = F$ENVIRONMENT("DEFAULT")
+$ DIRECTORY 'config_sh'
+$ SET DEFAULT [-]
+$ SPAWN/WAIT
+$ SET DEFAULT 'default'
+$ ENDIF
+$ ENDIF
+$!
+$ echo ""
+$ echo4 "Adding ''osname' specific preprocessor commands."
+$ !
+$ ! we need an fdl file
+$ CREATE [-]CONFIG.FDL
+$ DECK
+RECORD
+ FORMAT STREAM_LF
+$ EOD
+$ CREATE /FDL=[-]CONFIG.FDL [-]CONFIG.LOCAL
+$ ! First spit out the header info with the local defines (to get
+$ ! around the 255 character command line limit)
+$ OPEN/APPEND CONFIG [-]config.local
+$ IF use_debugging_perl THEN WC "#define DEBUGGING"
+$ IF use_two_pot_malloc THEN WC "#define TWO_POT_OPTIMIZE"
+$ IF mymalloc THEN WC "#define EMBEDMYMALLOC"
+$ IF use_pack_malloc THEN WC "#define PACK_MALLOC"
+$ IF use_debugmalloc THEN WC "#define DEBUGGING_MSTATS"
+$ IF ccname .EQS. "GCC" THEN WC "#define GNUC_ATTRIBUTE_CHECK"
+$ IF (Has_Dec_C_Sockets)
+$ THEN
+$ WC "#define VMS_DO_SOCKETS"
+$ WC "#define DECCRTL_SOCKETS"
+$ ELSE
+$ IF Has_Socketshr THEN WC "#define VMS_DO_SOCKETS"
+$ ENDIF
+$! This is VMS-specific for now
+$ WC "#''d_setenv' HAS_SETENV"
+$ IF d_secintgenv THEN WC "#define SECURE_INTERNAL_GETENV"
+$ IF d_alwdeftype THEN WC "#define ALWAYS_DEFTYPES"
+$ IF use64bitint .OR. use64bitint .EQS. "define"
+$ THEN
+$ WC "#define USE_64_BIT_INT"
+$ WC "#define USE_LONG_DOUBLE"
+$ ENDIF
+$ IF use64bitall .OR. use64bitall .EQS. "define" THEN -
+ WC "#define USE_64_BIT_ALL"
+$ IF be_case_sensitive THEN WC "#define VMS_WE_ARE_CASE_SENSITIVE"
+$ IF d_herrno .EQS. "undef" THEN WC "#define NEED_AN_H_ERRNO"
+$ WC "#define HAS_ENVGETENV"
+$ WC "#define PERL_EXTERNAL_GLOB"
+$ CLOSE CONFIG
+$!
+$ echo4 "Doing variable substitutions on .SH files..."
+$ echo4 "Extracting config.h (with variable substitutions)"
+$!
+$! Now build the normal config.h
+$ DEFINE/USER_MODE sys$output [-]config.main
+$ mcr []munchconfig 'config_sh' [-]config_h.sh
+$ ! Concatenate them together
+$ copy [-]config.local,[-]config.main [-]config.h
+$! Clean up
+$ DELETE/NOLOG [-]CONFIG.MAIN;*
+$ DELETE/NOLOG [-]CONFIG.LOCAL;*
+$ DELETE/NOLOG [-]CONFIG.FDL;*
+$!
+$ IF ccname .EQS. "DEC"
+$ THEN
+$ DECC_REPLACE = "DECC=decc=1"
+$ ELSE
+$ DECC_REPLACE = "DECC="
+$ ENDIF
+$ IF ccname .EQS. "CXX"
+$ THEN
+$ DECCXX_REPLACE = "DECCXX=DECCXX=1"
+$ ELSE
+$ DECCXX_REPLACE = "DECCXX="
+$ ENDIF
+$ IF ccname .EQS. "GCC"
+$ THEN
+$ GNUC_REPLACE = "GNUC=gnuc=1"
+$ ELSE
+$ GNUC_REPLACE = "GNUC="
+$ ENDIF
+$ IF Has_Dec_C_Sockets
+$ THEN
+$ SOCKET_REPLACE = "SOCKET=DECC_SOCKETS=1"
+$ ELSE
+$ IF Has_Socketshr
+$ THEN
+$ SOCKET_REPLACE = "SOCKET=SOCKETSHR_SOCKETS=1"
+$ ELSE
+$ SOCKET_REPLACE = "SOCKET="
+$ ENDIF
+$ ENDIF
+$ IF Use_Threads
+$ THEN
+$ IF (vms_ver .LES. "6.2")
+$ THEN
+$ THREAD_REPLACE = "THREAD=OLDTHREADED=1"
+$ ELSE
+$ THREAD_REPLACE = "THREAD=THREADED=1"
+$ ENDIF
+$ ELSE
+$ THREAD_REPLACE = "THREAD="
+$ ENDIF
+$ IF mymalloc
+$ THEN
+$ MALLOC_REPLACE = "MALLOC=MALLOC=1"
+$ ELSE
+$ MALLOC_REPLACE = "MALLOC="
+$ ENDIF
+$ echo4 "Extracting ''defmakefile' (with variable substitutions)"
+$ DEFINE/USER_MODE sys$output 'UUmakefile'
+$ mcr []munchconfig 'config_sh' 'Makefile_SH' "''DECC_REPLACE'" -
+ "''DECCXX_REPLACE'" "''ARCH_TYPE'" "''GNUC_REPLACE'" "''SOCKET_REPLACE'" -
+ "''THREAD_REPLACE'" "''C_Compiler_Replace'" "''MALLOC_REPLACE'" -
+ "''Thread_Live_Dangerously'" "PV=''version'" "FLAGS=FLAGS=''extra_flags'"
+$! Clean up after ourselves
+$ DELETE/NOLOG/NOCONFIRM []munchconfig.exe;
+$ echo4 "Extracting make_ext.com (without variable substitutions)"
+$ Create Sys$Disk:[-]make_ext.com
+$ Deck/Dollar="$EndOfTpl$"
+$!++ make_ext.com
+$! NOTE: This file is extracted as part of the VMS configuration process.
+$! Any changes made to it directly will be lost. If you need to make any
+$! changes, please edit the template in Configure.Com instead.
+$ def = F$Environment("Default")
+$ exts1 = F$Edit(p1,"Compress")
+$ p2 = F$Edit(p2,"Upcase,Compress,Trim")
+$ If F$Locate("MCR ",p2).eq.0 Then p2 = F$Extract(3,255,p2)
+$ miniperl = "$" + F$Search(F$Parse(p2,".Exe"))
+$ makeutil = p3
+$ if f$type('p3') .nes. "" then makeutil = 'p3'
+$ targ = F$Edit(p4,"Lowercase")
+$ i = 0
+$ next_ext:
+$ ext = F$Element(i," ",p1)
+$ If ext .eqs. " " Then Goto done
+$ Define/User_mode Perl_Env_Tables CLISYM_LOCAL
+$ miniperl
+$ deck
+ ($extdir = $ENV{'ext'}) =~ s/::/./g;
+ $extdir =~ s#/#.#g;
+ if ($extdir =~ /^vms/i) { $extdir =~ s/vms/.vms.ext/i; }
+ else { $extdir = ".ext.$extdir"; }
+ ($ENV{'extdir'} = "[$extdir]");
+ ($ENV{'up'} = ('-') x ($extdir =~ tr/././));
+$ eod
+$ Set Default &extdir
+$ redesc = 0
+$ If F$Locate("clean",targ) .eqs. F$Length(targ)
+$ Then
+$ Write Sys$Output ""
+$ Write Sys$Output " Making ''ext' (dynamic)"
+$ On Error Then Goto done
+$ If F$Search("Descrip.MMS") .eqs. ""
+$ Then
+$ redesc = 1
+$ Else
+$ If F$CvTime(F$File("Descrip.MMS","rdt")) .lts. -
+ F$CvTime(F$File("Makefile.PL","rdt")) Then redesc = 1
+$ EndIf
+$ Else
+$ Write Sys$Output "''targ'ing ''ext' . . ."
+$ On Error Then Continue
+$ EndIf
+$ If redesc Then -
+ miniperl "-I[''up'.lib]" Makefile.PL "INST_LIB=[''up'.lib]" "INST_ARCHLIB=[''up'.lib]"
+$ makeutil 'targ'
+$ i = i + 1
+$ Set Def &def
+$ Goto next_ext
+$ done:
+$ sts = $Status
+$ Set Def &def
+$ Exit sts
+$!-- make_ext.com
+$EndOfTpl$
+$!
+$! Note that the /key qualifier to search, as in:
+$! search README.* "=head"/key=(position=1)/window=0/output=extra.pods
+$! is not supported on VMS V5.5-2, hence not used in extra_pods.com.
+$!
+$ echo4 "Extracting extra_pods.com (without variable substitutions)"
+$ Create Sys$Disk:[-]extra_pods.com
+$ Deck/Dollar="$EOExtra_Pods$"
+$!++ extra_pods.com
+$! NOTE: This file is extracted as part of the VMS configuration process.
+$! Any changes made to it directly will be lost. If you need to make any
+$! changes, please edit the template in Configure.Com instead.
+$! Use FORCE if you've just podified a README.* file on VMS.
+$ if f$search("extra.pods") .eqs. "" .or. P1 .eqs. "FORCE" then -
+ search README.* "=head"/window=0/output=extra.pods
+$ open/read/error=extra_close EXTRA extra.pods
+$extra_loop:
+$ read/error=extra_close/END_OF_FILE=extra_close EXTRA file
+$ file_type = f$parse(file,,,"TYPE",) - "."
+$ if file_type .nes. "VMS" .and. file_type .nes. "vms"
+$ then
+$ pod_file = "[.pod]perl''file_type'.pod"
+$ file = file - "''f$parse(file,,,"VERSION",)'"
+$ if p1 .eqs. "CLEAN"
+$ then if f$search(pod_file) .nes. "" then delete/log 'pod_file';*
+$ else
+$ do_copy := false
+$ if f$search(pod_file) .eqs. ""
+$ then do_copy := true
+$ else
+$ file_rdt = f$cvtime(f$file_attributes(file,"RDT"))
+$ pod_file_rdt = f$cvtime(f$file_attributes(pod_file,"RDT"))
+$ if file_rdt .GTS. pod_file_rdt then do_copy := true
+$ endif
+$ if do_copy then copy/log/noconfirm 'file' 'pod_file'
+$ endif
+$ endif
+$ goto extra_loop
+$extra_close:
+$ close EXTRA
+$ if p1 .eqs. "CLEAN" .and. f$search("extra.pods;-1") .nes. "" then -
+ purge/nolog extra.pods
+$!-- extra_pods.com
+$EOExtra_Pods$
$!
$! Warn of dangerous symbols or logical names
$!
@@ -2206,7 +5644,7 @@ $Bad_environment: SUBROUTINE
$ Bad_env = ""
$ IF p2 .eqs. "SYMBOL"
$ THEN
-$ IF f$type('p1) .nes. "" THEN Bad_env := SYMBOL
+$ IF f$type('p1') .nes. "" THEN Bad_env := SYMBOL
$ ELSE
$ IF f$trnlnm(p1) .nes. "" THEN Bad_env := LOGICAL
$ ENDIF
@@ -2226,7 +5664,7 @@ $ WRITE CONFIG " delete before building ''package' via:"
$ WRITE CONFIG " $ DELETE/SYMBOL/GLOBAL ''p1'"
$ IF f$locate("""",&p1) .ge. f$length(&p1)
$ THEN
-$ WRITE CONFIG " after building, testing, and installing ''package'
+$ WRITE CONFIG " after building, testing, and installing ''package'"
$ WRITE CONFIG " restore the symbol with:"
$ WRITE CONFIG " $ ''p1' == """ + &p1 + """"
$ ENDIF
@@ -2243,7 +5681,7 @@ $ ENDIF
$ EXIT
$ ENDSUBROUTINE ! Bad_environment
$ echo ""
-$ echo4 "%Config-I-VMS, Checking for dangerous pre-existing global symbols and logical names."
+$ echo4 "Checking for dangerous pre-existing global symbols and logical names."
$ CALL Bad_environment "TMP"
$ CALL Bad_environment "LIB"
$ CALL Bad_environment "T"
@@ -2258,28 +5696,28 @@ $ IF (.NOT.perl_symbol)
$ THEN
$ file_2_find = "[-]''packageup'.cld"
$ echo ""
-$ echo4 "%Config-I-VMS, The perl.cld file is now being written..."
+$ echo4 "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 ((sharedperl) .AND. (F$GETSYI("HW_MODEL") .GE. 1024)) 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","image ''vms_prefix':[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","image ''vms_prefix':[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","image ''vms_prefix':[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..."
+$ echo4 "The perl_setup.com file is now being written..."
$ file_2_find = "[-]perl_setup.com"
$ OPEN/WRITE CONFIG 'file_2_find'
$ WRITE CONFIG "$!"
@@ -2294,38 +5732,38 @@ $ 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 "$ define/translation=concealed ''vms_prefix' ''prefix'"
$ WRITE CONFIG "$ ext = "".exe"""
-$ IF sharedperl .EQS. "Y"
+$ IF sharedperl
$ THEN
-$ write config "$ if f$getsyi(""ARCH_NAME"") .nes. ""VAX"" then ext = "".AXE"""
+$ write config "$ if f$getsyi(""HW_MODEL"") .ge. 1024 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'"
+$ WRITE CONFIG "$ dbgperl :== $''vms_prefix':[000000]dbgPerl'ext'"
+$ WRITE CONFIG "$ perl :== $''vms_prefix':[000000]ndbgPerl'ext'"
+$ WRITE CONFIG "$ define dbgPerlShr ''vms_prefix':[000000]dbgPerlShr'ext'"
$ ELSE
-$ WRITE CONFIG "$ perl :== $Perl_Root:[000000]Perl'ext'"
-$ WRITE CONFIG "$ define PerlShr Perl_Root:[000000]PerlShr'ext'"
+$ WRITE CONFIG "$ perl :== $''vms_prefix':[000000]Perl'ext'"
+$ WRITE CONFIG "$ define PerlShr ''vms_prefix':[000000]PerlShr'ext'"
$ ENDIF
$ ELSE ! .NOT.perl_symbol
$ IF (use_vmsdebug_perl)
$ THEN
-$ WRITE CONFIG "$ define dbgPerlShr Perl_Root:[000000]dbgPerlShr'ext'"
+$ WRITE CONFIG "$ define dbgPerlShr ''vms_prefix':[000000]dbgPerlShr'ext'"
$ ELSE
-$ WRITE CONFIG "$ define PerlShr Perl_Root:[000000]PerlShr'ext'"
+$ WRITE CONFIG "$ define PerlShr ''vms_prefix':[000000]PerlShr'ext'"
$ ENDIF
$ IF perl_verb .EQS. "PROCESS"
$ THEN
-$ WRITE CONFIG "$ set command ''packagup'_ROOT:[000000]''packageup'.CLD"
+$ WRITE CONFIG "$ set command ''vms_prefix':[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"
+$ WRITE CONFIG "$ define/nolog pod2text ''vms_prefix':[lib.pod]pod2text.com"
+$ WRITE CONFIG "$ define/nolog pod2html ''vms_prefix':[lib.pod]pod2html.com"
+$ WRITE CONFIG "$ define/nolog pod2man ''vms_prefix':[lib.pod]pod2man.com"
$!
$ IF (tzneedset)
$ THEN
@@ -2338,59 +5776,59 @@ $ WRITE CONFIG "$! Symbols for commonly used scripts:"
$ WRITE CONFIG "$!"
$ IF (perl_symbol)
$ THEN
-$ WRITE CONFIG "$ Perldoc == ""'"+"'Perl' Perl_Root:[lib.pod]Perldoc.com -t"""
+$ WRITE CONFIG "$ Perldoc == ""'"+"'Perl' ''vms_prefix':[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 "$ pod2latex == ""'"+"'Perl' ''vms_prefix':[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"""
+$ WRITE CONFIG "$!Perlbug == ""'"+"'Perl' ''vms_prefix':[lib]Perlbug.com"""
+$ WRITE CONFIG "$ c2ph == ""'"+"'Perl' ''vms_prefix':[utils]c2ph.com"""
$ IF F$LOCATE("Devel::DProf",extensions) .LT. F$LENGTH(extensions)
$ THEN
-$ WRITE CONFIG "$ dprofpp == ""'"+"'Perl' Perl_Root:[utils]dprofpp.com"""
+$ WRITE CONFIG "$ dprofpp == ""'"+"'Perl' ''vms_prefix':[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"""
+$ WRITE CONFIG "$ h2ph == ""'"+"'Perl' ''vms_prefix':[utils]h2ph.com"""
+$ WRITE CONFIG "$ h2xs == ""'"+"'Perl' ''vms_prefix':[utils]h2xs.com"""
+$ WRITE CONFIG "$!perlcc == ""'"+"'Perl' ''vms_prefix':[utils]perlcc.com"""
+$ WRITE CONFIG "$ splain == ""'"+"'Perl' ''vms_prefix':[utils]splain.com"""
$ ELSE
-$ WRITE CONFIG "$ Perldoc == ""Perl Perl_Root:[lib.pod]Perldoc.com -t"""
+$ WRITE CONFIG "$ Perldoc == ""Perl ''vms_prefix':[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 "$ pod2latex == ""Perl ''vms_prefix':[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"""
+$ WRITE CONFIG "$!Perlbug == ""Perl ''vms_prefix':[lib]Perlbug.com"""
+$ WRITE CONFIG "$ c2ph == ""Perl ''vms_prefix':[utils]c2ph.com"""
$ IF F$LOCATE("Devel::DProf",extensions) .LT. F$LENGTH(extensions)
$ THEN
-$ WRITE CONFIG "$ dprofpp == ""Perl Perl_Root:[utils]dprofpp.com"""
+$ WRITE CONFIG "$ dprofpp == ""Perl ''vms_prefix':[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"""
+$ WRITE CONFIG "$ h2ph == ""Perl ''vms_prefix':[utils]h2ph.com"""
+$ WRITE CONFIG "$ h2xs == ""Perl ''vms_prefix':[utils]h2xs.com"""
+$ WRITE CONFIG "$!perlcc == ""Perl ''vms_prefix':[utils]perlcc.com"""
+$ WRITE CONFIG "$ splain == ""Perl ''vms_prefix':[utils]splain.com"""
$ ENDIF
$ CLOSE CONFIG
$!
$ echo ""
-$ echo "%Config-I-VMS, The file can be found at:"
-$ echo4 "-Config-I-VMS, ''F$SEARCH(file_2_find)'"
-$ 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 "The file can be found at:"
+$ echo4 " ''F$SEARCH(file_2_find)'"
+$ echo "Add that file (or an @ call to it) to your [SY]LOGIN.COM"
+$ echo "when you are satisfied with a successful compilation,"
+$ echo "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
+$ 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 "In order to install the ''packageup' verb into DCLTABLES run:"
+$ echo4 " @ ''F$SEARCH(file_2_find)'"
+$ echo4 "after a successful build, test, and install. Do so with CMKRNL privilege."
$ echo4 ""
$ ENDIF
$!
@@ -2441,8 +5879,8 @@ $ THEN
$ DEASSIGN SYS$OUTPUT
$! DEASSIGN SYS$ERROR
$ ENDIF
-$ IF F$GETJPI("","FILCNT").NE.vms_filcnt THEN CLOSE CONFIG
-$ IF F$GETJPI("","FILCNT").NE.vms_filcnt
+$ IF F$GETJPI("","FILCNT").GT.vms_filcnt THEN CLOSE CONFIG
+$ IF F$GETJPI("","FILCNT").GT.vms_filcnt
$ THEN WRITE SYS$ERROR "%Config-W-VMS, WARNING: There is a file still open"
$ ENDIF
$ dflt = F$ENVIRONMENT("DEFAULT")
@@ -2454,6 +5892,5 @@ $ SET PROTECTION=(SYSTEM:RWED,OWNER:RWED) UU.DIR
$ DELETE/NOLOG/NOCONFIRM UU.DIR;
$ ENDIF
$ SET DEFAULT 'vms_default_directory_name' !be kind rewind
-$ STOP
$ EXIT
$!: End of Configure
diff --git a/gnu/usr.bin/perl/cygwin/Makefile.SHs b/gnu/usr.bin/perl/cygwin/Makefile.SHs
index df15826f648..0a5a408f79d 100644
--- a/gnu/usr.bin/perl/cygwin/Makefile.SHs
+++ b/gnu/usr.bin/perl/cygwin/Makefile.SHs
@@ -125,7 +125,7 @@ $(LIBPERL)$(LIB_EXT): $& perl$(OBJ_EXT) $(cwobj) ld2
# The Module used here must not depend on Config or any extensions.
miniperl: $& miniperlmain$(OBJ_EXT) $(LIBPERL)s$(LIB_EXT) opmini$(OBJ_EXT)
- $(LDLIBPTH) $(CC) $(LARGE) $(CLDFLAGS) -o miniperl miniperlmain$(OBJ_EXT) opmini$(OBJ_EXT) $(LLIBPERL)s $(libs)
+ $(LDLIBPTH) $(CC) $(CLDFLAGS) -o miniperl miniperlmain$(OBJ_EXT) opmini$(OBJ_EXT) $(LLIBPERL)s $(libs)
$(LDLIBPTH) ./miniperl -w -Ilib -MExporter -e '<?>' || $(MAKE) minitest
!NO!SUBS!
@@ -147,7 +147,7 @@ $(LIBPERL)$(LIB_EXT): $& perl$(OBJ_EXT) $(cwobj)
# The Module used here must not depend on Config or any extensions.
miniperl: $& miniperlmain$(OBJ_EXT) $(LIBPERL)$(LIB_EXT) opmini$(OBJ_EXT)
- $(LDLIBPTH) $(CC) $(LARGE) $(CLDFLAGS) -o miniperl miniperlmain$(OBJ_EXT) opmini$(OBJ_EXT) $(LLIBPERL) $(libs)
+ $(LDLIBPTH) $(CC) $(CLDFLAGS) -o miniperl miniperlmain$(OBJ_EXT) opmini$(OBJ_EXT) $(LLIBPERL) $(libs)
$(LDLIBPTH) ./miniperl -w -Ilib -MExporter -e '<?>' || $(MAKE) minitest
!NO!SUBS!
@@ -157,22 +157,24 @@ esac
# libperl.a is _the_ library both in dll and static cases
# $(LIBPERL)$(LIB_EXT) expands to this name dependless of build model
#
+# NOTE: The "-Wl,-Bstatic $(LLIBPERL) -Wl,-Bdynamic" is required to give
+# the import library linking priority over the dynamic library, since both
+# the .dll and .a are in the same directory. When the new standard for
+# naming import/dynamic/static libraries emerges this should be updated.
+#
$spitshell >>Makefile <<'!NO!SUBS!'
-opmini$(OBJ_EXT) : op.c
- $(CCCMD) $(PLDLFLAGS) -DPERL_EXTERNAL_GLOB -o opmini$(OBJ_EXT) op.c
-
perl: $& perlmain$(OBJ_EXT) $(LIBPERL)$(LIB_EXT) $(DYNALOADER) $(static_ext) ext.libs
- $(SHRPENV) $(LDLIBPTH) $(CC) $(LARGE) $(CLDFLAGS) $(CCDLFLAGS) -o perl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
+ $(SHRPENV) $(LDLIBPTH) $(CC) $(CLDFLAGS) $(CCDLFLAGS) -o perl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) -Wl,-Bstatic $(LLIBPERL) -Wl,-Bdynamic `cat ext.libs` $(libs)
pureperl: $& perlmain$(OBJ_EXT) $(LIBPERL)$(LIB_EXT) $(DYNALOADER) $(static_ext) ext.libs
- $(SHRPENV) $(LDLIBPTH) purify $(CC) $(LARGE) $(CLDFLAGS) $(CCDLFLAGS) -o pureperl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
+ $(SHRPENV) $(LDLIBPTH) purify $(CC) $(CLDFLAGS) $(CCDLFLAGS) -o pureperl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
purecovperl: $& perlmain$(OBJ_EXT) $(LIBPERL)$(LIB_EXT) $(DYNALOADER) $(static_ext) ext.libs
- $(SHRPENV) $(LDLIBPTH) purecov $(CC) $(LARGE) $(CLDFLAGS) $(CCDLFLAGS) -o purecovperl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
+ $(SHRPENV) $(LDLIBPTH) purecov $(CC) $(CLDFLAGS) $(CCDLFLAGS) -o purecovperl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
quantperl: $& perlmain$(OBJ_EXT) $(LIBPERL)$(LIB_EXT) $(DYNALOADER) $(static_ext) ext.libs
- $(SHRPENV) $(LDLIBPTH) quantify $(CC) $(LARGE) $(CLDFLAGS) $(CCDLFLAGS) -o quantperl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
+ $(SHRPENV) $(LDLIBPTH) quantify $(CC) $(CLDFLAGS) $(CCDLFLAGS) -o quantperl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
!NO!SUBS!
diff --git a/gnu/usr.bin/perl/cygwin/cygwin.c b/gnu/usr.bin/perl/cygwin/cygwin.c
index bece81b1e4a..962a60a8d40 100644
--- a/gnu/usr.bin/perl/cygwin/cygwin.c
+++ b/gnu/usr.bin/perl/cygwin/cygwin.c
@@ -8,7 +8,132 @@
#include "XSUB.h"
#include <unistd.h>
+#include <process.h>
+/*
+ * pp_system() implemented via spawn()
+ * - more efficient and useful when embedding Perl in non-Cygwin apps
+ * - code mostly borrowed from djgpp.c
+ */
+static int
+do_spawnvp (const char *path, const char * const *argv)
+{
+ dTHXo;
+ Sigsave_t ihand,qhand;
+ int childpid, result, status;
+
+ rsignal_save(SIGINT, SIG_IGN, &ihand);
+ rsignal_save(SIGQUIT, SIG_IGN, &qhand);
+ childpid = spawnvp(_P_NOWAIT,path,argv);
+ if (childpid < 0) {
+ status = -1;
+ if(ckWARN(WARN_EXEC))
+ Perl_warner(aTHX_ WARN_EXEC,"Can't spawn \"%s\": %s",
+ path,Strerror (errno));
+ } else {
+ do {
+ result = wait4pid(childpid, &status, 0);
+ } while (result == -1 && errno == EINTR);
+ if(result < 0)
+ status = -1;
+ }
+ (void)rsignal_restore(SIGINT, &ihand);
+ (void)rsignal_restore(SIGQUIT, &qhand);
+ return status;
+}
+
+int
+do_aspawn (SV *really, void **mark, void **sp)
+{
+ dTHXo;
+ int rc;
+ char **a,*tmps,**argv;
+ STRLEN n_a;
+
+ if (sp<=mark)
+ return -1;
+ a=argv=(char**) alloca ((sp-mark+3)*sizeof (char*));
+
+ while (++mark <= sp)
+ if (*mark)
+ *a++ = SvPVx(*mark, n_a);
+ else
+ *a++ = "";
+ *a = Nullch;
+
+ if (argv[0][0] != '/' && argv[0][0] != '\\'
+ && !(argv[0][0] && argv[0][1] == ':'
+ && (argv[0][2] == '/' || argv[0][2] != '\\'))
+ ) /* will swawnvp use PATH? */
+ TAINT_ENV(); /* testing IFS here is overkill, probably */
+
+ if (really && *(tmps = SvPV(really, n_a)))
+ rc=do_spawnvp (tmps,(const char * const *)argv);
+ else
+ rc=do_spawnvp (argv[0],(const char *const *)argv);
+
+ return rc;
+}
+
+int
+do_spawn (char *cmd)
+{
+ dTHXo;
+ char **a,*s,*metachars = "$&*(){}[]'\";\\?>|<~`\n";
+ const char *command[4];
+
+ while (*cmd && isSPACE(*cmd))
+ cmd++;
+
+ if (strnEQ (cmd,"/bin/sh",7) && isSPACE (cmd[7]))
+ cmd+=5;
+
+ /* save an extra exec if possible */
+ /* see if there are shell metacharacters in it */
+ if (strstr (cmd,"..."))
+ goto doshell;
+ if (*cmd=='.' && isSPACE (cmd[1]))
+ goto doshell;
+ if (strnEQ (cmd,"exec",4) && isSPACE (cmd[4]))
+ goto doshell;
+ for (s=cmd; *s && isALPHA (*s); s++) ; /* catch VAR=val gizmo */
+ if (*s=='=')
+ goto doshell;
+
+ for (s=cmd; *s; s++)
+ if (strchr (metachars,*s))
+ {
+ if (*s=='\n' && s[1]=='\0')
+ {
+ *s='\0';
+ break;
+ }
+ doshell:
+ command[0] = "sh";
+ command[1] = "-c";
+ command[2] = cmd;
+ command[3] = NULL;
+
+ return do_spawnvp("sh",command);
+ }
+
+ New (1303,PL_Argv,(s-cmd)/2+2,char*);
+ PL_Cmd=savepvn (cmd,s-cmd);
+ a=PL_Argv;
+ for (s=PL_Cmd; *s;) {
+ while (*s && isSPACE (*s)) s++;
+ if (*s)
+ *(a++)=s;
+ while (*s && !isSPACE (*s)) s++;
+ if (*s)
+ *s++='\0';
+ }
+ *a=Nullch;
+ if (!PL_Argv[0])
+ return -1;
+
+ return do_spawnvp(PL_Argv[0],(const char * const *)PL_Argv);
+}
/* see also Cwd.pm */
static
@@ -19,7 +144,7 @@ XS(Cygwin_cwd)
if(items != 0)
Perl_croak(aTHX_ "Usage: Cwd::cwd()");
- if(cwd = getcwd(NULL, 0)) {
+ if((cwd = getcwd(NULL, -1))) {
ST(0) = sv_2mortal(newSVpv(cwd, 0));
safesysfree(cwd);
XSRETURN(1);
diff --git a/gnu/usr.bin/perl/djgpp/config.over b/gnu/usr.bin/perl/djgpp/config.over
index 5c252362c76..f9c167ec247 100644
--- a/gnu/usr.bin/perl/djgpp/config.over
+++ b/gnu/usr.bin/perl/djgpp/config.over
@@ -1,5 +1,5 @@
ln='cp'
-pager='less'
+pager='${DJDIR}/bin/less.exe'
# fix extension names under DOS
repair()
@@ -34,7 +34,8 @@ repair()
-e 's=file/=='\
-e 's=File/=='\
-e 's=glob=='\
- -e 's=Glob=='
+ -e 's=Glob=='\
+ -e 's/storable/Storable/'
}
static_ext=$(repair "$static_ext")
extensions=$(repair "$extensions")
diff --git a/gnu/usr.bin/perl/djgpp/djgpp.c b/gnu/usr.bin/perl/djgpp/djgpp.c
index c928851b766..4e390cfc59e 100644
--- a/gnu/usr.bin/perl/djgpp/djgpp.c
+++ b/gnu/usr.bin/perl/djgpp/djgpp.c
@@ -130,7 +130,6 @@ convretcode (pTHX_ int rc,char *prog,int fl)
int
do_aspawn (pTHX_ SV *really,SV **mark,SV **sp)
{
- dTHR;
int rc;
char **a,*tmps,**argv;
STRLEN n_a;
@@ -433,3 +432,22 @@ Perl_DJGPP_init (int *argcp,char ***argvp)
strcpy (perlprefix,"..");
}
+int
+djgpp_fflush (FILE *fp)
+{
+ int res;
+
+ if ((res = fflush(fp)) == 0 && fp) {
+ Stat_t s;
+ if (Fstat(fileno(fp), &s) == 0 && !S_ISSOCK(s.st_mode))
+ res = fsync(fileno(fp));
+ }
+/*
+ * If the flush succeeded but set end-of-file, we need to clear
+ * the error because our caller may check ferror(). BTW, this
+ * probably means we just flushed an empty file.
+ */
+ if (res == 0 && fp && ferror(fp) == EOF) clearerr(fp);
+
+ return res;
+}
diff --git a/gnu/usr.bin/perl/emacs/ptags b/gnu/usr.bin/perl/emacs/ptags
index 54770a0a14b..1054ac11de2 100644
--- a/gnu/usr.bin/perl/emacs/ptags
+++ b/gnu/usr.bin/perl/emacs/ptags
@@ -21,7 +21,7 @@ if test ! -z "$OS2_SHELL"; then alias find=gnufind; fi
# Move autogenerated less-informative files to the end:
# Hard to do embed.h and embedvar.h in one sweep:
-topfiles="`echo ' ' *.y *.c *.h ' ' | sed 's/ / /g' | sed 's/ embedvar\.h\|embed\.h\|obj\(pp\|XSUB\)\.h\|\(globals\|perlapi\)\.c / /g'`"
+topfiles="`echo ' ' *.y *.c *.h ' ' | sed 's/ / /g' | sed 's/ embedvar\.h\|embed\.h\|perlapi\.h\|obj\(pp\|XSUB\)\.h\|\(globals\|perlapi\)\.c / /g'`"
subdirs="`find ./* -maxdepth 0 -type d`"
subdirfiles="`find $subdirs -name '*.[cy]' -print | sort`"
subdirfiles1="`find $subdirs -name '*.[hH]' -print | sort`"
@@ -99,7 +99,7 @@ perl -w014pe 'if (s/^(S_ # 1: First group
}' TAGS.tmp > TAGS.tm1 && mv TAGS.tm1 TAGS.tmp
etags -o TAGS.tmp -a -D -l none -r '/#define.*\t\(Perl_.*\)/\1/' embed.h
-etags -o TAGS.tmp -a globals.c embedvar.h objXSUB.h perlapi.c
+etags -o TAGS.tmp -a globals.c embedvar.h objXSUB.h perlapi.c perlapi.h
# The above processes created a lot of descriptions with an
# an explicitly specified tag. Such descriptions have higher
diff --git a/gnu/usr.bin/perl/embedvar.h b/gnu/usr.bin/perl/embedvar.h
index e790976a18f..f4ebaa9839a 100644
--- a/gnu/usr.bin/perl/embedvar.h
+++ b/gnu/usr.bin/perl/embedvar.h
@@ -196,6 +196,7 @@
#define PL_argvoutgv (PERL_GET_INTERP->Iargvoutgv)
#define PL_basetime (PERL_GET_INTERP->Ibasetime)
#define PL_beginav (PERL_GET_INTERP->Ibeginav)
+#define PL_beginav_save (PERL_GET_INTERP->Ibeginav_save)
#define PL_bitcount (PERL_GET_INTERP->Ibitcount)
#define PL_bufend (PERL_GET_INTERP->Ibufend)
#define PL_bufptr (PERL_GET_INTERP->Ibufptr)
@@ -228,6 +229,7 @@
#define PL_doextract (PERL_GET_INTERP->Idoextract)
#define PL_doswitches (PERL_GET_INTERP->Idoswitches)
#define PL_dowarn (PERL_GET_INTERP->Idowarn)
+#define PL_dummy1_bincompat (PERL_GET_INTERP->Idummy1_bincompat)
#define PL_e_script (PERL_GET_INTERP->Ie_script)
#define PL_egid (PERL_GET_INTERP->Iegid)
#define PL_endav (PERL_GET_INTERP->Iendav)
@@ -246,6 +248,7 @@
#define PL_exitlistlen (PERL_GET_INTERP->Iexitlistlen)
#define PL_expect (PERL_GET_INTERP->Iexpect)
#define PL_fdpid (PERL_GET_INTERP->Ifdpid)
+#define PL_fdpid_mutex (PERL_GET_INTERP->Ifdpid_mutex)
#define PL_filemode (PERL_GET_INTERP->Ifilemode)
#define PL_forkprocess (PERL_GET_INTERP->Iforkprocess)
#define PL_formfeed (PERL_GET_INTERP->Iformfeed)
@@ -254,6 +257,7 @@
#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_arenaroot (PERL_GET_INTERP->Ihe_arenaroot)
#define PL_he_root (PERL_GET_INTERP->Ihe_root)
#define PL_hintgv (PERL_GET_INTERP->Ihintgv)
#define PL_hints (PERL_GET_INTERP->Ihints)
@@ -322,9 +326,10 @@
#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_nullstash (PERL_GET_INTERP->Inullstash)
#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_radix_sv (PERL_GET_INTERP->Inumeric_radix_sv)
#define PL_numeric_standard (PERL_GET_INTERP->Inumeric_standard)
#define PL_ofmt (PERL_GET_INTERP->Iofmt)
#define PL_oldbufptr (PERL_GET_INTERP->Ioldbufptr)
@@ -376,6 +381,7 @@
#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_lock_mutex (PERL_GET_INTERP->Isv_lock_mutex)
#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)
@@ -414,16 +420,27 @@
#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_arenaroot (PERL_GET_INTERP->Ixnv_arenaroot)
#define PL_xnv_root (PERL_GET_INTERP->Ixnv_root)
+#define PL_xpv_arenaroot (PERL_GET_INTERP->Ixpv_arenaroot)
#define PL_xpv_root (PERL_GET_INTERP->Ixpv_root)
+#define PL_xpvav_arenaroot (PERL_GET_INTERP->Ixpvav_arenaroot)
#define PL_xpvav_root (PERL_GET_INTERP->Ixpvav_root)
+#define PL_xpvbm_arenaroot (PERL_GET_INTERP->Ixpvbm_arenaroot)
#define PL_xpvbm_root (PERL_GET_INTERP->Ixpvbm_root)
+#define PL_xpvcv_arenaroot (PERL_GET_INTERP->Ixpvcv_arenaroot)
#define PL_xpvcv_root (PERL_GET_INTERP->Ixpvcv_root)
+#define PL_xpvhv_arenaroot (PERL_GET_INTERP->Ixpvhv_arenaroot)
#define PL_xpvhv_root (PERL_GET_INTERP->Ixpvhv_root)
+#define PL_xpviv_arenaroot (PERL_GET_INTERP->Ixpviv_arenaroot)
#define PL_xpviv_root (PERL_GET_INTERP->Ixpviv_root)
+#define PL_xpvlv_arenaroot (PERL_GET_INTERP->Ixpvlv_arenaroot)
#define PL_xpvlv_root (PERL_GET_INTERP->Ixpvlv_root)
+#define PL_xpvmg_arenaroot (PERL_GET_INTERP->Ixpvmg_arenaroot)
#define PL_xpvmg_root (PERL_GET_INTERP->Ixpvmg_root)
+#define PL_xpvnv_arenaroot (PERL_GET_INTERP->Ixpvnv_arenaroot)
#define PL_xpvnv_root (PERL_GET_INTERP->Ixpvnv_root)
+#define PL_xrv_arenaroot (PERL_GET_INTERP->Ixrv_arenaroot)
#define PL_xrv_root (PERL_GET_INTERP->Ixrv_root)
#define PL_yychar (PERL_GET_INTERP->Iyychar)
#define PL_yydebug (PERL_GET_INTERP->Iyydebug)
@@ -460,6 +477,7 @@
#define PL_argvoutgv (vTHX->Iargvoutgv)
#define PL_basetime (vTHX->Ibasetime)
#define PL_beginav (vTHX->Ibeginav)
+#define PL_beginav_save (vTHX->Ibeginav_save)
#define PL_bitcount (vTHX->Ibitcount)
#define PL_bufend (vTHX->Ibufend)
#define PL_bufptr (vTHX->Ibufptr)
@@ -492,6 +510,7 @@
#define PL_doextract (vTHX->Idoextract)
#define PL_doswitches (vTHX->Idoswitches)
#define PL_dowarn (vTHX->Idowarn)
+#define PL_dummy1_bincompat (vTHX->Idummy1_bincompat)
#define PL_e_script (vTHX->Ie_script)
#define PL_egid (vTHX->Iegid)
#define PL_endav (vTHX->Iendav)
@@ -510,6 +529,7 @@
#define PL_exitlistlen (vTHX->Iexitlistlen)
#define PL_expect (vTHX->Iexpect)
#define PL_fdpid (vTHX->Ifdpid)
+#define PL_fdpid_mutex (vTHX->Ifdpid_mutex)
#define PL_filemode (vTHX->Ifilemode)
#define PL_forkprocess (vTHX->Iforkprocess)
#define PL_formfeed (vTHX->Iformfeed)
@@ -518,6 +538,7 @@
#define PL_gid (vTHX->Igid)
#define PL_glob_index (vTHX->Iglob_index)
#define PL_globalstash (vTHX->Iglobalstash)
+#define PL_he_arenaroot (vTHX->Ihe_arenaroot)
#define PL_he_root (vTHX->Ihe_root)
#define PL_hintgv (vTHX->Ihintgv)
#define PL_hints (vTHX->Ihints)
@@ -586,9 +607,10 @@
#define PL_nomemok (vTHX->Inomemok)
#define PL_nthreads (vTHX->Inthreads)
#define PL_nthreads_cond (vTHX->Inthreads_cond)
+#define PL_nullstash (vTHX->Inullstash)
#define PL_numeric_local (vTHX->Inumeric_local)
#define PL_numeric_name (vTHX->Inumeric_name)
-#define PL_numeric_radix (vTHX->Inumeric_radix)
+#define PL_numeric_radix_sv (vTHX->Inumeric_radix_sv)
#define PL_numeric_standard (vTHX->Inumeric_standard)
#define PL_ofmt (vTHX->Iofmt)
#define PL_oldbufptr (vTHX->Ioldbufptr)
@@ -640,6 +662,7 @@
#define PL_subname (vTHX->Isubname)
#define PL_sv_arenaroot (vTHX->Isv_arenaroot)
#define PL_sv_count (vTHX->Isv_count)
+#define PL_sv_lock_mutex (vTHX->Isv_lock_mutex)
#define PL_sv_mutex (vTHX->Isv_mutex)
#define PL_sv_no (vTHX->Isv_no)
#define PL_sv_objcount (vTHX->Isv_objcount)
@@ -678,16 +701,27 @@
#define PL_widesyscalls (vTHX->Iwidesyscalls)
#define PL_xiv_arenaroot (vTHX->Ixiv_arenaroot)
#define PL_xiv_root (vTHX->Ixiv_root)
+#define PL_xnv_arenaroot (vTHX->Ixnv_arenaroot)
#define PL_xnv_root (vTHX->Ixnv_root)
+#define PL_xpv_arenaroot (vTHX->Ixpv_arenaroot)
#define PL_xpv_root (vTHX->Ixpv_root)
+#define PL_xpvav_arenaroot (vTHX->Ixpvav_arenaroot)
#define PL_xpvav_root (vTHX->Ixpvav_root)
+#define PL_xpvbm_arenaroot (vTHX->Ixpvbm_arenaroot)
#define PL_xpvbm_root (vTHX->Ixpvbm_root)
+#define PL_xpvcv_arenaroot (vTHX->Ixpvcv_arenaroot)
#define PL_xpvcv_root (vTHX->Ixpvcv_root)
+#define PL_xpvhv_arenaroot (vTHX->Ixpvhv_arenaroot)
#define PL_xpvhv_root (vTHX->Ixpvhv_root)
+#define PL_xpviv_arenaroot (vTHX->Ixpviv_arenaroot)
#define PL_xpviv_root (vTHX->Ixpviv_root)
+#define PL_xpvlv_arenaroot (vTHX->Ixpvlv_arenaroot)
#define PL_xpvlv_root (vTHX->Ixpvlv_root)
+#define PL_xpvmg_arenaroot (vTHX->Ixpvmg_arenaroot)
#define PL_xpvmg_root (vTHX->Ixpvmg_root)
+#define PL_xpvnv_arenaroot (vTHX->Ixpvnv_arenaroot)
#define PL_xpvnv_root (vTHX->Ixpvnv_root)
+#define PL_xrv_arenaroot (vTHX->Ixrv_arenaroot)
#define PL_xrv_root (vTHX->Ixrv_root)
#define PL_yychar (vTHX->Iyychar)
#define PL_yydebug (vTHX->Iyydebug)
@@ -861,6 +895,7 @@
#define PL_argvoutgv (aTHXo->interp.Iargvoutgv)
#define PL_basetime (aTHXo->interp.Ibasetime)
#define PL_beginav (aTHXo->interp.Ibeginav)
+#define PL_beginav_save (aTHXo->interp.Ibeginav_save)
#define PL_bitcount (aTHXo->interp.Ibitcount)
#define PL_bufend (aTHXo->interp.Ibufend)
#define PL_bufptr (aTHXo->interp.Ibufptr)
@@ -893,6 +928,7 @@
#define PL_doextract (aTHXo->interp.Idoextract)
#define PL_doswitches (aTHXo->interp.Idoswitches)
#define PL_dowarn (aTHXo->interp.Idowarn)
+#define PL_dummy1_bincompat (aTHXo->interp.Idummy1_bincompat)
#define PL_e_script (aTHXo->interp.Ie_script)
#define PL_egid (aTHXo->interp.Iegid)
#define PL_endav (aTHXo->interp.Iendav)
@@ -911,6 +947,7 @@
#define PL_exitlistlen (aTHXo->interp.Iexitlistlen)
#define PL_expect (aTHXo->interp.Iexpect)
#define PL_fdpid (aTHXo->interp.Ifdpid)
+#define PL_fdpid_mutex (aTHXo->interp.Ifdpid_mutex)
#define PL_filemode (aTHXo->interp.Ifilemode)
#define PL_forkprocess (aTHXo->interp.Iforkprocess)
#define PL_formfeed (aTHXo->interp.Iformfeed)
@@ -919,6 +956,7 @@
#define PL_gid (aTHXo->interp.Igid)
#define PL_glob_index (aTHXo->interp.Iglob_index)
#define PL_globalstash (aTHXo->interp.Iglobalstash)
+#define PL_he_arenaroot (aTHXo->interp.Ihe_arenaroot)
#define PL_he_root (aTHXo->interp.Ihe_root)
#define PL_hintgv (aTHXo->interp.Ihintgv)
#define PL_hints (aTHXo->interp.Ihints)
@@ -987,9 +1025,10 @@
#define PL_nomemok (aTHXo->interp.Inomemok)
#define PL_nthreads (aTHXo->interp.Inthreads)
#define PL_nthreads_cond (aTHXo->interp.Inthreads_cond)
+#define PL_nullstash (aTHXo->interp.Inullstash)
#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_radix_sv (aTHXo->interp.Inumeric_radix_sv)
#define PL_numeric_standard (aTHXo->interp.Inumeric_standard)
#define PL_ofmt (aTHXo->interp.Iofmt)
#define PL_oldbufptr (aTHXo->interp.Ioldbufptr)
@@ -1041,6 +1080,7 @@
#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_lock_mutex (aTHXo->interp.Isv_lock_mutex)
#define PL_sv_mutex (aTHXo->interp.Isv_mutex)
#define PL_sv_no (aTHXo->interp.Isv_no)
#define PL_sv_objcount (aTHXo->interp.Isv_objcount)
@@ -1079,16 +1119,27 @@
#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_arenaroot (aTHXo->interp.Ixnv_arenaroot)
#define PL_xnv_root (aTHXo->interp.Ixnv_root)
+#define PL_xpv_arenaroot (aTHXo->interp.Ixpv_arenaroot)
#define PL_xpv_root (aTHXo->interp.Ixpv_root)
+#define PL_xpvav_arenaroot (aTHXo->interp.Ixpvav_arenaroot)
#define PL_xpvav_root (aTHXo->interp.Ixpvav_root)
+#define PL_xpvbm_arenaroot (aTHXo->interp.Ixpvbm_arenaroot)
#define PL_xpvbm_root (aTHXo->interp.Ixpvbm_root)
+#define PL_xpvcv_arenaroot (aTHXo->interp.Ixpvcv_arenaroot)
#define PL_xpvcv_root (aTHXo->interp.Ixpvcv_root)
+#define PL_xpvhv_arenaroot (aTHXo->interp.Ixpvhv_arenaroot)
#define PL_xpvhv_root (aTHXo->interp.Ixpvhv_root)
+#define PL_xpviv_arenaroot (aTHXo->interp.Ixpviv_arenaroot)
#define PL_xpviv_root (aTHXo->interp.Ixpviv_root)
+#define PL_xpvlv_arenaroot (aTHXo->interp.Ixpvlv_arenaroot)
#define PL_xpvlv_root (aTHXo->interp.Ixpvlv_root)
+#define PL_xpvmg_arenaroot (aTHXo->interp.Ixpvmg_arenaroot)
#define PL_xpvmg_root (aTHXo->interp.Ixpvmg_root)
+#define PL_xpvnv_arenaroot (aTHXo->interp.Ixpvnv_arenaroot)
#define PL_xpvnv_root (aTHXo->interp.Ixpvnv_root)
+#define PL_xrv_arenaroot (aTHXo->interp.Ixrv_arenaroot)
#define PL_xrv_root (aTHXo->interp.Ixrv_root)
#define PL_yychar (aTHXo->interp.Iyychar)
#define PL_yydebug (aTHXo->interp.Iyydebug)
@@ -1126,6 +1177,7 @@
#define PL_Iargvoutgv PL_argvoutgv
#define PL_Ibasetime PL_basetime
#define PL_Ibeginav PL_beginav
+#define PL_Ibeginav_save PL_beginav_save
#define PL_Ibitcount PL_bitcount
#define PL_Ibufend PL_bufend
#define PL_Ibufptr PL_bufptr
@@ -1158,6 +1210,7 @@
#define PL_Idoextract PL_doextract
#define PL_Idoswitches PL_doswitches
#define PL_Idowarn PL_dowarn
+#define PL_Idummy1_bincompat PL_dummy1_bincompat
#define PL_Ie_script PL_e_script
#define PL_Iegid PL_egid
#define PL_Iendav PL_endav
@@ -1176,6 +1229,7 @@
#define PL_Iexitlistlen PL_exitlistlen
#define PL_Iexpect PL_expect
#define PL_Ifdpid PL_fdpid
+#define PL_Ifdpid_mutex PL_fdpid_mutex
#define PL_Ifilemode PL_filemode
#define PL_Iforkprocess PL_forkprocess
#define PL_Iformfeed PL_formfeed
@@ -1184,6 +1238,7 @@
#define PL_Igid PL_gid
#define PL_Iglob_index PL_glob_index
#define PL_Iglobalstash PL_globalstash
+#define PL_Ihe_arenaroot PL_he_arenaroot
#define PL_Ihe_root PL_he_root
#define PL_Ihintgv PL_hintgv
#define PL_Ihints PL_hints
@@ -1252,9 +1307,10 @@
#define PL_Inomemok PL_nomemok
#define PL_Inthreads PL_nthreads
#define PL_Inthreads_cond PL_nthreads_cond
+#define PL_Inullstash PL_nullstash
#define PL_Inumeric_local PL_numeric_local
#define PL_Inumeric_name PL_numeric_name
-#define PL_Inumeric_radix PL_numeric_radix
+#define PL_Inumeric_radix_sv PL_numeric_radix_sv
#define PL_Inumeric_standard PL_numeric_standard
#define PL_Iofmt PL_ofmt
#define PL_Ioldbufptr PL_oldbufptr
@@ -1306,6 +1362,7 @@
#define PL_Isubname PL_subname
#define PL_Isv_arenaroot PL_sv_arenaroot
#define PL_Isv_count PL_sv_count
+#define PL_Isv_lock_mutex PL_sv_lock_mutex
#define PL_Isv_mutex PL_sv_mutex
#define PL_Isv_no PL_sv_no
#define PL_Isv_objcount PL_sv_objcount
@@ -1344,16 +1401,27 @@
#define PL_Iwidesyscalls PL_widesyscalls
#define PL_Ixiv_arenaroot PL_xiv_arenaroot
#define PL_Ixiv_root PL_xiv_root
+#define PL_Ixnv_arenaroot PL_xnv_arenaroot
#define PL_Ixnv_root PL_xnv_root
+#define PL_Ixpv_arenaroot PL_xpv_arenaroot
#define PL_Ixpv_root PL_xpv_root
+#define PL_Ixpvav_arenaroot PL_xpvav_arenaroot
#define PL_Ixpvav_root PL_xpvav_root
+#define PL_Ixpvbm_arenaroot PL_xpvbm_arenaroot
#define PL_Ixpvbm_root PL_xpvbm_root
+#define PL_Ixpvcv_arenaroot PL_xpvcv_arenaroot
#define PL_Ixpvcv_root PL_xpvcv_root
+#define PL_Ixpvhv_arenaroot PL_xpvhv_arenaroot
#define PL_Ixpvhv_root PL_xpvhv_root
+#define PL_Ixpviv_arenaroot PL_xpviv_arenaroot
#define PL_Ixpviv_root PL_xpviv_root
+#define PL_Ixpvlv_arenaroot PL_xpvlv_arenaroot
#define PL_Ixpvlv_root PL_xpvlv_root
+#define PL_Ixpvmg_arenaroot PL_xpvmg_arenaroot
#define PL_Ixpvmg_root PL_xpvmg_root
+#define PL_Ixpvnv_arenaroot PL_xpvnv_arenaroot
#define PL_Ixpvnv_root PL_xpvnv_root
+#define PL_Ixrv_arenaroot PL_xrv_arenaroot
#define PL_Ixrv_root PL_xrv_root
#define PL_Iyychar PL_yychar
#define PL_Iyydebug PL_yydebug
@@ -1683,6 +1751,7 @@
#define no_modify PL_no_modify
#define perl_destruct_level PL_perl_destruct_level
#define perldb PL_perldb
+#define ppaddr PL_ppaddr
#define rsfp PL_rsfp
#define rsfp_filters PL_rsfp_filters
#define stack_base PL_stack_base
diff --git a/gnu/usr.bin/perl/epoc/config.sh b/gnu/usr.bin/perl/epoc/config.sh
index a60b7a0f085..1168ffc6f5b 100644
--- a/gnu/usr.bin/perl/epoc/config.sh
+++ b/gnu/usr.bin/perl/epoc/config.sh
@@ -17,7 +17,6 @@ Header=''
Id='$Id'
Locker=''
Log='$Log'
-Mcc=''
RCSfile='$RCSfile'
Revision='$Revision'
Source=''
@@ -33,8 +32,8 @@ apirevision=''
apisubversion=''
apiversion=''
ar='arm-pe-ar'
-archlib='/perl/lib/5.6.0/epoc'
-archlibexp='/perl/lib/5.6.0/epoc'
+archlib='?:/perl/lib/5.6.1/epoc'
+archlibexp='?:/perl/lib/5.6.1/epoc'
archname64=''
archname='epoc'
archobjs='epoc.o epocish.o epoc_stubs.o'
@@ -79,11 +78,12 @@ cppsymbols=''
crosscompile='define'
cryptlib=''
csh='csh'
-d_Gconvert='sprintf((b),"%.*g",(n),(x))'
-d_PRIEldbl='undef'
-d_PRIFldbl='undef'
-d_PRIGldbl='undef'
-d_PRIX64='undef'
+d__fwalk='undef'
+d_Gconvert='epoc_gcvt((x),(n),(b))'
+d_PRIEUldbl='undef'
+d_PRIFUldbl='undef'
+d_PRIGUldbl='undef'
+d_PRIXU64='undef'
d_PRId64='undef'
d_PRIeldbl='undef'
d_PRIfldbl='define'
@@ -134,12 +134,12 @@ d_endnent='undef'
d_endpent='undef'
d_endpwent='undef'
d_endsent='undef'
-d_endspent='undef'
d_eofnblk='define'
d_eunice='undef'
d_fchmod='undef'
d_fchown='undef'
d_fcntl='undef'
+d_fcntl_can_lock='undef'
d_fd_macros='undef'
d_fd_set='define'
d_fds_bits='undef'
@@ -149,12 +149,15 @@ d_flock='undef'
d_fork='undef'
d_fpathconf='undef'
d_fpos64_t='undef'
+d_frexpl='undef'
d_fseeko='undef'
d_fsetpos='define'
d_fstatfs='define'
d_fstatvfs='undef'
+d_fsync='undef'
d_ftello='undef'
d_ftime='undef'
+d_getespwnam='undef'
d_getfsstat='undef'
d_getgrent='undef'
d_getgrps='undef'
@@ -169,6 +172,7 @@ d_getnbyaddr='undef'
d_getnbyname='undef'
d_getnent='undef'
d_getnetprotos='define'
+d_getpagsz='undef'
d_getpbyname='define'
d_getpbynumber='define'
d_getpent='undef'
@@ -178,12 +182,12 @@ d_getpgrp='undef'
d_getppid='undef'
d_getprior='undef'
d_getprotoprotos='define'
+d_getprpwnam='undef'
d_getpwent='undef'
d_getsbyname='undef'
d_getsbyport='undef'
d_getsent='undef'
d_getservprotos='define'
-d_getspent='undef'
d_getspnam='undef'
d_gettimeod='define'
d_gnulibc='undef'
@@ -193,9 +197,11 @@ d_htonl='define'
d_iconv='undef'
d_index='undef'
d_inetaton='define'
-d_int64t='undef'
+d_int64_t='undef'
d_iovec_s='undef'
d_isascii='define'
+d_isnan='define'
+d_isnanl='undef'
d_killpg='undef'
d_lchown='undef'
d_ldbl_dig='undef'
@@ -220,6 +226,7 @@ d_mkdir='define'
d_mkfifo='undef'
d_mktime='define'
d_mmap='undef'
+d_modfl='undef'
d_mprotect='undef'
d_msg='undef'
d_msg_ctrunc='undef'
@@ -243,6 +250,7 @@ d_oldsock='undef'
d_open3='define'
d_pathconf='undef'
d_pause='undef'
+d_perl_otherlibdirs='undef'
d_phostname='undef'
d_pipe='undef'
d_poll='undef'
@@ -267,6 +275,7 @@ d_rmdir='define'
d_safebcpy='undef'
d_safemcpy='undef'
d_sanemcmp='define'
+d_sbrkproto='undef'
d_sched_yield='undef'
d_scm_rights='undef'
d_seekdir='define'
@@ -290,6 +299,7 @@ d_setpent='undef'
d_setpgid='undef'
d_setpgrp2='undef'
d_setpgrp='undef'
+d_setproctitle='undef'
d_setprior='undef'
d_setpwent='undef'
d_setregid='undef'
@@ -300,7 +310,6 @@ d_setrgid='undef'
d_setruid='undef'
d_setsent='undef'
d_setsid='undef'
-d_setspent='undef'
d_setvbuf='undef'
d_sfio='undef'
d_shm='undef'
@@ -313,12 +322,15 @@ d_sigaction='undef'
d_sigsetjmp='undef'
d_socket='define'
d_sockpair='undef'
+d_socks5_init='undef'
d_statblks='define'
d_statfs='undef'
d_statfsflags='define'
d_statvfs='undef'
d_stdio_cnt_lval='define'
d_stdio_ptr_lval='define'
+d_stdio_ptr_lval_sets_cnt='undef'
+d_stdio_ptr_lval_nochange_cnt='undef'
d_stdio_stream_array='undef'
d_stdiobase='undef'
d_stdstdio='undef'
@@ -381,7 +393,7 @@ emacs=''
eunicefix=':'
exe_ext=''
expr='expr'
-extensions='Data/Dumper File/Glob IO Socket'
+extensions='Data/Dumper File/Glob IO Socket Fcntl Sys/Hostname Errno'
fflushNULL='undef'
fflushall='define'
find=''
@@ -403,7 +415,6 @@ h_fcntl=''
h_sysfile=''
hint=''
hostcat=''
-huge=''
i_arpainet='define'
i_bsdioctl='undef'
i_db='undef'
@@ -418,6 +429,7 @@ i_grp='undef'
i_iconv='undef'
i_ieeefp='undef'
i_inttypes='undef'
+i_libutil='undef'
i_limits='define'
i_locale='undef'
i_machcthr='undef'
@@ -431,6 +443,7 @@ i_neterrno='undef'
i_netinettcp='define'
i_niin='define'
i_poll='undef'
+i_prot='undef'
i_pthread='undef'
i_pwd='undef'
i_rpcsvcdbm='undef'
@@ -478,23 +491,22 @@ i_vfork='undef'
ignore_versioned_solibs=''
incpath=''
inews=''
-installarchlib='/home/olaf/E/lib'
-installbin='/home/olaf/E/bin'
-installman1dir=''
-installman3dir=''
-installprefix='/home/olaf/'
+installarchlib='/home/of/PERL/perl/lib/5.6.0/epoc'
+installbin='/home/of/PERL/System/Programs/'
+installman1dir='/home/of/PERL/man1'
+installman3dir='/home/of/PERL/man3'
+installprefix=''
installprefixexp=''
-installprivlib=''
-installscript=''
-installsitearch='/home/olaf/E/site/'
-installsitelib='/home/olaf/E/site/lib'
+installprivlib='/home/of/PERL/perl/lib/5.6.0/'
+installscript='/home/of/PERL/bin/'
+installsitearch='/home/of/PERL/site/lib/site_perl/5.6.0/epoc'
+installsitelib='/home/of/PERL/perl/lib/site_perl/5.6.0'
installstyle=''
installusrbinperl='undef'
installvendorlib=''
intsize='4'
-known_extensions='Data/Dumper File/Glob IO Socket'
+known_extensions='Data/Dumper File/Glob IO Socket Fcntl Sys/Hostname Errno'
ksh=''
-large=''
ld='echo'
lddlflags=''
ldflags=''
@@ -528,18 +540,30 @@ make_set_make='#'
mallocobj=''
mallocsrc=''
malloctype='void *'
+man1='man1'
man1dir=''
man1direxp=''
man1ext=''
+man2='man2'
+man2ext='2'
+man3='man3'
man3dir=''
man3direxp=''
man3ext=''
-medium=''
+man4='man4'
+man4ext='4'
+man5='man5'
+man5ext='5'
+man6='man6'
+man6ext='6'
+man7='man7'
+man7ext='7'
+man8='man8'
+man8ext='8'
mips=''
mips_type=''
mkdir='mkdir'
mmaptype=''
-models='none'
modetype='mode_t'
more='more'
multiarch='define'
@@ -556,7 +580,7 @@ netdb_net_type='int'
nm='arm-pe-nm'
nm_opt=''
nm_so_opt=''
-nonxs_ext=''
+nonxs_ext='Errno'
nroff='nroff'
o_nonblock='O_NONBLOCK'
obj_ext=''
@@ -565,11 +589,12 @@ optimize='-fomit-frame-pointer -DNDEBUG -O'
orderlib=''
osname='epoc'
osvers=''
+otherlibdirs=''
package=''
pager=''
passcat=''
patchlevel=''
-path_sep=''
+path_sep=':'
perl=''
perladmin=''
perlpath=''
@@ -581,8 +606,8 @@ pmake=''
pr=''
prefix=''
prefixexp=''
-privlib='/perl/lib/5.6.0'
-privlibexp='/perl/lib/5.6.0'
+privlib='?:/perl/lib/5.6.1'
+privlibexp='?:/perl/lib/5.6.1'
prototype='define'
ptrsize='4'
randbits='31'
@@ -593,10 +618,10 @@ rd_nodata='-1'
rm='rm'
rmail=''
runnm='false'
-sPRIEldbl=''
-sPRIFldbl=''
-sPRIGldbl=''
-sPRIX64=''
+sPRIEUldbl=''
+sPRIFUldbl=''
+sPRIGUldbl=''
+sPRIXU64=''
sPRId64=''
sPRIeldbl=''
sPRIfldbl='"f"'
@@ -626,31 +651,29 @@ sig_name_init='"ZERO", 0'
sig_num='0'
sig_num_init='0, 0'
signal_t='void'
-sitearch='/perl/lib/site_perl/5.6.0/epoc'
-sitearchexp='/perl/lib/site_perl/5.6.0/epoc'
-sitelib='/perl/lib/site_perl/5.6.0/'
-sitelib_stem='/perl/lib/site_perl'
-sitelibexp='/perl/lib/site_perl/5.6.0/'
+sitearch='?:/perl/lib/site_perl/5.6.1/epoc'
+sitearchexp='?:/perl/lib/site_perl/5.6.1/epoc'
+sitelib='?:/perl/lib/site_perl/5.6.1/'
+sitelib_stem='?:/perl/lib/site_perl'
+sitelibexp='?:/perl/lib/site_perl/5.6.1/'
siteprefix=''
siteprefixexp=''
sizesize='4'
sizetype='size_t'
sleep=''
smail=''
-small=''
so=''
-socksizetype='int'
+socksizetype='size_t'
sockethdr=''
socketlib=''
sort='sort'
spackage=''
spitshell='cat'
-split=''
src='.'
ssizetype='long'
startperl=''
startsh='#!/bin/sh'
-static_ext='Data/Dumper File/Glob IO Socket'
+static_ext='Data/Dumper File/Glob IO Socket Fcntl Sys/Hostname'
stdchar='char'
stdio_base=''
stdio_bufsiz=''
@@ -702,7 +725,138 @@ vendorlib_stem=''
vendorlibexp=''
vendorprefix=''
vendorprefixexp=''
-version='5.6.0'
+version='5.6.1'
+versiononly='undef'
+vi=''
+voidflags='15'
+xlibpth=''
+zcat=''
+zip=''
+# Configure command line arguments.
+config_arg0=''
+config_args=''
+config_argc=11
+config_arg1=''
+config_arg2=''
+config_arg3=''
+config_arg4=''
+config_arg5=''
+config_arg6=''
+config_arg7=''
+config_arg8=''
+config_arg9=''
+config_arg10=''
+config_arg11=''
+PERL_REVISION=5
+PERL_VERSION=6
+PERL_SUBVERSION=1
+PERL_API_REVISION=5
+PERL_API_VERSION=6
+PERL_API_SUBVERSION=0
+CONFIGDOTSH=true
+# Variables propagated from previous config.sh file.
+pp_sys_cflags=''
+epocish_cflags='ccflags="$cflags -xc++"'
+ivtype='int'
+uvtype='unsigned int'
+i8type='char'
+u8type='unsigned char'
+i16type='short'
+u16type='unsigned short'
+i32type='int'
+u32type='unsigned int'
+i64type='long long'
+u64type='unsigned long long'
+d_quad='define'
+quadtype='long long'
+quadtype='unsigned long long'
+quadkind='QUAD_IS_LONG_LONG'
+nvtype='double'
+ivsize='4'
+uvsize='4'
+i8size='1'
+u8size='1'
+i16size='2'
+u16size='2'
+i32size='4'
+u32size='4'
+i64size='8'
+u64size='8'
+d_fs_data_s='undef'
+d_fseeko='undef'
+d_ldbl_dig='undef'
+d_sqrtl='undef'
+d_getmnt='undef'
+d_statfs_f_flags='undef'
+d_statfs_s='undef'
+d_ustat='undef'
+i_sysstatfs='undef'
+i_sysvfs='undef'
+i_ustat='undef'
+uidsize='2'
+uidsign='1'
+gidsize='2'
+gidsign='1'
+ivdformat='"ld"'
+uvuformat='"lu"'
+uvoformat='"lo"'
+uvxformat='"lx"'
+uidformat='"hu"'
+gidformat='"hu"'
+d_strtold='undef'
+d_strtoll='undef'
+d_strtouq='undef'
+d_nv_preserves_uv='define'
+d_nv_preserves_uv_bits='32'
+use5005threads='undef'
+useithreads='undef'
+inc_version_list=' '
+inc_version_list_init='0'
+d_madvise='undef'
+d_mkdtemp='undef'
+d_mkstemp='undef'
+d_mkstemps='undef'
+d_mmap='undef'
+d_mprotect='undef'
+d_msync='undef'
+d_munmap='undef'
+d_qgcvt='undef'
+d_socklen_t='undef'
+d_vendorarch=''
+i_iconv='undef'
+i_ieeefp='undef'
+i_sunmath='undef'
+i_syslog='undef'
+i_sysmman='undef'
+i_sysutsname='undef'
+installvendorarch=''
+mmaptype=''
+revision='5'
+sizesize='4'
+socksizetype='int'
+
+double='undef'
+usemorebits='undef'
+usemultiplicity='undef'
+usemymalloc='n'
+usenm=''
+useopcode=''
+useperlio='undef'
+useposix=''
+usesfio=''
+useshrplib=''
+usesocks='undef'
+usethreads='undef'
+usevendorprefix=''
+usevfork=''
+usrinc=''
+uuname=''
+vendorlib=''
+vendorlib_stem=''
+vendorlibexp=''
+vendorprefix=''
+vendorprefixexp=''
+version='5.6.1'
vi=''
voidflags='15'
xlibpth=''
@@ -787,3 +941,46 @@ use5005threads='undef'
useithreads='undef'
inc_version_list=' '
inc_version_list_init='0'
+d_madvise='undef'
+d_mkdtemp='undef'
+d_mkstemp='undef'
+d_mkstemps='undef'
+d_mmap='undef'
+d_mprotect='undef'
+d_msync='undef'
+d_munmap='undef'
+d_qgcvt='undef'
+d_socklen_t='undef'
+d_vendorarch=''
+i_iconv='undef'
+i_ieeefp='undef'
+i_sunmath='undef'
+i_syslog='undef'
+i_sysmman='undef'
+i_sysutsname='undef'
+installvendorarch=''
+mmaptype=''
+revision='5'
+sizesize='4'
+socksizetype='int'
+xs_apiversion='5.005'
+d_getcwd='define'
+i_sysmode='undef'
+d_vendorarch='undef'
+d_frexpl='undef'
+d_getespwnam='undef'
+d_getprpwnam='undef'
+d_isnan='define'
+d_isnanl='undef'
+d_modfl='undef'
+d_setproctitle='undef'
+d_socks5_init='undef'
+i_libutil='undef'
+i_prot='undef'
+d_SCNfldbl='undef'
+d_perl_otherlibdirs='undef'
+nvsize='16'
+issymlink=''
+nveformat='"e"'
+nvfformat='"f"'
+nvgformat='"g"'
diff --git a/gnu/usr.bin/perl/epoc/createpkg.pl b/gnu/usr.bin/perl/epoc/createpkg.pl
index 6977bd385f5..b803f4359fa 100644
--- a/gnu/usr.bin/perl/epoc/createpkg.pl
+++ b/gnu/usr.bin/perl/epoc/createpkg.pl
@@ -3,17 +3,17 @@
use File::Find;
use Cwd;
-$VERSION="5.5";
-$PATCH="650";
-$EPOC_VERSION=19;
+$VERSION="5.6";
+$PATCH="1";
+$EPOC_VERSION=26;
$CROSSCOMPILEPATH=cwd;
-$CROSSREPLACEPATH="H:\\devel\\perl5.5.650";
+$CROSSREPLACEPATH="H:\\perl";
sub filefound {
my $f = $File::Find::name;
- return if ( $f =~ /CVS|unicode|CPAN|ExtUtils|IPC|User|DB.pm|\.a$|\.ld$|\.exists$/i);
+ return if ( $f =~ /CVS|unicode|CPAN|ExtUtils|IPC|User|DB.pm|\.a$|\.ld$|\.exists$|\.pod$/i);
my $back = $f;
$back =~ s|$CROSSCOMPILEPATH||;
@@ -31,8 +31,8 @@ sub filefound {
open OUT,">perl.pkg";
print OUT "#{\"perl$VERSION\"},(0x100051d8),$PATCH,$EPOC_VERSION,0\n";
-
-print OUT "\"$CROSSREPLACEPATH\\perlmain.exe\"-\"!:\\perl.exe\"\n";
+print OUT "\"$CROSSREPLACEPATH\\Artistic\"-\"\",FT,TA\n";
+print OUT "\"$CROSSREPLACEPATH\\perlmain.exe\"-\"!:\\system\\programs\\perl.exe\"\n";
find(\&filefound, cwd.'/lib');
print OUT "@\"G:\\lib\\stdlib.sis\",(0x0100002c3)\n"
diff --git a/gnu/usr.bin/perl/epoc/epoc.c b/gnu/usr.bin/perl/epoc/epoc.c
index 498036dbc04..6652ef0ce1c 100644
--- a/gnu/usr.bin/perl/epoc/epoc.c
+++ b/gnu/usr.bin/perl/epoc/epoc.c
@@ -17,6 +17,10 @@ Perl_epoc_init(int *argcp, char ***argvp) {
int truecount=0;
char **lastcp = (*argvp);
char *ptr;
+
+#if 0
+ epoc_spawn_posix_server();
+#endif
for (i=0; i< *argcp; i++) {
if ((*argvp)[i]) {
if (*((*argvp)[i]) == '<') {
@@ -58,6 +62,7 @@ Perl_epoc_init(int *argcp, char ***argvp) {
}
+
#ifdef __MARM__
/* Symbian forgot to include __fixunsdfi into the MARM euser.lib */
/* This is from libgcc2.c , gcc-2.7.2.3 */
@@ -86,62 +91,153 @@ __fixunsdfsi (a)
return (SItype) a;
}
+#endif
+
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
int
-do_aspawn( pTHX_ SV *really,SV **mark,SV **sp) {
- return do_spawn( really, mark, sp);
+do_spawn( char *cmd) {
+ dTHXo;
+ char *argv0, *ptr;
+ char *cmdptr = cmd;
+ int ret;
+
+ argv0 = ptr = malloc( strlen(cmd) + 1);
+
+ while (*cmdptr && !isSPACE( *cmdptr)) {
+ *ptr = *cmdptr;
+ if (*ptr == '/') {
+ *ptr = '\\';
+ }
+ ptr++; cmdptr++;
+ }
+ while (*cmdptr && isSPACE( *cmdptr)) {
+ cmdptr++;
+ }
+ *ptr = '\0';
+ ret = epoc_spawn( argv0, cmdptr);
+ free( argv0);
+ return ret;
}
int
-do_spawn (pTHX_ SV *really,SV **mark,SV **sp)
-{
- dTHR;
+do_aspawn ( void *vreally, void **vmark, void **vsp) {
+
+ dTHXo;
+
+ SV *really = (SV*)vreally;
+ SV **mark = (SV**)vmark;
+ SV **sp = (SV**)vsp;
+
+ char **argv;
+ char *str;
+ char *p2, **ptr;
+ char *cmd, *cmdline;
+
+
int rc;
- char **a,*cmd,**ptr, *cmdline, **argv, *p2;
- STRLEN n_a;
- size_t len = 0;
+ int index = 0;
+ int len = 0;
if (sp<=mark)
return -1;
- a=argv=ptr=(char**) malloc ((sp-mark+3)*sizeof (char*));
+ ptr = argv =(char**) malloc ((sp-mark+3)*sizeof (char*));
while (++mark <= sp) {
- if (*mark)
- *a = SvPVx(*mark, n_a);
+ if (*mark && (str = SvPV_nolen(*mark)))
+ argv[index] = str;
else
- *a = "";
- len += strlen( *a) + 1;
- a++;
+ argv[index] = "";
+
+ len += strlen(argv[ index++]) + 1;
}
- *a = Nullch;
+ argv[index++] = 0;
+
+ cmd = strdup((const char*)(really ? SvPV_nolen(really) : argv[0]));
- if (!(really && *(cmd = SvPV(really, n_a)))) {
- cmd = argv[0];
- argv++;
+ for (p2=cmd; *p2 != '\0'; p2++) {
+ /* Change / to \ */
+ if ( *p2 == '/')
+ *p2 = '\\';
}
cmdline = (char * ) malloc( len + 1);
cmdline[ 0] = '\0';
while (*argv != NULL) {
- strcat( cmdline, *argv++);
+ strcat( cmdline, *ptr++);
strcat( cmdline, " ");
}
+
+ free( argv);
- for (p2=cmd; *p2 != '\0'; p2++) {
- /* Change / to \ */
- if ( *p2 == '/')
- *p2 = '\\';
- }
rc = epoc_spawn( cmd, cmdline);
- free( ptr);
free( cmdline);
-
+ free( cmd);
+
return rc;
}
-
-#endif
+static
+XS(epoc_getcwd) /* more or less stolen from win32.c */
+{
+ dXSARGS;
+ /* Make the host for current directory */
+ char *buffer;
+ int buflen = 256;
+
+ char *ptr;
+ buffer = (char *) malloc( buflen);
+ if (buffer == NULL) {
+ XSRETURN_UNDEF;
+ }
+ while ((NULL == ( ptr = getcwd( buffer, buflen))) && (errno == ERANGE)) {
+ buflen *= 2;
+ if (NULL == realloc( buffer, buflen)) {
+ XSRETURN_UNDEF;
+ }
+
+ }
+
+ /*
+ * If ptr != Nullch
+ * then it worked, set PV valid,
+ * else return 'undef'
+ */
+
+ if (ptr) {
+ SV *sv = sv_newmortal();
+ char *tptr;
+
+ for (tptr = ptr; *tptr != '\0'; tptr++) {
+ if (*tptr == '\\') {
+ *tptr = '/';
+ }
+ }
+ sv_setpv(sv, ptr);
+ free( buffer);
+
+ EXTEND(SP,1);
+ SvPOK_on(sv);
+ ST(0) = sv;
+ XSRETURN(1);
+ }
+ free( buffer);
+ XSRETURN_UNDEF;
+}
+
+
+void
+Perl_init_os_extras(void)
+{
+ dTHXo;
+ char *file = __FILE__;
+ newXS("EPOC::getcwd", epoc_getcwd, file);
+}
+
+void
+Perl_my_setenv(pTHX_ char *nam,char *val) {
+ setenv( nam, val, 1);
+}
diff --git a/gnu/usr.bin/perl/epoc/epoc_stubs.c b/gnu/usr.bin/perl/epoc/epoc_stubs.c
index b11da400d6b..c1c6bcf9e09 100644
--- a/gnu/usr.bin/perl/epoc/epoc_stubs.c
+++ b/gnu/usr.bin/perl/epoc/epoc_stubs.c
@@ -8,8 +8,6 @@
#include <string.h>
-char *environ = 0;
-
int getgid() {return 0;}
int getegid() {return 0;}
int geteuid() {return 0;}
@@ -31,7 +29,7 @@ signal() { }
int execv() { return -1;}
int execvp() { return -1;}
-void Perl_do_exec() {}
+void Perl_do_exec() {}
/*------------------------------------------------------------------*/
/* Two dummy functions implement getproto* */
diff --git a/gnu/usr.bin/perl/epoc/epocish.c b/gnu/usr.bin/perl/epoc/epocish.c
index 134eaef0e00..a8b95972d0e 100644
--- a/gnu/usr.bin/perl/epoc/epocish.c
+++ b/gnu/usr.bin/perl/epoc/epocish.c
@@ -6,29 +6,89 @@
*
*/
-/* This is indeed C++ Code !! */
+/* This is C++ Code !! */
#include <e32std.h>
+#include <stdlib.h>
+#include <estlib.h>
+#include <string.h>
extern "C" {
+#if 1
+int
epoc_spawn( char *cmd, char *cmdline) {
RProcess p;
TRequestStatus status;
TInt rc;
rc = p.Create( _L( cmd), _L( cmdline));
- if (rc != KErrNone)
+ if (rc != KErrNone) {
return -1;
+ }
p.Resume();
p.Logon( status);
User::WaitForRequest( status);
+ p.Kill( 0);
if (status!=KErrNone) {
return -1;
}
return 0;
}
+#else
+int
+epoc_spawn( char *cmd, char *cmdline) {
+ int len = strlen(cmd) + strlen(cmdline) + 4;
+ char *n = (char *) malloc( len);
+ int r;
+ strcpy( n, cmd);
+ strcat( n, " ");
+ strcat( n, cmdline);
+ r = system( n);
+ free( n);
+ return r;
+}
+#endif
+
+/* Workaround for defect strtoul(). Values with leading + are zero */
+
+unsigned long int epoc_strtoul(const char *nptr, char **endptr,
+ int base) {
+ if (nptr && *nptr == '+')
+ nptr++;
+ return strtoul( nptr, endptr, base);
+}
+
+/* Workaround for defect atof(), see java defect list for epoc */
+double epoc_atof( char* str) {
+ TReal64 aRes;
+
+ while (TChar( *str).IsSpace()) {
+ str++;
+ }
+
+ TLex lex( _L( str));
+ TInt err = lex.Val( aRes, TChar( '.'));
+ return aRes;
+}
+
+void epoc_gcvt( double x, int digits, unsigned char *buf) {
+ TRealFormat trel;
+
+ trel.iPlaces = digits;
+ trel.iPoint = TChar( '.');
+
+ TPtr result( buf, 80);
+
+ result.Num( x, trel);
+ result.Append( TChar( 0));
+ }
+}
+#if 0
+void epoc_spawn_posix_server() {
+ SpawnPosixServerThread();
}
+#endif
diff --git a/gnu/usr.bin/perl/epoc/epocish.h b/gnu/usr.bin/perl/epoc/epocish.h
index f4be0ff677b..e365fa2c25d 100644
--- a/gnu/usr.bin/perl/epoc/epocish.h
+++ b/gnu/usr.bin/perl/epoc/epocish.h
@@ -121,9 +121,6 @@
/* getsockname returns the size of struct sockaddr_in *without* padding */
#define BOGUS_GETNAME_RETURN 8
-/* Yes, size_t is size_t */
-#define Sock_size_t size_t
-
/*
read() on a socket blocks until buf is filled completly,
recv() returns each massage
@@ -133,3 +130,16 @@
/* No /dev/random available*/
#define PERL_NO_DEV_RANDOM
+
+/*
+ work around for buggy atof():
+ atof() in ER5 stdlib depends on locale.
+*/
+
+double epoc_atof( const char *ptr);
+#define atof(a) epoc_atof(a)
+#define strtoul(a,b,c) epoc_strtoul(a,b,c)
+
+#define init_os_extras Perl_init_os_extras
+
+#define NO_ENVIRON_ARRAY
diff --git a/gnu/usr.bin/perl/epoc/link.pl b/gnu/usr.bin/perl/epoc/link.pl
index 9da8a356cae..ab3bd652b49 100644
--- a/gnu/usr.bin/perl/epoc/link.pl
+++ b/gnu/usr.bin/perl/epoc/link.pl
@@ -15,11 +15,11 @@ system("arm-pe-dlltool --as=arm-pe-as --output-exp $basname.exp " .
"--base-file $basname.bas $epoc/lib/eexe.o @objs " .
"$epoc/lib/ecrt0.o $epoc/lib/estlib.lib $epoc/lib/euser.lib");
-system("arm-pe-ld -s -e _E32Startup -o $basname.exe $basname.exp " .
+system("arm-pe-ld -s -e _E32Startup $basname.exp " .
"-o $baspe.exe $epoc/lib/eexe.o @objs " .
"$epoc/lib/ecrt0.o $epoc/lib/estlib.lib $epoc/lib/euser.lib");
-system( "wine \"$epoc/bin/petran.exe $baspe.exe $basname.exe " .
+system( "wine $epoc/bin/petran.exe \"$baspe.exe $basname.exe " .
"-nocall -heap 0x00000400 0x00400000 -stack 0x0000c000 " .
- "-uid1 0x1000007a -uid2 0x100051d8 -uid3 0x00000000 \" ");
+ "-uid1 0x1000007a -uid2 0x100051d8 -uid3 0x00000000\" ");
diff --git a/gnu/usr.bin/perl/ext/B/B.pm b/gnu/usr.bin/perl/ext/B/B.pm
index 4512d916e61..c58e769a84d 100644
--- a/gnu/usr.bin/perl/ext/B/B.pm
+++ b/gnu/usr.bin/perl/ext/B/B.pm
@@ -9,11 +9,17 @@ package B;
use XSLoader ();
require Exporter;
@ISA = qw(Exporter);
-@EXPORT_OK = qw(minus_c ppname
+
+# walkoptree_slow comes from B.pm (you are there),
+# walkoptree comes from B.xs
+@EXPORT_OK = qw(minus_c ppname save_BEGINs
class peekop cast_I32 cstring cchar hash threadsv_names
- 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);
+ main_root main_start main_cv svref_2object opnumber
+ amagic_generation
+ walkoptree_slow walkoptree walkoptree_exec walksymtable
+ parents comppadlist sv_undef compile_stats timing_info
+ begin_av init_av end_av);
+
sub OPf_KIDS ();
use strict;
@B::SV::ISA = 'B::OBJECT';
@@ -54,6 +60,21 @@ use strict;
package B::OBJECT;
}
+sub B::GV::SAFENAME {
+ my $name = (shift())->NAME;
+
+ # The regex below corresponds to the isCONTROLVAR macro
+ # from toke.c
+
+ $name =~ s/^([\cA-\cZ\c\\c[\c]\c?\c_\c^])/"^".chr(64 ^ ord($1))/e;
+ return $name;
+}
+
+sub B::IV::int_value {
+ my ($self) = @_;
+ return (($self->FLAGS() & SVf_IVisUV()) ? $self->UVX : $self->IV);
+}
+
my $debug;
my $op_count = 0;
my @parents = ();
@@ -125,6 +146,7 @@ sub objsym {
sub walkoptree_exec {
my ($op, $method, $level) = @_;
+ $level ||= 0;
my ($sym, $ppname);
my $prefix = " " x $level;
for (; $$op; $op = $op->next) {
@@ -184,7 +206,7 @@ sub walksymtable {
*glob = "*main::".$prefix.$sym;
if ($sym =~ /::$/) {
$sym = $prefix . $sym;
- if ($sym ne "main::" && &$recurse($sym)) {
+ if ($sym ne "main::" && $sym ne "<none>::" && &$recurse($sym)) {
walksymtable(\%glob, $method, $recurse, $sym);
}
} else {
@@ -326,8 +348,22 @@ C<REFCNT> (corresponding to the C function C<SvREFCNT>).
=item IV
+Returns the value of the IV, I<interpreted as
+a signed integer>. This will be misleading
+if C<FLAGS & SVf_IVisUV>. Perhaps you want the
+C<int_value> method instead?
+
=item IVX
+=item UVX
+
+=item int_value
+
+This method returns the value of the IV as an integer.
+It differs from C<IV> in that it returns the correct
+value regardless of whether it's stored signed or
+unsigned.
+
=item needs64bits
=item packiv
@@ -358,6 +394,22 @@ C<REFCNT> (corresponding to the C function C<SvREFCNT>).
=item PV
+This method is the one you usually want. It constructs a
+string using the length and offset information in the struct:
+for ordinary scalars it will return the string that you'd see
+from Perl, even if it contains null characters.
+
+=item PVX
+
+This method is less often useful. It assumes that the string
+stored in the struct is null-terminated, and disregards the
+length information.
+
+It is the appropriate method to use if you need to get the name
+of a lexical variable from a padname array. Lexical variable names
+are always stored with a null terminator, and the length field
+(SvCUR) is overloaded for other purposes and can't be relied on here.
+
=back
=head2 B::PVMG METHODS
@@ -426,6 +478,21 @@ This method returns TRUE if the GP field of the GV is NULL.
=item NAME
+=item SAFENAME
+
+This method returns the name of the glob, but if the first
+character of the name is a control character, then it converts
+it to ^X first, so that *^G would return "^G" rather than "\cG".
+
+It's useful if you want to print out the name of a variable.
+If you restrict yourself to globs which exist at compile-time
+then the result ought to be unambiguous, because code like
+C<${"^G"} = 1> is compiled as two ops - a constant string and
+a dereference (rv2gv) - so that the glob is created at runtime.
+
+If you're working with globs at runtime, and need to disambiguate
+*^G from *{"^G"}, then you should use the raw NAME method.
+
=item STASH
=item SV
diff --git a/gnu/usr.bin/perl/ext/B/B.xs b/gnu/usr.bin/perl/ext/B/B.xs
index 9e2985582a1..10057475211 100644
--- a/gnu/usr.bin/perl/ext/B/B.xs
+++ b/gnu/usr.bin/perl/ext/B/B.xs
@@ -81,7 +81,7 @@ static char *opclassnames[] = {
static int walkoptree_debug = 0; /* Flag for walkoptree debug hook */
-static SV *specialsv_list[4];
+static SV *specialsv_list[6];
static opclass
cc_opclass(pTHX_ OP *o)
@@ -386,11 +386,15 @@ BOOT:
specialsv_list[1] = &PL_sv_undef;
specialsv_list[2] = &PL_sv_yes;
specialsv_list[3] = &PL_sv_no;
+ specialsv_list[4] = pWARN_ALL;
+ specialsv_list[5] = pWARN_NONE;
#include "defsubs.h"
}
#define B_main_cv() PL_main_cv
#define B_init_av() PL_initav
+#define B_begin_av() PL_beginav_save
+#define B_end_av() PL_endav
#define B_main_root() PL_main_root
#define B_main_start() PL_main_start
#define B_amagic_generation() PL_amagic_generation
@@ -402,6 +406,12 @@ BOOT:
B::AV
B_init_av()
+B::AV
+B_begin_av()
+
+B::AV
+B_end_av()
+
B::CV
B_main_cv()
@@ -515,6 +525,11 @@ minus_c()
CODE:
PL_minus_c = TRUE;
+void
+save_BEGINs()
+ CODE:
+ PL_minus_c |= 0x10;
+
SV *
cstring(sv)
SV * sv
@@ -567,11 +582,12 @@ char *
OP_name(o)
B::OP o
CODE:
- ST(0) = sv_newmortal();
- sv_setpv(ST(0), PL_op_name[o->op_type]);
+ RETVAL = PL_op_name[o->op_type];
+ OUTPUT:
+ RETVAL
-char *
+void
OP_ppaddr(o)
B::OP o
PREINIT:
@@ -633,13 +649,20 @@ B::OP
LOGOP_other(o)
B::LOGOP o
-#define LISTOP_children(o) o->op_children
-
MODULE = B PACKAGE = B::LISTOP PREFIX = LISTOP_
U32
LISTOP_children(o)
B::LISTOP o
+ OP * kid = NO_INIT
+ int i = NO_INIT
+ CODE:
+ i = 0;
+ for (kid = o->op_first; kid; kid = kid->op_sibling)
+ i++;
+ RETVAL = i;
+ OUTPUT:
+ RETVAL
#define PMOP_pmreplroot(o) o->op_pmreplroot
#define PMOP_pmreplstart(o) o->op_pmreplstart
@@ -693,8 +716,8 @@ PMOP_precomp(o)
if (rx)
sv_setpvn(ST(0), rx->precomp, rx->prelen);
-#define SVOP_sv(o) cSVOPo->op_sv
-#define SVOP_gv(o) ((GV*)cSVOPo->op_sv)
+#define SVOP_sv(o) cSVOPo->op_sv
+#define SVOP_gv(o) ((GV*)cSVOPo->op_sv)
MODULE = B PACKAGE = B::SVOP PREFIX = SVOP_
@@ -862,11 +885,11 @@ packiv(sv)
MODULE = B PACKAGE = B::NV PREFIX = Sv
-double
+NV
SvNV(sv)
B::NV sv
-double
+NV
SvNVX(sv)
B::NV sv
@@ -878,6 +901,10 @@ SvRV(sv)
MODULE = B PACKAGE = B::PV PREFIX = Sv
+char*
+SvPVX(sv)
+ B::PV sv
+
void
SvPV(sv)
B::PV sv
@@ -1210,7 +1237,7 @@ CvXSUBANY(cv)
MODULE = B PACKAGE = B::CV
-U8
+U16
CvFLAGS(cv)
B::CV cv
@@ -1251,7 +1278,7 @@ HvARRAY(hv)
I32 len;
(void)hv_iterinit(hv);
EXTEND(sp, HvKEYS(hv) * 2);
- while (sv = hv_iternextsv(hv, &key, &len)) {
+ while ((sv = hv_iternextsv(hv, &key, &len))) {
PUSHs(newSVpvn(key, len));
PUSHs(make_sv_object(aTHX_ sv_newmortal(), sv));
}
diff --git a/gnu/usr.bin/perl/ext/B/B/Asmdata.pm b/gnu/usr.bin/perl/ext/B/B/Asmdata.pm
index bc0eda935b7..dc176be9626 100644
--- a/gnu/usr.bin/perl/ext/B/B/Asmdata.pm
+++ b/gnu/usr.bin/perl/ext/B/B/Asmdata.pm
@@ -15,7 +15,7 @@ use Exporter;
our(%insn_data, @insn_name, @optype, @specialsv_name);
@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);
+@specialsv_name = qw(Nullsv &PL_sv_undef &PL_sv_yes &PL_sv_no pWARN_ALL pWARN_NONE);
# XXX insn_data is initialised this way because with a large
# %insn_data = (foo => [...], bar => [...], ...) initialiser
@@ -27,93 +27,93 @@ $insn_data{ldsv} = [1, \&PUT_svindex, "GET_svindex"];
$insn_data{ldop} = [2, \&PUT_opindex, "GET_opindex"];
$insn_data{stsv} = [3, \&PUT_U32, "GET_U32"];
$insn_data{stop} = [4, \&PUT_U32, "GET_U32"];
-$insn_data{ldspecsv} = [5, \&PUT_U8, "GET_U8"];
-$insn_data{newsv} = [6, \&PUT_U8, "GET_U8"];
-$insn_data{newop} = [7, \&PUT_U8, "GET_U8"];
-$insn_data{newopn} = [8, \&PUT_U8, "GET_U8"];
-$insn_data{newpv} = [9, \&PUT_PV, "GET_PV"];
-$insn_data{pv_cur} = [11, \&PUT_U32, "GET_U32"];
-$insn_data{pv_free} = [12, \&PUT_none, "GET_none"];
-$insn_data{sv_upgrade} = [13, \&PUT_U8, "GET_U8"];
-$insn_data{sv_refcnt} = [14, \&PUT_U32, "GET_U32"];
-$insn_data{sv_refcnt_add} = [15, \&PUT_I32, "GET_I32"];
-$insn_data{sv_flags} = [16, \&PUT_U32, "GET_U32"];
-$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_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"];
-$insn_data{xlv_type} = [25, \&PUT_U8, "GET_U8"];
-$insn_data{xbm_useful} = [26, \&PUT_I32, "GET_I32"];
-$insn_data{xbm_previous} = [27, \&PUT_U16, "GET_U16"];
-$insn_data{xbm_rare} = [28, \&PUT_U8, "GET_U8"];
-$insn_data{xfm_lines} = [29, \&PUT_I32, "GET_I32"];
-$insn_data{xio_lines} = [30, \&PUT_I32, "GET_I32"];
-$insn_data{xio_page} = [31, \&PUT_I32, "GET_I32"];
-$insn_data{xio_page_len} = [32, \&PUT_I32, "GET_I32"];
-$insn_data{xio_lines_left} = [33, \&PUT_I32, "GET_I32"];
-$insn_data{xio_top_name} = [34, \&PUT_pvcontents, "GET_pvcontents"];
-$insn_data{xio_top_gv} = [36, \&PUT_svindex, "GET_svindex"];
-$insn_data{xio_fmt_name} = [37, \&PUT_pvcontents, "GET_pvcontents"];
-$insn_data{xio_fmt_gv} = [38, \&PUT_svindex, "GET_svindex"];
-$insn_data{xio_bottom_name} = [39, \&PUT_pvcontents, "GET_pvcontents"];
-$insn_data{xio_bottom_gv} = [40, \&PUT_svindex, "GET_svindex"];
-$insn_data{xio_subprocess} = [41, \&PUT_U16, "GET_U16"];
-$insn_data{xio_type} = [42, \&PUT_U8, "GET_U8"];
-$insn_data{xio_flags} = [43, \&PUT_U8, "GET_U8"];
-$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_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_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"];
-$insn_data{xav_max} = [56, \&PUT_I32, "GET_I32"];
-$insn_data{xav_flags} = [57, \&PUT_U8, "GET_U8"];
-$insn_data{xhv_riter} = [58, \&PUT_I32, "GET_I32"];
-$insn_data{xhv_name} = [59, \&PUT_pvcontents, "GET_pvcontents"];
-$insn_data{hv_store} = [60, \&PUT_svindex, "GET_svindex"];
-$insn_data{sv_magic} = [61, \&PUT_U8, "GET_U8"];
-$insn_data{mg_obj} = [62, \&PUT_svindex, "GET_svindex"];
-$insn_data{mg_private} = [63, \&PUT_U16, "GET_U16"];
-$insn_data{mg_flags} = [64, \&PUT_U8, "GET_U8"];
-$insn_data{mg_pv} = [65, \&PUT_pvcontents, "GET_pvcontents"];
-$insn_data{xmg_stash} = [66, \&PUT_svindex, "GET_svindex"];
-$insn_data{gv_fetchpv} = [67, \&PUT_strconst, "GET_strconst"];
-$insn_data{gv_stashpv} = [68, \&PUT_strconst, "GET_strconst"];
-$insn_data{gp_sv} = [69, \&PUT_svindex, "GET_svindex"];
-$insn_data{gp_refcnt} = [70, \&PUT_U32, "GET_U32"];
-$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_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"];
-$insn_data{gp_line} = [79, \&PUT_U16, "GET_U16"];
-$insn_data{gp_share} = [80, \&PUT_svindex, "GET_svindex"];
-$insn_data{xgv_flags} = [81, \&PUT_U8, "GET_U8"];
-$insn_data{op_next} = [82, \&PUT_opindex, "GET_opindex"];
-$insn_data{op_sibling} = [83, \&PUT_opindex, "GET_opindex"];
-$insn_data{op_ppaddr} = [84, \&PUT_strconst, "GET_strconst"];
-$insn_data{op_targ} = [85, \&PUT_U32, "GET_U32"];
-$insn_data{op_type} = [86, \&PUT_U16, "GET_U16"];
-$insn_data{op_seq} = [87, \&PUT_U16, "GET_U16"];
-$insn_data{op_flags} = [88, \&PUT_U8, "GET_U8"];
-$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_children} = [93, \&PUT_U32, "GET_U32"];
+$insn_data{stpv} = [5, \&PUT_U32, "GET_U32"];
+$insn_data{ldspecsv} = [6, \&PUT_U8, "GET_U8"];
+$insn_data{newsv} = [7, \&PUT_U8, "GET_U8"];
+$insn_data{newop} = [8, \&PUT_U8, "GET_U8"];
+$insn_data{newopn} = [9, \&PUT_U8, "GET_U8"];
+$insn_data{newpv} = [11, \&PUT_PV, "GET_PV"];
+$insn_data{pv_cur} = [12, \&PUT_U32, "GET_U32"];
+$insn_data{pv_free} = [13, \&PUT_none, "GET_none"];
+$insn_data{sv_upgrade} = [14, \&PUT_U8, "GET_U8"];
+$insn_data{sv_refcnt} = [15, \&PUT_U32, "GET_U32"];
+$insn_data{sv_refcnt_add} = [16, \&PUT_I32, "GET_I32"];
+$insn_data{sv_flags} = [17, \&PUT_U32, "GET_U32"];
+$insn_data{xrv} = [18, \&PUT_svindex, "GET_svindex"];
+$insn_data{xpv} = [19, \&PUT_none, "GET_none"];
+$insn_data{xiv32} = [20, \&PUT_I32, "GET_I32"];
+$insn_data{xiv64} = [21, \&PUT_IV64, "GET_IV64"];
+$insn_data{xnv} = [22, \&PUT_NV, "GET_NV"];
+$insn_data{xlv_targoff} = [23, \&PUT_U32, "GET_U32"];
+$insn_data{xlv_targlen} = [24, \&PUT_U32, "GET_U32"];
+$insn_data{xlv_targ} = [25, \&PUT_svindex, "GET_svindex"];
+$insn_data{xlv_type} = [26, \&PUT_U8, "GET_U8"];
+$insn_data{xbm_useful} = [27, \&PUT_I32, "GET_I32"];
+$insn_data{xbm_previous} = [28, \&PUT_U16, "GET_U16"];
+$insn_data{xbm_rare} = [29, \&PUT_U8, "GET_U8"];
+$insn_data{xfm_lines} = [30, \&PUT_I32, "GET_I32"];
+$insn_data{xio_lines} = [31, \&PUT_I32, "GET_I32"];
+$insn_data{xio_page} = [32, \&PUT_I32, "GET_I32"];
+$insn_data{xio_page_len} = [33, \&PUT_I32, "GET_I32"];
+$insn_data{xio_lines_left} = [34, \&PUT_I32, "GET_I32"];
+$insn_data{xio_top_name} = [36, \&PUT_pvcontents, "GET_pvcontents"];
+$insn_data{xio_top_gv} = [37, \&PUT_svindex, "GET_svindex"];
+$insn_data{xio_fmt_name} = [38, \&PUT_pvcontents, "GET_pvcontents"];
+$insn_data{xio_fmt_gv} = [39, \&PUT_svindex, "GET_svindex"];
+$insn_data{xio_bottom_name} = [40, \&PUT_pvcontents, "GET_pvcontents"];
+$insn_data{xio_bottom_gv} = [41, \&PUT_svindex, "GET_svindex"];
+$insn_data{xio_subprocess} = [42, \&PUT_U16, "GET_U16"];
+$insn_data{xio_type} = [43, \&PUT_U8, "GET_U8"];
+$insn_data{xio_flags} = [44, \&PUT_U8, "GET_U8"];
+$insn_data{xcv_stash} = [45, \&PUT_svindex, "GET_svindex"];
+$insn_data{xcv_start} = [46, \&PUT_opindex, "GET_opindex"];
+$insn_data{xcv_root} = [47, \&PUT_opindex, "GET_opindex"];
+$insn_data{xcv_gv} = [48, \&PUT_svindex, "GET_svindex"];
+$insn_data{xcv_file} = [49, \&PUT_pvindex, "GET_pvindex"];
+$insn_data{xcv_depth} = [50, \&PUT_I32, "GET_I32"];
+$insn_data{xcv_padlist} = [51, \&PUT_svindex, "GET_svindex"];
+$insn_data{xcv_outside} = [52, \&PUT_svindex, "GET_svindex"];
+$insn_data{xcv_flags} = [53, \&PUT_U16, "GET_U16"];
+$insn_data{av_extend} = [54, \&PUT_I32, "GET_I32"];
+$insn_data{av_push} = [55, \&PUT_svindex, "GET_svindex"];
+$insn_data{xav_fill} = [56, \&PUT_I32, "GET_I32"];
+$insn_data{xav_max} = [57, \&PUT_I32, "GET_I32"];
+$insn_data{xav_flags} = [58, \&PUT_U8, "GET_U8"];
+$insn_data{xhv_riter} = [59, \&PUT_I32, "GET_I32"];
+$insn_data{xhv_name} = [60, \&PUT_pvcontents, "GET_pvcontents"];
+$insn_data{hv_store} = [61, \&PUT_svindex, "GET_svindex"];
+$insn_data{sv_magic} = [62, \&PUT_U8, "GET_U8"];
+$insn_data{mg_obj} = [63, \&PUT_svindex, "GET_svindex"];
+$insn_data{mg_private} = [64, \&PUT_U16, "GET_U16"];
+$insn_data{mg_flags} = [65, \&PUT_U8, "GET_U8"];
+$insn_data{mg_pv} = [66, \&PUT_pvcontents, "GET_pvcontents"];
+$insn_data{xmg_stash} = [67, \&PUT_svindex, "GET_svindex"];
+$insn_data{gv_fetchpv} = [68, \&PUT_strconst, "GET_strconst"];
+$insn_data{gv_stashpv} = [69, \&PUT_strconst, "GET_strconst"];
+$insn_data{gp_sv} = [70, \&PUT_svindex, "GET_svindex"];
+$insn_data{gp_refcnt} = [71, \&PUT_U32, "GET_U32"];
+$insn_data{gp_refcnt_add} = [72, \&PUT_I32, "GET_I32"];
+$insn_data{gp_av} = [73, \&PUT_svindex, "GET_svindex"];
+$insn_data{gp_hv} = [74, \&PUT_svindex, "GET_svindex"];
+$insn_data{gp_cv} = [75, \&PUT_svindex, "GET_svindex"];
+$insn_data{gp_file} = [76, \&PUT_pvindex, "GET_pvindex"];
+$insn_data{gp_io} = [77, \&PUT_svindex, "GET_svindex"];
+$insn_data{gp_form} = [78, \&PUT_svindex, "GET_svindex"];
+$insn_data{gp_cvgen} = [79, \&PUT_U32, "GET_U32"];
+$insn_data{gp_line} = [80, \&PUT_U16, "GET_U16"];
+$insn_data{gp_share} = [81, \&PUT_svindex, "GET_svindex"];
+$insn_data{xgv_flags} = [82, \&PUT_U8, "GET_U8"];
+$insn_data{op_next} = [83, \&PUT_opindex, "GET_opindex"];
+$insn_data{op_sibling} = [84, \&PUT_opindex, "GET_opindex"];
+$insn_data{op_ppaddr} = [85, \&PUT_strconst, "GET_strconst"];
+$insn_data{op_targ} = [86, \&PUT_U32, "GET_U32"];
+$insn_data{op_type} = [87, \&PUT_U16, "GET_U16"];
+$insn_data{op_seq} = [88, \&PUT_U16, "GET_U16"];
+$insn_data{op_flags} = [89, \&PUT_U8, "GET_U8"];
+$insn_data{op_private} = [90, \&PUT_U8, "GET_U8"];
+$insn_data{op_first} = [91, \&PUT_opindex, "GET_opindex"];
+$insn_data{op_last} = [92, \&PUT_opindex, "GET_opindex"];
+$insn_data{op_other} = [93, \&PUT_opindex, "GET_opindex"];
$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"];
@@ -128,9 +128,9 @@ $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_label} = [108, \&PUT_pvindex, "GET_pvindex"];
+$insn_data{cop_stashpv} = [109, \&PUT_pvindex, "GET_pvindex"];
+$insn_data{cop_file} = [110, \&PUT_pvindex, "GET_pvindex"];
$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"];
@@ -138,6 +138,9 @@ $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"];
+$insn_data{push_begin} = [118, \&PUT_svindex, "GET_svindex"];
+$insn_data{push_init} = [119, \&PUT_svindex, "GET_svindex"];
+$insn_data{push_end} = [120, \&PUT_svindex, "GET_svindex"];
my ($insn_name, $insn_data);
while (($insn_name, $insn_data) = each %insn_data) {
diff --git a/gnu/usr.bin/perl/ext/B/B/Assembler.pm b/gnu/usr.bin/perl/ext/B/B/Assembler.pm
index 6c51a9ad3e3..5e798ce485d 100644
--- a/gnu/usr.bin/perl/ext/B/B/Assembler.pm
+++ b/gnu/usr.bin/perl/ext/B/B/Assembler.pm
@@ -4,14 +4,17 @@
#
# 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::Assembler;
use Exporter;
use B qw(ppname);
use B::Asmdata qw(%insn_data @insn_name);
+use Config qw(%Config);
+require ByteLoader; # we just need its $VERSIOM
@ISA = qw(Exporter);
-@EXPORT_OK = qw(assemble_fh assemble_insn strip_comments
- parse_statement uncstring);
+@EXPORT_OK = qw(assemble_fh newasm endasm assemble);
+$VERSION = 0.02;
use strict;
my %opnumber;
@@ -20,7 +23,7 @@ for ($i = 0; defined($opname = ppname($i)); $i++) {
$opnumber{$opname} = $i;
}
-my ($linenum, $errors);
+my($linenum, $errors, $out); # global state, set up by newasm
sub error {
my $str = shift;
@@ -49,13 +52,15 @@ sub B::Asmdata::PUT_U8 {
return $c;
}
-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_U16 { pack("S", $_[0]) }
+sub B::Asmdata::PUT_U32 { pack("L", $_[0]) }
+sub B::Asmdata::PUT_I32 { pack("L", $_[0]) }
+sub B::Asmdata::PUT_NV { sprintf("%s\0", $_[0]) } # "%lf" looses precision and pack('d',...)
+ # may not even be portable between compilers
+sub B::Asmdata::PUT_objindex { pack("L", $_[0]) } # could allow names here
sub B::Asmdata::PUT_svindex { &B::Asmdata::PUT_objindex }
sub B::Asmdata::PUT_opindex { &B::Asmdata::PUT_objindex }
+sub B::Asmdata::PUT_pvindex { &B::Asmdata::PUT_objindex }
sub B::Asmdata::PUT_strconst {
my $arg = shift;
@@ -79,7 +84,7 @@ sub B::Asmdata::PUT_PV {
my $arg = shift;
$arg = uncstring($arg);
error "bad string argument: $arg" unless defined($arg);
- return pack("N", length($arg)) . $arg;
+ return pack("L", length($arg)) . $arg;
}
sub B::Asmdata::PUT_comment_t {
my $arg = shift;
@@ -90,7 +95,7 @@ sub B::Asmdata::PUT_comment_t {
}
return $arg . "\n";
}
-sub B::Asmdata::PUT_double { sprintf("%s\0", $_[0]) }
+sub B::Asmdata::PUT_double { sprintf("%s\0", $_[0]) } # see PUT_NV above
sub B::Asmdata::PUT_none {
my $arg = shift;
error "extraneous argument: $arg" if defined $arg;
@@ -103,12 +108,12 @@ sub B::Asmdata::PUT_op_tr_array {
error "wrong number of arguments to op_tr_array";
@ary = (0) x 256;
}
- return pack("n256", @ary);
+ return pack("S256", @ary);
}
# XXX Check this works
sub B::Asmdata::PUT_IV64 {
my $arg = shift;
- return pack("NN", $arg >> 32, $arg & 0xffffffff);
+ return pack("LL", $arg >> 32, $arg & 0xffffffff);
}
my %unesc = (n => "\n", r => "\r", t => "\t", a => "\a",
@@ -138,6 +143,24 @@ sub strip_comments {
return $stmt;
}
+# create the ByteCode header: magic, archname, ByteLoader $VERSION, ivsize,
+# ptrsize, byteorder
+# nvtype is irrelevant (floats are stored as strings)
+# byteorder is strconst not U32 because of varying size issues
+
+sub gen_header {
+ my $header = "";
+
+ $header .= B::Asmdata::PUT_U32(0x43424c50); # 'PLBC'
+ $header .= B::Asmdata::PUT_strconst('"' . $Config{archname}. '"');
+ $header .= B::Asmdata::PUT_strconst(qq["$ByteLoader::VERSION"]);
+ $header .= B::Asmdata::PUT_U32($Config{ivsize});
+ $header .= B::Asmdata::PUT_U32($Config{ptrsize});
+ $header .= B::Asmdata::PUT_strconst(sprintf(qq["0x%s"], $Config{byteorder}));
+
+ $header;
+}
+
sub parse_statement {
my $stmt = shift;
my ($insn, $arg) = $stmt =~ m{
@@ -183,27 +206,52 @@ sub assemble_insn {
sub assemble_fh {
my ($fh, $out) = @_;
- my ($line, $insn, $arg);
- $linenum = 0;
- $errors = 0;
+ my $line;
+ my $asm = newasm($out);
while ($line = <$fh>) {
- $linenum++;
- chomp $line;
- if ($debug) {
- my $quotedline = $line;
- $quotedline =~ s/\\/\\\\/g;
- $quotedline =~ s/"/\\"/g;
- &$out(assemble_insn("comment", qq("$quotedline")));
- }
- $line = strip_comments($line) or next;
- ($insn, $arg) = parse_statement($line);
- &$out(assemble_insn($insn, $arg));
- if ($debug) {
- &$out(assemble_insn("nop", undef));
- }
+ assemble($line);
}
+ endasm();
+}
+
+sub newasm {
+ my($outsub) = @_;
+
+ die "Invalid printing routine for B::Assembler\n" unless ref $outsub eq 'CODE';
+ die <<EOD if ref $out;
+Can't have multiple byteassembly sessions at once!
+ (perhaps you forgot an endasm()?)
+EOD
+
+ $linenum = $errors = 0;
+ $out = $outsub;
+
+ $out->(gen_header());
+}
+
+sub endasm {
if ($errors) {
- die "Assembly failed with $errors error(s)\n";
+ die "There were $errors assembly errors\n";
+ }
+ $linenum = $errors = $out = 0;
+}
+
+sub assemble {
+ my($line) = @_;
+ my ($insn, $arg);
+ $linenum++;
+ chomp $line;
+ if ($debug) {
+ my $quotedline = $line;
+ $quotedline =~ s/\\/\\\\/g;
+ $quotedline =~ s/"/\\"/g;
+ $out->(assemble_insn("comment", qq("$quotedline")));
+ }
+ $line = strip_comments($line) or next;
+ ($insn, $arg) = parse_statement($line);
+ $out->(assemble_insn($insn, $arg));
+ if ($debug) {
+ $out->(assemble_insn("nop", undef));
}
}
@@ -217,14 +265,21 @@ B::Assembler - Assemble Perl bytecode
=head1 SYNOPSIS
- use Assembler;
+ use B::Assembler qw(newasm endasm assemble);
+ newasm(\&printsub); # sets up for assembly
+ assemble($buf); # assembles one line
+ endasm(); # closes down
+
+ use B::Assembler qw(assemble_fh);
+ assemble_fh($fh, \&printsub); # assemble everything in $fh
=head1 DESCRIPTION
See F<ext/B/B/Assembler.pm>.
-=head1 AUTHOR
+=head1 AUTHORS
Malcolm Beattie, C<mbeattie@sable.ox.ac.uk>
+Per-statement interface by Benjamin Stuhl, C<sho_pi@hotmail.com>
=cut
diff --git a/gnu/usr.bin/perl/ext/B/B/Bytecode.pm b/gnu/usr.bin/perl/ext/B/B/Bytecode.pm
index 27003b6bd0b..54d7c533c86 100644
--- a/gnu/usr.bin/perl/ext/B/B/Bytecode.pm
+++ b/gnu/usr.bin/perl/ext/B/B/Bytecode.pm
@@ -6,16 +6,18 @@
# License or the Artistic License, as specified in the README file.
#
package B::Bytecode;
+
use strict;
use Carp;
-use IO::File;
-
-use B qw(minus_c main_cv main_root main_start comppadlist
+use B qw(main_cv main_root main_start comppadlist
class peekop walkoptree svref_2object cstring walksymtable
- SVf_POK SVp_POK SVf_IOK SVp_IOK
+ init_av begin_av end_av
+ SVf_POK SVp_POK SVf_IOK SVp_IOK SVf_NOK SVp_NOK
+ SVf_READONLY GVf_IMPORTED_AV GVf_IMPORTED_CV GVf_IMPORTED_HV
+ GVf_IMPORTED_SV SVTYPEMASK
);
use B::Asmdata qw(@optype @specialsv_name);
-use B::Assembler qw(assemble_fh);
+use B::Assembler qw(newasm endasm assemble);
my %optype_enum;
my $i;
@@ -31,41 +33,76 @@ sub POK () { SVf_POK|SVp_POK }
# XXX Shouldn't be hardwired
sub IOK () { SVf_IOK|SVp_IOK }
-my ($verbose, $module_only, $no_assemble, $debug_bc, $debug_cv);
-my $assembler_pid;
+# Following is SVf_NOK|SVp_NOK
+# XXX Shouldn't be hardwired
+sub NOK () { SVf_NOK|SVp_NOK }
+
+# nonexistant flags (see B::GV::bytecode for usage)
+sub GVf_IMPORTED_IO () { 0; }
+sub GVf_IMPORTED_FORM () { 0; }
+
+my ($verbose, $no_assemble, $debug_bc, $debug_cv);
+my @packages; # list of packages to compile
+
+sub asm (@) { # print replacement that knows about assembling
+ if ($no_assemble) {
+ print @_;
+ } else {
+ my $buf = join '', @_;
+ assemble($_) for (split /\n/, $buf);
+ }
+}
+
+sub asmf (@) { # printf replacement that knows about assembling
+ if ($no_assemble) {
+ printf shift(), @_;
+ } else {
+ my $format = shift;
+ my $buf = sprintf $format, @_;
+ assemble($_) for (split /\n/, $buf);
+ }
+}
# Optimisation options. On the command line, use hyphens instead of
# underscores for compatibility with gcc-style options. We use
# underscores here because they are OK in (strict) barewords.
-my ($strip_syntree, $compress_nullops, $omit_seq, $bypass_nullops);
-my %optimise = (strip_syntax_tree => \$strip_syntree,
- compress_nullops => \$compress_nullops,
+my ($compress_nullops, $omit_seq, $bypass_nullops);
+my %optimise = (compress_nullops => \$compress_nullops,
omit_sequence_numbers => \$omit_seq,
bypass_nullops => \$bypass_nullops);
+my $strip_syntree; # this is left here in case stripping the
+ # syntree ever becomes safe again
+ # -- BKS, June 2000
+
my $nextix = 0;
my %symtable; # maps object addresses to object indices.
# Filled in at allocation (newsv/newop) time.
+
my %saved; # maps object addresses (for SVish classes) to "saved yet?"
# flag. Set at FOO::bytecode time usually by SV::bytecode.
# Manipulated via saved(), mark_saved(), unmark_saved().
+my %strtable; # maps shared strings to object indices
+ # Filled in at allocation (pvix) time
+
my $svix = -1; # we keep track of when the sv register contains an element
# of the object table to avoid unnecessary repeated
# consecutive ldsv instructions.
+
my $opix = -1; # Ditto for the op register.
sub ldsv {
my $ix = shift;
if ($ix != $svix) {
- print "ldsv $ix\n";
+ asm "ldsv $ix\n";
$svix = $ix;
}
}
sub stsv {
my $ix = shift;
- print "stsv $ix\n";
+ asm "stsv $ix\n";
$svix = $ix;
}
@@ -76,14 +113,14 @@ sub set_svix {
sub ldop {
my $ix = shift;
if ($ix != $opix) {
- print "ldop $ix\n";
+ asm "ldop $ix\n";
$opix = $ix;
}
}
sub stop {
my $ix = shift;
- print "stop $ix\n";
+ asm "stop $ix\n";
$opix = $ix;
}
@@ -100,12 +137,29 @@ sub pvstring {
}
}
+sub nv {
+ # print full precision
+ my $str = sprintf "%.40f", $_[0];
+ $str =~ s/0+$//; # remove trailing zeros
+ $str =~ s/\.$/.0/;
+ return $str;
+}
+
sub saved { $saved{${$_[0]}} }
sub mark_saved { $saved{${$_[0]}} = 1 }
sub unmark_saved { $saved{${$_[0]}} = 0 }
sub debug { $debug_bc = shift }
+sub pvix { # save a shared PV (mainly for COPs)
+ return $strtable{$_[0]} if defined($strtable{$_[0]});
+ asmf "newpv %s\n", pvstring($_[0]);
+ my $ix = $nextix++;
+ $strtable{$_[0]} = $ix;
+ asmf "stpv %d\n", $ix;
+ return $ix;
+}
+
sub B::OBJECT::nyi {
my $obj = shift;
warn sprintf("bytecode save method for %s (0x%x) not yet implemented\n",
@@ -129,7 +183,7 @@ sub B::OBJECT::objix {
sub B::SV::newix {
my ($sv, $ix) = @_;
- printf "newsv %d\t# %s\n", $sv->FLAGS & 0xf, class($sv);
+ asmf "newsv %d\t# %s\n", $sv->FLAGS & SVTYPEMASK, class($sv);
stsv($ix);
}
@@ -137,7 +191,7 @@ sub B::GV::newix {
my ($gv, $ix) = @_;
my $gvname = $gv->NAME;
my $name = cstring($gv->STASH->NAME . "::" . $gvname);
- print "gv_fetchpv $name\n";
+ asm "gv_fetchpv $name\n";
stsv($ix);
}
@@ -146,7 +200,7 @@ sub B::HV::newix {
my $name = $hv->NAME;
if ($name) {
# It's a stash
- printf "gv_stashpv %s\n", cstring($name);
+ asmf "gv_stashpv %s\n", cstring($name);
stsv($ix);
} else {
# It's an ordinary HV. Fall back to ordinary newix method
@@ -158,7 +212,7 @@ sub B::SPECIAL::newix {
my ($sv, $ix) = @_;
# Special case. $$sv is not the address of the SV but an
# index into svspecialsv_list.
- printf "ldspecsv $$sv\t# %s\n", $specialsv_name[$$sv];
+ asmf "ldspecsv $$sv\t# %s\n", $specialsv_name[$$sv];
stsv($ix);
}
@@ -166,8 +220,8 @@ sub B::OP::newix {
my ($op, $ix) = @_;
my $class = class($op);
my $typenum = $optype_enum{$class};
- croak "OP::newix: can't understand class $class" unless defined($typenum);
- print "newop $typenum\t# $class\n";
+ croak("OP::newix: can't understand class $class") unless defined($typenum);
+ asm "newop $typenum\t# $class\n";
stop($ix);
}
@@ -180,7 +234,7 @@ sub B::OP::bytecode {
my $op = shift;
my $next = $op->next;
my $nextix;
- my $sibix = $op->sibling->objix;
+ my $sibix = $op->sibling->objix unless $strip_syntree;
my $ix = $op->objix;
my $type = $op->type;
@@ -189,24 +243,24 @@ sub B::OP::bytecode {
}
$nextix = $next->objix;
- printf "# %s\n", peekop($op) if $debug_bc;
+ asmf "# %s\n", peekop($op) if $debug_bc;
ldop($ix);
- print "op_next $nextix\n";
- print "op_sibling $sibix\n" unless $strip_syntree;
- printf "op_type %s\t# %d\n", "pp_" . $op->name, $type;
- printf("op_seq %d\n", $op->seq) unless $omit_seq;
+ asm "op_next $nextix\n";
+ asm "op_sibling $sibix\n" unless $strip_syntree;
+ asmf "op_type %s\t# %d\n", "pp_" . $op->name, $type;
+ asmf("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",
+ asmf "op_targ %d\nop_flags 0x%x\nop_private 0x%x\n",
$op->targ, $op->flags, $op->private;
}
}
sub B::UNOP::bytecode {
my $op = shift;
- my $firstix = $op->first->objix;
+ my $firstix = $op->first->objix unless $strip_syntree;
$op->B::OP::bytecode;
if (($op->type || !$compress_nullops) && !$strip_syntree) {
- print "op_first $firstix\n";
+ asm "op_first $firstix\n";
}
}
@@ -214,7 +268,7 @@ sub B::LOGOP::bytecode {
my $op = shift;
my $otherix = $op->other->objix;
$op->B::UNOP::bytecode;
- print "op_other $otherix\n";
+ asm "op_other $otherix\n";
}
sub B::SVOP::bytecode {
@@ -222,7 +276,7 @@ sub B::SVOP::bytecode {
my $sv = $op->sv;
my $svix = $sv->objix;
$op->B::OP::bytecode;
- print "op_sv $svix\n";
+ asm "op_sv $svix\n";
$sv->bytecode;
}
@@ -230,7 +284,7 @@ sub B::PADOP::bytecode {
my $op = shift;
my $padix = $op->padix;
$op->B::OP::bytecode;
- print "op_padix $padix\n";
+ asm "op_padix $padix\n";
}
sub B::PVOP::bytecode {
@@ -243,27 +297,18 @@ sub B::PVOP::bytecode {
#
if ($op->name eq "trans") {
my @shorts = unpack("s256", $pv); # assembler handles endianness
- print "op_pv_tr ", join(",", @shorts), "\n";
+ asm "op_pv_tr ", join(",", @shorts), "\n";
} else {
- printf "newpv %s\nop_pv\n", pvstring($pv);
+ asmf "newpv %s\nop_pv\n", pvstring($pv);
}
}
sub B::BINOP::bytecode {
my $op = shift;
- my $lastix = $op->last->objix;
+ my $lastix = $op->last->objix unless $strip_syntree;
$op->B::UNOP::bytecode;
if (($op->type || !$compress_nullops) && !$strip_syntree) {
- print "op_last $lastix\n";
- }
-}
-
-sub B::LISTOP::bytecode {
- my $op = shift;
- my $children = $op->children;
- $op->B::BINOP::bytecode;
- if (($op->type || !$compress_nullops) && !$strip_syntree) {
- print "op_children $children\n";
+ asm "op_last $lastix\n";
}
}
@@ -273,28 +318,29 @@ sub B::LOOP::bytecode {
my $nextopix = $op->nextop->objix;
my $lastopix = $op->lastop->objix;
$op->B::LISTOP::bytecode;
- print "op_redoop $redoopix\nop_nextop $nextopix\nop_lastop $lastopix\n";
+ asm "op_redoop $redoopix\nop_nextop $nextopix\nop_lastop $lastopix\n";
}
sub B::COP::bytecode {
my $op = shift;
- my $stashpv = $op->stashpv;
my $file = $op->file;
my $line = $op->line;
+ if ($debug_bc) { # do this early to aid debugging
+ asmf "# line %s:%d\n", $file, $line;
+ }
+ my $stashpv = $op->stashpv;
my $warnings = $op->warnings;
my $warningsix = $warnings->objix;
- if ($debug_bc) {
- printf "# line %s:%d\n", $file, $line;
- }
+ my $labelix = pvix($op->label);
+ my $stashix = pvix($stashpv);
+ my $fileix = pvix($file);
+ $warnings->bytecode;
$op->B::OP::bytecode;
- printf <<"EOT", pvstring($op->label), pvstring($stashpv), $op->cop_seq, pvstring($file), $op->arybase;
-newpv %s
-cop_label
-newpv %s
-cop_stashpv
+ asmf <<"EOT", $labelix, $stashix, $op->cop_seq, $fileix, $op->arybase;
+cop_label %d
+cop_stashpv %d
cop_seq %d
-newpv %s
-cop_file
+cop_file %d
cop_arybase %d
cop_line $line
cop_warnings $warningsix
@@ -322,13 +368,13 @@ sub B::PMOP::bytecode {
}
$op->B::LISTOP::bytecode;
if ($opname eq "pushre") {
- printf "op_pmreplrootgv $replrootix\n";
+ asmf "op_pmreplrootgv $replrootix\n";
} else {
- print "op_pmreplroot $replrootix\nop_pmreplstart $replstartix\n";
+ asm "op_pmreplroot $replrootix\nop_pmreplstart $replstartix\n";
}
my $re = pvstring($op->precomp);
# op_pmnext omitted since a perl bug means it's sometime corrupt
- printf <<"EOT", $op->pmflags, $op->pmpermflags;
+ asmf <<"EOT", $op->pmflags, $op->pmpermflags;
op_pmflags 0x%x
op_pmpermflags 0x%x
newpv $re
@@ -343,7 +389,7 @@ sub B::SV::bytecode {
my $refcnt = $sv->REFCNT;
my $flags = sprintf("0x%x", $sv->FLAGS);
ldsv($ix);
- print "sv_refcnt $refcnt\nsv_flags $flags\n";
+ asm "sv_refcnt $refcnt\nsv_flags $flags\n";
mark_saved($sv);
}
@@ -351,7 +397,7 @@ sub B::PV::bytecode {
my $sv = shift;
return if saved($sv);
$sv->B::SV::bytecode;
- printf("newpv %s\nxpv\n", pvstring($sv->PV)) if $sv->FLAGS & POK;
+ asmf("newpv %s\nxpv\n", pvstring($sv->PV)) if $sv->FLAGS & POK;
}
sub B::IV::bytecode {
@@ -359,14 +405,14 @@ sub B::IV::bytecode {
return if saved($sv);
my $iv = $sv->IVX;
$sv->B::SV::bytecode;
- printf "%s $iv\n", $sv->needs64bits ? "xiv64" : "xiv32";
+ asmf "%s $iv\n", $sv->needs64bits ? "xiv64" : "xiv32" if $sv->FLAGS & IOK; # could be PVNV
}
sub B::NV::bytecode {
my $sv = shift;
return if saved($sv);
$sv->B::SV::bytecode;
- printf "xnv %s\n", $sv->NVX;
+ asmf "xnv %s\n", nv($sv->NVX);
}
sub B::RV::bytecode {
@@ -376,7 +422,7 @@ sub B::RV::bytecode {
my $rvix = $rv->objix;
$rv->bytecode;
$sv->B::SV::bytecode;
- print "xrv $rvix\n";
+ asm "xrv $rvix\n";
}
sub B::PVIV::bytecode {
@@ -384,7 +430,7 @@ sub B::PVIV::bytecode {
return if saved($sv);
my $iv = $sv->IVX;
$sv->B::PV::bytecode;
- printf "%s $iv\n", $sv->needs64bits ? "xiv64" : "xiv32";
+ asmf "%s $iv\n", $sv->needs64bits ? "xiv64" : "xiv32";
}
sub B::PVNV::bytecode {
@@ -404,12 +450,12 @@ sub B::PVNV::bytecode {
} else {
my $pv = $sv->PV;
$sv->B::IV::bytecode;
- printf "xnv %s\n", $sv->NVX;
+ asmf "xnv %s\n", nv($sv->NVX);
if ($flag == 1) {
$pv .= "\0" . $sv->TABLE;
- printf "newpv %s\npv_cur %d\nxpv\n", pvstring($pv),length($pv)-257;
+ asmf "newpv %s\npv_cur %d\nxpv\n", pvstring($pv),length($pv)-257;
} else {
- printf("newpv %s\nxpv\n", pvstring($pv)) if $sv->FLAGS & POK;
+ asmf("newpv %s\nxpv\n", pvstring($pv)) if $sv->FLAGS & POK;
}
}
}
@@ -431,9 +477,9 @@ sub B::PVMG::bytecode {
#
@mgobjix = map($_->OBJ->objix, @mgchain);
$sv->B::PVNV::bytecode($flag);
- print "xmg_stash $stashix\n";
+ asm "xmg_stash $stashix\n";
foreach $mg (@mgchain) {
- printf "sv_magic %s\nmg_obj %d\nnewpv %s\nmg_pv\n",
+ asmf "sv_magic %s\nmg_obj %d\nnewpv %s\nmg_pv\n",
cstring($mg->TYPE), shift(@mgobjix), pvstring($mg->PTR);
}
}
@@ -442,7 +488,7 @@ sub B::PVLV::bytecode {
my $sv = shift;
return if saved($sv);
$sv->B::PVMG::bytecode;
- printf <<'EOT', $sv->TARGOFF, $sv->TARGLEN, cstring($sv->TYPE);
+ asmf <<'EOT', $sv->TARGOFF, $sv->TARGLEN, cstring($sv->TYPE);
xlv_targoff %d
xlv_targlen %d
xlv_type %s
@@ -454,46 +500,63 @@ sub B::BM::bytecode {
return if saved($sv);
# See PVNV::bytecode for an explanation of what the argument does
$sv->B::PVMG::bytecode(1);
- printf "xbm_useful %d\nxbm_previous %d\nxbm_rare %d\n",
+ asmf "xbm_useful %d\nxbm_previous %d\nxbm_rare %d\n",
$sv->USEFUL, $sv->PREVIOUS, $sv->RARE;
}
+sub empty_gv { # is a GV empty except for imported stuff?
+ my $gv = shift;
+
+ return 0 if ($gv->SV->FLAGS & SVTYPEMASK); # sv not SVt_NULL
+ my @subfield_names = qw(AV HV CV FORM IO);
+ @subfield_names = grep {;
+ no strict 'refs';
+ !($gv->GvFLAGS & ${\"GVf_IMPORTED_$_"}->()) && ${$gv->$_()};
+ } @subfield_names;
+ return scalar @subfield_names;
+}
+
sub B::GV::bytecode {
my $gv = shift;
return if saved($gv);
+ return unless grep { $_ eq $gv->STASH->NAME; } @packages;
+ return if $gv->NAME =~ m/^\(/; # ignore overloads - they'll be rebuilt
my $ix = $gv->objix;
mark_saved($gv);
ldsv($ix);
- printf <<"EOT", $gv->FLAGS, $gv->GvFLAGS;
+ asmf <<"EOT", $gv->FLAGS, $gv->GvFLAGS;
sv_flags 0x%x
xgv_flags 0x%x
EOT
my $refcnt = $gv->REFCNT;
- printf("sv_refcnt_add %d\n", $refcnt - 1) if $refcnt > 1;
+ asmf("sv_refcnt_add %d\n", $refcnt - 1) if $refcnt > 1;
return if $gv->is_empty;
- printf <<"EOT", $gv->LINE, pvstring($gv->FILE);
+ asmf <<"EOT", $gv->LINE, pvix($gv->FILE);
gp_line %d
-newpv %s
-gp_file
+gp_file %d
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;
+ asmf("gp_refcnt_add %d\n", $gvrefcnt - 1) if $gvrefcnt > 1;
if ($gvrefcnt > 1 && $ix != $egvix) {
- print "gp_share $egvix\n";
+ asm "gp_share $egvix\n";
} else {
if ($gvname !~ /^([^A-Za-z]|STDIN|STDOUT|STDERR|ARGV|SIG|ENV)$/) {
my $i;
my @subfield_names = qw(SV AV HV CV FORM IO);
+ @subfield_names = grep {;
+ no strict 'refs';
+ !($gv->GvFLAGS & ${\"GVf_IMPORTED_$_"}->());
+ } @subfield_names;
my @subfields = map($gv->$_(), @subfield_names);
my @ixes = map($_->objix, @subfields);
# Reset sv register for $gv
ldsv($ix);
for ($i = 0; $i < @ixes; $i++) {
- printf "gp_%s %d\n", lc($subfield_names[$i]), $ixes[$i];
+ asmf "gp_%s %d\n", lc($subfield_names[$i]), $ixes[$i];
}
# Now save all the subfields
my $sv;
@@ -523,10 +586,10 @@ sub B::HV::bytecode {
}
ldsv($ix);
for ($i = 0; $i < @contents; $i += 2) {
- printf("newpv %s\nhv_store %d\n",
+ asmf("newpv %s\nhv_store %d\n",
pvstring($contents[$i]), $ixes[$i / 2]);
}
- printf "sv_refcnt %d\nsv_flags 0x%x\n", $hv->REFCNT, $hv->FLAGS;
+ asmf "sv_refcnt %d\nsv_flags 0x%x\n", $hv->REFCNT, $hv->FLAGS;
}
}
@@ -551,22 +614,26 @@ sub B::AV::bytecode {
# create an AV with NEWSV and SvUPGRADE rather than doing newAV
# which is what sets AvMAX and AvFILL.
ldsv($ix);
- printf "xav_flags 0x%x\nxav_max -1\nxav_fill -1\n", $av->AvFLAGS;
+ asmf "sv_flags 0x%x\n", $av->FLAGS & ~SVf_READONLY; # SvREADONLY_off($av) in case PADCONST
+ asmf "xav_flags 0x%x\nxav_max -1\nxav_fill -1\n", $av->AvFLAGS;
if ($fill > -1) {
my $elix;
foreach $elix (@ixes) {
- print "av_push $elix\n";
+ asm "av_push $elix\n";
}
} else {
if ($max > -1) {
- print "av_extend $max\n";
+ asm "av_extend $max\n";
}
}
+ asmf "sv_flags 0x%x\n", $av->FLAGS; # restore flags from above
}
sub B::CV::bytecode {
my $cv = shift;
return if saved($cv);
+ return if ${$cv->GV} && ($cv->GV->GvFLAGS & GVf_IMPORTED_CV);
+ my $fileix = pvix($cv->FILE);
my $ix = $cv->objix;
$cv->B::PVMG::bytecode;
my $i;
@@ -581,10 +648,10 @@ sub B::CV::bytecode {
# Reset sv register for $cv (since above ->objix calls stomped on it)
ldsv($ix);
for ($i = 0; $i < @ixes; $i++) {
- printf "xcv_%s %d\n", lc($subfield_names[$i]), $ixes[$i];
+ asmf "xcv_%s %d\n", lc($subfield_names[$i]), $ixes[$i];
}
- printf "xcv_depth %d\nxcv_flags 0x%x\n", $cv->DEPTH, $cv->CvFLAGS;
- printf "newpv %s\nxcv_file\n", pvstring($cv->FILE);
+ asmf "xcv_depth %d\nxcv_flags 0x%x\n", $cv->DEPTH, $cv->CvFLAGS;
+ asmf "xcv_file %d\n", $fileix;
# 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
@@ -607,17 +674,17 @@ sub B::IO::bytecode {
$io->B::PVMG::bytecode;
ldsv($ix);
- print "xio_top_gv $top_gvix\n";
- print "xio_fmt_gv $fmt_gvix\n";
- print "xio_bottom_gv $bottom_gvix\n";
+ asm "xio_top_gv $top_gvix\n";
+ asm "xio_fmt_gv $fmt_gvix\n";
+ asm "xio_bottom_gv $bottom_gvix\n";
my $field;
foreach $field (qw(TOP_NAME FMT_NAME BOTTOM_NAME)) {
- printf "newpv %s\nxio_%s\n", pvstring($io->$field()), lc($field);
+ asmf "newpv %s\nxio_%s\n", pvstring($io->$field()), lc($field);
}
foreach $field (qw(LINES PAGE PAGE_LEN LINES_LEFT SUBPROCESS)) {
- printf "xio_%s %d\n", lc($field), $io->$field();
+ asmf "xio_%s %d\n", lc($field), $io->$field();
}
- printf "xio_type %s\nxio_flags 0x%x\n", cstring($io->IoTYPE), $io->IoFLAGS;
+ asmf "xio_type %s\nxio_flags 0x%x\n", cstring($io->IoTYPE), $io->IoFLAGS;
$top_gv->bytecode;
$fmt_gv->bytecode;
$bottom_gv->bytecode;
@@ -628,8 +695,7 @@ sub B::SPECIAL::bytecode {
}
sub bytecompile_object {
- my $sv;
- foreach $sv (@_) {
+ for my $sv (@_) {
svref_2object($sv)->bytecode;
}
}
@@ -637,7 +703,7 @@ sub bytecompile_object {
sub B::GV::bytecodecv {
my $gv = shift;
my $cv = $gv->CV;
- if ($$cv && !saved($cv)) {
+ if ($$cv && !saved($cv) && !($gv->FLAGS & GVf_IMPORTED_CV)) {
if ($debug_cv) {
warn sprintf("saving extra CV &%s::%s (0x%x) from GV 0x%x\n",
$gv->STASH->NAME, $gv->NAME, $$cv, $$gv);
@@ -646,43 +712,66 @@ sub B::GV::bytecodecv {
}
}
-sub bytecompile_main {
- my $curpad = (comppadlist->ARRAY)[1];
- my $curpadix = $curpad->objix;
- $curpad->bytecode;
- 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 XSLoader Config DB VMS strict vars
- FileHandle Exporter Carp UNIVERSAL IO Fcntl Symbol
- SelectSaver blib Cwd))
- {
- $exclude{$pack."::"} = 1;
+sub save_call_queues {
+ if (begin_av()->isa("B::AV")) { # this is just to save 'use Foo;' calls
+ for my $cv (begin_av()->ARRAY) {
+ next unless grep { $_ eq $cv->STASH->NAME; } @packages;
+ my $op = $cv->START;
+OPLOOP:
+ while ($$op) {
+ if ($op->name eq 'require') { # save any BEGIN that does a require
+ $cv->bytecode;
+ asmf "push_begin %d\n", $cv->objix;
+ last OPLOOP;
+ }
+ $op = $op->next;
+ }
+ }
+ }
+ if (init_av()->isa("B::AV")) {
+ for my $cv (init_av()->ARRAY) {
+ next unless grep { $_ eq $cv->STASH->NAME; } @packages;
+ $cv->bytecode;
+ asmf "push_init %d\n", $cv->objix;
+ }
}
- no strict qw(vars refs);
- walksymtable(\%{"main::"}, "bytecodecv", sub {
- warn "considering $_[0]\n" if $debug_bc;
- return !defined($exclude{$_[0]});
- });
- if (!$module_only) {
- printf "main_root %d\n", main_root->objix;
- printf "main_start %d\n", main_start->objix;
- printf "curpad $curpadix\n";
- # XXX Do min_intro_pending and max_intro_pending matter?
+ if (end_av()->isa("B::AV")) {
+ for my $cv (end_av()->ARRAY) {
+ next unless grep { $_ eq $cv->STASH->NAME; } @packages;
+ $cv->bytecode;
+ asmf "push_end %d\n", $cv->objix;
+ }
}
}
-sub prepare_assemble {
- my $newfh = IO::File->new_tmpfile;
- select($newfh);
- binmode $newfh;
- return $newfh;
+sub symwalk {
+ no strict 'refs';
+ my $ok = 1 if grep { (my $name = $_[0]) =~ s/::$//; $_ eq $name;} @packages;
+ if (grep { /^$_[0]/; } @packages) {
+ walksymtable(\%{"$_[0]"}, "bytecodecv", \&symwalk, $_[0]);
+ }
+ warn "considering $_[0] ... " . ($ok ? "accepted\n" : "rejected\n")
+ if $debug_bc;
+ $ok;
}
-sub do_assemble {
- my $fh = shift;
- seek($fh, 0, 0); # rewind the temporary file
- assemble_fh($fh, sub { print OUT @_ });
+sub bytecompile_main {
+ my $curpad = (comppadlist->ARRAY)[1];
+ my $curpadix = $curpad->objix;
+ $curpad->bytecode;
+ save_call_queues();
+ walkoptree(main_root, "bytecode") unless ref(main_root) eq "B::NULL";
+ warn "done main program, now walking symbol table\n" if $debug_bc;
+ if (@packages) {
+ no strict qw(refs);
+ walksymtable(\%{"main::"}, "bytecodecv", \&symwalk);
+ } else {
+ die "No packages requested for compilation!\n";
+ }
+ asmf "main_root %d\n", main_root->objix;
+ asmf "main_start %d\n", main_start->objix;
+ asmf "curpad $curpadix\n";
+ # XXX Do min_intro_pending and max_intro_pending matter?
}
sub compile {
@@ -690,7 +779,7 @@ sub compile {
my ($option, $opt, $arg);
open(OUT, ">&STDOUT");
binmode OUT;
- select(OUT);
+ select OUT;
OPTION:
while ($option = shift @options) {
if ($option =~ /^-(.)(.*)/) {
@@ -727,8 +816,6 @@ sub compile {
}
} elsif ($opt eq "v") {
$verbose = 1;
- } elsif ($opt eq "m") {
- $module_only = 1;
} elsif ($opt eq "S") {
$no_assemble = 1;
} elsif ($opt eq "f") {
@@ -747,9 +834,6 @@ sub compile {
foreach $ref (values %optimise) {
$$ref = 0;
}
- if ($arg >= 6) {
- $strip_syntree = 1;
- }
if ($arg >= 2) {
$bypass_nullops = 1;
}
@@ -757,28 +841,30 @@ sub compile {
$compress_nullops = 1;
$omit_seq = 1;
}
+ } elsif ($opt eq "u") {
+ $arg ||= shift @options;
+ push @packages, $arg;
+ } else {
+ warn qq(ignoring unknown option "$opt$arg"\n);
}
}
+ if (! @packages) {
+ warn "No package specified for compilation, assuming main::\n";
+ @packages = qw(main);
+ }
if (@options) {
- return sub {
- my $objname;
- my $newfh;
- $newfh = prepare_assemble() unless $no_assemble;
- foreach $objname (@options) {
- eval "bytecompile_object(\\$objname)";
- }
- do_assemble($newfh) unless $no_assemble;
- }
+ die "Extraneous options left on B::Bytecode commandline: @options\n";
} else {
- return sub {
- my $newfh;
- $newfh = prepare_assemble() unless $no_assemble;
+ return sub {
+ newasm(\&apr) unless $no_assemble;
bytecompile_main();
- do_assemble($newfh) unless $no_assemble;
- }
+ endasm() unless $no_assemble;
+ };
}
}
+sub apr { print @_; }
+
1;
__END__
@@ -848,18 +934,11 @@ which is only used by perl's internal compiler.
If op->op_next ever points to a NULLOP, replaces the op_next field
with the first non-NULLOP in the path of execution.
-=item B<-fstrip-syntax-tree>
-
-Leaves out code to fill in the pointers which link the internal syntax
-tree together. They're not needed at run-time but leaving them out
-will make it impossible to recompile or disassemble the resulting
-program. It will also stop C<goto label> statements from working.
-
=item B<-On>
Optimisation level (n = 0, 1, 2, ...). B<-O> means B<-O1>.
B<-O1> sets B<-fcompress-nullops> B<-fomit-sequence numbers>.
-B<-O6> adds B<-fstrip-syntax-tree>.
+B<-O2> adds B<-fbypass-nullops>.
=item B<-D>
@@ -887,33 +966,33 @@ Prints each CV taken from the final symbol tree walk.
Output (bytecode) assembler source rather than piping it
through the assembler and outputting bytecode.
-=item B<-m>
-
-Compile as a module rather than a standalone program. Currently this
-just means that the bytecodes for initialising C<main_start>,
-C<main_root> and C<curpad> are omitted.
-
+=item B<-upackage>
+
+Stores package in the output.
+
=back
=head1 EXAMPLES
- perl -MO=Bytecode,-O6,-o,foo.plc foo.pl
+ perl -MO=Bytecode,-O6,-ofoo.plc,-umain foo.pl
- perl -MO=Bytecode,-S foo.pl > foo.S
+ perl -MO=Bytecode,-S,-umain foo.pl > foo.S
assemble foo.S > foo.plc
Note that C<assemble> lives in the C<B> subdirectory of your perl
library directory. The utility called perlcc may also be used to
help make use of this compiler.
- perl -MO=Bytecode,-m,-oFoo.pmc Foo.pm
+ perl -MO=Bytecode,-uFoo,-oFoo.pmc Foo.pm
=head1 BUGS
-Plenty. Current status: experimental.
+Output is still huge and there are still occasional crashes during
+either compilation or ByteLoading. Current status: experimental.
-=head1 AUTHOR
+=head1 AUTHORS
Malcolm Beattie, C<mbeattie@sable.ox.ac.uk>
+Benjamin Stuhl, C<sho_pi@hotmail.com>
=cut
diff --git a/gnu/usr.bin/perl/ext/B/B/C.pm b/gnu/usr.bin/perl/ext/B/B/C.pm
index d0c8159d9f3..4befe7988ba 100644
--- a/gnu/usr.bin/perl/ext/B/B/C.pm
+++ b/gnu/usr.bin/perl/ext/B/B/C.pm
@@ -225,11 +225,10 @@ sub B::LISTOP::save {
my ($op, $level) = @_;
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",
+ $listopsect->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},
- $op->children));
+ $op->private, ${$op->first}, ${$op->last}));
my $ix = $listopsect->index;
$init->add(sprintf("listop_list[$ix].op_ppaddr = %s;", $op->ppaddr));
savesym($op, "(OP*)&listop_list[$ix]");
@@ -255,11 +254,11 @@ sub B::LOOP::save {
#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, NULL, %u, %u, %u, 0x%x, 0x%x, s\\_%x, s\\_%x, %u, s\\_%x, s\\_%x, s\\_%x",
+ $loopsect->add(sprintf("s\\_%x, s\\_%x, NULL, %u, %u, %u, 0x%x, 0x%x, s\\_%x, s\\_%x, 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->redoop}, ${$op->nextop},
${$op->lastop}));
my $ix = $loopsect->index;
$init->add(sprintf("loop_list[$ix].op_ppaddr = %s;", $op->ppaddr));
@@ -351,10 +350,10 @@ 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, NULL, %u, %u, %u, 0x%x, 0x%x, s\\_%x, s\\_%x, %u, %s, %s, 0, 0, 0x%x, 0x%x",
+ $pmopsect->add(sprintf("s\\_%x, s\\_%x, NULL, %u, %u, %u, 0x%x, 0x%x, s\\_%x, s\\_%x, %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,
+ ${$op->first}, ${$op->last},
$replrootfield, $replstartfield,
$op->pmflags, $op->pmpermflags,));
my $pm = sprintf("pmop_list[%d]", $pmopsect->index);
@@ -1020,9 +1019,8 @@ sub output_all {
print <<"EOT";
static int $init_name()
{
- dTHR;
dTARG;
- djSP;
+ dSP;
EOT
$init->output(\*STDOUT, "\t%s\n");
print "\treturn 0;\n}\n";
@@ -1050,15 +1048,15 @@ typedef struct {
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*);
- void * xcv_xsubany;
+ void (*xcv_xsub) (pTHXo_ CV*);
+ ANY xcv_xsubany;
GV * xcv_gv;
char * xcv_file;
long xcv_depth; /* >= 2 indicates recursive call */
@@ -1174,7 +1172,7 @@ xs_init(pTHX)
{
char *file = __FILE__;
dTARG;
- djSP;
+ dSP;
EOT
print "\n#ifdef USE_DYNAMIC_LOADING";
print qq/\n\tnewXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);/;
@@ -1210,7 +1208,7 @@ dl_init(pTHX)
{
char *file = __FILE__;
dTARG;
- djSP;
+ dSP;
EOT
print("/* Dynamicboot strapping code*/\n\tSAVETMPS;\n");
print("\ttarg=sv_newmortal();\n");
@@ -1338,7 +1336,7 @@ sub should_save
# 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))
+ if (UNIVERSAL::can($package, $m))
{
warn "$package has method $m: saving package\n";#debug
return mark_package($package);
@@ -1368,7 +1366,7 @@ sub walkpackages
if ($sym =~ /::$/)
{
$sym = $prefix . $sym;
- if ($sym ne "main::" && &$recurse($sym))
+ if ($sym ne "main::" && $sym ne "<none>::" && &$recurse($sym))
{
walkpackages(\%glob, $recurse, $sym);
}
diff --git a/gnu/usr.bin/perl/ext/B/B/CC.pm b/gnu/usr.bin/perl/ext/B/B/CC.pm
index c5ca2a3df5b..51922eeb2b2 100644
--- a/gnu/usr.bin/perl/ext/B/B/CC.pm
+++ b/gnu/usr.bin/perl/ext/B/B/CC.pm
@@ -151,7 +151,7 @@ sub init_pp {
$ppname = shift;
$runtime_list_ref = [];
$declare_ref = {};
- runtime("djSP;");
+ runtime("dSP;");
declare("I32", "oldsave");
declare("SV", "**svp");
map { declare("SV", "*$_") } qw(sv src dst left right);
diff --git a/gnu/usr.bin/perl/ext/B/B/Concise.pm b/gnu/usr.bin/perl/ext/B/B/Concise.pm
new file mode 100644
index 00000000000..cb352ebf1cd
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/B/B/Concise.pm
@@ -0,0 +1,823 @@
+package B::Concise;
+# Copyright (C) 2000, 2001 Stephen McCamant. All rights reserved.
+# This program is free software; you can redistribute and/or modify it
+# under the same terms as Perl itself.
+
+our $VERSION = "0.51";
+use strict;
+use B qw(class ppname main_start main_root main_cv cstring svref_2object
+ SVf_IOK SVf_NOK SVf_POK OPf_KIDS);
+
+my %style =
+ ("terse" =>
+ ["(?(#label =>\n)?)(*( )*)#class (#addr) #name (?([#targ])?) "
+ . "#svclass~(?((#svaddr))?)~#svval~(?(label \"#coplabel\")?)\n",
+ "(*( )*)goto #class (#addr)\n",
+ "#class pp_#name"],
+ "concise" =>
+ ["#hyphseq2 (*( (x( ;)x))*)<#classsym> "
+ . "#exname#arg(?([#targarglife])?)~#flags(?(/#private)?)(x(;~->#next)x)\n",
+ " (*( )*) goto #seq\n",
+ "(?(<#seq>)?)#exname#arg(?([#targarglife])?)"],
+ "linenoise" =>
+ ["(x(;(*( )*))x)#noise#arg(?([#targarg])?)(x( ;\n)x)",
+ "gt_#seq ",
+ "(?(#seq)?)#noise#arg(?([#targarg])?)"],
+ "debug" =>
+ ["#class (#addr)\n\top_next\t\t#nextaddr\n\top_sibling\t#sibaddr\n\t"
+ . "op_ppaddr\tPL_ppaddr[OP_#NAME]\n\top_type\t\t#typenum\n\top_seq\t\t"
+ . "#seqnum\n\top_flags\t#flagval\n\top_private\t#privval\n"
+ . "(?(\top_first\t#firstaddr\n)?)(?(\top_last\t\t#lastaddr\n)?)"
+ . "(?(\top_sv\t\t#svaddr\n)?)",
+ " GOTO #addr\n",
+ "#addr"],
+ "env" => [$ENV{B_CONCISE_FORMAT}, $ENV{B_CONCISE_GOTO_FORMAT},
+ $ENV{B_CONCISE_TREE_FORMAT}],
+ );
+
+my($format, $gotofmt, $treefmt);
+my $curcv;
+my($seq_base, $cop_seq_base);
+
+sub concise_cv {
+ my ($order, $cvref) = @_;
+ my $cv = svref_2object($cvref);
+ $curcv = $cv;
+ if ($order eq "exec") {
+ walk_exec($cv->START);
+ } elsif ($order eq "basic") {
+ walk_topdown($cv->ROOT, sub { $_[0]->concise($_[1]) }, 0);
+ } else {
+ print tree($cv->ROOT, 0)
+ }
+}
+
+my $start_sym = "\e(0"; # "\cN" sometimes also works
+my $end_sym = "\e(B"; # "\cO" respectively
+
+my @tree_decorations =
+ ([" ", "--", "+-", "|-", "| ", "`-", "-", 1],
+ [" ", "-", "+", "+", "|", "`", "", 0],
+ [" ", map("$start_sym$_$end_sym", "qq", "wq", "tq", "x ", "mq", "q"), 1],
+ [" ", map("$start_sym$_$end_sym", "q", "w", "t", "x", "m"), "", 0],
+ );
+my $tree_style = 0;
+
+my $base = 36;
+my $big_endian = 1;
+
+my $order = "basic";
+
+sub compile {
+ my @options = grep(/^-/, @_);
+ my @args = grep(!/^-/, @_);
+ my $do_main = 0;
+ ($format, $gotofmt, $treefmt) = @{$style{"concise"}};
+ for my $o (@options) {
+ if ($o eq "-basic") {
+ $order = "basic";
+ } elsif ($o eq "-exec") {
+ $order = "exec";
+ } elsif ($o eq "-tree") {
+ $order = "tree";
+ } elsif ($o eq "-compact") {
+ $tree_style |= 1;
+ } elsif ($o eq "-loose") {
+ $tree_style &= ~1;
+ } elsif ($o eq "-vt") {
+ $tree_style |= 2;
+ } elsif ($o eq "-ascii") {
+ $tree_style &= ~2;
+ } elsif ($o eq "-main") {
+ $do_main = 1;
+ } elsif ($o =~ /^-base(\d+)$/) {
+ $base = $1;
+ } elsif ($o eq "-bigendian") {
+ $big_endian = 1;
+ } elsif ($o eq "-littleendian") {
+ $big_endian = 0;
+ } elsif (exists $style{substr($o, 1)}) {
+ ($format, $gotofmt, $treefmt) = @{$style{substr($o, 1)}};
+ } else {
+ warn "Option $o unrecognized";
+ }
+ }
+ if (@args) {
+ return sub {
+ for my $objname (@args) {
+ $objname = "main::" . $objname unless $objname =~ /::/;
+ eval "concise_cv(\$order, \\&$objname)";
+ die "concise_cv($order, \\&$objname) failed: $@" if $@;
+ }
+ }
+ }
+ if (!@args or $do_main) {
+ if ($order eq "exec") {
+ return sub { return if class(main_start) eq "NULL";
+ $curcv = main_cv;
+ walk_exec(main_start) }
+ } elsif ($order eq "tree") {
+ return sub { return if class(main_root) eq "NULL";
+ $curcv = main_cv;
+ print tree(main_root, 0) }
+ } elsif ($order eq "basic") {
+ return sub { return if class(main_root) eq "NULL";
+ $curcv = main_cv;
+ walk_topdown(main_root,
+ sub { $_[0]->concise($_[1]) }, 0); }
+ }
+ }
+}
+
+my %labels;
+my $lastnext;
+
+my %opclass = ('OP' => "0", 'UNOP' => "1", 'BINOP' => "2", 'LOGOP' => "|",
+ 'LISTOP' => "@", 'PMOP' => "/", 'SVOP' => "\$", 'GVOP' => "*",
+ 'PVOP' => '"', 'LOOP' => "{", 'COP' => ";");
+
+my @linenoise =
+ qw'# () sc ( @? 1 $* gv *{ m$ m@ m% m? p/ *$ $ $# & a& pt \\ s\\ rf bl
+ ` *? <> ?? ?/ r/ c/ // qr s/ /c y/ = @= C sC Cp sp df un BM po +1 +I
+ -1 -I 1+ I+ 1- I- ** * i* / i/ %$ i% x + i+ - i- . " << >> < i<
+ > i> <= i, >= i. == i= != i! <? i? s< s> s, s. s= s! s? b& b^ b| -0 -i
+ ! ~ a2 si cs rd sr e^ lg sq in %x %o ab le ss ve ix ri sf FL od ch cy
+ uf lf uc lc qm @ [f [ @[ eh vl ky dl ex % ${ @{ uk pk st jn ) )[ a@
+ a% sl +] -] [- [+ so rv GS GW MS MW .. f. .f && || ^^ ?: &= |= -> s{ s}
+ v} ca wa di rs ;; ; ;d }{ { } {} f{ it {l l} rt }l }n }r dm }g }e ^o
+ ^c ^| ^# um bm t~ u~ ~d DB db ^s se ^g ^r {w }w pf pr ^O ^K ^R ^W ^d ^v
+ ^e ^t ^k t. fc ic fl .s .p .b .c .l .a .h g1 s1 g2 s2 ?. l? -R -W -X -r
+ -w -x -e -o -O -z -s -M -A -C -S -c -b -f -d -p -l -u -g -k -t -T -B cd
+ co cr u. cm ut r. l@ s@ r@ mD uD oD rD tD sD wD cD f$ w$ p$ sh e$ k$ g3
+ g4 s4 g5 s5 T@ C@ L@ G@ A@ S@ Hg Hc Hr Hw Mg Mc Ms Mr Sg Sc So rq do {e
+ e} {t t} g6 G6 6e g7 G7 7e g8 G8 8e g9 G9 9e 6s 7s 8s 9s 6E 7E 8E 9E Pn
+ Pu GP SP EP Gn Gg GG SG EG g0 c$ lk t$ ;s n>';
+
+my $chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+sub op_flags {
+ my($x) = @_;
+ my(@v);
+ push @v, "v" if ($x & 3) == 1;
+ push @v, "s" if ($x & 3) == 2;
+ push @v, "l" if ($x & 3) == 3;
+ push @v, "K" if $x & 4;
+ push @v, "P" if $x & 8;
+ push @v, "R" if $x & 16;
+ push @v, "M" if $x & 32;
+ push @v, "S" if $x & 64;
+ push @v, "*" if $x & 128;
+ return join("", @v);
+}
+
+sub base_n {
+ my $x = shift;
+ return "-" . base_n(-$x) if $x < 0;
+ my $str = "";
+ do { $str .= substr($chars, $x % $base, 1) } while $x = int($x / $base);
+ $str = reverse $str if $big_endian;
+ return $str;
+}
+
+sub seq { return $_[0]->seq ? base_n($_[0]->seq - $seq_base) : "-" }
+
+sub walk_topdown {
+ my($op, $sub, $level) = @_;
+ $sub->($op, $level);
+ if ($op->flags & OPf_KIDS) {
+ for (my $kid = $op->first; $$kid; $kid = $kid->sibling) {
+ walk_topdown($kid, $sub, $level + 1);
+ }
+ }
+ if (class($op) eq "PMOP" and $ {$op->pmreplroot}
+ and $op->pmreplroot->isa("B::OP")) {
+ walk_topdown($op->pmreplroot, $sub, $level + 1);
+ }
+}
+
+sub walklines {
+ my($ar, $level) = @_;
+ for my $l (@$ar) {
+ if (ref($l) eq "ARRAY") {
+ walklines($l, $level + 1);
+ } else {
+ $l->concise($level);
+ }
+ }
+}
+
+sub walk_exec {
+ my($top, $level) = @_;
+ my %opsseen;
+ my @lines;
+ my @todo = ([$top, \@lines]);
+ while (@todo and my($op, $targ) = @{shift @todo}) {
+ for (; $$op; $op = $op->next) {
+ last if $opsseen{$$op}++;
+ push @$targ, $op;
+ my $name = $op->name;
+ if ($name
+ =~ /^(or|and|(map|grep)while|entertry|range|cond_expr)$/) {
+ my $ar = [];
+ push @$targ, $ar;
+ push @todo, [$op->other, $ar];
+ } elsif ($name eq "subst" and $ {$op->pmreplstart}) {
+ my $ar = [];
+ push @$targ, $ar;
+ push @todo, [$op->pmreplstart, $ar];
+ } elsif ($name =~ /^enter(loop|iter)$/) {
+ $labels{$op->nextop->seq} = "NEXT";
+ $labels{$op->lastop->seq} = "LAST";
+ $labels{$op->redoop->seq} = "REDO";
+ }
+ }
+ }
+ walklines(\@lines, 0);
+}
+
+sub fmt_line {
+ my($hr, $fmt, $level) = @_;
+ my $text = $fmt;
+ $text =~ s/\(\?\(([^\#]*?)\#(\w+)([^\#]*?)\)\?\)/
+ $hr->{$2} ? $1.$hr->{$2}.$3 : ""/eg;
+ $text =~ s/\(x\((.*?);(.*?)\)x\)/$order eq "exec" ? $1 : $2/egs;
+ $text =~ s/\(\*\(([^;]*?)\)\*\)/$1 x $level/egs;
+ $text =~ s/\(\*\((.*?);(.*?)\)\*\)/$1 x ($level - 1) . $2 x ($level>0)/egs;
+ $text =~ s/#([a-zA-Z]+)(\d+)/sprintf("%-$2s", $hr->{$1})/eg;
+ $text =~ s/#([a-zA-Z]+)/$hr->{$1}/eg;
+ $text =~ s/[ \t]*~+[ \t]*/ /g;
+ return $text;
+}
+
+my %priv;
+$priv{$_}{128} = "LVINTRO"
+ for ("pos", "substr", "vec", "threadsv", "gvsv", "rv2sv", "rv2hv", "rv2gv",
+ "rv2av", "rv2arylen", "aelem", "helem", "aslice", "hslice", "padsv",
+ "padav", "padhv");
+$priv{$_}{64} = "REFC" for ("leave", "leavesub", "leavesublv", "leavewrite");
+$priv{"aassign"}{64} = "COMMON";
+$priv{"aassign"}{32} = "PHASH";
+$priv{"sassign"}{64} = "BKWARD";
+$priv{$_}{64} = "RTIME" for ("match", "subst", "substcont");
+@{$priv{"trans"}}{1,2,4,8,16,64} = ("<UTF", ">UTF", "IDENT", "SQUASH", "DEL",
+ "COMPL", "GROWS");
+$priv{"repeat"}{64} = "DOLIST";
+$priv{"leaveloop"}{64} = "CONT";
+@{$priv{$_}}{32,64,96} = ("DREFAV", "DREFHV", "DREFSV")
+ for ("entersub", map("rv2${_}v", "a", "s", "h", "g"), "aelem", "helem");
+$priv{"entersub"}{16} = "DBG";
+$priv{"entersub"}{32} = "TARG";
+@{$priv{$_}}{4,8,128} = ("INARGS","AMPER","NO()") for ("entersub", "rv2cv");
+$priv{"gv"}{32} = "EARLYCV";
+$priv{"aelem"}{16} = $priv{"helem"}{16} = "LVDEFER";
+$priv{$_}{16} = "OURINTR" for ("gvsv", "rv2sv", "rv2av", "rv2hv", "r2gv");
+$priv{$_}{16} = "TARGMY"
+ for (map(($_,"s$_"),"chop", "chomp"),
+ map(($_,"i_$_"), "postinc", "postdec", "multiply", "divide", "modulo",
+ "add", "subtract", "negate"), "pow", "concat", "stringify",
+ "left_shift", "right_shift", "bit_and", "bit_xor", "bit_or",
+ "complement", "atan2", "sin", "cos", "rand", "exp", "log", "sqrt",
+ "int", "hex", "oct", "abs", "length", "index", "rindex", "sprintf",
+ "ord", "chr", "crypt", "quotemeta", "join", "push", "unshift", "flock",
+ "chdir", "chown", "chroot", "unlink", "chmod", "utime", "rename",
+ "link", "symlink", "mkdir", "rmdir", "wait", "waitpid", "system",
+ "exec", "kill", "getppid", "getpgrp", "setpgrp", "getpriority",
+ "setpriority", "time", "sleep");
+@{$priv{"const"}}{8,16,32,64,128} = ("STRICT","ENTERED", "$[", "BARE", "WARN");
+$priv{"flip"}{64} = $priv{"flop"}{64} = "LINENUM";
+$priv{"list"}{64} = "GUESSED";
+$priv{"delete"}{64} = "SLICE";
+$priv{"exists"}{64} = "SUB";
+$priv{$_}{64} = "LOCALE"
+ for ("sort", "prtf", "sprintf", "slt", "sle", "seq", "sne", "sgt", "sge",
+ "scmp", "lc", "uc", "lcfirst", "ucfirst");
+@{$priv{"sort"}}{1,2,4} = ("NUM", "INT", "REV");
+$priv{"threadsv"}{64} = "SVREFd";
+$priv{$_}{16} = "INBIN" for ("open", "backtick");
+$priv{$_}{32} = "INCR" for ("open", "backtick");
+$priv{$_}{64} = "OUTBIN" for ("open", "backtick");
+$priv{$_}{128} = "OUTCR" for ("open", "backtick");
+$priv{"exit"}{128} = "VMS";
+
+sub private_flags {
+ my($name, $x) = @_;
+ my @s;
+ for my $flag (128, 96, 64, 32, 16, 8, 4, 2, 1) {
+ if ($priv{$name}{$flag} and $x & $flag and $x >= $flag) {
+ $x -= $flag;
+ push @s, $priv{$name}{$flag};
+ }
+ }
+ push @s, $x if $x;
+ return join(",", @s);
+}
+
+sub concise_op {
+ my ($op, $level, $format) = @_;
+ my %h;
+ $h{exname} = $h{name} = $op->name;
+ $h{NAME} = uc $h{name};
+ $h{class} = class($op);
+ $h{extarg} = $h{targ} = $op->targ;
+ $h{extarg} = "" unless $h{extarg};
+ if ($h{name} eq "null" and $h{targ}) {
+ $h{exname} = "ex-" . substr(ppname($h{targ}), 3);
+ $h{extarg} = "";
+ } elsif ($h{targ}) {
+ my $padname = (($curcv->PADLIST->ARRAY)[0]->ARRAY)[$h{targ}];
+ if (defined $padname and class($padname) ne "SPECIAL") {
+ $h{targarg} = $padname->PVX;
+ my $intro = $padname->NVX - $cop_seq_base;
+ my $finish = int($padname->IVX) - $cop_seq_base;
+ $finish = "end" if $finish == 999999999 - $cop_seq_base;
+ $h{targarglife} = "$h{targarg}:$intro,$finish";
+ } else {
+ $h{targarglife} = $h{targarg} = "t" . $h{targ};
+ }
+ }
+ $h{arg} = "";
+ $h{svclass} = $h{svaddr} = $h{svval} = "";
+ if ($h{class} eq "PMOP") {
+ my $precomp = $op->precomp;
+ $precomp = defined($precomp) ? "/$precomp/" : "";
+ my $pmreplroot = $op->pmreplroot;
+ my ($pmreplroot, $pmreplstart);
+ if ($ {$pmreplroot = $op->pmreplroot} && $pmreplroot->isa("B::GV")) {
+ # with C<@stash_array = split(/pat/, str);>,
+ # *stash_array is stored in pmreplroot.
+ $h{arg} = "($precomp => \@" . $pmreplroot->NAME . ")";
+ } elsif ($ {$op->pmreplstart}) {
+ undef $lastnext;
+ $pmreplstart = "replstart->" . seq($op->pmreplstart);
+ $h{arg} = "(" . join(" ", $precomp, $pmreplstart) . ")";
+ } else {
+ $h{arg} = "($precomp)";
+ }
+ } elsif ($h{class} eq "PVOP" and $h{name} ne "trans") {
+ $h{arg} = '("' . $op->pv . '")';
+ $h{svval} = '"' . $op->pv . '"';
+ } elsif ($h{class} eq "COP") {
+ my $label = $op->label;
+ $h{coplabel} = $label;
+ $label = $label ? "$label: " : "";
+ my $loc = $op->file;
+ $loc =~ s[.*/][];
+ $loc .= ":" . $op->line;
+ my($stash, $cseq) = ($op->stash->NAME, $op->cop_seq - $cop_seq_base);
+ my $arybase = $op->arybase;
+ $arybase = $arybase ? ' $[=' . $arybase : "";
+ $h{arg} = "($label$stash $cseq $loc$arybase)";
+ } elsif ($h{class} eq "LOOP") {
+ $h{arg} = "(next->" . seq($op->nextop) . " last->" . seq($op->lastop)
+ . " redo->" . seq($op->redoop) . ")";
+ } elsif ($h{class} eq "LOGOP") {
+ undef $lastnext;
+ $h{arg} = "(other->" . seq($op->other) . ")";
+ } elsif ($h{class} eq "SVOP") {
+ my $sv = $op->sv;
+ $h{svclass} = class($sv);
+ $h{svaddr} = sprintf("%#x", $$sv);
+ if ($h{svclass} eq "GV") {
+ my $gv = $sv;
+ my $stash = $gv->STASH->NAME;
+ if ($stash eq "main") {
+ $stash = "";
+ } else {
+ $stash = $stash . "::";
+ }
+ $h{arg} = "(*$stash" . $gv->SAFENAME . ")";
+ $h{svval} = "*$stash" . $gv->SAFENAME;
+ } else {
+ while (class($sv) eq "RV") {
+ $h{svval} .= "\\";
+ $sv = $sv->RV;
+ }
+ if (class($sv) eq "SPECIAL") {
+ $h{svval} = ["Null", "sv_undef", "sv_yes", "sv_no"]->[$$sv];
+ } elsif ($sv->FLAGS & SVf_NOK) {
+ $h{svval} = $sv->NV;
+ } elsif ($sv->FLAGS & SVf_IOK) {
+ $h{svval} = $sv->IV;
+ } elsif ($sv->FLAGS & SVf_POK) {
+ $h{svval} = cstring($sv->PV);
+ }
+ $h{arg} = "($h{svclass} $h{svval})";
+ }
+ }
+ $h{seq} = $h{hyphseq} = seq($op);
+ $h{seq} = "" if $h{seq} eq "-";
+ $h{seqnum} = $op->seq;
+ $h{next} = $op->next;
+ $h{next} = (class($h{next}) eq "NULL") ? "(end)" : seq($h{next});
+ $h{nextaddr} = sprintf("%#x", $ {$op->next});
+ $h{sibaddr} = sprintf("%#x", $ {$op->sibling});
+ $h{firstaddr} = sprintf("%#x", $ {$op->first}) if $op->can("first");
+ $h{lastaddr} = sprintf("%#x", $ {$op->last}) if $op->can("last");
+
+ $h{classsym} = $opclass{$h{class}};
+ $h{flagval} = $op->flags;
+ $h{flags} = op_flags($op->flags);
+ $h{privval} = $op->private;
+ $h{private} = private_flags($h{name}, $op->private);
+ $h{addr} = sprintf("%#x", $$op);
+ $h{label} = $labels{$op->seq};
+ $h{typenum} = $op->type;
+ $h{noise} = $linenoise[$op->type];
+ return fmt_line(\%h, $format, $level);
+}
+
+sub B::OP::concise {
+ my($op, $level) = @_;
+ if ($order eq "exec" and $lastnext and $$lastnext != $$op) {
+ my $h = {"seq" => seq($lastnext), "class" => class($lastnext),
+ "addr" => sprintf("%#x", $$lastnext)};
+ print fmt_line($h, $gotofmt, $level+1);
+ }
+ $lastnext = $op->next;
+ print concise_op($op, $level, $format);
+}
+
+sub tree {
+ my $op = shift;
+ my $level = shift;
+ my $style = $tree_decorations[$tree_style];
+ my($space, $single, $kids, $kid, $nokid, $last, $lead, $size) = @$style;
+ my $name = concise_op($op, $level, $treefmt);
+ if (not $op->flags & OPf_KIDS) {
+ return $name . "\n";
+ }
+ my @lines;
+ for (my $kid = $op->first; $$kid; $kid = $kid->sibling) {
+ push @lines, tree($kid, $level+1);
+ }
+ my $i;
+ for ($i = $#lines; substr($lines[$i], 0, 1) eq " "; $i--) {
+ $lines[$i] = $space . $lines[$i];
+ }
+ if ($i > 0) {
+ $lines[$i] = $last . $lines[$i];
+ while ($i-- > 1) {
+ if (substr($lines[$i], 0, 1) eq " ") {
+ $lines[$i] = $nokid . $lines[$i];
+ } else {
+ $lines[$i] = $kid . $lines[$i];
+ }
+ }
+ $lines[$i] = $kids . $lines[$i];
+ } else {
+ $lines[0] = $single . $lines[0];
+ }
+ return("$name$lead" . shift @lines,
+ map(" " x (length($name)+$size) . $_, @lines));
+}
+
+# This is a bit of a hack; the 2 and 15 were determined empirically.
+# These need to stay the last things in the module.
+$cop_seq_base = svref_2object(eval 'sub{0;}')->START->cop_seq + 2;
+$seq_base = svref_2object(eval 'sub{}')->START->seq + 15;
+
+1;
+
+__END__
+
+=head1 NAME
+
+B::Concise - Walk Perl syntax tree, printing concise info about ops
+
+=head1 SYNOPSIS
+
+ perl -MO=Concise[,OPTIONS] foo.pl
+
+=head1 DESCRIPTION
+
+This compiler backend prints the internal OPs of a Perl program's syntax
+tree in one of several space-efficient text formats suitable for debugging
+the inner workings of perl or other compiler backends. It can print OPs in
+the order they appear in the OP tree, in the order they will execute, or
+in a text approximation to their tree structure, and the format of the
+information displyed is customizable. Its function is similar to that of
+perl's B<-Dx> debugging flag or the B<B::Terse> module, but it is more
+sophisticated and flexible.
+
+=head1 OPTIONS
+
+Arguments that don't start with a hyphen are taken to be the names of
+subroutines to print the OPs of; if no such functions are specified, the
+main body of the program (outside any subroutines, and not including use'd
+or require'd files) is printed.
+
+=over 4
+
+=item B<-basic>
+
+Print OPs in the order they appear in the OP tree (a preorder
+traversal, starting at the root). The indentation of each OP shows its
+level in the tree. This mode is the default, so the flag is included
+simply for completeness.
+
+=item B<-exec>
+
+Print OPs in the order they would normally execute (for the majority
+of constructs this is a postorder traversal of the tree, ending at the
+root). In most cases the OP that usually follows a given OP will
+appear directly below it; alternate paths are shown by indentation. In
+cases like loops when control jumps out of a linear path, a 'goto'
+line is generated.
+
+=item B<-tree>
+
+Print OPs in a text approximation of a tree, with the root of the tree
+at the left and 'left-to-right' order of children transformed into
+'top-to-bottom'. Because this mode grows both to the right and down,
+it isn't suitable for large programs (unless you have a very wide
+terminal).
+
+=item B<-compact>
+
+Use a tree format in which the minimum amount of space is used for the
+lines connecting nodes (one character in most cases). This squeezes out
+a few precious columns of screen real estate.
+
+=item B<-loose>
+
+Use a tree format that uses longer edges to separate OP nodes. This format
+tends to look better than the compact one, especially in ASCII, and is
+the default.
+
+=item B<-vt>
+
+Use tree connecting characters drawn from the VT100 line-drawing set.
+This looks better if your terminal supports it.
+
+=item B<-ascii>
+
+Draw the tree with standard ASCII characters like C<+> and C<|>. These don't
+look as clean as the VT100 characters, but they'll work with almost any
+terminal (or the horizontal scrolling mode of less(1)) and are suitable
+for text documentation or email. This is the default.
+
+=item B<-main>
+
+Include the main program in the output, even if subroutines were also
+specified.
+
+=item B<-base>I<n>
+
+Print OP sequence numbers in base I<n>. If I<n> is greater than 10, the
+digit for 11 will be 'a', and so on. If I<n> is greater than 36, the digit
+for 37 will be 'A', and so on until 62. Values greater than 62 are not
+currently supported. The default is 36.
+
+=item B<-bigendian>
+
+Print sequence numbers with the most significant digit first. This is the
+usual convention for Arabic numerals, and the default.
+
+=item B<-littleendian>
+
+Print seqence numbers with the least significant digit first.
+
+=item B<-concise>
+
+Use the author's favorite set of formatting conventions. This is the
+default, of course.
+
+=item B<-terse>
+
+Use formatting conventions that emulate the ouput of B<B::Terse>. The
+basic mode is almost indistinguishable from the real B<B::Terse>, and the
+exec mode looks very similar, but is in a more logical order and lacks
+curly brackets. B<B::Terse> doesn't have a tree mode, so the tree mode
+is only vaguely reminiscient of B<B::Terse>.
+
+=item B<-linenoise>
+
+Use formatting conventions in which the name of each OP, rather than being
+written out in full, is represented by a one- or two-character abbreviation.
+This is mainly a joke.
+
+=item B<-debug>
+
+Use formatting conventions reminiscient of B<B::Debug>; these aren't
+very concise at all.
+
+=item B<-env>
+
+Use formatting conventions read from the environment variables
+C<B_CONCISE_FORMAT>, C<B_CONCISE_GOTO_FORMAT>, and C<B_CONCISE_TREE_FORMAT>.
+
+=back
+
+=head1 FORMATTING SPECIFICATIONS
+
+For each general style ('concise', 'terse', 'linenoise', etc.) there are
+three specifications: one of how OPs should appear in the basic or exec
+modes, one of how 'goto' lines should appear (these occur in the exec
+mode only), and one of how nodes should appear in tree mode. Each has the
+same format, described below. Any text that doesn't match a special
+pattern is copied verbatim.
+
+=over 4
+
+=item B<(x(>I<exec_text>B<;>I<basic_text>B<)x)>
+
+Generates I<exec_text> in exec mode, or I<basic_text> in basic mode.
+
+=item B<(*(>I<text>B<)*)>
+
+Generates one copy of I<text> for each indentation level.
+
+=item B<(*(>I<text1>B<;>I<text2>B<)*)>
+
+Generates one fewer copies of I<text1> than the indentation level, followed
+by one copy of I<text2> if the indentation level is more than 0.
+
+=item B<(?(>I<text1>B<#>I<var>I<Text2>B<)?)>
+
+If the value of I<var> is true (not empty or zero), generates the
+value of I<var> surrounded by I<text1> and I<Text2>, otherwise
+nothing.
+
+=item B<#>I<var>
+
+Generates the value of the variable I<var>.
+
+=item B<#>I<var>I<N>
+
+Generates the value of I<var>, left jutified to fill I<N> spaces.
+
+=item B<~>
+
+Any number of tildes and surrounding whitespace will be collapsed to
+a single space.
+
+=back
+
+The following variables are recognized:
+
+=over 4
+
+=item B<#addr>
+
+The address of the OP, in hexidecimal.
+
+=item B<#arg>
+
+The OP-specific information of the OP (such as the SV for an SVOP, the
+non-local exit pointers for a LOOP, etc.) enclosed in paretheses.
+
+=item B<#class>
+
+The B-determined class of the OP, in all caps.
+
+=item B<#classym>
+
+A single symbol abbreviating the class of the OP.
+
+=item B<#coplabel>
+
+The label of the statement or block the OP is the start of, if any.
+
+=item B<#exname>
+
+The name of the OP, or 'ex-foo' if the OP is a null that used to be a foo.
+
+=item B<#extarg>
+
+The target of the OP, or nothing for a nulled OP.
+
+=item B<#firstaddr>
+
+The address of the OP's first child, in hexidecimal.
+
+=item B<#flags>
+
+The OP's flags, abbreviated as a series of symbols.
+
+=item B<#flagval>
+
+The numeric value of the OP's flags.
+
+=item B<#hyphenseq>
+
+The sequence number of the OP, or a hyphen if it doesn't have one.
+
+=item B<#label>
+
+'NEXT', 'LAST', or 'REDO' if the OP is a target of one of those in exec
+mode, or empty otherwise.
+
+=item B<#lastaddr>
+
+The address of the OP's last child, in hexidecimal.
+
+=item B<#name>
+
+The OP's name.
+
+=item B<#NAME>
+
+The OP's name, in all caps.
+
+=item B<#next>
+
+The sequence number of the OP's next OP.
+
+=item B<#nextaddr>
+
+The address of the OP's next OP, in hexidecimal.
+
+=item B<#noise>
+
+The two-character abbreviation for the OP's name.
+
+=item B<#private>
+
+The OP's private flags, rendered with abbreviated names if possible.
+
+=item B<#privval>
+
+The numeric value of the OP's private flags.
+
+=item B<#seq>
+
+The sequence number of the OP.
+
+=item B<#seqnum>
+
+The real sequence number of the OP, as a regular number and not adjusted
+to be relative to the start of the real program. (This will generally be
+a fairly large number because all of B<B::Concise> is compiled before
+your program is).
+
+=item B<#sibaddr>
+
+The address of the OP's next youngest sibling, in hexidecimal.
+
+=item B<#svaddr>
+
+The address of the OP's SV, if it has an SV, in hexidecimal.
+
+=item B<#svclass>
+
+The class of the OP's SV, if it has one, in all caps (e.g., 'IV').
+
+=item B<#svval>
+
+The value of the OP's SV, if it has one, in a short human-readable format.
+
+=item B<#targ>
+
+The numeric value of the OP's targ.
+
+=item B<#targarg>
+
+The name of the variable the OP's targ refers to, if any, otherwise the
+letter t followed by the OP's targ in decimal.
+
+=item B<#targarglife>
+
+Same as B<#targarg>, but followed by the COP sequence numbers that delimit
+the variable's lifetime (or 'end' for a variable in an open scope) for a
+variable.
+
+=item B<#typenum>
+
+The numeric value of the OP's type, in decimal.
+
+=back
+
+=head1 ABBREVIATIONS
+
+=head2 OP flags abbreviations
+
+ v OPf_WANT_VOID Want nothing (void context)
+ s OPf_WANT_SCALAR Want single value (scalar context)
+ l OPf_WANT_LIST Want list of any length (list context)
+ K OPf_KIDS There is a firstborn child.
+ P OPf_PARENS This operator was parenthesized.
+ (Or block needs explicit scope entry.)
+ R OPf_REF Certified reference.
+ (Return container, not containee).
+ M OPf_MOD Will modify (lvalue).
+ S OPf_STACKED Some arg is arriving on the stack.
+ * OPf_SPECIAL Do something weird for this op (see op.h)
+
+=head2 OP class abbreviations
+
+ 0 OP (aka BASEOP) An OP with no children
+ 1 UNOP An OP with one child
+ 2 BINOP An OP with two children
+ | LOGOP A control branch OP
+ @ LISTOP An OP that could have lots of children
+ / PMOP An OP with a regular expression
+ $ SVOP An OP with an SV
+ " PVOP An OP with a string
+ { LOOP An OP that holds pointers for a loop
+ ; COP An OP that marks the start of a statement
+
+=head1 AUTHOR
+
+Stephen McCamant, C<smcc@CSUA.Berkeley.EDU>
+
+=cut
diff --git a/gnu/usr.bin/perl/ext/B/B/Debug.pm b/gnu/usr.bin/perl/ext/B/B/Debug.pm
index ae7a9733bcd..049195b4236 100644
--- a/gnu/usr.bin/perl/ext/B/B/Debug.pm
+++ b/gnu/usr.bin/perl/ext/B/B/Debug.pm
@@ -33,6 +33,16 @@ sub B::BINOP::debug {
printf "\top_last\t\t0x%x\n", ${$op->last};
}
+sub B::LOOP::debug {
+ my ($op) = @_;
+ $op->B::BINOP::debug();
+ printf <<'EOT', ${$op->redoop}, ${$op->nextop}, ${$op->lastop};
+ op_redoop 0x%x
+ op_nextop 0x%x
+ op_lastop 0x%x
+EOT
+}
+
sub B::LOGOP::debug {
my ($op) = @_;
$op->B::UNOP::debug();
@@ -53,7 +63,6 @@ sub B::PMOP::debug {
printf "\top_pmnext\t0x%x\n", ${$op->pmnext};
printf "\top_pmregexp->precomp\t%s\n", cstring($op->precomp);
printf "\top_pmflags\t0x%x\n", $op->pmflags;
- $op->pmshort->debug;
$op->pmreplroot->debug;
}
@@ -209,14 +218,14 @@ EOT
sub B::GV::debug {
my ($gv) = @_;
if ($done_gv{$$gv}++) {
- printf "GV %s::%s\n", $gv->STASH->NAME, $gv->NAME;
+ printf "GV %s::%s\n", $gv->STASH->NAME, $gv->SAFENAME;
return;
}
my ($sv) = $gv->SV;
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->FILE, $gv->GvFLAGS;
+ printf <<'EOT', $gv->SAFENAME, $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
@@ -244,7 +253,7 @@ sub B::SPECIAL::debug {
sub compile {
my $order = shift;
B::clearsym();
- if ($order eq "exec") {
+ if ($order && $order eq "exec") {
return sub { walkoptree_exec(main_start, "debug") }
} else {
return sub { walkoptree(main_root, "debug") }
diff --git a/gnu/usr.bin/perl/ext/B/B/Deparse.pm b/gnu/usr.bin/perl/ext/B/B/Deparse.pm
index cd53c112d8c..ead02e14a84 100644
--- a/gnu/usr.bin/perl/ext/B/B/Deparse.pm
+++ b/gnu/usr.bin/perl/ext/B/B/Deparse.pm
@@ -1,5 +1,5 @@
# B::Deparse.pm
-# Copyright (c) 1998, 1999 Stephen McCamant. All rights reserved.
+# Copyright (c) 1998, 1999, 2000 Stephen McCamant. All rights reserved.
# This module is free software; you can redistribute and/or modify
# it under the same terms as Perl itself.
@@ -8,16 +8,16 @@
package B::Deparse;
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
+ CVf_METHOD CVf_LOCKED CVf_LVALUE
PMf_KEEP PMf_GLOBAL PMf_CONTINUE PMf_EVAL PMf_ONCE
PMf_MULTILINE PMf_SINGLELINE PMf_FOLD PMf_EXTENDED);
-$VERSION = 0.59;
+$VERSION = 0.60;
use strict;
# Changes between 0.50 and 0.51:
@@ -83,6 +83,12 @@ use strict;
# - added support for Chip's OP_METHOD_NAMED
# - added support for Ilya's OPpTARGET_MY optimization
# - elided arrows before `()' subscripts when possible
+# Changes between 0.59 and 0.60
+# - support for method attribues was added
+# - some warnings fixed
+# - separate recognition of constant subs
+# - rewrote continue block handling, now recoginizing for loops
+# - added more control of expanding control structures
# Todo:
# - finish tr/// changes
@@ -93,8 +99,8 @@ use strict;
# - 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?)
+# - interpret 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?)
@@ -108,7 +114,6 @@ use strict;
# - version using op_next instead of op_first/sibling?
# - avoid string copies (pass arrays, one big join?)
# - auto-apply `-u'?
-# - while{} with one-statement continue => for(; XXX; XXX) {}?
# - -uPackage:: descend recursively?
# - here-docs?
# - <DATA>?
@@ -252,17 +257,17 @@ sub walk_sub {
walk_tree($op, sub {
my $op = shift;
if ($op->name eq "gv") {
- my $gv = $self->maybe_padgv($op);
+ my $gv = $self->gv_or_padgv($op);
if ($op->next->name eq "entersub") {
- next if $self->{'subs_done'}{$$gv}++;
- next if class($gv->CV) eq "SPECIAL";
+ return if $self->{'subs_done'}{$$gv}++;
+ return 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";
+ return if $self->{'forms_done'}{$$gv}++;
+ return if class($gv->FORM) eq "SPECIAL";
$self->todo($gv, $gv->FORM, 1);
$self->walk_sub($gv->FORM);
}
@@ -345,6 +350,10 @@ sub new {
$self->{'cuddle'} = "\n";
$self->{'indent_size'} = 4;
$self->{'use_tabs'} = 0;
+ $self->{'expand'} = 0;
+ $self->{'unquote'} = 0;
+ $self->{'linenums'} = 0;
+ $self->{'parens'} = 0;
$self->{'ex_const'} = "'???'";
while (my $arg = shift @_) {
if (substr($arg, 0, 2) eq "-u") {
@@ -357,6 +366,8 @@ sub new {
$self->{'unquote'} = 1;
} elsif (substr($arg, 0, 2) eq "-s") {
$self->style_opts(substr $arg, 2);
+ } elsif ($arg =~ /^-x(\d)$/) {
+ $self->{'expand'} = $1;
}
}
return $self;
@@ -378,7 +389,7 @@ sub compile {
while (scalar(@{$self->{'subs_todo'}})) {
push @text, $self->next_todo;
}
- print indent(join("", @text)), "\n" if @text;
+ print $self->indent(join("", @text)), "\n" if @text;
}
}
@@ -393,6 +404,7 @@ sub deparse {
my $self = shift;
my($op, $cx) = @_;
# cluck if class($op) eq "NULL";
+# cluck unless $op;
# return $self->$ {\("pp_" . $op->name)}($op, $cx);
my $meth = "pp_" . $op->name;
return $self->$meth($op, $cx);
@@ -433,6 +445,13 @@ sub deparse_sub {
if ($cv->FLAGS & SVf_POK) {
$proto = "(". $cv->PV . ") ";
}
+ if ($cv->CvFLAGS & (CVf_METHOD|CVf_LOCKED|CVf_LVALUE)) {
+ $proto .= ": ";
+ $proto .= "lvalue " if $cv->CvFLAGS & CVf_LVALUE;
+ $proto .= "locked " if $cv->CvFLAGS & CVf_LOCKED;
+ $proto .= "method " if $cv->CvFLAGS & CVf_METHOD;
+ }
+
local($self->{'curcv'}) = $cv;
local($self->{'curstash'}) = $self->{'curstash'};
if (not null $cv->ROOT) {
@@ -553,7 +572,11 @@ sub maybe_local {
my $self = shift;
my($op, $cx, $text) = @_;
if ($op->private & OPpLVAL_INTRO and not $self->{'avoid_local'}{$$op}) {
- return $self->maybe_parens_func("local", $text, $cx, 16);
+ if (want_scalar($op)) {
+ return "local $text";
+ } else {
+ return $self->maybe_parens_func("local", $text, $cx, 16);
+ }
} else {
return $text;
}
@@ -581,7 +604,11 @@ sub maybe_my {
my $self = shift;
my($op, $cx, $text) = @_;
if ($op->private & OPpLVAL_INTRO and not $self->{'avoid_local'}{$$op}) {
- return $self->maybe_parens_func("my", $text, $cx, 16);
+ if (want_scalar($op)) {
+ return "my $text";
+ } else {
+ return $self->maybe_parens_func("my", $text, $cx, 16);
+ }
} else {
return $text;
}
@@ -672,70 +699,69 @@ sub pp_entertry { # see also leavetry
return "XXX";
}
-# leave and scope/lineseq should probably share code
-sub pp_leave {
+sub lineseq {
my $self = shift;
- my($op, $cx) = @_;
- my ($kid, $expr);
- my @exprs;
- local($self->{'curstash'}) = $self->{'curstash'};
- $kid = $op->first->sibling; # skip enter
- if (is_miniwhile($kid)) {
- my $top = $kid->first;
- my $name = $top->name;
- if ($name eq "and") {
- $name = "while";
- } elsif ($name eq "or") {
- $name = "until";
- } else { # no conditional -> while 1 or until 0
- return $self->deparse($top->first, 1) . " while 1";
- }
- my $cond = $top->first;
- my $body = $cond->sibling->first; # skip lineseq
- $cond = $self->deparse($cond, 1);
- $body = $self->deparse($body, 1);
- return "$body $name $cond";
- }
- for (; !null($kid); $kid = $kid->sibling) {
+ my(@ops) = @_;
+ my($expr, @exprs);
+ for (my $i = 0; $i < @ops; $i++) {
$expr = "";
- if (is_state $kid) {
- $expr = $self->deparse($kid, 0);
- $kid = $kid->sibling;
- last if null $kid;
+ if (is_state $ops[$i]) {
+ $expr = $self->deparse($ops[$i], 0);
+ $i++;
+ last if $i > $#ops;
}
- $expr .= $self->deparse($kid, 0);
+ if (!is_state $ops[$i] and $ops[$i+1] and !null($ops[$i+1]) and
+ $ops[$i+1]->name eq "leaveloop" and $self->{'expand'} < 3)
+ {
+ push @exprs, $expr . $self->for_loop($ops[$i], 0);
+ $i++;
+ next;
+ }
+ $expr .= $self->deparse($ops[$i], 0);
push @exprs, $expr if length $expr;
}
- if ($cx > 0) { # inside an expression
- return "do { " . join(";\n", @exprs) . " }";
- } else {
- return join(";\n", @exprs) . ";";
- }
+ return join(";\n", @exprs);
}
-sub pp_scope {
- my $self = shift;
- my($op, $cx) = @_;
- my ($kid, $expr);
- my @exprs;
- for ($kid = $op->first; !null($kid); $kid = $kid->sibling) {
- $expr = "";
- if (is_state $kid) {
- $expr = $self->deparse($kid, 0);
- $kid = $kid->sibling;
- last if null $kid;
+sub scopeop {
+ my($real_block, $self, $op, $cx) = @_;
+ my $kid;
+ my @kids;
+ local($self->{'curstash'}) = $self->{'curstash'} if $real_block;
+ if ($real_block) {
+ $kid = $op->first->sibling; # skip enter
+ if (is_miniwhile($kid)) {
+ my $top = $kid->first;
+ my $name = $top->name;
+ if ($name eq "and") {
+ $name = "while";
+ } elsif ($name eq "or") {
+ $name = "until";
+ } else { # no conditional -> while 1 or until 0
+ return $self->deparse($top->first, 1) . " while 1";
+ }
+ my $cond = $top->first;
+ my $body = $cond->sibling->first; # skip lineseq
+ $cond = $self->deparse($cond, 1);
+ $body = $self->deparse($body, 1);
+ return "$body $name $cond";
}
- $expr .= $self->deparse($kid, 0);
- push @exprs, $expr if length $expr;
+ } else {
+ $kid = $op->first;
+ }
+ for (; !null($kid); $kid = $kid->sibling) {
+ push @kids, $kid;
}
if ($cx > 0) { # inside an expression, (a do {} while for lineseq)
- return "do { " . join(";\n", @exprs) . " }";
+ return "do { " . $self->lineseq(@kids) . " }";
} else {
- return join(";\n", @exprs) . ";";
+ return $self->lineseq(@kids) . ";";
}
}
-sub pp_lineseq { pp_scope(@_) }
+sub pp_scope { scopeop(0, @_); }
+sub pp_lineseq { scopeop(0, @_); }
+sub pp_leave { scopeop(1, @_); }
# The BEGIN {} is used here because otherwise this code isn't executed
# when you run B::Deparse on itself.
@@ -747,7 +773,7 @@ sub gv_name {
my $self = shift;
my $gv = shift;
my $stash = $gv->STASH->NAME;
- my $name = $gv->NAME;
+ my $name = $gv->SAFENAME;
if ($stash eq $self->{'curstash'} or $globalnames{$name}
or $name =~ /^[^A-Za-z_]/)
{
@@ -755,8 +781,8 @@ sub gv_name {
} else {
$stash = $stash . "::";
}
- if ($name =~ /^([\cA-\cZ])$/) {
- $name = "^" . chr(64 + ord($1));
+ if ($name =~ /^\^../) {
+ $name = "{$name}"; # ${^WARNING_BITS} etc
}
return $stash . $name;
}
@@ -840,7 +866,7 @@ sub pp_i_preinc { pfixop(@_, "++", 23) }
sub pp_i_predec { pfixop(@_, "--", 23) }
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_complement { maybe_targmy(@_, \&pfixop, "~", 21) }
sub pp_negate { maybe_targmy(@_, \&real_negate) }
sub real_negate {
@@ -917,7 +943,6 @@ sub pp_prototype { unop(@_, "prototype") }
sub pp_close { unop(@_, "close") }
sub pp_fileno { unop(@_, "fileno") }
sub pp_umask { unop(@_, "umask") }
-sub pp_binmode { unop(@_, "binmode") }
sub pp_untie { unop(@_, "untie") }
sub pp_tied { unop(@_, "tied") }
sub pp_dbmclose { unop(@_, "dbmclose") }
@@ -1373,11 +1398,14 @@ sub logop {
my ($op, $cx, $lowop, $lowprec, $highop, $highprec, $blockname) = @_;
my $left = $op->first;
my $right = $op->first->sibling;
- if ($cx == 0 and is_scope($right) and $blockname) { # if ($a) {$b}
+ if ($cx == 0 and is_scope($right) and $blockname
+ and $self->{'expand'} < 7)
+ { # if ($a) {$b}
$left = $self->deparse($left, 1);
$right = $self->deparse($right, 0);
return "$blockname ($left) {\n\t$right\n\b}\cK";
- } elsif ($cx == 0 and $blockname and not $self->{'parens'}) { # $b if $a
+ } elsif ($cx == 0 and $blockname and not $self->{'parens'}
+ and $self->{'expand'} < 7) { # $b if $a
$right = $self->deparse($right, 1);
$left = $self->deparse($left, 1);
return "$right $blockname $left";
@@ -1457,6 +1485,7 @@ sub pp_return { listop(@_, "return") }
sub pp_open { listop(@_, "open") }
sub pp_pipe_op { listop(@_, "pipe") }
sub pp_tie { listop(@_, "tie") }
+sub pp_binmode { listop(@_, "binmode") }
sub pp_dbmopen { listop(@_, "dbmopen") }
sub pp_sselect { listop(@_, "select") }
sub pp_select { listop(@_, "select") }
@@ -1653,6 +1682,13 @@ sub pp_list {
}
}
+sub is_ifelse_cont {
+ my $op = shift;
+ return ($op->name eq "null" and class($op) eq "UNOP"
+ and $op->first->name =~ /^(and|cond_expr)$/
+ and is_scope($op->first->first->sibling));
+}
+
sub pp_cond_expr {
my $self = shift;
my($op, $cx) = @_;
@@ -1660,52 +1696,55 @@ sub pp_cond_expr {
my $true = $cond->sibling;
my $false = $true->sibling;
my $cuddle = $self->{'cuddle'};
- unless ($cx == 0 and is_scope($true) and is_scope($false)) {
+ unless ($cx == 0 and (is_scope($true) and $true->name ne "null") and
+ (is_scope($false) || is_ifelse_cont($false))
+ and $self->{'expand'} < 7) {
$cond = $self->deparse($cond, 8);
$true = $self->deparse($true, 8);
$false = $self->deparse($false, 8);
return $self->maybe_parens("$cond ? $true : $false", $cx, 8);
- }
+ }
+
$cond = $self->deparse($cond, 1);
$true = $self->deparse($true, 0);
- 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->name eq "lineseq") {
- my $newop = $false->first->sibling->first;
- my $newcond = $newop->first;
- my $newtrue = $newcond->sibling;
- $false = $newtrue->sibling; # last in chain is OP_AND => no else
- $newcond = $self->deparse($newcond, 1);
- $newtrue = $self->deparse($newtrue, 0);
- push @elsifs, "elsif ($newcond) {\n\t$newtrue\n\b}";
- }
- if (!null($false)) {
- $false = $cuddle . "else {\n\t" .
- $self->deparse($false, 0) . "\n\b}\cK";
- } else {
- $false = "\cK";
- }
- return $head . join($cuddle, "", @elsifs) . $false;
+ my $head = "if ($cond) {\n\t$true\n\b}";
+ my @elsifs;
+ while (!null($false) and is_ifelse_cont($false)) {
+ my $newop = $false->first;
+ my $newcond = $newop->first;
+ my $newtrue = $newcond->sibling;
+ $false = $newtrue->sibling; # last in chain is OP_AND => no else
+ $newcond = $self->deparse($newcond, 1);
+ $newtrue = $self->deparse($newtrue, 0);
+ push @elsifs, "elsif ($newcond) {\n\t$newtrue\n\b}";
+ }
+ if (!null($false)) {
+ $false = $cuddle . "else {\n\t" .
+ $self->deparse($false, 0) . "\n\b}\cK";
+ } else {
+ $false = "\cK";
}
- $false = $self->deparse($false, 0);
- return "if ($cond) {\n\t$true\n\b}${cuddle}else {\n\t$false\n\b}\cK";
+ return $head . join($cuddle, "", @elsifs) . $false;
}
-sub pp_leaveloop {
+sub loop_common {
my $self = shift;
- my($op, $cx) = @_;
+ my($op, $cx, $init) = @_;
my $enter = $op->first;
my $kid = $enter->sibling;
local($self->{'curstash'}) = $self->{'curstash'};
my $head = "";
my $bare = 0;
+ my $body;
+ my $cond = undef;
if ($kid->name eq "lineseq") { # bare or infinite loop
if (is_state $kid->last) { # infinite
$head = "for (;;) "; # shorter than while (1)
+ $cond = "";
} else {
$bare = 1;
}
+ $body = $kid;
} elsif ($enter->name eq "enteriter") { # foreach
my $ary = $enter->first->sibling; # first was pushmark
my $var = $ary->sibling;
@@ -1737,62 +1776,60 @@ sub pp_leaveloop {
$var = "\$" . $self->deparse($var, 1);
}
$head = "foreach $var ($ary) ";
- $kid = $kid->first->first->sibling; # skip OP_AND and OP_ITER
+ $body = $kid->first->first->sibling; # skip OP_AND and OP_ITER
} elsif ($kid->name eq "null") { # while/until
$kid = $kid->first;
- my $name = {"and" => "while", "or" => "until"}
- ->{$kid->name};
- $head = "$name (" . $self->deparse($kid->first, 1) . ") ";
- $kid = $kid->first->sibling;
+ my $name = {"and" => "while", "or" => "until"}->{$kid->name};
+ $cond = $self->deparse($kid->first, 1);
+ $head = "$name ($cond) ";
+ $body = $kid->first->sibling;
} 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
- # by `next BLOCK' points to its first OP, which happens to be the
- # the op_next of the head of the _previous_ statement.
- # Unless it's a bare loop, in which case it's last, since there's
- # no unstack or extra nextstate.
- # Except if the previous head isn't null but the first kid is
- # (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 $precont;
- my $cont = $kid->first;
- if ($bare) {
- while (!null($cont->sibling)) {
- $precont = $cont;
- $cont = $cont->sibling;
- }
- } else {
- while (!null($cont->sibling->sibling->sibling)) {
- $precont = $cont;
- $cont = $cont->sibling;
+ # If there isn't a continue block, then the next pointer for the loop
+ # will point to the unstack, which is kid's penultimate child, except
+ # in a bare loop, when it will point to the leaveloop. When neither of
+ # these conditions hold, then the third-to-last child in the continue
+ # block (or the last in a bare loop).
+ my $cont_start = $enter->nextop;
+ my $cont;
+ if ($$cont_start != $$op and $ {$cont_start->sibling} != $ {$body->last}) {
+ if ($bare) {
+ $cont = $body->last;
+ } else {
+ $cont = $body->first;
+ while (!null($cont->sibling->sibling->sibling)) {
+ $cont = $cont->sibling;
+ }
+ }
+ my $state = $body->first;
+ my $cuddle = $self->{'cuddle'};
+ my @states;
+ for (; $$state != $$cont; $state = $state->sibling) {
+ push @states, $state;
+ }
+ $body = $self->lineseq(@states);
+ if (defined $cond and not is_scope $cont and $self->{'expand'} < 3) {
+ $head = "for ($init; $cond; " . $self->deparse($cont, 1) .") ";
+ $cont = "\cK";
+ } else {
+ $cont = $cuddle . "continue {\n\t" .
+ $self->deparse($cont, 0) . "\n\b}\cK";
}
- }
- if ($precont and $ {$precont->next} == $ {$enter->nextop}
- || $ {$precont->next} == $ {$enter->nextop->next} )
- {
- my $state = $kid->first;
- my $cuddle = $self->{'cuddle'};
- my($expr, @exprs);
- for (; $$state != $$cont; $state = $state->sibling) {
- $expr = "";
- if (is_state $state) {
- $expr = $self->deparse($state, 0);
- $state = $state->sibling;
- last if null $kid;
- }
- $expr .= $self->deparse($state, 0);
- push @exprs, $expr if $expr;
- }
- $kid = join(";\n", @exprs);
- $cont = $cuddle . "continue {\n\t" .
- $self->deparse($cont, 0) . "\n\b}\cK";
} else {
$cont = "\cK";
- $kid = $self->deparse($kid, 0);
+ $body = $self->deparse($body, 0);
}
- return $head . "{\n\t" . $kid . "\n\b}" . $cont;
+ return $head . "{\n\t" . $body . "\n\b}" . $cont;
+}
+
+sub pp_leaveloop { loop_common(@_, "") }
+
+sub for_loop {
+ my $self = shift;
+ my($op, $cx) = @_;
+ my $init = $self->deparse($op, 1);
+ return $self->loop_common($op->sibling, $cx, $init);
}
sub pp_leavetry {
@@ -1814,7 +1851,7 @@ sub pp_null {
} elsif ($op->first->name eq "enter") {
return $self->pp_leave($op, $cx);
} elsif ($op->targ == OP_STRINGIFY) {
- return $self->dquote($op);
+ return $self->dquote($op, $cx);
} elsif (!null($op->first->sibling) and
$op->first->sibling->name eq "readline" and
$op->first->sibling->flags & OPf_STACKED) {
@@ -1832,21 +1869,10 @@ 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;
- my $str = $self->padname_sv($targ)->PV;
- return padname_fix($str);
+ return $self->padname_sv($targ)->PVX;
}
sub padany {
@@ -1879,37 +1905,34 @@ sub pp_threadsv {
return $self->maybe_local($op, $cx, "\$" . $threadsv_names[$op->targ]);
}
-sub maybe_padgv {
+sub gv_or_padgv {
my $self = shift;
my $op = shift;
- my $gv;
- if ($Config{useithreads}) {
- $gv = $self->padval($op->padix);
- }
- else {
- $gv = $op->gv;
+ if (class($op) eq "PADOP") {
+ return $self->padval($op->padix);
+ } else { # class($op) eq "SVOP"
+ return $op->gv;
}
- return $gv;
}
sub pp_gvsv {
my $self = shift;
my($op, $cx) = @_;
- my $gv = $self->maybe_padgv($op);
+ my $gv = $self->gv_or_padgv($op);
return $self->maybe_local($op, $cx, "\$" . $self->gv_name($gv));
}
sub pp_gv {
my $self = shift;
my($op, $cx) = @_;
- my $gv = $self->maybe_padgv($op);
+ my $gv = $self->gv_or_padgv($op);
return $self->gv_name($gv);
}
sub pp_aelemfast {
my $self = shift;
my($op, $cx) = @_;
- my $gv = $self->maybe_padgv($op);
+ my $gv = $self->gv_or_padgv($op);
return "\$" . $self->gv_name($gv) . "[" . $op->private . "]";
}
@@ -2220,7 +2243,7 @@ sub pp_entersub {
$amper = "&";
$kid = "{" . $self->deparse($kid, 0) . "}";
} elsif ($kid->first->name eq "gv") {
- my $gv = $self->maybe_padgv($kid->first);
+ my $gv = $self->gv_or_padgv($kid->first);
if (class($gv->CV) ne "SPECIAL") {
$proto = $gv->CV->PV if $gv->CV->FLAGS & SVf_POK;
}
@@ -2252,9 +2275,9 @@ sub pp_entersub {
} else {
if (defined $proto and $proto eq "") {
return $kid;
- } elsif ($proto eq "\$") {
+ } elsif (defined $proto and $proto eq "\$") {
return $self->maybe_parens_func($kid, $args, $cx, 16);
- } elsif ($proto or $simple) {
+ } elsif (defined($proto) && $proto or $simple) {
return $self->maybe_parens_func($kid, $args, $cx, 5);
} else {
return "$kid(" . $args . ")";
@@ -2350,7 +2373,7 @@ sub const {
if (class($sv) eq "SPECIAL") {
return ('undef', '1', '0')[$$sv-1]; # sv_undef, sv_yes, sv_no
} elsif ($sv->FLAGS & SVf_IOK) {
- return $sv->IV;
+ return $sv->int_value;
} elsif ($sv->FLAGS & SVf_NOK) {
return $sv->NV;
} elsif ($sv->FLAGS & SVf_ROK) {
@@ -2381,7 +2404,9 @@ sub pp_const {
# return $self->const_sv($op)->PV;
# }
my $sv = $self->const_sv($op);
- return const($sv);
+# return const($sv);
+ my $c = const $sv;
+ return $c =~ /^-\d/ ? $self->maybe_parens($c, $cx, 21) : $c;
}
sub dq {
@@ -2391,7 +2416,13 @@ sub dq {
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);
+ my $first = $self->dq($op->first);
+ my $last = $self->dq($op->last);
+ # Disambiguate "${foo}bar", "${foo}{bar}", "${foo}[1]"
+ if ($last =~ /^[{\[\w]/) {
+ $first =~ s/([%\$@])([A-Za-z_]\w*)$/${1}{$2}/;
+ }
+ return $first . $last;
} elsif ($type eq "uc") {
return '\U' . $self->dq($op->first->sibling) . '\E';
} elsif ($type eq "lc") {
@@ -2418,7 +2449,7 @@ sub pp_backtick {
sub dquote {
my $self = shift;
- my($op, $cx) = shift;
+ my($op, $cx) = @_;
my $kid = $op->first->sibling; # skip ex-stringify, pushmark
return $self->deparse($kid, $cx) if $self->{'unquote'};
$self->maybe_targmy($kid, $cx,
@@ -2486,7 +2517,7 @@ sub pchr { # ASCII
sub collapse {
my(@chars) = @_;
- my($c, $str, $tr);
+ my($str, $c, $tr) = ("");
for ($c = 0; $c < @chars; $c++) {
$tr = $chars[$c];
$str .= pchr($tr);
@@ -2539,7 +2570,7 @@ sub tr_decode_byte {
}
@from = @newfrom;
}
- unless ($flags & OPpTRANS_DELETE) {
+ unless ($flags & OPpTRANS_DELETE || !@to) {
pop @to while $#to and $to[$#to] == $to[$#to -1];
}
my($from, $to);
@@ -2678,9 +2709,15 @@ sub re_dq {
my $op = shift;
my $type = $op->name;
if ($type eq "const") {
- return uninterp($self->const_sv($op)->PV);
+ return re_uninterp($self->const_sv($op)->PV);
} elsif ($type eq "concat") {
- return $self->re_dq($op->first) . $self->re_dq($op->last);
+ my $first = $self->re_dq($op->first);
+ my $last = $self->re_dq($op->last);
+ # Disambiguate "${foo}bar", "${foo}{bar}", "${foo}[1]"
+ if ($last =~ /^[{\[\w]/) {
+ $first =~ s/([%\$@])([A-Za-z_]\w*)$/${1}{$2}/;
+ }
+ return $first . $last;
} elsif ($type eq "uc") {
return '\U' . $self->re_dq($op->first->sibling) . '\E';
} elsif ($type eq "lc") {
@@ -2842,8 +2879,8 @@ B::Deparse - Perl compiler backend to produce perl code
=head1 SYNOPSIS
-B<perl> B<-MO=Deparse>[B<,-u>I<PACKAGE>][B<,-p>][B<,-q>][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>][B<,-x>I<LEVEL>] I<prog.pl>
=head1 DESCRIPTION
@@ -2988,6 +3025,55 @@ file is compiled as a main program.
=back
+=item B<-x>I<LEVEL>
+
+Expand conventional syntax constructions into equivalent ones that expose
+their internal operation. I<LEVEL> should be a digit, with higher values
+meaning more expansion. As with B<-q>, this actually involves turning off
+special cases in B::Deparse's normal operations.
+
+If I<LEVEL> is at least 3, for loops will be translated into equivalent
+while loops with continue blocks; for instance
+
+ for ($i = 0; $i < 10; ++$i) {
+ print $i;
+ }
+
+turns into
+
+ $i = 0;
+ while ($i < 10) {
+ print $i;
+ } continue {
+ ++$i
+ }
+
+Note that in a few cases this translation can't be perfectly carried back
+into the source code -- if the loop's initializer declares a my variable,
+for instance, it won't have the correct scope outside of the loop.
+
+If I<LEVEL> is at least 7, if statements will be translated into equivalent
+expressions using C<&&>, C<?:> and C<do {}>; for instance
+
+ print 'hi' if $nice;
+ if ($nice) {
+ print 'hi';
+ }
+ if ($nice) {
+ print 'hi';
+ } else {
+ print 'bye';
+ }
+
+turns into
+
+ $nice and print 'hi';
+ $nice and do { print 'hi' };
+ $nice ? do { print 'hi' } : do { print 'bye' };
+
+Long sequences of elsifs will turn into nested ternary operators, which
+B::Deparse doesn't know how to indent nicely.
+
=back
=head1 USING B::Deparse AS A MODULE
@@ -3034,7 +3120,7 @@ See the 'to do' list at the beginning of the module file.
=head1 AUTHOR
-Stephen McCamant <smccam@uclink4.berkeley.edu>, based on an earlier
+Stephen McCamant <smcc@CSUA.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.
diff --git a/gnu/usr.bin/perl/ext/B/B/Disassembler.pm b/gnu/usr.bin/perl/ext/B/B/Disassembler.pm
index d054a2d1647..212532b9ce9 100644
--- a/gnu/usr.bin/perl/ext/B/B/Disassembler.pm
+++ b/gnu/usr.bin/perl/ext/B/B/Disassembler.pm
@@ -31,6 +31,13 @@ sub GET_U16 {
return unpack("n", $str);
}
+sub GET_NV {
+ my $fh = shift;
+ my $str = $fh->readn(8);
+ croak "reached EOF while reading NV" unless length($str) == 8;
+ return unpack("N", $str);
+}
+
sub GET_U32 {
my $fh = shift;
my $str = $fh->readn(4);
diff --git a/gnu/usr.bin/perl/ext/B/B/Lint.pm b/gnu/usr.bin/perl/ext/B/B/Lint.pm
index ed0d07dfcbd..094b3cf8fd0 100644
--- a/gnu/usr.bin/perl/ext/B/B/Lint.pm
+++ b/gnu/usr.bin/perl/ext/B/B/Lint.pm
@@ -116,7 +116,7 @@ Malcolm Beattie, mbeattie@sable.ox.ac.uk.
=cut
use strict;
-use B qw(walkoptree_slow main_root walksymtable svref_2object parents
+use B qw(walkoptree main_root walksymtable svref_2object parents
OPf_WANT_LIST OPf_WANT OPf_STACKED G_ARRAY
);
@@ -277,12 +277,12 @@ sub B::GV::lintcv {
return if !$$cv || $done_cv{$$cv}++;
my $root = $cv->ROOT;
#warn " root = $root (0x$$root)\n";#debug
- walkoptree_slow($root, "lint") if $$root;
+ walkoptree($root, "lint") if $$root;
}
sub do_lint {
my %search_pack;
- walkoptree_slow(main_root, "lint") if ${main_root()};
+ walkoptree(main_root, "lint") if ${main_root()};
# Now do subs in main
no strict qw(vars refs);
diff --git a/gnu/usr.bin/perl/ext/B/B/Showlex.pm b/gnu/usr.bin/perl/ext/B/B/Showlex.pm
index 648f95dcc0a..842ca3ee2b8 100644
--- a/gnu/usr.bin/perl/ext/B/B/Showlex.pm
+++ b/gnu/usr.bin/perl/ext/B/B/Showlex.pm
@@ -12,7 +12,24 @@ use B::Terse ();
# to see the names of file scope lexicals used by bar.pl
#
-sub showarray {
+sub shownamearray {
+ my ($name, $av) = @_;
+ my @els = $av->ARRAY;
+ my $count = @els;
+ my $i;
+ print "$name has $count entries\n";
+ for ($i = 0; $i < $count; $i++) {
+ print "$i: ";
+ my $sv = $els[$i];
+ if (class($sv) ne "SPECIAL") {
+ printf "%s (0x%lx) %s\n", class($sv), $$sv, $sv->PVX;
+ } else {
+ $sv->terse;
+ }
+ }
+}
+
+sub showvaluearray {
my ($name, $av) = @_;
my @els = $av->ARRAY;
my $count = @els;
@@ -26,8 +43,8 @@ sub showarray {
sub showlex {
my ($objname, $namesav, $valsav) = @_;
- showarray("Pad of lexical names for $objname", $namesav);
- showarray("Pad of lexical values for $objname", $valsav);
+ shownamearray("Pad of lexical names for $objname", $namesav);
+ showvaluearray("Pad of lexical values for $objname", $valsav);
}
sub showlex_obj {
diff --git a/gnu/usr.bin/perl/ext/B/B/Stash.pm b/gnu/usr.bin/perl/ext/B/B/Stash.pm
index 0a3543eed41..f3a82478777 100644
--- a/gnu/usr.bin/perl/ext/B/B/Stash.pm
+++ b/gnu/usr.bin/perl/ext/B/B/Stash.pm
@@ -2,11 +2,19 @@
# vishalb@hotmail.com
package B::Stash;
+=pod
+
+=head1 NAME
+
+B::Stash - show what stashes are loaded
+
+=cut
+
BEGIN { %Seen = %INC }
CHECK {
my @arr=scan($main::{"main::"});
- @arr=map{s/\:\:$//;$_;} @arr;
+ @arr=map{s/\:\:$//;$_ eq "<none>"?():$_;} @arr;
print "-umain,-u", join (",-u",@arr) ,"\n";
}
sub scan{
diff --git a/gnu/usr.bin/perl/ext/B/B/Terse.pm b/gnu/usr.bin/perl/ext/B/B/Terse.pm
index 66b5cfc2f2f..52f0549911e 100644
--- a/gnu/usr.bin/perl/ext/B/B/Terse.pm
+++ b/gnu/usr.bin/perl/ext/B/B/Terse.pm
@@ -1,7 +1,7 @@
package B::Terse;
use strict;
-use B qw(peekop class walkoptree_slow walkoptree_exec
- main_start main_root cstring svref_2object);
+use B qw(peekop class walkoptree walkoptree_exec walkoptree_slow
+ main_start main_root cstring svref_2object SVf_IVisUV);
use B::Asmdata qw(@specialsv_name);
sub terse {
@@ -15,7 +15,7 @@ sub terse {
}
sub compile {
- my $order = shift;
+ my $order = @_ ? shift : "";
my @options = @_;
B::clearsym();
if (@options) {
@@ -37,7 +37,7 @@ sub compile {
}
sub indent {
- my $level = shift;
+ my $level = @_ ? shift : 0;
return " " x $level;
}
@@ -102,13 +102,14 @@ sub B::GV::terse {
$stash = $stash . "::";
}
print indent($level);
- printf "%s (0x%lx) *%s%s\n", class($gv), $$gv, $stash, $gv->NAME;
+ printf "%s (0x%lx) *%s%s\n", class($gv), $$gv, $stash, $gv->SAFENAME;
}
sub B::IV::terse {
my ($sv, $level) = @_;
print indent($level);
- printf "%s (0x%lx) %d\n", class($sv), $$sv, $sv->IV;
+ my $v = $sv->FLAGS & SVf_IVisUV ? "%u" : "%d";
+ printf "%s (0x%lx) $v\n", class($sv), $$sv, $sv->int_value;
}
sub B::NV::terse {
diff --git a/gnu/usr.bin/perl/ext/B/Makefile.PL b/gnu/usr.bin/perl/ext/B/Makefile.PL
index cb9696bf416..dcf6a1db15b 100644
--- a/gnu/usr.bin/perl/ext/B/Makefile.PL
+++ b/gnu/usr.bin/perl/ext/B/Makefile.PL
@@ -1,5 +1,6 @@
use ExtUtils::MakeMaker;
use Config;
+use File::Spec;
my $e = $Config{'exe_ext'};
my $o = $Config{'obj_ext'};
@@ -29,8 +30,19 @@ sub post_constants {
"\nLIBS = $Config::Config{libs}\n"
}
-sub postamble {
-'
-B$(OBJ_EXT) : defsubs.h
-'
+sub upupfile {
+ File::Spec->catfile(File::Spec->updir,
+ File::Spec->updir, $_[0]);
+}
+
+sub MY::postamble {
+ my $op_h = upupfile('op.h');
+ my $cop_h = upupfile('cop.h');
+ my $noecho = shift->{NOECHO};
+"
+B\$(OBJ_EXT) : defsubs.h
+
+defsubs.h :: $op_h $cop_h
+ $noecho \$(NOOP)
+"
}
diff --git a/gnu/usr.bin/perl/ext/B/O.pm b/gnu/usr.bin/perl/ext/B/O.pm
index 352f8d42069..2ef91edbd92 100644
--- a/gnu/usr.bin/perl/ext/B/O.pm
+++ b/gnu/usr.bin/perl/ext/B/O.pm
@@ -1,5 +1,5 @@
package O;
-use B qw(minus_c);
+use B qw(minus_c save_BEGINs);
use Carp;
sub import {
@@ -11,6 +11,7 @@ sub import {
my $compilesub = &{"B::${backend}::compile"}(@options);
if (ref($compilesub) eq "CODE") {
minus_c;
+ save_BEGINs;
eval 'CHECK { &$compilesub() }';
} else {
die $compilesub;
diff --git a/gnu/usr.bin/perl/ext/B/defsubs_h.PL b/gnu/usr.bin/perl/ext/B/defsubs_h.PL
index 80ef936fcec..da6566b0d71 100644
--- a/gnu/usr.bin/perl/ext/B/defsubs_h.PL
+++ b/gnu/usr.bin/perl/ext/B/defsubs_h.PL
@@ -6,16 +6,23 @@ 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
+foreach my $const (qw(
+ AVf_REAL
HEf_SVKEY
+ SVf_READONLY SVTYPEMASK
+ GVf_IMPORTED_AV GVf_IMPORTED_HV
+ GVf_IMPORTED_SV GVf_IMPORTED_CV
+ CVf_METHOD CVf_LOCKED CVf_LVALUE
SVf_IOK SVf_IVisUV SVf_NOK SVf_POK
- SVf_ROK SVp_IOK SVp_POK ))
+ SVf_ROK SVp_IOK SVp_POK SVp_NOK
+ ))
{
doconst($const);
}
foreach my $file (qw(op.h cop.h))
{
- open(OPH,"../../$file") || die "Cannot open ../../$file:$!";
+ my $path = $^O eq 'MacOS' ? ":::$file" : "../../$file";
+ open(OPH,"$path") || die "Cannot open $path:$!";
while (<OPH>)
{
doconst($1) if (/#define\s+(\w+)\s+([\(\)\|\dx]+)\s*(?:$|\/\*)/);
diff --git a/gnu/usr.bin/perl/ext/B/ramblings/flip-flop b/gnu/usr.bin/perl/ext/B/ramblings/flip-flop
index e0cb8ff6205..e08333d172d 100644
--- a/gnu/usr.bin/perl/ext/B/ramblings/flip-flop
+++ b/gnu/usr.bin/perl/ext/B/ramblings/flip-flop
@@ -9,13 +9,13 @@ PP(pp_range)
}
pp_range is a LOGOP.
-In array context, it just returns op_next.
+In list context, it just returns op_next.
In scalar context it checks the truth of targ and returns
op_other if true, op_next if false.
flip is an UNOP.
It "looks after" its child which is always a pp_range LOGOP.
-In array context, it just returns the child's op_other.
+In list 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_other.
diff --git a/gnu/usr.bin/perl/ext/ByteLoader/ByteLoader.pm b/gnu/usr.bin/perl/ext/ByteLoader/ByteLoader.pm
index 286d74697ee..9c8c84d677c 100644
--- a/gnu/usr.bin/perl/ext/ByteLoader/ByteLoader.pm
+++ b/gnu/usr.bin/perl/ext/ByteLoader/ByteLoader.pm
@@ -2,7 +2,7 @@ package ByteLoader;
use XSLoader ();
-$VERSION = 0.03;
+$VERSION = 0.04;
XSLoader::load 'ByteLoader', $VERSION;
@@ -17,10 +17,10 @@ ByteLoader - load byte compiled perl code
=head1 SYNOPSIS
- use ByteLoader 0.03;
+ use ByteLoader 0.04;
<byte code>
- use ByteLoader 0.03;
+ use ByteLoader 0.04;
<byte code>
=head1 DESCRIPTION
diff --git a/gnu/usr.bin/perl/ext/ByteLoader/ByteLoader.xs b/gnu/usr.bin/perl/ext/ByteLoader/ByteLoader.xs
index 7c3746bba70..05b795ca25d 100644
--- a/gnu/usr.bin/perl/ext/ByteLoader/ByteLoader.xs
+++ b/gnu/usr.bin/perl/ext/ByteLoader/ByteLoader.xs
@@ -4,47 +4,95 @@
#include "XSUB.h"
#include "byterun.h"
-static int
-xgetc(PerlIO *io)
-{
- dTHX;
- return PerlIO_getc(io);
-}
+/* Something arbitary for a buffer size */
+#define BYTELOADER_BUFFER 8096
-static int
-xfread(char *buf, size_t size, size_t n, PerlIO *io)
+int
+bl_getc(struct byteloader_fdata *data)
{
dTHX;
- int i = PerlIO_read(io, buf, n * size);
- if (i > 0)
- i /= size;
- return i;
+ if (SvCUR(data->datasv) <= data->next_out) {
+ int result;
+ /* Run out of buffered data, so attempt to read some more */
+ *(SvPV_nolen (data->datasv)) = '\0';
+ SvCUR_set (data->datasv, 0);
+ data->next_out = 0;
+ result = FILTER_READ (data->idx + 1, data->datasv, BYTELOADER_BUFFER);
+
+ /* Filter returned error, or we got EOF and no data, then return EOF.
+ Not sure if filter is allowed to return EOF and add data simultaneously
+ Think not, but will bullet proof against it. */
+ if (result < 0 || SvCUR(data->datasv) == 0)
+ return EOF;
+ /* Else there must be at least one byte present, which is good enough */
+ }
+
+ return *((char *) SvPV_nolen (data->datasv) + data->next_out++);
}
-static void
-freadpv(U32 len, void *data, XPV *pv)
+int
+bl_read(struct byteloader_fdata *data, char *buf, size_t size, size_t n)
{
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;
+ char *start;
+ STRLEN len;
+ size_t wanted = size * n;
+
+ start = SvPV (data->datasv, len);
+ if (len < (data->next_out + wanted)) {
+ int result;
+
+ /* Shuffle data to start of buffer */
+ len -= data->next_out;
+ if (len) {
+ memmove (start, start + data->next_out, len + 1);
+ SvCUR_set (data->datasv, len);
+ } else {
+ *start = '\0'; /* Avoid call to memmove. */
+ SvCUR_set (data->datasv, 0);
+ }
+ data->next_out = 0;
+
+ /* Attempt to read more data. */
+ do {
+ result = FILTER_READ (data->idx + 1, data->datasv, BYTELOADER_BUFFER);
+
+ start = SvPV (data->datasv, len);
+ } while (result > 0 && len < wanted);
+ /* Loop while not (EOF || error) and short reads */
+
+ /* If not enough data read, truncate copy */
+ if (wanted > len)
+ wanted = len;
+ }
+
+ if (wanted > 0) {
+ memcpy (buf, start + data->next_out, wanted);
+ data->next_out += wanted;
+ wanted /= size;
+ }
+ return (int) wanted;
}
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;
+ struct byteloader_state bstate;
+ struct byteloader_fdata data;
+
+ data.next_out = 0;
+ data.datasv = FILTER_DATA(idx);
+ data.idx = idx;
- bs.data = PL_rsfp;
- bs.pfgetc = (int(*) (void*))xgetc;
- bs.pfread = (int(*) (char*,size_t,size_t,void*))xfread;
- bs.pfreadpv = freadpv;
+ bstate.bs_fdata = &data;
+ bstate.bs_obj_list = Null(void**);
+ bstate.bs_obj_list_fill = -1;
+ bstate.bs_sv = Nullsv;
+ bstate.bs_iv_overflows = 0;
- byterun(aTHXo_ bs);
+ byterun(aTHXo_ &bstate);
if (PL_in_eval) {
OP *o;
@@ -70,8 +118,12 @@ PROTOTYPES: ENABLE
void
import(...)
+ PREINIT:
+ SV *sv = newSVpvn ("", 0);
PPCODE:
- filter_add(byteloader_filter, NULL);
+ if (!sv)
+ croak ("Could not allocate ByteLoader buffers");
+ filter_add(byteloader_filter, sv);
void
unimport(...)
diff --git a/gnu/usr.bin/perl/ext/ByteLoader/bytecode.h b/gnu/usr.bin/perl/ext/ByteLoader/bytecode.h
index 1621fed4eba..c6acd28436d 100644
--- a/gnu/usr.bin/perl/ext/ByteLoader/bytecode.h
+++ b/gnu/usr.bin/perl/ext/ByteLoader/bytecode.h
@@ -5,29 +5,33 @@ typedef char *op_tr_array;
typedef int comment_t;
typedef SV *svindex;
typedef OP *opindex;
+typedef char *pvindex;
typedef IV IV64;
#define BGET_FREAD(argp, len, nelem) \
- bs.pfread((char*)(argp),(len),(nelem),bs.data)
-#define BGET_FGETC() bs.pfgetc(bs.data)
+ bl_read(bstate->bs_fdata,(char*)(argp),(len),(nelem))
+#define BGET_FGETC() bl_getc(bstate->bs_fdata)
#define BGET_U32(arg) \
- BGET_FREAD(&arg, sizeof(U32), 1); arg = PerlSock_ntohl((U32)arg)
+ BGET_FREAD(&arg, sizeof(U32), 1)
#define BGET_I32(arg) \
- BGET_FREAD(&arg, sizeof(I32), 1); arg = (I32)PerlSock_ntohl((U32)arg)
+ BGET_FREAD(&arg, sizeof(I32), 1)
#define BGET_U16(arg) \
- BGET_FREAD(&arg, sizeof(U16), 1); arg = PerlSock_ntohs((U16)arg)
+ BGET_FREAD(&arg, sizeof(U16), 1)
#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; \
- } \
+#define BGET_PV(arg) STMT_START { \
+ BGET_U32(arg); \
+ if (arg) { \
+ New(666, bstate->bs_pv.xpv_pv, arg, char); \
+ bl_read(bstate->bs_fdata, (void*)bstate->bs_pv.xpv_pv, arg, 1); \
+ bstate->bs_pv.xpv_len = arg; \
+ bstate->bs_pv.xpv_cur = arg - 1; \
+ } else { \
+ bstate->bs_pv.xpv_pv = 0; \
+ bstate->bs_pv.xpv_len = 0; \
+ bstate->bs_pv.xpv_cur = 0; \
+ } \
} STMT_END
#ifdef BYTELOADER_LOG_COMMENTS
@@ -63,22 +67,20 @@ typedef IV IV64;
arg = (I32)lo; \
} \
else { \
- bytecode_iv_overflows++; \
+ bstate->bs_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; \
+#define BGET_op_tr_array(arg) do { \
+ unsigned short *ary; \
+ int i; \
+ New(666, ary, 256, unsigned short); \
+ BGET_FREAD(ary, sizeof(unsigned short), 256); \
+ arg = (char *) ary; \
} while (0)
-#define BGET_pvcontents(arg) arg = bytecode_pv.xpv_pv
+#define BGET_pvcontents(arg) arg = bstate->bs_pv.xpv_pv
#define BGET_strconst(arg) STMT_START { \
for (arg = PL_tokenbuf; (*arg = BGET_FGETC()); arg++) /* nothing */; \
arg = PL_tokenbuf; \
@@ -91,14 +93,21 @@ typedef IV IV64;
} STMT_END
#define BGET_objindex(arg, type) STMT_START { \
- U32 ix; \
BGET_U32(ix); \
- arg = (type)bytecode_obj_list[ix]; \
+ arg = (type)bstate->bs_obj_list[ix]; \
} STMT_END
#define BGET_svindex(arg) BGET_objindex(arg, svindex)
#define BGET_opindex(arg) BGET_objindex(arg, opindex)
+#define BGET_pvindex(arg) STMT_START { \
+ BGET_objindex(arg, pvindex); \
+ arg = arg ? savepv(arg) : arg; \
+ } STMT_END
#define BSET_ldspecsv(sv, arg) sv = specialsv_list[arg]
+#define BSET_stpv(pv, arg) STMT_START { \
+ BSET_OBJ_STORE(pv, arg); \
+ SAVEFREEPV(pv); \
+ } STMT_END
#define BSET_sv_refcnt_add(svrefcnt, arg) svrefcnt += arg
#define BSET_gp_refcnt_add(gprefcnt, arg) gprefcnt += arg
@@ -110,23 +119,29 @@ typedef IV IV64;
#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_mg_pv(mg, arg) mg->mg_ptr = arg; mg->mg_len = bstate->bs_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); \
+ SvPV_set(sv, bstate->bs_pv.xpv_pv); \
+ SvCUR_set(sv, bstate->bs_pv.xpv_cur); \
+ SvLEN_set(sv, bstate->bs_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)
+ hv_store((HV*)sv, bstate->bs_pv.xpv_pv, bstate->bs_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)
+ CALLREGCOMP(aTHX_ arg, arg + bstate->bs_pv.xpv_cur, ((PMOP*)o)) : 0
+#define BSET_newsv(sv, arg) \
+ STMT_START { \
+ sv = (arg == SVt_PVAV ? (SV*)newAV() : \
+ arg == SVt_PVHV ? (SV*)newHV() : \
+ NEWSV(666,0)); \
+ SvUPGRADE(sv, arg); \
+ } STMT_END
#define BSET_newop(o, arg) ((o = (OP*)safemalloc(optype_size[arg])), \
memzero((char*)o,optype_size[arg]))
#define BSET_newopn(o, arg) STMT_START { \
@@ -135,7 +150,10 @@ typedef IV IV64;
oldop->op_next = o; \
} STMT_END
-#define BSET_ret(foo) return
+#define BSET_ret(foo) STMT_START { \
+ Safefree(bstate->bs_obj_list); \
+ return; \
+ } STMT_END
/*
* Kludge special-case workaround for OP_MAPSTART
@@ -152,10 +170,88 @@ typedef IV IV64;
PL_comppad = (AV *)arg; \
pad = AvARRAY(arg); \
} STMT_END
+/* this works now that Sarathy's changed the CopFILE_set macro to do the SvREFCNT_inc()
+ -- BKS 6-2-2000 */
#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)
+/* this is simply stolen from the code in newATTRSUB() */
+#define BSET_push_begin(ary,cv) \
+ STMT_START { \
+ I32 oldscope = PL_scopestack_ix; \
+ ENTER; \
+ SAVECOPFILE(&PL_compiling); \
+ SAVECOPLINE(&PL_compiling); \
+ save_svref(&PL_rs); \
+ sv_setsv(PL_rs, PL_nrs); \
+ if (!PL_beginav) \
+ PL_beginav = newAV(); \
+ av_push(PL_beginav, cv); \
+ call_list(oldscope, PL_beginav); \
+ PL_curcop = &PL_compiling; \
+ PL_compiling.op_private = PL_hints; \
+ LEAVE; \
+ } STMT_END
+#define BSET_push_init(ary,cv) \
+ STMT_START { \
+ av_unshift((PL_initav ? PL_initav : (PL_initav = newAV(), PL_initav)), 1); \
+ av_store(PL_initav, 0, cv); \
+ } STMT_END
+#define BSET_push_end(ary,cv) \
+ STMT_START { \
+ av_unshift((PL_endav ? PL_endav : (PL_endav = newAV(), PL_endav)), 1); \
+ av_store(PL_endav, 0, cv); \
+ } STMT_END
+#define BSET_OBJ_STORE(obj, ix) \
+ (I32)ix > bstate->bs_obj_list_fill ? \
+ bset_obj_store(aTHXo_ bstate, obj, (I32)ix) : (bstate->bs_obj_list[ix] = obj)
+
+/* NOTE: the bytecode header only sanity-checks the bytecode. If a script cares about
+ * what version of Perl it's being called under, it should do a 'require 5.6.0' or
+ * equivalent. However, since the header includes checks requiring an exact match in
+ * ByteLoader versions (we can't guarantee forward compatibility), you don't
+ * need to specify one:
+ * use ByteLoader;
+ * is all you need.
+ * -- BKS, June 2000
+*/
+
+#define HEADER_FAIL(f) \
+ Perl_croak(aTHX_ "Invalid bytecode for this architecture: " f)
+#define HEADER_FAIL1(f, arg1) \
+ Perl_croak(aTHX_ "Invalid bytecode for this architecture: " f, arg1)
+#define HEADER_FAIL2(f, arg1, arg2) \
+ Perl_croak(aTHX_ "Invalid bytecode for this architecture: " f, arg1, arg2)
+
+#define BYTECODE_HEADER_CHECK \
+ STMT_START { \
+ U32 sz = 0; \
+ strconst str; \
+ \
+ BGET_U32(sz); /* Magic: 'PLBC' */ \
+ if (sz != 0x43424c50) { \
+ HEADER_FAIL1("bad magic (want 0x43424c50, got %#x)", (int)sz); \
+ } \
+ BGET_strconst(str); /* archname */ \
+ if (strNE(str, ARCHNAME)) { \
+ HEADER_FAIL2("wrong architecture (want %s, you have %s)",str,ARCHNAME); \
+ } \
+ BGET_strconst(str); /* ByteLoader version */ \
+ if (strNE(str, VERSION)) { \
+ HEADER_FAIL2("mismatched ByteLoader versions (want %s, you have %s)", \
+ str, VERSION); \
+ } \
+ BGET_U32(sz); /* ivsize */ \
+ if (sz != IVSIZE) { \
+ HEADER_FAIL("different IVSIZE"); \
+ } \
+ BGET_U32(sz); /* ptrsize */ \
+ if (sz != PTRSIZE) { \
+ HEADER_FAIL("different PTRSIZE"); \
+ } \
+ BGET_strconst(str); /* byteorder */ \
+ if (strNE(str, STRINGIFY(BYTEORDER))) { \
+ HEADER_FAIL("different byteorder"); \
+ } \
+ } STMT_END
diff --git a/gnu/usr.bin/perl/ext/ByteLoader/byterun.c b/gnu/usr.bin/perl/ext/ByteLoader/byterun.c
index a1044ab2c0f..71cd8aa0849 100644
--- a/gnu/usr.bin/perl/ext/ByteLoader/byterun.c
+++ b/gnu/usr.bin/perl/ext/ByteLoader/byterun.c
@@ -26,7 +26,7 @@
#include "bytecode.h"
-static int optype_size[] = {
+static const int optype_size[] = {
sizeof(OP),
sizeof(UNOP),
sizeof(BINOP),
@@ -40,38 +40,34 @@ static int optype_size[] = {
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)
+bset_obj_store(pTHXo_ struct byteloader_state *bstate, 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;
+ if (ix > bstate->bs_obj_list_fill) {
+ Renew(bstate->bs_obj_list, ix + 32, void*);
+ bstate->bs_obj_list_fill = ix + 31;
}
- bytecode_obj_list[ix] = obj;
+ bstate->bs_obj_list[ix] = obj;
return obj;
}
void
-byterun(pTHXo_ struct bytestream bs)
+byterun(pTHXo_ register struct byteloader_state *bstate)
{
- dTHR;
- int insn;
+ register int insn;
+ U32 ix;
+ SV *specialsv_list[6];
+
+ BYTECODE_HEADER_CHECK; /* croak if incorrect platform */
+ New(666, bstate->bs_obj_list, 32, void*); /* set op objlist */
+ bstate->bs_obj_list_fill = 31;
specialsv_list[0] = Nullsv;
specialsv_list[1] = &PL_sv_undef;
specialsv_list[2] = &PL_sv_yes;
specialsv_list[3] = &PL_sv_no;
+ specialsv_list[4] = pWARN_ALL;
+ specialsv_list[5] = pWARN_NONE;
while ((insn = BGET_FGETC()) != EOF) {
switch (insn) {
@@ -95,7 +91,7 @@ byterun(pTHXo_ struct bytestream bs)
{
svindex arg;
BGET_svindex(arg);
- bytecode_sv = arg;
+ bstate->bs_sv = arg;
break;
}
case INSN_LDOP: /* 2 */
@@ -109,7 +105,7 @@ byterun(pTHXo_ struct bytestream bs)
{
U32 arg;
BGET_U32(arg);
- BSET_OBJ_STORE(bytecode_sv, arg);
+ BSET_OBJ_STORE(bstate->bs_sv, arg);
break;
}
case INSN_STOP: /* 4 */
@@ -119,610 +115,610 @@ byterun(pTHXo_ struct bytestream bs)
BSET_OBJ_STORE(PL_op, arg);
break;
}
- case INSN_LDSPECSV: /* 5 */
+ case INSN_STPV: /* 5 */
+ {
+ U32 arg;
+ BGET_U32(arg);
+ BSET_stpv(bstate->bs_pv.xpv_pv, arg);
+ break;
+ }
+ case INSN_LDSPECSV: /* 6 */
{
U8 arg;
BGET_U8(arg);
- BSET_ldspecsv(bytecode_sv, arg);
+ BSET_ldspecsv(bstate->bs_sv, arg);
break;
}
- case INSN_NEWSV: /* 6 */
+ case INSN_NEWSV: /* 7 */
{
U8 arg;
BGET_U8(arg);
- BSET_newsv(bytecode_sv, arg);
+ BSET_newsv(bstate->bs_sv, arg);
break;
}
- case INSN_NEWOP: /* 7 */
+ case INSN_NEWOP: /* 8 */
{
U8 arg;
BGET_U8(arg);
BSET_newop(PL_op, arg);
break;
}
- case INSN_NEWOPN: /* 8 */
+ case INSN_NEWOPN: /* 9 */
{
U8 arg;
BGET_U8(arg);
BSET_newopn(PL_op, arg);
break;
}
- case INSN_NEWPV: /* 9 */
+ case INSN_NEWPV: /* 11 */
{
PV arg;
BGET_PV(arg);
break;
}
- case INSN_PV_CUR: /* 11 */
+ case INSN_PV_CUR: /* 12 */
{
STRLEN arg;
BGET_U32(arg);
- bytecode_pv.xpv_cur = arg;
+ bstate->bs_pv.xpv_cur = arg;
break;
}
- case INSN_PV_FREE: /* 12 */
+ case INSN_PV_FREE: /* 13 */
{
- BSET_pv_free(bytecode_pv);
+ BSET_pv_free(bstate->bs_pv);
break;
}
- case INSN_SV_UPGRADE: /* 13 */
+ case INSN_SV_UPGRADE: /* 14 */
{
char arg;
BGET_U8(arg);
- BSET_sv_upgrade(bytecode_sv, arg);
+ BSET_sv_upgrade(bstate->bs_sv, arg);
break;
}
- case INSN_SV_REFCNT: /* 14 */
+ case INSN_SV_REFCNT: /* 15 */
{
U32 arg;
BGET_U32(arg);
- SvREFCNT(bytecode_sv) = arg;
+ SvREFCNT(bstate->bs_sv) = arg;
break;
}
- case INSN_SV_REFCNT_ADD: /* 15 */
+ case INSN_SV_REFCNT_ADD: /* 16 */
{
I32 arg;
BGET_I32(arg);
- BSET_sv_refcnt_add(SvREFCNT(bytecode_sv), arg);
+ BSET_sv_refcnt_add(SvREFCNT(bstate->bs_sv), arg);
break;
}
- case INSN_SV_FLAGS: /* 16 */
+ case INSN_SV_FLAGS: /* 17 */
{
U32 arg;
BGET_U32(arg);
- SvFLAGS(bytecode_sv) = arg;
+ SvFLAGS(bstate->bs_sv) = arg;
break;
}
- case INSN_XRV: /* 17 */
+ case INSN_XRV: /* 18 */
{
svindex arg;
BGET_svindex(arg);
- SvRV(bytecode_sv) = arg;
+ SvRV(bstate->bs_sv) = arg;
break;
}
- case INSN_XPV: /* 18 */
+ case INSN_XPV: /* 19 */
{
- BSET_xpv(bytecode_sv);
+ BSET_xpv(bstate->bs_sv);
break;
}
- case INSN_XIV32: /* 19 */
+ case INSN_XIV32: /* 20 */
{
I32 arg;
BGET_I32(arg);
- SvIVX(bytecode_sv) = arg;
+ SvIVX(bstate->bs_sv) = arg;
break;
}
- case INSN_XIV64: /* 20 */
+ case INSN_XIV64: /* 21 */
{
IV64 arg;
BGET_IV64(arg);
- SvIVX(bytecode_sv) = arg;
+ SvIVX(bstate->bs_sv) = arg;
break;
}
- case INSN_XNV: /* 21 */
+ case INSN_XNV: /* 22 */
{
NV arg;
BGET_NV(arg);
- SvNVX(bytecode_sv) = arg;
+ SvNVX(bstate->bs_sv) = arg;
break;
}
- case INSN_XLV_TARGOFF: /* 22 */
+ case INSN_XLV_TARGOFF: /* 23 */
{
STRLEN arg;
BGET_U32(arg);
- LvTARGOFF(bytecode_sv) = arg;
+ LvTARGOFF(bstate->bs_sv) = arg;
break;
}
- case INSN_XLV_TARGLEN: /* 23 */
+ case INSN_XLV_TARGLEN: /* 24 */
{
STRLEN arg;
BGET_U32(arg);
- LvTARGLEN(bytecode_sv) = arg;
+ LvTARGLEN(bstate->bs_sv) = arg;
break;
}
- case INSN_XLV_TARG: /* 24 */
+ case INSN_XLV_TARG: /* 25 */
{
svindex arg;
BGET_svindex(arg);
- LvTARG(bytecode_sv) = arg;
+ LvTARG(bstate->bs_sv) = arg;
break;
}
- case INSN_XLV_TYPE: /* 25 */
+ case INSN_XLV_TYPE: /* 26 */
{
char arg;
BGET_U8(arg);
- LvTYPE(bytecode_sv) = arg;
+ LvTYPE(bstate->bs_sv) = arg;
break;
}
- case INSN_XBM_USEFUL: /* 26 */
+ case INSN_XBM_USEFUL: /* 27 */
{
I32 arg;
BGET_I32(arg);
- BmUSEFUL(bytecode_sv) = arg;
+ BmUSEFUL(bstate->bs_sv) = arg;
break;
}
- case INSN_XBM_PREVIOUS: /* 27 */
+ case INSN_XBM_PREVIOUS: /* 28 */
{
U16 arg;
BGET_U16(arg);
- BmPREVIOUS(bytecode_sv) = arg;
+ BmPREVIOUS(bstate->bs_sv) = arg;
break;
}
- case INSN_XBM_RARE: /* 28 */
+ case INSN_XBM_RARE: /* 29 */
{
U8 arg;
BGET_U8(arg);
- BmRARE(bytecode_sv) = arg;
+ BmRARE(bstate->bs_sv) = arg;
break;
}
- case INSN_XFM_LINES: /* 29 */
+ case INSN_XFM_LINES: /* 30 */
{
I32 arg;
BGET_I32(arg);
- FmLINES(bytecode_sv) = arg;
+ FmLINES(bstate->bs_sv) = arg;
break;
}
- case INSN_XIO_LINES: /* 30 */
+ case INSN_XIO_LINES: /* 31 */
{
long arg;
BGET_I32(arg);
- IoLINES(bytecode_sv) = arg;
+ IoLINES(bstate->bs_sv) = arg;
break;
}
- case INSN_XIO_PAGE: /* 31 */
+ case INSN_XIO_PAGE: /* 32 */
{
long arg;
BGET_I32(arg);
- IoPAGE(bytecode_sv) = arg;
+ IoPAGE(bstate->bs_sv) = arg;
break;
}
- case INSN_XIO_PAGE_LEN: /* 32 */
+ case INSN_XIO_PAGE_LEN: /* 33 */
{
long arg;
BGET_I32(arg);
- IoPAGE_LEN(bytecode_sv) = arg;
+ IoPAGE_LEN(bstate->bs_sv) = arg;
break;
}
- case INSN_XIO_LINES_LEFT: /* 33 */
+ case INSN_XIO_LINES_LEFT: /* 34 */
{
long arg;
BGET_I32(arg);
- IoLINES_LEFT(bytecode_sv) = arg;
+ IoLINES_LEFT(bstate->bs_sv) = arg;
break;
}
- case INSN_XIO_TOP_NAME: /* 34 */
+ case INSN_XIO_TOP_NAME: /* 36 */
{
pvcontents arg;
BGET_pvcontents(arg);
- IoTOP_NAME(bytecode_sv) = arg;
+ IoTOP_NAME(bstate->bs_sv) = arg;
break;
}
- case INSN_XIO_TOP_GV: /* 36 */
+ case INSN_XIO_TOP_GV: /* 37 */
{
svindex arg;
BGET_svindex(arg);
- *(SV**)&IoTOP_GV(bytecode_sv) = arg;
+ *(SV**)&IoTOP_GV(bstate->bs_sv) = arg;
break;
}
- case INSN_XIO_FMT_NAME: /* 37 */
+ case INSN_XIO_FMT_NAME: /* 38 */
{
pvcontents arg;
BGET_pvcontents(arg);
- IoFMT_NAME(bytecode_sv) = arg;
+ IoFMT_NAME(bstate->bs_sv) = arg;
break;
}
- case INSN_XIO_FMT_GV: /* 38 */
+ case INSN_XIO_FMT_GV: /* 39 */
{
svindex arg;
BGET_svindex(arg);
- *(SV**)&IoFMT_GV(bytecode_sv) = arg;
+ *(SV**)&IoFMT_GV(bstate->bs_sv) = arg;
break;
}
- case INSN_XIO_BOTTOM_NAME: /* 39 */
+ case INSN_XIO_BOTTOM_NAME: /* 40 */
{
pvcontents arg;
BGET_pvcontents(arg);
- IoBOTTOM_NAME(bytecode_sv) = arg;
+ IoBOTTOM_NAME(bstate->bs_sv) = arg;
break;
}
- case INSN_XIO_BOTTOM_GV: /* 40 */
+ case INSN_XIO_BOTTOM_GV: /* 41 */
{
svindex arg;
BGET_svindex(arg);
- *(SV**)&IoBOTTOM_GV(bytecode_sv) = arg;
+ *(SV**)&IoBOTTOM_GV(bstate->bs_sv) = arg;
break;
}
- case INSN_XIO_SUBPROCESS: /* 41 */
+ case INSN_XIO_SUBPROCESS: /* 42 */
{
short arg;
BGET_U16(arg);
- IoSUBPROCESS(bytecode_sv) = arg;
+ IoSUBPROCESS(bstate->bs_sv) = arg;
break;
}
- case INSN_XIO_TYPE: /* 42 */
+ case INSN_XIO_TYPE: /* 43 */
{
char arg;
BGET_U8(arg);
- IoTYPE(bytecode_sv) = arg;
+ IoTYPE(bstate->bs_sv) = arg;
break;
}
- case INSN_XIO_FLAGS: /* 43 */
+ case INSN_XIO_FLAGS: /* 44 */
{
char arg;
BGET_U8(arg);
- IoFLAGS(bytecode_sv) = arg;
+ IoFLAGS(bstate->bs_sv) = arg;
break;
}
- case INSN_XCV_STASH: /* 44 */
+ case INSN_XCV_STASH: /* 45 */
{
svindex arg;
BGET_svindex(arg);
- *(SV**)&CvSTASH(bytecode_sv) = arg;
+ *(SV**)&CvSTASH(bstate->bs_sv) = arg;
break;
}
- case INSN_XCV_START: /* 45 */
+ case INSN_XCV_START: /* 46 */
{
opindex arg;
BGET_opindex(arg);
- CvSTART(bytecode_sv) = arg;
+ CvSTART(bstate->bs_sv) = arg;
break;
}
- case INSN_XCV_ROOT: /* 46 */
+ case INSN_XCV_ROOT: /* 47 */
{
opindex arg;
BGET_opindex(arg);
- CvROOT(bytecode_sv) = arg;
+ CvROOT(bstate->bs_sv) = arg;
break;
}
- case INSN_XCV_GV: /* 47 */
+ case INSN_XCV_GV: /* 48 */
{
svindex arg;
BGET_svindex(arg);
- *(SV**)&CvGV(bytecode_sv) = arg;
+ *(SV**)&CvGV(bstate->bs_sv) = arg;
break;
}
- case INSN_XCV_FILE: /* 48 */
+ case INSN_XCV_FILE: /* 49 */
{
- pvcontents arg;
- BGET_pvcontents(arg);
- CvFILE(bytecode_sv) = arg;
+ pvindex arg;
+ BGET_pvindex(arg);
+ CvFILE(bstate->bs_sv) = arg;
break;
}
- case INSN_XCV_DEPTH: /* 49 */
+ case INSN_XCV_DEPTH: /* 50 */
{
long arg;
BGET_I32(arg);
- CvDEPTH(bytecode_sv) = arg;
+ CvDEPTH(bstate->bs_sv) = arg;
break;
}
- case INSN_XCV_PADLIST: /* 50 */
+ case INSN_XCV_PADLIST: /* 51 */
{
svindex arg;
BGET_svindex(arg);
- *(SV**)&CvPADLIST(bytecode_sv) = arg;
+ *(SV**)&CvPADLIST(bstate->bs_sv) = arg;
break;
}
- case INSN_XCV_OUTSIDE: /* 51 */
+ case INSN_XCV_OUTSIDE: /* 52 */
{
svindex arg;
BGET_svindex(arg);
- *(SV**)&CvOUTSIDE(bytecode_sv) = arg;
+ *(SV**)&CvOUTSIDE(bstate->bs_sv) = arg;
break;
}
- case INSN_XCV_FLAGS: /* 52 */
+ case INSN_XCV_FLAGS: /* 53 */
{
U16 arg;
BGET_U16(arg);
- CvFLAGS(bytecode_sv) = arg;
+ CvFLAGS(bstate->bs_sv) = arg;
break;
}
- case INSN_AV_EXTEND: /* 53 */
+ case INSN_AV_EXTEND: /* 54 */
{
SSize_t arg;
BGET_I32(arg);
- BSET_av_extend(bytecode_sv, arg);
+ BSET_av_extend(bstate->bs_sv, arg);
break;
}
- case INSN_AV_PUSH: /* 54 */
+ case INSN_AV_PUSH: /* 55 */
{
svindex arg;
BGET_svindex(arg);
- BSET_av_push(bytecode_sv, arg);
+ BSET_av_push(bstate->bs_sv, arg);
break;
}
- case INSN_XAV_FILL: /* 55 */
+ case INSN_XAV_FILL: /* 56 */
{
SSize_t arg;
BGET_I32(arg);
- AvFILLp(bytecode_sv) = arg;
+ AvFILLp(bstate->bs_sv) = arg;
break;
}
- case INSN_XAV_MAX: /* 56 */
+ case INSN_XAV_MAX: /* 57 */
{
SSize_t arg;
BGET_I32(arg);
- AvMAX(bytecode_sv) = arg;
+ AvMAX(bstate->bs_sv) = arg;
break;
}
- case INSN_XAV_FLAGS: /* 57 */
+ case INSN_XAV_FLAGS: /* 58 */
{
U8 arg;
BGET_U8(arg);
- AvFLAGS(bytecode_sv) = arg;
+ AvFLAGS(bstate->bs_sv) = arg;
break;
}
- case INSN_XHV_RITER: /* 58 */
+ case INSN_XHV_RITER: /* 59 */
{
I32 arg;
BGET_I32(arg);
- HvRITER(bytecode_sv) = arg;
+ HvRITER(bstate->bs_sv) = arg;
break;
}
- case INSN_XHV_NAME: /* 59 */
+ case INSN_XHV_NAME: /* 60 */
{
pvcontents arg;
BGET_pvcontents(arg);
- HvNAME(bytecode_sv) = arg;
+ HvNAME(bstate->bs_sv) = arg;
break;
}
- case INSN_HV_STORE: /* 60 */
+ case INSN_HV_STORE: /* 61 */
{
svindex arg;
BGET_svindex(arg);
- BSET_hv_store(bytecode_sv, arg);
+ BSET_hv_store(bstate->bs_sv, arg);
break;
}
- case INSN_SV_MAGIC: /* 61 */
+ case INSN_SV_MAGIC: /* 62 */
{
char arg;
BGET_U8(arg);
- BSET_sv_magic(bytecode_sv, arg);
+ BSET_sv_magic(bstate->bs_sv, arg);
break;
}
- case INSN_MG_OBJ: /* 62 */
+ case INSN_MG_OBJ: /* 63 */
{
svindex arg;
BGET_svindex(arg);
- SvMAGIC(bytecode_sv)->mg_obj = arg;
+ SvMAGIC(bstate->bs_sv)->mg_obj = arg;
break;
}
- case INSN_MG_PRIVATE: /* 63 */
+ case INSN_MG_PRIVATE: /* 64 */
{
U16 arg;
BGET_U16(arg);
- SvMAGIC(bytecode_sv)->mg_private = arg;
+ SvMAGIC(bstate->bs_sv)->mg_private = arg;
break;
}
- case INSN_MG_FLAGS: /* 64 */
+ case INSN_MG_FLAGS: /* 65 */
{
U8 arg;
BGET_U8(arg);
- SvMAGIC(bytecode_sv)->mg_flags = arg;
+ SvMAGIC(bstate->bs_sv)->mg_flags = arg;
break;
}
- case INSN_MG_PV: /* 65 */
+ case INSN_MG_PV: /* 66 */
{
pvcontents arg;
BGET_pvcontents(arg);
- BSET_mg_pv(SvMAGIC(bytecode_sv), arg);
+ BSET_mg_pv(SvMAGIC(bstate->bs_sv), arg);
break;
}
- case INSN_XMG_STASH: /* 66 */
+ case INSN_XMG_STASH: /* 67 */
{
svindex arg;
BGET_svindex(arg);
- *(SV**)&SvSTASH(bytecode_sv) = arg;
+ *(SV**)&SvSTASH(bstate->bs_sv) = arg;
break;
}
- case INSN_GV_FETCHPV: /* 67 */
+ case INSN_GV_FETCHPV: /* 68 */
{
strconst arg;
BGET_strconst(arg);
- BSET_gv_fetchpv(bytecode_sv, arg);
+ BSET_gv_fetchpv(bstate->bs_sv, arg);
break;
}
- case INSN_GV_STASHPV: /* 68 */
+ case INSN_GV_STASHPV: /* 69 */
{
strconst arg;
BGET_strconst(arg);
- BSET_gv_stashpv(bytecode_sv, arg);
+ BSET_gv_stashpv(bstate->bs_sv, arg);
break;
}
- case INSN_GP_SV: /* 69 */
+ case INSN_GP_SV: /* 70 */
{
svindex arg;
BGET_svindex(arg);
- GvSV(bytecode_sv) = arg;
+ GvSV(bstate->bs_sv) = arg;
break;
}
- case INSN_GP_REFCNT: /* 70 */
+ case INSN_GP_REFCNT: /* 71 */
{
U32 arg;
BGET_U32(arg);
- GvREFCNT(bytecode_sv) = arg;
+ GvREFCNT(bstate->bs_sv) = arg;
break;
}
- case INSN_GP_REFCNT_ADD: /* 71 */
+ case INSN_GP_REFCNT_ADD: /* 72 */
{
I32 arg;
BGET_I32(arg);
- BSET_gp_refcnt_add(GvREFCNT(bytecode_sv), arg);
+ BSET_gp_refcnt_add(GvREFCNT(bstate->bs_sv), arg);
break;
}
- case INSN_GP_AV: /* 72 */
+ case INSN_GP_AV: /* 73 */
{
svindex arg;
BGET_svindex(arg);
- *(SV**)&GvAV(bytecode_sv) = arg;
+ *(SV**)&GvAV(bstate->bs_sv) = arg;
break;
}
- case INSN_GP_HV: /* 73 */
+ case INSN_GP_HV: /* 74 */
{
svindex arg;
BGET_svindex(arg);
- *(SV**)&GvHV(bytecode_sv) = arg;
+ *(SV**)&GvHV(bstate->bs_sv) = arg;
break;
}
- case INSN_GP_CV: /* 74 */
+ case INSN_GP_CV: /* 75 */
{
svindex arg;
BGET_svindex(arg);
- *(SV**)&GvCV(bytecode_sv) = arg;
+ *(SV**)&GvCV(bstate->bs_sv) = arg;
break;
}
- case INSN_GP_FILE: /* 75 */
+ case INSN_GP_FILE: /* 76 */
{
- pvcontents arg;
- BGET_pvcontents(arg);
- GvFILE(bytecode_sv) = arg;
+ pvindex arg;
+ BGET_pvindex(arg);
+ GvFILE(bstate->bs_sv) = arg;
break;
}
- case INSN_GP_IO: /* 76 */
+ case INSN_GP_IO: /* 77 */
{
svindex arg;
BGET_svindex(arg);
- *(SV**)&GvIOp(bytecode_sv) = arg;
+ *(SV**)&GvIOp(bstate->bs_sv) = arg;
break;
}
- case INSN_GP_FORM: /* 77 */
+ case INSN_GP_FORM: /* 78 */
{
svindex arg;
BGET_svindex(arg);
- *(SV**)&GvFORM(bytecode_sv) = arg;
+ *(SV**)&GvFORM(bstate->bs_sv) = arg;
break;
}
- case INSN_GP_CVGEN: /* 78 */
+ case INSN_GP_CVGEN: /* 79 */
{
U32 arg;
BGET_U32(arg);
- GvCVGEN(bytecode_sv) = arg;
+ GvCVGEN(bstate->bs_sv) = arg;
break;
}
- case INSN_GP_LINE: /* 79 */
+ case INSN_GP_LINE: /* 80 */
{
line_t arg;
BGET_U16(arg);
- GvLINE(bytecode_sv) = arg;
+ GvLINE(bstate->bs_sv) = arg;
break;
}
- case INSN_GP_SHARE: /* 80 */
+ case INSN_GP_SHARE: /* 81 */
{
svindex arg;
BGET_svindex(arg);
- BSET_gp_share(bytecode_sv, arg);
+ BSET_gp_share(bstate->bs_sv, arg);
break;
}
- case INSN_XGV_FLAGS: /* 81 */
+ case INSN_XGV_FLAGS: /* 82 */
{
U8 arg;
BGET_U8(arg);
- GvFLAGS(bytecode_sv) = arg;
+ GvFLAGS(bstate->bs_sv) = arg;
break;
}
- case INSN_OP_NEXT: /* 82 */
+ case INSN_OP_NEXT: /* 83 */
{
opindex arg;
BGET_opindex(arg);
PL_op->op_next = arg;
break;
}
- case INSN_OP_SIBLING: /* 83 */
+ case INSN_OP_SIBLING: /* 84 */
{
opindex arg;
BGET_opindex(arg);
PL_op->op_sibling = arg;
break;
}
- case INSN_OP_PPADDR: /* 84 */
+ case INSN_OP_PPADDR: /* 85 */
{
strconst arg;
BGET_strconst(arg);
BSET_op_ppaddr(PL_op->op_ppaddr, arg);
break;
}
- case INSN_OP_TARG: /* 85 */
+ case INSN_OP_TARG: /* 86 */
{
PADOFFSET arg;
BGET_U32(arg);
PL_op->op_targ = arg;
break;
}
- case INSN_OP_TYPE: /* 86 */
+ case INSN_OP_TYPE: /* 87 */
{
OPCODE arg;
BGET_U16(arg);
BSET_op_type(PL_op, arg);
break;
}
- case INSN_OP_SEQ: /* 87 */
+ case INSN_OP_SEQ: /* 88 */
{
U16 arg;
BGET_U16(arg);
PL_op->op_seq = arg;
break;
}
- case INSN_OP_FLAGS: /* 88 */
+ case INSN_OP_FLAGS: /* 89 */
{
U8 arg;
BGET_U8(arg);
PL_op->op_flags = arg;
break;
}
- case INSN_OP_PRIVATE: /* 89 */
+ case INSN_OP_PRIVATE: /* 90 */
{
U8 arg;
BGET_U8(arg);
PL_op->op_private = arg;
break;
}
- case INSN_OP_FIRST: /* 90 */
+ case INSN_OP_FIRST: /* 91 */
{
opindex arg;
BGET_opindex(arg);
cUNOP->op_first = arg;
break;
}
- case INSN_OP_LAST: /* 91 */
+ case INSN_OP_LAST: /* 92 */
{
opindex arg;
BGET_opindex(arg);
cBINOP->op_last = arg;
break;
}
- case INSN_OP_OTHER: /* 92 */
+ case INSN_OP_OTHER: /* 93 */
{
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;
@@ -823,22 +819,22 @@ byterun(pTHXo_ struct bytestream bs)
}
case INSN_COP_LABEL: /* 108 */
{
- pvcontents arg;
- BGET_pvcontents(arg);
+ pvindex arg;
+ BGET_pvindex(arg);
cCOP->cop_label = arg;
break;
}
case INSN_COP_STASHPV: /* 109 */
{
- pvcontents arg;
- BGET_pvcontents(arg);
+ pvindex arg;
+ BGET_pvindex(arg);
BSET_cop_stashpv(cCOP, arg);
break;
}
case INSN_COP_FILE: /* 110 */
{
- pvcontents arg;
- BGET_pvcontents(arg);
+ pvindex arg;
+ BGET_pvindex(arg);
BSET_cop_file(cCOP, arg);
break;
}
@@ -891,6 +887,27 @@ byterun(pTHXo_ struct bytestream bs)
BSET_curpad(PL_curpad, arg);
break;
}
+ case INSN_PUSH_BEGIN: /* 118 */
+ {
+ svindex arg;
+ BGET_svindex(arg);
+ BSET_push_begin(PL_beginav, arg);
+ break;
+ }
+ case INSN_PUSH_INIT: /* 119 */
+ {
+ svindex arg;
+ BGET_svindex(arg);
+ BSET_push_init(PL_initav, arg);
+ break;
+ }
+ case INSN_PUSH_END: /* 120 */
+ {
+ svindex arg;
+ BGET_svindex(arg);
+ BSET_push_end(PL_endav, arg);
+ break;
+ }
default:
Perl_croak(aTHX_ "Illegal bytecode instruction %d\n", insn);
/* NOTREACHED */
diff --git a/gnu/usr.bin/perl/ext/ByteLoader/byterun.h b/gnu/usr.bin/perl/ext/ByteLoader/byterun.h
index f0de6b48204..f074f2d6cf6 100644
--- a/gnu/usr.bin/perl/ext/ByteLoader/byterun.h
+++ b/gnu/usr.bin/perl/ext/ByteLoader/byterun.h
@@ -8,108 +8,120 @@
/*
* 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 *);
+struct byteloader_fdata {
+ SV *datasv;
+ int next_out;
+ int idx;
};
+struct byteloader_state {
+ struct byteloader_fdata *bs_fdata;
+ SV *bs_sv;
+ void **bs_obj_list;
+ int bs_obj_list_fill;
+ XPV bs_pv;
+ int bs_iv_overflows;
+};
+
+int bl_getc(struct byteloader_fdata *);
+int bl_read(struct byteloader_fdata *, char *, size_t, size_t);
+extern void byterun(pTHXo_ struct byteloader_state *);
+
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_STPV, /* 5 */
+ INSN_LDSPECSV, /* 6 */
+ INSN_NEWSV, /* 7 */
+ INSN_NEWOP, /* 8 */
+ INSN_NEWOPN, /* 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_NEWPV, /* 11 */
+ INSN_PV_CUR, /* 12 */
+ INSN_PV_FREE, /* 13 */
+ INSN_SV_UPGRADE, /* 14 */
+ INSN_SV_REFCNT, /* 15 */
+ INSN_SV_REFCNT_ADD, /* 16 */
+ INSN_SV_FLAGS, /* 17 */
+ INSN_XRV, /* 18 */
+ INSN_XPV, /* 19 */
+ INSN_XIV32, /* 20 */
+ INSN_XIV64, /* 21 */
+ INSN_XNV, /* 22 */
+ INSN_XLV_TARGOFF, /* 23 */
+ INSN_XLV_TARGLEN, /* 24 */
+ INSN_XLV_TARG, /* 25 */
+ INSN_XLV_TYPE, /* 26 */
+ INSN_XBM_USEFUL, /* 27 */
+ INSN_XBM_PREVIOUS, /* 28 */
+ INSN_XBM_RARE, /* 29 */
+ INSN_XFM_LINES, /* 30 */
+ INSN_XIO_LINES, /* 31 */
+ INSN_XIO_PAGE, /* 32 */
+ INSN_XIO_PAGE_LEN, /* 33 */
+ INSN_XIO_LINES_LEFT, /* 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_XIO_TOP_NAME, /* 36 */
+ INSN_XIO_TOP_GV, /* 37 */
+ INSN_XIO_FMT_NAME, /* 38 */
+ INSN_XIO_FMT_GV, /* 39 */
+ INSN_XIO_BOTTOM_NAME, /* 40 */
+ INSN_XIO_BOTTOM_GV, /* 41 */
+ INSN_XIO_SUBPROCESS, /* 42 */
+ INSN_XIO_TYPE, /* 43 */
+ INSN_XIO_FLAGS, /* 44 */
+ INSN_XCV_STASH, /* 45 */
+ INSN_XCV_START, /* 46 */
+ INSN_XCV_ROOT, /* 47 */
+ INSN_XCV_GV, /* 48 */
+ INSN_XCV_FILE, /* 49 */
+ INSN_XCV_DEPTH, /* 50 */
+ INSN_XCV_PADLIST, /* 51 */
+ INSN_XCV_OUTSIDE, /* 52 */
+ INSN_XCV_FLAGS, /* 53 */
+ INSN_AV_EXTEND, /* 54 */
+ INSN_AV_PUSH, /* 55 */
+ INSN_XAV_FILL, /* 56 */
+ INSN_XAV_MAX, /* 57 */
+ INSN_XAV_FLAGS, /* 58 */
+ INSN_XHV_RITER, /* 59 */
+ INSN_XHV_NAME, /* 60 */
+ INSN_HV_STORE, /* 61 */
+ INSN_SV_MAGIC, /* 62 */
+ INSN_MG_OBJ, /* 63 */
+ INSN_MG_PRIVATE, /* 64 */
+ INSN_MG_FLAGS, /* 65 */
+ INSN_MG_PV, /* 66 */
+ INSN_XMG_STASH, /* 67 */
+ INSN_GV_FETCHPV, /* 68 */
+ INSN_GV_STASHPV, /* 69 */
+ INSN_GP_SV, /* 70 */
+ INSN_GP_REFCNT, /* 71 */
+ INSN_GP_REFCNT_ADD, /* 72 */
+ INSN_GP_AV, /* 73 */
+ INSN_GP_HV, /* 74 */
+ INSN_GP_CV, /* 75 */
+ INSN_GP_FILE, /* 76 */
+ INSN_GP_IO, /* 77 */
+ INSN_GP_FORM, /* 78 */
+ INSN_GP_CVGEN, /* 79 */
+ INSN_GP_LINE, /* 80 */
+ INSN_GP_SHARE, /* 81 */
+ INSN_XGV_FLAGS, /* 82 */
+ INSN_OP_NEXT, /* 83 */
+ INSN_OP_SIBLING, /* 84 */
+ INSN_OP_PPADDR, /* 85 */
+ INSN_OP_TARG, /* 86 */
+ INSN_OP_TYPE, /* 87 */
+ INSN_OP_SEQ, /* 88 */
+ INSN_OP_FLAGS, /* 89 */
+ INSN_OP_PRIVATE, /* 90 */
+ INSN_OP_FIRST, /* 91 */
+ INSN_OP_LAST, /* 92 */
+ INSN_OP_OTHER, /* 93 */
INSN_OP_PMREPLROOT, /* 94 */
INSN_OP_PMREPLROOTGV, /* 95 */
INSN_OP_PMREPLSTART, /* 96 */
@@ -134,7 +146,10 @@ enum {
INSN_MAIN_START, /* 115 */
INSN_MAIN_ROOT, /* 116 */
INSN_CURPAD, /* 117 */
- MAX_INSN = 117
+ INSN_PUSH_BEGIN, /* 118 */
+ INSN_PUSH_INIT, /* 119 */
+ INSN_PUSH_END, /* 120 */
+ MAX_INSN = 120
};
enum {
@@ -151,11 +166,3 @@ enum {
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/gnu/usr.bin/perl/ext/DB_File/Changes b/gnu/usr.bin/perl/ext/DB_File/Changes
index 95eb487e565..eda270d82b5 100644
--- a/gnu/usr.bin/perl/ext/DB_File/Changes
+++ b/gnu/usr.bin/perl/ext/DB_File/Changes
@@ -291,3 +291,46 @@
to David Harris for spotting the underlying problem, contributing
the updates to the documentation and writing DB_File::Lock (available
on CPAN).
+
+1.73 31st May 2000
+
+ * Added support in version.c for building with threaded Perl.
+
+ * Berkeley DB 3.1 has reenabled support for null keys. The test
+ harness has been updated to reflect this.
+
+1.74 10th December 2000
+
+ * A "close" call in DB_File.xs needed parenthesised to stop win32 from
+ thinking it was one of its macros.
+
+ * Updated dbinfo to support Berkeley DB 3.1 file format changes.
+
+ * DB_File.pm & the test hasness now use the warnings pragma (when
+ available).
+
+ * Included Perl core patch 7703 -- size argument for hash_cb is different
+ for Berkeley DB 3.x
+
+ * Included Perl core patch 7801 -- Give __getBerkeleyDBInfo the ANSI C
+ treatment.
+
+ * @a = () produced the warning 'Argument "" isn't numeric in entersub'
+ This has been fixed. Thanks to Edward Avis for spotting this bug.
+
+ * Added note about building under Linux. Included patches.
+
+ * Included Perl core patch 8068 -- fix for bug 20001013.009
+ When run with warnings enabled "$hash{XX} = undef " produced an
+ "Uninitialized value" warning. This has been fixed.
+
+1.75 17th December 2000
+
+ * Fixed perl core patch 7703
+
+ * Added suppport to allow DB_File to be built with Berkeley DB 3.2 --
+ btree_compare, btree_prefix and hash_cb needed to be changed.
+
+ * Updated dbinfo to support Berkeley DB 3.2 file format changes.
+
+
diff --git a/gnu/usr.bin/perl/ext/DB_File/dbinfo b/gnu/usr.bin/perl/ext/DB_File/dbinfo
index 701ac612b62..5a4df15907e 100644
--- a/gnu/usr.bin/perl/ext/DB_File/dbinfo
+++ b/gnu/usr.bin/perl/ext/DB_File/dbinfo
@@ -4,10 +4,10 @@
# a database file
#
# Author: Paul Marquess <Paul.Marquess@btinternet.com>
-# Version: 1.02
-# Date 20th August 1999
+# Version: 1.03
+# Date 17th September 2000
#
-# Copyright (c) 1998 Paul Marquess. All rights reserved.
+# Copyright (c) 1998-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.
@@ -28,7 +28,8 @@ my %Data =
4 => "Unknown",
5 => "2.0.0 -> 2.3.0",
6 => "2.3.1 -> 2.7.7",
- 7 => "3.0.0 or greater",
+ 7 => "3.0.x",
+ 8 => "3.1.x or greater",
}
},
0x061561 => {
@@ -40,14 +41,17 @@ my %Data =
3 => "1.86",
4 => "2.0.0 -> 2.1.0",
5 => "2.2.6 -> 2.7.7",
- 6 => "3.0.0 or greater",
+ 6 => "3.0.x",
+ 7 => "3.1.x or greater",
}
},
0x042253 => {
Type => "Queue",
Versions =>
{
- 1 => "3.0.0 or greater",
+ 1 => "3.0.x",
+ 2 => "3.1.x",
+ 3 => "3.2.x or greater",
}
},
) ;
@@ -86,7 +90,7 @@ else
{ die "not a Berkeley DB database file.\n" }
my $type = $Data{$magic} ;
-my $magic = sprintf "%06X", $magic ;
+$magic = sprintf "%06X", $magic ;
my $ver_string = "Unknown" ;
$ver_string = $type->{Versions}{$version}
diff --git a/gnu/usr.bin/perl/ext/DB_File/version.c b/gnu/usr.bin/perl/ext/DB_File/version.c
index f8c6cac9af7..6e55b2e3d18 100644
--- a/gnu/usr.bin/perl/ext/DB_File/version.c
+++ b/gnu/usr.bin/perl/ext/DB_File/version.c
@@ -4,7 +4,7 @@
written by Paul Marquess <Paul.Marquess@btinternet.com>
last modified 16th January 2000
- version 1.72
+ version 1.73
All comments/suggestions/problems are welcome
@@ -16,6 +16,9 @@
1.71 - Support for Berkeley DB version 3.
Support for Berkeley DB 2/3's backward compatability mode.
1.72 - No change.
+ 1.73 - Added support for threading
+ 1.74 - Added Perl core patch 7801.
+
*/
@@ -26,8 +29,15 @@
#include <db.h>
void
+#ifdef CAN_PROTOTYPE
+__getBerkeleyDBInfo(void)
+#else
__getBerkeleyDBInfo()
+#endif
{
+#ifdef dTHX
+ dTHX;
+#endif
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) ;
diff --git a/gnu/usr.bin/perl/ext/Data/Dumper/Dumper.pm b/gnu/usr.bin/perl/ext/Data/Dumper/Dumper.pm
index 93b87f9aba9..a8e59ab379d 100644
--- a/gnu/usr.bin/perl/ext/Data/Dumper/Dumper.pm
+++ b/gnu/usr.bin/perl/ext/Data/Dumper/Dumper.pm
@@ -9,7 +9,7 @@
package Data::Dumper;
-$VERSION = '2.101';
+$VERSION = '2.102';
#$| = 1;
@@ -291,8 +291,7 @@ sub _dump {
$s->{level}++;
$ipad = $s->{xpad} x $s->{level};
-
- if ($realtype eq 'SCALAR') {
+ if ($realtype eq 'SCALAR' || $realtype eq 'REF') {
if ($realpack) {
$out .= 'do{\\(my $o = ' . $s->_dump($$val, "\${$name}") . ')}';
}
@@ -685,7 +684,7 @@ the last.
Returns the stringified form of the values stored in the object (preserving
the order in which they were supplied to C<new>), subject to the
-configuration options below. In an array context, it returns a list
+configuration options below. In a list context, it returns a list
of strings corresponding to the supplied values.
The second form, for convenience, simply calls the C<new> method on its
@@ -701,7 +700,7 @@ dumping subroutine references.
Expects a anonymous hash of name => value pairs. Same rules apply for names
as in C<new>. If no argument is supplied, will return the "seen" list of
-name => value pairs, in an array context. Otherwise, returns the object
+name => value pairs, in a list context. Otherwise, returns the object
itself.
=item I<$OBJ>->Values(I<[ARRAYREF]>)
@@ -732,7 +731,7 @@ itself.
Returns the stringified form of the values in the list, subject to the
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.
+in a list context.
=back
diff --git a/gnu/usr.bin/perl/ext/Data/Dumper/Dumper.xs b/gnu/usr.bin/perl/ext/Data/Dumper/Dumper.xs
index 990ea746993..25e72b144c9 100644
--- a/gnu/usr.bin/perl/ext/Data/Dumper/Dumper.xs
+++ b/gnu/usr.bin/perl/ext/Data/Dumper/Dumper.xs
@@ -584,8 +584,10 @@ DD_dump(pTHX_ SV *val, char *name, STRLEN namelen, SV *retval, HV *seenhv,
if (SvIOK(val)) {
STRLEN len;
- i = SvIV(val);
- (void) sprintf(tmpbuf, "%"IVdf, (IV)i);
+ if (SvIsUV(val))
+ (void) sprintf(tmpbuf, "%"UVuf, SvUV(val));
+ else
+ (void) sprintf(tmpbuf, "%"IVdf, SvIV(val));
len = strlen(tmpbuf);
sv_catpvn(retval, tmpbuf, len);
}
@@ -803,7 +805,7 @@ Data_Dumper_Dumpxs(href, ...)
if ((svp = av_fetch(namesav, i, TRUE)))
sv_setsv(name, *svp);
else
- SvOK_off(name);
+ (void)SvOK_off(name);
if (SvOK(name)) {
if ((SvPVX(name))[0] == '*') {
diff --git a/gnu/usr.bin/perl/ext/Devel/DProf/DProf.xs b/gnu/usr.bin/perl/ext/Devel/DProf/DProf.xs
index 31e984f929b..aba6de99d3e 100644
--- a/gnu/usr.bin/perl/ext/Devel/DProf/DProf.xs
+++ b/gnu/usr.bin/perl/ext/Devel/DProf/DProf.xs
@@ -3,11 +3,6 @@
#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 */
@@ -28,6 +23,7 @@
# define HZ ((I32)CLK_TCK)
# define DPROF_HZ HZ
# include <starlet.h> /* prototype for sys$gettim() */
+# include <lib$routines.h>
# define Times(ptr) (dprof_times(aTHX_ ptr))
#else
# ifndef HZ
@@ -280,10 +276,6 @@ 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 */
@@ -388,7 +380,6 @@ prof_mark(pTHX_ opcode ptype)
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;
@@ -477,8 +468,6 @@ prof_record(pTHX)
/* 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);
}
@@ -502,7 +491,7 @@ prof_record(pTHX)
static void
check_depth(pTHX_ void *foo)
{
- U32 need_depth = (U32)foo;
+ U32 need_depth = PTR2UV(foo);
if (need_depth != g_depth) {
if (need_depth > g_depth) {
warn("garbled call depth when profiling");
@@ -547,6 +536,7 @@ XS(XS_DB_sub)
prof_mark(aTHX_ OP_ENTERSUB);
PUSHMARK(ORIGMARK);
perl_call_sv(INT2PTR(SV*,SvIV(Sub)), GIMME | G_NODEBUG);
+ PL_curstash = oldstash;
prof_mark(aTHX_ OP_LEAVESUB);
g_depth--;
}
diff --git a/gnu/usr.bin/perl/ext/Devel/Peek/Makefile.PL b/gnu/usr.bin/perl/ext/Devel/Peek/Makefile.PL
index 3c6dbf545d1..f6d0cc9caa5 100644
--- a/gnu/usr.bin/perl/ext/Devel/Peek/Makefile.PL
+++ b/gnu/usr.bin/perl/ext/Devel/Peek/Makefile.PL
@@ -2,6 +2,7 @@ use ExtUtils::MakeMaker;
WriteMakefile(
NAME => "Devel::Peek",
VERSION_FROM => 'Peek.pm',
+ XSPROTOARG => '-noprototypes',
'dist' => {
COMPRESS => 'gzip -9f',
SUFFIX => 'gz',
diff --git a/gnu/usr.bin/perl/ext/Devel/Peek/Peek.pm b/gnu/usr.bin/perl/ext/Devel/Peek/Peek.pm
index 080251bb5e8..08501728c06 100644
--- a/gnu/usr.bin/perl/ext/Devel/Peek/Peek.pm
+++ b/gnu/usr.bin/perl/ext/Devel/Peek/Peek.pm
@@ -10,7 +10,8 @@ require Exporter;
use XSLoader ();
@ISA = qw(Exporter);
-@EXPORT = qw(Dump mstat DeadCode DumpArray DumpWithOP DumpProg);
+@EXPORT = qw(Dump mstat DeadCode DumpArray DumpWithOP DumpProg
+ fill_mstats mstats_fillhash mstats2hash);
@EXPORT_OK = qw(SvREFCNT SvREFCNT_inc SvREFCNT_dec CvGV);
%EXPORT_TAGS = ('ALL' => [@EXPORT, @EXPORT_OK]);
@@ -58,16 +59,76 @@ 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.
Function C<DumpArray()> allows dumping of multiple values (useful when you
-need to analize returns of functions).
+need to analyze 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.
+=head2 Memory footprint debugging
+
+When perl is compiled with support for memory footprint debugging
+(default with Perl's malloc()), Devel::Peek provides an access to this API.
+
+Use mstat() function to emit a memory state statistic to the terminal.
+For more information on the format of output of mstat() see
+L<perldebug/Using C<$ENV{PERL_DEBUG_MSTATS}>>.
+
+Three additional functions allow access to this statistic from Perl.
+First, use C<mstats_fillhash(%hash)> to get the information contained
+in the output of mstat() into %hash. The field of this hash are
+
+ minbucket nbuckets sbrk_good sbrk_slack sbrked_remains sbrks start_slack
+ topbucket topbucket_ev topbucket_odd total total_chain total_sbrk totfree
+
+Two additional fields C<free>, C<used> contain array references which
+provide per-bucket count of free and used chunks. Two other fields
+C<mem_size>, C<available_size> contain array references which provide
+the information about the allocated size and usable size of chunks in
+each bucket. Again, see L<perldebug/Using C<$ENV{PERL_DEBUG_MSTATS}>>
+for details.
+
+Keep in mind that only the first several "odd-numbered" buckets are
+used, so the information on size of the "odd-numbered" buckets which are
+not used is probably meaningless.
+
+The information in
+
+ mem_size available_size minbucket nbuckets
+
+is the property of a particular build of perl, and does not depend on
+the current process. If you do not provide the optional argument to
+the functions mstats_fillhash(), fill_mstats(), mstats2hash(), then
+the information in fields C<mem_size>, C<available_size> is not
+updated.
+
+C<fill_mstats($buf)> is a much cheaper call (both speedwise and
+memory-wise) which collects the statistic into $buf in
+machine-readable form. At a later moment you may need to call
+C<mstats2hash($buf, %hash)> to use this information to fill %hash.
+
+All three APIs C<fill_mstats($buf)>, C<mstats_fillhash(%hash)>, and
+C<mstats2hash($buf, %hash)> are designed to allocate no memory if used
+I<the second time> on the same $buf and/or %hash.
+
+So, if you want to collect memory info in a cycle, you may call
+
+ $#buf = 999;
+ fill_mstats($_) for @buf;
+ mstats_fillhash(%report, 1); # Static info too
+
+ foreach (@buf) {
+ # Do something...
+ fill_mstats $_; # Collect statistic
+ }
+ foreach (@buf) {
+ mstats2hash($_, %report); # Preserve static info
+ # Do something with %report
+ }
+
=head1 EXAMPLES
The following examples don't attempt to show everything as that would be a
@@ -403,8 +464,9 @@ it has no prototype (C<PROTOTYPE> field is missing).
=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>.
+C<DumpProg>, C<fill_mstats>, C<mstats_fillhash>, C<mstats2hash> by
+default. Additionally available C<SvREFCNT>, C<SvREFCNT_inc> and
+C<SvREFCNT_dec>.
=head1 BUGS
diff --git a/gnu/usr.bin/perl/ext/Devel/Peek/Peek.xs b/gnu/usr.bin/perl/ext/Devel/Peek/Peek.xs
index 9837e9ceb21..1e481492b5d 100644
--- a/gnu/usr.bin/perl/ext/Devel/Peek/Peek.xs
+++ b/gnu/usr.bin/perl/ext/Devel/Peek/Peek.xs
@@ -82,8 +82,6 @@ DeadCode(pTHX)
}
}
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); */
@@ -125,6 +123,183 @@ DeadCode(pTHX)
PerlIO_printf(Perl_debug_log, "%s: perl not compiled with DEBUGGING_MSTATS\n",str);
#endif
+#if defined(PERL_DEBUGGING_MSTATS) || defined(DEBUGGING_MSTATS) \
+ || (defined(MYMALLOC) && !defined(PLAIN_MALLOC))
+
+/* Very coarse overestimate, 2-per-power-of-2, one more to determine NBUCKETS. */
+# define _NBUCKETS (2*8*IVSIZE+1)
+
+struct mstats_buffer
+{
+ perl_mstats_t buffer;
+ UV buf[_NBUCKETS*4];
+};
+
+void
+_fill_mstats(struct mstats_buffer *b, int level)
+{
+ dTHX;
+ b->buffer.nfree = b->buf;
+ b->buffer.ntotal = b->buf + _NBUCKETS;
+ b->buffer.bucket_mem_size = b->buf + 2*_NBUCKETS;
+ b->buffer.bucket_available_size = b->buf + 3*_NBUCKETS;
+ Zero(b->buf, (level ? 4*_NBUCKETS: 2*_NBUCKETS), unsigned long);
+ get_mstats(&(b->buffer), _NBUCKETS, level);
+}
+
+void
+fill_mstats(SV *sv, int level)
+{
+ dTHX;
+ int nbuckets;
+ struct mstats_buffer buf;
+
+ if (SvREADONLY(sv))
+ croak("Cannot modify a readonly value");
+ SvGROW(sv, sizeof(struct mstats_buffer)+1);
+ _fill_mstats((struct mstats_buffer*)SvPVX(sv),level);
+ SvCUR_set(sv, sizeof(struct mstats_buffer));
+ *SvEND(sv) = '\0';
+ SvPOK_only(sv);
+}
+
+void
+_mstats_to_hv(HV *hv, struct mstats_buffer *b, int level)
+{
+ dTHX;
+ SV **svp;
+ int type;
+
+ svp = hv_fetch(hv, "topbucket", 9, 1);
+ sv_setiv(*svp, b->buffer.topbucket);
+
+ svp = hv_fetch(hv, "topbucket_ev", 12, 1);
+ sv_setiv(*svp, b->buffer.topbucket_ev);
+
+ svp = hv_fetch(hv, "topbucket_odd", 13, 1);
+ sv_setiv(*svp, b->buffer.topbucket_odd);
+
+ svp = hv_fetch(hv, "totfree", 7, 1);
+ sv_setiv(*svp, b->buffer.totfree);
+
+ svp = hv_fetch(hv, "total", 5, 1);
+ sv_setiv(*svp, b->buffer.total);
+
+ svp = hv_fetch(hv, "total_chain", 11, 1);
+ sv_setiv(*svp, b->buffer.total_chain);
+
+ svp = hv_fetch(hv, "total_sbrk", 10, 1);
+ sv_setiv(*svp, b->buffer.total_sbrk);
+
+ svp = hv_fetch(hv, "sbrks", 5, 1);
+ sv_setiv(*svp, b->buffer.sbrks);
+
+ svp = hv_fetch(hv, "sbrk_good", 9, 1);
+ sv_setiv(*svp, b->buffer.sbrk_good);
+
+ svp = hv_fetch(hv, "sbrk_slack", 10, 1);
+ sv_setiv(*svp, b->buffer.sbrk_slack);
+
+ svp = hv_fetch(hv, "start_slack", 11, 1);
+ sv_setiv(*svp, b->buffer.start_slack);
+
+ svp = hv_fetch(hv, "sbrked_remains", 14, 1);
+ sv_setiv(*svp, b->buffer.sbrked_remains);
+
+ svp = hv_fetch(hv, "minbucket", 9, 1);
+ sv_setiv(*svp, b->buffer.minbucket);
+
+ svp = hv_fetch(hv, "nbuckets", 8, 1);
+ sv_setiv(*svp, b->buffer.nbuckets);
+
+ if (_NBUCKETS < b->buffer.nbuckets)
+ warn("FIXME: internal mstats buffer too short");
+
+ for (type = 0; type < (level ? 4 : 2); type++) {
+ UV *p, *p1;
+ AV *av;
+ int i;
+ static const char *types[4] = {
+ "free", "used", "mem_size", "available_size"
+ };
+
+ svp = hv_fetch(hv, types[type], strlen(types[type]), 1);
+
+ if (SvOK(*svp) && !(SvROK(*svp) && SvTYPE(SvRV(*svp)) == SVt_PVAV))
+ croak("Unexpected value for the key '%s' in the mstats hash", types[type]);
+ if (!SvOK(*svp)) {
+ av = newAV();
+ SvUPGRADE(*svp, SVt_RV);
+ SvRV(*svp) = (SV*)av;
+ SvROK_on(*svp);
+ } else
+ av = (AV*)SvRV(*svp);
+
+ av_extend(av, b->buffer.nbuckets - 1);
+ /* XXXX What is the official way to reduce the size of the array? */
+ switch (type) {
+ case 0:
+ p = b->buffer.nfree;
+ break;
+ case 1:
+ p = b->buffer.ntotal;
+ p1 = b->buffer.nfree;
+ break;
+ case 2:
+ p = b->buffer.bucket_mem_size;
+ break;
+ case 3:
+ p = b->buffer.bucket_available_size;
+ break;
+ }
+ for (i = 0; i < b->buffer.nbuckets; i++) {
+ svp = av_fetch(av, i, 1);
+ if (type == 1)
+ sv_setiv(*svp, p[i]-p1[i]);
+ else
+ sv_setuv(*svp, p[i]);
+ }
+ }
+}
+void
+mstats_fillhash(SV *sv, int level)
+{
+ struct mstats_buffer buf;
+
+ if (!(SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVHV))
+ croak("Not a hash reference");
+ _fill_mstats(&buf, level);
+ _mstats_to_hv((HV *)SvRV(sv), &buf, level);
+}
+void
+mstats2hash(SV *sv, SV *rv, int level)
+{
+ if (!(SvROK(rv) && SvTYPE(SvRV(rv)) == SVt_PVHV))
+ croak("Not a hash reference");
+ if (!SvPOK(sv))
+ croak("Undefined value when expecting mstats buffer");
+ if (SvCUR(sv) != sizeof(struct mstats_buffer))
+ croak("Wrong size for a value with a mstats buffer");
+ _mstats_to_hv((HV *)SvRV(rv), (struct mstats_buffer*)SvPVX(sv), level);
+}
+#else /* !( defined(PERL_DEBUGGING_MSTATS) || defined(DEBUGGING_MSTATS) \ ) */
+void
+fill_mstats(SV *sv, int level)
+{
+ croak("Cannot report mstats without Perl malloc");
+}
+void
+mstats_fillhash(SV *sv, int level)
+{
+ croak("Cannot report mstats without Perl malloc");
+}
+void
+mstats2hash(SV *sv, SV *rv, int level)
+{
+ croak("Cannot report mstats without Perl malloc");
+}
+#endif /* defined(PERL_DEBUGGING_MSTATS) || defined(DEBUGGING_MSTATS)... */
+
#define _CvGV(cv) \
(SvROK(cv) && (SvTYPE(SvRV(cv))==SVt_PVCV) \
? SvREFCNT_inc(CvGV((CV*)SvRV(cv))) : &PL_sv_undef)
@@ -136,6 +311,17 @@ mstat(str="Devel::Peek::mstat: ")
char *str
void
+fill_mstats(SV *sv, int level = 0)
+
+void
+mstats_fillhash(SV *sv, int level = 0)
+ PROTOTYPE: \%;$
+
+void
+mstats2hash(SV *sv, SV *rv, int level = 0)
+ PROTOTYPE: $\%;$
+
+void
Dump(sv,lim=4)
SV * sv
I32 lim
@@ -173,7 +359,7 @@ void
DumpProg()
PPCODE:
{
- warn("dumpindent is %d", PL_dumpindent);
+ warn("dumpindent is %d", (int)PL_dumpindent);
if (PL_main_root)
op_dump(PL_main_root);
}
@@ -195,7 +381,7 @@ PPCODE:
# PPCODE needed since by default it is void
-SV *
+void
SvREFCNT_dec(sv)
SV * sv
PPCODE:
diff --git a/gnu/usr.bin/perl/ext/DynaLoader/DynaLoader_pm.PL b/gnu/usr.bin/perl/ext/DynaLoader/DynaLoader_pm.PL
index e0eb604c73a..266c9d030f7 100644
--- a/gnu/usr.bin/perl/ext/DynaLoader/DynaLoader_pm.PL
+++ b/gnu/usr.bin/perl/ext/DynaLoader/DynaLoader_pm.PL
@@ -1,4 +1,3 @@
-
use Config;
sub to_string {
@@ -12,7 +11,7 @@ unlink "DynaLoader.pm" if -f "DynaLoader.pm";
open OUT, ">DynaLoader.pm" or die $!;
print OUT <<'EOT';
-# Generated from DynaLoader.pm.PL (resolved %Config::Config values)
+# Generated from DynaLoader.pm.PL
package DynaLoader;
@@ -21,18 +20,22 @@ package DynaLoader;
# feast like to keep their secret; for wonder makes the words of
# praise louder.'
-# (Quote from Tolkien sugested by Anno Siegel.)
+# (Quote from Tolkien suggested 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 = "1.04"; # avoid typo warning
+use vars qw($VERSION *AUTOLOAD);
+
+$VERSION = 1.04; # avoid typo warning
require AutoLoader;
*AUTOLOAD = \&AutoLoader::AUTOLOAD;
+use Config;
+
# The following require can't be removed during maintenance
# releases, sadly, because of the risk of buggy code that does
# require Carp; Carp::croak "..."; without brackets dying
@@ -40,7 +43,6 @@ require AutoLoader;
# We'll let those bugs get found on the development track.
require Carp if $] < 5.00450;
-
# enable debug/trace messages from DynaLoader perl code
$dl_debug = $ENV{PERL_DL_DEBUG} || 0 unless defined $dl_debug;
@@ -71,52 +73,116 @@ print OUT <<'EOT';
# (VMS support by Charles Bailey <bailey@HMIVAX.HUMGEN.UPENN.EDU>)
# 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_VMS = $^O eq 'VMS';
+$do_expand = $Is_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";
-# Initialise @dl_library_path with the 'standard' library path
-# for this platform as determined by Configure
+EOT
-# push(@dl_library_path, split(' ', $Config::Config{'libpth'});
+my $cfg_dl_library_path = <<'EOT';
+push(@dl_library_path, split(' ', $Config::Config{libpth}));
EOT
-print OUT "push(\@dl_library_path, split(' ', ",
- to_string($Config::Config{'libpth'}), "));\n";
+sub dquoted_comma_list {
+ join(", ", map {qq("$_")} @_);
+}
-print OUT <<'EOT';
+if ($ENV{PERL_BUILD_EXPAND_CONFIG_VARS}) {
+ eval $cfg_dl_library_path;
+ if (!$ENV{PERL_BUILD_EXPAND_ENV_VARS}) {
+ my $dl_library_path = dquoted_comma_list(@dl_library_path);
+ print OUT <<EOT;
+# The below \@dl_library_path has been expanded (%Config) in Perl build time.
+
+\@dl_library_path = ($dl_library_path);
+
+EOT
+ }
+}
+else {
+ print OUT <<EOT;
+# Initialise \@dl_library_path with the 'standard' library path
+# for this platform as determined by Configure.
+
+$cfg_dl_library_path
+
+EOT
+}
+
+my $ldlibpthname;
+my $ldlibpthname_defined;
+my $pthsep;
+
+if ($ENV{PERL_BUILD_EXPAND_CONFIG_VARS}) {
+ $ldlibpthname = $Config::Config{ldlibpthname};
+ $ldlibpthname_defined = defined $Config::Config{ldlibpthname} ? 1 : 0;
+ $pthsep = $Config::Config{path_sep};
+}
+else {
+ $ldlibpthname = q($Config::Config{ldlibpthname});
+ $ldlibpthname_defined = q(defined $Config::Config{ldlibpthname});
+ $pthsep = q($Config::Config{path_sep});
+ print OUT <<EOT;
+my \$ldlibpthname = $ldlibpthname;
+my \$ldlibpthname_defined = $ldlibpthname_defined;
+my \$pthsep = $pthsep;
+
+EOT
+}
+
+my $env_dl_library_path = <<'EOT';
+if ($ldlibpthname_defined &&
+ exists $ENV{$ldlibpthname}) {
+ push(@dl_library_path, split(/$pthsep/, $ENV{$ldlibpthname}));
+}
-# 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 exists $ENV{LD_LIBRARY_PATH};
+
+if ($ldlibpthname_defined &&
+ $ldlibpthname ne 'LD_LIBRARY_PATH' &&
+ exists $ENV{LD_LIBRARY_PATH}) {
+ push(@dl_library_path, split(/$pthsep/, $ENV{LD_LIBRARY_PATH}));
+}
+EOT
+
+if ($ENV{PERL_BUILD_EXPAND_CONFIG_VARS} && $ENV{PERL_BUILD_EXPAND_ENV_VARS}) {
+ eval $env_dl_library_path;
+}
+else {
+ print OUT <<EOT;
+# Add to \@dl_library_path any extra directories we can gather from environment
+# during runtime.
+
+$env_dl_library_path
+
+EOT
+}
+
+if ($ENV{PERL_BUILD_EXPAND_CONFIG_VARS} && $ENV{PERL_BUILD_EXPAND_ENV_VARS}) {
+ my $dl_library_path = dquoted_comma_list(@dl_library_path);
+ print OUT <<EOT;
+# The below \@dl_library_path has been expanded (%Config, %ENV)
+# in Perl build time.
+
+\@dl_library_path = ($dl_library_path);
+
+EOT
}
+print OUT <<'EOT';
# No prizes for guessing why we don't say 'bootstrap DynaLoader;' here.
+# NOTE: All dl_*.xs (including dl_none.xs) define a dl_error() XSUB
boot_DynaLoader('DynaLoader') if defined(&boot_DynaLoader) &&
- !defined(&dl_load_file);
-
+ !defined(&dl_error);
if ($dl_debug) {
print STDERR "DynaLoader.pm loaded (@INC, @dl_library_path)\n";
@@ -170,8 +236,8 @@ sub bootstrap {
print STDERR "DynaLoader::bootstrap for $module ",
($Is_MacOS
- ? "(auto/$modpname/$modfname.$dl_dlext)\n" :
- "(:auto:$modpname:$modfname.$dl_dlext)\n")
+ ? "(:auto:$modpname:$modfname.$dl_dlext)\n" :
+ "(auto/$modpname/$modfname.$dl_dlext)\n")
if $dl_debug;
foreach (@INC) {
@@ -198,7 +264,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};
+ $file = uc($file) if $Is_VMS && $Config::Config{d_vms_case_sensitive_symbols};
my $bootname = "boot_$module";
$bootname =~ s/\W/_/g;
@dl_require_symbols = ($bootname);
@@ -326,7 +392,7 @@ print OUT <<'EOT';
# (this is a more complicated issue than it first appears)
if (m:/: && -d $_) { push(@dirs, $_); next; }
- # VMS: we may be using native VMS directry syntax instead of
+ # VMS: we may be using native VMS directory syntax instead of
# Unix emulation, so check this as well
if ($Is_VMS && /[:>\]]/ && -d $_) { push(@dirs, $_); next; }
diff --git a/gnu/usr.bin/perl/ext/DynaLoader/XSLoader_pm.PL b/gnu/usr.bin/perl/ext/DynaLoader/XSLoader_pm.PL
index 8cdfd634255..7657410d46c 100644
--- a/gnu/usr.bin/perl/ext/DynaLoader/XSLoader_pm.PL
+++ b/gnu/usr.bin/perl/ext/DynaLoader/XSLoader_pm.PL
@@ -37,10 +37,12 @@ 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;
+
+# No prizes for guessing why we don't say 'bootstrap DynaLoader;' here.
+# NOTE: All dl_*.xs (including dl_none.xs) define a dl_error() XSUB
boot_DynaLoader('DynaLoader') if defined(&boot_DynaLoader) &&
- !defined(&dl_load_file);
+ !defined(&dl_error);
package XSLoader;
1; # End of main code
diff --git a/gnu/usr.bin/perl/ext/DynaLoader/dl_dllload.xs b/gnu/usr.bin/perl/ext/DynaLoader/dl_dllload.xs
new file mode 100644
index 00000000000..fe6957ac200
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/DynaLoader/dl_dllload.xs
@@ -0,0 +1,189 @@
+/* dl_dllload.xs
+ *
+ * Platform: OS/390, possibly others that use dllload(),dllfree() (VM/ESA?).
+ * Authors: John Goodyear && Peter Prymmer
+ * Created: 28 October 2000
+ * Modified:
+ * 16 January 2001 - based loosely on dl_dlopen.xs.
+ */
+
+/* Porting notes:
+
+ OS/390 Dynamic Loading functions:
+
+ dllload
+ -------
+ dllhandle * dllload(const char *dllName)
+
+ This function takes the name of a dynamic object file and returns
+ a descriptor which can be used by dlllqueryfn() and/or dllqueryvar()
+ later. If dllName contains a slash, it is used to locate the dll.
+ If not then the LIBPATH environment variable is used to
+ search for the requested dll (at least within the HFS).
+ It returns NULL on error and sets errno.
+
+ dllfree
+ -------
+ int dllfree(dllhandle *handle);
+
+ dllfree() decrements the load count for the dll and frees
+ it if the count is 0. It returns zero on success, and
+ non-zero on failure.
+
+ dllqueryfn && dllqueryvar
+ -------------------------
+ void (* dllqueryfn(dllhandle *handle, const char *function))();
+ void * dllqueryvar(dllhandle *handle, const char *symbol);
+
+ dllqueryfn() takes the handle returned from dllload() and the name
+ of a function to get the address of. If the function was found
+ a pointer is returned, otherwise NULL is returned.
+
+ dllqueryvar() takes the handle returned from dllload() and the name
+ of a symbol to get the address of. If the variable was found a
+ pointer is returned, otherwise NULL is returned.
+
+ The XS dl_find_symbol() first calls dllqueryfn(). If it fails
+ dlqueryvar() is then called.
+
+ strerror
+ --------
+ char * strerror(int errno)
+
+ Returns a null-terminated string which describes the last error
+ that occurred with other functions (not necessarily unique to
+ dll loading).
+
+ Return Types
+ ============
+ In this implementation the two functions, dl_load_file() &&
+ dl_find_symbol(), return (void *). This is primarily because the
+ dlopen() && dlsym() style dynamic linker calls return (void *).
+ We suspect that casting to (void *) may be easier than teaching XS
+ typemaps about the (dllhandle *) type.
+
+ 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 OS/390 the function strerror(errno) returns the error
+ message associated with the last dynamic link error. As the S/390
+ dynamic linker functions dllload() && dllqueryvar() both return NULL
+ on error every call to an S/390 dynamic link routine is coded
+ like this:
+
+ RETVAL = dllload(filename) ;
+ if (RETVAL == NULL)
+ SaveError("%s",strerror(errno)) ;
+
+ Note that SaveError() takes a printf format string. Use a "%s" as
+ the first parameter if the error may contain any % characters.
+
+ Other comments within the dl_dlopen.xs file may be helpful as well.
+*/
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#include <dll.h> /* the dynamic linker include file for S/390 */
+#include <errno.h> /* strerror() and friends */
+
+#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
+ PREINIT:
+ int mode = 0;
+ CODE:
+{
+ DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dl_load_file(%s,%x):\n", filename,flags));
+ /* add a (void *) dllload(filename) ; cast if needed */
+ RETVAL = dllload(filename) ;
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, " libref=%lx\n", (unsigned long) RETVAL));
+ ST(0) = sv_newmortal() ;
+ if (RETVAL == NULL)
+ SaveError(aTHX_ "%s",strerror(errno)) ;
+ else
+ 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", PTR2ul(libref)));
+ /* RETVAL = (dllfree((dllhandle *)libref) == 0 ? 1 : 0); */
+ RETVAL = (dllfree(libref) == 0 ? 1 : 0);
+ if (!RETVAL)
+ SaveError(aTHX_ "%s", strerror(errno)) ;
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log, " retval = %d\n", RETVAL));
+ OUTPUT:
+ 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));
+ if((RETVAL = (void*)dllqueryfn(libhandle, symbolname)) == NULL)
+ RETVAL = dllqueryvar(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",strerror(errno)) ;
+ 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/gnu/usr.bin/perl/ext/DynaLoader/dl_mac.xs b/gnu/usr.bin/perl/ext/DynaLoader/dl_mac.xs
new file mode 100644
index 00000000000..5f48139c56a
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/DynaLoader/dl_mac.xs
@@ -0,0 +1,137 @@
+/* dl_mac.xs
+ *
+ * Platform: Macintosh CFM
+ * Author: Matthias Neeracher <neeri@iis.ee.ethz.ch>
+ * Adapted from dl_dlopen.xs reference implementation by
+ * Paul Marquess (pmarquess@bfsec.bt.co.uk)
+ * $Log: dl_mac.xs,v $
+ * Revision 1.3 1998/04/07 01:47:24 neeri
+ * MacPerl 5.2.0r4b1
+ *
+ * Revision 1.2 1997/08/08 16:39:18 neeri
+ * MacPerl 5.1.4b1 + time() fix
+ *
+ * Revision 1.1 1997/04/07 20:48:23 neeri
+ * Synchronized with MacPerl 5.1.4a1
+ *
+ */
+
+#define MAC_CONTEXT
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#include <CodeFragments.h>
+
+
+#include "dlutils.c" /* SaveError() etc */
+
+typedef CFragConnectionID ConnectionID;
+
+static ConnectionID ** connections;
+
+static void terminate(void)
+{
+ int size = GetHandleSize((Handle) connections) / sizeof(ConnectionID);
+ HLock((Handle) connections);
+ while (size)
+ CloseConnection(*connections + --size);
+ DisposeHandle((Handle) connections);
+ connections = nil;
+}
+
+static void
+dl_private_init(pTHX)
+{
+ (void)dl_generic_private_init(aTHX);
+}
+
+MODULE = DynaLoader PACKAGE = DynaLoader
+
+BOOT:
+ (void)dl_private_init(aTHX);
+
+
+ConnectionID
+dl_load_file(filename, flags=0)
+ char * filename
+ int flags
+ PREINIT:
+ OSErr err;
+ FSSpec spec;
+ ConnectionID connID;
+ Ptr mainAddr;
+ Str255 errName;
+ CODE:
+ DLDEBUG(1,PerlIO_printf(Perl_debug_log,"dl_load_file(%s):\n", filename));
+ err = GUSIPath2FSp(filename, &spec);
+ if (!err)
+ err =
+ GetDiskFragment(
+ &spec, 0, 0, spec.name, kLoadCFrag, &connID, &mainAddr, errName);
+ if (!err) {
+ if (!connections) {
+ connections = (ConnectionID **)NewHandle(0);
+ atexit(terminate);
+ }
+ PtrAndHand((Ptr) &connID, (Handle) connections, sizeof(ConnectionID));
+ RETVAL = connID;
+ } else
+ RETVAL = (ConnectionID) 0;
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log," libref=%d\n", RETVAL));
+ ST(0) = sv_newmortal() ;
+ if (err)
+ SaveError(aTHX_ "DynaLoader error [%d, %#s]", err, errName) ;
+ else
+ sv_setiv( ST(0), (IV)RETVAL);
+
+void *
+dl_find_symbol(connID, symbol)
+ ConnectionID connID
+ Str255 symbol
+ CODE:
+ {
+ OSErr err;
+ Ptr symAddr;
+ CFragSymbolClass symClass;
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log,"dl_find_symbol(handle=%x, symbol=%#s)\n",
+ connID, symbol));
+ err = FindSymbol(connID, symbol, &symAddr, &symClass);
+ if (err)
+ symAddr = (Ptr) 0;
+ RETVAL = (void *) symAddr;
+ DLDEBUG(2,PerlIO_printf(Perl_debug_log," symbolref = %x\n", RETVAL));
+ ST(0) = sv_newmortal() ;
+ if (err)
+ SaveError(aTHX_ "DynaLoader error [%d]!", err) ;
+ else
+ sv_setiv( ST(0), (IV)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(*)())symref, filename)));
+
+
+char *
+dl_error()
+ CODE:
+ RETVAL = LastError ;
+ OUTPUT:
+ RETVAL
+
+# end.
diff --git a/gnu/usr.bin/perl/ext/DynaLoader/hints/aix.pl b/gnu/usr.bin/perl/ext/DynaLoader/hints/aix.pl
index 7dde941b43d..d4231ccb3ef 100644
--- a/gnu/usr.bin/perl/ext/DynaLoader/hints/aix.pl
+++ b/gnu/usr.bin/perl/ext/DynaLoader/hints/aix.pl
@@ -2,9 +2,13 @@
use Config;
if ($Config{libs} =~ /-lC/ && -f '/lib/libC.a') {
$self->{CCFLAGS} = $Config{ccflags} . ' -DUSE_libC';
- if (-f '/usr/ibmcxx/include/load.h') {
+ if (-f '/usr/vacpp/include/load.h') {
+ $self->{CCFLAGS} .= ' -DUSE_vacpp_load_h';
+ } elsif (-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';
+ } elsif (-f '/usr/include/load.h') {
+ $self->{CCFLAGS} .= ' -DUSE_load_h';
}
}
diff --git a/gnu/usr.bin/perl/ext/DynaLoader/hints/netbsd.pl b/gnu/usr.bin/perl/ext/DynaLoader/hints/netbsd.pl
new file mode 100644
index 00000000000..a0fbaf7d89e
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/DynaLoader/hints/netbsd.pl
@@ -0,0 +1,3 @@
+# XXX Configure test needed?
+# Some NetBSDs seem to have a dlopen() that won't accept relative paths
+$self->{CCFLAGS} = $Config{ccflags} . ' -DDLOPEN_WONT_DO_RELATIVE_PATHS';
diff --git a/gnu/usr.bin/perl/ext/Errno/ChangeLog b/gnu/usr.bin/perl/ext/Errno/ChangeLog
index 2bfa003d96a..dd94b37bafb 100644
--- a/gnu/usr.bin/perl/ext/Errno/ChangeLog
+++ b/gnu/usr.bin/perl/ext/Errno/ChangeLog
@@ -1,3 +1,8 @@
+Change 171 on 2000-09-12 by <calle@lysator.liu.se> (Calle Dybedahl)
+
+ - Fixed filename-extracting regexp to allow whitespace between
+ "#" and "line", which the cpp on Unicos 9 produces.
+
Change 170 on 1998/07/05 by <gbarr@pobox.com> (Graham Barr)
Fixed three problems reported by Hans Mulder for NeXT
diff --git a/gnu/usr.bin/perl/ext/Errno/Errno_pm.PL b/gnu/usr.bin/perl/ext/Errno/Errno_pm.PL
index df68dc3bda6..3f2f3e04266 100644
--- a/gnu/usr.bin/perl/ext/Errno/Errno_pm.PL
+++ b/gnu/usr.bin/perl/ext/Errno/Errno_pm.PL
@@ -29,6 +29,14 @@ sub process_file {
warn "Cannot open '$file'";
return;
}
+ } elsif ($Config{gccversion} ne '') {
+ # With the -dM option, gcc outputs every #define it finds
+ my $ccopts = "-E -dM ";
+ $ccopts .= "-traditional-cpp " if $^O eq 'darwin';
+ unless(open(FH,"$Config{cc} $ccopts $file |")) {
+ warn "Cannot open '$file'";
+ return;
+ }
} else {
unless(open(FH,"< $file")) {
# This file could be a temporary file created by cppstdin
@@ -37,11 +45,19 @@ sub process_file {
return;
}
}
- while(<FH>) {
- $err{$1} = 1
- if /^\s*#\s*define\s+(E\w+)\s+/;
- }
- close(FH);
+
+ if ($^O eq 'MacOS') {
+ while(<FH>) {
+ $err{$1} = $2
+ if /^\s*#\s*define\s+(E\w+)\s+(\d+)/;
+ }
+ } else {
+ while(<FH>) {
+ $err{$1} = 1
+ if /^\s*#\s*define\s+(E\w+)\s+/;
+ }
+ }
+ close(FH);
}
my $cppstdin;
@@ -79,6 +95,18 @@ sub get_files {
} elsif ($^O eq 'vmesa') {
# OS/390 C compiler doesn't generate #file or #line directives
$file{'../../vmesa/errno.h'} = 1;
+ } elsif ($Config{archname} eq 'epoc') {
+ # Watch out for cross compiling for EPOC (usually done on linux)
+ $file{'/usr/local/epoc/include/libc/sys/errno.h'} = 1;
+ } elsif ($^O eq 'linux') {
+ # Some Linuxes have weird errno.hs which generate
+ # no #file or #line directives
+ $file{'/usr/include/errno.h'} = 1;
+ } elsif ($^O eq 'MacOS') {
+ # note that we are only getting the GUSI errno's here ...
+ # we might miss out on compiler-specific ones
+ $file{"$ENV{GUSI}include:sys:errno.h"} = 1;
+
} else {
open(CPPI,"> errno.c") or
die "Cannot open errno.c";
@@ -102,7 +130,7 @@ sub get_files {
$pat = '^/\*\s+(.+)\s+\d+\s*:\s+\*/';
}
else {
- $pat = '^#(?:line)?\s*\d+\s+"([^"]+)"';
+ $pat = '^#\s*(?:line)?\s*\d+\s+"([^"]+)"';
}
while(<CPPO>) {
if ($^O eq 'os2' or $^O eq 'MSWin32') {
@@ -141,31 +169,33 @@ sub write_errno_pm {
close(CPPI);
+ unless ($^O eq 'MacOS') { # trust what we have
# invoke CPP and read the output
- if ($^O eq 'VMS') {
- my $cpp = "$Config{cppstdin} $Config{cppflags} $Config{cppminus}";
- $cpp =~ s/sys\$input//i;
- open(CPPO,"$cpp errno.c |") or
- die "Cannot exec $Config{cppstdin}";
- } elsif ($^O eq 'MSWin32') {
- open(CPPO,"$Config{cpprun} $Config{cppflags} errno.c |") or
- die "Cannot run '$Config{cpprun} $Config{cppflags} errno.c'";
- } else {
- my $cpp = default_cpp();
- open(CPPO,"$cpp < errno.c |")
- or die "Cannot exec $cpp";
- }
+ if ($^O eq 'VMS') {
+ my $cpp = "$Config{cppstdin} $Config{cppflags} $Config{cppminus}";
+ $cpp =~ s/sys\$input//i;
+ open(CPPO,"$cpp errno.c |") or
+ die "Cannot exec $Config{cppstdin}";
+ } elsif ($^O eq 'MSWin32') {
+ open(CPPO,"$Config{cpprun} $Config{cppflags} errno.c |") or
+ die "Cannot run '$Config{cpprun} $Config{cppflags} errno.c'";
+ } else {
+ my $cpp = default_cpp();
+ open(CPPO,"$cpp < errno.c |")
+ or die "Cannot exec $cpp";
+ }
- %err = ();
+ %err = ();
- while(<CPPO>) {
- my($name,$expr);
- next unless ($name, $expr) = /"(.*?)"\s*\[\s*\[\s*(.*?)\s*\]\s*\]/;
- next if $name eq $expr;
- $err{$name} = eval $expr;
+ while(<CPPO>) {
+ my($name,$expr);
+ next unless ($name, $expr) = /"(.*?)"\s*\[\s*\[\s*(.*?)\s*\]\s*\]/;
+ next if $name eq $expr;
+ $err{$name} = eval $expr;
+ }
+ close(CPPO);
}
- close(CPPO);
# Write Errno.pm
diff --git a/gnu/usr.bin/perl/ext/File/Glob/Changes b/gnu/usr.bin/perl/ext/File/Glob/Changes
index e246c6d6840..f46ec704e9a 100644
--- a/gnu/usr.bin/perl/ext/File/Glob/Changes
+++ b/gnu/usr.bin/perl/ext/File/Glob/Changes
@@ -45,3 +45,5 @@ Revision history for Perl extension File::Glob
- 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).
+0.992 Tue Mar 20 09:25:48 2001
+ - Add alphabetic sorting for csh compatibility (GLOB_ALPHASORT)
diff --git a/gnu/usr.bin/perl/ext/File/Glob/Glob.pm b/gnu/usr.bin/perl/ext/File/Glob/Glob.pm
index 4b7e54b9e3e..20b26f9661f 100644
--- a/gnu/usr.bin/perl/ext/File/Glob/Glob.pm
+++ b/gnu/usr.bin/perl/ext/File/Glob/Glob.pm
@@ -11,10 +11,15 @@ require AutoLoader;
@ISA = qw(Exporter AutoLoader);
+# NOTE: The glob() export is only here for compatibility with 5.6.0.
+# csh_glob() should not be used directly, unless you know what you're doing.
+
@EXPORT_OK = qw(
csh_glob
+ bsd_glob
glob
GLOB_ABEND
+ GLOB_ALPHASORT
GLOB_ALTDIRFUNC
GLOB_BRACE
GLOB_CSH
@@ -33,6 +38,7 @@ require AutoLoader;
%EXPORT_TAGS = (
'glob' => [ qw(
GLOB_ABEND
+ GLOB_ALPHASORT
GLOB_ALTDIRFUNC
GLOB_BRACE
GLOB_CSH
@@ -47,6 +53,7 @@ require AutoLoader;
GLOB_QUOTE
GLOB_TILDE
glob
+ bsd_glob
) ],
);
@@ -99,7 +106,13 @@ sub GLOB_ERROR {
return constant('GLOB_ERROR', 0);
}
-sub GLOB_CSH () { GLOB_BRACE() | GLOB_NOMAGIC() | GLOB_QUOTE() | GLOB_TILDE() }
+sub GLOB_CSH () {
+ GLOB_BRACE()
+ | GLOB_NOMAGIC()
+ | GLOB_QUOTE()
+ | GLOB_TILDE()
+ | GLOB_ALPHASORT()
+}
$DEFAULT_FLAGS = GLOB_CSH();
if ($^O =~ /^(?:MSWin32|VMS|os2|dos|riscos|MacOS)$/) {
@@ -108,12 +121,18 @@ if ($^O =~ /^(?:MSWin32|VMS|os2|dos|riscos|MacOS)$/) {
# Autoload methods go after =cut, and are processed by the autosplit program.
-sub glob {
+sub bsd_glob {
my ($pat,$flags) = @_;
$flags = $DEFAULT_FLAGS if @_ < 2;
return doglob($pat,$flags);
}
+# File::Glob::glob() is deprecated because its prototype is different from
+# CORE::glob() (use bsd_glob() instead)
+sub glob {
+ goto &bsd_glob;
+}
+
## borrowed heavily from gsar's File::DosGlob
my %iter;
my %entries;
@@ -127,6 +146,9 @@ sub csh_glob {
$pat = $_ unless defined $pat;
# extract patterns
+ $pat =~ s/^\s+//; # Protect against empty elements in
+ $pat =~ s/\s+$//; # things like < *.c> and <*.c >.
+ # These alone shouldn't trigger ParseWords.
if ($pat =~ /\s/) {
# XXX this is needed for compatibility with the csh
# implementation in Perl. Need to support a flag
@@ -177,13 +199,13 @@ File::Glob - Perl extension for BSD glob routine
=head1 SYNOPSIS
use File::Glob ':glob';
- @list = glob('*.[ch]');
- $homedir = glob('~gnat', GLOB_TILDE | GLOB_ERR);
+ @list = bsd_glob('*.[ch]');
+ $homedir = bsd_glob('~gnat', GLOB_TILDE | GLOB_ERR);
if (GLOB_ERROR) {
# an error occurred reading $homedir
}
- ## override the core glob (core glob() does this automatically
+ ## 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}>
@@ -198,19 +220,27 @@ File::Glob - Perl extension for BSD glob routine
=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
+File::Glob::bsd_glob() implements the FreeBSD glob(3) routine, which is
+a superset of the POSIX glob() (described in IEEE Std 1003.2 "POSIX.2").
+bsd_glob() 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:
+variable.
+
+Since v5.6.0, Perl's CORE::glob() is implemented in terms of bsd_glob().
+Note that they don't share the same prototype--CORE::glob() only accepts
+a single argument. Due to historical reasons, CORE::glob() will also
+split its argument on whitespace, treating it as multiple patterns,
+whereas bsd_glob() considers them as one pattern.
+
+The POSIX defined flags for bsd_glob() 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.
+Force bsd_glob() to return an error when it encounters a directory it
+cannot open or read. Ordinarily bsd_glob() continues to find matches.
=item C<GLOB_MARK>
@@ -220,18 +250,18 @@ 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.
+makes bsd_glob() treat case differences as not significant.
=item C<GLOB_NOCHECK>
-If the pattern does not match any pathname, then glob() returns a list
+If the pattern does not match any pathname, then bsd_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()).
+flag prevents that sorting (speeding up bsd_glob()).
=back
@@ -266,7 +296,7 @@ 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>.
+C<GLOB_BRACE | GLOB_NOMAGIC | GLOB_QUOTE | GLOB_TILDE | GLOB_ALPHASORT>.
=back
@@ -275,9 +305,21 @@ 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.
+The following flag has been added in the Perl implementation for
+compatibility with common flavors of csh:
+
+=over 4
+
+=item C<GLOB_ALPHASORT>
+
+If C<GLOB_NOSORT> is not in effect, sort filenames is alphabetical
+order (case does not matter) rather than in ASCII order.
+
+=back
+
=head1 DIAGNOSTICS
-glob() returns a list of matching paths, possibly zero length. If an
+bsd_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:
@@ -294,12 +336,12 @@ 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>
+In the case where bsd_glob() has found some matching paths, but is
+interrupted by an error, it 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
+Note that bsd_glob() deviates from POSIX and FreeBSD glob(3) behaviour
+by not considering C<ENOENT> and C<ENOTDIR> as errors - bsd_glob() will
continue processing despite those errors, unless the C<GLOB_ERR> flag is
set.
@@ -311,10 +353,10 @@ Be aware that all filenames returned from File::Glob are tainted.
=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.
+If you want to use multiple patterns, e.g. C<bsd_glob "a* b*">, you should
+probably throw them in a set as in C<bsd_glob "{a*,b*}">. This is because
+the argument to bsd_glob() isn't subjected to parsing by the C shell.
+Remember that you can use a backslash to escape things.
=item *
@@ -334,14 +376,32 @@ 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.
+=item *
+
+Mac OS (Classic) users should note a few differences. Since
+Mac OS is not Unix, when the glob code encounters a tilde glob (e.g.
+~user/foo) and the C<GLOB_TILDE> flag is used, it simply returns that
+pattern without doing any expansion.
+
+Glob on Mac OS is case-insensitive by default (if you don't use any
+flags). If you specify any flags at all and still want glob
+to be case-insensitive, you must include C<GLOB_NOCASE> in the flags.
+
+The path separator is ':' (aka colon), not '/' (aka slash). Mac OS users
+should be careful about specifying relative pathnames. While a full path
+always begins with a volume name, a relative pathname should always
+begin with a ':'. If specifying a volume name only, a trailing ':' is
+required.
+
=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
+made by Greg Bacon E<lt>gbacon@cs.uah.eduE<gt>, Gurusamy Sarathy
+E<lt>gsar@activestate.comE<gt>, and Thomas Wegner
+E<lt>wegner_thomas@yahoo.comE<gt>. The C glob code has the
following copyright:
Copyright (c) 1989, 1993 The Regents of the University of California.
diff --git a/gnu/usr.bin/perl/ext/File/Glob/Glob.xs b/gnu/usr.bin/perl/ext/File/Glob/Glob.xs
index e01ae7e85a9..ee8c0c9751f 100644
--- a/gnu/usr.bin/perl/ext/File/Glob/Glob.xs
+++ b/gnu/usr.bin/perl/ext/File/Glob/Glob.xs
@@ -4,16 +4,9 @@
#include "bsd_glob.h"
+/* XXX: need some thread awareness */
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)
{
@@ -28,6 +21,12 @@ constant(char *name, int arg)
#else
goto not_there;
#endif
+ if (strEQ(name, "GLOB_ALPHASORT"))
+#ifdef GLOB_ALPHASORT
+ return GLOB_ALPHASORT;
+#else
+ goto not_there;
+#endif
if (strEQ(name, "GLOB_ALTDIRFUNC"))
#ifdef GLOB_ALTDIRFUNC
return GLOB_ALTDIRFUNC;
diff --git a/gnu/usr.bin/perl/ext/File/Glob/bsd_glob.c b/gnu/usr.bin/perl/ext/File/Glob/bsd_glob.c
index 62bfe4f80c8..15ee659c858 100644
--- a/gnu/usr.bin/perl/ext/File/Glob/bsd_glob.c
+++ b/gnu/usr.bin/perl/ext/File/Glob/bsd_glob.c
@@ -57,6 +57,9 @@ static char sccsid[] = "@(#)glob.c 8.3 (Berkeley) 10/13/93";
* expand {1,2}{a,b} to 1a 1b 2a 2b
* gl_matchc:
* Number of matches in the current invocation of glob.
+ * GLOB_ALPHASORT:
+ * sort alphabetically like csh (case doesn't matter) instead of in ASCII
+ * order
*/
#include <EXTERN.h>
@@ -76,8 +79,11 @@ static char sccsid[] = "@(#)glob.c 8.3 (Berkeley) 10/13/93";
#ifndef MAXPATHLEN
# ifdef PATH_MAX
# define MAXPATHLEN PATH_MAX
-# else
-# define MAXPATHLEN 1024
+# ifdef MACOS_TRADITIONAL
+# define MAXPATHLEN 255
+# else
+# define MAXPATHLEN 1024
+# endif
# endif
#endif
@@ -90,7 +96,11 @@ static char sccsid[] = "@(#)glob.c 8.3 (Berkeley) 10/13/93";
#define BG_QUOTE '\\'
#define BG_RANGE '-'
#define BG_RBRACKET ']'
-#define BG_SEP '/'
+#ifdef MACOS_TRADITIONAL
+# define BG_SEP ':'
+#else
+# define BG_SEP '/'
+#endif
#ifdef DOSISH
#define BG_SEP2 '\\'
#endif
@@ -448,6 +458,12 @@ glob0(const Char *pattern, glob_t *pglob)
int c, err, oldflags, oldpathc;
Char *bufnext, patbuf[MAXPATHLEN+1];
+#ifdef MACOS_TRADITIONAL
+ if ( (*pattern == BG_TILDE) && (pglob->gl_flags & GLOB_TILDE) ) {
+ return(globextend(pattern, pglob));
+ }
+#endif
+
qpat = globtilde(pattern, patbuf, pglob);
qpatnext = qpat;
oldflags = pglob->gl_flags;
@@ -531,7 +547,8 @@ glob0(const Char *pattern, glob_t *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 & (GLOB_ALPHASORT|GLOB_NOCASE))
+ ? ci_compare : compare);
pglob->gl_flags = oldflags;
return(0);
}
@@ -541,13 +558,17 @@ ci_compare(const void *p, const void *q)
{
const char *pp = *(const char **)p;
const char *qq = *(const char **)q;
+ int ci;
while (*pp && *qq) {
if (tolower(*pp) != tolower(*qq))
break;
++pp;
++qq;
}
- return (tolower(*pp) - tolower(*qq));
+ ci = tolower(*pp) - tolower(*qq);
+ if (ci == 0)
+ return compare(p, q);
+ return ci;
}
static int
@@ -653,7 +674,7 @@ glob3(Char *pathbuf, Char *pathend, Char *pattern,
* and dirent.h as taking pointers to differently typed opaque
* structures.
*/
- Direntry_t *(*readdirfunc)();
+ Direntry_t *(*readdirfunc)(DIR*);
*pathend = BG_EOS;
errno = 0;
@@ -689,7 +710,7 @@ glob3(Char *pathbuf, Char *pathend, Char *pattern,
/* Search directory for matching names. */
if (pglob->gl_flags & GLOB_ALTDIRFUNC)
- readdirfunc = pglob->gl_readdir;
+ readdirfunc = (Direntry_t *(*)(DIR *))pglob->gl_readdir;
else
readdirfunc = my_readdir;
while ((dp = (*readdirfunc)(dirp))) {
@@ -853,10 +874,15 @@ g_opendir(register Char *str, glob_t *pglob)
{
char buf[MAXPATHLEN];
- if (!*str)
+ if (!*str) {
+#ifdef MACOS_TRADITIONAL
+ strcpy(buf, ":");
+#else
strcpy(buf, ".");
- else
+#endif
+ } else {
g_Ctoc(str, buf);
+ }
if (pglob->gl_flags & GLOB_ALTDIRFUNC)
return((*pglob->gl_opendir)(buf));
diff --git a/gnu/usr.bin/perl/ext/File/Glob/bsd_glob.h b/gnu/usr.bin/perl/ext/File/Glob/bsd_glob.h
index 10d1de534c6..5d04fff1c34 100644
--- a/gnu/usr.bin/perl/ext/File/Glob/bsd_glob.h
+++ b/gnu/usr.bin/perl/ext/File/Glob/bsd_glob.h
@@ -72,6 +72,7 @@ typedef struct {
#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_ALPHASORT 0x2000 /* Alphabetic, not ASCII sort, like csh. */
#define GLOB_NOSPACE (-1) /* Malloc call failed. */
#define GLOB_ABEND (-2) /* Unignored error. */
diff --git a/gnu/usr.bin/perl/ext/GDBM_File/GDBM_File.xs b/gnu/usr.bin/perl/ext/GDBM_File/GDBM_File.xs
index 870f056c9bf..5e426f90f32 100644
--- a/gnu/usr.bin/perl/ext/GDBM_File/GDBM_File.xs
+++ b/gnu/usr.bin/perl/ext/GDBM_File/GDBM_File.xs
@@ -42,12 +42,14 @@ typedef datum datum_value ;
typedef void (*FATALFUNC)();
+#ifndef GDBM_FAST
static int
not_here(char *s)
{
croak("GDBM_File::%s not implemented on this architecture", s);
return -1;
}
+#endif
/* GDBM allocates the datum with system malloc() and expects the user
* to free() it. So we either have to free() it immediately, or have
@@ -56,7 +58,7 @@ not_here(char *s)
static void
output_datum(pTHX_ SV *arg, char *str, int size)
{
-#if !defined(MYMALLOC) || (defined(MYMALLOC) && defined(PERL_POLLUTE_MALLOC))
+#if !defined(MYMALLOC) || (defined(MYMALLOC) && defined(PERL_POLLUTE_MALLOC) && !defined(LEAKTEST))
sv_usepvn(arg, str, size);
#else
sv_setpvn(arg, str, size);
@@ -122,6 +124,12 @@ constant(char *name, int arg)
#else
goto not_there;
#endif
+ if (strEQ(name, "GDBM_NOLOCK"))
+#ifdef GDBM_NOLOCK
+ return GDBM_NOLOCK;
+#else
+ goto not_there;
+#endif
if (strEQ(name, "GDBM_READER"))
#ifdef GDBM_READER
return GDBM_READER;
@@ -214,7 +222,7 @@ gdbm_TIEHASH(dbtype, name, read_write, mode, fatal_func = (FATALFUNC)croak)
GDBM_FILE dbp ;
RETVAL = NULL ;
- if (dbp = gdbm_open(name, GDBM_BLOCKSIZE, read_write, mode, fatal_func)) {
+ 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 ;
diff --git a/gnu/usr.bin/perl/ext/IO/lib/IO/Poll.pm b/gnu/usr.bin/perl/ext/IO/lib/IO/Poll.pm
index 687664b9abf..70a3469edbb 100644
--- a/gnu/usr.bin/perl/ext/IO/lib/IO/Poll.pm
+++ b/gnu/usr.bin/perl/ext/IO/lib/IO/Poll.pm
@@ -1,3 +1,4 @@
+
# IO::Poll.pm
#
# Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
@@ -12,28 +13,31 @@ use Exporter ();
our(@ISA, @EXPORT_OK, @EXPORT, $VERSION);
@ISA = qw(Exporter);
-$VERSION = "0.01";
+$VERSION = "0.05";
-@EXPORT = qw(poll);
+@EXPORT = qw( POLLIN
+ POLLOUT
+ POLLERR
+ POLLHUP
+ POLLNVAL
+ );
@EXPORT_OK = qw(
- POLLIN
POLLPRI
- POLLOUT
POLLRDNORM
POLLWRNORM
POLLRDBAND
POLLWRBAND
POLLNORM
- POLLERR
- POLLHUP
- POLLNVAL
-);
+ );
+# [0] maps fd's to requested masks
+# [1] maps fd's to returned masks
+# [2] maps fd's to handles
sub new {
my $class = shift;
- my $self = bless [{},{}], $class;
+ my $self = bless [{},{},{}], $class;
$self;
}
@@ -42,20 +46,21 @@ sub mask {
my $self = shift;
my $io = shift;
my $fd = fileno($io);
- if(@_) {
+ if (@_) {
my $mask = shift;
- $self->[0]{$fd} ||= {};
if($mask) {
- $self->[0]{$fd}{$io} = $mask;
- }
- else {
+ $self->[0]{$fd}{$io} = $mask; # the error events are always returned
+ $self->[1]{$fd} = 0; # output mask
+ $self->[2]{$io} = $io; # remember handle
+ } else {
delete $self->[0]{$fd}{$io};
+ delete $self->[1]{$fd} unless %{$self->[0]{$fd}};
+ delete $self->[2]{$io};
}
}
- elsif(exists $self->[0]{$fd}{$io}) {
+
+ return unless exists $self->[0]{$fd} and exists $self->[0]{$fd}{$io};
return $self->[0]{$fd}{$io};
- }
- return;
}
@@ -64,13 +69,13 @@ sub poll {
$self->[1] = {};
- my($fd,$ref);
+ my($fd,$mask,$iom);
my @poll = ();
- while(($fd,$ref) = each %{$self->[0]}) {
- my $events = 0;
- map { $events |= $_ } values %{$ref};
- push(@poll,$fd, $events);
+ while(($fd,$iom) = each %{$self->[0]}) {
+ $mask = 0;
+ $mask |= $_ for values(%$iom);
+ push(@poll,$fd => $mask);
}
my $ret = @poll ? _poll(defined($timeout) ? $timeout * 1000 : -1,@poll) : 0;
@@ -80,8 +85,7 @@ sub poll {
while(@poll) {
my($fd,$got) = splice(@poll,0,2);
- $self->[1]{$fd} = $got
- if $got;
+ $self->[1]{$fd} = $got if $got;
}
return $ret;
@@ -91,9 +95,8 @@ 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}
+ exists $self->[1]{$fd} and exists $self->[0]{$fd}{$io}
+ ? $self->[1]{$fd} & ($self->[0]{$fd}{$io}|POLLHUP|POLLERR|POLLNVAL)
: 0;
}
@@ -105,20 +108,16 @@ sub remove {
sub handles {
my $self = shift;
-
- return map { keys %$_ } values %{$self->[0]}
- unless(@_);
+ return values %{$self->[2]} 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;
- }
+ while (($io,$mask) = each %{$self->[0]{$fd}}) {
+ $mask |= POLLHUP|POLLERR|POLLNVAL; # must allow these
+ push @handles,$self->[2]{$io} if ($ev & $mask) & $events;
}
}
return @handles;
@@ -138,8 +137,8 @@ IO::Poll - Object interface to system poll call
$poll = new IO::Poll;
- $poll->mask($input_handle => POLLRDNORM | POLLIN | POLLHUP);
- $poll->mask($output_handle => POLLWRNORM);
+ $poll->mask($input_handle => POLLIN);
+ $poll->mask($output_handle => POLLOUT);
$poll->poll($timeout);
diff --git a/gnu/usr.bin/perl/ext/IO/lib/IO/Socket/UNIX.pm b/gnu/usr.bin/perl/ext/IO/lib/IO/Socket/UNIX.pm
index d083f48b78f..2a11752d027 100644
--- a/gnu/usr.bin/perl/ext/IO/lib/IO/Socket/UNIX.pm
+++ b/gnu/usr.bin/perl/ext/IO/lib/IO/Socket/UNIX.pm
@@ -37,7 +37,7 @@ sub configure {
$sock->bind($addr) or
return undef;
}
- if(exists $arg->{Listen}) {
+ if(exists $arg->{Listen} && $type != SOCK_DGRAM) {
$sock->listen($arg->{Listen} || 5) or
return undef;
}
diff --git a/gnu/usr.bin/perl/ext/IPC/SysV/SysV.xs b/gnu/usr.bin/perl/ext/IPC/SysV/SysV.xs
index 38062e028b5..c7985f99fe3 100644
--- a/gnu/usr.bin/perl/ext/IPC/SysV/SysV.xs
+++ b/gnu/usr.bin/perl/ext/IPC/SysV/SysV.xs
@@ -194,7 +194,7 @@ PPCODE:
MODULE=IPC::SysV PACKAGE=IPC::SysV
-int
+void
ftok(path, id)
char * path
int id
@@ -203,10 +203,10 @@ ftok(path, id)
key_t k = ftok(path, id);
ST(0) = k == (key_t) -1 ? &PL_sv_undef : sv_2mortal(newSViv(k));
#else
- DIE(PL_no_func, "ftok");
+ DIE(aTHX_ PL_no_func, "ftok");
#endif
-int
+void
SHMLBA()
CODE:
#ifdef SHMLBA
@@ -436,7 +436,7 @@ BOOT:
char *name;
int i;
- for(i = 0 ; name = IPC__SysV__const[i].n ; i++) {
+ for(i = 0 ; (name = IPC__SysV__const[i].n) ; i++) {
newCONSTSUB(stash,name, newSViv(IPC__SysV__const[i].v));
}
}
diff --git a/gnu/usr.bin/perl/ext/NDBM_File/Makefile.PL b/gnu/usr.bin/perl/ext/NDBM_File/Makefile.PL
index 6ceab55a4ae..7b586017d7d 100644
--- a/gnu/usr.bin/perl/ext/NDBM_File/Makefile.PL
+++ b/gnu/usr.bin/perl/ext/NDBM_File/Makefile.PL
@@ -5,4 +5,5 @@ WriteMakefile(
MAN3PODS => {}, # Pods will be built by installman.
XSPROTOARG => '-noprototypes', # XXX remove later?
VERSION_FROM => 'NDBM_File.pm',
+ INC => ($^O eq "MacOS" ? "-i ::::db:include" : "")
);
diff --git a/gnu/usr.bin/perl/ext/NDBM_File/NDBM_File.xs b/gnu/usr.bin/perl/ext/NDBM_File/NDBM_File.xs
index 49a1db5e565..c417eb693e9 100644
--- a/gnu/usr.bin/perl/ext/NDBM_File/NDBM_File.xs
+++ b/gnu/usr.bin/perl/ext/NDBM_File/NDBM_File.xs
@@ -1,6 +1,11 @@
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
+/* If using the DB3 emulation, ENTER is defined both
+ * by DB3 and Perl. We drop the Perl definition now.
+ * See also INSTALL section on DB3.
+ * -- Stanislav Brabec <utx@penguin.cz> */
+#undef ENTER
#include <ndbm.h>
typedef struct {
diff --git a/gnu/usr.bin/perl/ext/ODBM_File/typemap b/gnu/usr.bin/perl/ext/ODBM_File/typemap
index 7c23815ec75..096427ea7f3 100644
--- a/gnu/usr.bin/perl/ext/ODBM_File/typemap
+++ b/gnu/usr.bin/perl/ext/ODBM_File/typemap
@@ -20,8 +20,14 @@ T_DATUM_K
$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;
+ if (SvOK($arg)) {
+ $var.dptr = SvPV($arg, PL_na);
+ $var.dsize = (int)PL_na;
+ }
+ else {
+ $var.dptr = \"\";
+ $var.dsize = 0;
+ }
T_GDATUM
UNIMPLEMENTED
OUTPUT
diff --git a/gnu/usr.bin/perl/ext/POSIX/Makefile.PL b/gnu/usr.bin/perl/ext/POSIX/Makefile.PL
index 55c5c1fbf3f..73bb02dddb5 100644
--- a/gnu/usr.bin/perl/ext/POSIX/Makefile.PL
+++ b/gnu/usr.bin/perl/ext/POSIX/Makefile.PL
@@ -2,12 +2,7 @@ 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"]);
- }
+ @libs = ('LIBS' => ["-lm -lposix -lcposix"]);
}
WriteMakefile(
NAME => 'POSIX',
diff --git a/gnu/usr.bin/perl/ext/POSIX/hints/svr4.pl b/gnu/usr.bin/perl/ext/POSIX/hints/svr4.pl
new file mode 100644
index 00000000000..07f2cb04126
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/POSIX/hints/svr4.pl
@@ -0,0 +1,12 @@
+# NCR MP-RAS. Thanks to Doug Hendricks for this info.
+# Configure sets osname=svr4.0, osvers=3.0, archname='3441-svr4.0'
+# This system needs to explicitly link against -lmw to pull in some
+# symbols such as _mwoflocheckl and possibly others.
+# A. Dougherty Thu Dec 7 11:55:28 EST 2000
+if ($Config{'archname'} =~ /3441-svr4/) {
+ $self->{LIBS} = ['-lm -posix -lcposix -lmw'];
+}
+# Not sure what OS this one is.
+elsif ($Config{archname} =~ /RM\d\d\d-svr4/) {
+ $self->{LIBS} = ['-lm -lc -lposix -lcposix'];
+}
diff --git a/gnu/usr.bin/perl/ext/POSIX/typemap b/gnu/usr.bin/perl/ext/POSIX/typemap
index 63e41c77bf1..baf9bfc0519 100644
--- a/gnu/usr.bin/perl/ext/POSIX/typemap
+++ b/gnu/usr.bin/perl/ext/POSIX/typemap
@@ -5,6 +5,7 @@ Time_t T_NV
Gid_t T_NV
Off_t T_NV
Dev_t T_NV
+NV T_NV
fd T_IV
speed_t T_IV
tcflag_t T_IV
diff --git a/gnu/usr.bin/perl/ext/SDBM_File/SDBM_File.xs b/gnu/usr.bin/perl/ext/SDBM_File/SDBM_File.xs
index a4b90451a9b..859730bf3ac 100644
--- a/gnu/usr.bin/perl/ext/SDBM_File/SDBM_File.xs
+++ b/gnu/usr.bin/perl/ext/SDBM_File/SDBM_File.xs
@@ -57,7 +57,7 @@ sdbm_TIEHASH(dbtype, filename, flags, mode)
DBM * dbp ;
RETVAL = NULL ;
- if (dbp = sdbm_open(filename,flags,mode) ) {
+ if ((dbp = sdbm_open(filename,flags,mode))) {
RETVAL = (SDBM_File)safemalloc(sizeof(SDBM_File_type)) ;
Zero(RETVAL, 1, SDBM_File_type) ;
RETVAL->dbp = dbp ;
diff --git a/gnu/usr.bin/perl/ext/SDBM_File/sdbm/dbm.c b/gnu/usr.bin/perl/ext/SDBM_File/sdbm/dbm.c
index dc47d7001de..321ac3ef606 100644
--- a/gnu/usr.bin/perl/ext/SDBM_File/sdbm/dbm.c
+++ b/gnu/usr.bin/perl/ext/SDBM_File/sdbm/dbm.c
@@ -3,16 +3,33 @@
* All rights reserved.
*
* Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ * provided that the above copyright notice and this notice are
+ * duplicated in all such forms.
+ *
+ * [additional clause stricken -- see below]
+ *
+ * The name of the University may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission. THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ *
+ * This notice previously contained the additional clause:
+ *
+ * and that any documentation, advertising materials, and other
+ * materials related to such distribution and use acknowledge that
+ * the software was developed by the University of California,
+ * Berkeley.
+ *
+ * Pursuant to the licensing change made by the Office of Technology
+ * Licensing of the University of California, Berkeley on July 22,
+ * 1999 and documented in:
+ *
+ * ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
+ *
+ * this clause has been stricken and no longer is applicable to this
+ * software.
*/
#ifndef lint
diff --git a/gnu/usr.bin/perl/ext/SDBM_File/sdbm/dbm.h b/gnu/usr.bin/perl/ext/SDBM_File/sdbm/dbm.h
index 1196953d965..e2c93552389 100644
--- a/gnu/usr.bin/perl/ext/SDBM_File/sdbm/dbm.h
+++ b/gnu/usr.bin/perl/ext/SDBM_File/sdbm/dbm.h
@@ -3,16 +3,33 @@
* All rights reserved.
*
* Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ * provided that the above copyright notice and this notice are
+ * duplicated in all such forms.
+ *
+ * [additional clause stricken -- see below]
+ *
+ * The name of the University may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission. THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ *
+ * This notice previously contained the additional clause:
+ *
+ * and that any documentation, advertising materials, and other
+ * materials related to such distribution and use acknowledge that
+ * the software was developed by the University of California,
+ * Berkeley.
+ *
+ * Pursuant to the licensing change made by the Office of Technology
+ * Licensing of the University of California, Berkeley on July 22,
+ * 1999 and documented in:
+ *
+ * ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
+ *
+ * this clause has been stricken and no longer is applicable to this
+ * software.
*
* @(#)dbm.h 5.2 (Berkeley) 5/24/89
*/
diff --git a/gnu/usr.bin/perl/ext/Sys/Syslog/Syslog.xs b/gnu/usr.bin/perl/ext/Sys/Syslog/Syslog.xs
index f0573b8109a..31c0e845a2d 100644
--- a/gnu/usr.bin/perl/ext/Sys/Syslog/Syslog.xs
+++ b/gnu/usr.bin/perl/ext/Sys/Syslog/Syslog.xs
@@ -550,8 +550,7 @@ _PATH_LOG()
#ifdef _PATH_LOG
RETVAL = _PATH_LOG;
#else
- croak("Your vendor has not defined the Sys::Syslog macro _PATH_LOG");
- RETVAL = NULL;
+ RETVAL = "";
#endif
OUTPUT:
RETVAL
diff --git a/gnu/usr.bin/perl/ext/Thread/Thread.pm b/gnu/usr.bin/perl/ext/Thread/Thread.pm
index 00cba8af673..23f9fe51384 100644
--- a/gnu/usr.bin/perl/ext/Thread/Thread.pm
+++ b/gnu/usr.bin/perl/ext/Thread/Thread.pm
@@ -12,6 +12,15 @@ $VERSION = "1.0";
Thread - manipulate threads in Perl (EXPERIMENTAL, subject to change)
+=head1 CAVEAT
+
+The Thread extension requires Perl to be built in a particular way to
+enable the older 5.005 threading model. Just to confuse matters, there
+is an alternate threading model known as "ithreads" that does NOT
+support this extension. If you are using a binary distribution such
+as ActivePerl that is built with ithreads support, this extension CANNOT
+be used.
+
=head1 SYNOPSIS
use Thread;
@@ -130,7 +139,7 @@ signal is discarded.
=item cond_broadcast VARIABLE
-The C<cond_broadcast> function works similarly to C<cond_wait>.
+The C<cond_broadcast> function works similarly to C<cond_signal>.
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.
diff --git a/gnu/usr.bin/perl/ext/Thread/Thread.xs b/gnu/usr.bin/perl/ext/Thread/Thread.xs
index 4b5e6db9f86..15e2aa27c3a 100644
--- a/gnu/usr.bin/perl/ext/Thread/Thread.xs
+++ b/gnu/usr.bin/perl/ext/Thread/Thread.xs
@@ -21,7 +21,7 @@ static int sig_pipe[2];
#endif
static void
-remove_thread(pTHX_ struct perl_thread *t)
+remove_thread(pTHX_ Thread t)
{
#ifdef USE_THREADS
DEBUG_S(WITH_THR(PerlIO_printf(Perl_debug_log,
@@ -82,7 +82,7 @@ threadstart(void *arg)
#else
Thread thr = (Thread) arg;
LOGOP myop;
- djSP;
+ dSP;
I32 oldmark = TOPMARK;
I32 oldscope = PL_scopestack_ix;
I32 retval;
@@ -98,7 +98,6 @@ threadstart(void *arg)
DEBUG_S(PerlIO_printf(Perl_debug_log, "new thread %p waiting to start\n",
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
@@ -116,7 +115,6 @@ threadstart(void *arg)
*/
PERL_SET_THX(thr);
- /* Only now can we use SvPEEK (which calls sv_newmortal which does dTHR) */
DEBUG_S(PerlIO_printf(Perl_debug_log, "new thread %p starting at %s\n",
thr, SvPEEK(TOPs)));
@@ -323,7 +321,13 @@ newthread (pTHX_ SV *startsv, AV *initargs, char *classname)
return sv;
#else
- croak("No threads in this perl");
+# ifdef USE_ITHREADS
+ croak("This perl was built for \"ithreads\", which currently does not support Thread.pm.\n"
+ "Run \"perldoc Thread\" for more information");
+# else
+ croak("This perl was not built with support for 5.005-style threads.\n"
+ "Run \"perldoc Thread\" for more information");
+# endif
return &PL_sv_undef;
#endif
}
diff --git a/gnu/usr.bin/perl/ext/re/Makefile.PL b/gnu/usr.bin/perl/ext/re/Makefile.PL
index bd0f1f741c1..bc31b2c2cc6 100644
--- a/gnu/usr.bin/perl/ext/re/Makefile.PL
+++ b/gnu/usr.bin/perl/ext/re/Makefile.PL
@@ -1,4 +1,6 @@
use ExtUtils::MakeMaker;
+use File::Spec;
+
WriteMakefile(
NAME => 're',
VERSION_FROM => 're.pm',
@@ -9,33 +11,28 @@ WriteMakefile(
clean => { FILES => '*$(OBJ_EXT) *.c ../../lib/re.pm' },
);
-sub MY::postamble {
- if ($^O eq 'VMS') {
- return <<'VMS_EOF';
-re_comp.c : [--]regcomp.c
- - $(RM_F) $(MMS$TARGET_NAME)
- $(CP) [--]regcomp.c $(MMS$TARGET_NAME)
+package MY;
-re_comp$(OBJ_EXT) : re_comp.c
+sub upupfile {
+ File::Spec->catfile(File::Spec->updir, File::Spec->updir, $_[0]);
+}
-re_exec.c : [--]regexec.c
- - $(RM_F) $(MMS$TARGET_NAME)
- $(CP) [--]regexec.c $(MMS$TARGET_NAME)
+sub postamble {
+ my $regcomp_c = upupfile('regcomp.c');
+ my $regexec_c = upupfile('regexec.c');
-re_exec$(OBJ_EXT) : re_exec.c
+ <<EOF;
+re_comp.c : $regcomp_c
+ - \$(RM_F) re_comp.c
+ \$(CP) $regcomp_c re_comp.c
+re_comp\$(OBJ_EXT) : re_comp.c
-VMS_EOF
- } else {
- return <<'EOF';
-re_comp.c: ../../regcomp.c
- -$(RM_F) $@
- $(CP) ../../regcomp.c $@
+re_exec.c : $regexec_c
+ - \$(RM_F) re_exec.c
+ \$(CP) $regexec_c re_exec.c
-re_exec.c: ../../regexec.c
- -$(RM_F) $@
- $(CP) ../../regexec.c $@
+re_exec\$(OBJ_EXT) : re_exec.c
EOF
- }
}
diff --git a/gnu/usr.bin/perl/ext/re/hints/aix.pl b/gnu/usr.bin/perl/ext/re/hints/aix.pl
new file mode 100644
index 00000000000..4fbfefd7358
--- /dev/null
+++ b/gnu/usr.bin/perl/ext/re/hints/aix.pl
@@ -0,0 +1,22 @@
+# Add explicit link to deb.o to pick up .Perl_deb symbol which is not
+# mentioned in perl.exp for earlier cc (xlc) versions in at least
+# non DEBUGGING builds
+# Peter Prymmer <pvhp@best.com>
+
+use Config;
+
+if ($^O eq 'aix' && defined($Config{'ccversion'}) &&
+ ( $Config{'ccversion'} =~ /^3\.\d/
+ # needed for at least these versions:
+ # $Config{'ccversion'} eq '3.6.6.0'
+ # $Config{'ccversion'} eq '3.6.4.0'
+ # $Config{'ccversion'} eq '3.1.4.0' AIX 4.2
+ # $Config{'ccversion'} eq '3.1.4.10' AIX 4.2
+ # $Config{'ccversion'} eq '3.1.3.3'
+ ||
+ $Config{'ccversion'} =~ /^4\.4\.0\.[0-3]/
+ )
+ ) {
+ $self->{OBJECT} .= ' ../../deb$(OBJ_EXT)';
+}
+
diff --git a/gnu/usr.bin/perl/ext/re/re.xs b/gnu/usr.bin/perl/ext/re/re.xs
index 04a5fdc7420..25c2a90d60f 100644
--- a/gnu/usr.bin/perl/ext/re/re.xs
+++ b/gnu/usr.bin/perl/ext/re/re.xs
@@ -25,7 +25,6 @@ static int oldfl;
static void
deinstall(pTHX)
{
- dTHR;
PL_regexecp = Perl_regexec_flags;
PL_regcompp = Perl_pregcomp;
PL_regint_start = Perl_re_intuit_start;
@@ -39,7 +38,6 @@ deinstall(pTHX)
static void
install(pTHX)
{
- dTHR;
PL_colorset = 0; /* Allow reinspection of ENV. */
PL_regexecp = &my_regexec;
PL_regcompp = &my_regcomp;
diff --git a/gnu/usr.bin/perl/globals.c b/gnu/usr.bin/perl/globals.c
index 0782eba226f..5bf4aeabcbd 100644
--- a/gnu/usr.bin/perl/globals.c
+++ b/gnu/usr.bin/perl/globals.c
@@ -79,4 +79,13 @@ Perl_fprintf_nocontext(PerlIO *stream, const char *format, ...)
return PerlIO_vprintf(stream, format, arglist);
}
+int
+Perl_printf_nocontext(const char *format, ...)
+{
+ dTHX;
+ va_list(arglist);
+ va_start(arglist, format);
+ return PerlIO_vprintf(PerlIO_stdout(), format, arglist);
+}
+
#include "perlapi.h" /* bring in PL_force_link_funcs */
diff --git a/gnu/usr.bin/perl/hints/cygwin.sh b/gnu/usr.bin/perl/hints/cygwin.sh
index 42114c249f0..c57d3f6fdf7 100644
--- a/gnu/usr.bin/perl/hints/cygwin.sh
+++ b/gnu/usr.bin/perl/hints/cygwin.sh
@@ -19,9 +19,13 @@ then
plibpth=`cd $plibpth && pwd`
fi
so='dll'
-# - eliminate -lc, implied by gcc
+# - eliminate -lc, implied by gcc and a symlink to libcygwin.a
libswanted=`echo " $libswanted " | sed -e 's/ c / /g'`
-libswanted="$libswanted cygipc cygwin kernel32"
+# - eliminate -lm, symlink to libcygwin.a
+libswanted=`echo " $libswanted " | sed -e 's/ m / /g'`
+libswanted="$libswanted cygipc"
+test -z "$optimize" && optimize='-O2'
+ccflags="$ccflags -DPERL_USE_SAFE_PUTENV"
# - otherwise i686-cygwin
archname='cygwin'
@@ -34,11 +38,6 @@ ld='ld2'
# - 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'
diff --git a/gnu/usr.bin/perl/hints/darwin.sh b/gnu/usr.bin/perl/hints/darwin.sh
index fd61e424b03..8625798d536 100644
--- a/gnu/usr.bin/perl/hints/darwin.sh
+++ b/gnu/usr.bin/perl/hints/darwin.sh
@@ -47,7 +47,7 @@ ld='cc';
so='dylib';
dlext='bundle';
dlsrc='dl_dyld.xs'; usedl='define';
-cccdlflags='';
+cccdlflags=' '; # space, not empty, because otherwise we get -fpic
lddlflags="${ldflags} -bundle -undefined suppress";
ldlibpthname='DYLD_LIBRARY_PATH';
useshrplib='true';
diff --git a/gnu/usr.bin/perl/hints/dos_djgpp.sh b/gnu/usr.bin/perl/hints/dos_djgpp.sh
index d50bca4b25e..ebbd786b45e 100644
--- a/gnu/usr.bin/perl/hints/dos_djgpp.sh
+++ b/gnu/usr.bin/perl/hints/dos_djgpp.sh
@@ -41,10 +41,13 @@ startperl='#!perl'
case "X$optimize" in
X)
optimize="-O2 -malign-loops=2 -malign-jumps=2 -malign-functions=2"
+ ldflags='-s'
+ ;;
+ X*)
+ ldflags=' '
;;
esac
ccflags="$ccflags -DPERL_EXTERNAL_GLOB"
-ldflags='-s'
usemymalloc='n'
timetype='time_t'
diff --git a/gnu/usr.bin/perl/hints/mint.sh b/gnu/usr.bin/perl/hints/mint.sh
index ab55e612e10..b9a7886f9ad 100644
--- a/gnu/usr.bin/perl/hints/mint.sh
+++ b/gnu/usr.bin/perl/hints/mint.sh
@@ -53,7 +53,6 @@ d_fsetpos='fpos_t'
gidtype='gid_t'
groupstype='gid_t'
lseektype='long'
-models='none'
modetype='mode_t'
sizetype='size_t'
timetype='time_t'
diff --git a/gnu/usr.bin/perl/hints/nonstopux.sh b/gnu/usr.bin/perl/hints/nonstopux.sh
new file mode 100644
index 00000000000..aec05ee680a
--- /dev/null
+++ b/gnu/usr.bin/perl/hints/nonstopux.sh
@@ -0,0 +1,17 @@
+# tom_bates@att.net
+# mips-compaq-nonstopux
+
+. $src/hints/svr4.sh
+
+case "$cc" in
+ *gcc*)
+ ccflags='-fno-strict-aliasing'
+ lddlflags='-shared'
+ ldflags=''
+ ;;
+ *)
+ cc="cc -Xa -Olimit 4096"
+ malloctype="void *"
+ ;;
+esac
+
diff --git a/gnu/usr.bin/perl/hints/posix-bc.sh b/gnu/usr.bin/perl/hints/posix-bc.sh
index ec21bc327e4..62752339920 100644
--- a/gnu/usr.bin/perl/hints/posix-bc.sh
+++ b/gnu/usr.bin/perl/hints/posix-bc.sh
@@ -6,37 +6,89 @@
# 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'
+# To get ANSI C, we need to use c89, and ld does not exist
+# You can override this with Configure -Dcc=gcc -Dld=ld.
+case "$cc" in
+'') cc='c89' ;;
+esac
+case "$ld" in
+'') ld='c89' ;;
+esac
# C-Flags:
-ccflags='-DPOSIX_BC -DUSE_PURE_BISON -D_XOPEN_SOURCE_EXTENDED'
+# -DPOSIX_BC
+# -DUSE_PURE_BISON
+# -D_XOPEN_SOURCE_EXTENDED alters system headers.
+# Prepend your favorites with Configure -Dccflags=your_favorites
+case "$ccflags" in
+'') ccflags='-K enum_long,llm_case_lower,llm_keep,no_integer_overflow -DPOSIX_BC -DUSE_PURE_BISON -D_XOPEN_SOURCE_EXTENDED' ;;
+*) ccflags='$ccflags -Kenum_long,llm_case_lower,llm_keep,no_integer_overflow -DPOSIX_BC -DUSE_PURE_BISON -D_XOPEN_SOURCE_EXTENDED' ;;
+esac
+
+# ccdlflags have yet to be determined.
+#case "$ccdlflags" in
+#'') ccdlflags='-c' ;;
+#esac
+
+# cccdlflags have yet to be determined.
+#case "$cccdlflags" in
+#'') cccdlflags='' ;;
+#esac
+
+# ldflags have yet to be determined.
+#case "$ldflags" in
+#'') ldflags='' ;;
+#esac
+
+# lddlflags have yet to be determined.
+#case "$lddlflags" in
+#'') lddlflags='' ;;
+#esac
# 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'
+ ccflags="-K risc_4000 $ccflags"
ldflags='-K risc_4000'
fi
# Turning on optimization breaks perl (CORE-DUMP):
-optimize='none'
+# You can override this with Configure -Doptimize='-O' or somesuch.
+case "$optimize" in
+'') optimize='none' ;;
+esac
# we don''t use dynamic memorys (yet):
-so='none'
-usedl='no'
-dlext='none'
+case "$so" in
+'') so='none' ;;
+esac
-# On BS2000/Posix, libc.a doesn't really hold anything at all,
-# so running nm on it is pretty useless.
-usenm='no'
-
-# other Options:
+case "$usemymalloc" in
+'') usemymalloc='n' ;;
+esac
-usemymalloc='no'
+# On BS2000/Posix, libc.a does not really hold anything at all,
+# so running nm on it is pretty useless.
+# You can override this with Configure -Dusenm.
+case "$usenm" in
+'') usenm='false' ;;
+esac
-archobjs=ebcdic.o
+# Dynamic loading doesn't work on OS/390 quite yet.
+# You can override this with
+# Configure -Dusedl -Ddlext=.so -Ddlsrc=dl_dllload.xs.
+case "$usedl" in
+'') usedl='n' ;;
+esac
+case "$dlext" in
+'') dlext='none' ;;
+esac
+#case "$dlsrc" in
+#'') dlsrc='none' ;;
+#esac
+#case "$ldlibpthname" in
+#'') ldlibpthname=LIBPATH ;;
+#esac
diff --git a/gnu/usr.bin/perl/hints/uts.sh b/gnu/usr.bin/perl/hints/uts.sh
index 9ad72d7e987..2bae4b0acf2 100644
--- a/gnu/usr.bin/perl/hints/uts.sh
+++ b/gnu/usr.bin/perl/hints/uts.sh
@@ -1,2 +1,18 @@
-ccflags="$ccflags -DCRIPPLED_CC"
-d_lstat=define
+archname='s390'
+cc='cc -Xa'
+cccdlflags='-pic'
+d_bincompat3='undef'
+d_csh='undef'
+d_lstat='define'
+d_suidsafe='define'
+dlsrc='dl_dlopen.xs'
+ld='ld'
+lddlflags='-G -z text'
+libperl='libperl.so'
+libpth='/lib /usr/lib /usr/ccs/lib'
+libs='-lsocket -lnsl -ldl -lm'
+optimize='undef'
+prefix='psf_prefix'
+static_ext='none'
+dynamic_ext='Fcntl IO Opcode Socket'
+useshrplib='define'
diff --git a/gnu/usr.bin/perl/hints/vmesa.sh b/gnu/usr.bin/perl/hints/vmesa.sh
index bc033878229..0213853fec9 100644
--- a/gnu/usr.bin/perl/hints/vmesa.sh
+++ b/gnu/usr.bin/perl/hints/vmesa.sh
@@ -24,7 +24,7 @@ d_access='define'
d_alarm='define'
d_archlib='define'
# randbits='15'
-archobjs="ebcdic.o vmesa.o"
+archobjs="vmesa.o"
d_attribut='undef'
d_bcmp='define'
d_bcopy='define'
@@ -294,7 +294,6 @@ make='gnumake'
mallocobj=''
mallocsrc=''
malloctype='void *'
-models='none'
netdb_hlen_type='size_t'
netdb_host_type='char *'
netdb_name_type='const char *'
diff --git a/gnu/usr.bin/perl/intrpvar.h b/gnu/usr.bin/perl/intrpvar.h
index 39d14c985e4..57f31bbe1f1 100644
--- a/gnu/usr.bin/perl/intrpvar.h
+++ b/gnu/usr.bin/perl/intrpvar.h
@@ -34,7 +34,7 @@ PERLVAR(Iminus_F, bool)
PERLVAR(Idoswitches, bool)
/*
-=for apidoc Amn|bool|PL_dowarn
+=for apidoc mn|bool|PL_dowarn
The C variable which corresponds to Perl's $^W warning variable.
@@ -89,20 +89,20 @@ PERLVAR(IDBgv, GV *)
PERLVAR(IDBline, GV *)
/*
-=for apidoc Amn|GV *|PL_DBsub
+=for apidoc mn|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
+=for apidoc mn|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
+=for apidoc mn|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>.
@@ -245,19 +245,19 @@ 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(Ixiv_root, IV *) /* free xiv list */
+PERLVAR(Ixnv_root, NV *) /* free xnv list */
+PERLVAR(Ixrv_root, XRV *) /* free xrv list */
+PERLVAR(Ixpv_root, XPV *) /* free xpv list */
+PERLVAR(Ixpviv_root, XPVIV *) /* free xpviv list */
+PERLVAR(Ixpvnv_root, XPVNV *) /* free xpvnv list */
+PERLVAR(Ixpvcv_root, XPVCV *) /* free xpvcv list */
+PERLVAR(Ixpvav_root, XPVAV *) /* free xpvav list */
+PERLVAR(Ixpvhv_root, XPVHV *) /* free xpvhv list */
+PERLVAR(Ixpvmg_root, XPVMG *) /* free xpvmg list */
+PERLVAR(Ixpvlv_root, XPVLV *) /* free xpvlv list */
+PERLVAR(Ixpvbm_root, XPVBM *) /* free xpvbm list */
+PERLVAR(Ihe_root, HE *) /* free he list */
PERLVAR(Inice_chunk, char *) /* a nice chunk of memory to reuse */
PERLVAR(Inice_chunk_size, U32) /* how nice the chunk of memory is */
@@ -363,8 +363,8 @@ 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 '.' */
+PERLVAR(Idummy1_bincompat, char)
+ /* Used to be numeric_radix */
#endif /* !USE_LOCALE_NUMERIC */
@@ -443,3 +443,33 @@ PERLVAR(IProc, struct IPerlProc*)
#if defined(USE_ITHREADS)
PERLVAR(Iptr_table, PTR_TBL_t*)
#endif
+PERLVARI(Ibeginav_save, AV*, Nullav) /* save BEGIN{}s when compiling */
+
+#ifdef USE_THREADS
+PERLVAR(Ifdpid_mutex, perl_mutex) /* mutex for fdpid array */
+PERLVAR(Isv_lock_mutex, perl_mutex) /* mutex for SvLOCK macro */
+#endif
+
+PERLVAR(Inullstash, HV *) /* illegal symbols end up here */
+
+PERLVAR(Ixnv_arenaroot, XPV*) /* list of allocated xnv areas */
+PERLVAR(Ixrv_arenaroot, XPV*) /* list of allocated xrv areas */
+PERLVAR(Ixpv_arenaroot, XPV*) /* list of allocated xpv areas */
+PERLVAR(Ixpviv_arenaroot,XPVIV*) /* list of allocated xpviv areas */
+PERLVAR(Ixpvnv_arenaroot,XPVNV*) /* list of allocated xpvnv areas */
+PERLVAR(Ixpvcv_arenaroot,XPVCV*) /* list of allocated xpvcv areas */
+PERLVAR(Ixpvav_arenaroot,XPVAV*) /* list of allocated xpvav areas */
+PERLVAR(Ixpvhv_arenaroot,XPVHV*) /* list of allocated xpvhv areas */
+PERLVAR(Ixpvmg_arenaroot,XPVMG*) /* list of allocated xpvmg areas */
+PERLVAR(Ixpvlv_arenaroot,XPVLV*) /* list of allocated xpvlv areas */
+PERLVAR(Ixpvbm_arenaroot,XPVBM*) /* list of allocated xpvbm areas */
+PERLVAR(Ihe_arenaroot, XPV*) /* list of allocated he areas */
+
+#ifdef USE_LOCALE_NUMERIC
+
+PERLVAR(Inumeric_radix_sv, SV *) /* The radix separator if not '.' */
+#endif
+
+/* New variables must be added to the very end for binary compatibility.
+ * XSUB.h provides wrapper functions via perlapi.h that make this
+ * irrelevant, but not all code may be expected to #include XSUB.h. */
diff --git a/gnu/usr.bin/perl/iperlsys.h b/gnu/usr.bin/perl/iperlsys.h
index f36dcd5f32a..2f08a24c68e 100644
--- a/gnu/usr.bin/perl/iperlsys.h
+++ b/gnu/usr.bin/perl/iperlsys.h
@@ -186,13 +186,19 @@ struct IPerlStdIOInfo
#ifdef USE_STDIO_PTR
# define PerlIO_has_cntptr(f) 1
-# ifdef STDIO_CNT_LVALUE
-# define PerlIO_canset_cnt(f) 1
-# ifdef STDIO_PTR_LVALUE
+# ifdef STDIO_PTR_LVALUE
+# ifdef STDIO_CNT_LVALUE
+# define PerlIO_canset_cnt(f) 1
+# ifdef STDIO_PTR_LVAL_NOCHANGE_CNT
+# define PerlIO_fast_gets(f) 1
+# endif
+# else /* STDIO_CNT_LVALUE */
+# define PerlIO_canset_cnt(f) 0
+# endif
+# else /* STDIO_PTR_LVALUE */
+# ifdef STDIO_PTR_LVAL_SETS_CNT
# define PerlIO_fast_gets(f) 1
# endif
-# else
-# define PerlIO_canset_cnt(f) 0
# endif
#else /* USE_STDIO_PTR */
# define PerlIO_has_cntptr(f) 0
@@ -266,7 +272,7 @@ struct IPerlStdIOInfo
#define PerlIO_setlinebuf(f) \
(*PL_StdIO->pSetlinebuf)(PL_StdIO, (f))
#define PerlIO_printf Perl_fprintf_nocontext
-#define PerlIO_stdoutf *PL_StdIO->pPrintf
+#define PerlIO_stdoutf Perl_printf_nocontext
#define PerlIO_vprintf(f,fmt,a) \
(*PL_StdIO->pVprintf)(PL_StdIO, (f),(fmt),a)
#define PerlIO_tell(f) \
@@ -466,11 +472,19 @@ extern PerlIO * PerlIO_stdout (void);
extern PerlIO * PerlIO_stderr (void);
#endif
#ifndef PerlIO_getpos
+#ifdef USE_SFIO
+extern int PerlIO_getpos (PerlIO *,Off_t *);
+#else
extern int PerlIO_getpos (PerlIO *,Fpos_t *);
#endif
+#endif
#ifndef PerlIO_setpos
+#ifdef USE_SFIO
+extern int PerlIO_setpos (PerlIO *,const Off_t *);
+#else
extern int PerlIO_setpos (PerlIO *,const Fpos_t *);
#endif
+#endif
#ifndef PerlIO_fdupopen
extern PerlIO * PerlIO_fdupopen (PerlIO *);
#endif
@@ -551,7 +565,7 @@ struct IPerlDirInfo
#define PerlDir_mkdir(name, mode) Mkdir((name), (mode))
#ifdef VMS
-# define PerlDir_chdir(n) chdir(((n) && *(n)) ? (n) : "SYS$LOGIN")
+# define PerlDir_chdir(n) Chdir(((n) && *(n)) ? (n) : "SYS$LOGIN")
#else
# define PerlDir_chdir(name) chdir((name))
#endif
diff --git a/gnu/usr.bin/perl/jpl/ChangeLog b/gnu/usr.bin/perl/jpl/ChangeLog
new file mode 100644
index 00000000000..a3e3b0044c6
--- /dev/null
+++ b/gnu/usr.bin/perl/jpl/ChangeLog
@@ -0,0 +1,30 @@
+2000-12-18 Bradley M. Kuhn <bkuhn@ebb.org>
+
+ * JNI/JNI.pm: Updated version to 0.1
+
+2000-12-16 Bradley M. Kuhn <bkuhn@ebb.org>
+
+ * JNI/JNI.pm (AUTOLOAD): Added check to make sure fiels only
+ appear once in CLASSPATH.
+
+2000-12-07 Bradley M. Kuhn <bkuhn@ebb.org>
+
+ * JNI/JNI.xs: Added a requirement that -DJPL_DEBUG be defined for
+ JNI.xs to print out jpldebug options
+
+2000-12-06 Bradley M. Kuhn <bkuhn@ebb.org>
+
+ * JNI/JNI.pm: removed some stray C-m's floating in the file
+
+ * README.JUST-JNI: Added instructions concerning Kaffe.
+
+ * JNI/JNI.xs (GetJavaVM): Added support for Kaffe's options, and
+ made sure version number gets set. Also did error checking on
+ creating the JVM.
+ Fixed bug on option processing.
+
+ * JNI/Makefile.PL: Added support to configure Kaffe, including
+ automatic creation of JNI/Config.pm (a new file).
+
+ * JNI/JNI.pm (AUTOLOAD): Added support for Kaffe.
+
diff --git a/gnu/usr.bin/perl/jpl/JNI/JNI.pm b/gnu/usr.bin/perl/jpl/JNI/JNI.pm
index edbc1e6067c..6ef65e275a7 100644
--- a/gnu/usr.bin/perl/jpl/JNI/JNI.pm
+++ b/gnu/usr.bin/perl/jpl/JNI/JNI.pm
@@ -187,7 +187,7 @@ require AutoLoader;
GetJavaVM
);
-$VERSION = '0.01';
+$VERSION = '0.1';
sub AUTOLOAD {
# This AUTOLOAD is used to 'autoload' constants from the constant()
@@ -213,28 +213,77 @@ sub AUTOLOAD {
bootstrap JNI $VERSION;
if (not $JPL::_env_) {
+ # Note that only Kaffe support only cares about what JNI::Config says
+ use JNI::Config qw($KAFFE $LD_LIBRARY_PATH $CLASS_HOME $LIB_HOME $JAVA_LIB);
+
+ # Win32 and Sun JDK pay attention to $ENV{JAVA_HOME}; Kaffe doesn't
$ENV{JAVA_HOME} ||= "/usr/local/java";
my ($arch, @CLASSPATH);
- if ($^O eq 'MSWin32') {
+ if ($^O eq 'MSWin32' and (! $JNI::Config::KAFFE) ) {
$arch = 'MSWin32' unless -d "$ENV{JAVA_HOME}/lib/$arch";
@CLASSPATH = split(/;/, $ENV{CLASSPATH});
@CLASSPATH = "." unless @CLASSPATH;
push @CLASSPATH,
"$ENV{JAVA_HOME}\\classes",
- "$ENV{JAVA_HOME}\\lib\\classes.zip";
+ "$ENV{JAVA_HOME}\\lib\\classes.zip",
+ # MSR - added for JDK 1.3
+ "$ENV{JAVA_HOME}\\jre\\lib\\rt.jar",
+ # MSR - added to find Closer.class
+ '.';
$ENV{CLASSPATH} = join(';', @CLASSPATH);
$ENV{THREADS_TYPE} ||= "green_threads";
- $JAVALIB = "$ENV{JAVA_HOME}/lib/$arch/$ENV{THREADS_TYPE}";
+ #$JAVALIB = "$ENV{JAVA_HOME}/lib/$arch/$ENV{THREADS_TYPE}";
+ # MSR - changed above for JDK 1.3
+ $JAVALIB = "$ENV{JAVA_HOME}/lib/";
+
$ENV{LD_LIBRARY_PATH} .= ":$JAVALIB";
push @JVM_ARGS, "classpath", $ENV{CLASSPATH};
- print "JVM_ARGS=@JVM_ARGS!\n";
+ print "JVM_ARGS=@JVM_ARGS!\n" if $JPL::DEBUG;
$JVM = GetJavaVM("$JAVALIB/javai.dll",@JVM_ARGS);
-
+ } elsif ($^O eq 'MSWin32' and $JNI::Config::KAFFE) {
+ croak "Kaffe is not yet supported on MSWin32 platform!";
+ } elsif ($JNI::Config::KAFFE) {
+ # The following code has to build a classpath for us. It would be
+ # better if we could have *both* a classpath and a classhome, and
+ # not have to "guess" at the classpath like this. We should be able
+ # to send in, say, a classpath of ".", and classhome of
+ # ".../share/kaffe", and have it build the right classpath. That
+ # doesn't work. The function initClasspath() in findInJar.c in the
+ # Kaffe source says: "Oh, you have a classpath, well forget
+ # classhome!" This seems brain-dead to me. But, anyway, that's why
+ # I don't use the classhome option on GetJavaVM. I have to build
+ # the classpath by hand. *sigh*
+ # -- bkuhn
+
+ my $classpath = $ENV{CLASSPATH} || ".";
+ my %classCheck;
+ @classCheck{split(/\s*:\s*/, $classpath)} = 1;
+ foreach my $jarFile (qw(Klasses.jar comm.jar pjava.jar
+ tools.jar microsoft.jar rmi.jar)) {
+ $classpath .= ":$JNI::Config::CLASS_HOME/$jarFile"
+ unless defined $classCheck{"$JNI::Config::CLASS_HOME/$jarFile"};
+ # Assume that if someone else already put these here, they knew
+ # what they were doing and have the order right.
+ }
+ $classpath = ".:$classpath" unless defined $classCheck{"."};
+
+ $ENV{CLASSPATH} = $classpath; # Not needed for GetJavaVM(), since
+ # we pass it in as a JVM option, but
+ # something else might expect it.
+ # (also see comment above)
+ print STDERR "bkuhn: JNI classpath=$classpath\n";
+ unshift(@JVM_ARGS, "classpath", $classpath,
+ "libraryhome", $JNI::Config::LIB_HOME);
+
+ # The following line is useless; see comment above.
+ # "classhome", $JNI::Config::CLASS_HOME);
+
+ $JVM = GetJavaVM($JNI::Config::JAVA_LIB, @JVM_ARGS);
} else {
chop($arch = `uname -p`);
chop($arch = `uname -m`) unless -d "$ENV{JAVA_HOME}/lib/$arch";
@@ -251,7 +300,7 @@ if (not $JPL::_env_) {
$JAVALIB = "$ENV{JAVA_HOME}/lib/$arch/$ENV{THREADS_TYPE}";
$ENV{LD_LIBRARY_PATH} .= ":$JAVALIB";
push @JVM_ARGS, "classpath", $ENV{CLASSPATH};
- print "JVM_ARGS=@JVM_ARGS!\n";
+ print "JVM_ARGS=@JVM_ARGS!\n" if $JPL::DEBUG;
$JVM = GetJavaVM("$JAVALIB/libjava.so",@JVM_ARGS);
}
}
diff --git a/gnu/usr.bin/perl/jpl/JNI/JNI.xs b/gnu/usr.bin/perl/jpl/JNI/JNI.xs
index e5e0af3b535..f4826954e72 100644
--- a/gnu/usr.bin/perl/jpl/JNI/JNI.xs
+++ b/gnu/usr.bin/perl/jpl/JNI/JNI.xs
@@ -18,8 +18,7 @@
# define PERL_SUBVERSION SUBVERSION
#endif
-#if PERL_REVISION == 5 && (PERL_VERSION < 4 || \
- (PERL_VERSION == 4 && PERL_SUBVERSION <= 75))
+#if PERL_REVISION == 5 && (PERL_VERSION < 4 || (PERL_VERSION == 4 && PERL_SUBVERSION <= 75))
# define PL_na na
# define PL_sv_no sv_no
# define PL_sv_undef sv_undef
@@ -120,18 +119,10 @@ makeargs(char *sig, SV** svp, int items)
int i;
SV** esv;
-#ifdef WIN32
- jbooleanArray ja = env->NewBooleanArray(len);
-#else
jbooleanArray ja = (*env)->NewBooleanArray(env, len);
-#endif
for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)
buf[i] = (jboolean)SvIV(*esv);
-#ifdef WIN32
- env->SetBooleanArrayRegion(ja, 0, len, buf);
-#else
(*env)->SetBooleanArrayRegion(env, ja, 0, len, buf);
-#endif
free((void*)buf);
jv[ix++].l = (jobject)ja;
}
@@ -141,16 +132,8 @@ makeargs(char *sig, SV** svp, int items)
else if (SvPOK(sv)) {
jsize len = sv_len(sv) / sizeof(jboolean);
-#ifdef WIN32
- jbooleanArray ja = env->NewBooleanArray(len);
-#else
jbooleanArray ja = (*env)->NewBooleanArray(env, len);
-#endif
-#ifdef WIN32
- env->SetBooleanArrayRegion(ja, 0, len, (jboolean*)SvPV(sv,n_a));
-#else
(*env)->SetBooleanArrayRegion(env, ja, 0, len, (jboolean*)SvPV(sv,n_a));
-#endif
jv[ix++].l = (jobject)ja;
}
else
@@ -167,18 +150,10 @@ makeargs(char *sig, SV** svp, int items)
int i;
SV** esv;
-#ifdef WIN32
- jbyteArray ja = env->NewByteArray(len);
-#else
jbyteArray ja = (*env)->NewByteArray(env, len);
-#endif
for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)
buf[i] = (jbyte)SvIV(*esv);
-#ifdef WIN32
- env->SetByteArrayRegion(ja, 0, len, buf);
-#else
(*env)->SetByteArrayRegion(env, ja, 0, len, buf);
-#endif
free((void*)buf);
jv[ix++].l = (jobject)ja;
}
@@ -188,16 +163,8 @@ makeargs(char *sig, SV** svp, int items)
else if (SvPOK(sv)) {
jsize len = sv_len(sv) / sizeof(jbyte);
-#ifdef WIN32
- jbyteArray ja = env->NewByteArray(len);
-#else
jbyteArray ja = (*env)->NewByteArray(env, len);
-#endif
-#ifdef WIN32
- env->SetByteArrayRegion(ja, 0, len, (jbyte*)SvPV(sv,n_a));
-#else
(*env)->SetByteArrayRegion(env, ja, 0, len, (jbyte*)SvPV(sv,n_a));
-#endif
jv[ix++].l = (jobject)ja;
}
else
@@ -214,18 +181,10 @@ makeargs(char *sig, SV** svp, int items)
int i;
SV** esv;
-#ifdef WIN32
- jcharArray ja = env->NewCharArray(len);
-#else
jcharArray ja = (*env)->NewCharArray(env, len);
-#endif
for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)
buf[i] = (jchar)SvIV(*esv);
-#ifdef WIN32
- env->SetCharArrayRegion(ja, 0, len, buf);
-#else
(*env)->SetCharArrayRegion(env, ja, 0, len, buf);
-#endif
free((void*)buf);
jv[ix++].l = (jobject)ja;
}
@@ -235,16 +194,8 @@ makeargs(char *sig, SV** svp, int items)
else if (SvPOK(sv)) {
jsize len = sv_len(sv) / sizeof(jchar);
-#ifdef WIN32
- jcharArray ja = env->NewCharArray(len);
-#else
jcharArray ja = (*env)->NewCharArray(env, len);
-#endif
-#ifdef WIN32
- env->SetCharArrayRegion(ja, 0, len, (jchar*)SvPV(sv,n_a));
-#else
(*env)->SetCharArrayRegion(env, ja, 0, len, (jchar*)SvPV(sv,n_a));
-#endif
jv[ix++].l = (jobject)ja;
}
else
@@ -261,18 +212,10 @@ makeargs(char *sig, SV** svp, int items)
int i;
SV** esv;
-#ifdef WIN32
- jshortArray ja = env->NewShortArray(len);
-#else
jshortArray ja = (*env)->NewShortArray(env, len);
-#endif
for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)
buf[i] = (jshort)SvIV(*esv);
-#ifdef WIN32
- env->SetShortArrayRegion(ja, 0, len, buf);
-#else
(*env)->SetShortArrayRegion(env, ja, 0, len, buf);
-#endif
free((void*)buf);
jv[ix++].l = (jobject)ja;
}
@@ -282,16 +225,8 @@ makeargs(char *sig, SV** svp, int items)
else if (SvPOK(sv)) {
jsize len = sv_len(sv) / sizeof(jshort);
-#ifdef WIN32
- jshortArray ja = env->NewShortArray(len);
-#else
jshortArray ja = (*env)->NewShortArray(env, len);
-#endif
-#ifdef WIN32
- env->SetShortArrayRegion(ja, 0, len, (jshort*)SvPV(sv,n_a));
-#else
(*env)->SetShortArrayRegion(env, ja, 0, len, (jshort*)SvPV(sv,n_a));
-#endif
jv[ix++].l = (jobject)ja;
}
else
@@ -308,18 +243,10 @@ makeargs(char *sig, SV** svp, int items)
int i;
SV** esv;
-#ifdef WIN32
- jintArray ja = env->NewIntArray(len);
-#else
jintArray ja = (*env)->NewIntArray(env, len);
-#endif
for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)
buf[i] = (jint)SvIV(*esv);
-#ifdef WIN32
- env->SetIntArrayRegion(ja, 0, len, buf);
-#else
(*env)->SetIntArrayRegion(env, ja, 0, len, buf);
-#endif
free((void*)buf);
jv[ix++].l = (jobject)ja;
}
@@ -329,16 +256,8 @@ makeargs(char *sig, SV** svp, int items)
else if (SvPOK(sv)) {
jsize len = sv_len(sv) / sizeof(jint);
-#ifdef WIN32
- jintArray ja = env->NewIntArray(len);
-#else
jintArray ja = (*env)->NewIntArray(env, len);
-#endif
-#ifdef WIN32
- env->SetIntArrayRegion(ja, 0, len, (jint*)SvPV(sv,n_a));
-#else
(*env)->SetIntArrayRegion(env, ja, 0, len, (jint*)SvPV(sv,n_a));
-#endif
jv[ix++].l = (jobject)ja;
}
else
@@ -355,18 +274,10 @@ makeargs(char *sig, SV** svp, int items)
int i;
SV** esv;
-#ifdef WIN32
- jlongArray ja = env->NewLongArray(len);
-#else
jlongArray ja = (*env)->NewLongArray(env, len);
-#endif
for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)
buf[i] = (jlong)SvNV(*esv);
-#ifdef WIN32
- env->SetLongArrayRegion(ja, 0, len, buf);
-#else
(*env)->SetLongArrayRegion(env, ja, 0, len, buf);
-#endif
free((void*)buf);
jv[ix++].l = (jobject)ja;
}
@@ -376,16 +287,8 @@ makeargs(char *sig, SV** svp, int items)
else if (SvPOK(sv)) {
jsize len = sv_len(sv) / sizeof(jlong);
-#ifdef WIN32
- jlongArray ja = env->NewLongArray(len);
-#else
jlongArray ja = (*env)->NewLongArray(env, len);
-#endif
-#ifdef WIN32
- env->SetLongArrayRegion(ja, 0, len, (jlong*)SvPV(sv,n_a));
-#else
(*env)->SetLongArrayRegion(env, ja, 0, len, (jlong*)SvPV(sv,n_a));
-#endif
jv[ix++].l = (jobject)ja;
}
else
@@ -402,18 +305,10 @@ makeargs(char *sig, SV** svp, int items)
int i;
SV** esv;
-#ifdef WIN32
- jfloatArray ja = env->NewFloatArray(len);
-#else
jfloatArray ja = (*env)->NewFloatArray(env, len);
-#endif
for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)
buf[i] = (jfloat)SvNV(*esv);
-#ifdef WIN32
- env->SetFloatArrayRegion(ja, 0, len, buf);
-#else
(*env)->SetFloatArrayRegion(env, ja, 0, len, buf);
-#endif
free((void*)buf);
jv[ix++].l = (jobject)ja;
}
@@ -423,16 +318,8 @@ makeargs(char *sig, SV** svp, int items)
else if (SvPOK(sv)) {
jsize len = sv_len(sv) / sizeof(jfloat);
-#ifdef WIN32
- jfloatArray ja = env->NewFloatArray(len);
-#else
jfloatArray ja = (*env)->NewFloatArray(env, len);
-#endif
-#ifdef WIN32
- env->SetFloatArrayRegion(ja, 0, len, (jfloat*)SvPV(sv,n_a));
-#else
(*env)->SetFloatArrayRegion(env, ja, 0, len, (jfloat*)SvPV(sv,n_a));
-#endif
jv[ix++].l = (jobject)ja;
}
else
@@ -449,18 +336,10 @@ makeargs(char *sig, SV** svp, int items)
int i;
SV** esv;
-#ifdef WIN32
- jdoubleArray ja = env->NewDoubleArray(len);
-#else
jdoubleArray ja = (*env)->NewDoubleArray(env, len);
-#endif
for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)
buf[i] = (jdouble)SvNV(*esv);
-#ifdef WIN32
- env->SetDoubleArrayRegion(ja, 0, len, buf);
-#else
(*env)->SetDoubleArrayRegion(env, ja, 0, len, buf);
-#endif
free((void*)buf);
jv[ix++].l = (jobject)ja;
}
@@ -470,16 +349,8 @@ makeargs(char *sig, SV** svp, int items)
else if (SvPOK(sv)) {
jsize len = sv_len(sv) / sizeof(jdouble);
-#ifdef WIN32
- jdoubleArray ja = env->NewDoubleArray(len);
-#else
jdoubleArray ja = (*env)->NewDoubleArray(env, len);
-#endif
-#ifdef WIN32
- env->SetDoubleArrayRegion(ja, 0, len, (jdouble*)SvPV(sv,n_a));
-#else
(*env)->SetDoubleArrayRegion(env, ja, 0, len, (jdouble*)SvPV(sv,n_a));
-#endif
jv[ix++].l = (jobject)ja;
}
else
@@ -501,27 +372,11 @@ makeargs(char *sig, SV** svp, int items)
jobjectArray ja;
if (!jcl)
-#ifdef WIN32
- jcl = env->FindClass("java/lang/String");
-#else
jcl = (*env)->FindClass(env, "java/lang/String");
-#endif
-#ifdef WIN32
- ja = env->NewObjectArray(len, jcl, 0);
-#else
ja = (*env)->NewObjectArray(env, len, jcl, 0);
-#endif
for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++) {
-#ifdef WIN32
- jobject str = (jobject)env->NewStringUTF(SvPV(*esv,n_a));
-#else
jobject str = (jobject)(*env)->NewStringUTF(env, SvPV(*esv,n_a));
-#endif
-#ifdef WIN32
- env->SetObjectArrayElement(ja, i, str);
-#else
(*env)->SetObjectArrayElement(env, ja, i, str);
-#endif
}
jv[ix++].l = (jobject)ja;
}
@@ -546,35 +401,15 @@ makeargs(char *sig, SV** svp, int items)
jobjectArray ja;
if (!jcl)
-#ifdef WIN32
- jcl = env->FindClass("java/lang/Object");
-#else
jcl = (*env)->FindClass(env, "java/lang/Object");
-#endif
-#ifdef WIN32
- ja = env->NewObjectArray(len, jcl, 0);
-#else
ja = (*env)->NewObjectArray(env, len, jcl, 0);
-#endif
for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++) {
if (SvROK(*esv) && (rv = SvRV(*esv)) && SvOBJECT(rv)) {
-#ifdef WIN32
- env->SetObjectArrayElement(ja, i, (jobject)(void*)SvIV(rv));
-#else
(*env)->SetObjectArrayElement(env, ja, i, (jobject)(void*)SvIV(rv));
-#endif
}
else {
-#ifdef WIN32
- jobject str = (jobject)env->NewStringUTF(SvPV(*esv,n_a));
-#else
jobject str = (jobject)(*env)->NewStringUTF(env, SvPV(*esv,n_a));
-#endif
-#ifdef WIN32
- env->SetObjectArrayElement(ja, i, str);
-#else
(*env)->SetObjectArrayElement(env, ja, i, str);
-#endif
}
}
jv[ix++].l = (jobject)ja;
@@ -590,11 +425,7 @@ makeargs(char *sig, SV** svp, int items)
case 'L':
if (!SvROK(sv) || strnEQ(s, "java/lang/String;", 17)) {
s += 17;
-#ifdef WIN32
- jv[ix++].l = (jobject)env->NewStringUTF((char*) SvPV(sv,n_a));
-#else
jv[ix++].l = (jobject)(*env)->NewStringUTF(env, (char*) SvPV(sv,n_a));
-#endif
break;
}
while (*s != ';') s++;
@@ -760,11 +591,7 @@ GetVersion()
JNIEnv * env = FETCHENV;
CODE:
{
-#ifdef WIN32
- RETVAL = env->GetVersion();
-#else
RETVAL = (*env)->GetVersion(env);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -781,18 +608,10 @@ DefineClass(name, loader, buf)
CODE:
{
#ifdef KAFFE
-#ifdef WIN32
- RETVAL = env->DefineClass( loader, buf, (jsize)buf_len_);
-#else
RETVAL = (*env)->DefineClass(env, loader, buf, (jsize)buf_len_);
-#endif
-#else
-#ifdef WIN32
- RETVAL = env->DefineClass( name, loader, buf, (jsize)buf_len_);
#else
RETVAL = (*env)->DefineClass(env, name, loader, buf, (jsize)buf_len_);
#endif
-#endif
RESTOREENV;
}
OUTPUT:
@@ -804,11 +623,7 @@ FindClass(name)
const char * name
CODE:
{
-#ifdef WIN32
- RETVAL = env->FindClass( name);
-#else
RETVAL = (*env)->FindClass(env, name);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -820,11 +635,7 @@ GetSuperclass(sub)
jclass sub
CODE:
{
-#ifdef WIN32
- RETVAL = env->GetSuperclass( sub);
-#else
RETVAL = (*env)->GetSuperclass(env, sub);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -837,11 +648,7 @@ IsAssignableFrom(sub, sup)
jclass sup
CODE:
{
-#ifdef WIN32
- RETVAL = env->IsAssignableFrom( sub, sup);
-#else
RETVAL = (*env)->IsAssignableFrom(env, sub, sup);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -853,11 +660,7 @@ Throw(obj)
jthrowable obj
CODE:
{
-#ifdef WIN32
- RETVAL = env->Throw( obj);
-#else
RETVAL = (*env)->Throw(env, obj);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -870,11 +673,7 @@ ThrowNew(clazz, msg)
const char * msg
CODE:
{
-#ifdef WIN32
- RETVAL = env->ThrowNew( clazz, msg);
-#else
RETVAL = (*env)->ThrowNew(env, clazz, msg);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -885,11 +684,7 @@ ExceptionOccurred()
JNIEnv * env = FETCHENV;
CODE:
{
-#ifdef WIN32
- RETVAL = env->ExceptionOccurred();
-#else
RETVAL = (*env)->ExceptionOccurred(env);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -900,11 +695,7 @@ ExceptionDescribe()
JNIEnv * env = FETCHENV;
CODE:
{
-#ifdef WIN32
- env->ExceptionDescribe();
-#else
(*env)->ExceptionDescribe(env);
-#endif
RESTOREENV;
}
@@ -913,11 +704,7 @@ ExceptionClear()
JNIEnv * env = FETCHENV;
CODE:
{
-#ifdef WIN32
- env->ExceptionClear();
-#else
(*env)->ExceptionClear(env);
-#endif
RESTOREENV;
}
@@ -927,11 +714,7 @@ FatalError(msg)
const char * msg
CODE:
{
-#ifdef WIN32
- env->FatalError( msg);
-#else
(*env)->FatalError(env, msg);
-#endif
RESTOREENV;
}
@@ -941,11 +724,7 @@ NewGlobalRef(lobj)
jobject lobj
CODE:
{
-#ifdef WIN32
- RETVAL = env->NewGlobalRef(lobj);
-#else
RETVAL = (*env)->NewGlobalRef(env, lobj);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -957,11 +736,7 @@ DeleteGlobalRef(gref)
jobject gref
CODE:
{
-#ifdef WIN32
- env->DeleteGlobalRef(gref);
-#else
(*env)->DeleteGlobalRef(env, gref);
-#endif
RESTOREENV;
}
@@ -971,11 +746,7 @@ DeleteLocalRef(obj)
jobject obj
CODE:
{
-#ifdef WIN32
- env->DeleteLocalRef( obj);
-#else
(*env)->DeleteLocalRef(env, obj);
-#endif
RESTOREENV;
}
@@ -986,11 +757,7 @@ IsSameObject(obj1,obj2)
jobject obj2
CODE:
{
-#ifdef WIN32
- RETVAL = env->IsSameObject(obj1,obj2);
-#else
RETVAL = (*env)->IsSameObject(env, obj1,obj2);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1002,11 +769,7 @@ AllocObject(clazz)
jclass clazz
CODE:
{
-#ifdef WIN32
- RETVAL = env->AllocObject(clazz);
-#else
RETVAL = (*env)->AllocObject(env, clazz);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1022,11 +785,7 @@ NewObject(clazz,methodID,...)
CODE:
{
jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-#ifdef WIN32
- RETVAL = env->NewObjectA(clazz,methodID,args);
-#else
RETVAL = (*env)->NewObjectA(env, clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1041,11 +800,7 @@ NewObjectA(clazz,methodID,args)
jvalue * args
CODE:
{
-#ifdef WIN32
- RETVAL = env->NewObjectA(clazz,methodID,args);
-#else
RETVAL = (*env)->NewObjectA(env, clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1057,11 +812,7 @@ GetObjectClass(obj)
jobject obj
CODE:
{
-#ifdef WIN32
- RETVAL = env->GetObjectClass(obj);
-#else
RETVAL = (*env)->GetObjectClass(env, obj);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1074,11 +825,7 @@ IsInstanceOf(obj,clazz)
jclass clazz
CODE:
{
-#ifdef WIN32
- RETVAL = env->IsInstanceOf(obj,clazz);
-#else
RETVAL = (*env)->IsInstanceOf(env, obj,clazz);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1092,11 +839,7 @@ GetMethodID(clazz,name,sig)
const char * sig
CODE:
{
-#ifdef WIN32
- RETVAL = env->GetMethodID(clazz,name,sig);
-#else
RETVAL = (*env)->GetMethodID(env, clazz,name,sig);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1112,11 +855,7 @@ CallObjectMethod(obj,methodID,...)
CODE:
{
jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-#ifdef WIN32
- RETVAL = env->CallObjectMethodA(obj,methodID,args);
-#else
RETVAL = (*env)->CallObjectMethodA(env, obj,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1131,11 +870,7 @@ CallObjectMethodA(obj,methodID,args)
jvalue * args
CODE:
{
-#ifdef WIN32
- RETVAL = env->CallObjectMethodA(obj,methodID,args);
-#else
RETVAL = (*env)->CallObjectMethodA(env, obj,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1151,11 +886,7 @@ CallBooleanMethod(obj,methodID,...)
CODE:
{
jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-#ifdef WIN32
- RETVAL = env->CallBooleanMethodA(obj,methodID,args);
-#else
RETVAL = (*env)->CallBooleanMethodA(env, obj,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1170,11 +901,7 @@ CallBooleanMethodA(obj,methodID, args)
jvalue * args
CODE:
{
-#ifdef WIN32
- RETVAL = env->CallBooleanMethodA(obj,methodID, args);
-#else
RETVAL = (*env)->CallBooleanMethodA(env, obj,methodID, args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1190,11 +917,7 @@ CallByteMethod(obj,methodID,...)
CODE:
{
jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-#ifdef WIN32
- RETVAL = env->CallByteMethodA(obj,methodID,args);
-#else
RETVAL = (*env)->CallByteMethodA(env, obj,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1209,11 +932,7 @@ CallByteMethodA(obj,methodID,args)
jvalue * args
CODE:
{
-#ifdef WIN32
- RETVAL = env->CallByteMethodA(obj,methodID,args);
-#else
RETVAL = (*env)->CallByteMethodA(env, obj,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1229,11 +948,7 @@ CallCharMethod(obj,methodID,...)
CODE:
{
jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-#ifdef WIN32
- RETVAL = env->CallCharMethodA(obj,methodID,args);
-#else
RETVAL = (*env)->CallCharMethodA(env, obj,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1248,11 +963,7 @@ CallCharMethodA(obj,methodID,args)
jvalue * args
CODE:
{
-#ifdef WIN32
- RETVAL = env->CallCharMethodA(obj,methodID,args);
-#else
RETVAL = (*env)->CallCharMethodA(env, obj,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1268,11 +979,7 @@ CallShortMethod(obj,methodID,...)
CODE:
{
jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-#ifdef WIN32
- RETVAL = env->CallShortMethodA(obj,methodID,args);
-#else
RETVAL = (*env)->CallShortMethodA(env, obj,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1287,11 +994,7 @@ CallShortMethodA(obj,methodID,args)
jvalue * args
CODE:
{
-#ifdef WIN32
- RETVAL = env->CallShortMethodA(obj,methodID,args);
-#else
RETVAL = (*env)->CallShortMethodA(env, obj,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1307,11 +1010,7 @@ CallIntMethod(obj,methodID,...)
CODE:
{
jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-#ifdef WIN32
- RETVAL = env->CallIntMethodA(obj,methodID,args);
-#else
RETVAL = (*env)->CallIntMethodA(env, obj,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1326,11 +1025,7 @@ CallIntMethodA(obj,methodID,args)
jvalue * args
CODE:
{
-#ifdef WIN32
- RETVAL = env->CallIntMethodA(obj,methodID,args);
-#else
RETVAL = (*env)->CallIntMethodA(env, obj,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1346,11 +1041,7 @@ CallLongMethod(obj,methodID,...)
CODE:
{
jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-#ifdef WIN32
- RETVAL = env->CallLongMethodA(obj,methodID,args);
-#else
RETVAL = (*env)->CallLongMethodA(env, obj,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1365,11 +1056,7 @@ CallLongMethodA(obj,methodID,args)
jvalue * args
CODE:
{
-#ifdef WIN32
- RETVAL = env->CallLongMethodA(obj,methodID,args);
-#else
RETVAL = (*env)->CallLongMethodA(env, obj,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1385,11 +1072,7 @@ CallFloatMethod(obj,methodID,...)
CODE:
{
jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-#ifdef WIN32
- RETVAL = env->CallFloatMethodA(obj,methodID,args);
-#else
RETVAL = (*env)->CallFloatMethodA(env, obj,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1404,11 +1087,7 @@ CallFloatMethodA(obj,methodID,args)
jvalue * args
CODE:
{
-#ifdef WIN32
- RETVAL = env->CallFloatMethodA(obj,methodID,args);
-#else
RETVAL = (*env)->CallFloatMethodA(env, obj,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1424,11 +1103,7 @@ CallDoubleMethod(obj,methodID,...)
CODE:
{
jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-#ifdef WIN32
- RETVAL = env->CallDoubleMethodA(obj,methodID,args);
-#else
RETVAL = (*env)->CallDoubleMethodA(env, obj,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1443,11 +1118,7 @@ CallDoubleMethodA(obj,methodID,args)
jvalue * args
CODE:
{
-#ifdef WIN32
- RETVAL = env->CallDoubleMethodA(obj,methodID,args);
-#else
RETVAL = (*env)->CallDoubleMethodA(env, obj,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1463,11 +1134,7 @@ CallVoidMethod(obj,methodID,...)
CODE:
{
jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-#ifdef WIN32
- env->CallVoidMethodA(obj,methodID,args);
-#else
(*env)->CallVoidMethodA(env, obj,methodID,args);
-#endif
RESTOREENV;
}
@@ -1480,11 +1147,7 @@ CallVoidMethodA(obj,methodID,args)
jvalue * args
CODE:
{
-#ifdef WIN32
- env->CallVoidMethodA(obj,methodID,args);
-#else
(*env)->CallVoidMethodA(env, obj,methodID,args);
-#endif
RESTOREENV;
}
@@ -1499,11 +1162,7 @@ CallNonvirtualObjectMethod(obj,clazz,methodID,...)
CODE:
{
jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-#ifdef WIN32
- RETVAL = env->CallNonvirtualObjectMethodA(obj,clazz,methodID,args);
-#else
RETVAL = (*env)->CallNonvirtualObjectMethodA(env, obj,clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1519,11 +1178,7 @@ CallNonvirtualObjectMethodA(obj,clazz,methodID,args)
jvalue * args
CODE:
{
-#ifdef WIN32
- RETVAL = env->CallNonvirtualObjectMethodA(obj,clazz,methodID,args);
-#else
RETVAL = (*env)->CallNonvirtualObjectMethodA(env, obj,clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1540,11 +1195,7 @@ CallNonvirtualBooleanMethod(obj,clazz,methodID,...)
CODE:
{
jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-#ifdef WIN32
- RETVAL = env->CallNonvirtualBooleanMethodA(obj,clazz,methodID,args);
-#else
RETVAL = (*env)->CallNonvirtualBooleanMethodA(env, obj,clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1560,11 +1211,7 @@ CallNonvirtualBooleanMethodA(obj,clazz,methodID, args)
jvalue * args
CODE:
{
-#ifdef WIN32
- RETVAL = env->CallNonvirtualBooleanMethodA(obj,clazz,methodID, args);
-#else
RETVAL = (*env)->CallNonvirtualBooleanMethodA(env, obj,clazz,methodID, args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1581,11 +1228,7 @@ CallNonvirtualByteMethod(obj,clazz,methodID,...)
CODE:
{
jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-#ifdef WIN32
- RETVAL = env->CallNonvirtualByteMethodA(obj,clazz,methodID,args);
-#else
RETVAL = (*env)->CallNonvirtualByteMethodA(env, obj,clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1601,11 +1244,7 @@ CallNonvirtualByteMethodA(obj,clazz,methodID,args)
jvalue * args
CODE:
{
-#ifdef WIN32
- RETVAL = env->CallNonvirtualByteMethodA(obj,clazz,methodID,args);
-#else
RETVAL = (*env)->CallNonvirtualByteMethodA(env, obj,clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1622,11 +1261,7 @@ CallNonvirtualCharMethod(obj,clazz,methodID,...)
CODE:
{
jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-#ifdef WIN32
- RETVAL = env->CallNonvirtualCharMethodA(obj,clazz,methodID,args);
-#else
RETVAL = (*env)->CallNonvirtualCharMethodA(env, obj,clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1642,11 +1277,7 @@ CallNonvirtualCharMethodA(obj,clazz,methodID,args)
jvalue * args
CODE:
{
-#ifdef WIN32
- RETVAL = env->CallNonvirtualCharMethodA(obj,clazz,methodID,args);
-#else
RETVAL = (*env)->CallNonvirtualCharMethodA(env, obj,clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1663,11 +1294,7 @@ CallNonvirtualShortMethod(obj,clazz,methodID,...)
CODE:
{
jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-#ifdef WIN32
- RETVAL = env->CallNonvirtualShortMethodA(obj,clazz,methodID,args);
-#else
RETVAL = (*env)->CallNonvirtualShortMethodA(env, obj,clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1683,11 +1310,7 @@ CallNonvirtualShortMethodA(obj,clazz,methodID,args)
jvalue * args
CODE:
{
-#ifdef WIN32
- RETVAL = env->CallNonvirtualShortMethodA(obj,clazz,methodID,args);
-#else
RETVAL = (*env)->CallNonvirtualShortMethodA(env, obj,clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1704,11 +1327,7 @@ CallNonvirtualIntMethod(obj,clazz,methodID,...)
CODE:
{
jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-#ifdef WIN32
- RETVAL = env->CallNonvirtualIntMethodA(obj,clazz,methodID,args);
-#else
RETVAL = (*env)->CallNonvirtualIntMethodA(env, obj,clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1724,11 +1343,7 @@ CallNonvirtualIntMethodA(obj,clazz,methodID,args)
jvalue * args
CODE:
{
-#ifdef WIN32
- RETVAL = env->CallNonvirtualIntMethodA(obj,clazz,methodID,args);
-#else
RETVAL = (*env)->CallNonvirtualIntMethodA(env, obj,clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1745,11 +1360,7 @@ CallNonvirtualLongMethod(obj,clazz,methodID,...)
CODE:
{
jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-#ifdef WIN32
- RETVAL = env->CallNonvirtualLongMethodA(obj,clazz,methodID,args);
-#else
RETVAL = (*env)->CallNonvirtualLongMethodA(env, obj,clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1765,11 +1376,7 @@ CallNonvirtualLongMethodA(obj,clazz,methodID,args)
jvalue * args
CODE:
{
-#ifdef WIN32
- RETVAL = env->CallNonvirtualLongMethodA(obj,clazz,methodID,args);
-#else
RETVAL = (*env)->CallNonvirtualLongMethodA(env, obj,clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1786,11 +1393,7 @@ CallNonvirtualFloatMethod(obj,clazz,methodID,...)
CODE:
{
jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-#ifdef WIN32
- RETVAL = env->CallNonvirtualFloatMethodA(obj,clazz,methodID,args);
-#else
RETVAL = (*env)->CallNonvirtualFloatMethodA(env, obj,clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1806,11 +1409,7 @@ CallNonvirtualFloatMethodA(obj,clazz,methodID,args)
jvalue * args
CODE:
{
-#ifdef WIN32
- RETVAL = env->CallNonvirtualFloatMethodA(obj,clazz,methodID,args);
-#else
RETVAL = (*env)->CallNonvirtualFloatMethodA(env, obj,clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1827,11 +1426,7 @@ CallNonvirtualDoubleMethod(obj,clazz,methodID,...)
CODE:
{
jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-#ifdef WIN32
- RETVAL = env->CallNonvirtualDoubleMethodA(obj,clazz,methodID,args);
-#else
RETVAL = (*env)->CallNonvirtualDoubleMethodA(env, obj,clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1847,11 +1442,7 @@ CallNonvirtualDoubleMethodA(obj,clazz,methodID,args)
jvalue * args
CODE:
{
-#ifdef WIN32
- RETVAL = env->CallNonvirtualDoubleMethodA(obj,clazz,methodID,args);
-#else
RETVAL = (*env)->CallNonvirtualDoubleMethodA(env, obj,clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1868,11 +1459,7 @@ CallNonvirtualVoidMethod(obj,clazz,methodID,...)
CODE:
{
jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-#ifdef WIN32
- env->CallNonvirtualVoidMethodA(obj,clazz,methodID,args);
-#else
(*env)->CallNonvirtualVoidMethodA(env, obj,clazz,methodID,args);
-#endif
RESTOREENV;
}
@@ -1886,11 +1473,7 @@ CallNonvirtualVoidMethodA(obj,clazz,methodID,args)
jvalue * args
CODE:
{
-#ifdef WIN32
- env->CallNonvirtualVoidMethodA(obj,clazz,methodID,args);
-#else
(*env)->CallNonvirtualVoidMethodA(env, obj,clazz,methodID,args);
-#endif
RESTOREENV;
}
@@ -1902,11 +1485,7 @@ GetFieldID(clazz,name,sig)
const char * sig
CODE:
{
-#ifdef WIN32
- RETVAL = env->GetFieldID(clazz,name,sig);
-#else
RETVAL = (*env)->GetFieldID(env, clazz,name,sig);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1920,11 +1499,7 @@ GetObjectField(obj,fieldID)
char * sig = 0;
CODE:
{
-#ifdef WIN32
- RETVAL = env->GetObjectField(obj,fieldID);
-#else
RETVAL = (*env)->GetObjectField(env, obj,fieldID);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1938,11 +1513,7 @@ GetBooleanField(obj,fieldID)
char * sig = 0;
CODE:
{
-#ifdef WIN32
- RETVAL = env->GetBooleanField(obj,fieldID);
-#else
RETVAL = (*env)->GetBooleanField(env, obj,fieldID);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1956,11 +1527,7 @@ GetByteField(obj,fieldID)
char * sig = 0;
CODE:
{
-#ifdef WIN32
- RETVAL = env->GetByteField(obj,fieldID);
-#else
RETVAL = (*env)->GetByteField(env, obj,fieldID);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1974,11 +1541,7 @@ GetCharField(obj,fieldID)
char * sig = 0;
CODE:
{
-#ifdef WIN32
- RETVAL = env->GetCharField(obj,fieldID);
-#else
RETVAL = (*env)->GetCharField(env, obj,fieldID);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -1992,11 +1555,7 @@ GetShortField(obj,fieldID)
char * sig = 0;
CODE:
{
-#ifdef WIN32
- RETVAL = env->GetShortField(obj,fieldID);
-#else
RETVAL = (*env)->GetShortField(env, obj,fieldID);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2010,11 +1569,7 @@ GetIntField(obj,fieldID)
char * sig = 0;
CODE:
{
-#ifdef WIN32
- RETVAL = env->GetIntField(obj,fieldID);
-#else
RETVAL = (*env)->GetIntField(env, obj,fieldID);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2028,11 +1583,7 @@ GetLongField(obj,fieldID)
char * sig = 0;
CODE:
{
-#ifdef WIN32
- RETVAL = env->GetLongField(obj,fieldID);
-#else
RETVAL = (*env)->GetLongField(env, obj,fieldID);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2046,11 +1597,7 @@ GetFloatField(obj,fieldID)
char * sig = 0;
CODE:
{
-#ifdef WIN32
- RETVAL = env->GetFloatField(obj,fieldID);
-#else
RETVAL = (*env)->GetFloatField(env, obj,fieldID);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2064,11 +1611,7 @@ GetDoubleField(obj,fieldID)
char * sig = 0;
CODE:
{
-#ifdef WIN32
- RETVAL = env->GetDoubleField(obj,fieldID);
-#else
RETVAL = (*env)->GetDoubleField(env, obj,fieldID);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2083,11 +1626,7 @@ SetObjectField(obj,fieldID,val)
jobject val
CODE:
{
-#ifdef WIN32
- env->SetObjectField(obj,fieldID,val);
-#else
(*env)->SetObjectField(env, obj,fieldID,val);
-#endif
RESTOREENV;
}
@@ -2100,11 +1639,7 @@ SetBooleanField(obj,fieldID,val)
jboolean val
CODE:
{
-#ifdef WIN32
- env->SetBooleanField(obj,fieldID,val);
-#else
(*env)->SetBooleanField(env, obj,fieldID,val);
-#endif
RESTOREENV;
}
@@ -2117,11 +1652,7 @@ SetByteField(obj,fieldID,val)
jbyte val
CODE:
{
-#ifdef WIN32
- env->SetByteField(obj,fieldID,val);
-#else
(*env)->SetByteField(env, obj,fieldID,val);
-#endif
RESTOREENV;
}
@@ -2134,11 +1665,7 @@ SetCharField(obj,fieldID,val)
jchar val
CODE:
{
-#ifdef WIN32
- env->SetCharField(obj,fieldID,val);
-#else
(*env)->SetCharField(env, obj,fieldID,val);
-#endif
RESTOREENV;
}
@@ -2151,11 +1678,7 @@ SetShortField(obj,fieldID,val)
jshort val
CODE:
{
-#ifdef WIN32
- env->SetShortField(obj,fieldID,val);
-#else
(*env)->SetShortField(env, obj,fieldID,val);
-#endif
RESTOREENV;
}
@@ -2168,11 +1691,7 @@ SetIntField(obj,fieldID,val)
jint val
CODE:
{
-#ifdef WIN32
- env->SetIntField(obj,fieldID,val);
-#else
(*env)->SetIntField(env, obj,fieldID,val);
-#endif
RESTOREENV;
}
@@ -2185,11 +1704,7 @@ SetLongField(obj,fieldID,val)
jlong val
CODE:
{
-#ifdef WIN32
- env->SetLongField(obj,fieldID,val);
-#else
(*env)->SetLongField(env, obj,fieldID,val);
-#endif
RESTOREENV;
}
@@ -2202,11 +1717,7 @@ SetFloatField(obj,fieldID,val)
jfloat val
CODE:
{
-#ifdef WIN32
- env->SetFloatField(obj,fieldID,val);
-#else
(*env)->SetFloatField(env, obj,fieldID,val);
-#endif
RESTOREENV;
}
@@ -2219,11 +1730,7 @@ SetDoubleField(obj,fieldID,val)
jdouble val
CODE:
{
-#ifdef WIN32
- env->SetDoubleField(obj,fieldID,val);
-#else
(*env)->SetDoubleField(env, obj,fieldID,val);
-#endif
RESTOREENV;
}
@@ -2235,11 +1742,7 @@ GetStaticMethodID(clazz,name,sig)
const char * sig
CODE:
{
-#ifdef WIN32
- RETVAL = env->GetStaticMethodID(clazz,name,sig);
-#else
RETVAL = (*env)->GetStaticMethodID(env, clazz,name,sig);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2255,11 +1758,7 @@ CallStaticObjectMethod(clazz,methodID,...)
CODE:
{
jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-#ifdef WIN32
- RETVAL = env->CallStaticObjectMethodA(clazz,methodID,args);
-#else
RETVAL = (*env)->CallStaticObjectMethodA(env, clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2274,11 +1773,7 @@ CallStaticObjectMethodA(clazz,methodID,args)
jvalue * args
CODE:
{
-#ifdef WIN32
- RETVAL = env->CallStaticObjectMethodA(clazz,methodID,args);
-#else
RETVAL = (*env)->CallStaticObjectMethodA(env, clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2294,11 +1789,7 @@ CallStaticBooleanMethod(clazz,methodID,...)
CODE:
{
jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-#ifdef WIN32
- RETVAL = env->CallStaticBooleanMethodA(clazz,methodID,args);
-#else
RETVAL = (*env)->CallStaticBooleanMethodA(env, clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2313,11 +1804,7 @@ CallStaticBooleanMethodA(clazz,methodID,args)
jvalue * args
CODE:
{
-#ifdef WIN32
- RETVAL = env->CallStaticBooleanMethodA(clazz,methodID,args);
-#else
RETVAL = (*env)->CallStaticBooleanMethodA(env, clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2333,11 +1820,7 @@ CallStaticByteMethod(clazz,methodID,...)
CODE:
{
jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-#ifdef WIN32
- RETVAL = env->CallStaticByteMethodA(clazz,methodID,args);
-#else
RETVAL = (*env)->CallStaticByteMethodA(env, clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2352,11 +1835,7 @@ CallStaticByteMethodA(clazz,methodID,args)
jvalue * args
CODE:
{
-#ifdef WIN32
- RETVAL = env->CallStaticByteMethodA(clazz,methodID,args);
-#else
RETVAL = (*env)->CallStaticByteMethodA(env, clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2372,11 +1851,7 @@ CallStaticCharMethod(clazz,methodID,...)
CODE:
{
jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-#ifdef WIN32
- RETVAL = env->CallStaticCharMethodA(clazz,methodID,args);
-#else
RETVAL = (*env)->CallStaticCharMethodA(env, clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2391,11 +1866,7 @@ CallStaticCharMethodA(clazz,methodID,args)
jvalue * args
CODE:
{
-#ifdef WIN32
- RETVAL = env->CallStaticCharMethodA(clazz,methodID,args);
-#else
RETVAL = (*env)->CallStaticCharMethodA(env, clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2411,11 +1882,7 @@ CallStaticShortMethod(clazz,methodID,...)
CODE:
{
jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-#ifdef WIN32
- RETVAL = env->CallStaticShortMethodA(clazz,methodID,args);
-#else
RETVAL = (*env)->CallStaticShortMethodA(env, clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2430,11 +1897,7 @@ CallStaticShortMethodA(clazz,methodID,args)
jvalue * args
CODE:
{
-#ifdef WIN32
- RETVAL = env->CallStaticShortMethodA(clazz,methodID,args);
-#else
RETVAL = (*env)->CallStaticShortMethodA(env, clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2450,11 +1913,7 @@ CallStaticIntMethod(clazz,methodID,...)
CODE:
{
jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-#ifdef WIN32
- RETVAL = env->CallStaticIntMethodA(clazz,methodID,args);
-#else
RETVAL = (*env)->CallStaticIntMethodA(env, clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2469,11 +1928,7 @@ CallStaticIntMethodA(clazz,methodID,args)
jvalue * args
CODE:
{
-#ifdef WIN32
- RETVAL = env->CallStaticIntMethodA(clazz,methodID,args);
-#else
RETVAL = (*env)->CallStaticIntMethodA(env, clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2489,11 +1944,7 @@ CallStaticLongMethod(clazz,methodID,...)
CODE:
{
jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-#ifdef WIN32
- RETVAL = env->CallStaticLongMethodA(clazz,methodID,args);
-#else
RETVAL = (*env)->CallStaticLongMethodA(env, clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2508,11 +1959,7 @@ CallStaticLongMethodA(clazz,methodID,args)
jvalue * args
CODE:
{
-#ifdef WIN32
- RETVAL = env->CallStaticLongMethodA(clazz,methodID,args);
-#else
RETVAL = (*env)->CallStaticLongMethodA(env, clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2528,11 +1975,7 @@ CallStaticFloatMethod(clazz,methodID,...)
CODE:
{
jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-#ifdef WIN32
- RETVAL = env->CallStaticFloatMethodA(clazz,methodID,args);
-#else
RETVAL = (*env)->CallStaticFloatMethodA(env, clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2547,11 +1990,7 @@ CallStaticFloatMethodA(clazz,methodID,args)
jvalue * args
CODE:
{
-#ifdef WIN32
- RETVAL = env->CallStaticFloatMethodA(clazz,methodID,args);
-#else
RETVAL = (*env)->CallStaticFloatMethodA(env, clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2567,11 +2006,7 @@ CallStaticDoubleMethod(clazz,methodID,...)
CODE:
{
jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-#ifdef WIN32
- RETVAL = env->CallStaticDoubleMethodA(clazz,methodID,args);
-#else
RETVAL = (*env)->CallStaticDoubleMethodA(env, clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2586,11 +2021,7 @@ CallStaticDoubleMethodA(clazz,methodID,args)
jvalue * args
CODE:
{
-#ifdef WIN32
- RETVAL = env->CallStaticDoubleMethodA(clazz,methodID,args);
-#else
RETVAL = (*env)->CallStaticDoubleMethodA(env, clazz,methodID,args);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2606,11 +2037,7 @@ CallStaticVoidMethod(cls,methodID,...)
CODE:
{
jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-#ifdef WIN32
- env->CallStaticVoidMethodA(cls,methodID,args);
-#else
(*env)->CallStaticVoidMethodA(env, cls,methodID,args);
-#endif
RESTOREENV;
}
@@ -2623,11 +2050,7 @@ CallStaticVoidMethodA(cls,methodID,args)
jvalue * args
CODE:
{
-#ifdef WIN32
- env->CallStaticVoidMethodA(cls,methodID,args);
-#else
(*env)->CallStaticVoidMethodA(env, cls,methodID,args);
-#endif
RESTOREENV;
}
@@ -2639,11 +2062,7 @@ GetStaticFieldID(clazz,name,sig)
const char * sig
CODE:
{
-#ifdef WIN32
- RETVAL = env->GetStaticFieldID(clazz,name,sig);
-#else
RETVAL = (*env)->GetStaticFieldID(env, clazz,name,sig);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2657,11 +2076,7 @@ GetStaticObjectField(clazz,fieldID)
char * sig = 0;
CODE:
{
-#ifdef WIN32
- RETVAL = env->GetStaticObjectField(clazz,fieldID);
-#else
RETVAL = (*env)->GetStaticObjectField(env, clazz,fieldID);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2675,11 +2090,7 @@ GetStaticBooleanField(clazz,fieldID)
char * sig = 0;
CODE:
{
-#ifdef WIN32
- RETVAL = env->GetStaticBooleanField(clazz,fieldID);
-#else
RETVAL = (*env)->GetStaticBooleanField(env, clazz,fieldID);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2693,11 +2104,7 @@ GetStaticByteField(clazz,fieldID)
char * sig = 0;
CODE:
{
-#ifdef WIN32
- RETVAL = env->GetStaticByteField(clazz,fieldID);
-#else
RETVAL = (*env)->GetStaticByteField(env, clazz,fieldID);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2711,11 +2118,7 @@ GetStaticCharField(clazz,fieldID)
char * sig = 0;
CODE:
{
-#ifdef WIN32
- RETVAL = env->GetStaticCharField(clazz,fieldID);
-#else
RETVAL = (*env)->GetStaticCharField(env, clazz,fieldID);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2729,11 +2132,7 @@ GetStaticShortField(clazz,fieldID)
char * sig = 0;
CODE:
{
-#ifdef WIN32
- RETVAL = env->GetStaticShortField(clazz,fieldID);
-#else
RETVAL = (*env)->GetStaticShortField(env, clazz,fieldID);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2747,11 +2146,7 @@ GetStaticIntField(clazz,fieldID)
char * sig = 0;
CODE:
{
-#ifdef WIN32
- RETVAL = env->GetStaticIntField(clazz,fieldID);
-#else
RETVAL = (*env)->GetStaticIntField(env, clazz,fieldID);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2765,11 +2160,7 @@ GetStaticLongField(clazz,fieldID)
char * sig = 0;
CODE:
{
-#ifdef WIN32
- RETVAL = env->GetStaticLongField(clazz,fieldID);
-#else
RETVAL = (*env)->GetStaticLongField(env, clazz,fieldID);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2783,11 +2174,7 @@ GetStaticFloatField(clazz,fieldID)
char * sig = 0;
CODE:
{
-#ifdef WIN32
- RETVAL = env->GetStaticFloatField(clazz,fieldID);
-#else
RETVAL = (*env)->GetStaticFloatField(env, clazz,fieldID);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2801,11 +2188,7 @@ GetStaticDoubleField(clazz,fieldID)
char * sig = 0;
CODE:
{
-#ifdef WIN32
- RETVAL = env->GetStaticDoubleField(clazz,fieldID);
-#else
RETVAL = (*env)->GetStaticDoubleField(env, clazz,fieldID);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2820,11 +2203,7 @@ SetStaticObjectField(clazz,fieldID,value)
jobject value
CODE:
{
-#ifdef WIN32
- env->SetStaticObjectField(clazz,fieldID,value);
-#else
(*env)->SetStaticObjectField(env, clazz,fieldID,value);
-#endif
RESTOREENV;
}
@@ -2837,11 +2216,7 @@ SetStaticBooleanField(clazz,fieldID,value)
jboolean value
CODE:
{
-#ifdef WIN32
- env->SetStaticBooleanField(clazz,fieldID,value);
-#else
(*env)->SetStaticBooleanField(env, clazz,fieldID,value);
-#endif
RESTOREENV;
}
@@ -2854,11 +2229,7 @@ SetStaticByteField(clazz,fieldID,value)
jbyte value
CODE:
{
-#ifdef WIN32
- env->SetStaticByteField(clazz,fieldID,value);
-#else
(*env)->SetStaticByteField(env, clazz,fieldID,value);
-#endif
RESTOREENV;
}
@@ -2871,11 +2242,7 @@ SetStaticCharField(clazz,fieldID,value)
jchar value
CODE:
{
-#ifdef WIN32
- env->SetStaticCharField(clazz,fieldID,value);
-#else
(*env)->SetStaticCharField(env, clazz,fieldID,value);
-#endif
RESTOREENV;
}
@@ -2888,11 +2255,7 @@ SetStaticShortField(clazz,fieldID,value)
jshort value
CODE:
{
-#ifdef WIN32
- env->SetStaticShortField(clazz,fieldID,value);
-#else
(*env)->SetStaticShortField(env, clazz,fieldID,value);
-#endif
RESTOREENV;
}
@@ -2905,11 +2268,7 @@ SetStaticIntField(clazz,fieldID,value)
jint value
CODE:
{
-#ifdef WIN32
- env->SetStaticIntField(clazz,fieldID,value);
-#else
(*env)->SetStaticIntField(env, clazz,fieldID,value);
-#endif
RESTOREENV;
}
@@ -2922,11 +2281,7 @@ SetStaticLongField(clazz,fieldID,value)
jlong value
CODE:
{
-#ifdef WIN32
- env->SetStaticLongField(clazz,fieldID,value);
-#else
(*env)->SetStaticLongField(env, clazz,fieldID,value);
-#endif
RESTOREENV;
}
@@ -2939,11 +2294,7 @@ SetStaticFloatField(clazz,fieldID,value)
jfloat value
CODE:
{
-#ifdef WIN32
- env->SetStaticFloatField(clazz,fieldID,value);
-#else
(*env)->SetStaticFloatField(env, clazz,fieldID,value);
-#endif
RESTOREENV;
}
@@ -2956,11 +2307,7 @@ SetStaticDoubleField(clazz,fieldID,value)
jdouble value
CODE:
{
-#ifdef WIN32
- env->SetStaticDoubleField(clazz,fieldID,value);
-#else
(*env)->SetStaticDoubleField(env, clazz,fieldID,value);
-#endif
RESTOREENV;
}
@@ -2972,11 +2319,7 @@ NewString(unicode)
const jchar * unicode
CODE:
{
-#ifdef WIN32
- RETVAL = env->NewString(unicode, unicode_len_);
-#else
RETVAL = (*env)->NewString(env, unicode, unicode_len_);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -2988,11 +2331,7 @@ GetStringLength(str)
jstring str
CODE:
{
-#ifdef WIN32
- RETVAL = env->GetStringLength(str);
-#else
RETVAL = (*env)->GetStringLength(env, str);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -3006,26 +2345,14 @@ GetStringChars(str)
jsize RETVAL_len_ = NO_INIT;
CODE:
{
-#ifdef WIN32
- RETVAL = env->GetStringChars(str,&isCopy);
-#else
RETVAL = (*env)->GetStringChars(env, str,&isCopy);
-#endif
-#ifdef WIN32
- RETVAL_len_ = env->GetStringLength(str);
-#else
RETVAL_len_ = (*env)->GetStringLength(env, str);
-#endif
RESTOREENV;
}
OUTPUT:
RETVAL
CLEANUP:
-#ifdef WIN32
- env->ReleaseStringChars(str,RETVAL);
-#else
(*env)->ReleaseStringChars(env, str,RETVAL);
-#endif
jstring
NewStringUTF(utf)
@@ -3033,11 +2360,7 @@ NewStringUTF(utf)
const char * utf
CODE:
{
-#ifdef WIN32
- RETVAL = env->NewStringUTF(utf);
-#else
RETVAL = (*env)->NewStringUTF(env, utf);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -3049,11 +2372,7 @@ GetStringUTFLength(str)
jstring str
CODE:
{
-#ifdef WIN32
- RETVAL = env->GetStringUTFLength(str);
-#else
RETVAL = (*env)->GetStringUTFLength(env, str);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -3066,21 +2385,13 @@ GetStringUTFChars(str)
jboolean isCopy = NO_INIT;
CODE:
{
-#ifdef WIN32
- RETVAL = env->GetStringUTFChars(str,&isCopy);
-#else
RETVAL = (*env)->GetStringUTFChars(env, str,&isCopy);
-#endif
RESTOREENV;
}
OUTPUT:
RETVAL
CLEANUP:
-#ifdef WIN32
- env->ReleaseStringUTFChars(str, RETVAL);
-#else
(*env)->ReleaseStringUTFChars(env, str, RETVAL);
-#endif
jsize
@@ -3089,11 +2400,7 @@ GetArrayLength(array)
jarray array
CODE:
{
-#ifdef WIN32
- RETVAL = env->GetArrayLength(array);
-#else
RETVAL = (*env)->GetArrayLength(env, array);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -3107,11 +2414,7 @@ NewObjectArray(len,clazz,init)
jobject init
CODE:
{
-#ifdef WIN32
- RETVAL = env->NewObjectArray(len,clazz,init);
-#else
RETVAL = (*env)->NewObjectArray(env, len,clazz,init);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -3124,11 +2427,7 @@ GetObjectArrayElement(array,index)
jsize index
CODE:
{
-#ifdef WIN32
- RETVAL = env->GetObjectArrayElement(array,index);
-#else
RETVAL = (*env)->GetObjectArrayElement(env, array,index);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -3142,11 +2441,7 @@ SetObjectArrayElement(array,index,val)
jobject val
CODE:
{
-#ifdef WIN32
- env->SetObjectArrayElement(array,index,val);
-#else
(*env)->SetObjectArrayElement(env, array,index,val);
-#endif
RESTOREENV;
}
@@ -3156,11 +2451,7 @@ NewBooleanArray(len)
jsize len
CODE:
{
-#ifdef WIN32
- RETVAL = env->NewBooleanArray(len);
-#else
RETVAL = (*env)->NewBooleanArray(env, len);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -3172,11 +2463,7 @@ NewByteArray(len)
jsize len
CODE:
{
-#ifdef WIN32
- RETVAL = env->NewByteArray(len);
-#else
RETVAL = (*env)->NewByteArray(env, len);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -3188,11 +2475,7 @@ NewCharArray(len)
jsize len
CODE:
{
-#ifdef WIN32
- RETVAL = env->NewCharArray(len);
-#else
RETVAL = (*env)->NewCharArray(env, len);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -3204,11 +2487,7 @@ NewShortArray(len)
jsize len
CODE:
{
-#ifdef WIN32
- RETVAL = env->NewShortArray(len);
-#else
RETVAL = (*env)->NewShortArray(env, len);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -3220,11 +2499,7 @@ NewIntArray(len)
jsize len
CODE:
{
-#ifdef WIN32
- RETVAL = env->NewIntArray(len);
-#else
RETVAL = (*env)->NewIntArray(env, len);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -3236,11 +2511,7 @@ NewLongArray(len)
jsize len
CODE:
{
-#ifdef WIN32
- RETVAL = env->NewLongArray(len);
-#else
RETVAL = (*env)->NewLongArray(env, len);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -3252,11 +2523,7 @@ NewFloatArray(len)
jsize len
CODE:
{
-#ifdef WIN32
- RETVAL = env->NewFloatArray(len);
-#else
RETVAL = (*env)->NewFloatArray(env, len);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -3268,11 +2535,7 @@ NewDoubleArray(len)
jsize len
CODE:
{
-#ifdef WIN32
- RETVAL = env->NewDoubleArray(len);
-#else
RETVAL = (*env)->NewDoubleArray(env, len);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -3286,16 +2549,8 @@ GetBooleanArrayElements(array)
jboolean isCopy = NO_INIT;
PPCODE:
{
-#ifdef WIN32
- RETVAL = env->GetBooleanArrayElements(array,&isCopy);
-#else
RETVAL = (*env)->GetBooleanArrayElements(env, array,&isCopy);
-#endif
-#ifdef WIN32
- RETVAL_len_ = env->GetArrayLength(array);
-#else
RETVAL_len_ = (*env)->GetArrayLength(env, array);
-#endif
if (GIMME == G_ARRAY) {
int i;
jboolean* r = RETVAL;
@@ -3312,11 +2567,7 @@ GetBooleanArrayElements(array)
else
PUSHs(&PL_sv_no);
}
-#ifdef WIN32
- env->ReleaseBooleanArrayElements(array,RETVAL,JNI_ABORT);
-#else
(*env)->ReleaseBooleanArrayElements(env, array,RETVAL,JNI_ABORT);
-#endif
RESTOREENV;
}
@@ -3328,16 +2579,8 @@ GetByteArrayElements(array)
jboolean isCopy = NO_INIT;
PPCODE:
{
-#ifdef WIN32
- RETVAL = env->GetByteArrayElements(array,&isCopy);
-#else
RETVAL = (*env)->GetByteArrayElements(env, array,&isCopy);
-#endif
-#ifdef WIN32
- RETVAL_len_ = env->GetArrayLength(array);
-#else
RETVAL_len_ = (*env)->GetArrayLength(env, array);
-#endif
if (GIMME == G_ARRAY) {
int i;
jbyte* r = RETVAL;
@@ -3354,11 +2597,7 @@ GetByteArrayElements(array)
else
PUSHs(&PL_sv_no);
}
-#ifdef WIN32
- env->ReleaseByteArrayElements(array,RETVAL,JNI_ABORT);
-#else
(*env)->ReleaseByteArrayElements(env, array,RETVAL,JNI_ABORT);
-#endif
RESTOREENV;
}
@@ -3370,16 +2609,8 @@ GetCharArrayElements(array)
jboolean isCopy = NO_INIT;
PPCODE:
{
-#ifdef WIN32
- RETVAL = env->GetCharArrayElements(array,&isCopy);
-#else
RETVAL = (*env)->GetCharArrayElements(env, array,&isCopy);
-#endif
-#ifdef WIN32
- RETVAL_len_ = env->GetArrayLength(array);
-#else
RETVAL_len_ = (*env)->GetArrayLength(env, array);
-#endif
if (GIMME == G_ARRAY) {
int i;
jchar* r = RETVAL;
@@ -3396,11 +2627,7 @@ GetCharArrayElements(array)
else
PUSHs(&PL_sv_no);
}
-#ifdef WIN32
- env->ReleaseCharArrayElements(array,RETVAL,JNI_ABORT);
-#else
(*env)->ReleaseCharArrayElements(env, array,RETVAL,JNI_ABORT);
-#endif
RESTOREENV;
}
@@ -3412,16 +2639,8 @@ GetShortArrayElements(array)
jboolean isCopy = NO_INIT;
PPCODE:
{
-#ifdef WIN32
- RETVAL = env->GetShortArrayElements(array,&isCopy);
-#else
RETVAL = (*env)->GetShortArrayElements(env, array,&isCopy);
-#endif
-#ifdef WIN32
- RETVAL_len_ = env->GetArrayLength(array);
-#else
RETVAL_len_ = (*env)->GetArrayLength(env, array);
-#endif
if (GIMME == G_ARRAY) {
int i;
jshort* r = RETVAL;
@@ -3438,11 +2657,7 @@ GetShortArrayElements(array)
else
PUSHs(&PL_sv_no);
}
-#ifdef WIN32
- env->ReleaseShortArrayElements(array,RETVAL,JNI_ABORT);
-#else
(*env)->ReleaseShortArrayElements(env, array,RETVAL,JNI_ABORT);
-#endif
RESTOREENV;
}
@@ -3454,16 +2669,8 @@ GetIntArrayElements(array)
jboolean isCopy = NO_INIT;
PPCODE:
{
-#ifdef WIN32
- RETVAL = env->GetIntArrayElements(array,&isCopy);
-#else
RETVAL = (*env)->GetIntArrayElements(env, array,&isCopy);
-#endif
-#ifdef WIN32
- RETVAL_len_ = env->GetArrayLength(array);
-#else
RETVAL_len_ = (*env)->GetArrayLength(env, array);
-#endif
if (GIMME == G_ARRAY) {
int i;
jint* r = RETVAL;
@@ -3480,11 +2687,7 @@ GetIntArrayElements(array)
else
PUSHs(&PL_sv_no);
}
-#ifdef WIN32
- env->ReleaseIntArrayElements(array,RETVAL,JNI_ABORT);
-#else
(*env)->ReleaseIntArrayElements(env, array,RETVAL,JNI_ABORT);
-#endif
RESTOREENV;
}
@@ -3496,16 +2699,8 @@ GetLongArrayElements(array)
jboolean isCopy = NO_INIT;
PPCODE:
{
-#ifdef WIN32
- RETVAL = env->GetLongArrayElements(array,&isCopy);
-#else
RETVAL = (*env)->GetLongArrayElements(env, array,&isCopy);
-#endif
-#ifdef WIN32
- RETVAL_len_ = env->GetArrayLength(array);
-#else
RETVAL_len_ = (*env)->GetArrayLength(env, array);
-#endif
if (GIMME == G_ARRAY) {
int i;
jlong* r = RETVAL;
@@ -3522,11 +2717,7 @@ GetLongArrayElements(array)
else
PUSHs(&PL_sv_no);
}
-#ifdef WIN32
- env->ReleaseLongArrayElements(array,RETVAL,JNI_ABORT);
-#else
(*env)->ReleaseLongArrayElements(env, array,RETVAL,JNI_ABORT);
-#endif
RESTOREENV;
}
@@ -3538,16 +2729,8 @@ GetFloatArrayElements(array)
jboolean isCopy = NO_INIT;
PPCODE:
{
-#ifdef WIN32
- RETVAL = env->GetFloatArrayElements(array,&isCopy);
-#else
RETVAL = (*env)->GetFloatArrayElements(env, array,&isCopy);
-#endif
-#ifdef WIN32
- RETVAL_len_ = env->GetArrayLength(array);
-#else
RETVAL_len_ = (*env)->GetArrayLength(env, array);
-#endif
if (GIMME == G_ARRAY) {
int i;
jfloat* r = RETVAL;
@@ -3564,11 +2747,7 @@ GetFloatArrayElements(array)
else
PUSHs(&PL_sv_no);
}
-#ifdef WIN32
- env->ReleaseFloatArrayElements(array,RETVAL,JNI_ABORT);
-#else
(*env)->ReleaseFloatArrayElements(env, array,RETVAL,JNI_ABORT);
-#endif
RESTOREENV;
}
@@ -3580,16 +2759,8 @@ GetDoubleArrayElements(array)
jboolean isCopy = NO_INIT;
PPCODE:
{
-#ifdef WIN32
- RETVAL = env->GetDoubleArrayElements(array,&isCopy);
-#else
RETVAL = (*env)->GetDoubleArrayElements(env, array,&isCopy);
-#endif
-#ifdef WIN32
- RETVAL_len_ = env->GetArrayLength(array);
-#else
RETVAL_len_ = (*env)->GetArrayLength(env, array);
-#endif
if (GIMME == G_ARRAY) {
int i;
jdouble* r = RETVAL;
@@ -3606,11 +2777,7 @@ GetDoubleArrayElements(array)
else
PUSHs(&PL_sv_no);
}
-#ifdef WIN32
- env->ReleaseDoubleArrayElements(array,RETVAL,JNI_ABORT);
-#else
(*env)->ReleaseDoubleArrayElements(env, array,RETVAL,JNI_ABORT);
-#endif
RESTOREENV;
}
@@ -3625,11 +2792,7 @@ GetBooleanArrayRegion(array,start,len,buf)
jboolean * buf = (jboolean*)sv_grow(ST(3),len * sizeof(jboolean)+1);
CODE:
{
-#ifdef WIN32
- env->GetBooleanArrayRegion(array,start,len,buf);
-#else
(*env)->GetBooleanArrayRegion(env, array,start,len,buf);
-#endif
SvCUR_set(ST(3), len * sizeof(jboolean));
*SvEND(ST(3)) = '\0';
RESTOREENV;
@@ -3646,11 +2809,7 @@ GetByteArrayRegion(array,start,len,buf)
jbyte * buf = (jbyte*)sv_grow(ST(3),len * sizeof(jbyte)+1);
CODE:
{
-#ifdef WIN32
- env->GetByteArrayRegion(array,start,len,buf);
-#else
(*env)->GetByteArrayRegion(env, array,start,len,buf);
-#endif
SvCUR_set(ST(3), len * sizeof(jbyte));
*SvEND(ST(3)) = '\0';
RESTOREENV;
@@ -3667,11 +2826,7 @@ GetCharArrayRegion(array,start,len,buf)
jchar * buf = (jchar*)sv_grow(ST(3),len * sizeof(jchar)+1);
CODE:
{
-#ifdef WIN32
- env->GetCharArrayRegion(array,start,len,buf);
-#else
(*env)->GetCharArrayRegion(env, array,start,len,buf);
-#endif
SvCUR_set(ST(3), len * sizeof(jchar));
*SvEND(ST(3)) = '\0';
RESTOREENV;
@@ -3688,11 +2843,7 @@ GetShortArrayRegion(array,start,len,buf)
jshort * buf = (jshort*)sv_grow(ST(3),len * sizeof(jshort)+1);
CODE:
{
-#ifdef WIN32
- env->GetShortArrayRegion(array,start,len,buf);
-#else
(*env)->GetShortArrayRegion(env, array,start,len,buf);
-#endif
SvCUR_set(ST(3), len * sizeof(jshort));
*SvEND(ST(3)) = '\0';
RESTOREENV;
@@ -3709,11 +2860,7 @@ GetIntArrayRegion(array,start,len,buf)
jint * buf = (jint*)sv_grow(ST(3),len * sizeof(jint)+1);
CODE:
{
-#ifdef WIN32
- env->GetIntArrayRegion(array,start,len,buf);
-#else
(*env)->GetIntArrayRegion(env, array,start,len,buf);
-#endif
SvCUR_set(ST(3), len * sizeof(jint));
*SvEND(ST(3)) = '\0';
RESTOREENV;
@@ -3730,11 +2877,7 @@ GetLongArrayRegion(array,start,len,buf)
jlong * buf = (jlong*)sv_grow(ST(3),len * sizeof(jlong)+1);
CODE:
{
-#ifdef WIN32
- env->GetLongArrayRegion(array,start,len,buf);
-#else
(*env)->GetLongArrayRegion(env, array,start,len,buf);
-#endif
SvCUR_set(ST(3), len * sizeof(jlong));
*SvEND(ST(3)) = '\0';
RESTOREENV;
@@ -3751,11 +2894,7 @@ GetFloatArrayRegion(array,start,len,buf)
jfloat * buf = (jfloat*)sv_grow(ST(3),len * sizeof(jfloat)+1);
CODE:
{
-#ifdef WIN32
- env->GetFloatArrayRegion(array,start,len,buf);
-#else
(*env)->GetFloatArrayRegion(env, array,start,len,buf);
-#endif
SvCUR_set(ST(3), len * sizeof(jfloat));
*SvEND(ST(3)) = '\0';
RESTOREENV;
@@ -3772,11 +2911,7 @@ GetDoubleArrayRegion(array,start,len,buf)
jdouble * buf = (jdouble*)sv_grow(ST(3),len * sizeof(jdouble)+1);
CODE:
{
-#ifdef WIN32
- env->GetDoubleArrayRegion(array,start,len,buf);
-#else
(*env)->GetDoubleArrayRegion(env, array,start,len,buf);
-#endif
SvCUR_set(ST(3), len * sizeof(jdouble));
*SvEND(ST(3)) = '\0';
RESTOREENV;
@@ -3797,11 +2932,7 @@ SetBooleanArrayRegion(array,start,len,buf)
croak("string is too short");
else if (buf_len_ > len && PL_dowarn)
warn("string is too long");
-#ifdef WIN32
- env->SetBooleanArrayRegion(array,start,len,buf);
-#else
(*env)->SetBooleanArrayRegion(env, array,start,len,buf);
-#endif
RESTOREENV;
}
@@ -3820,11 +2951,7 @@ SetByteArrayRegion(array,start,len,buf)
croak("string is too short");
else if (buf_len_ > len && PL_dowarn)
warn("string is too long");
-#ifdef WIN32
- env->SetByteArrayRegion(array,start,len,buf);
-#else
(*env)->SetByteArrayRegion(env, array,start,len,buf);
-#endif
RESTOREENV;
}
@@ -3843,11 +2970,7 @@ SetCharArrayRegion(array,start,len,buf)
croak("string is too short");
else if (buf_len_ > len && PL_dowarn)
warn("string is too long");
-#ifdef WIN32
- env->SetCharArrayRegion(array,start,len,buf);
-#else
(*env)->SetCharArrayRegion(env, array,start,len,buf);
-#endif
RESTOREENV;
}
@@ -3866,11 +2989,7 @@ SetShortArrayRegion(array,start,len,buf)
croak("string is too short");
else if (buf_len_ > len && PL_dowarn)
warn("string is too long");
-#ifdef WIN32
- env->SetShortArrayRegion(array,start,len,buf);
-#else
(*env)->SetShortArrayRegion(env, array,start,len,buf);
-#endif
RESTOREENV;
}
@@ -3889,11 +3008,7 @@ SetIntArrayRegion(array,start,len,buf)
croak("string is too short");
else if (buf_len_ > len && PL_dowarn)
warn("string is too long");
-#ifdef WIN32
- env->SetIntArrayRegion(array,start,len,buf);
-#else
(*env)->SetIntArrayRegion(env, array,start,len,buf);
-#endif
RESTOREENV;
}
@@ -3912,11 +3027,7 @@ SetLongArrayRegion(array,start,len,buf)
croak("string is too short");
else if (buf_len_ > len && PL_dowarn)
warn("string is too long");
-#ifdef WIN32
- env->SetLongArrayRegion(array,start,len,buf);
-#else
(*env)->SetLongArrayRegion(env, array,start,len,buf);
-#endif
RESTOREENV;
}
@@ -3935,11 +3046,7 @@ SetFloatArrayRegion(array,start,len,buf)
croak("string is too short");
else if (buf_len_ > len && PL_dowarn)
warn("string is too long");
-#ifdef WIN32
- env->SetFloatArrayRegion(array,start,len,buf);
-#else
(*env)->SetFloatArrayRegion(env, array,start,len,buf);
-#endif
RESTOREENV;
}
@@ -3958,11 +3065,7 @@ SetDoubleArrayRegion(array,start,len,buf)
croak("string is too short");
else if (buf_len_ > len && PL_dowarn)
warn("string is too long");
-#ifdef WIN32
- env->SetDoubleArrayRegion(array,start,len,buf);
-#else
(*env)->SetDoubleArrayRegion(env, array,start,len,buf);
-#endif
RESTOREENV;
}
@@ -3974,11 +3077,7 @@ RegisterNatives(clazz,methods,nMethods)
jint nMethods
CODE:
{
-#ifdef WIN32
- RETVAL = env->RegisterNatives(clazz,methods,nMethods);
-#else
RETVAL = (*env)->RegisterNatives(env, clazz,methods,nMethods);
-#endif
}
SysRet
@@ -3987,11 +3086,7 @@ UnregisterNatives(clazz)
jclass clazz
CODE:
{
-#ifdef WIN32
- RETVAL = env->UnregisterNatives(clazz);
-#else
RETVAL = (*env)->UnregisterNatives(env, clazz);
-#endif
}
OUTPUT:
RETVAL
@@ -4002,11 +3097,7 @@ MonitorEnter(obj)
jobject obj
CODE:
{
-#ifdef WIN32
- RETVAL = env->MonitorEnter(obj);
-#else
RETVAL = (*env)->MonitorEnter(env, obj);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -4018,11 +3109,7 @@ MonitorExit(obj)
jobject obj
CODE:
{
-#ifdef WIN32
- RETVAL = env->MonitorExit(obj);
-#else
RETVAL = (*env)->MonitorExit(env, obj);
-#endif
RESTOREENV;
}
OUTPUT:
@@ -4033,12 +3120,13 @@ GetJavaVM(...)
JNIEnv * env = FETCHENV;
CODE:
{
- if (env) { /* We're embedded. */
-#ifdef WIN32
- if (env->GetJavaVM(&RETVAL) < 0)
+#ifdef JPL_DEBUG
+ jpldebug = 1;
#else
- if ((*env)->GetJavaVM(env, &RETVAL) < 0)
+ jpldebug = 0;
#endif
+ if (env) { /* We're embedded. */
+ if ((*env)->GetJavaVM(env, &RETVAL) < 0)
RETVAL = 0;
}
else { /* We're embedding. */
@@ -4053,7 +3141,7 @@ GetJavaVM(...)
}
if (items--) {
- ++mark;
+ ++mark;
lib = SvPV(*mark, PL_na);
}
else
@@ -4062,10 +3150,14 @@ GetJavaVM(...)
fprintf(stderr, "lib is %s.\n", lib);
}
#ifdef WIN32
- if (!LoadLibrary("javai.dll")) {
- if (lib && !LoadLibrary(lib))
- croak("Can't load javai.dll");
- }
+ if (LoadLibrary("jvm.dll")) {
+ if (!LoadLibrary("javai.dll")) {
+ warn("Can't load javai.dll");
+ }
+ } else {
+ if (lib && !LoadLibrary(lib))
+ croak("Can't load javai.dll");
+ }
#else
if (jpldebug) {
fprintf(stderr, "Opening Java shared library.\n");
@@ -4079,16 +3171,20 @@ GetJavaVM(...)
croak("Can't load Java shared library.");
}
#endif
-
+ /* Kaffe seems to get very upset if vm_args.version isn't set */
+#ifdef KAFFE
+ vm_args.version = JNI_VERSION_1_1;
+#endif
JNI_GetDefaultJavaVMInitArgs(&vm_args);
vm_args.exit = &call_my_exit;
if (jpldebug) {
fprintf(stderr, "items = %d\n", items);
fprintf(stderr, "mark = %s\n", SvPV(*mark, PL_na));
}
- ++mark;
while (items > 1) {
- char *s = SvPV(*mark,PL_na);
+ char *s;
+ ++mark;
+ s = SvPV(*mark,PL_na);
++mark;
if (jpldebug) {
fprintf(stderr, "*s = %s\n", s);
@@ -4115,7 +3211,20 @@ GetJavaVM(...)
vm_args.enableVerboseGC = (jint)SvIV(*mark);
else if (strEQ(s, "disableAsyncGC"))
vm_args.disableAsyncGC = (jint)SvIV(*mark);
-#ifndef KAFFE
+#ifdef KAFFE
+ else if (strEQ(s, "libraryhome"))
+ vm_args.libraryhome = savepv(SvPV(*mark,PL_na));
+ else if (strEQ(s, "classhome"))
+ vm_args.classhome = savepv(SvPV(*mark,PL_na));
+ else if (strEQ(s, "enableVerboseJIT"))
+ vm_args.enableVerboseJIT = (jint)SvIV(*mark);
+ else if (strEQ(s, "enableVerboseClassloading"))
+ vm_args.enableVerboseClassloading = (jint)SvIV(*mark);
+ else if (strEQ(s, "enableVerboseCall"))
+ vm_args.enableVerboseCall = (jint)SvIV(*mark);
+ else if (strEQ(s, "allocHeapSize"))
+ vm_args.allocHeapSize = (jint)SvIV(*mark);
+#else
else if (strEQ(s, "verbose"))
vm_args.verbose = (jint)SvIV(*mark);
else if (strEQ(s, "debugging"))
@@ -4132,10 +3241,13 @@ GetJavaVM(...)
fprintf(stderr, "Working CLASSPATH: %s\n",
vm_args.classpath);
}
- JNI_CreateJavaVM(&RETVAL, &jplcurenv, &vm_args);
+ if (JNI_CreateJavaVM(&RETVAL, &jplcurenv, &vm_args) < 0) {
+ croak("Unable to create instance of JVM");
+ }
if (jpldebug) {
fprintf(stderr, "Created Java VM.\n");
}
+
}
}
diff --git a/gnu/usr.bin/perl/jpl/JNI/Makefile.PL b/gnu/usr.bin/perl/jpl/JNI/Makefile.PL
index 1a54b9d82cb..a4865b55038 100644
--- a/gnu/usr.bin/perl/jpl/JNI/Makefile.PL
+++ b/gnu/usr.bin/perl/jpl/JNI/Makefile.PL
@@ -7,12 +7,28 @@ use File::Basename;
getopts('e'); # embedding?
+$CCFLAGS .= $ENV{CCFLAGS} if defined $ENV{CCFLAGS};
+
+# $USE_KAFFE is a boolean that tells us whether or not we should use Kaffe.
+# Set by find_includes (it seemed as good a place as any).
+
+# Note that we don't check to see the version of Kaffe is one we support.
+# Currently, the only one we support is the one from CVS.
+
+my $USE_KAFFE = 0;
+
#require "JNIConfig";
if ($^O eq 'solaris') {
$LIBPATH = " -R$Config{archlib}/CORE -L$Config{archlib}/CORE";
} elsif ($^O eq 'MSWin32') {
$LIBPATH = " -L$Config{archlib}\\CORE";
+ # MSR - added MS VC++ default library path
+ # bjepson - fixed to support path names w/spaces in them.
+ push(@WINLIBS, (split"\;",$ENV{LIB}));
+ grep s/\\$//, @WINLIBS; # eliminate trailing \
+ grep s/\/$//, @WINLIBS; # eliminate trailing /
+ $LIBPATH .= join(" ", "", map { qq["-L$_" ] } @WINLIBS);
} else {
$LIBPATH = " -L$Config{archlib}/CORE";
}
@@ -20,9 +36,14 @@ if ($^O eq 'solaris') {
# Figure out where Java might live
#
+# MSR - added JDK 1.3
+#
+
my @JAVA_HOME_GUESSES = qw(/usr/local/java /usr/java /usr/local/jdk117_v3
- /usr/local/lib/kaffe C:\\JDK1.1.8
- C:\\JDK1.2.1 );
+ C:\\JDK1.1.8 C:\\JDK1.2.1 C:\\JDK1.2.2 C:\\JDK1.3 );
+
+my @KAFFE_PREFIX_GUESSES = qw(/usr/local /usr);
+
if (! defined $ENV{JAVA_HOME}) {
print "You didn't define JAVA_HOME, so I'm trying a few guesses.\n";
print "If this fails, you might want to try setting JAVA_HOME and\n";
@@ -31,10 +52,39 @@ if (! defined $ENV{JAVA_HOME}) {
@JAVA_HOME_GUESSES = ( $ENV{JAVA_HOME} );
}
+if (! defined $ENV{KAFFE_PREFIX}) {
+ print "\nYou didn't define KAFFE_PREFIX, so I'm trying a few guesses.",
+ "\nIf this fails, and you are using Kaffe, you might want to try\n",
+ "setting KAFFE_PREFIX and running me again.\n",
+ "If you want to ignore any possible Kaffe installation, set the\n",
+ "KAFFE_PREFIX to and empty string.\n\n";
+} else {
+ @KAFFE_PREFIX_GUESSES = ($ENV{KAFFE_PREFIX} eq "") ? () :
+ ( $ENV{KAFFE_PREFIX} );
+}
+
+my(@KAFFE_INCLUDE_GUESSES, @KAFFE_LIB_GUESSES);
+foreach my $kaffePrefix (@KAFFE_PREFIX_GUESSES) {
+ push(@KAFFE_INCLUDE_GUESSES, "$kaffePrefix/include/kaffe");
+ push(@KAFFE_LIB_GUESSES, "$kaffePrefix/lib");
+ push(@KAFFE_LIB_GUESSES, "$kaffePrefix/lib/kaffe");
+}
+ $guess .= "/include/kaffe";
+
# Let's find out where jni.h lives
#
my @INCLUDE = find_includes();
-$INC = join(" -I", ("", @INCLUDE));
+
+if ($^O eq 'MSWin32') {
+ # MSR - added MS VC++ default include path
+ push(@INCLUDE,(split"\;",$ENV{INCLUDE}));
+ grep s/\\$//, @INCLUDE; # remove trailing \
+ grep s/\/$//, @INCLUDE; # remove trailing \
+ $INC = join("", map { qq["-I$_" ] } @INCLUDE);
+
+} else {
+ $INC = join(" -I", ("", @INCLUDE));
+}
# Let's find out the name of the Java shared library
#
@@ -43,20 +93,21 @@ my @JAVALIBS = find_libs();
# Find out some defines based on the library we are linking to
#
foreach (@JAVALIBS) {
- if ( /javai.lib$/ or /jvm.lib$/) { # We're on Win32
+ if ( $^O eq 'MSWin32') { # We're on Win32
$INC =~ s#/#\\#g;
$INC =~ s#\\$##;
- $CCFLAGS .= "-DWIN32 -Z7 -D_DEBUG";
- $MYEXTLIB = $libjava;
- } elsif (/libkaffevm.so$/) {
- $CCFLAGS .= "-DKAFFE";
- }
+ print $INC, "\n";
+ $CCFLAGS .= " -DWIN32 -Z7 -D_DEBUG";
+ $MYEXTLIB = "$libjava";
+ }
}
+$CCFLAGS .= " -DKAFFE" if ($USE_KAFFE);
+
# Let's find out the path of the library we need to link against.
#
foreach (@JAVALIBS) {
- if ( /javai.lib$/ or /jvm.lib$/) { # We're on Win32
+ if ($^O eq 'MSWin32') { # We're on Win32
$_ =~ s#/#\\\\#g;
}
my ($libname, $libpath, $libsuffix) = fileparse($_, ("\.so", "\.lib"));
@@ -89,6 +140,37 @@ if ($^O eq 'solaris') {
$CCFLAGS .= " -D_REENTRANT";
}
+# MSR - clean up LIBS
+$LIBS =~ s/-l$//;
+
+#
+# Next, build JNI/Config.pm. This is a superfluous thing for the SUN and
+# Microsoft JDKs, but absolutely necessary for Kaffe. I think at some
+# point, the Microsoft and SUN implementations should use JNI::Config, too.
+#
+
+if (! -d "JNI") {
+ mkdir("JNI", 0755) || die "Unable to make JNI directory: $!";
+}
+open(JNICONFIG, ">JNI/Config.pm") || die "Unable to open JNI/Config.pm: $!";
+
+print JNICONFIG "# DO NOT EDIT! Autogenerated by JNI/Makefile.PL\n\n",
+ "package JNI::Config;\nuse strict;\nuse Carp;\n",
+ "\nuse vars qw(\$KAFFE \$LIB_JAVA \$CLASS_HOME ",
+ "\$LIB_HOME);\n\n",
+ "\$KAFFE = $USE_KAFFE;\n\$LIB_JAVA = \"$JAVALIBS[0]\";\n";
+if ($USE_KAFFE) {
+ my $path = $JAVALIBS[0];
+ $path =~ s%/(kaffe/)?libkaffevm.so$%%;
+
+ print JNICONFIG "\$LIB_HOME = \"$path/kaffe\";\n";
+ $path =~ s%/lib%%;
+ print JNICONFIG "\$CLASS_HOME = \"$path/share/kaffe\";\n";
+}
+print JNICONFIG "\n\n1;\n";
+close JNICONFIG;
+
+
my %Makefile = (
NAME => 'JNI',
VERSION_FROM => 'JNI.pm',
@@ -97,6 +179,8 @@ my %Makefile = (
INC => $INC,
CCFLAGS => "$Config{ccflags} $CCFLAGS",
($Config{archname} =~ /mswin32.*-object/i ? ('CAPI' => 'TRUE') : ()),
+
+ clean => {FILES => "JNI/* JNI"}
);
$Makefile{LIBS} = ["$LIBPATH $LIBS"];
@@ -109,12 +193,20 @@ if ($MYEXTLIB) {
#
WriteMakefile(%Makefile);
+if ($USE_KAFFE) {
+ my $path = $JAVALIBS[0];
+ $path =~ s%/libkaffevm.so$%%;
+ print "\n\n***NOTE: be sure to have:\n",
+ " LD_LIBRARY_PATH=$path\n",
+ " in your enviornment (or installed as a system dynamic\n",
+ " library location) when you compile and run this.\n";
+}
+
# subroutine to find a library
#
sub find_stuff {
my ($candidates, $locations) = @_;
-
my $lib;
$wanted = sub {
foreach my $name (@$candidates) {
@@ -139,51 +231,67 @@ sub find_stuff {
# Extra lib for Java 1.2
#
+# if we want KAFFE, check for it, otherwise search for Java
+
sub find_libs {
+ my($libjava, $libawt, $libjvm);
- my $libjava = find_stuff(['libjava.so', 'libkaffevm.so', 'javai.lib', 'jvm.lib'],
- \@JAVA_HOME_GUESSES);
- my $libjvm = find_stuff(['libjvm.so'], \@JAVA_HOME_GUESSES);
- if ($libjvm) { # JDK 1.2
- my $libhpi = find_stuff(['libhpi.so'], \@JAVA_HOME_GUESSES);
- my $libawt = find_stuff(['libawt.so'], \@JAVA_HOME_GUESSES);
- return($libjava, $libjvm, $libhpi, $libawt);
- } else {
- return($libjava);
+ if ($USE_KAFFE) {
+ $libjava = find_stuff(['libkaffevm.so'], \@KAFFE_LIB_GUESSES);
+ $libawt = find_stuff(['libawt.so'], \@KAFFE_LIB_GUESSES);
+ } else {
+ $libjava = find_stuff(['libjava.so', 'javai.lib', 'jvm.lib'],
+ \@JAVA_HOME_GUESSES);
+ $libjvm = find_stuff(['libjvm.so'], \@JAVA_HOME_GUESSES);
+ $libawt = find_stuff(['libawt.so'], \@JAVA_HOME_GUESSES);
+ if (defined $libjvm) { # JDK 1.2
+ my $libhpi = find_stuff(['libhpi.so'], \@JAVA_HOME_GUESSES);
+ return($libjava, $libjvm, $libhpi, $libawt);
}
-
+ }
+ return($libjava, $libawt);
}
# We need to find jni.h and jni_md.h
#
+
+# Always do find_includes as the first operation, as it has the side effect
+# of deciding whether or not we are looking for Kaffe. --bkuhn
+
sub find_includes {
- my @CANDIDATES = qw(jni.h jni_md.h);
- my @includes;
-
- sub find_inc {
- foreach my $name (@CANDIDATES) {
- if (/$name$/) {
- my ($hname, $hpath, $hsuffix) =
- fileparse($File::Find::name, ("\.h", "\.H"));
- unless ($hpath =~ /include-old/) {
- print "Found $hname$hsuffix in $hpath\n";
- push @includes, $hpath;
- }
- }
- }
+ my @CANDIDATES = qw(jni.h jni_md.h);
+ my @includes;
+
+ sub find_inc {
+ foreach my $name (@CANDIDATES) {
+ if (/$name$/) {
+ my ($hname, $hpath, $hsuffix) =
+ fileparse($File::Find::name, ("\.h", "\.H"));
+ unless ($hpath =~ /include-old/) {
+ print "Found $hname$hsuffix in $hpath\n";
+ push @includes, $hpath;
+ }
+ }
}
+ }
- use File::Find;
+ use File::Find;
+ foreach my $guess (@KAFFE_INCLUDE_GUESSES) {
+ next unless -d $guess;
+ find (\&find_inc, $guess);
+ }
+ # If we have found includes, then we are using Kaffe.
+ if (@includes > 0) {
+ $USE_KAFFE = 1;
+ } else {
foreach my $guess (@JAVA_HOME_GUESSES) {
- next unless -d $guess;
- find (\&find_inc, $guess);
+ next unless -d $guess;
+ find (\&find_inc, $guess);
}
- if (! @includes) {
- die "Could not find Java includes!";
- } else {
- print join("\n", @includes), "\n";
- }
- return @includes;
+ }
+ die "Could not find Java includes!" unless (@includes);
+
+ return @includes;
}
diff --git a/gnu/usr.bin/perl/jpl/PerlInterpreter/PerlInterpreter.h b/gnu/usr.bin/perl/jpl/PerlInterpreter/PerlInterpreter.h
index 22fdf526dca..95e80505a95 100644
--- a/gnu/usr.bin/perl/jpl/PerlInterpreter/PerlInterpreter.h
+++ b/gnu/usr.bin/perl/jpl/PerlInterpreter/PerlInterpreter.h
@@ -7,6 +7,7 @@
#ifdef __cplusplus
extern "C" {
#endif
+/* Inaccessible static: initted */
/*
* Class: PerlInterpreter
* Method: init
diff --git a/gnu/usr.bin/perl/jpl/README b/gnu/usr.bin/perl/jpl/README
index 57f52c4f717..23405a76ea5 100644
--- a/gnu/usr.bin/perl/jpl/README
+++ b/gnu/usr.bin/perl/jpl/README
@@ -9,18 +9,20 @@ from the network. Don't expect not to be surprised occasionally.
Requirements
------------
-Under Solaris and Linux (and other Unix-like systems), Perl 5.005 (or later)
-must be compiled and installed as a shared library (libperl.so). I had to use
-the system's malloc. JPL was originally built and tested with 5.004_04 and
-early Java 1.1 development kits. This version has not been well tested under
-other versions, so you can expect some rough edges.
+Under Solaris and GNU/Linux (and other Unix-like systems), Perl 5.005 (or
+later) must be compiled and installed as a shared library (libperl.so). I
+had to use the system's malloc. JPL was originally built and tested with
+5.004_04 and early Java 1.1 development kits. This version has not been
+well tested under other versions, so you can expect some rough edges.
-You need JDK 1.1. On Solaris, 1.1.5 has been verified to work. Linux
+You need JDK 1.1. On Solaris, 1.1.5 has been verified to work. GNU/Linux
users can try the latest version (1.1.3 or later) available from (for
example):
ftp://ftp.blackdown.org/pub/Linux/JDK/1.1.3/updates/libjava-1.1.3v2-1.tar.gz
+(GNU/Linux users can also try Kaffe (see below).)
+
The get_jdk directory contains a script that will download JDK (but not
the patch file above) off of the net for you. (This presumes you've
already installed the modules mentioned in ../README.)
@@ -40,9 +42,20 @@ with JDK 1.2 (aka Java 2) or any Microsoft implementation of Java.
Kaffe
-----
-You might notice some mention of Kaffe (www.kaffe.org) in the source files.
-This is because some preliminary work is being done in this area, but JPL
-doesn't yet work with Kaffe.
+You might notice some mention of Kaffe (www.kaffe.org) in the source files.
+This is because support has been added for Kaffe for JNI:: and JPL::. In
+other words, you can now call to Java from Perl using Kaffe.
+
+You'll likely need the a checkout circa 2000-12-03 or later from Kaffe's
+CVS. It has been verified that Kaffe 1.0.5 definitely *will not work*.
+Kaffe 1.0.6 might work, but the CVS tree definitely works (as of
+2000-12-06).
+
+You can get the CVS tree from:
+
+cvs -z3 -d ':pserver:readonly@cvs.kaffe.org:/cvs/kaffe' checkout kaffe
+
+(password is 'readonly')
What the heck is JPL?
---------------------
@@ -85,11 +98,12 @@ The second way lets you embed Java in Perl, but doesn't provide support
for the other direction. This is good, in theory, if you need to work with
a lot of Java classes from within Perl. I say "in theory," because this
doesn't actually work a lot of the time. To use this second way, you
-must be using a JDK with native threads.
+must be using a JDK with native threads. Please see README.JUST-JNI for
+details.
At this point, the second way is the only way to use JPL under Microsoft
-Windows. Oddly enough, this is the only platform under which the second
-way works!
+Windows, and probably the only way to use JPL if you're using a version
+of Perl compiled by someone else (such as the Perl that comes with RedHat).
Installation the First Way (All of JPL)
---------------------------------------
@@ -131,85 +145,6 @@ builds Sample.jpl:
it will abort when it tries to run 'perl -c' on the generated .pl
file. However, you can continue building by typing 'make' again.
-Just-JNI (call into Java from Perl only)
-----------------------------------------
-
-This has been tested with:
-
- Debian 2.1 SPARC, Perl 5.005_60, JDK 1.2 beta (crashes with AWT, though)
- Windows NT 4.0 SP4, ActivePerl 519, JDK 1.1.8, Visual C++
- Solaris 7, Perl 5.005_03, JDK 1.1.6, GCC 2.8.1
-
-Solaris 7 Note (this probably applies to all native thread situations):
-
- Native threads were tricky. I had to build my own Perl, configured with:
-
- sh Configure -Dprefix=/opt/perl5.005 -Duseshrplib -Doptimize=-g \
- -Uusemymalloc -D cc=gcc -Dusethreads -d
-
- When Configure let me edit config.sh, I changed libs to:
-
- libs='-lthread -lsocket -lnsl -ldl -lm -lposix4 -lpthread -lc -lcrypt'
-
- The leading -lthread is the only thing I had to add.
-
-How do I do this crazy thing?
-
-1) Cd into the JPL directory. Type the following:
-
- perl Makefile.PL
- make
- make install
-
- Under windows, that's:
-
- perl Makefile.PL
- nmake
- nmake install
-
-3) cd into the JNI directory (cd ../JNI or cd ..\JNI)
-
-4) We now need to compile and make the Closer.class available to your
- JPL program. Closer is a WindowListener that closes the Frame we
- make in the test program.
-
- It seems that we've managed to fix the problem with CLASSPATH not
- getting propagated to the JVM, so if '.' is in your CLASSPATH, you
- should be able to compile Closer.java and leave it in the current
- directory:
-
- javac Closer.java
-
-5) Make the demo:
-
- a) If you are on Windows, copy typemap.win32:
-
- copy typemap.win32 typemap
-
- (this step will probably go away when we clean up some of the
- WIN32 #defines)
-
- b) type the following:
-
- perl Makefile.PL
- make
- make test
-
- Under Windows:
-
- perl Makefile.PL
- nmake
- nmake test
-
-
- c) if all went well, type:
-
- make install
-
- or, under Windows:
-
- nmake install
-
Mailing List
------------
To subscribe to the jpl mailing list, send an email message to
diff --git a/gnu/usr.bin/perl/jpl/README.JUST-JNI b/gnu/usr.bin/perl/jpl/README.JUST-JNI
new file mode 100644
index 00000000000..03aa34d3229
--- /dev/null
+++ b/gnu/usr.bin/perl/jpl/README.JUST-JNI
@@ -0,0 +1,113 @@
+Just-JNI (call into Java from Perl only)
+----------------------------------------
+
+This has been tested with:
+
+ Debian GNU/Linux 2.2 i386, perl 5.6.0, Kaffe (CVS, 2000-12-05 or later)
+ RedHat 6.1, perl-5.00503-6 (RedHat RPM), IBM JDK 1.1.8
+ Debian 2.1 SPARC, Perl 5.005_60, JDK 1.2 beta (crashes with AWT, though)
+ Windows NT 4.0 SP4, ActivePerl 519, JDK 1.1.8, Visual C++
+ Solaris 7, Perl 5.005_03, JDK 1.1.6, GCC 2.8.1
+
+Solaris 7 Note (this probably applies to all native thread situations):
+
+ Native threads were tricky. I had to build my own Perl, configured with:
+
+ sh Configure -Dprefix=/opt/perl5.005 -Duseshrplib -Doptimize=-g \
+ -Uusemymalloc -D cc=gcc -Dusethreads -d
+
+ When Configure let me edit config.sh, I changed libs to:
+
+ libs='-lthread -lsocket -lnsl -ldl -lm -lposix4 -lpthread -lc -lcrypt'
+
+ The leading -lthread is the only thing I had to add.
+
+Kaffe Note:
+
+I believe that Kaffe with JIT enabled will likely be problematic. I had a
+lot of trouble with it, that simply went away with interpreter-based Kaffe.
+FWIW, here's how I configured Kaffe:
+
+ env AM_CPPFLAGS=-DDEBUG CFLAGS="-O0 -ggdb" ./configure --disable-gcj \
+ --with-engine=intrp
+
+Likely you don't need all that debugging stuff.
+
+Also, when I build perl, I do this, to be on the safe side. I was worried
+about thread interaction, but realized there was no need to build threaded
+perl, but I thought that the perl code should probably be reentrant, so, I
+did this:
+
+ sh ./Configure -Dcc=gcc -Doptimize='-D_REENTRANT -DDEBUGGING -ggdb' \
+ -Dlibperl='libperl.so' -Duseshrplib='true'
+
+Again, you likely don't need the debugging flags.
+
+
+How do I do this crazy thing?
+-----------------------------
+
+1) Cd into the JPL directory. Type the following:
+
+ perl Makefile.PL
+ make
+ make install
+
+ Under windows, that's:
+
+ perl Makefile.PL
+ nmake
+ nmake install
+
+3) cd into the JNI directory (cd ../JNI or cd ..\JNI)
+
+4) We now need to compile and make the Closer.class available to your
+ JPL program. Closer is a WindowListener that closes the Frame we
+ make in the test program.
+
+ It seems that we've managed to fix the problem with CLASSPATH not
+ getting propagated to the JVM, so if '.' is in your CLASSPATH, you
+ should be able to compile Closer.java and leave it in the current
+ directory:
+
+ javac Closer.java
+
+ or perhaps
+
+ jikes Closer.java
+
+5) Make the demo:
+
+ a) type the following:
+
+ for SUN's proprietary software Java:
+
+ env JAVA_HOME=/path/to/java perl Makefile.PL
+ # setting the JAVA_HOME enviornment variable might not be needed
+ # if Java is in installed in a canonical location
+ make
+ make test
+
+ for Kaffe:
+
+ env KAFFE_PREFIX=/kaffe/installation/prefix perl Makefile.PL
+ # setting the KAFFE_PREFIX enviornment variable might not be needed
+ # if Kaffe is in a canonical location
+ make
+ make test
+
+ Under Windows:
+
+ perl Makefile.PL
+ nmake
+ nmake test
+
+
+ b) if all went well, type:
+
+ make install
+
+ or, under Windows:
+
+ nmake install
+
diff --git a/gnu/usr.bin/perl/jpl/docs/Tutorial.pod b/gnu/usr.bin/perl/jpl/docs/Tutorial.pod
new file mode 100644
index 00000000000..d8f92c145ca
--- /dev/null
+++ b/gnu/usr.bin/perl/jpl/docs/Tutorial.pod
@@ -0,0 +1,1047 @@
+=head1 NAME
+
+Tutorial - Perl and Java
+
+=head1 SYNOPSIS
+
+Java and Perl have different strengths and complement each other well.
+
+You can connect them at runtime with tools such as JPL, PJC, or
+ActiveX. In theory, you can convert Perl to Java bytecode, and
+vice-versa.
+
+=head2 Note:
+
+Not actually a conversion.
+
+At this stage, we are generating Java opcodes by walking Perl's syntax
+tree. This is very different from converting Perl to Java. It's a lot
+easier!
+
+=head1 1.1 Perl and Java, Compared
+
+Perl offers rich text processing features, high-level network APIs,
+excellent database integration, and a centralized repository of
+reusable code:
+
+=over 4
+
+=item *
+
+Regular expression engine is a powerful sub language that can perform
+complex text manipulations and extract data.
+
+=item *
+
+Packages such as libwww-perl (LWP) and libnet are powerful, high-level
+interfaces to network functionality.
+
+=item *
+
+The Perl DBI is an interface to SQL data sources.
+
+=item *
+
+CPAN provides a centralized, organized archive of reusable code.
+
+=back
+
+Java has a powerful graphical API, has numerous embedded
+implementations, excellent database integration, but no single
+recognized repository of reusable code.
+
+=over 4
+
+=item *
+
+The Swing (JFC) toolkit is a powerful toolkit for developing user
+interfaces. Java also boasts 2D and 3D graphics APIs.
+
+=item *
+
+Java comes in embedded flavors, such as:
+
+=over 4
+
+=item *
+
+Kaffe C<http://www.transvirtual.com/> - embedded implementations for
+different platforms
+
+=item *
+
+Waba C<http://www.wabasoft.com/> - a subset of Java for Windows CE and
+PalmOS
+
+=item *
+
+It's embedded into web browsers (Netscape and MS Internet Explorer)
+
+=item *
+
+and more...
+
+=back
+
+=item *
+
+Java's JDBC is similar to Perl's DBI
+
+=item *
+
+Java has many different repositories of code. Efforts such as the
+Giant Java Tree C<http://www.gjt.org/> attempt to create a unified
+repository.
+
+=back
+
+=head1 1.2 Opportunities to Combine Java and Perl
+
+You have a Java program with a lot of data that needs to be parsed,
+filed, briefed, debriefed, and numbered.
+
+You want to build your GUI in Java, but let Perl do the heavy lifting.
+
+You've adopted the "Java is a systems language, Perl is a scripting
+language" paradigm, and it works for you.
+
+You're not sure which regex implementation to use:
+
+C<org.teeth.green.loony.raving.monster.regex.*;>
+
+C<com.zeppelin.regex.*;>
+
+You want the I<B<best of both worlds>>.
+
+=head1 1.3 Important Differences between Java and Perl
+
+=over 4
+
+=item *
+
+C<perl> compiles and executes programs each time you run them (unless you
+use the Perl compiler).
+
+=item *
+
+C<javac> compiles programs in advance, C<java> runs them in the Java
+interpreter.
+
+=item *
+
+The Java interpreter supports method overloading (methods can have the
+same name, but are differentiated on the basis of their argument
+types). Overloaded methods generally perform the same function, but
+methods with a shorter argument list often use defaults:
+
+=back
+
+ // Draw a circle in the center of the screen
+ int drawCircle(int radius);
+
+ // Draw a circle at specified coordinates
+ int drawCircle(int radius, int h, int k);
+
+=over 4
+
+=item *
+
+The Perl interpreter doesn't support method overloading. In JPL, when
+we call Java from Perl, we need to use some tricks to specify the Java
+method we want to invoke. We'll learn about this when we see JPL's
+C<getmeth> function.
+
+=back
+
+=head2 Note:
+
+At the time this presentation was prepared, JPL did not work with Perl
+for Win32. However, JPL is in the core Perl distribution, and there
+are plans to make it work with Perl for Win32.
+
+With that in mind, I'm presenting the JPL material first, because it
+is of interest to both Win32 and Unix Perl people. The Win32-specific
+stuff (alternatives to JPL) will come last. I won't be offended if the
+Unix people leave when I move to this section of the tutorial, since
+there is no Unix material in that section. I'm perfectly happy to take
+questions between JPL and ActiveX sections.
+
+A subset of JPL now works on Win32. You can embed Java in Perl, but
+you cannot embed Perl in Java (yet).
+
+=head1 2.1 JPL Overview
+
+Let's look at an overview of JPL.
+
+=head2 2.1.1 Calling Perl from Java
+
+Well-supported by JPL, but it is a complicated process:
+
+=over 4
+
+=item *
+
+The JPL preprocessor parses the I<.jpl> file and generates C code
+wrappers for Perl methods. It also generates Java and Perl source
+files.
+
+=item *
+
+The C compiler compiles the wrapper and links it to the
+I<libPerlInterpreter.so> shared library, producing a shared library for
+the wrapper.
+
+=item *
+
+The Java compiler compiles the Java source file, which uses native
+methods to load the wrapper.
+
+=item *
+
+The wrapper connects the Java code to the Perl code in the Perl source
+file.
+
+=back
+
+Fortunately, a generic F<Makefile.PL> simplifies the process. This is a
+Perl script that generates a I<Makefile> for you.
+
+=head2 2.1.2 Calling Java from Perl
+
+This works best when Perl is embedded within a Java program.
+
+The JNI Perl module creates and loads a JVM. There is no precompiler,
+nothing extra -- it's just a Perl module and extension.
+
+ B<A Problem, Though>. In theory, you can call Java from standalone
+ Perl programs, but this doesn't work because some implementations
+ of Java use a user-level threads package (green threads) that
+ override some functions in the C library. Perl is comfortable
+ using these functions, but Java is not happy using the standard C
+ library functions.
+
+So, with green threads, you can't reliably embed Java in a standalone
+Perl program.
+
+Many Java implementations now use native threads. JPL has been tested
+on Solaris with JDK 1.1.x and native threads, but not on Linux.
+
+=head2 Note:
+
+Oddly enough, this is the only way it works on Win32.
+
+On Unix, I've still had trouble, even with native threads. I might
+need to recompile perl with -DREENTRANT, but I'm not sure.
+
+
+=head1 2.2 Working with JPL
+
+How to set up a JPL application, compile, and install it.
+
+=head2 2.2.1 Setting up a Project
+
+=over 4
+
+=item 1
+
+The I<install-jpl> script creates the I<setvars> script. Source the
+output of I<setvars> into your shell when you want to develop or run
+JPL applications.
+
+=item 2
+
+Create a directory with the name of your project, such as
+I<Frotz>. (if you want to use the generic F<Makefile.PL>, you need a
+separate directory for each JPL class you create).
+
+=item 3
+
+Copy the generic F<Makefile.PL> into the project directory. The
+I<jpl/Sample> directory in the Perl distribution includes the generic
+F<Makefile.PL>.
+
+=item 4
+
+Write a I<.jpl> program with the same name as the project (such as
+F<Frotz.jpl>)
+
+=back
+
+=head2 2.2.2 Compiling and Installing a Project
+
+Type C<make> to compile the application, and C<make install> to
+install it. This installs the application in the I<jpl> directory you
+created when you installed JPL.
+
+ B<Beware>. The default I<jpl> directory is the same as the
+ directory you install it I<from>. If you go with the default and
+ delete your Perl source, you'll delete your JPL installation!
+
+Type C<java Frotz> (or the name you chose in step 2 of section 2.2.1)
+to run it
+
+=head2 2.2.3 What's in the jpl Directory?
+
+=over 4
+
+=item *
+
+B<libPerlInterpreter.so>: a shared library that loads the Perl
+interpreter.
+
+=item *
+
+Compiled F<.class> files for JPL applications you have written.
+
+=item *
+
+Native code shared library wrappers for JPL applications you have
+written.
+
+=item *
+
+Perl scripts that contain the Perl code to load at runtime.
+
+=back
+
+ Beware. If you issue the C<make> command and then run the examples
+ in your development directory, you might be in for a surprise! If
+ the JPL directories come first in your CLASSPATH and
+ LD_LIBRARY_PATH, you'll keep running the installed, older version,
+ rather than the one you are developing
+
+=head2 Note:
+
+"Source" means to load it into your current shell, with something
+like:
+
+C<eval-backtick-setvars-backtick>
+
+as opposed to just executing it, because then only the subshell gets
+the environment vars.
+
+=head1 2.3 Calling Perl from Java
+
+Now, we'll look at how you can invoke Perl from Java.
+
+=head2 2.3.1 Perl Methods
+
+You can put Perl methods in your F<.jpl> file. Perl methods are
+declared C<perl> and use double curly braces to make life easier on
+the JPL preprocessor:
+
+ perl int perlMultiply(int a, int b) {{
+ my $result = $a * $b;
+ return $result;
+ }}
+
+In your Java code, you can invoke Perl methods like a Java method. The
+native code wrappers take care of running the Perl code:
+
+ public void invokePerlFunction() {
+ int x = 3;
+ int y = 6;
+ int retval = perlMultiply(x, y);
+ System.out.println(x + " * " + y + " = " + retval);
+ }
+
+class MethodDemo
+
+ class MethodDemo {
+ // A Perl method to multiply two numbers and
+ // return the result.
+ //
+ perl int perlMultiply(int a, int b) {{
+ my $result = $a * $b;
+ return $result;
+ }}
+
+ // A Java method to call the Perl function.
+ //
+ public void invokePerlFunction() {
+ int x = 3;
+ int y = 6;
+ int retval = perlMultiply(x, y);
+ System.out.println(x +" * "+ y +" = "+ retval);
+ }
+
+ public static void main(String[] args) {
+ MethodDemo demo = new MethodDemo();
+ demo.invokePerlFunction();
+ }
+ }
+
+=head2 Where did $self go?
+
+Don't worry, C<$self> is still there. JPL takes care of fetching it, as
+well as all the other arguments:
+
+ perl int perlMultiply(int a, int b) {{
+ my $result = $a * $b;
+ return $result;
+ }}
+
+ perl void calculateProduct() {{
+ my $x = 3;
+ my $y = 6;
+ my $retval = $self->perlMultiply($x, $y);
+ print "$x * $y = $retval\n";
+ }}
+
+ B<Note>. JPL takes care of putting all the arguments, including
+ C<$self>, into variables. If you see a variable in the function
+ header, you will get a variable of the same name without having to
+ use C<shift> or C<@_>, guaranteed.
+
+
+
+NOTE: I've added a line that prints the output of "ref dollar sign self"
+You'll see this when I run the demo.
+
+ class SelfDemo {
+
+ // A Perl method to multiply two values.
+ //
+ perl int perlMultiply(int a, int b) {{
+ my $result = $a * $b;
+ return $result;
+ }}
+
+ // A Perl method to invoke another Perl method.
+ //
+ perl void calculateProduct() {{
+ my $x = 3;
+ my $y = 6;
+ # Ahhh. There's our old friend, $self!
+ #
+ my $retval = $self->perlMultiply($x, $y);
+ # Display the results.
+ #
+ print "$x * $y = $retval\n";
+ }}
+
+ public static void main(String[] args) {
+ SelfDemo demo = new SelfDemo();
+ demo.calculateProduct();
+ }
+ }
+
+=head2 Passing Arrays
+
+If you pass an array from Java into a Perl method, it arrives in the
+form of a scalar reference.
+
+Use the GetIntArrayElements() JNI function to convert that scalar into
+an array of integers.
+
+ perl void min_max( int[] data ) {{
+
+ # Get the array elements
+ #
+ my @new_array = GetIntArrayElements( $data );
+
+ # Sort the array numerically
+ #
+ my @sorted = sort {$a <=> $b} @new_array;
+
+ print "Min: $sorted[0], ",
+ "Max: $sorted[$#sorted]\n";
+ }}
+
+ void minMaxDemo() {
+ int[] data = {101, 99, 42, 666, 23};
+ min_max( data );
+ }
+
+Some JNI Array Functions
+
+=over 4
+
+=item GetBooleanArrayElements( scalar)
+
+Converts scalar to an array of booleans.
+
+=item GetByteArrayElements( scalar )
+
+Converts scalar to an array of bytes.
+
+=item GetCharArrayElements( scalar )
+
+Converts scalar to an array of characters.
+
+=item GetShortArrayElements( scalar )
+
+Converts scalar to an array of short integers.
+
+=item GetIntArrayElements( scalar )
+
+Converts scalar to an array of integers.
+
+=item GetLongArrayElements( scalar )
+
+Converts scalar to an array of long integers.
+
+=item GetFloatArrayElements( scalar )
+
+Converts scalar to an array of floating point numbers.
+
+=item GetDoubleArrayElements( scalar )
+
+Converts scalar to an array of double precision numbers.
+
+=item GetArrayLength( scalar )
+
+Returns the length of the array.
+
+=back
+
+PerlTakesArray.jpl
+ // Show how to pass an array from Java to Perl.
+ //
+
+ public class PerlTakesArray {
+
+ perl void min_max( int[] data ) {{
+ # Get the array elements
+ #
+ my @new_array = GetIntArrayElements( $data );
+
+ # Sort the array numerically
+ #
+ my @sorted = sort {$a <=> $b} @new_array;
+ print "Min: $sorted[0], ",
+ "Max: $sorted[$#sorted]\n";
+ }}
+
+ void minMaxDemo() {
+ // Create an array and ask Perl to tell us
+ // the min and max values.
+ int[] data = {101, 99, 42, 666, 23};
+ min_max( data );
+ }
+
+ public static void main(String[] argv) {
+ PerlTakesArray demo = new PerlTakesArray();
+ demo.minMaxDemo();
+ }
+
+ }
+
+=head2 2.3.4 Passing Arrays of Objects
+
+Working with arrays of objects is a little more complicated, because you
+need to work with them one at a time.
+
+Fetch one element at a time with GetObjectArrayElement(), which returns
+an object of type java.lang.Object (the most generic type).
+
+Explicitly cast the Object to its real type with bless().
+
+ perl void sortArray( String[] names ) {{
+ my @new_array;
+ for (my $i = 0; $i < GetArrayLength($names); $i++) {
+ my $string = GetObjectArrayElement($names, $i);
+ bless $string, "java::lang::String";
+ push @new_array, $string;
+ }
+ print join(', ', sort @new_array), "\n";
+ }}
+
+ void arrayDemo() {
+ String[] names = {"Omega", "Gamma", "Beta", "Alpha"};
+ sortArray( names );
+ }
+
+Note. String is not a primitive type: it is a class (java.lang.String).
+So, you need to use this technique for Strings as well. You can't use
+the technique in 2.3.3.
+
+PerlTakesObjectArray.jpl
+
+ public class PerlTakesObjectArray {
+
+ // Perl method to sort an array of strings.
+ //
+ perl void sortArray( String[] names ) {{
+ my @new_array; # an array to copy names[] to
+
+ # Fetch each element from the array.
+ for (my $i = 0; $i < GetArrayLength($names); $i++) {
+
+ # Get the object (it's not a String yet!) at
+ # the current index ($i).
+ my $string = GetObjectArrayElement($names, $i);
+
+ # Cast (bless) it into a String.
+ bless $string, "java::lang::String";
+
+ # Add it to the array.
+ push @new_array, $string;
+ }
+
+ # Print the sorted, comma-delimited array.
+ print join(', ', sort @new_array), "\n";
+
+ }}
+
+ // Create a String array and ask Perl to sort it for us.
+ //
+
+ void arrayDemo() {
+ String[] names = {"Omega", "Gamma", "Beta", "Alpha"};
+ sortArray( names );
+ }
+
+ public static void main(String[] argv) {
+ PerlTakesObjectArray demo = new PerlTakesObjectArray();
+ demo.arrayDemo();
+ }
+ }
+
+=head2 2.3.5 Returning Arrays from Perl to Java
+
+To write a Perl method that returns an array, declare its return value
+as an array type. Make sure you return a reference to the array, not a
+list:
+
+ perl int[] getTime() {{
+ my ($sec, $min, $hour, @unused) = localtime(time);
+ # Return an array with seconds, minutes, hours
+ my @time_array = ($sec, $min, $hour);
+ return \@time_array;
+ }}
+
+ void testArray() {
+ int time[] = getTime();
+ System.out.println(time[2] + ":" + time[1]);
+ }
+
+PerlGivesArray.jpl
+
+ // Simple JPL demo to show how to send an array to Java
+ // from Perl
+
+ class PerlGivesArray {
+ // Call the Perl method to get an array and print
+ // the hour and minute elements.
+
+ void testArray() {
+ int time[] = getTime();
+ System.out.println(time[2] + ":" + time[1]);
+ }
+
+ // Perl method that returns an array reference.
+ //
+ perl int[] getTime() {{
+ # Get the first three arguments from localtime,
+ # discard the rest.
+ my ($sec, $min, $hour, @unused) = localtime(time);
+
+ # Return an array with seconds, minutes, hours
+ my @time_array = ($sec, $min, $hour);
+ return \@time_array;
+ }}
+
+ public static void main(String[] argv) {
+ PerlGivesArray demo = new PerlGivesArray();
+ demo.testArray();
+ }
+ }
+
+=head2 2.3.6 Arrays from Strings
+
+JPL will slice Perl strings up into Java arrays for you. If you declare
+a Perl method as an array type and return a string (instead of an array
+reference), JPL splits up the elements into an array.
+
+Consider this example, where a GIF stored in a string gets turned into
+an array of bytes so Java can make an Image out of it:
+
+ void generateImage() {
+ Toolkit kit = Toolkit.getDefaultToolkit();
+ byte[] image_data = mkImage();
+ img = kit.createImage( image_data );
+ }
+
+ perl byte[] mkImage() {{
+ use GD;
+ my $im = new GD::Image( $self->width, $self->height);
+ my $white = $im->colorAllocate(255, 255, 255);
+ my $blue = $im->colorAllocate(0, 0, 255);
+ $im->fill($white, 0, 0);
+ $im->string(gdLargeFont, 10, 10, "Hello, World", $blue);
+ return $im->gif;
+ }}
+
+GifDemo.jpl
+
+ import java.awt.*;
+ import java.awt.event.*;
+ import java.awt.image.*;
+
+ /*
+ * A JPL program that demonstrates passing byte arrays
+ * between Java and Perl
+ *
+ */
+
+ class GIFDemo extends Canvas {
+ Image img;
+ int width = 200;
+ int height = 30;
+
+ // Constructor for this class.
+ public GIFDemo() {
+ this.setSize(width, height);
+ }
+
+ // Java method to create an image.
+ //
+ void generateImage() {
+ Toolkit kit = Toolkit.getDefaultToolkit();
+
+ // Invoke the mkImage() Perl method to generate an
+ // image.
+
+ byte[] image_data = mkImage();
+
+ // Create the image with the byte array we got
+ // from the Perl method.
+
+ img = kit.createImage( image_data );
+ }
+
+ // A Perl method to generate an image.
+
+ perl byte[] mkImage() {{
+
+ # Use the GD image manipulation extension.
+
+ use GD;
+
+ # Create a new image with the height and width specified
+ # in the enclosing Java class.
+
+ my $im = new GD::Image( $self->width, $self->height);
+
+ # Allocate two colors.
+
+ my $white = $im->colorAllocate(255, 255, 255);
+ my $blue = $im->colorAllocate(0, 0, 255);
+
+ # Fill the image with white and draw a greeting.
+
+ $im->fill($white, 0, 0);
+ $im->string(gdLargeFont, 10, 10,
+ "Hello, World", $blue);
+ return $im->gif;
+ }}
+
+ // Java uses this to repaint the image when necessary.
+
+ public void paint(Graphics g) {
+ g.drawImage(img, 0, 0, this);
+ }
+
+ // The entry point.
+
+ public static void main(String[] argv) {
+
+ // Set up a frame and create an image.
+
+ Frame f = new Frame("GD Example");
+ f.setLayout(new BorderLayout());
+
+ GIFDemo demo = new GIFDemo();
+ demo.generateImage();
+
+ f.add("Center", demo);
+ f.addWindowListener( new Handler() );
+
+ f.pack();
+ f.show();
+
+ }
+ }
+
+ // A handler to process a request to close a window.
+
+ class Handler extends WindowAdapter {
+ public void windowClosing(WindowEvent e) {
+ System.exit(0);
+ }
+ }
+
+=head2 2.3.7 Summary: Calling Perl from Java
+
+=over 4
+
+=item 1
+
+Put your embedded Perl code in methods that are declared C<perl>.
+
+=item 2
+
+Use double, rather than single, curly braces ({{ and }}).
+
+=item 3
+
+Invoke the Perl methods from Java just like any other Java method.
+
+=item 4
+
+No need to pull arguments off of C<@_> with C<shift>: JPL takes care of
+this for you. This includes C<$self>.
+
+=item 5
+
+If you pass a Java array into a Perl method, it comes in as a scalar
+reference.
+
+=item 6
+
+Convert references to arrays of primitives with C<Get*ArrayElements>
+
+=item 7
+
+Use C<GetObjectArrayElement> to get elements from arrays of strings and
+other objects.
+
+=item 8
+
+To return an array from a C<perl> method, declare the method as returning
+an array type, and either:
+
+=item 9
+
+Return an array reference.
+
+=item 10
+
+Return a string: JPL slices it up for you.
+
+=back
+
+=head1 2.4 Calling Java from Perl
+
+Next, let's look at how to invoke Java from Perl.
+
+=head2 2.4.1 Java in Perl in Java
+
+Remember the issues from 2.1.2 - this is unstable unless you are calling Java from Perl methods that are themselves embedded in a Java program.
+
+=head2 2.4.2 Java in Perl: Simple Constructors
+
+Use JPL::Class to load the class:
+
+C<use JPL::Class "java::awt::Frame";>
+
+Invoke the constructor to create an instance of the class:
+
+C<my $f = java::awt::Frame->new;>
+
+You've got a reference to a Java object in $f, a Perl scalar. I think
+this is cool.
+
+=head2 2.4.3 Constructors that Take Parameters
+
+If the constructor has parameters, look up the method signature with
+C<getmeth>:
+
+my $new = getmeth("new", ['java.lang.String'], []);
+
+The first argument to C<getmeth> is the name of the method. The second
+argument is a reference to an array that contains a list of the argument
+types. The final argument to C<getmeth> is a reference to an array
+containing a single element with the return type. Constructors always
+have a null (void) return type, even though they return an instance of
+an object.
+
+Invoke the method through the variable you created:
+
+my $f = java::awt::Frame->$new( "Frame Demo" );
+
+Because Java supports method overloading, the only way Java can
+distinguish between different methods that have the same name is through
+the method signature. The C<getmeth> function simply returns a mangled,
+Perl-friendly version of the signature. JPL's AutoLoader takes care of
+finding the right class.
+
+For example, the method signature for $new is C<(Ljava/lang/String;)V>.
+In Perl, this is translated to C<new__Ljava_lang_String_2__V>. Sure, it
+means something to Java, but thanks to C<getmeth> and JPL's AutoLoader,
+we don't have to worry about it!
+
+=head2 2.4.4 More on getmeth
+
+The C<getmeth> function is not just for constructors. You'll use it to look
+up method signatures for any method that takes arguments.
+
+To use C<getmeth>, just supply the Java names of the types and objects in
+the argument or return value list. Here are a few examples:
+
+=over 4
+
+=item *
+
+Two int arguments, void return type:
+
+ $setSize = getmeth("setSize", ['int', 'int'], []);
+
+=item *
+
+One argument (java.awt.Component), with a return type of the same:
+
+ $add = getmeth("add", ['java.awt.Component'],
+
+ ['java.awt.Component']);
+
+=item *
+
+Two arguments, a String object and a boolean value, and a void return
+type:
+
+ $new = getmeth("new",
+
+ ['java.lang.String', 'boolean'], []);
+
+=item *
+
+A String argument with a java.lang.Class return type:
+
+ $forName = getmeth("forName",
+
+ ['java.lang.String'],
+
+ ['java.lang.Class']);
+
+=item *
+
+No arguments, but a boolean return value:
+
+ $next = getmeth("next", [], ['boolean']);
+
+=back
+
+=head2 2.4.5 Instance Variables
+
+Java instance variables that belong to a class can be reached through
+$self and a method with the same name as the instance variables:
+
+ $frame->$setSize( $self->width, $self->height );
+
+Here is an example:
+
+ class VarDemo {
+
+ int foo = 100;
+
+ perl int perlChange() {{
+ my $current_value = $self->foo;
+
+ # Change foo to ten times itself.
+
+ $self->foo( $current_value * 10 );
+
+ }}
+
+ void executeChange() {
+
+ perlChange();
+ System.out.println(foo);
+
+ }
+
+ public static void main(String[] args) {
+
+ VarDemo demo = new VarDemo();
+ demo.executeChange();
+
+ }
+
+ }
+
+Note. JPL creates these methods with the same name as the variable. You
+can also supply a value to set the variable's value. If you create a
+method with this name, it will collide with the one that JPL defines.
+
+FrameDemo.jpl
+
+ /*
+ * FrameDemo - create and show a Frame in Perl.
+ *
+ */
+
+ public class FrameDemo {
+
+ int height = 50;
+ int width = 200;
+ perl void make_frame () {{
+
+ # Import two Java classes.
+
+ use JPL::Class "java::awt::Frame";
+ use JPL::Class "java::awt::Button";
+
+ # Create a Frame and a Button. The two calls to new()
+ # have the same signature.
+
+ my $new = getmeth("new", ['java.lang.String'], []);
+ my $frame = java::awt::Frame->$new( "Frame Demo" );
+ my $btn = java::awt::Button->$new( "Do Not Press Me" );
+
+ # Add the button to the frame.
+
+ my $add = getmeth("add", ['java.awt.Component'],
+ ['java.awt.Component']);
+ $frame->$add( $btn );
+
+ # Set the size of the frame and show it.
+
+ my $setSize = getmeth("setSize", ['int', 'int'], []);
+ $frame->$setSize($self->width, $self->height);
+ $frame->show;
+
+ }}
+
+ public static void main(String[] argv) {
+
+ FrameDemo demo = new FrameDemo();
+ demo.make_frame();
+
+ }
+
+ }
+
+=head2 2.4.6 Summary: Calling Java from Perl
+
+=over 4
+
+=item 1
+
+Use JPL::Class to specify a Java class to import.
+
+=item 2
+
+You can directly invoke constructors and methods that take no arguments.
+
+=item 3
+
+If the constructor or method takes arguments, use getmeth to look up its
+signature.
+
+=item 4
+
+Use $self to access Java instance variables and methods.
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright (c) 1999, Brian Jepson
+
+You may distribute this file under the same terms as Perl itself.
+
+Converted from FrameMaker by Kevin Falcone.
+
+=cut
diff --git a/gnu/usr.bin/perl/lib/CGI/Cookie.pm b/gnu/usr.bin/perl/lib/CGI/Cookie.pm
index bd3c3d8875b..de91be2780f 100644
--- a/gnu/usr.bin/perl/lib/CGI/Cookie.pm
+++ b/gnu/usr.bin/perl/lib/CGI/Cookie.pm
@@ -13,9 +13,9 @@ package CGI::Cookie;
# wish, but if you redistribute a modified version, please attach a note
# listing the modifications you have made.
-$CGI::Cookie::VERSION='1.12';
+$CGI::Cookie::VERSION='1.18';
-use CGI qw(-no_debug);
+use CGI::Util qw(rearrange unescape escape);
use overload '""' => \&as_string,
'cmp' => \&compare,
'fallback'=>1;
@@ -40,73 +40,84 @@ sub raw_fetch {
my %results;
my($key,$value);
- my(@pairs) = split("; ",$raw_cookie);
+ my(@pairs) = split("; ?",$raw_cookie);
foreach (@pairs) {
- if (/^([^=]+)=(.*)/) {
- $key = $1;
- $value = $2;
- }
- else {
- $key = $_;
- $value = '';
- }
- $results{$key} = $value;
+ s/\s*(.*?)\s*/$1/;
+ if (/^([^=]+)=(.*)/) {
+ $key = $1;
+ $value = $2;
+ }
+ else {
+ $key = $_;
+ $value = '';
+ }
+ $results{$key} = $value;
}
return \%results unless wantarray;
return %results;
}
-sub parse {
- my ($self,$raw_cookie) = @_;
- my %results;
- my(@pairs) = split("; ",$raw_cookie);
- foreach (@pairs) {
- my($key,$value) = split("=");
- my(@values) = map CGI::unescape($_),split('&',$value);
- $key = CGI::unescape($key);
- # A bug in Netscape can cause several cookies with same name to
- # appear. The FIRST one in HTTP_COOKIE is the most recent version.
- $results{$key} ||= $self->new(-name=>$key,-value=>\@values);
+sub parse {
+ my ($self,$raw_cookie) = @_;
+ my %results;
+
+ my(@pairs) = split("; ?",$raw_cookie);
+ foreach (@pairs) {
+ s/\s*(.*?)\s*/$1/;
+ my($key,$value) = split("=");
+
+ # Some foreign cookies are not in name=value format, so ignore
+ # them.
+ next if !defined($value);
+ my @values = ();
+ if ($value ne '') {
+ @values = map CGI::unescape($_),split(/[&;]/,$value.'&dmy');
+ pop @values;
}
- return \%results unless wantarray;
- return %results;
+ $key = unescape($key);
+ # A bug in Netscape can cause several cookies with same name to
+ # appear. The FIRST one in HTTP_COOKIE is the most recent version.
+ $results{$key} ||= $self->new(-name=>$key,-value=>\@values);
+ }
+ return \%results unless wantarray;
+ return %results;
}
sub new {
- my $class = shift;
- $class = ref($class) if ref($class);
- my($name,$value,$path,$domain,$secure,$expires) =
- CGI->rearrange([NAME,[VALUE,VALUES],PATH,DOMAIN,SECURE,EXPIRES],@_);
-
- # Pull out our parameters.
- my @values;
- if (ref($value)) {
- if (ref($value) eq 'ARRAY') {
- @values = @$value;
- } elsif (ref($value) eq 'HASH') {
- @values = %$value;
- }
- } else {
- @values = ($value);
+ my $class = shift;
+ $class = ref($class) if ref($class);
+ my($name,$value,$path,$domain,$secure,$expires) =
+ rearrange([NAME,[VALUE,VALUES],PATH,DOMAIN,SECURE,EXPIRES],@_);
+
+ # Pull out our parameters.
+ my @values;
+ if (ref($value)) {
+ if (ref($value) eq 'ARRAY') {
+ @values = @$value;
+ } elsif (ref($value) eq 'HASH') {
+ @values = %$value;
}
-
- bless my $self = {
- 'name'=>$name,
- 'value'=>[@values],
- },$class;
-
- # 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->domain($domain) if defined $domain;
- $self->secure($secure) if defined $secure;
- $self->expires($expires) if defined $expires;
- return $self;
+ } else {
+ @values = ($value);
+ }
+
+ bless my $self = {
+ 'name'=>$name,
+ 'value'=>[@values],
+ },$class;
+
+ # IE requires the path and domain to be present for some reason.
+ $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->domain($domain) if defined $domain;
+ $self->secure($secure) if defined $secure;
+ $self->expires($expires) if defined $expires;
+ return $self;
}
sub as_string {
@@ -118,10 +129,10 @@ sub as_string {
push(@constant_values,"domain=$domain") if $domain = $self->domain;
push(@constant_values,"path=$path") if $path = $self->path;
push(@constant_values,"expires=$expires") if $expires = $self->expires;
- push(@constant_values,'secure') if $secure = $self->secure;
+ push(@constant_values,"secure") if $secure = $self->secure;
- my($key) = CGI::escape($self->name);
- my($cookie) = join("=",$key,join("&",map CGI::escape($_),$self->value));
+ my($key) = escape($self->name);
+ my($cookie) = join("=",$key,join("&",map escape($_),$self->value));
return join("; ",$cookie,@constant_values);
}
@@ -163,7 +174,7 @@ sub secure {
sub expires {
my $self = shift;
my $expires = shift;
- $self->{'expires'} = CGI::expires($expires,'cookie') if defined $expires;
+ $self->{'expires'} = CGI::Util::expires($expires,'cookie') if defined $expires;
return $self->{'expires'};
}
@@ -252,8 +263,8 @@ 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, the path is set to your
-script, so that only it will receive the cookie.
+"/cgi-private/site_admin.pl". By default, the path is set to "/", so
+that all scripts at your site will receive the cookie.
=item B<4. secure flag>
@@ -379,7 +390,7 @@ Get or set the cookie's value. Example:
$value = $c->value;
@new_value = $c->value(['a','b','c','d']);
-B<value()> is context sensitive. In an array context it will return
+B<value()> is context sensitive. In a list context it will return
the current value of the cookie as an array. In a scalar context it
will return the B<first> value of a multivalued cookie.
diff --git a/gnu/usr.bin/perl/lib/CGI/Pretty.pm b/gnu/usr.bin/perl/lib/CGI/Pretty.pm
index 4f2eed4ce9c..a26ab81d26e 100644
--- a/gnu/usr.bin/perl/lib/CGI/Pretty.pm
+++ b/gnu/usr.bin/perl/lib/CGI/Pretty.pm
@@ -10,7 +10,7 @@ package CGI::Pretty;
use strict;
use CGI ();
-$CGI::Pretty::VERSION = '1.03';
+$CGI::Pretty::VERSION = '1.05';
$CGI::DefaultClass = __PACKAGE__;
$CGI::Pretty::AutoloadClass = 'CGI';
@CGI::Pretty::ISA = qw( CGI );
@@ -30,14 +30,14 @@ sub _prettyPrint {
return;
}
}
- $$input =~ s/$CGI::Pretty::LINEBREAK/$CGI::Pretty::LINEBREAK$CGI::Pretty::INDENT/g;
+ $$input =~ s/$CGI::Pretty::LINEBREAK/$CGI::Pretty::LINEBREAK$CGI::Pretty::INDENT/g if $CGI::Pretty::LINEBREAK;
}
sub comment {
my($self,@p) = CGI::self_or_CGI(@_);
my $s = "@p";
- $s =~ s/$CGI::Pretty::LINEBREAK/$CGI::Pretty::LINEBREAK$CGI::Pretty::INDENT/g;
+ $s =~ s/$CGI::Pretty::LINEBREAK/$CGI::Pretty::LINEBREAK$CGI::Pretty::INDENT/g if $CGI::Pretty::LINEBREAK;
return $self->SUPER::comment( "$CGI::Pretty::LINEBREAK$CGI::Pretty::INDENT$s$CGI::Pretty::LINEBREAK" ) . $CGI::Pretty::LINEBREAK;
}
@@ -62,19 +62,18 @@ sub _make_tag_func {
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')));
+ shift if \$_[0] &&
+ (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);
+ my(\@attr) = make_attributes(shift);
\$attr = " \@attr" if \@attr;
}
- my(\$tag,\$untag) = ("\U<$tagname\E\$attr>","\U</$tagname>\E");
+ my(\$tag,\$untag) = ("\L<$tagname\E\$attr>","\L</$tagname>\E");
return \$tag unless \@_;
my \@result;
@@ -88,7 +87,7 @@ sub _make_tag_func {
\@result = map {
chomp;
if ( \$_ !~ /<\\// ) {
- s/\$CGI::Pretty::LINEBREAK/\$CGI::Pretty::LINEBREAK\$CGI::Pretty::INDENT/g;
+ s/\$CGI::Pretty::LINEBREAK/\$CGI::Pretty::LINEBREAK\$CGI::Pretty::INDENT/g if \$CGI::Pretty::LINEBREAK;
}
else {
my \$tmp = \$_;
@@ -130,7 +129,7 @@ sub initialize_globals {
$CGI::Pretty::LINEBREAK = "\n";
# These tags are not prettify'd.
- @CGI::Pretty::AS_IS = qw( A PRE CODE SCRIPT TEXTAREA );
+ @CGI::Pretty::AS_IS = qw( a pre code script textarea );
1;
}
diff --git a/gnu/usr.bin/perl/lib/CGI/Util.pm b/gnu/usr.bin/perl/lib/CGI/Util.pm
new file mode 100644
index 00000000000..aba0ba58348
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/CGI/Util.pm
@@ -0,0 +1,258 @@
+package CGI::Util;
+
+use strict;
+use vars '$VERSION','@EXPORT_OK','@ISA','$EBCDIC','@A2E','@E2A';
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(rearrange make_attributes unescape escape expires);
+
+$VERSION = '1.1';
+
+$EBCDIC = "\t" ne "\011";
+if ($EBCDIC) {
+# (ord('^') == 95) for codepage 1047 as on os390, vmesa
+@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
+ );
+@E2A = (
+ 0, 1, 2, 3,156, 9,134,127,151,141,142, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19,157, 10, 8,135, 24, 25,146,143, 28, 29, 30, 31,
+128,129,130,131,132,133, 23, 27,136,137,138,139,140, 5, 6, 7,
+144,145, 22,147,148,149,150, 4,152,153,154,155, 20, 21,158, 26,
+ 32,160,226,228,224,225,227,229,231,241,162, 46, 60, 40, 43,124,
+ 38,233,234,235,232,237,238,239,236,223, 33, 36, 42, 41, 59, 94,
+ 45, 47,194,196,192,193,195,197,199,209,166, 44, 37, 95, 62, 63,
+248,201,202,203,200,205,206,207,204, 96, 58, 35, 64, 39, 61, 34,
+216, 97, 98, 99,100,101,102,103,104,105,171,187,240,253,254,177,
+176,106,107,108,109,110,111,112,113,114,170,186,230,184,198,164,
+181,126,115,116,117,118,119,120,121,122,161,191,208, 91,222,174,
+172,163,165,183,169,167,182,188,189,190,221,168,175, 93,180,215,
+123, 65, 66, 67, 68, 69, 70, 71, 72, 73,173,244,246,242,243,245,
+125, 74, 75, 76, 77, 78, 79, 80, 81, 82,185,251,252,249,250,255,
+ 92,247, 83, 84, 85, 86, 87, 88, 89, 90,178,212,214,210,211,213,
+ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,179,219,220,217,218,159
+ );
+if (ord('^') == 106) { # as in the BS2000 posix-bc coded character set
+ $A2E[91] = 187; $A2E[92] = 188; $A2E[94] = 106; $A2E[96] = 74;
+ $A2E[123] = 251; $A2E[125] = 253; $A2E[126] = 255; $A2E[159] = 95;
+ $A2E[162] = 176; $A2E[166] = 208; $A2E[168] = 121; $A2E[172] = 186;
+ $A2E[175] = 161; $A2E[217] = 224; $A2E[219] = 221; $A2E[221] = 173;
+ $A2E[249] = 192;
+
+ $E2A[74] = 96; $E2A[95] = 159; $E2A[106] = 94; $E2A[121] = 168;
+ $E2A[161] = 175; $E2A[173] = 221; $E2A[176] = 162; $E2A[186] = 172;
+ $E2A[187] = 91; $E2A[188] = 92; $E2A[192] = 249; $E2A[208] = 166;
+ $E2A[221] = 219; $E2A[224] = 217; $E2A[251] = 123; $E2A[253] = 125;
+ $E2A[255] = 126;
+}
+elsif (ord('^') == 176) { # as in codepage 037 on os400
+ $A2E[10] = 37; $A2E[91] = 186; $A2E[93] = 187; $A2E[94] = 176;
+ $A2E[133] = 21; $A2E[168] = 189; $A2E[172] = 95; $A2E[221] = 173;
+
+ $E2A[21] = 133; $E2A[37] = 10; $E2A[95] = 172; $E2A[173] = 221;
+ $E2A[176] = 94; $E2A[186] = 91; $E2A[187] = 93; $E2A[189] = 168;
+}
+}
+
+# Smart rearrangement of parameters to allow named parameter
+# calling. We do the rearangement if:
+# the first parameter begins with a -
+sub rearrange {
+ my($order,@param) = @_;
+ return () unless @param;
+
+ if (ref($param[0]) eq 'HASH') {
+ @param = %{$param[0]};
+ } else {
+ return @param
+ unless (defined($param[0]) && substr($param[0],0,1) eq '-');
+ }
+
+ # map parameters into positional indices
+ my ($i,%pos);
+ $i = 0;
+ foreach (@$order) {
+ foreach (ref($_) eq 'ARRAY' ? @$_ : $_) { $pos{lc($_)} = $i; }
+ $i++;
+ }
+
+ my (@result,%leftover);
+ $#result = $#$order; # preextend
+ while (@param) {
+ my $key = lc(shift(@param));
+ $key =~ s/^\-//;
+ if (exists $pos{$key}) {
+ $result[$pos{$key}] = shift(@param);
+ } else {
+ $leftover{$key} = shift(@param);
+ }
+ }
+
+ push (@result,make_attributes(\%leftover,1)) if %leftover;
+ @result;
+}
+
+sub make_attributes {
+ my $attr = shift;
+ return () unless $attr && ref($attr) && ref($attr) eq 'HASH';
+ my $escape = shift || 0;
+ my(@att);
+ foreach (keys %{$attr}) {
+ my($key) = $_;
+ $key=~s/^\-//; # get rid of initial - if present
+ $key=~tr/A-Z_/a-z-/; # parameters are lower case, use dashes
+ my $value = $escape ? simple_escape($attr->{$_}) : $attr->{$_};
+ push(@att,defined($attr->{$_}) ? qq/$key="$value"/ : qq/$key/);
+ }
+ return @att;
+}
+
+sub simple_escape {
+ return unless defined(my $toencode = shift);
+ $toencode =~ s{&}{&amp;}gso;
+ $toencode =~ s{<}{&lt;}gso;
+ $toencode =~ s{>}{&gt;}gso;
+ $toencode =~ s{\"}{&quot;}gso;
+# Doesn't work. Can't work. forget it.
+# $toencode =~ s{\x8b}{&#139;}gso;
+# $toencode =~ s{\x9b}{&#155;}gso;
+ $toencode;
+}
+
+# unescape URL-encoded data
+sub unescape {
+ shift() if ref($_[0]) || (defined $_[1] && $_[0] eq $CGI::DefaultClass);
+ my $todecode = shift;
+ return undef unless defined($todecode);
+ $todecode =~ tr/+/ /; # pluses become spaces
+ $EBCDIC = "\t" ne "\011";
+ if ($EBCDIC) {
+ $todecode =~ s/%([0-9a-fA-F]{2})/chr $A2E[hex($1)]/ge;
+ } else {
+ $todecode =~ s/%([0-9a-fA-F]{2})/chr hex($1)/ge;
+ }
+ return $todecode;
+}
+
+# URL-encode data
+sub escape {
+ shift() if ref($_[0]) || (defined $_[1] && $_[0] eq $CGI::DefaultClass);
+ my $toencode = shift;
+ return undef unless defined($toencode);
+ if ($EBCDIC) {
+ $toencode=~s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x",$E2A[ord($1)])/eg;
+ } else {
+ $toencode=~s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x",ord($1))/eg;
+ }
+ return $toencode;
+}
+
+# This internal routine creates date strings suitable for use in
+# cookies and HTTP headers. (They differ, unfortunately.)
+# Thanks to Mark Fisher for this.
+sub expires {
+ my($time,$format) = @_;
+ $format ||= 'http';
+
+ my(@MON)=qw/Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec/;
+ my(@WDAY) = qw/Sun Mon Tue Wed Thu Fri Sat/;
+
+ # pass through preformatted dates for the sake of expire_calc()
+ $time = expire_calc($time);
+ return $time unless $time =~ /^\d+$/;
+
+ # make HTTP/cookie date string from GMT'ed time
+ # (cookies use '-' as date separator, HTTP uses ' ')
+ my($sc) = ' ';
+ $sc = '-' if $format eq "cookie";
+ my($sec,$min,$hour,$mday,$mon,$year,$wday) = gmtime($time);
+ $year += 1900;
+ return sprintf("%s, %02d$sc%s$sc%04d %02d:%02d:%02d GMT",
+ $WDAY[$wday],$mday,$MON[$mon],$year,$hour,$min,$sec);
+}
+
+# This internal routine creates an expires time exactly some number of
+# hours from the current time. It incorporates modifications from
+# Mark Fisher.
+sub expire_calc {
+ my($time) = @_;
+ my(%mult) = ('s'=>1,
+ 'm'=>60,
+ 'h'=>60*60,
+ 'd'=>60*60*24,
+ 'M'=>60*60*24*30,
+ 'y'=>60*60*24*365);
+ # format for time can be in any of the forms...
+ # "now" -- expire immediately
+ # "+180s" -- in 180 seconds
+ # "+2m" -- in 2 minutes
+ # "+12h" -- in 12 hours
+ # "+1d" -- in 1 day
+ # "+3M" -- in 3 months
+ # "+2y" -- in 2 years
+ # "-3m" -- 3 minutes ago(!)
+ # If you don't supply one of these forms, we assume you are
+ # specifying the date yourself
+ 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 {
+ return $time;
+ }
+ return (time+$offset);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+CGI::Util - Internal utilities used by CGI module
+
+=head1 SYNOPSIS
+
+none
+
+=head1 DESCRIPTION
+
+no public subroutines
+
+=head1 AUTHOR INFORMATION
+
+Copyright 1995-1998, Lincoln D. Stein. All rights reserved.
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+Address bug reports and comments to: lstein@cshl.org. When sending
+bug reports, please provide the version of CGI.pm, the version of
+Perl, the name and version of your Web server, and the name and
+version of the operating system you are using. If the problem is even
+remotely browser dependent, please provide information about the
+affected browers as well.
+
+=head1 SEE ALSO
+
+L<CGI>
+
+=cut
diff --git a/gnu/usr.bin/perl/lib/Carp/Heavy.pm b/gnu/usr.bin/perl/lib/Carp/Heavy.pm
index 5e3de49418b..4d12bd79106 100644
--- a/gnu/usr.bin/perl/lib/Carp/Heavy.pm
+++ b/gnu/usr.bin/perl/lib/Carp/Heavy.pm
@@ -42,7 +42,7 @@ sub longmess_heavy {
#
# 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
+ # 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
@@ -121,10 +121,7 @@ sub longmess_heavy {
# $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;
+ $mess || $error;
}
@@ -227,17 +224,14 @@ CALLER:
}
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.
+ # relevant error message and return it.
my $msg;
$msg = "$error at $file line $line";
if (defined &Thread::tid) {
my $tid = Thread->self->tid;
- $mess .= " thread $tid" if $tid;
+ $msg .= " thread $tid" if $tid;
}
$msg .= "\n";
- $msg =~ tr/\0//d;
return $msg;
}
}
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/MM_Cygwin.pm b/gnu/usr.bin/perl/lib/ExtUtils/MM_Cygwin.pm
index a5ba410fdc0..439c67ccadc 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/MM_Cygwin.pm
+++ b/gnu/usr.bin/perl/lib/ExtUtils/MM_Cygwin.pm
@@ -71,6 +71,8 @@ q[-e 'next if -e $$m{$$_} && -M $$m{$$_} < -M $$_ && -M $$m{$$_} < -M "],
push(@m,"\n");
if (%{$self->{MAN1PODS}} || %{$self->{MAN3PODS}}) {
+ grep { $self->{MAN1PODS}{$_} =~ s/::/./g } keys %{$self->{MAN1PODS}};
+ grep { $self->{MAN3PODS}{$_} =~ s/::/./g } keys %{$self->{MAN3PODS}};
push @m, "\t$self->{NOECHO}\$(POD2MAN) \\\n\t";
push @m, join " \\\n\t", %{$self->{MAN1PODS}}, %{$self->{MAN3PODS}};
}
diff --git a/gnu/usr.bin/perl/lib/File/Spec.pm b/gnu/usr.bin/perl/lib/File/Spec.pm
index 40f5345140c..3f79d74b66a 100644
--- a/gnu/usr.bin/perl/lib/File/Spec.pm
+++ b/gnu/usr.bin/perl/lib/File/Spec.pm
@@ -3,12 +3,13 @@ package File::Spec;
use strict;
use vars qw(@ISA $VERSION);
-$VERSION = '0.8';
+$VERSION = 0.82 ;
my %module = (MacOS => 'Mac',
MSWin32 => 'Win32',
os2 => 'OS2',
- VMS => 'VMS');
+ VMS => 'VMS',
+ epoc => 'Epoc');
my $module = $module{$^O} || 'Unix';
require "File/Spec/$module.pm";
diff --git a/gnu/usr.bin/perl/lib/File/Spec/Epoc.pm b/gnu/usr.bin/perl/lib/File/Spec/Epoc.pm
new file mode 100644
index 00000000000..65d5e1fcb5e
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/File/Spec/Epoc.pm
@@ -0,0 +1,378 @@
+package File::Spec::Epoc;
+
+use strict;
+use Cwd;
+use vars qw(@ISA);
+require File::Spec::Unix;
+@ISA = qw(File::Spec::Unix);
+
+=head1 NAME
+
+File::Spec::Epoc - methods for Epoc file specs
+
+=head1 SYNOPSIS
+
+ require File::Spec::Epoc; # 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.
+
+This package is still work in progress ;-)
+o.flebbe@gmx.de
+
+
+=over
+
+=item devnull
+
+Returns a string representation of the null device.
+
+=cut
+
+sub devnull {
+ return "nul:";
+}
+
+=item tmpdir
+
+Returns a string representation of a temporay directory:
+
+=cut
+
+my $tmpdir;
+sub tmpdir {
+ return "C:/System/temp";
+}
+
+sub case_tolerant {
+ return 1;
+}
+
+sub file_name_is_absolute {
+ my ($self,$file) = @_;
+ return scalar($file =~ m{^([a-z?]:)?[\\/]}is);
+}
+
+=item path
+
+Takes no argument, returns the environment variable PATH as an array. Since
+there is no search path supported, it returns undef, sorry.
+
+=cut
+sub path {
+ return undef;
+}
+
+=item canonpath
+
+No physical check on the filesystem, but a logical cleanup of a
+path. On UNIX eliminated successive slashes and successive "/.".
+
+=cut
+
+sub canonpath {
+ my ($self,$path) = @_;
+ $path =~ s/^([a-z]:)/\u$1/s;
+
+ $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 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 /.
+
+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
+
+=head1 SEE ALSO
+
+L<File::Spec>
+
+=cut
+
+1;
diff --git a/gnu/usr.bin/perl/lib/File/Spec/Functions.pm b/gnu/usr.bin/perl/lib/File/Spec/Functions.pm
index 140738f4439..0036ac1ded0 100644
--- a/gnu/usr.bin/perl/lib/File/Spec/Functions.pm
+++ b/gnu/usr.bin/perl/lib/File/Spec/Functions.pm
@@ -3,7 +3,9 @@ package File::Spec::Functions;
use File::Spec;
use strict;
-use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
+use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $VERSION);
+
+$VERSION = '1.1';
require Exporter;
diff --git a/gnu/usr.bin/perl/lib/File/Spec/Mac.pm b/gnu/usr.bin/perl/lib/File/Spec/Mac.pm
index 959e33d0cf3..9ef55ec84ad 100644
--- a/gnu/usr.bin/perl/lib/File/Spec/Mac.pm
+++ b/gnu/usr.bin/perl/lib/File/Spec/Mac.pm
@@ -1,8 +1,11 @@
package File::Spec::Mac;
use strict;
-use vars qw(@ISA);
+use vars qw(@ISA $VERSION);
require File::Spec::Unix;
+
+$VERSION = '1.2';
+
@ISA = qw(File::Spec::Unix);
=head1 NAME
@@ -79,9 +82,9 @@ sub catdir {
shift;
my @args = @_;
my $result = shift @args;
- $result =~ s/:\z//;
+ $result =~ s/:\Z(?!\n)//;
foreach (@args) {
- s/:\z//;
+ s/:\Z(?!\n)//;
s/^://s;
$result .= ":$_";
}
@@ -150,7 +153,7 @@ sub rootdir {
require Mac::Files;
my $system = Mac::Files::FindFolder(&Mac::Files::kOnSystemDisk,
&Mac::Files::kSystemFolderType);
- $system =~ s/:.*\z/:/s;
+ $system =~ s/:.*\Z(?!\n)/:/s;
return $system;
}
@@ -189,12 +192,16 @@ folder named "HD" in the current working directory on a drive named "HD"),
relative wins. Use ":" in the appropriate place in the path if you want to
distinguish unambiguously.
+As a special case, the file name '' is always considered to be absolute.
+
=cut
sub file_name_is_absolute {
my ($self,$file) = @_;
if ($file =~ /:/) {
return ($file !~ m/^:/s);
+ } elsif ( $file eq '' ) {
+ return 1 ;
} else {
return (! -e ":$file");
}
@@ -228,7 +235,7 @@ sub splitpath {
my ($volume,$directory,$file) = ('','','');
if ( $nofile ) {
- ( $volume, $directory ) = $path =~ m@((?:[^:]+(?::|\z))?)(.*)@s;
+ ( $volume, $directory ) = $path =~ m@((?:[^:]+(?::|\Z(?!\n)))?)(.*)@s;
}
else {
$path =~
@@ -242,8 +249,8 @@ sub splitpath {
}
# Make sure non-empty volumes and directories end in ':'
- $volume .= ':' if $volume =~ m@[^:]\z@ ;
- $directory .= ':' if $directory =~ m@[^:]\z@ ;
+ $volume .= ':' if $volume =~ m@[^:]\Z(?!\n)@ ;
+ $directory .= ':' if $directory =~ m@[^:]\Z(?!\n)@ ;
return ($volume,$directory,$file);
}
@@ -259,7 +266,7 @@ sub splitdir {
# check to be sure that there will not be any before handling the
# simple case.
#
- if ( $directories !~ m@:\z@ ) {
+ if ( $directories !~ m@:\Z(?!\n)@ ) {
return split( m@:@, $directories );
}
else {
@@ -286,11 +293,11 @@ sub catpath {
my $segment ;
for $segment ( @_ ) {
- if ( $result =~ m@[^/]\z@ && $segment =~ m@^[^/]@s ) {
+ if ( $result =~ m@[^/]\Z(?!\n)@ && $segment =~ m@^[^/]@s ) {
$result .= "/$segment" ;
}
- elsif ( $result =~ m@/\z@ && $segment =~ m@^/@s ) {
- $result =~ s@/+\z@/@;
+ elsif ( $result =~ m@/\Z(?!\n)@ && $segment =~ m@^/@s ) {
+ $result =~ s@/+\Z(?!\n)@/@;
$segment =~ s@^/+@@s;
$result .= "$segment" ;
}
@@ -304,6 +311,12 @@ sub catpath {
=item abs2rel
+See L<File::Spec::Unix/abs2rel> for general documentation.
+
+Unlike C<File::Spec::Unix->abs2rel()>, this function will make
+checks against the local filesystem if necessary. See
+L</file_name_is_absolute> for details.
+
=cut
sub abs2rel {
@@ -341,31 +354,15 @@ sub abs2rel {
=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.
+See L<File::Spec::Unix/rel2abs> for general documentation.
-No checks against the filesystem are made.
+Unlike C<File::Spec::Unix->rel2abs()>, this function will make
+checks against the local filesystem if necessary. See
+L</file_name_is_absolute> for details.
=cut
-sub rel2abs($;$;) {
+sub rel2abs {
my ($self,$path,$base ) = @_;
if ( ! $self->file_name_is_absolute( $path ) ) {
diff --git a/gnu/usr.bin/perl/lib/File/Spec/OS2.pm b/gnu/usr.bin/perl/lib/File/Spec/OS2.pm
index 33370f06c19..20bf8c9dcef 100644
--- a/gnu/usr.bin/perl/lib/File/Spec/OS2.pm
+++ b/gnu/usr.bin/perl/lib/File/Spec/OS2.pm
@@ -1,8 +1,11 @@
package File::Spec::OS2;
use strict;
-use vars qw(@ISA);
+use vars qw(@ISA $VERSION);
require File::Spec::Unix;
+
+$VERSION = '1.1';
+
@ISA = qw(File::Spec::Unix);
sub devnull {
diff --git a/gnu/usr.bin/perl/lib/File/Spec/Unix.pm b/gnu/usr.bin/perl/lib/File/Spec/Unix.pm
index 2305b75b761..a81c533235f 100644
--- a/gnu/usr.bin/perl/lib/File/Spec/Unix.pm
+++ b/gnu/usr.bin/perl/lib/File/Spec/Unix.pm
@@ -1,6 +1,9 @@
package File::Spec::Unix;
use strict;
+use vars qw($VERSION);
+
+$VERSION = '1.2';
use Cwd;
@@ -35,7 +38,7 @@ sub canonpath {
$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
+ $path =~ s|/\Z(?!\n)|| unless $path eq "/"; # xx/ -> xx
return $path;
}
@@ -146,7 +149,7 @@ directory. (Does not strip symlinks, only '.', '..', and equivalents.)
sub no_upwards {
my $self = shift;
- return grep(!/^\.{1,2}\z/s, @_);
+ return grep(!/^\.{1,2}\Z(?!\n)/s, @_);
}
=item case_tolerant
@@ -162,7 +165,12 @@ sub case_tolerant {
=item file_name_is_absolute
-Takes as argument a path and returns true, if it is an absolute path.
+Takes as argument a path and returns true if it is an absolute path.
+
+This does not consult the local filesystem on Unix, Win32, or OS/2. It
+does sometimes on MacOS (see L<File::Spec::MacOS/file_name_is_absolute>).
+It does consult the working environment for VMS (see
+L<File::Spec::VMS/file_name_is_absolute>).
=cut
@@ -223,7 +231,7 @@ sub splitpath {
$directory = $path;
}
else {
- $path =~ m|^ ( (?: .* / (?: \.\.?\z )? )? ) ([^/]*) |xs;
+ $path =~ m|^ ( (?: .* / (?: \.\.?\Z(?!\n) )? )? ) ([^/]*) |xs;
$directory = $1;
$file = $2;
}
@@ -263,7 +271,7 @@ sub splitdir {
# check to be sure that there will not be any before handling the
# simple case.
#
- if ( $directories !~ m|/\z| ) {
+ if ( $directories !~ m|/\Z(?!\n)| ) {
return split( m|/|, $directories );
}
else {
@@ -308,8 +316,8 @@ sub catpath {
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 ) ;
+ $rel_path = File::Spec->abs2rel( $path ) ;
+ $rel_path = File::Spec->abs2rel( $path, $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
@@ -325,9 +333,13 @@ 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 on most systems. On MacOS,
+the filesystem may be consulted (see
+L<File::Spec::MacOS/file_name_is_absolute>). On VMS, there is
+interaction with the working environment, as logicals and
+macros are expanded.
-No checks against the filesystem are made.
+Based on code written by Shigio Yamaguchi.
=cut
@@ -385,15 +397,15 @@ sub abs2rel {
Converts a relative path to an absolute path.
- $abs_path = File::Spec->rel2abs( $destination ) ;
- $abs_path = File::Spec->rel2abs( $destination, $base ) ;
+ $abs_path = File::Spec->rel2abs( $path ) ;
+ $abs_path = File::Spec->rel2abs( $path, $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.
+are on the $base volume, and ignores the $path 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
@@ -401,13 +413,17 @@ 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 on most systems. On MacOS,
+the filesystem may be consulted (see
+L<File::Spec::MacOS/file_name_is_absolute>). On VMS, there is
+interaction with the working environment, as logicals and
+macros are expanded.
-No checks against the filesystem are made.
+Based on code written by Shigio Yamaguchi.
=cut
-sub rel2abs($;$;) {
+sub rel2abs {
my ($self,$path,$base ) = @_;
# Clean up $path
diff --git a/gnu/usr.bin/perl/lib/File/Spec/VMS.pm b/gnu/usr.bin/perl/lib/File/Spec/VMS.pm
index a2ac8cac0bb..60b0ec8e50d 100644
--- a/gnu/usr.bin/perl/lib/File/Spec/VMS.pm
+++ b/gnu/usr.bin/perl/lib/File/Spec/VMS.pm
@@ -1,8 +1,11 @@
package File::Spec::VMS;
use strict;
-use vars qw(@ISA);
+use vars qw(@ISA $VERSION);
require File::Spec::Unix;
+
+$VERSION = '1.1';
+
@ISA = qw(File::Spec::Unix);
use Cwd;
@@ -37,6 +40,11 @@ sub eliminate_macros {
my($self,$path) = @_;
return '' unless $path;
$self = {} unless ref $self;
+
+ if ($path =~ /\s/) {
+ return join ' ', map { $self->eliminate_macros($_) } split /\s+/, $path;
+ }
+
my($npath) = unixify($path);
my($complex) = 0;
my($head,$macro,$tail);
@@ -56,7 +64,7 @@ sub eliminate_macros {
$complex = 1;
}
}
- else { ($macro = unixify($self->{$macro})) =~ s#/\z##; }
+ else { ($macro = unixify($self->{$macro})) =~ s#/\Z(?!\n)##; }
$npath = "$head$macro$tail";
}
}
@@ -86,8 +94,14 @@ sub fixpath {
$self = bless {} unless ref $self;
my($fixedpath,$prefix,$name);
- if ($path =~ m#^\$\([^\)]+\)\z#s || $path =~ m#[/:>\]]#) {
- if ($force_path or $path =~ /(?:DIR\)|\])\z/) {
+ if ($path =~ /\s/) {
+ return join ' ',
+ map { $self->fixpath($_,$force_path) }
+ split /\s+/, $path;
+ }
+
+ if ($path =~ m#^\$\([^\)]+\)\Z(?!\n)#s || $path =~ m#[/:>\]]#) {
+ if ($force_path or $path =~ /(?:DIR\)|\])\Z(?!\n)/) {
$fixedpath = vmspath($self->eliminate_macros($path));
}
else {
@@ -97,7 +111,7 @@ sub fixpath {
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) : '';
+ $vmspre = ($vmspre =~ m|/| or $prefix =~ /DIR\Z(?!\n)/) ? vmspath($vmspre) : '';
$fixedpath = ($vmspre ? $vmspre : $self->{$prefix}) . $name;
$fixedpath = vmspath($fixedpath) if $force_path;
}
@@ -136,7 +150,7 @@ sub canonpath {
my($self,$path) = @_;
if ($path =~ m|/|) { # Fake Unix
- my $pathify = $path =~ m|/\z|;
+ my $pathify = $path =~ m|/\Z(?!\n)|;
$path = $self->SUPER::canonpath($path);
if ($pathify) { return vmspath($path); }
else { return vmsify($path); }
@@ -169,8 +183,8 @@ sub catdir {
if (@dirs) {
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;
+ $spath =~ s/\.dir\Z(?!\n)//; $sdir =~ s/\.dir\Z(?!\n)//;
+ $sdir = $self->eliminate_macros($sdir) unless $sdir =~ /^[\w\-]+\Z(?!\n)/s;
$rslt = $self->fixpath($self->eliminate_macros($spath)."/$sdir",1);
# Special case for VMS absolute directory specs: these will have had device
@@ -181,7 +195,7 @@ sub catdir {
}
else {
if (not defined $dir or not length $dir) { $rslt = ''; }
- elsif ($dir =~ /^\$\([^\)]+\)\z/s) { $rslt = $dir; }
+ elsif ($dir =~ /^\$\([^\)]+\)\Z(?!\n)/s) { $rslt = $dir; }
else { $rslt = vmspath($dir); }
}
return $self->canonpath($rslt);
@@ -202,8 +216,8 @@ sub catfile {
if (@files) {
my $path = (@files == 1 ? $files[0] : $self->catdir(@files));
my $spath = $path;
- $spath =~ s/\.dir\z//;
- if ($spath =~ /^[^\)\]\/:>]+\)\z/s && basename($file) eq $file) {
+ $spath =~ s/\.dir\Z(?!\n)//;
+ if ($spath =~ /^[^\)\]\/:>]+\)\Z(?!\n)/s && basename($file) eq $file) {
$rslt = "$spath$file";
}
else {
@@ -251,7 +265,7 @@ sub rootdir {
Returns a string representation of the first writable directory
from the following list or '' if none are writable:
- sys$scratch
+ sys$scratch:
$ENV{TMPDIR}
=cut
@@ -259,7 +273,7 @@ from the following list or '' if none are writable:
my $tmpdir;
sub tmpdir {
return $tmpdir if defined $tmpdir;
- foreach ('sys$scratch', $ENV{TMPDIR}) {
+ foreach ('sys$scratch:', $ENV{TMPDIR}) {
next unless defined && -d && -w _;
$tmpdir = $_;
last;
@@ -310,7 +324,7 @@ Checks for VMS directory spec as well as Unix separators.
sub file_name_is_absolute {
my ($self,$file) = @_;
# If it's a logical name, expand it.
- $file = $ENV{$file} while $file =~ /^[\w\$\-]+\z/s && $ENV{$file};
+ $file = $ENV{$file} while $file =~ /^[\w\$\-]+\Z(?!\n)/s && $ENV{$file};
return scalar($file =~ m!^/!s ||
$file =~ m![<\[][^.\-\]>]! ||
$file =~ /:[^<\[]/);
@@ -341,7 +355,7 @@ sub splitdir {
$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[0] =~ s/^[\[<]//s; $dirs[-1] =~ s/[\]>]\Z(?!\n)//s;
@dirs;
}
@@ -355,7 +369,7 @@ Construct a complete filespec using VMS syntax
sub catpath {
my($self,$dev,$dir,$file) = @_;
if ($dev =~ m|^/+([^/]+)|) { $dev = "$1:"; }
- else { $dev .= ':' unless $dev eq '' or $dev =~ /:\z/; }
+ else { $dev .= ':' unless $dev eq '' or $dev =~ /:\Z(?!\n)/; }
if (length($dev) or length($dir)) {
$dir = "[$dir]" unless $dir =~ /[\[<\/]/;
$dir = vmspath($dir);
@@ -400,17 +414,16 @@ sub abs2rel {
}
# Split up paths
- my ( undef, $path_directories, $path_file ) =
- $self->splitpath( $path, 1 ) ;
+ my ( $path_directories, $path_file ) =
+ ($self->splitpath( $path, 1 ))[1,2] ;
$path_directories = $1
- if $path_directories =~ /^\[(.*)\]\z/s ;
+ if $path_directories =~ /^\[(.*)\]\Z(?!\n)/s ;
- my ( undef, $base_directories, undef ) =
- $self->splitpath( $base, 1 ) ;
+ my $base_directories = ($self->splitpath( $base, 1 ))[1] ;
$base_directories = $1
- if $base_directories =~ /^\[(.*)\]\z/s ;
+ if $base_directories =~ /^\[(.*)\]\Z(?!\n)/s ;
# Now, remove all leading components that are the same
my @pathchunks = $self->splitdir( $path_directories );
@@ -427,7 +440,7 @@ sub abs2rel {
# @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}{} ;
+ $path_directories =~ s{\.\Z(?!\n)}{} ;
return $self->canonpath( $self->catpath( '', $path_directories, $path_file ) ) ;
}
@@ -438,7 +451,7 @@ Use VMS syntax when converting filespecs.
=cut
-sub rel2abs($;$;) {
+sub rel2abs {
my $self = shift ;
return vmspath(File::Spec::Unix::rel2abs( $self, @_ ))
if ( join( '', @_ ) =~ m{/} ) ;
@@ -458,17 +471,17 @@ sub rel2abs($;$;) {
}
# Split up paths
- my ( undef, $path_directories, $path_file ) =
- $self->splitpath( $path ) ;
+ my ( $path_directories, $path_file ) =
+ ($self->splitpath( $path ))[1,2] ;
- my ( $base_volume, $base_directories, undef ) =
+ my ( $base_volume, $base_directories ) =
$self->splitpath( $base ) ;
$path_directories = '' if $path_directories eq '[]' ||
$path_directories eq '<>';
my $sep = '' ;
$sep = '.'
- if ( $base_directories =~ m{[^.\]>]\z} &&
+ if ( $base_directories =~ m{[^.\]>]\Z(?!\n)} &&
$path_directories =~ m{^[^.\[<]}s
) ;
$base_directories = "$base_directories$sep$path_directories";
diff --git a/gnu/usr.bin/perl/lib/File/Spec/Win32.pm b/gnu/usr.bin/perl/lib/File/Spec/Win32.pm
index aa95fbde363..3c019853f11 100644
--- a/gnu/usr.bin/perl/lib/File/Spec/Win32.pm
+++ b/gnu/usr.bin/perl/lib/File/Spec/Win32.pm
@@ -2,8 +2,11 @@ package File::Spec::Win32;
use strict;
use Cwd;
-use vars qw(@ISA);
+use vars qw(@ISA $VERSION);
require File::Spec::Unix;
+
+$VERSION = '1.2';
+
@ISA = qw(File::Spec::Unix);
=head1 NAME
@@ -40,6 +43,7 @@ from the following list:
$ENV{TMPDIR}
$ENV{TEMP}
$ENV{TMP}
+ C:/temp
/tmp
/
@@ -49,7 +53,7 @@ my $tmpdir;
sub tmpdir {
return $tmpdir if defined $tmpdir;
my $self = shift;
- foreach (@ENV{qw(TMPDIR TEMP TMP)}, qw(/tmp /)) {
+ foreach (@ENV{qw(TMPDIR TEMP TMP)}, qw(C:/temp /tmp /)) {
next unless defined && -d;
$tmpdir = $_;
last;
@@ -105,8 +109,8 @@ sub canonpath {
$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
+ $path =~ s|\\\Z(?!\n)||
+ unless $path =~ m#^([A-Z]:)?\\\Z(?!\n)#s; # xx/ -> xx
return $path;
}
@@ -146,7 +150,7 @@ sub splitpath {
(?:\\\\|//)[^\\/]+[\\/][^\\/]+
)?
)
- ( (?:.*[\\\\/](?:\.\.?\z)?)? )
+ ( (?:.*[\\\\/](?:\.\.?\Z(?!\n))?)? )
(.*)
}xs;
$volume = $1;
@@ -187,7 +191,7 @@ sub splitdir {
# check to be sure that there will not be any before handling the
# simple case.
#
- if ( $directories !~ m|[\\/]\z| ) {
+ if ( $directories !~ m|[\\/]\Z(?!\n)| ) {
return split( m|[\\/]|, $directories );
}
else {
@@ -216,7 +220,7 @@ sub catpath {
# 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 &&
+ if ( $volume =~ m@^([\\/])[\\/][^\\/]+[\\/][^\\/]+\Z(?!\n)@s &&
$directory =~ m@^[^\\/]@s
) ;
@@ -224,8 +228,8 @@ sub catpath {
# 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@ &&
+ if ( $volume !~ m@^[a-zA-Z]:\Z(?!\n)@s &&
+ $volume =~ m@[^\\/]\Z(?!\n)@ &&
$file =~ m@[^\\/]@
) {
$volume =~ m@([\\/])@ ;
@@ -239,34 +243,6 @@ sub catpath {
}
-=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) = @_;
@@ -293,8 +269,7 @@ sub abs2rel {
my ( $path_volume, $path_directories, $path_file ) =
$self->splitpath( $path, 1 ) ;
- my ( undef, $base_directories, undef ) =
- $self->splitpath( $base, 1 ) ;
+ my $base_directories = ($self->splitpath( $base, 1 ))[1] ;
# Now, remove all leading components that are the same
my @pathchunks = $self->splitdir( $path_directories );
@@ -337,33 +312,8 @@ sub abs2rel {
) ;
}
-=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($;$;) {
+sub rel2abs {
my ($self,$path,$base ) = @_;
if ( ! $self->file_name_is_absolute( $path ) ) {
@@ -378,10 +328,10 @@ sub rel2abs($;$;) {
$base = $self->canonpath( $base ) ;
}
- my ( undef, $path_directories, $path_file ) =
- $self->splitpath( $path, 1 ) ;
+ my ( $path_directories, $path_file ) =
+ ($self->splitpath( $path, 1 ))[1,2] ;
- my ( $base_volume, $base_directories, undef ) =
+ my ( $base_volume, $base_directories ) =
$self->splitpath( $base, 1 ) ;
$path = $self->catpath(
diff --git a/gnu/usr.bin/perl/lib/Math/BigFloat.pm b/gnu/usr.bin/perl/lib/Math/BigFloat.pm
index d8d643ca3e3..1eefac2d79e 100644
--- a/gnu/usr.bin/perl/lib/Math/BigFloat.pm
+++ b/gnu/usr.bin/perl/lib/Math/BigFloat.pm
@@ -4,6 +4,7 @@ use Math::BigInt;
use Exporter; # just for use to be happy
@ISA = (Exporter);
+$VERSION = '0.02';
use overload
'+' => sub {new Math::BigFloat &fadd},
@@ -12,9 +13,12 @@ use overload
'<=>' => 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
+'/' => sub {new Math::BigFloat
$_[2]? scalar fdiv($_[1],${$_[0]}) :
scalar fdiv(${$_[0]},$_[1])},
+'%' => sub {new Math::BigFloat
+ $_[2]? scalar fmod($_[1],${$_[0]}) :
+ scalar fmod(${$_[0]},$_[1])},
'neg' => sub {new Math::BigFloat &fneg},
'abs' => sub {new Math::BigFloat &fabs},
@@ -43,12 +47,15 @@ sub stringify {
my $e = $1;
my $ln = length($n);
- if ($e > 0) {
- $n .= "0" x $e . '.';
- } elsif (abs($e) < $ln) {
- substr($n, $ln + $e, 0) = '.';
- } else {
- $n = '.' . ("0" x (abs($e) - $ln)) . $n;
+ if ( defined $e )
+ {
+ if ($e > 0) {
+ $n .= "0" x $e . '.';
+ } elsif (abs($e) < $ln) {
+ substr($n, $ln + $e, 0) = '.';
+ } else {
+ $n = '.' . ("0" x (abs($e) - $ln)) . $n;
+ }
}
$n = "-$n" if $minus;
@@ -85,6 +92,7 @@ sub fnorm { #(string) return fnum_str
# normalize number -- for internal use
sub norm { #(mantissa, exponent) return fnum_str
local($_, $exp) = @_;
+ $exp = 0 unless defined $exp;
if ($_ eq 'NaN') {
'NaN';
} else {
@@ -140,7 +148,7 @@ sub fadd { #(fnum_str, fnum_str) return fnum_str
# subtraction
sub fsub { #(fnum_str, fnum_str) return fnum_str
- fadd($_[$[],fneg($_[$[+1]));
+ fadd($_[$[],fneg($_[$[+1]));
}
# division
@@ -164,6 +172,27 @@ sub fdiv #(fnum_str, fnum_str[,scale]) return fnum_str
}
}
+# modular division
+# args are dividend, divisor
+sub fmod #(fnum_str, fnum_str) return fnum_str
+{
+ local($x,$y) = (fnorm($_[$[]),fnorm($_[$[+1]));
+ if ($x eq 'NaN' || $y eq 'NaN' || $y eq '+0E+0') {
+ 'NaN';
+ } else {
+ local($xm,$xe) = split('E',$x);
+ local($ym,$ye) = split('E',$y);
+ if ( $xe < $ye )
+ {
+ $ym .= ('0' x ($ye-$xe));
+ }
+ else
+ {
+ $xm .= ('0' x ($xe-$ye));
+ }
+ &norm(Math::BigInt::bmod($xm,$ym));
+ }
+}
# round int $q based on fraction $r/$base using $rnd_mode
sub round { #(int_str, int_str, int_str) return int_str
local($q,$r,$base) = @_;
@@ -174,12 +203,14 @@ sub round { #(int_str, int_str, int_str) return int_str
} else {
local($cmp) = Math::BigInt::bcmp(Math::BigInt::bmul($r,'+2'),$base);
if ( $cmp < 0 ||
- ($cmp == 0 &&
- ( $rnd_mode eq 'zero' ||
+ ($cmp == 0 && (
+ ($rnd_mode eq 'zero' ) ||
($rnd_mode eq '-inf' && (substr($q,$[,1) eq '+')) ||
($rnd_mode eq '+inf' && (substr($q,$[,1) eq '-')) ||
- ($rnd_mode eq 'even' && $q =~ /[24680]$/) ||
- ($rnd_mode eq 'odd' && $q =~ /[13579]$/) )) ) {
+ ($rnd_mode eq 'even' && $q =~ /[24680]$/ ) ||
+ ($rnd_mode eq 'odd' && $q =~ /[13579]$/ ) )
+ )
+ ) {
$q; # round down
} else {
Math::BigInt::badd($q, ((substr($q,$[,1) eq '-') ? '-1' : '+1'));
@@ -199,7 +230,7 @@ sub fround { #(fnum_str, scale) return fnum_str
$x;
} else {
&norm(&round(substr($xm,$[,$scale+1),
- "+0".substr($xm,$[+$scale+1,1),"+10"),
+ "+0".substr($xm,$[+$scale+1),"+1"."0" x length(substr($xm,$[+$scale+1))),
$xe+length($xm)-$scale-1);
}
}
@@ -223,15 +254,17 @@ sub ffround { #(fnum_str, scale) return fnum_str
# 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);
+ "+0".substr($xm,$[+1),
+ "+1"."0" x length(substr($xm,$[+1))), $scale);
} else {
&norm(&round(substr($xm,$[,$xe),
- "+0".substr($xm,$[+$xe,1),"+10"), $scale);
+ "+0".substr($xm,$[+$xe),
+ "+1"."0" x length(substr($xm,$[+$xe))), $scale);
}
}
}
}
-
+
# compare 2 values returns one of undef, <0, =0, >0
# returns undef if either or both input value are not numbers
sub fcmp #(fnum_str, fnum_str) return cond_code
@@ -244,9 +277,17 @@ sub fcmp #(fnum_str, fnum_str) return cond_code
if ($xm eq '+0' || $ym eq '+0') {
return $xm <=> $ym;
}
- ord($y) <=> ord($x)
- || ($xe <=> $ye) * (substr($x,$[,1).'1')
- || Math::BigInt::cmp($xm,$ym);
+ if ( $xe < $ye ) # adjust the exponents to be equal
+ {
+ $ym .= '0' x ($ye - $xe);
+ $ye = $xe;
+ }
+ elsif ( $ye < $xe ) # same here
+ {
+ $xm .= '0' x ($xe - $ye);
+ $xe = $ye;
+ }
+ return Math::BigInt::cmp($xm,$ym);
}
}
@@ -286,6 +327,7 @@ Math::BigFloat - Arbitrary length float math package
$f->fsub(NSTR) return NSTR subtraction
$f->fmul(NSTR) return NSTR multiplication
$f->fdiv(NSTR[,SCALE]) returns NSTR division to SCALE places
+ $f->fmod(NSTR) returns NSTR modular remainder
$f->fneg() return NSTR negation
$f->fabs() return NSTR absolute value
$f->fcmp(NSTR) return CODE compare undef,<0,=0,>0
@@ -313,7 +355,7 @@ have embedded whitespace.
An input parameter was "Not a Number" or divide by zero or sqrt of
negative number.
-=item Division is computed to
+=item Division is computed to
C<max($Math::BigFloat::div_scale,length(dividend)+length(divisor))>
digits by default.
@@ -352,5 +394,5 @@ as follows:
=head1 AUTHOR
Mark Biggar
-
+Patches by John Peacock Apr 2001
=cut
diff --git a/gnu/usr.bin/perl/lib/Pod/Checker.pm b/gnu/usr.bin/perl/lib/Pod/Checker.pm
index ae32677db1a..0863c80fc88 100644
--- a/gnu/usr.bin/perl/lib/Pod/Checker.pm
+++ b/gnu/usr.bin/perl/lib/Pod/Checker.pm
@@ -10,7 +10,7 @@
package Pod::Checker;
use vars qw($VERSION);
-$VERSION = 1.098; ## Current version of this package
+$VERSION = 1.2; ## Current version of this package
require 5.005; ## requires this Perl version or later
use Pod::ParseUtils; ## for hyperlinks and lists
@@ -44,7 +44,8 @@ This function can take a hash of options:
=item B<-warnings> =E<gt> I<val>
-Turn warnings on/off. See L<"Warnings">.
+Turn warnings on/off. I<val> is usually 1 for on, but higher values
+trigger additional warnings. See L<"Warnings">.
=back
@@ -212,15 +213,14 @@ 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.
+=begin _disabled_
+
=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).
+=end _disabled_
=item * previous =item has no contents
@@ -243,7 +243,8 @@ type of the I<first> C<=item> determines the type of the list.
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.
+markup commands. This is only printed when the -warnings level is
+greater than 1.
=item * Unknown entity
@@ -273,11 +274,36 @@ 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
+=back
+
+=head2 Hyperlinks
+
+There are some warnings wrt. malformed hyperlinks.
+
+=over 4
+
+=item * ignoring leading/trailing whitespace in link
+
+There is whitespace at the beginning or the end of the contents of
+LE<lt>...E<gt>.
-There are some warnings wrt. hyperlinks:
-Leading/trailing whitespace, newlines in hyperlinks,
-brackets C<()>.
+=item * (section) in '$page' deprecated
+
+There is a section detected in the page name of LE<lt>...E<gt>, e.g.
+C<LE<gt>passwd(2)E<gt>>. POD hyperlinks may point to POD documents only.
+Please write C<CE<lt>passwd(2)E<gt>> instead. Some formatters are able
+to expand this to appropriate code. For links to (builtin) functions,
+please say C<LE<lt>perlfunc/mkdirE<gt>>, without ().
+
+=item * alternative text/node '%s' contains non-escaped | or /
+
+The characters C<|> and C</> are special in the LE<lt>...E<gt> context.
+Although the hyperlink parser does its best to determine which "/" is
+text and which is a delimiter in case of doubt, one ought to escape
+these literal characters like this:
+
+ / E<sol>
+ | E<verbar>
=back
@@ -307,7 +333,6 @@ use strict;
use Carp;
use Exporter;
use Pod::Parser;
-require VMS::Filespec if $^O eq 'VMS';
use vars qw(@ISA @EXPORT);
@ISA = qw(Pod::Parser);
@@ -471,7 +496,6 @@ sub podchecker( $ ; $ % ) {
## 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);
@@ -486,6 +510,27 @@ sub podchecker( $ ; $ % ) {
## Method definitions begin here
##-------------------------------
+##################################
+
+=over 4
+
+=item C<Pod::Checker-E<gt>new( %options )>
+
+Return a reference to a new Pod::Checker object that inherits from
+Pod::Parser and is used for calling the required methods later. The
+following options are recognized:
+
+C<-warnings =E<gt> num>
+ Print warnings if C<num> is true. The higher the value of C<num>,
+the more warnings are printed. Currently there are only levels 1 and 2.
+
+C<-quiet =E<gt> num>
+ If C<num> is true, do not print any errors/warnings. This is useful
+when Pod::Checker is used to munge POD code into plain text from within
+POD formatters.
+
+=cut
+
## sub new {
## my $this = shift;
## my $class = ref($this) || $this;
@@ -501,7 +546,9 @@ sub initialize {
## 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->{-quiet} ||= 0;
+ # set the error handling subroutine
+ $self->errorsub($self->{-quiet} ? sub { 1; } : 'poderror');
$self->{_commands} = 0; # total number of POD commands encountered
$self->{_list_stack} = []; # stack for nested lists
$self->{_have_begin} = ''; # stores =begin
@@ -511,12 +558,11 @@ sub initialize {
# print warnings?
$self->{-warnings} = 1 unless(defined $self->{-warnings});
$self->{_current_head1} = ''; # the current =head1 block
+ $self->parseopts(-process_cut_cmd => 1, -warnings => $self->{-warnings});
}
##################################
-=over 4
-
=item C<$checker-E<gt>poderror( @args )>
=item C<$checker-E<gt>poderror( {%opts}, @args )>
@@ -547,7 +593,6 @@ The error level, should be 'WARNING' or 'ERROR'.
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} || "")."@_" );
@@ -562,7 +607,7 @@ sub poderror {
## Increment error count and print message "
++($self->{_NUM_ERRORS})
if(!%opts || ($opts{-severity} && $opts{-severity} eq 'ERROR'));
- my $out_fh = $self->output_handle();
+ my $out_fh = $self->output_handle() || \*STDERR;
print $out_fh ($severity, $msg, $line, $file, "\n")
if($self->{-warnings} || !%opts || $opts{-severity} ne 'WARNING');
}
@@ -672,7 +717,6 @@ sub end_pod {
## 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}}) {
@@ -691,12 +735,15 @@ sub end_pod {
my %nodes;
foreach($self->node()) {
$nodes{$_} = 1;
- if(/^(\S+)\s+/) {
+ if(/^(\S+)\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->idx()) {
+ $nodes{$_} = 3; # index node
+ }
foreach($self->hyperlink()) {
my ($line,$link) = @$_;
# _TODO_ what if there is a link to the page itself by the name,
@@ -746,24 +793,23 @@ sub command {
$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
+ else { # found a valid command
+ $self->{_commands}++; # delete this line if below is enabled again
+
+ ##### following check disabled due to strong request
+ #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);
@@ -1005,12 +1051,13 @@ sub _check_ptree {
unless(ref) {
my $count;
# count the unescaped angle brackets
+ # complain only when warning level is greater than 1
my $i = $_;
if($count = $i =~ tr/<>/<>/) {
$self->poderror({ -line => $line, -file => $file,
-severity => 'WARNING',
-msg => "$count unescaped <> in paragraph" })
- if($self->{-warnings});
+ if($self->{-warnings} && $self->{-warnings}>1);
}
$text .= $i;
next;
diff --git a/gnu/usr.bin/perl/lib/Pod/Find.pm b/gnu/usr.bin/perl/lib/Pod/Find.pm
index 8de197b71da..4a0ecb9e65a 100644
--- a/gnu/usr.bin/perl/lib/Pod/Find.pm
+++ b/gnu/usr.bin/perl/lib/Pod/Find.pm
@@ -13,8 +13,9 @@
package Pod::Find;
use vars qw($VERSION);
-$VERSION = 0.12; ## Current version of this package
-require 5.005; ## requires this Perl version or later
+$VERSION = 0.21; ## Current version of this package
+require 5.005; ## requires this Perl version or later
+use Carp;
#############################################################################
@@ -32,12 +33,38 @@ Pod::Find - find POD documents in directory trees
print "podname=",simplify_name('a/b/c/mymodule.pod'),"\n";
+ $location = pod_where( { -inc => 1 }, "Pod::Find" );
+
=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.
+B<Pod::Find> provides a set of functions to locate POD files. Note that
+no function is exported by default to avoid pollution of your namespace,
+so be sure to specify them in the B<use> statement if you need them:
+
+ use Pod::Find qw(pod_find);
+
+=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 &pod_where &contains_pod);
+
+# package global variables
+my $SIMPLIFY_RX;
+
+=head2 C<pod_find( { %opts } , @directories )>
+
+The function B<pod_find> searches for POD documents in a given set of
+files and/or 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>,
@@ -51,73 +78,39 @@ 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.
+B<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>
+=item C<-verbose =E<gt> 1>
Print progress information while scanning.
-=item B<-perl>
+=item C<-perl =E<gt> 1>
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>
+=item C<-script =E<gt> 1>
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>
+=item C<-inc =E<gt> 1>
Search for PODs in the current Perl interpreter's I<@INC> paths. This
-automatically considers paths specified in the C<PERL5LIB> environment.
+automatically considers paths specified in the C<PERL5LIB> environment
+as this is prepended to I<@INC> by the Perl interpreter itself.
=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
@@ -152,7 +145,7 @@ sub pod_find
# * 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))*!;
+ qq!^(?i:site(_perl)?/|\Q$Config::Config{archname}\E/|\\d+\\.\\d+([_.]?\\d+)?/|pod/(?=.*?\\.pod\\z))*!;
}
@@ -167,7 +160,9 @@ sub pod_find
$try = File::Spec->catfile($pwd,$try);
}
# simplify path
- $try = File::Spec->canonpath($try);
+ # on VMS canonpath will vmsify:[the.path], but File::Find::find
+ # wants /unixy/paths
+ $try = File::Spec->canonpath($try) if ($^O ne 'VMS');
my $name;
if(-f $try) {
if($name = _check_and_extract_name($try, $opts{-verbose})) {
@@ -222,27 +217,14 @@ sub _check_and_extract_name {
# 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;
+ unless(-f $file && -T _ && ($file =~ /\.(pod|pm|plx?)\z/i || -x _ )) {
+ 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;
+ return undef unless contains_pod($file,$verbose);
# strip non-significant path components
- # _TODO_ what happens on e.g. Win32?
+ # TODO what happens on e.g. Win32?
my $name = $file;
if(defined $root_rx) {
$name =~ s!$root_rx!!s;
@@ -256,6 +238,14 @@ sub _check_and_extract_name {
$name;
}
+=head2 C<simplify_name( $str )>
+
+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, or F<.com> on VMS, respectively.
+
+=cut
+
# basic simplification of the POD name:
# basename & strip extension
sub simplify_name {
@@ -271,8 +261,185 @@ 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);
+ $_[0] =~ s/\.(bat|exe|cmd)\z//i if($^O =~ /mswin|os2/i);
+ # strip meaningless extensions on VMS
+ $_[0] =~ s/\.(com)\z//i if($^O eq 'VMS');
}
+# contribution from Tim Jenness <t.jenness@jach.hawaii.edu>
+
+=head2 C<pod_where( { %opts }, $pod )>
+
+Returns the location of a pod document given a search directory
+and a module (e.g. C<File::Find>) or script (e.g. C<perldoc>) name.
+
+Options:
+
+=over 4
+
+=item C<-inc =E<gt> 1>
+
+Search @INC for the pod and also the C<scriptdir> defined in the
+L<Config|Config> module.
+
+=item C<-dirs =E<gt> [ $dir1, $dir2, ... ]>
+
+Reference to an array of search directories. These are searched in order
+before looking in C<@INC> (if B<-inc>). Current directory is used if
+none are specified.
+
+=item C<-verbose =E<gt> 1>
+
+List directories as they are searched
+
+=back
+
+Returns the full path of the first occurence to the file.
+Package names (eg 'A::B') are automatically converted to directory
+names in the selected directory. (eg on unix 'A::B' is converted to
+'A/B'). Additionally, '.pm', '.pl' and '.pod' are appended to the
+search automatically if required.
+
+A subdirectory F<pod/> is also checked if it exists in any of the given
+search directories. This ensures that e.g. L<perlfunc|perlfunc> is
+found.
+
+It is assumed that if a module name is supplied, that that name
+matches the file name. Pods are not opened to check for the 'NAME'
+entry.
+
+A check is made to make sure that the file that is found does
+contain some pod documentation.
+
+=cut
+
+sub pod_where {
+
+ # default options
+ my %options = (
+ '-inc' => 0,
+ '-verbose' => 0,
+ '-dirs' => [ '.' ],
+ );
+
+ # Check for an options hash as first argument
+ if (defined $_[0] && ref($_[0]) eq 'HASH') {
+ my $opt = shift;
+
+ # Merge default options with supplied options
+ %options = (%options, %$opt);
+ }
+
+ # Check usage
+ carp 'Usage: pod_where({options}, $pod)' unless (scalar(@_));
+
+ # Read argument
+ my $pod = shift;
+
+ # Split on :: and then join the name together using File::Spec
+ my @parts = split (/::/, $pod);
+
+ # Get full directory list
+ my @search_dirs = @{ $options{'-dirs'} };
+
+ if ($options{'-inc'}) {
+
+ require Config;
+
+ # Add @INC
+ push (@search_dirs, @INC) if $options{'-inc'};
+
+ # Add location of pod documentation for perl man pages (eg perlfunc)
+ # This is a pod directory in the private install tree
+ #my $perlpoddir = File::Spec->catdir($Config::Config{'installprivlib'},
+ # 'pod');
+ #push (@search_dirs, $perlpoddir)
+ # if -d $perlpoddir;
+
+ # Add location of binaries such as pod2text
+ push (@search_dirs, $Config::Config{'scriptdir'})
+ if -d $Config::Config{'scriptdir'};
+ }
+
+ # Loop over directories
+ Dir: foreach my $dir ( @search_dirs ) {
+
+ # Don't bother if cant find the directory
+ if (-d $dir) {
+ warn "Looking in directory $dir\n"
+ if $options{'-verbose'};
+
+ # Now concatenate this directory with the pod we are searching for
+ my $fullname = File::Spec->catfile($dir, @parts);
+ warn "Filename is now $fullname\n"
+ if $options{'-verbose'};
+
+ # Loop over possible extensions
+ foreach my $ext ('', '.pod', '.pm', '.pl') {
+ my $fullext = $fullname . $ext;
+ if (-f $fullext &&
+ contains_pod($fullext, $options{'-verbose'}) ) {
+ warn "FOUND: $fullext\n" if $options{'-verbose'};
+ return $fullext;
+ }
+ }
+ } else {
+ warn "Directory $dir does not exist\n"
+ if $options{'-verbose'};
+ next Dir;
+ }
+ if(-d File::Spec->catdir($dir,'pod')) {
+ $dir = File::Spec->catdir($dir,'pod');
+ redo Dir;
+ }
+ }
+ # No match;
+ return undef;
+}
+
+=head2 C<contains_pod( $file , $verbose )>
+
+Returns true if the supplied filename (not POD module) contains some pod
+information.
+
+=cut
+
+sub contains_pod {
+ my $file = shift;
+ my $verbose = 0;
+ $verbose = shift if @_;
+
+ # 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) || die "Error closing $file: $!\n";
+ unless($pod =~ /\n=(head\d|pod|over|item)\b/s) {
+ warn "No POD in $file, skipping.\n"
+ if($verbose);
+ return 0;
+ }
+
+ return 1;
+}
+
+=head1 AUTHOR
+
+Marek Rouchal E<lt>marek@saftsack.fs.uni-bayreuth.deE<gt>,
+heavily borrowing code from Nick Ing-Simmons' PodToHtml.
+
+Tim Jenness E<lt>t.jenness@jach.hawaii.eduE<gt> provided
+C<pod_where> and C<contains_pod>.
+
+=head1 SEE ALSO
+
+L<Pod::Parser>, L<Pod::Checker>, L<perldoc>
+
+=cut
+
1;
diff --git a/gnu/usr.bin/perl/lib/Pod/LaTeX.pm b/gnu/usr.bin/perl/lib/Pod/LaTeX.pm
new file mode 100644
index 00000000000..79c60060c0c
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Pod/LaTeX.pm
@@ -0,0 +1,1591 @@
+package Pod::LaTeX;
+
+# Copyright (C) 2000 by Tim Jenness <t.jenness@jach.hawaii.edu>
+# All Rights Reserved.
+
+=head1 NAME
+
+Pod::LaTeX - Convert Pod data to formatted Latex
+
+=head1 SYNOPSIS
+
+ use Pod::LaTeX;
+ my $parser = Pod::LaTeX->new ( );
+
+ $parser->parse_from_filehandle;
+
+ $parser->parse_from_file ('file.pod', 'file.tex');
+
+=head1 DESCRIPTION
+
+C<Pod::LaTeX> is a module to convert documentation in the Pod format
+into Latex. The L<B<pod2latex>|pod2latex> X<pod2latex> command uses
+this module for translation.
+
+C<Pod::LaTeX> is a derived class from L<Pod::Select|Pod::Select>.
+
+=cut
+
+
+use strict;
+require Pod::ParseUtils;
+use base qw/ Pod::Select /;
+
+# use Data::Dumper; # for debugging
+use Carp;
+
+use vars qw/ $VERSION %HTML_Escapes @LatexSections /;
+
+$VERSION = '0.53';
+
+# Definitions of =headN -> latex mapping
+@LatexSections = (qw/
+ chapter
+ section
+ subsection
+ subsubsection
+ paragraph
+ subparagraph
+ /);
+
+# Standard escape sequences converted to Latex
+# Up to "yuml" these are taken from the original pod2latex
+# command written by Taro Kawagish (kawagish@imslab.co.jp)
+
+%HTML_Escapes = (
+ 'amp' => '&', # ampersand
+ 'lt' => '$<$', # ' left chevron, less-than
+ 'gt' => '$>$', # ' right chevron, greater-than
+ 'quot' => '"', # double quote
+ 'sol' => '/',
+ 'verbar' => '$|$',
+
+ "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" => '\\u{A}', # capital A, ring
+ "aring" => '\\u{a}', # 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{C}', # capital C, cedilla
+ "ccedil" => '\\c{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" => '\\OE', # capital Eth, Icelandic
+ "eth" => '\\oe', # 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" => '\\ss{}', # small sharp s, German (sz ligature)
+ "THORN" => '\\L', # capital THORN, Icelandic
+ "thorn" => '\\l',, # 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
+
+ # Added by TimJ
+
+ "iexcl" => '!`', # inverted exclamation mark
+# "cent" => ' ', # cent sign
+ "pound" => '\pounds', # (UK) pound sign
+# "curren" => ' ', # currency sign
+# "yen" => ' ', # yen sign
+# "brvbar" => ' ', # broken vertical bar
+ "sect" => '\S', # section sign
+ "uml" => '\"{}', # diaresis
+ "copy" => '\copyright', # Copyright symbol
+# "ordf" => ' ', # feminine ordinal indicator
+ "laquo" => '$\ll$', # ' # left pointing double angle quotation mark
+ "not" => '$\neg$', # ' # not sign
+ "shy" => '-', # soft hyphen
+# "reg" => ' ', # registered trademark
+ "macr" => '$^-$', # ' # macron, overline
+ "deg" => '$^\circ$', # ' # degree sign
+ "plusmn" => '$\pm$', # ' # plus-minus sign
+ "sup2" => '$^2$', # ' # superscript 2
+ "sup3" => '$^3$', # ' # superscript 3
+ "acute" => "\\'{}", # acute accent
+ "micro" => '$\mu$', # micro sign
+ "para" => '\P', # pilcrow sign = paragraph sign
+ "middot" => '$\cdot$', # middle dot = Georgian comma
+ "cedil" => '\c{}', # cedilla
+ "sup1" => '$^1$', # ' # superscript 1
+# "ordm" => ' ', # masculine ordinal indicator
+ "raquo" => '$\gg$', # ' # right pointing double angle quotation mark
+ "frac14" => '$\frac{1}{4}$', # ' # vulgar fraction one quarter
+ "frac12" => '$\frac{1}{2}$', # ' # vulgar fraction one half
+ "frac34" => '$\frac{3}{4}$', # ' # vulgar fraction three quarters
+ "iquest" => "?'", # inverted question mark
+ "times" => '$\times$', # ' # multiplication sign
+ "divide" => '$\div$', # division sign
+
+ # Greek letters using HTML codes
+ "alpha" => '$\alpha$', # '
+ "beta" => '$\beta$', # '
+ "gamma" => '$\gamma$', # '
+ "delta" => '$\delta$', # '
+ "epsilon"=> '$\epsilon$', # '
+ "zeta" => '$\zeta$', # '
+ "eta" => '$\eta$', # '
+ "theta" => '$\theta$', # '
+ "iota" => '$\iota$', # '
+ "kappa" => '$\kappa$', # '
+ "lambda" => '$\lambda$', # '
+ "mu" => '$\mu$', # '
+ "nu" => '$\nu$', # '
+ "xi" => '$\xi$', # '
+ "omicron"=> '$o$', # '
+ "pi" => '$\pi$', # '
+ "rho" => '$\rho$', # '
+ "sigma" => '$\sigma$', # '
+ "tau" => '$\tau$', # '
+ "upsilon"=> '$\upsilon$', # '
+ "phi" => '$\phi$', # '
+ "chi" => '$\chi$', # '
+ "psi" => '$\psi$', # '
+ "omega" => '$\omega$', # '
+
+ "Alpha" => '$A$', # '
+ "Beta" => '$B$', # '
+ "Gamma" => '$\Gamma$', # '
+ "Delta" => '$\Delta$', # '
+ "Epsilon"=> '$E$', # '
+ "Zeta" => '$Z$', # '
+ "Eta" => '$H$', # '
+ "Theta" => '$\Theta$', # '
+ "Iota" => '$I$', # '
+ "Kappa" => '$K$', # '
+ "Lambda" => '$\Lambda$', # '
+ "Mu" => '$M$', # '
+ "Nu" => '$N$', # '
+ "Xi" => '$\Xi$', # '
+ "Omicron"=> '$O$', # '
+ "Pi" => '$\Pi$', # '
+ "Rho" => '$R$', # '
+ "Sigma" => '$\Sigma$', # '
+ "Tau" => '$T$', # '
+ "Upsilon"=> '$\Upsilon$', # '
+ "Phi" => '$\Phi$', # '
+ "Chi" => '$X$', # '
+ "Psi" => '$\Psi$', # '
+ "Omega" => '$\Omega$', # '
+
+
+);
+
+
+=head1 OBJECT METHODS
+
+The following methods are provided in this module. Methods inherited
+from C<Pod::Select> are not described in the public interface.
+
+=over 4
+
+=begin __PRIVATE__
+
+=item C<initialize>
+
+Initialise the object. This method is subclassed from C<Pod::Parser>.
+The base class method is invoked. This method defines the default
+behaviour of the object unless overridden by supplying arguments to
+the constructor.
+
+Internal settings are defaulted as well as the public instance data.
+Internal hash values are accessed directly (rather than through
+a method) and start with an underscore.
+
+This method should not be invoked by the user directly.
+
+=end __PRIVATE__
+
+=cut
+
+
+
+# - An array for nested lists
+
+# Arguments have already been read by this point
+
+sub initialize {
+ my $self = shift;
+
+ # print Dumper($self);
+
+ # Internals
+ $self->{_Lists} = []; # For nested lists
+ $self->{_suppress_all_para} = 0; # For =begin blocks
+ $self->{_suppress_next_para} = 0; # For =for blocks
+ $self->{_dont_modify_any_para}=0; # For =begin blocks
+ $self->{_dont_modify_next_para}=0; # For =for blocks
+ $self->{_CURRENT_HEAD1} = ''; # Name of current HEAD1 section
+
+ # Options - only initialise if not already set
+
+ # Cause the '=head1 NAME' field to be treated specially
+ # The contents of the NAME paragraph will be converted
+ # to a section title. All subsequent =head1 will be converted
+ # to =head2 and down. Will not affect =head1's prior to NAME
+ # Assumes: 'Module - purpose' format
+ # Also creates a purpose field
+ # The name is used for Labeling of the subsequent subsections
+ $self->{ReplaceNAMEwithSection} = 0
+ unless exists $self->{ReplaceNAMEwithSection};
+ $self->{AddPreamble} = 1 # make full latex document
+ unless exists $self->{AddPreamble};
+ $self->{StartWithNewPage} = 0 # Start new page for pod section
+ unless exists $self->{StartWithNewPage};
+ $self->{TableOfContents} = 0 # Add table of contents
+ unless exists $self->{TableOfContents}; # only relevent if AddPreamble=1
+ $self->{AddPostamble} = 1 # Add closing latex code at end
+ unless exists $self->{AddPostamble}; # effectively end{document} and index
+ $self->{MakeIndex} = 1 # Add index (only relevant AddPostamble
+ unless exists $self->{MakeIndex}; # and AddPreamble)
+
+ $self->{UniqueLabels} = 1 # Use label unique for each pod
+ unless exists $self->{UniqueLabels}; # either based on the filename
+ # or supplied
+
+ # Control the level of =head1. default is \section
+ #
+ $self->{Head1Level} = 1 # Offset in latex sections
+ unless exists $self->{Head1Level}; # 0 is chapter, 2 is subsection
+
+ # Control at which level numbering of sections is turned off
+ # ie subsection becomes subsection*
+ # The numbering is relative to the latex sectioning commands
+ # and is independent of Pod heading level
+ # default is to number \section but not \subsection
+ $self->{LevelNoNum} = 2
+ unless exists $self->{LevelNoNum};
+
+ # Label to be used as prefix to all internal section names
+ # If not defined will attempt to derive it from the filename
+ # This can not happen when running parse_from_filehandle though
+ # hence the ability to set the label externally
+ # The label could then be Pod::Parser_DESCRIPTION or somesuch
+
+ $self->{Label} = undef # label to be used as prefix
+ unless exists $self->{Label}; # to all internal section names
+
+ # These allow the caller to add arbritrary latex code to
+ # start and end of document. AddPreamble and AddPostamble are ignored
+ # if these are set.
+ # Also MakeIndex and TableOfContents are also ignored.
+ $self->{UserPreamble} = undef # User supplied start (AddPreamble =1)
+ unless exists $self->{Label};
+ $self->{UserPostamble} = undef # Use supplied end (AddPostamble=1)
+ unless exists $self->{Label};
+
+ # Run base initialize
+ $self->SUPER::initialize;
+
+}
+
+=back
+
+=head2 Data Accessors
+
+The following methods are provided for accessing instance data. These
+methods should be used for accessing configuration parameters rather
+than assuming the object is a hash.
+
+Default values can be supplied by using these names as keys to a hash
+of arguments when using the C<new()> constructor.
+
+=over 4
+
+=item B<AddPreamble>
+
+Logical to control whether a C<latex> preamble is to be written.
+If true, a valid C<latex> preamble is written before the pod data is written.
+This is similar to:
+
+ \documentclass{article}
+ \begin{document}
+
+but will be more complicated if table of contents and indexing are required.
+Can be used to set or retrieve the current value.
+
+ $add = $parser->AddPreamble();
+ $parser->AddPreamble(1);
+
+If used in conjunction with C<AddPostamble> a full latex document will
+be written that could be immediately processed by C<latex>.
+
+=cut
+
+sub AddPreamble {
+ my $self = shift;
+ if (@_) {
+ $self->{AddPreamble} = shift;
+ }
+ return $self->{AddPreamble};
+}
+
+=item B<AddPostamble>
+
+Logical to control whether a standard C<latex> ending is written to the output
+file after the document has been processed.
+In its simplest form this is simply:
+
+ \end{document}
+
+but can be more complicated if a index is required.
+Can be used to set or retrieve the current value.
+
+ $add = $parser->AddPostamble();
+ $parser->AddPostamble(1);
+
+If used in conjunction with C<AddPreaamble> a full latex document will
+be written that could be immediately processed by C<latex>.
+
+=cut
+
+sub AddPostamble {
+ my $self = shift;
+ if (@_) {
+ $self->{AddPostamble} = shift;
+ }
+ return $self->{AddPostamble};
+}
+
+=item B<Head1Level>
+
+The C<latex> sectioning level that should be used to correspond to
+a pod C<=head1> directive. This can be used, for example, to turn
+a C<=head1> into a C<latex> C<subsection>. This should hold a number
+corresponding to the required position in an array containing the
+following elements:
+
+ [0] chapter
+ [1] section
+ [2] subsection
+ [3] subsubsection
+ [4] paragraph
+ [5] subparagraph
+
+Can be used to set or retrieve the current value:
+
+ $parser->Head1Level(2);
+ $sect = $parser->Head1Level;
+
+Setting this number too high can result in sections that may not be reproducible
+in the expected way. For example, setting this to 4 would imply that C<=head3>
+do not have a corresponding C<latex> section (C<=head1> would correspond to
+a C<paragraph>).
+
+A check is made to ensure that the supplied value is an integer in the
+range 0 to 5.
+
+Default is for a value of 1 (i.e. a C<section>).
+
+=cut
+
+sub Head1Level {
+ my $self = shift;
+ if (@_) {
+ my $arg = shift;
+ if ($arg =~ /^\d$/ && $arg <= $#LatexSections) {
+ $self->{Head1Level} = $arg;
+ } else {
+ carp "Head1Level supplied ($arg) must be integer in range 0 to ".$#LatexSections . "- Ignoring\n";
+ }
+ }
+ return $self->{Head1Level};
+}
+
+=item B<Label>
+
+This is the label that is prefixed to all C<latex> label and index
+entries to make them unique. In general, pods have similarly titled
+sections (NAME, DESCRIPTION etc) and a C<latex> label will be multiply
+defined if more than one pod document is to be included in a single
+C<latex> file. To overcome this, this label is prefixed to a label
+whenever a label is required (joined with an underscore) or to an
+index entry (joined by an exclamation mark which is the normal index
+separator). For example, C<\label{text}> becomes C<\label{Label_text}>.
+
+Can be used to set or retrieve the current value:
+
+ $label = $parser->Label;
+ $parser->Label($label);
+
+This label is only used if C<UniqueLabels> is true.
+Its value is set automatically from the C<NAME> field
+if C<ReplaceNAMEwithSection> is true. If this is not the case
+it must be set manually before starting the parse.
+
+Default value is C<undef>.
+
+=cut
+
+sub Label {
+ my $self = shift;
+ if (@_) {
+ $self->{Label} = shift;
+ }
+ return $self->{Label};
+}
+
+=item B<LevelNoNum>
+
+Control the point at which C<latex> section numbering is turned off.
+For example, this can be used to make sure that C<latex> sections
+are numbered but subsections are not.
+
+Can be used to set or retrieve the current value:
+
+ $lev = $parser->LevelNoNum;
+ $parser->LevelNoNum(2);
+
+The argument must be an integer between 0 and 5 and is the same as the
+number described in C<Head1Level> method description. The number has
+nothing to do with the pod heading number, only the C<latex> sectioning.
+
+Default is 2. (i.e. C<latex> subsections are written as C<subsection*>
+but sections are numbered).
+
+=cut
+
+sub LevelNoNum {
+ my $self = shift;
+ if (@_) {
+ $self->{LevelNoNum} = shift;
+ }
+ return $self->{LevelNoNum};
+}
+
+=item B<MakeIndex>
+
+Controls whether C<latex> commands for creating an index are to be inserted
+into the preamble and postamble
+
+ $makeindex = $parser->MakeIndex;
+ $parser->MakeIndex(0);
+
+Irrelevant if both C<AddPreamble> and C<AddPostamble> are false (or equivalently,
+C<UserPreamble> and C<UserPostamble> are set).
+
+Default is for an index to be created.
+
+=cut
+
+sub MakeIndex {
+ my $self = shift;
+ if (@_) {
+ $self->{MakeIndex} = shift;
+ }
+ return $self->{MakeIndex};
+}
+
+=item B<ReplaceNAMEwithSection>
+
+This controls whether the C<NAME> section in the pod is to be translated
+literally or converted to a slightly modified output where the section
+name is the pod name rather than "NAME".
+
+If true, the pod segment
+
+ =head1 NAME
+
+ pod::name - purpose
+
+ =head1 SYNOPSIS
+
+is converted to the C<latex>
+
+ \section{pod::name\label{pod_name}\index{pod::name}}
+
+ Purpose
+
+ \subsection*{SYNOPSIS\label{pod_name_SYNOPSIS}%
+ \index{pod::name!SYNOPSIS}}
+
+(dependent on the value of C<Head1Level> and C<LevelNoNum>). Note that
+subsequent C<head1> directives translate to subsections rather than
+sections and that the labels and index now include the pod name (dependent
+on the value of C<UniqueLabels>).
+
+The C<Label> is set from the pod name regardless of any current value
+of C<Label>.
+
+ $mod = $parser->ReplaceNAMEwithSection;
+ $parser->ReplaceNAMEwithSection(0);
+
+Default is to translate the pod literally.
+
+=cut
+
+sub ReplaceNAMEwithSection {
+ my $self = shift;
+ if (@_) {
+ $self->{ReplaceNAMEwithSection} = shift;
+ }
+ return $self->{ReplaceNAMEwithSection};
+}
+
+=item B<StartWithNewPage>
+
+If true, each pod translation will begin with a C<latex>
+C<\clearpage>.
+
+ $parser->StartWithNewPage(1);
+ $newpage = $parser->StartWithNewPage;
+
+Default is false.
+
+=cut
+
+sub StartWithNewPage {
+ my $self = shift;
+ if (@_) {
+ $self->{StartWithNewPage} = shift;
+ }
+ return $self->{StartWithNewPage};
+}
+
+=item B<TableOfContents>
+
+If true, a table of contents will be created.
+Irrelevant if C<AddPreamble> is false or C<UserPreamble>
+is set.
+
+ $toc = $parser->TableOfContents;
+ $parser->TableOfContents(1);
+
+Default is false.
+
+=cut
+
+sub TableOfContents {
+ my $self = shift;
+ if (@_) {
+ $self->{TableOfContents} = shift;
+ }
+ return $self->{TableOfContents};
+}
+
+=item B<UniqueLabels>
+
+If true, the translator will attempt to make sure that
+each C<latex> label or index entry will be uniquely identified
+by prefixing the contents of C<Label>. This allows
+multiple documents to be combined without clashing
+common labels such as C<DESCRIPTION> and C<SYNOPSIS>
+
+ $parser->UniqueLabels(1);
+ $unq = $parser->UniqueLabels;
+
+Default is true.
+
+=cut
+
+sub UniqueLabels {
+ my $self = shift;
+ if (@_) {
+ $self->{UniqueLabels} = shift;
+ }
+ return $self->{UniqueLabels};
+}
+
+=item B<UserPreamble>
+
+User supplied C<latex> preamble. Added before the pod translation
+data.
+
+If set, the contents will be prepended to the output file before the translated
+data regardless of the value of C<AddPreamble>.
+C<MakeIndex> and C<TableOfContents> will also be ignored.
+
+=cut
+
+sub UserPreamble {
+ my $self = shift;
+ if (@_) {
+ $self->{UserPreamble} = shift;
+ }
+ return $self->{UserPreamble};
+}
+
+=item B<UserPostamble>
+
+User supplied C<latex> postamble. Added after the pod translation
+data.
+
+If set, the contents will be prepended to the output file after the translated
+data regardless of the value of C<AddPostamble>.
+C<MakeIndex> will also be ignored.
+
+=cut
+
+sub UserPostamble {
+ my $self = shift;
+ if (@_) {
+ $self->{UserPostamble} = shift;
+ }
+ return $self->{UserPostamble};
+}
+
+=begin __PRIVATE__
+
+=item B<Lists>
+
+Contains details of the currently active lists.
+ The array contains C<Pod::List> objects. A new C<Pod::List>
+object is created each time a list is encountered and it is
+pushed onto this stack. When the list context ends, it
+is popped from the stack. The array will be empty if no
+lists are active.
+
+Returns array of list information in list context
+Returns array ref in scalar context
+
+=cut
+
+
+
+sub lists {
+ my $self = shift;
+ return @{ $self->{_Lists} } if wantarray();
+ return $self->{_Lists};
+}
+
+=end __PRIVATE__
+
+=back
+
+=begin __PRIVATE__
+
+=head2 Subclassed methods
+
+The following methods override methods provided in the C<Pod::Select>
+base class. See C<Pod::Parser> and C<Pod::Select> for more information
+on what these methods require.
+
+=over 4
+
+=cut
+
+######### END ACCESSORS ###################
+
+# Opening pod
+
+=item B<begin_pod>
+
+Writes the C<latex> preamble if requested.
+
+=cut
+
+sub begin_pod {
+ my $self = shift;
+
+ # Get the pod identification
+ # This should really come from the '=head1 NAME' paragraph
+
+ my $infile = $self->input_file;
+ my $class = ref($self);
+ my $date = gmtime(time);
+
+ # Comment message to say where this came from
+ my $comment = << "__TEX_COMMENT__";
+%% Latex generated from POD in document $infile
+%% Using the perl module $class
+%% Converted on $date
+__TEX_COMMENT__
+
+ # Write the preamble
+ # If the caller has supplied one then we just use that
+
+ my $preamble = '';
+ if (defined $self->UserPreamble) {
+
+ $preamble = $self->UserPreamble;
+
+ # Add the description of where this came from
+ $preamble .= "\n$comment";
+
+
+ } elsif ($self->AddPreamble) {
+ # Write our own preamble
+
+ # Code to initialise index making
+ # Use an array so that we can prepend comment if required
+ my @makeidx = (
+ '\usepackage{makeidx}',
+ '\makeindex',
+ );
+
+ unless ($self->MakeIndex) {
+ foreach (@makeidx) {
+ $_ = '%% ' . $_;
+ }
+ }
+ my $makeindex = join("\n",@makeidx) . "\n";
+
+
+ # Table of contents
+ my $tableofcontents = '\tableofcontents';
+
+ $tableofcontents = '%% ' . $tableofcontents
+ unless $self->TableOfContents;
+
+ # Roll our own
+ $preamble = << "__TEX_HEADER__";
+\\documentclass{article}
+
+$comment
+
+$makeindex
+
+\\begin{document}
+
+$tableofcontents
+
+__TEX_HEADER__
+
+ }
+
+ # Write the header (blank if none)
+ $self->_output($preamble);
+
+ # Start on new page if requested
+ $self->_output("\\clearpage\n") if $self->StartWithNewPage;
+
+}
+
+
+=item B<end_pod>
+
+Write the closing C<latex> code.
+
+=cut
+
+sub end_pod {
+ my $self = shift;
+
+ # End string
+ my $end = '';
+
+ # Use the user version of the postamble if deinfed
+ if (defined $self->UserPostamble) {
+ $end = $self->UserPostamble;
+
+ $self->_output($end);
+
+ } elsif ($self->AddPostamble) {
+
+ # Check for index
+ my $makeindex = '\printindex';
+
+ $makeindex = '%% '. $makeindex unless $self->MakeIndex;
+
+ $end = "$makeindex\n\n\\end{document}\n";
+ }
+
+
+ $self->_output($end);
+
+}
+
+=item B<command>
+
+Process basic pod commands.
+
+=cut
+
+sub command {
+ my $self = shift;
+ my ($command, $paragraph, $line_num, $parobj) = @_;
+
+ # return if we dont care
+ return if $command eq 'pod';
+
+ $paragraph = $self->_replace_special_chars($paragraph);
+
+ # Interpolate pod sequences in paragraph
+ $paragraph = $self->interpolate($paragraph, $line_num);
+
+ $paragraph =~ s/\s+$//;
+
+ # Now run the command
+ if ($command eq 'over') {
+
+ $self->begin_list($paragraph, $line_num);
+
+ } elsif ($command eq 'item') {
+
+ $self->add_item($paragraph, $line_num);
+
+ } elsif ($command eq 'back') {
+
+ $self->end_list($line_num);
+
+ } elsif ($command eq 'head1') {
+
+ # Store the name of the section
+ $self->{_CURRENT_HEAD1} = $paragraph;
+
+ # Print it
+ $self->head(1, $paragraph, $parobj);
+
+ } elsif ($command eq 'head2') {
+
+ $self->head(2, $paragraph, $parobj);
+
+ } elsif ($command eq 'head3') {
+
+ $self->head(3, $paragraph, $parobj);
+
+ } elsif ($command eq 'head4') {
+
+ $self->head(4, $paragraph, $parobj);
+
+ } elsif ($command eq 'head5') {
+
+ $self->head(5, $paragraph, $parobj);
+
+ } elsif ($command eq 'head6') {
+
+ $self->head(6, $paragraph, $parobj);
+
+ } elsif ($command eq 'begin') {
+
+ # pass through if latex
+ if ($paragraph =~ /^latex/i) {
+ # Make sure that subsequent paragraphs are not modfied before printing
+ $self->{_dont_modify_any_para} = 1;
+
+ } else {
+ # Suppress all subsequent paragraphs unless
+ # it is explcitly intended for latex
+ $self->{_suppress_all_para} = 1;
+ }
+
+ } elsif ($command eq 'for') {
+
+ # pass through if latex
+ if ($paragraph =~ /^latex/i) {
+ # Make sure that next paragraph is not modfied before printing
+ $self->{_dont_modify_next_para} = 1;
+
+ } else {
+ # Suppress the next paragraph unless it is latex
+ $self->{_suppress_next_para} = 1
+ }
+
+ } elsif ($command eq 'end') {
+
+ # Reset suppression
+ $self->{_suppress_all_para} = 0;
+ $self->{_dont_modify_any_para} = 0;
+
+ } elsif ($command eq 'pod') {
+
+ # Do nothing
+
+ } else {
+ carp "Command $command not recognised at line $line_num\n";
+ }
+
+}
+
+=item B<verbatim>
+
+Verbatim text
+
+=cut
+
+sub verbatim {
+ my $self = shift;
+ my ($paragraph, $line_num, $parobj) = @_;
+
+ # Expand paragraph unless in =for or =begin block
+ if ($self->{_dont_modify_any_para} || $self->{_dont_modify_next_para}) {
+ # Just print as is
+ $self->_output($paragraph);
+
+ # Reset flag if in =for
+ $self->{_dont_modify_next_para} = 0;
+
+ } else {
+
+ return if $paragraph =~ /^\s+$/;
+
+ # Clean trailing space
+ $paragraph =~ s/\s+$//;
+
+ # Clean tabs
+ $paragraph =~ s/\t/ /g;
+
+ $self->_output('\begin{verbatim}' . "\n$paragraph\n". '\end{verbatim}'."\n");
+ }
+}
+
+=item B<textblock>
+
+Plain text paragraph.
+
+=cut
+
+sub textblock {
+ my $self = shift;
+ my ($paragraph, $line_num, $parobj) = @_;
+
+ # print Dumper($self);
+
+ # Expand paragraph unless in =for or =begin block
+ if ($self->{_dont_modify_any_para} || $self->{_dont_modify_next_para}) {
+ # Just print as is
+ $self->_output($paragraph);
+
+ # Reset flag if in =for
+ $self->{_dont_modify_next_para} = 0;
+
+ return;
+ }
+
+
+ # Escape latex special characters
+ $paragraph = $self->_replace_special_chars($paragraph);
+
+ # Interpolate interior sequences
+ my $expansion = $self->interpolate($paragraph, $line_num);
+ $expansion =~ s/\s+$//;
+
+
+ # If we are replacing 'head1 NAME' with a section
+ # we need to look in the paragraph and rewrite things
+ # Need to make sure this is called only on the first paragraph
+ # following 'head1 NAME' and not on subsequent paragraphs that may be
+ # present.
+ if ($self->{_CURRENT_HEAD1} =~ /^NAME/i && $self->ReplaceNAMEwithSection()) {
+
+ # Strip white space from start and end
+ $paragraph =~ s/^\s+//;
+ $paragraph =~ s/\s$//;
+
+ # Split the string into 2 parts
+ my ($name, $purpose) = split(/\s+-\s+/, $expansion,2);
+
+ # Now prevent this from triggering until a new head1 NAME is set
+ $self->{_CURRENT_HEAD1} = '_NAME';
+
+ # Might want to clear the Label() before doing this (CHECK)
+
+ # Print the heading
+ $self->head(1, $name, $parobj);
+
+ # Set the labeling in case we want unique names later
+ $self->Label( $self->_create_label( $name, 1 ) );
+
+ # Raise the Head1Level by one so that subsequent =head1 appear
+ # as subsections of the main name section unless we are already
+ # at maximum [Head1Level() could check this itself - CHECK]
+ $self->Head1Level( $self->Head1Level() + 1)
+ unless $self->Head1Level == $#LatexSections;
+
+ # Now write out the new latex paragraph
+ $purpose = ucfirst($purpose);
+ $self->_output("\n\n$purpose\n\n");
+
+ } else {
+ # Just write the output
+ $self->_output("\n\n$expansion\n\n");
+ }
+
+}
+
+=item B<interior_sequence>
+
+Interior sequence expansion
+
+=cut
+
+sub interior_sequence {
+ my $self = shift;
+
+ my ($seq_command, $seq_argument, $pod_seq) = @_;
+
+ if ($seq_command eq 'B') {
+ return "\\textbf{$seq_argument}";
+
+ } elsif ($seq_command eq 'I') {
+ return "\\textit{$seq_argument}";
+
+ } elsif ($seq_command eq 'E') {
+
+ # If it is simply a number
+ if ($seq_argument =~ /^\d+$/) {
+ return chr($seq_argument);
+ # Look up escape in hash table
+ } elsif (exists $HTML_Escapes{$seq_argument}) {
+ return $HTML_Escapes{$seq_argument};
+
+ } else {
+ my ($file, $line) = $pod_seq->file_line();
+ warn "Escape sequence $seq_argument not recognised at line $line of file $file\n";
+ return;
+ }
+
+ } elsif ($seq_command eq 'Z') {
+
+ # Zero width space
+ return '$\!$'; # '
+
+ } elsif ($seq_command eq 'C') {
+ return "\\texttt{$seq_argument}";
+
+ } elsif ($seq_command eq 'F') {
+ return "\\emph{$seq_argument}";
+
+ } elsif ($seq_command eq 'S') {
+ # non breakable spaces
+ my $nbsp = '$\:$'; #'
+
+ $seq_argument =~ s/\s/$nbsp/g;
+ return $seq_argument;
+
+ } elsif ($seq_command eq 'L') {
+
+ my $link = new Pod::Hyperlink($seq_argument);
+
+ # undef on failure
+ unless (defined $link) {
+ carp $@;
+ return;
+ }
+
+ # Handle internal links differently
+ my $type = $link->type;
+ my $page = $link->page;
+
+ if ($type eq 'section' && $page eq '') {
+ # Use internal latex reference
+ my $node = $link->node;
+
+ # Convert to a label
+ $node = $self->_create_label($node);
+
+ return "\\S\\ref{$node}";
+
+ } else {
+ # Use default markup for external references
+ # (although Starlink would use \xlabel)
+ my $markup = $link->markup;
+
+ my ($file, $line) = $pod_seq->file_line();
+
+ return $self->interpolate($link->markup, $line);
+ }
+
+
+
+ } elsif ($seq_command eq 'P') {
+ # Special markup for Pod::Hyperlink
+ # Replace :: with /
+ my $link = $seq_argument;
+ $link =~ s/::/\//g;
+
+ my $ref = "\\emph{$seq_argument}";
+ return $ref;
+
+ } elsif ($seq_command eq 'Q') {
+ # Special markup for Pod::Hyperlink
+ return "\\textsf{$seq_argument}\n";
+
+ } elsif ($seq_command eq 'X') {
+ # Index entries
+
+ # use \index command
+ # I will let '!' go through for now
+ # not sure how sub categories are handled in X<>
+ my $index = $self->_create_index($seq_argument);
+ return "\\index{$index}\n";
+
+ } else {
+ carp "Unknown sequence $seq_command<$seq_argument>";
+ }
+
+}
+
+=back
+
+=head2 List Methods
+
+Methods used to handle lists.
+
+=over 4
+
+=item B<begin_list>
+
+Called when a new list is found (via the C<over> directive).
+Creates a new C<Pod::List> object and stores it on the
+list stack.
+
+ $parser->begin_list($indent, $line_num);
+
+=cut
+
+sub begin_list {
+ my $self = shift;
+ my $indent = shift;
+ my $line_num = shift;
+
+ # Indicate that a list should be started for the next item
+ # need to do this to work out the type of list
+ push ( @{$self->lists}, new Pod::List(-indent => $indent,
+ -start => $line_num,
+ -file => $self->input_file,
+ )
+ );
+
+}
+
+=item B<end_list>
+
+Called when the end of a list is found (the C<back> directive).
+Pops the C<Pod::List> object off the stack of lists and writes
+the C<latex> code required to close a list.
+
+ $parser->end_list($line_num);
+
+=cut
+
+sub end_list {
+ my $self = shift;
+ my $line_num = shift;
+
+ unless (defined $self->lists->[-1]) {
+ my $file = $self->input_file;
+ warn "No list is active at line $line_num (file=$file). Missing =over?\n";
+ return;
+ }
+
+ # What to write depends on list type
+ my $type = $self->lists->[-1]->type;
+
+ # Dont write anything if the list type is not set
+ # iomplying that a list was created but no entries were
+ # placed in it (eg because of a =begin/=end combination)
+ $self->_output("\\end{$type}\n")
+ if (defined $type && length($type) > 0);
+
+ # Clear list
+ pop(@{ $self->lists});
+
+}
+
+=item B<add_item>
+
+Add items to the list. The first time an item is encountered
+(determined from the state of the current C<Pod::List> object)
+the type of list is determined (ordered, unnumbered or description)
+and the relevant latex code issued.
+
+ $parser->add_item($paragraph, $line_num);
+
+=cut
+
+sub add_item {
+ my $self = shift;
+ my $paragraph = shift;
+ my $line_num = shift;
+
+ unless (defined $self->lists->[-1]) {
+ my $file = $self->input_file;
+ warn "List has already ended by line $line_num of file $file. Missing =over?\n";
+ # Replace special chars
+# $paragraph = $self->_replace_special_chars($paragraph);
+ $self->_output("$paragraph\n\n");
+ return;
+ }
+
+ # If paragraphs printing is turned off via =begin/=end or whatver
+ # simply return immediately
+ return if ($self->{_suppress_all_para} || $self->{_suppress_next_para});
+
+ # Check to see whether we are starting a new lists
+ if (scalar($self->lists->[-1]->item) == 0) {
+
+ # Examine the paragraph to determine what type of list
+ # we have
+ $paragraph =~ s/\s+$//;
+ $paragraph =~ s/^\s+//;
+
+ my $type;
+ if (substr($paragraph, 0,1) eq '*') {
+ $type = 'itemize';
+ } elsif ($paragraph =~ /^\d/) {
+ $type = 'enumerate';
+ } else {
+ $type = 'description';
+ }
+ $self->lists->[-1]->type($type);
+
+ $self->_output("\\begin{$type}\n");
+
+ }
+
+ my $type = $self->lists->[-1]->type;
+
+ if ($type eq 'description') {
+ # Handle long items - long items do not wrap
+ if (length($paragraph) < 40) {
+ # A real description list item
+ $self->_output("\\item[$paragraph] \\mbox{}");
+ } else {
+ # The item is now simply bold text
+ $self->_output(qq{\\item \\textbf{$paragraph}});
+ }
+
+ } else {
+ # If the item was '* Something' we still need to write
+ # out the something
+ my $extra_info = $paragraph;
+ $extra_info =~ s/^\*\s*//;
+ $self->_output("\\item $extra_info");
+ }
+
+ # Store the item name in the object. Required so that
+ # we can tell if the list is new or not
+ $self->lists->[-1]->item($paragraph);
+
+}
+
+=back
+
+=head2 Methods for headings
+
+=over 4
+
+=item B<head>
+
+Print a heading of the required level.
+
+ $parser->head($level, $paragraph, $parobj);
+
+The first argument is the pod heading level. The second argument
+is the contents of the heading. The 3rd argument is a Pod::Paragraph
+object so that the line number can be extracted.
+
+=cut
+
+sub head {
+ my $self = shift;
+ my $num = shift;
+ my $paragraph = shift;
+ my $parobj = shift;
+
+ # If we are replace 'head1 NAME' with a section
+ # we return immediately if we get it
+ return
+ if ($self->{_CURRENT_HEAD1} =~ /^NAME/i && $self->ReplaceNAMEwithSection());
+
+ # Create a label
+ my $label = $self->_create_label($paragraph);
+
+ # Create an index entry
+ my $index = $self->_create_index($paragraph);
+
+ # Work out position in the above array taking into account
+ # that =head1 is equivalent to $self->Head1Level
+
+ my $level = $self->Head1Level() - 1 + $num;
+
+ # Warn if heading to large
+ if ($num > $#LatexSections) {
+ my $line = $parobj->file_line;
+ my $file = $self->input_file;
+ warn "Heading level too large ($level) for LaTeX at line $line of file $file\n";
+ $level = $#LatexSections;
+ }
+
+ # Check to see whether section should be unnumbered
+ my $star = ($level >= $self->LevelNoNum ? '*' : '');
+
+ # Section
+ $self->_output("\\" .$LatexSections[$level] .$star ."{$paragraph\\label{".$label ."}\\index{".$index."}}");
+
+}
+
+
+=back
+
+=end __PRIVATE__
+
+=begin __PRIVATE__
+
+=head2 Internal methods
+
+Internal routines are described in this section. They do not form part of the
+public interface. All private methods start with an underscore.
+
+=over 4
+
+=item B<_output>
+
+Output text to the output filehandle. This method must be always be called
+to output parsed text.
+
+ $parser->_output($text);
+
+Does not write anything if a =begin or =for is active that should be
+ignored.
+
+=cut
+
+sub _output {
+ my $self = shift;
+ my $text = shift;
+
+ print { $self->output_handle } $text
+ unless $self->{_suppress_all_para} ||
+ $self->{_suppress_next_para};
+
+ # Reset pargraph stuff for =for
+ $self->{_suppress_next_para} = 0
+ if $self->{_suppress_next_para};
+}
+
+
+=item B<_replace_special_chars>
+
+Subroutine to replace characters that are special in C<latex>
+with the escaped forms
+
+ $escaped = $parser->_replace_special_chars($paragraph);
+
+Need to call this routine before interior_sequences are munged but
+not if verbatim.
+
+Special characters and the C<latex> equivalents are:
+
+ } \}
+ { \{
+ _ \_
+ $ \$
+ % \%
+ & \&
+ \ $\backslash$
+ ^ \^{}
+ ~ \~{}
+ | $|$
+
+=cut
+
+sub _replace_special_chars {
+ my $self = shift;
+ my $paragraph = shift;
+
+ # Replace a \ with $\backslash$
+ # This is made more complicated because the dollars will be escaped
+ # by the subsequent replacement. Easiest to add \backslash
+ # now and then add the dollars
+ $paragraph =~ s/\\/\\backslash/g;
+
+ # Must be done after escape of \ since this command adds latex escapes
+ # Replace characters that can be escaped
+ $paragraph =~ s/([\$\#&%_{}])/\\$1/g;
+
+ # Replace ^ characters with \^{} so that $^F works okay
+ $paragraph =~ s/(\^)/\\$1\{\}/g;
+
+ # Replace tilde (~) with \texttt{\~{}}
+ $paragraph =~ s/~/\\texttt\{\\~\{\}\}/g;
+
+ # Replace | with $|$
+ $paragraph =~ s'\|'$|$'g;
+
+ # Now add the dollars around each \backslash
+ $paragraph =~ s/(\\backslash)/\$$1\$/g;
+
+ return $paragraph;
+}
+
+
+=item B<_create_label>
+
+Return a string that can be used as an internal reference
+in a C<latex> document (i.e. accepted by the C<\label> command)
+
+ $label = $parser->_create_label($string)
+
+If UniqueLabels is true returns a label prefixed by Label()
+This can be suppressed with an optional second argument.
+
+ $label = $parser->_create_label($string, $suppress);
+
+If a second argument is supplied (of any value including undef)
+the Label() is never prefixed. This means that this routine can
+be called to create a Label() without prefixing a previous setting.
+
+=cut
+
+sub _create_label {
+ my $self = shift;
+ my $paragraph = shift;
+ my $suppress = (@_ ? 1 : 0 );
+
+ # Remove latex commands
+ $paragraph = $self->_clean_latex_commands($paragraph);
+
+ # Remove non alphanumerics from the label and replace with underscores
+ # want to protect '-' though so use negated character classes
+ $paragraph =~ s/[^-:\w]/_/g;
+
+ # Multiple underscores will look unsightly so remove repeats
+ # This will also have the advantage of tidying up the end and
+ # start of string
+ $paragraph =~ s/_+/_/g;
+
+ # If required need to make sure that the label is unique
+ # since it is possible to have multiple pods in a single
+ # document
+ if (!$suppress && $self->UniqueLabels() && defined $self->Label) {
+ $paragraph = $self->Label() .'_'. $paragraph;
+ }
+
+ return $paragraph;
+}
+
+
+=item B<_create_index>
+
+Similar to C<_create_label> except an index entry is created.
+If C<UniqueLabels> is true, the index entry is prefixed by
+the current C<Label> and an exclamation mark.
+
+ $ind = $parser->_create_index($paragraph);
+
+An exclamation mark is used by C<makeindex> to generate
+sub-entries in an index.
+
+=cut
+
+sub _create_index {
+ my $self = shift;
+ my $paragraph = shift;
+ my $suppress = (@_ ? 1 : 0 );
+
+ # Remove latex commands
+ $paragraph = $self->_clean_latex_commands($paragraph);
+
+ # If required need to make sure that the index entry is unique
+ # since it is possible to have multiple pods in a single
+ # document
+ if (!$suppress && $self->UniqueLabels() && defined $self->Label) {
+ $paragraph = $self->Label() .'!'. $paragraph;
+ }
+
+ # Need to replace _ with space
+ $paragraph =~ s/_/ /g;
+
+ return $paragraph;
+
+}
+
+=item B<_clean_latex_commands>
+
+Removes latex commands from text. The latex command is assumed to be of the
+form C<\command{ text }>. "C<text>" is retained
+
+ $clean = $parser->_clean_latex_commands($text);
+
+=cut
+
+sub _clean_latex_commands {
+ my $self = shift;
+ my $paragraph = shift;
+
+ # Remove latex commands of the form \text{ }
+ # and replace with the contents of the { }
+ # need to make this non-greedy so that it can handle
+ # "\text{a} and \text2{b}"
+ # without converting it to
+ # "a} and \text2{b"
+ # This match will still get into trouble if \} is present
+ # This is not vital since the subsequent replacement of non-alphanumeric
+ # characters will tidy it up anyway
+ $paragraph =~ s/\\\w+{(.*?)}/$1/g;
+
+ return $paragraph
+}
+
+=back
+
+=end __PRIVATE__
+
+=head1 NOTES
+
+Compatible with C<latex2e> only. Can not be used with C<latex> v2.09
+or earlier.
+
+A subclass of C<Pod::Select> so that specific pod sections can be
+converted to C<latex> by using the C<select> method.
+
+Some HTML escapes are missing and many have not been tested.
+
+=head1 SEE ALSO
+
+L<Pod::Parser>, L<Pod::Select>, L<pod2latex>
+
+=head1 AUTHORS
+
+Tim Jenness E<lt>t.jenness@jach.hawaii.eduE<gt>
+
+=head1 COPYRIGHT
+
+Copyright (C) 2000 Tim Jenness. All Rights Reserved.
+
+This program is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=begin __PRIVATE__
+
+=head1 REVISION
+
+$Id: LaTeX.pm,v 1.1.1.1 2001/05/24 18:23:35 millert Exp $
+
+=end __PRIVATE__
+
+=cut
diff --git a/gnu/usr.bin/perl/lib/Pod/ParseUtils.pm b/gnu/usr.bin/perl/lib/Pod/ParseUtils.pm
index 2cb8cdcd3bc..7d994c750bd 100644
--- a/gnu/usr.bin/perl/lib/Pod/ParseUtils.pm
+++ b/gnu/usr.bin/perl/lib/Pod/ParseUtils.pm
@@ -10,7 +10,7 @@
package Pod::ParseUtils;
use vars qw($VERSION);
-$VERSION = 0.2; ## Current version of this package
+$VERSION = 0.22; ## Current version of this package
require 5.005; ## requires this Perl version or later
=head1 NAME
@@ -49,7 +49,7 @@ The following methods are available:
=over 4
-=item new()
+=item Pod::List-E<gt>new()
Create a new list object. Properties may be specified through a hash
reference like this:
@@ -79,7 +79,7 @@ sub initialize {
$self->{-type} ||= '';
}
-=item file()
+=item $list-E<gt>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()>
@@ -92,7 +92,7 @@ sub file {
return (@_ > 1) ? ($_[0]->{-file} = $_[1]) : $_[0]->{-file};
}
-=item start()
+=item $list-E<gt>start()
Without argument, retrieves the line number where the list started.
This must have been set before by either specifying B<-start> in the
@@ -106,7 +106,7 @@ sub start {
return (@_ > 1) ? ($_[0]->{-start} = $_[1]) : $_[0]->{-start};
}
-=item indent()
+=item $list-E<gt>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
@@ -120,7 +120,7 @@ sub indent {
return (@_ > 1) ? ($_[0]->{-indent} = $_[1]) : $_[0]->{-indent};
}
-=item type()
+=item $list-E<gt>type()
Without argument, retrieves the list type, which can be an arbitrary value,
e.g. C<OL>, C<UL>, ... when thinking the HTML way.
@@ -135,7 +135,7 @@ sub type {
return (@_ > 1) ? ($_[0]->{-type} = $_[1]) : $_[0]->{-type};
}
-=item rx()
+=item $list-E<gt>rx()
Without argument, retrieves a regular expression for simplifying the
individual item strings once the list type has been determined. Usage:
@@ -152,7 +152,7 @@ sub rx {
return (@_ > 1) ? ($_[0]->{-rx} = $_[1]) : $_[0]->{-rx};
}
-=item item()
+=item $list-E<gt>item()
Without argument, retrieves the array of the items in this list.
The items may be represented by any scalar.
@@ -172,7 +172,7 @@ sub item {
}
}
-=item parent()
+=item $list-E<gt>parent()
Without argument, retrieves information about the parent holding this
list, which is represented as an arbitrary scalar.
@@ -188,7 +188,7 @@ sub parent {
return (@_ > 1) ? ($_[0]->{-parent} = $_[1]) : $_[0]->{-parent};
}
-=item tag()
+=item $list-E<gt>tag()
Without argument, retrieves information about the list tag, which can be
any scalar.
@@ -227,7 +227,7 @@ used to construct hyperlinks.
=over 4
-=item new()
+=item Pod::Hyperlink-E<gt>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
@@ -269,10 +269,14 @@ sub initialize {
$self->{_warnings} = [];
}
-=item parse($string)
+=item $link-E<gt>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.
+Warnings are stored in the B<warnings> property.
+E.g. sections like C<LE<lt>open(2)E<gt>> are deprected, as they do not point
+to Perl documents. C<LE<lt>DBI::foo(3p)E<gt>> is wrong as well, the manpage
+section can simply be dropped.
=cut
@@ -280,14 +284,13 @@ sub parse {
my $self = shift;
local($_) = $_[0];
# syntax check the link and extract destination
- my ($alttext,$page,$node,$type) = ('','','','');
+ my ($alttext,$page,$node,$type) = (undef,'','','');
$self->{_warnings} = [];
# collapse newlines with whitespace
- if(s/\s*\n+\s*/ /g) {
- $self->warning("collapsing newlines to blanks");
- }
+ s/\s*\n+\s*/ /g;
+
# strip leading/trailing whitespace
if(s/^[\s\n]+//) {
$self->warning("ignoring leading whitespace in link");
@@ -308,25 +311,24 @@ sub parse {
# 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.]+)*';
+ my $page_rx = '[\w.]+(?:::[\w.]+)*(?:[(](?:\d\w*|)[)]|)';
+ # page name only
if(m!^($page_rx)$!o) {
$page = $1;
$type = 'page';
}
# alttext, page and "section"
- elsif(m!^(.+?)\s*[|]\s*($page_rx)\s*/\s*"(.+)"$!o) {
+ 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) {
+ elsif(m!^(.*?)\s*[|]\s*($page_rx)$!o) {
($alttext, $page) = ($1, $2);
$type = 'page';
}
# alttext and "section"
- elsif(m!^(.+?)\s*[|]\s*(?:/\s*|)"(.+)"$!) {
+ elsif(m!^(.*?)\s*[|]\s*(?:/\s*|)"(.+)"$!) {
($alttext, $node) = ($1,$2);
$type = 'section';
}
@@ -356,16 +358,16 @@ sub parse {
$type = 'hyperlink';
}
# alttext, page and item
- elsif(m!^(.+?)\s*[|]\s*($page_rx)\s*/\s*(.+)$!o) {
+ elsif(m!^(.*?)\s*[|]\s*($page_rx)\s*/\s*(.+)$!o) {
($alttext, $page, $node) = ($1, $2, $3);
$type = 'item';
}
# alttext and item
- elsif(m!^(.+?)\s*[|]\s*/(.+)$!) {
+ elsif(m!^(.*?)\s*[|]\s*/(.+)$!) {
($alttext, $node) = ($1,$2);
}
# nonstandard: alttext and hyperlink
- elsif(m!^(.+?)\s*[|]\s*((?:http|ftp|mailto|news):.+)$!) {
+ elsif(m!^(.*?)\s*[|]\s*((?:http|ftp|mailto|news):.+)$!) {
($alttext, $node) = ($1,$2);
$type = 'hyperlink';
}
@@ -377,9 +379,19 @@ sub parse {
# collapse whitespace in nodes
$node =~ s/\s+/ /gs;
- #if($page =~ /[(]\w*[)]$/) {
- # $self->warning("section in '$page' deprecated");
- #}
+ # empty alternative text expands to node name
+ if(defined $alttext) {
+ if(!length($alttext)) {
+ $alttext = $node | $page;
+ }
+ }
+ else {
+ $alttext = '';
+ }
+
+ if($page =~ /[(]\w*[)]$/) {
+ $self->warning("(section) in '$page' deprecated");
+ }
if($node =~ m:[|/]:) {
$self->warning("node '$node' contains non-escaped | or /");
}
@@ -435,7 +447,7 @@ sub _construct_text {
}
}
-=item markup($string)
+=item $link-E<gt>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
@@ -450,7 +462,7 @@ sub markup {
return (@_ > 1) ? ($_[0]->{_markup} = $_[1]) : $_[0]->{_markup};
}
-=item text()
+=item $link-E<gt>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
@@ -469,7 +481,7 @@ sub text {
$_[0]->{_text};
}
-=item warning()
+=item $link-E<gt>warning()
After parsing, this method returns any warnings encountered during the
parsing process.
@@ -486,7 +498,9 @@ sub warning {
return @{$self->{_warnings}};
}
-=item line(), file()
+=item $link-E<gt>file()
+
+=item $link-E<gt>line()
Just simple slots for storing information about the line and the file
the link was encountered in. Has to be filled in manually.
@@ -503,7 +517,7 @@ sub file {
return (@_ > 1) ? ($_[0]->{-file} = $_[1]) : $_[0]->{-file};
}
-=item page()
+=item $link-E<gt>page()
This method sets or returns the POD page this link points to.
@@ -518,7 +532,7 @@ sub page {
$_[0]->{-page};
}
-=item node()
+=item $link-E<gt>node()
As above, but the destination node text of the link.
@@ -533,7 +547,7 @@ sub node {
$_[0]->{-node};
}
-=item alttext()
+=item $link-E<gt>alttext()
Sets or returns an alternative text specified in the link.
@@ -548,7 +562,7 @@ sub alttext {
$_[0]->{-alttext};
}
-=item type()
+=item $link-E<gt>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>>
@@ -560,7 +574,7 @@ sub type {
return (@_ > 1) ? ($_[0]->{-type} = $_[1]) : $_[0]->{-type};
}
-=item link()
+=item $link-E<gt>link()
Returns the link as contents of C<LE<lt>E<gt>>. Reciprocal to B<parse()>.
@@ -620,7 +634,7 @@ The following methods are available:
=over 4
-=item new()
+=item Pod::Cache-E<gt>new()
Create a new cache object. This object can hold an arbitrary number of
POD documents of class Pod::Cache::Item.
@@ -635,7 +649,7 @@ sub new {
return $self;
}
-=item item()
+=item $cache-E<gt>item()
Add a new item to the cache. Without arguments, this method returns a
list of all cache elements.
@@ -654,7 +668,7 @@ sub item {
}
}
-=item find_page($name)
+=item $cache-E<gt>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
@@ -686,7 +700,7 @@ The following methods are available:
=over 4
-=item new()
+=item Pod::Cache::Item-E<gt>new()
Create a new object.
@@ -707,7 +721,7 @@ sub initialize {
$self->{-nodes} = [] unless(defined $self->{-nodes});
}
-=item page()
+=item $cacheitem-E<gt>page()
Set/retrieve the POD document name (e.g. "Pod::Parser").
@@ -718,7 +732,7 @@ sub page {
return (@_ > 1) ? ($_[0]->{-page} = $_[1]) : $_[0]->{-page};
}
-=item description()
+=item $cacheitem-E<gt>description()
Set/retrieve the POD short description as found in the C<=head1 NAME>
section.
@@ -730,7 +744,7 @@ sub description {
return (@_ > 1) ? ($_[0]->{-description} = $_[1]) : $_[0]->{-description};
}
-=item path()
+=item $cacheitem-E<gt>path()
Set/retrieve the POD file storage path.
@@ -741,7 +755,7 @@ sub path {
return (@_ > 1) ? ($_[0]->{-path} = $_[1]) : $_[0]->{-path};
}
-=item file()
+=item $cacheitem-E<gt>file()
Set/retrieve the POD file name.
@@ -752,7 +766,7 @@ sub file {
return (@_ > 1) ? ($_[0]->{-file} = $_[1]) : $_[0]->{-file};
}
-=item nodes()
+=item $cacheitem-E<gt>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.
@@ -775,14 +789,12 @@ sub nodes {
}
}
-=item find_node($name)
+=item $cacheitem-E<gt>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 {
@@ -798,7 +810,7 @@ sub find_node {
undef;
}
-=item idx()
+=item $cacheitem-E<gt>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.
@@ -807,6 +819,8 @@ same order the entries have been added.
An index entry can be any scalar, but usually is a pair of string and
unique id.
+=back
+
=cut
# The POD index entries
diff --git a/gnu/usr.bin/perl/lib/Pod/Parser.pm b/gnu/usr.bin/perl/lib/Pod/Parser.pm
index 48fc198ded7..6782519d96d 100644
--- a/gnu/usr.bin/perl/lib/Pod/Parser.pm
+++ b/gnu/usr.bin/perl/lib/Pod/Parser.pm
@@ -10,7 +10,7 @@
package Pod::Parser;
use vars qw($VERSION);
-$VERSION = 1.12; ## Current version of this package
+$VERSION = 1.13; ## Current version of this package
require 5.005; ## requires this Perl version or later
#############################################################################
@@ -205,7 +205,6 @@ use strict;
use Pod::InputObjects;
use Carp;
use Exporter;
-require VMS::Filespec if $^O eq 'VMS';
BEGIN {
if ($] < 5.6) {
require Symbol;
@@ -783,11 +782,11 @@ sub parse_text {
## Iterate over all sequence starts text (NOTE: split with
## capturing parens keeps the delimiters)
$_ = $text;
- my @tokens = split /([A-Z]<(?:<+\s+)?)/;
+ my @tokens = split /([A-Z]<(?:<+\s)?)/;
while ( @tokens ) {
$_ = shift @tokens;
## Look for the beginning of a sequence
- if ( /^([A-Z])(<(?:<+\s+)?)$/ ) {
+ if ( /^([A-Z])(<(?:<+\s)?)$/ ) {
## Push a new sequence onto the stack of those "in-progress"
($cmd, $ldelim) = ($1, $2);
$seq = Pod::InteriorSequence->new(
@@ -848,7 +847,6 @@ sub parse_text {
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/;
@@ -1081,10 +1079,9 @@ sub parse_from_filehandle {
&& (length $paragraph));
## Issue a warning about any non-empty blank lines
- if (length($1) > 1 and $myOpts{'-warnings'} and ! $myData{_CUTTING}) {
+ if (length($1) > 0 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)
diff --git a/gnu/usr.bin/perl/lib/Pod/Select.pm b/gnu/usr.bin/perl/lib/Pod/Select.pm
index 5dd1595107e..e7c820f3503 100644
--- a/gnu/usr.bin/perl/lib/Pod/Select.pm
+++ b/gnu/usr.bin/perl/lib/Pod/Select.pm
@@ -10,7 +10,7 @@
package Pod::Select;
use vars qw($VERSION);
-$VERSION = 1.12; ## Current version of this package
+$VERSION = 1.13; ## Current version of this package
require 5.005; ## requires this Perl version or later
#############################################################################
@@ -92,7 +92,7 @@ The formal syntax of a section specification is:
=over 4
-=item
+=item *
I<head1-title-regex>/I<head2-title-regex>/...
@@ -109,33 +109,39 @@ Some example section specifications follow.
=over 4
-=item
+=item *
+
Match the C<NAME> and C<SYNOPSIS> sections and all of their subsections:
C<NAME|SYNOPSIS>
-=item
+=item *
+
Match only the C<Question> and C<Answer> subsections of the C<DESCRIPTION>
section:
C<DESCRIPTION/Question|Answer>
-=item
+=item *
+
Match the C<Comments> subsection of I<all> sections:
C</Comments>
-=item
+=item *
+
Match all subsections of C<DESCRIPTION> I<except> for C<Comments>:
C<DESCRIPTION/!Comments>
-=item
+=item *
+
Match the C<DESCRIPTION> section but do I<not> match any of its subsections:
C<DESCRIPTION/!.+>
-=item
+=item *
+
Match all top level sections but none of their subsections:
C</!.+>
@@ -160,7 +166,7 @@ The formal syntax of a range specification is:
=over 4
-=item
+=item *
/I<start-range-regex>/[../I<end-range-regex>/]
diff --git a/gnu/usr.bin/perl/lib/Pod/Text/Overstrike.pm b/gnu/usr.bin/perl/lib/Pod/Text/Overstrike.pm
new file mode 100644
index 00000000000..4664ef020ee
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Pod/Text/Overstrike.pm
@@ -0,0 +1,160 @@
+# Pod::Text::Overstrike -- Convert POD data to formatted overstrike text
+# $Id: Overstrike.pm,v 1.1.1.1 2001/05/24 18:23:37 millert Exp $
+#
+# Created by Joe Smith <Joe.Smith@inwap.com> 30-Nov-2000
+# (based on Pod::Text::Color 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 was written because the output from:
+#
+# pod2text Text.pm > plain.txt; less plain.txt
+#
+# is not as rich as the output from
+#
+# pod2man Text.pm | nroff -man > fancy.txt; less fancy.txt
+#
+# and because both Pod::Text::Color and Pod::Text::Termcap are not device
+# independent.
+
+############################################################################
+# Modules and declarations
+############################################################################
+
+package Pod::Text::Overstrike;
+
+require 5.004;
+
+use Pod::Text ();
+
+use strict;
+use vars qw(@ISA $VERSION);
+
+@ISA = qw(Pod::Text);
+
+# 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.01;
+
+
+############################################################################
+# Overrides
+############################################################################
+
+# Make level one headings bold, overridding any existing formatting.
+sub cmd_head1 {
+ my $self = shift;
+ local $_ = shift;
+ s/\s+$//;
+ s/(.)\cH\1//g;
+ s/_\cH//g;
+ s/(.)/$1\b$1/g;
+ $self->SUPER::cmd_head1 ($_);
+}
+
+# Make level two headings bold, overriding any existing formatting.
+sub cmd_head2 {
+ my $self = shift;
+ local $_ = shift;
+ s/\s+$//;
+ s/(.)\cH\1//g;
+ s/_\cH//g;
+ s/(.)/$1\b$1/g;
+ $self->SUPER::cmd_head2 ($_);
+}
+
+# Make level three headings underscored, overriding any existing formatting.
+sub cmd_head3 {
+ my $self = shift;
+ local $_ = shift;
+ s/\s+$//;
+ s/(.)\cH\1//g;
+ s/_\cH//g;
+ s/(.)/_\b$1/g;
+ $self->SUPER::cmd_head3 ($_);
+}
+
+# Fix the various interior sequences.
+sub seq_b { local $_ = $_[1]; s/(.)\cH\1//g; s/_\cH//g; s/(.)/$1\b$1/g; $_ }
+sub seq_f { local $_ = $_[1]; s/(.)\cH\1//g; s/_\cH//g; s/(.)/_\b$1/g; $_ }
+sub seq_i { local $_ = $_[1]; s/(.)\cH\1//g; s/_\cH//g; s/(.)/_\b$1/g; $_ }
+
+# 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/^((?:(?:[^\n]\cH)?[^\n]){0,$width})\s+//
+ || s/^((?:(?:[^\n]\cH)?[^\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::Overstrike - Convert POD data to formatted overstrike text
+
+=head1 SYNOPSIS
+
+ use Pod::Text::Overstrike;
+ my $parser = Pod::Text::Overstrike->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::Overstrike is a simple subclass of Pod::Text that highlights
+output text using overstrike sequences, in a manner similar to nroff.
+Characters in bold text are overstruck (character, backspace, character) and
+characters in underlined text are converted to overstruck underscores
+(underscore, backspace, character). This format was originally designed for
+hardcopy terminals and/or lineprinters, yet is readable on softcopy (CRT)
+terminals.
+
+Overstruck text is best viewed by page-at-a-time programs that take
+advantage of the terminal's B<stand-out> and I<underline> capabilities, such
+as the less program on Unix.
+
+Apart from the overstrike, it in all ways functions like Pod::Text. See
+L<Pod::Text> for details and available options.
+
+=head1 BUGS
+
+Currently, the outermost formatting instruction wins, so for example
+underlined text inside a region of bold text is displayed as simply bold.
+There may be some better approach possible.
+
+=head1 SEE ALSO
+
+L<Pod::Text|Pod::Text>, L<Pod::Parser|Pod::Parser>
+
+=head1 AUTHOR
+
+Joe Smith E<lt>Joe.Smith@inwap.comE<gt>, using the framework created by Russ
+Allbery E<lt>rra@stanford.eduE<gt>.
+
+=cut
diff --git a/gnu/usr.bin/perl/lib/Pod/Usage.pm b/gnu/usr.bin/perl/lib/Pod/Usage.pm
index aa8f712dcf5..388607617d1 100644
--- a/gnu/usr.bin/perl/lib/Pod/Usage.pm
+++ b/gnu/usr.bin/perl/lib/Pod/Usage.pm
@@ -10,7 +10,7 @@
package Pod::Usage;
use vars qw($VERSION);
-$VERSION = 1.12; ## Current version of this package
+$VERSION = 1.14; ## Current version of this package
require 5.005; ## requires this Perl version or later
=head1 NAME
@@ -46,7 +46,7 @@ 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
+=over 4
=item *
@@ -68,7 +68,7 @@ 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
+=over 4
=item C<-message>
@@ -80,6 +80,9 @@ program's usage message.
=item C<-exitval>
The desired exit status to pass to the B<exit()> function.
+This should be an integer, or else the string "NOEXIT" to
+indicate that control should simply be returned without
+terminating the invoking process.
=item C<-verbose>
@@ -129,7 +132,7 @@ Unless they are explicitly specified, the default values for the exit
status, verbose level, and output stream to use are determined as
follows:
-=over
+=over 4
=item *
@@ -159,7 +162,7 @@ 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
+=over 4
=item *
@@ -395,6 +398,7 @@ with re-writing this manpage.
use strict;
#use diagnostics;
use Carp;
+use Config;
use Exporter;
use File::Spec;
@@ -497,8 +501,19 @@ sub pod2usage {
}
## Now translate the pod document and then exit with the desired status
- $parser->parse_from_file($opts{"-input"}, $opts{"-output"});
- exit($opts{"-exitval"});
+ if ( $opts{"-verbose"} >= 2
+ and !ref($opts{"-input"})
+ and $opts{"-output"} == \*STDOUT )
+ {
+ ## spit out the entire PODs. Might as well invoke perldoc
+ my $progpath = File::Spec->catfile($Config{bin}, "perldoc");
+ system($progpath, $opts{"-input"});
+ }
+ else {
+ $parser->parse_from_file($opts{"-input"}, $opts{"-output"});
+ }
+
+ exit($opts{"-exitval"}) unless (lc($opts{"-exitval"}) eq 'noexit');
}
##---------------------------------------------------------------------------
diff --git a/gnu/usr.bin/perl/lib/Test.pm b/gnu/usr.bin/perl/lib/Test.pm
index c708f57a050..4a38d546689 100644
--- a/gnu/usr.bin/perl/lib/Test.pm
+++ b/gnu/usr.bin/perl/lib/Test.pm
@@ -1,11 +1,10 @@
use strict;
package Test;
-use 5.005_64;
use Test::Harness 1.1601 ();
use Carp;
our($VERSION, @ISA, @EXPORT, @EXPORT_OK, $ntest, $TestLevel); #public-ish
our($TESTOUT, $ONFAIL, %todo, %history, $planned, @FAILDETAIL); #private-ish
-$VERSION = '1.13';
+$VERSION = '1.15';
require Exporter;
@ISA=('Exporter');
@EXPORT=qw(&plan &ok &skip);
@@ -82,8 +81,16 @@ sub ok ($;$$) {
$context .= ' TODO?!' if $todo;
print $TESTOUT "ok $ntest # ($context)\n";
} else {
- print $TESTOUT "not " if !$ok;
- print $TESTOUT "ok $ntest\n";
+ # Issuing two separate print()s causes severe trouble with
+ # Test::Harness on VMS. The "not "'s for failed tests occur
+ # on a separate line and would not get counted as failures.
+ #print $TESTOUT "not " if !$ok;
+ #print $TESTOUT "ok $ntest\n";
+ # Replace with a single print() as a workaround:
+ my $okline = '';
+ $okline = "not " if !$ok;
+ $okline .= "ok $ntest\n";
+ print $TESTOUT $okline;
if (!$ok) {
my $detail = { 'repetition' => $repetition, 'package' => $pkg,
@@ -178,9 +185,9 @@ __END__
=head1 DESCRIPTION
-L<Test::Harness> expects to see particular output when it executes
-tests. This module aims to make writing proper test scripts just a
-little bit easier (and less error prone :-).
+L<Test::Harness|Test::Harness> expects to see particular output when it
+executes tests. This module aims to make writing proper test scripts just
+a little bit easier (and less error prone :-).
=head1 TEST TYPES
diff --git a/gnu/usr.bin/perl/lib/Tie/Array.pm b/gnu/usr.bin/perl/lib/Tie/Array.pm
index eb83aaee17a..f4c61935965 100644
--- a/gnu/usr.bin/perl/lib/Tie/Array.pm
+++ b/gnu/usr.bin/perl/lib/Tie/Array.pm
@@ -8,73 +8,70 @@ our $VERSION = '1.01';
# Pod documentation after __END__ below.
sub DESTROY { }
-sub EXTEND { }
-sub UNSHIFT { shift->SPLICE(0,0,@_) }
-sub SHIFT { shift->SPLICE(0,1) }
+sub EXTEND { }
+sub UNSHIFT { scalar shift->SPLICE(0,0,@_) }
+sub SHIFT { shift->SPLICE(0,1) }
+#sub SHIFT { (shift->SPLICE(0,1))[0] }
sub CLEAR { shift->STORESIZE(0) }
-sub PUSH
-{
+sub PUSH
+{
my $obj = shift;
my $i = $obj->FETCHSIZE;
$obj->STORE($i++, shift) while (@_);
}
-sub POP
+sub POP
{
my $obj = shift;
my $newsize = $obj->FETCHSIZE - 1;
my $val;
- if ($newsize >= 0)
+ if ($newsize >= 0)
{
$val = $obj->FETCH($newsize);
$obj->STORESIZE($newsize);
}
$val;
-}
+}
-sub SPLICE
-{
- my $obj = shift;
- my $sz = $obj->FETCHSIZE;
- my $off = (@_) ? shift : 0;
- $off += $sz if ($off < 0);
- my $len = (@_) ? shift : $sz - $off;
- my @result;
- for (my $i = 0; $i < $len; $i++)
- {
- push(@result,$obj->FETCH($off+$i));
- }
- if (@_ > $len)
- {
- # Move items up to make room
- my $d = @_ - $len;
- my $e = $off+$len;
- $obj->EXTEND($sz+$d);
- for (my $i=$sz-1; $i >= $e; $i--)
- {
- my $val = $obj->FETCH($i);
- $obj->STORE($i+$d,$val);
+sub SPLICE {
+ my $obj = shift;
+ my $sz = $obj->FETCHSIZE;
+ my $off = (@_) ? shift : 0;
+ $off += $sz if ($off < 0);
+ my $len = (@_) ? shift : $sz - $off;
+ $len += $sz - $off if $len < 0;
+ my @result;
+ for (my $i = 0; $i < $len; $i++) {
+ push(@result,$obj->FETCH($off+$i));
}
- }
- elsif (@_ < $len)
- {
- # Move items down to close the gap
- my $d = $len - @_;
- my $e = $off+$len;
- for (my $i=$off+$len; $i < $sz; $i++)
- {
- my $val = $obj->FETCH($i);
- $obj->STORE($i-$d,$val);
+ $off = $sz if $off > $sz;
+ $len -= $off + $len - $sz if $off + $len > $sz;
+ if (@_ > $len) {
+ # Move items up to make room
+ my $d = @_ - $len;
+ my $e = $off+$len;
+ $obj->EXTEND($sz+$d);
+ for (my $i=$sz-1; $i >= $e; $i--) {
+ my $val = $obj->FETCH($i);
+ $obj->STORE($i+$d,$val);
+ }
}
- $obj->STORESIZE($sz-$d);
- }
- for (my $i=0; $i < @_; $i++)
- {
- $obj->STORE($off+$i,$_[$i]);
- }
- return @result;
-}
+ elsif (@_ < $len) {
+ # Move items down to close the gap
+ my $d = $len - @_;
+ my $e = $off+$len;
+ for (my $i=$off+$len; $i < $sz; $i++) {
+ my $val = $obj->FETCH($i);
+ $obj->STORE($i-$d,$val);
+ }
+ $obj->STORESIZE($sz-$d);
+ }
+ for (my $i=0; $i < @_; $i++) {
+ $obj->STORE($off+$i,$_[$i]);
+ }
+ return @result;
+}
sub EXISTS {
my $pkg = ref $_[0];
@@ -91,21 +88,21 @@ use vars qw(@ISA);
@ISA = 'Tie::Array';
sub TIEARRAY { bless [], $_[0] }
-sub FETCHSIZE { scalar @{$_[0]} }
-sub STORESIZE { $#{$_[0]} = $_[1]-1 }
+sub FETCHSIZE { scalar @{$_[0]} }
+sub STORESIZE { $#{$_[0]} = $_[1]-1 }
sub STORE { $_[0]->[$_[1]] = $_[2] }
sub FETCH { $_[0]->[$_[1]] }
sub CLEAR { @{$_[0]} = () }
-sub POP { pop(@{$_[0]}) }
+sub POP { pop(@{$_[0]}) }
sub PUSH { my $o = shift; push(@$o,@_) }
-sub SHIFT { shift(@{$_[0]}) }
-sub UNSHIFT { my $o = shift; unshift(@$o,@_) }
+sub SHIFT { shift(@{$_[0]}) }
+sub UNSHIFT { my $o = shift; unshift(@$o,@_) }
sub EXISTS { exists $_[0]->[$_[1]] }
sub DELETE { delete $_[0]->[$_[1]] }
sub SPLICE
{
- my $ob = shift;
+ my $ob = shift;
my $sz = $ob->FETCHSIZE;
my $off = @_ ? shift : 0;
$off += $sz if $off < 0;
@@ -121,16 +118,16 @@ __END__
Tie::Array - base class for tied arrays
-=head1 SYNOPSIS
+=head1 SYNOPSIS
package NewArray;
use Tie::Array;
@ISA = ('Tie::Array');
# mandatory methods
- sub TIEARRAY { ... }
- sub FETCH { ... }
- sub FETCHSIZE { ... }
+ sub TIEARRAY { ... }
+ sub FETCH { ... }
+ sub FETCHSIZE { ... }
sub STORE { ... } # mandatory if elements writeable
sub STORESIZE { ... } # mandatory if elements can be added/deleted
@@ -138,13 +135,13 @@ Tie::Array - base class for tied arrays
sub DELETE { ... } # mandatory if delete() expected to work
# optional methods - for efficiency
- sub CLEAR { ... }
- sub PUSH { ... }
- sub POP { ... }
- sub SHIFT { ... }
- sub UNSHIFT { ... }
- sub SPLICE { ... }
- sub EXTEND { ... }
+ sub CLEAR { ... }
+ sub PUSH { ... }
+ sub POP { ... }
+ sub SHIFT { ... }
+ sub UNSHIFT { ... }
+ sub SPLICE { ... }
+ sub EXTEND { ... }
sub DESTROY { ... }
package NewStdArray;
@@ -162,7 +159,7 @@ Tie::Array - base class for tied arrays
-=head1 DESCRIPTION
+=head1 DESCRIPTION
This module provides methods for array-tying classes. See
L<perltie> for a list of the functions required in order to tie an array
@@ -173,16 +170,16 @@ on the tied array, and implementations of C<PUSH>, C<POP>, C<SHIFT>,
C<UNSHIFT>, C<SPLICE> and C<CLEAR> in terms of basic C<FETCH>, C<STORE>,
C<FETCHSIZE>, C<STORESIZE>.
-The B<Tie::StdArray> package provides efficient methods required for tied arrays
+The B<Tie::StdArray> package provides efficient methods required for tied arrays
which are implemented as blessed references to an "inner" perl array.
-It inherits from B<Tie::Array>, and should cause tied arrays to behave exactly
-like standard arrays, allowing for selective overloading of methods.
+It inherits from B<Tie::Array>, and should cause tied arrays to behave exactly
+like standard arrays, allowing for selective overloading of methods.
For developers wishing to write their own tied arrays, the required methods
are briefly defined below. See the L<perltie> section for more detailed
descriptive, as well as example code:
-=over
+=over
=item TIEARRAY classname, LIST
@@ -190,7 +187,7 @@ The class method is invoked by the command C<tie @array, classname>. Associates
an array instance with the specified class. C<LIST> would represent
additional arguments (along the lines of L<AnyDBM_File> and compatriots) needed
to complete the association. The method should return an object of a class which
-provides the methods below.
+provides the methods below.
=item STORE this, index, value
@@ -214,7 +211,7 @@ Sets the total number of items in the tied array associated with
object I<this> to be I<count>. If this makes the array larger then
class's mapping of C<undef> should be returned for new positions.
If the array becomes smaller then entries beyond count should be
-deleted.
+deleted.
=item EXTEND this, count
@@ -242,7 +239,7 @@ object I<this>.
Normal object destructor method.
-=item PUSH this, LIST
+=item PUSH this, LIST
Append elements of LIST to the array.
@@ -255,17 +252,17 @@ Remove last element of the array and return it.
Remove the first element of the array (shifting other elements down)
and return it.
-=item UNSHIFT this, LIST
+=item UNSHIFT this, LIST
Insert LIST elements at the beginning of the array, moving existing elements
up to make room.
=item SPLICE this, offset, length, LIST
-Perform the equivalent of C<splice> on the array.
+Perform the equivalent of C<splice> on the array.
-I<offset> is optional and defaults to zero, negative values count back
-from the end of the array.
+I<offset> is optional and defaults to zero, negative values count back
+from the end of the array.
I<length> is optional and defaults to rest of the array.
@@ -277,16 +274,15 @@ Returns a list of the original I<length> elements at I<offset>.
=head1 CAVEATS
-There is no support at present for tied @ISA. There is a potential conflict
+There is no support at present for tied @ISA. There is a potential conflict
between magic entries needed to notice setting of @ISA, and those needed to
-implement 'tie'.
+implement 'tie'.
Very little consideration has been given to the behaviour of tied arrays
when C<$[> is not default value of zero.
-=head1 AUTHOR
+=head1 AUTHOR
Nick Ing-Simmons E<lt>nik@tiuk.ti.comE<gt>
-=cut
-
+=cut
diff --git a/gnu/usr.bin/perl/lib/Tie/Handle.pm b/gnu/usr.bin/perl/lib/Tie/Handle.pm
index 588ecead899..81b07922496 100644
--- a/gnu/usr.bin/perl/lib/Tie/Handle.pm
+++ b/gnu/usr.bin/perl/lib/Tie/Handle.pm
@@ -1,7 +1,7 @@
package Tie::Handle;
use 5.005_64;
-our $VERSION = '1.0';
+our $VERSION = '4.0';
=head1 NAME
@@ -105,6 +105,15 @@ destruction of an instance.
The L<perltie> section contains an example of tying handles.
+=head1 COMPATIBILITY
+
+This version of Tie::Handle is neither related to nor compatible with
+the Tie::Handle (3.0) module available on CPAN. It was due to an
+accident that two modules with the same name appeared. The namespace
+clash has been cleared in favor of this module that comes with the
+perl core in September 2000 and accordingly the version number has
+been bumped up to 4.0.
+
=cut
use Carp;
@@ -120,8 +129,7 @@ sub new {
sub TIEHANDLE {
my $pkg = shift;
if (defined &{"{$pkg}::new"}) {
- warnings::warn "WARNING: calling ${pkg}->new since ${pkg}->TIEHANDLE is missing"
- if warnings::enabled();
+ warnings::warnif("WARNING: calling ${pkg}->new since ${pkg}->TIEHANDLE is missing");
$pkg->new(@_);
}
else {
@@ -184,10 +192,10 @@ sub WRITE {
sub CLOSE {
my $pkg = ref $_[0];
croak "$pkg doesn't define a CLOSE method";
-}
+}
package Tie::StdHandle;
-our @ISA = 'Tie::Handle';
+our @ISA = 'Tie::Handle';
use Carp;
sub TIEHANDLE
@@ -197,7 +205,7 @@ sub TIEHANDLE
bless $fh,$class;
$fh->OPEN(@_) if (@_);
return $fh;
-}
+}
sub EOF { eof($_[0]) }
sub TELL { tell($_[0]) }
@@ -207,9 +215,9 @@ sub CLOSE { close($_[0]) }
sub BINMODE { binmode($_[0]) }
sub OPEN
-{
+{
$_[0]->CLOSE if defined($_[0]->FILENO);
- open($_[0],$_[1]);
+ @_ == 2 ? open($_[0], $_[1]) : open($_[0], $_[1], $_[2]);
}
sub READ { read($_[0],$_[1],$_[2]) }
@@ -217,7 +225,7 @@ sub READLINE { my $fh = $_[0]; <$fh> }
sub GETC { getc($_[0]) }
sub WRITE
-{
+{
my $fh = $_[0];
print $fh substr($_[1],0,$_[2])
}
diff --git a/gnu/usr.bin/perl/lib/Win32.pod b/gnu/usr.bin/perl/lib/Win32.pod
new file mode 100644
index 00000000000..842e484fc67
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Win32.pod
@@ -0,0 +1,287 @@
+=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. This function does
+B<not> work on Windows 9x.
+
+=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 representation 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/gnu/usr.bin/perl/lib/bytes.pm b/gnu/usr.bin/perl/lib/bytes.pm
index f93d6158d9f..f2f7e0157cb 100644
--- a/gnu/usr.bin/perl/lib/bytes.pm
+++ b/gnu/usr.bin/perl/lib/bytes.pm
@@ -38,11 +38,28 @@ 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
+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). When C<use bytes> is in
+effect, the encoding is temporarily ignored, and each string is treated
+as a series of bytes.
+
+As an example, when Perl sees C<$x = chr(400)>, it encodes the character
+in UTF8 and stores it in $x. Then it is marked as character data, so,
+for instance, C<length $x> returns C<1>. However, in the scope of the
+C<bytes> pragma, $x is treated as a series of bytes - the bytes that make
+up the UTF8 encoding - and C<length $x> returns C<2>:
+
+ $x = chr(400);
+ print "Length is ", length $x, "\n"; # "Length is 1"
+ printf "Contents are %vd\n", $x; # "Contents are 400"
+ {
+ use bytes;
+ print "Length is ", length $x, "\n"; # "Length is 2"
+ printf "Contents are %vd\n", $x; # "Contents are 198.144"
+ }
+
+For more on the implications and differences between character
semantics and byte semantics, see L<perlunicode>.
=head1 SEE ALSO
diff --git a/gnu/usr.bin/perl/lib/charnames.pm b/gnu/usr.bin/perl/lib/charnames.pm
index 7c2209b9f09..5f0c95f0cb8 100644
--- a/gnu/usr.bin/perl/lib/charnames.pm
+++ b/gnu/usr.bin/perl/lib/charnames.pm
@@ -1,5 +1,6 @@
package charnames;
use bytes (); # for $bytes::hint_bits
+use warnings();
$charnames::hint_bits = 0x20000;
my $txt;
@@ -29,8 +30,11 @@ sub charnames {
}
}
die "Unknown charname '$name'" unless @off;
-
- my $ord = hex substr $txt, $off[0] - 4, 4;
+
+ my $hexlen = 4; # Unicode guarantees 4-, 5-, or 6-digit format
+ $hexlen++ while
+ $hexlen < 6 && substr($txt, $off[0] - $hexlen - 1, 1) =~ /[0-9a-f]/;
+ my $ord = hex substr $txt, $off[0] - $hexlen, $hexlen;
if ($^H & $bytes::hint_bits) { # "use bytes" in effect?
use bytes;
return chr $ord if $ord <= 255;
@@ -51,6 +55,13 @@ sub import {
$^H{charnames_full} = delete $h{':full'};
$^H{charnames_short} = delete $h{':short'};
$^H{charnames_scripts} = [map uc, keys %h];
+ if (warnings::enabled('utf8') && @{$^H{charnames_scripts}}) {
+ $txt = do "unicode/Name.pl" unless $txt;
+ for (@{$^H{charnames_scripts}}) {
+ warnings::warn('utf8', "No such script: '$_'") unless
+ $txt =~ m/\t\t$_ (?:CAPITAL |SMALL )?LETTER /;
+ }
+ }
}
diff --git a/gnu/usr.bin/perl/lib/fields.pm b/gnu/usr.bin/perl/lib/fields.pm
index ac4581036f7..37ff99d78ac 100644
--- a/gnu/usr.bin/perl/lib/fields.pm
+++ b/gnu/usr.bin/perl/lib/fields.pm
@@ -172,8 +172,7 @@ sub import {
if ($fno and $fno != $next) {
require Carp;
if ($fno < $fattr->[0]) {
- warnings::warn("Hides field '$f' in base class")
- if warnings::enabled();
+ warnings::warnif("Hides field '$f' in base class") ;
} else {
Carp::croak("Field name '$f' already in use");
}
diff --git a/gnu/usr.bin/perl/lib/integer.pm b/gnu/usr.bin/perl/lib/integer.pm
index 86afcaf130d..998574f0a77 100644
--- a/gnu/usr.bin/perl/lib/integer.pm
+++ b/gnu/usr.bin/perl/lib/integer.pm
@@ -2,7 +2,7 @@ package integer;
=head1 NAME
-integer - Perl pragma to compute arithmetic in integer instead of double
+integer - Perl pragma to use integer arithmetic instead of floating point
=head1 SYNOPSIS
@@ -12,34 +12,69 @@ integer - Perl pragma to compute arithmetic in integer instead of double
=head1 DESCRIPTION
-This tells the compiler to use integer operations
-from here to the end of the enclosing BLOCK. On many machines,
-this doesn't matter a great deal for most computations, but on those
-without floating point hardware, it can make a big difference.
-
-Note that this affects the operations, not the numbers. If you run this
-code
+This tells the compiler to use integer operations from here to the end
+of the enclosing BLOCK. On many machines, this doesn't matter a great
+deal for most computations, but on those without floating point
+hardware, it can make a big difference in performance.
+
+Note that this only affects how most of the arithmetic and relational
+B<operators> handle their operands and results, and B<not> how all
+numbers everywhere are treated. Specifically, C<use integer;> has the
+effect that before computing the results of the arithmetic operators
+(+, -, *, /, %, +=, -=, *=, /=, %=, and unary minus), the comparison
+operators (<, <=, >, >=, ==, !=, <=>), and the bitwise operators (|, &,
+^, <<, >>, |=, &=, ^=, <<=, >>=), the operands have their fractional
+portions truncated (or floored), and the result will have its
+fractional portion truncated as well. In addition, the range of
+operands and results is restricted to that of familiar two's complement
+integers, i.e., -(2**31) .. (2**31-1) on 32-bit architectures, and
+-(2**63) .. (2**63-1) on 64-bit architectures. For example, this code
use integer;
- $x = 1.5;
- $y = $x + 1;
- $z = -1.5;
-
-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>.
+ $x = 5.8;
+ $y = 2.5;
+ $z = 2.7;
+ $a = 2**31 - 1; # Largest positive integer on 32-bit machines
+ $, = ", ";
+ print $x, -$x, $x + $y, $x - $y, $x / $y, $x * $y, $y == $z, $a, $a + 1;
+
+will print: 5.8, -5, 7, 3, 2, 10, 1, 2147483647, -2147483648
+
+Note that $x is still printed as having its true non-integer value of
+5.8 since it wasn't operated on. And note too the wrap-around from the
+largest positive integer to the largest negative one. Also, arguments
+passed to functions and the values returned by them are B<not> affected
+by C<use integer;>. E.g.,
+
+ srand(1.5);
+ $, = ", ";
+ print sin(.5), cos(.5), atan2(1,2), sqrt(2), rand(10);
+
+will give the same result with or without C<use integer;> The power
+operator C<**> is also not affected, so that 2 ** .5 is always the
+square root of 2. Now, it so happens that the pre- and post- increment
+and decrement operators, ++ and --, are not affected by C<use integer;>
+either. Some may rightly consider this to be a bug -- but at least it's
+a long-standing one.
+
+Finally, C<use integer;> also has an additional affect on the bitwise
+operators. Normally, the operands and results are treated as
+B<unsigned> integers, but with C<use integer;> the operands and results
+are B<signed>. This means, among other things, that ~0 is -1, and -2 &
+-5 is -6.
+
+Internally, 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<perlmodlib/"Pragmatic Modules">, L<perlop/"Integer Arithmetic">
=cut
diff --git a/gnu/usr.bin/perl/lib/unicode/ArabLink.pl b/gnu/usr.bin/perl/lib/unicode/ArabLink.pl
index fd5ed8a6b1d..2ad1871bac3 100644
--- a/gnu/usr.bin/perl/lib/unicode/ArabLink.pl
+++ b/gnu/usr.bin/perl/lib/unicode/ArabLink.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0622 0625 R
@@ -12,10 +12,9 @@ return <<'END';
0633 063a D
0640 C
0641 0647 D
-0648 0649 R
-064a D
-0671 U
-0672 0673 R
+0648 R
+0649 064a D
+0671 0673 R
0674 U
0675 0677 R
0678 0687 D
diff --git a/gnu/usr.bin/perl/lib/unicode/ArabLnkGrp.pl b/gnu/usr.bin/perl/lib/unicode/ArabLnkGrp.pl
index 61f30d4348f..1581a048973 100644
--- a/gnu/usr.bin/perl/lib/unicode/ArabLnkGrp.pl
+++ b/gnu/usr.bin/perl/lib/unicode/ArabLnkGrp.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0622 0623 ALEF
@@ -27,8 +27,7 @@ return <<'END';
0647 HEH
0648 WAW
0649 064a YEH
-0671 <no shaping>
-0672 0673 ALEF
+0671 0673 ALEF
0674 <no shaping>
0675 ALEF
0676 0677 WAW
diff --git a/gnu/usr.bin/perl/lib/unicode/ArabShap.txt b/gnu/usr.bin/perl/lib/unicode/ArabShap.txt
index 6092d6223cd..9b60290e62e 100644
--- a/gnu/usr.bin/perl/lib/unicode/ArabShap.txt
+++ b/gnu/usr.bin/perl/lib/unicode/ArabShap.txt
@@ -1,5 +1,32 @@
-# Unicode; Schematic Name; Link; Link Group
+# ArabicShaping-3.txt
+#
+# This file is a normative contributory data file in the
+# Unicode Character Database.
+#
+# This file defines the shaping classes for Arabic and Syriac
+# positional shaping, repeating in machine readable form the
+# information printed in Tables 8-6, 8-7, 8-8, 8-10, 8-11, and
+# 8-13 of The Unicode Standard, Version 3.0.
+#
+# See sections 8.2 and 8.3 of The Unicode Standard, Version 3.0
+# for more information.
+#
+# Each line contains four fields, separated by a semicolon.
+#
+# The first field gives the code point, in 4-digit hexadecimal
+# form, of an Arabic or Syriac character.
+# The second field gives a short schematic name for that character,
+# abbreviated from the normative Unicode character name.
+# The third field defines the joining type: R right-joining,
+# D dual-joining, U non-joining
+# The fourth field defines the joining group.
+#
+# #############################################################
+
+# Unicode; Schematic Name; Joining Type; Joining Group
+
# Arabic characters
+
0622; MADDA ON ALEF; R; ALEF
0623; HAMZA ON ALEF; R; ALEF
0624; HAMZA ON WAW; R; WAW
@@ -34,9 +61,9 @@
0646; NOON; D; NOON
0647; HEH; D; HEH
0648; WAW; R; WAW
-0649; ALEF MAKSURA; R; YEH
+0649; ALEF MAKSURA; D; YEH
064A; YEH; D; YEH
-0671; HAMZAT WASL ON ALEF; U; <no shaping>
+0671; HAMZAT WASL ON ALEF; R; ALEF
0672; WAVY HAMZA ON ALEF; R; ALEF
0673; WAVY HAMZA UNDER ALEF; R; ALEF
0674; HIGH HAMZA; U; <no shaping>
@@ -139,7 +166,9 @@
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
diff --git a/gnu/usr.bin/perl/lib/unicode/BidiMirr.txt b/gnu/usr.bin/perl/lib/unicode/BidiMirr.txt
new file mode 100644
index 00000000000..8ac5be98a16
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/BidiMirr.txt
@@ -0,0 +1,238 @@
+# BidiMirroring-1.txt
+#
+# This file is an informative supplement to the UnicodeData file. It
+# lists characters that have the mirrored property
+# where there is another Unicode character that typically has a glyph
+# that is the mirror image of the original character's glyph.
+# The repertoire covered by the file is Unicode 3.0.1.
+#
+# The file contains a list of lines with mappings from one code point
+# to another one for character-based mirroring.
+# Note that for "real" mirroring, a rendering engine needs to select
+# appropriate alternative glyphs, and that many Unicode characters do not
+# have a mirror-image Unicode character.
+#
+# Each mapping line contains two fields, separated by a semicolon (';').
+# Each of the two fields contains a code point represented as a
+# variable-length hexadecimal value with 4 to 6 digits.
+# A comment indicates where the characters are "BEST FIT" mirroring.
+#
+# Code points with the "mirrored" property but no appropriate mirrors are
+# listed as comments at the end of the file.
+#
+# For information on bidi mirroring, see UTR #21: Bidirectional Algorithm,
+# at http://www.unicode.org/unicode/reports/tr9/
+#
+# Please address any comments to <errata@unicode.org>.
+# Note that this is an archival address: messages will be checked,
+# but do not expect an immediate response.
+#
+# This file was originally created by Markus Scherer
+#
+# ############################################################
+
+0028; 0029 # LEFT PARENTHESIS
+0029; 0028 # RIGHT PARENTHESIS
+003C; 003E # LESS-THAN SIGN
+003E; 003C # GREATER-THAN SIGN
+005B; 005D # LEFT SQUARE BRACKET
+005D; 005B # RIGHT SQUARE BRACKET
+007B; 007D # LEFT CURLY BRACKET
+007D; 007B # RIGHT CURLY BRACKET
+00AB; 00BB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BB; 00AB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+2039; 203A # SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A; 2039 # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+2045; 2046 # LEFT SQUARE BRACKET WITH QUILL
+2046; 2045 # RIGHT SQUARE BRACKET WITH QUILL
+207D; 207E # SUPERSCRIPT LEFT PARENTHESIS
+207E; 207D # SUPERSCRIPT RIGHT PARENTHESIS
+208D; 208E # SUBSCRIPT LEFT PARENTHESIS
+208E; 208D # SUBSCRIPT RIGHT PARENTHESIS
+2208; 220B # ELEMENT OF
+2209; 220C # NOT AN ELEMENT OF
+220A; 220D # SMALL ELEMENT OF
+220B; 2208 # CONTAINS AS MEMBER
+220C; 2209 # DOES NOT CONTAIN AS MEMBER
+220D; 220A # SMALL CONTAINS AS MEMBER
+223C; 223D # TILDE OPERATOR
+223D; 223C # REVERSED TILDE
+2243; 22CD # ASYMPTOTICALLY EQUAL TO
+2252; 2253 # APPROXIMATELY EQUAL TO OR THE IMAGE OF
+2253; 2252 # IMAGE OF OR APPROXIMATELY EQUAL TO
+2254; 2255 # COLON EQUALS
+2255; 2254 # EQUALS COLON
+2264; 2265 # LESS-THAN OR EQUAL TO
+2265; 2264 # GREATER-THAN OR EQUAL TO
+2266; 2267 # LESS-THAN OVER EQUAL TO
+2267; 2266 # GREATER-THAN OVER EQUAL TO
+2268; 2269 # [BEST FIT] LESS-THAN BUT NOT EQUAL TO
+2269; 2268 # [BEST FIT] GREATER-THAN BUT NOT EQUAL TO
+226A; 226B # MUCH LESS-THAN
+226B; 226A # MUCH GREATER-THAN
+226E; 226F # [BEST FIT] NOT LESS-THAN
+226F; 226E # [BEST FIT] NOT GREATER-THAN
+2270; 2271 # [BEST FIT] NEITHER LESS-THAN NOR EQUAL TO
+2271; 2270 # [BEST FIT] NEITHER GREATER-THAN NOR EQUAL TO
+2272; 2273 # [BEST FIT] LESS-THAN OR EQUIVALENT TO
+2273; 2272 # [BEST FIT] GREATER-THAN OR EQUIVALENT TO
+2274; 2275 # [BEST FIT] NEITHER LESS-THAN NOR EQUIVALENT TO
+2275; 2274 # [BEST FIT] NEITHER GREATER-THAN NOR EQUIVALENT TO
+2276; 2277 # LESS-THAN OR GREATER-THAN
+2277; 2276 # GREATER-THAN OR LESS-THAN
+2278; 2279 # NEITHER LESS-THAN NOR GREATER-THAN
+2279; 2278 # NEITHER GREATER-THAN NOR LESS-THAN
+227A; 227B # PRECEDES
+227B; 227A # SUCCEEDS
+227C; 227D # PRECEDES OR EQUAL TO
+227D; 227C # SUCCEEDS OR EQUAL TO
+227E; 227F # [BEST FIT] PRECEDES OR EQUIVALENT TO
+227F; 227E # [BEST FIT] SUCCEEDS OR EQUIVALENT TO
+2280; 2281 # [BEST FIT] DOES NOT PRECEDE
+2281; 2280 # [BEST FIT] DOES NOT SUCCEED
+2282; 2283 # SUBSET OF
+2283; 2282 # SUPERSET OF
+2284; 2285 # [BEST FIT] NOT A SUBSET OF
+2285; 2284 # [BEST FIT] NOT A SUPERSET OF
+2286; 2287 # SUBSET OF OR EQUAL TO
+2287; 2286 # SUPERSET OF OR EQUAL TO
+2288; 2289 # [BEST FIT] NEITHER A SUBSET OF NOR EQUAL TO
+2289; 2288 # [BEST FIT] NEITHER A SUPERSET OF NOR EQUAL TO
+228A; 228B # [BEST FIT] SUBSET OF WITH NOT EQUAL TO
+228B; 228A # [BEST FIT] SUPERSET OF WITH NOT EQUAL TO
+228F; 2290 # SQUARE IMAGE OF
+2290; 228F # SQUARE ORIGINAL OF
+2291; 2292 # SQUARE IMAGE OF OR EQUAL TO
+2292; 2291 # SQUARE ORIGINAL OF OR EQUAL TO
+22A2; 22A3 # RIGHT TACK
+22A3; 22A2 # LEFT TACK
+22B0; 22B1 # PRECEDES UNDER RELATION
+22B1; 22B0 # SUCCEEDS UNDER RELATION
+22B2; 22B3 # NORMAL SUBGROUP OF
+22B3; 22B2 # CONTAINS AS NORMAL SUBGROUP
+22B4; 22B5 # NORMAL SUBGROUP OF OR EQUAL TO
+22B5; 22B4 # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+22B6; 22B7 # ORIGINAL OF
+22B7; 22B6 # IMAGE OF
+22C9; 22CA # LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CA; 22C9 # RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CB; 22CC # LEFT SEMIDIRECT PRODUCT
+22CC; 22CB # RIGHT SEMIDIRECT PRODUCT
+22CD; 2243 # REVERSED TILDE EQUALS
+22D0; 22D1 # DOUBLE SUBSET
+22D1; 22D0 # DOUBLE SUPERSET
+22D6; 22D7 # LESS-THAN WITH DOT
+22D7; 22D6 # GREATER-THAN WITH DOT
+22D8; 22D9 # VERY MUCH LESS-THAN
+22D9; 22D8 # VERY MUCH GREATER-THAN
+22DA; 22DB # LESS-THAN EQUAL TO OR GREATER-THAN
+22DB; 22DA # GREATER-THAN EQUAL TO OR LESS-THAN
+22DC; 22DD # EQUAL TO OR LESS-THAN
+22DD; 22DC # EQUAL TO OR GREATER-THAN
+22DE; 22DF # EQUAL TO OR PRECEDES
+22DF; 22DE # EQUAL TO OR SUCCEEDS
+22E0; 22E1 # [BEST FIT] DOES NOT PRECEDE OR EQUAL
+22E1; 22E0 # [BEST FIT] DOES NOT SUCCEED OR EQUAL
+22E2; 22E3 # [BEST FIT] NOT SQUARE IMAGE OF OR EQUAL TO
+22E3; 22E2 # [BEST FIT] NOT SQUARE ORIGINAL OF OR EQUAL TO
+22E4; 22E5 # [BEST FIT] SQUARE IMAGE OF OR NOT EQUAL TO
+22E5; 22E4 # [BEST FIT] SQUARE ORIGINAL OF OR NOT EQUAL TO
+22E6; 22E7 # [BEST FIT] LESS-THAN BUT NOT EQUIVALENT TO
+22E7; 22E6 # [BEST FIT] GREATER-THAN BUT NOT EQUIVALENT TO
+22E8; 22E9 # [BEST FIT] PRECEDES BUT NOT EQUIVALENT TO
+22E9; 22E8 # [BEST FIT] SUCCEEDS BUT NOT EQUIVALENT TO
+22EA; 22EB # [BEST FIT] NOT NORMAL SUBGROUP OF
+22EB; 22EA # [BEST FIT] DOES NOT CONTAIN AS NORMAL SUBGROUP
+22EC; 22ED # [BEST FIT] NOT NORMAL SUBGROUP OF OR EQUAL TO
+22ED; 22EC # [BEST FIT] DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+22F0; 22F1 # UP RIGHT DIAGONAL ELLIPSIS
+22F1; 22F0 # DOWN RIGHT DIAGONAL ELLIPSIS
+2308; 2309 # LEFT CEILING
+2309; 2308 # RIGHT CEILING
+230A; 230B # LEFT FLOOR
+230B; 230A # RIGHT FLOOR
+2329; 232A # LEFT-POINTING ANGLE BRACKET
+232A; 2329 # RIGHT-POINTING ANGLE BRACKET
+3008; 3009 # LEFT ANGLE BRACKET
+3009; 3008 # RIGHT ANGLE BRACKET
+300A; 300B # LEFT DOUBLE ANGLE BRACKET
+300B; 300A # RIGHT DOUBLE ANGLE BRACKET
+300C; 300D # [BEST FIT] LEFT CORNER BRACKET
+300D; 300C # [BEST FIT] RIGHT CORNER BRACKET
+300E; 300F # [BEST FIT] LEFT WHITE CORNER BRACKET
+300F; 300E # [BEST FIT] RIGHT WHITE CORNER BRACKET
+3010; 3011 # LEFT BLACK LENTICULAR BRACKET
+3011; 3010 # RIGHT BLACK LENTICULAR BRACKET
+3014; 3015 # [BEST FIT] LEFT TORTOISE SHELL BRACKET
+3015; 3014 # [BEST FIT] RIGHT TORTOISE SHELL BRACKET
+3016; 3017 # LEFT WHITE LENTICULAR BRACKET
+3017; 3016 # RIGHT WHITE LENTICULAR BRACKET
+3018; 3019 # LEFT WHITE TORTOISE SHELL BRACKET
+3019; 3018 # RIGHT WHITE TORTOISE SHELL BRACKET
+301A; 301B # LEFT WHITE SQUARE BRACKET
+301B; 301A # RIGHT WHITE SQUARE BRACKET
+
+# The following characters have no appropriate mirroring character
+
+# 2201; COMPLEMENT
+# 2202; PARTIAL DIFFERENTIAL
+# 2203; THERE EXISTS
+# 2204; THERE DOES NOT EXIST
+# 2211; N-ARY SUMMATION
+# 2215; DIVISION SLASH
+# 2216; SET MINUS
+# 221A; SQUARE ROOT
+# 221B; CUBE ROOT
+# 221C; FOURTH ROOT
+# 221D; PROPORTIONAL TO
+# 221F; RIGHT ANGLE
+# 2220; ANGLE
+# 2221; MEASURED ANGLE
+# 2222; SPHERICAL ANGLE
+# 2224; DOES NOT DIVIDE
+# 2226; NOT PARALLEL TO
+# 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
+# 2239; EXCESS
+# 223B; HOMOTHETIC
+# 223E; INVERTED LAZY S
+# 223F; SINE WAVE
+# 2240; WREATH PRODUCT
+# 2241; NOT TILDE
+# 2242; MINUS TILDE
+# 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
+# 225F; QUESTIONED EQUAL TO
+# 2260; NOT EQUAL TO
+# 2262; NOT IDENTICAL TO
+# 228C; MULTISET
+# 2298; CIRCLED DIVISION SLASH
+# 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
+# 22B8; MULTIMAP
+# 22BE; RIGHT ANGLE WITH ARC
+# 22BF; RIGHT TRIANGLE
+# 2320; TOP HALF INTEGRAL
+# 2321; BOTTOM HALF INTEGRAL
diff --git a/gnu/usr.bin/perl/lib/unicode/Bidirectional.pl b/gnu/usr.bin/perl/lib/unicode/Bidirectional.pl
index 73898b8399c..3cc2d0aafd5 100644
--- a/gnu/usr.bin/perl/lib/unicode/Bidirectional.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Bidirectional.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0000 0008 BN
@@ -635,4 +635,6 @@ ffe5 ffe6 ET
ffe8 ffee ON
fff9 fffb BN
fffc fffd ON
+f0000 ffffd L
+100000 10fffd L
END
diff --git a/gnu/usr.bin/perl/lib/unicode/Block.pl b/gnu/usr.bin/perl/lib/unicode/Block.pl
index ee680b724d4..2b5bfce3e14 100644
--- a/gnu/usr.bin/perl/lib/unicode/Block.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Block.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0000 007F Basic Latin
diff --git a/gnu/usr.bin/perl/lib/unicode/CaseFold.txt b/gnu/usr.bin/perl/lib/unicode/CaseFold.txt
new file mode 100644
index 00000000000..6529c412f27
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/CaseFold.txt
@@ -0,0 +1,821 @@
+# CaseFolding-2.txt
+#
+# Case Folding Properties
+#
+# This file is a supplement to the UnicodeData file.
+# It provides a case folding mapping generated from the Unicode Character Database.
+# If all characters are mapped according to this mapping, then
+# case differences (according to UnicodeData.txt and SpecialCasing.txt)
+# are eliminated.
+#
+# For information on case folding, see
+# UTR #21 Case Mappings, at http://www.unicode.org/unicode/reports/tr21/
+#
+# These are informative character properties.
+#
+# Send comments to mark@unicode.org
+#
+# ================================================================================
+# Format
+# ================================================================================
+# The entries in this file are in the following machine-readable format:
+#
+# <code>; <status>; <mapping>; # <name>
+#
+# The status is:
+# L (for Lowercase) if the case mapping matches the standard 1-1 lowercase mapping
+# E (for exception) if it does not.
+#
+# The mapping may consist of multiple characters.
+# If so, they are separated by spaces.
+#
+# =================================================================
+
+0041; L; 0061; #LATIN CAPITAL LETTER A
+0042; L; 0062; #LATIN CAPITAL LETTER B
+0043; L; 0063; #LATIN CAPITAL LETTER C
+0044; L; 0064; #LATIN CAPITAL LETTER D
+0045; L; 0065; #LATIN CAPITAL LETTER E
+0046; L; 0066; #LATIN CAPITAL LETTER F
+0047; L; 0067; #LATIN CAPITAL LETTER G
+0048; L; 0068; #LATIN CAPITAL LETTER H
+0049; L; 0069; #LATIN CAPITAL LETTER I
+004A; L; 006A; #LATIN CAPITAL LETTER J
+004B; L; 006B; #LATIN CAPITAL LETTER K
+004C; L; 006C; #LATIN CAPITAL LETTER L
+004D; L; 006D; #LATIN CAPITAL LETTER M
+004E; L; 006E; #LATIN CAPITAL LETTER N
+004F; L; 006F; #LATIN CAPITAL LETTER O
+0050; L; 0070; #LATIN CAPITAL LETTER P
+0051; L; 0071; #LATIN CAPITAL LETTER Q
+0052; L; 0072; #LATIN CAPITAL LETTER R
+0053; L; 0073; #LATIN CAPITAL LETTER S
+0054; L; 0074; #LATIN CAPITAL LETTER T
+0055; L; 0075; #LATIN CAPITAL LETTER U
+0056; L; 0076; #LATIN CAPITAL LETTER V
+0057; L; 0077; #LATIN CAPITAL LETTER W
+0058; L; 0078; #LATIN CAPITAL LETTER X
+0059; L; 0079; #LATIN CAPITAL LETTER Y
+005A; L; 007A; #LATIN CAPITAL LETTER Z
+00B5; E; 03BC; #MICRO SIGN
+00C0; L; 00E0; #LATIN CAPITAL LETTER A WITH GRAVE
+00C1; L; 00E1; #LATIN CAPITAL LETTER A WITH ACUTE
+00C2; L; 00E2; #LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+00C3; L; 00E3; #LATIN CAPITAL LETTER A WITH TILDE
+00C4; L; 00E4; #LATIN CAPITAL LETTER A WITH DIAERESIS
+00C5; L; 00E5; #LATIN CAPITAL LETTER A WITH RING ABOVE
+00C6; L; 00E6; #LATIN CAPITAL LETTER AE
+00C7; L; 00E7; #LATIN CAPITAL LETTER C WITH CEDILLA
+00C8; L; 00E8; #LATIN CAPITAL LETTER E WITH GRAVE
+00C9; L; 00E9; #LATIN CAPITAL LETTER E WITH ACUTE
+00CA; L; 00EA; #LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+00CB; L; 00EB; #LATIN CAPITAL LETTER E WITH DIAERESIS
+00CC; L; 00EC; #LATIN CAPITAL LETTER I WITH GRAVE
+00CD; L; 00ED; #LATIN CAPITAL LETTER I WITH ACUTE
+00CE; L; 00EE; #LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+00CF; L; 00EF; #LATIN CAPITAL LETTER I WITH DIAERESIS
+00D0; L; 00F0; #LATIN CAPITAL LETTER ETH
+00D1; L; 00F1; #LATIN CAPITAL LETTER N WITH TILDE
+00D2; L; 00F2; #LATIN CAPITAL LETTER O WITH GRAVE
+00D3; L; 00F3; #LATIN CAPITAL LETTER O WITH ACUTE
+00D4; L; 00F4; #LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+00D5; L; 00F5; #LATIN CAPITAL LETTER O WITH TILDE
+00D6; L; 00F6; #LATIN CAPITAL LETTER O WITH DIAERESIS
+00D8; L; 00F8; #LATIN CAPITAL LETTER O WITH STROKE
+00D9; L; 00F9; #LATIN CAPITAL LETTER U WITH GRAVE
+00DA; L; 00FA; #LATIN CAPITAL LETTER U WITH ACUTE
+00DB; L; 00FB; #LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+00DC; L; 00FC; #LATIN CAPITAL LETTER U WITH DIAERESIS
+00DD; L; 00FD; #LATIN CAPITAL LETTER Y WITH ACUTE
+00DE; L; 00FE; #LATIN CAPITAL LETTER THORN
+00DF; E; 0073 0073; #LATIN SMALL LETTER SHARP S
+0100; L; 0101; #LATIN CAPITAL LETTER A WITH MACRON
+0102; L; 0103; #LATIN CAPITAL LETTER A WITH BREVE
+0104; L; 0105; #LATIN CAPITAL LETTER A WITH OGONEK
+0106; L; 0107; #LATIN CAPITAL LETTER C WITH ACUTE
+0108; L; 0109; #LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+010A; L; 010B; #LATIN CAPITAL LETTER C WITH DOT ABOVE
+010C; L; 010D; #LATIN CAPITAL LETTER C WITH CARON
+010E; L; 010F; #LATIN CAPITAL LETTER D WITH CARON
+0110; L; 0111; #LATIN CAPITAL LETTER D WITH STROKE
+0112; L; 0113; #LATIN CAPITAL LETTER E WITH MACRON
+0114; L; 0115; #LATIN CAPITAL LETTER E WITH BREVE
+0116; L; 0117; #LATIN CAPITAL LETTER E WITH DOT ABOVE
+0118; L; 0119; #LATIN CAPITAL LETTER E WITH OGONEK
+011A; L; 011B; #LATIN CAPITAL LETTER E WITH CARON
+011C; L; 011D; #LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+011E; L; 011F; #LATIN CAPITAL LETTER G WITH BREVE
+0120; L; 0121; #LATIN CAPITAL LETTER G WITH DOT ABOVE
+0122; L; 0123; #LATIN CAPITAL LETTER G WITH CEDILLA
+0124; L; 0125; #LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+0126; L; 0127; #LATIN CAPITAL LETTER H WITH STROKE
+0128; L; 0129; #LATIN CAPITAL LETTER I WITH TILDE
+012A; L; 012B; #LATIN CAPITAL LETTER I WITH MACRON
+012C; L; 012D; #LATIN CAPITAL LETTER I WITH BREVE
+012E; L; 012F; #LATIN CAPITAL LETTER I WITH OGONEK
+0130; L; 0069; #LATIN CAPITAL LETTER I WITH DOT ABOVE
+0131; E; 0069; #LATIN SMALL LETTER DOTLESS I
+0132; L; 0133; #LATIN CAPITAL LIGATURE IJ
+0134; L; 0135; #LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+0136; L; 0137; #LATIN CAPITAL LETTER K WITH CEDILLA
+0139; L; 013A; #LATIN CAPITAL LETTER L WITH ACUTE
+013B; L; 013C; #LATIN CAPITAL LETTER L WITH CEDILLA
+013D; L; 013E; #LATIN CAPITAL LETTER L WITH CARON
+013F; L; 0140; #LATIN CAPITAL LETTER L WITH MIDDLE DOT
+0141; L; 0142; #LATIN CAPITAL LETTER L WITH STROKE
+0143; L; 0144; #LATIN CAPITAL LETTER N WITH ACUTE
+0145; L; 0146; #LATIN CAPITAL LETTER N WITH CEDILLA
+0147; L; 0148; #LATIN CAPITAL LETTER N WITH CARON
+0149; E; 02BC 006E; #LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+014A; L; 014B; #LATIN CAPITAL LETTER ENG
+014C; L; 014D; #LATIN CAPITAL LETTER O WITH MACRON
+014E; L; 014F; #LATIN CAPITAL LETTER O WITH BREVE
+0150; L; 0151; #LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0152; L; 0153; #LATIN CAPITAL LIGATURE OE
+0154; L; 0155; #LATIN CAPITAL LETTER R WITH ACUTE
+0156; L; 0157; #LATIN CAPITAL LETTER R WITH CEDILLA
+0158; L; 0159; #LATIN CAPITAL LETTER R WITH CARON
+015A; L; 015B; #LATIN CAPITAL LETTER S WITH ACUTE
+015C; L; 015D; #LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+015E; L; 015F; #LATIN CAPITAL LETTER S WITH CEDILLA
+0160; L; 0161; #LATIN CAPITAL LETTER S WITH CARON
+0162; L; 0163; #LATIN CAPITAL LETTER T WITH CEDILLA
+0164; L; 0165; #LATIN CAPITAL LETTER T WITH CARON
+0166; L; 0167; #LATIN CAPITAL LETTER T WITH STROKE
+0168; L; 0169; #LATIN CAPITAL LETTER U WITH TILDE
+016A; L; 016B; #LATIN CAPITAL LETTER U WITH MACRON
+016C; L; 016D; #LATIN CAPITAL LETTER U WITH BREVE
+016E; L; 016F; #LATIN CAPITAL LETTER U WITH RING ABOVE
+0170; L; 0171; #LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0172; L; 0173; #LATIN CAPITAL LETTER U WITH OGONEK
+0174; L; 0175; #LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+0176; L; 0177; #LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+0178; L; 00FF; #LATIN CAPITAL LETTER Y WITH DIAERESIS
+0179; L; 017A; #LATIN CAPITAL LETTER Z WITH ACUTE
+017B; L; 017C; #LATIN CAPITAL LETTER Z WITH DOT ABOVE
+017D; L; 017E; #LATIN CAPITAL LETTER Z WITH CARON
+017F; E; 0073; #LATIN SMALL LETTER LONG S
+0181; L; 0253; #LATIN CAPITAL LETTER B WITH HOOK
+0182; L; 0183; #LATIN CAPITAL LETTER B WITH TOPBAR
+0184; L; 0185; #LATIN CAPITAL LETTER TONE SIX
+0186; L; 0254; #LATIN CAPITAL LETTER OPEN O
+0187; L; 0188; #LATIN CAPITAL LETTER C WITH HOOK
+0189; L; 0256; #LATIN CAPITAL LETTER AFRICAN D
+018A; L; 0257; #LATIN CAPITAL LETTER D WITH HOOK
+018B; L; 018C; #LATIN CAPITAL LETTER D WITH TOPBAR
+018E; L; 01DD; #LATIN CAPITAL LETTER REVERSED E
+018F; L; 0259; #LATIN CAPITAL LETTER SCHWA
+0190; L; 025B; #LATIN CAPITAL LETTER OPEN E
+0191; L; 0192; #LATIN CAPITAL LETTER F WITH HOOK
+0193; L; 0260; #LATIN CAPITAL LETTER G WITH HOOK
+0194; L; 0263; #LATIN CAPITAL LETTER GAMMA
+0196; L; 0269; #LATIN CAPITAL LETTER IOTA
+0197; L; 0268; #LATIN CAPITAL LETTER I WITH STROKE
+0198; L; 0199; #LATIN CAPITAL LETTER K WITH HOOK
+019C; L; 026F; #LATIN CAPITAL LETTER TURNED M
+019D; L; 0272; #LATIN CAPITAL LETTER N WITH LEFT HOOK
+019F; L; 0275; #LATIN CAPITAL LETTER O WITH MIDDLE TILDE
+01A0; L; 01A1; #LATIN CAPITAL LETTER O WITH HORN
+01A2; L; 01A3; #LATIN CAPITAL LETTER OI
+01A4; L; 01A5; #LATIN CAPITAL LETTER P WITH HOOK
+01A6; L; 0280; #LATIN LETTER YR
+01A7; L; 01A8; #LATIN CAPITAL LETTER TONE TWO
+01A9; L; 0283; #LATIN CAPITAL LETTER ESH
+01AC; L; 01AD; #LATIN CAPITAL LETTER T WITH HOOK
+01AE; L; 0288; #LATIN CAPITAL LETTER T WITH RETROFLEX HOOK
+01AF; L; 01B0; #LATIN CAPITAL LETTER U WITH HORN
+01B1; L; 028A; #LATIN CAPITAL LETTER UPSILON
+01B2; L; 028B; #LATIN CAPITAL LETTER V WITH HOOK
+01B3; L; 01B4; #LATIN CAPITAL LETTER Y WITH HOOK
+01B5; L; 01B6; #LATIN CAPITAL LETTER Z WITH STROKE
+01B7; L; 0292; #LATIN CAPITAL LETTER EZH
+01B8; L; 01B9; #LATIN CAPITAL LETTER EZH REVERSED
+01BC; L; 01BD; #LATIN CAPITAL LETTER TONE FIVE
+01C4; L; 01C6; #LATIN CAPITAL LETTER DZ WITH CARON
+01C5; L; 01C6; #LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON
+01C7; L; 01C9; #LATIN CAPITAL LETTER LJ
+01C8; L; 01C9; #LATIN CAPITAL LETTER L WITH SMALL LETTER J
+01CA; L; 01CC; #LATIN CAPITAL LETTER NJ
+01CB; L; 01CC; #LATIN CAPITAL LETTER N WITH SMALL LETTER J
+01CD; L; 01CE; #LATIN CAPITAL LETTER A WITH CARON
+01CF; L; 01D0; #LATIN CAPITAL LETTER I WITH CARON
+01D1; L; 01D2; #LATIN CAPITAL LETTER O WITH CARON
+01D3; L; 01D4; #LATIN CAPITAL LETTER U WITH CARON
+01D5; L; 01D6; #LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+01D7; L; 01D8; #LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+01D9; L; 01DA; #LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+01DB; L; 01DC; #LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+01DE; L; 01DF; #LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+01E0; L; 01E1; #LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+01E2; L; 01E3; #LATIN CAPITAL LETTER AE WITH MACRON
+01E4; L; 01E5; #LATIN CAPITAL LETTER G WITH STROKE
+01E6; L; 01E7; #LATIN CAPITAL LETTER G WITH CARON
+01E8; L; 01E9; #LATIN CAPITAL LETTER K WITH CARON
+01EA; L; 01EB; #LATIN CAPITAL LETTER O WITH OGONEK
+01EC; L; 01ED; #LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+01EE; L; 01EF; #LATIN CAPITAL LETTER EZH WITH CARON
+01F0; E; 006A 030C; #LATIN SMALL LETTER J WITH CARON
+01F1; L; 01F3; #LATIN CAPITAL LETTER DZ
+01F2; L; 01F3; #LATIN CAPITAL LETTER D WITH SMALL LETTER Z
+01F4; L; 01F5; #LATIN CAPITAL LETTER G WITH ACUTE
+01F6; L; 0195; #LATIN CAPITAL LETTER HWAIR
+01F7; L; 01BF; #LATIN CAPITAL LETTER WYNN
+01F8; L; 01F9; #LATIN CAPITAL LETTER N WITH GRAVE
+01FA; L; 01FB; #LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+01FC; L; 01FD; #LATIN CAPITAL LETTER AE WITH ACUTE
+01FE; L; 01FF; #LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+0200; L; 0201; #LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
+0202; L; 0203; #LATIN CAPITAL LETTER A WITH INVERTED BREVE
+0204; L; 0205; #LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
+0206; L; 0207; #LATIN CAPITAL LETTER E WITH INVERTED BREVE
+0208; L; 0209; #LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
+020A; L; 020B; #LATIN CAPITAL LETTER I WITH INVERTED BREVE
+020C; L; 020D; #LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
+020E; L; 020F; #LATIN CAPITAL LETTER O WITH INVERTED BREVE
+0210; L; 0211; #LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
+0212; L; 0213; #LATIN CAPITAL LETTER R WITH INVERTED BREVE
+0214; L; 0215; #LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
+0216; L; 0217; #LATIN CAPITAL LETTER U WITH INVERTED BREVE
+0218; L; 0219; #LATIN CAPITAL LETTER S WITH COMMA BELOW
+021A; L; 021B; #LATIN CAPITAL LETTER T WITH COMMA BELOW
+021C; L; 021D; #LATIN CAPITAL LETTER YOGH
+021E; L; 021F; #LATIN CAPITAL LETTER H WITH CARON
+0222; L; 0223; #LATIN CAPITAL LETTER OU
+0224; L; 0225; #LATIN CAPITAL LETTER Z WITH HOOK
+0226; L; 0227; #LATIN CAPITAL LETTER A WITH DOT ABOVE
+0228; L; 0229; #LATIN CAPITAL LETTER E WITH CEDILLA
+022A; L; 022B; #LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+022C; L; 022D; #LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+022E; L; 022F; #LATIN CAPITAL LETTER O WITH DOT ABOVE
+0230; L; 0231; #LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+0232; L; 0233; #LATIN CAPITAL LETTER Y WITH MACRON
+0345; E; 03B9; #COMBINING GREEK YPOGEGRAMMENI
+0386; L; 03AC; #GREEK CAPITAL LETTER ALPHA WITH TONOS
+0388; L; 03AD; #GREEK CAPITAL LETTER EPSILON WITH TONOS
+0389; L; 03AE; #GREEK CAPITAL LETTER ETA WITH TONOS
+038A; L; 03AF; #GREEK CAPITAL LETTER IOTA WITH TONOS
+038C; L; 03CC; #GREEK CAPITAL LETTER OMICRON WITH TONOS
+038E; L; 03CD; #GREEK CAPITAL LETTER UPSILON WITH TONOS
+038F; L; 03CE; #GREEK CAPITAL LETTER OMEGA WITH TONOS
+0390; E; 03B9 0308 0301; #GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+0391; L; 03B1; #GREEK CAPITAL LETTER ALPHA
+0392; L; 03B2; #GREEK CAPITAL LETTER BETA
+0393; L; 03B3; #GREEK CAPITAL LETTER GAMMA
+0394; L; 03B4; #GREEK CAPITAL LETTER DELTA
+0395; L; 03B5; #GREEK CAPITAL LETTER EPSILON
+0396; L; 03B6; #GREEK CAPITAL LETTER ZETA
+0397; L; 03B7; #GREEK CAPITAL LETTER ETA
+0398; L; 03B8; #GREEK CAPITAL LETTER THETA
+0399; L; 03B9; #GREEK CAPITAL LETTER IOTA
+039A; L; 03BA; #GREEK CAPITAL LETTER KAPPA
+039B; L; 03BB; #GREEK CAPITAL LETTER LAMDA
+039C; L; 03BC; #GREEK CAPITAL LETTER MU
+039D; L; 03BD; #GREEK CAPITAL LETTER NU
+039E; L; 03BE; #GREEK CAPITAL LETTER XI
+039F; L; 03BF; #GREEK CAPITAL LETTER OMICRON
+03A0; L; 03C0; #GREEK CAPITAL LETTER PI
+03A1; L; 03C1; #GREEK CAPITAL LETTER RHO
+03A3; E; 03C2; #GREEK CAPITAL LETTER SIGMA
+03A4; L; 03C4; #GREEK CAPITAL LETTER TAU
+03A5; L; 03C5; #GREEK CAPITAL LETTER UPSILON
+03A6; L; 03C6; #GREEK CAPITAL LETTER PHI
+03A7; L; 03C7; #GREEK CAPITAL LETTER CHI
+03A8; L; 03C8; #GREEK CAPITAL LETTER PSI
+03A9; L; 03C9; #GREEK CAPITAL LETTER OMEGA
+03AA; L; 03CA; #GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+03AB; L; 03CB; #GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+03B0; E; 03C5 0308 0301; #GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+03C2; L; 03C2; #GREEK SMALL LETTER FINAL SIGMA
+03C3; E; 03C2; #GREEK SMALL LETTER SIGMA
+03D0; E; 03B2; #GREEK BETA SYMBOL
+03D1; E; 03B8; #GREEK THETA SYMBOL
+03D5; E; 03C6; #GREEK PHI SYMBOL
+03D6; E; 03C0; #GREEK PI SYMBOL
+03DA; L; 03DB; #GREEK LETTER STIGMA
+03DC; L; 03DD; #GREEK LETTER DIGAMMA
+03DE; L; 03DF; #GREEK LETTER KOPPA
+03E0; L; 03E1; #GREEK LETTER SAMPI
+03E2; L; 03E3; #COPTIC CAPITAL LETTER SHEI
+03E4; L; 03E5; #COPTIC CAPITAL LETTER FEI
+03E6; L; 03E7; #COPTIC CAPITAL LETTER KHEI
+03E8; L; 03E9; #COPTIC CAPITAL LETTER HORI
+03EA; L; 03EB; #COPTIC CAPITAL LETTER GANGIA
+03EC; L; 03ED; #COPTIC CAPITAL LETTER SHIMA
+03EE; L; 03EF; #COPTIC CAPITAL LETTER DEI
+03F0; E; 03BA; #GREEK KAPPA SYMBOL
+03F1; E; 03C1; #GREEK RHO SYMBOL
+03F2; E; 03C2; #GREEK LUNATE SIGMA SYMBOL
+0400; L; 0450; #CYRILLIC CAPITAL LETTER IE WITH GRAVE
+0401; L; 0451; #CYRILLIC CAPITAL LETTER IO
+0402; L; 0452; #CYRILLIC CAPITAL LETTER DJE
+0403; L; 0453; #CYRILLIC CAPITAL LETTER GJE
+0404; L; 0454; #CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0405; L; 0455; #CYRILLIC CAPITAL LETTER DZE
+0406; L; 0456; #CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0407; L; 0457; #CYRILLIC CAPITAL LETTER YI
+0408; L; 0458; #CYRILLIC CAPITAL LETTER JE
+0409; L; 0459; #CYRILLIC CAPITAL LETTER LJE
+040A; L; 045A; #CYRILLIC CAPITAL LETTER NJE
+040B; L; 045B; #CYRILLIC CAPITAL LETTER TSHE
+040C; L; 045C; #CYRILLIC CAPITAL LETTER KJE
+040D; L; 045D; #CYRILLIC CAPITAL LETTER I WITH GRAVE
+040E; L; 045E; #CYRILLIC CAPITAL LETTER SHORT U
+040F; L; 045F; #CYRILLIC CAPITAL LETTER DZHE
+0410; L; 0430; #CYRILLIC CAPITAL LETTER A
+0411; L; 0431; #CYRILLIC CAPITAL LETTER BE
+0412; L; 0432; #CYRILLIC CAPITAL LETTER VE
+0413; L; 0433; #CYRILLIC CAPITAL LETTER GHE
+0414; L; 0434; #CYRILLIC CAPITAL LETTER DE
+0415; L; 0435; #CYRILLIC CAPITAL LETTER IE
+0416; L; 0436; #CYRILLIC CAPITAL LETTER ZHE
+0417; L; 0437; #CYRILLIC CAPITAL LETTER ZE
+0418; L; 0438; #CYRILLIC CAPITAL LETTER I
+0419; L; 0439; #CYRILLIC CAPITAL LETTER SHORT I
+041A; L; 043A; #CYRILLIC CAPITAL LETTER KA
+041B; L; 043B; #CYRILLIC CAPITAL LETTER EL
+041C; L; 043C; #CYRILLIC CAPITAL LETTER EM
+041D; L; 043D; #CYRILLIC CAPITAL LETTER EN
+041E; L; 043E; #CYRILLIC CAPITAL LETTER O
+041F; L; 043F; #CYRILLIC CAPITAL LETTER PE
+0420; L; 0440; #CYRILLIC CAPITAL LETTER ER
+0421; L; 0441; #CYRILLIC CAPITAL LETTER ES
+0422; L; 0442; #CYRILLIC CAPITAL LETTER TE
+0423; L; 0443; #CYRILLIC CAPITAL LETTER U
+0424; L; 0444; #CYRILLIC CAPITAL LETTER EF
+0425; L; 0445; #CYRILLIC CAPITAL LETTER HA
+0426; L; 0446; #CYRILLIC CAPITAL LETTER TSE
+0427; L; 0447; #CYRILLIC CAPITAL LETTER CHE
+0428; L; 0448; #CYRILLIC CAPITAL LETTER SHA
+0429; L; 0449; #CYRILLIC CAPITAL LETTER SHCHA
+042A; L; 044A; #CYRILLIC CAPITAL LETTER HARD SIGN
+042B; L; 044B; #CYRILLIC CAPITAL LETTER YERU
+042C; L; 044C; #CYRILLIC CAPITAL LETTER SOFT SIGN
+042D; L; 044D; #CYRILLIC CAPITAL LETTER E
+042E; L; 044E; #CYRILLIC CAPITAL LETTER YU
+042F; L; 044F; #CYRILLIC CAPITAL LETTER YA
+0460; L; 0461; #CYRILLIC CAPITAL LETTER OMEGA
+0462; L; 0463; #CYRILLIC CAPITAL LETTER YAT
+0464; L; 0465; #CYRILLIC CAPITAL LETTER IOTIFIED E
+0466; L; 0467; #CYRILLIC CAPITAL LETTER LITTLE YUS
+0468; L; 0469; #CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
+046A; L; 046B; #CYRILLIC CAPITAL LETTER BIG YUS
+046C; L; 046D; #CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
+046E; L; 046F; #CYRILLIC CAPITAL LETTER KSI
+0470; L; 0471; #CYRILLIC CAPITAL LETTER PSI
+0472; L; 0473; #CYRILLIC CAPITAL LETTER FITA
+0474; L; 0475; #CYRILLIC CAPITAL LETTER IZHITSA
+0476; L; 0477; #CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0478; L; 0479; #CYRILLIC CAPITAL LETTER UK
+047A; L; 047B; #CYRILLIC CAPITAL LETTER ROUND OMEGA
+047C; L; 047D; #CYRILLIC CAPITAL LETTER OMEGA WITH TITLO
+047E; L; 047F; #CYRILLIC CAPITAL LETTER OT
+0480; L; 0481; #CYRILLIC CAPITAL LETTER KOPPA
+048C; L; 048D; #CYRILLIC CAPITAL LETTER SEMISOFT SIGN
+048E; L; 048F; #CYRILLIC CAPITAL LETTER ER WITH TICK
+0490; L; 0491; #CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+0492; L; 0493; #CYRILLIC CAPITAL LETTER GHE WITH STROKE
+0494; L; 0495; #CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK
+0496; L; 0497; #CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
+0498; L; 0499; #CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
+049A; L; 049B; #CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+049C; L; 049D; #CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
+049E; L; 049F; #CYRILLIC CAPITAL LETTER KA WITH STROKE
+04A0; L; 04A1; #CYRILLIC CAPITAL LETTER BASHKIR KA
+04A2; L; 04A3; #CYRILLIC CAPITAL LETTER EN WITH DESCENDER
+04A4; L; 04A5; #CYRILLIC CAPITAL LIGATURE EN GHE
+04A6; L; 04A7; #CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK
+04A8; L; 04A9; #CYRILLIC CAPITAL LETTER ABKHASIAN HA
+04AA; L; 04AB; #CYRILLIC CAPITAL LETTER ES WITH DESCENDER
+04AC; L; 04AD; #CYRILLIC CAPITAL LETTER TE WITH DESCENDER
+04AE; L; 04AF; #CYRILLIC CAPITAL LETTER STRAIGHT U
+04B0; L; 04B1; #CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+04B2; L; 04B3; #CYRILLIC CAPITAL LETTER HA WITH DESCENDER
+04B4; L; 04B5; #CYRILLIC CAPITAL LIGATURE TE TSE
+04B6; L; 04B7; #CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
+04B8; L; 04B9; #CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
+04BA; L; 04BB; #CYRILLIC CAPITAL LETTER SHHA
+04BC; L; 04BD; #CYRILLIC CAPITAL LETTER ABKHASIAN CHE
+04BE; L; 04BF; #CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER
+04C1; L; 04C2; #CYRILLIC CAPITAL LETTER ZHE WITH BREVE
+04C3; L; 04C4; #CYRILLIC CAPITAL LETTER KA WITH HOOK
+04C7; L; 04C8; #CYRILLIC CAPITAL LETTER EN WITH HOOK
+04CB; L; 04CC; #CYRILLIC CAPITAL LETTER KHAKASSIAN CHE
+04D0; L; 04D1; #CYRILLIC CAPITAL LETTER A WITH BREVE
+04D2; L; 04D3; #CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+04D4; L; 04D5; #CYRILLIC CAPITAL LIGATURE A IE
+04D6; L; 04D7; #CYRILLIC CAPITAL LETTER IE WITH BREVE
+04D8; L; 04D9; #CYRILLIC CAPITAL LETTER SCHWA
+04DA; L; 04DB; #CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+04DC; L; 04DD; #CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+04DE; L; 04DF; #CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+04E0; L; 04E1; #CYRILLIC CAPITAL LETTER ABKHASIAN DZE
+04E2; L; 04E3; #CYRILLIC CAPITAL LETTER I WITH MACRON
+04E4; L; 04E5; #CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+04E6; L; 04E7; #CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+04E8; L; 04E9; #CYRILLIC CAPITAL LETTER BARRED O
+04EA; L; 04EB; #CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+04EC; L; 04ED; #CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+04EE; L; 04EF; #CYRILLIC CAPITAL LETTER U WITH MACRON
+04F0; L; 04F1; #CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+04F2; L; 04F3; #CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+04F4; L; 04F5; #CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+04F8; L; 04F9; #CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+0531; L; 0561; #ARMENIAN CAPITAL LETTER AYB
+0532; L; 0562; #ARMENIAN CAPITAL LETTER BEN
+0533; L; 0563; #ARMENIAN CAPITAL LETTER GIM
+0534; L; 0564; #ARMENIAN CAPITAL LETTER DA
+0535; L; 0565; #ARMENIAN CAPITAL LETTER ECH
+0536; L; 0566; #ARMENIAN CAPITAL LETTER ZA
+0537; L; 0567; #ARMENIAN CAPITAL LETTER EH
+0538; L; 0568; #ARMENIAN CAPITAL LETTER ET
+0539; L; 0569; #ARMENIAN CAPITAL LETTER TO
+053A; L; 056A; #ARMENIAN CAPITAL LETTER ZHE
+053B; L; 056B; #ARMENIAN CAPITAL LETTER INI
+053C; L; 056C; #ARMENIAN CAPITAL LETTER LIWN
+053D; L; 056D; #ARMENIAN CAPITAL LETTER XEH
+053E; L; 056E; #ARMENIAN CAPITAL LETTER CA
+053F; L; 056F; #ARMENIAN CAPITAL LETTER KEN
+0540; L; 0570; #ARMENIAN CAPITAL LETTER HO
+0541; L; 0571; #ARMENIAN CAPITAL LETTER JA
+0542; L; 0572; #ARMENIAN CAPITAL LETTER GHAD
+0543; L; 0573; #ARMENIAN CAPITAL LETTER CHEH
+0544; L; 0574; #ARMENIAN CAPITAL LETTER MEN
+0545; L; 0575; #ARMENIAN CAPITAL LETTER YI
+0546; L; 0576; #ARMENIAN CAPITAL LETTER NOW
+0547; L; 0577; #ARMENIAN CAPITAL LETTER SHA
+0548; L; 0578; #ARMENIAN CAPITAL LETTER VO
+0549; L; 0579; #ARMENIAN CAPITAL LETTER CHA
+054A; L; 057A; #ARMENIAN CAPITAL LETTER PEH
+054B; L; 057B; #ARMENIAN CAPITAL LETTER JHEH
+054C; L; 057C; #ARMENIAN CAPITAL LETTER RA
+054D; L; 057D; #ARMENIAN CAPITAL LETTER SEH
+054E; L; 057E; #ARMENIAN CAPITAL LETTER VEW
+054F; L; 057F; #ARMENIAN CAPITAL LETTER TIWN
+0550; L; 0580; #ARMENIAN CAPITAL LETTER REH
+0551; L; 0581; #ARMENIAN CAPITAL LETTER CO
+0552; L; 0582; #ARMENIAN CAPITAL LETTER YIWN
+0553; L; 0583; #ARMENIAN CAPITAL LETTER PIWR
+0554; L; 0584; #ARMENIAN CAPITAL LETTER KEH
+0555; L; 0585; #ARMENIAN CAPITAL LETTER OH
+0556; L; 0586; #ARMENIAN CAPITAL LETTER FEH
+0587; E; 0565 0582; #ARMENIAN SMALL LIGATURE ECH YIWN
+1E00; L; 1E01; #LATIN CAPITAL LETTER A WITH RING BELOW
+1E02; L; 1E03; #LATIN CAPITAL LETTER B WITH DOT ABOVE
+1E04; L; 1E05; #LATIN CAPITAL LETTER B WITH DOT BELOW
+1E06; L; 1E07; #LATIN CAPITAL LETTER B WITH LINE BELOW
+1E08; L; 1E09; #LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+1E0A; L; 1E0B; #LATIN CAPITAL LETTER D WITH DOT ABOVE
+1E0C; L; 1E0D; #LATIN CAPITAL LETTER D WITH DOT BELOW
+1E0E; L; 1E0F; #LATIN CAPITAL LETTER D WITH LINE BELOW
+1E10; L; 1E11; #LATIN CAPITAL LETTER D WITH CEDILLA
+1E12; L; 1E13; #LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
+1E14; L; 1E15; #LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+1E16; L; 1E17; #LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+1E18; L; 1E19; #LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
+1E1A; L; 1E1B; #LATIN CAPITAL LETTER E WITH TILDE BELOW
+1E1C; L; 1E1D; #LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+1E1E; L; 1E1F; #LATIN CAPITAL LETTER F WITH DOT ABOVE
+1E20; L; 1E21; #LATIN CAPITAL LETTER G WITH MACRON
+1E22; L; 1E23; #LATIN CAPITAL LETTER H WITH DOT ABOVE
+1E24; L; 1E25; #LATIN CAPITAL LETTER H WITH DOT BELOW
+1E26; L; 1E27; #LATIN CAPITAL LETTER H WITH DIAERESIS
+1E28; L; 1E29; #LATIN CAPITAL LETTER H WITH CEDILLA
+1E2A; L; 1E2B; #LATIN CAPITAL LETTER H WITH BREVE BELOW
+1E2C; L; 1E2D; #LATIN CAPITAL LETTER I WITH TILDE BELOW
+1E2E; L; 1E2F; #LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+1E30; L; 1E31; #LATIN CAPITAL LETTER K WITH ACUTE
+1E32; L; 1E33; #LATIN CAPITAL LETTER K WITH DOT BELOW
+1E34; L; 1E35; #LATIN CAPITAL LETTER K WITH LINE BELOW
+1E36; L; 1E37; #LATIN CAPITAL LETTER L WITH DOT BELOW
+1E38; L; 1E39; #LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+1E3A; L; 1E3B; #LATIN CAPITAL LETTER L WITH LINE BELOW
+1E3C; L; 1E3D; #LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
+1E3E; L; 1E3F; #LATIN CAPITAL LETTER M WITH ACUTE
+1E40; L; 1E41; #LATIN CAPITAL LETTER M WITH DOT ABOVE
+1E42; L; 1E43; #LATIN CAPITAL LETTER M WITH DOT BELOW
+1E44; L; 1E45; #LATIN CAPITAL LETTER N WITH DOT ABOVE
+1E46; L; 1E47; #LATIN CAPITAL LETTER N WITH DOT BELOW
+1E48; L; 1E49; #LATIN CAPITAL LETTER N WITH LINE BELOW
+1E4A; L; 1E4B; #LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
+1E4C; L; 1E4D; #LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+1E4E; L; 1E4F; #LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+1E50; L; 1E51; #LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+1E52; L; 1E53; #LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+1E54; L; 1E55; #LATIN CAPITAL LETTER P WITH ACUTE
+1E56; L; 1E57; #LATIN CAPITAL LETTER P WITH DOT ABOVE
+1E58; L; 1E59; #LATIN CAPITAL LETTER R WITH DOT ABOVE
+1E5A; L; 1E5B; #LATIN CAPITAL LETTER R WITH DOT BELOW
+1E5C; L; 1E5D; #LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+1E5E; L; 1E5F; #LATIN CAPITAL LETTER R WITH LINE BELOW
+1E60; L; 1E61; #LATIN CAPITAL LETTER S WITH DOT ABOVE
+1E62; L; 1E63; #LATIN CAPITAL LETTER S WITH DOT BELOW
+1E64; L; 1E65; #LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+1E66; L; 1E67; #LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+1E68; L; 1E69; #LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+1E6A; L; 1E6B; #LATIN CAPITAL LETTER T WITH DOT ABOVE
+1E6C; L; 1E6D; #LATIN CAPITAL LETTER T WITH DOT BELOW
+1E6E; L; 1E6F; #LATIN CAPITAL LETTER T WITH LINE BELOW
+1E70; L; 1E71; #LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
+1E72; L; 1E73; #LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
+1E74; L; 1E75; #LATIN CAPITAL LETTER U WITH TILDE BELOW
+1E76; L; 1E77; #LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
+1E78; L; 1E79; #LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+1E7A; L; 1E7B; #LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+1E7C; L; 1E7D; #LATIN CAPITAL LETTER V WITH TILDE
+1E7E; L; 1E7F; #LATIN CAPITAL LETTER V WITH DOT BELOW
+1E80; L; 1E81; #LATIN CAPITAL LETTER W WITH GRAVE
+1E82; L; 1E83; #LATIN CAPITAL LETTER W WITH ACUTE
+1E84; L; 1E85; #LATIN CAPITAL LETTER W WITH DIAERESIS
+1E86; L; 1E87; #LATIN CAPITAL LETTER W WITH DOT ABOVE
+1E88; L; 1E89; #LATIN CAPITAL LETTER W WITH DOT BELOW
+1E8A; L; 1E8B; #LATIN CAPITAL LETTER X WITH DOT ABOVE
+1E8C; L; 1E8D; #LATIN CAPITAL LETTER X WITH DIAERESIS
+1E8E; L; 1E8F; #LATIN CAPITAL LETTER Y WITH DOT ABOVE
+1E90; L; 1E91; #LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+1E92; L; 1E93; #LATIN CAPITAL LETTER Z WITH DOT BELOW
+1E94; L; 1E95; #LATIN CAPITAL LETTER Z WITH LINE BELOW
+1E96; E; 0068 0331; #LATIN SMALL LETTER H WITH LINE BELOW
+1E97; E; 0074 0308; #LATIN SMALL LETTER T WITH DIAERESIS
+1E98; E; 0077 030A; #LATIN SMALL LETTER W WITH RING ABOVE
+1E99; E; 0079 030A; #LATIN SMALL LETTER Y WITH RING ABOVE
+1E9A; E; 0061 02BE; #LATIN SMALL LETTER A WITH RIGHT HALF RING
+1E9B; E; 1E61; #LATIN SMALL LETTER LONG S WITH DOT ABOVE
+1EA0; L; 1EA1; #LATIN CAPITAL LETTER A WITH DOT BELOW
+1EA2; L; 1EA3; #LATIN CAPITAL LETTER A WITH HOOK ABOVE
+1EA4; L; 1EA5; #LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+1EA6; L; 1EA7; #LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+1EA8; L; 1EA9; #LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+1EAA; L; 1EAB; #LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+1EAC; L; 1EAD; #LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+1EAE; L; 1EAF; #LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+1EB0; L; 1EB1; #LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+1EB2; L; 1EB3; #LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+1EB4; L; 1EB5; #LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+1EB6; L; 1EB7; #LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+1EB8; L; 1EB9; #LATIN CAPITAL LETTER E WITH DOT BELOW
+1EBA; L; 1EBB; #LATIN CAPITAL LETTER E WITH HOOK ABOVE
+1EBC; L; 1EBD; #LATIN CAPITAL LETTER E WITH TILDE
+1EBE; L; 1EBF; #LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+1EC0; L; 1EC1; #LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+1EC2; L; 1EC3; #LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+1EC4; L; 1EC5; #LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+1EC6; L; 1EC7; #LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+1EC8; L; 1EC9; #LATIN CAPITAL LETTER I WITH HOOK ABOVE
+1ECA; L; 1ECB; #LATIN CAPITAL LETTER I WITH DOT BELOW
+1ECC; L; 1ECD; #LATIN CAPITAL LETTER O WITH DOT BELOW
+1ECE; L; 1ECF; #LATIN CAPITAL LETTER O WITH HOOK ABOVE
+1ED0; L; 1ED1; #LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+1ED2; L; 1ED3; #LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+1ED4; L; 1ED5; #LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+1ED6; L; 1ED7; #LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+1ED8; L; 1ED9; #LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+1EDA; L; 1EDB; #LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+1EDC; L; 1EDD; #LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+1EDE; L; 1EDF; #LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+1EE0; L; 1EE1; #LATIN CAPITAL LETTER O WITH HORN AND TILDE
+1EE2; L; 1EE3; #LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+1EE4; L; 1EE5; #LATIN CAPITAL LETTER U WITH DOT BELOW
+1EE6; L; 1EE7; #LATIN CAPITAL LETTER U WITH HOOK ABOVE
+1EE8; L; 1EE9; #LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+1EEA; L; 1EEB; #LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+1EEC; L; 1EED; #LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+1EEE; L; 1EEF; #LATIN CAPITAL LETTER U WITH HORN AND TILDE
+1EF0; L; 1EF1; #LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+1EF2; L; 1EF3; #LATIN CAPITAL LETTER Y WITH GRAVE
+1EF4; L; 1EF5; #LATIN CAPITAL LETTER Y WITH DOT BELOW
+1EF6; L; 1EF7; #LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+1EF8; L; 1EF9; #LATIN CAPITAL LETTER Y WITH TILDE
+1F08; L; 1F00; #GREEK CAPITAL LETTER ALPHA WITH PSILI
+1F09; L; 1F01; #GREEK CAPITAL LETTER ALPHA WITH DASIA
+1F0A; L; 1F02; #GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+1F0B; L; 1F03; #GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+1F0C; L; 1F04; #GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+1F0D; L; 1F05; #GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+1F0E; L; 1F06; #GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+1F0F; L; 1F07; #GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+1F18; L; 1F10; #GREEK CAPITAL LETTER EPSILON WITH PSILI
+1F19; L; 1F11; #GREEK CAPITAL LETTER EPSILON WITH DASIA
+1F1A; L; 1F12; #GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
+1F1B; L; 1F13; #GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
+1F1C; L; 1F14; #GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+1F1D; L; 1F15; #GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+1F28; L; 1F20; #GREEK CAPITAL LETTER ETA WITH PSILI
+1F29; L; 1F21; #GREEK CAPITAL LETTER ETA WITH DASIA
+1F2A; L; 1F22; #GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+1F2B; L; 1F23; #GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+1F2C; L; 1F24; #GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+1F2D; L; 1F25; #GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+1F2E; L; 1F26; #GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+1F2F; L; 1F27; #GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+1F38; L; 1F30; #GREEK CAPITAL LETTER IOTA WITH PSILI
+1F39; L; 1F31; #GREEK CAPITAL LETTER IOTA WITH DASIA
+1F3A; L; 1F32; #GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
+1F3B; L; 1F33; #GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
+1F3C; L; 1F34; #GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+1F3D; L; 1F35; #GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+1F3E; L; 1F36; #GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
+1F3F; L; 1F37; #GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+1F48; L; 1F40; #GREEK CAPITAL LETTER OMICRON WITH PSILI
+1F49; L; 1F41; #GREEK CAPITAL LETTER OMICRON WITH DASIA
+1F4A; L; 1F42; #GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
+1F4B; L; 1F43; #GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
+1F4C; L; 1F44; #GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+1F4D; L; 1F45; #GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+1F50; E; 03C5 0313; #GREEK SMALL LETTER UPSILON WITH PSILI
+1F52; E; 03C5 0313 0300; #GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+1F54; E; 03C5 0313 0301; #GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+1F56; E; 03C5 0313 0342; #GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+1F59; L; 1F51; #GREEK CAPITAL LETTER UPSILON WITH DASIA
+1F5B; L; 1F53; #GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+1F5D; L; 1F55; #GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+1F5F; L; 1F57; #GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F68; L; 1F60; #GREEK CAPITAL LETTER OMEGA WITH PSILI
+1F69; L; 1F61; #GREEK CAPITAL LETTER OMEGA WITH DASIA
+1F6A; L; 1F62; #GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+1F6B; L; 1F63; #GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+1F6C; L; 1F64; #GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+1F6D; L; 1F65; #GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+1F6E; L; 1F66; #GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+1F6F; L; 1F67; #GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+1F80; E; 1F00 03B9; #GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+1F81; E; 1F01 03B9; #GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+1F82; E; 1F02 03B9; #GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1F83; E; 1F03 03B9; #GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1F84; E; 1F04 03B9; #GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1F85; E; 1F05 03B9; #GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1F86; E; 1F06 03B9; #GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1F87; E; 1F07 03B9; #GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F88; E; 1F00 03B9; #GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+1F89; E; 1F01 03B9; #GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+1F8A; E; 1F02 03B9; #GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F8B; E; 1F03 03B9; #GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F8C; E; 1F04 03B9; #GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F8D; E; 1F05 03B9; #GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F8E; E; 1F06 03B9; #GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F8F; E; 1F07 03B9; #GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1F90; E; 1F20 03B9; #GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+1F91; E; 1F21 03B9; #GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+1F92; E; 1F22 03B9; #GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1F93; E; 1F23 03B9; #GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1F94; E; 1F24 03B9; #GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1F95; E; 1F25 03B9; #GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1F96; E; 1F26 03B9; #GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1F97; E; 1F27 03B9; #GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F98; E; 1F20 03B9; #GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+1F99; E; 1F21 03B9; #GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+1F9A; E; 1F22 03B9; #GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F9B; E; 1F23 03B9; #GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F9C; E; 1F24 03B9; #GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F9D; E; 1F25 03B9; #GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F9E; E; 1F26 03B9; #GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F9F; E; 1F27 03B9; #GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FA0; E; 1F60 03B9; #GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+1FA1; E; 1F61 03B9; #GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+1FA2; E; 1F62 03B9; #GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1FA3; E; 1F63 03B9; #GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1FA4; E; 1F64 03B9; #GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1FA5; E; 1F65 03B9; #GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1FA6; E; 1F66 03B9; #GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1FA7; E; 1F67 03B9; #GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1FA8; E; 1F60 03B9; #GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+1FA9; E; 1F61 03B9; #GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+1FAA; E; 1F62 03B9; #GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1FAB; E; 1F63 03B9; #GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1FAC; E; 1F64 03B9; #GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1FAD; E; 1F65 03B9; #GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1FAE; E; 1F66 03B9; #GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1FAF; E; 1F67 03B9; #GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FB2; E; 1F70 03B9; #GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+1FB3; E; 03B1 03B9; #GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
+1FB4; E; 03AC 03B9; #GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FB6; E; 03B1 0342; #GREEK SMALL LETTER ALPHA WITH PERISPOMENI
+1FB7; E; 03B1 0342 03B9; #GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FB8; L; 1FB0; #GREEK CAPITAL LETTER ALPHA WITH VRACHY
+1FB9; L; 1FB1; #GREEK CAPITAL LETTER ALPHA WITH MACRON
+1FBA; L; 1F70; #GREEK CAPITAL LETTER ALPHA WITH VARIA
+1FBB; L; 1F71; #GREEK CAPITAL LETTER ALPHA WITH OXIA
+1FBC; E; 03B1 03B9; #GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FBE; E; 03B9; #GREEK PROSGEGRAMMENI
+1FC2; E; 1F74 03B9; #GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+1FC3; E; 03B7 03B9; #GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
+1FC4; E; 03AE 03B9; #GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FC6; E; 03B7 0342; #GREEK SMALL LETTER ETA WITH PERISPOMENI
+1FC7; E; 03B7 0342 03B9; #GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FC8; L; 1F72; #GREEK CAPITAL LETTER EPSILON WITH VARIA
+1FC9; L; 1F73; #GREEK CAPITAL LETTER EPSILON WITH OXIA
+1FCA; L; 1F74; #GREEK CAPITAL LETTER ETA WITH VARIA
+1FCB; L; 1F75; #GREEK CAPITAL LETTER ETA WITH OXIA
+1FCC; E; 03B7 03B9; #GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FD2; E; 03B9 0308 0300; #GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+1FD3; E; 03B9 0308 0301; #GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6; E; 03B9 0342; #GREEK SMALL LETTER IOTA WITH PERISPOMENI
+1FD7; E; 03B9 0308 0342; #GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+1FD8; L; 1FD0; #GREEK CAPITAL LETTER IOTA WITH VRACHY
+1FD9; L; 1FD1; #GREEK CAPITAL LETTER IOTA WITH MACRON
+1FDA; L; 1F76; #GREEK CAPITAL LETTER IOTA WITH VARIA
+1FDB; L; 1F77; #GREEK CAPITAL LETTER IOTA WITH OXIA
+1FE2; E; 03C5 0308 0300; #GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+1FE3; E; 03C5 0308 0301; #GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
+1FE4; E; 03C1 0313; #GREEK SMALL LETTER RHO WITH PSILI
+1FE6; E; 03C5 0342; #GREEK SMALL LETTER UPSILON WITH PERISPOMENI
+1FE7; E; 03C5 0308 0342; #GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+1FE8; L; 1FE0; #GREEK CAPITAL LETTER UPSILON WITH VRACHY
+1FE9; L; 1FE1; #GREEK CAPITAL LETTER UPSILON WITH MACRON
+1FEA; L; 1F7A; #GREEK CAPITAL LETTER UPSILON WITH VARIA
+1FEB; L; 1F7B; #GREEK CAPITAL LETTER UPSILON WITH OXIA
+1FEC; L; 1FE5; #GREEK CAPITAL LETTER RHO WITH DASIA
+1FF2; E; 1F7C 03B9; #GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+1FF3; E; 03C9 03B9; #GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
+1FF4; E; 03CE 03B9; #GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1FF6; E; 03C9 0342; #GREEK SMALL LETTER OMEGA WITH PERISPOMENI
+1FF7; E; 03C9 0342 03B9; #GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FF8; L; 1F78; #GREEK CAPITAL LETTER OMICRON WITH VARIA
+1FF9; L; 1F79; #GREEK CAPITAL LETTER OMICRON WITH OXIA
+1FFA; L; 1F7C; #GREEK CAPITAL LETTER OMEGA WITH VARIA
+1FFB; L; 1F7D; #GREEK CAPITAL LETTER OMEGA WITH OXIA
+1FFC; E; 03C9 03B9; #GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+2126; L; 03C9; #OHM SIGN
+212A; L; 006B; #KELVIN SIGN
+212B; L; 00E5; #ANGSTROM SIGN
+2160; L; 2170; #ROMAN NUMERAL ONE
+2161; L; 2171; #ROMAN NUMERAL TWO
+2162; L; 2172; #ROMAN NUMERAL THREE
+2163; L; 2173; #ROMAN NUMERAL FOUR
+2164; L; 2174; #ROMAN NUMERAL FIVE
+2165; L; 2175; #ROMAN NUMERAL SIX
+2166; L; 2176; #ROMAN NUMERAL SEVEN
+2167; L; 2177; #ROMAN NUMERAL EIGHT
+2168; L; 2178; #ROMAN NUMERAL NINE
+2169; L; 2179; #ROMAN NUMERAL TEN
+216A; L; 217A; #ROMAN NUMERAL ELEVEN
+216B; L; 217B; #ROMAN NUMERAL TWELVE
+216C; L; 217C; #ROMAN NUMERAL FIFTY
+216D; L; 217D; #ROMAN NUMERAL ONE HUNDRED
+216E; L; 217E; #ROMAN NUMERAL FIVE HUNDRED
+216F; L; 217F; #ROMAN NUMERAL ONE THOUSAND
+24B6; L; 24D0; #CIRCLED LATIN CAPITAL LETTER A
+24B7; L; 24D1; #CIRCLED LATIN CAPITAL LETTER B
+24B8; L; 24D2; #CIRCLED LATIN CAPITAL LETTER C
+24B9; L; 24D3; #CIRCLED LATIN CAPITAL LETTER D
+24BA; L; 24D4; #CIRCLED LATIN CAPITAL LETTER E
+24BB; L; 24D5; #CIRCLED LATIN CAPITAL LETTER F
+24BC; L; 24D6; #CIRCLED LATIN CAPITAL LETTER G
+24BD; L; 24D7; #CIRCLED LATIN CAPITAL LETTER H
+24BE; L; 24D8; #CIRCLED LATIN CAPITAL LETTER I
+24BF; L; 24D9; #CIRCLED LATIN CAPITAL LETTER J
+24C0; L; 24DA; #CIRCLED LATIN CAPITAL LETTER K
+24C1; L; 24DB; #CIRCLED LATIN CAPITAL LETTER L
+24C2; L; 24DC; #CIRCLED LATIN CAPITAL LETTER M
+24C3; L; 24DD; #CIRCLED LATIN CAPITAL LETTER N
+24C4; L; 24DE; #CIRCLED LATIN CAPITAL LETTER O
+24C5; L; 24DF; #CIRCLED LATIN CAPITAL LETTER P
+24C6; L; 24E0; #CIRCLED LATIN CAPITAL LETTER Q
+24C7; L; 24E1; #CIRCLED LATIN CAPITAL LETTER R
+24C8; L; 24E2; #CIRCLED LATIN CAPITAL LETTER S
+24C9; L; 24E3; #CIRCLED LATIN CAPITAL LETTER T
+24CA; L; 24E4; #CIRCLED LATIN CAPITAL LETTER U
+24CB; L; 24E5; #CIRCLED LATIN CAPITAL LETTER V
+24CC; L; 24E6; #CIRCLED LATIN CAPITAL LETTER W
+24CD; L; 24E7; #CIRCLED LATIN CAPITAL LETTER X
+24CE; L; 24E8; #CIRCLED LATIN CAPITAL LETTER Y
+24CF; L; 24E9; #CIRCLED LATIN CAPITAL LETTER Z
+FB00; E; 0066 0066; #LATIN SMALL LIGATURE FF
+FB01; E; 0066 0069; #LATIN SMALL LIGATURE FI
+FB02; E; 0066 006C; #LATIN SMALL LIGATURE FL
+FB03; E; 0066 0066 0069; #LATIN SMALL LIGATURE FFI
+FB04; E; 0066 0066 006C; #LATIN SMALL LIGATURE FFL
+FB05; E; 0073 0074; #LATIN SMALL LIGATURE LONG S T
+FB06; E; 0073 0074; #LATIN SMALL LIGATURE ST
+FB13; E; 0574 0576; #ARMENIAN SMALL LIGATURE MEN NOW
+FB14; E; 0574 0565; #ARMENIAN SMALL LIGATURE MEN ECH
+FB15; E; 0574 056B; #ARMENIAN SMALL LIGATURE MEN INI
+FB16; E; 057E 0576; #ARMENIAN SMALL LIGATURE VEW NOW
+FB17; E; 0574 056D; #ARMENIAN SMALL LIGATURE MEN XEH
+FF21; L; FF41; #FULLWIDTH LATIN CAPITAL LETTER A
+FF22; L; FF42; #FULLWIDTH LATIN CAPITAL LETTER B
+FF23; L; FF43; #FULLWIDTH LATIN CAPITAL LETTER C
+FF24; L; FF44; #FULLWIDTH LATIN CAPITAL LETTER D
+FF25; L; FF45; #FULLWIDTH LATIN CAPITAL LETTER E
+FF26; L; FF46; #FULLWIDTH LATIN CAPITAL LETTER F
+FF27; L; FF47; #FULLWIDTH LATIN CAPITAL LETTER G
+FF28; L; FF48; #FULLWIDTH LATIN CAPITAL LETTER H
+FF29; L; FF49; #FULLWIDTH LATIN CAPITAL LETTER I
+FF2A; L; FF4A; #FULLWIDTH LATIN CAPITAL LETTER J
+FF2B; L; FF4B; #FULLWIDTH LATIN CAPITAL LETTER K
+FF2C; L; FF4C; #FULLWIDTH LATIN CAPITAL LETTER L
+FF2D; L; FF4D; #FULLWIDTH LATIN CAPITAL LETTER M
+FF2E; L; FF4E; #FULLWIDTH LATIN CAPITAL LETTER N
+FF2F; L; FF4F; #FULLWIDTH LATIN CAPITAL LETTER O
+FF30; L; FF50; #FULLWIDTH LATIN CAPITAL LETTER P
+FF31; L; FF51; #FULLWIDTH LATIN CAPITAL LETTER Q
+FF32; L; FF52; #FULLWIDTH LATIN CAPITAL LETTER R
+FF33; L; FF53; #FULLWIDTH LATIN CAPITAL LETTER S
+FF34; L; FF54; #FULLWIDTH LATIN CAPITAL LETTER T
+FF35; L; FF55; #FULLWIDTH LATIN CAPITAL LETTER U
+FF36; L; FF56; #FULLWIDTH LATIN CAPITAL LETTER V
+FF37; L; FF57; #FULLWIDTH LATIN CAPITAL LETTER W
+FF38; L; FF58; #FULLWIDTH LATIN CAPITAL LETTER X
+FF39; L; FF59; #FULLWIDTH LATIN CAPITAL LETTER Y
+FF3A; L; FF5A; #FULLWIDTH LATIN CAPITAL LETTER Z
+
+
diff --git a/gnu/usr.bin/perl/lib/unicode/Category.pl b/gnu/usr.bin/perl/lib/unicode/Category.pl
index bffd1169bef..9c81514c58a 100644
--- a/gnu/usr.bin/perl/lib/unicode/Category.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Category.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0000 001f Cc
@@ -1503,4 +1503,6 @@ ffe9 ffec Sm
ffed ffee So
fff9 fffb Cf
fffc fffd So
+f0000 ffffd Co
+100000 10fffd Co
END
diff --git a/gnu/usr.bin/perl/lib/unicode/CombiningClass.pl b/gnu/usr.bin/perl/lib/unicode/CombiningClass.pl
index a40949830c3..628b9c63db2 100644
--- a/gnu/usr.bin/perl/lib/unicode/CombiningClass.pl
+++ b/gnu/usr.bin/perl/lib/unicode/CombiningClass.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0300 0314 230
diff --git a/gnu/usr.bin/perl/lib/unicode/CompExcl.txt b/gnu/usr.bin/perl/lib/unicode/CompExcl.txt
index 5ea46afc639..53f846729d5 100644
--- a/gnu/usr.bin/perl/lib/unicode/CompExcl.txt
+++ b/gnu/usr.bin/perl/lib/unicode/CompExcl.txt
@@ -1,3 +1,5 @@
+# CompositionExclusions-2.txt
+#
# Composition Exclusions
# This file lists the characters from the UTR #15 Composition Exclusion Table.
#
@@ -133,8 +135,8 @@ FB4E # HEBREW LETTER PE WITH RAFE
# (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.
+# of a sequence of characters, the first of which has a non-zero
+# combining class.
# These characters are simply quoted here for reference.
# 0344 COMBINING GREEK DIALYTIKA TONOS
diff --git a/gnu/usr.bin/perl/lib/unicode/Decomposition.pl b/gnu/usr.bin/perl/lib/unicode/Decomposition.pl
index ecc30b205e3..1fe29cd1577 100644
--- a/gnu/usr.bin/perl/lib/unicode/Decomposition.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Decomposition.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
00a0 <noBreak> 0020
diff --git a/gnu/usr.bin/perl/lib/unicode/In/AlphabeticPresentationForms.pl b/gnu/usr.bin/perl/lib/unicode/In/AlphabeticPresentationForms.pl
index c42e944a3c5..a85b9cabeca 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/AlphabeticPresentationForms.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/AlphabeticPresentationForms.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
FB00 FB4F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Arabic.pl b/gnu/usr.bin/perl/lib/unicode/In/Arabic.pl
index 5010ab73de6..5fbbbfa028e 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Arabic.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Arabic.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0600 06FF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/ArabicPresentationForms-A.pl b/gnu/usr.bin/perl/lib/unicode/In/ArabicPresentationForms-A.pl
index 6edd74d755b..62521bb1b1b 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/ArabicPresentationForms-A.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/ArabicPresentationForms-A.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
FB50 FDFF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/ArabicPresentationForms-B.pl b/gnu/usr.bin/perl/lib/unicode/In/ArabicPresentationForms-B.pl
index 964073931ed..6b2d44742b1 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/ArabicPresentationForms-B.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/ArabicPresentationForms-B.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
FE70 FEFE
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Armenian.pl b/gnu/usr.bin/perl/lib/unicode/In/Armenian.pl
index 19b74acd71a..d4736a75064 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Armenian.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Armenian.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0530 058F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Arrows.pl b/gnu/usr.bin/perl/lib/unicode/In/Arrows.pl
index 7ce44183a16..a7ef468593c 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Arrows.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Arrows.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
2190 21FF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/BasicLatin.pl b/gnu/usr.bin/perl/lib/unicode/In/BasicLatin.pl
index 39987f16ec1..36d6456fa61 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/BasicLatin.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/BasicLatin.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0000 007F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Bengali.pl b/gnu/usr.bin/perl/lib/unicode/In/Bengali.pl
index c0a47d30d1a..07dc6ac102c 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Bengali.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Bengali.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0980 09FF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/BlockElements.pl b/gnu/usr.bin/perl/lib/unicode/In/BlockElements.pl
index e96e64faa03..495629b9382 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/BlockElements.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/BlockElements.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
2580 259F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Bopomofo.pl b/gnu/usr.bin/perl/lib/unicode/In/Bopomofo.pl
index 553560670c2..3dbf73a2368 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Bopomofo.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Bopomofo.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
3100 312F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/BopomofoExtended.pl b/gnu/usr.bin/perl/lib/unicode/In/BopomofoExtended.pl
index d0ee43a4373..f2ca6de96da 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/BopomofoExtended.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/BopomofoExtended.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
31A0 31BF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/BoxDrawing.pl b/gnu/usr.bin/perl/lib/unicode/In/BoxDrawing.pl
index d580199b7ff..a3cd897498a 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/BoxDrawing.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/BoxDrawing.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
2500 257F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/BraillePatterns.pl b/gnu/usr.bin/perl/lib/unicode/In/BraillePatterns.pl
index e5c9e4ca701..58afc05a201 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/BraillePatterns.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/BraillePatterns.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
2800 28FF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/CJKCompatibility.pl b/gnu/usr.bin/perl/lib/unicode/In/CJKCompatibility.pl
index 07ab8edfd49..793520f4eb3 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/CJKCompatibility.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/CJKCompatibility.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
3300 33FF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/CJKCompatibilityForms.pl b/gnu/usr.bin/perl/lib/unicode/In/CJKCompatibilityForms.pl
index 122ccd7ad60..a9ba270122b 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/CJKCompatibilityForms.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/CJKCompatibilityForms.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
FE30 FE4F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/CJKCompatibilityIdeographs.pl b/gnu/usr.bin/perl/lib/unicode/In/CJKCompatibilityIdeographs.pl
index 59c8e5dd5b2..d841bc54826 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/CJKCompatibilityIdeographs.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/CJKCompatibilityIdeographs.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
F900 FAFF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/CJKRadicalsSupplement.pl b/gnu/usr.bin/perl/lib/unicode/In/CJKRadicalsSupplement.pl
index d4c0c82bb64..2d1370799a0 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/CJKRadicalsSupplement.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/CJKRadicalsSupplement.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
2E80 2EFF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/CJKSymbolsandPunctuation.pl b/gnu/usr.bin/perl/lib/unicode/In/CJKSymbolsandPunctuation.pl
index 24ecc37b67f..ca525ae3838 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/CJKSymbolsandPunctuation.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/CJKSymbolsandPunctuation.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
3000 303F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/CJKUnifiedIdeographs.pl b/gnu/usr.bin/perl/lib/unicode/In/CJKUnifiedIdeographs.pl
index 351cf74a82c..729f4c63150 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/CJKUnifiedIdeographs.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/CJKUnifiedIdeographs.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
4E00 9FFF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/CJKUnifiedIdeographsExtensionA.pl b/gnu/usr.bin/perl/lib/unicode/In/CJKUnifiedIdeographsExtensionA.pl
index 012f54c8245..e92f091938b 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/CJKUnifiedIdeographsExtensionA.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/CJKUnifiedIdeographsExtensionA.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
3400 4DB5
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Cherokee.pl b/gnu/usr.bin/perl/lib/unicode/In/Cherokee.pl
index 10cae1a652a..1e9ad746d3b 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Cherokee.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Cherokee.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
13A0 13FF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/CombiningDiacriticalMarks.pl b/gnu/usr.bin/perl/lib/unicode/In/CombiningDiacriticalMarks.pl
index a32f974bfb1..d3a45d4cd03 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/CombiningDiacriticalMarks.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/CombiningDiacriticalMarks.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0300 036F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/CombiningHalfMarks.pl b/gnu/usr.bin/perl/lib/unicode/In/CombiningHalfMarks.pl
index 100471bdbb7..4f0a5731a75 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/CombiningHalfMarks.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/CombiningHalfMarks.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
FE20 FE2F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/CombiningMarksforSymbols.pl b/gnu/usr.bin/perl/lib/unicode/In/CombiningMarksforSymbols.pl
index f45e7e04909..9dde706cc3c 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/CombiningMarksforSymbols.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/CombiningMarksforSymbols.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
20D0 20FF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/ControlPictures.pl b/gnu/usr.bin/perl/lib/unicode/In/ControlPictures.pl
index 77a759f1a0b..78113e8c55b 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/ControlPictures.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/ControlPictures.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
2400 243F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/CurrencySymbols.pl b/gnu/usr.bin/perl/lib/unicode/In/CurrencySymbols.pl
index 567ae97da38..8cbc1600e95 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/CurrencySymbols.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/CurrencySymbols.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
20A0 20CF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Cyrillic.pl b/gnu/usr.bin/perl/lib/unicode/In/Cyrillic.pl
index 9ca104c7db7..f057731818d 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Cyrillic.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Cyrillic.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0400 04FF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Devanagari.pl b/gnu/usr.bin/perl/lib/unicode/In/Devanagari.pl
index 61372b58abe..c99eff18ecd 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Devanagari.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Devanagari.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0900 097F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Dingbats.pl b/gnu/usr.bin/perl/lib/unicode/In/Dingbats.pl
index 0f820ca711c..1bbb102999c 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Dingbats.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Dingbats.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
2700 27BF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/EnclosedAlphanumerics.pl b/gnu/usr.bin/perl/lib/unicode/In/EnclosedAlphanumerics.pl
index de52aa8d992..46b4cf5589b 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/EnclosedAlphanumerics.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/EnclosedAlphanumerics.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
2460 24FF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/EnclosedCJKLettersandMonths.pl b/gnu/usr.bin/perl/lib/unicode/In/EnclosedCJKLettersandMonths.pl
index e4de0e0261d..da5a7a1ecb9 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/EnclosedCJKLettersandMonths.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/EnclosedCJKLettersandMonths.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
3200 32FF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Ethiopic.pl b/gnu/usr.bin/perl/lib/unicode/In/Ethiopic.pl
index 13c309050a3..5b472c47c5c 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Ethiopic.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Ethiopic.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
1200 137F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/GeneralPunctuation.pl b/gnu/usr.bin/perl/lib/unicode/In/GeneralPunctuation.pl
index 81c76992dc7..aa82c30bd70 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/GeneralPunctuation.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/GeneralPunctuation.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
2000 206F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/GeometricShapes.pl b/gnu/usr.bin/perl/lib/unicode/In/GeometricShapes.pl
index 170422d2d09..6cf8ea72f7d 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/GeometricShapes.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/GeometricShapes.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
25A0 25FF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Georgian.pl b/gnu/usr.bin/perl/lib/unicode/In/Georgian.pl
index 773ed1562a8..493f57053e5 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Georgian.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Georgian.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
10A0 10FF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Greek.pl b/gnu/usr.bin/perl/lib/unicode/In/Greek.pl
index ff753d19b4e..ac4bbee588d 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Greek.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Greek.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0370 03FF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/GreekExtended.pl b/gnu/usr.bin/perl/lib/unicode/In/GreekExtended.pl
index b8f02e7f0a2..acd43be8140 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/GreekExtended.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/GreekExtended.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
1F00 1FFF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Gujarati.pl b/gnu/usr.bin/perl/lib/unicode/In/Gujarati.pl
index ff6c6503bb3..0e3c8e98ce5 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Gujarati.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Gujarati.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0A80 0AFF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Gurmukhi.pl b/gnu/usr.bin/perl/lib/unicode/In/Gurmukhi.pl
index b888df69416..32ff23943b1 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Gurmukhi.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Gurmukhi.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0A00 0A7F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/HalfwidthandFullwidthForms.pl b/gnu/usr.bin/perl/lib/unicode/In/HalfwidthandFullwidthForms.pl
index e45265393f1..fd3ba327f63 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/HalfwidthandFullwidthForms.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/HalfwidthandFullwidthForms.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
FF00 FFEF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/HangulCompatibilityJamo.pl b/gnu/usr.bin/perl/lib/unicode/In/HangulCompatibilityJamo.pl
index c15379fafca..744e57270ff 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/HangulCompatibilityJamo.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/HangulCompatibilityJamo.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
3130 318F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/HangulJamo.pl b/gnu/usr.bin/perl/lib/unicode/In/HangulJamo.pl
index c329b54c34e..a1d1c677089 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/HangulJamo.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/HangulJamo.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
1100 11FF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/HangulSyllables.pl b/gnu/usr.bin/perl/lib/unicode/In/HangulSyllables.pl
index 7d91a363f52..80cd4a4420a 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/HangulSyllables.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/HangulSyllables.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
AC00 D7A3
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Hebrew.pl b/gnu/usr.bin/perl/lib/unicode/In/Hebrew.pl
index abe7b9ede4b..2e29a282368 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Hebrew.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Hebrew.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0590 05FF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/HighPrivateUseSurrogates.pl b/gnu/usr.bin/perl/lib/unicode/In/HighPrivateUseSurrogates.pl
index 6ed7ac96fdd..0e1320d7ee4 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/HighPrivateUseSurrogates.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/HighPrivateUseSurrogates.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
DB80 DBFF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/HighSurrogates.pl b/gnu/usr.bin/perl/lib/unicode/In/HighSurrogates.pl
index 924a0c9bdbd..6acc6c45036 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/HighSurrogates.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/HighSurrogates.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
D800 DB7F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Hiragana.pl b/gnu/usr.bin/perl/lib/unicode/In/Hiragana.pl
index 7a653021887..5905fe9b283 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Hiragana.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Hiragana.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
3040 309F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/IPAExtensions.pl b/gnu/usr.bin/perl/lib/unicode/In/IPAExtensions.pl
index 20906d63006..5365373c1b4 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/IPAExtensions.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/IPAExtensions.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0250 02AF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/IdeographicDescriptionCharacters.pl b/gnu/usr.bin/perl/lib/unicode/In/IdeographicDescriptionCharacters.pl
index 4baae881a1b..dafb5b4fe37 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/IdeographicDescriptionCharacters.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/IdeographicDescriptionCharacters.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
2FF0 2FFF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Kanbun.pl b/gnu/usr.bin/perl/lib/unicode/In/Kanbun.pl
index 57d6bd21f49..9ad03a661b1 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Kanbun.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Kanbun.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
3190 319F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/KangxiRadicals.pl b/gnu/usr.bin/perl/lib/unicode/In/KangxiRadicals.pl
index d26fd6c7743..165398c9e92 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/KangxiRadicals.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/KangxiRadicals.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
2F00 2FDF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Kannada.pl b/gnu/usr.bin/perl/lib/unicode/In/Kannada.pl
index 109197a6f71..a679445f3f8 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Kannada.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Kannada.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0C80 0CFF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Katakana.pl b/gnu/usr.bin/perl/lib/unicode/In/Katakana.pl
index 93bd5a03faa..2976d258224 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Katakana.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Katakana.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
30A0 30FF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Khmer.pl b/gnu/usr.bin/perl/lib/unicode/In/Khmer.pl
index f3e86851b3b..6a85224223e 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Khmer.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Khmer.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
1780 17FF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Lao.pl b/gnu/usr.bin/perl/lib/unicode/In/Lao.pl
index 41ff11f805b..fdddd867661 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Lao.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Lao.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0E80 0EFF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Latin-1Supplement.pl b/gnu/usr.bin/perl/lib/unicode/In/Latin-1Supplement.pl
index 1b252eb23e9..6a901fba1c6 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Latin-1Supplement.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Latin-1Supplement.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0080 00FF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/LatinExtended-A.pl b/gnu/usr.bin/perl/lib/unicode/In/LatinExtended-A.pl
index b8be987db08..a042350176a 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/LatinExtended-A.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/LatinExtended-A.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0100 017F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/LatinExtended-B.pl b/gnu/usr.bin/perl/lib/unicode/In/LatinExtended-B.pl
index b9aff43f3d4..b7106c6d375 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/LatinExtended-B.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/LatinExtended-B.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0180 024F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/LatinExtendedAdditional.pl b/gnu/usr.bin/perl/lib/unicode/In/LatinExtendedAdditional.pl
index d309e90814f..e17cc3de951 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/LatinExtendedAdditional.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/LatinExtendedAdditional.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
1E00 1EFF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/LetterlikeSymbols.pl b/gnu/usr.bin/perl/lib/unicode/In/LetterlikeSymbols.pl
index 1768740d425..c2249a7b94e 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/LetterlikeSymbols.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/LetterlikeSymbols.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
2100 214F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/LowSurrogates.pl b/gnu/usr.bin/perl/lib/unicode/In/LowSurrogates.pl
index 752b264e81f..025bd13950b 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/LowSurrogates.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/LowSurrogates.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
DC00 DFFF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Malayalam.pl b/gnu/usr.bin/perl/lib/unicode/In/Malayalam.pl
index 8fb57cdb10a..5a01d40927e 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Malayalam.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Malayalam.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0D00 0D7F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/MathematicalOperators.pl b/gnu/usr.bin/perl/lib/unicode/In/MathematicalOperators.pl
index 055f19e5903..8b45e1881c8 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/MathematicalOperators.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/MathematicalOperators.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
2200 22FF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/MiscellaneousSymbols.pl b/gnu/usr.bin/perl/lib/unicode/In/MiscellaneousSymbols.pl
index 9dcdd269542..cc5b02fdc2b 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/MiscellaneousSymbols.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/MiscellaneousSymbols.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
2600 26FF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/MiscellaneousTechnical.pl b/gnu/usr.bin/perl/lib/unicode/In/MiscellaneousTechnical.pl
index 370c00f320c..a1058a0c6d6 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/MiscellaneousTechnical.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/MiscellaneousTechnical.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
2300 23FF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Mongolian.pl b/gnu/usr.bin/perl/lib/unicode/In/Mongolian.pl
index 394014d4969..98a4914ce63 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Mongolian.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Mongolian.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
1800 18AF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Myanmar.pl b/gnu/usr.bin/perl/lib/unicode/In/Myanmar.pl
index 4b3f3181b00..3aa2f414101 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Myanmar.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Myanmar.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
1000 109F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/NumberForms.pl b/gnu/usr.bin/perl/lib/unicode/In/NumberForms.pl
index d33ece0bbc4..2a606a6bf74 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/NumberForms.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/NumberForms.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
2150 218F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Ogham.pl b/gnu/usr.bin/perl/lib/unicode/In/Ogham.pl
index e097d90c773..de320a91727 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Ogham.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Ogham.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
1680 169F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/OpticalCharacterRecognition.pl b/gnu/usr.bin/perl/lib/unicode/In/OpticalCharacterRecognition.pl
index be1d981c7cb..7f0aff830e6 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/OpticalCharacterRecognition.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/OpticalCharacterRecognition.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
2440 245F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Oriya.pl b/gnu/usr.bin/perl/lib/unicode/In/Oriya.pl
index 5a680f67431..771a2457579 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Oriya.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Oriya.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0B00 0B7F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/PrivateUse.pl b/gnu/usr.bin/perl/lib/unicode/In/PrivateUse.pl
index 0c118f4fe48..0b0c00407d5 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/PrivateUse.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/PrivateUse.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
E000 F8FF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Runic.pl b/gnu/usr.bin/perl/lib/unicode/In/Runic.pl
index 0bd42df80c9..52ca7aa4fb5 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Runic.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Runic.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
16A0 16FF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Sinhala.pl b/gnu/usr.bin/perl/lib/unicode/In/Sinhala.pl
index 37e007c0574..5a892fd3c1c 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Sinhala.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Sinhala.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0D80 0DFF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/SmallFormVariants.pl b/gnu/usr.bin/perl/lib/unicode/In/SmallFormVariants.pl
index 736415e67e0..148e6e85b88 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/SmallFormVariants.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/SmallFormVariants.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
FE50 FE6F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/SpacingModifierLetters.pl b/gnu/usr.bin/perl/lib/unicode/In/SpacingModifierLetters.pl
index 6e9cdf0b53f..0e31fea4b4e 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/SpacingModifierLetters.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/SpacingModifierLetters.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
02B0 02FF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Specials.pl b/gnu/usr.bin/perl/lib/unicode/In/Specials.pl
index f9f730f8402..03f69a3b8e1 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Specials.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Specials.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
FFF0 FFFD
diff --git a/gnu/usr.bin/perl/lib/unicode/In/SuperscriptsandSubscripts.pl b/gnu/usr.bin/perl/lib/unicode/In/SuperscriptsandSubscripts.pl
index efcec0b8417..b0f90cd67b6 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/SuperscriptsandSubscripts.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/SuperscriptsandSubscripts.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
2070 209F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Syriac.pl b/gnu/usr.bin/perl/lib/unicode/In/Syriac.pl
index 7c81fb6f324..f85f1a9fd74 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Syriac.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Syriac.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0700 074F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Tamil.pl b/gnu/usr.bin/perl/lib/unicode/In/Tamil.pl
index e65ed2fa195..71fa923d6f5 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Tamil.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Tamil.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0B80 0BFF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Telugu.pl b/gnu/usr.bin/perl/lib/unicode/In/Telugu.pl
index d5ed2368c2b..ff09b1ed870 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Telugu.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Telugu.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0C00 0C7F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Thaana.pl b/gnu/usr.bin/perl/lib/unicode/In/Thaana.pl
index 361bd4d4b44..f88768c924f 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Thaana.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Thaana.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0780 07BF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Thai.pl b/gnu/usr.bin/perl/lib/unicode/In/Thai.pl
index 3376de4e18c..e77c0c512f2 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Thai.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Thai.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0E00 0E7F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/Tibetan.pl b/gnu/usr.bin/perl/lib/unicode/In/Tibetan.pl
index 50837ad8bc7..35436b3b14e 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/Tibetan.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/Tibetan.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0F00 0FFF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/UnifiedCanadianAboriginalSyllabics.pl b/gnu/usr.bin/perl/lib/unicode/In/UnifiedCanadianAboriginalSyllabics.pl
index ad4eb278662..83c6a78cca7 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/UnifiedCanadianAboriginalSyllabics.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/UnifiedCanadianAboriginalSyllabics.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
1400 167F
diff --git a/gnu/usr.bin/perl/lib/unicode/In/YiRadicals.pl b/gnu/usr.bin/perl/lib/unicode/In/YiRadicals.pl
index f25c6954ff2..7350871cb21 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/YiRadicals.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/YiRadicals.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
A490 A4CF
diff --git a/gnu/usr.bin/perl/lib/unicode/In/YiSyllables.pl b/gnu/usr.bin/perl/lib/unicode/In/YiSyllables.pl
index f4e3a8bcbc0..baa038eb307 100644
--- a/gnu/usr.bin/perl/lib/unicode/In/YiSyllables.pl
+++ b/gnu/usr.bin/perl/lib/unicode/In/YiSyllables.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
A000 A48F
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/ASCII.pl b/gnu/usr.bin/perl/lib/unicode/Is/ASCII.pl
index 63f95ae7dd4..1434a55d965 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/ASCII.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/ASCII.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0000 007f
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Alnum.pl b/gnu/usr.bin/perl/lib/unicode/Is/Alnum.pl
index d44f744e204..a0aac629385 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Alnum.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Alnum.pl
@@ -1,22 +1,28 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0030 0039
0041 005a
0061 007a
00aa
+00b2 00b3
00b5
-00ba
+00b9 00ba
+00bc 00be
00c0 00d6
00d8 00f6
-00f8 01c4
-01c6 01c7
-01c9 01ca
-01cc 01f1
-01f3 021f
+00f8 021f
0222 0233
0250 02ad
+02b0 02b8
+02bb 02c1
+02d0 02d1
+02e0 02e4
+02ee
+0300 034e
+0360 0362
+037a
0386
0388 038a
038c
@@ -25,38 +31,57 @@ return <<'END';
03d0 03d7
03da 03f3
0400 0481
+0483 0486
+0488 0489
048c 04c4
04c7 04c8
04cb 04cc
04d0 04f5
04f8 04f9
0531 0556
+0559
0561 0587
+0591 05a1
+05a3 05b9
+05bb 05bd
+05bf
+05c1 05c2
+05c4
05d0 05ea
05f0 05f2
0621 063a
-0641 064a
+0640 0655
0660 0669
-0671 06d3
-06d5
+0670 06d3
+06d5 06e8
+06ea 06ed
06f0 06fc
-0710
-0712 072c
-0780 07a5
+0710 072c
+0730 074a
+0780 07b0
+0901 0903
0905 0939
-093d
-0950
-0958 0961
+093c 094d
+0950 0954
+0958 0963
0966 096f
+0981 0983
0985 098c
098f 0990
0993 09a8
09aa 09b0
09b2
09b6 09b9
+09bc
+09be 09c4
+09c7 09c8
+09cb 09cd
+09d7
09dc 09dd
-09df 09e1
+09df 09e3
09e6 09f1
+09f4 09f9
+0a02
0a05 0a0a
0a0f 0a10
0a13 0a28
@@ -64,10 +89,14 @@ return <<'END';
0a32 0a33
0a35 0a36
0a38 0a39
+0a3c
+0a3e 0a42
+0a47 0a48
+0a4b 0a4d
0a59 0a5c
0a5e
-0a66 0a6f
-0a72 0a74
+0a66 0a74
+0a81 0a83
0a85 0a8b
0a8d
0a8f 0a91
@@ -75,20 +104,27 @@ return <<'END';
0aaa 0ab0
0ab2 0ab3
0ab5 0ab9
-0abd
+0abc 0ac5
+0ac7 0ac9
+0acb 0acd
0ad0
0ae0
0ae6 0aef
+0b01 0b03
0b05 0b0c
0b0f 0b10
0b13 0b28
0b2a 0b30
0b32 0b33
0b36 0b39
-0b3d
+0b3c 0b43
+0b47 0b48
+0b4b 0b4d
+0b56 0b57
0b5c 0b5d
0b5f 0b61
0b66 0b6f
+0b82 0b83
0b85 0b8a
0b8e 0b90
0b92 0b95
@@ -99,36 +135,60 @@ return <<'END';
0ba8 0baa
0bae 0bb5
0bb7 0bb9
-0be7 0bef
+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
-0e01 0e30
-0e32 0e33
-0e40 0e45
+0dca
+0dcf 0dd4
+0dd6
+0dd8 0ddf
+0df2 0df3
+0e01 0e3a
+0e40 0e4e
0e50 0e59
0e81 0e82
0e84
@@ -141,22 +201,33 @@ return <<'END';
0ea5
0ea7
0eaa 0eab
-0ead 0eb0
-0eb2 0eb3
-0ebd
+0ead 0eb9
+0ebb 0ebd
0ec0 0ec4
+0ec6
+0ec8 0ecd
0ed0 0ed9
0edc 0edd
0f00
-0f20 0f29
-0f40 0f47
+0f18 0f19
+0f20 0f33
+0f35
+0f37
+0f39
+0f3e 0f47
0f49 0f6a
-0f88 0f8b
+0f71 0f84
+0f86 0f8b
+0f90 0f97
+0f99 0fbc
+0fc6
1000 1021
1023 1027
1029 102a
+102c 1032
+1036 1039
1040 1049
-1050 1055
+1050 1059
10a0 10c5
10d0 10f6
1100 1159
@@ -187,18 +258,18 @@ return <<'END';
1318 131e
1320 1346
1348 135a
-1369 1371
+1369 137c
13a0 13f4
1401 166c
166f 1676
1681 169a
16a0 16ea
-1780 17b3
+16ee 16f0
+1780 17d3
17e0 17e9
1810 1819
-1820 1842
-1844 1877
-1880 18a8
+1820 1877
+1880 18a9
1e00 1e9b
1ea0 1ef9
1f00 1f15
@@ -210,20 +281,20 @@ return <<'END';
1f5b
1f5d
1f5f 1f7d
-1f80 1f87
-1f90 1f97
-1fa0 1fa7
-1fb0 1fb4
-1fb6 1fbb
+1f80 1fb4
+1fb6 1fbc
1fbe
1fc2 1fc4
-1fc6 1fcb
+1fc6 1fcc
1fd0 1fd3
1fd6 1fdb
1fe0 1fec
1ff2 1ff4
-1ff6 1ffb
-207f
+1ff6 1ffc
+2070
+2074 2079
+207f 2089
+20d0 20e3
2102
2107
210a 2113
@@ -235,12 +306,25 @@ return <<'END';
212a 212d
212f 2131
2133 2139
-3006
+2153 2183
+2460 249b
+24ea
+2776 2793
+3005 3007
+3021 302f
+3031 3035
+3038 303a
3041 3094
+3099 309a
+309d 309e
30a1 30fa
+30fc 30fe
3105 312c
3131 318e
+3192 3195
31a0 31b7
+3220 3229
+3280 3289
3400 4db5
4e00 9fa5
a000 a48c
@@ -248,8 +332,7 @@ ac00 d7a3
f900 fa2d
fb00 fb06
fb13 fb17
-fb1d
-fb1f fb28
+fb1d fb28
fb2a fb36
fb38 fb3c
fb3e
@@ -260,15 +343,14 @@ fbd3 fd3d
fd50 fd8f
fd92 fdc7
fdf0 fdfb
+fe20 fe23
fe70 fe72
fe74
fe76 fefc
ff10 ff19
ff21 ff3a
ff41 ff5a
-ff66 ff6f
-ff71 ff9d
-ffa0 ffbe
+ff66 ffbe
ffc2 ffc7
ffca ffcf
ffd2 ffd7
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Alpha.pl b/gnu/usr.bin/perl/lib/unicode/Is/Alpha.pl
index 0e94688e852..13dc003c964 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Alpha.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Alpha.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0041 005a
@@ -9,13 +9,17 @@ return <<'END';
00ba
00c0 00d6
00d8 00f6
-00f8 01c4
-01c6 01c7
-01c9 01ca
-01cc 01f1
-01f3 021f
+00f8 021f
0222 0233
0250 02ad
+02b0 02b8
+02bb 02c1
+02d0 02d1
+02e0 02e4
+02ee
+0300 034e
+0360 0362
+037a
0386
0388 038a
038c
@@ -24,36 +28,54 @@ return <<'END';
03d0 03d7
03da 03f3
0400 0481
+0483 0486
+0488 0489
048c 04c4
04c7 04c8
04cb 04cc
04d0 04f5
04f8 04f9
0531 0556
+0559
0561 0587
+0591 05a1
+05a3 05b9
+05bb 05bd
+05bf
+05c1 05c2
+05c4
05d0 05ea
05f0 05f2
0621 063a
-0641 064a
-0671 06d3
-06d5
+0640 0655
+0670 06d3
+06d5 06e8
+06ea 06ed
06fa 06fc
-0710
-0712 072c
-0780 07a5
+0710 072c
+0730 074a
+0780 07b0
+0901 0903
0905 0939
-093d
-0950
-0958 0961
+093c 094d
+0950 0954
+0958 0963
+0981 0983
0985 098c
098f 0990
0993 09a8
09aa 09b0
09b2
09b6 09b9
+09bc
+09be 09c4
+09c7 09c8
+09cb 09cd
+09d7
09dc 09dd
-09df 09e1
+09df 09e3
09f0 09f1
+0a02
0a05 0a0a
0a0f 0a10
0a13 0a28
@@ -61,9 +83,14 @@ return <<'END';
0a32 0a33
0a35 0a36
0a38 0a39
+0a3c
+0a3e 0a42
+0a47 0a48
+0a4b 0a4d
0a59 0a5c
0a5e
-0a72 0a74
+0a70 0a74
+0a81 0a83
0a85 0a8b
0a8d
0a8f 0a91
@@ -71,18 +98,25 @@ return <<'END';
0aaa 0ab0
0ab2 0ab3
0ab5 0ab9
-0abd
+0abc 0ac5
+0ac7 0ac9
+0acb 0acd
0ad0
0ae0
+0b01 0b03
0b05 0b0c
0b0f 0b10
0b13 0b28
0b2a 0b30
0b32 0b33
0b36 0b39
-0b3d
+0b3c 0b43
+0b47 0b48
+0b4b 0b4d
+0b56 0b57
0b5c 0b5d
0b5f 0b61
+0b82 0b83
0b85 0b8a
0b8e 0b90
0b92 0b95
@@ -93,32 +127,56 @@ return <<'END';
0ba8 0baa
0bae 0bb5
0bb7 0bb9
+0bbe 0bc2
+0bc6 0bc8
+0bca 0bcd
+0bd7
+0c01 0c03
0c05 0c0c
0c0e 0c10
0c12 0c28
0c2a 0c33
0c35 0c39
+0c3e 0c44
+0c46 0c48
+0c4a 0c4d
+0c55 0c56
0c60 0c61
+0c82 0c83
0c85 0c8c
0c8e 0c90
0c92 0ca8
0caa 0cb3
0cb5 0cb9
+0cbe 0cc4
+0cc6 0cc8
+0cca 0ccd
+0cd5 0cd6
0cde
0ce0 0ce1
+0d02 0d03
0d05 0d0c
0d0e 0d10
0d12 0d28
0d2a 0d39
+0d3e 0d43
+0d46 0d48
+0d4a 0d4d
+0d57
0d60 0d61
+0d82 0d83
0d85 0d96
0d9a 0db1
0db3 0dbb
0dbd
0dc0 0dc6
-0e01 0e30
-0e32 0e33
-0e40 0e45
+0dca
+0dcf 0dd4
+0dd6
+0dd8 0ddf
+0df2 0df3
+0e01 0e3a
+0e40 0e4e
0e81 0e82
0e84
0e87 0e88
@@ -130,19 +188,30 @@ return <<'END';
0ea5
0ea7
0eaa 0eab
-0ead 0eb0
-0eb2 0eb3
-0ebd
+0ead 0eb9
+0ebb 0ebd
0ec0 0ec4
+0ec6
+0ec8 0ecd
0edc 0edd
0f00
-0f40 0f47
+0f18 0f19
+0f35
+0f37
+0f39
+0f3e 0f47
0f49 0f6a
-0f88 0f8b
+0f71 0f84
+0f86 0f8b
+0f90 0f97
+0f99 0fbc
+0fc6
1000 1021
1023 1027
1029 102a
-1050 1055
+102c 1032
+1036 1039
+1050 1059
10a0 10c5
10d0 10f6
1100 1159
@@ -178,10 +247,9 @@ return <<'END';
166f 1676
1681 169a
16a0 16ea
-1780 17b3
-1820 1842
-1844 1877
-1880 18a8
+1780 17d3
+1820 1877
+1880 18a9
1e00 1e9b
1ea0 1ef9
1f00 1f15
@@ -193,20 +261,18 @@ return <<'END';
1f5b
1f5d
1f5f 1f7d
-1f80 1f87
-1f90 1f97
-1fa0 1fa7
-1fb0 1fb4
-1fb6 1fbb
+1f80 1fb4
+1fb6 1fbc
1fbe
1fc2 1fc4
-1fc6 1fcb
+1fc6 1fcc
1fd0 1fd3
1fd6 1fdb
1fe0 1fec
1ff2 1ff4
-1ff6 1ffb
+1ff6 1ffc
207f
+20d0 20e3
2102
2107
210a 2113
@@ -218,9 +284,14 @@ return <<'END';
212a 212d
212f 2131
2133 2139
-3006
+3005 3006
+302a 302f
+3031 3035
3041 3094
+3099 309a
+309d 309e
30a1 30fa
+30fc 30fe
3105 312c
3131 318e
31a0 31b7
@@ -231,8 +302,7 @@ ac00 d7a3
f900 fa2d
fb00 fb06
fb13 fb17
-fb1d
-fb1f fb28
+fb1d fb28
fb2a fb36
fb38 fb3c
fb3e
@@ -243,14 +313,13 @@ fbd3 fd3d
fd50 fd8f
fd92 fdc7
fdf0 fdfb
+fe20 fe23
fe70 fe72
fe74
fe76 fefc
ff21 ff3a
ff41 ff5a
-ff66 ff6f
-ff71 ff9d
-ffa0 ffbe
+ff66 ffbe
ffc2 ffc7
ffca ffcf
ffd2 ffd7
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/BidiAL.pl b/gnu/usr.bin/perl/lib/unicode/Is/BidiAL.pl
new file mode 100644
index 00000000000..a8d43b816cf
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/BidiAL.pl
@@ -0,0 +1,25 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+061b
+061f
+0621 063a
+0640 064a
+066d
+0671 06d5
+06e5 06e6
+06fa 06fe
+0700 070d
+0710
+0712 072c
+0780 07a5
+fb50 fbb1
+fbd3 fd3d
+fd50 fd8f
+fd92 fdc7
+fdf0 fdfb
+fe70 fe72
+fe74
+fe76 fefc
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/BidiAN.pl b/gnu/usr.bin/perl/lib/unicode/Is/BidiAN.pl
index 4a71ae532d1..4519c6d51d5 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/BidiAN.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/BidiAN.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0660 0669
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/BidiB.pl b/gnu/usr.bin/perl/lib/unicode/Is/BidiB.pl
index e4ba16567ad..33bdb459441 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/BidiB.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/BidiB.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
000a
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/BidiBN.pl b/gnu/usr.bin/perl/lib/unicode/Is/BidiBN.pl
new file mode 100644
index 00000000000..75b8871a59c
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/BidiBN.pl
@@ -0,0 +1,15 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+0000 0008
+000e 001b
+007f 0084
+0086 009f
+070f
+180b 180e
+200b 200d
+206a 206f
+feff
+fff9 fffb
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/BidiCS.pl b/gnu/usr.bin/perl/lib/unicode/Is/BidiCS.pl
index f8d037d118e..e2176538432 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/BidiCS.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/BidiCS.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
002c
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/BidiEN.pl b/gnu/usr.bin/perl/lib/unicode/Is/BidiEN.pl
index d63270aecf7..113de874544 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/BidiEN.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/BidiEN.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0030 0039
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/BidiES.pl b/gnu/usr.bin/perl/lib/unicode/Is/BidiES.pl
index 5a1a36a6d8f..d1cd305f54f 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/BidiES.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/BidiES.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
002f
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/BidiET.pl b/gnu/usr.bin/perl/lib/unicode/Is/BidiET.pl
index 5e7af2bbf40..0a66fa83468 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/BidiET.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/BidiET.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0023 0025
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/BidiL.pl b/gnu/usr.bin/perl/lib/unicode/Is/BidiL.pl
index 8dc4ca87c0a..a08d8b8900b 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/BidiL.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/BidiL.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0041 005a
@@ -320,4 +320,6 @@ ffc2 ffc7
ffca ffcf
ffd2 ffd7
ffda ffdc
+f0000 ffffd
+100000 10fffd
END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/BidiLRE.pl b/gnu/usr.bin/perl/lib/unicode/Is/BidiLRE.pl
new file mode 100644
index 00000000000..25704212c23
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/BidiLRE.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+202a
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/BidiLRO.pl b/gnu/usr.bin/perl/lib/unicode/Is/BidiLRO.pl
new file mode 100644
index 00000000000..721a22311e4
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/BidiLRO.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+202d
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/BidiNSM.pl b/gnu/usr.bin/perl/lib/unicode/Is/BidiNSM.pl
new file mode 100644
index 00000000000..a5c3af4b34e
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/BidiNSM.pl
@@ -0,0 +1,97 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# 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 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 20e3
+302a 302f
+3099 309a
+fb1e
+fe20 fe23
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/BidiON.pl b/gnu/usr.bin/perl/lib/unicode/Is/BidiON.pl
index bde00ff1238..ec0f18ff1d2 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/BidiON.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/BidiON.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0021 0022
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/BidiPDF.pl b/gnu/usr.bin/perl/lib/unicode/Is/BidiPDF.pl
new file mode 100644
index 00000000000..20e3d9d31b8
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/BidiPDF.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+202c
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/BidiR.pl b/gnu/usr.bin/perl/lib/unicode/Is/BidiR.pl
index fccc1f6d6e4..9f776ae53f8 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/BidiR.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/BidiR.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
05be
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/BidiRLE.pl b/gnu/usr.bin/perl/lib/unicode/Is/BidiRLE.pl
new file mode 100644
index 00000000000..eaf7ab7a232
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/BidiRLE.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+202b
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/BidiRLO.pl b/gnu/usr.bin/perl/lib/unicode/Is/BidiRLO.pl
new file mode 100644
index 00000000000..8974dd955ac
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/BidiRLO.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+202e
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/BidiS.pl b/gnu/usr.bin/perl/lib/unicode/Is/BidiS.pl
index b28b3310eaa..ac2655d6ed6 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/BidiS.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/BidiS.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0009
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/BidiWS.pl b/gnu/usr.bin/perl/lib/unicode/Is/BidiWS.pl
index 25d8b8f6aa8..ebd24e546e9 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/BidiWS.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/BidiWS.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
000c
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Blank.pl b/gnu/usr.bin/perl/lib/unicode/Is/Blank.pl
new file mode 100644
index 00000000000..86429218e34
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Blank.pl
@@ -0,0 +1,12 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+0009
+0020
+00a0
+1680
+2000 200b
+202f
+3000
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/C.pl b/gnu/usr.bin/perl/lib/unicode/Is/C.pl
index 0db83c4bf30..51e4ede0672 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/C.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/C.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0000 001f
@@ -15,4 +15,6 @@ dc00 dfff
e000 f8ff
feff
fff9 fffb
+f0000 ffffd
+100000 10fffd
END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Cc.pl b/gnu/usr.bin/perl/lib/unicode/Is/Cc.pl
index d7184e31511..6b97adc9eb4 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Cc.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Cc.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0000 001f
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Cf.pl b/gnu/usr.bin/perl/lib/unicode/Is/Cf.pl
new file mode 100644
index 00000000000..cef5ac448bc
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Cf.pl
@@ -0,0 +1,12 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+070f
+180b 180e
+200c 200f
+202a 202e
+206a 206f
+feff
+fff9 fffb
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Cn.pl b/gnu/usr.bin/perl/lib/unicode/Is/Cn.pl
index ec287c456ab..fb75e8769c5 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Cn.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Cn.pl
@@ -1,5 +1,373 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
+0220 0221
+0234 024f
+02ae 02af
+02ef 02ff
+034f 035f
+0363 0373
+0376 0379
+037b 037d
+037f 0383
+038b
+038d
+03a2
+03cf
+03d8 03d9
+03f4 03ff
+0487
+048a 048b
+04c5 04c6
+04c9 04ca
+04cd 04cf
+04f6 04f7
+04fa 0530
+0557 0558
+0560
+0588
+058b 0590
+05a2
+05ba
+05c5 05cf
+05eb 05ef
+05f5 060b
+060d 061a
+061c 061e
+0620
+063b 063f
+0656 065f
+066e 066f
+06ee 06ef
+06ff
+070e
+072d 072f
+074b 077f
+07b1 0900
+0904
+093a 093b
+094e 094f
+0955 0957
+0971 0980
+0984
+098d 098e
+0991 0992
+09a9
+09b1
+09b3 09b5
+09ba 09bb
+09bd
+09c5 09c6
+09c9 09ca
+09ce 09d6
+09d8 09db
+09de
+09e4 09e5
+09fb 0a01
+0a03 0a04
+0a0b 0a0e
+0a11 0a12
+0a29
+0a31
+0a34
+0a37
+0a3a 0a3b
+0a3d
+0a43 0a46
+0a49 0a4a
+0a4e 0a58
+0a5d
+0a5f 0a65
+0a75 0a80
+0a84
+0a8c
+0a8e
+0a92
+0aa9
+0ab1
+0ab4
+0aba 0abb
+0ac6
+0aca
+0ace 0acf
+0ad1 0adf
+0ae1 0ae5
+0af0 0b00
+0b04
+0b0d 0b0e
+0b11 0b12
+0b29
+0b31
+0b34 0b35
+0b3a 0b3b
+0b44 0b46
+0b49 0b4a
+0b4e 0b55
+0b58 0b5b
+0b5e
+0b62 0b65
+0b71 0b81
+0b84
+0b8b 0b8d
+0b91
+0b96 0b98
+0b9b
+0b9d
+0ba0 0ba2
+0ba5 0ba7
+0bab 0bad
+0bb6
+0bba 0bbd
+0bc3 0bc5
+0bc9
+0bce 0bd6
+0bd8 0be6
+0bf3 0c00
+0c04
+0c0d
+0c11
+0c29
+0c34
+0c3a 0c3d
+0c45
+0c49
+0c4e 0c54
+0c57 0c5f
+0c62 0c65
+0c70 0c81
+0c84
+0c8d
+0c91
+0ca9
+0cb4
+0cba 0cbd
+0cc5
+0cc9
+0cce 0cd4
+0cd7 0cdd
+0cdf
+0ce2 0ce5
+0cf0 0d01
+0d04
+0d0d
+0d11
+0d29
+0d3a 0d3d
+0d44 0d45
+0d49
+0d4e 0d56
+0d58 0d5f
+0d62 0d65
+0d70 0d81
+0d84
+0d97 0d99
+0db2
+0dbc
+0dbe 0dbf
+0dc7 0dc9
+0dcb 0dce
+0dd5
+0dd7
+0de0 0df1
+0df5 0e00
+0e3b 0e3e
+0e5c 0e80
+0e83
+0e85 0e86
+0e89
+0e8b 0e8c
+0e8e 0e93
+0e98
+0ea0
+0ea4
+0ea6
+0ea8 0ea9
+0eac
+0eba
+0ebe 0ebf
+0ec5
+0ec7
+0ece 0ecf
+0eda 0edb
+0ede 0eff
+0f48
+0f6b 0f70
+0f8c 0f8f
+0f98
+0fbd
+0fcd 0fce
+0fd0 0fff
+1022
+1028
+102b
+1033 1035
+103a 103f
+105a 109f
+10c6 10cf
+10f7 10fa
+10fc 10ff
+115a 115e
+11a3 11a7
+11fa 11ff
+1207
+1247
+1249
+124e 124f
+1257
+1259
+125e 125f
+1287
+1289
+128e 128f
+12af
+12b1
+12b6 12b7
+12bf
+12c1
+12c6 12c7
+12cf
+12d7
+12ef
+130f
+1311
+1316 1317
+131f
+1347
+135b 1360
+137d 139f
+13f5 1400
+1677 167f
+169d 169f
+16f1 177f
+17dd 17df
+17ea 17ff
+180f
+181a 181f
+1878 187f
+18aa 1dff
+1e9c 1e9f
+1efa 1eff
+1f16 1f17
+1f1e 1f1f
+1f46 1f47
+1f4e 1f4f
+1f58
+1f5a
+1f5c
+1f5e
+1f7e 1f7f
+1fb5
+1fc5
+1fd4 1fd5
+1fdc
+1ff0 1ff1
+1ff5
+1fff
+2047
+204e 2069
+2071 2073
+208f 209f
+20b0 20cf
+20e4 20ff
+213b 2152
+2184 218f
+21f4 21ff
+22f2 22ff
+237c
+239b 23ff
+2427 243f
+244b 245f
+24eb 24ff
+2596 259f
+25f8 25ff
+2614 2618
+2672 2700
+2705
+270a 270b
+2728
+274c
+274e
+2753 2755
+2757
+275f 2760
+2768 2775
+2795 2797
+27b0
+27bf 27ff
+2900 2e7f
+2e9a
+2ef4 2eff
+2fd6 2fef
+2ffc 2fff
+303b 303d
+3040
+3095 3098
+309f 30a0
+30ff 3104
+312d 3130
+318f
+31b8 31ff
+321d 321f
+3244 325f
+327c 327e
+32b1 32bf
+32cc 32cf
+32ff
+3377 337a
+33de 33df
+33ff
+4db6 4dff
+9fa6 9fff
+a48d a48f
+a4a2 a4a3
+a4b4
+a4c1
+a4c5
+a4c7 abff
+d7a4 d7ff
+fa2e faff
+fb07 fb12
+fb18 fb1c
+fb37
+fb3d
+fb3f
+fb42
+fb45
+fbb2 fbd2
+fd40 fd4f
+fd90 fd91
+fdc8 fdef
+fdfc fe1f
+fe24 fe2f
+fe45 fe48
+fe53
+fe67
+fe6c fe6f
+fe73
+fe75
+fefd fefe
+ff00
+ff5f ff60
+ffbf ffc1
+ffc8 ffc9
+ffd0 ffd1
+ffd8 ffd9
+ffdd ffdf
+ffe7
+ffef fff8
+10000 1fffd
+20000 2fffd
+30000 3fffd
+40000 4fffd
+50000 5fffd
+60000 6fffd
+70000 7fffd
+80000 8fffd
+90000 9fffd
+a0000 afffd
+b0000 bfffd
+c0000 cfffd
+d0000 dfffd
+e0000 efffd
END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Cntrl.pl b/gnu/usr.bin/perl/lib/unicode/Is/Cntrl.pl
index 0db83c4bf30..51e4ede0672 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Cntrl.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Cntrl.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0000 001f
@@ -15,4 +15,6 @@ dc00 dfff
e000 f8ff
feff
fff9 fffb
+f0000 ffffd
+100000 10fffd
END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Co.pl b/gnu/usr.bin/perl/lib/unicode/Is/Co.pl
index c456d33aea0..d077fd2bd31 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Co.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Co.pl
@@ -1,6 +1,8 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
e000 f8ff
+f0000 ffffd
+100000 10fffd
END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Cs.pl b/gnu/usr.bin/perl/lib/unicode/Is/Cs.pl
new file mode 100644
index 00000000000..33e1daca88a
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Cs.pl
@@ -0,0 +1,8 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+d800 db7f
+db80 dbff
+dc00 dfff
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/DCcircle.pl b/gnu/usr.bin/perl/lib/unicode/Is/DCcircle.pl
index 4c47b28b26f..82c9edcd2b8 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/DCcircle.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/DCcircle.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
2460 2473
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/DCcompat.pl b/gnu/usr.bin/perl/lib/unicode/Is/DCcompat.pl
index 75d25695f32..5ae2b6a9f48 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/DCcompat.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/DCcompat.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
00a8
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/DCfinal.pl b/gnu/usr.bin/perl/lib/unicode/Is/DCfinal.pl
index 33fbf6aff87..3c81bcc6c4a 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/DCfinal.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/DCfinal.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
fb51
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/DCfont.pl b/gnu/usr.bin/perl/lib/unicode/Is/DCfont.pl
index c72234b3bfa..7feff18b22d 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/DCfont.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/DCfont.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
2102
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/DCfraction.pl b/gnu/usr.bin/perl/lib/unicode/Is/DCfraction.pl
new file mode 100644
index 00000000000..abac9d9cfa7
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/DCfraction.pl
@@ -0,0 +1,7 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+00bc 00be
+2153 215f
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/DCinitial.pl b/gnu/usr.bin/perl/lib/unicode/Is/DCinitial.pl
index 0145b7dd71c..c6d7802eafa 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/DCinitial.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/DCinitial.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
fb54
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/DCisolated.pl b/gnu/usr.bin/perl/lib/unicode/Is/DCisolated.pl
index cc8541eb7ba..e4e24f786a3 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/DCisolated.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/DCisolated.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
fb50
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/DCmedial.pl b/gnu/usr.bin/perl/lib/unicode/Is/DCmedial.pl
new file mode 100644
index 00000000000..8778a75ed56
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/DCmedial.pl
@@ -0,0 +1,59 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# 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/gnu/usr.bin/perl/lib/unicode/Is/DCnarrow.pl b/gnu/usr.bin/perl/lib/unicode/Is/DCnarrow.pl
index 9417de1bbda..7887452105d 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/DCnarrow.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/DCnarrow.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
ff61 ffbe
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/DCnoBreak.pl b/gnu/usr.bin/perl/lib/unicode/Is/DCnoBreak.pl
index 1fd9e8735b3..18c01059ed7 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/DCnoBreak.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/DCnoBreak.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
00a0
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/DCsmall.pl b/gnu/usr.bin/perl/lib/unicode/Is/DCsmall.pl
index f6c80691636..3a37931b566 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/DCsmall.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/DCsmall.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
fe50 fe52
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/DCsquare.pl b/gnu/usr.bin/perl/lib/unicode/Is/DCsquare.pl
index b55fdd9c6a6..f27993d6b85 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/DCsquare.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/DCsquare.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
3300 3357
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/DCsub.pl b/gnu/usr.bin/perl/lib/unicode/Is/DCsub.pl
index 98c4dfa87e7..f709a228c28 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/DCsub.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/DCsub.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
2080 208e
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/DCsuper.pl b/gnu/usr.bin/perl/lib/unicode/Is/DCsuper.pl
index 865a26dd920..1e6a0c5feb0 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/DCsuper.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/DCsuper.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
00aa
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/DCvertical.pl b/gnu/usr.bin/perl/lib/unicode/Is/DCvertical.pl
index 5d554836065..33b9feb7243 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/DCvertical.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/DCvertical.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
fe30 fe44
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/DCwide.pl b/gnu/usr.bin/perl/lib/unicode/Is/DCwide.pl
index 09dae19629e..afe1e06b7d5 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/DCwide.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/DCwide.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
3000
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/DecoCanon.pl b/gnu/usr.bin/perl/lib/unicode/Is/DecoCanon.pl
index c5a59f6596c..57c167b5f82 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/DecoCanon.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/DecoCanon.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
00c0 00c5
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/DecoCompat.pl b/gnu/usr.bin/perl/lib/unicode/Is/DecoCompat.pl
index 43d34fc110b..940d956f9f9 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/DecoCompat.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/DecoCompat.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
00a0
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Digit.pl b/gnu/usr.bin/perl/lib/unicode/Is/Digit.pl
index 2ab8156d778..259bb891f6b 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Digit.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Digit.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0030 0039
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Graph.pl b/gnu/usr.bin/perl/lib/unicode/Is/Graph.pl
index 9c94bb722cb..238cc56229c 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Graph.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Graph.pl
@@ -1,9 +1,9 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0021 007e
-00a0 021f
+00a1 021f
0222 0233
0250 02ad
02b0 02ee
@@ -239,7 +239,7 @@ return <<'END';
1361 137c
13a0 13f4
1401 1676
-1680 169c
+1681 169c
16a0 16f0
1780 17dc
17e0 17e9
@@ -265,9 +265,8 @@ return <<'END';
1fdd 1fef
1ff2 1ff4
1ff6 1ffe
-2000 200b
-2010 2029
-202f 2046
+2010 2027
+2030 2046
2048 204d
2070
2074 208e
@@ -303,7 +302,7 @@ return <<'END';
2e9b 2ef3
2f00 2fd5
2ff0 2ffb
-3000 303a
+3001 303a
303e 303f
3041 3094
3099 309e
@@ -329,6 +328,7 @@ a4b5 a4c0
a4c2 a4c4
a4c6
ac00 d7a3
+e000 f8ff
f900 fa2d
fb00 fb06
fb13 fb17
@@ -359,4 +359,6 @@ ffda ffdc
ffe0 ffe6
ffe8 ffee
fffc fffd
+f0000 ffffd
+100000 10fffd
END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/L.pl b/gnu/usr.bin/perl/lib/unicode/Is/L.pl
index c32f83049ce..bfe2c274128 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/L.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/L.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0041 005a
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/LbrkAI.pl b/gnu/usr.bin/perl/lib/unicode/Is/LbrkAI.pl
new file mode 100644
index 00000000000..297f5cf1fad
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/LbrkAI.pl
@@ -0,0 +1,139 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+00a1
+00a7 00a8
+00aa
+00b2 00b3
+00b6 00ba
+00bc 00bf
+00c6
+00d0
+00d7 00d8
+00de 00e1
+00e6
+00e8 00ea
+00ec 00ed
+00f0
+00f2 00f3
+00f7 00fa
+00fc
+00fe
+0101
+0111
+0113
+011b
+0126 0127
+012b
+0131 0133
+0138
+013f 0142
+0144
+0148 014a
+014d
+0152 0153
+0166 0167
+016b
+01ce
+01d0
+01d2
+01d4
+01d6
+01d8
+01da
+01dc
+0251
+0261
+02c7
+02c9 02cb
+02cd
+02d0
+02d8 02db
+02dd
+0391 03a1
+03a3 03a9
+03b1 03c1
+03c3 03c9
+0401
+0410 044f
+0451
+2016
+2020 2021
+203b
+2074
+207f
+2081 2084
+2105
+2113
+2121 2122
+212b
+2154 2155
+215b
+215e
+2160 216b
+2170 2179
+2190 2199
+21d2
+21d4
+2200
+2202 2203
+2207 2208
+220b
+220f
+2211
+2215
+221a
+221d 2220
+2223
+2225
+2227 222c
+222e
+2234 2237
+223c 223d
+2248
+224c
+2252
+2260 2261
+2264 2267
+226a 226b
+226e 226f
+2282 2283
+2286 2287
+2295
+2299
+22a5
+22bf
+2312
+2460 24bf
+24d0 24e9
+2500 254b
+2550 2574
+2580 258f
+2592 2595
+25a0 25a1
+25a3 25a9
+25b2 25b3
+25b6 25b7
+25bc 25bd
+25c0 25c1
+25c6 25c7
+25cb
+25ce 25d1
+25e2 25e5
+25ef
+2605 2606
+2609
+260e 260f
+261c
+261e
+2640
+2642
+2660 2661
+2663 2665
+2667 266a
+266c 266d
+266f
+e000 f8ff
+fffd
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/LbrkAL.pl b/gnu/usr.bin/perl/lib/unicode/Is/LbrkAL.pl
new file mode 100644
index 00000000000..c1fc416662a
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/LbrkAL.pl
@@ -0,0 +1,387 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+0023
+0026
+002a
+003c 003e
+0040 005a
+005e 007a
+007e
+00a6
+00a9
+00ac
+00ae 00af
+00b5
+00c0 00c5
+00c7 00cf
+00d1 00d6
+00d9 00dd
+00e2 00e5
+00e7
+00eb
+00ee 00ef
+00f1
+00f4 00f6
+00fb
+00fd
+00ff 0100
+0102 0110
+0112
+0114 011a
+011c 0125
+0128 012a
+012c 0130
+0134 0137
+0139 013e
+0143
+0145 0147
+014b 014c
+014e 0151
+0154 0165
+0168 016a
+016c 01cd
+01cf
+01d1
+01d3
+01d5
+01d7
+01d9
+01db
+01dd 021f
+0222 0233
+0250
+0252 0260
+0262 02ad
+02b0 02c6
+02ce 02cf
+02d1 02d7
+02dc
+02de 02ee
+0374 0375
+037a
+037e
+0384 038a
+038c
+038e 0390
+03aa 03b0
+03c2
+03ca 03ce
+03d0 03d7
+03da 03f3
+0400
+0402 040f
+0450
+0452 0482
+048c 04c4
+04c7 04c8
+04cb 04cc
+04d0 04f5
+04f8 04f9
+0531 0556
+0559 055f
+0561 0587
+05be
+05c0
+05c3
+05d0 05ea
+05f0 05f4
+060c
+061b
+061f
+0621 063a
+0640 064a
+066a 066d
+0671 06d5
+06e5 06e6
+06e9
+06fa 06fe
+0700 070d
+0710
+0712 072c
+0780 07a5
+0905 0939
+093d
+0950
+0958 0961
+0964 0965
+0970
+0985 098c
+098f 0990
+0993 09a8
+09aa 09b0
+09b2
+09b6 09b9
+09dc 09dd
+09df 09e1
+09f0 09f1
+09f4 09fa
+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
+0b70
+0b85 0b8a
+0b8e 0b90
+0b92 0b95
+0b99 0b9a
+0b9c
+0b9e 0b9f
+0ba3 0ba4
+0ba8 0baa
+0bae 0bb5
+0bb7 0bb9
+0bf0 0bf2
+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
+0df4
+0e4f
+0f00 0f0a
+0f0d 0f17
+0f1a 0f1f
+0f2a 0f34
+0f36
+0f38
+0f40 0f47
+0f49 0f6a
+0f85
+0f88 0f8b
+0fbe 0fc5
+0fc7 0fcc
+0fcf
+104a 104f
+10a0 10c5
+10d0 10f6
+10fb
+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
+1362 1368
+1372 137c
+13a0 13f4
+1401 1676
+1681 169a
+16a0 16f0
+17dc
+1800 1805
+1807 180a
+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 1fc4
+1fc6 1fd3
+1fd6 1fdb
+1fdd 1fef
+1ff2 1ff4
+1ff6 1ffe
+2015
+2017
+2022 2023
+2038
+203d 2043
+2048 204d
+2070
+2075 207c
+2080
+2085 208c
+2100 2102
+2104
+2106 2108
+210a 2112
+2114 2115
+2117 2120
+2123 2125
+2127 212a
+212c 213a
+2153
+2156 215a
+215c 215d
+215f
+216c 216f
+217a 2183
+219a 21d1
+21d3
+21d5 21f3
+2201
+2204 2206
+2209 220a
+220c 220e
+2210
+2214
+2216 2219
+221b 221c
+2221 2222
+2224
+2226
+222d
+222f 2233
+2238 223b
+223e 2247
+2249 224b
+224d 2251
+2253 225f
+2262 2263
+2268 2269
+226c 226d
+2270 2281
+2284 2285
+2288 2294
+2296 2298
+229a 22a4
+22a6 22be
+22c0 22f1
+2300 2311
+2313 2328
+232b 237b
+237d 239a
+2400 2426
+2440 244a
+24c0 24cf
+24ea
+254c 254f
+2575 257f
+2590 2591
+25a2
+25aa 25b1
+25b4 25b5
+25b8 25bb
+25be 25bf
+25c2 25c5
+25c8 25ca
+25cc 25cd
+25d2 25e1
+25e6 25ee
+25f0 25f7
+2600 2604
+2607 2608
+260a 260d
+2610 2613
+2619 261b
+261d
+261f 263f
+2641
+2643 265f
+2662
+2666
+266b
+266e
+2670 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
+fb00 fb06
+fb13 fb17
+fb1d
+fb1f fb36
+fb38 fb3c
+fb3e
+fb40 fb41
+fb43 fb44
+fb46 fbb1
+fbd3 fd3d
+fd50 fd8f
+fd92 fdc7
+fdf0 fdfb
+fe6b
+fe70 fe72
+fe74
+fe76 fefc
+ff66
+ff71 ff9d
+ffa0 ffbe
+ffc2 ffc7
+ffca ffcf
+ffd2 ffd7
+ffda ffdc
+ffe8 ffee
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/LbrkB2.pl b/gnu/usr.bin/perl/lib/unicode/Is/LbrkB2.pl
new file mode 100644
index 00000000000..a1410da25f2
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/LbrkB2.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+2014
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/LbrkBA.pl b/gnu/usr.bin/perl/lib/unicode/Is/LbrkBA.pl
new file mode 100644
index 00000000000..93ec04efb46
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/LbrkBA.pl
@@ -0,0 +1,19 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+0009
+007c
+00ad
+00b4
+058a
+0f0b
+1361
+1680
+17d5
+2000 2006
+2008 200a
+2010
+2012 2013
+2027
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/LbrkBB.pl b/gnu/usr.bin/perl/lib/unicode/Is/LbrkBB.pl
new file mode 100644
index 00000000000..b9bc7e8e355
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/LbrkBB.pl
@@ -0,0 +1,8 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+02c8
+02cc
+1806
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/LbrkBK.pl b/gnu/usr.bin/perl/lib/unicode/Is/LbrkBK.pl
new file mode 100644
index 00000000000..17bb5514c5d
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/LbrkBK.pl
@@ -0,0 +1,7 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+000c
+2028 2029
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/LbrkCB.pl b/gnu/usr.bin/perl/lib/unicode/Is/LbrkCB.pl
new file mode 100644
index 00000000000..8da9eba019d
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/LbrkCB.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+fffc
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/LbrkCL.pl b/gnu/usr.bin/perl/lib/unicode/Is/LbrkCL.pl
new file mode 100644
index 00000000000..353c59490bd
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/LbrkCL.pl
@@ -0,0 +1,47 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+0029
+005d
+007d
+0f3b
+0f3d
+169c
+2046
+207e
+208e
+232a
+3001 3002
+3009
+300b
+300d
+300f
+3011
+3015
+3017
+3019
+301b
+301e 301f
+fd3f
+fe36
+fe38
+fe3a
+fe3c
+fe3e
+fe40
+fe42
+fe44
+fe50
+fe52
+fe5a
+fe5c
+fe5e
+ff09
+ff0c
+ff0e
+ff3d
+ff5d
+ff61
+ff63 ff64
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/LbrkCM.pl b/gnu/usr.bin/perl/lib/unicode/Is/LbrkCM.pl
new file mode 100644
index 00000000000..87c7833f510
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/LbrkCM.pl
@@ -0,0 +1,117 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+0000 0008
+000b
+000e 001f
+007f 009f
+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
+070f
+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
+1160 11a2
+11a8 11f9
+17b4 17d3
+180b 180e
+18a9
+200c 200f
+202a 202e
+206a 206f
+20d0 20e3
+302a 302f
+3099 309a
+fb1e
+fe20 fe23
+fff9 fffb
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/LbrkCR.pl b/gnu/usr.bin/perl/lib/unicode/Is/LbrkCR.pl
new file mode 100644
index 00000000000..25482697910
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/LbrkCR.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+000d
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/LbrkEX.pl b/gnu/usr.bin/perl/lib/unicode/Is/LbrkEX.pl
new file mode 100644
index 00000000000..173bf58d55c
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/LbrkEX.pl
@@ -0,0 +1,10 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+0021
+003f
+fe56 fe57
+ff01
+ff1f
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/LbrkGL.pl b/gnu/usr.bin/perl/lib/unicode/Is/LbrkGL.pl
new file mode 100644
index 00000000000..49bb985c120
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/LbrkGL.pl
@@ -0,0 +1,11 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+00a0
+0f0c
+2007
+2011
+202f
+feff
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/LbrkHY.pl b/gnu/usr.bin/perl/lib/unicode/Is/LbrkHY.pl
new file mode 100644
index 00000000000..71e58868693
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/LbrkHY.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+002d
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/LbrkID.pl b/gnu/usr.bin/perl/lib/unicode/Is/LbrkID.pl
new file mode 100644
index 00000000000..6e6100c191b
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/LbrkID.pl
@@ -0,0 +1,81 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+1100 1159
+115f
+2e80 2e99
+2e9b 2ef3
+2f00 2fd5
+2ff0 2ffb
+3000
+3003 3004
+3006 3007
+3012 3013
+3020 3029
+3030 303a
+303e 303f
+3042
+3044
+3046
+3048
+304a 3062
+3064 3082
+3084
+3086
+3088 308d
+308f 3094
+30a2
+30a4
+30a6
+30a8
+30aa 30c2
+30c4 30e2
+30e4
+30e6
+30e8 30ed
+30ef 30f4
+30f7 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
+a490 a4a1
+a4a4 a4b3
+a4b5 a4c0
+a4c2 a4c4
+a4c6
+ac00 d7a3
+f900 fa2d
+fe30 fe34
+fe49 fe4f
+fe51
+fe58
+fe5f fe66
+fe68
+ff02 ff03
+ff06 ff07
+ff0a ff0b
+ff0d
+ff0f ff19
+ff1c ff1e
+ff20 ff3a
+ff3c
+ff3e ff5a
+ff5c
+ff5e
+ffe2 ffe4
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/LbrkIN.pl b/gnu/usr.bin/perl/lib/unicode/Is/LbrkIN.pl
new file mode 100644
index 00000000000..1758673e4bb
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/LbrkIN.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+2024 2026
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/LbrkIS.pl b/gnu/usr.bin/perl/lib/unicode/Is/LbrkIS.pl
new file mode 100644
index 00000000000..32dcfb0f5b8
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/LbrkIS.pl
@@ -0,0 +1,9 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+002c
+002e
+003a 003b
+0589
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/LbrkLF.pl b/gnu/usr.bin/perl/lib/unicode/Is/LbrkLF.pl
new file mode 100644
index 00000000000..9b845aed6fa
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/LbrkLF.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+000a
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/LbrkNS.pl b/gnu/usr.bin/perl/lib/unicode/Is/LbrkNS.pl
new file mode 100644
index 00000000000..b7ff279c1d8
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/LbrkNS.pl
@@ -0,0 +1,41 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+0e5a 0e5b
+17d4
+17d6 17da
+203c
+2044
+3005
+301c
+3041
+3043
+3045
+3047
+3049
+3063
+3083
+3085
+3087
+308e
+309b 309e
+30a1
+30a3
+30a5
+30a7
+30a9
+30c3
+30e3
+30e5
+30e7
+30ee
+30f5 30f6
+30fb
+30fd
+fe54 fe55
+ff1a ff1b
+ff65
+ff67 ff70
+ff9e ff9f
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/LbrkNU.pl b/gnu/usr.bin/perl/lib/unicode/Is/LbrkNU.pl
new file mode 100644
index 00000000000..eb51418f682
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/LbrkNU.pl
@@ -0,0 +1,24 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# 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
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/LbrkOP.pl b/gnu/usr.bin/perl/lib/unicode/Is/LbrkOP.pl
new file mode 100644
index 00000000000..90f18098b74
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/LbrkOP.pl
@@ -0,0 +1,43 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# 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/gnu/usr.bin/perl/lib/unicode/Is/LbrkPO.pl b/gnu/usr.bin/perl/lib/unicode/Is/LbrkPO.pl
new file mode 100644
index 00000000000..07f7bf74d21
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/LbrkPO.pl
@@ -0,0 +1,16 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+0025
+00a2
+00b0
+2030 2037
+20a7
+2103
+2109
+2126
+fe6a
+ff05
+ffe0
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/LbrkPR.pl b/gnu/usr.bin/perl/lib/unicode/Is/LbrkPR.pl
new file mode 100644
index 00000000000..03466c912a4
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/LbrkPR.pl
@@ -0,0 +1,21 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+0024
+002b
+005c
+00a3 00a5
+00b1
+09f2 09f3
+0e3f
+17db
+20a0 20a6
+20a8 20af
+2116
+2212 2213
+fe69
+ff04
+ffe1
+ffe5 ffe6
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/LbrkQU.pl b/gnu/usr.bin/perl/lib/unicode/Is/LbrkQU.pl
new file mode 100644
index 00000000000..35dac981c54
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/LbrkQU.pl
@@ -0,0 +1,13 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+0022
+0027
+00ab
+00bb
+2018 2019
+201b 201d
+201f
+2039 203a
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/LbrkSA.pl b/gnu/usr.bin/perl/lib/unicode/Is/LbrkSA.pl
new file mode 100644
index 00000000000..4539e093d07
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/LbrkSA.pl
@@ -0,0 +1,30 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+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
+1000 1021
+1023 1027
+1029 102a
+1050 1055
+1780 17b3
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/LbrkSG.pl b/gnu/usr.bin/perl/lib/unicode/Is/LbrkSG.pl
new file mode 100644
index 00000000000..33e1daca88a
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/LbrkSG.pl
@@ -0,0 +1,8 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+d800 db7f
+db80 dbff
+dc00 dfff
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/LbrkSP.pl b/gnu/usr.bin/perl/lib/unicode/Is/LbrkSP.pl
new file mode 100644
index 00000000000..2153e128dce
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/LbrkSP.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+0020
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/LbrkSY.pl b/gnu/usr.bin/perl/lib/unicode/Is/LbrkSY.pl
new file mode 100644
index 00000000000..ce65fe1d852
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/LbrkSY.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+002f
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/LbrkXX.pl b/gnu/usr.bin/perl/lib/unicode/Is/LbrkXX.pl
new file mode 100644
index 00000000000..c3b32ac61d7
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/LbrkXX.pl
@@ -0,0 +1,5 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/LbrkZW.pl b/gnu/usr.bin/perl/lib/unicode/Is/LbrkZW.pl
new file mode 100644
index 00000000000..63c9dcf489d
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/LbrkZW.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+200b
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Ll.pl b/gnu/usr.bin/perl/lib/unicode/Is/Ll.pl
index 28147943e85..03dafcc7426 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Ll.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Ll.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0061 007a
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Lm.pl b/gnu/usr.bin/perl/lib/unicode/Is/Lm.pl
index 4380afe18e8..23a3c55d4a3 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Lm.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Lm.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
02b0 02b8
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Lo.pl b/gnu/usr.bin/perl/lib/unicode/Is/Lo.pl
index 78fab4cd0e1..d82c6bbdaf8 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Lo.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Lo.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
01bb
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Lower.pl b/gnu/usr.bin/perl/lib/unicode/Is/Lower.pl
index 28147943e85..03dafcc7426 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Lower.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Lower.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0061 007a
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Lt.pl b/gnu/usr.bin/perl/lib/unicode/Is/Lt.pl
index 809c37a1f25..b19755ca8e9 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Lt.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Lt.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
01c5
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Lu.pl b/gnu/usr.bin/perl/lib/unicode/Is/Lu.pl
index 8dde2742d0a..07dee4834c2 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Lu.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Lu.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0041 005a
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/M.pl b/gnu/usr.bin/perl/lib/unicode/Is/M.pl
index 9367775a820..e3ef7f3dfab 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/M.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/M.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0300 034e
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Mc.pl b/gnu/usr.bin/perl/lib/unicode/Is/Mc.pl
index 937d8d40059..a76d66c9b30 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Mc.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Mc.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0903
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Me.pl b/gnu/usr.bin/perl/lib/unicode/Is/Me.pl
new file mode 100644
index 00000000000..23ef860d8e3
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Me.pl
@@ -0,0 +1,9 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+0488 0489
+06dd 06de
+20dd 20e0
+20e2 20e3
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Mirrored.pl b/gnu/usr.bin/perl/lib/unicode/Is/Mirrored.pl
index e2c55a6443e..d324f506a79 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Mirrored.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Mirrored.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0028 0029
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Mn.pl b/gnu/usr.bin/perl/lib/unicode/Is/Mn.pl
index aba40afa57b..803e038d973 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Mn.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Mn.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0300 034e
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/N.pl b/gnu/usr.bin/perl/lib/unicode/Is/N.pl
index 1291f2713f0..8667e774b4c 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/N.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/N.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0030 0039
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Nd.pl b/gnu/usr.bin/perl/lib/unicode/Is/Nd.pl
index 2ab8156d778..259bb891f6b 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Nd.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Nd.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0030 0039
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Nl.pl b/gnu/usr.bin/perl/lib/unicode/Is/Nl.pl
new file mode 100644
index 00000000000..bdeefd57619
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Nl.pl
@@ -0,0 +1,9 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+2160 2183
+3007
+3021 3029
+3038 303a
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/No.pl b/gnu/usr.bin/perl/lib/unicode/Is/No.pl
index 6a57dc5f891..13cac3b0e8f 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/No.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/No.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
00b2 00b3
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/P.pl b/gnu/usr.bin/perl/lib/unicode/Is/P.pl
index 8fd1e8e1838..97330ecd48b 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/P.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/P.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0021 0023
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Pc.pl b/gnu/usr.bin/perl/lib/unicode/Is/Pc.pl
new file mode 100644
index 00000000000..e14874d0116
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Pc.pl
@@ -0,0 +1,12 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+005f
+203f 2040
+30fb
+fe33 fe34
+fe4d fe4f
+ff3f
+ff65
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Pd.pl b/gnu/usr.bin/perl/lib/unicode/Is/Pd.pl
index 58997ca7e98..b4a2ffbe8f4 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Pd.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Pd.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
002d
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Pe.pl b/gnu/usr.bin/perl/lib/unicode/Is/Pe.pl
index 8879191c342..2b5bd3eeb9c 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Pe.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Pe.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0029
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Pf.pl b/gnu/usr.bin/perl/lib/unicode/Is/Pf.pl
new file mode 100644
index 00000000000..b27a4f68518
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Pf.pl
@@ -0,0 +1,9 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+00bb
+2019
+201d
+203a
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Pi.pl b/gnu/usr.bin/perl/lib/unicode/Is/Pi.pl
new file mode 100644
index 00000000000..dbbae44957d
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Pi.pl
@@ -0,0 +1,10 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+00ab
+2018
+201b 201c
+201f
+2039
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Po.pl b/gnu/usr.bin/perl/lib/unicode/Is/Po.pl
index e6b8b025203..849ee17867c 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Po.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Po.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0021 0023
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Print.pl b/gnu/usr.bin/perl/lib/unicode/Is/Print.pl
index 95605860658..1229a282b2e 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Print.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Print.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0020 007e
@@ -266,7 +266,7 @@ return <<'END';
1ff2 1ff4
1ff6 1ffe
2000 200b
-2010 2029
+2010 2027
202f 2046
2048 204d
2070
@@ -329,6 +329,7 @@ a4b5 a4c0
a4c2 a4c4
a4c6
ac00 d7a3
+e000 f8ff
f900 fa2d
fb00 fb06
fb13 fb17
@@ -359,4 +360,6 @@ ffda ffdc
ffe0 ffe6
ffe8 ffee
fffc fffd
+f0000 ffffd
+100000 10fffd
END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Ps.pl b/gnu/usr.bin/perl/lib/unicode/Is/Ps.pl
index a7dee379ebe..90f18098b74 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Ps.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Ps.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0028
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Punct.pl b/gnu/usr.bin/perl/lib/unicode/Is/Punct.pl
index 8fd1e8e1838..97330ecd48b 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Punct.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Punct.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0021 0023
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/S.pl b/gnu/usr.bin/perl/lib/unicode/Is/S.pl
index 8851766e9f2..a304e17ff53 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/S.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/S.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0024
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Sc.pl b/gnu/usr.bin/perl/lib/unicode/Is/Sc.pl
index 5776bd6a576..adeb3e43363 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Sc.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Sc.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0024
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Sk.pl b/gnu/usr.bin/perl/lib/unicode/Is/Sk.pl
new file mode 100644
index 00000000000..52f88ae0040
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Sk.pl
@@ -0,0 +1,27 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+005e
+0060
+00a8
+00af
+00b4
+00b8
+02b9 02ba
+02c2 02cf
+02d2 02df
+02e5 02ed
+0374 0375
+0384 0385
+1fbd
+1fbf 1fc1
+1fcd 1fcf
+1fdd 1fdf
+1fed 1fef
+1ffd 1ffe
+309b 309c
+ff3e
+ff40
+ffe3
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Sm.pl b/gnu/usr.bin/perl/lib/unicode/Is/Sm.pl
index ae9424cc621..540da63e643 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Sm.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Sm.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
002b
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/So.pl b/gnu/usr.bin/perl/lib/unicode/Is/So.pl
index 4e9dfc2b5ee..3caf617b665 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/So.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/So.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
00a6 00a7
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Space.pl b/gnu/usr.bin/perl/lib/unicode/Is/Space.pl
index 4121ef49b86..9971082fbed 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Space.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Space.pl
@@ -1,9 +1,8 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
-0009 000a
-000c 000d
+0009 000d
0020
00a0
1680
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/SpacePerl.pl b/gnu/usr.bin/perl/lib/unicode/Is/SpacePerl.pl
new file mode 100644
index 00000000000..2bb74dea8a0
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/SpacePerl.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# 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/gnu/usr.bin/perl/lib/unicode/Is/SylA.pl b/gnu/usr.bin/perl/lib/unicode/Is/SylA.pl
index ec287c456ab..6a3fc47eb9b 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/SylA.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/SylA.pl
@@ -1,5 +1,158 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
+1203
+120b
+1213
+121b
+1223
+122b
+1233
+123b
+1243
+1253
+1263
+126b
+1273
+127b
+1283
+1293
+129b
+12a3
+12ab
+12bb
+12cb
+12d3
+12db
+12e3
+12eb
+12f3
+12fb
+1303
+130b
+131b
+1323
+132b
+1333
+133b
+1343
+134b
+1353
+13a0
+13a6 13a7
+13ad
+13b3
+13b9
+13be 13bf
+13c6
+13cc
+13d3 13d4
+13dc 13dd
+13e3
+13e9
+13ef
+140a
+1438
+1455
+146a
+1472
+1490
+14aa
+14c7
+14da
+14f4
+1515
+152d
+154b
+154d
+1559
+1566
+156e
+1573
+1579
+1583
+1589
+158d
+1593
+159a
+159e
+15a4
+15ac
+15b3
+15b7
+15bb
+15bf
+15c3
+15c9
+15cf
+15d5
+15e1
+15e7
+15ed
+15f4
+15fa
+1600
+1607
+160d
+1613
+161b
+1621
+1627
+162d
+1633
+1639
+163f
+1645
+164d
+1653
+1659
+1660
+1666
+166c
+1675
+30a1 30a2
+30ab 30ac
+30b5 30b6
+30bf 30c0
+30ca
+30cf 30d1
+30de
+30e3 30e4
+30e9
+30ee 30ef
+30f5
+30f7
+32d0
+32d5
+32da
+32df
+32e4
+32e9
+32ee
+32f3
+32f6
+32fb
+ff67
+ff6c
+ff71
+ff76
+ff7b
+ff80
+ff85
+ff8a
+ff8f
+ff94
+ff97
+ff9c
+3041 3042
+304b 304c
+3055 3056
+305f 3060
+306a
+306f 3071
+307e
+3083 3084
+3089
+308e 308f
END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/SylAA.pl b/gnu/usr.bin/perl/lib/unicode/Is/SylAA.pl
new file mode 100644
index 00000000000..6d1bd6daddc
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/SylAA.pl
@@ -0,0 +1,25 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+140b
+1439
+1456
+1473
+1491
+14ab
+14c8
+14db
+14f5
+1516
+152e
+154c
+155a
+1567
+157a
+1584
+1594
+15a5
+15ad
+1676
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/SylAAI.pl b/gnu/usr.bin/perl/lib/unicode/Is/SylAAI.pl
new file mode 100644
index 00000000000..83134b6a169
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/SylAAI.pl
@@ -0,0 +1,19 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+1402
+1430
+144d
+146c
+148a
+14a4
+14c1
+14d4
+14ee
+1527
+1545
+1554
+157e
+158e
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/SylAI.pl b/gnu/usr.bin/perl/lib/unicode/Is/SylAI.pl
new file mode 100644
index 00000000000..e639bd0438e
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/SylAI.pl
@@ -0,0 +1,7 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+141c
+166f 1670
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/SylC.pl b/gnu/usr.bin/perl/lib/unicode/Is/SylC.pl
index ec287c456ab..fb8b08e300f 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/SylC.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/SylC.pl
@@ -1,5 +1,70 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
+1205
+120d
+1215
+121d
+1225
+122d
+1235
+123d
+1245
+1255
+1265
+126d
+1275
+127d
+1285
+1295
+129d
+12a5
+12ad
+12bd
+12cd
+12d5
+12dd
+12e5
+12ed
+12f5
+12fd
+1305
+130d
+131d
+1325
+132d
+1335
+133d
+1345
+134d
+1355
+13c0
+13cd
+141d
+142b 142e
+1449 144b
+1466
+1483
+1485 1488
+14a1
+14bb 14bf
+14d0 14d2
+14ea 14ec
+1505 1506
+1508 150b
+1525
+153e 1540
+1550 1552
+155d
+156a
+156f
+157b 157d
+1585
+1595 1596
+159f
+15a6
+15ae 15af
+30f3
+ff9d
END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/SylE.pl b/gnu/usr.bin/perl/lib/unicode/Is/SylE.pl
index ec287c456ab..d762748c69a 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/SylE.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/SylE.pl
@@ -1,5 +1,147 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
+1204
+120c
+1214
+121c
+1224
+122c
+1234
+123c
+1244
+1254
+1264
+126c
+1274
+127c
+1284
+1294
+129c
+12a4
+12ac
+12bc
+12cc
+12d4
+12dc
+12e4
+12ec
+12f4
+12fc
+1304
+130c
+131c
+1324
+132c
+1334
+133c
+1344
+134c
+1354
+13a1
+13a8
+13ae
+13b4
+13ba
+13c1
+13c7
+13ce
+13d5 13d6
+13de
+13e4
+13ea
+13f0
+1401
+142f
+144c
+1467
+146b
+1489
+14a3
+14c0
+14d3
+14ed
+1510
+1526
+1542 1544
+1553
+155e 155f
+156b
+1570
+1574
+1586
+158a
+1597
+159b
+15a7
+15b0
+15b4
+15b8
+15bc
+15c0
+15c6
+15cc
+15d2
+15de
+15e4
+15ea
+15f1
+15f7
+15fd
+1604
+160a
+1610
+1617
+161e
+1624
+162a
+1630
+1636
+163c
+1642
+164a
+1650
+1656
+165d
+1663
+1669
+30a7 30a8
+30b1 30b2
+30bb 30bc
+30c6 30c7
+30cd
+30d8 30da
+30e1
+30ec
+30f1
+30f6
+30f9
+32d3
+32d8
+32dd
+32e2
+32e7
+32ec
+32f1
+32f9
+32fd
+ff6a
+ff74
+ff79
+ff7e
+ff83
+ff88
+ff8d
+ff92
+ff9a
+3047 3048
+3051 3052
+305b 305c
+3066 3067
+306d
+3078 307a
+3081
+308c
+3091
END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/SylEE.pl b/gnu/usr.bin/perl/lib/unicode/Is/SylEE.pl
new file mode 100644
index 00000000000..9f8ff07dc1e
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/SylEE.pl
@@ -0,0 +1,34 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+1408
+1436
+1453
+15c7
+15cd
+15d3
+15df
+15e5
+15eb
+15f2
+15f8
+15fe
+1605
+160b
+1611
+1618
+161f
+1625
+162b
+1631
+1637
+163d
+1643
+164b
+1651
+1657
+165e
+1664
+166a
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/SylI.pl b/gnu/usr.bin/perl/lib/unicode/Is/SylI.pl
index ec287c456ab..29bc70f4fa5 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/SylI.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/SylI.pl
@@ -1,5 +1,154 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
+1202
+120a
+1212
+121a
+1222
+122a
+1232
+123a
+1242
+1252
+1262
+126a
+1272
+127a
+1282
+1292
+129a
+12a2
+12aa
+12ba
+12ca
+12d2
+12da
+12e2
+12ea
+12f2
+12fa
+1302
+130a
+131a
+1322
+132a
+1332
+133a
+1342
+134a
+1352
+13a2
+13a9
+13af
+13b5
+13bb
+13c2
+13c8
+13cf
+13d7 13d8
+13df
+13e5
+13eb
+13f1
+1403
+1409
+1431
+1437
+144e
+1454
+1468
+146d
+148b
+14a5
+14c2
+14d5
+14ef
+1511
+1528
+1541
+1546
+1555
+1560 1561
+156c
+1571
+1575
+157f
+1587
+158b
+158f
+1598
+159c
+15a0
+15a8
+15b1
+15b5
+15b9
+15bd
+15c1
+15c8
+15ce
+15d4
+15e0
+15e6
+15ec
+15f3
+15f9
+15ff
+1606
+160c
+1612
+1619 161a
+1620
+1626
+162c
+1632
+1638
+163e
+1644
+164c
+1652
+1658
+165f
+1665
+166b
+1671
+30a3 30a4
+30ad 30ae
+30b7 30b8
+30c1 30c2
+30cb
+30d2 30d4
+30df
+30ea
+30f0
+30f8
+32d1
+32d6
+32db
+32e0
+32e5
+32ea
+32ef
+32f7
+32fc
+ff68
+ff72
+ff77
+ff7c
+ff81
+ff86
+ff8b
+ff90
+ff98
+3043 3044
+304d 304e
+3057 3058
+3061 3062
+306b
+3072 3074
+307f
+308a
+3090
END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/SylII.pl b/gnu/usr.bin/perl/lib/unicode/Is/SylII.pl
new file mode 100644
index 00000000000..2dcd49f24e4
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/SylII.pl
@@ -0,0 +1,25 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+1404
+1432
+144f
+146e
+148c
+14a6
+14c3
+14d6
+14f0
+1512
+1529
+1547
+1556
+1562 1563
+1576
+1580
+1590
+15a1
+15a9
+1672
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/SylN.pl b/gnu/usr.bin/perl/lib/unicode/Is/SylN.pl
new file mode 100644
index 00000000000..d7d90c7a0d3
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/SylN.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+3093
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/SylO.pl b/gnu/usr.bin/perl/lib/unicode/Is/SylO.pl
index ec287c456ab..2c795f0291b 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/SylO.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/SylO.pl
@@ -1,5 +1,157 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
+1206
+120e
+1216
+121e
+1226
+122e
+1236
+123e
+1246
+1256
+1266
+126e
+1276
+127e
+1286
+1296
+129e
+12a6
+12ae
+12be
+12ce
+12d6
+12de
+12e6
+12ee
+12f6
+12fe
+1306
+130e
+131e
+1326
+132e
+1336
+133e
+1346
+134e
+1356
+13a3
+13aa
+13b0
+13b6
+13bc
+13c3
+13c9
+13d0
+13d9
+13e0
+13e6
+13ec
+13f2
+1405
+1433
+1450
+1469
+146f
+148d
+14a7
+14c4
+14d7
+14f1
+1513
+152a
+1548
+154a
+1557
+1564
+156d
+1572
+1577
+1581
+1588
+158c
+1591
+1599
+159d
+15a2
+15aa
+15b2
+15b6
+15ba
+15be
+15c2
+15c5
+15cb
+15d1
+15dd
+15e3
+15e9
+15f0
+15f6
+15fc
+1603
+1609
+160f
+1616
+161d
+1623
+1629
+162f
+1635
+163b
+1641
+1649
+164f
+1655
+165c
+1662
+1668
+1673
+30a9 30aa
+30b3 30b4
+30bd 30be
+30c8 30c9
+30ce
+30db 30dd
+30e2
+30e7 30e8
+30ed
+30f2
+30fa
+32d4
+32d9
+32de
+32e3
+32e8
+32ed
+32f2
+32f5
+32fa
+32fe
+ff66
+ff6b
+ff6e
+ff75
+ff7a
+ff7f
+ff84
+ff89
+ff8e
+ff93
+ff96
+ff9b
+3049 304a
+3053 3054
+305d 305e
+3068 3069
+306e
+307b 307d
+3082
+3087 3088
+308d
+3092
END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/SylOO.pl b/gnu/usr.bin/perl/lib/unicode/Is/SylOO.pl
new file mode 100644
index 00000000000..27c80322759
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/SylOO.pl
@@ -0,0 +1,25 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+1406 1407
+1434 1435
+1451 1452
+1470 1471
+148e 148f
+14a8 14a9
+14c5 14c6
+14d8 14d9
+14f2 14f3
+1514
+152b 152c
+1549
+1558
+1565
+1578
+1582
+1592
+15a3
+15ab
+1674
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/SylU.pl b/gnu/usr.bin/perl/lib/unicode/Is/SylU.pl
index ec287c456ab..117d981ee6c 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/SylU.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/SylU.pl
@@ -1,5 +1,122 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
+1201
+1209
+1211
+1219
+1221
+1229
+1231
+1239
+1241
+1251
+1261
+1269
+1271
+1279
+1281
+1291
+1299
+12a1
+12a9
+12b9
+12c9
+12d1
+12d9
+12e1
+12e9
+12f1
+12f9
+1301
+1309
+1319
+1321
+1329
+1331
+1339
+1341
+1349
+1351
+13a4
+13ab
+13b1
+13b7
+13bd
+13c4
+13ca
+13d1
+13da
+13e1
+13e7
+13ed
+13f3
+15c4
+15ca
+15d0
+15dc
+15e2
+15e8
+15ef
+15f5
+15fb
+1602
+1608
+160e
+1614 1615
+161c
+1622
+1628
+162e
+1634
+163a
+1640
+1648
+164e
+1654
+165b
+1661
+1667
+30a5 30a6
+30af 30b0
+30b9 30ba
+30c3 30c5
+30cc
+30d5 30d7
+30e0
+30e5 30e6
+30eb
+30f4
+32d2
+32d7
+32dc
+32e1
+32e6
+32eb
+32f0
+32f4
+32f8
+ff69
+ff6d
+ff6f
+ff73
+ff78
+ff7d
+ff82
+ff87
+ff8c
+ff91
+ff95
+ff99
+3045 3046
+304f 3050
+3059 305a
+3063 3065
+306c
+3075 3077
+3080
+3085 3086
+308b
+3094
END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/SylV.pl b/gnu/usr.bin/perl/lib/unicode/Is/SylV.pl
index ec287c456ab..e5a39ed6545 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/SylV.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/SylV.pl
@@ -1,5 +1,54 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
+1200
+1208
+1210
+1218
+1220
+1228
+1230
+1238
+1240
+1250
+1260
+1268
+1270
+1278
+1280
+1290
+1298
+12a0
+12a8
+12b8
+12c8
+12d0
+12d8
+12e0
+12e8
+12f0
+12f8
+1300
+1308
+1318
+1320
+1328
+1330
+1338
+1340
+1348
+1350
+13a5
+13ac
+13b2
+13b8
+13c5
+13cb
+13d2
+13db
+13e2
+13e8
+13ee
+13f4
END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/SylWA.pl b/gnu/usr.bin/perl/lib/unicode/Is/SylWA.pl
index ec287c456ab..39e94caabe0 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/SylWA.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/SylWA.pl
@@ -1,5 +1,49 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
+120f
+1217
+121f
+1227
+122f
+1237
+123f
+124b
+125b
+1267
+126f
+1277
+127f
+128b
+1297
+129f
+12a7
+12b3
+12c3
+12df
+12e7
+12f7
+12ff
+1307
+1313
+1327
+132f
+1337
+133f
+134f
+1357
+1417 1418
+1444 1445
+1461 1462
+147e 147f
+149c 149d
+14b6 14b7
+14cb 14cc
+14e6 14e7
+1500 1501
+150c 150f
+1521 1522
+1539 153a
+15db
END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/SylWAA.pl b/gnu/usr.bin/perl/lib/unicode/Is/SylWAA.pl
new file mode 100644
index 00000000000..cd560eb8a96
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/SylWAA.pl
@@ -0,0 +1,19 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+1419 141b
+1446 1448
+1463 1465
+1480 1482
+149e 14a0
+14b8 14ba
+14cd 14cf
+14e8 14e9
+1502 1504
+1523 1524
+153b 153d
+154e 154f
+155b 155c
+1568 1569
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/SylWC.pl b/gnu/usr.bin/perl/lib/unicode/Is/SylWC.pl
index ec287c456ab..4272b8934f0 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/SylWC.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/SylWC.pl
@@ -1,5 +1,13 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
+124d
+125d
+128d
+12b5
+12c5
+1315
+1484
+1507
END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/SylWE.pl b/gnu/usr.bin/perl/lib/unicode/Is/SylWE.pl
index ec287c456ab..c4c5ba99aee 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/SylWE.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/SylWE.pl
@@ -1,5 +1,23 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
+124c
+125c
+128c
+12b4
+12c4
+1314
+140c 140d
+143a 143b
+1457 1458
+1474 1475
+1492 1493
+14ac 14ad
+14c9 14ca
+14dc 14dd
+14f6 14f7
+1517 1518
+152f 1530
+15d8
END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/SylWEE.pl b/gnu/usr.bin/perl/lib/unicode/Is/SylWEE.pl
new file mode 100644
index 00000000000..d3160290feb
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/SylWEE.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+15d9
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/SylWI.pl b/gnu/usr.bin/perl/lib/unicode/Is/SylWI.pl
index ec287c456ab..c914b07a567 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/SylWI.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/SylWI.pl
@@ -1,5 +1,22 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
+124a
+125a
+128a
+12b2
+12c2
+1312
+140e 140f
+143c 143d
+1459 145a
+1476 1477
+1494 1495
+14ae 14af
+14de 14df
+14f8 14f9
+1519 151a
+1531 1532
+15da
END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/SylWII.pl b/gnu/usr.bin/perl/lib/unicode/Is/SylWII.pl
new file mode 100644
index 00000000000..c990e437e69
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/SylWII.pl
@@ -0,0 +1,15 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+1410 1411
+143e 143f
+145b 145c
+1478 1479
+1496 1497
+14b0 14b1
+14e0 14e1
+14fa 14fb
+151b 151c
+1533 1534
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/SylWO.pl b/gnu/usr.bin/perl/lib/unicode/Is/SylWO.pl
new file mode 100644
index 00000000000..a73cbdd0ecb
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/SylWO.pl
@@ -0,0 +1,16 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+1412 1413
+1440 1441
+145d 145e
+147a 147b
+1498 1499
+14b2 14b3
+14e2 14e3
+14fc 14fd
+151d 151e
+1535 1536
+15d7
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/SylWOO.pl b/gnu/usr.bin/perl/lib/unicode/Is/SylWOO.pl
new file mode 100644
index 00000000000..6e92f850a7c
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/SylWOO.pl
@@ -0,0 +1,15 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+1414 1416
+1442 1443
+145f 1460
+147c 147d
+149a 149b
+14b4 14b5
+14e4 14e5
+14fe 14ff
+151f 1520
+1537 1538
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/SylWU.pl b/gnu/usr.bin/perl/lib/unicode/Is/SylWU.pl
new file mode 100644
index 00000000000..d165f41d72f
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Is/SylWU.pl
@@ -0,0 +1,6 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by mktables.PL from e.g. Unicode.301.
+# Any changes made here will be lost!
+return <<'END';
+15d6
+END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/SylWV.pl b/gnu/usr.bin/perl/lib/unicode/Is/SylWV.pl
index ec287c456ab..6a06ae90876 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/SylWV.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/SylWV.pl
@@ -1,5 +1,11 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
+1248
+1258
+1288
+12b0
+12c0
+1310
END
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Upper.pl b/gnu/usr.bin/perl/lib/unicode/Is/Upper.pl
index 8dde2742d0a..16f875241d5 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Upper.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Upper.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0041 005a
@@ -86,9 +86,9 @@ return <<'END';
01b5
01b7 01b8
01bc
-01c4
-01c7
-01ca
+01c4 01c5
+01c7 01c8
+01ca 01cb
01cd
01cf
01d1
@@ -106,7 +106,7 @@ return <<'END';
01ea
01ec
01ee
-01f1
+01f1 01f2
01f4
01f6 01f8
01fa
@@ -355,11 +355,14 @@ return <<'END';
1f5d
1f5f
1f68 1f6f
-1fb8 1fbb
-1fc8 1fcb
+1f88 1f8f
+1f98 1f9f
+1fa8 1faf
+1fb8 1fbc
+1fc8 1fcc
1fd8 1fdb
1fe8 1fec
-1ff8 1ffb
+1ff8 1ffc
2102
2107
210b 210d
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Word.pl b/gnu/usr.bin/perl/lib/unicode/Is/Word.pl
index 23186bd27d9..6ea32e6099d 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Word.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Word.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0030 0039
@@ -7,17 +7,23 @@ return <<'END';
005f
0061 007a
00aa
+00b2 00b3
00b5
-00ba
+00b9 00ba
+00bc 00be
00c0 00d6
00d8 00f6
-00f8 01c4
-01c6 01c7
-01c9 01ca
-01cc 01f1
-01f3 021f
+00f8 021f
0222 0233
0250 02ad
+02b0 02b8
+02bb 02c1
+02d0 02d1
+02e0 02e4
+02ee
+0300 034e
+0360 0362
+037a
0386
0388 038a
038c
@@ -26,38 +32,57 @@ return <<'END';
03d0 03d7
03da 03f3
0400 0481
+0483 0486
+0488 0489
048c 04c4
04c7 04c8
04cb 04cc
04d0 04f5
04f8 04f9
0531 0556
+0559
0561 0587
+0591 05a1
+05a3 05b9
+05bb 05bd
+05bf
+05c1 05c2
+05c4
05d0 05ea
05f0 05f2
0621 063a
-0641 064a
+0640 0655
0660 0669
-0671 06d3
-06d5
+0670 06d3
+06d5 06e8
+06ea 06ed
06f0 06fc
-0710
-0712 072c
-0780 07a5
+0710 072c
+0730 074a
+0780 07b0
+0901 0903
0905 0939
-093d
-0950
-0958 0961
+093c 094d
+0950 0954
+0958 0963
0966 096f
+0981 0983
0985 098c
098f 0990
0993 09a8
09aa 09b0
09b2
09b6 09b9
+09bc
+09be 09c4
+09c7 09c8
+09cb 09cd
+09d7
09dc 09dd
-09df 09e1
+09df 09e3
09e6 09f1
+09f4 09f9
+0a02
0a05 0a0a
0a0f 0a10
0a13 0a28
@@ -65,10 +90,14 @@ return <<'END';
0a32 0a33
0a35 0a36
0a38 0a39
+0a3c
+0a3e 0a42
+0a47 0a48
+0a4b 0a4d
0a59 0a5c
0a5e
-0a66 0a6f
-0a72 0a74
+0a66 0a74
+0a81 0a83
0a85 0a8b
0a8d
0a8f 0a91
@@ -76,20 +105,27 @@ return <<'END';
0aaa 0ab0
0ab2 0ab3
0ab5 0ab9
-0abd
+0abc 0ac5
+0ac7 0ac9
+0acb 0acd
0ad0
0ae0
0ae6 0aef
+0b01 0b03
0b05 0b0c
0b0f 0b10
0b13 0b28
0b2a 0b30
0b32 0b33
0b36 0b39
-0b3d
+0b3c 0b43
+0b47 0b48
+0b4b 0b4d
+0b56 0b57
0b5c 0b5d
0b5f 0b61
0b66 0b6f
+0b82 0b83
0b85 0b8a
0b8e 0b90
0b92 0b95
@@ -100,36 +136,60 @@ return <<'END';
0ba8 0baa
0bae 0bb5
0bb7 0bb9
-0be7 0bef
+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
-0e01 0e30
-0e32 0e33
-0e40 0e45
+0dca
+0dcf 0dd4
+0dd6
+0dd8 0ddf
+0df2 0df3
+0e01 0e3a
+0e40 0e4e
0e50 0e59
0e81 0e82
0e84
@@ -142,22 +202,33 @@ return <<'END';
0ea5
0ea7
0eaa 0eab
-0ead 0eb0
-0eb2 0eb3
-0ebd
+0ead 0eb9
+0ebb 0ebd
0ec0 0ec4
+0ec6
+0ec8 0ecd
0ed0 0ed9
0edc 0edd
0f00
-0f20 0f29
-0f40 0f47
+0f18 0f19
+0f20 0f33
+0f35
+0f37
+0f39
+0f3e 0f47
0f49 0f6a
-0f88 0f8b
+0f71 0f84
+0f86 0f8b
+0f90 0f97
+0f99 0fbc
+0fc6
1000 1021
1023 1027
1029 102a
+102c 1032
+1036 1039
1040 1049
-1050 1055
+1050 1059
10a0 10c5
10d0 10f6
1100 1159
@@ -188,18 +259,18 @@ return <<'END';
1318 131e
1320 1346
1348 135a
-1369 1371
+1369 137c
13a0 13f4
1401 166c
166f 1676
1681 169a
16a0 16ea
-1780 17b3
+16ee 16f0
+1780 17d3
17e0 17e9
1810 1819
-1820 1842
-1844 1877
-1880 18a8
+1820 1877
+1880 18a9
1e00 1e9b
1ea0 1ef9
1f00 1f15
@@ -211,20 +282,20 @@ return <<'END';
1f5b
1f5d
1f5f 1f7d
-1f80 1f87
-1f90 1f97
-1fa0 1fa7
-1fb0 1fb4
-1fb6 1fbb
+1f80 1fb4
+1fb6 1fbc
1fbe
1fc2 1fc4
-1fc6 1fcb
+1fc6 1fcc
1fd0 1fd3
1fd6 1fdb
1fe0 1fec
1ff2 1ff4
-1ff6 1ffb
-207f
+1ff6 1ffc
+2070
+2074 2079
+207f 2089
+20d0 20e3
2102
2107
210a 2113
@@ -236,12 +307,25 @@ return <<'END';
212a 212d
212f 2131
2133 2139
-3006
+2153 2183
+2460 249b
+24ea
+2776 2793
+3005 3007
+3021 302f
+3031 3035
+3038 303a
3041 3094
+3099 309a
+309d 309e
30a1 30fa
+30fc 30fe
3105 312c
3131 318e
+3192 3195
31a0 31b7
+3220 3229
+3280 3289
3400 4db5
4e00 9fa5
a000 a48c
@@ -249,8 +333,7 @@ ac00 d7a3
f900 fa2d
fb00 fb06
fb13 fb17
-fb1d
-fb1f fb28
+fb1d fb28
fb2a fb36
fb38 fb3c
fb3e
@@ -261,15 +344,14 @@ fbd3 fd3d
fd50 fd8f
fd92 fdc7
fdf0 fdfb
+fe20 fe23
fe70 fe72
fe74
fe76 fefc
ff10 ff19
ff21 ff3a
ff41 ff5a
-ff66 ff6f
-ff71 ff9d
-ffa0 ffbe
+ff66 ffbe
ffc2 ffc7
ffca ffcf
ffd2 ffd7
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/XDigit.pl b/gnu/usr.bin/perl/lib/unicode/Is/XDigit.pl
index e55682500b2..b26a3b40747 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/XDigit.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/XDigit.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0030 0039
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Z.pl b/gnu/usr.bin/perl/lib/unicode/Is/Z.pl
index 22a9792d4f5..03416c02652 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Z.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Z.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0020
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Zl.pl b/gnu/usr.bin/perl/lib/unicode/Is/Zl.pl
index 0989e1d9205..5f127ce33ab 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Zl.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Zl.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
2028
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Zp.pl b/gnu/usr.bin/perl/lib/unicode/Is/Zp.pl
index 3b23446fe9e..4e38303e722 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Zp.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Zp.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
2029
diff --git a/gnu/usr.bin/perl/lib/unicode/Is/Zs.pl b/gnu/usr.bin/perl/lib/unicode/Is/Zs.pl
index db18055ea43..56cf9e46622 100644
--- a/gnu/usr.bin/perl/lib/unicode/Is/Zs.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Is/Zs.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0020
diff --git a/gnu/usr.bin/perl/lib/unicode/Jamo.txt b/gnu/usr.bin/perl/lib/unicode/Jamo.txt
index 6910ab924ea..ea288f03976 100644
--- a/gnu/usr.bin/perl/lib/unicode/Jamo.txt
+++ b/gnu/usr.bin/perl/lib/unicode/Jamo.txt
@@ -1,69 +1,91 @@
-#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
+# Jamo-3.txt
+#
+# This file is a normative contributory data file in the
+# Unicode Character Database.
+#
+# This file defines the Jamo Short Name property, repeating
+# in machine readable form the information printed in Table 4-4
+# of The Unicode Standard, Version 3.0.
+#
+# See sections 3.11 and 4.4 of The Unicode Standard, Version 3.0
+# for more information.
+#
+# Each line contains two fields, separated by a semicolon.
+#
+# The first field gives the code point, in 4-digit hexadecimal
+# form, of a combining jamo character that participates in
+# the algorithmic determination Hangul syllable character names.
+# The second field gives the Jamo Short Name as a one-, two-,
+# or three-character ASCII string (or in one case, for U+110B,
+# the null string).
+#
+# #############################################################
+
+1100; G # HANGUL CHOSEONG KIYEOK
+1101; GG # HANGUL CHOSEONG SSANGKIYEOK
+1102; N # HANGUL CHOSEONG NIEUN
+1103; D # HANGUL CHOSEONG TIKEUT
+1104; DD # HANGUL CHOSEONG SSANGTIKEUT
+1105; R # HANGUL CHOSEONG RIEUL
+1106; M # HANGUL CHOSEONG MIEUM
+1107; B # HANGUL CHOSEONG PIEUP
+1108; BB # HANGUL CHOSEONG SSANGPIEUP
+1109; S # HANGUL CHOSEONG SIOS
+110A; SS # HANGUL CHOSEONG SSANGSIOS
+110B; # HANGUL CHOSEONG IEUNG
+110C; J # HANGUL CHOSEONG CIEUC
+110D; JJ # HANGUL CHOSEONG SSANGCIEUC
+110E; C # HANGUL CHOSEONG CHIEUCH
+110F; K # HANGUL CHOSEONG KHIEUKH
+1110; T # HANGUL CHOSEONG THIEUTH
+1111; P # HANGUL CHOSEONG PHIEUPH
+1112; H # HANGUL CHOSEONG HIEUH
+1161; A # HANGUL JUNGSEONG A
+1162; AE # HANGUL JUNGSEONG AE
+1163; YA # HANGUL JUNGSEONG YA
+1164; YAE # HANGUL JUNGSEONG YAE
+1165; EO # HANGUL JUNGSEONG EO
+1166; E # HANGUL JUNGSEONG E
+1167; YEO # HANGUL JUNGSEONG YEO
+1168; YE # HANGUL JUNGSEONG YE
+1169; O # HANGUL JUNGSEONG O
+116A; WA # HANGUL JUNGSEONG WA
+116B; WAE # HANGUL JUNGSEONG WAE
+116C; OE # HANGUL JUNGSEONG OE
+116D; YO # HANGUL JUNGSEONG YO
+116E; U # HANGUL JUNGSEONG U
+116F; WEO # HANGUL JUNGSEONG WEO
+1170; WE # HANGUL JUNGSEONG WE
+1171; WI # HANGUL JUNGSEONG WI
+1172; YU # HANGUL JUNGSEONG YU
+1173; EU # HANGUL JUNGSEONG EU
+1174; YI # HANGUL JUNGSEONG YI
+1175; I # HANGUL JUNGSEONG I
+11A8; G # HANGUL JONGSEONG KIYEOK
+11A9; GG # HANGUL JONGSEONG SSANGKIYEOK
+11AA; GS # HANGUL JONGSEONG KIYEOK-SIOS
+11AB; N # HANGUL JONGSEONG NIEUN
+11AC; NJ # HANGUL JONGSEONG NIEUN-CIEUC
+11AD; NH # HANGUL JONGSEONG NIEUN-HIEUH
+11AE; D # HANGUL JONGSEONG TIKEUT
+11AF; L # HANGUL JONGSEONG RIEUL
+11B0; LG # HANGUL JONGSEONG RIEUL-KIYEOK
+11B1; LM # HANGUL JONGSEONG RIEUL-MIEUM
+11B2; LB # HANGUL JONGSEONG RIEUL-PIEUP
+11B3; LS # HANGUL JONGSEONG RIEUL-SIOS
+11B4; LT # HANGUL JONGSEONG RIEUL-THIEUTH
+11B5; LP # HANGUL JONGSEONG RIEUL-PHIEUPH
+11B6; LH # HANGUL JONGSEONG RIEUL-HIEUH
+11B7; M # HANGUL JONGSEONG MIEUM
+11B8; B # HANGUL JONGSEONG PIEUP
+11B9; BS # HANGUL JONGSEONG PIEUP-SIOS
+11BA; S # HANGUL JONGSEONG SIOS
+11BB; SS # HANGUL JONGSEONG SSANGSIOS
+11BC; NG # HANGUL JONGSEONG IEUNG
+11BD; J # HANGUL JONGSEONG CIEUC
+11BE; C # HANGUL JONGSEONG CHIEUCH
+11BF; K # HANGUL JONGSEONG KHIEUKH
+11C0; T # HANGUL JONGSEONG THIEUTH
+11C1; P # HANGUL JONGSEONG PHIEUPH
+11C2; H # HANGUL JONGSEONG HIEUH
diff --git a/gnu/usr.bin/perl/lib/unicode/JamoShort.pl b/gnu/usr.bin/perl/lib/unicode/JamoShort.pl
index 760bcba03e3..19cd4290c62 100644
--- a/gnu/usr.bin/perl/lib/unicode/JamoShort.pl
+++ b/gnu/usr.bin/perl/lib/unicode/JamoShort.pl
@@ -1,72 +1,72 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# 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
+1100 G # HANGUL CHOSEONG KIYEOK
+1101 GG # HANGUL CHOSEONG SSANGKIYEOK
+1102 N # HANGUL CHOSEONG NIEUN
+1103 D # HANGUL CHOSEONG TIKEUT
+1104 DD # HANGUL CHOSEONG SSANGTIKEUT
+1105 R # HANGUL CHOSEONG RIEUL
+1106 M # HANGUL CHOSEONG MIEUM
+1107 B # HANGUL CHOSEONG PIEUP
+1108 BB # HANGUL CHOSEONG SSANGPIEUP
+1109 S # HANGUL CHOSEONG SIOS
+110a SS # HANGUL CHOSEONG SSANGSIOS
+110b # HANGUL CHOSEONG IEUNG
+110c J # HANGUL CHOSEONG CIEUC
+110d JJ # HANGUL CHOSEONG SSANGCIEUC
+110e C # HANGUL CHOSEONG CHIEUCH
+110f K # HANGUL CHOSEONG KHIEUKH
+1110 T # HANGUL CHOSEONG THIEUTH
+1111 P # HANGUL CHOSEONG PHIEUPH
+1112 H # HANGUL CHOSEONG HIEUH
+1161 A # HANGUL JUNGSEONG A
+1162 AE # HANGUL JUNGSEONG AE
+1163 YA # HANGUL JUNGSEONG YA
+1164 YAE # HANGUL JUNGSEONG YAE
+1165 EO # HANGUL JUNGSEONG EO
+1166 E # HANGUL JUNGSEONG E
+1167 YEO # HANGUL JUNGSEONG YEO
+1168 YE # HANGUL JUNGSEONG YE
+1169 O # HANGUL JUNGSEONG O
+116a WA # HANGUL JUNGSEONG WA
+116b WAE # HANGUL JUNGSEONG WAE
+116c OE # HANGUL JUNGSEONG OE
+116d YO # HANGUL JUNGSEONG YO
+116e U # HANGUL JUNGSEONG U
+116f WEO # HANGUL JUNGSEONG WEO
+1170 WE # HANGUL JUNGSEONG WE
+1171 WI # HANGUL JUNGSEONG WI
+1172 YU # HANGUL JUNGSEONG YU
+1173 EU # HANGUL JUNGSEONG EU
+1174 YI # HANGUL JUNGSEONG YI
+1175 I # HANGUL JUNGSEONG I
+11a8 G # HANGUL JONGSEONG KIYEOK
+11a9 GG # HANGUL JONGSEONG SSANGKIYEOK
+11aa GS # HANGUL JONGSEONG KIYEOK-SIOS
+11ab N # HANGUL JONGSEONG NIEUN
+11ac NJ # HANGUL JONGSEONG NIEUN-CIEUC
+11ad NH # HANGUL JONGSEONG NIEUN-HIEUH
+11ae D # HANGUL JONGSEONG TIKEUT
+11af L # HANGUL JONGSEONG RIEUL
+11b0 LG # HANGUL JONGSEONG RIEUL-KIYEOK
+11b1 LM # HANGUL JONGSEONG RIEUL-MIEUM
+11b2 LB # HANGUL JONGSEONG RIEUL-PIEUP
+11b3 LS # HANGUL JONGSEONG RIEUL-SIOS
+11b4 LT # HANGUL JONGSEONG RIEUL-THIEUTH
+11b5 LP # HANGUL JONGSEONG RIEUL-PHIEUPH
+11b6 LH # HANGUL JONGSEONG RIEUL-HIEUH
+11b7 M # HANGUL JONGSEONG MIEUM
+11b8 B # HANGUL JONGSEONG PIEUP
+11b9 BS # HANGUL JONGSEONG PIEUP-SIOS
+11ba S # HANGUL JONGSEONG SIOS
+11bb SS # HANGUL JONGSEONG SSANGSIOS
+11bc NG # HANGUL JONGSEONG IEUNG
+11bd J # HANGUL JONGSEONG CIEUC
+11be C # HANGUL JONGSEONG CHIEUCH
+11bf K # HANGUL JONGSEONG KHIEUKH
+11c0 T # HANGUL JONGSEONG THIEUTH
+11c1 P # HANGUL JONGSEONG PHIEUPH
+11c2 H # HANGUL JONGSEONG HIEUH
END
diff --git a/gnu/usr.bin/perl/lib/unicode/Makefile b/gnu/usr.bin/perl/lib/unicode/Makefile
index c68fa3af00f..af5e77b47ba 100644
--- a/gnu/usr.bin/perl/lib/unicode/Makefile
+++ b/gnu/usr.bin/perl/lib/unicode/Makefile
@@ -1,6 +1,5 @@
all:
- ./mktables.PL
- ./MakeEthiopicSyllables.PL
+ ../../miniperl -I../../lib ./mktables.PL
clean:
rm -f *.pl */*.pl
diff --git a/gnu/usr.bin/perl/lib/unicode/Name.pl b/gnu/usr.bin/perl/lib/unicode/Name.pl
index ef8979f0d13..f5c4c56f21c 100644
--- a/gnu/usr.bin/perl/lib/unicode/Name.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Name.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0000 001f <control>
@@ -10549,4 +10549,6 @@ fffa INTERLINEAR ANNOTATION SEPARATOR
fffb INTERLINEAR ANNOTATION TERMINATOR
fffc OBJECT REPLACEMENT CHARACTER
fffd REPLACEMENT CHARACTER
+f0000 ffffd <Plane 15 Private Use, First>
+100000 10fffd <Plane 16 Private Use, First>
END
diff --git a/gnu/usr.bin/perl/lib/unicode/Number.pl b/gnu/usr.bin/perl/lib/unicode/Number.pl
index b0e054a0d06..1f5c2c84c7e 100644
--- a/gnu/usr.bin/perl/lib/unicode/Number.pl
+++ b/gnu/usr.bin/perl/lib/unicode/Number.pl
@@ -1,7 +1,8 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
+0030 0
0031 1
0032 2
0033 3
@@ -17,6 +18,7 @@ return <<'END';
00bc 1/4
00bd 1/2
00be 3/4
+0660 0
0661 1
0662 2
0663 3
@@ -26,6 +28,7 @@ return <<'END';
0667 7
0668 8
0669 9
+06f0 0
06f1 1
06f2 2
06f3 3
@@ -35,6 +38,7 @@ return <<'END';
06f7 7
06f8 8
06f9 9
+0966 0
0967 1
0968 2
0969 3
@@ -44,6 +48,7 @@ return <<'END';
096d 7
096e 8
096f 9
+09e6 0
09e7 1
09e8 2
09e9 3
@@ -58,6 +63,7 @@ return <<'END';
09f6 3
09f7 4
09f9 16
+0a66 0
0a67 1
0a68 2
0a69 3
@@ -67,6 +73,7 @@ return <<'END';
0a6d 7
0a6e 8
0a6f 9
+0ae6 0
0ae7 1
0ae8 2
0ae9 3
@@ -76,6 +83,7 @@ return <<'END';
0aed 7
0aee 8
0aef 9
+0b66 0
0b67 1
0b68 2
0b69 3
@@ -97,6 +105,7 @@ return <<'END';
0bf0 10
0bf1 100
0bf2 1000
+0c66 0
0c67 1
0c68 2
0c69 3
@@ -106,6 +115,7 @@ return <<'END';
0c6d 7
0c6e 8
0c6f 9
+0ce6 0
0ce7 1
0ce8 2
0ce9 3
@@ -115,6 +125,7 @@ return <<'END';
0ced 7
0cee 8
0cef 9
+0d66 0
0d67 1
0d68 2
0d69 3
@@ -124,6 +135,7 @@ return <<'END';
0d6d 7
0d6e 8
0d6f 9
+0e50 0
0e51 1
0e52 2
0e53 3
@@ -133,6 +145,7 @@ return <<'END';
0e57 7
0e58 8
0e59 9
+0ed0 0
0ed1 1
0ed2 2
0ed3 3
@@ -142,6 +155,7 @@ return <<'END';
0ed7 7
0ed8 8
0ed9 9
+0f20 0
0f21 1
0f22 2
0f23 3
@@ -151,6 +165,17 @@ return <<'END';
0f27 7
0f28 8
0f29 9
+0f2a 1/2
+0f2b 3/2
+0f2c 5/2
+0f2d 7/2
+0f2e 9/2
+0f2f 11/2
+0f30 13/2
+0f31 15/2
+0f32 17/2
+0f33 -1/2
+1040 0
1041 1
1042 2
1043 3
@@ -183,6 +208,7 @@ return <<'END';
16ee 17
16ef 18
16f0 19
+17e0 0
17e1 1
17e2 2
17e3 3
@@ -192,6 +218,7 @@ return <<'END';
17e7 7
17e8 8
17e9 9
+1810 0
1811 1
1812 2
1813 3
@@ -201,12 +228,14 @@ return <<'END';
1817 7
1818 8
1819 9
+2070 0
2074 4
2075 5
2076 6
2077 7
2078 8
2079 9
+2080 0
2081 1
2082 2
2083 3
@@ -322,6 +351,7 @@ return <<'END';
2499 18
249a 19
249b 20
+24ea 0
2776 1
2777 2
2778 3
@@ -352,6 +382,7 @@ return <<'END';
2791 8
2792 9
2793 10
+3007 0
3021 1
3022 2
3023 3
@@ -364,6 +395,20 @@ return <<'END';
3038 10
3039 20
303a 30
+3192 1
+3193 2
+3194 3
+3195 4
+3220 1
+3221 2
+3222 3
+3223 4
+3224 5
+3225 6
+3226 7
+3227 8
+3228 9
+3229 10
3280 1
3281 2
3282 3
@@ -374,6 +419,7 @@ return <<'END';
3287 8
3288 9
3289 10
+ff10 0
ff11 1
ff12 2
ff13 3
diff --git a/gnu/usr.bin/perl/lib/unicode/PropList.txt b/gnu/usr.bin/perl/lib/unicode/PropList.txt
new file mode 100644
index 00000000000..e47f1279873
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/PropList.txt
@@ -0,0 +1,3592 @@
+Property dump: UnicodeData-3.0.1.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: 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)
+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)
+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)
+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
+0E47..0E4C (6 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..FA2D (8750 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)
+F0000..FFFFD (65534 chars)
+100000..10FFFD (65534 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)
+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)
+F0000..FFFFD (65534 chars)
+100000..10FFFD (65534 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: 0x8000000A (Not a Character)
+
+FFFE..FFFF (2 chars)
+1FFFE..1FFFF (2 chars)
+2FFFE..2FFFF (2 chars)
+3FFFE..3FFFF (2 chars)
+4FFFE..4FFFF (2 chars)
+5FFFE..5FFFF (2 chars)
+6FFFE..6FFFF (2 chars)
+7FFFE..7FFFF (2 chars)
+8FFFE..8FFFF (2 chars)
+9FFFE..9FFFF (2 chars)
+AFFFE..AFFFF (2 chars)
+BFFFE..BFFFF (2 chars)
+CFFFE..CFFFF (2 chars)
+DFFFE..DFFFF (2 chars)
+EFFFE..EFFFF (2 chars)
+FFFFE..FFFFF (2 chars)
+10FFFE..10FFFF (2 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)
+10000..1FFFD (65534 chars)
+20000..2FFFD (65534 chars)
+30000..3FFFD (65534 chars)
+40000..4FFFD (65534 chars)
+50000..5FFFD (65534 chars)
+60000..6FFFD (65534 chars)
+70000..7FFFD (65534 chars)
+80000..8FFFD (65534 chars)
+90000..9FFFD (65534 chars)
+A0000..AFFFD (65534 chars)
+B0000..BFFFD (65534 chars)
+C0000..CFFFD (65534 chars)
+D0000..DFFFD (65534 chars)
+E0000..EFFFD (65534 chars)
+
diff --git a/gnu/usr.bin/perl/lib/unicode/README.perl b/gnu/usr.bin/perl/lib/unicode/README.perl
new file mode 100644
index 00000000000..2294bd3cc44
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/README.perl
@@ -0,0 +1,37 @@
+The *.txt files were copied 30 Aug 2000 from
+
+ http://www.unicode.org/Public/UNIDATA/
+
+and most of them were renamed to better fit 8.3 filename limitations,
+by which the Perl distribution tries to live.
+
+ www.unicode.org Perl distribution
+
+ ArabicShaping.txt ArabShap.txt
+ BidiMirroring.txt BidiMirr.txt
+ Blocks.txt Blocks.txt
+ CaseFolding.txt CaseFold.txt
+ CompositionExclusions.txt CompExcl.txt
+ EastAsianWidth.txt EAWidth.txt (0)
+ Index.txt Index.txt
+ Jamo.txt Jamo.txt
+ LineBreak.txt LineBrk.txt (0)
+ NamesList.html NamesList.html (0)
+ NamesList.txt Names.txt
+ PropList.txt PropList.txt
+ ReadMe.txt ReadMe.txt
+ SpecialCasing.txt SpecCase.txt
+ UnicodeCharacterDatabase.html UCD301.html
+ UnicodeData.html UCDFF301.html
+ UnicodeData.txt Unicode.301
+
+The two big files, NormalizationTest.txt (1.7MB) and Unihan.txt (15.8MB)
+were not copied for space considerations. The files marked with (0) had
+not been updated since Unicode 3.0.0 (10 Sep 1999)
+
+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/gnu/usr.bin/perl/lib/unicode/ReadMe.txt b/gnu/usr.bin/perl/lib/unicode/ReadMe.txt
index c2c4aee6a5d..b8a643ca271 100644
--- a/gnu/usr.bin/perl/lib/unicode/ReadMe.txt
+++ b/gnu/usr.bin/perl/lib/unicode/ReadMe.txt
@@ -1,45 +1,13 @@
-June 23, 1999
+August 30, 2000
-This directory contains the initial release for Unicode 3.0.
+This directory contains the first update 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.
+Unicode Character Database for the Unicode Standard,
+Version 3.0.1.
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/gnu/usr.bin/perl/lib/unicode/SpecCase.txt b/gnu/usr.bin/perl/lib/unicode/SpecCase.txt
index af002ef4cfa..94662d384f7 100644
--- a/gnu/usr.bin/perl/lib/unicode/SpecCase.txt
+++ b/gnu/usr.bin/perl/lib/unicode/SpecCase.txt
@@ -1,4 +1,4 @@
-# SpecialCasing-2.txt
+# SpecialCasing-3.txt
#
# Special Casing Properties
#
@@ -26,26 +26,33 @@
# <upper> := <code_point_list>
# <code_point_list> := <code_point> (<s>+ <code_point>)*
# <code_point> := <hex><hex><hex><hex>
-# <hex> := [0-1A-Fa-f]
+# <hex> := [0-9A-Fa-f]
# <s> := <space>
#
-# <condition_list> := <locale>? (<s>+ <context>)*
-# <locale> := <ISO_3166_code> ( "_" <ISO_639_code> )? ( "_" <variant> )?
+# <condition_list> := <locale>? (<s>+ <context>)* <sep>
+# <locale> := <ISO_639_code> ( "_" <ISO_3166_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"
+# <context> := "FINAL" | "NON_FINAL" | "MODERN" | "NON_MODERN" | "AFTER_i"
+#
+# A condition list overrides the normal behavior if all of the listed conditions are true.
+# Case distinctions in the condition list are not significant.
#
-# 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.
+# AFTER_i: The last base character was "i" 0069
+#
# 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.
+#
+# Parsers of this file must be prepared to deal future additions to this format:
+# * Additional contexts
+# * Additional fields
# ================================================================================
# ================================================================================
@@ -76,7 +83,7 @@ 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
+0149; 0149; 02BC 004E; 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
@@ -199,7 +206,7 @@ FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH
# 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
+# Note: the following cases are not included, since they would case-fold in lowercasing
# 03C3; 03C2; 03A3; 03A3; FINAL; # GREEK SMALL LETTER SIGMA
# 03C2; 03C3; 03A3; 03A3; NON_FINAL; # GREEK SMALL LETTER FINAL SIGMA
@@ -208,12 +215,16 @@ FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH
# Locale-sensitive mappings
# ================================================================================
+# Lithuanian
+
+0307; 0307; ; ; lt AFTER_i; # Remove DOT ABOVE after "i" with upper or titlecase
+
# Turkish
-0049; 0131; 0049; 0049; TR; # LATIN CAPITAL LETTER I
-0069; 0069; 0130; 0130; TR; # LATIN SMALL LETTER I
+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
+# 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/gnu/usr.bin/perl/lib/unicode/To/Digit.pl b/gnu/usr.bin/perl/lib/unicode/To/Digit.pl
index a96bc1c1a6a..4bace1e6621 100644
--- a/gnu/usr.bin/perl/lib/unicode/To/Digit.pl
+++ b/gnu/usr.bin/perl/lib/unicode/To/Digit.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0030 0039 0000
diff --git a/gnu/usr.bin/perl/lib/unicode/To/Lower.pl b/gnu/usr.bin/perl/lib/unicode/To/Lower.pl
index a78a7e4492a..89755b7c3a5 100644
--- a/gnu/usr.bin/perl/lib/unicode/To/Lower.pl
+++ b/gnu/usr.bin/perl/lib/unicode/To/Lower.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0041 005a 0061
diff --git a/gnu/usr.bin/perl/lib/unicode/To/Title.pl b/gnu/usr.bin/perl/lib/unicode/To/Title.pl
index d8f5c048d4e..cadeaf909b0 100644
--- a/gnu/usr.bin/perl/lib/unicode/To/Title.pl
+++ b/gnu/usr.bin/perl/lib/unicode/To/Title.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0061 007a 0041
diff --git a/gnu/usr.bin/perl/lib/unicode/To/Upper.pl b/gnu/usr.bin/perl/lib/unicode/To/Upper.pl
index 1fc7637753a..d6c03d34bdc 100644
--- a/gnu/usr.bin/perl/lib/unicode/To/Upper.pl
+++ b/gnu/usr.bin/perl/lib/unicode/To/Upper.pl
@@ -1,5 +1,5 @@
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
# Any changes made here will be lost!
return <<'END';
0061 007a 0041
diff --git a/gnu/usr.bin/perl/lib/unicode/UCD301.html b/gnu/usr.bin/perl/lib/unicode/UCD301.html
new file mode 100644
index 00000000000..284349e264e
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/UCD301.html
@@ -0,0 +1,201 @@
+<!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.1</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.1</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">2000-08-17</td>
+ </tr>
+ <tr>
+ <td valign="TOP" width="144">This Version</td>
+ <td valign="TOP"><a
+ href="http://www.unicode.org/Public/3.0-Update1/UnicodeCharacterDatabase-3.0.1.html">http://www.unicode.org/Public/3.0-Update1/UnicodeCharacterDatabase-3.0.1.html</a></td>
+ </tr>
+ <tr>
+ <td valign="TOP" width="144">Previous Version</td>
+ <td valign="TOP"><a
+ href="http://www.unicode.org/Public/3.0-Update/UnicodeCharacterDatabase-3.0.0.html">http://www.unicode.org/Public/3.0-Update/UnicodeCharacterDatabase-3.0.0.html</a></td>
+ </tr>
+ <tr>
+ <td valign="TOP" width="144">Latest Version</td>
+ <td valign="TOP"><a
+ href="http://www.unicode.org/Public/UNIDATA/UnicodeCharacterDatabase.html">http://www.unicode.org/Public/UNIDATA/UnicodeCharacterDatabase.html</a></td>
+ </tr>
+</table>
+<p align="center">Copyright © 1995-2000 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(s) or
+section of Unicode Standard, Version 3.0.</p>
+<p><b>UnicodeData.txt (Chapter 4, <a
+href="http://www.unicode.org/unicode/reports/tr21/">UTR #21: Case Mappings</a>, <a
+href="http://www.unicode.org/unicode/reports/tr15/">UAX #15 Unicode Normalization
+Forms</a>)</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, <a
+href="http://www.unicode.org/unicode/reports/tr21/">UTR #21: Case Mappings</a>)</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/">UAX #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/">UAX
+#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 UAX #14.</li>
+</ul>
+<p><b>EastAsianWidth.txt (<a href="http://www.unicode.org/unicode/reports/tr11/">UAX
+#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>BidiMirroring.txt</b><b> (<a
+href="http://www.unicode.org/unicode/reports/tr9/">UAX #9:&nbsp;The
+Bidirectional Algorithm</a>)</b></p>
+<ul>
+ <li>Informative properties for substituting characters in an implementation of
+ bidirectional mirroring.</li>
+</ul>
+<p><b>CaseFolding.txt (<a href="http://www.unicode.org/unicode/reports/tr21/">UTR
+#21: Case Mappings</a>)</b></p>
+<ul>
+ <li>Informative file mapping characters to their case-folded form.</li>
+</ul>
+<p><b>NormalizationTest.txt (<a
+href="http://www.unicode.org/unicode/reports/tr15/">UAX #15 Unicode Normalization
+Forms</a>)</b></p>
+<ul>
+ <li>Normative test file for conformance to Unicode Normalization Forms.</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/gnu/usr.bin/perl/lib/unicode/UCDFF301.html b/gnu/usr.bin/perl/lib/unicode/UCDFF301.html
new file mode 100644
index 00000000000..a8fbe329dec
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/UCDFF301.html
@@ -0,0 +1,1025 @@
+<html>
+
+<head>
+<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
+<meta name="ProgId" content="FrontPage.Editor.Document">
+<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.1</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.1</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">2000-08-17</td>
+ </tr>
+ <tr>
+ <td valign="TOP" width="144">This Version</td>
+ <td valign="TOP"><a
+ href="http://www.unicode.org/Public/3.0-Update1/UnicodeData-3.0.1.html">http://www.unicode.org/Public/3.0-Update1/UnicodeData-3.0.1.html</a></td>
+ </tr>
+ <tr>
+ <td valign="TOP" width="144">Previous Version</td>
+ <td valign="TOP"><a
+ href="http://www.unicode.org/Public/3.0-Update/UnicodeData-3.0.0.html">http://www.unicode.org/Public/3.0-Update/UnicodeData-3.0.0.html</a></td>
+ </tr>
+ <tr>
+ <td valign="TOP" width="144">Latest Version</td>
+ <td valign="TOP"><a
+ href="http://www.unicode.org/Public/UNIDATA/UnicodeData.html">http://www.unicode.org/Public/UNIDATA/UnicodeData.html</a></td>
+ </tr>
+</table>
+<p align="center">Copyright © 1995-2000 Unicode, Inc. All Rights reserved.<br>
+<i>For more information, including Disclamer and Limitations, see <a
+href="UnicodeCharacterDatabase-3.0.1.html">UnicodeCharacterDatabase-3.0.1.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 <a
+href="UnicodeCharacterDatabase-3.0.1.html">Unicode Character Database</a>, 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 separated 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 nine 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
+ Standard Annex #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 listed as distinct ranges. 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>
+ <li>Plane 15 Private Use Area (U+F0000 - U+FFFFD)</li>
+ <li>Plane 16 Private Use Area (U+100000 - U+10FFFD)</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. For characters in the range U+0000..U+FFFD
+ the code value uses a 4-digit hexadecimal format; for characters in the
+ range U+10000..U+FFFFD the code value uses a 5-digit hexadecimal format;
+ and for characters in the range U+100000..U+10FFFD the code value uses a
+ 6-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">9</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 appears in parentheses
+ in the 10646 names list, or contains an asterisk to mark an Annex P note.</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 Standard Annex #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 Standard Annex
+#15: Unicode 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, <a
+href="http://www.unicode.org/Public/3.0-Update1/">SpecialCasing.txt</a>, 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 http://www.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.1">Unicode
+3.0.1</a></h3>
+<p>Modifications made for Version 3.0.1 of UnicodeData.txt include:
+<ul>
+ <li>Added 5- and 6-digit representation of code points past U+FFFF.</li>
+ <li>Added Private Use range definitions for Planes 15 and 16.</li>
+ <li>Minor additions for the 10646 comment field.</li>
+</ul>
+<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/gnu/usr.bin/perl/lib/unicode/Unicode.301 b/gnu/usr.bin/perl/lib/unicode/Unicode.301
new file mode 100644
index 00000000000..6804a75065b
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicode/Unicode.301
@@ -0,0 +1,10621 @@
+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;;;;;
+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;;;;1/2;N;;;;;
+0F2B;TIBETAN DIGIT HALF TWO;No;0;L;;;;3/2;N;;;;;
+0F2C;TIBETAN DIGIT HALF THREE;No;0;L;;;;5/2;N;;;;;
+0F2D;TIBETAN DIGIT HALF FOUR;No;0;L;;;;7/2;N;;;;;
+0F2E;TIBETAN DIGIT HALF FIVE;No;0;L;;;;9/2;N;;;;;
+0F2F;TIBETAN DIGIT HALF SIX;No;0;L;;;;11/2;N;;;;;
+0F30;TIBETAN DIGIT HALF SEVEN;No;0;L;;;;13/2;N;;;;;
+0F31;TIBETAN DIGIT HALF EIGHT;No;0;L;;;;15/2;N;;;;;
+0F32;TIBETAN DIGIT HALF NINE;No;0;L;;;;17/2;N;;;;;
+0F33;TIBETAN DIGIT HALF ZERO;No;0;L;;;;-1/2;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;;dena sum;;;
+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;;;1;N;KAERITEN ITI;Kaeriten;;;
+3193;IDEOGRAPHIC ANNOTATION TWO MARK;No;0;L;<super> 4E8C;;;2;N;KAERITEN NI;Kaeriten;;;
+3194;IDEOGRAPHIC ANNOTATION THREE MARK;No;0;L;<super> 4E09;;;3;N;KAERITEN SAN;Kaeriten;;;
+3195;IDEOGRAPHIC ANNOTATION FOUR MARK;No;0;L;<super> 56DB;;;4;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;;;1;N;;;;;
+3221;PARENTHESIZED IDEOGRAPH TWO;No;0;L;<compat> 0028 4E8C 0029;;;2;N;;;;;
+3222;PARENTHESIZED IDEOGRAPH THREE;No;0;L;<compat> 0028 4E09 0029;;;3;N;;;;;
+3223;PARENTHESIZED IDEOGRAPH FOUR;No;0;L;<compat> 0028 56DB 0029;;;4;N;;;;;
+3224;PARENTHESIZED IDEOGRAPH FIVE;No;0;L;<compat> 0028 4E94 0029;;;5;N;;;;;
+3225;PARENTHESIZED IDEOGRAPH SIX;No;0;L;<compat> 0028 516D 0029;;;6;N;;;;;
+3226;PARENTHESIZED IDEOGRAPH SEVEN;No;0;L;<compat> 0028 4E03 0029;;;7;N;;;;;
+3227;PARENTHESIZED IDEOGRAPH EIGHT;No;0;L;<compat> 0028 516B 0029;;;8;N;;;;;
+3228;PARENTHESIZED IDEOGRAPH NINE;No;0;L;<compat> 0028 4E5D 0029;;;9;N;;;;;
+3229;PARENTHESIZED IDEOGRAPH TEN;No;0;L;<compat> 0028 5341 0029;;;10;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;;;;;
+F0000;<Plane 15 Private Use, First>;Co;0;L;;;;;N;;;;;
+FFFFD;<Plane 15 Private Use, Last>;Co;0;L;;;;;N;;;;;
+100000;<Plane 16 Private Use, First>;Co;0;L;;;;;N;;;;;
+10FFFD;<Plane 16 Private Use, Last>;Co;0;L;;;;;N;;;;;
diff --git a/gnu/usr.bin/perl/lib/unicode/mktables.PL b/gnu/usr.bin/perl/lib/unicode/mktables.PL
index cef6936b680..5aca93ecef9 100644
--- a/gnu/usr.bin/perl/lib/unicode/mktables.PL
+++ b/gnu/usr.bin/perl/lib/unicode/mktables.PL
@@ -1,28 +1,47 @@
#!../../miniperl
-$UnicodeData = "Unicode.300";
+use bytes;
+
+$UnicodeData = "Unicode.301";
+$SyllableData = "syllables.txt";
+$PropData = "PropList.txt";
+
# 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;
+mkdir "In", 0755;
+mkdir "Is", 0755;
+mkdir "To", 0755;
@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/', ''],
+ # 005F: SPACING UNDERSCROE
+ ['IsWord', '$cat =~ /^[LMN]/ or $code eq "005F"', ''],
+ ['IsAlnum', '$cat =~ /^[LMN]/', ''],
+ ['IsAlpha', '$cat =~ /^[LM]/', ''],
+ # 0009: HORIZONTAL TABULATION
+ # 000A: LINE FEED
+ # 000B: VERTICAL TABULATION
+ # 000C: FORM FEED
+ # 000D: CARRIAGE RETURN
+ # 0020: SPACE
+ ['IsSpace', '$cat =~ /^Z/ ||
+ $code =~ /^(0009|000A|000B|000C|000D)$/', ''],
+ ['IsSpacePerl',
+ '$cat =~ /^Z/ ||
+ $code =~ /^(0009|000A|000C|000D)$/', ''],
+ ['IsBlank', '$code =~ /^(0020|0009)$/ ||
+ $cat =~ /^Z[^lp]$/', ''],
['IsDigit', '$cat =~ /^Nd$/', ''],
- ['IsUpper', '$cat =~ /^Lu$/', ''],
+ ['IsUpper', '$cat =~ /^L[ut]$/', ''],
['IsLower', '$cat =~ /^Ll$/', ''],
- ['IsASCII', 'hex $code <= 127', ''],
+ ['IsASCII', '$code le "007f"', ''],
['IsCntrl', '$cat =~ /^C/', ''],
- ['IsGraph', '$cat =~ /^[^C]/ and $code ne "0020"', ''],
- ['IsPrint', '$cat =~ /^[^C]/', ''],
+ ['IsGraph', '$cat =~ /^([LMNPS]|Co)/', ''],
+ ['IsPrint', '$cat =~ /^([LMNPS]|Co|Zs)/', ''],
['IsPunct', '$cat =~ /^P/', ''],
+ # 003[0-9]: DIGIT ZERO..NINE, 00[46][1-6]: A..F, a..f
['IsXDigit', '$code =~ /^00(3[0-9]|[46][1-6])$/', ''],
['ToUpper', '$up', '$up'],
['ToLower', '$down', '$down'],
@@ -42,12 +61,14 @@ mkdir "To", 0777;
['IsM', '$cat =~ /^M/', ''], # Mark
['IsMn', '$cat eq "Mn"', ''], # Mark, Non-Spacing
['IsMc', '$cat eq "Mc"', ''], # Mark, Combining
+ ['IsMe', '$cat eq "Me"', ''], # Mark, Enclosing
['IsN', '$cat =~ /^N/', ''], # Number
['IsNd', '$cat eq "Nd"', ''], # Number, Decimal Digit
['IsNo', '$cat eq "No"', ''], # Number, Other
+ ['IsNl', '$cat eq "Nl"', ''], # Number, Letter
- ['IsZ', '$cat =~ /^Z/', ''], # Zeparator
+ ['IsZ', '$cat =~ /^Z/', ''], # Separator
['IsZs', '$cat eq "Zs"', ''], # Separator, Space
['IsZl', '$cat eq "Zl"', ''], # Separator, Line
['IsZp', '$cat eq "Zp"', ''], # Separator, Paragraph
@@ -56,6 +77,9 @@ mkdir "To", 0777;
['IsCc', '$cat eq "Cc"', ''], # Other, Control or Format
['IsCo', '$cat eq "Co"', ''], # Other, Private Use
['IsCn', '$cat eq "Cn"', ''], # Other, Not Assigned
+ ['IsCf', '$cat eq "Cf"', ''], # Other, Format
+ ['IsCs', '$cat eq "Cs"', ''], # Other, Surrogate
+ ['IsCn', 'Unassigned Code Value',$PropData], # Other, Not Assigned
# Informative
@@ -71,9 +95,13 @@ mkdir "To", 0777;
['IsPs', '$cat eq "Ps"', ''], # Punctuation, Open
['IsPe', '$cat eq "Pe"', ''], # Punctuation, Close
['IsPo', '$cat eq "Po"', ''], # Punctuation, Other
+ ['IsPc', '$cat eq "Pc"', ''], # Punctuation, Connector
+ ['IsPi', '$cat eq "Pi"', ''], # Punctuation, Initial quote
+ ['IsPf', '$cat eq "Pf"', ''], # Punctuation, Final quote
['IsS', '$cat =~ /^S/', ''], # Symbol
['IsSm', '$cat eq "Sm"', ''], # Symbol, Math
+ ['IsSk', '$cat eq "Sk"', ''], # Symbol, Modifier
['IsSc', '$cat eq "Sc"', ''], # Symbol, Currency
['IsSo', '$cat eq "So"', ''], # Symbol, Other
@@ -94,6 +122,15 @@ mkdir "To", 0777;
# and punctuation specific to
# those scripts
+ ['IsBidiLRE', '$bid eq "LRE"', ''], # Left-to-Right Embedding
+ ['IsBidiLRO', '$bid eq "LRO"', ''], # Left-to-Right Override
+ ['IsBidiAL', '$bid eq "AL"', ''], # Right-to-Left Arabic
+ ['IsBidiRLE', '$bid eq "RLE"', ''], # Right-to-Left Embedding
+ ['IsBidiRLO', '$bid eq "RLO"', ''], # Right-to-Left Override
+ ['IsBidiPDF', '$bid eq "PDF"', ''], # Pop Directional Format
+ ['IsBidiNSM', '$bid eq "NSM"', ''], # Non-Spacing Mark
+ ['IsBidiBN', '$bid eq "BN"', ''], # Boundary Neutral
+
# Weak types:
['IsBidiEN','$bid eq "EN"', ''], # European Number
@@ -122,7 +159,7 @@ mkdir "To", 0777;
['IsDCfont', '$decomp =~ /^<font>/', ''],
['IsDCnoBreak', '$decomp =~ /^<noBreak>/', ''],
['IsDCinitial', '$decomp =~ /^<initial>/', ''],
- ['IsDCinital', '$decomp =~ /^<medial>/', ''],
+ ['IsDCmedial', '$decomp =~ /^<medial>/', ''],
['IsDCfinal', '$decomp =~ /^<final>/', ''],
['IsDCisolated', '$decomp =~ /^<isolated>/', ''],
['IsDCcircle', '$decomp =~ /^<circle>/', ''],
@@ -133,11 +170,12 @@ mkdir "To", 0777;
['IsDCnarrow', '$decomp =~ /^<narrow>/', ''],
['IsDCsmall', '$decomp =~ /^<small>/', ''],
['IsDCsquare', '$decomp =~ /^<square>/', ''],
+ ['IsDCfraction', '$decomp =~ /^<fraction>/', ''],
['IsDCcompat', '$decomp =~ /^<compat>/', ''],
# Number
- ['Number', '$num', '$num'],
+ ['Number', '$num ne ""', '$num'],
# Mirrored
@@ -154,18 +192,41 @@ mkdir "To", 0777;
# 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"', ''],
+ syllable_defs(),
+
+# Line break properties - Normative
+
+ ['IsLbrkBK','$brk eq "BK"', ''], # Mandatory Break
+ ['IsLbrkCR','$brk eq "CR"', ''], # Carriage Return
+ ['IsLbrkLF','$brk eq "LF"', ''], # Line Feed
+ ['IsLbrkCM','$brk eq "CM"', ''], # Attached Characters and Combining Marks
+ ['IsLbrkSG','$brk eq "SG"', ''], # Surrogates
+ ['IsLbrkGL','$brk eq "GL"', ''], # Non-breaking (Glue)
+ ['IsLbrkCB','$brk eq "CB"', ''], # Contingent Break Opportunity
+ ['IsLbrkSP','$brk eq "SP"', ''], # Space
+ ['IsLbrkZW','$brk eq "ZW"', ''], # Zero Width Space
+
+# Line break properties - Informative
+ ['IsLbrkXX','$brk eq "XX"', ''], # Unknown
+ ['IsLbrkOP','$brk eq "OP"', ''], # Opening Punctuation
+ ['IsLbrkCL','$brk eq "CL"', ''], # Closing Punctuation
+ ['IsLbrkQU','$brk eq "QU"', ''], # Ambiguous Quotation
+ ['IsLbrkNS','$brk eq "NS"', ''], # Non Starter
+ ['IsLbrkEX','$brk eq "EX"', ''], # Exclamation/Interrogation
+ ['IsLbrkSY','$brk eq "SY"', ''], # Symbols Allowing Breaks
+ ['IsLbrkIS','$brk eq "IS"', ''], # Infix Separator (Numeric)
+ ['IsLbrkPR','$brk eq "PR"', ''], # Prefix (Numeric)
+ ['IsLbrkPO','$brk eq "PO"', ''], # Postfix (Numeric)
+ ['IsLbrkNU','$brk eq "NU"', ''], # Numeric
+ ['IsLbrkAL','$brk eq "AL"', ''], # Ordinary Alphabetic and Symbol Characters
+ ['IsLbrkID','$brk eq "ID"', ''], # Ideographic
+ ['IsLbrkIN','$brk eq "IN"', ''], # Inseparable
+ ['IsLbrkHY','$brk eq "HY"', ''], # Hyphen
+ ['IsLbrkBB','$brk eq "BB"', ''], # Break Opportunity Before
+ ['IsLbrkBA','$brk eq "BA"', ''], # Break Opportunity After
+ ['IsLbrkSA','$brk eq "SA"', ''], # Complex Context (South East Asian)
+ ['IsLbrkAI','$brk eq "AI"', ''], # Ambiguous (Alphabetic or Ideographic)
+ ['IsLbrkB2','$brk eq "B2"', ''], # Break Opportunity Before and After
);
# This is not written for speed...
@@ -197,8 +258,8 @@ END
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";
+open(UD, 'Blocks.txt') or die "Can't open Blocks.txt: $!\n";
+open(OUT, ">Block.pl") or die "Can't create Block.pl: $!\n";
print OUT <<EOH;
# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
# This file is built by $0 from e.g. $UnicodeData.
@@ -242,6 +303,8 @@ sub proplist {
my $out;
my $split;
+ return listFromPropFile($wanted) if $val eq $PropData;
+
if ($table =~ /^Arab/) {
open(UD, "ArabShap.txt") or warn "Can't open $table: $!";
@@ -253,10 +316,15 @@ sub proplist {
$split = '($code, $short, $name) = split(/; */); $code =~ s/^U\+//;';
}
elsif ($table =~ /^IsSyl/) {
- open(UD, "syllables.txt") or warn "Can't open $table: $!";
+ open(UD, $SyllableData) or warn "Can't open $table: $!";
$split = '($code, $short, $syl) = split(/; */); $code =~ s/^U\+//;';
}
+ elsif ($table =~ /^IsLbrk/) {
+ open(UD, "LineBrk.txt") or warn "Can't open $table: $!";
+
+ $split = '($code, $brk, $name) = split(/;/);';
+ }
else {
open(UD, $UnicodeData) or warn "Can't open $UnicodeData: $!";
@@ -268,8 +336,8 @@ sub proplist {
eval <<"END";
while (<UD>) {
next if /^#/;
- next if /^\s/;
- chop;
+ next if /^\\s/;
+ s/\\s+\$//;
$split
if ($wanted) {
push(\@wanted, [hex \$code, hex $val, \$name =~ /, First>\$/]);
@@ -303,7 +371,7 @@ END
eval <<"END";
while (<UD>) {
next if /^#/;
- next if /^\s*\$/;
+ next if /^\\s*\$/;
chop;
$split
if ($wanted) {
@@ -336,4 +404,44 @@ END
$out;
}
+sub listFromPropFile {
+ my ($wanted) = @_;
+ my $out;
+
+ open (UD, $PropData) or die "Can't open $PropData: $!\n";
+ local($/) = "\n" . '*' x 43 . "\n\nProperty dump for:"; # not 42?
+
+ <UD>;
+ while (<UD>) {
+ chomp;
+ if (s/0x[\d\w]+\s+\((.*?)\)// and $wanted eq $1) {
+ s/\(\d+ chars\)//g;
+ s/^\s+//mg;
+ s/\s+$//mg;
+ s/\.\./\t/g;
+ $out = lc $_;
+ last;
+ }
+ }
+ close (UD);
+ "$out\n";
+}
+
+sub syllable_defs {
+ my @defs;
+ my %seen;
+
+ open (SD, $SyllableData) or die "Can't open $SyllableData: $!\n";
+ while (<SD>) {
+ next if /^\s*(#|$)/;
+ s/\s+$//;
+ ($code, $name, $syl) = split /; */;
+ next unless $syl;
+ push (@defs, ["IsSyl$syl", qq{\$syl eq "$syl"}, ''])
+ unless $seen{$syl}++;
+ }
+ close (SD);
+ return (@defs);
+}
+
# eof
diff --git a/gnu/usr.bin/perl/lib/unicode/syllables.txt b/gnu/usr.bin/perl/lib/unicode/syllables.txt
index 40e946e6d82..bc8bc23681a 100644
--- a/gnu/usr.bin/perl/lib/unicode/syllables.txt
+++ b/gnu/usr.bin/perl/lib/unicode/syllables.txt
@@ -1,1329 +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
+################################################################################
+#
+# 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/gnu/usr.bin/perl/lib/utf8.pm b/gnu/usr.bin/perl/lib/utf8.pm
index 17ec37bbe21..6d6c0eb503e 100644
--- a/gnu/usr.bin/perl/lib/utf8.pm
+++ b/gnu/usr.bin/perl/lib/utf8.pm
@@ -1,5 +1,7 @@
package utf8;
+if (ord('A') != 193) { # make things more pragmatic for EBCDIC folk
+
$utf8::hint_bits = 0x00800000;
sub import {
@@ -13,7 +15,10 @@ sub unimport {
sub AUTOLOAD {
require "utf8_heavy.pl";
- goto &$AUTOLOAD;
+ goto &$AUTOLOAD if defined &$AUTOLOAD;
+ Carp::croak("Undefined subroutine $AUTOLOAD called");
+}
+
}
1;
@@ -44,7 +49,9 @@ 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.
+effectively become a no-op. This pragma already is a no-op on
+EBCDIC platforms (where it is alright to code perl in EBCDIC
+rather than UTF-8).
Enabling the C<utf8> pragma has the following effects:
diff --git a/gnu/usr.bin/perl/lib/warnings.pm b/gnu/usr.bin/perl/lib/warnings.pm
index 11558d50d44..25172393657 100644
--- a/gnu/usr.bin/perl/lib/warnings.pm
+++ b/gnu/usr.bin/perl/lib/warnings.pm
@@ -26,6 +26,14 @@ warnings - Perl pragma to control optional warnings
warnings::warn("void", "some warning");
}
+ if (warnings::enabled($object)) {
+ warnings::warn($object, "some warning");
+ }
+
+ warnif("some warning");
+ warnif("void", "some warning");
+ warnif($object, "some warning");
+
=head1 DESCRIPTION
If no import list is supplied, all possible warnings are either enabled
@@ -37,30 +45,82 @@ A number of functions are provided to assist module authors.
=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.
+Creates a new warnings category with the same name as the package where
+the call to the pragma is used.
+
+=item warnings::enabled()
+
+Use the warnings category with the same name as the current package.
+
+Return TRUE if that warnings category is enabled in the calling module.
+Otherwise returns FALSE.
+
+=item warnings::enabled($category)
+
+Return TRUE if the warnings category, C<$category>, is enabled in the
+calling module.
+Otherwise returns FALSE.
+
+=item warnings::enabled($object)
+
+Use the name of the class for the object reference, C<$object>, as the
+warnings category.
+
+Return TRUE if that warnings category is enabled in the first scope
+where the object is used.
+Otherwise returns FALSE.
+
+=item warnings::warn($message)
+
+Print C<$message> to STDERR.
+
+Use the warnings category with the same name as the current package.
+
+If that warnings category has been set to "FATAL" in the calling module
+then die. Otherwise return.
+
+=item warnings::warn($category, $message)
+
+Print C<$message> to STDERR.
+
+If the warnings category, C<$category>, has been set to "FATAL" in the
+calling module then die. Otherwise return.
+
+=item warnings::warn($object, $message)
-=item warnings::enabled([$category])
+Print C<$message> to STDERR.
-Returns TRUE if the warnings category C<$category> is enabled in the
-calling module. Otherwise returns FALSE.
+Use the name of the class for the object reference, C<$object>, as the
+warnings category.
-If the parameter, C<$category>, isn't supplied, the current package name
-will be used.
+If that warnings category has been set to "FATAL" in the scope where C<$object>
+is first used then die. Otherwise return.
-=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.
+=item warnings::warnif($message)
-If the parameter, C<$category>, isn't supplied, the current package name
-will be used.
+Equivalent to:
+
+ if (warnings::enabled())
+ { warnings::warn($message) }
+
+=item warnings::warnif($category, $message)
+
+Equivalent to:
+
+ if (warnings::enabled($category))
+ { warnings::warn($category, $message) }
+
+=item warnings::warnif($object, $message)
+
+Equivalent to:
+
+ if (warnings::enabled($object))
+ { warnings::warn($object, $message) }
=back
-See L<perlmod/Pragmatic Modules> and L<perllexwarn>.
+See L<perlmodlib/Pragmatic Modules> and L<perllexwarn>.
=cut
@@ -243,44 +303,80 @@ sub bits {
sub import {
shift;
- ${^WARNING_BITS} |= bits(@_ ? @_ : 'all') ;
+ 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') ;
}
sub unimport {
shift;
my $mask = ${^WARNING_BITS} ;
if (vec($mask, $Offsets{'all'}, 1)) {
- $mask = $Bits{'all'} ;
+ $mask |= $Bits{'all'} ;
$mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
}
${^WARNING_BITS} = $mask & ~ (bits(@_ ? @_ : 'all') | $All) ;
}
-sub enabled
+sub __chk
{
- 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 ;
-
+ my $isobj = 0 ;
if (@_) {
# check the category supplied.
$category = shift ;
+ if (ref $category) {
+ croak ("not an object")
+ if $category !~ /^([^=]+)=/ ;+
+ $category = $1 ;
+ $isobj = 1 ;
+ }
$offset = $Offsets{$category};
croak("unknown warnings category '$category'")
unless defined $offset;
}
else {
- $category = (caller(0))[0] ;
+ $category = (caller(1))[0] ;
$offset = $Offsets{$category};
croak("package '$category' not registered for warnings")
unless defined $offset ;
}
+ my $this_pkg = (caller(1))[0] ;
+ my $i = 2 ;
+ my $pkg ;
+
+ if ($isobj) {
+ while (do { { package DB; $pkg = (caller($i++))[0] } } ) {
+ last unless @DB::args && $DB::args[0] =~ /^$category=/ ;
+ }
+ $i -= 2 ;
+ }
+ else {
+ for ($i = 2 ; $pkg = (caller($i))[0] ; ++ $i) {
+ last if $pkg ne $this_pkg ;
+ }
+ $i = 2
+ if !$pkg || $pkg eq $this_pkg ;
+ }
+
+ my $callers_bitmask = (caller($i))[9] ;
+ return ($callers_bitmask, $offset, $i) ;
+}
+
+sub enabled
+{
+ croak("Usage: warnings::enabled([category])")
+ unless @_ == 1 || @_ == 0 ;
+
+ my ($callers_bitmask, $offset, $i) = __chk(@_) ;
+
+ return 0 unless defined $callers_bitmask ;
return vec($callers_bitmask, $offset, 1) ||
vec($callers_bitmask, $Offsets{'all'}, 1) ;
}
@@ -290,29 +386,34 @@ 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 ;
+ my $message = pop ;
+ my ($callers_bitmask, $offset, $i) = __chk(@_) ;
+ local $Carp::CarpLevel = $i ;
croak($message)
if vec($callers_bitmask, $offset+1, 1) ||
vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
carp($message) ;
}
+sub warnif
+{
+ croak("Usage: warnings::warnif([category,] 'message')")
+ unless @_ == 2 || @_ == 1 ;
+
+ my $message = pop ;
+ my ($callers_bitmask, $offset, $i) = __chk(@_) ;
+ local $Carp::CarpLevel = $i ;
+
+ return
+ unless defined $callers_bitmask &&
+ (vec($callers_bitmask, $offset, 1) ||
+ vec($callers_bitmask, $Offsets{'all'}, 1)) ;
+
+ croak($message)
+ if vec($callers_bitmask, $offset+1, 1) ||
+ vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
+
+ carp($message) ;
+}
1;
diff --git a/gnu/usr.bin/perl/lib/warnings/register.pm b/gnu/usr.bin/perl/lib/warnings/register.pm
index da6be979520..f98075a5ee8 100644
--- a/gnu/usr.bin/perl/lib/warnings/register.pm
+++ b/gnu/usr.bin/perl/lib/warnings/register.pm
@@ -1,5 +1,13 @@
package warnings::register ;
+=pod
+
+=head1 NAME
+
+warnings::register - warnings import function
+
+=cut
+
require warnings ;
sub mkMask
diff --git a/gnu/usr.bin/perl/makedef.pl b/gnu/usr.bin/perl/makedef.pl
index e63034beb01..e983967537e 100644
--- a/gnu/usr.bin/perl/makedef.pl
+++ b/gnu/usr.bin/perl/makedef.pl
@@ -51,7 +51,7 @@ while (@ARGV) {
$PLATFORM = $1 if ($flag =~ /^PLATFORM=(\w+)$/);
}
-my @PLATFORM = qw(aix win32 os2);
+my @PLATFORM = qw(aix win32 os2 MacOS);
my %PLATFORM;
@PLATFORM{@PLATFORM} = ();
@@ -77,8 +77,14 @@ elsif ($PLATFORM eq 'win32') {
s!^!..\\!;
}
}
+elsif ($PLATFORM eq 'MacOS') {
+ foreach ($thrdvar_h, $intrpvar_h, $perlvars_h, $global_sym,
+ $pp_sym, $globvar_sym, $perlio_sym) {
+ s!^!::!;
+ }
+}
-unless ($PLATFORM eq 'win32') {
+unless ($PLATFORM eq 'win32' || $PLATFORM eq 'MacOS') {
open(CFG,$config_sh) || die "Cannot open $config_sh: $!\n";
while (<CFG>) {
if (/^(?:ccflags|optimize)='(.+)'$/) {
@@ -99,6 +105,7 @@ while (<CFG>) {
$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+(USE_SFIO)\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/;
@@ -157,7 +164,7 @@ elsif ($PLATFORM eq 'os2') {
# 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'
+DESCRIPTION '\@#perl5-porters\@perl.org:$v#\@ Perl interpreter'
STACKSIZE 32768
CODE LOADONCALL
DATA LOADONCALL NONSHARED MULTIPLE
@@ -259,7 +266,9 @@ elsif ($PLATFORM eq 'aix') {
Perl_safexrealloc
Perl_same_dirent
Perl_unlnk
+ Perl_sys_intern_clear
Perl_sys_intern_dup
+ Perl_sys_intern_init
PL_cryptseen
PL_opsave
PL_statusvalue_vms
@@ -279,6 +288,8 @@ elsif ($PLATFORM eq 'os2') {
my_tmpfile
my_tmpnam
my_flock
+ my_rmdir
+ my_mkdir
malloc_mutex
threads_mutex
nthreads
@@ -309,10 +320,38 @@ elsif ($PLATFORM eq 'os2') {
Perl_hab_GET
)]);
}
+elsif ($PLATFORM eq 'MacOS') {
+ skip_symbols [qw(
+ Perl_GetVars
+ PL_cryptseen
+ PL_cshlen
+ PL_cshname
+ PL_statusvalue_vms
+ PL_sys_intern
+ PL_opsave
+ PL_timesbuf
+ Perl_dump_fds
+ 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_unlnk
+ Perl_sys_intern_clear
+ Perl_sys_intern_init
+ )];
+}
+
unless ($define{'DEBUGGING'}) {
skip_symbols [qw(
- Perl_deb
Perl_deb_growlevel
Perl_debop
Perl_debprofdump
@@ -363,6 +402,8 @@ if ($define{'MYMALLOC'}) {
Perl_mfree
Perl_realloc
Perl_calloc
+ Perl_strdup
+ Perl_putenv
)];
if ($define{'USE_5005THREADS'} || $define{'USE_ITHREADS'}) {
emit_symbols [qw(
@@ -401,6 +442,8 @@ unless ($define{'USE_5005THREADS'}) {
PL_svref_mutex
PL_cred_mutex
PL_eval_mutex
+ PL_fdpid_mutex
+ PL_sv_lock_mutex
PL_eval_cond
PL_eval_owner
PL_threads_mutex
@@ -417,6 +460,7 @@ unless ($define{'USE_5005THREADS'}) {
Perl_find_threadsv
Perl_unlock_condpair
Perl_magic_mutexfree
+ Perl_sv_lock
)];
}
@@ -440,6 +484,8 @@ unless ($define{'USE_ITHREADS'}) {
Perl_ptr_table_new
Perl_ptr_table_split
Perl_ptr_table_store
+ Perl_ptr_table_clear
+ Perl_ptr_table_free
perl_clone
perl_clone_using
)];
@@ -505,7 +551,53 @@ if ($define{'PERL_GLOBAL_STRUCT'}) {
my @syms = ($global_sym, $globvar_sym); # $pp_sym is not part of the API
if ($define{'USE_PERLIO'}) {
- push @syms, $perlio_sym;
+ push @syms, $perlio_sym;
+ if ($define{'USE_SFIO'}) {
+ # SFIO defines most of the PerlIO routines as macros
+ skip_symbols [qw(
+ PerlIO_canset_cnt
+ PerlIO_clearerr
+ PerlIO_close
+ PerlIO_eof
+ PerlIO_error
+ PerlIO_exportFILE
+ PerlIO_fast_gets
+ PerlIO_fdopen
+ PerlIO_fileno
+ PerlIO_findFILE
+ PerlIO_flush
+ PerlIO_get_base
+ PerlIO_get_bufsiz
+ PerlIO_get_cnt
+ PerlIO_get_ptr
+ PerlIO_getc
+ PerlIO_getname
+ PerlIO_has_base
+ PerlIO_has_cntptr
+ PerlIO_importFILE
+ PerlIO_open
+ PerlIO_printf
+ PerlIO_putc
+ PerlIO_puts
+ PerlIO_read
+ PerlIO_releaseFILE
+ PerlIO_reopen
+ PerlIO_rewind
+ PerlIO_seek
+ PerlIO_set_cnt
+ PerlIO_set_ptrcnt
+ PerlIO_setlinebuf
+ PerlIO_sprintf
+ PerlIO_stderr
+ PerlIO_stdin
+ PerlIO_stdout
+ PerlIO_stdoutf
+ PerlIO_tell
+ PerlIO_ungetc
+ PerlIO_vprintf
+ PerlIO_write
+ )];
+ }
}
for my $syms (@syms) {
@@ -729,6 +821,15 @@ elsif ($PLATFORM eq 'os2') {
keys %export;
delete $export{$_} foreach @missing;
}
+elsif ($PLATFORM eq 'MacOS') {
+ open MACSYMS, 'macperl.sym' or die 'Cannot read macperl.sym';
+
+ while (<MACSYMS>) {
+ try_symbol($_);
+ }
+
+ close MACSYMS;
+}
# Now all symbols should be defined because
# next we are going to output them.
@@ -775,7 +876,7 @@ sub output_symbol {
elsif ($PLATFORM eq 'os2') {
print qq( "$symbol"\n);
}
- elsif ($PLATFORM eq 'aix') {
+ elsif ($PLATFORM eq 'aix' || $PLATFORM eq 'MacOS') {
print "$symbol\n";
}
}
diff --git a/gnu/usr.bin/perl/mpeix/relink b/gnu/usr.bin/perl/mpeix/relink
index 625e2f03a5a..a36e23c7508 100644
--- a/gnu/usr.bin/perl/mpeix/relink
+++ b/gnu/usr.bin/perl/mpeix/relink
@@ -4,5 +4,10 @@
# libraries via gcc or ld. For now, re-run gcc without the external library
# list, and then run the native linker with the list of dynamic libraries.
-gcc -o perl perlmain.o lib/auto/DynaLoader/DynaLoader.a libperl.a `cat ext.libs` -L/BIND/PUB/lib -lbind -L/SYSLOG/PUB -lsyslog
-callci 'linkedit "altprog ./perl;xl=/usr/lib/libcurses.sl,/lib/libsvipc.sl,/usr/lib/libsocket.sl,/lib/libm.sl,/lib/libc.sl"'
+gcc -o perl perlmain.o \
+ lib/auto/DynaLoader/DynaLoader.a \
+ libperl.a \
+ `cat ext.libs` \
+ -L/BIND/PUB/lib -lbind \
+ -L/SYSLOG/PUB -lsyslog
+callci 'linkedit "altprog ./perl;xl=/usr/lib/libcurses.sl,/lib/libsvipc.sl,/usr/lib/libsocket.sl,/usr/lib/libstr.sl,/lib/libm.sl,/lib/libc.sl"'
diff --git a/gnu/usr.bin/perl/myconfig.SH b/gnu/usr.bin/perl/myconfig.SH
index 7861f5e0ed1..e80dfb5b5f8 100644
--- a/gnu/usr.bin/perl/myconfig.SH
+++ b/gnu/usr.bin/perl/myconfig.SH
@@ -34,14 +34,14 @@ Summary of my $package (revision $baserev version $PERL_VERSION subversion $PERL
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
+ useperlio=$useperlio d_sfio=$d_sfio uselargefiles=$uselargefiles usesocks=$usesocks
+ use64bitint=$use64bitint use64bitall=$use64bitall uselongdouble=$uselongdouble
Compiler:
- cc='$cc', optimize='$optimize', gccversion=$gccversion
+ cc='$cc', ccflags ='$ccflags',
+ optimize='$optimize',
cppflags='$cppflags'
- ccflags ='$ccflags'
- stdchar='$stdchar', d_stdstdio=$d_stdstdio, usevfork=$usevfork
- intsize=$intsize, longsize=$longsize, ptrsize=$ptrsize, doublesize=$doublesize
+ ccversion='$ccversion', gccversion='$gccversion', gccosandvers='$gccosandvers'
+ intsize=$intsize, longsize=$longsize, ptrsize=$ptrsize, doublesize=$doublesize, byteorder=$byteorder
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
@@ -49,6 +49,7 @@ Summary of my $package (revision $baserev version $PERL_VERSION subversion $PERL
ld='$ld', ldflags ='$ldflags'
libpth=$libpth
libs=$libs
+ perllibs=$perllibs
libc=$libc, so=$so, useshrplib=$useshrplib, libperl=$libperl
Dynamic Linking:
dlsrc=$dlsrc, dlext=$dlext, d_dlsymun=$d_dlsymun, ccdlflags='$ccdlflags'
diff --git a/gnu/usr.bin/perl/objXSUB.h b/gnu/usr.bin/perl/objXSUB.h
index 68c31b0538e..d4ba2a22a97 100644
--- a/gnu/usr.bin/perl/objXSUB.h
+++ b/gnu/usr.bin/perl/objXSUB.h
@@ -35,6 +35,10 @@
#define Perl_Gv_AMupdate pPerl->Perl_Gv_AMupdate
#undef Gv_AMupdate
#define Gv_AMupdate Perl_Gv_AMupdate
+#undef Perl_apply_attrs_string
+#define Perl_apply_attrs_string pPerl->Perl_apply_attrs_string
+#undef apply_attrs_string
+#define apply_attrs_string Perl_apply_attrs_string
#undef Perl_avhv_delete_ent
#define Perl_avhv_delete_ent pPerl->Perl_avhv_delete_ent
#undef avhv_delete_ent
@@ -79,10 +83,6 @@
#define Perl_av_extend pPerl->Perl_av_extend
#undef 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 Perl_av_fake
#undef Perl_av_fetch
#define Perl_av_fetch pPerl->Perl_av_fetch
#undef av_fetch
@@ -228,6 +228,10 @@
#define Perl_fprintf_nocontext pPerl->Perl_fprintf_nocontext
#undef fprintf_nocontext
#define fprintf_nocontext Perl_fprintf_nocontext
+#undef Perl_printf_nocontext
+#define Perl_printf_nocontext pPerl->Perl_printf_nocontext
+#undef printf_nocontext
+#define printf_nocontext Perl_printf_nocontext
#endif
#undef Perl_cv_const_sv
#define Perl_cv_const_sv pPerl->Perl_cv_const_sv
@@ -313,6 +317,10 @@
#endif
#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
#endif
+#undef Perl_do_join
+#define Perl_do_join pPerl->Perl_do_join
+#undef do_join
+#define do_join Perl_do_join
#undef Perl_do_open
#define Perl_do_open pPerl->Perl_do_open
#undef do_open
@@ -423,6 +431,10 @@
#define Perl_gv_efullname3 pPerl->Perl_gv_efullname3
#undef gv_efullname3
#define gv_efullname3 Perl_gv_efullname3
+#undef Perl_gv_efullname4
+#define Perl_gv_efullname4 pPerl->Perl_gv_efullname4
+#undef gv_efullname4
+#define gv_efullname4 Perl_gv_efullname4
#undef Perl_gv_fetchfile
#define Perl_gv_fetchfile pPerl->Perl_gv_fetchfile
#undef gv_fetchfile
@@ -451,6 +463,10 @@
#define Perl_gv_fullname3 pPerl->Perl_gv_fullname3
#undef gv_fullname3
#define gv_fullname3 Perl_gv_fullname3
+#undef Perl_gv_fullname4
+#define Perl_gv_fullname4 pPerl->Perl_gv_fullname4
+#undef gv_fullname4
+#define gv_fullname4 Perl_gv_fullname4
#undef Perl_gv_init
#define Perl_gv_init pPerl->Perl_gv_init
#undef gv_init
@@ -703,6 +719,10 @@
#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_string
+#define Perl_is_utf8_string pPerl->Perl_is_utf8_string
+#undef is_utf8_string
+#define is_utf8_string Perl_is_utf8_string
#undef Perl_is_utf8_alnum
#define Perl_is_utf8_alnum pPerl->Perl_is_utf8_alnum
#undef is_utf8_alnum
@@ -1279,6 +1299,10 @@
#define Perl_rninstr pPerl->Perl_rninstr
#undef rninstr
#define rninstr Perl_rninstr
+#undef Perl_rsignal
+#define Perl_rsignal pPerl->Perl_rsignal
+#undef rsignal
+#define rsignal Perl_rsignal
#if !defined(HAS_RENAME)
#endif
#undef Perl_savepv
@@ -1337,6 +1361,10 @@
#define Perl_save_generic_svref pPerl->Perl_save_generic_svref
#undef save_generic_svref
#define save_generic_svref Perl_save_generic_svref
+#undef Perl_save_generic_pvref
+#define Perl_save_generic_pvref pPerl->Perl_save_generic_pvref
+#undef save_generic_pvref
+#define save_generic_pvref Perl_save_generic_pvref
#undef Perl_save_gp
#define Perl_save_gp pPerl->Perl_save_gp
#undef save_gp
@@ -1389,6 +1417,10 @@
#define Perl_save_long pPerl->Perl_save_long
#undef save_long
#define save_long Perl_save_long
+#undef Perl_save_mortalizesv
+#define Perl_save_mortalizesv pPerl->Perl_save_mortalizesv
+#undef save_mortalizesv
+#define save_mortalizesv Perl_save_mortalizesv
#undef Perl_save_nogv
#define Perl_save_nogv pPerl->Perl_save_nogv
#undef save_nogv
@@ -1409,6 +1441,10 @@
#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_padsv
+#define Perl_save_padsv pPerl->Perl_save_padsv
+#undef save_padsv
+#define save_padsv Perl_save_padsv
#undef Perl_save_sptr
#define Perl_save_sptr pPerl->Perl_save_sptr
#undef save_sptr
@@ -1829,6 +1865,10 @@
#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_length
+#define Perl_utf8_length pPerl->Perl_utf8_length
+#undef utf8_length
+#define utf8_length Perl_utf8_length
#undef Perl_utf8_distance
#define Perl_utf8_distance pPerl->Perl_utf8_distance
#undef utf8_distance
@@ -1837,6 +1877,22 @@
#define Perl_utf8_hop pPerl->Perl_utf8_hop
#undef utf8_hop
#define utf8_hop Perl_utf8_hop
+#undef Perl_utf8_to_bytes
+#define Perl_utf8_to_bytes pPerl->Perl_utf8_to_bytes
+#undef utf8_to_bytes
+#define utf8_to_bytes Perl_utf8_to_bytes
+#undef Perl_bytes_from_utf8
+#define Perl_bytes_from_utf8 pPerl->Perl_bytes_from_utf8
+#undef bytes_from_utf8
+#define bytes_from_utf8 Perl_bytes_from_utf8
+#undef Perl_bytes_to_utf8
+#define Perl_bytes_to_utf8 pPerl->Perl_bytes_to_utf8
+#undef bytes_to_utf8
+#define bytes_to_utf8 Perl_bytes_to_utf8
+#undef Perl_utf8_to_uv_simple
+#define Perl_utf8_to_uv_simple pPerl->Perl_utf8_to_uv_simple
+#undef utf8_to_uv_simple
+#define utf8_to_uv_simple Perl_utf8_to_uv_simple
#undef Perl_utf8_to_uv
#define Perl_utf8_to_uv pPerl->Perl_utf8_to_uv
#undef utf8_to_uv
@@ -1861,8 +1917,11 @@
#define Perl_vwarner pPerl->Perl_vwarner
#undef vwarner
#define vwarner Perl_vwarner
-#if defined(USE_PURE_BISON)
-#else
+#undef Perl_whichsig
+#define Perl_whichsig pPerl->Perl_whichsig
+#undef whichsig
+#define whichsig Perl_whichsig
+#ifdef USE_PURE_BISON
#endif
#if defined(MYMALLOC)
#undef Perl_dump_mstats
@@ -1922,6 +1981,12 @@
#define Perl_runops_debug pPerl->Perl_runops_debug
#undef runops_debug
#define runops_debug Perl_runops_debug
+#if defined(USE_THREADS)
+#undef Perl_sv_lock
+#define Perl_sv_lock pPerl->Perl_sv_lock
+#undef sv_lock
+#define sv_lock Perl_sv_lock
+#endif
#undef Perl_sv_catpvf_mg
#define Perl_sv_catpvf_mg pPerl->Perl_sv_catpvf_mg
#undef sv_catpvf_mg
@@ -2084,6 +2149,14 @@
#define Perl_sv_force_normal pPerl->Perl_sv_force_normal
#undef sv_force_normal
#define sv_force_normal Perl_sv_force_normal
+#undef Perl_sv_add_backref
+#define Perl_sv_add_backref pPerl->Perl_sv_add_backref
+#undef sv_add_backref
+#define sv_add_backref Perl_sv_add_backref
+#undef Perl_sv_del_backref
+#define Perl_sv_del_backref pPerl->Perl_sv_del_backref
+#undef sv_del_backref
+#define sv_del_backref Perl_sv_del_backref
#undef Perl_tmps_grow
#define Perl_tmps_grow pPerl->Perl_tmps_grow
#undef tmps_grow
@@ -2171,6 +2244,24 @@
#define Perl_ptr_table_split pPerl->Perl_ptr_table_split
#undef ptr_table_split
#define ptr_table_split Perl_ptr_table_split
+#undef Perl_ptr_table_clear
+#define Perl_ptr_table_clear pPerl->Perl_ptr_table_clear
+#undef ptr_table_clear
+#define ptr_table_clear Perl_ptr_table_clear
+#undef Perl_ptr_table_free
+#define Perl_ptr_table_free pPerl->Perl_ptr_table_free
+#undef ptr_table_free
+#define ptr_table_free Perl_ptr_table_free
+#endif
+#if defined(HAVE_INTERP_INTERN)
+#undef Perl_sys_intern_clear
+#define Perl_sys_intern_clear pPerl->Perl_sys_intern_clear
+#undef sys_intern_clear
+#define sys_intern_clear Perl_sys_intern_clear
+#undef Perl_sys_intern_init
+#define Perl_sys_intern_init pPerl->Perl_sys_intern_init
+#undef sys_intern_init
+#define sys_intern_init Perl_sys_intern_init
#endif
#if defined(PERL_OBJECT)
#else
diff --git a/gnu/usr.bin/perl/opnames.h b/gnu/usr.bin/perl/opnames.h
index e9f8b4fe6fe..ba28f685fc5 100644
--- a/gnu/usr.bin/perl/opnames.h
+++ b/gnu/usr.bin/perl/opnames.h
@@ -360,3 +360,49 @@ typedef enum opcode {
#define MAXO 351
+
+#define OP_IS_SOCKET(op) \
+ ((op) == OP_ACCEPT || \
+ (op) == OP_BIND || \
+ (op) == OP_CONNECT || \
+ (op) == OP_GETPEERNAME || \
+ (op) == OP_GETSOCKNAME || \
+ (op) == OP_GSOCKOPT || \
+ (op) == OP_LISTEN || \
+ (op) == OP_RECV || \
+ (op) == OP_SEND || \
+ (op) == OP_SHUTDOWN || \
+ (op) == OP_SOCKET || \
+ (op) == OP_SOCKPAIR || \
+ (op) == OP_SSOCKOPT)
+
+
+#define OP_IS_FILETEST(op) \
+ ((op) == OP_FTATIME || \
+ (op) == OP_FTBINARY || \
+ (op) == OP_FTBLK || \
+ (op) == OP_FTCHR || \
+ (op) == OP_FTCTIME || \
+ (op) == OP_FTDIR || \
+ (op) == OP_FTEEXEC || \
+ (op) == OP_FTEOWNED || \
+ (op) == OP_FTEREAD || \
+ (op) == OP_FTEWRITE || \
+ (op) == OP_FTFILE || \
+ (op) == OP_FTIS || \
+ (op) == OP_FTLINK || \
+ (op) == OP_FTMTIME || \
+ (op) == OP_FTPIPE || \
+ (op) == OP_FTREXEC || \
+ (op) == OP_FTROWNED || \
+ (op) == OP_FTRREAD || \
+ (op) == OP_FTRWRITE || \
+ (op) == OP_FTSGID || \
+ (op) == OP_FTSIZE || \
+ (op) == OP_FTSOCK || \
+ (op) == OP_FTSUID || \
+ (op) == OP_FTSVTX || \
+ (op) == OP_FTTEXT || \
+ (op) == OP_FTTTY || \
+ (op) == OP_FTZERO)
+
diff --git a/gnu/usr.bin/perl/os2/OS2/ExtAttr/typemap b/gnu/usr.bin/perl/os2/OS2/ExtAttr/typemap
index a5ff8d63ac3..c2f5cda2ed6 100644
--- a/gnu/usr.bin/perl/os2/OS2/ExtAttr/typemap
+++ b/gnu/usr.bin/perl/os2/OS2/ExtAttr/typemap
@@ -1,2 +1,4 @@
struct _ea * T_PTR
_ead T_PTR
+const void * T_PTR
+const char * T_PV
diff --git a/gnu/usr.bin/perl/os2/OS2/REXX/t/rx_cmprt.t b/gnu/usr.bin/perl/os2/OS2/REXX/t/rx_cmprt.t
index f2113e3aa33..6baec7687d0 100644
--- a/gnu/usr.bin/perl/os2/OS2/REXX/t/rx_cmprt.t
+++ b/gnu/usr.bin/perl/os2/OS2/REXX/t/rx_cmprt.t
@@ -8,11 +8,11 @@ BEGIN {
}
}
-use OS2::REXX;
+use OS2::REXX qw(:DEFAULT register);
$| = 1; # Otherwise data from REXX may come first
-print "1..13\n";
+print "1..16\n";
$n = 1;
sub do_me {
@@ -38,3 +38,11 @@ REXX_eval 'say "ok 10"';
REXX_eval 'say "ok 11"';
print "ok 12\n" if REXX_eval("return 2 + 3") eq 5;
REXX_eval_with 'say myfunc()', myfunc => sub {"ok 13"};
+REXX_eval_with "call myout 'ok' 14", myout => sub {print shift, "\n"};
+REXX_eval_with "say 'ok 'myfunc(3,5)", myfunc => sub {shift() * shift()};
+
+sub MYFUNC1 {shift}
+sub MYFUNC2 {3 * shift}
+REXX_eval_with "call myfunc
+ say 'ok 'myfunc1(1)myfunc2(2)",
+ myfunc => sub { register qw(myfunc1 myfunc2) };
diff --git a/gnu/usr.bin/perl/os2/os2.sym b/gnu/usr.bin/perl/os2/os2.sym
index 685568623ad..3f535e43fcb 100644
--- a/gnu/usr.bin/perl/os2/os2.sym
+++ b/gnu/usr.bin/perl/os2/os2.sym
@@ -9,6 +9,8 @@ dlclose
my_tmpfile
my_tmpnam
my_flock
+my_rmdir
+my_mkdir
malloc_mutex
threads_mutex
nthreads
diff --git a/gnu/usr.bin/perl/os2/os2add.sym b/gnu/usr.bin/perl/os2/os2add.sym
new file mode 100644
index 00000000000..36aab853e9a
--- /dev/null
+++ b/gnu/usr.bin/perl/os2/os2add.sym
@@ -0,0 +1,9 @@
+dlopen
+dlsym
+dlerror
+dlclose
+malloc
+realloc
+free
+calloc
+ctermid
diff --git a/gnu/usr.bin/perl/perlapi.c b/gnu/usr.bin/perl/perlapi.c
index 787c2f220cb..5fc0c4d7679 100644
--- a/gnu/usr.bin/perl/perlapi.c
+++ b/gnu/usr.bin/perl/perlapi.c
@@ -41,6 +41,9 @@ START_EXTERN_C
{ return &(PL_##v); }
#define PERLVARA(v,n,t) PL_##v##_t* Perl_##v##_ptr(pTHXo) \
{ return &(PL_##v); }
+#undef PERLVARIC
+#define PERLVARIC(v,t,i) const t* Perl_##v##_ptr(pTHXo) \
+ { return (const t *)&(PL_##v); }
#include "perlvars.h"
#undef PERLVAR
@@ -82,6 +85,13 @@ Perl_Gv_AMupdate(pTHXo_ HV* stash)
return ((CPerlObj*)pPerl)->Perl_Gv_AMupdate(stash);
}
+#undef Perl_apply_attrs_string
+void
+Perl_apply_attrs_string(pTHXo_ char *stashpv, CV *cv, char *attrstr, STRLEN len)
+{
+ ((CPerlObj*)pPerl)->Perl_apply_attrs_string(stashpv, cv, attrstr, len);
+}
+
#undef Perl_avhv_delete_ent
SV*
Perl_avhv_delete_ent(pTHXo_ AV *ar, SV* keysv, I32 flags, U32 hash)
@@ -159,13 +169,6 @@ 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)
@@ -477,6 +480,8 @@ Perl_sv_setpvf_mg_nocontext(SV* sv, const char* pat, ...)
}
#undef Perl_fprintf_nocontext
+
+#undef Perl_printf_nocontext
#endif
#undef Perl_cv_const_sv
@@ -616,9 +621,9 @@ Perl_dounwind(pTHXo_ I32 cxix)
#undef Perl_do_binmode
int
-Perl_do_binmode(pTHXo_ PerlIO *fp, int iotype, int flag)
+Perl_do_binmode(pTHXo_ PerlIO *fp, int iotype, int mode)
{
- return ((CPerlObj*)pPerl)->Perl_do_binmode(fp, iotype, flag);
+ return ((CPerlObj*)pPerl)->Perl_do_binmode(fp, iotype, mode);
}
#undef Perl_do_close
@@ -632,6 +637,13 @@ Perl_do_close(pTHXo_ GV* gv, bool not_implicit)
#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
#endif
+#undef Perl_do_join
+void
+Perl_do_join(pTHXo_ SV* sv, SV* del, SV** mark, SV** sp)
+{
+ ((CPerlObj*)pPerl)->Perl_do_join(sv, del, mark, sp);
+}
+
#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)
@@ -826,6 +838,13 @@ Perl_gv_efullname3(pTHXo_ SV* sv, GV* gv, const char* prefix)
((CPerlObj*)pPerl)->Perl_gv_efullname3(sv, gv, prefix);
}
+#undef Perl_gv_efullname4
+void
+Perl_gv_efullname4(pTHXo_ SV* sv, GV* gv, const char* prefix, bool keepmain)
+{
+ ((CPerlObj*)pPerl)->Perl_gv_efullname4(sv, gv, prefix, keepmain);
+}
+
#undef Perl_gv_fetchfile
GV*
Perl_gv_fetchfile(pTHXo_ const char* name)
@@ -875,6 +894,13 @@ Perl_gv_fullname3(pTHXo_ SV* sv, GV* gv, const char* prefix)
((CPerlObj*)pPerl)->Perl_gv_fullname3(sv, gv, prefix);
}
+#undef Perl_gv_fullname4
+void
+Perl_gv_fullname4(pTHXo_ SV* sv, GV* gv, const char* prefix, bool keepmain)
+{
+ ((CPerlObj*)pPerl)->Perl_gv_fullname4(sv, gv, prefix, keepmain);
+}
+
#undef Perl_gv_init
void
Perl_gv_init(pTHXo_ GV* gv, HV* stash, const char* name, STRLEN len, int multi)
@@ -1310,12 +1336,19 @@ Perl_to_uni_lower_lc(pTHXo_ U32 c)
}
#undef Perl_is_utf8_char
-int
+STRLEN
Perl_is_utf8_char(pTHXo_ U8 *p)
{
return ((CPerlObj*)pPerl)->Perl_is_utf8_char(p);
}
+#undef Perl_is_utf8_string
+bool
+Perl_is_utf8_string(pTHXo_ U8 *s, STRLEN len)
+{
+ return ((CPerlObj*)pPerl)->Perl_is_utf8_string(s, len);
+}
+
#undef Perl_is_utf8_alnum
bool
Perl_is_utf8_alnum(pTHXo_ U8 *p)
@@ -2206,21 +2239,21 @@ Perl_init_i18nl14n(pTHXo_ int printwarn)
#undef Perl_new_collate
void
-Perl_new_collate(pTHXo_ const char* newcoll)
+Perl_new_collate(pTHXo_ char* newcoll)
{
((CPerlObj*)pPerl)->Perl_new_collate(newcoll);
}
#undef Perl_new_ctype
void
-Perl_new_ctype(pTHXo_ const char* newctype)
+Perl_new_ctype(pTHXo_ char* newctype)
{
((CPerlObj*)pPerl)->Perl_new_ctype(newctype);
}
#undef Perl_new_numeric
void
-Perl_new_numeric(pTHXo_ const char* newcoll)
+Perl_new_numeric(pTHXo_ char* newcoll)
{
((CPerlObj*)pPerl)->Perl_new_numeric(newcoll);
}
@@ -2343,6 +2376,13 @@ Perl_rninstr(pTHXo_ const char* big, const char* bigend, const char* little, con
{
return ((CPerlObj*)pPerl)->Perl_rninstr(big, bigend, little, lend);
}
+
+#undef Perl_rsignal
+Sighandler_t
+Perl_rsignal(pTHXo_ int i, Sighandler_t t)
+{
+ return ((CPerlObj*)pPerl)->Perl_rsignal(i, t);
+}
#if !defined(HAS_RENAME)
#endif
@@ -2444,6 +2484,13 @@ Perl_save_generic_svref(pTHXo_ SV** sptr)
((CPerlObj*)pPerl)->Perl_save_generic_svref(sptr);
}
+#undef Perl_save_generic_pvref
+void
+Perl_save_generic_pvref(pTHXo_ char** str)
+{
+ ((CPerlObj*)pPerl)->Perl_save_generic_pvref(str);
+}
+
#undef Perl_save_gp
void
Perl_save_gp(pTHXo_ GV* gv, I32 empty)
@@ -2535,6 +2582,13 @@ Perl_save_long(pTHXo_ long* longp)
((CPerlObj*)pPerl)->Perl_save_long(longp);
}
+#undef Perl_save_mortalizesv
+void
+Perl_save_mortalizesv(pTHXo_ SV* sv)
+{
+ ((CPerlObj*)pPerl)->Perl_save_mortalizesv(sv);
+}
+
#undef Perl_save_nogv
void
Perl_save_nogv(pTHXo_ GV* gv)
@@ -2570,6 +2624,13 @@ Perl_save_re_context(pTHXo)
((CPerlObj*)pPerl)->Perl_save_re_context();
}
+#undef Perl_save_padsv
+void
+Perl_save_padsv(pTHXo_ PADOFFSET off)
+{
+ ((CPerlObj*)pPerl)->Perl_save_padsv(off);
+}
+
#undef Perl_save_sptr
void
Perl_save_sptr(pTHXo_ SV** sptr)
@@ -2593,28 +2654,28 @@ Perl_save_threadsv(pTHXo_ PADOFFSET i)
#undef Perl_scan_bin
NV
-Perl_scan_bin(pTHXo_ char* start, I32 len, I32* retlen)
+Perl_scan_bin(pTHXo_ char* start, STRLEN len, STRLEN* 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)
+Perl_scan_hex(pTHXo_ char* start, STRLEN len, STRLEN* retlen)
{
return ((CPerlObj*)pPerl)->Perl_scan_hex(start, len, retlen);
}
#undef Perl_scan_num
char*
-Perl_scan_num(pTHXo_ char* s)
+Perl_scan_num(pTHXo_ char* s, YYSTYPE *lvalp)
{
- return ((CPerlObj*)pPerl)->Perl_scan_num(s);
+ return ((CPerlObj*)pPerl)->Perl_scan_num(s, lvalp);
}
#undef Perl_scan_oct
NV
-Perl_scan_oct(pTHXo_ char* start, I32 len, I32* retlen)
+Perl_scan_oct(pTHXo_ char* start, STRLEN len, STRLEN* retlen)
{
return ((CPerlObj*)pPerl)->Perl_scan_oct(start, len, retlen);
}
@@ -3293,20 +3354,27 @@ Perl_unsharepvn(pTHXo_ const char* sv, I32 len, U32 hash)
#undef Perl_utf16_to_utf8
U8*
-Perl_utf16_to_utf8(pTHXo_ U16* p, U8 *d, I32 bytelen)
+Perl_utf16_to_utf8(pTHXo_ U8* p, U8 *d, I32 bytelen, I32 *newlen)
{
- return ((CPerlObj*)pPerl)->Perl_utf16_to_utf8(p, d, bytelen);
+ return ((CPerlObj*)pPerl)->Perl_utf16_to_utf8(p, d, bytelen, newlen);
}
#undef Perl_utf16_to_utf8_reversed
U8*
-Perl_utf16_to_utf8_reversed(pTHXo_ U16* p, U8 *d, I32 bytelen)
+Perl_utf16_to_utf8_reversed(pTHXo_ U8* p, U8 *d, I32 bytelen, I32 *newlen)
{
- return ((CPerlObj*)pPerl)->Perl_utf16_to_utf8_reversed(p, d, bytelen);
+ return ((CPerlObj*)pPerl)->Perl_utf16_to_utf8_reversed(p, d, bytelen, newlen);
+}
+
+#undef Perl_utf8_length
+STRLEN
+Perl_utf8_length(pTHXo_ U8* s, U8 *e)
+{
+ return ((CPerlObj*)pPerl)->Perl_utf8_length(s, e);
}
#undef Perl_utf8_distance
-I32
+IV
Perl_utf8_distance(pTHXo_ U8 *a, U8 *b)
{
return ((CPerlObj*)pPerl)->Perl_utf8_distance(a, b);
@@ -3319,11 +3387,39 @@ Perl_utf8_hop(pTHXo_ U8 *s, I32 off)
return ((CPerlObj*)pPerl)->Perl_utf8_hop(s, off);
}
+#undef Perl_utf8_to_bytes
+U8*
+Perl_utf8_to_bytes(pTHXo_ U8 *s, STRLEN *len)
+{
+ return ((CPerlObj*)pPerl)->Perl_utf8_to_bytes(s, len);
+}
+
+#undef Perl_bytes_from_utf8
+U8*
+Perl_bytes_from_utf8(pTHXo_ U8 *s, STRLEN *len, bool *is_utf8)
+{
+ return ((CPerlObj*)pPerl)->Perl_bytes_from_utf8(s, len, is_utf8);
+}
+
+#undef Perl_bytes_to_utf8
+U8*
+Perl_bytes_to_utf8(pTHXo_ U8 *s, STRLEN *len)
+{
+ return ((CPerlObj*)pPerl)->Perl_bytes_to_utf8(s, len);
+}
+
+#undef Perl_utf8_to_uv_simple
+UV
+Perl_utf8_to_uv_simple(pTHXo_ U8 *s, STRLEN* retlen)
+{
+ return ((CPerlObj*)pPerl)->Perl_utf8_to_uv_simple(s, retlen);
+}
+
#undef Perl_utf8_to_uv
UV
-Perl_utf8_to_uv(pTHXo_ U8 *s, I32* retlen)
+Perl_utf8_to_uv(pTHXo_ U8 *s, STRLEN curlen, STRLEN* retlen, U32 flags)
{
- return ((CPerlObj*)pPerl)->Perl_utf8_to_uv(s, retlen);
+ return ((CPerlObj*)pPerl)->Perl_utf8_to_uv(s, curlen, retlen, flags);
}
#undef Perl_uv_to_utf8
@@ -3366,8 +3462,14 @@ Perl_vwarner(pTHXo_ U32 err, const char* pat, va_list* args)
{
((CPerlObj*)pPerl)->Perl_vwarner(err, pat, args);
}
-#if defined(USE_PURE_BISON)
-#else
+
+#undef Perl_whichsig
+I32
+Perl_whichsig(pTHXo_ char* sig)
+{
+ return ((CPerlObj*)pPerl)->Perl_whichsig(sig);
+}
+#ifdef USE_PURE_BISON
#endif
#if defined(MYMALLOC)
@@ -3474,6 +3576,15 @@ Perl_runops_debug(pTHXo)
{
return ((CPerlObj*)pPerl)->Perl_runops_debug();
}
+#if defined(USE_THREADS)
+
+#undef Perl_sv_lock
+SV*
+Perl_sv_lock(pTHXo_ SV *sv)
+{
+ return ((CPerlObj*)pPerl)->Perl_sv_lock(sv);
+}
+#endif
#undef Perl_sv_catpvf_mg
void
@@ -3772,6 +3883,20 @@ Perl_sv_force_normal(pTHXo_ SV *sv)
((CPerlObj*)pPerl)->Perl_sv_force_normal(sv);
}
+#undef Perl_sv_add_backref
+void
+Perl_sv_add_backref(pTHXo_ SV *tsv, SV *sv)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_add_backref(tsv, sv);
+}
+
+#undef Perl_sv_del_backref
+void
+Perl_sv_del_backref(pTHXo_ SV *sv)
+{
+ ((CPerlObj*)pPerl)->Perl_sv_del_backref(sv);
+}
+
#undef Perl_tmps_grow
void
Perl_tmps_grow(pTHXo_ I32 n)
@@ -3921,6 +4046,36 @@ Perl_ptr_table_split(pTHXo_ PTR_TBL_t *tbl)
{
((CPerlObj*)pPerl)->Perl_ptr_table_split(tbl);
}
+
+#undef Perl_ptr_table_clear
+void
+Perl_ptr_table_clear(pTHXo_ PTR_TBL_t *tbl)
+{
+ ((CPerlObj*)pPerl)->Perl_ptr_table_clear(tbl);
+}
+
+#undef Perl_ptr_table_free
+void
+Perl_ptr_table_free(pTHXo_ PTR_TBL_t *tbl)
+{
+ ((CPerlObj*)pPerl)->Perl_ptr_table_free(tbl);
+}
+#endif
+#if defined(HAVE_INTERP_INTERN)
+
+#undef Perl_sys_intern_clear
+void
+Perl_sys_intern_clear(pTHXo)
+{
+ ((CPerlObj*)pPerl)->Perl_sys_intern_clear();
+}
+
+#undef Perl_sys_intern_init
+void
+Perl_sys_intern_init(pTHXo)
+{
+ ((CPerlObj*)pPerl)->Perl_sys_intern_init();
+}
#endif
#if defined(PERL_OBJECT)
#else
@@ -3998,6 +4153,16 @@ Perl_fprintf_nocontext(PerlIO *stream, const char *format, ...)
return (*PL_StdIO->pVprintf)(PL_StdIO, stream, format, arglist);
}
+#undef Perl_printf_nocontext
+int
+Perl_printf_nocontext(const char *format, ...)
+{
+ dTHXo;
+ va_list(arglist);
+ va_start(arglist, format);
+ return (*PL_StdIO->pVprintf)(PL_StdIO, PerlIO_stdout(), format, arglist);
+}
+
END_EXTERN_C
#endif /* PERL_OBJECT */
diff --git a/gnu/usr.bin/perl/perlapi.h b/gnu/usr.bin/perl/perlapi.h
index 5e5ac2825b0..1f2dc8bfec9 100644
--- a/gnu/usr.bin/perl/perlapi.h
+++ b/gnu/usr.bin/perl/perlapi.h
@@ -130,6 +130,8 @@ START_EXTERN_C
#define PL_basetime (*Perl_Ibasetime_ptr(aTHXo))
#undef PL_beginav
#define PL_beginav (*Perl_Ibeginav_ptr(aTHXo))
+#undef PL_beginav_save
+#define PL_beginav_save (*Perl_Ibeginav_save_ptr(aTHXo))
#undef PL_bitcount
#define PL_bitcount (*Perl_Ibitcount_ptr(aTHXo))
#undef PL_bufend
@@ -194,6 +196,8 @@ START_EXTERN_C
#define PL_doswitches (*Perl_Idoswitches_ptr(aTHXo))
#undef PL_dowarn
#define PL_dowarn (*Perl_Idowarn_ptr(aTHXo))
+#undef PL_dummy1_bincompat
+#define PL_dummy1_bincompat (*Perl_Idummy1_bincompat_ptr(aTHXo))
#undef PL_e_script
#define PL_e_script (*Perl_Ie_script_ptr(aTHXo))
#undef PL_egid
@@ -230,6 +234,8 @@ START_EXTERN_C
#define PL_expect (*Perl_Iexpect_ptr(aTHXo))
#undef PL_fdpid
#define PL_fdpid (*Perl_Ifdpid_ptr(aTHXo))
+#undef PL_fdpid_mutex
+#define PL_fdpid_mutex (*Perl_Ifdpid_mutex_ptr(aTHXo))
#undef PL_filemode
#define PL_filemode (*Perl_Ifilemode_ptr(aTHXo))
#undef PL_forkprocess
@@ -246,6 +252,8 @@ START_EXTERN_C
#define PL_glob_index (*Perl_Iglob_index_ptr(aTHXo))
#undef PL_globalstash
#define PL_globalstash (*Perl_Iglobalstash_ptr(aTHXo))
+#undef PL_he_arenaroot
+#define PL_he_arenaroot (*Perl_Ihe_arenaroot_ptr(aTHXo))
#undef PL_he_root
#define PL_he_root (*Perl_Ihe_root_ptr(aTHXo))
#undef PL_hintgv
@@ -382,12 +390,14 @@ START_EXTERN_C
#define PL_nthreads (*Perl_Inthreads_ptr(aTHXo))
#undef PL_nthreads_cond
#define PL_nthreads_cond (*Perl_Inthreads_cond_ptr(aTHXo))
+#undef PL_nullstash
+#define PL_nullstash (*Perl_Inullstash_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_radix_sv
+#define PL_numeric_radix_sv (*Perl_Inumeric_radix_sv_ptr(aTHXo))
#undef PL_numeric_standard
#define PL_numeric_standard (*Perl_Inumeric_standard_ptr(aTHXo))
#undef PL_ofmt
@@ -490,6 +500,8 @@ START_EXTERN_C
#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_lock_mutex
+#define PL_sv_lock_mutex (*Perl_Isv_lock_mutex_ptr(aTHXo))
#undef PL_sv_mutex
#define PL_sv_mutex (*Perl_Isv_mutex_ptr(aTHXo))
#undef PL_sv_no
@@ -566,26 +578,48 @@ START_EXTERN_C
#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_arenaroot
+#define PL_xnv_arenaroot (*Perl_Ixnv_arenaroot_ptr(aTHXo))
#undef PL_xnv_root
#define PL_xnv_root (*Perl_Ixnv_root_ptr(aTHXo))
+#undef PL_xpv_arenaroot
+#define PL_xpv_arenaroot (*Perl_Ixpv_arenaroot_ptr(aTHXo))
#undef PL_xpv_root
#define PL_xpv_root (*Perl_Ixpv_root_ptr(aTHXo))
+#undef PL_xpvav_arenaroot
+#define PL_xpvav_arenaroot (*Perl_Ixpvav_arenaroot_ptr(aTHXo))
#undef PL_xpvav_root
#define PL_xpvav_root (*Perl_Ixpvav_root_ptr(aTHXo))
+#undef PL_xpvbm_arenaroot
+#define PL_xpvbm_arenaroot (*Perl_Ixpvbm_arenaroot_ptr(aTHXo))
#undef PL_xpvbm_root
#define PL_xpvbm_root (*Perl_Ixpvbm_root_ptr(aTHXo))
+#undef PL_xpvcv_arenaroot
+#define PL_xpvcv_arenaroot (*Perl_Ixpvcv_arenaroot_ptr(aTHXo))
#undef PL_xpvcv_root
#define PL_xpvcv_root (*Perl_Ixpvcv_root_ptr(aTHXo))
+#undef PL_xpvhv_arenaroot
+#define PL_xpvhv_arenaroot (*Perl_Ixpvhv_arenaroot_ptr(aTHXo))
#undef PL_xpvhv_root
#define PL_xpvhv_root (*Perl_Ixpvhv_root_ptr(aTHXo))
+#undef PL_xpviv_arenaroot
+#define PL_xpviv_arenaroot (*Perl_Ixpviv_arenaroot_ptr(aTHXo))
#undef PL_xpviv_root
#define PL_xpviv_root (*Perl_Ixpviv_root_ptr(aTHXo))
+#undef PL_xpvlv_arenaroot
+#define PL_xpvlv_arenaroot (*Perl_Ixpvlv_arenaroot_ptr(aTHXo))
#undef PL_xpvlv_root
#define PL_xpvlv_root (*Perl_Ixpvlv_root_ptr(aTHXo))
+#undef PL_xpvmg_arenaroot
+#define PL_xpvmg_arenaroot (*Perl_Ixpvmg_arenaroot_ptr(aTHXo))
#undef PL_xpvmg_root
#define PL_xpvmg_root (*Perl_Ixpvmg_root_ptr(aTHXo))
+#undef PL_xpvnv_arenaroot
+#define PL_xpvnv_arenaroot (*Perl_Ixpvnv_arenaroot_ptr(aTHXo))
#undef PL_xpvnv_root
#define PL_xpvnv_root (*Perl_Ixpvnv_root_ptr(aTHXo))
+#undef PL_xrv_arenaroot
+#define PL_xrv_arenaroot (*Perl_Ixrv_arenaroot_ptr(aTHXo))
#undef PL_xrv_root
#define PL_xrv_root (*Perl_Ixrv_root_ptr(aTHXo))
#undef PL_yychar
diff --git a/gnu/usr.bin/perl/perly_c.diff b/gnu/usr.bin/perl/perly_c.diff
index 0b73880c4e4..0cfe10f8d7e 100644
--- a/gnu/usr.bin/perl/perly_c.diff
+++ b/gnu/usr.bin/perl/perly_c.diff
@@ -12,7 +12,7 @@
if (yys = getenv("YYDEBUG"))
{
yyn = *yys;
---- 1447,1473 ----
+--- 1447,1476 ----
yyparse()
{
register int yym, yyn, yystate;
@@ -27,6 +27,9 @@
! #endif
+ struct ysv *ysave;
++ #ifdef USE_ITHREADS
++ ENTER; /* force yydestruct() before we return */
++ #endif
+ New(73, ysave, 1, struct ysv);
+ SAVEDESTRUCTOR_X(yydestruct, ysave);
+ ysave->oldyydebug = yydebug;
@@ -42,7 +45,7 @@
yyn = *yys;
***************
*** 1463,1468 ****
---- 1480,1495 ----
+--- 1483,1498 ----
yyerrflag = 0;
yychar = (-1);
@@ -68,7 +71,7 @@
}
*++yyssp = yystate = yytable[yyn];
*++yyvsp = yylval;
---- 1520,1538 ----
+--- 1523,1541 ----
#endif
if (yyssp >= yyss + yystacksize - 1)
{
@@ -97,7 +100,7 @@
}
*++yyssp = yystate = yytable[yyn];
*++yyvsp = yylval;
---- 1573,1591 ----
+--- 1576,1594 ----
#endif
if (yyssp >= yyss + yystacksize - 1)
{
@@ -134,7 +137,7 @@
yyaccept:
! return (0);
}
---- 2524,2569 ----
+--- 2527,2575 ----
#endif
if (yyssp >= yyss + yystacksize - 1)
{
@@ -160,6 +163,9 @@
yyabort:
! retval = 1;
yyaccept:
+! #ifdef USE_ITHREADS
+! LEAVE; /* force yydestruct() before we return */
+! #endif
! return retval;
! }
!
diff --git a/gnu/usr.bin/perl/pod/Makefile.SH b/gnu/usr.bin/perl/pod/Makefile.SH
new file mode 100644
index 00000000000..b8c8c8f24c7
--- /dev/null
+++ b/gnu/usr.bin/perl/pod/Makefile.SH
@@ -0,0 +1,167 @@
+case $CONFIG 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 config.sh."; 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
+
+if test -d pod; then
+ cd pod || exit 1
+fi
+POD=`echo *.pod`
+MAN=`echo $POD|sed 's/\.pod/\.man/g'`
+HTML=`echo $POD|sed 's/perltoc.pod//'|sed 's/\.pod/\.html/g'`
+TEX=`echo $POD|sed 's/\.pod/\.tex/g'`
+
+echo "Extracting pod/Makefile (with variable substitutions)"
+: This section of the file will have variable substitutions done on it.
+: Move anything that needs config subs from !NO!SUBS! section to !GROK!THIS!.
+: Protect any dollar signs and backticks that you do not want interpreted
+: by putting a backslash in front. You may delete these comments.
+
+$spitshell >Makefile <<!GROK!THIS!
+# pod/Makefile
+# This file is derived from pod/Makefile.SH. Any changes made here will
+# be lost the next time you run Configure.
+
+POD = $POD
+
+MAN = $MAN
+
+# no perltoc.html
+HTML = $HTML
+
+TEX = $TEX
+
+!GROK!THIS!
+
+## In the following dollars and backticks do not need the extra backslash.
+$spitshell >>Makefile <<'!NO!SUBS!'
+
+CONVERTERS = pod2html pod2latex pod2man pod2text checkpods \
+ pod2usage podchecker podselect
+
+HTMLROOT = / # Change this to fix cross-references in HTML
+POD2HTML = pod2html \
+ --htmlroot=$(HTMLROOT) \
+ --podroot=.. --podpath=pod:lib:ext:vms \
+ --libpods=perlfunc:perlguts:perlvar:perlrun:perlop
+
+PERL = ../miniperl
+PERLILIB = $(PERL) -I../lib
+REALPERL = ../perl
+
+all: $(CONVERTERS) man
+
+converters: $(CONVERTERS)
+
+regen_pods: perlmodlib.pod toc
+
+buildtoc: buildtoc.PL perl.pod ../MANIFEST
+ $(PERLILIB) buildtoc.PL
+
+perltoc.pod: buildtoc
+
+man: pod2man $(MAN)
+
+html: pod2html $(HTML)
+
+tex: pod2latex $(TEX)
+
+toc: buildtoc
+ $(PERLILIB) buildtoc
+
+.SUFFIXES: .pm .pod
+
+.SUFFIXES: .man
+
+.pm.man: pod2man
+ $(PERL) -I../lib pod2man $*.pm >$*.man
+
+.pod.man: pod2man
+ $(PERL) -I../lib pod2man $*.pod >$*.man
+
+.SUFFIXES: .html
+
+.pm.html: pod2html
+ $(PERL) -I../lib $(POD2HTML) --infile=$*.pm --outfile=$*.html
+
+.pod.html: pod2html
+ $(PERL) -I../lib $(POD2HTML) --infile=$*.pod --outfile=$*.html
+
+.SUFFIXES: .tex
+
+.pm.tex: pod2latex
+ $(PERL) -I../lib pod2latex $*.pm
+
+.pod.tex: pod2latex
+ $(PERL) -I../lib pod2latex $*.pod
+
+clean:
+ rm -f $(MAN)
+ rm -f $(HTML)
+ rm -f $(TEX)
+ rm -f pod2html-*cache
+ rm -f *.aux *.log *.exe
+
+realclean: clean
+ rm -f $(CONVERTERS)
+
+distclean: realclean
+
+veryclean: distclean
+ -rm -f *~ *.orig
+
+check: checkpods
+ @echo "checking..."; \
+ $(PERL) -I../lib checkpods $(POD)
+
+# Dependencies.
+pod2latex: pod2latex.PL ../lib/Config.pm
+ $(PERL) -I../lib pod2latex.PL
+
+pod2html: pod2html.PL ../lib/Config.pm
+ $(PERL) -I ../lib pod2html.PL
+
+pod2man: pod2man.PL ../lib/Config.pm
+ $(PERL) -I ../lib pod2man.PL
+
+pod2text: pod2text.PL ../lib/Config.pm
+ $(PERL) -I ../lib pod2text.PL
+
+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
+
+perlmodlib.pod: $(PERL) perlmodlib.PL ../mv-if-diff
+ rm -f perlmodlib.tmp
+ $(PERL) -I ../lib perlmodlib.PL
+ sh ../mv-if-diff perlmodlib.tmp perlmodlib.pod
+
+compile: all
+ $(REALPERL) -I../lib ../utils/perlcc -o pod2latex.exe pod2latex -log ../compilelog
+ $(REALPERL) -I../lib ../utils/perlcc -o pod2man.exe pod2man -log ../compilelog
+ $(REALPERL) -I../lib ../utils/perlcc -o pod2text.exe pod2text -log ../compilelog
+ $(REALPERL) -I../lib ../utils/perlcc -o checkpods.exe checkpods -log ../compilelog
+
+!NO!SUBS!
diff --git a/gnu/usr.bin/perl/pod/buildtoc.PL b/gnu/usr.bin/perl/pod/buildtoc.PL
new file mode 100644
index 00000000000..7c5a45018e8
--- /dev/null
+++ b/gnu/usr.bin/perl/pod/buildtoc.PL
@@ -0,0 +1,492 @@
+#!/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!';
+
+#
+# buildtoc
+#
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is autogenerated by buildtoc.PL.
+# Edit that file and run it to effect changes.
+#
+# Builds perltoc.pod and sanity checks the list of pods against all
+# of the MANIFEST, perl.pod, and ourselves.
+#
+
+use File::Find;
+use Cwd;
+use Text::Wrap;
+
+@PODS = glob("*.pod");
+
+sub output ($);
+
+if (-d "pod") {
+ die "$0: failed to chdir('pod'): $!\n" unless chdir("pod");
+}
+
+@pods = qw(
+ perl
+ perlfaq
+ perltoc
+ perlbook
+
+ perlsyn
+ perldata
+ perlop
+ perlsub
+ perlfunc
+ perlreftut
+ perldsc
+ perlrequick
+ perlpod
+ perlstyle
+ perltrap
+
+ perlrun
+ perldiag
+ perllexwarn
+ perldebtut
+ perldebug
+
+ perlvar
+ perllol
+ perlopentut
+ perlretut
+
+ perlre
+ perlref
+
+ perlform
+
+ perlboot
+ perltoot
+ perltootc
+ perlobj
+ perlbot
+ perltie
+
+ perlipc
+ perlfork
+ perlnumber
+ perlthrtut
+
+ perlport
+ perllocale
+ perlunicode
+ perlebcdic
+
+ perlsec
+
+ perlmod
+ perlmodlib
+ perlmodinstall
+ perlnewmod
+
+ perlfaq1
+ perlfaq2
+ perlfaq3
+ perlfaq4
+ perlfaq5
+ perlfaq6
+ perlfaq7
+ perlfaq8
+ perlfaq9
+
+ perlcompile
+
+ perlembed
+ perldebguts
+ perlxstut
+ perlxs
+ perlclib
+ perlguts
+ perlcall
+ perlutil
+ perlfilter
+ perldbmfilter
+ perlapi
+ perlintern
+ perlapio
+ perltodo
+ perlhack
+
+ perlhist
+ perldelta
+ perl5005delta
+ perl5004delta
+
+ perlaix
+ perlamiga
+ perlbs2000
+ perlcygwin
+ perldos
+ perlepoc
+ perlhpux
+ perlmachten
+ perlmacos
+ perlmpeix
+ perlos2
+ perlos390
+ perlsolaris
+ perlvmesa
+ perlvms
+ perlvos
+ perlwin32
+ );
+
+@ARCHPODS = qw(
+ perlaix
+ perlamiga
+ perlbs2000
+ perlcygwin
+ perldos
+ perlepoc
+ perlhpux
+ perlmachten
+ perlmacos
+ perlmpeix
+ perlos2
+ perlos390
+ perlsolaris
+ perlvmesa
+ perlvms
+ perlvos
+ perlwin32
+ );
+for (@ARCHPODS) { s/$/.pod/ }
+@ARCHPODS{@ARCHPODS} = ();
+
+for (@pods) { s/$/.pod/ }
+@pods{@pods} = ();
+@PODS{@PODS} = ();
+
+open(MANI, "../MANIFEST") || die "$0: opening ../MANIFEST failed: $!";
+while (<MANI>) {
+ if (m!^pod/([^.]+\.pod)\s+!i) {
+ push @MANIPODS, $1;
+ }
+}
+close(MANI);
+@MANIPODS{@MANIPODS} = ();
+
+open(PERLPOD, "perl.pod") || die "$0: opening perl.pod failed: $!\n";
+while (<PERLPOD>) {
+ if (/^For ease of access, /../^\(If you're intending /) {
+ if (/^\s+(perl\S*)\s+\w/) {
+ push @PERLPODS, "$1.pod";
+ }
+ }
+}
+close(PERLPOD);
+die "$0: could not find the pod listing of perl.pod\n"
+ unless @PERLPODS;
+@PERLPODS{@PERLPODS} = ();
+
+# Cross-check against ourselves
+# Cross-check against the MANIFEST
+# Cross-check against the perl.pod
+
+foreach my $i (sort keys %PODS) {
+ warn "$0: $i exists but is unknown by buildtoc\n"
+ unless exists $pods{$i};
+ warn "$0: $i exists but is unknown by ../MANIFEST\n"
+ if !exists $MANIPODS{$i} && !exists $ARCHPODS{$i};
+ warn "$0: $i exists but is unknown by perl.pod\n"
+ unless exists $PERLPODS{$i};
+}
+foreach my $i (sort keys %pods) {
+ warn "$0: $i is known by buildtoc but does not exist\n"
+ unless exists $PODS{$i};
+}
+foreach my $i (sort keys %MANIPODS) {
+ warn "$0: $i is known by ../MANIFEST but does not exist\n"
+ unless exists $PODS{$i};
+}
+foreach my $i (sort keys %PERLPODS) {
+ warn "$0: $i is known by perl.pod but does not exist\n"
+ unless exists $PODS{$i};
+}
+
+# We are ready to rock.
+open(OUT, ">perltoc.pod") || die "$0: creating perltoc.pod failed: $!";
+
+$/ = '';
+@ARGV = @pods;
+
+($_= <<EOPOD2B) =~ s/^\t//gm && output($_);
+
+ =head1 NAME
+
+ perltoc - perl documentation table of contents
+
+ =head1 DESCRIPTION
+
+ This page provides a brief table of contents for the rest of the Perl
+ documentation set. It is meant to be scanned quickly or grepped
+ through to locate the proper section you're looking for.
+
+ =head1 BASIC DOCUMENTATION
+
+EOPOD2B
+#' make emacs happy
+
+podset(@pods);
+
+find \&getpods => qw(../lib ../ext);
+
+sub getpods {
+ if (/\.p(od|m)$/) {
+ # Skip .pm files that have corresponding .pod files, and Functions.pm.
+ return if /(.*)\.pm$/ && -f "$1.pod";
+ my $file = $File::Find::name;
+ return if $file eq '../lib/Pod/Functions.pm'; # Used only by pod itself
+
+ die "tut $name" if $file =~ /TUT/;
+ unless (open (F, "< $_\0")) {
+ warn "bogus <$file>: $!";
+ system "ls", "-l", $file;
+ }
+ else {
+ my $line;
+ while ($line = <F>) {
+ if ($line =~ /^=head1\s+NAME\b/) {
+ push @modpods, $file;
+ #warn "GOOD $file\n";
+ return;
+ }
+ }
+ warn "$0: $file: cannot find =head1 NAME\n";
+ }
+ }
+}
+
+die "no pods" unless @modpods;
+
+for (@modpods) {
+ #($name) = /(\w+)\.p(m|od)$/;
+ $name = path2modname($_);
+ if ($name =~ /^[a-z]/) {
+ push @pragmata, $_;
+ } else {
+ if ($done{$name}++) {
+ # warn "already did $_\n";
+ next;
+ }
+ push @modules, $_;
+ push @modname, $name;
+ }
+}
+
+($_= <<EOPOD2B) =~ s/^\t//gm && output($_);
+
+
+
+ =head1 PRAGMA DOCUMENTATION
+
+EOPOD2B
+
+podset(sort @pragmata);
+
+($_= <<EOPOD2B) =~ s/^\t//gm && output($_);
+
+
+
+ =head1 MODULE DOCUMENTATION
+
+EOPOD2B
+
+podset( @modules[ sort { $modname[$a] cmp $modname[$b] } 0 .. $#modules ] );
+
+($_= <<EOPOD2B) =~ s/^\t//gm;
+
+
+ =head1 AUXILIARY DOCUMENTATION
+
+ Here should be listed all the extra programs' documentation, but they
+ don't all have manual pages yet:
+
+ =over 4
+
+ =item a2p
+
+ =item s2p
+
+ =item find2perl
+
+ =item h2ph
+
+ =item c2ph
+
+ =item h2xs
+
+ =item xsubpp
+
+ =item pod2man
+
+ =item wrapsuid
+
+ =back
+
+ =head1 AUTHOR
+
+ Larry Wall <F<larry\@wall.org>>, with the help of oodles
+ of other folks.
+
+
+EOPOD2B
+output $_;
+output "\n"; # flush $LINE
+exit;
+
+sub podset {
+ local @ARGV = @_;
+
+ while(<>) {
+ if (s/^=head1 (NAME)\s*/=head2 /) {
+ $pod = path2modname($ARGV);
+ unhead1();
+ output "\n \n\n=head2 ";
+ $_ = <>;
+ if ( /^\s*$pod\b/ ) {
+ s/$pod\.pm/$pod/; # '.pm' in NAME !?
+ output $_;
+ } else {
+ s/^/$pod, /;
+ output $_;
+ }
+ next;
+ }
+ if (s/^=head1 (.*)/=item $1/) {
+ unhead2();
+ output "=over 4\n\n" unless $inhead1;
+ $inhead1 = 1;
+ output $_; nl(); next;
+ }
+ if (s/^=head2 (.*)/=item $1/) {
+ unitem();
+ output "=over 4\n\n" unless $inhead2;
+ $inhead2 = 1;
+ output $_; nl(); next;
+ }
+ if (s/^=item ([^=].*)/$1/) {
+ next if $pod eq 'perldiag';
+ s/^\s*\*\s*$// && next;
+ s/^\s*\*\s*//;
+ s/\n/ /g;
+ s/\s+$//;
+ next if /^[\d.]+$/;
+ next if $pod eq 'perlmodlib' && /^ftp:/;
+ ##print "=over 4\n\n" unless $initem;
+ output ", " if $initem;
+ $initem = 1;
+ s/\.$//;
+ s/^-X\b/-I<X>/;
+ output $_; next;
+ }
+ if (s/^=cut\s*\n//) {
+ unhead1();
+ next;
+ }
+ }
+}
+
+sub path2modname {
+ local $_ = shift;
+ s/\.p(m|od)$//;
+ s-.*?/(lib|ext)/--;
+ s-/-::-g;
+ s/(\w+)::\1/$1/;
+ 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;
+}
+
+sub unitem {
+ if ($initem) {
+ output "\n\n";
+ ##print "\n\n=back\n\n";
+ }
+ $initem = 0;
+}
+
+sub nl {
+ output "\n";
+}
+
+my $NEWLINE; # how many newlines have we seen recently
+my $LINE; # what remains to be printed
+
+sub output ($) {
+ for (split /(\n)/, shift) {
+ if ($_ eq "\n") {
+ if ($LINE) {
+ print OUT wrap('', '', $LINE);
+ $LINE = '';
+ }
+ if ($NEWLINE < 2) {
+ print OUT;
+ $NEWLINE++;
+ }
+ }
+ elsif (/\S/ && length) {
+ $LINE .= $_;
+ $NEWLINE = 0;
+ }
+ }
+}
+
+!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/gnu/usr.bin/perl/pod/perl5004delta.pod b/gnu/usr.bin/perl/pod/perl5004delta.pod
index 85a8f96161b..429cba93ced 100644
--- a/gnu/usr.bin/perl/pod/perl5004delta.pod
+++ b/gnu/usr.bin/perl/pod/perl5004delta.pod
@@ -24,7 +24,10 @@ problems. See the F<Changes> file in the distribution for details.
C<%ENV = ()> and C<%ENV = @list> now work as expected (except on VMS
where it generates a fatal error).
-=head2 "Can't locate Foo.pm in @INC" error now lists @INC
+=head2 Change to "Can't locate Foo.pm in @INC" error
+
+The error "Can't locate Foo.pm in @INC" now lists the contents of @INC
+for easier debugging.
=head2 Compilation option: Binary compatibility with 5.003
@@ -198,7 +201,7 @@ hole was just plugged.
The new restrictions when tainting include:
-=over
+=over 4
=item No glob() or <*>
@@ -258,7 +261,7 @@ the F<INSTALL> file for how to use it.
=head2 New and changed syntax
-=over
+=over 4
=item $coderef->(PARAMS)
@@ -276,7 +279,7 @@ S<C<< $table->{FOO}->($bar) >>>.
=head2 New and changed builtin constants
-=over
+=over 4
=item __PACKAGE__
@@ -289,7 +292,7 @@ into strings.
=head2 New and changed builtin variables
-=over
+=over 4
=item $^E
@@ -322,7 +325,7 @@ there is no C<use English> long name for this variable.
=head2 New and changed builtin functions
-=over
+=over 4
=item delete on slices
@@ -544,7 +547,7 @@ subroutine:
The C<UNIVERSAL> package automatically contains the following methods that
are inherited by all other classes:
-=over
+=over 4
=item isa(CLASS)
@@ -593,7 +596,7 @@ have C<isa> available as a plain subroutine in the current package.
See L<perltie> for other kinds of tie()s.
-=over
+=over 4
=item TIEHANDLE classname, LIST
@@ -687,7 +690,7 @@ install the optional module Devel::Peek.)
Three new compilation flags are recognized by malloc.c. (They have no
effect if perl is compiled with system malloc().)
-=over
+=over 4
=item -DPERL_EMERGENCY_SBRK
@@ -779,7 +782,7 @@ See F<README.amigaos> in the perl distribution.
Six new pragmatic modules exist:
-=over
+=over 4
=item use autouse MODULE => qw(sub1 sub2 sub3)
@@ -810,7 +813,7 @@ builtin operations.
When C<use locale> is in effect, the current LC_CTYPE locale is used
for regular expressions and case mapping; LC_COLLATE for string
-ordering; and LC_NUMERIC for numeric formating in printf and sprintf
+ordering; and LC_NUMERIC for numeric formatting in printf and sprintf
(but B<not> in print). LC_NUMERIC is always used in write, since
lexical scoping of formats is problematic at best.
@@ -979,7 +982,7 @@ those who need trigonometric functions only for real numbers.
There have been quite a few changes made to DB_File. Here are a few of
the highlights:
-=over
+=over 4
=item *
@@ -1045,7 +1048,7 @@ For example, you can now say
=head2 pod2html
-=over
+=over 4
=item Sends converted HTML to standard output
@@ -1058,7 +1061,7 @@ Use the B<--outfile=FILENAME> option to write to a file.
=head2 xsubpp
-=over
+=over 4
=item C<void> XSUBs now default to returning nothing
@@ -1083,7 +1086,7 @@ XSUB's return type is really C<SV *>.
=head1 C Language API Changes
-=over
+=over 4
=item C<gv_fetchmethod> and C<perl_call_sv>
@@ -1124,7 +1127,7 @@ which can be more efficient. See L<perlguts> for details.
Many of the base and library pods were updated. These
new pods are included in section 1:
-=over
+=over 4
=item L<perldelta>
@@ -1177,7 +1180,7 @@ increasing order of desperation):
(X) A very fatal error (nontrappable).
(A) An alien error message (not generated by Perl).
-=over
+=over 4
=item "my" variable %s masks earlier declaration in same scope
@@ -1429,7 +1432,7 @@ assigning to it and when evaluating its argument, while C<@foo{&bar}> behaves
like a list when you assign to it, and provides a list context to its
subscript, which can do weird things if you're expecting only one subscript.
-=item Stub found while resolving method `%s' overloading `%s' in package `%s'
+=item Stub found while resolving method `%s' overloading `%s' in %s
(P) Overloading resolution over @ISA tree may be broken by importing stubs.
Stubs should never be implicitly created, but explicit calls to C<can>
diff --git a/gnu/usr.bin/perl/pod/perl5005delta.pod b/gnu/usr.bin/perl/pod/perl5005delta.pod
index b133c0dd813..78bf90f616b 100644
--- a/gnu/usr.bin/perl/pod/perl5005delta.pod
+++ b/gnu/usr.bin/perl/pod/perl5005delta.pod
@@ -63,11 +63,15 @@ the new features in this release.
=over 4
-=item Core sources now require ANSI C compiler
+=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
+=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
@@ -87,7 +91,9 @@ support may cease in a future release.
See L<perlguts/"API LISTING">.
-=item Enabling threads has source compatibility issues
+=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.
@@ -525,7 +531,7 @@ The hints files for most Unix platforms have seen incremental improvements.
=head2 New Modules
-=over
+=over 4
=item B
@@ -596,13 +602,15 @@ Various pragmata to control behavior of regular expressions.
=head2 Changes in existing modules
-=over
+=over 4
=item Benchmark
You can now run tests for I<x> seconds instead of guessing the right
number of tests to run.
+Keeps better time.
+
=item Carp
Carp has a new function cluck(). cluck() warns, like carp(), but also adds
@@ -660,10 +668,6 @@ See <perlmodinstall> and L<CPAN>.
Cwd::cwd is faster on most platforms.
-=item Benchmark
-
-Keeps better time.
-
=back
=head1 Utility Changes
@@ -702,7 +706,7 @@ L<perlthrtut> gives a tutorial on threads.
=head1 New Diagnostics
-=over
+=over 4
=item Ambiguous call resolved as CORE::%s(), qualify as such or use &
@@ -859,7 +863,7 @@ 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'
+=item Recursive inheritance detected while looking for method '%s' %s
(F) More than 100 levels of inheritance were encountered while invoking a
method. Probably indicates an unintended loop in your inheritance hierarchy.
@@ -916,7 +920,7 @@ fix the problem can be found in L<perllocale/"LOCALE PROBLEMS">.
=head1 Obsolete Diagnostics
-=over
+=over 4
=item Can't mktemp()
diff --git a/gnu/usr.bin/perl/pod/perlapi.pod b/gnu/usr.bin/perl/pod/perlapi.pod
index e0ae4cfb581..67009d0fad4 100644
--- a/gnu/usr.bin/perl/pod/perlapi.pod
+++ b/gnu/usr.bin/perl/pod/perlapi.pod
@@ -25,6 +25,9 @@ Same as C<av_len()>. Deprecated, use C<av_len()> instead.
int AvFILL(AV* av)
+=for hackers
+Found in file av.h
+
=item av_clear
Clears an array, making it empty. Does not free the memory used by the
@@ -32,6 +35,31 @@ array itself.
void av_clear(AV* ar)
+=for hackers
+Found in file av.c
+
+=item av_delete
+
+Deletes the element indexed by C<key> from the array. Returns the
+deleted element. C<flags> is currently ignored.
+
+ SV* av_delete(AV* ar, I32 key, I32 flags)
+
+=for hackers
+Found in file av.c
+
+=item av_exists
+
+Returns true if the element indexed by C<key> has been initialized.
+
+This relies on the fact that uninitialized array elements are set to
+C<&PL_sv_undef>.
+
+ bool av_exists(AV* ar, I32 key)
+
+=for hackers
+Found in file av.c
+
=item av_extend
Pre-extend an array. The C<key> is the index to which the array should be
@@ -39,6 +67,9 @@ extended.
void av_extend(AV* ar, I32 key)
+=for hackers
+Found in file av.c
+
=item av_fetch
Returns the SV at the specified index in the array. The C<key> is the
@@ -50,6 +81,19 @@ more information on how to use this function on tied arrays.
SV** av_fetch(AV* ar, I32 key, I32 lval)
+=for hackers
+Found in file av.c
+
+=item av_fill
+
+Ensure than an array has a given number of elements, equivalent to
+Perl's C<$#array = $fill;>.
+
+ void av_fill(AV* ar, I32 fill)
+
+=for hackers
+Found in file av.c
+
=item av_len
Returns the highest index in the array. Returns -1 if the array is
@@ -57,6 +101,9 @@ empty.
I32 av_len(AV* ar)
+=for hackers
+Found in file av.c
+
=item av_make
Creates a new AV and populates it with a list of SVs. The SVs are copied
@@ -65,6 +112,9 @@ will have a reference count of 1.
AV* av_make(I32 size, SV** svp)
+=for hackers
+Found in file av.c
+
=item av_pop
Pops an SV off the end of the array. Returns C<&PL_sv_undef> if the array
@@ -72,6 +122,9 @@ is empty.
SV* av_pop(AV* ar)
+=for hackers
+Found in file av.c
+
=item av_push
Pushes an SV onto the end of the array. The array will grow automatically
@@ -79,12 +132,18 @@ to accommodate the addition.
void av_push(AV* ar, SV* val)
+=for hackers
+Found in file av.c
+
=item av_shift
Shifts an SV off the beginning of the array.
SV* av_shift(AV* ar)
+=for hackers
+Found in file av.c
+
=item av_store
Stores an SV in an array. The array index is specified as C<key>. The
@@ -100,12 +159,18 @@ more information on how to use this function on tied arrays.
SV** av_store(AV* ar, I32 key, SV* val)
+=for hackers
+Found in file av.c
+
=item av_undef
Undefines the array. Frees the memory used by the array itself.
void av_undef(AV* ar)
+=for hackers
+Found in file av.c
+
=item av_unshift
Unshift the given number of C<undef> values onto the beginning of the
@@ -114,6 +179,40 @@ must then use C<av_store> to assign values to these new elements.
void av_unshift(AV* ar, I32 num)
+=for hackers
+Found in file av.c
+
+=item bytes_from_utf8
+
+Converts a string C<s> of length C<len> from UTF8 into byte encoding.
+Unlike <utf8_to_bytes> but like C<bytes_to_utf8>, returns a pointer to
+the newly-created string, and updates C<len> to contain the new
+length. Returns the original string if no conversion occurs, C<len>
+is unchanged. Do nothing if C<is_utf8> points to 0. Sets C<is_utf8> to
+0 if C<s> is converted or contains all 7bit characters.
+
+NOTE: this function is experimental and may change or be
+removed without notice.
+
+ U8* bytes_from_utf8(U8 *s, STRLEN *len, bool *is_utf8)
+
+=for hackers
+Found in file utf8.c
+
+=item bytes_to_utf8
+
+Converts a string C<s> of length C<len> from ASCII into UTF8 encoding.
+Returns a pointer to the newly-created string, and sets C<len> to
+reflect the new length.
+
+NOTE: this function is experimental and may change or be
+removed without notice.
+
+ U8* bytes_to_utf8(U8 *s, STRLEN *len)
+
+=for hackers
+Found in file utf8.c
+
=item call_argv
Performs a callback to the specified Perl sub. See L<perlcall>.
@@ -122,6 +221,9 @@ NOTE: the perl_ form of this function is deprecated.
I32 call_argv(const char* sub_name, I32 flags, char** argv)
+=for hackers
+Found in file perl.c
+
=item call_method
Performs a callback to the specified Perl method. The blessed object must
@@ -131,6 +233,9 @@ NOTE: the perl_ form of this function is deprecated.
I32 call_method(const char* methname, I32 flags)
+=for hackers
+Found in file perl.c
+
=item call_pv
Performs a callback to the specified Perl sub. See L<perlcall>.
@@ -139,6 +244,9 @@ NOTE: the perl_ form of this function is deprecated.
I32 call_pv(const char* sub_name, I32 flags)
+=for hackers
+Found in file perl.c
+
=item call_sv
Performs a callback to the Perl sub whose name is in the SV. See
@@ -148,6 +256,9 @@ NOTE: the perl_ form of this function is deprecated.
I32 call_sv(SV* sv, I32 flags)
+=for hackers
+Found in file perl.c
+
=item CLASS
Variable which is setup by C<xsubpp> to indicate the
@@ -155,6 +266,9 @@ class name for a C++ XS constructor. This is always a C<char*>. See C<THIS>.
char* CLASS
+=for hackers
+Found in file XSUB.h
+
=item Copy
The XSUB-writer's interface to the C C<memcpy> function. The C<src> is the
@@ -163,20 +277,36 @@ the type. May fail on overlapping copies. See also C<Move>.
void Copy(void* src, void* dest, int nitems, type)
+=for hackers
+Found in file handy.h
+
=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>.
+This is the XSUB-writer's interface to Perl's C<die> function.
+Normally use this function the same way you use the C C<printf>
+function. See C<warn>.
+
+If you want to throw an exception object, assign the object to
+C<$@> and then pass C<Nullch> to croak():
+
+ errsv = get_sv("@", TRUE);
+ sv_setsv(errsv, exception_object);
+ croak(Nullch);
void croak(const char* pat, ...)
+=for hackers
+Found in file util.c
+
=item CvSTASH
Returns the stash of the CV.
HV* CvSTASH(CV* cv)
+=for hackers
+Found in file cv.h
+
=item dMARK
Declare a stack marker variable, C<mark>, for the XSUB. See C<MARK> and
@@ -184,12 +314,18 @@ C<dORIGMARK>.
dMARK;
+=for hackers
+Found in file pp.h
+
=item dORIGMARK
Saves the original stack mark for the XSUB. See C<ORIGMARK>.
dORIGMARK;
+=for hackers
+Found in file pp.h
+
=item dSP
Declares a local copy of perl's stack pointer for the XSUB, available via
@@ -197,6 +333,9 @@ the C<SP> macro. See C<SP>.
dSP;
+=for hackers
+Found in file pp.h
+
=item dXSARGS
Sets up stack and mark pointers for an XSUB, calling dSP and dMARK. This
@@ -205,6 +344,9 @@ variable to indicate the number of items on the stack.
dXSARGS;
+=for hackers
+Found in file XSUB.h
+
=item dXSI32
Sets up the C<ix> variable for an XSUB which has aliases. This is usually
@@ -212,12 +354,18 @@ handled automatically by C<xsubpp>.
dXSI32;
+=for hackers
+Found in file XSUB.h
+
=item ENTER
Opening bracket on a callback. See C<LEAVE> and L<perlcall>.
ENTER;
+=for hackers
+Found in file scope.h
+
=item eval_pv
Tells Perl to C<eval> the given string and return an SV* result.
@@ -226,6 +374,9 @@ NOTE: the perl_ form of this function is deprecated.
SV* eval_pv(const char* p, I32 croak_on_error)
+=for hackers
+Found in file perl.c
+
=item eval_sv
Tells Perl to C<eval> the string in the SV.
@@ -234,14 +385,20 @@ NOTE: the perl_ form of this function is deprecated.
I32 eval_sv(SV* sv, I32 flags)
+=for hackers
+Found in file perl.c
+
=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
+used, guarantees that there is room for at least C<nitems> to be pushed
onto the stack.
void EXTEND(SP, int nitems)
+=for hackers
+Found in file pp.h
+
=item fbm_compile
Analyses the string in order to make fast searches on it using fbm_instr()
@@ -249,6 +406,9 @@ Analyses the string in order to make fast searches on it using fbm_instr()
void fbm_compile(SV* sv, U32 flags)
+=for hackers
+Found in file util.c
+
=item fbm_instr
Returns the location of the SV in the string delimited by C<str> and
@@ -258,6 +418,9 @@ then.
char* fbm_instr(unsigned char* big, unsigned char* bigend, SV* littlesv, U32 flags)
+=for hackers
+Found in file util.c
+
=item FREETMPS
Closing bracket for temporaries on a callback. See C<SAVETMPS> and
@@ -265,6 +428,9 @@ L<perlcall>.
FREETMPS;
+=for hackers
+Found in file scope.h
+
=item get_av
Returns the AV of the specified Perl array. If C<create> is set and the
@@ -275,6 +441,9 @@ NOTE: the perl_ form of this function is deprecated.
AV* get_av(const char* name, I32 create)
+=for hackers
+Found in file perl.c
+
=item get_cv
Returns the CV of the specified Perl subroutine. If C<create> is set and
@@ -286,6 +455,9 @@ NOTE: the perl_ form of this function is deprecated.
CV* get_cv(const char* name, I32 create)
+=for hackers
+Found in file perl.c
+
=item get_hv
Returns the HV of the specified Perl hash. If C<create> is set and the
@@ -296,6 +468,9 @@ NOTE: the perl_ form of this function is deprecated.
HV* get_hv(const char* name, I32 create)
+=for hackers
+Found in file perl.c
+
=item get_sv
Returns the SV of the specified Perl scalar. If C<create> is set and the
@@ -306,6 +481,9 @@ NOTE: the perl_ form of this function is deprecated.
SV* get_sv(const char* name, I32 create)
+=for hackers
+Found in file perl.c
+
=item GIMME
A backward-compatible version of C<GIMME_V> which can only return
@@ -314,71 +492,89 @@ Deprecated. Use C<GIMME_V> instead.
U32 GIMME
+=for hackers
+Found in file op.h
+
=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,
+C<G_SCALAR> or C<G_ARRAY> for void, scalar or list context,
respectively.
U32 GIMME_V
+=for hackers
+Found in file op.h
+
=item GvSV
Return the SV from the GV.
SV* GvSV(GV* gv)
+=for hackers
+Found in file gv.h
+
=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.
+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.
+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.
+obtained from the GV with the C<GvCV> macro.
GV* gv_fetchmeth(HV* stash, const char* name, STRLEN len, I32 level)
+=for hackers
+Found in file gv.c
+
=item gv_fetchmethod
See L<gv_fetchmethod_autoload>.
GV* gv_fetchmethod(HV* stash, const char* name)
+=for hackers
+Found in file gv.c
+
=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.
+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.
+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.
+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.
+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.
+C<call_sv> apply equally to these functions.
GV* gv_fetchmethod_autoload(HV* stash, const char* name, I32 autoload)
+=for hackers
+Found in file gv.c
+
=item gv_stashpv
Returns a pointer to the stash for a specified package. C<name> should
@@ -388,6 +584,9 @@ package does not exist then NULL is returned.
HV* gv_stashpv(const char* name, I32 create)
+=for hackers
+Found in file gv.c
+
=item gv_stashsv
Returns a pointer to the stash for a specified package, which must be a
@@ -395,47 +594,74 @@ valid UTF-8 string. See C<gv_stashpv>.
HV* gv_stashsv(SV* sv, I32 create)
+=for hackers
+Found in file gv.c
+
=item G_ARRAY
-Used to indicate array context. See C<GIMME_V>, C<GIMME> and
+Used to indicate list context. See C<GIMME_V>, C<GIMME> and
L<perlcall>.
+=for hackers
+Found in file cop.h
+
=item G_DISCARD
Indicates that arguments returned from a callback should be discarded. See
L<perlcall>.
+=for hackers
+Found in file cop.h
+
=item G_EVAL
Used to force a Perl C<eval> wrapper around a callback. See
L<perlcall>.
+=for hackers
+Found in file cop.h
+
=item G_NOARGS
Indicates that no arguments are being sent to a callback. See
L<perlcall>.
+=for hackers
+Found in file cop.h
+
=item G_SCALAR
Used to indicate scalar context. See C<GIMME_V>, C<GIMME>, and
L<perlcall>.
+=for hackers
+Found in file cop.h
+
=item G_VOID
Used to indicate void context. See C<GIMME_V> and L<perlcall>.
+=for hackers
+Found in file cop.h
+
=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).
+=for hackers
+Found in file hv.h
+
=item HeHASH
Returns the computed hash stored in the hash entry.
U32 HeHASH(HE* he)
+=for hackers
+Found in file hv.h
+
=item HeKEY
Returns the actual pointer stored in the key slot of the hash entry. The
@@ -445,6 +671,9 @@ usually preferable for finding the value of a key.
void* HeKEY(HE* he)
+=for hackers
+Found in file hv.h
+
=item HeKLEN
If this is negative, and amounts to C<HEf_SVKEY>, it indicates the entry
@@ -454,6 +683,9 @@ lengths.
STRLEN HeKLEN(HE* he)
+=for hackers
+Found in file hv.h
+
=item HePV
Returns the key slot of the hash entry as a C<char*> value, doing any
@@ -468,6 +700,9 @@ described elsewhere in this document.
char* HePV(HE* he, STRLEN len)
+=for hackers
+Found in file hv.h
+
=item HeSVKEY
Returns the key as an C<SV*>, or C<Nullsv> if the hash entry does not
@@ -475,6 +710,9 @@ contain an C<SV*> key.
SV* HeSVKEY(HE* he)
+=for hackers
+Found in file hv.h
+
=item HeSVKEY_force
Returns the key as an C<SV*>. Will create and return a temporary mortal
@@ -482,6 +720,9 @@ C<SV*> if the hash entry contains only a C<char*> key.
SV* HeSVKEY_force(HE* he)
+=for hackers
+Found in file hv.h
+
=item HeSVKEY_set
Sets the key to a given C<SV*>, taking care to set the appropriate flags to
@@ -490,24 +731,36 @@ C<SV*>.
SV* HeSVKEY_set(HE* he, SV* sv)
+=for hackers
+Found in file hv.h
+
=item HeVAL
Returns the value slot (type C<SV*>) stored in the hash entry.
SV* HeVAL(HE* he)
+=for hackers
+Found in file hv.h
+
=item HvNAME
Returns the package name of a stash. See C<SvSTASH>, C<CvSTASH>.
char* HvNAME(HV* stash)
+=for hackers
+Found in file hv.h
+
=item hv_clear
Clears a hash, making it empty.
void hv_clear(HV* tb)
+=for hackers
+Found in file hv.c
+
=item hv_delete
Deletes a key/value pair in the hash. The value SV is removed from the
@@ -517,6 +770,9 @@ will be returned.
SV* hv_delete(HV* tb, const char* key, U32 klen, I32 flags)
+=for hackers
+Found in file hv.c
+
=item hv_delete_ent
Deletes a key/value pair in the hash. The value SV is removed from the
@@ -526,6 +782,9 @@ precomputed hash value, or 0 to ask for it to be computed.
SV* hv_delete_ent(HV* tb, SV* key, I32 flags, U32 hash)
+=for hackers
+Found in file hv.c
+
=item hv_exists
Returns a boolean indicating whether the specified hash key exists. The
@@ -533,6 +792,9 @@ C<klen> is the length of the key.
bool hv_exists(HV* tb, const char* key, U32 klen)
+=for hackers
+Found in file hv.c
+
=item hv_exists_ent
Returns a boolean indicating whether the specified hash key exists. C<hash>
@@ -541,6 +803,9 @@ computed.
bool hv_exists_ent(HV* tb, SV* key, U32 hash)
+=for hackers
+Found in file hv.c
+
=item hv_fetch
Returns the SV which corresponds to the specified key in the hash. The
@@ -553,6 +818,9 @@ information on how to use this function on tied hashes.
SV** hv_fetch(HV* tb, const char* key, U32 klen, I32 lval)
+=for hackers
+Found in file hv.c
+
=item hv_fetch_ent
Returns the hash entry which corresponds to the specified key in the hash.
@@ -568,6 +836,9 @@ information on how to use this function on tied hashes.
HE* hv_fetch_ent(HV* tb, SV* key, I32 lval, U32 hash)
+=for hackers
+Found in file hv.c
+
=item hv_iterinit
Prepares a starting point to traverse a hash table. Returns the number of
@@ -580,6 +851,9 @@ value, you can get it through the macro C<HvFILL(tb)>.
I32 hv_iterinit(HV* tb)
+=for hackers
+Found in file hv.c
+
=item hv_iterkey
Returns the key from the current position of the hash iterator. See
@@ -587,6 +861,9 @@ C<hv_iterinit>.
char* hv_iterkey(HE* entry, I32* retlen)
+=for hackers
+Found in file hv.c
+
=item hv_iterkeysv
Returns the key as an C<SV*> from the current position of the hash
@@ -595,12 +872,18 @@ see C<hv_iterinit>.
SV* hv_iterkeysv(HE* entry)
+=for hackers
+Found in file hv.c
+
=item hv_iternext
Returns entries from a hash iterator. See C<hv_iterinit>.
HE* hv_iternext(HV* tb)
+=for hackers
+Found in file hv.c
+
=item hv_iternextsv
Performs an C<hv_iternext>, C<hv_iterkey>, and C<hv_iterval> in one
@@ -608,6 +891,9 @@ operation.
SV* hv_iternextsv(HV* hv, char** key, I32* retlen)
+=for hackers
+Found in file hv.c
+
=item hv_iterval
Returns the value from the current position of the hash iterator. See
@@ -615,12 +901,18 @@ C<hv_iterkey>.
SV* hv_iterval(HV* tb, HE* entry)
+=for hackers
+Found in file hv.c
+
=item hv_magic
Adds magic to a hash. See C<sv_magic>.
void hv_magic(HV* hv, GV* gv, int how)
+=for hackers
+Found in file hv.c
+
=item hv_store
Stores an SV in a hash. The hash key is specified as C<key> and C<klen> is
@@ -637,6 +929,9 @@ information on how to use this function on tied hashes.
SV** hv_store(HV* tb, const char* key, U32 klen, SV* val, U32 hash)
+=for hackers
+Found in file hv.c
+
=item hv_store_ent
Stores C<val> in a hash. The hash key is specified as C<key>. The C<hash>
@@ -654,33 +949,48 @@ information on how to use this function on tied hashes.
HE* hv_store_ent(HV* tb, SV* key, SV* val, U32 hash)
+=for hackers
+Found in file hv.c
+
=item hv_undef
Undefines the hash.
void hv_undef(HV* tb)
+=for hackers
+Found in file hv.c
+
=item isALNUM
-Returns a boolean indicating whether the C C<char> is an ascii alphanumeric
-character or digit.
+Returns a boolean indicating whether the C C<char> is an ASCII alphanumeric
+character (including underscore) or digit.
bool isALNUM(char ch)
+=for hackers
+Found in file handy.h
+
=item isALPHA
-Returns a boolean indicating whether the C C<char> is an ascii alphabetic
+Returns a boolean indicating whether the C C<char> is an ASCII alphabetic
character.
bool isALPHA(char ch)
+=for hackers
+Found in file handy.h
+
=item isDIGIT
-Returns a boolean indicating whether the C C<char> is an ascii
+Returns a boolean indicating whether the C C<char> is an ASCII
digit.
bool isDIGIT(char ch)
+=for hackers
+Found in file handy.h
+
=item isLOWER
Returns a boolean indicating whether the C C<char> is a lowercase
@@ -688,12 +998,18 @@ character.
bool isLOWER(char ch)
+=for hackers
+Found in file handy.h
+
=item isSPACE
Returns a boolean indicating whether the C C<char> is whitespace.
bool isSPACE(char ch)
+=for hackers
+Found in file handy.h
+
=item isUPPER
Returns a boolean indicating whether the C C<char> is an uppercase
@@ -701,6 +1017,30 @@ character.
bool isUPPER(char ch)
+=for hackers
+Found in file handy.h
+
+=item is_utf8_char
+
+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.
+
+ STRLEN is_utf8_char(U8 *p)
+
+=for hackers
+Found in file utf8.c
+
+=item is_utf8_string
+
+Returns true if first C<len> bytes of the given string form valid a UTF8
+string, false otherwise.
+
+ bool is_utf8_string(U8 *s, STRLEN len)
+
+=for hackers
+Found in file utf8.c
+
=item items
Variable which is setup by C<xsubpp> to indicate the number of
@@ -708,6 +1048,9 @@ items on the stack. See L<perlxs/"Variable-length Parameter Lists">.
I32 items
+=for hackers
+Found in file XSUB.h
+
=item ix
Variable which is setup by C<xsubpp> to indicate which of an
@@ -715,12 +1058,18 @@ XSUB's aliases was used to invoke it. See L<perlxs/"The ALIAS: Keyword">.
I32 ix
+=for hackers
+Found in file XSUB.h
+
=item LEAVE
Closing bracket on a callback. See C<ENTER> and L<perlcall>.
LEAVE;
+=for hackers
+Found in file scope.h
+
=item looks_like_number
Test if an the content of an SV looks like a number (or is a
@@ -728,58 +1077,88 @@ number).
I32 looks_like_number(SV* sv)
+=for hackers
+Found in file sv.c
+
=item MARK
Stack marker variable for the XSUB. See C<dMARK>.
+=for hackers
+Found in file pp.h
+
=item mg_clear
Clear something magical that the SV represents. See C<sv_magic>.
int mg_clear(SV* sv)
+=for hackers
+Found in file mg.c
+
=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)
+=for hackers
+Found in file mg.c
+
=item mg_find
Finds the magic pointer for type matching the SV. See C<sv_magic>.
MAGIC* mg_find(SV* sv, int type)
+=for hackers
+Found in file mg.c
+
=item mg_free
Free any magic storage used by the SV. See C<sv_magic>.
int mg_free(SV* sv)
+=for hackers
+Found in file mg.c
+
=item mg_get
Do magic after a value is retrieved from the SV. See C<sv_magic>.
int mg_get(SV* sv)
+=for hackers
+Found in file mg.c
+
=item mg_length
Report on the SV's length. See C<sv_magic>.
U32 mg_length(SV* sv)
+=for hackers
+Found in file mg.c
+
=item mg_magical
Turns on the magical status of an SV. See C<sv_magic>.
void mg_magical(SV* sv)
+=for hackers
+Found in file mg.c
+
=item mg_set
Do magic after a value is assigned to the SV. See C<sv_magic>.
int mg_set(SV* sv)
+=for hackers
+Found in file mg.c
+
=item Move
The XSUB-writer's interface to the C C<memmove> function. The C<src> is the
@@ -788,18 +1167,27 @@ the type. Can do overlapping moves. See also C<Copy>.
void Move(void* src, void* dest, int nitems, type)
+=for hackers
+Found in file handy.h
+
=item New
The XSUB-writer's interface to the C C<malloc> function.
void New(int id, void* ptr, int nitems, type)
+=for hackers
+Found in file handy.h
+
=item newAV
Creates a new AV. The reference count is set to 1.
AV* newAV()
+=for hackers
+Found in file av.c
+
=item Newc
The XSUB-writer's interface to the C C<malloc> function, with
@@ -807,6 +1195,9 @@ cast.
void Newc(int id, void* ptr, int nitems, type, cast)
+=for hackers
+Found in file handy.h
+
=item newCONSTSUB
Creates a constant sub equivalent to Perl C<sub FOO () { 123 }> which is
@@ -814,12 +1205,18 @@ eligible for inlining at compile-time.
void newCONSTSUB(HV* stash, char* name, SV* sv)
+=for hackers
+Found in file op.c
+
=item newHV
Creates a new HV. The reference count is set to 1.
HV* newHV()
+=for hackers
+Found in file hv.c
+
=item newRV_inc
Creates an RV wrapper for an SV. The reference count for the original SV is
@@ -827,6 +1224,9 @@ incremented.
SV* newRV_inc(SV* sv)
+=for hackers
+Found in file sv.h
+
=item newRV_noinc
Creates an RV wrapper for an SV. The reference count for the original
@@ -834,16 +1234,22 @@ SV is B<not> incremented.
SV* newRV_noinc(SV *sv)
+=for hackers
+Found in file sv.c
+
=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.
+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)
+=for hackers
+Found in file handy.h
+
=item newSViv
Creates a new SV and copies an integer into it. The reference count for the
@@ -851,6 +1257,9 @@ SV is set to 1.
SV* newSViv(IV i)
+=for hackers
+Found in file sv.c
+
=item newSVnv
Creates a new SV and copies a floating point value into it.
@@ -858,6 +1267,9 @@ The reference count for the SV is set to 1.
SV* newSVnv(NV n)
+=for hackers
+Found in file sv.c
+
=item newSVpv
Creates a new SV and copies a string into it. The reference count for the
@@ -866,6 +1278,9 @@ strlen(). For efficiency, consider using C<newSVpvn> instead.
SV* newSVpv(const char* s, STRLEN len)
+=for hackers
+Found in file sv.c
+
=item newSVpvf
Creates a new SV an initialize it with the string formatted like
@@ -873,6 +1288,9 @@ C<sprintf>.
SV* newSVpvf(const char* pat, ...)
+=for hackers
+Found in file sv.c
+
=item newSVpvn
Creates a new SV and copies a string into it. The reference count for the
@@ -882,6 +1300,9 @@ C<len> bytes long.
SV* newSVpvn(const char* s, STRLEN len)
+=for hackers
+Found in file sv.c
+
=item newSVrv
Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
@@ -891,12 +1312,18 @@ reference count is 1.
SV* newSVrv(SV* rv, const char* classname)
+=for hackers
+Found in file sv.c
+
=item newSVsv
Creates a new SV which is an exact duplicate of the original SV.
SV* newSVsv(SV* old)
+=for hackers
+Found in file sv.c
+
=item newSVuv
Creates a new SV and copies an unsigned integer into it.
@@ -904,15 +1331,24 @@ The reference count for the SV is set to 1.
SV* newSVuv(UV u)
+=for hackers
+Found in file sv.c
+
=item newXS
Used by C<xsubpp> to hook up XSUBs as Perl subs.
+=for hackers
+Found in file op.c
+
=item newXSproto
Used by C<xsubpp> to hook up XSUBs as Perl subs. Adds Perl prototypes to
the subs.
+=for hackers
+Found in file XSUB.h
+
=item Newz
The XSUB-writer's interface to the C C<malloc> function. The allocated
@@ -920,98 +1356,104 @@ memory is zeroed with C<memzero>.
void Newz(int id, void* ptr, int nitems, type)
+=for hackers
+Found in file handy.h
+
=item Nullav
Null AV pointer.
+=for hackers
+Found in file av.h
+
=item Nullch
Null character pointer.
+=for hackers
+Found in file handy.h
+
=item Nullcv
Null CV pointer.
+=for hackers
+Found in file cv.h
+
=item Nullhv
Null HV pointer.
+=for hackers
+Found in file hv.h
+
=item Nullsv
Null SV pointer.
+=for hackers
+Found in file handy.h
+
=item ORIGMARK
The original stack mark for the XSUB. See C<dORIGMARK>.
+=for hackers
+Found in file pp.h
+
=item perl_alloc
Allocates a new Perl interpreter. See L<perlembed>.
PerlInterpreter* perl_alloc()
+=for hackers
+Found in file perl.c
+
=item perl_construct
Initializes a new Perl interpreter. See L<perlembed>.
void perl_construct(PerlInterpreter* interp)
+=for hackers
+Found in file perl.c
+
=item perl_destruct
Shuts down a Perl interpreter. See L<perlembed>.
void perl_destruct(PerlInterpreter* interp)
+=for hackers
+Found in file perl.c
+
=item perl_free
Releases a Perl interpreter. See L<perlembed>.
void perl_free(PerlInterpreter* interp)
+=for hackers
+Found in file perl.c
+
=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)
+=for hackers
+Found in file perl.c
+
=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
+=for hackers
+Found in file perl.c
=item PL_modglobal
@@ -1023,6 +1465,9 @@ prefixed by the package name of the extension that owns the data.
HV* PL_modglobal
+=for hackers
+Found in file intrpvar.h
+
=item PL_na
A convenience variable which is typically used with C<SvPV> when one
@@ -1032,6 +1477,9 @@ C<SvPV_nolen> macro.
STRLEN PL_na
+=for hackers
+Found in file thrdvar.h
+
=item PL_sv_no
This is the C<false> SV. See C<PL_sv_yes>. Always refer to this as
@@ -1039,12 +1487,18 @@ C<&PL_sv_no>.
SV PL_sv_no
+=for hackers
+Found in file intrpvar.h
+
=item PL_sv_undef
This is the C<undef> SV. Always refer to this as C<&PL_sv_undef>.
SV PL_sv_undef
+=for hackers
+Found in file intrpvar.h
+
=item PL_sv_yes
This is the C<true> SV. See C<PL_sv_no>. Always refer to this as
@@ -1052,36 +1506,54 @@ C<&PL_sv_yes>.
SV PL_sv_yes
+=for hackers
+Found in file intrpvar.h
+
=item POPi
Pops an integer off the stack.
IV POPi
+=for hackers
+Found in file pp.h
+
=item POPl
Pops a long off the stack.
long POPl
+=for hackers
+Found in file pp.h
+
=item POPn
Pops a double off the stack.
NV POPn
+=for hackers
+Found in file pp.h
+
=item POPp
Pops a string off the stack.
char* POPp
+=for hackers
+Found in file pp.h
+
=item POPs
Pops an SV off the stack.
SV* POPs
+=for hackers
+Found in file pp.h
+
=item PUSHi
Push an integer onto the stack. The stack must have room for this element.
@@ -1089,6 +1561,9 @@ Handles 'set' magic. See C<XPUSHi>.
void PUSHi(IV iv)
+=for hackers
+Found in file pp.h
+
=item PUSHMARK
Opening bracket for arguments on a callback. See C<PUTBACK> and
@@ -1096,6 +1571,9 @@ L<perlcall>.
PUSHMARK;
+=for hackers
+Found in file pp.h
+
=item PUSHn
Push a double onto the stack. The stack must have room for this element.
@@ -1103,6 +1581,9 @@ Handles 'set' magic. See C<XPUSHn>.
void PUSHn(NV nv)
+=for hackers
+Found in file pp.h
+
=item PUSHp
Push a string onto the stack. The stack must have room for this element.
@@ -1111,13 +1592,19 @@ C<XPUSHp>.
void PUSHp(char* str, STRLEN len)
+=for hackers
+Found in file pp.h
+
=item PUSHs
-Push an SV onto the stack. The stack must have room for this element.
+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)
+=for hackers
+Found in file pp.h
+
=item PUSHu
Push an unsigned integer onto the stack. The stack must have room for this
@@ -1125,6 +1612,9 @@ element. See C<XPUSHu>.
void PUSHu(UV uv)
+=for hackers
+Found in file pp.h
+
=item PUTBACK
Closing bracket for XSUB arguments. This is usually handled by C<xsubpp>.
@@ -1132,12 +1622,18 @@ See C<PUSHMARK> and L<perlcall> for other uses.
PUTBACK;
+=for hackers
+Found in file pp.h
+
=item Renew
The XSUB-writer's interface to the C C<realloc> function.
void Renew(void* ptr, int nitems, type)
+=for hackers
+Found in file handy.h
+
=item Renewc
The XSUB-writer's interface to the C C<realloc> function, with
@@ -1145,6 +1641,9 @@ cast.
void Renewc(void* ptr, int nitems, type, cast)
+=for hackers
+Found in file handy.h
+
=item require_pv
Tells Perl to C<require> a module.
@@ -1153,6 +1652,9 @@ NOTE: the perl_ form of this function is deprecated.
void require_pv(const char* pv)
+=for hackers
+Found in file perl.c
+
=item RETVAL
Variable which is setup by C<xsubpp> to hold the return value for an
@@ -1161,11 +1663,17 @@ L<perlxs/"The RETVAL Variable">.
(whatever) RETVAL
+=for hackers
+Found in file XSUB.h
+
=item Safefree
The XSUB-writer's interface to the C C<free> function.
- void Safefree(void* src, void* dest, int nitems, type)
+ void Safefree(void* ptr)
+
+=for hackers
+Found in file handy.h
=item savepv
@@ -1173,6 +1681,9 @@ Copy a string to a safe spot. This does not use an SV.
char* savepv(const char* sv)
+=for hackers
+Found in file util.c
+
=item savepvn
Copy a string to a safe spot. The C<len> indicates number of bytes to
@@ -1180,6 +1691,9 @@ copy. This does not use an SV.
char* savepvn(const char* sv, I32 len)
+=for hackers
+Found in file util.c
+
=item SAVETMPS
Opening bracket for temporaries on a callback. See C<FREETMPS> and
@@ -1187,29 +1701,44 @@ L<perlcall>.
SAVETMPS;
+=for hackers
+Found in file scope.h
+
=item SP
Stack pointer. This is usually handled by C<xsubpp>. See C<dSP> and
C<SPAGAIN>.
+=for hackers
+Found in file pp.h
+
=item SPAGAIN
Refetch the stack pointer. Used after a callback. See L<perlcall>.
SPAGAIN;
+=for hackers
+Found in file pp.h
+
=item ST
Used to access elements on the XSUB's stack.
SV* ST(int ix)
+=for hackers
+Found in file XSUB.h
+
=item strEQ
Test two strings to see if they are equal. Returns true or false.
bool strEQ(char* s1, char* s2)
+=for hackers
+Found in file handy.h
+
=item strGE
Test two strings to see if the first, C<s1>, is greater than or equal to
@@ -1217,6 +1746,9 @@ the second, C<s2>. Returns true or false.
bool strGE(char* s1, char* s2)
+=for hackers
+Found in file handy.h
+
=item strGT
Test two strings to see if the first, C<s1>, is greater than the second,
@@ -1224,6 +1756,9 @@ C<s2>. Returns true or false.
bool strGT(char* s1, char* s2)
+=for hackers
+Found in file handy.h
+
=item strLE
Test two strings to see if the first, C<s1>, is less than or equal to the
@@ -1231,6 +1766,9 @@ second, C<s2>. Returns true or false.
bool strLE(char* s1, char* s2)
+=for hackers
+Found in file handy.h
+
=item strLT
Test two strings to see if the first, C<s1>, is less than the second,
@@ -1238,6 +1776,9 @@ C<s2>. Returns true or false.
bool strLT(char* s1, char* s2)
+=for hackers
+Found in file handy.h
+
=item strNE
Test two strings to see if they are different. Returns true or
@@ -1245,6 +1786,9 @@ false.
bool strNE(char* s1, char* s2)
+=for hackers
+Found in file handy.h
+
=item strnEQ
Test two strings to see if they are equal. The C<len> parameter indicates
@@ -1253,6 +1797,9 @@ C<strncmp>).
bool strnEQ(char* s1, char* s2, STRLEN len)
+=for hackers
+Found in file handy.h
+
=item strnNE
Test two strings to see if they are different. The C<len> parameter
@@ -1261,24 +1808,36 @@ wrapper for C<strncmp>).
bool strnNE(char* s1, char* s2, STRLEN len)
+=for hackers
+Found in file handy.h
+
=item StructCopy
-This is an architecture-independant macro to copy one structure to another.
+This is an architecture-independent macro to copy one structure to another.
void StructCopy(type src, type dest, type)
+=for hackers
+Found in file handy.h
+
=item SvCUR
Returns the length of the string which is in the SV. See C<SvLEN>.
STRLEN SvCUR(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvCUR_set
Set the length of the string which is in the SV. See C<SvCUR>.
void SvCUR_set(SV* sv, STRLEN len)
+=for hackers
+Found in file sv.h
+
=item SvEND
Returns a pointer to the last character in the string which is in the SV.
@@ -1286,6 +1845,9 @@ See C<SvCUR>. Access the character as *(SvEND(sv)).
char* SvEND(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvGETMAGIC
Invokes C<mg_get> on an SV if it has 'get' magic. This macro evaluates its
@@ -1293,6 +1855,9 @@ argument more than once.
void SvGETMAGIC(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvGROW
Expands the character buffer in the SV so that it has room for the
@@ -1302,12 +1867,18 @@ Returns a pointer to the character buffer.
void SvGROW(SV* sv, STRLEN len)
+=for hackers
+Found in file sv.h
+
=item SvIOK
Returns a boolean indicating whether the SV contains an integer.
bool SvIOK(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvIOKp
Returns a boolean indicating whether the SV contains an integer. Checks
@@ -1315,30 +1886,72 @@ the B<private> setting. Use C<SvIOK>.
bool SvIOKp(SV* sv)
+=for hackers
+Found in file sv.h
+
+=item SvIOK_notUV
+
+Returns a boolean indicating whether the SV contains an signed integer.
+
+ void SvIOK_notUV(SV* sv)
+
+=for hackers
+Found in file sv.h
+
=item SvIOK_off
Unsets the IV status of an SV.
void SvIOK_off(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvIOK_on
Tells an SV that it is an integer.
void SvIOK_on(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvIOK_only
Tells an SV that it is an integer and disables all other OK bits.
void SvIOK_only(SV* sv)
+=for hackers
+Found in file sv.h
+
+=item SvIOK_only_UV
+
+Tells and SV that it is an unsigned integer and disables all other OK bits.
+
+ void SvIOK_only_UV(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvIOK_UV
+
+Returns a boolean indicating whether the SV contains an unsigned integer.
+
+ void SvIOK_UV(SV* sv)
+
+=for hackers
+Found in file sv.h
+
=item SvIV
Coerces the given SV to an integer and returns it.
IV SvIV(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvIVX
Returns the integer which is stored in the SV, assuming SvIOK is
@@ -1346,12 +1959,19 @@ true.
IV SvIVX(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvLEN
-Returns the size of the string buffer in the SV. See C<SvCUR>.
+Returns the size of the string buffer in the SV, not including any part
+attributable to C<SvOOK>. See C<SvCUR>.
STRLEN SvLEN(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvNIOK
Returns a boolean indicating whether the SV contains a number, integer or
@@ -1359,6 +1979,9 @@ double.
bool SvNIOK(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvNIOKp
Returns a boolean indicating whether the SV contains a number, integer or
@@ -1366,18 +1989,27 @@ double. Checks the B<private> setting. Use C<SvNIOK>.
bool SvNIOKp(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvNIOK_off
Unsets the NV/IV status of an SV.
void SvNIOK_off(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvNOK
Returns a boolean indicating whether the SV contains a double.
bool SvNOK(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvNOKp
Returns a boolean indicating whether the SV contains a double. Checks the
@@ -1385,30 +2017,45 @@ B<private> setting. Use C<SvNOK>.
bool SvNOKp(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvNOK_off
Unsets the NV status of an SV.
void SvNOK_off(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvNOK_on
Tells an SV that it is a double.
void SvNOK_on(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvNOK_only
Tells an SV that it is a double and disables all other OK bits.
void SvNOK_only(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvNV
Coerce the given SV to a double and return it.
NV SvNV(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvNVX
Returns the double which is stored in the SV, assuming SvNOK is
@@ -1416,12 +2063,18 @@ true.
NV SvNVX(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvOK
Returns a boolean indicating whether the value is an SV.
bool SvOK(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvOOK
Returns a boolean indicating whether the SvIVX is a valid offset value for
@@ -1431,6 +2084,9 @@ allocated string buffer is really (SvPVX - SvIVX).
bool SvOOK(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvPOK
Returns a boolean indicating whether the SV contains a character
@@ -1438,6 +2094,9 @@ string.
bool SvPOK(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvPOKp
Returns a boolean indicating whether the SV contains a character string.
@@ -1445,24 +2104,46 @@ Checks the B<private> setting. Use C<SvPOK>.
bool SvPOKp(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvPOK_off
Unsets the PV status of an SV.
void SvPOK_off(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvPOK_on
Tells an SV that it is a string.
void SvPOK_on(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvPOK_only
Tells an SV that it is a string and disables all other OK bits.
void SvPOK_only(SV* sv)
+=for hackers
+Found in file sv.h
+
+=item SvPOK_only_UTF8
+
+Tells an SV that it is a UTF8 string (do not use frivolously)
+and disables all other OK bits.
+
+ void SvPOK_only_UTF8(SV* sv)
+
+=for hackers
+Found in file sv.h
+
=item SvPV
Returns a pointer to the string in the SV, or a stringified form of the SV
@@ -1470,6 +2151,9 @@ if the SV does not contain a string. Handles 'get' magic.
char* SvPV(SV* sv, STRLEN len)
+=for hackers
+Found in file sv.h
+
=item SvPVX
Returns a pointer to the string in the SV. The SV must contain a
@@ -1477,6 +2161,9 @@ string.
char* SvPVX(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvPV_force
Like <SvPV> but will force the SV into becoming a string (SvPOK). You want
@@ -1484,6 +2171,9 @@ force if you are going to update the SvPVX directly.
char* SvPV_force(SV* sv, STRLEN len)
+=for hackers
+Found in file sv.h
+
=item SvPV_nolen
Returns a pointer to the string in the SV, or a stringified form of the SV
@@ -1491,48 +2181,72 @@ if the SV does not contain a string. Handles 'get' magic.
char* SvPV_nolen(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvREFCNT
Returns the value of the object's reference count.
U32 SvREFCNT(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvREFCNT_dec
Decrements the reference count of the given SV.
void SvREFCNT_dec(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvREFCNT_inc
Increments the reference count of the given SV.
SV* SvREFCNT_inc(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvROK
Tests if the SV is an RV.
bool SvROK(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvROK_off
Unsets the RV status of an SV.
void SvROK_off(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvROK_on
Tells an SV that it is an RV.
void SvROK_on(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvRV
Dereferences an RV to return the SV.
SV* SvRV(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvSETMAGIC
Invokes C<mg_set> on an SV if it has 'set' magic. This macro evaluates its
@@ -1540,6 +2254,9 @@ argument more than once.
void SvSETMAGIC(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvSetSV
Calls C<sv_setsv> if dsv is not the same as ssv. May evaluate arguments
@@ -1547,6 +2264,9 @@ more than once.
void SvSetSV(SV* dsb, SV* ssv)
+=for hackers
+Found in file sv.h
+
=item SvSetSV_nosteal
Calls a non-destructive version of C<sv_setsv> if dsv is not the same as
@@ -1554,18 +2274,27 @@ ssv. May evaluate arguments more than once.
void SvSetSV_nosteal(SV* dsv, SV* ssv)
+=for hackers
+Found in file sv.h
+
=item SvSTASH
Returns the stash of the SV.
HV* SvSTASH(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvTAINT
Taints an SV if tainting is enabled
void SvTAINT(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvTAINTED
Checks to see if an SV is tainted. Returns TRUE if it is, FALSE if
@@ -1573,6 +2302,9 @@ not.
bool SvTAINTED(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvTAINTED_off
Untaints an SV. Be I<very> careful with this routine, as it short-circuits
@@ -1584,12 +2316,18 @@ untainting variables.
void SvTAINTED_off(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvTAINTED_on
Marks an SV as tainted.
void SvTAINTED_on(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvTRUE
Returns a boolean indicating whether Perl would evaluate the SV as true or
@@ -1597,45 +2335,75 @@ false, defined or undefined. Does not handle 'get' magic.
bool SvTRUE(SV* sv)
+=for hackers
+Found in file sv.h
+
+=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.
+
+=for hackers
+Found in file sv.h
+
=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.
+=for hackers
+Found in file sv.h
=item SVt_IV
Integer type flag for scalars. See C<svtype>.
+=for hackers
+Found in file sv.h
+
=item SVt_NV
Double type flag for scalars. See C<svtype>.
+=for hackers
+Found in file sv.h
+
=item SVt_PV
Pointer type flag for scalars. See C<svtype>.
+=for hackers
+Found in file sv.h
+
=item SVt_PVAV
Type flag for arrays. See C<svtype>.
+=for hackers
+Found in file sv.h
+
=item SVt_PVCV
Type flag for code refs. See C<svtype>.
+=for hackers
+Found in file sv.h
+
=item SVt_PVHV
Type flag for hashes. See C<svtype>.
+=for hackers
+Found in file sv.h
+
=item SVt_PVMG
Type flag for blessed scalars. See C<svtype>.
+=for hackers
+Found in file sv.h
+
=item SvUPGRADE
Used to upgrade an SV to a more complex form. Uses C<sv_upgrade> to
@@ -1643,12 +2411,45 @@ perform the upgrade if necessary. See C<svtype>.
void SvUPGRADE(SV* sv, svtype type)
+=for hackers
+Found in file sv.h
+
+=item SvUTF8
+
+Returns a boolean indicating whether the SV contains UTF-8 encoded data.
+
+ void SvUTF8(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvUTF8_off
+
+Unsets the UTF8 status of an SV.
+
+ void SvUTF8_off(SV *sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvUTF8_on
+
+Tells an SV that it is a string and encoded in UTF8. Do not use frivolously.
+
+ void SvUTF8_on(SV *sv)
+
+=for hackers
+Found in file sv.h
+
=item SvUV
Coerces the given SV to an unsigned integer and returns it.
UV SvUV(SV* sv)
+=for hackers
+Found in file sv.h
+
=item SvUVX
Returns the unsigned integer which is stored in the SV, assuming SvIOK is
@@ -1656,6 +2457,9 @@ true.
UV SvUVX(SV* sv)
+=for hackers
+Found in file sv.h
+
=item sv_2mortal
Marks an SV as mortal. The SV will be destroyed when the current context
@@ -1663,6 +2467,9 @@ ends.
SV* sv_2mortal(SV* sv)
+=for hackers
+Found in file sv.c
+
=item sv_bless
Blesses an SV into a specified package. The SV must be an RV. The package
@@ -1671,6 +2478,9 @@ of the SV is unaffected.
SV* sv_bless(SV* sv, HV* stash)
+=for hackers
+Found in file sv.c
+
=item sv_catpv
Concatenates the string onto the end of the string which is in the SV.
@@ -1678,6 +2488,9 @@ Handles 'get' magic, but not 'set' magic. See C<sv_catpv_mg>.
void sv_catpv(SV* sv, const char* ptr)
+=for hackers
+Found in file sv.c
+
=item sv_catpvf
Processes its arguments like C<sprintf> and appends the formatted output
@@ -1686,12 +2499,18 @@ typically be called after calling this function to handle 'set' magic.
void sv_catpvf(SV* sv, const char* pat, ...)
+=for hackers
+Found in file sv.c
+
=item sv_catpvf_mg
Like C<sv_catpvf>, but also handles 'set' magic.
void sv_catpvf_mg(SV *sv, const char* pat, ...)
+=for hackers
+Found in file sv.c
+
=item sv_catpvn
Concatenates the string onto the end of the string which is in the SV. The
@@ -1700,31 +2519,47 @@ C<len> indicates number of bytes to copy. Handles 'get' magic, but not
void sv_catpvn(SV* sv, const char* ptr, STRLEN len)
+=for hackers
+Found in file sv.c
+
=item sv_catpvn_mg
Like C<sv_catpvn>, but also handles 'set' magic.
void sv_catpvn_mg(SV *sv, const char *ptr, STRLEN len)
+=for hackers
+Found in file sv.c
+
=item sv_catpv_mg
Like C<sv_catpv>, but also handles 'set' magic.
void sv_catpv_mg(SV *sv, const char *ptr)
+=for hackers
+Found in file sv.c
+
=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>.
+Concatenates the string from SV C<ssv> onto the end of the string in
+SV C<dsv>. Modifies C<dsv> but not C<ssv>. Handles 'get' magic, but
+not 'set' magic. See C<sv_catsv_mg>.
void sv_catsv(SV* dsv, SV* ssv)
+=for hackers
+Found in file sv.c
+
=item sv_catsv_mg
Like C<sv_catsv>, but also handles 'set' magic.
void sv_catsv_mg(SV *dstr, SV *sstr)
+=for hackers
+Found in file sv.c
+
=item sv_chop
Efficient removal of characters from the beginning of the string buffer.
@@ -1734,6 +2569,19 @@ string.
void sv_chop(SV* sv, char* ptr)
+=for hackers
+Found in file sv.c
+
+=item sv_clear
+
+Clear an SV, making it empty. Does not free the memory used by the SV
+itself.
+
+ void sv_clear(SV* sv)
+
+=for hackers
+Found in file sv.c
+
=item sv_cmp
Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
@@ -1742,12 +2590,28 @@ C<sv2>.
I32 sv_cmp(SV* sv1, SV* sv2)
+=for hackers
+Found in file sv.c
+
+=item sv_cmp_locale
+
+Compares the strings in two SVs in a locale-aware manner. See
+L</sv_cmp_locale>
+
+ I32 sv_cmp_locale(SV* sv1, SV* sv2)
+
+=for hackers
+Found in file sv.c
+
=item sv_dec
Auto-decrement of the value in the SV.
void sv_dec(SV* sv)
+=for hackers
+Found in file sv.c
+
=item sv_derived_from
Returns a boolean indicating whether the SV is derived from the specified
@@ -1756,6 +2620,9 @@ for class names as well as for objects.
bool sv_derived_from(SV* sv, const char* name)
+=for hackers
+Found in file universal.c
+
=item sv_eq
Returns a boolean indicating whether the strings in the two SVs are
@@ -1763,6 +2630,28 @@ identical.
I32 sv_eq(SV* sv1, SV* sv2)
+=for hackers
+Found in file sv.c
+
+=item sv_free
+
+Free the memory used by an SV.
+
+ void sv_free(SV* sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_gets
+
+Get a line from the filehandle and store it into the SV, optionally
+appending to the currently-stored string.
+
+ char* sv_gets(SV* sv, PerlIO* fp, I32 append)
+
+=for hackers
+Found in file sv.c
+
=item sv_grow
Expands the character buffer in the SV. This will use C<sv_unref> and will
@@ -1771,12 +2660,18 @@ Use C<SvGROW>.
char* sv_grow(SV* sv, STRLEN newlen)
+=for hackers
+Found in file sv.c
+
=item sv_inc
Auto-increment of the value in the SV.
void sv_inc(SV* sv)
+=for hackers
+Found in file sv.c
+
=item sv_insert
Inserts a string at the specified offset/length within the SV. Similar to
@@ -1784,6 +2679,9 @@ the Perl substr() function.
void sv_insert(SV* bigsv, STRLEN offset, STRLEN len, char* little, STRLEN littlelen)
+=for hackers
+Found in file sv.c
+
=item sv_isa
Returns a boolean indicating whether the SV is blessed into the specified
@@ -1792,6 +2690,9 @@ an inheritance relationship.
int sv_isa(SV* sv, const char* name)
+=for hackers
+Found in file sv.c
+
=item sv_isobject
Returns a boolean indicating whether the SV is an RV pointing to a blessed
@@ -1800,18 +2701,37 @@ will return false.
int sv_isobject(SV* sv)
+=for hackers
+Found in file sv.c
+
=item sv_len
Returns the length of the string in the SV. See also C<SvCUR>.
STRLEN sv_len(SV* sv)
+=for hackers
+Found in file sv.c
+
+=item sv_len_utf8
+
+Returns the number of characters in the string in an SV, counting wide
+UTF8 bytes as a single character.
+
+ STRLEN sv_len_utf8(SV* sv)
+
+=for hackers
+Found in file sv.c
+
=item sv_magic
Adds magic to an SV.
void sv_magic(SV* sv, SV* obj, int how, const char* name, I32 namlen)
+=for hackers
+Found in file sv.c
+
=item sv_mortalcopy
Creates a new SV which is a copy of the original SV. The new SV is marked
@@ -1819,12 +2739,64 @@ as mortal.
SV* sv_mortalcopy(SV* oldsv)
+=for hackers
+Found in file sv.c
+
=item sv_newmortal
Creates a new SV which is mortal. The reference count of the SV is set to 1.
SV* sv_newmortal()
+=for hackers
+Found in file sv.c
+
+=item sv_pvn_force
+
+Get a sensible string out of the SV somehow.
+
+ char* sv_pvn_force(SV* sv, STRLEN* lp)
+
+=for hackers
+Found in file sv.c
+
+=item sv_pvutf8n_force
+
+Get a sensible UTF8-encoded string out of the SV somehow. See
+L</sv_pvn_force>.
+
+ char* sv_pvutf8n_force(SV* sv, STRLEN* lp)
+
+=for hackers
+Found in file sv.c
+
+=item sv_reftype
+
+Returns a string describing what the SV is a reference to.
+
+ char* sv_reftype(SV* sv, int ob)
+
+=for hackers
+Found in file sv.c
+
+=item sv_replace
+
+Make the first argument a copy of the second, then delete the original.
+
+ void sv_replace(SV* sv, SV* nsv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_rvweaken
+
+Weaken a reference.
+
+ SV* sv_rvweaken(SV *sv)
+
+=for hackers
+Found in file sv.c
+
=item sv_setiv
Copies an integer into the given SV. Does not handle 'set' magic. See
@@ -1832,12 +2804,18 @@ C<sv_setiv_mg>.
void sv_setiv(SV* sv, IV num)
+=for hackers
+Found in file sv.c
+
=item sv_setiv_mg
Like C<sv_setiv>, but also handles 'set' magic.
void sv_setiv_mg(SV *sv, IV i)
+=for hackers
+Found in file sv.c
+
=item sv_setnv
Copies a double into the given SV. Does not handle 'set' magic. See
@@ -1845,12 +2823,18 @@ C<sv_setnv_mg>.
void sv_setnv(SV* sv, NV num)
+=for hackers
+Found in file sv.c
+
=item sv_setnv_mg
Like C<sv_setnv>, but also handles 'set' magic.
void sv_setnv_mg(SV *sv, NV num)
+=for hackers
+Found in file sv.c
+
=item sv_setpv
Copies a string into an SV. The string must be null-terminated. Does not
@@ -1858,6 +2842,9 @@ handle 'set' magic. See C<sv_setpv_mg>.
void sv_setpv(SV* sv, const char* ptr)
+=for hackers
+Found in file sv.c
+
=item sv_setpvf
Processes its arguments like C<sprintf> and sets an SV to the formatted
@@ -1865,12 +2852,18 @@ output. Does not handle 'set' magic. See C<sv_setpvf_mg>.
void sv_setpvf(SV* sv, const char* pat, ...)
+=for hackers
+Found in file sv.c
+
=item sv_setpvf_mg
Like C<sv_setpvf>, but also handles 'set' magic.
void sv_setpvf_mg(SV *sv, const char* pat, ...)
+=for hackers
+Found in file sv.c
+
=item sv_setpviv
Copies an integer into the given SV, also updating its string value.
@@ -1878,12 +2871,18 @@ Does not handle 'set' magic. See C<sv_setpviv_mg>.
void sv_setpviv(SV* sv, IV num)
+=for hackers
+Found in file sv.c
+
=item sv_setpviv_mg
Like C<sv_setpviv>, but also handles 'set' magic.
void sv_setpviv_mg(SV *sv, IV iv)
+=for hackers
+Found in file sv.c
+
=item sv_setpvn
Copies a string into an SV. The C<len> parameter indicates the number of
@@ -1891,18 +2890,27 @@ bytes to be copied. Does not handle 'set' magic. See C<sv_setpvn_mg>.
void sv_setpvn(SV* sv, const char* ptr, STRLEN len)
+=for hackers
+Found in file sv.c
+
=item sv_setpvn_mg
Like C<sv_setpvn>, but also handles 'set' magic.
void sv_setpvn_mg(SV *sv, const char *ptr, STRLEN len)
+=for hackers
+Found in file sv.c
+
=item sv_setpv_mg
Like C<sv_setpv>, but also handles 'set' magic.
void sv_setpv_mg(SV *sv, const char *ptr)
+=for hackers
+Found in file sv.c
+
=item sv_setref_iv
Copies an integer into a new SV, optionally blessing the SV. The C<rv>
@@ -1913,6 +2921,9 @@ will be returned and will have a reference count of 1.
SV* sv_setref_iv(SV* rv, const char* classname, IV iv)
+=for hackers
+Found in file sv.c
+
=item sv_setref_nv
Copies a double into a new SV, optionally blessing the SV. The C<rv>
@@ -1923,6 +2934,9 @@ will be returned and will have a reference count of 1.
SV* sv_setref_nv(SV* rv, const char* classname, NV nv)
+=for hackers
+Found in file sv.c
+
=item sv_setref_pv
Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
@@ -1939,6 +2953,9 @@ 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)
+=for hackers
+Found in file sv.c
+
=item sv_setref_pvn
Copies a string into a new SV, optionally blessing the SV. The length of the
@@ -1952,6 +2969,9 @@ 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)
+=for hackers
+Found in file sv.c
+
=item sv_setsv
Copies the contents of the source SV C<ssv> into the destination SV C<dsv>.
@@ -1961,12 +2981,18 @@ C<sv_setsv_mg>.
void sv_setsv(SV* dsv, SV* ssv)
+=for hackers
+Found in file sv.c
+
=item sv_setsv_mg
Like C<sv_setsv>, but also handles 'set' magic.
void sv_setsv_mg(SV *dstr, SV *sstr)
+=for hackers
+Found in file sv.c
+
=item sv_setuv
Copies an unsigned integer into the given SV. Does not handle 'set' magic.
@@ -1974,12 +3000,36 @@ See C<sv_setuv_mg>.
void sv_setuv(SV* sv, UV num)
+=for hackers
+Found in file sv.c
+
=item sv_setuv_mg
Like C<sv_setuv>, but also handles 'set' magic.
void sv_setuv_mg(SV *sv, UV u)
+=for hackers
+Found in file sv.c
+
+=item sv_true
+
+Returns true if the SV has a true value by Perl's rules.
+
+ I32 sv_true(SV *sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_unmagic
+
+Removes magic from an SV.
+
+ int sv_unmagic(SV* sv, int type)
+
+=for hackers
+Found in file sv.c
+
=item sv_unref
Unsets the RV status of the SV, and decrements the reference count of
@@ -1988,6 +3038,9 @@ as a reversal of C<newSVrv>. See C<SvROK_off>.
void sv_unref(SV* sv)
+=for hackers
+Found in file sv.c
+
=item sv_upgrade
Upgrade an SV to a more complex form. Use C<SvUPGRADE>. See
@@ -1995,6 +3048,9 @@ C<svtype>.
bool sv_upgrade(SV* sv, U32 mt)
+=for hackers
+Found in file sv.c
+
=item sv_usepvn
Tells an SV to use C<ptr> to find its string value. Normally the string is
@@ -2007,12 +3063,58 @@ See C<sv_usepvn_mg>.
void sv_usepvn(SV* sv, char* ptr, STRLEN len)
+=for hackers
+Found in file sv.c
+
=item sv_usepvn_mg
Like C<sv_usepvn>, but also handles 'set' magic.
void sv_usepvn_mg(SV *sv, char *ptr, STRLEN len)
+=for hackers
+Found in file sv.c
+
+=item sv_utf8_downgrade
+
+Attempt to convert the PV of an SV from UTF8-encoded to byte encoding.
+This may not be possible if the PV contains non-byte encoding characters;
+if this is the case, either returns false or, if C<fail_ok> is not
+true, croaks.
+
+NOTE: this function is experimental and may change or be
+removed without notice.
+
+ bool sv_utf8_downgrade(SV *sv, bool fail_ok)
+
+=for hackers
+Found in file sv.c
+
+=item sv_utf8_encode
+
+Convert the PV of an SV to UTF8-encoded, but then turn off the C<SvUTF8>
+flag so that it looks like bytes again. Nothing calls this.
+
+NOTE: this function is experimental and may change or be
+removed without notice.
+
+ void sv_utf8_encode(SV *sv)
+
+=for hackers
+Found in file sv.c
+
+=item sv_utf8_upgrade
+
+Convert the PV of an SV to its UTF8-encoded form.
+
+NOTE: this function is experimental and may change or be
+removed without notice.
+
+ void sv_utf8_upgrade(SV *sv)
+
+=for hackers
+Found in file sv.c
+
=item sv_vcatpvfn
Processes its arguments like C<vsprintf> and appends the formatted output
@@ -2023,6 +3125,9 @@ locales).
void sv_vcatpvfn(SV* sv, const char* pat, STRLEN patlen, va_list* args, SV** svargs, I32 svmax, bool *maybe_tainted)
+=for hackers
+Found in file sv.c
+
=item sv_vsetpvfn
Works like C<vcatpvfn> but copies the text into the SV instead of
@@ -2030,6 +3135,9 @@ appending it.
void sv_vsetpvfn(SV* sv, const char* pat, STRLEN patlen, va_list* args, SV** svargs, I32 svmax, bool *maybe_tainted)
+=for hackers
+Found in file sv.c
+
=item THIS
Variable which is setup by C<xsubpp> to designate the object in a C++
@@ -2038,18 +3146,152 @@ L<perlxs/"Using XS With C++">.
(whatever) THIS
+=for hackers
+Found in file XSUB.h
+
=item toLOWER
Converts the specified character to lowercase.
char toLOWER(char ch)
+=for hackers
+Found in file handy.h
+
=item toUPPER
Converts the specified character to uppercase.
char toUPPER(char ch)
+=for hackers
+Found in file handy.h
+
+=item utf8_distance
+
+Returns the number of UTF8 characters between the UTF-8 pointers C<a>
+and C<b>.
+
+WARNING: use only if you *know* that the pointers point inside the
+same UTF-8 buffer.
+
+NOTE: this function is experimental and may change or be
+removed without notice.
+
+ IV utf8_distance(U8 *a, U8 *b)
+
+=for hackers
+Found in file utf8.c
+
+=item utf8_hop
+
+Return the UTF-8 pointer C<s> displaced by C<off> characters, either
+forward or backward.
+
+WARNING: do not use the following unless you *know* C<off> is within
+the UTF-8 data pointed to by C<s> *and* that on entry C<s> is aligned
+on the first byte of character or just after the last byte of a character.
+
+NOTE: this function is experimental and may change or be
+removed without notice.
+
+ U8* utf8_hop(U8 *s, I32 off)
+
+=for hackers
+Found in file utf8.c
+
+=item utf8_length
+
+Return the length of the UTF-8 char encoded string C<s> in characters.
+Stops at C<e> (inclusive). If C<e E<lt> s> or if the scan would end
+up past C<e>, croaks.
+
+NOTE: this function is experimental and may change or be
+removed without notice.
+
+ STRLEN utf8_length(U8* s, U8 *e)
+
+=for hackers
+Found in file utf8.c
+
+=item utf8_to_bytes
+
+Converts a string C<s> of length C<len> from UTF8 into byte encoding.
+Unlike C<bytes_to_utf8>, this over-writes the original string, and
+updates len to contain the new length.
+Returns zero on failure, setting C<len> to -1.
+
+NOTE: this function is experimental and may change or be
+removed without notice.
+
+ U8* utf8_to_bytes(U8 *s, STRLEN *len)
+
+=for hackers
+Found in file utf8.c
+
+=item utf8_to_uv
+
+Returns the character value of the first character in the string C<s>
+which is assumed to be in UTF8 encoding and no longer than C<curlen>;
+C<retlen> will be set to the length, in bytes, of that character.
+
+If C<s> does not point to a well-formed UTF8 character, the behaviour
+is dependent on the value of C<flags>: if it contains UTF8_CHECK_ONLY,
+it is assumed that the caller will raise a warning, and this function
+will silently just set C<retlen> to C<-1> and return zero. If the
+C<flags> does not contain UTF8_CHECK_ONLY, warnings about
+malformations will be given, C<retlen> will be set to the expected
+length of the UTF-8 character in bytes, and zero will be returned.
+
+The C<flags> can also contain various flags to allow deviations from
+the strict UTF-8 encoding (see F<utf8.h>).
+
+NOTE: this function is experimental and may change or be
+removed without notice.
+
+ UV utf8_to_uv(U8 *s, STRLEN curlen, STRLEN* retlen, U32 flags)
+
+=for hackers
+Found in file utf8.c
+
+=item utf8_to_uv_simple
+
+Returns the character value of the first character in the string C<s>
+which is assumed to be in UTF8 encoding; C<retlen> will be set to the
+length, in bytes, of that character.
+
+If C<s> does not point to a well-formed UTF8 character, zero is
+returned and retlen is set, if possible, to -1.
+
+NOTE: this function is experimental and may change or be
+removed without notice.
+
+ UV utf8_to_uv_simple(U8 *s, STRLEN* retlen)
+
+=for hackers
+Found in file utf8.c
+
+=item uv_to_utf8
+
+Adds the UTF8 representation of the Unicode codepoint C<uv> to the end
+of the string C<d>; C<d> should be have at least C<UTF8_MAXLEN+1> free
+bytes available. The return value is the pointer to the byte after the
+end of the new character. In other words,
+
+ d = uv_to_utf8(d, uv);
+
+is the recommended Unicode-aware way of saying
+
+ *(d++) = uv;
+
+NOTE: this function is experimental and may change or be
+removed without notice.
+
+ U8* uv_to_utf8(U8 *d, UV uv)
+
+=for hackers
+Found in file utf8.c
+
=item warn
This is the XSUB-writer's interface to Perl's C<warn> function. Use this
@@ -2058,6 +3300,9 @@ C<croak>.
void warn(const char* pat, ...)
+=for hackers
+Found in file util.c
+
=item XPUSHi
Push an integer onto the stack, extending the stack if necessary. Handles
@@ -2065,6 +3310,9 @@ Push an integer onto the stack, extending the stack if necessary. Handles
void XPUSHi(IV iv)
+=for hackers
+Found in file pp.h
+
=item XPUSHn
Push a double onto the stack, extending the stack if necessary. Handles
@@ -2072,6 +3320,9 @@ Push a double onto the stack, extending the stack if necessary. Handles
void XPUSHn(NV nv)
+=for hackers
+Found in file pp.h
+
=item XPUSHp
Push a string onto the stack, extending the stack if necessary. The C<len>
@@ -2080,6 +3331,9 @@ C<PUSHp>.
void XPUSHp(char* str, STRLEN len)
+=for hackers
+Found in file pp.h
+
=item XPUSHs
Push an SV onto the stack, extending the stack if necessary. Does not
@@ -2087,18 +3341,27 @@ handle 'set' magic. See C<PUSHs>.
void XPUSHs(SV* sv)
+=for hackers
+Found in file pp.h
+
=item XPUSHu
-Push an unsigned integer onto the stack, extending the stack if necessary.
+Push an unsigned integer onto the stack, extending the stack if necessary.
See C<PUSHu>.
void XPUSHu(UV uv)
+=for hackers
+Found in file pp.h
+
=item XS
Macro to declare an XSUB and its C parameter list. This is handled by
C<xsubpp>.
+=for hackers
+Found in file XSUB.h
+
=item XSRETURN
Return from XSUB, indicating number of items on the stack. This is usually
@@ -2106,48 +3369,72 @@ handled by C<xsubpp>.
void XSRETURN(int nitems)
+=for hackers
+Found in file XSUB.h
+
=item XSRETURN_EMPTY
Return an empty list from an XSUB immediately.
XSRETURN_EMPTY;
+=for hackers
+Found in file XSUB.h
+
=item XSRETURN_IV
Return an integer from an XSUB immediately. Uses C<XST_mIV>.
void XSRETURN_IV(IV iv)
+=for hackers
+Found in file XSUB.h
+
=item XSRETURN_NO
Return C<&PL_sv_no> from an XSUB immediately. Uses C<XST_mNO>.
XSRETURN_NO;
+=for hackers
+Found in file XSUB.h
+
=item XSRETURN_NV
Return an double from an XSUB immediately. Uses C<XST_mNV>.
void XSRETURN_NV(NV nv)
+=for hackers
+Found in file XSUB.h
+
=item XSRETURN_PV
Return a copy of a string from an XSUB immediately. Uses C<XST_mPV>.
void XSRETURN_PV(char* str)
+=for hackers
+Found in file XSUB.h
+
=item XSRETURN_UNDEF
Return C<&PL_sv_undef> from an XSUB immediately. Uses C<XST_mUNDEF>.
XSRETURN_UNDEF;
+=for hackers
+Found in file XSUB.h
+
=item XSRETURN_YES
Return C<&PL_sv_yes> from an XSUB immediately. Uses C<XST_mYES>.
XSRETURN_YES;
+=for hackers
+Found in file XSUB.h
+
=item XST_mIV
Place an integer into the specified position C<pos> on the stack. The
@@ -2155,6 +3442,9 @@ value is stored in a new mortal SV.
void XST_mIV(int pos, IV iv)
+=for hackers
+Found in file XSUB.h
+
=item XST_mNO
Place C<&PL_sv_no> into the specified position C<pos> on the
@@ -2162,6 +3452,9 @@ stack.
void XST_mNO(int pos)
+=for hackers
+Found in file XSUB.h
+
=item XST_mNV
Place a double into the specified position C<pos> on the stack. The value
@@ -2169,6 +3462,9 @@ is stored in a new mortal SV.
void XST_mNV(int pos, NV nv)
+=for hackers
+Found in file XSUB.h
+
=item XST_mPV
Place a copy of a string into the specified position C<pos> on the stack.
@@ -2176,6 +3472,9 @@ The value is stored in a new mortal SV.
void XST_mPV(int pos, char* str)
+=for hackers
+Found in file XSUB.h
+
=item XST_mUNDEF
Place C<&PL_sv_undef> into the specified position C<pos> on the
@@ -2183,6 +3482,9 @@ stack.
void XST_mUNDEF(int pos)
+=for hackers
+Found in file XSUB.h
+
=item XST_mYES
Place C<&PL_sv_yes> into the specified position C<pos> on the
@@ -2190,11 +3492,17 @@ stack.
void XST_mYES(int pos)
+=for hackers
+Found in file XSUB.h
+
=item XS_VERSION
The version identifier for an XS module. This is usually
handled automatically by C<ExtUtils::MakeMaker>. See C<XS_VERSION_BOOTCHECK>.
+=for hackers
+Found in file XSUB.h
+
=item XS_VERSION_BOOTCHECK
Macro to verify that a PM module's $VERSION variable matches the XS
@@ -2203,6 +3511,9 @@ C<xsubpp>. See L<perlxs/"The VERSIONCHECK: Keyword">.
XS_VERSION_BOOTCHECK;
+=for hackers
+Found in file XSUB.h
+
=item Zero
The XSUB-writer's interface to the C C<memzero> function. The C<dest> is the
@@ -2210,6 +3521,9 @@ destination, C<nitems> is the number of items, and C<type> is the type.
void Zero(void* dest, int nitems, type)
+=for hackers
+Found in file handy.h
+
=back
=head1 AUTHORS
diff --git a/gnu/usr.bin/perl/pod/perlboot.pod b/gnu/usr.bin/perl/pod/perlboot.pod
index b549f45e490..3c18246f0ca 100644
--- a/gnu/usr.bin/perl/pod/perlboot.pod
+++ b/gnu/usr.bin/perl/pod/perlboot.pod
@@ -790,9 +790,13 @@ Hopefully, this gets you started, though.
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>.
+tutorial for those who already know objects), L<perltootc> (dealing
+with class data), L<perlbot> (for some more tricks), and books such as
+Damian Conway's excellent I<Object Oriented Perl>.
+
+Some modules which might prove interesting are Class::Accessor,
+Class::Class, Class::Contract, Class::Data::Inheritable,
+Class::MethodMaker and Tie::SecureHash
=head1 COPYRIGHT
diff --git a/gnu/usr.bin/perl/pod/perlclib.pod b/gnu/usr.bin/perl/pod/perlclib.pod
new file mode 100644
index 00000000000..a0f4a80eecd
--- /dev/null
+++ b/gnu/usr.bin/perl/pod/perlclib.pod
@@ -0,0 +1,197 @@
+=head1 NAME
+
+perlclib - Internal replacements for standard C library functions
+
+=head1 DESCRIPTION
+
+One thing Perl porters should note is that F<perl> doesn't tend to use that
+much of the C standard library internally; you'll see very little use of,
+for example, the F<ctype.h> functions in there. This is because Perl
+tends to reimplement or abstract standard library functions, so that we
+know exactly how they're going to operate.
+
+This is a reference card for people who are familiar with the C library
+and who want to do things the Perl way; to tell them which functions
+they ought to use instead of the more normal C functions.
+
+=head2 Conventions
+
+In the following tables:
+
+=over 3
+
+=item C<t>
+
+is a type.
+
+=item C<p>
+
+is a pointer.
+
+=item C<n>
+
+is a number.
+
+=item C<s>
+
+is a string.
+
+=back
+
+C<sv>, C<av>, C<hv>, etc. represent variables of their respective types.
+
+=head2 File Operations
+
+Instead of the F<stdio.h> functions, you should use the Perl abstraction
+layer. Instead of C<FILE*> types, you need to be handling C<PerlIO*>
+types. Don't forget that with the new PerlIO layered I/O abstraction
+C<FILE*> types may not even be available. See also the C<perlapio>
+documentation for more information about the following functions:
+
+ Instead Of: Use:
+
+ stdin PerlIO_stdin()
+ stdout PerlIO_stdout()
+ stderr PerlIO_stderr()
+
+ fopen(fn, mode) PerlIO_open(fn, mode)
+ freopen(fn, mode, stream) PerlIO_reopen(fn, mode, perlio) (Deprecated)
+ fflush(stream) PerlIO_flush(perlio)
+ fclose(stream) PerlIO_close(perlio)
+
+=head2 File Input and Output
+
+ Instead Of: Use:
+
+ fprintf(stream, fmt, ...) PerlIO_printf(perlio, fmt, ...)
+
+ [f]getc(stream) PerlIO_getc(perlio)
+ [f]putc(stream, n) PerlIO_putc(perlio, n)
+ ungetc(n, stream) PerlIO_ungetc(perlio, n)
+
+Note that the PerlIO equivalents of C<fread> and C<fwrite> are slightly
+different from their C library counterparts:
+
+ fread(p, size, n, stream) PerlIO_read(perlio, buf, numbytes)
+ fwrite(p, size, n, stream) PerlIO_write(perlio, buf, numbytes)
+
+ fputs(s, stream) PerlIO_puts(perlio, s)
+
+There is no equivalent to C<fgets>; one should use C<sv_gets> instead:
+
+ fgets(s, n, stream) sv_gets(sv, perlio, append)
+
+=head2 File Positioning
+
+ Instead Of: Use:
+
+ feof(stream) PerlIO_eof(perlio)
+ fseek(stream, n, whence) PerlIO_seek(perlio, n, whence)
+ rewind(stream) PerlIO_rewind(perlio)
+
+ fgetpos(stream, p) PerlIO_getpos(perlio, sv)
+ fsetpos(stream, p) PerlIO_setpos(perlio, sv)
+
+ ferror(stream) PerlIO_error(perlio)
+ clearerr(stream) PerlIO_clearerr(perlio)
+
+=head2 Memory Management and String Handling
+
+ Instead Of: Use:
+
+ t* p = malloc(n) New(id, p, n, t)
+ t* p = calloc(n, s) Newz(id, p, n, t)
+ p = realloc(p, n) Renew(p, n, t)
+ memcpy(dst, src, n) Copy(src, dst, n, t)
+ memmove(dst, src, n) Move(src, dst, n, t)
+ memcpy/*(struct foo *) StructCopy(src, dst, t)
+ free(p) Safefree(p)
+
+ strdup(p) savepv(p)
+ strndup(p, n) savepvn(p, n) (Hey, strndup doesn't exist!)
+
+ strstr(big, little) instr(big, little)
+ strcmp(s1, s2) strLE(s1, s2) / strEQ(s1, s2) / strGT(s1,s2)
+ strncmp(s1, s2, n) strnNE(s1, s2, n) / strnEQ(s1, s2, n)
+
+Notice the different order of arguments to C<Copy> and C<Move> than used
+in C<memcpy> and C<memmove>.
+
+Most of the time, though, you'll want to be dealing with SVs internally
+instead of raw C<char *> strings:
+
+ strlen(s) sv_len(sv)
+ strcpy(dt, src) sv_setpv(sv, s)
+ strncpy(dt, src, n) sv_setpvn(sv, s, n)
+ strcat(dt, src) sv_catpv(sv, s)
+ strncat(dt, src) sv_catpvn(sv, s)
+ sprintf(s, fmt, ...) sv_setpvf(sv, fmt, ...)
+
+Note also the existence of C<sv_catpvf> and C<sv_catpvfn>, combining
+concatenation with formatting.
+
+=head2 Character Class Tests
+
+There are two types of character class tests that Perl implements: one
+type deals in C<char>s and are thus B<not> Unicode aware (and hence
+deprecated unless you B<know> you should use them) and the other type
+deal in C<UV>s and know about Unicode properties. In the following
+table, C<c> is a C<char>, and C<u> is a Unicode codepoint.
+
+ Instead Of: Use: But better use:
+
+ isalnum(c) isALNUM(c) isALNUM_uni(u)
+ isalpha(c) isALPHA(c) isALPHA_uni(u)
+ iscntrl(c) isCNTRL(c) isCNTRL_uni(u)
+ isdigit(c) isDIGIT(c) isDIGIT_uni(u)
+ isgraph(c) isGRAPH(c) isGRAPH_uni(u)
+ islower(c) isLOWER(c) isLOWER_uni(u)
+ isprint(c) isPRINT(c) isPRINT_uni(u)
+ ispunct(c) isPUNCT(c) isPUNCT_uni(u)
+ isspace(c) isSPACE(c) isSPACE_uni(u)
+ isupper(c) isUPPER(c) isUPPER_uni(u)
+ isxdigit(c) isXDIGIT(c) isXDIGIT_uni(u)
+
+ tolower(c) toLOWER(c) toLOWER_uni(u)
+ toupper(c) toUPPER(c) toUPPER_uni(u)
+
+=head2 F<stdlib.h> functions
+
+ Instead Of: Use:
+
+ atof(s) Atof(s)
+ atol(s) Atol(s)
+ strtod(s, *p) Nothing. Just don't use it.
+ strtol(s, *p, n) Strtol(s, *p, n)
+ strtoul(s, *p, n) Strtoul(s, *p, n)
+
+Notice also the C<scan_bin>, C<scan_hex>, and C<scan_oct> functions in
+F<util.c> for converting strings representing numbers in the respective
+bases into C<NV>s.
+
+In theory C<Strtol> and C<Strtoul> may not be defined if the machine perl is
+built on doesn't actually have strtol and strtoul. But as those 2
+functions are part of the 1989 ANSI C spec we suspect you'll find them
+everywhere by now.
+
+ int rand() double Drand01()
+ srand(n) { seedDrand01((Rand_seed_t)n);
+ PL_srand_called = TRUE; }
+
+ exit(n) my_exit(n)
+ system(s) Don't. Look at pp_system or use my_popen
+
+ getenv(s) PerlEnv_getenv(s)
+ setenv(s, val) my_putenv(s, val)
+
+=head2 Miscellaneous functions
+
+You should not even B<want> to use F<setjmp.h> functions, but if you
+think you do, use the C<JMPENV> stack in F<scope.h> instead.
+
+For C<signal>/C<sigaction>, use C<rsignal(signo, handler)>.
+
+=head1 SEE ALSO
+
+C<perlapi>, C<perlapio>, C<perlguts>
+
diff --git a/gnu/usr.bin/perl/pod/perlcompile.pod b/gnu/usr.bin/perl/pod/perlcompile.pod
index 697cb80d409..282592e9fb1 100644
--- a/gnu/usr.bin/perl/pod/perlcompile.pod
+++ b/gnu/usr.bin/perl/pod/perlcompile.pod
@@ -183,9 +183,6 @@ one-liners:
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:
@@ -308,7 +305,7 @@ I<assemble> program that produces bytecode.
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.
+start to finish, with no possibility of branching or halting.
=item B::Bytecode
@@ -369,12 +366,12 @@ 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
+file. To get 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:
+To get a list of the my() variables used in the file myperlprogram:
$ perl -MO=Showlex myperlprogram
@@ -419,7 +416,7 @@ 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> outside the running subroutine (C<goto &sub> is okay).
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
diff --git a/gnu/usr.bin/perl/pod/perldbmfilter.pod b/gnu/usr.bin/perl/pod/perldbmfilter.pod
index 3350596aab8..8384999e6a7 100644
--- a/gnu/usr.bin/perl/pod/perldbmfilter.pod
+++ b/gnu/usr.bin/perl/pod/perldbmfilter.pod
@@ -124,7 +124,7 @@ 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" ;
+ $hash{12345} = "something" ;
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
diff --git a/gnu/usr.bin/perl/pod/perldebguts.pod b/gnu/usr.bin/perl/pod/perldebguts.pod
index b74f3efb6ba..20cc5460fd4 100644
--- a/gnu/usr.bin/perl/pod/perldebguts.pod
+++ b/gnu/usr.bin/perl/pod/perldebguts.pod
@@ -13,17 +13,17 @@ intimate with Perl's guts to understand. Caveat lector.
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
+with the I<perl -Dxxx> command described in L<perlrun>, which is
+usable only if a special Perl is built per the instructions in 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
+frame was called with are copied to 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
+=over 4
=item *
@@ -32,20 +32,22 @@ Perl inserts the contents of C<$ENV{PERL5DB}> (or C<BEGIN {require
=item *
-The array C<@{"_<$filename"}> holds the lines of $filename for all
-files compiled by Perl. The same for C<eval>ed strings that contain
+Each array C<@{"_<$filename"}> holds the lines of $filename for a
+file compiled by Perl. The same for C<eval>ed strings that contain
subroutines, or which are currently being executed. The $filename
for C<eval>ed strings looks like C<(eval 34)>. Code assertions
-in regexes look like C<(re_eval 19)>.
+in regexes look like C<(re_eval 19)>.
+
+Values in this array are magical in numeric context: they compare
+equal to zero only if the line is not breakable.
=item *
-The hash C<%{"_<$filename"}> contains breakpoints and actions keyed
+Each hash C<%{"_<$filename"}> contains breakpoints and actions keyed
by line number. Individual entries (as opposed to the whole hash)
are settable. Perl only cares about Boolean true here, although
the values used by F<perl5db.pl> have the form
-C<"$break_condition\0$action">. Values in this hash are magical
-in numeric context: they are zeros if the line is not breakable.
+C<"$break_condition\0$action">.
The same holds for evaluated strings that contain subroutines, or
which are currently being executed. The $filename for C<eval>ed strings
@@ -53,7 +55,7 @@ looks like C<(eval 34)> or C<(re_eval 19)>.
=item *
-The scalar C<${"_<$filename"}> contains C<"_<$filename">. This is
+Each scalar C<${"_<$filename"}> contains C<"_<$filename">. This is
also the case for evaluated strings that contain subroutines, or
which are currently being executed. The $filename for C<eval>ed
strings looks like C<(eval 34)> or C<(re_eval 19)>.
@@ -154,7 +156,7 @@ 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
+C<count> is missing). Each entry is reference to 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>.
@@ -400,7 +402,7 @@ shorter than 7 chars.
The fields of interest which may appear in the last line are
-=over
+=over 4
=item C<anchored> I<STRING> C<at> I<POS>
@@ -630,7 +632,7 @@ 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
+astonished. This is not absolutely true, but may provide a good
grasp of what happens.
Assume that an integer cannot take less than 20 bytes of memory, a
@@ -639,7 +641,7 @@ 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
+20 bytes. A sloppy malloc(3) implementation can inflate these
numbers dramatically.
On the opposite end of the scale, a declaration like
@@ -666,7 +668,7 @@ the top level of the Perl source tree.
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}
+usage statistics after compiling your code when 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:
@@ -686,12 +688,12 @@ the following example:
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
+your execution using the mstat() function out of the standard
Devel::Peek module.
Here is some explanation of that format:
-=over
+=over 4
=item C<buckets SMALLEST(APPROX)..GREATEST(APPROX)>
@@ -720,7 +722,7 @@ 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
+For example, suppose under the previous example, the memory footprints
were
free: 8 16 32 64 128 256 512 1024 2048 4096 8192
@@ -804,7 +806,7 @@ To see this list, insert two C<warn('!...')> statements around the call:
do 'lib/auto/POSIX/autosplit.ix';
warn('!!! "after"');
-and run it with PErl's B<-DL> option. The first warn() will print
+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
@@ -838,11 +840,11 @@ per glob - for glob name, and glob stringification magic.
Here are explanations for other I<Id>s above:
-=over
+=over 4
=item C<717>
-CReates bigger C<XPV*> structures. In the case above, it
+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
@@ -892,7 +894,7 @@ these categories.
If warn() string starts with
-=over
+=over 4
=item C<!!!>
diff --git a/gnu/usr.bin/perl/pod/perldebtut.pod b/gnu/usr.bin/perl/pod/perldebtut.pod
new file mode 100644
index 00000000000..e11102e5676
--- /dev/null
+++ b/gnu/usr.bin/perl/pod/perldebtut.pod
@@ -0,0 +1,721 @@
+=head1 NAME
+
+perldebtut - Perl debugging tutorial
+
+=head1 DESCRIPTION
+
+A (very) lightweight introduction in the use of the perl debugger, and a
+pointer to existing, deeper sources of information on the subject of debugging
+perl programs.
+
+There's an extraordinary number of people out there who don't appear to know
+anything about using the perl debugger, though they use the language every
+day.
+This is for them.
+
+
+=head1 use strict
+
+First of all, there's a few things you can do to make your life a lot more
+straightforward when it comes to debugging perl programs, without using the
+debugger at all. To demonstrate, here's a simple script with a problem:
+
+ #!/usr/bin/perl
+
+ $var1 = 'Hello World'; # always wanted to do that :-)
+ $var2 = "$varl\n";
+
+ print $var2;
+ exit;
+
+While this compiles and runs happily, it probably won't do what's expected,
+namely it doesn't print "Hello World\n" at all; It will on the other hand do
+exactly what it was told to do, computers being a bit that way inclined. That
+is, it will print out a newline character, and you'll get what looks like a
+blank line. It looks like there's 2 variables when (because of the typo)
+there's really 3:
+
+ $var1 = 'Hello World'
+ $varl = undef
+ $var2 = "\n"
+
+To catch this kind of problem, we can force each variable to be declared
+before use by pulling in the strict module, by putting 'use strict;' after the
+first line of the script.
+
+Now when you run it, perl complains about the 3 undeclared variables and we
+get four error messages because one variable is referenced twice:
+
+ Global symbol "$var1" requires explicit package name at ./t1 line 4.
+ Global symbol "$var2" requires explicit package name at ./t1 line 5.
+ Global symbol "$varl" requires explicit package name at ./t1 line 5.
+ Global symbol "$var2" requires explicit package name at ./t1 line 7.
+ Execution of ./hello aborted due to compilation errors.
+
+Luvverly! and to fix this we declare all variables explicitly and now our
+script looks like this:
+
+ #!/usr/bin/perl
+ use strict;
+
+ my $var1 = 'Hello World';
+ my $varl = '';
+ my $var2 = "$varl\n";
+
+ print $var2;
+ exit;
+
+We then do (always a good idea) a syntax check before we try to run it again:
+
+ > perl -c hello
+ hello syntax OK
+
+And now when we run it, we get "\n" still, but at least we know why. Just
+getting this script to compile has exposed the '$varl' (with the letter 'l)
+variable, and simply changing $varl to $var1 solves the problem.
+
+
+=head1 Looking at data and -w and w
+
+Ok, but how about when you want to really see your data, what's in that
+dynamic variable, just before using it?
+
+ #!/usr/bin/perl
+ use strict;
+
+ my $key = 'welcome';
+ my %data = (
+ 'this' => qw(that),
+ 'tom' => qw(and jerry),
+ 'welcome' => q(Hello World),
+ 'zip' => q(welcome),
+ );
+ my @data = keys %data;
+
+ print "$data{$key}\n";
+ exit;
+
+Looks OK, after it's been through the syntax check (perl -c scriptname), we
+run it and all we get is a blank line again! Hmmmm.
+
+One common debugging approach here, would be to liberally sprinkle a few print
+statements, to add a check just before we print out our data, and another just
+after:
+
+ print "All OK\n" if grep($key, keys %data);
+ print "$data{$key}\n";
+ print "done: '$data{$key}'\n";
+
+And try again:
+
+ > perl data
+ All OK
+
+ done: ''
+
+After much staring at the same piece of code and not seeing the wood for the
+trees for some time, we get a cup of coffee and try another approach. That
+is, we bring in the cavalry by giving perl the 'B<-d>' switch on the command
+line:
+
+ > perl -d data
+ Default die handler restored.
+
+ Loading DB routines from perl5db.pl version 1.07
+ Editor support available.
+
+ Enter h or `h h' for help, or `man perldebug' for more help.
+
+ main::(./data:4): my $key = 'welcome';
+
+Now, what we've done here is to launch the built-in perl debugger on our
+script. It's stopped at the first line of executable code and is waiting for
+input.
+
+Before we go any further, you'll want to know how to quit the debugger: use
+just the letter 'B<q>', not the words 'quit' or 'exit':
+
+ DB<1> q
+ >
+
+That's it, you're back on home turf again.
+
+
+=head1 help
+
+Fire the debugger up again on your script and we'll look at the help menu.
+There's a couple of ways of calling help: a simple 'B<h>' will get you a long
+scrolled list of help, 'B<|h>' (pipe-h) will pipe the help through your pager
+('more' or 'less' probably), and finally, 'B<h h>' (h-space-h) will give you a
+helpful mini-screen snapshot:
+
+ DB<1> h h
+ List/search source lines: Control script execution:
+ l [ln|sub] List source code T Stack trace
+ - or . List previous/current line s [expr] Single step [in expr]
+ w [line] List around line n [expr] Next, steps over subs
+ f filename View source in file <CR/Enter> Repeat last n or s
+ /pattern/ ?patt? Search forw/backw r Return from subroutine
+ v Show versions of modules c [ln|sub] Continue until position
+ Debugger controls: L List
+break/watch/actions
+ O [...] Set debugger options t [expr] Toggle trace [trace expr]
+ <[<]|{[{]|>[>] [cmd] Do pre/post-prompt b [ln|event|sub] [cnd] Set breakpoint
+ ! [N|pat] Redo a previous command d [ln] or D Delete a/all breakpoints
+ H [-num] Display last num commands a [ln] cmd Do cmd before line
+ = [a val] Define/list an alias W expr Add a watch expression
+ h [db_cmd] Get help on command A or W Delete all actions/watch
+ |[|]db_cmd Send output to pager ![!] syscmd Run cmd in a subprocess
+ q or ^D Quit R Attempt a restart
+ Data Examination: expr Execute perl code, also see: s,n,t expr
+ x|m expr Evals expr in list context, dumps the result or lists methods.
+ p expr Print expression (uses script's current package).
+ S [[!]pat] List subroutine names [not] matching pattern
+ V [Pk [Vars]] List Variables in Package. Vars can be ~pattern or !pattern.
+ X [Vars] Same as "V current_package [Vars]".
+ For more help, type h cmd_letter, or run man perldebug for all docs.
+
+More confusing options than you can shake a big stick at! It's not as bad as
+it looks and it's very useful to know more about all of it, and fun too!
+
+There's a couple of useful ones to know about straight away. You wouldn't
+think we're using any libraries at all at the moment, but 'B<v>' will show
+which modules are currently loaded, by the debugger as well your script.
+'B<V>' and 'B<X>' show variables in the program by package scope and can be
+constrained by pattern. 'B<m>' shows methods and 'B<S>' shows all subroutines
+(by pattern):
+
+ DB<2>S str
+ dumpvar::stringify
+ strict::bits
+ strict::import
+ strict::unimport
+
+Using 'X' and cousins requires you not to use the type identifiers ($@%), just
+the 'name':
+
+ DM<3>X ~err
+ FileHandle(stderr) => fileno(2)
+
+Remember we're in our tiny program with a problem, we should have a look at
+where we are, and what our data looks like. First of all let's have a window
+on our present position (the first line of code in this case), via the letter
+'B<w>':
+
+ DB<4> w
+ 1 #!/usr/bin/perl
+ 2: use strict;
+ 3
+ 4==> my $key = 'welcome';
+ 5: my %data = (
+ 6 'this' => qw(that),
+ 7 'tom' => qw(and jerry),
+ 8 'welcome' => q(Hello World),
+ 9 'zip' => q(welcome),
+ 10 );
+
+At line number 4 is a helpful pointer, that tells you where you are now. To
+see more code, type 'w' again:
+
+ DB<4> w
+ 8 'welcome' => q(Hello World),
+ 9 'zip' => q(welcome),
+ 10 );
+ 11: my @data = keys %data;
+ 12: print "All OK\n" if grep($key, keys %data);
+ 13: print "$data{$key}\n";
+ 14: print "done: '$data{$key}'\n";
+ 15: exit;
+
+And if you wanted to list line 5 again, type 'l 5', (note the space):
+
+ DB<4> l 5
+ 5: my %data = (
+
+In this case, there's not much to see, but of course normally there's pages of
+stuff to wade through, and 'l' can be very useful. To reset your view to the
+line we're about to execute, type a lone period '.':
+
+ DB<5> .
+ main::(./data_a:4): my $key = 'welcome';
+
+The line shown is the one that is about to be executed B<next>, it hasn't
+happened yet. So while we can print a variable with the letter 'B<p>', at
+this point all we'd get is an empty (undefined) value back. What we need to
+do is to step through the next executable statement with an 'B<s>':
+
+ DB<6> s
+ main::(./data_a:5): my %data = (
+ main::(./data_a:6): 'this' => qw(that),
+ main::(./data_a:7): 'tom' => qw(and jerry),
+ main::(./data_a:8): 'welcome' => q(Hello World),
+ main::(./data_a:9): 'zip' => q(welcome),
+ main::(./data_a:10): );
+
+Now we can have a look at that first ($key) variable:
+
+ DB<7> p $key
+ welcome
+
+line 13 is where the action is, so let's continue down to there via the letter
+'B<c>', which by the way, inserts a 'one-time-only' breakpoint at the given
+line or sub routine:
+
+ DB<8> c 13
+ All OK
+ main::(./data_a:13): print "$data{$key}\n";
+
+We've gone past our check (where 'All OK' was printed) and have stopped just
+before the meat of our task. We could try to print out a couple of variables
+to see what is happening:
+
+ DB<9> p $data{$key}
+
+Not much in there, lets have a look at our hash:
+
+ DB<10> p %data
+ Hello Worldziptomandwelcomejerrywelcomethisthat
+
+ DB<11> p keys %data
+ Hello Worldtomwelcomejerrythis
+
+Well, this isn't very easy to read, and using the helpful manual (B<h h>), the
+'B<x>' command looks promising:
+
+ DB<12> x %data
+ 0 'Hello World'
+ 1 'zip'
+ 2 'tom'
+ 3 'and'
+ 4 'welcome'
+ 5 undef
+ 6 'jerry'
+ 7 'welcome'
+ 8 'this'
+ 9 'that'
+
+That's not much help, a couple of welcomes in there, but no indication of
+which are keys, and which are values, it's just a listed array dump and, in
+this case, not particularly helpful. The trick here, is to use a B<reference>
+to the data structure:
+
+ DB<13> x \%data
+ 0 HASH(0x8194bc4)
+ 'Hello World' => 'zip'
+ 'jerry' => 'welcome'
+ 'this' => 'that'
+ 'tom' => 'and'
+ 'welcome' => undef
+
+The reference is truly dumped and we can finally see what we're dealing with.
+Our quoting was perfectly valid but wrong for our purposes, with 'and jerry'
+being treated as 2 separate words rather than a phrase, thus throwing the
+evenly paired hash structure out of alignment.
+
+The 'B<-w>' switch would have told us about this, had we used it at the start,
+and saved us a lot of trouble:
+
+ > perl -w data
+ Odd number of elements in hash assignment at ./data line 5.
+
+We fix our quoting: 'tom' => q(and jerry), and run it again, this time we get
+our expected output:
+
+ > perl -w data
+ Hello World
+
+
+While we're here, take a closer look at the 'B<x>' command, it's really useful
+and will merrily dump out nested references, complete objects, partial objects
+- just about whatever you throw at it:
+
+Let's make a quick object and x-plode it, first we'll start the the debugger:
+it wants some form of input from STDIN, so we give it something non-commital,
+a zero:
+
+ > perl -de 0
+ Default die handler restored.
+
+ Loading DB routines from perl5db.pl version 1.07
+ Editor support available.
+
+ Enter h or `h h' for help, or `man perldebug' for more help.
+
+ main::(-e:1): 0
+
+Now build an on-the-fly object over a couple of lines (note the backslash):
+
+ DB<1> $obj = bless({'unique_id'=>'123', 'attr'=> \
+ cont: {'col' => 'black', 'things' => [qw(this that etc)]}}, 'MY_class')
+
+And let's have a look at it:
+
+ DB<2> x $obj
+ 0 MY_class=HASH(0x828ad98)
+ 'attr' => HASH(0x828ad68)
+ 'col' => 'black'
+ 'things' => ARRAY(0x828abb8)
+ 0 'this'
+ 1 'that'
+ 2 'etc'
+ 'unique_id' => 123
+ DB<3>
+
+Useful, huh? You can eval nearly anything in there, and experiment with bits
+of code or regexes until the cows come home:
+
+ DB<3> @data = qw(this that the other atheism leather theory scythe)
+
+ DB<4> p 'saw -> '.($cnt += map { print "\t:\t$_\n" } grep(/the/, sort @data))
+ atheism
+ leather
+ other
+ scythe
+ the
+ theory
+ saw -> 6
+
+If you want to see the command History, type an 'B<H>':
+
+ DB<5> H
+ 4: p 'saw -> '.($cnt += map { print "\t:\t$_\n" } grep(/the/, sort @data))
+ 3: @data = qw(this that the other atheism leather theory scythe)
+ 2: x $obj
+ 1: $obj = bless({'unique_id'=>'123', 'attr'=>
+ {'col' => 'black', 'things' => [qw(this that etc)]}}, 'MY_class')
+ DB<5>
+
+And if you want to repeat any previous command, use the exclamation: 'B<!>':
+
+ DB<5> !4
+ p 'saw -> '.($cnt += map { print "$_\n" } grep(/the/, sort @data))
+ atheism
+ leather
+ other
+ scythe
+ the
+ theory
+ saw -> 12
+
+For more on references see L<perlref> and L<perlreftut>
+
+
+=head1 Stepping through code
+
+Here's a simple program which converts between Celsius and Fahrenheit, it too
+has a problem:
+
+ #!/usr/bin/perl -w
+ use strict;
+
+ my $arg = $ARGV[0] || '-c20';
+
+ if ($arg =~ /^\-(c|f)((\-|\+)*\d+(\.\d+)*)$/) {
+ my ($deg, $num) = ($1, $2);
+ my ($in, $out) = ($num, $num);
+ if ($deg eq 'c') {
+ $deg = 'f';
+ $out = &c2f($num);
+ } else {
+ $deg = 'c';
+ $out = &f2c($num);
+ }
+ $out = sprintf('%0.2f', $out);
+ $out =~ s/^((\-|\+)*\d+)\.0+$/$1/;
+ print "$out $deg\n";
+ } else {
+ print "Usage: $0 -[c|f] num\n";
+ }
+ exit;
+
+ sub f2c {
+ my $f = shift;
+ my $c = 5 * $f - 32 / 9;
+ return $c;
+ }
+
+ sub c2f {
+ my $c = shift;
+ my $f = 9 * $c / 5 + 32;
+ return $f;
+ }
+
+
+For some reason, the Fahrenheit to Celsius conversion fails to return the
+expected output. This is what it does:
+
+ > temp -c0.72
+ 33.30 f
+
+ > temp -f33.3
+ 162.94 c
+
+Not very consistent! We'll set a breakpoint in the code manually and run it
+under the debugger to see what's going on. A breakpoint is a flag, to which
+the debugger will run without interruption, when it reaches the breakpoint, it
+will stop execution and offer a prompt for further interaction. In normal
+use, these debugger commands are completely ignored, and they are safe - if a
+little messy, to leave in production code.
+
+ my ($in, $out) = ($num, $num);
+ $DB::single=2; # insert at line 9!
+ if ($deg eq 'c')
+ ...
+
+ > perl -d temp -f33.3
+ Default die handler restored.
+
+ Loading DB routines from perl5db.pl version 1.07
+ Editor support available.
+
+ Enter h or `h h' for help, or `man perldebug' for more help.
+
+ main::(temp:4): my $arg = $ARGV[0] || '-c100';
+
+We'll simply continue down to our pre-set breakpoint with a 'B<c>':
+
+ DB<1> c
+ main::(temp:10): if ($deg eq 'c') {
+
+Followed by a window command to see where we are:
+
+ DB<1> w
+ 7: my ($deg, $num) = ($1, $2);
+ 8: my ($in, $out) = ($num, $num);
+ 9: $DB::single=2;
+ 10==> if ($deg eq 'c') {
+ 11: $deg = 'f';
+ 12: $out = &c2f($num);
+ 13 } else {
+ 14: $deg = 'c';
+ 15: $out = &f2c($num);
+ 16 }
+
+And a print to show what values we're currently using:
+
+ DB<1> p $deg, $num
+ f33.3
+
+We can put another break point on any line beginning with a colon, we'll use
+line 17 as that's just as we come out of the subroutine, and we'd like to
+pause there later on:
+
+ DB<2> b 17
+
+There's no feedback from this, but you can see what breakpoints are set by
+using the list 'L' command:
+
+ DB<3> L
+ temp:
+ 17: print "$out $deg\n";
+ break if (1)
+
+Note that to delete a breakpoint you use 'd' or 'D'.
+
+Now we'll continue down into our subroutine, this time rather than by line
+number, we'll use the subroutine name, followed by the now familiar 'w':
+
+ DB<3> c f2c
+ main::f2c(temp:30): my $f = shift;
+
+ DB<4> w
+ 24: exit;
+ 25
+ 26 sub f2c {
+ 27==> my $f = shift;
+ 28: my $c = 5 * $f - 32 / 9;
+ 29: return $c;
+ 30 }
+ 31
+ 32 sub c2f {
+ 33: my $c = shift;
+
+
+Note that if there was a subroutine call between us and line 29, and we wanted
+to B<single-step> through it, we could use the 'B<s>' command, and to step
+over it we would use 'B<n>' which would execute the sub, but not descend into
+it for inspection. In this case though, we simply continue down to line 29:
+
+ DB<4> c 29
+ main::f2c(temp:29): return $c;
+
+And have a look at the return value:
+
+ DB<5> p $c
+ 162.944444444444
+
+This is not the right answer at all, but the sum looks correct. I wonder if
+it's anything to do with operator precedence? We'll try a couple of other
+possibilities with our sum:
+
+ DB<6> p (5 * $f - 32 / 9)
+ 162.944444444444
+
+ DB<7> p 5 * $f - (32 / 9)
+ 162.944444444444
+
+ DB<8> p (5 * $f) - 32 / 9
+ 162.944444444444
+
+ DB<9> p 5 * ($f - 32) / 9
+ 0.722222222222221
+
+:-) that's more like it! Ok, now we can set our return variable and we'll
+return out of the sub with an 'r':
+
+ DB<10> $c = 5 * ($f - 32) / 9
+
+ DB<11> r
+ scalar context return from main::f2c: 0.722222222222221
+
+Looks good, let's just continue off the end of the script:
+
+ DB<12> c
+ 0.72 c
+ Debugged program terminated. Use q to quit or R to restart,
+ use O inhibit_exit to avoid stopping after program termination,
+ h q, h R or h O to get additional info.
+
+A quick fix to the offending line (insert the missing parentheses) in the
+actual program and we're finished.
+
+
+=head1 Placeholder for a, w, t, T
+
+Actions, watch variables, stack traces etc.: on the TODO list.
+
+ a
+
+ W
+
+ t
+
+ T
+
+
+=head1 REGULAR EXPRESSIONS
+
+Ever wanted to know what a regex looked like? You'll need perl compiled with
+the DEBUGGING flag for this one:
+
+ > perl -Dr -e '/^pe(a)*rl$/i'
+ Compiling REx `^pe(a)*rl$'
+ size 17 first at 2
+ rarest char
+ at 0
+ 1: BOL(2)
+ 2: EXACTF <pe>(4)
+ 4: CURLYN[1] {0,32767}(14)
+ 6: NOTHING(8)
+ 8: EXACTF <a>(0)
+ 12: WHILEM(0)
+ 13: NOTHING(14)
+ 14: EXACTF <rl>(16)
+ 16: EOL(17)
+ 17: END(0)
+ floating `'$ at 4..2147483647 (checking floating) stclass `EXACTF <pe>'
+anchored(BOL) minlen 4
+ Omitting $` $& $' support.
+
+ EXECUTING...
+
+ Freeing REx: `^pe(a)*rl$'
+
+Did you really want to know? :-)
+For more gory details on getting regular expressions to work, have a look at
+L<perlre>, L<perlretut>, and to decode the mysterious labels (BOL and CURLYN,
+etc. above), see L<perldebguts>.
+
+
+=head1 OUTPUT TIPS
+
+To get all the output from your error log, and not miss any messages via
+helpful operating system buffering, insert a line like this, at the start of
+your script:
+
+ $|=1;
+
+To watch the tail of a dynamically growing logfile, (from the command line):
+
+ tail -f $error_log
+
+Wrapping all die calls in a handler routine can be useful to see how, and from
+where, they're being called, L<perlvar> has more information:
+
+ BEGIN { $SIG{__DIE__} = sub { require Carp; Carp::confess(@_) } }
+
+Various useful techniques for the redirection of STDOUT and STDERR filehandles
+are explained in L<perlopentut> and L<perlfaq8>.
+
+
+=head1 CGI
+
+Just a quick hint here for all those CGI programmers who can't figure out how
+on earth to get past that 'waiting for input' prompt, when running their CGI
+script from the command-line, try something like this:
+
+ > perl -d my_cgi.pl -nodebug
+
+Of course L<CGI> and L<perlfaq9> will tell you more.
+
+
+=head1 GUIs
+
+The command line interface is tightly integrated with an B<emacs> extension
+and there's a B<vi> interface too.
+
+You don't have to do this all on the command line, though, there are a few GUI
+options out there. The nice thing about these is you can wave a mouse over a
+variable and a dump of it's data will appear in an appropriate window, or in a
+popup balloon, no more tiresome typing of 'x $varname' :-)
+
+In particular have a hunt around for the following:
+
+B<ptkdb> perlTK based wrapper for the built-in debugger
+
+B<ddd> data display debugger
+
+B<PerlDevKit> and B<PerlBuilder> are NT specific
+
+NB. (more info on these and others would be appreciated).
+
+
+=head1 SUMMARY
+
+We've seen how to encourage good coding practices with B<use strict> and
+B<-w>. We can run the perl debugger B<perl -d scriptname> to inspect your
+data from within the perl debugger with the B<p> and B<x> commands. You can
+walk through your code, set breakpoints with B<b> and step through that code
+with B<s> or B<n>, continue with B<c> and return from a sub with B<r>. Fairly
+intuitive stuff when you get down to it.
+
+There is of course lots more to find out about, this has just scratched the
+surface. The best way to learn more is to use perldoc to find out more about
+the language, to read the on-line help (L<perldebug> is probably the next
+place to go), and of course, experiment.
+
+
+=head1 SEE ALSO
+
+L<perldebug>,
+L<perldebguts>,
+L<perldiag>,
+L<dprofpp>,
+L<perlrun>
+
+
+=head1 AUTHOR
+
+Richard Foley <richard@rfi.net> Copyright (c) 2000
+
+
+=head1 CONTRIBUTORS
+
+Various people have made helpful suggestions and contributions, in particular:
+
+Ronald J Kimball <rjk@linguist.dartmouth.edu>
+
+Hugo van der Sanden <hv@crypt0.demon.co.uk>
+
+Peter Scott <Peter@PSDT.com>
+
diff --git a/gnu/usr.bin/perl/pod/perlebcdic.pod b/gnu/usr.bin/perl/pod/perlebcdic.pod
new file mode 100644
index 00000000000..12ea2f3ef4b
--- /dev/null
+++ b/gnu/usr.bin/perl/pod/perlebcdic.pod
@@ -0,0 +1,1235 @@
+=head1 NAME
+
+perlebcdic - Considerations for running Perl on EBCDIC platforms
+
+=head1 DESCRIPTION
+
+An exploration of some of the issues facing Perl programmers
+on EBCDIC based computers. We do not cover localization,
+internationalization, or multi byte character set issues (yet).
+
+Portions that are still incomplete are marked with XXX.
+
+=head1 COMMON CHARACTER CODE SETS
+
+=head2 ASCII
+
+The American Standard Code for Information Interchange is a set of
+integers running from 0 to 127 (decimal) that imply character
+interpretation by the display and other system(s) of computers.
+The range 0..127 can be covered by setting the bits in a 7-bit binary
+digit, hence the set is sometimes referred to as a "7-bit ASCII".
+ASCII was described by the American National Standards Institute
+document ANSI X3.4-1986. It was also described by ISO 646:1991
+(with localization for currency symbols). The full ASCII set is
+given in the table below as the first 128 elements. Languages that
+can be written adequately with the characters in ASCII include
+English, Hawaiian, Indonesian, Swahili and some Native American
+languages.
+
+There are many character sets that extend the range of integers
+from 0..2**7-1 up to 2**8-1, or 8 bit bytes (octets if you prefer).
+One common one is the ISO 8859-1 character set.
+
+=head2 ISO 8859
+
+The ISO 8859-$n are a collection of character code sets from the
+International Organization for Standardization (ISO) each of which
+adds characters to the ASCII set that are typically found in European
+languages many of which are based on the Roman, or Latin, alphabet.
+
+=head2 Latin 1 (ISO 8859-1)
+
+A particular 8-bit extension to ASCII that includes grave and acute
+accented Latin characters. Languages that can employ ISO 8859-1
+include all the languages covered by ASCII as well as Afrikaans,
+Albanian, Basque, Catalan, Danish, Faroese, Finnish, Norwegian,
+Portugese, Spanish, and Swedish. Dutch is covered albeit without
+the ij ligature. French is covered too but without the oe ligature.
+German can use ISO 8859-1 but must do so without German-style
+quotation marks. This set is based on Western European extensions
+to ASCII and is commonly encountered in world wide web work.
+In IBM character code set identification terminology ISO 8859-1 is
+also known as CCSID 819 (or sometimes 0819 or even 00819).
+
+=head2 EBCDIC
+
+The Extended Binary Coded Decimal Interchange Code refers to a
+large collection of slightly different single and multi byte
+coded character sets that are different from ASCII or ISO 8859-1
+and typically run on host computers. The EBCDIC encodings derive
+from 8 bit byte extensions of Hollerith punched card encodings.
+The layout on the cards was such that high bits were set for the
+upper and lower case alphabet characters [a-z] and [A-Z], but there
+were gaps within each latin alphabet range.
+
+Some IBM EBCDIC character sets may be known by character code set
+identification numbers (CCSID numbers) or code page numbers. Leading
+zero digits in CCSID numbers within this document are insignificant.
+E.g. CCSID 0037 may be referred to as 37 in places.
+
+=head2 13 variant characters
+
+Among IBM EBCDIC character code sets there are 13 characters that
+are often mapped to different integer values. Those characters
+are known as the 13 "variant" characters and are:
+
+ \ [ ] { } ^ ~ ! # | $ @ `
+
+=head2 0037
+
+Character code set ID 0037 is a mapping of the ASCII plus Latin-1
+characters (i.e. ISO 8859-1) to an EBCDIC set. 0037 is used
+in North American English locales on the OS/400 operating system
+that runs on AS/400 computers. CCSID 37 differs from ISO 8859-1
+in 237 places, in other words they agree on only 19 code point values.
+
+=head2 1047
+
+Character code set ID 1047 is also a mapping of the ASCII plus
+Latin-1 characters (i.e. ISO 8859-1) to an EBCDIC set. 1047 is
+used under Unix System Services for OS/390, and OpenEdition for VM/ESA.
+CCSID 1047 differs from CCSID 0037 in eight places.
+
+=head2 POSIX-BC
+
+The EBCDIC code page in use on Siemens' BS2000 system is distinct from
+1047 and 0037. It is identified below as the POSIX-BC set.
+
+=head1 SINGLE OCTET TABLES
+
+The following tables list the ASCII and Latin 1 ordered sets including
+the subsets: C0 controls (0..31), ASCII graphics (32..7e), delete (7f),
+C1 controls (80..9f), and Latin-1 (a.k.a. ISO 8859-1) (a0..ff). In the
+table non-printing control character names as well as the Latin 1
+extensions to ASCII have been labelled with character names roughly
+corresponding to I<The Unicode Standard, Version 2.0> albeit with
+substitutions such as s/LATIN// and s/VULGAR// in all cases,
+s/CAPITAL LETTER// in some cases, and s/SMALL LETTER ([A-Z])/\l$1/
+in some other cases (the C<charnames> pragma names unfortunately do
+not list explicit names for the C0 or C1 control characters). The
+"names" of the C1 control set (128..159 in ISO 8859-1) listed here are
+somewhat arbitrary. The differences between the 0037 and 1047 sets are
+flagged with ***. The differences between the 1047 and POSIX-BC sets
+are flagged with ###. All ord() numbers listed are decimal. If you
+would rather see this table listing octal values then run the table
+(that is, the pod version of this document since this recipe may not
+work with a pod2_other_format translation) through:
+
+=over 4
+
+=item recipe 0
+
+=back
+
+ perl -ne 'if(/(.{33})(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/)' \
+ -e '{printf("%s%-9o%-9o%-9o%-9o\n",$1,$2,$3,$4,$5)}' perlebcdic.pod
+
+If you would rather see this table listing hexadecimal values then
+run the table through:
+
+=over 4
+
+=item recipe 1
+
+=back
+
+ perl -ne 'if(/(.{33})(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/)' \
+ -e '{printf("%s%-9X%-9X%-9X%-9X\n",$1,$2,$3,$4,$5)}' perlebcdic.pod
+
+
+ 8859-1
+ chr 0819 0037 1047 POSIX-BC
+ ----------------------------------------------------------------
+ <NULL> 0 0 0 0
+ <START OF HEADING> 1 1 1 1
+ <START OF TEXT> 2 2 2 2
+ <END OF TEXT> 3 3 3 3
+ <END OF TRANSMISSION> 4 55 55 55
+ <ENQUIRY> 5 45 45 45
+ <ACKNOWLEDGE> 6 46 46 46
+ <BELL> 7 47 47 47
+ <BACKSPACE> 8 22 22 22
+ <HORIZONTAL TABULATION> 9 5 5 5
+ <LINE FEED> 10 37 21 21 ***
+ <VERTICAL TABULATION> 11 11 11 11
+ <FORM FEED> 12 12 12 12
+ <CARRIAGE RETURN> 13 13 13 13
+ <SHIFT OUT> 14 14 14 14
+ <SHIFT IN> 15 15 15 15
+ <DATA LINK ESCAPE> 16 16 16 16
+ <DEVICE CONTROL ONE> 17 17 17 17
+ <DEVICE CONTROL TWO> 18 18 18 18
+ <DEVICE CONTROL THREE> 19 19 19 19
+ <DEVICE CONTROL FOUR> 20 60 60 60
+ <NEGATIVE ACKNOWLEDGE> 21 61 61 61
+ <SYNCHRONOUS IDLE> 22 50 50 50
+ <END OF TRANSMISSION BLOCK> 23 38 38 38
+ <CANCEL> 24 24 24 24
+ <END OF MEDIUM> 25 25 25 25
+ <SUBSTITUTE> 26 63 63 63
+ <ESCAPE> 27 39 39 39
+ <FILE SEPARATOR> 28 28 28 28
+ <GROUP SEPARATOR> 29 29 29 29
+ <RECORD SEPARATOR> 30 30 30 30
+ <UNIT SEPARATOR> 31 31 31 31
+ <SPACE> 32 64 64 64
+ ! 33 90 90 90
+ " 34 127 127 127
+ # 35 123 123 123
+ $ 36 91 91 91
+ % 37 108 108 108
+ & 38 80 80 80
+ ' 39 125 125 125
+ ( 40 77 77 77
+ ) 41 93 93 93
+ * 42 92 92 92
+ + 43 78 78 78
+ , 44 107 107 107
+ - 45 96 96 96
+ . 46 75 75 75
+ / 47 97 97 97
+ 0 48 240 240 240
+ 1 49 241 241 241
+ 2 50 242 242 242
+ 3 51 243 243 243
+ 4 52 244 244 244
+ 5 53 245 245 245
+ 6 54 246 246 246
+ 7 55 247 247 247
+ 8 56 248 248 248
+ 9 57 249 249 249
+ : 58 122 122 122
+ ; 59 94 94 94
+ < 60 76 76 76
+ = 61 126 126 126
+ > 62 110 110 110
+ ? 63 111 111 111
+ @ 64 124 124 124
+ A 65 193 193 193
+ B 66 194 194 194
+ C 67 195 195 195
+ D 68 196 196 196
+ E 69 197 197 197
+ F 70 198 198 198
+ G 71 199 199 199
+ H 72 200 200 200
+ I 73 201 201 201
+ J 74 209 209 209
+ K 75 210 210 210
+ L 76 211 211 211
+ M 77 212 212 212
+ N 78 213 213 213
+ O 79 214 214 214
+ P 80 215 215 215
+ Q 81 216 216 216
+ R 82 217 217 217
+ S 83 226 226 226
+ T 84 227 227 227
+ U 85 228 228 228
+ V 86 229 229 229
+ W 87 230 230 230
+ X 88 231 231 231
+ Y 89 232 232 232
+ Z 90 233 233 233
+ [ 91 186 173 187 *** ###
+ \ 92 224 224 188 ###
+ ] 93 187 189 189 ***
+ ^ 94 176 95 106 *** ###
+ _ 95 109 109 109
+ ` 96 121 121 74 ###
+ a 97 129 129 129
+ b 98 130 130 130
+ c 99 131 131 131
+ d 100 132 132 132
+ e 101 133 133 133
+ f 102 134 134 134
+ g 103 135 135 135
+ h 104 136 136 136
+ i 105 137 137 137
+ j 106 145 145 145
+ k 107 146 146 146
+ l 108 147 147 147
+ m 109 148 148 148
+ n 110 149 149 149
+ o 111 150 150 150
+ p 112 151 151 151
+ q 113 152 152 152
+ r 114 153 153 153
+ s 115 162 162 162
+ t 116 163 163 163
+ u 117 164 164 164
+ v 118 165 165 165
+ w 119 166 166 166
+ x 120 167 167 167
+ y 121 168 168 168
+ z 122 169 169 169
+ { 123 192 192 251 ###
+ | 124 79 79 79
+ } 125 208 208 253 ###
+ ~ 126 161 161 255 ###
+ <DELETE> 127 7 7 7
+ <C1 0> 128 32 32 32
+ <C1 1> 129 33 33 33
+ <C1 2> 130 34 34 34
+ <C1 3> 131 35 35 35
+ <C1 4> 132 36 36 36
+ <C1 5> 133 21 37 37 ***
+ <C1 6> 134 6 6 6
+ <C1 7> 135 23 23 23
+ <C1 8> 136 40 40 40
+ <C1 9> 137 41 41 41
+ <C1 10> 138 42 42 42
+ <C1 11> 139 43 43 43
+ <C1 12> 140 44 44 44
+ <C1 13> 141 9 9 9
+ <C1 14> 142 10 10 10
+ <C1 15> 143 27 27 27
+ <C1 16> 144 48 48 48
+ <C1 17> 145 49 49 49
+ <C1 18> 146 26 26 26
+ <C1 19> 147 51 51 51
+ <C1 20> 148 52 52 52
+ <C1 21> 149 53 53 53
+ <C1 22> 150 54 54 54
+ <C1 23> 151 8 8 8
+ <C1 24> 152 56 56 56
+ <C1 25> 153 57 57 57
+ <C1 26> 154 58 58 58
+ <C1 27> 155 59 59 59
+ <C1 28> 156 4 4 4
+ <C1 29> 157 20 20 20
+ <C1 30> 158 62 62 62
+ <C1 31> 159 255 255 95 ###
+ <NON-BREAKING SPACE> 160 65 65 65
+ <INVERTED EXCLAMATION MARK> 161 170 170 170
+ <CENT SIGN> 162 74 74 176 ###
+ <POUND SIGN> 163 177 177 177
+ <CURRENCY SIGN> 164 159 159 159
+ <YEN SIGN> 165 178 178 178
+ <BROKEN BAR> 166 106 106 208 ###
+ <SECTION SIGN> 167 181 181 181
+ <DIAERESIS> 168 189 187 121 *** ###
+ <COPYRIGHT SIGN> 169 180 180 180
+ <FEMININE ORDINAL INDICATOR> 170 154 154 154
+ <LEFT POINTING GUILLEMET> 171 138 138 138
+ <NOT SIGN> 172 95 176 186 *** ###
+ <SOFT HYPHEN> 173 202 202 202
+ <REGISTERED TRADE MARK SIGN> 174 175 175 175
+ <MACRON> 175 188 188 161 ###
+ <DEGREE SIGN> 176 144 144 144
+ <PLUS-OR-MINUS SIGN> 177 143 143 143
+ <SUPERSCRIPT TWO> 178 234 234 234
+ <SUPERSCRIPT THREE> 179 250 250 250
+ <ACUTE ACCENT> 180 190 190 190
+ <MICRO SIGN> 181 160 160 160
+ <PARAGRAPH SIGN> 182 182 182 182
+ <MIDDLE DOT> 183 179 179 179
+ <CEDILLA> 184 157 157 157
+ <SUPERSCRIPT ONE> 185 218 218 218
+ <MASC. ORDINAL INDICATOR> 186 155 155 155
+ <RIGHT POINTING GUILLEMET> 187 139 139 139
+ <FRACTION ONE QUARTER> 188 183 183 183
+ <FRACTION ONE HALF> 189 184 184 184
+ <FRACTION THREE QUARTERS> 190 185 185 185
+ <INVERTED QUESTION MARK> 191 171 171 171
+ <A WITH GRAVE> 192 100 100 100
+ <A WITH ACUTE> 193 101 101 101
+ <A WITH CIRCUMFLEX> 194 98 98 98
+ <A WITH TILDE> 195 102 102 102
+ <A WITH DIAERESIS> 196 99 99 99
+ <A WITH RING ABOVE> 197 103 103 103
+ <CAPITAL LIGATURE AE> 198 158 158 158
+ <C WITH CEDILLA> 199 104 104 104
+ <E WITH GRAVE> 200 116 116 116
+ <E WITH ACUTE> 201 113 113 113
+ <E WITH CIRCUMFLEX> 202 114 114 114
+ <E WITH DIAERESIS> 203 115 115 115
+ <I WITH GRAVE> 204 120 120 120
+ <I WITH ACUTE> 205 117 117 117
+ <I WITH CIRCUMFLEX> 206 118 118 118
+ <I WITH DIAERESIS> 207 119 119 119
+ <CAPITAL LETTER ETH> 208 172 172 172
+ <N WITH TILDE> 209 105 105 105
+ <O WITH GRAVE> 210 237 237 237
+ <O WITH ACUTE> 211 238 238 238
+ <O WITH CIRCUMFLEX> 212 235 235 235
+ <O WITH TILDE> 213 239 239 239
+ <O WITH DIAERESIS> 214 236 236 236
+ <MULTIPLICATION SIGN> 215 191 191 191
+ <O WITH STROKE> 216 128 128 128
+ <U WITH GRAVE> 217 253 253 224 ###
+ <U WITH ACUTE> 218 254 254 254
+ <U WITH CIRCUMFLEX> 219 251 251 221 ###
+ <U WITH DIAERESIS> 220 252 252 252
+ <Y WITH ACUTE> 221 173 186 173 *** ###
+ <CAPITAL LETTER THORN> 222 174 174 174
+ <SMALL LETTER SHARP S> 223 89 89 89
+ <a WITH GRAVE> 224 68 68 68
+ <a WITH ACUTE> 225 69 69 69
+ <a WITH CIRCUMFLEX> 226 66 66 66
+ <a WITH TILDE> 227 70 70 70
+ <a WITH DIAERESIS> 228 67 67 67
+ <a WITH RING ABOVE> 229 71 71 71
+ <SMALL LIGATURE ae> 230 156 156 156
+ <c WITH CEDILLA> 231 72 72 72
+ <e WITH GRAVE> 232 84 84 84
+ <e WITH ACUTE> 233 81 81 81
+ <e WITH CIRCUMFLEX> 234 82 82 82
+ <e WITH DIAERESIS> 235 83 83 83
+ <i WITH GRAVE> 236 88 88 88
+ <i WITH ACUTE> 237 85 85 85
+ <i WITH CIRCUMFLEX> 238 86 86 86
+ <i WITH DIAERESIS> 239 87 87 87
+ <SMALL LETTER eth> 240 140 140 140
+ <n WITH TILDE> 241 73 73 73
+ <o WITH GRAVE> 242 205 205 205
+ <o WITH ACUTE> 243 206 206 206
+ <o WITH CIRCUMFLEX> 244 203 203 203
+ <o WITH TILDE> 245 207 207 207
+ <o WITH DIAERESIS> 246 204 204 204
+ <DIVISION SIGN> 247 225 225 225
+ <o WITH STROKE> 248 112 112 112
+ <u WITH GRAVE> 249 221 221 192 ###
+ <u WITH ACUTE> 250 222 222 222
+ <u WITH CIRCUMFLEX> 251 219 219 219
+ <u WITH DIAERESIS> 252 220 220 220
+ <y WITH ACUTE> 253 141 141 141
+ <SMALL LETTER thorn> 254 142 142 142
+ <y WITH DIAERESIS> 255 223 223 223
+
+If you would rather see the above table in CCSID 0037 order rather than
+ASCII + Latin-1 order then run the table through:
+
+=over 4
+
+=item recipe 2
+
+=back
+
+ perl -ne 'if(/.{33}\d{1,3}\s{6,8}\d{1,3}\s{6,8}\d{1,3}\s{6,8}\d{1,3}/)'\
+ -e '{push(@l,$_)}' \
+ -e 'END{print map{$_->[0]}' \
+ -e ' sort{$a->[1] <=> $b->[1]}' \
+ -e ' map{[$_,substr($_,42,3)]}@l;}' perlebcdic.pod
+
+If you would rather see it in CCSID 1047 order then change the digit
+42 in the last line to 51, like this:
+
+=over 4
+
+=item recipe 3
+
+=back
+
+ perl -ne 'if(/.{33}\d{1,3}\s{6,8}\d{1,3}\s{6,8}\d{1,3}\s{6,8}\d{1,3}/)'\
+ -e '{push(@l,$_)}' \
+ -e 'END{print map{$_->[0]}' \
+ -e ' sort{$a->[1] <=> $b->[1]}' \
+ -e ' map{[$_,substr($_,51,3)]}@l;}' perlebcdic.pod
+
+If you would rather see it in POSIX-BC order then change the digit
+51 in the last line to 60, like this:
+
+=over 4
+
+=item recipe 4
+
+=back
+
+ perl -ne 'if(/.{33}\d{1,3}\s{6,8}\d{1,3}\s{6,8}\d{1,3}\s{6,8}\d{1,3}/)'\
+ -e '{push(@l,$_)}' \
+ -e 'END{print map{$_->[0]}' \
+ -e ' sort{$a->[1] <=> $b->[1]}' \
+ -e ' map{[$_,substr($_,60,3)]}@l;}' perlebcdic.pod
+
+
+=head1 IDENTIFYING CHARACTER CODE SETS
+
+To determine the character set you are running under from perl one
+could use the return value of ord() or chr() to test one or more
+character values. For example:
+
+ $is_ascii = "A" eq chr(65);
+ $is_ebcdic = "A" eq chr(193);
+
+Also, "\t" is a C<HORIZONTAL TABULATION> character so that:
+
+ $is_ascii = ord("\t") == 9;
+ $is_ebcdic = ord("\t") == 5;
+
+To distinguish EBCDIC code pages try looking at one or more of
+the characters that differ between them. For example:
+
+ $is_ebcdic_37 = "\n" eq chr(37);
+ $is_ebcdic_1047 = "\n" eq chr(21);
+
+Or better still choose a character that is uniquely encoded in any
+of the code sets, e.g.:
+
+ $is_ascii = ord('[') == 91;
+ $is_ebcdic_37 = ord('[') == 186;
+ $is_ebcdic_1047 = ord('[') == 173;
+ $is_ebcdic_POSIX_BC = ord('[') == 187;
+
+However, it would be unwise to write tests such as:
+
+ $is_ascii = "\r" ne chr(13); # WRONG
+ $is_ascii = "\n" ne chr(10); # ILL ADVISED
+
+Obviously the first of these will fail to distinguish most ASCII machines
+from either a CCSID 0037, a 1047, or a POSIX-BC EBCDIC machine since "\r" eq
+chr(13) under all of those coded character sets. But note too that
+because "\n" is chr(13) and "\r" is chr(10) on the MacIntosh (which is an
+ASCII machine) the second C<$is_ascii> test will lead to trouble there.
+
+To determine whether or not perl was built under an EBCDIC
+code page you can use the Config module like so:
+
+ use Config;
+ $is_ebcdic = $Config{'ebcdic'} eq 'define';
+
+=head1 CONVERSIONS
+
+=head2 tr///
+
+In order to convert a string of characters from one character set to
+another a simple list of numbers, such as in the right columns in the
+above table, along with perl's tr/// operator is all that is needed.
+The data in the table are in ASCII order hence the EBCDIC columns
+provide easy to use ASCII to EBCDIC operations that are also easily
+reversed.
+
+For example, to convert ASCII to code page 037 take the output of the second
+column from the output of recipe 0 (modified to add \\ characters) and use
+it in tr/// like so:
+
+ $cp_037 =
+ '\000\001\002\003\234\011\206\177\227\215\216\013\014\015\016\017' .
+ '\020\021\022\023\235\205\010\207\030\031\222\217\034\035\036\037' .
+ '\200\201\202\203\204\012\027\033\210\211\212\213\214\005\006\007' .
+ '\220\221\026\223\224\225\226\004\230\231\232\233\024\025\236\032' .
+ '\040\240\342\344\340\341\343\345\347\361\242\056\074\050\053\174' .
+ '\046\351\352\353\350\355\356\357\354\337\041\044\052\051\073\254' .
+ '\055\057\302\304\300\301\303\305\307\321\246\054\045\137\076\077' .
+ '\370\311\312\313\310\315\316\317\314\140\072\043\100\047\075\042' .
+ '\330\141\142\143\144\145\146\147\150\151\253\273\360\375\376\261' .
+ '\260\152\153\154\155\156\157\160\161\162\252\272\346\270\306\244' .
+ '\265\176\163\164\165\166\167\170\171\172\241\277\320\335\336\256' .
+ '\136\243\245\267\251\247\266\274\275\276\133\135\257\250\264\327' .
+ '\173\101\102\103\104\105\106\107\110\111\255\364\366\362\363\365' .
+ '\175\112\113\114\115\116\117\120\121\122\271\373\374\371\372\377' .
+ '\134\367\123\124\125\126\127\130\131\132\262\324\326\322\323\325' .
+ '\060\061\062\063\064\065\066\067\070\071\263\333\334\331\332\237' ;
+
+ my $ebcdic_string = $ascii_string;
+ eval '$ebcdic_string =~ tr/\000-\377/' . $cp_037 . '/';
+
+To convert from EBCDIC 037 to ASCII just reverse the order of the tr///
+arguments like so:
+
+ my $ascii_string = $ebcdic_string;
+ eval '$ascii_string = tr/' . $cp_037 . '/\000-\377/';
+
+Similarly one could take the output of the third column from recipe 0 to
+obtain a C<$cp_1047> table. The fourth column of the output from recipe
+0 could provide a C<$cp_posix_bc> table suitable for transcoding as well.
+
+=head2 iconv
+
+XPG operability often implies the presence of an I<iconv> utility
+available from the shell or from the C library. Consult your system's
+documentation for information on iconv.
+
+On OS/390 see the iconv(1) man page. One way to invoke the iconv
+shell utility from within perl would be to:
+
+ # OS/390 example
+ $ascii_data = `echo '$ebcdic_data'| iconv -f IBM-1047 -t ISO8859-1`
+
+or the inverse map:
+
+ # OS/390 example
+ $ebcdic_data = `echo '$ascii_data'| iconv -f ISO8859-1 -t IBM-1047`
+
+For other perl based conversion options see the Convert::* modules on CPAN.
+
+=head2 C RTL
+
+The OS/390 C run time library provides _atoe() and _etoa() functions.
+
+=head1 OPERATOR DIFFERENCES
+
+The C<..> range operator treats certain character ranges with
+care on EBCDIC machines. For example the following array
+will have twenty six elements on either an EBCDIC machine
+or an ASCII machine:
+
+ @alphabet = ('A'..'Z'); # $#alphabet == 25
+
+The bitwise operators such as & ^ | may return different results
+when operating on string or character data in a perl program running
+on an EBCDIC machine than when run on an ASCII machine. Here is
+an example adapted from the one in L<perlop>:
+
+ # EBCDIC-based examples
+ print "j p \n" ^ " a h"; # prints "JAPH\n"
+ print "JA" | " ph\n"; # prints "japh\n"
+ print "JAPH\nJunk" & "\277\277\277\277\277"; # prints "japh\n";
+ print 'p N$' ^ " E<H\n"; # prints "Perl\n";
+
+An interesting property of the 32 C0 control characters
+in the ASCII table is that they can "literally" be constructed
+as control characters in perl, e.g. C<(chr(0) eq "\c@")>
+C<(chr(1) eq "\cA")>, and so on. Perl on EBCDIC machines has been
+ported to take "\c@" to chr(0) and "\cA" to chr(1) as well, but the
+thirty three characters that result depend on which code page you are
+using. The table below uses the character names from the previous table
+but with substitutions such as s/START OF/S.O./; s/END OF /E.O./;
+s/TRANSMISSION/TRANS./; s/TABULATION/TAB./; s/VERTICAL/VERT./;
+s/HORIZONTAL/HORIZ./; s/DEVICE CONTROL/D.C./; s/SEPARATOR/SEP./;
+s/NEGATIVE ACKNOWLEDGE/NEG. ACK./;. The POSIX-BC and 1047 sets are
+identical throughout this range and differ from the 0037 set at only
+one spot (21 decimal). Note that the C<LINE FEED> character
+may be generated by "\cJ" on ASCII machines but by "\cU" on 1047 or POSIX-BC
+machines and cannot be generated as a C<"\c.letter."> control character on
+0037 machines. Note also that "\c\\" maps to two characters
+not one.
+
+ chr ord 8859-1 0037 1047 && POSIX-BC
+ ------------------------------------------------------------------------
+ "\c?" 127 <DELETE> " " ***><
+ "\c@" 0 <NULL> <NULL> <NULL> ***><
+ "\cA" 1 <S.O. HEADING> <S.O. HEADING> <S.O. HEADING>
+ "\cB" 2 <S.O. TEXT> <S.O. TEXT> <S.O. TEXT>
+ "\cC" 3 <E.O. TEXT> <E.O. TEXT> <E.O. TEXT>
+ "\cD" 4 <E.O. TRANS.> <C1 28> <C1 28>
+ "\cE" 5 <ENQUIRY> <HORIZ. TAB.> <HORIZ. TAB.>
+ "\cF" 6 <ACKNOWLEDGE> <C1 6> <C1 6>
+ "\cG" 7 <BELL> <DELETE> <DELETE>
+ "\cH" 8 <BACKSPACE> <C1 23> <C1 23>
+ "\cI" 9 <HORIZ. TAB.> <C1 13> <C1 13>
+ "\cJ" 10 <LINE FEED> <C1 14> <C1 14>
+ "\cK" 11 <VERT. TAB.> <VERT. TAB.> <VERT. TAB.>
+ "\cL" 12 <FORM FEED> <FORM FEED> <FORM FEED>
+ "\cM" 13 <CARRIAGE RETURN> <CARRIAGE RETURN> <CARRIAGE RETURN>
+ "\cN" 14 <SHIFT OUT> <SHIFT OUT> <SHIFT OUT>
+ "\cO" 15 <SHIFT IN> <SHIFT IN> <SHIFT IN>
+ "\cP" 16 <DATA LINK ESCAPE> <DATA LINK ESCAPE> <DATA LINK ESCAPE>
+ "\cQ" 17 <D.C. ONE> <D.C. ONE> <D.C. ONE>
+ "\cR" 18 <D.C. TWO> <D.C. TWO> <D.C. TWO>
+ "\cS" 19 <D.C. THREE> <D.C. THREE> <D.C. THREE>
+ "\cT" 20 <D.C. FOUR> <C1 29> <C1 29>
+ "\cU" 21 <NEG. ACK.> <C1 5> <LINE FEED> ***
+ "\cV" 22 <SYNCHRONOUS IDLE> <BACKSPACE> <BACKSPACE>
+ "\cW" 23 <E.O. TRANS. BLOCK> <C1 7> <C1 7>
+ "\cX" 24 <CANCEL> <CANCEL> <CANCEL>
+ "\cY" 25 <E.O. MEDIUM> <E.O. MEDIUM> <E.O. MEDIUM>
+ "\cZ" 26 <SUBSTITUTE> <C1 18> <C1 18>
+ "\c[" 27 <ESCAPE> <C1 15> <C1 15>
+ "\c\\" 28 <FILE SEP.>\ <FILE SEP.>\ <FILE SEP.>\
+ "\c]" 29 <GROUP SEP.> <GROUP SEP.> <GROUP SEP.>
+ "\c^" 30 <RECORD SEP.> <RECORD SEP.> <RECORD SEP.> ***><
+ "\c_" 31 <UNIT SEP.> <UNIT SEP.> <UNIT SEP.> ***><
+
+
+=head1 FUNCTION DIFFERENCES
+
+=over 8
+
+=item chr()
+
+chr() must be given an EBCDIC code number argument to yield a desired
+character return value on an EBCDIC machine. For example:
+
+ $CAPITAL_LETTER_A = chr(193);
+
+=item ord()
+
+ord() will return EBCDIC code number values on an EBCDIC machine.
+For example:
+
+ $the_number_193 = ord("A");
+
+=item pack()
+
+The c and C templates for pack() are dependent upon character set
+encoding. Examples of usage on EBCDIC include:
+
+ $foo = pack("CCCC",193,194,195,196);
+ # $foo eq "ABCD"
+ $foo = pack("C4",193,194,195,196);
+ # same thing
+
+ $foo = pack("ccxxcc",193,194,195,196);
+ # $foo eq "AB\0\0CD"
+
+=item print()
+
+One must be careful with scalars and strings that are passed to
+print that contain ASCII encodings. One common place
+for this to occur is in the output of the MIME type header for
+CGI script writing. For example, many perl programming guides
+recommend something similar to:
+
+ print "Content-type:\ttext/html\015\012\015\012";
+ # this may be wrong on EBCDIC
+
+Under the IBM OS/390 USS Web Server for example you should instead
+write that as:
+
+ print "Content-type:\ttext/html\r\n\r\n"; # OK for DGW et alia
+
+That is because the translation from EBCDIC to ASCII is done
+by the web server in this case (such code will not be appropriate for
+the Macintosh however). Consult your web server's documentation for
+further details.
+
+=item printf()
+
+The formats that can convert characters to numbers and vice versa
+will be different from their ASCII counterparts when executed
+on an EBCDIC machine. Examples include:
+
+ printf("%c%c%c",193,194,195); # prints ABC
+
+=item sort()
+
+EBCDIC sort results may differ from ASCII sort results especially for
+mixed case strings. This is discussed in more detail below.
+
+=item sprintf()
+
+See the discussion of printf() above. An example of the use
+of sprintf would be:
+
+ $CAPITAL_LETTER_A = sprintf("%c",193);
+
+=item unpack()
+
+See the discussion of pack() above.
+
+=back
+
+=head1 REGULAR EXPRESSION DIFFERENCES
+
+As of perl 5.005_03 the letter range regular expression such as
+[A-Z] and [a-z] have been especially coded to not pick up gap
+characters. For example, characters such as E<ocirc> C<o WITH CIRCUMFLEX>
+that lie between I and J would not be matched by the
+regular expression range C</[H-K]/>.
+
+If you do want to match the alphabet gap characters in a single octet
+regular expression try matching the hex or octal code such
+as C</\313/> on EBCDIC or C</\364/> on ASCII machines to
+have your regular expression match C<o WITH CIRCUMFLEX>.
+
+Another construct to be wary of is the inappropriate use of hex or
+octal constants in regular expressions. Consider the following
+set of subs:
+
+ sub is_c0 {
+ my $char = substr(shift,0,1);
+ $char =~ /[\000-\037]/;
+ }
+
+ sub is_print_ascii {
+ my $char = substr(shift,0,1);
+ $char =~ /[\040-\176]/;
+ }
+
+ sub is_delete {
+ my $char = substr(shift,0,1);
+ $char eq "\177";
+ }
+
+ sub is_c1 {
+ my $char = substr(shift,0,1);
+ $char =~ /[\200-\237]/;
+ }
+
+ sub is_latin_1 {
+ my $char = substr(shift,0,1);
+ $char =~ /[\240-\377]/;
+ }
+
+The above would be adequate if the concern was only with numeric code points.
+However, the concern may be with characters rather than code points
+and on an EBCDIC machine it may be desirable for constructs such as
+C<if (is_print_ascii("A")) {print "A is a printable character\n";}> to print
+out the expected message. One way to represent the above collection
+of character classification subs that is capable of working across the
+four coded character sets discussed in this document is as follows:
+
+ sub Is_c0 {
+ my $char = substr(shift,0,1);
+ if (ord('^')==94) { # ascii
+ return $char =~ /[\000-\037]/;
+ }
+ if (ord('^')==176) { # 37
+ return $char =~ /[\000-\003\067\055-\057\026\005\045\013-\023\074\075\062\046\030\031\077\047\034-\037]/;
+ }
+ if (ord('^')==95 || ord('^')==106) { # 1047 || posix-bc
+ return $char =~ /[\000-\003\067\055-\057\026\005\025\013-\023\074\075\062\046\030\031\077\047\034-\037]/;
+ }
+ }
+
+ sub Is_print_ascii {
+ my $char = substr(shift,0,1);
+ $char =~ /[ !"\#\$%&'()*+,\-.\/0-9:;<=>?\@A-Z[\\\]^_`a-z{|}~]/;
+ }
+
+ sub Is_delete {
+ my $char = substr(shift,0,1);
+ if (ord('^')==94) { # ascii
+ return $char eq "\177";
+ }
+ else { # ebcdic
+ return $char eq "\007";
+ }
+ }
+
+ sub Is_c1 {
+ my $char = substr(shift,0,1);
+ if (ord('^')==94) { # ascii
+ return $char =~ /[\200-\237]/;
+ }
+ if (ord('^')==176) { # 37
+ return $char =~ /[\040-\044\025\006\027\050-\054\011\012\033\060\061\032\063-\066\010\070-\073\040\024\076\377]/;
+ }
+ if (ord('^')==95) { # 1047
+ return $char =~ /[\040-\045\006\027\050-\054\011\012\033\060\061\032\063-\066\010\070-\073\040\024\076\377]/;
+ }
+ if (ord('^')==106) { # posix-bc
+ return $char =~
+ /[\040-\045\006\027\050-\054\011\012\033\060\061\032\063-\066\010\070-\073\040\024\076\137]/;
+ }
+ }
+
+ sub Is_latin_1 {
+ my $char = substr(shift,0,1);
+ if (ord('^')==94) { # ascii
+ return $char =~ /[\240-\377]/;
+ }
+ if (ord('^')==176) { # 37
+ return $char =~
+ /[\101\252\112\261\237\262\152\265\275\264\232\212\137\312\257\274\220\217\352\372\276\240\266\263\235\332\233\213\267\270\271\253\144\145\142\146\143\147\236\150\164\161-\163\170\165-\167\254\151\355\356\353\357\354\277\200\375\376\373\374\255\256\131\104\105\102\106\103\107\234\110\124\121-\123\130\125-\127\214\111\315\316\313\317\314\341\160\335\336\333\334\215\216\337]/;
+ }
+ if (ord('^')==95) { # 1047
+ return $char =~
+ /[\101\252\112\261\237\262\152\265\273\264\232\212\260\312\257\274\220\217\352\372\276\240\266\263\235\332\233\213\267\270\271\253\144\145\142\146\143\147\236\150\164\161-\163\170\165-\167\254\151\355\356\353\357\354\277\200\375\376\373\374\272\256\131\104\105\102\106\103\107\234\110\124\121-\123\130\125-\127\214\111\315\316\313\317\314\341\160\335\336\333\334\215\216\337]/;
+ }
+ if (ord('^')==106) { # posix-bc
+ return $char =~
+ /[\101\252\260\261\237\262\320\265\171\264\232\212\272\312\257\241\220\217\352\372\276\240\266\263\235\332\233\213\267\270\271\253\144\145\142\146\143\147\236\150\164\161-\163\170\165-\167\254\151\355\356\353\357\354\277\200\340\376\335\374\255\256\131\104\105\102\106\103\107\234\110\124\121-\123\130\125-\127\214\111\315\316\313\317\314\341\160\300\336\333\334\215\216\337]/;
+ }
+ }
+
+Note however that only the C<Is_ascii_print()> sub is really independent
+of coded character set. Another way to write C<Is_latin_1()> would be
+to use the characters in the range explicitly:
+
+ sub Is_latin_1 {
+ my $char = substr(shift,0,1);
+ $char =~ /[ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ]/;
+ }
+
+Although that form may run into trouble in network transit (due to the
+presence of 8 bit characters) or on non ISO-Latin character sets.
+
+=head1 SOCKETS
+
+Most socket programming assumes ASCII character encodings in network
+byte order. Exceptions can include CGI script writing under a
+host web server where the server may take care of translation for you.
+Most host web servers convert EBCDIC data to ISO-8859-1 or Unicode on
+output.
+
+=head1 SORTING
+
+One big difference between ASCII based character sets and EBCDIC ones
+are the relative positions of upper and lower case letters and the
+letters compared to the digits. If sorted on an ASCII based machine the
+two letter abbreviation for a physician comes before the two letter
+for drive, that is:
+
+ @sorted = sort(qw(Dr. dr.)); # @sorted holds ('Dr.','dr.') on ASCII,
+ # but ('dr.','Dr.') on EBCDIC
+
+The property of lower case before uppercase letters in EBCDIC is
+even carried to the Latin 1 EBCDIC pages such as 0037 and 1047.
+An example would be that E<Euml> C<E WITH DIAERESIS> (203) comes
+before E<euml> C<e WITH DIAERESIS> (235) on an ASCII machine, but
+the latter (83) comes before the former (115) on an EBCDIC machine.
+(Astute readers will note that the upper case version of E<szlig>
+C<SMALL LETTER SHARP S> is simply "SS" and that the upper case version of
+E<yuml> C<y WITH DIAERESIS> is not in the 0..255 range but it is
+at U+x0178 in Unicode, or C<"\x{178}"> in a Unicode enabled Perl).
+
+The sort order will cause differences between results obtained on
+ASCII machines versus EBCDIC machines. What follows are some suggestions
+on how to deal with these differences.
+
+=head2 Ignore ASCII vs. EBCDIC sort differences.
+
+This is the least computationally expensive strategy. It may require
+some user education.
+
+=head2 MONO CASE then sort data.
+
+In order to minimize the expense of mono casing mixed test try to
+C<tr///> towards the character set case most employed within the data.
+If the data are primarily UPPERCASE non Latin 1 then apply tr/[a-z]/[A-Z]/
+then sort(). If the data are primarily lowercase non Latin 1 then
+apply tr/[A-Z]/[a-z]/ before sorting. If the data are primarily UPPERCASE
+and include Latin-1 characters then apply:
+
+ tr/[a-z]/[A-Z]/;
+ tr/[àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþ]/[ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ]/;
+ s/ß/SS/g;
+
+then sort(). Do note however that such Latin-1 manipulation does not
+address the E<yuml> C<y WITH DIAERESIS> character that will remain at
+code point 255 on ASCII machines, but 223 on most EBCDIC machines
+where it will sort to a place less than the EBCDIC numerals. With a
+Unicode enabled Perl you might try:
+
+ tr/^?/\x{178}/;
+
+The strategy of mono casing data before sorting does not preserve the case
+of the data and may not be acceptable for that reason.
+
+=head2 Convert, sort data, then re convert.
+
+This is the most expensive proposition that does not employ a network
+connection.
+
+=head2 Perform sorting on one type of machine only.
+
+This strategy can employ a network connection. As such
+it would be computationally expensive.
+
+=head1 TRANFORMATION FORMATS
+
+There are a variety of ways of transforming data with an intra character set
+mapping that serve a variety of purposes. Sorting was discussed in the
+previous section and a few of the other more popular mapping techniques are
+discussed next.
+
+=head2 URL decoding and encoding
+
+Note that some URLs have hexadecimal ASCII code points in them in an
+attempt to overcome character or protocol limitation issues. For example
+the tilde character is not on every keyboard hence a URL of the form:
+
+ http://www.pvhp.com/~pvhp/
+
+may also be expressed as either of:
+
+ http://www.pvhp.com/%7Epvhp/
+
+ http://www.pvhp.com/%7epvhp/
+
+where 7E is the hexadecimal ASCII code point for '~'. Here is an example
+of decoding such a URL under CCSID 1047:
+
+ $url = 'http://www.pvhp.com/%7Epvhp/';
+ # this array assumes code page 1047
+ my @a2e_1047 = (
+ 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
+ );
+ $url =~ s/%([0-9a-fA-F]{2})/pack("c",$a2e_1047[hex($1)])/ge;
+
+Conversely, here is a partial solution for the task of encoding such
+a URL under the 1047 code page:
+
+ $url = 'http://www.pvhp.com/~pvhp/';
+ # this array assumes code page 1047
+ my @e2a_1047 = (
+ 0, 1, 2, 3,156, 9,134,127,151,141,142, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19,157, 10, 8,135, 24, 25,146,143, 28, 29, 30, 31,
+ 128,129,130,131,132,133, 23, 27,136,137,138,139,140, 5, 6, 7,
+ 144,145, 22,147,148,149,150, 4,152,153,154,155, 20, 21,158, 26,
+ 32,160,226,228,224,225,227,229,231,241,162, 46, 60, 40, 43,124,
+ 38,233,234,235,232,237,238,239,236,223, 33, 36, 42, 41, 59, 94,
+ 45, 47,194,196,192,193,195,197,199,209,166, 44, 37, 95, 62, 63,
+ 248,201,202,203,200,205,206,207,204, 96, 58, 35, 64, 39, 61, 34,
+ 216, 97, 98, 99,100,101,102,103,104,105,171,187,240,253,254,177,
+ 176,106,107,108,109,110,111,112,113,114,170,186,230,184,198,164,
+ 181,126,115,116,117,118,119,120,121,122,161,191,208, 91,222,174,
+ 172,163,165,183,169,167,182,188,189,190,221,168,175, 93,180,215,
+ 123, 65, 66, 67, 68, 69, 70, 71, 72, 73,173,244,246,242,243,245,
+ 125, 74, 75, 76, 77, 78, 79, 80, 81, 82,185,251,252,249,250,255,
+ 92,247, 83, 84, 85, 86, 87, 88, 89, 90,178,212,214,210,211,213,
+ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,179,219,220,217,218,159
+ );
+ # The following regular expression does not address the
+ # mappings for: ('.' => '%2E', '/' => '%2F', ':' => '%3A')
+ $url =~ s/([\t "#%&\(\),;<=>\?\@\[\\\]^`{|}~])/sprintf("%%%02X",$e2a_1047[ord($1)])/ge;
+
+where a more complete solution would split the URL into components
+and apply a full s/// substitution only to the appropriate parts.
+
+In the remaining examples a @e2a or @a2e array may be employed
+but the assignment will not be shown explicitly. For code page 1047
+you could use the @a2e_1047 or @e2a_1047 arrays just shown.
+
+=head2 uu encoding and decoding
+
+The C<u> template to pack() or unpack() will render EBCDIC data in EBCDIC
+characters equivalent to their ASCII counterparts. For example, the
+following will print "Yes indeed\n" on either an ASCII or EBCDIC computer:
+
+ $all_byte_chrs = '';
+ for (0..255) { $all_byte_chrs .= chr($_); }
+ $uuencode_byte_chrs = pack('u', $all_byte_chrs);
+ ($uu = <<' ENDOFHEREDOC') =~ s/^\s*//gm;
+ M``$"`P0%!@<("0H+#`T.#Q`1$A,4%187&!D:&QP='A\@(2(C)"4F)R@I*BLL
+ M+2XO,#$R,S0U-C<X.3H[/#T^/T!!0D-$149'2$E*2TQ-3D]045)35%565UA9
+ M6EM<75Y?8&%B8V1E9F=H:6IK;&UN;W!Q<G-T=79W>'EZ>WQ]?G^`@8*#A(6&
+ MAXB)BHN,C8Z/D)&2DY25EI>8F9J;G)V>GZ"AHJ.DI::GJ*FJJZRMKJ^PL;*S
+ MM+6VM[BYNKN\O;Z_P,'"P\3%QL?(R<K+S,W.S]#1TM/4U=;7V-G:V]S=WM_@
+ ?X>+CY.7FY^CIZNOL[>[O\/'R\_3U]O?X^?K[_/W^_P``
+ ENDOFHEREDOC
+ if ($uuencode_byte_chrs eq $uu) {
+ print "Yes ";
+ }
+ $uudecode_byte_chrs = unpack('u', $uuencode_byte_chrs);
+ if ($uudecode_byte_chrs eq $all_byte_chrs) {
+ print "indeed\n";
+ }
+
+Here is a very spartan uudecoder that will work on EBCDIC provided
+that the @e2a array is filled in appropriately:
+
+ #!/usr/local/bin/perl
+ @e2a = ( # this must be filled in
+ );
+ $_ = <> until ($mode,$file) = /^begin\s*(\d*)\s*(\S*)/;
+ open(OUT, "> $file") if $file ne "";
+ while(<>) {
+ last if /^end/;
+ next if /[a-z]/;
+ next unless int(((($e2a[ord()] - 32 ) & 077) + 2) / 3) ==
+ int(length() / 4);
+ print OUT unpack("u", $_);
+ }
+ close(OUT);
+ chmod oct($mode), $file;
+
+
+=head2 Quoted-Printable encoding and decoding
+
+On ASCII encoded machines it is possible to strip characters outside of
+the printable set using:
+
+ # This QP encoder works on ASCII only
+ $qp_string =~ s/([=\x00-\x1F\x80-\xFF])/sprintf("=%02X",ord($1))/ge;
+
+Whereas a QP encoder that works on both ASCII and EBCDIC machines
+would look somewhat like the following (where the EBCDIC branch @e2a
+array is omitted for brevity):
+
+ if (ord('A') == 65) { # ASCII
+ $delete = "\x7F"; # ASCII
+ @e2a = (0 .. 255) # ASCII to ASCII identity map
+ }
+ else { # EBCDIC
+ $delete = "\x07"; # EBCDIC
+ @e2a = # EBCDIC to ASCII map (as shown above)
+ }
+ $qp_string =~
+ s/([^ !"\#\$%&'()*+,\-.\/0-9:;<>?\@A-Z[\\\]^_`a-z{|}~$delete])/sprintf("=%02X",$e2a[ord($1)])/ge;
+
+(although in production code the substitutions might be done
+in the EBCDIC branch with the @e2a array and separately in the
+ASCII branch without the expense of the identity map).
+
+Such QP strings can be decoded with:
+
+ # This QP decoder is limited to ASCII only
+ $string =~ s/=([0-9A-Fa-f][0-9A-Fa-f])/chr hex $1/ge;
+ $string =~ s/=[\n\r]+$//;
+
+Whereas a QP decoder that works on both ASCII and EBCDIC machines
+would look somewhat like the following (where the @a2e array is
+omitted for brevity):
+
+ $string =~ s/=([0-9A-Fa-f][0-9A-Fa-f])/chr $a2e[hex $1]/ge;
+ $string =~ s/=[\n\r]+$//;
+
+=head2 Caesarian cyphers
+
+The practice of shifting an alphabet one or more characters for encipherment
+dates back thousands of years and was explicitly detailed by Gaius Julius
+Caesar in his B<Gallic Wars> text. A single alphabet shift is sometimes
+referred to as a rotation and the shift amount is given as a number $n after
+the string 'rot' or "rot$n". Rot0 and rot26 would designate identity maps
+on the 26 letter English version of the Latin alphabet. Rot13 has the
+interesting property that alternate subsequent invocations are identity maps
+(thus rot13 is its own non-trivial inverse in the group of 26 alphabet
+rotations). Hence the following is a rot13 encoder and decoder that will
+work on ASCII and EBCDIC machines:
+
+ #!/usr/local/bin/perl
+
+ while(<>){
+ tr/n-za-mN-ZA-M/a-zA-Z/;
+ print;
+ }
+
+In one-liner form:
+
+ perl -ne 'tr/n-za-mN-ZA-M/a-zA-Z/;print'
+
+
+=head1 Hashing order and checksums
+
+XXX
+
+=head1 I18N AND L10N
+
+Internationalization(I18N) and localization(L10N) are supported at least
+in principle even on EBCDIC machines. The details are system dependent
+and discussed under the L<perlebcdic/OS ISSUES> section below.
+
+=head1 MULTI OCTET CHARACTER SETS
+
+Multi byte EBCDIC code pages; Unicode, UTF-8, UTF-EBCDIC, XXX.
+
+=head1 OS ISSUES
+
+There may be a few system dependent issues
+of concern to EBCDIC Perl programmers.
+
+=head2 OS/400
+
+The PASE environment.
+
+=over 8
+
+=item IFS access
+
+XXX.
+
+=back
+
+=head2 OS/390
+
+Perl runs under Unix Systems Services or USS.
+
+=over 8
+
+=item chcp
+
+B<chcp> is supported as a shell utility for displaying and changing
+one's code page. See also L<chcp>.
+
+=item dataset access
+
+For sequential data set access try:
+
+ my @ds_records = `cat //DSNAME`;
+
+or:
+
+ my @ds_records = `cat //'HLQ.DSNAME'`;
+
+See also the OS390::Stdio module on CPAN.
+
+=item OS/390 iconv
+
+B<iconv> is supported as both a shell utility and a C RTL routine.
+See also the iconv(1) and iconv(3) manual pages.
+
+=item locales
+
+On OS/390 see L<locale> for information on locales. The L10N files
+are in F</usr/nls/locale>. $Config{d_setlocale} is 'define' on OS/390.
+
+=back
+
+=head2 VM/ESA?
+
+XXX.
+
+=head2 POSIX-BC?
+
+XXX.
+
+=head1 BUGS
+
+This pod document contains literal Latin 1 characters and may encounter
+translation difficulties. In particular one popular nroff implementation
+was known to strip accented characters to their unaccented counterparts
+while attempting to view this document through the B<pod2man> program
+(for example, you may see a plain C<y> rather than one with a diaeresis
+as in E<yuml>). Another nroff truncated the resultant man page at
+the first occurence of 8 bit characters.
+
+Not all shells will allow multiple C<-e> string arguments to perl to
+be concatenated together properly as recipes 2, 3, and 4 might seem
+to imply.
+
+Perl does not yet work with any Unicode features on EBCDIC platforms.
+
+=head1 SEE ALSO
+
+L<perllocale>, L<perlfunc>.
+
+=head1 REFERENCES
+
+http://anubis.dkuug.dk/i18n/charmaps
+
+http://www.unicode.org/
+
+http://www.unicode.org/unicode/reports/tr16/
+
+http://www.wps.com/texts/codes/
+B<ASCII: American Standard Code for Information Infiltration> Tom Jennings,
+September 1999.
+
+B<The Unicode Standard Version 2.0> The Unicode Consortium,
+ISBN 0-201-48345-9, Addison Wesley Developers Press, July 1996.
+
+B<The Unicode Standard Version 3.0> The Unicode Consortium, Lisa Moore ed.,
+ISBN 0-201-61633-5, Addison Wesley Developers Press, February 2000.
+
+B<CDRA: IBM - Character Data Representation Architecture -
+Reference and Registry>, IBM SC09-2190-00, December 1996.
+
+"Demystifying Character Sets", Andrea Vine, Multilingual Computing
+& Technology, B<#26 Vol. 10 Issue 4>, August/September 1999;
+ISSN 1523-0309; Multilingual Computing Inc. Sandpoint ID, USA.
+
+B<Codes, Ciphers, and Other Cryptic and Clandestine Communication>
+Fred B. Wrixon, ISBN 1-57912-040-7, Black Dog & Leventhal Publishers,
+1998.
+
+=head1 AUTHOR
+
+Peter Prymmer pvhp@best.com wrote this in 1999 and 2000
+with CCSID 0819 and 0037 help from Chris Leach and
+AndrE<eacute> Pirard A.Pirard@ulg.ac.be as well as POSIX-BC
+help from Thomas Dorner Thomas.Dorner@start.de.
+Thanks also to Vickie Cooper, Philip Newton, William Raffloer, and
+Joe Smith. Trademarks, registered trademarks, service marks and
+registered service marks used in this document are the property of
+their respective owners.
+
+
diff --git a/gnu/usr.bin/perl/pod/perlfilter.pod b/gnu/usr.bin/perl/pod/perlfilter.pod
index c3c83153adf..4327809ec95 100644
--- a/gnu/usr.bin/perl/pod/perlfilter.pod
+++ b/gnu/usr.bin/perl/pod/perlfilter.pod
@@ -2,7 +2,6 @@
perlfilter - Source Filters
-
=head1 DESCRIPTION
This article is about a little-known feature of Perl called
diff --git a/gnu/usr.bin/perl/pod/perlfork.pod b/gnu/usr.bin/perl/pod/perlfork.pod
index d930e9396e8..dc0a82bfd64 100644
--- a/gnu/usr.bin/perl/pod/perlfork.pod
+++ b/gnu/usr.bin/perl/pod/perlfork.pod
@@ -1,9 +1,14 @@
=head1 NAME
-perlfork - Perl's fork() emulation
+perlfork - Perl's fork() emulation (EXPERIMENTAL, subject to change)
=head1 SYNOPSIS
+ WARNING: As of the 5.6.1 release, the fork() emulation continues
+ to be an experimental feature. Use in production applications is
+ not recommended. See the "BUGS" and "CAVEATS AND LIMITATIONS"
+ sections below.
+
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.
@@ -11,7 +16,7 @@ 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
+real fork() at 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.
@@ -51,7 +56,7 @@ pseudo-processes are launched after others have been wait()-ed on.
=item %ENV
-Each pseudo-process maintains its own virtual enviroment. Modifications
+Each pseudo-process maintains its own virtual environment. 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.
@@ -274,6 +279,17 @@ are expected to be fixed for thread-safety.
=item *
+Perl's regular expression engine currently does not play very nicely
+with the fork() emulation. There are known race conditions arising
+from the regular expression engine modifying state carried in the opcode
+tree at run time (the fork() emulation relies on the opcode tree being
+immutable). This typically happens when the regex contains paren groups
+or variables interpolated within it that force a run time recompilation
+of the regex. Due to this major bug, the fork() emulation is not
+recommended for use in production applications at this time.
+
+=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
diff --git a/gnu/usr.bin/perl/pod/perlhack.pod b/gnu/usr.bin/perl/pod/perlhack.pod
index c6408702641..d524fe55f5f 100644
--- a/gnu/usr.bin/perl/pod/perlhack.pod
+++ b/gnu/usr.bin/perl/pod/perlhack.pod
@@ -194,6 +194,8 @@ 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.
+=head2 Keeping in sync
+
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
@@ -206,20 +208,256 @@ 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
+If you are a member of the perl5-porters mailing list, it is a good
+thing to keep in touch with the most recent changes. If not only to
+verify if what you would have posted as a bug report isn't already
+solved in the most recent available perl development branch, also
+known as perl-current, bleading edge perl, bleedperl or bleadperl.
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.
+Keeping in sync with the most recent branch can be done in several ways,
+but the most convenient and reliable way is using B<rsync>, available at
+ftp://rsync.samba.org/pub/rsync/ . (You can also get the most recent
+branch by FTP.)
+
+If you choose to keep in sync using rsync, there are two approaches
+to doing so:
+
+=over 4
+
+=item rsync'ing the source tree
+
+Presuming you are in the directory where your perl source resides
+and you have rsync installed and available, you can `upgrade' to
+the bleadperl using:
+
+ # rsync -avz rsync://ftp.linux.activestate.com/perl-current/ .
+
+This takes care of updating every single item in the source tree to
+the latest applied patch level, creating files that are new (to your
+distribution) and setting date/time stamps of existing files to
+reflect the bleadperl status.
+
+You can than check what patch was the latest that was applied by
+looking in the file B<.patch>, which will show the number of the
+latest patch.
+
+If you have more than one machine to keep in sync, and not all of
+them have access to the WAN (so you are not able to rsync all the
+source trees to the real source), there are some ways to get around
+this problem.
+
+=over 4
+
+=item Using rsync over the LAN
+
+Set up a local rsync server which makes the rsynced source tree
+available to the LAN and sync the other machines against this
+directory.
+
+From http://rsync.samba.org/README.html:
+
+ "Rsync uses rsh or ssh for communication. It does not need to be
+ setuid and requires no special privileges for installation. It
+ does not require a inetd entry or a deamon. You must, however,
+ have a working rsh or ssh system. Using ssh is recommended for
+ its security features."
+
+=item Using pushing over the NFS
+
+Having the other systems mounted over the NFS, you can take an
+active pushing approach by checking the just updated tree against
+the other not-yet synced trees. An example would be
+
+ #!/usr/bin/perl -w
+
+ use strict;
+ use File::Copy;
+
+ my %MF = map {
+ m/(\S+)/;
+ $1 => [ (stat $1)[2, 7, 9] ]; # mode, size, mtime
+ } `cat MANIFEST`;
+
+ my %remote = map { $_ => "/$_/pro/3gl/CPAN/perl-5.7.1" } qw(host1 host2);
+
+ foreach my $host (keys %remote) {
+ unless (-d $remote{$host}) {
+ print STDERR "Cannot Xsync for host $host\n";
+ next;
+ }
+ foreach my $file (keys %MF) {
+ my $rfile = "$remote{$host}/$file";
+ my ($mode, $size, $mtime) = (stat $rfile)[2, 7, 9];
+ defined $size or ($mode, $size, $mtime) = (0, 0, 0);
+ $size == $MF{$file}[1] && $mtime == $MF{$file}[2] and next;
+ printf "%4s %-34s %8d %9d %8d %9d\n",
+ $host, $file, $MF{$file}[1], $MF{$file}[2], $size, $mtime;
+ unlink $rfile;
+ copy ($file, $rfile);
+ utime time, $MF{$file}[2], $rfile;
+ chmod $MF{$file}[0], $rfile;
+ }
+ }
+
+though this is not perfect. It could be improved with checking
+file checksums before updating. Not all NFS systems support
+reliable utime support (when used over the NFS).
+
+=back
+
+=item rsync'ing the patches
+
+The source tree is maintained by the pumpking who applies patches to
+the files in the tree. These patches are either created by the
+pumpking himself using C<diff -c> after updating the file manually or
+by applying patches sent in by posters on the perl5-porters list.
+These patches are also saved and rsync'able, so you can apply them
+yourself to the source files.
+
+Presuming you are in a directory where your patches reside, you can
+get them in sync with
+
+ # rsync -avz rsync://ftp.linux.activestate.com/perl-current-diffs/ .
+
+This makes sure the latest available patch is downloaded to your
+patch directory.
+
+It's then up to you to apply these patches, using something like
+
+ # last=`ls -rt1 *.gz | tail -1`
+ # rsync -avz rsync://ftp.linux.activestate.com/perl-current-diffs/ .
+ # find . -name '*.gz' -newer $last -exec gzcat {} \; >blead.patch
+ # cd ../perl-current
+ # patch -p1 -N <../perl-current-diffs/blead.patch
+
+or, since this is only a hint towards how it works, use CPAN-patchaperl
+from Andreas König to have better control over the patching process.
+
+=back
+
+=head2 Why rsync the source tree
+
+=over 4
+
+=item It's easier
+
+Since you don't have to apply the patches yourself, you are sure all
+files in the source tree are in the right state.
+
+=item It's more recent
+
+According to Gurusamy Sarathy:
+
+ "... The rsync mirror is automatic and syncs with the repository
+ every five minutes.
+
+ "Updating the patch area still requires manual intervention
+ (with all the goofiness that implies, which you've noted) and
+ is typically on a daily cycle. Making this process automatic
+ is on my tuit list, but don't ask me when."
+
+=item It's more reliable
+
+Well, since the patches are updated by hand, I don't have to say any
+more ... (see Sarathy's remark).
+
+=back
+
+=head2 Why rsync the patches
+
+=over 4
+
+=item It's easier
+
+If you have more than one machine that you want to keep in track with
+bleadperl, it's easier to rsync the patches only once and then apply
+them to all the source trees on the different machines.
+
+In case you try to keep in pace on 5 different machines, for which
+only one of them has access to the WAN, rsync'ing all the source
+trees should than be done 5 times over the NFS. Having
+rsync'ed the patches only once, I can apply them to all the source
+trees automatically. Need you say more ;-)
+
+=item It's a good reference
+
+If you do not only like to have the most recent development branch,
+but also like to B<fix> bugs, or extend features, you want to dive
+into the sources. If you are a seasoned perl core diver, you don't
+need no manuals, tips, roadmaps, perlguts.pod or other aids to find
+your way around. But if you are a starter, the patches may help you
+in finding where you should start and how to change the bits that
+bug you.
+
+The file B<Changes> is updated on occasions the pumpking sees as his
+own little sync points. On those occasions, he releases a tar-ball of
+the current source tree (i.e. perl@7582.tar.gz), which will be an
+excellent point to start with when choosing to use the 'rsync the
+patches' scheme. Starting with perl@7582, which means a set of source
+files on which the latest applied patch is number 7582, you apply all
+succeeding patches available from then on (7583, 7584, ...).
+
+You can use the patches later as a kind of search archive.
+
+=over 4
+
+=item Finding a start point
+
+If you want to fix/change the behaviour of function/feature Foo, just
+scan the patches for patches that mention Foo either in the subject,
+the comments, or the body of the fix. A good chance the patch shows
+you the files that are affected by that patch which are very likely
+to be the starting point of your journey into the guts of perl.
+
+=item Finding how to fix a bug
+
+If you've found I<where> the function/feature Foo misbehaves, but you
+don't know how to fix it (but you do know the change you want to
+make), you can, again, peruse the patches for similar changes and
+look how others apply the fix.
+
+=item Finding the source of misbehaviour
+
+When you keep in sync with bleadperl, the pumpking would love to
+I<see> that the community efforts realy work. So after each of his
+sync points, you are to 'make test' to check if everything is still
+in working order. If it is, you do 'make ok', which will send an OK
+report to perlbug@perl.org. (If you do not have access to a mailer
+from the system you just finished successfully 'make test', you can
+do 'make okfile', which creates the file C<perl.ok>, which you can
+than take to your favourite mailer and mail yourself).
+
+But of course, as always, things will not allways lead to a success
+path, and one or more test do not pass the 'make test'. Before
+sending in a bug report (using 'make nok' or 'make nokfile'), check
+the mailing list if someone else has reported the bug already and if
+so, confirm it by replying to that message. If not, you might want to
+trace the source of that misbehaviour B<before> sending in the bug,
+which will help all the other porters in finding the solution.
+
+Here the saved patches come in very handy. You can check the list of
+patches to see which patch changed what file and what change caused
+the misbehaviour. If you note that in the bug report, it saves the
+one trying to solve it, looking for that point.
+
+=back
+
+If searching the patches is too bothersome, you might consider using
+perl's bugtron to find more information about discussions and
+ramblings on posted bugs.
+
+=back
+
+If you want to get the best of both worlds, rsync both the source
+tree for convenience, reliability and ease and rsync the patches
+for reference.
+
+=head2 Submitting patches
+
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
@@ -237,7 +475,7 @@ 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@perl.org> or I<perlbug@perl.com>). 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
@@ -251,31 +489,6 @@ volunteers who test CPAN modules on a variety of platforms. Perl Labs
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
@@ -285,6 +498,1223 @@ 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>.
+To hack on the Perl guts, you'll need to read the following things:
+
+=over 3
+
+=item L<perlguts>
+
+This is of paramount importance, since it's the documentation of what
+goes where in the Perl source. Read it over a couple of times and it
+might start to make sense - don't worry if it doesn't yet, because the
+best way to study it is to read it in conjunction with poking at Perl
+source, and we'll do that later on.
+
+You might also want to look at Gisle Aas's illustrated perlguts -
+there's no guarantee that this will be absolutely up-to-date with the
+latest documentation in the Perl core, but the fundamentals will be
+right. (http://gisle.aas.no/perl/illguts/)
+
+=item L<perlxstut> and L<perlxs>
+
+A working knowledge of XSUB programming is incredibly useful for core
+hacking; XSUBs use techniques drawn from the PP code, the portion of the
+guts that actually executes a Perl program. It's a lot gentler to learn
+those techniques from simple examples and explanation than from the core
+itself.
+
+=item L<perlapi>
+
+The documentation for the Perl API explains what some of the internal
+functions do, as well as the many macros used in the source.
+
+=item F<Porting/pumpkin.pod>
+
+This is a collection of words of wisdom for a Perl porter; some of it is
+only useful to the pumpkin holder, but most of it applies to anyone
+wanting to go about Perl development.
+
+=item The perl5-porters FAQ
+
+This is posted to perl5-porters at the beginning on every month, and
+should be available from http://perlhacker.org/p5p-faq; alternatively,
+you can get the FAQ emailed to you by sending mail to
+C<perl5-porters-faq@perl.org>. It contains hints on reading
+perl5-porters, information on how perl5-porters works and how Perl
+development in general works.
+
+=back
+
+=head2 Finding Your Way Around
+
+Perl maintenance can be split into a number of areas, and certain people
+(pumpkins) will have responsibility for each area. These areas sometimes
+correspond to files or directories in the source kit. Among the areas are:
+
+=over 3
+
+=item Core modules
+
+Modules shipped as part of the Perl core live in the F<lib/> and F<ext/>
+subdirectories: F<lib/> is for the pure-Perl modules, and F<ext/>
+contains the core XS modules.
+
+=item Documentation
+
+Documentation maintenance includes looking after everything in the
+F<pod/> directory, (as well as contributing new documentation) and
+the documentation to the modules in core.
+
+=item Configure
+
+The configure process is the way we make Perl portable across the
+myriad of operating systems it supports. Responsibility for the
+configure, build and installation process, as well as the overall
+portability of the core code rests with the configure pumpkin - others
+help out with individual operating systems.
+
+The files involved are the operating system directories, (F<win32/>,
+F<os2/>, F<vms/> and so on) the shell scripts which generate F<config.h>
+and F<Makefile>, as well as the metaconfig files which generate
+F<Configure>. (metaconfig isn't included in the core distribution.)
+
+=item Interpreter
+
+And of course, there's the core of the Perl interpreter itself. Let's
+have a look at that in a little more detail.
+
+=back
+
+Before we leave looking at the layout, though, don't forget that
+F<MANIFEST> contains not only the file names in the Perl distribution,
+but short descriptions of what's in them, too. For an overview of the
+important files, try this:
+
+ perl -lne 'print if /^[^\/]+\.[ch]\s+/' MANIFEST
+
+=head2 Elements of the interpreter
+
+The work of the interpreter has two main stages: compiling the code
+into the internal representation, or bytecode, and then executing it.
+L<perlguts/Compiled code> explains exactly how the compilation stage
+happens.
+
+Here is a short breakdown of perl's operation:
+
+=over 3
+
+=item Startup
+
+The action begins in F<perlmain.c>. (or F<miniperlmain.c> for miniperl)
+This is very high-level code, enough to fit on a single screen, and it
+resembles the code found in L<perlembed>; most of the real action takes
+place in F<perl.c>
+
+First, F<perlmain.c> allocates some memory and constructs a Perl
+interpreter:
+
+ 1 PERL_SYS_INIT3(&argc,&argv,&env);
+ 2
+ 3 if (!PL_do_undump) {
+ 4 my_perl = perl_alloc();
+ 5 if (!my_perl)
+ 6 exit(1);
+ 7 perl_construct(my_perl);
+ 8 PL_perl_destruct_level = 0;
+ 9 }
+
+Line 1 is a macro, and its definition is dependent on your operating
+system. Line 3 references C<PL_do_undump>, a global variable - all
+global variables in Perl start with C<PL_>. This tells you whether the
+current running program was created with the C<-u> flag to perl and then
+F<undump>, which means it's going to be false in any sane context.
+
+Line 4 calls a function in F<perl.c> to allocate memory for a Perl
+interpreter. It's quite a simple function, and the guts of it looks like
+this:
+
+ my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
+
+Here you see an example of Perl's system abstraction, which we'll see
+later: C<PerlMem_malloc> is either your system's C<malloc>, or Perl's
+own C<malloc> as defined in F<malloc.c> if you selected that option at
+configure time.
+
+Next, in line 7, we construct the interpreter; this sets up all the
+special variables that Perl needs, the stacks, and so on.
+
+Now we pass Perl the command line options, and tell it to go:
+
+ exitstatus = perl_parse(my_perl, xs_init, argc, argv, (char **)NULL);
+ if (!exitstatus) {
+ exitstatus = perl_run(my_perl);
+ }
+
+
+C<perl_parse> is actually a wrapper around C<S_parse_body>, as defined
+in F<perl.c>, which processes the command line options, sets up any
+statically linked XS modules, opens the program and calls C<yyparse> to
+parse it.
+
+=item Parsing
+
+The aim of this stage is to take the Perl source, and turn it into an op
+tree. We'll see what one of those looks like later. Strictly speaking,
+there's three things going on here.
+
+C<yyparse>, the parser, lives in F<perly.c>, although you're better off
+reading the original YACC input in F<perly.y>. (Yes, Virginia, there
+B<is> a YACC grammar for Perl!) The job of the parser is to take your
+code and `understand' it, splitting it into sentences, deciding which
+operands go with which operators and so on.
+
+The parser is nobly assisted by the lexer, which chunks up your input
+into tokens, and decides what type of thing each token is: a variable
+name, an operator, a bareword, a subroutine, a core function, and so on.
+The main point of entry to the lexer is C<yylex>, and that and its
+associated routines can be found in F<toke.c>. Perl isn't much like
+other computer languages; it's highly context sensitive at times, it can
+be tricky to work out what sort of token something is, or where a token
+ends. As such, there's a lot of interplay between the tokeniser and the
+parser, which can get pretty frightening if you're not used to it.
+
+As the parser understands a Perl program, it builds up a tree of
+operations for the interpreter to perform during execution. The routines
+which construct and link together the various operations are to be found
+in F<op.c>, and will be examined later.
+
+=item Optimization
+
+Now the parsing stage is complete, and the finished tree represents
+the operations that the Perl interpreter needs to perform to execute our
+program. Next, Perl does a dry run over the tree looking for
+optimisations: constant expressions such as C<3 + 4> will be computed
+now, and the optimizer will also see if any multiple operations can be
+replaced with a single one. For instance, to fetch the variable C<$foo>,
+instead of grabbing the glob C<*foo> and looking at the scalar
+component, the optimizer fiddles the op tree to use a function which
+directly looks up the scalar in question. The main optimizer is C<peep>
+in F<op.c>, and many ops have their own optimizing functions.
+
+=item Running
+
+Now we're finally ready to go: we have compiled Perl byte code, and all
+that's left to do is run it. The actual execution is done by the
+C<runops_standard> function in F<run.c>; more specifically, it's done by
+these three innocent looking lines:
+
+ while ((PL_op = CALL_FPTR(PL_op->op_ppaddr)(aTHX))) {
+ PERL_ASYNC_CHECK();
+ }
+
+You may be more comfortable with the Perl version of that:
+
+ PERL_ASYNC_CHECK() while $Perl::op = &{$Perl::op->{function}};
+
+Well, maybe not. Anyway, each op contains a function pointer, which
+stipulates the function which will actually carry out the operation.
+This function will return the next op in the sequence - this allows for
+things like C<if> which choose the next op dynamically at run time.
+The C<PERL_ASYNC_CHECK> makes sure that things like signals interrupt
+execution if required.
+
+The actual functions called are known as PP code, and they're spread
+between four files: F<pp_hot.c> contains the `hot' code, which is most
+often used and highly optimized, F<pp_sys.c> contains all the
+system-specific functions, F<pp_ctl.c> contains the functions which
+implement control structures (C<if>, C<while> and the like) and F<pp.c>
+contains everything else. These are, if you like, the C code for Perl's
+built-in functions and operators.
+
+=back
+
+=head2 Internal Variable Types
+
+You should by now have had a look at L<perlguts>, which tells you about
+Perl's internal variable types: SVs, HVs, AVs and the rest. If not, do
+that now.
+
+These variables are used not only to represent Perl-space variables, but
+also any constants in the code, as well as some structures completely
+internal to Perl. The symbol table, for instance, is an ordinary Perl
+hash. Your code is represented by an SV as it's read into the parser;
+any program files you call are opened via ordinary Perl filehandles, and
+so on.
+
+The core L<Devel::Peek|Devel::Peek> module lets us examine SVs from a
+Perl program. Let's see, for instance, how Perl treats the constant
+C<"hello">.
+
+ % perl -MDevel::Peek -e 'Dump("hello")'
+ 1 SV = PV(0xa041450) at 0xa04ecbc
+ 2 REFCNT = 1
+ 3 FLAGS = (POK,READONLY,pPOK)
+ 4 PV = 0xa0484e0 "hello"\0
+ 5 CUR = 5
+ 6 LEN = 6
+
+Reading C<Devel::Peek> output takes a bit of practise, so let's go
+through it line by line.
+
+Line 1 tells us we're looking at an SV which lives at C<0xa04ecbc> in
+memory. SVs themselves are very simple structures, but they contain a
+pointer to a more complex structure. In this case, it's a PV, a
+structure which holds a string value, at location C<0xa041450>. Line 2
+is the reference count; there are no other references to this data, so
+it's 1.
+
+Line 3 are the flags for this SV - it's OK to use it as a PV, it's a
+read-only SV (because it's a constant) and the data is a PV internally.
+Next we've got the contents of the string, starting at location
+C<0xa0484e0>.
+
+Line 5 gives us the current length of the string - note that this does
+B<not> include the null terminator. Line 6 is not the length of the
+string, but the length of the currently allocated buffer; as the string
+grows, Perl automatically extends the available storage via a routine
+called C<SvGROW>.
+
+You can get at any of these quantities from C very easily; just add
+C<Sv> to the name of the field shown in the snippet, and you've got a
+macro which will return the value: C<SvCUR(sv)> returns the current
+length of the string, C<SvREFCOUNT(sv)> returns the reference count,
+C<SvPV(sv, len)> returns the string itself with its length, and so on.
+More macros to manipulate these properties can be found in L<perlguts>.
+
+Let's take an example of manipulating a PV, from C<sv_catpvn>, in F<sv.c>
+
+ 1 void
+ 2 Perl_sv_catpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
+ 3 {
+ 4 STRLEN tlen;
+ 5 char *junk;
+
+ 6 junk = SvPV_force(sv, tlen);
+ 7 SvGROW(sv, tlen + len + 1);
+ 8 if (ptr == junk)
+ 9 ptr = SvPVX(sv);
+ 10 Move(ptr,SvPVX(sv)+tlen,len,char);
+ 11 SvCUR(sv) += len;
+ 12 *SvEND(sv) = '\0';
+ 13 (void)SvPOK_only_UTF8(sv); /* validate pointer */
+ 14 SvTAINT(sv);
+ 15 }
+
+This is a function which adds a string, C<ptr>, of length C<len> onto
+the end of the PV stored in C<sv>. The first thing we do in line 6 is
+make sure that the SV B<has> a valid PV, by calling the C<SvPV_force>
+macro to force a PV. As a side effect, C<tlen> gets set to the current
+value of the PV, and the PV itself is returned to C<junk>.
+
+In line 7, we make sure that the SV will have enough room to accommodate
+the old string, the new string and the null terminator. If C<LEN> isn't
+big enough, C<SvGROW> will reallocate space for us.
+
+Now, if C<junk> is the same as the string we're trying to add, we can
+grab the string directly from the SV; C<SvPVX> is the address of the PV
+in the SV.
+
+Line 10 does the actual catenation: the C<Move> macro moves a chunk of
+memory around: we move the string C<ptr> to the end of the PV - that's
+the start of the PV plus its current length. We're moving C<len> bytes
+of type C<char>. After doing so, we need to tell Perl we've extended the
+string, by altering C<CUR> to reflect the new length. C<SvEND> is a
+macro which gives us the end of the string, so that needs to be a
+C<"\0">.
+
+Line 13 manipulates the flags; since we've changed the PV, any IV or NV
+values will no longer be valid: if we have C<$a=10; $a.="6";> we don't
+want to use the old IV of 10. C<SvPOK_only_utf8> is a special UTF8-aware
+version of C<SvPOK_only>, a macro which turns off the IOK and NOK flags
+and turns on POK. The final C<SvTAINT> is a macro which launders tainted
+data if taint mode is turned on.
+
+AVs and HVs are more complicated, but SVs are by far the most common
+variable type being thrown around. Having seen something of how we
+manipulate these, let's go on and look at how the op tree is
+constructed.
+
+=head2 Op Trees
+
+First, what is the op tree, anyway? The op tree is the parsed
+representation of your program, as we saw in our section on parsing, and
+it's the sequence of operations that Perl goes through to execute your
+program, as we saw in L</Running>.
+
+An op is a fundamental operation that Perl can perform: all the built-in
+functions and operators are ops, and there are a series of ops which
+deal with concepts the interpreter needs internally - entering and
+leaving a block, ending a statement, fetching a variable, and so on.
+
+The op tree is connected in two ways: you can imagine that there are two
+"routes" through it, two orders in which you can traverse the tree.
+First, parse order reflects how the parser understood the code, and
+secondly, execution order tells perl what order to perform the
+operations in.
+
+The easiest way to examine the op tree is to stop Perl after it has
+finished parsing, and get it to dump out the tree. This is exactly what
+the compiler backends L<B::Terse|B::Terse> and L<B::Debug|B::Debug> do.
+
+Let's have a look at how Perl sees C<$a = $b + $c>:
+
+ % perl -MO=Terse -e '$a=$b+$c'
+ 1 LISTOP (0x8179888) leave
+ 2 OP (0x81798b0) enter
+ 3 COP (0x8179850) nextstate
+ 4 BINOP (0x8179828) sassign
+ 5 BINOP (0x8179800) add [1]
+ 6 UNOP (0x81796e0) null [15]
+ 7 SVOP (0x80fafe0) gvsv GV (0x80fa4cc) *b
+ 8 UNOP (0x81797e0) null [15]
+ 9 SVOP (0x8179700) gvsv GV (0x80efeb0) *c
+ 10 UNOP (0x816b4f0) null [15]
+ 11 SVOP (0x816dcf0) gvsv GV (0x80fa460) *a
+
+Let's start in the middle, at line 4. This is a BINOP, a binary
+operator, which is at location C<0x8179828>. The specific operator in
+question is C<sassign> - scalar assignment - and you can find the code
+which implements it in the function C<pp_sassign> in F<pp_hot.c>. As a
+binary operator, it has two children: the add operator, providing the
+result of C<$b+$c>, is uppermost on line 5, and the left hand side is on
+line 10.
+
+Line 10 is the null op: this does exactly nothing. What is that doing
+there? If you see the null op, it's a sign that something has been
+optimized away after parsing. As we mentioned in L</Optimization>,
+the optimization stage sometimes converts two operations into one, for
+example when fetching a scalar variable. When this happens, instead of
+rewriting the op tree and cleaning up the dangling pointers, it's easier
+just to replace the redundant operation with the null op. Originally,
+the tree would have looked like this:
+
+ 10 SVOP (0x816b4f0) rv2sv [15]
+ 11 SVOP (0x816dcf0) gv GV (0x80fa460) *a
+
+That is, fetch the C<a> entry from the main symbol table, and then look
+at the scalar component of it: C<gvsv> (C<pp_gvsv> into F<pp_hot.c>)
+happens to do both these things.
+
+The right hand side, starting at line 5 is similar to what we've just
+seen: we have the C<add> op (C<pp_add> also in F<pp_hot.c>) add together
+two C<gvsv>s.
+
+Now, what's this about?
+
+ 1 LISTOP (0x8179888) leave
+ 2 OP (0x81798b0) enter
+ 3 COP (0x8179850) nextstate
+
+C<enter> and C<leave> are scoping ops, and their job is to perform any
+housekeeping every time you enter and leave a block: lexical variables
+are tidied up, unreferenced variables are destroyed, and so on. Every
+program will have those first three lines: C<leave> is a list, and its
+children are all the statements in the block. Statements are delimited
+by C<nextstate>, so a block is a collection of C<nextstate> ops, with
+the ops to be performed for each statement being the children of
+C<nextstate>. C<enter> is a single op which functions as a marker.
+
+That's how Perl parsed the program, from top to bottom:
+
+ Program
+ |
+ Statement
+ |
+ =
+ / \
+ / \
+ $a +
+ / \
+ $b $c
+
+However, it's impossible to B<perform> the operations in this order:
+you have to find the values of C<$b> and C<$c> before you add them
+together, for instance. So, the other thread that runs through the op
+tree is the execution order: each op has a field C<op_next> which points
+to the next op to be run, so following these pointers tells us how perl
+executes the code. We can traverse the tree in this order using
+the C<exec> option to C<B::Terse>:
+
+ % perl -MO=Terse,exec -e '$a=$b+$c'
+ 1 OP (0x8179928) enter
+ 2 COP (0x81798c8) nextstate
+ 3 SVOP (0x81796c8) gvsv GV (0x80fa4d4) *b
+ 4 SVOP (0x8179798) gvsv GV (0x80efeb0) *c
+ 5 BINOP (0x8179878) add [1]
+ 6 SVOP (0x816dd38) gvsv GV (0x80fa468) *a
+ 7 BINOP (0x81798a0) sassign
+ 8 LISTOP (0x8179900) leave
+
+This probably makes more sense for a human: enter a block, start a
+statement. Get the values of C<$b> and C<$c>, and add them together.
+Find C<$a>, and assign one to the other. Then leave.
+
+The way Perl builds up these op trees in the parsing process can be
+unravelled by examining F<perly.y>, the YACC grammar. Let's take the
+piece we need to construct the tree for C<$a = $b + $c>
+
+ 1 term : term ASSIGNOP term
+ 2 { $$ = newASSIGNOP(OPf_STACKED, $1, $2, $3); }
+ 3 | term ADDOP term
+ 4 { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
+
+If you're not used to reading BNF grammars, this is how it works: You're
+fed certain things by the tokeniser, which generally end up in upper
+case. Here, C<ADDOP>, is provided when the tokeniser sees C<+> in your
+code. C<ASSIGNOP> is provided when C<=> is used for assigning. These are
+`terminal symbols', because you can't get any simpler than them.
+
+The grammar, lines one and three of the snippet above, tells you how to
+build up more complex forms. These complex forms, `non-terminal symbols'
+are generally placed in lower case. C<term> here is a non-terminal
+symbol, representing a single expression.
+
+The grammar gives you the following rule: you can make the thing on the
+left of the colon if you see all the things on the right in sequence.
+This is called a "reduction", and the aim of parsing is to completely
+reduce the input. There are several different ways you can perform a
+reduction, separated by vertical bars: so, C<term> followed by C<=>
+followed by C<term> makes a C<term>, and C<term> followed by C<+>
+followed by C<term> can also make a C<term>.
+
+So, if you see two terms with an C<=> or C<+>, between them, you can
+turn them into a single expression. When you do this, you execute the
+code in the block on the next line: if you see C<=>, you'll do the code
+in line 2. If you see C<+>, you'll do the code in line 4. It's this code
+which contributes to the op tree.
+
+ | term ADDOP term
+ { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
+
+What this does is creates a new binary op, and feeds it a number of
+variables. The variables refer to the tokens: C<$1> is the first token in
+the input, C<$2> the second, and so on - think regular expression
+backreferences. C<$$> is the op returned from this reduction. So, we
+call C<newBINOP> to create a new binary operator. The first parameter to
+C<newBINOP>, a function in F<op.c>, is the op type. It's an addition
+operator, so we want the type to be C<ADDOP>. We could specify this
+directly, but it's right there as the second token in the input, so we
+use C<$2>. The second parameter is the op's flags: 0 means `nothing
+special'. Then the things to add: the left and right hand side of our
+expression, in scalar context.
+
+=head2 Stacks
+
+When perl executes something like C<addop>, how does it pass on its
+results to the next op? The answer is, through the use of stacks. Perl
+has a number of stacks to store things it's currently working on, and
+we'll look at the three most important ones here.
+
+=over 3
+
+=item Argument stack
+
+Arguments are passed to PP code and returned from PP code using the
+argument stack, C<ST>. The typical way to handle arguments is to pop
+them off the stack, deal with them how you wish, and then push the result
+back onto the stack. This is how, for instance, the cosine operator
+works:
+
+ NV value;
+ value = POPn;
+ value = Perl_cos(value);
+ XPUSHn(value);
+
+We'll see a more tricky example of this when we consider Perl's macros
+below. C<POPn> gives you the NV (floating point value) of the top SV on
+the stack: the C<$x> in C<cos($x)>. Then we compute the cosine, and push
+the result back as an NV. The C<X> in C<XPUSHn> means that the stack
+should be extended if necessary - it can't be necessary here, because we
+know there's room for one more item on the stack, since we've just
+removed one! The C<XPUSH*> macros at least guarantee safety.
+
+Alternatively, you can fiddle with the stack directly: C<SP> gives you
+the first element in your portion of the stack, and C<TOP*> gives you
+the top SV/IV/NV/etc. on the stack. So, for instance, to do unary
+negation of an integer:
+
+ SETi(-TOPi);
+
+Just set the integer value of the top stack entry to its negation.
+
+Argument stack manipulation in the core is exactly the same as it is in
+XSUBs - see L<perlxstut>, L<perlxs> and L<perlguts> for a longer
+description of the macros used in stack manipulation.
+
+=item Mark stack
+
+I say `your portion of the stack' above because PP code doesn't
+necessarily get the whole stack to itself: if your function calls
+another function, you'll only want to expose the arguments aimed for the
+called function, and not (necessarily) let it get at your own data. The
+way we do this is to have a `virtual' bottom-of-stack, exposed to each
+function. The mark stack keeps bookmarks to locations in the argument
+stack usable by each function. For instance, when dealing with a tied
+variable, (internally, something with `P' magic) Perl has to call
+methods for accesses to the tied variables. However, we need to separate
+the arguments exposed to the method to the argument exposed to the
+original function - the store or fetch or whatever it may be. Here's how
+the tied C<push> is implemented; see C<av_push> in F<av.c>:
+
+ 1 PUSHMARK(SP);
+ 2 EXTEND(SP,2);
+ 3 PUSHs(SvTIED_obj((SV*)av, mg));
+ 4 PUSHs(val);
+ 5 PUTBACK;
+ 6 ENTER;
+ 7 call_method("PUSH", G_SCALAR|G_DISCARD);
+ 8 LEAVE;
+ 9 POPSTACK;
+
+The lines which concern the mark stack are the first, fifth and last
+lines: they save away, restore and remove the current position of the
+argument stack.
+
+Let's examine the whole implementation, for practice:
+
+ 1 PUSHMARK(SP);
+
+Push the current state of the stack pointer onto the mark stack. This is
+so that when we've finished adding items to the argument stack, Perl
+knows how many things we've added recently.
+
+ 2 EXTEND(SP,2);
+ 3 PUSHs(SvTIED_obj((SV*)av, mg));
+ 4 PUSHs(val);
+
+We're going to add two more items onto the argument stack: when you have
+a tied array, the C<PUSH> subroutine receives the object and the value
+to be pushed, and that's exactly what we have here - the tied object,
+retrieved with C<SvTIED_obj>, and the value, the SV C<val>.
+
+ 5 PUTBACK;
+
+Next we tell Perl to make the change to the global stack pointer: C<dSP>
+only gave us a local copy, not a reference to the global.
+
+ 6 ENTER;
+ 7 call_method("PUSH", G_SCALAR|G_DISCARD);
+ 8 LEAVE;
+
+C<ENTER> and C<LEAVE> localise a block of code - they make sure that all
+variables are tidied up, everything that has been localised gets
+its previous value returned, and so on. Think of them as the C<{> and
+C<}> of a Perl block.
+
+To actually do the magic method call, we have to call a subroutine in
+Perl space: C<call_method> takes care of that, and it's described in
+L<perlcall>. We call the C<PUSH> method in scalar context, and we're
+going to discard its return value.
+
+ 9 POPSTACK;
+
+Finally, we remove the value we placed on the mark stack, since we
+don't need it any more.
+
+=item Save stack
+
+C doesn't have a concept of local scope, so perl provides one. We've
+seen that C<ENTER> and C<LEAVE> are used as scoping braces; the save
+stack implements the C equivalent of, for example:
+
+ {
+ local $foo = 42;
+ ...
+ }
+
+See L<perlguts/Localising Changes> for how to use the save stack.
+
+=back
+
+=head2 Millions of Macros
+
+One thing you'll notice about the Perl source is that it's full of
+macros. Some have called the pervasive use of macros the hardest thing
+to understand, others find it adds to clarity. Let's take an example,
+the code which implements the addition operator:
+
+ 1 PP(pp_add)
+ 2 {
+ 3 dSP; dATARGET; tryAMAGICbin(add,opASSIGN);
+ 4 {
+ 5 dPOPTOPnnrl_ul;
+ 6 SETn( left + right );
+ 7 RETURN;
+ 8 }
+ 9 }
+
+Every line here (apart from the braces, of course) contains a macro. The
+first line sets up the function declaration as Perl expects for PP code;
+line 3 sets up variable declarations for the argument stack and the
+target, the return value of the operation. Finally, it tries to see if
+the addition operation is overloaded; if so, the appropriate subroutine
+is called.
+
+Line 5 is another variable declaration - all variable declarations start
+with C<d> - which pops from the top of the argument stack two NVs (hence
+C<nn>) and puts them into the variables C<right> and C<left>, hence the
+C<rl>. These are the two operands to the addition operator. Next, we
+call C<SETn> to set the NV of the return value to the result of adding
+the two values. This done, we return - the C<RETURN> macro makes sure
+that our return value is properly handled, and we pass the next operator
+to run back to the main run loop.
+
+Most of these macros are explained in L<perlapi>, and some of the more
+important ones are explained in L<perlxs> as well. Pay special attention
+to L<perlguts/Background and PERL_IMPLICIT_CONTEXT> for information on
+the C<[pad]THX_?> macros.
+
+
+=head2 Poking at Perl
+
+To really poke around with Perl, you'll probably want to build Perl for
+debugging, like this:
+
+ ./Configure -d -D optimize=-g
+ make
+
+C<-g> is a flag to the C compiler to have it produce debugging
+information which will allow us to step through a running program.
+F<Configure> will also turn on the C<DEBUGGING> compilation symbol which
+enables all the internal debugging code in Perl. There are a whole bunch
+of things you can debug with this: L<perlrun> lists them all, and the
+best way to find out about them is to play about with them. The most
+useful options are probably
+
+ l Context (loop) stack processing
+ t Trace execution
+ o Method and overloading resolution
+ c String/numeric conversions
+
+Some of the functionality of the debugging code can be achieved using XS
+modules.
+
+ -Dr => use re 'debug'
+ -Dx => use O 'Debug'
+
+=head2 Using a source-level debugger
+
+If the debugging output of C<-D> doesn't help you, it's time to step
+through perl's execution with a source-level debugger.
+
+=over 3
+
+=item *
+
+We'll use C<gdb> for our examples here; the principles will apply to any
+debugger, but check the manual of the one you're using.
+
+=back
+
+To fire up the debugger, type
+
+ gdb ./perl
+
+You'll want to do that in your Perl source tree so the debugger can read
+the source code. You should see the copyright message, followed by the
+prompt.
+
+ (gdb)
+
+C<help> will get you into the documentation, but here are the most
+useful commands:
+
+=over 3
+
+=item run [args]
+
+Run the program with the given arguments.
+
+=item break function_name
+
+=item break source.c:xxx
+
+Tells the debugger that we'll want to pause execution when we reach
+either the named function (but see L<perlguts/Internal Functions>!) or the given
+line in the named source file.
+
+=item step
+
+Steps through the program a line at a time.
+
+=item next
+
+Steps through the program a line at a time, without descending into
+functions.
+
+=item continue
+
+Run until the next breakpoint.
+
+=item finish
+
+Run until the end of the current function, then stop again.
+
+=item 'enter'
+
+Just pressing Enter will do the most recent operation again - it's a
+blessing when stepping through miles of source code.
+
+=item print
+
+Execute the given C code and print its results. B<WARNING>: Perl makes
+heavy use of macros, and F<gdb> is not aware of macros. You'll have to
+substitute them yourself. So, for instance, you can't say
+
+ print SvPV_nolen(sv)
+
+but you have to say
+
+ print Perl_sv_2pv_nolen(sv)
+
+You may find it helpful to have a "macro dictionary", which you can
+produce by saying C<cpp -dM perl.c | sort>. Even then, F<cpp> won't
+recursively apply the macros for you.
+
+=back
+
+=head2 Dumping Perl Data Structures
+
+One way to get around this macro hell is to use the dumping functions in
+F<dump.c>; these work a little like an internal
+L<Devel::Peek|Devel::Peek>, but they also cover OPs and other structures
+that you can't get at from Perl. Let's take an example. We'll use the
+C<$a = $b + $c> we used before, but give it a bit of context:
+C<$b = "6XXXX"; $c = 2.3;>. Where's a good place to stop and poke around?
+
+What about C<pp_add>, the function we examined earlier to implement the
+C<+> operator:
+
+ (gdb) break Perl_pp_add
+ Breakpoint 1 at 0x46249f: file pp_hot.c, line 309.
+
+Notice we use C<Perl_pp_add> and not C<pp_add> - see L<perlguts/Internal Functions>.
+With the breakpoint in place, we can run our program:
+
+ (gdb) run -e '$b = "6XXXX"; $c = 2.3; $a = $b + $c'
+
+Lots of junk will go past as gdb reads in the relevant source files and
+libraries, and then:
+
+ Breakpoint 1, Perl_pp_add () at pp_hot.c:309
+ 309 dSP; dATARGET; tryAMAGICbin(add,opASSIGN);
+ (gdb) step
+ 311 dPOPTOPnnrl_ul;
+ (gdb)
+
+We looked at this bit of code before, and we said that C<dPOPTOPnnrl_ul>
+arranges for two C<NV>s to be placed into C<left> and C<right> - let's
+slightly expand it:
+
+ #define dPOPTOPnnrl_ul NV right = POPn; \
+ SV *leftsv = TOPs; \
+ NV left = USE_LEFT(leftsv) ? SvNV(leftsv) : 0.0
+
+C<POPn> takes the SV from the top of the stack and obtains its NV either
+directly (if C<SvNOK> is set) or by calling the C<sv_2nv> function.
+C<TOPs> takes the next SV from the top of the stack - yes, C<POPn> uses
+C<TOPs> - but doesn't remove it. We then use C<SvNV> to get the NV from
+C<leftsv> in the same way as before - yes, C<POPn> uses C<SvNV>.
+
+Since we don't have an NV for C<$b>, we'll have to use C<sv_2nv> to
+convert it. If we step again, we'll find ourselves there:
+
+ Perl_sv_2nv (sv=0xa0675d0) at sv.c:1669
+ 1669 if (!sv)
+ (gdb)
+
+We can now use C<Perl_sv_dump> to investigate the SV:
+
+ SV = PV(0xa057cc0) at 0xa0675d0
+ REFCNT = 1
+ FLAGS = (POK,pPOK)
+ PV = 0xa06a510 "6XXXX"\0
+ CUR = 5
+ LEN = 6
+ $1 = void
+
+We know we're going to get C<6> from this, so let's finish the
+subroutine:
+
+ (gdb) finish
+ Run till exit from #0 Perl_sv_2nv (sv=0xa0675d0) at sv.c:1671
+ 0x462669 in Perl_pp_add () at pp_hot.c:311
+ 311 dPOPTOPnnrl_ul;
+
+We can also dump out this op: the current op is always stored in
+C<PL_op>, and we can dump it with C<Perl_op_dump>. This'll give us
+similar output to L<B::Debug|B::Debug>.
+
+ {
+ 13 TYPE = add ===> 14
+ TARG = 1
+ FLAGS = (SCALAR,KIDS)
+ {
+ TYPE = null ===> (12)
+ (was rv2sv)
+ FLAGS = (SCALAR,KIDS)
+ {
+ 11 TYPE = gvsv ===> 12
+ FLAGS = (SCALAR)
+ GV = main::b
+ }
+ }
+
+< finish this later >
+
+=head2 Patching
+
+All right, we've now had a look at how to navigate the Perl sources and
+some things you'll need to know when fiddling with them. Let's now get
+on and create a simple patch. Here's something Larry suggested: if a
+C<U> is the first active format during a C<pack>, (for example,
+C<pack "U3C8", @stuff>) then the resulting string should be treated as
+UTF8 encoded.
+
+How do we prepare to fix this up? First we locate the code in question -
+the C<pack> happens at runtime, so it's going to be in one of the F<pp>
+files. Sure enough, C<pp_pack> is in F<pp.c>. Since we're going to be
+altering this file, let's copy it to F<pp.c~>.
+
+Now let's look over C<pp_pack>: we take a pattern into C<pat>, and then
+loop over the pattern, taking each format character in turn into
+C<datum_type>. Then for each possible format character, we swallow up
+the other arguments in the pattern (a field width, an asterisk, and so
+on) and convert the next chunk input into the specified format, adding
+it onto the output SV C<cat>.
+
+How do we know if the C<U> is the first format in the C<pat>? Well, if
+we have a pointer to the start of C<pat> then, if we see a C<U> we can
+test whether we're still at the start of the string. So, here's where
+C<pat> is set up:
+
+ STRLEN fromlen;
+ register char *pat = SvPVx(*++MARK, fromlen);
+ register char *patend = pat + fromlen;
+ register I32 len;
+ I32 datumtype;
+ SV *fromstr;
+
+We'll have another string pointer in there:
+
+ STRLEN fromlen;
+ register char *pat = SvPVx(*++MARK, fromlen);
+ register char *patend = pat + fromlen;
+ + char *patcopy;
+ register I32 len;
+ I32 datumtype;
+ SV *fromstr;
+
+And just before we start the loop, we'll set C<patcopy> to be the start
+of C<pat>:
+
+ items = SP - MARK;
+ MARK++;
+ sv_setpvn(cat, "", 0);
+ + patcopy = pat;
+ while (pat < patend) {
+
+Now if we see a C<U> which was at the start of the string, we turn on
+the UTF8 flag for the output SV, C<cat>:
+
+ + if (datumtype == 'U' && pat==patcopy+1)
+ + SvUTF8_on(cat);
+ if (datumtype == '#') {
+ while (pat < patend && *pat != '\n')
+ pat++;
+
+Remember that it has to be C<patcopy+1> because the first character of
+the string is the C<U> which has been swallowed into C<datumtype!>
+
+Oops, we forgot one thing: what if there are spaces at the start of the
+pattern? C<pack(" U*", @stuff)> will have C<U> as the first active
+character, even though it's not the first thing in the pattern. In this
+case, we have to advance C<patcopy> along with C<pat> when we see spaces:
+
+ if (isSPACE(datumtype))
+ continue;
+
+needs to become
+
+ if (isSPACE(datumtype)) {
+ patcopy++;
+ continue;
+ }
+
+OK. That's the C part done. Now we must do two additional things before
+this patch is ready to go: we've changed the behaviour of Perl, and so
+we must document that change. We must also provide some more regression
+tests to make sure our patch works and doesn't create a bug somewhere
+else along the line.
+
+The regression tests for each operator live in F<t/op/>, and so we make
+a copy of F<t/op/pack.t> to F<t/op/pack.t~>. Now we can add our tests
+to the end. First, we'll test that the C<U> does indeed create Unicode
+strings:
+
+ print 'not ' unless "1.20.300.4000" eq sprintf "%vd", pack("U*",1,20,300,4000);
+ print "ok $test\n"; $test++;
+
+Now we'll test that we got that space-at-the-beginning business right:
+
+ print 'not ' unless "1.20.300.4000" eq
+ sprintf "%vd", pack(" U*",1,20,300,4000);
+ print "ok $test\n"; $test++;
+
+And finally we'll test that we don't make Unicode strings if C<U> is B<not>
+the first active format:
+
+ print 'not ' unless v1.20.300.4000 ne
+ sprintf "%vd", pack("C0U*",1,20,300,4000);
+ print "ok $test\n"; $test++;
+
+Mustn't forget to change the number of tests which appears at the top, or
+else the automated tester will get confused:
+
+ -print "1..156\n";
+ +print "1..159\n";
+
+We now compile up Perl, and run it through the test suite. Our new
+tests pass, hooray!
+
+Finally, the documentation. The job is never done until the paperwork is
+over, so let's describe the change we've just made. The relevant place
+is F<pod/perlfunc.pod>; again, we make a copy, and then we'll insert
+this text in the description of C<pack>:
+
+ =item *
+
+ If the pattern begins with a C<U>, the resulting string will be treated
+ as Unicode-encoded. You can force UTF8 encoding on in a string with an
+ initial C<U0>, and the bytes that follow will be interpreted as Unicode
+ characters. If you don't want this to happen, you can begin your pattern
+ with C<C0> (or anything else) to force Perl not to UTF8 encode your
+ string, and then follow this with a C<U*> somewhere in your pattern.
+
+All done. Now let's create the patch. F<Porting/patching.pod> tells us
+that if we're making major changes, we should copy the entire directory
+to somewhere safe before we begin fiddling, and then do
+
+ diff -ruN old new > patch
+
+However, we know which files we've changed, and we can simply do this:
+
+ diff -u pp.c~ pp.c > patch
+ diff -u t/op/pack.t~ t/op/pack.t >> patch
+ diff -u pod/perlfunc.pod~ pod/perlfunc.pod >> patch
+
+We end up with a patch looking a little like this:
+
+ --- pp.c~ Fri Jun 02 04:34:10 2000
+ +++ pp.c Fri Jun 16 11:37:25 2000
+ @@ -4375,6 +4375,7 @@
+ register I32 items;
+ STRLEN fromlen;
+ register char *pat = SvPVx(*++MARK, fromlen);
+ + char *patcopy;
+ register char *patend = pat + fromlen;
+ register I32 len;
+ I32 datumtype;
+ @@ -4405,6 +4406,7 @@
+ ...
+
+And finally, we submit it, with our rationale, to perl5-porters. Job
+done!
+
+=head1 EXTERNAL TOOLS FOR DEBUGGING PERL
+
+Sometimes it helps to use external tools while debugging and
+testing Perl. This section tries to guide you through using
+some common testing and debugging tools with Perl. This is
+meant as a guide to interfacing these tools with Perl, not
+as any kind of guide to the use of the tools themselves.
+
+=head2 Rational Software's Purify
+
+Purify is a commercial tool that is helpful in identifying
+memory overruns, wild pointers, memory leaks and other such
+badness. Perl must be compiled in a specific way for
+optimal testing with Purify. Purify is available under
+Windows NT, Solaris, HP-UX, SGI, and Siemens Unix.
+
+The only currently known leaks happen when there are
+compile-time errors within eval or require. (Fixing these
+is non-trivial, unfortunately, but they must be fixed
+eventually.)
+
+=head2 Purify on Unix
+
+On Unix, Purify creates a new Perl binary. To get the most
+benefit out of Purify, you should create the perl to Purify
+using:
+
+ sh Configure -Accflags=-DPURIFY -Doptimize='-g' \
+ -Uusemymalloc -Dusemultiplicity
+
+where these arguments mean:
+
+=over 4
+
+=item -Accflags=-DPURIFY
+
+Disables Perl's arena memory allocation functions, as well as
+forcing use of memory allocation functions derived from the
+system malloc.
+
+=item -Doptimize='-g'
+
+Adds debugging information so that you see the exact source
+statements where the problem occurs. Without this flag, all
+you will see is the source filename of where the error occurred.
+
+=item -Uusemymalloc
+
+Disable Perl's malloc so that Purify can more closely monitor
+allocations and leaks. Using Perl's malloc will make Purify
+report most leaks in the "potential" leaks category.
+
+=item -Dusemultiplicity
+
+Enabling the multiplicity option allows perl to clean up
+thoroughly when the interpreter shuts down, which reduces the
+number of bogus leak reports from Purify.
+
+=back
+
+Once you've compiled a perl suitable for Purify'ing, then you
+can just:
+
+ make pureperl
+
+which creates a binary named 'pureperl' that has been Purify'ed.
+This binary is used in place of the standard 'perl' binary
+when you want to debug Perl memory problems.
+
+As an example, to show any memory leaks produced during the
+standard Perl testset you would create and run the Purify'ed
+perl as:
+
+ make pureperl
+ cd t
+ ../pureperl -I../lib harness
+
+which would run Perl on test.pl and report any memory problems.
+
+Purify outputs messages in "Viewer" windows by default. If
+you don't have a windowing environment or if you simply
+want the Purify output to unobtrusively go to a log file
+instead of to the interactive window, use these following
+options to output to the log file "perl.log":
+
+ setenv PURIFYOPTIONS "-chain-length=25 -windows=no \
+ -log-file=perl.log -append-logfile=yes"
+
+If you plan to use the "Viewer" windows, then you only need this option:
+
+ setenv PURIFYOPTIONS "-chain-length=25"
+
+=head2 Purify on NT
+
+Purify on Windows NT instruments the Perl binary 'perl.exe'
+on the fly. There are several options in the makefile you
+should change to get the most use out of Purify:
+
+=over 4
+
+=item DEFINES
+
+You should add -DPURIFY to the DEFINES line so the DEFINES
+line looks something like:
+
+ DEFINES = -DWIN32 -D_CONSOLE -DNO_STRICT $(CRYPT_FLAG) -DPURIFY=1
+
+to disable Perl's arena memory allocation functions, as
+well as to force use of memory allocation functions derived
+from the system malloc.
+
+=item USE_MULTI = define
+
+Enabling the multiplicity option allows perl to clean up
+thoroughly when the interpreter shuts down, which reduces the
+number of bogus leak reports from Purify.
+
+=item #PERL_MALLOC = define
+
+Disable Perl's malloc so that Purify can more closely monitor
+allocations and leaks. Using Perl's malloc will make Purify
+report most leaks in the "potential" leaks category.
+
+=item CFG = Debug
+
+Adds debugging information so that you see the exact source
+statements where the problem occurs. Without this flag, all
+you will see is the source filename of where the error occurred.
+
+=back
+
+As an example, to show any memory leaks produced during the
+standard Perl testset you would create and run Purify as:
+
+ cd win32
+ make
+ cd ../t
+ purify ../perl -I../lib harness
+
+which would instrument Perl in memory, run Perl on test.pl,
+then finally report any memory problems.
+
+=head2 CONCLUSION
+
+We've had a brief look around the Perl source, an overview of the stages
+F<perl> goes through when it's running your code, and how to use a
+debugger to poke at the Perl guts. We took a very simple problem and
+demonstrated how to solve it fully - with documentation, regression
+tests, and finally a patch for submission to p5p. Finally, we talked
+about how to use external tools to debug and test Perl.
+
+I'd now suggest you read over those references again, and then, as soon
+as possible, get your hands dirty. The best way to learn is by doing,
+so:
+
+=over 3
+
+=item *
+
+Subscribe to perl5-porters, follow the patches and try and understand
+them; don't be afraid to ask if there's a portion you're not clear on -
+who knows, you may unearth a bug in the patch...
+
+=item *
+
+Keep up to date with the bleeding edge Perl distributions and get
+familiar with the changes. Try and get an idea of what areas people are
+working on and the changes they're making.
+
+=item *
+
+Do read the README associated with your operating system, e.g. README.aix
+on the IBM AIX OS. Don't hesitate to supply patches to that README if
+you find anything missing or changed over a new OS release.
+
+=item *
+
+Find an area of Perl that seems interesting to you, and see if you can
+work out how it works. Scan through the source, and step over it in the
+debugger. Play, poke, investigate, fiddle! You'll probably get to
+understand not just your chosen area but a much wider range of F<perl>'s
+activity as well, and probably sooner than you'd think.
+
+=back
+
+=over 3
+
+=item I<The Road goes ever on and on, down from the door where it began.>
+
+=back
+
+If you can do these things, you've started on the long road to Perl porting.
+Thanks for wanting to help make Perl better - and happy hacking!
+
=head1 AUTHOR
This document was written by Nathan Torkington, and is maintained by
diff --git a/gnu/usr.bin/perl/pod/perlintern.pod b/gnu/usr.bin/perl/pod/perlintern.pod
index 58eeac6e954..e50be288287 100644
--- a/gnu/usr.bin/perl/pod/perlintern.pod
+++ b/gnu/usr.bin/perl/pod/perlintern.pod
@@ -6,17 +6,111 @@ perlintern - autogenerated documentation of purely B<internal>
=head1 DESCRIPTION
This file is the autogenerated documentation of functions in the
-Perl intrepreter that are documented using Perl's internal documentation
+Perl interpreter 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
+=item is_gv_magical
+
+Returns C<TRUE> if given the name of a magical GV.
+
+Currently only useful internally when determining if a GV should be
+created even in rvalue contexts.
+
+C<flags> is not used at present but available for future extension to
+allow selecting particular classes of magical variable.
+
+ bool is_gv_magical(char *name, STRLEN len, U32 flags)
+
+=for hackers
+Found in file gv.c
+
+=item LVRET
+
+True if this op will be the return value of an lvalue subroutine
+
+=for hackers
+Found in file pp.h
+
+=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
+
+=for hackers
+Found in file intrpvar.h
+
+=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
+
+=for hackers
+Found in file intrpvar.h
+
+=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
+
+=for hackers
+Found in file intrpvar.h
+
+=item PL_dowarn
+
+The C variable which corresponds to Perl's $^W warning variable.
+
+ bool PL_dowarn
+
+=for hackers
+Found in file intrpvar.h
+
+=item PL_last_in_gv
+
+The GV which was last used for a filehandle input operation. (C<< <FH> >>)
+
+ GV* PL_last_in_gv
+
+=for hackers
+Found in file thrdvar.h
+
+=item PL_ofs_sv
+
+The output field separator - C<$,> in Perl space.
+
+ SV* PL_ofs_sv
+
+=for hackers
+Found in file thrdvar.h
+
+=item PL_rs
+
+The input record separator - C<$/> in Perl space.
+
+ SV* PL_rs
+
+=for hackers
+Found in file thrdvar.h
+
=back
=head1 AUTHORS
-The autodocumentation system was orignally added to the Perl core by
+The autodocumentation system was originally added to the Perl core by
Benjamin Stuhl. Documentation is by whoever was kind enough to
document their functions.
diff --git a/gnu/usr.bin/perl/pod/perllexwarn.pod b/gnu/usr.bin/perl/pod/perllexwarn.pod
index cee16875377..951a470b2e5 100644
--- a/gnu/usr.bin/perl/pod/perllexwarn.pod
+++ b/gnu/usr.bin/perl/pod/perllexwarn.pod
@@ -9,7 +9,7 @@ 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
+enclosing block. It also means 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.
@@ -30,18 +30,17 @@ Similarly all warnings are disabled in a block by either of these:
For example, consider the code below:
use warnings ;
- my $a ;
- my $b ;
+ my @a ;
{
no warnings ;
- $b = 2 if $a EQ 3 ;
+ my $b = @a[0] ;
}
- $b = 1 if $a NE 3 ;
+ my $c = @a[0];
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.
+block has them disabled. In this case that means the assignment to the
+scalar C<$c> will trip the C<"Scalar value @a[0] better written as $a[0]">
+warning, but the assignment to the scalar C<$b> will not.
=head2 Default Warnings and Optional Warnings
@@ -100,7 +99,7 @@ disable compile-time warnings you need to rewrite the code like this:
my $b ; chop $b ;
}
-The other big problem with C<$^W> is that way you can inadvertently
+The other big problem with C<$^W> is the 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
@@ -195,7 +194,7 @@ or B<-X> command line flags.
=back
-The combined effect of 3 & 4 is that it will will allow code which uses
+The combined effect of 3 & 4 is that it 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.
@@ -321,27 +320,38 @@ L<perldiag>.
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.
-
+into fatal errors. In the code below, the use of C<time>, C<length>
+and C<join> can all produce a C<"Useless use of xxx in void context">
+warning.
use warnings ;
- $a = 1 if $a EQ $b ;
+ time ;
{
- use warnings FATAL => qw(deprecated) ;
- $a = 1 if $a EQ $b ;
+ use warnings FATAL => qw(void) ;
+ length "abc" ;
}
- $a = 1 if $a EQ $b ;
+ join "", 1,2,3 ;
+
+ print "done\n" ;
+
+When run it produces this output
+
+ Useless use of time in void context at fatal line 3.
+ Useless use of length in void context at fatal line 7.
+
+The scope where C<length> is used has escalated the C<void> warnings
+category into a fatal error, so the program terminates immediately it
+encounters the warning.
+
=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>
+warning to a calling module has enabled warnings via the C<warnings>
pragma.
Consider the module C<MyMod::Abc> below.
@@ -361,11 +371,11 @@ Consider the module C<MyMod::Abc> below.
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.
+called "MyMod::abc", i.e. the new category name matches the current
+package 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';
@@ -379,10 +389,8 @@ this snippet of code:
package MyMod::Abc;
sub open {
- if (warnings::enabled("deprecated")) {
- warnings::warn("deprecated",
- "open is deprecated, use new instead") ;
- }
+ warnings::warnif("deprecated",
+ "open is deprecated, use new instead") ;
new(@_) ;
}
@@ -399,18 +407,89 @@ display a warning message whenever the calling module has (at least) the
...
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
+Either the C<warnings::warn> or C<warnings::warnif> 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
+the C<warnings::warnif> function will detect this and die after
displaying the warning message.
+The three warnings functions, C<warnings::warn>, C<warnings::warnif>
+and C<warnings::enabled> can optionally take an object reference in place
+of a category name. In this case the functions will use the class name
+of the object as the warnings category.
+
+Consider this example:
+
+ package Original ;
+
+ no warnings ;
+ use warnings::register ;
+
+ sub new
+ {
+ my $class = shift ;
+ bless [], $class ;
+ }
+
+ sub check
+ {
+ my $self = shift ;
+ my $value = shift ;
+
+ if ($value % 2 && warnings::enabled($self))
+ { warnings::warn($self, "Odd numbers are unsafe") }
+ }
+
+ sub doit
+ {
+ my $self = shift ;
+ my $value = shift ;
+ $self->check($value) ;
+ # ...
+ }
+
+ 1 ;
+
+ package Derived ;
+
+ use warnings::register ;
+ use Original ;
+ our @ISA = qw( Original ) ;
+ sub new
+ {
+ my $class = shift ;
+ bless [], $class ;
+ }
+
+
+ 1 ;
+
+The code below makes use of both modules, but it only enables warnings from
+C<Derived>.
+
+ use Original ;
+ use Derived ;
+ use warnings 'Derived';
+ my $a = new Original ;
+ $a->doit(1) ;
+ my $b = new Derived ;
+ $a->doit(1) ;
+
+When this code is run only the C<Derived> object, C<$b>, will generate
+a warning.
+
+ Odd numbers are unsafe at main.pl line 7
+
+Notice also that the warning is reported at the line where the object is first
+used.
+
=head1 TODO
perl5db.pl
@@ -424,6 +503,8 @@ displaying the warning message.
around the limitations of C<$^W>. Now that those limitations are gone,
the module should be revisited.
+ document calling the warnings::* functions from XS
+
=head1 SEE ALSO
L<warnings>, L<perldiag>.
diff --git a/gnu/usr.bin/perl/pod/perlmodinstall.pod b/gnu/usr.bin/perl/pod/perlmodinstall.pod
index 19ffac98c9c..0fc359e913d 100644
--- a/gnu/usr.bin/perl/pod/perlmodinstall.pod
+++ b/gnu/usr.bin/perl/pod/perlmodinstall.pod
@@ -47,7 +47,7 @@ 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">.
=over 4
@@ -55,16 +55,16 @@ from your Perl programs with C<use lib
B<If you're on Unix,>
-You can use Andreas Koenig's CPAN module
+You can use Andreas Koenig's CPAN module
(which comes standard with Perl, or can itself be downloaded
-from http://www.perl.com/CPAN/modules/by-module/CPAN)
+from http://www.perl.com/CPAN/modules/by-module/CPAN)
to automate the following steps, from DECOMPRESS through INSTALL.
-A. DECOMPRESS
+A. DECOMPRESS
Decompress the file with C<gzip -d yourmodule.tar.gz>
-You can get gzip from ftp://prep.ai.mit.edu/pub/gnu.
+You can get gzip from ftp://prep.ai.mit.edu/pub/gnu.
Or, you can combine this step with the next to save disk space:
@@ -126,13 +126,14 @@ CPAN for others to use. If it doesn't, go to INSTALL.
D. INSTALL
Copy the module into your Perl's I<lib> directory. That'll be one
-of the directories you see when you type
+of the directories you see when you type
perl -e 'print "@INC"'
=item *
-B<If you're running Windows 95 or NT with the core Windows distribution of Perl,>
+B<If you're running Windows 95 or NT with the core Windows distribution of
+Perl,>
A. DECOMPRESS
@@ -185,63 +186,66 @@ B<If you're using a Macintosh,>
A. DECOMPRESS
-In general, all Macintosh decompression utilities mentioned here
-can be found in the Info-Mac Hyperarchive
-( http://hyperarchive.lcs.mit.edu/HyperArchive.html ).
-Specificly the "Commpress & Translate" listing
-( http://hyperarchive.lcs.mit.edu/HyperArchive/Abstracts/cmp/HyperArchive.html ).
+First thing you should do is make sure you have the latest B<cpan-mac>
+distribution ( http://www.cpan.org/authors/id/CNANDOR/ ), which has
+utilities for doing all of the steps. Read the cpan-mac directions
+carefully and install it. If you choose not to use cpan-mac
+for some reason, there are alternatives listed here.
+After installing cpan-mac, drop the module archive on the
+B<untarzipme> droplet, which will decompress and unpack for you.
-You can either use the shareware B<StuffIt Expander> program
-( http://www.aladdinsys.com/expander/ )
-in combination with I<DropStuff with Expander Enhancer>
-( http://www.aladdinsys.com/dropstuff/ )
+B<Or>, you can either use the shareware B<StuffIt Expander> program
+( http://www.aladdinsys.com/expander/ )
+in combination with B<DropStuff with Expander Enhancer>
+( 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 B<suntar> or I<Tar> (
+If you're using untarzipme or StuffIt, the archive should be extracted
+now. B<Or>, you can use the freeware B<suntar> or I<Tar> (
http://hyperarchive.lcs.mit.edu/HyperArchive/Archive/cmp/ ).
C. BUILD
-Does the module require compilation?
-
-1. If it does,
+Check the contents of the distribution.
+Read the module's documentation, looking for
+reasons why you might have trouble using it with MacPerl. Look for
+F<.xs> and F<.c> files, which normally denote that the distribution
+must be compiled, and you cannot install it "out of the box."
+(See L<"PORTABILITY">.)
+
+If a module does not work on MacPerl but should, or needs to be
+compiled, see if the module exists already as a port on the
+MacPerl Module Porters site (http://pudge.net/mmp/).
+For more information on doing XS with MacPerl yourself, see
+Arved Sandstrom's XS tutorial (http://macperl.com/depts/Tutorials/),
+and then consider uploading your binary to the CPAN and
+registering it on the MMP site.
-Overview: You need MPW and a combination of new and old CodeWarrior
-compilers for MPW and libraries. Makefiles created for building under
-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 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.
+D. INSTALL
-Or, ask someone on the mac-perl mailing list (mac-perl@iis.ee.ethz.ch)
-to build it for you. To subscribe to the mac-perl mailing list, send
-mail to mac-perl-request@iis.ee.ethz.ch.
+If you are using cpan-mac, just drop the folder on the
+B<installme> droplet, and use the module.
-2. If the module doesn't require compilation, go to INSTALL.
-
-D. INSTALL
+B<Or>, if you aren't using cpan-mac, do some manual labor.
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:
+As a last resort, you can use the perl one-liner:
- perl -i.bak -pe 's/(?:\015)?\012/\015/g' <filenames>
+ perl -i.bak -pe 's/(?:\015)?\012/\015/g' <filenames>
on the source files.
-Move the files manually into the correct folders.
-
-Move the files to their final destination: This will
+Then move the files (probably just the F<.pm> files, though there
+may be some additional ones, too; check the module documentation)
+to their final destination: This will
most likely be in C<$ENV{MACPERL}site_lib:> (i.e.,
C<HD:MacPerl folder:site_lib:>). You can add new paths to
the default C<@INC> in the Preferences menu item in the
@@ -251,16 +255,13 @@ automagically). Create whatever directory structures are required
C<$ENV{MACPERL}site_lib:Some:> and put
C<Module.pm> in that directory).
-Run the following script (or something like it):
+Then run the following script (or something like it):
#!perl -w
use AutoSplit;
my $dir = "${MACPERL}site_perl";
autosplit("$dir:Some:Module.pm", "$dir:auto", 0, 1, 1);
-Eventually there should be a way to automate the installation process; some
-solutions exist, but none are ready for the general public yet.
-
=item *
B<If you're on the DJGPP port of DOS,>
@@ -268,7 +269,7 @@ B<If you're on the DJGPP port of DOS,>
A. DECOMPRESS
djtarx ( ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2/ )
-will both uncompress and unpack.
+will both uncompress and unpack.
B. UNPACK
@@ -289,7 +290,7 @@ in the Perl distribution.
While still in that directory, type:
- make install
+ make install
You will need the packages mentioned in F<README.dos> in the Perl distribution.
@@ -313,17 +314,17 @@ C<Your-Module-1_33.tgz>.
A. DECOMPRESS
-Type
+Type
gzip -d Your-Module.tgz
-or, for zipped modules, type
+or, for zipped modules, type
unzip Your-Module.zip
Executables for gzip, zip, and VMStar ( Alphas:
http://www.openvms.digital.com/freeware/000TOOLS/ALPHA/ and Vaxen:
-http://www.openvms.digital.com/freeware/000TOOLS/VAX/ ).
+http://www.openvms.digital.com/freeware/000TOOLS/VAX/ ).
gzip and tar
are also available at ftp://ftp.digital.com/pub/VMS.
@@ -342,10 +343,11 @@ Or, if you're fond of VMS command syntax:
tar/extract/verbose Your_Module.tar
-C. BUILD
+C. BUILD
-Make sure you have MMS (from Digital) or the freeware MMK ( available from MadGoat at http://www.madgoat.com ). Then type this to create the
-DESCRIP.MMS for the module:
+Make sure you have MMS (from Digital) or the freeware MMK ( available from
+MadGoat at http://www.madgoat.com ). Then type this to create the
+DESCRIP.MMS for the module:
perl Makefile.PL
@@ -358,7 +360,7 @@ Substitute C<mmk> for C<mms> above if you're using MMK.
D. INSTALL
-Type
+Type
mms install
@@ -371,16 +373,16 @@ B<If you're on MVS>,
Introduce the F<.tar.gz> file into an HFS as binary; don't translate from
ASCII to EBCDIC.
-A. DECOMPRESS
+A. DECOMPRESS
Decompress the file with C<gzip -d yourmodule.tar.gz>
- You can get gzip from
+ You can get gzip from
http://www.s390.ibm.com/products/oe/bpxqp1.html.
B. UNPACK
-Unpack the result with
+Unpack the result with
pax -o to=IBM-1047,from=ISO8859-1 -r < yourmodule.tar
@@ -390,6 +392,52 @@ available from http://www.mks.com/s390/gnu/index.htm.
=back
+
+=head1 PORTABILITY
+
+Note that not all modules will work with on all platforms.
+See L<perlport> for more information on portability issues.
+Read the documentation to see if the module will work on your
+system. There are basically three categories
+of modules that will not work "out of the box" with all
+platforms (with some possibility of overlap):
+
+=over 4
+
+=item *
+
+B<Those that should, but don't.> These need to be fixed; consider
+contacting the author and possibly writing a patch.
+
+=item *
+
+B<Those that need to be compiled, where the target platform
+doesn't have compilers readily available.> (These modules contain
+F<.xs> or F<.c> files, usually.) You might be able to find
+existing binaries on the CPAN or elsewhere, or you might
+want to try getting compilers and building it yourself, and then
+release the binary for other poor souls to use.
+
+=item *
+
+B<Those that are targeted at a specific platform.>
+(Such as the Win32:: modules.) If the module is targeted
+specifically at a platform other than yours, you're out
+of luck, most likely.
+
+=back
+
+
+
+Check the CPAN Testers if a module should work with your platform
+but it doesn't behave as you'd expect, or you aren't sure whether or
+not a module will work under your platform. If the module you want
+isn't listed there, you can test it yourself and let CPAN Testers know,
+you can join CPAN Testers, or you can request it be tested.
+
+ http://testers.cpan.org/
+
+
=head1 HEY
If you have any suggested changes for this page, let me know. Please
@@ -401,7 +449,7 @@ familiar with Perl on your operating system.
=head1 AUTHOR
-Jon Orwant
+Jon Orwant
orwant@tpj.com
@@ -413,11 +461,13 @@ Nick Ing-Simmons, Tuomas J. Lukka, Laszlo Molnar, Chris Nandor, Alan
Olsen, Peter Prymmer, Gurusamy Sarathy, Christoph Spalinger, Dan
Sugalski, Larry Virden, and Ilya Zakharevich.
-July 22, 1998
+First version July 22, 1998
+
+Last Modified August 22, 2000
=head1 COPYRIGHT
-Copyright (C) 1998 Jon Orwant. All Rights Reserved.
+Copyright (C) 1998, 2000 Jon Orwant. All Rights Reserved.
Permission is granted to make and distribute verbatim copies of this
documentation provided the copyright notice and this permission notice are
@@ -434,4 +484,3 @@ to this one.
Permission is granted to copy and distribute translations of this
documentation into another language, under the above conditions for
modified versions.
-
diff --git a/gnu/usr.bin/perl/pod/perlmodlib.PL b/gnu/usr.bin/perl/pod/perlmodlib.PL
new file mode 100644
index 00000000000..0cdadb76c79
--- /dev/null
+++ b/gnu/usr.bin/perl/pod/perlmodlib.PL
@@ -0,0 +1,1383 @@
+#!../miniperl
+
+open (OUT, ">perlmodlib.tmp") or die $!;
+my (@pragma, @mod);
+open (MANIFEST, "../MANIFEST") or die $!;
+
+while (<MANIFEST>) {
+ my $filename;
+ next unless s|^lib/|| or m|^ext/|;
+ ($filename) = /(\S+)/;
+ $filename =~ s|^[^/]+/|| if $filename =~ s|^ext/||;
+ next unless $filename =~ /\.p(m|od)$/;
+ next unless open (MOD, "../lib/$filename");
+
+ my ($name, $thing);
+ my $foundit=0;
+ {
+ local $/="";
+ while (<MOD>) {
+ next unless /^=head1 NAME/;
+ $foundit++;
+ last;
+ }
+ }
+ unless ($foundit) {
+ warn "$filename missing head1\n";
+ next;
+ }
+ my $title = <MOD>;
+ chomp($title);
+ close MOD;
+
+ my $perlname = $filename;
+ $perlname =~ s!\.p(m|od)$!!;
+ $perlname =~ s!/!::!g;
+
+ ($name, $thing) = split / --? /, $title, 2;
+
+ unless ($name and $thing) {
+ warn "$filename missing name\n" unless $name;
+ warn "$filename missing thing\n" unless $thing;
+ next;
+ }
+
+ $thing =~ s/^perl pragma to //i;
+ $thing = ucfirst($thing);
+ $title = "=item $perlname\n\n$thing\n\n";
+
+ # print "$perlname $thing\n";
+
+ if ($filename=~/[A-Z]/) {
+ push @mod, $title;
+ } else {
+ push @pragma, $title;
+ }
+}
+
+print OUT <<'EOF';
+# Generated by perlmodlib.PL DO NOT EDIT!
+
+=head1 NAME
+
+perlmodlib - constructing new Perl modules and finding existing ones
+
+=head1 DESCRIPTION
+
+=head1 THE PERL MODULE LIBRARY
+
+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 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.
+
+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
+
+EOF
+
+print OUT $_ for (sort @pragma);
+
+print OUT <<EOF;
+=back
+
+=head2 Standard Modules
+
+Standard, bundled modules are all expected to behave in a well-defined
+manner with respect to namespace pollution because they use the
+Exporter module. See their own documentation for details.
+
+=over 12
+
+EOF
+
+print OUT $_ for (sort @mod);
+
+print OUT <<'EOF';
+=back
+
+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 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. If you have no
+system B<man> command, you might try the B<perldoc> program.
+
+=head2 Extension 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 on CPAN (described below), or using web search engines
+like Alta Vista or Deja News.
+
+=head1 CPAN
+
+CPAN stands for Comprehensive Perl Archive Network; it's a globally
+replicated trove of Perl materials, including documentation, style
+guides, tricks and traps, 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
+
+=item *
+
+Language Extensions and Documentation Tools
+
+=item *
+
+Development Support
+
+=item *
+
+Operating System Interfaces
+
+=item *
+
+Networking, Device Control (modems) and InterProcess Communication
+
+=item *
+
+Data Types and Data Type Utilities
+
+=item *
+
+Database Interfaces
+
+=item *
+
+User Interfaces
+
+=item *
+
+Interfaces to / Emulations of Other Programming Languages
+
+=item *
+
+File Names, File Systems and File Locking (see also File Handles)
+
+=item *
+
+String Processing, Language Text Processing, Parsing, and Searching
+
+=item *
+
+Option, Argument, Parameter, and Configuration File Processing
+
+=item *
+
+Internationalization and Locale
+
+=item *
+
+Authentication, Security, and Encryption
+
+=item *
+
+World Wide Web, HTML, HTTP, CGI, MIME
+
+=item *
+
+Server and Daemon Utilities
+
+=item *
+
+Archiving and Compression
+
+=item *
+
+Images, Pixmap and Bitmap Manipulation, Drawing, and Graphing
+
+=item *
+
+Mail and Usenet News
+
+=item *
+
+Control Flow Utilities (callbacks and exceptions etc)
+
+=item *
+
+File Handle and Input/Output Stream Utilities
+
+=item *
+
+Miscellaneous Modules
+
+=back
+
+Registered CPAN sites as of this writing include the following.
+You should try to choose one close to you:
+
+=head2 Africa
+
+=over 4
+
+=item *
+
+South Africa
+
+ ftp://ftp.is.co.za/programming/perl/CPAN/
+ ftp://ftp.saix.net/pub/CPAN/
+ ftp://ftpza.co.za/pub/mirrors/cpan/
+ ftp://ftp.sun.ac.za/CPAN/
+
+=back
+
+=head2 Asia
+
+=over 4
+
+=item *
+
+China
+
+ ftp://freesoft.cei.gov.cn/pub/languages/perl/CPAN/
+ http://www2.linuxforum.net/mirror/CPAN/
+ http://cpan.shellhung.org/
+ ftp://ftp.shellhung.org/pub/CPAN
+
+=item *
+
+Hong Kong
+
+ http://CPAN.pacific.net.hk/
+ ftp://ftp.pacific.net.hk/pub/mirror/CPAN/
+
+=item *
+
+Indonesia
+
+ http://piksi.itb.ac.id/CPAN/
+ ftp://mirrors.piksi.itb.ac.id/CPAN/
+ http://CPAN.mweb.co.id/
+ ftp://ftp.mweb.co.id/pub/languages/perl/CPAN/
+
+=item *
+
+Israel
+
+ http://www.iglu.org.il:/pub/CPAN/
+ ftp://ftp.iglu.org.il/pub/CPAN/
+ http://bioinfo.weizmann.ac.il/pub/software/perl/CPAN/
+ ftp://bioinfo.weizmann.ac.il/pub/software/perl/CPAN/
+
+=item *
+
+Japan
+
+ ftp://ftp.u-aizu.ac.jp/pub/lang/perl/CPAN/
+ ftp://ftp.kddlabs.co.jp/CPAN/
+ http://mirror.nucba.ac.jp/mirror/Perl/
+ ftp://mirror.nucba.ac.jp/mirror/Perl/
+ ftp://ftp.meisei-u.ac.jp/pub/CPAN/
+ ftp://ftp.jaist.ac.jp/pub/lang/perl/CPAN/
+ ftp://ftp.dti.ad.jp/pub/lang/CPAN/
+ ftp://ftp.ring.gr.jp/pub/lang/perl/CPAN/
+
+=item *
+
+Saudi Arabia
+
+ ftp://ftp.isu.net.sa/pub/CPAN/
+
+=item *
+
+Singapore
+
+ http://cpan.hjc.edu.sg
+ http://ftp.nus.edu.sg/unix/perl/CPAN/
+ ftp://ftp.nus.edu.sg/pub/unix/perl/CPAN/
+
+=item *
+
+South Korea
+
+ http://CPAN.bora.net/
+ ftp://ftp.bora.net/pub/CPAN/
+ http://ftp.kornet.net/CPAN/
+ ftp://ftp.kornet.net/pub/CPAN/
+ ftp://ftp.nuri.net/pub/CPAN/
+
+=item *
+
+Taiwan
+
+ ftp://coda.nctu.edu.tw/UNIX/perl/CPAN
+ ftp://ftp.ee.ncku.edu.tw/pub/perl/CPAN/
+ ftp://ftp1.sinica.edu.tw/pub1/perl/CPAN/
+
+=item *
+
+Thailand
+
+ http://download.nectec.or.th/CPAN/
+ ftp://ftp.nectec.or.th/pub/languages/CPAN/
+ ftp://ftp.cs.riubon.ac.th/pub/mirrors/CPAN/
+
+=back
+
+=head2 Central America
+
+=over 4
+
+=item *
+
+Costa Rica
+
+ ftp://ftp.linux.co.cr/mirrors/CPAN/
+ http://ftp.ucr.ac.cr/Unix/CPAN/
+ ftp://ftp.ucr.ac.cr/pub/Unix/CPAN/
+
+=back
+
+=head2 Europe
+
+=over 4
+
+=item *
+
+Austria
+
+ ftp://ftp.tuwien.ac.at/pub/languages/perl/CPAN/
+
+=item *
+
+Belgium
+
+ http://ftp.easynet.be/CPAN/
+ ftp://ftp.easynet.be/CPAN/
+ ftp://ftp.kulnet.kuleuven.ac.be/pub/mirror/CPAN/
+
+=item *
+
+Bulgaria
+
+ ftp://ftp.ntrl.net/pub/mirrors/CPAN/
+
+=item *
+
+Croatia
+
+ ftp://ftp.linux.hr/pub/CPAN/
+
+=item *
+
+Czech Republic
+
+ http://www.fi.muni.cz/pub/perl/
+ ftp://ftp.fi.muni.cz/pub/perl/
+ ftp://sunsite.mff.cuni.cz/MIRRORS/ftp.funet.fi/pub/languages/perl/CPAN/
+
+=item *
+
+Denmark
+
+ ftp://sunsite.auc.dk/pub/languages/perl/CPAN/
+ http://www.cpan.dk/CPAN/
+ ftp://www.cpan.dk/ftp.cpan.org/CPAN/
+
+=item *
+
+England
+
+ http://www.mirror.ac.uk/sites/ftp.funet.fi/pub/languages/perl/CPAN
+ ftp://ftp.mirror.ac.uk/sites/ftp.funet.fi/pub/languages/perl/CPAN/
+ ftp://ftp.demon.co.uk/pub/mirrors/perl/CPAN/
+ ftp://ftp.flirble.org/pub/languages/perl/CPAN/
+ ftp://ftp.plig.org/pub/CPAN/
+ ftp://sunsite.doc.ic.ac.uk/packages/CPAN/
+ http://mirror.uklinux.net/CPAN/
+ ftp://mirror.uklinux.net/pub/CPAN/
+ ftp://usit.shef.ac.uk/pub/packages/CPAN/
+
+=item *
+
+Estonia
+
+ ftp://ftp.ut.ee/pub/languages/perl/CPAN/
+
+=item *
+
+Finland
+
+ ftp://ftp.funet.fi/pub/languages/perl/CPAN/
+
+=item *
+
+France
+
+ ftp://cpan.ftp.worldonline.fr/pub/CPAN/
+ ftp://ftp.club-internet.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/
+ ftp://cpan.cict.fr/pub/CPAN/
+ ftp://ftp.uvsq.fr/pub/perl/CPAN/
+
+=item *
+
+Germany
+
+ ftp://ftp.rz.ruhr-uni-bochum.de/pub/CPAN/
+ ftp://ftp.freenet.de/pub/ftp.cpan.org/pub/CPAN/
+ ftp://ftp.uni-erlangen.de/pub/source/CPAN/
+ ftp://ftp-stud.fht-esslingen.de/pub/Mirrors/CPAN
+ ftp://ftp.gigabell.net/pub/CPAN/
+ http://ftp.gwdg.de/pub/languages/perl/CPAN/
+ ftp://ftp.gwdg.de/pub/languages/perl/CPAN/
+ ftp://ftp.uni-hamburg.de/pub/soft/lang/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.gmd.de/mirrors/CPAN/
+
+=item *
+
+Greece
+
+ ftp://ftp.forthnet.gr/pub/languages/perl/CPAN
+ ftp://ftp.ntua.gr/pub/lang/perl/
+
+=item *
+
+Hungary
+
+ http://cpan.artifact.hu/
+ ftp://cpan.artifact.hu/CPAN/
+ ftp://ftp.kfki.hu/pub/packages/perl/CPAN/
+
+=item *
+
+Iceland
+
+ http://cpan.gm.is/
+ ftp://ftp.gm.is/pub/CPAN/
+
+=item *
+
+Ireland
+
+ http://cpan.indigo.ie/
+ ftp://cpan.indigo.ie/pub/CPAN/
+ http://sunsite.compapp.dcu.ie/pub/perl/
+ ftp://sunsite.compapp.dcu.ie/pub/perl/
+
+=item *
+
+Italy
+
+ http://cpan.nettuno.it/
+ http://gusp.dyndns.org/CPAN/
+ ftp://gusp.dyndns.org/pub/CPAN
+ http://softcity.iol.it/cpan
+ ftp://softcity.iol.it/pub/cpan
+ ftp://ftp.unina.it/pub/Other/CPAN/
+ ftp://ftp.unipi.it/pub/mirror/perl/CPAN/
+ ftp://cis.uniRoma2.it/CPAN/
+ ftp://ftp.edisontel.it/pub/CPAN_Mirror/
+ ftp://ftp.flashnet.it/pub/CPAN/
+
+=item *
+
+Latvia
+
+ http://kvin.lv/pub/CPAN/
+
+=item *
+
+Netherlands
+
+ ftp://download.xs4all.nl/pub/mirror/CPAN/
+ ftp://ftp.nl.uu.net/pub/CPAN/
+ ftp://ftp.nluug.nl/pub/languages/perl/CPAN/
+ ftp://ftp.cpan.nl/pub/CPAN/
+ http://www.cs.uu.nl/mirror/CPAN/
+ ftp://ftp.cs.uu.nl/mirror/CPAN/
+
+=item *
+
+Norway
+
+ ftp://sunsite.uio.no/pub/languages/perl/CPAN/
+ ftp://ftp.uit.no/pub/languages/perl/cpan/
+
+=item *
+
+Poland
+
+ ftp://ftp.pk.edu.pl/pub/lang/perl/CPAN/
+ ftp://ftp.mega.net.pl/pub/mirrors/ftp.perl.com/
+ ftp://ftp.man.torun.pl/pub/doc/CPAN/
+ ftp://sunsite.icm.edu.pl/pub/CPAN/
+
+=item *
+
+Portugal
+
+ ftp://ftp.ua.pt/pub/CPAN/
+ ftp://perl.di.uminho.pt/pub/CPAN/
+ ftp://ftp.ist.utl.pt/pub/CPAN/
+ ftp://ftp.netc.pt/pub/CPAN/
+
+=item *
+
+Romania
+
+ ftp://archive.logicnet.ro/mirrors/ftp.cpan.org/CPAN/
+ ftp://ftp.kappa.ro/pub/mirrors/ftp.perl.org/pub/CPAN/
+ ftp://ftp.dntis.ro/pub/cpan/
+ ftp://ftp.opsynet.com/cpan/
+ ftp://ftp.dnttm.ro/pub/CPAN/
+ ftp://ftp.timisoara.roedu.net/mirrors/CPAN/
+
+=item *
+
+Russia
+
+ ftp://ftp.chg.ru/pub/lang/perl/CPAN/
+ http://cpan.rinet.ru/
+ ftp://cpan.rinet.ru/pub/mirror/CPAN/
+ ftp://ftp.aha.ru/pub/CPAN/
+ ftp://ftp.sai.msu.su/pub/lang/perl/CPAN/
+
+=item *
+
+Slovakia
+
+ ftp://ftp.entry.sk/pub/languages/perl/CPAN/
+
+=item *
+
+Slovenia
+
+ ftp://ftp.arnes.si/software/perl/CPAN/
+
+=item *
+
+Spain
+
+ ftp://ftp.rediris.es/mirror/CPAN/
+ ftp://ftp.etse.urv.es/pub/perl/
+
+=item *
+
+Sweden
+
+ http://ftp.du.se/CPAN/
+ ftp://ftp.du.se/pub/CPAN/
+ ftp://ftp.sunet.se/pub/lang/perl/CPAN/
+
+=item *
+
+Switzerland
+
+ ftp://ftp.danyk.ch/CPAN/
+ ftp://sunsite.cnlab-switch.ch/mirror/CPAN/
+
+=item *
+
+Turkey
+
+ ftp://sunsite.bilkent.edu.tr/pub/languages/CPAN/
+
+=back
+
+=head2 North America
+
+=over 4
+
+=item *
+
+Canada
+
+=over 8
+
+=item *
+
+Alberta
+
+ http://sunsite.ualberta.ca/pub/Mirror/CPAN/
+ ftp://sunsite.ualberta.ca/pub/Mirror/CPAN/
+
+=item *
+
+Manitoba
+
+ http://theoryx5.uwinnipeg.ca/pub/CPAN/
+ ftp://theoryx5.uwinnipeg.ca/pub/CPAN/
+
+=item *
+
+Nova Scotia
+
+ ftp://cpan.chebucto.ns.ca/pub/CPAN/
+
+=item *
+
+Ontario
+
+ ftp://ftp.crc.ca/pub/packages/lang/perl/CPAN/
+
+=item *
+
+Mexico
+
+ http://www.msg.com.mx/CPAN/
+ ftp://ftp.msg.com.mx/pub/CPAN/
+
+=back
+
+=item *
+
+United States
+
+=over 8
+
+=item *
+
+Alabama
+
+ http://mirror.hiwaay.net/CPAN/
+ ftp://mirror.hiwaay.net/CPAN/
+
+=item *
+
+California
+
+ http://www.cpan.org/
+ ftp://ftp.cpan.org/CPAN/
+ ftp://cpan.nas.nasa.gov/pub/perl/CPAN/
+ ftp://ftp.digital.com/pub/plan/perl/CPAN/
+ http://www.kernel.org/pub/mirrors/cpan/
+ ftp://ftp.kernel.org/pub/mirrors/cpan/
+ http://www.perl.com/CPAN/
+ http://download.sourceforge.net/mirrors/CPAN/
+
+=item *
+
+Colorado
+
+ ftp://ftp.cs.colorado.edu/pub/perl/CPAN/
+
+=item *
+
+Florida
+
+ ftp://ftp.cise.ufl.edu/pub/perl/CPAN/
+
+=item *
+
+Georgia
+
+ ftp://ftp.twoguys.org/CPAN/
+
+=item *
+
+Illinois
+
+ http://www.neurogames.com/mirrors/CPAN
+ http://uiarchive.uiuc.edu/mirrors/ftp/ftp.cpan.org/pub/CPAN/
+ ftp://uiarchive.uiuc.edu/mirrors/ftp/ftp.cpan.org/pub/CPAN/
+
+=item *
+
+Indiana
+
+ ftp://ftp.uwsg.indiana.edu/pub/perl/CPAN/
+ http://cpan.nitco.com/
+ ftp://cpan.nitco.com/pub/CPAN/
+ ftp://cpan.in-span.net/
+ http://csociety-ftp.ecn.purdue.edu/pub/CPAN
+ ftp://csociety-ftp.ecn.purdue.edu/pub/CPAN
+
+=item *
+
+Kentucky
+
+ http://cpan.uky.edu/
+ ftp://cpan.uky.edu/pub/CPAN/
+
+=item *
+
+Massachusetts
+
+ ftp://ftp.ccs.neu.edu/net/mirrors/ftp.funet.fi/pub/languages/perl/CPAN/
+ ftp://ftp.iguide.com/pub/mirrors/packages/perl/CPAN/
+
+=item *
+
+New Jersey
+
+ ftp://ftp.cpanel.net/pub/CPAN/
+
+=item *
+
+New York
+
+ ftp://ftp.freesoftware.com/pub/perl/CPAN/
+ http://www.deao.net/mirrors/CPAN/
+ ftp://ftp.deao.net/pub/CPAN/
+ ftp://ftp.stealth.net/pub/mirrors/ftp.cpan.org/pub/CPAN/
+ http://mirror.nyc.anidea.com/CPAN/
+ ftp://mirror.nyc.anidea.com/pub/CPAN/
+ http://www.rge.com/pub/languages/perl/
+ ftp://ftp.rge.com/pub/languages/perl/
+ ftp://mirrors.cloud9.net/pub/mirrors/CPAN/
+
+=item *
+
+North Carolina
+
+ ftp://ftp.duke.edu/pub/perl/
+
+=item *
+
+Ohio
+
+ ftp://ftp.loaded.net/pub/CPAN/
+
+=item *
+
+Oklahoma
+
+ ftp://ftp.ou.edu/mirrors/CPAN/
+
+=item *
+
+Oregon
+
+ ftp://ftp.orst.edu/pub/packages/CPAN/
+
+=item *
+
+Pennsylvania
+
+ http://ftp.epix.net/CPAN/
+ ftp://ftp.epix.net/pub/languages/perl/
+ ftp://carroll.cac.psu.edu/pub/CPAN/
+
+=item *
+
+Tennessee
+
+ ftp://ftp.sunsite.utk.edu/pub/CPAN/
+
+=item *
+
+Texas
+
+ http://ftp.sedl.org/pub/mirrors/CPAN/
+ http://jhcloos.com/pub/mirror/CPAN/
+ ftp://jhcloos.com/pub/mirror/CPAN/
+
+=item *
+
+Utah
+
+ ftp://mirror.xmission.com/CPAN/
+
+=item *
+
+Virginia
+
+ http://mirrors.rcn.net/pub/lang/CPAN/
+ ftp://mirrors.rcn.net/pub/lang/CPAN/
+ ftp://ruff.cs.jmu.edu/pub/CPAN/
+ http://perl.Liquidation.com/CPAN/
+
+=item *
+
+Washington
+
+ http://cpan.llarian.net/
+ ftp://cpan.llarian.net/pub/CPAN/
+ ftp://ftp-mirror.internap.com/pub/CPAN/
+ ftp://ftp.spu.edu/pub/CPAN/
+
+=back
+
+=back
+
+=head2 Oceania
+
+=over 4
+
+=item *
+
+Australia
+
+ http://ftp.planetmirror.com/pub/CPAN/
+ ftp://ftp.planetmirror.com/pub/CPAN/
+ ftp://mirror.aarnet.edu.au/pub/perl/CPAN/
+ ftp://cpan.topend.com.au/pub/CPAN/
+
+=item *
+
+New Zealand
+
+ ftp://ftp.auckland.ac.nz/pub/perl/CPAN/
+
+=back
+
+=head2 South America
+
+=over 4
+
+=item *
+
+Argentina
+
+ ftp://mirrors.bannerlandia.com.ar/mirrors/CPAN/
+
+=item *
+
+Brazil
+
+ ftp://cpan.pop-mg.com.br/pub/CPAN/
+ ftp://ftp.matrix.com.br/pub/perl/
+ ftp://cpan.if.usp.br/pub/mirror/CPAN/
+
+=item *
+
+Chile
+
+ ftp://ftp.psinet.cl/pub/programming/perl/CPAN/
+ ftp://sunsite.dcc.uchile.cl/pub/lang/perl/
+
+=back
+
+For an up-to-date listing of CPAN sites,
+see http://www.cpan.org/SITES or ftp://www.cpan.org/SITES .
+
+=head1 Modules: Creation, Use, and Abuse
+
+(The following section is borrowed directly from Tim Bunce's modules
+file, available at your nearest CPAN site.)
+
+Perl implements a class using a package, but the presence of a
+package doesn't imply the presence of a class. A package is just a
+namespace. A class is a package that provides subroutines that can be
+used as methods. A method is just a subroutine that expects, as its
+first argument, either the name of a package (for "static" methods),
+or a reference to something (for "virtual" methods).
+
+A module is a file that (by convention) provides a class of the same
+name (sans the .pm), plus an import method in that class that can be
+called to fetch exported symbols. This module may implement some of
+its methods by loading dynamic C or C++ objects, but that should be
+totally transparent to the user of the module. Likewise, the module
+might set up an AUTOLOAD function to slurp in subroutine definitions on
+demand, but this is also transparent. Only the F<.pm> file is required to
+exist. See L<perlsub>, L<perltoot>, and L<AutoLoader> for details about
+the AUTOLOAD mechanism.
+
+=head2 Guidelines for Module Creation
+
+=over 4
+
+=item *
+
+Do similar modules already exist in some form?
+
+If so, please try to reuse the existing modules either in whole or
+by inheriting useful features into a new class. If this is not
+practical try to get together with the module authors to work on
+extending or enhancing the functionality of the existing modules.
+A perfect example is the plethora of packages in perl4 for dealing
+with command line options.
+
+If you are writing a module to expand an already existing set of
+modules, please coordinate with the author of the package. It
+helps if you follow the same naming scheme and module interaction
+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.,:
+
+ sub new {
+ my $class = shift;
+ return bless {}, $class;
+ }
+
+or even this if you'd like it to be used as either a static
+or a virtual method.
+
+ sub new {
+ my $self = shift;
+ my $class = ref($self) || $self;
+ return bless {}, $class;
+ }
+
+Pass arrays as references so more parameters can be added later
+(it's also faster). Convert functions into methods where
+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.
+Let the objects look after themselves! Generally, avoid hard-wired
+class names as far as possible.
+
+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
+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
+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;> ?
+
+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(...);>).
+Remember that you can add C<no strict qw(...);> to individual blocks
+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.
+
+Coding style is a matter of personal taste. Many people evolve their
+style over several years as they learn what helps them write and
+maintain good code. Here's one set of assorted suggestions that
+seem to be widely used by experienced developers:
+
+Use underscores to separate words. It is generally easier to read
+$var_names_like_this than $VarNamesLikeThis, especially for
+non-native speakers of English. It's also a simple rule that works
+consistently with VAR_NAMES_LIKE_THIS.
+
+Package/Module names are an exception to this rule. Perl informally
+reserves lowercase module names for 'pragma' modules like integer
+and strict. Other modules normally begin with a capital letter and
+use mixed case with no underscores (need to be short and portable).
+
+You may find it helpful to use letter case to indicate the scope
+or nature of a variable. For example:
+
+ $ALL_CAPS_HERE constants only (beware clashes with Perl vars)
+ $Some_Caps_Here package-wide global/static
+ $no_caps_here function scope my() or local() variables
+
+Function and method names seem to work best as all lowercase.
+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.
+
+=item *
+
+Select what to export.
+
+Do NOT export method names!
+
+Do NOT export anything else by default without a good reason!
+
+Exports pollute the namespace of the module user. If you must
+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->method >>)
+syntax. By convention you can use a leading underscore on names to
+indicate informally that they are 'internal' and not for public use.
+
+(It is actually possible to get private functions by saying:
+C<my $subref = sub { ... }; &$subref;>. But there's no way to call that
+directly as a method, because a method must have a name in the symbol
+table.)
+
+As a general rule, if the module is trying to be object oriented
+then export nothing. If it's just a collection of functions then
+@EXPORT_OK anything but use @EXPORT with caution.
+
+=item *
+
+Select a name for the module.
+
+This name should be as descriptive, accurate, and complete as
+possible. Avoid any risk of ambiguity. Always try to use two or
+more whole words. Generally the name should reflect what is special
+about what the module does rather than how it does it. Please use
+nested module names to group informally or categorize a module.
+There should be a very good reason for a module not to have a nested name.
+Module names should begin with a capital letter.
+
+Having 57 modules all called Sort will not make life easy for anyone
+(though having 23 called Sort::Quick is only marginally better :-).
+Imagine someone trying to install your module alongside many others.
+If in any doubt ask for suggestions in comp.lang.perl.misc.
+
+If you are developing a suite of related modules/classes it's good
+practice to use nested classes with a common prefix as this will
+avoid namespace clashes. For example: Xyz::Control, Xyz::View,
+Xyz::Model etc. Use the modules in this list as a naming guide.
+
+If adding a new module to a set, follow the original author's
+standards for naming modules and the interface to methods in
+those modules.
+
+If developing modules for private internal or project specific use,
+that will never be released to the public, then you should ensure
+that their names will not clash with any future public module. You
+can do this either by using the reserved Local::* category or by
+using a category name that includes an underscore like Foo_Corp::*.
+
+To be portable each component of a module name should be limited to
+11 characters. If it might be used on MS-DOS then try to ensure each is
+unique in the first 8 characters. Nested modules make this easier.
+
+=item *
+
+Have you got it right?
+
+How do you know that you've made the right decisions? Have you
+picked an interface design that will cause problems later? Have
+you picked the most appropriate name? Do you have any questions?
+
+The best way to know for sure, and pick up many helpful suggestions,
+is to ask someone who knows. Comp.lang.perl.misc is read by just about
+all the people who develop modules and it's the best place to ask.
+
+All you need to do is post a short summary of the module, its
+purpose and interfaces. A few lines on each of the main methods is
+probably enough. (If you post the whole module it might be ignored
+by busy people - generally the very people you want to read it!)
+
+Don't worry about posting if you can't say when the module will be
+ready - just say so in the message. It might be worth inviting
+others to help you, they may be able to complete it for you!
+
+=item *
+
+README and other Additional Files.
+
+It's well known that software developers usually fully document the
+software they write. If, however, the world is in urgent need of
+your software and there is not enough time to write the full
+documentation please at least provide a README file containing:
+
+=over 10
+
+=item *
+
+A description of the module/package/extension etc.
+
+=item *
+
+A copyright notice - see below.
+
+=item *
+
+Prerequisites - what else you may need to have.
+
+=item *
+
+How to build it - possible changes to Makefile.PL etc.
+
+=item *
+
+How to install it.
+
+=item *
+
+Recent changes in this release, especially incompatibilities
+
+=item *
+
+Changes / enhancements you plan to make in the future.
+
+=back
+
+If the README file seems to be getting too large you may wish to
+split out some of the sections into separate files: INSTALL,
+Copying, ToDo etc.
+
+=over 4
+
+=item Adding a Copyright Notice.
+
+
+How you choose to license your work is a personal decision.
+The general mechanism is to assert your Copyright and then make
+a declaration of how others may copy/use/modify your work.
+
+Perl, for example, is supplied with two types of licence: The GNU
+GPL and The Artistic Licence (see the files README, Copying, and
+Artistic). Larry has good reasons for NOT just using the GNU GPL.
+
+My personal recommendation, out of respect for Larry, Perl, and the
+Perl community at large is to state something simply like:
+
+ Copyright (c) 1995 Your Name. All rights reserved.
+ This program is free software; you can redistribute it and/or
+ modify it under the same terms as Perl itself.
+
+This statement should at least appear in the README file. You may
+also wish to include it in a Copying file and your source files.
+Remember to include the other words in addition to the Copyright.
+
+=item *
+
+Give the module a version/issue/release number.
+
+To be fully compatible with the Exporter and MakeMaker modules you
+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 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
+releasing the module (ModuleName-1.02.tar.Z).
+See perldoc ExtUtils::MakeMaker.pm for details.
+
+=item *
+
+How to release and distribute a module.
+
+It's good idea to post an announcement of the availability of your
+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, 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
+name that includes the version number. Most incoming directories
+will not be readable/listable, i.e., you won't be able to see your
+file after uploading it. Remember to send your email notification
+message as soon as possible after uploading else your file may get
+deleted automatically. Allow time for the file to be processed
+and/or check the file has been processed before announcing its
+location.
+
+FTP Archives for Perl Modules:
+
+Follow the instructions and links on:
+
+ http://www.cpan.org/modules/00modlist.long.html
+ http://www.cpan.org/modules/04pause.html
+
+or upload to one of these sites:
+
+ https://pause.kbx.de/pause/
+ http://pause.perl.org/pause/
+
+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
+CPAN!
+
+Please remember to send me an updated entry for the Module list!
+
+=item *
+
+Take care when changing a released module.
+
+Always strive to remain compatible with previous released versions.
+Otherwise try to add a mechanism to revert to the
+old behavior if people rely on it. Document incompatible changes.
+
+=back
+
+=back
+
+=head2 Guidelines for Converting Perl 4 Library Scripts into Modules
+
+=over 4
+
+=item *
+
+There is no requirement to convert anything.
+
+If it ain't broke, don't fix it! Perl 4 library scripts should
+continue to work with no problems. You may need to make some minor
+changes (like escaping non-array @'s in double quoted strings) but
+there is no need to convert a .pl file into a Module for just that.
+
+=item *
+
+Consider the implications.
+
+All Perl applications that make use of the script will need to
+be changed (slightly) if the script is converted into a module. Is
+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.
+
+=item *
+
+The pl2pm utility will get you started.
+
+This utility will read *.pl files (given as parameters) and write
+corresponding *.pm files. The pl2pm utilities does the following:
+
+=over 10
+
+=item *
+
+Adds the standard Module prologue lines
+
+=item *
+
+Converts package specifiers from ' to ::
+
+=item *
+
+Converts die(...) to croak(...)
+
+=item *
+
+Several other minor changes
+
+=back
+
+Being a mechanical process pl2pm is not bullet proof. The converted
+code will need careful checking, especially any package statements.
+Don't delete the original .pl file till the new .pm one works!
+
+=back
+
+=head2 Guidelines for Reusing Application Code
+
+=over 4
+
+=item *
+
+Complete applications rarely belong in the Perl Module Library.
+
+=item *
+
+Many applications contain some Perl code that could be reused.
+
+Help save the world! Share your code in a form that makes it easy
+to reuse.
+
+=item *
+
+Break-out the reusable code into one or more separate module files.
+
+=item *
+
+Take the opportunity to reconsider and redesign the interfaces.
+
+=item *
+
+In some cases the 'application' can then be reduced to a small
+
+fragment of code built on top of the reusable modules. In these cases
+the application could invoked as:
+
+ % perl -e 'use Module::Name; method(@ARGV)' ...
+or
+ % perl -mModule::Name ... (in perl5.002 or higher)
+
+=back
+
+=head1 NOTE
+
+Perl does not enforce private and public parts of its modules as you may
+have been used to in other languages like C++, Ada, or Modula-17. Perl
+doesn't have an infatuation with enforced privacy. It would prefer
+that you stayed out of its living room because you weren't invited, not
+because it has a shotgun.
+
+The module and its user have a contract, part of which is common law,
+and part of which is "written". Part of the common law contract is
+that a module doesn't pollute any namespace it wasn't asked to. The
+written contract for the module (A.K.A. documentation) may make other
+provisions. But then you know when you C<use RedefineTheWorld> that
+you're redefining the world and willing to take the consequences.
+EOF
+
+close MANIFEST or warn "$0: failed to close MANIFEST (../MANIFEST): $!";
+close OUT or warn "$0: failed to close OUT (perlmodlib.tmp): $!";
+
diff --git a/gnu/usr.bin/perl/pod/perlnewmod.pod b/gnu/usr.bin/perl/pod/perlnewmod.pod
new file mode 100644
index 00000000000..ace8d85130f
--- /dev/null
+++ b/gnu/usr.bin/perl/pod/perlnewmod.pod
@@ -0,0 +1,282 @@
+=head1 NAME
+
+perlnewmod - preparing a new module for distribution
+
+=head1 DESCRIPTION
+
+This document gives you some suggestions about how to go about writing
+Perl modules, preparing them for distribution, and making them available
+via CPAN.
+
+One of the things that makes Perl really powerful is the fact that Perl
+hackers tend to want to share the solutions to problems they've faced,
+so you and I don't have to battle with the same problem again.
+
+The main way they do this is by abstracting the solution into a Perl
+module. If you don't know what one of these is, the rest of this
+document isn't going to be much use to you. You're also missing out on
+an awful lot of useful code; consider having a look at L<perlmod>,
+L<perlmodlib> and L<perlmodinstall> before coming back here.
+
+When you've found that there isn't a module available for what you're
+trying to do, and you've had to write the code yourself, consider
+packaging up the solution into a module and uploading it to CPAN so that
+others can benefit.
+
+=head2 Warning
+
+We're going to primarily concentrate on Perl-only modules here, rather
+than XS modules. XS modules serve a rather different purpose, and
+you should consider different things before distributing them - the
+popularity of the library you are gluing, the portability to other
+operating systems, and so on. However, the notes on preparing the Perl
+side of the module and packaging and distributing it will apply equally
+well to an XS module as a pure-Perl one.
+
+=head2 What should I make into a module?
+
+You should make a module out of any code that you think is going to be
+useful to others. Anything that's likely to fill a hole in the communal
+library and which someone else can slot directly into their program. Any
+part of your code which you can isolate and extract and plug into
+something else is a likely candidate.
+
+Let's take an example. Suppose you're reading in data from a local
+format into a hash-of-hashes in Perl, turning that into a tree, walking
+the tree and then piping each node to an Acme Transmogrifier Server.
+
+Now, quite a few people have the Acme Transmogrifier, and you've had to
+write something to talk the protocol from scratch - you'd almost
+certainly want to make that into a module. The level at which you pitch
+it is up to you: you might want protocol-level modules analogous to
+L<Net::SMTP|Net::SMTP> which then talk to higher level modules analogous
+to L<Mail::Send|Mail::Send>. The choice is yours, but you do want to get
+a module out for that server protocol.
+
+Nobody else on the planet is going to talk your local data format, so we
+can ignore that. But what about the thing in the middle? Building tree
+structures from Perl variables and then traversing them is a nice,
+general problem, and if nobody's already written a module that does
+that, you might want to modularise that code too.
+
+So hopefully you've now got a few ideas about what's good to modularise.
+Let's now see how it's done.
+
+=head2 Step-by-step: Preparing the ground
+
+Before we even start scraping out the code, there are a few things we'll
+want to do in advance.
+
+=over 3
+
+=item Look around
+
+Dig into a bunch of modules to see how they're written. I'd suggest
+starting with L<Text::Tabs|Text::Tabs>, since it's in the standard
+library and is nice and simple, and then looking at something like
+L<Time::Zone|Time::Zone>, L<File::Copy|File::Copy> and then some of the
+C<Mail::*> modules if you're planning on writing object oriented code.
+
+These should give you an overall feel for how modules are laid out and
+written.
+
+=item Check it's new
+
+There are a lot of modules on CPAN, and it's easy to miss one that's
+similar to what you're planning on contributing. Have a good plough
+through the modules list and the F<by-module> directories, and make sure
+you're not the one reinventing the wheel!
+
+=item Discuss the need
+
+You might love it. You might feel that everyone else needs it. But there
+might not actually be any real demand for it out there. If you're unsure
+about the demand you're module will have, consider sending out feelers
+on the C<comp.lang.perl.modules> newsgroup, or as a last resort, ask the
+modules list at C<modules@perl.org>. Remember that this is a closed list
+with a very long turn-around time - be prepared to wait a good while for
+a response from them.
+
+=item Choose a name
+
+Perl modules included on CPAN have a naming hierarchy you should try to
+fit in with. See L<perlmodlib> for more details on how this works, and
+browse around CPAN and the modules list to get a feel of it. At the very
+least, remember this: modules should be title capitalised, (This::Thing)
+fit in with a category, and explain their purpose succinctly.
+
+=item Check again
+
+While you're doing that, make really sure you haven't missed a module
+similar to the one you're about to write.
+
+When you've got your name sorted out and you're sure that your module is
+wanted and not currently available, it's time to start coding.
+
+=back
+
+=head2 Step-by-step: Making the module
+
+=over 3
+
+=item Start with F<h2xs>
+
+Originally a utility to convert C header files into XS modules,
+L<h2xs|h2xs> has become a useful utility for churning out skeletons for
+Perl-only modules as well. If you don't want to use the
+L<Autoloader|Autoloader> which splits up big modules into smaller
+subroutine-sized chunks, you'll say something like this:
+
+ h2xs -AX -n Net::Acme
+
+The C<-A> omits the Autoloader code, C<-X> omits XS elements, and C<-n>
+specifies the name of the module.
+
+=item Use L<strict|strict> and L<warnings|warnings>
+
+A module's code has to be warning and strict-clean, since you can't
+guarantee the conditions that it'll be used under. Besides, you wouldn't
+want to distribute code that wasn't warning or strict-clean anyway,
+right?
+
+=item Use L<Carp|Carp>
+
+The L<Carp|Carp> module allows you to present your error messages from
+the caller's perspective; this gives you a way to signal a problem with
+the caller and not your module. For instance, if you say this:
+
+ warn "No hostname given";
+
+the user will see something like this:
+
+ No hostname given at /usr/local/lib/perl5/site_perl/5.6.0/Net/Acme.pm
+ line 123.
+
+which looks like your module is doing something wrong. Instead, you want
+to put the blame on the user, and say this:
+
+ No hostname given at bad_code, line 10.
+
+You do this by using L<Carp|Carp> and replacing your C<warn>s with
+C<carp>s. If you need to C<die>, say C<croak> instead. However, keep
+C<warn> and C<die> in place for your sanity checks - where it really is
+your module at fault.
+
+=item Use L<Exporter|Exporter> - wisely!
+
+C<h2xs> provides stubs for L<Exporter|Exporter>, which gives you a
+standard way of exporting symbols and subroutines from your module into
+the caller's namespace. For instance, saying C<use Net::Acme qw(&frob)>
+would import the C<frob> subroutine.
+
+The package variable C<@EXPORT> will determine which symbols will get
+exported when the caller simply says C<use Net::Acme> - you will hardly
+ever want to put anything in there. C<@EXPORT_OK>, on the other hand,
+specifies which symbols you're willing to export. If you do want to
+export a bunch of symbols, use the C<%EXPORT_TAGS> and define a standard
+export set - look at L<Exporter> for more details.
+
+=item Use L<plain old documentation|perlpod>
+
+The work isn't over until the paperwork is done, and you're going to
+need to put in some time writing some documentation for your module.
+C<h2xs> will provide a stub for you to fill in; if you're not sure about
+the format, look at L<perlpod> for an introduction. Provide a good
+synopsis of how your module is used in code, a description, and then
+notes on the syntax and function of the individual subroutines or
+methods. Use Perl comments for developer notes and POD for end-user
+notes.
+
+=item Write tests
+
+You're encouraged to create self-tests for your module to ensure it's
+working as intended on the myriad platforms Perl supports; if you upload
+your module to CPAN, a host of testers will build your module and send
+you the results of the tests. Again, C<h2xs> provides a test framework
+which you can extend - you should do something more than just checking
+your module will compile.
+
+=item Write the README
+
+If you're uploading to CPAN, the automated gremlins will extract the
+README file and place that in your CPAN directory. It'll also appear in
+the main F<by-module> and F<by-category> directories if you make it onto
+the modules list. It's a good idea to put here what the module actually
+does in detail, and the user-visible changes since the last release.
+
+=back
+
+=head2 Step-by-step: Distributing your module
+
+=over 3
+
+=item Get a CPAN user ID
+
+Every developer publishing modules on CPAN needs a CPAN ID. See the
+instructions at C<http://www.cpan.org/modules/04pause.html> (or
+equivalent on your nearest mirror) to find out how to do this.
+
+=item C<perl Makefile.PL; make test; make dist>
+
+Once again, C<h2xs> has done all the work for you. It produces the
+standard C<Makefile.PL> you'll have seen when you downloaded and
+installs modules, and this produces a Makefile with a C<dist> target.
+
+Once you've ensured that your module passes its own tests - always a
+good thing to make sure - you can C<make dist>, and the Makefile will
+hopefully produce you a nice tarball of your module, ready for upload.
+
+=item Upload the tarball
+
+The email you got when you received your CPAN ID will tell you how to
+log in to PAUSE, the Perl Authors Upload SErver. From the menus there,
+you can upload your module to CPAN.
+
+=item Announce to the modules list
+
+Once uploaded, it'll sit unnoticed in your author directory. If you want
+it connected to the rest of the CPAN, you'll need to tell the modules
+list about it. The best way to do this is to email them a line in the
+style of the modules list, like this:
+
+ Net::Acme bdpO Interface to Acme Frobnicator servers FOOBAR
+ ^ ^^^^ ^ ^
+ | |||| Module description Your ID
+ | ||||
+ | |||\- Interface: (O)OP, (r)eferences, (h)ybrid, (f)unctions
+ | |||
+ | ||\-- Language: (p)ure Perl, C(+)+, (h)ybrid, (C), (o)ther
+ | ||
+ Module |\--- Support: (d)eveloper, (m)ailing list, (u)senet, (n)one
+ Name |
+ \---- Maturity: (i)dea, (c)onstructions, (a)lpha, (b)eta,
+ (R)eleased, (M)ature, (S)tandard
+
+plus a description of the module and why you think it should be
+included. If you hear nothing back, that means your module will
+probably appear on the modules list at the next update. Don't try
+subscribing to C<modules@perl.org>; it's not another mailing list. Just
+have patience.
+
+=item Announce to clpa
+
+If you have a burning desire to tell the world about your release, post
+an announcement to the moderated C<comp.lang.perl.announce> newsgroup.
+
+=item Fix bugs!
+
+Once you start accumulating users, they'll send you bug reports. If
+you're lucky, they'll even send you patches. Welcome to the joys of
+maintaining a software project...
+
+=back
+
+=head1 AUTHOR
+
+Simon Cozens, C<simon@cpan.org>
+
+=head1 SEE ALSO
+
+L<perlmod>, L<perlmodlib>, L<perlmodinstall>, L<h2xs>, L<strict>,
+L<Carp>, L<Exporter>, L<perlpod>, L<Test>, L<ExtUtils::MakeMaker>,
+http://www.cpan.org/
diff --git a/gnu/usr.bin/perl/pod/perlnumber.pod b/gnu/usr.bin/perl/pod/perlnumber.pod
index c83e053203d..44d921cfe63 100644
--- a/gnu/usr.bin/perl/pod/perlnumber.pod
+++ b/gnu/usr.bin/perl/pod/perlnumber.pod
@@ -39,7 +39,7 @@ 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
+0.9 cannot be represented by a native float, since the binary fraction
for 0.9 is infinite:
binary0.1110011001100...
@@ -59,7 +59,7 @@ 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
+does not mean that the I<operations> over these numbers will use all
of the significant digits.
See L<"Numeric operators and numeric conversions"> for details.)
@@ -91,7 +91,7 @@ Six such conversions are possible:
These conversions are governed by the following general rules:
-=over
+=over 4
=item *
@@ -141,7 +141,7 @@ 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
+=over 4
=item Arithmetic operators except, C<no integer>
diff --git a/gnu/usr.bin/perl/pod/perlopentut.pod b/gnu/usr.bin/perl/pod/perlopentut.pod
index 9cb9f6738a7..b4003f4f2ef 100644
--- a/gnu/usr.bin/perl/pod/perlopentut.pod
+++ b/gnu/usr.bin/perl/pod/perlopentut.pod
@@ -73,8 +73,8 @@ 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
-the Dweomer">.
+as well. For accessing files with naughty names, see
+L<"Dispelling the Dweomer">.
=head2 Pipe Opens
@@ -107,13 +107,13 @@ In most systems, such an C<open> will not return an error. That's
because in the traditional C<fork>/C<exec> model, running the other
program happens only in the forked child process, which means that
the failed C<exec> can't be reflected in the return value of C<open>.
-Only a failed C<fork> shows up there. See L<perlfaq8/"Why doesn't open()
-return an error when a pipe open fails?"> to see how to cope with this.
-There's also an explanation in L<perlipc>.
+Only a failed C<fork> shows up there. See
+L<perlfaq8/"Why doesn't open() return an error when a pipe open fails?">
+to see how to cope with this. There's also an explanation in L<perlipc>.
If you would like to open a bidirectional pipe, the IPC::Open2
-library will handle this for you. Check out L<perlipc/"Bidirectional
-Communication with Another Process">
+library will handle this for you. Check out
+L<perlipc/"Bidirectional Communication with Another Process">
=head2 The Minus File
@@ -126,8 +126,8 @@ access the standard output.
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 currently running! This is actually
-a stealth C<fork> hidden inside an C<open> call. See L<perlipc/"Safe Pipe
-Opens"> for details.
+a stealth C<fork> hidden inside an C<open> call. See
+L<perlipc/"Safe Pipe Opens"> for details.
=head2 Mixing Reads and Writes
@@ -309,7 +309,7 @@ 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.)
+added to the sysopen() flags because large files are 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
@@ -684,9 +684,9 @@ also some high-level modules on CPAN that can help you with these games.
Check out Term::ReadKey and Term::ReadLine.
What else can you open? To open a connection using sockets, you won't use
-one of Perl's two open functions. See L<perlipc/"Sockets: Client/Server
-Communication"> for that. Here's an example. Once you have it,
-you can use FH as a bidirectional filehandle.
+one of Perl's two open functions. See
+L<perlipc/"Sockets: Client/Server Communication"> for that. Here's an
+example. Once you have it, you can use FH as a bidirectional filehandle.
use IO::Socket;
local *FH = IO::Socket::INET->new("www.perl.com:80");
diff --git a/gnu/usr.bin/perl/pod/perlport.pod b/gnu/usr.bin/perl/pod/perlport.pod
index 6892b6a777f..9ae89e0799a 100644
--- a/gnu/usr.bin/perl/pod/perlport.pod
+++ b/gnu/usr.bin/perl/pod/perlport.pod
@@ -94,6 +94,26 @@ 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.
+A common cause of unportable programs is the misuse of chop() to trim
+newlines:
+
+ # XXX UNPORTABLE!
+ while(<FILE>) {
+ chop;
+ @array = split(/:/);
+ #...
+ }
+
+You can get away with this on Unix and MacOS (they have a single
+character end-of-line), but the same program will break under DOSish
+perls because you're only chop()ing half the end-of-line. Instead,
+chomp() should be used to trim newlines. The Dunce::Files module can
+help audit your code for misuses of chop().
+
+When dealing with binary files (or text files in binary mode) be sure
+to explicitly set $/ to the appropriate value for your file format
+before using chomp().
+
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
@@ -181,10 +201,12 @@ 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, 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. These are guaranteed to be portable.
+decimal), a big-endian host (Motorola, Sparc, PA) reads it as
+0x78563412 (2018915346 in decimal). Alpha and MIPS can be either:
+Digital/Compaq used/uses them in little-endian mode; SGI/Cray uses
+them in big-endian mode. To avoid this problem in network (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:
@@ -197,7 +219,7 @@ If you need to distinguish between endian architectures you could use
either of the variables set like so:
$is_big_endian = unpack("h*", pack("s", 1)) =~ /01/;
- $is_litte_endian = unpack("h*", pack("s", 1)) =~ /^1/;
+ $is_little_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
@@ -217,7 +239,7 @@ 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.
-Atlhough similar, file path specifications differ between Unix,
+Although 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.
@@ -332,7 +354,10 @@ operating systems put mandatory locks on such files.
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.
+case-preserving. Don't try to clear %ENV by saying C<%ENV = ();>, or,
+if you really have to, make it conditional on C<$^O ne 'VMS'> since in
+VMS the C<%ENV> table is much more than a per-process key-value string
+table.
Don't count on signals or C<%SIG> for anything.
@@ -355,7 +380,7 @@ Commands that launch external processes are generally supported on
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
+platforms, may not be available in the same location, might 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
@@ -650,6 +675,15 @@ DOSish perls are as follows:
Windows NT MSWin32 MSWin32-ppc
Cygwin cygwin
+The various MSWin32 Perl's can distinguish the OS they are running on
+via the value of the fifth element of the list returned from
+Win32::GetOSVersion(). For example:
+
+ if ($^O eq 'MSWin32') {
+ my @os_version_info = Win32::GetOSVersion();
+ print +('3.1','95','NT')[$os_version_info[4]],"\n";
+ }
+
Also see:
=over 4
@@ -681,15 +715,16 @@ 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/
+as L<perlcygwin>), http://www.cygwin.com/
=item *
The U/WIN environment for Win32,
-<http://www.research.att.com/sw/tools/uwin/
+http://www.research.att.com/sw/tools/uwin/
-=item Build instructions for OS/2, L<perlos2>
+=item *
+Build instructions for OS/2, L<perlos2>
=back
@@ -888,9 +923,9 @@ vmsperl on the web, http://www.sidhe.org/vmsperl/index.html
=head2 VOS
-Perl on VOS is discussed in F<README.vos> in the perl distribution.
-Perl on VOS can accept either VOS- or Unix-style file
-specifications as in either of the following:
+Perl on VOS is discussed in F<README.vos> in the perl distribution
+(installed as L<perlvos>). 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
$ perl -ne "print if /perl_setup/i" /system/notices
@@ -906,12 +941,11 @@ contain a slash character cannot be processed. Such files must be
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
-exit from Perl: dup, do_aspawn, do_spawn, fork, waitpid. Once these
-functions become available in the VOS POSIX.1 implementation, you can
-either recompile and rebind Perl, or you can download a newer port from
-ftp.stratus.com.
+See F<README.vos> for restrictions that apply when Perl is built
+with the alpha version of VOS POSIX.1 support.
+
+Perl on VOS is built without any extensions and does not support
+dynamic loading.
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
@@ -1042,7 +1076,8 @@ Also see:
*
-L<perlos390>, F<README.os390>, F<README.posix-bc>, F<README.vmesa>
+L<perlos390>, F<README.os390>, F<perlbs2000>, F<README.vmesa>,
+L<perlebcdic>.
=item *
@@ -1053,7 +1088,7 @@ general usage issues for all EBCDIC Perls. Send a message body of
=item *
AS/400 Perl information at
-ttp://as400.rochester.ibm.com/
+http://as400.rochester.ibm.com/
as well as on CPAN in the F<ports/> directory.
=back
@@ -1200,7 +1235,7 @@ Be OS, F<README.beos>
=item *
HP 300 MPE/iX, F<README.mpeix> and Mark Bixby's web page
-http://www.cccd.edu/~markb/perlix.html
+http://www.bixby.org/mark/perlix.html
=item *
@@ -1208,7 +1243,7 @@ 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.
-=item
+=item *
Plan 9, F<README.plan9>
@@ -1640,6 +1675,10 @@ Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>, VOS, VM/ESA)
=item stat
+Platforms that do not have rdev, blksize, or blocks will return these
+as '', so numeric comparison or manipulation of these fields may cause
+'not numeric' warnings.
+
mtime and atime are the same thing, and ctime is creation time instead of
inode change time. (S<Mac OS>)
@@ -1650,6 +1689,9 @@ device and inode are not necessarily reliable. (VMS)
mtime, atime and ctime all return the last modification time. Device and
inode are not necessarily reliable. (S<RISC OS>)
+dev, rdev, blksize, and blocks are not available. inode is not
+meaningful and will differ between stat calls on the same file. (os2)
+
=item symlink OLDFILE,NEWFILE
Not implemented. (Win32, VMS, S<RISC OS>)
@@ -1746,7 +1788,7 @@ two seconds. (Win32)
Not implemented. (S<Mac OS>, VOS)
Can only be applied to process handles returned for processes spawned
-using C<system(1, ...)>. (Win32)
+using C<system(1, ...)> or pseudo processes created with C<fork()>. (Win32)
Not useful. (S<RISC OS>)
@@ -1756,6 +1798,11 @@ Not useful. (S<RISC OS>)
=over 4
+=item v1.48, 02 February 2001
+
+Various updates from perl5-porters over the past year, supported
+platforms update from Jarkko Hietaniemi.
+
=item v1.47, 22 March 2000
Various cleanups from Tom Christiansen, including migration of
@@ -1838,96 +1885,98 @@ First public release with perl5.005.
=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
+As of early 2001 (the Perl release 5.6.1), 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
+ AmigaOS
+ Darwin (Rhapsody)
+ DG/UX
DOS DJGPP 1)
+ DYNIX/ptx
+ EPOC
FreeBSD
HP-UX
IRIX
Linux
- LynxOS
MachTen
- MPE/iX
- NetBSD
+ MacOS Classic 2)
+ NonStop-UX
+ ReliantUNIX (SINIX)
OpenBSD
+ OpenVMS (VMS)
OS/2
+ OS X
QNX
- Rhapsody/Darwin 2)
- SCO SV
- SINIX
Solaris
- SVR4
- Tru64 UNIX 3)
+ Tru64 UNIX (DEC OSF/1, Digital UNIX)
UNICOS
UNICOS/mk
- Unixware
- VMS
VOS
- Windows 3.1 1)
- Windows 95 1) 4)
- Windows 98 1) 4)
- Windows NT 1) 4)
+ Win32/NT/2K 3)
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++
+ 2) Mac OS Classic (pre-X) is almost 5.6.1-ready; building from
+ the source does work with 5.6.1, but additional MacOS specific
+ source code is needed for a complete build. Contact the mailing
+ list macperl-porters@macperl.org for more information.
+ 3) 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.
+The following platforms worked for the previous release (5.6.0),
+but we did not manage to test these in time for the 5.6.1 release.
+There is a very good chance that these will work fine with 5.6.1.
- A/UX
- BeOS
- BSD/OS
- DG/UX
- DYNIX/ptx
DomainOS
Hurd
- NextSTEP
- OpenSTEP
+ LynxOS
+ MinGW
+ MPE/iX
+ NetBSD
PowerMAX
- SCO ODT/OSR
+ SCO SV
SunOS
- Ultrix
+ SVR4
+ Unixware
+ Windows 3.1
+ Windows 95
+ Windows 98
+ Windows Me
-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:
+The following platform worked for the 5.005_03 major release but not
+5.6.0. Standardization on UTF-8 as the internal string representation
+in 5.6.0 and 5.6.1 has introduced incompatibilities in this EBCDIC
+platform. While Perl 5.6.1 will build on this platform some
+regression tests may fail and the C<use utf8;> pragma typically
+introduces text handling errors. UTF-8 support for this platform may
+be enabled in a future release:
- OS390 1)
+ OS/390 1)
- 1) Previously known as MVS, or OpenEdition MVS.
+ 1) previously known as MVS, about to become z/OS.
-Strongly related to the OS390 platform by also being EBCDIC-based
+Strongly related to the OS/390 platform by also being EBCDIC-based
mainframe platforms are the following platforms:
- BS2000
+ POSIX-BC (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.
+These are also expected to work, albeit with no UTF-8 support, under 5.6.1
+for the same reasons as OS/390. Contact the mailing list perl-mvs@perl.org
+for more details.
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:
+the past (5.005_03 and earlier), 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. They used to work,
+though, so go ahead and try compiling them, and let perlbug@perl.org
+of any trouble.
3b1
- AmigaOS
+ A/UX
+ BeOS
+ BSD/OS
ConvexOS
CX/UX
DC/OSx
@@ -1944,16 +1993,21 @@ platforms--or both:
MiNT
MPC
NEWS-OS
+ NextSTEP
+ OpenSTEP
Opus
Plan 9
PowerUX
RISC/os
+ SCO ODT/OSR
Stellar
SVR2
TI1500
TitanOS
+ Ultrix
Unisys Dynix
Unixware
+ UTS
Support for the following platform is planned for a future Perl release:
@@ -1964,8 +2018,8 @@ binaries available via http://www.perl.com/CPAN/ports/index.html:
Perl release
- AS/400 5.003
Netware 5.003_07
+ OS/400 5.005_02
Tandem Guardian 5.004
The following platforms have only binaries available via
@@ -1984,8 +2038,9 @@ 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>.
+L<perlaix>, L<perlamiga>, L<perlcygwin>, L<perldos>, L<perlepoc>,
+L<perlebcdic>, L<perlhpux>, L<perlos2>, L<perlos390>, L<perlbs2000>,
+L<perlwin32>, L<perlvms>, L<perlvos>, and L<Win32>.
=head1 AUTHORS / CONTRIBUTORS
@@ -2001,7 +2056,7 @@ Neale Ferguson <neale@mailbox.tabnsw.com.au>,
David J. Fiander <davidf@mks.com>,
Paul Green <Paul_Green@stratus.com>,
M.J.T. Guy <mjtg@cus.cam.ac.uk>,
-Jarkko Hietaniemi <jhi@iki.fi<gt>,
+Jarkko Hietaniemi <jhi@iki.fi>,
Luther Huffman <lutherh@stratcom.com>,
Nick Ing-Simmons <nick@ni-s.u-net.com>,
Andreas J. KE<ouml>nig <koenig@kulturbox.de>,
diff --git a/gnu/usr.bin/perl/pod/perlreftut.pod b/gnu/usr.bin/perl/pod/perlreftut.pod
index c8593fb1ce6..073d358da55 100644
--- a/gnu/usr.bin/perl/pod/perlreftut.pod
+++ b/gnu/usr.bin/perl/pod/perlreftut.pod
@@ -386,7 +386,7 @@ to do with references.
=head1 Credits
-Author: Mark-Jason Dominus, Plover Systems (C<mjd-perl-ref@plover.com>)
+Author: Mark-Jason Dominus, Plover Systems (C<mjd-perl-ref+@plover.com>)
This article originally appeared in I<The Perl Journal>
(http://tpj.com) volume 3, #2. Reprinted with permission.
diff --git a/gnu/usr.bin/perl/pod/perlrequick.pod b/gnu/usr.bin/perl/pod/perlrequick.pod
new file mode 100644
index 00000000000..5b72a35187f
--- /dev/null
+++ b/gnu/usr.bin/perl/pod/perlrequick.pod
@@ -0,0 +1,503 @@
+=head1 NAME
+
+perlrequick - Perl regular expressions quick start
+
+=head1 DESCRIPTION
+
+This page covers the very basics of understanding, creating and
+using regular expressions ('regexes') in Perl.
+
+
+=head1 The Guide
+
+=head2 Simple word matching
+
+The simplest regex is simply a word, or more generally, a string of
+characters. A regex consisting of a word matches any string that
+contains that word:
+
+ "Hello World" =~ /World/; # matches
+
+In this statement, C<World> is a regex and the C<//> enclosing
+C</World/> tells perl to search a string for a match. The operator
+C<=~> associates the string with the regex match and produces a true
+value if the regex matched, or false if the regex did not match. In
+our case, C<World> matches the second word in C<"Hello World">, so the
+expression is true. This idea has several variations.
+
+Expressions like this are useful in conditionals:
+
+ print "It matches\n" if "Hello World" =~ /World/;
+
+The sense of the match can be reversed by using C<!~> operator:
+
+ print "It doesn't match\n" if "Hello World" !~ /World/;
+
+The literal string in the regex can be replaced by a variable:
+
+ $greeting = "World";
+ print "It matches\n" if "Hello World" =~ /$greeting/;
+
+If you're matching against C<$_>, the C<$_ =~> part can be omitted:
+
+ $_ = "Hello World";
+ print "It matches\n" if /World/;
+
+Finally, the C<//> default delimiters for a match can be changed to
+arbitrary delimiters by putting an C<'m'> out front:
+
+ "Hello World" =~ m!World!; # matches, delimited by '!'
+ "Hello World" =~ m{World}; # matches, note the matching '{}'
+ "/usr/bin/perl" =~ m"/perl"; # matches after '/usr/bin',
+ # '/' becomes an ordinary char
+
+Regexes must match a part of the string I<exactly> in order for the
+statement to be true:
+
+ "Hello World" =~ /world/; # doesn't match, case sensitive
+ "Hello World" =~ /o W/; # matches, ' ' is an ordinary char
+ "Hello World" =~ /World /; # doesn't match, no ' ' at end
+
+perl will always match at the earliest possible point in the string:
+
+ "Hello World" =~ /o/; # matches 'o' in 'Hello'
+ "That hat is red" =~ /hat/; # matches 'hat' in 'That'
+
+Not all characters can be used 'as is' in a match. Some characters,
+called B<metacharacters>, are reserved for use in regex notation.
+The metacharacters are
+
+ {}[]()^$.|*+?\
+
+A metacharacter can be matched by putting a backslash before it:
+
+ "2+2=4" =~ /2+2/; # doesn't match, + is a metacharacter
+ "2+2=4" =~ /2\+2/; # matches, \+ is treated like an ordinary +
+ 'C:\WIN32' =~ /C:\\WIN/; # matches
+ "/usr/bin/perl" =~ /\/usr\/local\/bin\/perl/; # matches
+
+In the last regex, the forward slash C<'/'> is also backslashed,
+because it is used to delimit the regex.
+
+Non-printable ASCII characters are represented by B<escape sequences>.
+Common examples are C<\t> for a tab, C<\n> for a newline, and C<\r>
+for a carriage return. Arbitrary bytes are represented by octal
+escape sequences, e.g., C<\033>, or hexadecimal escape sequences,
+e.g., C<\x1B>:
+
+ "1000\t2000" =~ m(0\t2) # matches
+ "cat" =~ /\143\x61\x74/ # matches, but a weird way to spell cat
+
+Regexes are treated mostly as double quoted strings, so variable
+substitution works:
+
+ $foo = 'house';
+ 'cathouse' =~ /cat$foo/; # matches
+ 'housecat' =~ /${foo}cat/; # matches
+
+With all of the regexes above, if the regex matched anywhere in the
+string, it was considered a match. To specify I<where> it should
+match, we would use the B<anchor> metacharacters C<^> and C<$>. The
+anchor C<^> means match at the beginning of the string and the anchor
+C<$> means match at the end of the string, or before a newline at the
+end of the string. Some examples:
+
+ "housekeeper" =~ /keeper/; # matches
+ "housekeeper" =~ /^keeper/; # doesn't match
+ "housekeeper" =~ /keeper$/; # matches
+ "housekeeper\n" =~ /keeper$/; # matches
+ "housekeeper" =~ /^housekeeper$/; # matches
+
+=head2 Using character classes
+
+A B<character class> allows a set of possible characters, rather than
+just a single character, to match at a particular point in a regex.
+Character classes are denoted by brackets C<[...]>, with the set of
+characters to be possibly matched inside. Here are some examples:
+
+ /cat/; # matches 'cat'
+ /[bcr]at/; # matches 'bat', 'cat', or 'rat'
+ "abc" =~ /[cab]/; # matches 'a'
+
+In the last statement, even though C<'c'> is the first character in
+the class, the earliest point at which the regex can match is C<'a'>.
+
+ /[yY][eE][sS]/; # match 'yes' in a case-insensitive way
+ # 'yes', 'Yes', 'YES', etc.
+ /yes/i; # also match 'yes' in a case-insensitive way
+
+The last example shows a match with an C<'i'> B<modifier>, which makes
+the match case-insensitive.
+
+Character classes also have ordinary and special characters, but the
+sets of ordinary and special characters inside a character class are
+different than those outside a character class. The special
+characters for a character class are C<-]\^$> and are matched using an
+escape:
+
+ /[\]c]def/; # matches ']def' or 'cdef'
+ $x = 'bcr';
+ /[$x]at/; # matches 'bat, 'cat', or 'rat'
+ /[\$x]at/; # matches '$at' or 'xat'
+ /[\\$x]at/; # matches '\at', 'bat, 'cat', or 'rat'
+
+The special character C<'-'> acts as a range operator within character
+classes, so that the unwieldy C<[0123456789]> and C<[abc...xyz]>
+become the svelte C<[0-9]> and C<[a-z]>:
+
+ /item[0-9]/; # matches 'item0' or ... or 'item9'
+ /[0-9a-fA-F]/; # matches a hexadecimal digit
+
+If C<'-'> is the first or last character in a character class, it is
+treated as an ordinary character.
+
+The special character C<^> in the first position of a character class
+denotes a B<negated character class>, which matches any character but
+those in the brackets. Both C<[...]> and C<[^...]> must match a
+character, or the match fails. Then
+
+ /[^a]at/; # doesn't match 'aat' or 'at', but matches
+ # all other 'bat', 'cat, '0at', '%at', etc.
+ /[^0-9]/; # matches a non-numeric character
+ /[a^]at/; # matches 'aat' or '^at'; here '^' is ordinary
+
+Perl has several abbreviations for common character classes:
+
+=over 4
+
+=item *
+
+\d is a digit and represents [0-9]
+
+=item *
+
+\s is a whitespace character and represents [\ \t\r\n\f]
+
+=item *
+
+\w is a word character (alphanumeric or _) and represents [0-9a-zA-Z_]
+
+=item *
+
+\D is a negated \d; it represents any character but a digit [^0-9]
+
+=item *
+
+\S is a negated \s; it represents any non-whitespace character [^\s]
+
+=item *
+
+\W is a negated \w; it represents any non-word character [^\w]
+
+=item *
+
+The period '.' matches any character but "\n"
+
+=back
+
+The C<\d\s\w\D\S\W> abbreviations can be used both inside and outside
+of character classes. Here are some in use:
+
+ /\d\d:\d\d:\d\d/; # matches a hh:mm:ss time format
+ /[\d\s]/; # matches any digit or whitespace character
+ /\w\W\w/; # matches a word char, followed by a
+ # non-word char, followed by a word char
+ /..rt/; # matches any two chars, followed by 'rt'
+ /end\./; # matches 'end.'
+ /end[.]/; # same thing, matches 'end.'
+
+The S<B<word anchor> > C<\b> matches a boundary between a word
+character and a non-word character C<\w\W> or C<\W\w>:
+
+ $x = "Housecat catenates house and cat";
+ $x =~ /\bcat/; # matches cat in 'catenates'
+ $x =~ /cat\b/; # matches cat in 'housecat'
+ $x =~ /\bcat\b/; # matches 'cat' at end of string
+
+In the last example, the end of the string is considered a word
+boundary.
+
+=head2 Matching this or that
+
+We can match match different character strings with the B<alternation>
+metacharacter C<'|'>. To match C<dog> or C<cat>, we form the regex
+C<dog|cat>. As before, perl will try to match the regex at the
+earliest possible point in the string. At each character position,
+perl will first try to match the the first alternative, C<dog>. If
+C<dog> doesn't match, perl will then try the next alternative, C<cat>.
+If C<cat> doesn't match either, then the match fails and perl moves to
+the next position in the string. Some examples:
+
+ "cats and dogs" =~ /cat|dog|bird/; # matches "cat"
+ "cats and dogs" =~ /dog|cat|bird/; # matches "cat"
+
+Even though C<dog> is the first alternative in the second regex,
+C<cat> is able to match earlier in the string.
+
+ "cats" =~ /c|ca|cat|cats/; # matches "c"
+ "cats" =~ /cats|cat|ca|c/; # matches "cats"
+
+At a given character position, the first alternative that allows the
+regex match to succeed wil be the one that matches. Here, all the
+alternatives match at the first string position, so th first matches.
+
+=head2 Grouping things and hierarchical matching
+
+The B<grouping> metacharacters C<()> allow a part of a regex to be
+treated as a single unit. Parts of a regex are grouped by enclosing
+them in parentheses. The regex C<house(cat|keeper)> means match
+C<house> followed by either C<cat> or C<keeper>. Some more examples
+are
+
+ /(a|b)b/; # matches 'ab' or 'bb'
+ /(^a|b)c/; # matches 'ac' at start of string or 'bc' anywhere
+
+ /house(cat|)/; # matches either 'housecat' or 'house'
+ /house(cat(s|)|)/; # matches either 'housecats' or 'housecat' or
+ # 'house'. Note groups can be nested.
+
+ "20" =~ /(19|20|)\d\d/; # matches the null alternative '()\d\d',
+ # because '20\d\d' can't match
+
+=head2 Extracting matches
+
+The grouping metacharacters C<()> also allow the extraction of the
+parts of a string that matched. For each grouping, the part that
+matched inside goes into the special variables C<$1>, C<$2>, etc.
+They can be used just as ordinary variables:
+
+ # extract hours, minutes, seconds
+ $time =~ /(\d\d):(\d\d):(\d\d)/; # match hh:mm:ss format
+ $hours = $1;
+ $minutes = $2;
+ $seconds = $3;
+
+In list context, a match C</regex/> with groupings will return the
+list of matched values C<($1,$2,...)>. So we could rewrite it as
+
+ ($hours, $minutes, $second) = ($time =~ /(\d\d):(\d\d):(\d\d)/);
+
+If the groupings in a regex are nested, C<$1> gets the group with the
+leftmost opening parenthesis, C<$2> the next opening parenthesis,
+etc. For example, here is a complex regex and the matching variables
+indicated below it:
+
+ /(ab(cd|ef)((gi)|j))/;
+ 1 2 34
+
+Associated with the matching variables C<$1>, C<$2>, ... are
+the B<backreferences> C<\1>, C<\2>, ... Backreferences are
+matching variables that can be used I<inside> a regex:
+
+ /(\w\w\w)\s\1/; # find sequences like 'the the' in string
+
+C<$1>, C<$2>, ... should only be used outside of a regex, and C<\1>,
+C<\2>, ... only inside a regex.
+
+=head2 Matching repetitions
+
+The B<quantifier> metacharacters C<?>, C<*>, C<+>, and C<{}> allow us
+to determine the number of repeats of a portion of a regex we
+consider to be a match. Quantifiers are put immediately after the
+character, character class, or grouping that we want to specify. They
+have the following meanings:
+
+=over 4
+
+=item *
+
+C<a?> = match 'a' 1 or 0 times
+
+=item *
+
+C<a*> = match 'a' 0 or more times, i.e., any number of times
+
+=item *
+
+C<a+> = match 'a' 1 or more times, i.e., at least once
+
+=item *
+
+C<a{n,m}> = match at least C<n> times, but not more than C<m>
+times.
+
+=item *
+
+C<a{n,}> = match at least C<n> or more times
+
+=item *
+
+C<a{n}> = match exactly C<n> times
+
+=back
+
+Here are some examples:
+
+ /[a-z]+\s+\d*/; # match a lowercase word, at least some space, and
+ # any number of digits
+ /(\w+)\s+\1/; # match doubled words of arbitrary length
+ $year =~ /\d{2,4}/; # make sure year is at least 2 but not more
+ # than 4 digits
+ $year =~ /\d{4}|\d{2}/; # better match; throw out 3 digit dates
+
+These quantifiers will try to match as much of the string as possible,
+while still allowing the regex to match. So we have
+
+ $x = 'the cat in the hat';
+ $x =~ /^(.*)(at)(.*)$/; # matches,
+ # $1 = 'the cat in the h'
+ # $2 = 'at'
+ # $3 = '' (0 matches)
+
+The first quantifier C<.*> grabs as much of the string as possible
+while still having the regex match. The second quantifier C<.*> has
+no string left to it, so it matches 0 times.
+
+=head2 More matching
+
+There are a few more things you might want to know about matching
+operators. In the code
+
+ $pattern = 'Seuss';
+ while (<>) {
+ print if /$pattern/;
+ }
+
+perl has to re-evaluate C<$pattern> each time through the loop. If
+C<$pattern> won't be changing, use the C<//o> modifier, to only
+perform variable substitutions once. If you don't want any
+substitutions at all, use the special delimiter C<m''>:
+
+ $pattern = 'Seuss';
+ m'$pattern'; # matches '$pattern', not 'Seuss'
+
+The global modifier C<//g> allows the matching operator to match
+within a string as many times as possible. In scalar context,
+successive matches against a string will have C<//g> jump from match
+to match, keeping track of position in the string as it goes along.
+You can get or set the position with the C<pos()> function.
+For example,
+
+ $x = "cat dog house"; # 3 words
+ while ($x =~ /(\w+)/g) {
+ print "Word is $1, ends at position ", pos $x, "\n";
+ }
+
+prints
+
+ Word is cat, ends at position 3
+ Word is dog, ends at position 7
+ Word is house, ends at position 13
+
+A failed match or changing the target string resets the position. If
+you don't want the position reset after failure to match, add the
+C<//c>, as in C</regex/gc>.
+
+In list context, C<//g> returns a list of matched groupings, or if
+there are no groupings, a list of matches to the whole regex. So
+
+ @words = ($x =~ /(\w+)/g); # matches,
+ # $word[0] = 'cat'
+ # $word[1] = 'dog'
+ # $word[2] = 'house'
+
+=head2 Search and replace
+
+Search and replace is performed using C<s/regex/replacement/modifiers>.
+The C<replacement> is a Perl double quoted string that replaces in the
+string whatever is matched with the C<regex>. The operator C<=~> is
+also used here to associate a string with C<s///>. If matching
+against C<$_>, the S<C<$_ =~> > can be dropped. If there is a match,
+C<s///> returns the number of substitutions made, otherwise it returns
+false. Here are a few examples:
+
+ $x = "Time to feed the cat!";
+ $x =~ s/cat/hacker/; # $x contains "Time to feed the hacker!"
+ $y = "'quoted words'";
+ $y =~ s/^'(.*)'$/$1/; # strip single quotes,
+ # $y contains "quoted words"
+
+With the C<s///> operator, the matched variables C<$1>, C<$2>, etc.
+are immediately available for use in the replacement expression. With
+the global modifier, C<s///g> will search and replace all occurrences
+of the regex in the string:
+
+ $x = "I batted 4 for 4";
+ $x =~ s/4/four/; # $x contains "I batted four for 4"
+ $x = "I batted 4 for 4";
+ $x =~ s/4/four/g; # $x contains "I batted four for four"
+
+The evaluation modifier C<s///e> wraps an C<eval{...}> around the
+replacement string and the evaluated result is substituted for the
+matched substring. Some examples:
+
+ # reverse all the words in a string
+ $x = "the cat in the hat";
+ $x =~ s/(\w+)/reverse $1/ge; # $x contains "eht tac ni eht tah"
+
+ # convert percentage to decimal
+ $x = "A 39% hit rate";
+ $x =~ s!(\d+)%!$1/100!e; # $x contains "A 0.39 hit rate"
+
+The last example shows that C<s///> can use other delimiters, such as
+C<s!!!> and C<s{}{}>, and even C<s{}//>. If single quotes are used
+C<s'''>, then the regex and replacement are treated as single quoted
+strings.
+
+=head2 The split operator
+
+C<split /regex/, string> splits C<string> into a list of substrings
+and returns that list. The regex determines the character sequence
+that C<string> is split with respect to. For example, to split a
+string into words, use
+
+ $x = "Calvin and Hobbes";
+ @word = split /\s+/, $x; # $word[0] = 'Calvin'
+ # $word[1] = 'and'
+ # $word[2] = 'Hobbes'
+
+To extract a comma-delimited list of numbers, use
+
+ $x = "1.618,2.718, 3.142";
+ @const = split /,\s*/, $x; # $const[0] = '1.618'
+ # $const[1] = '2.718'
+ # $const[2] = '3.142'
+
+If the empty regex C<//> is used, the string is split into individual
+characters. If the regex has groupings, then list produced contains
+the matched substrings from the groupings as well:
+
+ $x = "/usr/bin";
+ @parts = split m!(/)!, $x; # $parts[0] = ''
+ # $parts[1] = '/'
+ # $parts[2] = 'usr'
+ # $parts[3] = '/'
+ # $parts[4] = 'bin'
+
+Since the first character of $x matched the regex, C<split> prepended
+an empty initial element to the list.
+
+=head1 BUGS
+
+None.
+
+=head1 SEE ALSO
+
+This is just a quick start guide. For a more in-depth tutorial on
+regexes, see L<perlretut> and for the reference page, see L<perlre>.
+
+=head1 AUTHOR AND COPYRIGHT
+
+Copyright (c) 2000 Mark Kvale
+All rights reserved.
+
+This document may be distributed under the same terms as Perl itself.
+
+=head2 Acknowledgments
+
+The author would like to thank Mark-Jason Dominus, Tom Christiansen,
+Ilya Zakharevich, Brad Hughes, and Mike Giroux for all their helpful
+comments.
+
+=cut
+
diff --git a/gnu/usr.bin/perl/pod/perlretut.pod b/gnu/usr.bin/perl/pod/perlretut.pod
new file mode 100644
index 00000000000..fa6479c0c45
--- /dev/null
+++ b/gnu/usr.bin/perl/pod/perlretut.pod
@@ -0,0 +1,2504 @@
+=head1 NAME
+
+perlretut - Perl regular expressions tutorial
+
+=head1 DESCRIPTION
+
+This page provides a basic tutorial on understanding, creating and
+using regular expressions in Perl. It serves as a complement to the
+reference page on regular expressions L<perlre>. Regular expressions
+are an integral part of the C<m//>, C<s///>, C<qr//> and C<split>
+operators and so this tutorial also overlaps with
+L<perlop/"Regexp Quote-Like Operators"> and L<perlfunc/split>.
+
+Perl is widely renowned for excellence in text processing, and regular
+expressions are one of the big factors behind this fame. Perl regular
+expressions display an efficiency and flexibility unknown in most
+other computer languages. Mastering even the basics of regular
+expressions will allow you to manipulate text with surprising ease.
+
+What is a regular expression? A regular expression is simply a string
+that describes a pattern. Patterns are in common use these days;
+examples are the patterns typed into a search engine to find web pages
+and the patterns used to list files in a directory, e.g., C<ls *.txt>
+or C<dir *.*>. In Perl, the patterns described by regular expressions
+are used to search strings, extract desired parts of strings, and to
+do search and replace operations.
+
+Regular expressions have the undeserved reputation of being abstract
+and difficult to understand. Regular expressions are constructed using
+simple concepts like conditionals and loops and are no more difficult
+to understand than the corresponding C<if> conditionals and C<while>
+loops in the Perl language itself. In fact, the main challenge in
+learning regular expressions is just getting used to the terse
+notation used to express these concepts.
+
+This tutorial flattens the learning curve by discussing regular
+expression concepts, along with their notation, one at a time and with
+many examples. The first part of the tutorial will progress from the
+simplest word searches to the basic regular expression concepts. If
+you master the first part, you will have all the tools needed to solve
+about 98% of your needs. The second part of the tutorial is for those
+comfortable with the basics and hungry for more power tools. It
+discusses the more advanced regular expression operators and
+introduces the latest cutting edge innovations in 5.6.0.
+
+A note: to save time, 'regular expression' is often abbreviated as
+regexp or regex. Regexp is a more natural abbreviation than regex, but
+is harder to pronounce. The Perl pod documentation is evenly split on
+regexp vs regex; in Perl, there is more than one way to abbreviate it.
+We'll use regexp in this tutorial.
+
+=head1 Part 1: The basics
+
+=head2 Simple word matching
+
+The simplest regexp is simply a word, or more generally, a string of
+characters. A regexp consisting of a word matches any string that
+contains that word:
+
+ "Hello World" =~ /World/; # matches
+
+What is this perl statement all about? C<"Hello World"> is a simple
+double quoted string. C<World> is the regular expression and the
+C<//> enclosing C</World/> tells perl to search a string for a match.
+The operator C<=~> associates the string with the regexp match and
+produces a true value if the regexp matched, or false if the regexp
+did not match. In our case, C<World> matches the second word in
+C<"Hello World">, so the expression is true. Expressions like this
+are useful in conditionals:
+
+ if ("Hello World" =~ /World/) {
+ print "It matches\n";
+ }
+ else {
+ print "It doesn't match\n";
+ }
+
+There are useful variations on this theme. The sense of the match can
+be reversed by using C<!~> operator:
+
+ if ("Hello World" !~ /World/) {
+ print "It doesn't match\n";
+ }
+ else {
+ print "It matches\n";
+ }
+
+The literal string in the regexp can be replaced by a variable:
+
+ $greeting = "World";
+ if ("Hello World" =~ /$greeting/) {
+ print "It matches\n";
+ }
+ else {
+ print "It doesn't match\n";
+ }
+
+If you're matching against the special default variable C<$_>, the
+C<$_ =~> part can be omitted:
+
+ $_ = "Hello World";
+ if (/World/) {
+ print "It matches\n";
+ }
+ else {
+ print "It doesn't match\n";
+ }
+
+And finally, the C<//> default delimiters for a match can be changed
+to arbitrary delimiters by putting an C<'m'> out front:
+
+ "Hello World" =~ m!World!; # matches, delimited by '!'
+ "Hello World" =~ m{World}; # matches, note the matching '{}'
+ "/usr/bin/perl" =~ m"/perl"; # matches after '/usr/bin',
+ # '/' becomes an ordinary char
+
+C</World/>, C<m!World!>, and C<m{World}> all represent the
+same thing. When, e.g., C<""> is used as a delimiter, the forward
+slash C<'/'> becomes an ordinary character and can be used in a regexp
+without trouble.
+
+Let's consider how different regexps would match C<"Hello World">:
+
+ "Hello World" =~ /world/; # doesn't match
+ "Hello World" =~ /o W/; # matches
+ "Hello World" =~ /oW/; # doesn't match
+ "Hello World" =~ /World /; # doesn't match
+
+The first regexp C<world> doesn't match because regexps are
+case-sensitive. The second regexp matches because the substring
+S<C<'o W'> > occurs in the string S<C<"Hello World"> >. The space
+character ' ' is treated like any other character in a regexp and is
+needed to match in this case. The lack of a space character is the
+reason the third regexp C<'oW'> doesn't match. The fourth regexp
+C<'World '> doesn't match because there is a space at the end of the
+regexp, but not at the end of the string. The lesson here is that
+regexps must match a part of the string I<exactly> in order for the
+statement to be true.
+
+If a regexp matches in more than one place in the string, perl will
+always match at the earliest possible point in the string:
+
+ "Hello World" =~ /o/; # matches 'o' in 'Hello'
+ "That hat is red" =~ /hat/; # matches 'hat' in 'That'
+
+With respect to character matching, there are a few more points you
+need to know about. First of all, not all characters can be used 'as
+is' in a match. Some characters, called B<metacharacters>, are reserved
+for use in regexp notation. The metacharacters are
+
+ {}[]()^$.|*+?\
+
+The significance of each of these will be explained
+in the rest of the tutorial, but for now, it is important only to know
+that a metacharacter can be matched by putting a backslash before it:
+
+ "2+2=4" =~ /2+2/; # doesn't match, + is a metacharacter
+ "2+2=4" =~ /2\+2/; # matches, \+ is treated like an ordinary +
+ "The interval is [0,1)." =~ /[0,1)./ # is a syntax error!
+ "The interval is [0,1)." =~ /\[0,1\)\./ # matches
+ "/usr/bin/perl" =~ /\/usr\/local\/bin\/perl/; # matches
+
+In the last regexp, the forward slash C<'/'> is also backslashed,
+because it is used to delimit the regexp. This can lead to LTS
+(leaning toothpick syndrome), however, and it is often more readable
+to change delimiters.
+
+
+The backslash character C<'\'> is a metacharacter itself and needs to
+be backslashed:
+
+ 'C:\WIN32' =~ /C:\\WIN/; # matches
+
+In addition to the metacharacters, there are some ASCII characters
+which don't have printable character equivalents and are instead
+represented by B<escape sequences>. Common examples are C<\t> for a
+tab, C<\n> for a newline, C<\r> for a carriage return and C<\a> for a
+bell. If your string is better thought of as a sequence of arbitrary
+bytes, the octal escape sequence, e.g., C<\033>, or hexadecimal escape
+sequence, e.g., C<\x1B> may be a more natural representation for your
+bytes. Here are some examples of escapes:
+
+ "1000\t2000" =~ m(0\t2) # matches
+ "1000\n2000" =~ /0\n20/ # matches
+ "1000\t2000" =~ /\000\t2/ # doesn't match, "0" ne "\000"
+ "cat" =~ /\143\x61\x74/ # matches, but a weird way to spell cat
+
+If you've been around Perl a while, all this talk of escape sequences
+may seem familiar. Similar escape sequences are used in double-quoted
+strings and in fact the regexps in Perl are mostly treated as
+double-quoted strings. This means that variables can be used in
+regexps as well. Just like double-quoted strings, the values of the
+variables in the regexp will be substituted in before the regexp is
+evaluated for matching purposes. So we have:
+
+ $foo = 'house';
+ 'housecat' =~ /$foo/; # matches
+ 'cathouse' =~ /cat$foo/; # matches
+ 'housecat' =~ /${foo}cat/; # matches
+
+So far, so good. With the knowledge above you can already perform
+searches with just about any literal string regexp you can dream up.
+Here is a I<very simple> emulation of the Unix grep program:
+
+ % cat > simple_grep
+ #!/usr/bin/perl
+ $regexp = shift;
+ while (<>) {
+ print if /$regexp/;
+ }
+ ^D
+
+ % chmod +x simple_grep
+
+ % simple_grep abba /usr/dict/words
+ Babbage
+ cabbage
+ cabbages
+ sabbath
+ Sabbathize
+ Sabbathizes
+ sabbatical
+ scabbard
+ scabbards
+
+This program is easy to understand. C<#!/usr/bin/perl> is the standard
+way to invoke a perl program from the shell.
+S<C<$regexp = shift;> > saves the first command line argument as the
+regexp to be used, leaving the rest of the command line arguments to
+be treated as files. S<C<< while (<>) >> > loops over all the lines in
+all the files. For each line, S<C<print if /$regexp/;> > prints the
+line if the regexp matches the line. In this line, both C<print> and
+C</$regexp/> use the default variable C<$_> implicitly.
+
+With all of the regexps above, if the regexp matched anywhere in the
+string, it was considered a match. Sometimes, however, we'd like to
+specify I<where> in the string the regexp should try to match. To do
+this, we would use the B<anchor> metacharacters C<^> and C<$>. The
+anchor C<^> means match at the beginning of the string and the anchor
+C<$> means match at the end of the string, or before a newline at the
+end of the string. Here is how they are used:
+
+ "housekeeper" =~ /keeper/; # matches
+ "housekeeper" =~ /^keeper/; # doesn't match
+ "housekeeper" =~ /keeper$/; # matches
+ "housekeeper\n" =~ /keeper$/; # matches
+
+The second regexp doesn't match because C<^> constrains C<keeper> to
+match only at the beginning of the string, but C<"housekeeper"> has
+keeper starting in the middle. The third regexp does match, since the
+C<$> constrains C<keeper> to match only at the end of the string.
+
+When both C<^> and C<$> are used at the same time, the regexp has to
+match both the beginning and the end of the string, i.e., the regexp
+matches the whole string. Consider
+
+ "keeper" =~ /^keep$/; # doesn't match
+ "keeper" =~ /^keeper$/; # matches
+ "" =~ /^$/; # ^$ matches an empty string
+
+The first regexp doesn't match because the string has more to it than
+C<keep>. Since the second regexp is exactly the string, it
+matches. Using both C<^> and C<$> in a regexp forces the complete
+string to match, so it gives you complete control over which strings
+match and which don't. Suppose you are looking for a fellow named
+bert, off in a string by himself:
+
+ "dogbert" =~ /bert/; # matches, but not what you want
+
+ "dilbert" =~ /^bert/; # doesn't match, but ..
+ "bertram" =~ /^bert/; # matches, so still not good enough
+
+ "bertram" =~ /^bert$/; # doesn't match, good
+ "dilbert" =~ /^bert$/; # doesn't match, good
+ "bert" =~ /^bert$/; # matches, perfect
+
+Of course, in the case of a literal string, one could just as easily
+use the string equivalence S<C<$string eq 'bert'> > and it would be
+more efficient. The C<^...$> regexp really becomes useful when we
+add in the more powerful regexp tools below.
+
+=head2 Using character classes
+
+Although one can already do quite a lot with the literal string
+regexps above, we've only scratched the surface of regular expression
+technology. In this and subsequent sections we will introduce regexp
+concepts (and associated metacharacter notations) that will allow a
+regexp to not just represent a single character sequence, but a I<whole
+class> of them.
+
+One such concept is that of a B<character class>. A character class
+allows a set of possible characters, rather than just a single
+character, to match at a particular point in a regexp. Character
+classes are denoted by brackets C<[...]>, with the set of characters
+to be possibly matched inside. Here are some examples:
+
+ /cat/; # matches 'cat'
+ /[bcr]at/; # matches 'bat, 'cat', or 'rat'
+ /item[0123456789]/; # matches 'item0' or ... or 'item9'
+ "abc" =~ /[cab]/; # matches 'a'
+
+In the last statement, even though C<'c'> is the first character in
+the class, C<'a'> matches because the first character position in the
+string is the earliest point at which the regexp can match.
+
+ /[yY][eE][sS]/; # match 'yes' in a case-insensitive way
+ # 'yes', 'Yes', 'YES', etc.
+
+This regexp displays a common task: perform a a case-insensitive
+match. Perl provides away of avoiding all those brackets by simply
+appending an C<'i'> to the end of the match. Then C</[yY][eE][sS]/;>
+can be rewritten as C</yes/i;>. The C<'i'> stands for
+case-insensitive and is an example of a B<modifier> of the matching
+operation. We will meet other modifiers later in the tutorial.
+
+We saw in the section above that there were ordinary characters, which
+represented themselves, and special characters, which needed a
+backslash C<\> to represent themselves. The same is true in a
+character class, but the sets of ordinary and special characters
+inside a character class are different than those outside a character
+class. The special characters for a character class are C<-]\^$>. C<]>
+is special because it denotes the end of a character class. C<$> is
+special because it denotes a scalar variable. C<\> is special because
+it is used in escape sequences, just like above. Here is how the
+special characters C<]$\> are handled:
+
+ /[\]c]def/; # matches ']def' or 'cdef'
+ $x = 'bcr';
+ /[$x]at/; # matches 'bat', 'cat', or 'rat'
+ /[\$x]at/; # matches '$at' or 'xat'
+ /[\\$x]at/; # matches '\at', 'bat, 'cat', or 'rat'
+
+The last two are a little tricky. in C<[\$x]>, the backslash protects
+the dollar sign, so the character class has two members C<$> and C<x>.
+In C<[\\$x]>, the backslash is protected, so C<$x> is treated as a
+variable and substituted in double quote fashion.
+
+The special character C<'-'> acts as a range operator within character
+classes, so that a contiguous set of characters can be written as a
+range. With ranges, the unwieldy C<[0123456789]> and C<[abc...xyz]>
+become the svelte C<[0-9]> and C<[a-z]>. Some examples are
+
+ /item[0-9]/; # matches 'item0' or ... or 'item9'
+ /[0-9bx-z]aa/; # matches '0aa', ..., '9aa',
+ # 'baa', 'xaa', 'yaa', or 'zaa'
+ /[0-9a-fA-F]/; # matches a hexadecimal digit
+ /[0-9a-zA-Z_]/; # matches a "word" character,
+ # like those in a perl variable name
+
+If C<'-'> is the first or last character in a character class, it is
+treated as an ordinary character; C<[-ab]>, C<[ab-]> and C<[a\-b]> are
+all equivalent.
+
+The special character C<^> in the first position of a character class
+denotes a B<negated character class>, which matches any character but
+those in the brackets. Both C<[...]> and C<[^...]> must match a
+character, or the match fails. Then
+
+ /[^a]at/; # doesn't match 'aat' or 'at', but matches
+ # all other 'bat', 'cat, '0at', '%at', etc.
+ /[^0-9]/; # matches a non-numeric character
+ /[a^]at/; # matches 'aat' or '^at'; here '^' is ordinary
+
+Now, even C<[0-9]> can be a bother the write multiple times, so in the
+interest of saving keystrokes and making regexps more readable, Perl
+has several abbreviations for common character classes:
+
+=over 4
+
+=item *
+
+\d is a digit and represents [0-9]
+
+=item *
+
+\s is a whitespace character and represents [\ \t\r\n\f]
+
+=item *
+
+\w is a word character (alphanumeric or _) and represents [0-9a-zA-Z_]
+
+=item *
+
+\D is a negated \d; it represents any character but a digit [^0-9]
+
+=item *
+
+\S is a negated \s; it represents any non-whitespace character [^\s]
+
+=item *
+
+\W is a negated \w; it represents any non-word character [^\w]
+
+=item *
+
+The period '.' matches any character but "\n"
+
+=back
+
+The C<\d\s\w\D\S\W> abbreviations can be used both inside and outside
+of character classes. Here are some in use:
+
+ /\d\d:\d\d:\d\d/; # matches a hh:mm:ss time format
+ /[\d\s]/; # matches any digit or whitespace character
+ /\w\W\w/; # matches a word char, followed by a
+ # non-word char, followed by a word char
+ /..rt/; # matches any two chars, followed by 'rt'
+ /end\./; # matches 'end.'
+ /end[.]/; # same thing, matches 'end.'
+
+Because a period is a metacharacter, it needs to be escaped to match
+as an ordinary period. Because, for example, C<\d> and C<\w> are sets
+of characters, it is incorrect to think of C<[^\d\w]> as C<[\D\W]>; in
+fact C<[^\d\w]> is the same as C<[^\w]>, which is the same as
+C<[\W]>. Think DeMorgan's laws.
+
+An anchor useful in basic regexps is the S<B<word anchor> >
+C<\b>. This matches a boundary between a word character and a non-word
+character C<\w\W> or C<\W\w>:
+
+ $x = "Housecat catenates house and cat";
+ $x =~ /cat/; # matches cat in 'housecat'
+ $x =~ /\bcat/; # matches cat in 'catenates'
+ $x =~ /cat\b/; # matches cat in 'housecat'
+ $x =~ /\bcat\b/; # matches 'cat' at end of string
+
+Note in the last example, the end of the string is considered a word
+boundary.
+
+You might wonder why C<'.'> matches everything but C<"\n"> - why not
+every character? The reason is that often one is matching against
+lines and would like to ignore the newline characters. For instance,
+while the string C<"\n"> represents one line, we would like to think
+of as empty. Then
+
+ "" =~ /^$/; # matches
+ "\n" =~ /^$/; # matches, "\n" is ignored
+
+ "" =~ /./; # doesn't match; it needs a char
+ "" =~ /^.$/; # doesn't match; it needs a char
+ "\n" =~ /^.$/; # doesn't match; it needs a char other than "\n"
+ "a" =~ /^.$/; # matches
+ "a\n" =~ /^.$/; # matches, ignores the "\n"
+
+This behavior is convenient, because we usually want to ignore
+newlines when we count and match characters in a line. Sometimes,
+however, we want to keep track of newlines. We might even want C<^>
+and C<$> to anchor at the beginning and end of lines within the
+string, rather than just the beginning and end of the string. Perl
+allows us to choose between ignoring and paying attention to newlines
+by using the C<//s> and C<//m> modifiers. C<//s> and C<//m> stand for
+single line and multi-line and they determine whether a string is to
+be treated as one continuous string, or as a set of lines. The two
+modifiers affect two aspects of how the regexp is interpreted: 1) how
+the C<'.'> character class is defined, and 2) where the anchors C<^>
+and C<$> are able to match. Here are the four possible combinations:
+
+=over 4
+
+=item *
+
+no modifiers (//): Default behavior. C<'.'> matches any character
+except C<"\n">. C<^> matches only at the beginning of the string and
+C<$> matches only at the end or before a newline at the end.
+
+=item *
+
+s modifier (//s): Treat string as a single long line. C<'.'> matches
+any character, even C<"\n">. C<^> matches only at the beginning of
+the string and C<$> matches only at the end or before a newline at the
+end.
+
+=item *
+
+m modifier (//m): Treat string as a set of multiple lines. C<'.'>
+matches any character except C<"\n">. C<^> and C<$> are able to match
+at the start or end of I<any> line within the string.
+
+=item *
+
+both s and m modifiers (//sm): Treat string as a single long line, but
+detect multiple lines. C<'.'> matches any character, even
+C<"\n">. C<^> and C<$>, however, are able to match at the start or end
+of I<any> line within the string.
+
+=back
+
+Here are examples of C<//s> and C<//m> in action:
+
+ $x = "There once was a girl\nWho programmed in Perl\n";
+
+ $x =~ /^Who/; # doesn't match, "Who" not at start of string
+ $x =~ /^Who/s; # doesn't match, "Who" not at start of string
+ $x =~ /^Who/m; # matches, "Who" at start of second line
+ $x =~ /^Who/sm; # matches, "Who" at start of second line
+
+ $x =~ /girl.Who/; # doesn't match, "." doesn't match "\n"
+ $x =~ /girl.Who/s; # matches, "." matches "\n"
+ $x =~ /girl.Who/m; # doesn't match, "." doesn't match "\n"
+ $x =~ /girl.Who/sm; # matches, "." matches "\n"
+
+Most of the time, the default behavior is what is want, but C<//s> and
+C<//m> are occasionally very useful. If C<//m> is being used, the start
+of the string can still be matched with C<\A> and the end of string
+can still be matched with the anchors C<\Z> (matches both the end and
+the newline before, like C<$>), and C<\z> (matches only the end):
+
+ $x =~ /^Who/m; # matches, "Who" at start of second line
+ $x =~ /\AWho/m; # doesn't match, "Who" is not at start of string
+
+ $x =~ /girl$/m; # matches, "girl" at end of first line
+ $x =~ /girl\Z/m; # doesn't match, "girl" is not at end of string
+
+ $x =~ /Perl\Z/m; # matches, "Perl" is at newline before end
+ $x =~ /Perl\z/m; # doesn't match, "Perl" is not at end of string
+
+We now know how to create choices among classes of characters in a
+regexp. What about choices among words or character strings? Such
+choices are described in the next section.
+
+=head2 Matching this or that
+
+Sometimes we would like to our regexp to be able to match different
+possible words or character strings. This is accomplished by using
+the B<alternation> metacharacter C<|>. To match C<dog> or C<cat>, we
+form the regexp C<dog|cat>. As before, perl will try to match the
+regexp at the earliest possible point in the string. At each
+character position, perl will first try to match the first
+alternative, C<dog>. If C<dog> doesn't match, perl will then try the
+next alternative, C<cat>. If C<cat> doesn't match either, then the
+match fails and perl moves to the next position in the string. Some
+examples:
+
+ "cats and dogs" =~ /cat|dog|bird/; # matches "cat"
+ "cats and dogs" =~ /dog|cat|bird/; # matches "cat"
+
+Even though C<dog> is the first alternative in the second regexp,
+C<cat> is able to match earlier in the string.
+
+ "cats" =~ /c|ca|cat|cats/; # matches "c"
+ "cats" =~ /cats|cat|ca|c/; # matches "cats"
+
+Here, all the alternatives match at the first string position, so the
+first alternative is the one that matches. If some of the
+alternatives are truncations of the others, put the longest ones first
+to give them a chance to match.
+
+ "cab" =~ /a|b|c/ # matches "c"
+ # /a|b|c/ == /[abc]/
+
+The last example points out that character classes are like
+alternations of characters. At a given character position, the first
+alternative that allows the regexp match to succeed wil be the one
+that matches.
+
+=head2 Grouping things and hierarchical matching
+
+Alternation allows a regexp to choose among alternatives, but by
+itself it unsatisfying. The reason is that each alternative is a whole
+regexp, but sometime we want alternatives for just part of a
+regexp. For instance, suppose we want to search for housecats or
+housekeepers. The regexp C<housecat|housekeeper> fits the bill, but is
+inefficient because we had to type C<house> twice. It would be nice to
+have parts of the regexp be constant, like C<house>, and and some
+parts have alternatives, like C<cat|keeper>.
+
+The B<grouping> metacharacters C<()> solve this problem. Grouping
+allows parts of a regexp to be treated as a single unit. Parts of a
+regexp are grouped by enclosing them in parentheses. Thus we could solve
+the C<housecat|housekeeper> by forming the regexp as
+C<house(cat|keeper)>. The regexp C<house(cat|keeper)> means match
+C<house> followed by either C<cat> or C<keeper>. Some more examples
+are
+
+ /(a|b)b/; # matches 'ab' or 'bb'
+ /(ac|b)b/; # matches 'acb' or 'bb'
+ /(^a|b)c/; # matches 'ac' at start of string or 'bc' anywhere
+ /(a|[bc])d/; # matches 'ad', 'bd', or 'cd'
+
+ /house(cat|)/; # matches either 'housecat' or 'house'
+ /house(cat(s|)|)/; # matches either 'housecats' or 'housecat' or
+ # 'house'. Note groups can be nested.
+
+ /(19|20|)\d\d/; # match years 19xx, 20xx, or the Y2K problem, xx
+ "20" =~ /(19|20|)\d\d/; # matches the null alternative '()\d\d',
+ # because '20\d\d' can't match
+
+Alternations behave the same way in groups as out of them: at a given
+string position, the leftmost alternative that allows the regexp to
+match is taken. So in the last example at tth first string position,
+C<"20"> matches the second alternative, but there is nothing left over
+to match the next two digits C<\d\d>. So perl moves on to the next
+alternative, which is the null alternative and that works, since
+C<"20"> is two digits.
+
+The process of trying one alternative, seeing if it matches, and
+moving on to the next alternative if it doesn't, is called
+B<backtracking>. The term 'backtracking' comes from the idea that
+matching a regexp is like a walk in the woods. Successfully matching
+a regexp is like arriving at a destination. There are many possible
+trailheads, one for each string position, and each one is tried in
+order, left to right. From each trailhead there may be many paths,
+some of which get you there, and some which are dead ends. When you
+walk along a trail and hit a dead end, you have to backtrack along the
+trail to an earlier point to try another trail. If you hit your
+destination, you stop immediately and forget about trying all the
+other trails. You are persistent, and only if you have tried all the
+trails from all the trailheads and not arrived at your destination, do
+you declare failure. To be concrete, here is a step-by-step analysis
+of what perl does when it tries to match the regexp
+
+ "abcde" =~ /(abd|abc)(df|d|de)/;
+
+=over 4
+
+=item 0
+
+Start with the first letter in the string 'a'.
+
+=item 1
+
+Try the first alternative in the first group 'abd'.
+
+=item 2
+
+Match 'a' followed by 'b'. So far so good.
+
+=item 3
+
+'d' in the regexp doesn't match 'c' in the string - a dead
+end. So backtrack two characters and pick the second alternative in
+the first group 'abc'.
+
+=item 4
+
+Match 'a' followed by 'b' followed by 'c'. We are on a roll
+and have satisfied the first group. Set $1 to 'abc'.
+
+=item 5
+
+Move on to the second group and pick the first alternative
+'df'.
+
+=item 6
+
+Match the 'd'.
+
+=item 7
+
+'f' in the regexp doesn't match 'e' in the string, so a dead
+end. Backtrack one character and pick the second alternative in the
+second group 'd'.
+
+=item 8
+
+'d' matches. The second grouping is satisfied, so set $2 to
+'d'.
+
+=item 9
+
+We are at the end of the regexp, so we are done! We have
+matched 'abcd' out of the string "abcde".
+
+=back
+
+There are a couple of things to note about this analysis. First, the
+third alternative in the second group 'de' also allows a match, but we
+stopped before we got to it - at a given character position, leftmost
+wins. Second, we were able to get a match at the first character
+position of the string 'a'. If there were no matches at the first
+position, perl would move to the second character position 'b' and
+attempt the match all over again. Only when all possible paths at all
+possible character positions have been exhausted does perl give give
+up and declare S<C<$string =~ /(abd|abc)(df|d|de)/;> > to be false.
+
+Even with all this work, regexp matching happens remarkably fast. To
+speed things up, during compilation stage, perl compiles the regexp
+into a compact sequence of opcodes that can often fit inside a
+processor cache. When the code is executed, these opcodes can then run
+at full throttle and search very quickly.
+
+=head2 Extracting matches
+
+The grouping metacharacters C<()> also serve another completely
+different function: they allow the extraction of the parts of a string
+that matched. This is very useful to find out what matched and for
+text processing in general. For each grouping, the part that matched
+inside goes into the special variables C<$1>, C<$2>, etc. They can be
+used just as ordinary variables:
+
+ # extract hours, minutes, seconds
+ $time =~ /(\d\d):(\d\d):(\d\d)/; # match hh:mm:ss format
+ $hours = $1;
+ $minutes = $2;
+ $seconds = $3;
+
+Now, we know that in scalar context,
+S<C<$time =~ /(\d\d):(\d\d):(\d\d)/> > returns a true or false
+value. In list context, however, it returns the list of matched values
+C<($1,$2,$3)>. So we could write the code more compactly as
+
+ # extract hours, minutes, seconds
+ ($hours, $minutes, $second) = ($time =~ /(\d\d):(\d\d):(\d\d)/);
+
+If the groupings in a regexp are nested, C<$1> gets the group with the
+leftmost opening parenthesis, C<$2> the next opening parenthesis,
+etc. For example, here is a complex regexp and the matching variables
+indicated below it:
+
+ /(ab(cd|ef)((gi)|j))/;
+ 1 2 34
+
+so that if the regexp matched, e.g., C<$2> would contain 'cd' or 'ef'.
+For convenience, perl sets C<$+> to the highest numbered C<$1>, C<$2>,
+... that got assigned.
+
+Closely associated with the matching variables C<$1>, C<$2>, ... are
+the B<backreferences> C<\1>, C<\2>, ... . Backreferences are simply
+matching variables that can be used I<inside> a regexp. This is a
+really nice feature - what matches later in a regexp can depend on
+what matched earlier in the regexp. Suppose we wanted to look
+for doubled words in text, like 'the the'. The following regexp finds
+all 3-letter doubles with a space in between:
+
+ /(\w\w\w)\s\1/;
+
+The grouping assigns a value to \1, so that the same 3 letter sequence
+is used for both parts. Here are some words with repeated parts:
+
+ % simple_grep '^(\w\w\w\w|\w\w\w|\w\w|\w)\1$' /usr/dict/words
+ beriberi
+ booboo
+ coco
+ mama
+ murmur
+ papa
+
+The regexp has a single grouping which considers 4-letter
+combinations, then 3-letter combinations, etc. and uses C<\1> to look for
+a repeat. Although C<$1> and C<\1> represent the same thing, care should be
+taken to use matched variables C<$1>, C<$2>, ... only outside a regexp
+and backreferences C<\1>, C<\2>, ... only inside a regexp; not doing
+so may lead to surprising and/or undefined results.
+
+In addition to what was matched, Perl 5.6.0 also provides the
+positions of what was matched with the C<@-> and C<@+>
+arrays. C<$-[0]> is the position of the start of the entire match and
+C<$+[0]> is the position of the end. Similarly, C<$-[n]> is the
+position of the start of the C<$n> match and C<$+[n]> is the position
+of the end. If C<$n> is undefined, so are C<$-[n]> and C<$+[n]>. Then
+this code
+
+ $x = "Mmm...donut, thought Homer";
+ $x =~ /^(Mmm|Yech)\.\.\.(donut|peas)/; # matches
+ foreach $expr (1..$#-) {
+ print "Match $expr: '${$expr}' at position ($-[$expr],$+[$expr])\n";
+ }
+
+prints
+
+ Match 1: 'Mmm' at position (0,3)
+ Match 2: 'donut' at position (6,11)
+
+Even if there are no groupings in a regexp, it is still possible to
+find out what exactly matched in a string. If you use them, perl
+will set C<$`> to the part of the string before the match, will set C<$&>
+to the part of the string that matched, and will set C<$'> to the part
+of the string after the match. An example:
+
+ $x = "the cat caught the mouse";
+ $x =~ /cat/; # $` = 'the ', $& = 'cat', $' = ' caught the mouse'
+ $x =~ /the/; # $` = '', $& = 'the', $' = ' cat caught the mouse'
+
+In the second match, S<C<$` = ''> > because the regexp matched at the
+first character position in the string and stopped, it never saw the
+second 'the'. It is important to note that using C<$`> and C<$'>
+slows down regexp matching quite a bit, and C< $& > slows it down to a
+lesser extent, because if they are used in one regexp in a program,
+they are generated for <all> regexps in the program. So if raw
+performance is a goal of your application, they should be avoided.
+If you need them, use C<@-> and C<@+> instead:
+
+ $` is the same as substr( $x, 0, $-[0] )
+ $& is the same as substr( $x, $-[0], $+[0]-$-[0] )
+ $' is the same as substr( $x, $+[0] )
+
+=head2 Matching repetitions
+
+The examples in the previous section display an annoying weakness. We
+were only matching 3-letter words, or syllables of 4 letters or
+less. We'd like to be able to match words or syllables of any length,
+without writing out tedious alternatives like
+C<\w\w\w\w|\w\w\w|\w\w|\w>.
+
+This is exactly the problem the B<quantifier> metacharacters C<?>,
+C<*>, C<+>, and C<{}> were created for. They allow us to determine the
+number of repeats of a portion of a regexp we consider to be a
+match. Quantifiers are put immediately after the character, character
+class, or grouping that we want to specify. They have the following
+meanings:
+
+=over 4
+
+=item *
+
+C<a?> = match 'a' 1 or 0 times
+
+=item *
+
+C<a*> = match 'a' 0 or more times, i.e., any number of times
+
+=item *
+
+C<a+> = match 'a' 1 or more times, i.e., at least once
+
+=item *
+
+C<a{n,m}> = match at least C<n> times, but not more than C<m>
+times.
+
+=item *
+
+C<a{n,}> = match at least C<n> or more times
+
+=item *
+
+C<a{n}> = match exactly C<n> times
+
+=back
+
+Here are some examples:
+
+ /[a-z]+\s+\d*/; # match a lowercase word, at least some space, and
+ # any number of digits
+ /(\w+)\s+\1/; # match doubled words of arbitrary length
+ /y(es)?/i; # matches 'y', 'Y', or a case-insensitive 'yes'
+ $year =~ /\d{2,4}/; # make sure year is at least 2 but not more
+ # than 4 digits
+ $year =~ /\d{4}|\d{2}/; # better match; throw out 3 digit dates
+ $year =~ /\d{2}(\d{2})?/; # same thing written differently. However,
+ # this produces $1 and the other does not.
+
+ % simple_grep '^(\w+)\1$' /usr/dict/words # isn't this easier?
+ beriberi
+ booboo
+ coco
+ mama
+ murmur
+ papa
+
+For all of these quantifiers, perl will try to match as much of the
+string as possible, while still allowing the regexp to succeed. Thus
+with C</a?.../>, perl will first try to match the regexp with the C<a>
+present; if that fails, perl will try to match the regexp without the
+C<a> present. For the quantifier C<*>, we get the following:
+
+ $x = "the cat in the hat";
+ $x =~ /^(.*)(cat)(.*)$/; # matches,
+ # $1 = 'the '
+ # $2 = 'cat'
+ # $3 = ' in the hat'
+
+Which is what we might expect, the match finds the only C<cat> in the
+string and locks onto it. Consider, however, this regexp:
+
+ $x =~ /^(.*)(at)(.*)$/; # matches,
+ # $1 = 'the cat in the h'
+ # $2 = 'at'
+ # $3 = '' (0 matches)
+
+One might initially guess that perl would find the C<at> in C<cat> and
+stop there, but that wouldn't give the longest possible string to the
+first quantifier C<.*>. Instead, the first quantifier C<.*> grabs as
+much of the string as possible while still having the regexp match. In
+this example, that means having the C<at> sequence with the final C<at>
+in the string. The other important principle illustrated here is that
+when there are two or more elements in a regexp, the I<leftmost>
+quantifier, if there is one, gets to grab as much the string as
+possible, leaving the rest of the regexp to fight over scraps. Thus in
+our example, the first quantifier C<.*> grabs most of the string, while
+the second quantifier C<.*> gets the empty string. Quantifiers that
+grab as much of the string as possible are called B<maximal match> or
+B<greedy> quantifiers.
+
+When a regexp can match a string in several different ways, we can use
+the principles above to predict which way the regexp will match:
+
+=over 4
+
+=item *
+
+Principle 0: Taken as a whole, any regexp will be matched at the
+earliest possible position in the string.
+
+=item *
+
+Principle 1: In an alternation C<a|b|c...>, the leftmost alternative
+that allows a match for the whole regexp will be the one used.
+
+=item *
+
+Principle 2: The maximal matching quantifiers C<?>, C<*>, C<+> and
+C<{n,m}> will in general match as much of the string as possible while
+still allowing the whole regexp to match.
+
+=item *
+
+Principle 3: If there are two or more elements in a regexp, the
+leftmost greedy quantifier, if any, will match as much of the string
+as possible while still allowing the whole regexp to match. The next
+leftmost greedy quantifier, if any, will try to match as much of the
+string remaining available to it as possible, while still allowing the
+whole regexp to match. And so on, until all the regexp elements are
+satisfied.
+
+=back
+
+As we have seen above, Principle 0 overrides the others - the regexp
+will be matched as early as possible, with the other principles
+determining how the regexp matches at that earliest character
+position.
+
+Here is an example of these principles in action:
+
+ $x = "The programming republic of Perl";
+ $x =~ /^(.+)(e|r)(.*)$/; # matches,
+ # $1 = 'The programming republic of Pe'
+ # $2 = 'r'
+ # $3 = 'l'
+
+This regexp matches at the earliest string position, C<'T'>. One
+might think that C<e>, being leftmost in the alternation, would be
+matched, but C<r> produces the longest string in the first quantifier.
+
+ $x =~ /(m{1,2})(.*)$/; # matches,
+ # $1 = 'mm'
+ # $2 = 'ing republic of Perl'
+
+Here, The earliest possible match is at the first C<'m'> in
+C<programming>. C<m{1,2}> is the first quantifier, so it gets to match
+a maximal C<mm>.
+
+ $x =~ /.*(m{1,2})(.*)$/; # matches,
+ # $1 = 'm'
+ # $2 = 'ing republic of Perl'
+
+Here, the regexp matches at the start of the string. The first
+quantifier C<.*> grabs as much as possible, leaving just a single
+C<'m'> for the second quantifier C<m{1,2}>.
+
+ $x =~ /(.?)(m{1,2})(.*)$/; # matches,
+ # $1 = 'a'
+ # $2 = 'mm'
+ # $3 = 'ing republic of Perl'
+
+Here, C<.?> eats its maximal one character at the earliest possible
+position in the string, C<'a'> in C<programming>, leaving C<m{1,2}>
+the opportunity to match both C<m>'s. Finally,
+
+ "aXXXb" =~ /(X*)/; # matches with $1 = ''
+
+because it can match zero copies of C<'X'> at the beginning of the
+string. If you definitely want to match at least one C<'X'>, use
+C<X+>, not C<X*>.
+
+Sometimes greed is not good. At times, we would like quantifiers to
+match a I<minimal> piece of string, rather than a maximal piece. For
+this purpose, Larry Wall created the S<B<minimal match> > or
+B<non-greedy> quantifiers C<??>,C<*?>, C<+?>, and C<{}?>. These are
+the usual quantifiers with a C<?> appended to them. They have the
+following meanings:
+
+=over 4
+
+=item *
+
+C<a??> = match 'a' 0 or 1 times. Try 0 first, then 1.
+
+=item *
+
+C<a*?> = match 'a' 0 or more times, i.e., any number of times,
+but as few times as possible
+
+=item *
+
+C<a+?> = match 'a' 1 or more times, i.e., at least once, but
+as few times as possible
+
+=item *
+
+C<a{n,m}?> = match at least C<n> times, not more than C<m>
+times, as few times as possible
+
+=item *
+
+C<a{n,}?> = match at least C<n> times, but as few times as
+possible
+
+=item *
+
+C<a{n}?> = match exactly C<n> times. Because we match exactly
+C<n> times, C<a{n}?> is equivalent to C<a{n}> and is just there for
+notational consistency.
+
+=back
+
+Let's look at the example above, but with minimal quantifiers:
+
+ $x = "The programming republic of Perl";
+ $x =~ /^(.+?)(e|r)(.*)$/; # matches,
+ # $1 = 'Th'
+ # $2 = 'e'
+ # $3 = ' programming republic of Perl'
+
+The minimal string that will allow both the start of the string C<^>
+and the alternation to match is C<Th>, with the alternation C<e|r>
+matching C<e>. The second quantifier C<.*> is free to gobble up the
+rest of the string.
+
+ $x =~ /(m{1,2}?)(.*?)$/; # matches,
+ # $1 = 'm'
+ # $2 = 'ming republic of Perl'
+
+The first string position that this regexp can match is at the first
+C<'m'> in C<programming>. At this position, the minimal C<m{1,2}?>
+matches just one C<'m'>. Although the second quantifier C<.*?> would
+prefer to match no characters, it is constrained by the end-of-string
+anchor C<$> to match the rest of the string.
+
+ $x =~ /(.*?)(m{1,2}?)(.*)$/; # matches,
+ # $1 = 'The progra'
+ # $2 = 'm'
+ # $3 = 'ming republic of Perl'
+
+In this regexp, you might expect the first minimal quantifier C<.*?>
+to match the empty string, because it is not constrained by a C<^>
+anchor to match the beginning of the word. Principle 0 applies here,
+however. Because it is possible for the whole regexp to match at the
+start of the string, it I<will> match at the start of the string. Thus
+the first quantifier has to match everything up to the first C<m>. The
+second minimal quantifier matches just one C<m> and the third
+quantifier matches the rest of the string.
+
+ $x =~ /(.??)(m{1,2})(.*)$/; # matches,
+ # $1 = 'a'
+ # $2 = 'mm'
+ # $3 = 'ing republic of Perl'
+
+Just as in the previous regexp, the first quantifier C<.??> can match
+earliest at position C<'a'>, so it does. The second quantifier is
+greedy, so it matches C<mm>, and the third matches the rest of the
+string.
+
+We can modify principle 3 above to take into account non-greedy
+quantifiers:
+
+=over 4
+
+=item *
+
+Principle 3: If there are two or more elements in a regexp, the
+leftmost greedy (non-greedy) quantifier, if any, will match as much
+(little) of the string as possible while still allowing the whole
+regexp to match. The next leftmost greedy (non-greedy) quantifier, if
+any, will try to match as much (little) of the string remaining
+available to it as possible, while still allowing the whole regexp to
+match. And so on, until all the regexp elements are satisfied.
+
+=back
+
+Just like alternation, quantifiers are also susceptible to
+backtracking. Here is a step-by-step analysis of the example
+
+ $x = "the cat in the hat";
+ $x =~ /^(.*)(at)(.*)$/; # matches,
+ # $1 = 'the cat in the h'
+ # $2 = 'at'
+ # $3 = '' (0 matches)
+
+=over 4
+
+=item 0
+
+Start with the first letter in the string 't'.
+
+=item 1
+
+The first quantifier '.*' starts out by matching the whole
+string 'the cat in the hat'.
+
+=item 2
+
+'a' in the regexp element 'at' doesn't match the end of the
+string. Backtrack one character.
+
+=item 3
+
+'a' in the regexp element 'at' still doesn't match the last
+letter of the string 't', so backtrack one more character.
+
+=item 4
+
+Now we can match the 'a' and the 't'.
+
+=item 5
+
+Move on to the third element '.*'. Since we are at the end of
+the string and '.*' can match 0 times, assign it the empty string.
+
+=item 6
+
+We are done!
+
+=back
+
+Most of the time, all this moving forward and backtracking happens
+quickly and searching is fast. There are some pathological regexps,
+however, whose execution time exponentially grows with the size of the
+string. A typical structure that blows up in your face is of the form
+
+ /(a|b+)*/;
+
+The problem is the nested indeterminate quantifiers. There are many
+different ways of partitioning a string of length n between the C<+>
+and C<*>: one repetition with C<b+> of length n, two repetitions with
+the first C<b+> length k and the second with length n-k, m repetitions
+whose bits add up to length n, etc. In fact there are an exponential
+number of ways to partition a string as a function of length. A
+regexp may get lucky and match early in the process, but if there is
+no match, perl will try I<every> possibility before giving up. So be
+careful with nested C<*>'s, C<{n,m}>'s, and C<+>'s. The book
+I<Mastering regular expressions> by Jeffrey Friedl gives a wonderful
+discussion of this and other efficiency issues.
+
+=head2 Building a regexp
+
+At this point, we have all the basic regexp concepts covered, so let's
+give a more involved example of a regular expression. We will build a
+regexp that matches numbers.
+
+The first task in building a regexp is to decide what we want to match
+and what we want to exclude. In our case, we want to match both
+integers and floating point numbers and we want to reject any string
+that isn't a number.
+
+The next task is to break the problem down into smaller problems that
+are easily converted into a regexp.
+
+The simplest case is integers. These consist of a sequence of digits,
+with an optional sign in front. The digits we can represent with
+C<\d+> and the sign can be matched with C<[+-]>. Thus the integer
+regexp is
+
+ /[+-]?\d+/; # matches integers
+
+A floating point number potentially has a sign, an integral part, a
+decimal point, a fractional part, and an exponent. One or more of these
+parts is optional, so we need to check out the different
+possibilities. Floating point numbers which are in proper form include
+123., 0.345, .34, -1e6, and 25.4E-72. As with integers, the sign out
+front is completely optional and can be matched by C<[+-]?>. We can
+see that if there is no exponent, floating point numbers must have a
+decimal point, otherwise they are integers. We might be tempted to
+model these with C<\d*\.\d*>, but this would also match just a single
+decimal point, which is not a number. So the three cases of floating
+point number sans exponent are
+
+ /[+-]?\d+\./; # 1., 321., etc.
+ /[+-]?\.\d+/; # .1, .234, etc.
+ /[+-]?\d+\.\d+/; # 1.0, 30.56, etc.
+
+These can be combined into a single regexp with a three-way alternation:
+
+ /[+-]?(\d+\.\d+|\d+\.|\.\d+)/; # floating point, no exponent
+
+In this alternation, it is important to put C<'\d+\.\d+'> before
+C<'\d+\.'>. If C<'\d+\.'> were first, the regexp would happily match that
+and ignore the fractional part of the number.
+
+Now consider floating point numbers with exponents. The key
+observation here is that I<both> integers and numbers with decimal
+points are allowed in front of an exponent. Then exponents, like the
+overall sign, are independent of whether we are matching numbers with
+or without decimal points, and can be 'decoupled' from the
+mantissa. The overall form of the regexp now becomes clear:
+
+ /^(optional sign)(integer | f.p. mantissa)(optional exponent)$/;
+
+The exponent is an C<e> or C<E>, followed by an integer. So the
+exponent regexp is
+
+ /[eE][+-]?\d+/; # exponent
+
+Putting all the parts together, we get a regexp that matches numbers:
+
+ /^[+-]?(\d+\.\d+|\d+\.|\.\d+|\d+)([eE][+-]?\d+)?$/; # Ta da!
+
+Long regexps like this may impress your friends, but can be hard to
+decipher. In complex situations like this, the C<//x> modifier for a
+match is invaluable. It allows one to put nearly arbitrary whitespace
+and comments into a regexp without affecting their meaning. Using it,
+we can rewrite our 'extended' regexp in the more pleasing form
+
+ /^
+ [+-]? # first, match an optional sign
+ ( # then match integers or f.p. mantissas:
+ \d+\.\d+ # mantissa of the form a.b
+ |\d+\. # mantissa of the form a.
+ |\.\d+ # mantissa of the form .b
+ |\d+ # integer of the form a
+ )
+ ([eE][+-]?\d+)? # finally, optionally match an exponent
+ $/x;
+
+If whitespace is mostly irrelevant, how does one include space
+characters in an extended regexp? The answer is to backslash it
+S<C<'\ '> > or put it in a character class S<C<[ ]> >. The same thing
+goes for pound signs, use C<\#> or C<[#]>. For instance, Perl allows
+a space between the sign and the mantissa/integer, and we could add
+this to our regexp as follows:
+
+ /^
+ [+-]?\ * # first, match an optional sign *and space*
+ ( # then match integers or f.p. mantissas:
+ \d+\.\d+ # mantissa of the form a.b
+ |\d+\. # mantissa of the form a.
+ |\.\d+ # mantissa of the form .b
+ |\d+ # integer of the form a
+ )
+ ([eE][+-]?\d+)? # finally, optionally match an exponent
+ $/x;
+
+In this form, it is easier to see a way to simplify the
+alternation. Alternatives 1, 2, and 4 all start with C<\d+>, so it
+could be factored out:
+
+ /^
+ [+-]?\ * # first, match an optional sign
+ ( # then match integers or f.p. mantissas:
+ \d+ # start out with a ...
+ (
+ \.\d* # mantissa of the form a.b or a.
+ )? # ? takes care of integers of the form a
+ |\.\d+ # mantissa of the form .b
+ )
+ ([eE][+-]?\d+)? # finally, optionally match an exponent
+ $/x;
+
+or written in the compact form,
+
+ /^[+-]?\ *(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?$/;
+
+This is our final regexp. To recap, we built a regexp by
+
+=over 4
+
+=item *
+
+specifying the task in detail,
+
+=item *
+
+breaking down the problem into smaller parts,
+
+=item *
+
+translating the small parts into regexps,
+
+=item *
+
+combining the regexps,
+
+=item *
+
+and optimizing the final combined regexp.
+
+=back
+
+These are also the typical steps involved in writing a computer
+program. This makes perfect sense, because regular expressions are
+essentially programs written a little computer language that specifies
+patterns.
+
+=head2 Using regular expressions in Perl
+
+The last topic of Part 1 briefly covers how regexps are used in Perl
+programs. Where do they fit into Perl syntax?
+
+We have already introduced the matching operator in its default
+C</regexp/> and arbitrary delimiter C<m!regexp!> forms. We have used
+the binding operator C<=~> and its negation C<!~> to test for string
+matches. Associated with the matching operator, we have discussed the
+single line C<//s>, multi-line C<//m>, case-insensitive C<//i> and
+extended C<//x> modifiers.
+
+There are a few more things you might want to know about matching
+operators. First, we pointed out earlier that variables in regexps are
+substituted before the regexp is evaluated:
+
+ $pattern = 'Seuss';
+ while (<>) {
+ print if /$pattern/;
+ }
+
+This will print any lines containing the word C<Seuss>. It is not as
+efficient as it could be, however, because perl has to re-evaluate
+C<$pattern> each time through the loop. If C<$pattern> won't be
+changing over the lifetime of the script, we can add the C<//o>
+modifier, which directs perl to only perform variable substitutions
+once:
+
+ #!/usr/bin/perl
+ # Improved simple_grep
+ $regexp = shift;
+ while (<>) {
+ print if /$regexp/o; # a good deal faster
+ }
+
+If you change C<$pattern> after the first substitution happens, perl
+will ignore it. If you don't want any substitutions at all, use the
+special delimiter C<m''>:
+
+ $pattern = 'Seuss';
+ while (<>) {
+ print if m'$pattern'; # matches '$pattern', not 'Seuss'
+ }
+
+C<m''> acts like single quotes on a regexp; all other C<m> delimiters
+act like double quotes. If the regexp evaluates to the empty string,
+the regexp in the I<last successful match> is used instead. So we have
+
+ "dog" =~ /d/; # 'd' matches
+ "dogbert =~ //; # this matches the 'd' regexp used before
+
+The final two modifiers C<//g> and C<//c> concern multiple matches.
+The modifier C<//g> stands for global matching and allows the the
+matching operator to match within a string as many times as possible.
+In scalar context, successive invocations against a string will have
+`C<//g> jump from match to match, keeping track of position in the
+string as it goes along. You can get or set the position with the
+C<pos()> function.
+
+The use of C<//g> is shown in the following example. Suppose we have
+a string that consists of words separated by spaces. If we know how
+many words there are in advance, we could extract the words using
+groupings:
+
+ $x = "cat dog house"; # 3 words
+ $x =~ /^\s*(\w+)\s+(\w+)\s+(\w+)\s*$/; # matches,
+ # $1 = 'cat'
+ # $2 = 'dog'
+ # $3 = 'house'
+
+But what if we had an indeterminate number of words? This is the sort
+of task C<//g> was made for. To extract all words, form the simple
+regexp C<(\w+)> and loop over all matches with C</(\w+)/g>:
+
+ while ($x =~ /(\w+)/g) {
+ print "Word is $1, ends at position ", pos $x, "\n";
+ }
+
+prints
+
+ Word is cat, ends at position 3
+ Word is dog, ends at position 7
+ Word is house, ends at position 13
+
+A failed match or changing the target string resets the position. If
+you don't want the position reset after failure to match, add the
+C<//c>, as in C</regexp/gc>. The current position in the string is
+associated with the string, not the regexp. This means that different
+strings have different positions and their respective positions can be
+set or read independently.
+
+In list context, C<//g> returns a list of matched groupings, or if
+there are no groupings, a list of matches to the whole regexp. So if
+we wanted just the words, we could use
+
+ @words = ($x =~ /(\w+)/g); # matches,
+ # $word[0] = 'cat'
+ # $word[1] = 'dog'
+ # $word[2] = 'house'
+
+Closely associated with the C<//g> modifier is the C<\G> anchor. The
+C<\G> anchor matches at the point where the previous C<//g> match left
+off. C<\G> allows us to easily do context-sensitive matching:
+
+ $metric = 1; # use metric units
+ ...
+ $x = <FILE>; # read in measurement
+ $x =~ /^([+-]?\d+)\s*/g; # get magnitude
+ $weight = $1;
+ if ($metric) { # error checking
+ print "Units error!" unless $x =~ /\Gkg\./g;
+ }
+ else {
+ print "Units error!" unless $x =~ /\Glbs\./g;
+ }
+ $x =~ /\G\s+(widget|sprocket)/g; # continue processing
+
+The combination of C<//g> and C<\G> allows us to process the string a
+bit at a time and use arbitrary Perl logic to decide what to do next.
+
+C<\G> is also invaluable in processing fixed length records with
+regexps. Suppose we have a snippet of coding region DNA, encoded as
+base pair letters C<ATCGTTGAAT...> and we want to find all the stop
+codons C<TGA>. In a coding region, codons are 3-letter sequences, so
+we can think of the DNA snippet as a sequence of 3-letter records. The
+naive regexp
+
+ # expanded, this is "ATC GTT GAA TGC AAA TGA CAT GAC"
+ $dna = "ATCGTTGAATGCAAATGACATGAC";
+ $dna =~ /TGA/;
+
+doesn't work; it may match an C<TGA>, but there is no guarantee that
+the match is aligned with codon boundaries, e.g., the substring
+S<C<GTT GAA> > gives a match. A better solution is
+
+ while ($dna =~ /(\w\w\w)*?TGA/g) { # note the minimal *?
+ print "Got a TGA stop codon at position ", pos $dna, "\n";
+ }
+
+which prints
+
+ Got a TGA stop codon at position 18
+ Got a TGA stop codon at position 23
+
+Position 18 is good, but position 23 is bogus. What happened?
+
+The answer is that our regexp works well until we get past the last
+real match. Then the regexp will fail to match a synchronized C<TGA>
+and start stepping ahead one character position at a time, not what we
+want. The solution is to use C<\G> to anchor the match to the codon
+alignment:
+
+ while ($dna =~ /\G(\w\w\w)*?TGA/g) {
+ print "Got a TGA stop codon at position ", pos $dna, "\n";
+ }
+
+This prints
+
+ Got a TGA stop codon at position 18
+
+which is the correct answer. This example illustrates that it is
+important not only to match what is desired, but to reject what is not
+desired.
+
+B<search and replace>
+
+Regular expressions also play a big role in B<search and replace>
+operations in Perl. Search and replace is accomplished with the
+C<s///> operator. The general form is
+C<s/regexp/replacement/modifiers>, with everything we know about
+regexps and modifiers applying in this case as well. The
+C<replacement> is a Perl double quoted string that replaces in the
+string whatever is matched with the C<regexp>. The operator C<=~> is
+also used here to associate a string with C<s///>. If matching
+against C<$_>, the S<C<$_ =~> > can be dropped. If there is a match,
+C<s///> returns the number of substitutions made, otherwise it returns
+false. Here are a few examples:
+
+ $x = "Time to feed the cat!";
+ $x =~ s/cat/hacker/; # $x contains "Time to feed the hacker!"
+ if ($x =~ s/^(Time.*hacker)!$/$1 now!/) {
+ $more_insistent = 1;
+ }
+ $y = "'quoted words'";
+ $y =~ s/^'(.*)'$/$1/; # strip single quotes,
+ # $y contains "quoted words"
+
+In the last example, the whole string was matched, but only the part
+inside the single quotes was grouped. With the C<s///> operator, the
+matched variables C<$1>, C<$2>, etc. are immediately available for use
+in the replacement expression, so we use C<$1> to replace the quoted
+string with just what was quoted. With the global modifier, C<s///g>
+will search and replace all occurrences of the regexp in the string:
+
+ $x = "I batted 4 for 4";
+ $x =~ s/4/four/; # doesn't do it all:
+ # $x contains "I batted four for 4"
+ $x = "I batted 4 for 4";
+ $x =~ s/4/four/g; # does it all:
+ # $x contains "I batted four for four"
+
+If you prefer 'regex' over 'regexp' in this tutorial, you could use
+the following program to replace it:
+
+ % cat > simple_replace
+ #!/usr/bin/perl
+ $regexp = shift;
+ $replacement = shift;
+ while (<>) {
+ s/$regexp/$replacement/go;
+ print;
+ }
+ ^D
+
+ % simple_replace regexp regex perlretut.pod
+
+In C<simple_replace> we used the C<s///g> modifier to replace all
+occurrences of the regexp on each line and the C<s///o> modifier to
+compile the regexp only once. As with C<simple_grep>, both the
+C<print> and the C<s/$regexp/$replacement/go> use C<$_> implicitly.
+
+A modifier available specifically to search and replace is the
+C<s///e> evaluation modifier. C<s///e> wraps an C<eval{...}> around
+the replacement string and the evaluated result is substituted for the
+matched substring. C<s///e> is useful if you need to do a bit of
+computation in the process of replacing text. This example counts
+character frequencies in a line:
+
+ $x = "Bill the cat";
+ $x =~ s/(.)/$chars{$1}++;$1/eg; # final $1 replaces char with itself
+ print "frequency of '$_' is $chars{$_}\n"
+ foreach (sort {$chars{$b} <=> $chars{$a}} keys %chars);
+
+This prints
+
+ frequency of ' ' is 2
+ frequency of 't' is 2
+ frequency of 'l' is 2
+ frequency of 'B' is 1
+ frequency of 'c' is 1
+ frequency of 'e' is 1
+ frequency of 'h' is 1
+ frequency of 'i' is 1
+ frequency of 'a' is 1
+
+As with the match C<m//> operator, C<s///> can use other delimiters,
+such as C<s!!!> and C<s{}{}>, and even C<s{}//>. If single quotes are
+used C<s'''>, then the regexp and replacement are treated as single
+quoted strings and there are no substitutions. C<s///> in list context
+returns the same thing as in scalar context, i.e., the number of
+matches.
+
+B<The split operator>
+
+The B<C<split> > function can also optionally use a matching operator
+C<m//> to split a string. C<split /regexp/, string, limit> splits
+C<string> into a list of substrings and returns that list. The regexp
+is used to match the character sequence that the C<string> is split
+with respect to. The C<limit>, if present, constrains splitting into
+no more than C<limit> number of strings. For example, to split a
+string into words, use
+
+ $x = "Calvin and Hobbes";
+ @words = split /\s+/, $x; # $word[0] = 'Calvin'
+ # $word[1] = 'and'
+ # $word[2] = 'Hobbes'
+
+If the empty regexp C<//> is used, the regexp always matches and
+the string is split into individual characters. If the regexp has
+groupings, then list produced contains the matched substrings from the
+groupings as well. For instance,
+
+ $x = "/usr/bin/perl";
+ @dirs = split m!/!, $x; # $dirs[0] = ''
+ # $dirs[1] = 'usr'
+ # $dirs[2] = 'bin'
+ # $dirs[3] = 'perl'
+ @parts = split m!(/)!, $x; # $parts[0] = ''
+ # $parts[1] = '/'
+ # $parts[2] = 'usr'
+ # $parts[3] = '/'
+ # $parts[4] = 'bin'
+ # $parts[5] = '/'
+ # $parts[6] = 'perl'
+
+Since the first character of $x matched the regexp, C<split> prepended
+an empty initial element to the list.
+
+If you have read this far, congratulations! You now have all the basic
+tools needed to use regular expressions to solve a wide range of text
+processing problems. If this is your first time through the tutorial,
+why not stop here and play around with regexps a while... S<Part 2>
+concerns the more esoteric aspects of regular expressions and those
+concepts certainly aren't needed right at the start.
+
+=head1 Part 2: Power tools
+
+OK, you know the basics of regexps and you want to know more. If
+matching regular expressions is analogous to a walk in the woods, then
+the tools discussed in Part 1 are analogous to topo maps and a
+compass, basic tools we use all the time. Most of the tools in part 2
+are are analogous to flare guns and satellite phones. They aren't used
+too often on a hike, but when we are stuck, they can be invaluable.
+
+What follows are the more advanced, less used, or sometimes esoteric
+capabilities of perl regexps. In Part 2, we will assume you are
+comfortable with the basics and concentrate on the new features.
+
+=head2 More on characters, strings, and character classes
+
+There are a number of escape sequences and character classes that we
+haven't covered yet.
+
+There are several escape sequences that convert characters or strings
+between upper and lower case. C<\l> and C<\u> convert the next
+character to lower or upper case, respectively:
+
+ $x = "perl";
+ $string =~ /\u$x/; # matches 'Perl' in $string
+ $x = "M(rs?|s)\\."; # note the double backslash
+ $string =~ /\l$x/; # matches 'mr.', 'mrs.', and 'ms.',
+
+C<\L> and C<\U> converts a whole substring, delimited by C<\L> or
+C<\U> and C<\E>, to lower or upper case:
+
+ $x = "This word is in lower case:\L SHOUT\E";
+ $x =~ /shout/; # matches
+ $x = "I STILL KEYPUNCH CARDS FOR MY 360"
+ $x =~ /\Ukeypunch/; # matches punch card string
+
+If there is no C<\E>, case is converted until the end of the
+string. The regexps C<\L\u$word> or C<\u\L$word> convert the first
+character of C<$word> to uppercase and the rest of the characters to
+lowercase.
+
+Control characters can be escaped with C<\c>, so that a control-Z
+character would be matched with C<\cZ>. The escape sequence
+C<\Q>...C<\E> quotes, or protects most non-alphabetic characters. For
+instance,
+
+ $x = "\QThat !^*&%~& cat!";
+ $x =~ /\Q!^*&%~&\E/; # check for rough language
+
+It does not protect C<$> or C<@>, so that variables can still be
+substituted.
+
+With the advent of 5.6.0, perl regexps can handle more than just the
+standard ASCII character set. Perl now supports B<Unicode>, a standard
+for encoding the character sets from many of the world's written
+languages. Unicode does this by allowing characters to be more than
+one byte wide. Perl uses the UTF-8 encoding, in which ASCII characters
+are still encoded as one byte, but characters greater than C<chr(127)>
+may be stored as two or more bytes.
+
+What does this mean for regexps? Well, regexp users don't need to know
+much about perl's internal representation of strings. But they do need
+to know 1) how to represent Unicode characters in a regexp and 2) when
+a matching operation will treat the string to be searched as a
+sequence of bytes (the old way) or as a sequence of Unicode characters
+(the new way). The answer to 1) is that Unicode characters greater
+than C<chr(127)> may be represented using the C<\x{hex}> notation,
+with C<hex> a hexadecimal integer:
+
+ use utf8; # We will be doing Unicode processing
+ /\x{263a}/; # match a Unicode smiley face :)
+
+Unicode characters in the range of 128-255 use two hexadecimal digits
+with braces: C<\x{ab}>. Note that this is different than C<\xab>,
+which is just a hexadecimal byte with no Unicode
+significance.
+
+Figuring out the hexadecimal sequence of a Unicode character you want
+or deciphering someone else's hexadecimal Unicode regexp is about as
+much fun as programming in machine code. So another way to specify
+Unicode characters is to use the S<B<named character> > escape
+sequence C<\N{name}>. C<name> is a name for the Unicode character, as
+specified in the Unicode standard. For instance, if we wanted to
+represent or match the astrological sign for the planet Mercury, we
+could use
+
+ use utf8; # We will be doing Unicode processing
+ use charnames ":full"; # use named chars with Unicode full names
+ $x = "abc\N{MERCURY}def";
+ $x =~ /\N{MERCURY}/; # matches
+
+One can also use short names or restrict names to a certain alphabet:
+
+ use utf8; # We will be doing Unicode processing
+
+ 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(greek);
+ print "\N{sigma} is Greek sigma\n";
+
+A list of full names is found in the file Names.txt in the
+lib/perl5/5.6.0/unicode directory.
+
+The answer to requirement 2), as of 5.6.0, is that if a regexp
+contains Unicode characters, the string is searched as a sequence of
+Unicode characters. Otherwise, the string is searched as a sequence of
+bytes. If the string is being searched as a sequence of Unicode
+characters, but matching a single byte is required, we can use the C<\C>
+escape sequence. C<\C> is a character class akin to C<.> except that
+it matches I<any> byte 0-255. So
+
+ use utf8; # We will be doing Unicode processing
+ use charnames ":full"; # use named chars with Unicode full names
+ $x = "a";
+ $x =~ /\C/; # matches 'a', eats one byte
+ $x = "";
+ $x =~ /\C/; # doesn't match, no bytes to match
+ $x = "\N{MERCURY}"; # two-byte Unicode character
+ $x =~ /\C/; # matches, but dangerous!
+
+The last regexp matches, but is dangerous because the string
+I<character> position is no longer synchronized to the string I<byte>
+position. This generates the warning 'Malformed UTF-8
+character'. C<\C> is best used for matching the binary data in strings
+with binary data intermixed with Unicode characters.
+
+Let us now discuss the rest of the character classes. Just as with
+Unicode characters, there are named Unicode character classes
+represented by the C<\p{name}> escape sequence. Closely associated is
+the C<\P{name}> character class, which is the negation of the
+C<\p{name}> class. For example, to match lower and uppercase
+characters,
+
+ use utf8; # We will be doing Unicode processing
+ use charnames ":full"; # use named chars with Unicode full names
+ $x = "BOB";
+ $x =~ /^\p{IsUpper}/; # matches, uppercase char class
+ $x =~ /^\P{IsUpper}/; # doesn't match, char class sans uppercase
+ $x =~ /^\p{IsLower}/; # doesn't match, lowercase char class
+ $x =~ /^\P{IsLower}/; # matches, char class sans lowercase
+
+Here is the association between some Perl named classes and the
+traditional Unicode classes:
+
+ Perl class name Unicode class name or regular expression
+
+ IsAlpha /^[LM]/
+ IsAlnum /^[LMN]/
+ IsASCII $code <= 127
+ IsCntrl /^C/
+ IsBlank $code =~ /^(0020|0009)$/ || /^Z[^lp]/
+ IsDigit Nd
+ IsGraph /^([LMNPS]|Co)/
+ IsLower Ll
+ IsPrint /^([LMNPS]|Co|Zs)/
+ IsPunct /^P/
+ IsSpace /^Z/ || ($code =~ /^(0009|000A|000B|000C|000D)$/
+ IsSpacePerl /^Z/ || ($code =~ /^(0009|000A|000C|000D)$/
+ IsUpper /^L[ut]/
+ IsWord /^[LMN]/ || $code eq "005F"
+ IsXDigit $code =~ /^00(3[0-9]|[46][1-6])$/
+
+You can also use the official Unicode class names with the C<\p> and
+C<\P>, like C<\p{L}> for Unicode 'letters', or C<\p{Lu}> for uppercase
+letters, or C<\P{Nd}> for non-digits. If a C<name> is just one
+letter, the braces can be dropped. For instance, C<\pM> is the
+character class of Unicode 'marks'.
+
+C<\X> is an abbreviation for a character class sequence that includes
+the Unicode 'combining character sequences'. A 'combining character
+sequence' is a base character followed by any number of combining
+characters. An example of a combining character is an accent. Using
+the Unicode full names, e.g., S<C<A + COMBINING RING> > is a combining
+character sequence with base character C<A> and combining character
+S<C<COMBINING RING> >, which translates in Danish to A with the circle
+atop it, as in the word Angstrom. C<\X> is equivalent to C<\PM\pM*}>,
+i.e., a non-mark followed by one or more marks.
+
+As if all those classes weren't enough, Perl also defines POSIX style
+character classes. These have the form C<[:name:]>, with C<name> the
+name of the POSIX class. The POSIX classes are C<alpha>, C<alnum>,
+C<ascii>, C<cntrl>, C<digit>, C<graph>, C<lower>, C<print>, C<punct>,
+C<space>, C<upper>, and C<xdigit>, and two extensions, C<word> (a Perl
+extension to match C<\w>), and C<blank> (a GNU extension). If C<utf8>
+is being used, then these classes are defined the same as their
+corresponding perl Unicode classes: C<[:upper:]> is the same as
+C<\p{IsUpper}>, etc. The POSIX character classes, however, don't
+require using C<utf8>. The C<[:digit:]>, C<[:word:]>, and
+C<[:space:]> correspond to the familiar C<\d>, C<\w>, and C<\s>
+character classes. To negate a POSIX class, put a C<^> in front of
+the name, so that, e.g., C<[:^digit:]> corresponds to C<\D> and under
+C<utf8>, C<\P{IsDigit}>. The Unicode and POSIX character classes can
+be used just like C<\d>, both inside and outside of character classes:
+
+ /\s+[abc[:digit:]xyz]\s*/; # match a,b,c,x,y,z, or a digit
+ /^=item\s[:digit:]/; # match '=item',
+ # followed by a space and a digit
+ use utf8;
+ use charnames ":full";
+ /\s+[abc\p{IsDigit}xyz]\s+/; # match a,b,c,x,y,z, or a digit
+ /^=item\s\p{IsDigit}/; # match '=item',
+ # followed by a space and a digit
+
+Whew! That is all the rest of the characters and character classes.
+
+=head2 Compiling and saving regular expressions
+
+In Part 1 we discussed the C<//o> modifier, which compiles a regexp
+just once. This suggests that a compiled regexp is some data structure
+that can be stored once and used again and again. The regexp quote
+C<qr//> does exactly that: C<qr/string/> compiles the C<string> as a
+regexp and transforms the result into a form that can be assigned to a
+variable:
+
+ $reg = qr/foo+bar?/; # reg contains a compiled regexp
+
+Then C<$reg> can be used as a regexp:
+
+ $x = "fooooba";
+ $x =~ $reg; # matches, just like /foo+bar?/
+ $x =~ /$reg/; # same thing, alternate form
+
+C<$reg> can also be interpolated into a larger regexp:
+
+ $x =~ /(abc)?$reg/; # still matches
+
+As with the matching operator, the regexp quote can use different
+delimiters, e.g., C<qr!!>, C<qr{}> and C<qr~~>. The single quote
+delimiters C<qr''> prevent any interpolation from taking place.
+
+Pre-compiled regexps are useful for creating dynamic matches that
+don't need to be recompiled each time they are encountered. Using
+pre-compiled regexps, C<simple_grep> program can be expanded into a
+program that matches multiple patterns:
+
+ % cat > multi_grep
+ #!/usr/bin/perl
+ # multi_grep - match any of <number> regexps
+ # usage: multi_grep <number> regexp1 regexp2 ... file1 file2 ...
+
+ $number = shift;
+ $regexp[$_] = shift foreach (0..$number-1);
+ @compiled = map qr/$_/, @regexp;
+ while ($line = <>) {
+ foreach $pattern (@compiled) {
+ if ($line =~ /$pattern/) {
+ print $line;
+ last; # we matched, so move onto the next line
+ }
+ }
+ }
+ ^D
+
+ % multi_grep 2 last for multi_grep
+ $regexp[$_] = shift foreach (0..$number-1);
+ foreach $pattern (@compiled) {
+ last;
+
+Storing pre-compiled regexps in an array C<@compiled> allows us to
+simply loop through the regexps without any recompilation, thus gaining
+flexibility without sacrificing speed.
+
+=head2 Embedding comments and modifiers in a regular expression
+
+Starting with this section, we will be discussing Perl's set of
+B<extended patterns>. These are extensions to the traditional regular
+expression syntax that provide powerful new tools for pattern
+matching. We have already seen extensions in the form of the minimal
+matching constructs C<??>, C<*?>, C<+?>, C<{n,m}?>, and C<{n,}?>. The
+rest of the extensions below have the form C<(?char...)>, where the
+C<char> is a character that determines the type of extension.
+
+The first extension is an embedded comment C<(?#text)>. This embeds a
+comment into the regular expression without affecting its meaning. The
+comment should not have any closing parentheses in the text. An
+example is
+
+ /(?# Match an integer:)[+-]?\d+/;
+
+This style of commenting has been largely superseded by the raw,
+freeform commenting that is allowed with the C<//x> modifier.
+
+The modifiers C<//i>, C<//m>, C<//s>, and C<//x> can also embedded in
+a regexp using C<(?i)>, C<(?m)>, C<(?s)>, and C<(?x)>. For instance,
+
+ /(?i)yes/; # match 'yes' case insensitively
+ /yes/i; # same thing
+ /(?x)( # freeform version of an integer regexp
+ [+-]? # match an optional sign
+ \d+ # match a sequence of digits
+ )
+ /x;
+
+Embedded modifiers can have two important advantages over the usual
+modifiers. Embedded modifiers allow a custom set of modifiers to
+I<each> regexp pattern. This is great for matching an array of regexps
+that must have different modifiers:
+
+ $pattern[0] = '(?i)doctor';
+ $pattern[1] = 'Johnson';
+ ...
+ while (<>) {
+ foreach $patt (@pattern) {
+ print if /$patt/;
+ }
+ }
+
+The second advantage is that embedded modifiers only affect the regexp
+inside the group the embedded modifier is contained in. So grouping
+can be used to localize the modifier's effects:
+
+ /Answer: ((?i)yes)/; # matches 'Answer: yes', 'Answer: YES', etc.
+
+Embedded modifiers can also turn off any modifiers already present
+by using, e.g., C<(?-i)>. Modifiers can also be combined into
+a single expression, e.g., C<(?s-i)> turns on single line mode and
+turns off case insensitivity.
+
+=head2 Non-capturing groupings
+
+We noted in Part 1 that groupings C<()> had two distinct functions: 1)
+group regexp elements together as a single unit, and 2) extract, or
+capture, substrings that matched the regexp in the
+grouping. Non-capturing groupings, denoted by C<(?:regexp)>, allow the
+regexp to be treated as a single unit, but don't extract substrings or
+set matching variables C<$1>, etc. Both capturing and non-capturing
+groupings are allowed to co-exist in the same regexp. Because there is
+no extraction, non-capturing groupings are faster than capturing
+groupings. Non-capturing groupings are also handy for choosing exactly
+which parts of a regexp are to be extracted to matching variables:
+
+ # match a number, $1-$4 are set, but we only want $1
+ /([+-]?\ *(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?)/;
+
+ # match a number faster , only $1 is set
+ /([+-]?\ *(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?)/;
+
+ # match a number, get $1 = whole number, $2 = exponent
+ /([+-]?\ *(?:\d+(?:\.\d*)?|\.\d+)(?:[eE]([+-]?\d+))?)/;
+
+Non-capturing groupings are also useful for removing nuisance
+elements gathered from a split operation:
+
+ $x = '12a34b5';
+ @num = split /(a|b)/, $x; # @num = ('12','a','34','b','5')
+ @num = split /(?:a|b)/, $x; # @num = ('12','34','5')
+
+Non-capturing groupings may also have embedded modifiers:
+C<(?i-m:regexp)> is a non-capturing grouping that matches C<regexp>
+case insensitively and turns off multi-line mode.
+
+=head2 Looking ahead and looking behind
+
+This section concerns the lookahead and lookbehind assertions. First,
+a little background.
+
+In Perl regular expressions, most regexp elements 'eat up' a certain
+amount of string when they match. For instance, the regexp element
+C<[abc}]> eats up one character of the string when it matches, in the
+sense that perl moves to the next character position in the string
+after the match. There are some elements, however, that don't eat up
+characters (advance the character position) if they match. The examples
+we have seen so far are the anchors. The anchor C<^> matches the
+beginning of the line, but doesn't eat any characters. Similarly, the
+word boundary anchor C<\b> matches, e.g., if the character to the left
+is a word character and the character to the right is a non-word
+character, but it doesn't eat up any characters itself. Anchors are
+examples of 'zero-width assertions'. Zero-width, because they consume
+no characters, and assertions, because they test some property of the
+string. In the context of our walk in the woods analogy to regexp
+matching, most regexp elements move us along a trail, but anchors have
+us stop a moment and check our surroundings. If the local environment
+checks out, we can proceed forward. But if the local environment
+doesn't satisfy us, we must backtrack.
+
+Checking the environment entails either looking ahead on the trail,
+looking behind, or both. C<^> looks behind, to see that there are no
+characters before. C<$> looks ahead, to see that there are no
+characters after. C<\b> looks both ahead and behind, to see if the
+characters on either side differ in their 'word'-ness.
+
+The lookahead and lookbehind assertions are generalizations of the
+anchor concept. Lookahead and lookbehind are zero-width assertions
+that let us specify which characters we want to test for. The
+lookahead assertion is denoted by C<(?=regexp)> and the lookbehind
+assertion is denoted by C<< (?<=fixed-regexp) >>. Some examples are
+
+ $x = "I catch the housecat 'Tom-cat' with catnip";
+ $x =~ /cat(?=\s+)/; # matches 'cat' in 'housecat'
+ @catwords = ($x =~ /(?<=\s)cat\w+/g); # matches,
+ # $catwords[0] = 'catch'
+ # $catwords[1] = 'catnip'
+ $x =~ /\bcat\b/; # matches 'cat' in 'Tom-cat'
+ $x =~ /(?<=\s)cat(?=\s)/; # doesn't match; no isolated 'cat' in
+ # middle of $x
+
+Note that the parentheses in C<(?=regexp)> and C<< (?<=regexp) >> are
+non-capturing, since these are zero-width assertions. Thus in the
+second regexp, the substrings captured are those of the whole regexp
+itself. Lookahead C<(?=regexp)> can match arbitrary regexps, but
+lookbehind C<< (?<=fixed-regexp) >> only works for regexps of fixed
+width, i.e., a fixed number of characters long. Thus
+C<< (?<=(ab|bc)) >> is fine, but C<< (?<=(ab)*) >> is not. The
+negated versions of the lookahead and lookbehind assertions are
+denoted by C<(?!regexp)> and C<< (?<!fixed-regexp) >> respectively.
+They evaluate true if the regexps do I<not> match:
+
+ $x = "foobar";
+ $x =~ /foo(?!bar)/; # doesn't match, 'bar' follows 'foo'
+ $x =~ /foo(?!baz)/; # matches, 'baz' doesn't follow 'foo'
+ $x =~ /(?<!\s)foo/; # matches, there is no \s before 'foo'
+
+=head2 Using independent subexpressions to prevent backtracking
+
+The last few extended patterns in this tutorial are experimental as of
+5.6.0. Play with them, use them in some code, but don't rely on them
+just yet for production code.
+
+S<B<Independent subexpressions> > are regular expressions, in the
+context of a larger regular expression, that function independently of
+the larger regular expression. That is, they consume as much or as
+little of the string as they wish without regard for the ability of
+the larger regexp to match. Independent subexpressions are represented
+by C<< (?>regexp) >>. We can illustrate their behavior by first
+considering an ordinary regexp:
+
+ $x = "ab";
+ $x =~ /a*ab/; # matches
+
+This obviously matches, but in the process of matching, the
+subexpression C<a*> first grabbed the C<a>. Doing so, however,
+wouldn't allow the whole regexp to match, so after backtracking, C<a*>
+eventually gave back the C<a> and matched the empty string. Here, what
+C<a*> matched was I<dependent> on what the rest of the regexp matched.
+
+Contrast that with an independent subexpression:
+
+ $x =~ /(?>a*)ab/; # doesn't match!
+
+The independent subexpression C<< (?>a*) >> doesn't care about the rest
+of the regexp, so it sees an C<a> and grabs it. Then the rest of the
+regexp C<ab> cannot match. Because C<< (?>a*) >> is independent, there
+is no backtracking and and the independent subexpression does not give
+up its C<a>. Thus the match of the regexp as a whole fails. A similar
+behavior occurs with completely independent regexps:
+
+ $x = "ab";
+ $x =~ /a*/g; # matches, eats an 'a'
+ $x =~ /\Gab/g; # doesn't match, no 'a' available
+
+Here C<//g> and C<\G> create a 'tag team' handoff of the string from
+one regexp to the other. Regexps with an independent subexpression are
+much like this, with a handoff of the string to the independent
+subexpression, and a handoff of the string back to the enclosing
+regexp.
+
+The ability of an independent subexpression to prevent backtracking
+can be quite useful. Suppose we want to match a non-empty string
+enclosed in parentheses up to two levels deep. Then the following
+regexp matches:
+
+ $x = "abc(de(fg)h"; # unbalanced parentheses
+ $x =~ /\( ( [^()]+ | \([^()]*\) )+ \)/x;
+
+The regexp matches an open parenthesis, one or more copies of an
+alternation, and a close parenthesis. The alternation is two-way, with
+the first alternative C<[^()]+> matching a substring with no
+parentheses and the second alternative C<\([^()]*\)> matching a
+substring delimited by parentheses. The problem with this regexp is
+that it is pathological: it has nested indeterminate quantifiers
+ of the form C<(a+|b)+>. We discussed in Part 1 how nested quantifiers
+like this could take an exponentially long time to execute if there
+was no match possible. To prevent the exponential blowup, we need to
+prevent useless backtracking at some point. This can be done by
+enclosing the inner quantifier as an independent subexpression:
+
+ $x =~ /\( ( (?>[^()]+) | \([^()]*\) )+ \)/x;
+
+Here, C<< (?>[^()]+) >> breaks the degeneracy of string partitioning
+by gobbling up as much of the string as possible and keeping it. Then
+match failures fail much more quickly.
+
+=head2 Conditional expressions
+
+A S<B<conditional expression> > is a form of if-then-else statement
+that allows one to choose which patterns are to be matched, based on
+some condition. There are two types of conditional expression:
+C<(?(condition)yes-regexp)> and
+C<(?(condition)yes-regexp|no-regexp)>. C<(?(condition)yes-regexp)> is
+like an S<C<'if () {}'> > statement in Perl. If the C<condition> is true,
+the C<yes-regexp> will be matched. If the C<condition> is false, the
+C<yes-regexp> will be skipped and perl will move onto the next regexp
+element. The second form is like an S<C<'if () {} else {}'> > statement
+in Perl. If the C<condition> is true, the C<yes-regexp> will be
+matched, otherwise the C<no-regexp> will be matched.
+
+The C<condition> can have two forms. The first form is simply an
+integer in parentheses C<(integer)>. It is true if the corresponding
+backreference C<\integer> matched earlier in the regexp. The second
+form is a bare zero width assertion C<(?...)>, either a
+lookahead, a lookbehind, or a code assertion (discussed in the next
+section).
+
+The integer form of the C<condition> allows us to choose, with more
+flexibility, what to match based on what matched earlier in the
+regexp. This searches for words of the form C<"$x$x"> or
+C<"$x$y$y$x">:
+
+ % simple_grep '^(\w+)(\w+)?(?(2)\2\1|\1)$' /usr/dict/words
+ beriberi
+ coco
+ couscous
+ deed
+ ...
+ toot
+ toto
+ tutu
+
+The lookbehind C<condition> allows, along with backreferences,
+an earlier part of the match to influence a later part of the
+match. For instance,
+
+ /[ATGC]+(?(?<=AA)G|C)$/;
+
+matches a DNA sequence such that it either ends in C<AAG>, or some
+other base pair combination and C<C>. Note that the form is
+C<< (?(?<=AA)G|C) >> and not C<< (?((?<=AA))G|C) >>; for the
+lookahead, lookbehind or code assertions, the parentheses around the
+conditional are not needed.
+
+=head2 A bit of magic: executing Perl code in a regular expression
+
+Normally, regexps are a part of Perl expressions.
+S<B<Code evaluation> > expressions turn that around by allowing
+arbitrary Perl code to be a part of of a regexp. A code evaluation
+expression is denoted C<(?{code})>, with C<code> a string of Perl
+statements.
+
+Code expressions are zero-width assertions, and the value they return
+depends on their environment. There are two possibilities: either the
+code expression is used as a conditional in a conditional expression
+C<(?(condition)...)>, or it is not. If the code expression is a
+conditional, the code is evaluated and the result (i.e., the result of
+the last statement) is used to determine truth or falsehood. If the
+code expression is not used as a conditional, the assertion always
+evaluates true and the result is put into the special variable
+C<$^R>. The variable C<$^R> can then be used in code expressions later
+in the regexp. Here are some silly examples:
+
+ $x = "abcdef";
+ $x =~ /abc(?{print "Hi Mom!";})def/; # matches,
+ # prints 'Hi Mom!'
+ $x =~ /aaa(?{print "Hi Mom!";})def/; # doesn't match,
+ # no 'Hi Mom!'
+
+Pay careful attention to the next example:
+
+ $x =~ /abc(?{print "Hi Mom!";})ddd/; # doesn't match,
+ # no 'Hi Mom!'
+ # but why not?
+
+At first glance, you'd think that it shouldn't print, because obviously
+the C<ddd> isn't going to match the target string. But look at this
+example:
+
+ $x =~ /abc(?{print "Hi Mom!";})[d]dd/; # doesn't match,
+ # but _does_ print
+
+Hmm. What happened here? If you've been following along, you know that
+the above pattern should be effectively the same as the last one --
+enclosing the d in a character class isn't going to change what it
+matches. So why does the first not print while the second one does?
+
+The answer lies in the optimizations the REx engine makes. In the first
+case, all the engine sees are plain old characters (aside from the
+C<?{}> construct). It's smart enough to realize that the string 'ddd'
+doesn't occur in our target string before actually running the pattern
+through. But in the second case, we've tricked it into thinking that our
+pattern is more complicated than it is. It takes a look, sees our
+character class, and decides that it will have to actually run the
+pattern to determine whether or not it matches, and in the process of
+running it hits the print statement before it discovers that we don't
+have a match.
+
+To take a closer look at how the engine does optimizations, see the
+section L<"Pragmas and debugging"> below.
+
+More fun with C<?{}>:
+
+ $x =~ /(?{print "Hi Mom!";})/; # matches,
+ # prints 'Hi Mom!'
+ $x =~ /(?{$c = 1;})(?{print "$c";})/; # matches,
+ # prints '1'
+ $x =~ /(?{$c = 1;})(?{print "$^R";})/; # matches,
+ # prints '1'
+
+The bit of magic mentioned in the section title occurs when the regexp
+backtracks in the process of searching for a match. If the regexp
+backtracks over a code expression and if the variables used within are
+localized using C<local>, the changes in the variables produced by the
+code expression are undone! Thus, if we wanted to count how many times
+a character got matched inside a group, we could use, e.g.,
+
+ $x = "aaaa";
+ $count = 0; # initialize 'a' count
+ $c = "bob"; # test if $c gets clobbered
+ $x =~ /(?{local $c = 0;}) # initialize count
+ ( a # match 'a'
+ (?{local $c = $c + 1;}) # increment count
+ )* # do this any number of times,
+ aa # but match 'aa' at the end
+ (?{$count = $c;}) # copy local $c var into $count
+ /x;
+ print "'a' count is $count, \$c variable is '$c'\n";
+
+This prints
+
+ 'a' count is 2, $c variable is 'bob'
+
+If we replace the S<C< (?{local $c = $c + 1;})> > with
+S<C< (?{$c = $c + 1;})> >, the variable changes are I<not> undone
+during backtracking, and we get
+
+ 'a' count is 4, $c variable is 'bob'
+
+Note that only localized variable changes are undone. Other side
+effects of code expression execution are permanent. Thus
+
+ $x = "aaaa";
+ $x =~ /(a(?{print "Yow\n";}))*aa/;
+
+produces
+
+ Yow
+ Yow
+ Yow
+ Yow
+
+The result C<$^R> is automatically localized, so that it will behave
+properly in the presence of backtracking.
+
+This example uses a code expression in a conditional to match the
+article 'the' in either English or German:
+
+ $lang = 'DE'; # use German
+ ...
+ $text = "das";
+ print "matched\n"
+ if $text =~ /(?(?{
+ $lang eq 'EN'; # is the language English?
+ })
+ the | # if so, then match 'the'
+ (die|das|der) # else, match 'die|das|der'
+ )
+ /xi;
+
+Note that the syntax here is C<(?(?{...})yes-regexp|no-regexp)>, not
+C<(?((?{...}))yes-regexp|no-regexp)>. In other words, in the case of a
+code expression, we don't need the extra parentheses around the
+conditional.
+
+If you try to use code expressions with interpolating variables, perl
+may surprise you:
+
+ $bar = 5;
+ $pat = '(?{ 1 })';
+ /foo(?{ $bar })bar/; # compiles ok, $bar not interpolated
+ /foo(?{ 1 })$bar/; # compile error!
+ /foo${pat}bar/; # compile error!
+
+ $pat = qr/(?{ $foo = 1 })/; # precompile code regexp
+ /foo${pat}bar/; # compiles ok
+
+If a regexp has (1) code expressions and interpolating variables,or
+(2) a variable that interpolates a code expression, perl treats the
+regexp as an error. If the code expression is precompiled into a
+variable, however, interpolating is ok. The question is, why is this
+an error?
+
+The reason is that variable interpolation and code expressions
+together pose a security risk. The combination is dangerous because
+many programmers who write search engines often take user input and
+plug it directly into a regexp:
+
+ $regexp = <>; # read user-supplied regexp
+ $chomp $regexp; # get rid of possible newline
+ $text =~ /$regexp/; # search $text for the $regexp
+
+If the C<$regexp> variable contains a code expression, the user could
+then execute arbitrary Perl code. For instance, some joker could
+search for S<C<system('rm -rf *');> > to erase your files. In this
+sense, the combination of interpolation and code expressions B<taints>
+your regexp. So by default, using both interpolation and code
+expressions in the same regexp is not allowed. If you're not
+concerned about malicious users, it is possible to bypass this
+security check by invoking S<C<use re 'eval'> >:
+
+ use re 'eval'; # throw caution out the door
+ $bar = 5;
+ $pat = '(?{ 1 })';
+ /foo(?{ 1 })$bar/; # compiles ok
+ /foo${pat}bar/; # compiles ok
+
+Another form of code expression is the S<B<pattern code expression> >.
+The pattern code expression is like a regular code expression, except
+that the result of the code evaluation is treated as a regular
+expression and matched immediately. A simple example is
+
+ $length = 5;
+ $char = 'a';
+ $x = 'aaaaabb';
+ $x =~ /(??{$char x $length})/x; # matches, there are 5 of 'a'
+
+
+This final example contains both ordinary and pattern code
+expressions. It detects if a binary string C<1101010010001...> has a
+Fibonacci spacing 0,1,1,2,3,5,... of the C<1>'s:
+
+ $s0 = 0; $s1 = 1; # initial conditions
+ $x = "1101010010001000001";
+ print "It is a Fibonacci sequence\n"
+ if $x =~ /^1 # match an initial '1'
+ (
+ (??{'0' x $s0}) # match $s0 of '0'
+ 1 # and then a '1'
+ (?{
+ $largest = $s0; # largest seq so far
+ $s2 = $s1 + $s0; # compute next term
+ $s0 = $s1; # in Fibonacci sequence
+ $s1 = $s2;
+ })
+ )+ # repeat as needed
+ $ # that is all there is
+ /x;
+ print "Largest sequence matched was $largest\n";
+
+This prints
+
+ It is a Fibonacci sequence
+ Largest sequence matched was 5
+
+Ha! Try that with your garden variety regexp package...
+
+Note that the variables C<$s0> and C<$s1> are not substituted when the
+regexp is compiled, as happens for ordinary variables outside a code
+expression. Rather, the code expressions are evaluated when perl
+encounters them during the search for a match.
+
+The regexp without the C<//x> modifier is
+
+ /^1((??{'0'x$s0})1(?{$largest=$s0;$s2=$s1+$s0$s0=$s1;$s1=$s2;}))+$/;
+
+and is a great start on an Obfuscated Perl entry :-) When working with
+code and conditional expressions, the extended form of regexps is
+almost necessary in creating and debugging regexps.
+
+=head2 Pragmas and debugging
+
+Speaking of debugging, there are several pragmas available to control
+and debug regexps in Perl. We have already encountered one pragma in
+the previous section, S<C<use re 'eval';> >, that allows variable
+interpolation and code expressions to coexist in a regexp. The other
+pragmas are
+
+ use re 'taint';
+ $tainted = <>;
+ @parts = ($tainted =~ /(\w+)\s+(\w+)/; # @parts is now tainted
+
+The C<taint> pragma causes any substrings from a match with a tainted
+variable to be tainted as well. This is not normally the case, as
+regexps are often used to extract the safe bits from a tainted
+variable. Use C<taint> when you are not extracting safe bits, but are
+performing some other processing. Both C<taint> and C<eval> pragmas
+are lexically scoped, which means they are in effect only until
+the end of the block enclosing the pragmas.
+
+ use re 'debug';
+ /^(.*)$/s; # output debugging info
+
+ use re 'debugcolor';
+ /^(.*)$/s; # output debugging info in living color
+
+The global C<debug> and C<debugcolor> pragmas allow one to get
+detailed debugging info about regexp compilation and
+execution. C<debugcolor> is the same as debug, except the debugging
+information is displayed in color on terminals that can display
+termcap color sequences. Here is example output:
+
+ % perl -e 'use re "debug"; "abc" =~ /a*b+c/;'
+ Compiling REx `a*b+c'
+ size 9 first at 1
+ 1: STAR(4)
+ 2: EXACT <a>(0)
+ 4: PLUS(7)
+ 5: EXACT <b>(0)
+ 7: EXACT <c>(9)
+ 9: END(0)
+ floating `bc' at 0..2147483647 (checking floating) minlen 2
+ Guessing start of match, REx `a*b+c' against `abc'...
+ Found floating substr `bc' at offset 1...
+ Guessed: match at offset 0
+ Matching REx `a*b+c' against `abc'
+ Setting an EVAL scope, savestack=3
+ 0 <> <abc> | 1: STAR
+ EXACT <a> can match 1 times out of 32767...
+ Setting an EVAL scope, savestack=3
+ 1 <a> <bc> | 4: PLUS
+ EXACT <b> can match 1 times out of 32767...
+ Setting an EVAL scope, savestack=3
+ 2 <ab> <c> | 7: EXACT <c>
+ 3 <abc> <> | 9: END
+ Match successful!
+ Freeing REx: `a*b+c'
+
+If you have gotten this far into the tutorial, you can probably guess
+what the different parts of the debugging output tell you. The first
+part
+
+ Compiling REx `a*b+c'
+ size 9 first at 1
+ 1: STAR(4)
+ 2: EXACT <a>(0)
+ 4: PLUS(7)
+ 5: EXACT <b>(0)
+ 7: EXACT <c>(9)
+ 9: END(0)
+
+describes the compilation stage. C<STAR(4)> means that there is a
+starred object, in this case C<'a'>, and if it matches, goto line 4,
+i.e., C<PLUS(7)>. The middle lines describe some heuristics and
+optimizations performed before a match:
+
+ floating `bc' at 0..2147483647 (checking floating) minlen 2
+ Guessing start of match, REx `a*b+c' against `abc'...
+ Found floating substr `bc' at offset 1...
+ Guessed: match at offset 0
+
+Then the match is executed and the remaining lines describe the
+process:
+
+ Matching REx `a*b+c' against `abc'
+ Setting an EVAL scope, savestack=3
+ 0 <> <abc> | 1: STAR
+ EXACT <a> can match 1 times out of 32767...
+ Setting an EVAL scope, savestack=3
+ 1 <a> <bc> | 4: PLUS
+ EXACT <b> can match 1 times out of 32767...
+ Setting an EVAL scope, savestack=3
+ 2 <ab> <c> | 7: EXACT <c>
+ 3 <abc> <> | 9: END
+ Match successful!
+ Freeing REx: `a*b+c'
+
+Each step is of the form S<C<< n <x> <y> >> >, with C<< <x> >> the
+part of the string matched and C<< <y> >> the part not yet
+matched. The S<C<< | 1: STAR >> > says that perl is at line number 1
+n the compilation list above. See
+L<perldebguts/"Debugging regular expressions"> for much more detail.
+
+An alternative method of debugging regexps is to embed C<print>
+statements within the regexp. This provides a blow-by-blow account of
+the backtracking in an alternation:
+
+ "that this" =~ m@(?{print "Start at position ", pos, "\n";})
+ t(?{print "t1\n";})
+ h(?{print "h1\n";})
+ i(?{print "i1\n";})
+ s(?{print "s1\n";})
+ |
+ t(?{print "t2\n";})
+ h(?{print "h2\n";})
+ a(?{print "a2\n";})
+ t(?{print "t2\n";})
+ (?{print "Done at position ", pos, "\n";})
+ @x;
+
+prints
+
+ Start at position 0
+ t1
+ h1
+ t2
+ h2
+ a2
+ t2
+ Done at position 4
+
+=head1 BUGS
+
+Code expressions, conditional expressions, and independent expressions
+are B<experimental>. Don't use them in production code. Yet.
+
+=head1 SEE ALSO
+
+This is just a tutorial. For the full story on perl regular
+expressions, see the L<perlre> regular expressions reference page.
+
+For more information on the matching C<m//> and substitution C<s///>
+operators, see L<perlop/"Regexp Quote-Like Operators">. For
+information on the C<split> operation, see L<perlfunc/split>.
+
+For an excellent all-around resource on the care and feeding of
+regular expressions, see the book I<Mastering Regular Expressions> by
+Jeffrey Friedl (published by O'Reilly, ISBN 1556592-257-3).
+
+=head1 AUTHOR AND COPYRIGHT
+
+Copyright (c) 2000 Mark Kvale
+All rights reserved.
+
+This document may be distributed under the same terms as Perl itself.
+
+=head2 Acknowledgments
+
+The inspiration for the stop codon DNA example came from the ZIP
+code example in chapter 7 of I<Mastering Regular Expressions>.
+
+The author would like to thank Jeff Pinyan, Andrew Johnson, Peter
+Haworth, Ronald J Kimball, and Joe Smith for all their helpful
+comments.
+
+=cut
+
diff --git a/gnu/usr.bin/perl/pod/perlthrtut.pod b/gnu/usr.bin/perl/pod/perlthrtut.pod
index 0f15d57de76..0b7092b39dc 100644
--- a/gnu/usr.bin/perl/pod/perlthrtut.pod
+++ b/gnu/usr.bin/perl/pod/perlthrtut.pod
@@ -718,7 +718,7 @@ In addition to synchronizing access to data or resources, you might
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.
+have a set of locks and semaphores.
One of the additions to Perl 5.005 is subroutine attributes. The
Thread package uses these to provide several flavors of
@@ -991,7 +991,7 @@ the explanation is much longer than the program.
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
-Perl's threads behave is the documention bundled with the Perl
+Perl's threads behave is the documentation 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.
@@ -1029,7 +1029,7 @@ LoVerso. Programming under Mach. Addison-Wesley, 1994, ISBN
0-201-52739-1.
Tanenbaum, Andrew S. Distributed Operating Systems. Prentice Hall,
-1995, ISBN 0-13-143934-0 (great textbook).
+1995, ISBN 0-13-219908-4 (great textbook).
Silberschatz, Abraham, and Peter B. Galvin. Operating System Concepts,
4th ed. Addison-Wesley, 1995, ISBN 0-201-59292-4
diff --git a/gnu/usr.bin/perl/pod/perltodo.pod b/gnu/usr.bin/perl/pod/perltodo.pod
index f22d4737f81..f38ba88bf36 100644
--- a/gnu/usr.bin/perl/pod/perltodo.pod
+++ b/gnu/usr.bin/perl/pod/perltodo.pod
@@ -85,7 +85,7 @@ We need regression/sanity tests for suidperl
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
+the reliability and extensibility 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
@@ -111,10 +111,6 @@ 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
@@ -161,7 +157,7 @@ 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
+I think we can accommodate 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. :)
@@ -532,14 +528,6 @@ 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
@@ -863,7 +851,7 @@ See Time::HiRes.
=head2 autocroak?
-This is the Fatal.pm module, so any builtin that that does
+This is the Fatal.pm module, so any builtin that does
not return success automatically die()s. If you're feeling brave, tie
this in with the unified exceptions scheme.
diff --git a/gnu/usr.bin/perl/pod/perltootc.pod b/gnu/usr.bin/perl/pod/perltootc.pod
index 64f8233fdbc..d2d881c9990 100644
--- a/gnu/usr.bin/perl/pod/perltootc.pod
+++ b/gnu/usr.bin/perl/pod/perltootc.pod
@@ -12,7 +12,7 @@ the class itself.
Here are a few examples where class attributes might come in handy:
-=over
+=over 4
=item *
@@ -74,6 +74,15 @@ 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 in a Can
+
+One of the easiest ways to solve a hard problem is to let someone else
+do it for you! In this case, Class::Data::Inheritable (available on a
+CPAN near you) offers a canned solution to the class data problem
+using closures. So before you wade into this document, consider
+having a look at that module.
+
+
=head1 Class Data as Package Variables
Because a class in Perl is really just a package, using package variables
@@ -184,7 +193,7 @@ 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
+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.
@@ -1302,7 +1311,8 @@ would just confuse the examples.
L<perltoot>, L<perlobj>, L<perlmod>, and L<perlbot>.
-The Tie::SecureHash module from CPAN is worth checking out.
+The Tie::SecureHash and Class::Data::Inheritable modules from CPAN are
+worth checking out.
=head1 AUTHOR AND COPYRIGHT
@@ -1334,4 +1344,4 @@ object-oriented languages enforce.
=head1 HISTORY
-Last edit: Fri May 21 15:47:56 MDT 1999
+Last edit: Sun Feb 4 20:50:28 EST 2001
diff --git a/gnu/usr.bin/perl/pod/perlunicode.pod b/gnu/usr.bin/perl/pod/perlunicode.pod
index 5333ac495c0..5b0fe2faaf2 100644
--- a/gnu/usr.bin/perl/pod/perlunicode.pod
+++ b/gnu/usr.bin/perl/pod/perlunicode.pod
@@ -1,16 +1,18 @@
=head1 NAME
-perlunicode - Unicode support in Perl
+perlunicode - Unicode support in Perl (EXPERIMENTAL, subject to change)
=head1 DESCRIPTION
=head2 Important Caveat
-WARNING: The implementation of Unicode support in Perl is incomplete.
+ WARNING: As of the 5.6.1 release, the implementation of Unicode
+ support in Perl is incomplete, and continues to be highly experimental.
-The following areas need further work.
+The following areas need further work. They are being rapidly addressed
+in the 5.7.x development branch.
-=over
+=over 4
=item Input and Output Disciplines
@@ -114,13 +116,7 @@ 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.
+a Unicode smiley face is C<\x{263A}>.
=item *
@@ -163,20 +159,10 @@ 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?).
+The C<tr///> operator translates characters instead of bytes. Note
+that the C<tr///CU> functionality has been removed, as the interface
+was a mistake. For similar functionality see pack('U0', ...) and
+pack('C0', ...).
=item *
@@ -214,6 +200,18 @@ byte-oriented C<chr()> and C<ord()> under utf8.
=item *
+The bit string operators C<& | ^ ~> can operate on character data.
+However, for backward compatibility reasons (bit string operations
+when the characters all are less than 256 in ordinal value) one cannot
+mix C<~> (the bit complement) and characters both less than 256 and
+equal or greater than 256. Most importantly, the DeMorgan's laws
+(C<~($x|$y) eq ~$x&~$y>, C<~($x&$y) eq ~$x|~$y>) won't hold.
+Another way to look at this is that the complement cannot return
+B<both> the 8-bit (byte) wide bit complement, and the full character
+wide bit complement.
+
+=item *
+
And finally, C<scalar reverse()> reverses by character rather than by byte.
=back
diff --git a/gnu/usr.bin/perl/pod/perlutil.pod b/gnu/usr.bin/perl/pod/perlutil.pod
new file mode 100644
index 00000000000..be7a345f796
--- /dev/null
+++ b/gnu/usr.bin/perl/pod/perlutil.pod
@@ -0,0 +1,185 @@
+=head1 NAME
+
+perlutil - utilities packaged with the Perl distribution
+
+=head1 DESCRIPTION
+
+Along with the Perl interpreter itself, the Perl distribution installs a
+range of utilities on your system. There are also several utilities
+which are used by the Perl distribution itself as part of the install
+process. This document exists to list all of these utilities, explain
+what they are for and provide pointers to each module's documentation,
+if appropriate.
+
+=head2 DOCUMENTATION
+
+=over 3
+
+=item L<perldoc|perldoc>
+
+The main interface to Perl's documentation is C<perldoc>, although
+if you're reading this, it's more than likely that you've already found
+it. F<perldoc> will extract and format the documentation from any file
+in the current directory, any Perl module installed on the system, or
+any of the standard documentation pages, such as this one. Use
+C<perldoc E<lt>nameE<gt>> to get information on any of the utilities
+described in this document.
+
+=item L<pod2man|pod2man> and L<pod2text|pod2text>
+
+If it's run from a terminal, F<perldoc> will usually call F<pod2man> to
+translate POD (Plain Old Documentation - see L<perlpod> for an
+explanation) into a man page, and then run F<man> to display it; if
+F<man> isn't available, F<pod2text> will be used instead and the output
+piped through your favourite pager.
+
+=item L<pod2html|pod2html> and L<pod2latex|pod2latex>
+
+As well as these two, there are two other converters: F<pod2html> will
+produce HTML pages from POD, and F<pod2latex>, which produces LaTeX
+files.
+
+=item L<pod2usage|pod2usage>
+
+If you just want to know how to use the utilities described here,
+F<pod2usage> will just extract the "USAGE" section; some of
+the utilities will automatically call F<pod2usage> on themselves when
+you call them with C<-help>.
+
+=item L<podselect|podselect>
+
+F<pod2usage> is a special case of F<podselect>, a utility to extract
+named sections from documents written in POD. For instance, while
+utilities have "USAGE" sections, Perl modules usually have "SYNOPSIS"
+sections: C<podselect -s "SYNOPSIS" ...> will extract this section for
+a given file.
+
+=item L<podchecker|podchecker>
+
+If you're writing your own documentation in POD, the F<podchecker>
+utility will look for errors in your markup.
+
+=item L<splain|splain>
+
+F<splain> is an interface to L<perldiag> - paste in your error message
+to it, and it'll explain it for you.
+
+=item L<roffitall|roffitall>
+
+The C<roffitall> utility is not installed on your system but lives in
+the F<pod/> directory of your Perl source kit; it converts all the
+documentation from the distribution to F<*roff> format, and produces a
+typeset PostScript or text file of the whole lot.
+
+=back
+
+=head2 CONVERTORS
+
+To help you convert legacy programs to Perl, we've included three
+conversion filters:
+
+=over 3
+
+=item L<a2p|a2p>
+
+F<a2p> converts F<awk> scripts to Perl programs; for example, C<a2p -F:>
+on the simple F<awk> script C<{print $2}> will produce a Perl program
+based around this code:
+
+ while (<>) {
+ ($Fld1,$Fld2) = split(/[:\n]/, $_, 9999);
+ print $Fld2;
+ }
+
+=item L<s2p|s2p>
+
+Similarly, F<s2p> converts F<sed> scripts to Perl programs. F<s2p> run
+on C<s/foo/bar> will produce a Perl program based around this:
+
+ while (<>) {
+ chomp;
+ s/foo/bar/g;
+ print if $printit;
+ }
+
+=item L<find2perl|find2perl>
+
+Finally, F<find2perl> translates C<find> commands to Perl equivalents which
+use the L<File::Find|File::Find> module. As an example,
+C<find2perl . -user root -perm 4000 -print> produces the following callback
+subroutine for C<File::Find>:
+
+ sub wanted {
+ my ($dev,$ino,$mode,$nlink,$uid,$gid);
+ (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
+ $uid == $uid{'root'}) &&
+ (($mode & 0777) == 04000);
+ print("$name\n");
+ }
+
+=back
+
+As well as these filters for converting other languages, the
+L<pl2pm|pl2pm> utility will help you convert old-style Perl 4 libraries to
+new-style Perl5 modules.
+
+=head2 Development
+
+There are a set of utilities which help you in developing Perl programs,
+and in particular, extending Perl with C.
+
+=over 3
+
+=item L<perlbug|perlbug>
+
+F<perlbug> is the recommended way to report bugs in the perl interpreter
+itself or any of the standard library modules back to the developers;
+please read through the documentation for F<perlbug> thoroughly before
+using it to submit a bug report.
+
+=item L<h2ph|h2ph>
+
+Back before Perl had the XS system for connecting with C libraries,
+programmers used to get library constants by reading through the C
+header files. You may still see C<require 'syscall.ph'> or similar
+around - the F<.ph> file should be created by running F<h2ph> on the
+corresponding F<.h> file. See the F<h2ph> documentation for more on how
+to convert a whole bunch of header files at ones.
+
+=item L<c2ph|c2ph> and L<pstruct|pstruct>
+
+F<c2ph> and F<pstruct>, which are actually the same program but behave
+differently depending on how they are called, provide another way of
+getting at C with Perl - they'll convert C structures and union declarations
+to Perl code. This is deprecated in favour of F<h2xs> these days.
+
+=item L<h2xs|h2xs>
+
+F<h2xs> converts C header files into XS modules, and will try and write
+as much glue between C libraries and Perl modules as it can. It's also
+very useful for creating skeletons of pure Perl modules.
+
+=item L<dprofpp|dprofpp>
+
+Perl comes with a profiler, the F<Devel::Dprof> module. The
+F<dprofpp> utility analyzes the output of this profiler and tells you
+which subroutines are taking up the most run time. See L<Devel::Dprof>
+for more information.
+
+=item L<perlcc|perlcc>
+
+F<perlcc> is the interface to the experimental Perl compiler suite.
+
+=back
+
+=head2 SEE ALSO
+
+L<perldoc|perldoc>, L<pod2man|pod2man>, L<perlpod>,
+L<pod2html|pod2html>, L<pod2usage|pod2usage>, L<podselect|podselect>,
+L<podchecker|podchecker>, L<splain|splain>, L<perldiag>,
+L<roffitall|roffitall>, L<a2p|a2p>, L<s2p|s2p>, L<find2perl|find2perl>,
+L<File::Find|File::Find>, L<pl2pm|pl2pm>, L<perlbug|perlbug>,
+L<h2ph|h2ph>, L<c2ph|c2ph>, L<h2xs|h2xs>, L<dprofpp|dprofpp>,
+L<Devel::Dprof>, L<perlcc|perlcc>
+
+=cut
diff --git a/gnu/usr.bin/perl/pod/pod2usage.PL b/gnu/usr.bin/perl/pod/pod2usage.PL
index e0f70b2ca4f..1c1296a19f3 100644
--- a/gnu/usr.bin/perl/pod/pod2usage.PL
+++ b/gnu/usr.bin/perl/pod/pod2usage.PL
@@ -39,7 +39,7 @@ print OUT <<'!NO!SUBS!';
#############################################################################
# pod2usage -- command to print usage messages from embedded pod docs
#
-# Copyright (c) 1996-1999 by Bradford Appleton. All rights reserved.
+# 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.
diff --git a/gnu/usr.bin/perl/pod/podchecker.PL b/gnu/usr.bin/perl/pod/podchecker.PL
index a7f96434ca6..20d5e94c2e0 100644
--- a/gnu/usr.bin/perl/pod/podchecker.PL
+++ b/gnu/usr.bin/perl/pod/podchecker.PL
@@ -39,7 +39,7 @@ print OUT <<'!NO!SUBS!';
#############################################################################
# podchecker -- command to invoke the podchecker function in Pod::Checker
#
-# Copyright (c) 1998-1999 by Bradford Appleton. All rights reserved.
+# Copyright (c) 1998-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.
@@ -70,7 +70,9 @@ Print the manual page and exit.
=item B<-warnings> B<-nowarnings>
-Turn on/off printing of warnings.
+Turn on/off printing of warnings. Repeating B<-warnings> increases the
+warning level, i.e. more warnings are printed. Currently increasing to
+level two causes flagging of unescaped "E<lt>,E<gt>" characters.
=item I<file>
@@ -85,6 +87,8 @@ 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.
+Directories are ignored, an appropriate warning message is printed.
+
B<podchecker> invokes the B<podchecker()> function exported by B<Pod::Checker>
Please see L<Pod::Checker/podchecker()> for more details.
@@ -124,24 +128,34 @@ use Pod::Usage;
use Getopt::Long;
## Define options
-my %options = (
- "help" => 0,
- "man" => 0,
- "warnings" => 1,
-);
+my %options;
## Parse options
-GetOptions(\%options, "help", "man", "warnings!") || pod2usage(2);
+GetOptions(\%options, qw(help man warnings+ nowarnings)) || pod2usage(2);
pod2usage(1) if ($options{help});
pod2usage(-verbose => 2) if ($options{man});
+if($options{nowarnings}) {
+ $options{warnings} = 0;
+}
+elsif(!defined $options{warnings}) {
+ $options{warnings} = 1; # default is warnings on
+}
+
## 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);
+@ARGV = qw(-) unless(@ARGV);
for (@ARGV) {
+ if($_ eq '-') {
+ $_ = "<&STDIN";
+ }
+ elsif(-d) {
+ warn "podchecker: Warning: Ignoring directory '$_'\n";
+ next;
+ }
my $s = podchecker($_, undef, '-warnings' => $options{warnings});
if($s > 0) {
# errors occurred
diff --git a/gnu/usr.bin/perl/pod/podselect.PL b/gnu/usr.bin/perl/pod/podselect.PL
index f2ba80a73b5..b6b8c9b9e43 100644
--- a/gnu/usr.bin/perl/pod/podselect.PL
+++ b/gnu/usr.bin/perl/pod/podselect.PL
@@ -39,7 +39,7 @@ print OUT <<'!NO!SUBS!';
#############################################################################
# podselect -- command to invoke the podselect function in Pod::Select
#
-# Copyright (c) 1996-1999 by Bradford Appleton. All rights reserved.
+# 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.
diff --git a/gnu/usr.bin/perl/pp.sym b/gnu/usr.bin/perl/pp.sym
index 0e6c056611a..2bd39221536 100644
--- a/gnu/usr.bin/perl/pp.sym
+++ b/gnu/usr.bin/perl/pp.sym
@@ -30,6 +30,7 @@ Perl_ck_null
Perl_ck_open
Perl_ck_repeat
Perl_ck_require
+Perl_ck_return
Perl_ck_rfun
Perl_ck_rvconst
Perl_ck_sassign
@@ -40,6 +41,7 @@ Perl_ck_sort
Perl_ck_spair
Perl_ck_split
Perl_ck_subr
+Perl_ck_substr
Perl_ck_svconst
Perl_ck_trunc
Perl_pp_null
diff --git a/gnu/usr.bin/perl/pp_proto.h b/gnu/usr.bin/perl/pp_proto.h
index 4ce9d745946..c3b24e864ba 100644
--- a/gnu/usr.bin/perl/pp_proto.h
+++ b/gnu/usr.bin/perl/pp_proto.h
@@ -29,6 +29,7 @@ PERL_CKDEF(Perl_ck_null)
PERL_CKDEF(Perl_ck_open)
PERL_CKDEF(Perl_ck_repeat)
PERL_CKDEF(Perl_ck_require)
+PERL_CKDEF(Perl_ck_return)
PERL_CKDEF(Perl_ck_rfun)
PERL_CKDEF(Perl_ck_rvconst)
PERL_CKDEF(Perl_ck_sassign)
@@ -39,6 +40,7 @@ PERL_CKDEF(Perl_ck_sort)
PERL_CKDEF(Perl_ck_spair)
PERL_CKDEF(Perl_ck_split)
PERL_CKDEF(Perl_ck_subr)
+PERL_CKDEF(Perl_ck_substr)
PERL_CKDEF(Perl_ck_svconst)
PERL_CKDEF(Perl_ck_trunc)
diff --git a/gnu/usr.bin/perl/regcomp.pl b/gnu/usr.bin/perl/regcomp.pl
index d7d07330109..6ae847882d4 100644
--- a/gnu/usr.bin/perl/regcomp.pl
+++ b/gnu/usr.bin/perl/regcomp.pl
@@ -57,7 +57,7 @@ print OUT <<EOP;
#ifdef REG_COMP_C
-const static U8 regarglen[] = {
+static const U8 regarglen[] = {
EOP
$ind = 0;
@@ -73,7 +73,7 @@ EOP
print OUT <<EOP;
};
-const static char reg_off_by_arg[] = {
+static const char reg_off_by_arg[] = {
EOP
$ind = 0;
@@ -89,7 +89,7 @@ print OUT <<EOP;
};
#ifdef DEBUGGING
-const static char * const reg_name[] = {
+static const char * const reg_name[] = {
EOP
$ind = 0;
@@ -105,7 +105,7 @@ EOP
print OUT <<EOP;
};
-const static int reg_num = $tot;
+static const int reg_num = $tot;
#endif /* DEBUGGING */
#endif /* REG_COMP_C */
diff --git a/gnu/usr.bin/perl/regnodes.h b/gnu/usr.bin/perl/regnodes.h
index c5725cd7071..89c78e6bace 100644
--- a/gnu/usr.bin/perl/regnodes.h
+++ b/gnu/usr.bin/perl/regnodes.h
@@ -173,7 +173,7 @@ EXTCONST U8 PL_regkind[] = {
#ifdef REG_COMP_C
-const static U8 regarglen[] = {
+static const U8 regarglen[] = {
0, /* END */
0, /* SUCCEED */
0, /* BOL */
@@ -256,7 +256,7 @@ const static U8 regarglen[] = {
0, /* OPTIMIZED */
};
-const static char reg_off_by_arg[] = {
+static const char reg_off_by_arg[] = {
0, /* END */
0, /* SUCCEED */
0, /* BOL */
@@ -340,7 +340,7 @@ const static char reg_off_by_arg[] = {
};
#ifdef DEBUGGING
-const static char * const reg_name[] = {
+static const char * const reg_name[] = {
"END", /* 0 */
"SUCCEED", /* 0x1 */
"BOL", /* 0x2 */
@@ -423,7 +423,7 @@ const static char * const reg_name[] = {
"OPTIMIZED", /* 0x4f */
};
-const static int reg_num = 80;
+static const int reg_num = 80;
#endif /* DEBUGGING */
#endif /* REG_COMP_C */
diff --git a/gnu/usr.bin/perl/t/UTEST b/gnu/usr.bin/perl/t/UTEST
index b5f285bd599..9c1dfc0d800 100644
--- a/gnu/usr.bin/perl/t/UTEST
+++ b/gnu/usr.bin/perl/t/UTEST
@@ -81,7 +81,10 @@ EOT
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";
+ open(RESULTS, "./perl -I../lib ../utils/perlcc -o ./$test.plc ./$test "
+ ." && ./$test.plc |")
+ or print "can't compile.\n";
+ unlink "./$test.plc";
}
}
else {
diff --git a/gnu/usr.bin/perl/t/base/rs.t b/gnu/usr.bin/perl/t/base/rs.t
index 021d699e2e8..e470f3a30c1 100644
--- a/gnu/usr.bin/perl/t/base/rs.t
+++ b/gnu/usr.bin/perl/t/base/rs.t
@@ -6,6 +6,8 @@ print "1..14\n";
$teststring = "1\n12\n123\n1234\n1234\n12345\n\n123456\n1234567\n";
# Create our test datafile
+1 while unlink 'foo'; # in case junk left around
+rmdir 'foo';
open TESTFILE, ">./foo" or die "error $! $^E opening";
binmode TESTFILE;
print TESTFILE $teststring;
diff --git a/gnu/usr.bin/perl/t/comp/bproto.t b/gnu/usr.bin/perl/t/comp/bproto.t
index 01efb8401cc..70748be551c 100644
--- a/gnu/usr.bin/perl/t/comp/bproto.t
+++ b/gnu/usr.bin/perl/t/comp/bproto.t
@@ -5,7 +5,7 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ @INC = '../lib';
}
print "1..10\n";
diff --git a/gnu/usr.bin/perl/t/comp/require.t b/gnu/usr.bin/perl/t/comp/require.t
index 1d926873556..1b0af9ff5e8 100644
--- a/gnu/usr.bin/perl/t/comp/require.t
+++ b/gnu/usr.bin/perl/t/comp/require.t
@@ -2,12 +2,21 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, ('.', '../lib');
+ @INC = '.';
+ push @INC, '../lib';
}
# don't make this lexical
$i = 1;
-print "1..20\n";
+# Tests 21 .. 23 work only with non broken UTF16-as-code implementations,
+# i.e. not EBCDIC Perls.
+my $Is_EBCDIC = ord('A') == 193 ? 1 : 0;
+if ($Is_EBCDIC) {
+ print "1..20\n";
+}
+else {
+ print "1..23\n";
+}
sub do_require {
%INC = ();
@@ -19,6 +28,8 @@ sub do_require {
sub write_file {
my $f = shift;
open(REQ,">$f") or die "Can't write '$f': $!";
+ binmode REQ;
+ use bytes;
print REQ @_;
close REQ;
}
@@ -122,7 +133,21 @@ do "bleah.do";
dofile();
sub dofile { do "bleah.do"; };
print $x;
-$i++;
+
+exit if $Is_EBCDIC;
+
+# UTF-encoded things
+my $utf8 = chr(0xFEFF);
+
+$i++; do_require(qq(${utf8}print "ok $i\n"; 1;\n));
+
+sub bytes_to_utf16 {
+ my $utf16 = pack("$_[0]*", unpack("C*", $_[1]));
+ return @_ == 3 && $_[2] ? pack("$_[0]", 0xFEFF) . $utf16 : $utf16;
+}
+
+$i++; do_require(bytes_to_utf16('n', qq(print "ok $i\\n"; 1;\n), 1)); # BE
+$i++; do_require(bytes_to_utf16('v', qq(print "ok $i\\n"; 1;\n), 1)); # LE
END { 1 while unlink 'bleah.pm'; 1 while unlink 'bleah.do'; }
diff --git a/gnu/usr.bin/perl/t/io/openpid.t b/gnu/usr.bin/perl/t/io/openpid.t
index 80c6bde5d1f..7c04a29fe81 100644
--- a/gnu/usr.bin/perl/t/io/openpid.t
+++ b/gnu/usr.bin/perl/t/io/openpid.t
@@ -9,17 +9,15 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ @INC = '../lib';
if ($^O eq 'dos') {
print "1..0 # Skip: no multitasking\n";
exit 0;
}
}
-
-use FileHandle;
use Config;
-autoflush STDOUT 1;
+$| = 1;
$SIG{PIPE} = 'IGNORE';
print "1..10\n";
@@ -33,10 +31,8 @@ $perl = qq[$^X "-I../lib"];
# 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;"/;
+$cmd1 = qq/$perl -e "\$|=1; print qq[first process\\n]; sleep 30;"/;
+$cmd2 = qq/$perl -e "\$|=1; print qq[second process\\n]; sleep 30;"/;
$cmd3 = qq/$perl -e "print <>;"/; # hangs waiting for end of STDIN
$cmd4 = qq/$perl -e "print scalar <>;"/;
@@ -76,9 +72,9 @@ 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;
+select(FH4); $| = 1; select(STDOUT);
+
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 "
diff --git a/gnu/usr.bin/perl/t/lib/ansicolor.t b/gnu/usr.bin/perl/t/lib/ansicolor.t
index 3e16dce653a..f38e905cdd8 100644
--- a/gnu/usr.bin/perl/t/lib/ansicolor.t
+++ b/gnu/usr.bin/perl/t/lib/ansicolor.t
@@ -1,8 +1,6 @@
-#!./perl
-
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ @INC = '../lib';
}
# Test suite for the Term::ANSIColor Perl module. Before `make install' is
@@ -13,7 +11,7 @@ BEGIN {
# Ensure module can be loaded
############################################################################
-BEGIN { $| = 1; print "1..7\n" }
+BEGIN { $| = 1; print "1..8\n" }
END { print "not ok 1\n" unless $loaded }
use Term::ANSIColor qw(:constants color colored);
$loaded = 1;
@@ -71,3 +69,13 @@ if (colored ("test\ntest\r\r\n\r\n", 'bold')
} else {
print "not ok 7\n";
}
+
+# Test the array ref form.
+$Term::ANSIColor::EACHLINE = "\n";
+if (colored (['bold', 'on_green'], "test\n", "\n", "test")
+ eq "\e[1;42mtest\e[0m\n\n\e[1;42mtest\e[0m") {
+ print "ok 8\n";
+} else {
+ print colored (['bold', 'on_green'], "test\n", "\n", "test");
+ print "not ok 8\n";
+}
diff --git a/gnu/usr.bin/perl/t/lib/attrs.t b/gnu/usr.bin/perl/t/lib/attrs.t
index eb8c8c4a1aa..440122c2b4b 100644
--- a/gnu/usr.bin/perl/t/lib/attrs.t
+++ b/gnu/usr.bin/perl/t/lib/attrs.t
@@ -4,7 +4,7 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ @INC = '../lib';
eval 'require attrs; 1' or do {
print "1..0\n";
exit 0;
diff --git a/gnu/usr.bin/perl/t/lib/b.t b/gnu/usr.bin/perl/t/lib/b.t
new file mode 100644
index 00000000000..22156c2354a
--- /dev/null
+++ b/gnu/usr.bin/perl/t/lib/b.t
@@ -0,0 +1,163 @@
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ if ($^O eq 'MacOS') {
+ @INC = qw(: ::lib ::macos:lib);
+ } else {
+ @INC = '.';
+ push @INC, '../lib';
+ }
+}
+
+$| = 1;
+use warnings;
+use strict;
+use Config;
+
+print "1..15\n";
+
+my $test = 1;
+
+sub ok { print "ok $test\n"; $test++ }
+
+use B::Deparse;
+my $deparse = B::Deparse->new() or print "not ";
+ok;
+
+print "not " if "{\n 1;\n}" ne $deparse->coderef2text(sub {1});
+ok;
+
+print "not " if "{\n '???';\n 2;\n}" ne
+ $deparse->coderef2text(sub {1;2});
+ok;
+
+print "not " if "{\n \$test /= 2 if ++\$test;\n}" ne
+ $deparse->coderef2text(sub {++$test and $test/=2;});
+ok;
+{
+my $a = <<'EOF';
+{
+ $test = sub : lvalue {
+ my $x;
+ }
+ ;
+}
+EOF
+chomp $a;
+print "not " if $deparse->coderef2text(sub{$test = sub : lvalue{my $x}}) ne $a;
+ok;
+
+$a =~ s/lvalue/method/;
+print "not " if $deparse->coderef2text(sub{$test = sub : method{my $x}}) ne $a;
+ok;
+
+$a =~ s/method/locked method/;
+print "not " if $deparse->coderef2text(sub{$test = sub : method locked {my $x}})
+ ne $a;
+ok;
+}
+
+my $a;
+my $Is_VMS = $^O eq 'VMS';
+my $Is_MacOS = $^O eq 'MacOS';
+
+my $path = join " ", map { qq["-I$_"] } @INC;
+my $redir = $Is_MacOS ? "" : "2>&1";
+
+$a = `$^X $path "-MO=Deparse" -anle 1 $redir`;
+$a =~ s/-e syntax OK\n//g;
+$a =~ s{\\340\\242}{\\s} if (ord("\\") == 224); # EBCDIC, cp 1047 or 037
+$a =~ s{\\274\\242}{\\s} if (ord("\\") == 188); # $^O eq 'posix-bc'
+$b = <<'EOF';
+
+LINE: while (defined($_ = <ARGV>)) {
+ chomp $_;
+ @F = split(/\s+/, $_, 0);
+ '???';
+}
+
+EOF
+print "# [$a]\n\# vs\n# [$b]\nnot " if $a ne $b;
+ok;
+
+#6
+$a = `$^X $path "-MO=Debug" -e 1 $redir`;
+print "not " unless $a =~
+/\bLISTOP\b.*\bOP\b.*\bCOP\b.*\bOP\b/s;
+ok;
+
+#7
+$a = `$^X $path "-MO=Terse" -e 1 $redir`;
+print "not " unless $a =~
+/\bLISTOP\b.*leave.*\n OP\b.*enter.*\n COP\b.*nextstate.*\n OP\b.*null/s;
+ok;
+
+$a = `$^X $path "-MO=Terse" -ane "s/foo/bar/" $redir`;
+$a =~ s/\(0x[^)]+\)//g;
+$a =~ s/\[[^\]]+\]//g;
+$a =~ s/-e syntax OK//;
+$a =~ s/[^a-z ]+//g;
+$a =~ s/\s+/ /g;
+$a =~ s/\b(s|foo|bar|ullsv)\b\s?//g;
+$a =~ s/^\s+//;
+$a =~ s/\s+$//;
+my $is_thread = $Config{use5005threads} && $Config{use5005threads} eq 'define';
+if ($is_thread) {
+ $b=<<EOF;
+leave enter nextstate label leaveloop enterloop null and defined null
+threadsv readline gv lineseq nextstate aassign null pushmark split pushre
+threadsv const null pushmark rvav gv nextstate subst const unstack nextstate
+EOF
+} else {
+ $b=<<EOF;
+leave enter nextstate label leaveloop enterloop null and defined null
+null gvsv readline gv lineseq nextstate aassign null pushmark split pushre
+null gvsv const null pushmark rvav gv nextstate subst const unstack nextstate
+EOF
+}
+$b=~s/\n/ /g;$b=~s/\s+/ /g;
+$b =~ s/\s+$//;
+print "# [$a]\n# vs\n# [$b]\nnot " if $a ne $b;
+ok;
+
+chomp($a = `$^X $path "-MB::Stash" "-Mwarnings" -e1`);
+$a = join ',', sort split /,/, $a;
+$a =~ s/-uWin32,// if $^O eq 'MSWin32';
+$a =~ s/-u(Cwd|File|File::Copy|OS2),//g if $^O eq 'os2';
+$a =~ s/-uCwd,// if $^O eq 'cygwin';
+if ($Config{static_ext} eq ' ') {
+ $b = '-uCarp,-uCarp::Heavy,-uDB,-uExporter,-uExporter::Heavy,-uattributes,'
+ . '-umain,-uwarnings';
+ if (ord('A') == 193) { # EBCDIC sort order is qw(a A) not qw(A a)
+ $b = join ',', sort split /,/, $b;
+ }
+ print "# [$a] vs [$b]\nnot " if $a ne $b;
+ ok;
+} else {
+ print "ok $test # skipped: one or more static extensions\n"; $test++;
+}
+
+if ($is_thread) {
+ print "# use5005threads: test $test skipped\n";
+} else {
+ $a = `$^X $path "-MO=Showlex" -e "my %one" $redir`;
+ if (ord('A') != 193) { # ASCIIish
+ print "# [$a]\nnot " unless $a =~ /sv_undef.*PVNV.*%one.*sv_undef.*HV/s;
+ }
+ else { # EBCDICish C<1: PVNV (0x1a7ede34) "%\226\225\205">
+ print "# [$a]\nnot " unless $a =~ /sv_undef.*PVNV.*%\\[0-9].*sv_undef.*HV/s;
+ }
+}
+ok;
+
+# Bug 20001204.07
+{
+my $foo = $deparse->coderef2text(sub { { 234; }});
+# Constants don't get optimised here.
+print "not " unless $foo =~ /{.*{.*234;.*}.*}/sm;
+ok;
+$foo = $deparse->coderef2text(sub { { 234; } continue { 123; } });
+print "not " unless $foo =~ /{.*{.*234;.*}.*continue.*{.*123.*}/sm;
+ok;
+}
diff --git a/gnu/usr.bin/perl/t/lib/bigfltpm.t b/gnu/usr.bin/perl/t/lib/bigfltpm.t
index 5d97f1b4f65..aa4565167d9 100644
--- a/gnu/usr.bin/perl/t/lib/bigfltpm.t
+++ b/gnu/usr.bin/perl/t/lib/bigfltpm.t
@@ -9,7 +9,7 @@ use Math::BigFloat;
$test = 0;
$| = 1;
-print "1..362\n";
+print "1..370\n";
while (<DATA>) {
chop;
if (s/^&//) {
@@ -51,6 +51,8 @@ while (<DATA>) {
$try .= "\$x * \$y;";
} elsif ($f eq "fdiv") {
$try .= "\$x / \$y;";
+ } elsif ($f eq "fmod") {
+ $try .= "\$x % \$y;";
} else { warn "Unknown op"; }
}
#print ">>>",$try,"<<<\n";
@@ -65,22 +67,26 @@ while (<DATA>) {
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";
- }
+ else {
+
+ $ans1_str = defined $ans1? "$ans1" : "";
+ if ($ans1_str 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.
+abc:NaN
+ 1 a:NaN
+1bcd2:NaN
+11111b:NaN
++1z:NaN
+-1z:NaN
0:0.
+0:0.
+00:0.
@@ -98,7 +104,7 @@ abc:NaN.
-001:-1.
-123456789:-123456789.
-00000100000:-100000.
-123.456a:NaN.
+123.456a:NaN
123.456:123.456
0.01:.01
.002:.002
@@ -113,7 +119,7 @@ abc:NaN.
-3e111:-3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.
-4e-1111:-.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004
&fneg
-abd:NaN.
+abc:NaN
+0:0.
+1:-1.
-1:1.
@@ -122,7 +128,7 @@ abd:NaN.
+123.456789:-123.456789
-123456.789:123456.789
&fabs
-abc:NaN.
+abc:NaN
+0:0.
+1:1.
-1:1.
@@ -249,13 +255,13 @@ $Math::BigFloat::rnd_mode = 'even'
-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+)
++6.25:-1:/6.(?:2(?:0{5}\d+)?|29{5}\d+)
+-6.25:-1:/-6.(?:2(?:0{5}\d+)?|29{5}\d+)
++6.35:-1:/6.(?:4|39{5}\d+|29{8}\d+)
+-6.35:-1:/-6.(?:4|39{5}\d+|29{8}\d+)
-0.0065:-1:0
-0.0065:-2:/-0\.01|-1e-02
--0.0065:-3:/-0\.006|-6e-03
+-0.0065:-3:/-0\.006|-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
&fcmp
@@ -286,9 +292,9 @@ abc:+0:
-123:-124:1
-124:-123:-1
&fadd
-abc:abc:NaN.
-abc:+0:NaN.
-+0:abc:NaN.
+abc:abc:NaN
+abc:+0:NaN
++0:abc:NaN
+0:+0:0.
+1:+0:1.
+0:+1:1.
@@ -324,9 +330,9 @@ abc:+0:NaN.
-123456789:-987654321:-1111111110.
+123456789:-987654321:-864197532.
&fsub
-abc:abc:NaN.
-abc:+0:NaN.
-+0:abc:NaN.
+abc:abc:NaN
+abc:+0:NaN
++0:abc:NaN
+0:+0:0.
+1:+0:1.
+0:+1:-1.
@@ -362,9 +368,9 @@ abc:+0:NaN.
-123456789:-987654321:864197532.
+123456789:-987654321:1111111110.
&fmul
-abc:abc:NaN.
-abc:+0:NaN.
-+0:abc:NaN.
+abc:abc:NaN
+abc:+0:NaN
++0:abc:NaN
+0:+0:0.
+0:+1:0.
+1:+0:0.
@@ -395,14 +401,14 @@ abc:+0:NaN.
+88888888888:+9:799999999992.
+99999999999:+9:899999999991.
&fdiv
-abc:abc:NaN.
-abc:+1:abc:NaN.
-+1:abc:NaN.
-+0:+0:NaN.
+abc:abc:NaN
+abc:+1:abc:NaN
++1:abc:NaN
++0:+0:NaN
+0:+1:0.
-+1:+0:NaN.
++1:+0:NaN
+0:-1:0.
--1:+0:NaN.
+-1:+0:NaN
+1:+1:1.
-1:-1:1.
+1:-1:-1.
@@ -461,3 +467,12 @@ $Math::BigFloat::div_scale = 40
+100:10.
+123.456:11.11107555549866648462149404118219234119
+15241.383936:123.456
+&fmod
++0:0:NaN
++0:1:0.
++3:1:0.
++5:2:1.
++9:4:1.
++9:5:4.
++9000:56:40.
++56:9000:56.
diff --git a/gnu/usr.bin/perl/t/lib/bigint.t b/gnu/usr.bin/perl/t/lib/bigint.t
index d2d520ea3c5..034c5c64571 100644
--- a/gnu/usr.bin/perl/t/lib/bigint.t
+++ b/gnu/usr.bin/perl/t/lib/bigint.t
@@ -1,6 +1,6 @@
#!./perl
-BEGIN { unshift @INC, '../lib' }
+BEGIN { @INC = '../lib' }
require "bigint.pl";
$test = 0;
diff --git a/gnu/usr.bin/perl/t/lib/cgi-esc.t b/gnu/usr.bin/perl/t/lib/cgi-esc.t
new file mode 100644
index 00000000000..f0471cfed37
--- /dev/null
+++ b/gnu/usr.bin/perl/t/lib/cgi-esc.t
@@ -0,0 +1,56 @@
+#!/usr/local/bin/perl -w
+
+BEGIN {
+ chdir('t') if -d 't';
+ @INC = '../lib';
+}
+
+# Test ability to escape() and unescape() punctuation characters
+# except for qw(- . _).
+######################### We start with some black magic to print on failure.
+use lib '../blib/lib','../blib/arch';
+
+BEGIN {$| = 1; print "1..59\n"; }
+END {print "not ok 1\n" unless $loaded;}
+use Config;
+use CGI::Util qw(escape unescape);
+$loaded = 1;
+print "ok 1\n";
+
+######################### End of black magic.
+
+# util
+sub test {
+ local($^W) = 0;
+ my($num, $true,$msg) = @_;
+ print($true ? "ok $num\n" : "not ok $num $msg\n");
+}
+
+# ASCII order, ASCII codepoints, ASCII repertoire
+
+my %punct = (
+ ' ' => '20', '!' => '21', '"' => '22', '#' => '23',
+ '$' => '24', '%' => '25', '&' => '26', '\'' => '27',
+ '(' => '28', ')' => '29', '*' => '2A', '+' => '2B',
+ ',' => '2C', '/' => '2F', # '-' => '2D', '.' => '2E'
+ ':' => '3A', ';' => '3B', '<' => '3C', '=' => '3D',
+ '>' => '3E', '?' => '3F', '[' => '5B', '\\' => '5C',
+ ']' => '5D', '^' => '5E', '`' => '60', # '_' => '5F',
+ '{' => '7B', '|' => '7C', '}' => '7D', '~' => '7E',
+ );
+
+# The sort order may not be ASCII on EBCDIC machines:
+
+my $i = 1;
+
+foreach(sort(keys(%punct))) {
+ $i++;
+ my $escape = "AbC\%$punct{$_}dEF";
+ my $cgi_escape = escape("AbC$_" . "dEF");
+ test($i, $escape eq $cgi_escape , "# $escape ne $cgi_escape");
+ $i++;
+ my $unescape = "AbC$_" . "dEF";
+ my $cgi_unescape = unescape("AbC\%$punct{$_}dEF");
+ test($i, $unescape eq $cgi_unescape , "# $unescape ne $cgi_unescape");
+}
+
diff --git a/gnu/usr.bin/perl/t/lib/cgi-form.t b/gnu/usr.bin/perl/t/lib/cgi-form.t
index e3cba5fc205..29229034992 100644
--- a/gnu/usr.bin/perl/t/lib/cgi-form.t
+++ b/gnu/usr.bin/perl/t/lib/cgi-form.t
@@ -1,13 +1,14 @@
-#!./perl
-
-# Test ability to retrieve HTTP request info
-######################### We start with some black magic to print on failure.
+#!/usr/local/bin/perl -w
BEGIN {
- chdir 't' if -d 't';
- unshift @INC, '../lib' if -d '../lib';
+ chdir('t') if -d 't';
+ @INC = '../lib';
}
+# Test ability to retrieve HTTP request info
+######################### We start with some black magic to print on failure.
+use lib '../blib/lib','../blib/arch';
+
BEGIN {$| = 1; print "1..17\n"; }
END {print "not ok 1\n" unless $loaded;}
use CGI (':standard','-no_debug');
@@ -23,6 +24,15 @@ sub test {
print($true ? "ok $num\n" : "not ok $num $msg\n");
}
+my $CRLF = "\015\012";
+if ($^O eq 'VMS') {
+ $CRLF = "\n"; # via web server carriage is inserted automatically
+}
+if (ord("\t") != 9) { # EBCDIC?
+ $CRLF = "\r\n";
+}
+
+
# Set up a CGI environment
$ENV{REQUEST_METHOD}='GET';
$ENV{QUERY_STRING} ='game=chess&game=checkers&weather=dull';
@@ -33,49 +43,48 @@ $ENV{SERVER_PROTOCOL} = 'HTTP/1.0';
$ENV{SERVER_PORT} = 8080;
$ENV{SERVER_NAME} = 'the.good.ship.lollypop.com';
-test(2,start_form(-action=>'foobar',-method=>GET) eq
- qq(<FORM METHOD="GET" ACTION="foobar" ENCTYPE="application/x-www-form-urlencoded">\n),
+test(2,start_form(-action=>'foobar',-method=>'get') eq
+ qq(<form method="get" action="foobar" enctype="application/x-www-form-urlencoded">\n),
"start_form()");
-test(3,submit() eq qq(<INPUT TYPE="submit" NAME=".submit">),"submit()");
-test(4,submit(-name=>'foo',-value=>'bar') eq qq(<INPUT TYPE="submit" NAME="foo" VALUE="bar">),"submit(-name,-value)");
-test(5,submit({-name=>'foo',-value=>'bar'}) eq qq(<INPUT TYPE="submit" NAME="foo" VALUE="bar">),"submit({-name,-value})");
-test(6,textfield(-name=>'weather') eq qq(<INPUT TYPE="text" NAME="weather" VALUE="dull">),"textfield({-name})");
-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">),
+test(3,submit() eq qq(<input type="submit" name=".submit" />),"submit()");
+test(4,submit(-name=>'foo',-value=>'bar') eq qq(<input type="submit" name="foo" value="bar" />),"submit(-name,-value)");
+test(5,submit({-name=>'foo',-value=>'bar'}) eq qq(<input type="submit" name="foo" value="bar" />),"submit({-name,-value})");
+test(6,textfield(-name=>'weather') eq qq(<input type="text" name="weather" value="dull" />),"textfield({-name})");
+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),
+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),
+ 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),
+ 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),
+ qq(<input type="checkbox" name="weather" value="dull" checked />forecast),
"checkbox()");
test(13,radio_group(-name=>'game') eq
- qq(<INPUT TYPE="radio" NAME="game" VALUE="chess" CHECKED>chess <INPUT TYPE="radio" NAME="game" VALUE="checkers">checkers),
+ qq(<input type="radio" name="game" value="chess" checked />chess <input type="radio" name="game" value="checkers" />checkers),
'radio_group()');
test(14,radio_group(-name=>'game',-labels=>{'chess'=>'ping pong'}) eq
- qq(<INPUT TYPE="radio" NAME="game" VALUE="chess" CHECKED>ping pong <INPUT TYPE="radio" NAME="game" VALUE="checkers">checkers),
+ qq(<input type="radio" name="game" value="chess" checked />ping pong <input type="radio" name="game" value="checkers" />checkers),
'radio_group()');
test(15, checkbox_group(-name=>'game',-Values=>[qw/checkers chess cribbage/]) eq
- qq(<INPUT TYPE="checkbox" NAME="game" VALUE="checkers" CHECKED>checkers <INPUT TYPE="checkbox" NAME="game" VALUE="chess" CHECKED>chess <INPUT TYPE="checkbox" NAME="game" VALUE="cribbage">cribbage),
+ qq(<input type="checkbox" name="game" value="checkers" checked />checkers <input type="checkbox" name="game" value="chess" checked />chess <input type="checkbox" name="game" value="cribbage" />cribbage),
'checkbox_group()');
-test(16, checkbox_group(-name=>'game',-Values=>[qw/checkers chess cribbage/],-Defaults=>['cribbage'],-override=>1) eq
- qq(<INPUT TYPE="checkbox" NAME="game" VALUE="checkers">checkers <INPUT TYPE="checkbox" NAME="game" VALUE="chess">chess <INPUT TYPE="checkbox" NAME="game" VALUE="cribbage" CHECKED>cribbage),
+test(16, checkbox_group(-name=>'game',-values=>[qw/checkers chess cribbage/],-defaults=>['cribbage'],-override=>1) eq
+ qq(<input type="checkbox" name="game" value="checkers" />checkers <input type="checkbox" name="game" value="chess" />chess <input type="checkbox" name="game" value="cribbage" checked />cribbage),
'checkbox_group()');
-
-test(17, popup_menu(-name=>'game',-Values=>[qw/checkers chess cribbage/],-Default=>'cribbage',-override=>1) eq <<END,'checkbox_group()');
-<SELECT NAME="game">
-<OPTION VALUE="checkers">checkers
-<OPTION VALUE="chess">chess
-<OPTION SELECTED VALUE="cribbage">cribbage
-</SELECT>
+test(17, popup_menu(-name=>'game',-values=>[qw/checkers chess cribbage/],-default=>'cribbage',-override=>1) eq <<END,'checkbox_group()');
+<select name="game">
+<option value="checkers">checkers</option>
+<option value="chess">chess</option>
+<option selected value="cribbage">cribbage</option>
+</select>
END
diff --git a/gnu/usr.bin/perl/t/lib/cgi-function.t b/gnu/usr.bin/perl/t/lib/cgi-function.t
index b4cd56811f5..3b9722e3bd5 100644
--- a/gnu/usr.bin/perl/t/lib/cgi-function.t
+++ b/gnu/usr.bin/perl/t/lib/cgi-function.t
@@ -1,14 +1,15 @@
-#!./perl
-
-# Test ability to retrieve HTTP request info
-######################### We start with some black magic to print on failure.
+#!/usr/local/bin/perl -w
BEGIN {
- chdir 't' if -d 't';
- unshift @INC, '../lib' if -d '../lib';
+ chdir('t') if -d 't';
+ @INC = '../lib';
}
-BEGIN {$| = 1; print "1..24\n"; }
+# Test ability to retrieve HTTP request info
+######################### We start with some black magic to print on failure.
+use lib '../blib/lib','../blib/arch';
+
+BEGIN {$| = 1; print "1..27\n"; }
END {print "not ok 1\n" unless $loaded;}
use Config;
use CGI (':standard','keywords');
@@ -24,6 +25,22 @@ sub test {
print($true ? "ok $num\n" : "not ok $num $msg\n");
}
+my $CRLF = "\015\012";
+
+# A peculiarity of sending "\n" through MBX|Socket|web-server on VMS
+# is that a CR character gets inserted automatically in the web server
+# case but not internal to perl's double quoted strings "\n". This
+# test would need to be modified to use the "\015\012" on VMS if it
+# were actually run through a web server.
+# Thanks to Peter Prymmer for this
+
+if ($^O eq 'VMS') { $CRLF = "\n"; }
+
+# Web servers on EBCDIC hosts are typically set up to do an EBCDIC -> ASCII
+# translation hence CRLF is used as \r\n within CGI.pm on such machines.
+
+if (ord("\t") != 9) { $CRLF = "\r\n"; }
+
# Set up a CGI environment
$ENV{REQUEST_METHOD}='GET';
$ENV{QUERY_STRING} ='game=chess&game=checkers&weather=dull';
@@ -36,7 +53,7 @@ $ENV{SERVER_NAME} = 'the.good.ship.lollypop.com';
$ENV{HTTP_LOVE} = 'true';
test(2,request_method() eq 'GET',"CGI::request_method()");
-test(3,query_string() eq 'game=chess&game=checkers&weather=dull',"CGI::query_string()");
+test(3,query_string() eq 'game=chess;game=checkers;weather=dull',"CGI::query_string()");
test(4,param() == 2,"CGI::param()");
test(5,join(' ',sort {$a cmp $b} param()) eq 'game weather',"CGI::param()");
test(6,param('game') eq 'chess',"CGI::param()");
@@ -44,18 +61,18 @@ test(7,param('weather') eq 'dull',"CGI::param()");
test(8,join(' ',param('game')) eq 'chess checkers',"CGI::param()");
test(9,param(-name=>'foo',-value=>'bar'),'CGI::param() put');
test(10,param(-name=>'foo') eq 'bar','CGI::param() get');
-test(11,query_string() eq 'game=chess&game=checkers&weather=dull&foo=bar',"CGI::query_string() redux");
+test(11,query_string() eq 'game=chess;game=checkers;weather=dull;foo=bar',"CGI::query_string() redux");
test(12,http('love') eq 'true',"CGI::http()");
test(13,script_name() eq '/cgi-bin/foo.cgi',"CGI::script_name()");
test(14,url() eq 'http://the.good.ship.lollypop.com:8080/cgi-bin/foo.cgi',"CGI::url()");
test(15,self_url() eq
- 'http://the.good.ship.lollypop.com:8080/cgi-bin/foo.cgi/somewhere/else?game=chess&game=checkers&weather=dull&foo=bar',
+ 'http://the.good.ship.lollypop.com:8080/cgi-bin/foo.cgi/somewhere/else?game=chess;game=checkers;weather=dull;foo=bar',
"CGI::url()");
test(16,url(-absolute=>1) eq '/cgi-bin/foo.cgi','CGI::url(-absolute=>1)');
test(17,url(-relative=>1) eq 'foo.cgi','CGI::url(-relative=>1)');
test(18,url(-relative=>1,-path=>1) eq 'foo.cgi/somewhere/else','CGI::url(-relative=>1,-path=>1)');
test(19,url(-relative=>1,-path=>1,-query=>1) eq
- 'foo.cgi/somewhere/else?game=chess&game=checkers&weather=dull&foo=bar',
+ 'foo.cgi/somewhere/else?game=chess;game=checkers;weather=dull;foo=bar',
'CGI::url(-relative=>1,-path=>1,-query=>1)');
Delete('foo');
test(20,!param('foo'),'CGI::delete()');
@@ -65,21 +82,25 @@ $ENV{QUERY_STRING}='mary+had+a+little+lamb';
test(21,join(' ',keywords()) eq 'mary had a little lamb','CGI::keywords');
test(22,join(' ',param('keywords')) eq 'mary had a little lamb','CGI::keywords');
-if (!$Config{d_fork} or $^O eq 'MSWin32' or $^O eq 'VMS') {
- for (23,24) { print "ok $_ # Skipped: fork n/a\n" }
-}
-else {
- CGI::_reset_globals;
- $test_string = 'game=soccer&game=baseball&weather=nice';
- $ENV{REQUEST_METHOD}='POST';
- $ENV{CONTENT_LENGTH}=length($test_string);
- $ENV{QUERY_STRING}='big_balls=basketball&small_balls=golf';
- if (open(CHILD,"|-")) { # cparent
- print CHILD $test_string;
- close CHILD;
- exit 0;
- }
- # at this point, we're in a new (child) process
- test(23,param('weather') eq 'nice',"CGI::param() from POST");
- test(24,url_param('big_balls') eq 'basketball',"CGI::url_param()");
+CGI::_reset_globals;
+if ($Config{d_fork}) {
+ $test_string = 'game=soccer&game=baseball&weather=nice';
+ $ENV{REQUEST_METHOD}='POST';
+ $ENV{CONTENT_LENGTH}=length($test_string);
+ $ENV{QUERY_STRING}='big_balls=basketball&small_balls=golf';
+ if (open(CHILD,"|-")) { # cparent
+ print CHILD $test_string;
+ close CHILD;
+ exit 0;
+ }
+ # at this point, we're in a new (child) process
+ test(23,param('weather') eq 'nice',"CGI::param() from POST");
+ test(24,(url_param('big_balls') eq 'basketball'),"CGI::url_param()");
+} else {
+ print "ok 23 # Skip\n";
+ print "ok 24 # Skip\n";
}
+test(25,redirect('http://somewhere.else') eq "Status: 302 Moved${CRLF}location: http://somewhere.else${CRLF}${CRLF}","CGI::redirect() 1");
+my $h = redirect(-Location=>'http://somewhere.else',-Type=>'text/html');
+test(26,$h eq "Status: 302 Moved${CRLF}location: http://somewhere.else${CRLF}Content-Type: text/html; charset=ISO-8859-1${CRLF}${CRLF}","CGI::redirect() 2");
+test(27,redirect(-Location=>'http://somewhere.else/bin/foo&bar',-Type=>'text/html') eq "Status: 302 Moved${CRLF}location: http://somewhere.else/bin/foo&bar${CRLF}Content-Type: text/html; charset=ISO-8859-1${CRLF}${CRLF}","CGI::redirect() 2");
diff --git a/gnu/usr.bin/perl/t/lib/cgi-html.t b/gnu/usr.bin/perl/t/lib/cgi-html.t
index 43d41ec10fe..93e5dac648a 100644
--- a/gnu/usr.bin/perl/t/lib/cgi-html.t
+++ b/gnu/usr.bin/perl/t/lib/cgi-html.t
@@ -1,15 +1,15 @@
-#!./perl
-
-# Test ability to retrieve HTTP request info
-######################### We start with some black magic to print on failure.
+#!/usr/local/bin/perl -w
BEGIN {
- chdir 't' if -d 't';
- unshift @INC, '../lib' if -d '../lib';
- require Config; import Config;
+ chdir('t') if -d 't';
+ @INC = '../lib';
}
-BEGIN {$| = 1; print "1..20\n"; }
+# Test ability to retrieve HTTP request info
+######################### We start with some black magic to print on failure.
+use lib '../blib/lib','../blib/arch';
+
+BEGIN {$| = 1; print "1..24\n"; }
END {print "not ok 1\n" unless $loaded;}
use CGI (':standard','-no_debug','*h3','start_table');
$loaded = 1;
@@ -17,8 +17,14 @@ print "ok 1\n";
######################### End of black magic.
-my $Is_EBCDIC = $Config{'ebcdic'} eq 'define';
-my $crlf = $CGI::CRLF;
+my $CRLF = "\015\012";
+if ($^O eq 'VMS') {
+ $CRLF = "\n"; # via web server carriage is inserted automatically
+}
+if (ord("\t") != 9) { # EBCDIC?
+ $CRLF = "\r\n";
+}
+
# util
sub test {
@@ -28,48 +34,62 @@ sub test {
}
# all the automatic tags
-test(2,h1() eq '<H1>',"single tag");
-test(3,h1('fred') eq '<H1>fred</H1>',"open/close tag");
-test(4,h1('fred','agnes','maura') eq '<H1>fred agnes maura</H1>',"open/close tag multiple");
-test(5,h1({-align=>'CENTER'},'fred') eq '<H1 ALIGN="CENTER">fred</H1>',"open/close tag with attribute");
-test(6,h1({-align=>undef},'fred') eq '<H1 ALIGN>fred</H1>',"open/close tag with orphan attribute");
+test(2,h1() eq '<h1 />',"single tag");
+test(3,h1('fred') eq '<h1>fred</h1>',"open/close tag");
+test(4,h1('fred','agnes','maura') eq '<h1>fred agnes maura</h1>',"open/close tag multiple");
+test(5,h1({-align=>'CENTER'},'fred') eq '<h1 align="CENTER">fred</h1>',"open/close tag with attribute");
+test(6,h1({-align=>undef},'fred') eq '<h1 align>fred</h1>',"open/close tag with orphan attribute");
test(7,h1({-align=>'CENTER'},['fred','agnes']) eq
- '<H1 ALIGN="CENTER">fred</H1> <H1 ALIGN="CENTER">agnes</H1>',
+ '<h1 align="CENTER">fred</h1> <h1 align="CENTER">agnes</h1>',
"distributive tag with attribute");
{
local($") = '-';
- test(8,h1('fred','agnes','maura') eq '<H1>fred-agnes-maura</H1>',"open/close tag \$\" interpolation");
+ test(8,h1('fred','agnes','maura') eq '<h1>fred-agnes-maura</h1>',"open/close tag \$\" interpolation");
}
-
-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(9,header() eq "Content-Type: text/html; charset=ISO-8859-1${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) =~ m!HTTP/1.0 200 OK${CRLF}Server: cmdline${CRLF}Date:.+${CRLF}Content-Type: text/html; charset=ISO-8859-1${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>
-</HEAD><BODY>
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN"
+ "http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US"><head><title>Untitled Document</title>
+</head><body>
END
;
test(14,start_html(-dtd=>"-//IETF//DTD HTML 3.2//FR") ."\n" eq <<END,"start_html()");
-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.2//FR">
-<HTML><HEAD><TITLE>Untitled Document</TITLE>
-</HEAD><BODY>
+<!DOCTYPE html
+ PUBLIC "-//IETF//DTD HTML 3.2//FR">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US"><head><title>Untitled Document</title>
+</head><body>
END
;
test(15,start_html(-Title=>'The world of foo') ."\n" eq <<END,"start_html()");
-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
-<HTML><HEAD><TITLE>The world of foo</TITLE>
-</HEAD><BODY>
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN"
+ "http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US"><head><title>The world of foo</title>
+</head><body>
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=/${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>');
-
-
-
+test(16,($cookie=cookie(-name=>'fred',-value=>['chocolate','chip'],-path=>'/')) eq 'fred=chocolate&chip; path=/',"cookie()");
+my $h = header(-Cookie=>$cookie);
+test(17,$h =~ m!^Set-Cookie: fred=chocolate&chip\; path=/${CRLF}Date:.*${CRLF}Content-Type: text/html; charset=ISO-8859-1${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>');
+test(21,h1(escapeHTML("this is <not> \x8bright\x9b")) eq '<h1>this is &lt;not&gt; &#139;right&#155;</h1>');
+charset('utf-8');
+if (ord("\t") == 9) {
+test(22,h1(escapeHTML("this is <not> \x8bright\x9b")) eq '<h1>this is &lt;not&gt; ‹right›</h1>');
+}
+else {
+test(22,h1(escapeHTML("this is <not> \x8bright\x9b")) eq '<h1>this is &lt;not&gt; »rightº</h1>');
+}
+test(23,i(p('hello there')) eq '<i><p>hello there</p></i>');
+my $q = new CGI;
+test(24,$q->h1('hi') eq '<h1>hi</h1>');
diff --git a/gnu/usr.bin/perl/t/lib/cgi-pretty.t b/gnu/usr.bin/perl/t/lib/cgi-pretty.t
new file mode 100644
index 00000000000..14f6447033a
--- /dev/null
+++ b/gnu/usr.bin/perl/t/lib/cgi-pretty.t
@@ -0,0 +1,41 @@
+#!/usr/local/bin/perl -w
+
+BEGIN {
+ chdir('t') if -d 't';
+ @INC = '../lib';
+}
+
+# Test ability to retrieve HTTP request info
+######################### We start with some black magic to print on failure.
+use lib '../blib/lib','../blib/arch';
+
+BEGIN {$| = 1; print "1..5\n"; }
+END {print "not ok 1\n" unless $loaded;}
+use CGI::Pretty (':standard','-no_debug','*h3','start_table');
+$loaded = 1;
+print "ok 1\n";
+
+######################### End of black magic.
+
+# util
+sub test {
+ local($^W) = 0;
+ my($num, $true,$msg) = @_;
+ print($true ? "ok $num\n" : "not ok $num $msg\n");
+}
+
+# all the automatic tags
+test(2,h1() eq '<h1>',"single tag");
+test(3,ol(li('fred'),li('ethel')) eq "<ol>\n\t<li>\n\t\tfred\n\t</li>\n\t <li>\n\t\tethel\n\t</li>\n</ol>\n","basic indentation");
+test(4,p('hi',pre('there'),'frog') eq
+'<p>
+ hi <pre>there</pre>
+ frog
+</p>
+',"<pre> tags");
+test(5,p('hi',a({-href=>'frog'},'there'),'frog') eq
+'<p>
+ hi <a href="frog">there</a>
+ frog
+</p>
+',"as-is");
diff --git a/gnu/usr.bin/perl/t/lib/cgi-request.t b/gnu/usr.bin/perl/t/lib/cgi-request.t
index 9e8cdc290ac..fde3fd04cf2 100644
--- a/gnu/usr.bin/perl/t/lib/cgi-request.t
+++ b/gnu/usr.bin/perl/t/lib/cgi-request.t
@@ -1,17 +1,18 @@
-#!./perl
-
-# Test ability to retrieve HTTP request info
-######################### We start with some black magic to print on failure.
+#!/usr/local/bin/perl -w
BEGIN {
- chdir 't' if -d 't';
- unshift @INC, '../lib' if -d '../lib';
+ chdir('t') if -d 't';
+ @INC = '../lib';
}
-BEGIN {$| = 1; print "1..31\n"; }
+# Test ability to retrieve HTTP request info
+######################### We start with some black magic to print on failure.
+use lib '../blib/lib','../blib/arch';
+
+BEGIN {$| = 1; print "1..33\n"; }
END {print "not ok 1\n" unless $loaded;}
-use Config;
use CGI ();
+use Config;
$loaded = 1;
print "ok 1\n";
@@ -39,7 +40,7 @@ $ENV{HTTP_LOVE} = 'true';
$q = new CGI;
test(2,$q,"CGI::new()");
test(3,$q->request_method eq 'GET',"CGI::request_method()");
-test(4,$q->query_string eq 'game=chess&game=checkers&weather=dull',"CGI::query_string()");
+test(4,$q->query_string eq 'game=chess;game=checkers;weather=dull',"CGI::query_string()");
test(5,$q->param() == 2,"CGI::param()");
test(6,join(' ',sort $q->param()) eq 'game weather',"CGI::param()");
test(7,$q->param('game') eq 'chess',"CGI::param()");
@@ -47,18 +48,18 @@ test(8,$q->param('weather') eq 'dull',"CGI::param()");
test(9,join(' ',$q->param('game')) eq 'chess checkers',"CGI::param()");
test(10,$q->param(-name=>'foo',-value=>'bar'),'CGI::param() put');
test(11,$q->param(-name=>'foo') eq 'bar','CGI::param() get');
-test(12,$q->query_string eq 'game=chess&game=checkers&weather=dull&foo=bar',"CGI::query_string() redux");
+test(12,$q->query_string eq 'game=chess;game=checkers;weather=dull;foo=bar',"CGI::query_string() redux");
test(13,$q->http('love') eq 'true',"CGI::http()");
test(14,$q->script_name eq '/cgi-bin/foo.cgi',"CGI::script_name()");
test(15,$q->url eq 'http://the.good.ship.lollypop.com:8080/cgi-bin/foo.cgi',"CGI::url()");
test(16,$q->self_url eq
- 'http://the.good.ship.lollypop.com:8080/cgi-bin/foo.cgi/somewhere/else?game=chess&game=checkers&weather=dull&foo=bar',
+ 'http://the.good.ship.lollypop.com:8080/cgi-bin/foo.cgi/somewhere/else?game=chess;game=checkers;weather=dull;foo=bar',
"CGI::url()");
test(17,$q->url(-absolute=>1) eq '/cgi-bin/foo.cgi','CGI::url(-absolute=>1)');
test(18,$q->url(-relative=>1) eq 'foo.cgi','CGI::url(-relative=>1)');
test(19,$q->url(-relative=>1,-path=>1) eq 'foo.cgi/somewhere/else','CGI::url(-relative=>1,-path=>1)');
test(20,$q->url(-relative=>1,-path=>1,-query=>1) eq
- 'foo.cgi/somewhere/else?game=chess&game=checkers&weather=dull&foo=bar',
+ 'foo.cgi/somewhere/else?game=chess;game=checkers;weather=dull;foo=bar',
'CGI::url(-relative=>1,-path=>1,-query=>1)');
$q->delete('foo');
test(21,!$q->param('foo'),'CGI::delete()');
@@ -73,22 +74,30 @@ test(26,$q->param('foo') eq 'bar','CGI::param() redux');
test(27,$q=new CGI({'foo'=>'bar','bar'=>'froz'}),"CGI::new() redux 2");
test(28,$q->param('bar') eq 'froz',"CGI::param() redux 2");
-if (!$Config{d_fork} or $^O eq 'MSWin32' or $^O eq 'VMS') {
- for (29..31) { print "ok $_ # Skipped: fork n/a\n" }
-}
-else {
- $q->_reset_globals;
- $test_string = 'game=soccer&game=baseball&weather=nice';
- $ENV{REQUEST_METHOD}='POST';
- $ENV{CONTENT_LENGTH}=length($test_string);
- $ENV{QUERY_STRING}='big_balls=basketball&small_balls=golf';
- if (open(CHILD,"|-")) { # cparent
- print CHILD $test_string;
- close CHILD;
- exit 0;
- }
- # at this point, we're in a new (child) process
- test(29,$q=new CGI,"CGI::new() from POST");
- test(30,$q->param('weather') eq 'nice',"CGI::param() from POST");
- test(31,$q->url_param('big_balls') eq 'basketball',"CGI::url_param()");
+# test tied interface
+my $p = $q->Vars;
+test(29,$p->{bar} eq 'froz',"tied interface fetch");
+$p->{bar} = join("\0",qw(foo bar baz));
+test(30,join(' ',$q->param('bar')) eq 'foo bar baz','tied interface store');
+
+# test posting
+$q->_reset_globals;
+if ($Config{d_fork}) {
+ $test_string = 'game=soccer&game=baseball&weather=nice';
+ $ENV{REQUEST_METHOD}='POST';
+ $ENV{CONTENT_LENGTH}=length($test_string);
+ $ENV{QUERY_STRING}='big_balls=basketball&small_balls=golf';
+ if (open(CHILD,"|-")) { # cparent
+ print CHILD $test_string;
+ close CHILD;
+ exit 0;
+ }
+ # at this point, we're in a new (child) process
+ test(31,$q=new CGI,"CGI::new() from POST");
+ test(32,$q->param('weather') eq 'nice',"CGI::param() from POST");
+ test(33,$q->url_param('big_balls') eq 'basketball',"CGI::url_param()");
+} else {
+ print "ok 31 # Skip\n";
+ print "ok 32 # Skip\n";
+ print "ok 33 # Skip\n";
}
diff --git a/gnu/usr.bin/perl/t/lib/charnames.t b/gnu/usr.bin/perl/t/lib/charnames.t
index 76433901267..27311360218 100644
--- a/gnu/usr.bin/perl/t/lib/charnames.t
+++ b/gnu/usr.bin/perl/t/lib/charnames.t
@@ -3,12 +3,12 @@
BEGIN {
unless(grep /blib/, @INC) {
chdir 't' if -d 't';
- unshift @INC, '../lib' if -d '../lib';
+ @INC = '../lib';
}
}
$| = 1;
-print "1..12\n";
+print "1..15\n";
use charnames ':full';
@@ -42,15 +42,21 @@ EOE
$encoded_be = "\320\261";
$encoded_alpha = "\316\261";
$encoded_bet = "\327\221";
+$encoded_deseng = "\360\220\221\215";
+
+sub to_bytes {
+ pack"a*", shift;
+}
+
{
use charnames ':full';
- print "not " unless "\N{CYRILLIC SMALL LETTER BE}" eq $encoded_be;
+ print "not " unless to_bytes("\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}"
+ print "not " unless to_bytes("\N{be},\N{alpha},\N{hebrew:bet}")
eq "$encoded_be,$encoded_alpha,$encoded_bet";
print "ok 5\n";
}
@@ -72,3 +78,33 @@ $encoded_bet = "\327\221";
print "not " unless sprintf("%vx", "\x{ff}\N{WHITE SMILING FACE}") eq "ff.263a";
print "ok 12\n";
}
+
+{
+ use charnames qw(:full);
+ use utf8;
+
+ my $x = "\x{221b}";
+ my $named = "\N{CUBE ROOT}";
+
+ print "not " unless ord($x) == ord($named);
+ print "ok 13\n";
+}
+
+{
+ use charnames qw(:full);
+ use utf8;
+ print "not " unless "\x{100}\N{CENT SIGN}" eq "\x{100}"."\N{CENT SIGN}";
+ print "ok 14\n";
+}
+
+{
+ use charnames ':full';
+
+# XXX this test breaks in 5.6.x because the Unicode database is missing
+# "DESERET SMALL LETTER ENG". Uncomment after updating to Unicode 3.1
+# print "not "
+# unless to_bytes("\N{DESERET SMALL LETTER ENG}") eq $encoded_deseng;
+ print "ok 15\n";
+
+}
+
diff --git a/gnu/usr.bin/perl/t/lib/class-struct.t b/gnu/usr.bin/perl/t/lib/class-struct.t
new file mode 100644
index 00000000000..26505bacfc6
--- /dev/null
+++ b/gnu/usr.bin/perl/t/lib/class-struct.t
@@ -0,0 +1,66 @@
+#!./perl -w
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '../lib';
+}
+
+print "1..8\n";
+
+package aClass;
+
+sub new { bless {}, shift }
+
+sub meth { 42 }
+
+package MyObj;
+
+use Class::Struct;
+use Class::Struct 'struct'; # test out both forms
+
+use Class::Struct SomeClass => { SomeElem => '$' };
+
+struct( s => '$', a => '@', h => '%', c => 'aClass' );
+
+my $obj = MyObj->new;
+
+$obj->s('foo');
+
+print "not " unless $obj->s() eq 'foo';
+print "ok 1\n";
+
+my $arf = $obj->a;
+
+print "not " unless ref $arf eq 'ARRAY';
+print "ok 2\n";
+
+$obj->a(2, 'secundus');
+
+print "not " unless $obj->a(2) eq 'secundus';
+print "ok 3\n";
+
+my $hrf = $obj->h;
+
+print "not " unless ref $hrf eq 'HASH';
+print "ok 4\n";
+
+$obj->h('x', 10);
+
+print "not " unless $obj->h('x') == 10;
+print "ok 5\n";
+
+my $orf = $obj->c;
+
+print "not " unless ref $orf eq 'aClass';
+print "ok 6\n";
+
+print "not " unless $obj->c->meth() == 42;
+print "ok 7\n";
+
+my $obk = SomeClass->new();
+
+$obk->SomeElem(123);
+
+print "not " unless $obk->SomeElem() == 123;
+print "ok 8\n";
+
diff --git a/gnu/usr.bin/perl/t/lib/dprof.t b/gnu/usr.bin/perl/t/lib/dprof.t
index 4d6f7823c3c..be711f13301 100644
--- a/gnu/usr.bin/perl/t/lib/dprof.t
+++ b/gnu/usr.bin/perl/t/lib/dprof.t
@@ -2,23 +2,28 @@
BEGIN {
chdir( 't' ) if -d 't';
- unshift @INC, '../lib';
+ @INC = '../lib';
+ require Config; import Config;
+ if ($Config{'extensions'} !~ /\bDevel\/DProf\b/){
+ print "1..0 # Skip: Devel::DProf was not built\n";
+ exit 0;
+ }
}
END {
- unlink 'tmon.out', 'err';
+ while(-e 'tmon.out' && unlink 'tmon.out') {}
+ while(-e 'err' && unlink '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
+@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 );
@@ -42,7 +47,7 @@ sub profile {
my $opt_d = '-d:DProf';
my $t_start = new Benchmark;
- open( R, "$perl $opt_d $test |" ) || warn "$0: Can't run. $!\n";
+ open( R, "$perl \"$opt_d\" $test |" ) || warn "$0: Can't run. $!\n";
@results = <R>;
close R;
my $t_total = timediff( new Benchmark, $t_start );
@@ -52,15 +57,17 @@ sub profile {
print @results
}
- print timestr( $t_total, 'nop' ), "\n";
+ print '# ',timestr( $t_total, 'nop' ), "\n";
}
sub verify {
my $test = shift;
- system $perl, '-I../lib', '-I./lib/dprof', $test,
- $opt_v?'-v':'', '-p', $perl;
+ my $command = $perl.' "-I../lib" "-I./lib/dprof" '.$test;
+ $command .= ' -v' if $opt_v;
+ $command .= ' -p '. $perl;
+ system $command;
}
@@ -68,6 +75,7 @@ $| = 1;
print "1..18\n";
while( @tests ){
$test = shift @tests;
+ $test =~ s/\.$// if $^O eq 'VMS';
if( $test =~ /_t$/i ){
print "# $test" . '.' x (20 - length $test);
profile $test;
diff --git a/gnu/usr.bin/perl/t/lib/dprof/V.pm b/gnu/usr.bin/perl/t/lib/dprof/V.pm
index 7e34da5d47c..152cddc253d 100644
--- a/gnu/usr.bin/perl/t/lib/dprof/V.pm
+++ b/gnu/usr.bin/perl/t/lib/dprof/V.pm
@@ -13,15 +13,19 @@ $num = 0;
$results = $expected = '';
$perl = $opt_p || $^X;
$dpp = $opt_d || '../utils/dprofpp';
+$dpp .= '.com' if $^O eq 'VMS';
print "\nperl: $perl\n" if $opt_v;
if( ! -f $perl ){ die "Where's Perl?" }
-if( ! -f $dpp ){ die "Where's dprofpp?" }
+if( ! -f $dpp ) {
+ ($dpp = $^X) =~ s@(^.*)[/|\\].*@$1/dprofpp@;
+ die "Where's dprofpp?" if( ! -f $dpp );
+}
sub dprofpp {
my $switches = shift;
- open( D, "$perl -I../lib $dpp $switches 2> err |" ) || warn "$0: Can't run. $!\n";
+ open( D, "$perl \"-I../lib\" $dpp \"$switches\" 2> err |" ) || warn "$0: Can't run. $!\n";
@results = <D>;
close D;
diff --git a/gnu/usr.bin/perl/t/lib/dumper-ovl.t b/gnu/usr.bin/perl/t/lib/dumper-ovl.t
index 8c095e59be8..d4b3a924ae4 100644
--- a/gnu/usr.bin/perl/t/lib/dumper-ovl.t
+++ b/gnu/usr.bin/perl/t/lib/dumper-ovl.t
@@ -2,7 +2,12 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib' if -d '../lib';
+ @INC = '../lib';
+ require Config; import Config;
+ if ($Config{'extensions'} !~ /\bData\/Dumper\b/) {
+ print "1..0 # Skip: Data::Dumper was not built\n";
+ exit 0;
+ }
}
use Data::Dumper;
diff --git a/gnu/usr.bin/perl/t/lib/dumper.t b/gnu/usr.bin/perl/t/lib/dumper.t
index 3167535d78d..be9732f1d67 100644
--- a/gnu/usr.bin/perl/t/lib/dumper.t
+++ b/gnu/usr.bin/perl/t/lib/dumper.t
@@ -5,7 +5,12 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib' if -d '../lib';
+ @INC = '../lib';
+ require Config; import Config;
+ if ($Config{'extensions'} !~ /\bData\/Dumper\b/) {
+ print "1..0 # Skip: Data::Dumper was not built\n";
+ exit 0;
+ }
}
use Data::Dumper;
@@ -257,11 +262,14 @@ EOT
##
$WANT = <<'EOT';
#$VAR1 = {
-# "abc\0'\efg" => "mno\0"
+# "abc\0'\efg" => "mno\0",
+# "reftest" => \\1
#};
EOT
-$foo = { "abc\000\'\efg" => "mno\000" };
+$foo = { "abc\000\'\efg" => "mno\000",
+ "reftest" => \\1,
+ };
{
local $Data::Dumper::Useqq = 1;
TEST q(Dumper($foo));
@@ -269,7 +277,8 @@ $foo = { "abc\000\'\efg" => "mno\000" };
$WANT = <<"EOT";
#\$VAR1 = {
-# 'abc\0\\'\efg' => 'mno\0'
+# 'abc\0\\'\efg' => 'mno\0',
+# 'reftest' => \\\\1
#};
EOT
@@ -287,7 +296,7 @@ EOT
package main;
use Data::Dumper;
$foo = 5;
- @foo = (10,\*foo);
+ @foo = (-10,\*foo);
%foo = (a=>1,b=>\$foo,c=>\@foo);
$foo{d} = \%foo;
$foo[2] = \%foo;
@@ -299,7 +308,7 @@ EOT
#*::foo = \5;
#*::foo = [
# #0
-# 10,
+# -10,
# #1
# do{my $o},
# #2
@@ -330,7 +339,7 @@ EOT
#$foo = \*::foo;
#*::foo = \5;
#*::foo = [
-# 10,
+# -10,
# do{my $o},
# {
# 'a' => 1,
@@ -356,7 +365,7 @@ EOT
##
$WANT = <<'EOT';
#@bar = (
-# 10,
+# -10,
# \*::foo,
# {}
#);
@@ -383,7 +392,7 @@ EOT
##
$WANT = <<'EOT';
#$bar = [
-# 10,
+# -10,
# \*::foo,
# {}
#];
@@ -411,7 +420,7 @@ EOT
$WANT = <<'EOT';
#$foo = \*::foo;
#@bar = (
-# 10,
+# -10,
# $foo,
# {
# a => 1,
@@ -433,7 +442,7 @@ EOT
$WANT = <<'EOT';
#$foo = \*::foo;
#$bar = [
-# 10,
+# -10,
# $foo,
# {
# a => 1,
diff --git a/gnu/usr.bin/perl/t/lib/english.t b/gnu/usr.bin/perl/t/lib/english.t
index dba68dbf94e..0cbbdbf2852 100644
--- a/gnu/usr.bin/perl/t/lib/english.t
+++ b/gnu/usr.bin/perl/t/lib/english.t
@@ -2,7 +2,7 @@
print "1..16\n";
-BEGIN { unshift @INC, '../lib' }
+BEGIN { @INC = '../lib' }
use English;
use Config;
my $threads = $Config{'use5005threads'} || 0;
@@ -43,5 +43,5 @@ print $GID == $( ? "ok 12\n" : "not ok 12\n";
print $EUID == $> ? "ok 13\n" : "not ok 13\n";
print $EGID == $) ? "ok 14\n" : "not ok 14\n";
-print $PROGRAM_NAME == $0 ? "ok 15\n" : "not ok 15\n";
+print $PROGRAM_NAME eq $0 ? "ok 15\n" : "not ok 15\n";
print $BASETIME == $^T ? "ok 16\n" : "not ok 16\n";
diff --git a/gnu/usr.bin/perl/t/lib/env-array.t b/gnu/usr.bin/perl/t/lib/env-array.t
index d90d89226f7..c5068fda14c 100644
--- a/gnu/usr.bin/perl/t/lib/env-array.t
+++ b/gnu/usr.bin/perl/t/lib/env-array.t
@@ -4,7 +4,7 @@ $| = 1;
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ @INC = '../lib';
}
if ($^O eq 'VMS') {
diff --git a/gnu/usr.bin/perl/t/lib/errno.t b/gnu/usr.bin/perl/t/lib/errno.t
index 6320f6b2366..02f5ce2ca68 100644
--- a/gnu/usr.bin/perl/t/lib/errno.t
+++ b/gnu/usr.bin/perl/t/lib/errno.t
@@ -3,7 +3,11 @@
BEGIN {
unless(grep /blib/, @INC) {
chdir 't' if -d 't';
- unshift @INC, '../lib' if -d '../lib';
+ if ($^O eq 'MacOS') {
+ @INC = qw(: ::lib ::macos:lib);
+ } else {
+ @INC = '../lib';
+ }
}
}
diff --git a/gnu/usr.bin/perl/t/lib/fatal.t b/gnu/usr.bin/perl/t/lib/fatal.t
index 4013fbd3713..f00b8766e84 100644
--- a/gnu/usr.bin/perl/t/lib/fatal.t
+++ b/gnu/usr.bin/perl/t/lib/fatal.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ @INC = '../lib';
print "1..15\n";
}
diff --git a/gnu/usr.bin/perl/t/lib/fields.t b/gnu/usr.bin/perl/t/lib/fields.t
index 7709ee51774..a3f591acc44 100644
--- a/gnu/usr.bin/perl/t/lib/fields.t
+++ b/gnu/usr.bin/perl/t/lib/fields.t
@@ -4,7 +4,7 @@ my $w;
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib' if -d '../lib';
+ @INC = '../lib';
$SIG{__WARN__} = sub {
if ($_[0] =~ /^Hides field 'b1' in base class/) {
$w++;
diff --git a/gnu/usr.bin/perl/t/lib/filefunc.t b/gnu/usr.bin/perl/t/lib/filefunc.t
index 46a1e35774a..926812248c2 100644
--- a/gnu/usr.bin/perl/t/lib/filefunc.t
+++ b/gnu/usr.bin/perl/t/lib/filefunc.t
@@ -3,7 +3,7 @@
BEGIN {
$^O = '';
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ @INC = '../lib';
}
print "1..1\n";
diff --git a/gnu/usr.bin/perl/t/lib/filespec.t b/gnu/usr.bin/perl/t/lib/filespec.t
index da52ec5fb5b..c6d155fac17 100644
--- a/gnu/usr.bin/perl/t/lib/filespec.t
+++ b/gnu/usr.bin/perl/t/lib/filespec.t
@@ -3,7 +3,7 @@
BEGIN {
$^O = '';
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ @INC = '../lib';
}
# Each element in this array is a single test. Storing them this way makes
diff --git a/gnu/usr.bin/perl/t/lib/ftmp-mktemp.t b/gnu/usr.bin/perl/t/lib/ftmp-mktemp.t
new file mode 100644
index 00000000000..b0a78721e75
--- /dev/null
+++ b/gnu/usr.bin/perl/t/lib/ftmp-mktemp.t
@@ -0,0 +1,114 @@
+#!/usr/bin/perl -w
+
+# Test for mktemp family of commands in File::Temp
+# Use STANDARD safe level for these tests
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '../lib';
+ require Test; import Test;
+ plan(tests => 9);
+}
+
+use strict;
+
+use File::Spec;
+use File::Path;
+use File::Temp qw/ :mktemp unlink0 /;
+
+ok(1);
+
+# MKSTEMP - test
+
+# Create file in temp directory
+my $template = File::Spec->catfile(File::Spec->tmpdir, 'wowserXXXX');
+
+(my $fh, $template) = mkstemp($template);
+
+print "# MKSTEMP: FH is $fh File is $template fileno=".fileno($fh)."\n";
+# Check if the file exists
+ok( (-e $template) );
+
+# Autoflush
+$fh->autoflush(1) if $] >= 5.006;
+
+# Try printing something to the file
+my $string = "woohoo\n";
+print $fh $string;
+
+# rewind the file
+ok(seek( $fh, 0, 0));
+
+# Read from the file
+my $line = <$fh>;
+
+# compare with previous string
+ok($string, $line);
+
+# Tidy up
+# This test fails on Windows NT since it seems that the size returned by
+# stat(filehandle) does not always equal the size of the stat(filename)
+# This must be due to caching. In particular this test writes 7 bytes
+# to the file which are not recognised by stat(filename)
+# Simply waiting 3 seconds seems to be enough for the system to update
+
+if ($^O eq 'MSWin32') {
+ sleep 3;
+}
+my $status = unlink0($fh, $template);
+if ($status) {
+ ok( $status );
+} else {
+ skip("Skip test failed probably due to \$TMPDIR being on NFS",1);
+}
+
+# MKSTEMPS
+# File with suffix. This is created in the current directory so
+# may be problematic on NFS
+
+$template = "suffixXXXXXX";
+my $suffix = ".dat";
+
+($fh, my $fname) = mkstemps($template, $suffix);
+
+print "# MKSTEMPS: File is $template -> $fname fileno=".fileno($fh)."\n";
+# Check if the file exists
+ok( (-e $fname) );
+
+# This fails if you are running on NFS
+# If this test fails simply skip it rather than doing a hard failure
+$status = unlink0($fh, $fname);
+
+if ($status) {
+ ok($status);
+} else {
+ skip("Skip test failed probably due to cwd being on NFS",1)
+}
+
+# MKDTEMP
+# Temp directory
+
+$template = File::Spec->catdir(File::Spec->tmpdir, 'tmpdirXXXXXX');
+
+my $tmpdir = mkdtemp($template);
+
+print "# MKDTEMP: Name is $tmpdir from template $template\n";
+
+ok( (-d $tmpdir ) );
+
+# Need to tidy up after myself
+rmtree($tmpdir);
+
+# MKTEMP
+# Just a filename, not opened
+
+$template = File::Spec->catfile(File::Spec->tmpdir, 'mytestXXXXXX');
+
+my $tmpfile = mktemp($template);
+
+print "# MKTEMP: Tempfile is $template -> $tmpfile\n";
+
+# Okay if template no longer has XXXXX in
+
+
+ok( ($tmpfile !~ /XXXXX$/) );
diff --git a/gnu/usr.bin/perl/t/lib/ftmp-posix.t b/gnu/usr.bin/perl/t/lib/ftmp-posix.t
new file mode 100644
index 00000000000..79496d8a4ab
--- /dev/null
+++ b/gnu/usr.bin/perl/t/lib/ftmp-posix.t
@@ -0,0 +1,81 @@
+#!/usr/bin/perl -w
+# Test for File::Temp - POSIX functions
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '../lib';
+ require Test; import Test;
+ plan(tests => 7);
+}
+
+use strict;
+
+use File::Temp qw/ :POSIX unlink0 /;
+ok(1);
+
+# TMPNAM - scalar
+
+print "# TMPNAM: in a scalar context: \n";
+my $tmpnam = tmpnam();
+
+# simply check that the file does not exist
+# Not a 100% water tight test though if another program
+# has managed to create one in the meantime.
+ok( !(-e $tmpnam ));
+
+print "# TMPNAM file name: $tmpnam\n";
+
+# TMPNAM list context
+# Not strict posix behaviour
+(my $fh, $tmpnam) = tmpnam();
+
+print "# TMPNAM: in list context: $fh $tmpnam\n";
+
+# File is opened - make sure it exists
+ok( (-e $tmpnam ));
+
+# Unlink it - a possible NFS issue again if TMPDIR is not a local disk
+my $status = unlink0($fh, $tmpnam);
+if ($status) {
+ ok( $status );
+} else {
+ skip("Skip test failed probably due to \$TMPDIR being on NFS",1);
+}
+
+# TMPFILE
+
+$fh = tmpfile();
+
+if (defined $fh) {
+ ok( $fh );
+ print "# TMPFILE: tmpfile got FH $fh\n";
+
+ $fh->autoflush(1) if $] >= 5.006;
+
+ # print something to it
+ my $original = "Hello a test\n";
+ print "# TMPFILE: Wrote line: $original";
+ print $fh $original
+ or die "Error printing to tempfile\n";
+
+ # rewind it
+ ok( seek($fh,0,0) );
+
+ # Read from it
+ my $line = <$fh>;
+
+ print "# TMPFILE: Read line: $line";
+ ok( $original, $line);
+
+ close($fh);
+
+} else {
+ # Skip all the remaining tests
+ foreach (1..3) {
+ skip("Skip test failed probably due to \$TMPDIR being on NFS",1);
+ }
+}
+
+
+
+
diff --git a/gnu/usr.bin/perl/t/lib/ftmp-security.t b/gnu/usr.bin/perl/t/lib/ftmp-security.t
new file mode 100644
index 00000000000..96b2c4283c3
--- /dev/null
+++ b/gnu/usr.bin/perl/t/lib/ftmp-security.t
@@ -0,0 +1,140 @@
+#!/usr/bin/perl -w
+# Test for File::Temp - Security levels
+
+# Some of the security checking will not work on all platforms
+# Test a simple open in the cwd and tmpdir foreach of the
+# security levels
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '../lib';
+ require Test; import Test;
+ plan(tests => 13);
+}
+
+use strict;
+use File::Spec;
+
+# Set up END block - this needs to happen before we load
+# File::Temp since this END block must be evaluated after the
+# END block configured by File::Temp
+my @files; # list of files to remove
+END { foreach (@files) { ok( !(-e $_) )} }
+
+use File::Temp qw/ tempfile unlink0 /;
+ok(1);
+
+# The high security tests must currently be skipped on some platforms
+my $skipplat = ( (
+ # No sticky bits.
+ $^O eq 'MSWin32' || $^O eq 'os2' || $^O eq 'dos'
+ ) ? 1 : 0 );
+
+# Can not run high security tests in perls before 5.6.0
+my $skipperl = ($] < 5.006 ? 1 : 0 );
+
+# Determine whether we need to skip things and why
+my $skip = 0;
+if ($skipplat) {
+ $skip = "Skip Not supported on this platform";
+} elsif ($skipperl) {
+ $skip = "Skip Perl version must be v5.6.0 for these tests";
+
+}
+
+print "# We will be skipping some tests : $skip\n" if $skip;
+
+# start off with basic checking
+
+File::Temp->safe_level( File::Temp::STANDARD );
+
+print "# Testing with STANDARD security...\n";
+
+&test_security(0);
+
+# Try medium
+
+File::Temp->safe_level( File::Temp::MEDIUM )
+ unless $skip;
+
+print "# Testing with MEDIUM security...\n";
+
+# Now we need to start skipping tests
+&test_security($skip);
+
+# Try HIGH
+
+File::Temp->safe_level( File::Temp::HIGH )
+ unless $skip;
+
+print "# Testing with HIGH security...\n";
+
+&test_security($skip);
+
+exit;
+
+# Subroutine to open two temporary files.
+# one is opened in the current dir and the other in the temp dir
+
+sub test_security {
+
+ # Read in the skip flag
+ my $skip = shift;
+
+ # If we are skipping we need to simply fake the correct number
+ # of tests -- we dont use skip since the tempfile() commands will
+ # fail with MEDIUM/HIGH security before the skip() command would be run
+ if ($skip) {
+
+ skip($skip,1);
+ skip($skip,1);
+
+ # plus we need an end block so the tests come out in the right order
+ eval q{ END { skip($skip,1); skip($skip,1) } 1; } || die;
+
+ return;
+ }
+
+ # Create the tempfile
+ my $template = "tmpXXXXX";
+ my ($fh1, $fname1) = eval { tempfile ( $template,
+ DIR => File::Spec->tmpdir,
+ UNLINK => 1,
+ );
+ };
+
+ if (defined $fname1) {
+ print "# fname1 = $fname1\n";
+ ok( (-e $fname1) );
+ push(@files, $fname1); # store for end block
+ } elsif (File::Temp->safe_level() != File::Temp::STANDARD) {
+ my $skip2 = "Skip system possibly insecure, see INSTALL, section 'make test'";
+ skip($skip2, 1);
+ # plus we need an end block so the tests come out in the right order
+ eval q{ END { skip($skip2,1); } 1; } || die;
+ } else {
+ ok(0);
+ }
+
+ # Explicitly
+ if ( $< < File::Temp->top_system_uid() ){
+ skip("Skip Test inappropriate for root", 1);
+ eval q{ END { skip($skip,1); } 1; } || die;
+ return;
+ }
+ my ($fh2, $fname2) = eval { tempfile ($template, UNLINK => 1 ); };
+ if (defined $fname2) {
+ print "# fname2 = $fname2\n";
+ ok( (-e $fname2) );
+ push(@files, $fname2); # store for end block
+ close($fh2);
+ } elsif (File::Temp->safe_level() != File::Temp::STANDARD) {
+ my $skip2 = "Skip system possibly insecure, see INSTALL, section 'make test'";
+ skip($skip2, 1);
+ # plus we need an end block so the tests come out in the right order
+ eval q{ END { skip($skip2,1); } 1; } || die;
+ } else {
+ ok(0);
+ }
+
+}
diff --git a/gnu/usr.bin/perl/t/lib/ftmp-tempfile.t b/gnu/usr.bin/perl/t/lib/ftmp-tempfile.t
new file mode 100644
index 00000000000..ed59765a757
--- /dev/null
+++ b/gnu/usr.bin/perl/t/lib/ftmp-tempfile.t
@@ -0,0 +1,145 @@
+#!/usr/local/bin/perl -w
+# Test for File::Temp - tempfile function
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '../lib';
+ require Test; import Test;
+ plan(tests => 20);
+}
+
+use strict;
+use File::Spec;
+
+# Will need to check that all files were unlinked correctly
+# Set up an END block here to do it
+
+# Arrays containing list of dirs/files to test
+my (@files, @dirs, @still_there);
+
+# And a test for files that should still be around
+# These are tidied up
+END {
+ foreach (@still_there) {
+ ok( -f $_ );
+ ok( unlink( $_ ) );
+ ok( !(-f $_) );
+ }
+}
+
+# Loop over an array hoping that the files dont exist
+END { foreach (@files) { ok( !(-e $_) )} }
+
+# And a test for directories
+END { foreach (@dirs) { ok( !(-d $_) )} }
+
+# Need to make sure that the END blocks are setup before
+# the ones that File::Temp configures since END blocks are evaluated
+# in revers order and we need to check the files *after* File::Temp
+# removes them
+use File::Temp qw/ tempfile tempdir/;
+
+# Now we start the tests properly
+ok(1);
+
+
+# Tempfile
+# Open tempfile in some directory, unlink at end
+my ($fh, $tempfile) = tempfile(
+ UNLINK => 1,
+ SUFFIX => '.txt',
+ );
+
+ok( (-f $tempfile) );
+# Should still be around after closing
+ok( close( $fh ) );
+ok( (-f $tempfile) );
+# Check again at exit
+push(@files, $tempfile);
+
+# TEMPDIR test
+# Create temp directory in current dir
+my $template = 'tmpdirXXXXXX';
+print "# Template: $template\n";
+my $tempdir = tempdir( $template ,
+ DIR => File::Spec->curdir,
+ CLEANUP => 1,
+ );
+
+print "# TEMPDIR: $tempdir\n";
+
+ok( (-d $tempdir) );
+push(@dirs, $tempdir);
+
+# Create file in the temp dir
+($fh, $tempfile) = tempfile(
+ DIR => $tempdir,
+ UNLINK => 1,
+ SUFFIX => '.dat',
+ );
+
+print "# TEMPFILE: Created $tempfile\n";
+
+ok( (-f $tempfile));
+push(@files, $tempfile);
+
+# Test tempfile
+# ..and again
+($fh, $tempfile) = tempfile(
+ DIR => $tempdir,
+ );
+
+
+ok( (-f $tempfile ));
+push(@files, $tempfile);
+
+print "# TEMPFILE: Created $tempfile\n";
+
+# and another (with template)
+
+($fh, $tempfile) = tempfile( 'helloXXXXXXX',
+ DIR => $tempdir,
+ UNLINK => 1,
+ SUFFIX => '.dat',
+ );
+
+print "# TEMPFILE: Created $tempfile\n";
+
+ok( (-f $tempfile) );
+push(@files, $tempfile);
+
+
+# Create a temporary file that should stay around after
+# it has been closed
+($fh, $tempfile) = tempfile( 'permXXXXXXX', UNLINK => 0 );
+print "# TEMPFILE: Created $tempfile\n";
+ok( -f $tempfile );
+ok( close( $fh ) );
+push( @still_there, $tempfile); # check at END
+
+# Would like to create a temp file and just retrieve the handle
+# but the test is problematic since:
+# - We dont know the filename so we cant check that it is tidied
+# correctly
+# - The unlink0 required on unix for tempfile creation will fail
+# on NFS
+# Try to do what we can.
+# Tempfile croaks on error so we need an eval
+$fh = eval { tempfile( 'ftmpXXXXX', DIR => File::Spec->tmpdir ) };
+
+if ($fh) {
+
+ # print something to it to make sure something is there
+ ok( print $fh "Test\n" );
+
+ # Close it - can not check it is gone since we dont know the name
+ ok( close($fh) );
+
+} else {
+ skip "Skip Failed probably due to NFS", 1;
+ skip "Skip Failed probably due to NFS", 1;
+}
+
+# Now END block will execute to test the removal of directories
+print "# End of tests. Execute END blocks\n";
+
diff --git a/gnu/usr.bin/perl/t/lib/glob-basic.t b/gnu/usr.bin/perl/t/lib/glob-basic.t
index 47280831a9e..a014bfd555b 100644
--- a/gnu/usr.bin/perl/t/lib/glob-basic.t
+++ b/gnu/usr.bin/perl/t/lib/glob-basic.t
@@ -2,7 +2,12 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ if ($^O eq 'MacOS') {
+ @INC = qw(: ::lib ::macos:lib);
+ } else {
+ @INC = '.';
+ push @INC, '../lib';
+ }
require Config; import Config;
if ($Config{'extensions'} !~ /\bFile\/Glob\b/i) {
print "1..0\n";
@@ -26,8 +31,8 @@ sub array {
$ENV{PATH} = "/bin";
delete @ENV{BASH_ENV, CDPATH, ENV, IFS};
@correct = ();
-if (opendir(D, ".")) {
- @correct = grep { !/^\.\.?$/ } sort readdir(D);
+if (opendir(D, $^O eq "MacOS" ? ":" : ".")) {
+ @correct = grep { !/^\./ } sort readdir(D);
closedir D;
}
@a = File::Glob::glob("*", 0);
@@ -39,12 +44,12 @@ 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') {
+if ($^O ne 'MSWin32' && $^O ne 'VMS') {
eval {
($name, $home) = (getpwuid($>))[0,7];
1;
} and do {
- @a = File::Glob::glob("~$name", GLOB_TILDE);
+ @a = bsd_glob("~$name", GLOB_TILDE);
if (scalar(@a) != 1 || $a[0] ne $home || GLOB_ERROR) {
print "not ";
}
@@ -54,7 +59,7 @@ print "ok 3\n";
# check backslashing
# should return a list with one item, and not set ERROR
-@a = File::Glob::glob('TEST', GLOB_QUOTE);
+@a = bsd_glob('TEST', GLOB_QUOTE);
if (scalar @a != 1 || $a[0] ne 'TEST' || GLOB_ERROR) {
local $/ = "][";
print "# [@a]\n";
@@ -65,7 +70,7 @@ 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);
+@a = bsd_glob("asdfasdf", 0);
if ($^O ne 'MSWin32' and scalar @a != 0) {
print "# |@a|\nnot ";
}
@@ -81,7 +86,7 @@ if ($^O eq 'mpeix' or $^O eq 'MSWin32' or $^O eq 'os2' or $^O eq 'VMS'
else {
$dir = "PtEeRsLt.dir";
mkdir $dir, 0;
- @a = File::Glob::glob("$dir/*", GLOB_ERR);
+ @a = bsd_glob("$dir/*", GLOB_ERR);
#print "\@a = ", array(@a);
rmdir $dir;
if (scalar(@a) != 0 || GLOB_ERROR == 0) {
@@ -91,16 +96,21 @@ else {
}
# check for csh style globbing
-@a = File::Glob::glob('{a,b}', GLOB_BRACE | GLOB_NOMAGIC);
+@a = bsd_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(
+@a = bsd_glob(
'{TES*,doesntexist*,a,b}',
- GLOB_BRACE | GLOB_NOMAGIC
+ GLOB_BRACE | GLOB_NOMAGIC | ($^O eq 'VMS' ? GLOB_NOCASE : 0)
);
+
+# Working on t/TEST often causes this test to fail because it sees temp
+# and RCS files. Filter them out, and .pm files too.
+@a = grep !/(,v$|~$|\.pm$)/, @a;
+
unless (@a == 3
and $a[0] eq ($^O eq 'VMS'? 'test.' : 'TEST')
and $a[1] eq 'a'
@@ -112,8 +122,8 @@ 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}) {
+@a = bsd_glob('~', GLOB_TILDE | GLOB_NOMAGIC);
+unless ($^O eq "MacOS" || (@a == 1 and $a[0] eq $ENV{HOME})) {
print "not ";
}
print "ok 9\n";
diff --git a/gnu/usr.bin/perl/t/lib/glob-case.t b/gnu/usr.bin/perl/t/lib/glob-case.t
index 32719b2d9ac..881470cf84d 100644
--- a/gnu/usr.bin/perl/t/lib/glob-case.t
+++ b/gnu/usr.bin/perl/t/lib/glob-case.t
@@ -2,7 +2,12 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ if ($^O eq 'MacOS') {
+ @INC = qw(: ::lib ::macos:lib);
+ } else {
+ @INC = '.';
+ push @INC, '../lib';
+ }
require Config; import Config;
if ($Config{'extensions'} !~ /\bFile\/Glob\b/i) {
print "1..0\n";
@@ -17,20 +22,22 @@ use File::Glob qw(:glob csh_glob);
$loaded = 1;
print "ok 1\n";
+my $pat = $^O eq "MacOS" ? ":lib:G*.t" : "lib/G*.t";
+
# 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
+@a = csh_glob($pat); # 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
+@a = csh_glob($pat); # 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);
+@a = bsd_glob($pat, GLOB_NOCASE);
print "not " unless @a >= 3;
print "ok 4\n";
@@ -47,7 +54,7 @@ else {
rmdir "[]";
print "# returned @a\nnot " unless @a == 1;
print "ok 6\n";
- @a = File::Glob::glob("lib\\*", GLOB_QUOTE);
+ @a = bsd_glob("lib\\*", GLOB_QUOTE);
print "not " if @a == 0;
print "ok 7\n";
}
diff --git a/gnu/usr.bin/perl/t/lib/glob-global.t b/gnu/usr.bin/perl/t/lib/glob-global.t
index 9d273bd1ed1..1d7903275bc 100644
--- a/gnu/usr.bin/perl/t/lib/glob-global.t
+++ b/gnu/usr.bin/perl/t/lib/glob-global.t
@@ -2,7 +2,12 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ if ($^O eq 'MacOS') {
+ @INC = qw(: ::lib ::macos:lib);
+ } else {
+ @INC = '.';
+ push @INC, '../lib';
+ }
require Config; import Config;
if ($Config{'extensions'} !~ /\bFile\/Glob\b/i) {
print "1..0\n";
@@ -31,9 +36,9 @@ use File::Glob ':globally';
$loaded = 1;
print "ok 1\n";
-$_ = "lib/*.t";
+$_ = $^O eq "MacOS" ? ":lib:*.t" : "lib/*.t";
my @r = glob;
-print "not " if $_ ne 'lib/*.t';
+print "not " if $_ ne ($^O eq "MacOS" ? ":lib:*.t" : "lib/*.t");
print "ok 2\n";
# we should have at least basic.t, global.t, taint.t
@@ -41,7 +46,11 @@ print "# |@r|\nnot " if @r < 3;
print "ok 3\n";
# check if <*/*> works
-@r = <*/*.t>;
+if ($^O eq "MacOS") {
+ @r = <:*:*.t>;
+} else {
+ @r = <*/*.t>;
+}
# at least t/global.t t/basic.t, t/taint.t
print "not " if @r < 3;
print "ok 4\n";
@@ -49,34 +58,55 @@ my $r = scalar @r;
# check if scalar context works
@r = ();
-while (defined($_ = <*/*.t>)) {
- #print "# $_\n";
- push @r, $_;
+if ($^O eq "MacOS") {
+ while (defined($_ = <:*:*.t>)) {
+ #print "# $_\n";
+ push @r, $_;
+ }
+} else {
+ while (defined($_ = <*/*.t>)) {
+ #print "# $_\n";
+ push @r, $_;
+ }
}
print "not " if @r != $r;
print "ok 5\n";
-# check if array context works
+# check if list context works
@r = ();
-for (<*/*.t>) {
- #print "# $_\n";
- push @r, $_;
+if ($^O eq "MacOS") {
+ for (<:*:*.t>) {
+ #print "# $_\n";
+ push @r, $_;
+ }
+} else {
+ 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, $_;
+if ($^O eq "MacOS") {
+ while (<:*:*.t>) {
+ #print "# $_\n";
+ push @r, $_;
+ }
+} else {
+ 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') {
+while (glob($^O eq 'MacOS' ? ':*:*.t' : '*/*.t')) {
#print "# $_\n";
push @s, $_;
}
@@ -87,7 +117,7 @@ print "ok 8\n";
package Foo;
use File::Glob ':globally';
@s = ();
-while (glob '*/*.t') {
+while (glob($^O eq 'MacOS' ? ':*:*.t' : '*/*.t')) {
#print "# $_\n";
push @s, $_;
}
@@ -97,14 +127,26 @@ 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++;
+if ($^O eq "MacOS") {
+ while (<:*:*.t>) {
+ #print "# $_ <";
+ push @s, $_;
+ while (<:bas*:*.t>) {
+ #print " $_";
+ $i++;
+ }
+ #print " >\n";
+ }
+} else {
+ while (<*/*.t>) {
+ #print "# $_ <";
+ push @s, $_;
+ while (<bas*/*.t>) {
+ #print " $_";
+ $i++;
+ }
+ #print " >\n";
}
- #print " >\n";
}
print "not " if "@r" ne "@s" or not $i;
print "ok 10\n";
diff --git a/gnu/usr.bin/perl/t/lib/glob-taint.t b/gnu/usr.bin/perl/t/lib/glob-taint.t
index a8dc2138530..4c0990358d0 100644
--- a/gnu/usr.bin/perl/t/lib/glob-taint.t
+++ b/gnu/usr.bin/perl/t/lib/glob-taint.t
@@ -2,7 +2,12 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ if ($^O eq 'MacOS') {
+ @INC = qw(: ::lib ::macos:lib);
+ } else {
+ @INC = '.';
+ push @INC, '../lib';
+ }
require Config; import Config;
if ($Config{'extensions'} !~ /\bFile\/Glob\b/i) {
print "1..0\n";
@@ -18,7 +23,7 @@ $loaded = 1;
print "ok 1\n";
# all filenames should be tainted
-@a = File::Glob::glob("*");
+@a = File::Glob::bsd_glob("*");
eval { $a = join("",@a), kill 0; 1 };
unless ($@ =~ /Insecure dependency/) {
print "not ";
diff --git a/gnu/usr.bin/perl/t/lib/gol-basic.t b/gnu/usr.bin/perl/t/lib/gol-basic.t
index 4b25322336f..c5d857d5b8d 100644
--- a/gnu/usr.bin/perl/t/lib/gol-basic.t
+++ b/gnu/usr.bin/perl/t/lib/gol-basic.t
@@ -1,16 +1,18 @@
#!./perl -w
BEGIN {
- chdir 't' if -d 't';
- unshift @INC, '../lib';
+ chdir('t') if -d 't';
+ @INC = '../lib';
}
-use Getopt::Long 2.17;
+use Getopt::Long qw(:config no_ignore_case);
+die("Getopt::Long version 2.24 required--this is only version ".
+ $Getopt::Long::VERSION)
+ unless $Getopt::Long::VERSION >= 2.24;
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");
diff --git a/gnu/usr.bin/perl/t/lib/gol-compat.t b/gnu/usr.bin/perl/t/lib/gol-compat.t
index a4f807c7dd4..0bbe386846e 100644
--- a/gnu/usr.bin/perl/t/lib/gol-compat.t
+++ b/gnu/usr.bin/perl/t/lib/gol-compat.t
@@ -1,8 +1,8 @@
#!./perl -w
BEGIN {
- chdir 't' if -d 't';
- unshift @INC, '../lib';
+ chdir('t') if -d 't';
+ @INC = '../lib';
}
require "newgetopt.pl";
diff --git a/gnu/usr.bin/perl/t/lib/gol-linkage.t b/gnu/usr.bin/perl/t/lib/gol-linkage.t
index a1b2c05be37..3bd81a35528 100644
--- a/gnu/usr.bin/perl/t/lib/gol-linkage.t
+++ b/gnu/usr.bin/perl/t/lib/gol-linkage.t
@@ -1,8 +1,8 @@
#!./perl -w
BEGIN {
- chdir 't' if -d 't';
- unshift @INC, '../lib';
+ chdir('t') if -d 't';
+ @INC = '../lib';
}
use Getopt::Long;
diff --git a/gnu/usr.bin/perl/t/lib/gol-oo.t b/gnu/usr.bin/perl/t/lib/gol-oo.t
new file mode 100644
index 00000000000..98f3eaadb9b
--- /dev/null
+++ b/gnu/usr.bin/perl/t/lib/gol-oo.t
@@ -0,0 +1,26 @@
+#!./perl -w
+
+BEGIN {
+ chdir('t') if -d 't';
+ @INC = '../lib';
+}
+
+use Getopt::Long;
+die("Getopt::Long version 2.24 required--this is only version ".
+ $Getopt::Long::VERSION)
+ unless $Getopt::Long::VERSION >= 2.24;
+print "1..9\n";
+
+@ARGV = qw(-Foo -baR --foo bar);
+my $p = new Getopt::Long::Parser (config => ["no_ignore_case"]);
+undef $opt_baR;
+undef $opt_bar;
+print "ok 1\n" if $p->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/gnu/usr.bin/perl/t/lib/h2ph.t b/gnu/usr.bin/perl/t/lib/h2ph.t
index acb150dfcd3..15dc2b52c21 100644
--- a/gnu/usr.bin/perl/t/lib/h2ph.t
+++ b/gnu/usr.bin/perl/t/lib/h2ph.t
@@ -5,7 +5,7 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ @INC = '../lib';
}
print "1..2\n";
diff --git a/gnu/usr.bin/perl/t/lib/io_const.t b/gnu/usr.bin/perl/t/lib/io_const.t
index 48cb6b5dc83..db1a322453e 100644
--- a/gnu/usr.bin/perl/t/lib/io_const.t
+++ b/gnu/usr.bin/perl/t/lib/io_const.t
@@ -2,7 +2,7 @@
BEGIN {
unless(grep /blib/, @INC) {
chdir 't' if -d 't';
- unshift @INC, '../lib' if -d '../lib';
+ @INC = '../lib';
}
}
diff --git a/gnu/usr.bin/perl/t/lib/io_dir.t b/gnu/usr.bin/perl/t/lib/io_dir.t
index 11ec8bcbf92..36898715557 100644
--- a/gnu/usr.bin/perl/t/lib/io_dir.t
+++ b/gnu/usr.bin/perl/t/lib/io_dir.t
@@ -3,7 +3,7 @@
BEGIN {
unless(grep /blib/, @INC) {
chdir 't' if -d 't';
- unshift @INC, '../lib' if -d '../lib';
+ @INC = '../lib';
}
require Config; import Config;
if ($] < 5.00326 || not $Config{'d_readdir'}) {
diff --git a/gnu/usr.bin/perl/t/lib/io_linenum.t b/gnu/usr.bin/perl/t/lib/io_linenum.t
index 35032152014..cf55c980eaf 100644
--- a/gnu/usr.bin/perl/t/lib/io_linenum.t
+++ b/gnu/usr.bin/perl/t/lib/io_linenum.t
@@ -13,7 +13,7 @@ BEGIN
chdir 't';
$File =~ s/^t\W+//; # Remove first directory
}
- unshift @INC, '../lib' if -d '../lib';
+ @INC = '../lib';
require strict; import strict;
}
diff --git a/gnu/usr.bin/perl/t/lib/io_multihomed.t b/gnu/usr.bin/perl/t/lib/io_multihomed.t
index 7337a5f8d6b..55030b5ad10 100644
--- a/gnu/usr.bin/perl/t/lib/io_multihomed.t
+++ b/gnu/usr.bin/perl/t/lib/io_multihomed.t
@@ -3,7 +3,7 @@
BEGIN {
unless(grep /blib/, @INC) {
chdir 't' if -d 't';
- unshift @INC, '../lib' if -d '../lib';
+ @INC = '../lib';
}
}
diff --git a/gnu/usr.bin/perl/t/lib/io_poll.t b/gnu/usr.bin/perl/t/lib/io_poll.t
index 68ad7b74cba..d391566a7fe 100644
--- a/gnu/usr.bin/perl/t/lib/io_poll.t
+++ b/gnu/usr.bin/perl/t/lib/io_poll.t
@@ -3,7 +3,7 @@
BEGIN {
unless(grep /blib/, @INC) {
chdir 't' if -d 't';
- unshift @INC, '../lib' if -d '../lib';
+ @INC = '../lib';
}
}
@@ -15,7 +15,7 @@ if ($^O eq 'mpeix') {
select(STDERR); $| = 1;
select(STDOUT); $| = 1;
-print "1..8\n";
+print "1..9\n";
use IO::Handle;
use IO::Poll qw(/POLL/);
@@ -75,3 +75,8 @@ $poll->poll(0.1);
print "not "
if $poll->events($stdout);
print "ok 8\n";
+
+$poll->remove($dupout);
+print "not "
+ if $poll->handles;
+print "ok 9\n";
diff --git a/gnu/usr.bin/perl/t/lib/io_unix.t b/gnu/usr.bin/perl/t/lib/io_unix.t
index 247647a7029..2f6def0af76 100644
--- a/gnu/usr.bin/perl/t/lib/io_unix.t
+++ b/gnu/usr.bin/perl/t/lib/io_unix.t
@@ -3,7 +3,7 @@
BEGIN {
unless(grep /blib/, @INC) {
chdir 't' if -d 't';
- unshift @INC, '../lib' if -d '../lib';
+ @INC = '../lib';
}
}
diff --git a/gnu/usr.bin/perl/t/lib/ipc_sysv.t b/gnu/usr.bin/perl/t/lib/ipc_sysv.t
index a4f3e3f3671..795ad5d6c70 100644
--- a/gnu/usr.bin/perl/t/lib/ipc_sysv.t
+++ b/gnu/usr.bin/perl/t/lib/ipc_sysv.t
@@ -3,13 +3,15 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ @INC = '../lib';
require Config; import Config;
my $reason;
- if ($Config{'d_sem'} ne 'define') {
+ if ($Config{'extensions'} !~ /\bIPC\/SysV\b/) {
+ $reason = 'IPC::SysV was not built';
+ } elsif ($Config{'d_sem'} ne 'define') {
$reason = '$Config{d_sem} undefined';
} elsif ($Config{'d_msg'} ne 'define') {
$reason = '$Config{d_msg} undefined';
diff --git a/gnu/usr.bin/perl/t/lib/peek.t b/gnu/usr.bin/perl/t/lib/peek.t
new file mode 100644
index 00000000000..fe9cb2cdf98
--- /dev/null
+++ b/gnu/usr.bin/perl/t/lib/peek.t
@@ -0,0 +1,312 @@
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '../lib';
+ require Config; import Config;
+ if ($Config{'extensions'} !~ /\bPeek\b/) {
+ print "1..0 # Skip: Devel::Peek was not built\n";
+ exit 0;
+ }
+}
+
+use Devel::Peek;
+
+print "1..17\n";
+
+our $DEBUG = 0;
+open(SAVERR, ">&STDERR") or die "Can't dup STDERR: $!";
+
+sub do_test {
+ my $pattern = pop;
+ if (open(OUT,">peek$$")) {
+ open(STDERR, ">&OUT") or die "Can't dup OUT: $!";
+ Dump($_[1]);
+ open(STDERR, ">&SAVERR") or die "Can't restore STDERR: $!";
+ close(OUT);
+ if (open(IN, "peek$$")) {
+ local $/;
+ $pattern =~ s/\$ADDR/0x[[:xdigit:]]+/g;
+ print $pattern, "\n" if $DEBUG;
+ my $dump = <IN>;
+ print $dump, "\n" if $DEBUG;
+ print "[$dump] vs [$pattern]\nnot " unless $dump =~ /$pattern/ms;
+ print "ok $_[0]\n";
+ close(IN);
+ } else {
+ die "$0: failed to open peek$$: !\n";
+ }
+ } else {
+ die "$0: failed to create peek$$: $!\n";
+ }
+}
+
+our $a;
+our $b;
+my $c;
+local $d = 0;
+
+do_test( 1,
+ $a = "foo",
+'SV = PV\\($ADDR\\) at $ADDR
+ REFCNT = 1
+ FLAGS = \\(POK,pPOK\\)
+ PV = $ADDR "foo"\\\0
+ CUR = 3
+ LEN = 4'
+ );
+
+do_test( 2,
+ "bar",
+'SV = PV\\($ADDR\\) at $ADDR
+ REFCNT = 1
+ FLAGS = \\(.*POK,READONLY,pPOK\\)
+ PV = $ADDR "bar"\\\0
+ CUR = 3
+ LEN = 4');
+
+do_test( 3,
+ $b = 123,
+'SV = IV\\($ADDR\\) at $ADDR
+ REFCNT = 1
+ FLAGS = \\(IOK,pIOK\\)
+ IV = 123');
+
+do_test( 4,
+ 456,
+'SV = IV\\($ADDR\\) at $ADDR
+ REFCNT = 1
+ FLAGS = \\(.*IOK,READONLY,pIOK\\)
+ IV = 456');
+
+do_test( 5,
+ $c = 456,
+'SV = IV\\($ADDR\\) at $ADDR
+ REFCNT = 1
+ FLAGS = \\(PADBUSY,PADMY,IOK,pIOK\\)
+ IV = 456');
+
+do_test( 6,
+ $c + $d,
+'SV = NV\\($ADDR\\) at $ADDR
+ REFCNT = 1
+ FLAGS = \\(PADTMP,NOK,pNOK\\)
+ NV = 456');
+
+($d = "789") += 0.1;
+
+do_test( 7,
+ $d,
+'SV = PVNV\\($ADDR\\) at $ADDR
+ REFCNT = 1
+ FLAGS = \\(NOK,pNOK\\)
+ IV = 0
+ NV = 789\\.(?:1(?:000+\d+)?|0999+\d+)
+ PV = $ADDR "789"\\\0
+ CUR = 3
+ LEN = 4');
+
+do_test( 8,
+ 0xabcd,
+'SV = IV\\($ADDR\\) at $ADDR
+ REFCNT = 1
+ FLAGS = \\(.*IOK,READONLY,pIOK,IsUV\\)
+ UV = 43981');
+
+do_test( 9,
+ undef,
+'SV = NULL\\(0x0\\) at $ADDR
+ REFCNT = 1
+ FLAGS = \\(\\)');
+
+do_test(10,
+ \$a,
+'SV = RV\\($ADDR\\) at $ADDR
+ REFCNT = 1
+ FLAGS = \\(ROK\\)
+ RV = $ADDR
+ SV = PV\\($ADDR\\) at $ADDR
+ REFCNT = 2
+ FLAGS = \\(POK,pPOK\\)
+ PV = $ADDR "foo"\\\0
+ CUR = 3
+ LEN = 4');
+
+do_test(11,
+ [$b,$c],
+'SV = RV\\($ADDR\\) at $ADDR
+ REFCNT = 1
+ FLAGS = \\(ROK\\)
+ RV = $ADDR
+ SV = PVAV\\($ADDR\\) at $ADDR
+ REFCNT = 2
+ FLAGS = \\(\\)
+ IV = 0
+ NV = 0
+ ARRAY = $ADDR
+ FILL = 1
+ MAX = 1
+ ARYLEN = 0x0
+ FLAGS = \\(REAL\\)
+ Elt No. 0
+ SV = IV\\($ADDR\\) at $ADDR
+ REFCNT = 1
+ FLAGS = \\(IOK,pIOK\\)
+ IV = 123
+ Elt No. 1
+ SV = PVNV\\($ADDR\\) at $ADDR
+ REFCNT = 1
+ FLAGS = \\(IOK,NOK,pIOK,pNOK\\)
+ IV = 456
+ NV = 456
+ PV = 0');
+
+do_test(12,
+ {$b=>$c},
+'SV = RV\\($ADDR\\) at $ADDR
+ REFCNT = 1
+ FLAGS = \\(ROK\\)
+ RV = $ADDR
+ SV = PVHV\\($ADDR\\) at $ADDR
+ REFCNT = 2
+ FLAGS = \\(SHAREKEYS\\)
+ IV = 1
+ NV = 0
+ ARRAY = $ADDR \\(0:7, 1:1\\)
+ hash quality = 150.0%
+ KEYS = 1
+ FILL = 1
+ MAX = 7
+ RITER = -1
+ EITER = 0x0
+ Elt "123" HASH = $ADDR
+ SV = PVNV\\($ADDR\\) at $ADDR
+ REFCNT = 1
+ FLAGS = \\(IOK,NOK,pIOK,pNOK\\)
+ IV = 456
+ NV = 456
+ PV = 0');
+
+do_test(13,
+ sub(){@_},
+'SV = RV\\($ADDR\\) at $ADDR
+ REFCNT = 1
+ FLAGS = \\(ROK\\)
+ RV = $ADDR
+ SV = PVCV\\($ADDR\\) at $ADDR
+ REFCNT = 2
+ FLAGS = \\(PADBUSY,PADMY,POK,pPOK,ANON\\)
+ IV = 0
+ NV = 0
+ PROTOTYPE = ""
+ COMP_STASH = $ADDR\\t"main"
+ START = $ADDR ===> \\d+
+ ROOT = $ADDR
+ XSUB = 0x0
+ XSUBANY = 0
+ GVGV::GV = $ADDR\\t"main" :: "__ANON__[^"]*"
+ FILE = ".*\\b(?i:peek\\.t)"
+ DEPTH = 0
+(?: MUTEXP = $ADDR
+ OWNER = $ADDR
+)? FLAGS = 0x4
+ PADLIST = $ADDR
+ OUTSIDE = $ADDR \\(MAIN\\)');
+
+do_test(14,
+ \&do_test,
+'SV = RV\\($ADDR\\) at $ADDR
+ REFCNT = 1
+ FLAGS = \\(ROK\\)
+ RV = $ADDR
+ SV = PVCV\\($ADDR\\) at $ADDR
+ REFCNT = (3|4)
+ FLAGS = \\(\\)
+ IV = 0
+ NV = 0
+ COMP_STASH = $ADDR\\t"main"
+ START = $ADDR ===> \\d+
+ ROOT = $ADDR
+ XSUB = 0x0
+ XSUBANY = 0
+ GVGV::GV = $ADDR\\t"main" :: "do_test"
+ FILE = ".*\\b(?i:peek\\.t)"
+ DEPTH = 1
+(?: MUTEXP = $ADDR
+ OWNER = $ADDR
+)? FLAGS = 0x0
+ PADLIST = $ADDR
+ \\d+\\. $ADDR \\("\\$pattern" \\d+-\\d+\\)
+ \\d+\\. $ADDR \\(FAKE "\\$DEBUG" 0-\\d+\\)
+ \\d+\\. $ADDR \\("\\$dump" \\d+-\\d+\\)
+ OUTSIDE = $ADDR \\(MAIN\\)');
+
+do_test(15,
+ qr(tic),
+'SV = RV\\($ADDR\\) at $ADDR
+ REFCNT = 1
+ FLAGS = \\(ROK\\)
+ RV = $ADDR
+ SV = PVMG\\($ADDR\\) at $ADDR
+ REFCNT = 1
+ FLAGS = \\(OBJECT,RMG\\)
+ IV = 0
+ NV = 0
+ PV = 0
+ MAGIC = $ADDR
+ MG_VIRTUAL = $ADDR
+ MG_TYPE = \'r\'
+ MG_OBJ = $ADDR
+ STASH = $ADDR\\t"Regexp"');
+
+do_test(16,
+ (bless {}, "Tac"),
+'SV = RV\\($ADDR\\) at $ADDR
+ REFCNT = 1
+ FLAGS = \\(ROK\\)
+ RV = $ADDR
+ SV = PVHV\\($ADDR\\) at $ADDR
+ REFCNT = 2
+ FLAGS = \\(OBJECT,SHAREKEYS\\)
+ IV = 0
+ NV = 0
+ STASH = $ADDR\\t"Tac"
+ ARRAY = 0x0
+ KEYS = 0
+ FILL = 0
+ MAX = 7
+ RITER = -1
+ EITER = 0x0');
+
+do_test(17,
+ *a,
+'SV = PVGV\\($ADDR\\) at $ADDR
+ REFCNT = 5
+ FLAGS = \\(GMG,SMG,MULTI(?:,IN_PAD)?\\)
+ IV = 0
+ NV = 0
+ MAGIC = $ADDR
+ MG_VIRTUAL = &PL_vtbl_glob
+ MG_TYPE = \'\\*\'
+ MG_OBJ = $ADDR
+ NAME = "a"
+ NAMELEN = 1
+ GvSTASH = $ADDR\\t"main"
+ GP = $ADDR
+ SV = $ADDR
+ REFCNT = 1
+ IO = 0x0
+ FORM = 0x0
+ AV = 0x0
+ HV = 0x0
+ CV = 0x0
+ CVGEN = 0x0
+ GPFLAGS = 0x0
+ LINE = \\d+
+ FILE = ".*\\b(?i:peek\\.t)"
+ FLAGS = $ADDR
+ EGV = $ADDR\\t"a"');
+
+END {
+ 1 while unlink("peek$$");
+}
diff --git a/gnu/usr.bin/perl/t/lib/ph.t b/gnu/usr.bin/perl/t/lib/ph.t
index dd24c79f2dd..de27dee5e23 100644
--- a/gnu/usr.bin/perl/t/lib/ph.t
+++ b/gnu/usr.bin/perl/t/lib/ph.t
@@ -6,7 +6,7 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ @INC = '../lib';
}
# All the constants which Socket.pm tries to make available:
diff --git a/gnu/usr.bin/perl/t/lib/selfloader.t b/gnu/usr.bin/perl/t/lib/selfloader.t
new file mode 100644
index 00000000000..6b9c244b7eb
--- /dev/null
+++ b/gnu/usr.bin/perl/t/lib/selfloader.t
@@ -0,0 +1,201 @@
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ $dir = "self-$$";
+ @INC = $dir;
+ push @INC, '../lib';
+
+ print "1..19\n";
+
+ # First we must set up some selfloader files
+ mkdir $dir, 0755 or die "Can't mkdir $dir: $!";
+
+ open(FOO, ">$dir/Foo.pm") or die;
+ print FOO <<'EOT';
+package Foo;
+use SelfLoader;
+
+sub new { bless {}, shift }
+sub foo;
+sub bar;
+sub bazmarkhianish;
+sub a;
+sub never; # declared but definition should never be read
+1;
+__DATA__
+
+sub foo { shift; shift || "foo" };
+
+sub bar { shift; shift || "bar" }
+
+sub bazmarkhianish { shift; shift || "baz" }
+
+package sheep;
+sub bleat { shift; shift || "baa" }
+
+__END__
+sub never { die "D'oh" }
+EOT
+
+ close(FOO);
+
+ open(BAR, ">$dir/Bar.pm") or die;
+ print BAR <<'EOT';
+package Bar;
+use SelfLoader;
+
+@ISA = 'Baz';
+
+sub new { bless {}, shift }
+sub a;
+
+1;
+__DATA__
+
+sub a { 'a Bar'; }
+sub b { 'b Bar' }
+
+__END__ DATA
+sub never { die "D'oh" }
+EOT
+
+ close(BAR);
+};
+
+
+package Baz;
+
+sub a { 'a Baz' }
+sub b { 'b Baz' }
+sub c { 'c Baz' }
+
+
+package main;
+use Foo;
+use Bar;
+
+$foo = new Foo;
+
+print "not " unless $foo->foo eq 'foo'; # selfloaded first time
+print "ok 1\n";
+
+print "not " unless $foo->foo eq 'foo'; # regular call
+print "ok 2\n";
+
+# Try an undefined method
+eval {
+ $foo->will_fail;
+};
+if ($@ =~ /^Undefined subroutine/) {
+ print "ok 3\n";
+} else {
+ print "not ok 3 $@\n";
+}
+
+# Used to be trouble with this
+eval {
+ my $foo = new Foo;
+ die "oops";
+};
+if ($@ =~ /oops/) {
+ print "ok 4\n";
+} else {
+ print "not ok 4 $@\n";
+}
+
+# Pass regular expression variable to autoloaded function. This used
+# to go wrong in AutoLoader because it used regular expressions to generate
+# autoloaded filename.
+"foo" =~ /(\w+)/;
+print "not " unless $1 eq 'foo';
+print "ok 5\n";
+
+print "not " unless $foo->bar($1) eq 'foo';
+print "ok 6\n";
+
+print "not " unless $foo->bar($1) eq 'foo';
+print "ok 7\n";
+
+print "not " unless $foo->bazmarkhianish($1) eq 'foo';
+print "ok 8\n";
+
+print "not " unless $foo->bazmarkhianish($1) eq 'foo';
+print "ok 9\n";
+
+# Check nested packages inside __DATA__
+print "not " unless sheep::bleat() eq 'baa';
+print "ok 10\n";
+
+# Now check inheritance:
+
+$bar = new Bar;
+
+# Before anything is SelfLoaded there is no declaration of Foo::b so we should
+# get Baz::b
+print "not " unless $bar->b() eq 'b Baz';
+print "ok 11\n";
+
+# There is no Bar::c so we should get Baz::c
+print "not " unless $bar->c() eq 'c Baz';
+print "ok 12\n";
+
+# This selfloads Bar::a because it is stubbed. It also stubs Bar::b as a side
+# effect
+print "not " unless $bar->a() eq 'a Bar';
+print "ok 13\n";
+
+print "not " unless $bar->b() eq 'b Bar';
+print "ok 14\n";
+
+print "not " unless $bar->c() eq 'c Baz';
+print "ok 15\n";
+
+
+
+# Check that __END__ is honoured
+# Try an subroutine that should never be noticed by selfloader
+eval {
+ $foo->never;
+};
+if ($@ =~ /^Undefined subroutine/) {
+ print "ok 16\n";
+} else {
+ print "not ok 16 $@\n";
+}
+
+# Try to read from the data file handle
+my $foodata = <Foo::DATA>;
+close Foo::DATA;
+if (defined $foodata) {
+ print "not ok 17 # $foodata\n";
+} else {
+ print "ok 17\n";
+}
+
+# Check that __END__ DATA is honoured
+# Try an subroutine that should never be noticed by selfloader
+eval {
+ $bar->never;
+};
+if ($@ =~ /^Undefined subroutine/) {
+ print "ok 18\n";
+} else {
+ print "not ok 18 $@\n";
+}
+
+# Try to read from the data file handle
+my $bardata = <Bar::DATA>;
+close Bar::DATA;
+if ($bardata ne "sub never { die \"D'oh\" }\n") {
+ print "not ok 19 # $bardata\n";
+} else {
+ print "ok 19\n";
+}
+
+# cleanup
+END {
+return unless $dir && -d $dir;
+unlink "$dir/Foo.pm", "$dir/Bar.pm";
+rmdir "$dir";
+}
diff --git a/gnu/usr.bin/perl/t/lib/syslfs.t b/gnu/usr.bin/perl/t/lib/syslfs.t
index 28571209428..2bdb69d7e01 100644
--- a/gnu/usr.bin/perl/t/lib/syslfs.t
+++ b/gnu/usr.bin/perl/t/lib/syslfs.t
@@ -4,16 +4,21 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ @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";
+ print "1..0 # Skip: no 64-bit file offsets\n";
exit(0);
}
require Fcntl; import Fcntl qw(/^O_/ /^SEEK_/);
}
+use strict;
+
+our @s;
+our $fail;
+
sub zap {
close(BIG);
unlink("big");
@@ -26,35 +31,42 @@ sub bye {
exit(0);
}
+my $explained;
+
sub explain {
- print <<EOM;
+ unless ($explained++) {
+ 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.)
+# 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 (the network filesystem?)
+# 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.
+# It is just that the test failed now.
#
EOM
+ }
+ print "1..0 # Skip: @_\n" if @_;
}
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";
+if ($^O eq 'MSWin32' || $^O eq 'VMS') {
+ print "1..0 # Skip: no sparse files in $^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";
+ print "1..0 # Skip: no sparse files in $^0, unable to test large files\n";
bye();
}
@@ -95,7 +107,7 @@ 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";
+ print "1..0 # Skip: no sparse files?\n";
bye;
}
@@ -103,16 +115,25 @@ 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.
+# This may fail by producing some signal; run in a subprocess first for safety
$ENV{LC_ALL} = "C";
+my $r = system '../perl', '-I../lib', '-e', <<'EOF';
+use Fcntl qw(/^O_/ /^SEEK_/);
+sysopen(BIG, "big", O_WRONLY|O_CREAT|O_TRUNC) or die $!;
+my $sysseek = sysseek(BIG, 5_000_000_000, SEEK_SET);
+my $syswrite = syswrite(BIG, "big");
+exit 0;
+EOF
+
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();
+unless (! $r && defined $sysseek && $sysseek == 5_000_000_000) {
+ $sysseek = 'undef' unless defined $sysseek;
+ explain("seeking past 2GB failed: ",
+ $r ? 'signal '.($r & 0x7f) : "$! (sysseek returned $sysseek)");
bye();
}
@@ -125,11 +146,12 @@ 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";
+ explain("writing past 2GB failed: process limits?");
} elsif ($! =~ /quota/i) {
- print "1..0\n# filesystem quota limits?\n";
+ explain("filesystem quota limits?");
+ } else {
+ explain("error: $!");
}
- explain();
bye();
}
@@ -138,8 +160,7 @@ unless($syswrite && $close) {
print "# @s\n";
unless ($s[7] == 5_000_000_003) {
- print "1..0\n# not configured to use large files?\n";
- explain();
+ explain("kernel/fs not configured to use large files?");
bye();
}
@@ -148,9 +169,30 @@ sub fail () {
$fail++;
}
+sub offset ($$) {
+ my ($offset_will_be, $offset_want) = @_;
+ my $offset_is = eval $offset_will_be;
+ unless ($offset_is == $offset_want) {
+ print "# bad offset $offset_is, want $offset_want\n";
+ my ($offset_func) = ($offset_will_be =~ /^(\w+)/);
+ if (unpack("L", pack("L", $offset_want)) == $offset_is) {
+ print "# 32-bit wraparound suspected in $offset_func() since\n";
+ print "# $offset_want cast into 32 bits equals $offset_is.\n";
+ } elsif ($offset_want - unpack("L", pack("L", $offset_want)) - 1
+ == $offset_is) {
+ print "# 32-bit wraparound suspected in $offset_func() since\n";
+ printf "# %s - unpack('L', pack('L', %s)) - 1 equals %s.\n",
+ $offset_want,
+ $offset_want,
+ $offset_is;
+ }
+ fail;
+ }
+}
+
print "1..17\n";
-my $fail = 0;
+$fail = 0;
fail unless $s[7] == 5_000_000_003; # exercizes pp_stat
print "ok 1\n";
@@ -166,28 +208,28 @@ 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;
+offset('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;
+offset('sysseek(BIG, 0, SEEK_CUR)', 4_500_000_000);
print "ok 6\n";
-fail unless sysseek(BIG, 1, SEEK_CUR) == 4_500_000_001;
+offset('sysseek(BIG, 1, SEEK_CUR)', 4_500_000_001);
print "ok 7\n";
-fail unless sysseek(BIG, 0, SEEK_CUR) == 4_500_000_001;
+offset('sysseek(BIG, 0, SEEK_CUR)', 4_500_000_001);
print "ok 8\n";
-fail unless sysseek(BIG, -1, SEEK_CUR) == 4_500_000_000;
+offset('sysseek(BIG, -1, SEEK_CUR)', 4_500_000_000);
print "ok 9\n";
-fail unless sysseek(BIG, 0, SEEK_CUR) == 4_500_000_000;
+offset('sysseek(BIG, 0, SEEK_CUR)', 4_500_000_000);
print "ok 10\n";
-fail unless sysseek(BIG, -3, SEEK_END) == 5_000_000_000;
+offset('sysseek(BIG, -3, SEEK_END)', 5_000_000_000);
print "ok 11\n";
-fail unless sysseek(BIG, 0, SEEK_CUR) == 5_000_000_000;
+offset('sysseek(BIG, 0, SEEK_CUR)', 5_000_000_000);
print "ok 12\n";
my $big;
@@ -199,7 +241,9 @@ 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);
+# See that we don't have "big" in the 705_... spot:
+# that would mean that we have a wraparound.
+fail unless sysseek(BIG, 705_032_704, SEEK_SET);
print "ok 15\n";
my $zero;
@@ -210,7 +254,7 @@ print "ok 16\n";
fail unless $zero eq "\0\0\0";
print "ok 17\n";
-explain if $fail;
+explain() if $fail;
bye(); # does the necessary cleanup
diff --git a/gnu/usr.bin/perl/t/lib/textfill.t b/gnu/usr.bin/perl/t/lib/textfill.t
index daeee2367cd..5ff3850cafd 100644
--- a/gnu/usr.bin/perl/t/lib/textfill.t
+++ b/gnu/usr.bin/perl/t/lib/textfill.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ @INC = '../lib';
}
use Text::Wrap qw(&fill);
diff --git a/gnu/usr.bin/perl/t/lib/thr5005.t b/gnu/usr.bin/perl/t/lib/thr5005.t
index 6b3c800f9bc..680e1af3e72 100644
--- a/gnu/usr.bin/perl/t/lib/thr5005.t
+++ b/gnu/usr.bin/perl/t/lib/thr5005.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ @INC = '../lib';
require Config; import Config;
if (! $Config{'use5005threads'}) {
print "1..0 # Skip: not use5005threads\n";
@@ -13,7 +13,7 @@ BEGIN {
$ENV{PERL_DESTRUCT_LEVEL} = 0 unless $ENV{PERL_DESTRUCT_LEVEL} > 3;
}
$| = 1;
-print "1..21\n";
+print "1..22\n";
use Thread 'yield';
print "ok 1\n";
@@ -89,6 +89,18 @@ my $long = "This is short.";
my $longe = " short.";
my $thr1 = new Thread \&threaded, $short, $shorte, "19";
my $thr2 = new Thread \&threaded, $long, $longe, "20";
+my $thr3 = new Thread \&testsprintf, "21";
+
+sub testsprintf {
+ my $testno = shift;
+ # this may coredump if thread vars are not properly initialised
+ my $same = sprintf "%.0f", $testno;
+ if ($testno eq $same) {
+ print "ok $testno\n";
+ } else {
+ print "not ok $testno\t# '$testno' ne '$same'\n";
+ }
+}
sub threaded {
my ($string, $string_end, $testno) = @_;
@@ -115,4 +127,5 @@ EOT
}
$thr1->join;
$thr2->join;
-print "ok 21\n";
+$thr3->join;
+print "ok 22\n";
diff --git a/gnu/usr.bin/perl/t/lib/tie-push.t b/gnu/usr.bin/perl/t/lib/tie-push.t
index 23a0a9403a4..b19aa0d0e8f 100644
--- a/gnu/usr.bin/perl/t/lib/tie-push.t
+++ b/gnu/usr.bin/perl/t/lib/tie-push.t
@@ -2,7 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ @INC = '.';
+ push @INC, '../lib';
}
{
diff --git a/gnu/usr.bin/perl/t/lib/tie-refhash.t b/gnu/usr.bin/perl/t/lib/tie-refhash.t
new file mode 100644
index 00000000000..d80b2e10fc9
--- /dev/null
+++ b/gnu/usr.bin/perl/t/lib/tie-refhash.t
@@ -0,0 +1,305 @@
+#!/usr/bin/perl -w
+#
+# Basic test suite for Tie::RefHash and Tie::RefHash::Nestable.
+#
+# The testing is in two parts: first, run lots of tests on both a tied
+# hash and an ordinary un-tied hash, and check they give the same
+# answer. Then there are tests for those cases where the tied hashes
+# should behave differently to normal hashes, that is, when using
+# references as keys.
+#
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '.';
+ push @INC, '../lib';
+}
+
+use strict;
+use Tie::RefHash;
+use Data::Dumper;
+my $numtests = 34;
+my $currtest = 1;
+print "1..$numtests\n";
+
+my $ref = []; my $ref1 = [];
+
+# Test standard hash functionality, by performing the same operations
+# on a tied hash and on a normal hash, and checking that the results
+# are the same. This does of course assume that Perl hashes are not
+# buggy :-)
+#
+my @tests = standard_hash_tests();
+
+my @ordinary_results = runtests(\@tests, undef);
+foreach my $class ('Tie::RefHash', 'Tie::RefHash::Nestable') {
+ my @tied_results = runtests(\@tests, $class);
+ my $all_ok = 1;
+
+ die if @ordinary_results != @tied_results;
+ foreach my $i (0 .. $#ordinary_results) {
+ my ($or, $ow, $oe) = @{$ordinary_results[$i]};
+ my ($tr, $tw, $te) = @{$tied_results[$i]};
+
+ my $ok = 1;
+ local $^W = 0;
+ $ok = 0 if (defined($or) != defined($tr)) or ($or ne $tr);
+ $ok = 0 if (defined($ow) != defined($tw)) or ($ow ne $tw);
+ $ok = 0 if (defined($oe) != defined($te)) or ($oe ne $te);
+
+ if (not $ok) {
+ print STDERR
+ "failed for $class: $tests[$i]\n",
+ "ordinary hash gave:\n",
+ defined $or ? "\tresult: $or\n" : "\tundef result\n",
+ defined $ow ? "\twarning: $ow\n" : "\tno warning\n",
+ defined $oe ? "\texception: $oe\n" : "\tno exception\n",
+ "tied $class hash gave:\n",
+ defined $tr ? "\tresult: $tr\n" : "\tundef result\n",
+ defined $tw ? "\twarning: $tw\n" : "\tno warning\n",
+ defined $te ? "\texception: $te\n" : "\tno exception\n",
+ "\n";
+ $all_ok = 0;
+ }
+ }
+ test($all_ok);
+}
+
+# Now test Tie::RefHash's special powers
+my (%h, $h);
+$h = eval { tie %h, 'Tie::RefHash' };
+warn $@ if $@;
+test(not $@);
+test(ref($h) eq 'Tie::RefHash');
+test(defined(tied(%h)) and tied(%h) =~ /^Tie::RefHash/);
+$h{$ref} = 'cholet';
+test($h{$ref} eq 'cholet');
+test(exists $h{$ref});
+test((keys %h) == 1);
+test(ref((keys %h)[0]) eq 'ARRAY');
+test((keys %h)[0] eq $ref);
+test((values %h) == 1);
+test((values %h)[0] eq 'cholet');
+my $count = 0;
+while (my ($k, $v) = each %h) {
+ if ($count++ == 0) {
+ test(ref($k) eq 'ARRAY');
+ test($k eq $ref);
+ }
+}
+test($count == 1);
+delete $h{$ref};
+test(not defined $h{$ref});
+test(not exists($h{$ref}));
+test((keys %h) == 0);
+test((values %h) == 0);
+undef $h;
+untie %h;
+
+# And now Tie::RefHash::Nestable's differences from Tie::RefHash.
+$h = eval { tie %h, 'Tie::RefHash::Nestable' };
+warn $@ if $@;
+test(not $@);
+test(ref($h) eq 'Tie::RefHash::Nestable');
+test(defined(tied(%h)) and tied(%h) =~ /^Tie::RefHash::Nestable/);
+$h{$ref}->{$ref1} = 'bungo';
+test($h{$ref}->{$ref1} eq 'bungo');
+
+# Test that the nested hash is also tied (for current implementation)
+test(defined(tied(%{$h{$ref}}))
+ and tied(%{$h{$ref}}) =~ /^Tie::RefHash::Nestable=/ );
+
+test((keys %h) == 1);
+test((keys %h)[0] eq $ref);
+test((keys %{$h{$ref}}) == 1);
+test((keys %{$h{$ref}})[0] eq $ref1);
+
+
+die "expected to run $numtests tests, but ran ", $currtest - 1
+ if $currtest - 1 != $numtests;
+
+@tests = ();
+undef $ref;
+undef $ref1;
+
+exit();
+
+
+# Print 'ok X' if true, 'not ok X' if false
+# Uses global $currtest.
+#
+sub test {
+ my $t = shift;
+ print 'not ' if not $t;
+ print 'ok ', $currtest++, "\n";
+}
+
+
+# Wrapper for Data::Dumper to 'dump' a scalar as an EXPR string.
+sub dumped {
+ my $s = shift;
+ my $d = Dumper($s);
+ $d =~ s/^\$VAR1 =\s*//;
+ $d =~ s/;$//;
+ chomp $d;
+ return $d;
+}
+
+# Crudely dump a hash into a canonical string representation (because
+# hash keys can appear in any order, Data::Dumper may give different
+# strings for the same hash).
+#
+sub dumph {
+ my $h = shift;
+ my $r = '';
+ foreach (sort keys %$h) {
+ $r = dumped($_) . ' => ' . dumped($h->{$_}) . "\n";
+ }
+ return $r;
+}
+
+# Run the tests and give results.
+#
+# Parameters: reference to list of tests to run
+# name of class to use for tied hash, or undef if not tied
+#
+# Returns: list of [R, W, E] tuples, one for each test.
+# R is the return value from running the test, W any warnings it gave,
+# and E any exception raised with 'die'. E and W will be tidied up a
+# little to remove irrelevant details like line numbers :-)
+#
+# Will also run a few of its own 'ok N' tests.
+#
+sub runtests {
+ my ($tests, $class) = @_;
+ my @r;
+
+ my (%h, $h);
+ if (defined $class) {
+ $h = eval { tie %h, $class };
+ warn $@ if $@;
+ test(not $@);
+ test(ref($h) eq $class);
+ test(defined(tied(%h)) and tied(%h) =~ /^\Q$class\E/);
+ }
+
+ foreach (@$tests) {
+ my ($result, $warning, $exception);
+ local $SIG{__WARN__} = sub { $warning .= $_[0] };
+ $result = scalar(eval $_);
+ if ($@)
+ {
+ die "$@:$_" unless defined $class;
+ $exception = $@;
+ }
+
+ foreach ($warning, $exception) {
+ next if not defined;
+ s/ at .+ line \d+\.$//mg;
+ s/ at .+ line \d+, at .*//mg;
+ s/ at .+ line \d+, near .*//mg;
+ }
+
+ my (@warnings, %seen);
+ foreach (split /\n/, $warning) {
+ push @warnings, $_ unless $seen{$_}++;
+ }
+ $warning = join("\n", @warnings);
+
+ push @r, [ $result, $warning, $exception ];
+ }
+
+ return @r;
+}
+
+
+# Things that should work just the same for an ordinary hash and a
+# Tie::RefHash.
+#
+# Each test is a code string to be eval'd, it should do something with
+# %h and give a scalar return value. The global $ref and $ref1 may
+# also be used.
+#
+# One thing we don't test is that the ordering from 'keys', 'values'
+# and 'each' is the same. You can't reasonably expect that.
+#
+sub standard_hash_tests {
+ my @r;
+
+ # Library of standard tests on keys, values and each
+ my $STD_TESTS = <<'END'
+ join $;, sort keys %h;
+ join $;, sort values %h;
+ { my ($v, %tmp); $tmp{$v}++ while (defined($v = each %h)); dumph(\%tmp) }
+ { my ($k, $v, %tmp); $tmp{"$k$;$v"}++ while (($k, $v) = each %h); dumph(\%tmp) }
+END
+ ;
+
+ # Tests on the existence of the element 'foo'
+ my $FOO_TESTS = <<'END'
+ defined $h{foo};
+ exists $h{foo};
+ $h{foo};
+END
+ ;
+
+ # Test storing and deleting 'foo'
+ push @r, split /\n/, <<"END"
+ $STD_TESTS;
+ $FOO_TESTS;
+ \$h{foo} = undef;
+ $STD_TESTS;
+ $FOO_TESTS;
+ \$h{foo} = 'hello';
+ $STD_TESTS;
+ $FOO_TESTS;
+ delete \$h{foo};
+ $STD_TESTS;
+ $FOO_TESTS;
+END
+ ;
+
+ # Test storing and removing under ordinary keys
+ my @things = ('boink', 0, 1, '', undef);
+ foreach my $key (map { dumped($_) } @things) {
+ foreach my $value ((map { dumped($_) } @things), '$ref') {
+ push @r, split /\n/, <<"END"
+ \$h{$key} = $value;
+ $STD_TESTS;
+ defined \$h{$key};
+ exists \$h{$key};
+ \$h{$key};
+ delete \$h{$key};
+ $STD_TESTS;
+ defined \$h{$key};
+ exists \$h{$key};
+ \$h{$key};
+END
+ ;
+ }
+ }
+
+ # Test hash slices
+ my @slicetests;
+ @slicetests = split /\n/, <<'END'
+ @h{'b'} = ();
+ @h{'c'} = ('d');
+ @h{'e'} = ('f', 'g');
+ @h{'h', 'i'} = ();
+ @h{'j', 'k'} = ('l');
+ @h{'m', 'n'} = ('o', 'p');
+ @h{'q', 'r'} = ('s', 't', 'u');
+END
+ ;
+ my @aaa = @slicetests;
+ foreach (@slicetests) {
+ push @r, $_;
+ push @r, split(/\n/, $STD_TESTS);
+ }
+
+ # Test CLEAR
+ push @r, '%h = ();', split(/\n/, $STD_TESTS);
+
+ return @r;
+}
+
diff --git a/gnu/usr.bin/perl/t/lib/tie-splice.t b/gnu/usr.bin/perl/t/lib/tie-splice.t
new file mode 100644
index 00000000000..d7ea6cc1dcc
--- /dev/null
+++ b/gnu/usr.bin/perl/t/lib/tie-splice.t
@@ -0,0 +1,17 @@
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '.';
+ push @INC, '../lib';
+}
+
+# bug id 20001020.002
+# -dlc 20001021
+
+use Tie::Array;
+tie @a,Tie::StdArray;
+undef *Tie::StdArray::SPLICE;
+require "op/splice.t"
+
+# Pre-fix, this failed tests 6-9
diff --git a/gnu/usr.bin/perl/t/lib/tie-stdarray.t b/gnu/usr.bin/perl/t/lib/tie-stdarray.t
index 5a678a5a1ff..c4ae07102ee 100644
--- a/gnu/usr.bin/perl/t/lib/tie-stdarray.t
+++ b/gnu/usr.bin/perl/t/lib/tie-stdarray.t
@@ -2,7 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ @INC = '.';
+ push @INC, '../lib';
}
use Tie::Array;
diff --git a/gnu/usr.bin/perl/t/lib/tie-stdhandle.t b/gnu/usr.bin/perl/t/lib/tie-stdhandle.t
index cf3a1831d0d..f03f5d92f6a 100644
--- a/gnu/usr.bin/perl/t/lib/tie-stdhandle.t
+++ b/gnu/usr.bin/perl/t/lib/tie-stdhandle.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ @INC = '../lib';
}
use Tie::Handle;
@@ -10,16 +10,16 @@ tie *tst,Tie::StdHandle;
$f = 'tst';
-print "1..13\n";
+print "1..13\n";
# my $file tests
-unlink("afile.new") if -f "afile";
-print "$!\nnot " unless open($f,"+>afile");
+unlink("afile.new") if -f "afile";
+print "$!\nnot " unless open($f,"+>afile") && open($f, "+<", "afile");
print "ok 1\n";
print "$!\nnot " unless binmode($f);
print "ok 2\n";
-print "not " unless -f "afile";
+print "not " unless -f "afile";
print "ok 3\n";
print "not " unless print $f "SomeData\n";
print "ok 4\n";
@@ -44,4 +44,4 @@ print "not " unless eof($f);
print "ok 12\n";
print "not " unless close($f);
print "ok 13\n";
-unlink("afile");
+unlink("afile");
diff --git a/gnu/usr.bin/perl/t/lib/tie-stdpush.t b/gnu/usr.bin/perl/t/lib/tie-stdpush.t
index 35ae1b89a4f..31af30c32c7 100644
--- a/gnu/usr.bin/perl/t/lib/tie-stdpush.t
+++ b/gnu/usr.bin/perl/t/lib/tie-stdpush.t
@@ -2,7 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ @INC = '.';
+ push @INC, '../lib';
}
use Tie::Array;
diff --git a/gnu/usr.bin/perl/t/lib/tie-substrhash.t b/gnu/usr.bin/perl/t/lib/tie-substrhash.t
new file mode 100644
index 00000000000..8256db7b58a
--- /dev/null
+++ b/gnu/usr.bin/perl/t/lib/tie-substrhash.t
@@ -0,0 +1,111 @@
+#!/usr/bin/perl -w
+#
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '.';
+ push @INC, '../lib';
+}
+
+print "1..20\n";
+
+use strict;
+
+require Tie::SubstrHash;
+
+my %a;
+
+tie %a, 'Tie::SubstrHash', 3, 3, 3;
+
+$a{abc} = 123;
+$a{bcd} = 234;
+
+print "not " unless $a{abc} == 123;
+print "ok 1\n";
+
+print "not " unless keys %a == 2;
+print "ok 2\n";
+
+delete $a{abc};
+
+print "not " unless $a{bcd} == 234;
+print "ok 3\n";
+
+print "not " unless (values %a)[0] == 234;
+print "ok 4\n";
+
+eval { $a{abcd} = 123 };
+print "not " unless $@ =~ /Key "abcd" is not 3 characters long/;
+print "ok 5\n";
+
+eval { $a{abc} = 1234 };
+print "not " unless $@ =~ /Value "1234" is not 3 characters long/;
+print "ok 6\n";
+
+eval { $a = $a{abcd}; $a++ };
+print "not " unless $@ =~ /Key "abcd" is not 3 characters long/;
+print "ok 7\n";
+
+@a{qw(abc cde)} = qw(123 345);
+
+print "not " unless $a{cde} == 345;
+print "ok 8\n";
+
+eval { $a{def} = 456 };
+print "not " unless $@ =~ /Table is full \(3 elements\)/;
+print "ok 9\n";
+
+%a = ();
+
+print "not " unless keys %a == 0;
+print "ok 10\n";
+
+# Tests 11..16 by Linc Madison.
+
+my $hashsize = 119; # arbitrary values from my data
+my %test;
+tie %test, "Tie::SubstrHash", 13, 86, $hashsize;
+
+for (my $i = 1; $i <= $hashsize; $i++) {
+ my $key1 = $i + 100_000; # fix to uniform 6-digit numbers
+ my $key2 = "abcdefg$key1";
+ $test{$key2} = ("abcdefgh" x 10) . "$key1";
+}
+
+for (my $i = 1; $i <= $hashsize; $i++) {
+ my $key1 = $i + 100_000;
+ my $key2 = "abcdefg$key1";
+ unless ($test{$key2}) {
+ print "not ";
+ last;
+ }
+}
+print "ok 11\n";
+
+print "not " unless Tie::SubstrHash::findgteprime(1) == 2;
+print "ok 12\n";
+
+print "not " unless Tie::SubstrHash::findgteprime(2) == 2;
+print "ok 13\n";
+
+print "not " unless Tie::SubstrHash::findgteprime(5.5) == 7;
+print "ok 14\n";
+
+print "not " unless Tie::SubstrHash::findgteprime(13) == 13;
+print "ok 15\n";
+
+print "not " unless Tie::SubstrHash::findgteprime(13.000001) == 17;
+print "ok 16\n";
+
+print "not " unless Tie::SubstrHash::findgteprime(114) == 127;
+print "ok 17\n";
+
+print "not " unless Tie::SubstrHash::findgteprime(1000) == 1009;
+print "ok 18\n";
+
+print "not " unless Tie::SubstrHash::findgteprime(1024) == 1031;
+print "ok 19\n";
+
+print "not " unless Tie::SubstrHash::findgteprime(10000) == 10007;
+print "ok 20\n";
+
diff --git a/gnu/usr.bin/perl/t/op/64bitint.t b/gnu/usr.bin/perl/t/op/64bitint.t
index 60f72c3536e..88fbc55c671 100644
--- a/gnu/usr.bin/perl/t/op/64bitint.t
+++ b/gnu/usr.bin/perl/t/op/64bitint.t
@@ -3,20 +3,20 @@
BEGIN {
eval { my $q = pack "q", 0 };
if ($@) {
- print "1..0\n# no 64-bit types\n";
+ print "1..0\n# Skip: no 64-bit types\n";
exit(0);
}
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ @INC = '../lib';
}
-# This could use a lot of more tests.
+# This could use many more tests.
# so that using > 0xfffffff constants and
# 32+ bit integers don't cause noise
no warnings qw(overflow portable);
-print "1..48\n";
+print "1..55\n";
my $q = 12345678901;
my $r = 23456789012;
@@ -123,85 +123,106 @@ $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";
+if ($^O ne 'unicos') {
+ $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";
+
+} else {
+ # Unicos has imprecise doubles (14 decimal digits or so),
+ # especially if operating near the UV/IV limits the low-order bits
+ # become mangled even by simple arithmetic operations.
+ for (23..37) {
+ print "ok $_ # skipped: too imprecise numbers\n";
+ }
+}
$x = '';
@@ -233,10 +254,44 @@ print "ok 45\n";
print "not " unless (0x8000000000000000 | 1) == 0x8000000000000001;
print "ok 46\n";
-print "not " unless (0xf000000000000000 & 0x8000000000000000) == 0x8000000000000000;
+print "not "
+ unless (0xf000000000000000 & 0x8000000000000000) == 0x8000000000000000;
print "ok 47\n";
-print "not " unless (0xf000000000000000 ^ 0xfffffffffffffff0) == 0x0ffffffffffffff0;
+print "not "
+ unless (0xf000000000000000 ^ 0xfffffffffffffff0) == 0x0ffffffffffffff0;
print "ok 48\n";
+
+print "not "
+ unless (sprintf "%b", ~0) eq
+ '1111111111111111111111111111111111111111111111111111111111111111';
+print "ok 49\n";
+
+print "not "
+ unless (sprintf "%64b", ~0) eq
+ '1111111111111111111111111111111111111111111111111111111111111111';
+print "ok 50\n";
+
+print "not " unless (sprintf "%d", ~0>>1) eq '9223372036854775807';
+print "ok 51\n";
+
+print "not " unless (sprintf "%u", ~0) eq '18446744073709551615';
+print "ok 52\n";
+
+# If the 53..55 fail you have problems in the parser's string->int conversion,
+# see toke.c:scan_num().
+
+$q = -9223372036854775808;
+print "# $q ne\n# -9223372036854775808\nnot " unless "$q" eq "-9223372036854775808";
+print "ok 53\n";
+
+$q = 9223372036854775807;
+print "# $q ne\n# 9223372036854775807\nnot " unless "$q" eq "9223372036854775807";
+print "ok 54\n";
+
+$q = 18446744073709551615;
+print "# $q ne\n# 18446744073709551615\nnot " unless "$q" eq "18446744073709551615";
+print "ok 55\n";
+
# eof
diff --git a/gnu/usr.bin/perl/t/op/anonsub.t b/gnu/usr.bin/perl/t/op/anonsub.t
new file mode 100644
index 00000000000..17889d9d2f9
--- /dev/null
+++ b/gnu/usr.bin/perl/t/op/anonsub.t
@@ -0,0 +1,93 @@
+#!./perl
+
+chdir 't' if -d 't';
+@INC = '../lib';
+$Is_VMS = $^O eq 'VMS';
+$Is_MSWin32 = $^O eq 'MSWin32';
+$ENV{PERL5LIB} = "../lib" unless $Is_VMS;
+
+$|=1;
+
+undef $/;
+@prgs = split "\n########\n", <DATA>;
+print "1..", scalar @prgs, "\n";
+
+$tmpfile = "asubtmp000";
+1 while -f ++$tmpfile;
+END { if ($tmpfile) { 1 while unlink $tmpfile; } }
+
+for (@prgs){
+ my $switch = "";
+ if (s/^\s*(-\w+)//){
+ $switch = $1;
+ }
+ my($prog,$expected) = split(/\nEXPECT\n/, $_);
+ open TEST, ">$tmpfile";
+ print TEST "$prog\n";
+ close TEST;
+ my $results = $Is_VMS ?
+ `MCR $^X "-I[-.lib]" $switch $tmpfile 2>&1` :
+ $Is_MSWin32 ?
+ `.\\perl -I../lib $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
+ $results =~ s/runltmp\d+/-/g;
+ $results =~ s/\n%[A-Z]+-[SIWEF]-.*$// if $Is_VMS; # clip off DCL status msg
+ $expected =~ s/\n+$//;
+ 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__
+sub X {
+ my $n = "ok 1\n";
+ sub { print $n };
+}
+my $x = X();
+undef &X;
+$x->();
+EXPECT
+ok 1
+########
+sub X {
+ my $n = "ok 1\n";
+ sub {
+ my $dummy = $n; # eval can't close on $n without internal reference
+ eval 'print $n';
+ die $@ if $@;
+ };
+}
+my $x = X();
+undef &X;
+$x->();
+EXPECT
+ok 1
+########
+sub X {
+ my $n = "ok 1\n";
+ eval 'sub { print $n }';
+}
+my $x = X();
+die $@ if $@;
+undef &X;
+$x->();
+EXPECT
+ok 1
+########
+sub X;
+sub X {
+ my $n = "ok 1\n";
+ eval 'sub Y { my $p = shift; $p->() }';
+ die $@ if $@;
+ Y(sub { print $n });
+}
+X();
+EXPECT
+ok 1
diff --git a/gnu/usr.bin/perl/t/op/args.t b/gnu/usr.bin/perl/t/op/args.t
index 48bf5afec09..ce2c3988656 100644
--- a/gnu/usr.bin/perl/t/op/args.t
+++ b/gnu/usr.bin/perl/t/op/args.t
@@ -1,6 +1,6 @@
#!./perl
-print "1..8\n";
+print "1..9\n";
# test various operations on @_
@@ -52,3 +52,24 @@ sub new4 { goto &new2 }
print "# got [@$y], expected [a b c y]\nnot " unless "@$y" eq "a b c y";
print "ok $ord\n";
}
+
+# see if POPSUB gets to see the right pad across a dounwind() with
+# a reified @_
+
+sub methimpl {
+ my $refarg = \@_;
+ die( "got: @_\n" );
+}
+
+sub method {
+ &methimpl;
+}
+
+sub try {
+ eval { method('foo', 'bar'); };
+ print "# $@" if $@;
+}
+
+for (1..5) { try() }
+++$ord;
+print "ok $ord\n";
diff --git a/gnu/usr.bin/perl/t/op/attrs.t b/gnu/usr.bin/perl/t/op/attrs.t
index 615e4d33430..27020048816 100644
--- a/gnu/usr.bin/perl/t/op/attrs.t
+++ b/gnu/usr.bin/perl/t/op/attrs.t
@@ -4,7 +4,7 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ @INC = '../lib';
}
sub NTESTS () ;
diff --git a/gnu/usr.bin/perl/t/op/avhv.t b/gnu/usr.bin/perl/t/op/avhv.t
index cd7c957619d..5b91fd21474 100644
--- a/gnu/usr.bin/perl/t/op/avhv.t
+++ b/gnu/usr.bin/perl/t/op/avhv.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ @INC = '../lib';
}
require Tie::Array;
diff --git a/gnu/usr.bin/perl/t/op/concat.t b/gnu/usr.bin/perl/t/op/concat.t
new file mode 100644
index 00000000000..76074e0f28f
--- /dev/null
+++ b/gnu/usr.bin/perl/t/op/concat.t
@@ -0,0 +1,100 @@
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '../lib';
+}
+
+print "1..11\n";
+
+($a, $b, $c) = qw(foo bar);
+
+print "not " unless "$a" eq "foo";
+print "ok 1\n";
+
+print "not " unless "$a$b" eq "foobar";
+print "ok 2\n";
+
+print "not " unless "$c$a$c" eq "foo";
+print "ok 3\n";
+
+# Okay, so that wasn't very challenging. Let's go Unicode.
+
+my $test = 4;
+
+{
+ # bug id 20000819.004
+
+ $_ = $dx = "\x{10f2}";
+ s/($dx)/$dx$1/;
+ {
+ use bytes;
+ print "not " unless $_ eq "$dx$dx";
+ print "ok $test\n";
+ $test++;
+ }
+
+ $_ = $dx = "\x{10f2}";
+ s/($dx)/$1$dx/;
+ {
+ use bytes;
+ print "not " unless $_ eq "$dx$dx";
+ print "ok $test\n";
+ $test++;
+ }
+
+ $dx = "\x{10f2}";
+ $_ = "\x{10f2}\x{10f2}";
+ s/($dx)($dx)/$1$2/;
+ {
+ use bytes;
+ print "not " unless $_ eq "$dx$dx";
+ print "ok $test\n";
+ $test++;
+ }
+}
+
+{
+ # bug id 20000901.092
+ # test that undef left and right of utf8 results in a valid string
+
+ my $a;
+ $a .= "\x{1ff}";
+ print "not " unless $a eq "\x{1ff}";
+ print "ok $test\n";
+ $test++;
+}
+
+{
+ # ID 20001020.006
+
+ "x" =~ /(.)/; # unset $2
+
+ # Without the fix this 5.7.0 would croak:
+ # Modification of a read-only value attempted at ...
+ "$2\x{1234}";
+
+ print "ok $test\n";
+ $test++;
+
+ # For symmetry with the above.
+ "\x{1234}$2";
+
+ print "ok $test\n";
+ $test++;
+
+ *pi = \undef;
+ # This bug existed earlier than the $2 bug, but is fixed with the same
+ # patch. Without the fix this 5.7.0 would also croak:
+ # Modification of a read-only value attempted at ...
+ "$pi\x{1234}";
+
+ print "ok $test\n";
+ $test++;
+
+ # For symmetry with the above.
+ "\x{1234}$pi";
+
+ print "ok $test\n";
+ $test++;
+}
diff --git a/gnu/usr.bin/perl/t/op/defins.t b/gnu/usr.bin/perl/t/op/defins.t
index 9e714a718bc..33c74ea28e8 100644
--- a/gnu/usr.bin/perl/t/op/defins.t
+++ b/gnu/usr.bin/perl/t/op/defins.t
@@ -6,7 +6,7 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ @INC = '../lib';
$SIG{__WARN__} = sub { $warns++; warn $_[0] };
print "1..14\n";
}
diff --git a/gnu/usr.bin/perl/t/op/die_exit.t b/gnu/usr.bin/perl/t/op/die_exit.t
index cb0478b9b2e..a389946fe37 100644
--- a/gnu/usr.bin/perl/t/op/die_exit.t
+++ b/gnu/usr.bin/perl/t/op/die_exit.t
@@ -7,7 +7,7 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib' if -e '../lib';
+ @INC = '../lib';
}
if ($^O eq 'mpeix') {
diff --git a/gnu/usr.bin/perl/t/op/exists_sub.t b/gnu/usr.bin/perl/t/op/exists_sub.t
index 3363dfd837a..d4aa29251ad 100644
--- a/gnu/usr.bin/perl/t/op/exists_sub.t
+++ b/gnu/usr.bin/perl/t/op/exists_sub.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ @INC = '../lib';
}
print "1..9\n";
diff --git a/gnu/usr.bin/perl/t/op/filetest.t b/gnu/usr.bin/perl/t/op/filetest.t
index e00d5fb7b06..f757c79c05f 100644
--- a/gnu/usr.bin/perl/t/op/filetest.t
+++ b/gnu/usr.bin/perl/t/op/filetest.t
@@ -5,7 +5,7 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib' if -d '../lib';
+ @INC = '../lib';
}
use Config;
diff --git a/gnu/usr.bin/perl/t/op/grent.t b/gnu/usr.bin/perl/t/op/grent.t
index 761d8b9cf60..211dc911bba 100644
--- a/gnu/usr.bin/perl/t/op/grent.t
+++ b/gnu/usr.bin/perl/t/op/grent.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, "../lib" if -d "../lib";
+ @INC = '../lib';
eval {my @n = getgrgid 0};
if ($@ && $@ =~ /(The \w+ function is unimplemented)/) {
print "1..0 # Skip: $1\n";
@@ -54,9 +54,9 @@ BEGIN {
}
}
-# By now GR filehandle should be open and full of juicy group entries.
+# By now the GR filehandle should be open and full of juicy group entries.
-print "1..1\n";
+print "1..2\n";
# Go through at most this many groups.
# (note that the first entry has been read away by now)
@@ -67,9 +67,11 @@ my $tst = 1;
my %perfect;
my %seen;
+setgrent();
while (<GR>) {
chomp;
- my @s = split /:/;
+ # LIMIT -1 so that groups with no users don't fall off
+ my @s = split /:/, $_, -1;
my ($name_s,$passwd_s,$gid_s,$members_s) = @s;
if (@s) {
push @{ $seen{$name_s} }, $.;
@@ -111,6 +113,8 @@ while (<GR>) {
$n++;
}
+endgrent();
+
if (keys %perfect == 0) {
$max++;
print <<EOEX;
@@ -136,4 +140,29 @@ print "ok ", $tst++;
print "\t# (not necessarily serious: run t/op/grent.t by itself)" if $not;
print "\n";
+# Test both the scalar and list contexts.
+
+my @gr1;
+
+setgrent();
+for (1..$max) {
+ my $gr = scalar getgrent();
+ last unless defined $gr;
+ push @gr1, $gr;
+}
+endgrent();
+
+my @gr2;
+
+setgrent();
+for (1..$max) {
+ my ($gr) = (getgrent());
+ last unless defined $gr;
+ push @gr2, $gr;
+}
+endgrent();
+
+print "not " unless "@gr1" eq "@gr2";
+print "ok ", $tst++, "\n";
+
close(GR);
diff --git a/gnu/usr.bin/perl/t/op/hashwarn.t b/gnu/usr.bin/perl/t/op/hashwarn.t
index 9182273ec3c..8466a7196e5 100644
--- a/gnu/usr.bin/perl/t/op/hashwarn.t
+++ b/gnu/usr.bin/perl/t/op/hashwarn.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ @INC = '../lib';
}
use strict;
diff --git a/gnu/usr.bin/perl/t/op/length.t b/gnu/usr.bin/perl/t/op/length.t
new file mode 100644
index 00000000000..ceb005ecc4a
--- /dev/null
+++ b/gnu/usr.bin/perl/t/op/length.t
@@ -0,0 +1,85 @@
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '../lib';
+}
+
+print "1..13\n";
+
+print "not " unless length("") == 0;
+print "ok 1\n";
+
+print "not " unless length("abc") == 3;
+print "ok 2\n";
+
+$_ = "foobar";
+print "not " unless length() == 6;
+print "ok 3\n";
+
+# Okay, so that wasn't very challenging. Let's go Unicode.
+
+{
+ my $a = "\x{41}";
+
+ print "not " unless length($a) == 1;
+ print "ok 4\n";
+ $test++;
+
+ use bytes;
+ print "not " unless $a eq "\x41" && length($a) == 1;
+ print "ok 5\n";
+ $test++;
+}
+
+{
+ my $a = "\x{80}";
+
+ print "not " unless length($a) == 1;
+ print "ok 6\n";
+ $test++;
+
+ use bytes;
+ print "not " unless $a eq "\xc2\x80" && length($a) == 2;
+ print "ok 7\n";
+ $test++;
+}
+
+{
+ my $a = "\x{100}";
+
+ print "not " unless length($a) == 1;
+ print "ok 8\n";
+ $test++;
+
+ use bytes;
+ print "not " unless $a eq "\xc4\x80" && length($a) == 2;
+ print "ok 9\n";
+ $test++;
+}
+
+{
+ my $a = "\x{100}\x{80}";
+
+ print "not " unless length($a) == 2;
+ print "ok 10\n";
+ $test++;
+
+ use bytes;
+ print "not " unless $a eq "\xc4\x80\xc2\x80" && length($a) == 4;
+ print "ok 11\n";
+ $test++;
+}
+
+{
+ my $a = "\x{80}\x{100}";
+
+ print "not " unless length($a) == 2;
+ print "ok 12\n";
+ $test++;
+
+ use bytes;
+ print "not " unless $a eq "\xc2\x80\xc4\x80" && length($a) == 4;
+ print "ok 13\n";
+ $test++;
+}
diff --git a/gnu/usr.bin/perl/t/op/lex_assign.t b/gnu/usr.bin/perl/t/op/lex_assign.t
index 2fb059d8d87..d761f73ce7c 100644
--- a/gnu/usr.bin/perl/t/op/lex_assign.t
+++ b/gnu/usr.bin/perl/t/op/lex_assign.t
@@ -2,9 +2,8 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ @INC = '../lib';
}
-$ENV{PERL_DESTRUCT_LEVEL} = 0 unless $ENV{PERL_DESTRUCT_LEVEL} > 3;
umask 0;
$xref = \ "";
@@ -112,11 +111,12 @@ for (@INPUT) {
$ord++;
($op, undef, $comment) = /^([^\#]+)(\#\s+(.*))?/;
$comment = $op unless defined $comment;
+ chomp;
$op = "$op==$op" unless $op =~ /==/;
($op, $expectop) = $op =~ /(.*)==(.*)/;
$skip = ($op =~ /^'\?\?\?'/ or $comment =~ /skip\(.*\Q$^O\E.*\)/i)
- ? "skip" : "not";
+ ? "skip" : "# '$_'\nnot";
$integer = ($comment =~ /^i_/) ? "use integer" : '' ;
(print "#skipping $comment:\nok $ord\n"), next if $skip eq 'skip';
@@ -137,7 +137,7 @@ EOE
print "# skipping $comment: unimplemented:\nok $ord\n";
} else {
warn $@;
- print "not ok $ord\n";
+ print "# '$_'\nnot ok $ord\n";
}
}
}
@@ -146,6 +146,7 @@ for (@simple_input) {
$ord++;
($op, undef, $comment) = /^([^\#]+)(\#\s+(.*))?/;
$comment = $op unless defined $comment;
+ chomp;
($operator, $variable) = /^\s*(\w+)\s*\$(\w+)/ or warn "misprocessed '$_'\n";
eval <<EOE;
local \$SIG{__WARN__} = \\&wrn;
@@ -164,14 +165,14 @@ EOE
print "# skipping $comment: syntax not good for selfassign:\nok $ord\n";
} else {
warn $@;
- print "not ok $ord\n";
+ print "# '$_'\nnot ok $ord\n";
}
}
}
__END__
ref $xref # ref
ref $cstr # ref nonref
-`$runme -e "print qq[1\n]"` # backtick skip(MSWin32)
+`$runme -e "print qq[1\\n]"` # backtick skip(MSWin32)
`$undefed` # backtick undef skip(MSWin32)
<*> # glob
<OP> # readline
@@ -242,7 +243,7 @@ lc $cstr # lc
quotemeta $cstr # quotemeta
@$aref # rv2av
@$undefed # rv2av undef
-each %h==1 # each
+(each %h) % 2 == 1 # each
values %h # values
keys %h # keys
%$href # rv2hv
@@ -307,7 +308,7 @@ getpriority $$, $$ # getpriority
time # time
localtime $^T # localtime
gmtime $^T # gmtime
-sleep 1 # sleep
+'???' # sleep: can randomly fail
'???' # alarm
'???' # shmget
'???' # shmctl
diff --git a/gnu/usr.bin/perl/t/op/lfs.t b/gnu/usr.bin/perl/t/op/lfs.t
index e704f6f57b6..0a1c3998401 100644
--- a/gnu/usr.bin/perl/t/op/lfs.t
+++ b/gnu/usr.bin/perl/t/op/lfs.t
@@ -4,15 +4,20 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ @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";
+ print "1..0 # Skip: no 64-bit file offsets\n";
exit(0);
}
}
+use strict;
+
+our @s;
+our $fail;
+
sub zap {
close(BIG);
unlink("big");
@@ -25,35 +30,42 @@ sub bye {
exit(0);
}
+my $explained;
+
sub explain {
- print <<EOM;
+ unless ($explained++) {
+ 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.)
+# 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 (the network filesystem?)
+# 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.
+# It is just that the test failed now.
#
EOM
+ }
+ print "1..0 # Skip: @_\n" if @_;
}
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";
+if ($^O eq 'MSWin32' || $^O eq 'VMS') {
+ print "1..0 # Skip: no sparse files in $^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";
+ print "1..0 # Skip: no sparse files in $^0, unable to test large files\n";
bye();
}
@@ -102,7 +114,7 @@ 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";
+ print "1..0 # Skip: no sparse files?\n";
bye;
}
@@ -110,14 +122,22 @@ 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.
+# This may fail by producing some signal; run in a subprocess first for safety
$ENV{LC_ALL} = "C";
+my $r = system '../perl', '-e', <<'EOF';
+open(BIG, ">big");
+seek(BIG, 5_000_000_000, 0);
+print BIG "big";
+exit 0;
+EOF
+
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();
+if ($r or not seek(BIG, 5_000_000_000, $SEEK_SET)) {
+ my $err = $r ? 'signal '.($r & 0x7f) : $!;
+ explain("seeking past 2GB failed: $err");
bye();
}
@@ -129,11 +149,12 @@ 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";
+ explain("writing past 2GB failed: process limits?");
} elsif ($! =~ /quota/i) {
- print "1..0\n# filesystem quota limits?\n";
+ explain("filesystem quota limits?");
+ } else {
+ explain("error: $!");
}
- explain();
bye();
}
@@ -142,8 +163,7 @@ unless ($print && $close) {
print "# @s\n";
unless ($s[7] == 5_000_000_003) {
- print "1..0\n# not configured to use large files?\n";
- explain();
+ explain("kernel/fs not configured to use large files?");
bye();
}
@@ -152,9 +172,30 @@ sub fail () {
$fail++;
}
+sub offset ($$) {
+ my ($offset_will_be, $offset_want) = @_;
+ my $offset_is = eval $offset_will_be;
+ unless ($offset_is == $offset_want) {
+ print "# bad offset $offset_is, want $offset_want\n";
+ my ($offset_func) = ($offset_will_be =~ /^(\w+)/);
+ if (unpack("L", pack("L", $offset_want)) == $offset_is) {
+ print "# 32-bit wraparound suspected in $offset_func() since\n";
+ print "# $offset_want cast into 32 bits equals $offset_is.\n";
+ } elsif ($offset_want - unpack("L", pack("L", $offset_want)) - 1
+ == $offset_is) {
+ print "# 32-bit wraparound suspected in $offset_func() since\n";
+ printf "# %s - unpack('L', pack('L', %s)) - 1 equals %s.\n",
+ $offset_want,
+ $offset_want,
+ $offset_is;
+ }
+ fail;
+ }
+}
+
print "1..17\n";
-my $fail = 0;
+$fail = 0;
fail unless $s[7] == 5_000_000_003; # exercizes pp_stat
print "ok 1\n";
@@ -174,25 +215,28 @@ binmode BIG;
fail unless seek(BIG, 4_500_000_000, $SEEK_SET);
print "ok 5\n";
-fail unless tell(BIG) == 4_500_000_000;
+offset('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;
+# If you get 205_032_705 from here it means that
+# your tell() is returning 32-bit values since (I32)4_500_000_001
+# is exactly 205_032_705.
+offset('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;
+offset('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;
+offset('tell(BIG)', 5_000_000_000);
print "ok 12\n";
my $big;
@@ -204,6 +248,8 @@ fail unless $big eq "big";
print "ok 14\n";
# 705_032_704 = (I32)5_000_000_000
+# See that we don't have "big" in the 705_... spot:
+# that would mean that we have a wraparound.
fail unless seek(BIG, 705_032_704, $SEEK_SET);
print "ok 15\n";
@@ -215,7 +261,7 @@ print "ok 16\n";
fail unless $zero eq "\0\0\0";
print "ok 17\n";
-explain if $fail;
+explain() if $fail;
bye(); # does the necessary cleanup
diff --git a/gnu/usr.bin/perl/t/op/lop.t b/gnu/usr.bin/perl/t/op/lop.t
index f15201ff096..d57271abd62 100644
--- a/gnu/usr.bin/perl/t/op/lop.t
+++ b/gnu/usr.bin/perl/t/op/lop.t
@@ -6,7 +6,7 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ @INC = '../lib';
}
print "1..7\n";
diff --git a/gnu/usr.bin/perl/t/op/my_stash.t b/gnu/usr.bin/perl/t/op/my_stash.t
new file mode 100644
index 00000000000..4a1d5022e02
--- /dev/null
+++ b/gnu/usr.bin/perl/t/op/my_stash.t
@@ -0,0 +1,31 @@
+#!./perl
+
+package Foo;
+
+BEGIN {
+ @INC = '../lib';
+}
+
+use Test;
+
+plan tests => 7;
+
+use constant MyClass => 'Foo::Bar::Biz::Baz';
+
+{
+ package Foo::Bar::Biz::Baz;
+}
+
+for (qw(Foo Foo:: MyClass __PACKAGE__)) {
+ eval "sub { my $_ \$obj = shift; }";
+ ok ! $@;
+# print $@ if $@;
+}
+
+use constant NoClass => 'Nope::Foo::Bar::Biz::Baz';
+
+for (qw(Nope Nope:: NoClass)) {
+ eval "sub { my $_ \$obj = shift; }";
+ ok $@;
+# print $@ if $@;
+}
diff --git a/gnu/usr.bin/perl/t/op/nothr5005.t b/gnu/usr.bin/perl/t/op/nothr5005.t
index fd36e2e89ab..411a0b470e7 100644
--- a/gnu/usr.bin/perl/t/op/nothr5005.t
+++ b/gnu/usr.bin/perl/t/op/nothr5005.t
@@ -6,7 +6,7 @@
BEGIN
{
chdir 't' if -d 't';
- unshift @INC, "../lib";
+ @INC = '../lib';
require Config;
import Config;
if ($Config{'use5005threads'})
diff --git a/gnu/usr.bin/perl/t/op/numconvert.t b/gnu/usr.bin/perl/t/op/numconvert.t
index 8eb9b6e3418..f3c9867a911 100644
--- a/gnu/usr.bin/perl/t/op/numconvert.t
+++ b/gnu/usr.bin/perl/t/op/numconvert.t
@@ -51,7 +51,13 @@ 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";
+ print "1..0 # skipped: unsigned perl arithmetic is not sane";
+ eval { require Config; import Config };
+ use vars qw(%Config);
+ if ($Config{d_quad} eq 'define') {
+ print " (common in 64-bit platforms)";
+ }
+ print "\n";
exit 0;
}
diff --git a/gnu/usr.bin/perl/t/op/pos.t b/gnu/usr.bin/perl/t/op/pos.t
index 46811b7bbc7..f3bc23c84ac 100644
--- a/gnu/usr.bin/perl/t/op/pos.t
+++ b/gnu/usr.bin/perl/t/op/pos.t
@@ -1,6 +1,6 @@
#!./perl
-print "1..3\n";
+print "1..4\n";
$x='banana';
$x=~/.a/g;
@@ -14,3 +14,10 @@ sub f { my $p=$_[0]; return $p }
$x=~/.a/g;
if (f(pos($x))==4) {print "ok 3\n"} else {print "not ok 3\n";}
+# Is pos() set inside //g? (bug id 19990615.008)
+$x = "test string?"; $x =~ s/\w/pos($x)/eg;
+print "not " unless $x eq "0123 5678910?";
+print "ok 4\n";
+
+
+
diff --git a/gnu/usr.bin/perl/t/op/pwent.t b/gnu/usr.bin/perl/t/op/pwent.t
index ca14a99eec4..d811f06a33e 100644
--- a/gnu/usr.bin/perl/t/op/pwent.t
+++ b/gnu/usr.bin/perl/t/op/pwent.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, "../lib" if -d "../lib";
+ @INC = '../lib';
eval {my @n = getpwuid 0};
if ($@ && $@ =~ /(The \w+ function is unimplemented)/) {
print "1..0 # Skip: $1\n";
@@ -55,9 +55,9 @@ BEGIN {
}
}
-# By now PW filehandle should be open and full of juicy password entries.
+# By now the PW filehandle should be open and full of juicy password entries.
-print "1..1\n";
+print "1..2\n";
# Go through at most this many users.
# (note that the first entry has been read away by now)
@@ -68,10 +68,17 @@ my $tst = 1;
my %perfect;
my %seen;
+setpwent();
while (<PW>) {
chomp;
- my @s = split /:/;
- my ($name_s, $passwd_s, $uid_s, $gid_s, $gcos_s, $home_s, $shell_s) = @s;
+ # LIMIT -1 so that users with empty shells don't fall off
+ my @s = split /:/, $_, -1;
+ my ($name_s, $passwd_s, $uid_s, $gid_s, $gcos_s, $home_s, $shell_s);
+ if ($^O eq 'darwin') {
+ ($name_s, $passwd_s, $uid_s, $gid_s, $gcos_s, $home_s, $shell_s) = @s[0,1,2,3,7,8,9];
+ } else {
+ ($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} }, $.;
@@ -86,7 +93,7 @@ while (<PW>) {
}
# In principle we could whine if @s != 7 but do we know enough
# of passwd file formats everywhere?
- if (@s == 7) {
+ if (@s == 7 || ($^O eq 'darwin' && @s == 10)) {
@n = getpwuid($uid_s);
# 'nobody' et al.
next unless @n;
@@ -108,6 +115,7 @@ while (<PW>) {
}
$n++;
}
+endpwent();
if (keys %perfect == 0) {
$max++;
@@ -134,4 +142,29 @@ print "ok ", $tst++;
print "\t# (not necessarily serious: run t/op/pwent.t by itself)" if $not;
print "\n";
+# Test both the scalar and list contexts.
+
+my @pw1;
+
+setpwent();
+for (1..$max) {
+ my $pw = scalar getpwent();
+ last unless defined $pw;
+ push @pw1, $pw;
+}
+endpwent();
+
+my @pw2;
+
+setpwent();
+for (1..$max) {
+ my ($pw) = (getpwent());
+ last unless defined $pw;
+ push @pw2, $pw;
+}
+endpwent();
+
+print "not " unless "@pw1" eq "@pw2";
+print "ok ", $tst++, "\n";
+
close(PW);
diff --git a/gnu/usr.bin/perl/t/op/regmesg.t b/gnu/usr.bin/perl/t/op/regmesg.t
new file mode 100644
index 00000000000..01fa675bd5d
--- /dev/null
+++ b/gnu/usr.bin/perl/t/op/regmesg.t
@@ -0,0 +1,179 @@
+#!./perl -w
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '../lib';
+}
+
+my $debug = 1;
+
+##
+## If the markers used are changed (search for "MARKER1" in regcomp.c),
+## update only these two variables, and leave the {#} in the @death/@warning
+## arrays below. The {#} is a meta-marker -- it marks where the marker should
+## go.
+
+my $marker1 = "HERE";
+my $marker2 = " << HERE ";
+
+##
+## Key-value pairs of code/error of code that should have fatal errors.
+##
+
+eval 'use Config'; # assume defaults if fail
+our %Config;
+my $inf_m1 = ($Config{reg_infty} || 32767) - 1;
+my $inf_p1 = $inf_m1 + 2;
+my @death =
+(
+ '/[[=foo=]]/' => 'POSIX syntax [= =] is reserved for future extensions before {#} mark in regex m/[[=foo=]{#}]/',
+
+ '/(?<= .*)/' => 'Variable length lookbehind not implemented before {#} mark in regex m/(?<= .*){#}/',
+
+ '/(?<= x{1000})/' => 'Lookbehind longer than 255 not implemented before {#} mark in regex m/(?<= x{1000}){#}/',
+
+ '/(?@)/' => 'Sequence (?@...) not implemented before {#} mark in regex m/(?@{#})/',
+
+ '/(?{ 1/' => 'Sequence (?{...}) not terminated or not {}-balanced before {#} mark in regex m/(?{{#} 1/',
+
+ '/(?(1x))/' => 'Switch condition not recognized before {#} mark in regex m/(?(1x{#}))/',
+
+ '/(?(1)x|y|z)/' => 'Switch (?(condition)... contains too many branches before {#} mark in regex m/(?(1)x|y|{#}z)/',
+
+ '/(?(x)y|x)/' => 'Unknown switch condition (?(x) before {#} mark in regex m/(?({#}x)y|x)/',
+
+ '/(?/' => 'Sequence (? incomplete before {#} mark in regex m/(?{#}/',
+
+ '/(?;x/' => 'Sequence (?;...) not recognized before {#} mark in regex m/(?;{#}x/',
+ '/(?<;x/' => 'Sequence (?<;...) not recognized before {#} mark in regex m/(?<;{#}x/',
+
+ '/((x)/' => 'Unmatched ( before {#} mark in regex m/({#}(x)/',
+
+ "/x{$inf_p1}/" => "Quantifier in {,} bigger than $inf_m1 before {#} mark in regex m/x{{#}$inf_p1}/",
+
+ '/x{3,1}/' => 'Can\'t do {n,m} with n > m before {#} mark in regex m/x{3,1}{#}/',
+
+ '/x**/' => 'Nested quantifiers before {#} mark in regex m/x**{#}/',
+
+ '/x[/' => 'Unmatched [ before {#} mark in regex m/x[{#}/',
+
+ '/*/', => 'Quantifier follows nothing before {#} mark in regex m/*{#}/',
+
+ '/\p{x/' => 'Missing right brace on \p{} before {#} mark in regex m/\p{{#}x/',
+
+ 'use utf8; /[\p{x]/' => 'Missing right brace on \p{} before {#} mark in regex m/[\p{{#}x]/',
+
+ '/(x)\2/' => 'Reference to nonexistent group before {#} mark in regex m/(x)\2{#}/',
+
+ 'my $m = "\\\"; $m =~ $m', => 'Trailing \ in regex m/\/',
+
+ '/\x{1/' => 'Missing right brace on \x{} before {#} mark in regex m/\x{{#}1/',
+
+ 'use utf8; /[\x{X]/' => 'Missing right brace on \x{} before {#} mark in regex m/[\x{{#}X]/',
+
+ '/[[:barf:]]/' => 'POSIX class [:barf:] unknown before {#} mark in regex m/[[:barf:]{#}]/',
+
+ '/[[=barf=]]/' => 'POSIX syntax [= =] is reserved for future extensions before {#} mark in regex m/[[=barf=]{#}]/',
+
+ '/[[.barf.]]/' => 'POSIX syntax [. .] is reserved for future extensions before {#} mark in regex m/[[.barf.]{#}]/',
+
+ '/[z-a]/' => 'Invalid [] range "z-a" before {#} mark in regex m/[z-a{#}]/',
+);
+
+##
+## Key-value pairs of code/error of code that should have non-fatal warnings.
+##
+@warning = (
+ "m/(?p{ 'a' })/" => "(?p{}) is deprecated - use (??{}) before {#} mark in regex m/(?p{#}{ 'a' })/",
+
+ 'm/\b*/' => '\b* matches null string many times before {#} mark in regex m/\b*{#}/',
+
+ 'm/[:blank:]/' => 'POSIX syntax [: :] belongs inside character classes before {#} mark in regex m/[:blank:]{#}/',
+
+ "m'[\\y]'" => 'Unrecognized escape \y in character class passed through before {#} mark in regex m/[\y{#}]/',
+
+ 'm/[a-\d]/' => 'False [] range "a-\d" before {#} mark in regex m/[a-\d{#}]/',
+ 'm/[\w-x]/' => 'False [] range "\w-" before {#} mark in regex m/[\w-{#}x]/',
+ "m'\\y'" => 'Unrecognized escape \y passed through before {#} mark in regex m/\y{#}/',
+);
+
+my $total = (@death + @warning)/2;
+
+# utf8 is a noop on EBCDIC platforms, it is not fatal
+my $Is_EBCDIC = (ord('A') == 193);
+if ($Is_EBCDIC) {
+ my @utf8_death = grep(/utf8/, @death);
+ $total = $total - scalar(@utf8_death);
+}
+
+print "1..$total\n";
+
+my $count = 0;
+
+while (@death)
+{
+ my $regex = shift @death;
+ my $result = shift @death;
+ # skip the utf8 test on EBCDIC since they do not die
+ next if ($Is_EBCDIC && $regex =~ /utf8/);
+ $count++;
+
+ $_ = "x";
+ eval $regex;
+ if (not $@) {
+ print "# oops, $regex didn't die\nnot ok $count\n";
+ next;
+ }
+ chomp $@;
+ $result =~ s/{\#}/$marker1/;
+ $result =~ s/{\#}/$marker2/;
+ if ($@ !~ /^\Q$result/) {
+ print "# For $regex, expected:\n# $result\n# Got:\n# $@\n#\nnot ";
+ }
+ print "ok $count\n";
+}
+
+
+our $warning;
+$SIG{__WARN__} = sub { $warning = shift };
+
+while (@warning)
+{
+ $count++;
+ my $regex = shift @warning;
+ my $result = shift @warning;
+
+ undef $warning;
+ $_ = "x";
+ eval $regex;
+
+ if ($@)
+ {
+ print "# oops, $regex died with:\n#\t$@#\nnot ok $count\n";
+ next;
+ }
+
+ if (not $warning)
+ {
+ print "# oops, $regex didn't generate a warning\nnot ok $count\n";
+ next;
+ }
+ $result =~ s/{\#}/$marker1/;
+ $result =~ s/{\#}/$marker2/;
+ if ($warning !~ /^\Q$result/)
+ {
+ print <<"EOM";
+# For $regex, expected:
+# $result
+# Got:
+# $warning
+#
+not ok $count
+EOM
+ next;
+ }
+ print "ok $count\n";
+}
+
+
+
diff --git a/gnu/usr.bin/perl/t/op/reverse.t b/gnu/usr.bin/perl/t/op/reverse.t
new file mode 100644
index 00000000000..bb7b9b77fea
--- /dev/null
+++ b/gnu/usr.bin/perl/t/op/reverse.t
@@ -0,0 +1,33 @@
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '../lib';
+}
+
+print "1..4\n";
+
+print "not " unless reverse("abc") eq "cba";
+print "ok 1\n";
+
+$_ = "foobar";
+print "not " unless reverse() eq "raboof";
+print "ok 2\n";
+
+{
+ my @a = ("foo", "bar");
+ my @b = reverse @a;
+
+ print "not " unless $b[0] eq $a[1] && $b[1] eq $a[0];
+ print "ok 3\n";
+}
+
+{
+ # Unicode.
+
+ my $a = "\x{263A}\x{263A}x\x{263A}y\x{263A}";
+ my $b = scalar reverse($a);
+ my $c = scalar reverse($b);
+ print "not " unless $a eq $c;
+ print "ok 4\n";
+}
diff --git a/gnu/usr.bin/perl/t/op/subst_amp.t b/gnu/usr.bin/perl/t/op/subst_amp.t
index e2e7c0e5428..71895720f7f 100644
--- a/gnu/usr.bin/perl/t/op/subst_amp.t
+++ b/gnu/usr.bin/perl/t/op/subst_amp.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib' if -d '../lib';
+ @INC = '../lib';
require Config; import Config;
}
diff --git a/gnu/usr.bin/perl/t/op/tiearray.t b/gnu/usr.bin/perl/t/op/tiearray.t
index 25fda3fb034..8e78b2f76b0 100644
--- a/gnu/usr.bin/perl/t/op/tiearray.t
+++ b/gnu/usr.bin/perl/t/op/tiearray.t
@@ -3,7 +3,7 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ @INC = '../lib';
}
my %seen;
diff --git a/gnu/usr.bin/perl/t/op/tiehandle.t b/gnu/usr.bin/perl/t/op/tiehandle.t
index 6ae3faaaecd..b04bdb78977 100644
--- a/gnu/usr.bin/perl/t/op/tiehandle.t
+++ b/gnu/usr.bin/perl/t/op/tiehandle.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ @INC = '../lib';
}
my @expect;
@@ -77,7 +77,7 @@ package main;
use Symbol;
-print "1..29\n";
+print "1..33\n";
my $fh = gensym;
@@ -149,3 +149,19 @@ ok($data eq "qwerty");
@expect = (CLOSE => $ob);
$r = close $fh;
ok($r == 5);
+
+# Does aliasing work with tied FHs?
+*ALIAS = *$fh;
+@expect = (PRINT => $ob,"some","text");
+$r = print ALIAS @expect[2,3];
+ok($r == 1);
+
+{
+ use warnings;
+ # Special case of aliasing STDERR, which used
+ # to dump core when warnings were enabled
+ *STDERR = *$fh;
+ @expect = (PRINT => $ob,"some","text");
+ $r = print STDERR @expect[2,3];
+ ok($r == 1);
+}
diff --git a/gnu/usr.bin/perl/t/op/tr.t b/gnu/usr.bin/perl/t/op/tr.t
index 4e6667cd7fb..c7ba0d8c55f 100644
--- a/gnu/usr.bin/perl/t/op/tr.t
+++ b/gnu/usr.bin/perl/t/op/tr.t
@@ -2,10 +2,10 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, "../lib";
+ @INC = '../lib';
}
-print "1..4\n";
+print "1..54\n";
$_ = "abcdefghijklmnopqrstuvwxyz";
@@ -37,3 +37,275 @@ print "ok 3\n";
print "ok 4\n";
}
#
+
+# make sure that tr cancels IOK and NOK
+($x = 12) =~ tr/1/3/;
+(my $y = 12) =~ tr/1/3/;
+($f = 1.5) =~ tr/1/3/;
+(my $g = 1.5) =~ tr/1/3/;
+print "not " unless $x + $y + $f + $g == 71;
+print "ok 5\n";
+
+# make sure tr is harmless if not updating - see [ID 20000511.005]
+$_ = 'fred';
+/([a-z]{2})/;
+$1 =~ tr/A-Z//;
+s/^(\s*)f/$1F/;
+print "not " if $_ ne 'Fred';
+print "ok 6\n";
+
+# check tr handles UTF8 correctly
+($x = 256.65.258) =~ tr/a/b/;
+print "not " if $x ne 256.65.258 or length $x != 3;
+print "ok 7\n";
+$x =~ tr/A/B/;
+if (ord("\t") == 9) { # ASCII
+ print "not " if $x ne 256.66.258 or length $x != 3;
+}
+else {
+ print "not " if $x ne 256.65.258 or length $x != 3;
+}
+print "ok 8\n";
+# EBCDIC variants of the above tests
+($x = 256.193.258) =~ tr/a/b/;
+print "not " if $x ne 256.193.258 or length $x != 3;
+print "ok 9\n";
+$x =~ tr/A/B/;
+if (ord("\t") == 9) { # ASCII
+ print "not " if $x ne 256.193.258 or length $x != 3;
+}
+else {
+ print "not " if $x ne 256.194.258 or length $x != 3;
+}
+print "ok 10\n";
+
+{
+if (ord("\t") == 9) { # ASCII
+ use utf8;
+}
+# 11 - changing UTF8 characters in a UTF8 string, same length.
+$l = chr(300); $r = chr(400);
+$x = 200.300.400;
+$x =~ tr/\x{12c}/\x{190}/;
+printf "not (%vd) ", $x if $x ne 200.400.400 or length $x != 3;
+print "ok 11\n";
+
+# 12 - changing UTF8 characters in UTF8 string, more bytes.
+$x = 200.300.400;
+$x =~ tr/\x{12c}/\x{be8}/;
+printf "not (%vd) ", $x if $x ne 200.3048.400 or length $x != 3;
+print "ok 12\n";
+
+# 13 - introducing UTF8 characters to non-UTF8 string.
+$x = 100.125.60;
+$x =~ tr/\x{64}/\x{190}/;
+printf "not (%vd) ", $x if $x ne 400.125.60 or length $x != 3;
+print "ok 13\n";
+
+# 14 - removing UTF8 characters from UTF8 string
+$x = 400.125.60;
+$x =~ tr/\x{190}/\x{64}/;
+printf "not (%vd) ", $x if $x ne 100.125.60 or length $x != 3;
+print "ok 14\n";
+
+# 15 - counting UTF8 chars in UTF8 string
+$x = 400.125.60.400;
+$y = $x =~ tr/\x{190}/\x{190}/;
+print "not " if $y != 2;
+print "ok 15\n";
+
+# 16 - counting non-UTF8 chars in UTF8 string
+$x = 60.400.125.60.400;
+$y = $x =~ tr/\x{3c}/\x{3c}/;
+print "not " if $y != 2;
+print "ok 16\n";
+
+# 17 - counting UTF8 chars in non-UTF8 string
+$x = 200.125.60;
+$y = $x =~ tr/\x{190}/\x{190}/;
+print "not " if $y != 0;
+print "ok 17\n";
+}
+
+# 18: test brokenness with tr/a-z-9//;
+$_ = "abcdefghijklmnopqrstuvwxyz";
+eval "tr/a-z-9/ /";
+print (($@ =~ /^Ambiguous range in transliteration operator/ || $^V lt v5.7.0)
+ ? '' : 'not ', "ok 18\n");
+
+# 19-21: Make sure leading and trailing hyphens still work
+$_ = "car-rot9";
+tr/-a-m/./;
+print (($_ eq '..r.rot9') ? '' : 'not ', "ok 19\n");
+
+$_ = "car-rot9";
+tr/a-m-/./;
+print (($_ eq '..r.rot9') ? '' : 'not ', "ok 20\n");
+
+$_ = "car-rot9";
+tr/-a-m-/./;
+print (($_ eq '..r.rot9') ? '' : 'not ', "ok 21\n");
+
+$_ = "abcdefghijklmnop";
+tr/ae-hn/./;
+print (($_ eq '.bcd....ijklm.op') ? '' : 'not ', "ok 22\n");
+
+$_ = "abcdefghijklmnop";
+tr/a-cf-kn-p/./;
+print (($_ eq '...de......lm...') ? '' : 'not ', "ok 23\n");
+
+$_ = "abcdefghijklmnop";
+tr/a-ceg-ikm-o/./;
+print (($_ eq '...d.f...j.l...p') ? '' : 'not ', "ok 24\n");
+
+# 25: Test reversed range check
+# 20000705 MJD
+eval "tr/m-d/ /";
+print (($@ =~ /^Invalid \[\] range "m-d" in transliteration operator/ || $^V lt v5.7.0)
+ ? '' : 'not ', "ok 25\n");
+
+# 26: test cannot update if read-only
+eval '$1 =~ tr/x/y/';
+print (($@ =~ /^Modification of a read-only value attempted/) ? '' : 'not ',
+ "ok 26\n");
+
+# 27: test can count read-only
+'abcdef' =~ /(bcd)/;
+print (( eval '$1 =~ tr/abcd//' == 3) ? '' : 'not ', "ok 27\n");
+
+# 28: test lhs OK if not updating
+print ((eval '"123" =~ tr/12//' == 2) ? '' : 'not ', "ok 28\n");
+
+# 29: test lhs bad if updating
+eval '"123" =~ tr/1/1/';
+print (($@ =~ m|^Can't modify constant item in transliteration \(tr///\)|)
+ ? '' : 'not ', "ok 29\n");
+
+# v300 (0x12c) is UTF-8-encoded as 196 172 (0xc4 0xac)
+# v400 (0x190) is UTF-8-encoded as 198 144 (0xc6 0x90)
+
+# Transliterate a byte to a byte, all four ways.
+
+($a = v300.196.172.300.196.172) =~ tr/\xc4/\xc5/;
+print "not " unless $a eq v300.197.172.300.197.172;
+print "ok 30\n";
+
+($a = v300.196.172.300.196.172) =~ tr/\xc4/\x{c5}/;
+print "not " unless $a eq v300.197.172.300.197.172;
+print "ok 31\n";
+
+($a = v300.196.172.300.196.172) =~ tr/\x{c4}/\xc5/;
+print "not " unless $a eq v300.197.172.300.197.172;
+print "ok 32\n";
+
+($a = v300.196.172.300.196.172) =~ tr/\x{c4}/\x{c5}/;
+print "not " unless $a eq v300.197.172.300.197.172;
+print "ok 33\n";
+
+# Transliterate a byte to a wide character.
+
+($a = v300.196.172.300.196.172) =~ tr/\xc4/\x{12d}/;
+print "not " unless $a eq v300.301.172.300.301.172;
+print "ok 34\n";
+
+# Transliterate a wide character to a byte.
+
+($a = v300.196.172.300.196.172) =~ tr/\x{12c}/\xc3/;
+print "not " unless $a eq v195.196.172.195.196.172;
+print "ok 35\n";
+
+# Transliterate a wide character to a wide character.
+
+($a = v300.196.172.300.196.172) =~ tr/\x{12c}/\x{12d}/;
+print "not " unless $a eq v301.196.172.301.196.172;
+print "ok 36\n";
+
+# Transliterate both ways.
+
+($a = v300.196.172.300.196.172) =~ tr/\xc4\x{12c}/\x{12d}\xc3/;
+print "not " unless $a eq v195.301.172.195.301.172;
+print "ok 37\n";
+
+# Transliterate all (four) ways.
+
+($a = v300.196.172.300.196.172.400.198.144) =~
+ tr/\xac\xc4\x{12c}\x{190}/\xad\x{12d}\xc5\x{191}/;
+print "not " unless $a eq v197.301.173.197.301.173.401.198.144;
+print "ok 38\n";
+
+# Transliterate and count.
+
+print "not "
+ unless (($a = v300.196.172.300.196.172) =~ tr/\xc4/\xc5/) == 2;
+print "ok 39\n";
+
+print "not "
+ unless (($a = v300.196.172.300.196.172) =~ tr/\x{12c}/\x{12d}/) == 2;
+print "ok 40\n";
+
+# Transliterate with complement.
+
+($a = v300.196.172.300.196.172) =~ tr/\xc4/\x{12d}/c;
+print "not " unless $a eq v301.196.301.301.196.301;
+print "ok 41\n";
+
+($a = v300.196.172.300.196.172) =~ tr/\x{12c}/\xc5/c;
+print "not " unless $a eq v300.197.197.300.197.197;
+print "ok 42\n";
+
+# Transliterate with deletion.
+
+($a = v300.196.172.300.196.172) =~ tr/\xc4//d;
+print "not " unless $a eq v300.172.300.172;
+print "ok 43\n";
+
+($a = v300.196.172.300.196.172) =~ tr/\x{12c}//d;
+print "not " unless $a eq v196.172.196.172;
+print "ok 44\n";
+
+# Transliterate with squeeze.
+
+($a = v196.196.172.300.300.196.172) =~ tr/\xc4/\xc5/s;
+print "not " unless $a eq v197.172.300.300.197.172;
+print "ok 45\n";
+
+($a = v196.172.300.300.196.172.172) =~ tr/\x{12c}/\x{12d}/s;
+print "not " unless $a eq v196.172.301.196.172.172;
+print "ok 46\n";
+
+# Tricky cases by Simon Cozens.
+
+($a = v196.172.200) =~ tr/\x{12c}/a/;
+print "not " unless sprintf("%vd", $a) eq '196.172.200';
+print "ok 47\n";
+
+($a = v196.172.200) =~ tr/\x{12c}/\x{12c}/;
+print "not " unless sprintf("%vd", $a) eq '196.172.200';
+print "ok 48\n";
+
+($a = v196.172.200) =~ tr/\x{12c}//d;
+print "not " unless sprintf("%vd", $a) eq '196.172.200';
+print "ok 49\n";
+
+# UTF8 range
+
+($a = v300.196.172.302.197.172) =~ tr/\x{12c}-\x{130}/\xc0-\xc4/;
+print "not " unless $a eq v192.196.172.194.197.172;
+print "ok 50\n";
+
+($a = v300.196.172.302.197.172) =~ tr/\xc4-\xc8/\x{12c}-\x{130}/;
+print "not " unless $a eq v300.300.172.302.301.172;
+print "ok 51\n";
+
+# misc
+($a = "R0_001") =~ tr/R_//d;
+print "not " if hex($a) != 1;
+print "ok 52\n";
+
+@a = (1,2); map { y/1/./ for $_ } @a;
+print "not " if "@a" ne ". 2";
+print "ok 53\n";
+
+@a = (1,2); map { y/1/./ for $_.'' } @a;
+print "not " if "@a" ne "1 2";
+print "ok 54\n";
diff --git a/gnu/usr.bin/perl/t/op/utf8decode.t b/gnu/usr.bin/perl/t/op/utf8decode.t
new file mode 100644
index 00000000000..4d05a6b8d37
--- /dev/null
+++ b/gnu/usr.bin/perl/t/op/utf8decode.t
@@ -0,0 +1,183 @@
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '../lib';
+}
+
+no utf8;
+
+print "1..78\n";
+
+my $test = 1;
+
+# This table is based on Markus Kuhn's UTF-8 Decode Stress Tester,
+# http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt,
+# version dated 2000-09-02.
+
+# We use the \x notation instead of raw binary bytes for \x00-\x1f\x7f-\xff
+# because e.g. many patch programs have issues with binary data.
+
+my @MK = split(/\n/, <<__EOMK__);
+1 Correct UTF-8
+1.1.1 y "\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5" - 11 ce:ba:e1:bd:b9:cf:83:ce:bc:ce:b5 5
+2 Boundary conditions
+2.1 First possible sequence of certain length
+2.1.1 y "\x00" 0 1 00 1
+2.1.2 y "\xc2\x80" 80 2 c2:80 1
+2.1.3 y "\xe0\xa0\x80" 800 3 e0:a0:80 1
+2.1.4 y "\xf0\x90\x80\x80" 10000 4 f0:90:80:80 1
+2.1.5 y "\xf8\x88\x80\x80\x80" 200000 5 f8:88:80:80:80 1
+2.1.6 y "\xfc\x84\x80\x80\x80\x80" 4000000 6 fc:84:80:80:80:80 1
+2.2 Last possible sequence of certain length
+2.2.1 y "\x7f" 7f 1 7f 1
+2.2.2 y "\xdf\xbf" 7ff 2 df:bf 1
+# The ffff is illegal unless UTF8_ALLOW_FFFF
+2.2.3 n "\xef\xbf\xbf" ffff 3 ef:bf:bf 1 character 0xffff
+2.2.4 y "\xf7\xbf\xbf\xbf" 1fffff 4 f7:bf:bf:bf 1
+2.2.5 y "\xfb\xbf\xbf\xbf\xbf" 3ffffff 5 fb:bf:bf:bf:bf 1
+2.2.6 y "\xfd\xbf\xbf\xbf\xbf\xbf" 7fffffff 6 fd:bf:bf:bf:bf:bf 1
+2.3 Other boundary conditions
+2.3.1 y "\xed\x9f\xbf" d7ff 3 ed:9f:bf 1
+2.3.2 y "\xee\x80\x80" e000 3 ee:80:80 1
+2.3.3 y "\xef\xbf\xbd" fffd 3 ef:bf:bd 1
+2.3.4 y "\xf4\x8f\xbf\xbf" 10ffff 4 f4:8f:bf:bf 1
+2.3.5 y "\xf4\x90\x80\x80" 110000 4 f4:90:80:80 1
+3 Malformed sequences
+3.1 Unexpected continuation bytes
+3.1.1 n "\x80" - 1 80 - unexpected continuation byte 0x80
+3.1.2 n "\xbf" - 1 bf - unexpected continuation byte 0xbf
+3.1.3 n "\x80\xbf" - 2 80:bf - unexpected continuation byte 0x80
+3.1.4 n "\x80\xbf\x80" - 3 80:bf:80 - unexpected continuation byte 0x80
+3.1.5 n "\x80\xbf\x80\xbf" - 4 80:bf:80:bf - unexpected continuation byte 0x80
+3.1.6 n "\x80\xbf\x80\xbf\x80" - 5 80:bf:80:bf:80 - unexpected continuation byte 0x80
+3.1.7 n "\x80\xbf\x80\xbf\x80\xbf" - 6 80:bf:80:bf:80:bf - unexpected continuation byte 0x80
+3.1.8 n "\x80\xbf\x80\xbf\x80\xbf\x80" - 7 80:bf:80:bf:80:bf:80 - unexpected continuation byte 0x80
+3.1.9 n "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf" - 64 80:81:82:83:84:85:86:87:88:89:8a:8b:8c:8d:8e:8f:90:91:92:93:94:95:96:97:98:99:9a:9b:9c:9d:9e:9f:a0:a1:a2:a3:a4:a5:a6:a7:a8:a9:aa:ab:ac:ad:ae:af:b0:b1:b2:b3:b4:b5:b6:b7:b8:b9:ba:bb:bc:bd:be:bf - unexpected continuation byte 0x80
+3.2 Lonely start characters
+3.2.1 n "\xc0 \xc1 \xc2 \xc3 \xc4 \xc5 \xc6 \xc7 \xc8 \xc9 \xca \xcb \xcc \xcd \xce \xcf \xd0 \xd1 \xd2 \xd3 \xd4 \xd5 \xd6 \xd7 \xd8 \xd9 \xda \xdb \xdc \xdd \xde \xdf " - 64 c0:20:c1:20:c2:20:c3:20:c4:20:c5:20:c6:20:c7:20:c8:20:c9:20:ca:20:cb:20:cc:20:cd:20:ce:20:cf:20:d0:20:d1:20:d2:20:d3:20:d4:20:d5:20:d6:20:d7:20:d8:20:d9:20:da:20:db:20:dc:20:dd:20:de:20:df:20 - unexpected non-continuation byte 0x20 after start byte 0xc0
+3.2.2 n "\xe0 \xe1 \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea \xeb \xec \xed \xee \xef " - 32 e0:20:e1:20:e2:20:e3:20:e4:20:e5:20:e6:20:e7:20:e8:20:e9:20:ea:20:eb:20:ec:20:ed:20:ee:20:ef:20 - unexpected non-continuation byte 0x20 after start byte 0xe0
+3.2.3 n "\xf0 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 " - 16 f0:20:f1:20:f2:20:f3:20:f4:20:f5:20:f6:20:f7:20 - unexpected non-continuation byte 0x20 after start byte 0xf0
+3.2.4 n "\xf8 \xf9 \xfa \xfb " - 8 f8:20:f9:20:fa:20:fb:20 - unexpected non-continuation byte 0x20 after start byte 0xf8
+3.2.5 n "\xfc \xfd " - 4 fc:20:fd:20 - unexpected non-continuation byte 0x20 after start byte 0xfc
+3.3 Sequences with last continuation byte missing
+3.3.1 n "\xc0" - 1 c0 - 1 byte, need 2
+3.3.2 n "\xe0\x80" - 2 e0:80 - 2 bytes, need 3
+3.3.3 n "\xf0\x80\x80" - 3 f0:80:80 - 3 bytes, need 4
+3.3.4 n "\xf8\x80\x80\x80" - 4 f8:80:80:80 - 4 bytes, need 5
+3.3.5 n "\xfc\x80\x80\x80\x80" - 5 fc:80:80:80:80 - 5 bytes, need 6
+3.3.6 n "\xdf" - 1 df - 1 byte, need 2
+3.3.7 n "\xef\xbf" - 2 ef:bf - 2 bytes, need 3
+3.3.8 n "\xf7\xbf\xbf" - 3 f7:bf:bf - 3 bytes, need 4
+3.3.9 n "\xfb\xbf\xbf\xbf" - 4 fb:bf:bf:bf - 4 bytes, need 5
+3.3.10 n "\xfd\xbf\xbf\xbf\xbf" - 5 fd:bf:bf:bf:bf - 5 bytes, need 6
+3.4 Concatenation of incomplete sequences
+3.4.1 n "\xc0\xe0\x80\xf0\x80\x80\xf8\x80\x80\x80\xfc\x80\x80\x80\x80\xdf\xef\xbf\xf7\xbf\xbf\xfb\xbf\xbf\xbf\xfd\xbf\xbf\xbf\xbf" - 30 c0:e0:80:f0:80:80:f8:80:80:80:fc:80:80:80:80:df:ef:bf:f7:bf:bf:fb:bf:bf:bf:fd:bf:bf:bf:bf - unexpected non-continuation byte 0xe0 after start byte 0xc0
+3.5 Impossible bytes
+3.5.1 n "\xfe" - 1 fe - byte 0xfe
+3.5.2 n "\xff" - 1 ff - byte 0xff
+3.5.3 n "\xfe\xfe\xff\xff" - 4 fe:fe:ff:ff - byte 0xfe
+4 Overlong sequences
+4.1 Examples of an overlong ASCII character
+4.1.1 n "\xc0\xaf" - 2 c0:af - 2 bytes, need 1
+4.1.2 n "\xe0\x80\xaf" - 3 e0:80:af - 3 bytes, need 1
+4.1.3 n "\xf0\x80\x80\xaf" - 4 f0:80:80:af - 4 bytes, need 1
+4.1.4 n "\xf8\x80\x80\x80\xaf" - 5 f8:80:80:80:af - 5 bytes, need 1
+4.1.5 n "\xfc\x80\x80\x80\x80\xaf" - 6 fc:80:80:80:80:af - 6 bytes, need 1
+4.2 Maximum overlong sequences
+4.2.1 n "\xc1\xbf" - 2 c1:bf - 2 bytes, need 1
+4.2.2 n "\xe0\x9f\xbf" - 3 e0:9f:bf - 3 bytes, need 2
+4.2.3 n "\xf0\x8f\xbf\xbf" - 4 f0:8f:bf:bf - 4 bytes, need 3
+4.2.4 n "\xf8\x87\xbf\xbf\xbf" - 5 f8:87:bf:bf:bf - 5 bytes, need 4
+4.2.5 n "\xfc\x83\xbf\xbf\xbf\xbf" - 6 fc:83:bf:bf:bf:bf - 6 bytes, need 5
+4.3 Overlong representation of the NUL character
+4.3.1 n "\xc0\x80" - 2 c0:80 - 2 bytes, need 1
+4.3.2 n "\xe0\x80\x80" - 3 e0:80:80 - 3 bytes, need 1
+4.3.3 n "\xf0\x80\x80\x80" - 4 f0:80:80:80 - 4 bytes, need 1
+4.3.4 n "\xf8\x80\x80\x80\x80" - 5 f8:80:80:80:80 - 5 bytes, need 1
+4.3.5 n "\xfc\x80\x80\x80\x80\x80" - 6 fc:80:80:80:80:80 - 6 bytes, need 1
+5 Illegal code positions
+5.1 Single UTF-16 surrogates
+5.1.1 n "\xed\xa0\x80" - 3 ed:a0:80 - UTF-16 surrogate 0xd800
+5.1.2 n "\xed\xad\xbf" - 3 ed:ad:bf - UTF-16 surrogate 0xdb7f
+5.1.3 n "\xed\xae\x80" - 3 ed:ae:80 - UTF-16 surrogate 0xdb80
+5.1.4 n "\xed\xaf\xbf" - 3 ed:af:bf - UTF-16 surrogate 0xdbff
+5.1.5 n "\xed\xb0\x80" - 3 ed:b0:80 - UTF-16 surrogate 0xdc00
+5.1.6 n "\xed\xbe\x80" - 3 ed:be:80 - UTF-16 surrogate 0xdf80
+5.1.7 n "\xed\xbf\xbf" - 3 ed:bf:bf - UTF-16 surrogate 0xdfff
+5.2 Paired UTF-16 surrogates
+5.2.1 n "\xed\xa0\x80\xed\xb0\x80" - 6 ed:a0:80:ed:b0:80 - UTF-16 surrogate 0xd800
+5.2.2 n "\xed\xa0\x80\xed\xbf\xbf" - 6 ed:a0:80:ed:bf:bf - UTF-16 surrogate 0xd800
+5.2.3 n "\xed\xad\xbf\xed\xb0\x80" - 6 ed:ad:bf:ed:b0:80 - UTF-16 surrogate 0xdb7f
+5.2.4 n "\xed\xad\xbf\xed\xbf\xbf" - 6 ed:ad:bf:ed:bf:bf - UTF-16 surrogate 0xdb7f
+5.2.5 n "\xed\xae\x80\xed\xb0\x80" - 6 ed:ae:80:ed:b0:80 - UTF-16 surrogate 0xdb80
+5.2.6 n "\xed\xae\x80\xed\xbf\xbf" - 6 ed:ae:80:ed:bf:bf - UTF-16 surrogate 0xdb80
+5.2.7 n "\xed\xaf\xbf\xed\xb0\x80" - 6 ed:af:bf:ed:b0:80 - UTF-16 surrogate 0xdbff
+5.2.8 n "\xed\xaf\xbf\xed\xbf\xbf" - 6 ed:af:bf:ed:bf:bf - UTF-16 surrogate 0xdbff
+5.3 Other illegal code positions
+5.3.1 n "\xef\xbf\xbe" - 3 ef:bf:be - byte order mark 0xfffe
+# The ffff is illegal unless UTF8_ALLOW_FFFF
+5.3.2 n "\xef\xbf\xbf" - 3 ef:bf:bf - character 0xffff
+__EOMK__
+
+# 104..181
+{
+ my $WARNCNT;
+ my $id;
+
+ local $SIG{__WARN__} =
+ sub {
+ print "# $id: @_";
+ $WARNCNT++;
+ $WARNMSG = "@_";
+ };
+
+ sub moan {
+ print "$id: @_";
+ }
+
+ sub test_unpack_U {
+ $WARNCNT = 0;
+ $WARNMSG = "";
+ unpack('U*', $_[0]);
+ }
+
+ for (@MK) {
+ if (/^(?:\d+(?:\.\d+)?)\s/ || /^#/) {
+ # print "# $_\n";
+ } elsif (/^(\d+\.\d+\.\d+[bu]?)\s+([yn])\s+"(.+)"\s+([0-9a-f]{1,8}|-)\s+(\d+)\s+([0-9a-f]{2}(?::[0-9a-f]{2})*)(?:\s+((?:\d+|-)(?:\s+(.+))?))?$/) {
+ $id = $1;
+ my ($okay, $bytes, $Unicode, $byteslen, $hex, $charslen, $error) =
+ ($2, $3, $4, $5, $6, $7, $8);
+ my @hex = split(/:/, $hex);
+ unless (@hex == $byteslen) {
+ my $nhex = @hex;
+ moan "amount of hex ($nhex) not equal to byteslen ($byteslen)\n";
+ }
+ {
+ use bytes;
+ my $bytesbyteslen = length($bytes);
+ unless ($bytesbyteslen == $byteslen) {
+ moan "bytes length() ($bytesbyteslen) not equal to $byteslen\n";
+ }
+ }
+ if ($okay eq 'y') {
+ test_unpack_U($bytes);
+ if ($WARNCNT) {
+ moan "unpack('U*') false negative\n";
+ print "not ";
+ }
+ } elsif ($okay eq 'n') {
+ test_unpack_U($bytes);
+ if ($WARNCNT == 0 || ($error ne '' && $WARNMSG !~ /$error/)) {
+ moan "unpack('U*') false positive\n";
+ print "not ";
+ }
+ }
+ print "ok $test\n";
+ $test++;
+ } else {
+ moan "unknown format\n";
+ }
+ }
+}
diff --git a/gnu/usr.bin/perl/t/op/ver.t b/gnu/usr.bin/perl/t/op/ver.t
index b08849f53a4..edfebd20ffc 100644
--- a/gnu/usr.bin/perl/t/op/ver.t
+++ b/gnu/usr.bin/perl/t/op/ver.t
@@ -2,10 +2,10 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, "../lib";
+ @INC = '../lib';
}
-print "1..22\n";
+print "1..28\n";
my $test = 1;
@@ -14,13 +14,24 @@ 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;
+if (ord("\t") == 9) { # ASCII
+ print v111;
+ print v107.32;
+ print "$test\n"; ++$test;
+
+ # hash keys too
+ $h{v111.107} = "ok";
+ print "$h{ok} $test\n"; ++$test;
+}
+else { # EBCDIC
+ print v150;
+ print v146.64;
+ print "$test\n"; ++$test;
+
+ # hash keys too
+ $h{v150.146} = "ok";
+ print "$h{ok} $test\n"; ++$test;
+}
# poetry optimization should also
sub v77 { "ok" }
@@ -28,7 +39,12 @@ $x = v77;
print "$x $test\n"; ++$test;
# but not when dots are involved
-$x = v77.78.79;
+if (ord("\t") == 9) { # ASCII
+ $x = v77.78.79;
+}
+else {
+ $x = v212.213.214;
+}
print "not " unless $x eq "MNO";
print "ok $test\n"; ++$test;
@@ -42,10 +58,20 @@ require 5.5.640;
print "ok $test\n"; ++$test;
# hash keys too
-$h{111.107.32} = "ok";
+if (ord("\t") == 9) { # ASCII
+ $h{111.107.32} = "ok";
+}
+else {
+ $h{150.146.64} = "ok";
+}
print "$h{ok } $test\n"; ++$test;
-$x = 77.78.79;
+if (ord("\t") == 9) { # ASCII
+ $x = 77.78.79;
+}
+else {
+ $x = 212.213.214;
+}
print "not " unless $x eq "MNO";
print "ok $test\n"; ++$test;
@@ -53,44 +79,103 @@ 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';
+if (ord("\t") == 9) { # ASCII
+ print "not " unless sprintf("%vd", "Perl") eq '80.101.114.108';
+}
+else {
+ print "not " unless sprintf("%vd", "Perl") eq '215.133.153.147';
+}
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';
+if (ord("\t") == 9) { # ASCII
+ print "not " unless sprintf("%vx", "Perl") eq '50.65.72.6c';
+}
+else {
+ print "not " unless sprintf("%vx", "Perl") eq 'd7.85.99.93';
+}
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';
+if (ord("\t") == 9) { # ASCII
+ print "not " unless sprintf("%*v#o", ":", "Perl") eq '0120:0145:0162:0154';
+}
+else {
+ print "not " unless sprintf("%*v#o", ":", "Perl") eq '0327:0205:0231:0223';
+}
print "ok $test\n"; ++$test;
print "not " unless sprintf("%*vb", "##", v1.22.333.4444)
eq '1##10110##101001101##1000101011100';
print "ok $test\n"; ++$test;
+print "not " unless sprintf("%vd", join("", map { chr }
+ unpack "U*", v2001.2002.2003))
+ eq '2001.2002.2003';
+print "ok $test\n"; ++$test;
+
{
use bytes;
- print "not " unless sprintf("%vd", "Perl") eq '80.101.114.108';
+ if (ord("\t") == 9) { # ASCII
+ print "not " unless sprintf("%vd", "Perl") eq '80.101.114.108';
+ }
+ else {
+ print "not " unless sprintf("%vd", "Perl") eq '215.133.153.147';
+ }
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';
+ if (ord("\t") == 9) { # ASCII
+ print "not " unless sprintf("%vx", "Perl") eq '50.65.72.6c';
+ }
+ else {
+ print "not " unless sprintf("%vx", "Perl") eq 'd7.85.99.93';
+ }
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';
+ if (ord("\t") == 9) { # ASCII
+ print "not " unless sprintf("%*v#o", ":", "Perl") eq '0120:0145:0162:0154';
+ }
+ else {
+ print "not " unless sprintf("%*v#o", ":", "Perl") eq '0327:0205:0231:0223';
+ }
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;
}
+
+{
+ # bug id 20000323.056
+
+ print "not " unless "\x{41}" eq +v65;
+ print "ok $test\n";
+ $test++;
+
+ print "not " unless "\x41" eq +v65;
+ print "ok $test\n";
+ $test++;
+
+ print "not " unless "\x{c8}" eq +v200;
+ print "ok $test\n";
+ $test++;
+
+ print "not " unless "\xc8" eq +v200;
+ print "ok $test\n";
+ $test++;
+
+ print "not " unless "\x{221b}" eq v8731;
+ print "ok $test\n";
+ $test++;
+}
diff --git a/gnu/usr.bin/perl/t/op/wantarray.t b/gnu/usr.bin/perl/t/op/wantarray.t
index 0a47b6d3ba0..4b6f37cf0fa 100644
--- a/gnu/usr.bin/perl/t/op/wantarray.t
+++ b/gnu/usr.bin/perl/t/op/wantarray.t
@@ -1,6 +1,6 @@
#!./perl
-print "1..3\n";
+print "1..7\n";
sub context {
my ( $cona, $testnum ) = @_;
my $conb = (defined wantarray) ? ( wantarray ? 'A' : 'S' ) : 'V';
@@ -13,4 +13,8 @@ sub context {
context('V',1);
$a = context('S',2);
@a = context('A',3);
+scalar context('S',4);
+$a = scalar context('S',5);
+($a) = context('A',6);
+($a) = scalar context('S',7);
1;
diff --git a/gnu/usr.bin/perl/t/pod/emptycmd.t b/gnu/usr.bin/perl/t/pod/emptycmd.t
index d348a9d278a..815eba2b21f 100644
--- a/gnu/usr.bin/perl/t/pod/emptycmd.t
+++ b/gnu/usr.bin/perl/t/pod/emptycmd.t
@@ -1,7 +1,7 @@
-#!./perl
BEGIN {
chdir 't' if -d 't';
- unshift @INC, './pod', '../lib';
+ unshift @INC, '../lib';
+ unshift @INC, './pod';
require "testp2pt.pl";
import TestPodIncPlainText;
}
diff --git a/gnu/usr.bin/perl/t/pod/find.t b/gnu/usr.bin/perl/t/pod/find.t
new file mode 100644
index 00000000000..db39508363c
--- /dev/null
+++ b/gnu/usr.bin/perl/t/pod/find.t
@@ -0,0 +1,119 @@
+# Testing of Pod::Find
+# Author: Marek Rouchal <marek@saftsack.fs.uni-bayreuth.de>
+
+BEGIN {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+}
+
+$| = 1;
+
+use Test;
+
+BEGIN { plan tests => 4 }
+
+use Pod::Find qw(pod_find pod_where);
+use File::Spec;
+
+# load successful
+ok(1);
+
+require Cwd;
+my $THISDIR = Cwd::cwd();
+my $VERBOSE = 0;
+my $lib_dir = File::Spec->catdir($THISDIR,'..','lib','Pod');
+if ($^O eq 'VMS') {
+ $lib_dir = VMS::Filespec::unixify(File::Spec->catdir($THISDIR,'-','lib','pod'));
+ $Qlib_dir = $lib_dir;
+ $Qlib_dir =~ s#\/#::#g;
+}
+print "### searching $lib_dir\n";
+my %pods = pod_find("$lib_dir");
+my $result = join(",", sort values %pods);
+print "### found $result\n";
+my $compare = join(',', qw(
+ Checker
+ Find
+ Html
+ InputObjects
+ LaTeX
+ Man
+ ParseUtils
+ Parser
+ Plainer
+ Select
+ Text
+ Text::Color
+ Text::Overstrike
+ Text::Termcap
+ Usage
+));
+if ($^O eq 'VMS') {
+ $compare = lc($compare);
+ $result = join(',', sort grep(/pod::/, values %pods));
+ my $undollared = $Qlib_dir;
+ $undollared =~ s/\$/\\\$/g;
+ $undollared =~ s/\-/\\\-/g;
+ $result =~ s/$undollared/pod::/g;
+ my $count = 0;
+ my @result = split(/,/,$result);
+ my @compare = split(/,/,$compare);
+ foreach(@compare) {
+ $count += grep {/$_/} @result;
+ }
+ ok($count/($#result+1)-1,$#compare);
+}
+else {
+ ok($result,$compare);
+}
+
+# File::Find is located in this place since eons
+# and on all platforms, hopefully
+
+print "### searching for File::Find\n";
+$result = pod_where({ -inc => 1, -verbose => $VERBOSE }, 'File::Find')
+ || 'undef - pod not found!';
+print "### found $result\n";
+
+if ($^O eq 'VMS') { # privlib is perl_root:[lib] OK but not under mms
+ $compare = "lib.File]Find.pm";
+ $result =~ s/perl_root:\[\-?\.?//i;
+ $result =~ s/\[\-?\.?//i; # needed under `mms test`
+ ok($result,$compare);
+}
+else {
+ $compare = File::Spec->catfile("..","lib","File","Find.pm");
+ ok(_canon($result),_canon($compare));
+}
+
+# Search for a documentation pod rather than a module
+print "### searching for perlfunc.pod\n";
+$result = pod_where({ -dirs => ['../pod'], -verbose => $VERBOSE }, 'perlfunc')
+ || 'undef - perlfunc.pod not found!';
+print "### found $result\n";
+
+if ($^O eq 'VMS') { # privlib is perl_root:[lib] unfortunately
+ $compare = "/lib/pod/perlfunc.pod";
+ $result = VMS::Filespec::unixify($result);
+ $result =~ s/perl_root\///i;
+ $result =~ s/^\.\.//; # needed under `mms test`
+ ok($result,$compare);
+}
+else {
+ $compare = File::Spec->catfile("..","pod","perlfunc.pod");
+ ok(_canon($result),_canon($compare));
+}
+
+# make the path as generic as possible
+sub _canon
+{
+ my ($path) = @_;
+ $path = File::Spec->canonpath($path);
+ my @comp = File::Spec->splitpath($path);
+ my @dir = File::Spec->splitdir($comp[1]);
+ $comp[1] = File::Spec->catdir(@dir);
+ $path = File::Spec->catpath(@dir);
+ $path = uc($path) if File::Spec->case_tolerant;
+ $path;
+}
+
diff --git a/gnu/usr.bin/perl/t/pod/for.t b/gnu/usr.bin/perl/t/pod/for.t
index b8a6ec5c739..4af528a5ab8 100644
--- a/gnu/usr.bin/perl/t/pod/for.t
+++ b/gnu/usr.bin/perl/t/pod/for.t
@@ -1,7 +1,7 @@
-#!./perl
BEGIN {
chdir 't' if -d 't';
- unshift @INC, './pod', '../lib';
+ unshift @INC, '../lib';
+ unshift @INC, './pod';
require "testp2pt.pl";
import TestPodIncPlainText;
}
diff --git a/gnu/usr.bin/perl/t/pod/headings.t b/gnu/usr.bin/perl/t/pod/headings.t
index fc7b4b265b2..365aa7d02b7 100644
--- a/gnu/usr.bin/perl/t/pod/headings.t
+++ b/gnu/usr.bin/perl/t/pod/headings.t
@@ -1,7 +1,7 @@
-#!./perl
BEGIN {
chdir 't' if -d 't';
- unshift @INC, './pod', '../lib';
+ unshift @INC, '../lib';
+ unshift @INC, './pod';
require "testp2pt.pl";
import TestPodIncPlainText;
}
diff --git a/gnu/usr.bin/perl/t/pod/include.t b/gnu/usr.bin/perl/t/pod/include.t
index 6d0b7e34e55..b6f1e31a0e0 100644
--- a/gnu/usr.bin/perl/t/pod/include.t
+++ b/gnu/usr.bin/perl/t/pod/include.t
@@ -1,7 +1,7 @@
-#!./perl
BEGIN {
chdir 't' if -d 't';
- unshift @INC, './pod', '../lib';
+ unshift @INC, '../lib';
+ unshift @INC, './pod';
require "testp2pt.pl";
import TestPodIncPlainText;
}
diff --git a/gnu/usr.bin/perl/t/pod/included.t b/gnu/usr.bin/perl/t/pod/included.t
index 0e31a090fc7..a25b37b98b5 100644
--- a/gnu/usr.bin/perl/t/pod/included.t
+++ b/gnu/usr.bin/perl/t/pod/included.t
@@ -1,7 +1,7 @@
-#!./perl
BEGIN {
chdir 't' if -d 't';
- unshift @INC, './pod', '../lib';
+ unshift @INC, '../lib';
+ unshift @INC, './pod';
require "testp2pt.pl";
import TestPodIncPlainText;
}
diff --git a/gnu/usr.bin/perl/t/pod/lref.t b/gnu/usr.bin/perl/t/pod/lref.t
index e367d6dd66c..1dd8c68b15c 100644
--- a/gnu/usr.bin/perl/t/pod/lref.t
+++ b/gnu/usr.bin/perl/t/pod/lref.t
@@ -1,7 +1,7 @@
-#!./perl
BEGIN {
chdir 't' if -d 't';
- unshift @INC, './pod', '../lib';
+ unshift @INC, '../lib';
+ unshift @INC, './pod';
require "testp2pt.pl";
import TestPodIncPlainText;
}
diff --git a/gnu/usr.bin/perl/t/pod/multiline_items.t b/gnu/usr.bin/perl/t/pod/multiline_items.t
index 37e8d530698..334832dff7a 100644
--- a/gnu/usr.bin/perl/t/pod/multiline_items.t
+++ b/gnu/usr.bin/perl/t/pod/multiline_items.t
@@ -1,7 +1,7 @@
-#!./perl
BEGIN {
chdir 't' if -d 't';
- unshift @INC, './pod', '../lib';
+ unshift @INC, '../lib';
+ unshift @INC, './pod';
require "testp2pt.pl";
import TestPodIncPlainText;
}
diff --git a/gnu/usr.bin/perl/t/pod/nested_items.t b/gnu/usr.bin/perl/t/pod/nested_items.t
index 9c098018d13..0b86702ae81 100644
--- a/gnu/usr.bin/perl/t/pod/nested_items.t
+++ b/gnu/usr.bin/perl/t/pod/nested_items.t
@@ -1,7 +1,7 @@
-#!./perl
BEGIN {
chdir 't' if -d 't';
- unshift @INC, './pod', '../lib';
+ unshift @INC, '../lib';
+ unshift @INC, './pod';
require "testp2pt.pl";
import TestPodIncPlainText;
}
diff --git a/gnu/usr.bin/perl/t/pod/nested_seqs.t b/gnu/usr.bin/perl/t/pod/nested_seqs.t
index 6a5405bf47f..9f30533547c 100644
--- a/gnu/usr.bin/perl/t/pod/nested_seqs.t
+++ b/gnu/usr.bin/perl/t/pod/nested_seqs.t
@@ -1,7 +1,7 @@
-#!./perl
BEGIN {
chdir 't' if -d 't';
- unshift @INC, './pod', '../lib';
+ unshift @INC, '../lib';
+ unshift @INC, './pod';
require "testp2pt.pl";
import TestPodIncPlainText;
}
diff --git a/gnu/usr.bin/perl/t/pod/oneline_cmds.t b/gnu/usr.bin/perl/t/pod/oneline_cmds.t
index 3081ef4dc37..bba0e4adbbd 100644
--- a/gnu/usr.bin/perl/t/pod/oneline_cmds.t
+++ b/gnu/usr.bin/perl/t/pod/oneline_cmds.t
@@ -1,7 +1,7 @@
-#!./perl
BEGIN {
chdir 't' if -d 't';
- unshift @INC, './pod', '../lib';
+ unshift @INC, '../lib';
+ unshift @INC, './pod';
require "testp2pt.pl";
import TestPodIncPlainText;
}
diff --git a/gnu/usr.bin/perl/t/pod/pod2usage.t b/gnu/usr.bin/perl/t/pod/pod2usage.t
index bceeeefce87..70cbacdebc2 100644
--- a/gnu/usr.bin/perl/t/pod/pod2usage.t
+++ b/gnu/usr.bin/perl/t/pod/pod2usage.t
@@ -1,7 +1,7 @@
-#!./perl
BEGIN {
chdir 't' if -d 't';
- unshift @INC, './pod', '../lib';
+ unshift @INC, '../lib';
+ unshift @INC, './pod';
require "testp2pt.pl";
import TestPodIncPlainText;
}
diff --git a/gnu/usr.bin/perl/t/pod/poderrs.t b/gnu/usr.bin/perl/t/pod/poderrs.t
index ec632c25385..1b92ede3bb0 100644
--- a/gnu/usr.bin/perl/t/pod/poderrs.t
+++ b/gnu/usr.bin/perl/t/pod/poderrs.t
@@ -1,7 +1,7 @@
-#!./perl
BEGIN {
chdir 't' if -d 't';
- unshift @INC, './pod', '../lib';
+ unshift @INC, '../lib';
+ unshift @INC, './pod';
require "testpchk.pl";
import TestPodChecker;
}
@@ -59,7 +59,7 @@ The above blank line contains tabs and spaces only
=over 4
-=item oops
+=item aaps
=head2 end without begin
@@ -75,6 +75,20 @@ The above blank line contains tabs and spaces only
=end
+second one results in end w/o begin
+
+=head2 begin w/o formatter
+
+=begin
+
+=end
+
+=head2 for w/o formatter
+
+=for
+
+something...
+
=head2 Nested sequences of the same type
C<code I<italic C<code again!>>>
@@ -84,6 +98,9 @@ C<code I<italic C<code again!>>>
E<alea iacta est>
E<C<auml>>
E<abcI<bla>>
+E<0x100>
+E<07777>
+E<300>
=head2 Unresolved internal links
@@ -96,12 +113,15 @@ L</OoPs>
L<abc
def>
L<>
+L< aha>
+L<oho >
L<"Warnings"> this one is ok
+L</unescaped> ok too, this POD has an X of the same name
=head2 Warnings
L<passwd(5)>
-L< some text|page/"section" >
+L<some text with / in it|perlvar/$|> should give warnings as hell
=over 4
@@ -109,17 +129,70 @@ L< some text|page/"section" >
=back 200
+the 200 is evil
+
=begin html
What?
=end xml
+X<unescaped>see these unescaped < and > in the text?
+
+=head2 Misc
+
+Z<ddd> should be empty
+
+X<> should not be empty
+
+=over four
+
+This paragrapgh is misplaced - it ought to be an item.
+
+=item four should be numeric!
+
+=item
+
+=item blah
+
+=item previous is all empty!!!
+
+=back
+
+All empty over/back:
+
+=over 4
+
+=back
+
+item w/o name
+
+=cut
+
+=pod bla
+
+bla is evil
+
+=cut blub
+
+blub is evil
+
+=head2 reoccurence
+
=over 4
+=item Misc
+
+we already have a head Misc
+
=back
-see these unescaped < and > in the text?
+=head2 some heading
+
+=head2 another one
+
+previous section is empty!
=cut
+
diff --git a/gnu/usr.bin/perl/t/pod/poderrs.xr b/gnu/usr.bin/perl/t/pod/poderrs.xr
index b8e5e86fd57..a21efdbd761 100644
--- a/gnu/usr.bin/perl/t/pod/poderrs.xr
+++ b/gnu/usr.bin/perl/t/pod/poderrs.xr
@@ -1,33 +1,46 @@
-*** 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.
+*** ERROR: Unknown command 'unknown1' at line 25 in file t/pod/poderrs.t
+*** ERROR: Unknown interior-sequence 'Q' at line 29 in file t/pod/poderrs.t
+*** ERROR: Unknown interior-sequence 'A' at line 30 in file t/pod/poderrs.t
+*** ERROR: Unknown interior-sequence 'Y' at line 31 in file t/pod/poderrs.t
+*** ERROR: Unknown interior-sequence 'V' at line 31 in file t/pod/poderrs.t
+*** ERROR: unterminated B<...> at line 35 in file t/pod/poderrs.t
+*** ERROR: unterminated I<...> at line 34 in file t/pod/poderrs.t
+*** ERROR: unterminated C<...> at line 37 in file t/pod/poderrs.t
+*** WARNING: line containing nothing but whitespace in paragraph at line 45 in file t/pod/poderrs.t
+*** ERROR: =item without previous =over at line 52 in file t/pod/poderrs.t
+*** ERROR: =back without previous =over at line 56 in file t/pod/poderrs.t
+*** ERROR: =over on line 60 without closing =back (at head2) at line 64 in file t/pod/poderrs.t
+*** ERROR: =end without =begin at line 66 in file t/pod/poderrs.t
+*** ERROR: Nested =begin's (first at line 70:html) at line 72 in file t/pod/poderrs.t
+*** ERROR: =end without =begin at line 76 in file t/pod/poderrs.t
+*** ERROR: No argument for =begin at line 82 in file t/pod/poderrs.t
+*** ERROR: =for without formatter specification at line 88 in file t/pod/poderrs.t
+*** ERROR: nested commands C<...C<...>...> at line 94 in file t/pod/poderrs.t
+*** ERROR: garbled entity E<alea iacta est> at line 98 in file t/pod/poderrs.t
+*** ERROR: garbled entity E<C<auml>> at line 99 in file t/pod/poderrs.t
+*** ERROR: garbled entity E<abcI<bla>> at line 100 in file t/pod/poderrs.t
+*** ERROR: Entity number out of range E<0x100> at line 101 in file t/pod/poderrs.t
+*** ERROR: Entity number out of range E<07777> at line 102 in file t/pod/poderrs.t
+*** ERROR: Entity number out of range E<300> at line 103 in file t/pod/poderrs.t
+*** ERROR: malformed link L<> : empty link at line 115 in file t/pod/poderrs.t
+*** WARNING: ignoring leading whitespace in link at line 116 in file t/pod/poderrs.t
+*** WARNING: ignoring trailing whitespace in link at line 117 in file t/pod/poderrs.t
+*** WARNING: (section) in 'passwd(5)' deprecated at line 123 in file t/pod/poderrs.t
+*** WARNING: node '$|' contains non-escaped | or / at line 124 in file t/pod/poderrs.t
+*** WARNING: alternative text '$|' contains non-escaped | or / at line 124 in file t/pod/poderrs.t
+*** ERROR: Spurious character(s) after =back at line 130 in file t/pod/poderrs.t
+*** ERROR: Nonempty Z<> at line 144 in file t/pod/poderrs.t
+*** ERROR: Empty X<> at line 146 in file t/pod/poderrs.t
+*** WARNING: preceding non-item paragraph(s) at line 152 in file t/pod/poderrs.t
+*** WARNING: No argument for =item at line 154 in file t/pod/poderrs.t
+*** WARNING: previous =item has no contents at line 156 in file t/pod/poderrs.t
+*** WARNING: No items in =over (at line 164) / =back list at line 166 in file t/pod/poderrs.t
+*** ERROR: Spurious text after =pod at line 172 in file t/pod/poderrs.t
+*** ERROR: Spurious text after =cut at line 176 in file t/pod/poderrs.t
+*** WARNING: empty section in previous paragraph at line 192 in file t/pod/poderrs.t
+*** ERROR: unresolved internal link 'begin or begin' at line 107 in file t/pod/poderrs.t
+*** ERROR: unresolved internal link 'end with begin' at line 108 in file t/pod/poderrs.t
+*** ERROR: unresolved internal link 'OoPs' at line 109 in file t/pod/poderrs.t
+*** ERROR: unresolved internal link 'abc def' at line 113 in file t/pod/poderrs.t
+*** WARNING: multiple occurence of link target 'Misc' at line - in file t/pod/poderrs.t
+t/pod/poderrs.t has 33 pod syntax errors.
diff --git a/gnu/usr.bin/perl/t/pod/podselect.t b/gnu/usr.bin/perl/t/pod/podselect.t
index 30eb30c9b03..5d45cdb590c 100644
--- a/gnu/usr.bin/perl/t/pod/podselect.t
+++ b/gnu/usr.bin/perl/t/pod/podselect.t
@@ -1,7 +1,7 @@
-#!./perl
BEGIN {
chdir 't' if -d 't';
- unshift @INC, './pod', '../lib';
+ unshift @INC, '../lib';
+ unshift @INC, './pod';
require "testp2pt.pl";
import TestPodIncPlainText;
}
diff --git a/gnu/usr.bin/perl/t/pod/special_seqs.t b/gnu/usr.bin/perl/t/pod/special_seqs.t
index b8af57ee058..c6b2ce16984 100644
--- a/gnu/usr.bin/perl/t/pod/special_seqs.t
+++ b/gnu/usr.bin/perl/t/pod/special_seqs.t
@@ -1,7 +1,7 @@
-#!./perl
BEGIN {
chdir 't' if -d 't';
- unshift @INC, './pod', '../lib';
+ unshift @INC, '../lib';
+ unshift @INC, './pod';
require "testp2pt.pl";
import TestPodIncPlainText;
}
@@ -40,4 +40,7 @@ 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.
+Lets make sure these work for empty ones too, like C<< >> and C<< >> >>
+(just to be obnoxious)
+
=cut
diff --git a/gnu/usr.bin/perl/t/pod/special_seqs.xr b/gnu/usr.bin/perl/t/pod/special_seqs.xr
index a07f4cf417e..a8c715ae0ac 100644
--- a/gnu/usr.bin/perl/t/pod/special_seqs.xr
+++ b/gnu/usr.bin/perl/t/pod/special_seqs.xr
@@ -20,3 +20,6 @@
up doing what you might expect since the first > will still terminate
the first < seen.
+ Lets make sure these work for empty ones too, like and `>>' (just to be
+ obnoxious)
+
diff --git a/gnu/usr.bin/perl/t/pod/testp2pt.pl b/gnu/usr.bin/perl/t/pod/testp2pt.pl
index 2ff8aa427a3..8cfdbb93869 100644
--- a/gnu/usr.bin/perl/t/pod/testp2pt.pl
+++ b/gnu/usr.bin/perl/t/pod/testp2pt.pl
@@ -42,8 +42,11 @@ BEGIN {
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';
+if ($^O eq 'VMS') { # clean up directory spec
+ $INSTDIR = VMS::Filespec::unixpath($INSTDIR);
+ $INSTDIR =~ s#/$##;
+ $INSTDIR =~ s#/000000/#/#;
+}
$INSTDIR = (dirname $INSTDIR) if (basename($INSTDIR) eq 'pod');
$INSTDIR = (dirname $INSTDIR) if (basename($INSTDIR) eq 't');
my @PODINCDIRS = ( catfile($INSTDIR, 'lib', 'Pod'),
@@ -51,6 +54,7 @@ my @PODINCDIRS = ( catfile($INSTDIR, 'lib', 'Pod'),
catfile($INSTDIR, 'pod'),
catfile($INSTDIR, 't', 'pod')
);
+print "PODINCDIRS = ",join(', ',@PODINCDIRS),"\n";
## Find the path to the file to =include
sub findinclude {
@@ -106,7 +110,7 @@ sub begin_input {
sub podinc2plaintext( $ $ ) {
my ($infile, $outfile) = @_;
local $_;
- my $text_parser = $MYPKG->new;
+ my $text_parser = $MYPKG->new(quotes => "`'");
$text_parser->parse_from_file($infile, $outfile);
}
diff --git a/gnu/usr.bin/perl/t/pragma/diagnostics.t b/gnu/usr.bin/perl/t/pragma/diagnostics.t
index 15cd6b59276..14014f6b684 100644
--- a/gnu/usr.bin/perl/t/pragma/diagnostics.t
+++ b/gnu/usr.bin/perl/t/pragma/diagnostics.t
@@ -1,8 +1,8 @@
#!./perl
BEGIN {
- chdir '..' if -d '../pod';
- unshift @INC, './lib' if -d './lib';
+ chdir '..' if -d '../pod' && -d '../t';
+ @INC = 'lib';
}
diff --git a/gnu/usr.bin/perl/t/pragma/sub_lval.t b/gnu/usr.bin/perl/t/pragma/sub_lval.t
index e96c329d8ef..f19268b3848 100644
--- a/gnu/usr.bin/perl/t/pragma/sub_lval.t
+++ b/gnu/usr.bin/perl/t/pragma/sub_lval.t
@@ -1,12 +1,12 @@
-print "1..46\n";
+print "1..64\n";
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ @INC = '../lib';
}
-sub a : lvalue { my $a = 34; bless \$a } # Return a temporary
-sub b : lvalue { shift }
+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.
@@ -34,9 +34,9 @@ print "ok 3\n";
sub get_lex : lvalue { $in }
sub get_st : lvalue { $blah }
-sub id : lvalue { shift }
+sub id : lvalue { ${\shift} }
sub id1 : lvalue { $_[0] }
-sub inc : lvalue { ++$_[0] }
+sub inc : lvalue { ${\++$_[0]} }
$in = 5;
$blah = 3;
@@ -288,40 +288,41 @@ print "# '$_'.\nnot "
print "ok 34\n";
$x = '1234567';
-sub lv1t : lvalue { index $x, 2 }
$_ = undef;
eval <<'EOE' or $_ = $@;
+ sub lv1t : lvalue { index $x, 2 }
lv1t = (2,3);
1;
EOE
print "# '$_'.\nnot "
- unless /Can\'t return a temporary from lvalue subroutine/;
+ unless /Can\'t modify index in lvalue subroutine return/;
print "ok 35\n";
$_ = undef;
eval <<'EOE' or $_ = $@;
- (lv1t) = (2,3);
+ sub lv2t : lvalue { shift }
+ (lv2t) = (2,3);
1;
EOE
print "# '$_'.\nnot "
- unless /Can\'t return a temporary from lvalue subroutine/;
+ unless /Can\'t modify shift in lvalue subroutine return/;
print "ok 36\n";
$xxx = 'xxx';
sub xxx () { $xxx } # Not lvalue
-sub lv1tmp : lvalue { xxx } # is it a TEMP?
$_ = undef;
eval <<'EOE' or $_ = $@;
+ sub lv1tmp : lvalue { xxx } # is it a TEMP?
lv1tmp = (2,3);
1;
EOE
print "# '$_'.\nnot "
- unless /Can\'t return a temporary from lvalue subroutine/;
+ unless /Can\'t modify non-lvalue subroutine call in lvalue subroutine return/;
print "ok 37\n";
$_ = undef;
@@ -334,17 +335,17 @@ 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?
+sub yyy () { 'yyy' } # Const, not lvalue
$_ = undef;
eval <<'EOE' or $_ = $@;
+ sub lv1tmpr : lvalue { yyy } # is it read-only?
lv1tmpr = (2,3);
1;
EOE
print "# '$_'.\nnot "
- unless /Can\'t return a readonly value from lvalue subroutine/;
+ unless /Can\'t modify constant item in lvalue subroutine return/;
print "ok 39\n";
$_ = undef;
@@ -357,8 +358,6 @@ print "# '$_'.\nnot "
unless /Can\'t return a readonly value from lvalue subroutine/;
print "ok 40\n";
-=for disabled constructs
-
sub lva : lvalue {@a}
$_ = undef;
@@ -369,8 +368,7 @@ eval <<'EOE' or $_ = $@;
1;
EOE
-print "# '$_'.\nnot "
- unless /Can\'t return an uninitialized value from lvalue subroutine/;
+print "# '$_'.\nnot " unless "'@a' $_" eq "'2 3' ";
print "ok 41\n";
$_ = undef;
@@ -397,10 +395,6 @@ EOE
print "# '$_'.\nnot " unless "'@a' $_" eq "'2 3' ";
print "ok 43\n";
-=cut
-
-print "ok $_\n" for 41..43;
-
sub lv1n : lvalue { $newvar }
$_ = undef;
@@ -427,3 +421,122 @@ $a = \&lv1nn;
$a->() = 8;
print "# '$nnewvar'.\nnot " unless $nnewvar eq '8';
print "ok 46\n";
+
+# This must happen at run time
+eval {
+ sub AUTOLOAD : lvalue { $newvar };
+};
+foobar() = 12;
+print "# '$newvar'.\nnot " unless $newvar eq "12";
+print "ok 47\n";
+
+# Testing DWIM of foo = bar;
+sub foo : lvalue {
+ $a;
+}
+$a = "not ok 48\n";
+foo = "ok 48\n";
+print $a;
+
+open bar, ">nothing" or die $!;
+bar = *STDOUT;
+print bar "ok 49\n";
+unlink "nothing";
+
+{
+my %hash; my @array;
+sub alv : lvalue { $array[1] }
+sub alv2 : lvalue { $array[$_[0]] }
+sub hlv : lvalue { $hash{"foo"} }
+sub hlv2 : lvalue { $hash{$_[0]} }
+$array[1] = "not ok 51\n";
+alv() = "ok 50\n";
+print alv();
+
+alv2(20) = "ok 51\n";
+print $array[20];
+
+$hash{"foo"} = "not ok 52\n";
+hlv() = "ok 52\n";
+print $hash{foo};
+
+$hash{bar} = "not ok 53\n";
+hlv("bar") = "ok 53\n";
+print hlv("bar");
+
+sub array : lvalue { @array }
+sub array2 : lvalue { @array2 } # This is a global.
+sub hash : lvalue { %hash }
+sub hash2 : lvalue { %hash2 } # So's this.
+@array2 = qw(foo bar);
+%hash2 = qw(foo bar);
+
+(array()) = qw(ok 54);
+print "not " unless "@array" eq "ok 54";
+print "ok 54\n";
+
+(array2()) = qw(ok 55);
+print "not " unless "@array2" eq "ok 55";
+print "ok 55\n";
+
+(hash()) = qw(ok 56);
+print "not " unless $hash{ok} == 56;
+print "ok 56\n";
+
+(hash2()) = qw(ok 57);
+print "not " unless $hash2{ok} == 57;
+print "ok 57\n";
+
+@array = qw(a b c d);
+sub aslice1 : lvalue { @array[0,2] };
+(aslice1()) = ("ok", "already");
+print "# @array\nnot " unless "@array" eq "ok b already d";
+print "ok 58\n";
+
+@array2 = qw(a B c d);
+sub aslice2 : lvalue { @array2[0,2] };
+(aslice2()) = ("ok", "already");
+print "not " unless "@array2" eq "ok B already d";
+print "ok 59\n";
+
+%hash = qw(a Alpha b Beta c Gamma);
+sub hslice : lvalue { @hash{"c", "b"} }
+(hslice()) = ("CISC", "BogoMIPS");
+print "not " unless join("/",@hash{"c","a","b"}) eq "CISC/Alpha/BogoMIPS";
+print "ok 60\n";
+}
+
+$str = "Hello, world!";
+sub sstr : lvalue { substr($str, 1, 4) }
+sstr() = "i";
+print "not " unless $str eq "Hi, world!";
+print "ok 61\n";
+
+$str = "Made w/ JavaScript";
+sub veclv : lvalue { vec($str, 2, 32) }
+if (ord('A') != 193) {
+ veclv() = 0x5065726C;
+}
+else { # EBCDIC?
+ veclv() = 0xD7859993;
+}
+print "# $str\nnot " unless $str eq "Made w/ PerlScript";
+print "ok 62\n";
+
+sub position : lvalue { pos }
+@p = ();
+$_ = "fee fi fo fum";
+while (/f/g) {
+ push @p, position;
+ position() += 6;
+}
+print "# @p\nnot " unless "@p" eq "1 8";
+print "ok 63\n";
+
+# Bug 20001223.002: split thought that the list had only one element
+@ary = qw(4 5 6);
+sub lval1 : lvalue { $ary[0]; }
+sub lval2 : lvalue { $ary[1]; }
+(lval1(), lval2()) = split ' ', "1 2 3 4";
+print "not " unless join(':', @ary) eq "1:2:6";
+print "ok 64\n";
diff --git a/gnu/usr.bin/perl/t/pragma/utf8.t b/gnu/usr.bin/perl/t/pragma/utf8.t
index 0e55a67d693..e0a321afe9c 100644
--- a/gnu/usr.bin/perl/t/pragma/utf8.t
+++ b/gnu/usr.bin/perl/t/pragma/utf8.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ @INC = '../lib';
$ENV{PERL5LIB} = '../lib';
if ( ord("\t") != 9 ) { # skip on ebcdic platforms
print "1..0 # Skip utf8 tests on ebcdic platform.\n";
@@ -10,7 +10,7 @@ BEGIN {
}
}
-print "1..60\n";
+print "1..90\n";
my $test = 1;
@@ -20,234 +20,443 @@ sub ok {
print "ok $test\n";
}
+sub nok {
+ my ($got,$expect) = @_;
+ print "# expected not [$expect], got [$got]\nnot " if $got eq $expect;
+ print "ok $test\n";
+}
+
+sub ok_bytes {
+ use bytes;
+ my ($got,$expect) = @_;
+ print "# expected [$expect], got [$got]\nnot " if $got ne $expect;
+ print "ok $test\n";
+}
+
+sub nok_bytes {
+ use bytes;
+ my ($got,$expect) = @_;
+ print "# expected not [$expect], got [$got]\nnot " if $got eq $expect;
+ print "ok $test\n";
+}
+
{
use utf8;
$_ = ">\x{263A}<";
s/([\x{80}-\x{10ffff}])/"&#".ord($1).";"/eg;
ok $_, '>&#9786;<';
- $test++;
+ $test++; # 1
$_ = ">\x{263A}<";
my $rx = "\x{80}-\x{10ffff}";
s/([$rx])/"&#".ord($1).";"/eg;
ok $_, '>&#9786;<';
- $test++;
+ $test++; # 2
$_ = ">\x{263A}<";
my $rx = "\\x{80}-\\x{10ffff}";
s/([$rx])/"&#".ord($1).";"/eg;
ok $_, '>&#9786;<';
- $test++;
+ $test++; # 3
$_ = "alpha,numeric";
m/([[:alpha:]]+)/;
ok $1, 'alpha';
- $test++;
+ $test++; # 4
$_ = "alphaNUMERICstring";
m/([[:^lower:]]+)/;
ok $1, 'NUMERIC';
- $test++;
+ $test++; # 5
$_ = "alphaNUMERICstring";
m/(\p{Ll}+)/;
ok $1, 'alpha';
- $test++;
+ $test++; # 6
$_ = "alphaNUMERICstring";
m/(\p{Lu}+)/;
ok $1, 'NUMERIC';
- $test++;
+ $test++; # 7
$_ = "alpha,numeric";
m/([\p{IsAlpha}]+)/;
ok $1, 'alpha';
- $test++;
+ $test++; # 8
$_ = "alphaNUMERICstring";
m/([^\p{IsLower}]+)/;
ok $1, 'NUMERIC';
- $test++;
+ $test++; # 9
$_ = "alpha123numeric456";
m/([\p{IsDigit}]+)/;
ok $1, '123';
- $test++;
+ $test++; # 10
$_ = "alpha123numeric456";
m/([^\p{IsDigit}]+)/;
ok $1, 'alpha';
- $test++;
+ $test++; # 11
$_ = ",123alpha,456numeric";
m/([\p{IsAlnum}]+)/;
ok $1, '123alpha';
- $test++;
+ $test++; # 12
}
+
{
use utf8;
$_ = "\x{263A}>\x{263A}\x{263A}";
ok length, 4;
- $test++;
+ $test++; # 13
ok length((m/>(.)/)[0]), 1;
- $test++;
+ $test++; # 14
ok length($&), 2;
- $test++;
+ $test++; # 15
ok length($'), 1;
- $test++;
+ $test++; # 16
ok length($`), 1;
- $test++;
+ $test++; # 17
ok length($1), 1;
- $test++;
+ $test++; # 18
ok length($tmp=$&), 2;
- $test++;
+ $test++; # 19
ok length($tmp=$'), 1;
- $test++;
+ $test++; # 20
ok length($tmp=$`), 1;
- $test++;
+ $test++; # 21
ok length($tmp=$1), 1;
- $test++;
+ $test++; # 22
- ok $&, pack("C*", ord(">"), 0342, 0230, 0272);
- $test++;
+ {
+ use bytes;
- ok $', pack("C*", 0342, 0230, 0272);
- $test++;
+ my $tmp = $&;
+ ok $tmp, pack("C*", ord(">"), 0342, 0230, 0272);
+ $test++; # 23
- ok $`, pack("C*", 0342, 0230, 0272);
- $test++;
+ $tmp = $';
+ ok $tmp, pack("C*", 0342, 0230, 0272);
+ $test++; # 24
- ok $1, pack("C*", 0342, 0230, 0272);
- $test++;
+ $tmp = $`;
+ ok $tmp, pack("C*", 0342, 0230, 0272);
+ $test++; # 25
+
+ $tmp = $1;
+ ok $tmp, pack("C*", 0342, 0230, 0272);
+ $test++; # 26
+ }
+
+ ok_bytes $&, pack("C*", ord(">"), 0342, 0230, 0272);
+ $test++; # 27
+
+ ok_bytes $', pack("C*", 0342, 0230, 0272);
+ $test++; # 28
+
+ ok_bytes $`, pack("C*", 0342, 0230, 0272);
+ $test++; # 29
+
+ ok_bytes $1, pack("C*", 0342, 0230, 0272);
+ $test++; # 30
{
use bytes;
no utf8;
ok length, 10;
- $test++;
+ $test++; # 31
ok length((m/>(.)/)[0]), 1;
- $test++;
+ $test++; # 32
ok length($&), 2;
- $test++;
+ $test++; # 33
ok length($'), 5;
- $test++;
+ $test++; # 34
ok length($`), 3;
- $test++;
+ $test++; # 35
ok length($1), 1;
- $test++;
+ $test++; # 36
ok $&, pack("C*", ord(">"), 0342);
- $test++;
+ $test++; # 37
ok $', pack("C*", 0230, 0272, 0342, 0230, 0272);
- $test++;
+ $test++; # 38
ok $`, pack("C*", 0342, 0230, 0272);
- $test++;
+ $test++; # 39
ok $1, pack("C*", 0342);
- $test++;
-
+ $test++; # 40
}
-
{
no utf8;
$_="\342\230\272>\342\230\272\342\230\272";
}
ok length, 10;
- $test++;
+ $test++; # 41
ok length((m/>(.)/)[0]), 1;
- $test++;
+ $test++; # 42
ok length($&), 2;
- $test++;
+ $test++; # 43
ok length($'), 1;
- $test++;
+ $test++; # 44
ok length($`), 1;
- $test++;
+ $test++; # 45
ok length($1), 1;
- $test++;
+ $test++; # 46
ok length($tmp=$&), 2;
- $test++;
+ $test++; # 47
ok length($tmp=$'), 1;
- $test++;
+ $test++; # 48
ok length($tmp=$`), 1;
- $test++;
+ $test++; # 49
ok length($tmp=$1), 1;
- $test++;
+ $test++; # 50
- ok $&, pack("C*", ord(">"), 0342, 0230, 0272);
- $test++;
+ {
+ use bytes;
- ok $', pack("C*", 0342, 0230, 0272);
- $test++;
+ my $tmp = $&;
+ ok $tmp, pack("C*", ord(">"), 0342, 0230, 0272);
+ $test++; # 51
- ok $`, pack("C*", 0342, 0230, 0272);
- $test++;
+ $tmp = $';
+ ok $tmp, pack("C*", 0342, 0230, 0272);
+ $test++; # 52
- ok $1, pack("C*", 0342, 0230, 0272);
- $test++;
+ $tmp = $`;
+ ok $tmp, pack("C*", 0342, 0230, 0272);
+ $test++; # 53
+
+ $tmp = $1;
+ ok $tmp, pack("C*", 0342, 0230, 0272);
+ $test++; # 54
+ }
{
use bytes;
no utf8;
ok length, 10;
- $test++;
+ $test++; # 55
ok length((m/>(.)/)[0]), 1;
- $test++;
+ $test++; # 56
ok length($&), 2;
- $test++;
+ $test++; # 57
ok length($'), 5;
- $test++;
+ $test++; # 58
ok length($`), 3;
- $test++;
+ $test++; # 59
ok length($1), 1;
- $test++;
+ $test++; # 60
ok $&, pack("C*", ord(">"), 0342);
- $test++;
+ $test++; # 61
ok $', pack("C*", 0230, 0272, 0342, 0230, 0272);
- $test++;
+ $test++; # 62
ok $`, pack("C*", 0342, 0230, 0272);
- $test++;
+ $test++; # 63
ok $1, pack("C*", 0342);
+ $test++; # 64
+ }
+
+ ok "\x{ab}" =~ /^\x{ab}$/, 1;
+ $test++; # 65
+}
+
+{
+ use utf8;
+ ok join(" ",unpack("C*",chr(128).chr(255))), "128 255";
+ $test++;
+}
+
+{
+ use utf8;
+ my @a = map ord, split(//, join("", map chr, (1234, 123, 2345)));
+ ok "@a", "1234 123 2345";
+ $test++; # 67
+}
+
+{
+ use utf8;
+ my $x = chr(123);
+ my @a = map ord, split(/$x/, join("", map chr, (1234, 123, 2345)));
+ ok "@a", "1234 2345";
+ $test++; # 68
+}
+
+{
+ # bug id 20001009.001
+
+ my ($a, $b);
+
+ { use bytes; $a = "\xc3\xa4" }
+ { use utf8; $b = "\xe4" } # \xXX must not produce UTF-8
+
+ print "not " if $a eq $b;
+ print "ok $test\n"; $test++;
+
+ { use utf8; print "not " if $a eq $b; }
+ print "ok $test\n"; $test++;
+}
+
+{
+ # bug id 20001008.001
+
+ my @x = ("stra\337e 138","stra\337e 138");
+ for (@x) {
+ s/(\d+)\s*([\w\-]+)/$1 . uc $2/e;
+ my($latin) = /^(.+)(?:\s+\d)/;
+ print $latin eq "stra\337e" ? "ok $test\n" :
+ "#latin[$latin]\nnot ok $test\n";
+ $test++;
+ $latin =~ s/stra\337e/straße/; # \303\237 after the 2nd a
+ use utf8;
+ $latin =~ s!(s)tr(?:aß|s+e)!$1tr.!; # \303\237 after the a
+ }
+}
+
+{
+ # bug id 20000427.003
+
+ use utf8;
+ use warnings;
+ use strict;
+
+ my $sushi = "\x{b36c}\x{5a8c}\x{ff5b}\x{5079}\x{505b}";
+
+ my @charlist = split //, $sushi;
+ my $r = '';
+ foreach my $ch (@charlist) {
+ $r = $r . " " . sprintf "U+%04X", ord($ch);
+ }
+
+ print "not " unless $r eq " U+B36C U+5A8C U+FF5B U+5079 U+505B";
+ print "ok $test\n";
+ $test++;
+}
+
+{
+ # bug id 20000426.003
+
+ use utf8;
+
+ my $s = "\x20\x40\x{80}\x{100}\x{80}\x40\x20";
+
+ my ($a, $b, $c) = split(/\x40/, $s);
+ print "not "
+ unless $a eq "\x20" && $b eq "\x{80}\x{100}\x{80}" && $c eq $a;
+ print "ok $test\n";
+ $test++;
+
+ my ($a, $b) = split(/\x{100}/, $s);
+ print "not " unless $a eq "\x20\x40\x{80}" && $b eq "\x{80}\x40\x20";
+ print "ok $test\n";
+ $test++;
+
+ my ($a, $b) = split(/\x{80}\x{100}\x{80}/, $s);
+ print "not " unless $a eq "\x20\x40" && $b eq "\x40\x20";
+ print "ok $test\n";
+ $test++;
+
+ my ($a, $b) = split(/\x40\x{80}/, $s);
+ print "not " unless $a eq "\x20" && $b eq "\x{100}\x{80}\x40\x20";
+ print "ok $test\n";
+ $test++;
+
+ my ($a, $b, $c) = split(/[\x40\x{80}]+/, $s);
+ print "not " unless $a eq "\x20" && $b eq "\x{100}" && $c eq "\x20";
+ print "ok $test\n";
+ $test++;
+}
+
+{
+ # bug id 20000730.004
+
+ use utf8;
+
+ my $smiley = "\x{263a}";
+
+ for my $s ("\x{263a}", # 1
+ $smiley, # 2
+
+ "" . $smiley, # 3
+ "" . "\x{263a}", # 4
+
+ $smiley . "", # 5
+ "\x{263a}" . "", # 6
+ ) {
+ my $length_chars = length($s);
+ my $length_bytes;
+ { use bytes; $length_bytes = length($s) }
+ my @regex_chars = $s =~ m/(.)/g;
+ my $regex_chars = @regex_chars;
+ my @split_chars = split //, $s;
+ my $split_chars = @split_chars;
+ print "not "
+ unless "$length_chars/$regex_chars/$split_chars/$length_bytes" eq
+ "1/1/1/3";
+ print "ok $test\n";
$test++;
+ }
+ for my $s ("\x{263a}" . "\x{263a}", # 7
+ $smiley . $smiley, # 8
+
+ "\x{263a}\x{263a}", # 9
+ "$smiley$smiley", # 10
+
+ "\x{263a}" x 2, # 11
+ $smiley x 2, # 12
+ ) {
+ my $length_chars = length($s);
+ my $length_bytes;
+ { use bytes; $length_bytes = length($s) }
+ my @regex_chars = $s =~ m/(.)/g;
+ my $regex_chars = @regex_chars;
+ my @split_chars = split //, $s;
+ my $split_chars = @split_chars;
+ print "not "
+ unless "$length_chars/$regex_chars/$split_chars/$length_bytes" eq
+ "2/2/2/6";
+ print "ok $test\n";
+ $test++;
}
}
diff --git a/gnu/usr.bin/perl/t/pragma/warn/2use b/gnu/usr.bin/perl/t/pragma/warn/2use
index 60a60c313cb..b489d62e199 100644
--- a/gnu/usr.bin/perl/t/pragma/warn/2use
+++ b/gnu/usr.bin/perl/t/pragma/warn/2use
@@ -120,175 +120,223 @@ Use of uninitialized value in scalar chop at - line 3.
########
# Check scope of pragma with eval
-no warnings ;
-eval {
+use warnings;
+{
+ no warnings ;
+ eval {
+ my $b ; chop $b ;
+ }; print STDERR $@ ;
my $b ; chop $b ;
-}; print STDERR $@ ;
-my $b ; chop $b ;
+}
EXPECT
########
# Check scope of pragma with eval
-no warnings ;
-eval {
- use warnings 'uninitialized' ;
+use warnings;
+{
+ no warnings ;
+ eval {
+ use warnings 'uninitialized' ;
+ my $b ; chop $b ;
+ }; print STDERR $@ ;
my $b ; chop $b ;
-}; print STDERR $@ ;
-my $b ; chop $b ;
+}
EXPECT
-Use of uninitialized value in scalar chop at - line 6.
+Use of uninitialized value in scalar chop at - line 8.
########
# Check scope of pragma with eval
-use warnings 'uninitialized' ;
-eval {
+no warnings;
+{
+ use warnings 'uninitialized' ;
+ eval {
+ my $b ; chop $b ;
+ }; print STDERR $@ ;
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.
+Use of uninitialized value in scalar chop at - line 9.
########
# Check scope of pragma with eval
-use warnings 'uninitialized' ;
-eval {
- no warnings ;
+no warnings;
+{
+ use warnings 'uninitialized' ;
+ eval {
+ no warnings ;
+ my $b ; chop $b ;
+ }; print STDERR $@ ;
my $b ; chop $b ;
-}; print STDERR $@ ;
-my $b ; chop $b ;
+}
EXPECT
-Use of uninitialized value in scalar chop at - line 8.
+Use of uninitialized value in scalar chop at - line 10.
########
# Check scope of pragma with eval
-no warnings ;
-eval {
+use warnings;
+{
+ no warnings ;
+ eval {
+ 1 if $a EQ $b ;
+ }; print STDERR $@ ;
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' ;
+use warnings;
+{
+ no warnings ;
+ eval {
+ use warnings 'deprecated' ;
+ 1 if $a EQ $b ;
+ }; print STDERR $@ ;
1 if $a EQ $b ;
-}; print STDERR $@ ;
-1 if $a EQ $b ;
+}
EXPECT
-Use of EQ is deprecated at - line 6.
+Use of EQ is deprecated at - line 8.
########
# Check scope of pragma with eval
-use warnings 'deprecated' ;
-eval {
+no warnings;
+{
+ use warnings 'deprecated' ;
+ eval {
+ 1 if $a EQ $b ;
+ }; print STDERR $@ ;
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.
+Use of EQ is deprecated at - line 9.
########
# Check scope of pragma with eval
-use warnings 'deprecated' ;
-eval {
- no warnings ;
+no warnings;
+{
+ use warnings 'deprecated' ;
+ eval {
+ no warnings ;
+ 1 if $a EQ $b ;
+ }; print STDERR $@ ;
1 if $a EQ $b ;
-}; print STDERR $@ ;
-1 if $a EQ $b ;
+}
EXPECT
-Use of EQ is deprecated at - line 8.
+Use of EQ is deprecated at - line 10.
########
# Check scope of pragma with eval
-no warnings ;
-eval '
+use warnings;
+{
+ no warnings ;
+ eval '
+ my $b ; chop $b ;
+ '; print STDERR $@ ;
my $b ; chop $b ;
-'; print STDERR $@ ;
-my $b ; chop $b ;
+}
EXPECT
########
# Check scope of pragma with eval
-no warnings ;
-eval q[
- use warnings 'uninitialized' ;
+use warnings;
+{
+ no warnings ;
+ eval q[
+ use warnings 'uninitialized' ;
+ my $b ; chop $b ;
+ ]; print STDERR $@;
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 '
+no warnings;
+{
+ use warnings 'uninitialized' ;
+ eval '
+ my $b ; chop $b ;
+ '; print STDERR $@ ;
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.
+Use of uninitialized value in scalar chop at - line 9.
########
# Check scope of pragma with eval
-use warnings 'uninitialized' ;
-eval '
- no warnings ;
+no warnings;
+{
+ use warnings 'uninitialized' ;
+ eval '
+ no warnings ;
+ my $b ; chop $b ;
+ '; print STDERR $@ ;
my $b ; chop $b ;
-'; print STDERR $@ ;
-my $b ; chop $b ;
+}
EXPECT
-Use of uninitialized value in scalar chop at - line 8.
+Use of uninitialized value in scalar chop at - line 10.
########
# Check scope of pragma with eval
-no warnings ;
-eval '
+use warnings;
+{
+ no warnings ;
+ eval '
+ 1 if $a EQ $b ;
+ '; print STDERR $@ ;
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' ;
+use warnings;
+{
+ no warnings ;
+ eval q[
+ use warnings 'deprecated' ;
+ 1 if $a EQ $b ;
+ ]; print STDERR $@;
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 '
+no warnings;
+{
+ use warnings 'deprecated' ;
+ eval '
+ 1 if $a EQ $b ;
+ '; print STDERR $@;
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 - line 9.
Use of EQ is deprecated at (eval 1) line 2.
########
# Check scope of pragma with eval
-use warnings 'deprecated' ;
-eval '
- no warnings ;
+no warnings;
+{
+ use warnings 'deprecated' ;
+ eval '
+ no warnings ;
+ 1 if $a EQ $b ;
+ '; print STDERR $@;
1 if $a EQ $b ;
-'; print STDERR $@;
-1 if $a EQ $b ;
+}
EXPECT
-Use of EQ is deprecated at - line 8.
+Use of EQ is deprecated at - line 10.
########
# Check the additive nature of the pragma
diff --git a/gnu/usr.bin/perl/t/pragma/warn/3both b/gnu/usr.bin/perl/t/pragma/warn/3both
index 132b99b80fb..335e1b26b7a 100644
--- a/gnu/usr.bin/perl/t/pragma/warn/3both
+++ b/gnu/usr.bin/perl/t/pragma/warn/3both
@@ -195,3 +195,72 @@ my $b ;
chop $b ;
EXPECT
Use of uninitialized value in scalar chop at - line 7.
+########
+
+# Check scope of pragma with eval
+BEGIN { $^W = 1 }
+{
+ no warnings ;
+ eval '
+ my $b ; chop $b ;
+ '; print STDERR $@ ;
+ my $b ; chop $b ;
+}
+EXPECT
+
+########
+
+# Check scope of pragma with eval
+BEGIN { $^W = 1 }
+use warnings;
+{
+ 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
+BEGIN { $^W = 0 }
+{
+ 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 9.
+########
+
+# Check scope of pragma with eval
+BEGIN { $^W = 0 }
+{
+ 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 10.
+########
+
+# Check scope of pragma with eval
+BEGIN { $^W = 1 }
+{
+ no warnings ;
+ eval '
+ 1 if $a EQ $b ;
+ '; print STDERR $@ ;
+ 1 if $a EQ $b ;
+}
+EXPECT
+
diff --git a/gnu/usr.bin/perl/t/pragma/warn/4lint b/gnu/usr.bin/perl/t/pragma/warn/4lint
index db54f31c7b4..b2fa75fbbd9 100644
--- a/gnu/usr.bin/perl/t/pragma/warn/4lint
+++ b/gnu/usr.bin/perl/t/pragma/warn/4lint
@@ -9,14 +9,14 @@ $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.
+print() on closed filehandle 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.
+print() on closed filehandle STDIN at - line 4.
########
-W
# lint: check runtime $^W is zapped
@@ -25,7 +25,7 @@ print() on closed filehandle main::STDIN at - line 4.
close STDIN ; print STDIN "abc" ;
}
EXPECT
-print() on closed filehandle main::STDIN at - line 5.
+print() on closed filehandle STDIN at - line 5.
########
-W
# lint: check "no warnings" is zapped
@@ -35,7 +35,7 @@ $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.
+print() on closed filehandle STDIN at - line 6.
########
-W
# lint: check "no warnings" is zapped
@@ -44,7 +44,7 @@ print() on closed filehandle main::STDIN at - line 6.
close STDIN ; print STDIN "abc" ;
}
EXPECT
-print() on closed filehandle main::STDIN at - line 5.
+print() on closed filehandle STDIN at - line 5.
########
-Ww
# lint: check combination of -w and -W
@@ -53,7 +53,7 @@ print() on closed filehandle main::STDIN at - line 5.
close STDIN ; print STDIN "abc" ;
}
EXPECT
-print() on closed filehandle main::STDIN at - line 5.
+print() on closed filehandle STDIN at - line 5.
########
-W
--FILE-- abc.pm
@@ -110,3 +110,107 @@ 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
+# Check scope of pragma with eval
+{
+ no warnings ;
+ 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 8.
+########
+-W
+# Check scope of pragma with eval
+use warnings;
+{
+ 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.
+Use of uninitialized value in scalar chop at - line 10.
+########
+-W
+# Check scope of pragma with eval
+no warnings;
+{
+ 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 9.
+########
+-W
+# Check scope of pragma with eval
+no warnings;
+{
+ 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 (eval 1) line 3.
+Use of uninitialized value in scalar chop at - line 10.
+########
+-W
+# Check scope of pragma with eval
+use warnings;
+{
+ my $a = "1"; my $b = "2";
+ 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 - line 11.
+Use of EQ is deprecated at (eval 1) line 3.
+########
+-W
+# Check scope of pragma with eval
+no warnings;
+{
+ my $a = "1"; my $b = "2";
+ use warnings 'deprecated' ;
+ eval '
+ 1 if $a EQ $b ;
+ '; print STDERR $@;
+ 1 if $a EQ $b ;
+}
+EXPECT
+Use of EQ is deprecated at - line 10.
+Use of EQ is deprecated at (eval 1) line 2.
+########
+-W
+# Check scope of pragma with eval
+no warnings;
+{
+ my $a = "1"; my $b = "2";
+ 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 11.
+Use of EQ is deprecated at (eval 1) line 3.
diff --git a/gnu/usr.bin/perl/t/pragma/warn/5nolint b/gnu/usr.bin/perl/t/pragma/warn/5nolint
index 994190a8559..2459968003d 100644
--- a/gnu/usr.bin/perl/t/pragma/warn/5nolint
+++ b/gnu/usr.bin/perl/t/pragma/warn/5nolint
@@ -94,3 +94,111 @@ $^W = 1 ;
require "./abc";
my $a ; chop $a ;
EXPECT
+########
+-X
+# Check scope of pragma with eval
+use warnings;
+{
+ no warnings ;
+ eval '
+ my $b ; chop $b ;
+ '; print STDERR $@ ;
+ my $b ; chop $b ;
+}
+EXPECT
+
+########
+-X
+# Check scope of pragma with eval
+use warnings;
+{
+ no warnings ;
+ eval q[
+ use warnings 'uninitialized' ;
+ my $b ; chop $b ;
+ ]; print STDERR $@;
+ my $b ; chop $b ;
+}
+EXPECT
+
+########
+-X
+# Check scope of pragma with eval
+no warnings;
+{
+ use warnings 'uninitialized' ;
+ eval '
+ my $b ; chop $b ;
+ '; print STDERR $@ ;
+ my $b ; chop $b ;
+}
+EXPECT
+
+########
+-X
+# Check scope of pragma with eval
+no warnings;
+{
+ use warnings 'uninitialized' ;
+ eval '
+ no warnings ;
+ my $b ; chop $b ;
+ '; print STDERR $@ ;
+ my $b ; chop $b ;
+}
+EXPECT
+
+########
+-X
+# Check scope of pragma with eval
+use warnings;
+{
+ no warnings ;
+ eval '
+ 1 if $a EQ $b ;
+ '; print STDERR $@ ;
+ 1 if $a EQ $b ;
+}
+EXPECT
+
+########
+-X
+# Check scope of pragma with eval
+use warnings;
+{
+ no warnings ;
+ eval q[
+ use warnings 'deprecated' ;
+ 1 if $a EQ $b ;
+ ]; print STDERR $@;
+ 1 if $a EQ $b ;
+}
+EXPECT
+
+########
+-X
+# Check scope of pragma with eval
+no warnings;
+{
+ use warnings 'deprecated' ;
+ eval '
+ 1 if $a EQ $b ;
+ '; print STDERR $@;
+ 1 if $a EQ $b ;
+}
+EXPECT
+
+########
+-X
+# Check scope of pragma with eval
+no warnings;
+{
+ use warnings 'deprecated' ;
+ eval '
+ no warnings ;
+ 1 if $a EQ $b ;
+ '; print STDERR $@;
+ 1 if $a EQ $b ;
+}
+EXPECT
+
diff --git a/gnu/usr.bin/perl/t/pragma/warn/6default b/gnu/usr.bin/perl/t/pragma/warn/6default
index dd3d1825f44..a8aafeeb225 100644
--- a/gnu/usr.bin/perl/t/pragma/warn/6default
+++ b/gnu/usr.bin/perl/t/pragma/warn/6default
@@ -51,3 +51,71 @@ 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.
+########
+
+# Check scope of pragma with eval
+use warnings;
+{
+ no warnings ;
+ eval '
+ my $a = oct "0xfffffffffffffffffg" ;
+ '; print STDERR $@ ;
+ my $a = oct "0xfffffffffffffffffg" ;
+}
+EXPECT
+
+########
+
+# Check scope of pragma with eval
+use warnings;
+{
+ no warnings ;
+ eval q[
+ use warnings ;
+ my $a = oct "0xfffffffffffffffffg" ;
+ ]; print STDERR $@;
+ my $a = oct "0xfffffffffffffffffg" ;
+}
+EXPECT
+Integer overflow in hexadecimal number at (eval 1) line 3.
+Illegal hexadecimal digit 'g' ignored at (eval 1) line 3.
+Hexadecimal number > 0xffffffff non-portable at (eval 1) line 3.
+########
+
+# Check scope of pragma with eval
+no warnings;
+{
+ use warnings ;
+ eval '
+ my $a = oct "0xfffffffffffffffffg" ;
+ '; print STDERR $@ ;
+}
+EXPECT
+Integer overflow in hexadecimal number at (eval 1) line 2.
+Illegal hexadecimal digit 'g' ignored at (eval 1) line 2.
+Hexadecimal number > 0xffffffff non-portable at (eval 1) line 2.
+########
+
+# Check scope of pragma with eval
+no warnings;
+{
+ use warnings;
+ eval '
+ no warnings ;
+ my $a = oct "0xfffffffffffffffffg" ;
+ '; print STDERR $@ ;
+}
+EXPECT
+
+########
+
+# Check scope of pragma with eval
+no warnings;
+{
+ use warnings 'deprecated' ;
+ eval '
+ my $a = oct "0xfffffffffffffffffg" ;
+ '; print STDERR $@;
+}
+EXPECT
+
diff --git a/gnu/usr.bin/perl/t/pragma/warn/7fatal b/gnu/usr.bin/perl/t/pragma/warn/7fatal
index 943bb06fb34..ed585c2feda 100644
--- a/gnu/usr.bin/perl/t/pragma/warn/7fatal
+++ b/gnu/usr.bin/perl/t/pragma/warn/7fatal
@@ -14,6 +14,18 @@ EXPECT
Use of EQ is deprecated at - line 8.
########
+# Check compile time warning
+use warnings FATAL => 'all' ;
+{
+ 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' ;
{
@@ -27,6 +39,18 @@ Use of uninitialized value in scalar chop at - line 8.
########
# Check runtime scope of pragma
+use warnings FATAL => 'all' ;
+{
+ 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' ;
@@ -38,6 +62,18 @@ EXPECT
Use of uninitialized value in scalar chop at - line 6.
########
+# Check runtime scope of pragma
+no warnings ;
+{
+ use warnings FATAL => 'all' ;
+ $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;
@@ -240,3 +276,37 @@ eval '
print STDERR "The End.\n" ;
EXPECT
Use of EQ is deprecated at - line 8.
+########
+
+use warnings 'void' ;
+
+time ;
+
+{
+ use warnings FATAL => qw(void) ;
+ length "abc" ;
+}
+
+join "", 1,2,3 ;
+
+print "done\n" ;
+EXPECT
+Useless use of time in void context at - line 4.
+Useless use of length in void context at - line 8.
+########
+
+use warnings ;
+
+time ;
+
+{
+ use warnings FATAL => qw(void) ;
+ length "abc" ;
+}
+
+join "", 1,2,3 ;
+
+print "done\n" ;
+EXPECT
+Useless use of time in void context at - line 4.
+Useless use of length in void context at - line 8.
diff --git a/gnu/usr.bin/perl/t/pragma/warn/9enabled b/gnu/usr.bin/perl/t/pragma/warn/9enabled
index 7facf996f5f..f5579b2dded 100644
--- a/gnu/usr.bin/perl/t/pragma/warn/9enabled
+++ b/gnu/usr.bin/perl/t/pragma/warn/9enabled
@@ -332,7 +332,17 @@ print $@ ;
EXPECT
Usage: warnings::warn([category,] 'message') at - line 4
unknown warnings category 'fred' at - line 6
- require 0 called at - line 6
+########
+
+# check warnings::warnif
+use warnings ;
+eval { warnings::warnif() } ;
+print $@ ;
+eval { warnings::warnif("fred", "joe") } ;
+print $@ ;
+EXPECT
+Usage: warnings::warnif([category,] 'message') at - line 4
+unknown warnings category 'fred' at - line 6
########
--FILE-- abc.pm
@@ -373,6 +383,7 @@ eval { abc::check() ; } ;
print "[[$@]]\n";
EXPECT
hello at - line 3
+ eval {...} called at - line 3
[[]]
########
@@ -388,6 +399,7 @@ eval { abc::check() ; } ;
print "[[$@]]\n";
EXPECT
[[hello at - line 3
+ eval {...} called at - line 3
]]
########
-W
@@ -431,7 +443,37 @@ use warnings 'syntax' ;
use abc ;
abc::check() ;
EXPECT
-package 'abc' not registered for warnings at - line 3
+package 'abc' not registered for warnings at abc.pm line 4
+########
+
+--FILE-- abc.pm
+package abc ;
+no warnings ;
+sub check {
+ warnings::warn("fred") ;
+}
+1;
+--FILE--
+use warnings 'syntax' ;
+use abc ;
+abc::check() ;
+EXPECT
+package 'abc' not registered for warnings at abc.pm line 4
+########
+
+--FILE-- abc.pm
+package abc ;
+no warnings ;
+sub check {
+ warnings::warnif("fred") ;
+}
+1;
+--FILE--
+use warnings 'syntax' ;
+use abc ;
+abc::check() ;
+EXPECT
+package 'abc' not registered for warnings at abc.pm line 4
########
--FILE-- abc.pm
@@ -617,6 +659,7 @@ eval { abc::check() ; } ;
print "[[$@]]\n";
EXPECT
hello at - line 3
+ eval {...} called at - line 3
[[]]
########
@@ -632,6 +675,7 @@ eval { abc::check() ; } ;
print "[[$@]]\n";
EXPECT
[[hello at - line 3
+ eval {...} called at - line 3
]]
########
-W
@@ -723,6 +767,10 @@ sub check {
print "ok1\n" if !warnings::enabled() ;
print "ok2\n" if !warnings::enabled("io") ;
print "ok3\n" if !warnings::enabled("all") ;
+ warnings::warnif("my message 1") ;
+ warnings::warnif('abc', "my message 2") ;
+ warnings::warnif('io', "my message 3") ;
+ warnings::warnif('all', "my message 4") ;
}
1;
--FILE--
@@ -817,3 +865,298 @@ abc all not enabled
def self enabled
def abc not enabled
def all not enabled
+########
+-w
+--FILE-- abc.pm
+package abc ;
+no warnings ;
+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 ;
+abc::check() ;
+EXPECT
+ok1
+ok2
+ok3
+########
+-w
+--FILE-- abc.pm
+package abc ;
+no warnings ;
+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 ;
+no warnings ;
+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") ;
+ warnings::warnif("my message 1") ;
+ warnings::warnif('abc', "my message 2") ;
+ warnings::warnif('io', "my message 3") ;
+ warnings::warnif('all', "my message 4") ;
+}
+1;
+--FILE--
+use abc ;
+use warnings 'abc';
+no warnings ;
+BEGIN { $^W = 1 ; }
+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("io") ;
+ print "ok3\n" if !warnings::enabled("all") ;
+}
+1;
+--FILE--
+use abc ;
+use warnings 'abc';
+no warnings ;
+$^W = 1 ;
+abc::check() ;
+EXPECT
+ok1
+ok2
+ok3
+########
+
+--FILE-- abc.pm
+$| = 1;
+package abc ;
+no warnings ;
+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") ;
+ print "ok4\n" if warnings::enabled("abc") ;
+ warnings::warn("my message 1") ;
+ warnings::warnif("my message 2") ;
+ warnings::warnif('abc', "my message 3") ;
+ warnings::warnif('io', "my message 4") ;
+ warnings::warnif('all', "my message 5") ;
+}
+sub in2 { no warnings ; check() }
+sub in1 { no warnings ; in2() }
+1;
+--FILE--
+use abc ;
+use warnings 'abc';
+abc::in1() ;
+EXPECT
+ok1
+ok2
+ok3
+ok4
+my message 1 at - line 3
+my message 2 at - line 3
+my message 3 at - line 3
+########
+
+--FILE-- def.pm
+package def ;
+no warnings ;
+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") ;
+ print "ok4\n" if warnings::enabled("def") ;
+ warnings::warn("my message 1") ;
+ warnings::warnif("my message 2") ;
+ warnings::warnif('def', "my message 3") ;
+ warnings::warnif('io', "my message 4") ;
+ warnings::warnif('all', "my message 5") ;
+}
+sub in2 { no warnings ; check() }
+sub in1 { no warnings ; in2() }
+1;
+--FILE-- abc.pm
+$| = 1;
+package abc ;
+use def ;
+use warnings 'def';
+sub in1 { def::in1() ; }
+1;
+--FILE--
+use abc ;
+no warnings;
+abc::in1() ;
+EXPECT
+ok1
+ok2
+ok3
+ok4
+my message 1 at abc.pm line 5
+ abc::in1() called at - line 3
+my message 2 at abc.pm line 5
+ abc::in1() called at - line 3
+my message 3 at abc.pm line 5
+ abc::in1() called at - line 3
+########
+
+--FILE-- def.pm
+$| = 1;
+package def ;
+no warnings ;
+use warnings::register ;
+require Exporter;
+@ISA = qw( Exporter ) ;
+@EXPORT = qw( in1 ) ;
+sub check {
+ print "ok1\n" if warnings::enabled() ;
+ print "ok2\n" if !warnings::enabled("io") ;
+ print "ok3\n" if !warnings::enabled("all") ;
+ print "ok4\n" if warnings::enabled("abc") ;
+ print "ok5\n" if !warnings::enabled("def") ;
+ warnings::warn("my message 1") ;
+ warnings::warnif("my message 2") ;
+ warnings::warnif('abc', "my message 3") ;
+ warnings::warnif('def', "my message 4") ;
+ warnings::warnif('io', "my message 5") ;
+ warnings::warnif('all', "my message 6") ;
+}
+sub in2 { no warnings ; check() }
+sub in1 { no warnings ; in2() }
+1;
+--FILE-- abc.pm
+package abc ;
+use warnings::register ;
+use def ;
+#@ISA = qw(def) ;
+1;
+--FILE--
+use abc ;
+no warnings;
+use warnings 'abc';
+abc::in1() ;
+EXPECT
+ok2
+ok3
+ok4
+ok5
+my message 1 at - line 4
+my message 3 at - line 4
+########
+
+--FILE-- def.pm
+package def ;
+no warnings ;
+use warnings::register ;
+
+sub new
+{
+ my $class = shift ;
+ bless [], $class ;
+}
+
+sub check
+{
+ my $self = shift ;
+ print "ok1\n" if !warnings::enabled() ;
+ print "ok2\n" if !warnings::enabled("io") ;
+ print "ok3\n" if !warnings::enabled("all") ;
+ print "ok4\n" if warnings::enabled("abc") ;
+ print "ok5\n" if !warnings::enabled("def") ;
+ print "ok6\n" if warnings::enabled($self) ;
+
+ warnings::warn("my message 1") ;
+ warnings::warn($self, "my message 2") ;
+
+ warnings::warnif("my message 3") ;
+ warnings::warnif('abc', "my message 4") ;
+ warnings::warnif('def', "my message 5") ;
+ warnings::warnif('io', "my message 6") ;
+ warnings::warnif('all', "my message 7") ;
+ warnings::warnif($self, "my message 8") ;
+}
+sub in2
+{
+ no warnings ;
+ my $self = shift ;
+ $self->check() ;
+}
+sub in1
+{
+ no warnings ;
+ my $self = shift ;
+ $self->in2();
+}
+1;
+--FILE-- abc.pm
+$| = 1;
+package abc ;
+use warnings::register ;
+use def ;
+@ISA = qw(def) ;
+sub new
+{
+ my $class = shift ;
+ bless [], $class ;
+}
+
+1;
+--FILE--
+use abc ;
+no warnings;
+use warnings 'abc';
+$a = new abc ;
+$a->in1() ;
+print "**\n";
+$b = new def ;
+$b->in1() ;
+EXPECT
+ok1
+ok2
+ok3
+ok4
+ok5
+ok6
+my message 1 at - line 5
+my message 2 at - line 5
+my message 4 at - line 5
+my message 8 at - line 5
+**
+ok1
+ok2
+ok3
+ok4
+ok5
+my message 1 at - line 8
+my message 2 at - line 8
+my message 4 at - line 8
diff --git a/gnu/usr.bin/perl/t/pragma/warn/doio b/gnu/usr.bin/perl/t/pragma/warn/doio
index bd409721d26..2a357e27557 100644
--- a/gnu/usr.bin/perl/t/pragma/warn/doio
+++ b/gnu/usr.bin/perl/t/pragma/warn/doio
@@ -12,22 +12,22 @@
warn(warn_nl, "open"); [Perl_do_open9]
open(F, "true\ncd")
- Close on unopened file <%s> [Perl_do_close] <<TODO
+ close() on unopened filehandle %s [Perl_do_close]
$a = "fred";close("$a")
- tell() on unopened file [Perl_do_tell]
+ tell() on closed filehandle [Perl_do_tell]
$a = "fred";$a = tell($a)
- seek() on unopened file [Perl_do_seek]
+ seek() on closed filehandle [Perl_do_seek]
$a = "fred";$a = seek($a,1,1)
- sysseek() on unopened file [Perl_do_sysseek]
+ sysseek() on closed filehandle [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]
+ -x on closed filehandle %s [Perl_my_stat]
close STDIN ; -x STDIN ;
warn(warn_nl, "stat"); [Perl_my_stat]
@@ -96,7 +96,7 @@ close "fred" ;
no warnings 'unopened' ;
close "joe" ;
EXPECT
-Close on unopened file <fred> at - line 3.
+close() on unopened filehandle fred at - line 3.
########
# doio.c [Perl_do_tell Perl_do_seek Perl_do_sysseek Perl_my_stat]
use warnings 'io' ;
@@ -105,17 +105,35 @@ tell(STDIN);
$a = seek(STDIN,1,1);
$a = sysseek(STDIN,1,1);
-x STDIN ;
+stat(STDIN) ;
+$a = "fred";
+tell($a);
+seek($a,1,1);
+sysseek($a,1,1);
+-x $a; # ok
+stat($a); # ok
no warnings 'io' ;
close STDIN ;
tell(STDIN);
$a = seek(STDIN,1,1);
$a = sysseek(STDIN,1,1);
-x STDIN ;
+stat(STDIN) ;
+$a = "fred";
+tell($a);
+seek($a,1,1);
+sysseek($a,1,1);
+-x $a;
+stat($a);
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.
+tell() on closed filehandle STDIN at - line 4.
+seek() on closed filehandle STDIN at - line 5.
+sysseek() on closed filehandle STDIN at - line 6.
+-x on closed filehandle STDIN at - line 7.
+stat() on closed filehandle STDIN at - line 8.
+tell() on unopened filehandle at - line 10.
+seek() on unopened filehandle at - line 11.
+sysseek() on unopened filehandle at - line 12.
########
# doio.c [Perl_do_print]
use warnings 'uninitialized' ;
@@ -188,4 +206,4 @@ my $a = eof STDOUT ;
no warnings 'io' ;
$a = eof STDOUT ;
EXPECT
-Filehandle main::STDOUT opened only for output at - line 3.
+Filehandle STDOUT opened only for output at - line 3.
diff --git a/gnu/usr.bin/perl/t/pragma/warn/op b/gnu/usr.bin/perl/t/pragma/warn/op
index 1a79b4ad23c..1f41a98d624 100644
--- a/gnu/usr.bin/perl/t/pragma/warn/op
+++ b/gnu/usr.bin/perl/t/pragma/warn/op
@@ -150,6 +150,17 @@ EXPECT
# op.c
use warnings 'closure' ;
sub x {
+ our $x;
+ sub y {
+ $x
+ }
+ }
+EXPECT
+
+########
+# op.c
+use warnings 'closure' ;
+sub x {
my $x;
sub y {
sub { $x }
@@ -267,7 +278,7 @@ 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 join or string 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.
@@ -558,7 +569,7 @@ 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/ ;
@@ -592,7 +603,6 @@ my $a ; my @a = () ; my %a = () ; my $b = \@a ; my $c = \%a ;
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.
@@ -603,6 +613,7 @@ 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.
+Can't modify private array in substitution (s///) at - line 6, near "s/a/b/ ;"
BEGIN not safe after errors--compilation aborted at - line 18.
########
# op.c
diff --git a/gnu/usr.bin/perl/t/pragma/warn/perl b/gnu/usr.bin/perl/t/pragma/warn/perl
index 45807499d6a..b4a00bac417 100644
--- a/gnu/usr.bin/perl/t/pragma/warn/perl
+++ b/gnu/usr.bin/perl/t/pragma/warn/perl
@@ -54,4 +54,19 @@ Name "main::z" used only once: possible typo at - line 6.
use warnings 'once' ;
$x = 3 ;
EXPECT
+########
+# perl.c
+{ use warnings 'once' ; $x = 3 ; }
+$y = 3 ;
+EXPECT
+Name "main::x" used only once: possible typo at - line 3.
+########
+
+# perl.c
+$z = 3 ;
+BEGIN { $^W = 1 }
+{ no warnings 'once' ; $x = 3 ; }
+$y = 3 ;
+EXPECT
+Name "main::y" used only once: possible typo at - line 6.
diff --git a/gnu/usr.bin/perl/t/pragma/warn/pp_ctl b/gnu/usr.bin/perl/t/pragma/warn/pp_ctl
index 0deccd35e27..ac01f277b1f 100644
--- a/gnu/usr.bin/perl/t/pragma/warn/pp_ctl
+++ b/gnu/usr.bin/perl/t/pragma/warn/pp_ctl
@@ -214,4 +214,17 @@ DESTROY { die "@{$_[0]} foo bar" }
{ bless ['A'], 'Foo' for 1..10 }
{ bless ['B'], 'Foo' for 1..10 }
EXPECT
-
+########
+# pp_ctl.c
+use warnings;
+eval 'print $foo';
+EXPECT
+Use of uninitialized value in print at (eval 1) line 1.
+########
+# pp_ctl.c
+use warnings;
+{
+ no warnings;
+ eval 'print $foo';
+}
+EXPECT
diff --git a/gnu/usr.bin/perl/t/pragma/warn/pp_hot b/gnu/usr.bin/perl/t/pragma/warn/pp_hot
index 275905749ed..698255c064b 100644
--- a/gnu/usr.bin/perl/t/pragma/warn/pp_hot
+++ b/gnu/usr.bin/perl/t/pragma/warn/pp_hot
@@ -1,6 +1,6 @@
pp_hot.c
- Filehandle %s never opened [pp_print]
+ print() on unopened filehandle abc [pp_print]
$f = $a = "abc" ; print $f $a
Filehandle %s opened only for input [pp_print]
@@ -33,6 +33,9 @@
readline() on closed filehandle %s [Perl_do_readline]
close STDIN ; $a = <STDIN>;
+ readline() on closed filehandle %s [Perl_do_readline]
+ readline(NONESUCH);
+
glob failed (child exited with status %d%s) [Perl_do_readline] <<TODO
Deep recursion on subroutine \"%s\" [Perl_sub_crush_depth]
@@ -52,7 +55,7 @@ print $f $a;
no warnings 'unopened' ;
print $f $a;
EXPECT
-Filehandle main::abc never opened at - line 4.
+print() on unopened filehandle abc at - line 4.
########
# pp_hot.c [pp_print]
use warnings 'io' ;
@@ -71,12 +74,12 @@ print getc(FOO);
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.
+Filehandle STDIN opened only for input at - line 3.
+Filehandle STDOUT opened only for output at - line 4.
+Filehandle STDERR opened only for output at - line 5.
+Filehandle FOO opened only for output at - line 6.
+Filehandle STDERR opened only for output at - line 7.
+Filehandle FOO opened only for output at - line 8.
########
# pp_hot.c [pp_print]
use warnings 'closed' ;
@@ -90,9 +93,9 @@ 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?)
+print() on closed filehandle STDIN at - line 4.
+print() on closed filehandle STDIN at - line 6.
+ (Are you trying to call print() on dirhandle STDIN?)
########
# pp_hot.c [pp_rv2av]
use warnings 'uninitialized' ;
@@ -137,9 +140,9 @@ 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?)
+readline() on closed filehandle STDIN at - line 3.
+readline() on closed filehandle STDIN at - line 4.
+ (Are you trying to call readline() on dirhandle STDIN?)
########
# pp_hot.c [Perl_do_readline]
use warnings 'io' ;
@@ -148,9 +151,10 @@ open (FH, ">./xcv") ;
my $a = <FH> ;
no warnings 'io' ;
$a = <FH> ;
+close (FH) ;
unlink $file ;
EXPECT
-Filehandle main::FH opened only for output at - line 5.
+Filehandle FH opened only for output at - line 5.
########
# pp_hot.c [Perl_sub_crush_depth]
use warnings 'recursion' ;
diff --git a/gnu/usr.bin/perl/t/pragma/warn/pp_sys b/gnu/usr.bin/perl/t/pragma/warn/pp_sys
index 7c38727e28e..68518e29f5c 100644
--- a/gnu/usr.bin/perl/t/pragma/warn/pp_sys
+++ b/gnu/usr.bin/perl/t/pragma/warn/pp_sys
@@ -16,7 +16,7 @@
page overflow [pp_leavewrite]
- Filehandle %s never opened [pp_prtf]
+ printf() on unopened filehandle abc [pp_prtf]
$a = "abc"; printf $a "fred"
Filehandle %s opened only for input [pp_prtf]
@@ -69,13 +69,16 @@
getpeername STDIN;
flock() on closed socket %s [pp_flock]
+ flock() on closed socket [pp_flock]
close STDIN;
flock STDIN, 8;
+ flock $a, 8;
warn(warn_nl, "stat"); [pp_stat]
- Test on unopened file <%s>
- close STDIN ; -T STDIN ;
+ -T on closed filehandle %s
+ stat() on closed filehandle %s
+ close STDIN ; -T STDIN ; stat(STDIN) ;
warn(warn_nl, "open"); [pp_fttext]
-T "abc\ndef" ;
@@ -107,7 +110,7 @@ write STDIN;
no warnings 'io' ;
write STDIN;
EXPECT
-Filehandle main::STDIN opened only for input at - line 5.
+Filehandle STDIN opened only for input at - line 5.
########
# pp_sys.c [pp_leavewrite]
use warnings 'closed' ;
@@ -123,9 +126,9 @@ 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?)
+write() on closed filehandle STDIN at - line 6.
+write() on closed filehandle STDIN at - line 8.
+ (Are you trying to call write() on dirhandle STDIN?)
########
# pp_sys.c [pp_leavewrite]
use warnings 'io' ;
@@ -152,7 +155,7 @@ printf $a "fred";
no warnings 'unopened' ;
printf $a "fred";
EXPECT
-Filehandle main::abc never opened at - line 4.
+printf() on unopened filehandle abc at - line 4.
########
# pp_sys.c [pp_prtf]
use warnings 'closed' ;
@@ -166,9 +169,9 @@ 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?)
+printf() on closed filehandle STDIN at - line 4.
+printf() on closed filehandle STDIN at - line 6.
+ (Are you trying to call printf() on dirhandle STDIN?)
########
# pp_sys.c [pp_prtf]
use warnings 'io' ;
@@ -176,7 +179,7 @@ printf STDIN "fred";
no warnings 'io' ;
printf STDIN "fred";
EXPECT
-Filehandle main::STDIN opened only for input at - line 3.
+Filehandle STDIN opened only for input at - line 3.
########
# pp_sys.c [pp_send]
use warnings 'closed' ;
@@ -190,14 +193,16 @@ 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?)
+syswrite() on closed filehandle STDIN at - line 4.
+syswrite() on closed filehandle STDIN at - line 6.
+ (Are you trying to call syswrite() on dirhandle STDIN?)
########
# pp_sys.c [pp_flock]
use Config;
BEGIN {
- if ( $^O eq 'VMS' and ! $Config{d_flock}) {
+ if ( !$Config{d_flock} &&
+ !$Config{d_fcntl_can_lock} &&
+ !$Config{d_lockf} ) {
print <<EOM ;
SKIPPED
# flock not present
@@ -205,19 +210,25 @@ EOM
exit ;
}
}
-use warnings 'closed' ;
+use warnings qw(unopened closed);
close STDIN;
flock STDIN, 8;
opendir STDIN, ".";
flock STDIN, 8;
-no warnings 'closed' ;
+flock FOO, 8;
+flock $a, 8;
+no warnings qw(unopened closed);
flock STDIN, 8;
opendir STDIN, ".";
flock STDIN, 8;
+flock FOO, 8;
+flock $a, 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?)
+flock() on closed filehandle STDIN at - line 16.
+flock() on closed filehandle STDIN at - line 18.
+ (Are you trying to call flock() on dirhandle STDIN?)
+flock() on unopened filehandle FOO at - line 19.
+flock() on unopened filehandle at - line 20.
########
# pp_sys.c [pp_prtf pp_send pp_bind pp_connect pp_listen pp_accept pp_shutdown pp_ssockopt ppp_getpeername]
use warnings 'io' ;
@@ -285,36 +296,36 @@ 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?)
+send() on closed socket STDIN at - line 22.
+bind() on closed socket STDIN at - line 23.
+connect() on closed socket STDIN at - line 24.
+listen() on closed socket STDIN at - line 25.
+accept() on closed socket STDIN at - line 26.
+shutdown() on closed socket STDIN at - line 27.
+setsockopt() on closed socket STDIN at - line 28.
+getsockopt() on closed socket STDIN at - line 29.
+getsockname() on closed socket STDIN at - line 30.
+getpeername() on closed socket STDIN at - line 31.
+send() on closed socket STDIN at - line 33.
+ (Are you trying to call send() on dirhandle STDIN?)
+bind() on closed socket STDIN at - line 34.
+ (Are you trying to call bind() on dirhandle STDIN?)
+connect() on closed socket STDIN at - line 35.
+ (Are you trying to call connect() on dirhandle STDIN?)
+listen() on closed socket STDIN at - line 36.
+ (Are you trying to call listen() on dirhandle STDIN?)
+accept() on closed socket STDIN at - line 37.
+ (Are you trying to call accept() on dirhandle STDIN?)
+shutdown() on closed socket STDIN at - line 38.
+ (Are you trying to call shutdown() on dirhandle STDIN?)
+setsockopt() on closed socket STDIN at - line 39.
+ (Are you trying to call setsockopt() on dirhandle STDIN?)
+getsockopt() on closed socket STDIN at - line 40.
+ (Are you trying to call getsockopt() on dirhandle STDIN?)
+getsockname() on closed socket STDIN at - line 41.
+ (Are you trying to call getsockname() on dirhandle STDIN?)
+getpeername() on closed socket STDIN at - line 42.
+ (Are you trying to call getpeername() on dirhandle STDIN?)
########
# pp_sys.c [pp_stat]
use warnings 'newline' ;
@@ -325,13 +336,22 @@ EXPECT
Unsuccessful stat on filename containing newline at - line 3.
########
# pp_sys.c [pp_fttext]
-use warnings 'unopened' ;
+use warnings qw(unopened closed) ;
close STDIN ;
-T STDIN ;
-no warnings 'unopened' ;
+stat(STDIN) ;
+-T HOCUS;
+stat(POCUS);
+no warnings qw(unopened closed) ;
-T STDIN ;
+stat(STDIN);
+-T HOCUS;
+stat(POCUS);
EXPECT
-Test on unopened file <STDIN> at - line 4.
+-T on closed filehandle STDIN at - line 4.
+stat() on closed filehandle STDIN at - line 5.
+-T on unopened filehandle HOCUS at - line 6.
+stat() on unopened filehandle POCUS at - line 7.
########
# pp_sys.c [pp_fttext]
use warnings 'newline' ;
@@ -343,6 +363,13 @@ Unsuccessful open on filename containing newline at - line 3.
########
# pp_sys.c [pp_sysread]
use warnings 'io' ;
+if ($^O eq 'dos') {
+ print <<EOM ;
+SKIPPED
+# skipped on dos
+EOM
+ exit ;
+}
my $file = "./xcv" ;
open(F, ">$file") ;
my $a = sysread(F, $a,10) ;
@@ -351,4 +378,4 @@ my $a = sysread(F, $a,10) ;
close F ;
unlink $file ;
EXPECT
-Filehandle main::F opened only for output at - line 5.
+Filehandle F opened only for output at - line 12.
diff --git a/gnu/usr.bin/perl/t/pragma/warn/regcomp b/gnu/usr.bin/perl/t/pragma/warn/regcomp
index 5d0c291ea04..8b86b5082fb 100644
--- a/gnu/usr.bin/perl/t/pragma/warn/regcomp
+++ b/gnu/usr.bin/perl/t/pragma/warn/regcomp
@@ -11,10 +11,6 @@
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]
@@ -33,7 +29,7 @@ $a =~ /(?=a)*/ ;
no warnings 'regexp' ;
$a =~ /(?=a)*/ ;
EXPECT
-(?=a)* matches null string many times at - line 4.
+(?=a)* matches null string many times before HERE mark in regex m/(?=a)* << HERE / at - line 4.
########
# regcomp.c [S_study_chunk]
use warnings 'regexp' ;
@@ -42,7 +38,7 @@ $_ = "" ;
no warnings 'regexp' ;
/(?=a)?/;
EXPECT
-Strange *+?{} on zero-length expression at - line 4.
+Quantifier unexpected on zero-length expression before HERE mark in regex m/(?=a)? << HERE / at - line 4.
########
# regcomp.c [S_regatom]
$x = '\m' ;
@@ -51,39 +47,44 @@ $a =~ /a$x/ ;
no warnings 'regexp' ;
$a =~ /a$x/ ;
EXPECT
-/a\m/: Unrecognized escape \m passed through at - line 4.
+Unrecognized escape \m passed through before HERE mark in regex m/a\m << HERE / 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:]/;
+/[[: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.
+POSIX syntax [: :] belongs inside character classes before HERE mark in regex m/[:alpha:] << HERE / at - line 5.
+POSIX syntax [: :] belongs inside character classes before HERE mark in regex m/[:zog:] << HERE / at - line 6.
+POSIX class [:zog:] unknown before HERE mark in regex m/[[:zog:] << HERE ]/
+########
+# regcomp.c [S_checkposixcc]
+#
+use warnings 'regexp' ;
+$_ = "" ;
+/[.zog.]/;
+no warnings 'regexp' ;
+/[.zog.]/;
+EXPECT
+POSIX syntax [. .] belongs inside character classes before HERE mark in regex m/[.zog.] << HERE / at - line 5.
+POSIX syntax [. .] is reserved for future extensions before HERE mark in regex m/[.zog.] << HERE /
+########
+# regcomp.c [S_checkposixcc]
+#
+use warnings 'regexp' ;
+$_ = "" ;
+/[[.zog.]]/;
+no warnings 'regexp' ;
+/[[.zog.]]/;
+EXPECT
+POSIX syntax [. .] is reserved for future extensions before HERE mark in regex m/[[.zog.] << HERE ]/
########
# regcomp.c [S_regclass]
$_ = "";
@@ -108,14 +109,14 @@ no warnings 'regexp' ;
/[[: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.
+False [] range "a-\d" before HERE mark in regex m/[a-\d << HERE ]/ at - line 5.
+False [] range "\d-" before HERE mark in regex m/[\d- << HERE b]/ at - line 6.
+False [] range "\s-" before HERE mark in regex m/[\s- << HERE \d]/ at - line 7.
+False [] range "\d-" before HERE mark in regex m/[\d- << HERE \s]/ at - line 8.
+False [] range "a-[:digit:]" before HERE mark in regex m/[a-[:digit:] << HERE ]/ at - line 9.
+False [] range "[:digit:]-" before HERE mark in regex m/[[:digit:]- << HERE b]/ at - line 10.
+False [] range "[:alpha:]-" before HERE mark in regex m/[[:alpha:]- << HERE [:digit:]]/ at - line 11.
+False [] range "[:digit:]-" before HERE mark in regex m/[[:digit:]- << HERE [:alpha:]]/ at - line 12.
########
# regcomp.c [S_regclassutf8]
BEGIN {
@@ -147,14 +148,14 @@ no warnings 'regexp' ;
/[[: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.
+False [] range "a-\d" before HERE mark in regex m/[a-\d << HERE ]/ at - line 12.
+False [] range "\d-" before HERE mark in regex m/[\d- << HERE b]/ at - line 13.
+False [] range "\s-" before HERE mark in regex m/[\s- << HERE \d]/ at - line 14.
+False [] range "\d-" before HERE mark in regex m/[\d- << HERE \s]/ at - line 15.
+False [] range "a-[:digit:]" before HERE mark in regex m/[a-[:digit:] << HERE ]/ at - line 16.
+False [] range "[:digit:]-" before HERE mark in regex m/[[:digit:]- << HERE b]/ at - line 17.
+False [] range "[:alpha:]-" before HERE mark in regex m/[[:alpha:]- << HERE [:digit:]]/ at - line 18.
+False [] range "[:digit:]-" before HERE mark in regex m/[[:digit:]- << HERE [:alpha:]]/ at - line 19.
########
# regcomp.c [S_regclass S_regclassutf8]
use warnings 'regexp' ;
@@ -162,4 +163,5 @@ $a =~ /[a\zb]/ ;
no warnings 'regexp' ;
$a =~ /[a\zb]/ ;
EXPECT
-/[a\zb]/: Unrecognized escape \z in character class passed through at - line 3.
+Unrecognized escape \z in character class passed through before HERE mark in regex m/[a\z << HERE b]/ at - line 3.
+
diff --git a/gnu/usr.bin/perl/t/pragma/warn/sv b/gnu/usr.bin/perl/t/pragma/warn/sv
index 758137f2e8d..2409589a8f2 100644
--- a/gnu/usr.bin/perl/t/pragma/warn/sv
+++ b/gnu/usr.bin/perl/t/pragma/warn/sv
@@ -178,7 +178,7 @@ no warnings 'uninitialized' ;
$C = "" ;
$C .= $A ;
EXPECT
-Use of uninitialized value in concatenation (.) at - line 10.
+Use of uninitialized value in concatenation (.) or string at - line 10.
########
# sv.c
use warnings 'numeric' ;
diff --git a/gnu/usr.bin/perl/t/pragma/warn/toke b/gnu/usr.bin/perl/t/pragma/warn/toke
index cfdea78d3c3..fa7132960cf 100644
--- a/gnu/usr.bin/perl/t/pragma/warn/toke
+++ b/gnu/usr.bin/perl/t/pragma/warn/toke
@@ -198,10 +198,6 @@ 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 ;
@@ -214,25 +210,21 @@ $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;
-}
+Reversed += operator at - line 3.
+Reversed -= operator at - line 4.
+Reversed *= operator at - line 5.
+Reversed %= operator at - line 6.
+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.
+syntax error at - line 8, near "=."
+syntax error at - line 9, near "=^"
+syntax error at - line 10, near "=|"
+Unterminated <> operator at - line 11.
+########
+# toke.c
no warnings 'syntax' ;
my $a =+ 2 ;
$a =- 2 ;
@@ -245,10 +237,10 @@ $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.
+syntax error at - line 8, near "=."
+syntax error at - line 9, near "=^"
+syntax error at - line 10, near "=|"
+Unterminated <> operator at - line 11.
########
# toke.c
use warnings 'syntax' ;
@@ -290,6 +282,9 @@ Can't use \1 to mean $1 in expression at - line 4.
# toke.c
use warnings 'reserved' ;
$a = abc;
+$a = { def
+
+=> 1 };
no warnings 'reserved' ;
$a = abc;
EXPECT
@@ -434,13 +429,14 @@ Ambiguous call resolved as CORE::time(), qualify as such or use & at - line 4.
# toke.c
use warnings ;
eval <<'EOE';
+# line 30 "foo"
+warn "yelp";
{
-#line 30 "foo"
$_ = " \x{123} " ;
}
EOE
EXPECT
-
+yelp at foo line 30.
########
# toke.c
my $a = rand + 4 ;
@@ -581,3 +577,11 @@ 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.
+########
+# toke.c
+use warnings 'ambiguous';
+"@mjd_previously_unused_array";
+no warnings 'ambiguous';
+"@mjd_previously_unused_array";
+EXPECT
+Possible unintended interpolation of @mjd_previously_unused_array in string at - line 3.
diff --git a/gnu/usr.bin/perl/t/pragma/warn/utf8 b/gnu/usr.bin/perl/t/pragma/warn/utf8
index 6a2fe5446c3..9a7dbafdee8 100644
--- a/gnu/usr.bin/perl/t/pragma/warn/utf8
+++ b/gnu/usr.bin/perl/t/pragma/warn/utf8
@@ -15,6 +15,12 @@
__END__
# utf8.c [utf8_to_uv] -W
+BEGIN {
+ if (ord('A') == 193) {
+ print "SKIPPED\n# ebcdic platforms do not generate Malformed UTF-8 warnings.";
+ exit 0;
+ }
+}
use utf8 ;
my $a = "snøstorm" ;
{
@@ -24,6 +30,6 @@ my $a = "snøstorm" ;
my $a = "snøstorm";
}
EXPECT
-Malformed UTF-8 character at - line 3.
-Malformed UTF-8 character at - line 8.
+Malformed UTF-8 character (unexpected non-continuation byte 0x73 after start byte 0xf8) at - line 9.
+Malformed UTF-8 character (unexpected non-continuation byte 0x73 after start byte 0xf8) at - line 14.
########
diff --git a/gnu/usr.bin/perl/t/pragma/warnings.t b/gnu/usr.bin/perl/t/pragma/warnings.t
index 71fb0df972e..66b4ff91607 100644
--- a/gnu/usr.bin/perl/t/pragma/warnings.t
+++ b/gnu/usr.bin/perl/t/pragma/warnings.t
@@ -2,7 +2,7 @@
BEGIN {
chdir 't' if -d 't';
- unshift @INC, '../lib';
+ @INC = '../lib';
$ENV{PERL5LIB} = '../lib';
require Config; import Config;
}
@@ -26,9 +26,7 @@ else
foreach (@w_files) {
- next if /\.orig$/ ;
-
- next if /(~|\.orig)$/;
+ next if /(~|\.orig|,v)$/;
open F, "<$_" or die "Cannot open $_: $!\n" ;
while (<F>) {
diff --git a/gnu/usr.bin/perl/t/run/runenv.t b/gnu/usr.bin/perl/t/run/runenv.t
new file mode 100644
index 00000000000..a59ad26f35c
--- /dev/null
+++ b/gnu/usr.bin/perl/t/run/runenv.t
@@ -0,0 +1,147 @@
+#!./perl
+#
+# Tests for Perl run-time environment variable settings
+#
+# $PERL5OPT, $PERL5LIB, etc.
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '../lib';
+ require Config; import Config;
+ unless ($Config{'d_fork'}) {
+ print "1..0 # Skip: no fork\n";
+ exit 0;
+ }
+}
+
+my $STDOUT = './results-0';
+my $STDERR = './results-1';
+my $PERL = './perl';
+my $FAILURE_CODE = 119;
+
+print "1..9\n";
+
+# Run perl with specified environment and arguments returns a list.
+# First element is true iff Perl's stdout and stderr match the
+# supplied $stdout and $stderr argument strings exactly.
+# second element is an explanation of the failure
+sub runperl {
+ local *F;
+ my ($env, $args, $stdout, $stderr) = @_;
+
+ unshift @$args, '-I../lib';
+
+ $stdout = '' unless defined $stdout;
+ $stderr = '' unless defined $stderr;
+ my $pid = fork;
+ return (0, "Couldn't fork: $!") unless defined $pid; # failure
+ if ($pid) { # parent
+ my ($actual_stdout, $actual_stderr);
+ wait;
+ return (0, "Failure in child.\n") if ($?>>8) == $FAILURE_CODE;
+
+ open F, "< $STDOUT" or return (0, "Couldn't read $STDOUT file");
+ { local $/; $actual_stdout = <F> }
+ open F, "< $STDERR" or return (0, "Couldn't read $STDERR file");
+ { local $/; $actual_stderr = <F> }
+
+ if ($actual_stdout ne $stdout) {
+ return (0, "Stdout mismatch: expected [$stdout], saw [$actual_stdout]");
+ } elsif ($actual_stderr ne $stderr) {
+ return (0, "Stderr mismatch: expected [$stderr], saw [$actual_stderr]");
+ } else {
+ return 1; # success
+ }
+ } else { # child
+ for my $k (keys %$env) {
+ $ENV{$k} = $env->{$k};
+ }
+ open STDOUT, "> $STDOUT" or exit $FAILURE_CODE;
+ open STDERR, "> $STDERR" or it_didnt_work();
+ { exec $PERL, @$args }
+ it_didnt_work();
+ }
+}
+
+
+sub it_didnt_work {
+ print STDOUT "IWHCWJIHCI\cNHJWCJQWKJQJWCQW\n";
+ exit $FAILURE_CODE;
+}
+
+sub try {
+ my $testno = shift;
+ my ($success, $reason) = runperl(@_);
+ if ($success) {
+ print "ok $testno\n";
+ } else {
+ $reason =~ s/\n/\\n/g;
+ print "not ok $testno # $reason\n";
+ }
+}
+
+# PERL5OPT Command-line options (switches). Switches in
+# this variable are taken as if they were on
+# every Perl command line. Only the -[DIMUdmw]
+# switches are allowed. When running taint
+# checks (because the program was running setuid
+# or setgid, or the -T switch was used), this
+# variable is ignored. If PERL5OPT begins with
+# -T, tainting will be enabled, and any
+# subsequent options ignored.
+
+my $T = 1;
+try($T++, {PERL5OPT => '-w'}, ['-e', 'print $::x'],
+ "",
+ qq{Name "main::x" used only once: possible typo at -e line 1.\nUse of uninitialized value in print at -e line 1.\n});
+
+try($T++, {PERL5OPT => '-Mstrict'}, ['-e', 'print $::x'],
+ "", "");
+
+try($T++, {PERL5OPT => '-Mstrict'}, ['-e', 'print $x'],
+ "",
+ qq{Global symbol "\$x" requires explicit package name at -e line 1.\nExecution of -e aborted due to compilation errors.\n});
+
+# Fails in 5.6.0
+try($T++, {PERL5OPT => '-Mstrict -w'}, ['-e', 'print $x'],
+ "",
+ qq{Global symbol "\$x" requires explicit package name at -e line 1.\nExecution of -e aborted due to compilation errors.\n});
+
+# Fails in 5.6.0
+try($T++, {PERL5OPT => '-w -Mstrict'}, ['-e', 'print $::x'],
+ "",
+ <<ERROR
+Name "main::x" used only once: possible typo at -e line 1.
+Use of uninitialized value in print at -e line 1.
+ERROR
+ );
+
+# Fails in 5.6.0
+try($T++, {PERL5OPT => '-w -Mstrict'}, ['-e', 'print $::x'],
+ "",
+ <<ERROR
+Name "main::x" used only once: possible typo at -e line 1.
+Use of uninitialized value in print at -e line 1.
+ERROR
+ );
+
+try($T++, {PERL5OPT => '-MExporter'}, ['-e0'],
+ "",
+ "");
+
+# Fails in 5.6.0
+try($T++, {PERL5OPT => '-MExporter -MExporter'}, ['-e0'],
+ "",
+ "");
+
+try($T++, {PERL5OPT => '-Mstrict -Mwarnings'},
+ ['-e', 'print "ok" if $INC{"strict.pm"} and $INC{"warnings.pm"}'],
+ "ok",
+ "");
+
+print "# ", $T-1, " tests total.\n";
+
+END {
+ 1 while unlink $STDOUT;
+ 1 while unlink $STDERR;
+}
diff --git a/gnu/usr.bin/perl/thrdvar.h b/gnu/usr.bin/perl/thrdvar.h
index e4cfacc06ca..042912dd355 100644
--- a/gnu/usr.bin/perl/thrdvar.h
+++ b/gnu/usr.bin/perl/thrdvar.h
@@ -82,6 +82,23 @@ PERLVAR(Ttimesbuf, struct tms)
PERLVAR(Ttainted, bool) /* using variables controlled by $< */
PERLVAR(Tcurpm, PMOP *) /* what to do \ interps in REs from */
PERLVAR(Tnrs, SV *)
+
+/*
+=for apidoc mn|SV*|PL_rs
+
+The input record separator - C<$/> in Perl space.
+
+=for apidoc mn|GV*|PL_last_in_gv
+
+The GV which was last used for a filehandle input operation. (C<< <FH> >>)
+
+=for apidoc mn|SV*|PL_ofs_sv
+
+The output field separator - C<$,> in Perl space.
+
+=cut
+*/
+
PERLVAR(Trs, SV *) /* input record separator $/ */
PERLVAR(Tlast_in_gv, GV *) /* GV used in last <FH> */
PERLVAR(Tofs, char *) /* output field separator $, */
diff --git a/gnu/usr.bin/perl/thread.h b/gnu/usr.bin/perl/thread.h
index 0ea9e74544b..1b12978dd8c 100644
--- a/gnu/usr.bin/perl/thread.h
+++ b/gnu/usr.bin/perl/thread.h
@@ -32,13 +32,24 @@
# define pthread_mutexattr_init(a) pthread_mutexattr_create(a)
# define pthread_mutexattr_settype(a,t) pthread_mutexattr_setkind_np(a,t)
# endif
+# if defined(__hpux) && defined(__ux_version) && __ux_version <= 1020
+# define pthread_attr_init(a) pthread_attr_create(a)
+ /* XXX pthread_setdetach_np() missing in DCE threads on HP-UX 10.20 */
+# define PTHREAD_ATTR_SETDETACHSTATE(a,s) (0)
+# 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
+# if !defined(__hpux) || !defined(__ux_version) || __ux_version > 1020
# define pthread_mutexattr_default NULL
# define pthread_condattr_default NULL
+# endif
#endif
#ifndef PTHREAD_CREATE
@@ -117,6 +128,7 @@
#define INIT_THREADS cthread_init()
#define YIELD cthread_yield()
#define ALLOC_THREAD_KEY NOOP
+#define FREE_THREAD_KEY NOOP
#define SET_THREAD_SELF(thr) (thr->self = cthread_self())
#endif /* I_MACH_CTHREADS */
@@ -251,12 +263,19 @@
# define ALLOC_THREAD_KEY \
STMT_START { \
if (pthread_key_create(&PL_thr_key, 0)) { \
- fprintf(stderr, "panic: pthread_key_create"); \
+ PerlIO_printf(PerlIO_stderr(), "panic: pthread_key_create"); \
exit(1); \
} \
} STMT_END
#endif
+#ifndef FREE_THREAD_KEY
+# define FREE_THREAD_KEY \
+ STMT_START { \
+ pthread_key_delete(PL_thr_key); \
+ } STMT_END
+#endif
+
#ifndef THREAD_RET_TYPE
# define THREAD_RET_TYPE void *
# define THREAD_RET_CAST(p) ((void *)(p))
@@ -280,7 +299,10 @@
# 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)
-
+# define LOCK_FDPID_MUTEX MUTEX_LOCK(&PL_fdpid_mutex)
+# define UNLOCK_FDPID_MUTEX MUTEX_UNLOCK(&PL_fdpid_mutex)
+# define LOCK_SV_LOCK_MUTEX MUTEX_LOCK(&PL_sv_lock_mutex)
+# define UNLOCK_SV_LOCK_MUTEX MUTEX_UNLOCK(&PL_sv_lock_mutex)
/* Values and macros for thr->flags */
#define THRf_STATE_MASK 7
@@ -376,6 +398,22 @@ typedef struct condpair {
# define UNLOCK_CRED_MUTEX
#endif
+#ifndef LOCK_FDPID_MUTEX
+# define LOCK_FDPID_MUTEX
+#endif
+
+#ifndef UNLOCK_FDPID_MUTEX
+# define UNLOCK_FDPID_MUTEX
+#endif
+
+#ifndef LOCK_SV_LOCK_MUTEX
+# define LOCK_SV_LOCK_MUTEX
+#endif
+
+#ifndef UNLOCK_SV_LOCK_MUTEX
+# define UNLOCK_SV_LOCK_MUTEX
+#endif
+
/* THR, SET_THR, and dTHR are there for compatibility with old versions */
#ifndef THR
# define THR PERL_GET_THX
diff --git a/gnu/usr.bin/perl/utf8.c b/gnu/usr.bin/perl/utf8.c
index 223f5ac6340..077d36df172 100644
--- a/gnu/usr.bin/perl/utf8.c
+++ b/gnu/usr.bin/perl/utf8.c
@@ -1,6 +1,6 @@
/* utf8.c
*
- * Copyright (c) 1998-2000, Larry Wall
+ * Copyright (c) 1998-2001, 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.
@@ -26,6 +26,23 @@
/* Unicode support */
+/*
+=for apidoc A|U8*|uv_to_utf8|U8 *d|UV uv
+
+Adds the UTF8 representation of the Unicode codepoint C<uv> to the end
+of the string C<d>; C<d> should be have at least C<UTF8_MAXLEN+1> free
+bytes available. The return value is the pointer to the byte after the
+end of the new character. In other words,
+
+ d = uv_to_utf8(d, uv);
+
+is the recommended Unicode-aware way of saying
+
+ *(d++) = uv;
+
+=cut
+*/
+
U8 *
Perl_uv_to_utf8(pTHX_ U8 *d, UV uv)
{
@@ -69,7 +86,7 @@ Perl_uv_to_utf8(pTHX_ U8 *d, UV uv)
return d;
}
#ifdef HAS_QUAD
- if (uv < 0x1000000000LL)
+ if (uv < UTF8_QUAD_MAX)
#endif
{
*d++ = 0xfe; /* Can't match U+FEFF! */
@@ -101,111 +118,415 @@ Perl_uv_to_utf8(pTHX_ U8 *d, UV uv)
#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
+/*
+=for apidoc A|STRLEN|is_utf8_char|U8 *s
+
+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.
+
+=cut
+*/
+STRLEN
Perl_is_utf8_char(pTHX_ U8 *s)
{
U8 u = *s;
- int slen, len;
+ STRLEN slen, len;
+ UV uv, ouv;
- if (!(u & 0x80))
+ if (UTF8_IS_ASCII(u))
return 1;
- if (!(u & 0x40))
+ if (!UTF8_IS_START(u))
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! */
+ len = UTF8SKIP(s);
+
+ if (len < 2 || !UTF8_IS_CONTINUATION(s[1]))
+ return 0;
slen = len - 1;
s++;
+ uv = u;
+ ouv = uv;
while (slen--) {
- if ((*s & 0xc0) != 0x80)
+ if (!UTF8_IS_CONTINUATION(*s))
return 0;
+ uv = UTF8_ACCUMULATE(uv, *s);
+ if (uv < ouv)
+ return 0;
+ ouv = uv;
s++;
}
+
+ if (UNISKIP(uv) < len)
+ return 0;
+
return len;
}
+/*
+=for apidoc A|bool|is_utf8_string|U8 *s|STRLEN len
+
+Returns true if first C<len> bytes of the given string form valid a UTF8
+string, false otherwise.
+
+=cut
+*/
+
+bool
+Perl_is_utf8_string(pTHX_ U8 *s, STRLEN len)
+{
+ U8* x = s;
+ U8* send;
+ STRLEN c;
+
+ if (!len)
+ len = strlen((char *)s);
+ send = s + len;
+
+ while (x < send) {
+ c = is_utf8_char(x);
+ if (!c)
+ return FALSE;
+ x += c;
+ }
+ if (x != send)
+ return FALSE;
+
+ return TRUE;
+}
+
+/*
+=for apidoc A|U8* s|utf8_to_uv|STRLEN curlen|STRLEN *retlen|U32 flags
+
+Returns the character value of the first character in the string C<s>
+which is assumed to be in UTF8 encoding and no longer than C<curlen>;
+C<retlen> will be set to the length, in bytes, of that character.
+
+If C<s> does not point to a well-formed UTF8 character, the behaviour
+is dependent on the value of C<flags>: if it contains UTF8_CHECK_ONLY,
+it is assumed that the caller will raise a warning, and this function
+will silently just set C<retlen> to C<-1> and return zero. If the
+C<flags> does not contain UTF8_CHECK_ONLY, warnings about
+malformations will be given, C<retlen> will be set to the expected
+length of the UTF-8 character in bytes, and zero will be returned.
+
+The C<flags> can also contain various flags to allow deviations from
+the strict UTF-8 encoding (see F<utf8.h>).
+
+=cut */
+
UV
-Perl_utf8_to_uv(pTHX_ U8* s, I32* retlen)
+Perl_utf8_to_uv(pTHX_ U8* s, STRLEN curlen, STRLEN* retlen, U32 flags)
{
- UV uv = *s;
- int len;
- if (!(uv & 0x80)) {
- if (retlen)
- *retlen = 1;
- return *s;
+ UV uv = *s, ouv;
+ STRLEN len = 1;
+#ifdef EBCDIC
+ bool dowarn = 0;
+#else
+ bool dowarn = ckWARN_d(WARN_UTF8);
+#endif
+ STRLEN expectlen = 0;
+ U32 warning = 0;
+
+/* This list is a superset of the UTF8_ALLOW_XXX. */
+
+#define UTF8_WARN_EMPTY 1
+#define UTF8_WARN_CONTINUATION 2
+#define UTF8_WARN_NON_CONTINUATION 3
+#define UTF8_WARN_FE_FF 4
+#define UTF8_WARN_SHORT 5
+#define UTF8_WARN_OVERFLOW 6
+#define UTF8_WARN_SURROGATE 7
+#define UTF8_WARN_BOM 8
+#define UTF8_WARN_LONG 9
+#define UTF8_WARN_FFFF 10
+
+ if (curlen == 0 &&
+ !(flags & UTF8_ALLOW_EMPTY)) {
+ warning = UTF8_WARN_EMPTY;
+ goto malformed;
}
- if (!(uv & 0x40)) {
- dTHR;
- if (ckWARN_d(WARN_UTF8))
- Perl_warner(aTHX_ WARN_UTF8, "Malformed UTF-8 character");
+
+ if (UTF8_IS_ASCII(uv)) {
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 (UTF8_IS_CONTINUATION(uv) &&
+ !(flags & UTF8_ALLOW_CONTINUATION)) {
+ warning = UTF8_WARN_CONTINUATION;
+ goto malformed;
+ }
+ if (UTF8_IS_START(uv) && curlen > 1 && !UTF8_IS_CONTINUATION(s[1]) &&
+ !(flags & UTF8_ALLOW_NON_CONTINUATION)) {
+ warning = UTF8_WARN_NON_CONTINUATION;
+ goto malformed;
+ }
+
+ if ((uv == 0xfe || uv == 0xff) &&
+ !(flags & UTF8_ALLOW_FE_FF)) {
+ warning = UTF8_WARN_FE_FF;
+ goto malformed;
+ }
+
+ 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;
+
+ expectlen = len;
+
+ if ((curlen < expectlen) &&
+ !(flags & UTF8_ALLOW_SHORT)) {
+ warning = UTF8_WARN_SHORT;
+ goto malformed;
+ }
+
+ len--;
s++;
+ ouv = uv;
+
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;
+ if (!UTF8_IS_CONTINUATION(*s) &&
+ !(flags & UTF8_ALLOW_NON_CONTINUATION)) {
+ s--;
+ warning = UTF8_WARN_NON_CONTINUATION;
+ goto malformed;
}
else
- uv = (uv << 6) | (*s++ & 0x3f);
+ uv = UTF8_ACCUMULATE(uv, *s);
+ if (!(uv > ouv)) {
+ /* These cannot be allowed. */
+ if (uv == ouv) {
+ if (!(flags & UTF8_ALLOW_LONG)) {
+ warning = UTF8_WARN_LONG;
+ goto malformed;
+ }
+ }
+ else { /* uv < ouv */
+ /* This cannot be allowed. */
+ warning = UTF8_WARN_OVERFLOW;
+ goto malformed;
+ }
+ }
+ s++;
+ ouv = uv;
}
+
+ if (UNICODE_IS_SURROGATE(uv) &&
+ !(flags & UTF8_ALLOW_SURROGATE)) {
+ warning = UTF8_WARN_SURROGATE;
+ goto malformed;
+ } else if (UNICODE_IS_BYTE_ORDER_MARK(uv) &&
+ !(flags & UTF8_ALLOW_BOM)) {
+ warning = UTF8_WARN_BOM;
+ goto malformed;
+ } else if ((expectlen > UNISKIP(uv)) &&
+ !(flags & UTF8_ALLOW_LONG)) {
+ warning = UTF8_WARN_LONG;
+ goto malformed;
+ } else if (UNICODE_IS_ILLEGAL(uv) &&
+ !(flags & UTF8_ALLOW_FFFF)) {
+ warning = UTF8_WARN_FFFF;
+ goto malformed;
+ }
+
return uv;
+
+malformed:
+
+ if (flags & UTF8_CHECK_ONLY) {
+ if (retlen)
+ *retlen = -1;
+ return 0;
+ }
+
+ if (dowarn) {
+ SV* sv = sv_2mortal(newSVpv("Malformed UTF-8 character ", 0));
+
+ switch (warning) {
+ case 0: /* Intentionally empty. */ break;
+ case UTF8_WARN_EMPTY:
+ Perl_sv_catpvf(aTHX_ sv, "(empty string)");
+ break;
+ case UTF8_WARN_CONTINUATION:
+ Perl_sv_catpvf(aTHX_ sv, "(unexpected continuation byte 0x%02"UVxf")", uv);
+ break;
+ case UTF8_WARN_NON_CONTINUATION:
+ Perl_sv_catpvf(aTHX_ sv, "(unexpected non-continuation byte 0x%02"UVxf" after start byte 0x%02"UVxf")",
+ (UV)s[1], uv);
+ break;
+ case UTF8_WARN_FE_FF:
+ Perl_sv_catpvf(aTHX_ sv, "(byte 0x%02"UVxf")", uv);
+ break;
+ case UTF8_WARN_SHORT:
+ Perl_sv_catpvf(aTHX_ sv, "(%d byte%s, need %d)",
+ curlen, curlen == 1 ? "" : "s", expectlen);
+ break;
+ case UTF8_WARN_OVERFLOW:
+ Perl_sv_catpvf(aTHX_ sv, "(overflow at 0x%"UVxf", byte 0x%02x)",
+ ouv, *s);
+ break;
+ case UTF8_WARN_SURROGATE:
+ Perl_sv_catpvf(aTHX_ sv, "(UTF-16 surrogate 0x%04"UVxf")", uv);
+ break;
+ case UTF8_WARN_BOM:
+ Perl_sv_catpvf(aTHX_ sv, "(byte order mark 0x%04"UVxf")", uv);
+ break;
+ case UTF8_WARN_LONG:
+ Perl_sv_catpvf(aTHX_ sv, "(%d byte%s, need %d)",
+ expectlen, expectlen == 1 ? "": "s", UNISKIP(uv));
+ break;
+ case UTF8_WARN_FFFF:
+ Perl_sv_catpvf(aTHX_ sv, "(character 0x%04"UVxf")", uv);
+ break;
+ default:
+ Perl_sv_catpvf(aTHX_ sv, "(unknown reason)");
+ break;
+ }
+
+ if (warning) {
+ char *s = SvPVX(sv);
+
+ if (PL_op)
+ Perl_warner(aTHX_ WARN_UTF8,
+ "%s in %s", s, PL_op_desc[PL_op->op_type]);
+ else
+ Perl_warner(aTHX_ WARN_UTF8, "%s", s);
+ }
+ }
+
+ if (retlen)
+ *retlen = expectlen ? expectlen : len;
+
+ return 0;
}
-/* utf8_distance(a,b) is intended to be a - b in pointer arithmetic */
+/*
+=for apidoc A|U8* s|utf8_to_uv_simple|STRLEN *retlen
+
+Returns the character value of the first character in the string C<s>
+which is assumed to be in UTF8 encoding; C<retlen> will be set to the
+length, in bytes, of that character.
+
+If C<s> does not point to a well-formed UTF8 character, zero is
+returned and retlen is set, if possible, to -1.
+
+=cut
+*/
+
+UV
+Perl_utf8_to_uv_simple(pTHX_ U8* s, STRLEN* retlen)
+{
+ return Perl_utf8_to_uv(aTHX_ s, UTF8_MAXLEN, retlen, 0);
+}
-I32
+/*
+=for apidoc A|STRLEN|utf8_length|U8* s|U8 *e
+
+Return the length of the UTF-8 char encoded string C<s> in characters.
+Stops at C<e> (inclusive). If C<e E<lt> s> or if the scan would end
+up past C<e>, croaks.
+
+=cut
+*/
+
+STRLEN
+Perl_utf8_length(pTHX_ U8* s, U8* e)
+{
+ STRLEN len = 0;
+
+ /* Note: cannot use UTF8_IS_...() too eagerly here since e.g.
+ * the bitops (especially ~) can create illegal UTF-8.
+ * In other words: in Perl UTF-8 is not just for Unicode. */
+
+ if (e < s)
+ Perl_croak(aTHX_ "panic: utf8_length: unexpected end");
+ while (s < e) {
+ U8 t = UTF8SKIP(s);
+
+ if (e - s < t)
+ Perl_croak(aTHX_ "panic: utf8_length: unaligned end");
+ s += t;
+ len++;
+ }
+
+ return len;
+}
+
+/*
+=for apidoc A|IV|utf8_distance|U8 *a|U8 *b
+
+Returns the number of UTF8 characters between the UTF-8 pointers C<a>
+and C<b>.
+
+WARNING: use only if you *know* that the pointers point inside the
+same UTF-8 buffer.
+
+=cut */
+
+IV
Perl_utf8_distance(pTHX_ U8 *a, U8 *b)
{
- I32 off = 0;
+ IV off = 0;
+
+ /* Note: cannot use UTF8_IS_...() too eagerly here since e.g.
+ * the bitops (especially ~) can create illegal UTF-8.
+ * In other words: in Perl UTF-8 is not just for Unicode. */
+
if (a < b) {
while (a < b) {
- a += UTF8SKIP(a);
+ U8 c = UTF8SKIP(a);
+
+ if (b - a < c)
+ Perl_croak(aTHX_ "panic: utf8_distance: unaligned end");
+ a += c;
off--;
}
}
else {
while (b < a) {
- b += UTF8SKIP(b);
+ U8 c = UTF8SKIP(b);
+
+ if (a - b < c)
+ Perl_croak(aTHX_ "panic: utf8_distance: unaligned end");
+ b += c;
off++;
}
}
+
return off;
}
-/* WARNING: do not use the following unless you *know* off is within bounds */
+/*
+=for apidoc A|U8*|utf8_hop|U8 *s|I32 off
+
+Return the UTF-8 pointer C<s> displaced by C<off> characters, either
+forward or backward.
+
+WARNING: do not use the following unless you *know* C<off> is within
+the UTF-8 data pointed to by C<s> *and* that on entry C<s> is aligned
+on the first byte of character or just after the last byte of a character.
+
+=cut */
U8 *
Perl_utf8_hop(pTHX_ U8 *s, I32 off)
{
+ /* Note: cannot use UTF8_IS_...() too eagerly here since e.g
+ * the bitops (especially ~) can create illegal UTF-8.
+ * In other words: in Perl UTF-8 is not just for Unicode. */
+
if (off >= 0) {
while (off--)
s += UTF8SKIP(s);
@@ -213,28 +534,169 @@ Perl_utf8_hop(pTHX_ U8 *s, I32 off)
else {
while (off++) {
s--;
- if (*s & 0x80) {
- while ((*s & 0xc0) == 0x80)
- s--;
- }
+ while (UTF8_IS_CONTINUATION(*s))
+ s--;
}
}
return s;
}
-/* XXX NOTHING CALLS THE FOLLOWING TWO ROUTINES YET!!! */
/*
- * Convert native or reversed UTF-16 to UTF-8.
+=for apidoc A|U8 *|utf8_to_bytes|U8 *s|STRLEN *len
+
+Converts a string C<s> of length C<len> from UTF8 into byte encoding.
+Unlike C<bytes_to_utf8>, this over-writes the original string, and
+updates len to contain the new length.
+Returns zero on failure, setting C<len> to -1.
+
+=cut
+*/
+
+U8 *
+Perl_utf8_to_bytes(pTHX_ U8* s, STRLEN *len)
+{
+ U8 *send;
+ U8 *d;
+ U8 *save = s;
+
+ /* ensure valid UTF8 and chars < 256 before updating string */
+ for (send = s + *len; s < send; ) {
+ U8 c = *s++;
+
+ if (c >= 0x80 &&
+ ((s >= send) ||
+ ((*s++ & 0xc0) != 0x80) || ((c & 0xfe) != 0xc2))) {
+ *len = -1;
+ return 0;
+ }
+ }
+
+ d = s = save;
+ while (s < send) {
+ if (UTF8_IS_ASCII(*s)) {
+ *d++ = *s++;
+ }
+ else {
+ STRLEN ulen;
+ *d++ = (U8)utf8_to_uv_simple(s, &ulen);
+ s += ulen;
+ }
+ }
+ *d = '\0';
+ *len = d - save;
+ return save;
+}
+
+/*
+=for apidoc A|U8 *|bytes_from_utf8|U8 *s|STRLEN *len|bool *is_utf8
+
+Converts a string C<s> of length C<len> from UTF8 into byte encoding.
+Unlike <utf8_to_bytes> but like C<bytes_to_utf8>, returns a pointer to
+the newly-created string, and updates C<len> to contain the new
+length. Returns the original string if no conversion occurs, C<len>
+is unchanged. Do nothing if C<is_utf8> points to 0. Sets C<is_utf8> to
+0 if C<s> is converted or contains all 7bit characters.
+
+=cut */
+
+U8 *
+Perl_bytes_from_utf8(pTHX_ U8* s, STRLEN *len, bool *is_utf8)
+{
+ U8 *send;
+ U8 *d;
+ U8 *start = s;
+ I32 count = 0;
+
+ if (!*is_utf8)
+ return start;
+
+ /* ensure valid UTF8 and chars < 256 before converting string */
+ for (send = s + *len; s < send;) {
+ U8 c = *s++;
+ if (!UTF8_IS_ASCII(c)) {
+ if (UTF8_IS_CONTINUATION(c) || s >= send ||
+ !UTF8_IS_CONTINUATION(*s) || UTF8_IS_DOWNGRADEABLE_START(c))
+ return start;
+ s++, count++;
+ }
+ }
+
+ *is_utf8 = 0;
+
+ if (!count)
+ return start;
+
+ Newz(801, d, (*len) - count + 1, U8);
+ s = start; start = d;
+ while (s < send) {
+ U8 c = *s++;
+
+ if (UTF8_IS_ASCII(c))
+ *d++ = c;
+ else
+ *d++ = UTF8_ACCUMULATE(c, *s++);
+ }
+ *d = '\0';
+ *len = d - start;
+ return start;
+}
+
+/*
+=for apidoc A|U8 *|bytes_to_utf8|U8 *s|STRLEN *len
+
+Converts a string C<s> of length C<len> from ASCII into UTF8 encoding.
+Returns a pointer to the newly-created string, and sets C<len> to
+reflect the new length.
+
+=cut
+*/
+
+U8*
+Perl_bytes_to_utf8(pTHX_ U8* s, STRLEN *len)
+{
+ U8 *send;
+ U8 *d;
+ U8 *dst;
+ send = s + (*len);
+
+ Newz(801, d, (*len) * 2 + 1, U8);
+ dst = d;
+
+ while (s < send) {
+ if (UTF8_IS_ASCII(*s))
+ *d++ = *s++;
+ else {
+ UV uv = *s++;
+
+ *d++ = UTF8_EIGHT_BIT_HI(uv);
+ *d++ = UTF8_EIGHT_BIT_LO(uv);
+ }
+ }
+ *d = '\0';
+ *len = d-dst;
+ return dst;
+}
+
+/*
+ * Convert native (big-endian) or reversed (little-endian) 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)
+Perl_utf16_to_utf8(pTHX_ U8* p, U8* d, I32 bytelen, I32 *newlen)
{
- U16* pend = p + bytelen / 2;
+ U8* pend;
+ U8* dstart = d;
+
+ if (bytelen & 1)
+ Perl_croak(aTHX_ "panic: utf16_to_utf8: odd bytelen");
+
+ pend = p + bytelen;
+
while (p < pend) {
- UV uv = *p++;
+ UV uv = (p[0] << 8) + p[1]; /* UTF-16BE */
+ p += 2;
if (uv < 0x80) {
*d++ = uv;
continue;
@@ -245,14 +707,9 @@ Perl_utf16_to_utf8(pTHX_ U16* p, U8* d, I32 bytelen)
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 low = *p++;
+ if (low < 0xdc00 || low >= 0xdfff)
+ Perl_croak(aTHX_ "Malformed UTF-16 surrogate");
uv = ((uv - 0xd800) << 10) + (low - 0xdc00) + 0x10000;
}
if (uv < 0x10000) {
@@ -269,13 +726,14 @@ Perl_utf16_to_utf8(pTHX_ U16* p, U8* d, I32 bytelen)
continue;
}
}
+ *newlen = d - dstart;
return d;
}
/* Note: this one is slightly destructive of the source. */
U8*
-Perl_utf16_to_utf8_reversed(pTHX_ U16* p, U8* d, I32 bytelen)
+Perl_utf16_to_utf8_reversed(pTHX_ U8* p, U8* d, I32 bytelen, I32 *newlen)
{
U8* s = (U8*)p;
U8* send = s + bytelen;
@@ -285,7 +743,7 @@ Perl_utf16_to_utf8_reversed(pTHX_ U16* p, U8* d, I32 bytelen)
s[1] = tmp;
s += 2;
}
- return utf16_to_utf8(p, d, bytelen);
+ return utf16_to_utf8(p, d, bytelen, newlen);
}
/* for now these are all defined (inefficiently) in terms of the utf8 versions */
@@ -293,7 +751,7 @@ Perl_utf16_to_utf8_reversed(pTHX_ U16* p, U8* d, I32 bytelen)
bool
Perl_is_uni_alnum(pTHX_ U32 c)
{
- U8 tmpbuf[UTF8_MAXLEN];
+ U8 tmpbuf[UTF8_MAXLEN+1];
uv_to_utf8(tmpbuf, (UV)c);
return is_utf8_alnum(tmpbuf);
}
@@ -301,7 +759,7 @@ Perl_is_uni_alnum(pTHX_ U32 c)
bool
Perl_is_uni_alnumc(pTHX_ U32 c)
{
- U8 tmpbuf[UTF8_MAXLEN];
+ U8 tmpbuf[UTF8_MAXLEN+1];
uv_to_utf8(tmpbuf, (UV)c);
return is_utf8_alnumc(tmpbuf);
}
@@ -309,7 +767,7 @@ Perl_is_uni_alnumc(pTHX_ U32 c)
bool
Perl_is_uni_idfirst(pTHX_ U32 c)
{
- U8 tmpbuf[UTF8_MAXLEN];
+ U8 tmpbuf[UTF8_MAXLEN+1];
uv_to_utf8(tmpbuf, (UV)c);
return is_utf8_idfirst(tmpbuf);
}
@@ -317,7 +775,7 @@ Perl_is_uni_idfirst(pTHX_ U32 c)
bool
Perl_is_uni_alpha(pTHX_ U32 c)
{
- U8 tmpbuf[UTF8_MAXLEN];
+ U8 tmpbuf[UTF8_MAXLEN+1];
uv_to_utf8(tmpbuf, (UV)c);
return is_utf8_alpha(tmpbuf);
}
@@ -325,7 +783,7 @@ Perl_is_uni_alpha(pTHX_ U32 c)
bool
Perl_is_uni_ascii(pTHX_ U32 c)
{
- U8 tmpbuf[UTF8_MAXLEN];
+ U8 tmpbuf[UTF8_MAXLEN+1];
uv_to_utf8(tmpbuf, (UV)c);
return is_utf8_ascii(tmpbuf);
}
@@ -333,7 +791,7 @@ Perl_is_uni_ascii(pTHX_ U32 c)
bool
Perl_is_uni_space(pTHX_ U32 c)
{
- U8 tmpbuf[UTF8_MAXLEN];
+ U8 tmpbuf[UTF8_MAXLEN+1];
uv_to_utf8(tmpbuf, (UV)c);
return is_utf8_space(tmpbuf);
}
@@ -341,7 +799,7 @@ Perl_is_uni_space(pTHX_ U32 c)
bool
Perl_is_uni_digit(pTHX_ U32 c)
{
- U8 tmpbuf[UTF8_MAXLEN];
+ U8 tmpbuf[UTF8_MAXLEN+1];
uv_to_utf8(tmpbuf, (UV)c);
return is_utf8_digit(tmpbuf);
}
@@ -349,7 +807,7 @@ Perl_is_uni_digit(pTHX_ U32 c)
bool
Perl_is_uni_upper(pTHX_ U32 c)
{
- U8 tmpbuf[UTF8_MAXLEN];
+ U8 tmpbuf[UTF8_MAXLEN+1];
uv_to_utf8(tmpbuf, (UV)c);
return is_utf8_upper(tmpbuf);
}
@@ -357,7 +815,7 @@ Perl_is_uni_upper(pTHX_ U32 c)
bool
Perl_is_uni_lower(pTHX_ U32 c)
{
- U8 tmpbuf[UTF8_MAXLEN];
+ U8 tmpbuf[UTF8_MAXLEN+1];
uv_to_utf8(tmpbuf, (UV)c);
return is_utf8_lower(tmpbuf);
}
@@ -365,7 +823,7 @@ Perl_is_uni_lower(pTHX_ U32 c)
bool
Perl_is_uni_cntrl(pTHX_ U32 c)
{
- U8 tmpbuf[UTF8_MAXLEN];
+ U8 tmpbuf[UTF8_MAXLEN+1];
uv_to_utf8(tmpbuf, (UV)c);
return is_utf8_cntrl(tmpbuf);
}
@@ -373,7 +831,7 @@ Perl_is_uni_cntrl(pTHX_ U32 c)
bool
Perl_is_uni_graph(pTHX_ U32 c)
{
- U8 tmpbuf[UTF8_MAXLEN];
+ U8 tmpbuf[UTF8_MAXLEN+1];
uv_to_utf8(tmpbuf, (UV)c);
return is_utf8_graph(tmpbuf);
}
@@ -381,7 +839,7 @@ Perl_is_uni_graph(pTHX_ U32 c)
bool
Perl_is_uni_print(pTHX_ U32 c)
{
- U8 tmpbuf[UTF8_MAXLEN];
+ U8 tmpbuf[UTF8_MAXLEN+1];
uv_to_utf8(tmpbuf, (UV)c);
return is_utf8_print(tmpbuf);
}
@@ -389,7 +847,7 @@ Perl_is_uni_print(pTHX_ U32 c)
bool
Perl_is_uni_punct(pTHX_ U32 c)
{
- U8 tmpbuf[UTF8_MAXLEN];
+ U8 tmpbuf[UTF8_MAXLEN+1];
uv_to_utf8(tmpbuf, (UV)c);
return is_utf8_punct(tmpbuf);
}
@@ -397,7 +855,7 @@ Perl_is_uni_punct(pTHX_ U32 c)
bool
Perl_is_uni_xdigit(pTHX_ U32 c)
{
- U8 tmpbuf[UTF8_MAXLEN];
+ U8 tmpbuf[UTF8_MAXLEN+1];
uv_to_utf8(tmpbuf, (UV)c);
return is_utf8_xdigit(tmpbuf);
}
@@ -405,7 +863,7 @@ Perl_is_uni_xdigit(pTHX_ U32 c)
U32
Perl_to_uni_upper(pTHX_ U32 c)
{
- U8 tmpbuf[UTF8_MAXLEN];
+ U8 tmpbuf[UTF8_MAXLEN+1];
uv_to_utf8(tmpbuf, (UV)c);
return to_utf8_upper(tmpbuf);
}
@@ -413,7 +871,7 @@ Perl_to_uni_upper(pTHX_ U32 c)
U32
Perl_to_uni_title(pTHX_ U32 c)
{
- U8 tmpbuf[UTF8_MAXLEN];
+ U8 tmpbuf[UTF8_MAXLEN+1];
uv_to_utf8(tmpbuf, (UV)c);
return to_utf8_title(tmpbuf);
}
@@ -421,7 +879,7 @@ Perl_to_uni_title(pTHX_ U32 c)
U32
Perl_to_uni_lower(pTHX_ U32 c)
{
- U8 tmpbuf[UTF8_MAXLEN];
+ U8 tmpbuf[UTF8_MAXLEN+1];
uv_to_utf8(tmpbuf, (UV)c);
return to_utf8_lower(tmpbuf);
}
@@ -536,7 +994,10 @@ 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);
+ /* NOTE: "IsWord", not "IsAlnum", since Alnum is a true
+ * descendant of isalnum(3), in other words, it doesn't
+ * contain the '_'. --jhi */
+ PL_utf8_alnum = swash_init("utf8", "IsWord", &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 */
@@ -596,7 +1057,7 @@ 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);
+ PL_utf8_space = swash_init("utf8", "IsSpacePerl", &PL_sv_undef, 0, 0);
return swash_fetch(PL_utf8_space, p);
}
@@ -698,7 +1159,7 @@ Perl_to_utf8_upper(pTHX_ U8 *p)
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);
+ return uv ? uv : utf8_to_uv(p,UTF8_MAXLEN,0,0);
}
UV
@@ -709,7 +1170,7 @@ Perl_to_utf8_title(pTHX_ U8 *p)
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);
+ return uv ? uv : utf8_to_uv(p,UTF8_MAXLEN,0,0);
}
UV
@@ -720,7 +1181,7 @@ Perl_to_utf8_lower(pTHX_ U8 *p)
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);
+ return uv ? uv : utf8_to_uv(p,UTF8_MAXLEN,0,0);
}
/* a "swash" is a swatch hash */
@@ -729,8 +1190,8 @@ SV*
Perl_swash_init(pTHX_ char* pkg, char* name, SV *listsv, I32 minbits, I32 none)
{
SV* retval;
- char tmpbuf[256];
- dSP;
+ SV* tokenbufsv = sv_2mortal(NEWSV(0,0));
+ dSP;
if (!gv_stashpv(pkg, 0)) { /* demand load utf8 */
ENTER;
@@ -751,16 +1212,20 @@ Perl_swash_init(pTHX_ char* pkg, char* name, SV *listsv, I32 minbits, I32 none)
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 (PL_curcop == &PL_compiling)
+ /* XXX ought to be handled by lex_start */
+ sv_setpv(tokenbufsv, PL_tokenbuf);
if (call_method("SWASHNEW", G_SCALAR))
- retval = newSVsv(*PL_stack_sp--);
+ retval = newSVsv(*PL_stack_sp--);
else
retval = &PL_sv_undef;
LEAVE;
POPSTACK;
if (PL_curcop == &PL_compiling) {
- strncpy(PL_tokenbuf, tmpbuf, sizeof tmpbuf);
+ STRLEN len;
+ char* pv = SvPV(tokenbufsv, len);
+
+ Copy(pv, PL_tokenbuf, len+1, char);
PL_curcop->op_private = PL_hints;
}
if (!SvROK(retval) || SvTYPE(SvRV(retval)) != SVt_PVHV)
@@ -810,11 +1275,11 @@ Perl_swash_fetch(pTHX_ SV *sv, U8 *ptr)
PUSHMARK(SP);
EXTEND(SP,3);
PUSHs((SV*)sv);
- PUSHs(sv_2mortal(newSViv(utf8_to_uv(ptr, 0) & ~(needents - 1))));
+ PUSHs(sv_2mortal(newSViv(utf8_to_uv(ptr, UTF8_MAXLEN, 0, 0) & ~(needents - 1))));
PUSHs(sv_2mortal(newSViv(needents)));
PUTBACK;
if (call_method("SWASHGET", G_SCALAR))
- retval = newSVsv(*PL_stack_sp--);
+ retval = newSVsv(*PL_stack_sp--);
else
retval = &PL_sv_undef;
POPSTACK;
@@ -837,7 +1302,7 @@ Perl_swash_fetch(pTHX_ SV *sv, U8 *ptr)
Copy(ptr, PL_last_swash_key, klen, U8);
}
- switch ((slen << 3) / needents) {
+ switch ((int)((slen << 3) / needents)) {
case 1:
bit = 1 << (off & 7);
off >>= 3;
diff --git a/gnu/usr.bin/perl/utf8.h b/gnu/usr.bin/perl/utf8.h
index c37a9959efa..d022e867bed 100644
--- a/gnu/usr.bin/perl/utf8.h
+++ b/gnu/usr.bin/perl/utf8.h
@@ -1,6 +1,6 @@
/* utf8.h
*
- * Copyright (c) 1998-2000, Larry Wall
+ * Copyright (c) 1998-2001, 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.
@@ -29,23 +29,105 @@ 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_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 UTF8_ALLOW_EMPTY 0x0001
+#define UTF8_ALLOW_CONTINUATION 0x0002
+#define UTF8_ALLOW_NON_CONTINUATION 0x0004
+#define UTF8_ALLOW_FE_FF 0x0008
+#define UTF8_ALLOW_SHORT 0x0010
+#define UTF8_ALLOW_SURROGATE 0x0020
+#define UTF8_ALLOW_BOM 0x0040
+#define UTF8_ALLOW_FFFF 0x0080
+#define UTF8_ALLOW_LONG 0x0100
+#define UTF8_ALLOW_ANYUV (UTF8_ALLOW_EMPTY|UTF8_ALLOW_FE_FF|\
+ UTF8_ALLOW_SURROGATE|UTF8_ALLOW_BOM|\
+ UTF8_ALLOW_FFFF|UTF8_ALLOW_LONG)
+#define UTF8_ALLOW_ANY 0x00ff
+#define UTF8_CHECK_ONLY 0x0100
+
+#define UNICODE_SURROGATE_FIRST 0xd800
+#define UNICODE_SURROGATE_LAST 0xdfff
+#define UNICODE_REPLACEMENT 0xfffd
+#define UNICODE_BYTER_ORDER_MARK 0xfffe
+#define UNICODE_ILLEGAL 0xffff
+
+#define UNICODE_IS_SURROGATE(c) ((c) >= UNICODE_SURROGATE_FIRST && \
+ (c) <= UNICODE_SURROGATE_LAST)
+#define UNICODE_IS_REPLACEMENT(c) ((c) == UNICODE_REPLACMENT)
+#define UNICODE_IS_BYTE_ORDER_MARK(c) ((c) == UNICODE_BYTER_ORDER_MARK)
+#define UNICODE_IS_ILLEGAL(c) ((c) == UNICODE_ILLEGAL)
+
#define UTF8SKIP(s) PL_utf8skip[*(U8*)s]
+#define UTF8_QUAD_MAX UINT64_C(0x1000000000)
+
+/*
+
+ The following table is from Unicode 3.1.
+
+ Code Points 1st Byte 2nd Byte 3rd Byte 4th Byte
+
+ U+0000..U+007F 00..7F   
+ U+0080..U+07FF C2..DF 80..BF   
+ U+0800..U+0FFF E0 A0..BF 80..BF  
+ U+1000..U+FFFF E1..EF 80..BF 80..BF  
+ U+10000..U+3FFFF F0 90..BF 80..BF 80..BF
+ U+40000..U+FFFFF F1..F3 80..BF 80..BF 80..BF
+ U+100000..U+10FFFF F4 80..8F 80..BF 80..BF
+
+ */
+
+#define UTF8_IS_ASCII(c) (((U8)c) < 0x80)
+#define UTF8_IS_START(c) (((U8)c) >= 0xc0 && (((U8)c) <= 0xfd))
+#define UTF8_IS_CONTINUATION(c) (((U8)c) >= 0x80 && (((U8)c) <= 0xbf))
+#define UTF8_IS_CONTINUED(c) (((U8)c) & 0x80)
+#define UTF8_IS_DOWNGRADEABLE_START(c) (((U8)c & 0xfc) != 0xc0)
+
+#define UTF8_CONTINUATION_MASK ((U8)0x3f)
+#define UTF8_ACCUMULATION_SHIFT 6
+#define UTF8_ACCUMULATE(old, new) (((old) << UTF8_ACCUMULATION_SHIFT) | (((U8)new) & UTF8_CONTINUATION_MASK))
+
+#define UTF8_EIGHT_BIT_HI(c) ( (((U8)(c))>>6) |0xc0)
+#define UTF8_EIGHT_BIT_LO(c) (((((U8)(c)) )&0x3f)|0x80)
+
+#ifdef HAS_QUAD
+#define UNISKIP(uv) ( (uv) < 0x80 ? 1 : \
+ (uv) < 0x800 ? 2 : \
+ (uv) < 0x10000 ? 3 : \
+ (uv) < 0x200000 ? 4 : \
+ (uv) < 0x4000000 ? 5 : \
+ (uv) < 0x80000000 ? 6 : \
+ (uv) < UTF8_QUAD_MAX ? 7 : 13 )
+#else
+/* No, I'm not even going to *TRY* putting #ifdef inside a #define */
+#define UNISKIP(uv) ( (uv) < 0x80 ? 1 : \
+ (uv) < 0x800 ? 2 : \
+ (uv) < 0x10000 ? 3 : \
+ (uv) < 0x200000 ? 4 : \
+ (uv) < 0x4000000 ? 5 : \
+ (uv) < 0x80000000 ? 6 : 7 )
+#endif
+
+
/*
* 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)) \
+#ifdef EBCDIC
+#define isIDFIRST_lazy_if(p,c) isIDFIRST(*(p))
+#define isALNUM_lazy_if(p,c) isALNUM(*(p))
+#else
+#define isIDFIRST_lazy_if(p,c) ((IN_BYTE || (!c || (*((U8*)p) < 0xc0))) \
? isIDFIRST(*(p)) \
: isIDFIRST_utf8((U8*)p))
-#define isALNUM_lazy_if(p,c) ((!c || (*((U8*)p) < 0xc0)) \
+#define isALNUM_lazy_if(p,c) ((IN_BYTE || (!c || (*((U8*)p) < 0xc0))) \
? isALNUM(*(p)) \
: isALNUM_utf8((U8*)p))
+#endif
#define isIDFIRST_lazy(p) isIDFIRST_lazy_if(p,1)
#define isALNUM_lazy(p) isALNUM_lazy_if(p,1)
diff --git a/gnu/usr.bin/perl/utils/perlcc.PL b/gnu/usr.bin/perl/utils/perlcc.PL
index f0636f62bd1..63045559d80 100644
--- a/gnu/usr.bin/perl/utils/perlcc.PL
+++ b/gnu/usr.bin/perl/utils/perlcc.PL
@@ -31,1084 +31,632 @@ print OUT <<"!GROK!THIS!";
$Config{startperl}
eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}'
if \$running_under_some_shell;
+--\$running_under_some_shell;
!GROK!THIS!
# In the following, perl variables are not expanded during extraction.
print OUT <<'!NO!SUBS!';
-use Config;
+# Version 2.0, Simon Cozens, Thu Mar 30 17:52:45 JST 2000
+# Version 2.01, Tom Christiansen, Thu Mar 30 08:25:14 MST 2000
+# Version 2.02, Simon Cozens, Sun Apr 16 01:53:36 JST 2000
+# Version 2.03, Edward Peschko, Mon Feb 26 12:04:17 PST 2001
+
use strict;
+use warnings;
+use v5.6.0;
+
use FileHandle;
-use File::Basename qw(&basename &dirname);
+use Config;
+use Fcntl qw(:DEFAULT :flock);
+use File::Temp qw(tempfile);
use Cwd;
+our $VERSION = 2.03;
+$| = 1;
-use Getopt::Long;
+$SIG{INT} = sub { exit(); }; # exit gracefully and clean up after ourselves.
-$Getopt::Long::bundling_override = 1;
-$Getopt::Long::passthrough = 0;
-$Getopt::Long::ignore_case = 0;
+use subs qw{
+ cc_harness check_read check_write checkopts_byte choose_backend
+ compile_byte compile_cstyle compile_module generate_code
+ grab_stash parse_argv sanity_check vprint yclept spawnit
+};
+sub opt(*); # imal quoting
-my $pathsep = ($Config{'osname'} eq 'MSWin32')? "\\" : "/"; # MAJOR HACK. SHOULD
- # BE IN Config.pm
+our ($Options, $BinPerl, $Backend);
+our ($Input => $Output);
+our ($logfh);
+our ($cfile);
-my $options = {};
-my $_fh;
-unshift @ARGV, split ' ', $ENV{PERLCC_OPTS} if $ENV{PERLCC_OPTS};
+# eval { main(); 1 } or die;
main();
-sub main
-{
-
- GetOptions
- (
- $options, "L:s",
- "I:s",
- "C:s",
- "o:s",
- "e:s",
- "regex:s",
- "verbose:s",
- "log:s",
- "argv:s",
- "b",
- "opt",
- "gen",
- "sav",
- "run",
- "prog",
- "mod"
- );
-
-
- my $key;
-
- local($") = "|";
-
- _usage() if (!_checkopts());
- push(@ARGV, _maketempfile()) if ($options->{'e'});
-
- _usage() if (!@ARGV);
-
- my $file;
- foreach $file (@ARGV)
- {
- _print("
---------------------------------------------------------------------------------
-Compiling $file:
---------------------------------------------------------------------------------
-", 36 );
- _doit($file);
- }
+sub main {
+ parse_argv();
+ check_write($Output);
+ choose_backend();
+ generate_code();
+ run_code();
+ _die("XXX: Not reached?");
}
-
-sub _doit
-{
- my ($file) = @_;
-
- my ($program_ext, $module_ext) = _getRegexps();
- 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'}))
- )
- {
- $type = 'program';
-
- 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);
+#######################################################################
+sub choose_backend {
+ # Choose the backend.
+ $Backend = 'C';
+ if (opt(B)) {
+ checkopts_byte();
+ $Backend = 'Bytecode';
}
- elsif (($file =~ m"@$module_ext") || ($options->{'mod'}))
- {
- $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}";
- }
-
- return() if (!$obj);
- }
- else
- {
- _error("noextension", $file, $program_ext, $module_ext);
- return();
+ if (opt(S) && opt(c)) {
+ # die "$0: Do you want me to compile this or not?\n";
+ delete $Options->{S};
}
+ $Backend = 'CC' if opt(O);
+}
- if ($type eq 'program')
- {
- _print("Making $gentype($objfile) for $file!\n", 36 );
-
- 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'} &&
- !$options->{'b'});
- $errcode = _compileCode($file, $objfile, $obj)
- if (!$options->{'gen'} &&
- !$options->{'b'});
-
- if ($errcode)
- {
- _print( "ERROR: In compiling code for $objfile !\n", -1);
- my $ofile = File::Basename::basename($objfile);
- $ofile =~ s"\.c$"\.o"s;
-
- _removeCode("$ofile");
- return()
- }
-
- _runCode($objfile) if ($options->{'run'} && $options->{'b'});
- _runCode($obj) if ($options->{'run'} && !$options->{'b'});
-
- _removeCode($objfile) if (($options->{'b'} &&
- ($options->{'e'} && !$options->{'o'})) ||
- (!$options->{'b'} &&
- (!$options->{'sav'} ||
- ($options->{'e'} && !$options->{'C'}))));
- _removeCode($file) if ($options->{'e'});
+sub generate_code {
- _removeCode($obj) if (!$options->{'b'} &&
- (($options->{'e'} &&
- !$options->{'sav'} && !$options->{'o'}) ||
- ($options->{'run'} && !$options->{'sav'})));
- }
- else
- {
- _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'} &&
- !$options->{'b'});
+ vprint 0, "Compiling $Input";
- $errcode =
- _compileCode($file, $objfile, $obj, $so ) if (!$options->{'gen'} &&
- !$options->{'b'});
+ $BinPerl = yclept(); # Calling convention for perl.
- (_print( "ERROR: In compiling code for $objfile!\n", -1), return())
- if ($errcode);
+ if (opt(shared)) {
+ compile_module();
+ } else {
+ if ($Backend eq 'Bytecode') {
+ compile_byte();
+ } else {
+ compile_cstyle();
+ }
}
+ exit(0) if (!opt('r'));
}
-sub _getExecutable
-{
- my ($sourceprog, $ext) = @_;
- my ($obj);
-
- if (defined($options->{'regex'}))
- {
- eval("(\$obj = \$sourceprog) =~ $options->{'regex'}");
- return(0) if (_error('badeval', $@));
- return(0) if (_error('equal', $obj, $sourceprog));
- }
- elsif (defined ($options->{'ext'}))
- {
- ($obj = $sourceprog) =~ s"@$ext"$options->{ext}"g;
- return(0) if (_error('equal', $obj, $sourceprog));
- }
- elsif (defined ($options->{'run'}))
- {
- $obj = "perlc$$";
- }
- else
- {
- ($obj = $sourceprog) =~ s"@$ext""g;
- return(0) if (_error('equal', $obj, $sourceprog));
- }
- return($obj);
+sub run_code {
+ vprint 0, "Running code";
+ run("$Output @ARGV");
+ exit(0);
}
-sub _createCode
-{
- my ( $backend, $generated_file, $file, $final_output ) = @_;
- my $return;
- my $output_switch = "o";
- my $max_line_len = '';
-
- local($") = " -I";
-
- if ($^O eq 'MSWin32' && $backend =~ /^CC?$/ && $Config{cc} =~ /^cl/i) {
- $max_line_len = '-l2000,';
- }
-
- if ($backend eq "Bytecode")
- {
- 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(
- "$^X -I@INC -MO=$backend,$max_line_len-m$final_output $file\n", 36);
- $return =
- _run("$^X -I@INC -MO=$backend,$max_line_len-m$final_output,-$output_switch$generated_file $file ", 9);
- $return;
+# usage: vprint [level] msg args
+sub vprint {
+ my $level;
+ if (@_ == 1) {
+ $level = 1;
+ } elsif ($_[0] =~ /^\d$/) {
+ $level = shift;
+ } else {
+ # well, they forgot to use a number; means >0
+ $level = 0;
+ }
+ my $msg = "@_";
+ $msg .= "\n" unless substr($msg, -1) eq "\n";
+ if (opt(v) > $level)
+ {
+ print "$0: $msg" if !opt('log');
+ print $logfh "$0: $msg" if opt('log');
}
}
-sub _compileCode
-{
- my ($sourceprog, $generated_cfile, $output_executable, $shared_object) = @_;
- my @return;
-
- if (@_ == 3) # just compiling a program
- {
- $return[0] =
- _ccharness('static', $sourceprog, "-o", $output_executable,
- $generated_cfile);
- $return[0];
- }
- else
- {
- my $object_file = $generated_cfile;
- $object_file =~ s"\.c$"$Config{_o}";
-
- $return[0] = _ccharness('compile', $sourceprog, "-c", $generated_cfile);
- $return[1] = _ccharness
- (
- 'dynamic',
- $sourceprog, "-o",
- $shared_object, $object_file
- );
- return(1) if (grep ($_, @return));
- return(0);
+sub parse_argv {
+
+ use Getopt::Long;
+# Getopt::Long::Configure("bundling"); turned off. this is silly because
+# it doesn't allow for long switches.
+ Getopt::Long::Configure("no_ignore_case");
+
+ # no difference in exists and defined for %ENV; also, a "0"
+ # argument or a "" would not help cc, so skip
+ unshift @ARGV, split ' ', $ENV{PERLCC_OPTS} if $ENV{PERLCC_OPTS};
+
+ $Options = {};
+ Getopt::Long::GetOptions( $Options,
+ 'L:s', # lib directory
+ 'I:s', # include directories (FOR C, NOT FOR PERL)
+ 'o:s', # Output executable
+ 'v:i', # Verbosity level
+ 'e:s', # One-liner
+ 'r', # run resulting executable
+ 'B', # Byte compiler backend
+ 'O', # Optimised C backend
+ 'c', # Compile only
+ 'h', # Help me
+ 'S', # Dump C files
+ 'r', # run the resulting executable
+ 'static', # Dirty hack to enable -shared/-static
+ 'shared', # Create a shared library (--shared for compat.)
+ 'log:s' # where to log compilation process information
+ );
+
+ # This is an attempt to make perlcc's arg. handling look like cc.
+ # if ( opt('s') ) { # must quote: looks like s)foo)bar)!
+ # if (opt('s') eq 'hared') {
+ # $Options->{shared}++;
+ # } elsif (opt('s') eq 'tatic') {
+ # $Options->{static}++;
+ # } else {
+ # warn "$0: Unknown option -s", opt('s');
+ # }
+ # }
+
+ $Options->{v} += 0;
+
+ helpme() if opt(h); # And exit
+
+ $Output = opt(o) || 'a.out';
+ $Output = relativize($Output);
+ $logfh = new FileHandle(">> " . opt('log')) if (opt('log'));
+
+ if (opt(e)) {
+ warn "$0: using -e 'code' as input file, ignoring @ARGV\n" if @ARGV;
+ # We don't use a temporary file here; why bother?
+ # XXX: this is not bullet proof -- spaces or quotes in name!
+ $Input = "-e '".opt(e)."'"; # Quotes eaten by shell
+ } else {
+ $Input = shift @ARGV; # XXX: more files?
+ _usage_and_die("$0: No input file specified\n") unless $Input;
+ # DWIM modules. This is bad but necessary.
+ $Options->{shared}++ if $Input =~ /\.pm\z/;
+ warn "$0: using $Input as input file, ignoring @ARGV\n" if @ARGV;
+ check_read($Input);
+ check_perl($Input);
+ sanity_check();
}
-}
-sub _runCode
-{
- my ($executable) = @_;
- _print("$executable $options->{'argv'}\n", 36);
- _run("$executable $options->{'argv'}", -1 );
}
-sub _removeCode
-{
- my ($file) = @_;
- unlink($file) if (-e $file);
-}
-
-sub _ccharness
-{
- my $type = shift;
- my (@args) = @_;
- local($") = " ";
-
- 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";
- $incdir = "-I$Config{installarchlib}/CORE";
- }
- else
- {
- $libdir = "$L.. $L.";
- $incdir = "-I.. -I.";
- }
-
- $libdir .= " $L$options->{L}" if (defined($options->{L}));
- $incdir .= " -I$options->{L}" if (defined($options->{L}));
-
- my $linkargs = '';
- my $dynaloader = '';
- my $optimize = '';
- my $flags = '';
+sub opt(*) {
+ my $opt = shift;
+ return exists($Options->{$opt}) && ($Options->{$opt} || 0);
+}
- if (!grep(/^-[cS]$/, @args))
- {
- 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 $libs = _getSharedObjects($sourceprog);
- @$libs = grep { !(/DynaLoader\.a$/ && ($dynaloader = $_)) } @$libs
- if($^O eq 'cygwin');
-
- 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 );
+sub compile_module {
+ die "$0: Compiling to shared libraries is currently disabled\n";
}
-sub _getSharedObjects
-{
- my ($sourceprog) = @_;
- my ($tmpfile, $incfile);
- my (@sharedobjects, @libraries);
- local($") = " -I";
+sub compile_byte {
+ require ByteLoader;
+ my $stash = grab_stash();
+ my $command = "$BinPerl -MO=Bytecode,$stash $Input";
+ # The -a option means we'd have to close the file and lose the
+ # lock, which would create the tiniest of races. Instead, append
+ # the output ourselves.
+ vprint 1, "Writing on $Output";
- my ($tmpprog);
- ($tmpprog = $sourceprog) =~ s"(.*)[\\/](.*)"$2";
+ my $openflags = O_WRONLY | O_CREAT;
+ $openflags |= O_BINARY if eval { O_BINARY; 1 };
+ $openflags |= O_EXLOCK if eval { O_EXLOCK; 1 };
- my $tempdir= File::Spec->tmpdir;
+ # these dies are not "$0: .... \n" because they "can't happen"
- $tmpfile = "$tempdir/$tmpprog.tst";
- $incfile = "$tempdir/$tmpprog.val";
+ sysopen(OUT, $Output, $openflags)
+ or die "can't write to $Output: $!";
- my $fd = new FileHandle("> $tmpfile") || die "Couldn't open $tmpfile!\n";
- my $fd2 =
- new FileHandle("$sourceprog") || die "Couldn't open $sourceprog!\n";
+ # this is blocking; hold on; why are we doing this??
+ # flock OUT, LOCK_EX or die "can't lock $Output: $!"
+ # unless eval { O_EXLOCK; 1 };
- print $fd <<"EOF";
- use FileHandle;
- my \$fh3 = new FileHandle("> $incfile")
- || die "Couldn't open $incfile\\n";
+ truncate(OUT, 0)
+ or die "couldn't trunc $Output: $!";
- my \$key;
- foreach \$key (keys(\%INC)) { print \$fh3 "\$key:\$INC{\$key}\\n"; }
- close(\$fh3);
- exit();
+ print OUT <<EOF;
+#!$^X
+use ByteLoader $ByteLoader::VERSION;
EOF
- print $fd ( <$fd2> );
- close($fd);
-
- _print("$^X -I@INC $tmpfile\n", 36);
- _run("$^X -I@INC $tmpfile", 9 );
+ # Now the compile:
+ vprint 1, "Compiling...";
+ vprint 3, "Calling $command";
- $fd = new FileHandle ("$incfile");
- my @lines = <$fd>;
+ my ($output_r, $error_r) = spawnit($command);
- unlink($tmpfile);
- unlink($incfile);
-
- 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); }
+ if (@$error_r && $? != 0) {
+ _die("$0: $Input did not compile, which can't happen:\n@$error_r\n");
+ } else {
+ my @error = grep { !/^$Input syntax OK$/o } @$error_r;
+ warn "$0: Unexpected compiler output:\n@error" if @error;
}
- return(\@return);
-}
+
+ # Write it and leave.
+ print OUT @$output_r or _die("can't write $Output: $!");
+ close OUT or _die("can't close $Output: $!");
-sub _maketempfile
-{
- my $return;
-
-# if ($Config{'osname'} eq 'MSWin32')
-# { $return = "C:\\TEMP\\comp$$.p"; }
-# else
-# { $return = "/tmp/comp$$.p"; }
-
- $return = "comp$$.p";
-
- my $fd = new FileHandle( "> $return") || die "Couldn't open $return!\n";
- print $fd $options->{'e'};
- close($fd);
-
- return($return);
+ # wait, how could it be anything but what you see next?
+ chmod 0777 & ~umask, $Output or _die("can't chmod $Output: $!");
+ exit 0;
}
-
-
-sub _lookforAuto
-{
- my ($dir, $file) = @_;
- my ($relabs, $relshared);
- my ($prefix);
- my $return;
- my $sharedextension = $^O =~ /MSWin32|cygwin|os2/i
- ? $Config{_a} : ".$Config{so}";
- ($prefix = $file) =~ s"(.*)\.pm"$1";
-
- my ($tmp, $modname) = ($prefix =~ 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??
-
- my @searchpaths = map("$_${pathsep}auto", @INC);
+sub compile_cstyle {
+ my $stash = grab_stash();
- my $path;
- foreach $path (@searchpaths)
- {
- if (-e ($return = "$path$relshared")) { return($return); }
- if (-e ($return = "$path$relabs")) { return($return); }
+ # What are we going to call our output C file?
+ my $lose = 0;
+ my ($cfh);
+
+ if (opt(S) || opt(c)) {
+ # We need to keep it.
+ if (opt(e)) {
+ $cfile = "a.out.c";
+ } else {
+ $cfile = $Input;
+ # File off extension if present
+ # hold on: plx is executable; also, careful of ordering!
+ $cfile =~ s/\.(?:p(?:lx|l|h)|m)\z//i;
+ $cfile .= ".c";
+ $cfile = $Output if opt(c) && $Output =~ /\.c\z/i;
+ }
+ check_write($cfile);
+ } else {
+ # Don't need to keep it, be safe with a tempfile.
+ $lose = 1;
+ ($cfh, $cfile) = tempfile("pccXXXXX", SUFFIX => ".c");
+ close $cfh; # See comment just below
}
- return(undef);
-}
-
-sub _getRegexps # make the appropriate regexps for making executables,
-{ # shared libs
-
- my ($program_ext, $module_ext) = ([],[]);
+ vprint 1, "Writing C on $cfile";
+ my $max_line_len = '';
+ if ($^O eq 'MSWin32' && $Config{cc} =~ /^cl/i) {
+ $max_line_len = '-l2000,';
+ }
- @$program_ext = ($ENV{PERL_SCRIPT_EXT})? split(':', $ENV{PERL_SCRIPT_EXT}) :
- ('.p$', '.pl$', '.bat$');
+ # This has to do the write itself, so we can't keep a lock. Life
+ # sucks.
+ my $command = "$BinPerl -MO=$Backend,$max_line_len$stash,-o$cfile $Input";
+ vprint 1, "Compiling...";
+ vprint 1, "Calling $command";
+ my ($output_r, $error_r) = spawnit($command);
+ my @output = @$output_r;
+ my @error = @$error_r;
- @$module_ext = ($ENV{PERL_MODULE_EXT})? split(':', $ENV{PERL_MODULE_EXT}) :
- ('.pm$');
+ if (@error && $? != 0) {
+ _die("$0: $Input did not compile, which can't happen:\n@error\n");
+ }
- _mungeRegexp( $program_ext );
- _mungeRegexp( $module_ext );
+ cc_harness($cfile,$stash) unless opt(c);
- return($program_ext, $module_ext);
+ if ($lose) {
+ vprint 2, "unlinking $cfile";
+ unlink $cfile or _die("can't unlink $cfile: $!");
+ }
}
-sub _mungeRegexp
-{
- my ($regexp) = @_;
-
- grep(s:(^|[^\\])\.:$1\x00\\.:g, @$regexp);
- grep(s:(^|[^\x00])\\\.:$1\.:g, @$regexp);
- grep(s:\x00::g, @$regexp);
+sub cc_harness {
+ my ($cfile,$stash)=@_;
+ use ExtUtils::Embed ();
+ my $command = ExtUtils::Embed::ccopts." -o $Output $cfile ";
+ $command .= " -I".$_ for split /\s+/, opt(I);
+ $command .= " -L".$_ for split /\s+/, opt(L);
+ my @mods = split /-?u /, $stash;
+ $command .= " ".ExtUtils::Embed::ldopts("-std", \@mods);
+ vprint 3, "running $Config{cc} $command";
+ system("$Config{cc} $command");
}
-sub _error
-{
- my ($type, @args) = @_;
-
- if ($type eq 'equal')
- {
-
- if ($args[0] eq $args[1])
- {
- _print ("ERROR: The object file '$args[0]' does not generate a legitimate executable file! Skipping!\n", -1);
- return(1);
+# Where Perl is, and which include path to give it.
+sub yclept {
+ my $command = "$^X ";
+
+ # DWIM the -I to be Perl, not C, include directories.
+ if (opt(I) && $Backend eq "Bytecode") {
+ for (split /\s+/, opt(I)) {
+ if (-d $_) {
+ push @INC, $_;
+ } else {
+ warn "$0: Include directory $_ not found, skipping\n";
+ }
}
}
- elsif ($type eq 'badeval')
- {
- if ($args[0])
- {
- _print ("ERROR: $args[0]\n", -1);
- return(1);
- }
- }
- elsif ($type eq 'noextension')
- {
- my $progext = join(',', @{$args[1]});
- my $modext = join(',', @{$args[2]});
+
+ $command .= "-I$_ " for @INC;
+ return $command;
+}
- $progext =~ s"\\""g;
- $modext =~ s"\\""g;
+# Use B::Stash to find additional modules and stuff.
+{
+ my $_stash;
+ sub grab_stash {
- $progext =~ s"\$""g;
- $modext =~ s"\$""g;
+ warn "already called get_stash once" if $_stash;
- _print
- (
-"
-ERROR: '$args[0]' does not have a proper extension! Proper extensions are:
+ my $command = "$BinPerl -MB::Stash -c $Input";
+ # Filename here is perfectly sanitised.
+ vprint 3, "Calling $command\n";
- PROGRAM: $progext
- SHARED OBJECT: $modext
+ my ($stash_r, $error_r) = spawnit($command);
+ my @stash = @$stash_r;
+ my @error = @$error_r;
-Use the '-prog' flag to force your files to be interpreted as programs.
-Use the '-mod' flag to force your files to be interpreted as modules.
-", -1
- );
- return(1);
+ if (@error && $? != 0) {
+ _die("$0: $Input did not compile:\n@error\n");
+ }
+
+ $stash[0] =~ s/,-u\<none\>//;
+ vprint 2, "Stash: ", join " ", split /,?-u/, $stash[0];
+ chomp $stash[0];
+ return $_stash = $stash[0];
}
- return(0);
}
-sub _checkopts
-{
- my @errors;
- local($") = "\n";
-
- if ($options->{'log'})
- {
- $_fh = new FileHandle(">> $options->{'log'}") || push(@errors, "ERROR: Couldn't open $options->{'log'}\n");
- }
+# Check the consistency of options if -B is selected.
+# To wit, (-B|-O) ==> no -shared, no -S, no -c
+sub checkopts_byte {
- 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");
- }
+ _die("$0: Please choose one of either -B and -O.\n") if opt(O);
- if (($options->{'c'}) && (@ARGV > 1) && ($options->{'sav'} ))
- {
- push(@errors,
-"ERROR: The '-sav' and '-C' options are incompatible when you have more than
- one input file! ('-C' explicitly names resulting C code, '-sav' saves it,
- and hence, with more than one file, the c code will be overwritten for
- each file that you compile)\n");
- }
- 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 file, hence, with more than
- one file the names clash)\n");
+ if (opt(shared)) {
+ warn "$0: Will not create a shared library for bytecode\n";
+ delete $Options->{shared};
}
- if ($options->{'e'} && ($options->{'sav'} || $options->{'gen'}) &&
- !$options->{'C'})
- {
- push(@errors,
-"ERROR: You need to specify where you are going to save the resulting
- C code when using '-sav' and '-e'. Use '-C'.\n");
+ for my $o ( qw[c S] ) {
+ if (opt($o)) {
+ warn "$0: Compiling to bytecode is a one-pass process--",
+ "-$o ignored\n";
+ delete $Options->{$o};
+ }
}
- if (($options->{'regex'} || $options->{'run'} || $options->{'o'})
- && $options->{'gen'})
- {
- push(@errors,
-"ERROR: The options '-regex', '-run', and '-o' are incompatible with '-gen'.
- '-gen' says to stop at C generation, and the other three modify the
- compilation and/or running process!\n");
- }
+}
- if ($options->{'run'} && $options->{'mod'})
- {
- push(@errors,
-"ERROR: Can't run modules that you are compiling! '-run' and '-mod' are
- incompatible!\n");
+# Check the input and output files make sense, are read/writeable.
+sub sanity_check {
+ if ($Input eq $Output) {
+ if ($Input eq 'a.out') {
+ _die("$0: Compiling a.out is probably not what you want to do.\n");
+ # You fully deserve what you get now. No you *don't*. typos happen.
+ } else {
+ warn "$0: Will not write output on top of input file, ",
+ "compiling to a.out instead\n";
+ $Output = "a.out";
+ }
}
+}
- if ($options->{'e'} && @ARGV)
- {
- push (@errors,
-"ERROR: The option '-e' needs to be all by itself without any other
- file arguments!\n");
- }
- if ($options->{'e'} && !($options->{'o'} || $options->{'run'}))
- {
- $options->{'run'} = 1;
+sub check_read {
+ my $file = shift;
+ unless (-r $file) {
+ _die("$0: Input file $file is a directory, not a file\n") if -d _;
+ unless (-e _) {
+ _die("$0: Input file $file was not found\n");
+ } else {
+ _die("$0: Cannot read input file $file: $!\n");
+ }
}
+ unless (-f _) {
+ # XXX: die? don't try this on /dev/tty
+ warn "$0: WARNING: input $file is not a plain file\n";
+ }
+}
- if (!defined($options->{'verbose'}))
- {
- $options->{'verbose'} = ($options->{'log'})? 64 : 7;
+sub check_write {
+ my $file = shift;
+ if (-d $file) {
+ _die("$0: Cannot write on $file, is a directory\n");
}
-
- my $verbose_error;
-
- if ($options->{'verbose'} =~ m"[^tagfcd]" &&
- !( $options->{'verbose'} eq '0' ||
- ($options->{'verbose'} < 64 && $options->{'verbose'} > 0)))
- {
- $verbose_error = 1;
- push(@errors,
-"ERROR: Illegal verbosity level. Needs to have either the letters
- 't','a','g','f','c', or 'd' in it or be between 0 and 63, inclusive.\n");
+ if (-e _) {
+ _die("$0: Cannot write on $file: $!\n") unless -w _;
+ }
+ unless (-w cwd()) {
+ _die("$0: Cannot write in this directory: $!\n");
}
+}
- $options->{'verbose'} = ($options->{'verbose'} =~ m"[tagfcd]")?
- ($options->{'verbose'} =~ m"d") * 32 +
- ($options->{'verbose'} =~ m"c") * 16 +
- ($options->{'verbose'} =~ m"f") * 8 +
- ($options->{'verbose'} =~ m"t") * 4 +
- ($options->{'verbose'} =~ m"a") * 2 +
- ($options->{'verbose'} =~ m"g") * 1
- : $options->{'verbose'};
-
- if (!$verbose_error && ( $options->{'log'} &&
- !(
- ($options->{'verbose'} & 8) ||
- ($options->{'verbose'} & 16) ||
- ($options->{'verbose'} & 32 )
- )
- )
- )
- {
- push(@errors,
-"ERROR: The verbosity level '$options->{'verbose'}' does not output anything
- to a logfile, and you specified '-log'!\n");
- } # }
-
- if (!$verbose_error && ( !$options->{'log'} &&
- (
- ($options->{'verbose'} & 8) ||
- ($options->{'verbose'} & 16) ||
- ($options->{'verbose'} & 32) ||
- ($options->{'verbose'} & 64)
- )
- )
- )
- {
- push(@errors,
-"ERROR: The verbosity level '$options->{'verbose'}' requires that you also
- specify a logfile via '-log'\n");
- } # }
-
-
- (_print( "\n". join("\n", @errors), -1), return(0)) if (@errors);
- return(1);
+sub check_perl {
+ my $file = shift;
+ unless (-T $file) {
+ warn "$0: Binary `$file' sure doesn't smell like perl source!\n";
+ print "Checking file type... ";
+ system("file", $file);
+ _die("Please try a perlier file!\n");
+ }
+
+ open(my $handle, "<", $file) or _die("XXX: can't open $file: $!");
+ local $_ = <$handle>;
+ if (/^#!/ && !/perl/) {
+ _die("$0: $file is a ", /^#!\s*(\S+)/, " script, not perl\n");
+ }
+
+}
+
+# File spawning and error collecting
+sub spawnit {
+ my ($command) = shift;
+ my (@error,@output);
+ my $errname;
+ (undef, $errname) = tempfile("pccXXXXX");
+ {
+ open (S_OUT, "$command 2>$errname |")
+ or _die("$0: Couldn't spawn the compiler.\n");
+ @output = <S_OUT>;
+ }
+ open (S_ERROR, $errname) or _die("$0: Couldn't read the error file.\n");
+ @error = <S_ERROR>;
+ close S_ERROR;
+ close S_OUT;
+ unlink $errname or _die("$0: Can't unlink error file $errname");
+ return (\@output, \@error);
}
-sub _print
-{
- my ($text, $flag ) = @_;
-
- my $logflag = int($flag/8) * 8;
- my $regflag = $flag % 8;
+sub helpme {
+ print "perlcc compiler frontend, version $VERSION\n\n";
+ { no warnings;
+ exec "pod2usage $0";
+ exec "perldoc $0";
+ exec "pod2text $0";
+ }
+}
- if ($flag == -1 || ($flag & $options->{'verbose'}))
- {
- my $dolog = ((($logflag & $options->{'verbose'}) || $flag == -1)
- && $options->{'log'});
+sub relativize {
+ my ($args) = @_;
- my $doreg = (($regflag & $options->{'verbose'}) || $flag == -1);
-
- if ($doreg) { print( STDERR $text ); }
- if ($dolog) { print $_fh $text; }
- }
+ return() if ($args =~ m"^[/\\]");
+ return("./$args");
}
-sub _run
-{
- my ($command, $flag) = @_;
+sub _die {
+ $logfh->print(@_) if opt('log');
+ print STDERR @_;
+ exit(); # should die eventually. However, needed so that a 'make compile'
+ # can compile all the way through to the end for standard dist.
+}
- my $logflag = ($flag != -1)? int($flag/8) * 8 : 0;
- my $regflag = $flag % 8;
+sub _usage_and_die {
+ _die(<<EOU);
+$0: Usage:
+$0 [-o executable] [-r] [-O|-B|-c|-S] [-log log] [source[.pl] | -e oneliner]
+EOU
+}
- if ($flag == -1 || ($flag & $options->{'verbose'}))
- {
- my $dolog = ($logflag & $options->{'verbose'} && $options->{'log'});
- my $doreg = (($regflag & $options->{'verbose'}) || $flag == -1);
+sub run {
+ my (@commands) = @_;
- if ($doreg && !$dolog)
- {
- print _interruptrun("$command");
- }
- elsif ($doreg && $dolog)
- {
- my $text = _interruptrun($command);
- print $_fh $text;
- print STDERR $text;
- }
- else
- {
- my $text = _interruptrun($command);
- print $_fh $text;
- }
- }
- else
- {
- _interruptrun($command);
- }
- return($?);
+ print interruptrun(@commands) if (!opt('log'));
+ $logfh->print(interruptrun(@commands)) if (opt('log'));
}
-sub _interruptrun
+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.
+ my (@commands) = @_;
- 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 $command = join('', @commands);
+ local(*FD);
+ my $pid = open(FD, "$command |");
+ my $text;
+
+ local($SIG{HUP}) = sub { kill 9, $pid; exit };
+ local($SIG{INT}) = sub { kill 9, $pid; exit };
my $needalarm =
- ($ENV{'PERLCC_TIMEOUT'} &&
- $Config{'osname'} ne 'MSWin32' && $command =~ m"^perlc");
- my $text;
+ ($ENV{PERLCC_TIMEOUT} &&
+ $Config{'osname'} ne 'MSWin32' &&
+ $command =~ m"(^|\s)perlcc\s");
- eval
+ eval
{
- local($SIG{ALRM}) = sub { die "INFINITE LOOP"; };
- alarm($ENV{'PERLCC_TIMEOUT'}) if ($needalarm);
- $text = join('', <FD>);
- alarm(0) if ($needalarm);
+ 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);
+ if ($@)
+ {
+ eval { kill 'HUP', $pid };
+ vprint 0, "SYSTEM TIMEOUT (infinite loop?)\n";
}
-
+
close(FD);
return($text);
}
-sub _usage
-{
- _print
- (
- <<"EOF"
-
-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') >
- -C < explicit name of resulting C code >
- -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' >
- -argv < arguments for the executables to be run via '-run' or '-e' >
-
- Boolean flags
- -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 )
-
-EOF
-, -1
-
- );
- exit(255);
+END {
+ unlink $cfile if ($cfile && !opt(S) && !opt(c));
}
-
__END__
=head1 NAME
-perlcc - frontend for perl compiler
+perlcc - generate executables from Perl programs
=head1 SYNOPSIS
- %prompt perlcc a.p # compiles into executable 'a'
-
- %prompt perlcc A.pm # compile into 'A.so'
-
- %prompt perlcc a.p -o execute # compiles 'a.p' into 'execute'.
+ $ perlcc hello # Compiles into executable 'a.out'
+ $ perlcc -o hello hello.pl # Compiles into executable 'hello'
- %prompt perlcc a.p -o execute -run # compiles 'a.p' into execute, runs on
- # the fly
+ $ perlcc -O file # Compiles using the optimised C backend
+ $ perlcc -B file # Compiles using the bytecode backend
- %prompt perlcc a.p -o execute -run -argv 'arg1 arg2 arg3'
- # compiles into execute, runs with
- # arg1 arg2 arg3 as @ARGV
+ $ perlcc -c file # Creates a C file, 'file.c'
+ $ perlcc -S -o hello file # Creates a C file, 'file.c',
+ # then compiles it to executable 'hello'
+ $ perlcc -c out.c file # Creates a C file, 'out.c' from 'file'
- %prompt perlcc a.p b.p c.p -regex 's/\.p/\.exe'
- # compiles into 'a.exe','b.exe','c.exe'.
+ $ perlcc -e 'print q//' # Compiles a one-liner into 'a.out'
+ $ perlcc -c -e 'print q//' # Creates a C file 'a.out.c'
- %prompt perlcc a.p -log compilelog # compiles into 'a', saves compilation
- # info into compilelog, as well
- # as mirroring to screen
+ $ perlcc -r hello # compiles 'hello' into 'a.out', runs 'a.out'.
- %prompt perlcc a.p -log compilelog -verbose cdf
- # compiles into 'a', saves compilation
- # info into compilelog, being silent
- # on screen.
+ $ perlcc -r hello a b c # compiles 'hello' into 'a.out', runs 'a.out'.
+ # with arguments 'a b c'
- %prompt perlcc a.p -C a.c -gen # generates C code (into a.c) and
- # stops without compile.
-
- %prompt perlcc a.p -L ../lib a.c
- # Compiles with the perl libraries
- # inside ../lib included.
+ $ perlcc hello -log c # compiles 'hello' into 'a.out' logs compile
+ # log into 'c'.
=head1 DESCRIPTION
-'perlcc' is the frontend into the perl compiler. Typing 'perlcc a.p'
-compiles the code inside a.p into a standalone executable, and
-perlcc A.pm will compile into a shared object, A.so, suitable for inclusion
-into a perl program via "use A".
+F<perlcc> creates standalone executables from Perl programs, using the
+code generators provided by the L<B> module. At present, you may
+either create executable Perl bytecode, using the C<-B> option, or
+generate and compile C files using the standard and 'optimised' C
+backends.
-There are quite a few flags to perlcc which help with such issues as compiling
-programs in bulk, testing compiled programs for compatibility with the
-interpreter, and controlling.
+The code generated in this way is not guaranteed to work. The whole
+codegen suite (C<perlcc> included) should be considered B<very>
+experimental. Use for production purposes is strongly discouraged.
-=head1 OPTIONS
+=head1 OPTIONS
=over 4
-=item -L < library_directories >
-
-Adds directories in B<library_directories> to the compilation command.
-
-=item -I < include_directories >
-
-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 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 >
-
-Explicitly gives the name B<executable_name> to the executable which is to be
-compiled. Can only be used if compiling one file on the command line.
-
-=item -e < perl_line_to_execute>
-
-Compiles 'one liners', in the same way that B<perl -e> runs text strings at
-the command line. Default is to have the 'one liner' be compiled, and run all
-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
+=item -LI<library directories>
-Generates bytecode instead of C code.
+Adds the given directories to the library search path when C code is
+passed to your C compiler.
-=item -opt
+=item -II<include directories>
-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.
+Adds the given directories to the include file search path when C code is
+passed to your C compiler; when using the Perl bytecode option, adds the
+given directories to Perl's include path.
-=item -regex <rename_regex>
+=item -o I<output file name>
-Gives a rule B<rename_regex> - which is a legal perl regular expression - to
-create executable file names.
+Specifies the file name for the final compiled executable.
-=item -verbose <verbose_level>
+=item -c I<C file name>
-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 :
+Create C code only; do not compile to a standalone binary.
- Bit 1(g): Code Generation Errors to STDERR
- Bit 2(a): Compilation Errors to STDERR
- Bit 4(t): Descriptive text to STDERR
- Bit 8(f): Code Generation Errors to file (B<-log> flag needed)
- Bit 16(c): Compilation Errors to file (B<-log> flag needed)
- Bit 32(d): Descriptive text to file (B<-log> flag needed)
+=item -e I<perl code>
-If the B<-log> tag is given, the default verbose level is 63 (ie: mirroring
-all of perlcc's output to both the screen and to a log file). If no B<-log>
-tag is given, then the default verbose level is 7 (ie: outputting all of
-perlcc's output to STDERR).
+Compile a one-liner, much the same as C<perl -e '...'>
-NOTE: Because of buffering concerns, you CANNOT shadow the output of '-run' to
-both a file, and to the screen! Suggestions are welcome on how to overcome this
-difficulty, but for now it simply does not work properly, and hence will only go
-to the screen.
+=item -S
-=item -log <logname>
+Do not delete generated C code after compilation.
-Opens, for append, a logfile to save some or all of the text for a given
-compile command. No rewrite version is available, so this needs to be done
-manually.
+=item -B
-=item -argv <arguments>
+Use the Perl bytecode code generator.
-In combination with C<-run> or C<-e>, tells perlcc to run the resulting
-executable with the string B<arguments> as @ARGV.
+=item -O
-=item -sav
+Use the 'optimised' C code generator. This is more experimental than
+everything else put together, and the code created is not guaranteed to
+compile in finite time and memory, or indeed, at all.
-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 C<-e> operator, you need to tell perlcc where to
-save resulting executables.
+=item -v
-=item -gen
+Increase verbosity of output; can be repeated for more verbose output.
-Tells perlcc to only create the intermediate C code, and not compile the
-results. Does an implicit B<-sav>, saving the C code rather than deleting it.
+=item -r
-=item -run
+Run the resulting compiled script after compiling it.
-Immediately run the perl code that has been generated. NOTE: IF YOU GIVE THE
-B<-run> FLAG TO B<perlcc>, THEN THE REST OF @ARGV WILL BE INTERPRETED AS
-ARGUMENTS TO THE PROGRAM THAT YOU ARE COMPILING.
+=item -log
-=item -prog
-
-Indicate that the programs at the command line are programs, and should be
-compiled as such. B<perlcc> will automatically determine files to be
-programs if they have B<.p>, B<.pl>, B<.bat> extensions.
-
-=item -mod
-
-Indicate that the programs at the command line are modules, and should be
-compiled as such. B<perlcc> will automatically determine files to be
-modules if they have the extension B<.pm>.
+Log the output of compiling to a file rather than to stdout.
=back
-=head1 ENVIRONMENT
-
-Most of the work of B<perlcc> is done at the command line. However, you can
-change the heuristic which determines what is a module and what is a program.
-As indicated above, B<perlcc> assumes that the extensions:
-
-.p$, .pl$, and .bat$
-
-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
-creating an executable.
-
-To change the extensions which are programs, and which are modules, set the
-environmental variables:
-
-PERL_SCRIPT_EXT
-PERL_MODULE_EXT
-
-These two environmental variables take colon-separated, legal perl regular
-expressions, and are used by perlcc to decide which objects are which.
-For example:
-
-setenv PERL_SCRIPT_EXT '.prl$:.perl$'
-prompt% perlcc sample.perl
-
-will compile the script 'sample.perl' into the executable 'sample', and
-
-setenv PERL_MODULE_EXT '.perlmod$:.perlmodule$'
-
-prompt% perlcc sample.perlmod
-
-will compile the module 'sample.perlmod' into the shared object
-'sample.so'
-
-NOTE: the '.' in the regular expressions for PERL_SCRIPT_EXT and PERL_MODULE_EXT
-is a literal '.', and not a wild-card. To get a true wild-card, you need to
-backslash the '.'; as in:
-
-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
-text and compile it. This temporary file is 'perlc$$.p'. The temporary C code is
-perlc$$.p.c, and the temporary executable is perlc$$.
-
-When you use '-run' and don't save your executable, the temporary executable is
-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
-in future.
-
-Bugs in the various compiler backends still exist, and are perhaps too
-numerous to list here.
-
=cut
!NO!SUBS!
diff --git a/gnu/usr.bin/perl/vmesa/vmesa.c b/gnu/usr.bin/perl/vmesa/vmesa.c
index 0e7894aeb95..8bc733b5b74 100644
--- a/gnu/usr.bin/perl/vmesa/vmesa.c
+++ b/gnu/usr.bin/perl/vmesa/vmesa.c
@@ -121,7 +121,6 @@ do_aspawn(SV* really, SV **mark, SV **sp)
status = FAIL;
if (sp > mark)
{
- dTHR;
New(401,PL_Argv, sp - mark + 1, char*);
a = PL_Argv;
while (++mark <= sp)
@@ -182,11 +181,13 @@ do_aspawn(SV* really, SV **mark, SV **sp)
/* be used by my_pclose */
/*---------------------------------------------*/
close(fd);
+ MUTEX_LOCK(&PL_fdpid_mutex);
p_sv = av_fetch(PL_fdpid,fd,TRUE);
fd = (int) SvIVX(*p_sv);
SvREFCNT_dec(*p_sv);
*p_sv = &PL_sv_undef;
sv = *av_fetch(PL_fdpid,fd,TRUE);
+ MUTEX_UNLOCK(&PL_fdpid_mutex);
(void) SvUPGRADE(sv, SVt_IV);
SvIVX(sv) = pid;
status = 0;
@@ -284,7 +285,6 @@ do_spawn(char *cmd, int execf)
(const char **) environ);
if (pid < 0)
{
- dTHR;
status = FAIL;
if (ckWARN(WARN_EXEC))
warner(WARN_EXEC,"Can't exec \"%s\": %s",
@@ -408,11 +408,13 @@ my_popen(char *cmd, char *mode)
Perl_stdin_fd = pFd[that];
if (strNE(cmd,"-"))
{
- PERL_FLUSHALL_FOR_CHILD;
+ PERL_FLUSHALL_FOR_CHILD;
pid = spawn_cmd(cmd, Perl_stdin_fd, Perl_stdout_fd);
if (pid >= 0)
{
+ MUTEX_LOCK(&PL_fdpid_mutex);
sv = *av_fetch(PL_fdpid,pFd[this],TRUE);
+ MUTEX_UNLOCK(&PL_fdpid_mutex);
(void) SvUPGRADE(sv, SVt_IV);
SvIVX(sv) = pid;
fd = PerlIO_fdopen(pFd[this], mode);
@@ -423,7 +425,9 @@ my_popen(char *cmd, char *mode)
}
else
{
+ MUTEX_LOCK(&PL_fdpid_mutex);
sv = *av_fetch(PL_fdpid,pFd[that],TRUE);
+ MUTEX_UNLOCK(&PL_fdpid_mutex);
(void) SvUPGRADE(sv, SVt_IV);
SvIVX(sv) = pFd[this];
fd = PerlIO_fdopen(pFd[this], mode);
@@ -460,7 +464,9 @@ my_pclose(FILE *fp)
SV **sv;
FILE *other;
+ MUTEX_LOCK(&PL_fdpid_mutex);
sv = av_fetch(PL_fdpid,PerlIO_fileno(fp),TRUE);
+ MUTEX_UNLOCK(&PL_fdpid_mutex);
pid = (int) SvIVX(*sv);
SvREFCNT_dec(*sv);
*sv = &PL_sv_undef;
diff --git a/gnu/usr.bin/perl/vms/descrip_mms.template b/gnu/usr.bin/perl/vms/descrip_mms.template
index 77772c95eff..12c776add9f 100644
--- a/gnu/usr.bin/perl/vms/descrip_mms.template
+++ b/gnu/usr.bin/perl/vms/descrip_mms.template
@@ -22,6 +22,7 @@
#### Start of system configuration section. ####
~DECC~
+~DECCXX~
~GNUC~
~ARCH-TYPE~ = 1
~THREAD~
@@ -131,7 +132,11 @@ DBGSPECFLAGS = /Show=All
@ If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").eqs."" Then Define/NoLog SYS DECC$Library_Include
.endif
+.ifdef DECCXX
+XTRACCFLAGS = /Include=[]/Standard=ANSI/Prefix=All/Obj=$(OBJVAL)
+.else
XTRACCFLAGS = /Include=[]/Standard=Relaxed_ANSI/Prefix=All/Obj=$(OBJVAL)
+.endif
XTRADEF =
POSIX = POSIX
.endif
@@ -218,6 +223,7 @@ NOOP = continue
# are built using these macros should depend on $(MINIPERL_EXE)
MINIPERL_EXE = Sys$Disk:[]miniperl$(E)
MINIPERL = MCR $(MINIPERL_EXE) "-I[.lib]"
+MINIPERLQ = MCR $(MINIPERL_EXE) ""-I[.lib]""
XSUBPP = $(MINIPERL) "-I[.ext.re]" [.lib.extutils]xsubpp -noprototypes
# Macro to invoke a preexisting copy of Perl. This is used to regenerate
# some header files when rebuilding Perl, but premade versions are provided
@@ -266,13 +272,13 @@ FULLLIBS2 = $(LIBS2)|$(THRLIBS1)|$(THRLIBS2)
#### End of system configuration section. ####
c0 = $(MALLOC_C) $(SOCKC) av.c deb.c doio.c doop.c dump.c globals.c gv.c
-c1 = hv.c mg.c miniperlmain.c op.c perl.c perlio.c perly.c pp.c pp_ctl.c
+c1 = hv.c mg.c miniperlmain.c op.c perl.c perlapi.c perlio.c perly.c pp.c pp_ctl.c
c2 = pp_hot.c pp_sys.c regcomp.c regexec.c run.c scope.c sv.c taint.c
c3 = toke.c universal.c utf8.c util.c vms.c xsutils.c
c = $(c0) $(c1) $(c2) $(c3)
obj0 = $(MALLOC_O) $(SOCKO) av$(O) deb$(O) doio$(O) doop$(O) dump$(O)
-obj1 = globals$(O) gv$(O) hv$(O) mg$(O) miniperlmain$(O) op$(O) perl$(O)
+obj1 = globals$(O) gv$(O) hv$(O) mg$(O) miniperlmain$(O) op$(O) perl$(O) perlapi$(O)
obj2 = perlio$(O) perly$(O) pp$(O) pp_ctl$(O) pp_hot$(O) pp_sys$(O) regcomp$(O)
obj3 = regexec$(O) run$(O) scope$(O) sv$(O) taint$(O) toke$(O) universal$(O)
obj4 = utf8$(O) util$(O) vms$(O) xsutils$(O)
@@ -299,7 +305,11 @@ ac8 = $(ARCHCORE)perlapi.h $(ARCHCORE)perlio.h $(ARCHCORE)perlsdio.h
ac9 = $(ARCHCORE)perlvars.h $(ARCHCORE)perly.h $(ARCHCORE)pp.h
ac10 = $(ARCHCORE)pp_proto.h $(ARCHCORE)proto.h $(ARCHCORE)regcomp.h
ac11 = $(ARCHCORE)regexp.h $(ARCHCORE)regnodes.h $(ARCHCORE)scope.h
+.ifdef SOCKARCH
ac12 = $(ARCHCORE)sv.h $(ARCHCORE)thrdvar.h $(SOCKARCH)
+.else
+ac12 = $(ARCHCORE)sv.h $(ARCHCORE)thrdvar.h
+.endif
ac13 = $(ARCHCORE)thread.h $(ARCHCORE)utf8.h $(ARCHCORE)util.h
ac14 = $(ARCHCORE)vmsish.h $(ARCHCORE)warnings.h $(ARCHCORE)xsub.h
acopt = $(ARCHCORE)perlshr_attr.opt $(ARCHCORE)$(DBG)perlshr_bld.opt
@@ -327,21 +337,23 @@ CRTLOPTS =,$(CRTL)/Options
.endif
# Modules which must be installed before we can build extensions
-LIBPREREQ = $(ARCHDIR)Config.pm [.lib]DynaLoader.pm [.lib]XSLoader.pm [.lib]vmsish.pm [.lib.VMS]Filespec.pm [.lib.ExtUtils]XSSymSet.pm
+LIBPREREQ = $(ARCHDIR)Config.pm [.lib.VMS]Filespec.pm [.lib]DynaLoader.pm [.lib]XSLoader.pm [.lib]vmsish.pm [.lib.ExtUtils]XSSymSet.pm $(ARCHDIR)vmspipe.com [.lib]re.pm
utils1 = [.lib.pod]perldoc.com [.lib.ExtUtils]Miniperl.pm [.utils]c2ph.com [.utils]h2ph.com [.utils]h2xs.com [.lib]perlbug.com [.lib]perlcc.com [.utils]dprofpp.com
utils2 = [.lib]splain.com [.utils]pl2pm.com
.ifdef NOX2P
all : base extras archcorefiles preplibrary perlpods
- @ $(NOOP)
+ @ write sys$output " "
+ @ write sys$output " Everything is up to date. '$(MMS)$(MMSQUALIFIERS) test' to run test suite."
.else
all : base extras x2p archcorefiles preplibrary perlpods
- @ $(NOOP)
+ @ write sys$output " "
+ @ write sys$output " Everything is up to date. '$(MMS)$(MMSQUALIFIERS) test' to run test suite."
.endif
base : miniperl perl
@ $(NOOP)
-extras : dynext libmods utils podxform
+extras : dynext libmods utils podxform extra.pods
@ $(NOOP)
libmods : $(LIBPREREQ)
@ $(NOOP)
@@ -351,6 +363,8 @@ podxform : [.lib.pod]pod2text.com [.lib.pod]pod2html.com [.lib.pod]pod2latex.com
@ $(NOOP)
x2p : [.x2p]a2p$(E) [.x2p]s2p.com [.x2p]find2perl.com
@ $(NOOP)
+extra.pods : miniperl
+ @ @extra_pods.com
pod0 = [.lib.pod]perl.pod [.lib.pod]perl5004delta.pod [.lib.pod]perl5005delta.pod
pod1 = [.lib.pod]perlapi.pod [.lib.pod]perlapio.pod [.lib.pod]perlbook.pod
@@ -382,7 +396,13 @@ perlpods : $(pod)
archcorefiles : $(ac) $(acth) $(ARCHAUTO)time.stamp
@ $(NOOP)
-miniperl : $(DBG)miniperl$(E)
+[.lib]re.pm : [.ext.re]re.pm
+ copy/log $(MMS$SOURCE) $(MMS$TARGET)
+
+vmspipe.com : [.vms]vmspipe.com
+ copy/log $(MMS$SOURCE) $(MMS$TARGET)
+
+miniperl : $(DBG)miniperl$(E) vmspipe.com
@ Continue
$(MINIPERL_EXE) : miniperlmain$(O), $(DBG)libperl$(OLB) $(CRTL)
Link $(LINKFLAGS)/NoDebug/Trace/NoMap/NoFull/NoCross/Exe=$(MMS$TARGET) miniperlmain$(O), $(DBG)libperl$(OLB)/Library/Include=globals $(CRTLOPTS)
@@ -449,6 +469,9 @@ $(ARCHDIR)config.pm : [.lib]config.pm
[.lib]config.pm : config.h $(MINIPERL_EXE)
$(MINIPERL) ConfigPM.
+$(ARCHDIR)vmspipe.com : vmspipe.com
+ Copy $(MMS$SOURCE) $(MMS$TARGET)
+
[.ext.dynaloader]dl_vms.c : [.ext.dynaloader]dl_vms.xs $(ARCHDIR)Config.pm [.lib.ExtUtils]XSSymSet.pm $(MINIPERL_EXE)
$(XSUBPP) $(MMS$SOURCE) >$(MMS$TARGET)
@@ -474,7 +497,7 @@ $(ARCHDIR)config.pm : [.lib]config.pm
@ Rename/Log xsloader.pm [.ext.dynaloader]
dynext : $(LIBPREREQ) $(DBG)perlshr$(E)
- @build_ext "$(dynamic_ext)" "$(MINIPERL_EXE)" "$(MMS)"
+ @make_ext "$(dynamic_ext)" "$(MINIPERL_EXE)" "$(MMS)"
[.lib]vmsish.pm : [.vms.ext]vmsish.pm
Copy/Log/NoConfirm $(MMS$SOURCE) $(MMS$TARGET)
@@ -792,7 +815,7 @@ preplibrary : $(MINIPERL_EXE) $(LIBPREREQ) $(SOCKPM)
[.lib.pod]perlxstut.pod : [.pod]perlxstut.pod
@ If F$Search("[.lib]pod.dir").eqs."" Then Create/Directory [.lib.pod]
Copy/Log $(MMS$SOURCE) $(MMS$TARGET)
-[.lib.pod]win32.pod : [.pod]win32.pod
+[.lib.pod]win32.pod : [.lib]win32.pod
@ If F$Search("[.lib]pod.dir").eqs."" Then Create/Directory [.lib.pod]
Copy/Log $(MMS$SOURCE) $(MMS$TARGET)
[.lib.pod]perlvms.pod : [.vms]perlvms.pod
@@ -876,8 +899,12 @@ perly$(O) : perly.c, perly.h, $(h)
[.t.lib]vmsish.t : [.vms.ext]vmsish.t
Copy/Log/NoConfirm $(MMS$SOURCE) $(MMS$TARGET)
+check : test
+ @ Continue
+
test : all [.t.lib]vmsfspec.t [.t.lib]vmsish.t
- @[.VMS]Test.Com "$(E)" "$(__DEBUG__)"
+ @ $(MINIPERL) -e "print ""Ran tests"";" > [.t]rantests.
# install ought not need a source, but it doesn't work if one's not
# there. Go figure...
@@ -1083,6 +1110,8 @@ gv$(O) : gv.c extern.h perl.h config.h embed.h handy.h vmsish.h $(SOCKH) iperlsy
$(CC) $(CORECFLAGS) $(MMS$SOURCE)
hv$(O) : hv.c extern.h perl.h config.h embed.h handy.h vmsish.h $(SOCKH) iperlsys.h perlsdio.h perl.h regexp.h sv.h util.h form.h gv.h cv.h opnames.h op.h cop.h av.h hv.h mg.h scope.h warnings.h utf8.h perly.h thread.h pp.h proto.h pp_proto.h opcode.h embedvar.h intrpvar.h thrdvar.h perlvars.h patchlevel.h
$(CC) $(CORECFLAGS) $(MMS$SOURCE)
+malloc$(O) : malloc.c extern.h perl.h config.h embed.h handy.h vmsish.h $(SOCKH) iperlsys.h perlsdio.h perl.h regexp.h sv.h util.h form.h gv.h cv.h opnames.h op.h cop.h av.h hv.h mg.h scope.h warnings.h utf8.h perly.h thread.h pp.h proto.h pp_proto.h opcode.h embedvar.h intrpvar.h thrdvar.h perlvars.h patchlevel.h
+ $(CC) $(CORECFLAGS) $(MMS$SOURCE)
mg$(O) : mg.c extern.h perl.h config.h embed.h handy.h vmsish.h $(SOCKH) iperlsys.h perlsdio.h perl.h regexp.h sv.h util.h form.h gv.h cv.h opnames.h op.h cop.h av.h hv.h mg.h scope.h warnings.h utf8.h perly.h thread.h pp.h proto.h pp_proto.h opcode.h embedvar.h intrpvar.h thrdvar.h perlvars.h patchlevel.h
$(CC) $(CORECFLAGS) $(MMS$SOURCE)
miniperlmain$(O) : miniperlmain.c extern.h perl.h config.h embed.h handy.h vmsish.h $(SOCKH) iperlsys.h perlsdio.h perl.h regexp.h sv.h util.h form.h gv.h cv.h opnames.h op.h cop.h av.h hv.h mg.h scope.h warnings.h utf8.h perly.h thread.h pp.h proto.h pp_proto.h opcode.h embedvar.h intrpvar.h thrdvar.h perlvars.h patchlevel.h
@@ -1091,6 +1120,8 @@ op$(O) : op.c extern.h perl.h config.h embed.h handy.h vmsish.h $(SOCKH) iperlsy
$(CC) $(CORECFLAGS) $(MMS$SOURCE)
perl$(O) : perl.c extern.h perl.h config.h embed.h handy.h vmsish.h $(SOCKH) iperlsys.h perlsdio.h perl.h regexp.h sv.h util.h form.h gv.h cv.h opnames.h op.h cop.h av.h hv.h mg.h scope.h warnings.h utf8.h perly.h thread.h pp.h proto.h pp_proto.h opcode.h embedvar.h intrpvar.h thrdvar.h perlvars.h patchlevel.h patchlevel.h intrpvar.h thrdvar.h
$(CC) $(CORECFLAGS) $(MMS$SOURCE)
+perlapi$(O) : perlapi.c extern.h perl.h config.h embed.h handy.h vmsish.h $(SOCKH) iperlsys.h perlsdio.h perl.h regexp.h sv.h util.h form.h gv.h cv.h opnames.h op.h cop.h av.h hv.h mg.h scope.h warnings.h utf8.h perly.h thread.h pp.h proto.h pp_proto.h opcode.h embedvar.h intrpvar.h thrdvar.h perlvars.h patchlevel.h patchlevel.h intrpvar.h thrdvar.h
+ $(CC) $(CORECFLAGS) $(MMS$SOURCE)
perlio$(O) : perlio.c config.h extern.h perl.h config.h embed.h handy.h vmsish.h $(SOCKH) iperlsys.h perlsdio.h perl.h regexp.h sv.h util.h form.h gv.h cv.h opnames.h op.h cop.h av.h hv.h mg.h scope.h warnings.h utf8.h perly.h thread.h pp.h proto.h pp_proto.h opcode.h embedvar.h intrpvar.h thrdvar.h perlvars.h patchlevel.h
$(CC) $(CORECFLAGS) $(MMS$SOURCE)
perlmain$(O) : perlmain.c extern.h perl.h config.h embed.h handy.h vmsish.h $(SOCKH) iperlsys.h perlsdio.h perl.h regexp.h sv.h util.h form.h gv.h cv.h opnames.h op.h cop.h av.h hv.h mg.h scope.h warnings.h utf8.h perly.h thread.h pp.h proto.h pp_proto.h opcode.h embedvar.h intrpvar.h thrdvar.h perlvars.h patchlevel.h
@@ -1155,11 +1186,35 @@ $(CRTL) : $(MAKEFILE)
@ @[.vms]genopt "$(CRTL)/Write" "|" "$(LIBS1)|$(FULLLIBS2)|$(SOCKLIB)"
+ok : $(utils)
+ $(MINIPERL) lib/perlbug.com -ok -s "(UNINSTALLED)"
+
+okfile : $(utils)
+ $(MINIPERL) lib/perlbug.com -ok -s "(UNINSTALLED)" "-F" perl.ok
+
+nok : $(utils)
+ @ write sys$output " "
+ @ write sys$output " Please type the command:"
+ @ write sys$output " "
+ @ write sys$output "$(MINIPERLQ) lib/perlbug.com -nok -s ""(UNINSTALLED)"""
+
+nokfile : $(utils)
+ @ write sys$output " "
+ @ write sys$output " Please type the command:"
+ @ write sys$output " "
+ @ write sys$output "$(MINIPERLQ) lib/perlbug.com -nok -s ""(UNINSTALLED)"" ""-F"" perl.nok"
+
+
cleanlis :
- If F$Search("*.Lis").nes."" Then Delete/NoConfirm/Log *.Lis;*
- If F$Search("*.CPP").nes."" Then Delete/NoConfirm/Log *.CPP;*
- If F$Search("*.Map").nes."" Then Delete/NoConfirm/Log *.Map;*
+cleantest :
+ - If F$Search("[.t]Perl.").nes."" Then Delete/NoConfirm/Log [.t]Perl.;*
+ - If F$Search("[.t]VMSPIPE.COM").nes."" Then Delete/NoConfirm/Log [.t]VMSPIPE.COM;*
+ - If F$Search("[.t]Echo.exe").nes."" Then Delete/NoConfirm/Log [.t]Echo.exe;*
+
tidy : cleanlis
- If F$Search("[...]*.Opt;-1").nes."" Then Purge/NoConfirm/Log [...]*.Opt
- If F$Search("[...]*$(O);-1").nes."" Then Purge/NoConfirm/Log [...]*$(O)
@@ -1196,8 +1251,8 @@ tidy : cleanlis
- If F$Search("[.x2p]*.com;-1").nes."" Then Purge/NoConfirm/Log [.x2p]*.com
- If F$Search("[.lib.pod]*.com;-1").nes."" Then Purge/NoConfirm/Log [.lib.pod]*.com
-clean : tidy
- - @build_ext "$(dynamic_ext)" "$(MINIPERL_EXE)" "$(MMS)" clean
+clean : tidy cleantest
+ - @make_ext "$(dynamic_ext)" "$(MINIPERL_EXE)" "$(MMS)" clean
- If F$Search("*.Opt").nes."" Then Delete/NoConfirm/Log *.Opt;*/Exclude=PerlShr_*.Opt
- If F$Search("[...]*$(O);*") .nes."" Then Delete/NoConfirm/Log [...]*$(O);*
- If F$Search(F$Parse("Sys$Disk:[]","$(SOCKH)")).nes."" Then Delete/NoConfirm/Log $(SOCKH);*
@@ -1220,16 +1275,18 @@ clean : tidy
- If F$Search("[.VMS.Ext...]*.C").nes."" Then Delete/NoConfirm/Log [.VMS.Ext...]*.C;*
- If F$Search("[.VMS.Ext...]*$(O)").nes."" Then Delete/NoConfirm/Log [.VMS.Ext...]*$(O);*
- If F$Search("[.pod]*.com").nes."" Then Delete/NoConfirm/Log [.pod]*.com;*
+ - @extra_pods CLEAN
realclean : clean
- - @build_ext "$(dynamic_ext)" "$(MINIPERL_EXE)" "$(MMS)" realclean
+ - @make_ext "$(dynamic_ext)" "$(MINIPERL_EXE)" "$(MMS)" realclean
- If F$Search("*$(OLB)").nes."" Then Delete/NoConfirm/Log *$(OLB);*
- If F$Search("*.Opt").nes."" Then Delete/NoConfirm/Log *.Opt;*
- If F$Search("Config.H").nes."" Then Delete/NoConfirm/Log Config.H;*
- If F$Search("Config.SH").nes."" Then Delete/NoConfirm/Log Config.SH;*
- $(MINIPERL) -e "use File::Path; rmtree(\@ARGV,1,0);" config
- If F$Search("Descrip.MMS").nes."" Then Delete/NoConfirm/Log Descrip.MMS;*
- - If F$Search("Build_Ext.Com").nes."" Then Delete/NoConfirm/Log Build_Ext.Com;*
+ - If F$Search("make_ext.Com").nes."" Then Delete/NoConfirm/Log make_ext.Com;*
+ - If F$Search("extra_pods.Com").nes."" Then Delete/NoConfirm/Log extra_pods.Com;*
- $(MINIPERL) -e "use File::Path; rmtree(['lib/auto','lib/VMS','lib/$(ARCH)'],1,0);"
- If F$Search("*.TS").nes."" Then Delete/NoConfirm/Log *.TS;*
- If F$Search("[.Lib]DynaLoader.pm").nes."" Then Delete/NoConfirm/Log [.Lib]DynaLoader.pm;*
@@ -1249,6 +1306,7 @@ realclean : clean
- If F$Search("[.t.lib]vms*.t").nes."" Then Delete/NoConfirm/Log [.t.lib]vms*.t;*
- If F$Search("[...]*$(E)").nes."" Then Delete/NoConfirm/Log [...]*$(E);*
- If F$Search("[.vms]Perl_Setup.Com").nes."" Then Delete/NoConfirm/Log [.vms]Perl_Setup.Com;*
+ - If F$Search("[.t]rantests.").nes."" Then Delete/NoConfirm/Log [.t]rantests.;*
cleansrc : clean
!GROK!THIS!
diff --git a/gnu/usr.bin/perl/vms/ext/Stdio/Makefile.PL b/gnu/usr.bin/perl/vms/ext/Stdio/Makefile.PL
index f5599f8a965..4e17a480822 100644
--- a/gnu/usr.bin/perl/vms/ext/Stdio/Makefile.PL
+++ b/gnu/usr.bin/perl/vms/ext/Stdio/Makefile.PL
@@ -1,5 +1,5 @@
use ExtUtils::MakeMaker;
WriteMakefile( 'VERSION_FROM' => 'Stdio.pm',
- 'MAN3PODS' => ' ', # pods will be built later
+ 'MAN3PODS' => {}, # pods will be built later
);
diff --git a/gnu/usr.bin/perl/vms/munchconfig.c b/gnu/usr.bin/perl/vms/munchconfig.c
index 158de3caf5d..82768db12ce 100644
--- a/gnu/usr.bin/perl/vms/munchconfig.c
+++ b/gnu/usr.bin/perl/vms/munchconfig.c
@@ -345,8 +345,7 @@ tilde_sub(char LineBuffer[], Translate TildeSub[], int TildeSubCount)
} else {
/* 'Kay, not a tilde. Is it a word character? */
- if (isalnum(LineBuffer[TildeLoop]) || (LineBuffer[TildeLoop] =
- '-') ||
+ if (isalnum(LineBuffer[TildeLoop]) ||
(LineBuffer[TildeLoop] == '-')) {
TempTilde[TildeBufferLength++] = LineBuffer[TildeLoop];
} else {
diff --git a/gnu/usr.bin/perl/vms/vmspipe.com b/gnu/usr.bin/perl/vms/vmspipe.com
new file mode 100644
index 00000000000..28caa745e73
--- /dev/null
+++ b/gnu/usr.bin/perl/vms/vmspipe.com
@@ -0,0 +1,20 @@
+$! 'f$verify(0)
+$! --- protect against nonstandard definitions ---
+$ perl_define = "define/nolog"
+$ perl_on = "on error then exit $STATUS"
+$ perl_exit = "exit"
+$ perl_del = "delete"
+$ pif = "if"
+$! --- define i/o redirection (sys$output set by lib$spawn)
+$ pif perl_popen_in .nes. "" then perl_define/user/name_attributes=confine sys$input 'perl_popen_in'
+$ pif perl_popen_err .nes. "" then perl_define/user/name_attributes=confine sys$error 'perl_popen_err'
+$ pif perl_popen_out .nes. "" then perl_define sys$output 'perl_popen_out'
+$ cmd = perl_popen_cmd
+$! --- get rid of global symbols
+$ perl_del/symbol/global perl_popen_in
+$ perl_del/symbol/global perl_popen_err
+$ perl_del/symbol/global perl_popen_out
+$ perl_del/symbol/global perl_popen_cmd
+$ perl_on
+$ 'cmd
+$ perl_exit '$STATUS'
diff --git a/gnu/usr.bin/perl/vos/Changes b/gnu/usr.bin/perl/vos/Changes
index 9af03d1c5f8..8181c7af2ef 100644
--- a/gnu/usr.bin/perl/vos/Changes
+++ b/gnu/usr.bin/perl/vos/Changes
@@ -1,6 +1,32 @@
This file documents the changes made to port Perl to the Stratus
VOS operating system.
+For 5.6.1:
+ Updated "build.cm" to build perl using either the alpha or GA
+ version of POSIX.
+ Updated "Changes".
+ Updated "compile_perl.cm" to use either the alpha or GA
+ version of POSIX.
+ Split "config.def" into config.alpha.def and config.ga.def;
+ one for each version. Use the configure_perl.cm macro
+ to select the appropriate version.
+ Split "config.h" into config.alpha.h and config.ga.h. Use the
+ configure_perl.cm macro to select the appropriate version.
+ Updated "config.pl". It now diagnoses undefined (missing) and
+ unused substitution variables. When a new version of
+ Perl comes out, run "configure_perl.cm", add any missing
+ definitions to config.*.def, and remove any unused
+ definitions.
+ Removed "config_h.SH_orig". It is no longer needed.
+ Added "configure_perl.cm". It is used to configure perl so that
+ it can be built with either version of VOS POSIX.1 support.
+ Added "install_perl.cm" to install Perl into the appropriate
+ system directories.
+ Updated "perl.bind" to work with either the alpha or GA
+ version of POSIX.
+ Updated "vosish.h" to just use the standard "unixish.h" since
+ there are no changes needed at this time.
+
After 5.005_63:
Supplied "config.pl" perl script that takes "config_h.SH_orig"
and "config.def" as input and produces "config.h.new".
diff --git a/gnu/usr.bin/perl/vos/build.cm b/gnu/usr.bin/perl/vos/build.cm
index 8719d050c48..04e880cd902 100644
--- a/gnu/usr.bin/perl/vos/build.cm
+++ b/gnu/usr.bin/perl/vos/build.cm
@@ -2,6 +2,8 @@
cpu option(-processor)name,allow(mc68020,i80860,pa7100,pa8000),=mc68020
recompile switch(-recompile),=1
rebind switch(-rebind),=1
+ tgt_mod option(-target_module)module_name,='(current_module)'
+ version option(-version)name,allow(alpha,ga),=ga
&end_parameters
&echo command_lines
&
@@ -11,14 +13,22 @@
& necessary, to assign the correct pathname of the directory that
& contains VOS POSIX.1 support.
&
-&set_string POSIX >vos_ftp_site>pub>vos>alpha>posix
+&if &version& = alpha
+&then &set_string POSIX >vos_ftp_site>pub>vos>alpha>posix
+&else &set_string POSIX >system>posix_object_library
&
& See if the site has VOS POSIX.1 support loaded. If not, quit now.
&
&if ^ (exists &POSIX& -directory)
&then &do
&display_line build: VOS POSIX.1 support not found. &POSIX&
- &return
+ &return 1
+ &end
+&
+&if &cpu& = mc68020 & &version& = ga | &cpu& = i80860 & &version& = ga
+&then &do
+ &display_line build: "-version ga" is incompatible with "-processor mc68020 or i80860"
+ &return 1
&end
&
& Set up the appropriate directory suffix for each architecture.
@@ -43,7 +53,11 @@
&if &recompile& = 0
&then &goto CHECK_REBIND
&
-!set_library_paths include << < &POSIX&>incl &+
+&if &version& = alpha
+&then !set_library_paths include << < &POSIX&>incl &+
+ (master_disk)>system>include_library
+&else !set_library_paths include << < &+
+ (master_disk)>system>stcp>include_library &+
(master_disk)>system>include_library
&
&if (exists *.obj -link)
@@ -52,7 +66,12 @@
& Suppress several harmless compiler warning and advice messages.
& Use -list -show_include all -show_macros both_ways when debugging.
&
-&set_string cflags '-u -O4 -D_POSIX_C_SOURCE=199309L -DPERL_CORE'
+&set_string cflags '-u -O4 -D_POSIX_C_SOURCE=199506L -DPERL_CORE'
+&
+& The following is a work-around for stcp-1437,8,9
+&
+&if &version& = ga
+&then &set_string cflags &cflags& -D_BSD_SOURCE
&
!cc <<av.c -suppress_diag 2006 2064 2065 &cpu& &cflags&
&if (command_status) ^= 0 &then &return
@@ -76,15 +95,26 @@
& &if (command_status) ^= 0 &then &return
!cc <<mg.c -suppress_diag 2006 2064 2065 &cpu& &cflags&
&if (command_status) ^= 0 &then &return
-!cc <<miniperlmain.c -suppress_diag 2006 &cpu& &cflags&
+!cc <<miniperlmain.c -suppress_diag 2006 2065 &cpu& &cflags&
&if (command_status) ^= 0 &then &return
!cc <<op.c -suppress_diag 2006 2064 2065 &cpu& &cflags&
&if (command_status) ^= 0 &then &return
+&
+& We are essentially building miniperl for now. Until we
+& get a POSIX shell on VOS we won't add any of the extensions.
+&
+& !link <<op.c opmini.c -delete
+& &if (command_status) ^= 0 &then &return
+& !cc opmini.c -suppress_diag 2006 2064 2065 &cpu& &cflags& -DPERL_EXTERNAL_GLOB
+& &if (command_status) ^= 0 &then &return
+& !unlink opmini.c
+& &if (command_status) ^= 0 &then &return
+&
!cc <<perl.c -suppress_diag 2006 2053 2065 &cpu& &cflags& &+
- -DARCHLIB="/system/ported/perl/lib/5.005&obj2&" &+
- -DARCHLIB_EXP="/system/ported/perl/lib/5.005&obj2&" &+
- -DSITEARCH="/system/ported/perl/lib/site/5.005&obj2&" &+
- -DSITEARCH_EXP="/system/ported/perl/lib/site/5.005&obj2&"
+ -DARCHLIB="/system/ported/perl/lib/5.6&obj2&" &+
+ -DARCHLIB_EXP="/system/ported/perl/lib/5.6&obj2&" &+
+ -DSITEARCH="/system/ported/perl/lib/site/5.6&obj2&" &+
+ -DSITEARCH_EXP="/system/ported/perl/lib/site/5.6&obj2&"
&if (command_status) ^= 0 &then &return
!cc <<perlapi.c &cpu& &cflags&
&if (command_status) ^= 0 &then &return
@@ -126,8 +156,11 @@
&if (command_status) ^= 0 &then &return
!cc <<xsutils.c &cpu& &cflags&
&if (command_status) ^= 0 &then &return
+&if &version& = alpha
+&then &do
!cc <vos_dummies.c &cpu& -O4
&if (command_status) ^= 0 &then &return
+&end
&
& If requested, bind the executable program module.
&
@@ -139,6 +172,10 @@
&then &set_string tcp_objlib (master_disk)>system>tcp_os>object_library&obj2&
&else &set_string tcp_objlib (master_disk)>system>tcp_os>object_library
&
+&if (exists -directory (master_disk)>system>stcp>object_library&obj2&)
+&then &set_string stcp_objlib (master_disk)>system>stcp>object_library&obj2&
+&else &set_string stcp_objlib (master_disk)>system>stcp>object_library
+&
&if (exists -directory (master_disk)>system>object_library&obj2&)
&then &set_string objlib (master_disk)>system>object_library&obj2&
&else &set_string objlib (master_disk)>system>object_library
@@ -147,11 +184,28 @@
&then &set_string c_objlib (master_disk)>system>c_object_library&obj2&
&else &set_string c_objlib (master_disk)>system>c_object_library
&
-!set_library_paths object . &+
- &POSIX&>c>runtime>obj&obj& &+
+&if (exists -directory (master_disk)>system>posix_object_library&obj2&)
+&then &set_string posix_objlib (master_disk)>system>posix_object_library&obj2&
+&else &set_string posix_objlib (master_disk)>system>posix_object_library
+&
+&if &version& = alpha
+&then !set_library_paths object . &tcp_objlib& &+
&POSIX&>c>sysv_runtime>obj&obj& &+
- &tcp_objlib& &objlib& &c_objlib&
-!bind -control <perl.bind &cpu& -map
+ &POSIX&>c>runtime>obj&obj& &+
+ &c_objlib& &objlib&
+&else !set_library_paths object . &stcp_objlib& &+
+ &stcp_objlib&>common &+
+ &stcp_objlib&>net &+
+ &stcp_objlib&>sbsd &+
+ &stcp_objlib&>socket &+
+ &posix_objlib&>bsd &+
+ &posix_objlib& &+
+ &c_objlib& &objlib&
+&if &version& = alpha
+&then !bind -control <perl.bind vos_dummies &+
+ &tcp_objlib&>tcp_runtime &tcp_objlib&>tcp_gethost &+
+ &cpu& -target_module &tgt_mod& -map
+&else !bind -control <perl.bind &cpu& -target_module &tgt_mod& -map
&if (command_status) ^= 0 &then &return
!delete_file *.obj -no_ask -brief
!unlink *.obj -no_ask -brief
diff --git a/gnu/usr.bin/perl/vos/compile_perl.cm b/gnu/usr.bin/perl/vos/compile_perl.cm
index 86a8d6a182d..f8ecf3ba221 100644
--- a/gnu/usr.bin/perl/vos/compile_perl.cm
+++ b/gnu/usr.bin/perl/vos/compile_perl.cm
@@ -3,12 +3,15 @@
& build macro in that subdirectory to create the perl
& executable program module file.
& Written 99-02-03 by Paul Green (Paul_Green@stratus.com)
+& Modified 00-10-24 by Paul Green
&
&begin_parameters
- cpu option(-processor)name,allow(mc68020,i80860,pa7100,pa8000),=mc68020
+ cpu option(-processor)name,allow(mc68020,i80860,pa7100,pa8000),=pa7100
recompile switch(-recompile),=1
rebind switch(-rebind),=1
module option(-module)module_name,='(current_module)'
+ tgt_mod option(-target_module)module_name,='(current_module)'
+ version option(-version)name,allow(alpha,ga),=ga
&end_parameters
&echo command_lines
&
@@ -35,6 +38,9 @@
&if ^ (exists obj&obj&>build.out)
&then !create_file obj&obj&>build.out ; set_implicit_locking obj&obj&>build.out
&
+!configure_perl -version &version&
+&
!change_current_dir obj&obj&
-!start_process (string <build -processor &cpu& &recompile& &rebind&) -module &module&
+!start_process (string <build -processor &cpu& &recompile& &rebind& &+
+ -target_module &tgt_mod& -version &version&) -module &module&
!change_current_dir <
diff --git a/gnu/usr.bin/perl/vos/config.alpha.def b/gnu/usr.bin/perl/vos/config.alpha.def
new file mode 100644
index 00000000000..50d4e2e0e6c
--- /dev/null
+++ b/gnu/usr.bin/perl/vos/config.alpha.def
@@ -0,0 +1,492 @@
+$alignbytes='8'
+$aphostname=''
+$archlib=''
+$archlibexp=''
+$archname='vos'
+$bin='/system/ported/command_library'
+$binexp='/system/ported/command_library'
+$byteorder='4321'
+$castflags='0'
+$cf_by='Paul_Green@stratus.com'
+$cf_time='2001-02-12 21:00 UTC'
+$cpp_stuff='42'
+$cpplast='-'
+$cppminus='-'
+$cpprun='cc -E -'
+$cppstdin='cc -E'
+$crosscompile='undef'
+$d__fwalk='undef'
+$d_access='undef'
+$d_accessx='undef'
+$d_alarm='define'
+$d_archlib='undef'
+$d_atolf='undef'
+$d_atoll='undef'
+$d_attribut='undef'
+$d_bcmp='undef'
+$d_bcopy='undef'
+$d_bincompat5005='undef'
+$d_bsdgetpgrp='undef'
+$d_bsdsetpgrp='undef'
+$d_bzero='undef'
+$d_casti32='undef'
+$d_castneg='define'
+$d_charvspr='undef'
+$d_chown='undef'
+$d_chroot='undef'
+$d_chsize='undef'
+$d_const='define'
+$d_crypt='undef'
+$d_csh='undef'
+$d_cuserid='undef'
+$d_dbl_dig='define'
+$d_difftime='define'
+$d_dirnamlen='undef'
+$d_dlerror='undef'
+$d_dlsymun='undef'
+$d_dosuid='undef'
+$d_drand48proto='undef'
+$d_dup2='undef'
+$d_eaccess='undef'
+$d_endgrent='undef'
+$d_endhent='define'
+$d_endnent='define'
+$d_endpent='define'
+$d_endpwent='undef'
+$d_endsent='define'
+$d_eofnblk='define'
+$d_fchmod='define'
+$d_fchown='undef'
+$d_fcntl='define'
+$d_fcntl_can_lock='define'
+$d_fd_set='undef'
+$d_fgetpos='define'
+$d_flexfnam='define'
+$d_flock='undef'
+$d_fork='undef'
+$d_fpathconf='define'
+$d_fpos64_t='undef'
+$d_frexpl='undef'
+$d_fs_data_s='undef'
+$d_fseeko='undef'
+$d_fsetpos='define'
+$d_fstatfs='undef'
+$d_fstatvfs='undef'
+$d_fsync='undef'
+$d_ftello='undef'
+$d_Gconvert='sprintf((b),"%.*g",(n),(x))'
+$d_getcwd='define'
+$d_getespwnam='undef'
+$d_getfsstat='undef'
+$d_getgrent='undef'
+$d_getgrps='undef'
+$d_gethbyaddr='define'
+$d_gethbyname='define'
+$d_gethent='define'
+$d_gethname='define'
+$d_gethostprotos='define'
+$d_getlogin='define'
+$d_getmnt='undef'
+$d_getmntent='undef'
+$d_getnbyaddr='define'
+$d_getnbyname='define'
+$d_getnent='define'
+$d_getnetprotos='define'
+$d_getpagsz='undef'
+$d_getpbyname='define'
+$d_getpbynumber='define'
+$d_getpent='define'
+$d_getpgid='undef'
+$d_getpgrp2='undef'
+$d_getpgrp='define'
+$d_getppid='define'
+$d_getprior='undef'
+$d_getprotoprotos='define'
+$d_getprpwnam='undef'
+$d_getpwent='undef'
+$d_getsbyname='define'
+$d_getsbyport='define'
+$d_getsent='define'
+$d_getservprotos='define'
+$d_getspnam='undef'
+$d_gettimeod='undef'
+$d_gnulibc='undef'
+$d_grpasswd='undef'
+$d_hasmntopt='undef'
+$d_htonl='define'
+$d_iconv='undef'
+$d_index='undef'
+$d_inetaton='undef'
+$d_int64_t='undef'
+$d_isascii='define'
+$d_isnan='undef'
+$d_isnanl='undef'
+$d_killpg='undef'
+$d_lchown='undef'
+$d_ldbl_dig='define'
+$d_link='undef'
+$d_locconv='define'
+$d_lockf='define'
+$d_longdbl='define'
+$d_longlong='undef'
+$d_lseekproto='define'
+$d_lstat='define'
+$d_madvise='undef'
+$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_mkstemp='undef'
+$d_mkstemps='undef'
+$d_mkfifo='define'
+$d_mktime='define'
+$d_mmap='undef'
+$d_modfl='undef'
+$d_mprotect='undef'
+$d_msg='undef'
+$d_msg_ctrunc='undef'
+$d_msg_dontroute='undef'
+$d_msg_oob='undef'
+$d_msg_peek='undef'
+$d_msg_proxy='undef'
+$d_msync='undef'
+$d_munmap='undef'
+$d_mymalloc='undef'
+$d_nice='undef'
+$d_nv_preserves_uv='define'
+$d_nv_preserves_uv_bits='32'
+$d_off64_t='undef'
+$d_old_pthread_create_joinable='undef'
+$d_oldpthreads='undef'
+$d_open3='define'
+$d_pathconf='define'
+$d_perl_otherlibdirs='undef'
+$d_pause='define'
+$d_phostname='undef'
+$d_pipe='define'
+$d_poll='define'
+$d_PRIeldbl='define'
+$d_PRIfldbl='define'
+$d_PRIgldbl='define'
+$d_pthread_yield='undef'
+$d_pwage='undef'
+$d_pwchange='undef'
+$d_pwclass='undef'
+$d_pwcomment='undef'
+$d_pwexpire='undef'
+$d_pwgecos='undef'
+$d_pwpasswd='undef'
+$d_pwquota='undef'
+$d_quad='undef'
+$d_readdir='define'
+$d_readlink='define'
+$d_rename='define'
+$d_rewinddir='define'
+$d_rmdir='define'
+$d_safebcpy='undef'
+$d_safemcpy='undef'
+$d_sanemcmp='define'
+$d_sbrkproto='undef'
+$d_sched_yield='undef'
+$d_scm_rights='undef'
+$d_SCNfldbl='define'
+$d_seekdir='undef'
+$d_select='define'
+$d_sem='undef'
+$d_semctl_semid_ds='undef'
+$d_semctl_semun='undef'
+$d_setegid='undef'
+$d_seteuid='undef'
+$d_setgrent='undef'
+$d_setgrps='undef'
+$d_sethent='define'
+$d_setlinebuf='undef'
+$d_setlocale='define'
+$d_setnent='define'
+$d_setpent='define'
+$d_setpgid='undef'
+$d_setpgrp2='undef'
+$d_setpgrp='undef'
+$d_setprior='undef'
+$d_setproctitle='undef'
+$d_setpwent='undef'
+$d_setregid='undef'
+$d_setresgid='undef'
+$d_setresuid='undef'
+$d_setreuid='undef'
+$d_setrgid='undef'
+$d_setruid='undef'
+$d_setsent='define'
+$d_setsid='undef'
+$d_setvbuf='define'
+$d_sfio='undef'
+$d_shm='undef'
+$d_shmatprototype='define'
+$d_sigaction='undef'
+$d_sigsetjmp='undef'
+$d_socket='define'
+$d_sockpair='undef'
+$d_socks5_init='undef'
+$d_sqrtl='undef'
+$d_statblks='undef'
+$d_statfs_f_flags='undef'
+$d_statfs_s='undef'
+$d_stdio_cnt_lval='define'
+$d_stdio_ptr_lval='define'
+$d_stdio_ptr_lval_sets_cnt='undef'
+$d_stdio_ptr_lval_nochange_cnt='undef'
+$d_stdio_stream_array='define'
+$d_stdiobase='define'
+$d_stdstdio='define'
+$d_strchr='define'
+$d_strcoll='define'
+$d_strctcpy='define'
+$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='define'
+$d_symlink='define'
+$d_syscall='undef'
+$d_sysconf='define'
+$d_syserrlst='define'
+$d_system='define'
+$d_tcgetpgrp='undef'
+$d_tcsetpgrp='undef'
+$d_telldir='undef'
+$d_telldirproto='undef'
+$d_times='define'
+$d_truncate='undef'
+$d_tzname='define'
+$d_umask='define'
+$d_uname='define'
+$d_union_semun='undef'
+$d_ustat='undef'
+$d_vendorarch='define'
+$d_vendorlib='define'
+$d_vfork='undef'
+$d_void_closedir='undef'
+$d_volatile='define'
+$d_vprintf='define'
+$d_wait4='undef'
+$d_waitpid='define'
+$d_wcstombs='define'
+$d_wctomb='define'
+$db_hashtype='int'
+$db_prefixtype='int'
+$defvoidused='15'
+$direntrytype='struct dirent'
+$doublesize='8'
+$drand01='rand()/(RAND_MAX+1)'
+$eagain='EAGAIN'
+$ebcdic='undef'
+$fflushall='undef'
+$fflushNULL='define'
+$fpostype='fpos_t'
+$freetype='void'
+$full_csh=''
+$full_sed='/system/ported/command_library/sed.pm'
+$gidformat='"d"'
+$gidsize='4'
+$gidsign='-1'
+$gidtype='gid_t'
+$groupstype='gid_t'
+$i16size='2'
+$i16type='short'
+$i32size='4'
+$i32type='int'
+$i64size='_error_'
+$i64type='_error_'
+$i8size='1'
+$i8type='char'
+$i_arpainet='define'
+$i_dbm='undef'
+$i_dirent='define'
+$i_dlfcn='undef'
+$i_fcntl='define'
+$i_float='define'
+$i_grp='define'
+$i_iconv='undef'
+$i_ieeefp='undef'
+$i_inttypes='undef'
+$i_libutil='undef'
+$i_limits='define'
+$i_locale='define'
+$i_machcthr='undef'
+$i_math='define'
+$i_memory='undef'
+$i_mntent='undef'
+$i_ndbm='undef'
+$i_netdb='define'
+$i_neterrno='undef'
+$i_netinettcp='undef'
+$i_niin='define'
+$i_poll='undef'
+$i_prot='undef'
+$i_pthread='undef'
+$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='undef'
+$i_sysdir='undef'
+$i_sysfile='undef'
+$i_sysioctl='define'
+$i_syslog='undef'
+$i_sysmode='undef'
+$i_sysmount='undef'
+$i_sysndir='undef'
+$i_sysparam='undef'
+$i_sysresrc='undef'
+$i_syssecrt='undef'
+$i_sysselct='define'
+$i_sysstat='define'
+$i_sysstatfs='undef'
+$i_sysstatvfs='undef'
+$i_systime='define'
+$i_systimek='undef'
+$i_systimes='define'
+$i_systypes='define'
+$i_sysuio='undef'
+$i_sysun='undef'
+$i_sysutsname='define'
+$i_sysvfs='undef'
+$i_syswait='define'
+$i_termio='undef'
+$i_termios='define'
+$i_time='undef'
+$i_unistd='define'
+$i_ustat='undef'
+$i_utime='define'
+$i_values='define'
+$i_varargs='undef'
+$i_vfork='undef'
+$Id='$Id'
+$inc_version_list_init='0'
+$installusrbinperl='undef'
+$intsize='4'
+$ivdformat='"d"'
+$ivsize='4'
+$ivtype='int'
+$longdblsize='8'
+$longlongsize='_error_'
+$longsize='4'
+$lseeksize='4'
+$lseektype='off_t'
+$malloctype='void *'
+$mmaptype='void *'
+$modetype='mode_t'
+$multiarch='undef'
+$myuname='VOS'
+$netdb_hlen_type='int'
+$netdb_host_type='char *'
+$netdb_name_type='char *'
+$netdb_net_type='long'
+$nveformat='"e"'
+$nvfformat='"f"'
+$nvgformat='"g"'
+$nvsize='8'
+$nvtype='double'
+$o_nonblock='O_NONBLOCK'
+$old_pthread_create_joinable=''
+$osname='VOS'
+$otherlibdirs=''
+$package='perl5'
+$pidtype='pid_t'
+$pm_apiversion='5.005'
+$privlib='/system/ported/perl/lib/5.6'
+$privlibexp='/system/ported/perl/lib/5.6'
+$prototype='define'
+$ptrsize='4'
+$quadkind='_error_'
+$quadtype='_error_'
+$randbits='15'
+$randseedtype='unsigned int'
+$rd_nodata='-1'
+$sched_yield=''
+$seedfunc='srand'
+$selectminbits='1'
+$selecttype='fd_set *'
+$sh='/bin/sh'
+$shmattype='void *'
+$shortsize='2'
+$sig_name_init='"ZERO","ABRT","FPE","ILL","INT","SEGV","TERM","USR1","USR2","IO","HUP","URG","ALRM","KILL","PIPE","QUIT","CHLD","CONT","STOP","TSTP","TTIN","TTOU","BUS","RT1","RT2","RT3","RT4","RT5","RT6","RT7","RT8",0'
+$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,0'
+$signal_t='void'
+$sitearch=''
+$sitearchexp=''
+$sitelib='/system/ported/perl/lib/site/5.6'
+$sitelibexp='/system/ported/perl/lib/site/5.6'
+$sitelib_stem='/system/ported/perl/lib/site'
+$sizesize='4'
+$sizetype='size_t'
+$socksizetype='int'
+$sPRIeldbl='"Le"'
+$sPRIfldbl='"Lf"'
+$sPRIgldbl='"Lg"'
+$src='/vos_ftp_site/pub/vos/posix/(alpha|ga)/perl'
+$sSCNfldbl='"Lf"'
+$ssizetype='ssize_t'
+$startperl='!perl.pm'
+$stdchar='unsigned char'
+$stdio_base='((fp)->_base)'
+$stdio_bufsiz='((fp)->_cnt + (fp)->_ptr - (fp)->_base)'
+$stdio_cnt='((fp)->_cnt)'
+$stdio_ptr='((fp)->_ptr)'
+$stdio_stream_array='_iob'
+$timetype='time_t'
+$u16size='2'
+$u16type='unsigned short'
+$u32size='4'
+$u32type='unsigned int'
+$u64size='_error_'
+$u64type='_error_'
+$u8size='1'
+$u8type='unsigned char'
+$uidformat='"d"'
+$uidsize='4'
+$uidsign='-1'
+$uidtype='uid_t'
+$undef='$undef'
+$uquadtype='_error_'
+$use5005threads='undef'
+$use64bitall='undef'
+$use64bitint='undef'
+$usedl='undef'
+$useithreads='undef'
+$uselargefiles='undef'
+$uselongdouble='define'
+$usemorebits='undef'
+$usemultiplicity='undef'
+$useperlio='undef'
+$usesocks='undef'
+$uvoformat='"o"'
+$uvsize='4'
+$uvtype='unsigned int'
+$uvuformat='"u"'
+$uvxformat='"x"'
+$vendorarch=''
+$vendorarchexp=''
+$vendorlib_stem=''
+$vendorlibexp=''
+$voidflags='15'
+$xs_apiversion='5.00563'
diff --git a/gnu/usr.bin/perl/vos/config.alpha.h b/gnu/usr.bin/perl/vos/config.alpha.h
new file mode 100644
index 00000000000..6793a87d2c0
--- /dev/null
+++ b/gnu/usr.bin/perl/vos/config.alpha.h
@@ -0,0 +1,3219 @@
+/*
+ * This file was produced by running the config_h.SH script, which
+ * gets its values from config.sh, which is generally produced by
+ * running Configure.
+ *
+ * Feel free to modify any of this as the need arises. Note, however,
+ * that running config_h.SH again will wipe out any changes you've made.
+ * For a more permanent change edit config.sh and rerun config_h.SH.
+ *
+ * \$Id: config.alpha.h,v 1.1.1.1 2001/05/24 18:26:13 millert Exp $
+ */
+
+/*
+ * Package name : perl5
+ * Source directory : /vos_ftp_site/pub/vos/posix/(alpha|ga)/perl
+ * Configuration time: 2001-02-12 14:16 UTC
+ * Configured by : Paul_Green@stratus.com
+ * Target system : VOS
+ */
+
+#ifndef _config_h_
+#define _config_h_
+
+/* LOC_SED:
+ * This symbol holds the complete pathname to the sed program.
+ */
+#define LOC_SED "/system/ported/command_library/sed.pm" /**/
+
+/* HAS_ALARM:
+ * This symbol, if defined, indicates that the alarm routine is
+ * available.
+ */
+#define HAS_ALARM /**/
+
+/* HASATTRIBUTE:
+ * 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 /**/
+#ifndef HASATTRIBUTE
+#define __attribute__(_arg_)
+#endif
+
+/* HAS_BCMP:
+ * This symbol is defined if the bcmp() routine is available to
+ * compare blocks of memory.
+ */
+/*#define HAS_BCMP /**/
+
+/* HAS_BCOPY:
+ * This symbol is defined if the bcopy() routine is available to
+ * copy blocks of memory.
+ */
+/*#define HAS_BCOPY /**/
+
+/* HAS_BZERO:
+ * This symbol is defined if the bzero() routine is available to
+ * set a memory block to 0.
+ */
+/*#define HAS_BZERO /**/
+
+/* HAS_CHOWN:
+ * This symbol, if defined, indicates that the chown routine is
+ * available.
+ */
+/*#define HAS_CHOWN /**/
+
+/* HAS_CHROOT:
+ * This symbol, if defined, indicates that the chroot routine is
+ * available.
+ */
+/*#define HAS_CHROOT /**/
+
+/* HAS_CHSIZE:
+ * This symbol, if defined, indicates that the chsize routine is available
+ * to truncate files. You might need a -lx to get this routine.
+ */
+/*#define HAS_CHSIZE /**/
+
+/* HASCONST:
+ * This symbol, if defined, indicates that this C compiler knows about
+ * the const type. There is no need to actually test for that symbol
+ * within your programs. The mere use of the "const" keyword will
+ * trigger the necessary tests.
+ */
+#define HASCONST /**/
+#ifndef HASCONST
+#define const
+#endif
+
+/* HAS_CRYPT:
+ * This symbol, if defined, indicates that the crypt routine is available
+ * to encrypt passwords and the like.
+ */
+/*#define HAS_CRYPT /**/
+
+/* HAS_CUSERID:
+ * This symbol, if defined, indicates that the cuserid routine is
+ * available to get character login names.
+ */
+/*#define HAS_CUSERID /**/
+
+/* HAS_DBL_DIG:
+ * This symbol, if defined, indicates that this system's <float.h>
+ * or <limits.h> defines the symbol DBL_DIG, which is the number
+ * of significant digits in a double precision number. If this
+ * symbol is not defined, a guess of 15 is usually pretty good.
+ */
+#define HAS_DBL_DIG /* */
+
+/* HAS_DIFFTIME:
+ * This symbol, if defined, indicates that the difftime routine is
+ * available.
+ */
+#define HAS_DIFFTIME /**/
+
+/* HAS_DLERROR:
+ * This symbol, if defined, indicates that the dlerror routine is
+ * available to return a string describing the last error that
+ * occurred from a call to dlopen(), dlclose() or dlsym().
+ */
+/*#define HAS_DLERROR /**/
+
+/* SETUID_SCRIPTS_ARE_SECURE_NOW:
+ * This symbol, if defined, indicates that the bug that prevents
+ * setuid scripts from being secure is not present in this kernel.
+ */
+/* DOSUID:
+ * This symbol, if defined, indicates that the C program should
+ * check the script that it is executing for setuid/setgid bits, and
+ * attempt to emulate setuid/setgid on systems that have disabled
+ * setuid #! scripts because the kernel can't do it securely.
+ * It is up to the package designer to make sure that this emulation
+ * is done securely. Among other things, it should do an fstat on
+ * the script it just opened to make sure it really is a setuid/setgid
+ * script, it should make sure the arguments passed correspond exactly
+ * to the argument on the #! line, and it should not trust any
+ * subprocesses to which it must pass the filename rather than the
+ * file descriptor of the script to be executed.
+ */
+#define SETUID_SCRIPTS_ARE_SECURE_NOW /**/
+/*#define DOSUID /**/
+
+/* HAS_DUP2:
+ * This symbol, if defined, indicates that the dup2 routine is
+ * available to duplicate file descriptors.
+ */
+/*#define HAS_DUP2 /**/
+
+/* HAS_FCHMOD:
+ * This symbol, if defined, indicates that the fchmod routine is available
+ * to change mode of opened files. If unavailable, use chmod().
+ */
+#define HAS_FCHMOD /**/
+
+/* HAS_FCHOWN:
+ * This symbol, if defined, indicates that the fchown routine is available
+ * to change ownership of opened files. If unavailable, use chown().
+ */
+/*#define HAS_FCHOWN /**/
+
+/* HAS_FCNTL:
+ * This symbol, if defined, indicates to the C program that
+ * the fcntl() function exists.
+ */
+#define HAS_FCNTL /**/
+
+/* HAS_FGETPOS:
+ * This symbol, if defined, indicates that the fgetpos routine is
+ * available to get the file position indicator, similar to ftell().
+ */
+#define HAS_FGETPOS /**/
+
+/* HAS_FLOCK:
+ * This symbol, if defined, indicates that the flock routine is
+ * available to do file locking.
+ */
+/*#define HAS_FLOCK /**/
+
+/* HAS_FORK:
+ * This symbol, if defined, indicates that the fork routine is
+ * available.
+ */
+/*#define HAS_FORK /**/
+
+/* HAS_FSETPOS:
+ * This symbol, if defined, indicates that the fsetpos routine is
+ * available to set the file position indicator, similar to fseek().
+ */
+#define HAS_FSETPOS /**/
+
+/* HAS_GETTIMEOFDAY:
+ * This symbol, if defined, indicates that the gettimeofday() system
+ * call is available for a sub-second accuracy clock. Usually, the file
+ * <sys/resource.h> needs to be included (see I_SYS_RESOURCE).
+ * The type "Timeval" should be used to refer to "struct timeval".
+ */
+/*#define HAS_GETTIMEOFDAY /**/
+#ifdef HAS_GETTIMEOFDAY
+#define Timeval struct timeval /* Structure used by gettimeofday() */
+#endif
+
+/* HAS_GETGROUPS:
+ * This symbol, if defined, indicates that the getgroups() routine is
+ * available to get the list of process groups. If unavailable, multiple
+ * groups are probably not supported.
+ */
+/*#define HAS_GETGROUPS /**/
+
+/* HAS_GETLOGIN:
+ * This symbol, if defined, indicates that the getlogin routine is
+ * available to get the login name.
+ */
+#define HAS_GETLOGIN /**/
+
+/* HAS_GETPGID:
+ * This symbol, if defined, indicates to the C program that
+ * the getpgid(pid) function is available to get the
+ * process group id.
+ */
+/*#define HAS_GETPGID /**/
+
+/* HAS_GETPGRP2:
+ * This symbol, if defined, indicates that the getpgrp2() (as in DG/UX)
+ * routine is available to get the current process group.
+ */
+/*#define HAS_GETPGRP2 /**/
+
+/* HAS_GETPPID:
+ * This symbol, if defined, indicates that the getppid routine is
+ * available to get the parent process ID.
+ */
+#define HAS_GETPPID /**/
+
+/* HAS_GETPRIORITY:
+ * This symbol, if defined, indicates that the getpriority routine is
+ * available to get a process's priority.
+ */
+/*#define HAS_GETPRIORITY /**/
+
+/* 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"
+ * strings.
+ */
+/*#define HAS_INET_ATON /**/
+
+/* HAS_KILLPG:
+ * This symbol, if defined, indicates that the killpg routine is available
+ * to kill process groups. If unavailable, you probably should use kill
+ * with a negative process number.
+ */
+/*#define HAS_KILLPG /**/
+
+/* HAS_LINK:
+ * This symbol, if defined, indicates that the link routine is
+ * available to create hard links.
+ */
+/*#define HAS_LINK /**/
+
+/* HAS_LOCALECONV:
+ * This symbol, if defined, indicates that the localeconv routine is
+ * available for numeric and monetary formatting conventions.
+ */
+#define HAS_LOCALECONV /**/
+
+/* HAS_LOCKF:
+ * This symbol, if defined, indicates that the lockf routine is
+ * available to do file locking.
+ */
+#define HAS_LOCKF /**/
+
+/* HAS_LSTAT:
+ * This symbol, if defined, indicates that the lstat routine is
+ * available to do file stats on symbolic links.
+ */
+#define HAS_LSTAT /**/
+
+/* HAS_MBLEN:
+ * This symbol, if defined, indicates that the mblen routine is available
+ * to find the number of bytes in a multibye character.
+ */
+#define HAS_MBLEN /**/
+
+/* HAS_MBSTOWCS:
+ * This symbol, if defined, indicates that the mbstowcs routine is
+ * available to covert a multibyte string into a wide character string.
+ */
+#define HAS_MBSTOWCS /**/
+
+/* HAS_MBTOWC:
+ * This symbol, if defined, indicates that the mbtowc routine is available
+ * to covert a multibyte to a wide character.
+ */
+#define HAS_MBTOWC /**/
+
+/* HAS_MEMCMP:
+ * This symbol, if defined, indicates that the memcmp routine is available
+ * to compare blocks of memory.
+ */
+#define HAS_MEMCMP /**/
+
+/* HAS_MEMCPY:
+ * This symbol, if defined, indicates that the memcpy routine is available
+ * to copy blocks of memory.
+ */
+#define HAS_MEMCPY /**/
+
+/* HAS_MEMMOVE:
+ * This symbol, if defined, indicates that the memmove routine is available
+ * to copy potentially overlapping blocks of memory. This should be used
+ * only when HAS_SAFE_BCOPY is not defined. If neither is there, roll your
+ * own version.
+ */
+#define HAS_MEMMOVE /**/
+
+/* HAS_MEMSET:
+ * This symbol, if defined, indicates that the memset routine is available
+ * to set blocks of memory.
+ */
+#define HAS_MEMSET /**/
+
+/* HAS_MKDIR:
+ * This symbol, if defined, indicates that the mkdir routine is available
+ * to create directories. Otherwise you should fork off a new process to
+ * exec /bin/mkdir.
+ */
+#define HAS_MKDIR /**/
+
+/* HAS_MKFIFO:
+ * This symbol, if defined, indicates that the mkfifo routine is
+ * available to create FIFOs. Otherwise, mknod should be able to
+ * do it for you. However, if mkfifo is there, mknod might require
+ * super-user privileges which mkfifo will not.
+ */
+#define HAS_MKFIFO /**/
+
+/* HAS_MKTIME:
+ * This symbol, if defined, indicates that the mktime routine is
+ * available.
+ */
+#define HAS_MKTIME /**/
+
+/* HAS_MSYNC:
+ * This symbol, if defined, indicates that the msync system call is
+ * available to synchronize a mapped file.
+ */
+/*#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
+ * available.
+ */
+/*#define HAS_NICE /**/
+
+/* HAS_PATHCONF:
+ * This symbol, if defined, indicates that pathconf() is available
+ * to determine file-system related limits and options associated
+ * with a given filename.
+ */
+/* HAS_FPATHCONF:
+ * This symbol, if defined, indicates that pathconf() is available
+ * to determine file-system related limits and options associated
+ * with a given open file descriptor.
+ */
+#define HAS_PATHCONF /**/
+#define HAS_FPATHCONF /**/
+
+/* HAS_PAUSE:
+ * This symbol, if defined, indicates that the pause routine is
+ * available to suspend a process until a signal is received.
+ */
+#define HAS_PAUSE /**/
+
+/* HAS_PIPE:
+ * This symbol, if defined, indicates that the pipe routine is
+ * available to create an inter-process channel.
+ */
+#define HAS_PIPE /**/
+
+/* HAS_POLL:
+ * This symbol, if defined, indicates that the poll routine is
+ * available to poll active file descriptors. You may safely
+ * include <poll.h> when this symbol is defined.
+ */
+#define HAS_POLL /**/
+
+/* HAS_READDIR:
+ * This symbol, if defined, indicates that the readdir routine is
+ * available to read directory entries. You may have to include
+ * <dirent.h>. See I_DIRENT.
+ */
+#define HAS_READDIR /**/
+
+/* HAS_SEEKDIR:
+ * This symbol, if defined, indicates that the seekdir routine is
+ * available. You may have to include <dirent.h>. See I_DIRENT.
+ */
+/*#define HAS_SEEKDIR /**/
+
+/* HAS_TELLDIR:
+ * This symbol, if defined, indicates that the telldir routine is
+ * available. You may have to include <dirent.h>. See I_DIRENT.
+ */
+/*#define HAS_TELLDIR /**/
+
+/* HAS_REWINDDIR:
+ * This symbol, if defined, indicates that the rewinddir routine is
+ * available. You may have to include <dirent.h>. See I_DIRENT.
+ */
+#define HAS_REWINDDIR /**/
+
+/* HAS_READLINK:
+ * This symbol, if defined, indicates that the readlink routine is
+ * available to read the value of a symbolic link.
+ */
+#define HAS_READLINK /**/
+
+/* HAS_RENAME:
+ * This symbol, if defined, indicates that the rename routine is available
+ * to rename files. Otherwise you should do the unlink(), link(), unlink()
+ * trick.
+ */
+#define HAS_RENAME /**/
+
+/* HAS_RMDIR:
+ * This symbol, if defined, indicates that the rmdir routine is
+ * available to remove directories. Otherwise you should fork off a
+ * new process to exec /bin/rmdir.
+ */
+#define HAS_RMDIR /**/
+
+/* HAS_SELECT:
+ * This symbol, if defined, indicates that the select routine is
+ * available to select active file descriptors. If the timeout field
+ * is used, <sys/time.h> may need to be included.
+ */
+#define HAS_SELECT /**/
+
+/* HAS_SETEGID:
+ * This symbol, if defined, indicates that the setegid routine is available
+ * to change the effective gid of the current program.
+ */
+/*#define HAS_SETEGID /**/
+
+/* HAS_SETEUID:
+ * This symbol, if defined, indicates that the seteuid routine is available
+ * to change the effective uid of the current program.
+ */
+/*#define HAS_SETEUID /**/
+
+/* HAS_SETLINEBUF:
+ * This symbol, if defined, indicates that the setlinebuf routine is
+ * available to change stderr or stdout from block-buffered or unbuffered
+ * to a line-buffered mode.
+ */
+/*#define HAS_SETLINEBUF /**/
+
+/* HAS_SETLOCALE:
+ * This symbol, if defined, indicates that the setlocale routine is
+ * available to handle locale-specific ctype implementations.
+ */
+#define HAS_SETLOCALE /**/
+
+/* HAS_SETPGID:
+ * This symbol, if defined, indicates that the setpgid(pid, gpid)
+ * routine is available to set process group ID.
+ */
+/*#define HAS_SETPGID /**/
+
+/* HAS_SETPGRP2:
+ * This symbol, if defined, indicates that the setpgrp2() (as in DG/UX)
+ * routine is available to set the current process group.
+ */
+/*#define HAS_SETPGRP2 /**/
+
+/* HAS_SETPRIORITY:
+ * This symbol, if defined, indicates that the setpriority routine is
+ * available to set a process's priority.
+ */
+/*#define HAS_SETPRIORITY /**/
+
+/* HAS_SETREGID:
+ * This symbol, if defined, indicates that the setregid routine is
+ * available to change the real and effective gid of the current
+ * process.
+ */
+/* HAS_SETRESGID:
+ * This symbol, if defined, indicates that the setresgid routine is
+ * available to change the real, effective and saved gid of the current
+ * process.
+ */
+/*#define HAS_SETREGID /**/
+/*#define HAS_SETRESGID /**/
+
+/* HAS_SETREUID:
+ * This symbol, if defined, indicates that the setreuid routine is
+ * available to change the real and effective uid of the current
+ * process.
+ */
+/* HAS_SETRESUID:
+ * This symbol, if defined, indicates that the setresuid routine is
+ * available to change the real, effective and saved uid of the current
+ * process.
+ */
+/*#define HAS_SETREUID /**/
+/*#define HAS_SETRESUID /**/
+
+/* HAS_SETRGID:
+ * This symbol, if defined, indicates that the setrgid routine is available
+ * to change the real gid of the current program.
+ */
+/*#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 /**/
+
+/* HAS_SETSID:
+ * This symbol, if defined, indicates that the setsid routine is
+ * available to set the process group ID.
+ */
+/*#define HAS_SETSID /**/
+
+/* Shmat_t:
+ * This symbol holds the return type of the shmat() system call.
+ * Usually set to 'void *' or 'char *'.
+ */
+/* HAS_SHMAT_PROTOTYPE:
+ * This symbol, if defined, indicates that the sys/shm.h includes
+ * a prototype for shmat(). Otherwise, it is up to the program to
+ * guess one. Shmat_t shmat _((int, Shmat_t, int)) is a good guess,
+ * but not always right so it should be emitted by the program only
+ * when HAS_SHMAT_PROTOTYPE is not defined to avoid conflicting defs.
+ */
+#define Shmat_t void * /**/
+#define HAS_SHMAT_PROTOTYPE /**/
+
+/* HAS_STRCHR:
+ * This symbol is defined to indicate that the strchr()/strrchr()
+ * functions are available for string searching. If not, try the
+ * index()/rindex() pair.
+ */
+/* HAS_INDEX:
+ * This symbol is defined to indicate that the index()/rindex()
+ * functions are available for string searching.
+ */
+#define HAS_STRCHR /**/
+/*#define HAS_INDEX /**/
+
+/* HAS_STRCOLL:
+ * This symbol, if defined, indicates that the strcoll routine is
+ * available to compare strings using collating information.
+ */
+#define HAS_STRCOLL /**/
+
+/* USE_STRUCT_COPY:
+ * This symbol, if defined, indicates that this C compiler knows how
+ * to copy structures. If undefined, you'll need to use a block copy
+ * routine of some sort instead.
+ */
+#define USE_STRUCT_COPY /**/
+
+/* HAS_STRTOD:
+ * This symbol, if defined, indicates that the strtod routine is
+ * available to provide better numeric string conversion than atof().
+ */
+#define HAS_STRTOD /**/
+
+/* HAS_STRTOL:
+ * This symbol, if defined, indicates that the strtol routine is available
+ * to provide better numeric string conversion than atoi() and friends.
+ */
+#define HAS_STRTOL /**/
+
+/* HAS_STRTOUL:
+ * This symbol, if defined, indicates that the strtoul routine is
+ * available to provide conversion of strings to unsigned long.
+ */
+#define HAS_STRTOUL /**/
+
+/* HAS_STRXFRM:
+ * This symbol, if defined, indicates that the strxfrm() routine is
+ * available to transform strings.
+ */
+#define HAS_STRXFRM /**/
+
+/* HAS_SYMLINK:
+ * This symbol, if defined, indicates that the symlink routine is available
+ * to create symbolic links.
+ */
+#define HAS_SYMLINK /**/
+
+/* HAS_SYSCALL:
+ * This symbol, if defined, indicates that the syscall routine is
+ * available to call arbitrary system calls. If undefined, that's tough.
+ */
+/*#define HAS_SYSCALL /**/
+
+/* HAS_SYSCONF:
+ * This symbol, if defined, indicates that sysconf() is available
+ * to determine system related limits and options.
+ */
+#define HAS_SYSCONF /**/
+
+/* HAS_SYSTEM:
+ * This symbol, if defined, indicates that the system routine is
+ * available to issue a shell command.
+ */
+#define HAS_SYSTEM /**/
+
+/* HAS_TCGETPGRP:
+ * This symbol, if defined, indicates that the tcgetpgrp routine is
+ * available to get foreground process group ID.
+ */
+/*#define HAS_TCGETPGRP /**/
+
+/* HAS_TCSETPGRP:
+ * This symbol, if defined, indicates that the tcsetpgrp routine is
+ * available to set foreground process group ID.
+ */
+/*#define HAS_TCSETPGRP /**/
+
+/* HAS_TRUNCATE:
+ * This symbol, if defined, indicates that the truncate routine is
+ * available to truncate files.
+ */
+/*#define HAS_TRUNCATE /**/
+
+/* HAS_TZNAME:
+ * This symbol, if defined, indicates that the tzname[] array is
+ * available to access timezone names.
+ */
+#define HAS_TZNAME /**/
+
+/* HAS_UMASK:
+ * This symbol, if defined, indicates that the umask routine is
+ * available to set and get the value of the file creation mask.
+ */
+#define HAS_UMASK /**/
+
+/* HASVOLATILE:
+ * This symbol, if defined, indicates that this C compiler knows about
+ * the volatile declaration.
+ */
+#define HASVOLATILE /**/
+#ifndef HASVOLATILE
+#define volatile
+#endif
+
+/* HAS_WAIT4:
+ * This symbol, if defined, indicates that wait4() exists.
+ */
+/*#define HAS_WAIT4 /**/
+
+/* HAS_WAITPID:
+ * This symbol, if defined, indicates that the waitpid routine is
+ * available to wait for child process.
+ */
+#define HAS_WAITPID /**/
+
+/* HAS_WCSTOMBS:
+ * This symbol, if defined, indicates that the wcstombs routine is
+ * available to convert wide character strings to multibyte strings.
+ */
+#define HAS_WCSTOMBS /**/
+
+/* HAS_WCTOMB:
+ * This symbol, if defined, indicates that the wctomb routine is available
+ * to covert a wide character to a multibyte.
+ */
+#define HAS_WCTOMB /**/
+
+/* I_ARPA_INET:
+ * 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 /**/
+
+/* I_DBM:
+ * This symbol, if defined, indicates that <dbm.h> exists and should
+ * be included.
+ */
+/* I_RPCSVC_DBM:
+ * This symbol, if defined, indicates that <rpcsvc/dbm.h> exists and
+ * should be included.
+ */
+/*#define I_DBM /**/
+/*#define I_RPCSVC_DBM /**/
+
+/* I_DIRENT:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <dirent.h>. Using this symbol also triggers the definition
+ * of the Direntry_t define which ends up being 'struct dirent' or
+ * 'struct direct' depending on the availability of <dirent.h>.
+ */
+/* DIRNAMLEN:
+ * This symbol, if defined, indicates to the C program that the length
+ * of directory entry names is provided by a d_namlen field. Otherwise
+ * you need to do strlen() on the d_name field.
+ */
+/* Direntry_t:
+ * 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
+ * portably declare your directory entries.
+ */
+#define I_DIRENT /**/
+/*#define DIRNAMLEN /**/
+#define Direntry_t struct dirent
+
+/* I_DLFCN:
+ * This symbol, if defined, indicates that <dlfcn.h> exists and should
+ * be included.
+ */
+/*#define I_DLFCN /**/
+
+/* I_FCNTL:
+ * This manifest constant tells the C program to include <fcntl.h>.
+ */
+#define I_FCNTL /**/
+
+/* I_FLOAT:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <float.h> to get definition of symbols like DBL_MAX or
+ * DBL_MIN, i.e. machine dependent floating point values.
+ */
+#define I_FLOAT /**/
+
+/* 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
+ * LONG_MAX, i.e. machine dependant limitations.
+ */
+#define I_LIMITS /**/
+
+/* I_LOCALE:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <locale.h>.
+ */
+#define I_LOCALE /**/
+
+/* I_MATH:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <math.h>.
+ */
+#define I_MATH /**/
+
+/* I_MEMORY:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <memory.h>.
+ */
+/*#define I_MEMORY /**/
+
+/* I_NDBM:
+ * This symbol, if defined, indicates that <ndbm.h> exists and should
+ * be included.
+ */
+/*#define I_NDBM /**/
+
+/* I_NET_ERRNO:
+ * This symbol, if defined, indicates that <net/errno.h> exists and
+ * should be included.
+ */
+/*#define I_NET_ERRNO /**/
+
+/* I_NETINET_IN:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <netinet/in.h>. Otherwise, you may try <sys/in.h>.
+ */
+#define I_NETINET_IN /**/
+
+/* I_SFIO:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sfio.h>.
+ */
+/*#define I_SFIO /**/
+
+/* I_STDDEF:
+ * This symbol, if defined, indicates that <stddef.h> exists and should
+ * be included.
+ */
+#define I_STDDEF /**/
+
+/* I_STDLIB:
+ * This symbol, if defined, indicates that <stdlib.h> exists and should
+ * be included.
+ */
+#define I_STDLIB /**/
+
+/* I_STRING:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <string.h> (USG systems) instead of <strings.h> (BSD systems).
+ */
+#define I_STRING /**/
+
+/* I_SYS_DIR:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/dir.h>.
+ */
+/*#define I_SYS_DIR /**/
+
+/* I_SYS_FILE:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/file.h> to get definition of R_OK and friends.
+ */
+/*#define I_SYS_FILE /**/
+
+/* I_SYS_IOCTL:
+ * This symbol, if defined, indicates that <sys/ioctl.h> exists and should
+ * be included. Otherwise, include <sgtty.h> or <termio.h>.
+ */
+#define I_SYS_IOCTL /**/
+
+/* I_SYS_NDIR:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/ndir.h>.
+ */
+/*#define I_SYS_NDIR /**/
+
+/* I_SYS_PARAM:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/param.h>.
+ */
+/*#define I_SYS_PARAM /**/
+
+/* I_SYS_RESOURCE:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/resource.h>.
+ */
+/*#define I_SYS_RESOURCE /**/
+
+/* I_SYS_SELECT:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/select.h> in order to get definition of struct timeval.
+ */
+#define I_SYS_SELECT /**/
+
+/* I_SYS_STAT:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/stat.h>.
+ */
+#define I_SYS_STAT /**/
+
+/* I_SYS_TIMES:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/times.h>.
+ */
+#define I_SYS_TIMES /**/
+
+/* I_SYS_TYPES:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/types.h>.
+ */
+#define I_SYS_TYPES /**/
+
+/* I_SYS_UN:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/un.h> to get UNIX domain socket definitions.
+ */
+/*#define I_SYS_UN /**/
+
+/* I_SYS_WAIT:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/wait.h>.
+ */
+#define I_SYS_WAIT /**/
+
+/* I_TERMIO:
+ * This symbol, if defined, indicates that the program should include
+ * <termio.h> rather than <sgtty.h>. There are also differences in
+ * the ioctl() calls that depend on the value of this symbol.
+ */
+/* I_TERMIOS:
+ * This symbol, if defined, indicates that the program should include
+ * the POSIX termios.h rather than sgtty.h or termio.h.
+ * There are also differences in the ioctl() calls that depend on the
+ * value of this symbol.
+ */
+/* I_SGTTY:
+ * This symbol, if defined, indicates that the program should include
+ * <sgtty.h> rather than <termio.h>. There are also differences in
+ * the ioctl() calls that depend on the value of this symbol.
+ */
+/*#define I_TERMIO /**/
+#define I_TERMIOS /**/
+/*#define I_SGTTY /**/
+
+/* I_UNISTD:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <unistd.h>.
+ */
+#define I_UNISTD /**/
+
+/* I_UTIME:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <utime.h>.
+ */
+#define I_UTIME /**/
+
+/* I_VALUES:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <values.h> to get definition of symbols like MINFLOAT or
+ * MAXLONG, i.e. machine dependant limitations. Probably, you
+ * should use <limits.h> instead, if it is available.
+ */
+#define I_VALUES /**/
+
+/* I_STDARG:
+ * This symbol, if defined, indicates that <stdarg.h> exists and should
+ * be included.
+ */
+/* I_VARARGS:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <varargs.h>.
+ */
+#define I_STDARG /**/
+/*#define I_VARARGS /**/
+
+/* I_VFORK:
+ * This symbol, if defined, indicates to the C program that it should
+ * include vfork.h.
+ */
+/*#define I_VFORK /**/
+
+/* CAN_PROTOTYPE:
+ * If defined, this macro indicates that the C compiler can handle
+ * function prototypes.
+ */
+/* _:
+ * This macro is used to declare function parameters for folks who want
+ * to make declarations with prototypes using a different style than
+ * the above macros. Use double parentheses. For example:
+ *
+ * int main _((int argc, char *argv[]));
+ */
+#define CAN_PROTOTYPE /**/
+#ifdef CAN_PROTOTYPE
+#define _(args) args
+#else
+#define _(args) ()
+#endif
+
+/* SH_PATH:
+ * This symbol contains the full pathname to the shell used on this
+ * on this system to execute Bourne shell scripts. Usually, this will be
+ * /bin/sh, though it's possible that some systems will have /bin/ksh,
+ * /bin/pdksh, /bin/ash, /bin/bash, or even something such as
+ * D:/bin/sh.exe.
+ */
+#define SH_PATH "/bin/sh" /**/
+
+/* STDCHAR:
+ * This symbol is defined to be the type of char used in stdio.h.
+ * It has the values "unsigned char" or "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 4 /**/
+#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 _error_ /**/
+# define Uquad_t _error_ /**/
+# define QUADKIND _error_ /**/
+# 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 "VOS" /**/
+
+/* MEM_ALIGNBYTES:
+ * 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 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 "" /**/
+/*#define ARCHLIB_EXP "" /**/
+
+/* 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 "vos" /**/
+
+/* 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 "/system/ported/command_library" /**/
+#define BIN_EXP "/system/ported/command_library" /**/
+
+/* 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.
+ */
+/*#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
+ * for perl, where the config.h can be generated and installed on
+ * one system, and used by a different architecture to build an
+ * extension. Older versions of NeXT that might not have
+ * defined either *_ENDIAN__ were all on Motorola 680x0 series,
+ * so the default case (for NeXT) is big endian to catch them.
+ * This might matter for NeXT 3.0.
+ */
+#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 0x4321 /* 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 "cc -E"
+#define CPPMINUS "-"
+#define CPPRUN "cc -E -"
+#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.
+ */
+/*#define CASTI32 /**/
+
+/* CASTNEGFLOAT:
+ * This symbol is defined if the C compiler can cast negative
+ * numbers to unsigned longs, ints and shorts.
+ */
+/* CASTFLAGS:
+ * This symbol contains flags that say what 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
+ */
+#define CASTNEGFLOAT /**/
+#define CASTFLAGS 0 /**/
+
+/* VOID_CLOSEDIR:
+ * This symbol, if defined, indicates that the closedir() routine
+ * does not return a value.
+ */
+/*#define VOID_CLOSEDIR /**/
+
+/* HAS_CSH:
+ * This symbol, if defined, indicates that the C-shell exists.
+ */
+/* CSH:
+ * This symbol, if defined, contains the full pathname of csh.
+ */
+/*#define HAS_CSH /**/
+#ifdef HAS_CSH
+#define CSH "" /**/
+#endif
+
+/* 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 /**/
+
+/* 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));
+ */
+/*#define HAS_DRAND48_PROTO /**/
+
+/* HAS_ENDGRENT:
+ * This symbol, if defined, indicates that the getgrent routine is
+ * available for finalizing sequential access of the group database.
+ */
+/*#define HAS_ENDGRENT /**/
+
+/* HAS_ENDHOSTENT:
+ * This symbol, if defined, indicates that the endhostent() routine is
+ * available to close whatever was being used for host queries.
+ */
+#define HAS_ENDHOSTENT /**/
+
+/* HAS_ENDNETENT:
+ * This symbol, if defined, indicates that the endnetent() routine is
+ * available to close whatever was being used for network queries.
+ */
+#define HAS_ENDNETENT /**/
+
+/* HAS_ENDPROTOENT:
+ * This symbol, if defined, indicates that the endprotoent() routine is
+ * available to close whatever was being used for protocol queries.
+ */
+#define HAS_ENDPROTOENT /**/
+
+/* HAS_ENDPWENT:
+ * This symbol, if defined, indicates that the getgrent routine is
+ * available for finalizing sequential access of the passwd database.
+ */
+/*#define HAS_ENDPWENT /**/
+
+/* HAS_ENDSERVENT:
+ * This symbol, if defined, indicates that the endservent() routine is
+ * available to close whatever was being used for service queries.
+ */
+#define HAS_ENDSERVENT /**/
+
+/* HAS_FD_SET:
+ * This symbol, when defined, indicates presence of the fd_set typedef
+ * in <sys/types.h>
+ */
+/*#define HAS_FD_SET /**/
+
+/* FLEXFILENAMES:
+ * This symbol, if defined, indicates that the system supports filenames
+ * longer than 14 characters.
+ */
+#define FLEXFILENAMES /**/
+
+/* HAS_FPOS64_T:
+ * This symbol will be defined if the C compiler supports fpos64_t.
+ */
+/*#define HAS_FPOS64_T /**/
+
+/* HAS_FREXPL:
+ * This symbol, if defined, indicates that the frexpl routine is
+ * available to break a long double floating-point number into
+ * a normalized fraction and an integral power of 2.
+ */
+/*#define HAS_FREXPL /**/
+
+/* HAS_STRUCT_FS_DATA:
+ * This symbol, if defined, indicates that the struct fs_data
+ * to do statfs() is supported.
+ */
+/*#define HAS_STRUCT_FS_DATA /**/
+
+/* HAS_FSEEKO:
+ * This symbol, if defined, indicates that the fseeko routine is
+ * available to fseek beyond 32 bits (useful for ILP32 hosts).
+ */
+/*#define HAS_FSEEKO /**/
+
+/* HAS_FSTATFS:
+ * This symbol, if defined, indicates that the fstatfs routine is
+ * available to stat filesystems by file descriptors.
+ */
+/*#define HAS_FSTATFS /**/
+
+/* HAS_FTELLO:
+ * This symbol, if defined, indicates that the ftello routine is
+ * available to ftell beyond 32 bits (useful for ILP32 hosts).
+ */
+/*#define HAS_FTELLO /**/
+
+/* 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) sprintf((b),"%.*g",(n),(x))
+
+/* HAS_GETCWD:
+ * This symbol, if defined, indicates that the getcwd routine is
+ * available to get the current working directory.
+ */
+#define HAS_GETCWD /**/
+
+/* HAS_GETESPWNAM:
+ * This symbol, if defined, indicates that the getespwnam system call is
+ * available to retrieve enchanced (shadow) password entries by name.
+ */
+/*#define HAS_GETESPWNAM /**/
+
+/* HAS_GETFSSTAT:
+ * This symbol, if defined, indicates that the getfsstat routine is
+ * available to stat filesystems in bulk.
+ */
+/*#define HAS_GETFSSTAT /**/
+
+/* HAS_GETGRENT:
+ * This symbol, if defined, indicates that the getgrent routine is
+ * available for sequential access of the group database.
+ */
+/*#define HAS_GETGRENT /**/
+
+/* HAS_GETHOSTBYADDR:
+ * This symbol, if defined, indicates that the gethostbyaddr() routine is
+ * available to look up hosts by their IP addresses.
+ */
+#define HAS_GETHOSTBYADDR /**/
+
+/* HAS_GETHOSTBYNAME:
+ * This symbol, if defined, indicates that the gethostbyname() routine is
+ * available to look up host names in some data base or other.
+ */
+#define HAS_GETHOSTBYNAME /**/
+
+/* HAS_GETHOSTENT:
+ * This symbol, if defined, indicates that the gethostent() routine is
+ * available to look up host names in some data base or another.
+ */
+#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.
+ */
+#define HAS_GETNETBYADDR /**/
+
+/* HAS_GETNETBYNAME:
+ * This symbol, if defined, indicates that the getnetbyname() routine is
+ * available to look up networks by their names.
+ */
+#define HAS_GETNETBYNAME /**/
+
+/* HAS_GETNETENT:
+ * This symbol, if defined, indicates that the getnetent() routine is
+ * available to look up network names in some data base or another.
+ */
+#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_GETPAGESIZE:
+ * This symbol, if defined, indicates that the getpagesize system call
+ * is available to get system page size, which is the granularity of
+ * many memory management calls.
+ */
+/*#define HAS_GETPAGESIZE /**/
+
+/* HAS_GETPROTOENT:
+ * This symbol, if defined, indicates that the getprotoent() routine is
+ * available to look up protocols in some data base or another.
+ */
+#define HAS_GETPROTOENT /**/
+
+/* HAS_GETPROTOBYNAME:
+ * This symbol, if defined, indicates that the getprotobyname()
+ * routine is available to look up protocols by their name.
+ */
+/* HAS_GETPROTOBYNUMBER:
+ * This symbol, if defined, indicates that the getprotobynumber()
+ * routine is available to look up protocols by their number.
+ */
+#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_GETPRPWNAM:
+ * This symbol, if defined, indicates that the getprpwnam system call is
+ * available to retrieve protected (shadow) password entries by name.
+ */
+/*#define HAS_GETPRPWNAM /**/
+
+/* 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_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.
+ */
+/* HAS_GETSERVBYPORT:
+ * This symbol, if defined, indicates that the getservbyport()
+ * routine is available to look up services by their port.
+ */
+#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_ISNAN:
+ * This symbol, if defined, indicates that the isnan routine is
+ * available to check whether a double is a NaN.
+ */
+/*#define HAS_ISNAN /**/
+
+/* HAS_ISNANL:
+ * This symbol, if defined, indicates that the isnanl routine is
+ * available to check whether a long double is a NaN.
+ */
+/*#define HAS_ISNANL /**/
+
+/* 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_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.
+ */
+/* LONG_DOUBLESIZE:
+ * This symbol contains the size of a long double, so that the
+ * C preprocessor can make decisions based on it. It is only
+ * defined if the system supports long doubles.
+ */
+#define HAS_LONG_DOUBLE /**/
+#ifdef HAS_LONG_DOUBLE
+#define LONG_DOUBLESIZE 8 /**/
+#endif
+
+/* HAS_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
+ * C preprocessor can make decisions based on it. It is only
+ * defined if the system supports long long.
+ */
+/*#define HAS_LONG_LONG /**/
+#ifdef HAS_LONG_LONG
+#define LONGLONGSIZE _error_ /**/
+#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_MODFL:
+ * This symbol, if defined, indicates that the modfl routine is
+ * available to split a long double x into a fractional part f and
+ * an integer part i such that |f| < 1.0 and (f + i) = x.
+ */
+/*#define HAS_MODFL /**/
+
+/* 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 /**/
+/*#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
+ * groups are probably not supported.
+ */
+/*#define HAS_SETGROUPS /**/
+
+/* HAS_SETHOSTENT:
+ * This symbol, if defined, indicates that the sethostent() routine is
+ * available.
+ */
+#define HAS_SETHOSTENT /**/
+
+/* HAS_SETNETENT:
+ * This symbol, if defined, indicates that the setnetent() routine is
+ * available.
+ */
+#define HAS_SETNETENT /**/
+
+/* HAS_SETPROTOENT:
+ * This symbol, if defined, indicates that the setprotoent() routine is
+ * available.
+ */
+#define HAS_SETPROTOENT /**/
+
+/* HAS_SETPROCTITLE:
+ * This symbol, if defined, indicates that the setproctitle routine is
+ * available to set process title.
+ */
+/*#define HAS_SETPROCTITLE /**/
+
+/* 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_SETVBUF:
+ * This symbol, if defined, indicates that the setvbuf routine is
+ * available to change buffering on an open stdio stream.
+ * to a line-buffered mode.
+ */
+#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.
+ */
+/* HAS_SOCKETPAIR:
+ * This symbol, if defined, indicates that the BSD socketpair() call is
+ * supported.
+ */
+/* 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_SOCKS5_INIT:
+ * This symbol, if defined, indicates that the socks5_init routine is
+ * available to initialize SOCKS 5.
+ */
+/*#define HAS_SOCKS5_INIT /**/
+
+/* 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.
+ */
+/* STDIO_PTR_LVAL_SETS_CNT:
+ * This symbol is defined if using the FILE_ptr macro as an lvalue
+ * to increase the pointer by n has the side effect of decreasing the
+ * value of File_cnt(fp) by n.
+ */
+/* STDIO_PTR_LVAL_NOCHANGE_CNT:
+ * This symbol is defined if using the FILE_ptr macro as an lvalue
+ * to increase the pointer by n leaves File_cnt(fp) unchanged.
+ */
+#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 /**/
+/*#define STDIO_PTR_LVAL_SETS_CNT /**/
+/*#define STDIO_PTR_LVAL_NOCHANGE_CNT /**/
+#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
+ * defined by including <sys/sem.h>. If not, the user code
+ * probably needs to define it as:
+ * union semun {
+ * int val;
+ * struct semid_ds *buf;
+ * unsigned short *array;
+ * }
+ */
+/* USE_SEMCTL_SEMUN:
+ * This symbol, if defined, indicates that union semun is
+ * used for semctl IPC_STAT.
+ */
+/* USE_SEMCTL_SEMID_DS:
+ * This symbol, if defined, indicates that struct semid_ds * is
+ * used for semctl IPC_STAT.
+ */
+/*#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
+ * a signal handler using "Signal_t (*handler)()", and define the
+ * handler using "Signal_t handler(sig)".
+ */
+#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 "d" /**/
+
+/* 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 setgroups(). Usually, this is the same as
+ * gidtype (gid_t) , but sometimes it isn't.
+ * 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 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 int /**/
+#define DB_Prefix_t int /**/
+
+/* 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_LIBUTIL:
+ * This symbol, if defined, indicates that <libutil.h> exists and
+ * should be included.
+ */
+/*#define I_LIBUTIL /**/
+
+/* 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_PROT:
+ * This symbol, if defined, indicates that <prot.h> exists and
+ * should be included.
+ */
+/*#define I_PROT /**/
+
+/* 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>.
+ */
+/* PWQUOTA:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_quota.
+ */
+/* PWAGE:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_age.
+ */
+/* PWCHANGE:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_change.
+ */
+/* PWCLASS:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_class.
+ */
+/* PWEXPIRE:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_expire.
+ */
+/* PWCOMMENT:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_comment.
+ */
+/* PWGECOS:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_gecos.
+ */
+/* PWPASSWD:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_passwd.
+ */
+#define I_PWD /**/
+/*#define PWQUOTA /**/
+/*#define PWAGE /**/
+/*#define PWCHANGE /**/
+/*#define PWCLASS /**/
+/*#define PWEXPIRE /**/
+/*#define PWCOMMENT /**/
+/*#define PWGECOS /**/
+/*#define PWPASSWD /**/
+
+/* 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.
+ */
+/* PERL_PRIeldbl:
+ * This symbol, if defined, contains the string used by stdio to
+ * format long doubles (format 'e') for output.
+ */
+/* PERL_SCNfldbl:
+ * This symbol, if defined, contains the string used by stdio to
+ * format long doubles (format 'f') for input.
+ */
+#define PERL_PRIfldbl "Lf" /**/
+#define PERL_PRIgldbl "Lg" /**/
+#define PERL_PRIeldbl "Le" /**/
+#define PERL_SCNfldbl "Lf" /**/
+
+/* 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 4 /* <offset> size */
+#define Off_t_size 4 /* <offset> size */
+
+/* Free_t:
+ * This variable contains the return type of free(). It is usually
+ * void, but occasionally int.
+ */
+/* Malloc_t:
+ * This symbol is the type of pointer returned by malloc and realloc.
+ */
+#define Malloc_t void * /**/
+#define Free_t void /**/
+
+/* MYMALLOC:
+ * This symbol, if defined, indicates that we're using our own malloc.
+ */
+/*#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 char * /**/
+#define Netdb_hlen_t int /**/
+#define Netdb_name_t char * /**/
+#define Netdb_net_t long /**/
+
+/* PERL_OTHERLIBDIRS:
+ * This variable contains a colon-separated set of paths for the perl
+ * binary to search for additional library files or modules.
+ * These directories will be tacked to the end of @INC.
+ * Perl will automatically search below each path for version-
+ * and architecture-specific directories. See PERL_INC_VERSION_LIST
+ * for more details.
+ */
+/*#define PERL_OTHERLIBDIRS "" /**/
+
+/* 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).
+ */
+/* NVSIZE:
+ * This symbol contains the sizeof(NV).
+ */
+/* NV_PRESERVES_UV:
+ * This symbol, if defined, indicates that a variable of type NVTYPE
+ * can preserve all the bits of a variable of type UVTYPE.
+ */
+/* NV_PRESERVES_UV_BITS:
+ * This symbol contains the number of bits a variable of type NVTYPE
+ * can preserve of a variable of type UVTYPE.
+ */
+#define IVTYPE int /**/
+#define UVTYPE unsigned int /**/
+#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 _error_ /**/
+#define U64TYPE _error_ /**/
+#endif
+#define NVTYPE double /**/
+#define IVSIZE 4 /**/
+#define UVSIZE 4 /**/
+#define I8SIZE 1 /**/
+#define U8SIZE 1 /**/
+#define I16SIZE 2 /**/
+#define U16SIZE 2 /**/
+#define I32SIZE 4 /**/
+#define U32SIZE 4 /**/
+#ifdef HAS_QUAD
+#define I64SIZE _error_ /**/
+#define U64SIZE _error_ /**/
+#endif
+#define NVSIZE 8 /**/
+#define NV_PRESERVES_UV
+#define NV_PRESERVES_UV_BITS 32
+
+/* 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 in lowercase abcdef.
+ */
+/* NVef:
+ * This symbol defines the format string used for printing a Perl NV
+ * using %e-ish floating point format.
+ */
+/* NVff:
+ * This symbol defines the format string used for printing a Perl NV
+ * using %f-ish floating point format.
+ */
+/* NVgf:
+ * This symbol defines the format string used for printing a Perl NV
+ * using %g-ish floating point format.
+ */
+#define IVdf "d" /**/
+#define UVuf "u" /**/
+#define UVof "o" /**/
+#define UVxf "x" /**/
+#define NVef "e" /**/
+#define NVff "f" /**/
+#define NVgf "g" /**/
+
+/* 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 "/system/ported/perl/lib/5.7" /**/
+#define PRIVLIB_EXP "/system/ported/perl/lib/5.7" /**/
+
+/* 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 4 /**/
+
+/* 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() rand()/(RAND_MAX+1) /**/
+#define Rand_seed_t unsigned int /**/
+#define seedDrand01(x) srand((Rand_seed_t)x) /**/
+#define RANDBITS 15 /**/
+
+/* 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 1 /**/
+
+/* 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
+ * 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 "ZERO","ABRT","FPE","ILL","INT","SEGV","TERM","USR1","USR2","IO","HUP","URG","ALRM","KILL","PIPE","QUIT","CHLD","CONT","STOP","TSTP","TTIN","TTOU","BUS","RT1","RT2","RT3","RT4","RT5","RT6","RT7","RT8",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,0 /**/
+
+/* 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.
+ * 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 "" /**/
+/*#define SITEARCH_EXP "" /**/
+
+/* SITELIB:
+ * 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.
+ * 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 "/system/ported/perl/lib/site/5.7" /**/
+#define SITELIB_EXP "/system/ported/perl/lib/site/5.7" /**/
+#define SITELIB_STEM "/system/ported/perl/lib/site" /**/
+
+/* Size_t_size:
+ * This symbol holds the size of a Size_t in bytes.
+ */
+#define Size_t_size 4 /* */
+
+/* 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
+ * script to make sure (one hopes) that it runs with perl and not
+ * some shell.
+ */
+#define STARTPERL "!perl.pm" /**/
+
+/* HAS_STDIO_STREAM_ARRAY:
+ * This symbol, if defined, tells that there is an array
+ * holding the stdio streams.
+ */
+/* STDIO_STREAM_ARRAY:
+ * This symbol tells the name of the array holding the stdio streams.
+ * Usual values include _iob, __iob, and __sF.
+ */
+#define HAS_STDIO_STREAM_ARRAY /**/
+#define STDIO_STREAM_ARRAY _iob
+
+/* Uid_t_f:
+ * This symbol defines the format string used for printing a Uid_t.
+ */
+#define Uid_t_f "d" /**/
+
+/* Uid_t_sign:
+ * This symbol holds the signedess of a Uid_t.
+ * 1 for unsigned, -1 for signed.
+ */
+#define Uid_t_sign -1 /* UID sign */
+
+/* Uid_t_size:
+ * This symbol holds the size of a Uid_t in bytes.
+ */
+#define Uid_t_size 4 /* UID size */
+
+/* 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 Uid_t uid_t /* UID type */
+
+/* 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.
+ */
+#ifndef USE_LARGE_FILES
+/*#define USE_LARGE_FILES /**/
+#endif
+
+/* USE_LONG_DOUBLE:
+ * This symbol, if defined, indicates that long doubles should
+ * be used when available.
+ */
+#ifndef USE_LONG_DOUBLE
+#define USE_LONG_DOUBLE /**/
+#endif
+
+/* USE_MORE_BITS:
+ * This symbol, if defined, indicates that 64-bit interfaces and
+ * long doubles should be used when available.
+ */
+#ifndef USE_MORE_BITS
+/*#define USE_MORE_BITS /**/
+#endif
+
+/* MULTIPLICITY:
+ * This symbol, if defined, indicates that Perl should
+ * be built to use multiplicity.
+ */
+#ifndef MULTIPLICITY
+/*#define MULTIPLICITY /**/
+#endif
+
+/* 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.
+ */
+#ifndef USE_PERLIO
+/*#define USE_PERLIO /**/
+#endif
+
+/* USE_SOCKS:
+ * This symbol, if defined, indicates that Perl should
+ * 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_5005THREADS /**/
+/*#define USE_ITHREADS /**/
+#if defined(USE_5005THREADS) && !defined(USE_ITHREADS)
+#define USE_THREADS /* until src is revised*/
+#endif
+/*#define OLD_PTHREADS_API /**/
+
+/* 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.
+ */
+/* 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 PERL_VENDORARCH "" /**/
+#define PERL_VENDORARCH_EXP "" /**/
+
+/* 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.
+ */
+/* 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 PERL_VENDORLIB_EXP "" /**/
+#define PERL_VENDORLIB_STEM "" /**/
+
+/* 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
+
+/* 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 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 /system/ported/perl/lib/site/5.7 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.00563"
+#define PERL_PM_APIVERSION "5.005"
+
+/* HAS_GETPGRP:
+ * This symbol, if defined, indicates that the getpgrp routine is
+ * available to get the current process group.
+ */
+/* USE_BSD_GETPGRP:
+ * This symbol, if defined, indicates that getpgrp needs one
+ * arguments whereas USG one needs none.
+ */
+#define HAS_GETPGRP /**/
+/*#define USE_BSD_GETPGRP /**/
+
+/* HAS_SETPGRP:
+ * This symbol, if defined, indicates that the setpgrp routine is
+ * available to set the current process group.
+ */
+/* USE_BSD_SETPGRP:
+ * This symbol, if defined, indicates that setpgrp needs two
+ * arguments whereas USG one needs none. See also HAS_SETPGID
+ * for a POSIX interface.
+ */
+/*#define HAS_SETPGRP /**/
+/*#define USE_BSD_SETPGRP /**/
+
+/* HAS__FWALK:
+ * This symbol, if defined, indicates that the _fwalk system call is
+ * available to apply a function to all the file handles.
+ */
+/*#define HAS__FWALK /**/
+
+/* FCNTL_CAN_LOCK:
+ * This symbol, if defined, indicates that fcntl() can be used
+ * for file locking. Normally on Unix systems this is defined.
+ * It may be undefined on VMS.
+ */
+#define FCNTL_CAN_LOCK /**/
+
+/* HAS_FSYNC:
+ * This symbol, if defined, indicates that the fsync routine is
+ * available to write a file's modified data and attributes to
+ * permanent storage.
+ */
+/*#define HAS_FSYNC /**/
+
+/* HAS_SBRK_PROTO:
+ * This symbol, if defined, indicates that the system provides
+ * a prototype for the sbrk() function. Otherwise, it is up
+ * to the program to supply one. Good guesses are
+ * extern void* sbrk _((int));
+ * extern void* sbrk _((size_t));
+ */
+/*#define HAS_SBRK_PROTO /**/
+
+#endif
diff --git a/gnu/usr.bin/perl/vos/config.ga.def b/gnu/usr.bin/perl/vos/config.ga.def
new file mode 100644
index 00000000000..df7b952ed82
--- /dev/null
+++ b/gnu/usr.bin/perl/vos/config.ga.def
@@ -0,0 +1,492 @@
+$alignbytes='8'
+$aphostname=''
+$archlib=''
+$archlibexp=''
+$archname='vos'
+$bin='/system/ported/command_library'
+$binexp='/system/ported/command_library'
+$byteorder='4321'
+$castflags='0'
+$cf_by='Paul_Green@stratus.com'
+$cf_time='2001-02-12 21:00 UTC'
+$cpp_stuff='42'
+$cpplast='-'
+$cppminus='-'
+$cpprun='cc -E -'
+$cppstdin='cc -E'
+$crosscompile='undef'
+$d__fwalk='undef'
+$d_access='define'
+$d_accessx='undef'
+$d_alarm='define'
+$d_archlib='undef'
+$d_atolf='undef'
+$d_atoll='undef'
+$d_attribut='undef'
+$d_bcmp='undef'
+$d_bcopy='undef'
+$d_bincompat5005='undef'
+$d_bsdgetpgrp='undef'
+$d_bsdsetpgrp='undef'
+$d_bzero='undef'
+$d_casti32='undef'
+$d_castneg='define'
+$d_charvspr='undef'
+$d_chown='define'
+$d_chroot='undef'
+$d_chsize='undef'
+$d_const='define'
+$d_crypt='undef'
+$d_csh='define'
+$d_cuserid='undef'
+$d_dbl_dig='define'
+$d_difftime='define'
+$d_dirnamlen='undef'
+$d_dlerror='undef'
+$d_dlsymun='undef'
+$d_dosuid='undef'
+$d_drand48proto='undef'
+$d_dup2='define'
+$d_eaccess='undef'
+$d_endgrent='undef'
+$d_endhent='define'
+$d_endnent='define'
+$d_endpent='define'
+$d_endpwent='undef'
+$d_endsent='define'
+$d_eofnblk='define'
+$d_fchmod='define'
+$d_fchown='undef'
+$d_fcntl='define'
+$d_fcntl_can_lock='define'
+$d_fd_set='undef'
+$d_fgetpos='define'
+$d_flexfnam='define'
+$d_flock='undef'
+$d_fork='define'
+$d_fpathconf='define'
+$d_fpos64_t='undef'
+$d_frexpl='undef'
+$d_fs_data_s='undef'
+$d_fseeko='undef'
+$d_fsetpos='define'
+$d_fstatfs='undef'
+$d_fstatvfs='undef'
+$d_fsync='undef'
+$d_ftello='undef'
+$d_Gconvert='sprintf((b),"%.*g",(n),(x))'
+$d_getcwd='define'
+$d_getespwnam='undef'
+$d_getfsstat='undef'
+$d_getgrent='undef'
+$d_getgrps='undef'
+$d_gethbyaddr='define'
+$d_gethbyname='define'
+$d_gethent='define'
+$d_gethname='define'
+$d_gethostprotos='define'
+$d_getlogin='define'
+$d_getmnt='undef'
+$d_getmntent='undef'
+$d_getnbyaddr='define'
+$d_getnbyname='define'
+$d_getnent='define'
+$d_getnetprotos='define'
+$d_getpagsz='undef'
+$d_getpbyname='define'
+$d_getpbynumber='define'
+$d_getpent='define'
+$d_getpgid='undef'
+$d_getpgrp2='undef'
+$d_getpgrp='define'
+$d_getppid='define'
+$d_getprior='undef'
+$d_getprotoprotos='define'
+$d_getprpwnam='undef'
+$d_getpwent='undef'
+$d_getsbyname='define'
+$d_getsbyport='define'
+$d_getsent='define'
+$d_getservprotos='define'
+$d_getspnam='undef'
+$d_gettimeod='undef'
+$d_gnulibc='undef'
+$d_grpasswd='undef'
+$d_hasmntopt='undef'
+$d_htonl='define'
+$d_iconv='undef'
+$d_index='undef'
+$d_inetaton='undef'
+$d_int64_t='undef'
+$d_isascii='define'
+$d_isnan='undef'
+$d_isnanl='undef'
+$d_killpg='undef'
+$d_lchown='undef'
+$d_ldbl_dig='define'
+$d_link='undef'
+$d_locconv='define'
+$d_lockf='define'
+$d_longdbl='define'
+$d_longlong='undef'
+$d_lseekproto='define'
+$d_lstat='define'
+$d_madvise='undef'
+$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_mkstemp='undef'
+$d_mkstemps='undef'
+$d_mkfifo='define'
+$d_mktime='define'
+$d_mmap='define'
+$d_modfl='undef'
+$d_mprotect='undef'
+$d_msg='undef'
+$d_msg_ctrunc='undef'
+$d_msg_dontroute='undef'
+$d_msg_oob='undef'
+$d_msg_peek='undef'
+$d_msg_proxy='undef'
+$d_msync='undef'
+$d_munmap='define'
+$d_mymalloc='undef'
+$d_nice='undef'
+$d_nv_preserves_uv='define'
+$d_nv_preserves_uv_bits='32'
+$d_off64_t='undef'
+$d_old_pthread_create_joinable='undef'
+$d_oldpthreads='undef'
+$d_open3='define'
+$d_pathconf='define'
+$d_perl_otherlibdirs='undef'
+$d_pause='define'
+$d_phostname='undef'
+$d_pipe='define'
+$d_poll='define'
+$d_PRIeldbl='define'
+$d_PRIfldbl='define'
+$d_PRIgldbl='define'
+$d_pthread_yield='undef'
+$d_pwage='undef'
+$d_pwchange='undef'
+$d_pwclass='undef'
+$d_pwcomment='undef'
+$d_pwexpire='undef'
+$d_pwgecos='undef'
+$d_pwpasswd='undef'
+$d_pwquota='undef'
+$d_quad='undef'
+$d_readdir='define'
+$d_readlink='define'
+$d_rename='define'
+$d_rewinddir='define'
+$d_rmdir='define'
+$d_safebcpy='undef'
+$d_safemcpy='undef'
+$d_sanemcmp='define'
+$d_sbrkproto='undef'
+$d_sched_yield='undef'
+$d_scm_rights='undef'
+$d_SCNfldbl='define'
+$d_seekdir='undef'
+$d_select='define'
+$d_sem='undef'
+$d_semctl_semid_ds='undef'
+$d_semctl_semun='undef'
+$d_setegid='define'
+$d_seteuid='define'
+$d_setgrent='undef'
+$d_setgrps='undef'
+$d_sethent='define'
+$d_setlinebuf='define'
+$d_setlocale='define'
+$d_setnent='define'
+$d_setpent='define'
+$d_setpgid='define'
+$d_setpgrp2='undef'
+$d_setpgrp='undef'
+$d_setprior='undef'
+$d_setproctitle='undef'
+$d_setpwent='undef'
+$d_setregid='undef'
+$d_setresgid='undef'
+$d_setresuid='undef'
+$d_setreuid='undef'
+$d_setrgid='undef'
+$d_setruid='undef'
+$d_setsent='define'
+$d_setsid='define'
+$d_setvbuf='define'
+$d_sfio='undef'
+$d_shm='undef'
+$d_shmatprototype='define'
+$d_sigaction='define'
+$d_sigsetjmp='define'
+$d_socket='define'
+$d_sockpair='undef'
+$d_socks5_init='undef'
+$d_sqrtl='undef'
+$d_statblks='undef'
+$d_statfs_f_flags='undef'
+$d_statfs_s='undef'
+$d_stdio_cnt_lval='define'
+$d_stdio_ptr_lval='define'
+$d_stdio_ptr_lval_sets_cnt='undef'
+$d_stdio_ptr_lval_nochange_cnt='undef'
+$d_stdio_stream_array='define'
+$d_stdiobase='define'
+$d_stdstdio='define'
+$d_strchr='define'
+$d_strcoll='define'
+$d_strctcpy='define'
+$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='define'
+$d_symlink='define'
+$d_syscall='undef'
+$d_sysconf='define'
+$d_syserrlst='define'
+$d_system='define'
+$d_tcgetpgrp='define'
+$d_tcsetpgrp='define'
+$d_telldir='undef'
+$d_telldirproto='undef'
+$d_times='define'
+$d_truncate='undef'
+$d_tzname='define'
+$d_umask='define'
+$d_uname='define'
+$d_union_semun='undef'
+$d_ustat='undef'
+$d_vendorarch='define'
+$d_vendorlib='define'
+$d_vfork='undef'
+$d_void_closedir='undef'
+$d_volatile='define'
+$d_vprintf='define'
+$d_wait4='define'
+$d_waitpid='define'
+$d_wcstombs='define'
+$d_wctomb='define'
+$db_hashtype='int'
+$db_prefixtype='int'
+$defvoidused='15'
+$direntrytype='struct dirent'
+$doublesize='8'
+$drand01='rand()/(RAND_MAX+1)'
+$eagain='EAGAIN'
+$ebcdic='undef'
+$fflushall='undef'
+$fflushNULL='define'
+$fpostype='fpos_t'
+$freetype='void'
+$full_csh='/system/ported/command_library/bash.pm'
+$full_sed='/system/ported/command_library/sed.pm'
+$gidformat='"d"'
+$gidsize='4'
+$gidsign='-1'
+$gidtype='gid_t'
+$groupstype='gid_t'
+$i16size='2'
+$i16type='short'
+$i32size='4'
+$i32type='int'
+$i64size='_error_'
+$i64type='_error_'
+$i8size='1'
+$i8type='char'
+$i_arpainet='define'
+$i_dbm='undef'
+$i_dirent='define'
+$i_dlfcn='undef'
+$i_fcntl='define'
+$i_float='define'
+$i_grp='define'
+$i_iconv='undef'
+$i_ieeefp='undef'
+$i_inttypes='undef'
+$i_libutil='undef'
+$i_limits='define'
+$i_locale='define'
+$i_machcthr='undef'
+$i_math='define'
+$i_memory='undef'
+$i_mntent='undef'
+$i_ndbm='undef'
+$i_netdb='define'
+$i_neterrno='undef'
+$i_netinettcp='define'
+$i_niin='define'
+$i_poll='undef'
+$i_prot='undef'
+$i_pthread='undef'
+$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='undef'
+$i_sysdir='undef'
+$i_sysfile='undef'
+$i_sysioctl='define'
+$i_syslog='undef'
+$i_sysmode='undef'
+$i_sysmount='undef'
+$i_sysndir='undef'
+$i_sysparam='undef'
+$i_sysresrc='undef'
+$i_syssecrt='undef'
+$i_sysselct='define'
+$i_sysstat='define'
+$i_sysstatfs='undef'
+$i_sysstatvfs='undef'
+$i_systime='define'
+$i_systimek='undef'
+$i_systimes='define'
+$i_systypes='define'
+$i_sysuio='undef'
+$i_sysun='undef'
+$i_sysutsname='define'
+$i_sysvfs='undef'
+$i_syswait='define'
+$i_termio='undef'
+$i_termios='define'
+$i_time='undef'
+$i_unistd='define'
+$i_ustat='undef'
+$i_utime='define'
+$i_values='define'
+$i_varargs='undef'
+$i_vfork='undef'
+$Id='$Id'
+$inc_version_list_init='0'
+$installusrbinperl='undef'
+$intsize='4'
+$ivdformat='"d"'
+$ivsize='4'
+$ivtype='int'
+$longdblsize='8'
+$longlongsize='_error_'
+$longsize='4'
+$lseeksize='4'
+$lseektype='off_t'
+$malloctype='void *'
+$mmaptype='void *'
+$modetype='mode_t'
+$multiarch='undef'
+$myuname='VOS'
+$netdb_hlen_type='int'
+$netdb_host_type='char *'
+$netdb_name_type='char *'
+$netdb_net_type='long'
+$nveformat='"e"'
+$nvfformat='"f"'
+$nvgformat='"g"'
+$nvsize='8'
+$nvtype='double'
+$o_nonblock='O_NONBLOCK'
+$old_pthread_create_joinable=''
+$osname='VOS'
+$otherlibdirs=''
+$package='perl5'
+$pidtype='pid_t'
+$pm_apiversion='5.005'
+$privlib='/system/ported/perl/lib/5.6'
+$privlibexp='/system/ported/perl/lib/5.6'
+$prototype='define'
+$ptrsize='4'
+$quadkind='_error_'
+$quadtype='_error_'
+$randbits='15'
+$randseedtype='unsigned int'
+$rd_nodata='-1'
+$sched_yield=''
+$seedfunc='srand'
+$selectminbits='1'
+$selecttype='fd_set *'
+$sh='/system/ported/command_library/bash.pm'
+$shmattype='void *'
+$shortsize='2'
+$sig_name_init='"ZERO","ABRT","FPE","ILL","INT","SEGV","TERM","USR1","USR2","IO","HUP","URG","ALRM","CHLD","CONT","KILL","STOP","PIPE","QUIT","BUS","TRAP","TSTP","TTIN","TTOU","RT1","RT2","RT3","RT4","RT5","RT6","RT7","RT8",0'
+$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,0'
+$signal_t='void'
+$sitearch=''
+$sitearchexp=''
+$sitelib='/system/ported/perl/lib/site/5.6'
+$sitelibexp='/system/ported/perl/lib/site/5.6'
+$sitelib_stem='/system/ported/perl/lib/site'
+$sizesize='4'
+$sizetype='size_t'
+$socksizetype='int'
+$sPRIeldbl='"Le"'
+$sPRIfldbl='"Lf"'
+$sPRIgldbl='"Lg"'
+$src='/vos_ftp_site/pub/vos/posix/(alpha|ga)/perl'
+$sSCNfldbl='"Lf"'
+$ssizetype='ssize_t'
+$startperl='!perl.pm'
+$stdchar='unsigned char'
+$stdio_base='((fp)->_base)'
+$stdio_bufsiz='((fp)->_cnt + (fp)->_ptr - (fp)->_base)'
+$stdio_cnt='((fp)->_cnt)'
+$stdio_ptr='((fp)->_ptr)'
+$stdio_stream_array='_iob'
+$timetype='time_t'
+$u16size='2'
+$u16type='unsigned short'
+$u32size='4'
+$u32type='unsigned int'
+$u64size='_error_'
+$u64type='_error_'
+$u8size='1'
+$u8type='unsigned char'
+$uidformat='"d"'
+$uidsize='4'
+$uidsign='-1'
+$uidtype='uid_t'
+$undef='$undef'
+$uquadtype='_error_'
+$use5005threads='undef'
+$use64bitall='undef'
+$use64bitint='undef'
+$usedl='undef'
+$useithreads='undef'
+$uselargefiles='undef'
+$uselongdouble='define'
+$usemorebits='undef'
+$usemultiplicity='undef'
+$useperlio='undef'
+$usesocks='undef'
+$uvoformat='"o"'
+$uvsize='4'
+$uvtype='unsigned int'
+$uvuformat='"u"'
+$uvxformat='"x"'
+$vendorarch=''
+$vendorarchexp=''
+$vendorlib_stem=''
+$vendorlibexp=''
+$voidflags='15'
+$xs_apiversion='5.00563'
diff --git a/gnu/usr.bin/perl/vos/config.ga.h b/gnu/usr.bin/perl/vos/config.ga.h
new file mode 100644
index 00000000000..32f74c459c9
--- /dev/null
+++ b/gnu/usr.bin/perl/vos/config.ga.h
@@ -0,0 +1,3219 @@
+/*
+ * This file was produced by running the config_h.SH script, which
+ * gets its values from config.sh, which is generally produced by
+ * running Configure.
+ *
+ * Feel free to modify any of this as the need arises. Note, however,
+ * that running config_h.SH again will wipe out any changes you've made.
+ * For a more permanent change edit config.sh and rerun config_h.SH.
+ *
+ * \$Id: config.ga.h,v 1.1.1.1 2001/05/24 18:26:14 millert Exp $
+ */
+
+/*
+ * Package name : perl5
+ * Source directory : /vos_ftp_site/pub/vos/posix/(alpha|ga)/perl
+ * Configuration time: 2001-02-12 21:00 UTC
+ * Configured by : Paul_Green@stratus.com
+ * Target system : VOS
+ */
+
+#ifndef _config_h_
+#define _config_h_
+
+/* LOC_SED:
+ * This symbol holds the complete pathname to the sed program.
+ */
+#define LOC_SED "/system/ported/command_library/sed.pm" /**/
+
+/* HAS_ALARM:
+ * This symbol, if defined, indicates that the alarm routine is
+ * available.
+ */
+#define HAS_ALARM /**/
+
+/* HASATTRIBUTE:
+ * 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 /**/
+#ifndef HASATTRIBUTE
+#define __attribute__(_arg_)
+#endif
+
+/* HAS_BCMP:
+ * This symbol is defined if the bcmp() routine is available to
+ * compare blocks of memory.
+ */
+/*#define HAS_BCMP /**/
+
+/* HAS_BCOPY:
+ * This symbol is defined if the bcopy() routine is available to
+ * copy blocks of memory.
+ */
+/*#define HAS_BCOPY /**/
+
+/* HAS_BZERO:
+ * This symbol is defined if the bzero() routine is available to
+ * set a memory block to 0.
+ */
+/*#define HAS_BZERO /**/
+
+/* HAS_CHOWN:
+ * This symbol, if defined, indicates that the chown routine is
+ * available.
+ */
+#define HAS_CHOWN /**/
+
+/* HAS_CHROOT:
+ * This symbol, if defined, indicates that the chroot routine is
+ * available.
+ */
+/*#define HAS_CHROOT /**/
+
+/* HAS_CHSIZE:
+ * This symbol, if defined, indicates that the chsize routine is available
+ * to truncate files. You might need a -lx to get this routine.
+ */
+/*#define HAS_CHSIZE /**/
+
+/* HASCONST:
+ * This symbol, if defined, indicates that this C compiler knows about
+ * the const type. There is no need to actually test for that symbol
+ * within your programs. The mere use of the "const" keyword will
+ * trigger the necessary tests.
+ */
+#define HASCONST /**/
+#ifndef HASCONST
+#define const
+#endif
+
+/* HAS_CRYPT:
+ * This symbol, if defined, indicates that the crypt routine is available
+ * to encrypt passwords and the like.
+ */
+/*#define HAS_CRYPT /**/
+
+/* HAS_CUSERID:
+ * This symbol, if defined, indicates that the cuserid routine is
+ * available to get character login names.
+ */
+/*#define HAS_CUSERID /**/
+
+/* HAS_DBL_DIG:
+ * This symbol, if defined, indicates that this system's <float.h>
+ * or <limits.h> defines the symbol DBL_DIG, which is the number
+ * of significant digits in a double precision number. If this
+ * symbol is not defined, a guess of 15 is usually pretty good.
+ */
+#define HAS_DBL_DIG /* */
+
+/* HAS_DIFFTIME:
+ * This symbol, if defined, indicates that the difftime routine is
+ * available.
+ */
+#define HAS_DIFFTIME /**/
+
+/* HAS_DLERROR:
+ * This symbol, if defined, indicates that the dlerror routine is
+ * available to return a string describing the last error that
+ * occurred from a call to dlopen(), dlclose() or dlsym().
+ */
+/*#define HAS_DLERROR /**/
+
+/* SETUID_SCRIPTS_ARE_SECURE_NOW:
+ * This symbol, if defined, indicates that the bug that prevents
+ * setuid scripts from being secure is not present in this kernel.
+ */
+/* DOSUID:
+ * This symbol, if defined, indicates that the C program should
+ * check the script that it is executing for setuid/setgid bits, and
+ * attempt to emulate setuid/setgid on systems that have disabled
+ * setuid #! scripts because the kernel can't do it securely.
+ * It is up to the package designer to make sure that this emulation
+ * is done securely. Among other things, it should do an fstat on
+ * the script it just opened to make sure it really is a setuid/setgid
+ * script, it should make sure the arguments passed correspond exactly
+ * to the argument on the #! line, and it should not trust any
+ * subprocesses to which it must pass the filename rather than the
+ * file descriptor of the script to be executed.
+ */
+#define SETUID_SCRIPTS_ARE_SECURE_NOW /**/
+/*#define DOSUID /**/
+
+/* HAS_DUP2:
+ * This symbol, if defined, indicates that the dup2 routine is
+ * available to duplicate file descriptors.
+ */
+#define HAS_DUP2 /**/
+
+/* HAS_FCHMOD:
+ * This symbol, if defined, indicates that the fchmod routine is available
+ * to change mode of opened files. If unavailable, use chmod().
+ */
+#define HAS_FCHMOD /**/
+
+/* HAS_FCHOWN:
+ * This symbol, if defined, indicates that the fchown routine is available
+ * to change ownership of opened files. If unavailable, use chown().
+ */
+/*#define HAS_FCHOWN /**/
+
+/* HAS_FCNTL:
+ * This symbol, if defined, indicates to the C program that
+ * the fcntl() function exists.
+ */
+#define HAS_FCNTL /**/
+
+/* HAS_FGETPOS:
+ * This symbol, if defined, indicates that the fgetpos routine is
+ * available to get the file position indicator, similar to ftell().
+ */
+#define HAS_FGETPOS /**/
+
+/* HAS_FLOCK:
+ * This symbol, if defined, indicates that the flock routine is
+ * available to do file locking.
+ */
+/*#define HAS_FLOCK /**/
+
+/* HAS_FORK:
+ * This symbol, if defined, indicates that the fork routine is
+ * available.
+ */
+#define HAS_FORK /**/
+
+/* HAS_FSETPOS:
+ * This symbol, if defined, indicates that the fsetpos routine is
+ * available to set the file position indicator, similar to fseek().
+ */
+#define HAS_FSETPOS /**/
+
+/* HAS_GETTIMEOFDAY:
+ * This symbol, if defined, indicates that the gettimeofday() system
+ * call is available for a sub-second accuracy clock. Usually, the file
+ * <sys/resource.h> needs to be included (see I_SYS_RESOURCE).
+ * The type "Timeval" should be used to refer to "struct timeval".
+ */
+/*#define HAS_GETTIMEOFDAY /**/
+#ifdef HAS_GETTIMEOFDAY
+#define Timeval struct timeval /* Structure used by gettimeofday() */
+#endif
+
+/* HAS_GETGROUPS:
+ * This symbol, if defined, indicates that the getgroups() routine is
+ * available to get the list of process groups. If unavailable, multiple
+ * groups are probably not supported.
+ */
+/*#define HAS_GETGROUPS /**/
+
+/* HAS_GETLOGIN:
+ * This symbol, if defined, indicates that the getlogin routine is
+ * available to get the login name.
+ */
+#define HAS_GETLOGIN /**/
+
+/* HAS_GETPGID:
+ * This symbol, if defined, indicates to the C program that
+ * the getpgid(pid) function is available to get the
+ * process group id.
+ */
+/*#define HAS_GETPGID /**/
+
+/* HAS_GETPGRP2:
+ * This symbol, if defined, indicates that the getpgrp2() (as in DG/UX)
+ * routine is available to get the current process group.
+ */
+/*#define HAS_GETPGRP2 /**/
+
+/* HAS_GETPPID:
+ * This symbol, if defined, indicates that the getppid routine is
+ * available to get the parent process ID.
+ */
+#define HAS_GETPPID /**/
+
+/* HAS_GETPRIORITY:
+ * This symbol, if defined, indicates that the getpriority routine is
+ * available to get a process's priority.
+ */
+/*#define HAS_GETPRIORITY /**/
+
+/* 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"
+ * strings.
+ */
+/*#define HAS_INET_ATON /**/
+
+/* HAS_KILLPG:
+ * This symbol, if defined, indicates that the killpg routine is available
+ * to kill process groups. If unavailable, you probably should use kill
+ * with a negative process number.
+ */
+/*#define HAS_KILLPG /**/
+
+/* HAS_LINK:
+ * This symbol, if defined, indicates that the link routine is
+ * available to create hard links.
+ */
+/*#define HAS_LINK /**/
+
+/* HAS_LOCALECONV:
+ * This symbol, if defined, indicates that the localeconv routine is
+ * available for numeric and monetary formatting conventions.
+ */
+#define HAS_LOCALECONV /**/
+
+/* HAS_LOCKF:
+ * This symbol, if defined, indicates that the lockf routine is
+ * available to do file locking.
+ */
+#define HAS_LOCKF /**/
+
+/* HAS_LSTAT:
+ * This symbol, if defined, indicates that the lstat routine is
+ * available to do file stats on symbolic links.
+ */
+#define HAS_LSTAT /**/
+
+/* HAS_MBLEN:
+ * This symbol, if defined, indicates that the mblen routine is available
+ * to find the number of bytes in a multibye character.
+ */
+#define HAS_MBLEN /**/
+
+/* HAS_MBSTOWCS:
+ * This symbol, if defined, indicates that the mbstowcs routine is
+ * available to covert a multibyte string into a wide character string.
+ */
+#define HAS_MBSTOWCS /**/
+
+/* HAS_MBTOWC:
+ * This symbol, if defined, indicates that the mbtowc routine is available
+ * to covert a multibyte to a wide character.
+ */
+#define HAS_MBTOWC /**/
+
+/* HAS_MEMCMP:
+ * This symbol, if defined, indicates that the memcmp routine is available
+ * to compare blocks of memory.
+ */
+#define HAS_MEMCMP /**/
+
+/* HAS_MEMCPY:
+ * This symbol, if defined, indicates that the memcpy routine is available
+ * to copy blocks of memory.
+ */
+#define HAS_MEMCPY /**/
+
+/* HAS_MEMMOVE:
+ * This symbol, if defined, indicates that the memmove routine is available
+ * to copy potentially overlapping blocks of memory. This should be used
+ * only when HAS_SAFE_BCOPY is not defined. If neither is there, roll your
+ * own version.
+ */
+#define HAS_MEMMOVE /**/
+
+/* HAS_MEMSET:
+ * This symbol, if defined, indicates that the memset routine is available
+ * to set blocks of memory.
+ */
+#define HAS_MEMSET /**/
+
+/* HAS_MKDIR:
+ * This symbol, if defined, indicates that the mkdir routine is available
+ * to create directories. Otherwise you should fork off a new process to
+ * exec /bin/mkdir.
+ */
+#define HAS_MKDIR /**/
+
+/* HAS_MKFIFO:
+ * This symbol, if defined, indicates that the mkfifo routine is
+ * available to create FIFOs. Otherwise, mknod should be able to
+ * do it for you. However, if mkfifo is there, mknod might require
+ * super-user privileges which mkfifo will not.
+ */
+#define HAS_MKFIFO /**/
+
+/* HAS_MKTIME:
+ * This symbol, if defined, indicates that the mktime routine is
+ * available.
+ */
+#define HAS_MKTIME /**/
+
+/* HAS_MSYNC:
+ * This symbol, if defined, indicates that the msync system call is
+ * available to synchronize a mapped file.
+ */
+/*#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
+ * available.
+ */
+/*#define HAS_NICE /**/
+
+/* HAS_PATHCONF:
+ * This symbol, if defined, indicates that pathconf() is available
+ * to determine file-system related limits and options associated
+ * with a given filename.
+ */
+/* HAS_FPATHCONF:
+ * This symbol, if defined, indicates that pathconf() is available
+ * to determine file-system related limits and options associated
+ * with a given open file descriptor.
+ */
+#define HAS_PATHCONF /**/
+#define HAS_FPATHCONF /**/
+
+/* HAS_PAUSE:
+ * This symbol, if defined, indicates that the pause routine is
+ * available to suspend a process until a signal is received.
+ */
+#define HAS_PAUSE /**/
+
+/* HAS_PIPE:
+ * This symbol, if defined, indicates that the pipe routine is
+ * available to create an inter-process channel.
+ */
+#define HAS_PIPE /**/
+
+/* HAS_POLL:
+ * This symbol, if defined, indicates that the poll routine is
+ * available to poll active file descriptors. You may safely
+ * include <poll.h> when this symbol is defined.
+ */
+#define HAS_POLL /**/
+
+/* HAS_READDIR:
+ * This symbol, if defined, indicates that the readdir routine is
+ * available to read directory entries. You may have to include
+ * <dirent.h>. See I_DIRENT.
+ */
+#define HAS_READDIR /**/
+
+/* HAS_SEEKDIR:
+ * This symbol, if defined, indicates that the seekdir routine is
+ * available. You may have to include <dirent.h>. See I_DIRENT.
+ */
+/*#define HAS_SEEKDIR /**/
+
+/* HAS_TELLDIR:
+ * This symbol, if defined, indicates that the telldir routine is
+ * available. You may have to include <dirent.h>. See I_DIRENT.
+ */
+/*#define HAS_TELLDIR /**/
+
+/* HAS_REWINDDIR:
+ * This symbol, if defined, indicates that the rewinddir routine is
+ * available. You may have to include <dirent.h>. See I_DIRENT.
+ */
+#define HAS_REWINDDIR /**/
+
+/* HAS_READLINK:
+ * This symbol, if defined, indicates that the readlink routine is
+ * available to read the value of a symbolic link.
+ */
+#define HAS_READLINK /**/
+
+/* HAS_RENAME:
+ * This symbol, if defined, indicates that the rename routine is available
+ * to rename files. Otherwise you should do the unlink(), link(), unlink()
+ * trick.
+ */
+#define HAS_RENAME /**/
+
+/* HAS_RMDIR:
+ * This symbol, if defined, indicates that the rmdir routine is
+ * available to remove directories. Otherwise you should fork off a
+ * new process to exec /bin/rmdir.
+ */
+#define HAS_RMDIR /**/
+
+/* HAS_SELECT:
+ * This symbol, if defined, indicates that the select routine is
+ * available to select active file descriptors. If the timeout field
+ * is used, <sys/time.h> may need to be included.
+ */
+#define HAS_SELECT /**/
+
+/* HAS_SETEGID:
+ * This symbol, if defined, indicates that the setegid routine is available
+ * to change the effective gid of the current program.
+ */
+#define HAS_SETEGID /**/
+
+/* HAS_SETEUID:
+ * This symbol, if defined, indicates that the seteuid routine is available
+ * to change the effective uid of the current program.
+ */
+#define HAS_SETEUID /**/
+
+/* HAS_SETLINEBUF:
+ * This symbol, if defined, indicates that the setlinebuf routine is
+ * available to change stderr or stdout from block-buffered or unbuffered
+ * to a line-buffered mode.
+ */
+#define HAS_SETLINEBUF /**/
+
+/* HAS_SETLOCALE:
+ * This symbol, if defined, indicates that the setlocale routine is
+ * available to handle locale-specific ctype implementations.
+ */
+#define HAS_SETLOCALE /**/
+
+/* HAS_SETPGID:
+ * This symbol, if defined, indicates that the setpgid(pid, gpid)
+ * routine is available to set process group ID.
+ */
+#define HAS_SETPGID /**/
+
+/* HAS_SETPGRP2:
+ * This symbol, if defined, indicates that the setpgrp2() (as in DG/UX)
+ * routine is available to set the current process group.
+ */
+/*#define HAS_SETPGRP2 /**/
+
+/* HAS_SETPRIORITY:
+ * This symbol, if defined, indicates that the setpriority routine is
+ * available to set a process's priority.
+ */
+/*#define HAS_SETPRIORITY /**/
+
+/* HAS_SETREGID:
+ * This symbol, if defined, indicates that the setregid routine is
+ * available to change the real and effective gid of the current
+ * process.
+ */
+/* HAS_SETRESGID:
+ * This symbol, if defined, indicates that the setresgid routine is
+ * available to change the real, effective and saved gid of the current
+ * process.
+ */
+/*#define HAS_SETREGID /**/
+/*#define HAS_SETRESGID /**/
+
+/* HAS_SETREUID:
+ * This symbol, if defined, indicates that the setreuid routine is
+ * available to change the real and effective uid of the current
+ * process.
+ */
+/* HAS_SETRESUID:
+ * This symbol, if defined, indicates that the setresuid routine is
+ * available to change the real, effective and saved uid of the current
+ * process.
+ */
+/*#define HAS_SETREUID /**/
+/*#define HAS_SETRESUID /**/
+
+/* HAS_SETRGID:
+ * This symbol, if defined, indicates that the setrgid routine is available
+ * to change the real gid of the current program.
+ */
+/*#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 /**/
+
+/* HAS_SETSID:
+ * This symbol, if defined, indicates that the setsid routine is
+ * available to set the process group ID.
+ */
+#define HAS_SETSID /**/
+
+/* Shmat_t:
+ * This symbol holds the return type of the shmat() system call.
+ * Usually set to 'void *' or 'char *'.
+ */
+/* HAS_SHMAT_PROTOTYPE:
+ * This symbol, if defined, indicates that the sys/shm.h includes
+ * a prototype for shmat(). Otherwise, it is up to the program to
+ * guess one. Shmat_t shmat _((int, Shmat_t, int)) is a good guess,
+ * but not always right so it should be emitted by the program only
+ * when HAS_SHMAT_PROTOTYPE is not defined to avoid conflicting defs.
+ */
+#define Shmat_t void * /**/
+#define HAS_SHMAT_PROTOTYPE /**/
+
+/* HAS_STRCHR:
+ * This symbol is defined to indicate that the strchr()/strrchr()
+ * functions are available for string searching. If not, try the
+ * index()/rindex() pair.
+ */
+/* HAS_INDEX:
+ * This symbol is defined to indicate that the index()/rindex()
+ * functions are available for string searching.
+ */
+#define HAS_STRCHR /**/
+/*#define HAS_INDEX /**/
+
+/* HAS_STRCOLL:
+ * This symbol, if defined, indicates that the strcoll routine is
+ * available to compare strings using collating information.
+ */
+#define HAS_STRCOLL /**/
+
+/* USE_STRUCT_COPY:
+ * This symbol, if defined, indicates that this C compiler knows how
+ * to copy structures. If undefined, you'll need to use a block copy
+ * routine of some sort instead.
+ */
+#define USE_STRUCT_COPY /**/
+
+/* HAS_STRTOD:
+ * This symbol, if defined, indicates that the strtod routine is
+ * available to provide better numeric string conversion than atof().
+ */
+#define HAS_STRTOD /**/
+
+/* HAS_STRTOL:
+ * This symbol, if defined, indicates that the strtol routine is available
+ * to provide better numeric string conversion than atoi() and friends.
+ */
+#define HAS_STRTOL /**/
+
+/* HAS_STRTOUL:
+ * This symbol, if defined, indicates that the strtoul routine is
+ * available to provide conversion of strings to unsigned long.
+ */
+#define HAS_STRTOUL /**/
+
+/* HAS_STRXFRM:
+ * This symbol, if defined, indicates that the strxfrm() routine is
+ * available to transform strings.
+ */
+#define HAS_STRXFRM /**/
+
+/* HAS_SYMLINK:
+ * This symbol, if defined, indicates that the symlink routine is available
+ * to create symbolic links.
+ */
+#define HAS_SYMLINK /**/
+
+/* HAS_SYSCALL:
+ * This symbol, if defined, indicates that the syscall routine is
+ * available to call arbitrary system calls. If undefined, that's tough.
+ */
+/*#define HAS_SYSCALL /**/
+
+/* HAS_SYSCONF:
+ * This symbol, if defined, indicates that sysconf() is available
+ * to determine system related limits and options.
+ */
+#define HAS_SYSCONF /**/
+
+/* HAS_SYSTEM:
+ * This symbol, if defined, indicates that the system routine is
+ * available to issue a shell command.
+ */
+#define HAS_SYSTEM /**/
+
+/* HAS_TCGETPGRP:
+ * This symbol, if defined, indicates that the tcgetpgrp routine is
+ * available to get foreground process group ID.
+ */
+#define HAS_TCGETPGRP /**/
+
+/* HAS_TCSETPGRP:
+ * This symbol, if defined, indicates that the tcsetpgrp routine is
+ * available to set foreground process group ID.
+ */
+#define HAS_TCSETPGRP /**/
+
+/* HAS_TRUNCATE:
+ * This symbol, if defined, indicates that the truncate routine is
+ * available to truncate files.
+ */
+/*#define HAS_TRUNCATE /**/
+
+/* HAS_TZNAME:
+ * This symbol, if defined, indicates that the tzname[] array is
+ * available to access timezone names.
+ */
+#define HAS_TZNAME /**/
+
+/* HAS_UMASK:
+ * This symbol, if defined, indicates that the umask routine is
+ * available to set and get the value of the file creation mask.
+ */
+#define HAS_UMASK /**/
+
+/* HASVOLATILE:
+ * This symbol, if defined, indicates that this C compiler knows about
+ * the volatile declaration.
+ */
+#define HASVOLATILE /**/
+#ifndef HASVOLATILE
+#define volatile
+#endif
+
+/* HAS_WAIT4:
+ * This symbol, if defined, indicates that wait4() exists.
+ */
+#define HAS_WAIT4 /**/
+
+/* HAS_WAITPID:
+ * This symbol, if defined, indicates that the waitpid routine is
+ * available to wait for child process.
+ */
+#define HAS_WAITPID /**/
+
+/* HAS_WCSTOMBS:
+ * This symbol, if defined, indicates that the wcstombs routine is
+ * available to convert wide character strings to multibyte strings.
+ */
+#define HAS_WCSTOMBS /**/
+
+/* HAS_WCTOMB:
+ * This symbol, if defined, indicates that the wctomb routine is available
+ * to covert a wide character to a multibyte.
+ */
+#define HAS_WCTOMB /**/
+
+/* I_ARPA_INET:
+ * 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 /**/
+
+/* I_DBM:
+ * This symbol, if defined, indicates that <dbm.h> exists and should
+ * be included.
+ */
+/* I_RPCSVC_DBM:
+ * This symbol, if defined, indicates that <rpcsvc/dbm.h> exists and
+ * should be included.
+ */
+/*#define I_DBM /**/
+/*#define I_RPCSVC_DBM /**/
+
+/* I_DIRENT:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <dirent.h>. Using this symbol also triggers the definition
+ * of the Direntry_t define which ends up being 'struct dirent' or
+ * 'struct direct' depending on the availability of <dirent.h>.
+ */
+/* DIRNAMLEN:
+ * This symbol, if defined, indicates to the C program that the length
+ * of directory entry names is provided by a d_namlen field. Otherwise
+ * you need to do strlen() on the d_name field.
+ */
+/* Direntry_t:
+ * 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
+ * portably declare your directory entries.
+ */
+#define I_DIRENT /**/
+/*#define DIRNAMLEN /**/
+#define Direntry_t struct dirent
+
+/* I_DLFCN:
+ * This symbol, if defined, indicates that <dlfcn.h> exists and should
+ * be included.
+ */
+/*#define I_DLFCN /**/
+
+/* I_FCNTL:
+ * This manifest constant tells the C program to include <fcntl.h>.
+ */
+#define I_FCNTL /**/
+
+/* I_FLOAT:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <float.h> to get definition of symbols like DBL_MAX or
+ * DBL_MIN, i.e. machine dependent floating point values.
+ */
+#define I_FLOAT /**/
+
+/* 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
+ * LONG_MAX, i.e. machine dependant limitations.
+ */
+#define I_LIMITS /**/
+
+/* I_LOCALE:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <locale.h>.
+ */
+#define I_LOCALE /**/
+
+/* I_MATH:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <math.h>.
+ */
+#define I_MATH /**/
+
+/* I_MEMORY:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <memory.h>.
+ */
+/*#define I_MEMORY /**/
+
+/* I_NDBM:
+ * This symbol, if defined, indicates that <ndbm.h> exists and should
+ * be included.
+ */
+/*#define I_NDBM /**/
+
+/* I_NET_ERRNO:
+ * This symbol, if defined, indicates that <net/errno.h> exists and
+ * should be included.
+ */
+/*#define I_NET_ERRNO /**/
+
+/* I_NETINET_IN:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <netinet/in.h>. Otherwise, you may try <sys/in.h>.
+ */
+#define I_NETINET_IN /**/
+
+/* I_SFIO:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sfio.h>.
+ */
+/*#define I_SFIO /**/
+
+/* I_STDDEF:
+ * This symbol, if defined, indicates that <stddef.h> exists and should
+ * be included.
+ */
+#define I_STDDEF /**/
+
+/* I_STDLIB:
+ * This symbol, if defined, indicates that <stdlib.h> exists and should
+ * be included.
+ */
+#define I_STDLIB /**/
+
+/* I_STRING:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <string.h> (USG systems) instead of <strings.h> (BSD systems).
+ */
+#define I_STRING /**/
+
+/* I_SYS_DIR:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/dir.h>.
+ */
+/*#define I_SYS_DIR /**/
+
+/* I_SYS_FILE:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/file.h> to get definition of R_OK and friends.
+ */
+/*#define I_SYS_FILE /**/
+
+/* I_SYS_IOCTL:
+ * This symbol, if defined, indicates that <sys/ioctl.h> exists and should
+ * be included. Otherwise, include <sgtty.h> or <termio.h>.
+ */
+#define I_SYS_IOCTL /**/
+
+/* I_SYS_NDIR:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/ndir.h>.
+ */
+/*#define I_SYS_NDIR /**/
+
+/* I_SYS_PARAM:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/param.h>.
+ */
+/*#define I_SYS_PARAM /**/
+
+/* I_SYS_RESOURCE:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/resource.h>.
+ */
+/*#define I_SYS_RESOURCE /**/
+
+/* I_SYS_SELECT:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/select.h> in order to get definition of struct timeval.
+ */
+#define I_SYS_SELECT /**/
+
+/* I_SYS_STAT:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/stat.h>.
+ */
+#define I_SYS_STAT /**/
+
+/* I_SYS_TIMES:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/times.h>.
+ */
+#define I_SYS_TIMES /**/
+
+/* I_SYS_TYPES:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/types.h>.
+ */
+#define I_SYS_TYPES /**/
+
+/* I_SYS_UN:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/un.h> to get UNIX domain socket definitions.
+ */
+/*#define I_SYS_UN /**/
+
+/* I_SYS_WAIT:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/wait.h>.
+ */
+#define I_SYS_WAIT /**/
+
+/* I_TERMIO:
+ * This symbol, if defined, indicates that the program should include
+ * <termio.h> rather than <sgtty.h>. There are also differences in
+ * the ioctl() calls that depend on the value of this symbol.
+ */
+/* I_TERMIOS:
+ * This symbol, if defined, indicates that the program should include
+ * the POSIX termios.h rather than sgtty.h or termio.h.
+ * There are also differences in the ioctl() calls that depend on the
+ * value of this symbol.
+ */
+/* I_SGTTY:
+ * This symbol, if defined, indicates that the program should include
+ * <sgtty.h> rather than <termio.h>. There are also differences in
+ * the ioctl() calls that depend on the value of this symbol.
+ */
+/*#define I_TERMIO /**/
+#define I_TERMIOS /**/
+/*#define I_SGTTY /**/
+
+/* I_UNISTD:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <unistd.h>.
+ */
+#define I_UNISTD /**/
+
+/* I_UTIME:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <utime.h>.
+ */
+#define I_UTIME /**/
+
+/* I_VALUES:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <values.h> to get definition of symbols like MINFLOAT or
+ * MAXLONG, i.e. machine dependant limitations. Probably, you
+ * should use <limits.h> instead, if it is available.
+ */
+#define I_VALUES /**/
+
+/* I_STDARG:
+ * This symbol, if defined, indicates that <stdarg.h> exists and should
+ * be included.
+ */
+/* I_VARARGS:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <varargs.h>.
+ */
+#define I_STDARG /**/
+/*#define I_VARARGS /**/
+
+/* I_VFORK:
+ * This symbol, if defined, indicates to the C program that it should
+ * include vfork.h.
+ */
+/*#define I_VFORK /**/
+
+/* CAN_PROTOTYPE:
+ * If defined, this macro indicates that the C compiler can handle
+ * function prototypes.
+ */
+/* _:
+ * This macro is used to declare function parameters for folks who want
+ * to make declarations with prototypes using a different style than
+ * the above macros. Use double parentheses. For example:
+ *
+ * int main _((int argc, char *argv[]));
+ */
+#define CAN_PROTOTYPE /**/
+#ifdef CAN_PROTOTYPE
+#define _(args) args
+#else
+#define _(args) ()
+#endif
+
+/* SH_PATH:
+ * This symbol contains the full pathname to the shell used on this
+ * on this system to execute Bourne shell scripts. Usually, this will be
+ * /bin/sh, though it's possible that some systems will have /bin/ksh,
+ * /bin/pdksh, /bin/ash, /bin/bash, or even something such as
+ * D:/bin/sh.exe.
+ */
+#define SH_PATH "/system/ported/command_library/bash.pm" /**/
+
+/* STDCHAR:
+ * This symbol is defined to be the type of char used in stdio.h.
+ * It has the values "unsigned char" or "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 4 /**/
+#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 _error_ /**/
+# define Uquad_t _error_ /**/
+# define QUADKIND _error_ /**/
+# 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 "VOS" /**/
+
+/* MEM_ALIGNBYTES:
+ * 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 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 "" /**/
+/*#define ARCHLIB_EXP "" /**/
+
+/* 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 "vos" /**/
+
+/* 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 "/system/ported/command_library" /**/
+#define BIN_EXP "/system/ported/command_library" /**/
+
+/* 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.
+ */
+/*#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
+ * for perl, where the config.h can be generated and installed on
+ * one system, and used by a different architecture to build an
+ * extension. Older versions of NeXT that might not have
+ * defined either *_ENDIAN__ were all on Motorola 680x0 series,
+ * so the default case (for NeXT) is big endian to catch them.
+ * This might matter for NeXT 3.0.
+ */
+#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 0x4321 /* 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 "cc -E"
+#define CPPMINUS "-"
+#define CPPRUN "cc -E -"
+#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.
+ */
+/*#define CASTI32 /**/
+
+/* CASTNEGFLOAT:
+ * This symbol is defined if the C compiler can cast negative
+ * numbers to unsigned longs, ints and shorts.
+ */
+/* CASTFLAGS:
+ * This symbol contains flags that say what 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
+ */
+#define CASTNEGFLOAT /**/
+#define CASTFLAGS 0 /**/
+
+/* VOID_CLOSEDIR:
+ * This symbol, if defined, indicates that the closedir() routine
+ * does not return a value.
+ */
+/*#define VOID_CLOSEDIR /**/
+
+/* HAS_CSH:
+ * This symbol, if defined, indicates that the C-shell exists.
+ */
+/* CSH:
+ * This symbol, if defined, contains the full pathname of csh.
+ */
+#define HAS_CSH /**/
+#ifdef HAS_CSH
+#define CSH "/system/ported/command_library/bash.pm" /**/
+#endif
+
+/* 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 /**/
+
+/* 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));
+ */
+/*#define HAS_DRAND48_PROTO /**/
+
+/* HAS_ENDGRENT:
+ * This symbol, if defined, indicates that the getgrent routine is
+ * available for finalizing sequential access of the group database.
+ */
+/*#define HAS_ENDGRENT /**/
+
+/* HAS_ENDHOSTENT:
+ * This symbol, if defined, indicates that the endhostent() routine is
+ * available to close whatever was being used for host queries.
+ */
+#define HAS_ENDHOSTENT /**/
+
+/* HAS_ENDNETENT:
+ * This symbol, if defined, indicates that the endnetent() routine is
+ * available to close whatever was being used for network queries.
+ */
+#define HAS_ENDNETENT /**/
+
+/* HAS_ENDPROTOENT:
+ * This symbol, if defined, indicates that the endprotoent() routine is
+ * available to close whatever was being used for protocol queries.
+ */
+#define HAS_ENDPROTOENT /**/
+
+/* HAS_ENDPWENT:
+ * This symbol, if defined, indicates that the getgrent routine is
+ * available for finalizing sequential access of the passwd database.
+ */
+/*#define HAS_ENDPWENT /**/
+
+/* HAS_ENDSERVENT:
+ * This symbol, if defined, indicates that the endservent() routine is
+ * available to close whatever was being used for service queries.
+ */
+#define HAS_ENDSERVENT /**/
+
+/* HAS_FD_SET:
+ * This symbol, when defined, indicates presence of the fd_set typedef
+ * in <sys/types.h>
+ */
+/*#define HAS_FD_SET /**/
+
+/* FLEXFILENAMES:
+ * This symbol, if defined, indicates that the system supports filenames
+ * longer than 14 characters.
+ */
+#define FLEXFILENAMES /**/
+
+/* HAS_FPOS64_T:
+ * This symbol will be defined if the C compiler supports fpos64_t.
+ */
+/*#define HAS_FPOS64_T /**/
+
+/* HAS_FREXPL:
+ * This symbol, if defined, indicates that the frexpl routine is
+ * available to break a long double floating-point number into
+ * a normalized fraction and an integral power of 2.
+ */
+/*#define HAS_FREXPL /**/
+
+/* HAS_STRUCT_FS_DATA:
+ * This symbol, if defined, indicates that the struct fs_data
+ * to do statfs() is supported.
+ */
+/*#define HAS_STRUCT_FS_DATA /**/
+
+/* HAS_FSEEKO:
+ * This symbol, if defined, indicates that the fseeko routine is
+ * available to fseek beyond 32 bits (useful for ILP32 hosts).
+ */
+/*#define HAS_FSEEKO /**/
+
+/* HAS_FSTATFS:
+ * This symbol, if defined, indicates that the fstatfs routine is
+ * available to stat filesystems by file descriptors.
+ */
+/*#define HAS_FSTATFS /**/
+
+/* HAS_FTELLO:
+ * This symbol, if defined, indicates that the ftello routine is
+ * available to ftell beyond 32 bits (useful for ILP32 hosts).
+ */
+/*#define HAS_FTELLO /**/
+
+/* 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) sprintf((b),"%.*g",(n),(x))
+
+/* HAS_GETCWD:
+ * This symbol, if defined, indicates that the getcwd routine is
+ * available to get the current working directory.
+ */
+#define HAS_GETCWD /**/
+
+/* HAS_GETESPWNAM:
+ * This symbol, if defined, indicates that the getespwnam system call is
+ * available to retrieve enchanced (shadow) password entries by name.
+ */
+/*#define HAS_GETESPWNAM /**/
+
+/* HAS_GETFSSTAT:
+ * This symbol, if defined, indicates that the getfsstat routine is
+ * available to stat filesystems in bulk.
+ */
+/*#define HAS_GETFSSTAT /**/
+
+/* HAS_GETGRENT:
+ * This symbol, if defined, indicates that the getgrent routine is
+ * available for sequential access of the group database.
+ */
+/*#define HAS_GETGRENT /**/
+
+/* HAS_GETHOSTBYADDR:
+ * This symbol, if defined, indicates that the gethostbyaddr() routine is
+ * available to look up hosts by their IP addresses.
+ */
+#define HAS_GETHOSTBYADDR /**/
+
+/* HAS_GETHOSTBYNAME:
+ * This symbol, if defined, indicates that the gethostbyname() routine is
+ * available to look up host names in some data base or other.
+ */
+#define HAS_GETHOSTBYNAME /**/
+
+/* HAS_GETHOSTENT:
+ * This symbol, if defined, indicates that the gethostent() routine is
+ * available to look up host names in some data base or another.
+ */
+#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.
+ */
+#define HAS_GETNETBYADDR /**/
+
+/* HAS_GETNETBYNAME:
+ * This symbol, if defined, indicates that the getnetbyname() routine is
+ * available to look up networks by their names.
+ */
+#define HAS_GETNETBYNAME /**/
+
+/* HAS_GETNETENT:
+ * This symbol, if defined, indicates that the getnetent() routine is
+ * available to look up network names in some data base or another.
+ */
+#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_GETPAGESIZE:
+ * This symbol, if defined, indicates that the getpagesize system call
+ * is available to get system page size, which is the granularity of
+ * many memory management calls.
+ */
+/*#define HAS_GETPAGESIZE /**/
+
+/* HAS_GETPROTOENT:
+ * This symbol, if defined, indicates that the getprotoent() routine is
+ * available to look up protocols in some data base or another.
+ */
+#define HAS_GETPROTOENT /**/
+
+/* HAS_GETPROTOBYNAME:
+ * This symbol, if defined, indicates that the getprotobyname()
+ * routine is available to look up protocols by their name.
+ */
+/* HAS_GETPROTOBYNUMBER:
+ * This symbol, if defined, indicates that the getprotobynumber()
+ * routine is available to look up protocols by their number.
+ */
+#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_GETPRPWNAM:
+ * This symbol, if defined, indicates that the getprpwnam system call is
+ * available to retrieve protected (shadow) password entries by name.
+ */
+/*#define HAS_GETPRPWNAM /**/
+
+/* 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_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.
+ */
+/* HAS_GETSERVBYPORT:
+ * This symbol, if defined, indicates that the getservbyport()
+ * routine is available to look up services by their port.
+ */
+#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_ISNAN:
+ * This symbol, if defined, indicates that the isnan routine is
+ * available to check whether a double is a NaN.
+ */
+/*#define HAS_ISNAN /**/
+
+/* HAS_ISNANL:
+ * This symbol, if defined, indicates that the isnanl routine is
+ * available to check whether a long double is a NaN.
+ */
+/*#define HAS_ISNANL /**/
+
+/* 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_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.
+ */
+/* LONG_DOUBLESIZE:
+ * This symbol contains the size of a long double, so that the
+ * C preprocessor can make decisions based on it. It is only
+ * defined if the system supports long doubles.
+ */
+#define HAS_LONG_DOUBLE /**/
+#ifdef HAS_LONG_DOUBLE
+#define LONG_DOUBLESIZE 8 /**/
+#endif
+
+/* HAS_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
+ * C preprocessor can make decisions based on it. It is only
+ * defined if the system supports long long.
+ */
+/*#define HAS_LONG_LONG /**/
+#ifdef HAS_LONG_LONG
+#define LONGLONGSIZE _error_ /**/
+#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_MODFL:
+ * This symbol, if defined, indicates that the modfl routine is
+ * available to split a long double x into a fractional part f and
+ * an integer part i such that |f| < 1.0 and (f + i) = x.
+ */
+/*#define HAS_MODFL /**/
+
+/* 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 /**/
+/*#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
+ * groups are probably not supported.
+ */
+/*#define HAS_SETGROUPS /**/
+
+/* HAS_SETHOSTENT:
+ * This symbol, if defined, indicates that the sethostent() routine is
+ * available.
+ */
+#define HAS_SETHOSTENT /**/
+
+/* HAS_SETNETENT:
+ * This symbol, if defined, indicates that the setnetent() routine is
+ * available.
+ */
+#define HAS_SETNETENT /**/
+
+/* HAS_SETPROTOENT:
+ * This symbol, if defined, indicates that the setprotoent() routine is
+ * available.
+ */
+#define HAS_SETPROTOENT /**/
+
+/* HAS_SETPROCTITLE:
+ * This symbol, if defined, indicates that the setproctitle routine is
+ * available to set process title.
+ */
+/*#define HAS_SETPROCTITLE /**/
+
+/* 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_SETVBUF:
+ * This symbol, if defined, indicates that the setvbuf routine is
+ * available to change buffering on an open stdio stream.
+ * to a line-buffered mode.
+ */
+#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.
+ */
+/* HAS_SOCKETPAIR:
+ * This symbol, if defined, indicates that the BSD socketpair() call is
+ * supported.
+ */
+/* 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_SOCKS5_INIT:
+ * This symbol, if defined, indicates that the socks5_init routine is
+ * available to initialize SOCKS 5.
+ */
+/*#define HAS_SOCKS5_INIT /**/
+
+/* 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.
+ */
+/* STDIO_PTR_LVAL_SETS_CNT:
+ * This symbol is defined if using the FILE_ptr macro as an lvalue
+ * to increase the pointer by n has the side effect of decreasing the
+ * value of File_cnt(fp) by n.
+ */
+/* STDIO_PTR_LVAL_NOCHANGE_CNT:
+ * This symbol is defined if using the FILE_ptr macro as an lvalue
+ * to increase the pointer by n leaves File_cnt(fp) unchanged.
+ */
+#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 /**/
+/*#define STDIO_PTR_LVAL_SETS_CNT /**/
+/*#define STDIO_PTR_LVAL_NOCHANGE_CNT /**/
+#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
+ * defined by including <sys/sem.h>. If not, the user code
+ * probably needs to define it as:
+ * union semun {
+ * int val;
+ * struct semid_ds *buf;
+ * unsigned short *array;
+ * }
+ */
+/* USE_SEMCTL_SEMUN:
+ * This symbol, if defined, indicates that union semun is
+ * used for semctl IPC_STAT.
+ */
+/* USE_SEMCTL_SEMID_DS:
+ * This symbol, if defined, indicates that struct semid_ds * is
+ * used for semctl IPC_STAT.
+ */
+/*#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
+ * a signal handler using "Signal_t (*handler)()", and define the
+ * handler using "Signal_t handler(sig)".
+ */
+#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 "d" /**/
+
+/* 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 setgroups(). Usually, this is the same as
+ * gidtype (gid_t) , but sometimes it isn't.
+ * 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 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 int /**/
+#define DB_Prefix_t int /**/
+
+/* 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_LIBUTIL:
+ * This symbol, if defined, indicates that <libutil.h> exists and
+ * should be included.
+ */
+/*#define I_LIBUTIL /**/
+
+/* 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_PROT:
+ * This symbol, if defined, indicates that <prot.h> exists and
+ * should be included.
+ */
+/*#define I_PROT /**/
+
+/* 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>.
+ */
+/* PWQUOTA:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_quota.
+ */
+/* PWAGE:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_age.
+ */
+/* PWCHANGE:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_change.
+ */
+/* PWCLASS:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_class.
+ */
+/* PWEXPIRE:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_expire.
+ */
+/* PWCOMMENT:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_comment.
+ */
+/* PWGECOS:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_gecos.
+ */
+/* PWPASSWD:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_passwd.
+ */
+#define I_PWD /**/
+/*#define PWQUOTA /**/
+/*#define PWAGE /**/
+/*#define PWCHANGE /**/
+/*#define PWCLASS /**/
+/*#define PWEXPIRE /**/
+/*#define PWCOMMENT /**/
+/*#define PWGECOS /**/
+/*#define PWPASSWD /**/
+
+/* 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.
+ */
+/* PERL_PRIeldbl:
+ * This symbol, if defined, contains the string used by stdio to
+ * format long doubles (format 'e') for output.
+ */
+/* PERL_SCNfldbl:
+ * This symbol, if defined, contains the string used by stdio to
+ * format long doubles (format 'f') for input.
+ */
+#define PERL_PRIfldbl "Lf" /**/
+#define PERL_PRIgldbl "Lg" /**/
+#define PERL_PRIeldbl "Le" /**/
+#define PERL_SCNfldbl "Lf" /**/
+
+/* 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 4 /* <offset> size */
+#define Off_t_size 4 /* <offset> size */
+
+/* Free_t:
+ * This variable contains the return type of free(). It is usually
+ * void, but occasionally int.
+ */
+/* Malloc_t:
+ * This symbol is the type of pointer returned by malloc and realloc.
+ */
+#define Malloc_t void * /**/
+#define Free_t void /**/
+
+/* MYMALLOC:
+ * This symbol, if defined, indicates that we're using our own malloc.
+ */
+/*#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 char * /**/
+#define Netdb_hlen_t int /**/
+#define Netdb_name_t char * /**/
+#define Netdb_net_t long /**/
+
+/* PERL_OTHERLIBDIRS:
+ * This variable contains a colon-separated set of paths for the perl
+ * binary to search for additional library files or modules.
+ * These directories will be tacked to the end of @INC.
+ * Perl will automatically search below each path for version-
+ * and architecture-specific directories. See PERL_INC_VERSION_LIST
+ * for more details.
+ */
+/*#define PERL_OTHERLIBDIRS "" /**/
+
+/* 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).
+ */
+/* NVSIZE:
+ * This symbol contains the sizeof(NV).
+ */
+/* NV_PRESERVES_UV:
+ * This symbol, if defined, indicates that a variable of type NVTYPE
+ * can preserve all the bits of a variable of type UVTYPE.
+ */
+/* NV_PRESERVES_UV_BITS:
+ * This symbol contains the number of bits a variable of type NVTYPE
+ * can preserve of a variable of type UVTYPE.
+ */
+#define IVTYPE int /**/
+#define UVTYPE unsigned int /**/
+#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 _error_ /**/
+#define U64TYPE _error_ /**/
+#endif
+#define NVTYPE double /**/
+#define IVSIZE 4 /**/
+#define UVSIZE 4 /**/
+#define I8SIZE 1 /**/
+#define U8SIZE 1 /**/
+#define I16SIZE 2 /**/
+#define U16SIZE 2 /**/
+#define I32SIZE 4 /**/
+#define U32SIZE 4 /**/
+#ifdef HAS_QUAD
+#define I64SIZE _error_ /**/
+#define U64SIZE _error_ /**/
+#endif
+#define NVSIZE 8 /**/
+#define NV_PRESERVES_UV
+#define NV_PRESERVES_UV_BITS 32
+
+/* 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 in lowercase abcdef.
+ */
+/* NVef:
+ * This symbol defines the format string used for printing a Perl NV
+ * using %e-ish floating point format.
+ */
+/* NVff:
+ * This symbol defines the format string used for printing a Perl NV
+ * using %f-ish floating point format.
+ */
+/* NVgf:
+ * This symbol defines the format string used for printing a Perl NV
+ * using %g-ish floating point format.
+ */
+#define IVdf "d" /**/
+#define UVuf "u" /**/
+#define UVof "o" /**/
+#define UVxf "x" /**/
+#define NVef "e" /**/
+#define NVff "f" /**/
+#define NVgf "g" /**/
+
+/* 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 "/system/ported/perl/lib/5.6" /**/
+#define PRIVLIB_EXP "/system/ported/perl/lib/5.6" /**/
+
+/* 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 4 /**/
+
+/* 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() rand()/(RAND_MAX+1) /**/
+#define Rand_seed_t unsigned int /**/
+#define seedDrand01(x) srand((Rand_seed_t)x) /**/
+#define RANDBITS 15 /**/
+
+/* 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 1 /**/
+
+/* 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
+ * 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 "ZERO","ABRT","FPE","ILL","INT","SEGV","TERM","USR1","USR2","IO","HUP","URG","ALRM","CHLD","CONT","KILL","STOP","PIPE","QUIT","BUS","TRAP","TSTP","TTIN","TTOU","RT1","RT2","RT3","RT4","RT5","RT6","RT7","RT8",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,0 /**/
+
+/* 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.
+ * 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 "" /**/
+/*#define SITEARCH_EXP "" /**/
+
+/* SITELIB:
+ * 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.
+ * 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 "/system/ported/perl/lib/site/5.6" /**/
+#define SITELIB_EXP "/system/ported/perl/lib/site/5.6" /**/
+#define SITELIB_STEM "/system/ported/perl/lib/site" /**/
+
+/* Size_t_size:
+ * This symbol holds the size of a Size_t in bytes.
+ */
+#define Size_t_size 4 /* */
+
+/* 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
+ * script to make sure (one hopes) that it runs with perl and not
+ * some shell.
+ */
+#define STARTPERL "!perl.pm" /**/
+
+/* HAS_STDIO_STREAM_ARRAY:
+ * This symbol, if defined, tells that there is an array
+ * holding the stdio streams.
+ */
+/* STDIO_STREAM_ARRAY:
+ * This symbol tells the name of the array holding the stdio streams.
+ * Usual values include _iob, __iob, and __sF.
+ */
+#define HAS_STDIO_STREAM_ARRAY /**/
+#define STDIO_STREAM_ARRAY _iob
+
+/* Uid_t_f:
+ * This symbol defines the format string used for printing a Uid_t.
+ */
+#define Uid_t_f "d" /**/
+
+/* Uid_t_sign:
+ * This symbol holds the signedess of a Uid_t.
+ * 1 for unsigned, -1 for signed.
+ */
+#define Uid_t_sign -1 /* UID sign */
+
+/* Uid_t_size:
+ * This symbol holds the size of a Uid_t in bytes.
+ */
+#define Uid_t_size 4 /* UID size */
+
+/* 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 Uid_t uid_t /* UID type */
+
+/* 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.
+ */
+#ifndef USE_LARGE_FILES
+/*#define USE_LARGE_FILES /**/
+#endif
+
+/* USE_LONG_DOUBLE:
+ * This symbol, if defined, indicates that long doubles should
+ * be used when available.
+ */
+#ifndef USE_LONG_DOUBLE
+#define USE_LONG_DOUBLE /**/
+#endif
+
+/* USE_MORE_BITS:
+ * This symbol, if defined, indicates that 64-bit interfaces and
+ * long doubles should be used when available.
+ */
+#ifndef USE_MORE_BITS
+/*#define USE_MORE_BITS /**/
+#endif
+
+/* MULTIPLICITY:
+ * This symbol, if defined, indicates that Perl should
+ * be built to use multiplicity.
+ */
+#ifndef MULTIPLICITY
+/*#define MULTIPLICITY /**/
+#endif
+
+/* 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.
+ */
+#ifndef USE_PERLIO
+/*#define USE_PERLIO /**/
+#endif
+
+/* USE_SOCKS:
+ * This symbol, if defined, indicates that Perl should
+ * 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_5005THREADS /**/
+/*#define USE_ITHREADS /**/
+#if defined(USE_5005THREADS) && !defined(USE_ITHREADS)
+#define USE_THREADS /* until src is revised*/
+#endif
+/*#define OLD_PTHREADS_API /**/
+
+/* 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.
+ */
+/* 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 PERL_VENDORARCH "" /**/
+#define PERL_VENDORARCH_EXP "" /**/
+
+/* 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.
+ */
+/* 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 PERL_VENDORLIB_EXP "" /**/
+#define PERL_VENDORLIB_STEM "" /**/
+
+/* 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
+
+/* 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 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 /system/ported/perl/lib/site/5.6 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.00563"
+#define PERL_PM_APIVERSION "5.005"
+
+/* HAS_GETPGRP:
+ * This symbol, if defined, indicates that the getpgrp routine is
+ * available to get the current process group.
+ */
+/* USE_BSD_GETPGRP:
+ * This symbol, if defined, indicates that getpgrp needs one
+ * arguments whereas USG one needs none.
+ */
+#define HAS_GETPGRP /**/
+/*#define USE_BSD_GETPGRP /**/
+
+/* HAS_SETPGRP:
+ * This symbol, if defined, indicates that the setpgrp routine is
+ * available to set the current process group.
+ */
+/* USE_BSD_SETPGRP:
+ * This symbol, if defined, indicates that setpgrp needs two
+ * arguments whereas USG one needs none. See also HAS_SETPGID
+ * for a POSIX interface.
+ */
+/*#define HAS_SETPGRP /**/
+/*#define USE_BSD_SETPGRP /**/
+
+/* HAS__FWALK:
+ * This symbol, if defined, indicates that the _fwalk system call is
+ * available to apply a function to all the file handles.
+ */
+/*#define HAS__FWALK /**/
+
+/* FCNTL_CAN_LOCK:
+ * This symbol, if defined, indicates that fcntl() can be used
+ * for file locking. Normally on Unix systems this is defined.
+ * It may be undefined on VMS.
+ */
+#define FCNTL_CAN_LOCK /**/
+
+/* HAS_FSYNC:
+ * This symbol, if defined, indicates that the fsync routine is
+ * available to write a file's modified data and attributes to
+ * permanent storage.
+ */
+/*#define HAS_FSYNC /**/
+
+/* HAS_SBRK_PROTO:
+ * This symbol, if defined, indicates that the system provides
+ * a prototype for the sbrk() function. Otherwise, it is up
+ * to the program to supply one. Good guesses are
+ * extern void* sbrk _((int));
+ * extern void* sbrk _((size_t));
+ */
+/*#define HAS_SBRK_PROTO /**/
+
+#endif
diff --git a/gnu/usr.bin/perl/vos/config.pl b/gnu/usr.bin/perl/vos/config.pl
index c6014ade9af..c865ba158b6 100644
--- a/gnu/usr.bin/perl/vos/config.pl
+++ b/gnu/usr.bin/perl/vos/config.pl
@@ -3,6 +3,7 @@
#
# Written January 24, 2000 by Jarkko Hietaniemi [jhi@iki.fi]
# Modified February 2, 2000 by Paul Green [Paul_Green@stratus.com]
+# Modified October 23, 2000 by Paul Green [Paul_Green@stratus.com]
#
# Read in the definitions file
@@ -13,6 +14,7 @@ if (open(CONFIG_DEF, "config.def")) {
if (/^([^=]+)='(.*)'$/) {
my ($var, $val) = ($1, $2);
$define{$var} = $val;
+ $used{$var} = 0;
} else {
warn "config.def: $.: illegal line: $_";
}
@@ -27,8 +29,9 @@ close (CONFIG_DEF);
# Open the template input file.
#
-unless (open(CONFIG_SH, "config_h.SH_orig")) {
- die "$0: Cannot open config_h.SH_orig: $!";
+$lineno = 0;
+unless (open(CONFIG_SH, "../config_h.SH")) {
+ die "$0: Cannot open ../config_h.SH: $!";
}
#
@@ -44,6 +47,7 @@ unless (open(CONFIG_H, ">config.h.new")) {
#
while (<CONFIG_SH>) {
+ $lineno = $lineno + 1;
last if /^sed <<!GROK!THIS!/;
}
@@ -53,20 +57,34 @@ while (<CONFIG_SH>) {
#
while (<CONFIG_SH>) {
+ $lineno = $lineno + 1;
last if /^!GROK!THIS!/;
#
+# The definition of SITEARCH and SITEARCH_EXP has to be commented-out.
+# The easiest way to do this is to special-case it here.
+#
+ if (/^#define SITEARCH*/) {
+ s@(^.*$)@/*$1@;
+ }
+#
# The case of #$d_foo at the BOL has to be handled carefully.
# If $d_foo is "undef", then we must first comment out the entire line.
#
- if (/^#\$\w+/) {
- s@^#(\$\w+)@("$define{$1}" eq "undef")?"/*#define":"#$define{$1}"@e;
+ if (/^#(\$\w+)/) {
+ if (exists $define{$1}) {
+ $used{$1}=1;
+ s@^#(\$\w+)@("$define{$1}" eq "undef") ?
+ "/*#define":"#$define{$1}"@e;
+ }
}
#
# There could be multiple $variables on this line.
# Find and replace all of them.
#
if (/(\$\w+)/) {
- s/(\$\w+)/(exists $define{$1}) ? $define{$1} : $1/ge;
+ s/(\$\w+)/(exists $define{$1}) ?
+ (($used{$1}=1),$define{$1}) :
+ ((print "Undefined keyword $1 on line $lineno\n"),$1)/ge;
print CONFIG_H;
}
#
@@ -82,3 +100,10 @@ unless (close (CONFIG_H)) {
}
close (CONFIG_SH);
+
+while (($key,$value) = each %used) {
+ if ($value == 0) {
+ print "Unused keyword definition: $key\n";
+ }
+}
+
diff --git a/gnu/usr.bin/perl/vos/configure_perl.cm b/gnu/usr.bin/perl/vos/configure_perl.cm
new file mode 100644
index 00000000000..aeef4feef43
--- /dev/null
+++ b/gnu/usr.bin/perl/vos/configure_perl.cm
@@ -0,0 +1,31 @@
+& This command macro configures perl to build with
+& either the alpha or generally-available version of
+& VOS POSIX.1 support.
+& Written 00-10-24 by Paul Green (Paul_Green@stratus.com)
+& Modified 01-02-12 by Paul Green
+&
+&begin_parameters
+ version option(-version)name,allow(alpha,ga),=ga
+ debug switch(-debug),secret
+&end_parameters
+&echo command_lines
+&if &debug& &then &echo macro_lines
+&
+&if (file_info config.&version&.def date_modified) > (file_info config.&version&.h date_modified)
+&then &do
+!copy_file config.&version&.def config.def -delete
+&
+& NOTE: We must invoke Perl 5 not Perl 4. If necessary, edit the
+& macro to ensure that perl5 is invoked.
+&
+&mode no_abort
+!perl5 config.pl
+&if (command_status) = 1032
+&then !perl config.pl
+&mode abort
+!rename config.h.new config.&version&.h -delete
+!delete_file config.def
+&end
+&
+&if (file_info config.&version&.h date_modified) ^= (file_info config.h date_modified)
+&then !copy_file config.&version&.h config.h -delete -keep_dates
diff --git a/gnu/usr.bin/perl/vos/install_perl.cm b/gnu/usr.bin/perl/vos/install_perl.cm
new file mode 100644
index 00000000000..95fe064ea6a
--- /dev/null
+++ b/gnu/usr.bin/perl/vos/install_perl.cm
@@ -0,0 +1,69 @@
+& Macro to install the perl components into the right directories
+& Written 00-10-24 by Paul Green (Paul_Green@stratus.com)
+&
+&begin_parameters
+ cpu option(-processor)name,allow(mc68020,i80860,pa7100,pa8000),=mc68020
+&end_parameters priv
+&echo command_lines
+&
+&if &cpu& = mc68020
+&then &set_string obj ''
+&if &cpu& = i80860
+&then &set_string obj .860
+&if &cpu& = pa7100
+&then &set_string obj .7100
+&if &cpu& = pa8000
+&then &set_string obj .8000
+&
+&set_string MDS (master_disk)>system
+&
+&if ^ (exists -directory &MDS&>ported)
+&then !create_dir &MDS&>ported
+&
+&if ^ (exists -directory &MDS&>ported>command_library)
+&then !create_dir &MDS&>ported>command_library
+&
+&if ^ (exists -directory &MDS&>ported>perl)
+&then !create_dir &MDS&>ported>perl
+&
+&if ^ (exists -directory &MDS&>ported>perl>lib)
+&then !create_dir &MDS&>ported>perl>lib
+&
+&if ^ (exists -directory &MDS&>ported>perl>lib>5.7)
+&then !create_dir &MDS&>ported>perl>lib>5.7
+&
+&if ^ (exists -directory &MDS&>ported>perl>lib>5.7.68k)
+&then !create_dir &MDS&>ported>perl>lib>5.7.68k
+&
+&if ^ (exists -directory &MDS&>ported>perl>lib>5.7.860)
+&then !create_dir &MDS&>ported>perl>lib>5.7.860
+&
+&if ^ (exists -directory &MDS&>ported>perl>lib>5.7.7100)
+&then !create_dir &MDS&>ported>perl>lib>5.7.7100
+&
+&if ^ (exists -directory &MDS&>ported>perl>lib>5.7.8000)
+&then !create_dir &MDS&>ported>perl>lib>5.7.8000
+&
+&if ^ (exists -directory &MDS&>ported>perl>lib>site)
+&then !create_dir &MDS&>ported>perl>lib>site
+&
+&if ^ (exists -directory &MDS&>ported>perl>lib>site>5.7)
+&then !create_dir &MDS&>ported>perl>lib>site>5.7
+&
+&if ^ (exists -directory &MDS&>ported>perl>lib>site>5.7.68k)
+&then !create_dir &MDS&>ported>perl>lib>site>5.7.68k
+&
+&if ^ (exists -directory &MDS&>ported>perl>lib>site>5.7.860)
+&then !create_dir &MDS&>ported>perl>lib>site>5.7.860
+&
+&if ^ (exists -directory &MDS&>ported>perl>lib>site>5.7.7100)
+&then !create_dir &MDS&>ported>perl>lib>site>5.7.7100
+&
+&if ^ (exists -directory &MDS&>ported>perl>lib>site>5.7.8000)
+&then !create_dir &MDS&>ported>perl>lib>site>5.7.8000
+&
+!copy_dir <lib &MDS&>ported>perl>lib>5.7 -delete
+&
+!copy_file obj&obj&>perl.pm &MDS&>ported>command_library>perl.pm.new -delete
+!rename &MDS&>ported>command_library>perl.pm *.(date).(time) -delete
+!rename &MDS&>ported>command_library>perl.pm.new perl.pm -delete
diff --git a/gnu/usr.bin/perl/vos/perl.bind b/gnu/usr.bin/perl/vos/perl.bind
index 714ce3d680d..1e77e5a6ded 100644
--- a/gnu/usr.bin/perl/vos/perl.bind
+++ b/gnu/usr.bin/perl/vos/perl.bind
@@ -31,9 +31,6 @@ modules: miniperlmain,
universal,
utf8,
util,
- xsutils,
- vos_dummies,
- tcp_runtime,
- tcp_gethost;
+ xsutils;
end;
diff --git a/gnu/usr.bin/perl/vos/vosish.h b/gnu/usr.bin/perl/vos/vosish.h
index 5a6b0796f87..d6000656983 100644
--- a/gnu/usr.bin/perl/vos/vosish.h
+++ b/gnu/usr.bin/perl/vos/vosish.h
@@ -1,140 +1 @@
-/*
- * The following symbols are defined if your operating system supports
- * functions by that name. All Unixes I know of support them, thus they
- * are not checked by the configuration script, but are directly defined
- * here.
- */
-
-/* HAS_IOCTL:
- * This symbol, if defined, indicates that the ioctl() routine is
- * available to set I/O characteristics
- */
-#define HAS_IOCTL / **/
-
-/* HAS_UTIME:
- * This symbol, if defined, indicates that the routine utime() is
- * available to update the access and modification times of files.
- */
-#define HAS_UTIME / **/
-
-/* HAS_GROUP
- * This symbol, if defined, indicates that the getgrnam() and
- * getgrgid() routines are available to get group entries.
- * The getgrent() has a separate definition, HAS_GETGRENT.
- */
-/*#define HAS_GROUP / **/
-
-/* HAS_PASSWD
- * This symbol, if defined, indicates that the getpwnam() and
- * getpwuid() routines are available to get password entries.
- * The getpwent() has a separate definition, HAS_GETPWENT.
- */
-/*#define HAS_PASSWD / **/
-
-#define HAS_KILL
-#define HAS_WAIT
-
-/* 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.
- */
-#undef USEMYBINMODE
-
-/* Stat_t:
- * This symbol holds the type used to declare buffers for information
- * returned by stat(). It's usually just struct stat. It may be necessary
- * to include <sys/stat.h> and <sys/types.h> to get any typedef'ed
- * information.
- */
-#define Stat_t struct stat
-
-/* USE_STAT_RDEV:
- * This symbol is defined if this system has a stat structure declaring
- * st_rdev
- */
-/*#define USE_STAT_RDEV / **/
-
-/* ACME_MESS:
- * This symbol, if defined, indicates that error messages should be
- * should be generated in a format that allows the use of the Acme
- * GUI/editor's autofind feature.
- */
-#undef ACME_MESS /**/
-
-/* UNLINK_ALL_VERSIONS:
- * This symbol, if defined, indicates that the program should arrange
- * to remove all versions of a file if unlink() is called. This is
- * probably only relevant for VMS.
- */
-/* #define UNLINK_ALL_VERSIONS / **/
-
-/* VMS:
- * This symbol, if defined, indicates that the program is running under
- * VMS. It is currently automatically set by cpps running under VMS,
- * and is included here for completeness only.
- */
-/* #define VMS / **/
-
-/* ALTERNATE_SHEBANG:
- * This symbol, if defined, contains a "magic" string which may be used
- * as the first line of a Perl program designed to be executed directly
- * by name, instead of the standard Unix #!. If ALTERNATE_SHEBANG
- * begins with a character other then #, then Perl will only treat
- * it as a command line if if finds the string "perl" in the first
- * word; otherwise it's treated as the first line of code in the script.
- * (IOW, Perl won't hand off to another interpreter via an alternate
- * shebang sequence that might be legal Perl code.)
- */
-/* #define ALTERNATE_SHEBANG "#!" / **/
-
-#if !defined(NSIG) || defined(M_UNIX) || defined(M_XENIX) || defined(__NetBSD__)
-# include <signal.h>
-#endif
-
-#ifndef SIGABRT
-# define SIGABRT SIGILL
-#endif
-#ifndef SIGILL
-# define SIGILL 6 /* blech */
-#endif
-#define ABORT() kill(PerlProc_getpid(),SIGABRT);
-
-/*
- * fwrite1() should be a routine with the same calling sequence as fwrite(),
- * but which outputs all of the bytes requested as a single stream (unlike
- * fwrite() itself, which on some systems outputs several distinct records
- * if the number_of_items parameter is >1).
- */
-#define fwrite1 fwrite
-
-#define Stat(fname,bufptr) stat((fname),(bufptr))
-#define Fstat(fd,bufptr) fstat((fd),(bufptr))
-#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
-# define PERL_SYS_INIT(c,v) fpsetmask(0); MALLOC_INIT
-#else
-# 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
-#endif
-
-#define BIT_BUCKET "/dev/null"
-
-#define dXSUB_SYS
+#include "unixish.h"
diff --git a/gnu/usr.bin/perl/warnings.h b/gnu/usr.bin/perl/warnings.h
index a2bcaeb43ed..f6814e78c40 100644
--- a/gnu/usr.bin/perl/warnings.h
+++ b/gnu/usr.bin/perl/warnings.h
@@ -22,45 +22,6 @@
#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
@@ -113,5 +74,40 @@
#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"
+#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 isWARNf_on(c,x) (IsSet(SvPVX(c), 2*(x)+1))
+
+#define ckDEAD(x) \
+ ( ! specialWARN(PL_curcop->cop_warnings) && \
+ ( isWARNf_on(PL_curcop->cop_warnings, WARN_ALL) || \
+ isWARNf_on(PL_curcop->cop_warnings, x)))
+
+#define ckWARN(x) \
+ ( (isLEXWARN_on && PL_curcop->cop_warnings != pWARN_NONE && \
+ (PL_curcop->cop_warnings == pWARN_ALL || \
+ isWARN_on(PL_curcop->cop_warnings, x) ) ) \
+ || (isLEXWARN_off && PL_dowarn & G_WARN_ON) )
+
+#define ckWARN2(x,y) \
+ ( (isLEXWARN_on && PL_curcop->cop_warnings != pWARN_NONE && \
+ (PL_curcop->cop_warnings == pWARN_ALL || \
+ isWARN_on(PL_curcop->cop_warnings, x) || \
+ isWARN_on(PL_curcop->cop_warnings, y) ) ) \
+ || (isLEXWARN_off && PL_dowarn & G_WARN_ON) )
+
+#define ckWARN_d(x) \
+ (isLEXWARN_off || PL_curcop->cop_warnings == pWARN_ALL || \
+ (PL_curcop->cop_warnings != pWARN_NONE && \
+ isWARN_on(PL_curcop->cop_warnings, x) ) )
+
+#define ckWARN2_d(x,y) \
+ (isLEXWARN_off || PL_curcop->cop_warnings == pWARN_ALL || \
+ (PL_curcop->cop_warnings != pWARN_NONE && \
+ (isWARN_on(PL_curcop->cop_warnings, x) || \
+ isWARN_on(PL_curcop->cop_warnings, y) ) ) )
+
/* end of file warnings.h */
diff --git a/gnu/usr.bin/perl/warnings.pl b/gnu/usr.bin/perl/warnings.pl
index 61602d5608a..2205d1f384c 100644
--- a/gnu/usr.bin/perl/warnings.pl
+++ b/gnu/usr.bin/perl/warnings.pl
@@ -169,8 +169,8 @@ if (@ARGV && $ARGV[0] eq "tree")
exit ;
}
-#unlink "warnings.h";
-#unlink "lib/warnings.pm";
+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";
@@ -199,45 +199,6 @@ print WARN <<'EOM' ;
#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 ;
@@ -263,6 +224,41 @@ print WARN tab(5, '#define WARN_NONEstring'), '"', ('\0' x $warn_size) , "\"\n"
print WARN <<'EOM';
+#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 isWARNf_on(c,x) (IsSet(SvPVX(c), 2*(x)+1))
+
+#define ckDEAD(x) \
+ ( ! specialWARN(PL_curcop->cop_warnings) && \
+ ( isWARNf_on(PL_curcop->cop_warnings, WARN_ALL) || \
+ isWARNf_on(PL_curcop->cop_warnings, x)))
+
+#define ckWARN(x) \
+ ( (isLEXWARN_on && PL_curcop->cop_warnings != pWARN_NONE && \
+ (PL_curcop->cop_warnings == pWARN_ALL || \
+ isWARN_on(PL_curcop->cop_warnings, x) ) ) \
+ || (isLEXWARN_off && PL_dowarn & G_WARN_ON) )
+
+#define ckWARN2(x,y) \
+ ( (isLEXWARN_on && PL_curcop->cop_warnings != pWARN_NONE && \
+ (PL_curcop->cop_warnings == pWARN_ALL || \
+ isWARN_on(PL_curcop->cop_warnings, x) || \
+ isWARN_on(PL_curcop->cop_warnings, y) ) ) \
+ || (isLEXWARN_off && PL_dowarn & G_WARN_ON) )
+
+#define ckWARN_d(x) \
+ (isLEXWARN_off || PL_curcop->cop_warnings == pWARN_ALL || \
+ (PL_curcop->cop_warnings != pWARN_NONE && \
+ isWARN_on(PL_curcop->cop_warnings, x) ) )
+
+#define ckWARN2_d(x,y) \
+ (isLEXWARN_off || PL_curcop->cop_warnings == pWARN_ALL || \
+ (PL_curcop->cop_warnings != pWARN_NONE && \
+ (isWARN_on(PL_curcop->cop_warnings, x) || \
+ isWARN_on(PL_curcop->cop_warnings, y) ) ) )
+
/* end of file warnings.h */
EOM
@@ -352,6 +348,14 @@ warnings - Perl pragma to control optional warnings
warnings::warn("void", "some warning");
}
+ if (warnings::enabled($object)) {
+ warnings::warn($object, "some warning");
+ }
+
+ warnif("some warning");
+ warnif("void", "some warning");
+ warnif($object, "some warning");
+
=head1 DESCRIPTION
If no import list is supplied, all possible warnings are either enabled
@@ -363,30 +367,82 @@ A number of functions are provided to assist module authors.
=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.
+Creates a new warnings category with the same name as the package where
+the call to the pragma is used.
+
+=item warnings::enabled()
+
+Use the warnings category with the same name as the current package.
+
+Return TRUE if that warnings category is enabled in the calling module.
+Otherwise returns FALSE.
+
+=item warnings::enabled($category)
+
+Return TRUE if the warnings category, C<$category>, is enabled in the
+calling module.
+Otherwise returns FALSE.
+
+=item warnings::enabled($object)
+
+Use the name of the class for the object reference, C<$object>, as the
+warnings category.
+
+Return TRUE if that warnings category is enabled in the first scope
+where the object is used.
+Otherwise returns FALSE.
+
+=item warnings::warn($message)
+
+Print C<$message> to STDERR.
+
+Use the warnings category with the same name as the current package.
+
+If that warnings category has been set to "FATAL" in the calling module
+then die. Otherwise return.
+
+=item warnings::warn($category, $message)
-=item warnings::enabled([$category])
+Print C<$message> to STDERR.
-Returns TRUE if the warnings category C<$category> is enabled in the
-calling module. Otherwise returns FALSE.
+If the warnings category, C<$category>, has been set to "FATAL" in the
+calling module then die. Otherwise return.
-If the parameter, C<$category>, isn't supplied, the current package name
-will be used.
+=item warnings::warn($object, $message)
-=item warnings::warn([$category,] $message)
+Print C<$message> to STDERR.
-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.
+Use the name of the class for the object reference, C<$object>, as the
+warnings category.
-If the parameter, C<$category>, isn't supplied, the current package name
-will be used.
+If that warnings category has been set to "FATAL" in the scope where C<$object>
+is first used then die. Otherwise return.
+
+
+=item warnings::warnif($message)
+
+Equivalent to:
+
+ if (warnings::enabled())
+ { warnings::warn($message) }
+
+=item warnings::warnif($category, $message)
+
+Equivalent to:
+
+ if (warnings::enabled($category))
+ { warnings::warn($category, $message) }
+
+=item warnings::warnif($object, $message)
+
+Equivalent to:
+
+ if (warnings::enabled($object))
+ { warnings::warn($object, $message) }
=back
-See L<perlmod/Pragmatic Modules> and L<perllexwarn>.
+See L<perlmodlib/Pragmatic Modules> and L<perllexwarn>.
=cut
@@ -417,44 +473,80 @@ sub bits {
sub import {
shift;
- ${^WARNING_BITS} |= bits(@_ ? @_ : 'all') ;
+ 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') ;
}
sub unimport {
shift;
my $mask = ${^WARNING_BITS} ;
if (vec($mask, $Offsets{'all'}, 1)) {
- $mask = $Bits{'all'} ;
+ $mask |= $Bits{'all'} ;
$mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
}
${^WARNING_BITS} = $mask & ~ (bits(@_ ? @_ : 'all') | $All) ;
}
-sub enabled
+sub __chk
{
- 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 ;
-
+ my $isobj = 0 ;
if (@_) {
# check the category supplied.
$category = shift ;
+ if (ref $category) {
+ croak ("not an object")
+ if $category !~ /^([^=]+)=/ ;+
+ $category = $1 ;
+ $isobj = 1 ;
+ }
$offset = $Offsets{$category};
croak("unknown warnings category '$category'")
unless defined $offset;
}
else {
- $category = (caller(0))[0] ;
+ $category = (caller(1))[0] ;
$offset = $Offsets{$category};
croak("package '$category' not registered for warnings")
unless defined $offset ;
}
+ my $this_pkg = (caller(1))[0] ;
+ my $i = 2 ;
+ my $pkg ;
+
+ if ($isobj) {
+ while (do { { package DB; $pkg = (caller($i++))[0] } } ) {
+ last unless @DB::args && $DB::args[0] =~ /^$category=/ ;
+ }
+ $i -= 2 ;
+ }
+ else {
+ for ($i = 2 ; $pkg = (caller($i))[0] ; ++ $i) {
+ last if $pkg ne $this_pkg ;
+ }
+ $i = 2
+ if !$pkg || $pkg eq $this_pkg ;
+ }
+
+ my $callers_bitmask = (caller($i))[9] ;
+ return ($callers_bitmask, $offset, $i) ;
+}
+
+sub enabled
+{
+ croak("Usage: warnings::enabled([category])")
+ unless @_ == 1 || @_ == 0 ;
+
+ my ($callers_bitmask, $offset, $i) = __chk(@_) ;
+
+ return 0 unless defined $callers_bitmask ;
return vec($callers_bitmask, $offset, 1) ||
vec($callers_bitmask, $Offsets{'all'}, 1) ;
}
@@ -464,29 +556,34 @@ 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 ;
+ my $message = pop ;
+ my ($callers_bitmask, $offset, $i) = __chk(@_) ;
+ local $Carp::CarpLevel = $i ;
croak($message)
if vec($callers_bitmask, $offset+1, 1) ||
vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
carp($message) ;
}
+sub warnif
+{
+ croak("Usage: warnings::warnif([category,] 'message')")
+ unless @_ == 2 || @_ == 1 ;
+
+ my $message = pop ;
+ my ($callers_bitmask, $offset, $i) = __chk(@_) ;
+ local $Carp::CarpLevel = $i ;
+
+ return
+ unless defined $callers_bitmask &&
+ (vec($callers_bitmask, $offset, 1) ||
+ vec($callers_bitmask, $Offsets{'all'}, 1)) ;
+
+ croak($message)
+ if vec($callers_bitmask, $offset+1, 1) ||
+ vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
+
+ carp($message) ;
+}
1;
diff --git a/gnu/usr.bin/perl/win32/config.gc b/gnu/usr.bin/perl/win32/config.gc
index 762e7924640..dbbdea06caa 100644
--- a/gnu/usr.bin/perl/win32/config.gc
+++ b/gnu/usr.bin/perl/win32/config.gc
@@ -7,7 +7,6 @@ Header=''
Id='$Id'
Locker=''
Log='$Log'
-Mcc='Mcc'
RCSfile='$RCSfile'
Revision='$Revision'
Source=''
@@ -41,11 +40,14 @@ byteorder='1234'
c=''
castflags='0'
cat='type'
-cc='gcc'
+cc='~CC~'
cccdlflags=' '
ccdlflags=' '
ccflags='-MD -DWIN32'
+ccflags_uselargefiles=''
+ccname='~CC~'
ccsymbols=''
+ccversion=''
cf_by='nobody'
cf_email='nobody@no.where.net'
cf_time=''
@@ -71,11 +73,13 @@ cppsymbols=''
crosscompile='undef'
cryptlib=''
csh='undef'
+d_SCNfldbl='undef'
+d__fwalk='undef'
d_Gconvert='sprintf((b),"%.*g",(n),(x))'
-d_PRIEldbl='undef'
-d_PRIFldbl='undef'
-d_PRIGldbl='undef'
-d_PRIX64='undef'
+d_PRIEUldbl='undef'
+d_PRIFUldbl='undef'
+d_PRIGUldbl='undef'
+d_PRIXU64='undef'
d_PRId64='undef'
d_PRIeldbl='undef'
d_PRIfldbl='undef'
@@ -125,12 +129,12 @@ d_endnent='undef'
d_endpent='undef'
d_endpwent='undef'
d_endsent='undef'
-d_endspent='undef'
d_eofnblk='define'
d_eunice='undef'
d_fchmod='undef'
d_fchown='undef'
d_fcntl='undef'
+d_fcntl_can_lock='undef'
d_fd_macros='define'
d_fd_set='define'
d_fds_bits='define'
@@ -140,14 +144,17 @@ d_flock='define'
d_fork='undef'
d_fpathconf='undef'
d_fpos64_t='undef'
+d_frexpl='undef'
d_fs_data_s='undef'
d_fseeko='undef'
d_fsetpos='define'
d_fstatfs='undef'
d_fstatvfs='undef'
+d_fsync='undef'
d_ftello='undef'
d_ftime='define'
d_getcwd='undef'
+d_getespwnam='undef'
d_getfsstat='undef'
d_getgrent='undef'
d_getgrps='undef'
@@ -163,6 +170,7 @@ d_getnbyaddr='undef'
d_getnbyname='undef'
d_getnent='undef'
d_getnetprotos='undef'
+d_getpagsz='undef'
d_getpbyname='define'
d_getpbynumber='define'
d_getpent='undef'
@@ -172,12 +180,12 @@ d_getpgrp='undef'
d_getppid='undef'
d_getprior='undef'
d_getprotoprotos='define'
+d_getprpwnam='undef'
d_getpwent='undef'
d_getsbyname='define'
d_getsbyport='define'
d_getsent='undef'
d_getservprotos='define'
-d_getspent='undef'
d_getspnam='undef'
d_gettimeod='undef'
d_gnulibc='undef'
@@ -189,6 +197,8 @@ d_index='undef'
d_inetaton='undef'
d_int64_t='undef'
d_isascii='define'
+d_isnan='define'
+d_isnanl='undef'
d_killpg='undef'
d_lchown='undef'
d_ldbl_dig='define'
@@ -215,6 +225,7 @@ d_mkstemp='undef'
d_mkstemps='undef'
d_mktime='define'
d_mmap='undef'
+d_modfl='undef'
d_mprotect='undef'
d_msg='undef'
d_msg_ctrunc='undef'
@@ -231,6 +242,7 @@ d_munmap='undef'
d_mymalloc='undef'
d_nice='undef'
d_nv_preserves_uv='define'
+d_nv_preserves_uv_bits='32'
d_off64_t='undef'
d_old_pthread_create_joinable='undef'
d_oldpthreads='undef'
@@ -238,6 +250,7 @@ d_oldsock='undef'
d_open3='undef'
d_pathconf='undef'
d_pause='define'
+d_perl_otherlibdirs='undef'
d_phostname='undef'
d_pipe='define'
d_poll='undef'
@@ -261,6 +274,7 @@ d_rmdir='define'
d_safebcpy='undef'
d_safemcpy='undef'
d_sanemcmp='define'
+d_sbrkproto='undef'
d_sched_yield='undef'
d_scm_rights='undef'
d_seekdir='define'
@@ -284,6 +298,7 @@ d_setpgid='undef'
d_setpgrp2='undef'
d_setpgrp='undef'
d_setprior='undef'
+d_setproctitle='undef'
d_setpwent='undef'
d_setregid='undef'
d_setresgid='undef'
@@ -293,7 +308,6 @@ d_setrgid='undef'
d_setruid='undef'
d_setsent='undef'
d_setsid='undef'
-d_setspent='undef'
d_setvbuf='define'
d_sfio='undef'
d_shm='undef'
@@ -307,6 +321,7 @@ d_sigsetjmp='undef'
d_socket='define'
d_socklen_t='undef'
d_sockpair='undef'
+d_socks5_init='undef'
d_sqrtl='undef'
d_statblks='undef'
d_statfs_f_flags='undef'
@@ -314,6 +329,8 @@ d_statfs_s='undef'
d_statvfs='undef'
d_stdio_cnt_lval='define'
d_stdio_ptr_lval='define'
+d_stdio_ptr_lval_sets_cnt='undef'
+d_stdio_ptr_lval_nochange_cnt='undef'
d_stdio_stream_array='undef'
d_stdiobase='define'
d_stdstdio='define'
@@ -393,6 +410,7 @@ freetype='void'
full_ar=''
full_csh=''
full_sed=''
+gccosandvers=''
gccversion=''
gidformat='"ld"'
gidsign='-1'
@@ -407,7 +425,6 @@ h_fcntl='false'
h_sysfile='true'
hint='recommended'
hostcat='ypcat hosts'
-huge=''
i16size='2'
i16type='short'
i32size='4'
@@ -430,6 +447,7 @@ i_grp='undef'
i_iconv='undef'
i_ieeefp='undef'
i_inttypes='undef'
+i_libutil='undef'
i_limits='define'
i_locale='define'
i_machcthr='undef'
@@ -443,6 +461,7 @@ i_neterrno='undef'
i_netinettcp='undef'
i_niin='undef'
i_poll='undef'
+i_prot='undef'
i_pthread='undef'
i_pwd='undef'
i_rpcsvcdbm='define'
@@ -517,15 +536,16 @@ installvendorarch=''
installvendorbin=''
installvendorlib=''
intsize='4'
+issymlink=''
ivdformat='"ld"'
ivsize='4'
ivtype='long'
known_extensions='~static_ext~ ~dynamic_ext~ ~nonxs_ext~'
ksh=''
-large=''
ld='gcc'
lddlflags='-mdll ~LINK_FLAGS~'
ldflags='~LINK_FLAGS~'
+ldflags_uselargefiles=''
ldlibpthname=''
less='less'
lib_ext='.a'
@@ -538,6 +558,7 @@ libsfiles=''
libsfound=''
libspath=''
libswanted='net socket inet nsl nm ndbm gdbm dbm db malloc dl dld ld sun m c cposix posix ndir dir crypt ucb bsd BSD PW x'
+libswanted_uselargefiles=''
line='line'
lint=''
lkflags=''
@@ -566,11 +587,9 @@ man1ext='1'
man3dir='~INST_TOP~~INST_VER~\man\man3'
man3direxp='~INST_TOP~~INST_VER~\man\man3'
man3ext='3'
-medium=''
mips_type=''
mkdir='mkdir'
mmaptype='void *'
-models='none'
modetype='mode_t'
more='more /e'
multiarch='undef'
@@ -589,6 +608,12 @@ nm_opt=''
nm_so_opt=''
nonxs_ext='Errno'
nroff=''
+nvEUformat='"E"'
+nvFUformat='"F"'
+nvGUformat='"G"'
+nveformat='"e"'
+nvfformat='"f"'
+nvgformat='"g"'
nvsize='8'
nvtype='double'
o_nonblock='O_NONBLOCK'
@@ -598,14 +623,16 @@ optimize='-O2'
orderlib='false'
osname='MSWin32'
osvers='4.0'
+otherlibdirs=''
package='perl5'
pager='more /e'
passcat=''
-patchlevel='~PATCHLEVEL~'
+patchlevel='~PERL_VERSION~'
path_sep=';'
perl5=''
perl='perl'
perladmin=''
+perllibs='~libs~'
perlpath='~INST_TOP~~INST_VER~\bin~INST_ARCH~\perl.exe'
pg=''
phostname='hostname'
@@ -631,10 +658,10 @@ revision='5'
rm='del'
rmail=''
runnm='true'
-sPRIEldbl='"E"'
-sPRIFldbl='"F"'
-sPRIGldbl='"G"'
-sPRIX64='"lX"'
+sPRIEUldbl='"E"'
+sPRIFUldbl='"F"'
+sPRIGUldbl='"G"'
+sPRIXU64='"lX"'
sPRId64='"ld"'
sPRIeldbl='"e"'
sPRIfldbl='"f"'
@@ -643,6 +670,7 @@ sPRIi64='"li"'
sPRIo64='"lo"'
sPRIu64='"lu"'
sPRIx64='"lx"'
+sSCNfldbl='"f"'
sched_yield=''
scriptdir='~INST_TOP~~INST_VER~\bin'
scriptdirexp='~INST_TOP~~INST_VER~\bin'
@@ -677,7 +705,6 @@ sizesize='4'
sizetype='size_t'
sleep=''
smail=''
-small=''
so='dll'
sockethdr=''
socketlib=''
@@ -685,7 +712,6 @@ socksizetype='int'
sort='sort'
spackage='Perl5'
spitshell=''
-split=''
src=''
ssizetype='int'
startperl='#!perl'
@@ -700,7 +726,7 @@ stdio_ptr='((fp)->_ptr)'
stdio_stream_array=''
strings='/usr/include/string.h'
submit=''
-subversion='~SUBVERSION~'
+subversion='~PERL_SUBVERSION~'
sysman='/usr/man/man1'
tail=''
tar=''
@@ -750,6 +776,7 @@ usevendorprefix='undef'
usevfork='false'
usrinc='/usr/include'
uuname=''
+uvXUformat='"lX"'
uvoformat='"lo"'
uvsize='4'
uvtype='unsigned long'
@@ -765,6 +792,7 @@ vendorlibexp=''
vendorprefix=''
vendorprefixexp=''
version='~VERSION~'
+versiononly='undef'
vi=''
voidflags='15'
xlibpth='/usr/lib/386 /lib/386'
@@ -777,5 +805,3 @@ PERL_VERSION='~PERL_VERSION~'
PERL_API_REVISION='~PERL_API_REVISION~'
PERL_API_SUBVERSION='~PERL_API_SUBVERSION~'
PERL_API_VERSION='~PERL_API_VERSION~'
-PATCHLEVEL='~PERL_VERSION~'
-SUBVERSION='~PERL_SUBVERSION~'
diff --git a/gnu/usr.bin/perl/win32/perlhost.h b/gnu/usr.bin/perl/win32/perlhost.h
index cac05b28324..257131fdcad 100644
--- a/gnu/usr.bin/perl/win32/perlhost.h
+++ b/gnu/usr.bin/perl/win32/perlhost.h
@@ -10,6 +10,7 @@
#ifndef ___PerlHost_H___
#define ___PerlHost_H___
+#include <signal.h>
#include "iperlsys.h"
#include "vmem.h"
#include "vdir.h"
@@ -939,7 +940,7 @@ PerlLIOFlock(struct IPerlLIO* piPerl, int fd, int oper)
int
PerlLIOFileStat(struct IPerlLIO* piPerl, int handle, struct stat *buffer)
{
- return fstat(handle, buffer);
+ return win32_fstat(handle, buffer);
}
int
@@ -1639,7 +1640,7 @@ PerlProcWaitpid(struct IPerlProc* piPerl, int pid, int *status, int flags)
Sighandler_t
PerlProcSignal(struct IPerlProc* piPerl, int sig, Sighandler_t subcode)
{
- return 0;
+ return signal(sig, subcode);
}
#ifdef USE_ITHREADS
@@ -1665,6 +1666,11 @@ win32_start_child(LPVOID arg)
w32_pseudo_id = id;
#else
w32_pseudo_id = GetCurrentThreadId();
+ if (IsWin95()) {
+ int pid = (int)w32_pseudo_id;
+ if (pid < 0)
+ w32_pseudo_id = -pid;
+ }
#endif
if (tmpgv = gv_fetchpv("$", TRUE, SVt_PV))
sv_setiv(GvSV(tmpgv), -(IV)w32_pseudo_id);
@@ -1672,7 +1678,7 @@ win32_start_child(LPVOID arg)
/* push a zero on the stack (we are the child) */
{
- djSP;
+ dSP;
dTARGET;
PUSHi(0);
PUTBACK;
@@ -1745,7 +1751,13 @@ PerlProcFork(struct IPerlProc* piPerl)
#ifdef USE_ITHREADS
DWORD id;
HANDLE handle;
- CPerlHost *h = new CPerlHost(*(CPerlHost*)w32_internal_host);
+ CPerlHost *h;
+
+ if (w32_num_pseudo_children >= MAXIMUM_WAIT_OBJECTS) {
+ errno = EAGAIN;
+ return -1;
+ }
+ h = new CPerlHost(*(CPerlHost*)w32_internal_host);
PerlInterpreter *new_perl = perl_clone_using((PerlInterpreter*)aTHXo, 1,
h->m_pHostperlMem,
h->m_pHostperlMemShared,
@@ -1770,8 +1782,15 @@ PerlProcFork(struct IPerlProc* piPerl)
(LPVOID)new_perl, 0, &id);
# endif
PERL_SET_THX(aTHXo); /* XXX perl_clone*() set TLS */
- if (!handle)
- Perl_croak(aTHX_ "panic: pseudo fork() failed");
+ if (!handle) {
+ errno = EAGAIN;
+ return -1;
+ }
+ if (IsWin95()) {
+ int pid = (int)id;
+ if (pid < 0)
+ id = -pid;
+ }
w32_pseudo_child_handles[w32_num_pseudo_children] = handle;
w32_pseudo_child_pids[w32_num_pseudo_children] = id;
++w32_num_pseudo_children;
@@ -2146,10 +2165,10 @@ CPerlHost::GetChildDir(void)
New(0, ptr, MAX_PATH+1, char);
if(ptr) {
m_pvDir->GetCurrentDirectoryA(MAX_PATH+1, ptr);
- length = strlen(ptr)-1;
- if(length > 0) {
- if((ptr[length] == '\\') || (ptr[length] == '/'))
- ptr[length] = 0;
+ length = strlen(ptr);
+ if (length > 3) {
+ if ((ptr[length-1] == '\\') || (ptr[length-1] == '/'))
+ ptr[length-1] = 0;
}
}
return ptr;
@@ -2199,7 +2218,7 @@ CPerlHost::CreateLocalEnvironmentStrings(VDir &vDir)
dwEnvIndex = 0;
lpLocalEnv = GetIndex(dwEnvIndex);
while(*lpEnvPtr != '\0') {
- if(lpLocalEnv == NULL) {
+ if(!lpLocalEnv) {
// all environment overrides have been added
// so copy string into place
strcpy(lpStr, lpEnvPtr);
@@ -2231,6 +2250,16 @@ CPerlHost::CreateLocalEnvironmentStrings(VDir &vDir)
}
}
+ while(lpLocalEnv) {
+ // still have environment overrides to add
+ // so copy the strings into place
+ strcpy(lpStr, lpLocalEnv);
+ nLength = strlen(lpLocalEnv) + 1;
+ lpStr += nLength;
+ lpEnvPtr += nLength;
+ lpLocalEnv = GetIndex(dwEnvIndex);
+ }
+
// add final NULL
*lpStr = '\0';
}
diff --git a/gnu/usr.bin/perl/win32/sncfnmcs.pl b/gnu/usr.bin/perl/win32/sncfnmcs.pl
new file mode 100644
index 00000000000..bb62460ea08
--- /dev/null
+++ b/gnu/usr.bin/perl/win32/sncfnmcs.pl
@@ -0,0 +1,63 @@
+=comment
+
+Synchronize filename cases.
+This script takes two arguments - first and second extensions to synchronize
+filename cases with.
+
+There may be specified following options:
+ --verbose <== say everything what is going on
+ --recurse <== recurse subdirectories
+ --dummy <== do not perform actual renaming
+ --say-subdir
+Every such option can be specified with an optional "no" prefix to negate it.
+
+Typically, it is invoked as:
+ perl sync-fnamescase.pl c obj --verbose
+
+=cut
+
+use strict;
+
+my ($ext1, $ext2) = map {quotemeta} grep {!/^--/} @ARGV;
+my %opts = (
+ #defaults
+ 'verbose' => 0,
+ 'recurse' => 1,
+ 'dummy' => 0,
+ 'say-subdir' => 0,
+ #options itself
+ (map {/^--([\-_\w]+)=(.*)$/} @ARGV), # --opt=smth
+ (map {/^no-?(.*)$/i?($1=>0):($_=>1)} map {/^--([\-_\w]+)$/} @ARGV), # --opt --no-opt --noopt
+ );
+
+my $sp = '';
+sub xx {
+ opendir DIR, '.';
+ my @t = readdir DIR;
+ my @f = map {/^(.*)\.$ext1$/i} @t;
+ my %f = map {lc($_)=>$_} map {/^(.*)\.$ext2$/i} @t;
+ for (@f) {
+ my $lc = lc($_);
+ if (exists $f{$lc} and $f{$lc} ne $_) {
+ print STDERR "$sp$f{$lc}.$ext2 <==> $_.$ext1\n" if $opts{verbose};
+ if ($opts{dummy}) {
+ print STDERR "ren $f{$lc}.$ext2 $_.$ext2\n";
+ }
+ else {
+ system "ren $f{$lc}.$ext2 $_.$ext2";
+ }
+ }
+ }
+ if ($opts{recurse}) {
+ for (grep {-d&&!/^\.\.?$/} @t) {
+ print STDERR "$sp\\$_\n" if $opts{'say-subdir'};
+ $sp .= ' ';
+ chdir $_ or die;
+ xx();
+ chdir ".." or die;
+ chop $sp;
+ }
+ }
+}
+
+xx();
diff --git a/gnu/usr.bin/perl/win32/vdir.h b/gnu/usr.bin/perl/win32/vdir.h
index df9a10b1301..7e4a03a149f 100644
--- a/gnu/usr.bin/perl/win32/vdir.h
+++ b/gnu/usr.bin/perl/win32/vdir.h
@@ -10,7 +10,11 @@
#ifndef ___VDir_H___
#define ___VDir_H___
-const int driveCount = 30;
+/*
+ * Allow one slot for each possible drive letter
+ * and one additional slot for a UNC name
+ */
+const int driveCount = ('Z'-'A')+1+1;
class VDir
{
@@ -105,6 +109,8 @@ protected:
inline int DriveIndex(char chr)
{
+ if (chr == '\\' || chr == '/')
+ return ('Z'-'A')+1;
return (chr | 0x20)-'a';
};
@@ -366,8 +372,12 @@ char *VDir::MapPathA(const char *pInName)
*/
char szBuffer[(MAX_PATH+1)*2];
char szlBuf[MAX_PATH+1];
+ int length = strlen(pInName);
+
+ if (!length)
+ return (char*)pInName;
- if (strlen(pInName) > MAX_PATH) {
+ if (length > MAX_PATH) {
strncpy(szlBuf, pInName, MAX_PATH);
if (IsPathSep(pInName[0]) && !IsPathSep(pInName[1])) {
/* absolute path - reduce length by 2 for drive specifier */
@@ -430,59 +440,60 @@ char *VDir::MapPathA(const char *pInName)
int VDir::SetCurrentDirectoryA(char *lpBuffer)
{
- HANDLE hHandle;
- WIN32_FIND_DATA win32FD;
- char szBuffer[MAX_PATH+1], *pPtr;
+ char *pPtr;
int length, nRet = -1;
- GetFullPathNameA(MapPathA(lpBuffer), sizeof(szBuffer), szBuffer, &pPtr);
- /* if the last char is a '\\' or a '/' then add
- * an '*' before calling FindFirstFile
- */
- length = strlen(szBuffer);
- if(length > 0 && IsPathSep(szBuffer[length-1])) {
- szBuffer[length] = '*';
- szBuffer[length+1] = '\0';
+ pPtr = MapPathA(lpBuffer);
+ length = strlen(pPtr);
+ if(length > 3 && IsPathSep(pPtr[length-1])) {
+ /* don't remove the trailing slash from 'x:\' */
+ pPtr[length-1] = '\0';
}
- hHandle = FindFirstFileA(szBuffer, &win32FD);
- if (hHandle != INVALID_HANDLE_VALUE) {
- FindClose(hHandle);
-
- /* if an '*' was added remove it */
- if(szBuffer[length] == '*')
- szBuffer[length] = '\0';
-
+ DWORD r = GetFileAttributesA(pPtr);
+ if ((r != 0xffffffff) && (r & FILE_ATTRIBUTE_DIRECTORY))
+ {
+ char szBuffer[(MAX_PATH+1)*2];
+ DoGetFullPathNameA(pPtr, sizeof(szBuffer), szBuffer);
SetDefaultDirA(szBuffer, DriveIndex(szBuffer[0]));
nRet = 0;
}
+
return nRet;
}
DWORD VDir::CalculateEnvironmentSpace(void)
-{ /* the current directory environment strings are stored as '=d=d:\path' */
+{ /* the current directory environment strings are stored as '=D:=d:\path' */
int index;
DWORD dwSize = 0;
for (index = 0; index < driveCount; ++index) {
if (dirTableA[index] != NULL) {
- dwSize += strlen(dirTableA[index]) + 4; /* add 1 for trailing NULL and 3 for '=d=' */
+ dwSize += strlen(dirTableA[index]) + 5; /* add 1 for trailing NULL and 4 for '=D:=' */
}
}
return dwSize;
}
LPSTR VDir::BuildEnvironmentSpace(LPSTR lpStr)
-{ /* store the current directory environment strings as '=d=d:\path' */
- int index;
+{ /* store the current directory environment strings as '=D:=d:\path' */
+ int index, length;
LPSTR lpDirStr;
for (index = 0; index < driveCount; ++index) {
lpDirStr = dirTableA[index];
if (lpDirStr != NULL) {
lpStr[0] = '=';
lpStr[1] = lpDirStr[0];
- lpStr[2] = '=';
- strcpy(&lpStr[3], lpDirStr);
- lpStr += strlen(lpDirStr) + 4; /* add 1 for trailing NULL and 3 for '=d=' */
+ lpStr[2] = '\0';
+ CharUpper(&lpStr[1]);
+ lpStr[2] = ':';
+ lpStr[3] = '=';
+ strcpy(&lpStr[4], lpDirStr);
+ length = strlen(lpDirStr);
+ lpStr += length + 5; /* add 1 for trailing NULL and 4 for '=D:=' */
+ if (length > 3 && IsPathSep(lpStr[-2])) {
+ lpStr[-2] = '\0'; /* remove the trailing path separator */
+ --lpStr;
+ }
}
}
return lpStr;
@@ -590,8 +601,12 @@ WCHAR* VDir::MapPathW(const WCHAR *pInName)
*/
WCHAR szBuffer[(MAX_PATH+1)*2];
WCHAR szlBuf[MAX_PATH+1];
+ int length = wcslen(pInName);
+
+ if (!length)
+ return (WCHAR*)pInName;
- if (wcslen(pInName) > MAX_PATH) {
+ if (length > MAX_PATH) {
wcsncpy(szlBuf, pInName, MAX_PATH);
if (IsPathSep(pInName[0]) && !IsPathSep(pInName[1])) {
/* absolute path - reduce length by 2 for drive specifier */
@@ -653,32 +668,25 @@ WCHAR* VDir::MapPathW(const WCHAR *pInName)
int VDir::SetCurrentDirectoryW(WCHAR *lpBuffer)
{
- HANDLE hHandle;
- WIN32_FIND_DATAW win32FD;
- WCHAR szBuffer[MAX_PATH+1], *pPtr;
+ WCHAR *pPtr;
int length, nRet = -1;
- GetFullPathNameW(MapPathW(lpBuffer), (sizeof(szBuffer)/sizeof(WCHAR)), szBuffer, &pPtr);
- /* if the last char is a '\\' or a '/' then add
- * an '*' before calling FindFirstFile
- */
- length = wcslen(szBuffer);
- if(length > 0 && IsPathSep(szBuffer[length-1])) {
- szBuffer[length] = '*';
- szBuffer[length+1] = '\0';
+ pPtr = MapPathW(lpBuffer);
+ length = wcslen(pPtr);
+ if(length > 3 && IsPathSep(pPtr[length-1])) {
+ /* don't remove the trailing slash from 'x:\' */
+ pPtr[length-1] = '\0';
}
- hHandle = FindFirstFileW(szBuffer, &win32FD);
- if (hHandle != INVALID_HANDLE_VALUE) {
- FindClose(hHandle);
-
- /* if an '*' was added remove it */
- if(szBuffer[length] == '*')
- szBuffer[length] = '\0';
-
- SetDefaultDirW(szBuffer, DriveIndex((char)szBuffer[0]));
+ DWORD r = GetFileAttributesW(pPtr);
+ if ((r != 0xffffffff) && (r & FILE_ATTRIBUTE_DIRECTORY))
+ {
+ WCHAR wBuffer[(MAX_PATH+1)*2];
+ DoGetFullPathNameW(pPtr, (sizeof(wBuffer)/sizeof(WCHAR)), wBuffer);
+ SetDefaultDirW(wBuffer, DriveIndex((char)wBuffer[0]));
nRet = 0;
}
+
return nRet;
}
diff --git a/gnu/usr.bin/perl/win32/win32thread.h b/gnu/usr.bin/perl/win32/win32thread.h
index 809e0f72124..a52118b48e4 100644
--- a/gnu/usr.bin/perl/win32/win32thread.h
+++ b/gnu/usr.bin/perl/win32/win32thread.h
@@ -175,6 +175,11 @@ END_EXTERN_C
} \
} STMT_END
+#define FREE_THREAD_KEY \
+ STMT_START { \
+ TlsFree(PL_thr_key); \
+ } STMT_END
+
#if defined(USE_RTL_THREAD_API) && !defined(_MSC_VER)
#define JOIN(t, avp) \
STMT_START { \
diff --git a/gnu/usr.bin/perl/x2p/proto.h b/gnu/usr.bin/perl/x2p/proto.h
index 85d749616ae..e57b4fc30e3 100644
--- a/gnu/usr.bin/perl/x2p/proto.h
+++ b/gnu/usr.bin/perl/x2p/proto.h
@@ -1,6 +1,6 @@
/* proto.h
*
- * Copyright (c) 1991-1997, Larry Wall
+ * Copyright (c) 1991-2001, 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/gnu/usr.bin/perl/xsutils.c b/gnu/usr.bin/perl/xsutils.c
index 0f5989b3dd5..b4161b0d096 100644
--- a/gnu/usr.bin/perl/xsutils.c
+++ b/gnu/usr.bin/perl/xsutils.c
@@ -253,6 +253,8 @@ usage:
rv = ST(0);
ST(0) = TARG;
+ if (SvGMAGICAL(rv))
+ mg_get(rv);
if (!(SvOK(rv) && SvROK(rv)))
goto usage;
sv = SvRV(rv);