From fbf4a6e8014789c67a381e0b4f05de5bdadbce24 Mon Sep 17 00:00:00 2001 From: Staszek Wawrykiewicz Date: Mon, 18 Dec 2006 03:24:34 +0000 Subject: perltl added git-svn-id: svn://tug.org/texlive/trunk@2778 c570f23f-e606-0410-a88d-b1316a301751 --- Master/perltl/lib/AnyDBM_File.pm | 93 + Master/perltl/lib/AutoLoader.pm | 337 + Master/perltl/lib/B.pm | 971 ++ Master/perltl/lib/B/Deparse.pm | 4233 ++++++ Master/perltl/lib/Carp.pm | 196 + Master/perltl/lib/Carp/Heavy.pm | 247 + Master/perltl/lib/Class/Struct.pm | 632 + Master/perltl/lib/Config.pm | 8895 ++++++++++++ Master/perltl/lib/Cwd.pm | 570 + Master/perltl/lib/Data/Dumper.pm | 1160 ++ Master/perltl/lib/Digest/MD5.pm | 279 + Master/perltl/lib/DynaLoader.pm | 826 ++ Master/perltl/lib/Errno.pm | 221 + Master/perltl/lib/Exporter.pm | 416 + Master/perltl/lib/Exporter/Heavy.pm | 232 + Master/perltl/lib/Fcntl.pm | 216 + Master/perltl/lib/File/Basename.pm | 289 + Master/perltl/lib/File/Compare.pm | 178 + Master/perltl/lib/File/Copy.pm | 443 + Master/perltl/lib/File/Find.pm | 1212 ++ Master/perltl/lib/File/Glob.pm | 465 + Master/perltl/lib/File/Path.pm | 267 + Master/perltl/lib/File/Spec.pm | 292 + Master/perltl/lib/File/Spec/Unix.pm | 482 + Master/perltl/lib/File/Spec/Win32.pm | 370 + Master/perltl/lib/File/Temp.pm | 1876 +++ Master/perltl/lib/FindBin.pm | 183 + Master/perltl/lib/Getopt/Long.pm | 2048 +++ Master/perltl/lib/IO.pm | 47 + Master/perltl/lib/IO/File.pm | 169 + Master/perltl/lib/IO/Handle.pm | 613 + Master/perltl/lib/IO/Seekable.pm | 128 + Master/perltl/lib/List/Util.pm | 194 + Master/perltl/lib/POSIX.pm | 950 ++ Master/perltl/lib/SDBM_File.pm | 116 + Master/perltl/lib/Scalar/Util.pm | 170 + Master/perltl/lib/SelectSaver.pm | 54 + Master/perltl/lib/Symbol.pm | 162 + Master/perltl/lib/Term/Cap.pm | 651 + Master/perltl/lib/Text/ParseWords.pm | 263 + Master/perltl/lib/Text/Tabs.pm | 97 + Master/perltl/lib/Text/Wrap.pm | 211 + Master/perltl/lib/Tie/Hash.pm | 243 + Master/perltl/lib/Tie/Scalar.pm | 140 + Master/perltl/lib/Time/HiRes.pm | 357 + Master/perltl/lib/Time/Local.pm | 255 + Master/perltl/lib/UNIVERSAL.pm | 118 + Master/perltl/lib/XSLoader.pm | 138 + Master/perltl/lib/attributes.pm | 414 + Master/perltl/lib/auto/B/B.dll | Bin 0 -> 90112 bytes Master/perltl/lib/auto/Cwd/Cwd.dll | Bin 0 -> 6656 bytes Master/perltl/lib/auto/Data/Dumper/Dumper.dll | Bin 0 -> 20992 bytes Master/perltl/lib/auto/Digest/MD5/MD5.dll | Bin 0 -> 12800 bytes Master/perltl/lib/auto/DynaLoader/autosplit.ix | 8 + Master/perltl/lib/auto/DynaLoader/dl_expandspec.al | 34 + .../lib/auto/DynaLoader/dl_find_symbol_anywhere.al | 19 + Master/perltl/lib/auto/DynaLoader/dl_findfile.al | 115 + Master/perltl/lib/auto/Fcntl/Fcntl.dll | Bin 0 -> 10752 bytes Master/perltl/lib/auto/File/Glob/Glob.dll | Bin 0 -> 12800 bytes Master/perltl/lib/auto/IO/IO.dll | Bin 0 -> 12288 bytes Master/perltl/lib/auto/List/Util/Util.dll | Bin 0 -> 15872 bytes Master/perltl/lib/auto/POSIX/POSIX.dll | Bin 0 -> 86016 bytes Master/perltl/lib/auto/POSIX/abs.al | 13 + Master/perltl/lib/auto/POSIX/alarm.al | 13 + Master/perltl/lib/auto/POSIX/assert.al | 15 + Master/perltl/lib/auto/POSIX/atan2.al | 13 + Master/perltl/lib/auto/POSIX/atexit.al | 12 + Master/perltl/lib/auto/POSIX/atof.al | 12 + Master/perltl/lib/auto/POSIX/atoi.al | 12 + Master/perltl/lib/auto/POSIX/atol.al | 12 + Master/perltl/lib/auto/POSIX/autosplit.ix | 153 + Master/perltl/lib/auto/POSIX/bsearch.al | 12 + Master/perltl/lib/auto/POSIX/calloc.al | 12 + Master/perltl/lib/auto/POSIX/chdir.al | 13 + Master/perltl/lib/auto/POSIX/chmod.al | 13 + Master/perltl/lib/auto/POSIX/chown.al | 13 + Master/perltl/lib/auto/POSIX/clearerr.al | 12 + Master/perltl/lib/auto/POSIX/closedir.al | 13 + Master/perltl/lib/auto/POSIX/cos.al | 13 + Master/perltl/lib/auto/POSIX/creat.al | 13 + Master/perltl/lib/auto/POSIX/div.al | 12 + Master/perltl/lib/auto/POSIX/errno.al | 13 + Master/perltl/lib/auto/POSIX/execl.al | 12 + Master/perltl/lib/auto/POSIX/execle.al | 12 + Master/perltl/lib/auto/POSIX/execlp.al | 12 + Master/perltl/lib/auto/POSIX/execv.al | 12 + Master/perltl/lib/auto/POSIX/execve.al | 12 + Master/perltl/lib/auto/POSIX/execvp.al | 12 + Master/perltl/lib/auto/POSIX/exit.al | 13 + Master/perltl/lib/auto/POSIX/exp.al | 13 + Master/perltl/lib/auto/POSIX/fabs.al | 13 + Master/perltl/lib/auto/POSIX/fclose.al | 12 + Master/perltl/lib/auto/POSIX/fcntl.al | 13 + Master/perltl/lib/auto/POSIX/fdopen.al | 12 + Master/perltl/lib/auto/POSIX/feof.al | 12 + Master/perltl/lib/auto/POSIX/ferror.al | 12 + Master/perltl/lib/auto/POSIX/fflush.al | 12 + Master/perltl/lib/auto/POSIX/fgetc.al | 12 + Master/perltl/lib/auto/POSIX/fgetpos.al | 12 + Master/perltl/lib/auto/POSIX/fgets.al | 12 + Master/perltl/lib/auto/POSIX/fileno.al | 12 + Master/perltl/lib/auto/POSIX/fopen.al | 12 + Master/perltl/lib/auto/POSIX/fork.al | 13 + Master/perltl/lib/auto/POSIX/fprintf.al | 12 + Master/perltl/lib/auto/POSIX/fputc.al | 12 + Master/perltl/lib/auto/POSIX/fputs.al | 12 + Master/perltl/lib/auto/POSIX/fread.al | 12 + Master/perltl/lib/auto/POSIX/free.al | 12 + Master/perltl/lib/auto/POSIX/freopen.al | 12 + Master/perltl/lib/auto/POSIX/fscanf.al | 12 + Master/perltl/lib/auto/POSIX/fseek.al | 12 + Master/perltl/lib/auto/POSIX/fsetpos.al | 12 + Master/perltl/lib/auto/POSIX/fstat.al | 17 + Master/perltl/lib/auto/POSIX/ftell.al | 12 + Master/perltl/lib/auto/POSIX/fwrite.al | 12 + Master/perltl/lib/auto/POSIX/getc.al | 13 + Master/perltl/lib/auto/POSIX/getchar.al | 13 + Master/perltl/lib/auto/POSIX/getegid.al | 13 + Master/perltl/lib/auto/POSIX/getenv.al | 13 + Master/perltl/lib/auto/POSIX/geteuid.al | 13 + Master/perltl/lib/auto/POSIX/getgid.al | 13 + Master/perltl/lib/auto/POSIX/getgrgid.al | 13 + Master/perltl/lib/auto/POSIX/getgrnam.al | 13 + Master/perltl/lib/auto/POSIX/getgroups.al | 14 + Master/perltl/lib/auto/POSIX/getlogin.al | 13 + Master/perltl/lib/auto/POSIX/getpgrp.al | 13 + Master/perltl/lib/auto/POSIX/getpid.al | 13 + Master/perltl/lib/auto/POSIX/getppid.al | 13 + Master/perltl/lib/auto/POSIX/getpwnam.al | 13 + Master/perltl/lib/auto/POSIX/getpwuid.al | 13 + Master/perltl/lib/auto/POSIX/gets.al | 13 + Master/perltl/lib/auto/POSIX/getuid.al | 13 + Master/perltl/lib/auto/POSIX/gmtime.al | 13 + Master/perltl/lib/auto/POSIX/isatty.al | 13 + Master/perltl/lib/auto/POSIX/kill.al | 13 + Master/perltl/lib/auto/POSIX/labs.al | 12 + Master/perltl/lib/auto/POSIX/ldiv.al | 12 + Master/perltl/lib/auto/POSIX/link.al | 13 + Master/perltl/lib/auto/POSIX/load_imports.al | 224 + Master/perltl/lib/auto/POSIX/localtime.al | 13 + Master/perltl/lib/auto/POSIX/log.al | 13 + Master/perltl/lib/auto/POSIX/longjmp.al | 12 + Master/perltl/lib/auto/POSIX/malloc.al | 12 + Master/perltl/lib/auto/POSIX/memchr.al | 12 + Master/perltl/lib/auto/POSIX/memcmp.al | 12 + Master/perltl/lib/auto/POSIX/memcpy.al | 12 + Master/perltl/lib/auto/POSIX/memmove.al | 12 + Master/perltl/lib/auto/POSIX/memset.al | 12 + Master/perltl/lib/auto/POSIX/mkdir.al | 13 + Master/perltl/lib/auto/POSIX/offsetof.al | 12 + Master/perltl/lib/auto/POSIX/opendir.al | 16 + Master/perltl/lib/auto/POSIX/perror.al | 13 + Master/perltl/lib/auto/POSIX/pow.al | 13 + Master/perltl/lib/auto/POSIX/printf.al | 13 + Master/perltl/lib/auto/POSIX/putc.al | 12 + Master/perltl/lib/auto/POSIX/putchar.al | 12 + Master/perltl/lib/auto/POSIX/puts.al | 12 + Master/perltl/lib/auto/POSIX/qsort.al | 12 + Master/perltl/lib/auto/POSIX/raise.al | 13 + Master/perltl/lib/auto/POSIX/rand.al | 12 + Master/perltl/lib/auto/POSIX/readdir.al | 13 + Master/perltl/lib/auto/POSIX/realloc.al | 12 + Master/perltl/lib/auto/POSIX/redef.al | 13 + Master/perltl/lib/auto/POSIX/remove.al | 13 + Master/perltl/lib/auto/POSIX/rename.al | 13 + Master/perltl/lib/auto/POSIX/rewind.al | 13 + Master/perltl/lib/auto/POSIX/rewinddir.al | 13 + Master/perltl/lib/auto/POSIX/rmdir.al | 13 + Master/perltl/lib/auto/POSIX/scanf.al | 12 + Master/perltl/lib/auto/POSIX/setbuf.al | 12 + Master/perltl/lib/auto/POSIX/setjmp.al | 12 + Master/perltl/lib/auto/POSIX/setvbuf.al | 12 + Master/perltl/lib/auto/POSIX/siglongjmp.al | 12 + Master/perltl/lib/auto/POSIX/sigsetjmp.al | 12 + Master/perltl/lib/auto/POSIX/sin.al | 13 + Master/perltl/lib/auto/POSIX/sleep.al | 13 + Master/perltl/lib/auto/POSIX/sprintf.al | 13 + Master/perltl/lib/auto/POSIX/sqrt.al | 13 + Master/perltl/lib/auto/POSIX/srand.al | 12 + Master/perltl/lib/auto/POSIX/sscanf.al | 12 + Master/perltl/lib/auto/POSIX/stat.al | 13 + Master/perltl/lib/auto/POSIX/strcat.al | 12 + Master/perltl/lib/auto/POSIX/strchr.al | 12 + Master/perltl/lib/auto/POSIX/strcmp.al | 12 + Master/perltl/lib/auto/POSIX/strcpy.al | 12 + Master/perltl/lib/auto/POSIX/strcspn.al | 12 + Master/perltl/lib/auto/POSIX/strerror.al | 14 + Master/perltl/lib/auto/POSIX/strlen.al | 12 + Master/perltl/lib/auto/POSIX/strncat.al | 12 + Master/perltl/lib/auto/POSIX/strncmp.al | 12 + Master/perltl/lib/auto/POSIX/strncpy.al | 12 + Master/perltl/lib/auto/POSIX/strpbrk.al | 12 + Master/perltl/lib/auto/POSIX/strrchr.al | 12 + Master/perltl/lib/auto/POSIX/strspn.al | 12 + Master/perltl/lib/auto/POSIX/strstr.al | 13 + Master/perltl/lib/auto/POSIX/strtok.al | 12 + Master/perltl/lib/auto/POSIX/system.al | 13 + Master/perltl/lib/auto/POSIX/time.al | 13 + Master/perltl/lib/auto/POSIX/tmpfile.al | 12 + Master/perltl/lib/auto/POSIX/tolower.al | 13 + Master/perltl/lib/auto/POSIX/toupper.al | 13 + Master/perltl/lib/auto/POSIX/umask.al | 13 + Master/perltl/lib/auto/POSIX/ungetc.al | 12 + Master/perltl/lib/auto/POSIX/unimpl.al | 14 + Master/perltl/lib/auto/POSIX/unlink.al | 13 + Master/perltl/lib/auto/POSIX/usage.al | 13 + Master/perltl/lib/auto/POSIX/utime.al | 13 + Master/perltl/lib/auto/POSIX/vfprintf.al | 12 + Master/perltl/lib/auto/POSIX/vprintf.al | 12 + Master/perltl/lib/auto/POSIX/vsprintf.al | 12 + Master/perltl/lib/auto/POSIX/wait.al | 13 + Master/perltl/lib/auto/POSIX/waitpid.al | 13 + Master/perltl/lib/auto/SDBM_File/SDBM_File.dll | Bin 0 -> 20480 bytes Master/perltl/lib/auto/Time/HiRes/HiRes.dll | Bin 0 -> 10240 bytes Master/perltl/lib/auto/re/re.dll | Bin 0 -> 114688 bytes Master/perltl/lib/base.pm | 94 + Master/perltl/lib/bytes.pm | 68 + Master/perltl/lib/bytes_heavy.pl | 8 + Master/perltl/lib/constant.pm | 345 + Master/perltl/lib/fields.pm | 285 + Master/perltl/lib/integer.pm | 93 + Master/perltl/lib/lib.pm | 205 + Master/perltl/lib/newgetopt.pl | 75 + Master/perltl/lib/overload.pm | 1432 ++ Master/perltl/lib/re.pm | 134 + Master/perltl/lib/strict.pm | 117 + Master/perltl/lib/subs.pm | 40 + Master/perltl/lib/unicore/ArabLink.pl | 49 + Master/perltl/lib/unicore/ArabLnkGrp.pl | 98 + Master/perltl/lib/unicore/Bidirectional.pl | 692 + Master/perltl/lib/unicore/Blocks.pl | 116 + Master/perltl/lib/unicore/Canonical.pl | 816 ++ Master/perltl/lib/unicore/Category.pl | 1732 +++ Master/perltl/lib/unicore/CombiningClass.pl | 169 + Master/perltl/lib/unicore/Decomposition.pl | 5120 +++++++ Master/perltl/lib/unicore/Exact.pl | 110 + Master/perltl/lib/unicore/JamoShort.pl | 73 + Master/perltl/lib/unicore/Lbrk.pl | 1073 ++ Master/perltl/lib/unicore/Name.pl | 13869 +++++++++++++++++++ Master/perltl/lib/unicore/Number.pl | 537 + Master/perltl/lib/unicore/Scripts.pl | 371 + Master/perltl/lib/unicore/To/Digit.pl | 274 + Master/perltl/lib/unicore/To/Fold.pl | 849 ++ Master/perltl/lib/unicore/To/Lower.pl | 760 + Master/perltl/lib/unicore/To/Title.pl | 818 ++ Master/perltl/lib/unicore/To/Upper.pl | 845 ++ Master/perltl/lib/unicore/lib/ASCII.pl | 13 + Master/perltl/lib/unicore/lib/Alnum.pl | 423 + Master/perltl/lib/unicore/lib/Alpha.pl | 390 + Master/perltl/lib/unicore/lib/Alphabet.pl | 372 + Master/perltl/lib/unicore/lib/Any.pl | 14 + Master/perltl/lib/unicore/lib/Arabic.pl | 26 + Master/perltl/lib/unicore/lib/Armenian.pl | 16 + Master/perltl/lib/unicore/lib/AsciiHex.pl | 15 + Master/perltl/lib/unicore/lib/Assigned.pl | 398 + Master/perltl/lib/unicore/lib/Bengali.pl | 27 + Master/perltl/lib/unicore/lib/BidiAL.pl | 33 + Master/perltl/lib/unicore/lib/BidiAN.pl | 14 + Master/perltl/lib/unicore/lib/BidiB.pl | 17 + Master/perltl/lib/unicore/lib/BidiBN.pl | 26 + Master/perltl/lib/unicore/lib/BidiCS.pl | 23 + Master/perltl/lib/unicore/lib/BidiCont.pl | 14 + Master/perltl/lib/unicore/lib/BidiEN.pl | 23 + Master/perltl/lib/unicore/lib/BidiES.pl | 14 + Master/perltl/lib/unicore/lib/BidiET.pl | 36 + Master/perltl/lib/unicore/lib/BidiL.pl | 366 + Master/perltl/lib/unicore/lib/BidiLRE.pl | 13 + Master/perltl/lib/unicore/lib/BidiLRO.pl | 13 + Master/perltl/lib/unicore/lib/BidiNSM.pl | 115 + Master/perltl/lib/unicore/lib/BidiON.pl | 121 + Master/perltl/lib/unicore/lib/BidiPDF.pl | 13 + Master/perltl/lib/unicore/lib/BidiR.pl | 26 + Master/perltl/lib/unicore/lib/BidiRLE.pl | 13 + Master/perltl/lib/unicore/lib/BidiRLO.pl | 13 + Master/perltl/lib/unicore/lib/BidiS.pl | 15 + Master/perltl/lib/unicore/lib/BidiWS.pl | 20 + Master/perltl/lib/unicore/lib/Blank.pl | 20 + Master/perltl/lib/unicore/lib/Bopomofo.pl | 14 + Master/perltl/lib/unicore/lib/Buhid.pl | 13 + Master/perltl/lib/unicore/lib/C.pl | 400 + Master/perltl/lib/unicore/lib/Canadian.pl | 14 + Master/perltl/lib/unicore/lib/Canon.pl | 224 + Master/perltl/lib/unicore/lib/Cc.pl | 15 + Master/perltl/lib/unicore/lib/Cf.pl | 25 + Master/perltl/lib/unicore/lib/Cherokee.pl | 13 + Master/perltl/lib/unicore/lib/Cn.pl | 399 + Master/perltl/lib/unicore/lib/Cntrl.pl | 29 + Master/perltl/lib/unicore/lib/Co.pl | 16 + Master/perltl/lib/unicore/lib/Common.pl | 367 + Master/perltl/lib/unicore/lib/Compat.pl | 143 + Master/perltl/lib/unicore/lib/Cs.pl | 14 + Master/perltl/lib/unicore/lib/Cyrillic.pl | 18 + Master/perltl/lib/unicore/lib/DCcircle.pl | 17 + Master/perltl/lib/unicore/lib/DCcompat.pl | 81 + Master/perltl/lib/unicore/lib/DCfinal.pl | 125 + Master/perltl/lib/unicore/lib/DCfont.pl | 47 + Master/perltl/lib/unicore/lib/DCfracti.pl | 14 + Master/perltl/lib/unicore/lib/DCinitia.pl | 87 + Master/perltl/lib/unicore/lib/DCisolat.pl | 110 + Master/perltl/lib/unicore/lib/DCmedial.pl | 66 + Master/perltl/lib/unicore/lib/DCnarrow.pl | 18 + Master/perltl/lib/unicore/lib/DCnoBrea.pl | 17 + Master/perltl/lib/unicore/lib/DCsmall.pl | 15 + Master/perltl/lib/unicore/lib/DCsquare.pl | 15 + Master/perltl/lib/unicore/lib/DCsub.pl | 13 + Master/perltl/lib/unicore/lib/DCsuper.pl | 22 + Master/perltl/lib/unicore/lib/DCvertic.pl | 15 + Master/perltl/lib/unicore/lib/DCwide.pl | 15 + Master/perltl/lib/unicore/lib/Dash.pl | 26 + Master/perltl/lib/unicore/lib/Deprecat.pl | 14 + Master/perltl/lib/unicore/lib/Deseret.pl | 14 + Master/perltl/lib/unicore/lib/Devanaga.pl | 18 + Master/perltl/lib/unicore/lib/Diacriti.pl | 89 + Master/perltl/lib/unicore/lib/Digit.pl | 33 + Master/perltl/lib/unicore/lib/Ethiopic.pl | 38 + Master/perltl/lib/unicore/lib/Extender.pl | 23 + Master/perltl/lib/unicore/lib/Georgian.pl | 14 + Master/perltl/lib/unicore/lib/Gothic.pl | 13 + Master/perltl/lib/unicore/lib/Graph.pl | 398 + Master/perltl/lib/unicore/lib/Grapheme.pl | 25 + Master/perltl/lib/unicore/lib/Greek.pl | 40 + Master/perltl/lib/unicore/lib/Gujarati.pl | 26 + Master/perltl/lib/unicore/lib/Gurmukhi.pl | 27 + Master/perltl/lib/unicore/lib/Han.pl | 25 + Master/perltl/lib/unicore/lib/Hangul.pl | 22 + Master/perltl/lib/unicore/lib/Hanunoo.pl | 13 + Master/perltl/lib/unicore/lib/Hebrew.pl | 22 + Master/perltl/lib/unicore/lib/HexDigit.pl | 18 + Master/perltl/lib/unicore/lib/Hiragana.pl | 14 + Master/perltl/lib/unicore/lib/Hyphen.pl | 21 + Master/perltl/lib/unicore/lib/IdContin.pl | 416 + Master/perltl/lib/unicore/lib/IdStart.pl | 321 + Master/perltl/lib/unicore/lib/Ideograp.pl | 20 + Master/perltl/lib/unicore/lib/IdsBinar.pl | 14 + Master/perltl/lib/unicore/lib/IdsTrina.pl | 13 + Master/perltl/lib/unicore/lib/InAlphab.pl | 13 + Master/perltl/lib/unicore/lib/InArabi2.pl | 13 + Master/perltl/lib/unicore/lib/InArabi3.pl | 13 + Master/perltl/lib/unicore/lib/InArabic.pl | 13 + Master/perltl/lib/unicore/lib/InArmeni.pl | 13 + Master/perltl/lib/unicore/lib/InArrows.pl | 13 + Master/perltl/lib/unicore/lib/InBasicL.pl | 13 + Master/perltl/lib/unicore/lib/InBengal.pl | 13 + Master/perltl/lib/unicore/lib/InBlockE.pl | 13 + Master/perltl/lib/unicore/lib/InBopom2.pl | 13 + Master/perltl/lib/unicore/lib/InBopomo.pl | 13 + Master/perltl/lib/unicore/lib/InBoxDra.pl | 13 + Master/perltl/lib/unicore/lib/InBraill.pl | 13 + Master/perltl/lib/unicore/lib/InBuhid.pl | 13 + Master/perltl/lib/unicore/lib/InByzant.pl | 13 + Master/perltl/lib/unicore/lib/InCherok.pl | 13 + Master/perltl/lib/unicore/lib/InCjkCo2.pl | 13 + Master/perltl/lib/unicore/lib/InCjkCo3.pl | 13 + Master/perltl/lib/unicore/lib/InCjkCo4.pl | 13 + Master/perltl/lib/unicore/lib/InCjkCom.pl | 13 + Master/perltl/lib/unicore/lib/InCjkRad.pl | 13 + Master/perltl/lib/unicore/lib/InCjkSym.pl | 13 + Master/perltl/lib/unicore/lib/InCjkUn2.pl | 13 + Master/perltl/lib/unicore/lib/InCjkUn3.pl | 13 + Master/perltl/lib/unicore/lib/InCjkUni.pl | 13 + Master/perltl/lib/unicore/lib/InCombi2.pl | 13 + Master/perltl/lib/unicore/lib/InCombi3.pl | 13 + Master/perltl/lib/unicore/lib/InCombin.pl | 13 + Master/perltl/lib/unicore/lib/InContro.pl | 13 + Master/perltl/lib/unicore/lib/InCurren.pl | 13 + Master/perltl/lib/unicore/lib/InCyril2.pl | 13 + Master/perltl/lib/unicore/lib/InCyrill.pl | 13 + Master/perltl/lib/unicore/lib/InDesere.pl | 13 + Master/perltl/lib/unicore/lib/InDevana.pl | 13 + Master/perltl/lib/unicore/lib/InDingba.pl | 13 + Master/perltl/lib/unicore/lib/InEnclo2.pl | 13 + Master/perltl/lib/unicore/lib/InEnclos.pl | 13 + Master/perltl/lib/unicore/lib/InEthiop.pl | 13 + Master/perltl/lib/unicore/lib/InGenera.pl | 13 + Master/perltl/lib/unicore/lib/InGeomet.pl | 13 + Master/perltl/lib/unicore/lib/InGeorgi.pl | 13 + Master/perltl/lib/unicore/lib/InGothic.pl | 13 + Master/perltl/lib/unicore/lib/InGreek.pl | 13 + Master/perltl/lib/unicore/lib/InGreekA.pl | 13 + Master/perltl/lib/unicore/lib/InGreekE.pl | 13 + Master/perltl/lib/unicore/lib/InGujara.pl | 13 + Master/perltl/lib/unicore/lib/InGurmuk.pl | 13 + Master/perltl/lib/unicore/lib/InHalfwi.pl | 13 + Master/perltl/lib/unicore/lib/InHangu2.pl | 13 + Master/perltl/lib/unicore/lib/InHangu3.pl | 13 + Master/perltl/lib/unicore/lib/InHangul.pl | 13 + Master/perltl/lib/unicore/lib/InHanuno.pl | 13 + Master/perltl/lib/unicore/lib/InHebrew.pl | 13 + Master/perltl/lib/unicore/lib/InHighPr.pl | 13 + Master/perltl/lib/unicore/lib/InHighSu.pl | 13 + Master/perltl/lib/unicore/lib/InHiraga.pl | 13 + Master/perltl/lib/unicore/lib/InIdeogr.pl | 13 + Master/perltl/lib/unicore/lib/InIpaExt.pl | 13 + Master/perltl/lib/unicore/lib/InKanbun.pl | 13 + Master/perltl/lib/unicore/lib/InKangxi.pl | 13 + Master/perltl/lib/unicore/lib/InKannad.pl | 13 + Master/perltl/lib/unicore/lib/InKatak2.pl | 13 + Master/perltl/lib/unicore/lib/InKataka.pl | 13 + Master/perltl/lib/unicore/lib/InKhmer.pl | 13 + Master/perltl/lib/unicore/lib/InLao.pl | 13 + Master/perltl/lib/unicore/lib/InLatin1.pl | 13 + Master/perltl/lib/unicore/lib/InLatin2.pl | 13 + Master/perltl/lib/unicore/lib/InLatin3.pl | 13 + Master/perltl/lib/unicore/lib/InLatinE.pl | 13 + Master/perltl/lib/unicore/lib/InLetter.pl | 13 + Master/perltl/lib/unicore/lib/InLowSur.pl | 13 + Master/perltl/lib/unicore/lib/InMalaya.pl | 13 + Master/perltl/lib/unicore/lib/InMathe2.pl | 13 + Master/perltl/lib/unicore/lib/InMathem.pl | 13 + Master/perltl/lib/unicore/lib/InMisce2.pl | 13 + Master/perltl/lib/unicore/lib/InMisce3.pl | 13 + Master/perltl/lib/unicore/lib/InMisce4.pl | 13 + Master/perltl/lib/unicore/lib/InMiscel.pl | 13 + Master/perltl/lib/unicore/lib/InMongol.pl | 13 + Master/perltl/lib/unicore/lib/InMusica.pl | 13 + Master/perltl/lib/unicore/lib/InMyanma.pl | 13 + Master/perltl/lib/unicore/lib/InNumber.pl | 13 + Master/perltl/lib/unicore/lib/InOgham.pl | 13 + Master/perltl/lib/unicore/lib/InOldIta.pl | 13 + Master/perltl/lib/unicore/lib/InOptica.pl | 13 + Master/perltl/lib/unicore/lib/InOriya.pl | 13 + Master/perltl/lib/unicore/lib/InPrivat.pl | 13 + Master/perltl/lib/unicore/lib/InRunic.pl | 13 + Master/perltl/lib/unicore/lib/InSinhal.pl | 13 + Master/perltl/lib/unicore/lib/InSmallF.pl | 13 + Master/perltl/lib/unicore/lib/InSpacin.pl | 13 + Master/perltl/lib/unicore/lib/InSpecia.pl | 13 + Master/perltl/lib/unicore/lib/InSupers.pl | 13 + Master/perltl/lib/unicore/lib/InSuppl2.pl | 13 + Master/perltl/lib/unicore/lib/InSuppl3.pl | 13 + Master/perltl/lib/unicore/lib/InSuppl4.pl | 13 + Master/perltl/lib/unicore/lib/InSuppl5.pl | 13 + Master/perltl/lib/unicore/lib/InSupple.pl | 13 + Master/perltl/lib/unicore/lib/InSyriac.pl | 13 + Master/perltl/lib/unicore/lib/InTagalo.pl | 13 + Master/perltl/lib/unicore/lib/InTagban.pl | 13 + Master/perltl/lib/unicore/lib/InTags.pl | 13 + Master/perltl/lib/unicore/lib/InTamil.pl | 13 + Master/perltl/lib/unicore/lib/InTelugu.pl | 13 + Master/perltl/lib/unicore/lib/InThaana.pl | 13 + Master/perltl/lib/unicore/lib/InThai.pl | 13 + Master/perltl/lib/unicore/lib/InTibeta.pl | 13 + Master/perltl/lib/unicore/lib/InUnifie.pl | 13 + Master/perltl/lib/unicore/lib/InVariat.pl | 13 + Master/perltl/lib/unicore/lib/InYiRadi.pl | 13 + Master/perltl/lib/unicore/lib/InYiSyll.pl | 13 + Master/perltl/lib/unicore/lib/Inherite.pl | 37 + Master/perltl/lib/unicore/lib/JoinCont.pl | 13 + Master/perltl/lib/unicore/lib/Kannada.pl | 25 + Master/perltl/lib/unicore/lib/Katakana.pl | 17 + Master/perltl/lib/unicore/lib/Khmer.pl | 14 + Master/perltl/lib/unicore/lib/L.pl | 319 + Master/perltl/lib/unicore/lib/L_.pl | 112 + Master/perltl/lib/unicore/lib/Lao.pl | 30 + Master/perltl/lib/unicore/lib/Latin.pl | 31 + Master/perltl/lib/unicore/lib/Ll.pl | 433 + Master/perltl/lib/unicore/lib/Lm.pl | 33 + Master/perltl/lib/unicore/lib/Lo.pl | 217 + Master/perltl/lib/unicore/lib/LogicalO.pl | 14 + Master/perltl/lib/unicore/lib/Lower.pl | 432 + Master/perltl/lib/unicore/lib/Lowercas.pl | 439 + Master/perltl/lib/unicore/lib/Lt.pl | 23 + Master/perltl/lib/unicore/lib/Lu.pl | 432 + Master/perltl/lib/unicore/lib/M.pl | 125 + Master/perltl/lib/unicore/lib/Malayala.pl | 23 + Master/perltl/lib/unicore/lib/Math.pl | 101 + Master/perltl/lib/unicore/lib/Mc.pl | 65 + Master/perltl/lib/unicore/lib/Me.pl | 17 + Master/perltl/lib/unicore/lib/Mirrored.pl | 105 + Master/perltl/lib/unicore/lib/Mn.pl | 117 + Master/perltl/lib/unicore/lib/Mongolia.pl | 15 + Master/perltl/lib/unicore/lib/Myanmar.pl | 19 + Master/perltl/lib/unicore/lib/N.pl | 56 + Master/perltl/lib/unicore/lib/Nd.pl | 34 + Master/perltl/lib/unicore/lib/Nl.pl | 19 + Master/perltl/lib/unicore/lib/No.pl | 33 + Master/perltl/lib/unicore/lib/Nonchara.pl | 30 + Master/perltl/lib/unicore/lib/Ogham.pl | 13 + Master/perltl/lib/unicore/lib/OldItali.pl | 13 + Master/perltl/lib/unicore/lib/Oriya.pl | 26 + Master/perltl/lib/unicore/lib/OtherAlp.pl | 99 + Master/perltl/lib/unicore/lib/OtherDef.pl | 17 + Master/perltl/lib/unicore/lib/OtherGra.pl | 13 + Master/perltl/lib/unicore/lib/OtherLow.pl | 19 + Master/perltl/lib/unicore/lib/OtherMat.pl | 76 + Master/perltl/lib/unicore/lib/OtherUpp.pl | 14 + Master/perltl/lib/unicore/lib/P.pl | 97 + Master/perltl/lib/unicore/lib/Pc.pl | 20 + Master/perltl/lib/unicore/lib/Pd.pl | 25 + Master/perltl/lib/unicore/lib/Pe.pl | 75 + Master/perltl/lib/unicore/lib/Pf.pl | 17 + Master/perltl/lib/unicore/lib/Pi.pl | 18 + Master/perltl/lib/unicore/lib/Po.pl | 83 + Master/perltl/lib/unicore/lib/Print.pl | 400 + Master/perltl/lib/unicore/lib/Ps.pl | 77 + Master/perltl/lib/unicore/lib/Punct.pl | 96 + Master/perltl/lib/unicore/lib/Quotatio.pl | 24 + Master/perltl/lib/unicore/lib/Radical.pl | 15 + Master/perltl/lib/unicore/lib/Runic.pl | 14 + Master/perltl/lib/unicore/lib/S.pl | 159 + Master/perltl/lib/unicore/lib/Sc.pl | 24 + Master/perltl/lib/unicore/lib/Sinhala.pl | 23 + Master/perltl/lib/unicore/lib/Sk.pl | 35 + Master/perltl/lib/unicore/lib/Sm.pl | 71 + Master/perltl/lib/unicore/lib/So.pl | 117 + Master/perltl/lib/unicore/lib/SoftDott.pl | 19 + Master/perltl/lib/unicore/lib/Space.pl | 21 + Master/perltl/lib/unicore/lib/SpacePer.pl | 23 + Master/perltl/lib/unicore/lib/Syriac.pl | 14 + Master/perltl/lib/unicore/lib/Tagalog.pl | 14 + Master/perltl/lib/unicore/lib/Tagbanwa.pl | 15 + Master/perltl/lib/unicore/lib/Tamil.pl | 28 + Master/perltl/lib/unicore/lib/Telugu.pl | 24 + Master/perltl/lib/unicore/lib/Terminal.pl | 48 + Master/perltl/lib/unicore/lib/Thaana.pl | 13 + Master/perltl/lib/unicore/lib/Thai.pl | 15 + Master/perltl/lib/unicore/lib/Tibetan.pl | 25 + Master/perltl/lib/unicore/lib/Title.pl | 22 + Master/perltl/lib/unicore/lib/UnifiedI.pl | 22 + Master/perltl/lib/unicore/lib/Upper.pl | 431 + Master/perltl/lib/unicore/lib/Uppercas.pl | 433 + Master/perltl/lib/unicore/lib/WhiteSpa.pl | 21 + Master/perltl/lib/unicore/lib/Word.pl | 424 + Master/perltl/lib/unicore/lib/XDigit.pl | 15 + Master/perltl/lib/unicore/lib/Yi.pl | 18 + Master/perltl/lib/unicore/lib/Z.pl | 21 + Master/perltl/lib/unicore/lib/Zl.pl | 14 + Master/perltl/lib/unicore/lib/Zp.pl | 14 + Master/perltl/lib/unicore/lib/Zs.pl | 20 + Master/perltl/lib/unicore/lib/_CanonDC.pl | 16 + Master/perltl/lib/unicore/lib/_CaseIgn.pl | 118 + Master/perltl/lib/unicore/lib/_CombAbo.pl | 54 + Master/perltl/lib/utf8.pm | 152 + Master/perltl/lib/utf8_heavy.pl | 344 + Master/perltl/lib/vars.pm | 82 + Master/perltl/lib/warnings.pm | 489 + Master/perltl/lib/warnings/register.pm | 51 + Master/perltl/site/lib/Tk.pm | 696 + Master/perltl/site/lib/Tk/Adjuster.pm | 435 + Master/perltl/site/lib/Tk/After.pm | 88 + Master/perltl/site/lib/Tk/Bitmap.pm | 18 + Master/perltl/site/lib/Tk/Button.pm | 148 + Master/perltl/site/lib/Tk/Camel.xpm | 41 + Master/perltl/site/lib/Tk/Canvas.pm | 60 + Master/perltl/site/lib/Tk/Checkbutton.pm | 42 + Master/perltl/site/lib/Tk/Clipboard.pm | 110 + Master/perltl/site/lib/Tk/CmdLine.pm | 954 ++ Master/perltl/site/lib/Tk/ColorEdit.xpm | 58 + Master/perltl/site/lib/Tk/ColorEditor.pm | 759 + Master/perltl/site/lib/Tk/Config.pm | 12 + Master/perltl/site/lib/Tk/Configure.pm | 69 + Master/perltl/site/lib/Tk/Derived.pm | 510 + Master/perltl/site/lib/Tk/Dialog.pm | 70 + Master/perltl/site/lib/Tk/DialogBox.pm | 115 + Master/perltl/site/lib/Tk/Entry.pm | 517 + Master/perltl/site/lib/Tk/Event.pm | 13 + Master/perltl/site/lib/Tk/Event/IO.pm | 122 + Master/perltl/site/lib/Tk/FBox.pm | 891 ++ Master/perltl/site/lib/Tk/Frame.pm | 373 + Master/perltl/site/lib/Tk/IconList.pm | 536 + Master/perltl/site/lib/Tk/Image.pm | 73 + Master/perltl/site/lib/Tk/Label.pm | 21 + Master/perltl/site/lib/Tk/Listbox.pm | 856 ++ Master/perltl/site/lib/Tk/MainWindow.pm | 188 + Master/perltl/site/lib/Tk/Menu.pm | 1130 ++ Master/perltl/site/lib/Tk/Menu/Item.pm | 180 + Master/perltl/site/lib/Tk/Menubutton.pm | 398 + Master/perltl/site/lib/Tk/Optionmenu.pm | 110 + Master/perltl/site/lib/Tk/Pixmap.pm | 19 + Master/perltl/site/lib/Tk/Pretty.pm | 93 + Master/perltl/site/lib/Tk/ROText.pm | 36 + Master/perltl/site/lib/Tk/Radiobutton.pm | 45 + Master/perltl/site/lib/Tk/Scale.pm | 278 + Master/perltl/site/lib/Tk/Scrollbar.pm | 414 + Master/perltl/site/lib/Tk/Submethods.pm | 46 + Master/perltl/site/lib/Tk/Text.pm | 1600 +++ Master/perltl/site/lib/Tk/Text/Tag.pm | 46 + Master/perltl/site/lib/Tk/Tk.xbm | 44 + Master/perltl/site/lib/Tk/Tk.xpm | 41 + Master/perltl/site/lib/Tk/Toplevel.pm | 211 + Master/perltl/site/lib/Tk/Widget.pm | 1298 ++ Master/perltl/site/lib/Tk/Wm.pm | 165 + Master/perltl/site/lib/Tk/X.pm | 398 + Master/perltl/site/lib/Tk/X11/license.terms | 32 + Master/perltl/site/lib/Tk/Xcamel.gif | Bin 0 -> 4193 bytes Master/perltl/site/lib/Tk/act_folder.xbm | 5 + Master/perltl/site/lib/Tk/act_folder.xpm | 22 + Master/perltl/site/lib/Tk/anim.gif | Bin 0 -> 2533 bytes Master/perltl/site/lib/Tk/balArrow.xbm | 4 + Master/perltl/site/lib/Tk/cbxarrow.xbm | 6 + Master/perltl/site/lib/Tk/file.xbm | 5 + Master/perltl/site/lib/Tk/file.xpm | 18 + Master/perltl/site/lib/Tk/folder.xbm | 5 + Master/perltl/site/lib/Tk/folder.xpm | 21 + Master/perltl/site/lib/Tk/icon.gif | Bin 0 -> 1924 bytes Master/perltl/site/lib/Tk/license.terms | 35 + Master/perltl/site/lib/Tk/openfile.xbm | 5 + Master/perltl/site/lib/Tk/openfolder.xbm | 5 + Master/perltl/site/lib/Tk/openfolder.xpm | 21 + Master/perltl/site/lib/Tk/prolog.ps | 284 + Master/perltl/site/lib/Tk/srcfile.xpm | 18 + Master/perltl/site/lib/Tk/textfile.xpm | 18 + Master/perltl/site/lib/Tk/tranicon.gif | Bin 0 -> 1718 bytes Master/perltl/site/lib/Tk/widgets.pm | 21 + Master/perltl/site/lib/Tk/win.xbm | 6 + Master/perltl/site/lib/Tk/winfolder.xpm | 39 + Master/perltl/site/lib/Tk/wintext.xpm | 42 + Master/perltl/site/lib/Win32/API.pm | 719 + Master/perltl/site/lib/Win32/API/Struct.pm | 528 + Master/perltl/site/lib/Win32/API/Type.pm | 440 + Master/perltl/site/lib/XML/Parser.pm | 1089 ++ Master/perltl/site/lib/XML/Parser/Expat.pm | 1231 ++ Master/perltl/site/lib/auto/Tk/Bitmap/Bitmap.dll | Bin 0 -> 6144 bytes Master/perltl/site/lib/auto/Tk/CancelRepeat.al | 15 + Master/perltl/site/lib/auto/Tk/Canvas/Canvas.dll | Bin 0 -> 139264 bytes .../perltl/site/lib/auto/Tk/Clipboard/autosplit.ix | 6 + .../site/lib/auto/Tk/Clipboard/getSelected.al | 15 + Master/perltl/site/lib/auto/Tk/EnterFocus.al | 26 + Master/perltl/site/lib/auto/Tk/Entry/Entry.dll | Bin 0 -> 23040 bytes Master/perltl/site/lib/auto/Tk/Error.al | 20 + Master/perltl/site/lib/auto/Tk/Event/Event.dll | Bin 0 -> 53248 bytes Master/perltl/site/lib/auto/Tk/FirstMenu.al | 21 + Master/perltl/site/lib/auto/Tk/FocusChildren.al | 35 + Master/perltl/site/lib/auto/Tk/FocusOK.al | 33 + .../perltl/site/lib/auto/Tk/Frame/AddScrollbars.al | 52 + Master/perltl/site/lib/auto/Tk/Frame/FindMenu.al | 22 + Master/perltl/site/lib/auto/Tk/Frame/autosplit.ix | 24 + .../perltl/site/lib/auto/Tk/Frame/freeze_on_map.al | 18 + Master/perltl/site/lib/auto/Tk/Frame/label.al | 24 + Master/perltl/site/lib/auto/Tk/Frame/labelPack.al | 50 + .../perltl/site/lib/auto/Tk/Frame/labelVariable.al | 27 + .../site/lib/auto/Tk/Frame/packscrollbars.al | 86 + Master/perltl/site/lib/auto/Tk/Frame/queuePack.al | 18 + Master/perltl/site/lib/auto/Tk/Frame/sbset.al | 15 + Master/perltl/site/lib/auto/Tk/Frame/scrollbars.al | 24 + Master/perltl/site/lib/auto/Tk/ImageNames.al | 13 + Master/perltl/site/lib/auto/Tk/ImageTypes.al | 13 + Master/perltl/site/lib/auto/Tk/Listbox/AutoScan.al | 48 + .../perltl/site/lib/auto/Tk/Listbox/BeginExtend.al | 29 + .../perltl/site/lib/auto/Tk/Listbox/BeginSelect.al | 45 + .../perltl/site/lib/auto/Tk/Listbox/BeginToggle.al | 39 + .../site/lib/auto/Tk/Listbox/ButtonRelease_1.al | 16 + Master/perltl/site/lib/auto/Tk/Listbox/Cancel.al | 43 + .../perltl/site/lib/auto/Tk/Listbox/Cntrl_End.al | 18 + .../perltl/site/lib/auto/Tk/Listbox/Cntrl_Home.al | 18 + .../site/lib/auto/Tk/Listbox/Cntrl_backslash.al | 18 + .../perltl/site/lib/auto/Tk/Listbox/DataExtend.al | 39 + .../site/lib/auto/Tk/Listbox/ExtendUpDown.al | 30 + Master/perltl/site/lib/auto/Tk/Listbox/Listbox.dll | Bin 0 -> 20992 bytes Master/perltl/site/lib/auto/Tk/Listbox/Motion.al | 66 + .../perltl/site/lib/auto/Tk/Listbox/SelectAll.al | 31 + Master/perltl/site/lib/auto/Tk/Listbox/SetList.al | 15 + Master/perltl/site/lib/auto/Tk/Listbox/UpDown.al | 39 + .../perltl/site/lib/auto/Tk/Listbox/autosplit.ix | 42 + .../site/lib/auto/Tk/Listbox/clipboardPaste.al | 21 + .../site/lib/auto/Tk/Listbox/deleteSelected.al | 18 + .../perltl/site/lib/auto/Tk/Listbox/getSelected.al | 22 + Master/perltl/site/lib/auto/Tk/Listbox/xyIndex.al | 27 + .../site/lib/auto/Tk/Menubutton/Menubutton.dll | Bin 0 -> 14848 bytes Master/perltl/site/lib/auto/Tk/Pixmap/Pixmap.dll | Bin 0 -> 19968 bytes Master/perltl/site/lib/auto/Tk/Receive.al | 23 + Master/perltl/site/lib/auto/Tk/RepeatId.al | 16 + Master/perltl/site/lib/auto/Tk/Scale/Activate.al | 33 + Master/perltl/site/lib/auto/Tk/Scale/ButtonDown.al | 40 + Master/perltl/site/lib/auto/Tk/Scale/ButtonUp.al | 16 + .../perltl/site/lib/auto/Tk/Scale/ControlPress.al | 31 + Master/perltl/site/lib/auto/Tk/Scale/Drag.al | 29 + Master/perltl/site/lib/auto/Tk/Scale/EndDrag.al | 23 + Master/perltl/site/lib/auto/Tk/Scale/Enter.al | 19 + Master/perltl/site/lib/auto/Tk/Scale/Increment.al | 61 + Master/perltl/site/lib/auto/Tk/Scale/Leave.al | 15 + Master/perltl/site/lib/auto/Tk/Scale/Scale.dll | Bin 0 -> 20992 bytes Master/perltl/site/lib/auto/Tk/Scale/autosplit.ix | 22 + .../site/lib/auto/Tk/Scrollbar/ButtonDown.al | 55 + .../perltl/site/lib/auto/Tk/Scrollbar/ButtonUp.al | 26 + Master/perltl/site/lib/auto/Tk/Scrollbar/Drag.al | 44 + .../perltl/site/lib/auto/Tk/Scrollbar/EndDrag.al | 29 + Master/perltl/site/lib/auto/Tk/Scrollbar/Enter.al | 21 + Master/perltl/site/lib/auto/Tk/Scrollbar/Leave.al | 18 + Master/perltl/site/lib/auto/Tk/Scrollbar/Motion.al | 15 + .../site/lib/auto/Tk/Scrollbar/ScrlByPages.al | 38 + .../site/lib/auto/Tk/Scrollbar/ScrlByUnits.al | 37 + .../perltl/site/lib/auto/Tk/Scrollbar/ScrlToPos.al | 35 + .../site/lib/auto/Tk/Scrollbar/ScrlTopBottom.al | 32 + .../site/lib/auto/Tk/Scrollbar/Scrollbar.dll | Bin 0 -> 15872 bytes Master/perltl/site/lib/auto/Tk/Scrollbar/Select.al | 59 + .../perltl/site/lib/auto/Tk/Scrollbar/StartDrag.al | 33 + .../perltl/site/lib/auto/Tk/Scrollbar/autosplit.ix | 30 + Master/perltl/site/lib/auto/Tk/Selection.al | 18 + Master/perltl/site/lib/auto/Tk/Text/Text.dll | Bin 0 -> 94208 bytes Master/perltl/site/lib/auto/Tk/Text/autosplit.ix | 3 + Master/perltl/site/lib/auto/Tk/Tk.dll | Bin 0 -> 573440 bytes .../perltl/site/lib/auto/Tk/Toplevel/FG_BindIn.al | 19 + .../perltl/site/lib/auto/Tk/Toplevel/FG_BindOut.al | 20 + .../perltl/site/lib/auto/Tk/Toplevel/FG_Create.al | 56 + .../perltl/site/lib/auto/Tk/Toplevel/FG_Destroy.al | 29 + Master/perltl/site/lib/auto/Tk/Toplevel/FG_In.al | 24 + Master/perltl/site/lib/auto/Tk/Toplevel/FG_Out.al | 32 + .../perltl/site/lib/auto/Tk/Toplevel/autosplit.ix | 10 + Master/perltl/site/lib/auto/Tk/TraverseToMenu.al | 27 + Master/perltl/site/lib/auto/Tk/Widget/ASkludge.al | 30 + Master/perltl/site/lib/auto/Tk/Widget/autosplit.ix | 10 + .../site/lib/auto/Tk/Widget/clipboardKeysyms.al | 51 + Master/perltl/site/lib/auto/Tk/Widget/pathname.al | 15 + Master/perltl/site/lib/auto/Tk/Wm/AnchorAdjust.al | 17 + Master/perltl/site/lib/auto/Tk/Wm/FullScreen.al | 29 + Master/perltl/site/lib/auto/Tk/Wm/Popup.al | 45 + Master/perltl/site/lib/auto/Tk/Wm/Post.al | 20 + Master/perltl/site/lib/auto/Tk/Wm/autosplit.ix | 14 + Master/perltl/site/lib/auto/Tk/Wm/iconposition.al | 24 + Master/perltl/site/lib/auto/Tk/X/X.dll | Bin 0 -> 19968 bytes Master/perltl/site/lib/auto/Tk/X/autosplit.ix | 3 + Master/perltl/site/lib/auto/Tk/autosplit.ix | 43 + Master/perltl/site/lib/auto/Tk/break.al | 13 + .../perltl/site/lib/auto/Tk/focusFollowsMouse.al | 14 + Master/perltl/site/lib/auto/Tk/focusNext.al | 45 + Master/perltl/site/lib/auto/Tk/focusPrev.al | 65 + Master/perltl/site/lib/auto/Tk/interps.al | 14 + Master/perltl/site/lib/auto/Tk/lsearch.al | 19 + Master/perltl/site/lib/auto/Tk/tabFocus.al | 13 + Master/perltl/site/lib/auto/Tk/updateWidgets.al | 17 + Master/perltl/site/lib/auto/Win32/API/API.dll | Bin 0 -> 20480 bytes .../site/lib/auto/XML/Parser/Expat/Expat.dll | Bin 0 -> 163840 bytes 723 files changed, 104727 insertions(+) create mode 100644 Master/perltl/lib/AnyDBM_File.pm create mode 100644 Master/perltl/lib/AutoLoader.pm create mode 100644 Master/perltl/lib/B.pm create mode 100644 Master/perltl/lib/B/Deparse.pm create mode 100644 Master/perltl/lib/Carp.pm create mode 100644 Master/perltl/lib/Carp/Heavy.pm create mode 100644 Master/perltl/lib/Class/Struct.pm create mode 100644 Master/perltl/lib/Config.pm create mode 100644 Master/perltl/lib/Cwd.pm create mode 100644 Master/perltl/lib/Data/Dumper.pm create mode 100644 Master/perltl/lib/Digest/MD5.pm create mode 100644 Master/perltl/lib/DynaLoader.pm create mode 100644 Master/perltl/lib/Errno.pm create mode 100644 Master/perltl/lib/Exporter.pm create mode 100644 Master/perltl/lib/Exporter/Heavy.pm create mode 100644 Master/perltl/lib/Fcntl.pm create mode 100644 Master/perltl/lib/File/Basename.pm create mode 100644 Master/perltl/lib/File/Compare.pm create mode 100644 Master/perltl/lib/File/Copy.pm create mode 100644 Master/perltl/lib/File/Find.pm create mode 100644 Master/perltl/lib/File/Glob.pm create mode 100644 Master/perltl/lib/File/Path.pm create mode 100644 Master/perltl/lib/File/Spec.pm create mode 100644 Master/perltl/lib/File/Spec/Unix.pm create mode 100644 Master/perltl/lib/File/Spec/Win32.pm create mode 100644 Master/perltl/lib/File/Temp.pm create mode 100644 Master/perltl/lib/FindBin.pm create mode 100644 Master/perltl/lib/Getopt/Long.pm create mode 100644 Master/perltl/lib/IO.pm create mode 100644 Master/perltl/lib/IO/File.pm create mode 100644 Master/perltl/lib/IO/Handle.pm create mode 100644 Master/perltl/lib/IO/Seekable.pm create mode 100644 Master/perltl/lib/List/Util.pm create mode 100644 Master/perltl/lib/POSIX.pm create mode 100644 Master/perltl/lib/SDBM_File.pm create mode 100644 Master/perltl/lib/Scalar/Util.pm create mode 100644 Master/perltl/lib/SelectSaver.pm create mode 100644 Master/perltl/lib/Symbol.pm create mode 100644 Master/perltl/lib/Term/Cap.pm create mode 100644 Master/perltl/lib/Text/ParseWords.pm create mode 100644 Master/perltl/lib/Text/Tabs.pm create mode 100644 Master/perltl/lib/Text/Wrap.pm create mode 100644 Master/perltl/lib/Tie/Hash.pm create mode 100644 Master/perltl/lib/Tie/Scalar.pm create mode 100644 Master/perltl/lib/Time/HiRes.pm create mode 100644 Master/perltl/lib/Time/Local.pm create mode 100644 Master/perltl/lib/UNIVERSAL.pm create mode 100644 Master/perltl/lib/XSLoader.pm create mode 100644 Master/perltl/lib/attributes.pm create mode 100644 Master/perltl/lib/auto/B/B.dll create mode 100644 Master/perltl/lib/auto/Cwd/Cwd.dll create mode 100644 Master/perltl/lib/auto/Data/Dumper/Dumper.dll create mode 100644 Master/perltl/lib/auto/Digest/MD5/MD5.dll create mode 100644 Master/perltl/lib/auto/DynaLoader/autosplit.ix create mode 100644 Master/perltl/lib/auto/DynaLoader/dl_expandspec.al create mode 100644 Master/perltl/lib/auto/DynaLoader/dl_find_symbol_anywhere.al create mode 100644 Master/perltl/lib/auto/DynaLoader/dl_findfile.al create mode 100644 Master/perltl/lib/auto/Fcntl/Fcntl.dll create mode 100644 Master/perltl/lib/auto/File/Glob/Glob.dll create mode 100644 Master/perltl/lib/auto/IO/IO.dll create mode 100644 Master/perltl/lib/auto/List/Util/Util.dll create mode 100644 Master/perltl/lib/auto/POSIX/POSIX.dll create mode 100644 Master/perltl/lib/auto/POSIX/abs.al create mode 100644 Master/perltl/lib/auto/POSIX/alarm.al create mode 100644 Master/perltl/lib/auto/POSIX/assert.al create mode 100644 Master/perltl/lib/auto/POSIX/atan2.al create mode 100644 Master/perltl/lib/auto/POSIX/atexit.al create mode 100644 Master/perltl/lib/auto/POSIX/atof.al create mode 100644 Master/perltl/lib/auto/POSIX/atoi.al create mode 100644 Master/perltl/lib/auto/POSIX/atol.al create mode 100644 Master/perltl/lib/auto/POSIX/autosplit.ix create mode 100644 Master/perltl/lib/auto/POSIX/bsearch.al create mode 100644 Master/perltl/lib/auto/POSIX/calloc.al create mode 100644 Master/perltl/lib/auto/POSIX/chdir.al create mode 100644 Master/perltl/lib/auto/POSIX/chmod.al create mode 100644 Master/perltl/lib/auto/POSIX/chown.al create mode 100644 Master/perltl/lib/auto/POSIX/clearerr.al create mode 100644 Master/perltl/lib/auto/POSIX/closedir.al create mode 100644 Master/perltl/lib/auto/POSIX/cos.al create mode 100644 Master/perltl/lib/auto/POSIX/creat.al create mode 100644 Master/perltl/lib/auto/POSIX/div.al create mode 100644 Master/perltl/lib/auto/POSIX/errno.al create mode 100644 Master/perltl/lib/auto/POSIX/execl.al create mode 100644 Master/perltl/lib/auto/POSIX/execle.al create mode 100644 Master/perltl/lib/auto/POSIX/execlp.al create mode 100644 Master/perltl/lib/auto/POSIX/execv.al create mode 100644 Master/perltl/lib/auto/POSIX/execve.al create mode 100644 Master/perltl/lib/auto/POSIX/execvp.al create mode 100644 Master/perltl/lib/auto/POSIX/exit.al create mode 100644 Master/perltl/lib/auto/POSIX/exp.al create mode 100644 Master/perltl/lib/auto/POSIX/fabs.al create mode 100644 Master/perltl/lib/auto/POSIX/fclose.al create mode 100644 Master/perltl/lib/auto/POSIX/fcntl.al create mode 100644 Master/perltl/lib/auto/POSIX/fdopen.al create mode 100644 Master/perltl/lib/auto/POSIX/feof.al create mode 100644 Master/perltl/lib/auto/POSIX/ferror.al create mode 100644 Master/perltl/lib/auto/POSIX/fflush.al create mode 100644 Master/perltl/lib/auto/POSIX/fgetc.al create mode 100644 Master/perltl/lib/auto/POSIX/fgetpos.al create mode 100644 Master/perltl/lib/auto/POSIX/fgets.al create mode 100644 Master/perltl/lib/auto/POSIX/fileno.al create mode 100644 Master/perltl/lib/auto/POSIX/fopen.al create mode 100644 Master/perltl/lib/auto/POSIX/fork.al create mode 100644 Master/perltl/lib/auto/POSIX/fprintf.al create mode 100644 Master/perltl/lib/auto/POSIX/fputc.al create mode 100644 Master/perltl/lib/auto/POSIX/fputs.al create mode 100644 Master/perltl/lib/auto/POSIX/fread.al create mode 100644 Master/perltl/lib/auto/POSIX/free.al create mode 100644 Master/perltl/lib/auto/POSIX/freopen.al create mode 100644 Master/perltl/lib/auto/POSIX/fscanf.al create mode 100644 Master/perltl/lib/auto/POSIX/fseek.al create mode 100644 Master/perltl/lib/auto/POSIX/fsetpos.al create mode 100644 Master/perltl/lib/auto/POSIX/fstat.al create mode 100644 Master/perltl/lib/auto/POSIX/ftell.al create mode 100644 Master/perltl/lib/auto/POSIX/fwrite.al create mode 100644 Master/perltl/lib/auto/POSIX/getc.al create mode 100644 Master/perltl/lib/auto/POSIX/getchar.al create mode 100644 Master/perltl/lib/auto/POSIX/getegid.al create mode 100644 Master/perltl/lib/auto/POSIX/getenv.al create mode 100644 Master/perltl/lib/auto/POSIX/geteuid.al create mode 100644 Master/perltl/lib/auto/POSIX/getgid.al create mode 100644 Master/perltl/lib/auto/POSIX/getgrgid.al create mode 100644 Master/perltl/lib/auto/POSIX/getgrnam.al create mode 100644 Master/perltl/lib/auto/POSIX/getgroups.al create mode 100644 Master/perltl/lib/auto/POSIX/getlogin.al create mode 100644 Master/perltl/lib/auto/POSIX/getpgrp.al create mode 100644 Master/perltl/lib/auto/POSIX/getpid.al create mode 100644 Master/perltl/lib/auto/POSIX/getppid.al create mode 100644 Master/perltl/lib/auto/POSIX/getpwnam.al create mode 100644 Master/perltl/lib/auto/POSIX/getpwuid.al create mode 100644 Master/perltl/lib/auto/POSIX/gets.al create mode 100644 Master/perltl/lib/auto/POSIX/getuid.al create mode 100644 Master/perltl/lib/auto/POSIX/gmtime.al create mode 100644 Master/perltl/lib/auto/POSIX/isatty.al create mode 100644 Master/perltl/lib/auto/POSIX/kill.al create mode 100644 Master/perltl/lib/auto/POSIX/labs.al create mode 100644 Master/perltl/lib/auto/POSIX/ldiv.al create mode 100644 Master/perltl/lib/auto/POSIX/link.al create mode 100644 Master/perltl/lib/auto/POSIX/load_imports.al create mode 100644 Master/perltl/lib/auto/POSIX/localtime.al create mode 100644 Master/perltl/lib/auto/POSIX/log.al create mode 100644 Master/perltl/lib/auto/POSIX/longjmp.al create mode 100644 Master/perltl/lib/auto/POSIX/malloc.al create mode 100644 Master/perltl/lib/auto/POSIX/memchr.al create mode 100644 Master/perltl/lib/auto/POSIX/memcmp.al create mode 100644 Master/perltl/lib/auto/POSIX/memcpy.al create mode 100644 Master/perltl/lib/auto/POSIX/memmove.al create mode 100644 Master/perltl/lib/auto/POSIX/memset.al create mode 100644 Master/perltl/lib/auto/POSIX/mkdir.al create mode 100644 Master/perltl/lib/auto/POSIX/offsetof.al create mode 100644 Master/perltl/lib/auto/POSIX/opendir.al create mode 100644 Master/perltl/lib/auto/POSIX/perror.al create mode 100644 Master/perltl/lib/auto/POSIX/pow.al create mode 100644 Master/perltl/lib/auto/POSIX/printf.al create mode 100644 Master/perltl/lib/auto/POSIX/putc.al create mode 100644 Master/perltl/lib/auto/POSIX/putchar.al create mode 100644 Master/perltl/lib/auto/POSIX/puts.al create mode 100644 Master/perltl/lib/auto/POSIX/qsort.al create mode 100644 Master/perltl/lib/auto/POSIX/raise.al create mode 100644 Master/perltl/lib/auto/POSIX/rand.al create mode 100644 Master/perltl/lib/auto/POSIX/readdir.al create mode 100644 Master/perltl/lib/auto/POSIX/realloc.al create mode 100644 Master/perltl/lib/auto/POSIX/redef.al create mode 100644 Master/perltl/lib/auto/POSIX/remove.al create mode 100644 Master/perltl/lib/auto/POSIX/rename.al create mode 100644 Master/perltl/lib/auto/POSIX/rewind.al create mode 100644 Master/perltl/lib/auto/POSIX/rewinddir.al create mode 100644 Master/perltl/lib/auto/POSIX/rmdir.al create mode 100644 Master/perltl/lib/auto/POSIX/scanf.al create mode 100644 Master/perltl/lib/auto/POSIX/setbuf.al create mode 100644 Master/perltl/lib/auto/POSIX/setjmp.al create mode 100644 Master/perltl/lib/auto/POSIX/setvbuf.al create mode 100644 Master/perltl/lib/auto/POSIX/siglongjmp.al create mode 100644 Master/perltl/lib/auto/POSIX/sigsetjmp.al create mode 100644 Master/perltl/lib/auto/POSIX/sin.al create mode 100644 Master/perltl/lib/auto/POSIX/sleep.al create mode 100644 Master/perltl/lib/auto/POSIX/sprintf.al create mode 100644 Master/perltl/lib/auto/POSIX/sqrt.al create mode 100644 Master/perltl/lib/auto/POSIX/srand.al create mode 100644 Master/perltl/lib/auto/POSIX/sscanf.al create mode 100644 Master/perltl/lib/auto/POSIX/stat.al create mode 100644 Master/perltl/lib/auto/POSIX/strcat.al create mode 100644 Master/perltl/lib/auto/POSIX/strchr.al create mode 100644 Master/perltl/lib/auto/POSIX/strcmp.al create mode 100644 Master/perltl/lib/auto/POSIX/strcpy.al create mode 100644 Master/perltl/lib/auto/POSIX/strcspn.al create mode 100644 Master/perltl/lib/auto/POSIX/strerror.al create mode 100644 Master/perltl/lib/auto/POSIX/strlen.al create mode 100644 Master/perltl/lib/auto/POSIX/strncat.al create mode 100644 Master/perltl/lib/auto/POSIX/strncmp.al create mode 100644 Master/perltl/lib/auto/POSIX/strncpy.al create mode 100644 Master/perltl/lib/auto/POSIX/strpbrk.al create mode 100644 Master/perltl/lib/auto/POSIX/strrchr.al create mode 100644 Master/perltl/lib/auto/POSIX/strspn.al create mode 100644 Master/perltl/lib/auto/POSIX/strstr.al create mode 100644 Master/perltl/lib/auto/POSIX/strtok.al create mode 100644 Master/perltl/lib/auto/POSIX/system.al create mode 100644 Master/perltl/lib/auto/POSIX/time.al create mode 100644 Master/perltl/lib/auto/POSIX/tmpfile.al create mode 100644 Master/perltl/lib/auto/POSIX/tolower.al create mode 100644 Master/perltl/lib/auto/POSIX/toupper.al create mode 100644 Master/perltl/lib/auto/POSIX/umask.al create mode 100644 Master/perltl/lib/auto/POSIX/ungetc.al create mode 100644 Master/perltl/lib/auto/POSIX/unimpl.al create mode 100644 Master/perltl/lib/auto/POSIX/unlink.al create mode 100644 Master/perltl/lib/auto/POSIX/usage.al create mode 100644 Master/perltl/lib/auto/POSIX/utime.al create mode 100644 Master/perltl/lib/auto/POSIX/vfprintf.al create mode 100644 Master/perltl/lib/auto/POSIX/vprintf.al create mode 100644 Master/perltl/lib/auto/POSIX/vsprintf.al create mode 100644 Master/perltl/lib/auto/POSIX/wait.al create mode 100644 Master/perltl/lib/auto/POSIX/waitpid.al create mode 100644 Master/perltl/lib/auto/SDBM_File/SDBM_File.dll create mode 100644 Master/perltl/lib/auto/Time/HiRes/HiRes.dll create mode 100644 Master/perltl/lib/auto/re/re.dll create mode 100644 Master/perltl/lib/base.pm create mode 100644 Master/perltl/lib/bytes.pm create mode 100644 Master/perltl/lib/bytes_heavy.pl create mode 100644 Master/perltl/lib/constant.pm create mode 100644 Master/perltl/lib/fields.pm create mode 100644 Master/perltl/lib/integer.pm create mode 100644 Master/perltl/lib/lib.pm create mode 100644 Master/perltl/lib/newgetopt.pl create mode 100644 Master/perltl/lib/overload.pm create mode 100644 Master/perltl/lib/re.pm create mode 100644 Master/perltl/lib/strict.pm create mode 100644 Master/perltl/lib/subs.pm create mode 100644 Master/perltl/lib/unicore/ArabLink.pl create mode 100644 Master/perltl/lib/unicore/ArabLnkGrp.pl create mode 100644 Master/perltl/lib/unicore/Bidirectional.pl create mode 100644 Master/perltl/lib/unicore/Blocks.pl create mode 100644 Master/perltl/lib/unicore/Canonical.pl create mode 100644 Master/perltl/lib/unicore/Category.pl create mode 100644 Master/perltl/lib/unicore/CombiningClass.pl create mode 100644 Master/perltl/lib/unicore/Decomposition.pl create mode 100644 Master/perltl/lib/unicore/Exact.pl create mode 100644 Master/perltl/lib/unicore/JamoShort.pl create mode 100644 Master/perltl/lib/unicore/Lbrk.pl create mode 100644 Master/perltl/lib/unicore/Name.pl create mode 100644 Master/perltl/lib/unicore/Number.pl create mode 100644 Master/perltl/lib/unicore/Scripts.pl create mode 100644 Master/perltl/lib/unicore/To/Digit.pl create mode 100644 Master/perltl/lib/unicore/To/Fold.pl create mode 100644 Master/perltl/lib/unicore/To/Lower.pl create mode 100644 Master/perltl/lib/unicore/To/Title.pl create mode 100644 Master/perltl/lib/unicore/To/Upper.pl create mode 100644 Master/perltl/lib/unicore/lib/ASCII.pl create mode 100644 Master/perltl/lib/unicore/lib/Alnum.pl create mode 100644 Master/perltl/lib/unicore/lib/Alpha.pl create mode 100644 Master/perltl/lib/unicore/lib/Alphabet.pl create mode 100644 Master/perltl/lib/unicore/lib/Any.pl create mode 100644 Master/perltl/lib/unicore/lib/Arabic.pl create mode 100644 Master/perltl/lib/unicore/lib/Armenian.pl create mode 100644 Master/perltl/lib/unicore/lib/AsciiHex.pl create mode 100644 Master/perltl/lib/unicore/lib/Assigned.pl create mode 100644 Master/perltl/lib/unicore/lib/Bengali.pl create mode 100644 Master/perltl/lib/unicore/lib/BidiAL.pl create mode 100644 Master/perltl/lib/unicore/lib/BidiAN.pl create mode 100644 Master/perltl/lib/unicore/lib/BidiB.pl create mode 100644 Master/perltl/lib/unicore/lib/BidiBN.pl create mode 100644 Master/perltl/lib/unicore/lib/BidiCS.pl create mode 100644 Master/perltl/lib/unicore/lib/BidiCont.pl create mode 100644 Master/perltl/lib/unicore/lib/BidiEN.pl create mode 100644 Master/perltl/lib/unicore/lib/BidiES.pl create mode 100644 Master/perltl/lib/unicore/lib/BidiET.pl create mode 100644 Master/perltl/lib/unicore/lib/BidiL.pl create mode 100644 Master/perltl/lib/unicore/lib/BidiLRE.pl create mode 100644 Master/perltl/lib/unicore/lib/BidiLRO.pl create mode 100644 Master/perltl/lib/unicore/lib/BidiNSM.pl create mode 100644 Master/perltl/lib/unicore/lib/BidiON.pl create mode 100644 Master/perltl/lib/unicore/lib/BidiPDF.pl create mode 100644 Master/perltl/lib/unicore/lib/BidiR.pl create mode 100644 Master/perltl/lib/unicore/lib/BidiRLE.pl create mode 100644 Master/perltl/lib/unicore/lib/BidiRLO.pl create mode 100644 Master/perltl/lib/unicore/lib/BidiS.pl create mode 100644 Master/perltl/lib/unicore/lib/BidiWS.pl create mode 100644 Master/perltl/lib/unicore/lib/Blank.pl create mode 100644 Master/perltl/lib/unicore/lib/Bopomofo.pl create mode 100644 Master/perltl/lib/unicore/lib/Buhid.pl create mode 100644 Master/perltl/lib/unicore/lib/C.pl create mode 100644 Master/perltl/lib/unicore/lib/Canadian.pl create mode 100644 Master/perltl/lib/unicore/lib/Canon.pl create mode 100644 Master/perltl/lib/unicore/lib/Cc.pl create mode 100644 Master/perltl/lib/unicore/lib/Cf.pl create mode 100644 Master/perltl/lib/unicore/lib/Cherokee.pl create mode 100644 Master/perltl/lib/unicore/lib/Cn.pl create mode 100644 Master/perltl/lib/unicore/lib/Cntrl.pl create mode 100644 Master/perltl/lib/unicore/lib/Co.pl create mode 100644 Master/perltl/lib/unicore/lib/Common.pl create mode 100644 Master/perltl/lib/unicore/lib/Compat.pl create mode 100644 Master/perltl/lib/unicore/lib/Cs.pl create mode 100644 Master/perltl/lib/unicore/lib/Cyrillic.pl create mode 100644 Master/perltl/lib/unicore/lib/DCcircle.pl create mode 100644 Master/perltl/lib/unicore/lib/DCcompat.pl create mode 100644 Master/perltl/lib/unicore/lib/DCfinal.pl create mode 100644 Master/perltl/lib/unicore/lib/DCfont.pl create mode 100644 Master/perltl/lib/unicore/lib/DCfracti.pl create mode 100644 Master/perltl/lib/unicore/lib/DCinitia.pl create mode 100644 Master/perltl/lib/unicore/lib/DCisolat.pl create mode 100644 Master/perltl/lib/unicore/lib/DCmedial.pl create mode 100644 Master/perltl/lib/unicore/lib/DCnarrow.pl create mode 100644 Master/perltl/lib/unicore/lib/DCnoBrea.pl create mode 100644 Master/perltl/lib/unicore/lib/DCsmall.pl create mode 100644 Master/perltl/lib/unicore/lib/DCsquare.pl create mode 100644 Master/perltl/lib/unicore/lib/DCsub.pl create mode 100644 Master/perltl/lib/unicore/lib/DCsuper.pl create mode 100644 Master/perltl/lib/unicore/lib/DCvertic.pl create mode 100644 Master/perltl/lib/unicore/lib/DCwide.pl create mode 100644 Master/perltl/lib/unicore/lib/Dash.pl create mode 100644 Master/perltl/lib/unicore/lib/Deprecat.pl create mode 100644 Master/perltl/lib/unicore/lib/Deseret.pl create mode 100644 Master/perltl/lib/unicore/lib/Devanaga.pl create mode 100644 Master/perltl/lib/unicore/lib/Diacriti.pl create mode 100644 Master/perltl/lib/unicore/lib/Digit.pl create mode 100644 Master/perltl/lib/unicore/lib/Ethiopic.pl create mode 100644 Master/perltl/lib/unicore/lib/Extender.pl create mode 100644 Master/perltl/lib/unicore/lib/Georgian.pl create mode 100644 Master/perltl/lib/unicore/lib/Gothic.pl create mode 100644 Master/perltl/lib/unicore/lib/Graph.pl create mode 100644 Master/perltl/lib/unicore/lib/Grapheme.pl create mode 100644 Master/perltl/lib/unicore/lib/Greek.pl create mode 100644 Master/perltl/lib/unicore/lib/Gujarati.pl create mode 100644 Master/perltl/lib/unicore/lib/Gurmukhi.pl create mode 100644 Master/perltl/lib/unicore/lib/Han.pl create mode 100644 Master/perltl/lib/unicore/lib/Hangul.pl create mode 100644 Master/perltl/lib/unicore/lib/Hanunoo.pl create mode 100644 Master/perltl/lib/unicore/lib/Hebrew.pl create mode 100644 Master/perltl/lib/unicore/lib/HexDigit.pl create mode 100644 Master/perltl/lib/unicore/lib/Hiragana.pl create mode 100644 Master/perltl/lib/unicore/lib/Hyphen.pl create mode 100644 Master/perltl/lib/unicore/lib/IdContin.pl create mode 100644 Master/perltl/lib/unicore/lib/IdStart.pl create mode 100644 Master/perltl/lib/unicore/lib/Ideograp.pl create mode 100644 Master/perltl/lib/unicore/lib/IdsBinar.pl create mode 100644 Master/perltl/lib/unicore/lib/IdsTrina.pl create mode 100644 Master/perltl/lib/unicore/lib/InAlphab.pl create mode 100644 Master/perltl/lib/unicore/lib/InArabi2.pl create mode 100644 Master/perltl/lib/unicore/lib/InArabi3.pl create mode 100644 Master/perltl/lib/unicore/lib/InArabic.pl create mode 100644 Master/perltl/lib/unicore/lib/InArmeni.pl create mode 100644 Master/perltl/lib/unicore/lib/InArrows.pl create mode 100644 Master/perltl/lib/unicore/lib/InBasicL.pl create mode 100644 Master/perltl/lib/unicore/lib/InBengal.pl create mode 100644 Master/perltl/lib/unicore/lib/InBlockE.pl create mode 100644 Master/perltl/lib/unicore/lib/InBopom2.pl create mode 100644 Master/perltl/lib/unicore/lib/InBopomo.pl create mode 100644 Master/perltl/lib/unicore/lib/InBoxDra.pl create mode 100644 Master/perltl/lib/unicore/lib/InBraill.pl create mode 100644 Master/perltl/lib/unicore/lib/InBuhid.pl create mode 100644 Master/perltl/lib/unicore/lib/InByzant.pl create mode 100644 Master/perltl/lib/unicore/lib/InCherok.pl create mode 100644 Master/perltl/lib/unicore/lib/InCjkCo2.pl create mode 100644 Master/perltl/lib/unicore/lib/InCjkCo3.pl create mode 100644 Master/perltl/lib/unicore/lib/InCjkCo4.pl create mode 100644 Master/perltl/lib/unicore/lib/InCjkCom.pl create mode 100644 Master/perltl/lib/unicore/lib/InCjkRad.pl create mode 100644 Master/perltl/lib/unicore/lib/InCjkSym.pl create mode 100644 Master/perltl/lib/unicore/lib/InCjkUn2.pl create mode 100644 Master/perltl/lib/unicore/lib/InCjkUn3.pl create mode 100644 Master/perltl/lib/unicore/lib/InCjkUni.pl create mode 100644 Master/perltl/lib/unicore/lib/InCombi2.pl create mode 100644 Master/perltl/lib/unicore/lib/InCombi3.pl create mode 100644 Master/perltl/lib/unicore/lib/InCombin.pl create mode 100644 Master/perltl/lib/unicore/lib/InContro.pl create mode 100644 Master/perltl/lib/unicore/lib/InCurren.pl create mode 100644 Master/perltl/lib/unicore/lib/InCyril2.pl create mode 100644 Master/perltl/lib/unicore/lib/InCyrill.pl create mode 100644 Master/perltl/lib/unicore/lib/InDesere.pl create mode 100644 Master/perltl/lib/unicore/lib/InDevana.pl create mode 100644 Master/perltl/lib/unicore/lib/InDingba.pl create mode 100644 Master/perltl/lib/unicore/lib/InEnclo2.pl create mode 100644 Master/perltl/lib/unicore/lib/InEnclos.pl create mode 100644 Master/perltl/lib/unicore/lib/InEthiop.pl create mode 100644 Master/perltl/lib/unicore/lib/InGenera.pl create mode 100644 Master/perltl/lib/unicore/lib/InGeomet.pl create mode 100644 Master/perltl/lib/unicore/lib/InGeorgi.pl create mode 100644 Master/perltl/lib/unicore/lib/InGothic.pl create mode 100644 Master/perltl/lib/unicore/lib/InGreek.pl create mode 100644 Master/perltl/lib/unicore/lib/InGreekA.pl create mode 100644 Master/perltl/lib/unicore/lib/InGreekE.pl create mode 100644 Master/perltl/lib/unicore/lib/InGujara.pl create mode 100644 Master/perltl/lib/unicore/lib/InGurmuk.pl create mode 100644 Master/perltl/lib/unicore/lib/InHalfwi.pl create mode 100644 Master/perltl/lib/unicore/lib/InHangu2.pl create mode 100644 Master/perltl/lib/unicore/lib/InHangu3.pl create mode 100644 Master/perltl/lib/unicore/lib/InHangul.pl create mode 100644 Master/perltl/lib/unicore/lib/InHanuno.pl create mode 100644 Master/perltl/lib/unicore/lib/InHebrew.pl create mode 100644 Master/perltl/lib/unicore/lib/InHighPr.pl create mode 100644 Master/perltl/lib/unicore/lib/InHighSu.pl create mode 100644 Master/perltl/lib/unicore/lib/InHiraga.pl create mode 100644 Master/perltl/lib/unicore/lib/InIdeogr.pl create mode 100644 Master/perltl/lib/unicore/lib/InIpaExt.pl create mode 100644 Master/perltl/lib/unicore/lib/InKanbun.pl create mode 100644 Master/perltl/lib/unicore/lib/InKangxi.pl create mode 100644 Master/perltl/lib/unicore/lib/InKannad.pl create mode 100644 Master/perltl/lib/unicore/lib/InKatak2.pl create mode 100644 Master/perltl/lib/unicore/lib/InKataka.pl create mode 100644 Master/perltl/lib/unicore/lib/InKhmer.pl create mode 100644 Master/perltl/lib/unicore/lib/InLao.pl create mode 100644 Master/perltl/lib/unicore/lib/InLatin1.pl create mode 100644 Master/perltl/lib/unicore/lib/InLatin2.pl create mode 100644 Master/perltl/lib/unicore/lib/InLatin3.pl create mode 100644 Master/perltl/lib/unicore/lib/InLatinE.pl create mode 100644 Master/perltl/lib/unicore/lib/InLetter.pl create mode 100644 Master/perltl/lib/unicore/lib/InLowSur.pl create mode 100644 Master/perltl/lib/unicore/lib/InMalaya.pl create mode 100644 Master/perltl/lib/unicore/lib/InMathe2.pl create mode 100644 Master/perltl/lib/unicore/lib/InMathem.pl create mode 100644 Master/perltl/lib/unicore/lib/InMisce2.pl create mode 100644 Master/perltl/lib/unicore/lib/InMisce3.pl create mode 100644 Master/perltl/lib/unicore/lib/InMisce4.pl create mode 100644 Master/perltl/lib/unicore/lib/InMiscel.pl create mode 100644 Master/perltl/lib/unicore/lib/InMongol.pl create mode 100644 Master/perltl/lib/unicore/lib/InMusica.pl create mode 100644 Master/perltl/lib/unicore/lib/InMyanma.pl create mode 100644 Master/perltl/lib/unicore/lib/InNumber.pl create mode 100644 Master/perltl/lib/unicore/lib/InOgham.pl create mode 100644 Master/perltl/lib/unicore/lib/InOldIta.pl create mode 100644 Master/perltl/lib/unicore/lib/InOptica.pl create mode 100644 Master/perltl/lib/unicore/lib/InOriya.pl create mode 100644 Master/perltl/lib/unicore/lib/InPrivat.pl create mode 100644 Master/perltl/lib/unicore/lib/InRunic.pl create mode 100644 Master/perltl/lib/unicore/lib/InSinhal.pl create mode 100644 Master/perltl/lib/unicore/lib/InSmallF.pl create mode 100644 Master/perltl/lib/unicore/lib/InSpacin.pl create mode 100644 Master/perltl/lib/unicore/lib/InSpecia.pl create mode 100644 Master/perltl/lib/unicore/lib/InSupers.pl create mode 100644 Master/perltl/lib/unicore/lib/InSuppl2.pl create mode 100644 Master/perltl/lib/unicore/lib/InSuppl3.pl create mode 100644 Master/perltl/lib/unicore/lib/InSuppl4.pl create mode 100644 Master/perltl/lib/unicore/lib/InSuppl5.pl create mode 100644 Master/perltl/lib/unicore/lib/InSupple.pl create mode 100644 Master/perltl/lib/unicore/lib/InSyriac.pl create mode 100644 Master/perltl/lib/unicore/lib/InTagalo.pl create mode 100644 Master/perltl/lib/unicore/lib/InTagban.pl create mode 100644 Master/perltl/lib/unicore/lib/InTags.pl create mode 100644 Master/perltl/lib/unicore/lib/InTamil.pl create mode 100644 Master/perltl/lib/unicore/lib/InTelugu.pl create mode 100644 Master/perltl/lib/unicore/lib/InThaana.pl create mode 100644 Master/perltl/lib/unicore/lib/InThai.pl create mode 100644 Master/perltl/lib/unicore/lib/InTibeta.pl create mode 100644 Master/perltl/lib/unicore/lib/InUnifie.pl create mode 100644 Master/perltl/lib/unicore/lib/InVariat.pl create mode 100644 Master/perltl/lib/unicore/lib/InYiRadi.pl create mode 100644 Master/perltl/lib/unicore/lib/InYiSyll.pl create mode 100644 Master/perltl/lib/unicore/lib/Inherite.pl create mode 100644 Master/perltl/lib/unicore/lib/JoinCont.pl create mode 100644 Master/perltl/lib/unicore/lib/Kannada.pl create mode 100644 Master/perltl/lib/unicore/lib/Katakana.pl create mode 100644 Master/perltl/lib/unicore/lib/Khmer.pl create mode 100644 Master/perltl/lib/unicore/lib/L.pl create mode 100644 Master/perltl/lib/unicore/lib/L_.pl create mode 100644 Master/perltl/lib/unicore/lib/Lao.pl create mode 100644 Master/perltl/lib/unicore/lib/Latin.pl create mode 100644 Master/perltl/lib/unicore/lib/Ll.pl create mode 100644 Master/perltl/lib/unicore/lib/Lm.pl create mode 100644 Master/perltl/lib/unicore/lib/Lo.pl create mode 100644 Master/perltl/lib/unicore/lib/LogicalO.pl create mode 100644 Master/perltl/lib/unicore/lib/Lower.pl create mode 100644 Master/perltl/lib/unicore/lib/Lowercas.pl create mode 100644 Master/perltl/lib/unicore/lib/Lt.pl create mode 100644 Master/perltl/lib/unicore/lib/Lu.pl create mode 100644 Master/perltl/lib/unicore/lib/M.pl create mode 100644 Master/perltl/lib/unicore/lib/Malayala.pl create mode 100644 Master/perltl/lib/unicore/lib/Math.pl create mode 100644 Master/perltl/lib/unicore/lib/Mc.pl create mode 100644 Master/perltl/lib/unicore/lib/Me.pl create mode 100644 Master/perltl/lib/unicore/lib/Mirrored.pl create mode 100644 Master/perltl/lib/unicore/lib/Mn.pl create mode 100644 Master/perltl/lib/unicore/lib/Mongolia.pl create mode 100644 Master/perltl/lib/unicore/lib/Myanmar.pl create mode 100644 Master/perltl/lib/unicore/lib/N.pl create mode 100644 Master/perltl/lib/unicore/lib/Nd.pl create mode 100644 Master/perltl/lib/unicore/lib/Nl.pl create mode 100644 Master/perltl/lib/unicore/lib/No.pl create mode 100644 Master/perltl/lib/unicore/lib/Nonchara.pl create mode 100644 Master/perltl/lib/unicore/lib/Ogham.pl create mode 100644 Master/perltl/lib/unicore/lib/OldItali.pl create mode 100644 Master/perltl/lib/unicore/lib/Oriya.pl create mode 100644 Master/perltl/lib/unicore/lib/OtherAlp.pl create mode 100644 Master/perltl/lib/unicore/lib/OtherDef.pl create mode 100644 Master/perltl/lib/unicore/lib/OtherGra.pl create mode 100644 Master/perltl/lib/unicore/lib/OtherLow.pl create mode 100644 Master/perltl/lib/unicore/lib/OtherMat.pl create mode 100644 Master/perltl/lib/unicore/lib/OtherUpp.pl create mode 100644 Master/perltl/lib/unicore/lib/P.pl create mode 100644 Master/perltl/lib/unicore/lib/Pc.pl create mode 100644 Master/perltl/lib/unicore/lib/Pd.pl create mode 100644 Master/perltl/lib/unicore/lib/Pe.pl create mode 100644 Master/perltl/lib/unicore/lib/Pf.pl create mode 100644 Master/perltl/lib/unicore/lib/Pi.pl create mode 100644 Master/perltl/lib/unicore/lib/Po.pl create mode 100644 Master/perltl/lib/unicore/lib/Print.pl create mode 100644 Master/perltl/lib/unicore/lib/Ps.pl create mode 100644 Master/perltl/lib/unicore/lib/Punct.pl create mode 100644 Master/perltl/lib/unicore/lib/Quotatio.pl create mode 100644 Master/perltl/lib/unicore/lib/Radical.pl create mode 100644 Master/perltl/lib/unicore/lib/Runic.pl create mode 100644 Master/perltl/lib/unicore/lib/S.pl create mode 100644 Master/perltl/lib/unicore/lib/Sc.pl create mode 100644 Master/perltl/lib/unicore/lib/Sinhala.pl create mode 100644 Master/perltl/lib/unicore/lib/Sk.pl create mode 100644 Master/perltl/lib/unicore/lib/Sm.pl create mode 100644 Master/perltl/lib/unicore/lib/So.pl create mode 100644 Master/perltl/lib/unicore/lib/SoftDott.pl create mode 100644 Master/perltl/lib/unicore/lib/Space.pl create mode 100644 Master/perltl/lib/unicore/lib/SpacePer.pl create mode 100644 Master/perltl/lib/unicore/lib/Syriac.pl create mode 100644 Master/perltl/lib/unicore/lib/Tagalog.pl create mode 100644 Master/perltl/lib/unicore/lib/Tagbanwa.pl create mode 100644 Master/perltl/lib/unicore/lib/Tamil.pl create mode 100644 Master/perltl/lib/unicore/lib/Telugu.pl create mode 100644 Master/perltl/lib/unicore/lib/Terminal.pl create mode 100644 Master/perltl/lib/unicore/lib/Thaana.pl create mode 100644 Master/perltl/lib/unicore/lib/Thai.pl create mode 100644 Master/perltl/lib/unicore/lib/Tibetan.pl create mode 100644 Master/perltl/lib/unicore/lib/Title.pl create mode 100644 Master/perltl/lib/unicore/lib/UnifiedI.pl create mode 100644 Master/perltl/lib/unicore/lib/Upper.pl create mode 100644 Master/perltl/lib/unicore/lib/Uppercas.pl create mode 100644 Master/perltl/lib/unicore/lib/WhiteSpa.pl create mode 100644 Master/perltl/lib/unicore/lib/Word.pl create mode 100644 Master/perltl/lib/unicore/lib/XDigit.pl create mode 100644 Master/perltl/lib/unicore/lib/Yi.pl create mode 100644 Master/perltl/lib/unicore/lib/Z.pl create mode 100644 Master/perltl/lib/unicore/lib/Zl.pl create mode 100644 Master/perltl/lib/unicore/lib/Zp.pl create mode 100644 Master/perltl/lib/unicore/lib/Zs.pl create mode 100644 Master/perltl/lib/unicore/lib/_CanonDC.pl create mode 100644 Master/perltl/lib/unicore/lib/_CaseIgn.pl create mode 100644 Master/perltl/lib/unicore/lib/_CombAbo.pl create mode 100644 Master/perltl/lib/utf8.pm create mode 100644 Master/perltl/lib/utf8_heavy.pl create mode 100644 Master/perltl/lib/vars.pm create mode 100644 Master/perltl/lib/warnings.pm create mode 100644 Master/perltl/lib/warnings/register.pm create mode 100644 Master/perltl/site/lib/Tk.pm create mode 100644 Master/perltl/site/lib/Tk/Adjuster.pm create mode 100644 Master/perltl/site/lib/Tk/After.pm create mode 100644 Master/perltl/site/lib/Tk/Bitmap.pm create mode 100644 Master/perltl/site/lib/Tk/Button.pm create mode 100644 Master/perltl/site/lib/Tk/Camel.xpm create mode 100644 Master/perltl/site/lib/Tk/Canvas.pm create mode 100644 Master/perltl/site/lib/Tk/Checkbutton.pm create mode 100644 Master/perltl/site/lib/Tk/Clipboard.pm create mode 100644 Master/perltl/site/lib/Tk/CmdLine.pm create mode 100644 Master/perltl/site/lib/Tk/ColorEdit.xpm create mode 100644 Master/perltl/site/lib/Tk/ColorEditor.pm create mode 100644 Master/perltl/site/lib/Tk/Config.pm create mode 100644 Master/perltl/site/lib/Tk/Configure.pm create mode 100644 Master/perltl/site/lib/Tk/Derived.pm create mode 100644 Master/perltl/site/lib/Tk/Dialog.pm create mode 100644 Master/perltl/site/lib/Tk/DialogBox.pm create mode 100644 Master/perltl/site/lib/Tk/Entry.pm create mode 100644 Master/perltl/site/lib/Tk/Event.pm create mode 100644 Master/perltl/site/lib/Tk/Event/IO.pm create mode 100644 Master/perltl/site/lib/Tk/FBox.pm create mode 100644 Master/perltl/site/lib/Tk/Frame.pm create mode 100644 Master/perltl/site/lib/Tk/IconList.pm create mode 100644 Master/perltl/site/lib/Tk/Image.pm create mode 100644 Master/perltl/site/lib/Tk/Label.pm create mode 100644 Master/perltl/site/lib/Tk/Listbox.pm create mode 100644 Master/perltl/site/lib/Tk/MainWindow.pm create mode 100644 Master/perltl/site/lib/Tk/Menu.pm create mode 100644 Master/perltl/site/lib/Tk/Menu/Item.pm create mode 100644 Master/perltl/site/lib/Tk/Menubutton.pm create mode 100644 Master/perltl/site/lib/Tk/Optionmenu.pm create mode 100644 Master/perltl/site/lib/Tk/Pixmap.pm create mode 100644 Master/perltl/site/lib/Tk/Pretty.pm create mode 100644 Master/perltl/site/lib/Tk/ROText.pm create mode 100644 Master/perltl/site/lib/Tk/Radiobutton.pm create mode 100644 Master/perltl/site/lib/Tk/Scale.pm create mode 100644 Master/perltl/site/lib/Tk/Scrollbar.pm create mode 100644 Master/perltl/site/lib/Tk/Submethods.pm create mode 100644 Master/perltl/site/lib/Tk/Text.pm create mode 100644 Master/perltl/site/lib/Tk/Text/Tag.pm create mode 100644 Master/perltl/site/lib/Tk/Tk.xbm create mode 100644 Master/perltl/site/lib/Tk/Tk.xpm create mode 100644 Master/perltl/site/lib/Tk/Toplevel.pm create mode 100644 Master/perltl/site/lib/Tk/Widget.pm create mode 100644 Master/perltl/site/lib/Tk/Wm.pm create mode 100644 Master/perltl/site/lib/Tk/X.pm create mode 100644 Master/perltl/site/lib/Tk/X11/license.terms create mode 100644 Master/perltl/site/lib/Tk/Xcamel.gif create mode 100644 Master/perltl/site/lib/Tk/act_folder.xbm create mode 100644 Master/perltl/site/lib/Tk/act_folder.xpm create mode 100644 Master/perltl/site/lib/Tk/anim.gif create mode 100644 Master/perltl/site/lib/Tk/balArrow.xbm create mode 100644 Master/perltl/site/lib/Tk/cbxarrow.xbm create mode 100644 Master/perltl/site/lib/Tk/file.xbm create mode 100644 Master/perltl/site/lib/Tk/file.xpm create mode 100644 Master/perltl/site/lib/Tk/folder.xbm create mode 100644 Master/perltl/site/lib/Tk/folder.xpm create mode 100644 Master/perltl/site/lib/Tk/icon.gif create mode 100644 Master/perltl/site/lib/Tk/license.terms create mode 100644 Master/perltl/site/lib/Tk/openfile.xbm create mode 100644 Master/perltl/site/lib/Tk/openfolder.xbm create mode 100644 Master/perltl/site/lib/Tk/openfolder.xpm create mode 100644 Master/perltl/site/lib/Tk/prolog.ps create mode 100644 Master/perltl/site/lib/Tk/srcfile.xpm create mode 100644 Master/perltl/site/lib/Tk/textfile.xpm create mode 100644 Master/perltl/site/lib/Tk/tranicon.gif create mode 100644 Master/perltl/site/lib/Tk/widgets.pm create mode 100644 Master/perltl/site/lib/Tk/win.xbm create mode 100644 Master/perltl/site/lib/Tk/winfolder.xpm create mode 100644 Master/perltl/site/lib/Tk/wintext.xpm create mode 100644 Master/perltl/site/lib/Win32/API.pm create mode 100644 Master/perltl/site/lib/Win32/API/Struct.pm create mode 100644 Master/perltl/site/lib/Win32/API/Type.pm create mode 100644 Master/perltl/site/lib/XML/Parser.pm create mode 100644 Master/perltl/site/lib/XML/Parser/Expat.pm create mode 100644 Master/perltl/site/lib/auto/Tk/Bitmap/Bitmap.dll create mode 100644 Master/perltl/site/lib/auto/Tk/CancelRepeat.al create mode 100644 Master/perltl/site/lib/auto/Tk/Canvas/Canvas.dll create mode 100644 Master/perltl/site/lib/auto/Tk/Clipboard/autosplit.ix create mode 100644 Master/perltl/site/lib/auto/Tk/Clipboard/getSelected.al create mode 100644 Master/perltl/site/lib/auto/Tk/EnterFocus.al create mode 100644 Master/perltl/site/lib/auto/Tk/Entry/Entry.dll create mode 100644 Master/perltl/site/lib/auto/Tk/Error.al create mode 100644 Master/perltl/site/lib/auto/Tk/Event/Event.dll create mode 100644 Master/perltl/site/lib/auto/Tk/FirstMenu.al create mode 100644 Master/perltl/site/lib/auto/Tk/FocusChildren.al create mode 100644 Master/perltl/site/lib/auto/Tk/FocusOK.al create mode 100644 Master/perltl/site/lib/auto/Tk/Frame/AddScrollbars.al create mode 100644 Master/perltl/site/lib/auto/Tk/Frame/FindMenu.al create mode 100644 Master/perltl/site/lib/auto/Tk/Frame/autosplit.ix create mode 100644 Master/perltl/site/lib/auto/Tk/Frame/freeze_on_map.al create mode 100644 Master/perltl/site/lib/auto/Tk/Frame/label.al create mode 100644 Master/perltl/site/lib/auto/Tk/Frame/labelPack.al create mode 100644 Master/perltl/site/lib/auto/Tk/Frame/labelVariable.al create mode 100644 Master/perltl/site/lib/auto/Tk/Frame/packscrollbars.al create mode 100644 Master/perltl/site/lib/auto/Tk/Frame/queuePack.al create mode 100644 Master/perltl/site/lib/auto/Tk/Frame/sbset.al create mode 100644 Master/perltl/site/lib/auto/Tk/Frame/scrollbars.al create mode 100644 Master/perltl/site/lib/auto/Tk/ImageNames.al create mode 100644 Master/perltl/site/lib/auto/Tk/ImageTypes.al create mode 100644 Master/perltl/site/lib/auto/Tk/Listbox/AutoScan.al create mode 100644 Master/perltl/site/lib/auto/Tk/Listbox/BeginExtend.al create mode 100644 Master/perltl/site/lib/auto/Tk/Listbox/BeginSelect.al create mode 100644 Master/perltl/site/lib/auto/Tk/Listbox/BeginToggle.al create mode 100644 Master/perltl/site/lib/auto/Tk/Listbox/ButtonRelease_1.al create mode 100644 Master/perltl/site/lib/auto/Tk/Listbox/Cancel.al create mode 100644 Master/perltl/site/lib/auto/Tk/Listbox/Cntrl_End.al create mode 100644 Master/perltl/site/lib/auto/Tk/Listbox/Cntrl_Home.al create mode 100644 Master/perltl/site/lib/auto/Tk/Listbox/Cntrl_backslash.al create mode 100644 Master/perltl/site/lib/auto/Tk/Listbox/DataExtend.al create mode 100644 Master/perltl/site/lib/auto/Tk/Listbox/ExtendUpDown.al create mode 100644 Master/perltl/site/lib/auto/Tk/Listbox/Listbox.dll create mode 100644 Master/perltl/site/lib/auto/Tk/Listbox/Motion.al create mode 100644 Master/perltl/site/lib/auto/Tk/Listbox/SelectAll.al create mode 100644 Master/perltl/site/lib/auto/Tk/Listbox/SetList.al create mode 100644 Master/perltl/site/lib/auto/Tk/Listbox/UpDown.al create mode 100644 Master/perltl/site/lib/auto/Tk/Listbox/autosplit.ix create mode 100644 Master/perltl/site/lib/auto/Tk/Listbox/clipboardPaste.al create mode 100644 Master/perltl/site/lib/auto/Tk/Listbox/deleteSelected.al create mode 100644 Master/perltl/site/lib/auto/Tk/Listbox/getSelected.al create mode 100644 Master/perltl/site/lib/auto/Tk/Listbox/xyIndex.al create mode 100644 Master/perltl/site/lib/auto/Tk/Menubutton/Menubutton.dll create mode 100644 Master/perltl/site/lib/auto/Tk/Pixmap/Pixmap.dll create mode 100644 Master/perltl/site/lib/auto/Tk/Receive.al create mode 100644 Master/perltl/site/lib/auto/Tk/RepeatId.al create mode 100644 Master/perltl/site/lib/auto/Tk/Scale/Activate.al create mode 100644 Master/perltl/site/lib/auto/Tk/Scale/ButtonDown.al create mode 100644 Master/perltl/site/lib/auto/Tk/Scale/ButtonUp.al create mode 100644 Master/perltl/site/lib/auto/Tk/Scale/ControlPress.al create mode 100644 Master/perltl/site/lib/auto/Tk/Scale/Drag.al create mode 100644 Master/perltl/site/lib/auto/Tk/Scale/EndDrag.al create mode 100644 Master/perltl/site/lib/auto/Tk/Scale/Enter.al create mode 100644 Master/perltl/site/lib/auto/Tk/Scale/Increment.al create mode 100644 Master/perltl/site/lib/auto/Tk/Scale/Leave.al create mode 100644 Master/perltl/site/lib/auto/Tk/Scale/Scale.dll create mode 100644 Master/perltl/site/lib/auto/Tk/Scale/autosplit.ix create mode 100644 Master/perltl/site/lib/auto/Tk/Scrollbar/ButtonDown.al create mode 100644 Master/perltl/site/lib/auto/Tk/Scrollbar/ButtonUp.al create mode 100644 Master/perltl/site/lib/auto/Tk/Scrollbar/Drag.al create mode 100644 Master/perltl/site/lib/auto/Tk/Scrollbar/EndDrag.al create mode 100644 Master/perltl/site/lib/auto/Tk/Scrollbar/Enter.al create mode 100644 Master/perltl/site/lib/auto/Tk/Scrollbar/Leave.al create mode 100644 Master/perltl/site/lib/auto/Tk/Scrollbar/Motion.al create mode 100644 Master/perltl/site/lib/auto/Tk/Scrollbar/ScrlByPages.al create mode 100644 Master/perltl/site/lib/auto/Tk/Scrollbar/ScrlByUnits.al create mode 100644 Master/perltl/site/lib/auto/Tk/Scrollbar/ScrlToPos.al create mode 100644 Master/perltl/site/lib/auto/Tk/Scrollbar/ScrlTopBottom.al create mode 100644 Master/perltl/site/lib/auto/Tk/Scrollbar/Scrollbar.dll create mode 100644 Master/perltl/site/lib/auto/Tk/Scrollbar/Select.al create mode 100644 Master/perltl/site/lib/auto/Tk/Scrollbar/StartDrag.al create mode 100644 Master/perltl/site/lib/auto/Tk/Scrollbar/autosplit.ix create mode 100644 Master/perltl/site/lib/auto/Tk/Selection.al create mode 100644 Master/perltl/site/lib/auto/Tk/Text/Text.dll create mode 100644 Master/perltl/site/lib/auto/Tk/Text/autosplit.ix create mode 100644 Master/perltl/site/lib/auto/Tk/Tk.dll create mode 100644 Master/perltl/site/lib/auto/Tk/Toplevel/FG_BindIn.al create mode 100644 Master/perltl/site/lib/auto/Tk/Toplevel/FG_BindOut.al create mode 100644 Master/perltl/site/lib/auto/Tk/Toplevel/FG_Create.al create mode 100644 Master/perltl/site/lib/auto/Tk/Toplevel/FG_Destroy.al create mode 100644 Master/perltl/site/lib/auto/Tk/Toplevel/FG_In.al create mode 100644 Master/perltl/site/lib/auto/Tk/Toplevel/FG_Out.al create mode 100644 Master/perltl/site/lib/auto/Tk/Toplevel/autosplit.ix create mode 100644 Master/perltl/site/lib/auto/Tk/TraverseToMenu.al create mode 100644 Master/perltl/site/lib/auto/Tk/Widget/ASkludge.al create mode 100644 Master/perltl/site/lib/auto/Tk/Widget/autosplit.ix create mode 100644 Master/perltl/site/lib/auto/Tk/Widget/clipboardKeysyms.al create mode 100644 Master/perltl/site/lib/auto/Tk/Widget/pathname.al create mode 100644 Master/perltl/site/lib/auto/Tk/Wm/AnchorAdjust.al create mode 100644 Master/perltl/site/lib/auto/Tk/Wm/FullScreen.al create mode 100644 Master/perltl/site/lib/auto/Tk/Wm/Popup.al create mode 100644 Master/perltl/site/lib/auto/Tk/Wm/Post.al create mode 100644 Master/perltl/site/lib/auto/Tk/Wm/autosplit.ix create mode 100644 Master/perltl/site/lib/auto/Tk/Wm/iconposition.al create mode 100644 Master/perltl/site/lib/auto/Tk/X/X.dll create mode 100644 Master/perltl/site/lib/auto/Tk/X/autosplit.ix create mode 100644 Master/perltl/site/lib/auto/Tk/autosplit.ix create mode 100644 Master/perltl/site/lib/auto/Tk/break.al create mode 100644 Master/perltl/site/lib/auto/Tk/focusFollowsMouse.al create mode 100644 Master/perltl/site/lib/auto/Tk/focusNext.al create mode 100644 Master/perltl/site/lib/auto/Tk/focusPrev.al create mode 100644 Master/perltl/site/lib/auto/Tk/interps.al create mode 100644 Master/perltl/site/lib/auto/Tk/lsearch.al create mode 100644 Master/perltl/site/lib/auto/Tk/tabFocus.al create mode 100644 Master/perltl/site/lib/auto/Tk/updateWidgets.al create mode 100644 Master/perltl/site/lib/auto/Win32/API/API.dll create mode 100644 Master/perltl/site/lib/auto/XML/Parser/Expat/Expat.dll diff --git a/Master/perltl/lib/AnyDBM_File.pm b/Master/perltl/lib/AnyDBM_File.pm new file mode 100644 index 00000000000..d73abab0f9e --- /dev/null +++ b/Master/perltl/lib/AnyDBM_File.pm @@ -0,0 +1,93 @@ +package AnyDBM_File; + +use 5.006_001; +our $VERSION = '1.00'; +our @ISA = qw(NDBM_File DB_File GDBM_File SDBM_File ODBM_File) unless @ISA; + +my $mod; +for $mod (@ISA) { + if (eval "require $mod") { + @ISA = ($mod); # if we leave @ISA alone, warnings abound + return 1; + } +} + +die "No DBM package was successfully found or installed"; +#return 0; + +=head1 NAME + +AnyDBM_File - provide framework for multiple DBMs + +NDBM_File, DB_File, GDBM_File, SDBM_File, ODBM_File - various DBM implementations + +=head1 SYNOPSIS + + use AnyDBM_File; + +=head1 DESCRIPTION + +This module is a "pure virtual base class"--it has nothing of its own. +It's just there to inherit from one of the various DBM packages. It +prefers ndbm for compatibility reasons with Perl 4, then Berkeley DB (See +L), GDBM, SDBM (which is always there--it comes with Perl), and +finally ODBM. This way old programs that used to use NDBM via dbmopen() +can still do so, but new ones can reorder @ISA: + + BEGIN { @AnyDBM_File::ISA = qw(DB_File GDBM_File NDBM_File) } + use AnyDBM_File; + +Having multiple DBM implementations makes it trivial to copy database formats: + + use POSIX; use NDBM_File; use DB_File; + tie %newhash, 'DB_File', $new_filename, O_CREAT|O_RDWR; + tie %oldhash, 'NDBM_File', $old_filename, 1, 0; + %newhash = %oldhash; + +=head2 DBM Comparisons + +Here's a partial table of features the different packages offer: + + odbm ndbm sdbm gdbm bsd-db + ---- ---- ---- ---- ------ + Linkage comes w/ perl yes yes yes yes yes + Src comes w/ perl no no yes no no + Comes w/ many unix os yes yes[0] no no no + Builds ok on !unix ? ? yes yes ? + Code Size ? ? small big big + Database Size ? ? small big? ok[1] + Speed ? ? slow ok fast + FTPable no no yes yes yes + Easy to build N/A N/A yes yes ok[2] + Size limits 1k 4k 1k[3] none none + Byte-order independent no no no no yes + Licensing restrictions ? ? no yes no + + +=over 4 + +=item [0] + +on mixed universe machines, may be in the bsd compat library, +which is often shunned. + +=item [1] + +Can be trimmed if you compile for one access method. + +=item [2] + +See L. +Requires symbolic links. + +=item [3] + +By default, but can be redefined. + +=back + +=head1 SEE ALSO + +dbm(3), ndbm(3), DB_File(3), L + +=cut diff --git a/Master/perltl/lib/AutoLoader.pm b/Master/perltl/lib/AutoLoader.pm new file mode 100644 index 00000000000..b42d5ff4b68 --- /dev/null +++ b/Master/perltl/lib/AutoLoader.pm @@ -0,0 +1,337 @@ +package AutoLoader; + +use 5.006_001; +our(@EXPORT, @EXPORT_OK, $VERSION); + +my $is_dosish; +my $is_epoc; +my $is_vms; +my $is_macos; + +BEGIN { + require Exporter; + @EXPORT = @EXPORT = (); + @EXPORT_OK = @EXPORT_OK = qw(AUTOLOAD); + $is_dosish = $^O eq 'dos' || $^O eq 'os2' || $^O eq 'MSWin32' || $^O eq 'NetWare'; + $is_epoc = $^O eq 'epoc'; + $is_vms = $^O eq 'VMS'; + $is_macos = $^O eq 'MacOS'; + $VERSION = '5.59'; +} + +AUTOLOAD { + my $sub = $AUTOLOAD; + my $filename; + # Braces used to preserve $1 et al. + { + # Try to find the autoloaded file from the package-qualified + # name of the sub. e.g., if the sub needed is + # Getopt::Long::GetOptions(), then $INC{Getopt/Long.pm} is + # something like '/usr/lib/perl5/Getopt/Long.pm', and the + # autoload file is '/usr/lib/perl5/auto/Getopt/Long/GetOptions.al'. + # + # However, if @INC is a relative path, this might not work. If, + # for example, @INC = ('lib'), then $INC{Getopt/Long.pm} is + # 'lib/Getopt/Long.pm', and we want to require + # 'auto/Getopt/Long/GetOptions.al' (without the leading 'lib'). + # In this case, we simple prepend the 'auto/' and let the + # C take care of the searching for us. + + my ($pkg,$func) = ($sub =~ /(.*)::([^:]+)$/); + $pkg =~ s#::#/#g; + if (defined($filename = $INC{"$pkg.pm"})) { + if ($is_macos) { + $pkg =~ tr#/#:#; + $filename =~ s#^(.*)$pkg\.pm\z#$1auto:$pkg:$func.al#s; + } else { + $filename =~ s#^(.*)$pkg\.pm\z#$1auto/$pkg/$func.al#s; + } + + # if the file exists, then make sure that it is a + # a fully anchored path (i.e either '/usr/lib/auto/foo/bar.al', + # or './lib/auto/foo/bar.al'. This avoids C searching + # (and failing) to find the 'lib/auto/foo/bar.al' because it + # looked for 'lib/lib/auto/foo/bar.al', given @INC = ('lib'). + + if (-r $filename) { + unless ($filename =~ m|^/|s) { + if ($is_dosish) { + unless ($filename =~ m{^([a-z]:)?[\\/]}is) { + if ($^O ne 'NetWare') { + $filename = "./$filename"; + } else { + $filename = "$filename"; + } + } + } + elsif ($is_epoc) { + unless ($filename =~ m{^([a-z?]:)?[\\/]}is) { + $filename = "./$filename"; + } + } + elsif ($is_vms) { + # XXX todo by VMSmiths + $filename = "./$filename"; + } + elsif (!$is_macos) { + $filename = "./$filename"; + } + } + } + else { + $filename = undef; + } + } + unless (defined $filename) { + # let C do the searching + $filename = "auto/$sub.al"; + $filename =~ s#::#/#g; + } + } + my $save = $@; + local $!; # Do not munge the value. + eval { local $SIG{__DIE__}; require $filename }; + if ($@) { + if (substr($sub,-9) eq '::DESTROY') { + *$sub = sub {}; + } else { + # The load might just have failed because the filename was too + # long for some old SVR3 systems which treat long names as errors. + # If we can succesfully truncate a long name then it's worth a go. + # There is a slight risk that we could pick up the wrong file here + # but autosplit should have warned about that when splitting. + if ($filename =~ s/(\w{12,})\.al$/substr($1,0,11).".al"/e){ + eval { local $SIG{__DIE__}; require $filename }; + } + if ($@){ + $@ =~ s/ at .*\n//; + my $error = $@; + require Carp; + Carp::croak($error); + } + } + } + $@ = $save; + goto &$sub; +} + +sub import { + my $pkg = shift; + my $callpkg = caller; + + # + # Export symbols, but not by accident of inheritance. + # + + if ($pkg eq 'AutoLoader') { + local $Exporter::ExportLevel = 1; + Exporter::import $pkg, @_; + } + + # + # Try to find the autosplit index file. Eg., if the call package + # is POSIX, then $INC{POSIX.pm} is something like + # '/usr/local/lib/perl5/POSIX.pm', and the autosplit index file is in + # '/usr/local/lib/perl5/auto/POSIX/autosplit.ix', so we require that. + # + # However, if @INC is a relative path, this might not work. If, + # for example, @INC = ('lib'), then + # $INC{POSIX.pm} is 'lib/POSIX.pm', and we want to require + # 'auto/POSIX/autosplit.ix' (without the leading 'lib'). + # + + (my $calldir = $callpkg) =~ s#::#/#g; + my $path = $INC{$calldir . '.pm'}; + if (defined($path)) { + # Try absolute path name. + if ($is_macos) { + (my $malldir = $calldir) =~ tr#/#:#; + $path =~ s#^(.*)$malldir\.pm\z#$1auto:$malldir:autosplit.ix#s; + } else { + $path =~ s#^(.*)$calldir\.pm\z#$1auto/$calldir/autosplit.ix#; + } + + eval { require $path; }; + # If that failed, try relative path with normal @INC searching. + if ($@) { + $path ="auto/$calldir/autosplit.ix"; + eval { require $path; }; + } + if ($@) { + my $error = $@; + require Carp; + Carp::carp($error); + } + } +} + +sub unimport { + my $callpkg = caller; + eval "package $callpkg; sub AUTOLOAD;"; +} + +1; + +__END__ + +=head1 NAME + +AutoLoader - load subroutines only on demand + +=head1 SYNOPSIS + + package Foo; + use AutoLoader 'AUTOLOAD'; # import the default AUTOLOAD subroutine + + package Bar; + use AutoLoader; # don't import AUTOLOAD, define our own + sub AUTOLOAD { + ... + $AutoLoader::AUTOLOAD = "..."; + goto &AutoLoader::AUTOLOAD; + } + +=head1 DESCRIPTION + +The B module works with the B module and the +C<__END__> token to defer the loading of some subroutines until they are +used rather than loading them all at once. + +To use B, the author of a module has to place the +definitions of subroutines to be autoloaded after an C<__END__> token. +(See L.) The B module can then be run manually to +extract the definitions into individual files F. + +B implements an AUTOLOAD subroutine. When an undefined +subroutine in is called in a client module of B, +B's AUTOLOAD subroutine attempts to locate the subroutine in a +file with a name related to the location of the file from which the +client module was read. As an example, if F is located in +F, B will look for perl +subroutines B in F, where +the C<.al> file has the same name as the subroutine, sans package. If +such a file exists, AUTOLOAD will read and evaluate it, +thus (presumably) defining the needed subroutine. AUTOLOAD will then +C the newly defined subroutine. + +Once this process completes for a given function, it is defined, so +future calls to the subroutine will bypass the AUTOLOAD mechanism. + +=head2 Subroutine Stubs + +In order for object method lookup and/or prototype checking to operate +correctly even when methods have not yet been defined it is necessary to +"forward declare" each subroutine (as in C). See +L. Such forward declaration creates "subroutine +stubs", which are place holders with no code. + +The AutoSplit and B modules automate the creation of forward +declarations. The AutoSplit module creates an 'index' file containing +forward declarations of all the AutoSplit subroutines. When the +AutoLoader module is 'use'd it loads these declarations into its callers +package. + +Because of this mechanism it is important that B is always +Cd and not Cd. + +=head2 Using B's AUTOLOAD Subroutine + +In order to use B's AUTOLOAD subroutine you I +explicitly import it: + + use AutoLoader 'AUTOLOAD'; + +=head2 Overriding B's AUTOLOAD Subroutine + +Some modules, mainly extensions, provide their own AUTOLOAD subroutines. +They typically need to check for some special cases (such as constants) +and then fallback to B's AUTOLOAD for the rest. + +Such modules should I import B's AUTOLOAD subroutine. +Instead, they should define their own AUTOLOAD subroutines along these +lines: + + use AutoLoader; + use Carp; + + sub AUTOLOAD { + my $sub = $AUTOLOAD; + (my $constname = $sub) =~ s/.*:://; + my $val = constant($constname, @_ ? $_[0] : 0); + if ($! != 0) { + if ($! =~ /Invalid/ || $!{EINVAL}) { + $AutoLoader::AUTOLOAD = $sub; + goto &AutoLoader::AUTOLOAD; + } + else { + croak "Your vendor has not defined constant $constname"; + } + } + *$sub = sub { $val }; # same as: eval "sub $sub { $val }"; + goto &$sub; + } + +If any module's own AUTOLOAD subroutine has no need to fallback to the +AutoLoader's AUTOLOAD subroutine (because it doesn't have any AutoSplit +subroutines), then that module should not use B at all. + +=head2 Package Lexicals + +Package lexicals declared with C in the main block of a package +using B will not be visible to auto-loaded subroutines, due to +the fact that the given scope ends at the C<__END__> marker. A module +using such variables as package globals will not work properly under the +B. + +The C pragma (see L) may be used in such +situations as an alternative to explicitly qualifying all globals with +the package namespace. Variables pre-declared with this pragma will be +visible to any autoloaded routines (but will not be invisible outside +the package, unfortunately). + +=head2 Not Using AutoLoader + +You can stop using AutoLoader by simply + + no AutoLoader; + +=head2 B vs. B + +The B is similar in purpose to B: both delay the +loading of subroutines. + +B uses the C<__DATA__> marker rather than C<__END__>. +While this avoids the use of a hierarchy of disk files and the +associated open/close for each routine loaded, B suffers a +startup speed disadvantage in the one-time parsing of the lines after +C<__DATA__>, after which routines are cached. B can also +handle multiple packages in a file. + +B only reads code as it is requested, and in many cases +should be faster, but requires a mechanism like B be used to +create the individual files. L will invoke +B automatically if B is used in a module source +file. + +=head1 CAVEATS + +AutoLoaders prior to Perl 5.002 had a slightly different interface. Any +old modules which use B should be changed to the new calling +style. Typically this just means changing a require to a use, adding +the explicit C<'AUTOLOAD'> import if needed, and removing B +from C<@ISA>. + +On systems with restrictions on file name length, the file corresponding +to a subroutine may have a shorter name that the routine itself. This +can lead to conflicting file names. The I package warns of +these potential conflicts when used to split a module. + +AutoLoader may fail to find the autosplit files (or even find the wrong +ones) in cases where C<@INC> contains relative paths, B the program +does C. + +=head1 SEE ALSO + +L - an autoloader that doesn't use external files. + +=cut diff --git a/Master/perltl/lib/B.pm b/Master/perltl/lib/B.pm new file mode 100644 index 00000000000..feca2e59d6e --- /dev/null +++ b/Master/perltl/lib/B.pm @@ -0,0 +1,971 @@ +# B.pm +# +# Copyright (c) 1996, 1997, 1998 Malcolm Beattie +# +# You may distribute under the terms of either the GNU General Public +# License or the Artistic License, as specified in the README file. +# +package B; + +our $VERSION = '1.01'; + +use XSLoader (); +require Exporter; +@ISA = qw(Exporter); + +# 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 perlstring + walkoptree_slow walkoptree walkoptree_exec walksymtable + parents comppadlist sv_undef compile_stats timing_info + begin_av init_av end_av regex_padav); + +sub OPf_KIDS (); +use strict; +@B::SV::ISA = 'B::OBJECT'; +@B::NULL::ISA = 'B::SV'; +@B::PV::ISA = 'B::SV'; +@B::IV::ISA = 'B::SV'; +@B::NV::ISA = 'B::IV'; +@B::RV::ISA = 'B::SV'; +@B::PVIV::ISA = qw(B::PV B::IV); +@B::PVNV::ISA = qw(B::PV B::NV); +@B::PVMG::ISA = 'B::PVNV'; +@B::PVLV::ISA = 'B::PVMG'; +@B::BM::ISA = 'B::PVMG'; +@B::AV::ISA = 'B::PVMG'; +@B::GV::ISA = 'B::PVMG'; +@B::HV::ISA = 'B::PVMG'; +@B::CV::ISA = 'B::PVMG'; +@B::IO::ISA = 'B::PVMG'; +@B::FM::ISA = 'B::CV'; + +@B::OP::ISA = 'B::OBJECT'; +@B::UNOP::ISA = 'B::OP'; +@B::BINOP::ISA = 'B::UNOP'; +@B::LOGOP::ISA = 'B::UNOP'; +@B::LISTOP::ISA = 'B::BINOP'; +@B::SVOP::ISA = 'B::OP'; +@B::PADOP::ISA = 'B::OP'; +@B::PVOP::ISA = 'B::OP'; +@B::CVOP::ISA = 'B::OP'; +@B::LOOP::ISA = 'B::LISTOP'; +@B::PMOP::ISA = 'B::LISTOP'; +@B::COP::ISA = 'B::OP'; + +@B::SPECIAL::ISA = 'B::OBJECT'; + +{ + # Stop "-w" from complaining about the lack of a real B::OBJECT class + 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( utf8::unicode_to_native( 64 ^ ord($1) ))/e; + + # When we say unicode_to_native we really mean ascii_to_native, + # which matters iff this is a non-ASCII platform (EBCDIC). + + return $name; +} + +sub B::IV::int_value { + my ($self) = @_; + return (($self->FLAGS() & SVf_IVisUV()) ? $self->UVX : $self->IV); +} + +sub B::NULL::as_string() {""} +sub B::IV::as_string() {goto &B::IV::int_value} +sub B::PV::as_string() {goto &B::PV::PV} + +my $debug; +my $op_count = 0; +my @parents = (); + +sub debug { + my ($class, $value) = @_; + $debug = $value; + walkoptree_debug($value); +} + +sub class { + my $obj = shift; + my $name = ref $obj; + $name =~ s/^.*:://; + return $name; +} + +sub parents { \@parents } + +# For debugging +sub peekop { + my $op = shift; + return sprintf("%s (0x%x) %s", class($op), $$op, $op->name); +} + +sub walkoptree_slow { + my($op, $method, $level) = @_; + $op_count++; # just for statistics + $level ||= 0; + warn(sprintf("walkoptree: %d. %s\n", $level, peekop($op))) if $debug; + $op->$method($level); + if ($$op && ($op->flags & OPf_KIDS)) { + my $kid; + unshift(@parents, $op); + for ($kid = $op->first; $$kid; $kid = $kid->sibling) { + walkoptree_slow($kid, $method, $level + 1); + } + shift @parents; + } + if (class($op) eq 'PMOP' && $op->pmreplroot && ${$op->pmreplroot}) { + unshift(@parents, $op); + walkoptree_slow($op->pmreplroot, $method, $level + 1); + shift @parents; + } +} + +sub compile_stats { + return "Total number of OPs processed: $op_count\n"; +} + +sub timing_info { + my ($sec, $min, $hr) = localtime; + my ($user, $sys) = times; + sprintf("%02d:%02d:%02d user=$user sys=$sys", + $hr, $min, $sec, $user, $sys); +} + +my %symtable; + +sub clearsym { + %symtable = (); +} + +sub savesym { + my ($obj, $value) = @_; +# warn(sprintf("savesym: sym_%x => %s\n", $$obj, $value)); # debug + $symtable{sprintf("sym_%x", $$obj)} = $value; +} + +sub objsym { + my $obj = shift; + return $symtable{sprintf("sym_%x", $$obj)}; +} + +sub walkoptree_exec { + my ($op, $method, $level) = @_; + $level ||= 0; + my ($sym, $ppname); + my $prefix = " " x $level; + for (; $$op; $op = $op->next) { + $sym = objsym($op); + if (defined($sym)) { + print $prefix, "goto $sym\n"; + return; + } + savesym($op, sprintf("%s (0x%lx)", class($op), $$op)); + $op->$method($level); + $ppname = $op->name; + if ($ppname =~ + /^(or|and|mapwhile|grepwhile|entertry|range|cond_expr)$/) + { + print $prefix, uc($1), " => {\n"; + walkoptree_exec($op->other, $method, $level + 1); + print $prefix, "}\n"; + } elsif ($ppname eq "match" || $ppname eq "subst") { + my $pmreplstart = $op->pmreplstart; + if ($$pmreplstart) { + print $prefix, "PMREPLSTART => {\n"; + walkoptree_exec($pmreplstart, $method, $level + 1); + print $prefix, "}\n"; + } + } elsif ($ppname eq "substcont") { + print $prefix, "SUBSTCONT => {\n"; + walkoptree_exec($op->other->pmreplstart, $method, $level + 1); + print $prefix, "}\n"; + $op = $op->other; + } elsif ($ppname eq "enterloop") { + print $prefix, "REDO => {\n"; + walkoptree_exec($op->redoop, $method, $level + 1); + print $prefix, "}\n", $prefix, "NEXT => {\n"; + walkoptree_exec($op->nextop, $method, $level + 1); + print $prefix, "}\n", $prefix, "LAST => {\n"; + walkoptree_exec($op->lastop, $method, $level + 1); + print $prefix, "}\n"; + } elsif ($ppname eq "subst") { + my $replstart = $op->pmreplstart; + if ($$replstart) { + print $prefix, "SUBST => {\n"; + walkoptree_exec($replstart, $method, $level + 1); + print $prefix, "}\n"; + } + } + } +} + +sub walksymtable { + my ($symref, $method, $recurse, $prefix) = @_; + my $sym; + my $ref; + my $fullname; + no strict 'refs'; + $prefix = '' unless defined $prefix; + while (($sym, $ref) = each %$symref) { + $fullname = "*main::".$prefix.$sym; + if ($sym =~ /::$/) { + $sym = $prefix . $sym; + if ($sym ne "main::" && $sym ne "::" && &$recurse($sym)) { + walksymtable(\%$fullname, $method, $recurse, $sym); + } + } else { + svref_2object(\*$fullname)->$method(); + } + } +} + +{ + package B::Section; + my $output_fh; + my %sections; + + sub new { + my ($class, $section, $symtable, $default) = @_; + $output_fh ||= FileHandle->new_tmpfile; + my $obj = bless [-1, $section, $symtable, $default], $class; + $sections{$section} = $obj; + return $obj; + } + + sub get { + my ($class, $section) = @_; + return $sections{$section}; + } + + sub add { + my $section = shift; + while (defined($_ = shift)) { + print $output_fh "$section->[1]\t$_\n"; + $section->[0]++; + } + } + + sub index { + my $section = shift; + return $section->[0]; + } + + sub name { + my $section = shift; + return $section->[1]; + } + + sub symtable { + my $section = shift; + return $section->[2]; + } + + sub default { + my $section = shift; + return $section->[3]; + } + + sub output { + my ($section, $fh, $format) = @_; + my $name = $section->name; + my $sym = $section->symtable || {}; + my $default = $section->default; + + seek($output_fh, 0, 0); + while (<$output_fh>) { + chomp; + s/^(.*?)\t//; + if ($1 eq $name) { + s{(s\\_[0-9a-f]+)} { + exists($sym->{$1}) ? $sym->{$1} : $default; + }ge; + printf $fh $format, $_; + } + } + } +} + +XSLoader::load 'B'; + +1; + +__END__ + +=head1 NAME + +B - The Perl Compiler + +=head1 SYNOPSIS + + use B; + +=head1 DESCRIPTION + +The C module supplies classes which allow a Perl program to delve +into its own innards. It is the module used to implement the +"backends" of the Perl compiler. Usage of the compiler does not +require knowledge of this module: see the F module for the +user-visible part. The C module is of use to those who want to +write new compiler backends. This documentation assumes that the +reader knows a fair amount about perl's internals including such +things as SVs, OPs and the internal symbol table and syntax tree +of a program. + +=head1 OVERVIEW OF CLASSES + +The C structures used by Perl's internals to hold SV and OP +information (PVIV, AV, HV, ..., OP, SVOP, UNOP, ...) are modelled on a +class hierarchy and the C module gives access to them via a true +object hierarchy. Structure fields which point to other objects +(whether types of SV or types of OP) are represented by the C +module as Perl objects of the appropriate class. The bulk of the C +module is the methods for accessing fields of these structures. Note +that all access is read-only: you cannot modify the internals by +using this module. + +=head2 SV-RELATED CLASSES + +B::IV, B::NV, B::RV, B::PV, B::PVIV, B::PVNV, B::PVMG, B::BM, B::PVLV, +B::AV, B::HV, B::CV, B::GV, B::FM, B::IO. These classes correspond in +the obvious way to the underlying C structures of similar names. The +inheritance hierarchy mimics the underlying C "inheritance". Access +methods correspond to the underlying C macros for field access, +usually with the leading "class indication" prefix removed (Sv, Av, +Hv, ...). The leading prefix is only left in cases where its removal +would cause a clash in method name. For example, C stays +as-is since its abbreviation would clash with the "superclass" method +C (corresponding to the C function C). + +=head2 B::SV METHODS + +=over 4 + +=item REFCNT + +=item FLAGS + +=back + +=head2 B::IV METHODS + +=over 4 + +=item IV + +Returns the value of the IV, I. This will be misleading +if C. Perhaps you want the +C method instead? + +=item IVX + +=item UVX + +=item int_value + +This method returns the value of the IV as an integer. +It differs from C in that it returns the correct +value regardless of whether it's stored signed or +unsigned. + +=item needs64bits + +=item packiv + +=back + +=head2 B::NV METHODS + +=over 4 + +=item NV + +=item NVX + +=back + +=head2 B::RV METHODS + +=over 4 + +=item RV + +=back + +=head2 B::PV METHODS + +=over 4 + +=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 RV + +Same as B::RV::RV, except that it will die() if the PV isn't +a reference. + +=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 + +=over 4 + +=item MAGIC + +=item SvSTASH + +=back + +=head2 B::MAGIC METHODS + +=over 4 + +=item MOREMAGIC + +=item precomp + +Only valid on r-magic, returns the string that generated the regexp. + +=item PRIVATE + +=item TYPE + +=item FLAGS + +=item OBJ + +Will die() if called on r-magic. + +=item PTR + +=item REGEX + +Only valid on r-magic, returns the integer value of the REGEX stored +in the MAGIC. + +=back + +=head2 B::PVLV METHODS + +=over 4 + +=item TARGOFF + +=item TARGLEN + +=item TYPE + +=item TARG + +=back + +=head2 B::BM METHODS + +=over 4 + +=item USEFUL + +=item PREVIOUS + +=item RARE + +=item TABLE + +=back + +=head2 B::GV METHODS + +=over 4 + +=item is_empty + +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 + +=item IO + +=item FORM + +=item AV + +=item HV + +=item EGV + +=item CV + +=item CVGEN + +=item LINE + +=item FILE + +=item FILEGV + +=item GvREFCNT + +=item FLAGS + +=back + +=head2 B::IO METHODS + +=over 4 + +=item LINES + +=item PAGE + +=item PAGE_LEN + +=item LINES_LEFT + +=item TOP_NAME + +=item TOP_GV + +=item FMT_NAME + +=item FMT_GV + +=item BOTTOM_NAME + +=item BOTTOM_GV + +=item SUBPROCESS + +=item IoTYPE + +=item IoFLAGS + +=item IsSTD + +Takes one arguments ( 'stdin' | 'stdout' | 'stderr' ) and returns true +if the IoIFP of the object is equal to the handle whose name was +passed as argument ( i.e. $io->IsSTD('stderr') is true if +IoIFP($io) == PerlIO_stdin() ). + +=back + +=head2 B::AV METHODS + +=over 4 + +=item FILL + +=item MAX + +=item OFF + +=item ARRAY + +=item AvFLAGS + +=back + +=head2 B::CV METHODS + +=over 4 + +=item STASH + +=item START + +=item ROOT + +=item GV + +=item FILE + +=item DEPTH + +=item PADLIST + +=item OUTSIDE + +=item XSUB + +=item XSUBANY + +For constant subroutines, returns the constant SV returned by the subroutine. + +=item CvFLAGS + +=item const_sv + +=back + +=head2 B::HV METHODS + +=over 4 + +=item FILL + +=item MAX + +=item KEYS + +=item RITER + +=item NAME + +=item PMROOT + +=item ARRAY + +=back + +=head2 OP-RELATED CLASSES + +B::OP, B::UNOP, B::BINOP, B::LOGOP, B::LISTOP, B::PMOP, +B::SVOP, B::PADOP, B::PVOP, B::CVOP, B::LOOP, B::COP. +These classes correspond in +the obvious way to the underlying C structures of similar names. The +inheritance hierarchy mimics the underlying C "inheritance". Access +methods correspond to the underlying C structre field names, with the +leading "class indication" prefix removed (op_). + +=head2 B::OP METHODS + +=over 4 + +=item next + +=item sibling + +=item name + +This returns the op name as a string (e.g. "add", "rv2av"). + +=item ppaddr + +This returns the function name as a string (e.g. "PL_ppaddr[OP_ADD]", +"PL_ppaddr[OP_RV2AV]"). + +=item desc + +This returns the op description from the global C PL_op_desc array +(e.g. "addition" "array deref"). + +=item targ + +=item type + +=item seq + +=item flags + +=item private + +=back + +=head2 B::UNOP METHOD + +=over 4 + +=item first + +=back + +=head2 B::BINOP METHOD + +=over 4 + +=item last + +=back + +=head2 B::LOGOP METHOD + +=over 4 + +=item other + +=back + +=head2 B::LISTOP METHOD + +=over 4 + +=item children + +=back + +=head2 B::PMOP METHODS + +=over 4 + +=item pmreplroot + +=item pmreplstart + +=item pmnext + +=item pmregexp + +=item pmflags + +=item pmdynflags + +=item pmpermflags + +=item precomp + +=item pmoffet + +Only when perl was compiled with ithreads. + +=back + +=head2 B::SVOP METHOD + +=over 4 + +=item sv + +=item gv + +=back + +=head2 B::PADOP METHOD + +=over 4 + +=item padix + +=back + +=head2 B::PVOP METHOD + +=over 4 + +=item pv + +=back + +=head2 B::LOOP METHODS + +=over 4 + +=item redoop + +=item nextop + +=item lastop + +=back + +=head2 B::COP METHODS + +=over 4 + +=item label + +=item stash + +=item file + +=item cop_seq + +=item arybase + +=item line + +=back + +=head1 FUNCTIONS EXPORTED BY C + +The C module exports a variety of functions: some are simple +utility functions, others provide a Perl program with a way to +get an initial "handle" on an internal object. + +=over 4 + +=item main_cv + +Return the (faked) CV corresponding to the main part of the Perl +program. + +=item init_av + +Returns the AV object (i.e. in class B::AV) representing INIT blocks. + +=item begin_av + +Returns the AV object (i.e. in class B::AV) representing BEGIN blocks. + +=item end_av + +Returns the AV object (i.e. in class B::AV) representing END blocks. + +=item main_root + +Returns the root op (i.e. an object in the appropriate B::OP-derived +class) of the main part of the Perl program. + +=item main_start + +Returns the starting op of the main part of the Perl program. + +=item comppadlist + +Returns the AV object (i.e. in class B::AV) of the global comppadlist. + +=item regex_padav + +Only when perl was compiled with ithreads. + +=item sv_undef + +Returns the SV object corresponding to the C variable C. + +=item sv_yes + +Returns the SV object corresponding to the C variable C. + +=item sv_no + +Returns the SV object corresponding to the C variable C. + +=item amagic_generation + +Returns the SV object corresponding to the C variable C. + +=item walkoptree(OP, METHOD) + +Does a tree-walk of the syntax tree based at OP and calls METHOD on +each op it visits. Each node is visited before its children. If +C (q.v.) has been called to turn debugging on then +the method C is called on each op before METHOD is +called. + +=item walkoptree_debug(DEBUG) + +Returns the current debugging flag for C. If the optional +DEBUG argument is non-zero, it sets the debugging flag to that. See +the description of C above for what the debugging flag +does. + +=item walksymtable(SYMREF, METHOD, RECURSE, PREFIX) + +Walk the symbol table starting at SYMREF and call METHOD on each +symbol (a B::GV object) visited. When the walk reaches package +symbols (such as "Foo::") it invokes RECURSE, passing in the symbol +name, and only recurses into the package if that sub returns true. + +PREFIX is the name of the SYMREF you're walking. + +For example... + + # Walk CGI's symbol table calling print_subs on each symbol. + # Only recurse into CGI::Util:: + walksymtable(\%CGI::, 'print_subs', sub { $_[0] eq 'CGI::Util::' }, + 'CGI::'); + +print_subs() is a B::GV method you have declared. + + +=item svref_2object(SV) + +Takes any Perl variable and turns it into an object in the +appropriate B::OP-derived or B::SV-derived class. Apart from functions +such as C, this is the primary way to get an initial +"handle" on an internal perl data structure which can then be followed +with the other access methods. + +=item ppname(OPNUM) + +Return the PP function name (e.g. "pp_add") of op number OPNUM. + +=item hash(STR) + +Returns a string in the form "0x..." representing the value of the +internal hash function used by perl on string STR. + +=item cast_I32(I) + +Casts I to the internal I32 type used by that perl. + + +=item minus_c + +Does the equivalent of the C<-c> command-line option. Obviously, this +is only useful in a BEGIN block or else the flag is set too late. + + +=item cstring(STR) + +Returns a double-quote-surrounded escaped version of STR which can +be used as a string in C source code. + +=item perlstring(STR) + +Returns a double-quote-surrounded escaped version of STR which can +be used as a string in Perl source code. + +=item class(OBJ) + +Returns the class of an object without the part of the classname +preceding the first "::". This is used to turn "B::UNOP" into +"UNOP" for example. + +=item threadsv_names + +In a perl compiled for threads, this returns a list of the special +per-thread threadsv variables. + +=back + +=head1 AUTHOR + +Malcolm Beattie, C + +=cut diff --git a/Master/perltl/lib/B/Deparse.pm b/Master/perltl/lib/B/Deparse.pm new file mode 100644 index 00000000000..924f4366d66 --- /dev/null +++ b/Master/perltl/lib/B/Deparse.pm @@ -0,0 +1,4233 @@ +# B::Deparse.pm +# 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. + +# This is based on the module of the same name by Malcolm Beattie, +# but essentially none of his code remains. + +package B::Deparse; +use Carp; +use B qw(class main_root main_start main_cv svref_2object opnumber perlstring + OPf_WANT OPf_WANT_VOID OPf_WANT_SCALAR OPf_WANT_LIST + OPf_KIDS OPf_REF OPf_STACKED OPf_SPECIAL OPf_MOD + OPpLVAL_INTRO OPpOUR_INTRO OPpENTERSUB_AMPER OPpSLICE OPpCONST_BARE + OPpTRANS_SQUASH OPpTRANS_DELETE OPpTRANS_COMPLEMENT OPpTARGET_MY + OPpCONST_ARYBASE OPpEXISTS_SUB OPpSORT_NUMERIC OPpSORT_INTEGER + OPpSORT_REVERSE + SVf_IOK SVf_NOK SVf_ROK SVf_POK SVpad_OUR + CVf_METHOD CVf_LOCKED CVf_LVALUE + PMf_KEEP PMf_GLOBAL PMf_CONTINUE PMf_EVAL PMf_ONCE PMf_SKIPWHITE + PMf_MULTILINE PMf_SINGLELINE PMf_FOLD PMf_EXTENDED); +$VERSION = 0.63; +use strict; +use vars qw/$AUTOLOAD/; +use warnings (); + +# Changes between 0.50 and 0.51: +# - fixed nulled leave with live enter in sort { } +# - fixed reference constants (\"str") +# - handle empty programs gracefully +# - handle infinte loops (for (;;) {}, while (1) {}) +# - differentiate between `for my $x ...' and `my $x; for $x ...' +# - various minor cleanups +# - moved globals into an object +# - added `-u', like B::C +# - package declarations using cop_stash +# - subs, formats and code sorted by cop_seq +# Changes between 0.51 and 0.52: +# - added pp_threadsv (special variables under USE_5005THREADS) +# - added documentation +# Changes between 0.52 and 0.53: +# - many changes adding precedence contexts and associativity +# - added `-p' and `-s' output style options +# - various other minor fixes +# Changes between 0.53 and 0.54: +# - added support for new `for (1..100)' optimization, +# thanks to Gisle Aas +# Changes between 0.54 and 0.55: +# - added support for new qr// construct +# - added support for new pp_regcreset OP +# Changes between 0.55 and 0.56: +# - tested on base/*.t, cmd/*.t, comp/*.t, io/*.t +# - fixed $# on non-lexicals broken in last big rewrite +# - added temporary fix for change in opcode of OP_STRINGIFY +# - fixed problem in 0.54's for() patch in `for (@ary)' +# - fixed precedence in conditional of ?: +# - tweaked list paren elimination in `my($x) = @_' +# - made continue-block detection trickier wrt. null ops +# - fixed various prototype problems in pp_entersub +# - added support for sub prototypes that never get GVs +# - added unquoting for special filehandle first arg in truncate +# - print doubled rv2gv (a bug) as `*{*GV}' instead of illegal `**GV' +# - added semicolons at the ends of blocks +# - added -l `#line' declaration option -- fixes cmd/subval.t 27,28 +# Changes between 0.56 and 0.561: +# - fixed multiply-declared my var in pp_truncate (thanks to Sarathy) +# - used new B.pm symbolic constants (done by Nick Ing-Simmons) +# Changes between 0.561 and 0.57: +# - stylistic changes to symbolic constant stuff +# - handled scope in s///e replacement code +# - added unquote option for expanding "" into concats, etc. +# - split method and proto parts of pp_entersub into separate functions +# - various minor cleanups +# Changes after 0.57: +# - added parens in \&foo (patch by Albert Dvornik) +# Changes between 0.57 and 0.58: +# - fixed `0' statements that weren't being printed +# - added methods for use from other programs +# (based on patches from James Duncan and Hugo van der Sanden) +# - added -si and -sT to control indenting (also based on a patch from Hugo) +# - added -sv to print something else instead of '???' +# - preliminary version of utf8 tr/// handling +# Changes after 0.58: +# - uses of $op->ppaddr changed to new $op->name (done by Sarathy) +# - added support for Hugo's new OP_SETSTATE (like nextstate) +# Changes between 0.58 and 0.59 +# - added support for Chip's OP_METHOD_NAMED +# - added support for Ilya's OPpTARGET_MY optimization +# - elided arrows before `()' subscripts when possible +# 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 +# Changes between 0.60 and 0.61 (mostly by Robin Houston) +# - many bug-fixes +# - support for pragmas and 'use' +# - support for the little-used $[ variable +# - support for __DATA__ sections +# - UTF8 support +# - BEGIN, CHECK, INIT and END blocks +# - scoping of subroutine declarations fixed +# - compile-time output from the input program can be suppressed, so that the +# output is just the deparsed code. (a change to O.pm in fact) +# - our() declarations +# - *all* the known bugs are now listed in the BUGS section +# - comprehensive test mechanism (TEST -deparse) +# Changes between 0.62 and 0.63 (mostly by Rafael Garcia-Suarez) +# - bug-fixes +# - new switch -P +# - support for command-line switches (-l, -0, etc.) + +# Todo: +# (See also BUGS section at the end of this file) +# +# - finish tr/// changes +# - add option for even more parens (generalize \&foo change) +# - left/right context +# - treat top-level block specially for incremental output +# - copy comments (look at real text with $^P?) +# - avoid semis in one-statement blocks +# - associativity of &&=, ||=, ?: +# - ',' => '=>' (auto-unquote?) +# - break long lines ("\r" as discretionary break?) +# - configurable syntax highlighting: ANSI color, HTML, TeX, etc. +# - more style options: brace style, hex vs. octal, quotes, ... +# - print big ints as hex/octal instead of decimal (heuristic?) +# - handle `my $x if 0'? +# - coordinate with Data::Dumper (both directions? see previous) +# - version using op_next instead of op_first/sibling? +# - avoid string copies (pass arrays, one big join?) +# - here-docs? + +# Tests that will always fail: +# (see t/TEST for the short list) + +# Object fields (were globals): +# +# avoid_local: +# (local($a), local($b)) and local($a, $b) have the same internal +# representation but the short form looks better. We notice we can +# use a large-scale local when checking the list, but need to prevent +# individual locals too. This hash holds the addresses of OPs that +# have already had their local-ness accounted for. The same thing +# is done with my(). +# +# curcv: +# CV for current sub (or main program) being deparsed +# +# curcvlex: +# Cached hash of lexical variables for curcv: keys are names, +# each value is an array of pairs, indicating the cop_seq of scopes +# in which a var of that name is valid. +# +# curcop: +# COP for statement being deparsed +# +# curstash: +# name of the current package for deparsed code +# +# subs_todo: +# array of [cop_seq, CV, is_format?] for subs and formats we still +# want to deparse +# +# protos_todo: +# as above, but [name, prototype] for subs that never got a GV +# +# subs_done, forms_done: +# keys are addresses of GVs for subs and formats we've already +# deparsed (or at least put into subs_todo) +# +# subs_declared +# keys are names of subs for which we've printed declarations. +# That means we can omit parentheses from the arguments. +# +# subs_deparsed +# Keeps track of fully qualified names of all deparsed subs. +# +# parens: -p +# linenums: -l +# unquote: -q +# cuddle: ` ' or `\n', depending on -sC +# indent_size: -si +# use_tabs: -sT +# ex_const: -sv + +# A little explanation of how precedence contexts and associativity +# work: +# +# deparse() calls each per-op subroutine with an argument $cx (short +# for context, but not the same as the cx* in the perl core), which is +# a number describing the op's parents in terms of precedence, whether +# they're inside an expression or at statement level, etc. (see +# chart below). When ops with children call deparse on them, they pass +# along their precedence. Fractional values are used to implement +# associativity (`($x + $y) + $z' => `$x + $y + $y') and related +# parentheses hacks. The major disadvantage of this scheme is that +# it doesn't know about right sides and left sides, so say if you +# assign a listop to a variable, it can't tell it's allowed to leave +# the parens off the listop. + +# Precedences: +# 26 [TODO] inside interpolation context ("") +# 25 left terms and list operators (leftward) +# 24 left -> +# 23 nonassoc ++ -- +# 22 right ** +# 21 right ! ~ \ and unary + and - +# 20 left =~ !~ +# 19 left * / % x +# 18 left + - . +# 17 left << >> +# 16 nonassoc named unary operators +# 15 nonassoc < > <= >= lt gt le ge +# 14 nonassoc == != <=> eq ne cmp +# 13 left & +# 12 left | ^ +# 11 left && +# 10 left || +# 9 nonassoc .. ... +# 8 right ?: +# 7 right = += -= *= etc. +# 6 left , => +# 5 nonassoc list operators (rightward) +# 4 right not +# 3 left and +# 2 left or xor +# 1 statement modifiers +# 0 statement level + +# Also, lineseq may pass a fourth parameter to the pp_ routines: +# if present, the fourth parameter is passed on by deparse. +# +# If present and true, it means that the op exists directly as +# part of a lineseq. Currently it's only used by scopeop to +# decide whether its results need to be enclosed in a do {} block. + +# Nonprinting characters with special meaning: +# \cS - steal parens (see maybe_parens_unop) +# \n - newline and indent +# \t - increase indent +# \b - decrease indent (`outdent') +# \f - flush left (no indent) +# \cK - kill following semicolon, if any + +sub null { + my $op = shift; + return class($op) eq "NULL"; +} + +sub todo { + my $self = shift; + my($cv, $is_form) = @_; + return unless ($cv->FILE eq $0 || exists $self->{files}{$cv->FILE}); + my $seq; + if (!null($cv->START) and is_state($cv->START)) { + $seq = $cv->START->cop_seq; + } else { + $seq = 0; + } + push @{$self->{'subs_todo'}}, [$seq, $cv, $is_form]; + unless ($is_form || class($cv->STASH) eq 'SPECIAL') { + $self->{'subs_deparsed'}{$cv->STASH->NAME."::".$cv->GV->NAME} = 1; + } +} + +sub next_todo { + my $self = shift; + my $ent = shift @{$self->{'subs_todo'}}; + my $cv = $ent->[1]; + my $gv = $cv->GV; + my $name = $self->gv_name($gv); + if ($ent->[2]) { + return "format $name =\n" + . $self->deparse_format($ent->[1]). "\n"; + } else { + $self->{'subs_declared'}{$name} = 1; + if ($name eq "BEGIN") { + my $use_dec = $self->begin_is_use($cv); + if (defined ($use_dec)) { + return () if 0 == length($use_dec); + return $use_dec; + } + } + my $l = ''; + if ($self->{'linenums'}) { + my $line = $gv->LINE; + my $file = $gv->FILE; + $l = "\n\f#line $line \"$file\"\n"; + } + return "${l}sub $name " . $self->deparse_sub($cv); + } +} + +# Return a "use" declaration for this BEGIN block, if appropriate +sub begin_is_use { + my ($self, $cv) = @_; + my $root = $cv->ROOT; + local @$self{qw'curcv curcvlex'} = ($cv); +#require B::Debug; +#B::walkoptree($cv->ROOT, "debug"); + my $lineseq = $root->first; + return if $lineseq->name ne "lineseq"; + + my $req_op = $lineseq->first->sibling; + return if $req_op->name ne "require"; + + my $module; + if ($req_op->first->private & OPpCONST_BARE) { + # Actually it should always be a bareword + $module = $self->const_sv($req_op->first)->PV; + $module =~ s[/][::]g; + $module =~ s/.pm$//; + } + else { + $module = const($self->const_sv($req_op->first)); + } + + my $version; + my $version_op = $req_op->sibling; + return if class($version_op) eq "NULL"; + if ($version_op->name eq "lineseq") { + # We have a version parameter; skip nextstate & pushmark + my $constop = $version_op->first->next->next; + + return unless $self->const_sv($constop)->PV eq $module; + $constop = $constop->sibling; + $version = $self->const_sv($constop)->int_value; + $constop = $constop->sibling; + return if $constop->name ne "method_named"; + return if $self->const_sv($constop)->PV ne "VERSION"; + } + + $lineseq = $version_op->sibling; + return if $lineseq->name ne "lineseq"; + my $entersub = $lineseq->first->sibling; + if ($entersub->name eq "stub") { + return "use $module $version ();\n" if defined $version; + return "use $module ();\n"; + } + return if $entersub->name ne "entersub"; + + # See if there are import arguments + my $args = ''; + + my $svop = $entersub->first->sibling; # Skip over pushmark + return unless $self->const_sv($svop)->PV eq $module; + + # Pull out the arguments + for ($svop=$svop->sibling; $svop->name ne "method_named"; + $svop = $svop->sibling) { + $args .= ", " if length($args); + $args .= $self->deparse($svop, 6); + } + + my $use = 'use'; + my $method_named = $svop; + return if $method_named->name ne "method_named"; + my $method_name = $self->const_sv($method_named)->PV; + + if ($method_name eq "unimport") { + $use = 'no'; + } + + # Certain pragmas are dealt with using hint bits, + # so we ignore them here + if ($module eq 'strict' || $module eq 'integer' + || $module eq 'bytes' || $module eq 'warnings') { + return ""; + } + + if (defined $version && length $args) { + return "$use $module $version ($args);\n"; + } elsif (defined $version) { + return "$use $module $version;\n"; + } elsif (length $args) { + return "$use $module ($args);\n"; + } else { + return "$use $module;\n"; + } +} + +sub stash_subs { + my ($self, $pack) = @_; + my (@ret, $stash); + if (!defined $pack) { + $pack = ''; + $stash = \%::; + } + else { + $pack =~ s/(::)?$/::/; + no strict 'refs'; + $stash = \%$pack; + } + my %stash = svref_2object($stash)->ARRAY; + while (my ($key, $val) = each %stash) { + next if $key eq 'main::'; # avoid infinite recursion + my $class = class($val); + if ($class eq "PV") { + # Just a prototype. As an ugly but fairly effective way + # to find out if it belongs here is to see if the AUTOLOAD + # (if any) for the stash was defined in one of our files. + my $A = $stash{"AUTOLOAD"}; + if (defined ($A) && class($A) eq "GV" && defined($A->CV) + && class($A->CV) eq "CV") { + my $AF = $A->FILE; + next unless $AF eq $0 || exists $self->{'files'}{$AF}; + } + push @{$self->{'protos_todo'}}, [$pack . $key, $val->PV]; + } elsif ($class eq "IV") { + # Just a name. As above. + my $A = $stash{"AUTOLOAD"}; + if (defined ($A) && class($A) eq "GV" && defined($A->CV) + && class($A->CV) eq "CV") { + my $AF = $A->FILE; + next unless $AF eq $0 || exists $self->{'files'}{$AF}; + } + push @{$self->{'protos_todo'}}, [$pack . $key, undef]; + } elsif ($class eq "GV") { + if (class(my $cv = $val->CV) ne "SPECIAL") { + next if $self->{'subs_done'}{$$val}++; + next if $$val != ${$cv->GV}; # Ignore imposters + $self->todo($cv, 0); + } + if (class(my $cv = $val->FORM) ne "SPECIAL") { + next if $self->{'forms_done'}{$$val}++; + next if $$val != ${$cv->GV}; # Ignore imposters + $self->todo($cv, 1); + } + if (class($val->HV) ne "SPECIAL" && $key =~ /::$/) { + $self->stash_subs($pack . $key); + } + } + } +} + +sub print_protos { + my $self = shift; + my $ar; + my @ret; + foreach $ar (@{$self->{'protos_todo'}}) { + my $proto = (defined $ar->[1] ? " (". $ar->[1] . ")" : ""); + push @ret, "sub " . $ar->[0] . "$proto;\n"; + } + delete $self->{'protos_todo'}; + return @ret; +} + +sub style_opts { + my $self = shift; + my $opts = shift; + my $opt; + while (length($opt = substr($opts, 0, 1))) { + if ($opt eq "C") { + $self->{'cuddle'} = " "; + $opts = substr($opts, 1); + } elsif ($opt eq "i") { + $opts =~ s/^i(\d+)//; + $self->{'indent_size'} = $1; + } elsif ($opt eq "T") { + $self->{'use_tabs'} = 1; + $opts = substr($opts, 1); + } elsif ($opt eq "v") { + $opts =~ s/^v([^.]*)(.|$)//; + $self->{'ex_const'} = $1; + } + } +} + +sub new { + my $class = shift; + my $self = bless {}, $class; + $self->{'subs_todo'} = []; + $self->{'files'} = {}; + $self->{'curstash'} = "main"; + $self->{'curcop'} = undef; + $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'} = "'???'"; + + $self->{'ambient_arybase'} = 0; + $self->{'ambient_warnings'} = undef; # Assume no lexical warnings + $self->{'ambient_hints'} = 0; + $self->init(); + + while (my $arg = shift @_) { + if ($arg =~ /^-f(.*)/) { + $self->{'files'}{$1} = 1; + } elsif ($arg eq "-p") { + $self->{'parens'} = 1; + } elsif ($arg eq "-P") { + $self->{'noproto'} = 1; + } elsif ($arg eq "-l") { + $self->{'linenums'} = 1; + } elsif ($arg eq "-q") { + $self->{'unquote'} = 1; + } elsif (substr($arg, 0, 2) eq "-s") { + $self->style_opts(substr $arg, 2); + } elsif ($arg =~ /^-x(\d)$/) { + $self->{'expand'} = $1; + } + } + return $self; +} + +{ + # Mask out the bits that L uses + my $WARN_MASK; + BEGIN { + $WARN_MASK = $warnings::Bits{all} | $warnings::DeadBits{all}; + } + sub WARN_MASK () { + return $WARN_MASK; + } +} + +# Initialise the contextual information, either from +# defaults provided with the ambient_pragmas method, +# or from perl's own defaults otherwise. +sub init { + my $self = shift; + + $self->{'arybase'} = $self->{'ambient_arybase'}; + $self->{'warnings'} = defined ($self->{'ambient_warnings'}) + ? $self->{'ambient_warnings'} & WARN_MASK + : undef; + $self->{'hints'} = $self->{'ambient_hints'} & 0xFF; + + # also a convenient place to clear out subs_declared + delete $self->{'subs_declared'}; +} + +sub compile { + my(@args) = @_; + return sub { + my $self = B::Deparse->new(@args); + # First deparse command-line args + if (defined $^I) { # deparse -i + print q(BEGIN { $^I = ).perlstring($^I).qq(; }\n); + } + if ($^W) { # deparse -w + print qq(BEGIN { \$^W = $^W; }\n); + } + if ($/ ne "\n" or defined $O::savebackslash) { # deparse -l and -0 + my $fs = perlstring($/) || 'undef'; + my $bs = perlstring($O::savebackslash) || 'undef'; + print qq(BEGIN { \$/ = $fs; \$\\ = $bs; }\n); + } + my @BEGINs = B::begin_av->isa("B::AV") ? B::begin_av->ARRAY : (); + my @INITs = B::init_av->isa("B::AV") ? B::init_av->ARRAY : (); + my @ENDs = B::end_av->isa("B::AV") ? B::end_av->ARRAY : (); + for my $block (@BEGINs, @INITs, @ENDs) { + $self->todo($block, 0); + } + $self->stash_subs(); + $self->{'curcv'} = main_cv; + $self->{'curcvlex'} = undef; + print $self->print_protos; + @{$self->{'subs_todo'}} = + sort {$a->[0] <=> $b->[0]} @{$self->{'subs_todo'}}; + print $self->indent($self->deparse(main_root, 0)), "\n" + unless null main_root; + my @text; + while (scalar(@{$self->{'subs_todo'}})) { + push @text, $self->next_todo; + } + print $self->indent(join("", @text)), "\n" if @text; + + # Print __DATA__ section, if necessary + no strict 'refs'; + my $laststash = defined $self->{'curcop'} + ? $self->{'curcop'}->stash->NAME : $self->{'curstash'}; + if (defined *{$laststash."::DATA"}{IO}) { + print "__DATA__\n"; + print readline(*{$laststash."::DATA"}); + } + } +} + +sub coderef2text { + my $self = shift; + my $sub = shift; + croak "Usage: ->coderef2text(CODEREF)" unless UNIVERSAL::isa($sub, "CODE"); + + $self->init(); + return $self->indent($self->deparse_sub(svref_2object($sub))); +} + +sub ambient_pragmas { + my $self = shift; + my ($arybase, $hint_bits, $warning_bits) = (0, 0); + + while (@_ > 1) { + my $name = shift(); + my $val = shift(); + + if ($name eq 'strict') { + require strict; + + if ($val eq 'none') { + $hint_bits &= ~strict::bits(qw/refs subs vars/); + next(); + } + + my @names; + if ($val eq "all") { + @names = qw/refs subs vars/; + } + elsif (ref $val) { + @names = @$val; + } + else { + @names = split' ', $val; + } + $hint_bits |= strict::bits(@names); + } + + elsif ($name eq '$[') { + $arybase = $val; + } + + elsif ($name eq 'integer' + || $name eq 'bytes' + || $name eq 'utf8') { + require "$name.pm"; + if ($val) { + $hint_bits |= ${$::{"${name}::"}{"hint_bits"}}; + } + else { + $hint_bits &= ~${$::{"${name}::"}{"hint_bits"}}; + } + } + + elsif ($name eq 're') { + require re; + if ($val eq 'none') { + $hint_bits &= ~re::bits(qw/taint eval/); + next(); + } + + my @names; + if ($val eq 'all') { + @names = qw/taint eval/; + } + elsif (ref $val) { + @names = @$val; + } + else { + @names = split' ',$val; + } + $hint_bits |= re::bits(@names); + } + + elsif ($name eq 'warnings') { + if ($val eq 'none') { + $warning_bits = $warnings::NONE; + next(); + } + + my @names; + if (ref $val) { + @names = @$val; + } + else { + @names = split/\s+/, $val; + } + + $warning_bits = $warnings::NONE if !defined ($warning_bits); + $warning_bits |= warnings::bits(@names); + } + + elsif ($name eq 'warning_bits') { + $warning_bits = $val; + } + + elsif ($name eq 'hint_bits') { + $hint_bits = $val; + } + + else { + croak "Unknown pragma type: $name"; + } + } + if (@_) { + croak "The ambient_pragmas method expects an even number of args"; + } + + $self->{'ambient_arybase'} = $arybase; + $self->{'ambient_warnings'} = $warning_bits; + $self->{'ambient_hints'} = $hint_bits; +} + +sub deparse { + my $self = shift; + my($op, $cx, $flags) = @_; + + Carp::confess("Null op in deparse") if !defined($op) + || class($op) eq "NULL"; + my $meth = "pp_" . $op->name; + if (is_scope($op)) { + return $self->$meth($op, $cx, $flags); + } + return $self->$meth($op, $cx); +} + +sub indent { + my $self = shift; + my $txt = shift; + my @lines = split(/\n/, $txt); + my $leader = ""; + my $level = 0; + my $line; + for $line (@lines) { + my $cmd = substr($line, 0, 1); + if ($cmd eq "\t" or $cmd eq "\b") { + $level += ($cmd eq "\t" ? 1 : -1) * $self->{'indent_size'}; + if ($self->{'use_tabs'}) { + $leader = "\t" x ($level / 8) . " " x ($level % 8); + } else { + $leader = " " x $level; + } + $line = substr($line, 1); + } + if (substr($line, 0, 1) eq "\f") { + $line = substr($line, 1); # no indent + } else { + $line = $leader . $line; + } + $line =~ s/\cK;?//g; + } + return join("\n", @lines); +} + +sub deparse_sub { + my $self = shift; + my $cv = shift; + my $proto = ""; +Carp::confess("NULL in deparse_sub") if !defined($cv) || $cv->isa("B::NULL"); +Carp::confess("SPECIAL in deparse_sub") if $cv->isa("B::SPECIAL"); + local $self->{'curcop'} = $self->{'curcop'}; + 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->{'curcvlex'}); + local(@$self{qw'curstash warnings hints'}) + = @$self{qw'curstash warnings hints'}; + my $body; + if (not null $cv->ROOT) { + my $lineseq = $cv->ROOT->first; + if ($lineseq->name eq "lineseq") { + my @ops; + for(my$o=$lineseq->first; $$o; $o=$o->sibling) { + push @ops, $o; + } + $body = $self->lineseq(undef, @ops).";"; + my $scope_en = $self->find_scope_en($lineseq); + if (defined $scope_en) { + my $subs = join"", $self->seq_subs($scope_en); + $body .= ";\n$subs" if length($subs); + } + } + else { + $body = $self->deparse($cv->ROOT->first, 0); + } + } + else { + my $sv = $cv->const_sv; + if ($$sv) { + # uh-oh. inlinable sub... format it differently + return $proto . "{ " . const($sv) . " }\n"; + } else { # XSUB? (or just a declaration) + return "$proto;\n"; + } + } + return $proto ."{\n\t$body\n\b}" ."\n"; +} + +sub deparse_format { + my $self = shift; + my $form = shift; + my @text; + local($self->{'curcv'}) = $form; + local($self->{'curcvlex'}); + local($self->{'in_format'}) = 1; + local(@$self{qw'curstash warnings hints'}) + = @$self{qw'curstash warnings hints'}; + my $op = $form->ROOT; + my $kid; + return "\f." if $op->first->name eq 'stub' + || $op->first->name eq 'nextstate'; + $op = $op->first->first; # skip leavewrite, lineseq + while (not null $op) { + $op = $op->sibling; # skip nextstate + my @exprs; + $kid = $op->first->sibling; # skip pushmark + push @text, "\f".$self->const_sv($kid)->PV; + $kid = $kid->sibling; + for (; not null $kid; $kid = $kid->sibling) { + push @exprs, $self->deparse($kid, 0); + } + push @text, "\f".join(", ", @exprs)."\n" if @exprs; + $op = $op->sibling; + } + return join("", @text) . "\f."; +} + +sub is_scope { + my $op = shift; + return $op->name eq "leave" || $op->name eq "scope" + || $op->name eq "lineseq" + || ($op->name eq "null" && class($op) eq "UNOP" + && (is_scope($op->first) || $op->first->name eq "enter")); +} + +sub is_state { + my $name = $_[0]->name; + return $name eq "nextstate" || $name eq "dbstate" || $name eq "setstate"; +} + +sub is_miniwhile { # check for one-line loop (`foo() while $y--') + my $op = shift; + return (!null($op) and null($op->sibling) + and $op->name eq "null" and class($op) eq "UNOP" + and (($op->first->name =~ /^(and|or)$/ + and $op->first->first->sibling->name eq "lineseq") + or ($op->first->name eq "lineseq" + and not null $op->first->first->sibling + and $op->first->first->sibling->name eq "unstack") + )); +} + +sub is_scalar { + my $op = shift; + return ($op->name eq "rv2sv" or + $op->name eq "padsv" or + $op->name eq "gv" or # only in array/hash constructs + $op->flags & OPf_KIDS && !null($op->first) + && $op->first->name eq "gvsv"); +} + +sub maybe_parens { + my $self = shift; + my($text, $cx, $prec) = @_; + if ($prec < $cx # unary ops nest just fine + or $prec == $cx and $cx != 4 and $cx != 16 and $cx != 21 + or $self->{'parens'}) + { + $text = "($text)"; + # In a unop, let parent reuse our parens; see maybe_parens_unop + $text = "\cS" . $text if $cx == 16; + return $text; + } else { + return $text; + } +} + +# same as above, but get around the `if it looks like a function' rule +sub maybe_parens_unop { + my $self = shift; + my($name, $kid, $cx) = @_; + if ($cx > 16 or $self->{'parens'}) { + $kid = $self->deparse($kid, 1); + if ($name eq "umask" && $kid =~ /^\d+$/) { + $kid = sprintf("%#o", $kid); + } + return "$name($kid)"; + } else { + $kid = $self->deparse($kid, 16); + if ($name eq "umask" && $kid =~ /^\d+$/) { + $kid = sprintf("%#o", $kid); + } + if (substr($kid, 0, 1) eq "\cS") { + # use kid's parens + return $name . substr($kid, 1); + } elsif (substr($kid, 0, 1) eq "(") { + # avoid looks-like-a-function trap with extra parens + # (`+' can lead to ambiguities) + return "$name(" . $kid . ")"; + } else { + return "$name $kid"; + } + } +} + +sub maybe_parens_func { + my $self = shift; + my($func, $text, $cx, $prec) = @_; + if ($prec <= $cx or substr($text, 0, 1) eq "(" or $self->{'parens'}) { + return "$func($text)"; + } else { + return "$func $text"; + } +} + +sub maybe_local { + my $self = shift; + my($op, $cx, $text) = @_; + my $our_intro = ($op->name =~ /^(gv|rv2)[ash]v$/) ? OPpOUR_INTRO : 0; + if ($op->private & (OPpLVAL_INTRO|$our_intro) + and not $self->{'avoid_local'}{$$op}) { + my $our_local = ($op->private & OPpLVAL_INTRO) ? "local" : "our"; + if (want_scalar($op)) { + return "$our_local $text"; + } else { + return $self->maybe_parens_func("$our_local", $text, $cx, 16); + } + } else { + return $text; + } +} + +sub maybe_targmy { + my $self = shift; + my($op, $cx, $func, @args) = @_; + if ($op->private & OPpTARGET_MY) { + my $var = $self->padname($op->targ); + my $val = $func->($self, $op, 7, @args); + return $self->maybe_parens("$var = $val", $cx, 7); + } else { + return $func->($self, $op, $cx, @args); + } +} + +sub padname_sv { + my $self = shift; + my $targ = shift; + return (($self->{'curcv'}->PADLIST->ARRAY)[0]->ARRAY)[$targ]; +} + +sub maybe_my { + my $self = shift; + my($op, $cx, $text) = @_; + if ($op->private & OPpLVAL_INTRO and not $self->{'avoid_local'}{$$op}) { + if (want_scalar($op)) { + return "my $text"; + } else { + return $self->maybe_parens_func("my", $text, $cx, 16); + } + } else { + return $text; + } +} + +# The following OPs don't have functions: + +# pp_padany -- does not exist after parsing + +sub AUTOLOAD { + if ($AUTOLOAD =~ s/^.*::pp_//) { + warn "unexpected OP_".uc $AUTOLOAD; + return "XXX"; + } else { + die "Undefined subroutine $AUTOLOAD called"; + } +} + +sub DESTROY {} # Do not AUTOLOAD + +# $root should be the op which represents the root of whatever +# we're sequencing here. If it's undefined, then we don't append +# any subroutine declarations to the deparsed ops, otherwise we +# append appropriate declarations. +sub lineseq { + my($self, $root, @ops) = @_; + my($expr, @exprs); + + my $out_cop = $self->{'curcop'}; + my $out_seq = defined($out_cop) ? $out_cop->cop_seq : undef; + my $limit_seq; + if (defined $root) { + $limit_seq = $out_seq; + my $nseq = $self->find_scope_st($root->sibling) if ${$root->sibling}; + $limit_seq = $nseq if !defined($limit_seq) + or defined($nseq) && $nseq < $limit_seq; + } + $limit_seq = $self->{'limit_seq'} + if defined($self->{'limit_seq'}) + && (!defined($limit_seq) || $self->{'limit_seq'} < $limit_seq); + local $self->{'limit_seq'} = $limit_seq; + for (my $i = 0; $i < @ops; $i++) { + $expr = ""; + if (is_state $ops[$i]) { + $expr = $self->deparse($ops[$i], 0); + $i++; + if ($i > $#ops) { + push @exprs, $expr; + last; + } + } + if (!is_state $ops[$i] and (my $ls = $ops[$i+1]) and + !null($ops[$i+1]) and $ops[$i+1]->name eq "lineseq") + { + if ($ls->first && !null($ls->first) && is_state($ls->first) + && (my $sib = $ls->first->sibling)) { + if (!null($sib) && $sib->name eq "leaveloop") { + push @exprs, $expr . $self->for_loop($ops[$i], 0); + $i++; + next; + } + } + } + $expr .= $self->deparse($ops[$i], 0, (@ops != 1)); + $expr =~ s/;\n?\z//; + push @exprs, $expr; + } + my $body = join(";\n", grep {length} @exprs); + my $subs = ""; + if (defined $root && defined $limit_seq && !$self->{'in_format'}) { + $subs = join "\n", $self->seq_subs($limit_seq); + } + return join(";\n", grep {length} $body, $subs); +} + +sub scopeop { + my($real_block, $self, $op, $cx, $flags) = @_; + my $kid; + my @kids; + + local(@$self{qw'curstash warnings hints'}) + = @$self{qw'curstash warnings hints'} 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"; + } + } else { + $kid = $op->first; + } + for (; !null($kid); $kid = $kid->sibling) { + push @kids, $kid; + } + if ($flags || $cx > 0) { # inside an expression, (a do {} while for lineseq) + return "do {\n\t" . $self->lineseq($op, @kids) . "\n\b}"; + } else { + my $lineseq = $self->lineseq($op, @kids); + return (length ($lineseq) ? "$lineseq;" : ""); + } +} + +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. +my %globalnames; +BEGIN { map($globalnames{$_}++, "SIG", "STDIN", "STDOUT", "STDERR", "INC", + "ENV", "ARGV", "ARGVOUT", "_"); } + +sub gv_name { + my $self = shift; + my $gv = shift; +Carp::confess() if $gv->isa("B::CV"); + my $stash = $gv->STASH->NAME; + my $name = $gv->SAFENAME; + if (($stash eq 'main' && $globalnames{$name}) + or ($stash eq $self->{'curstash'} && !$globalnames{$name}) + or $name =~ /^[^A-Za-z_]/) + { + $stash = ""; + } else { + $stash = $stash . "::"; + } + if ($name =~ /^(\^..|{)/) { + $name = "{$name}"; # ${^WARNING_BITS}, etc and ${ + } + return $stash . $name; +} + +# Return the name to use for a stash variable. +# If a lexical with the same name is in scope, it may need to be +# fully-qualified. +sub stash_variable { + my ($self, $prefix, $name) = @_; + + return "$prefix$name" if $name =~ /::/; + + unless ($prefix eq '$' || $prefix eq '@' || + $prefix eq '%' || $prefix eq '$#') { + return "$prefix$name"; + } + + my $v = ($prefix eq '$#' ? '@' : $prefix) . $name; + return $prefix .$self->{'curstash'}.'::'. $name if $self->lex_in_scope($v); + return "$prefix$name"; +} + +sub lex_in_scope { + my ($self, $name) = @_; + $self->populate_curcvlex() if !defined $self->{'curcvlex'}; + + return 0 if !defined($self->{'curcop'}); + my $seq = $self->{'curcop'}->cop_seq; + return 0 if !exists $self->{'curcvlex'}{$name}; + for my $a (@{$self->{'curcvlex'}{$name}}) { + my ($st, $en) = @$a; + return 1 if $seq > $st && $seq <= $en; + } + return 0; +} + +sub populate_curcvlex { + my $self = shift; + for (my $cv = $self->{'curcv'}; class($cv) eq "CV"; $cv = $cv->OUTSIDE) { + my @padlist = $cv->PADLIST->ARRAY; + my @ns = $padlist[0]->ARRAY; + + for (my $i=0; $i<@ns; ++$i) { + next if class($ns[$i]) eq "SPECIAL"; + next if $ns[$i]->FLAGS & SVpad_OUR; # Skip "our" vars + if (class($ns[$i]) eq "PV") { + # Probably that pesky lexical @_ + next; + } + my $name = $ns[$i]->PVX; + my $seq_st = $ns[$i]->NVX; + my $seq_en = int($ns[$i]->IVX); + + push @{$self->{'curcvlex'}{$name}}, [$seq_st, $seq_en]; + } + } +} + +sub find_scope_st { ((find_scope(@_))[0]); } +sub find_scope_en { ((find_scope(@_))[1]); } + +# Recurses down the tree, looking for pad variable introductions and COPs +sub find_scope { + my ($self, $op, $scope_st, $scope_en) = @_; + carp("Undefined op in find_scope") if !defined $op; + return ($scope_st, $scope_en) unless $op->flags & OPf_KIDS; + + for (my $o=$op->first; $$o; $o=$o->sibling) { + if ($o->name =~ /^pad.v$/ && $o->private & OPpLVAL_INTRO) { + my $s = int($self->padname_sv($o->targ)->NVX); + my $e = $self->padname_sv($o->targ)->IVX; + $scope_st = $s if !defined($scope_st) || $s < $scope_st; + $scope_en = $e if !defined($scope_en) || $e > $scope_en; + } + elsif (is_state($o)) { + my $c = $o->cop_seq; + $scope_st = $c if !defined($scope_st) || $c < $scope_st; + $scope_en = $c if !defined($scope_en) || $c > $scope_en; + } + elsif ($o->flags & OPf_KIDS) { + ($scope_st, $scope_en) = + $self->find_scope($o, $scope_st, $scope_en) + } + } + + return ($scope_st, $scope_en); +} + +# Returns a list of subs which should be inserted before the COP +sub cop_subs { + my ($self, $op, $out_seq) = @_; + my $seq = $op->cop_seq; + # If we have nephews, then our sequence number indicates + # the cop_seq of the end of some sort of scope. + if (class($op->sibling) ne "NULL" && $op->sibling->flags & OPf_KIDS + and my $nseq = $self->find_scope_st($op->sibling) ) { + $seq = $nseq; + } + $seq = $out_seq if defined($out_seq) && $out_seq < $seq; + return $self->seq_subs($seq); +} + +sub seq_subs { + my ($self, $seq) = @_; + my @text; +#push @text, "# ($seq)\n"; + + return "" if !defined $seq; + while (scalar(@{$self->{'subs_todo'}}) + and $seq > $self->{'subs_todo'}[0][0]) { + push @text, $self->next_todo; + } + return @text; +} + +# Notice how subs and formats are inserted between statements here; +# also $[ assignments and pragmas. +sub pp_nextstate { + my $self = shift; + my($op, $cx) = @_; + $self->{'curcop'} = $op; + my @text; + push @text, $self->cop_subs($op); + push @text, $op->label . ": " if $op->label; + my $stash = $op->stashpv; + if ($stash ne $self->{'curstash'}) { + push @text, "package $stash;\n"; + $self->{'curstash'} = $stash; + } + if ($self->{'linenums'}) { + push @text, "\f#line " . $op->line . + ' "' . $op->file, qq'"\n'; + } + + if ($self->{'arybase'} != $op->arybase) { + push @text, '$[ = '. $op->arybase .";\n"; + $self->{'arybase'} = $op->arybase; + } + + my $warnings = $op->warnings; + my $warning_bits; + if ($warnings->isa("B::SPECIAL") && $$warnings == 4) { + $warning_bits = $warnings::Bits{"all"} & WARN_MASK; + } + elsif ($warnings->isa("B::SPECIAL") && $$warnings == 5) { + $warning_bits = $warnings::NONE; + } + elsif ($warnings->isa("B::SPECIAL")) { + $warning_bits = undef; + } + else { + $warning_bits = $warnings->PV & WARN_MASK; + } + + if (defined ($warning_bits) and + !defined($self->{warnings}) || $self->{'warnings'} ne $warning_bits) { + push @text, declare_warnings($self->{'warnings'}, $warning_bits); + $self->{'warnings'} = $warning_bits; + } + + if ($self->{'hints'} != $op->private) { + push @text, declare_hints($self->{'hints'}, $op->private); + $self->{'hints'} = $op->private; + } + + return join("", @text); +} + +sub declare_warnings { + my ($from, $to) = @_; + if (($to & WARN_MASK) eq warnings::bits("all")) { + return "use warnings;\n"; + } + elsif (($to & WARN_MASK) eq "\0"x length($to)) { + return "no warnings;\n"; + } + return "BEGIN {\${^WARNING_BITS} = ".perlstring($to)."}\n"; +} + +sub declare_hints { + my ($from, $to) = @_; + my $use = $to & ~$from; + my $no = $from & ~$to; + my $decls = ""; + for my $pragma (hint_pragmas($use)) { + $decls .= "use $pragma;\n"; + } + for my $pragma (hint_pragmas($no)) { + $decls .= "no $pragma;\n"; + } + return $decls; +} + +sub hint_pragmas { + my ($bits) = @_; + my @pragmas; + push @pragmas, "integer" if $bits & 0x1; + push @pragmas, "strict 'refs'" if $bits & 0x2; + push @pragmas, "bytes" if $bits & 0x8; + return @pragmas; +} + +sub pp_dbstate { pp_nextstate(@_) } +sub pp_setstate { pp_nextstate(@_) } + +sub pp_unstack { return "" } # see also leaveloop + +sub baseop { + my $self = shift; + my($op, $cx, $name) = @_; + return $name; +} + +sub pp_stub { + my $self = shift; + my($op, $cx, $name) = @_; + if ($cx) { + return "()"; + } + else { + return "();"; + } +} +sub pp_wantarray { baseop(@_, "wantarray") } +sub pp_fork { baseop(@_, "fork") } +sub pp_wait { maybe_targmy(@_, \&baseop, "wait") } +sub pp_getppid { maybe_targmy(@_, \&baseop, "getppid") } +sub pp_time { maybe_targmy(@_, \&baseop, "time") } +sub pp_tms { baseop(@_, "times") } +sub pp_ghostent { baseop(@_, "gethostent") } +sub pp_gnetent { baseop(@_, "getnetent") } +sub pp_gprotoent { baseop(@_, "getprotoent") } +sub pp_gservent { baseop(@_, "getservent") } +sub pp_ehostent { baseop(@_, "endhostent") } +sub pp_enetent { baseop(@_, "endnetent") } +sub pp_eprotoent { baseop(@_, "endprotoent") } +sub pp_eservent { baseop(@_, "endservent") } +sub pp_gpwent { baseop(@_, "getpwent") } +sub pp_spwent { baseop(@_, "setpwent") } +sub pp_epwent { baseop(@_, "endpwent") } +sub pp_ggrent { baseop(@_, "getgrent") } +sub pp_sgrent { baseop(@_, "setgrent") } +sub pp_egrent { baseop(@_, "endgrent") } +sub pp_getlogin { baseop(@_, "getlogin") } + +sub POSTFIX () { 1 } + +# I couldn't think of a good short name, but this is the category of +# symbolic unary operators with interesting precedence + +sub pfixop { + my $self = shift; + my($op, $cx, $name, $prec, $flags) = (@_, 0); + my $kid = $op->first; + $kid = $self->deparse($kid, $prec); + return $self->maybe_parens(($flags & POSTFIX) ? "$kid$name" : "$name$kid", + $cx, $prec); +} + +sub pp_preinc { pfixop(@_, "++", 23) } +sub pp_predec { pfixop(@_, "--", 23) } +sub pp_postinc { maybe_targmy(@_, \&pfixop, "++", 23, POSTFIX) } +sub pp_postdec { maybe_targmy(@_, \&pfixop, "--", 23, POSTFIX) } +sub pp_i_preinc { pfixop(@_, "++", 23) } +sub pp_i_predec { pfixop(@_, "--", 23) } +sub pp_i_postinc { maybe_targmy(@_, \&pfixop, "++", 23, POSTFIX) } +sub pp_i_postdec { maybe_targmy(@_, \&pfixop, "--", 23, POSTFIX) } +sub pp_complement { maybe_targmy(@_, \&pfixop, "~", 21) } + +sub pp_negate { maybe_targmy(@_, \&real_negate) } +sub real_negate { + my $self = shift; + my($op, $cx) = @_; + if ($op->first->name =~ /^(i_)?negate$/) { + # avoid --$x + $self->pfixop($op, $cx, "-", 21.5); + } else { + $self->pfixop($op, $cx, "-", 21); + } +} +sub pp_i_negate { pp_negate(@_) } + +sub pp_not { + my $self = shift; + my($op, $cx) = @_; + if ($cx <= 4) { + $self->pfixop($op, $cx, "not ", 4); + } else { + $self->pfixop($op, $cx, "!", 21); + } +} + +sub unop { + my $self = shift; + my($op, $cx, $name) = @_; + my $kid; + if ($op->flags & OPf_KIDS) { + $kid = $op->first; + if (defined prototype("CORE::$name") + && prototype("CORE::$name") =~ /^;?\*/ + && $kid->name eq "rv2gv") { + $kid = $kid->first; + } + + return $self->maybe_parens_unop($name, $kid, $cx); + } else { + return $name . ($op->flags & OPf_SPECIAL ? "()" : ""); + } +} + +sub pp_chop { maybe_targmy(@_, \&unop, "chop") } +sub pp_chomp { maybe_targmy(@_, \&unop, "chomp") } +sub pp_schop { maybe_targmy(@_, \&unop, "chop") } +sub pp_schomp { maybe_targmy(@_, \&unop, "chomp") } +sub pp_defined { unop(@_, "defined") } +sub pp_undef { unop(@_, "undef") } +sub pp_study { unop(@_, "study") } +sub pp_ref { unop(@_, "ref") } +sub pp_pos { maybe_local(@_, unop(@_, "pos")) } + +sub pp_sin { maybe_targmy(@_, \&unop, "sin") } +sub pp_cos { maybe_targmy(@_, \&unop, "cos") } +sub pp_rand { maybe_targmy(@_, \&unop, "rand") } +sub pp_srand { unop(@_, "srand") } +sub pp_exp { maybe_targmy(@_, \&unop, "exp") } +sub pp_log { maybe_targmy(@_, \&unop, "log") } +sub pp_sqrt { maybe_targmy(@_, \&unop, "sqrt") } +sub pp_int { maybe_targmy(@_, \&unop, "int") } +sub pp_hex { maybe_targmy(@_, \&unop, "hex") } +sub pp_oct { maybe_targmy(@_, \&unop, "oct") } +sub pp_abs { maybe_targmy(@_, \&unop, "abs") } + +sub pp_length { maybe_targmy(@_, \&unop, "length") } +sub pp_ord { maybe_targmy(@_, \&unop, "ord") } +sub pp_chr { maybe_targmy(@_, \&unop, "chr") } + +sub pp_each { unop(@_, "each") } +sub pp_values { unop(@_, "values") } +sub pp_keys { unop(@_, "keys") } +sub pp_pop { unop(@_, "pop") } +sub pp_shift { unop(@_, "shift") } + +sub pp_caller { unop(@_, "caller") } +sub pp_reset { unop(@_, "reset") } +sub pp_exit { unop(@_, "exit") } +sub pp_prototype { unop(@_, "prototype") } + +sub pp_close { unop(@_, "close") } +sub pp_fileno { unop(@_, "fileno") } +sub pp_umask { unop(@_, "umask") } +sub pp_untie { unop(@_, "untie") } +sub pp_tied { unop(@_, "tied") } +sub pp_dbmclose { unop(@_, "dbmclose") } +sub pp_getc { unop(@_, "getc") } +sub pp_eof { unop(@_, "eof") } +sub pp_tell { unop(@_, "tell") } +sub pp_getsockname { unop(@_, "getsockname") } +sub pp_getpeername { unop(@_, "getpeername") } + +sub pp_chdir { maybe_targmy(@_, \&unop, "chdir") } +sub pp_chroot { maybe_targmy(@_, \&unop, "chroot") } +sub pp_readlink { unop(@_, "readlink") } +sub pp_rmdir { maybe_targmy(@_, \&unop, "rmdir") } +sub pp_readdir { unop(@_, "readdir") } +sub pp_telldir { unop(@_, "telldir") } +sub pp_rewinddir { unop(@_, "rewinddir") } +sub pp_closedir { unop(@_, "closedir") } +sub pp_getpgrp { maybe_targmy(@_, \&unop, "getpgrp") } +sub pp_localtime { unop(@_, "localtime") } +sub pp_gmtime { unop(@_, "gmtime") } +sub pp_alarm { unop(@_, "alarm") } +sub pp_sleep { maybe_targmy(@_, \&unop, "sleep") } + +sub pp_dofile { unop(@_, "do") } +sub pp_entereval { unop(@_, "eval") } + +sub pp_ghbyname { unop(@_, "gethostbyname") } +sub pp_gnbyname { unop(@_, "getnetbyname") } +sub pp_gpbyname { unop(@_, "getprotobyname") } +sub pp_shostent { unop(@_, "sethostent") } +sub pp_snetent { unop(@_, "setnetent") } +sub pp_sprotoent { unop(@_, "setprotoent") } +sub pp_sservent { unop(@_, "setservent") } +sub pp_gpwnam { unop(@_, "getpwnam") } +sub pp_gpwuid { unop(@_, "getpwuid") } +sub pp_ggrnam { unop(@_, "getgrnam") } +sub pp_ggrgid { unop(@_, "getgrgid") } + +sub pp_lock { unop(@_, "lock") } + +sub pp_exists { + my $self = shift; + my($op, $cx) = @_; + my $arg; + if ($op->private & OPpEXISTS_SUB) { + # Checking for the existence of a subroutine + return $self->maybe_parens_func("exists", + $self->pp_rv2cv($op->first, 16), $cx, 16); + } + if ($op->flags & OPf_SPECIAL) { + # Array element, not hash element + return $self->maybe_parens_func("exists", + $self->pp_aelem($op->first, 16), $cx, 16); + } + return $self->maybe_parens_func("exists", $self->pp_helem($op->first, 16), + $cx, 16); +} + +sub pp_delete { + my $self = shift; + my($op, $cx) = @_; + my $arg; + if ($op->private & OPpSLICE) { + if ($op->flags & OPf_SPECIAL) { + # Deleting from an array, not a hash + return $self->maybe_parens_func("delete", + $self->pp_aslice($op->first, 16), + $cx, 16); + } + return $self->maybe_parens_func("delete", + $self->pp_hslice($op->first, 16), + $cx, 16); + } else { + if ($op->flags & OPf_SPECIAL) { + # Deleting from an array, not a hash + return $self->maybe_parens_func("delete", + $self->pp_aelem($op->first, 16), + $cx, 16); + } + return $self->maybe_parens_func("delete", + $self->pp_helem($op->first, 16), + $cx, 16); + } +} + +sub pp_require { + my $self = shift; + my($op, $cx) = @_; + if (class($op) eq "UNOP" and $op->first->name eq "const" + and $op->first->private & OPpCONST_BARE) + { + my $name = $self->const_sv($op->first)->PV; + $name =~ s[/][::]g; + $name =~ s/\.pm//g; + return "require $name"; + } else { + $self->unop($op, $cx, "require"); + } +} + +sub pp_scalar { + my $self = shift; + my($op, $cv) = @_; + my $kid = $op->first; + if (not null $kid->sibling) { + # XXX Was a here-doc + return $self->dquote($op); + } + $self->unop(@_, "scalar"); +} + + +sub padval { + my $self = shift; + my $targ = shift; + return (($self->{'curcv'}->PADLIST->ARRAY)[1]->ARRAY)[$targ]; +} + +sub pp_refgen { + my $self = shift; + my($op, $cx) = @_; + my $kid = $op->first; + if ($kid->name eq "null") { + $kid = $kid->first; + if ($kid->name eq "anonlist" || $kid->name eq "anonhash") { + my($pre, $post) = @{{"anonlist" => ["[","]"], + "anonhash" => ["{","}"]}->{$kid->name}}; + my($expr, @exprs); + $kid = $kid->first->sibling; # skip pushmark + for (; !null($kid); $kid = $kid->sibling) { + $expr = $self->deparse($kid, 6); + push @exprs, $expr; + } + return $pre . join(", ", @exprs) . $post; + } elsif (!null($kid->sibling) and + $kid->sibling->name eq "anoncode") { + return "sub " . + $self->deparse_sub($self->padval($kid->sibling->targ)); + } elsif ($kid->name eq "pushmark") { + my $sib_name = $kid->sibling->name; + if ($sib_name =~ /^(pad|rv2)[ah]v$/ + and not $kid->sibling->flags & OPf_REF) + { + # The @a in \(@a) isn't in ref context, but only when the + # parens are there. + return "\\(" . $self->deparse($kid->sibling, 1) . ")"; + } elsif ($sib_name eq 'entersub') { + my $text = $self->deparse($kid->sibling, 1); + # Always show parens for \(&func()), but only with -p otherwise + $text = "($text)" if $self->{'parens'} + or $kid->sibling->private & OPpENTERSUB_AMPER; + return "\\$text"; + } + } + } + $self->pfixop($op, $cx, "\\", 20); +} + +sub pp_srefgen { pp_refgen(@_) } + +sub pp_readline { + my $self = shift; + my($op, $cx) = @_; + my $kid = $op->first; + $kid = $kid->first if $kid->name eq "rv2gv"; # <$fh> + return "<" . $self->deparse($kid, 1) . ">" if is_scalar($kid); + return $self->unop($op, $cx, "readline"); +} + +sub pp_rcatline { + my $self = shift; + my($op) = @_; + return "<" . $self->gv_name($op->gv) . ">"; +} + +# Unary operators that can occur as pseudo-listops inside double quotes +sub dq_unop { + my $self = shift; + my($op, $cx, $name, $prec, $flags) = (@_, 0, 0); + my $kid; + if ($op->flags & OPf_KIDS) { + $kid = $op->first; + # If there's more than one kid, the first is an ex-pushmark. + $kid = $kid->sibling if not null $kid->sibling; + return $self->maybe_parens_unop($name, $kid, $cx); + } else { + return $name . ($op->flags & OPf_SPECIAL ? "()" : ""); + } +} + +sub pp_ucfirst { dq_unop(@_, "ucfirst") } +sub pp_lcfirst { dq_unop(@_, "lcfirst") } +sub pp_uc { dq_unop(@_, "uc") } +sub pp_lc { dq_unop(@_, "lc") } +sub pp_quotemeta { maybe_targmy(@_, \&dq_unop, "quotemeta") } + +sub loopex { + my $self = shift; + my ($op, $cx, $name) = @_; + if (class($op) eq "PVOP") { + return "$name " . $op->pv; + } elsif (class($op) eq "OP") { + return $name; + } elsif (class($op) eq "UNOP") { + # Note -- loop exits are actually exempt from the + # looks-like-a-func rule, but a few extra parens won't hurt + return $self->maybe_parens_unop($name, $op->first, $cx); + } +} + +sub pp_last { loopex(@_, "last") } +sub pp_next { loopex(@_, "next") } +sub pp_redo { loopex(@_, "redo") } +sub pp_goto { loopex(@_, "goto") } +sub pp_dump { loopex(@_, "dump") } + +sub ftst { + my $self = shift; + my($op, $cx, $name) = @_; + if (class($op) eq "UNOP") { + # Genuine `-X' filetests are exempt from the LLAFR, but not + # l?stat(); for the sake of clarity, give'em all parens + return $self->maybe_parens_unop($name, $op->first, $cx); + } elsif (class($op) eq "SVOP") { + return $self->maybe_parens_func($name, $self->pp_gv($op, 1), $cx, 16); + } else { # I don't think baseop filetests ever survive ck_ftst, but... + return $name; + } +} + +sub pp_lstat { ftst(@_, "lstat") } +sub pp_stat { ftst(@_, "stat") } +sub pp_ftrread { ftst(@_, "-R") } +sub pp_ftrwrite { ftst(@_, "-W") } +sub pp_ftrexec { ftst(@_, "-X") } +sub pp_fteread { ftst(@_, "-r") } +sub pp_ftewrite { ftst(@_, "-w") } +sub pp_fteexec { ftst(@_, "-x") } +sub pp_ftis { ftst(@_, "-e") } +sub pp_fteowned { ftst(@_, "-O") } +sub pp_ftrowned { ftst(@_, "-o") } +sub pp_ftzero { ftst(@_, "-z") } +sub pp_ftsize { ftst(@_, "-s") } +sub pp_ftmtime { ftst(@_, "-M") } +sub pp_ftatime { ftst(@_, "-A") } +sub pp_ftctime { ftst(@_, "-C") } +sub pp_ftsock { ftst(@_, "-S") } +sub pp_ftchr { ftst(@_, "-c") } +sub pp_ftblk { ftst(@_, "-b") } +sub pp_ftfile { ftst(@_, "-f") } +sub pp_ftdir { ftst(@_, "-d") } +sub pp_ftpipe { ftst(@_, "-p") } +sub pp_ftlink { ftst(@_, "-l") } +sub pp_ftsuid { ftst(@_, "-u") } +sub pp_ftsgid { ftst(@_, "-g") } +sub pp_ftsvtx { ftst(@_, "-k") } +sub pp_fttty { ftst(@_, "-t") } +sub pp_fttext { ftst(@_, "-T") } +sub pp_ftbinary { ftst(@_, "-B") } + +sub SWAP_CHILDREN () { 1 } +sub ASSIGN () { 2 } # has OP= variant +sub LIST_CONTEXT () { 4 } # Assignment is in list context + +my(%left, %right); + +sub assoc_class { + my $op = shift; + my $name = $op->name; + if ($name eq "concat" and $op->first->name eq "concat") { + # avoid spurious `=' -- see comment in pp_concat + return "concat"; + } + if ($name eq "null" and class($op) eq "UNOP" + and $op->first->name =~ /^(and|x?or)$/ + and null $op->first->sibling) + { + # Like all conditional constructs, OP_ANDs and OP_ORs are topped + # with a null that's used as the common end point of the two + # flows of control. For precedence purposes, ignore it. + # (COND_EXPRs have these too, but we don't bother with + # their associativity). + return assoc_class($op->first); + } + return $name . ($op->flags & OPf_STACKED ? "=" : ""); +} + +# Left associative operators, like `+', for which +# $a + $b + $c is equivalent to ($a + $b) + $c + +BEGIN { + %left = ('multiply' => 19, 'i_multiply' => 19, + 'divide' => 19, 'i_divide' => 19, + 'modulo' => 19, 'i_modulo' => 19, + 'repeat' => 19, + 'add' => 18, 'i_add' => 18, + 'subtract' => 18, 'i_subtract' => 18, + 'concat' => 18, + 'left_shift' => 17, 'right_shift' => 17, + 'bit_and' => 13, + 'bit_or' => 12, 'bit_xor' => 12, + 'and' => 3, + 'or' => 2, 'xor' => 2, + ); +} + +sub deparse_binop_left { + my $self = shift; + my($op, $left, $prec) = @_; + if ($left{assoc_class($op)} && $left{assoc_class($left)} + and $left{assoc_class($op)} == $left{assoc_class($left)}) + { + return $self->deparse($left, $prec - .00001); + } else { + return $self->deparse($left, $prec); + } +} + +# Right associative operators, like `=', for which +# $a = $b = $c is equivalent to $a = ($b = $c) + +BEGIN { + %right = ('pow' => 22, + 'sassign=' => 7, 'aassign=' => 7, + 'multiply=' => 7, 'i_multiply=' => 7, + 'divide=' => 7, 'i_divide=' => 7, + 'modulo=' => 7, 'i_modulo=' => 7, + 'repeat=' => 7, + 'add=' => 7, 'i_add=' => 7, + 'subtract=' => 7, 'i_subtract=' => 7, + 'concat=' => 7, + 'left_shift=' => 7, 'right_shift=' => 7, + 'bit_and=' => 7, + 'bit_or=' => 7, 'bit_xor=' => 7, + 'andassign' => 7, + 'orassign' => 7, + ); +} + +sub deparse_binop_right { + my $self = shift; + my($op, $right, $prec) = @_; + if ($right{assoc_class($op)} && $right{assoc_class($right)} + and $right{assoc_class($op)} == $right{assoc_class($right)}) + { + return $self->deparse($right, $prec - .00001); + } else { + return $self->deparse($right, $prec); + } +} + +sub binop { + my $self = shift; + my ($op, $cx, $opname, $prec, $flags) = (@_, 0); + my $left = $op->first; + my $right = $op->last; + my $eq = ""; + if ($op->flags & OPf_STACKED && $flags & ASSIGN) { + $eq = "="; + $prec = 7; + } + if ($flags & SWAP_CHILDREN) { + ($left, $right) = ($right, $left); + } + $left = $self->deparse_binop_left($op, $left, $prec); + $left = "($left)" if $flags & LIST_CONTEXT + && $left !~ /^(my|our|local|)[\@\(]/; + $right = $self->deparse_binop_right($op, $right, $prec); + return $self->maybe_parens("$left $opname$eq $right", $cx, $prec); +} + +sub pp_add { maybe_targmy(@_, \&binop, "+", 18, ASSIGN) } +sub pp_multiply { maybe_targmy(@_, \&binop, "*", 19, ASSIGN) } +sub pp_subtract { maybe_targmy(@_, \&binop, "-",18, ASSIGN) } +sub pp_divide { maybe_targmy(@_, \&binop, "/", 19, ASSIGN) } +sub pp_modulo { maybe_targmy(@_, \&binop, "%", 19, ASSIGN) } +sub pp_i_add { maybe_targmy(@_, \&binop, "+", 18, ASSIGN) } +sub pp_i_multiply { maybe_targmy(@_, \&binop, "*", 19, ASSIGN) } +sub pp_i_subtract { maybe_targmy(@_, \&binop, "-", 18, ASSIGN) } +sub pp_i_divide { maybe_targmy(@_, \&binop, "/", 19, ASSIGN) } +sub pp_i_modulo { maybe_targmy(@_, \&binop, "%", 19, ASSIGN) } +sub pp_pow { maybe_targmy(@_, \&binop, "**", 22, ASSIGN) } + +sub pp_left_shift { maybe_targmy(@_, \&binop, "<<", 17, ASSIGN) } +sub pp_right_shift { maybe_targmy(@_, \&binop, ">>", 17, ASSIGN) } +sub pp_bit_and { maybe_targmy(@_, \&binop, "&", 13, ASSIGN) } +sub pp_bit_or { maybe_targmy(@_, \&binop, "|", 12, ASSIGN) } +sub pp_bit_xor { maybe_targmy(@_, \&binop, "^", 12, ASSIGN) } + +sub pp_eq { binop(@_, "==", 14) } +sub pp_ne { binop(@_, "!=", 14) } +sub pp_lt { binop(@_, "<", 15) } +sub pp_gt { binop(@_, ">", 15) } +sub pp_ge { binop(@_, ">=", 15) } +sub pp_le { binop(@_, "<=", 15) } +sub pp_ncmp { binop(@_, "<=>", 14) } +sub pp_i_eq { binop(@_, "==", 14) } +sub pp_i_ne { binop(@_, "!=", 14) } +sub pp_i_lt { binop(@_, "<", 15) } +sub pp_i_gt { binop(@_, ">", 15) } +sub pp_i_ge { binop(@_, ">=", 15) } +sub pp_i_le { binop(@_, "<=", 15) } +sub pp_i_ncmp { binop(@_, "<=>", 14) } + +sub pp_seq { binop(@_, "eq", 14) } +sub pp_sne { binop(@_, "ne", 14) } +sub pp_slt { binop(@_, "lt", 15) } +sub pp_sgt { binop(@_, "gt", 15) } +sub pp_sge { binop(@_, "ge", 15) } +sub pp_sle { binop(@_, "le", 15) } +sub pp_scmp { binop(@_, "cmp", 14) } + +sub pp_sassign { binop(@_, "=", 7, SWAP_CHILDREN) } +sub pp_aassign { binop(@_, "=", 7, SWAP_CHILDREN | LIST_CONTEXT) } + +# `.' is special because concats-of-concats are optimized to save copying +# by making all but the first concat stacked. The effect is as if the +# programmer had written `($a . $b) .= $c', except legal. +sub pp_concat { maybe_targmy(@_, \&real_concat) } +sub real_concat { + my $self = shift; + my($op, $cx) = @_; + my $left = $op->first; + my $right = $op->last; + my $eq = ""; + my $prec = 18; + if ($op->flags & OPf_STACKED and $op->first->name ne "concat") { + $eq = "="; + $prec = 7; + } + $left = $self->deparse_binop_left($op, $left, $prec); + $right = $self->deparse_binop_right($op, $right, $prec); + return $self->maybe_parens("$left .$eq $right", $cx, $prec); +} + +# `x' is weird when the left arg is a list +sub pp_repeat { + my $self = shift; + my($op, $cx) = @_; + my $left = $op->first; + my $right = $op->last; + my $eq = ""; + my $prec = 19; + if ($op->flags & OPf_STACKED) { + $eq = "="; + $prec = 7; + } + if (null($right)) { # list repeat; count is inside left-side ex-list + my $kid = $left->first->sibling; # skip pushmark + my @exprs; + for (; !null($kid->sibling); $kid = $kid->sibling) { + push @exprs, $self->deparse($kid, 6); + } + $right = $kid; + $left = "(" . join(", ", @exprs). ")"; + } else { + $left = $self->deparse_binop_left($op, $left, $prec); + } + $right = $self->deparse_binop_right($op, $right, $prec); + return $self->maybe_parens("$left x$eq $right", $cx, $prec); +} + +sub range { + my $self = shift; + my ($op, $cx, $type) = @_; + my $left = $op->first; + my $right = $left->sibling; + $left = $self->deparse($left, 9); + $right = $self->deparse($right, 9); + return $self->maybe_parens("$left $type $right", $cx, 9); +} + +sub pp_flop { + my $self = shift; + my($op, $cx) = @_; + my $flip = $op->first; + my $type = ($flip->flags & OPf_SPECIAL) ? "..." : ".."; + return $self->range($flip->first, $cx, $type); +} + +# one-line while/until is handled in pp_leave + +sub logop { + my $self = shift; + 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 + 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'} + and $self->{'expand'} < 7) { # $b if $a + $right = $self->deparse($right, 1); + $left = $self->deparse($left, 1); + return "$right $blockname $left"; + } elsif ($cx > $lowprec and $highop) { # $a && $b + $left = $self->deparse_binop_left($op, $left, $highprec); + $right = $self->deparse_binop_right($op, $right, $highprec); + return $self->maybe_parens("$left $highop $right", $cx, $highprec); + } else { # $a and $b + $left = $self->deparse_binop_left($op, $left, $lowprec); + $right = $self->deparse_binop_right($op, $right, $lowprec); + return $self->maybe_parens("$left $lowop $right", $cx, $lowprec); + } +} + +sub pp_and { logop(@_, "and", 3, "&&", 11, "if") } +sub pp_or { logop(@_, "or", 2, "||", 10, "unless") } + +# xor is syntactically a logop, but it's really a binop (contrary to +# old versions of opcode.pl). Syntax is what matters here. +sub pp_xor { logop(@_, "xor", 2, "", 0, "") } + +sub logassignop { + my $self = shift; + my ($op, $cx, $opname) = @_; + my $left = $op->first; + my $right = $op->first->sibling->first; # skip sassign + $left = $self->deparse($left, 7); + $right = $self->deparse($right, 7); + return $self->maybe_parens("$left $opname $right", $cx, 7); +} + +sub pp_andassign { logassignop(@_, "&&=") } +sub pp_orassign { logassignop(@_, "||=") } + +sub listop { + my $self = shift; + my($op, $cx, $name) = @_; + my(@exprs); + my $parens = ($cx >= 5) || $self->{'parens'}; + my $kid = $op->first->sibling; + return $name if null $kid; + my $first; + $name = "socketpair" if $name eq "sockpair"; + if (defined prototype("CORE::$name") + && prototype("CORE::$name") =~ /^;?\*/ + && $kid->name eq "rv2gv") { + $first = $self->deparse($kid->first, 6); + } + else { + $first = $self->deparse($kid, 6); + } + if ($name eq "chmod" && $first =~ /^\d+$/) { + $first = sprintf("%#o", $first); + } + $first = "+$first" if not $parens and substr($first, 0, 1) eq "("; + push @exprs, $first; + $kid = $kid->sibling; + for (; !null($kid); $kid = $kid->sibling) { + push @exprs, $self->deparse($kid, 6); + } + if ($parens) { + return "$name(" . join(", ", @exprs) . ")"; + } else { + return "$name " . join(", ", @exprs); + } +} + +sub pp_bless { listop(@_, "bless") } +sub pp_atan2 { maybe_targmy(@_, \&listop, "atan2") } +sub pp_substr { maybe_local(@_, listop(@_, "substr")) } +sub pp_vec { maybe_local(@_, listop(@_, "vec")) } +sub pp_index { maybe_targmy(@_, \&listop, "index") } +sub pp_rindex { maybe_targmy(@_, \&listop, "rindex") } +sub pp_sprintf { maybe_targmy(@_, \&listop, "sprintf") } +sub pp_formline { listop(@_, "formline") } # see also deparse_format +sub pp_crypt { maybe_targmy(@_, \&listop, "crypt") } +sub pp_unpack { listop(@_, "unpack") } +sub pp_pack { listop(@_, "pack") } +sub pp_join { maybe_targmy(@_, \&listop, "join") } +sub pp_splice { listop(@_, "splice") } +sub pp_push { maybe_targmy(@_, \&listop, "push") } +sub pp_unshift { maybe_targmy(@_, \&listop, "unshift") } +sub pp_reverse { listop(@_, "reverse") } +sub pp_warn { listop(@_, "warn") } +sub pp_die { listop(@_, "die") } +# Actually, return is exempt from the LLAFR (see examples in this very +# module!), but for consistency's sake, ignore that fact +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") } +sub pp_read { listop(@_, "read") } +sub pp_sysopen { listop(@_, "sysopen") } +sub pp_sysseek { listop(@_, "sysseek") } +sub pp_sysread { listop(@_, "sysread") } +sub pp_syswrite { listop(@_, "syswrite") } +sub pp_send { listop(@_, "send") } +sub pp_recv { listop(@_, "recv") } +sub pp_seek { listop(@_, "seek") } +sub pp_fcntl { listop(@_, "fcntl") } +sub pp_ioctl { listop(@_, "ioctl") } +sub pp_flock { maybe_targmy(@_, \&listop, "flock") } +sub pp_socket { listop(@_, "socket") } +sub pp_sockpair { listop(@_, "sockpair") } +sub pp_bind { listop(@_, "bind") } +sub pp_connect { listop(@_, "connect") } +sub pp_listen { listop(@_, "listen") } +sub pp_accept { listop(@_, "accept") } +sub pp_shutdown { listop(@_, "shutdown") } +sub pp_gsockopt { listop(@_, "getsockopt") } +sub pp_ssockopt { listop(@_, "setsockopt") } +sub pp_chown { maybe_targmy(@_, \&listop, "chown") } +sub pp_unlink { maybe_targmy(@_, \&listop, "unlink") } +sub pp_chmod { maybe_targmy(@_, \&listop, "chmod") } +sub pp_utime { maybe_targmy(@_, \&listop, "utime") } +sub pp_rename { maybe_targmy(@_, \&listop, "rename") } +sub pp_link { maybe_targmy(@_, \&listop, "link") } +sub pp_symlink { maybe_targmy(@_, \&listop, "symlink") } +sub pp_mkdir { maybe_targmy(@_, \&listop, "mkdir") } +sub pp_open_dir { listop(@_, "opendir") } +sub pp_seekdir { listop(@_, "seekdir") } +sub pp_waitpid { maybe_targmy(@_, \&listop, "waitpid") } +sub pp_system { maybe_targmy(@_, \&listop, "system") } +sub pp_exec { maybe_targmy(@_, \&listop, "exec") } +sub pp_kill { maybe_targmy(@_, \&listop, "kill") } +sub pp_setpgrp { maybe_targmy(@_, \&listop, "setpgrp") } +sub pp_getpriority { maybe_targmy(@_, \&listop, "getpriority") } +sub pp_setpriority { maybe_targmy(@_, \&listop, "setpriority") } +sub pp_shmget { listop(@_, "shmget") } +sub pp_shmctl { listop(@_, "shmctl") } +sub pp_shmread { listop(@_, "shmread") } +sub pp_shmwrite { listop(@_, "shmwrite") } +sub pp_msgget { listop(@_, "msgget") } +sub pp_msgctl { listop(@_, "msgctl") } +sub pp_msgsnd { listop(@_, "msgsnd") } +sub pp_msgrcv { listop(@_, "msgrcv") } +sub pp_semget { listop(@_, "semget") } +sub pp_semctl { listop(@_, "semctl") } +sub pp_semop { listop(@_, "semop") } +sub pp_ghbyaddr { listop(@_, "gethostbyaddr") } +sub pp_gnbyaddr { listop(@_, "getnetbyaddr") } +sub pp_gpbynumber { listop(@_, "getprotobynumber") } +sub pp_gsbyname { listop(@_, "getservbyname") } +sub pp_gsbyport { listop(@_, "getservbyport") } +sub pp_syscall { listop(@_, "syscall") } + +sub pp_glob { + my $self = shift; + my($op, $cx) = @_; + my $text = $self->dq($op->first->sibling); # skip pushmark + if ($text =~ /^\$?(\w|::|\`)+$/ # could look like a readline + or $text =~ /[<>]/) { + return 'glob(' . single_delim('qq', '"', $text) . ')'; + } else { + return '<' . $text . '>'; + } +} + +# Truncate is special because OPf_SPECIAL makes a bareword first arg +# be a filehandle. This could probably be better fixed in the core +# by moving the GV lookup into ck_truc. + +sub pp_truncate { + my $self = shift; + my($op, $cx) = @_; + my(@exprs); + my $parens = ($cx >= 5) || $self->{'parens'}; + my $kid = $op->first->sibling; + my $fh; + if ($op->flags & OPf_SPECIAL) { + # $kid is an OP_CONST + $fh = $self->const_sv($kid)->PV; + } else { + $fh = $self->deparse($kid, 6); + $fh = "+$fh" if not $parens and substr($fh, 0, 1) eq "("; + } + my $len = $self->deparse($kid->sibling, 6); + if ($parens) { + return "truncate($fh, $len)"; + } else { + return "truncate $fh, $len"; + } +} + +sub indirop { + my $self = shift; + my($op, $cx, $name) = @_; + my($expr, @exprs); + my $kid = $op->first->sibling; + my $indir = ""; + if ($op->flags & OPf_STACKED) { + $indir = $kid; + $indir = $indir->first; # skip rv2gv + if (is_scope($indir)) { + $indir = "{" . $self->deparse($indir, 0) . "}"; + } elsif ($indir->name eq "const" && $indir->private & OPpCONST_BARE) { + $indir = $self->const_sv($indir)->PV; + } else { + $indir = $self->deparse($indir, 24); + } + $indir = $indir . " "; + $kid = $kid->sibling; + } + if ($name eq "sort" && $op->private & (OPpSORT_NUMERIC | OPpSORT_INTEGER)) { + $indir = ($op->private & OPpSORT_REVERSE) ? '{$b <=> $a} ' + : '{$a <=> $b} '; + } + elsif ($name eq "sort" && $op->private & OPpSORT_REVERSE) { + $indir = '{$b cmp $a} '; + } + for (; !null($kid); $kid = $kid->sibling) { + $expr = $self->deparse($kid, 6); + push @exprs, $expr; + } + return $self->maybe_parens_func($name, $indir . join(", ", @exprs), + $cx, 5); +} + +sub pp_prtf { indirop(@_, "printf") } +sub pp_print { indirop(@_, "print") } +sub pp_sort { indirop(@_, "sort") } + +sub mapop { + my $self = shift; + my($op, $cx, $name) = @_; + my($expr, @exprs); + my $kid = $op->first; # this is the (map|grep)start + $kid = $kid->first->sibling; # skip a pushmark + my $code = $kid->first; # skip a null + if (is_scope $code) { + $code = "{" . $self->deparse($code, 0) . "} "; + } else { + $code = $self->deparse($code, 24) . ", "; + } + $kid = $kid->sibling; + for (; !null($kid); $kid = $kid->sibling) { + $expr = $self->deparse($kid, 6); + push @exprs, $expr if defined $expr; + } + return $self->maybe_parens_func($name, $code . join(", ", @exprs), $cx, 5); +} + +sub pp_mapwhile { mapop(@_, "map") } +sub pp_grepwhile { mapop(@_, "grep") } + +sub pp_list { + my $self = shift; + my($op, $cx) = @_; + my($expr, @exprs); + my $kid = $op->first->sibling; # skip pushmark + my $lop; + my $local = "either"; # could be local(...), my(...) or our(...) + for ($lop = $kid; !null($lop); $lop = $lop->sibling) { + # This assumes that no other private flags equal 128, and that + # OPs that store things other than flags in their op_private, + # like OP_AELEMFAST, won't be immediate children of a list. + # + # OP_ENTERSUB can break this logic, so check for it. + # I suspect that open and exit can too. + + if (!($lop->private & (OPpLVAL_INTRO|OPpOUR_INTRO) + or $lop->name eq "undef") + or $lop->name eq "entersub" + or $lop->name eq "exit" + or $lop->name eq "open") + { + $local = ""; # or not + last; + } + if ($lop->name =~ /^pad[ash]v$/) { # my() + ($local = "", last) if $local eq "local" || $local eq "our"; + $local = "my"; + } elsif ($lop->name =~ /^(gv|rv2)[ash]v$/ + && $lop->private & OPpOUR_INTRO + or $lop->name eq "null" && $lop->first->name eq "gvsv" + && $lop->first->private & OPpOUR_INTRO) { # our() + ($local = "", last) if $local eq "my" || $local eq "local"; + $local = "our"; + } elsif ($lop->name ne "undef") { # local() + ($local = "", last) if $local eq "my" || $local eq "our"; + $local = "local"; + } + } + $local = "" if $local eq "either"; # no point if it's all undefs + return $self->deparse($kid, $cx) if null $kid->sibling and not $local; + for (; !null($kid); $kid = $kid->sibling) { + if ($local) { + if (class($kid) eq "UNOP" and $kid->first->name eq "gvsv") { + $lop = $kid->first; + } else { + $lop = $kid; + } + $self->{'avoid_local'}{$$lop}++; + $expr = $self->deparse($kid, 6); + delete $self->{'avoid_local'}{$$lop}; + } else { + $expr = $self->deparse($kid, 6); + } + push @exprs, $expr; + } + if ($local) { + return "$local(" . join(", ", @exprs) . ")"; + } else { + return $self->maybe_parens( join(", ", @exprs), $cx, 6); + } +} + +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) = @_; + my $cond = $op->first; + my $true = $cond->sibling; + my $false = $true->sibling; + my $cuddle = $self->{'cuddle'}; + 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); + 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"; + } + return $head . join($cuddle, "", @elsifs) . $false; +} + +sub loop_common { + my $self = shift; + my($op, $cx, $init) = @_; + my $enter = $op->first; + my $kid = $enter->sibling; + local(@$self{qw'curstash warnings hints'}) + = @$self{qw'curstash warnings hints'}; + 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 = "while (1) "; # Can't use for(;;) if there's a continue + $cond = ""; + } else { + $bare = 1; + } + $body = $kid; + } elsif ($enter->name eq "enteriter") { # foreach + my $ary = $enter->first->sibling; # first was pushmark + my $var = $ary->sibling; + if ($enter->flags & OPf_STACKED + and not null $ary->first->sibling->sibling) + { + $ary = $self->deparse($ary->first->sibling, 9) . " .. " . + $self->deparse($ary->first->sibling->sibling, 9); + } else { + $ary = $self->deparse($ary, 1); + } + if (null $var) { + if ($enter->flags & OPf_SPECIAL) { # thread special var + $var = $self->pp_threadsv($enter, 1); + } else { # regular my() variable + $var = $self->pp_padsv($enter, 1); + if ($self->padname_sv($enter->targ)->IVX == + $kid->first->first->sibling->last->cop_seq) + { + # If the scope of this variable closes at the last + # statement of the loop, it must have been + # declared here. + $var = "my " . $var; + } + } + } elsif ($var->name eq "rv2gv") { + $var = $self->pp_rv2sv($var, 1); + } elsif ($var->name eq "gv") { + $var = "\$" . $self->deparse($var, 1); + } + $head = "foreach $var ($ary) "; + $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}; + $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 + } + # 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 && ${$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(undef, @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"; + } + } else { + return "" if !defined $body; + if (length $init) { + $head = "for ($init; $cond;) "; + } + $cont = "\cK"; + $body = $self->deparse($body, 0); + } + $body =~ s/;?$/;\n/; + + return $head . "{\n\t" . $body . "\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->first->sibling, $cx, $init); +} + +sub pp_leavetry { + my $self = shift; + return "eval {\n\t" . $self->pp_leave(@_) . "\n\b}"; +} + +BEGIN { eval "sub OP_CONST () {" . opnumber("const") . "}" } +BEGIN { eval "sub OP_STRINGIFY () {" . opnumber("stringify") . "}" } +BEGIN { eval "sub OP_RV2SV () {" . opnumber("rv2sv") . "}" } +BEGIN { eval "sub OP_LIST () {" . opnumber("list") . "}" } + +sub pp_null { + my $self = shift; + my($op, $cx) = @_; + if (class($op) eq "OP") { + # old value is lost + return $self->{'ex_const'} if $op->targ == OP_CONST; + } elsif ($op->first->name eq "pushmark") { + return $self->pp_list($op, $cx); + } elsif ($op->first->name eq "enter") { + return $self->pp_leave($op, $cx); + } elsif ($op->targ == OP_STRINGIFY) { + return $self->dquote($op, $cx); + } elsif (!null($op->first->sibling) and + $op->first->sibling->name eq "readline" and + $op->first->sibling->flags & OPf_STACKED) { + return $self->maybe_parens($self->deparse($op->first, 7) . " = " + . $self->deparse($op->first->sibling, 7), + $cx, 7); + } elsif (!null($op->first->sibling) and + $op->first->sibling->name eq "trans" and + $op->first->sibling->flags & OPf_STACKED) { + return $self->maybe_parens($self->deparse($op->first, 20) . " =~ " + . $self->deparse($op->first->sibling, 20), + $cx, 20); + } elsif ($op->flags & OPf_SPECIAL && $cx == 0 && !$op->targ) { + return "do {\n\t". $self->deparse($op->first, $cx) ."\n\b};"; + } elsif (!null($op->first->sibling) and + $op->first->sibling->name eq "null" and + class($op->first->sibling) eq "UNOP" and + $op->first->sibling->first->flags & OPf_STACKED and + $op->first->sibling->first->name eq "rcatline") { + return $self->maybe_parens($self->deparse($op->first, 18) . " .= " + . $self->deparse($op->first->sibling, 18), + $cx, 18); + } else { + return $self->deparse($op->first, $cx); + } +} + +sub padname { + my $self = shift; + my $targ = shift; + return $self->padname_sv($targ)->PVX; +} + +sub padany { + my $self = shift; + my $op = shift; + return substr($self->padname($op->targ), 1); # skip $/@/% +} + +sub pp_padsv { + my $self = shift; + my($op, $cx) = @_; + return $self->maybe_my($op, $cx, $self->padname($op->targ)); +} + +sub pp_padav { pp_padsv(@_) } +sub pp_padhv { pp_padsv(@_) } + +my @threadsv_names; + +BEGIN { + @threadsv_names = ("_", "1", "2", "3", "4", "5", "6", "7", "8", "9", + "&", "`", "'", "+", "/", ".", ",", "\\", '"', ";", + "^", "-", "%", "=", "|", "~", ":", "^A", "^E", + "!", "@"); +} + +sub pp_threadsv { + my $self = shift; + my($op, $cx) = @_; + return $self->maybe_local($op, $cx, "\$" . $threadsv_names[$op->targ]); +} + +sub gv_or_padgv { + my $self = shift; + my $op = shift; + if (class($op) eq "PADOP") { + return $self->padval($op->padix); + } else { # class($op) eq "SVOP" + return $op->gv; + } +} + +sub pp_gvsv { + my $self = shift; + my($op, $cx) = @_; + my $gv = $self->gv_or_padgv($op); + return $self->maybe_local($op, $cx, $self->stash_variable("\$", + $self->gv_name($gv))); +} + +sub pp_gv { + my $self = shift; + my($op, $cx) = @_; + my $gv = $self->gv_or_padgv($op); + return $self->gv_name($gv); +} + +sub pp_aelemfast { + my $self = shift; + my($op, $cx) = @_; + my $gv = $self->gv_or_padgv($op); + my $name = $self->gv_name($gv); + $name = $self->{'curstash'}."::$name" + if $name !~ /::/ && $self->lex_in_scope('@'.$name); + + return "\$" . $name . "[" . + ($op->private + $self->{'arybase'}) . "]"; +} + +sub rv2x { + my $self = shift; + my($op, $cx, $type) = @_; + + if (class($op) eq 'NULL' || !$op->can("first")) { + carp("Unexpected op in pp_rv2x"); + return 'XXX'; + } + my $kid = $op->first; + my $str = $self->deparse($kid, 0); + return $self->stash_variable($type, $str) if is_scalar($kid); + return $type ."{$str}"; +} + +sub pp_rv2sv { maybe_local(@_, rv2x(@_, "\$")) } +sub pp_rv2hv { maybe_local(@_, rv2x(@_, "%")) } +sub pp_rv2gv { maybe_local(@_, rv2x(@_, "*")) } + +# skip rv2av +sub pp_av2arylen { + my $self = shift; + my($op, $cx) = @_; + if ($op->first->name eq "padav") { + return $self->maybe_local($op, $cx, '$#' . $self->padany($op->first)); + } else { + return $self->maybe_local($op, $cx, + $self->rv2x($op->first, $cx, '$#')); + } +} + +# skip down to the old, ex-rv2cv +sub pp_rv2cv { + my ($self, $op, $cx) = @_; + if (!null($op->first) && $op->first->name eq 'null' && + $op->first->targ eq OP_LIST) + { + return $self->rv2x($op->first->first->sibling, $cx, "&") + } + else { + return $self->rv2x($op, $cx, "") + } +} + +sub pp_rv2av { + my $self = shift; + my($op, $cx) = @_; + my $kid = $op->first; + if ($kid->name eq "const") { # constant list + my $av = $self->const_sv($kid); + return "(" . join(", ", map(const($_), $av->ARRAY)) . ")"; + } else { + return $self->maybe_local($op, $cx, $self->rv2x($op, $cx, "\@")); + } + } + +sub is_subscriptable { + my $op = shift; + if ($op->name =~ /^[ahg]elem/) { + return 1; + } elsif ($op->name eq "entersub") { + my $kid = $op->first; + return 0 unless null $kid->sibling; + $kid = $kid->first; + $kid = $kid->sibling until null $kid->sibling; + return 0 if is_scope($kid); + $kid = $kid->first; + return 0 if $kid->name eq "gv"; + return 0 if is_scalar($kid); + return is_subscriptable($kid); + } else { + return 0; + } +} + +sub elem { + my $self = shift; + my ($op, $cx, $left, $right, $padname) = @_; + my($array, $idx) = ($op->first, $op->first->sibling); + unless ($array->name eq $padname) { # Maybe this has been fixed + $array = $array->first; # skip rv2av (or ex-rv2av in _53+) + } + if ($array->name eq $padname) { + $array = $self->padany($array); + } elsif (is_scope($array)) { # ${expr}[0] + $array = "{" . $self->deparse($array, 0) . "}"; + } elsif ($array->name eq "gv") { + $array = $self->gv_name($self->gv_or_padgv($array)); + if ($array !~ /::/) { + my $prefix = ($left eq '[' ? '@' : '%'); + $array = $self->{curstash}.'::'.$array + if $self->lex_in_scope($prefix . $array); + } + } elsif (is_scalar $array) { # $x[0], $$x[0], ... + $array = $self->deparse($array, 24); + } else { + # $x[20][3]{hi} or expr->[20] + my $arrow = is_subscriptable($array) ? "" : "->"; + return $self->deparse($array, 24) . $arrow . + $left . $self->deparse($idx, 1) . $right; + } + $idx = $self->deparse($idx, 1); + + # Outer parens in an array index will confuse perl + # if we're interpolating in a regular expression, i.e. + # /$x$foo[(-1)]/ is *not* the same as /$x$foo[-1]/ + # + # If $self->{parens}, then an initial '(' will + # definitely be paired with a final ')'. If + # !$self->{parens}, the misleading parens won't + # have been added in the first place. + # + # [You might think that we could get "(...)...(...)" + # where the initial and final parens do not match + # each other. But we can't, because the above would + # only happen if there's an infix binop between the + # two pairs of parens, and *that* means that the whole + # expression would be parenthesized as well.] + # + $idx =~ s/^\((.*)\)$/$1/ if $self->{'parens'}; + + # Hash-element braces will autoquote a bareword inside themselves. + # We need to make sure that C<$hash{warn()}> doesn't come out as + # C<$hash{warn}>, which has a quite different meaning. Currently + # B::Deparse will always quote strings, even if the string was a + # bareword in the original (i.e. the OPpCONST_BARE flag is ignored + # for constant strings.) So we can cheat slightly here - if we see + # a bareword, we know that it is supposed to be a function call. + # + $idx =~ s/^([A-Za-z_]\w*)$/$1()/; + + return "\$" . $array . $left . $idx . $right; +} + +sub pp_aelem { maybe_local(@_, elem(@_, "[", "]", "padav")) } +sub pp_helem { maybe_local(@_, elem(@_, "{", "}", "padhv")) } + +sub pp_gelem { + my $self = shift; + my($op, $cx) = @_; + my($glob, $part) = ($op->first, $op->last); + $glob = $glob->first; # skip rv2gv + $glob = $glob->first if $glob->name eq "rv2gv"; # this one's a bug + my $scope = is_scope($glob); + $glob = $self->deparse($glob, 0); + $part = $self->deparse($part, 1); + return "*" . ($scope ? "{$glob}" : $glob) . "{$part}"; +} + +sub slice { + my $self = shift; + my ($op, $cx, $left, $right, $regname, $padname) = @_; + my $last; + my(@elems, $kid, $array, $list); + if (class($op) eq "LISTOP") { + $last = $op->last; + } else { # ex-hslice inside delete() + for ($kid = $op->first; !null $kid->sibling; $kid = $kid->sibling) {} + $last = $kid; + } + $array = $last; + $array = $array->first + if $array->name eq $regname or $array->name eq "null"; + if (is_scope($array)) { + $array = "{" . $self->deparse($array, 0) . "}"; + } elsif ($array->name eq $padname) { + $array = $self->padany($array); + } else { + $array = $self->deparse($array, 24); + } + $kid = $op->first->sibling; # skip pushmark + if ($kid->name eq "list") { + $kid = $kid->first->sibling; # skip list, pushmark + for (; !null $kid; $kid = $kid->sibling) { + push @elems, $self->deparse($kid, 6); + } + $list = join(", ", @elems); + } else { + $list = $self->deparse($kid, 1); + } + return "\@" . $array . $left . $list . $right; +} + +sub pp_aslice { maybe_local(@_, slice(@_, "[", "]", "rv2av", "padav")) } +sub pp_hslice { maybe_local(@_, slice(@_, "{", "}", "rv2hv", "padhv")) } + +sub pp_lslice { + my $self = shift; + my($op, $cx) = @_; + my $idx = $op->first; + my $list = $op->last; + my(@elems, $kid); + $list = $self->deparse($list, 1); + $idx = $self->deparse($idx, 1); + return "($list)" . "[$idx]"; +} + +sub want_scalar { + my $op = shift; + return ($op->flags & OPf_WANT) == OPf_WANT_SCALAR; +} + +sub want_list { + my $op = shift; + return ($op->flags & OPf_WANT) == OPf_WANT_LIST; +} + +sub method { + my $self = shift; + my($op, $cx) = @_; + my $kid = $op->first->sibling; # skip pushmark + my($meth, $obj, @exprs); + if ($kid->name eq "list" and want_list $kid) { + # When an indirect object isn't a bareword but the args are in + # parens, the parens aren't part of the method syntax (the LLAFR + # doesn't apply), but they make a list with OPf_PARENS set that + # doesn't get flattened by the append_elem that adds the method, + # making a (object, arg1, arg2, ...) list where the object + # usually is. This can be distinguished from + # `($obj, $arg1, $arg2)->meth()' (which is legal if $arg2 is an + # object) because in the later the list is in scalar context + # as the left side of -> always is, while in the former + # the list is in list context as method arguments always are. + # (Good thing there aren't method prototypes!) + $meth = $kid->sibling; + $kid = $kid->first->sibling; # skip pushmark + $obj = $kid; + $kid = $kid->sibling; + for (; not null $kid; $kid = $kid->sibling) { + push @exprs, $self->deparse($kid, 6); + } + } else { + $obj = $kid; + $kid = $kid->sibling; + for (; !null ($kid->sibling) && $kid->name ne "method_named"; + $kid = $kid->sibling) { + push @exprs, $self->deparse($kid, 6); + } + $meth = $kid; + } + $obj = $self->deparse($obj, 24); + if ($meth->name eq "method_named") { + $meth = $self->const_sv($meth)->PV; + } else { + $meth = $meth->first; + if ($meth->name eq "const") { + # As of 5.005_58, this case is probably obsoleted by the + # method_named case above + $meth = $self->const_sv($meth)->PV; # needs to be bare + } else { + $meth = $self->deparse($meth, 1); + } + } + my $args = join(", ", @exprs); + $kid = $obj . "->" . $meth; + if (length $args) { + return $kid . "(" . $args . ")"; # parens mandatory + } else { + return $kid; + } +} + +# returns "&" if the prototype doesn't match the args, +# or ("", $args_after_prototype_demunging) if it does. +sub check_proto { + my $self = shift; + return "&" if $self->{'noproto'}; + my($proto, @args) = @_; + my($arg, $real); + my $doneok = 0; + my @reals; + # An unbackslashed @ or % gobbles up the rest of the args + 1 while $proto =~ s/(?deparse($_, 6), @args); + @args = (); + } else { + $arg = shift @args; + last unless $arg; + if ($chr eq "\$") { + if (want_scalar $arg) { + push @reals, $self->deparse($arg, 6); + } else { + return "&"; + } + } elsif ($chr eq "&") { + if ($arg->name =~ /^(s?refgen|undef)$/) { + push @reals, $self->deparse($arg, 6); + } else { + return "&"; + } + } elsif ($chr eq "*") { + if ($arg->name =~ /^s?refgen$/ + and $arg->first->first->name eq "rv2gv") + { + $real = $arg->first->first; # skip refgen, null + if ($real->first->name eq "gv") { + push @reals, $self->deparse($real, 6); + } else { + push @reals, $self->deparse($real->first, 6); + } + } else { + return "&"; + } + } elsif (substr($chr, 0, 1) eq "\\") { + $chr =~ tr/\\[]//d; + if ($arg->name =~ /^s?refgen$/ and + !null($real = $arg->first) and + ($chr =~ /\$/ && is_scalar($real->first) + or ($chr =~ /@/ + && class($real->first->sibling) ne 'NULL' + && $real->first->sibling->name + =~ /^(rv2|pad)av$/) + or ($chr =~ /%/ + && class($real->first->sibling) ne 'NULL' + && $real->first->sibling->name + =~ /^(rv2|pad)hv$/) + #or ($chr =~ /&/ # This doesn't work + # && $real->first->name eq "rv2cv") + or ($chr =~ /\*/ + && $real->first->name eq "rv2gv"))) + { + push @reals, $self->deparse($real, 6); + } else { + return "&"; + } + } + } + } + return "&" if $proto and !$doneok; # too few args and no `;' + return "&" if @args; # too many args + return ("", join ", ", @reals); +} + +sub pp_entersub { + my $self = shift; + my($op, $cx) = @_; + return $self->method($op, $cx) unless null $op->first->sibling; + my $prefix = ""; + my $amper = ""; + my($kid, @exprs); + if ($op->flags & OPf_SPECIAL && !($op->flags & OPf_MOD)) { + $prefix = "do "; + } elsif ($op->private & OPpENTERSUB_AMPER) { + $amper = "&"; + } + $kid = $op->first; + $kid = $kid->first->sibling; # skip ex-list, pushmark + for (; not null $kid->sibling; $kid = $kid->sibling) { + push @exprs, $kid; + } + my $simple = 0; + my $proto = undef; + if (is_scope($kid)) { + $amper = "&"; + $kid = "{" . $self->deparse($kid, 0) . "}"; + } elsif ($kid->first->name eq "gv") { + my $gv = $self->gv_or_padgv($kid->first); + if (class($gv->CV) ne "SPECIAL") { + $proto = $gv->CV->PV if $gv->CV->FLAGS & SVf_POK; + } + $simple = 1; # only calls of named functions can be prototyped + $kid = $self->deparse($kid, 24); + } elsif (is_scalar ($kid->first) && $kid->first->name ne 'rv2cv') { + $amper = "&"; + $kid = $self->deparse($kid, 24); + } else { + $prefix = ""; + my $arrow = is_subscriptable($kid->first) ? "" : "->"; + $kid = $self->deparse($kid, 24) . $arrow; + } + + # Doesn't matter how many prototypes there are, if + # they haven't happened yet! + my $declared; + { + no strict 'refs'; + no warnings 'uninitialized'; + $declared = exists $self->{'subs_declared'}{$kid} + || ( + defined &{ %{$self->{'curstash'}."::"}->{$kid} } + && !exists + $self->{'subs_deparsed'}{$self->{'curstash'}."::".$kid} + && defined prototype $self->{'curstash'}."::".$kid + ); + if (!$declared && defined($proto)) { + # Avoid "too early to check prototype" warning + ($amper, $proto) = ('&'); + } + } + + my $args; + if ($declared and defined $proto and not $amper) { + ($amper, $args) = $self->check_proto($proto, @exprs); + if ($amper eq "&") { + $args = join(", ", map($self->deparse($_, 6), @exprs)); + } + } else { + $args = join(", ", map($self->deparse($_, 6), @exprs)); + } + if ($prefix or $amper) { + if ($op->flags & OPf_STACKED) { + return $prefix . $amper . $kid . "(" . $args . ")"; + } else { + return $prefix . $amper. $kid; + } + } else { + # glob() invocations can be translated into calls of + # CORE::GLOBAL::glob with a second parameter, a number. + # Reverse this. + if ($kid eq "CORE::GLOBAL::glob") { + $kid = "glob"; + $args =~ s/\s*,[^,]+$//; + } + + # It's a syntax error to call CORE::GLOBAL::foo without a prefix, + # so it must have been translated from a keyword call. Translate + # it back. + $kid =~ s/^CORE::GLOBAL:://; + + if (!$declared) { + return "$kid(" . $args . ")"; + } elsif (defined $proto and $proto eq "") { + return $kid; + } elsif (defined $proto and $proto eq "\$" and is_scalar($exprs[0])) { + return $self->maybe_parens_func($kid, $args, $cx, 16); + } elsif (defined($proto) && $proto or $simple) { + return $self->maybe_parens_func($kid, $args, $cx, 5); + } else { + return "$kid(" . $args . ")"; + } + } +} + +sub pp_enterwrite { unop(@_, "write") } + +# escape things that cause interpolation in double quotes, +# but not character escapes +sub uninterp { + my($str) = @_; + $str =~ s/(^|\G|[^\\])((?:\\\\)*)([\$\@]|\\[uUlLQE])/$1$2\\$3/g; + return $str; +} + +{ +my $bal; +BEGIN { + use re "eval"; + # Matches any string which is balanced with respect to {braces} + $bal = qr( + (?: + [^\\{}] + | \\\\ + | \\[{}] + | \{(??{$bal})\} + )* + )x; +} + +# the same, but treat $|, $), $( and $ at the end of the string differently +sub re_uninterp { + my($str) = @_; + + $str =~ s/ + ( ^|\G # $1 + | [^\\] + ) + + ( # $2 + (?:\\\\)* + ) + + ( # $3 + (\(\?\??\{$bal\}\)) # $4 + | [\$\@] + (?!\||\)|\(|$) + | \\[uUlLQE] + ) + + /length($4) ? "$1$2$4" : "$1$2\\$3"/xeg; + + return $str; +} + +# This is for regular expressions with the /x modifier +# We have to leave comments unmangled. +sub re_uninterp_extended { + my($str) = @_; + + $str =~ s/ + ( ^|\G # $1 + | [^\\] + ) + + ( # $2 + (?:\\\\)* + ) + + ( # $3 + ( \(\?\??\{$bal\}\) # $4 (skip over (?{}) and (??{}) blocks) + | \#[^\n]* # (skip over comments) + ) + | [\$\@] + (?!\||\)|\(|$|\s) + | \\[uUlLQE] + ) + + /length($4) ? "$1$2$4" : "$1$2\\$3"/xeg; + + return $str; +} +} + +my %unctrl = # portable to to EBCDIC + ( + "\c@" => '\c@', # unused + "\cA" => '\cA', + "\cB" => '\cB', + "\cC" => '\cC', + "\cD" => '\cD', + "\cE" => '\cE', + "\cF" => '\cF', + "\cG" => '\cG', + "\cH" => '\cH', + "\cI" => '\cI', + "\cJ" => '\cJ', + "\cK" => '\cK', + "\cL" => '\cL', + "\cM" => '\cM', + "\cN" => '\cN', + "\cO" => '\cO', + "\cP" => '\cP', + "\cQ" => '\cQ', + "\cR" => '\cR', + "\cS" => '\cS', + "\cT" => '\cT', + "\cU" => '\cU', + "\cV" => '\cV', + "\cW" => '\cW', + "\cX" => '\cX', + "\cY" => '\cY', + "\cZ" => '\cZ', + "\c[" => '\c[', # unused + "\c\\" => '\c\\', # unused + "\c]" => '\c]', # unused + "\c_" => '\c_', # unused + ); + +# character escapes, but not delimiters that might need to be escaped +sub escape_str { # ASCII, UTF8 + my($str) = @_; + $str =~ s/(.)/ord($1) > 255 ? sprintf("\\x{%x}", ord($1)) : $1/eg; + $str =~ s/\a/\\a/g; +# $str =~ s/\cH/\\b/g; # \b means something different in a regex + $str =~ s/\t/\\t/g; + $str =~ s/\n/\\n/g; + $str =~ s/\e/\\e/g; + $str =~ s/\f/\\f/g; + $str =~ s/\r/\\r/g; + $str =~ s/([\cA-\cZ])/$unctrl{$1}/ge; + $str =~ s/([[:^print:]])/sprintf("\\%03o", ord($1))/ge; + return $str; +} + +# For regexes with the /x modifier. +# Leave whitespace unmangled. +sub escape_extended_re { + my($str) = @_; + $str =~ s/(.)/ord($1) > 255 ? sprintf("\\x{%x}", ord($1)) : $1/eg; + $str =~ s/([[:^print:]])/ + ($1 =~ y! \t\n!!) ? $1 : sprintf("\\%03o", ord($1))/ge; + $str =~ s/\n/\n\f/g; + return $str; +} + +# Don't do this for regexen +sub unback { + my($str) = @_; + $str =~ s/\\/\\\\/g; + return $str; +} + +# Remove backslashes which precede literal control characters, +# to avoid creating ambiguity when we escape the latter. +sub re_unback { + my($str) = @_; + + # the insane complexity here is due to the behaviour of "\c\" + $str =~ s/(^|[^\\]|\\c\\)(?'], ['{','}']) { + ($open, $close) = @$ar; + $fail = 0; $cnt = 0; + for $c (@str) { + if ($c eq $open) { + $cnt++; + } elsif ($c eq $close) { + $cnt--; + if ($cnt < 0) { + # qq()() isn't ")(" + $fail = 1; + last; + } + } + } + $fail = 1 if $cnt != 0; + return ($open, "$open$str$close") if not $fail; + } + return ("", $str); +} + +sub single_delim { + my($q, $default, $str) = @_; + return "$default$str$default" if $default and index($str, $default) == -1; + if ($q ne 'qr') { + (my $succeed, $str) = balanced_delim($str); + return "$q$str" if $succeed; + } + for my $delim ('/', '"', '#') { + return "$q$delim" . $str . $delim if index($str, $delim) == -1; + } + if ($default) { + $str =~ s/$default/\\$default/g; + return "$default$str$default"; + } else { + $str =~ s[/][\\/]g; + return "$q/$str/"; + } +} + +sub const { + my $sv = shift; + if (class($sv) eq "SPECIAL") { + return ('undef', '1', '0')[$$sv-1]; # sv_undef, sv_yes, sv_no + } elsif (class($sv) eq "NULL") { + return 'undef'; + } elsif ($sv->FLAGS & SVf_IOK) { + return $sv->int_value; + } elsif ($sv->FLAGS & SVf_NOK) { + # try the default stringification + my $r = "".$sv->NV; + if ($r =~ /e/) { + # If it's in scientific notation, we might have lost information + return sprintf("%.20e", $sv->NV); + } + return $r; + } elsif ($sv->FLAGS & SVf_ROK && $sv->can("RV")) { + return "\\(" . const($sv->RV) . ")"; # constant folded + } elsif ($sv->FLAGS & SVf_POK) { + my $str = $sv->PV; + if ($str =~ /[^ -~]/) { # ASCII for non-printing + return single_delim("qq", '"', uninterp escape_str unback $str); + } else { + return single_delim("q", "'", unback $str); + } + } else { + return "undef"; + } +} + +sub const_sv { + my $self = shift; + my $op = shift; + my $sv = $op->sv; + # the constant could be in the pad (under useithreads) + $sv = $self->padval($op->targ) unless $$sv; + return $sv; +} + +sub pp_const { + my $self = shift; + my($op, $cx) = @_; + if ($op->private & OPpCONST_ARYBASE) { + return '$['; + } +# if ($op->private & OPpCONST_BARE) { # trouble with `=>' autoquoting +# return $self->const_sv($op)->PV; +# } + my $sv = $self->const_sv($op); +# return const($sv); + my $c = const $sv; + return $c =~ /^-\d/ ? $self->maybe_parens($c, $cx, 21) : $c; +} + +sub dq { + my $self = shift; + my $op = shift; + my $type = $op->name; + if ($type eq "const") { + return '$[' if $op->private & OPpCONST_ARYBASE; + return uninterp(escape_str(unback($self->const_sv($op)->as_string))); + } elsif ($type eq "concat") { + my $first = $self->dq($op->first); + my $last = $self->dq($op->last); + + # Disambiguate "${foo}bar", "${foo}{bar}", "${foo}[1]" + ($last =~ /^[A-Z\\\^\[\]_?]/ && + $first =~ s/([\$@])\^$/${1}{^}/) # "${^}W" etc + || ($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") { + return '\L' . $self->dq($op->first->sibling) . '\E'; + } elsif ($type eq "ucfirst") { + return '\u' . $self->dq($op->first->sibling); + } elsif ($type eq "lcfirst") { + return '\l' . $self->dq($op->first->sibling); + } elsif ($type eq "quotemeta") { + return '\Q' . $self->dq($op->first->sibling) . '\E'; + } elsif ($type eq "join") { + return $self->deparse($op->last, 26); # was join($", @ary) + } else { + return $self->deparse($op, 26); + } +} + +sub pp_backtick { + my $self = shift; + my($op, $cx) = @_; + # skip pushmark + return single_delim("qx", '`', $self->dq($op->first->sibling)); +} + +sub dquote { + my $self = 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, + sub {single_delim("qq", '"', $self->dq($_[1]))}); +} + +# OP_STRINGIFY is a listop, but it only ever has one arg +sub pp_stringify { maybe_targmy(@_, \&dquote) } + +# tr/// and s/// (and tr[][], tr[]//, tr###, etc) +# note that tr(from)/to/ is OK, but not tr/from/(to) +sub double_delim { + my($from, $to) = @_; + my($succeed, $delim); + if ($from !~ m[/] and $to !~ m[/]) { + return "/$from/$to/"; + } elsif (($succeed, $from) = balanced_delim($from) and $succeed) { + if (($succeed, $to) = balanced_delim($to) and $succeed) { + return "$from$to"; + } else { + for $delim ('/', '"', '#') { # note no `'' -- s''' is special + return "$from$delim$to$delim" if index($to, $delim) == -1; + } + $to =~ s[/][\\/]g; + return "$from/$to/"; + } + } else { + for $delim ('/', '"', '#') { # note no ' + return "$delim$from$delim$to$delim" + if index($to . $from, $delim) == -1; + } + $from =~ s[/][\\/]g; + $to =~ s[/][\\/]g; + return "/$from/$to/"; + } +} + +# Only used by tr///, so backslashes hyphens +sub pchr { # ASCII + my($n) = @_; + if ($n == ord '\\') { + return '\\\\'; + } elsif ($n == ord "-") { + return "\\-"; + } elsif ($n >= ord(' ') and $n <= ord('~')) { + return chr($n); + } elsif ($n == ord "\a") { + return '\\a'; + } elsif ($n == ord "\b") { + return '\\b'; + } elsif ($n == ord "\t") { + return '\\t'; + } elsif ($n == ord "\n") { + return '\\n'; + } elsif ($n == ord "\e") { + return '\\e'; + } elsif ($n == ord "\f") { + return '\\f'; + } elsif ($n == ord "\r") { + return '\\r'; + } elsif ($n >= ord("\cA") and $n <= ord("\cZ")) { + return '\\c' . chr(ord("@") + $n); + } else { +# return '\x' . sprintf("%02x", $n); + return '\\' . sprintf("%03o", $n); + } +} + +sub collapse { + my(@chars) = @_; + my($str, $c, $tr) = (""); + for ($c = 0; $c < @chars; $c++) { + $tr = $chars[$c]; + $str .= pchr($tr); + if ($c <= $#chars - 2 and $chars[$c + 1] == $tr + 1 and + $chars[$c + 2] == $tr + 2) + { + for (; $c <= $#chars-1 and $chars[$c + 1] == $chars[$c] + 1; $c++) + {} + $str .= "-"; + $str .= pchr($chars[$c]); + } + } + return $str; +} + +sub tr_decode_byte { + my($table, $flags) = @_; + my(@table) = unpack("s*", $table); + splice @table, 0x100, 1; # Number of subsequent elements + my($c, $tr, @from, @to, @delfrom, $delhyphen); + if ($table[ord "-"] != -1 and + $table[ord("-") - 1] == -1 || $table[ord("-") + 1] == -1) + { + $tr = $table[ord "-"]; + $table[ord "-"] = -1; + if ($tr >= 0) { + @from = ord("-"); + @to = $tr; + } else { # -2 ==> delete + $delhyphen = 1; + } + } + for ($c = 0; $c < @table; $c++) { + $tr = $table[$c]; + if ($tr >= 0) { + push @from, $c; push @to, $tr; + } elsif ($tr == -2) { + push @delfrom, $c; + } + } + @from = (@from, @delfrom); + if ($flags & OPpTRANS_COMPLEMENT) { + my @newfrom = (); + my %from; + @from{@from} = (1) x @from; + for ($c = 0; $c < 256; $c++) { + push @newfrom, $c unless $from{$c}; + } + @from = @newfrom; + } + unless ($flags & OPpTRANS_DELETE || !@to) { + pop @to while $#to and $to[$#to] == $to[$#to -1]; + } + my($from, $to); + $from = collapse(@from); + $to = collapse(@to); + $from .= "-" if $delhyphen; + return ($from, $to); +} + +sub tr_chr { + my $x = shift; + if ($x == ord "-") { + return "\\-"; + } elsif ($x == ord "\\") { + return "\\\\"; + } else { + return chr $x; + } +} + +# XXX This doesn't yet handle all cases correctly either + +sub tr_decode_utf8 { + my($swash_hv, $flags) = @_; + my %swash = $swash_hv->ARRAY; + my $final = undef; + $final = $swash{'FINAL'}->IV if exists $swash{'FINAL'}; + my $none = $swash{"NONE"}->IV; + my $extra = $none + 1; + my(@from, @delfrom, @to); + my $line; + foreach $line (split /\n/, $swash{'LIST'}->PV) { + my($min, $max, $result) = split(/\t/, $line); + $min = hex $min; + if (length $max) { + $max = hex $max; + } else { + $max = $min; + } + $result = hex $result; + if ($result == $extra) { + push @delfrom, [$min, $max]; + } else { + push @from, [$min, $max]; + push @to, [$result, $result + $max - $min]; + } + } + for my $i (0 .. $#from) { + if ($from[$i][0] == ord '-') { + unshift @from, splice(@from, $i, 1); + unshift @to, splice(@to, $i, 1); + last; + } elsif ($from[$i][1] == ord '-') { + $from[$i][1]--; + $to[$i][1]--; + unshift @from, ord '-'; + unshift @to, ord '-'; + last; + } + } + for my $i (0 .. $#delfrom) { + if ($delfrom[$i][0] == ord '-') { + push @delfrom, splice(@delfrom, $i, 1); + last; + } elsif ($delfrom[$i][1] == ord '-') { + $delfrom[$i][1]--; + push @delfrom, ord '-'; + last; + } + } + if (defined $final and $to[$#to][1] != $final) { + push @to, [$final, $final]; + } + push @from, @delfrom; + if ($flags & OPpTRANS_COMPLEMENT) { + my @newfrom; + my $next = 0; + for my $i (0 .. $#from) { + push @newfrom, [$next, $from[$i][0] - 1]; + $next = $from[$i][1] + 1; + } + @from = (); + for my $range (@newfrom) { + if ($range->[0] <= $range->[1]) { + push @from, $range; + } + } + } + my($from, $to, $diff); + for my $chunk (@from) { + $diff = $chunk->[1] - $chunk->[0]; + if ($diff > 1) { + $from .= tr_chr($chunk->[0]) . "-" . tr_chr($chunk->[1]); + } elsif ($diff == 1) { + $from .= tr_chr($chunk->[0]) . tr_chr($chunk->[1]); + } else { + $from .= tr_chr($chunk->[0]); + } + } + for my $chunk (@to) { + $diff = $chunk->[1] - $chunk->[0]; + if ($diff > 1) { + $to .= tr_chr($chunk->[0]) . "-" . tr_chr($chunk->[1]); + } elsif ($diff == 1) { + $to .= tr_chr($chunk->[0]) . tr_chr($chunk->[1]); + } else { + $to .= tr_chr($chunk->[0]); + } + } + #$final = sprintf("%04x", $final) if defined $final; + #$none = sprintf("%04x", $none) if defined $none; + #$extra = sprintf("%04x", $extra) if defined $extra; + #print STDERR "final: $final\n none: $none\nextra: $extra\n"; + #print STDERR $swash{'LIST'}->PV; + return (escape_str($from), escape_str($to)); +} + +sub pp_trans { + my $self = shift; + my($op, $cx) = @_; + my($from, $to); + if (class($op) eq "PVOP") { + ($from, $to) = tr_decode_byte($op->pv, $op->private); + } else { # class($op) eq "SVOP" + ($from, $to) = tr_decode_utf8($op->sv->RV, $op->private); + } + my $flags = ""; + $flags .= "c" if $op->private & OPpTRANS_COMPLEMENT; + $flags .= "d" if $op->private & OPpTRANS_DELETE; + $to = "" if $from eq $to and $flags eq ""; + $flags .= "s" if $op->private & OPpTRANS_SQUASH; + return "tr" . double_delim($from, $to) . $flags; +} + +# Like dq(), but different +sub re_dq { + my $self = shift; + my ($op, $extended) = @_; + + my $type = $op->name; + if ($type eq "const") { + return '$[' if $op->private & OPpCONST_ARYBASE; + my $unbacked = re_unback($self->const_sv($op)->as_string); + return re_uninterp_extended(escape_extended_re($unbacked)) + if $extended; + return re_uninterp(escape_str($unbacked)); + } elsif ($type eq "concat") { + my $first = $self->re_dq($op->first, $extended); + my $last = $self->re_dq($op->last, $extended); + + # Disambiguate "${foo}bar", "${foo}{bar}", "${foo}[1]" + ($last =~ /^[A-Z\\\^\[\]_?]/ && + $first =~ s/([\$@])\^$/${1}{^}/) # "${^}W" etc + || ($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, $extended) . '\E'; + } elsif ($type eq "lc") { + return '\L' . $self->re_dq($op->first->sibling, $extended) . '\E'; + } elsif ($type eq "ucfirst") { + return '\u' . $self->re_dq($op->first->sibling, $extended); + } elsif ($type eq "lcfirst") { + return '\l' . $self->re_dq($op->first->sibling, $extended); + } elsif ($type eq "quotemeta") { + return '\Q' . $self->re_dq($op->first->sibling, $extended) . '\E'; + } elsif ($type eq "join") { + return $self->deparse($op->last, 26); # was join($", @ary) + } else { + return $self->deparse($op, 26); + } +} + +sub pure_string { + my ($self, $op) = @_; + my $type = $op->name; + + if ($type eq 'const') { + return 1; + } + elsif ($type =~ /^[ul]c(first)?$/ || $type eq 'quotemeta') { + return $self->pure_string($op->first->sibling); + } + elsif ($type eq 'join') { + my $join_op = $op->first->sibling; # Skip pushmark + return 0 unless $join_op->name eq 'null' && $join_op->targ eq OP_RV2SV; + + my $gvop = $join_op->first; + return 0 unless $gvop->name eq 'gvsv'; + return 0 unless '"' eq $self->gv_name($self->gv_or_padgv($gvop)); + + return 0 unless ${$join_op->sibling} eq ${$op->last}; + return 0 unless $op->last->name =~ /^(rv2|pad)av$/; + } + elsif ($type eq 'concat') { + return $self->pure_string($op->first) + && $self->pure_string($op->last); + } + elsif (is_scalar($op) || $type =~ /^[ah]elem(fast)?$/) { + return 1; + } + else { + return 0; + } + + return 1; +} + +sub regcomp { + my $self = shift; + my($op, $cx, $extended) = @_; + my $kid = $op->first; + $kid = $kid->first if $kid->name eq "regcmaybe"; + $kid = $kid->first if $kid->name eq "regcreset"; + return ($self->re_dq($kid, $extended), 1) if $self->pure_string($kid); + return ($self->deparse($kid, $cx), 0); +} + +sub pp_regcomp { + my ($self, $op, $cx) = @_; + return (($self->regcomp($op, $cx, 0))[0]); +} + +# osmic acid -- see osmium tetroxide + +my %matchwords; +map($matchwords{join "", sort split //, $_} = $_, 'cig', 'cog', 'cos', 'cogs', + 'cox', 'go', 'is', 'ism', 'iso', 'mig', 'mix', 'osmic', 'ox', 'sic', + 'sig', 'six', 'smog', 'so', 'soc', 'sog', 'xi'); + +sub matchop { + my $self = shift; + my($op, $cx, $name, $delim) = @_; + my $kid = $op->first; + my ($binop, $var, $re) = ("", "", ""); + if ($op->flags & OPf_STACKED) { + $binop = 1; + $var = $self->deparse($kid, 20); + $kid = $kid->sibling; + } + my $quote = 1; + my $extended = ($op->pmflags & PMf_EXTENDED); + if (null $kid) { + my $unbacked = re_unback($op->precomp); + if ($extended) { + $re = re_uninterp_extended(escape_extended_re($unbacked)); + } else { + $re = re_uninterp(escape_str(re_unback($op->precomp))); + } + } elsif ($kid->name ne 'regcomp') { + carp("found ".$kid->name." where regcomp expected"); + } else { + ($re, $quote) = $self->regcomp($kid, 1, $extended); + } + my $flags = ""; + $flags .= "c" if $op->pmflags & PMf_CONTINUE; + $flags .= "g" if $op->pmflags & PMf_GLOBAL; + $flags .= "i" if $op->pmflags & PMf_FOLD; + $flags .= "m" if $op->pmflags & PMf_MULTILINE; + $flags .= "o" if $op->pmflags & PMf_KEEP; + $flags .= "s" if $op->pmflags & PMf_SINGLELINE; + $flags .= "x" if $op->pmflags & PMf_EXTENDED; + $flags = $matchwords{$flags} if $matchwords{$flags}; + if ($op->pmflags & PMf_ONCE) { # only one kind of delimiter works here + $re =~ s/\?/\\?/g; + $re = "?$re?"; + } elsif ($quote) { + $re = single_delim($name, $delim, $re); + } + $re = $re . $flags if $quote; + if ($binop) { + return $self->maybe_parens("$var =~ $re", $cx, 20); + } else { + return $re; + } +} + +sub pp_match { matchop(@_, "m", "/") } +sub pp_pushre { matchop(@_, "m", "/") } +sub pp_qr { matchop(@_, "qr", "") } + +sub pp_split { + my $self = shift; + my($op, $cx) = @_; + my($kid, @exprs, $ary, $expr); + $kid = $op->first; + # under ithreads pmreplroot is an integer, not an SV + my $replroot = $kid->pmreplroot; + if ( ( ref($replroot) && $$replroot ) || + ( !ref($replroot) && $replroot ) ) { + $ary = $self->stash_variable('@', $self->gv_name($kid->pmreplroot)); + } + for (; !null($kid); $kid = $kid->sibling) { + push @exprs, $self->deparse($kid, 6); + } + + # handle special case of split(), and split(" ") that compiles to /\s+/ + $kid = $op->first; + if ($kid->flags & OPf_SPECIAL + && $exprs[0] eq '/\\s+/' + && $kid->pmflags & PMf_SKIPWHITE ) { + $exprs[0] = '" "'; + } + + $expr = "split(" . join(", ", @exprs) . ")"; + if ($ary) { + return $self->maybe_parens("$ary = $expr", $cx, 7); + } else { + return $expr; + } +} + +# oxime -- any of various compounds obtained chiefly by the action of +# hydroxylamine on aldehydes and ketones and characterized by the +# bivalent grouping C=NOH [Webster's Tenth] + +my %substwords; +map($substwords{join "", sort split //, $_} = $_, 'ego', 'egoism', 'em', + 'es', 'ex', 'exes', 'gee', 'go', 'goes', 'ie', 'ism', 'iso', 'me', + 'meese', 'meso', 'mig', 'mix', 'os', 'ox', 'oxime', 'see', 'seem', + 'seg', 'sex', 'sig', 'six', 'smog', 'sog', 'some', 'xi'); + +sub pp_subst { + my $self = shift; + my($op, $cx) = @_; + my $kid = $op->first; + my($binop, $var, $re, $repl) = ("", "", "", ""); + if ($op->flags & OPf_STACKED) { + $binop = 1; + $var = $self->deparse($kid, 20); + $kid = $kid->sibling; + } + my $flags = ""; + if (null($op->pmreplroot)) { + $repl = $self->dq($kid); + $kid = $kid->sibling; + } else { + $repl = $op->pmreplroot->first; # skip substcont + while ($repl->name eq "entereval") { + $repl = $repl->first; + $flags .= "e"; + } + if ($op->pmflags & PMf_EVAL) { + $repl = $self->deparse($repl, 0); + } else { + $repl = $self->dq($repl); + } + } + my $extended = ($op->pmflags & PMf_EXTENDED); + if (null $kid) { + my $unbacked = re_unback($op->precomp); + if ($extended) { + $re = re_uninterp_extended(escape_extended_re($unbacked)); + } + else { + $re = re_uninterp(escape_str($unbacked)); + } + } else { + ($re) = $self->regcomp($kid, 1, $extended); + } + $flags .= "e" if $op->pmflags & PMf_EVAL; + $flags .= "g" if $op->pmflags & PMf_GLOBAL; + $flags .= "i" if $op->pmflags & PMf_FOLD; + $flags .= "m" if $op->pmflags & PMf_MULTILINE; + $flags .= "o" if $op->pmflags & PMf_KEEP; + $flags .= "s" if $op->pmflags & PMf_SINGLELINE; + $flags .= "x" if $extended; + $flags = $substwords{$flags} if $substwords{$flags}; + if ($binop) { + return $self->maybe_parens("$var =~ s" + . double_delim($re, $repl) . $flags, + $cx, 20); + } else { + return "s". double_delim($re, $repl) . $flags; + } +} + +1; +__END__ + +=head1 NAME + +B::Deparse - Perl compiler backend to produce perl code + +=head1 SYNOPSIS + +B B<-MO=Deparse>[B<,-u>I][B<,-p>][B<,-q>][B<,-l>] + [B<,-s>I][B<,-x>I] I + +=head1 DESCRIPTION + +B::Deparse is a backend module for the Perl compiler that generates +perl source code, based on the internal compiled structure that perl +itself creates after parsing a program. The output of B::Deparse won't +be exactly the same as the original source, since perl doesn't keep +track of comments or whitespace, and there isn't a one-to-one +correspondence between perl's syntactical constructions and their +compiled form, but it will often be close. When you use the B<-p> +option, the output also includes parentheses even when they are not +required by precedence, which can make it easy to see if perl is +parsing your expressions the way you intended. + +Please note that this module is mainly new and untested code and is +still under development, so it may change in the future. + +=head1 OPTIONS + +As with all compiler backend options, these must follow directly after +the '-MO=Deparse', separated by a comma but not any white space. + +=over 4 + +=item B<-l> + +Add '#line' declarations to the output based on the line and file +locations of the original code. + +=item B<-p> + +Print extra parentheses. Without this option, B::Deparse includes +parentheses in its output only when they are needed, based on the +structure of your program. With B<-p>, it uses parentheses (almost) +whenever they would be legal. This can be useful if you are used to +LISP, or if you want to see how perl parses your input. If you say + + if ($var & 0x7f == 65) {print "Gimme an A!"} + print ($which ? $a : $b), "\n"; + $name = $ENV{USER} or "Bob"; + +C will print + + if (($var & 0)) { + print('Gimme an A!') + }; + (print(($which ? $a : $b)), '???'); + (($name = $ENV{'USER'}) or '???') + +which probably isn't what you intended (the C<'???'> is a sign that +perl optimized away a constant value). + +=item B<-P> + +Disable prototype checking. With this option, all function calls are +deparsed as if no prototype was defined for them. In other words, + + perl -MO=Deparse,-P -e 'sub foo (\@) { 1 } foo @x' + +will print + + sub foo (\@) { + 1; + } + &foo(\@x); + +making clear how the parameters are actually passed to C. + +=item B<-q> + +Expand double-quoted strings into the corresponding combinations of +concatenation, uc, ucfirst, lc, lcfirst, quotemeta, and join. For +instance, print + + print "Hello, $world, @ladies, \u$gentlemen\E, \u\L$me!"; + +as + + print 'Hello, ' . $world . ', ' . join($", @ladies) . ', ' + . ucfirst($gentlemen) . ', ' . ucfirst(lc $me . '!'); + +Note that the expanded form represents the way perl handles such +constructions internally -- this option actually turns off the reverse +translation that B::Deparse usually does. On the other hand, note that +C<$x = "$y"> is not the same as C<$x = $y>: the former makes the value +of $y into a string before doing the assignment. + +=item B<-f>I + +Normally, B::Deparse deparses the main code of a program, and all the subs +defined in the same file. To include subs defined in other files, pass the +B<-f> option with the filename. You can pass the B<-f> option several times, to +include more than one secondary file. (Most of the time you don't want to +use it at all.) You can also use this option to include subs which are +defined in the scope of a B<#line> directive with two parameters. + +=item B<-s>I + +Tweak the style of B::Deparse's output. The letters should follow +directly after the 's', with no space or punctuation. The following +options are available: + +=over 4 + +=item B + +Cuddle C, C, and C blocks. For example, print + + if (...) { + ... + } else { + ... + } + +instead of + + if (...) { + ... + } + else { + ... + } + +The default is not to cuddle. + +=item BI + +Indent lines by multiples of I columns. The default is 4 columns. + +=item B + +Use tabs for each 8 columns of indent. The default is to use only spaces. +For instance, if the style options are B<-si4T>, a line that's indented +3 times will be preceded by one tab and four spaces; if the options were +B<-si8T>, the same line would be preceded by three tabs. + +=item BIB<.> + +Print I for the value of a constant that can't be determined +because it was optimized away (mnemonic: this happens when a constant +is used in Boid context). The end of the string is marked by a period. +The string should be a valid perl expression, generally a constant. +Note that unless it's a number, it probably needs to be quoted, and on +a command line quotes need to be protected from the shell. Some +conventional values include 0, 1, 42, '', 'foo', and +'Useless use of constant omitted' (which may need to be +B<-sv"'Useless use of constant omitted'."> +or something similar depending on your shell). The default is '???'. +If you're using B::Deparse on a module or other file that's require'd, +you shouldn't use a value that evaluates to false, since the customary +true constant at the end of a module will be in void context when the +file is compiled as a main program. + +=back + +=item B<-x>I + +Expand conventional syntax constructions into equivalent ones that expose +their internal operation. I 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 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 is at least 7, if statements will be translated into equivalent +expressions using C<&&>, C and C; 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 + +=head2 Synopsis + + use B::Deparse; + $deparse = B::Deparse->new("-p", "-sC"); + $body = $deparse->coderef2text(\&func); + eval "sub func $body"; # the inverse operation + +=head2 Description + +B::Deparse can also be used on a sub-by-sub basis from other perl +programs. + +=head2 new + + $deparse = B::Deparse->new(OPTIONS) + +Create an object to store the state of a deparsing operation and any +options. The options are the same as those that can be given on the +command line (see L); options that are separated by commas +after B<-MO=Deparse> should be given as separate strings. Some +options, like B<-u>, don't make sense for a single subroutine, so +don't pass them. + +=head2 ambient_pragmas + + $deparse->ambient_pragmas(strict => 'all', '$[' => $[); + +The compilation of a subroutine can be affected by a few compiler +directives, B. These are: + +=over 4 + +=item * + +use strict; + +=item * + +use warnings; + +=item * + +Assigning to the special variable $[ + +=item * + +use integer; + +=item * + +use bytes; + +=item * + +use utf8; + +=item * + +use re; + +=back + +Ordinarily, if you use B::Deparse on a subroutine which has +been compiled in the presence of one or more of these pragmas, +the output will include statements to turn on the appropriate +directives. So if you then compile the code returned by coderef2text, +it will behave the same way as the subroutine which you deparsed. + +However, you may know that you intend to use the results in a +particular context, where some pragmas are already in scope. In +this case, you use the B method to describe the +assumptions you wish to make. + +Not all of the options currently have any useful effect. See +L for more details. + +The parameters it accepts are: + +=over 4 + +=item strict + +Takes a string, possibly containing several values separated +by whitespace. The special values "all" and "none" mean what you'd +expect. + + $deparse->ambient_pragmas(strict => 'subs refs'); + +=item $[ + +Takes a number, the value of the array base $[. + +=item bytes + +=item utf8 + +=item integer + +If the value is true, then the appropriate pragma is assumed to +be in the ambient scope, otherwise not. + +=item re + +Takes a string, possibly containing a whitespace-separated list of +values. The values "all" and "none" are special. It's also permissible +to pass an array reference here. + + $deparser->ambient_pragmas(re => 'eval'); + + +=item warnings + +Takes a string, possibly containing a whitespace-separated list of +values. The values "all" and "none" are special, again. It's also +permissible to pass an array reference here. + + $deparser->ambient_pragmas(warnings => [qw[void io]]); + +If one of the values is the string "FATAL", then all the warnings +in that list will be considered fatal, just as with the B +pragma itself. Should you need to specify that some warnings are +fatal, and others are merely enabled, you can pass the B +parameter twice: + + $deparser->ambient_pragmas( + warnings => 'all', + warnings => [FATAL => qw/void io/], + ); + +See L for more information about lexical warnings. + +=item hint_bits + +=item warning_bits + +These two parameters are used to specify the ambient pragmas in +the format used by the special variables $^H and ${^WARNING_BITS}. + +They exist principally so that you can write code like: + + { my ($hint_bits, $warning_bits); + BEGIN {($hint_bits, $warning_bits) = ($^H, ${^WARNING_BITS})} + $deparser->ambient_pragmas ( + hint_bits => $hint_bits, + warning_bits => $warning_bits, + '$[' => 0 + $[ + ); } + +which specifies that the ambient pragmas are exactly those which +are in scope at the point of calling. + +=back + +=head2 coderef2text + + $body = $deparse->coderef2text(\&func) + $body = $deparse->coderef2text(sub ($$) { ... }) + +Return source code for the body of a subroutine (a block, optionally +preceded by a prototype in parens), given a reference to the +sub. Because a subroutine can have no names, or more than one name, +this method doesn't return a complete subroutine definition -- if you +want to eval the result, you should prepend "sub subname ", or "sub " +for an anonymous function constructor. Unless the sub was defined in +the main:: package, the code will include a package declaration. + +=head1 BUGS + +=over 4 + +=item * + +The only pragmas to be completely supported are: C, +C, C, and C. (C<$[>, which +behaves like a pragma, is also supported.) + +Excepting those listed above, we're currently unable to guarantee that +B::Deparse will produce a pragma at the correct point in the program. +Since the effects of pragmas are often lexically scoped, this can mean +that the pragma holds sway over a different portion of the program +than in the input file. + +=item * + +In fact, the above is a specific instance of a more general problem: +we can't guarantee to produce BEGIN blocks or C declarations in +exactly the right place. So if you use a module which affects compilation +(such as by over-riding keywords, overloading constants or whatever) +then the output code might not work as intended. + +This is the most serious outstanding problem, and will be very hard +to fix. + +=item * + +If a keyword is over-ridden, and your program explicitly calls +the built-in version by using CORE::keyword, the output of B::Deparse +will not reflect this. If you run the resulting code, it will call +the over-ridden version rather than the built-in one. (Maybe there +should be an option to B print keyword calls as C.) + +=item * + +C comes out as C, which +causes perl to issue a warning. + +The obvious fix doesn't work, because these are different: + + print (FOO 1, 2, 3), 4, 5, 6; + print FOO (1, 2, 3), 4, 5, 6; + +=item * + +Constants (other than simple strings or numbers) don't work properly. +Pathological examples that fail (and probably always will) include: + + use constant E2BIG => ($!=7); + use constant x=>\$x; print x + +The following could (and should) be made to work: + + use constant regex => qr/blah/; + print regex; + +=item * + +An input file that uses source filtering probably won't be deparsed into +runnable code, because it will still include the B declaration +for the source filtering module, even though the code that is +produced is already ordinary Perl which shouldn't be filtered again. + +=item * + +There are probably many more bugs on non-ASCII platforms (EBCDIC). + +=back + +=head1 AUTHOR + +Stephen McCamant , based on an earlier +version by Malcolm Beattie , with +contributions from Gisle Aas, James Duncan, Albert Dvornik, Robin +Houston, Hugo van der Sanden, Gurusamy Sarathy, Nick Ing-Simmons, +and Rafael Garcia-Suarez. + +=cut diff --git a/Master/perltl/lib/Carp.pm b/Master/perltl/lib/Carp.pm new file mode 100644 index 00000000000..6199f894487 --- /dev/null +++ b/Master/perltl/lib/Carp.pm @@ -0,0 +1,196 @@ +package Carp; + +our $VERSION = '1.01'; + +=head1 NAME + +carp - warn of errors (from perspective of caller) + +cluck - warn of errors with stack backtrace + (not exported by default) + +croak - die of errors (from perspective of caller) + +confess - die of errors with stack backtrace + +shortmess - return the message that carp and croak produce + +longmess - return the message that cluck and confess produce + +=head1 SYNOPSIS + + use Carp; + croak "We're outta here!"; + + use Carp qw(cluck); + cluck "This is how we got here!"; + + print FH Carp::shortmess("This will have caller's details added"); + print FH Carp::longmess("This will have stack backtrace added"); + +=head1 DESCRIPTION + +The Carp routines are useful in your own modules because +they act like die() or warn(), but with a message which is more +likely to be useful to a user of your module. In the case of +cluck, confess, and longmess that context is a summary of every +call in the call-stack. For a shorter message you can use carp, +croak or shortmess which report the error as being from where +your module was called. There is no guarantee that that is where +the error was, but it is a good educated guess. + +Here is a more complete description of how shortmess works. What +it does is search the call-stack for a function call stack where +it hasn't been told that there shouldn't be an error. If every +call is marked safe, it then gives up and gives a full stack +backtrace instead. In other words it presumes that the first likely +looking potential suspect is guilty. Its rules for telling whether +a call shouldn't generate errors work as follows: + +=over 4 + +=item 1. + +Any call from a package to itself is safe. + +=item 2. + +Packages claim that there won't be errors on calls to or from +packages explicitly marked as safe by inclusion in @CARP_NOT, or +(if that array is empty) @ISA. The ability to override what +@ISA says is new in 5.8. + +=item 3. + +The trust in item 2 is transitive. If A trusts B, and B +trusts C, then A trusts C. So if you do not override @ISA +with @CARP_NOT, then this trust relationship is identical to, +"inherits from". + +=item 4. + +Any call from an internal Perl module is safe. (Nothing keeps +user modules from marking themselves as internal to Perl, but +this practice is discouraged.) + +=item 5. + +Any call to Carp is safe. (This rule is what keeps it from +reporting the error where you call carp/croak/shortmess.) + +=back + +=head2 Forcing a Stack Trace + +As a debugging aid, you can force Carp to treat a croak as a confess +and a carp as a cluck across I modules. In other words, force a +detailed stack trace to be given. This can be very helpful when trying +to understand why, or from where, a warning or error is being generated. + +This feature is enabled by 'importing' the non-existent symbol +'verbose'. You would typically enable it by saying + + perl -MCarp=verbose script.pl + +or by including the string C in the PERL5OPT +environment variable. + +=head1 BUGS + +The Carp routines don't handle exception objects currently. +If called with a first argument that is a reference, they simply +call die() or warn(), as appropriate. + +=cut + +# This package is heavily used. Be small. Be fast. Be good. + +# Comments added by Andy Wardley 09-Apr-98, based on an +# _almost_ complete understanding of the package. Corrections and +# comments are welcome. + +# The members of %Internal are packages that are internal to perl. +# Carp will not report errors from within these packages if it +# can. The members of %CarpInternal are internal to Perl's warning +# system. Carp will not report errors from within these packages +# either, and will not report calls *to* these packages for carp and +# croak. They replace $CarpLevel, which is deprecated. The +# $Max(EvalLen|(Arg(Len|Nums)) variables are used to specify how the eval +# text and function arguments should be formatted when printed. + +$CarpInternal{Carp}++; +$CarpInternal{warnings}++; +$CarpLevel = 0; # How many extra package levels to skip on carp. + # How many calls to skip on confess. + # Reconciling these notions is hard, use + # %Internal and %CarpInternal instead. +$MaxEvalLen = 0; # How much eval '...text...' to show. 0 = all. +$MaxArgLen = 64; # How much of each argument to print. 0 = all. +$MaxArgNums = 8; # How many arguments to print. 0 = all. +$Verbose = 0; # If true then make shortmess call longmess instead + +require Exporter; +@ISA = ('Exporter'); +@EXPORT = qw(confess croak carp); +@EXPORT_OK = qw(cluck verbose longmess shortmess); +@EXPORT_FAIL = qw(verbose); # hook to enable verbose mode + + +# if the caller specifies verbose usage ("perl -MCarp=verbose script.pl") +# then the following method will be called by the Exporter which knows +# to do this thanks to @EXPORT_FAIL, above. $_[1] will contain the word +# 'verbose'. + +sub export_fail { + shift; + $Verbose = shift if $_[0] eq 'verbose'; + return @_; +} + + +# longmess() crawls all the way up the stack reporting on all the function +# calls made. The error string, $error, is originally constructed from the +# arguments passed into longmess() via confess(), cluck() or shortmess(). +# This gets appended with the stack trace messages which are generated for +# each function call on the stack. + +sub longmess { + { local $@; require Carp::Heavy; } # XXX fix require to not clear $@? + # Icky backwards compatibility wrapper. :-( + my $call_pack = caller(); + if ($Internal{$call_pack} or $CarpInternal{$call_pack}) { + return longmess_heavy(@_); + } + else { + local $CarpLevel = $CarpLevel + 1; + return longmess_heavy(@_); + } +} + + +# shortmess() is called by carp() and croak() to skip all the way up to +# the top-level caller's package and report the error from there. confess() +# and cluck() generate a full stack trace so they call longmess() to +# generate that. In verbose mode shortmess() calls longmess() so +# you always get a stack trace + +sub shortmess { # Short-circuit &longmess if called via multiple packages + { local $@; require Carp::Heavy; } # XXX fix require to not clear $@? + # Icky backwards compatibility wrapper. :-( + my $call_pack = caller(); + local @CARP_NOT = caller(); + shortmess_heavy(@_); +} + + +# the following four functions call longmess() or shortmess() depending on +# whether they should generate a full stack trace (confess() and cluck()) +# or simply report the caller's package (croak() and carp()), respectively. +# confess() and croak() die, carp() and cluck() warn. + +sub croak { die shortmess @_ } +sub confess { die longmess @_ } +sub carp { warn shortmess @_ } +sub cluck { warn longmess @_ } + +1; diff --git a/Master/perltl/lib/Carp/Heavy.pm b/Master/perltl/lib/Carp/Heavy.pm new file mode 100644 index 00000000000..c3d3c26fa1a --- /dev/null +++ b/Master/perltl/lib/Carp/Heavy.pm @@ -0,0 +1,247 @@ +# Carp::Heavy uses some variables in common with Carp. +package Carp; + +=head1 NAME + +Carp heavy machinery - no user serviceable parts inside + +=cut + +# use strict; # not yet + +# On one line so MakeMaker will see it. +use Carp; our $VERSION = $Carp::VERSION; + +our ($CarpLevel, $MaxArgNums, $MaxEvalLen, $MaxArgLen, $Verbose); + +sub caller_info { + my $i = shift(@_) + 1; + package DB; + my %call_info; + @call_info{ + qw(pack file line sub has_args wantarray evaltext is_require) + } = caller($i); + + unless (defined $call_info{pack}) { + return (); + } + + my $sub_name = Carp::get_subname(\%call_info); + if ($call_info{has_args}) { + my @args = map {Carp::format_arg($_)} @DB::args; + if ($MaxArgNums and @args > $MaxArgNums) { # More than we want to show? + $#args = $MaxArgNums; + push @args, '...'; + } + # Push the args onto the subroutine + $sub_name .= '(' . join (',', @args) . ')'; + } + $call_info{sub_name} = $sub_name; + return wantarray() ? %call_info : \%call_info; +} + +# Transform an argument to a function into a string. +sub format_arg { + my $arg = shift; + if (not defined($arg)) { + $arg = 'undef'; + } + elsif (ref($arg)) { + $arg = defined($overload::VERSION) ? overload::StrVal($arg) : "$arg"; + } + $arg =~ s/'/\\'/g; + $arg = str_len_trim($arg, $MaxArgLen); + + # Quote it? + $arg = "'$arg'" unless $arg =~ /^-?[\d.]+\z/; + + # The following handling of "control chars" is direct from + # the original code - I think it is broken on Unicode though. + # Suggestions? + $arg =~ s/([[:cntrl:]]|[[:^ascii:]])/sprintf("\\x{%x}",ord($1))/eg; + return $arg; +} + +# Takes an inheritance cache and a package and returns +# an anon hash of known inheritances and anon array of +# inheritances which consequences have not been figured +# for. +sub get_status { + my $cache = shift; + my $pkg = shift; + $cache->{$pkg} ||= [{$pkg => $pkg}, [trusts_directly($pkg)]]; + return @{$cache->{$pkg}}; +} + +# Takes the info from caller() and figures out the name of +# the sub/require/eval +sub get_subname { + my $info = shift; + if (defined($info->{evaltext})) { + my $eval = $info->{evaltext}; + if ($info->{is_require}) { + return "require $eval"; + } + else { + $eval =~ s/([\\\'])/\\$1/g; + return "eval '" . str_len_trim($eval, $MaxEvalLen) . "'"; + } + } + + return ($info->{sub} eq '(eval)') ? 'eval {...}' : $info->{sub}; +} + +# Figures out what call (from the point of view of the caller) +# the long error backtrace should start at. +sub long_error_loc { + my $i; + my $lvl = $CarpLevel; + { + my $pkg = caller(++$i); + unless(defined($pkg)) { + # This *shouldn't* happen. + if (%Internal) { + local %Internal; + $i = long_error_loc(); + last; + } + else { + # OK, now I am irritated. + return 2; + } + } + redo if $CarpInternal{$pkg}; + redo unless 0 > --$lvl; + redo if $Internal{$pkg}; + } + return $i - 1; +} + + +sub longmess_heavy { + return @_ if ref($_[0]); # don't break references as exceptions + my $i = long_error_loc(); + return ret_backtrace($i, @_); +} + +# Returns a full stack backtrace starting from where it is +# told. +sub ret_backtrace { + my ($i, @error) = @_; + my $mess; + my $err = join '', @error; + $i++; + + my $tid_msg = ''; + if (defined &Thread::tid) { + my $tid = Thread->self->tid; + $tid_msg = " thread $tid" if $tid; + } + + { if ($err =~ /\n$/) { # extra block to localise $1 etc + $mess = $err; + } + else { + my %i = caller_info($i); + $mess = "$err at $i{file} line $i{line}$tid_msg\n"; + }} + + while (my %i = caller_info(++$i)) { + $mess .= "\t$i{sub_name} called at $i{file} line $i{line}$tid_msg\n"; + } + + return $mess; +} + +sub ret_summary { + my ($i, @error) = @_; + my $mess; + my $err = join '', @error; + $i++; + + my $tid_msg = ''; + if (defined &Thread::tid) { + my $tid = Thread->self->tid; + $tid_msg = " thread $tid" if $tid; + } + + my %i = caller_info($i); + return "$err at $i{file} line $i{line}$tid_msg\n"; +} + + +sub short_error_loc { + my $cache; + my $i = 1; + my $lvl = $CarpLevel; + { + my $called = caller($i++); + my $caller = caller($i); + return 0 unless defined($caller); # What happened? + redo if $Internal{$caller}; + redo if $CarpInternal{$called}; + redo if trusts($called, $caller, $cache); + redo if trusts($caller, $called, $cache); + redo unless 0 > --$lvl; + } + return $i - 1; +} + +sub shortmess_heavy { + return longmess_heavy(@_) if $Verbose; + return @_ if ref($_[0]); # don't break references as exceptions + my $i = short_error_loc(); + if ($i) { + ret_summary($i, @_); + } + else { + longmess_heavy(@_); + } +} + +# If a string is too long, trims it with ... +sub str_len_trim { + my $str = shift; + my $max = shift || 0; + if (2 < $max and $max < length($str)) { + substr($str, $max - 3) = '...'; + } + return $str; +} + +# Takes two packages and an optional cache. Says whether the +# first inherits from the second. +# +# Recursive versions of this have to work to avoid certain +# possible endless loops, and when following long chains of +# inheritance are less efficient. +sub trusts { + my $child = shift; + my $parent = shift; + my $cache = shift || {}; + my ($known, $partial) = get_status($cache, $child); + # Figure out consequences until we have an answer + while (@$partial and not exists $known->{$parent}) { + my $anc = shift @$partial; + next if exists $known->{$anc}; + $known->{$anc}++; + my ($anc_knows, $anc_partial) = get_status($cache, $anc); + my @found = keys %$anc_knows; + @$known{@found} = (); + push @$partial, @$anc_partial; + } + return exists $known->{$parent}; +} + +# Takes a package and gives a list of those trusted directly +sub trusts_directly { + my $class = shift; + no strict 'refs'; + no warnings 'once'; + return @{"$class\::CARP_NOT"} + ? @{"$class\::CARP_NOT"} + : @{"$class\::ISA"}; +} + +1; + diff --git a/Master/perltl/lib/Class/Struct.pm b/Master/perltl/lib/Class/Struct.pm new file mode 100644 index 00000000000..bad4f78165f --- /dev/null +++ b/Master/perltl/lib/Class/Struct.pm @@ -0,0 +1,632 @@ +package Class::Struct; + +## See POD after __END__ + +use 5.006_001; + +use strict; +use warnings::register; +our(@ISA, @EXPORT, $VERSION); + +use Carp; + +require Exporter; +@ISA = qw(Exporter); +@EXPORT = qw(struct); + +$VERSION = '0.61'; + +## Tested on 5.002 and 5.003 without class membership tests: +my $CHECK_CLASS_MEMBERSHIP = ($] >= 5.003_95); + +my $print = 0; +sub printem { + if (@_) { $print = shift } + else { $print++ } +} + +{ + package Class::Struct::Tie_ISA; + + sub TIEARRAY { + my $class = shift; + return bless [], $class; + } + + sub STORE { + my ($self, $index, $value) = @_; + Class::Struct::_subclass_error(); + } + + sub FETCH { + my ($self, $index) = @_; + $self->[$index]; + } + + sub FETCHSIZE { + my $self = shift; + return scalar(@$self); + } + + sub DESTROY { } +} + +sub import { + my $self = shift; + + if ( @_ == 0 ) { + $self->export_to_level( 1, $self, @EXPORT ); + } elsif ( @_ == 1 ) { + # This is admittedly a little bit silly: + # do we ever export anything else than 'struct'...? + $self->export_to_level( 1, $self, @_ ); + } else { + &struct; + } +} + +sub struct { + + # Determine parameter list structure, one of: + # struct( class => [ element-list ]) + # struct( class => { element-list }) + # struct( element-list ) + # Latter form assumes current package name as struct name. + + my ($class, @decls); + my $base_type = ref $_[1]; + if ( $base_type eq 'HASH' ) { + $class = shift; + @decls = %{shift()}; + _usage_error() if @_; + } + elsif ( $base_type eq 'ARRAY' ) { + $class = shift; + @decls = @{shift()}; + _usage_error() if @_; + } + else { + $base_type = 'ARRAY'; + $class = (caller())[0]; + @decls = @_; + } + + _usage_error() if @decls % 2 == 1; + + # Ensure we are not, and will not be, a subclass. + + my $isa = do { + no strict 'refs'; + \@{$class . '::ISA'}; + }; + _subclass_error() if @$isa; + tie @$isa, 'Class::Struct::Tie_ISA'; + + # Create constructor. + + croak "function 'new' already defined in package $class" + if do { no strict 'refs'; defined &{$class . "::new"} }; + + my @methods = (); + my %refs = (); + my %arrays = (); + my %hashes = (); + my %classes = (); + my $got_class = 0; + my $out = ''; + + $out = "{\n package $class;\n use Carp;\n sub new {\n"; + $out .= " my (\$class, \%init) = \@_;\n"; + $out .= " \$class = __PACKAGE__ unless \@_;\n"; + + my $cnt = 0; + my $idx = 0; + my( $cmt, $name, $type, $elem ); + + if( $base_type eq 'HASH' ){ + $out .= " my(\$r) = {};\n"; + $cmt = ''; + } + elsif( $base_type eq 'ARRAY' ){ + $out .= " my(\$r) = [];\n"; + } + while( $idx < @decls ){ + $name = $decls[$idx]; + $type = $decls[$idx+1]; + push( @methods, $name ); + if( $base_type eq 'HASH' ){ + $elem = "{'${class}::$name'}"; + } + elsif( $base_type eq 'ARRAY' ){ + $elem = "[$cnt]"; + ++$cnt; + $cmt = " # $name"; + } + if( $type =~ /^\*(.)/ ){ + $refs{$name}++; + $type = $1; + } + my $init = "defined(\$init{'$name'}) ? \$init{'$name'} :"; + if( $type eq '@' ){ + $out .= " croak 'Initializer for $name must be array reference'\n"; + $out .= " if defined(\$init{'$name'}) && ref(\$init{'$name'}) ne 'ARRAY';\n"; + $out .= " \$r->$elem = $init [];$cmt\n"; + $arrays{$name}++; + } + elsif( $type eq '%' ){ + $out .= " croak 'Initializer for $name must be hash reference'\n"; + $out .= " if defined(\$init{'$name'}) && ref(\$init{'$name'}) ne 'HASH';\n"; + $out .= " \$r->$elem = $init {};$cmt\n"; + $hashes{$name}++; + } + elsif ( $type eq '$') { + $out .= " \$r->$elem = $init undef;$cmt\n"; + } + elsif( $type =~ /^\w+(?:::\w+)*$/ ){ + $out .= " if (defined(\$init{'$name'})) {\n"; + $out .= " if (ref \$init{'$name'} eq 'HASH')\n"; + $out .= " { \$r->$elem = $type->new(\%{\$init{'$name'}}) } $cmt\n"; + $out .= " elsif (UNIVERSAL::isa(\$init{'$name'}, '$type'))\n"; + $out .= " { \$r->$elem = \$init{'$name'} } $cmt\n"; + $out .= " else { croak 'Initializer for $name must be hash or $type reference' }\n"; + $out .= " }\n"; + $classes{$name} = $type; + $got_class = 1; + } + else{ + croak "'$type' is not a valid struct element type"; + } + $idx += 2; + } + $out .= " bless \$r, \$class;\n }\n"; + + # Create accessor methods. + + my( $pre, $pst, $sel ); + $cnt = 0; + foreach $name (@methods){ + if ( do { no strict 'refs'; defined &{$class . "::$name"} } ) { + warnings::warnif("function '$name' already defined, overrides struct accessor method"); + } + else { + $pre = $pst = $cmt = $sel = ''; + if( defined $refs{$name} ){ + $pre = "\\("; + $pst = ")"; + $cmt = " # returns ref"; + } + $out .= " sub $name {$cmt\n my \$r = shift;\n"; + if( $base_type eq 'ARRAY' ){ + $elem = "[$cnt]"; + ++$cnt; + } + elsif( $base_type eq 'HASH' ){ + $elem = "{'${class}::$name'}"; + } + if( defined $arrays{$name} ){ + $out .= " my \$i;\n"; + $out .= " \@_ ? (\$i = shift) : return \$r->$elem;\n"; + $out .= " if (ref(\$i) eq 'ARRAY' && !\@_) { \$r->$elem = \$i; return \$r }\n"; + $sel = "->[\$i]"; + } + elsif( defined $hashes{$name} ){ + $out .= " my \$i;\n"; + $out .= " \@_ ? (\$i = shift) : return \$r->$elem;\n"; + $out .= " if (ref(\$i) eq 'HASH' && !\@_) { \$r->$elem = \$i; return \$r }\n"; + $sel = "->{\$i}"; + } + elsif( defined $classes{$name} ){ + if ( $CHECK_CLASS_MEMBERSHIP ) { + $out .= " croak '$name argument is wrong class' if \@_ && ! UNIVERSAL::isa(\$_[0], '$classes{$name}');\n"; + } + } + $out .= " croak 'Too many args to $name' if \@_ > 1;\n"; + $out .= " \@_ ? ($pre\$r->$elem$sel = shift$pst) : $pre\$r->$elem$sel$pst;\n"; + $out .= " }\n"; + } + } + $out .= "}\n1;\n"; + + print $out if $print; + my $result = eval $out; + carp $@ if $@; +} + +sub _usage_error { + confess "struct usage error"; +} + +sub _subclass_error { + croak 'struct class cannot be a subclass (@ISA not allowed)'; +} + +1; # for require + + +__END__ + +=head1 NAME + +Class::Struct - declare struct-like datatypes as Perl classes + +=head1 SYNOPSIS + + use Class::Struct; + # declare struct, based on array: + struct( CLASS_NAME => [ ELEMENT_NAME => ELEMENT_TYPE, ... ]); + # declare struct, based on hash: + struct( CLASS_NAME => { ELEMENT_NAME => ELEMENT_TYPE, ... }); + + package CLASS_NAME; + use Class::Struct; + # declare struct, based on array, implicit class name: + struct( ELEMENT_NAME => ELEMENT_TYPE, ... ); + + # Declare struct at compile time + use Class::Struct CLASS_NAME => [ ELEMENT_NAME => ELEMENT_TYPE, ... ]; + use Class::Struct CLASS_NAME => { ELEMENT_NAME => ELEMENT_TYPE, ... }; + + package Myobj; + use Class::Struct; + # declare struct with four types of elements: + struct( s => '$', a => '@', h => '%', c => 'My_Other_Class' ); + + $obj = new Myobj; # constructor + + # scalar type accessor: + $element_value = $obj->s; # element value + $obj->s('new value'); # assign to element + + # array type accessor: + $ary_ref = $obj->a; # reference to whole array + $ary_element_value = $obj->a(2); # array element value + $obj->a(2, 'new value'); # assign to array element + + # hash type accessor: + $hash_ref = $obj->h; # reference to whole hash + $hash_element_value = $obj->h('x'); # hash element value + $obj->h('x', 'new value'); # assign to hash element + + # class type accessor: + $element_value = $obj->c; # object reference + $obj->c->method(...); # call method of object + $obj->c(new My_Other_Class); # assign a new object + +=head1 DESCRIPTION + +C exports a single function, C. +Given a list of element names and types, and optionally +a class name, C creates a Perl 5 class that implements +a "struct-like" data structure. + +The new class is given a constructor method, C, for creating +struct objects. + +Each element in the struct data has an accessor method, which is +used to assign to the element and to fetch its value. The +default accessor can be overridden by declaring a C of the +same name in the package. (See Example 2.) + +Each element's type can be scalar, array, hash, or class. + +=head2 The C function + +The C function has three forms of parameter-list. + + struct( CLASS_NAME => [ ELEMENT_LIST ]); + struct( CLASS_NAME => { ELEMENT_LIST }); + struct( ELEMENT_LIST ); + +The first and second forms explicitly identify the name of the +class being created. The third form assumes the current package +name as the class name. + +An object of a class created by the first and third forms is +based on an array, whereas an object of a class created by the +second form is based on a hash. The array-based forms will be +somewhat faster and smaller; the hash-based forms are more +flexible. + +The class created by C must not be a subclass of another +class other than C. + +It can, however, be used as a superclass for other classes. To facilitate +this, the generated constructor method uses a two-argument blessing. +Furthermore, if the class is hash-based, the key of each element is +prefixed with the class name (see I, Recipe 13.12). + +A function named C must not be explicitly defined in a class +created by C. + +The I has the form + + NAME => TYPE, ... + +Each name-type pair declares one element of the struct. Each +element name will be defined as an accessor method unless a +method by that name is explicitly defined; in the latter case, a +warning is issued if the warning flag (B<-w>) is set. + +=head2 Class Creation at Compile Time + +C can create your class at compile time. The main reason +for doing this is obvious, so your class acts like every other class in +Perl. Creating your class at compile time will make the order of events +similar to using any other class ( or Perl module ). + +There is no significant speed gain between compile time and run time +class creation, there is just a new, more standard order of events. + +=head2 Element Types and Accessor Methods + +The four element types -- scalar, array, hash, and class -- are +represented by strings -- C<'$'>, C<'@'>, C<'%'>, and a class name -- +optionally preceded by a C<'*'>. + +The accessor method provided by C for an element depends +on the declared type of the element. + +=over 4 + +=item Scalar (C<'$'> or C<'*$'>) + +The element is a scalar, and by default is initialized to C +(but see L). + +The accessor's argument, if any, is assigned to the element. + +If the element type is C<'$'>, the value of the element (after +assignment) is returned. If the element type is C<'*$'>, a reference +to the element is returned. + +=item Array (C<'@'> or C<'*@'>) + +The element is an array, initialized by default to C<()>. + +With no argument, the accessor returns a reference to the +element's whole array (whether or not the element was +specified as C<'@'> or C<'*@'>). + +With one or two arguments, the first argument is an index +specifying one element of the array; the second argument, if +present, is assigned to the array element. If the element type +is C<'@'>, the accessor returns the array element value. If the +element type is C<'*@'>, a reference to the array element is +returned. + +As a special case, when the accessor is called with an array reference +as the sole argument, this causes an assignment of the whole array element. +The object reference is returned. + +=item Hash (C<'%'> or C<'*%'>) + +The element is a hash, initialized by default to C<()>. + +With no argument, the accessor returns a reference to the +element's whole hash (whether or not the element was +specified as C<'%'> or C<'*%'>). + +With one or two arguments, the first argument is a key specifying +one element of the hash; the second argument, if present, is +assigned to the hash element. If the element type is C<'%'>, the +accessor returns the hash element value. If the element type is +C<'*%'>, a reference to the hash element is returned. + +As a special case, when the accessor is called with a hash reference +as the sole argument, this causes an assignment of the whole hash element. +The object reference is returned. + +=item Class (C<'Class_Name'> or C<'*Class_Name'>) + +The element's value must be a reference blessed to the named +class or to one of its subclasses. The element is not initialized +by default. + +The accessor's argument, if any, is assigned to the element. The +accessor will C if this is not an appropriate object +reference. + +If the element type does not start with a C<'*'>, the accessor +returns the element value (after assignment). If the element type +starts with a C<'*'>, a reference to the element itself is returned. + +=back + +=head2 Initializing with C + +C always creates a constructor called C. That constructor +may take a list of initializers for the various elements of the new +struct. + +Each initializer is a pair of values: IC< =E >I. +The initializer value for a scalar element is just a scalar value. The +initializer for an array element is an array reference. The initializer +for a hash is a hash reference. + +The initializer for a class element is an object of the corresponding class, +or of one of it's subclasses, or a reference to a hash containing named +arguments to be passed to the element's constructor. + +See Example 3 below for an example of initialization. + +=head1 EXAMPLES + +=over 4 + +=item Example 1 + +Giving a struct element a class type that is also a struct is how +structs are nested. Here, C represents a time (seconds and +microseconds), and C has two elements, each of which is of +type C. + + use Class::Struct; + + struct( rusage => { + ru_utime => timeval, # seconds + ru_stime => timeval, # microseconds + }); + + struct( timeval => [ + tv_secs => '$', + tv_usecs => '$', + ]); + + # create an object: + my $t = new rusage; + + # $t->ru_utime and $t->ru_stime are objects of type timeval. + # set $t->ru_utime to 100.0 sec and $t->ru_stime to 5.0 sec. + $t->ru_utime->tv_secs(100); + $t->ru_utime->tv_usecs(0); + $t->ru_stime->tv_secs(5); + $t->ru_stime->tv_usecs(0); + +=item Example 2 + +An accessor function can be redefined in order to provide +additional checking of values, etc. Here, we want the C +element always to be nonnegative, so we redefine the C +accessor accordingly. + + package MyObj; + use Class::Struct; + + # declare the struct + struct ( 'MyObj', { count => '$', stuff => '%' } ); + + # override the default accessor method for 'count' + sub count { + my $self = shift; + if ( @_ ) { + die 'count must be nonnegative' if $_[0] < 0; + $self->{'count'} = shift; + warn "Too many args to count" if @_; + } + return $self->{'count'}; + } + + package main; + $x = new MyObj; + print "\$x->count(5) = ", $x->count(5), "\n"; + # prints '$x->count(5) = 5' + + print "\$x->count = ", $x->count, "\n"; + # prints '$x->count = 5' + + print "\$x->count(-5) = ", $x->count(-5), "\n"; + # dies due to negative argument! + +=item Example 3 + +The constructor of a generated class can be passed a list +of I=>I pairs, with which to initialize the struct. +If no initializer is specified for a particular element, its default +initialization is performed instead. Initializers for non-existent +elements are silently ignored. + +Note that the initializer for a nested class may be specified as +an object of that class, or as a reference to a hash of initializers +that are passed on to the nested struct's constructor. + + use Class::Struct; + + struct Breed => + { + name => '$', + cross => '$', + }; + + struct Cat => + [ + name => '$', + kittens => '@', + markings => '%', + breed => 'Breed', + ]; + + + my $cat = Cat->new( name => 'Socks', + kittens => ['Monica', 'Kenneth'], + markings => { socks=>1, blaze=>"white" }, + breed => Breed->new(name=>'short-hair', cross=>1), + or: breed => {name=>'short-hair', cross=>1}, + ); + + print "Once a cat called ", $cat->name, "\n"; + print "(which was a ", $cat->breed->name, ")\n"; + print "had two kittens: ", join(' and ', @{$cat->kittens}), "\n"; + +=back + +=head1 Author and Modification History + +Modified by Damian Conway, 2001-09-10, v0.62. + + Modified implicit construction of nested objects. + Now will also take an object ref instead of requiring a hash ref. + Also default initializes nested object attributes to undef, rather + than calling object constructor without args + Original over-helpfulness was fraught with problems: + * the class's constructor might not be called 'new' + * the class might not have a hash-like-arguments constructor + * the class might not have a no-argument constructor + * "recursive" data structures didn't work well: + package Person; + struct { mother => 'Person', father => 'Person'}; + + +Modified by Casey West, 2000-11-08, v0.59. + + Added the ability for compile time class creation. + +Modified by Damian Conway, 1999-03-05, v0.58. + + Added handling of hash-like arg list to class ctor. + + Changed to two-argument blessing in ctor to support + derivation from created classes. + + Added classname prefixes to keys in hash-based classes + (refer to "Perl Cookbook", Recipe 13.12 for rationale). + + Corrected behaviour of accessors for '*@' and '*%' struct + elements. Package now implements documented behaviour when + returning a reference to an entire hash or array element. + Previously these were returned as a reference to a reference + to the element. + +Renamed to C and modified by Jim Miner, 1997-04-02. + + members() function removed. + Documentation corrected and extended. + Use of struct() in a subclass prohibited. + User definition of accessor allowed. + Treatment of '*' in element types corrected. + Treatment of classes as element types corrected. + Class name to struct() made optional. + Diagnostic checks added. + +Originally C by Dean Roehrich. + + # Template.pm --- struct/member template builder + # 12mar95 + # Dean Roehrich + # + # changes/bugs fixed since 28nov94 version: + # - podified + # changes/bugs fixed since 21nov94 version: + # - Fixed examples. + # changes/bugs fixed since 02sep94 version: + # - Moved to Class::Template. + # changes/bugs fixed since 20feb94 version: + # - Updated to be a more proper module. + # - Added "use strict". + # - Bug in build_methods, was using @var when @$var needed. + # - Now using my() rather than local(). + # + # Uses perl5 classes to create nested data types. + # This is offered as one implementation of Tom Christiansen's "structs.pl" + # idea. + +=cut diff --git a/Master/perltl/lib/Config.pm b/Master/perltl/lib/Config.pm new file mode 100644 index 00000000000..c5b8bd0be9c --- /dev/null +++ b/Master/perltl/lib/Config.pm @@ -0,0 +1,8895 @@ +package Config; +use Exporter (); +@EXPORT = qw(%Config); +@EXPORT_OK = qw(myconfig config_sh config_vars); + +# Define our own import method to avoid pulling in the full Exporter: +sub import { + my $pkg = shift; + @_ = @EXPORT unless @_; + my @func = grep {$_ ne '%Config'} @_; + local $Exporter::ExportLevel = 1; + Exporter::import('Config', @func) if @func; + return if @func == @_; + my $callpkg = caller(0); + *{"$callpkg\::Config"} = \%Config; +} + +die "Perl lib version (v5.8.0) doesn't match executable version ($])" + unless $^V; + +$^V eq v5.8.0 + or die "Perl lib version (v5.8.0) doesn't match executable version (" . + (sprintf "v%vd",$^V) . ")"; + +# This file was created by configpm when Perl was built. Any changes +# made to this file will be lost the next time perl is built. + +## Configured by: popineau@ANSIBLE +### Target system: WIN32 + +my $config_sh = <<'!END!'; +archlibexp='c:\Local\Perl\lib' +archname='MSWin32-x86-multi-thread' +cc='cl' +ccflags='-nologo -GF -W3 -MD -DNDEBUG -O2xtb2 -G6 -GL -DWIN32 -D_CONSOLE -DNO_STRICT -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -DPERL_MSVCRT_READFIX' +cppflags='-DWIN32' +dlsrc='dl_win32.xs' +dynamic_ext='Storable Encode XS/Typemap B/C IO MIME/Base64 Devel/Peek Opcode Time/HiRes attrs ByteLoader PerlIO/scalar Unicode/Normalize re B XS/APItest Encode/Unicode SDBM_File PerlIO/via PerlIO/encoding Fcntl Sys/Hostname Digest/MD5 Devel/PPPort POSIX Filter/Util/Call Socket threads/shared Data/Dumper List/Util threads File/Glob Devel/DProf Cwd' +extensions='Storable Encode XS/Typemap B/C IO MIME/Base64 Devel/Peek Opcode Time/HiRes attrs ByteLoader PerlIO/scalar Unicode/Normalize re B XS/APItest Encode/Unicode SDBM_File PerlIO/via PerlIO/encoding Fcntl Sys/Hostname Digest/MD5 Devel/PPPort POSIX Filter/Util/Call Socket threads/shared Data/Dumper List/Util threads File/Glob Devel/DProf Cwd' +installarchlib='c:\Local\Perl\lib' +installprivlib='c:\Local\Perl\lib' +libpth='..\..\texk\msvc\lib' +libs=' oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib netapi32.lib uuid.lib wsock32.lib mpr.lib winmm.lib version.lib odbc32.lib odbccp32.lib msvcrt.lib' +osname='MSWin32' +osvers='4.0' +prefix='c:\Local\Perl' +privlibexp='c:\Local\Perl\lib' +sharpbang='#!' +shsharp='true' +sig_name='ZERO HUP INT QUIT ILL NUM05 NUM06 NUM07 FPE KILL NUM10 SEGV NUM12 PIPE ALRM TERM NUM16 NUM17 NUM18 NUM19 CHLD BREAK ABRT STOP NUM24 CONT CLD' +sig_num='0 1 2 21 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 20 0' +so='dll' +startsh='#!/bin/sh' +static_ext=' ' +Author='' +Date='$Date' +Header='' +Id='$Id' +Locker='' +Log='$Log' +PERL_API_REVISION='5' +PERL_API_SUBVERSION='0' +PERL_API_VERSION='8' +PERL_CONFIG_SH='true' +PERL_PATCHLEVEL='8' +PERL_REVISION='5' +PERL_SUBVERSION='0' +PERL_VERSION='8' +RCSfile='$RCSfile' +Revision='$Revision' +Source='' +State='' +_a='.lib' +_exe='.exe' +_o='.obj' +afs='false' +afsroot='/afs' +alignbytes='8' +ansi2knr='' +aphostname='' +api_revision='5' +api_subversion='0' +api_version='8' +api_versionstring='5.8.0' +ar='lib' +archlib='c:\Local\Perl\lib' +archname64='' +archobjs='' +asctime_r_proto='0' +awk='awk' +baserev='5' +bash='' +bin='c:\Local\Perl\bin' +binexp='c:\Local\Perl\bin' +bison='' +byacc='byacc' +byteorder='1234' +c='' +castflags='0' +cat='type' +cccdlflags=' ' +ccdlflags=' ' +ccflags_uselargefiles='' +ccname='' +ccsymbols='' +ccversion='' +cf_by='popineau' +cf_email='popineau@ANSIBLE' +cf_time='Mon Aug 18 21:40:53 2003' +charsize='1' +chgrp='' +chmod='' +chown='' +clocktype='clock_t' +comm='' +compress='' +contains='grep' +cp='copy' +cpio='' +cpp='cl -nologo -E' +cpp_stuff='42' +cppccsymbols='' +cpplast='' +cppminus='' +cpprun='cl -nologo -E' +cppstdin='cppstdin' +cppsymbols='' +crypt_r_proto='0' +cryptlib='' +csh='undef' +ctermid_r_proto='0' +ctime_r_proto='0' +d_Gconvert='sprintf((b),"%.*g",(n),(x))' +d_PRIEUldbl='undef' +d_PRIFUldbl='undef' +d_PRIGUldbl='undef' +d_PRIXU64='undef' +d_PRId64='undef' +d_PRIeldbl='undef' +d_PRIfldbl='undef' +d_PRIgldbl='undef' +d_PRIi64='undef' +d_PRIo64='undef' +d_PRIu64='undef' +d_PRIx64='undef' +d_SCNfldbl='undef' +d__fwalk='undef' +d_access='define' +d_accessx='undef' +d_alarm='define' +d_archlib='define' +d_asctime_r='undef' +d_atolf='undef' +d_atoll='undef' +d_attribut='undef' +d_bcmp='undef' +d_bcopy='undef' +d_bsd='define' +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='define' +d_class='undef' +d_closedir='define' +d_cmsghdr_s='undef' +d_const='define' +d_crypt='undef' +d_crypt_r='undef' +d_csh='undef' +d_ctermid_r='undef' +d_ctime_r='undef' +d_cuserid='undef' +d_dbl_dig='define' +d_dbminitproto='undef' +d_difftime='define' +d_dirfd='undef' +d_dirnamlen='define' +d_dlerror='define' +d_dlopen='define' +d_dlsymun='undef' +d_dosuid='undef' +d_drand48_r='undef' +d_drand48proto='undef' +d_dup2='define' +d_eaccess='undef' +d_endgrent='undef' +d_endgrent_r='undef' +d_endhent='undef' +d_endhostent_r='undef' +d_endnent='undef' +d_endnetent_r='undef' +d_endpent='undef' +d_endprotoent_r='undef' +d_endpwent='undef' +d_endpwent_r='undef' +d_endsent='undef' +d_endservent_r='undef' +d_eofnblk='define' +d_eunice='undef' +d_fchdir='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' +d_fgetpos='define' +d_finite='undef' +d_finitel='undef' +d_flexfnam='define' +d_flock='define' +d_flockproto='define' +d_fork='undef' +d_fp_class='undef' +d_fpathconf='undef' +d_fpclass='undef' +d_fpclassify='undef' +d_fpclassl='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='define' +d_getespwnam='undef' +d_getfsstat='undef' +d_getgrent='undef' +d_getgrent_r='undef' +d_getgrgid_r='undef' +d_getgrnam_r='undef' +d_getgrps='undef' +d_gethbyaddr='define' +d_gethbyname='define' +d_gethent='undef' +d_gethname='define' +d_gethostbyaddr_r='undef' +d_gethostbyname_r='undef' +d_gethostent_r='undef' +d_gethostprotos='define' +d_getitimer='undef' +d_getlogin='define' +d_getlogin_r='undef' +d_getmnt='undef' +d_getmntent='undef' +d_getnbyaddr='undef' +d_getnbyname='undef' +d_getnent='undef' +d_getnetbyaddr_r='undef' +d_getnetbyname_r='undef' +d_getnetent_r='undef' +d_getnetprotos='undef' +d_getpagsz='undef' +d_getpbyname='define' +d_getpbynumber='define' +d_getpent='undef' +d_getpgid='undef' +d_getpgrp2='undef' +d_getpgrp='undef' +d_getppid='undef' +d_getprior='undef' +d_getprotobyname_r='undef' +d_getprotobynumber_r='undef' +d_getprotoent_r='undef' +d_getprotoprotos='define' +d_getprpwnam='undef' +d_getpwent='undef' +d_getpwent_r='undef' +d_getpwnam_r='undef' +d_getpwuid_r='undef' +d_getsbyname='define' +d_getsbyport='define' +d_getsent='undef' +d_getservbyname_r='undef' +d_getservbyport_r='undef' +d_getservent_r='undef' +d_getservprotos='define' +d_getspnam='undef' +d_getspnam_r='undef' +d_gettimeod='define' +d_gmtime_r='undef' +d_gnulibc='undef' +d_grpasswd='undef' +d_hasmntopt='undef' +d_htonl='define' +d_index='undef' +d_inetaton='undef' +d_int64_t='undef' +d_isascii='define' +d_isfinite='undef' +d_isinf='undef' +d_isnan='define' +d_isnanl='undef' +d_killpg='undef' +d_lchown='undef' +d_ldbl_dig='define' +d_link='define' +d_localtime_r='undef' +d_locconv='define' +d_lockf='undef' +d_longdbl='define' +d_longlong='undef' +d_lseekproto='define' +d_lstat='undef' +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_mkfifo='undef' +d_mkstemp='undef' +d_mkstemps='undef' +d_mktime='define' +d_mmap='undef' +d_modfl='undef' +d_modfl_pow32_bug='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_msgctl='undef' +d_msgget='undef' +d_msghdr_s='undef' +d_msgrcv='undef' +d_msgsnd='undef' +d_msync='undef' +d_munmap='undef' +d_mymalloc='undef' +d_nice='undef' +d_nl_langinfo='undef' +d_nv_preserves_uv='define' +d_off64_t='undef' +d_old_pthread_create_joinable='undef' +d_oldpthreads='undef' +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' +d_portable='define' +d_procselfexe='undef' +d_pthread_atfork='undef' +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_qgcvt='undef' +d_quad='undef' +d_random_r='undef' +d_readdir64_r='undef' +d_readdir='define' +d_readdir_r='undef' +d_readlink='undef' +d_readv='undef' +d_recvmsg='undef' +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_seekdir='define' +d_select='define' +d_sem='undef' +d_semctl='undef' +d_semctl_semid_ds='undef' +d_semctl_semun='undef' +d_semget='undef' +d_semop='undef' +d_sendmsg='undef' +d_setegid='undef' +d_seteuid='undef' +d_setgrent='undef' +d_setgrent_r='undef' +d_setgrps='undef' +d_sethent='undef' +d_sethostent_r='undef' +d_setitimer='undef' +d_setlinebuf='undef' +d_setlocale='define' +d_setlocale_r='undef' +d_setnent='undef' +d_setnetent_r='undef' +d_setpent='undef' +d_setpgid='undef' +d_setpgrp2='undef' +d_setpgrp='undef' +d_setprior='undef' +d_setproctitle='undef' +d_setprotoent_r='undef' +d_setpwent='undef' +d_setpwent_r='undef' +d_setregid='undef' +d_setresgid='undef' +d_setresuid='undef' +d_setreuid='undef' +d_setrgid='undef' +d_setruid='undef' +d_setsent='undef' +d_setservent_r='undef' +d_setsid='undef' +d_setvbuf='define' +d_sfio='undef' +d_shm='undef' +d_shmat='undef' +d_shmatprototype='undef' +d_shmctl='undef' +d_shmdt='undef' +d_shmget='undef' +d_sigaction='undef' +d_sigprocmask='undef' +d_sigsetjmp='undef' +d_sockatmark='undef' +d_sockatmarkproto='undef' +d_socket='define' +d_socklen_t='undef' +d_sockpair='undef' +d_socks5_init='undef' +d_sqrtl='undef' +d_srand48_r='undef' +d_srandom_r='undef' +d_sresgproto='undef' +d_sresuproto='undef' +d_statblks='undef' +d_statfs_f_flags='undef' +d_statfs_s='undef' +d_statvfs='undef' +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='undef' +d_stdiobase='define' +d_stdstdio='define' +d_strchr='define' +d_strcoll='define' +d_strctcpy='define' +d_strerrm='strerror(e)' +d_strerror='define' +d_strerror_r='undef' +d_strftime='define' +d_strtod='define' +d_strtol='define' +d_strtold='undef' +d_strtoll='undef' +d_strtoq='undef' +d_strtoul='define' +d_strtoull='undef' +d_strtouq='undef' +d_strxfrm='define' +d_suidsafe='undef' +d_symlink='undef' +d_syscall='undef' +d_syscallproto='undef' +d_sysconf='undef' +d_sysernlst='' +d_syserrlst='define' +d_system='define' +d_tcgetpgrp='undef' +d_tcsetpgrp='undef' +d_telldir='define' +d_telldirproto='define' +d_time='define' +d_times='define' +d_tm_tm_gmtoff='undef' +d_tm_tm_zone='undef' +d_tmpnam_r='undef' +d_truncate='undef' +d_ttyname_r='undef' +d_tzname='define' +d_u32align='define' +d_ualarm='undef' +d_umask='define' +d_uname='define' +d_union_semun='define' +d_unordered='undef' +d_usleep='undef' +d_usleepproto='undef' +d_ustat='undef' +d_vendorarch='undef' +d_vendorbin='undef' +d_vendorlib='undef' +d_vfork='undef' +d_void_closedir='undef' +d_voidsig='define' +d_voidtty='' +d_volatile='define' +d_vprintf='define' +d_wait4='undef' +d_waitpid='define' +d_wcstombs='define' +d_wctomb='define' +d_writev='undef' +d_xenix='undef' +date='date' +db_hashtype='int' +db_prefixtype='int' +db_version_major='0' +db_version_minor='0' +db_version_patch='0' +defvoidused='15' +direntrytype='struct direct' +dlext='dll' +doublesize='8' +drand01='(rand()/(double)((unsigned)1<{$_[1]} if (exists $_[0]->{$_[1]}); + + # Search for it in the big string + my($value, $start, $marker, $quote_type); + + $quote_type = "'"; + # Virtual entries. + if ($_[1] eq 'byteorder') { + # byteorder does exist on its own but we overlay a virtual + # dynamically recomputed value. + my $t = $Config{ivtype}; + my $s = $Config{ivsize}; + my $f = $t eq 'long' ? 'L!' : $s == 8 ? 'Q': 'I'; + if ($s == 4 || $s == 8) { + my $i = 0; + foreach my $c (reverse(2..$s)) { $i |= ord($c); $i <<= 8 } + $i |= ord(1); + $value = join('', unpack('a'x$s, pack($f, $i))); + } else { + $value = '?'x$s; + } + } elsif ($_[1] =~ /^((?:cc|ld)flags|libs(?:wanted)?)_nolargefiles/) { + # These are purely virtual, they do not exist, but need to + # be computed on demand for largefile-incapable extensions. + my $key = "${1}_uselargefiles"; + $value = $Config{$1}; + my $withlargefiles = $Config{$key}; + if ($key =~ /^(?:cc|ld)flags_/) { + $value =~ s/\Q$withlargefiles\E\b//; + } elsif ($key =~ /^libs/) { + my @lflibswanted = split(' ', $Config{libswanted_uselargefiles}); + if (@lflibswanted) { + my %lflibswanted; + @lflibswanted{@lflibswanted} = (); + if ($key =~ /^libs_/) { + my @libs = grep { /^-l(.+)/ && + not exists $lflibswanted{$1} } + split(' ', $Config{libs}); + $Config{libs} = join(' ', @libs); + } elsif ($key =~ /^libswanted_/) { + my @libswanted = grep { not exists $lflibswanted{$_} } + split(' ', $Config{libswanted}); + $Config{libswanted} = join(' ', @libswanted); + } + } + } + } else { + $marker = "$_[1]="; + # return undef unless (($value) = $config_sh =~ m/^$_[1]='(.*)'\s*$/m); + # Check for the common case, ' delimeted + $start = index($config_sh, "\n$marker$quote_type"); + # If that failed, check for " delimited + if ($start == -1) { + $quote_type = '"'; + $start = index($config_sh, "\n$marker$quote_type"); + } + return undef if ( ($start == -1) && # in case it's first + (substr($config_sh, 0, length($marker)) ne $marker) ); + if ($start == -1) { + # It's the very first thing we found. Skip $start forward + # and figure out the quote mark after the =. + $start = length($marker) + 1; + $quote_type = substr($config_sh, $start - 1, 1); + } + else { + $start += length($marker) + 2; + } + $value = substr($config_sh, $start, + index($config_sh, "$quote_type\n", $start) - $start); + } + # If we had a double-quote, we'd better eval it so escape + # sequences and such can be interpolated. Since the incoming + # value is supposed to follow shell rules and not perl rules, + # we escape any perl variable markers + if ($quote_type eq '"') { + $value =~ s/\$/\\\$/g; + $value =~ s/\@/\\\@/g; + eval "\$value = \"$value\""; + } + #$value = sprintf($value) if $quote_type eq '"'; + # So we can say "if $Config{'foo'}". + $value = undef if $value eq 'undef'; + $_[0]->{$_[1]} = $value; # cache it + return $value; +} + +my $prevpos = 0; + +sub FIRSTKEY { + $prevpos = 0; + # my($key) = $config_sh =~ m/^(.*?)=/; + substr($config_sh, 0, index($config_sh, '=') ); + # $key; +} + +sub NEXTKEY { + # Find out how the current key's quoted so we can skip to its end. + my $quote = substr($config_sh, index($config_sh, "=", $prevpos)+1, 1); + my $pos = index($config_sh, qq($quote\n), $prevpos) + 2; + my $len = index($config_sh, "=", $pos) - $pos; + $prevpos = $pos; + $len > 0 ? substr($config_sh, $pos, $len) : undef; +} + +sub EXISTS { + # exists($_[0]->{$_[1]}) or $config_sh =~ m/^$_[1]=/m; + exists($_[0]->{$_[1]}) or + index($config_sh, "\n$_[1]='") != -1 or + substr($config_sh, 0, length($_[1])+2) eq "$_[1]='" or + index($config_sh, "\n$_[1]=\"") != -1 or + substr($config_sh, 0, length($_[1])+2) eq "$_[1]=\"" or + $_[1] =~ /^(?:(?:cc|ld)flags|libs(?:wanted)?)_nolargefiles$/; +} + +sub STORE { die "\%Config::Config is read-only\n" } +sub DELETE { &STORE } +sub CLEAR { &STORE } + + +sub config_sh { + $config_sh +} + +sub config_re { + my $re = shift; + my @matches = grep /^$re=/, split /^/, $config_sh; + @matches ? (print @matches) : print "$re: not found\n"; +} + +sub config_vars { + foreach(@_){ + config_re($_), next if /\W/; + my $v=(exists $Config{$_}) ? $Config{$_} : 'UNKNOWN'; + $v='undef' unless defined $v; + print "$_='$v';\n"; + } +} + +sub TIEHASH { bless {} } + +# avoid Config..Exporter..UNIVERSAL search for DESTROY then AUTOLOAD +sub DESTROY { } + +tie %Config, 'Config'; + +1; +__END__ + +=head1 NAME + +Config - access Perl configuration information + +=head1 SYNOPSIS + + use Config; + if ($Config{'cc'} =~ /gcc/) { + print "built by gcc\n"; + } + + use Config qw(myconfig config_sh config_vars); + + print myconfig(); + + print config_sh(); + + config_vars(qw(osname archname)); + + +=head1 DESCRIPTION + +The Config module contains all the information that was available to +the C program at Perl build time (over 900 values). + +Shell variables from the F file (written by Configure) are +stored in the readonly-variable C<%Config>, indexed by their names. + +Values stored in config.sh as 'undef' are returned as undefined +values. The perl C function can be used to check if a +named variable exists. + +=over 4 + +=item myconfig() + +Returns a textual summary of the major perl configuration values. +See also C<-V> in L. + +=item config_sh() + +Returns the entire perl configuration information in the form of the +original config.sh shell variable assignment script. + +=item config_vars(@names) + +Prints to STDOUT the values of the named configuration variable. Each is +printed on a separate line in the form: + + name='value'; + +Names which are unknown are output as C. +See also C<-V:name> in L. + +=back + +=head1 EXAMPLE + +Here's a more sophisticated example of using %Config: + + use Config; + use strict; + + my %sig_num; + my @sig_name; + unless($Config{sig_name} && $Config{sig_num}) { + die "No sigs?"; + } else { + my @names = split ' ', $Config{sig_name}; + @sig_num{@names} = split ' ', $Config{sig_num}; + foreach (@names) { + $sig_name[$sig_num{$_}] ||= $_; + } + } + + print "signal #17 = $sig_name[17]\n"; + if ($sig_num{ALRM}) { + print "SIGALRM is $sig_num{ALRM}\n"; + } + +=head1 WARNING + +Because this information is not stored within the perl executable +itself it is possible (but unlikely) that the information does not +relate to the actual perl binary which is being used to access it. + +The Config module is installed into the architecture and version +specific library directory ($Config{installarchlib}) and it checks the +perl version number when loaded. + +The values stored in config.sh may be either single-quoted or +double-quoted. Double-quoted strings are handy for those cases where you +need to include escape sequences in the strings. To avoid runtime variable +interpolation, any C<$> and C<@> characters are replaced by C<\$> and +C<\@>, respectively. This isn't foolproof, of course, so don't embed C<\$> +or C<\@> in double-quoted strings unless you're willing to deal with the +consequences. (The slashes will end up escaped and the C<$> or C<@> will +trigger variable interpolation) + +=head1 GLOSSARY + +Most C variables are determined by the C script +on platforms supported by it (which is most UNIX platforms). Some +platforms have custom-made C variables, and may thus not have +some of the variables described below, or may have extraneous variables +specific to that particular port. See the port specific documentation +in such cases. + +=head2 _ + +=over 4 + +=item C<_a> + +From F: + +This variable defines the extension used for ordinary library files. +For unix, it is F<.a>. The F<.> is included. Other possible +values include F<.lib>. + +=item C<_exe> + +From F: + +This variable defines the extension used for executable files. +C, Cygwin and F use F<.exe>. Stratus C uses F<.pm>. +On operating systems which do not require a specific extension +for executable files, this variable is empty. + +=item C<_o> + +From F: + +This variable defines the extension used for object files. +For unix, it is F<.o>. The F<.> is included. Other possible +values include F<.obj>. + +=back + +=head2 a + +=over 4 + +=item C + +From F: + +This variable is set to C if C (Andrew File System) is used +on the system, C otherwise. It is possible to override this +with a hint value or command line option, but you'd better know +what you are doing. + +=item C + +From F: + +This variable is by default set to F. In the unlikely case +this is not the correct root, it is possible to override this with +a hint value or command line option. This will be used in subsequent +tests for AFSness in the Perl configure and test process. + +=item C + +From F: + +This variable holds 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. + +=item C + +From F: + +This variable is set if the user needs to run ansi2knr. +Currently, this is not supported, so we just abort. + +=item C + +From F: + +This variable contains the command which can be used to compute the +host name. The command is fully qualified by its absolute path, to make +it safe when used by a process with super-user privileges. + +=item C + +From F: + +The three variables, api_revision, api_version, and +api_subversion, specify the version of the oldest perl binary +compatible with the present perl. In a full version string +such as F<5.6.1>, api_revision is the C<5>. +Prior to 5.5.640, the format was a floating point number, +like 5.00563. + +F:incpush() and F will automatically search in +F<$sitelib/.>. for older directories back to the limit specified +by these api_ variables. This is only useful if you have a +perl library directory tree structured like the default one. +See C for how this works. The versioned site_perl +directory was introduced in 5.005, so that is the lowest +possible value. The version list appropriate for the current +system is determined in F. + +C To do: Since compatibility can depend on compile time +options (such as bincompat, longlong, etc.) it should +(perhaps) be set by Configure, but currently it isn't. +Currently, we read a hard-wired value from F. +Perhaps what we ought to do is take the hard-wired value from +F but then modify it if the current Configure +options warrant. F then would use an #ifdef guard. + +=item C + +From F: + +The three variables, api_revision, api_version, and +api_subversion, specify the version of the oldest perl binary +compatible with the present perl. In a full version string +such as F<5.6.1>, api_subversion is the C<1>. See api_revision for +full details. + +=item C + +From F: + +The three variables, api_revision, api_version, and +api_subversion, specify the version of the oldest perl binary +compatible with the present perl. In a full version string +such as F<5.6.1>, api_version is the C<6>. See api_revision for +full details. As a special case, 5.5.0 is rendered in the +old-style as 5.005. (In the 5.005_0x maintenance series, +this was the only versioned directory in $sitelib.) + +=item C + +From F: + +This variable combines api_revision, api_version, and +api_subversion in a format such as 5.6.1 (or 5_6_1) suitable +for use as a directory name. This is filesystem dependent. + +=item C + +From F: + +This variable is used internally by Configure to determine the +full pathname (if any) of the ar program. After Configure runs, +the value is reset to a plain C and is not useful. + +=item C + +From F: + +This variable holds the name of the directory in which the user wants +to put architecture-dependent public library files for $package. +It is most often a local directory such as F. +Programs using this variable must be prepared to deal +with filename expansion. + +=item C + +From F: + +This variable is the same as the archlib variable, but is +filename expanded at configuration time, for convenient use. + +=item C + +From F: + +This variable is used for the 64-bitness part of $archname. + +=item C + +From F: + +This variable is a short name to characterize the current +architecture. It is used mainly to construct the default archlib. + +=item C + +From F: + +This variable defines any additional objects that must be linked +in with the program on this architecture. On unix, it is usually +empty. It is typically used to include emulations of unix calls +or other facilities. For perl on F, for example, this would +include F. + +=item C + +From F: + +This variable encodes the prototype of asctime_r. +It is zero if d_asctime_r is undef, and one of the +C macros of F if d_asctime_r +is defined. + +=item C + +From F: + +This variable is used internally by Configure to determine the +full pathname (if any) of the awk program. After Configure runs, +the value is reset to a plain C and is not useful. + +=back + +=head2 b + +=over 4 + +=item C + +From F: + +The base revision level of this package, from the F<.package> file. + +=item C + +From F: + +This variable is defined but not used by Configure. +The value is a plain '' and is not useful. + +=item C + +From F: + +This variable holds the name of the directory in which the user wants +to put publicly executable images for the package in question. It +is most often a local directory such as F. Programs using +this variable must be prepared to deal with F<~name> substitution. + +=item C + +From F: + +This is the same as the bin variable, but is filename expanded at +configuration time, for use in your makefiles. + +=item C + +From F: + +This variable is used internally by Configure to determine the +full pathname (if any) of the bison program. After Configure runs, +the value is reset to a plain C and is not useful. + +=item C + +From F: + +This variable is used internally by Configure to determine the +full pathname (if any) of the byacc program. After Configure runs, +the value is reset to a plain C and is not useful. + +=item C + +From F: + +This variable holds the byte order in a C. In the following, +larger digits indicate more significance. The variable byteorder +is either 4321 on a big-endian machine, or 1234 on a little-endian, +or 87654321 on a Cray ... or 3412 with weird order ! + +=back + +=head2 c + +=over 4 + +=item C + +From F: + +This variable contains the \c string if that is what causes the echo +command to suppress newline. Otherwise it is null. Correct usage is +$echo $n "prompt for a question: $c". + +=item C + +From F: + +This variable contains a flag that precise difficulties the +compiler has casting odd floating values to unsigned long: +0 = ok +1 = couldn't cast < 0 +2 = couldn't cast >= 0x80000000 +4 = couldn't cast in argument expression list + +=item C + +From F: + +This variable is used internally by Configure to determine the +full pathname (if any) of the cat program. After Configure runs, +the value is reset to a plain C and is not useful. + +=item C + +From F: + +This variable holds the name of a command to execute a C compiler which +can resolve multiple global references that happen to have the same +name. Usual values are C and C. +Fervent C compilers may be called C. C has xlc. + +=item C + +From F: + +This variable contains any special flags that might need to be +passed with C to compile modules to be used to create a shared +library that will be used for dynamic loading. For hpux, this +should be +z. It is up to the makefile to use it. + +=item C + +From F: + +This variable contains any special flags that might need to be +passed to cc to link with a shared library for dynamic loading. +It is up to the makefile to use it. For sunos 4.1, it should +be empty. + +=item C + +From F: + +This variable contains any additional C compiler flags desired by +the user. It is up to the Makefile to use this. + +=item C + +From F: + +This variable contains the compiler flags needed by large file builds +and added to ccflags by hints files. + +=item C + +From F: + +This can set either by hints files or by Configure. If using +gcc, this is gcc, and if not, usually equal to cc, unimpressive, no? +Some platforms, however, make good use of this by storing the +flavor of the C compiler being used here. For example if using +the Sun WorkShop suite, ccname will be C. + +=item C + +From F: + +The variable contains the symbols defined by the C compiler alone. +The symbols defined by cpp or by cc when it calls cpp are not in +this list, see cppsymbols and cppccsymbols. +The list is a space-separated list of symbol=value tokens. + +=item C + +From F: + +This can set either by hints files or by Configure. If using +a (non-gcc) vendor cc, this variable may contain a version for +the compiler. + +=item C + +From F: + +Login name of the person who ran the Configure script and answered the +questions. This is used to tag both F and F. + +=item C + +From F: + +Electronic mail address of the person who ran Configure. This can be +used by units that require the user's e-mail, like F. + +=item C + +From F: + +Holds the output of the C command when the configuration file was +produced. This is used to tag both F and F. + +=item C + +From F: + +This variable contains the value of the C symbol, which +indicates to the C program how many bytes there are in a character. + +=item C + +From F: + +This variable is defined but not used by Configure. +The value is a plain '' and is not useful. + +=item C + +From F: + +This variable is used internally by Configure to determine the +full pathname (if any) of the chmod program. After Configure runs, +the value is reset to a plain C and is not useful. + +=item C + +From F: + +This variable is defined but not used by Configure. +The value is a plain '' and is not useful. + +=item C + +From F: + +This variable holds the type returned by times(). It can be long, +or clock_t on C sites (in which case should be +included). + +=item C + +From F: + +This variable is used internally by Configure to determine the +full pathname (if any) of the comm program. After Configure runs, +the value is reset to a plain C and is not useful. + +=item C + +From F: + +This variable is defined but not used by Configure. +The value is a plain '' and is not useful. + +=item C + +From F: + +This variable holds the command to do a grep with a proper return +status. On most sane systems it is simply C. On insane systems +it is a grep followed by a cat followed by a test. This variable +is primarily for the use of other Configure units. + +=item C + +From F: + +This variable is used internally by Configure to determine the +full pathname (if any) of the cp program. After Configure runs, +the value is reset to a plain C and is not useful. + +=item C + +From F: + +This variable is defined but not used by Configure. +The value is a plain '' and is not useful. + +=item C + +From F: + +This variable is used internally by Configure to determine the +full pathname (if any) of the cpp program. After Configure runs, +the value is reset to a plain C and is not useful. + +=item C + +From F: + +This variable contains an identification of the catenation mechanism +used by the C preprocessor. + +=item C + +From F: + +The variable contains the symbols defined by the C compiler +when it calls cpp. The symbols defined by the cc alone or cpp +alone are not in this list, see ccsymbols and cppsymbols. +The list is a space-separated list of symbol=value tokens. + +=item C + +From F: + +This variable holds the flags that will be passed to the C pre- +processor. It is up to the Makefile to use it. + +=item C + +From F: + +This variable has the same functionality as cppminus, only it applies +to cpprun and not cppstdin. + +=item C + +From F: + +This variable contains the second part of the string which will invoke +the C preprocessor on the standard input and produce to standard +output. This variable will have the value C<-> if cppstdin needs +a minus to specify standard input, otherwise the value is "". + +=item C + +From F: + +This variable contains the command which will invoke a C preprocessor +on standard input and put the output to stdout. It is guaranteed not +to be a wrapper and may be a null string if no preprocessor can be +made directly available. This preprocessor might be different from the +one used by the C compiler. Don't forget to append cpplast after the +preprocessor options. + +=item C + +From F: + +This variable contains the command which will invoke the C +preprocessor on standard input and put the output to stdout. +It is primarily used by other Configure units that ask about +preprocessor symbols. + +=item C + +From F: + +The variable contains the symbols defined by the C preprocessor +alone. The symbols defined by cc or by cc when it calls cpp are +not in this list, see ccsymbols and cppccsymbols. +The list is a space-separated list of symbol=value tokens. + +=item C + +From F: + +This variable encodes the prototype of crypt_r. +It is zero if d_crypt_r is undef, and one of the +C macros of F if d_crypt_r +is defined. + +=item C + +From F: + +This variable holds -lcrypt or the path to a F archive if +the crypt() function is not defined in the standard C library. It is +up to the Makefile to use this. + +=item C + +From F: + +This variable is used internally by Configure to determine the +full pathname (if any) of the csh program. After Configure runs, +the value is reset to a plain C and is not useful. + +=item C + +From F: + +This variable encodes the prototype of ctermid_r. +It is zero if d_ctermid_r is undef, and one of the +C macros of F if d_ctermid_r +is defined. + +=item C + +From F: + +This variable encodes the prototype of ctime_r. +It is zero if d_ctime_r is undef, and one of the +C macros of F if d_ctime_r +is defined. + +=back + +=head2 d + +=over 4 + +=item C + +From F: + +This variable conditionally defines C if _fwalk() is +available to apply a function to all the file handles. + +=item C + +From F: + +This variable conditionally defines C if the access() system +call is available to check for access permissions using real IDs. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the accessx() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the alarm() routine is available. + +=item C + +From F: + +This variable conditionally defines C to hold the pathname +of architecture-dependent library files for $package. If +$archlib is the same as $privlib, then this is set to undef. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the asctime_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the atolf() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the atoll() routine is available. + +=item C + +From F: + +This variable conditionally defines C, which +indicates the C compiler can check for function attributes, +such as printf formats. + +=item C + +From F: + +This variable conditionally defines the C symbol if +the bcmp() routine is available to compare strings. + +=item C + +From F: + +This variable conditionally defines the C symbol if +the bcopy() routine is available to copy strings. + +=item C + +From F: + +This symbol conditionally defines the symbol C when running on a +C system. + +=item C + +From F: + +This variable conditionally defines C if +getpgrp needs one arguments whereas C one needs none. + +=item C + +From F: + +This variable conditionally defines C if +setpgrp needs two arguments whereas C one needs none. +See also d_setpgid for a C interface. + +=item C + +From F: + +This variable conditionally defines the C symbol if +the bzero() routine is available to set memory to 0. + +=item C + +From F: + +This variable conditionally defines CASTI32, which indicates +whether the C compiler can cast large floats to 32-bit ints. + +=item C + +From F: + +This variable conditionally defines C, which indicates +wether the C compiler can cast negative float to unsigned. + +=item C + +From F: + +This variable conditionally defines C if this system +has vsprintf returning type (char*). The trend seems to be to +declare it as "int vsprintf()". + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the chown() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the chroot() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the chsize() routine is available +to truncate files. You might need a -lx to get this routine. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the class() routine is available. + +=item C + +From F: + +This variable conditionally defines C if closedir() is +available. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates that the struct cmsghdr is supported. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that this C compiler knows about the +const type. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the crypt() routine is available +to encrypt passwords and the like. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the crypt_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the C-shell exists. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the ctermid_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the ctime_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the cuserid() routine is available +to get character login names. + +=item C + +From F: + +This variable conditionally defines d_dbl_dig if this system's +header files provide C, which is the number of significant +digits in a double precision number. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the system provides +a prototype for the dbminit() function. Otherwise, it is +up to the program to supply one. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the difftime() routine is available. + +=item C + +From F: + +This variable conditionally defines the C constant, +which indicates to the C program that dirfd() is available +to return the file descriptor of a directory stream. + +=item C + +From F: + +This variable conditionally defines C, which indicates +to the C program that the length of directory entry names is +provided by a d_namelen field. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the dlerror() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the dlopen() routine is available. + +=item C + +From F: + +This variable conditionally defines C, which +indicates that we need to prepend an underscore to the symbol +name before calling dlsym(). + +=item C + +From F: + +This variable conditionally defines the symbol C, which +tells the C program that it should insert setuid emulation code +on hosts which have setuid #! scripts disabled. + +=item C + +From F: + +This variable conditionally defines the HAS_DRAND48_R symbol, +which indicates to the C program that the drand48_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the HAS_DRAND48_PROTO symbol, +which indicates to the C program that the system provides +a prototype for the drand48() function. Otherwise, it is +up to the program to supply one. + +=item C + +From F: + +This variable conditionally defines HAS_DUP2 if dup2() is +available to duplicate file descriptors. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the eaccess() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the endgrent() routine is available +for sequential access of the group database. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the endgrent_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines C if endhostent() is +available to close whatever was being used for host queries. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the endhostent_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines C if endnetent() is +available to close whatever was being used for network queries. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the endnetent_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines C if endprotoent() is +available to close whatever was being used for protocol queries. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the endprotoent_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the endpwent() routine is available +for sequential access of the passwd database. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the endpwent_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines C if endservent() is +available to close whatever was being used for service queries. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the endservent_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines C if C can be seen +when reading from a non-blocking I/O source. + +=item C + +From F: + +This variable conditionally defines the symbols C and C, which +alerts the C program that it must deal with ideosyncracies of C. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the fchdir() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the fchmod() routine is available +to change mode of opened files. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the fchown() routine is available +to change ownership of opened files. + +=item C + +From F: + +This variable conditionally defines the C symbol, and indicates +whether the fcntl() function exists + +=item C + +From F: + +This variable conditionally defines the C symbol +and indicates whether file locking with fcntl() works. + +=item C + +From F: + +This variable contains the eventual value of the C symbol, +which indicates if your C compiler knows about the macros which +manipulate an fd_set. + +=item C + +From F: + +This variable contains the eventual value of the C symbol, +which indicates if your C compiler knows about the fd_set typedef. + +=item C + +From F: + +This variable contains the eventual value of the C symbol, +which indicates if your fd_set typedef contains the fds_bits member. +If you have an fd_set typedef, but the dweebs who installed it did +a half-fast job and neglected to provide the macros to manipulate +an fd_set, C will let us know how to fix the gaffe. + +=item C + +From F: + +This variable conditionally defines C if fgetpos() is +available to get the file position indicator. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the finite() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the finitel() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates that the system supports filenames longer than 14 characters. + +=item C + +From F: + +This variable conditionally defines C if flock() is +available to do file locking. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the system provides +a prototype for the flock() function. Otherwise, it is +up to the program to supply one. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the fork() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the fp_class() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the pathconf() routine is available +to determine file-system related limits and options associated +with a given open file descriptor. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the fpclass() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the fpclassify() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the fpclassl() routine is available. + +=item C + +From F: + +This symbol will be defined if the C compiler supports fpos64_t. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the frexpl() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates that the struct fs_data is supported. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the fseeko() routine is available. + +=item C + +From F: + +This variable conditionally defines C if fsetpos() is +available to set the file position indicator. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the fstatfs() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the fstatvfs() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the fsync() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the ftello() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which indicates +that the ftime() routine exists. The ftime() routine is basically +a sub-second accuracy clock. + +=item C + +From F: + +This variable holds what Gconvert is defined as to convert +floating point numbers into strings. By default, Configure +sets C macro to use the first of gconvert, gcvt, or sprintf +that pass sprintf-%g-like behaviour tests. If perl is using +long doubles, the macro uses the first of the following +functions that pass Configure's tests: qgcvt, sprintf (if +Configure knows how to make sprintf format long doubles--see +sPRIgldbl), gconvert, gcvt, and sprintf (casting to double). +The gconvert_preference and gconvert_ld_preference variables +can be used to alter Configure's preferences, for doubles and +long doubles, respectively. If present, they contain a +space-separated list of one or more of the above function +names in the order they should be tried. + +d_Gconvert may be set to override Configure with a platform- +specific function. If this function expects a double, a +different value may need to be set by the F +call-back unit so that long doubles can be formatted without +loss of precision. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the getcwd() routine is available +to get the current working directory. + +=item C + +From F: + +This variable conditionally defines C if getespwnam() is +available to retrieve enchanced (shadow) password entries by name. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the getfsstat() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the getgrent() routine is available +for sequential access of the group database. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the getgrent_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the getgrgid_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the getgrnam_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the getgroups() routine is available +to get the list of process groups. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the gethostbyaddr() routine is available +to look up hosts by their C addresses. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the gethostbyname() routine is available +to look up host names in some data base or other. + +=item C + +From F: + +This variable conditionally defines C if gethostent() is +available to look up host names in some data base or another. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the gethostname() routine may be +used to derive the host name. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the gethostbyaddr_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the gethostbyname_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the gethostent_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that supplies +prototypes for the various gethost*() functions. +See also F for probing for various netdb types. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the getitimer() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the getlogin() routine is available +to get the login name. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the getlogin_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the getmnt() routine is available +to retrieve one or more mount info blocks by filename. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the getmntent() routine is available +to iterate through mounted files to get their mount info. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the getnetbyaddr() routine is available +to look up networks by their C addresses. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the getnetbyname() routine is available +to look up networks by their names. + +=item C + +From F: + +This variable conditionally defines C if getnetent() is +available to look up network names in some data base or another. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the getnetbyaddr_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the getnetbyname_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the getnetent_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that supplies +prototypes for the various getnet*() functions. +See also F for probing for various netdb types. + +=item C + +From F: + +This variable conditionally defines C if getpagesize() +is available to get the system page size. + +=item C + +From F: + +This variable conditionally defines the C +symbol, which indicates to the C program that the +getprotobyname() routine is available to look up protocols +by their name. + +=item C + +From F: + +This variable conditionally defines the C +symbol, which indicates to the C program that the +getprotobynumber() routine is available to look up protocols +by their number. + +=item C + +From F: + +This variable conditionally defines C if getprotoent() is +available to look up protocols in some data base or another. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the getpgid(pid) function +is available to get the process group id. + +=item C + +From F: + +This variable conditionally defines the HAS_GETPGRP2 symbol, which +indicates to the C program that the getpgrp2() (as in F>) routine +is available to get the current process group. + +=item C + +From F: + +This variable conditionally defines C if getpgrp() is +available to get the current process group. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the getppid() routine is available +to get the parent process C. + +=item C + +From F: + +This variable conditionally defines C if getpriority() +is available to get a process's priority. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the getprotobyname_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the getprotobynumber_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the getprotoent_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that supplies +prototypes for the various getproto*() functions. +See also F for probing for various netdb types. + +=item C + +From F: + +This variable conditionally defines C if getprpwnam() is +available to retrieve protected (shadow) password entries by name. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the getpwent() routine is available +for sequential access of the passwd database. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the getpwent_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the getpwnam_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the getpwuid_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C +symbol, which indicates to the C program that the +getservbyname() routine is available to look up services +by their name. + +=item C + +From F: + +This variable conditionally defines the C +symbol, which indicates to the C program that the +getservbyport() routine is available to look up services +by their port. + +=item C + +From F: + +This variable conditionally defines C if getservent() is +available to look up network services in some data base or another. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the getservbyname_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the getservbyport_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the getservent_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that supplies +prototypes for the various getserv*() functions. +See also F for probing for various netdb types. + +=item C + +From F: + +This variable conditionally defines C if getspnam() is +available to retrieve SysV shadow password entries by name. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the getspnam_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates that the gettimeofday() system call exists (to obtain a +sub-second accuracy clock). You should probably include . + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the gmtime_r() +routine is available. + +=item C + +From F: + +Defined if we're dealing with the C C Library. + +=item C + +From F: + +This variable conditionally defines C, which indicates +that struct group in contains gr_passwd. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the hasmntopt() routine is available +to query the mount options of file systems. + +=item C + +From F: + +This variable conditionally defines C if htonl() and its +friends are available to do network order byte swapping. + +=item C + +From F: + +This variable conditionally defines C if index() and +rindex() are available for string searching. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the inet_aton() function is available +to parse C address C strings. + +=item C + +From F: + +This symbol will be defined if the C compiler supports int64_t. + +=item C + +From F: + +This variable conditionally defines the C constant, +which indicates to the C program that isascii() is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the isfinite() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the isinf() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the isnan() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the isnanl() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the killpg() routine is available +to kill process groups. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the lchown() routine is available +to operate on a symbolic link (instead of following the link). + +=item C + +From F: + +This variable conditionally defines d_ldbl_dig if this system's +header files provide C, which is the number of significant +digits in a long double precision number. + +=item C + +From F: + +This variable conditionally defines C if link() is +available to create hard links. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the localtime_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines C if localeconv() is +available for numeric and monetary formatting conventions. + +=item C + +From F: + +This variable conditionally defines C if lockf() is +available to do file locking. + +=item C + +From F: + +This variable conditionally defines C if +the long double type is supported. + +=item C + +From F: + +This variable conditionally defines C if +the long long type is supported. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the system provides +a prototype for the lseek() function. Otherwise, it is +up to the program to supply one. + +=item C + +From F: + +This variable conditionally defines C if lstat() is +available to do file stats on symbolic links. + +=item C + +From F: + +This variable conditionally defines C if madvise() is +available to map a file into memory. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the mblen() routine is available +to find the number of bytes in a multibye character. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the mbstowcs() routine is available +to convert a multibyte string into a wide character string. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the mbtowc() routine is available +to convert multibyte to a wide character. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the memchr() routine is available +to locate characters within a C string. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the memcmp() routine is available +to compare blocks of memory. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the memcpy() routine is available +to copy blocks of memory. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the memmove() routine is available +to copy potentatially overlapping blocks of memory. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the memset() routine is available +to set blocks of memory. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the mkdir() routine is available +to create F. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the mkdtemp() routine is available +to exclusively create a uniquely named temporary directory. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the mkfifo() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the mkstemp() routine is available +to exclusively create and open a uniquely named temporary file. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the mkstemps() routine is available +to exclusively create and open a uniquely named (with a suffix) +temporary file. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the mktime() routine is available. + +=item C + +From F: + +This variable conditionally defines C if mmap() is +available to map a file into memory. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the modfl() routine is available. + +=item C + +From F: + +This variable conditionally defines the HAS_MODFL_POW32_BUG symbol, +which indicates that modfl() is broken for long doubles >= pow(2, 32). +For example from 4294967303.150000 one would get 4294967302.000000 +and 1.150000. The bug has been seen in certain versions of glibc, +release 2.2.2 is known to be okay. + +=item C + +From F: + +This variable conditionally defines C if mprotect() is +available to modify the access protection of a memory mapped file. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates that the entire msg*(2) library is present. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates that the C is available. #ifdef is +not enough because it may be an enum, glibc has been known to do this. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates that the C is available. #ifdef is +not enough because it may be an enum, glibc has been known to do this. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates that the C is available. #ifdef is +not enough because it may be an enum, glibc has been known to do this. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates that the C is available. #ifdef is +not enough because it may be an enum, glibc has been known to do this. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates that the C is available. #ifdef is +not enough because it may be an enum, glibc has been known to do this. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the msgctl() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the msgget() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates that the struct msghdr is supported. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the msgrcv() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the msgsnd() routine is available. + +=item C + +From F: + +This variable conditionally defines C if msync() is +available to synchronize a mapped file. + +=item C + +From F: + +This variable conditionally defines C if munmap() is +available to unmap a region mapped by mmap(). + +=item C + +From F: + +This variable conditionally defines C in case other parts +of the source want to take special action if C is used. +This may include different sorts of profiling or error detection. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the nice() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the nl_langinfo() routine is available. + +=item C + +From F: + +This variable indicates whether a variable of type nvtype +can preserve all the bits a variable of type uvtype. + +=item C + +From F: + +This symbol will be defined if the C compiler supports off64_t. + +=item C + +From F: + +This variable conditionally defines pthread_create_joinable. +undef if F defines C. + +=item C + +From F: + +This variable conditionally defines the C symbol, +and indicates that Perl should be built to use the old +draft C threads C. This is only potentially meaningful if +usethreads is set. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates that the C socket interface is based on 4.1c and not 4.2. + +=item C + +From F: + +This variable conditionally defines the HAS_OPEN3 manifest constant, +which indicates to the C program that the 3 argument version of +the open(2) function is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the pathconf() routine is available +to determine file-system related limits and options associated +with a given filename. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the pause() routine is available +to suspend a process until a signal is received. + +=item C + +From F: + +This variable conditionally defines C, which +contains a colon-separated set of paths for the perl binary to +include in @C. See also otherlibdirs. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +contains the shell command which, when fed to popen(), may be +used to derive the host name. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the pipe() routine is available +to create an inter-process channel. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the poll() routine is available +to poll active file descriptors. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that it should not assume that it is +running on the machine it was compiled on. + +=item C + +From F: + +This variable conditionally defines the PERL_PRId64 symbol, which +indiciates that stdio has a symbol to print 64-bit decimal numbers. + +=item C + +From F: + +This variable conditionally defines the PERL_PRIfldbl symbol, which +indiciates that stdio has a symbol to print long doubles. + +=item C + +From F: + +This variable conditionally defines the PERL_PRIfldbl symbol, which +indiciates that stdio has a symbol to print long doubles. +The C in the name is to separate this from d_PRIeldbl so that even +case-blind systems can see the difference. + +=item C + +From F: + +This variable conditionally defines the PERL_PRIfldbl symbol, which +indiciates that stdio has a symbol to print long doubles. + +=item C + +From F: + +This variable conditionally defines the PERL_PRIfldbl symbol, which +indiciates that stdio has a symbol to print long doubles. +The C in the name is to separate this from d_PRIfldbl so that even +case-blind systems can see the difference. + +=item C + +From F: + +This variable conditionally defines the PERL_PRIfldbl symbol, which +indiciates that stdio has a symbol to print long doubles. + +=item C + +From F: + +This variable conditionally defines the PERL_PRIfldbl symbol, which +indiciates that stdio has a symbol to print long doubles. +The C in the name is to separate this from d_PRIgldbl so that even +case-blind systems can see the difference. + +=item C + +From F: + +This variable conditionally defines the PERL_PRIi64 symbol, which +indiciates that stdio has a symbol to print 64-bit decimal numbers. + +=item C + +From F: + +This variable conditionally defines the PERL_PRIo64 symbol, which +indiciates that stdio has a symbol to print 64-bit octal numbers. + +=item C + +From F: + +This variable conditionally defines the PERL_PRIu64 symbol, which +indiciates that stdio has a symbol to print 64-bit unsigned decimal +numbers. + +=item C + +From F: + +This variable conditionally defines the PERL_PRIx64 symbol, which +indiciates that stdio has a symbol to print 64-bit hexadecimal numbers. + +=item C + +From F: + +This variable conditionally defines the PERL_PRIXU64 symbol, which +indiciates that stdio has a symbol to print 64-bit hExADECimAl numbers. +The C in the name is to separate this from d_PRIx64 so that even +case-blind systems can see the difference. + +=item C + +From F: + +Defined if $procselfexe is symlink to the absolute +pathname of the executing program. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the pthread_atfork() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C +symbol if the pthread_yield routine is available to yield +the execution of the current thread. + +=item C + +From F: + +This variable conditionally defines C, which indicates +that struct passwd contains pw_age. + +=item C + +From F: + +This variable conditionally defines C, which indicates +that struct passwd contains pw_change. + +=item C + +From F: + +This variable conditionally defines C, which indicates +that struct passwd contains pw_class. + +=item C + +From F: + +This variable conditionally defines C, which indicates +that struct passwd contains pw_comment. + +=item C + +From F: + +This variable conditionally defines C, which indicates +that struct passwd contains pw_expire. + +=item C + +From F: + +This variable conditionally defines C, which indicates +that struct passwd contains pw_gecos. + +=item C + +From F: + +This variable conditionally defines C, which indicates +that struct passwd contains pw_passwd. + +=item C + +From F: + +This variable conditionally defines C, which indicates +that struct passwd contains pw_quota. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the qgcvt() routine is available. + +=item C + +From F: + +This variable, if defined, tells that there's a 64-bit integer type, +quadtype. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the random_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the HAS_READDIR64_R symbol, +which indicates to the C program that the readdir64_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines C if readdir() is +available to read directory entries. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the readdir_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the readlink() routine is available +to read the value of a symbolic link. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the readv() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the recvmsg() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the rename() routine is available +to rename files. + +=item C + +From F: + +This variable conditionally defines C if rewinddir() is +available. + +=item C + +From F: + +This variable conditionally defines C if rmdir() is +available to remove directories. + +=item C + +From F: + +This variable conditionally defines the C symbol if +the bcopy() routine can do overlapping copies. Normally, you +should probably use memmove(). + +=item C + +From F: + +This variable conditionally defines the C symbol if +the memcpy() routine can do overlapping copies. +For overlapping copies, memmove() should be used, if available. + +=item C + +From F: + +This variable conditionally defines the C symbol if +the memcpy() routine is available and can be used to compare relative +magnitudes of chars with their high bits set. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the system provides +a prototype for the sbrk() function. Otherwise, it is +up to the program to supply one. + +=item C + +From F: + +This variable conditionally defines the C +symbol if the sched_yield routine is available to yield +the execution of the current thread. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates that the C is available. #ifdef is +not enough because it may be an enum, glibc has been known to do this. + +=item C + +From F: + +This variable conditionally defines the PERL_PRIfldbl symbol, which +indiciates that stdio has a symbol to scan long doubles. + +=item C + +From F: + +This variable conditionally defines C if seekdir() is +available. + +=item C + +From F: + +This variable conditionally defines C if select() is +available to select active file descriptors. A +inclusion may be necessary for the timeout field. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates that the entire sem*(2) library is present. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the semctl() routine is available. + +=item C + +From F: + +This variable conditionally defines C, which +indicates that struct semid_ds * is to be used for semctl C. + +=item C + +From F: + +This variable conditionally defines C, which +indicates that union semun is to be used for semctl C. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the semget() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the semop() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the sendmsg() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the setegid() routine is available +to change the effective gid of the current program. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the seteuid() routine is available +to change the effective uid of the current program. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the setgrent() routine is available +for initializing sequential access to the group database. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the setgrent_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the setgroups() routine is available +to set the list of process groups. + +=item C + +From F: + +This variable conditionally defines C if sethostent() is +available. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the sethostent_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the setitimer() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the setlinebuf() routine is available +to change stderr or stdout from block-buffered or unbuffered to a +line-buffered mode. + +=item C + +From F: + +This variable conditionally defines C if setlocale() is +available to handle locale-specific ctype implementations. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the setlocale_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines C if setnetent() is +available. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the setnetent_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines C if setprotoent() is +available. + +=item C + +From F: + +This variable conditionally defines the C symbol if the +setpgid(pid, gpid) function is available to set process group C. + +=item C + +From F: + +This variable conditionally defines the HAS_SETPGRP2 symbol, which +indicates to the C program that the setpgrp2() (as in F>) routine +is available to set the current process group. + +=item C + +From F: + +This variable conditionally defines C if setpgrp() is +available to set the current process group. + +=item C + +From F: + +This variable conditionally defines C if setpriority() +is available to set a process's priority. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the setproctitle() routine +is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the setprotoent_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the setpwent() routine is available +for initializing sequential access to the passwd database. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the setpwent_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines C if setregid() is +available to change the real and effective gid of the current +process. + +=item C + +From F: + +This variable conditionally defines C if setresgid() is +available to change the real, effective and saved gid of the current +process. + +=item C + +From F: + +This variable conditionally defines C if setresuid() is +available to change the real, effective and saved uid of the current +process. + +=item C + +From F: + +This variable conditionally defines C if setreuid() is +available to change the real and effective uid of the current +process. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the setrgid() routine is available +to change the real gid of the current program. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the setruid() routine is available +to change the real uid of the current program. + +=item C + +From F: + +This variable conditionally defines C if setservent() is +available. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the setservent_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines C if setsid() is +available to set the process group C. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the setvbuf() routine is available +to change buffering on an open stdio stream. + +=item C + +From F: + +This variable conditionally defines the C symbol, +and indicates whether sfio is available (and should be used). + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates that the entire shm*(2) library is present. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the shmat() routine is available. + +=item C + +From F: + +This variable conditionally defines the C +symbol, which indicates that F has a prototype for +shmat. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the shmctl() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the shmdt() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the shmget() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates that the Vr4 sigaction() routine is available. + +=item C + +From F: + +This variable conditionally defines C +if sigprocmask() is available to examine or change the signal mask +of the calling process. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates that the sigsetjmp() routine is available to +call setjmp() and optionally save the process's signal mask. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the sockatmark() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the system provides +a prototype for the sockatmark() function. Otherwise, it is +up to the program to supply one. + +=item C + +From F: + +This variable conditionally defines C, which indicates +that the C socket interface is supported. + +=item C + +From F: + +This symbol will be defined if the C compiler supports socklen_t. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates that the C socketpair() is supported. + +=item C + +From F: + +This variable conditionally defines the HAS_SOCKS5_INIT symbol, which +indicates to the C program that the socks5_init() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the sqrtl() routine is available. + +=item C + +From F: + +This variable conditionally defines the HAS_SRAND48_R symbol, +which indicates to the C program that the srand48_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the srandom_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the system provides +a prototype for the setresgid() function. Otherwise, it is +up to the program to supply one. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the system provides +a prototype for the setresuid() function. Otherwise, it is +up to the program to supply one. + +=item C + +From F: + +This variable conditionally defines C +if this system has a stat structure declaring +st_blksize and st_blocks. + +=item C + +From F: + +This variable conditionally defines the C +symbol, which indicates to struct statfs from has f_flags member. +This kind of struct statfs is coming from F (C), +not from F (C). + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates that the struct statfs is supported. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the statvfs() routine is available. + +=item C + +From F: + +This variable conditionally defines C if the +C macro can be used as an lvalue. + +=item C + +From F: + +This variable conditionally defines C if the +C macro can be used as an lvalue. + +=item C + +From F: + +This symbol is defined if using the C macro as an lvalue +to increase the pointer by n leaves File_cnt(fp) unchanged. + +=item C + +From F: + +This symbol is defined if using the C macro as an lvalue +to increase the pointer by n has the side effect of decreasing the +value of File_cnt(fp) by n. + +=item C + +From F: + +This variable tells whether there is an array holding +the stdio streams. + +=item C + +From F: + +This variable conditionally defines C if this system +has a C structure declaring a usable _base field (or equivalent) +in F. + +=item C + +From F: + +This variable conditionally defines C if this system +has a C structure declaring usable _ptr and _cnt fields (or +equivalent) in F. + +=item C + +From F: + +This variable conditionally defines C if strchr() and +strrchr() are available for string searching. + +=item C + +From F: + +This variable conditionally defines C if strcoll() is +available to compare strings using collating information. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that this C compiler knows how to copy +structures. + +=item C + +From F: + +This variable holds what Strerrr is defined as to translate an error +code condition into an error message string. It could be C +or a more C macro emulating strrror with sys_errlist[], or the +C string when both strerror and sys_errlist are missing. + +=item C + +From F: + +This variable conditionally defines C if strerror() is +available to translate error numbers to strings. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the strerror_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the strftime() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the strtod() routine is available +to provide better numeric string conversion than atof(). + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the strtol() routine is available +to provide better numeric string conversion than atoi() and friends. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the strtold() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the strtoll() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the strtoq() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the strtoul() routine is available +to provide conversion of strings to unsigned long. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the strtoull() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the strtouq() routine is available. + +=item C + +From F: + +This variable conditionally defines C if strxfrm() is +available to transform strings. + +=item C + +From F: + +This variable conditionally defines C +if setuid scripts can be secure. This test looks in F. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the symlink() routine is available +to create symbolic links. + +=item C + +From F: + +This variable conditionally defines C if syscall() is +available call arbitrary system calls. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the system provides +a prototype for the syscall() function. Otherwise, it is +up to the program to supply one. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the sysconf() routine is available +to determine system related limits and options. + +=item C + +From F: + +This variable conditionally defines C if sys_errnolist[] +is available to translate error numbers to the symbolic name. + +=item C + +From F: + +This variable conditionally defines C if sys_errlist[] is +available to translate error numbers to strings. + +=item C + +From F: + +This variable conditionally defines C if system() is +available to issue a shell command. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the tcgetpgrp() routine is available. +to get foreground process group C. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the tcsetpgrp() routine is available +to set foreground process group C. + +=item C + +From F: + +This variable conditionally defines C if telldir() is +available. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the system provides +a prototype for the telldir() function. Otherwise, it is +up to the program to supply one. + +=item C + +From F: + +This variable conditionally defines the C symbol, which indicates +that the time() routine exists. The time() routine is normaly +provided on C systems. + +=item C + +From F: + +This variable conditionally defines the C symbol, which indicates +that the times() routine exists. The times() routine is normaly +provided on C systems. You may have to include . + +=item C + +From F: + +This variable conditionally defines C, which indicates +indicates to the C program that the struct tm has the tm_gmtoff field. + +=item C + +From F: + +This variable conditionally defines C, which indicates +indicates to the C program that the struct tm has the tm_zone field. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the tmpnam_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines C if truncate() is +available to truncate files. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the ttyname_r() +routine is available. + +=item C + +From F: + +This variable conditionally defines C if tzname[] is +available to access timezone names. + +=item C + +From F: + +This variable tells whether you must access character data +through U32-aligned pointers. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the ualarm() routine is available. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the umask() routine is available. +to set and get the value of the file creation mask. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the uname() routine may be +used to derive the host name. + +=item C + +From F: + +This variable conditionally defines C if the +union semun is defined by including . + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the unordered() routine is available. + +=item C + +From F: + +This variable conditionally defines C if usleep() is +available to do high granularity sleeps. + +=item C + +From F: + +This variable conditionally defines the C symbol, +which indicates to the C program that the system provides +a prototype for the usleep() function. Otherwise, it is +up to the program to supply one. + +=item C + +From F: + +This variable conditionally defines C if ustat() is +available to query file system statistics by dev_t. + +=item C + +From F: + +This variable conditionally defined C. + +=item C + +From F: + +This variable conditionally defines C. + +=item C + +From F: + +This variable conditionally defines C. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates the vfork() routine is available. + +=item C + +From F: + +This variable conditionally defines C if closedir() +does not return a value. + +=item C + +From F: + +This variable conditionally defines C if this system +declares "void (*signal(...))()" in F. The old way was to +declare it as "int (*signal(...))()". + +=item C + +From F: + +This variable conditionally defines C to indicate that the +ioctl() call with C should be used to void tty association. +Otherwise (on C probably), it is enough to close the standard file +decriptors and do a setpgrp(). + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that this C compiler knows about the +volatile declaration. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the vprintf() routine is available +to printf with a pointer to an argument list. + +=item C + +From F: + +This variable conditionally defines the HAS_WAIT4 symbol, which +indicates the wait4() routine is available. + +=item C + +From F: + +This variable conditionally defines C if waitpid() is +available to wait for child process. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the wcstombs() routine is available +to convert wide character strings to multibyte strings. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the wctomb() routine is available +to convert a wide character to a multibyte. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the writev() routine is available. + +=item C + +From F: + +This variable conditionally defines the symbol C, which alerts +the C program that it runs under Xenix. + +=item C + +From F: + +This variable is used internally by Configure to determine the +full pathname (if any) of the date program. After Configure runs, +the value is reset to a plain C and is not useful. + +=item C + +From F: + +This variable contains the type of the hash structure element +in the header file. In older versions of C, it was +int, while in newer ones it is u_int32_t. + +=item C + +From F: + +This variable contains the type of the prefix structure element +in the header file. In older versions of C, it was +int, while in newer ones it is size_t. + +=item C + +From F: + +This variable contains the major version number of +Berkeley C found in the header file. + +=item C + +From F: + +This variable contains the minor version number of +Berkeley C found in the header file. +For C version 1 this is always 0. + +=item C + +From F: + +This variable contains the patch version number of +Berkeley C found in the header file. +For C version 1 this is always 0. + +=item C + +From F: + +This variable contains the default value of the C symbol (15). + +=item C + +From F: + +This symbol is set to C or C depending on +whether dirent is available or not. You should use this pseudo type to +portably declare your directory entries. + +=item C + +From F: + +This variable contains the extension that is to be used for the +dynamically loaded modules that perl generaties. + +=item C + +From F: + +This variable contains the name of the dynamic loading file that +will be used with the package. + +=item C + +From F: + +This variable contains the value of the C symbol, which +indicates to the C program how many bytes there are in a double. + +=item C + +From F: + +Indicates the macro to be used to generate normalized +random numbers. Uses randfunc, often divided by +(double) (((unsigned long) 1 << randbits)) in order to +normalize the result. +In C programs, the macro C is mapped to drand01. + +=item C + +From F: + +This variable encodes the prototype of drand48_r. +It is zero if d_drand48_r is undef, and one of the +C macros of F if d_drand48_r +is defined. + +=item C + +From F: + +This variable holds a list of C extension files we want to +link dynamically into the package. It is used by Makefile. + +=back + +=head2 e + +=over 4 + +=item C + +From F: + +This variable bears the symbolic errno code set by read() when no +data is present on the file and non-blocking I/O was enabled (otherwise, +read() blocks naturally). + +=item C + +From F: + +This variable conditionally defines C if this +system uses C encoding. Among other things, this +means that the character ranges are not contiguous. +See F + +=item C + +From F: + +This variable is used internally by Configure to determine the +full pathname (if any) of the echo program. After Configure runs, +the value is reset to a plain C and is not useful. + +=item C + +From F: + +This variable is used internally by Configure to determine the +full pathname (if any) of the egrep program. After Configure runs, +the value is reset to a plain C and is not useful. + +=item C + +From F: + +This variable is defined but not used by Configure. +The value is a plain '' and is not useful. + +=item C + +From F: + +This variable encodes the prototype of endgrent_r. +It is zero if d_endgrent_r is undef, and one of the +C macros of F if d_endgrent_r +is defined. + +=item C + +From F: + +This variable encodes the prototype of endhostent_r. +It is zero if d_endhostent_r is undef, and one of the +C macros of F if d_endhostent_r +is defined. + +=item C + +From F: + +This variable encodes the prototype of endnetent_r. +It is zero if d_endnetent_r is undef, and one of the +C macros of F if d_endnetent_r +is defined. + +=item C + +From F: + +This variable encodes the prototype of endprotoent_r. +It is zero if d_endprotoent_r is undef, and one of the +C macros of F if d_endprotoent_r +is defined. + +=item C + +From F: + +This variable encodes the prototype of endpwent_r. +It is zero if d_endpwent_r is undef, and one of the +C macros of F if d_endpwent_r +is defined. + +=item C + +From F: + +This variable encodes the prototype of endservent_r. +It is zero if d_endservent_r is undef, and one of the +C macros of F if d_endservent_r +is defined. + +=item C + +From F: + +When running under Eunice this variable contains a command which will +convert a shell script to the proper form of text file for it to be +executable by the shell. On other systems it is a no-op. + +=item C + +From F: + +This is an old synonym for _exe. + +=item C + +From F: + +This variable is used internally by Configure to determine the +full pathname (if any) of the expr program. After Configure runs, +the value is reset to a plain C and is not useful. + +=item C + +From F: + +This variable holds a list of all extension files (both C and +non-xs linked into the package. It is propagated to F +and is typically used to test whether a particular extesion +is available. + +=item C + +From F: + +This variable holds a list of extra modules to install. + +=back + +=head2 f + +=over 4 + +=item C + +From F: + +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. + +=item C + +From F: + +This symbol, if defined, tells that fflush(C) does flush +all pending stdio output. + +=item C + +From F: + +This variable is defined but not used by Configure. +The value is a plain '' and is not useful. + +=item C + +From F: + +This variable defines the first file searched by make. On unix, +it is makefile (then Makefile). On case-insensitive systems, +it might be something else. This is only used to deal with +convoluted make depend tricks. + +=item C + +From F: + +This variable is defined but not used by Configure. +The value is a plain '' and is not useful. + +=item C + +From F: + +This variable contains the size of a fpostype in bytes. + +=item C + +From F: + +This variable defines Fpos_t to be something like fpos_t, long, +uint, or whatever type is used to declare file positions in libc. + +=item C + +From F: + +This variable contains the return type of free(). It is usually +void, but occasionally int. + +=item C + +From F: + +This variable contains the command used by Configure +to copy files from the target host. Useful and available +only during Perl build. +The string C<:> if not cross-compiling. + +=item C + +From F: + +This variable contains the full pathname to C, whether or +not the user has specified C. This is only used +in the F. + +=item C + +From F: + +This variable contains the full pathname to C, whether or +not the user has specified C. This is only used +in the compiled C program, and we assume that all systems which +can share this executable will have the same full pathname to +F + +=item C + +From F: + +This variable contains the full pathname to C, whether or +not the user has specified C. This is only used +in the compiled C program, and we assume that all systems which +can share this executable will have the same full pathname to +F + +=back + +=head2 g + +=over 4 + +=item C + +From F: + +If C cc (gcc) is used, this variable the operating system and +version used to compile the gcc. It is set to '' if not gcc, +or if nothing useful can be parsed as the os version. + +=item C + +From F: + +If C cc (gcc) is used, this variable holds C<1> or C<2> to +indicate whether the compiler is version 1 or 2. This is used in +setting some of the default cflags. It is set to '' if not gcc. + +=item C + +From F: + +This variable encodes the prototype of getgrent_r. +It is zero if d_getgrent_r is undef, and one of the +C macros of F if d_getgrent_r +is defined. + +=item C + +From F: + +This variable encodes the prototype of getgrgid_r. +It is zero if d_getgrgid_r is undef, and one of the +C macros of F if d_getgrgid_r +is defined. + +=item C + +From F: + +This variable encodes the prototype of getgrnam_r. +It is zero if d_getgrnam_r is undef, and one of the +C macros of F if d_getgrnam_r +is defined. + +=item C + +From F: + +This variable encodes the prototype of gethostbyaddr_r. +It is zero if d_gethostbyaddr_r is undef, and one of the +C macros of F if d_gethostbyaddr_r +is defined. + +=item C + +From F: + +This variable encodes the prototype of gethostbyname_r. +It is zero if d_gethostbyname_r is undef, and one of the +C macros of F if d_gethostbyname_r +is defined. + +=item C + +From F: + +This variable encodes the prototype of gethostent_r. +It is zero if d_gethostent_r is undef, and one of the +C macros of F if d_gethostent_r +is defined. + +=item C + +From F: + +This variable encodes the prototype of getlogin_r. +It is zero if d_getlogin_r is undef, and one of the +C macros of F if d_getlogin_r +is defined. + +=item C + +From F: + +This variable encodes the prototype of getnetbyaddr_r. +It is zero if d_getnetbyaddr_r is undef, and one of the +C macros of F if d_getnetbyaddr_r +is defined. + +=item C + +From F: + +This variable encodes the prototype of getnetbyname_r. +It is zero if d_getnetbyname_r is undef, and one of the +C macros of F if d_getnetbyname_r +is defined. + +=item C + +From F: + +This variable encodes the prototype of getnetent_r. +It is zero if d_getnetent_r is undef, and one of the +C macros of F if d_getnetent_r +is defined. + +=item C + +From F: + +This variable encodes the prototype of getprotobyname_r. +It is zero if d_getprotobyname_r is undef, and one of the +C macros of F if d_getprotobyname_r +is defined. + +=item C + +From F: + +This variable encodes the prototype of getprotobynumber_r. +It is zero if d_getprotobynumber_r is undef, and one of the +C macros of F if d_getprotobynumber_r +is defined. + +=item C + +From F: + +This variable encodes the prototype of getprotoent_r. +It is zero if d_getprotoent_r is undef, and one of the +C macros of F if d_getprotoent_r +is defined. + +=item C + +From F: + +This variable encodes the prototype of getpwent_r. +It is zero if d_getpwent_r is undef, and one of the +C macros of F if d_getpwent_r +is defined. + +=item C + +From F: + +This variable encodes the prototype of getpwnam_r. +It is zero if d_getpwnam_r is undef, and one of the +C macros of F if d_getpwnam_r +is defined. + +=item C + +From F: + +This variable encodes the prototype of getpwuid_r. +It is zero if d_getpwuid_r is undef, and one of the +C macros of F if d_getpwuid_r +is defined. + +=item C + +From F: + +This variable encodes the prototype of getservbyname_r. +It is zero if d_getservbyname_r is undef, and one of the +C macros of F if d_getservbyname_r +is defined. + +=item C + +From F: + +This variable encodes the prototype of getservbyport_r. +It is zero if d_getservbyport_r is undef, and one of the +C macros of F if d_getservbyport_r +is defined. + +=item C + +From F: + +This variable encodes the prototype of getservent_r. +It is zero if d_getservent_r is undef, and one of the +C macros of F if d_getservent_r +is defined. + +=item C + +From F: + +This variable encodes the prototype of getspnam_r. +It is zero if d_getspnam_r is undef, and one of the +C macros of F if d_getspnam_r +is defined. + +=item C + +From F: + +This variable contains the format string used for printing a Gid_t. + +=item C + +From F: + +This variable contains the signedness of a gidtype. +1 for unsigned, -1 for signed. + +=item C + +From F: + +This variable contains the size of a gidtype in bytes. + +=item C + +From F: + +This variable defines Gid_t to be something like gid_t, int, +ushort, or whatever type is used to declare the return type +of getgid(). Typically, it is the type of group ids in the kernel. + +=item C + +From F: + +This variable holds the general path (space-separated) used to +find libraries. It may contain directories that do not exist on +this platform, libpth is the cleaned-up version. + +=item C + +From F: + +This variable is used internally by Configure to determine the +full pathname (if any) of the gmake program. After Configure runs, +the value is reset to a plain C and is not useful. + +=item C + +From F: + +This variable encodes the prototype of gmtime_r. +It is zero if d_gmtime_r is undef, and one of the +C macros of F if d_gmtime_r +is defined. + +=item C + +From F: + +This variable contains the version number of the C C library. +It is usually something like F<2.2.5>. It is a plain '' if this +is not the C C library, or if the version is unknown. + +=item C + +From F: + +This variable is used internally by Configure to determine the +full pathname (if any) of the grep program. After Configure runs, +the value is reset to a plain C and is not useful. + +=item C + +From F: + +This variable contains a command that produces the text of the +F file. This is normally "cat F", but can be +"ypcat group" when C is used. +On some systems, such as os390, there may be no equivalent +command, in which case this variable is unset. + +=item C + +From F: + +This variable defines Groups_t to be something like gid_t, int, +ushort, or whatever type is used for the second argument to +getgroups() and setgroups(). Usually, this is the same as +gidtype (gid_t), but sometimes it isn't. + +=item C + +From F: + +This variable is used internally by Configure to determine the +full pathname (if any) of the gzip program. After Configure runs, +the value is reset to a plain C and is not useful. + +=back + +=head2 h + +=over 4 + +=item C + +From F: + +This is variable gets set in various places to tell i_fcntl that + should be included. + +=item C + +From F: + +This is variable gets set in various places to tell i_sys_file that + should be included. + +=item C + +From F: + +Gives the type of hints used for previous answers. May be one of +C, C or C. + +=item C + +From F: + +This variable contains a command that produces the text of the +F file. This is normally "cat F", but can be +"ypcat hosts" when C is used. +On some systems, such as os390, there may be no equivalent +command, in which case this variable is unset. + +=back + +=head2 i + +=over 4 + +=item C + +From F: + +This variable is the size of an I16 in bytes. + +=item C + +From F: + +This variable contains the C type used for Perl's I16. + +=item C + +From F: + +This variable is the size of an I32 in bytes. + +=item C + +From F: + +This variable contains the C type used for Perl's I32. + +=item C + +From F: + +This variable is the size of an I64 in bytes. + +=item C + +From F: + +This variable contains the C type used for Perl's I64. + +=item C + +From F: + +This variable is the size of an I8 in bytes. + +=item C + +From F: + +This variable contains the C type used for Perl's I8. + +=item C + +From F: + +This variable conditionally defines the C symbol, +and indicates whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that exists and should +be included. + +=item C + +From F: + +This variable conditionally defines the C symbol, and indicates +whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, and indicates +whether a C program may include Berkeley's C include file . + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that exists and should +be included. + +=item C + +From F: + +This variable conditionally defines C, which indicates +to the C program that it should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that (C dynamic loading) +exists and should be included. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that exists and should +be included. + +=item C + +From F: + +This variable controls the value of C (which tells +the C program to include ). + +=item C + +From F: + +This variable conditionally defines the C symbol, and indicates +whether a C program may include to get symbols like C +or C, F. machine dependent floating point values. + +=item C + +From F: + +This variable conditionally defines the C symbol, and indicates +whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, and indicates +whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that exists and should +be included. + +=item C + +From F: + +This variable conditionally defines the C symbol, and indicates +whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, and indicates +whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, +and indicates whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, +and indicates whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, and indicates +whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, and indicates +whether a C program may include to get symbols like C +and friends. + +=item C + +From F: + +This variable conditionally defines the C symbol, +and indicates whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, +and indicates whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, and indicates +whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, and indicates +whether a C program may include . + +=item C + +From F: + +This variable conditionally defines the C symbol, and indicates +whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, and indicates +whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that exists and should +be included. + +=item C + +From F: + +This variable conditionally defines the C symbol, and indicates +whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that exists and should +be included. + +=item C + +From F: + +This variable conditionally defines the C symbol, +and indicates whether a C program should include . + +=item C + +From F: + +This variable conditionally defines C, which indicates +to the C program that it should include . Otherwise, +you may try . + +=item C + +From F: + +This variable conditionally defines the C symbol, and indicates +whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, and indicates +whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, +and indicates whether a C program should include . + +=item C + +From F: + +This variable conditionally defines C, which indicates +to the C program that it should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that exists and should +be included. Some System V systems might need this instead of . + +=item C + +From F: + +This variable conditionally defines the C symbol, +and indicates whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that it should include rather +than . + +=item C + +From F: + +This variable conditionally defines the C symbol, and indicates +whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, and indicates +whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that exists and should +be included. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that exists and should +be included. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that exists and should +be included. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates that should be included rather than . + +=item C + +From F: + +This variable conditionally defines the C symbol, and indicates +whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, +and indicates whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, and indicates +whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, and indicates +whether a C program should include to get C and friends. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that exists and should +be included in preference to . + +=item C + +From F: + +This variable conditionally defines C, which indicates +to the C program that it should include instead of +. + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that exists and should +be included. + +=item C + +From F: + +This variable conditionally defines the C symbol, +and indicates whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, and +indicates whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, +and indicates whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, +and indicates whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, and indicates +whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, and indicates +whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, +and indicates whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, +and indicates whether a C program should include . + +=item C + +From F: + +This variable conditionally defines C, which indicates +to the C program that it should include in order to +get the definition of struct timeval. + +=item C + +From F: + +This variable conditionally defines C to indicate to the +C program that socket ioctl codes may be found in +instead of . + +=item C + +From F: + +This variable conditionally defines the C symbol, +and indicates whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, +and indicates whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, +and indicates whether a C program should include . + +=item C + +From F: + +This variable conditionally defines C, which indicates +to the C program that it should include . + +=item C + +From F: + +This variable conditionally defines C, which +indicates to the C program that it should include +with C defined. + +=item C + +From F: + +This variable conditionally defines the C symbol, and indicates +whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, +and indicates whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, and indicates +whether a C program should include . + +=item C + +From F: + +This variable conditionally defines C, which indicates +to the C program that it should include to get C +domain socket definitions. + +=item C + +From F: + +This variable conditionally defines the C symbol, +and indicates whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, +and indicates whether a C program should include . + +=item C + +From F: + +This variable conditionally defines C, which indicates +to the C program that it should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that it should include rather +than . + +=item C + +From F: + +This variable conditionally defines the C symbol, which +indicates to the C program that the C file is +to be included. + +=item C + +From F: + +This variable conditionally defines C, which indicates +to the C program that it should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, and indicates +whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, and indicates +whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, and indicates +whether a C program should include . + +=item C + +From F: + +This variable conditionally defines the C symbol, and indicates +whether a C program may include to get symbols like C +and friends. + +=item C + +From F: + +This variable conditionally defines C, which indicates +to the C program that it should include . + +=item C + +From F: + +Contains the name of the header to be included to get va_dcl definition. +Typically one of F or F. + +=item C + +From F: + +This variable conditionally defines the C symbol, and indicates +whether a C program should include F. + +=item C + +From F: + +This variable should be non-empty if non-versioned shared +libraries (F) are to be ignored (because they +cannot be linked against). + +=item C + +From F: + +This variable specifies the list of subdirectories in over +which F:incpush() and F will automatically +search when adding directories to @C. The elements in +the list are separated by spaces. This is only useful +if you have a perl library directory tree structured like the +default one. See C for how this works. The versioned +site_perl directory was introduced in 5.005, so that is the +lowest possible value. + +=item C + +From F: + +This variable holds the same list as inc_version_list, but +each item is enclosed in double quotes and separated by commas, +suitable for use in the C initialization. + +=item C + +From F: + +This variable must preceed the normal include path to get hte +right one, as in F<$F> or F<$F>. +Value can be "" or F on mips. + +=item C + +From F: + +This variable is defined but not used by Configure. +The value is a plain '' and is not useful. + +=item C + +From F: + +This variable is really the same as archlibexp but may differ on +those systems using C. For extra portability, only this variable +should be used in makefiles. + +=item C + +From F: + +This variable is the same as binexp unless C is running in which case +the user is explicitely prompted for it. This variable should always +be used in your makefiles for maximum portability. + +=item C + +From F: + +This variable is really the same as man1direxp, unless you are using +C in which case it points to the read/write location whereas +man1direxp only points to the read-only access location. For extra +portability, you should only use this variable within your makefiles. + +=item C + +From F: + +This variable is really the same as man3direxp, unless you are using +C in which case it points to the read/write location whereas +man3direxp only points to the read-only access location. For extra +portability, you should only use this variable within your makefiles. + +=item C + +From F: + +This variable holds the name of the directory below which +"make install" will install the package. For most users, this +is the same as prefix. However, it is useful for +installing the software into a different (usually temporary) +location after which it can be bundled up and moved somehow +to the final location specified by prefix. + +=item C + +From F: + +This variable holds the full absolute path of installprefix +with all F<~>-expansion done. + +=item C + +From F: + +This variable is really the same as privlibexp but may differ on +those systems using C. For extra portability, only this variable +should be used in makefiles. + +=item C + +From F: + +This variable is usually the same as scriptdirexp, unless you are on +a system running C, in which case they may differ slightly. You +should always use this variable within your makefiles for portability. + +=item C + +From F: + +This variable is really the same as sitearchexp but may differ on +those systems using C. For extra portability, only this variable +should be used in makefiles. + +=item C + +From F: + +This variable is usually the same as sitebinexp, unless you are on +a system running C, in which case they may differ slightly. You +should always use this variable within your makefiles for portability. + +=item C + +From F: + +This variable is really the same as sitelibexp but may differ on +those systems using C. For extra portability, only this variable +should be used in makefiles. + +=item C + +From F: + +This variable describes the C> and/or +C> options, or by L method. These all provide +mechanisms for XML::Parser to set the handlers needed by XML::Parser::Expat. +If neither C