From bf041c788714a249adf5c4ade99f2f5969181622 Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Sun, 5 Aug 2007 18:52:46 +0100 Subject: [PATCH] Delete fest This commit removes many, many files, which are not needed for compiling git. Signed-off-by: Johannes Schindelin --- bin/aclocal | 475 - bin/aclocal-1.7 | 475 - bin/autoconf | 271 - bin/autogen.exe | Bin 681984 -> 0 bytes bin/autoheader | 294 - bin/autom4te | 1231 - bin/automake | 9229 ------- bin/automake-1.7 | 9229 ------- bin/autoopts-config | 104 - bin/autoreconf | 616 - bin/autoscan | 645 - bin/autoupdate | 1054 - bin/bashbug | 272 - bin/c_rehash | 158 - bin/cls | 9 - bin/clsb | 9 - bin/columns.exe | Bin 39936 -> 0 bytes bin/comm.exe | Bin 21504 -> 0 bytes bin/cvsbug | 526 - bin/ex | 8 - bin/find2perl | 846 - bin/fold.exe | Bin 21504 -> 0 bytes bin/ftp | 8 - bin/ftp.exe | Bin 101207 -> 0 bytes bin/getdefs.exe | Bin 76800 -> 0 bytes bin/guile-config | 299 - bin/guile-snarf | 91 - bin/guile.exe | Bin 532992 -> 0 bytes bin/ifnames | 142 - bin/info.exe | Bin 163840 -> 0 bytes bin/infokey.exe | Bin 33280 -> 0 bytes bin/libtool | 6967 ----- bin/libtoolize | 353 - bin/lnkcnv | 19 - bin/m4.exe | Bin 118148 -> 0 bytes bin/makeinfo.exe | Bin 180224 -> 0 bytes bin/md5sum.exe | Bin 27648 -> 0 bytes bin/perlbug | 1150 - bin/perlcc | 627 - bin/perldoc | 829 - bin/perlld | 89 - bin/rcp.exe | Bin 42735 -> 0 bytes bin/rcs2log | 677 - bin/rlogin.exe | Bin 11776 -> 0 bytes bin/rsh.exe | Bin 11264 -> 0 bytes bin/rvi | 8 - bin/rview | 8 - bin/rvim | 8 - bin/sftp.exe | Bin 84992 -> 0 bytes bin/telnet.exe | Bin 109127 -> 0 bytes bin/texi2dvi | 657 - bin/texindex.exe | Bin 29184 -> 0 bytes bin/tftp.exe | Bin 40946 -> 0 bytes bin/view | 8 - lib/cvs/contrib/README | 104 - lib/cvs/contrib/clmerge | 152 - lib/cvs/contrib/cln_hist | 91 - lib/cvs/contrib/commit_prep | 215 - lib/cvs/contrib/cvs2vendor | 142 - lib/cvs/contrib/cvs_acls | 141 - lib/cvs/contrib/cvscheck | 83 - lib/cvs/contrib/cvscheck.man | 52 - lib/cvs/contrib/intro.doc | 112 - lib/cvs/contrib/log | 182 - lib/cvs/contrib/log_accum | 576 - lib/cvs/contrib/mfpipe | 85 - lib/cvs/contrib/rcs-to-cvs | 184 - lib/cvs/contrib/rcs2log | 677 - lib/cvs/contrib/rcslock | 235 - lib/cvs/contrib/sccs2rcs | 280 - lib/perl5/5.6.1/CGI.pm | 6639 ----- lib/perl5/5.6.1/CGI/Apache.pm | 23 - lib/perl5/5.6.1/CGI/Carp.pm | 421 - lib/perl5/5.6.1/CGI/Cookie.pm | 429 - lib/perl5/5.6.1/CGI/Fast.pm | 174 - lib/perl5/5.6.1/CGI/Pretty.pm | 235 - lib/perl5/5.6.1/CGI/Push.pm | 325 - lib/perl5/5.6.1/CGI/Switch.pm | 24 - lib/perl5/5.6.1/CGI/Util.pm | 258 - lib/perl5/5.6.1/CPAN.pm | 6992 ----- lib/perl5/5.6.1/CPAN/FirstTime.pm | 671 - lib/perl5/5.6.1/CPAN/Nox.pm | 44 - lib/perl5/5.6.1/pods/perl.pod | 368 - lib/perl5/5.6.1/pods/perl5004delta.pod | 1612 -- lib/perl5/5.6.1/pods/perl5005delta.pod | 993 - lib/perl5/5.6.1/pods/perlaix.pod | 174 - lib/perl5/5.6.1/pods/perlamiga.pod | 297 - lib/perl5/5.6.1/pods/perlapi.pod | 3546 --- lib/perl5/5.6.1/pods/perlapio.pod | 274 - lib/perl5/5.6.1/pods/perlbook.pod | 17 - lib/perl5/5.6.1/pods/perlboot.pod | 815 - lib/perl5/5.6.1/pods/perlbot.pod | 527 - lib/perl5/5.6.1/pods/perlbs2000.pod | 202 - lib/perl5/5.6.1/pods/perlcall.pod | 1957 -- lib/perl5/5.6.1/pods/perlclib.pod | 197 - lib/perl5/5.6.1/pods/perlcompile.pod | 441 - lib/perl5/5.6.1/pods/perlcygwin.pod | 592 - lib/perl5/5.6.1/pods/perldata.pod | 829 - lib/perl5/5.6.1/pods/perldbmfilter.pod | 168 - lib/perl5/5.6.1/pods/perldebguts.pod | 925 - lib/perl5/5.6.1/pods/perldebtut.pod | 721 - lib/perl5/5.6.1/pods/perldebug.pod | 956 - lib/perl5/5.6.1/pods/perldelta.pod | 3646 --- lib/perl5/5.6.1/pods/perldiag.pod | 3869 --- lib/perl5/5.6.1/pods/perldos.pod | 333 - lib/perl5/5.6.1/pods/perldsc.pod | 832 - lib/perl5/5.6.1/pods/perlebcdic.pod | 1235 - lib/perl5/5.6.1/pods/perlembed.pod | 1069 - lib/perl5/5.6.1/pods/perlepoc.pod | 231 - lib/perl5/5.6.1/pods/perlfaq.pod | 1430 - lib/perl5/5.6.1/pods/perlfaq1.pod | 328 - lib/perl5/5.6.1/pods/perlfaq2.pod | 532 - lib/perl5/5.6.1/pods/perlfaq3.pod | 814 - lib/perl5/5.6.1/pods/perlfaq4.pod | 1821 -- lib/perl5/5.6.1/pods/perlfaq5.pod | 1216 - lib/perl5/5.6.1/pods/perlfaq6.pod | 711 - lib/perl5/5.6.1/pods/perlfaq7.pod | 974 - lib/perl5/5.6.1/pods/perlfaq8.pod | 1103 - lib/perl5/5.6.1/pods/perlfaq9.pod | 602 - lib/perl5/5.6.1/pods/perlfilter.pod | 569 - lib/perl5/5.6.1/pods/perlfork.pod | 317 - lib/perl5/5.6.1/pods/perlform.pod | 346 - lib/perl5/5.6.1/pods/perlfunc.pod | 5885 ---- lib/perl5/5.6.1/pods/perlguts.pod | 2318 -- lib/perl5/5.6.1/pods/perlhack.pod | 1722 -- lib/perl5/5.6.1/pods/perlhist.pod | 571 - lib/perl5/5.6.1/pods/perlhpux.pod | 280 - lib/perl5/5.6.1/pods/perlintern.pod | 120 - lib/perl5/5.6.1/pods/perlipc.pod | 1509 -- lib/perl5/5.6.1/pods/perllexwarn.pod | 514 - lib/perl5/5.6.1/pods/perllocale.pod | 980 - lib/perl5/5.6.1/pods/perllol.pod | 303 - lib/perl5/5.6.1/pods/perlmachten.pod | 89 - lib/perl5/5.6.1/pods/perlmacos.pod | 63 - lib/perl5/5.6.1/pods/perlmod.pod | 455 - lib/perl5/5.6.1/pods/perlmodinstall.pod | 486 - lib/perl5/5.6.1/pods/perlmodlib.pod | 2042 -- lib/perl5/5.6.1/pods/perlmpeix.pod | 675 - lib/perl5/5.6.1/pods/perlnewmod.pod | 282 - lib/perl5/5.6.1/pods/perlnumber.pod | 185 - lib/perl5/5.6.1/pods/perlobj.pod | 566 - lib/perl5/5.6.1/pods/perlop.pod | 1936 -- lib/perl5/5.6.1/pods/perlopentut.pod | 864 - lib/perl5/5.6.1/pods/perlos2.pod | 1942 -- lib/perl5/5.6.1/pods/perlos390.pod | 406 - lib/perl5/5.6.1/pods/perlpod.pod | 318 - lib/perl5/5.6.1/pods/perlport.pod | 2078 -- lib/perl5/5.6.1/pods/perlre.pod | 1285 - lib/perl5/5.6.1/pods/perlref.pod | 703 - lib/perl5/5.6.1/pods/perlreftut.pod | 416 - lib/perl5/5.6.1/pods/perlrequick.pod | 503 - lib/perl5/5.6.1/pods/perlretut.pod | 2504 -- lib/perl5/5.6.1/pods/perlrun.pod | 859 - lib/perl5/5.6.1/pods/perlsec.pod | 365 - lib/perl5/5.6.1/pods/perlsolaris.pod | 526 - lib/perl5/5.6.1/pods/perlstyle.pod | 277 - lib/perl5/5.6.1/pods/perlsub.pod | 1278 - lib/perl5/5.6.1/pods/perlsyn.pod | 639 - lib/perl5/5.6.1/pods/perlthrtut.pod | 1067 - lib/perl5/5.6.1/pods/perltie.pod | 1084 - lib/perl5/5.6.1/pods/perltoc.pod | 13046 --------- lib/perl5/5.6.1/pods/perltodo.pod | 858 - lib/perl5/5.6.1/pods/perltoot.pod | 1798 -- lib/perl5/5.6.1/pods/perltootc.pod | 1347 - lib/perl5/5.6.1/pods/perltrap.pod | 1538 -- lib/perl5/5.6.1/pods/perlunicode.pod | 242 - lib/perl5/5.6.1/pods/perlutil.pod | 185 - lib/perl5/5.6.1/pods/perlvar.pod | 1234 - lib/perl5/5.6.1/pods/perlvmesa.pod | 136 - lib/perl5/5.6.1/pods/perlvms.pod | 885 - lib/perl5/5.6.1/pods/perlvos.pod | 218 - lib/perl5/5.6.1/pods/perlwin32.pod | 708 - lib/perl5/5.6.1/pods/perlxs.pod | 1780 -- lib/perl5/5.6.1/pods/perlxstut.pod | 1263 - mingw/bin/SDL.dll | Bin 1689575 -> 0 bytes mingw/doc/tcltk/tcl84.hlp | Bin 2711968 -> 0 bytes mingw/include/GL/gl.h | 1470 - mingw/include/GL/glext.h | 4623 ---- mingw/include/GL/glu.h | 289 - mingw/include/SDL/SDL.h | 94 - mingw/include/SDL/SDL_active.h | 58 - mingw/include/SDL/SDL_audio.h | 253 - mingw/include/SDL/SDL_byteorder.h | 24 - mingw/include/SDL/SDL_cdrom.h | 171 - mingw/include/SDL/SDL_config.h | 306 - mingw/include/SDL/SDL_config_amiga.h | 80 - mingw/include/SDL/SDL_config_dreamcast.h | 106 - mingw/include/SDL/SDL_config_macos.h | 112 - mingw/include/SDL/SDL_config_macosx.h | 132 - mingw/include/SDL/SDL_config_minimal.h | 62 - mingw/include/SDL/SDL_config_os2.h | 141 - mingw/include/SDL/SDL_config_win32.h | 173 - mingw/include/SDL/SDL_copying.h | 22 - mingw/include/SDL/SDL_cpuinfo.h | 75 - mingw/include/SDL/SDL_endian.h | 192 - mingw/include/SDL/SDL_error.h | 61 - mingw/include/SDL/SDL_events.h | 337 - mingw/include/SDL/SDL_getenv.h | 24 - mingw/include/SDL/SDL_joystick.h | 167 - mingw/include/SDL/SDL_keyboard.h | 121 - mingw/include/SDL/SDL_keysym.h | 311 - mingw/include/SDL/SDL_loadso.h | 74 - mingw/include/SDL/SDL_main.h | 98 - mingw/include/SDL/SDL_mouse.h | 136 - mingw/include/SDL/SDL_mutex.h | 162 - mingw/include/SDL/SDL_name.h | 11 - mingw/include/SDL/SDL_opengl.h | 6551 ----- mingw/include/SDL/SDL_platform.h | 104 - mingw/include/SDL/SDL_quit.h | 50 - mingw/include/SDL/SDL_rwops.h | 139 - mingw/include/SDL/SDL_stdinc.h | 586 - mingw/include/SDL/SDL_syswm.h | 210 - mingw/include/SDL/SDL_thread.h | 119 - mingw/include/SDL/SDL_timer.h | 115 - mingw/include/SDL/SDL_types.h | 24 - mingw/include/SDL/SDL_version.h | 85 - mingw/include/SDL/SDL_video.h | 889 - mingw/include/SDL/begin_code.h | 150 - mingw/include/SDL/close_code.h | 41 - mingw/include/X11/X.h | 677 - mingw/include/X11/Xatom.h | 79 - mingw/include/X11/Xfuncproto.h | 60 - mingw/include/X11/Xlib.h | 1214 - mingw/include/X11/Xutil.h | 855 - mingw/include/X11/cursorfont.h | 79 - mingw/include/X11/keysym.h | 39 - mingw/include/X11/keysymdef.h | 1169 - mingw/include/accctrl.h | 329 - mingw/include/aclapi.h | 117 - mingw/include/aclui.h | 134 - mingw/include/adsprop.h | 59 - mingw/include/afxres.h | 23 - mingw/include/amaudio.h | 33 - mingw/include/amvideo.h | 179 - mingw/include/ansidecl.h | 371 - mingw/include/audevcod.h | 31 - mingw/include/aviriff.h | 87 - mingw/include/aygshell.h | 49 - mingw/include/bdatypes.h | 32 - mingw/include/bfd.h | 5080 ---- mingw/include/bfdlink.h | 715 - mingw/include/c++/3.4.2/algorithm | 71 - mingw/include/c++/3.4.2/backward/algo.h | 149 - mingw/include/c++/3.4.2/backward/algobase.h | 95 - mingw/include/c++/3.4.2/backward/alloc.h | 52 - .../include/c++/3.4.2/backward/backward_warning.h | 39 - mingw/include/c++/3.4.2/backward/bvector.h | 68 - mingw/include/c++/3.4.2/backward/complex.h | 43 - mingw/include/c++/3.4.2/backward/defalloc.h | 117 - mingw/include/c++/3.4.2/backward/deque.h | 70 - mingw/include/c++/3.4.2/backward/fstream.h | 52 - mingw/include/c++/3.4.2/backward/function.h | 130 - mingw/include/c++/3.4.2/backward/hash_map.h | 72 - mingw/include/c++/3.4.2/backward/hash_set.h | 69 - mingw/include/c++/3.4.2/backward/hashtable.h | 76 - mingw/include/c++/3.4.2/backward/heap.h | 71 - mingw/include/c++/3.4.2/backward/iomanip.h | 70 - mingw/include/c++/3.4.2/backward/iostream.h | 60 - mingw/include/c++/3.4.2/backward/istream.h | 43 - mingw/include/c++/3.4.2/backward/iterator.h | 191 - mingw/include/c++/3.4.2/backward/list.h | 70 - mingw/include/c++/3.4.2/backward/map.h | 69 - mingw/include/c++/3.4.2/backward/multimap.h | 69 - mingw/include/c++/3.4.2/backward/multiset.h | 69 - mingw/include/c++/3.4.2/backward/new.h | 42 - mingw/include/c++/3.4.2/backward/ostream.h | 38 - mingw/include/c++/3.4.2/backward/pair.h | 70 - mingw/include/c++/3.4.2/backward/queue.h | 41 - mingw/include/c++/3.4.2/backward/rope.h | 60 - mingw/include/c++/3.4.2/backward/set.h | 69 - mingw/include/c++/3.4.2/backward/slist.h | 56 - mingw/include/c++/3.4.2/backward/stack.h | 72 - mingw/include/c++/3.4.2/backward/stream.h | 38 - mingw/include/c++/3.4.2/backward/streambuf.h | 40 - mingw/include/c++/3.4.2/backward/strstream | 179 - mingw/include/c++/3.4.2/backward/tempbuf.h | 78 - mingw/include/c++/3.4.2/backward/tree.h | 55 - mingw/include/c++/3.4.2/backward/vector.h | 70 - mingw/include/c++/3.4.2/bits/allocator.h | 130 - mingw/include/c++/3.4.2/bits/atomicity.h | 46 - mingw/include/c++/3.4.2/bits/basic_ios.h | 467 - mingw/include/c++/3.4.2/bits/basic_ios.tcc | 200 - mingw/include/c++/3.4.2/bits/basic_string.h | 2344 -- mingw/include/c++/3.4.2/bits/basic_string.tcc | 968 - mingw/include/c++/3.4.2/bits/boost_concept_check.h | 933 - mingw/include/c++/3.4.2/bits/char_traits.h | 378 - mingw/include/c++/3.4.2/bits/cmath.tcc | 54 - mingw/include/c++/3.4.2/bits/codecvt.h | 478 - mingw/include/c++/3.4.2/bits/concept_check.h | 85 - mingw/include/c++/3.4.2/bits/concurrence.h | 95 - mingw/include/c++/3.4.2/bits/cpp_type_traits.h | 345 - mingw/include/c++/3.4.2/bits/deque.tcc | 719 - mingw/include/c++/3.4.2/bits/fstream.tcc | 879 - mingw/include/c++/3.4.2/bits/functexcept.h | 85 - mingw/include/c++/3.4.2/bits/gslice.h | 165 - mingw/include/c++/3.4.2/bits/gslice_array.h | 220 - mingw/include/c++/3.4.2/bits/indirect_array.h | 212 - mingw/include/c++/3.4.2/bits/ios_base.h | 926 - mingw/include/c++/3.4.2/bits/istream.tcc | 1192 - mingw/include/c++/3.4.2/bits/list.tcc | 377 - mingw/include/c++/3.4.2/bits/locale_classes.h | 599 - mingw/include/c++/3.4.2/bits/locale_facets.h | 4562 ---- mingw/include/c++/3.4.2/bits/locale_facets.tcc | 2793 -- mingw/include/c++/3.4.2/bits/localefwd.h | 192 - mingw/include/c++/3.4.2/bits/mask_array.h | 209 - mingw/include/c++/3.4.2/bits/ostream.tcc | 699 - mingw/include/c++/3.4.2/bits/postypes.h | 215 - mingw/include/c++/3.4.2/bits/slice_array.h | 273 - mingw/include/c++/3.4.2/bits/sstream.tcc | 225 - mingw/include/c++/3.4.2/bits/stl_algo.h | 5153 ---- mingw/include/c++/3.4.2/bits/stl_algobase.h | 841 - mingw/include/c++/3.4.2/bits/stl_bvector.h | 876 - mingw/include/c++/3.4.2/bits/stl_construct.h | 157 - mingw/include/c++/3.4.2/bits/stl_deque.h | 1501 - mingw/include/c++/3.4.2/bits/stl_function.h | 898 - mingw/include/c++/3.4.2/bits/stl_heap.h | 467 - mingw/include/c++/3.4.2/bits/stl_iterator.h | 772 - .../c++/3.4.2/bits/stl_iterator_base_funcs.h | 179 - .../c++/3.4.2/bits/stl_iterator_base_types.h | 170 - mingw/include/c++/3.4.2/bits/stl_list.h | 1253 - mingw/include/c++/3.4.2/bits/stl_map.h | 694 - mingw/include/c++/3.4.2/bits/stl_multimap.h | 677 - mingw/include/c++/3.4.2/bits/stl_multiset.h | 585 - mingw/include/c++/3.4.2/bits/stl_numeric.h | 326 - mingw/include/c++/3.4.2/bits/stl_pair.h | 147 - mingw/include/c++/3.4.2/bits/stl_queue.h | 472 - .../include/c++/3.4.2/bits/stl_raw_storage_iter.h | 113 - mingw/include/c++/3.4.2/bits/stl_relops.h | 137 - mingw/include/c++/3.4.2/bits/stl_set.h | 593 - mingw/include/c++/3.4.2/bits/stl_stack.h | 272 - mingw/include/c++/3.4.2/bits/stl_tempbuf.h | 171 - mingw/include/c++/3.4.2/bits/stl_threads.h | 150 - mingw/include/c++/3.4.2/bits/stl_tree.h | 1281 - mingw/include/c++/3.4.2/bits/stl_uninitialized.h | 297 - mingw/include/c++/3.4.2/bits/stl_vector.h | 932 - mingw/include/c++/3.4.2/bits/stream_iterator.h | 214 - mingw/include/c++/3.4.2/bits/streambuf.tcc | 163 - mingw/include/c++/3.4.2/bits/streambuf_iterator.h | 258 - mingw/include/c++/3.4.2/bits/stringfwd.h | 69 - mingw/include/c++/3.4.2/bits/type_traits.h | 405 - mingw/include/c++/3.4.2/bits/valarray_after.h | 499 - mingw/include/c++/3.4.2/bits/valarray_array.h | 625 - mingw/include/c++/3.4.2/bits/valarray_array.tcc | 240 - mingw/include/c++/3.4.2/bits/valarray_before.h | 701 - mingw/include/c++/3.4.2/bits/vector.tcc | 414 - mingw/include/c++/3.4.2/bitset | 1229 - mingw/include/c++/3.4.2/cassert | 48 - mingw/include/c++/3.4.2/cctype | 83 - mingw/include/c++/3.4.2/cerrno | 55 - mingw/include/c++/3.4.2/cfloat | 50 - mingw/include/c++/3.4.2/ciso646 | 37 - mingw/include/c++/3.4.2/climits | 51 - mingw/include/c++/3.4.2/clocale | 62 - mingw/include/c++/3.4.2/cmath | 595 - mingw/include/c++/3.4.2/complex | 1232 - mingw/include/c++/3.4.2/csetjmp | 65 - mingw/include/c++/3.4.2/csignal | 61 - mingw/include/c++/3.4.2/cstdarg | 60 - mingw/include/c++/3.4.2/cstddef | 56 - mingw/include/c++/3.4.2/cstdio | 185 - mingw/include/c++/3.4.2/cstdlib | 204 - mingw/include/c++/3.4.2/cstring | 128 - mingw/include/c++/3.4.2/ctime | 81 - mingw/include/c++/3.4.2/cwchar | 273 - mingw/include/c++/3.4.2/cwctype | 110 - mingw/include/c++/3.4.2/cxxabi.h | 528 - mingw/include/c++/3.4.2/debug/bitset | 299 - mingw/include/c++/3.4.2/debug/debug.h | 531 - mingw/include/c++/3.4.2/debug/deque | 386 - mingw/include/c++/3.4.2/debug/formatter.h | 391 - mingw/include/c++/3.4.2/debug/hash_map | 38 - mingw/include/c++/3.4.2/debug/hash_map.h | 270 - mingw/include/c++/3.4.2/debug/hash_multimap.h | 261 - mingw/include/c++/3.4.2/debug/hash_multiset.h | 236 - mingw/include/c++/3.4.2/debug/hash_set | 38 - mingw/include/c++/3.4.2/debug/hash_set.h | 245 - mingw/include/c++/3.4.2/debug/list | 505 - mingw/include/c++/3.4.2/debug/map | 38 - mingw/include/c++/3.4.2/debug/map.h | 323 - mingw/include/c++/3.4.2/debug/multimap.h | 314 - mingw/include/c++/3.4.2/debug/multiset.h | 320 - mingw/include/c++/3.4.2/debug/safe_base.h | 207 - mingw/include/c++/3.4.2/debug/safe_iterator.h | 618 - mingw/include/c++/3.4.2/debug/safe_iterator.tcc | 140 - mingw/include/c++/3.4.2/debug/safe_sequence.h | 180 - mingw/include/c++/3.4.2/debug/set | 38 - mingw/include/c++/3.4.2/debug/set.h | 325 - mingw/include/c++/3.4.2/debug/string | 1001 - mingw/include/c++/3.4.2/debug/vector | 412 - mingw/include/c++/3.4.2/deque | 81 - mingw/include/c++/3.4.2/exception | 120 - mingw/include/c++/3.4.2/exception_defines.h | 47 - mingw/include/c++/3.4.2/ext/algorithm | 518 - mingw/include/c++/3.4.2/ext/bitmap_allocator.h | 859 - mingw/include/c++/3.4.2/ext/debug_allocator.h | 121 - mingw/include/c++/3.4.2/ext/demangle.h | 2789 -- mingw/include/c++/3.4.2/ext/enc_filebuf.h | 68 - mingw/include/c++/3.4.2/ext/functional | 395 - mingw/include/c++/3.4.2/ext/hash_fun.h | 122 - mingw/include/c++/3.4.2/ext/hash_map | 447 - mingw/include/c++/3.4.2/ext/hash_set | 439 - mingw/include/c++/3.4.2/ext/hashtable.h | 994 - mingw/include/c++/3.4.2/ext/iterator | 113 - mingw/include/c++/3.4.2/ext/malloc_allocator.h | 118 - mingw/include/c++/3.4.2/ext/memory | 171 - mingw/include/c++/3.4.2/ext/mt_allocator.h | 718 - mingw/include/c++/3.4.2/ext/new_allocator.h | 113 - mingw/include/c++/3.4.2/ext/numeric | 148 - mingw/include/c++/3.4.2/ext/pod_char_traits.h | 158 - mingw/include/c++/3.4.2/ext/pool_allocator.h | 254 - mingw/include/c++/3.4.2/ext/rb_tree | 97 - mingw/include/c++/3.4.2/ext/rope | 2494 -- mingw/include/c++/3.4.2/ext/ropeimpl.h | 1539 -- mingw/include/c++/3.4.2/ext/slist | 906 - mingw/include/c++/3.4.2/ext/stdio_filebuf.h | 162 - mingw/include/c++/3.4.2/ext/stdio_sync_filebuf.h | 281 - mingw/include/c++/3.4.2/fstream | 843 - mingw/include/c++/3.4.2/functional | 58 - mingw/include/c++/3.4.2/iomanip | 300 - mingw/include/c++/3.4.2/ios | 53 - mingw/include/c++/3.4.2/iosfwd | 168 - mingw/include/c++/3.4.2/iostream | 80 - mingw/include/c++/3.4.2/istream | 774 - mingw/include/c++/3.4.2/iterator | 76 - mingw/include/c++/3.4.2/limits | 1143 - mingw/include/c++/3.4.2/list | 82 - mingw/include/c++/3.4.2/locale | 49 - mingw/include/c++/3.4.2/map | 74 - mingw/include/c++/3.4.2/memory | 373 - mingw/include/c++/3.4.2/mingw32/bits/atomic_word.h | 35 - mingw/include/c++/3.4.2/mingw32/bits/basic_file.h | 110 - .../include/c++/3.4.2/mingw32/bits/c++allocator.h | 37 - mingw/include/c++/3.4.2/mingw32/bits/c++config.h | 1294 - mingw/include/c++/3.4.2/mingw32/bits/c++io.h | 85 - mingw/include/c++/3.4.2/mingw32/bits/c++locale.h | 78 - .../3.4.2/mingw32/bits/codecvt_specializations.h | 38 - mingw/include/c++/3.4.2/mingw32/bits/ctype_base.h | 58 - .../include/c++/3.4.2/mingw32/bits/ctype_inline.h | 71 - .../c++/3.4.2/mingw32/bits/ctype_noninline.h | 99 - .../include/c++/3.4.2/mingw32/bits/gthr-default.h | 621 - mingw/include/c++/3.4.2/mingw32/bits/gthr-posix.h | 517 - mingw/include/c++/3.4.2/mingw32/bits/gthr-single.h | 239 - mingw/include/c++/3.4.2/mingw32/bits/gthr.h | 103 - .../c++/3.4.2/mingw32/bits/messages_members.h | 84 - mingw/include/c++/3.4.2/mingw32/bits/os_defines.h | 55 - .../include/c++/3.4.2/mingw32/bits/time_members.h | 71 - mingw/include/c++/3.4.2/new | 101 - mingw/include/c++/3.4.2/numeric | 72 - mingw/include/c++/3.4.2/ostream | 548 - mingw/include/c++/3.4.2/queue | 78 - mingw/include/c++/3.4.2/set | 74 - mingw/include/c++/3.4.2/sstream | 645 - mingw/include/c++/3.4.2/stack | 73 - mingw/include/c++/3.4.2/stdexcept | 148 - mingw/include/c++/3.4.2/streambuf | 784 - mingw/include/c++/3.4.2/string | 60 - mingw/include/c++/3.4.2/typeinfo | 156 - mingw/include/c++/3.4.2/utility | 70 - mingw/include/c++/3.4.2/valarray | 1017 - mingw/include/c++/3.4.2/vector | 83 - mingw/include/cmnquery.h | 81 - mingw/include/comcat.h | 175 - mingw/include/commctrl.h | 3742 --- mingw/include/complex.h | 205 - mingw/include/conio.h | 53 - mingw/include/control.h | 18 - mingw/include/cpl.h | 61 - mingw/include/cplext.h | 12 - mingw/include/custcntl.h | 102 - mingw/include/d3d9.h | 1288 - mingw/include/d3d9caps.h | 338 - mingw/include/d3d9types.h | 1272 - mingw/include/dbt.h | 154 - mingw/include/ddk/atm.h | 507 - mingw/include/ddk/batclass.h | 298 - mingw/include/ddk/cfg.h | 139 - mingw/include/ddk/cfgmgr32.h | 1533 -- mingw/include/ddk/d4drvif.h | 104 - mingw/include/ddk/d4iface.h | 84 - mingw/include/ddk/ddkmapi.h | 334 - mingw/include/ddk/hidclass.h | 153 - mingw/include/ddk/hidpi.h | 604 - mingw/include/ddk/hidsdi.h | 73 - mingw/include/ddk/hidusage.h | 210 - mingw/include/ddk/kbdmou.h | 91 - mingw/include/ddk/mcd.h | 143 - mingw/include/ddk/miniport.h | 77 - mingw/include/ddk/minitape.h | 223 - mingw/include/ddk/mountdev.h | 79 - mingw/include/ddk/mountmgr.h | 139 - mingw/include/ddk/ndis.h | 5227 ---- mingw/include/ddk/ndisguid.h | 439 - mingw/include/ddk/ndistapi.h | 1308 - mingw/include/ddk/ndiswan.h | 251 - mingw/include/ddk/netevent.h | 42 - mingw/include/ddk/netpnp.h | 69 - mingw/include/ddk/newdev.h | 66 - mingw/include/ddk/ntapi.h | 2906 -- mingw/include/ddk/ntdd8042.h | 213 - mingw/include/ddk/ntddbeep.h | 54 - mingw/include/ddk/ntddcdrm.h | 347 - mingw/include/ddk/ntddcdvd.h | 213 - mingw/include/ddk/ntddchgr.h | 353 - mingw/include/ddk/ntdddisk.h | 521 - mingw/include/ddk/ntddk.h | 91 - mingw/include/ddk/ntddkbd.h | 135 - mingw/include/ddk/ntddmou.h | 115 - mingw/include/ddk/ntddndis.h | 188 - mingw/include/ddk/ntddpar.h | 119 - mingw/include/ddk/ntddpcm.h | 165 - mingw/include/ddk/ntddscsi.h | 171 - mingw/include/ddk/ntddser.h | 449 - mingw/include/ddk/ntddstor.h | 333 - mingw/include/ddk/ntddtape.h | 79 - mingw/include/ddk/ntddtdi.h | 61 - mingw/include/ddk/ntddvdeo.h | 440 - mingw/include/ddk/ntddvol.h | 141 - mingw/include/ddk/ntifs.h | 4725 ---- mingw/include/ddk/ntpoapi.h | 229 - mingw/include/ddk/ntstatus.h | 1105 - mingw/include/ddk/parallel.h | 277 - mingw/include/ddk/pfhook.h | 76 - mingw/include/ddk/poclass.h | 118 - mingw/include/ddk/scsi.h | 1694 -- mingw/include/ddk/scsiscan.h | 130 - mingw/include/ddk/scsiwmi.h | 215 - mingw/include/ddk/smbus.h | 190 - mingw/include/ddk/srb.h | 753 - mingw/include/ddk/storport.h | 422 - mingw/include/ddk/tdi.h | 593 - mingw/include/ddk/tdiinfo.h | 110 - mingw/include/ddk/tdikrnl.h | 1162 - mingw/include/ddk/tdistat.h | 83 - mingw/include/ddk/tvout.h | 116 - mingw/include/ddk/upssvc.h | 94 - mingw/include/ddk/usb.h | 471 - mingw/include/ddk/usb100.h | 237 - mingw/include/ddk/usbcamdi.h | 404 - mingw/include/ddk/usbdi.h | 407 - mingw/include/ddk/usbioctl.h | 353 - mingw/include/ddk/usbiodef.h | 106 - mingw/include/ddk/usbscan.h | 158 - mingw/include/ddk/usbuser.h | 328 - mingw/include/ddk/video.h | 1566 -- mingw/include/ddk/videoagp.h | 129 - mingw/include/ddk/win2k.h | 106 - mingw/include/ddk/winddi.h | 4258 --- mingw/include/ddk/winddk.h | 9249 ------- mingw/include/ddk/winnt4.h | 623 - mingw/include/ddk/winxp.h | 38 - mingw/include/ddk/ws2san.h | 248 - mingw/include/ddk/xfilter.h | 239 - mingw/include/devguid.h | 65 - mingw/include/dhcpcsdk.h | 42 - mingw/include/dir.h | 26 - mingw/include/direct.h | 73 - mingw/include/dis-asm.h | 338 - mingw/include/docobj.h | 147 - mingw/include/dos.h | 89 - mingw/include/dsadmin.h | 38 - mingw/include/dsclient.h | 186 - mingw/include/dsgetdc.h | 98 - mingw/include/dshow.h | 108 - mingw/include/dsquery.h | 72 - mingw/include/dsrole.h | 75 - mingw/include/dvdevcod.h | 76 - mingw/include/dvdmedia.h | 101 - mingw/include/dxerr8.h | 53 - mingw/include/dxerr9.h | 53 - mingw/include/edevdefs.h | 346 - mingw/include/errorrep.h | 40 - mingw/include/errors.h | 169 - mingw/include/evcode.h | 68 - mingw/include/excpt.h | 102 - mingw/include/exdisp.h | 257 - mingw/include/exdispid.h | 14 - mingw/include/fenv.h | 105 - mingw/include/float.h | 152 - mingw/include/fltdefs.h | 50 - mingw/include/gmon.h | 181 - mingw/include/httpext.h | 98 - mingw/include/icm.h | 399 - mingw/include/idispids.h | 10 - mingw/include/il21dec.h | 35 - mingw/include/imagehlp.h | 329 - mingw/include/initguid.h | 12 - mingw/include/intshcut.h | 82 - mingw/include/inttypes.h | 278 - mingw/include/ipexport.h | 88 - mingw/include/iphlpapi.h | 74 - mingw/include/ipifcons.h | 199 - mingw/include/ipinfoid.h | 43 - mingw/include/iprtrmib.h | 209 - mingw/include/iptypes.h | 229 - mingw/include/ipxconst.h | 36 - mingw/include/ipxrtdef.h | 58 - mingw/include/ipxtfflt.h | 38 - mingw/include/isguids.h | 15 - mingw/include/ks.h | 20 - mingw/include/ksmedia.h | 23 - mingw/include/largeint.h | 112 - mingw/include/libgen.h | 31 - mingw/include/lm.h | 27 - mingw/include/lmaccess.h | 610 - mingw/include/lmalert.h | 60 - mingw/include/lmapibuf.h | 18 - mingw/include/lmat.h | 39 - mingw/include/lmaudit.h | 250 - mingw/include/lmbrowsr.h | 74 - mingw/include/lmchdev.h | 61 - mingw/include/lmconfig.h | 21 - mingw/include/lmcons.h | 75 - mingw/include/lmerr.h | 306 - mingw/include/lmerrlog.h | 211 - mingw/include/lmmsg.h | 27 - mingw/include/lmremutl.h | 45 - mingw/include/lmrepl.h | 94 - mingw/include/lmserver.h | 606 - mingw/include/lmshare.h | 147 - mingw/include/lmsname.h | 58 - mingw/include/lmstats.h | 114 - mingw/include/lmsvc.h | 134 - mingw/include/lmuse.h | 60 - mingw/include/lmuseflg.h | 10 - mingw/include/lmwksta.h | 233 - mingw/include/locale.h | 88 - mingw/include/malloc.h | 98 - mingw/include/mapi.h | 163 - mingw/include/math.h | 848 - mingw/include/mbctype.h | 97 - mingw/include/mbstring.h | 132 - mingw/include/mciavi.h | 25 - mingw/include/mcx.h | 77 - mingw/include/mem.h | 6 - mingw/include/memory.h | 7 - mingw/include/mgm.h | 75 - mingw/include/mgmtapi.h | 58 - mingw/include/mlang.h | 349 - mingw/include/mmreg.h | 71 - mingw/include/mpegtype.h | 29 - mingw/include/mprapi.h | 572 - mingw/include/mq.h | 534 - mingw/include/msacm.h | 186 - mingw/include/mshtml.h | 704 - mingw/include/mswsock.h | 113 - mingw/include/nddeapi.h | 133 - mingw/include/nspapi.h | 126 - mingw/include/ntdef.h | 60 - mingw/include/ntdll.h | 15 - mingw/include/ntdsapi.h | 115 - mingw/include/ntdsbcli.h | 45 - mingw/include/ntldap.h | 60 - mingw/include/ntsecapi.h | 612 - mingw/include/ntsecpkg.h | 44 - mingw/include/objsafe.h | 26 - mingw/include/objsel.h | 118 - mingw/include/ocidl.h | 837 - mingw/include/odbcinst.h | 148 - mingw/include/ole.h | 308 - mingw/include/ole2ver.h | 8 - mingw/include/oleacc.h | 219 - mingw/include/olectl.h | 323 - mingw/include/oledlg.h | 935 - mingw/include/pbt.h | 20 - mingw/include/powrprof.h | 120 - mingw/include/profil.h | 51 - mingw/include/profile.h | 83 - mingw/include/prsht.h | 304 - mingw/include/psapi.h | 95 - mingw/include/pshpack1.h | 3 - mingw/include/pshpack8.h | 3 - mingw/include/qedit.h | 70 - mingw/include/rapi.h | 54 - mingw/include/ras.h | 964 - mingw/include/rasdlg.h | 152 - mingw/include/raserror.h | 210 - mingw/include/rassapi.h | 182 - mingw/include/reason.h | 47 - mingw/include/regstr.h | 769 - mingw/include/richedit.h | 523 - mingw/include/richole.h | 107 - mingw/include/routprot.h | 70 - mingw/include/rpcdce2.h | 56 - mingw/include/rpcproxy.h | 204 - mingw/include/rtutils.h | 90 - mingw/include/schannel.h | 90 - mingw/include/schnlsp.h | 14 - mingw/include/scrnsave.h | 81 - mingw/include/sddl.h | 30 - mingw/include/search.h | 64 - mingw/include/secext.h | 52 - mingw/include/security.h | 42 - mingw/include/servprov.h | 33 - mingw/include/setjmp.h | 56 - mingw/include/setupapi.h | 1590 -- mingw/include/share.h | 33 - mingw/include/shldisp.h | 61 - mingw/include/shlguid.h | 102 - mingw/include/shlobj.h | 1533 -- mingw/include/shlwapi.h | 712 - mingw/include/snmp.h | 259 - mingw/include/sql.h | 408 - mingw/include/sqlext.h | 1218 - mingw/include/sqltypes.h | 165 - mingw/include/sqlucode.h | 142 - mingw/include/sspi.h | 338 - mingw/include/stm.h | 25 - mingw/include/strmif.h | 1159 - mingw/include/subauth.h | 209 - mingw/include/svcguid.h | 33 - mingw/include/symcat.h | 49 - mingw/include/sys/fcntl.h | 7 - mingw/include/sys/file.h | 7 - mingw/include/sys/locking.h | 31 - mingw/include/sys/timeb.h | 74 - mingw/include/sys/unistd.h | 6 - mingw/include/tchar.h | 418 - mingw/include/tcl.h | 2366 -- mingw/include/tclDecls.h | 4394 --- mingw/include/tclPlatDecls.h | 197 - mingw/include/tk.h | 1603 -- mingw/include/tkDecls.h | 2275 -- mingw/include/tkIntXlibDecls.h | 2439 -- mingw/include/tkPlatDecls.h | 300 - mingw/include/tlhelp32.h | 140 - mingw/include/tmschema.h | 664 - mingw/include/userenv.h | 57 - mingw/include/usp10.h | 229 - mingw/include/uxtheme.h | 273 - mingw/include/values.h | 4 - mingw/include/varargs.h | 7 - mingw/include/vfw.h | 1144 - mingw/include/vidcap.h | 23 - mingw/include/vmr9.h | 211 - mingw/include/vptype.h | 55 - mingw/include/w32api.h | 52 - mingw/include/wchar.h | 474 - mingw/include/wctype.h | 164 - mingw/include/winable.h | 99 - mingw/include/winber.h | 67 - mingw/include/wincrypt.h | 906 - mingw/include/windns.h | 405 - mingw/include/windowsx.h | 544 - mingw/include/wininet.h | 986 - mingw/include/winioctl.h | 554 - mingw/include/winldap.h | 713 - mingw/include/winresrc.h | 14 - mingw/include/winsnmp.h | 329 - mingw/include/winsock.h | 536 - mingw/include/ws2spi.h | 202 - mingw/include/ws2tcpip.h | 379 - mingw/include/wsahelp.h | 98 - mingw/include/wsipx.h | 28 - mingw/include/wsnetbs.h | 35 - mingw/include/wtsapi32.h | 60 - mingw/include/xprtdefs.h | 11 - mingw/include/zmouse.h | 36 - mingw/info/as.info | 486 - mingw/info/as.info-1 | 17710 ------------ mingw/info/bfd.info | 88 - mingw/info/bfd.info-1 | 10101 ------- mingw/info/binutils.info | 68 - mingw/info/binutils.info-1 | 3778 --- mingw/info/configure.info | 93 - mingw/info/configure.info-1 | 2683 -- mingw/info/cpp.info | 5127 ---- mingw/info/cppinternals.info | 1034 - mingw/info/dir | 51 - mingw/info/gcc.info | 27125 ------------------- mingw/info/gccinstall.info | 3779 --- mingw/info/gccint.info | 26989 ------------------ mingw/info/gdb/A-code-overlay.html | 1 - mingw/info/gdb/A29K.html | 40 - mingw/info/gdb/ARM.html | 33 - mingw/info/gdb/Active-Targets.html | 47 - mingw/info/gdb/Alpha.html | 24 - mingw/info/gdb/Altering.html | 41 - mingw/info/gdb/Analyze-Collected-Data.html | 44 - mingw/info/gdb/Annotations-Overview.html | 65 - mingw/info/gdb/Annotations-for-Running.html | 74 - mingw/info/gdb/Annotations.html | 43 - mingw/info/gdb/Architectures.html | 30 - mingw/info/gdb/Arguments.html | 50 - mingw/info/gdb/Arrays.html | 82 - mingw/info/gdb/Assignment.html | 106 - mingw/info/gdb/Attach.html | 70 - mingw/info/gdb/Auto-Display.html | 105 - mingw/info/gdb/Automatic-Overlay-Debugging.html | 77 - mingw/info/gdb/Automatically.html | 37 - mingw/info/gdb/Backtrace.html | 70 - mingw/info/gdb/Bindable-Readline-Commands.html | 42 - mingw/info/gdb/Bootstrapping.html | 100 - mingw/info/gdb/Break-Commands.html | 94 - mingw/info/gdb/Breakpoint-Info.html | 67 - mingw/info/gdb/Breakpoint-Menus.html | 59 - mingw/info/gdb/Breakpoints.html | 77 - mingw/info/gdb/Bug-Criteria.html | 40 - mingw/info/gdb/Bug-Reporting.html | 175 - mingw/info/gdb/Built-In-Func-Proc.html | 130 - mingw/info/gdb/Byte-Order.html | 49 - mingw/info/gdb/C-Checks.html | 39 - mingw/info/gdb/C-Constants.html | 79 - mingw/info/gdb/C-Defaults.html | 34 - mingw/info/gdb/C-Operators.html | 170 - mingw/info/gdb/C-plus-plus-expressions.html | 97 - mingw/info/gdb/C.html | 46 - mingw/info/gdb/Calling.html | 33 - mingw/info/gdb/Checks.html | 49 - mingw/info/gdb/Chill-defaults.html | 30 - mingw/info/gdb/Chill-type-and-range-checks.html | 40 - mingw/info/gdb/Chill.html | 38 - mingw/info/gdb/Command-Files.html | 106 - mingw/info/gdb/Command-Line-Editing.html | 35 - mingw/info/gdb/Command-Syntax.html | 60 - mingw/info/gdb/Commands-For-Completion.html | 58 - mingw/info/gdb/Commands-For-History.html | 90 - mingw/info/gdb/Commands-For-Killing.html | 79 - mingw/info/gdb/Commands-For-Moving.html | 51 - mingw/info/gdb/Commands-For-Text.html | 74 - mingw/info/gdb/Commands.html | 34 - mingw/info/gdb/Compilation.html | 56 - mingw/info/gdb/Completion.html | 119 - mingw/info/gdb/Conditional-Init-Constructs.html | 83 - mingw/info/gdb/Conditions.html | 123 - mingw/info/gdb/Config-Names.html | 58 - mingw/info/gdb/Configurations.html | 39 - mingw/info/gdb/Configure-Options.html | 82 - mingw/info/gdb/Continuing-and-Stepping.html | 200 - mingw/info/gdb/Contributors.html | 160 - mingw/info/gdb/Controlling-GDB.html | 37 - mingw/info/gdb/Convenience-Vars.html | 96 - mingw/info/gdb/Copying.html | 372 - mingw/info/gdb/Create-and-Delete-Tracepoints.html | 65 - mingw/info/gdb/Cygwin-Native.html | 88 - mingw/info/gdb/DJGPP-Native.html | 137 - mingw/info/gdb/Data.html | 65 - mingw/info/gdb/Debug-Session.html | 112 - mingw/info/gdb/Debugging-C-plus-plus.html | 90 - mingw/info/gdb/Debugging-C.html | 34 - mingw/info/gdb/Debugging-Output.html | 72 - mingw/info/gdb/Define.html | 99 - mingw/info/gdb/Delete-Breaks.html | 58 - mingw/info/gdb/Deviations.html | 44 - mingw/info/gdb/Disabling.html | 77 - mingw/info/gdb/Displays.html | 48 - mingw/info/gdb/Editing.html | 44 - mingw/info/gdb/Emacs.html | 172 - mingw/info/gdb/Embedded-OS.html | 33 - mingw/info/gdb/Embedded-Processors.html | 42 - mingw/info/gdb/Enable-and-Disable-Tracepoints.html | 35 - mingw/info/gdb/Environment.html | 91 - mingw/info/gdb/Error-in-Breakpoints.html | 59 - mingw/info/gdb/Errors.html | 50 - mingw/info/gdb/Event-Designators.html | 57 - mingw/info/gdb/Expressions.html | 64 - mingw/info/gdb/File-Options.html | 112 - mingw/info/gdb/Filenames.html | 58 - mingw/info/gdb/Files.html | 364 - mingw/info/gdb/Floating-Point-Hardware.html | 33 - mingw/info/gdb/Formatting-Documentation.html | 107 - mingw/info/gdb/Frame-Annotations.html | 129 - mingw/info/gdb/Frame-Info.html | 78 - mingw/info/gdb/Frames.html | 75 - mingw/info/gdb/Free-Software.html | 124 - mingw/info/gdb/GDB-Bugs.html | 37 - mingw/info/gdb/GDB-Files.html | 32 - mingw/info/gdb/GDB-M2.html | 38 - .../info/gdb/GDB-MI-Breakpoint-Table-Commands.html | 494 - .../gdb/GDB-MI-Command-Description-Format.html | 59 - mingw/info/gdb/GDB-MI-Command-Syntax.html | 27 - mingw/info/gdb/GDB-MI-Compatibility-with-CLI.html | 33 - mingw/info/gdb/GDB-MI-Data-Manipulation.html | 619 - mingw/info/gdb/GDB-MI-Input-Syntax.html | 80 - mingw/info/gdb/GDB-MI-Miscellaneous-Commands.html | 115 - mingw/info/gdb/GDB-MI-Out-of-band-Records.html | 32 - mingw/info/gdb/GDB-MI-Output-Records.html | 28 - mingw/info/gdb/GDB-MI-Output-Syntax.html | 142 - mingw/info/gdb/GDB-MI-Program-Control.html | 582 - mingw/info/gdb/GDB-MI-Result-Records.html | 38 - mingw/info/gdb/GDB-MI-Simple-Examples.html | 66 - mingw/info/gdb/GDB-MI-Stack-Manipulation.html | 290 - mingw/info/gdb/GDB-MI-Stream-Records.html | 45 - mingw/info/gdb/GDB-MI-Symbol-Query.html | 195 - mingw/info/gdb/GDB-MI-Target-Manipulation.html | 278 - mingw/info/gdb/GDB-MI-Thread-Commands.html | 121 - mingw/info/gdb/GDB-MI-Tracepoint-Commands.html | 24 - mingw/info/gdb/GDB-MI-Variable-Objects.html | 293 - mingw/info/gdb/GDB-MI.html | 75 - mingw/info/gdb/GNU-Free-Documentation-License.html | 372 - mingw/info/gdb/H8-300.html | 65 - mingw/info/gdb/H8-500.html | 33 - mingw/info/gdb/HP-UX.html | 25 - mingw/info/gdb/Help.html | 173 - mingw/info/gdb/History-Interaction.html | 47 - mingw/info/gdb/History.html | 96 - mingw/info/gdb/Hitachi-Boards.html | 121 - mingw/info/gdb/Hitachi-ICE.html | 38 - mingw/info/gdb/Hitachi-Special.html | 33 - mingw/info/gdb/Hooks.html | 86 - mingw/info/gdb/How-Overlays-Work.html | 135 - mingw/info/gdb/How-modes-are-displayed.html | 136 - mingw/info/gdb/Index.html | 1725 -- mingw/info/gdb/Input-Output.html | 63 - mingw/info/gdb/Installing-GDB.html | 124 - mingw/info/gdb/Introduction-and-Notation.html | 56 - mingw/info/gdb/Invalidation.html | 37 - mingw/info/gdb/Invocation.html | 35 - mingw/info/gdb/Invoking-GDB.html | 92 - mingw/info/gdb/Jumping.html | 65 - mingw/info/gdb/KOD.html | 50 - mingw/info/gdb/Keyboard-Macros.html | 37 - mingw/info/gdb/Kill-Process.html | 43 - mingw/info/gdb/Languages.html | 43 - mingw/info/gdb/List.html | 129 - mingw/info/gdb/Listing-Tracepoints.html | 50 - mingw/info/gdb/Locations.html | 68 - mingw/info/gdb/M2-Checks.html | 43 - mingw/info/gdb/M2-Constants.html | 59 - mingw/info/gdb/M2-Defaults.html | 31 - mingw/info/gdb/M2-Operators.html | 132 - mingw/info/gdb/M2-Scope.html | 47 - mingw/info/gdb/M32R-D.html | 29 - mingw/info/gdb/M68K.html | 63 - mingw/info/gdb/M88K.html | 29 - mingw/info/gdb/MIPS-Embedded.html | 134 - mingw/info/gdb/MIPS.html | 45 - mingw/info/gdb/Machine-Code.html | 94 - mingw/info/gdb/Maintenance-Commands.html | 61 - mingw/info/gdb/Manually.html | 48 - mingw/info/gdb/Memory-Region-Attributes.html | 125 - mingw/info/gdb/Memory.html | 118 - mingw/info/gdb/Messages-Warnings.html | 84 - mingw/info/gdb/Miscellaneous-Commands.html | 93 - mingw/info/gdb/Mode-Options.html | 173 - mingw/info/gdb/Modifiers.html | 61 - mingw/info/gdb/Modula-2.html | 40 - mingw/info/gdb/Native.html | 31 - mingw/info/gdb/NetWare.html | 71 - mingw/info/gdb/Nindy-Options.html | 61 - mingw/info/gdb/Nindy-Reset.html | 29 - mingw/info/gdb/Nindy-Startup.html | 34 - mingw/info/gdb/Numbers.html | 58 - mingw/info/gdb/Numeric-Arguments.html | 43 - mingw/info/gdb/Output-Formats.html | 94 - mingw/info/gdb/Output.html | 84 - mingw/info/gdb/Overlay-Commands.html | 125 - mingw/info/gdb/Overlay-Sample-Program.html | 66 - mingw/info/gdb/Overlays.html | 35 - mingw/info/gdb/PA.html | 32 - mingw/info/gdb/Patching.html | 47 - mingw/info/gdb/PowerPC.html | 36 - mingw/info/gdb/Print-Settings.html | 321 - mingw/info/gdb/Processes.html | 90 - mingw/info/gdb/Prompt.html | 40 - mingw/info/gdb/Prompting.html | 62 - mingw/info/gdb/Quitting-GDB.html | 42 - mingw/info/gdb/Range-Checking.html | 72 - mingw/info/gdb/Readline-Arguments.html | 37 - mingw/info/gdb/Readline-Bare-Essentials.html | 60 - mingw/info/gdb/Readline-Init-File-Syntax.html | 300 - mingw/info/gdb/Readline-Init-File.html | 47 - mingw/info/gdb/Readline-Interaction.html | 41 - mingw/info/gdb/Readline-Killing-Commands.html | 72 - mingw/info/gdb/Readline-Movement-Commands.html | 45 - mingw/info/gdb/Readline-vi-Mode.html | 38 - mingw/info/gdb/Registers.html | 118 - mingw/info/gdb/Remote-Debugging.html | 28 - mingw/info/gdb/Remote-Protocol.html | 766 - mingw/info/gdb/Remote.html | 38 - mingw/info/gdb/Returning.html | 46 - mingw/info/gdb/Running.html | 47 - mingw/info/gdb/SH.html | 38 - mingw/info/gdb/ST2000.html | 59 - mingw/info/gdb/SVR4-Process-Information.html | 40 - mingw/info/gdb/Sample-Init-File.html | 124 - mingw/info/gdb/Sample-Session.html | 246 - mingw/info/gdb/Screen-Size.html | 55 - mingw/info/gdb/Search.html | 41 - mingw/info/gdb/Searching.html | 56 - mingw/info/gdb/Selection.html | 91 - mingw/info/gdb/Separate-Objdir.html | 76 - mingw/info/gdb/Sequences.html | 33 - mingw/info/gdb/Server-Prefix.html | 32 - mingw/info/gdb/Server.html | 129 - mingw/info/gdb/Set-Breaks.html | 189 - mingw/info/gdb/Set-Catchpoints.html | 109 - mingw/info/gdb/Set-Tracepoints.html | 48 - mingw/info/gdb/Set-Watchpoints.html | 147 - mingw/info/gdb/Setting.html | 51 - mingw/info/gdb/Shell-Commands.html | 43 - mingw/info/gdb/Show.html | 56 - mingw/info/gdb/Signaling.html | 45 - mingw/info/gdb/Signals.html | 118 - mingw/info/gdb/Source-Annotations.html | 39 - mingw/info/gdb/Source-Path.html | 83 - mingw/info/gdb/Source.html | 40 - mingw/info/gdb/Sparclet-Connection.html | 35 - mingw/info/gdb/Sparclet-Download.html | 43 - mingw/info/gdb/Sparclet-Execution.html | 36 - mingw/info/gdb/Sparclet-File.html | 45 - mingw/info/gdb/Sparclet.html | 65 - mingw/info/gdb/Sparclite.html | 32 - mingw/info/gdb/Stack.html | 56 - .../Starting-and-Stopping-Trace-Experiment.html | 56 - mingw/info/gdb/Starting.html | 90 - mingw/info/gdb/Stopping.html | 47 - mingw/info/gdb/Stub-Contents.html | 63 - mingw/info/gdb/Summary.html | 61 - mingw/info/gdb/Support.html | 41 - mingw/info/gdb/Symbol-Errors.html | 104 - mingw/info/gdb/Symbols.html | 233 - mingw/info/gdb/TODO.html | 34 - mingw/info/gdb/TUI-Commands.html | 66 - mingw/info/gdb/TUI-Configuration.html | 75 - mingw/info/gdb/TUI-Keys.html | 86 - mingw/info/gdb/TUI-Overview.html | 78 - mingw/info/gdb/TUI.html | 36 - mingw/info/gdb/Target-Commands.html | 138 - mingw/info/gdb/Targets.html | 42 - mingw/info/gdb/Thread-Stops.html | 93 - mingw/info/gdb/Threads.html | 189 - mingw/info/gdb/Tracepoint-Actions.html | 104 - mingw/info/gdb/Tracepoint-Passcounts.html | 52 - mingw/info/gdb/Tracepoint-Variables.html | 55 - mingw/info/gdb/Tracepoints.html | 56 - mingw/info/gdb/Type-Checking.html | 83 - mingw/info/gdb/Using-History-Interactively.html | 29 - mingw/info/gdb/Value-Annotations.html | 120 - mingw/info/gdb/Value-History.html | 86 - mingw/info/gdb/Values-and-their-Operations.html | 166 - mingw/info/gdb/Variables.html | 118 - mingw/info/gdb/VxWorks-Attach.html | 31 - mingw/info/gdb/VxWorks-Connection.html | 46 - mingw/info/gdb/VxWorks-Download.html | 60 - mingw/info/gdb/VxWorks.html | 77 - mingw/info/gdb/Word-Designators.html | 83 - mingw/info/gdb/Working-Directory.html | 39 - mingw/info/gdb/Z8000.html | 62 - mingw/info/gdb/i960.html | 59 - mingw/info/gdb/maint-info-breakpoints.html | 1 - mingw/info/gdb/remote-stub.html | 102 - mingw/info/gdb/save-tracepoints.html | 26 - mingw/info/gdb/tdump.html | 73 - mingw/info/gdb/tfind.html | 130 - mingw/info/gdbint/Algorithms.html | 433 - mingw/info/gdbint/Coding.html | 542 - mingw/info/gdbint/Debugging-GDB.html | 134 - .../gdbint/GNU-Free-Documentation-License.html | 372 - mingw/info/gdbint/Getting-Started.html | 94 - mingw/info/gdbint/Hints.html | 30 - mingw/info/gdbint/Host-Definition.html | 285 - mingw/info/gdbint/Index.html | 716 - mingw/info/gdbint/Language-Support.html | 146 - mingw/info/gdbint/Native-Debugging.html | 298 - mingw/info/gdbint/Overall-Structure.html | 94 - mingw/info/gdbint/Porting-GDB.html | 115 - mingw/info/gdbint/Releasing-GDB.html | 421 - mingw/info/gdbint/Requirements.html | 54 - mingw/info/gdbint/Support-Libraries.html | 87 - mingw/info/gdbint/Symbol-Handling.html | 364 - .../gdbint/Target-Architecture-Definition.html | 1349 - mingw/info/gdbint/Target-Vector-Definition.html | 82 - mingw/info/gdbint/Testsuite.html | 158 - mingw/info/gdbint/User-Interface.html | 873 - mingw/info/gdbint/libgdb.html | 126 - mingw/info/gprof.info | 57 - mingw/info/gprof.info-1 | 2275 -- mingw/info/ld.info | 94 - mingw/info/ld.info-1 | 6311 ----- mingw/info/stabs/Alternate-Entry-Points.html | 31 - mingw/info/stabs/Arrays.html | 97 - mingw/info/stabs/Assembly-Code.html | 78 - mingw/info/stabs/Based-Variables.html | 56 - mingw/info/stabs/Basic-Cplusplus-Types.html | 58 - mingw/info/stabs/Block-Structure.html | 47 - mingw/info/stabs/Builtin-Type-Descriptors.html | 98 - mingw/info/stabs/Builtin-Types.html | 41 - mingw/info/stabs/C-Example.html | 36 - mingw/info/stabs/Class-Instance.html | 42 - mingw/info/stabs/Class-Names.html | 46 - mingw/info/stabs/Common-Blocks.html | 43 - mingw/info/stabs/Conformant-Arrays.html | 31 - mingw/info/stabs/Constants.html | 83 - mingw/info/stabs/Cplusplus.html | 36 - mingw/info/stabs/Cross-References.html | 59 - mingw/info/stabs/ELF-Linker-Relocation.html | 73 - mingw/info/stabs/Enumerations.html | 69 - mingw/info/stabs/Expanded-Reference.html | 55 - mingw/info/stabs/Flow.html | 47 - mingw/info/stabs/Function-Types.html | 59 - mingw/info/stabs/Global-Variables.html | 52 - mingw/info/stabs/Gould.html | 74 - mingw/info/stabs/Include-Files.html | 68 - mingw/info/stabs/Inheritance.html | 116 - mingw/info/stabs/Line-Numbers.html | 47 - mingw/info/stabs/Local-Variable-Parameters.html | 81 - mingw/info/stabs/Main-Program.html | 29 - mingw/info/stabs/Member-Type-Descriptor.html | 34 - mingw/info/stabs/Method-Modifiers.html | 55 - mingw/info/stabs/Method-Type-Descriptor.html | 42 - mingw/info/stabs/Methods.html | 78 - mingw/info/stabs/Miscellaneous-Types.html | 64 - mingw/info/stabs/N_BROWS.html | 41 - mingw/info/stabs/N_CATCH.html | 42 - mingw/info/stabs/N_DEFD.html | 41 - mingw/info/stabs/N_EHDECL.html | 40 - mingw/info/stabs/N_LENG.html | 36 - mingw/info/stabs/N_M2C.html | 46 - mingw/info/stabs/N_MOD2.html | 38 - mingw/info/stabs/N_NOMAP.html | 40 - mingw/info/stabs/N_NSYMS.html | 39 - mingw/info/stabs/N_PC.html | 45 - mingw/info/stabs/N_SCOPE.html | 37 - mingw/info/stabs/N_SSYM.html | 40 - mingw/info/stabs/Negative-Type-Numbers.html | 208 - mingw/info/stabs/Nested-Procedures.html | 55 - mingw/info/stabs/Nested-Symbols.html | 35 - mingw/info/stabs/Non-Stab-Symbol-Types.html | 90 - mingw/info/stabs/Overview.html | 47 - mingw/info/stabs/Parameters.html | 67 - mingw/info/stabs/Procedures.html | 123 - mingw/info/stabs/Program-Structure.html | 35 - mingw/info/stabs/Protections.html | 98 - mingw/info/stabs/Questions.html | 46 - mingw/info/stabs/Reference-Parameters.html | 30 - mingw/info/stabs/Register-Parameters.html | 63 - mingw/info/stabs/Register-Variables.html | 41 - mingw/info/stabs/Simple-Classes.html | 112 - mingw/info/stabs/Source-Files.html | 59 - mingw/info/stabs/Stab-Section-Basics.html | 92 - mingw/info/stabs/Stab-Section-Transformations.html | 57 - mingw/info/stabs/Stab-Sections.html | 30 - mingw/info/stabs/Stab-Symbol-Types.html | 163 - mingw/info/stabs/Stab-Types.html | 32 - mingw/info/stabs/Stabs-Format.html | 53 - mingw/info/stabs/Stack-Variables.html | 61 - mingw/info/stabs/Static-Members.html | 28 - mingw/info/stabs/Statics.html | 75 - mingw/info/stabs/String-Field.html | 127 - mingw/info/stabs/Strings.html | 47 - mingw/info/stabs/Structures.html | 78 - mingw/info/stabs/Subranges.html | 55 - mingw/info/stabs/Symbol-Descriptors.html | 127 - mingw/info/stabs/Symbol-Table-Format.html | 48 - mingw/info/stabs/Symbol-Tables.html | 28 - mingw/info/stabs/Symbol-Types-Index.html | 212 - mingw/info/stabs/Traditional-Builtin-Types.html | 30 - mingw/info/stabs/Traditional-Integer-Types.html | 68 - mingw/info/stabs/Traditional-Other-Types.html | 46 - .../stabs/Transformations-On-Global-Variables.html | 54 - .../stabs/Transformations-On-Static-Variables.html | 43 - .../stabs/Transformations-On-Symbol-Tables.html | 49 - mingw/info/stabs/Type-Descriptors.html | 153 - mingw/info/stabs/Typedefs.html | 48 - mingw/info/stabs/Types.html | 38 - mingw/info/stabs/Unions.html | 62 - mingw/info/stabs/Variables.html | 33 - mingw/info/stabs/Virtual-Base-Classes.html | 64 - mingw/info/stabs/Virtual-Methods.html | 102 - mingw/info/stabs/index.html | 12 - mingw/info/standards.info | 4896 ---- mingw/lib/CRT_fp10.o | Bin 368 -> 0 bytes mingw/lib/CRT_fp8.o | Bin 412 -> 0 bytes mingw/lib/CRT_noglob.o | Bin 317 -> 0 bytes mingw/lib/Img1.3/jpegtcl10.dll | Bin 140258 -> 0 bytes mingw/lib/Img1.3/libjpegtclstub10.a | Bin 866 -> 0 bytes mingw/lib/Img1.3/libpngtclstub1212.a | Bin 784 -> 0 bytes mingw/lib/Img1.3/libtifftclstub382.a | Bin 866 -> 0 bytes mingw/lib/Img1.3/libtkimgstub13.a | Bin 780 -> 0 bytes mingw/lib/Img1.3/libzlibtclstub123.a | Bin 866 -> 0 bytes mingw/lib/Img1.3/pkgIndex.tcl | 58 - mingw/lib/Img1.3/pngtcl1212.dll | Bin 153323 -> 0 bytes mingw/lib/Img1.3/tifftcl382.dll | Bin 325446 -> 0 bytes mingw/lib/Img1.3/tkimg13.dll | Bin 22302 -> 0 bytes mingw/lib/Img1.3/tkimgbmp13.dll | Bin 22768 -> 0 bytes mingw/lib/Img1.3/tkimggif13.dll | Bin 25866 -> 0 bytes mingw/lib/Img1.3/tkimgico13.dll | Bin 24303 -> 0 bytes mingw/lib/Img1.3/tkimgjpeg13.dll | Bin 23100 -> 0 bytes mingw/lib/Img1.3/tkimgpcx13.dll | Bin 23459 -> 0 bytes mingw/lib/Img1.3/tkimgpixmap13.dll | Bin 29223 -> 0 bytes mingw/lib/Img1.3/tkimgpng13.dll | Bin 20952 -> 0 bytes mingw/lib/Img1.3/tkimgppm13.dll | Bin 19349 -> 0 bytes mingw/lib/Img1.3/tkimgps13.dll | Bin 21698 -> 0 bytes mingw/lib/Img1.3/tkimgsgi13.dll | Bin 30982 -> 0 bytes mingw/lib/Img1.3/tkimgsun13.dll | Bin 26162 -> 0 bytes mingw/lib/Img1.3/tkimgtga13.dll | Bin 24316 -> 0 bytes mingw/lib/Img1.3/tkimgtiff13.dll | Bin 63014 -> 0 bytes mingw/lib/Img1.3/tkimgwindow13.dll | Bin 17632 -> 0 bytes mingw/lib/Img1.3/tkimgxbm13.dll | Bin 21099 -> 0 bytes mingw/lib/Img1.3/tkimgxpm13.dll | Bin 25766 -> 0 bytes mingw/lib/Img1.3/zlibtcl123.dll | Bin 83431 -> 0 bytes mingw/lib/binmode.o | Bin 322 -> 0 bytes mingw/lib/crt1.o | Bin 2164 -> 0 bytes mingw/lib/crtmt.o | Bin 322 -> 0 bytes mingw/lib/crtst.o | Bin 306 -> 0 bytes mingw/lib/dde1.2/pkgIndex.tcl | 7 - mingw/lib/dde1.2/tcldde12.dll | Bin 34524 -> 0 bytes mingw/lib/debug/libstdc++.a | Bin 7247024 -> 0 bytes mingw/lib/debug/libstdc++.la | 32 - mingw/lib/dllcrt1.o | Bin 1339 -> 0 bytes mingw/lib/dllcrt2.o | Bin 1339 -> 0 bytes mingw/lib/gcrt1.o | Bin 692 -> 0 bytes mingw/lib/gcrt2.o | Bin 692 -> 0 bytes mingw/lib/jpegtclConfig.sh | 57 - mingw/lib/libSDL.a | Bin 9657334 -> 0 bytes mingw/lib/libSDL.dll.a | Bin 122768 -> 0 bytes mingw/lib/libSDL.la | 35 - mingw/lib/libSDLmain.a | Bin 207288 -> 0 bytes mingw/lib/libaclui.a | Bin 3654 -> 0 bytes mingw/lib/libapcups.a | Bin 5832 -> 0 bytes mingw/lib/libavicap32.a | Bin 6114 -> 0 bytes mingw/lib/libavifil32.a | Bin 56844 -> 0 bytes mingw/lib/libbfd.a | Bin 609500 -> 0 bytes mingw/lib/libbfd.la | 32 - mingw/lib/libcap.a | Bin 4254 -> 0 bytes mingw/lib/libcfgmgr32.a | Bin 62924 -> 0 bytes mingw/lib/libcoldname.a | Bin 80600 -> 0 bytes mingw/lib/libcomctl32.a | Bin 98306 -> 0 bytes mingw/lib/libcomdlg32.a | Bin 19752 -> 0 bytes mingw/lib/libcrtdll.a | Bin 357874 -> 0 bytes mingw/lib/libcrypt32.a | Bin 27730 -> 0 bytes mingw/lib/libctl3d32.a | Bin 20062 -> 0 bytes mingw/lib/libcurl.la | 35 - mingw/lib/libd3d8.a | Bin 4718 -> 0 bytes mingw/lib/libd3d9.a | Bin 6350 -> 0 bytes mingw/lib/libd3dim.a | Bin 6758 -> 0 bytes mingw/lib/libd3drm.a | Bin 17462 -> 0 bytes mingw/lib/libd3dx8d.a | Bin 162892 -> 0 bytes mingw/lib/libd3dx9d.a | Bin 211092 -> 0 bytes mingw/lib/libd3dxof.a | Bin 2248 -> 0 bytes mingw/lib/libddraw.a | Bin 11334 -> 0 bytes mingw/lib/libdhcpcsvc.a | Bin 6166 -> 0 bytes mingw/lib/libdinput.a | Bin 18086 -> 0 bytes mingw/lib/libdinput8.a | Bin 16568 -> 0 bytes mingw/lib/libdlcapi.a | Bin 3636 -> 0 bytes mingw/lib/libdmoguids.a | Bin 2342 -> 0 bytes mingw/lib/libdnsapi.a | Bin 22992 -> 0 bytes mingw/lib/libdplayx.a | Bin 6096 -> 0 bytes mingw/lib/libdpnaddr.a | Bin 2294 -> 0 bytes mingw/lib/libdpnet.a | Bin 2246 -> 0 bytes mingw/lib/libdpnlobby.a | Bin 2296 -> 0 bytes mingw/lib/libdpvoice.a | Bin 2278 -> 0 bytes mingw/lib/libdsetup.a | Bin 15412 -> 0 bytes mingw/lib/libdsound.a | Bin 9260 -> 0 bytes mingw/lib/libdxapi.a | Bin 1496 -> 0 bytes mingw/lib/libdxerr8.a | Bin 160972 -> 0 bytes mingw/lib/libdxerr9.a | Bin 194628 -> 0 bytes mingw/lib/libdxguid.a | Bin 50754 -> 0 bytes mingw/lib/libexpat.dll.a | Bin 53002 -> 0 bytes mingw/lib/libexpat.la | 35 - mingw/lib/libfaultrep.a | Bin 3816 -> 0 bytes mingw/lib/libgdi32.a | Bin 254652 -> 0 bytes mingw/lib/libglaux.a | Bin 126282 -> 0 bytes mingw/lib/libglu32.a | Bin 39872 -> 0 bytes mingw/lib/libglut.a | Bin 86446 -> 0 bytes mingw/lib/libglut32.a | Bin 86684 -> 0 bytes mingw/lib/libgmon.a | Bin 5448 -> 0 bytes mingw/lib/libhal.a | Bin 34142 -> 0 bytes mingw/lib/libhid.a | Bin 35186 -> 0 bytes mingw/lib/libhidparse.a | Bin 20282 -> 0 bytes mingw/lib/libiberty.a | Bin 190768 -> 0 bytes mingw/lib/libicmui.a | Bin 3012 -> 0 bytes mingw/lib/libigmpagnt.a | Bin 4542 -> 0 bytes mingw/lib/libimagehlp.a | Bin 86386 -> 0 bytes mingw/lib/libimm32.a | Bin 58756 -> 0 bytes mingw/lib/libiphlpapi.a | Bin 35738 -> 0 bytes mingw/lib/libksproxy.a | Bin 6182 -> 0 bytes mingw/lib/libksuser.a | Bin 4476 -> 0 bytes mingw/lib/liblargeint.a | Bin 2548 -> 0 bytes mingw/lib/liblz32.a | Bin 10006 -> 0 bytes mingw/lib/libm.a | Bin 458 -> 0 bytes mingw/lib/libmapi32.a | Bin 121098 -> 0 bytes mingw/lib/libmcd.a | Bin 5386 -> 0 bytes mingw/lib/libmfcuia32.a | Bin 8970 -> 0 bytes mingw/lib/libmgmtapi.a | Bin 8874 -> 0 bytes mingw/lib/libmingwthrd.a | Bin 3458 -> 0 bytes mingw/lib/libmoldnamed.a | Bin 82656 -> 0 bytes mingw/lib/libmpr.a | Bin 54878 -> 0 bytes mingw/lib/libmprapi.a | Bin 96220 -> 0 bytes mingw/lib/libmqrt.a | Bin 30046 -> 0 bytes mingw/lib/libmsacm32.a | Bin 34326 -> 0 bytes mingw/lib/libmscms.a | Bin 42602 -> 0 bytes mingw/lib/libmsdmo.a | Bin 12454 -> 0 bytes mingw/lib/libmsimg32.a | Bin 5162 -> 0 bytes mingw/lib/libmsvcp60.a | Bin 8366 -> 0 bytes mingw/lib/libmsvcr70.a | Bin 533872 -> 0 bytes mingw/lib/libmsvcr70d.a | Bin 534958 -> 0 bytes mingw/lib/libmsvcr71.a | Bin 547344 -> 0 bytes mingw/lib/libmsvcr71d.a | Bin 548466 -> 0 bytes mingw/lib/libmsvcr80.a | Bin 554768 -> 0 bytes mingw/lib/libmsvcr80d.a | Bin 555910 -> 0 bytes mingw/lib/libmsvcrtd.a | Bin 504146 -> 0 bytes mingw/lib/libmsvfw32.a | Bin 36118 -> 0 bytes mingw/lib/libmswsock.a | Bin 20470 -> 0 bytes mingw/lib/libnddeapi.a | Bin 22786 -> 0 bytes mingw/lib/libndis.a | Bin 130602 -> 0 bytes mingw/lib/libnetapi32.a | Bin 187092 -> 0 bytes mingw/lib/libnewdev.a | Bin 4836 -> 0 bytes mingw/lib/libntdll.a | Bin 764276 -> 0 bytes mingw/lib/libntoskrnl.a | Bin 539254 -> 0 bytes mingw/lib/libodbc32.a | Bin 136948 -> 0 bytes mingw/lib/libodbccp32.a | Bin 41294 -> 0 bytes mingw/lib/libole32.a | Bin 192226 -> 0 bytes mingw/lib/liboleacc.a | Bin 13004 -> 0 bytes mingw/lib/liboleaut32.a | Bin 262040 -> 0 bytes mingw/lib/libolecli32.a | Bin 42380 -> 0 bytes mingw/lib/liboledlg.a | Bin 18728 -> 0 bytes mingw/lib/libolepro32.a | Bin 6916 -> 0 bytes mingw/lib/libolesvr32.a | Bin 9800 -> 0 bytes mingw/lib/libopcodes.a | Bin 98718 -> 0 bytes mingw/lib/libopcodes.la | 32 - mingw/lib/libopengl32.a | Bin 269134 -> 0 bytes mingw/lib/libpenwin32.a | Bin 75528 -> 0 bytes mingw/lib/libpkpd32.a | Bin 27088 -> 0 bytes mingw/lib/libpowrprof.a | Bin 19072 -> 0 bytes mingw/lib/libpsapi.a | Bin 15978 -> 0 bytes mingw/lib/libquartz.a | Bin 4444 -> 0 bytes mingw/lib/librapi.a | Bin 61850 -> 0 bytes mingw/lib/librasapi32.a | Bin 112510 -> 0 bytes mingw/lib/librasdlg.a | Bin 5900 -> 0 bytes mingw/lib/librpcdce4.a | Bin 19674 -> 0 bytes mingw/lib/librpcns4.a | Bin 46260 -> 0 bytes mingw/lib/librpcrt4.a | Bin 277512 -> 0 bytes mingw/lib/librtm.a | Bin 13778 -> 0 bytes mingw/lib/librtutils.a | Bin 40722 -> 0 bytes mingw/lib/libscrnsave.a | Bin 7130 -> 0 bytes mingw/lib/libscrnsavw.a | Bin 7274 -> 0 bytes mingw/lib/libscsiport.a | Bin 37802 -> 0 bytes mingw/lib/libsecur32.a | Bin 30078 -> 0 bytes mingw/lib/libsetupapi.a | Bin 361106 -> 0 bytes mingw/lib/libshfolder.a | Bin 3014 -> 0 bytes mingw/lib/libshlwapi.a | Bin 218782 -> 0 bytes mingw/lib/libsnmpapi.a | Bin 30374 -> 0 bytes mingw/lib/libstdc++.a | Bin 1071906 -> 0 bytes mingw/lib/libstdc++.la | 32 - mingw/lib/libstrmiids.a | Bin 80834 -> 0 bytes mingw/lib/libsupc++.a | Bin 116522 -> 0 bytes mingw/lib/libsupc++.la | 32 - mingw/lib/libsvrapi.a | Bin 16292 -> 0 bytes mingw/lib/libtapi32.a | Bin 86704 -> 0 bytes mingw/lib/libtcl84.a | Bin 560824 -> 0 bytes mingw/lib/libtcldde12.a | Bin 1412 -> 0 bytes mingw/lib/libtclreg11.a | Bin 1436 -> 0 bytes mingw/lib/libtclstub84.a | Bin 1118 -> 0 bytes mingw/lib/libtdi.a | Bin 28158 -> 0 bytes mingw/lib/libth32.a | Bin 10342 -> 0 bytes mingw/lib/libthunk32.a | Bin 48894 -> 0 bytes mingw/lib/libtk84.a | Bin 492340 -> 0 bytes mingw/lib/libtkstub84.a | Bin 2370 -> 0 bytes mingw/lib/liburl.a | Bin 6750 -> 0 bytes mingw/lib/libusbcamd.a | Bin 7042 -> 0 bytes mingw/lib/libusbcamd2.a | Bin 7064 -> 0 bytes mingw/lib/libuserenv.a | Bin 8414 -> 0 bytes mingw/lib/libusp10.a | Bin 31908 -> 0 bytes mingw/lib/libuuid.a | Bin 43388 -> 0 bytes mingw/lib/libuxtheme.a | Bin 37758 -> 0 bytes mingw/lib/libvdmdbg.a | Bin 13448 -> 0 bytes mingw/lib/libversion.a | Bin 12042 -> 0 bytes mingw/lib/libvfw32.a | Bin 98930 -> 0 bytes mingw/lib/libvideoprt.a | Bin 89216 -> 0 bytes mingw/lib/libwin32k.a | Bin 149756 -> 0 bytes mingw/lib/libwin32spl.a | Bin 11666 -> 0 bytes mingw/lib/libwininet.a | Bin 186898 -> 0 bytes mingw/lib/libwinmm.a | Bin 144884 -> 0 bytes mingw/lib/libwinspool.a | Bin 99412 -> 0 bytes mingw/lib/libwinstrm.a | Bin 6410 -> 0 bytes mingw/lib/libwldap32.a | Bin 182062 -> 0 bytes mingw/lib/libwow32.a | Bin 14138 -> 0 bytes mingw/lib/libwsnmp32.a | Bin 35262 -> 0 bytes mingw/lib/libwsock32.a | Bin 54478 -> 0 bytes mingw/lib/libwst.a | Bin 2162 -> 0 bytes mingw/lib/libwtsapi32.a | Bin 26944 -> 0 bytes mingw/lib/pkgconfig/libcurl.pc | 38 - mingw/lib/pkgconfig/sdl.pc | 14 - mingw/lib/pngtclConfig.sh | 55 - mingw/lib/reg1.1/pkgIndex.tcl | 9 - mingw/lib/reg1.1/tclreg11.dll | Bin 32914 -> 0 bytes mingw/lib/tclConfig.sh | 182 - mingw/lib/tifftclConfig.sh | 57 - mingw/lib/tkConfig.sh | 87 - mingw/lib/tkimgConfig.sh | 57 - mingw/lib/txtmode.o | Bin 322 -> 0 bytes mingw/lib/zlibtclConfig.sh | 57 - mingw/libexec/gcc/mingw32/3.4.2/cc1plus.exe | Bin 4893696 -> 0 bytes mingw/man/man1/addr2line.1 | 266 - mingw/man/man1/ar.1 | 400 - mingw/man/man1/as.1 | 1118 - mingw/man/man1/c++filt.1 | 351 - mingw/man/man1/cpp.1 | 923 - mingw/man/man1/dlltool.1 | 478 - mingw/man/man1/g++.1 | 10667 -------- mingw/man/man1/gcc.1 | 10667 -------- mingw/man/man1/gcov.1 | 608 - mingw/man/man1/gprof.1 | 749 - mingw/man/man1/ld.1 | 2074 -- mingw/man/man1/nlmconv.1 | 253 - mingw/man/man1/nm.1 | 459 - mingw/man/man1/objcopy.1 | 804 - mingw/man/man1/objdump.1 | 643 - mingw/man/man1/ranlib.1 | 198 - mingw/man/man1/readelf.1 | 386 - mingw/man/man1/size.1 | 271 - mingw/man/man1/strings.1 | 259 - mingw/man/man1/strip.1 | 394 - mingw/man/man1/windres.1 | 353 - mingw/man/man1/xmlwf.1 | 251 - mingw/man/man3/SDLKey.3 | 161 - mingw/man/man3/SDL_ActiveEvent.3 | 38 - mingw/man/man3/SDL_AddTimer.3 | 38 - mingw/man/man3/SDL_AudioCVT.3 | 68 - mingw/man/man3/SDL_AudioSpec.3 | 70 - mingw/man/man3/SDL_BlitSurface.3 | 60 - mingw/man/man3/SDL_BuildAudioCVT.3 | 23 - mingw/man/man3/SDL_CD.3 | 57 - mingw/man/man3/SDL_CDClose.3 | 15 - mingw/man/man3/SDL_CDEject.3 | 18 - mingw/man/man3/SDL_CDName.3 | 23 - mingw/man/man3/SDL_CDNumDrives.3 | 15 - mingw/man/man3/SDL_CDOpen.3 | 58 - mingw/man/man3/SDL_CDPause.3 | 18 - mingw/man/man3/SDL_CDPlay.3 | 18 - mingw/man/man3/SDL_CDPlayTracks.3 | 47 - mingw/man/man3/SDL_CDResume.3 | 18 - mingw/man/man3/SDL_CDStatus.3 | 59 - mingw/man/man3/SDL_CDStop.3 | 18 - mingw/man/man3/SDL_CDtrack.3 | 40 - mingw/man/man3/SDL_CloseAudio.3 | 15 - mingw/man/man3/SDL_Color.3 | 34 - mingw/man/man3/SDL_CondBroadcast.3 | 16 - mingw/man/man3/SDL_CondSignal.3 | 16 - mingw/man/man3/SDL_CondWait.3 | 16 - mingw/man/man3/SDL_CondWaitTimeout.3 | 16 - mingw/man/man3/SDL_ConvertAudio.3 | 95 - mingw/man/man3/SDL_ConvertSurface.3 | 24 - mingw/man/man3/SDL_CreateCond.3 | 31 - mingw/man/man3/SDL_CreateCursor.3 | 120 - mingw/man/man3/SDL_CreateMutex.3 | 43 - mingw/man/man3/SDL_CreateRGBSurface.3 | 69 - mingw/man/man3/SDL_CreateRGBSurfaceFrom.3 | 22 - mingw/man/man3/SDL_CreateSemaphore.3 | 32 - mingw/man/man3/SDL_CreateThread.3 | 16 - mingw/man/man3/SDL_CreateYUVOverlay.3 | 17 - mingw/man/man3/SDL_Delay.3 | 21 - mingw/man/man3/SDL_DestroyCond.3 | 16 - mingw/man/man3/SDL_DestroyMutex.3 | 16 - mingw/man/man3/SDL_DestroySemaphore.3 | 26 - mingw/man/man3/SDL_DisplayFormat.3 | 22 - mingw/man/man3/SDL_DisplayFormatAlpha.3 | 22 - mingw/man/man3/SDL_DisplayYUVOverlay.3 | 18 - mingw/man/man3/SDL_EnableKeyRepeat.3 | 17 - mingw/man/man3/SDL_EnableUNICODE.3 | 24 - mingw/man/man3/SDL_Event.3 | 182 - mingw/man/man3/SDL_EventState.3 | 23 - mingw/man/man3/SDL_ExposeEvent.3 | 24 - mingw/man/man3/SDL_FillRect.3 | 22 - mingw/man/man3/SDL_Flip.3 | 20 - mingw/man/man3/SDL_FreeCursor.3 | 15 - mingw/man/man3/SDL_FreeSurface.3 | 15 - mingw/man/man3/SDL_FreeWAV.3 | 15 - mingw/man/man3/SDL_FreeYUVOverlay.3 | 15 - mingw/man/man3/SDL_GL_GetAttribute.3 | 18 - mingw/man/man3/SDL_GL_GetProcAddress.3 | 48 - mingw/man/man3/SDL_GL_LoadLibrary.3 | 15 - mingw/man/man3/SDL_GL_SetAttribute.3 | 40 - mingw/man/man3/SDL_GL_SwapBuffers.3 | 15 - mingw/man/man3/SDL_GLattr.3 | 47 - mingw/man/man3/SDL_GetAppState.3 | 24 - mingw/man/man3/SDL_GetAudioStatus.3 | 24 - mingw/man/man3/SDL_GetClipRect.3 | 17 - mingw/man/man3/SDL_GetCursor.3 | 15 - mingw/man/man3/SDL_GetError.3 | 15 - mingw/man/man3/SDL_GetEventFilter.3 | 23 - mingw/man/man3/SDL_GetGamma.3 | 21 - mingw/man/man3/SDL_GetGammaRamp.3 | 20 - mingw/man/man3/SDL_GetKeyName.3 | 15 - mingw/man/man3/SDL_GetKeyState.3 | 30 - mingw/man/man3/SDL_GetModState.3 | 54 - mingw/man/man3/SDL_GetMouseState.3 | 24 - mingw/man/man3/SDL_GetRGB.3 | 17 - mingw/man/man3/SDL_GetRGBA.3 | 19 - mingw/man/man3/SDL_GetRelativeMouseState.3 | 15 - mingw/man/man3/SDL_GetThreadID.3 | 16 - mingw/man/man3/SDL_GetTicks.3 | 15 - mingw/man/man3/SDL_GetVideoInfo.3 | 15 - mingw/man/man3/SDL_GetVideoSurface.3 | 15 - mingw/man/man3/SDL_Init.3 | 41 - mingw/man/man3/SDL_InitSubSystem.3 | 41 - mingw/man/man3/SDL_JoyAxisEvent.3 | 36 - mingw/man/man3/SDL_JoyBallEvent.3 | 36 - mingw/man/man3/SDL_JoyButtonEvent.3 | 36 - mingw/man/man3/SDL_JoyHatEvent.3 | 56 - mingw/man/man3/SDL_JoystickClose.3 | 15 - mingw/man/man3/SDL_JoystickEventState.3 | 24 - mingw/man/man3/SDL_JoystickGetAxis.3 | 32 - mingw/man/man3/SDL_JoystickGetBall.3 | 37 - mingw/man/man3/SDL_JoystickGetButton.3 | 18 - mingw/man/man3/SDL_JoystickGetHat.3 | 36 - mingw/man/man3/SDL_JoystickIndex.3 | 18 - mingw/man/man3/SDL_JoystickName.3 | 32 - mingw/man/man3/SDL_JoystickNumAxes.3 | 18 - mingw/man/man3/SDL_JoystickNumBalls.3 | 18 - mingw/man/man3/SDL_JoystickNumButtons.3 | 18 - mingw/man/man3/SDL_JoystickNumHats.3 | 18 - mingw/man/man3/SDL_JoystickOpen.3 | 51 - mingw/man/man3/SDL_JoystickOpened.3 | 18 - mingw/man/man3/SDL_JoystickUpdate.3 | 15 - mingw/man/man3/SDL_KeyboardEvent.3 | 38 - mingw/man/man3/SDL_KillThread.3 | 16 - mingw/man/man3/SDL_ListModes.3 | 53 - mingw/man/man3/SDL_LoadBMP.3 | 18 - mingw/man/man3/SDL_LoadWAV.3 | 42 - mingw/man/man3/SDL_LockAudio.3 | 15 - mingw/man/man3/SDL_LockSurface.3 | 48 - mingw/man/man3/SDL_LockYUVOverlay.3 | 18 - mingw/man/man3/SDL_MapRGB.3 | 22 - mingw/man/man3/SDL_MapRGBA.3 | 22 - mingw/man/man3/SDL_MixAudio.3 | 21 - mingw/man/man3/SDL_MouseButtonEvent.3 | 36 - mingw/man/man3/SDL_MouseMotionEvent.3 | 38 - mingw/man/man3/SDL_NumJoysticks.3 | 18 - mingw/man/man3/SDL_OpenAudio.3 | 97 - mingw/man/man3/SDL_Overlay.3 | 52 - mingw/man/man3/SDL_Palette.3 | 26 - mingw/man/man3/SDL_PauseAudio.3 | 15 - mingw/man/man3/SDL_PeepEvents.3 | 26 - mingw/man/man3/SDL_PixelFormat.3 | 140 - mingw/man/man3/SDL_PollEvent.3 | 44 - mingw/man/man3/SDL_PumpEvents.3 | 23 - mingw/man/man3/SDL_PushEvent.3 | 27 - mingw/man/man3/SDL_Quit.3 | 29 - mingw/man/man3/SDL_QuitEvent.3 | 30 - mingw/man/man3/SDL_QuitSubSystem.3 | 15 - mingw/man/man3/SDL_RWFromFile.3 | 18 - mingw/man/man3/SDL_Rect.3 | 26 - mingw/man/man3/SDL_RemoveTimer.3 | 25 - mingw/man/man3/SDL_ResizeEvent.3 | 28 - mingw/man/man3/SDL_SaveBMP.3 | 18 - mingw/man/man3/SDL_SemPost.3 | 28 - mingw/man/man3/SDL_SemTryWait.3 | 41 - mingw/man/man3/SDL_SemValue.3 | 26 - mingw/man/man3/SDL_SemWait.3 | 34 - mingw/man/man3/SDL_SemWaitTimeout.3 | 41 - mingw/man/man3/SDL_SetAlpha.3 | 66 - mingw/man/man3/SDL_SetClipRect.3 | 19 - mingw/man/man3/SDL_SetColorKey.3 | 26 - mingw/man/man3/SDL_SetColors.3 | 57 - mingw/man/man3/SDL_SetCursor.3 | 15 - mingw/man/man3/SDL_SetEventFilter.3 | 35 - mingw/man/man3/SDL_SetGamma.3 | 22 - mingw/man/man3/SDL_SetGammaRamp.3 | 22 - mingw/man/man3/SDL_SetModState.3 | 35 - mingw/man/man3/SDL_SetPalette.3 | 59 - mingw/man/man3/SDL_SetTimer.3 | 39 - mingw/man/man3/SDL_SetVideoMode.3 | 67 - mingw/man/man3/SDL_ShowCursor.3 | 20 - mingw/man/man3/SDL_Surface.3 | 96 - mingw/man/man3/SDL_SysWMEvent.3 | 21 - mingw/man/man3/SDL_ThreadID.3 | 13 - mingw/man/man3/SDL_UnlockAudio.3 | 15 - mingw/man/man3/SDL_UnlockSurface.3 | 17 - mingw/man/man3/SDL_UnlockYUVOverlay.3 | 15 - mingw/man/man3/SDL_UpdateRect.3 | 19 - mingw/man/man3/SDL_UpdateRects.3 | 25 - mingw/man/man3/SDL_UserEvent.3 | 47 - mingw/man/man3/SDL_VideoDriverName.3 | 18 - mingw/man/man3/SDL_VideoInfo.3 | 62 - mingw/man/man3/SDL_VideoModeOK.3 | 44 - mingw/man/man3/SDL_WM_GetCaption.3 | 15 - mingw/man/man3/SDL_WM_GrabInput.3 | 28 - mingw/man/man3/SDL_WM_IconifyWindow.3 | 15 - mingw/man/man3/SDL_WM_SetCaption.3 | 15 - mingw/man/man3/SDL_WM_SetIcon.3 | 27 - mingw/man/man3/SDL_WM_ToggleFullScreen.3 | 15 - mingw/man/man3/SDL_WaitEvent.3 | 17 - mingw/man/man3/SDL_WaitThread.3 | 19 - mingw/man/man3/SDL_WarpMouse.3 | 15 - mingw/man/man3/SDL_WasInit.3 | 63 - mingw/man/man3/SDL_keysym.3 | 69 - mingw/man/man3/SDL_mutexP.3 | 18 - mingw/man/man3/SDL_mutexV.3 | 18 - mingw/man/man3/basename.3 | 474 - mingw/man/man3/dirname.3 | 474 - mingw/man/man7/fsf-funding.7 | 195 - mingw/man/man7/gfdl.7 | 568 - mingw/man/man7/gpl.7 | 528 - mingw/share/man/man1/curl-config.1 | 95 - mingw/share/man/man1/curl.1 | 1548 -- mingw/share/man/man3/curl_easy_cleanup.3 | 31 - mingw/share/man/man3/curl_easy_duphandle.3 | 34 - mingw/share/man/man3/curl_easy_escape.3 | 47 - mingw/share/man/man3/curl_easy_getinfo.3 | 209 - mingw/share/man/man3/curl_easy_init.3 | 32 - mingw/share/man/man3/curl_easy_perform.3 | 40 - mingw/share/man/man3/curl_easy_reset.3 | 24 - mingw/share/man/man3/curl_easy_setopt.3 | 1432 - mingw/share/man/man3/curl_easy_strerror.3 | 20 - mingw/share/man/man3/curl_easy_unescape.3 | 52 - mingw/share/man/man3/curl_escape.3 | 31 - mingw/share/man/man3/curl_formadd.3 | 223 - mingw/share/man/man3/curl_formfree.3 | 20 - mingw/share/man/man3/curl_formget.3 | 49 - mingw/share/man/man3/curl_free.3 | 18 - mingw/share/man/man3/curl_getdate.3 | 100 - mingw/share/man/man3/curl_getenv.3 | 30 - mingw/share/man/man3/curl_global_cleanup.3 | 32 - mingw/share/man/man3/curl_global_init.3 | 59 - mingw/share/man/man3/curl_global_init_mem.3 | 42 - mingw/share/man/man3/curl_mprintf.3 | 90 - mingw/share/man/man3/curl_multi_add_handle.3 | 36 - mingw/share/man/man3/curl_multi_assign.3 | 44 - mingw/share/man/man3/curl_multi_cleanup.3 | 27 - mingw/share/man/man3/curl_multi_fdset.3 | 41 - mingw/share/man/man3/curl_multi_info_read.3 | 57 - mingw/share/man/man3/curl_multi_init.3 | 21 - mingw/share/man/man3/curl_multi_perform.3 | 50 - mingw/share/man/man3/curl_multi_remove_handle.3 | 23 - mingw/share/man/man3/curl_multi_setopt.3 | 83 - mingw/share/man/man3/curl_multi_socket.3 | 144 - mingw/share/man/man3/curl_multi_strerror.3 | 20 - mingw/share/man/man3/curl_multi_timeout.3 | 38 - mingw/share/man/man3/curl_share_cleanup.3 | 21 - mingw/share/man/man3/curl_share_init.3 | 25 - mingw/share/man/man3/curl_share_setopt.3 | 61 - mingw/share/man/man3/curl_share_strerror.3 | 20 - mingw/share/man/man3/curl_slist_append.3 | 39 - mingw/share/man/man3/curl_slist_free_all.3 | 20 - mingw/share/man/man3/curl_strequal.3 | 32 - mingw/share/man/man3/curl_unescape.3 | 31 - mingw/share/man/man3/curl_version.3 | 19 - mingw/share/man/man3/curl_version_info.3 | 148 - mingw/share/man/man3/libcurl-easy.3 | 28 - mingw/share/man/man3/libcurl-errors.3 | 265 - mingw/share/man/man3/libcurl-multi.3 | 143 - mingw/share/man/man3/libcurl-share.3 | 46 - mingw/share/man/man3/libcurl-tutorial.3 | 1193 - mingw/share/man/man3/libcurl.3 | 203 - mingw/share/man/man3/zlib.3 | 159 - mingw/uninstall/unins000.dat | Bin 24377 -> 0 bytes mingw/uninstall/unins000.exe | Bin 72784 -> 0 bytes 1639 files changed, 583044 deletions(-) delete mode 100644 bin/aclocal delete mode 100644 bin/aclocal-1.7 delete mode 100644 bin/autoconf delete mode 100644 bin/autogen.exe delete mode 100644 bin/autoheader delete mode 100644 bin/autom4te delete mode 100644 bin/automake delete mode 100644 bin/automake-1.7 delete mode 100644 bin/autoopts-config delete mode 100644 bin/autoreconf delete mode 100644 bin/autoscan delete mode 100644 bin/autoupdate delete mode 100644 bin/bashbug delete mode 100644 bin/c_rehash delete mode 100644 bin/cls delete mode 100644 bin/clsb delete mode 100644 bin/columns.exe delete mode 100644 bin/comm.exe delete mode 100644 bin/cvsbug delete mode 100644 bin/ex delete mode 100644 bin/find2perl delete mode 100644 bin/fold.exe delete mode 100644 bin/ftp delete mode 100644 bin/ftp.exe delete mode 100644 bin/getdefs.exe delete mode 100644 bin/guile-config delete mode 100644 bin/guile-snarf delete mode 100644 bin/guile.exe delete mode 100644 bin/ifnames delete mode 100644 bin/info.exe delete mode 100644 bin/infokey.exe delete mode 100644 bin/libtool delete mode 100644 bin/libtoolize delete mode 100644 bin/lnkcnv delete mode 100644 bin/m4.exe delete mode 100644 bin/makeinfo.exe delete mode 100644 bin/md5sum.exe delete mode 100644 bin/perlbug delete mode 100644 bin/perlcc delete mode 100644 bin/perldoc delete mode 100644 bin/perlld delete mode 100644 bin/rcp.exe delete mode 100644 bin/rcs2log delete mode 100644 bin/rlogin.exe delete mode 100644 bin/rsh.exe delete mode 100644 bin/rvi delete mode 100644 bin/rview delete mode 100644 bin/rvim delete mode 100644 bin/sftp.exe delete mode 100644 bin/telnet.exe delete mode 100644 bin/texi2dvi delete mode 100644 bin/texindex.exe delete mode 100644 bin/tftp.exe delete mode 100644 bin/view delete mode 100644 lib/cvs/contrib/README delete mode 100644 lib/cvs/contrib/clmerge delete mode 100644 lib/cvs/contrib/cln_hist delete mode 100644 lib/cvs/contrib/commit_prep delete mode 100644 lib/cvs/contrib/cvs2vendor delete mode 100644 lib/cvs/contrib/cvs_acls delete mode 100644 lib/cvs/contrib/cvscheck delete mode 100644 lib/cvs/contrib/cvscheck.man delete mode 100644 lib/cvs/contrib/intro.doc delete mode 100644 lib/cvs/contrib/log delete mode 100644 lib/cvs/contrib/log_accum delete mode 100644 lib/cvs/contrib/mfpipe delete mode 100644 lib/cvs/contrib/rcs-to-cvs delete mode 100644 lib/cvs/contrib/rcs2log delete mode 100644 lib/cvs/contrib/rcslock delete mode 100644 lib/cvs/contrib/sccs2rcs delete mode 100644 lib/perl5/5.6.1/CGI.pm delete mode 100644 lib/perl5/5.6.1/CGI/Apache.pm delete mode 100644 lib/perl5/5.6.1/CGI/Carp.pm delete mode 100644 lib/perl5/5.6.1/CGI/Cookie.pm delete mode 100644 lib/perl5/5.6.1/CGI/Fast.pm delete mode 100644 lib/perl5/5.6.1/CGI/Pretty.pm delete mode 100644 lib/perl5/5.6.1/CGI/Push.pm delete mode 100644 lib/perl5/5.6.1/CGI/Switch.pm delete mode 100644 lib/perl5/5.6.1/CGI/Util.pm delete mode 100644 lib/perl5/5.6.1/CPAN.pm delete mode 100644 lib/perl5/5.6.1/CPAN/FirstTime.pm delete mode 100644 lib/perl5/5.6.1/CPAN/Nox.pm delete mode 100644 lib/perl5/5.6.1/pods/perl.pod delete mode 100644 lib/perl5/5.6.1/pods/perl5004delta.pod delete mode 100644 lib/perl5/5.6.1/pods/perl5005delta.pod delete mode 100644 lib/perl5/5.6.1/pods/perlaix.pod delete mode 100644 lib/perl5/5.6.1/pods/perlamiga.pod delete mode 100644 lib/perl5/5.6.1/pods/perlapi.pod delete mode 100644 lib/perl5/5.6.1/pods/perlapio.pod delete mode 100644 lib/perl5/5.6.1/pods/perlbook.pod delete mode 100644 lib/perl5/5.6.1/pods/perlboot.pod delete mode 100644 lib/perl5/5.6.1/pods/perlbot.pod delete mode 100644 lib/perl5/5.6.1/pods/perlbs2000.pod delete mode 100644 lib/perl5/5.6.1/pods/perlcall.pod delete mode 100644 lib/perl5/5.6.1/pods/perlclib.pod delete mode 100644 lib/perl5/5.6.1/pods/perlcompile.pod delete mode 100644 lib/perl5/5.6.1/pods/perlcygwin.pod delete mode 100644 lib/perl5/5.6.1/pods/perldata.pod delete mode 100644 lib/perl5/5.6.1/pods/perldbmfilter.pod delete mode 100644 lib/perl5/5.6.1/pods/perldebguts.pod delete mode 100644 lib/perl5/5.6.1/pods/perldebtut.pod delete mode 100644 lib/perl5/5.6.1/pods/perldebug.pod delete mode 100644 lib/perl5/5.6.1/pods/perldelta.pod delete mode 100644 lib/perl5/5.6.1/pods/perldiag.pod delete mode 100644 lib/perl5/5.6.1/pods/perldos.pod delete mode 100644 lib/perl5/5.6.1/pods/perldsc.pod delete mode 100644 lib/perl5/5.6.1/pods/perlebcdic.pod delete mode 100644 lib/perl5/5.6.1/pods/perlembed.pod delete mode 100644 lib/perl5/5.6.1/pods/perlepoc.pod delete mode 100644 lib/perl5/5.6.1/pods/perlfaq.pod delete mode 100644 lib/perl5/5.6.1/pods/perlfaq1.pod delete mode 100644 lib/perl5/5.6.1/pods/perlfaq2.pod delete mode 100644 lib/perl5/5.6.1/pods/perlfaq3.pod delete mode 100644 lib/perl5/5.6.1/pods/perlfaq4.pod delete mode 100644 lib/perl5/5.6.1/pods/perlfaq5.pod delete mode 100644 lib/perl5/5.6.1/pods/perlfaq6.pod delete mode 100644 lib/perl5/5.6.1/pods/perlfaq7.pod delete mode 100644 lib/perl5/5.6.1/pods/perlfaq8.pod delete mode 100644 lib/perl5/5.6.1/pods/perlfaq9.pod delete mode 100644 lib/perl5/5.6.1/pods/perlfilter.pod delete mode 100644 lib/perl5/5.6.1/pods/perlfork.pod delete mode 100644 lib/perl5/5.6.1/pods/perlform.pod delete mode 100644 lib/perl5/5.6.1/pods/perlfunc.pod delete mode 100644 lib/perl5/5.6.1/pods/perlguts.pod delete mode 100644 lib/perl5/5.6.1/pods/perlhack.pod delete mode 100644 lib/perl5/5.6.1/pods/perlhist.pod delete mode 100644 lib/perl5/5.6.1/pods/perlhpux.pod delete mode 100644 lib/perl5/5.6.1/pods/perlintern.pod delete mode 100644 lib/perl5/5.6.1/pods/perlipc.pod delete mode 100644 lib/perl5/5.6.1/pods/perllexwarn.pod delete mode 100644 lib/perl5/5.6.1/pods/perllocale.pod delete mode 100644 lib/perl5/5.6.1/pods/perllol.pod delete mode 100644 lib/perl5/5.6.1/pods/perlmachten.pod delete mode 100644 lib/perl5/5.6.1/pods/perlmacos.pod delete mode 100644 lib/perl5/5.6.1/pods/perlmod.pod delete mode 100644 lib/perl5/5.6.1/pods/perlmodinstall.pod delete mode 100644 lib/perl5/5.6.1/pods/perlmodlib.pod delete mode 100644 lib/perl5/5.6.1/pods/perlmpeix.pod delete mode 100644 lib/perl5/5.6.1/pods/perlnewmod.pod delete mode 100644 lib/perl5/5.6.1/pods/perlnumber.pod delete mode 100644 lib/perl5/5.6.1/pods/perlobj.pod delete mode 100644 lib/perl5/5.6.1/pods/perlop.pod delete mode 100644 lib/perl5/5.6.1/pods/perlopentut.pod delete mode 100644 lib/perl5/5.6.1/pods/perlos2.pod delete mode 100644 lib/perl5/5.6.1/pods/perlos390.pod delete mode 100644 lib/perl5/5.6.1/pods/perlpod.pod delete mode 100644 lib/perl5/5.6.1/pods/perlport.pod delete mode 100644 lib/perl5/5.6.1/pods/perlre.pod delete mode 100644 lib/perl5/5.6.1/pods/perlref.pod delete mode 100644 lib/perl5/5.6.1/pods/perlreftut.pod delete mode 100644 lib/perl5/5.6.1/pods/perlrequick.pod delete mode 100644 lib/perl5/5.6.1/pods/perlretut.pod delete mode 100644 lib/perl5/5.6.1/pods/perlrun.pod delete mode 100644 lib/perl5/5.6.1/pods/perlsec.pod delete mode 100644 lib/perl5/5.6.1/pods/perlsolaris.pod delete mode 100644 lib/perl5/5.6.1/pods/perlstyle.pod delete mode 100644 lib/perl5/5.6.1/pods/perlsub.pod delete mode 100644 lib/perl5/5.6.1/pods/perlsyn.pod delete mode 100644 lib/perl5/5.6.1/pods/perlthrtut.pod delete mode 100644 lib/perl5/5.6.1/pods/perltie.pod delete mode 100644 lib/perl5/5.6.1/pods/perltoc.pod delete mode 100644 lib/perl5/5.6.1/pods/perltodo.pod delete mode 100644 lib/perl5/5.6.1/pods/perltoot.pod delete mode 100644 lib/perl5/5.6.1/pods/perltootc.pod delete mode 100644 lib/perl5/5.6.1/pods/perltrap.pod delete mode 100644 lib/perl5/5.6.1/pods/perlunicode.pod delete mode 100644 lib/perl5/5.6.1/pods/perlutil.pod delete mode 100644 lib/perl5/5.6.1/pods/perlvar.pod delete mode 100644 lib/perl5/5.6.1/pods/perlvmesa.pod delete mode 100644 lib/perl5/5.6.1/pods/perlvms.pod delete mode 100644 lib/perl5/5.6.1/pods/perlvos.pod delete mode 100644 lib/perl5/5.6.1/pods/perlwin32.pod delete mode 100644 lib/perl5/5.6.1/pods/perlxs.pod delete mode 100644 lib/perl5/5.6.1/pods/perlxstut.pod delete mode 100644 mingw/bin/SDL.dll delete mode 100644 mingw/doc/tcltk/tcl84.hlp delete mode 100644 mingw/include/GL/gl.h delete mode 100644 mingw/include/GL/glext.h delete mode 100644 mingw/include/GL/glu.h delete mode 100644 mingw/include/SDL/SDL.h delete mode 100644 mingw/include/SDL/SDL_active.h delete mode 100644 mingw/include/SDL/SDL_audio.h delete mode 100644 mingw/include/SDL/SDL_byteorder.h delete mode 100644 mingw/include/SDL/SDL_cdrom.h delete mode 100644 mingw/include/SDL/SDL_config.h delete mode 100644 mingw/include/SDL/SDL_config_amiga.h delete mode 100644 mingw/include/SDL/SDL_config_dreamcast.h delete mode 100644 mingw/include/SDL/SDL_config_macos.h delete mode 100644 mingw/include/SDL/SDL_config_macosx.h delete mode 100644 mingw/include/SDL/SDL_config_minimal.h delete mode 100644 mingw/include/SDL/SDL_config_os2.h delete mode 100644 mingw/include/SDL/SDL_config_win32.h delete mode 100644 mingw/include/SDL/SDL_copying.h delete mode 100644 mingw/include/SDL/SDL_cpuinfo.h delete mode 100644 mingw/include/SDL/SDL_endian.h delete mode 100644 mingw/include/SDL/SDL_error.h delete mode 100644 mingw/include/SDL/SDL_events.h delete mode 100644 mingw/include/SDL/SDL_getenv.h delete mode 100644 mingw/include/SDL/SDL_joystick.h delete mode 100644 mingw/include/SDL/SDL_keyboard.h delete mode 100644 mingw/include/SDL/SDL_keysym.h delete mode 100644 mingw/include/SDL/SDL_loadso.h delete mode 100644 mingw/include/SDL/SDL_main.h delete mode 100644 mingw/include/SDL/SDL_mouse.h delete mode 100644 mingw/include/SDL/SDL_mutex.h delete mode 100644 mingw/include/SDL/SDL_name.h delete mode 100644 mingw/include/SDL/SDL_opengl.h delete mode 100644 mingw/include/SDL/SDL_platform.h delete mode 100644 mingw/include/SDL/SDL_quit.h delete mode 100644 mingw/include/SDL/SDL_rwops.h delete mode 100644 mingw/include/SDL/SDL_stdinc.h delete mode 100644 mingw/include/SDL/SDL_syswm.h delete mode 100644 mingw/include/SDL/SDL_thread.h delete mode 100644 mingw/include/SDL/SDL_timer.h delete mode 100644 mingw/include/SDL/SDL_types.h delete mode 100644 mingw/include/SDL/SDL_version.h delete mode 100644 mingw/include/SDL/SDL_video.h delete mode 100644 mingw/include/SDL/begin_code.h delete mode 100644 mingw/include/SDL/close_code.h delete mode 100644 mingw/include/X11/X.h delete mode 100644 mingw/include/X11/Xatom.h delete mode 100644 mingw/include/X11/Xfuncproto.h delete mode 100644 mingw/include/X11/Xlib.h delete mode 100644 mingw/include/X11/Xutil.h delete mode 100644 mingw/include/X11/cursorfont.h delete mode 100644 mingw/include/X11/keysym.h delete mode 100644 mingw/include/X11/keysymdef.h delete mode 100644 mingw/include/accctrl.h delete mode 100644 mingw/include/aclapi.h delete mode 100644 mingw/include/aclui.h delete mode 100644 mingw/include/adsprop.h delete mode 100644 mingw/include/afxres.h delete mode 100644 mingw/include/amaudio.h delete mode 100644 mingw/include/amvideo.h delete mode 100644 mingw/include/ansidecl.h delete mode 100644 mingw/include/audevcod.h delete mode 100644 mingw/include/aviriff.h delete mode 100644 mingw/include/aygshell.h delete mode 100644 mingw/include/bdatypes.h delete mode 100644 mingw/include/bfd.h delete mode 100644 mingw/include/bfdlink.h delete mode 100644 mingw/include/c++/3.4.2/algorithm delete mode 100644 mingw/include/c++/3.4.2/backward/algo.h delete mode 100644 mingw/include/c++/3.4.2/backward/algobase.h delete mode 100644 mingw/include/c++/3.4.2/backward/alloc.h delete mode 100644 mingw/include/c++/3.4.2/backward/backward_warning.h delete mode 100644 mingw/include/c++/3.4.2/backward/bvector.h delete mode 100644 mingw/include/c++/3.4.2/backward/complex.h delete mode 100644 mingw/include/c++/3.4.2/backward/defalloc.h delete mode 100644 mingw/include/c++/3.4.2/backward/deque.h delete mode 100644 mingw/include/c++/3.4.2/backward/fstream.h delete mode 100644 mingw/include/c++/3.4.2/backward/function.h delete mode 100644 mingw/include/c++/3.4.2/backward/hash_map.h delete mode 100644 mingw/include/c++/3.4.2/backward/hash_set.h delete mode 100644 mingw/include/c++/3.4.2/backward/hashtable.h delete mode 100644 mingw/include/c++/3.4.2/backward/heap.h delete mode 100644 mingw/include/c++/3.4.2/backward/iomanip.h delete mode 100644 mingw/include/c++/3.4.2/backward/iostream.h delete mode 100644 mingw/include/c++/3.4.2/backward/istream.h delete mode 100644 mingw/include/c++/3.4.2/backward/iterator.h delete mode 100644 mingw/include/c++/3.4.2/backward/list.h delete mode 100644 mingw/include/c++/3.4.2/backward/map.h delete mode 100644 mingw/include/c++/3.4.2/backward/multimap.h delete mode 100644 mingw/include/c++/3.4.2/backward/multiset.h delete mode 100644 mingw/include/c++/3.4.2/backward/new.h delete mode 100644 mingw/include/c++/3.4.2/backward/ostream.h delete mode 100644 mingw/include/c++/3.4.2/backward/pair.h delete mode 100644 mingw/include/c++/3.4.2/backward/queue.h delete mode 100644 mingw/include/c++/3.4.2/backward/rope.h delete mode 100644 mingw/include/c++/3.4.2/backward/set.h delete mode 100644 mingw/include/c++/3.4.2/backward/slist.h delete mode 100644 mingw/include/c++/3.4.2/backward/stack.h delete mode 100644 mingw/include/c++/3.4.2/backward/stream.h delete mode 100644 mingw/include/c++/3.4.2/backward/streambuf.h delete mode 100644 mingw/include/c++/3.4.2/backward/strstream delete mode 100644 mingw/include/c++/3.4.2/backward/tempbuf.h delete mode 100644 mingw/include/c++/3.4.2/backward/tree.h delete mode 100644 mingw/include/c++/3.4.2/backward/vector.h delete mode 100644 mingw/include/c++/3.4.2/bits/allocator.h delete mode 100644 mingw/include/c++/3.4.2/bits/atomicity.h delete mode 100644 mingw/include/c++/3.4.2/bits/basic_ios.h delete mode 100644 mingw/include/c++/3.4.2/bits/basic_ios.tcc delete mode 100644 mingw/include/c++/3.4.2/bits/basic_string.h delete mode 100644 mingw/include/c++/3.4.2/bits/basic_string.tcc delete mode 100644 mingw/include/c++/3.4.2/bits/boost_concept_check.h delete mode 100644 mingw/include/c++/3.4.2/bits/char_traits.h delete mode 100644 mingw/include/c++/3.4.2/bits/cmath.tcc delete mode 100644 mingw/include/c++/3.4.2/bits/codecvt.h delete mode 100644 mingw/include/c++/3.4.2/bits/concept_check.h delete mode 100644 mingw/include/c++/3.4.2/bits/concurrence.h delete mode 100644 mingw/include/c++/3.4.2/bits/cpp_type_traits.h delete mode 100644 mingw/include/c++/3.4.2/bits/deque.tcc delete mode 100644 mingw/include/c++/3.4.2/bits/fstream.tcc delete mode 100644 mingw/include/c++/3.4.2/bits/functexcept.h delete mode 100644 mingw/include/c++/3.4.2/bits/gslice.h delete mode 100644 mingw/include/c++/3.4.2/bits/gslice_array.h delete mode 100644 mingw/include/c++/3.4.2/bits/indirect_array.h delete mode 100644 mingw/include/c++/3.4.2/bits/ios_base.h delete mode 100644 mingw/include/c++/3.4.2/bits/istream.tcc delete mode 100644 mingw/include/c++/3.4.2/bits/list.tcc delete mode 100644 mingw/include/c++/3.4.2/bits/locale_classes.h delete mode 100644 mingw/include/c++/3.4.2/bits/locale_facets.h delete mode 100644 mingw/include/c++/3.4.2/bits/locale_facets.tcc delete mode 100644 mingw/include/c++/3.4.2/bits/localefwd.h delete mode 100644 mingw/include/c++/3.4.2/bits/mask_array.h delete mode 100644 mingw/include/c++/3.4.2/bits/ostream.tcc delete mode 100644 mingw/include/c++/3.4.2/bits/postypes.h delete mode 100644 mingw/include/c++/3.4.2/bits/slice_array.h delete mode 100644 mingw/include/c++/3.4.2/bits/sstream.tcc delete mode 100644 mingw/include/c++/3.4.2/bits/stl_algo.h delete mode 100644 mingw/include/c++/3.4.2/bits/stl_algobase.h delete mode 100644 mingw/include/c++/3.4.2/bits/stl_bvector.h delete mode 100644 mingw/include/c++/3.4.2/bits/stl_construct.h delete mode 100644 mingw/include/c++/3.4.2/bits/stl_deque.h delete mode 100644 mingw/include/c++/3.4.2/bits/stl_function.h delete mode 100644 mingw/include/c++/3.4.2/bits/stl_heap.h delete mode 100644 mingw/include/c++/3.4.2/bits/stl_iterator.h delete mode 100644 mingw/include/c++/3.4.2/bits/stl_iterator_base_funcs.h delete mode 100644 mingw/include/c++/3.4.2/bits/stl_iterator_base_types.h delete mode 100644 mingw/include/c++/3.4.2/bits/stl_list.h delete mode 100644 mingw/include/c++/3.4.2/bits/stl_map.h delete mode 100644 mingw/include/c++/3.4.2/bits/stl_multimap.h delete mode 100644 mingw/include/c++/3.4.2/bits/stl_multiset.h delete mode 100644 mingw/include/c++/3.4.2/bits/stl_numeric.h delete mode 100644 mingw/include/c++/3.4.2/bits/stl_pair.h delete mode 100644 mingw/include/c++/3.4.2/bits/stl_queue.h delete mode 100644 mingw/include/c++/3.4.2/bits/stl_raw_storage_iter.h delete mode 100644 mingw/include/c++/3.4.2/bits/stl_relops.h delete mode 100644 mingw/include/c++/3.4.2/bits/stl_set.h delete mode 100644 mingw/include/c++/3.4.2/bits/stl_stack.h delete mode 100644 mingw/include/c++/3.4.2/bits/stl_tempbuf.h delete mode 100644 mingw/include/c++/3.4.2/bits/stl_threads.h delete mode 100644 mingw/include/c++/3.4.2/bits/stl_tree.h delete mode 100644 mingw/include/c++/3.4.2/bits/stl_uninitialized.h delete mode 100644 mingw/include/c++/3.4.2/bits/stl_vector.h delete mode 100644 mingw/include/c++/3.4.2/bits/stream_iterator.h delete mode 100644 mingw/include/c++/3.4.2/bits/streambuf.tcc delete mode 100644 mingw/include/c++/3.4.2/bits/streambuf_iterator.h delete mode 100644 mingw/include/c++/3.4.2/bits/stringfwd.h delete mode 100644 mingw/include/c++/3.4.2/bits/type_traits.h delete mode 100644 mingw/include/c++/3.4.2/bits/valarray_after.h delete mode 100644 mingw/include/c++/3.4.2/bits/valarray_array.h delete mode 100644 mingw/include/c++/3.4.2/bits/valarray_array.tcc delete mode 100644 mingw/include/c++/3.4.2/bits/valarray_before.h delete mode 100644 mingw/include/c++/3.4.2/bits/vector.tcc delete mode 100644 mingw/include/c++/3.4.2/bitset delete mode 100644 mingw/include/c++/3.4.2/cassert delete mode 100644 mingw/include/c++/3.4.2/cctype delete mode 100644 mingw/include/c++/3.4.2/cerrno delete mode 100644 mingw/include/c++/3.4.2/cfloat delete mode 100644 mingw/include/c++/3.4.2/ciso646 delete mode 100644 mingw/include/c++/3.4.2/climits delete mode 100644 mingw/include/c++/3.4.2/clocale delete mode 100644 mingw/include/c++/3.4.2/cmath delete mode 100644 mingw/include/c++/3.4.2/complex delete mode 100644 mingw/include/c++/3.4.2/csetjmp delete mode 100644 mingw/include/c++/3.4.2/csignal delete mode 100644 mingw/include/c++/3.4.2/cstdarg delete mode 100644 mingw/include/c++/3.4.2/cstddef delete mode 100644 mingw/include/c++/3.4.2/cstdio delete mode 100644 mingw/include/c++/3.4.2/cstdlib delete mode 100644 mingw/include/c++/3.4.2/cstring delete mode 100644 mingw/include/c++/3.4.2/ctime delete mode 100644 mingw/include/c++/3.4.2/cwchar delete mode 100644 mingw/include/c++/3.4.2/cwctype delete mode 100644 mingw/include/c++/3.4.2/cxxabi.h delete mode 100644 mingw/include/c++/3.4.2/debug/bitset delete mode 100644 mingw/include/c++/3.4.2/debug/debug.h delete mode 100644 mingw/include/c++/3.4.2/debug/deque delete mode 100644 mingw/include/c++/3.4.2/debug/formatter.h delete mode 100644 mingw/include/c++/3.4.2/debug/hash_map delete mode 100644 mingw/include/c++/3.4.2/debug/hash_map.h delete mode 100644 mingw/include/c++/3.4.2/debug/hash_multimap.h delete mode 100644 mingw/include/c++/3.4.2/debug/hash_multiset.h delete mode 100644 mingw/include/c++/3.4.2/debug/hash_set delete mode 100644 mingw/include/c++/3.4.2/debug/hash_set.h delete mode 100644 mingw/include/c++/3.4.2/debug/list delete mode 100644 mingw/include/c++/3.4.2/debug/map delete mode 100644 mingw/include/c++/3.4.2/debug/map.h delete mode 100644 mingw/include/c++/3.4.2/debug/multimap.h delete mode 100644 mingw/include/c++/3.4.2/debug/multiset.h delete mode 100644 mingw/include/c++/3.4.2/debug/safe_base.h delete mode 100644 mingw/include/c++/3.4.2/debug/safe_iterator.h delete mode 100644 mingw/include/c++/3.4.2/debug/safe_iterator.tcc delete mode 100644 mingw/include/c++/3.4.2/debug/safe_sequence.h delete mode 100644 mingw/include/c++/3.4.2/debug/set delete mode 100644 mingw/include/c++/3.4.2/debug/set.h delete mode 100644 mingw/include/c++/3.4.2/debug/string delete mode 100644 mingw/include/c++/3.4.2/debug/vector delete mode 100644 mingw/include/c++/3.4.2/deque delete mode 100644 mingw/include/c++/3.4.2/exception delete mode 100644 mingw/include/c++/3.4.2/exception_defines.h delete mode 100644 mingw/include/c++/3.4.2/ext/algorithm delete mode 100644 mingw/include/c++/3.4.2/ext/bitmap_allocator.h delete mode 100644 mingw/include/c++/3.4.2/ext/debug_allocator.h delete mode 100644 mingw/include/c++/3.4.2/ext/demangle.h delete mode 100644 mingw/include/c++/3.4.2/ext/enc_filebuf.h delete mode 100644 mingw/include/c++/3.4.2/ext/functional delete mode 100644 mingw/include/c++/3.4.2/ext/hash_fun.h delete mode 100644 mingw/include/c++/3.4.2/ext/hash_map delete mode 100644 mingw/include/c++/3.4.2/ext/hash_set delete mode 100644 mingw/include/c++/3.4.2/ext/hashtable.h delete mode 100644 mingw/include/c++/3.4.2/ext/iterator delete mode 100644 mingw/include/c++/3.4.2/ext/malloc_allocator.h delete mode 100644 mingw/include/c++/3.4.2/ext/memory delete mode 100644 mingw/include/c++/3.4.2/ext/mt_allocator.h delete mode 100644 mingw/include/c++/3.4.2/ext/new_allocator.h delete mode 100644 mingw/include/c++/3.4.2/ext/numeric delete mode 100644 mingw/include/c++/3.4.2/ext/pod_char_traits.h delete mode 100644 mingw/include/c++/3.4.2/ext/pool_allocator.h delete mode 100644 mingw/include/c++/3.4.2/ext/rb_tree delete mode 100644 mingw/include/c++/3.4.2/ext/rope delete mode 100644 mingw/include/c++/3.4.2/ext/ropeimpl.h delete mode 100644 mingw/include/c++/3.4.2/ext/slist delete mode 100644 mingw/include/c++/3.4.2/ext/stdio_filebuf.h delete mode 100644 mingw/include/c++/3.4.2/ext/stdio_sync_filebuf.h delete mode 100644 mingw/include/c++/3.4.2/fstream delete mode 100644 mingw/include/c++/3.4.2/functional delete mode 100644 mingw/include/c++/3.4.2/iomanip delete mode 100644 mingw/include/c++/3.4.2/ios delete mode 100644 mingw/include/c++/3.4.2/iosfwd delete mode 100644 mingw/include/c++/3.4.2/iostream delete mode 100644 mingw/include/c++/3.4.2/istream delete mode 100644 mingw/include/c++/3.4.2/iterator delete mode 100644 mingw/include/c++/3.4.2/limits delete mode 100644 mingw/include/c++/3.4.2/list delete mode 100644 mingw/include/c++/3.4.2/locale delete mode 100644 mingw/include/c++/3.4.2/map delete mode 100644 mingw/include/c++/3.4.2/memory delete mode 100644 mingw/include/c++/3.4.2/mingw32/bits/atomic_word.h delete mode 100644 mingw/include/c++/3.4.2/mingw32/bits/basic_file.h delete mode 100644 mingw/include/c++/3.4.2/mingw32/bits/c++allocator.h delete mode 100644 mingw/include/c++/3.4.2/mingw32/bits/c++config.h delete mode 100644 mingw/include/c++/3.4.2/mingw32/bits/c++io.h delete mode 100644 mingw/include/c++/3.4.2/mingw32/bits/c++locale.h delete mode 100644 mingw/include/c++/3.4.2/mingw32/bits/codecvt_specializations.h delete mode 100644 mingw/include/c++/3.4.2/mingw32/bits/ctype_base.h delete mode 100644 mingw/include/c++/3.4.2/mingw32/bits/ctype_inline.h delete mode 100644 mingw/include/c++/3.4.2/mingw32/bits/ctype_noninline.h delete mode 100644 mingw/include/c++/3.4.2/mingw32/bits/gthr-default.h delete mode 100644 mingw/include/c++/3.4.2/mingw32/bits/gthr-posix.h delete mode 100644 mingw/include/c++/3.4.2/mingw32/bits/gthr-single.h delete mode 100644 mingw/include/c++/3.4.2/mingw32/bits/gthr.h delete mode 100644 mingw/include/c++/3.4.2/mingw32/bits/messages_members.h delete mode 100644 mingw/include/c++/3.4.2/mingw32/bits/os_defines.h delete mode 100644 mingw/include/c++/3.4.2/mingw32/bits/time_members.h delete mode 100644 mingw/include/c++/3.4.2/new delete mode 100644 mingw/include/c++/3.4.2/numeric delete mode 100644 mingw/include/c++/3.4.2/ostream delete mode 100644 mingw/include/c++/3.4.2/queue delete mode 100644 mingw/include/c++/3.4.2/set delete mode 100644 mingw/include/c++/3.4.2/sstream delete mode 100644 mingw/include/c++/3.4.2/stack delete mode 100644 mingw/include/c++/3.4.2/stdexcept delete mode 100644 mingw/include/c++/3.4.2/streambuf delete mode 100644 mingw/include/c++/3.4.2/string delete mode 100644 mingw/include/c++/3.4.2/typeinfo delete mode 100644 mingw/include/c++/3.4.2/utility delete mode 100644 mingw/include/c++/3.4.2/valarray delete mode 100644 mingw/include/c++/3.4.2/vector delete mode 100644 mingw/include/cmnquery.h delete mode 100644 mingw/include/comcat.h delete mode 100644 mingw/include/commctrl.h delete mode 100644 mingw/include/complex.h delete mode 100644 mingw/include/conio.h delete mode 100644 mingw/include/control.h delete mode 100644 mingw/include/cpl.h delete mode 100644 mingw/include/cplext.h delete mode 100644 mingw/include/custcntl.h delete mode 100644 mingw/include/d3d9.h delete mode 100644 mingw/include/d3d9caps.h delete mode 100644 mingw/include/d3d9types.h delete mode 100644 mingw/include/dbt.h delete mode 100644 mingw/include/ddk/atm.h delete mode 100644 mingw/include/ddk/batclass.h delete mode 100644 mingw/include/ddk/cfg.h delete mode 100644 mingw/include/ddk/cfgmgr32.h delete mode 100644 mingw/include/ddk/d4drvif.h delete mode 100644 mingw/include/ddk/d4iface.h delete mode 100644 mingw/include/ddk/ddkmapi.h delete mode 100644 mingw/include/ddk/hidclass.h delete mode 100644 mingw/include/ddk/hidpi.h delete mode 100644 mingw/include/ddk/hidsdi.h delete mode 100644 mingw/include/ddk/hidusage.h delete mode 100644 mingw/include/ddk/kbdmou.h delete mode 100644 mingw/include/ddk/mcd.h delete mode 100644 mingw/include/ddk/miniport.h delete mode 100644 mingw/include/ddk/minitape.h delete mode 100644 mingw/include/ddk/mountdev.h delete mode 100644 mingw/include/ddk/mountmgr.h delete mode 100644 mingw/include/ddk/ndis.h delete mode 100644 mingw/include/ddk/ndisguid.h delete mode 100644 mingw/include/ddk/ndistapi.h delete mode 100644 mingw/include/ddk/ndiswan.h delete mode 100644 mingw/include/ddk/netevent.h delete mode 100644 mingw/include/ddk/netpnp.h delete mode 100644 mingw/include/ddk/newdev.h delete mode 100644 mingw/include/ddk/ntapi.h delete mode 100644 mingw/include/ddk/ntdd8042.h delete mode 100644 mingw/include/ddk/ntddbeep.h delete mode 100644 mingw/include/ddk/ntddcdrm.h delete mode 100644 mingw/include/ddk/ntddcdvd.h delete mode 100644 mingw/include/ddk/ntddchgr.h delete mode 100644 mingw/include/ddk/ntdddisk.h delete mode 100644 mingw/include/ddk/ntddk.h delete mode 100644 mingw/include/ddk/ntddkbd.h delete mode 100644 mingw/include/ddk/ntddmou.h delete mode 100644 mingw/include/ddk/ntddndis.h delete mode 100644 mingw/include/ddk/ntddpar.h delete mode 100644 mingw/include/ddk/ntddpcm.h delete mode 100644 mingw/include/ddk/ntddscsi.h delete mode 100644 mingw/include/ddk/ntddser.h delete mode 100644 mingw/include/ddk/ntddstor.h delete mode 100644 mingw/include/ddk/ntddtape.h delete mode 100644 mingw/include/ddk/ntddtdi.h delete mode 100644 mingw/include/ddk/ntddvdeo.h delete mode 100644 mingw/include/ddk/ntddvol.h delete mode 100644 mingw/include/ddk/ntifs.h delete mode 100644 mingw/include/ddk/ntpoapi.h delete mode 100644 mingw/include/ddk/ntstatus.h delete mode 100644 mingw/include/ddk/parallel.h delete mode 100644 mingw/include/ddk/pfhook.h delete mode 100644 mingw/include/ddk/poclass.h delete mode 100644 mingw/include/ddk/scsi.h delete mode 100644 mingw/include/ddk/scsiscan.h delete mode 100644 mingw/include/ddk/scsiwmi.h delete mode 100644 mingw/include/ddk/smbus.h delete mode 100644 mingw/include/ddk/srb.h delete mode 100644 mingw/include/ddk/storport.h delete mode 100644 mingw/include/ddk/tdi.h delete mode 100644 mingw/include/ddk/tdiinfo.h delete mode 100644 mingw/include/ddk/tdikrnl.h delete mode 100644 mingw/include/ddk/tdistat.h delete mode 100644 mingw/include/ddk/tvout.h delete mode 100644 mingw/include/ddk/upssvc.h delete mode 100644 mingw/include/ddk/usb.h delete mode 100644 mingw/include/ddk/usb100.h delete mode 100644 mingw/include/ddk/usbcamdi.h delete mode 100644 mingw/include/ddk/usbdi.h delete mode 100644 mingw/include/ddk/usbioctl.h delete mode 100644 mingw/include/ddk/usbiodef.h delete mode 100644 mingw/include/ddk/usbscan.h delete mode 100644 mingw/include/ddk/usbuser.h delete mode 100644 mingw/include/ddk/video.h delete mode 100644 mingw/include/ddk/videoagp.h delete mode 100644 mingw/include/ddk/win2k.h delete mode 100644 mingw/include/ddk/winddi.h delete mode 100644 mingw/include/ddk/winddk.h delete mode 100644 mingw/include/ddk/winnt4.h delete mode 100644 mingw/include/ddk/winxp.h delete mode 100644 mingw/include/ddk/ws2san.h delete mode 100644 mingw/include/ddk/xfilter.h delete mode 100644 mingw/include/devguid.h delete mode 100644 mingw/include/dhcpcsdk.h delete mode 100644 mingw/include/dir.h delete mode 100644 mingw/include/direct.h delete mode 100644 mingw/include/dis-asm.h delete mode 100644 mingw/include/docobj.h delete mode 100644 mingw/include/dos.h delete mode 100644 mingw/include/dsadmin.h delete mode 100644 mingw/include/dsclient.h delete mode 100644 mingw/include/dsgetdc.h delete mode 100644 mingw/include/dshow.h delete mode 100644 mingw/include/dsquery.h delete mode 100644 mingw/include/dsrole.h delete mode 100644 mingw/include/dvdevcod.h delete mode 100644 mingw/include/dvdmedia.h delete mode 100644 mingw/include/dxerr8.h delete mode 100644 mingw/include/dxerr9.h delete mode 100644 mingw/include/edevdefs.h delete mode 100644 mingw/include/errorrep.h delete mode 100644 mingw/include/errors.h delete mode 100644 mingw/include/evcode.h delete mode 100644 mingw/include/excpt.h delete mode 100644 mingw/include/exdisp.h delete mode 100644 mingw/include/exdispid.h delete mode 100644 mingw/include/fenv.h delete mode 100644 mingw/include/float.h delete mode 100644 mingw/include/fltdefs.h delete mode 100644 mingw/include/gmon.h delete mode 100644 mingw/include/httpext.h delete mode 100644 mingw/include/icm.h delete mode 100644 mingw/include/idispids.h delete mode 100644 mingw/include/il21dec.h delete mode 100644 mingw/include/imagehlp.h delete mode 100644 mingw/include/initguid.h delete mode 100644 mingw/include/intshcut.h delete mode 100644 mingw/include/inttypes.h delete mode 100644 mingw/include/ipexport.h delete mode 100644 mingw/include/iphlpapi.h delete mode 100644 mingw/include/ipifcons.h delete mode 100644 mingw/include/ipinfoid.h delete mode 100644 mingw/include/iprtrmib.h delete mode 100644 mingw/include/iptypes.h delete mode 100644 mingw/include/ipxconst.h delete mode 100644 mingw/include/ipxrtdef.h delete mode 100644 mingw/include/ipxtfflt.h delete mode 100644 mingw/include/isguids.h delete mode 100644 mingw/include/ks.h delete mode 100644 mingw/include/ksmedia.h delete mode 100644 mingw/include/largeint.h delete mode 100644 mingw/include/libgen.h delete mode 100644 mingw/include/lm.h delete mode 100644 mingw/include/lmaccess.h delete mode 100644 mingw/include/lmalert.h delete mode 100644 mingw/include/lmapibuf.h delete mode 100644 mingw/include/lmat.h delete mode 100644 mingw/include/lmaudit.h delete mode 100644 mingw/include/lmbrowsr.h delete mode 100644 mingw/include/lmchdev.h delete mode 100644 mingw/include/lmconfig.h delete mode 100644 mingw/include/lmcons.h delete mode 100644 mingw/include/lmerr.h delete mode 100644 mingw/include/lmerrlog.h delete mode 100644 mingw/include/lmmsg.h delete mode 100644 mingw/include/lmremutl.h delete mode 100644 mingw/include/lmrepl.h delete mode 100644 mingw/include/lmserver.h delete mode 100644 mingw/include/lmshare.h delete mode 100644 mingw/include/lmsname.h delete mode 100644 mingw/include/lmstats.h delete mode 100644 mingw/include/lmsvc.h delete mode 100644 mingw/include/lmuse.h delete mode 100644 mingw/include/lmuseflg.h delete mode 100644 mingw/include/lmwksta.h delete mode 100644 mingw/include/locale.h delete mode 100644 mingw/include/malloc.h delete mode 100644 mingw/include/mapi.h delete mode 100644 mingw/include/math.h delete mode 100644 mingw/include/mbctype.h delete mode 100644 mingw/include/mbstring.h delete mode 100644 mingw/include/mciavi.h delete mode 100644 mingw/include/mcx.h delete mode 100644 mingw/include/mem.h delete mode 100644 mingw/include/memory.h delete mode 100644 mingw/include/mgm.h delete mode 100644 mingw/include/mgmtapi.h delete mode 100644 mingw/include/mlang.h delete mode 100644 mingw/include/mmreg.h delete mode 100644 mingw/include/mpegtype.h delete mode 100644 mingw/include/mprapi.h delete mode 100644 mingw/include/mq.h delete mode 100644 mingw/include/msacm.h delete mode 100644 mingw/include/mshtml.h delete mode 100644 mingw/include/mswsock.h delete mode 100644 mingw/include/nddeapi.h delete mode 100644 mingw/include/nspapi.h delete mode 100644 mingw/include/ntdef.h delete mode 100644 mingw/include/ntdll.h delete mode 100644 mingw/include/ntdsapi.h delete mode 100644 mingw/include/ntdsbcli.h delete mode 100644 mingw/include/ntldap.h delete mode 100644 mingw/include/ntsecapi.h delete mode 100644 mingw/include/ntsecpkg.h delete mode 100644 mingw/include/objsafe.h delete mode 100644 mingw/include/objsel.h delete mode 100644 mingw/include/ocidl.h delete mode 100644 mingw/include/odbcinst.h delete mode 100644 mingw/include/ole.h delete mode 100644 mingw/include/ole2ver.h delete mode 100644 mingw/include/oleacc.h delete mode 100644 mingw/include/olectl.h delete mode 100644 mingw/include/oledlg.h delete mode 100644 mingw/include/pbt.h delete mode 100644 mingw/include/powrprof.h delete mode 100644 mingw/include/profil.h delete mode 100644 mingw/include/profile.h delete mode 100644 mingw/include/prsht.h delete mode 100644 mingw/include/psapi.h delete mode 100644 mingw/include/pshpack1.h delete mode 100644 mingw/include/pshpack8.h delete mode 100644 mingw/include/qedit.h delete mode 100644 mingw/include/rapi.h delete mode 100644 mingw/include/ras.h delete mode 100644 mingw/include/rasdlg.h delete mode 100644 mingw/include/raserror.h delete mode 100644 mingw/include/rassapi.h delete mode 100644 mingw/include/reason.h delete mode 100644 mingw/include/regstr.h delete mode 100644 mingw/include/richedit.h delete mode 100644 mingw/include/richole.h delete mode 100644 mingw/include/routprot.h delete mode 100644 mingw/include/rpcdce2.h delete mode 100644 mingw/include/rpcproxy.h delete mode 100644 mingw/include/rtutils.h delete mode 100644 mingw/include/schannel.h delete mode 100644 mingw/include/schnlsp.h delete mode 100644 mingw/include/scrnsave.h delete mode 100644 mingw/include/sddl.h delete mode 100644 mingw/include/search.h delete mode 100644 mingw/include/secext.h delete mode 100644 mingw/include/security.h delete mode 100644 mingw/include/servprov.h delete mode 100644 mingw/include/setjmp.h delete mode 100644 mingw/include/setupapi.h delete mode 100644 mingw/include/share.h delete mode 100644 mingw/include/shldisp.h delete mode 100644 mingw/include/shlguid.h delete mode 100644 mingw/include/shlobj.h delete mode 100644 mingw/include/shlwapi.h delete mode 100644 mingw/include/snmp.h delete mode 100644 mingw/include/sql.h delete mode 100644 mingw/include/sqlext.h delete mode 100644 mingw/include/sqltypes.h delete mode 100644 mingw/include/sqlucode.h delete mode 100644 mingw/include/sspi.h delete mode 100644 mingw/include/stm.h delete mode 100644 mingw/include/strmif.h delete mode 100644 mingw/include/subauth.h delete mode 100644 mingw/include/svcguid.h delete mode 100644 mingw/include/symcat.h delete mode 100644 mingw/include/sys/fcntl.h delete mode 100644 mingw/include/sys/file.h delete mode 100644 mingw/include/sys/locking.h delete mode 100644 mingw/include/sys/timeb.h delete mode 100644 mingw/include/sys/unistd.h delete mode 100644 mingw/include/tchar.h delete mode 100644 mingw/include/tcl.h delete mode 100644 mingw/include/tclDecls.h delete mode 100644 mingw/include/tclPlatDecls.h delete mode 100644 mingw/include/tk.h delete mode 100644 mingw/include/tkDecls.h delete mode 100644 mingw/include/tkIntXlibDecls.h delete mode 100644 mingw/include/tkPlatDecls.h delete mode 100644 mingw/include/tlhelp32.h delete mode 100644 mingw/include/tmschema.h delete mode 100644 mingw/include/userenv.h delete mode 100644 mingw/include/usp10.h delete mode 100644 mingw/include/uxtheme.h delete mode 100644 mingw/include/values.h delete mode 100644 mingw/include/varargs.h delete mode 100644 mingw/include/vfw.h delete mode 100644 mingw/include/vidcap.h delete mode 100644 mingw/include/vmr9.h delete mode 100644 mingw/include/vptype.h delete mode 100644 mingw/include/w32api.h delete mode 100644 mingw/include/wchar.h delete mode 100644 mingw/include/wctype.h delete mode 100644 mingw/include/winable.h delete mode 100644 mingw/include/winber.h delete mode 100644 mingw/include/wincrypt.h delete mode 100644 mingw/include/windns.h delete mode 100644 mingw/include/windowsx.h delete mode 100644 mingw/include/wininet.h delete mode 100644 mingw/include/winioctl.h delete mode 100644 mingw/include/winldap.h delete mode 100644 mingw/include/winresrc.h delete mode 100644 mingw/include/winsnmp.h delete mode 100644 mingw/include/winsock.h delete mode 100644 mingw/include/ws2spi.h delete mode 100644 mingw/include/ws2tcpip.h delete mode 100644 mingw/include/wsahelp.h delete mode 100644 mingw/include/wsipx.h delete mode 100644 mingw/include/wsnetbs.h delete mode 100644 mingw/include/wtsapi32.h delete mode 100644 mingw/include/xprtdefs.h delete mode 100644 mingw/include/zmouse.h delete mode 100644 mingw/info/as.info delete mode 100644 mingw/info/as.info-1 delete mode 100644 mingw/info/bfd.info delete mode 100644 mingw/info/bfd.info-1 delete mode 100644 mingw/info/binutils.info delete mode 100644 mingw/info/binutils.info-1 delete mode 100644 mingw/info/configure.info delete mode 100644 mingw/info/configure.info-1 delete mode 100644 mingw/info/cpp.info delete mode 100644 mingw/info/cppinternals.info delete mode 100644 mingw/info/dir delete mode 100644 mingw/info/gcc.info delete mode 100644 mingw/info/gccinstall.info delete mode 100644 mingw/info/gccint.info delete mode 100644 mingw/info/gdb/A-code-overlay.html delete mode 100644 mingw/info/gdb/A29K.html delete mode 100644 mingw/info/gdb/ARM.html delete mode 100644 mingw/info/gdb/Active-Targets.html delete mode 100644 mingw/info/gdb/Alpha.html delete mode 100644 mingw/info/gdb/Altering.html delete mode 100644 mingw/info/gdb/Analyze-Collected-Data.html delete mode 100644 mingw/info/gdb/Annotations-Overview.html delete mode 100644 mingw/info/gdb/Annotations-for-Running.html delete mode 100644 mingw/info/gdb/Annotations.html delete mode 100644 mingw/info/gdb/Architectures.html delete mode 100644 mingw/info/gdb/Arguments.html delete mode 100644 mingw/info/gdb/Arrays.html delete mode 100644 mingw/info/gdb/Assignment.html delete mode 100644 mingw/info/gdb/Attach.html delete mode 100644 mingw/info/gdb/Auto-Display.html delete mode 100644 mingw/info/gdb/Automatic-Overlay-Debugging.html delete mode 100644 mingw/info/gdb/Automatically.html delete mode 100644 mingw/info/gdb/Backtrace.html delete mode 100644 mingw/info/gdb/Bindable-Readline-Commands.html delete mode 100644 mingw/info/gdb/Bootstrapping.html delete mode 100644 mingw/info/gdb/Break-Commands.html delete mode 100644 mingw/info/gdb/Breakpoint-Info.html delete mode 100644 mingw/info/gdb/Breakpoint-Menus.html delete mode 100644 mingw/info/gdb/Breakpoints.html delete mode 100644 mingw/info/gdb/Bug-Criteria.html delete mode 100644 mingw/info/gdb/Bug-Reporting.html delete mode 100644 mingw/info/gdb/Built-In-Func-Proc.html delete mode 100644 mingw/info/gdb/Byte-Order.html delete mode 100644 mingw/info/gdb/C-Checks.html delete mode 100644 mingw/info/gdb/C-Constants.html delete mode 100644 mingw/info/gdb/C-Defaults.html delete mode 100644 mingw/info/gdb/C-Operators.html delete mode 100644 mingw/info/gdb/C-plus-plus-expressions.html delete mode 100644 mingw/info/gdb/C.html delete mode 100644 mingw/info/gdb/Calling.html delete mode 100644 mingw/info/gdb/Checks.html delete mode 100644 mingw/info/gdb/Chill-defaults.html delete mode 100644 mingw/info/gdb/Chill-type-and-range-checks.html delete mode 100644 mingw/info/gdb/Chill.html delete mode 100644 mingw/info/gdb/Command-Files.html delete mode 100644 mingw/info/gdb/Command-Line-Editing.html delete mode 100644 mingw/info/gdb/Command-Syntax.html delete mode 100644 mingw/info/gdb/Commands-For-Completion.html delete mode 100644 mingw/info/gdb/Commands-For-History.html delete mode 100644 mingw/info/gdb/Commands-For-Killing.html delete mode 100644 mingw/info/gdb/Commands-For-Moving.html delete mode 100644 mingw/info/gdb/Commands-For-Text.html delete mode 100644 mingw/info/gdb/Commands.html delete mode 100644 mingw/info/gdb/Compilation.html delete mode 100644 mingw/info/gdb/Completion.html delete mode 100644 mingw/info/gdb/Conditional-Init-Constructs.html delete mode 100644 mingw/info/gdb/Conditions.html delete mode 100644 mingw/info/gdb/Config-Names.html delete mode 100644 mingw/info/gdb/Configurations.html delete mode 100644 mingw/info/gdb/Configure-Options.html delete mode 100644 mingw/info/gdb/Continuing-and-Stepping.html delete mode 100644 mingw/info/gdb/Contributors.html delete mode 100644 mingw/info/gdb/Controlling-GDB.html delete mode 100644 mingw/info/gdb/Convenience-Vars.html delete mode 100644 mingw/info/gdb/Copying.html delete mode 100644 mingw/info/gdb/Create-and-Delete-Tracepoints.html delete mode 100644 mingw/info/gdb/Cygwin-Native.html delete mode 100644 mingw/info/gdb/DJGPP-Native.html delete mode 100644 mingw/info/gdb/Data.html delete mode 100644 mingw/info/gdb/Debug-Session.html delete mode 100644 mingw/info/gdb/Debugging-C-plus-plus.html delete mode 100644 mingw/info/gdb/Debugging-C.html delete mode 100644 mingw/info/gdb/Debugging-Output.html delete mode 100644 mingw/info/gdb/Define.html delete mode 100644 mingw/info/gdb/Delete-Breaks.html delete mode 100644 mingw/info/gdb/Deviations.html delete mode 100644 mingw/info/gdb/Disabling.html delete mode 100644 mingw/info/gdb/Displays.html delete mode 100644 mingw/info/gdb/Editing.html delete mode 100644 mingw/info/gdb/Emacs.html delete mode 100644 mingw/info/gdb/Embedded-OS.html delete mode 100644 mingw/info/gdb/Embedded-Processors.html delete mode 100644 mingw/info/gdb/Enable-and-Disable-Tracepoints.html delete mode 100644 mingw/info/gdb/Environment.html delete mode 100644 mingw/info/gdb/Error-in-Breakpoints.html delete mode 100644 mingw/info/gdb/Errors.html delete mode 100644 mingw/info/gdb/Event-Designators.html delete mode 100644 mingw/info/gdb/Expressions.html delete mode 100644 mingw/info/gdb/File-Options.html delete mode 100644 mingw/info/gdb/Filenames.html delete mode 100644 mingw/info/gdb/Files.html delete mode 100644 mingw/info/gdb/Floating-Point-Hardware.html delete mode 100644 mingw/info/gdb/Formatting-Documentation.html delete mode 100644 mingw/info/gdb/Frame-Annotations.html delete mode 100644 mingw/info/gdb/Frame-Info.html delete mode 100644 mingw/info/gdb/Frames.html delete mode 100644 mingw/info/gdb/Free-Software.html delete mode 100644 mingw/info/gdb/GDB-Bugs.html delete mode 100644 mingw/info/gdb/GDB-Files.html delete mode 100644 mingw/info/gdb/GDB-M2.html delete mode 100644 mingw/info/gdb/GDB-MI-Breakpoint-Table-Commands.html delete mode 100644 mingw/info/gdb/GDB-MI-Command-Description-Format.html delete mode 100644 mingw/info/gdb/GDB-MI-Command-Syntax.html delete mode 100644 mingw/info/gdb/GDB-MI-Compatibility-with-CLI.html delete mode 100644 mingw/info/gdb/GDB-MI-Data-Manipulation.html delete mode 100644 mingw/info/gdb/GDB-MI-Input-Syntax.html delete mode 100644 mingw/info/gdb/GDB-MI-Miscellaneous-Commands.html delete mode 100644 mingw/info/gdb/GDB-MI-Out-of-band-Records.html delete mode 100644 mingw/info/gdb/GDB-MI-Output-Records.html delete mode 100644 mingw/info/gdb/GDB-MI-Output-Syntax.html delete mode 100644 mingw/info/gdb/GDB-MI-Program-Control.html delete mode 100644 mingw/info/gdb/GDB-MI-Result-Records.html delete mode 100644 mingw/info/gdb/GDB-MI-Simple-Examples.html delete mode 100644 mingw/info/gdb/GDB-MI-Stack-Manipulation.html delete mode 100644 mingw/info/gdb/GDB-MI-Stream-Records.html delete mode 100644 mingw/info/gdb/GDB-MI-Symbol-Query.html delete mode 100644 mingw/info/gdb/GDB-MI-Target-Manipulation.html delete mode 100644 mingw/info/gdb/GDB-MI-Thread-Commands.html delete mode 100644 mingw/info/gdb/GDB-MI-Tracepoint-Commands.html delete mode 100644 mingw/info/gdb/GDB-MI-Variable-Objects.html delete mode 100644 mingw/info/gdb/GDB-MI.html delete mode 100644 mingw/info/gdb/GNU-Free-Documentation-License.html delete mode 100644 mingw/info/gdb/H8-300.html delete mode 100644 mingw/info/gdb/H8-500.html delete mode 100644 mingw/info/gdb/HP-UX.html delete mode 100644 mingw/info/gdb/Help.html delete mode 100644 mingw/info/gdb/History-Interaction.html delete mode 100644 mingw/info/gdb/History.html delete mode 100644 mingw/info/gdb/Hitachi-Boards.html delete mode 100644 mingw/info/gdb/Hitachi-ICE.html delete mode 100644 mingw/info/gdb/Hitachi-Special.html delete mode 100644 mingw/info/gdb/Hooks.html delete mode 100644 mingw/info/gdb/How-Overlays-Work.html delete mode 100644 mingw/info/gdb/How-modes-are-displayed.html delete mode 100644 mingw/info/gdb/Index.html delete mode 100644 mingw/info/gdb/Input-Output.html delete mode 100644 mingw/info/gdb/Installing-GDB.html delete mode 100644 mingw/info/gdb/Introduction-and-Notation.html delete mode 100644 mingw/info/gdb/Invalidation.html delete mode 100644 mingw/info/gdb/Invocation.html delete mode 100644 mingw/info/gdb/Invoking-GDB.html delete mode 100644 mingw/info/gdb/Jumping.html delete mode 100644 mingw/info/gdb/KOD.html delete mode 100644 mingw/info/gdb/Keyboard-Macros.html delete mode 100644 mingw/info/gdb/Kill-Process.html delete mode 100644 mingw/info/gdb/Languages.html delete mode 100644 mingw/info/gdb/List.html delete mode 100644 mingw/info/gdb/Listing-Tracepoints.html delete mode 100644 mingw/info/gdb/Locations.html delete mode 100644 mingw/info/gdb/M2-Checks.html delete mode 100644 mingw/info/gdb/M2-Constants.html delete mode 100644 mingw/info/gdb/M2-Defaults.html delete mode 100644 mingw/info/gdb/M2-Operators.html delete mode 100644 mingw/info/gdb/M2-Scope.html delete mode 100644 mingw/info/gdb/M32R-D.html delete mode 100644 mingw/info/gdb/M68K.html delete mode 100644 mingw/info/gdb/M88K.html delete mode 100644 mingw/info/gdb/MIPS-Embedded.html delete mode 100644 mingw/info/gdb/MIPS.html delete mode 100644 mingw/info/gdb/Machine-Code.html delete mode 100644 mingw/info/gdb/Maintenance-Commands.html delete mode 100644 mingw/info/gdb/Manually.html delete mode 100644 mingw/info/gdb/Memory-Region-Attributes.html delete mode 100644 mingw/info/gdb/Memory.html delete mode 100644 mingw/info/gdb/Messages-Warnings.html delete mode 100644 mingw/info/gdb/Miscellaneous-Commands.html delete mode 100644 mingw/info/gdb/Mode-Options.html delete mode 100644 mingw/info/gdb/Modifiers.html delete mode 100644 mingw/info/gdb/Modula-2.html delete mode 100644 mingw/info/gdb/Native.html delete mode 100644 mingw/info/gdb/NetWare.html delete mode 100644 mingw/info/gdb/Nindy-Options.html delete mode 100644 mingw/info/gdb/Nindy-Reset.html delete mode 100644 mingw/info/gdb/Nindy-Startup.html delete mode 100644 mingw/info/gdb/Numbers.html delete mode 100644 mingw/info/gdb/Numeric-Arguments.html delete mode 100644 mingw/info/gdb/Output-Formats.html delete mode 100644 mingw/info/gdb/Output.html delete mode 100644 mingw/info/gdb/Overlay-Commands.html delete mode 100644 mingw/info/gdb/Overlay-Sample-Program.html delete mode 100644 mingw/info/gdb/Overlays.html delete mode 100644 mingw/info/gdb/PA.html delete mode 100644 mingw/info/gdb/Patching.html delete mode 100644 mingw/info/gdb/PowerPC.html delete mode 100644 mingw/info/gdb/Print-Settings.html delete mode 100644 mingw/info/gdb/Processes.html delete mode 100644 mingw/info/gdb/Prompt.html delete mode 100644 mingw/info/gdb/Prompting.html delete mode 100644 mingw/info/gdb/Quitting-GDB.html delete mode 100644 mingw/info/gdb/Range-Checking.html delete mode 100644 mingw/info/gdb/Readline-Arguments.html delete mode 100644 mingw/info/gdb/Readline-Bare-Essentials.html delete mode 100644 mingw/info/gdb/Readline-Init-File-Syntax.html delete mode 100644 mingw/info/gdb/Readline-Init-File.html delete mode 100644 mingw/info/gdb/Readline-Interaction.html delete mode 100644 mingw/info/gdb/Readline-Killing-Commands.html delete mode 100644 mingw/info/gdb/Readline-Movement-Commands.html delete mode 100644 mingw/info/gdb/Readline-vi-Mode.html delete mode 100644 mingw/info/gdb/Registers.html delete mode 100644 mingw/info/gdb/Remote-Debugging.html delete mode 100644 mingw/info/gdb/Remote-Protocol.html delete mode 100644 mingw/info/gdb/Remote.html delete mode 100644 mingw/info/gdb/Returning.html delete mode 100644 mingw/info/gdb/Running.html delete mode 100644 mingw/info/gdb/SH.html delete mode 100644 mingw/info/gdb/ST2000.html delete mode 100644 mingw/info/gdb/SVR4-Process-Information.html delete mode 100644 mingw/info/gdb/Sample-Init-File.html delete mode 100644 mingw/info/gdb/Sample-Session.html delete mode 100644 mingw/info/gdb/Screen-Size.html delete mode 100644 mingw/info/gdb/Search.html delete mode 100644 mingw/info/gdb/Searching.html delete mode 100644 mingw/info/gdb/Selection.html delete mode 100644 mingw/info/gdb/Separate-Objdir.html delete mode 100644 mingw/info/gdb/Sequences.html delete mode 100644 mingw/info/gdb/Server-Prefix.html delete mode 100644 mingw/info/gdb/Server.html delete mode 100644 mingw/info/gdb/Set-Breaks.html delete mode 100644 mingw/info/gdb/Set-Catchpoints.html delete mode 100644 mingw/info/gdb/Set-Tracepoints.html delete mode 100644 mingw/info/gdb/Set-Watchpoints.html delete mode 100644 mingw/info/gdb/Setting.html delete mode 100644 mingw/info/gdb/Shell-Commands.html delete mode 100644 mingw/info/gdb/Show.html delete mode 100644 mingw/info/gdb/Signaling.html delete mode 100644 mingw/info/gdb/Signals.html delete mode 100644 mingw/info/gdb/Source-Annotations.html delete mode 100644 mingw/info/gdb/Source-Path.html delete mode 100644 mingw/info/gdb/Source.html delete mode 100644 mingw/info/gdb/Sparclet-Connection.html delete mode 100644 mingw/info/gdb/Sparclet-Download.html delete mode 100644 mingw/info/gdb/Sparclet-Execution.html delete mode 100644 mingw/info/gdb/Sparclet-File.html delete mode 100644 mingw/info/gdb/Sparclet.html delete mode 100644 mingw/info/gdb/Sparclite.html delete mode 100644 mingw/info/gdb/Stack.html delete mode 100644 mingw/info/gdb/Starting-and-Stopping-Trace-Experiment.html delete mode 100644 mingw/info/gdb/Starting.html delete mode 100644 mingw/info/gdb/Stopping.html delete mode 100644 mingw/info/gdb/Stub-Contents.html delete mode 100644 mingw/info/gdb/Summary.html delete mode 100644 mingw/info/gdb/Support.html delete mode 100644 mingw/info/gdb/Symbol-Errors.html delete mode 100644 mingw/info/gdb/Symbols.html delete mode 100644 mingw/info/gdb/TODO.html delete mode 100644 mingw/info/gdb/TUI-Commands.html delete mode 100644 mingw/info/gdb/TUI-Configuration.html delete mode 100644 mingw/info/gdb/TUI-Keys.html delete mode 100644 mingw/info/gdb/TUI-Overview.html delete mode 100644 mingw/info/gdb/TUI.html delete mode 100644 mingw/info/gdb/Target-Commands.html delete mode 100644 mingw/info/gdb/Targets.html delete mode 100644 mingw/info/gdb/Thread-Stops.html delete mode 100644 mingw/info/gdb/Threads.html delete mode 100644 mingw/info/gdb/Tracepoint-Actions.html delete mode 100644 mingw/info/gdb/Tracepoint-Passcounts.html delete mode 100644 mingw/info/gdb/Tracepoint-Variables.html delete mode 100644 mingw/info/gdb/Tracepoints.html delete mode 100644 mingw/info/gdb/Type-Checking.html delete mode 100644 mingw/info/gdb/Using-History-Interactively.html delete mode 100644 mingw/info/gdb/Value-Annotations.html delete mode 100644 mingw/info/gdb/Value-History.html delete mode 100644 mingw/info/gdb/Values-and-their-Operations.html delete mode 100644 mingw/info/gdb/Variables.html delete mode 100644 mingw/info/gdb/VxWorks-Attach.html delete mode 100644 mingw/info/gdb/VxWorks-Connection.html delete mode 100644 mingw/info/gdb/VxWorks-Download.html delete mode 100644 mingw/info/gdb/VxWorks.html delete mode 100644 mingw/info/gdb/Word-Designators.html delete mode 100644 mingw/info/gdb/Working-Directory.html delete mode 100644 mingw/info/gdb/Z8000.html delete mode 100644 mingw/info/gdb/i960.html delete mode 100644 mingw/info/gdb/maint-info-breakpoints.html delete mode 100644 mingw/info/gdb/remote-stub.html delete mode 100644 mingw/info/gdb/save-tracepoints.html delete mode 100644 mingw/info/gdb/tdump.html delete mode 100644 mingw/info/gdb/tfind.html delete mode 100644 mingw/info/gdbint/Algorithms.html delete mode 100644 mingw/info/gdbint/Coding.html delete mode 100644 mingw/info/gdbint/Debugging-GDB.html delete mode 100644 mingw/info/gdbint/GNU-Free-Documentation-License.html delete mode 100644 mingw/info/gdbint/Getting-Started.html delete mode 100644 mingw/info/gdbint/Hints.html delete mode 100644 mingw/info/gdbint/Host-Definition.html delete mode 100644 mingw/info/gdbint/Index.html delete mode 100644 mingw/info/gdbint/Language-Support.html delete mode 100644 mingw/info/gdbint/Native-Debugging.html delete mode 100644 mingw/info/gdbint/Overall-Structure.html delete mode 100644 mingw/info/gdbint/Porting-GDB.html delete mode 100644 mingw/info/gdbint/Releasing-GDB.html delete mode 100644 mingw/info/gdbint/Requirements.html delete mode 100644 mingw/info/gdbint/Support-Libraries.html delete mode 100644 mingw/info/gdbint/Symbol-Handling.html delete mode 100644 mingw/info/gdbint/Target-Architecture-Definition.html delete mode 100644 mingw/info/gdbint/Target-Vector-Definition.html delete mode 100644 mingw/info/gdbint/Testsuite.html delete mode 100644 mingw/info/gdbint/User-Interface.html delete mode 100644 mingw/info/gdbint/libgdb.html delete mode 100644 mingw/info/gprof.info delete mode 100644 mingw/info/gprof.info-1 delete mode 100644 mingw/info/ld.info delete mode 100644 mingw/info/ld.info-1 delete mode 100644 mingw/info/stabs/Alternate-Entry-Points.html delete mode 100644 mingw/info/stabs/Arrays.html delete mode 100644 mingw/info/stabs/Assembly-Code.html delete mode 100644 mingw/info/stabs/Based-Variables.html delete mode 100644 mingw/info/stabs/Basic-Cplusplus-Types.html delete mode 100644 mingw/info/stabs/Block-Structure.html delete mode 100644 mingw/info/stabs/Builtin-Type-Descriptors.html delete mode 100644 mingw/info/stabs/Builtin-Types.html delete mode 100644 mingw/info/stabs/C-Example.html delete mode 100644 mingw/info/stabs/Class-Instance.html delete mode 100644 mingw/info/stabs/Class-Names.html delete mode 100644 mingw/info/stabs/Common-Blocks.html delete mode 100644 mingw/info/stabs/Conformant-Arrays.html delete mode 100644 mingw/info/stabs/Constants.html delete mode 100644 mingw/info/stabs/Cplusplus.html delete mode 100644 mingw/info/stabs/Cross-References.html delete mode 100644 mingw/info/stabs/ELF-Linker-Relocation.html delete mode 100644 mingw/info/stabs/Enumerations.html delete mode 100644 mingw/info/stabs/Expanded-Reference.html delete mode 100644 mingw/info/stabs/Flow.html delete mode 100644 mingw/info/stabs/Function-Types.html delete mode 100644 mingw/info/stabs/Global-Variables.html delete mode 100644 mingw/info/stabs/Gould.html delete mode 100644 mingw/info/stabs/Include-Files.html delete mode 100644 mingw/info/stabs/Inheritance.html delete mode 100644 mingw/info/stabs/Line-Numbers.html delete mode 100644 mingw/info/stabs/Local-Variable-Parameters.html delete mode 100644 mingw/info/stabs/Main-Program.html delete mode 100644 mingw/info/stabs/Member-Type-Descriptor.html delete mode 100644 mingw/info/stabs/Method-Modifiers.html delete mode 100644 mingw/info/stabs/Method-Type-Descriptor.html delete mode 100644 mingw/info/stabs/Methods.html delete mode 100644 mingw/info/stabs/Miscellaneous-Types.html delete mode 100644 mingw/info/stabs/N_BROWS.html delete mode 100644 mingw/info/stabs/N_CATCH.html delete mode 100644 mingw/info/stabs/N_DEFD.html delete mode 100644 mingw/info/stabs/N_EHDECL.html delete mode 100644 mingw/info/stabs/N_LENG.html delete mode 100644 mingw/info/stabs/N_M2C.html delete mode 100644 mingw/info/stabs/N_MOD2.html delete mode 100644 mingw/info/stabs/N_NOMAP.html delete mode 100644 mingw/info/stabs/N_NSYMS.html delete mode 100644 mingw/info/stabs/N_PC.html delete mode 100644 mingw/info/stabs/N_SCOPE.html delete mode 100644 mingw/info/stabs/N_SSYM.html delete mode 100644 mingw/info/stabs/Negative-Type-Numbers.html delete mode 100644 mingw/info/stabs/Nested-Procedures.html delete mode 100644 mingw/info/stabs/Nested-Symbols.html delete mode 100644 mingw/info/stabs/Non-Stab-Symbol-Types.html delete mode 100644 mingw/info/stabs/Overview.html delete mode 100644 mingw/info/stabs/Parameters.html delete mode 100644 mingw/info/stabs/Procedures.html delete mode 100644 mingw/info/stabs/Program-Structure.html delete mode 100644 mingw/info/stabs/Protections.html delete mode 100644 mingw/info/stabs/Questions.html delete mode 100644 mingw/info/stabs/Reference-Parameters.html delete mode 100644 mingw/info/stabs/Register-Parameters.html delete mode 100644 mingw/info/stabs/Register-Variables.html delete mode 100644 mingw/info/stabs/Simple-Classes.html delete mode 100644 mingw/info/stabs/Source-Files.html delete mode 100644 mingw/info/stabs/Stab-Section-Basics.html delete mode 100644 mingw/info/stabs/Stab-Section-Transformations.html delete mode 100644 mingw/info/stabs/Stab-Sections.html delete mode 100644 mingw/info/stabs/Stab-Symbol-Types.html delete mode 100644 mingw/info/stabs/Stab-Types.html delete mode 100644 mingw/info/stabs/Stabs-Format.html delete mode 100644 mingw/info/stabs/Stack-Variables.html delete mode 100644 mingw/info/stabs/Static-Members.html delete mode 100644 mingw/info/stabs/Statics.html delete mode 100644 mingw/info/stabs/String-Field.html delete mode 100644 mingw/info/stabs/Strings.html delete mode 100644 mingw/info/stabs/Structures.html delete mode 100644 mingw/info/stabs/Subranges.html delete mode 100644 mingw/info/stabs/Symbol-Descriptors.html delete mode 100644 mingw/info/stabs/Symbol-Table-Format.html delete mode 100644 mingw/info/stabs/Symbol-Tables.html delete mode 100644 mingw/info/stabs/Symbol-Types-Index.html delete mode 100644 mingw/info/stabs/Traditional-Builtin-Types.html delete mode 100644 mingw/info/stabs/Traditional-Integer-Types.html delete mode 100644 mingw/info/stabs/Traditional-Other-Types.html delete mode 100644 mingw/info/stabs/Transformations-On-Global-Variables.html delete mode 100644 mingw/info/stabs/Transformations-On-Static-Variables.html delete mode 100644 mingw/info/stabs/Transformations-On-Symbol-Tables.html delete mode 100644 mingw/info/stabs/Type-Descriptors.html delete mode 100644 mingw/info/stabs/Typedefs.html delete mode 100644 mingw/info/stabs/Types.html delete mode 100644 mingw/info/stabs/Unions.html delete mode 100644 mingw/info/stabs/Variables.html delete mode 100644 mingw/info/stabs/Virtual-Base-Classes.html delete mode 100644 mingw/info/stabs/Virtual-Methods.html delete mode 100644 mingw/info/stabs/index.html delete mode 100644 mingw/info/standards.info delete mode 100644 mingw/lib/CRT_fp10.o delete mode 100644 mingw/lib/CRT_fp8.o delete mode 100644 mingw/lib/CRT_noglob.o delete mode 100644 mingw/lib/Img1.3/jpegtcl10.dll delete mode 100644 mingw/lib/Img1.3/libjpegtclstub10.a delete mode 100644 mingw/lib/Img1.3/libpngtclstub1212.a delete mode 100644 mingw/lib/Img1.3/libtifftclstub382.a delete mode 100644 mingw/lib/Img1.3/libtkimgstub13.a delete mode 100644 mingw/lib/Img1.3/libzlibtclstub123.a delete mode 100644 mingw/lib/Img1.3/pkgIndex.tcl delete mode 100644 mingw/lib/Img1.3/pngtcl1212.dll delete mode 100644 mingw/lib/Img1.3/tifftcl382.dll delete mode 100644 mingw/lib/Img1.3/tkimg13.dll delete mode 100644 mingw/lib/Img1.3/tkimgbmp13.dll delete mode 100644 mingw/lib/Img1.3/tkimggif13.dll delete mode 100644 mingw/lib/Img1.3/tkimgico13.dll delete mode 100644 mingw/lib/Img1.3/tkimgjpeg13.dll delete mode 100644 mingw/lib/Img1.3/tkimgpcx13.dll delete mode 100644 mingw/lib/Img1.3/tkimgpixmap13.dll delete mode 100644 mingw/lib/Img1.3/tkimgpng13.dll delete mode 100644 mingw/lib/Img1.3/tkimgppm13.dll delete mode 100644 mingw/lib/Img1.3/tkimgps13.dll delete mode 100644 mingw/lib/Img1.3/tkimgsgi13.dll delete mode 100644 mingw/lib/Img1.3/tkimgsun13.dll delete mode 100644 mingw/lib/Img1.3/tkimgtga13.dll delete mode 100644 mingw/lib/Img1.3/tkimgtiff13.dll delete mode 100644 mingw/lib/Img1.3/tkimgwindow13.dll delete mode 100644 mingw/lib/Img1.3/tkimgxbm13.dll delete mode 100644 mingw/lib/Img1.3/tkimgxpm13.dll delete mode 100644 mingw/lib/Img1.3/zlibtcl123.dll delete mode 100644 mingw/lib/binmode.o delete mode 100644 mingw/lib/crt1.o delete mode 100644 mingw/lib/crtmt.o delete mode 100644 mingw/lib/crtst.o delete mode 100644 mingw/lib/dde1.2/pkgIndex.tcl delete mode 100644 mingw/lib/dde1.2/tcldde12.dll delete mode 100644 mingw/lib/debug/libstdc++.a delete mode 100644 mingw/lib/debug/libstdc++.la delete mode 100644 mingw/lib/dllcrt1.o delete mode 100644 mingw/lib/dllcrt2.o delete mode 100644 mingw/lib/gcrt1.o delete mode 100644 mingw/lib/gcrt2.o delete mode 100644 mingw/lib/jpegtclConfig.sh delete mode 100644 mingw/lib/libSDL.a delete mode 100644 mingw/lib/libSDL.dll.a delete mode 100644 mingw/lib/libSDL.la delete mode 100644 mingw/lib/libSDLmain.a delete mode 100644 mingw/lib/libaclui.a delete mode 100644 mingw/lib/libapcups.a delete mode 100644 mingw/lib/libavicap32.a delete mode 100644 mingw/lib/libavifil32.a delete mode 100644 mingw/lib/libbfd.a delete mode 100644 mingw/lib/libbfd.la delete mode 100644 mingw/lib/libcap.a delete mode 100644 mingw/lib/libcfgmgr32.a delete mode 100644 mingw/lib/libcoldname.a delete mode 100644 mingw/lib/libcomctl32.a delete mode 100644 mingw/lib/libcomdlg32.a delete mode 100644 mingw/lib/libcrtdll.a delete mode 100644 mingw/lib/libcrypt32.a delete mode 100644 mingw/lib/libctl3d32.a delete mode 100644 mingw/lib/libcurl.la delete mode 100644 mingw/lib/libd3d8.a delete mode 100644 mingw/lib/libd3d9.a delete mode 100644 mingw/lib/libd3dim.a delete mode 100644 mingw/lib/libd3drm.a delete mode 100644 mingw/lib/libd3dx8d.a delete mode 100644 mingw/lib/libd3dx9d.a delete mode 100644 mingw/lib/libd3dxof.a delete mode 100644 mingw/lib/libddraw.a delete mode 100644 mingw/lib/libdhcpcsvc.a delete mode 100644 mingw/lib/libdinput.a delete mode 100644 mingw/lib/libdinput8.a delete mode 100644 mingw/lib/libdlcapi.a delete mode 100644 mingw/lib/libdmoguids.a delete mode 100644 mingw/lib/libdnsapi.a delete mode 100644 mingw/lib/libdplayx.a delete mode 100644 mingw/lib/libdpnaddr.a delete mode 100644 mingw/lib/libdpnet.a delete mode 100644 mingw/lib/libdpnlobby.a delete mode 100644 mingw/lib/libdpvoice.a delete mode 100644 mingw/lib/libdsetup.a delete mode 100644 mingw/lib/libdsound.a delete mode 100644 mingw/lib/libdxapi.a delete mode 100644 mingw/lib/libdxerr8.a delete mode 100644 mingw/lib/libdxerr9.a delete mode 100644 mingw/lib/libdxguid.a delete mode 100644 mingw/lib/libexpat.dll.a delete mode 100644 mingw/lib/libexpat.la delete mode 100644 mingw/lib/libfaultrep.a delete mode 100644 mingw/lib/libgdi32.a delete mode 100644 mingw/lib/libglaux.a delete mode 100644 mingw/lib/libglu32.a delete mode 100644 mingw/lib/libglut.a delete mode 100644 mingw/lib/libglut32.a delete mode 100644 mingw/lib/libgmon.a delete mode 100644 mingw/lib/libhal.a delete mode 100644 mingw/lib/libhid.a delete mode 100644 mingw/lib/libhidparse.a delete mode 100644 mingw/lib/libiberty.a delete mode 100644 mingw/lib/libicmui.a delete mode 100644 mingw/lib/libigmpagnt.a delete mode 100644 mingw/lib/libimagehlp.a delete mode 100644 mingw/lib/libimm32.a delete mode 100644 mingw/lib/libiphlpapi.a delete mode 100644 mingw/lib/libksproxy.a delete mode 100644 mingw/lib/libksuser.a delete mode 100644 mingw/lib/liblargeint.a delete mode 100644 mingw/lib/liblz32.a delete mode 100644 mingw/lib/libm.a delete mode 100644 mingw/lib/libmapi32.a delete mode 100644 mingw/lib/libmcd.a delete mode 100644 mingw/lib/libmfcuia32.a delete mode 100644 mingw/lib/libmgmtapi.a delete mode 100644 mingw/lib/libmingwthrd.a delete mode 100644 mingw/lib/libmoldnamed.a delete mode 100644 mingw/lib/libmpr.a delete mode 100644 mingw/lib/libmprapi.a delete mode 100644 mingw/lib/libmqrt.a delete mode 100644 mingw/lib/libmsacm32.a delete mode 100644 mingw/lib/libmscms.a delete mode 100644 mingw/lib/libmsdmo.a delete mode 100644 mingw/lib/libmsimg32.a delete mode 100644 mingw/lib/libmsvcp60.a delete mode 100644 mingw/lib/libmsvcr70.a delete mode 100644 mingw/lib/libmsvcr70d.a delete mode 100644 mingw/lib/libmsvcr71.a delete mode 100644 mingw/lib/libmsvcr71d.a delete mode 100644 mingw/lib/libmsvcr80.a delete mode 100644 mingw/lib/libmsvcr80d.a delete mode 100644 mingw/lib/libmsvcrtd.a delete mode 100644 mingw/lib/libmsvfw32.a delete mode 100644 mingw/lib/libmswsock.a delete mode 100644 mingw/lib/libnddeapi.a delete mode 100644 mingw/lib/libndis.a delete mode 100644 mingw/lib/libnetapi32.a delete mode 100644 mingw/lib/libnewdev.a delete mode 100644 mingw/lib/libntdll.a delete mode 100644 mingw/lib/libntoskrnl.a delete mode 100644 mingw/lib/libodbc32.a delete mode 100644 mingw/lib/libodbccp32.a delete mode 100644 mingw/lib/libole32.a delete mode 100644 mingw/lib/liboleacc.a delete mode 100644 mingw/lib/liboleaut32.a delete mode 100644 mingw/lib/libolecli32.a delete mode 100644 mingw/lib/liboledlg.a delete mode 100644 mingw/lib/libolepro32.a delete mode 100644 mingw/lib/libolesvr32.a delete mode 100644 mingw/lib/libopcodes.a delete mode 100644 mingw/lib/libopcodes.la delete mode 100644 mingw/lib/libopengl32.a delete mode 100644 mingw/lib/libpenwin32.a delete mode 100644 mingw/lib/libpkpd32.a delete mode 100644 mingw/lib/libpowrprof.a delete mode 100644 mingw/lib/libpsapi.a delete mode 100644 mingw/lib/libquartz.a delete mode 100644 mingw/lib/librapi.a delete mode 100644 mingw/lib/librasapi32.a delete mode 100644 mingw/lib/librasdlg.a delete mode 100644 mingw/lib/librpcdce4.a delete mode 100644 mingw/lib/librpcns4.a delete mode 100644 mingw/lib/librpcrt4.a delete mode 100644 mingw/lib/librtm.a delete mode 100644 mingw/lib/librtutils.a delete mode 100644 mingw/lib/libscrnsave.a delete mode 100644 mingw/lib/libscrnsavw.a delete mode 100644 mingw/lib/libscsiport.a delete mode 100644 mingw/lib/libsecur32.a delete mode 100644 mingw/lib/libsetupapi.a delete mode 100644 mingw/lib/libshfolder.a delete mode 100644 mingw/lib/libshlwapi.a delete mode 100644 mingw/lib/libsnmpapi.a delete mode 100644 mingw/lib/libstdc++.a delete mode 100644 mingw/lib/libstdc++.la delete mode 100644 mingw/lib/libstrmiids.a delete mode 100644 mingw/lib/libsupc++.a delete mode 100644 mingw/lib/libsupc++.la delete mode 100644 mingw/lib/libsvrapi.a delete mode 100644 mingw/lib/libtapi32.a delete mode 100644 mingw/lib/libtcl84.a delete mode 100644 mingw/lib/libtcldde12.a delete mode 100644 mingw/lib/libtclreg11.a delete mode 100644 mingw/lib/libtclstub84.a delete mode 100644 mingw/lib/libtdi.a delete mode 100644 mingw/lib/libth32.a delete mode 100644 mingw/lib/libthunk32.a delete mode 100644 mingw/lib/libtk84.a delete mode 100644 mingw/lib/libtkstub84.a delete mode 100644 mingw/lib/liburl.a delete mode 100644 mingw/lib/libusbcamd.a delete mode 100644 mingw/lib/libusbcamd2.a delete mode 100644 mingw/lib/libuserenv.a delete mode 100644 mingw/lib/libusp10.a delete mode 100644 mingw/lib/libuuid.a delete mode 100644 mingw/lib/libuxtheme.a delete mode 100644 mingw/lib/libvdmdbg.a delete mode 100644 mingw/lib/libversion.a delete mode 100644 mingw/lib/libvfw32.a delete mode 100644 mingw/lib/libvideoprt.a delete mode 100644 mingw/lib/libwin32k.a delete mode 100644 mingw/lib/libwin32spl.a delete mode 100644 mingw/lib/libwininet.a delete mode 100644 mingw/lib/libwinmm.a delete mode 100644 mingw/lib/libwinspool.a delete mode 100644 mingw/lib/libwinstrm.a delete mode 100644 mingw/lib/libwldap32.a delete mode 100644 mingw/lib/libwow32.a delete mode 100644 mingw/lib/libwsnmp32.a delete mode 100644 mingw/lib/libwsock32.a delete mode 100644 mingw/lib/libwst.a delete mode 100644 mingw/lib/libwtsapi32.a delete mode 100644 mingw/lib/pkgconfig/libcurl.pc delete mode 100644 mingw/lib/pkgconfig/sdl.pc delete mode 100644 mingw/lib/pngtclConfig.sh delete mode 100644 mingw/lib/reg1.1/pkgIndex.tcl delete mode 100644 mingw/lib/reg1.1/tclreg11.dll delete mode 100644 mingw/lib/tclConfig.sh delete mode 100644 mingw/lib/tifftclConfig.sh delete mode 100644 mingw/lib/tkConfig.sh delete mode 100644 mingw/lib/tkimgConfig.sh delete mode 100644 mingw/lib/txtmode.o delete mode 100644 mingw/lib/zlibtclConfig.sh delete mode 100644 mingw/libexec/gcc/mingw32/3.4.2/cc1plus.exe delete mode 100644 mingw/man/man1/addr2line.1 delete mode 100644 mingw/man/man1/ar.1 delete mode 100644 mingw/man/man1/as.1 delete mode 100644 mingw/man/man1/c++filt.1 delete mode 100644 mingw/man/man1/cpp.1 delete mode 100644 mingw/man/man1/dlltool.1 delete mode 100644 mingw/man/man1/g++.1 delete mode 100644 mingw/man/man1/gcc.1 delete mode 100644 mingw/man/man1/gcov.1 delete mode 100644 mingw/man/man1/gprof.1 delete mode 100644 mingw/man/man1/ld.1 delete mode 100644 mingw/man/man1/nlmconv.1 delete mode 100644 mingw/man/man1/nm.1 delete mode 100644 mingw/man/man1/objcopy.1 delete mode 100644 mingw/man/man1/objdump.1 delete mode 100644 mingw/man/man1/ranlib.1 delete mode 100644 mingw/man/man1/readelf.1 delete mode 100644 mingw/man/man1/size.1 delete mode 100644 mingw/man/man1/strings.1 delete mode 100644 mingw/man/man1/strip.1 delete mode 100644 mingw/man/man1/windres.1 delete mode 100644 mingw/man/man1/xmlwf.1 delete mode 100644 mingw/man/man3/SDLKey.3 delete mode 100644 mingw/man/man3/SDL_ActiveEvent.3 delete mode 100644 mingw/man/man3/SDL_AddTimer.3 delete mode 100644 mingw/man/man3/SDL_AudioCVT.3 delete mode 100644 mingw/man/man3/SDL_AudioSpec.3 delete mode 100644 mingw/man/man3/SDL_BlitSurface.3 delete mode 100644 mingw/man/man3/SDL_BuildAudioCVT.3 delete mode 100644 mingw/man/man3/SDL_CD.3 delete mode 100644 mingw/man/man3/SDL_CDClose.3 delete mode 100644 mingw/man/man3/SDL_CDEject.3 delete mode 100644 mingw/man/man3/SDL_CDName.3 delete mode 100644 mingw/man/man3/SDL_CDNumDrives.3 delete mode 100644 mingw/man/man3/SDL_CDOpen.3 delete mode 100644 mingw/man/man3/SDL_CDPause.3 delete mode 100644 mingw/man/man3/SDL_CDPlay.3 delete mode 100644 mingw/man/man3/SDL_CDPlayTracks.3 delete mode 100644 mingw/man/man3/SDL_CDResume.3 delete mode 100644 mingw/man/man3/SDL_CDStatus.3 delete mode 100644 mingw/man/man3/SDL_CDStop.3 delete mode 100644 mingw/man/man3/SDL_CDtrack.3 delete mode 100644 mingw/man/man3/SDL_CloseAudio.3 delete mode 100644 mingw/man/man3/SDL_Color.3 delete mode 100644 mingw/man/man3/SDL_CondBroadcast.3 delete mode 100644 mingw/man/man3/SDL_CondSignal.3 delete mode 100644 mingw/man/man3/SDL_CondWait.3 delete mode 100644 mingw/man/man3/SDL_CondWaitTimeout.3 delete mode 100644 mingw/man/man3/SDL_ConvertAudio.3 delete mode 100644 mingw/man/man3/SDL_ConvertSurface.3 delete mode 100644 mingw/man/man3/SDL_CreateCond.3 delete mode 100644 mingw/man/man3/SDL_CreateCursor.3 delete mode 100644 mingw/man/man3/SDL_CreateMutex.3 delete mode 100644 mingw/man/man3/SDL_CreateRGBSurface.3 delete mode 100644 mingw/man/man3/SDL_CreateRGBSurfaceFrom.3 delete mode 100644 mingw/man/man3/SDL_CreateSemaphore.3 delete mode 100644 mingw/man/man3/SDL_CreateThread.3 delete mode 100644 mingw/man/man3/SDL_CreateYUVOverlay.3 delete mode 100644 mingw/man/man3/SDL_Delay.3 delete mode 100644 mingw/man/man3/SDL_DestroyCond.3 delete mode 100644 mingw/man/man3/SDL_DestroyMutex.3 delete mode 100644 mingw/man/man3/SDL_DestroySemaphore.3 delete mode 100644 mingw/man/man3/SDL_DisplayFormat.3 delete mode 100644 mingw/man/man3/SDL_DisplayFormatAlpha.3 delete mode 100644 mingw/man/man3/SDL_DisplayYUVOverlay.3 delete mode 100644 mingw/man/man3/SDL_EnableKeyRepeat.3 delete mode 100644 mingw/man/man3/SDL_EnableUNICODE.3 delete mode 100644 mingw/man/man3/SDL_Event.3 delete mode 100644 mingw/man/man3/SDL_EventState.3 delete mode 100644 mingw/man/man3/SDL_ExposeEvent.3 delete mode 100644 mingw/man/man3/SDL_FillRect.3 delete mode 100644 mingw/man/man3/SDL_Flip.3 delete mode 100644 mingw/man/man3/SDL_FreeCursor.3 delete mode 100644 mingw/man/man3/SDL_FreeSurface.3 delete mode 100644 mingw/man/man3/SDL_FreeWAV.3 delete mode 100644 mingw/man/man3/SDL_FreeYUVOverlay.3 delete mode 100644 mingw/man/man3/SDL_GL_GetAttribute.3 delete mode 100644 mingw/man/man3/SDL_GL_GetProcAddress.3 delete mode 100644 mingw/man/man3/SDL_GL_LoadLibrary.3 delete mode 100644 mingw/man/man3/SDL_GL_SetAttribute.3 delete mode 100644 mingw/man/man3/SDL_GL_SwapBuffers.3 delete mode 100644 mingw/man/man3/SDL_GLattr.3 delete mode 100644 mingw/man/man3/SDL_GetAppState.3 delete mode 100644 mingw/man/man3/SDL_GetAudioStatus.3 delete mode 100644 mingw/man/man3/SDL_GetClipRect.3 delete mode 100644 mingw/man/man3/SDL_GetCursor.3 delete mode 100644 mingw/man/man3/SDL_GetError.3 delete mode 100644 mingw/man/man3/SDL_GetEventFilter.3 delete mode 100644 mingw/man/man3/SDL_GetGamma.3 delete mode 100644 mingw/man/man3/SDL_GetGammaRamp.3 delete mode 100644 mingw/man/man3/SDL_GetKeyName.3 delete mode 100644 mingw/man/man3/SDL_GetKeyState.3 delete mode 100644 mingw/man/man3/SDL_GetModState.3 delete mode 100644 mingw/man/man3/SDL_GetMouseState.3 delete mode 100644 mingw/man/man3/SDL_GetRGB.3 delete mode 100644 mingw/man/man3/SDL_GetRGBA.3 delete mode 100644 mingw/man/man3/SDL_GetRelativeMouseState.3 delete mode 100644 mingw/man/man3/SDL_GetThreadID.3 delete mode 100644 mingw/man/man3/SDL_GetTicks.3 delete mode 100644 mingw/man/man3/SDL_GetVideoInfo.3 delete mode 100644 mingw/man/man3/SDL_GetVideoSurface.3 delete mode 100644 mingw/man/man3/SDL_Init.3 delete mode 100644 mingw/man/man3/SDL_InitSubSystem.3 delete mode 100644 mingw/man/man3/SDL_JoyAxisEvent.3 delete mode 100644 mingw/man/man3/SDL_JoyBallEvent.3 delete mode 100644 mingw/man/man3/SDL_JoyButtonEvent.3 delete mode 100644 mingw/man/man3/SDL_JoyHatEvent.3 delete mode 100644 mingw/man/man3/SDL_JoystickClose.3 delete mode 100644 mingw/man/man3/SDL_JoystickEventState.3 delete mode 100644 mingw/man/man3/SDL_JoystickGetAxis.3 delete mode 100644 mingw/man/man3/SDL_JoystickGetBall.3 delete mode 100644 mingw/man/man3/SDL_JoystickGetButton.3 delete mode 100644 mingw/man/man3/SDL_JoystickGetHat.3 delete mode 100644 mingw/man/man3/SDL_JoystickIndex.3 delete mode 100644 mingw/man/man3/SDL_JoystickName.3 delete mode 100644 mingw/man/man3/SDL_JoystickNumAxes.3 delete mode 100644 mingw/man/man3/SDL_JoystickNumBalls.3 delete mode 100644 mingw/man/man3/SDL_JoystickNumButtons.3 delete mode 100644 mingw/man/man3/SDL_JoystickNumHats.3 delete mode 100644 mingw/man/man3/SDL_JoystickOpen.3 delete mode 100644 mingw/man/man3/SDL_JoystickOpened.3 delete mode 100644 mingw/man/man3/SDL_JoystickUpdate.3 delete mode 100644 mingw/man/man3/SDL_KeyboardEvent.3 delete mode 100644 mingw/man/man3/SDL_KillThread.3 delete mode 100644 mingw/man/man3/SDL_ListModes.3 delete mode 100644 mingw/man/man3/SDL_LoadBMP.3 delete mode 100644 mingw/man/man3/SDL_LoadWAV.3 delete mode 100644 mingw/man/man3/SDL_LockAudio.3 delete mode 100644 mingw/man/man3/SDL_LockSurface.3 delete mode 100644 mingw/man/man3/SDL_LockYUVOverlay.3 delete mode 100644 mingw/man/man3/SDL_MapRGB.3 delete mode 100644 mingw/man/man3/SDL_MapRGBA.3 delete mode 100644 mingw/man/man3/SDL_MixAudio.3 delete mode 100644 mingw/man/man3/SDL_MouseButtonEvent.3 delete mode 100644 mingw/man/man3/SDL_MouseMotionEvent.3 delete mode 100644 mingw/man/man3/SDL_NumJoysticks.3 delete mode 100644 mingw/man/man3/SDL_OpenAudio.3 delete mode 100644 mingw/man/man3/SDL_Overlay.3 delete mode 100644 mingw/man/man3/SDL_Palette.3 delete mode 100644 mingw/man/man3/SDL_PauseAudio.3 delete mode 100644 mingw/man/man3/SDL_PeepEvents.3 delete mode 100644 mingw/man/man3/SDL_PixelFormat.3 delete mode 100644 mingw/man/man3/SDL_PollEvent.3 delete mode 100644 mingw/man/man3/SDL_PumpEvents.3 delete mode 100644 mingw/man/man3/SDL_PushEvent.3 delete mode 100644 mingw/man/man3/SDL_Quit.3 delete mode 100644 mingw/man/man3/SDL_QuitEvent.3 delete mode 100644 mingw/man/man3/SDL_QuitSubSystem.3 delete mode 100644 mingw/man/man3/SDL_RWFromFile.3 delete mode 100644 mingw/man/man3/SDL_Rect.3 delete mode 100644 mingw/man/man3/SDL_RemoveTimer.3 delete mode 100644 mingw/man/man3/SDL_ResizeEvent.3 delete mode 100644 mingw/man/man3/SDL_SaveBMP.3 delete mode 100644 mingw/man/man3/SDL_SemPost.3 delete mode 100644 mingw/man/man3/SDL_SemTryWait.3 delete mode 100644 mingw/man/man3/SDL_SemValue.3 delete mode 100644 mingw/man/man3/SDL_SemWait.3 delete mode 100644 mingw/man/man3/SDL_SemWaitTimeout.3 delete mode 100644 mingw/man/man3/SDL_SetAlpha.3 delete mode 100644 mingw/man/man3/SDL_SetClipRect.3 delete mode 100644 mingw/man/man3/SDL_SetColorKey.3 delete mode 100644 mingw/man/man3/SDL_SetColors.3 delete mode 100644 mingw/man/man3/SDL_SetCursor.3 delete mode 100644 mingw/man/man3/SDL_SetEventFilter.3 delete mode 100644 mingw/man/man3/SDL_SetGamma.3 delete mode 100644 mingw/man/man3/SDL_SetGammaRamp.3 delete mode 100644 mingw/man/man3/SDL_SetModState.3 delete mode 100644 mingw/man/man3/SDL_SetPalette.3 delete mode 100644 mingw/man/man3/SDL_SetTimer.3 delete mode 100644 mingw/man/man3/SDL_SetVideoMode.3 delete mode 100644 mingw/man/man3/SDL_ShowCursor.3 delete mode 100644 mingw/man/man3/SDL_Surface.3 delete mode 100644 mingw/man/man3/SDL_SysWMEvent.3 delete mode 100644 mingw/man/man3/SDL_ThreadID.3 delete mode 100644 mingw/man/man3/SDL_UnlockAudio.3 delete mode 100644 mingw/man/man3/SDL_UnlockSurface.3 delete mode 100644 mingw/man/man3/SDL_UnlockYUVOverlay.3 delete mode 100644 mingw/man/man3/SDL_UpdateRect.3 delete mode 100644 mingw/man/man3/SDL_UpdateRects.3 delete mode 100644 mingw/man/man3/SDL_UserEvent.3 delete mode 100644 mingw/man/man3/SDL_VideoDriverName.3 delete mode 100644 mingw/man/man3/SDL_VideoInfo.3 delete mode 100644 mingw/man/man3/SDL_VideoModeOK.3 delete mode 100644 mingw/man/man3/SDL_WM_GetCaption.3 delete mode 100644 mingw/man/man3/SDL_WM_GrabInput.3 delete mode 100644 mingw/man/man3/SDL_WM_IconifyWindow.3 delete mode 100644 mingw/man/man3/SDL_WM_SetCaption.3 delete mode 100644 mingw/man/man3/SDL_WM_SetIcon.3 delete mode 100644 mingw/man/man3/SDL_WM_ToggleFullScreen.3 delete mode 100644 mingw/man/man3/SDL_WaitEvent.3 delete mode 100644 mingw/man/man3/SDL_WaitThread.3 delete mode 100644 mingw/man/man3/SDL_WarpMouse.3 delete mode 100644 mingw/man/man3/SDL_WasInit.3 delete mode 100644 mingw/man/man3/SDL_keysym.3 delete mode 100644 mingw/man/man3/SDL_mutexP.3 delete mode 100644 mingw/man/man3/SDL_mutexV.3 delete mode 100644 mingw/man/man3/basename.3 delete mode 100644 mingw/man/man3/dirname.3 delete mode 100644 mingw/man/man7/fsf-funding.7 delete mode 100644 mingw/man/man7/gfdl.7 delete mode 100644 mingw/man/man7/gpl.7 delete mode 100644 mingw/share/man/man1/curl-config.1 delete mode 100644 mingw/share/man/man1/curl.1 delete mode 100644 mingw/share/man/man3/curl_easy_cleanup.3 delete mode 100644 mingw/share/man/man3/curl_easy_duphandle.3 delete mode 100644 mingw/share/man/man3/curl_easy_escape.3 delete mode 100644 mingw/share/man/man3/curl_easy_getinfo.3 delete mode 100644 mingw/share/man/man3/curl_easy_init.3 delete mode 100644 mingw/share/man/man3/curl_easy_perform.3 delete mode 100644 mingw/share/man/man3/curl_easy_reset.3 delete mode 100644 mingw/share/man/man3/curl_easy_setopt.3 delete mode 100644 mingw/share/man/man3/curl_easy_strerror.3 delete mode 100644 mingw/share/man/man3/curl_easy_unescape.3 delete mode 100644 mingw/share/man/man3/curl_escape.3 delete mode 100644 mingw/share/man/man3/curl_formadd.3 delete mode 100644 mingw/share/man/man3/curl_formfree.3 delete mode 100644 mingw/share/man/man3/curl_formget.3 delete mode 100644 mingw/share/man/man3/curl_free.3 delete mode 100644 mingw/share/man/man3/curl_getdate.3 delete mode 100644 mingw/share/man/man3/curl_getenv.3 delete mode 100644 mingw/share/man/man3/curl_global_cleanup.3 delete mode 100644 mingw/share/man/man3/curl_global_init.3 delete mode 100644 mingw/share/man/man3/curl_global_init_mem.3 delete mode 100644 mingw/share/man/man3/curl_mprintf.3 delete mode 100644 mingw/share/man/man3/curl_multi_add_handle.3 delete mode 100644 mingw/share/man/man3/curl_multi_assign.3 delete mode 100644 mingw/share/man/man3/curl_multi_cleanup.3 delete mode 100644 mingw/share/man/man3/curl_multi_fdset.3 delete mode 100644 mingw/share/man/man3/curl_multi_info_read.3 delete mode 100644 mingw/share/man/man3/curl_multi_init.3 delete mode 100644 mingw/share/man/man3/curl_multi_perform.3 delete mode 100644 mingw/share/man/man3/curl_multi_remove_handle.3 delete mode 100644 mingw/share/man/man3/curl_multi_setopt.3 delete mode 100644 mingw/share/man/man3/curl_multi_socket.3 delete mode 100644 mingw/share/man/man3/curl_multi_strerror.3 delete mode 100644 mingw/share/man/man3/curl_multi_timeout.3 delete mode 100644 mingw/share/man/man3/curl_share_cleanup.3 delete mode 100644 mingw/share/man/man3/curl_share_init.3 delete mode 100644 mingw/share/man/man3/curl_share_setopt.3 delete mode 100644 mingw/share/man/man3/curl_share_strerror.3 delete mode 100644 mingw/share/man/man3/curl_slist_append.3 delete mode 100644 mingw/share/man/man3/curl_slist_free_all.3 delete mode 100644 mingw/share/man/man3/curl_strequal.3 delete mode 100644 mingw/share/man/man3/curl_unescape.3 delete mode 100644 mingw/share/man/man3/curl_version.3 delete mode 100644 mingw/share/man/man3/curl_version_info.3 delete mode 100644 mingw/share/man/man3/libcurl-easy.3 delete mode 100644 mingw/share/man/man3/libcurl-errors.3 delete mode 100644 mingw/share/man/man3/libcurl-multi.3 delete mode 100644 mingw/share/man/man3/libcurl-share.3 delete mode 100644 mingw/share/man/man3/libcurl-tutorial.3 delete mode 100644 mingw/share/man/man3/libcurl.3 delete mode 100644 mingw/share/man/man3/zlib.3 delete mode 100644 mingw/uninstall/unins000.dat delete mode 100644 mingw/uninstall/unins000.exe diff --git a/bin/aclocal b/bin/aclocal deleted file mode 100644 index ea2a104f..00000000 --- a/bin/aclocal +++ /dev/null @@ -1,475 +0,0 @@ -#!/bin/perl -# -*- perl -*- -# Makefile. Generated from Makefile.in by configure. - -eval 'case $# in 0) exec /bin/perl -S "$0";; *) exec /bin/perl -S "$0" "$@";; esac' - if 0; - -# aclocal - create aclocal.m4 by scanning configure.ac - -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 -# Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# Written by Tom Tromey . - -BEGIN -{ - my $perllibdir = $ENV{'perllibdir'} || '/usr/share/automake-1.7'; - unshift @INC, $perllibdir; -} - -use Automake::General; -use Automake::XFile; - -# Some constants. -$VERSION = '1.7.1'; -$APIVERSION = '1.7'; -$PACKAGE = 'automake'; -# Note that this isn't pkgdatadir, but a separate directory. -# Note also that the versioned directory is handled later. -$acdir = '/usr/share/aclocal'; -$default_acdir = $acdir; -# contains a list of directories, one per line, to be added -# to the dirlist in addition to $acdir, as if -I had been -# added to the command line. If acdir has been redirected, -# we will also check the specified acdir (this is done later). -$default_dirlist = "$default_acdir/dirlist"; - -# Some globals. - -# Exit status. -$exit_status = 0; - -# Name of the top autoconf input: `configure.ac' or `configure.in'. -$configure_ac = find_configure_ac; - -# Text to output. -$output = ''; - -# Output file name. -$output_file = 'aclocal.m4'; - -# Which macros have been seen. -%macro_seen = (); - -# Which files have been seen. -%file_seen = (); - -# Map macro names to file names. -%map = (); - -# Map file names to file contents. -%file_contents = (); - -# How much to say. -$verbose = 0; - -# Matches a macro definition. -# AC_DEFUN([macroname], ...) -# or -# AC_DEFUN(macroname, ...) -# When macroname is `['-quoted , we accept any character in the name, -# except `]'. Otherwise macroname stops on the first `]', `,', `)', -# or `\n' encountered. -$ac_defun_rx = "A[CU]_DEFUN\\((?:\\[([^]]+)\\]|([^],)\n]+))"; - -# Matches an AC_REQUIRE line. -$ac_require_rx = "AC_REQUIRE\\((?:\\[([^]]+)\\]|([^],)\n]+))\\)"; - - - -local (@dirlist) = &parse_arguments (@ARGV); -&scan_m4_files (@dirlist); -&scan_configure; -if (! $exit_status) -{ - &write_aclocal; -} -&check_acinclude; - -exit $exit_status; - -################################################################ - -# Print usage and exit. -sub usage ($) -{ - local ($status) = @_; - - print "Usage: aclocal [OPTIONS] ...\n\n"; - print "\ -Generate `aclocal.m4' by scanning `configure.ac' or `configure.in' - - --acdir=DIR directory holding config files - --help print this help, then exit - -I DIR add directory to search list for .m4 files - --output=FILE put output in FILE (default aclocal.m4) - --print-ac-dir print name of directory holding m4 files - --verbose don't be silent - --version print version number, then exit - -Report bugs to .\n"; - - exit $status; -} - -# Parse command line. -sub parse_arguments (@) -{ - local (@arglist) = @_; - local (@dirlist); - local ($print_and_exit) = 0; - - while (@arglist) - { - if ($arglist[0] =~ /^--acdir=(.+)$/) - { - $acdir = $1; - } - elsif ($arglist[0] =~/^--output=(.+)$/) - { - $output_file = $1; - } - elsif ($arglist[0] eq '-I') - { - shift (@arglist); - push (@dirlist, $arglist[0]); - } - elsif ($arglist[0] eq '--print-ac-dir') - { - $print_and_exit = 1; - } - elsif ($arglist[0] eq '--verbose') - { - ++$verbose; - } - elsif ($arglist[0] eq '--version') - { - print "aclocal (GNU $PACKAGE) $VERSION\n\n"; - print "Copyright (C) 2002 Free Software Foundation, Inc.\n"; - print "This is free software; see the source for copying conditions. There is NO\n"; - print "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"; - print "Written by Tom Tromey \n"; - exit 0; - } - elsif ($arglist[0] eq '--help') - { - &usage (0); - } - else - { - die "aclocal: unrecognized option -- `$arglist[0]'\nTry `aclocal --help' for more information.\n"; - } - - shift (@arglist); - } - - if ($print_and_exit) - { - print $acdir, "\n"; - exit 0; - } - - $default_dirlist="$acdir/dirlist" - if $acdir ne $default_acdir; - - # Search the versioned directory near the end, and then the - # unversioned directory last. Only do this if the user didn't - # override acdir. - push (@dirlist, "$acdir-$APIVERSION") - if $acdir eq $default_acdir; - - # By default $(datadir)/aclocal doesn't exist. We don't want to - # get an error in the case where we are searching the default - # directory and it hasn't been created. - push (@dirlist, $acdir) - unless $acdir eq $default_acdir && ! -d $acdir; - - # Finally, adds any directory listed in the `dirlist' file. - if (open (DEFAULT_DIRLIST, $default_dirlist)) - { - while () - { - # Ignore '#' lines. - next if /^#/; - # strip off newlines and end-of-line comments - s/\s*\#.*$//; - chomp ($contents=$_); - if (-d $contents ) - { - push (@dirlist, $contents); - } - } - close (DEFAULT_DIRLIST); - } - - - return @dirlist; -} - -################################################################ - -sub scan_configure () -{ - die "aclocal: `configure.ac' or `configure.in' is required\n" - if !$configure_ac; - - open (CONFIGURE, $configure_ac) - || die "aclocal: couldn't open `$configure_ac': $!\n"; - - # Make sure we include acinclude.m4 if it exists. - if (-f 'acinclude.m4') - { - &add_file ('acinclude.m4'); - } - - while () - { - # Remove comments from current line. - s/\bdnl\b.*$//; - s/\#.*$//; - - # Search for things we know about. The "search" sub is - # constructed dynamically by scan_m4_files. The last - # parenthethical match makes sure we don't match things that - # look like macro assignments or AC_SUBSTs. - if (! &search && /(^|\s+)(AM_[A-Z0-9_]+)($|[^\]\)=A-Z0-9_])/) - { - # Macro not found, but AM_ prefix found. - warn "aclocal: $configure_ac: $.: macro `$2' not found in library\n"; - $exit_status = 1; - } - } - - close (CONFIGURE); -} - -################################################################ - -# Check macros in acinclude.m4. If one is not used, warn. -sub check_acinclude () -{ - local ($key); - - foreach $key (keys %map) - { - next unless $map{$key} eq 'acinclude.m4'; - if (! $macro_seen{$key}) - { - # FIXME: should print line number of acinclude.m4. - warn "aclocal: macro `$key' defined in acinclude.m4 but never used\n"; - } - } -} - -################################################################ - -# Scan all the installed m4 files and construct a map. -sub scan_m4_files (@) -{ - local (@dirlist) = @_; - - # First, scan acinclude.m4 if it exists. - if (-f 'acinclude.m4') - { - $file_contents{'acinclude.m4'} = &scan_file ('acinclude.m4'); - } - - local ($m4dir); - foreach $m4dir (@dirlist) - { - opendir (DIR, $m4dir) - || die "aclocal: couldn't open directory `$m4dir': $!\n"; - local ($file, $fullfile); - foreach $file (sort grep (! /^\./, readdir (DIR))) - { - # Only examine .m4 files. - next unless $file =~ /\.m4$/; - - # Skip some files when running out of srcdir. - next if $file eq 'aclocal.m4'; - - $fullfile = $m4dir . '/' . $file; - $file_contents{$fullfile} = &scan_file ($fullfile); - } - closedir (DIR); - } - - # Construct a new function that does the searching. We use a - # function (instead of just evalling $search in the loop) so that - # "die" is correctly and easily propagated if run. - my $search = "sub search {\nmy \$found = 0;\n"; - foreach my $key (reverse sort keys %map) - { - $search .= ('if (/\b\Q' . $key . '\E(?!\w)/) { & add_macro ("' . $key - . '"); $found = 1; }' . "\n"); - } - $search .= "return \$found;\n};\n"; - eval $search; - die "internal error: $@\n search is $search" if $@; -} - -################################################################ - -# Add a macro to the output. -sub add_macro ($) -{ - local ($macro) = @_; - - # We want to ignore AC_ macros. However, if an AC_ macro is - # defined in (eg) acinclude.m4, then we want to make sure we mark - # it as seen. - return if $macro =~ /^AC_/ && ! defined $map{$macro}; - - if (! defined $map{$macro}) - { - warn "aclocal: macro `$macro' required but not defined\n"; - $exit_status = 1; - return; - } - - print STDERR "aclocal: saw macro $macro\n" if $verbose; - $macro_seen{$macro} = 1; - &add_file ($map{$macro}); -} - -# Add a file to output. -sub add_file ($) -{ - local ($file) = @_; - - # Only add a file once. - return if ($file_seen{$file}); - $file_seen{$file} = 1; - - $output .= $file_contents{$file} . "\n"; - my (@rlist); - foreach (split ("\n", $file_contents{$file})) - { - # Remove comments from current line. - s/\bdnl\b.*$//; - s/\#.*$//; - - if (/$ac_require_rx/g) - { - push (@rlist, $1 || $2); - } - - # The search function is constructed dynamically by - # scan_m4_files. The last parenthethical match makes sure we - # don't match things that look like macro assignments or - # AC_SUBSTs. - if (! &search && /(^|\s+)(AM_[A-Z0-9_]+)($|[^\]\)=A-Z0-9_])/) - { - # Macro not found, but AM_ prefix found. - warn "aclocal: $configure_ac: $.: macro `$2' not found in library\n"; - $exit_status = 1; - } - } - - local ($macro); - foreach $macro (@rlist) - { - &add_macro ($macro); - } -} - -# Scan a single M4 file. Return contents. -sub scan_file ($) -{ - local ($file) = @_; - - my $fh = new Automake::XFile $file; - my $contents = ''; - while ($_ = $fh->getline) - { - # Ignore `##' lines. - next if /^##/; - - $contents .= $_; - - if (/$ac_defun_rx/) - { - if (! defined $map{$1 || $2}) - { - $map{$1 || $2} = $file; - } - - # Note: we used to give an error here if we saw a - # duplicated macro. However, this turns out to be - # extremely unpopular. It causes actual problems which - # are hard to work around, especially when you must - # mix-and-match tool versions. - - print STDERR "aclocal: found macro $1 in $file: $.\n" if $verbose; - } - } - - return $contents; -} - -################################################################ - -# Write output. -sub write_aclocal () -{ - return if ! length ($output); - - print STDERR "aclocal: writing $output_file\n" if $verbose; - - my $out = new Automake::XFile "> $output_file"; - -# We used to print `# $output_file generated automatically etc.' But -# this creates spurious differences when using autoreconf. Autoreconf -# creates aclocal.m4t and then rename it to aclocal.m4, but the -# rebuild rules generated by Automake create aclocal.m4 directly -- -# this would gives two ways to get the same file, with a different -# name in the header. - print $out -"# generated automatically by aclocal $VERSION -*- Autoconf -*- - -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 -# Free Software Foundation, Inc. -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -$output"; -} - -### Setup "GNU" style for perl-mode and cperl-mode. -## Local Variables: -## perl-indent-level: 2 -## perl-continued-statement-offset: 2 -## perl-continued-brace-offset: 0 -## perl-brace-offset: 0 -## perl-brace-imaginary-offset: 0 -## perl-label-offset: -2 -## cperl-indent-level: 2 -## cperl-brace-offset: 0 -## cperl-continued-brace-offset: 0 -## cperl-label-offset: -2 -## cperl-extra-newline-before-brace: t -## cperl-merge-trailing-else: nil -## cperl-continued-statement-offset: 2 -## End: diff --git a/bin/aclocal-1.7 b/bin/aclocal-1.7 deleted file mode 100644 index ea2a104f..00000000 --- a/bin/aclocal-1.7 +++ /dev/null @@ -1,475 +0,0 @@ -#!/bin/perl -# -*- perl -*- -# Makefile. Generated from Makefile.in by configure. - -eval 'case $# in 0) exec /bin/perl -S "$0";; *) exec /bin/perl -S "$0" "$@";; esac' - if 0; - -# aclocal - create aclocal.m4 by scanning configure.ac - -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 -# Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# Written by Tom Tromey . - -BEGIN -{ - my $perllibdir = $ENV{'perllibdir'} || '/usr/share/automake-1.7'; - unshift @INC, $perllibdir; -} - -use Automake::General; -use Automake::XFile; - -# Some constants. -$VERSION = '1.7.1'; -$APIVERSION = '1.7'; -$PACKAGE = 'automake'; -# Note that this isn't pkgdatadir, but a separate directory. -# Note also that the versioned directory is handled later. -$acdir = '/usr/share/aclocal'; -$default_acdir = $acdir; -# contains a list of directories, one per line, to be added -# to the dirlist in addition to $acdir, as if -I had been -# added to the command line. If acdir has been redirected, -# we will also check the specified acdir (this is done later). -$default_dirlist = "$default_acdir/dirlist"; - -# Some globals. - -# Exit status. -$exit_status = 0; - -# Name of the top autoconf input: `configure.ac' or `configure.in'. -$configure_ac = find_configure_ac; - -# Text to output. -$output = ''; - -# Output file name. -$output_file = 'aclocal.m4'; - -# Which macros have been seen. -%macro_seen = (); - -# Which files have been seen. -%file_seen = (); - -# Map macro names to file names. -%map = (); - -# Map file names to file contents. -%file_contents = (); - -# How much to say. -$verbose = 0; - -# Matches a macro definition. -# AC_DEFUN([macroname], ...) -# or -# AC_DEFUN(macroname, ...) -# When macroname is `['-quoted , we accept any character in the name, -# except `]'. Otherwise macroname stops on the first `]', `,', `)', -# or `\n' encountered. -$ac_defun_rx = "A[CU]_DEFUN\\((?:\\[([^]]+)\\]|([^],)\n]+))"; - -# Matches an AC_REQUIRE line. -$ac_require_rx = "AC_REQUIRE\\((?:\\[([^]]+)\\]|([^],)\n]+))\\)"; - - - -local (@dirlist) = &parse_arguments (@ARGV); -&scan_m4_files (@dirlist); -&scan_configure; -if (! $exit_status) -{ - &write_aclocal; -} -&check_acinclude; - -exit $exit_status; - -################################################################ - -# Print usage and exit. -sub usage ($) -{ - local ($status) = @_; - - print "Usage: aclocal [OPTIONS] ...\n\n"; - print "\ -Generate `aclocal.m4' by scanning `configure.ac' or `configure.in' - - --acdir=DIR directory holding config files - --help print this help, then exit - -I DIR add directory to search list for .m4 files - --output=FILE put output in FILE (default aclocal.m4) - --print-ac-dir print name of directory holding m4 files - --verbose don't be silent - --version print version number, then exit - -Report bugs to .\n"; - - exit $status; -} - -# Parse command line. -sub parse_arguments (@) -{ - local (@arglist) = @_; - local (@dirlist); - local ($print_and_exit) = 0; - - while (@arglist) - { - if ($arglist[0] =~ /^--acdir=(.+)$/) - { - $acdir = $1; - } - elsif ($arglist[0] =~/^--output=(.+)$/) - { - $output_file = $1; - } - elsif ($arglist[0] eq '-I') - { - shift (@arglist); - push (@dirlist, $arglist[0]); - } - elsif ($arglist[0] eq '--print-ac-dir') - { - $print_and_exit = 1; - } - elsif ($arglist[0] eq '--verbose') - { - ++$verbose; - } - elsif ($arglist[0] eq '--version') - { - print "aclocal (GNU $PACKAGE) $VERSION\n\n"; - print "Copyright (C) 2002 Free Software Foundation, Inc.\n"; - print "This is free software; see the source for copying conditions. There is NO\n"; - print "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"; - print "Written by Tom Tromey \n"; - exit 0; - } - elsif ($arglist[0] eq '--help') - { - &usage (0); - } - else - { - die "aclocal: unrecognized option -- `$arglist[0]'\nTry `aclocal --help' for more information.\n"; - } - - shift (@arglist); - } - - if ($print_and_exit) - { - print $acdir, "\n"; - exit 0; - } - - $default_dirlist="$acdir/dirlist" - if $acdir ne $default_acdir; - - # Search the versioned directory near the end, and then the - # unversioned directory last. Only do this if the user didn't - # override acdir. - push (@dirlist, "$acdir-$APIVERSION") - if $acdir eq $default_acdir; - - # By default $(datadir)/aclocal doesn't exist. We don't want to - # get an error in the case where we are searching the default - # directory and it hasn't been created. - push (@dirlist, $acdir) - unless $acdir eq $default_acdir && ! -d $acdir; - - # Finally, adds any directory listed in the `dirlist' file. - if (open (DEFAULT_DIRLIST, $default_dirlist)) - { - while () - { - # Ignore '#' lines. - next if /^#/; - # strip off newlines and end-of-line comments - s/\s*\#.*$//; - chomp ($contents=$_); - if (-d $contents ) - { - push (@dirlist, $contents); - } - } - close (DEFAULT_DIRLIST); - } - - - return @dirlist; -} - -################################################################ - -sub scan_configure () -{ - die "aclocal: `configure.ac' or `configure.in' is required\n" - if !$configure_ac; - - open (CONFIGURE, $configure_ac) - || die "aclocal: couldn't open `$configure_ac': $!\n"; - - # Make sure we include acinclude.m4 if it exists. - if (-f 'acinclude.m4') - { - &add_file ('acinclude.m4'); - } - - while () - { - # Remove comments from current line. - s/\bdnl\b.*$//; - s/\#.*$//; - - # Search for things we know about. The "search" sub is - # constructed dynamically by scan_m4_files. The last - # parenthethical match makes sure we don't match things that - # look like macro assignments or AC_SUBSTs. - if (! &search && /(^|\s+)(AM_[A-Z0-9_]+)($|[^\]\)=A-Z0-9_])/) - { - # Macro not found, but AM_ prefix found. - warn "aclocal: $configure_ac: $.: macro `$2' not found in library\n"; - $exit_status = 1; - } - } - - close (CONFIGURE); -} - -################################################################ - -# Check macros in acinclude.m4. If one is not used, warn. -sub check_acinclude () -{ - local ($key); - - foreach $key (keys %map) - { - next unless $map{$key} eq 'acinclude.m4'; - if (! $macro_seen{$key}) - { - # FIXME: should print line number of acinclude.m4. - warn "aclocal: macro `$key' defined in acinclude.m4 but never used\n"; - } - } -} - -################################################################ - -# Scan all the installed m4 files and construct a map. -sub scan_m4_files (@) -{ - local (@dirlist) = @_; - - # First, scan acinclude.m4 if it exists. - if (-f 'acinclude.m4') - { - $file_contents{'acinclude.m4'} = &scan_file ('acinclude.m4'); - } - - local ($m4dir); - foreach $m4dir (@dirlist) - { - opendir (DIR, $m4dir) - || die "aclocal: couldn't open directory `$m4dir': $!\n"; - local ($file, $fullfile); - foreach $file (sort grep (! /^\./, readdir (DIR))) - { - # Only examine .m4 files. - next unless $file =~ /\.m4$/; - - # Skip some files when running out of srcdir. - next if $file eq 'aclocal.m4'; - - $fullfile = $m4dir . '/' . $file; - $file_contents{$fullfile} = &scan_file ($fullfile); - } - closedir (DIR); - } - - # Construct a new function that does the searching. We use a - # function (instead of just evalling $search in the loop) so that - # "die" is correctly and easily propagated if run. - my $search = "sub search {\nmy \$found = 0;\n"; - foreach my $key (reverse sort keys %map) - { - $search .= ('if (/\b\Q' . $key . '\E(?!\w)/) { & add_macro ("' . $key - . '"); $found = 1; }' . "\n"); - } - $search .= "return \$found;\n};\n"; - eval $search; - die "internal error: $@\n search is $search" if $@; -} - -################################################################ - -# Add a macro to the output. -sub add_macro ($) -{ - local ($macro) = @_; - - # We want to ignore AC_ macros. However, if an AC_ macro is - # defined in (eg) acinclude.m4, then we want to make sure we mark - # it as seen. - return if $macro =~ /^AC_/ && ! defined $map{$macro}; - - if (! defined $map{$macro}) - { - warn "aclocal: macro `$macro' required but not defined\n"; - $exit_status = 1; - return; - } - - print STDERR "aclocal: saw macro $macro\n" if $verbose; - $macro_seen{$macro} = 1; - &add_file ($map{$macro}); -} - -# Add a file to output. -sub add_file ($) -{ - local ($file) = @_; - - # Only add a file once. - return if ($file_seen{$file}); - $file_seen{$file} = 1; - - $output .= $file_contents{$file} . "\n"; - my (@rlist); - foreach (split ("\n", $file_contents{$file})) - { - # Remove comments from current line. - s/\bdnl\b.*$//; - s/\#.*$//; - - if (/$ac_require_rx/g) - { - push (@rlist, $1 || $2); - } - - # The search function is constructed dynamically by - # scan_m4_files. The last parenthethical match makes sure we - # don't match things that look like macro assignments or - # AC_SUBSTs. - if (! &search && /(^|\s+)(AM_[A-Z0-9_]+)($|[^\]\)=A-Z0-9_])/) - { - # Macro not found, but AM_ prefix found. - warn "aclocal: $configure_ac: $.: macro `$2' not found in library\n"; - $exit_status = 1; - } - } - - local ($macro); - foreach $macro (@rlist) - { - &add_macro ($macro); - } -} - -# Scan a single M4 file. Return contents. -sub scan_file ($) -{ - local ($file) = @_; - - my $fh = new Automake::XFile $file; - my $contents = ''; - while ($_ = $fh->getline) - { - # Ignore `##' lines. - next if /^##/; - - $contents .= $_; - - if (/$ac_defun_rx/) - { - if (! defined $map{$1 || $2}) - { - $map{$1 || $2} = $file; - } - - # Note: we used to give an error here if we saw a - # duplicated macro. However, this turns out to be - # extremely unpopular. It causes actual problems which - # are hard to work around, especially when you must - # mix-and-match tool versions. - - print STDERR "aclocal: found macro $1 in $file: $.\n" if $verbose; - } - } - - return $contents; -} - -################################################################ - -# Write output. -sub write_aclocal () -{ - return if ! length ($output); - - print STDERR "aclocal: writing $output_file\n" if $verbose; - - my $out = new Automake::XFile "> $output_file"; - -# We used to print `# $output_file generated automatically etc.' But -# this creates spurious differences when using autoreconf. Autoreconf -# creates aclocal.m4t and then rename it to aclocal.m4, but the -# rebuild rules generated by Automake create aclocal.m4 directly -- -# this would gives two ways to get the same file, with a different -# name in the header. - print $out -"# generated automatically by aclocal $VERSION -*- Autoconf -*- - -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 -# Free Software Foundation, Inc. -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -$output"; -} - -### Setup "GNU" style for perl-mode and cperl-mode. -## Local Variables: -## perl-indent-level: 2 -## perl-continued-statement-offset: 2 -## perl-continued-brace-offset: 0 -## perl-brace-offset: 0 -## perl-brace-imaginary-offset: 0 -## perl-label-offset: -2 -## cperl-indent-level: 2 -## cperl-brace-offset: 0 -## cperl-continued-brace-offset: 0 -## cperl-label-offset: -2 -## cperl-extra-newline-before-brace: t -## cperl-merge-trailing-else: nil -## cperl-continued-statement-offset: 2 -## End: diff --git a/bin/autoconf b/bin/autoconf deleted file mode 100644 index 447b771b..00000000 --- a/bin/autoconf +++ /dev/null @@ -1,271 +0,0 @@ -#! /bin/sh -## --------------------- ## -## M4sh Initialization. ## -## --------------------- ## - -# Be Bourne compatible -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' -elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then - set -o posix -fi - -# Support unset when possible. -if (FOO=FOO; unset FOO) >/dev/null 2>&1; then - as_unset=unset -else - as_unset=false -fi - - -# Work around bugs in pre-3.0 UWIN ksh. -$as_unset ENV MAIL MAILPATH -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -for as_var in \ - LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ - LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ - LC_TELEPHONE LC_TIME -do - if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then - eval $as_var=C; export $as_var - else - $as_unset $as_var - fi -done - -# Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1; then - as_expr=expr -else - as_expr=false -fi - -if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - - -# Name of the executable. -as_me=`$as_basename "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)$' \| \ - . : '\(.\)' 2>/dev/null || -echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } - /^X\/\(\/\/\)$/{ s//\1/; q; } - /^X\/\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - - -# autoconf -- create `configure' using m4 macros -# Copyright (C) 1992, 1993, 1994, 1996, 1999, 2000, 2001, 2002 -# Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -usage="\ -Usage: $0 [OPTION] ... [TEMPLATE-FILE] - -Generate a configuration script from a TEMPLATE-FILE if given, or -\`configure.ac' if present, or else \`configure.in'. Output is sent -to the standard output if TEMPLATE-FILE is given, else into -\`configure'. - -Operation modes: - -h, --help print this help, then exit - -V, --version print version number, then exit - -v, --verbose verbosely report processing - -d, --debug don't remove temporary files - -f, --force consider all files obsolete - -o, --output=FILE save output in FILE (stdout is the default) - -W, --warnings=CATEGORY report the warnings falling in CATEGORY [syntax] - -Warning categories include: - \`cross' cross compilation issues - \`obsolete' obsolete constructs - \`syntax' dubious syntactic constructs - \`all' all the warnings - \`no-CATEGORY' turn off the warnings on CATEGORY - \`none' turn off all the warnings - \`error' warnings are error - -The environment variable \`WARNINGS' is honored. - -Library directories: - -B, --prepend-include=DIR prepend directory DIR to search path - -I, --include=DIR append directory DIR to search path - -Tracing: - -t, --trace=MACRO report the list of calls to MACRO - -i, --initialization also trace Autoconf's initialization process - -In tracing mode, no configuration script is created. - -Report bugs to ." - -version="\ -autoconf (GNU Autoconf) 2.56 -Written by David J. MacKenzie and Akim Demaille. - -Copyright 2002 Free Software Foundation, Inc. -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -me=`$as_basename $0 || -$as_expr X/$0 : '.*/\([^/][^/]*\)/*$' \| \ - X$0 : 'X\(//\)$' \| \ - X$0 : 'X\(/\)$' \| \ - . : '\(.\)' 2>/dev/null || -echo X/$0 | - sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } - /^X\/\(\/\/\)$/{ s//\1/; q; } - /^X\/\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - -help="\ -Try \`$me --help' for more information." - -exit_missing_arg="\ -echo \"$me: option \\\`\$1' requires an argument\" >&2 -echo \"\$help\" >&2 -exit 1" - -# Variables. -: ${AUTOM4TE='/usr/bin/autom4te'} -dir=`(dirname $0) 2>/dev/null || -$as_expr X$0 : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X$0 : 'X\(//\)[^/]' \| \ - X$0 : 'X\(//\)$' \| \ - X$0 : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X$0 | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` -outfile= -verbose=: - -# Parse command line. -while test $# -gt 0 ; do - option=`expr "x$1" : 'x\(--[^=]*\)' \| \ - "x$1" : 'x\(-.\)'` - optarg=`expr "x$1" : 'x--[^=]*=\(.*\)' \| \ - "x$1" : 'x-.\(.*\)'` - case $1 in - --version | -V ) - echo "$version" ; exit 0 ;; - --help | -h ) - echo "$usage"; exit 0 ;; - - --verbose | -v ) - verbose=echo - AUTOM4TE="$AUTOM4TE $1"; shift ;; - - # Arguments passed as is to autom4te. - --debug | -d | \ - --force | -f | \ - --include=* | -I?* | \ - --prepend-include=* | -B?* | \ - --warnings=* | -W?* ) - AUTOM4TE="$AUTOM4TE $1"; shift ;; - - # Options with separated arg passed as is to autom4te. - --include | -I | \ - --prepend-include | -B | \ - --warnings | -W ) - test $# = 1 && eval "$exit_missing_arg" - AUTOM4TE="$AUTOM4TE $option $2" - shift 2 ;; - - --trace=* | -t?* ) - traces="$traces --trace='"`echo "$optarg" | sed "s/'/'\\\\\\\\''/g"`"'" - shift ;; - --trace | -t ) - test $# = 1 && eval "$exit_missing_arg" - shift - traces="$traces --trace='"`echo "$1" | sed "s/'/'\\\\\\\\''/g"`"'" - shift ;; - --initialization | -i ) - AUTOM4TE="$AUTOM4TE --melt" - shift;; - - --output=* | -o?* ) - outfile=$optarg - shift ;; - --output | -o ) - test $# = 1 && eval "$exit_missing_arg" - shift - outfile=$1 - shift ;; - - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - exec >&2 - echo "$me: invalid option $1" - echo "$help" - exit 1 ;; - * ) - break ;; - esac -done - -# Find the input file. -case $# in - 0) - if test -f configure.ac; then - if test -f configure.in; then - echo "$me: warning: both \`configure.ac' and \`configure.in' are present." >&2 - echo "$me: warning: proceeding with \`configure.ac'." >&2 - fi - infile=configure.ac - elif test -f configure.in; then - infile=configure.in - else - echo "$me: no input file" >&2 - exit 1 - fi - test -z "$traces" && test -z "$outfile" && outfile=configure;; - 1) # autom4te doesn't like `-'. - test "x$1" != "x-" && infile=$1 ;; - *) exec >&2 - echo "$me: invalid number of arguments." - echo "$help" - (exit 1); exit 1 ;; -esac - -# Unless specified, the output is stdout. -test -z "$outfile" && outfile=- - -# Run autom4te with expansion. -eval set \$AUTOM4TE --language=autoconf --output=\$outfile "$traces" \$infile -$verbose "$me: running $*" >&2 -exec "$@" diff --git a/bin/autogen.exe b/bin/autogen.exe deleted file mode 100644 index eac9e8dcba9dab26321e6a04b0cdc234f9f2fe28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcwPel00001 literal 681984 zcwX$i3w#^Zu{gZ4<(J|_f;E}O}!Rs-P_VaOIy;k{nOjh(%ZBR0TL&nHuQB<$|DzA9xbKoD+&fea1s%HGjn#O zmE#0%OYi^p`@YXVOWHkq&YU?jbLPyMGv{pGtpi*-$8lQt#N!-yfMb6~?vww5@R@S; z!71GSoZnt^KvVnMYZ~1iKi}o^Zt*!g_!ehpr&r)NyLexqllOG;l?`^j!`tdAnLJrH zPljQ&a9piM%YA#+o8=1J*ExOKBu(04ZoZD=mO{cN_!#7mQO6N>c%8=Z)^O~X{zi3l zv(_<*+Qo4^%ZpzImc_uS{*LQ7?Nsi6{jWrD?GWI1L!pi#G+(D`1pDKmk{dgU_4ZgZkpDTYs%;#YMsm;)KZW{bHo)7Q*(*OV8{~P}t z;$K5=&kU7w##J0AXnylw-RJbbu$;>q9F51@L<`+aUI9G`Z~m*}T@}*0bEG%Al{q+m^3SXeb#jp1IHW%^E_I94~ z_<5hp@A7SPwQ@>%&>L+&my7p%+l1{-pQ}WtTjve%9nPJQx7Fhpe4fn#!Nq$7-r3o@ z!0SUz;%VE734zX5myZ|RE?#i?I{du14R3VS^$xz;)#>s%+j(nXbGxU7ul2OJI{hv{ z1=JKK`Q5Hoe)CQ$T!r=9<@$A1UI6P9Jl@V_yvqa6ef&0;&ky(f!Xh5(FK`O{PH(`+ zd%G}KA>g%>Z+8mGjL-&E^OB8dMP-OJy1iY1vl{?GE4F)pJfJKCepg$dy+{W+`L#8T zD;pe*ys3U2zt&{4nd%$YErXnb+Y3)!+guEer=zRg17HDhpR-fg2^7%PS#0K&kl$2M zQ(M!x4l%B(X{@){?R-^(jW_XDldZAF?5H)_c&o!^ZLnKPbat1E0A84Md>fJ8=i*yk zg45IPml@>;jM`gyw{sh)dsmCg1I*=}Bo;D1E&^2NZ1;9Z|9#gPJxT29_e-cAp0%Lhvr-`Nr}5O zmh;MaiiNIruGX{J=LDFk`D<$`nyCU)qlIhtY%W$Fa}`eDRHw6pu?u9S3&aJ>6!;6d z3X|Q^TyLtgaGN1pF=pc`U2UFD4^qny!l~ruDlJtt^)-z(4fS@e(_7q{%mufcy~XW< zDq3JjXG{{je7o1#%GEZQDx2-*l@_Q26N>$mldFYm-Y=H|ZGb}D&YH%`R5|L+tTrmv z7U*nYwGCY8ub~6FPC`mZf&?@|{DHPM&koMMy2jdUcT`o?+`{>9_jDD@>HaQP3u+I_ zE7M0QVyU&58xw_G?Z8i^*!lJQT>@$%Uhs6d{6qktzaM~sW@vG7_6CQ|3=FLSN&o>_ zYB6R;0!FrREpDgJ*#b(#4|MGG1H(bx@vb`po^8%{SEs;P);N&8kb;bDF20S6{2Uc` z+8Y8p9A zC~n7$TqCrfr%RGg8VaCWAeBJdaY!C$5hnm;u(EbgbnU1`n9AWAZ6>pYp1KlwR1`o} z2fsj5ma~~)V(wyu8rgrXihj_3=qgIP!DN+Ha4V7#I3oDG*m_XWTU-L!wk<9{Jl4r7 zT-7CH^26|y+E4u@7Z%?E>ZDMWvz2O0f@AuFI-rH4WY9j+a~Ew`(^>w+z?>;Nfg1#+Dapv&ne zI=X!UxZVQnz;UCPz=@~i`WqPEl%aJ(1muSk;$X)C2N}Uw$omDSzzEvO`&yV5^Fy9u zcG9UN^aJ{_)%?vaVyWyujh-)+S;94mhltAt>;A1f&yqw>t<4R-%d@WoFH*aMF=ovYs82YN;=x;0ObO{$0Kpmo7 zjRu_0g?*XFd5J8^M4&`32M%LLgU29OAYm%Whxy0_;WtjuN%(?I$yVeSD&3ALWin)# z9(U`1Mlg7=O=^XMykbfdN7PnSgv=Ucq+?iZ zVWv+z_B9e&-R8t7En7&c&Wv!GsiUeL%}B(Ov?fAOp<09qo%|-h0FB63Ta!w5&|!%h zOUPu>v0;sk8HhjPcMdn zOcm%cI$3){R%iQm=T5&YkqKkDCE)Ynz>=`A7|8wzd%3w$Mg&5Z|UF$aC|p2CrrDyg^W~Ydl3^h<@xh< zTmdRNeomf$P9fLY4)c-Df;@jA54I}a8O3bE@u%Itv!g)CQAmBS4NY%s zGZfB2{&WQV$PW-yXS?T4rmtnYkET#yWVJ!l<8kyraX}56nrd?3kLNEkc)}kjP{Nhz zQkhMlF9Xm(Y+*jL@34o#)MyLLE4dspeB|*b&kw4B@Pio?;_U5AbVn-SU#f#lc{mh- zoz}jS-2e~sS~;8t0^T%-&RyGNKm5>aBNyt<<@7yw0qn3N7pBYM3WHU8W2%l5he}@w zJ#9FAA7pxb0KQ6}6HkS;mn|8(Yo@*@2U;E0>d*-m6tb5L=|BGwT!xNjn?q+ccb`bY z3Re_a!g>=q`sW(lWpfFpFsagd_f_J_AZ96`0=nMSL`xGT+;g6n#H#_9urR? zVumT)dBSiW{}PN_$}4;V(w|~HI*1GcMuod`d*i~^aJ2ytw@PL}Mm$#fEFg5~5gr*6 zz6XDo9J}ihVRyK4hL*8KyX4s2UBD7k@3VLRNiH0&z7RWh*5z;qWp?cSAx}iI?nSs( zn|qK~XRWUzN&!yO&ZC9ctRe&|-JLLL>D-G!xA&cD6dFuAq|7moDo}-#NGWsD?-VPfL`vzC8;*cjq(`-l{&Ug}%(0hq8Y6N-T z*{R`JDt2bX9OgQZf6v>qAOSfL$PJg{a}ZQ_D>O9njnQ-QxIJ72r9ZbtgTm1}D3riG z6YT$ahabog(2O z6PVgG%^u#Ei|{kUWl5MDFBQBAezmldC(U&N=f=LdIO1pHkSq$bHZdOzcs!UV87U^ z;aFc$+5l3yF?VZ*yB)}5w@MBpki={l2annccmx;U6}S{J{p&SG&S;e`1N5T$0VTyM zotvWL_6^poqHbG`7hJ$h4LE6qk2FJ11d)C>h1zJ9GFXC}o1<=A%PJLhUWUBm+lO@L zQaS)Uy`cP}c%{o9?jQJ7$}7KVs_RcvK223_{BMT*t5v0Q>5tr?ee!cyIdUT5tzRDU0qJHH8_~^apvk8nAZ8&q#!W_ zbBZ$si^G`dc7kpO>y9hW=kk~77>|oepG6h0F+1FC2nVLc>vDJM4rT#0MjnK((7E*8 zGY_q~*2o<|ip3t!gzpc&J8~H4HPD~lXZc8f==k2jKdj=+{gnpI_c4=@Rr*}C8D!}D zNZ3GLu=}IyghjhAf!{n~A$(se+!$R7&*8FMm<->|f$I(;qoaifkq^;1tiK&ZXwm5h z5lnQ7c~Y!jE)&wcNMHtnQ^iKj~IV0B!ZNYY{XLU2e-H z9oM$k15ew;tcP!h-@fX!(9pTiaN0-%AiB35lEf@ZNgpYPl>WMp`t&2iP#Mq<25iml ztw}8P3YL=?{wiE^6kIb>kQ}NShvd(yWF!p~o4sJZ@hbDL=SIAqB^ zx7Dzfi&$b-=?G-(JKC334H_qSCSRDodrI)kTw%&c526cZUhvF@z^?x4cwg2~b$mm0 z)H{^LSJy|~$remjT9AYJKN~HZ$xl$Z)-aL<)UnRCZa$p|Vv$<(Kmyt1|RXtU1`<%Em@(v&~Xvu~}>!-8k$P zTeGR!Qs2n#O=h#j+Q^w3>Kh@gxzqHf-a&J{GaFdw-XNVn1gG0yh6YD*(0D{d%#M*#iH9WKG`WlA_%1pSp*%4j55 zYNx)@sG6sgp29&k4FvV^EM}hEdYzHmnkIc4ZV&GVal@GkkNqK>Me?)<9*EUiX1in! zS8LZnfzU8cPNr^qW$)tZRZQ+qXF|SVgt!4R?0p?TS*0?ngzp{H_x=_{vNs+;qrvTj z9MY^g92pc(pNv%V^G2;w7S=R`6`cxPO}!K*GH+BFIrlEi-&c_X5Z}6ndYWuiXsv6v zYMP{9W|HBtWK1ZNdpB4m!AxeAEQVjJ`zrv#{Vjy!X6f#e09jf@K)*;pjYHa-Iq^o0 zS~Rw{N%|UeBXMXir!=vOs^LdO>|IDm_ji&_U6ZL8cpJmhu?RHQBEBRZ551l)%(zn@ z8cP#07Uv5Ks^M!se&tn%vwEHmWcLgTSM}{Q~0C1rs@~tn*B=FGDStEn7Tb6^xTs9BAbEIR%k` zJ%Ou5v;m!XBC1b}$98G^)i9VO=3pu7FOBFft-$FQ z*V2j(5BS%)THIdx!i0k{BzgIk-9=|`} zY6Ug3Vg(=QyuH)Ay^~+DLdW53muO;avhNi@03%k7I2|uQCg-8pEWR1UW{H;ddoA#4 zD<{o?+kI}5aDLb_df#Fr7&v2c`y(4iBNh<+57V(sEMj@xYTr6pdX;W@N;wWGQ>5QO z%5X+IfWg1vj4rskt6H8g>|co!hQ$XlK|C(L7tZeaEr{Z?Ac}tnQ9P0q#UpA_Jgzyu zZ$FzRO0DVGhmS9S-iAq5>E`7$+_^VZLlV|z-HVN|x>sYKO?WANP@cmsLr-5%{dWdH z*}FmM%`4M5)(W_8PlHk0b$}s`f9r2Ue%n`CYHK;a`vT(wE_zER>_nm>znQwp>6{w>~=Yc{t4+y$em1p z$(W9c^V0hobby4;#)Zt@SA^T6WzZvtB)^9TVaph^Dd;+;Q0wP#OLb;Io#M;`Sm_Az zPL-&D=~s%v_1z5Q$X7^zD!|KG{+bM z;;V({3P;Q1Fp1gTut$X@P*g^7tyHx$sW|i4AncyE2-_hYZw8zT&qmA| zXp?V84mx}QlFVG@AFpk&gXzgrC+C?(2t8I&vu#dKd%)*fs>?~~!{orq4wbi}qR{vL z8;%DX$7rnh@i}UW_!{)dtS6`^E+QRy((0xjj@|ZsWCTjSA=G^`9?*x;w1Qr+nH3Ii zJc)gg#;Vy!b}W+#&-O9BHRiqsQ>(RBY4l@AW$KL=uR?r!U%7jVbow;N5JPYGEJXsL zKV7~(hZ}-<_9BoZYQK167gL2q>8A7b=T8?W^e5~0FMdoohRR9N3$vkdO>XW+D1bg8 zt8@<(C>D4rn2lx-;EASltRl(tM8kJ8U?&f${7fp{XR z861QuP2vF8H8QSeVi&-5Rub3W#niYCQi<~sP0SJJp`U~#%Mr_Ar0Ld?vW;Gk^Klfd zm^Ez4wT9EJ(u2TvF`eWp77yfx%}lOzG3PCDuAEF#P%kX z4_R~xK1$)@)8iz!iq-JQS+(Tmr$}xsJQK4LVp|1by9AS}wQ7nc{mI!@0{IOF(&`Q_ zNH8StrW|(3>6VNGM-~_pqMc$IFkmNclm#xyVk((n=XGa4 znVs=7YIeSN=ECfp$b1;^-^pLc7x;ZGpme(Yg?xEA?-zXSuFe9uTR0cpsX#>p4ywREv( zQ!WO(%fr=JaAmHBu3_$yv((7at>l6Z8+lwNiTUk$ex$vmq44u&gio(;e zz^QxCBd8Bt71rJ>-ZKi<(Obn+!$FLw-waSkUPYa|H<#*!0g+#-c8k|8ns`Nna5)uZ zpmoDRgj=QH$kKUX#wlZ^o=vJ(!ZT_3Qj%866LH)p-aiJzWuz`BM$j~j+;51J$w7(t zh>;jx+`owuwU{9?53eJ*Aag3XAFI~)HUst}L#)5K?|@pw6XMJN{8aOV(JJ+HfigHs z*op%OSWoLukJQ~KMp6-v5aN+k#3O`wWIW>0$uz$8r}w3qEBe!6daW%h0mC4T8~HL+ zA(KwuyZ#(mTU!@|iMCd$?IYRtF@p}7L|BC%z(>Jl#rocJkUh9d1A{(d!K8**d^?aN zV!2Q3C6paO@&5Brw%jB3UX0dB^9dvtFgf0tqsXY?RIpu(eCRm=b%lchT2lt`{#+;= z8q5}Zvk?~hYa)0B4GJ#_9np$(x3zq&)OSiAJOaDKG4U*9NbyL_6&9G`Yd(JEnZxN5 zc_fY{JQC4#v$^nW=vcaY_fnimAM4Da846n4H-DJJwe9U+ivH!wMIS$WA6)fSE{cmE zF#}?)^x=nuN<2cyKZW0%{tIUK*&9K*vIO^jk$!vj-cP@MXbK8wo+53n(nA0sOys4W zdD14$$pUf^k>PfY6#h^)6a^#POLv{jA*=s}lW4GZvOD*~DgEy^3slQeX2>GzpKvdO z3LW<8rDOn~LkspP$R3U`6rjRyXJSrmoOuw&XC6q+9H7jj=O)hFlA3uXWM<2h@-Ug_ z2SsUWrAQ?f;edA3NBDoitnEioJ``!oBps>(Wrb-VM+HVgjUmy|h$ z0PuN9nNGNIL<3pM+JwpxocYV`FB62hyLDwg;ii#4!|g!XHsOY{9m2|y=Q*keEWK-? z*icr^$d#zyhO%@cmr_FRh>m_IkEGG>q!ElL7|O~Xd7pl>M*bUqX&py@Xa?96rz#Da zN_`Ik?w?T=sW@DgvE5KQ*mpd#^4aKYC2X}`bys)PF2p- zR0gK>>7m8At~1gLUq{~1GH{uZ+DXqwFJVCN=KE1Cd>@C*xTw>okFJvux(u<=3af%E zZr*JP9X;MZyDDNnUY51}CaCd5r13bU$W^fP*^%5A5WzjC&%yV0J4R*h?Oqd4WoAf=u#>ATx`yN%B&L)ZPql!fZ@Lb@F;@C(*!u~&AdTPm- z|LuN*F?gmxxD3}%<_OnBqcXjNX9|T$(LYs1UuJHv`oQl;qR1gD81sFOcNb3;9R2BL zkfF@74MJAb6fwu6KMHogn;*EMKfNqpDA=7_HdmMvEnwx#HUwrzF~}ie8HE|H<74W? zpq4Vt(F~9$&9Q#VyNlBUKY&TwNDC^pTQ&WbcNSM@gpEv}V_i8=mo92SHz8D44Gqr^ zTuIdx?w$gaoK_idQE{{5kalEm_q7ITD^6HF*uZP+o zacg;#Gu0TwT;>0Yak7MmiXdyVLgoVS>|e440X{;l#5zg?~Ui<9Ca+RJ>CTTKa=3U z_)+vK@s#FRbS4Q-?(R$woXn^WBqkG}RmaW!2s-fHp)8OxO%jWNWdF6GZp9Ad%Yshz zMeG->9~pLMVLzG?eG@y7jye#vuRicxv|ZJCZeaqQ4Or(yE5%cY_hZz3K9xLAKXZZp z^9c5zR_s5nRK8Ao9Ca3wkNF3g=9zXmEv4faA>;;+@_o}TkLvOH_i(^l`X0;$-%`q$`5v<`fsh% zM-fpNS*FZy^87`7J4{(Hw2b^hITRubP?XeUe7oIkX|FAA2sCy%gyNM>d+}zAtG>9U zp~Kp45iG5oJh_6h9zSaa&i|lB9k-y>wQWIXpuPQKG$?Skwidg+-rKL?H@n&}zMj?} zDTysbDw|Faw?bV3n{DxKm$TL7D`tDE<`nY$xCdJT7;+3x5+w>?@`cg+s>kkDUvXF4 zjzZirRj}E$#nUNoo+|LWglkgj;0wF~f%X~|7EY9j0W4r`FAj9Iz^w6_#QpLXDw<4i zc6GTrTh&{&0G_8!dA=fnnsUL>xNIswm!y(w1)pCeKjRCElKGXy!ombgg^u=O7RgiW>ZI*j1?|p`&8<$N z7i*?MS$|-&U+@UH*Ah}x#L6$2bL||NXl3kT&hiv;Vh(3V*D`oG=h}9G{ceHZLZs%z zQmm|^J2!iM6seDUIN17EB5WxU)&yOxvZ3C>nJOA=jTkUsuC`xaQ0=f|AQtLB)xy52 z|EI_hZM|XrUQWTqd}Z$%c5PhAyTCeNy`#34?=lB`btD29w7wZ6+fF1XC`|gC4dLmy z5=#bsa49ETtq!QQNjv_Ajwj6VaFvlJ|17xjWN1vcT^H8&PFuB#i)IcSFswFm=wEA+ z$|dGsBS1~=;3^}V3LTk~qpT9)e2CKC_*){4EhQaS62jA2Od!9^nk(eeY;6DEm@n|E zKh~f-T5yG@zm8YW1?Hy29tQyx>F`@@4ewr1meQqwQaJ5#+z%fbo3=eoJc8c6ur_j^ z0|t|Dh1ME2&twR@`PDMMm&}pfz2uwY*qY_NK@O+TI|2HHbXWcq`7>2m>MJdkGUCgw)xjOZf`9WS8+P8AjJe!8w`#g!9A+$rw1td0=Hohera2FWo znSbwsqpKXF%CJVGWdh8*-yDZI^U|hoyD2=GB=A|Gh#EsHuf2mpdf2M9g-wbe1?y!& zdgf|IWEFI~bTvR1PyCb45`Y@q71s$VvG-eb(!swZ*{YJ?vFz=ag~l>{7>~O(?*1dB zOYZ_6uDS$NRPd#xJYuz z(0+gx9Szbf>OV2}rZwoiN2fo?dAdUb6aAzOInVwC^SqyQ7l24eQ9wr(FMz=U&rr+w zfza7m`p2X13ZNfcQ`F}a*`9{` zqBSTrF^niglRA^}#2h+%wf^(vATjc)i9+vCIgyqYi?%A{mE5cp&0EH-jK*buk>%IG z+%Ow+rNFm1Ra`up#7&X~x<5-p6I#k#q-4REQ_1`-M(Dw6AoOhPWrHh|i*c8%P~z+} z8SybTUP;n%N^Aol=zSwc9!pqbWc!pY11K9zUG1JW`0}G;z7;P!Tm5bqSfFG{a-LS) zkqqgcHYmU`V~F!~wzLOYT^x2=j_tsKVbi&#!^yG2wDt4?YB(A7lL#WFjYEnGDB|Z5 zD#?vSN@Qi^Fn)iE@_A@j^Bqp1#Z8emg3~7~0EleYmS>ww$LZ#BDRcXc+0n_YmZ403 zs4C8r8^tbFypf}XVhDMA--eDBHyVO>$2SNs4P|mw!DZJ3?BXb`uFCQyzB*2MTq`W7 zg0K1bl~)zcoJe^LC6vcI=~Y$HN7yR2{!qI3ds^QXCYj-eEp>m0$*)Bx$@Q@Z8ckN< zLzq7{3-6W{3sHcdC#PrYd)9+Y!@S%qubpdDu*8?gVLL}yPyt`_@hh()oHh}*M-$lo zcX~y|l9#t#$^2Q-Y@q2XxSymyR1s(1EcCyJ&KNo{-VXAp$)6hJ_&8YpC)Nn zlQKJ=7Y^eiWtLrvUd3#EFRnlY%St(Y4=#jPhvJ59KmClHJfSguo38&hkXoLLrVsoS zTh|nxj_qW-$DoA|Hzwxi&(9=1-Sdi&-gg@xife_d^!E&-Z#oWE#v!`M(ckkkTv54| z#vkYiP12HAb2uDHjnUi0(SK6D#nI^HWROIJ@Z6Hsx-jIFTG5Qt?tMzC^)}-g=iHu z)3(snnxXV^@z)8JD=S=+{*XqNkA6*Gx(S_jm&&+ZLfjYr234?i=HO;6$4!&3Ti}`* z|9c)rPio4_b04O##b@!cE_AQbT5{x`O>iwQLEjUEYtW9wA9P12v?SoWX)cc0`AH?n z;|xF0DbP70^3GQ|E<9(v3e`isFfMt}TIfr!R4AO`^Pffyl`oopBKh zU@YM-Np@re+l-G_6noGv#~uW-`!jK!MuQ7#W%{1eKuFR^VMnfLMa|;wTAkSP*d%?m zMA`4iQv}kcTN54mhN&32lRI)s!}hbF4EJJ(wMJ+O(JGxgAuA=pjK=r{l%(WP?XJXYn6MLRvJ+2#vt<0Q?*|%ap1oVhX z!&MYQE@p~1GBu9omwPT0ky|HSy9NqYWk;%}iI!Zk3jWcOaF?pGG`t8126DyTAF_p3 zP}=5DVq1XcMMj%z;8&rf`vxe^$|)NIuDBFOiyiMF1S6x*{Rq!S8x9&@OpZ9qldvbt zuz&f23ifh@{lN<=*oQ7b*s~aH&8vm41@Th~bKFHk%N(q6P0)F7d) z4CIsw(UAoAK1_T1xws{}Y>uE6PeiM5{Fp;iN5hMXbS@Z@J3&bHo_zc~)51UAXk?MR z)&^C*+2RR#b-?WH=%Q28)H?)pa})Y%0#KhQr9V=j9o7U=mCLN|OE6eSn^~z3>V4$?K3!dPI*> zk@+skEE}`7>LO;HRT_FeSw7>5sm(@4P4N~jjj1g!$YZJ!K%OO@7ChNfw^EA<%E1I=UVYAjMP5DC( zvj#qV4tj-IOXHg2W1zj}Wb?5~*v8-#at*G7dUj4ha=r9-XuE2CFgrdOt(cwYV{^yX z$&^Z#L_=@|mHfuviO^6T&7F^azyK+8eHjjhK)bcKP6+3t$q2^*aFRGH=(=?impMjd zu92}GNW?uN4&!V(9w10xqWtf@JuW}Pc}gnI%D!)Uw(!r&^5CQpIu;L}1WPZQ*?5Wm zHE@2pGjGV{1U;3z2g~K6JWp6QTXB0(fZSCpXlO`@>2zePETicv%gAw2%jgn0DC|O( z(E+lIu66asck`G?!&hDQQJiSrhvk*sbvUG!|=LP0M|543@ zg3C7s8pGAO7;irbqyKQTko;IHRLKKI3@EznKXIQzj13dwF_`$X0Vk#!a4fOlVyN+l zfOF~K$P=6re-ao2ko^FX?c@FnTX4?q`!!4#;CYo||08d*0;B!2gJ+wCk>J^4;Y}JJ z+4hl|*W&TM*{mtz5&fZKG*Xe}KCVUg^ggTaxicP*2bTbY@1QsT%=RPBHJ#Q0vYPOG5yPmJ&N_?_*YfsO)xe%GCLzVN&l zv5g=WhG9#LCK(&Y#K1|hdvvct *>F9BlCj$ZnN&1K}GS1Z%5Y(dx18{a)j$-!kM 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. -END - - -# $VERSION -# -------- -$version = <<"END"; -autoheader (GNU Autoconf) 2.56 -Written by Roland McGrath and Akim Demaille. - -Copyright 2002 Free Software Foundation, Inc. -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -END - - -## ---------- ## -## Routines. ## -## ---------- ## - - -# parse_args () -# ------------- -# Process any command line arguments. -sub parse_args () -{ - my $srcdir; - - getopt ('I|include=s' => \@include, - 'B|prepend-include=s' => \@prepend_include, - 'W|warnings=s' => \@warning); - - if (! @ARGV) - { - my $configure_ac = find_configure_ac; - error "no input file" - unless $configure_ac; - push @ARGV, $configure_ac; - } -} - - -## -------------- ## -## Main program. ## -## -------------- ## - -mktmpdir ('ah'); -parse_args; - -# Preach. -my $config_h_top = find_file ("config.h.top?", - reverse (@prepend_include), @include); -my $config_h_bot = find_file ("config.h.bot?", - reverse (@prepend_include), @include); -my $acconfig_h = find_file ("acconfig.h?", - reverse (@prepend_include), @include); -if ($config_h_top || $config_h_bot || $acconfig_h) - { - my $msg = << "END"; - Using auxiliary files such as \`acconfig.h\', \`config.h.bot\' - and \`config.h.top\', to define templates for \`config.h.in\' - is deprecated and discouraged. - - Using the third argument of \`AC_DEFINE\' and - \`AC_DEFINE_UNQUOTED\' allows to define a template without - \`acconfig.h\': - - AC_DEFINE([NEED_MAIN], 1, - [Define if a function \`main\' is needed.]) - - More sophisticated templates can also be produced, see the - documentation. -END - $msg =~ s/^ /WARNING: /gm; - print STDERR $msg; - } - -# Set up autoconf. -my $autoconf = "$autom4te --language=autoconf "; -$autoconf .= join (' ', map { "--include=$_" } @include); -$autoconf .= join (' ', map { "--prepend-include=$_" } @prepend_include); -$autoconf .= ' --debug' if $debug; -$autoconf .= ' --force' if $force; -$autoconf .= ' --verbose' if $verbose; - -# ----------------------- # -# Real work starts here. # -# ----------------------- # - -# Source what the traces are trying to tell us. -verbose "$me: running $autoconf to trace from $ARGV[0]"; -xsystem ("$autoconf" - # If you change this list, update the - # `Autoheader-preselections' section of autom4te.in. - . ' --trace AC_CONFIG_HEADERS:\'$$config_h ||= \'"\'"\'$1\'"\'"\';\'' - . ' --trace AH_OUTPUT:\'$$verbatim{\'"\'"\'$1\'"\'"\'} = \'"\'"\'$2\'"\'"\';\'' - . ' --trace AC_DEFINE_TRACE_LITERAL:\'$$symbol{\'"\'"\'$1\'"\'"\'} = 1;\'' - . " $ARGV[0] >$tmp/traces.pl"); - -local (%verbatim, %symbol); -debug "$me: \`do'ing $tmp/traces.pl:\n" . `sed 's/^/| /' $tmp/traces.pl`; -do "$tmp/traces.pl"; -warn "couldn't parse $tmp/traces.pl: $@" if $@; -error "error: AC_CONFIG_HEADERS not found in $ARGV[0]" - unless $config_h; - -# We template only the first CONFIG_HEADER. -$config_h =~ s/ .*//; -# Support "outfile[:infile]", defaulting infile="outfile.in". -($config_h, $config_h_in) = split (':', $config_h, 2); -$config_h_in ||= "$config_h.in"; - -# %SYMBOL might contain things like `F77_FUNC(name,NAME)', but we keep -# only the name of the macro. -%symbol = map { s/\(.*//; $_ => 1 } keys %symbol; - -my $out = new Autom4te::XFile (">$tmp/config.hin"); - -# Don't write "do not edit" -- it will get copied into the -# config.h, which it's ok to edit. -print $out "/* $config_h_in. Generated from $ARGV[0] by autoheader. */\n"; - -# Dump the top. -if ($config_h_top) - { - my $in = new Autom4te::XFile ($config_h_top); - while ($_ = $in->getline) - { - print $out $_; - } - } - -# Dump `acconfig.h', except for its bottom portion. -if ($acconfig_h) - { - my $in = new Autom4te::XFile ($acconfig_h); - while ($_ = $in->getline) - { - last if /\@BOTTOM\@/; - next if /\@TOP\@/; - print $out $_; - } - } - -# Dump the templates from `configure.ac'. -foreach (sort keys %verbatim) - { - print $out "\n$verbatim{$_}\n"; - } - -# Dump bottom portion of `acconfig.h'. -if ($acconfig_h) - { - my $in = new Autom4te::XFile ($acconfig_h); - my $dump = 0; - while ($_ = $in->getline) - { - print $out $_ if $dump; - $dump = 1 if /\@BOTTOM\@/; - } - } - -# Dump the bottom. -if ($config_h_bot) - { - my $in = new Autom4te::XFile ($config_h_bot); - while ($_ = $in->getline) - { - print $out $_; - } - } - -$out->close; - -# Check that all the symbols have a template. -{ - my $in = new Autom4te::XFile ("$tmp/config.hin"); - my $suggest_ac_define = 1; - while ($_ = $in->getline) - { - my ($symbol) = /^\#\s*\w+\s+(\w+)/ - or next; - delete $symbol{$symbol}; - } - foreach (sort keys %symbol) - { - print STDERR "$me: missing template: $_\n"; - if ($suggest_ac_define) - { - print STDERR "Use AC_DEFINE([$_], [], [Description])"; - $suggest_ac_define = 0; - } - - } - exit 1 - if keys %symbol; -} - -update_file ("$tmp/config.hin", "$config_h_in"); - -### Setup "GNU" style for perl-mode and cperl-mode. -## Local Variables: -## perl-indent-level: 2 -## perl-continued-statement-offset: 2 -## perl-continued-brace-offset: 0 -## perl-brace-offset: 0 -## perl-brace-imaginary-offset: 0 -## perl-label-offset: -2 -## cperl-indent-level: 2 -## cperl-brace-offset: 0 -## cperl-continued-brace-offset: 0 -## cperl-label-offset: -2 -## cperl-extra-newline-before-brace: t -## cperl-merge-trailing-else: nil -## cperl-continued-statement-offset: 2 -## End: diff --git a/bin/autom4te b/bin/autom4te deleted file mode 100644 index ad8fde33..00000000 --- a/bin/autom4te +++ /dev/null @@ -1,1231 +0,0 @@ -#! /bin/perl -w -# -*- perl -*- -# @configure_input@ - -eval 'case $# in 0) exec /bin/perl -S "$0";; *) exec /bin/perl -S "$0" "$@";; esac' - if 0; - -# autom4te - Wrapper around M4 libraries. -# Copyright (C) 2001, 2002 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - - -BEGIN -{ - my $datadir = ($ENV{'autom4te_perllibdir'} || '/usr/share/autoconf'); - unshift @INC, "$datadir"; -} - -## --------- ## -## Request. ## -## --------- ## - -package Request; - -use Data::Dumper; -use Autom4te::General; -use Autom4te::Struct; -use Autom4te::XFile; -use Carp; -use strict; - -# List of requests. -# We can't declare it `my' as the loading, performed via `do', -# would refer to another scope, and @request would not be updated. -# It used to work with `my' vars, and I don't know whether the current -# behavior (5.6) is wanted or not. -use vars qw(@request); - -struct - ( - # The key of the cache files. - 'id' => "\$", - # True iff %MACRO contains all the macros we want to trace. - 'valid' => "\$", - # The include path. - 'path' => '@', - # The set of input files. - 'input' => '@', - # The set of macros currently traced. - 'macro' => '%', - ); - - -# $REQUEST-OBJ -# retrieve ($SELF, %ATTR) -# ----------------------- -# Find a request with the same path and input. -# Private. -sub retrieve -{ - my ($self, %attr) = @_; - - foreach (@request) - { - # Same path. - next - if join ("\n", @{$_->path}) ne join ("\n", @{$attr{path}}); - - # Same inputs. - next - if join ("\n", @{$_->input}) ne join ("\n", @{$attr{input}}); - - # Found it. - return $_; - } - - return undef; -} - - -# $REQUEST-OBJ -# register ($SELF, %ATTR) -# ----------------------- -# NEW should not be called directly. -# Private. -sub register ($%) -{ - my ($self, %attr) = @_; - - # path and input are the only ID for a request object. - my $obj = $self->new ('path' => $attr{path}, - 'input' => $attr{input}); - push @request, $obj; - - # Assign an id for cache file. - $obj->id ("$#request"); - - return $obj; -} - - -# $REQUEST-OBJ -# request($SELF, %REQUEST) -# ------------------------ -# Return a request corresponding to $REQUEST{path} and $REQUEST{input}, -# using a cache value if it exists. -sub request ($%) -{ - my ($self, %request) = @_; - - my $req = Request->retrieve (%request) || Request->register (%request); - - # If there are new traces to produce, then we are not valid. - foreach (@{$request{'macro'}}) - { - if (! exists ${$req->macro}{$_}) - { - ${$req->macro}{$_} = 1; - $req->valid (0); - } - } - - # It would be great to have $REQ check that it up to date wrt its - # dependencies, but that requires getting traces (to fetch the - # included files), which is out of the scope of Request - # (currently?). - - return $req; -} - -# Serialize a request or all the current requests. -sub marshall -{ - my ($caller) = @_; - my $res = ''; - - if (ref ($caller)) - { - # CALLER is an object: instance method. - my $marshall = Data::Dumper->new ([$caller]); - $marshall->Indent(2)->Terse(0); - $res = $marshall->Dump . "\n"; - } - else - { - # CALLER is the package: class method. - my $marshall = Data::Dumper->new ([\@request], [qw (*request)]); - $marshall->Indent(2)->Terse(0); - $res = $marshall->Dump . "\n"; - } - - return $res; -} - - -# includes_p (@MACRO) -# ------------------- -# Does this request covers all the @MACRO. -sub includes_p -{ - my ($self, @macro) = @_; - - foreach (@macro) - { - return 0 - if ! exists ${$self->macro}{$_}; - } - return 1; -} - - -# SAVE ($FILENAME) -# ---------------- -sub save -{ - my ($self, $filename) = @_; - - croak "$me: cannot save a single request\n" - if ref ($self); - - my $requests = new Autom4te::XFile ("> $filename"); - print $requests - "# This file was created by $me.\n", - "# It contains the lists of macros which have been traced.\n", - "# It can be safely removed.\n", - "\n", - $self->marshall; -} - - -# LOAD ($FILE) -# ------------ -sub load -{ - my ($self, $file) = @_; - - croak "$me: cannot load a single request\n" - if ref ($self); - - (my $return) = do "$file"; - - croak "$me: cannot parse $file: $@\n" if $@; - croak "$me: cannot do $file: $!\n" unless defined $return; - croak "$me: cannot run $file\n" unless $return; -} - - -## ---------- ## -## Autom4te. ## -## ---------- ## - -package Autom4te; - -use Autom4te::General; -use File::Basename; -use Autom4te::XFile; -use strict; - -# Data directory. -my $datadir = $ENV{'AC_MACRODIR'} || '/usr/share/autoconf'; - -# $LANGUAGE{LANGUAGE} -- Automatic options for LANGUAGE. -my %language; - -my $output = '-'; - -# Mode of the output file except for traces. -my $mode = "0666"; - -# If melt, don't use frozen files. -my $melt = 0; - -# Names of the cache directory, cache directory index, trace cache -# prefix, and output cache prefix. -my $cache; -my $icache; -my $tcache; -my $ocache; - -# The macros to trace mapped to their format, as specified by the -# user. -my %trace; - -# The macros the user will want to trace in the future. -# We need `include' to get the included file, `m4_pattern_forbid' and -# `m4_pattern_allow' to check the output. -# -# FIXME: What about `sinclude'? -my @preselect = ('include', 'm4_pattern_allow', 'm4_pattern_forbid'); - -# List of warnings. -my @warning; - -# M4 include path. -my @include; - -# 0 for EXIT_SUCCESS. -my $exit_status = 0; - -# Do we freeze? -my $freeze = 0; - -# $M4. -my $m4 = $ENV{"M4"} || '/bin/m4'; -# Some non-GNU m4's don't reject the --help option, so give them /dev/null. -error "need GNU m4 1.4 or later: $m4" - if system "$m4 --help &1 | grep reload-state >/dev/null"; - -# Set some high recursion limit as the default limit, 250, has already -# been hit with AC_OUTPUT. Don't override the user's choice. -$m4 .= ' --nesting-limit=1024' - if " $m4 " !~ / (--nesting-limit|-L) /; - - -# @M4_BUILTIN -- M4 builtins and a useful comment. -my @m4_builtin = `echo dumpdef | $m4 2>&1 >/dev/null`; -map { s/:.*//;s/\W// } @m4_builtin; - - -# %M4_BUILTIN_ALTERNATE_NAME -# -------------------------- -# The builtins are renamed, e.g., `define' is renamed `m4_define'. -# So map `define' to `m4_define' and conversely. -# Some macros don't follow this scheme: be sure to properly map to their -# alternate name too. -# -# This is because GNU M4 1.4's tracing of builtins is buggy. When run on -# this input: -# -# | divert(-1) -# | changequote([, ]) -# | define([m4_eval], defn([eval])) -# | eval(1) -# | m4_eval(2) -# | undefine([eval]) -# | m4_eval(3) -# -# it behaves this way: -# -# | % m4 input.m4 -da -t eval -# | m4trace: -1- eval(1) -# | m4trace: -1- m4_eval(2) -# | m4trace: -1- m4_eval(3) -# | % -# -# Conversely: -# -# | % m4 input.m4 -da -t m4_eval -# | % -# -# So we will merge them, i.e. tracing `BUILTIN' or tracing -# `m4_BUILTIN' will be the same: tracing both, but honoring the -# *last* trace specification. -# -# FIXME: This is not enough: in the output `$0' will be `BUILTIN' -# sometimes and `m4_BUILTIN' at others. We should return a unique name, -# the one specified by the user. -# -# FIXME: To be absolutely rigorous, I would say that given that we -# _redefine_ divert (instead of _copying_ it), divert and the like -# should not be part of this list. -my %m4_builtin_alternate_name; -@m4_builtin_alternate_name{"$_", "m4_$_"} = ("m4_$_", "$_") - foreach (grep { !/m4wrap|m4exit|dnl|ifelse|__.*__/ } @m4_builtin); -@m4_builtin_alternate_name{"ifelse", "m4_if"} = ("m4_if", "ifelse"); -@m4_builtin_alternate_name{"m4exit", "m4_exit"} = ("m4_exit", "m4exit"); -@m4_builtin_alternate_name{"m4wrap", "m4_wrap"} = ("m4_wrap", "m4wrap"); - - -# $HELP -# ----- -$help = << "EOF"; -Usage: $0 [OPTION] ... [FILES] - -Run GNU M4 on the FILES, avoiding useless runs. Output the traces if tracing, -the frozen file if freezing, otherwise the expansion of the FILES. - -If some of the FILES are named \`FILE.m4f\' they are considered to be M4 -frozen files of all the previous files (which are therefore not loaded). -If \`FILE.m4f\' is not found, then \`FILE.m4\' will be used, together with -all the previous files. - -Some files may be optional, i.e., will only be processed if found in the -include path, but then must end in \`.m4?\'; the question mark is not part of -the actual file name. - -Operation modes: - -h, --help print this help, then exit - -V, --version print version number, then exit - -v, --verbose verbosely report processing - -d, --debug don\'t remove temporary files - -o, --output=FILE save output in FILE (defaults to \`-\', stdout) - -f, --force don\'t rely on cached values - -W, --warnings=CATEGORY report the warnings falling in CATEGORY - -l, --language=LANG specify the set of M4 macros to use - -C, --cache=DIRECTORY preserve results for future runs in DIRECTORY - --no-cache disable the cache - -m, --mode=OCTAL change the non trace output file mode (0666) - -M, --melt don\'t use M4 frozen files - -Languages include: - \`Autoconf\' create Autoconf configure scripts - \`Autotest\' create Autotest test suites - \`M4sh\' create M4sh shell scripts - \`M4sugar\' create M4sugar output - -Warning categories include: - \`cross\' cross compilation issues - \`obsolete\' obsolete constructs - \`syntax\' dubious syntactic constructs - \`all\' all the warnings - \`no-CATEGORY\' turn off the warnings on CATEGORY - \`none\' turn off all the warnings - \`error\' warnings are error - -The environment variable \`WARNINGS\' is honored. - -Library directories: - -B, --prepend-include=DIR prepend directory DIR to search path - -I, --include=DIR append directory DIR to search path - -Tracing: - -t, --trace=MACRO report the MACRO invocations - -p, --preselect=MACRO prepare to trace MACRO in a future run - -Freezing: - -F, --freeze produce an M4 frozen state file for FILES - -Report bugs to . -EOF - -# $VERSION -# -------- -$version = <<"EOF"; -autom4te (GNU Autoconf) 2.56 -Written by Akim Demaille. - -Copyright 2002 Free Software Foundation, Inc. -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -EOF - - -## ---------- ## -## Routines. ## -## ---------- ## - - -# $OPTION -# files_to_options (@FILE) -# ------------------------ -# Transform Autom4te conventions (e.g., using foo.m4f to designate a frozen -# file) into a suitable command line for M4 (e.g., using --reload-state). -sub files_to_options (@) -{ - my (@file) = @_; - my @res; - foreach my $file (@file) - { - if ($file =~ /\.m4f$/) - { - push @res, "--reload-state=$file"; - } - else - { - push @res, $file; - } - } - return join ' ', @res; -} - - -# load_configuration ($FILE) -# -------------------------- -# Load the configuration $FILE. -sub load_configuration ($) -{ - my ($file) = @_; - use Text::ParseWords; - - my $cfg = new Autom4te::XFile ($file); - my $lang; - while ($_ = $cfg->getline) - { - chomp; - # Comments. - next - if /^\s*(\#.*)?$/; - - my @words = shellwords ($_); - my $type = shift @words; - if ($type eq 'begin-language:') - { - error "$file:$.: end-language missing for: $lang" - if defined $lang; - $lang = lc $words[0]; - } - elsif ($type eq 'end-language:') - { - error "$file:$.: end-language mismatch: $lang" - if $lang ne lc $words[0]; - $lang = undef; - } - elsif ($type eq 'args:') - { - error "$file:$.: no current language" - unless defined $lang; - push @{$language{$lang}}, @words; - } - else - { - error "$file:$.: unknown directive: $type"; - } - } -} - - -# parse_args () -# ------------- -# Process any command line arguments. -sub parse_args () -{ - # We want to look for the early options, which should not be found - # in the configuration file. Prepend to the user arguments. - # Perform this repeatedly so that we can use --language in language - # definitions. Beware that there can be several --language - # invocations. - my @language; - do { - @language = (); - use Getopt::Long; - Getopt::Long::Configure ("pass_through", "permute"); - GetOptions ("l|language=s" => \@language); - - foreach (@language) - { - error "unknown language: $_" - unless exists $language{lc $_}; - unshift @ARGV, @{$language{lc $_}}; - } - } while @language; - - # --debug is useless: it is parsed below. - if (exists $ENV{'AUTOM4TE_DEBUG'}) - { - print STDERR "$me: concrete arguments:\n"; - foreach my $arg (@ARGV) - { - print STDERR "| $arg\n"; - } - } - - # Process the arguments for real this time. - my @trace; - my @prepend_include; - getopt - ( - # Operation modes: - "o|output=s" => \$output, - "W|warnings=s" => \@warning, - "m|mode=s" => \$mode, - "M|melt" => \$melt, - - # Library directories: - "B|prepend-include=s" => \@prepend_include, - "I|include=s" => \@include, - - # Tracing: - # Using a hash for traces is seducing. Unfortunately, upon `-t FOO', - # instead of mapping `FOO' to undef, Getopt maps it to `1', preventing - # us from distinguishing `-t FOO' from `-t FOO=1'. So let's do it - # by hand. - "t|trace=s" => \@trace, - "p|preselect=s" => \@preselect, - - # Freezing. - "F|freeze" => \$freeze, - - # Caching. - "C|cache=s" => \$cache, - "no-cache" => sub { $cache = undef; }, - ); - - error "too few arguments -Try `$me --help' for more information." - unless @ARGV; - - # Freezing: - # We cannot trace at the same time (well, we can, but it sounds insane). - # And it implies melting: there is risk not to update properly using - # old frozen files, and worse yet: we could load a frozen file and - # refreeze it! A sort of caching :) - error "cannot freeze and trace" - if $freeze && @trace; - $melt = 1 - if $freeze; - - # Names of the cache directory, cache directory index, trace cache - # prefix, and output cache prefix. If the cache is not to be - # preserved, default to a temporary directory (automatically removed - # on exit). - $cache = $tmp - unless $cache; - $icache = "$cache/requests"; - $tcache = "$cache/traces."; - $ocache = "$cache/output."; - - # Normalize the includes: the first occurrence is enough, several is - # a pain since it introduces a useless difference in the path which - # invalidates the cache. And strip `.' which is implicit and always - # first. - @include = grep { !/^\.$/ } uniq (reverse(@prepend_include), @include); - - # Convert @trace to %trace, and work around the M4 builtins tracing - # problem. - # The default format is `$f:$l:$n:$%'. - foreach (@trace) - { - /^([^:]+)(?::(.*))?$/ms; - $trace{$1} = defined $2 ? $2 : '$f:$l:$n:$%'; - $trace{$m4_builtin_alternate_name{$1}} = $trace{$1} - if exists $m4_builtin_alternate_name{$1}; - } - - # Work around the M4 builtins tracing problem for @PRESELECT. - push (@preselect, - map { $m4_builtin_alternate_name{$_} } - grep { exists $m4_builtin_alternate_name{$_} } @preselect); - - # If we find frozen files, then all the files before it are - # discarded: the frozen file is supposed to include them all. - # - # We don't want to depend upon m4's --include to find the top level - # files, so we use `find_file' here. Try to get a canonical name, - # as it's part of the key for caching. And some files are optional - # (also handled by `find_file'). - my @argv; - foreach (@ARGV) - { - if (/\.m4f$/) - { - # Frozen files are optional => pass a `?' to `find_file'. - my $file = find_file ("$_?", @include); - if (!$melt && $file) - { - @argv = ($file); - } - else - { - s/\.m4f$/.m4/; - push @argv, find_file ($_, @include); - } - } - else - { - my $file = find_file ($_, @include); - push @argv, $file - if $file; - } - } - @ARGV = @argv; -} - - -# handle_m4 ($REQ, @MACRO) -# ------------------------ -# Run m4 on the input files, and save the traces on the @MACRO. -sub handle_m4 ($@) -{ - my ($req, @macro) = @_; - - # The warnings are the concatenation of 1. application's defaults, - # 2. $WARNINGS, $3 command line options, in that order. - # Set them in the order expected by the M4 macros: the converse. - my $m4_warnings = - lc join (',', reverse (split (',', ($ENV{'WARNINGS'} || '')), - map { split /,/ } @warning)); - - # GNU m4 appends when using --error-output. - unlink ($tcache . $req->id . "t"); - - # Run m4. - # - # Neutralize its stdin, so that GNU M4 1.5 doesn't neutralize SIGINT. - # - # We don't output directly to the cache files, to avoid problems - # when we are interrupted (that leaves corrupted files). - xsystem ("$m4" - . join (' --include=', '', @include) - . " --define=m4_warnings=$m4_warnings" - . ' --debug=aflq' - . (!exists $ENV{'AUTOM4TE_NO_FATAL'} ? ' --fatal-warning' : '') - . " --error-output=$tcache" . $req->id . "t" - . join (' --trace=', '', sort @macro) - . " " . files_to_options (@ARGV) - . ' $ocache" . $req->id . "t"); - - # Everything went ok: preserve the outputs. - foreach my $file (map { $_ . $req->id } ($tcache, $ocache)) - { - use File::Copy; - move ("${file}t", "$file") - or error "cannot not rename ${file}t as $file: $!"; - } -} - - -# warn_forbidden ($WHERE, $WORD, %FORBIDDEN) -# ------------------------------------------ -# $WORD is forbidden. Warn with a dedicated error message if in -# %FORBIDDEN, otherwise, a simple `error: possibly undefined macro' -# will do. -my $first_warn_forbidden = 1; -sub warn_forbidden ($$%) -{ - my ($where, $word, %forbidden) = @_; - my $message; - - for my $re (sort keys %forbidden) - { - if ($word =~ $re) - { - $message = $forbidden{$re}; - last; - } - } - $message ||= "possibly undefined macro: $word"; - warn "$where: error: $message\n"; - if ($first_warn_forbidden) - { - warn < 'forbid:$1:$2', - 'm4_pattern_allow' => 'allow:$1')); - my @patterns = new Autom4te::XFile ("$tmp/patterns")->getlines; - chomp @patterns; - my %forbidden = - map { /^forbid:([^:]+):.+$/ => /^forbid:[^:]+:(.+)$/ } @patterns; - my $forbidden = join ('|', map { /^forbid:([^:]+)/ } @patterns) || "^\$"; - my $allowed = join ('|', map { /^allow:([^:]+)/ } @patterns) || "^\$"; - - verbose "forbidden tokens: $forbidden"; - verbose "forbidden token : $_ => $forbidden{$_}" - foreach (sort keys %forbidden); - verbose "allowed tokens: $allowed"; - - # Read the (cached) raw M4 output, produce the actual result. We - # have to use the 2nd arg to have Autom4te::XFile honor the third, but then - # stdout is to be handled by hand :(. Don't use fdopen as it means - # we will close STDOUT, which we already do in END. - my $out = new Autom4te::XFile; - if ($output eq '-') - { - $out->open (">$output"); - } - else - { - $out->open($output, O_CREAT | O_WRONLY | O_TRUNC, oct ($mode)); - } - error "cannot create $output: $!" - unless $out; - my $in = new Autom4te::XFile ($ocache . $req->id); - - my %prohibited; - my $res; - while ($_ = $in->getline) - { - s/\s+$//; - s/__oline__/$./g; - s/\@<:\@/[/g; - s/\@:>\@/]/g; - s/\@S\|\@/\$/g; - s/\@%:\@/#/g; - - $res = $_; - - # Don't complain in comments. Well, until we have something - # better, don't consider `#include' etc. are comments. - s/\#.*// - unless /^\#\s*(if|include|endif|ifdef|ifndef|define)\b/; - foreach (split (/\W+/)) - { - $prohibited{$_} = $. - if /$forbidden/o && !/$allowed/o && ! exists $prohibited{$_}; - } - - # Performed *last*: the empty quadrigraph. - $res =~ s/\@&t\@//g; - - print $out "$res\n"; - } - - # If no forbidden words, we're done. - return - if ! %prohibited; - - # Locate the forbidden words in the last input file. - # This is unsatisfying but... - my $prohibited = '\b(' . join ('|', keys %prohibited) . ')\b'; - my $file = new Autom4te::XFile ($ARGV[$#ARGV]); - $exit_status = 1; - - while ($_ = $file->getline) - { - # Don't complain in comments. Well, until we have something - # better, don't consider `#include' etc. are comments. - s/\#.*// - unless /^\#(if|include|endif|ifdef|ifndef|define)\b/; - - # Complain once per word, but possibly several times per line. - while (/$prohibited/) - { - my $word = $1; - warn_forbidden ("$ARGV[$#ARGV]:$.", $word, %forbidden); - delete $prohibited{$word}; - # If we're done, exit. - return - if ! %prohibited; - $prohibited = '\b(' . join ('|', keys %prohibited) . ')\b'; - } - } - warn_forbidden ("$output:$prohibited{$_}", $_, %forbidden) - foreach (sort { $prohibited{$a} <=> $prohibited{$b} } keys %prohibited); -} - - -## --------------------- ## -## Handling the traces. ## -## --------------------- ## - - -# $M4_MACRO -# trace_format_to_m4 ($FORMAT) -# ---------------------------- -# Convert a trace $FORMAT into a M4 trace processing macro's body. -sub trace_format_to_m4 ($) -{ - my ($format) = @_; - my $underscore = $_; - my %escape = (# File name. - 'f' => '$1', - # Line number. - 'l' => '$2', - # Depth. - 'd' => '$3', - # Name (also available as $0). - 'n' => '$4', - # Escaped dollar. - '$' => '$'); - - my $res = ''; - $_ = $format; - while ($_) - { - # $n -> $(n + 4) - if (s/^\$(\d+)//) - { - $res .= "\$" . ($1 + 4); - } - # $x, no separator given. - elsif (s/^\$([fldn\$])//) - { - $res .= $escape{$1}; - } - # $.x or ${sep}x. - elsif (s/^\$\{([^}]*)\}([@*%])// - || s/^\$(.?)([@*%])//) - { - # $@, list of quoted effective arguments. - if ($2 eq '@') - { - $res .= ']at_at([' . ($1 ? $1 : ',') . '], $@)['; - } - # $*, list of unquoted effective arguments. - elsif ($2 eq '*') - { - $res .= ']at_star([' . ($1 ? $1 : ',') . '], $@)['; - } - # $%, list of flattened unquoted effective arguments. - elsif ($2 eq '%') - { - $res .= ']at_percent([' . ($1 ? $1 : ':') . '], $@)['; - } - } - elsif (/^(\$.)/) - { - error "invalid escape: $1"; - } - else - { - s/^([^\$]+)//; - $res .= $1; - } - } - - $_ = $underscore; - return '[[' . $res . ']]'; -} - - -# handle_traces($REQ, $OUTPUT, %TRACE) -# ------------------------------------ -# We use M4 itself to process the traces. But to avoid name clashes when -# processing the traces, the builtins are disabled, and moved into `at_'. -# Actually, all the low level processing macros are in `at_' (and `_at_'). -# To avoid clashes between user macros and `at_' macros, the macros which -# implement tracing are in `AT_'. -# -# Having $REQ is needed to neutralize the macros which have been traced, -# but are not wanted now. -sub handle_traces ($$%) -{ - my ($req, $output, %trace) = @_; - - verbose "formatting traces for `$output': ", join (', ', sort keys %trace); - - # Processing the traces. - my $trace_m4 = new Autom4te::XFile (">$tmp/traces.m4"); - - $_ = <<'EOF'; - divert(-1) - changequote([, ]) - # _at_MODE(SEPARATOR, ELT1, ELT2...) - # ---------------------------------- - # List the elements, separating then with SEPARATOR. - # MODE can be: - # `at' -- the elements are enclosed in brackets. - # `star' -- the elements are listed as are. - # `percent' -- the elements are `flattened': spaces are singled out, - # and no new line remains. - define([_at_at], - [at_ifelse([$#], [1], [], - [$#], [2], [[[$2]]], - [[[$2]][$1]$0([$1], at_shift(at_shift($@)))])]) - - define([_at_percent], - [at_ifelse([$#], [1], [], - [$#], [2], [at_flatten([$2])], - [at_flatten([$2])[$1]$0([$1], at_shift(at_shift($@)))])]) - - define([_at_star], - [at_ifelse([$#], [1], [], - [$#], [2], [[$2]], - [[$2][$1]$0([$1], at_shift(at_shift($@)))])]) - - # FLATTEN quotes its result. - # Note that the second pattern is `newline, tab or space'. Don't lose - # the tab! - define([at_flatten], - [at_patsubst(at_patsubst(at_patsubst([[[$1]]], [\\\n]), - [[\n\t ]+], [ ]), - [^ *\(.*\) *$], [[\1]])]) - - define([at_args], [at_shift(at_shift(at_shift(at_shift(at_shift($@)))))]) - define([at_at], [_$0([$1], at_args($@))]) - define([at_percent], [_$0([$1], at_args($@))]) - define([at_star], [_$0([$1], at_args($@))]) - -EOF - s/^ //mg;s/\\t/\t/mg;s/\\n/\n/mg; - print $trace_m4 $_; - - # If you trace `define', then on `define([m4_exit], defn([m4exit])' you - # will produce - # - # AT_define([m4sugar.m4], [115], [1], [define], [m4_exit], ) - # - # Since `' is not quoted, the outer m4, when processing - # `trace.m4' will exit prematurely. Hence, move all the builtins to - # the `at_' name space. - - print $trace_m4 "# Copy the builtins.\n"; - map { print $trace_m4 "define([at_$_], defn([$_]))\n" } @m4_builtin; - print $trace_m4 "\n"; - - print $trace_m4 "# Disable them.\n"; - map { print $trace_m4 "at_undefine([$_])\n" } @m4_builtin; - print $trace_m4 "\n"; - - - # Neutralize traces: we don't want traces of cached requests (%REQUEST). - print $trace_m4 - "## -------------------------------------- ##\n", - "## By default neutralize all the traces. ##\n", - "## -------------------------------------- ##\n", - "\n"; - print $trace_m4 "at_define([AT_$_], [at_dnl])\n" - foreach (sort keys %{$req->macro}); - print $trace_m4 "\n"; - - # Implement traces for current requests (%TRACE). - print $trace_m4 - "## ------------------------- ##\n", - "## Trace processing macros. ##\n", - "## ------------------------- ##\n", - "\n"; - foreach (sort keys %trace) - { - # Trace request can be embed \n. - (my $comment = "Trace $_:$trace{$_}") =~ s/^/\# /; - print $trace_m4 "$comment\n"; - print $trace_m4 "at_define([AT_$_],\n"; - print $trace_m4 trace_format_to_m4 ($trace{$_}) . ")\n\n"; - } - print $trace_m4 "\n"; - - # Reenable output. - print $trace_m4 "at_divert(0)at_dnl\n"; - - # Transform the traces from m4 into an m4 input file. - # Typically, transform: - # - # | m4trace:configure.ac:3: -1- AC_SUBST([exec_prefix], [NONE]) - # - # into - # - # | AT_AC_SUBST([configure.ac], [3], [1], [AC_SUBST], [exec_prefix], [NONE]) - # - # Pay attention that the file name might include colons, if under DOS - # for instance, so we don't use `[^:]+'. - my $traces = new Autom4te::XFile ($tcache . $req->id); - while ($_ = $traces->getline) - { - # Trace with arguments, as the example above. We don't try - # to match the trailing parenthesis as it might be on a - # separate line. - s{^m4trace:(.+):(\d+): -(\d+)- ([^(]+)\((.*)$} - {AT_$4([$1], [$2], [$3], [$4], $5}; - # Traces without arguments, always on a single line. - s{^m4trace:(.+):(\d+): -(\d+)- ([^)]*)\n$} - {AT_$4([$1], [$2], [$3], [$4])\n}; - print $trace_m4 "$_"; - } - $trace_m4->close; - - my $in = new Autom4te::XFile ("$m4 $tmp/traces.m4 |"); - my $out = new Autom4te::XFile (">$output"); - - # This is dubious: should we really transform the quadrigraphs in - # traces? It might break balanced [ ] etc. in the output. The - # consensus seeems to be that traces are more useful this way. - while ($_ = $in->getline) - { - # It makes no sense to try to transform __oline__. - s/\@<:\@/[/g; - s/\@:>\@/]/g; - s/\@\$\|\@/\$/g; - s/\@%:\@/#/g; - s/\@&t\@//g; - print $out $_; - } -} - - -# $BOOL -# up_to_date ($REQ) -# ----------------- -# Are the cache files of $REQ up to date? -# $REQ is `valid' if it corresponds to the request and exists, which -# does not mean it is up to date. It is up to date if, in addition, -# its files are younger than its dependencies. -sub up_to_date ($) -{ - my ($req) = @_; - - return 0 - if ! $req->valid; - - my $tfile = $tcache . $req->id; - my $ofile = $ocache . $req->id; - - # We can't answer properly if the traces are not computed since we - # need to know what other files were included. Actually, if any of - # the cache files is missing, we are not up to date. - return 0 - if ! -f $tfile || ! -f $ofile; - - # The youngest of the cache files must be older than the oldest of - # the dependencies. - my $tmtime = mtime ($tfile); - my $omtime = mtime ($ofile); - my ($file, $mtime) = ($tmtime < $omtime - ? ($ofile, $omtime) : ($tfile, $tmtime)); - - # We depend at least upon the arguments. - my @dep = @ARGV; - - # Files may include others. We can use traces since we just checked - # if they are available. - handle_traces ($req, "$tmp/dependencies", - ('include' => '$1', - 'm4_include' => '$1')); - my $deps = new Autom4te::XFile ("$tmp/dependencies"); - while ($_ = $deps->getline) - { - chomp; - my $file = find_file ("$_?", @include); - # If a file which used to be included is no longer there, then - # don't say it's missing (it might no longer be included). But - # of course, that cause the output to be outdated (as if the - # time stamp of that missing file was newer). - return 0 - if ! $file; - push @dep, $file; - } - - # If $FILE is younger than one of its dependencies, it is outdated. - return up_to_date_p ($file, @dep); -} - - -## ---------- ## -## Freezing. ## -## ---------- ## - -# freeze ($OUTPUT) -# ---------------- -sub freeze ($) -{ - my ($output) = @_; - - # When processing the file with diversion disabled, there must be no - # output but comments and empty lines. - my $result = xqx ("$m4" - . ' --fatal-warning' - . join (' --include=', '', @include) - . ' --define=divert' - . " " . files_to_options (@ARGV) - . ' load ($icache) - if -f $icache && mtime ($icache) > mtime ($0); - -# Add the new trace requests. -my $req = Request->request ('input' => \@ARGV, - 'path' => \@include, - 'macro' => [keys %trace, @preselect]); - -# If $REQ's cache files are not up to date, or simply if the user -# discarded them (-f), declare it invalid. -$req->valid (0) - if $force || ! up_to_date ($req); - -# We now know whether we can trust the Request object. Say it. -verbose "$me: the trace request object is:\n" . $req->marshall; - -# We need to run M4 if (i) the users wants it (--force), (ii) $REQ is -# invalid. -handle_m4 ($req, keys %{$req->macro}) - if $force || ! $req->valid; - -# Now output... -if (%trace) - { - # Always produce traces, since even if the output is young enough, - # there is no guarantee that the traces use the same *format* - # (e.g., `-t FOO:foo' and `-t FOO:bar' are both using the same M4 - # traces, hence the M4 traces cache is usable, but its formatting - # will yield different results). - handle_traces ($req, $output, %trace); - } -else - { - # Actual M4 expansion, only if $output is too old. STDOUT is - # pretty old. - handle_output ($req, $output) - if mtime ($output) < mtime ($ocache . $req->id); - } - -# If all went fine, the cache is valid. -$req->valid (1) - if $exit_status == 0; - -Request->save ($icache); - -exit $exit_status; - -### Setup "GNU" style for perl-mode and cperl-mode. -## Local Variables: -## perl-indent-level: 2 -## perl-continued-statement-offset: 2 -## perl-continued-brace-offset: 0 -## perl-brace-offset: 0 -## perl-brace-imaginary-offset: 0 -## perl-label-offset: -2 -## cperl-indent-level: 2 -## cperl-brace-offset: 0 -## cperl-continued-brace-offset: 0 -## cperl-label-offset: -2 -## cperl-extra-newline-before-brace: t -## cperl-merge-trailing-else: nil -## cperl-continued-statement-offset: 2 -## End: diff --git a/bin/automake b/bin/automake deleted file mode 100644 index 22d974db..00000000 --- a/bin/automake +++ /dev/null @@ -1,9229 +0,0 @@ -#!/bin/perl -w -# -*- perl -*- -# Makefile. Generated from Makefile.in by configure. - -eval 'case $# in 0) exec /bin/perl -S "$0";; *) exec /bin/perl -S "$0" "$@";; esac' - if 0; - -# automake - create Makefile.in from Makefile.am -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 -# Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# Originally written by David Mackenzie . -# Perl reimplementation by Tom Tromey . - -package Language; - -BEGIN -{ - my $perllibdir = $ENV{'perllibdir'} || '/usr/share/automake-1.7'; - unshift @INC, $perllibdir; -} - -use Automake::Struct; -struct (# Short name of the language (c, f77...). - 'name' => "\$", - # Nice name of the language (C, Fortran 77...). - 'Name' => "\$", - - # List of configure variables which must be defined. - 'config_vars' => '@', - - 'ansi' => "\$", - # `pure' is `1' or `'. A `pure' language is one where, if - # all the files in a directory are of that language, then we - # do not require the C compiler or any code to call it. - 'pure' => "\$", - - 'autodep' => "\$", - - # Name of the compiling variable (COMPILE). - 'compiler' => "\$", - # Content of the compiling variable. - 'compile' => "\$", - # Flag to require compilation without linking (-c). - 'compile_flag' => "\$", - 'extensions' => '@', - # A subroutine to compute a list of possible extensions of - # the product given the input extensions. - # (defaults to a subroutine which returns ('.$(OBJEXT)', '.lo')) - 'output_extensions' => "\$", - # A list of flag variables used in 'compile'. - # (defaults to []) - 'flags' => "@", - - # The file to use when generating rules for this language. - # The default is 'depend2'. - 'rule_file' => "\$", - - # Name of the linking variable (LINK). - 'linker' => "\$", - # Content of the linking variable. - 'link' => "\$", - - # Name of the linker variable (LD). - 'lder' => "\$", - # Content of the linker variable ($(CC)). - 'ld' => "\$", - - # Flag to specify the output file (-o). - 'output_flag' => "\$", - '_finish' => "\$", - - # This is a subroutine which is called whenever we finally - # determine the context in which a source file will be - # compiled. - '_target_hook' => "\$"); - - -sub finish ($) -{ - my ($self) = @_; - if (defined $self->_finish) - { - &{$self->_finish} (); - } -} - -sub target_hook ($$$$) -{ - my ($self) = @_; - if (defined $self->_target_hook) - { - &{$self->_target_hook} (@_); - } -} - -package Automake; - -use strict 'vars', 'subs'; -use Automake::General; -use Automake::XFile; -use Automake::Channels; -use File::Basename; -use Carp; - -## ----------- ## -## Constants. ## -## ----------- ## - -# Parameters set by configure. Not to be changed. NOTE: assign -# VERSION as string so that eg version 0.30 will print correctly. -my $VERSION = '1.7.1'; -my $PACKAGE = 'automake'; -my $libdir = '/usr/share/automake-1.7'; - -# Some regular expressions. One reason to put them here is that it -# makes indentation work better in Emacs. - -# Writting singled-quoted-$-terminated regexes is a pain because -# perl-mode thinks of $' as the ${'} variable (intead of a $ followed -# by a closing quote. Letting perl-mode think the quote is not closed -# leads to all sort of misindentations. On the other hand, defining -# regexes as double-quoted strings is far less readable. So usually -# we will write: -# -# $REGEX = '^regex_value' . "\$"; - -my $IGNORE_PATTERN = '^\s*##([^#\n].*)?\n'; -my $WHITE_PATTERN = '^\s*' . "\$"; -my $COMMENT_PATTERN = '^#'; -my $TARGET_PATTERN='[$a-zA-Z_.@%][-.a-zA-Z0-9_(){}/$+@%]*'; -# A rule has three parts: a list of targets, a list of dependencies, -# and optionally actions. -my $RULE_PATTERN = - "^($TARGET_PATTERN(?:(?:\\\\\n|\\s)+$TARGET_PATTERN)*) *:([^=].*|)\$"; - -my $SUFFIX_RULE_PATTERN = - '^(\.[a-zA-Z0-9_(){}$+@]+)(\.[a-zA-Z0-9_(){}$+@]+)' . "\$"; -# Only recognize leading spaces, not leading tabs. If we recognize -# leading tabs here then we need to make the reader smarter, because -# otherwise it will think rules like `foo=bar; \' are errors. -my $MACRO_PATTERN = '^[.A-Za-z0-9_@]+' . "\$"; -my $ASSIGNMENT_PATTERN = '^ *([^ \t=:+]*)\s*([:+]?)=\s*(.*)' . "\$"; -# This pattern recognizes a Gnits version id and sets $1 if the -# release is an alpha release. We also allow a suffix which can be -# used to extend the version number with a "fork" identifier. -my $GNITS_VERSION_PATTERN = '\d+\.\d+([a-z]|\.\d+)?(-[A-Za-z0-9]+)?'; - -my $IF_PATTERN = '^if\s+(!?)\s*([A-Za-z][A-Za-z0-9_]*)\s*(?:#.*)?' . "\$"; -my $ELSE_PATTERN = - '^else(?:\s+(!?)\s*([A-Za-z][A-Za-z0-9_]*))?\s*(?:#.*)?' . "\$"; -my $ENDIF_PATTERN = - '^endif(?:\s+(!?)\s*([A-Za-z][A-Za-z0-9_]*))?\s*(?:#.*)?' . "\$"; -my $PATH_PATTERN = '(\w|[/.-])+'; -# This will pass through anything not of the prescribed form. -my $INCLUDE_PATTERN = ('^include\s+' - . '((\$\(top_srcdir\)/' . $PATH_PATTERN . ')' - . '|(\$\(srcdir\)/' . $PATH_PATTERN . ')' - . '|([^/\$]' . $PATH_PATTERN . '))\s*(#.*)?' . "\$"); - -# This handles substitution references like ${foo:.a=.b}. -my $SUBST_REF_PATTERN = "^([^:]*):([^=]*)=(.*)\$"; - -# Match `-d' as a command-line argument in a string. -my $DASH_D_PATTERN = "(^|\\s)-d(\\s|\$)"; -# Directories installed during 'install-exec' phase. -my $EXEC_DIR_PATTERN = - '^(?:bin|sbin|libexec|sysconf|localstate|lib|pkglib|.*exec.*)' . "\$"; - -# Constants to define the "strictness" level. -use constant FOREIGN => 0; -use constant GNU => 1; -use constant GNITS => 2; - -# Values for AC_CANONICAL_* -use constant AC_CANONICAL_HOST => 1; -use constant AC_CANONICAL_SYSTEM => 2; - -# Values indicating when something should be cleaned. -use constant MOSTLY_CLEAN => 0; -use constant CLEAN => 1; -use constant DIST_CLEAN => 2; -use constant MAINTAINER_CLEAN => 3; - -# Libtool files. -my @libtool_files = qw(ltmain.sh config.guess config.sub); -# ltconfig appears here for compatibility with old versions of libtool. -my @libtool_sometimes = qw(ltconfig ltcf-c.sh ltcf-cxx.sh ltcf-gcj.sh); - -# Commonly found files we look for and automatically include in -# DISTFILES. -my @common_files = - (qw(ABOUT-GNU ABOUT-NLS AUTHORS BACKLOG COPYING COPYING.DOC COPYING.LIB - COPYING.LESSER ChangeLog INSTALL NEWS README THANKS TODO acinclude.m4 - ansi2knr.1 ansi2knr.c compile config.guess config.rpath config.sub - configure configure.ac configure.in depcomp elisp-comp - install-sh libversion.in mdate-sh missing mkinstalldirs - py-compile texinfo.tex ylwrap), - @libtool_files, @libtool_sometimes); - -# Commonly used files we auto-include, but only sometimes. -my @common_sometimes = - qw(aclocal.m4 acconfig.h config.h.top config.h.bot stamp-vti); - -# Standard directories from the GNU Coding Standards, and additional -# pkg* directories from Automake. Stored in a hash for fast member check. -my %standard_prefix = - map { $_ => 1 } (qw(bin data exec include info lib libexec lisp - localstate man man1 man2 man3 man4 man5 man6 - man7 man8 man9 oldinclude pkgdatadir - pkgincludedir pkglibdir sbin sharedstate - sysconf)); - -# Declare the macros that define known variables, so we can -# hint the user if she try to use one of these variables. - -# Macros accessible via aclocal. -my %am_macro_for_var = - ( - ANSI2KNR => 'AM_C_PROTOTYPES', - CCAS => 'AM_PROG_AS', - CCASFLAGS => 'AM_PROG_AS', - EMACS => 'AM_PATH_LISPDIR', - GCJ => 'AM_PROG_GCJ', - LEX => 'AM_PROG_LEX', - LIBTOOL => 'AC_PROG_LIBTOOL', - lispdir => 'AM_PATH_LISPDIR', - pkgpyexecdir => 'AM_PATH_PYTHON', - pkgpythondir => 'AM_PATH_PYTHON', - pyexecdir => 'AM_PATH_PYTHON', - PYTHON => 'AM_PATH_PYTHON', - pythondir => 'AM_PATH_PYTHON', - U => 'AM_C_PROTOTYPES', - ); - -# Macros shipped with Autoconf. -my %ac_macro_for_var = - ( - CC => 'AC_PROG_CC', - CFLAGS => 'AC_PROG_CC', - CXX => 'AC_PROG_CXX', - CXXFLAGS => 'AC_PROG_CXX', - F77 => 'AC_PROG_F77', - F77FLAGS => 'AC_PROG_F77', - RANLIB => 'AC_PROG_RANLIB', - YACC => 'AC_PROG_YACC', - ); - -# Copyright on generated Makefile.ins. -my $gen_copyright = "\ -# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 -# Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. -"; - -# These constants are returned by lang_*_rewrite functions. -# LANG_SUBDIR means that the resulting object file should be in a -# subdir if the source file is. In this case the file name cannot -# have `..' components. -use constant LANG_IGNORE => 0; -use constant LANG_PROCESS => 1; -use constant LANG_SUBDIR => 2; - -# These are used when keeping track of whether an object can be built -# by two different paths. -use constant COMPILE_LIBTOOL => 1; -use constant COMPILE_ORDINARY => 2; - - - -## ---------------------------------- ## -## Variables related to the options. ## -## ---------------------------------- ## - -# TRUE if we should always generate Makefile.in. -my $force_generation = 1; - -# Strictness level as set on command line. -my $default_strictness = GNU; - -# Name of strictness level, as set on command line. -my $default_strictness_name = 'gnu'; - -# This is TRUE if automatic dependency generation code should be -# included in generated Makefile.in. -my $cmdline_use_dependencies = 1; - -# From the Perl manual. -my $symlink_exists = (eval 'symlink ("", "");', $@ eq ''); - -# TRUE if missing standard files should be installed. -my $add_missing = 0; - -# TRUE if we should copy missing files; otherwise symlink if possible. -my $copy_missing = 0; - -# TRUE if we should always update files that we know about. -my $force_missing = 0; - - -## ---------------------------------------- ## -## Variables filled during files scanning. ## -## ---------------------------------------- ## - -# Name of the top autoconf input: `configure.ac' or `configure.in'. -my $configure_ac = ''; - -# Files found by scanning configure.ac for LIBOBJS. -my %libsources = (); - -# Names used in AC_CONFIG_HEADER call. -my @config_headers = (); -# Where AC_CONFIG_HEADER appears. -my $config_header_location; - -# Directory where output files go. Actually, output files are -# relative to this directory. -my $output_directory; - -# List of Makefile.am's to process, and their corresponding outputs. -my @input_files = (); -my %output_files = (); - -# Complete list of Makefile.am's that exist. -my @configure_input_files = (); - -# List of files in AC_CONFIG_FILES/AC_OUTPUT without Makefile.am's, -# and their outputs. -my @other_input_files = (); -# Where the last AC_CONFIG_FILES/AC_OUTPUT appears. -my $ac_config_files_location; - -# List of directories to search for configure-required files. This -# can be set by AC_CONFIG_AUX_DIR. -my @config_aux_path = qw(. .. ../..); -my $config_aux_dir = ''; -my $config_aux_dir_set_in_configure_in = 0; - -# Whether AM_GNU_GETTEXT has been seen in configure.ac. -my $seen_gettext = 0; -# Whether AM_GNU_GETTEXT([external]) is used. -my $seen_gettext_external = 0; -# Where AM_GNU_GETTEXT appears. -my $ac_gettext_location; - -# TRUE if we've seen AC_CANONICAL_(HOST|SYSTEM). -my $seen_canonical = 0; -my $canonical_location; - -# Where AM_MAINTAINER_MODE appears. -my $seen_maint_mode; - -# Actual version we've seen. -my $package_version = ''; - -# Where version is defined. -my $package_version_location; - -# TRUE if we've seen AC_ENABLE_MULTILIB. -my $seen_multilib = 0; - -# TRUE if we've seen AM_PROG_CC_C_O -my $seen_cc_c_o = 0; - -# Where AM_INIT_AUTOMAKE is called; -my $seen_init_automake = 0; - -# TRUE if we've seen AM_AUTOMAKE_VERSION. -my $seen_automake_version = 0; - -# Hash table of discovered configure substitutions. Keys are names, -# values are `FILE:LINE' strings which are used by error message -# generation. -my %configure_vars = (); - -# This is used to keep track of which variable definitions we are -# scanning. It is only used in certain limited ways, but it has to be -# global. It is declared just for documentation purposes. -my %vars_scanned = (); - -# TRUE if --cygnus seen. -my $cygnus_mode = 0; - -# Hash table of AM_CONDITIONAL variables seen in configure. -my %configure_cond = (); - -# This maps extensions onto language names. -my %extension_map = (); - -# List of the DIST_COMMON files we discovered while reading -# configure.in -my $configure_dist_common = ''; - -# This maps languages names onto objects. -my %languages = (); - -# List of targets we must always output. -# FIXME: Complete, and remove falsely required targets. -my %required_targets = - ( - 'all' => 1, - 'dvi' => 1, - 'pdf' => 1, - 'ps' => 1, - 'info' => 1, - 'install-info' => 1, - 'install' => 1, - 'install-data' => 1, - 'install-exec' => 1, - 'uninstall' => 1, - - # FIXME: Not required, temporary hacks. - # Well, actually they are sort of required: the -recursive - # targets will run them anyway... - 'dvi-am' => 1, - 'pdf-am' => 1, - 'ps-am' => 1, - 'info-am' => 1, - 'install-data-am' => 1, - 'install-exec-am' => 1, - 'installcheck-am' => 1, - 'uninstall-am' => 1, - - 'install-man' => 1, - ); - -# This is set to 1 when Automake needs to be run again. -# (For instance, this happens when an auxiliary file such as -# depcomp is added after the toplevel Makefile.in -- which -# should distribute depcomp -- has been generated.) -my $automake_needs_to_reprocess_all_files = 0; - -# Options set via AM_INIT_AUTOMAKE. -my $global_options = ''; - -# Same as $suffix_rules (declared below), but records only the -# default rules supplied by the languages Automake supports. -my $suffix_rules_default; - -# If a file name appears as a key in this hash, then it has already -# been checked for. This variable is local to the "require file" -# functions. -my %require_file_found = (); - - -################################################################ - -## ------------------------------------------ ## -## Variables reset by &initialize_per_input. ## -## ------------------------------------------ ## - -# Basename and relative dir of the input file. -my $am_file_name; -my $am_relative_dir; - -# Same but wrt Makefile.in. -my $in_file_name; -my $relative_dir; - -# These two variables are used when generating each Makefile.in. -# They hold the Makefile.in until it is ready to be printed. -my $output_rules; -my $output_vars; -my $output_trailer; -my $output_all; -my $output_header; - -# Suffixes found during a run. -my @suffixes; - -# Handling the variables. -# -# For a $VAR: -# - $var_value{$VAR}{$COND} is its value associated to $COND, -# - $var_location{$VAR}{$COND} is where it was defined, -# - $var_comment{$VAR}{$COND} are the comments associated to it. -# - $var_type{$VAR}{$COND} is how it has been defined (`', `+', or `:'), -# - $var_owner{$VAR}{$COND} tells who owns the variable (VAR_AUTOMAKE, -# VAR_CONFIGURE, or VAR_MAKEFILE). -my %var_value; -my %var_location; -my %var_comment; -my %var_type; -my %var_owner; -# Possible values for var_owner. Defined so that the owner of -# a variable can only be increased (e.g Automake should not -# override a configure or Makefile variable). -use constant VAR_AUTOMAKE => 0; # Variable defined by Automake. -use constant VAR_CONFIGURE => 1;# Variable defined in configure.ac. -use constant VAR_MAKEFILE => 2; # Variable defined in Makefile.am. - -# This holds a 1 if a particular variable was examined. -my %content_seen; - -# This holds the names which are targets. These also appear in -# %contents. $targets{TARGET}{COND} is the location of the definition -# of TARGET for condition COND. TARGETs should not include -# a trailing $(EXEEXT), we record this in %target_name. -my %targets; - -# $target_source{TARGET}{COND} is the filename where TARGET -# were defined for condition COND. Note this must be a -# filename, *without* any line number. -my %target_source; - -# $target_name{TARGET}{COND} is the real name of TARGET (in condition COND). -# The real name is often TARGET or TARGET$(EXEEXT), and TARGET never -# contain $(EXEEXT) -my %target_name; - -# $target_owner{TARGET}{COND} the owner of TARGET in condition COND. -my %target_owner; -use constant TARGET_AUTOMAKE => 0; # Target defined by Automake. -use constant TARGET_USER => 1; # Target defined in the user's Makefile.am. - -# This is the conditional stack. -my @cond_stack; - -# This holds the set of included files. -my @include_stack; - -# This holds a list of directories which we must create at `dist' -# time. This is used in some strange scenarios involving weird -# AC_OUTPUT commands. -my %dist_dirs; - -# List of dependencies for the obvious targets. -my @all; -my @check; -my @check_tests; - -# Holds the dependencies of targets which dependencies are factored. -# Typically, `.PHONY' will appear in plenty of *.am files, but must -# be output once. Arguably all pure dependencies could be subject -# to this factorization, but it is not unpleasant to have paragraphs -# in Makefile: keeping related stuff altogether. -my %dependencies; - -# Holds the factored actions. Tied to %DEPENDENCIES, i.e., filled -# only when keys exists in %DEPENDENCIES. -my %actions; - -# Keys in this hash table are files to delete. The associated -# value tells when this should happen (MOSTLY_CLEAN, DIST_CLEAN, etc.) -my %clean_files; - -# Keys in this hash table are object files or other files in -# subdirectories which need to be removed. This only holds files -# which are created by compilations. The value in the hash indicates -# when the file should be removed. -my %compile_clean_files; - -# Keys in this hash table are directories where we expect to build a -# libtool object. We use this information to decide what directories -# to delete. -my %libtool_clean_directories; - -# Value of `$(SOURCES)', used by tags.am. -my @sources; -# Sources which go in the distribution. -my @dist_sources; - -# This hash maps object file names onto their corresponding source -# file names. This is used to ensure that each object is created -# by a single source file. -my %object_map; - -# This hash maps object file names onto an integer value representing -# whether this object has been built via ordinary compilation or -# libtool compilation (the COMPILE_* constants). -my %object_compilation_map; - - -# This keeps track of the directories for which we've already -# created `.dirstamp' code. -my %directory_map; - -# All .P files. -my %dep_files; - -# Strictness levels. -my $strictness; -my $strictness_name; - -# Options from AUTOMAKE_OPTIONS. -my %options; - -# Whether or not dependencies are handled. Can be further changed -# in handle_options. -my $use_dependencies; - -# This is a list of all targets to run during "make dist". -my @dist_targets; - -# Keys in this hash are the basenames of files which must depend on -# ansi2knr. Values are either the empty string, or the directory in -# which the ANSI source file appears; the directory must have a -# trailing `/'. -my %de_ansi_files; - -# This maps the source extension for all suffix rule seen to -# a \hash whose keys are the possible output extensions. -# -# Note that this is transitively closed by construction: -# if we have -# exists $suffix_rules{$ext1}{$ext2} -# && exists $suffix_rules{$ext2}{$ext3} -# then we also have -# exists $suffix_rules{$ext1}{$ext3} -# -# So it's easy to check whether '.foo' can be transformed to '.$(OBJEXT)' -# by checking whether $suffix_rules{'.foo'}{'.$(OBJEXT)'} exist. This -# will work even if transforming '.foo' to '.$(OBJEXT)' involves a chain -# of several suffix rules. -# -# The value of `$suffix_rules{$ext1}{$ext2}' is the a pair -# `[ $next_sfx, $dist ]' where `$next_sfx' is target suffix -# for the next rule to use to reach '$ext2', and `$dist' the -# distance to `$ext2'. -my $suffix_rules; - -# This is the name of the redirect `all' target to use. -my $all_target; - -# This keeps track of which extensions we've seen (that we care -# about). -my %extension_seen; - -# This is random scratch space for the language finish functions. -# Don't randomly overwrite it; examine other uses of keys first. -my %language_scratch; - -# We keep track of which objects need special (per-executable) -# handling on a per-language basis. -my %lang_specific_files; - -# This is set when `handle_dist' has finished. Once this happens, -# we should no longer push on dist_common. -my $handle_dist_run; - -# Used to store a set of linkers needed to generate the sources currently -# under consideration. -my %linkers_used; - -# True if we need `LINK' defined. This is a hack. -my $need_link; - -# This is the list of such variables to output. -# FIXME: Might be useless actually. -my @var_list; - -# Was get_object_extension run? -# FIXME: This is a hack. a better switch should be found. -my $get_object_extension_was_run; - -# Contains a stack of `from' parts of variable substitutions currently in -# force. -my @substfroms; - -# Contains a stack of `to' parts of variable substitutions currently in -# force. -my @substtos; - -# This keeps track of all variables defined by subobjname. -# The value stored is the variable names. -# The key has the form "(COND1)VAL1(COND2)VAL2..." where VAL1 and VAL2 -# are the values of the variable for condition COND1 and COND2. -my %subobjvar = (); - -# This hash records helper variables used to implement '+=' in conditionals. -# Keys have the form "VAR:CONDITIONS". The value associated to a key is -# the named of the helper variable used to append to VAR in CONDITIONS. -my %appendvar = (); - - -## --------------------------------- ## -## Forward subroutine declarations. ## -## --------------------------------- ## -sub register_language (%); -sub file_contents_internal ($$%); -sub define_objects_from_sources ($$$$$$$); - - -# &initialize_per_input () -# ------------------------ -# (Re)-Initialize per-Makefile.am variables. -sub initialize_per_input () -{ - reset_local_duplicates (); - - $am_file_name = ''; - $am_relative_dir = ''; - - $in_file_name = ''; - $relative_dir = ''; - - $output_rules = ''; - $output_vars = ''; - $output_trailer = ''; - $output_all = ''; - $output_header = ''; - - @suffixes = (); - - %var_value = (); - %var_location = (); - %var_comment = (); - %var_type = (); - %var_owner = (); - - %content_seen = (); - - %targets = (); - %target_source = (); - %target_name = (); - %target_owner = (); - - @cond_stack = (); - - @include_stack = (); - - %dist_dirs = (); - - @all = (); - @check = (); - @check_tests = (); - - %dependencies = - ( - # Texinfoing. - 'dvi' => [], - 'dvi-am' => [], - 'pdf' => [], - 'pdf-am' => [], - 'ps' => [], - 'ps-am' => [], - 'info' => [], - 'info-am' => [], - - # Installing/uninstalling. - 'install-data-am' => [], - 'install-exec-am' => [], - 'uninstall-am' => [], - - 'install-man' => [], - 'uninstall-man' => [], - - 'install-info' => [], - 'install-info-am' => [], - 'uninstall-info' => [], - - 'installcheck-am' => [], - - # Cleaning. - 'clean-am' => [], - 'mostlyclean-am' => [], - 'maintainer-clean-am' => [], - 'distclean-am' => [], - 'clean' => [], - 'mostlyclean' => [], - 'maintainer-clean' => [], - 'distclean' => [], - - # Tarballing. - 'dist-all' => [], - - # Phoning. - '.PHONY' => [] - ); - %actions = (); - - %clean_files = (); - - @sources = (); - @dist_sources = (); - - %object_map = (); - %object_compilation_map = (); - - %directory_map = (); - - %dep_files = (); - - $strictness = $default_strictness; - $strictness_name = $default_strictness_name; - - %options = (); - - $use_dependencies = $cmdline_use_dependencies; - - @dist_targets = (); - - %de_ansi_files = (); - - - # The first time we initialize the variables, - # we save the value of $suffix_rules. - if (defined $suffix_rules_default) - { - $suffix_rules = $suffix_rules_default; - } - else - { - $suffix_rules_default = $suffix_rules; - } - - $all_target = ''; - - %extension_seen = (); - - %language_scratch = (); - - %lang_specific_files = (); - - $handle_dist_run = 0; - - $need_link = 0; - - @var_list = (); - - $get_object_extension_was_run = 0; - - %compile_clean_files = (); - - # We always include `.'. This isn't strictly correct. - %libtool_clean_directories = ('.' => 1); - - %subobjvar = (); - - %appendvar = (); -} - - -################################################################ - -# Initialize our list of error/warning channels. -# Do not forget to update &usage and the manual -# if you add or change a warning channel. - -# Fatal errors. -register_channel 'fatal', type => 'fatal'; -# Common errors. -register_channel 'error', type => 'error'; -# Errors related to GNU Standards. -register_channel 'error-gnu', type => 'error'; -# Errors related to GNU Standards that should be warnings in `foreign' mode. -register_channel 'error-gnu/warn', type => 'error'; -# Errors related to GNITS Standards (silent by default). -register_channel 'error-gnits', type => 'error', silent => 1; -# Internal errors. -register_channel 'automake', type => 'fatal', backtrace => 1, - header => ("####################\n" . - "## Internal Error ##\n" . - "####################\n"), - footer => "\nPlease contact ."; - -# Warnings related to GNU Coding Standards. -register_channel 'gnu', type => 'warning'; -# Warnings about obsolete features (silent by default). -register_channel 'obsolete', type => 'warning', silent => 1; -# Warnings about non-portable constructs. -register_channel 'portability', type => 'warning', silent => 1; -# Weird syntax, unused variables, typos... -register_channel 'syntax', type => 'warning'; -# Warnings about unsupported (or mis-supported) features. -register_channel 'unsupported', type => 'warning'; - -# For &verb. -register_channel 'verb', type => 'debug', silent => 1; -# Informative messages. -register_channel 'note', type => 'debug', silent => 0; - - -# Initialize our list of languages that are internally supported. - -# C. -register_language ('name' => 'c', - 'Name' => 'C', - 'config_vars' => ['CC'], - 'ansi' => 1, - 'autodep' => '', - 'flags' => ['CFLAGS', 'CPPFLAGS'], - 'compiler' => 'COMPILE', - 'compile' => '$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)', - 'lder' => 'CCLD', - 'ld' => '$(CC)', - 'linker' => 'LINK', - 'link' => '$(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', - 'compile_flag' => '-c', - 'extensions' => ['.c'], - '_finish' => \&lang_c_finish); - -# C++. -register_language ('name' => 'cxx', - 'Name' => 'C++', - 'config_vars' => ['CXX'], - 'linker' => 'CXXLINK', - 'link' => '$(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', - 'autodep' => 'CXX', - 'flags' => ['CXXFLAGS', 'CPPFLAGS'], - 'compile' => '$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)', - 'compiler' => 'CXXCOMPILE', - 'compile_flag' => '-c', - 'output_flag' => '-o', - 'lder' => 'CXXLD', - 'ld' => '$(CXX)', - 'pure' => 1, - 'extensions' => ['.c++', '.cc', '.cpp', '.cxx', '.C']); - -# Objective C. -register_language ('name' => 'objc', - 'Name' => 'Objective C', - 'config_vars' => ['OBJC'], - 'linker' => 'OBJCLINK',, - 'link' => '$(OBJCLD) $(AM_OBJCFLAGS) $(OBJCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', - 'autodep' => 'OBJC', - 'flags' => ['OBJCFLAGS', 'CPPFLAGS'], - 'compile' => '$(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_OBJCFLAGS) $(OBJCFLAGS)', - 'compiler' => 'OBJCCOMPILE', - 'compile_flag' => '-c', - 'output_flag' => '-o', - 'lder' => 'OBJCLD', - 'ld' => '$(OBJC)', - 'pure' => 1, - 'extensions' => ['.m']); - -# Headers. -register_language ('name' => 'header', - 'Name' => 'Header', - 'extensions' => ['.h', '.H', '.hxx', '.h++', '.hh', - '.hpp', '.inc'], - # No output. - 'output_extensions' => sub { return () }, - # Nothing to do. - '_finish' => sub { }); - -# Yacc (C & C++). -register_language ('name' => 'yacc', - 'Name' => 'Yacc', - 'config_vars' => ['YACC'], - 'flags' => ['YFLAGS'], - 'compile' => '$(YACC) $(YFLAGS) $(AM_YFLAGS)', - 'compiler' => 'YACCCOMPILE', - 'extensions' => ['.y'], - 'output_extensions' => sub { (my $ext = $_[0]) =~ tr/y/c/; - return ($ext,) }, - 'rule_file' => 'yacc', - '_finish' => \&lang_yacc_finish, - '_target_hook' => \&lang_yacc_target_hook); -register_language ('name' => 'yaccxx', - 'Name' => 'Yacc (C++)', - 'config_vars' => ['YACC'], - 'rule_file' => 'yacc', - 'flags' => ['YFLAGS'], - 'compiler' => 'YACCCOMPILE', - 'compile' => '$(YACC) $(YFLAGS) $(AM_YFLAGS)', - 'extensions' => ['.y++', '.yy', '.yxx', '.ypp'], - 'output_extensions' => sub { (my $ext = $_[0]) =~ tr/y/c/; - return ($ext,) }, - '_finish' => \&lang_yacc_finish, - '_target_hook' => \&lang_yacc_target_hook); - -# Lex (C & C++). -register_language ('name' => 'lex', - 'Name' => 'Lex', - 'config_vars' => ['LEX'], - 'rule_file' => 'lex', - 'flags' => ['LFLAGS'], - 'compile' => '$(LEX) $(LFLAGS) $(AM_LFLAGS)', - 'compiler' => 'LEXCOMPILE', - 'extensions' => ['.l'], - 'output_extensions' => sub { (my $ext = $_[0]) =~ tr/l/c/; - return ($ext,) }, - '_finish' => \&lang_lex_finish, - '_target_hook' => \&lang_lex_target_hook); -register_language ('name' => 'lexxx', - 'Name' => 'Lex (C++)', - 'config_vars' => ['LEX'], - 'rule_file' => 'lex', - 'flags' => ['LFLAGS'], - 'compile' => '$(LEX) $(LFLAGS) $(AM_LFLAGS)', - 'compiler' => 'LEXCOMPILE', - 'extensions' => ['.l++', '.ll', '.lxx', '.lpp'], - 'output_extensions' => sub { (my $ext = $_[0]) =~ tr/l/c/; - return ($ext,) }, - '_finish' => \&lang_lex_finish, - '_target_hook' => \&lang_lex_target_hook); - -# Assembler. -register_language ('name' => 'asm', - 'Name' => 'Assembler', - 'config_vars' => ['CCAS', 'CCASFLAGS'], - - 'flags' => ['CCASFLAGS'], - # Users can set AM_ASFLAGS to includes DEFS, INCLUDES, - # or anything else required. They can also set AS. - 'compile' => '$(CCAS) $(AM_CCASFLAGS) $(CCASFLAGS)', - 'compiler' => 'CCASCOMPILE', - 'compile_flag' => '-c', - 'extensions' => ['.s', '.S'], - - # With assembly we still use the C linker. - '_finish' => \&lang_c_finish); - -# Fortran 77 -register_language ('name' => 'f77', - 'Name' => 'Fortran 77', - 'linker' => 'F77LINK', - 'link' => '$(F77LD) $(AM_FFLAGS) $(FFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', - 'flags' => ['FFLAGS'], - 'compile' => '$(F77) $(AM_FFLAGS) $(FFLAGS)', - 'compiler' => 'F77COMPILE', - 'compile_flag' => '-c', - 'output_flag' => '-o', - 'lder' => 'F77LD', - 'ld' => '$(F77)', - 'pure' => 1, - 'extensions' => ['.f', '.for', '.f90']); - -# Preprocessed Fortran 77 -# -# The current support for preprocessing Fortran 77 just involves -# passing `$(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) -# $(CPPFLAGS)' as additional flags to the Fortran 77 compiler, since -# this is how GNU Make does it; see the `GNU Make Manual, Edition 0.51 -# for `make' Version 3.76 Beta' (specifically, from info file -# `(make)Catalogue of Rules'). -# -# A better approach would be to write an Autoconf test -# (i.e. AC_PROG_FPP) for a Fortran 77 preprocessor, because not all -# Fortran 77 compilers know how to do preprocessing. The Autoconf -# macro AC_PROG_FPP should test the Fortran 77 compiler first for -# preprocessing capabilities, and then fall back on cpp (if cpp were -# available). -register_language ('name' => 'ppf77', - 'Name' => 'Preprocessed Fortran 77', - 'config_vars' => ['F77'], - 'linker' => 'F77LINK', - 'link' => '$(F77LD) $(AM_FFLAGS) $(FFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', - 'lder' => 'F77LD', - 'ld' => '$(F77)', - 'flags' => ['FFLAGS', 'CPPFLAGS'], - 'compiler' => 'PPF77COMPILE', - 'compile' => '$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS)', - 'compile_flag' => '-c', - 'output_flag' => '-o', - 'pure' => 1, - 'extensions' => ['.F']); - -# Ratfor. -register_language ('name' => 'ratfor', - 'Name' => 'Ratfor', - 'config_vars' => ['F77'], - 'linker' => 'F77LINK', - 'link' => '$(F77LD) $(AM_FFLAGS) $(FFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', - 'lder' => 'F77LD', - 'ld' => '$(F77)', - 'flags' => ['RFLAGS', 'FFLAGS'], - # FIXME also FFLAGS. - 'compile' => '$(F77) $(AM_FFLAGS) $(FFLAGS) $(AM_RFLAGS) $(RFLAGS)', - 'compiler' => 'RCOMPILE', - 'compile_flag' => '-c', - 'output_flag' => '-o', - 'pure' => 1, - 'extensions' => ['.r']); - -# Java via gcj. -register_language ('name' => 'java', - 'Name' => 'Java', - 'config_vars' => ['GCJ'], - 'linker' => 'GCJLINK', - 'link' => '$(GCJLD) $(AM_GCJFLAGS) $(GCJFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', - 'autodep' => 'GCJ', - 'flags' => ['GCJFLAGS'], - 'compile' => '$(GCJ) $(AM_GCJFLAGS) $(GCJFLAGS)', - 'compiler' => 'GCJCOMPILE', - 'compile_flag' => '-c', - 'output_flag' => '-o', - 'lder' => 'GCJLD', - 'ld' => '$(GCJ)', - 'pure' => 1, - 'extensions' => ['.java', '.class', '.zip', '.jar']); - -################################################################ - -# Parse the WARNINGS environnent variable. -&parse_WARNINGS; - -# Parse command line. -&parse_arguments; - -# Do configure.ac scan only once. -&scan_autoconf_files; - -&fatal ("no `Makefile.am' found or specified\n") - if ! @input_files; - -my $automake_has_run = 0; - -do -{ - if ($automake_has_run) - { - &verb ('processing Makefiles another time to fix them up.'); - &prog_error ('running more than two times should never be needed.') - if $automake_has_run >= 2; - } - $automake_needs_to_reprocess_all_files = 0; - - # Now do all the work on each file. - # This guy must be local otherwise it's private to the loop. - use vars '$am_file'; - local $am_file; - foreach $am_file (@input_files) - { - if (! -f ($am_file . '.am')) - { - &err ("`$am_file.am' does not exist"); - } - else - { - &generate_makefile ($output_files{$am_file}, $am_file); - } - } - ++$automake_has_run; -} -while ($automake_needs_to_reprocess_all_files); - -exit $exit_code; - -################################################################ - -# Error reporting functions. - -# prog_error ($MESSAGE, [%OPTIONS]) -# ------------------------------- -# Signal a programming error, display $MESSAGE, and exit 1. -sub prog_error ($;%) -{ - my ($msg, %opts) = @_; - msg 'automake', '', $msg, %opts; -} - -# err ($WHERE, $MESSAGE, [%OPTIONS]) -# err ($MESSAGE) -# ---------------------------------- -# Uncategorized errors. -sub err ($;$%) -{ - my ($where, $msg, %opts) = @_; - msg ('error', $where, $msg, %opts); -} - -# fatal ($WHERE, $MESSAGE, [%OPTIONS]) -# fatal ($MESSAGE) -# ---------------------------------- -# Fatal errors. -sub fatal ($;$%) -{ - my ($where, $msg, %opts) = @_; - msg ('fatal', $where, $msg, %opts); -} - -# err_var ($VARNAME, $MESSAGE, [%OPTIONS]) -# ---------------------------------------- -# Uncategorized errors about variables. -sub err_var ($$;%) -{ - msg_var ('error', @_); -} - -# err_target ($TARGETNAME, $MESSAGE, [%OPTIONS]) -# ---------------------------------------------- -# Uncategorized errors about targets. -sub err_target ($$;%) -{ - msg_target ('error', @_); -} - -# err_cond_target ($COND, $TARGETNAME, $MESSAGE, [%OPTIONS]) -# ---------------------------------------------------------- -# Uncategorized errors about conditional targets. -sub err_cond_target ($$$;%) -{ - msg_cond_target ('error', @_); -} - -# err_am ($MESSAGE, [%OPTIONS]) -# ----------------------------- -# Uncategorized errors about the current Makefile.am. -sub err_am ($;%) -{ - msg_am ('error', @_); -} - -# err_ac ($MESSAGE, [%OPTIONS]) -# ----------------------------- -# Uncategorized errors about configure.ac. -sub err_ac ($;%) -{ - msg_ac ('error', @_); -} - -# msg_cond_var ($CHANNEL, $COND, $VARNAME, $MESSAGE, [%OPTIONS]) -# -------------------------------------------------------------- -# Messages about conditional variable. -sub msg_cond_var ($$$$;%) -{ - my ($channel, $cond, $var, $msg, %opts) = @_; - msg $channel, $var_location{$var}{$cond}, $msg, %opts; -} - -# msg_var ($CHANNEL, $VARNAME, $MESSAGE, [%OPTIONS]) -# -------------------------------------------------- -# Messages about variables. -sub msg_var ($$$;%) -{ - my ($channel, $var, $msg, %opts) = @_; - # Don't know which condition is concerned. Pick any. - my $cond = (keys %{$var_value{$var}})[0]; - msg_cond_var $channel, $cond, $var, $msg, %opts; -} - -# msg_cond_target ($CHANNEL, $COND, $TARGETNAME, $MESSAGE, [%OPTIONS]) -# -------------------------------------------------------------------- -# Messages about conditional targets. -sub msg_cond_target ($$$$;%) -{ - my ($channel, $cond, $target, $msg, %opts) = @_; - msg $channel, $targets{$target}{$cond}, $msg, %opts; -} - -# msg_target ($CHANNEL, $TARGETNAME, $MESSAGE, [%OPTIONS]) -# -------------------------------------------------------- -# Messages about targets. -sub msg_target ($$$;%) -{ - my ($channel, $target, $msg, %opts) = @_; - # Don't know which condition is concerned. Pick any. - my $cond = (keys %{$targets{$target}})[0]; - msg_cond_target ($channel, $cond, $target, $msg, %opts); -} - -# msg_am ($CHANNEL, $MESSAGE, [%OPTIONS]) -# --------------------------------------- -# Messages about about the current Makefile.am. -sub msg_am ($$;%) -{ - my ($channel, $msg, %opts) = @_; - msg $channel, "${am_file}.am", $msg, %opts; -} - -# msg_ac ($CHANNEL, $MESSAGE, [%OPTIONS]) -# --------------------------------------- -# Messages about about configure.ac. -sub msg_ac ($$;%) -{ - my ($channel, $msg, %opts) = @_; - msg $channel, $configure_ac, $msg, %opts; -} - -# $BOOL -# reject_var ($VAR, $ERROR_MSG) -# ----------------------------- -sub reject_var ($$) -{ - my ($var, $msg) = @_; - if (variable_defined ($var)) - { - err_var $var, $msg; - return 1; - } - return 0; -} - -# $BOOL -# reject_target ($VAR, $ERROR_MSG) -# -------------------------------- -sub reject_target ($$) -{ - my ($target, $msg) = @_; - if (target_defined ($target)) - { - err_target $target, $msg; - return 1; - } - return 0; -} - -# verb ($MESSAGE, [%OPTIONS]) -# --------------------------- -sub verb ($;%) -{ - my ($msg, %opts) = @_; - msg 'verb', '', $msg, %opts; -} - -################################################################ - -# subst ($TEXT) -# ------------- -# Return a configure-style substitution using the indicated text. -# We do this to avoid having the substitutions directly in automake.in; -# when we do that they are sometimes removed and this causes confusion -# and bugs. -sub subst ($) -{ - my ($text) = @_; - return '@' . $text . '@'; -} - -################################################################ - - -# $BACKPATH -# &backname ($REL-DIR) -# -------------------- -# If I `cd $REL-DIR', then to come back, I should `cd $BACKPATH'. -# For instance `src/foo' => `../..'. -# Works with non strictly increasing paths, i.e., `src/../lib' => `..'. -sub backname ($) -{ - my ($file) = @_; - my @res; - foreach (split (/\//, $file)) - { - next if $_ eq '.' || $_ eq ''; - if ($_ eq '..') - { - pop @res; - } - else - { - push (@res, '..'); - } - } - return join ('/', @res) || '.'; -} - -################################################################ - -# Pattern that matches all know input extensions (i.e. extensions used -# by the languages supported by Automake). Using this pattern -# (instead of `\..*$') to match extensions allows Automake to support -# dot-less extensions. -my $KNOWN_EXTENSIONS_PATTERN = ""; -my @known_extensions_list = (); - -# accept_extensions (@EXTS) -# ------------------------- -# Update $KNOWN_EXTENSIONS_PATTERN to recognize the extensions -# listed @EXTS. Extensions should contain a dot if needed. -sub accept_extensions (@) -{ - push @known_extensions_list, @_; - $KNOWN_EXTENSIONS_PATTERN = - '(?:' . join ('|', map (quotemeta, @known_extensions_list)) . ')'; -} - -# var_SUFFIXES_trigger ($TYPE, $VALUE) -# ------------------------------------ -# This is called automagically by macro_define() when SUFFIXES -# is defined ($TYPE eq '') or appended ($TYPE eq '+'). -# The work here needs to be performed as a side-effect of the -# macro_define() call because SUFFIXES definitions impact -# on $KNOWN_EXTENSIONS_PATTERN, and $KNOWN_EXTENSIONS_PATTERN -# are used when parsing the input am file. -sub var_SUFFIXES_trigger ($$) -{ - my ($type, $value) = @_; - accept_extensions (split (' ', $value)); -} - -################################################################ - - -# switch_warning ($CATEGORY) -# -------------------------- -# If $CATEGORY is mumble, turn on the mumble channel. -# If it's no-mumble, turn mumble off. -# Alse handle `all' and `none' for completeness. -sub switch_warning ($) -{ - my ($cat) = @_; - my $has_no = 0; - - if ($cat =~ /^no-(.*)$/) - { - $cat = $1; - $has_no = 1; - } - - if ($cat eq 'all') - { - setup_channel_type 'warning', silent => $has_no; - } - elsif ($cat eq 'none') - { - setup_channel_type 'warning', silent => 1 - $has_no; - } - elsif ($cat eq 'error') - { - $warnings_are_errors = 1 - $has_no; - } - elsif (channel_type ($cat) eq 'warning') - { - setup_channel $cat, silent => $has_no; - } - else - { - return 1; - } - return 0; -} - -# parse_WARNINGS -# -------------- -# Honor the WARNINGS environment variable. -sub parse_WARNINGS ($$) -{ - if (exists $ENV{'WARNINGS'}) - { - # Ignore unknown categories. This is required because WARNINGS - # should be honored by many tools. - switch_warning $_ foreach (split (',', $ENV{'WARNINGS'})); - } -} - -# parse_warning ($OPTION, $ARGUMENT) -# ---------------------------------- -# Parse the argument of --warning=CATEGORY or -WCATEGORY. -sub parse_warnings ($$) -{ - my ($opt, $categories) = @_; - - foreach my $cat (split (',', $categories)) - { - msg 'unsupported', "unknown warning category `$cat'" - if switch_warning $cat; - } -} - -# Parse command line. -sub parse_arguments () -{ - # Start off as gnu. - &set_strictness ('gnu'); - - my %options = - ( - 'libdir:s' => \$libdir, - 'gnu' => sub { &set_strictness ('gnu'); }, - 'gnits' => sub { &set_strictness ('gnits'); }, - 'cygnus' => \$cygnus_mode, - 'foreign' => sub { &set_strictness ('foreign'); }, - 'include-deps' => sub { $cmdline_use_dependencies = 1; }, - 'i|ignore-deps' => sub { $cmdline_use_dependencies = 0; }, - 'no-force' => sub { $force_generation = 0; }, - 'f|force-missing' => \$force_missing, - 'o|output-dir:s' => \$output_directory, - 'a|add-missing' => \$add_missing, - 'c|copy' => \$copy_missing, - 'v|verbose' => sub { setup_channel 'verb', silent => 0; }, - 'W|warnings:s' => \&parse_warnings, - # These long options (--Werror and --Wno-error) for backward - # compatibility. Use -Werror and -Wno-error today. - 'Werror' => sub { parse_warnings 'W', 'error'; }, - 'Wno-error' => sub { parse_warnings 'W', 'no-error'; }, - ); - - use Getopt::Long; - Getopt::Long::config ("bundling", "pass_through"); - - # See if --version or --help is used. We want to process these before - # anything else because the GNU Coding Standards require us to - # `exit 0' after processing these options, and we can't garanty this - # if we treat other options first. (Handling other options first - # could produce error diagnostics, and in this condition it is - # confusing if Automake `exit 0'.) - my %options_1st_pass = - ( - 'version' => \&version, - 'help' => \&usage, - # Recognize all other options (and their arguments) but do nothing. - map { $_ => sub {} } (keys %options) - ); - my @ARGV_backup = @ARGV; - Getopt::Long::GetOptions %options_1st_pass - or exit 1; - @ARGV = @ARGV_backup; - - # Now *really* process the options. This time we know - # that --help and --version are not present. - Getopt::Long::GetOptions %options - or exit 1; - - if (defined $output_directory) - { - msg 'obsolete', "`--output-dir' is deprecated\n"; - } - else - { - # In the next release we'll remove this entirely. - $output_directory = '.'; - } - - foreach my $arg (@ARGV) - { - if ($arg =~ /^-./) - { - fatal ("unrecognized option `$arg'\n" - . "Try `$0 --help' for more information."); - } - - # Handle $local:$input syntax. Note that we only examine the - # first ":" file to see if it is automake input; the rest are - # just taken verbatim. We still keep all the files around for - # dependency checking, however. - my ($local, $input, @rest) = split (/:/, $arg); - if (! $input) - { - $input = $local; - } - else - { - # Strip .in; later on .am is tacked on. That is how the - # automake input file is found. Maybe not the best way, but - # it is easy to explain. - $input =~ s/\.in$// - or fatal "invalid input file name `$arg'\n."; - } - push (@input_files, $input); - $output_files{$input} = join (':', ($local, @rest)); - } - - # Take global strictness from whatever we currently have set. - $default_strictness = $strictness; - $default_strictness_name = $strictness_name; -} - -################################################################ - -# Generate a Makefile.in given the name of the corresponding Makefile and -# the name of the file output by config.status. -sub generate_makefile -{ - my ($output, $makefile) = @_; - - # Reset all the Makefile.am related variables. - &initialize_per_input; - - # Any warning setting now local to this Makefile.am. - &dup_channel_setup; - # AUTOMAKE_OPTIONS can contains -W flags to disable or enable - # warnings for this file. So hold any warning issued before - # we have processed AUTOMAKE_OPTIONS. - &buffer_messages ('warning'); - - # Name of input file ("Makefile.am") and output file - # ("Makefile.in"). These have no directory components. - $am_file_name = basename ($makefile) . '.am'; - $in_file_name = basename ($makefile) . '.in'; - - # $OUTPUT is encoded. If it contains a ":" then the first element - # is the real output file, and all remaining elements are input - # files. We don't scan or otherwise deal with these input file, - # other than to mark them as dependencies. See - # &scan_autoconf_files for details. - my (@secondary_inputs); - ($output, @secondary_inputs) = split (/:/, $output); - - $relative_dir = dirname ($output); - $am_relative_dir = dirname ($makefile); - - &read_main_am_file ($makefile . '.am'); - if (&handle_options) - { - # Process buffered warnings. - &flush_messages; - # Fatal error. Just return, so we can continue with next file. - return; - } - # Process buffered warnings. - &flush_messages; - - # There are a few install-related variables that you should not define. - foreach my $var ('PRE_INSTALL', 'POST_INSTALL', 'NORMAL_INSTALL') - { - if (exists $var_owner{$var}) - { - prog_error "\$var_owner{$var}{TRUE} doesn't exist" - unless exists $var_owner{$var}{'TRUE'}; - reject_var $var, "`$var' should not be defined" - if $var_owner{$var}{'TRUE'} != VAR_AUTOMAKE; - } - } - - # Catch some obsolete variables. - msg_var ('obsolete', 'INCLUDES', - "`INCLUDES' is the old name for `AM_CPPFLAGS'") - if variable_defined ('INCLUDES'); - - # At the toplevel directory, we might need config.guess, config.sub - # or libtool scripts (ltconfig and ltmain.sh). - if ($relative_dir eq '.') - { - # AC_CANONICAL_HOST and AC_CANONICAL_SYSTEM need config.guess and - # config.sub. - require_conf_file ($canonical_location, FOREIGN, - 'config.guess', 'config.sub') - if $seen_canonical; - } - - # We still need Makefile.in here, because sometimes the `dist' - # target doesn't re-run automake. - if ($am_relative_dir eq $relative_dir) - { - # Only distribute the files if they are in the same subdir as - # the generated makefile. - &push_dist_common ($in_file_name, $am_file_name); - } - - push (@sources, '$(SOURCES)') - if variable_defined ('SOURCES'); - - # Must do this after reading .am file. See read_main_am_file to - # understand weird tricks we play there with variables. - &define_variable ('subdir', $relative_dir); - - # Check first, because we might modify some state. - &check_cygnus; - &check_gnu_standards; - &check_gnits_standards; - - &handle_configure ($output, $makefile, @secondary_inputs); - &handle_gettext; - &handle_libraries; - &handle_ltlibraries; - &handle_programs; - &handle_scripts; - - # This must run first so that the ANSI2KNR definition is generated - # before it is used by the _.c rules. We have to do this because - # a variable which is used in a dependency must be defined before - # the target, or else make won't properly see it. - &handle_compile; - # This must be run after all the sources are scanned. - &handle_languages; - - # We have to run this after dealing with all the programs. - &handle_libtool; - - # Re-init SOURCES. FIXME: other code shouldn't depend on this - # (but currently does). - macro_define ('SOURCES', VAR_AUTOMAKE, '', 'TRUE', "@sources", 'internal'); - define_pretty_variable ('DIST_SOURCES', '', @dist_sources); - - &handle_multilib; - &handle_texinfo; - &handle_emacs_lisp; - &handle_python; - &handle_java; - &handle_man_pages; - &handle_data; - &handle_headers; - &handle_subdirs; - &handle_tags; - &handle_minor_options; - &handle_tests; - - # This must come after most other rules. - &handle_dist ($makefile); - - &handle_footer; - &do_check_merge_target; - &handle_all ($output); - - # FIXME: Gross! - if (variable_defined ('lib_LTLIBRARIES') && - variable_defined ('bin_PROGRAMS')) - { - $output_rules .= "install-binPROGRAMS: install-libLTLIBRARIES\n\n"; - } - - &handle_installdirs; - &handle_clean; - &handle_factored_dependencies; - - check_typos (); - - if (! -d ($output_directory . '/' . $am_relative_dir)) - { - mkdir ($output_directory . '/' . $am_relative_dir, 0755); - } - - my ($out_file) = $output_directory . '/' . $makefile . ".in"; - if (! $force_generation && -e $out_file) - { - my ($am_time) = (stat ($makefile . '.am'))[9]; - my ($in_time) = (stat ($out_file))[9]; - # FIXME: should cache these times. - my ($conf_time) = (stat ($configure_ac))[9]; - # FIXME: how to do unsigned comparison? - if ($am_time < $in_time || $am_time < $conf_time) - { - # No need to update. - return; - } - if (-f 'aclocal.m4') - { - my ($acl_time) = (stat _)[9]; - return if ($am_time < $acl_time); - } - } - - if (-e "$out_file") - { - unlink ($out_file) - or fatal "cannot remove $out_file: $!\n"; - } - my $gm_file = new Automake::XFile "> $out_file"; - verb "creating $makefile.in"; - - print $gm_file $output_vars; - # We make sure that `all:' is the first target. - print $gm_file $output_all; - print $gm_file $output_header; - print $gm_file $output_rules; - print $gm_file $output_trailer; - - # Back out any warning setting. - &drop_channel_setup; -} - -################################################################ - -# A version is a string that looks like -# MAJOR.MINOR[.MICRO][ALPHA][-FORK] -# where -# MAJOR, MINOR, and MICRO are digits, ALPHA is a character, and -# FORK any alphanumeric word. -# Usually, ALPHA is used to label alpha releases or intermediate snapshots, -# FORK is used for CVS branches or patched releases, and MICRO is used -# for bug fixes releases on the MAJOR.MINOR branch. -# -# For the purpose of ordering, 1.4 is the same as 1.4.0, but 1.4g is -# the same as 1.4.99g. The FORK identifier is ignored in the -# ordering, except when it looks like -pMINOR[ALPHA]: some versions -# were labelled like 1.4-p3a, this is the same as an alpha release -# labelled 1.4.3a. Yes it's horrible, but Automake did not support -# two-dot versions in the past. - -# version_split (VERSION) -# ----------------------- -# Split a version string into the corresponding (MAJOR, MINOR, MICRO, -# ALPHA, FORK) tuple. For instance "1.4g" would be split into -# (1, 4, 99, 'g', ''). -# Return () on error. -sub version_split ($) -{ - my ($ver) = @_; - - # Special case for versions like 1.4-p2a. - if ($ver =~ /^(\d+)\.(\d+)(?:-p(\d+)([a-z]+)?)$/) - { - return ($1, $2, $3, $4 || '', ''); - } - # Common case. - elsif ($ver =~ /^(\d+)\.(\d+)(?:\.(\d+))?([a-z])?(?:-([A-Za-z0-9]+))?$/) - { - return ($1, $2, $3 || (defined $4 ? 99 : 0), $4 || '', $5 || ''); - } - return (); -} - -# version_compare (\@LVERSION, \@RVERSION) -# ---------------------------------------- -# Return 1 if LVERSION > RVERSION, -# -1 if LVERSION < RVERSION, -# 0 if LVERSION = RVERSION. -sub version_compare (\@\@) -{ - my @l = @{$_[0]}; - my @r = @{$_[1]}; - - for my $i (0, 1, 2) - { - return 1 if ($l[$i] > $r[$i]); - return -1 if ($l[$i] < $r[$i]); - } - for my $i (3, 4) - { - return 1 if ($l[$i] gt $r[$i]); - return -1 if ($l[$i] lt $r[$i]); - } - return 0; -} - -# Handles the logic of requiring a version number in AUTOMAKE_OPTIONS. -# Return 0 if the required version is satisfied, 1 otherwise. -sub version_check ($) -{ - my ($required) = @_; - my @version = version_split $VERSION; - my @required = version_split $required; - - prog_error "version is incorrect: $VERSION" - if $#version == -1; - - # This should not happen, because process_option_list and split_version - # use similar regexes. - prog_error "required version is incorrect: $required" - if $#required == -1; - - # If we require 3.4n-foo then we require something - # >= 3.4n, with the `foo' fork identifier. - return 1 - if ($required[4] ne '' && $required[4] ne $version[4]); - - return 0 > version_compare @version, @required; -} - -# $BOOL -# process_option_list ($CONFIG, @OPTIONS) -# ------------------------------ -# Process a list of options. Return 1 on error, 0 otherwise. -# This is a helper for handle_options. CONFIG is true if we're -# handling global options. -sub process_option_list -{ - my ($config, @list) = @_; - - # FIXME: We should disallow conditional deffinitions of AUTOMAKE_OPTIONS. - my $where = ($config ? - $seen_init_automake : - $var_location{'AUTOMAKE_OPTIONS'}{'TRUE'}); - - foreach (@list) - { - $options{$_} = 1; - if ($_ eq 'gnits' || $_ eq 'gnu' || $_ eq 'foreign') - { - &set_strictness ($_); - } - elsif ($_ eq 'cygnus') - { - $cygnus_mode = 1; - } - elsif (/^(.*\/)?ansi2knr$/) - { - # An option like "../lib/ansi2knr" is allowed. With no - # path prefix, we assume the required programs are in this - # directory. We save the actual option for later. - $options{'ansi2knr'} = $_; - } - elsif ($_ eq 'no-installman' || $_ eq 'no-installinfo' - || $_ eq 'dist-shar' || $_ eq 'dist-zip' - || $_ eq 'dist-tarZ' || $_ eq 'dist-bzip2' - || $_ eq 'dejagnu' || $_ eq 'no-texinfo.tex' - || $_ eq 'readme-alpha' || $_ eq 'check-news' - || $_ eq 'subdir-objects' || $_ eq 'nostdinc' - || $_ eq 'no-exeext' || $_ eq 'no-define' - || $_ eq 'std-options') - { - # Explicitly recognize these. - } - elsif ($_ eq 'no-dependencies') - { - $use_dependencies = 0; - } - elsif (/^\d+\.\d+(?:\.\d+)?[a-z]?(?:-[A-Za-z0-9]+)?$/) - { - # Got a version number. - if (version_check $&) - { - err ($where, "require Automake $_, but have $VERSION", - uniq_scope => US_GLOBAL); - return 1; - } - } - elsif (/^(?:--warnings=|-W)(.*)$/) - { - foreach my $cat (split (',', $1)) - { - msg 'unsupported', $where, "unknown warning category `$cat'" - if switch_warning $cat; - } - } - else - { - err ($where, "option `$_' not recognized", - uniq_scope => US_GLOBAL); - return 1; - } - } -} - -# Handle AUTOMAKE_OPTIONS variable. Return 1 on error, 0 otherwise. -sub handle_options -{ - # Process global options first so that more specific options can - # override. - if (&process_option_list (1, split (' ', $global_options))) - { - return 1; - } - - if (variable_defined ('AUTOMAKE_OPTIONS')) - { - if (&process_option_list (0, &variable_value_as_list_recursive ('AUTOMAKE_OPTIONS', ''))) - { - return 1; - } - } - - if ($strictness == GNITS) - { - $options{'readme-alpha'} = 1; - $options{'std-options'} = 1; - $options{'check-news'} = 1; - } - - return 0; -} - - -# get_object_extension ($OUT) -# --------------------------- -# Return object extension. Just once, put some code into the output. -# OUT is the name of the output file -sub get_object_extension -{ - my ($out) = @_; - - # Maybe require libtool library object files. - my $extension = '.$(OBJEXT)'; - $extension = '.lo' if ($out =~ /\.la$/); - - # Check for automatic de-ANSI-fication. - $extension = '$U' . $extension - if defined $options{'ansi2knr'}; - - $get_object_extension_was_run = 1; - - return $extension; -} - - -# Call finish function for each language that was used. -sub handle_languages -{ - if ($use_dependencies) - { - # Include auto-dep code. Don't include it if DEP_FILES would - # be empty. - if (&saw_sources_p (0) && keys %dep_files) - { - # Set location of depcomp. - &define_variable ('depcomp', "\$(SHELL) $config_aux_dir/depcomp"); - &define_variable ('am__depfiles_maybe', 'depfiles'); - - require_conf_file ("$am_file.am", FOREIGN, 'depcomp'); - - my @deplist = sort keys %dep_files; - - # We define this as a conditional variable because BSD - # make can't handle backslashes for continuing comments on - # the following line. - define_pretty_variable ('DEP_FILES', 'AMDEP_TRUE', @deplist); - - # Generate each `include' individually. Irix 6 make will - # not properly include several files resulting from a - # variable expansion; generating many separate includes - # seems safest. - $output_rules .= "\n"; - foreach my $iter (@deplist) - { - $output_rules .= (subst ('AMDEP_TRUE') - . subst ('am__include') - . ' ' - . subst ('am__quote') - . $iter - . subst ('am__quote') - . "\n"); - } - - # Compute the set of directories to remove in distclean-depend. - my @depdirs = uniq (map { dirname ($_) } @deplist); - $output_rules .= &file_contents ('depend', - DEPDIRS => "@depdirs"); - } - } - else - { - &define_variable ('depcomp', ''); - &define_variable ('am__depfiles_maybe', ''); - } - - my %done; - - # Is the c linker needed? - my $needs_c = 0; - foreach my $ext (sort keys %extension_seen) - { - next unless $extension_map{$ext}; - - my $lang = $languages{$extension_map{$ext}}; - - my $rule_file = $lang->rule_file || 'depend2'; - - # Get information on $LANG. - my $pfx = $lang->autodep; - my $fpfx = ($pfx eq '') ? 'CC' : $pfx; - - my $AMDEP = (($use_dependencies && $lang->autodep ne 'no') - ? 'AMDEP' : 'FALSE'); - my $FASTDEP = (($use_dependencies && $lang->autodep ne 'no') - ? ('am__fastdep' . $fpfx) : 'FALSE'); - - my %transform = ('EXT' => $ext, - 'PFX' => $pfx, - 'FPFX' => $fpfx, - 'AMDEP' => $AMDEP, - 'FASTDEP' => $FASTDEP, - '-c' => $lang->compile_flag || '', - 'MORE-THAN-ONE' - => (count_files_for_language ($lang->name) > 1)); - - # Generate the appropriate rules for this extension. - if (($use_dependencies && $lang->autodep ne 'no') - || defined $lang->compile) - { - # Some C compilers don't support -c -o. Use it only if really - # needed. - my $output_flag = $lang->output_flag || ''; - $output_flag = '-o' - if (! $output_flag - && $lang->name eq 'c' - && defined $options{'subdir-objects'}); - - # Compute a possible derived extension. - # This is not used by depend2.am. - my $der_ext = (&{$lang->output_extensions} ($ext))[0]; - - $output_rules .= - file_contents ($rule_file, - %transform, - 'GENERIC' => 1, - - 'DERIVED-EXT' => $der_ext, - - # In this situation we know that the - # object is in this directory, so - # $(DEPDIR) is the correct location for - # dependencies. - 'DEPBASE' => '$(DEPDIR)/$*', - 'BASE' => '$*', - 'SOURCE' => '$<', - 'OBJ' => '$@', - 'OBJOBJ' => '$@', - 'LTOBJ' => '$@', - - 'COMPILE' => '$(' . $lang->compiler . ')', - 'LTCOMPILE' => '$(LT' . $lang->compiler . ')', - '-o' => $output_flag); - } - - # Now include code for each specially handled object with this - # language. - my %seen_files = (); - foreach my $file (@{$lang_specific_files{$lang->name}}) - { - my ($derived, $source, $obj, $myext) = split (' ', $file); - - # For any specially-generated object, we must respect the - # ansi2knr setting so that we don't inadvertently try to - # use the default rule. - if ($lang->ansi && defined $options{'ansi2knr'}) - { - $myext = '$U' . $myext; - } - - # We might see a given object twice, for instance if it is - # used under different conditions. - next if defined $seen_files{$obj}; - $seen_files{$obj} = 1; - - prog_error ("found " . $lang->name . - " in handle_languages, but compiler not defined") - unless defined $lang->compile; - - my $obj_compile = $lang->compile; - - # Rewrite each occurence of `AM_$flag' in the compile - # rule into `${derived}_$flag' if it exists. - for my $flag (@{$lang->flags}) - { - my $val = "${derived}_$flag"; - $obj_compile =~ s/\(AM_$flag\)/\($val\)/ - if variable_defined ($val); - } - - my $obj_ltcompile = '$(LIBTOOL) --mode=compile ' . $obj_compile; - - # We _need_ `-o' for per object rules. - my $output_flag = $lang->output_flag || '-o'; - - my $depbase = dirname ($obj); - $depbase = '' - if $depbase eq '.'; - $depbase .= '/' - unless $depbase eq ''; - $depbase .= '$(DEPDIR)/' . basename ($obj); - - # Generate a transform which will turn suffix targets in - # depend2.am into real targets for the particular objects we - # are building. - $output_rules .= - file_contents ($rule_file, - (%transform, - 'GENERIC' => 0, - - 'DEPBASE' => $depbase, - 'BASE' => $obj, - 'SOURCE' => $source, - # Use $myext and not `.o' here, in case - # we are actually building a new source - # file -- e.g. via yacc. - 'OBJ' => "$obj$myext", - 'OBJOBJ' => "$obj.obj", - 'LTOBJ' => "$obj.lo", - - 'COMPILE' => $obj_compile, - 'LTCOMPILE' => $obj_ltcompile, - '-o' => $output_flag)); - } - - # The rest of the loop is done once per language. - next if defined $done{$lang}; - $done{$lang} = 1; - - # Load the language dependent Makefile chunks. - my %lang = map { uc ($_) => 0 } keys %languages; - $lang{uc ($lang->name)} = 1; - $output_rules .= file_contents ('lang-compile', %transform, %lang); - - # If the source to a program consists entirely of code from a - # `pure' language, for instance C++ for Fortran 77, then we - # don't need the C compiler code. However if we run into - # something unusual then we do generate the C code. There are - # probably corner cases here that do not work properly. - # People linking Java code to Fortran code deserve pain. - $needs_c ||= ! $lang->pure; - - define_compiler_variable ($lang) - if ($lang->compile); - - define_linker_variable ($lang) - if ($lang->link); - - require_variables ("$am_file.am", $lang->Name . " source seen", - 'TRUE', @{$lang->config_vars}); - - # Call the finisher. - $lang->finish; - - # Flags listed in `->flags' are user variables (per GNU Standards), - # they should not be overriden in the Makefile... - my @dont_override = @{$lang->flags}; - # ... and so is LDFLAGS. - push @dont_override, 'LDFLAGS' if $lang->link; - - foreach my $flag (@dont_override) - { - if (exists $var_owner{$flag}) - { - for my $cond (keys %{$var_owner{$flag}}) - { - if ($var_owner{$flag}{$cond} == VAR_MAKEFILE) - { - msg_cond_var ('gnu', $cond, $flag, - "`$flag' is a user variable, " - . "you should not override it;\n" - . "use `AM_$flag' instead."); - } - } - } - } - } - - # If the project is entirely C++ or entirely Fortran 77 (i.e., 1 - # suffix rule was learned), don't bother with the C stuff. But if - # anything else creeps in, then use it. - $needs_c = 1 - if $need_link || ((scalar keys %$suffix_rules) - - (scalar keys %$suffix_rules_default)) > 1; - - if ($needs_c) - { - &define_compiler_variable ($languages{'c'}) - unless defined $done{$languages{'c'}}; - define_linker_variable ($languages{'c'}); - } -} - -# Check to make sure a source defined in LIBOBJS is not explicitly -# mentioned. This is a separate function (as opposed to being inlined -# in handle_source_transform) because it isn't always appropriate to -# do this check. -sub check_libobjs_sources -{ - my ($one_file, $unxformed) = @_; - - foreach my $prefix ('', 'EXTRA_', 'dist_', 'nodist_', - 'dist_EXTRA_', 'nodist_EXTRA_') - { - my @files; - if (variable_defined ($prefix . $one_file . '_SOURCES')) - { - @files = &variable_value_as_list_recursive ( - ($prefix . $one_file . '_SOURCES'), - 'all'); - } - elsif ($prefix eq '') - { - @files = ($unxformed . '.c'); - } - else - { - next; - } - - foreach my $file (@files) - { - err_var ($prefix . $one_file . '_SOURCES', - "automatically discovered file `$file' should not" . - " be explicitly mentioned") - if defined $libsources{$file}; - } - } -} - - -# @OBJECTS -# handle_single_transform_list ($VAR, $TOPPARENT, $DERIVED, $OBJ, @FILES) -# ----------------------------------------------------------------------- -# Does much of the actual work for handle_source_transform. -# Arguments are: -# $VAR is the name of the variable that the source filenames come from -# $TOPPARENT is the name of the _SOURCES variable which is being processed -# $DERIVED is the name of resulting executable or library -# $OBJ is the object extension (e.g., `$U.lo') -# @FILES is the list of source files to transform -# Result is a list of the names of objects -# %linkers_used will be updated with any linkers needed -sub handle_single_transform_list ($$$$@) -{ - my ($var, $topparent, $derived, $obj, @files) = @_; - my @result = (); - my $nonansi_obj = $obj; - $nonansi_obj =~ s/\$U//g; - - # Turn sources into objects. We use a while loop like this - # because we might add to @files in the loop. - while (scalar @files > 0) - { - $_ = shift @files; - - # Configure substitutions in _SOURCES variables are errors. - if (/^\@.*\@$/) - { - err_var ($var, - "`$var' includes configure substitution `$_', and is " . - "referred to\nfrom `$topparent': configure " . - "substitutions are not allowed\nin _SOURCES variables"); - next; - } - - # If the source file is in a subdirectory then the `.o' is put - # into the current directory, unless the subdir-objects option - # is in effect. - - # Split file name into base and extension. - next if ! /^(?:(.*)\/)?([^\/]*)($KNOWN_EXTENSIONS_PATTERN)$/; - my $full = $_; - my $directory = $1 || ''; - my $base = $2; - my $extension = $3; - my $full_ansi = $full; # We'll add `$U' if needed. - - # We must generate a rule for the object if it requires its own flags. - my $renamed = 0; - my ($linker, $object); - - # This records whether we've seen a derived source file (eg, - # yacc output). - my $derived_source = 0; - - # This holds the `aggregate context' of the file we are - # currently examining. If the file is compiled with - # per-object flags, then it will be the name of the object. - # Otherwise it will be `AM'. This is used by the target hook - # language function. - my $aggregate = 'AM'; - - $extension = &derive_suffix ($extension, $nonansi_obj); - my $lang; - if ($extension_map{$extension} && - ($lang = $languages{$extension_map{$extension}})) - { - # Found the language, so see what it says. - &saw_extension ($extension); - - # Note: computed subr call. The language rewrite function - # should return one of the LANG_* constants. It could - # also return a list whose first value is such a constant - # and whose second value is a new source extension which - # should be applied. This means this particular language - # generates another source file which we must then process - # further. - my $subr = 'lang_' . $lang->name . '_rewrite'; - my ($r, $source_extension) - = & $subr ($directory, $base, $extension); - # Skip this entry if we were asked not to process it. - next if $r == LANG_IGNORE; - - # Now extract linker and other info. - $linker = $lang->linker; - - my $this_obj_ext; - if (defined $source_extension) - { - $this_obj_ext = $source_extension; - $derived_source = 1; - } - elsif ($lang->ansi) - { - $this_obj_ext = $obj; - } - else - { - $this_obj_ext = $nonansi_obj; - } - $object = $base . $this_obj_ext; - - # Do we have per-executable flags for this executable? - my $have_per_exec_flags = 0; - foreach my $flag (@{$lang->flags}) - { - if (variable_defined ("${derived}_$flag")) - { - $have_per_exec_flags = 1; - last; - } - } - - if ($have_per_exec_flags) - { - # We have a per-executable flag in effect for this - # object. In this case we rewrite the object's - # name to ensure it is unique. We also require - # the `compile' program to deal with compilers - # where `-c -o' does not work. - - # We choose the name `DERIVED_OBJECT' to ensure - # (1) uniqueness, and (2) continuity between - # invocations. However, this will result in a - # name that is too long for losing systems, in - # some situations. So we provide _SHORTNAME to - # override. - - my $dname = $derived; - if (variable_defined ($derived . '_SHORTNAME')) - { - # FIXME: should use the same conditional as - # the _SOURCES variable. But this is really - # silly overkill -- nobody should have - # conditional shortnames. - $dname = &variable_value ($derived . '_SHORTNAME'); - } - $object = $dname . '-' . $object; - - require_conf_file ("$am_file.am", FOREIGN, 'compile') - if $lang->name eq 'c'; - - prog_error ($lang->name . " flags defined without compiler") - if ! defined $lang->compile; - - $renamed = 1; - } - - # If rewrite said it was ok, put the object into a - # subdir. - if ($r == LANG_SUBDIR && $directory ne '') - { - $object = $directory . '/' . $object; - } - - # If doing dependency tracking, then we can't print - # the rule. If we have a subdir object, we need to - # generate an explicit rule. Actually, in any case - # where the object is not in `.' we need a special - # rule. The per-object rules in this case are - # generated later, by handle_languages. - if ($renamed || $directory ne '') - { - my $obj_sans_ext = substr ($object, 0, - - length ($this_obj_ext)); - if ($lang->ansi && defined $options{'ansi2knr'}) - { - $full_ansi =~ s/$KNOWN_EXTENSIONS_PATTERN$/\$U$&/; - $full_ansi = basename $full_ansi - unless defined $options{'subdir-objects'}; - } - - my $val = ("$full_ansi $obj_sans_ext " - # Only use $this_obj_ext in the derived - # source case because in the other case we - # *don't* want $(OBJEXT) to appear here. - . ($derived_source ? $this_obj_ext : '.o')); - - # If we renamed the object then we want to use the - # per-executable flag name. But if this is simply a - # subdir build then we still want to use the AM_ flag - # name. - if ($renamed) - { - $val = "$derived $val"; - $aggregate = $derived; - } - else - { - $val = "AM $val"; - } - - # Each item on this list is a string consisting of - # four space-separated values: the derived flag prefix - # (eg, for `foo_CFLAGS', it is `foo'), the name of the - # source file, the base name of the output file, and - # the extension for the object file. - push (@{$lang_specific_files{$lang->name}}, $val); - } - } - elsif ($extension eq $nonansi_obj) - { - # This is probably the result of a direct suffix rule. - # In this case we just accept the rewrite. - $object = "$base$extension"; - $linker = ''; - } - else - { - # No error message here. Used to have one, but it was - # very unpopular. - # FIXME: we could potentially do more processing here, - # perhaps treating the new extension as though it were a - # new source extension (as above). This would require - # more restructuring than is appropriate right now. - next; - } - - err_am "object `$object' created by `$full' and `$object_map{$object}'" - if (defined $object_map{$object} - && $object_map{$object} ne $full); - - my $comp_val = (($object =~ /\.lo$/) - ? COMPILE_LIBTOOL : COMPILE_ORDINARY); - (my $comp_obj = $object) =~ s/\.lo$/.\$(OBJEXT)/; - if (defined $object_compilation_map{$comp_obj} - && $object_compilation_map{$comp_obj} != 0 - # Only see the error once. - && ($object_compilation_map{$comp_obj} - != (COMPILE_LIBTOOL | COMPILE_ORDINARY)) - && $object_compilation_map{$comp_obj} != $comp_val) - { - err_am "object `$object' created both with libtool and without"; - } - $object_compilation_map{$comp_obj} |= $comp_val; - - if (defined $lang) - { - # Let the language do some special magic if required. - $lang->target_hook ($aggregate, $object, $full); - } - - if ($derived_source) - { - prog_error ($lang->name . " has automatic dependency tracking") - if $lang->autodep ne 'no'; - # Make sure this new source file is handled next. That will - # make it appear to be at the right place in the list. - unshift (@files, $object); - # Distribute derived sources unless the source they are - # derived from is not. - &push_dist_common ($object) - unless ($topparent =~ /^(?:nobase_)?nodist_/); - next; - } - - $linkers_used{$linker} = 1; - - push (@result, $object); - - if (! defined $object_map{$object}) - { - my @dep_list = (); - $object_map{$object} = $full; - - # If file is in subdirectory, we need explicit - # dependency. - if ($directory ne '' || $renamed) - { - push (@dep_list, $full_ansi); - } - - # If resulting object is in subdir, we need to make - # sure the subdir exists at build time. - if ($object =~ /\//) - { - # FIXME: check that $DIRECTORY is somewhere in the - # project - - # For Java, the way we're handling it right now, a - # `..' component doesn't make sense. - if ($lang->name eq 'java' && $object =~ /(\/|^)\.\.\//) - { - err_am "`$full' should not contain a `..' component"; - } - - # Make sure object is removed by `make mostlyclean'. - $compile_clean_files{$object} = MOSTLY_CLEAN; - # If we have a libtool object then we also must remove - # the ordinary .o. - if ($object =~ /\.lo$/) - { - (my $xobj = $object) =~ s,lo$,\$(OBJEXT),; - $compile_clean_files{$xobj} = MOSTLY_CLEAN; - - # Remove any libtool object in this directory. - $libtool_clean_directories{$directory} = 1; - } - - push (@dep_list, require_build_directory ($directory)); - - # If we're generating dependencies, we also want - # to make sure that the appropriate subdir of the - # .deps directory is created. - push (@dep_list, - require_build_directory ($directory . '/$(DEPDIR)')) - if $use_dependencies; - } - - &pretty_print_rule ($object . ':', "\t", @dep_list) - if scalar @dep_list > 0; - } - - # Transform .o or $o file into .P file (for automatic - # dependency code). - if ($lang && $lang->autodep ne 'no') - { - my $depfile = $object; - $depfile =~ s/\.([^.]*)$/.P$1/; - $depfile =~ s/\$\(OBJEXT\)$/o/; - $dep_files{dirname ($depfile) . '/$(DEPDIR)/' - . basename ($depfile)} = 1; - } - } - - return @result; -} - -# ($LINKER, $OBJVAR) -# define_objects_from_sources ($VAR, $OBJVAR, $NODEFINE, $ONE_FILE, -# $OBJ, $PARENT, $TOPPARENT) -# --------------------------------------------------------------------- -# Define an _OBJECTS variable for a _SOURCES variable (or subvariable) -# -# Arguments are: -# $VAR is the name of the _SOURCES variable -# $OBJVAR is the name of the _OBJECTS variable if known (otherwise -# it will be generated and returned). -# $NODEFINE is a boolean: if true, $OBJVAR will not be defined (but -# work done to determine the linker will be). -# $ONE_FILE is the canonical (transformed) name of object to build -# $OBJ is the object extension (ie either `.o' or `.lo'). -# $PARENT is the variable in which $VAR is used, or $VAR if not applicable. -# $TOPPARENT is the _SOURCES variable being processed. -# -# Result is a pair ($LINKER, $OBJVAR): -# $LINKER is a boolean, true if a linker is needed to deal with the objects, -# $OBJVAR is the name of the variable defined to hold the objects. -# -# %linkers_used, %vars_scanned, @substfroms and @substtos should be cleared -# before use: -# %linkers_used variable will be set to contain the linkers desired. -# %vars_scanned will be used to check for recursive definitions. -# @substfroms and @substtos will be used to keep a stack of variable -# substitutions to be applied. -# -sub define_objects_from_sources ($$$$$$$) -{ - my ($var, $objvar, $nodefine, $one_file, $obj, $parent, $topparent) = @_; - - if (defined $vars_scanned{$var}) - { - err_var $var, "variable `$var' recursively defined"; - return ""; - } - $vars_scanned{$var} = 1; - - my $needlinker = ""; - my @allresults = (); - foreach my $cond (variable_conditions ($var)) - { - my @result; - foreach my $val (&variable_value_as_list ($var, $cond, $parent)) - { - # If $val is a variable (i.e. ${foo} or $(bar), not a filename), - # handle the sub variable recursively. - if ($val =~ /^\$\{([^}]*)\}$/ || $val =~ /^\$\(([^)]*)\)$/) - { - my $subvar = $1; - - # If the user uses a losing variable name, just ignore it. - # This isn't ideal, but people have requested it. - next if ($subvar =~ /\@.*\@/); - - # See if the variable is actually a substitution reference - my ($from, $to); - my @temp_list; - if ($subvar =~ /$SUBST_REF_PATTERN/o) - { - $subvar = $1; - $to = $3; - $from = quotemeta $2; - } - push @substfroms, $from; - push @substtos, $to; - - my ($temp, $varname) - = define_objects_from_sources ($subvar, undef, - $nodefine, $one_file, - $obj, $var, $topparent); - - push (@result, '$('. $varname . ')'); - $needlinker ||= $temp; - - pop @substfroms; - pop @substtos; - } - else # $var is a filename - { - my $substnum=$#substfroms; - while ($substnum >= 0) - { - $val =~ s/$substfroms[$substnum]$/$substtos[$substnum]/ - if defined $substfroms[$substnum]; - $substnum -= 1; - } - - my (@transformed) = - &handle_single_transform_list ($var, $topparent, $one_file, $obj, $val); - push (@result, @transformed); - $needlinker = "true" if @transformed; - } - } - push (@allresults, [$cond, @result]); - } - # Find a name for the variable, unless imposed. - $objvar = subobjname (@allresults) unless defined $objvar; - # Define _OBJECTS conditionally - unless ($nodefine) - { - foreach my $pair (@allresults) - { - my ($cond, @result) = @$pair; - define_pretty_variable ($objvar, $cond, @result); - } - } - - delete $vars_scanned{$var}; - return ($needlinker, $objvar); -} - - -# $VARNAME -# subobjname (@DEFINITIONS) -# ------------------------- -# Return a name for an object variable that with definitions @DEFINITIONS. -# @DEFINITIONS is a list of pair [$COND, @OBJECTS]. -# -# If we already have an object variable containing @DEFINITIONS, reuse it. -# This way, we avoid combinatorial explosion of the generated -# variables. Especially, in a Makefile such as: -# -# | if FOO1 -# | A1=1 -# | endif -# | -# | if FOO2 -# | A2=2 -# | endif -# | -# | ... -# | -# | if FOON -# | AN=N -# | endif -# | -# | B=$(A1) $(A2) ... $(AN) -# | -# | c_SOURCES=$(B) -# | d_SOURCES=$(B) -# -# The generated c_OBJECTS and d_OBJECTS will share the same variable -# definitions. -# -# This setup can be the case of a testsuite containing lots (>100) of -# small C programs, all testing the same set of source files. -sub subobjname (@) -{ - my $key = ''; - foreach my $pair (@_) - { - my ($cond, @values) = @$pair; - $key .= "($cond)@values"; - } - - return $subobjvar{$key} if exists $subobjvar{$key}; - - my $num = 1 + keys (%subobjvar); - my $name = "am__objects_${num}"; - $subobjvar{$key} = $name; - return $name; -} - - -# Handle SOURCE->OBJECT transform for one program or library. -# Arguments are: -# canonical (transformed) name of object to build -# actual name of object to build -# object extension (ie either `.o' or `$o'. -# Return result is name of linker variable that must be used. -# Empty return means just use `LINK'. -sub handle_source_transform -{ - # one_file is canonical name. unxformed is given name. obj is - # object extension. - my ($one_file, $unxformed, $obj) = @_; - - my ($linker) = ''; - - # No point in continuing if _OBJECTS is defined. - return if reject_var ($one_file . '_OBJECTS', - $one_file . '_OBJECTS should not be defined'); - - my %used_pfx = (); - my $needlinker; - %linkers_used = (); - foreach my $prefix ('', 'EXTRA_', 'dist_', 'nodist_', - 'dist_EXTRA_', 'nodist_EXTRA_') - { - my $var = $prefix . $one_file . "_SOURCES"; - next - if !variable_defined ($var); - - # We are going to define _OBJECTS variables using the prefix. - # Then we glom them all together. So we can't use the null - # prefix here as we need it later. - my $xpfx = ($prefix eq '') ? 'am_' : $prefix; - - # Keep track of which prefixes we saw. - $used_pfx{$xpfx} = 1 - unless $prefix =~ /EXTRA_/; - - push @sources, "\$($var)"; - if ($prefix !~ /^nodist_/) - { - # If the VAR wasn't definined conditionally, we add - # it to DIST_SOURCES as is. Otherwise we create a - # am__VAR_DIST variable which contains all possible values, - # and add this variable to DIST_SOURCES. - my $distvar = "$var"; - my @conds = variable_conditions_recursive ($var); - if (@conds && $conds[0] ne 'TRUE') - { - $distvar = "am__${var}_DIST"; - my @files = - uniq (variable_value_as_list_recursive ($var, 'all')); - define_pretty_variable ($distvar, '', @files); - } - push @dist_sources, "\$($distvar)" - } - - @substfroms = (); - @substtos = (); - %vars_scanned = (); - my ($temp, $objvar) = - define_objects_from_sources ($var, - $xpfx . $one_file . '_OBJECTS', - $prefix =~ /EXTRA_/, - $one_file, $obj, $var, $var); - $needlinker ||= $temp; - } - if ($needlinker) - { - $linker ||= &resolve_linker (%linkers_used); - } - - my @keys = sort keys %used_pfx; - if (scalar @keys == 0) - { - &define_variable ($one_file . "_SOURCES", $unxformed . ".c"); - push (@sources, $unxformed . '.c'); - push (@dist_sources, $unxformed . '.c'); - - %linkers_used = (); - my (@result) = - &handle_single_transform_list ($one_file . '_SOURCES', - $one_file . '_SOURCES', - $one_file, $obj, - "$unxformed.c"); - $linker ||= &resolve_linker (%linkers_used); - define_pretty_variable ($one_file . "_OBJECTS", '', @result) - } - else - { - grep ($_ = '$(' . $_ . $one_file . '_OBJECTS)', @keys); - define_pretty_variable ($one_file . '_OBJECTS', '', @keys); - } - - # If we want to use `LINK' we must make sure it is defined. - if ($linker eq '') - { - $need_link = 1; - } - - return $linker; -} - - -# handle_lib_objects ($XNAME, $VAR) -# --------------------------------- -# Special-case ALLOCA and LIBOBJS substitutions in _LDADD or _LIBADD variables. -# Also, generate _DEPENDENCIES variable if appropriate. -# Arguments are: -# transformed name of object being built, or empty string if no object -# name of _LDADD/_LIBADD-type variable to examine -# Returns 1 if LIBOBJS seen, 0 otherwise. -sub handle_lib_objects -{ - my ($xname, $var) = @_; - - prog_error "handle_lib_objects: $var undefined" - if ! variable_defined ($var); - - my $ret = 0; - foreach my $cond (variable_conditions_recursive ($var)) - { - if (&handle_lib_objects_cond ($xname, $var, $cond)) - { - $ret = 1; - } - } - return $ret; -} - -# Subroutine of handle_lib_objects: handle a particular condition. -sub handle_lib_objects_cond -{ - my ($xname, $var, $cond) = @_; - - # We recognize certain things that are commonly put in LIBADD or - # LDADD. - my @dep_list = (); - - my $seen_libobjs = 0; - my $flagvar = 0; - - foreach my $lsearch (&variable_value_as_list_recursive ($var, $cond)) - { - # Skip -lfoo and -Ldir; these are explicitly allowed. - next if $lsearch =~ /^-[lL]/; - if (! $flagvar && $lsearch =~ /^-/) - { - if ($var =~ /^(.*)LDADD$/) - { - # Skip -dlopen and -dlpreopen; these are explicitly allowed. - next if $lsearch =~ /^-dl(pre)?open$/; - my $prefix = $1 || 'AM_'; - err_var ($var, "linker flags such as `$lsearch' belong in " - . "`${prefix}LDFLAGS"); - } - else - { - $var =~ /^(.*)LIBADD$/; - # Only get this error once. - $flagvar = 1; - err_var ($var, "linker flags such as `$lsearch' belong in " - . "`${1}LDFLAGS"); - } - } - - # Assume we have a file of some sort, and push it onto the - # dependency list. Autoconf substitutions are not pushed; - # rarely is a new dependency substituted into (eg) foo_LDADD - # -- but "bad things (eg -lX11) are routinely substituted. - # Note that LIBOBJS and ALLOCA are exceptions to this rule, - # and handled specially below. - push (@dep_list, $lsearch) - unless $lsearch =~ /^\@.*\@$/; - - # Automatically handle LIBOBJS and ALLOCA substitutions. - # Basically this means adding entries to dep_files. - if ($lsearch =~ /^\@(LT)?LIBOBJS\@$/) - { - my $lt = $1 ? $1 : ''; - my $myobjext = ($1 ? 'l' : '') . 'o'; - - push (@dep_list, $lsearch); - $seen_libobjs = 1; - if (! keys %libsources - && ! variable_defined ($lt . 'LIBOBJS')) - { - err_var ($var, "\@${lt}LIBOBJS\@ seen but never set in " - . "`$configure_ac'"); - } - - foreach my $iter (keys %libsources) - { - if ($iter =~ /\.[cly]$/) - { - &saw_extension ($&); - &saw_extension ('.c'); - } - - if ($iter =~ /\.h$/) - { - require_file_with_macro ($cond, $var, FOREIGN, $iter); - } - elsif ($iter ne 'alloca.c') - { - my $rewrite = $iter; - $rewrite =~ s/\.c$/.P$myobjext/; - $dep_files{'$(DEPDIR)/' . $rewrite} = 1; - $rewrite = "^" . quotemeta ($iter) . "\$"; - # Only require the file if it is not a built source. - if (! variable_defined ('BUILT_SOURCES') - || ! grep (/$rewrite/, - &variable_value_as_list_recursive ( - 'BUILT_SOURCES', 'all'))) - { - require_file_with_macro ($cond, $var, FOREIGN, $iter); - } - } - } - } - elsif ($lsearch =~ /^\@(LT)?ALLOCA\@$/) - { - my $lt = $1 ? $1 : ''; - my $myobjext = ($1 ? 'l' : '') . 'o'; - - push (@dep_list, $lsearch); - err_var ($var, "\@${lt}ALLOCA\@ seen but `AC_FUNC_ALLOCA' not in " - . "`$configure_ac'") - if ! defined $libsources{'alloca.c'}; - $dep_files{'$(DEPDIR)/alloca.P' . $myobjext} = 1; - require_file_with_macro ($cond, $var, FOREIGN, 'alloca.c'); - &saw_extension ('c'); - } - } - - if ($xname ne '') - { - my $depvar = $xname . '_DEPENDENCIES'; - if ((conditional_ambiguous_p ($depvar, $cond, - keys %{$var_value{$depvar}}))[0] ne '') - { - # Note that we've examined this. - &examine_variable ($depvar); - } - else - { - define_pretty_variable ($depvar, $cond, @dep_list); - } - } - - return $seen_libobjs; -} - -# Canonicalize the input parameter -sub canonicalize -{ - my ($string) = @_; - $string =~ tr/A-Za-z0-9_\@/_/c; - return $string; -} - -# Canonicalize a name, and check to make sure the non-canonical name -# is never used. Returns canonical name. Arguments are name and a -# list of suffixes to check for. -sub check_canonical_spelling -{ - my ($name, @suffixes) = @_; - - my $xname = &canonicalize ($name); - if ($xname ne $name) - { - foreach my $xt (@suffixes) - { - reject_var ("$name$xt", "use `$xname$xt', not `$name$xt'"); - } - } - - return $xname; -} - - -# handle_compile () -# ----------------- -# Set up the compile suite. -sub handle_compile () -{ - return - unless $get_object_extension_was_run; - - # Boilerplate. - my $default_includes = ''; - if (! defined $options{'nostdinc'}) - { - $default_includes = ' -I. -I$(srcdir)'; - - if (variable_defined ('CONFIG_HEADER')) - { - foreach my $hdr (split (' ', &variable_value ('CONFIG_HEADER'))) - { - $default_includes .= ' -I' . dirname ($hdr); - } - } - } - - my (@mostly_rms, @dist_rms); - foreach my $item (sort keys %compile_clean_files) - { - if ($compile_clean_files{$item} == MOSTLY_CLEAN) - { - push (@mostly_rms, "\t-rm -f $item"); - } - elsif ($compile_clean_files{$item} == DIST_CLEAN) - { - push (@dist_rms, "\t-rm -f $item"); - } - else - { - prog_error 'invalid entry in %compile_clean_files'; - } - } - - my ($coms, $vars, $rules) = - &file_contents_internal (1, "$libdir/am/compile.am", - ('DEFAULT_INCLUDES' => $default_includes, - 'MOSTLYRMS' => join ("\n", @mostly_rms), - 'DISTRMS' => join ("\n", @dist_rms))); - $output_vars .= $vars; - $output_rules .= "$coms$rules"; - - # Check for automatic de-ANSI-fication. - if (defined $options{'ansi2knr'}) - { - require_variables_for_macro ('AUTOMAKE_OPTIONS', - "option `ansi2knr' is used", - "ANSI2KNR", "U"); - - # topdir is where ansi2knr should be. - if ($options{'ansi2knr'} eq 'ansi2knr') - { - # Only require ansi2knr files if they should appear in - # this directory. - require_file_with_macro ('TRUE', 'AUTOMAKE_OPTIONS', FOREIGN, - 'ansi2knr.c', 'ansi2knr.1'); - - # ansi2knr needs to be built before subdirs, so unshift it. - unshift (@all, '$(ANSI2KNR)'); - } - - my $ansi2knr_dir = ''; - $ansi2knr_dir = dirname ($options{'ansi2knr'}) - if $options{'ansi2knr'} ne 'ansi2knr'; - - $output_rules .= &file_contents ('ansi2knr', - ('ANSI2KNR-DIR' => $ansi2knr_dir)); - - } -} - -# handle_libtool () -# ----------------- -# Handle libtool rules. -sub handle_libtool -{ - return unless variable_defined ('LIBTOOL'); - - # Libtool requires some files, but only at top level. - require_conf_file_with_macro ('TRUE', 'LIBTOOL', FOREIGN, @libtool_files) - if $relative_dir eq '.'; - - my @libtool_rms; - foreach my $item (sort keys %libtool_clean_directories) - { - my $dir = ($item eq '.') ? '' : "$item/"; - # .libs is for Unix, _libs for DOS. - push (@libtool_rms, "\t-rm -rf ${dir}.libs ${dir}_libs"); - } - - # Output the libtool compilation rules. - $output_rules .= &file_contents ('libtool', - ('LTRMS' => join ("\n", @libtool_rms))); -} - -# handle_programs () -# ------------------ -# Handle C programs. -sub handle_programs -{ - my @proglist = &am_install_var ('progs', 'PROGRAMS', - 'bin', 'sbin', 'libexec', 'pkglib', - 'noinst', 'check'); - return if ! @proglist; - - my $seen_global_libobjs = - variable_defined ('LDADD') && &handle_lib_objects ('', 'LDADD'); - - foreach my $one_file (@proglist) - { - my $seen_libobjs = 0; - my $obj = &get_object_extension ($one_file); - - # Canonicalize names and check for misspellings. - my $xname = &check_canonical_spelling ($one_file, '_LDADD', '_LDFLAGS', - '_SOURCES', '_OBJECTS', - '_DEPENDENCIES'); - - my $linker = &handle_source_transform ($xname, $one_file, $obj); - - my $xt = ''; - if (variable_defined ($xname . "_LDADD")) - { - $seen_libobjs = &handle_lib_objects ($xname, $xname . '_LDADD'); - $xt = '_LDADD'; - } - else - { - # User didn't define prog_LDADD override. So do it. - &define_variable ($xname . '_LDADD', '$(LDADD)'); - - # This does a bit too much work. But we need it to - # generate _DEPENDENCIES when appropriate. - if (variable_defined ('LDADD')) - { - $seen_libobjs = &handle_lib_objects ($xname, 'LDADD'); - } - elsif (! variable_defined ($xname . '_DEPENDENCIES')) - { - &define_variable ($xname . '_DEPENDENCIES', ''); - } - $xt = '_SOURCES'; - } - - reject_var ($xname . '_LIBADD', - "use `${xname}_LDADD', not `${xname}_LIBADD'"); - - if (! variable_defined ($xname . '_LDFLAGS')) - { - # Define the prog_LDFLAGS variable. - &define_variable ($xname . '_LDFLAGS', ''); - } - - # Determine program to use for link. - my $xlink; - if (variable_defined ($xname . '_LINK')) - { - $xlink = $xname . '_LINK'; - } - else - { - $xlink = $linker ? $linker : 'LINK'; - } - - # If the resulting program lies into a subdirectory, - # make sure this directory will exist. - my $dirstamp = require_build_directory_maybe ($one_file); - - # Don't add $(EXEEXT) if user already did. - my $extension = ($one_file !~ /\$\(EXEEXT\)$/ - ? "\$(EXEEXT)" - : ''); - - $output_rules .= &file_contents ('program', - ('PROGRAM' => $one_file, - 'XPROGRAM' => $xname, - 'XLINK' => $xlink, - 'DIRSTAMP' => $dirstamp, - 'EXEEXT' => $extension)); - - if ($seen_libobjs || $seen_global_libobjs) - { - if (variable_defined ($xname . '_LDADD')) - { - &check_libobjs_sources ($xname, $xname . '_LDADD'); - } - elsif (variable_defined ('LDADD')) - { - &check_libobjs_sources ($xname, 'LDADD'); - } - } - } -} - - -# handle_libraries () -# ------------------- -# Handle libraries. -sub handle_libraries -{ - my @liblist = &am_install_var ('libs', 'LIBRARIES', - 'lib', 'pkglib', 'noinst', 'check'); - return if ! @liblist; - - my @prefix = am_primary_prefixes ('LIBRARIES', 0, 'lib', 'pkglib', - 'noinst', 'check'); - - require_variables_for_macro ($prefix[0] . '_LIBRARIES', - 'library used', 'RANLIB') - if (@prefix); - - foreach my $onelib (@liblist) - { - my $seen_libobjs = 0; - # Check that the library fits the standard naming convention. - if (basename ($onelib) !~ /^lib.*\.a/) - { - # FIXME should put line number here. That means mapping - # from library name back to variable name. - err_am "`$onelib' is not a standard library name"; - } - - my $obj = &get_object_extension ($onelib); - - # Canonicalize names and check for misspellings. - my $xlib = &check_canonical_spelling ($onelib, '_LIBADD', '_SOURCES', - '_OBJECTS', '_DEPENDENCIES', - '_AR'); - - if (! variable_defined ($xlib . '_AR')) - { - &define_variable ($xlib . '_AR', '$(AR) cru'); - } - - if (variable_defined ($xlib . '_LIBADD')) - { - if (&handle_lib_objects ($xlib, $xlib . '_LIBADD')) - { - $seen_libobjs = 1; - } - } - else - { - # Generate support for conditional object inclusion in - # libraries. - &define_variable ($xlib . "_LIBADD", ''); - } - - reject_var ($xlib . '_LDADD', - "use `${xlib}_LIBADD', not `${xlib}_LDADD'"); - - # Make sure we at look at this. - &examine_variable ($xlib . '_DEPENDENCIES'); - - &handle_source_transform ($xlib, $onelib, $obj); - - # If the resulting library lies into a subdirectory, - # make sure this directory will exist. - my $dirstamp = require_build_directory_maybe ($onelib); - - $output_rules .= &file_contents ('library', - ('LIBRARY' => $onelib, - 'XLIBRARY' => $xlib, - 'DIRSTAMP' => $dirstamp)); - - if ($seen_libobjs) - { - if (variable_defined ($xlib . '_LIBADD')) - { - &check_libobjs_sources ($xlib, $xlib . '_LIBADD'); - } - } - } -} - - -# handle_ltlibraries () -# --------------------- -# Handle shared libraries. -sub handle_ltlibraries -{ - my @liblist = &am_install_var ('ltlib', 'LTLIBRARIES', - 'noinst', 'lib', 'pkglib', 'check'); - return if ! @liblist; - - my %instdirs; - my @prefix = am_primary_prefixes ('LTLIBRARIES', 0, 'lib', 'pkglib', - 'noinst', 'check'); - - require_variables_for_macro ($prefix[0] . '_LTLIBRARIES', - 'Libtool library used', 'LIBTOOL') - if (@prefix); - - foreach my $key (@prefix) - { - # Get the installation directory of each library. - (my $dir = $key) =~ s/^nobase_//; - for (variable_value_as_list_recursive ($key . '_LTLIBRARIES', 'all')) - { - # We reject libraries which are installed in several places, - # because we don't handle this in the rules (think `-rpath'). - # - # However, we allow the same library to be listed many times - # for the same directory. This is for users who need setups - # like - # if COND1 - # lib_LTLIBRARIES = libfoo.la - # endif - # if COND2 - # lib_LTLIBRARIES = libfoo.la - # endif - # - # Actually this will also allow - # lib_LTLIBRARIES = libfoo.la libfoo.la - # Diagnosing this case doesn't seem worth the plain (we'd - # have to fill $instdirs on a per-condition basis, check - # implied conditions, etc.) - if (defined $instdirs{$_} && $instdirs{$_} ne $dir) - { - err_am ("`$_' is already going to be installed in " - . "`$instdirs{$_}'"); - } - else - { - $instdirs{$_} = $dir; - } - } - } - - foreach my $onelib (@liblist) - { - my $seen_libobjs = 0; - my $obj = &get_object_extension ($onelib); - - # Canonicalize names and check for misspellings. - my $xlib = &check_canonical_spelling ($onelib, '_LIBADD', '_LDFLAGS', - '_SOURCES', '_OBJECTS', - '_DEPENDENCIES'); - - if (! variable_defined ($xlib . '_LDFLAGS')) - { - # Define the lib_LDFLAGS variable. - &define_variable ($xlib . '_LDFLAGS', ''); - } - - # Check that the library fits the standard naming convention. - my $libname_rx = "^lib.*\.la"; - if ((variable_defined ($xlib . '_LDFLAGS') - && grep (/-module/, - &variable_value_as_list_recursive ($xlib . '_LDFLAGS', - 'all'))) - || (variable_defined ('LDFLAGS') - && grep (/-module/, - &variable_value_as_list_recursive ('LDFLAGS', 'all')))) - { - # Relax name checking for libtool modules. - $libname_rx = "\.la"; - } - if (basename ($onelib) !~ /$libname_rx$/) - { - # FIXME should put line number here. That means mapping - # from library name back to variable name. - msg_am ('error-gnu/warn', - "`$onelib' is not a standard libtool library name"); - } - - if (variable_defined ($xlib . '_LIBADD')) - { - if (&handle_lib_objects ($xlib, $xlib . '_LIBADD')) - { - $seen_libobjs = 1; - } - } - else - { - # Generate support for conditional object inclusion in - # libraries. - &define_variable ($xlib . "_LIBADD", ''); - } - - reject_var ("${xlib}_LDADD", - "use `${xlib}_LIBADD', not `${xlib}_LDADD'"); - - # Make sure we at look at this. - &examine_variable ($xlib . '_DEPENDENCIES'); - - my $linker = &handle_source_transform ($xlib, $onelib, $obj); - - # Determine program to use for link. - my $xlink; - if (variable_defined ($xlib . '_LINK')) - { - $xlink = $xlib . '_LINK'; - } - else - { - $xlink = $linker ? $linker : 'LINK'; - } - - my $rpath; - if ($instdirs{$onelib} eq 'EXTRA' - || $instdirs{$onelib} eq 'noinst' - || $instdirs{$onelib} eq 'check') - { - # It's an EXTRA_ library, so we can't specify -rpath, - # because we don't know where the library will end up. - # The user probably knows, but generally speaking automake - # doesn't -- and in fact configure could decide - # dynamically between two different locations. - $rpath = ''; - } - else - { - $rpath = ('-rpath $(' . $instdirs{$onelib} . 'dir)'); - } - - # If the resulting library lies into a subdirectory, - # make sure this directory will exist. - my $dirstamp = require_build_directory_maybe ($onelib); - - # Remember to cleanup .libs/ in this directory. - my $dirname = dirname $onelib; - $libtool_clean_directories{$dirname} = 1; - - $output_rules .= &file_contents ('ltlibrary', - ('LTLIBRARY' => $onelib, - 'XLTLIBRARY' => $xlib, - 'RPATH' => $rpath, - 'XLINK' => $xlink, - 'DIRSTAMP' => $dirstamp)); - if ($seen_libobjs) - { - if (variable_defined ($xlib . '_LIBADD')) - { - &check_libobjs_sources ($xlib, $xlib . '_LIBADD'); - } - } - } -} - -# See if any _SOURCES variable were misspelled. -sub check_typos () -{ - # It is ok if the user sets this particular variable. - &examine_variable ('AM_LDFLAGS'); - - foreach my $varname (keys %var_value) - { - foreach my $primary ('_SOURCES', '_LIBADD', '_LDADD', '_LDFLAGS', - '_DEPENDENCIES') - { - msg_var 'syntax', $varname, "unused variable: `$varname'" - # Note that a configure variable is always legitimate. - if ($varname =~ /$primary$/ && ! $content_seen{$varname} - && ! exists $configure_vars{$varname}); - } - } -} - - -# Handle scripts. -sub handle_scripts -{ - # NOTE we no longer automatically clean SCRIPTS, because it is - # useful to sometimes distribute scripts verbatim. This happens - # eg in Automake itself. - &am_install_var ('-candist', 'scripts', 'SCRIPTS', - 'bin', 'sbin', 'libexec', 'pkgdata', - 'noinst', 'check'); -} - - -# ($OUTFILE, $VFILE, @CLEAN_FILES) -# &scan_texinfo_file ($FILENAME) -# ------------------------------ -# $OUTFILE is the name of the info file produced by $FILENAME. -# $VFILE is the name of the version.texi file used (empty if none). -# @CLEAN_FILES is the list of by products (indexes etc.) -sub scan_texinfo_file -{ - my ($filename) = @_; - - # These are always created, no matter whether indexes are used or not. - # (Actually tmp is only created if an @macro is used and a certain e-TeX - # feature is not available.) - my @clean_suffixes = qw(aux log toc tmp - cp fn ky vr tp pg); # grep new.*index texinfo.tex - - # There are predefined indexes which don't follow the regular rules. - my %predefined_index = qw(c cps - f fns - k kys - v vrs - t tps - p pgs); - - # There are commands which include a hidden index command. - my %hidden_index = (tp => 'tps'); - $hidden_index{$_} = 'fns' foreach qw(fn un typefn typefun max spec - op typeop method typemethod); - $hidden_index{$_} = 'vrs' foreach qw(vr var typevr typevar opt cv - ivar typeivar); - - # Indexes stored into another one. In this case, the *.??s file - # is not created. - my @syncodeindexes = (); - - my $texi = new Automake::XFile "< $filename"; - verb "reading $filename"; - - my ($outfile, $vfile); - while ($_ = $texi->getline) - { - if (/^\@setfilename +(\S+)/) - { - $outfile = $1; - if ($outfile =~ /\.(.+)$/ && $1 ne 'info') - { - err "$filename:$.", "output `$outfile' has unrecognized extension"; - return; - } - } - # A "version.texi" file is actually any file whose name - # matches "vers*.texi". - elsif (/^\@include\s+(vers[^.]*\.texi)\s*$/) - { - $vfile = $1; - } - - # Try to find what are the indexes which are used. - - # Creating a new category of index. - elsif (/^\@def(code)?index (\w+)/) - { - push @clean_suffixes, $2; - } - - # Storing in a predefined index. - elsif (/^\@([cfkvtp])index /) - { - push @clean_suffixes, $predefined_index{$1}; - } - elsif (/^\@def(\w+) /) - { - push @clean_suffixes, $hidden_index{$1} - if defined $hidden_index{$1}; - } - - # Merging an index into an another. - elsif (/^\@syn(code)?index (\w+) (\w+)/) - { - push @syncodeindexes, "$2s"; - push @clean_suffixes, "$3s"; - } - - } - - if ($outfile eq '') - { - err_am "`$filename' missing \@setfilename"; - return; - } - - my $infobase = basename ($filename); - $infobase =~ s/\.te?xi(nfo)?$//; - my %clean_files = map { +"$infobase.$_" => 1 } @clean_suffixes; - grep { delete $clean_files{"$infobase.$_"} } @syncodeindexes; - return ($outfile, $vfile, (sort keys %clean_files)); -} - -# ($DIRSTAMP, @CLEAN_FILES) -# output_texinfo_build_rules ($SOURCE, $DEST, @DEPENDENCIES) -# ---------------------------------------------------------- -# SOURCE - the source Texinfo file -# DEST - the destination Info file -# DEPENDENCIES - known dependencies -sub output_texinfo_build_rules ($$@) -{ - my ($source, $dest, @deps) = @_; - - # Split `a.texi' into `a' and `.texi'. - my ($spfx, $ssfx) = ($source =~ /^(.*?)(\.[^.]*)?$/); - my ($dpfx, $dsfx) = ($dest =~ /^(.*?)(\.[^.]*)?$/); - - $ssfx ||= ""; - $dsfx ||= ""; - - # We can output two kinds of rules: the "generic" rules - # use Make suffix rules and are appropritate when - # $source and $dest lie in the current directory; the "specifix" - # rules is needed in the other case. - # - # The former are output only once (this is not really apparent - # here, but just remember that some logic deeper in Automake will - # not output the same rule twice); while the later need to be output - # for each Texinfo source. - my $generic; - my $makeinfoflags; - my $sdir = dirname $source; - if ($sdir eq '.' && dirname ($dest) eq '.') - { - $generic = 1; - $makeinfoflags = '-I $(srcdir)'; - } - else - { - $generic = 0; - $makeinfoflags = "-I $sdir -I \$(srcdir)/$sdir"; - } - - # If the resulting file lie into a subdirectory, - # make sure this directory will exist. - my $dirstamp = require_build_directory_maybe ($dest); - - $output_rules .= &file_contents ('texibuild', - GENERIC => $generic, - SOURCE_SUFFIX => $ssfx, - SOURCE => ($generic ? '$<' : $source), - SOURCE_REAL => $source, - DEST_PREFIX => $dpfx, - DEST_SUFFIX => $dsfx, - MAKEINFOFLAGS => $makeinfoflags, - DEPS => "@deps", - DIRSTAMP => $dirstamp); - return ($dirstamp, "$dpfx.dvi", "$dpfx.pdf", "$dpfx.ps"); -} - - -# ($DO-SOMETHING, $TEXICLEANS) -# handle_texinfo_helper () -# ------------------------ -# Handle all Texinfo source; helper for handle_texinfo -sub handle_texinfo_helper -{ - reject_var 'TEXINFOS', "`TEXINFOS' is an anachronism; use `info_TEXINFOS'"; - reject_var 'html_TEXINFOS', "HTML generation not yet supported"; - - return (0, '') if ! variable_defined ('info_TEXINFOS'); - - my @texis = &variable_value_as_list_recursive ('info_TEXINFOS', 'all'); - - my (@info_deps_list, @dvis_list, @pdfs_list, @pss_list, @texi_deps); - my %versions; - my $done = 0; - my @texi_cleans; - my $canonical; - - foreach my $info_cursor (@texis) - { - my $infobase = $info_cursor; - $infobase =~ s/\.(txi|texinfo|texi)$//; - - if ($infobase eq $info_cursor) - { - # FIXME: report line number. - err_am "texinfo file `$info_cursor' has unrecognized extension"; - next; - } - - # If 'version.texi' is referenced by input file, then include - # automatic versioning capability. - my ($out_file, $vtexi, @clean_files) = - &scan_texinfo_file ("$relative_dir/$info_cursor") - or next; - push (@texi_cleans, @clean_files); - - # If the Texinfo source is in a subdirectory, create the - # resulting info in this subdirectory. If it is in the - # current directory, try hard to not prefix "./" because - # it breaks the generic rules. - my $outdir = dirname ($info_cursor) . '/'; - $outdir = "" if $outdir eq './'; - $out_file = $outdir . $out_file; - - # If user specified file_TEXINFOS, then use that as explicit - # dependency list. - @texi_deps = (); - push (@texi_deps, "$outdir$vtexi") if $vtexi; - - my $canonical = &canonicalize ($infobase); - if (variable_defined ($canonical . "_TEXINFOS")) - { - push (@texi_deps, '$(' . $canonical . '_TEXINFOS)'); - &push_dist_common ('$(' . $canonical . '_TEXINFOS)'); - } - - my ($dirstamp, @cfiles) = - output_texinfo_build_rules ($info_cursor, $out_file, @texi_deps); - push (@texi_cleans, @cfiles); - - push (@info_deps_list, $out_file); - push (@dvis_list, $infobase . '.dvi'); - push (@pdfs_list, $infobase . '.pdf'); - push (@pss_list, $infobase . '.ps'); - - # If a vers*.texi file is needed, emit the rule. - if ($vtexi) - { - err_am ("`$vtexi', included in `$info_cursor', " - . "also included in `$versions{$vtexi}'") - if defined $versions{$vtexi}; - $versions{$vtexi} = $info_cursor; - - # We number the stamp-vti files. This is doable since the - # actual names don't matter much. We only number starting - # with the second one, so that the common case looks nice. - my $vti = ($done ? $done : 'vti'); - ++$done; - - # This is ugly, but it is our historical practice. - if ($config_aux_dir_set_in_configure_in) - { - require_conf_file_with_macro ('TRUE', 'info_TEXINFOS', FOREIGN, - 'mdate-sh'); - } - else - { - require_file_with_macro ('TRUE', 'info_TEXINFOS', - FOREIGN, 'mdate-sh'); - } - - my $conf_dir; - if ($config_aux_dir_set_in_configure_in) - { - $conf_dir = $config_aux_dir; - $conf_dir .= '/' unless $conf_dir =~ /\/$/; - } - else - { - $conf_dir = '$(srcdir)/'; - } - $output_rules .= &file_contents ('texi-vers', - TEXI => $info_cursor, - VTI => $vti, - STAMPVTI => "${outdir}stamp-$vti", - VTEXI => "$outdir$vtexi", - MDDIR => $conf_dir, - DIRSTAMP => $dirstamp); - } - } - - # Handle location of texinfo.tex. - my $need_texi_file = 0; - my $texinfodir; - if ($cygnus_mode) - { - $texinfodir = '$(top_srcdir)/../texinfo'; - &define_variable ('TEXINFO_TEX', "$texinfodir/texinfo.tex"); - } - elsif ($config_aux_dir_set_in_configure_in) - { - $texinfodir = $config_aux_dir; - &define_variable ('TEXINFO_TEX', "$texinfodir/texinfo.tex"); - $need_texi_file = 2; # so that we require_conf_file later - } - elsif (variable_defined ('TEXINFO_TEX')) - { - # The user defined TEXINFO_TEX so assume he knows what he is - # doing. - $texinfodir = ('$(srcdir)/' - . dirname (&variable_value ('TEXINFO_TEX'))); - } - else - { - $texinfodir = '$(srcdir)'; - $need_texi_file = 1; - } - &define_variable ('am__TEXINFO_TEX_DIR', $texinfodir); - - # The return value. - my $texiclean = &pretty_print_internal ("", "\t ", @texi_cleans); - - push (@dist_targets, 'dist-info'); - - if (! defined $options{'no-installinfo'}) - { - # Make sure documentation is made and installed first. Use - # $(INFO_DEPS), not 'info', because otherwise recursive makes - # get run twice during "make all". - unshift (@all, '$(INFO_DEPS)'); - } - - &define_variable ("INFO_DEPS", "@info_deps_list"); - &define_variable ("DVIS", "@dvis_list"); - &define_variable ("PDFS", "@pdfs_list"); - &define_variable ("PSS", "@pss_list"); - # This next isn't strictly needed now -- the places that look here - # could easily be changed to look in info_TEXINFOS. But this is - # probably better, in case noinst_TEXINFOS is ever supported. - &define_variable ("TEXINFOS", &variable_value ('info_TEXINFOS')); - - # Do some error checking. Note that this file is not required - # when in Cygnus mode; instead we defined TEXINFO_TEX explicitly - # up above. - if ($need_texi_file && ! defined $options{'no-texinfo.tex'}) - { - if ($need_texi_file > 1) - { - require_conf_file_with_macro ('TRUE', 'info_TEXINFOS', FOREIGN, - 'texinfo.tex'); - } - else - { - require_file_with_macro ('TRUE', 'info_TEXINFOS', FOREIGN, - 'texinfo.tex'); - } - } - - return (1, $texiclean); -} - -# handle_texinfo () -# ----------------- -# Handle all Texinfo source. -sub handle_texinfo -{ - my ($do_something, $texiclean) = handle_texinfo_helper (); - $output_rules .= &file_contents ('texinfos', - ('TEXICLEAN' => $texiclean, - 'LOCAL-TEXIS' => $do_something)); -} - -# Handle any man pages. -sub handle_man_pages -{ - reject_var 'MANS', "`MANS' is an anachronism; use `man_MANS'"; - - # Find all the sections in use. We do this by first looking for - # "standard" sections, and then looking for any additional - # sections used in man_MANS. - my (%sections, %vlist); - # We handle nodist_ for uniformity. man pages aren't distributed - # by default so it isn't actually very important. - foreach my $pfx ('', 'dist_', 'nodist_') - { - # Add more sections as needed. - foreach my $section ('0'..'9', 'n', 'l') - { - if (variable_defined ($pfx . 'man' . $section . '_MANS')) - { - $sections{$section} = 1; - $vlist{'$(' . $pfx . 'man' . $section . '_MANS)'} = 1; - - &push_dist_common ('$(' . $pfx . 'man' . $section . '_MANS)') - if $pfx eq 'dist_'; - } - } - - if (variable_defined ($pfx . 'man_MANS')) - { - $vlist{'$(' . $pfx . 'man_MANS)'} = 1; - foreach (&variable_value_as_list_recursive ($pfx . 'man_MANS', 'all')) - { - # A page like `foo.1c' goes into man1dir. - if (/\.([0-9a-z])([a-z]*)$/) - { - $sections{$1} = 1; - } - } - - &push_dist_common ('$(' . $pfx . 'man_MANS)') - if $pfx eq 'dist_'; - } - } - - return unless %sections; - - # Now for each section, generate an install and unintall rule. - # Sort sections so output is deterministic. - foreach my $section (sort keys %sections) - { - $output_rules .= &file_contents ('mans', ('SECTION' => $section)); - } - - my @mans = sort keys %vlist; - $output_vars .= file_contents ('mans-vars', - ('MANS' => "@mans")); - - if (! defined $options{'no-installman'}) - { - push (@all, '$(MANS)'); - } -} - -# Handle DATA variables. -sub handle_data -{ - &am_install_var ('-noextra', '-candist', 'data', 'DATA', - 'data', 'sysconf', 'sharedstate', 'localstate', - 'pkgdata', 'noinst', 'check'); -} - -# Handle TAGS. -sub handle_tags -{ - my @tag_deps = (); - my @ctag_deps = (); - if (variable_defined ('SUBDIRS')) - { - $output_rules .= ("tags-recursive:\n" - . "\tlist=\'\$(SUBDIRS)\'; for subdir in \$\$list; do \\\n" - # Never fail here if a subdir fails; it - # isn't important. - . "\t test \"\$\$subdir\" = . || (cd \$\$subdir" - . " && \$(MAKE) \$(AM_MAKEFLAGS) tags); \\\n" - . "\tdone\n"); - push (@tag_deps, 'tags-recursive'); - &depend ('.PHONY', 'tags-recursive'); - - $output_rules .= ("ctags-recursive:\n" - . "\tlist=\'\$(SUBDIRS)\'; for subdir in \$\$list; do \\\n" - # Never fail here if a subdir fails; it - # isn't important. - . "\t test \"\$\$subdir\" = . || (cd \$\$subdir" - . " && \$(MAKE) \$(AM_MAKEFLAGS) ctags); \\\n" - . "\tdone\n"); - push (@ctag_deps, 'ctags-recursive'); - &depend ('.PHONY', 'ctags-recursive'); - } - - if (&saw_sources_p (1) - || variable_defined ('ETAGS_ARGS') - || @tag_deps) - { - my @config; - foreach my $spec (@config_headers) - { - my ($out, @ins) = split_config_file_spec ($spec); - foreach my $in (@ins) - { - # If the config header source is in this directory, - # require it. - push @config, basename ($in) - if $relative_dir eq dirname ($in); - } - } - $output_rules .= &file_contents ('tags', - ('CONFIG' => "@config", - 'TAGSDIRS' => "@tag_deps", - 'CTAGSDIRS' => "@ctag_deps")); - &examine_variable ('TAGS_DEPENDENCIES'); - } - elsif (reject_var ('TAGS_DEPENDENCIES', - "doesn't make sense to define `TAGS_DEPENDENCIES'" - . "without\nsources or `ETAGS_ARGS'")) - { - } - else - { - # Every Makefile must define some sort of TAGS rule. - # Otherwise, it would be possible for a top-level "make TAGS" - # to fail because some subdirectory failed. - $output_rules .= "tags: TAGS\nTAGS:\n\n"; - # Ditto ctags. - $output_rules .= "ctags: CTAGS\nCTAGS:\n\n"; - } -} - -# Handle multilib support. -sub handle_multilib -{ - if ($seen_multilib && $relative_dir eq '.') - { - $output_rules .= &file_contents ('multilib'); - } -} - - -# $BOOLEAN -# &for_dist_common ($A, $B) -# ------------------------- -# Subroutine for &handle_dist: sort files to dist. -# -# We put README first because it then becomes easier to make a -# Usenet-compliant shar file (in these, README must be first). -# -# FIXME: do more ordering of files here. -sub for_dist_common -{ - return 0 - if $a eq $b; - return -1 - if $a eq 'README'; - return 1 - if $b eq 'README'; - return $a cmp $b; -} - - -# handle_dist ($MAKEFILE) -# ----------------------- -# Handle 'dist' target. -sub handle_dist -{ - my ($makefile) = @_; - - # `make dist' isn't used in a Cygnus-style tree. - # Omit the rules so that people don't try to use them. - return if $cygnus_mode; - - # Look for common files that should be included in distribution. - # If the aux dir is set, and it does not have a Makefile.am, then - # we check for these files there as well. - my $check_aux = 0; - my $auxdir = ''; - if ($relative_dir eq '.' - && $config_aux_dir_set_in_configure_in) - { - ($auxdir = $config_aux_dir) =~ s,^\$\(top_srcdir\)/,,; - if (! &is_make_dir ($auxdir)) - { - $check_aux = 1; - } - } - foreach my $cfile (@common_files) - { - if (-f ($relative_dir . "/" . $cfile) - # The file might be absent, but if it can be built it's ok. - || exists $targets{$cfile}) - { - &push_dist_common ($cfile); - } - - # Don't use `elsif' here because a file might meaningfully - # appear in both directories. - if ($check_aux && -f ($auxdir . '/' . $cfile)) - { - &push_dist_common ($auxdir . '/' . $cfile); - } - } - - # We might copy elements from $configure_dist_common to - # %dist_common if we think we need to. If the file appears in our - # directory, we would have discovered it already, so we don't - # check that. But if the file is in a subdir without a Makefile, - # we want to distribute it here if we are doing `.'. Ugly! - if ($relative_dir eq '.') - { - foreach my $file (split (' ' , $configure_dist_common)) - { - push_dist_common ($file) - unless is_make_dir (dirname ($file)); - } - } - - - - # Files to distributed. Don't use &variable_value_as_list_recursive - # as it recursively expands `$(dist_pkgdata_DATA)' etc. - check_variable_defined_unconditionally ('DIST_COMMON'); - my @dist_common = split (' ', variable_value ('DIST_COMMON', 'TRUE')); - @dist_common = uniq (sort for_dist_common (@dist_common)); - pretty_print ('DIST_COMMON = ', "\t", @dist_common); - - # Now that we've processed DIST_COMMON, disallow further attempts - # to set it. - $handle_dist_run = 1; - - # Scan EXTRA_DIST to see if we need to distribute anything from a - # subdir. If so, add it to the list. I didn't want to do this - # originally, but there were so many requests that I finally - # relented. - if (variable_defined ('EXTRA_DIST')) - { - # FIXME: This should be fixed to work with conditionals. That - # will require only making the entries in %dist_dirs under the - # appropriate condition. This is meaningful if the nature of - # the distribution should depend upon the configure options - # used. - foreach (&variable_value_as_list_recursive ('EXTRA_DIST', '')) - { - next if /^\@.*\@$/; - next unless s,/+[^/]+$,,; - $dist_dirs{$_} = 1 - unless $_ eq '.'; - } - } - - # We have to check DIST_COMMON for extra directories in case the - # user put a source used in AC_OUTPUT into a subdir. - my $topsrcdir = backname ($relative_dir); - foreach (&variable_value_as_list_recursive ('DIST_COMMON', 'all')) - { - next if /^\@.*\@$/; - s/\$\(top_srcdir\)/$topsrcdir/; - s/\$\(srcdir\)/./; - next unless s,/+[^/]+$,,; - $dist_dirs{$_} = 1 - unless $_ eq '.'; - } - - # Rule to check whether a distribution is viable. - my %transform = ('DISTCHECK-HOOK' => &target_defined ('distcheck-hook'), - 'GETTEXT' => $seen_gettext); - - # Prepend $(distdir) to each directory given. - my %rewritten = map { '$(distdir)/' . "$_" => 1 } keys %dist_dirs; - $transform{'DISTDIRS'} = join (' ', sort keys %rewritten); - - # If we have SUBDIRS, create all dist subdirectories and do - # recursive build. - if (variable_defined ('SUBDIRS')) - { - # If SUBDIRS is conditionally defined, then set DIST_SUBDIRS - # to all possible directories, and use it. If DIST_SUBDIRS is - # defined, just use it. - my $dist_subdir_name; - # Note that we check DIST_SUBDIRS first on purpose. At least - # one project uses so many conditional subdirectories that - # calling variable_conditionally_defined on SUBDIRS will cause - # automake to grow to 150Mb. Sigh. - if (variable_defined ('DIST_SUBDIRS') - || variable_conditionally_defined ('SUBDIRS')) - { - $dist_subdir_name = 'DIST_SUBDIRS'; - if (! variable_defined ('DIST_SUBDIRS')) - { - define_pretty_variable - ('DIST_SUBDIRS', '', - uniq (&variable_value_as_list_recursive ('SUBDIRS', 'all'))); - } - } - else - { - $dist_subdir_name = 'SUBDIRS'; - # We always define this because that is what `distclean' - # wants. - define_pretty_variable ('DIST_SUBDIRS', '', '$(SUBDIRS)'); - } - - $transform{'DIST_SUBDIR_NAME'} = $dist_subdir_name; - } - - # If the target `dist-hook' exists, make sure it is run. This - # allows users to do random weird things to the distribution - # before it is packaged up. - push (@dist_targets, 'dist-hook') - if &target_defined ('dist-hook'); - $transform{'DIST-TARGETS'} = join(' ', @dist_targets); - - # Defining $(DISTDIR). - $transform{'DISTDIR'} = !variable_defined('distdir'); - $transform{'TOP_DISTDIR'} = backname ($relative_dir); - - $output_rules .= &file_contents ('distdir', %transform); -} - - -# Handle subdirectories. -sub handle_subdirs -{ - return - unless variable_defined ('SUBDIRS'); - - my @subdirs = &variable_value_as_list_recursive ('SUBDIRS', 'all'); - my @dsubdirs = (); - @dsubdirs = &variable_value_as_list_recursive ('DIST_SUBDIRS', 'all') - if variable_defined ('DIST_SUBDIRS'); - - # If an `obj/' directory exists, BSD make will enter it before - # reading `Makefile'. Hence the `Makefile' in the current directory - # will not be read. - # - # % cat Makefile - # all: - # echo Hello - # % cat obj/Makefile - # all: - # echo World - # % make # GNU make - # echo Hello - # Hello - # % pmake # BSD make - # echo World - # World - msg_var ('portability', 'SUBDIRS', - "naming a subdirectory `obj' causes troubles with BSD make") - if grep ($_ eq 'obj', @subdirs); - msg_var ('portability', 'DIST_SUBDIRS', - "naming a subdirectory `obj' causes troubles with BSD make") - if grep ($_ eq 'obj', @dsubdirs); - - # Make sure each directory mentioned in SUBDIRS actually exists. - foreach my $dir (@subdirs) - { - # Skip directories substituted by configure. - next if $dir =~ /^\@.*\@$/; - - if (! -d $am_relative_dir . '/' . $dir) - { - err_var ('SUBDIRS', "required directory $am_relative_dir/$dir " - . "does not exist"); - next; - } - - err_var 'SUBDIRS', "directory should not contain `/'" - if $dir =~ /\//; - } - - $output_rules .= &file_contents ('subdirs'); - variable_pretty_output ('RECURSIVE_TARGETS', 'TRUE'); -} - - -# ($REGEN, @DEPENDENCIES) -# &scan_aclocal_m4 -# ---------------- -# If aclocal.m4 creation is automated, return the list of its dependencies. -sub scan_aclocal_m4 -{ - my $regen_aclocal = 0; - - return (0, ()) - unless $relative_dir eq '.'; - - &examine_variable ('CONFIG_STATUS_DEPENDENCIES'); - &examine_variable ('CONFIGURE_DEPENDENCIES'); - - if (-f 'aclocal.m4') - { - &define_variable ("ACLOCAL_M4", '$(top_srcdir)/aclocal.m4'); - &push_dist_common ('aclocal.m4'); - - my $aclocal = new Automake::XFile "< aclocal.m4"; - my $line = $aclocal->getline; - $regen_aclocal = $line =~ 'generated automatically by aclocal'; - } - - my @ac_deps = (); - - if (-f 'acinclude.m4') - { - $regen_aclocal = 1; - push @ac_deps, 'acinclude.m4'; - } - - if (variable_defined ('ACLOCAL_M4_SOURCES')) - { - push (@ac_deps, '$(ACLOCAL_M4_SOURCES)'); - } - elsif (variable_defined ('ACLOCAL_AMFLAGS')) - { - # Scan all -I directories for m4 files. These are our - # dependencies. - my $examine_next = 0; - foreach my $amdir (&variable_value_as_list_recursive ('ACLOCAL_AMFLAGS', '')) - { - if ($examine_next) - { - $examine_next = 0; - if ($amdir !~ /^\// && -d $amdir) - { - foreach my $ac_dep (&my_glob ($amdir . '/*.m4')) - { - $ac_dep =~ s/^\.\/+//; - push (@ac_deps, $ac_dep) - unless $ac_dep eq "aclocal.m4" - || $ac_dep eq "acinclude.m4"; - } - } - } - elsif ($amdir eq '-I') - { - $examine_next = 1; - } - } - } - - # Note that it might be possible that aclocal.m4 doesn't exist but - # should be auto-generated. This case probably isn't very - # important. - - return ($regen_aclocal, @ac_deps); -} - - -# @DEPENDENCY -# &rewrite_inputs_into_dependencies ($ADD_SRCDIR, @INPUTS) -# -------------------------------------------------------- -# Rewrite a list of input files into a form suitable to put on a -# dependency list. The idea is that if an input file has a directory -# part the same as the current directory, then the directory part is -# simply removed. But if the directory part is different, then -# $(top_srcdir) is prepended. Among other things, this is used to -# generate the dependency list for the output files generated by -# AC_OUTPUT. Consider what the dependencies should look like in this -# case: -# AC_OUTPUT(src/out:src/in1:lib/in2) -# The first argument, ADD_SRCDIR, is 1 if $(top_srcdir) should be added. -# If 0 then files that require this addition will simply be ignored. -sub rewrite_inputs_into_dependencies ($@) -{ - my ($add_srcdir, @inputs) = @_; - my @newinputs; - - foreach my $single (@inputs) - { - if (dirname ($single) eq $relative_dir) - { - push (@newinputs, basename ($single)); - } - elsif ($add_srcdir) - { - push (@newinputs, '$(top_srcdir)/' . $single); - } - } - - return @newinputs; -} - -# Handle remaking and configure stuff. -# We need the name of the input file, to do proper remaking rules. -sub handle_configure -{ - my ($local, $input, @secondary_inputs) = @_; - - my $input_base = basename ($input); - my $local_base = basename ($local); - - my $amfile = $input_base . '.am'; - # We know we can always add '.in' because it really should be an - # error if the .in was missing originally. - my $infile = '$(srcdir)/' . $input_base . '.in'; - my $colon_infile = ''; - if ($local ne $input || @secondary_inputs) - { - $colon_infile = ':' . $input . '.in'; - } - $colon_infile .= ':' . join (':', @secondary_inputs) - if @secondary_inputs; - - my @rewritten = rewrite_inputs_into_dependencies (1, @secondary_inputs); - - my ($regen_aclocal_m4, @aclocal_m4_deps) = scan_aclocal_m4 (); - - $output_rules .= - &file_contents ('configure', - ('MAKEFILE' - => $local_base, - 'MAKEFILE-DEPS' - => "@rewritten", - 'CONFIG-MAKEFILE' - => ((($relative_dir eq '.') ? '$@' : '$(subdir)/$@') - . $colon_infile), - 'MAKEFILE-IN' - => $infile, - 'MAKEFILE-IN-DEPS' - => "@include_stack", - 'MAKEFILE-AM' - => $amfile, - 'STRICTNESS' - => $cygnus_mode ? 'cygnus' : $strictness_name, - 'USE-DEPS' - => $cmdline_use_dependencies ? '' : ' --ignore-deps', - 'MAKEFILE-AM-SOURCES' - => "$input$colon_infile", - 'REGEN-ACLOCAL-M4' - => $regen_aclocal_m4, - 'ACLOCAL_M4_DEPS' - => "@aclocal_m4_deps")); - - if ($relative_dir eq '.') - { - &push_dist_common ('acconfig.h') - if -f 'acconfig.h'; - } - - # If we have a configure header, require it. - my $hdr_index = 0; - my @distclean_config; - foreach my $spec (@config_headers) - { - $hdr_index += 1; - # $CONFIG_H_PATH: config.h from top level. - my ($config_h_path, @ins) = split_config_file_spec ($spec); - my $config_h_dir = dirname ($config_h_path); - - # If the header is in the current directory we want to build - # the header here. Otherwise, if we're at the topmost - # directory and the header's directory doesn't have a - # Makefile, then we also want to build the header. - if ($relative_dir eq $config_h_dir - || ($relative_dir eq '.' && ! &is_make_dir ($config_h_dir))) - { - my ($cn_sans_dir, $stamp_dir); - if ($relative_dir eq $config_h_dir) - { - $cn_sans_dir = basename ($config_h_path); - $stamp_dir = ''; - } - else - { - $cn_sans_dir = $config_h_path; - if ($config_h_dir eq '.') - { - $stamp_dir = ''; - } - else - { - $stamp_dir = $config_h_dir . '/'; - } - } - - # Compute relative path from directory holding output - # header to directory holding input header. FIXME: - # doesn't handle case where we have multiple inputs. - my $in0_sans_dir; - if (dirname ($ins[0]) eq $relative_dir) - { - $in0_sans_dir = basename ($ins[0]); - } - else - { - $in0_sans_dir = backname ($relative_dir) . '/' . $ins[0]; - } - - require_file ($config_header_location, FOREIGN, $in0_sans_dir); - - # Header defined and in this directory. - my @files; - if (-f $config_h_path . '.top') - { - push (@files, "$cn_sans_dir.top"); - } - if (-f $config_h_path . '.bot') - { - push (@files, "$cn_sans_dir.bot"); - } - - push_dist_common (@files); - - # For now, acconfig.h can only appear in the top srcdir. - if (-f 'acconfig.h') - { - push (@files, '$(top_srcdir)/acconfig.h'); - } - - my $stamp = "${stamp_dir}stamp-h${hdr_index}"; - $output_rules .= - file_contents ('remake-hdr', - ('FILES' => "@files", - 'CONFIG_H' => $cn_sans_dir, - 'CONFIG_HIN' => $in0_sans_dir, - 'CONFIG_H_PATH' => $config_h_path, - 'STAMP' => "$stamp")); - - push @distclean_config, $cn_sans_dir, $stamp; - } - } - - $output_rules .= file_contents ('clean-hdr', - ('FILES' => "@distclean_config")) - if @distclean_config; - - # Set location of mkinstalldirs. - define_variable ('mkinstalldirs', - ('$(SHELL) ' . $config_aux_dir . '/mkinstalldirs')); - - reject_var ('CONFIG_HEADER', - "`CONFIG_HEADER' is an anachronism; now determined " - . "automatically\nfrom `$configure_ac'"); - - my @config_h; - foreach my $spec (@config_headers) - { - my ($out, @ins) = split_config_file_spec ($spec); - # Generate CONFIG_HEADER define. - if ($relative_dir eq dirname ($out)) - { - push @config_h, basename ($out); - } - else - { - push @config_h, "\$(top_builddir)/$out"; - } - } - define_variable ("CONFIG_HEADER", "@config_h") - if @config_h; - - # Now look for other files in this directory which must be remade - # by config.status, and generate rules for them. - my @actual_other_files = (); - foreach my $lfile (@other_input_files) - { - my $file; - my @inputs; - if ($lfile =~ /^([^:]*):(.*)$/) - { - # This is the ":" syntax of AC_OUTPUT. - $file = $1; - @inputs = split (':', $2); - } - else - { - # Normal usage. - $file = $lfile; - @inputs = $file . '.in'; - } - - # Automake files should not be stored in here, but in %MAKE_LIST. - prog_error "$lfile in \@other_input_files" - if -f $file . '.am'; - - my $local = basename ($file); - - # Make sure the dist directory for each input file is created. - # We only have to do this at the topmost level though. This - # is a bit ugly but it easier than spreading out the logic, - # especially in cases like AC_OUTPUT(foo/out:bar/in), where - # there is no Makefile in bar/. - if ($relative_dir eq '.') - { - foreach (@inputs) - { - $dist_dirs{dirname ($_)} = 1; - } - } - - # We skip files that aren't in this directory. However, if - # the file's directory does not have a Makefile, and we are - # currently doing `.', then we create a rule to rebuild the - # file in the subdir. - my $fd = dirname ($file); - if ($fd ne $relative_dir) - { - if ($relative_dir eq '.' && ! &is_make_dir ($fd)) - { - $local = $file; - } - else - { - next; - } - } - - my @rewritten_inputs = rewrite_inputs_into_dependencies (1, @inputs); - $output_rules .= ($local . ': ' - . '$(top_builddir)/config.status ' - . "@rewritten_inputs\n" - . "\t" - . 'cd $(top_builddir) && ' - . '$(SHELL) ./config.status ' - . ($relative_dir eq '.' ? '' : '$(subdir)/') - . '$@' - . "\n"); - push (@actual_other_files, $local); - - # Require all input files. - require_file ($ac_config_files_location, FOREIGN, - rewrite_inputs_into_dependencies (0, @inputs)); - } - - # These files get removed by "make clean". - define_pretty_variable ('CONFIG_CLEAN_FILES', '', @actual_other_files); -} - -# Handle C headers. -sub handle_headers -{ - my @r = &am_install_var ('-defaultdist', 'header', 'HEADERS', 'include', - 'oldinclude', 'pkginclude', - 'noinst', 'check'); - foreach (@r) - { - next unless /\..*$/; - &saw_extension ($&); - } -} - -sub handle_gettext -{ - return if ! $seen_gettext || $relative_dir ne '.'; - - if (! variable_defined ('SUBDIRS')) - { - err_ac "AM_GNU_GETTEXT used but SUBDIRS not defined"; - return; - } - - my @subdirs = &variable_value_as_list_recursive ('SUBDIRS', 'all'); - err_var 'SUBDIRS', "AM_GNU_GETTEXT used but `po' not in SUBDIRS" - if ! grep ($_ eq 'po', @subdirs); - # intl/ is not required when AM_GNU_GETTEXT is called with - # the `external' option. - err_var 'SUBDIRS', "AM_GNU_GETTEXT used but `intl' not in SUBDIRS" - if (! $seen_gettext_external - && ! grep ($_ eq 'intl', @subdirs)); - - require_file ($ac_gettext_location, GNU, 'ABOUT-NLS'); -} - -# Handle footer elements. -sub handle_footer -{ - # NOTE don't use define_pretty_variable here, because - # $contents{...} is already defined. - $output_vars .= 'SOURCES = ' . variable_value ('SOURCES') . "\n\n" - if variable_value ('SOURCES'); - - reject_target ('.SUFFIXES', - "use variable `SUFFIXES', not target `.SUFFIXES'"); - - # Note: AIX 4.1 /bin/make will fail if any suffix rule appears - # before .SUFFIXES. So we make sure that .SUFFIXES appears before - # anything else, by sticking it right after the default: target. - $output_header .= ".SUFFIXES:\n"; - if (@suffixes || variable_defined ('SUFFIXES')) - { - # Make sure suffixes has unique elements. Sort them to ensure - # the output remains consistent. However, $(SUFFIXES) is - # always at the start of the list, unsorted. This is done - # because make will choose rules depending on the ordering of - # suffixes, and this lets the user have some control. Push - # actual suffixes, and not $(SUFFIXES). Some versions of make - # do not like variable substitutions on the .SUFFIXES line. - my @user_suffixes = (variable_defined ('SUFFIXES') - ? &variable_value_as_list_recursive ('SUFFIXES', '') - : ()); - - my %suffixes = map { $_ => 1 } @suffixes; - delete @suffixes{@user_suffixes}; - - $output_header .= (".SUFFIXES: " - . join (' ', @user_suffixes, sort keys %suffixes) - . "\n"); - } - - $output_trailer .= file_contents ('footer'); -} - -# Deal with installdirs target. -sub handle_installdirs () -{ - $output_rules .= - &file_contents ('install', - ('am__installdirs' - => variable_value ('am__installdirs') || '', - 'installdirs-local' - => (target_defined ('installdirs-local') - ? ' installdirs-local' : ''))); -} - - -# Deal with all and all-am. -sub handle_all ($) -{ - my ($makefile) = @_; - - # Output `all-am'. - - # Put this at the beginning for the sake of non-GNU makes. This - # is still wrong if these makes can run parallel jobs. But it is - # right enough. - unshift (@all, basename ($makefile)); - - foreach my $spec (@config_headers) - { - my ($out, @ins) = split_config_file_spec ($spec); - push (@all, basename ($out)) - if dirname ($out) eq $relative_dir; - } - - # Install `all' hooks. - if (&target_defined ("all-local")) - { - push (@all, "all-local"); - &depend ('.PHONY', "all-local"); - } - - &pretty_print_rule ("all-am:", "\t\t", @all); - &depend ('.PHONY', 'all-am', 'all'); - - - # Output `all'. - - my @local_headers = (); - push @local_headers, '$(BUILT_SOURCES)' - if variable_defined ('BUILT_SOURCES'); - foreach my $spec (@config_headers) - { - my ($out, @ins) = split_config_file_spec ($spec); - push @local_headers, basename ($out) - if dirname ($out) eq $relative_dir; - } - - if (@local_headers) - { - # We need to make sure config.h is built before we recurse. - # We also want to make sure that built sources are built - # before any ordinary `all' targets are run. We can't do this - # by changing the order of dependencies to the "all" because - # that breaks when using parallel makes. Instead we handle - # things explicitly. - $output_all .= ("all: @local_headers" - . "\n\t" - . '$(MAKE) $(AM_MAKEFLAGS) ' - . (variable_defined ('SUBDIRS') - ? 'all-recursive' : 'all-am') - . "\n\n"); - } - else - { - $output_all .= "all: " . (variable_defined ('SUBDIRS') - ? 'all-recursive' : 'all-am') . "\n\n"; - } -} - - -# Handle check merge target specially. -sub do_check_merge_target -{ - if (&target_defined ('check-local')) - { - # User defined local form of target. So include it. - push (@check_tests, 'check-local'); - &depend ('.PHONY', 'check-local'); - } - - # In --cygnus mode, check doesn't depend on all. - if ($cygnus_mode) - { - # Just run the local check rules. - &pretty_print_rule ('check-am:', "\t\t", @check); - } - else - { - # The check target must depend on the local equivalent of - # `all', to ensure all the primary targets are built. Then it - # must build the local check rules. - $output_rules .= "check-am: all-am\n"; - &pretty_print_rule ("\t\$(MAKE) \$(AM_MAKEFLAGS)", "\t ", - @check) - if @check; - } - &pretty_print_rule ("\t\$(MAKE) \$(AM_MAKEFLAGS)", "\t ", - @check_tests) - if @check_tests; - - &depend ('.PHONY', 'check', 'check-am'); - $output_rules .= ("check: " - . (variable_defined ('SUBDIRS') - ? 'check-recursive' : 'check-am') - . "\n"); -} - -# Handle all 'clean' targets. -sub handle_clean -{ - # Clean the files listed in user variables if they exist. - $clean_files{'$(MOSTLYCLEANFILES)'} = MOSTLY_CLEAN - if variable_defined ('MOSTLYCLEANFILES'); - $clean_files{'$(CLEANFILES)'} = CLEAN - if variable_defined ('CLEANFILES'); - $clean_files{'$(DISTCLEANFILES)'} = DIST_CLEAN - if variable_defined ('DISTCLEANFILES'); - $clean_files{'$(MAINTAINERCLEANFILES)'} = MAINTAINER_CLEAN - if variable_defined ('MAINTAINERCLEANFILES'); - - # Built sources are automatically removed by maintainer-clean. - $clean_files{'$(BUILT_SOURCES)'} = MAINTAINER_CLEAN - if variable_defined ('BUILT_SOURCES'); - - # Compute a list of "rm"s to run for each target. - my %rms = (MOSTLY_CLEAN, [], - CLEAN, [], - DIST_CLEAN, [], - MAINTAINER_CLEAN, []); - - foreach my $file (keys %clean_files) - { - my $when = $clean_files{$file}; - prog_error 'invalid entry in %clean_files' - unless exists $rms{$when}; - - my $rm = "rm -f $file"; - # If file is a variable, make sure when don't call `rm -f' without args. - $rm ="test -z \"$file\" || $rm" - if ($file =~ /^\s*\$(\(.*\)|\{.*\})\s*$/); - - push @{$rms{$when}}, "\t-$rm\n"; - } - - $output_rules .= &file_contents - ('clean', - MOSTLYCLEAN_RMS => join ('', @{$rms{&MOSTLY_CLEAN}}), - CLEAN_RMS => join ('', @{$rms{&CLEAN}}), - DISTCLEAN_RMS => join ('', @{$rms{&DIST_CLEAN}}), - MAINTAINER_CLEAN_RMS => join ('', @{$rms{&MAINTAINER_CLEAN}})); -} - - -# &depend ($CATEGORY, @DEPENDENDEES) -# ---------------------------------- -# The target $CATEGORY depends on @DEPENDENDEES. -sub depend -{ - my ($category, @dependendees) = @_; - { - push (@{$dependencies{$category}}, @dependendees); - } -} - - -# &target_cmp ($A, $B) -# -------------------- -# Subroutine for &handle_factored_dependencies to let `.PHONY' be last. -sub target_cmp -{ - return 0 - if $a eq $b; - return -1 - if $b eq '.PHONY'; - return 1 - if $a eq '.PHONY'; - return $a cmp $b; -} - - -# &handle_factored_dependencies () -# -------------------------------- -# Handle everything related to gathered targets. -sub handle_factored_dependencies -{ - # Reject bad hooks. - foreach my $utarg ('uninstall-data-local', 'uninstall-data-hook', - 'uninstall-exec-local', 'uninstall-exec-hook') - { - my $x = $utarg; - $x =~ s/(data|exec)-//; - reject_target ($utarg, "use `$x', not `$utarg'"); - } - - reject_target ('install-local', - "use `install-data-local' or `install-exec-local', " - . "not `install-local'"); - - reject_target ('install-info-local', - "`install-info-local' target defined but " - . "`no-installinfo' option not in use") - unless defined $options{'no-installinfo'}; - - # Install the -local hooks. - foreach (keys %dependencies) - { - # Hooks are installed on the -am targets. - s/-am$// or next; - if (&target_defined ("$_-local")) - { - depend ("$_-am", "$_-local"); - &depend ('.PHONY', "$_-local"); - } - } - - # Install the -hook hooks. - # FIXME: Why not be as liberal as we are with -local hooks? - foreach ('install-exec', 'install-data', 'uninstall') - { - if (&target_defined ("$_-hook")) - { - $actions{"$_-am"} .= - ("\t\@\$(NORMAL_INSTALL)\n" - . "\t" . '$(MAKE) $(AM_MAKEFLAGS) ' . "$_-hook\n"); - } - } - - # All the required targets are phony. - depend ('.PHONY', keys %required_targets); - - # Actually output gathered targets. - foreach (sort target_cmp keys %dependencies) - { - # If there is nothing about this guy, skip it. - next - unless (@{$dependencies{$_}} - || $actions{$_} - || $required_targets{$_}); - &pretty_print_rule ("$_:", "\t", - uniq (sort @{$dependencies{$_}})); - $output_rules .= $actions{$_} - if defined $actions{$_}; - $output_rules .= "\n"; - } -} - - -# &handle_tests_dejagnu () -# ------------------------ -sub handle_tests_dejagnu -{ - push (@check_tests, 'check-DEJAGNU'); - $output_rules .= file_contents ('dejagnu'); -} - - -# Handle TESTS variable and other checks. -sub handle_tests -{ - if (defined $options{'dejagnu'}) - { - &handle_tests_dejagnu; - } - else - { - foreach my $c ('DEJATOOL', 'RUNTEST', 'RUNTESTFLAGS') - { - reject_var ($c, "`$c' defined but `dejagnu' not in " - . "`AUTOMAKE_OPTIONS'"); - } - } - - if (variable_defined ('TESTS')) - { - push (@check_tests, 'check-TESTS'); - $output_rules .= &file_contents ('check'); - } -} - -# Handle Emacs Lisp. -sub handle_emacs_lisp -{ - my @elfiles = &am_install_var ('-candist', 'lisp', 'LISP', - 'lisp', 'noinst'); - - return if ! @elfiles; - - # Generate .elc files. - my @elcfiles = map { $_ . 'c' } @elfiles; - define_pretty_variable ('ELCFILES', '', @elcfiles); - - push (@all, '$(ELCFILES)'); - - require_variables ("$am_file.am", "Emacs Lisp sources seen", 'TRUE', - 'EMACS', 'lispdir'); - require_conf_file ("$am_file.am", FOREIGN, 'elisp-comp'); - &define_variable ('elisp_comp', $config_aux_dir . '/elisp-comp'); -} - -# Handle Python -sub handle_python -{ - my @pyfiles = &am_install_var ('-defaultdist', 'python', 'PYTHON', - 'noinst'); - return if ! @pyfiles; - - require_variables ("$am_file.am", "Python sources seen", 'TRUE', - 'PYTHON'); - require_conf_file ("$am_file.am", FOREIGN, 'py-compile'); - &define_variable ('py_compile', $config_aux_dir . '/py-compile'); -} - -# Handle Java. -sub handle_java -{ - my @sourcelist = &am_install_var ('-candist', - 'java', 'JAVA', - 'java', 'noinst', 'check'); - return if ! @sourcelist; - - my @prefix = am_primary_prefixes ('JAVA', 1, - 'java', 'noinst', 'check'); - - my $dir; - foreach my $curs (@prefix) - { - next - if $curs eq 'EXTRA'; - - err_var "${curs}_JAVA", "multiple _JAVA primaries in use" - if defined $dir; - $dir = $curs; - } - - - push (@all, 'class' . $dir . '.stamp'); -} - - -# Handle some of the minor options. -sub handle_minor_options -{ - if (defined $options{'readme-alpha'}) - { - if ($relative_dir eq '.') - { - if ($package_version !~ /^$GNITS_VERSION_PATTERN$/) - { - msg ('error-gnits', $package_version_location, - "version `$package_version' doesn't follow " . - "Gnits standards"); - } - if (defined $1 && -f 'README-alpha') - { - # This means we have an alpha release. See - # GNITS_VERSION_PATTERN for details. - require_file_with_macro ('TRUE', 'AUTOMAKE_OPTIONS', - FOREIGN, 'README-alpha'); - } - } - } -} - -################################################################ - -# ($OUTPUT, @INPUTS) -# &split_config_file_spec ($SPEC) -# ------------------------------- -# Decode the Autoconf syntax for config files (files, headers, links -# etc.). -sub split_config_file_spec ($) -{ - my ($spec) = @_; - my ($output, @inputs) = split (/:/, $spec); - - push @inputs, "$output.in" - unless @inputs; - - return ($output, @inputs); -} - - -my %make_list; - -# &scan_autoconf_config_files ($CONFIG-FILES) -# ------------------------------------------- -# Study $CONFIG-FILES which is the first argument to AC_CONFIG_FILES -# (or AC_OUTPUT). -sub scan_autoconf_config_files -{ - my ($config_files) = @_; - # Look at potential Makefile.am's. - foreach (split ' ', $config_files) - { - # Must skip empty string for Perl 4. - next if $_ eq "\\" || $_ eq ''; - - # Handle $local:$input syntax. Note that we ignore - # every input file past the first, though we keep - # those around for later. - my ($local, $input, @rest) = split (/:/); - if (! $input) - { - $input = $local; - } - else - { - # FIXME: should be error if .in is missing. - $input =~ s/\.in$//; - } - - if (-f $input . '.am') - { - # We have a file that automake should generate. - $make_list{$input} = join (':', ($local, @rest)); - } - else - { - # We have a file that automake should cause to be - # rebuilt, but shouldn't generate itself. - push (@other_input_files, $_); - } - } -} - - -# &scan_autoconf_traces ($FILENAME) -# --------------------------------- -sub scan_autoconf_traces ($) -{ - my ($filename) = @_; - - my @traced = qw(AC_CANONICAL_HOST - AC_CANONICAL_SYSTEM - AC_CONFIG_AUX_DIR - AC_CONFIG_FILES - AC_CONFIG_HEADERS - AC_INIT - AC_LIBSOURCE - AC_SUBST - AM_AUTOMAKE_VERSION - AM_CONDITIONAL - AM_GNU_GETTEXT - AM_INIT_AUTOMAKE - AM_MAINTAINER_MODE - AM_PROG_CC_C_O); - - my $traces = ($ENV{AUTOCONF} || 'autoconf') . " "; - - # Use a separator unlikely to be used, not `:', the default, which - # has a precise meaning for AC_CONFIG_FILES and so on. - $traces .= join (' ', - map { "--trace=$_" . ':\$f:\$l::\$n::\${::}%' } @traced); - - my $tracefh = new Automake::XFile ("$traces $filename |"); - verb "reading $traces"; - - while ($_ = $tracefh->getline) - { - chomp; - my ($here, @args) = split /::/; - my $macro = $args[0]; - - # Alphabetical ordering please. - if ($macro eq 'AC_CANONICAL_HOST') - { - if (! $seen_canonical) - { - $seen_canonical = AC_CANONICAL_HOST; - $canonical_location = $here; - }; - } - elsif ($macro eq 'AC_CANONICAL_SYSTEM') - { - $seen_canonical = AC_CANONICAL_SYSTEM; - $canonical_location = $here; - } - elsif ($macro eq 'AC_CONFIG_AUX_DIR') - { - @config_aux_path = $args[1]; - $config_aux_dir_set_in_configure_in = 1; - } - elsif ($macro eq 'AC_CONFIG_FILES') - { - # Look at potential Makefile.am's. - $ac_config_files_location = $here; - &scan_autoconf_config_files ($args[1]); - } - elsif ($macro eq 'AC_CONFIG_HEADERS') - { - $config_header_location = $here; - push @config_headers, split (' ', $args[1]); - } - elsif ($macro eq 'AC_INIT') - { - if (defined $args[2]) - { - $package_version = $args[2]; - $package_version_location = $here; - } - } - elsif ($macro eq 'AC_LIBSOURCE') - { - $libsources{$args[1]} = $here; - } - elsif ($macro eq 'AC_SUBST') - { - # Just check for alphanumeric in AC_SUBST. If you do - # AC_SUBST(5), then too bad. - $configure_vars{$args[1]} = $here - if $args[1] =~ /^\w+$/; - } - elsif ($macro eq 'AM_AUTOMAKE_VERSION') - { - err ($here, - "version mismatch. This is Automake $VERSION,\n" . - "but the definition used by this AM_INIT_AUTOMAKE\n" . - "comes from Automake $args[1]. You should recreate\n" . - "aclocal.m4 with aclocal and run automake again.\n") - if ($VERSION ne $args[1]); - - $seen_automake_version = 1; - } - elsif ($macro eq 'AM_CONDITIONAL') - { - $configure_cond{$args[1]} = $here; - } - elsif ($macro eq 'AM_GNU_GETTEXT') - { - $seen_gettext = $here; - $ac_gettext_location = $here; - $seen_gettext_external = grep ($_ eq 'external', @args); - } - elsif ($macro eq 'AM_INIT_AUTOMAKE') - { - $seen_init_automake = $here; - if (defined $args[2]) - { - $package_version = $args[2]; - $package_version_location = $here; - } - elsif (defined $args[1]) - { - $global_options = $args[1]; - } - } - elsif ($macro eq 'AM_MAINTAINER_MODE') - { - $seen_maint_mode = $here; - } - elsif ($macro eq 'AM_PROG_CC_C_O') - { - $seen_cc_c_o = $here; - } - } -} - - -# &scan_autoconf_files () -# ----------------------- -# Check whether we use `configure.ac' or `configure.in'. -# Scan it (and possibly `aclocal.m4') for interesting things. -# We must scan aclocal.m4 because there might be AC_SUBSTs and such there. -sub scan_autoconf_files -{ - # Reinitialize libsources here. This isn't really necessary, - # since we currently assume there is only one configure.ac. But - # that won't always be the case. - %libsources = (); - - $configure_ac = find_configure_ac; - fatal "`configure.ac' or `configure.in' is required\n" - if !$configure_ac; - - scan_autoconf_traces ($configure_ac); - - # Set input and output files if not specified by user. - if (! @input_files) - { - @input_files = sort keys %make_list; - %output_files = %make_list; - } - - @configure_input_files = sort keys %make_list; - - err_ac "`AM_INIT_AUTOMAKE' must be used" - if ! $seen_init_automake; - - if (! $seen_automake_version) - { - if (-f 'aclocal.m4') - { - err ($seen_init_automake || $me, - "your implementation of AM_INIT_AUTOMAKE comes from " . - "an\nold Automake version. You should recreate " . - "aclocal.m4\nwith aclocal and run automake again.\n"); - } - else - { - err ($seen_init_automake || $me, - "no proper implementation of AM_INIT_AUTOMAKE was " . - "found,\nprobably because aclocal.m4 is missing...\n" . - "You should run aclocal to create this file, then\n" . - "run automake again.\n"); - } - } - - # Look for some files we need. Always check for these. This - # check must be done for every run, even those where we are only - # looking at a subdir Makefile. We must set relative_dir so that - # the file-finding machinery works. - # FIXME: Is this broken because it needs dynamic scopes. - # My tests seems to show it's not the case. - $relative_dir = '.'; - require_conf_file ($configure_ac, FOREIGN, - 'install-sh', 'mkinstalldirs', 'missing'); - err_am "`install.sh' is an anachronism; use `install-sh' instead" - if -f $config_aux_path[0] . '/install.sh'; - - # Preserve dist_common for later. - $configure_dist_common = variable_value ('DIST_COMMON', 'TRUE') || ''; -} - -################################################################ - -# Set up for Cygnus mode. -sub check_cygnus -{ - return unless $cygnus_mode; - - &set_strictness ('foreign'); - $options{'no-installinfo'} = 1; - $options{'no-dependencies'} = 1; - $use_dependencies = 0; - - err_ac "`AM_MAINTAINER_MODE' required when --cygnus specified" - if !$seen_maint_mode; -} - -# Do any extra checking for GNU standards. -sub check_gnu_standards -{ - if ($relative_dir eq '.') - { - # In top level (or only) directory. - - # Accept one of these three licenses; default to COPYING. - my $license = 'COPYING'; - foreach (qw /COPYING.LIB COPYING.LESSER/) - { - $license = $_ if -f $_; - } - require_file ("$am_file.am", GNU, $license, - qw/INSTALL NEWS README AUTHORS ChangeLog/); - } - - for my $opt ('no-installman', 'no-installinfo') - { - msg_var ('error-gnu', 'AUTOMAKE_OPTIONS', - "option `$opt' disallowed by GNU standards") - if (defined $options{$opt}); - } -} - -# Do any extra checking for GNITS standards. -sub check_gnits_standards -{ - if ($relative_dir eq '.') - { - # In top level (or only) directory. - require_file ("$am_file.am", GNITS, 'THANKS'); - } -} - -################################################################ -# -# Functions to handle files of each language. - -# Each `lang_X_rewrite($DIRECTORY, $BASE, $EXT)' function follows a -# simple formula: Return value is LANG_SUBDIR if the resulting object -# file should be in a subdir if the source file is, LANG_PROCESS if -# file is to be dealt with, LANG_IGNORE otherwise. - -# Much of the actual processing is handled in -# handle_single_transform_list. These functions exist so that -# auxiliary information can be recorded for a later cleanup pass. -# Note that the calls to these functions are computed, so don't bother -# searching for their precise names in the source. - -# This is just a convenience function that can be used to determine -# when a subdir object should be used. -sub lang_sub_obj -{ - return defined $options{'subdir-objects'} ? LANG_SUBDIR : LANG_PROCESS; -} - -# Rewrite a single C source file. -sub lang_c_rewrite -{ - my ($directory, $base, $ext) = @_; - - if (defined $options{'ansi2knr'} && $base =~ /_$/) - { - # FIXME: include line number in error. - err_am "C source file `$base.c' would be deleted by ansi2knr rules"; - } - - my $r = LANG_PROCESS; - if (defined $options{'subdir-objects'}) - { - $r = LANG_SUBDIR; - $base = $directory . '/' . $base - unless $directory eq '.' || $directory eq ''; - - err_am ("C objects in subdir but `AM_PROG_CC_C_O' " - . "not in `$configure_ac'", - uniq_scope => US_GLOBAL) - unless $seen_cc_c_o; - - require_conf_file ("$am_file.am", FOREIGN, 'compile'); - - # In this case we already have the directory information, so - # don't add it again. - $de_ansi_files{$base} = ''; - } - else - { - $de_ansi_files{$base} = (($directory eq '.' || $directory eq '') - ? '' - : "$directory/"); - } - - return $r; -} - -# Rewrite a single C++ source file. -sub lang_cxx_rewrite -{ - return &lang_sub_obj; -} - -# Rewrite a single header file. -sub lang_header_rewrite -{ - # Header files are simply ignored. - return LANG_IGNORE; -} - -# Rewrite a single yacc file. -sub lang_yacc_rewrite -{ - my ($directory, $base, $ext) = @_; - - my $r = &lang_sub_obj; - (my $newext = $ext) =~ tr/y/c/; - return ($r, $newext); -} - -# Rewrite a single yacc++ file. -sub lang_yaccxx_rewrite -{ - my ($directory, $base, $ext) = @_; - - my $r = &lang_sub_obj; - (my $newext = $ext) =~ tr/y/c/; - return ($r, $newext); -} - -# Rewrite a single lex file. -sub lang_lex_rewrite -{ - my ($directory, $base, $ext) = @_; - - my $r = &lang_sub_obj; - (my $newext = $ext) =~ tr/l/c/; - return ($r, $newext); -} - -# Rewrite a single lex++ file. -sub lang_lexxx_rewrite -{ - my ($directory, $base, $ext) = @_; - - my $r = &lang_sub_obj; - (my $newext = $ext) =~ tr/l/c/; - return ($r, $newext); -} - -# Rewrite a single assembly file. -sub lang_asm_rewrite -{ - return &lang_sub_obj; -} - -# Rewrite a single Fortran 77 file. -sub lang_f77_rewrite -{ - return LANG_PROCESS; -} - -# Rewrite a single preprocessed Fortran 77 file. -sub lang_ppf77_rewrite -{ - return LANG_PROCESS; -} - -# Rewrite a single ratfor file. -sub lang_ratfor_rewrite -{ - return LANG_PROCESS; -} - -# Rewrite a single Objective C file. -sub lang_objc_rewrite -{ - return &lang_sub_obj; -} - -# Rewrite a single Java file. -sub lang_java_rewrite -{ - return LANG_SUBDIR; -} - -# The lang_X_finish functions are called after all source file -# processing is done. Each should handle defining rules for the -# language, etc. A finish function is only called if a source file of -# the appropriate type has been seen. - -sub lang_c_finish -{ - # Push all libobjs files onto de_ansi_files. We actually only - # push files which exist in the current directory, and which are - # genuine source files. - foreach my $file (keys %libsources) - { - if ($file =~ /^(.*)\.[cly]$/ && -f "$relative_dir/$file") - { - $de_ansi_files{$1} = (($relative_dir eq '.' || $relative_dir eq '') - ? '' - : "$relative_dir/"); - } - } - - if (defined $options{'ansi2knr'} && keys %de_ansi_files) - { - # Make all _.c files depend on their corresponding .c files. - my @objects; - foreach my $base (sort keys %de_ansi_files) - { - # Each _.c file must depend on ansi2knr; otherwise it - # might be used in a parallel build before it is built. - # We need to support files in the srcdir and in the build - # dir (because these files might be auto-generated. But - # we can't use $< -- some makes only define $< during a - # suffix rule. - my $ansfile = $de_ansi_files{$base} . $base . '.c'; - $output_rules .= ($base . "_.c: $ansfile \$(ANSI2KNR)\n\t" - . '$(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) ' - . '`if test -f $(srcdir)/' . $ansfile - . '; then echo $(srcdir)/' . $ansfile - . '; else echo ' . $ansfile . '; fi` ' - . "| sed 's/^# \\([0-9]\\)/#line \\1/' " - . '| $(ANSI2KNR) > ' . $base . "_.c" - # If ansi2knr fails then we shouldn't - # create the _.c file - . " || rm -f ${base}_.c\n"); - push (@objects, $base . '_.$(OBJEXT)'); - push (@objects, $base . '_.lo') - if variable_defined ('LIBTOOL'); - } - - # Make all _.o (and _.lo) files depend on ansi2knr. - # Use a sneaky little hack to make it print nicely. - &pretty_print_rule ('', '', @objects, ':', '$(ANSI2KNR)'); - } -} - -# This is a yacc helper which is called whenever we have decided to -# compile a yacc file. -sub lang_yacc_target_hook -{ - my ($self, $aggregate, $output, $input) = @_; - - my $flag = $aggregate . "_YFLAGS"; - if ((variable_defined ($flag) - && &variable_value ($flag) =~ /$DASH_D_PATTERN/o) - || (variable_defined ('YFLAGS') - && &variable_value ('YFLAGS') =~ /$DASH_D_PATTERN/o)) - { - (my $output_base = $output) =~ s/$KNOWN_EXTENSIONS_PATTERN$//; - my $header = $output_base . '.h'; - - # Found a `-d' that applies to the compilation of this file. - # Add a dependency for the generated header file, and arrange - # for that file to be included in the distribution. - # FIXME: this fails for `nodist_*_SOURCES'. - $output_rules .= ("${header}: $output\n" - # Recover from removal of $header - . "\t\@if test ! -f \$@; then \\\n" - . "\t rm -f $output; \\\n" - . "\t \$(MAKE) $output; \\\n" - . "\telse :; fi\n"); - &push_dist_common ($header); - # If the files are built in the build directory, then we want - # to remove them with `make clean'. If they are in srcdir - # they shouldn't be touched. However, we can't determine this - # statically, and the GNU rules say that yacc/lex output files - # should be removed by maintainer-clean. So that's what we - # do. - $clean_files{$header} = MAINTAINER_CLEAN; - } - # Erase $OUTPUT on `make maintainer-clean' (by GNU standards). - # See the comment above for $HEADER. - $clean_files{$output} = MAINTAINER_CLEAN; -} - -# This is a lex helper which is called whenever we have decided to -# compile a lex file. -sub lang_lex_target_hook -{ - my ($self, $aggregate, $output, $input) = @_; - # If the files are built in the build directory, then we want to - # remove them with `make clean'. If they are in srcdir they - # shouldn't be touched. However, we can't determine this - # statically, and the GNU rules say that yacc/lex output files - # should be removed by maintainer-clean. So that's what we do. - $clean_files{$output} = MAINTAINER_CLEAN; -} - -# This is a helper for both lex and yacc. -sub yacc_lex_finish_helper -{ - return if defined $language_scratch{'lex-yacc-done'}; - $language_scratch{'lex-yacc-done'} = 1; - - # If there is more than one distinct yacc (resp lex) source file - # in a given directory, then the `ylwrap' program is required to - # allow parallel builds to work correctly. FIXME: for now, no - # line number. - require_conf_file ($configure_ac, FOREIGN, 'ylwrap'); - if ($config_aux_dir_set_in_configure_in) - { - &define_variable ('YLWRAP', $config_aux_dir . "/ylwrap"); - } - else - { - &define_variable ('YLWRAP', '$(top_srcdir)/ylwrap'); - } -} - -sub lang_yacc_finish -{ - return if defined $language_scratch{'yacc-done'}; - $language_scratch{'yacc-done'} = 1; - - reject_var 'YACCFLAGS', "`YACCFLAGS' obsolete; use `YFLAGS' instead"; - - &yacc_lex_finish_helper - if count_files_for_language ('yacc') > 1; -} - - -sub lang_lex_finish -{ - return if defined $language_scratch{'lex-done'}; - $language_scratch{'lex-done'} = 1; - - &yacc_lex_finish_helper - if count_files_for_language ('lex') > 1; -} - - -# Given a hash table of linker names, pick the name that has the most -# precedence. This is lame, but something has to have global -# knowledge in order to eliminate the conflict. Add more linkers as -# required. -sub resolve_linker -{ - my (%linkers) = @_; - - foreach my $l (qw(GCJLINK CXXLINK F77LINK OBJCLINK)) - { - return $l if defined $linkers{$l}; - } - return 'LINK'; -} - -# Called to indicate that an extension was used. -sub saw_extension -{ - my ($ext) = @_; - if (! defined $extension_seen{$ext}) - { - $extension_seen{$ext} = 1; - } - else - { - ++$extension_seen{$ext}; - } -} - -# Return the number of files seen for a given language. Knows about -# special cases we care about. FIXME: this is hideous. We need -# something that involves real language objects. For instance yacc -# and yaccxx could both derive from a common yacc class which would -# know about the strange ylwrap requirement. (Or better yet we could -# just not support legacy yacc!) -sub count_files_for_language -{ - my ($name) = @_; - - my @names; - if ($name eq 'yacc' || $name eq 'yaccxx') - { - @names = ('yacc', 'yaccxx'); - } - elsif ($name eq 'lex' || $name eq 'lexxx') - { - @names = ('lex', 'lexxx'); - } - else - { - @names = ($name); - } - - my $r = 0; - foreach $name (@names) - { - my $lang = $languages{$name}; - foreach my $ext (@{$lang->extensions}) - { - $r += $extension_seen{$ext} - if defined $extension_seen{$ext}; - } - } - - return $r -} - -# Called to ask whether source files have been seen . If HEADERS is 1, -# headers can be included. -sub saw_sources_p -{ - my ($headers) = @_; - - # count all the sources - my $count = 0; - foreach my $val (values %extension_seen) - { - $count += $val; - } - - if (!$headers) - { - $count -= count_files_for_language ('header'); - } - - return $count > 0; -} - - -# register_language (%ATTRIBUTE) -# ------------------------------ -# Register a single language. -# Each %ATTRIBUTE is of the form ATTRIBUTE => VALUE. -sub register_language (%) -{ - my (%option) = @_; - - # Set the defaults. - $option{'ansi'} = 0 - unless defined $option{'ansi'}; - $option{'autodep'} = 'no' - unless defined $option{'autodep'}; - $option{'linker'} = '' - unless defined $option{'linker'}; - $option{'flags'} = [] - unless defined $option{'flags'}; - $option{'output_extensions'} = sub { return ( '.$(OBJEXT)', '.lo' ) } - unless defined $option{'output_extensions'}; - - my $lang = new Language (%option); - - # Fill indexes. - grep ($extension_map{$_} = $lang->name, @{$lang->extensions}); - $languages{$lang->name} = $lang; - - # Update the pattern of known extensions. - accept_extensions (@{$lang->extensions}); - - # Upate the $suffix_rule map. - foreach my $suffix (@{$lang->extensions}) - { - foreach my $dest (&{$lang->output_extensions} ($suffix)) - { - ®ister_suffix_rule ('internal', $suffix, $dest); - } - } -} - -# derive_suffix ($EXT, $OBJ) -# -------------------------- -# This function is used to find a path from a user-specified suffix $EXT -# to $OBJ or to some other suffix we recognize internally, eg `cc'. -sub derive_suffix ($$) -{ - my ($source_ext, $obj) = @_; - - while (! $extension_map{$source_ext} - && $source_ext ne $obj - && exists $suffix_rules->{$source_ext} - && exists $suffix_rules->{$source_ext}{$obj}) - { - $source_ext = $suffix_rules->{$source_ext}{$obj}[0]; - } - - return $source_ext; -} - - -################################################################ - -# Pretty-print something. HEAD is what should be printed at the -# beginning of the first line, FILL is what should be printed at the -# beginning of every subsequent line. -sub pretty_print_internal -{ - my ($head, $fill, @values) = @_; - - my $column = length ($head); - my $result = $head; - - # Fill length is number of characters. However, each Tab - # character counts for eight. So we count the number of Tabs and - # multiply by 7. - my $fill_length = length ($fill); - $fill_length += 7 * ($fill =~ tr/\t/\t/d); - - foreach (@values) - { - # "71" because we also print a space. - if ($column + length ($_) > 71) - { - $result .= " \\\n" . $fill; - $column = $fill_length; - } - $result .= ' ' if $result =~ /\S\z/; - $result .= $_; - $column += length ($_) + 1; - } - - $result .= "\n"; - return $result; -} - -# Pretty-print something and append to output_vars. -sub pretty_print -{ - $output_vars .= &pretty_print_internal (@_); -} - -# Pretty-print something and append to output_rules. -sub pretty_print_rule -{ - $output_rules .= &pretty_print_internal (@_); -} - - -################################################################ - - -# $STRING -# &conditional_string(@COND-STACK) -# -------------------------------- -# Build a string which denotes the conditional in @COND-STACK. Some -# simplifications are done: `TRUE' entries are elided, and any `FALSE' -# entry results in a return of `FALSE'. -sub conditional_string -{ - my (@stack) = @_; - - if (grep (/^FALSE$/, @stack)) - { - return 'FALSE'; - } - else - { - return join (' ', uniq sort grep (!/^TRUE$/, @stack)); - } -} - - -# $BOOLEAN -# &conditional_true_when ($COND, $WHEN) -# ------------------------------------- -# See if a conditional is true. Both arguments are conditional -# strings. This returns true if the first conditional is true when -# the second conditional is true. -# For instance with $COND = `BAR FOO', and $WHEN = `BAR BAZ FOO', -# obviously return 1, and 0 when, for instance, $WHEN = `FOO'. -sub conditional_true_when ($$) -{ - my ($cond, $when) = @_; - - # Make a hash holding all the values from $WHEN. - my %cond_vals = map { $_ => 1 } split (' ', $when); - - # Nothing is true when FALSE (not even FALSE itself, but it - # shouldn't hurt if you decide to change that). - return 0 if exists $cond_vals{'FALSE'}; - - # Check each component of $cond, which looks `COND1 COND2'. - foreach my $comp (split (' ', $cond)) - { - # TRUE is always true. - next if $comp eq 'TRUE'; - return 0 if ! defined $cond_vals{$comp}; - } - - return 1; -} - - -# $BOOLEAN -# &conditional_is_redundant ($COND, @WHENS) -# ---------------------------------------- -# Determine whether $COND is redundant with respect to @WHENS. -# -# Returns true if $COND is true for any of the conditions in @WHENS. -# -# If there are no @WHENS, then behave as if @WHENS contained a single empty -# condition. -sub conditional_is_redundant ($@) -{ - my ($cond, @whens) = @_; - - @whens = ("") if @whens == 0; - - foreach my $when (@whens) - { - return 1 if conditional_true_when ($cond, $when); - } - return 0; -} - - -# $BOOLEAN -# &conditional_implies_any ($COND, @CONDS) -# ---------------------------------------- -# Returns true iff $COND implies any of the conditions in @CONDS. -sub conditional_implies_any ($@) -{ - my ($cond, @conds) = @_; - - @conds = ("") if @conds == 0; - - foreach my $c (@conds) - { - return 1 if conditional_true_when ($c, $cond); - } - return 0; -} - - -# $NEGATION -# condition_negate ($COND) -# ------------------------ -sub condition_negate ($) -{ - my ($cond) = @_; - - $cond =~ s/TRUE$/TRUEO/; - $cond =~ s/FALSE$/TRUE/; - $cond =~ s/TRUEO$/FALSE/; - - return $cond; -} - - -# Compare condition names. -# Issue them in alphabetical order, foo_TRUE before foo_FALSE. -sub by_condition -{ - # Be careful we might be comparing `' or `#'. - $a =~ /^(.*)_(TRUE|FALSE)$/; - my ($aname, $abool) = ($1 || '', $2 || ''); - $b =~ /^(.*)_(TRUE|FALSE)$/; - my ($bname, $bbool) = ($1 || '', $2 || ''); - return ($aname cmp $bname - # Don't bother with IFs, given that TRUE is after FALSE - # just cmp in the reverse order. - || $bbool cmp $abool - # Just in case... - || $a cmp $b); -} - - -# &make_condition (@CONDITIONS) -# ----------------------------- -# Transform a list of conditions (themselves can be an internal list -# of conditions, e.g., @CONDITIONS = ('cond1 cond2', 'cond3')) into a -# Make conditional (a pattern for AC_SUBST). -# Correctly returns the empty string when there are no conditions. -sub make_condition -{ - my $res = conditional_string (@_); - - # There are no conditions. - if ($res eq '') - { - # Nothing to do. - } - # It's impossible. - elsif ($res eq 'FALSE') - { - $res = '#'; - } - # Build it. - else - { - $res = '@' . $res . '@'; - $res =~ s/ /@@/g; - } - - return $res; -} - - - -## ------------------------------ ## -## Handling the condition stack. ## -## ------------------------------ ## - - -# $COND_STRING -# cond_stack_if ($NEGATE, $COND, $WHERE) -# -------------------------------------- -sub cond_stack_if ($$$) -{ - my ($negate, $cond, $where) = @_; - - err $where, "$cond does not appear in AM_CONDITIONAL" - if ! $configure_cond{$cond} && $cond !~ /^TRUE|FALSE$/; - - $cond = "${cond}_TRUE" - unless $cond =~ /^TRUE|FALSE$/; - $cond = condition_negate ($cond) - if $negate; - - push (@cond_stack, $cond); - - return conditional_string (@cond_stack); -} - - -# $COND_STRING -# cond_stack_else ($NEGATE, $COND, $WHERE) -# ---------------------------------------- -sub cond_stack_else ($$$) -{ - my ($negate, $cond, $where) = @_; - - if (! @cond_stack) - { - err $where, "else without if"; - return; - } - - $cond_stack[$#cond_stack] = condition_negate ($cond_stack[$#cond_stack]); - - # If $COND is given, check against it. - if (defined $cond) - { - $cond = "${cond}_TRUE" - unless $cond =~ /^TRUE|FALSE$/; - $cond = condition_negate ($cond) - if $negate; - - err ($where, "else reminder ($negate$cond) incompatible with " - . "current conditional: $cond_stack[$#cond_stack]") - if $cond_stack[$#cond_stack] ne $cond; - } - - return conditional_string (@cond_stack); -} - - -# $COND_STRING -# cond_stack_endif ($NEGATE, $COND, $WHERE) -# ----------------------------------------- -sub cond_stack_endif ($$$) -{ - my ($negate, $cond, $where) = @_; - my $old_cond; - - if (! @cond_stack) - { - err $where, "endif without if: $negate$cond"; - return; - } - - - # If $COND is given, check against it. - if (defined $cond) - { - $cond = "${cond}_TRUE" - unless $cond =~ /^TRUE|FALSE$/; - $cond = condition_negate ($cond) - if $negate; - - err ($where, "endif reminder ($negate$cond) incompatible with " - . "current conditional: $cond_stack[$#cond_stack]") - if $cond_stack[$#cond_stack] ne $cond; - } - - pop @cond_stack; - - return conditional_string (@cond_stack); -} - - - - - -## ------------------------ ## -## Handling the variables. ## -## ------------------------ ## - - -# check_ambiguous_conditional ($VAR, $COND, $WHERE) -# ------------------------------------------------- -# Check for an ambiguous conditional. This is called when a variable -# is being defined conditionally. If we already know about a -# definition that is true under the same conditions, then we have an -# ambiguity. -sub check_ambiguous_conditional ($$$) -{ - my ($var, $cond, $where) = @_; - my ($message, $ambig_cond) = - conditional_ambiguous_p ($var, $cond, keys %{$var_value{$var}}); - if ($message) - { - msg 'syntax', $where, "$message ..."; - msg_var ('syntax', $var, "... `$var' previously defined here."); - verb (macro_dump ($var)); - } -} - -# $STRING, $AMBIG_COND -# conditional_ambiguous_p ($WHAT, $COND, @CONDS) -# ---------------------------------------------- -# Check for an ambiguous conditional. Return an error message and -# the other condition involved if we have one, two empty strings otherwise. -# WHAT: the thing being defined -# COND: the condition under which is is being defined -# CONDS: the conditons under which is had already been defined -sub conditional_ambiguous_p ($$@) -{ - my ($var, $cond, @conds) = @_; - foreach my $vcond (@conds) - { - # Note that these rules doesn't consider the following - # example as ambiguous. - # - # if COND1 - # FOO = foo - # endif - # if COND2 - # FOO = bar - # endif - # - # It's up to the user to not define COND1 and COND2 - # simultaneously. - my $message; - if ($vcond eq $cond) - { - return ("$var multiply defined in condition $cond", $vcond); - } - elsif (&conditional_true_when ($vcond, $cond)) - { - return ("$var was already defined in condition $vcond, " - . "which implies condition $cond", $vcond); - } - elsif (&conditional_true_when ($cond, $vcond)) - { - return ("$var was already defined in condition $vcond, " - . "which is implied by condition $cond", $vcond); - } - } - return ('', ''); -} - -# @MISSING_CONDS -# variable_not_always_defined_in_cond ($VAR, $COND) -# --------------------------------------------- -# Check whether $VAR is always defined for condition $COND. -# Return a list of conditions where the definition is missing. -# -# For instance, given -# -# if COND1 -# if COND2 -# A = foo -# D = d1 -# else -# A = bar -# D = d2 -# endif -# else -# D = d3 -# endif -# if COND3 -# A = baz -# B = mumble -# endif -# C = mumble -# -# we should have: -# variable_not_always_defined_in_cond ('A', 'COND1_TRUE COND2_TRUE') -# => () -# variable_not_always_defined_in_cond ('A', 'COND1_TRUE') -# => () -# variable_not_always_defined_in_cond ('A', 'TRUE') -# => ("COND1_FALSE COND2_FALSE COND3_FALSE", -# "COND1_FALSE COND2_TRUE COND3_FALSE", -# "COND1_TRUE COND2_FALSE COND3_FALSE", -# "COND1_TRUE COND2_TRUE COND3_FALSE") -# variable_not_always_defined_in_cond ('B', 'COND1_TRUE') -# => ("COND3_FALSE") -# variable_not_always_defined_in_cond ('C', 'COND1_TRUE') -# => () -# variable_not_always_defined_in_cond ('D', 'TRUE') -# => () -# variable_not_always_defined_in_cond ('Z', 'TRUE') -# => ("TRUE") -# -sub variable_not_always_defined_in_cond ($$) -{ - my ($var, $cond) = @_; - - # It's easy to answer if the variable is not defined. - return ("TRUE",) unless exists $var_value{$var}; - - # How does it work? Let's take the second example: - # - # variable_not_always_defined_in_cond ('A', 'COND1_TRUE') - # - # (1) First, we get the list of conditions where A is defined: - # - # ("COND1_TRUE COND2_TRUE", "COND1_TRUE COND2_FALSE", "COND3_TRUE") - # - # (2) Then we generate the set of inverted conditions: - # - # ("COND1_FALSE COND2_TRUE COND3_FALSE", - # "COND1_FALSE COND2_FALSE COND3_FALSE") - # - # (3) Finally we remove these conditions which are not implied by - # COND1_TRUE. This yields an empty list and we are done. - - my @res = (); - my @cond_defs = keys %{$var_value{$var}}; # (1) - foreach my $icond (invert_conditions (@cond_defs)) # (2) - { - prog_error "invert_conditions returned an input condition" - if exists $var_value{$var}{$icond}; - - push @res, $icond - if (conditional_true_when ($cond, $icond)); # (3) - } - return @res; -} - -# ¯o_define($VAR, $OWNER, $TYPE, $COND, $VALUE, $WHERE) -# ------------------------------------------------------------- -# The $VAR can go from Automake to user, but not the converse. -sub macro_define ($$$$$$) -{ - my ($var, $owner, $type, $cond, $value, $where) = @_; - - # We will adjust the owener of this variable unless told otherwise. - my $adjust_owner = 1; - - err $where, "bad characters in variable name `$var'" - if $var !~ /$MACRO_PATTERN/o; - - # NEWS-OS 4.2R complains if a Makefile variable begins with `_'. - msg ('portability', $where, - "$var: variable names starting with `_' are not portable") - if $var =~ /^_/; - - # `:='-style assignments are not acknowledged by POSIX. Moreover it - # has multiple meanings. In GNU make or BSD make it means "assign - # with immediate expansion", while in OSF make it is used for - # conditional assignments. - msg ('portability', $where, "`:='-style assignments are not portable") - if $type eq ':'; - - check_variable_expansions ($value, $where); - - $cond ||= 'TRUE'; - - # An Automake variable must be consistently defined with the same - # sign by Automake. A user variable must be set by either `=' or - # `:=', and later promoted to `+='. - if ($owner == VAR_AUTOMAKE) - { - if (exists $var_type{$var} - && exists $var_type{$var}{$cond} - && $var_type{$var}{$cond} ne $type) - { - err ($where, "$var was set with `$var_type{$var}=' " - . "and is now set with `$type='"); - } - } - else - { - if (!exists $var_type{$var} && $type eq '+') - { - err $where, "$var must be set with `=' before using `+='"; - } - } - $var_type{$var}{$cond} = $type; - - # When adding, since we rewrite, don't try to preserve the - # Automake continuation backslashes. - $value =~ s/\\$//mg - if $type eq '+' && $owner == VAR_AUTOMAKE; - - # Differentiate assignment types. - - # 1. append (+=) to a variable defined for current condition - if ($type eq '+' && exists $var_value{$var}{$cond}) - { - if (chomp $var_value{$var}{$cond}) - { - # Insert a backslash before a trailing newline. - $var_value{$var}{$cond} .= "\\\n"; - } - elsif ($var_value{$var}{$cond}) - { - # Insert a separator. - $var_value{$var}{$cond} .= ' '; - } - $var_value{$var}{$cond} .= $value; - } - # 2. append (+=) to a variable defined for *another* condition - elsif ($type eq '+' && keys %{$var_value{$var}}) - { - # * Generally, $cond is not TRUE. For instance: - # FOO = foo - # if COND - # FOO += bar - # endif - # In this case, we declare an helper variable conditionally, - # and append it to FOO: - # FOO = foo $(am__append_1) - # @COND_TRUE@am__append_1 = bar - # Of course if FOO is defined under several conditions, we add - # $(am__append_1) to each definitions. - # - # * If $cond is TRUE, we don't need the helper variable. E.g., in - # if COND1 - # FOO = foo1 - # else - # FOO = foo2 - # endif - # FOO += bar - # we can add bar directly to all definition of FOO, and output - # @COND_TRUE@FOO = foo1 bar - # @COND_FALSE@FOO = foo2 bar - - # Do we need an helper variable? - if ($cond ne 'TRUE') - { - # Does the helper variable already exists? - my $key = "$var:$cond"; - if (exists $appendvar{$key}) - { - # Yes, let's simply append to it. - $var = $appendvar{$key}; - $owner = VAR_AUTOMAKE; - } - else - { - # No, create it. - my $num = 1 + keys (%appendvar); - my $hvar = "am__append_$num"; - $appendvar{$key} = $hvar; - ¯o_define ($hvar, VAR_AUTOMAKE, '+', - $cond, $value, $where); - push @var_list, $hvar; - # Now HVAR is to be added to VAR. - $value = "\$($hvar)"; - } - } - - # Add VALUE to all definitions of VAR. - foreach my $vcond (keys %{$var_value{$var}}) - { - # We have a bit of error detection to do here. - # This: - # if COND1 - # X = Y - # endif - # X += Z - # should be rejected because X is not defined for all conditions - # where `+=' applies. - my @undef_cond = variable_not_always_defined_in_cond $var, $cond; - if (@undef_cond != 0) - { - err ($where, - "Cannot apply `+=' because `$var' is not defined " - . "in\nthe following conditions:\n " - . join ("\n ", @undef_cond) - . "\nEither define `$var' in these conditions," - . " or use\n`+=' in the same conditions as" - . " the definitions."); - } - else - { - ¯o_define ($var, $owner, '+', $vcond, $value, $where); - } - } - # Don't adjust the owner. The above ¯o_define did it in the - # right conditions. - $adjust_owner = 0; - } - # 3. first assignment (=, :=, or +=) - else - { - # If Automake tries to override a value specified by the user, - # just don't let it do. - if (exists $var_value{$var}{$cond} - && $var_owner{$var} != VAR_AUTOMAKE - && $owner == VAR_AUTOMAKE) - { - verb ("refusing to override the user definition of:\n" - . macro_dump ($var) - ."with `$cond' => `$value'"); - } - else - { - # There must be no previous value unless the user is redefining - # an Automake variable or an AC_SUBST variable for an existing - # condition. - check_ambiguous_conditional ($var, $cond, $where) - unless (exists $var_owner{$var}{$cond} - && (($var_owner{$var}{$cond} == VAR_AUTOMAKE - && $owner != VAR_AUTOMAKE) - || $var_owner{$var}{$cond} == VAR_CONFIGURE)); - - $var_value{$var}{$cond} = $value; - # Assignments to a macro set its location. We don't adjust - # locations for `+='. Ideally I suppose we would associate - # line numbers with random bits of text. - $var_location{$var}{$cond} = $where; - } - } - - # The owner of a variable can only increase, because an Automake - # variable can be given to the user, but not the converse. - if ($adjust_owner && - (! exists $var_owner{$var}{$cond} - || $owner > $var_owner{$var}{$cond})) - { - $var_owner{$var}{$cond} = $owner; - # Always adjust the location when the owner changes (even for - # `+=' statements). The risk otherwise is to warn about - # a VAR_MAKEFILE variable and locate it in configure.ac... - $var_location{$var}{$cond} = $where; - } - - # Call var_VAR_trigger if it's defined. - # This hook helps to update some internal state *while* - # parsing the file. For instance the handling of SUFFIXES - # requires this (see var_SUFFIXES_trigger). - my $var_trigger = "var_${var}_trigger"; - &$var_trigger($type, $value) if defined &$var_trigger; -} - - -# ¯o_delete ($VAR, [@CONDS]) -# ------------------------------ -# Forget about $VAR under the conditions @CONDS, or completely if -# @CONDS is empty. -sub macro_delete ($@) -{ - my ($var, @conds) = @_; - - if (!@conds) - { - delete $var_value{$var}; - delete $var_location{$var}; - delete $var_owner{$var}; - delete $var_comment{$var}; - delete $var_type{$var}; - } - else - { - foreach my $cond (@conds) - { - delete $var_value{$var}{$cond}; - delete $var_location{$var}{$cond}; - delete $var_owner{$var}{$cond}; - delete $var_comment{$var}{$cond}; - delete $var_type{$var}{$cond}; - } - } -} - - -# ¯o_dump ($VAR) -# ------------------ -sub macro_dump ($) -{ - my ($var) = @_; - my $text = ''; - - if (!exists $var_value{$var}) - { - $text = " $var does not exist\n"; - } - else - { - $text .= " $var $var_type{$var}=\n {\n"; - foreach my $vcond (sort by_condition keys %{$var_value{$var}}) - { - prog_error ("`$var' is a key in \$var_value, " - . "but not in \$var_owner\n") - unless exists $var_owner{$var}{$vcond}; - - my $var_owner; - if ($var_owner{$var}{$vcond} == VAR_AUTOMAKE) - { - $var_owner = 'Automake'; - } - elsif ($var_owner{$var}{$vcond} == VAR_CONFIGURE) - { - $var_owner = 'Configure'; - } - elsif ($var_owner{$var}{$vcond} == VAR_MAKEFILE) - { - $var_owner = 'Makefile'; - } - else - { - prog_error ("unexpected value for `\$var_owner{$var}{$vcond}': " - . $var_owner{$var}{$vcond}) - unless defined $var_owner; - } - - my $where = (defined $var_location{$var}{$vcond} - ? $var_location{$var}{$vcond} : "undefined"); - $text .= "$var_comment{$var}{$vcond}" - if exists $var_comment{$var}{$vcond}; - $text .= " $vcond => $var_value{$var}{$vcond}\n"; - } - $text .= " }\n"; - } - return $text; -} - - -# ¯os_dump () -# --------------- -sub macros_dump () -{ - my ($var) = @_; - - my $text = "%var_value =\n{\n"; - foreach my $var (sort (keys %var_value)) - { - $text .= macro_dump ($var); - } - $text .= "}\n"; - return $text; -} - - -# $BOOLEAN -# variable_defined ($VAR, [$COND]) -# --------------------------------- -# See if a variable exists. $VAR is the variable name, and $COND is -# the condition which we should check. If no condition is given, we -# currently return true if the variable is defined under any -# condition. -sub variable_defined ($;$) -{ - my ($var, $cond) = @_; - - if (! exists $var_value{$var} - || (defined $cond && ! exists $var_value{$var}{$cond})) - { - # VAR is not defined. - - # Check there is no target defined with the name of the - # variable we check. - - # adl> I'm wondering if this error still makes any sense today. I - # adl> guess it was because targets and variables used to share - # adl> the same namespace in older versions of Automake? - # tom> While what you say is definitely part of it, I think it - # tom> might also have been due to someone making a "spelling error" - # tom> -- writing "foo:..." instead of "foo = ...". - # tom> I'm not sure whether it is really worth diagnosing - # tom> this sort of problem. In the old days I used to add warnings - # tom> and errors like this pretty randomly, based on bug reports I - # tom> got. But there's a plausible argument that I was trying - # tom> too hard to prevent people from making mistakes. - if (exists $targets{$var} - && (! defined $cond || exists $targets{$var}{$cond})) - { - for my $tcond ($cond || keys %{$targets{$var}}) - { - prog_error ("\$targets{$var}{$tcond} exists but " - . "\$target_owner doesn't") - unless exists $target_owner{$var}{$tcond}; - # Diagnose the first user target encountered, if any. - # Restricting this test to user targets allows Automake - # to create rules for things like `bin_PROGRAMS = LDADD'. - if ($target_owner{$var}{$tcond} == TARGET_USER) - { - msg_cond_target ('syntax', $tcond, $var, - "`$var' is a target; " - . "expected a variable"); - return 0; - } - } - } - return 0; - } - - # Even a var_value examination is good enough for us. FIXME: - # really should maintain examined status on a per-condition basis. - $content_seen{$var} = 1; - return 1; -} - - -# $BOOLEAN -# variable_assert ($VAR, $WHERE) -# ------------------------------ -# Make sure a variable exists. $VAR is the variable name, and $WHERE -# is the name of a macro which refers to $VAR. -sub variable_assert ($$) -{ - my ($var, $where) = @_; - - return 1 - if variable_defined $var; - - require_variables ($where, "variable `$var' is used", 'TRUE', $var); - - return 0; -} - -# Mark a variable as examined. -sub examine_variable -{ - my ($var) = @_; - variable_defined ($var); -} - - -# &variable_conditions_recursive ($VAR) -# ------------------------------------- -# Return the set of conditions for which a variable is defined. - -# If the variable is not defined conditionally, and is not defined in -# terms of any variables which are defined conditionally, then this -# returns the empty list. - -# If the variable is defined conditionally, but is not defined in -# terms of any variables which are defined conditionally, then this -# returns the list of conditions for which the variable is defined. - -# If the variable is defined in terms of any variables which are -# defined conditionally, then this returns a full set of permutations -# of the subvariable conditions. For example, if the variable is -# defined in terms of a variable which is defined for COND_TRUE, -# then this returns both COND_TRUE and COND_FALSE. This is -# because we will need to define the variable under both conditions. -sub variable_conditions_recursive ($) -{ - my ($var) = @_; - - %vars_scanned = (); - - my @new_conds = variable_conditions_recursive_sub ($var, ''); - - # Now we want to return all permutations of the subvariable - # conditions. - my %allconds = (); - foreach my $item (@new_conds) - { - foreach (split (' ', $item)) - { - s/^(.*)_(TRUE|FALSE)$/$1_TRUE/; - $allconds{$_} = 1; - } - } - @new_conds = variable_conditions_permutations (sort keys %allconds); - - my %uniqify; - foreach my $cond (@new_conds) - { - my $reduce = variable_conditions_reduce (split (' ', $cond)); - next - if $reduce eq 'FALSE'; - $uniqify{$cond} = 1; - } - - # Note we cannot just do `return sort keys %uniqify', because this - # function is sometimes used in a scalar context. - my @uniq_list = sort by_condition keys %uniqify; - return @uniq_list; -} - - -# @CONDS -# variable_conditions ($VAR) -# -------------------------- -# Get the list of conditions that a variable is defined with, without -# recursing through the conditions of any subvariables. -# Argument is $VAR: the variable to get the conditions of. -# Returns the list of conditions. -sub variable_conditions ($) -{ - my ($var) = @_; - my @conds = keys %{$var_value{$var}}; - return sort by_condition @conds; -} - - -# $BOOLEAN -# &variable_conditionally_defined ($VAR) -# -------------------------------------- -sub variable_conditionally_defined ($) -{ - my ($var) = @_; - foreach my $cond (variable_conditions_recursive ($var)) - { - return 1 - unless $cond =~ /^TRUE|FALSE$/; - } - return 0; -} - -# @LIST -# &scan_variable_expansions ($TEXT) -# --------------------------------- -# Return the list of variable names expanded in $TEXT. -# Note that unlike some other functions, $TEXT is not split -# on spaces before we check for subvariables. -sub scan_variable_expansions ($) -{ - my ($text) = @_; - my @result = (); - - # Strip comments. - $text =~ s/#.*$//; - - # Record each use of ${stuff} or $(stuff) that do not follow a $. - while ($text =~ /(? 0) - { - $cond = shift(@conds); - - # FALSE is absorbent. - return 'FALSE' - if $cond eq 'FALSE'; - - if (!conditional_is_redundant ($cond, @ret, @conds)) - { - push (@ret, $cond); - } - } - - return "TRUE" if @ret == 0; - return @ret; -} - -# @CONDS -# invert_conditions (@CONDS) -# -------------------------- -# Invert a list of conditionals. Returns a set of conditionals which -# are never true for any of the input conditionals, and when taken -# together with the input conditionals cover all possible cases. -# -# For example: -# invert_conditions("A_TRUE B_TRUE", "A_FALSE B_FALSE") -# => ("A_FALSE B_TRUE", "A_TRUE B_FALSE") -# -# invert_conditions("A_TRUE B_TRUE", "A_TRUE B_FALSE", "A_FALSE") -# => () -sub invert_conditions -{ - my (@conds) = @_; - - my @notconds = (); - - # Generate all permutation for all inputs. - my @perm = - map { variable_conditions_permutations (split(' ', $_)); } @conds; - # Remove redundant conditions. - @perm = variable_conditions_reduce @perm; - - # Now remove all conditions which imply one of the input conditions. - foreach my $perm (@perm) - { - push @notconds, $perm - if ! conditional_implies_any ($perm, @conds); - } - return @notconds; -} - -# Return a list of permutations of a conditional string. -# (But never output FALSE conditions, they are useless.) -# -# Examples: -# variable_conditions_permutations ("FOO_FALSE", "BAR_TRUE") -# => ("FOO_FALSE BAR_FALSE", -# "FOO_FALSE BAR_TRUE", -# "FOO_TRUE BAR_FALSE", -# "FOO_TRUE BAR_TRUE") -# variable_conditions_permutations ("FOO_FALSE", "TRUE") -# => ("FOO_FALSE TRUE", -# "FOO_TRUE TRUE") -# variable_conditions_permutations ("TRUE") -# => ("TRUE") -# variable_conditions_permutations ("FALSE") -# => ("TRUE") -sub variable_conditions_permutations -{ - my (@comps) = @_; - return () - if ! @comps; - my $comp = shift (@comps); - return variable_conditions_permutations (@comps) - if $comp eq ''; - my $neg = condition_negate ($comp); - - my @ret; - foreach my $sub (variable_conditions_permutations (@comps)) - { - push (@ret, "$comp $sub") if $comp ne 'FALSE'; - push (@ret, "$neg $sub") if $neg ne 'FALSE'; - } - if (! @ret) - { - push (@ret, $comp) if $comp ne 'FALSE'; - push (@ret, $neg) if $neg ne 'FALSE'; - } - return @ret; -} - - -# $BOOL -# &check_variable_defined_unconditionally($VAR, $PARENT) -# ------------------------------------------------------ -# Warn if a variable is conditionally defined. This is called if we -# are using the value of a variable. -sub check_variable_defined_unconditionally ($$) -{ - my ($var, $parent) = @_; - foreach my $cond (keys %{$var_value{$var}}) - { - next - if $cond =~ /^TRUE|FALSE$/; - - if ($parent) - { - msg_var ('unsupported', $parent, - "automake does not support conditional definition of " - . "$var in $parent"); - } - else - { - msg_var ('unsupported', $var, - "automake does not support $var being defined " - . "conditionally"); - } - } -} - - -# Get the TRUE value of a variable, warn if the variable is -# conditionally defined. -sub variable_value -{ - my ($var) = @_; - &check_variable_defined_unconditionally ($var); - return $var_value{$var}{'TRUE'}; -} - - -# @VALUES -# &value_to_list ($VAR, $VAL, $COND) -# ---------------------------------- -# Convert a variable value to a list, split as whitespace. This will -# recursively follow $(...) and ${...} inclusions. It preserves @...@ -# substitutions. -# -# If COND is 'all', then all values under all conditions should be -# returned; if COND is a particular condition (all conditions are -# surrounded by @...@) then only the value for that condition should -# be returned; otherwise, warn if VAR is conditionally defined. -# SCANNED is a global hash listing whose keys are all the variables -# already scanned; it is an error to rescan a variable. -sub value_to_list ($$$) -{ - my ($var, $val, $cond) = @_; - my @result; - - # Strip backslashes - $val =~ s/\\(\n|$)/ /g; - - foreach (split (' ', $val)) - { - # If a comment seen, just leave. - last if /^#/; - - # Handle variable substitutions. - if (/^\$\{([^}]*)\}$/ || /^\$\(([^)]*)\)$/) - { - my $varname = $1; - - # If the user uses a losing variable name, just ignore it. - # This isn't ideal, but people have requested it. - next if ($varname =~ /\@.*\@/); - - my ($from, $to); - my @temp_list; - if ($varname =~ /$SUBST_REF_PATTERN/o) - { - $varname = $1; - $to = $3; - $from = quotemeta $2; - } - - # Find the value. - @temp_list = - variable_value_as_list_recursive_worker ($1, $cond, $var); - - # Now rewrite the value if appropriate. - if (defined $from) - { - grep (s/$from$/$to/, @temp_list); - } - - push (@result, @temp_list); - } - else - { - push (@result, $_); - } - } - - return @result; -} - - -# @VALUES -# variable_value_as_list ($VAR, $COND, $PARENT) -# --------------------------------------------- -# Get the value of a variable given a specified condition. without -# recursing through any subvariables. -# Arguments are: -# $VAR is the variable -# $COND is the condition. If this is not given, the value for the -# "TRUE" condition will be returned. -# $PARENT is the variable in which the variable is used: this is used -# only for error messages. -# Returns the list of conditions. -# For example, if A is defined as "foo $(B) bar", and B is defined as -# "baz", this will return ("foo", "$(B)", "bar") -sub variable_value_as_list -{ - my ($var, $cond, $parent) = @_; - my @result; - - # Check defined - return - unless variable_assert $var, $parent; - - # Get value for given condition - $cond ||= 'TRUE'; - my $onceflag; - foreach my $vcond (keys %{$var_value{$var}}) - { - my $val = $var_value{$var}{$vcond}; - - if (&conditional_true_when ($vcond, $cond)) - { - # Unless variable is not defined conditionally, there should only - # be one value of $vcond true when $cond. - &check_variable_defined_unconditionally ($var, $parent) - if $onceflag; - $onceflag = 1; - - # Strip backslashes - $val =~ s/\\(\n|$)/ /g; - - foreach (split (' ', $val)) - { - # If a comment seen, just leave. - last if /^#/; - - push (@result, $_); - } - } - } - - return @result; -} - - -# @VALUE -# &variable_value_as_list_recursive_worker ($VAR, $COND, $PARENT) -# --------------------------------------------------------------- -# Return contents of VAR as a list, split on whitespace. This will -# recursively follow $(...) and ${...} inclusions. It preserves @...@ -# substitutions. If COND is 'all', then all values under all -# conditions should be returned; if COND is a particular condition -# (all conditions are surrounded by @...@) then only the value for -# that condition should be returned; otherwise, warn if VAR is -# conditionally defined. If PARENT is specified, it is the name of -# the including variable; this is only used for error reports. -sub variable_value_as_list_recursive_worker ($$$) -{ - my ($var, $cond, $parent) = @_; - my @result = (); - - return - unless variable_assert $var, $parent; - - if (defined $vars_scanned{$var}) - { - # `vars_scanned' is a global we use to keep track of which - # variables we've already examined. - err_var $parent, "variable `$var' recursively defined"; - } - elsif ($cond eq 'all') - { - $vars_scanned{$var} = 1; - foreach my $vcond (keys %{$var_value{$var}}) - { - my $val = $var_value{$var}{$vcond}; - push (@result, &value_to_list ($var, $val, $cond)); - } - } - else - { - $cond ||= 'TRUE'; - $vars_scanned{$var} = 1; - my $onceflag; - foreach my $vcond (keys %{$var_value{$var}}) - { - my $val = $var_value{$var}{$vcond}; - if (&conditional_true_when ($vcond, $cond)) - { - # Warn if we have an ambiguity. It's hard to know how - # to handle this case correctly. - &check_variable_defined_unconditionally ($var, $parent) - if $onceflag; - $onceflag = 1; - push (@result, &value_to_list ($var, $val, $cond)); - } - } - } - - # Unset our entry in vars_scanned. We only care about recursive - # definitions. - delete $vars_scanned{$var}; - - return @result; -} - - -# &variable_output ($VAR, [@CONDS]) -# --------------------------------- -# Output all the values of $VAR is @COND is not specified, else only -# that corresponding to @COND. -sub variable_output ($@) -{ - my ($var, @conds) = @_; - - @conds = keys %{$var_value{$var}} - unless @conds; - - foreach my $cond (sort by_condition @conds) - { - prog_error ("unknown condition `$cond' for `$var'") - unless exists $var_value{$var}{$cond}; - - if (exists $var_comment{$var} && exists $var_comment{$var}{$cond}) - { - $output_vars .= $var_comment{$var}{$cond}; - } - - my $val = $var_value{$var}{$cond}; - my $equals = $var_type{$var}{$cond} eq ':' ? ':=' : '='; - my $output_var = "$var $equals $val"; - $output_var =~ s/^/make_condition ($cond)/meg; - $output_vars .= $output_var . "\n"; - } -} - - -# &variable_pretty_output ($VAR, [@CONDS]) -# ---------------------------------------- -# Likewise, but pretty, i.e., we *split* the values at spaces. Use only -# with variables holding filenames. -sub variable_pretty_output ($@) -{ - my ($var, @conds) = @_; - - @conds = keys %{$var_value{$var}} - unless @conds; - - foreach my $cond (sort by_condition @conds) - { - prog_error ("unknown condition `$cond' for `$var'") - unless exists $var_value{$var}{$cond}; - - if (exists $var_comment{$var} && exists $var_comment{$var}{$cond}) - { - $output_vars .= $var_comment{$var}{$cond}; - } - - my $val = $var_value{$var}{$cond}; - my $equals = $var_type{$var}{$cond} eq ':' ? ':=' : '='; - my $make_condition = make_condition ($cond); - $output_vars .= pretty_print_internal ("$make_condition$var $equals", - "$make_condition\t", - split (' ' , $val)); - } -} - - -# &variable_value_as_list_recursive ($VAR, $COND, $PARENT) -# -------------------------------------------------------- -# This is just a wrapper for variable_value_as_list_recursive_worker that -# initializes the global hash `vars_scanned'. This hash is used to -# avoid infinite recursion. -sub variable_value_as_list_recursive ($$@) -{ - my ($var, $cond, $parent) = @_; - %vars_scanned = (); - return &variable_value_as_list_recursive_worker ($var, $cond, $parent); -} - - -# &define_pretty_variable ($VAR, $COND, @VALUE) -# --------------------------------------------- -# Like define_variable, but the value is a list, and the variable may -# be defined conditionally. The second argument is the conditional -# under which the value should be defined; this should be the empty -# string to define the variable unconditionally. The third argument -# is a list holding the values to use for the variable. The value is -# pretty printed in the output file. -sub define_pretty_variable ($$@) -{ - my ($var, $cond, @value) = @_; - - # Beware that an empty $cond has a different semantics for - # macro_define and variable_pretty_output. - $cond ||= 'TRUE'; - - if (! variable_defined ($var, $cond)) - { - macro_define ($var, VAR_AUTOMAKE, '', $cond, "@value", undef); - variable_pretty_output ($var, $cond || 'TRUE'); - $content_seen{$var} = 1; - } -} - - -# define_variable ($VAR, $VALUE) -# ------------------------------ -# Define a new user variable VAR to VALUE, but only if not already defined. -sub define_variable ($$) -{ - my ($var, $value) = @_; - define_pretty_variable ($var, 'TRUE', $value); -} - - -# Like define_variable, but define a variable to be the configure -# substitution by the same name. -sub define_configure_variable ($) -{ - my ($var) = @_; - if (! variable_defined ($var, 'TRUE') - # Explicitly avoid ANSI2KNR -- we AC_SUBST that in - # protos.m4, but later define it elsewhere. This is - # pretty hacky. We also explicitly avoid AMDEPBACKSLASH: - # it might be subst'd by `\', which certainly would not be - # appreciated by Make. - && ! grep { $_ eq $var } (qw(ANSI2KNR AMDEPBACKSLASH))) - { - macro_define ($var, VAR_CONFIGURE, '', 'TRUE', - subst $var, $configure_vars{$var}); - variable_pretty_output ($var, 'TRUE'); - } -} - - -# define_compiler_variable ($LANG) -# -------------------------------- -# Define a compiler variable. We also handle defining the `LT' -# version of the command when using libtool. -sub define_compiler_variable ($) -{ - my ($lang) = @_; - - my ($var, $value) = ($lang->compiler, $lang->compile); - &define_variable ($var, $value); - &define_variable ("LT$var", "\$(LIBTOOL) --mode=compile $value") - if variable_defined ('LIBTOOL'); -} - - -# define_linker_variable ($LANG) -# ------------------------------ -# Define linker variables. -sub define_linker_variable ($) -{ - my ($lang) = @_; - - my ($var, $value) = ($lang->lder, $lang->ld); - # CCLD = $(CC). - &define_variable ($lang->lder, $lang->ld); - # CCLINK = $(CCLD) blah blah... - &define_variable ($lang->linker, - ((variable_defined ('LIBTOOL') - ? '$(LIBTOOL) --mode=link ' : '') - . $lang->link)); -} - -################################################################ - -## ---------------- ## -## Handling rules. ## -## ---------------- ## - -sub register_suffix_rule ($$$) -{ - my ($where, $src, $dest) = @_; - - verb "Sources ending in $src become $dest"; - push @suffixes, $src, $dest; - - # When tranforming sources to objects, Automake uses the - # %suffix_rules to move from each source extension to - # `.$(OBJEXT)', not to `.o' or `.obj'. However some people - # define suffix rules for `.o' or `.obj', so internally we will - # consider these extensions equivalent to `.$(OBJEXT)'. We - # CANNOT rewrite the target (i.e., automagically replace `.o' - # and `.obj' by `.$(OBJEXT)' in the output), or warn the user - # that (s)he'd better use `.$(OBJEXT)', because Automake itself - # output suffix rules for `.o' or `.obj'... - $dest = '.$(OBJEXT)' if ($dest eq '.o' || $dest eq '.obj'); - - # Reading the comments near the declaration of $suffix_rules might - # help to understand the update of $suffix_rules that follows... - - # Register $dest as a possible destination from $src. - # We might have the create the \hash. - if (exists $suffix_rules->{$src}) - { - $suffix_rules->{$src}{$dest} = [ $dest, 1 ]; - } - else - { - $suffix_rules->{$src} = { $dest => [ $dest, 1 ] }; - } - - # If we know how to transform $dest in something else, then - # we know how to transform $src in that "something else". - if (exists $suffix_rules->{$dest}) - { - for my $dest2 (keys %{$suffix_rules->{$dest}}) - { - my $dist = $suffix_rules->{$dest}{$dest2}[1] + 1; - # Overwrite an existing $src->$dest2 path only if - # the path via $dest which is shorter. - if (! exists $suffix_rules->{$src}{$dest2} - || $suffix_rules->{$src}{$dest2}[1] > $dist) - { - $suffix_rules->{$src}{$dest2} = [ $dest, $dist ]; - } - } - } - - # Similarly, any extension that can be derived into $src - # can be derived into the same extenstions as $src can. - my @dest2 = keys %{$suffix_rules->{$src}}; - for my $src2 (keys %$suffix_rules) - { - if (exists $suffix_rules->{$src2}{$src}) - { - for my $dest2 (@dest2) - { - my $dist = $suffix_rules->{$src}{$dest2} + 1; - # Overwrite an existing $src2->$dest2 path only if - # the path via $src is shorter. - if (! exists $suffix_rules->{$src2}{$dest2} - || $suffix_rules->{$src2}{$dest2}[1] > $dist) - { - $suffix_rules->{$src2}{$dest2} = [ $src, $dist ]; - } - } - } - } -} - -# @CONDS -# rule_define ($TARGET, $SOURCE, $OWNER, $COND, $WHERE) -# ----------------------------------------------------- -# Define a new rule. $TARGET is the rule name. $SOURCE -# is the filename the rule comes from. $OWNER is the -# owener of the rule (TARGET_AUTOMAKE or TARGET_USER). -# $COND is the condition string under which the rule is defined. -# $WHERE is where the rule is defined (file name and/or line number). -# Returns a (possibly empty) list of conditions where the rule -# should be defined. -sub rule_define ($$$$$) -{ - my ($target, $source, $owner, $cond, $where) = @_; - - # Don't even think about defining a rule in condition FALSE. - return () if $cond eq 'FALSE'; - - # For now `foo:' will override `foo$(EXEEXT):'. This is temporary, - # though, so we emit a warning. - (my $noexe = $target) =~ s,\$\(EXEEXT\)$,,; - if ($noexe ne $target - && exists $targets{$noexe} - && exists $targets{$noexe}{$cond} - && $target_name{$noexe}{$cond} ne $target) - { - # The no-exeext option enables this feature. - if (! defined $options{'no-exeext'}) - { - msg ('obsolete', $noexe, - "deprecated feature: `$noexe' overrides `$noexe\$(EXEEXT)'\n" - . "change your target to read `$noexe\$(EXEEXT)'"); - } - # Don't define. - return (); - } - - # For now on, strip off $(EXEEXT) from $target, so we can diagnose - # a clash if `ctags$(EXEEXT):' is redefined after `ctags:'. - my $realtarget = $target; - $target = $noexe; - - # A GNU make-style pattern rule has a single "%" in the target name. - msg ('portability', $where, - "`%'-style pattern rules are a GNU make extension") - if $target =~ /^[^%]*%[^%]*$/; - - # Diagnose target redefinitions. - if (exists $target_source{$target}{$cond}) - { - # Sanity checks. - prog_error ("\$target_source{$target}{$cond} exists, but \$target_owner" - . " doesn't.") - unless exists $target_owner{$target}{$cond}; - prog_error ("\$target_source{$target}{$cond} exists, but \$targets" - . " doesn't.") - unless exists $targets{$target}{$cond}; - prog_error ("\$target_source{$target}{$cond} exists, but \$target_name" - . " doesn't.") - unless exists $target_name{$target}{$cond}; - - my $oldowner = $target_owner{$target}{$cond}; - - # Don't mention true conditions in diagnostics. - my $condmsg = $cond ne 'TRUE' ? " in condition `$cond'" : ''; - - if ($owner == TARGET_USER) - { - if ($oldowner eq TARGET_USER) - { - # Ignore `%'-style pattern rules. We'd need the - # dependencies to detect duplicates, and they are - # already diagnosed as unportable by -Wportability. - if ($target !~ /^[^%]*%[^%]*$/) - { - ## FIXME: Presently we can't diagnose duplcate user rules - ## because we doesn't distinguish rules with commands - ## from rules that only add dependencies. E.g., - ## .PHONY: foo - ## .PHONY: bar - ## is legitimate. (This is phony.test.) - - # msg ('syntax', $where, - # "redefinition of `$target'$condmsg..."); - # msg_cond_target ('syntax', $cond, $target, - # "... `$target' previously defined here."); - } - # Return so we don't redefine the rule in our tables, - # don't check for ambiguous conditional, etc. The rule - # will be output anyway beauce &read_am_file ignore the - # return code. - return (); - } - else - { - # Since we parse the user Makefile.am before reading - # the Automake fragments, this condition should never happen. - prog_error ("user target `$target' seen after Automake's " - . "definition\nfrom `$targets{$target}$condmsg'"); - } - } - else # $owner == TARGET_AUTOMAKE - { - if ($oldowner == TARGET_USER) - { - # Don't overwrite the user definition of TARGET. - return (); - } - else # $oldowner == TARGET_AUTOMAKE - { - # Automake should ignore redefinitions of its own - # rules if they came from the same file. This makes - # it easier to process a Makefile fragment several times. - # Hower it's an error if the target is defined in many - # files. E.g., the user might be using bin_PROGRAMS = ctags - # which clashes with our `ctags' rule. - # (It would be more accurate if we had a way to compare - # the *content* of both rules. Then $targets_source would - # be useless.) - my $oldsource = $target_source{$target}{$cond}; - return () if $source eq $oldsource; - - msg ('syntax', $where, "redefinition of `$target'$condmsg..."); - msg_cond_target ('syntax', $cond, $target, - "... `$target' previously defined here."); - return (); - } - } - # Never reached. - prog_error ("Unreachable place reached."); - } - - # Conditions for which the rule should be defined. - my @conds = $cond; - - # Check ambiguous conditional definitions. - my ($message, $ambig_cond) = - conditional_ambiguous_p ($target, $cond, keys %{$targets{$target}}); - if ($message) # We have an ambiguty. - { - if ($owner == TARGET_USER) - { - # For user rules, just diagnose the ambiguity. - msg 'syntax', $where, "$message ..."; - msg_cond_target ('syntax', $ambig_cond, $target, - "... `$target' previously defined here."); - return (); - } - else - { - # FIXME: for Automake rules, we can't diagnose ambiguities yet. - # The point is that Automake doesn't propagate conditionals - # everywhere. For instance &handle_PROGRAMS doesn't care if - # bin_PROGRAMS was defined conditionally or not. - # On the following input - # if COND1 - # foo: - # ... - # else - # bin_PROGRAMS = foo - # endif - # &handle_PROGRAMS will attempt to define a `foo:' rule - # in condition TRUE (which conflicts with COND1). Fixing - # this in &handle_PROGRAMS and siblings seems hard: you'd - # have to explain &file_contents what to do with a - # conditional. So for now we do our best *here*. If `foo:' - # was already defined in condition COND1 and we want to define - # it in condition TRUE, then define it only in condition !COND1. - # (See cond14.test and cond15.test for some test cases.) - my @defined_conds = keys %{$targets{$target}}; - @conds = (); - for my $undefined_cond (invert_conditions(@defined_conds)) - { - push @conds, make_condition ($cond, $undefined_cond); - } - # No conditions left to define the rule. - # Warn, because our workaround is meaningless in this case. - if (scalar @conds == 0) - { - msg 'syntax', $where, "$message ..."; - msg_cond_target ('syntax', $ambig_cond, $target, - "... `$target' previously defined here."); - return (); - } - } - } - - # Finally define this rule. - for my $c (@conds) - { - $targets{$target}{$c} = $where; - $target_source{$target}{$c} = $source; - $target_owner{$target}{$c} = $owner; - $target_name{$target}{$c} = $realtarget; - } - - # Check the rule for being a suffix rule. If so, store in a hash. - # Either it's a rule for two known extensions... - if ($target =~ /^($KNOWN_EXTENSIONS_PATTERN)($KNOWN_EXTENSIONS_PATTERN)$/ - # ...or it's a rule with unknown extensions (.i.e, the rule looks like - # `.foo.bar:' but `.foo' or `.bar' are not declared in SUFFIXES - # and are not known language extensions). - # Automake will complete SUFFIXES from @suffixes automatically - # (see handle_footer). - || ($target =~ /$SUFFIX_RULE_PATTERN/o && accept_extensions($1))) - { - register_suffix_rule ($where, $1, $2); - } - - # Return "" instead of TRUE so it can be used with make_paragraphs - # directly. - return "" if 1 == @conds && $conds[0] eq 'TRUE'; - return @conds; -} - - -# See if a target exists. -sub target_defined -{ - my ($target) = @_; - return exists $targets{$target}; -} - - -################################################################ - -# &append_comments ($VARIABLE, $SPACING, $COMMENT) -# ------------------------------------------------ -# Apped $COMMENT to the other comments for $VARIABLE, using -# $SPACING as separator. -sub append_comments ($$$$) -{ - my ($cond, $var, $spacing, $comment) = @_; - $var_comment{$var}{$cond} .= $spacing - if (!defined $var_comment{$var}{$cond} - || $var_comment{$var}{$cond} !~ /\n$/o); - $var_comment{$var}{$cond} .= $comment; -} - - -# &read_am_file ($AMFILE) -# ----------------------- -# Read Makefile.am and set up %contents. Simultaneously copy lines -# from Makefile.am into $output_trailer or $output_vars as -# appropriate. NOTE we put rules in the trailer section. We want -# user rules to come after our generated stuff. -sub read_am_file ($) -{ - my ($amfile) = @_; - - my $am_file = new Automake::XFile ("< $amfile"); - verb "reading $amfile"; - - my $spacing = ''; - my $comment = ''; - my $blank = 0; - my $saw_bk = 0; - - use constant IN_VAR_DEF => 0; - use constant IN_RULE_DEF => 1; - use constant IN_COMMENT => 2; - my $prev_state = IN_RULE_DEF; - - while ($_ = $am_file->getline) - { - if (/$IGNORE_PATTERN/o) - { - # Merely delete comments beginning with two hashes. - } - elsif (/$WHITE_PATTERN/o) - { - err "$amfile:$.", "blank line following trailing backslash" - if $saw_bk; - # Stick a single white line before the incoming macro or rule. - $spacing = "\n"; - $blank = 1; - # Flush all comments seen so far. - if ($comment ne '') - { - $output_vars .= $comment; - $comment = ''; - } - } - elsif (/$COMMENT_PATTERN/o) - { - # Stick comments before the incoming macro or rule. Make - # sure a blank line preceeds first block of comments. - $spacing = "\n" unless $blank; - $blank = 1; - $comment .= $spacing . $_; - $spacing = ''; - $prev_state = IN_COMMENT; - } - else - { - last; - } - $saw_bk = /\\$/ && ! /$IGNORE_PATTERN/o; - } - - # We save the conditional stack on entry, and then check to make - # sure it is the same on exit. This lets us conditonally include - # other files. - my @saved_cond_stack = @cond_stack; - my $cond = conditional_string (@cond_stack); - - my $last_var_name = ''; - my $last_var_type = ''; - my $last_var_value = ''; - # FIXME: shouldn't use $_ in this loop; it is too big. - while ($_) - { - my $here = "$amfile:$."; - - # Make sure the line is \n-terminated. - chomp; - $_ .= "\n"; - - # Don't look at MAINTAINER_MODE_TRUE here. That shouldn't be - # used by users. @MAINT@ is an anachronism now. - $_ =~ s/\@MAINT\@//g - unless $seen_maint_mode; - - my $new_saw_bk = /\\$/ && ! /$IGNORE_PATTERN/o; - - if (/$IGNORE_PATTERN/o) - { - # Merely delete comments beginning with two hashes. - } - elsif (/$WHITE_PATTERN/o) - { - # Stick a single white line before the incoming macro or rule. - $spacing = "\n"; - err $here, "blank line following trailing backslash" - if $saw_bk; - } - elsif (/$COMMENT_PATTERN/o) - { - # Stick comments before the incoming macro or rule. - $comment .= $spacing . $_; - $spacing = ''; - err $here, "comment following trailing backslash" - if $saw_bk && $comment eq ''; - $prev_state = IN_COMMENT; - } - elsif ($saw_bk) - { - if ($prev_state == IN_RULE_DEF) - { - $output_trailer .= &make_condition (@cond_stack); - $output_trailer .= $_; - } - elsif ($prev_state == IN_COMMENT) - { - # If the line doesn't start with a `#', add it. - # We do this because a continuated comment like - # # A = foo \ - # bar \ - # baz - # is not portable. BSD make doesn't honor - # escaped newlines in comments. - s/^#?/#/; - $comment .= $spacing . $_; - } - else # $prev_state == IN_VAR_DEF - { - $last_var_value .= ' ' - unless $last_var_value =~ /\s$/; - $last_var_value .= $_; - - if (!/\\$/) - { - append_comments ($cond || 'TRUE', - $last_var_name, $spacing, $comment); - $comment = $spacing = ''; - macro_define ($last_var_name, VAR_MAKEFILE, - $last_var_type, $cond, - $last_var_value, $here) - if $cond ne 'FALSE'; - push (@var_list, $last_var_name); - } - } - } - - elsif (/$IF_PATTERN/o) - { - $cond = cond_stack_if ($1, $2, $here); - } - elsif (/$ELSE_PATTERN/o) - { - $cond = cond_stack_else ($1, $2, $here); - } - elsif (/$ENDIF_PATTERN/o) - { - $cond = cond_stack_endif ($1, $2, $here); - } - - elsif (/$RULE_PATTERN/o) - { - # Found a rule. - $prev_state = IN_RULE_DEF; - - # For now we have to output all definitions of user rules - # and can't diagnose duplicates (see the comment in - # rule_define). So we go on and ignore the return value. - rule_define ($1, $amfile, TARGET_USER, $cond || 'TRUE', $here); - - check_variable_expansions ($_, $here); - - $output_trailer .= $comment . $spacing; - $output_trailer .= &make_condition (@cond_stack); - $output_trailer .= $_; - $comment = $spacing = ''; - } - elsif (/$ASSIGNMENT_PATTERN/o) - { - # Found a macro definition. - $prev_state = IN_VAR_DEF; - $last_var_name = $1; - $last_var_type = $2; - $last_var_value = $3; - if ($3 ne '' && substr ($3, -1) eq "\\") - { - # We preserve the `\' because otherwise the long lines - # that are generated will be truncated by broken - # `sed's. - $last_var_value = $3 . "\n"; - } - - if (!/\\$/) - { - # Accumulating variables must not be output. - append_comments ($cond || 'TRUE', - $last_var_name, $spacing, $comment); - $comment = $spacing = ''; - - macro_define ($last_var_name, VAR_MAKEFILE, - $last_var_type, $cond, - $last_var_value, $here) - if $cond ne 'FALSE'; - push (@var_list, $last_var_name); - } - } - elsif (/$INCLUDE_PATTERN/o) - { - my $path = $1; - - if ($path =~ s/^\$\(top_srcdir\)\///) - { - push (@include_stack, "\$\(top_srcdir\)/$path"); - # Distribute any included file. - - # Always use the $(top_srcdir) prefix in DIST_COMMON, - # otherwise OSF make will implicitely copy the included - # file in the build tree during `make distdir' to satisfy - # the dependency. - # (subdircond2.test and subdircond3.test will fail.) - push_dist_common ("\$\(top_srcdir\)/$path"); - } - else - { - $path =~ s/\$\(srcdir\)\///; - push (@include_stack, "\$\(srcdir\)/$path"); - # Always use the $(srcdir) prefix in DIST_COMMON, - # otherwise OSF make will implicitely copy the included - # file in the build tree during `make distdir' to satisfy - # the dependency. - # (subdircond2.test and subdircond3.test will fail.) - push_dist_common ("\$\(srcdir\)/$path"); - $path = $relative_dir . "/" . $path; - } - &read_am_file ($path); - } - else - { - # This isn't an error; it is probably a continued rule. - # In fact, this is what we assume. - $prev_state = IN_RULE_DEF; - check_variable_expansions ($_, $here); - $output_trailer .= $comment . $spacing; - $output_trailer .= &make_condition (@cond_stack); - $output_trailer .= $_; - $comment = $spacing = ''; - err $here, "`#' comment at start of rule is unportable" - if $_ =~ /^\t\s*\#/; - } - - $saw_bk = $new_saw_bk; - $_ = $am_file->getline; - } - - $output_trailer .= $comment; - - err_am (@cond_stack ? "unterminated conditionals: @cond_stack" - : "too many conditionals closed in include file") - if "@saved_cond_stack" ne "@cond_stack"; -} - - -# define_standard_variables () -# ---------------------------- -# A helper for read_main_am_file which initializes configure variables -# and variables from header-vars.am. -sub define_standard_variables -{ - my $saved_output_vars = $output_vars; - my ($comments, undef, $rules) = - file_contents_internal (1, "$libdir/am/header-vars.am"); - - # This will output the definitions in $output_vars, which we don't - # want... - foreach my $var (sort keys %configure_vars) - { - &define_configure_variable ($var); - push (@var_list, $var); - } - - # ... hence, we restore $output_vars. - $output_vars = $saved_output_vars . $comments . $rules; -} - -# Read main am file. -sub read_main_am_file -{ - my ($amfile) = @_; - - # This supports the strange variable tricks we are about to play. - prog_error (macros_dump () . "variable defined before read_main_am_file") - if (scalar keys %var_value > 0); - - # Generate copyright header for generated Makefile.in. - # We do discard the output of predefined variables, handled below. - $output_vars = ("# $in_file_name generated by automake " - . $VERSION . " from $am_file_name.\n"); - $output_vars .= '# ' . subst ('configure_input') . "\n"; - $output_vars .= $gen_copyright; - - # We want to predefine as many variables as possible. This lets - # the user set them with `+=' in Makefile.am. However, we don't - # want these initial definitions to end up in the output quite - # yet. So we just load them, but output them later. - &define_standard_variables; - - # Read user file, which might override some of our values. - &read_am_file ($amfile); - - # Output all the Automake variables. If the user changed one, - # then it is now marked as VAR_CONFIGURE or VAR_MAKEFILE. - foreach my $var (uniq @var_list) - { - # Some variables, like AMDEPBACKSLASH are in @var_list - # but don't have a owner. This is good, because we don't want - # to output them. - foreach my $cond (keys %{$var_owner{$var}}) - { - variable_output ($var, $cond) - if $var_owner{$var}{$cond} == VAR_AUTOMAKE; - } - } - - # Now dump the user variables that were defined. We do it in the same - # order in which they were defined (skipping duplicates). - foreach my $var (uniq @var_list) - { - foreach my $cond (keys %{$var_owner{$var}}) - { - variable_output ($var, $cond) - if $var_owner{$var}{$cond} != VAR_AUTOMAKE; - } - } -} - -################################################################ - -# $FLATTENED -# &flatten ($STRING) -# ------------------ -# Flatten the $STRING and return the result. -sub flatten -{ - $_ = shift; - - s/\\\n//somg; - s/\s+/ /g; - s/^ //; - s/ $//; - - return $_; -} - - -# @PARAGRAPHS -# &make_paragraphs ($MAKEFILE, [%TRANSFORM]) -# ------------------------------------------ -# Load a $MAKEFILE, apply the %TRANSFORM, and return it as a list of -# paragraphs. -sub make_paragraphs ($%) -{ - my ($file, %transform) = @_; - - # Complete %transform with global options and make it a Perl - # $command. - my $command = - "s/$IGNORE_PATTERN//gm;" - . transform (%transform, - - 'CYGNUS' => $cygnus_mode, - 'MAINTAINER-MODE' - => $seen_maint_mode ? subst ('MAINTAINER_MODE_TRUE') : '', - - 'SHAR' => $options{'dist-shar'} || 0, - 'BZIP2' => $options{'dist-bzip2'} || 0, - 'ZIP' => $options{'dist-zip'} || 0, - 'COMPRESS' => $options{'dist-tarZ'} || 0, - - 'INSTALL-INFO' => !$options{'no-installinfo'}, - 'INSTALL-MAN' => !$options{'no-installman'}, - 'CK-NEWS' => $options{'check-news'} || 0, - - 'SUBDIRS' => variable_defined ('SUBDIRS'), - 'TOPDIR' => backname ($relative_dir), - 'TOPDIR_P' => $relative_dir eq '.', - 'CONFIGURE-AC' => $configure_ac, - - 'BUILD' => $seen_canonical == AC_CANONICAL_SYSTEM, - 'HOST' => $seen_canonical, - 'TARGET' => $seen_canonical == AC_CANONICAL_SYSTEM, - - 'LIBTOOL' => variable_defined ('LIBTOOL')) - # We don't need more than two consecutive new-lines. - . 's/\n{3,}/\n\n/g'; - - # Swallow the file and apply the COMMAND. - my $fc_file = new Automake::XFile "< $file"; - # Looks stupid? - verb "reading $file"; - my $saved_dollar_slash = $/; - undef $/; - $_ = $fc_file->getline; - $/ = $saved_dollar_slash; - eval $command; - $fc_file->close; - my $content = $_; - - # Split at unescaped new lines. - my @lines = split (/(? 0 } @prefixes; - $valid{'EXTRA'} = 0; - foreach my $varname (keys %var_value) - { - # Automake is allowed to define variables that look like primaries - # but which aren't. E.g. INSTALL_sh_DATA. - # Autoconf can also define variables like INSTALL_DATA, so - # ignore all configure variables (at least those which are not - # redefined in Makefile.am). - # FIXME: We should make sure that these variables are not - # conditionally defined (or else adjust the condition below). - next - if (exists $var_owner{$varname} - && exists $var_owner{$varname}{'TRUE'} - && $var_owner{$varname}{'TRUE'} != VAR_MAKEFILE); - - if ($varname =~ /^(nobase_)?(dist_|nodist_)?(.*)_$primary$/) - { - my ($base, $dist, $X) = ($1 || '', $2 || '', $3 || ''); - if ($dist ne '' && ! $can_dist) - { - err_var ($varname, - "invalid variable `$varname': `dist' is forbidden"); - } - # Standard directories must be explicitely allowed. - elsif (! defined $valid{$X} && exists $standard_prefix{$X}) - { - err_var ($varname, - "`${X}dir' is not a legitimate directory " . - "for `$primary'"); - } - # A not explicitely valid directory is allowed if Xdir is defined. - elsif (! defined $valid{$X} && - require_variables_for_macro ($varname, "`$varname' is used", - "${X}dir")) - { - # Nothing to do. Any error message has been output - # by require_variables_for_macro. - } - else - { - # Ensure all extended prefixes are actually used. - $valid{"$base$dist$X"} = 1; - } - } - } - - # Return only those which are actually defined. - return sort grep { variable_defined ($_ . '_' . $primary) } keys %valid; -} - - -# Handle `where_HOW' variable magic. Does all lookups, generates -# install code, and possibly generates code to define the primary -# variable. The first argument is the name of the .am file to munge, -# the second argument is the primary variable (eg HEADERS), and all -# subsequent arguments are possible installation locations. Returns -# list of all values of all _HOW targets. -# -# FIXME: this should be rewritten to be cleaner. It should be broken -# up into multiple functions. -# -# Usage is: am_install_var (OPTION..., file, HOW, where...) -sub am_install_var -{ - my (@args) = @_; - - my $do_require = 1; - my $can_dist = 0; - my $default_dist = 0; - while (@args) - { - if ($args[0] eq '-noextra') - { - $do_require = 0; - } - elsif ($args[0] eq '-candist') - { - $can_dist = 1; - } - elsif ($args[0] eq '-defaultdist') - { - $default_dist = 1; - $can_dist = 1; - } - elsif ($args[0] !~ /^-/) - { - last; - } - shift (@args); - } - - my ($file, $primary, @prefix) = @args; - - # Now that configure substitutions are allowed in where_HOW - # variables, it is an error to actually define the primary. We - # allow `JAVA', as it is customarily used to mean the Java - # interpreter. This is but one of several Java hacks. Similarly, - # `PYTHON' is customarily used to mean the Python interpreter. - reject_var $primary, "`$primary' is an anachronism" - unless $primary eq 'JAVA' || $primary eq 'PYTHON'; - - # Get the prefixes which are valid and actually used. - @prefix = am_primary_prefixes ($primary, $can_dist, @prefix); - - # If a primary includes a configure substitution, then the EXTRA_ - # form is required. Otherwise we can't properly do our job. - my $require_extra; - - my @used = (); - my @result = (); - - # True if the iteration is the first one. Used for instance to - # output parts of the associated file only once. - my $first = 1; - foreach my $X (@prefix) - { - my $nodir_name = $X; - my $one_name = $X . '_' . $primary; - - my $strip_subdir = 1; - # If subdir prefix should be preserved, do so. - if ($nodir_name =~ /^nobase_/) - { - $strip_subdir = 0; - $nodir_name =~ s/^nobase_//; - } - - # If files should be distributed, do so. - my $dist_p = 0; - if ($can_dist) - { - $dist_p = (($default_dist && $nodir_name !~ /^nodist_/) - || (! $default_dist && $nodir_name =~ /^dist_/)); - $nodir_name =~ s/^(dist|nodist)_//; - } - - # Append actual contents of where_PRIMARY variable to - # result. - foreach my $rcurs (&variable_value_as_list_recursive ($one_name, 'all')) - { - # Skip configure substitutions. Possibly bogus. - if ($rcurs =~ /^\@.*\@$/) - { - if ($nodir_name eq 'EXTRA') - { - err_var ($one_name, - "`$one_name' contains configure substitution, " - . "but shouldn't"); - } - # Check here to make sure variables defined in - # configure.ac do not imply that EXTRA_PRIMARY - # must be defined. - elsif (! defined $configure_vars{$one_name}) - { - $require_extra = $one_name - if $do_require; - } - - next; - } - - push (@result, $rcurs); - } - # A blatant hack: we rewrite each _PROGRAMS primary to include - # EXEEXT. - append_exeext ($one_name) - if $primary eq 'PROGRAMS'; - # "EXTRA" shouldn't be used when generating clean targets, - # all, or install targets. We used to warn if EXTRA_FOO was - # defined uselessly, but this was annoying. - next - if $nodir_name eq 'EXTRA'; - - if ($nodir_name eq 'check') - { - push (@check, '$(' . $one_name . ')'); - } - else - { - push (@used, '$(' . $one_name . ')'); - } - - # Is this to be installed? - my $install_p = $nodir_name ne 'noinst' && $nodir_name ne 'check'; - - # If so, with install-exec? (or install-data?). - my $exec_p = ($nodir_name =~ /$EXEC_DIR_PATTERN/o); - - my $check_options_p = $install_p - && defined $options{'std-options'}; - - # Singular form of $PRIMARY. - (my $one_primary = $primary) =~ s/S$//; - $output_rules .= &file_contents ($file, - ('FIRST' => $first, - - 'PRIMARY' => $primary, - 'ONE_PRIMARY' => $one_primary, - 'DIR' => $X, - 'NDIR' => $nodir_name, - 'BASE' => $strip_subdir, - - 'EXEC' => $exec_p, - 'INSTALL' => $install_p, - 'DIST' => $dist_p, - 'CK-OPTS' => $check_options_p)); - - $first = 0; - } - - # The JAVA variable is used as the name of the Java interpreter. - # The PYTHON variable is used as the name of the Python interpreter. - if (@used && $primary ne 'JAVA' && $primary ne 'PYTHON') - { - # Define it. - define_pretty_variable ($primary, '', @used); - $output_vars .= "\n"; - } - - err_var ($require_extra, - "`$require_extra' contains configure substitution,\n" - . "but `EXTRA_$primary' not defined") - if ($require_extra && ! variable_defined ('EXTRA_' . $primary)); - - # Push here because PRIMARY might be configure time determined. - push (@all, '$(' . $primary . ')') - if @used && $primary ne 'JAVA' && $primary ne 'PYTHON'; - - # Make the result unique. This lets the user use conditionals in - # a natural way, but still lets us program lazily -- we don't have - # to worry about handling a particular object more than once. - return uniq (sort @result); -} - - -################################################################ - -# Each key in this hash is the name of a directory holding a -# Makefile.in. These variables are local to `is_make_dir'. -my %make_dirs = (); -my $make_dirs_set = 0; - -sub is_make_dir -{ - my ($dir) = @_; - if (! $make_dirs_set) - { - foreach my $iter (@configure_input_files) - { - $make_dirs{dirname ($iter)} = 1; - } - # We also want to notice Makefile.in's. - foreach my $iter (@other_input_files) - { - if ($iter =~ /Makefile\.in$/) - { - $make_dirs{dirname ($iter)} = 1; - } - } - $make_dirs_set = 1; - } - return defined $make_dirs{$dir}; -} - -################################################################ - -# This variable is local to the "require file" set of functions. -my @require_file_paths = (); - - -# &maybe_push_required_file ($DIR, $FILE, $FULLFILE) -# -------------------------------------------------- -# See if we want to push this file onto dist_common. This function -# encodes the rules for deciding when to do so. -sub maybe_push_required_file -{ - my ($dir, $file, $fullfile) = @_; - - if ($dir eq $relative_dir) - { - push_dist_common ($file); - return 1; - } - elsif ($relative_dir eq '.' && ! &is_make_dir ($dir)) - { - # If we are doing the topmost directory, and the file is in a - # subdir which does not have a Makefile, then we distribute it - # here. - push_dist_common ($fullfile); - return 1; - } - return 0; -} - - -# &require_file_internal ($WHERE, $MYSTRICT, @FILES) -# -------------------------------------------------- -# Verify that the file must exist in the current directory. -# $MYSTRICT is the strictness level at which this file becomes required. -# -# Must set require_file_paths before calling this function. -# require_file_paths is set to hold a single directory (the one in -# which the first file was found) before return. -sub require_file_internal ($$@) -{ - my ($where, $mystrict, @files) = @_; - - foreach my $file (@files) - { - my $fullfile; - my $errdir; - my $errfile; - my $save_dir; - - my $found_it = 0; - my $dangling_sym = 0; - foreach my $dir (@require_file_paths) - { - $fullfile = $dir . "/" . $file; - $errdir = $dir unless $errdir; - - # Use different name for "error filename". Otherwise on - # an error the bad file will be reported as eg - # `../../install-sh' when using the default - # config_aux_path. - $errfile = $errdir . '/' . $file; - - if (-l $fullfile && ! -f $fullfile) - { - $dangling_sym = 1; - last; - } - elsif (-f $fullfile) - { - $found_it = 1; - maybe_push_required_file ($dir, $file, $fullfile); - $save_dir = $dir; - last; - } - } - - # `--force-missing' only has an effect if `--add-missing' is - # specified. - if ($found_it && (! $add_missing || ! $force_missing)) - { - # Prune the path list. - @require_file_paths = $save_dir; - } - else - { - # If we've already looked for it, we're done. You might - # wonder why we don't do this before searching for the - # file. If we do that, then something like - # AC_OUTPUT(subdir/foo foo) will fail to put foo.in into - # DIST_COMMON. - if (! $found_it) - { - next if defined $require_file_found{$fullfile}; - $require_file_found{$fullfile} = 1; - } - - if ($strictness >= $mystrict) - { - if ($dangling_sym && $add_missing) - { - unlink ($fullfile); - } - - my $trailer = ''; - my $suppress = 0; - - # Only install missing files according to our desired - # strictness level. - my $message = "required file `$errfile' not found"; - if ($add_missing) - { - $suppress = 1; - - if (-f ("$libdir/$file")) - { - # Install the missing file. Symlink if we - # can, copy if we must. Note: delete the file - # first, in case it is a dangling symlink. - $message = "installing `$errfile'"; - # Windows Perl will hang if we try to delete a - # file that doesn't exist. - unlink ($errfile) if -f $errfile; - if ($symlink_exists && ! $copy_missing) - { - if (! symlink ("$libdir/$file", $errfile)) - { - $suppress = 0; - $trailer = "; error while making link: $!"; - } - } - elsif (system ('cp', "$libdir/$file", $errfile)) - { - $suppress = 0; - $trailer = "\n error while copying"; - } - } - - if (! maybe_push_required_file (dirname ($errfile), - $file, $errfile)) - { - if (! $found_it) - { - # We have added the file but could not push it - # into DIST_COMMON (probably because this is - # an auxiliary file and we are not processing - # the top level Makefile). This is unfortunate, - # since it means we are using a file which is not - # distributed! - - # Get Automake to be run again: on the second - # run the file will be found, and pushed into - # the toplevel DIST_COMMON automatically. - $automake_needs_to_reprocess_all_files = 1; - } - } - - # Prune the path list. - @require_file_paths = &dirname ($errfile); - } - - # If --force-missing was specified, and we have - # actually found the file, then do nothing. - next - if $found_it && $force_missing; - - msg ($suppress ? 'note' : 'error', $where, "$message$trailer"); - } - } - } -} - -# &require_file ($WHERE, $MYSTRICT, @FILES) -# ----------------------------------------- -sub require_file ($$@) -{ - my ($where, $mystrict, @files) = @_; - @require_file_paths = $relative_dir; - require_file_internal ($where, $mystrict, @files); -} - -# &require_file_with_macro ($COND, $MACRO, $MYSTRICT, @FILES) -# ----------------------------------------------------------- -sub require_file_with_macro ($$$@) -{ - my ($cond, $macro, $mystrict, @files) = @_; - require_file ($var_location{$macro}{$cond}, $mystrict, @files); -} - - -# &require_conf_file ($WHERE, $MYSTRICT, @FILES) -# ---------------------------------------------- -# Looks in configuration path, as specified by AC_CONFIG_AUX_DIR. -sub require_conf_file ($$@) -{ - my ($where, $mystrict, @files) = @_; - @require_file_paths = @config_aux_path; - require_file_internal ($where, $mystrict, @files); - my $dir = $require_file_paths[0]; - @config_aux_path = @require_file_paths; - # Avoid unsightly '/.'s. - $config_aux_dir = '$(top_srcdir)' . ($dir eq '.' ? "" : "/$dir"); -} - - -# &require_conf_file_with_macro ($COND, $MACRO, $MYSTRICT, @FILES) -# ---------------------------------------------------------------- -sub require_conf_file_with_macro ($$$@) -{ - my ($cond, $macro, $mystrict, @files) = @_; - require_conf_file ($var_location{$macro}{$cond}, $mystrict, @files); -} - -################################################################ - -# &require_build_directory ($DIRECTORY) -# ------------------------------------ -# Emit rules to create $DIRECTORY if needed, and return -# the file that any target requiring this directory should be made -# dependent upon. -sub require_build_directory ($) -{ - my $directory = shift; - my $dirstamp = "$directory/.dirstamp"; - - # Don't emit the rule twice. - if (! defined $directory_map{$directory}) - { - $directory_map{$directory} = 1; - - # Directory must be removed by `make distclean'. - $clean_files{$dirstamp} = DIST_CLEAN; - - $output_rules .= ("$dirstamp:\n" - . "\t\@\$(mkinstalldirs) $directory\n" - . "\t\@: > $dirstamp\n"); - } - - return $dirstamp; -} - -# &require_build_directory_maybe ($FILE) -# -------------------------------------- -# If $FILE lies in a subdirectory, emit a rule to create this -# directory and return the file that $FILE should be made -# dependent upon. Otherwise, just return the empty string. -sub require_build_directory_maybe ($) -{ - my $file = shift; - my $directory = dirname ($file); - - if ($directory ne '.') - { - return require_build_directory ($directory); - } - else - { - return ''; - } -} - -################################################################ - -# Push a list of files onto dist_common. -sub push_dist_common -{ - prog_error "push_dist_common run after handle_dist" - if $handle_dist_run; - macro_define ('DIST_COMMON', VAR_AUTOMAKE, '+', '', "@_", ''); -} - - -# Set strictness. -sub set_strictness -{ - $strictness_name = $_[0]; - - # FIXME: 'portability' warnings are currently disabled by default. - # Eventually we want to turn them on in GNU and GNITS modes, but - # we don't do this yet in Automake 1.7 to help the 1.6/1.7 transition. - # - # Indeed there would be only two ways to get rid of these new warnings: - # 1. adjusting Makefile.am - # This is not always easy (or wanted). Consider %-rules or - # $(function args) variables. - # 2. using -Wno-portability - # This means there is no way to have the same Makefile.am - # working both with Automake 1.6 and 1.7 (since 1.6 does not - # understand -Wno-portability). - # - # In Automake 1.8 (or whatever it is called) we can turn these - # warnings on, since -Wno-portability will not be an issue for - # the 1.7/1.8 transition. - if ($strictness_name eq 'gnu') - { - $strictness = GNU; - setup_channel 'error-gnu', silent => 0; - setup_channel 'error-gnu/warn', silent => 0, type => 'error'; - setup_channel 'error-gnits', silent => 1; - # setup_channel 'portability', silent => 0; - setup_channel 'gnu', silent => 0; - } - elsif ($strictness_name eq 'gnits') - { - $strictness = GNITS; - setup_channel 'error-gnu', silent => 0; - setup_channel 'error-gnu/warn', silent => 0, type => 'error'; - setup_channel 'error-gnits', silent => 0; - # setup_channel 'portability', silent => 0; - setup_channel 'gnu', silent => 0; - } - elsif ($strictness_name eq 'foreign') - { - $strictness = FOREIGN; - setup_channel 'error-gnu', silent => 1; - setup_channel 'error-gnu/warn', silent => 0, type => 'warning'; - setup_channel 'error-gnits', silent => 1; - # setup_channel 'portability', silent => 1; - setup_channel 'gnu', silent => 1; - } - else - { - prog_error "level `$strictness_name' not recognized\n"; - } -} - - -################################################################ - -# Glob something. Do this to avoid indentation screwups everywhere we -# want to glob. Gross! -sub my_glob -{ - my ($pat) = @_; - return <${pat}>; -} - -################################################################ - -# INTEGER -# require_variables ($WHERE, $REASON, $COND, @VARIABLES) -# ------------------------------------------------------ -# Make sure that each supplied variable is defined in $COND. -# Otherwise, issue a warning. If we know which macro can -# define this variable, hint the user. -# Return the number of undefined variables. -sub require_variables ($$$@) -{ - my ($where, $reason, $cond, @vars) = @_; - my $res = 0; - $reason .= ' but ' unless $reason eq ''; - - VARIABLE: - foreach my $var (@vars) - { - # Nothing to do if the variable exists. The $configure_vars test - # needed for strange variables like AMDEPBACKSLASH or ANSI2KNR - # that are AC_SUBST'ed but never macro_define'd. - next VARIABLE - if ((exists $var_value{$var} && exists $var_value{$var}{$cond}) - || exists $configure_vars{$var}); - - my @undef_cond = variable_not_always_defined_in_cond $var, $cond; - next VARIABLE - unless @undef_cond; - - my $text = "$reason`$var' is undefined\n"; - if (@undef_cond && $undef_cond[0] ne 'TRUE') - { - $text .= ("in the following conditions:\n " - . join ("\n ", @undef_cond)); - } - - ++$res; - - if (exists $am_macro_for_var{$var}) - { - $text .= "\nThe usual way to define `$var' is to add " - . "`$am_macro_for_var{$var}'\nto `$configure_ac' and run " - . "`aclocal' and `autoconf' again."; - } - elsif (exists $ac_macro_for_var{$var}) - { - $text .= "\nThe usual way to define `$var' is to add " - . "`$ac_macro_for_var{$var}'\nto `$configure_ac' and run " - . "`autoconf' again."; - } - - err $where, $text, uniq_scope => US_GLOBAL; - } - return $res; -} - -# INTEGER -# require_variables_for_macro ($MACRO, $REASON, @VARIABLES) -# --------------------------------------------------------- -# Same as require_variables, but take a macro mame as first argument. -sub require_variables_for_macro ($$@) -{ - my ($macro, $reason, @args) = @_; - for my $cond (keys %{$var_value{$macro}}) - { - return require_variables ($var_location{$macro}{$cond}, $reason, - $cond, @args); - } -} - -# Print usage information. -sub usage () -{ - print "Usage: $0 [OPTION] ... [Makefile]... - -Generate Makefile.in for configure from Makefile.am. - -Operation modes: - --help print this help, then exit - --version print version number, then exit - -v, --verbose verbosely list files processed - --no-force only update Makefile.in's that are out of date - -W, --warnings=CATEGORY report the warnings falling in CATEGORY - -Dependency tracking: - -i, --ignore-deps disable dependency tracking code - --include-deps enable dependency tracking code - -Flavors: - --cygnus assume program is part of Cygnus-style tree - --foreign set strictness to foreign - --gnits set strictness to gnits - --gnu set strictness to gnu - -Library files: - -a, --add-missing add missing standard files to package - --libdir=DIR directory storing library files - -c, --copy with -a, copy missing files (default is symlink) - -f, --force-missing force update of standard files - -Warning categories include: - `gnu' GNU coding standards (default in gnu and gnits modes) - `obsolete' obsolete features or constructions - `portability' portability issues - `syntax' dubious syntactic constructs (default) - `unsupported' unsupported or incomplete features (default) - `all' all the warnings - `no-CATEGORY' turn off warnings in CATEGORY - `none' turn off all the warnings - `error' treat warnings as errors -"; - - my ($last, @lcomm); - $last = ''; - foreach my $iter (sort ((@common_files, @common_sometimes))) - { - push (@lcomm, $iter) unless $iter eq $last; - $last = $iter; - } - - my @four; - print "\nFiles which are automatically distributed, if found:\n"; - format USAGE_FORMAT = - @<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<< - $four[0], $four[1], $four[2], $four[3] -. - $~ = "USAGE_FORMAT"; - - my $cols = 4; - my $rows = int(@lcomm / $cols); - my $rest = @lcomm % $cols; - - if ($rest) - { - $rows++; - } - else - { - $rest = $cols; - } - - for (my $y = 0; $y < $rows; $y++) - { - @four = ("", "", "", ""); - for (my $x = 0; $x < $cols; $x++) - { - last if $y + 1 == $rows && $x == $rest; - - my $idx = (($x > $rest) - ? ($rows * $rest + ($rows - 1) * ($x - $rest)) - : ($rows * $x)); - - $idx += $y; - $four[$x] = $lcomm[$idx]; - } - write; - } - - print "\nReport bugs to .\n"; - - # --help always returns 0 per GNU standards. - exit 0; -} - - -# &version () -# ----------- -# Print version information -sub version () -{ - print <. - -Copyright 2002 Free Software Foundation, Inc. -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -EOF - # --version always returns 0 per GNU standards. - exit 0; -} - -### Setup "GNU" style for perl-mode and cperl-mode. -## Local Variables: -## perl-indent-level: 2 -## perl-continued-statement-offset: 2 -## perl-continued-brace-offset: 0 -## perl-brace-offset: 0 -## perl-brace-imaginary-offset: 0 -## perl-label-offset: -2 -## cperl-indent-level: 2 -## cperl-brace-offset: 0 -## cperl-continued-brace-offset: 0 -## cperl-label-offset: -2 -## cperl-extra-newline-before-brace: t -## cperl-merge-trailing-else: nil -## cperl-continued-statement-offset: 2 -## End: diff --git a/bin/automake-1.7 b/bin/automake-1.7 deleted file mode 100644 index 22d974db..00000000 --- a/bin/automake-1.7 +++ /dev/null @@ -1,9229 +0,0 @@ -#!/bin/perl -w -# -*- perl -*- -# Makefile. Generated from Makefile.in by configure. - -eval 'case $# in 0) exec /bin/perl -S "$0";; *) exec /bin/perl -S "$0" "$@";; esac' - if 0; - -# automake - create Makefile.in from Makefile.am -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 -# Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# Originally written by David Mackenzie . -# Perl reimplementation by Tom Tromey . - -package Language; - -BEGIN -{ - my $perllibdir = $ENV{'perllibdir'} || '/usr/share/automake-1.7'; - unshift @INC, $perllibdir; -} - -use Automake::Struct; -struct (# Short name of the language (c, f77...). - 'name' => "\$", - # Nice name of the language (C, Fortran 77...). - 'Name' => "\$", - - # List of configure variables which must be defined. - 'config_vars' => '@', - - 'ansi' => "\$", - # `pure' is `1' or `'. A `pure' language is one where, if - # all the files in a directory are of that language, then we - # do not require the C compiler or any code to call it. - 'pure' => "\$", - - 'autodep' => "\$", - - # Name of the compiling variable (COMPILE). - 'compiler' => "\$", - # Content of the compiling variable. - 'compile' => "\$", - # Flag to require compilation without linking (-c). - 'compile_flag' => "\$", - 'extensions' => '@', - # A subroutine to compute a list of possible extensions of - # the product given the input extensions. - # (defaults to a subroutine which returns ('.$(OBJEXT)', '.lo')) - 'output_extensions' => "\$", - # A list of flag variables used in 'compile'. - # (defaults to []) - 'flags' => "@", - - # The file to use when generating rules for this language. - # The default is 'depend2'. - 'rule_file' => "\$", - - # Name of the linking variable (LINK). - 'linker' => "\$", - # Content of the linking variable. - 'link' => "\$", - - # Name of the linker variable (LD). - 'lder' => "\$", - # Content of the linker variable ($(CC)). - 'ld' => "\$", - - # Flag to specify the output file (-o). - 'output_flag' => "\$", - '_finish' => "\$", - - # This is a subroutine which is called whenever we finally - # determine the context in which a source file will be - # compiled. - '_target_hook' => "\$"); - - -sub finish ($) -{ - my ($self) = @_; - if (defined $self->_finish) - { - &{$self->_finish} (); - } -} - -sub target_hook ($$$$) -{ - my ($self) = @_; - if (defined $self->_target_hook) - { - &{$self->_target_hook} (@_); - } -} - -package Automake; - -use strict 'vars', 'subs'; -use Automake::General; -use Automake::XFile; -use Automake::Channels; -use File::Basename; -use Carp; - -## ----------- ## -## Constants. ## -## ----------- ## - -# Parameters set by configure. Not to be changed. NOTE: assign -# VERSION as string so that eg version 0.30 will print correctly. -my $VERSION = '1.7.1'; -my $PACKAGE = 'automake'; -my $libdir = '/usr/share/automake-1.7'; - -# Some regular expressions. One reason to put them here is that it -# makes indentation work better in Emacs. - -# Writting singled-quoted-$-terminated regexes is a pain because -# perl-mode thinks of $' as the ${'} variable (intead of a $ followed -# by a closing quote. Letting perl-mode think the quote is not closed -# leads to all sort of misindentations. On the other hand, defining -# regexes as double-quoted strings is far less readable. So usually -# we will write: -# -# $REGEX = '^regex_value' . "\$"; - -my $IGNORE_PATTERN = '^\s*##([^#\n].*)?\n'; -my $WHITE_PATTERN = '^\s*' . "\$"; -my $COMMENT_PATTERN = '^#'; -my $TARGET_PATTERN='[$a-zA-Z_.@%][-.a-zA-Z0-9_(){}/$+@%]*'; -# A rule has three parts: a list of targets, a list of dependencies, -# and optionally actions. -my $RULE_PATTERN = - "^($TARGET_PATTERN(?:(?:\\\\\n|\\s)+$TARGET_PATTERN)*) *:([^=].*|)\$"; - -my $SUFFIX_RULE_PATTERN = - '^(\.[a-zA-Z0-9_(){}$+@]+)(\.[a-zA-Z0-9_(){}$+@]+)' . "\$"; -# Only recognize leading spaces, not leading tabs. If we recognize -# leading tabs here then we need to make the reader smarter, because -# otherwise it will think rules like `foo=bar; \' are errors. -my $MACRO_PATTERN = '^[.A-Za-z0-9_@]+' . "\$"; -my $ASSIGNMENT_PATTERN = '^ *([^ \t=:+]*)\s*([:+]?)=\s*(.*)' . "\$"; -# This pattern recognizes a Gnits version id and sets $1 if the -# release is an alpha release. We also allow a suffix which can be -# used to extend the version number with a "fork" identifier. -my $GNITS_VERSION_PATTERN = '\d+\.\d+([a-z]|\.\d+)?(-[A-Za-z0-9]+)?'; - -my $IF_PATTERN = '^if\s+(!?)\s*([A-Za-z][A-Za-z0-9_]*)\s*(?:#.*)?' . "\$"; -my $ELSE_PATTERN = - '^else(?:\s+(!?)\s*([A-Za-z][A-Za-z0-9_]*))?\s*(?:#.*)?' . "\$"; -my $ENDIF_PATTERN = - '^endif(?:\s+(!?)\s*([A-Za-z][A-Za-z0-9_]*))?\s*(?:#.*)?' . "\$"; -my $PATH_PATTERN = '(\w|[/.-])+'; -# This will pass through anything not of the prescribed form. -my $INCLUDE_PATTERN = ('^include\s+' - . '((\$\(top_srcdir\)/' . $PATH_PATTERN . ')' - . '|(\$\(srcdir\)/' . $PATH_PATTERN . ')' - . '|([^/\$]' . $PATH_PATTERN . '))\s*(#.*)?' . "\$"); - -# This handles substitution references like ${foo:.a=.b}. -my $SUBST_REF_PATTERN = "^([^:]*):([^=]*)=(.*)\$"; - -# Match `-d' as a command-line argument in a string. -my $DASH_D_PATTERN = "(^|\\s)-d(\\s|\$)"; -# Directories installed during 'install-exec' phase. -my $EXEC_DIR_PATTERN = - '^(?:bin|sbin|libexec|sysconf|localstate|lib|pkglib|.*exec.*)' . "\$"; - -# Constants to define the "strictness" level. -use constant FOREIGN => 0; -use constant GNU => 1; -use constant GNITS => 2; - -# Values for AC_CANONICAL_* -use constant AC_CANONICAL_HOST => 1; -use constant AC_CANONICAL_SYSTEM => 2; - -# Values indicating when something should be cleaned. -use constant MOSTLY_CLEAN => 0; -use constant CLEAN => 1; -use constant DIST_CLEAN => 2; -use constant MAINTAINER_CLEAN => 3; - -# Libtool files. -my @libtool_files = qw(ltmain.sh config.guess config.sub); -# ltconfig appears here for compatibility with old versions of libtool. -my @libtool_sometimes = qw(ltconfig ltcf-c.sh ltcf-cxx.sh ltcf-gcj.sh); - -# Commonly found files we look for and automatically include in -# DISTFILES. -my @common_files = - (qw(ABOUT-GNU ABOUT-NLS AUTHORS BACKLOG COPYING COPYING.DOC COPYING.LIB - COPYING.LESSER ChangeLog INSTALL NEWS README THANKS TODO acinclude.m4 - ansi2knr.1 ansi2knr.c compile config.guess config.rpath config.sub - configure configure.ac configure.in depcomp elisp-comp - install-sh libversion.in mdate-sh missing mkinstalldirs - py-compile texinfo.tex ylwrap), - @libtool_files, @libtool_sometimes); - -# Commonly used files we auto-include, but only sometimes. -my @common_sometimes = - qw(aclocal.m4 acconfig.h config.h.top config.h.bot stamp-vti); - -# Standard directories from the GNU Coding Standards, and additional -# pkg* directories from Automake. Stored in a hash for fast member check. -my %standard_prefix = - map { $_ => 1 } (qw(bin data exec include info lib libexec lisp - localstate man man1 man2 man3 man4 man5 man6 - man7 man8 man9 oldinclude pkgdatadir - pkgincludedir pkglibdir sbin sharedstate - sysconf)); - -# Declare the macros that define known variables, so we can -# hint the user if she try to use one of these variables. - -# Macros accessible via aclocal. -my %am_macro_for_var = - ( - ANSI2KNR => 'AM_C_PROTOTYPES', - CCAS => 'AM_PROG_AS', - CCASFLAGS => 'AM_PROG_AS', - EMACS => 'AM_PATH_LISPDIR', - GCJ => 'AM_PROG_GCJ', - LEX => 'AM_PROG_LEX', - LIBTOOL => 'AC_PROG_LIBTOOL', - lispdir => 'AM_PATH_LISPDIR', - pkgpyexecdir => 'AM_PATH_PYTHON', - pkgpythondir => 'AM_PATH_PYTHON', - pyexecdir => 'AM_PATH_PYTHON', - PYTHON => 'AM_PATH_PYTHON', - pythondir => 'AM_PATH_PYTHON', - U => 'AM_C_PROTOTYPES', - ); - -# Macros shipped with Autoconf. -my %ac_macro_for_var = - ( - CC => 'AC_PROG_CC', - CFLAGS => 'AC_PROG_CC', - CXX => 'AC_PROG_CXX', - CXXFLAGS => 'AC_PROG_CXX', - F77 => 'AC_PROG_F77', - F77FLAGS => 'AC_PROG_F77', - RANLIB => 'AC_PROG_RANLIB', - YACC => 'AC_PROG_YACC', - ); - -# Copyright on generated Makefile.ins. -my $gen_copyright = "\ -# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 -# Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. -"; - -# These constants are returned by lang_*_rewrite functions. -# LANG_SUBDIR means that the resulting object file should be in a -# subdir if the source file is. In this case the file name cannot -# have `..' components. -use constant LANG_IGNORE => 0; -use constant LANG_PROCESS => 1; -use constant LANG_SUBDIR => 2; - -# These are used when keeping track of whether an object can be built -# by two different paths. -use constant COMPILE_LIBTOOL => 1; -use constant COMPILE_ORDINARY => 2; - - - -## ---------------------------------- ## -## Variables related to the options. ## -## ---------------------------------- ## - -# TRUE if we should always generate Makefile.in. -my $force_generation = 1; - -# Strictness level as set on command line. -my $default_strictness = GNU; - -# Name of strictness level, as set on command line. -my $default_strictness_name = 'gnu'; - -# This is TRUE if automatic dependency generation code should be -# included in generated Makefile.in. -my $cmdline_use_dependencies = 1; - -# From the Perl manual. -my $symlink_exists = (eval 'symlink ("", "");', $@ eq ''); - -# TRUE if missing standard files should be installed. -my $add_missing = 0; - -# TRUE if we should copy missing files; otherwise symlink if possible. -my $copy_missing = 0; - -# TRUE if we should always update files that we know about. -my $force_missing = 0; - - -## ---------------------------------------- ## -## Variables filled during files scanning. ## -## ---------------------------------------- ## - -# Name of the top autoconf input: `configure.ac' or `configure.in'. -my $configure_ac = ''; - -# Files found by scanning configure.ac for LIBOBJS. -my %libsources = (); - -# Names used in AC_CONFIG_HEADER call. -my @config_headers = (); -# Where AC_CONFIG_HEADER appears. -my $config_header_location; - -# Directory where output files go. Actually, output files are -# relative to this directory. -my $output_directory; - -# List of Makefile.am's to process, and their corresponding outputs. -my @input_files = (); -my %output_files = (); - -# Complete list of Makefile.am's that exist. -my @configure_input_files = (); - -# List of files in AC_CONFIG_FILES/AC_OUTPUT without Makefile.am's, -# and their outputs. -my @other_input_files = (); -# Where the last AC_CONFIG_FILES/AC_OUTPUT appears. -my $ac_config_files_location; - -# List of directories to search for configure-required files. This -# can be set by AC_CONFIG_AUX_DIR. -my @config_aux_path = qw(. .. ../..); -my $config_aux_dir = ''; -my $config_aux_dir_set_in_configure_in = 0; - -# Whether AM_GNU_GETTEXT has been seen in configure.ac. -my $seen_gettext = 0; -# Whether AM_GNU_GETTEXT([external]) is used. -my $seen_gettext_external = 0; -# Where AM_GNU_GETTEXT appears. -my $ac_gettext_location; - -# TRUE if we've seen AC_CANONICAL_(HOST|SYSTEM). -my $seen_canonical = 0; -my $canonical_location; - -# Where AM_MAINTAINER_MODE appears. -my $seen_maint_mode; - -# Actual version we've seen. -my $package_version = ''; - -# Where version is defined. -my $package_version_location; - -# TRUE if we've seen AC_ENABLE_MULTILIB. -my $seen_multilib = 0; - -# TRUE if we've seen AM_PROG_CC_C_O -my $seen_cc_c_o = 0; - -# Where AM_INIT_AUTOMAKE is called; -my $seen_init_automake = 0; - -# TRUE if we've seen AM_AUTOMAKE_VERSION. -my $seen_automake_version = 0; - -# Hash table of discovered configure substitutions. Keys are names, -# values are `FILE:LINE' strings which are used by error message -# generation. -my %configure_vars = (); - -# This is used to keep track of which variable definitions we are -# scanning. It is only used in certain limited ways, but it has to be -# global. It is declared just for documentation purposes. -my %vars_scanned = (); - -# TRUE if --cygnus seen. -my $cygnus_mode = 0; - -# Hash table of AM_CONDITIONAL variables seen in configure. -my %configure_cond = (); - -# This maps extensions onto language names. -my %extension_map = (); - -# List of the DIST_COMMON files we discovered while reading -# configure.in -my $configure_dist_common = ''; - -# This maps languages names onto objects. -my %languages = (); - -# List of targets we must always output. -# FIXME: Complete, and remove falsely required targets. -my %required_targets = - ( - 'all' => 1, - 'dvi' => 1, - 'pdf' => 1, - 'ps' => 1, - 'info' => 1, - 'install-info' => 1, - 'install' => 1, - 'install-data' => 1, - 'install-exec' => 1, - 'uninstall' => 1, - - # FIXME: Not required, temporary hacks. - # Well, actually they are sort of required: the -recursive - # targets will run them anyway... - 'dvi-am' => 1, - 'pdf-am' => 1, - 'ps-am' => 1, - 'info-am' => 1, - 'install-data-am' => 1, - 'install-exec-am' => 1, - 'installcheck-am' => 1, - 'uninstall-am' => 1, - - 'install-man' => 1, - ); - -# This is set to 1 when Automake needs to be run again. -# (For instance, this happens when an auxiliary file such as -# depcomp is added after the toplevel Makefile.in -- which -# should distribute depcomp -- has been generated.) -my $automake_needs_to_reprocess_all_files = 0; - -# Options set via AM_INIT_AUTOMAKE. -my $global_options = ''; - -# Same as $suffix_rules (declared below), but records only the -# default rules supplied by the languages Automake supports. -my $suffix_rules_default; - -# If a file name appears as a key in this hash, then it has already -# been checked for. This variable is local to the "require file" -# functions. -my %require_file_found = (); - - -################################################################ - -## ------------------------------------------ ## -## Variables reset by &initialize_per_input. ## -## ------------------------------------------ ## - -# Basename and relative dir of the input file. -my $am_file_name; -my $am_relative_dir; - -# Same but wrt Makefile.in. -my $in_file_name; -my $relative_dir; - -# These two variables are used when generating each Makefile.in. -# They hold the Makefile.in until it is ready to be printed. -my $output_rules; -my $output_vars; -my $output_trailer; -my $output_all; -my $output_header; - -# Suffixes found during a run. -my @suffixes; - -# Handling the variables. -# -# For a $VAR: -# - $var_value{$VAR}{$COND} is its value associated to $COND, -# - $var_location{$VAR}{$COND} is where it was defined, -# - $var_comment{$VAR}{$COND} are the comments associated to it. -# - $var_type{$VAR}{$COND} is how it has been defined (`', `+', or `:'), -# - $var_owner{$VAR}{$COND} tells who owns the variable (VAR_AUTOMAKE, -# VAR_CONFIGURE, or VAR_MAKEFILE). -my %var_value; -my %var_location; -my %var_comment; -my %var_type; -my %var_owner; -# Possible values for var_owner. Defined so that the owner of -# a variable can only be increased (e.g Automake should not -# override a configure or Makefile variable). -use constant VAR_AUTOMAKE => 0; # Variable defined by Automake. -use constant VAR_CONFIGURE => 1;# Variable defined in configure.ac. -use constant VAR_MAKEFILE => 2; # Variable defined in Makefile.am. - -# This holds a 1 if a particular variable was examined. -my %content_seen; - -# This holds the names which are targets. These also appear in -# %contents. $targets{TARGET}{COND} is the location of the definition -# of TARGET for condition COND. TARGETs should not include -# a trailing $(EXEEXT), we record this in %target_name. -my %targets; - -# $target_source{TARGET}{COND} is the filename where TARGET -# were defined for condition COND. Note this must be a -# filename, *without* any line number. -my %target_source; - -# $target_name{TARGET}{COND} is the real name of TARGET (in condition COND). -# The real name is often TARGET or TARGET$(EXEEXT), and TARGET never -# contain $(EXEEXT) -my %target_name; - -# $target_owner{TARGET}{COND} the owner of TARGET in condition COND. -my %target_owner; -use constant TARGET_AUTOMAKE => 0; # Target defined by Automake. -use constant TARGET_USER => 1; # Target defined in the user's Makefile.am. - -# This is the conditional stack. -my @cond_stack; - -# This holds the set of included files. -my @include_stack; - -# This holds a list of directories which we must create at `dist' -# time. This is used in some strange scenarios involving weird -# AC_OUTPUT commands. -my %dist_dirs; - -# List of dependencies for the obvious targets. -my @all; -my @check; -my @check_tests; - -# Holds the dependencies of targets which dependencies are factored. -# Typically, `.PHONY' will appear in plenty of *.am files, but must -# be output once. Arguably all pure dependencies could be subject -# to this factorization, but it is not unpleasant to have paragraphs -# in Makefile: keeping related stuff altogether. -my %dependencies; - -# Holds the factored actions. Tied to %DEPENDENCIES, i.e., filled -# only when keys exists in %DEPENDENCIES. -my %actions; - -# Keys in this hash table are files to delete. The associated -# value tells when this should happen (MOSTLY_CLEAN, DIST_CLEAN, etc.) -my %clean_files; - -# Keys in this hash table are object files or other files in -# subdirectories which need to be removed. This only holds files -# which are created by compilations. The value in the hash indicates -# when the file should be removed. -my %compile_clean_files; - -# Keys in this hash table are directories where we expect to build a -# libtool object. We use this information to decide what directories -# to delete. -my %libtool_clean_directories; - -# Value of `$(SOURCES)', used by tags.am. -my @sources; -# Sources which go in the distribution. -my @dist_sources; - -# This hash maps object file names onto their corresponding source -# file names. This is used to ensure that each object is created -# by a single source file. -my %object_map; - -# This hash maps object file names onto an integer value representing -# whether this object has been built via ordinary compilation or -# libtool compilation (the COMPILE_* constants). -my %object_compilation_map; - - -# This keeps track of the directories for which we've already -# created `.dirstamp' code. -my %directory_map; - -# All .P files. -my %dep_files; - -# Strictness levels. -my $strictness; -my $strictness_name; - -# Options from AUTOMAKE_OPTIONS. -my %options; - -# Whether or not dependencies are handled. Can be further changed -# in handle_options. -my $use_dependencies; - -# This is a list of all targets to run during "make dist". -my @dist_targets; - -# Keys in this hash are the basenames of files which must depend on -# ansi2knr. Values are either the empty string, or the directory in -# which the ANSI source file appears; the directory must have a -# trailing `/'. -my %de_ansi_files; - -# This maps the source extension for all suffix rule seen to -# a \hash whose keys are the possible output extensions. -# -# Note that this is transitively closed by construction: -# if we have -# exists $suffix_rules{$ext1}{$ext2} -# && exists $suffix_rules{$ext2}{$ext3} -# then we also have -# exists $suffix_rules{$ext1}{$ext3} -# -# So it's easy to check whether '.foo' can be transformed to '.$(OBJEXT)' -# by checking whether $suffix_rules{'.foo'}{'.$(OBJEXT)'} exist. This -# will work even if transforming '.foo' to '.$(OBJEXT)' involves a chain -# of several suffix rules. -# -# The value of `$suffix_rules{$ext1}{$ext2}' is the a pair -# `[ $next_sfx, $dist ]' where `$next_sfx' is target suffix -# for the next rule to use to reach '$ext2', and `$dist' the -# distance to `$ext2'. -my $suffix_rules; - -# This is the name of the redirect `all' target to use. -my $all_target; - -# This keeps track of which extensions we've seen (that we care -# about). -my %extension_seen; - -# This is random scratch space for the language finish functions. -# Don't randomly overwrite it; examine other uses of keys first. -my %language_scratch; - -# We keep track of which objects need special (per-executable) -# handling on a per-language basis. -my %lang_specific_files; - -# This is set when `handle_dist' has finished. Once this happens, -# we should no longer push on dist_common. -my $handle_dist_run; - -# Used to store a set of linkers needed to generate the sources currently -# under consideration. -my %linkers_used; - -# True if we need `LINK' defined. This is a hack. -my $need_link; - -# This is the list of such variables to output. -# FIXME: Might be useless actually. -my @var_list; - -# Was get_object_extension run? -# FIXME: This is a hack. a better switch should be found. -my $get_object_extension_was_run; - -# Contains a stack of `from' parts of variable substitutions currently in -# force. -my @substfroms; - -# Contains a stack of `to' parts of variable substitutions currently in -# force. -my @substtos; - -# This keeps track of all variables defined by subobjname. -# The value stored is the variable names. -# The key has the form "(COND1)VAL1(COND2)VAL2..." where VAL1 and VAL2 -# are the values of the variable for condition COND1 and COND2. -my %subobjvar = (); - -# This hash records helper variables used to implement '+=' in conditionals. -# Keys have the form "VAR:CONDITIONS". The value associated to a key is -# the named of the helper variable used to append to VAR in CONDITIONS. -my %appendvar = (); - - -## --------------------------------- ## -## Forward subroutine declarations. ## -## --------------------------------- ## -sub register_language (%); -sub file_contents_internal ($$%); -sub define_objects_from_sources ($$$$$$$); - - -# &initialize_per_input () -# ------------------------ -# (Re)-Initialize per-Makefile.am variables. -sub initialize_per_input () -{ - reset_local_duplicates (); - - $am_file_name = ''; - $am_relative_dir = ''; - - $in_file_name = ''; - $relative_dir = ''; - - $output_rules = ''; - $output_vars = ''; - $output_trailer = ''; - $output_all = ''; - $output_header = ''; - - @suffixes = (); - - %var_value = (); - %var_location = (); - %var_comment = (); - %var_type = (); - %var_owner = (); - - %content_seen = (); - - %targets = (); - %target_source = (); - %target_name = (); - %target_owner = (); - - @cond_stack = (); - - @include_stack = (); - - %dist_dirs = (); - - @all = (); - @check = (); - @check_tests = (); - - %dependencies = - ( - # Texinfoing. - 'dvi' => [], - 'dvi-am' => [], - 'pdf' => [], - 'pdf-am' => [], - 'ps' => [], - 'ps-am' => [], - 'info' => [], - 'info-am' => [], - - # Installing/uninstalling. - 'install-data-am' => [], - 'install-exec-am' => [], - 'uninstall-am' => [], - - 'install-man' => [], - 'uninstall-man' => [], - - 'install-info' => [], - 'install-info-am' => [], - 'uninstall-info' => [], - - 'installcheck-am' => [], - - # Cleaning. - 'clean-am' => [], - 'mostlyclean-am' => [], - 'maintainer-clean-am' => [], - 'distclean-am' => [], - 'clean' => [], - 'mostlyclean' => [], - 'maintainer-clean' => [], - 'distclean' => [], - - # Tarballing. - 'dist-all' => [], - - # Phoning. - '.PHONY' => [] - ); - %actions = (); - - %clean_files = (); - - @sources = (); - @dist_sources = (); - - %object_map = (); - %object_compilation_map = (); - - %directory_map = (); - - %dep_files = (); - - $strictness = $default_strictness; - $strictness_name = $default_strictness_name; - - %options = (); - - $use_dependencies = $cmdline_use_dependencies; - - @dist_targets = (); - - %de_ansi_files = (); - - - # The first time we initialize the variables, - # we save the value of $suffix_rules. - if (defined $suffix_rules_default) - { - $suffix_rules = $suffix_rules_default; - } - else - { - $suffix_rules_default = $suffix_rules; - } - - $all_target = ''; - - %extension_seen = (); - - %language_scratch = (); - - %lang_specific_files = (); - - $handle_dist_run = 0; - - $need_link = 0; - - @var_list = (); - - $get_object_extension_was_run = 0; - - %compile_clean_files = (); - - # We always include `.'. This isn't strictly correct. - %libtool_clean_directories = ('.' => 1); - - %subobjvar = (); - - %appendvar = (); -} - - -################################################################ - -# Initialize our list of error/warning channels. -# Do not forget to update &usage and the manual -# if you add or change a warning channel. - -# Fatal errors. -register_channel 'fatal', type => 'fatal'; -# Common errors. -register_channel 'error', type => 'error'; -# Errors related to GNU Standards. -register_channel 'error-gnu', type => 'error'; -# Errors related to GNU Standards that should be warnings in `foreign' mode. -register_channel 'error-gnu/warn', type => 'error'; -# Errors related to GNITS Standards (silent by default). -register_channel 'error-gnits', type => 'error', silent => 1; -# Internal errors. -register_channel 'automake', type => 'fatal', backtrace => 1, - header => ("####################\n" . - "## Internal Error ##\n" . - "####################\n"), - footer => "\nPlease contact ."; - -# Warnings related to GNU Coding Standards. -register_channel 'gnu', type => 'warning'; -# Warnings about obsolete features (silent by default). -register_channel 'obsolete', type => 'warning', silent => 1; -# Warnings about non-portable constructs. -register_channel 'portability', type => 'warning', silent => 1; -# Weird syntax, unused variables, typos... -register_channel 'syntax', type => 'warning'; -# Warnings about unsupported (or mis-supported) features. -register_channel 'unsupported', type => 'warning'; - -# For &verb. -register_channel 'verb', type => 'debug', silent => 1; -# Informative messages. -register_channel 'note', type => 'debug', silent => 0; - - -# Initialize our list of languages that are internally supported. - -# C. -register_language ('name' => 'c', - 'Name' => 'C', - 'config_vars' => ['CC'], - 'ansi' => 1, - 'autodep' => '', - 'flags' => ['CFLAGS', 'CPPFLAGS'], - 'compiler' => 'COMPILE', - 'compile' => '$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)', - 'lder' => 'CCLD', - 'ld' => '$(CC)', - 'linker' => 'LINK', - 'link' => '$(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', - 'compile_flag' => '-c', - 'extensions' => ['.c'], - '_finish' => \&lang_c_finish); - -# C++. -register_language ('name' => 'cxx', - 'Name' => 'C++', - 'config_vars' => ['CXX'], - 'linker' => 'CXXLINK', - 'link' => '$(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', - 'autodep' => 'CXX', - 'flags' => ['CXXFLAGS', 'CPPFLAGS'], - 'compile' => '$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)', - 'compiler' => 'CXXCOMPILE', - 'compile_flag' => '-c', - 'output_flag' => '-o', - 'lder' => 'CXXLD', - 'ld' => '$(CXX)', - 'pure' => 1, - 'extensions' => ['.c++', '.cc', '.cpp', '.cxx', '.C']); - -# Objective C. -register_language ('name' => 'objc', - 'Name' => 'Objective C', - 'config_vars' => ['OBJC'], - 'linker' => 'OBJCLINK',, - 'link' => '$(OBJCLD) $(AM_OBJCFLAGS) $(OBJCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', - 'autodep' => 'OBJC', - 'flags' => ['OBJCFLAGS', 'CPPFLAGS'], - 'compile' => '$(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_OBJCFLAGS) $(OBJCFLAGS)', - 'compiler' => 'OBJCCOMPILE', - 'compile_flag' => '-c', - 'output_flag' => '-o', - 'lder' => 'OBJCLD', - 'ld' => '$(OBJC)', - 'pure' => 1, - 'extensions' => ['.m']); - -# Headers. -register_language ('name' => 'header', - 'Name' => 'Header', - 'extensions' => ['.h', '.H', '.hxx', '.h++', '.hh', - '.hpp', '.inc'], - # No output. - 'output_extensions' => sub { return () }, - # Nothing to do. - '_finish' => sub { }); - -# Yacc (C & C++). -register_language ('name' => 'yacc', - 'Name' => 'Yacc', - 'config_vars' => ['YACC'], - 'flags' => ['YFLAGS'], - 'compile' => '$(YACC) $(YFLAGS) $(AM_YFLAGS)', - 'compiler' => 'YACCCOMPILE', - 'extensions' => ['.y'], - 'output_extensions' => sub { (my $ext = $_[0]) =~ tr/y/c/; - return ($ext,) }, - 'rule_file' => 'yacc', - '_finish' => \&lang_yacc_finish, - '_target_hook' => \&lang_yacc_target_hook); -register_language ('name' => 'yaccxx', - 'Name' => 'Yacc (C++)', - 'config_vars' => ['YACC'], - 'rule_file' => 'yacc', - 'flags' => ['YFLAGS'], - 'compiler' => 'YACCCOMPILE', - 'compile' => '$(YACC) $(YFLAGS) $(AM_YFLAGS)', - 'extensions' => ['.y++', '.yy', '.yxx', '.ypp'], - 'output_extensions' => sub { (my $ext = $_[0]) =~ tr/y/c/; - return ($ext,) }, - '_finish' => \&lang_yacc_finish, - '_target_hook' => \&lang_yacc_target_hook); - -# Lex (C & C++). -register_language ('name' => 'lex', - 'Name' => 'Lex', - 'config_vars' => ['LEX'], - 'rule_file' => 'lex', - 'flags' => ['LFLAGS'], - 'compile' => '$(LEX) $(LFLAGS) $(AM_LFLAGS)', - 'compiler' => 'LEXCOMPILE', - 'extensions' => ['.l'], - 'output_extensions' => sub { (my $ext = $_[0]) =~ tr/l/c/; - return ($ext,) }, - '_finish' => \&lang_lex_finish, - '_target_hook' => \&lang_lex_target_hook); -register_language ('name' => 'lexxx', - 'Name' => 'Lex (C++)', - 'config_vars' => ['LEX'], - 'rule_file' => 'lex', - 'flags' => ['LFLAGS'], - 'compile' => '$(LEX) $(LFLAGS) $(AM_LFLAGS)', - 'compiler' => 'LEXCOMPILE', - 'extensions' => ['.l++', '.ll', '.lxx', '.lpp'], - 'output_extensions' => sub { (my $ext = $_[0]) =~ tr/l/c/; - return ($ext,) }, - '_finish' => \&lang_lex_finish, - '_target_hook' => \&lang_lex_target_hook); - -# Assembler. -register_language ('name' => 'asm', - 'Name' => 'Assembler', - 'config_vars' => ['CCAS', 'CCASFLAGS'], - - 'flags' => ['CCASFLAGS'], - # Users can set AM_ASFLAGS to includes DEFS, INCLUDES, - # or anything else required. They can also set AS. - 'compile' => '$(CCAS) $(AM_CCASFLAGS) $(CCASFLAGS)', - 'compiler' => 'CCASCOMPILE', - 'compile_flag' => '-c', - 'extensions' => ['.s', '.S'], - - # With assembly we still use the C linker. - '_finish' => \&lang_c_finish); - -# Fortran 77 -register_language ('name' => 'f77', - 'Name' => 'Fortran 77', - 'linker' => 'F77LINK', - 'link' => '$(F77LD) $(AM_FFLAGS) $(FFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', - 'flags' => ['FFLAGS'], - 'compile' => '$(F77) $(AM_FFLAGS) $(FFLAGS)', - 'compiler' => 'F77COMPILE', - 'compile_flag' => '-c', - 'output_flag' => '-o', - 'lder' => 'F77LD', - 'ld' => '$(F77)', - 'pure' => 1, - 'extensions' => ['.f', '.for', '.f90']); - -# Preprocessed Fortran 77 -# -# The current support for preprocessing Fortran 77 just involves -# passing `$(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) -# $(CPPFLAGS)' as additional flags to the Fortran 77 compiler, since -# this is how GNU Make does it; see the `GNU Make Manual, Edition 0.51 -# for `make' Version 3.76 Beta' (specifically, from info file -# `(make)Catalogue of Rules'). -# -# A better approach would be to write an Autoconf test -# (i.e. AC_PROG_FPP) for a Fortran 77 preprocessor, because not all -# Fortran 77 compilers know how to do preprocessing. The Autoconf -# macro AC_PROG_FPP should test the Fortran 77 compiler first for -# preprocessing capabilities, and then fall back on cpp (if cpp were -# available). -register_language ('name' => 'ppf77', - 'Name' => 'Preprocessed Fortran 77', - 'config_vars' => ['F77'], - 'linker' => 'F77LINK', - 'link' => '$(F77LD) $(AM_FFLAGS) $(FFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', - 'lder' => 'F77LD', - 'ld' => '$(F77)', - 'flags' => ['FFLAGS', 'CPPFLAGS'], - 'compiler' => 'PPF77COMPILE', - 'compile' => '$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS)', - 'compile_flag' => '-c', - 'output_flag' => '-o', - 'pure' => 1, - 'extensions' => ['.F']); - -# Ratfor. -register_language ('name' => 'ratfor', - 'Name' => 'Ratfor', - 'config_vars' => ['F77'], - 'linker' => 'F77LINK', - 'link' => '$(F77LD) $(AM_FFLAGS) $(FFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', - 'lder' => 'F77LD', - 'ld' => '$(F77)', - 'flags' => ['RFLAGS', 'FFLAGS'], - # FIXME also FFLAGS. - 'compile' => '$(F77) $(AM_FFLAGS) $(FFLAGS) $(AM_RFLAGS) $(RFLAGS)', - 'compiler' => 'RCOMPILE', - 'compile_flag' => '-c', - 'output_flag' => '-o', - 'pure' => 1, - 'extensions' => ['.r']); - -# Java via gcj. -register_language ('name' => 'java', - 'Name' => 'Java', - 'config_vars' => ['GCJ'], - 'linker' => 'GCJLINK', - 'link' => '$(GCJLD) $(AM_GCJFLAGS) $(GCJFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', - 'autodep' => 'GCJ', - 'flags' => ['GCJFLAGS'], - 'compile' => '$(GCJ) $(AM_GCJFLAGS) $(GCJFLAGS)', - 'compiler' => 'GCJCOMPILE', - 'compile_flag' => '-c', - 'output_flag' => '-o', - 'lder' => 'GCJLD', - 'ld' => '$(GCJ)', - 'pure' => 1, - 'extensions' => ['.java', '.class', '.zip', '.jar']); - -################################################################ - -# Parse the WARNINGS environnent variable. -&parse_WARNINGS; - -# Parse command line. -&parse_arguments; - -# Do configure.ac scan only once. -&scan_autoconf_files; - -&fatal ("no `Makefile.am' found or specified\n") - if ! @input_files; - -my $automake_has_run = 0; - -do -{ - if ($automake_has_run) - { - &verb ('processing Makefiles another time to fix them up.'); - &prog_error ('running more than two times should never be needed.') - if $automake_has_run >= 2; - } - $automake_needs_to_reprocess_all_files = 0; - - # Now do all the work on each file. - # This guy must be local otherwise it's private to the loop. - use vars '$am_file'; - local $am_file; - foreach $am_file (@input_files) - { - if (! -f ($am_file . '.am')) - { - &err ("`$am_file.am' does not exist"); - } - else - { - &generate_makefile ($output_files{$am_file}, $am_file); - } - } - ++$automake_has_run; -} -while ($automake_needs_to_reprocess_all_files); - -exit $exit_code; - -################################################################ - -# Error reporting functions. - -# prog_error ($MESSAGE, [%OPTIONS]) -# ------------------------------- -# Signal a programming error, display $MESSAGE, and exit 1. -sub prog_error ($;%) -{ - my ($msg, %opts) = @_; - msg 'automake', '', $msg, %opts; -} - -# err ($WHERE, $MESSAGE, [%OPTIONS]) -# err ($MESSAGE) -# ---------------------------------- -# Uncategorized errors. -sub err ($;$%) -{ - my ($where, $msg, %opts) = @_; - msg ('error', $where, $msg, %opts); -} - -# fatal ($WHERE, $MESSAGE, [%OPTIONS]) -# fatal ($MESSAGE) -# ---------------------------------- -# Fatal errors. -sub fatal ($;$%) -{ - my ($where, $msg, %opts) = @_; - msg ('fatal', $where, $msg, %opts); -} - -# err_var ($VARNAME, $MESSAGE, [%OPTIONS]) -# ---------------------------------------- -# Uncategorized errors about variables. -sub err_var ($$;%) -{ - msg_var ('error', @_); -} - -# err_target ($TARGETNAME, $MESSAGE, [%OPTIONS]) -# ---------------------------------------------- -# Uncategorized errors about targets. -sub err_target ($$;%) -{ - msg_target ('error', @_); -} - -# err_cond_target ($COND, $TARGETNAME, $MESSAGE, [%OPTIONS]) -# ---------------------------------------------------------- -# Uncategorized errors about conditional targets. -sub err_cond_target ($$$;%) -{ - msg_cond_target ('error', @_); -} - -# err_am ($MESSAGE, [%OPTIONS]) -# ----------------------------- -# Uncategorized errors about the current Makefile.am. -sub err_am ($;%) -{ - msg_am ('error', @_); -} - -# err_ac ($MESSAGE, [%OPTIONS]) -# ----------------------------- -# Uncategorized errors about configure.ac. -sub err_ac ($;%) -{ - msg_ac ('error', @_); -} - -# msg_cond_var ($CHANNEL, $COND, $VARNAME, $MESSAGE, [%OPTIONS]) -# -------------------------------------------------------------- -# Messages about conditional variable. -sub msg_cond_var ($$$$;%) -{ - my ($channel, $cond, $var, $msg, %opts) = @_; - msg $channel, $var_location{$var}{$cond}, $msg, %opts; -} - -# msg_var ($CHANNEL, $VARNAME, $MESSAGE, [%OPTIONS]) -# -------------------------------------------------- -# Messages about variables. -sub msg_var ($$$;%) -{ - my ($channel, $var, $msg, %opts) = @_; - # Don't know which condition is concerned. Pick any. - my $cond = (keys %{$var_value{$var}})[0]; - msg_cond_var $channel, $cond, $var, $msg, %opts; -} - -# msg_cond_target ($CHANNEL, $COND, $TARGETNAME, $MESSAGE, [%OPTIONS]) -# -------------------------------------------------------------------- -# Messages about conditional targets. -sub msg_cond_target ($$$$;%) -{ - my ($channel, $cond, $target, $msg, %opts) = @_; - msg $channel, $targets{$target}{$cond}, $msg, %opts; -} - -# msg_target ($CHANNEL, $TARGETNAME, $MESSAGE, [%OPTIONS]) -# -------------------------------------------------------- -# Messages about targets. -sub msg_target ($$$;%) -{ - my ($channel, $target, $msg, %opts) = @_; - # Don't know which condition is concerned. Pick any. - my $cond = (keys %{$targets{$target}})[0]; - msg_cond_target ($channel, $cond, $target, $msg, %opts); -} - -# msg_am ($CHANNEL, $MESSAGE, [%OPTIONS]) -# --------------------------------------- -# Messages about about the current Makefile.am. -sub msg_am ($$;%) -{ - my ($channel, $msg, %opts) = @_; - msg $channel, "${am_file}.am", $msg, %opts; -} - -# msg_ac ($CHANNEL, $MESSAGE, [%OPTIONS]) -# --------------------------------------- -# Messages about about configure.ac. -sub msg_ac ($$;%) -{ - my ($channel, $msg, %opts) = @_; - msg $channel, $configure_ac, $msg, %opts; -} - -# $BOOL -# reject_var ($VAR, $ERROR_MSG) -# ----------------------------- -sub reject_var ($$) -{ - my ($var, $msg) = @_; - if (variable_defined ($var)) - { - err_var $var, $msg; - return 1; - } - return 0; -} - -# $BOOL -# reject_target ($VAR, $ERROR_MSG) -# -------------------------------- -sub reject_target ($$) -{ - my ($target, $msg) = @_; - if (target_defined ($target)) - { - err_target $target, $msg; - return 1; - } - return 0; -} - -# verb ($MESSAGE, [%OPTIONS]) -# --------------------------- -sub verb ($;%) -{ - my ($msg, %opts) = @_; - msg 'verb', '', $msg, %opts; -} - -################################################################ - -# subst ($TEXT) -# ------------- -# Return a configure-style substitution using the indicated text. -# We do this to avoid having the substitutions directly in automake.in; -# when we do that they are sometimes removed and this causes confusion -# and bugs. -sub subst ($) -{ - my ($text) = @_; - return '@' . $text . '@'; -} - -################################################################ - - -# $BACKPATH -# &backname ($REL-DIR) -# -------------------- -# If I `cd $REL-DIR', then to come back, I should `cd $BACKPATH'. -# For instance `src/foo' => `../..'. -# Works with non strictly increasing paths, i.e., `src/../lib' => `..'. -sub backname ($) -{ - my ($file) = @_; - my @res; - foreach (split (/\//, $file)) - { - next if $_ eq '.' || $_ eq ''; - if ($_ eq '..') - { - pop @res; - } - else - { - push (@res, '..'); - } - } - return join ('/', @res) || '.'; -} - -################################################################ - -# Pattern that matches all know input extensions (i.e. extensions used -# by the languages supported by Automake). Using this pattern -# (instead of `\..*$') to match extensions allows Automake to support -# dot-less extensions. -my $KNOWN_EXTENSIONS_PATTERN = ""; -my @known_extensions_list = (); - -# accept_extensions (@EXTS) -# ------------------------- -# Update $KNOWN_EXTENSIONS_PATTERN to recognize the extensions -# listed @EXTS. Extensions should contain a dot if needed. -sub accept_extensions (@) -{ - push @known_extensions_list, @_; - $KNOWN_EXTENSIONS_PATTERN = - '(?:' . join ('|', map (quotemeta, @known_extensions_list)) . ')'; -} - -# var_SUFFIXES_trigger ($TYPE, $VALUE) -# ------------------------------------ -# This is called automagically by macro_define() when SUFFIXES -# is defined ($TYPE eq '') or appended ($TYPE eq '+'). -# The work here needs to be performed as a side-effect of the -# macro_define() call because SUFFIXES definitions impact -# on $KNOWN_EXTENSIONS_PATTERN, and $KNOWN_EXTENSIONS_PATTERN -# are used when parsing the input am file. -sub var_SUFFIXES_trigger ($$) -{ - my ($type, $value) = @_; - accept_extensions (split (' ', $value)); -} - -################################################################ - - -# switch_warning ($CATEGORY) -# -------------------------- -# If $CATEGORY is mumble, turn on the mumble channel. -# If it's no-mumble, turn mumble off. -# Alse handle `all' and `none' for completeness. -sub switch_warning ($) -{ - my ($cat) = @_; - my $has_no = 0; - - if ($cat =~ /^no-(.*)$/) - { - $cat = $1; - $has_no = 1; - } - - if ($cat eq 'all') - { - setup_channel_type 'warning', silent => $has_no; - } - elsif ($cat eq 'none') - { - setup_channel_type 'warning', silent => 1 - $has_no; - } - elsif ($cat eq 'error') - { - $warnings_are_errors = 1 - $has_no; - } - elsif (channel_type ($cat) eq 'warning') - { - setup_channel $cat, silent => $has_no; - } - else - { - return 1; - } - return 0; -} - -# parse_WARNINGS -# -------------- -# Honor the WARNINGS environment variable. -sub parse_WARNINGS ($$) -{ - if (exists $ENV{'WARNINGS'}) - { - # Ignore unknown categories. This is required because WARNINGS - # should be honored by many tools. - switch_warning $_ foreach (split (',', $ENV{'WARNINGS'})); - } -} - -# parse_warning ($OPTION, $ARGUMENT) -# ---------------------------------- -# Parse the argument of --warning=CATEGORY or -WCATEGORY. -sub parse_warnings ($$) -{ - my ($opt, $categories) = @_; - - foreach my $cat (split (',', $categories)) - { - msg 'unsupported', "unknown warning category `$cat'" - if switch_warning $cat; - } -} - -# Parse command line. -sub parse_arguments () -{ - # Start off as gnu. - &set_strictness ('gnu'); - - my %options = - ( - 'libdir:s' => \$libdir, - 'gnu' => sub { &set_strictness ('gnu'); }, - 'gnits' => sub { &set_strictness ('gnits'); }, - 'cygnus' => \$cygnus_mode, - 'foreign' => sub { &set_strictness ('foreign'); }, - 'include-deps' => sub { $cmdline_use_dependencies = 1; }, - 'i|ignore-deps' => sub { $cmdline_use_dependencies = 0; }, - 'no-force' => sub { $force_generation = 0; }, - 'f|force-missing' => \$force_missing, - 'o|output-dir:s' => \$output_directory, - 'a|add-missing' => \$add_missing, - 'c|copy' => \$copy_missing, - 'v|verbose' => sub { setup_channel 'verb', silent => 0; }, - 'W|warnings:s' => \&parse_warnings, - # These long options (--Werror and --Wno-error) for backward - # compatibility. Use -Werror and -Wno-error today. - 'Werror' => sub { parse_warnings 'W', 'error'; }, - 'Wno-error' => sub { parse_warnings 'W', 'no-error'; }, - ); - - use Getopt::Long; - Getopt::Long::config ("bundling", "pass_through"); - - # See if --version or --help is used. We want to process these before - # anything else because the GNU Coding Standards require us to - # `exit 0' after processing these options, and we can't garanty this - # if we treat other options first. (Handling other options first - # could produce error diagnostics, and in this condition it is - # confusing if Automake `exit 0'.) - my %options_1st_pass = - ( - 'version' => \&version, - 'help' => \&usage, - # Recognize all other options (and their arguments) but do nothing. - map { $_ => sub {} } (keys %options) - ); - my @ARGV_backup = @ARGV; - Getopt::Long::GetOptions %options_1st_pass - or exit 1; - @ARGV = @ARGV_backup; - - # Now *really* process the options. This time we know - # that --help and --version are not present. - Getopt::Long::GetOptions %options - or exit 1; - - if (defined $output_directory) - { - msg 'obsolete', "`--output-dir' is deprecated\n"; - } - else - { - # In the next release we'll remove this entirely. - $output_directory = '.'; - } - - foreach my $arg (@ARGV) - { - if ($arg =~ /^-./) - { - fatal ("unrecognized option `$arg'\n" - . "Try `$0 --help' for more information."); - } - - # Handle $local:$input syntax. Note that we only examine the - # first ":" file to see if it is automake input; the rest are - # just taken verbatim. We still keep all the files around for - # dependency checking, however. - my ($local, $input, @rest) = split (/:/, $arg); - if (! $input) - { - $input = $local; - } - else - { - # Strip .in; later on .am is tacked on. That is how the - # automake input file is found. Maybe not the best way, but - # it is easy to explain. - $input =~ s/\.in$// - or fatal "invalid input file name `$arg'\n."; - } - push (@input_files, $input); - $output_files{$input} = join (':', ($local, @rest)); - } - - # Take global strictness from whatever we currently have set. - $default_strictness = $strictness; - $default_strictness_name = $strictness_name; -} - -################################################################ - -# Generate a Makefile.in given the name of the corresponding Makefile and -# the name of the file output by config.status. -sub generate_makefile -{ - my ($output, $makefile) = @_; - - # Reset all the Makefile.am related variables. - &initialize_per_input; - - # Any warning setting now local to this Makefile.am. - &dup_channel_setup; - # AUTOMAKE_OPTIONS can contains -W flags to disable or enable - # warnings for this file. So hold any warning issued before - # we have processed AUTOMAKE_OPTIONS. - &buffer_messages ('warning'); - - # Name of input file ("Makefile.am") and output file - # ("Makefile.in"). These have no directory components. - $am_file_name = basename ($makefile) . '.am'; - $in_file_name = basename ($makefile) . '.in'; - - # $OUTPUT is encoded. If it contains a ":" then the first element - # is the real output file, and all remaining elements are input - # files. We don't scan or otherwise deal with these input file, - # other than to mark them as dependencies. See - # &scan_autoconf_files for details. - my (@secondary_inputs); - ($output, @secondary_inputs) = split (/:/, $output); - - $relative_dir = dirname ($output); - $am_relative_dir = dirname ($makefile); - - &read_main_am_file ($makefile . '.am'); - if (&handle_options) - { - # Process buffered warnings. - &flush_messages; - # Fatal error. Just return, so we can continue with next file. - return; - } - # Process buffered warnings. - &flush_messages; - - # There are a few install-related variables that you should not define. - foreach my $var ('PRE_INSTALL', 'POST_INSTALL', 'NORMAL_INSTALL') - { - if (exists $var_owner{$var}) - { - prog_error "\$var_owner{$var}{TRUE} doesn't exist" - unless exists $var_owner{$var}{'TRUE'}; - reject_var $var, "`$var' should not be defined" - if $var_owner{$var}{'TRUE'} != VAR_AUTOMAKE; - } - } - - # Catch some obsolete variables. - msg_var ('obsolete', 'INCLUDES', - "`INCLUDES' is the old name for `AM_CPPFLAGS'") - if variable_defined ('INCLUDES'); - - # At the toplevel directory, we might need config.guess, config.sub - # or libtool scripts (ltconfig and ltmain.sh). - if ($relative_dir eq '.') - { - # AC_CANONICAL_HOST and AC_CANONICAL_SYSTEM need config.guess and - # config.sub. - require_conf_file ($canonical_location, FOREIGN, - 'config.guess', 'config.sub') - if $seen_canonical; - } - - # We still need Makefile.in here, because sometimes the `dist' - # target doesn't re-run automake. - if ($am_relative_dir eq $relative_dir) - { - # Only distribute the files if they are in the same subdir as - # the generated makefile. - &push_dist_common ($in_file_name, $am_file_name); - } - - push (@sources, '$(SOURCES)') - if variable_defined ('SOURCES'); - - # Must do this after reading .am file. See read_main_am_file to - # understand weird tricks we play there with variables. - &define_variable ('subdir', $relative_dir); - - # Check first, because we might modify some state. - &check_cygnus; - &check_gnu_standards; - &check_gnits_standards; - - &handle_configure ($output, $makefile, @secondary_inputs); - &handle_gettext; - &handle_libraries; - &handle_ltlibraries; - &handle_programs; - &handle_scripts; - - # This must run first so that the ANSI2KNR definition is generated - # before it is used by the _.c rules. We have to do this because - # a variable which is used in a dependency must be defined before - # the target, or else make won't properly see it. - &handle_compile; - # This must be run after all the sources are scanned. - &handle_languages; - - # We have to run this after dealing with all the programs. - &handle_libtool; - - # Re-init SOURCES. FIXME: other code shouldn't depend on this - # (but currently does). - macro_define ('SOURCES', VAR_AUTOMAKE, '', 'TRUE', "@sources", 'internal'); - define_pretty_variable ('DIST_SOURCES', '', @dist_sources); - - &handle_multilib; - &handle_texinfo; - &handle_emacs_lisp; - &handle_python; - &handle_java; - &handle_man_pages; - &handle_data; - &handle_headers; - &handle_subdirs; - &handle_tags; - &handle_minor_options; - &handle_tests; - - # This must come after most other rules. - &handle_dist ($makefile); - - &handle_footer; - &do_check_merge_target; - &handle_all ($output); - - # FIXME: Gross! - if (variable_defined ('lib_LTLIBRARIES') && - variable_defined ('bin_PROGRAMS')) - { - $output_rules .= "install-binPROGRAMS: install-libLTLIBRARIES\n\n"; - } - - &handle_installdirs; - &handle_clean; - &handle_factored_dependencies; - - check_typos (); - - if (! -d ($output_directory . '/' . $am_relative_dir)) - { - mkdir ($output_directory . '/' . $am_relative_dir, 0755); - } - - my ($out_file) = $output_directory . '/' . $makefile . ".in"; - if (! $force_generation && -e $out_file) - { - my ($am_time) = (stat ($makefile . '.am'))[9]; - my ($in_time) = (stat ($out_file))[9]; - # FIXME: should cache these times. - my ($conf_time) = (stat ($configure_ac))[9]; - # FIXME: how to do unsigned comparison? - if ($am_time < $in_time || $am_time < $conf_time) - { - # No need to update. - return; - } - if (-f 'aclocal.m4') - { - my ($acl_time) = (stat _)[9]; - return if ($am_time < $acl_time); - } - } - - if (-e "$out_file") - { - unlink ($out_file) - or fatal "cannot remove $out_file: $!\n"; - } - my $gm_file = new Automake::XFile "> $out_file"; - verb "creating $makefile.in"; - - print $gm_file $output_vars; - # We make sure that `all:' is the first target. - print $gm_file $output_all; - print $gm_file $output_header; - print $gm_file $output_rules; - print $gm_file $output_trailer; - - # Back out any warning setting. - &drop_channel_setup; -} - -################################################################ - -# A version is a string that looks like -# MAJOR.MINOR[.MICRO][ALPHA][-FORK] -# where -# MAJOR, MINOR, and MICRO are digits, ALPHA is a character, and -# FORK any alphanumeric word. -# Usually, ALPHA is used to label alpha releases or intermediate snapshots, -# FORK is used for CVS branches or patched releases, and MICRO is used -# for bug fixes releases on the MAJOR.MINOR branch. -# -# For the purpose of ordering, 1.4 is the same as 1.4.0, but 1.4g is -# the same as 1.4.99g. The FORK identifier is ignored in the -# ordering, except when it looks like -pMINOR[ALPHA]: some versions -# were labelled like 1.4-p3a, this is the same as an alpha release -# labelled 1.4.3a. Yes it's horrible, but Automake did not support -# two-dot versions in the past. - -# version_split (VERSION) -# ----------------------- -# Split a version string into the corresponding (MAJOR, MINOR, MICRO, -# ALPHA, FORK) tuple. For instance "1.4g" would be split into -# (1, 4, 99, 'g', ''). -# Return () on error. -sub version_split ($) -{ - my ($ver) = @_; - - # Special case for versions like 1.4-p2a. - if ($ver =~ /^(\d+)\.(\d+)(?:-p(\d+)([a-z]+)?)$/) - { - return ($1, $2, $3, $4 || '', ''); - } - # Common case. - elsif ($ver =~ /^(\d+)\.(\d+)(?:\.(\d+))?([a-z])?(?:-([A-Za-z0-9]+))?$/) - { - return ($1, $2, $3 || (defined $4 ? 99 : 0), $4 || '', $5 || ''); - } - return (); -} - -# version_compare (\@LVERSION, \@RVERSION) -# ---------------------------------------- -# Return 1 if LVERSION > RVERSION, -# -1 if LVERSION < RVERSION, -# 0 if LVERSION = RVERSION. -sub version_compare (\@\@) -{ - my @l = @{$_[0]}; - my @r = @{$_[1]}; - - for my $i (0, 1, 2) - { - return 1 if ($l[$i] > $r[$i]); - return -1 if ($l[$i] < $r[$i]); - } - for my $i (3, 4) - { - return 1 if ($l[$i] gt $r[$i]); - return -1 if ($l[$i] lt $r[$i]); - } - return 0; -} - -# Handles the logic of requiring a version number in AUTOMAKE_OPTIONS. -# Return 0 if the required version is satisfied, 1 otherwise. -sub version_check ($) -{ - my ($required) = @_; - my @version = version_split $VERSION; - my @required = version_split $required; - - prog_error "version is incorrect: $VERSION" - if $#version == -1; - - # This should not happen, because process_option_list and split_version - # use similar regexes. - prog_error "required version is incorrect: $required" - if $#required == -1; - - # If we require 3.4n-foo then we require something - # >= 3.4n, with the `foo' fork identifier. - return 1 - if ($required[4] ne '' && $required[4] ne $version[4]); - - return 0 > version_compare @version, @required; -} - -# $BOOL -# process_option_list ($CONFIG, @OPTIONS) -# ------------------------------ -# Process a list of options. Return 1 on error, 0 otherwise. -# This is a helper for handle_options. CONFIG is true if we're -# handling global options. -sub process_option_list -{ - my ($config, @list) = @_; - - # FIXME: We should disallow conditional deffinitions of AUTOMAKE_OPTIONS. - my $where = ($config ? - $seen_init_automake : - $var_location{'AUTOMAKE_OPTIONS'}{'TRUE'}); - - foreach (@list) - { - $options{$_} = 1; - if ($_ eq 'gnits' || $_ eq 'gnu' || $_ eq 'foreign') - { - &set_strictness ($_); - } - elsif ($_ eq 'cygnus') - { - $cygnus_mode = 1; - } - elsif (/^(.*\/)?ansi2knr$/) - { - # An option like "../lib/ansi2knr" is allowed. With no - # path prefix, we assume the required programs are in this - # directory. We save the actual option for later. - $options{'ansi2knr'} = $_; - } - elsif ($_ eq 'no-installman' || $_ eq 'no-installinfo' - || $_ eq 'dist-shar' || $_ eq 'dist-zip' - || $_ eq 'dist-tarZ' || $_ eq 'dist-bzip2' - || $_ eq 'dejagnu' || $_ eq 'no-texinfo.tex' - || $_ eq 'readme-alpha' || $_ eq 'check-news' - || $_ eq 'subdir-objects' || $_ eq 'nostdinc' - || $_ eq 'no-exeext' || $_ eq 'no-define' - || $_ eq 'std-options') - { - # Explicitly recognize these. - } - elsif ($_ eq 'no-dependencies') - { - $use_dependencies = 0; - } - elsif (/^\d+\.\d+(?:\.\d+)?[a-z]?(?:-[A-Za-z0-9]+)?$/) - { - # Got a version number. - if (version_check $&) - { - err ($where, "require Automake $_, but have $VERSION", - uniq_scope => US_GLOBAL); - return 1; - } - } - elsif (/^(?:--warnings=|-W)(.*)$/) - { - foreach my $cat (split (',', $1)) - { - msg 'unsupported', $where, "unknown warning category `$cat'" - if switch_warning $cat; - } - } - else - { - err ($where, "option `$_' not recognized", - uniq_scope => US_GLOBAL); - return 1; - } - } -} - -# Handle AUTOMAKE_OPTIONS variable. Return 1 on error, 0 otherwise. -sub handle_options -{ - # Process global options first so that more specific options can - # override. - if (&process_option_list (1, split (' ', $global_options))) - { - return 1; - } - - if (variable_defined ('AUTOMAKE_OPTIONS')) - { - if (&process_option_list (0, &variable_value_as_list_recursive ('AUTOMAKE_OPTIONS', ''))) - { - return 1; - } - } - - if ($strictness == GNITS) - { - $options{'readme-alpha'} = 1; - $options{'std-options'} = 1; - $options{'check-news'} = 1; - } - - return 0; -} - - -# get_object_extension ($OUT) -# --------------------------- -# Return object extension. Just once, put some code into the output. -# OUT is the name of the output file -sub get_object_extension -{ - my ($out) = @_; - - # Maybe require libtool library object files. - my $extension = '.$(OBJEXT)'; - $extension = '.lo' if ($out =~ /\.la$/); - - # Check for automatic de-ANSI-fication. - $extension = '$U' . $extension - if defined $options{'ansi2knr'}; - - $get_object_extension_was_run = 1; - - return $extension; -} - - -# Call finish function for each language that was used. -sub handle_languages -{ - if ($use_dependencies) - { - # Include auto-dep code. Don't include it if DEP_FILES would - # be empty. - if (&saw_sources_p (0) && keys %dep_files) - { - # Set location of depcomp. - &define_variable ('depcomp', "\$(SHELL) $config_aux_dir/depcomp"); - &define_variable ('am__depfiles_maybe', 'depfiles'); - - require_conf_file ("$am_file.am", FOREIGN, 'depcomp'); - - my @deplist = sort keys %dep_files; - - # We define this as a conditional variable because BSD - # make can't handle backslashes for continuing comments on - # the following line. - define_pretty_variable ('DEP_FILES', 'AMDEP_TRUE', @deplist); - - # Generate each `include' individually. Irix 6 make will - # not properly include several files resulting from a - # variable expansion; generating many separate includes - # seems safest. - $output_rules .= "\n"; - foreach my $iter (@deplist) - { - $output_rules .= (subst ('AMDEP_TRUE') - . subst ('am__include') - . ' ' - . subst ('am__quote') - . $iter - . subst ('am__quote') - . "\n"); - } - - # Compute the set of directories to remove in distclean-depend. - my @depdirs = uniq (map { dirname ($_) } @deplist); - $output_rules .= &file_contents ('depend', - DEPDIRS => "@depdirs"); - } - } - else - { - &define_variable ('depcomp', ''); - &define_variable ('am__depfiles_maybe', ''); - } - - my %done; - - # Is the c linker needed? - my $needs_c = 0; - foreach my $ext (sort keys %extension_seen) - { - next unless $extension_map{$ext}; - - my $lang = $languages{$extension_map{$ext}}; - - my $rule_file = $lang->rule_file || 'depend2'; - - # Get information on $LANG. - my $pfx = $lang->autodep; - my $fpfx = ($pfx eq '') ? 'CC' : $pfx; - - my $AMDEP = (($use_dependencies && $lang->autodep ne 'no') - ? 'AMDEP' : 'FALSE'); - my $FASTDEP = (($use_dependencies && $lang->autodep ne 'no') - ? ('am__fastdep' . $fpfx) : 'FALSE'); - - my %transform = ('EXT' => $ext, - 'PFX' => $pfx, - 'FPFX' => $fpfx, - 'AMDEP' => $AMDEP, - 'FASTDEP' => $FASTDEP, - '-c' => $lang->compile_flag || '', - 'MORE-THAN-ONE' - => (count_files_for_language ($lang->name) > 1)); - - # Generate the appropriate rules for this extension. - if (($use_dependencies && $lang->autodep ne 'no') - || defined $lang->compile) - { - # Some C compilers don't support -c -o. Use it only if really - # needed. - my $output_flag = $lang->output_flag || ''; - $output_flag = '-o' - if (! $output_flag - && $lang->name eq 'c' - && defined $options{'subdir-objects'}); - - # Compute a possible derived extension. - # This is not used by depend2.am. - my $der_ext = (&{$lang->output_extensions} ($ext))[0]; - - $output_rules .= - file_contents ($rule_file, - %transform, - 'GENERIC' => 1, - - 'DERIVED-EXT' => $der_ext, - - # In this situation we know that the - # object is in this directory, so - # $(DEPDIR) is the correct location for - # dependencies. - 'DEPBASE' => '$(DEPDIR)/$*', - 'BASE' => '$*', - 'SOURCE' => '$<', - 'OBJ' => '$@', - 'OBJOBJ' => '$@', - 'LTOBJ' => '$@', - - 'COMPILE' => '$(' . $lang->compiler . ')', - 'LTCOMPILE' => '$(LT' . $lang->compiler . ')', - '-o' => $output_flag); - } - - # Now include code for each specially handled object with this - # language. - my %seen_files = (); - foreach my $file (@{$lang_specific_files{$lang->name}}) - { - my ($derived, $source, $obj, $myext) = split (' ', $file); - - # For any specially-generated object, we must respect the - # ansi2knr setting so that we don't inadvertently try to - # use the default rule. - if ($lang->ansi && defined $options{'ansi2knr'}) - { - $myext = '$U' . $myext; - } - - # We might see a given object twice, for instance if it is - # used under different conditions. - next if defined $seen_files{$obj}; - $seen_files{$obj} = 1; - - prog_error ("found " . $lang->name . - " in handle_languages, but compiler not defined") - unless defined $lang->compile; - - my $obj_compile = $lang->compile; - - # Rewrite each occurence of `AM_$flag' in the compile - # rule into `${derived}_$flag' if it exists. - for my $flag (@{$lang->flags}) - { - my $val = "${derived}_$flag"; - $obj_compile =~ s/\(AM_$flag\)/\($val\)/ - if variable_defined ($val); - } - - my $obj_ltcompile = '$(LIBTOOL) --mode=compile ' . $obj_compile; - - # We _need_ `-o' for per object rules. - my $output_flag = $lang->output_flag || '-o'; - - my $depbase = dirname ($obj); - $depbase = '' - if $depbase eq '.'; - $depbase .= '/' - unless $depbase eq ''; - $depbase .= '$(DEPDIR)/' . basename ($obj); - - # Generate a transform which will turn suffix targets in - # depend2.am into real targets for the particular objects we - # are building. - $output_rules .= - file_contents ($rule_file, - (%transform, - 'GENERIC' => 0, - - 'DEPBASE' => $depbase, - 'BASE' => $obj, - 'SOURCE' => $source, - # Use $myext and not `.o' here, in case - # we are actually building a new source - # file -- e.g. via yacc. - 'OBJ' => "$obj$myext", - 'OBJOBJ' => "$obj.obj", - 'LTOBJ' => "$obj.lo", - - 'COMPILE' => $obj_compile, - 'LTCOMPILE' => $obj_ltcompile, - '-o' => $output_flag)); - } - - # The rest of the loop is done once per language. - next if defined $done{$lang}; - $done{$lang} = 1; - - # Load the language dependent Makefile chunks. - my %lang = map { uc ($_) => 0 } keys %languages; - $lang{uc ($lang->name)} = 1; - $output_rules .= file_contents ('lang-compile', %transform, %lang); - - # If the source to a program consists entirely of code from a - # `pure' language, for instance C++ for Fortran 77, then we - # don't need the C compiler code. However if we run into - # something unusual then we do generate the C code. There are - # probably corner cases here that do not work properly. - # People linking Java code to Fortran code deserve pain. - $needs_c ||= ! $lang->pure; - - define_compiler_variable ($lang) - if ($lang->compile); - - define_linker_variable ($lang) - if ($lang->link); - - require_variables ("$am_file.am", $lang->Name . " source seen", - 'TRUE', @{$lang->config_vars}); - - # Call the finisher. - $lang->finish; - - # Flags listed in `->flags' are user variables (per GNU Standards), - # they should not be overriden in the Makefile... - my @dont_override = @{$lang->flags}; - # ... and so is LDFLAGS. - push @dont_override, 'LDFLAGS' if $lang->link; - - foreach my $flag (@dont_override) - { - if (exists $var_owner{$flag}) - { - for my $cond (keys %{$var_owner{$flag}}) - { - if ($var_owner{$flag}{$cond} == VAR_MAKEFILE) - { - msg_cond_var ('gnu', $cond, $flag, - "`$flag' is a user variable, " - . "you should not override it;\n" - . "use `AM_$flag' instead."); - } - } - } - } - } - - # If the project is entirely C++ or entirely Fortran 77 (i.e., 1 - # suffix rule was learned), don't bother with the C stuff. But if - # anything else creeps in, then use it. - $needs_c = 1 - if $need_link || ((scalar keys %$suffix_rules) - - (scalar keys %$suffix_rules_default)) > 1; - - if ($needs_c) - { - &define_compiler_variable ($languages{'c'}) - unless defined $done{$languages{'c'}}; - define_linker_variable ($languages{'c'}); - } -} - -# Check to make sure a source defined in LIBOBJS is not explicitly -# mentioned. This is a separate function (as opposed to being inlined -# in handle_source_transform) because it isn't always appropriate to -# do this check. -sub check_libobjs_sources -{ - my ($one_file, $unxformed) = @_; - - foreach my $prefix ('', 'EXTRA_', 'dist_', 'nodist_', - 'dist_EXTRA_', 'nodist_EXTRA_') - { - my @files; - if (variable_defined ($prefix . $one_file . '_SOURCES')) - { - @files = &variable_value_as_list_recursive ( - ($prefix . $one_file . '_SOURCES'), - 'all'); - } - elsif ($prefix eq '') - { - @files = ($unxformed . '.c'); - } - else - { - next; - } - - foreach my $file (@files) - { - err_var ($prefix . $one_file . '_SOURCES', - "automatically discovered file `$file' should not" . - " be explicitly mentioned") - if defined $libsources{$file}; - } - } -} - - -# @OBJECTS -# handle_single_transform_list ($VAR, $TOPPARENT, $DERIVED, $OBJ, @FILES) -# ----------------------------------------------------------------------- -# Does much of the actual work for handle_source_transform. -# Arguments are: -# $VAR is the name of the variable that the source filenames come from -# $TOPPARENT is the name of the _SOURCES variable which is being processed -# $DERIVED is the name of resulting executable or library -# $OBJ is the object extension (e.g., `$U.lo') -# @FILES is the list of source files to transform -# Result is a list of the names of objects -# %linkers_used will be updated with any linkers needed -sub handle_single_transform_list ($$$$@) -{ - my ($var, $topparent, $derived, $obj, @files) = @_; - my @result = (); - my $nonansi_obj = $obj; - $nonansi_obj =~ s/\$U//g; - - # Turn sources into objects. We use a while loop like this - # because we might add to @files in the loop. - while (scalar @files > 0) - { - $_ = shift @files; - - # Configure substitutions in _SOURCES variables are errors. - if (/^\@.*\@$/) - { - err_var ($var, - "`$var' includes configure substitution `$_', and is " . - "referred to\nfrom `$topparent': configure " . - "substitutions are not allowed\nin _SOURCES variables"); - next; - } - - # If the source file is in a subdirectory then the `.o' is put - # into the current directory, unless the subdir-objects option - # is in effect. - - # Split file name into base and extension. - next if ! /^(?:(.*)\/)?([^\/]*)($KNOWN_EXTENSIONS_PATTERN)$/; - my $full = $_; - my $directory = $1 || ''; - my $base = $2; - my $extension = $3; - my $full_ansi = $full; # We'll add `$U' if needed. - - # We must generate a rule for the object if it requires its own flags. - my $renamed = 0; - my ($linker, $object); - - # This records whether we've seen a derived source file (eg, - # yacc output). - my $derived_source = 0; - - # This holds the `aggregate context' of the file we are - # currently examining. If the file is compiled with - # per-object flags, then it will be the name of the object. - # Otherwise it will be `AM'. This is used by the target hook - # language function. - my $aggregate = 'AM'; - - $extension = &derive_suffix ($extension, $nonansi_obj); - my $lang; - if ($extension_map{$extension} && - ($lang = $languages{$extension_map{$extension}})) - { - # Found the language, so see what it says. - &saw_extension ($extension); - - # Note: computed subr call. The language rewrite function - # should return one of the LANG_* constants. It could - # also return a list whose first value is such a constant - # and whose second value is a new source extension which - # should be applied. This means this particular language - # generates another source file which we must then process - # further. - my $subr = 'lang_' . $lang->name . '_rewrite'; - my ($r, $source_extension) - = & $subr ($directory, $base, $extension); - # Skip this entry if we were asked not to process it. - next if $r == LANG_IGNORE; - - # Now extract linker and other info. - $linker = $lang->linker; - - my $this_obj_ext; - if (defined $source_extension) - { - $this_obj_ext = $source_extension; - $derived_source = 1; - } - elsif ($lang->ansi) - { - $this_obj_ext = $obj; - } - else - { - $this_obj_ext = $nonansi_obj; - } - $object = $base . $this_obj_ext; - - # Do we have per-executable flags for this executable? - my $have_per_exec_flags = 0; - foreach my $flag (@{$lang->flags}) - { - if (variable_defined ("${derived}_$flag")) - { - $have_per_exec_flags = 1; - last; - } - } - - if ($have_per_exec_flags) - { - # We have a per-executable flag in effect for this - # object. In this case we rewrite the object's - # name to ensure it is unique. We also require - # the `compile' program to deal with compilers - # where `-c -o' does not work. - - # We choose the name `DERIVED_OBJECT' to ensure - # (1) uniqueness, and (2) continuity between - # invocations. However, this will result in a - # name that is too long for losing systems, in - # some situations. So we provide _SHORTNAME to - # override. - - my $dname = $derived; - if (variable_defined ($derived . '_SHORTNAME')) - { - # FIXME: should use the same conditional as - # the _SOURCES variable. But this is really - # silly overkill -- nobody should have - # conditional shortnames. - $dname = &variable_value ($derived . '_SHORTNAME'); - } - $object = $dname . '-' . $object; - - require_conf_file ("$am_file.am", FOREIGN, 'compile') - if $lang->name eq 'c'; - - prog_error ($lang->name . " flags defined without compiler") - if ! defined $lang->compile; - - $renamed = 1; - } - - # If rewrite said it was ok, put the object into a - # subdir. - if ($r == LANG_SUBDIR && $directory ne '') - { - $object = $directory . '/' . $object; - } - - # If doing dependency tracking, then we can't print - # the rule. If we have a subdir object, we need to - # generate an explicit rule. Actually, in any case - # where the object is not in `.' we need a special - # rule. The per-object rules in this case are - # generated later, by handle_languages. - if ($renamed || $directory ne '') - { - my $obj_sans_ext = substr ($object, 0, - - length ($this_obj_ext)); - if ($lang->ansi && defined $options{'ansi2knr'}) - { - $full_ansi =~ s/$KNOWN_EXTENSIONS_PATTERN$/\$U$&/; - $full_ansi = basename $full_ansi - unless defined $options{'subdir-objects'}; - } - - my $val = ("$full_ansi $obj_sans_ext " - # Only use $this_obj_ext in the derived - # source case because in the other case we - # *don't* want $(OBJEXT) to appear here. - . ($derived_source ? $this_obj_ext : '.o')); - - # If we renamed the object then we want to use the - # per-executable flag name. But if this is simply a - # subdir build then we still want to use the AM_ flag - # name. - if ($renamed) - { - $val = "$derived $val"; - $aggregate = $derived; - } - else - { - $val = "AM $val"; - } - - # Each item on this list is a string consisting of - # four space-separated values: the derived flag prefix - # (eg, for `foo_CFLAGS', it is `foo'), the name of the - # source file, the base name of the output file, and - # the extension for the object file. - push (@{$lang_specific_files{$lang->name}}, $val); - } - } - elsif ($extension eq $nonansi_obj) - { - # This is probably the result of a direct suffix rule. - # In this case we just accept the rewrite. - $object = "$base$extension"; - $linker = ''; - } - else - { - # No error message here. Used to have one, but it was - # very unpopular. - # FIXME: we could potentially do more processing here, - # perhaps treating the new extension as though it were a - # new source extension (as above). This would require - # more restructuring than is appropriate right now. - next; - } - - err_am "object `$object' created by `$full' and `$object_map{$object}'" - if (defined $object_map{$object} - && $object_map{$object} ne $full); - - my $comp_val = (($object =~ /\.lo$/) - ? COMPILE_LIBTOOL : COMPILE_ORDINARY); - (my $comp_obj = $object) =~ s/\.lo$/.\$(OBJEXT)/; - if (defined $object_compilation_map{$comp_obj} - && $object_compilation_map{$comp_obj} != 0 - # Only see the error once. - && ($object_compilation_map{$comp_obj} - != (COMPILE_LIBTOOL | COMPILE_ORDINARY)) - && $object_compilation_map{$comp_obj} != $comp_val) - { - err_am "object `$object' created both with libtool and without"; - } - $object_compilation_map{$comp_obj} |= $comp_val; - - if (defined $lang) - { - # Let the language do some special magic if required. - $lang->target_hook ($aggregate, $object, $full); - } - - if ($derived_source) - { - prog_error ($lang->name . " has automatic dependency tracking") - if $lang->autodep ne 'no'; - # Make sure this new source file is handled next. That will - # make it appear to be at the right place in the list. - unshift (@files, $object); - # Distribute derived sources unless the source they are - # derived from is not. - &push_dist_common ($object) - unless ($topparent =~ /^(?:nobase_)?nodist_/); - next; - } - - $linkers_used{$linker} = 1; - - push (@result, $object); - - if (! defined $object_map{$object}) - { - my @dep_list = (); - $object_map{$object} = $full; - - # If file is in subdirectory, we need explicit - # dependency. - if ($directory ne '' || $renamed) - { - push (@dep_list, $full_ansi); - } - - # If resulting object is in subdir, we need to make - # sure the subdir exists at build time. - if ($object =~ /\//) - { - # FIXME: check that $DIRECTORY is somewhere in the - # project - - # For Java, the way we're handling it right now, a - # `..' component doesn't make sense. - if ($lang->name eq 'java' && $object =~ /(\/|^)\.\.\//) - { - err_am "`$full' should not contain a `..' component"; - } - - # Make sure object is removed by `make mostlyclean'. - $compile_clean_files{$object} = MOSTLY_CLEAN; - # If we have a libtool object then we also must remove - # the ordinary .o. - if ($object =~ /\.lo$/) - { - (my $xobj = $object) =~ s,lo$,\$(OBJEXT),; - $compile_clean_files{$xobj} = MOSTLY_CLEAN; - - # Remove any libtool object in this directory. - $libtool_clean_directories{$directory} = 1; - } - - push (@dep_list, require_build_directory ($directory)); - - # If we're generating dependencies, we also want - # to make sure that the appropriate subdir of the - # .deps directory is created. - push (@dep_list, - require_build_directory ($directory . '/$(DEPDIR)')) - if $use_dependencies; - } - - &pretty_print_rule ($object . ':', "\t", @dep_list) - if scalar @dep_list > 0; - } - - # Transform .o or $o file into .P file (for automatic - # dependency code). - if ($lang && $lang->autodep ne 'no') - { - my $depfile = $object; - $depfile =~ s/\.([^.]*)$/.P$1/; - $depfile =~ s/\$\(OBJEXT\)$/o/; - $dep_files{dirname ($depfile) . '/$(DEPDIR)/' - . basename ($depfile)} = 1; - } - } - - return @result; -} - -# ($LINKER, $OBJVAR) -# define_objects_from_sources ($VAR, $OBJVAR, $NODEFINE, $ONE_FILE, -# $OBJ, $PARENT, $TOPPARENT) -# --------------------------------------------------------------------- -# Define an _OBJECTS variable for a _SOURCES variable (or subvariable) -# -# Arguments are: -# $VAR is the name of the _SOURCES variable -# $OBJVAR is the name of the _OBJECTS variable if known (otherwise -# it will be generated and returned). -# $NODEFINE is a boolean: if true, $OBJVAR will not be defined (but -# work done to determine the linker will be). -# $ONE_FILE is the canonical (transformed) name of object to build -# $OBJ is the object extension (ie either `.o' or `.lo'). -# $PARENT is the variable in which $VAR is used, or $VAR if not applicable. -# $TOPPARENT is the _SOURCES variable being processed. -# -# Result is a pair ($LINKER, $OBJVAR): -# $LINKER is a boolean, true if a linker is needed to deal with the objects, -# $OBJVAR is the name of the variable defined to hold the objects. -# -# %linkers_used, %vars_scanned, @substfroms and @substtos should be cleared -# before use: -# %linkers_used variable will be set to contain the linkers desired. -# %vars_scanned will be used to check for recursive definitions. -# @substfroms and @substtos will be used to keep a stack of variable -# substitutions to be applied. -# -sub define_objects_from_sources ($$$$$$$) -{ - my ($var, $objvar, $nodefine, $one_file, $obj, $parent, $topparent) = @_; - - if (defined $vars_scanned{$var}) - { - err_var $var, "variable `$var' recursively defined"; - return ""; - } - $vars_scanned{$var} = 1; - - my $needlinker = ""; - my @allresults = (); - foreach my $cond (variable_conditions ($var)) - { - my @result; - foreach my $val (&variable_value_as_list ($var, $cond, $parent)) - { - # If $val is a variable (i.e. ${foo} or $(bar), not a filename), - # handle the sub variable recursively. - if ($val =~ /^\$\{([^}]*)\}$/ || $val =~ /^\$\(([^)]*)\)$/) - { - my $subvar = $1; - - # If the user uses a losing variable name, just ignore it. - # This isn't ideal, but people have requested it. - next if ($subvar =~ /\@.*\@/); - - # See if the variable is actually a substitution reference - my ($from, $to); - my @temp_list; - if ($subvar =~ /$SUBST_REF_PATTERN/o) - { - $subvar = $1; - $to = $3; - $from = quotemeta $2; - } - push @substfroms, $from; - push @substtos, $to; - - my ($temp, $varname) - = define_objects_from_sources ($subvar, undef, - $nodefine, $one_file, - $obj, $var, $topparent); - - push (@result, '$('. $varname . ')'); - $needlinker ||= $temp; - - pop @substfroms; - pop @substtos; - } - else # $var is a filename - { - my $substnum=$#substfroms; - while ($substnum >= 0) - { - $val =~ s/$substfroms[$substnum]$/$substtos[$substnum]/ - if defined $substfroms[$substnum]; - $substnum -= 1; - } - - my (@transformed) = - &handle_single_transform_list ($var, $topparent, $one_file, $obj, $val); - push (@result, @transformed); - $needlinker = "true" if @transformed; - } - } - push (@allresults, [$cond, @result]); - } - # Find a name for the variable, unless imposed. - $objvar = subobjname (@allresults) unless defined $objvar; - # Define _OBJECTS conditionally - unless ($nodefine) - { - foreach my $pair (@allresults) - { - my ($cond, @result) = @$pair; - define_pretty_variable ($objvar, $cond, @result); - } - } - - delete $vars_scanned{$var}; - return ($needlinker, $objvar); -} - - -# $VARNAME -# subobjname (@DEFINITIONS) -# ------------------------- -# Return a name for an object variable that with definitions @DEFINITIONS. -# @DEFINITIONS is a list of pair [$COND, @OBJECTS]. -# -# If we already have an object variable containing @DEFINITIONS, reuse it. -# This way, we avoid combinatorial explosion of the generated -# variables. Especially, in a Makefile such as: -# -# | if FOO1 -# | A1=1 -# | endif -# | -# | if FOO2 -# | A2=2 -# | endif -# | -# | ... -# | -# | if FOON -# | AN=N -# | endif -# | -# | B=$(A1) $(A2) ... $(AN) -# | -# | c_SOURCES=$(B) -# | d_SOURCES=$(B) -# -# The generated c_OBJECTS and d_OBJECTS will share the same variable -# definitions. -# -# This setup can be the case of a testsuite containing lots (>100) of -# small C programs, all testing the same set of source files. -sub subobjname (@) -{ - my $key = ''; - foreach my $pair (@_) - { - my ($cond, @values) = @$pair; - $key .= "($cond)@values"; - } - - return $subobjvar{$key} if exists $subobjvar{$key}; - - my $num = 1 + keys (%subobjvar); - my $name = "am__objects_${num}"; - $subobjvar{$key} = $name; - return $name; -} - - -# Handle SOURCE->OBJECT transform for one program or library. -# Arguments are: -# canonical (transformed) name of object to build -# actual name of object to build -# object extension (ie either `.o' or `$o'. -# Return result is name of linker variable that must be used. -# Empty return means just use `LINK'. -sub handle_source_transform -{ - # one_file is canonical name. unxformed is given name. obj is - # object extension. - my ($one_file, $unxformed, $obj) = @_; - - my ($linker) = ''; - - # No point in continuing if _OBJECTS is defined. - return if reject_var ($one_file . '_OBJECTS', - $one_file . '_OBJECTS should not be defined'); - - my %used_pfx = (); - my $needlinker; - %linkers_used = (); - foreach my $prefix ('', 'EXTRA_', 'dist_', 'nodist_', - 'dist_EXTRA_', 'nodist_EXTRA_') - { - my $var = $prefix . $one_file . "_SOURCES"; - next - if !variable_defined ($var); - - # We are going to define _OBJECTS variables using the prefix. - # Then we glom them all together. So we can't use the null - # prefix here as we need it later. - my $xpfx = ($prefix eq '') ? 'am_' : $prefix; - - # Keep track of which prefixes we saw. - $used_pfx{$xpfx} = 1 - unless $prefix =~ /EXTRA_/; - - push @sources, "\$($var)"; - if ($prefix !~ /^nodist_/) - { - # If the VAR wasn't definined conditionally, we add - # it to DIST_SOURCES as is. Otherwise we create a - # am__VAR_DIST variable which contains all possible values, - # and add this variable to DIST_SOURCES. - my $distvar = "$var"; - my @conds = variable_conditions_recursive ($var); - if (@conds && $conds[0] ne 'TRUE') - { - $distvar = "am__${var}_DIST"; - my @files = - uniq (variable_value_as_list_recursive ($var, 'all')); - define_pretty_variable ($distvar, '', @files); - } - push @dist_sources, "\$($distvar)" - } - - @substfroms = (); - @substtos = (); - %vars_scanned = (); - my ($temp, $objvar) = - define_objects_from_sources ($var, - $xpfx . $one_file . '_OBJECTS', - $prefix =~ /EXTRA_/, - $one_file, $obj, $var, $var); - $needlinker ||= $temp; - } - if ($needlinker) - { - $linker ||= &resolve_linker (%linkers_used); - } - - my @keys = sort keys %used_pfx; - if (scalar @keys == 0) - { - &define_variable ($one_file . "_SOURCES", $unxformed . ".c"); - push (@sources, $unxformed . '.c'); - push (@dist_sources, $unxformed . '.c'); - - %linkers_used = (); - my (@result) = - &handle_single_transform_list ($one_file . '_SOURCES', - $one_file . '_SOURCES', - $one_file, $obj, - "$unxformed.c"); - $linker ||= &resolve_linker (%linkers_used); - define_pretty_variable ($one_file . "_OBJECTS", '', @result) - } - else - { - grep ($_ = '$(' . $_ . $one_file . '_OBJECTS)', @keys); - define_pretty_variable ($one_file . '_OBJECTS', '', @keys); - } - - # If we want to use `LINK' we must make sure it is defined. - if ($linker eq '') - { - $need_link = 1; - } - - return $linker; -} - - -# handle_lib_objects ($XNAME, $VAR) -# --------------------------------- -# Special-case ALLOCA and LIBOBJS substitutions in _LDADD or _LIBADD variables. -# Also, generate _DEPENDENCIES variable if appropriate. -# Arguments are: -# transformed name of object being built, or empty string if no object -# name of _LDADD/_LIBADD-type variable to examine -# Returns 1 if LIBOBJS seen, 0 otherwise. -sub handle_lib_objects -{ - my ($xname, $var) = @_; - - prog_error "handle_lib_objects: $var undefined" - if ! variable_defined ($var); - - my $ret = 0; - foreach my $cond (variable_conditions_recursive ($var)) - { - if (&handle_lib_objects_cond ($xname, $var, $cond)) - { - $ret = 1; - } - } - return $ret; -} - -# Subroutine of handle_lib_objects: handle a particular condition. -sub handle_lib_objects_cond -{ - my ($xname, $var, $cond) = @_; - - # We recognize certain things that are commonly put in LIBADD or - # LDADD. - my @dep_list = (); - - my $seen_libobjs = 0; - my $flagvar = 0; - - foreach my $lsearch (&variable_value_as_list_recursive ($var, $cond)) - { - # Skip -lfoo and -Ldir; these are explicitly allowed. - next if $lsearch =~ /^-[lL]/; - if (! $flagvar && $lsearch =~ /^-/) - { - if ($var =~ /^(.*)LDADD$/) - { - # Skip -dlopen and -dlpreopen; these are explicitly allowed. - next if $lsearch =~ /^-dl(pre)?open$/; - my $prefix = $1 || 'AM_'; - err_var ($var, "linker flags such as `$lsearch' belong in " - . "`${prefix}LDFLAGS"); - } - else - { - $var =~ /^(.*)LIBADD$/; - # Only get this error once. - $flagvar = 1; - err_var ($var, "linker flags such as `$lsearch' belong in " - . "`${1}LDFLAGS"); - } - } - - # Assume we have a file of some sort, and push it onto the - # dependency list. Autoconf substitutions are not pushed; - # rarely is a new dependency substituted into (eg) foo_LDADD - # -- but "bad things (eg -lX11) are routinely substituted. - # Note that LIBOBJS and ALLOCA are exceptions to this rule, - # and handled specially below. - push (@dep_list, $lsearch) - unless $lsearch =~ /^\@.*\@$/; - - # Automatically handle LIBOBJS and ALLOCA substitutions. - # Basically this means adding entries to dep_files. - if ($lsearch =~ /^\@(LT)?LIBOBJS\@$/) - { - my $lt = $1 ? $1 : ''; - my $myobjext = ($1 ? 'l' : '') . 'o'; - - push (@dep_list, $lsearch); - $seen_libobjs = 1; - if (! keys %libsources - && ! variable_defined ($lt . 'LIBOBJS')) - { - err_var ($var, "\@${lt}LIBOBJS\@ seen but never set in " - . "`$configure_ac'"); - } - - foreach my $iter (keys %libsources) - { - if ($iter =~ /\.[cly]$/) - { - &saw_extension ($&); - &saw_extension ('.c'); - } - - if ($iter =~ /\.h$/) - { - require_file_with_macro ($cond, $var, FOREIGN, $iter); - } - elsif ($iter ne 'alloca.c') - { - my $rewrite = $iter; - $rewrite =~ s/\.c$/.P$myobjext/; - $dep_files{'$(DEPDIR)/' . $rewrite} = 1; - $rewrite = "^" . quotemeta ($iter) . "\$"; - # Only require the file if it is not a built source. - if (! variable_defined ('BUILT_SOURCES') - || ! grep (/$rewrite/, - &variable_value_as_list_recursive ( - 'BUILT_SOURCES', 'all'))) - { - require_file_with_macro ($cond, $var, FOREIGN, $iter); - } - } - } - } - elsif ($lsearch =~ /^\@(LT)?ALLOCA\@$/) - { - my $lt = $1 ? $1 : ''; - my $myobjext = ($1 ? 'l' : '') . 'o'; - - push (@dep_list, $lsearch); - err_var ($var, "\@${lt}ALLOCA\@ seen but `AC_FUNC_ALLOCA' not in " - . "`$configure_ac'") - if ! defined $libsources{'alloca.c'}; - $dep_files{'$(DEPDIR)/alloca.P' . $myobjext} = 1; - require_file_with_macro ($cond, $var, FOREIGN, 'alloca.c'); - &saw_extension ('c'); - } - } - - if ($xname ne '') - { - my $depvar = $xname . '_DEPENDENCIES'; - if ((conditional_ambiguous_p ($depvar, $cond, - keys %{$var_value{$depvar}}))[0] ne '') - { - # Note that we've examined this. - &examine_variable ($depvar); - } - else - { - define_pretty_variable ($depvar, $cond, @dep_list); - } - } - - return $seen_libobjs; -} - -# Canonicalize the input parameter -sub canonicalize -{ - my ($string) = @_; - $string =~ tr/A-Za-z0-9_\@/_/c; - return $string; -} - -# Canonicalize a name, and check to make sure the non-canonical name -# is never used. Returns canonical name. Arguments are name and a -# list of suffixes to check for. -sub check_canonical_spelling -{ - my ($name, @suffixes) = @_; - - my $xname = &canonicalize ($name); - if ($xname ne $name) - { - foreach my $xt (@suffixes) - { - reject_var ("$name$xt", "use `$xname$xt', not `$name$xt'"); - } - } - - return $xname; -} - - -# handle_compile () -# ----------------- -# Set up the compile suite. -sub handle_compile () -{ - return - unless $get_object_extension_was_run; - - # Boilerplate. - my $default_includes = ''; - if (! defined $options{'nostdinc'}) - { - $default_includes = ' -I. -I$(srcdir)'; - - if (variable_defined ('CONFIG_HEADER')) - { - foreach my $hdr (split (' ', &variable_value ('CONFIG_HEADER'))) - { - $default_includes .= ' -I' . dirname ($hdr); - } - } - } - - my (@mostly_rms, @dist_rms); - foreach my $item (sort keys %compile_clean_files) - { - if ($compile_clean_files{$item} == MOSTLY_CLEAN) - { - push (@mostly_rms, "\t-rm -f $item"); - } - elsif ($compile_clean_files{$item} == DIST_CLEAN) - { - push (@dist_rms, "\t-rm -f $item"); - } - else - { - prog_error 'invalid entry in %compile_clean_files'; - } - } - - my ($coms, $vars, $rules) = - &file_contents_internal (1, "$libdir/am/compile.am", - ('DEFAULT_INCLUDES' => $default_includes, - 'MOSTLYRMS' => join ("\n", @mostly_rms), - 'DISTRMS' => join ("\n", @dist_rms))); - $output_vars .= $vars; - $output_rules .= "$coms$rules"; - - # Check for automatic de-ANSI-fication. - if (defined $options{'ansi2knr'}) - { - require_variables_for_macro ('AUTOMAKE_OPTIONS', - "option `ansi2knr' is used", - "ANSI2KNR", "U"); - - # topdir is where ansi2knr should be. - if ($options{'ansi2knr'} eq 'ansi2knr') - { - # Only require ansi2knr files if they should appear in - # this directory. - require_file_with_macro ('TRUE', 'AUTOMAKE_OPTIONS', FOREIGN, - 'ansi2knr.c', 'ansi2knr.1'); - - # ansi2knr needs to be built before subdirs, so unshift it. - unshift (@all, '$(ANSI2KNR)'); - } - - my $ansi2knr_dir = ''; - $ansi2knr_dir = dirname ($options{'ansi2knr'}) - if $options{'ansi2knr'} ne 'ansi2knr'; - - $output_rules .= &file_contents ('ansi2knr', - ('ANSI2KNR-DIR' => $ansi2knr_dir)); - - } -} - -# handle_libtool () -# ----------------- -# Handle libtool rules. -sub handle_libtool -{ - return unless variable_defined ('LIBTOOL'); - - # Libtool requires some files, but only at top level. - require_conf_file_with_macro ('TRUE', 'LIBTOOL', FOREIGN, @libtool_files) - if $relative_dir eq '.'; - - my @libtool_rms; - foreach my $item (sort keys %libtool_clean_directories) - { - my $dir = ($item eq '.') ? '' : "$item/"; - # .libs is for Unix, _libs for DOS. - push (@libtool_rms, "\t-rm -rf ${dir}.libs ${dir}_libs"); - } - - # Output the libtool compilation rules. - $output_rules .= &file_contents ('libtool', - ('LTRMS' => join ("\n", @libtool_rms))); -} - -# handle_programs () -# ------------------ -# Handle C programs. -sub handle_programs -{ - my @proglist = &am_install_var ('progs', 'PROGRAMS', - 'bin', 'sbin', 'libexec', 'pkglib', - 'noinst', 'check'); - return if ! @proglist; - - my $seen_global_libobjs = - variable_defined ('LDADD') && &handle_lib_objects ('', 'LDADD'); - - foreach my $one_file (@proglist) - { - my $seen_libobjs = 0; - my $obj = &get_object_extension ($one_file); - - # Canonicalize names and check for misspellings. - my $xname = &check_canonical_spelling ($one_file, '_LDADD', '_LDFLAGS', - '_SOURCES', '_OBJECTS', - '_DEPENDENCIES'); - - my $linker = &handle_source_transform ($xname, $one_file, $obj); - - my $xt = ''; - if (variable_defined ($xname . "_LDADD")) - { - $seen_libobjs = &handle_lib_objects ($xname, $xname . '_LDADD'); - $xt = '_LDADD'; - } - else - { - # User didn't define prog_LDADD override. So do it. - &define_variable ($xname . '_LDADD', '$(LDADD)'); - - # This does a bit too much work. But we need it to - # generate _DEPENDENCIES when appropriate. - if (variable_defined ('LDADD')) - { - $seen_libobjs = &handle_lib_objects ($xname, 'LDADD'); - } - elsif (! variable_defined ($xname . '_DEPENDENCIES')) - { - &define_variable ($xname . '_DEPENDENCIES', ''); - } - $xt = '_SOURCES'; - } - - reject_var ($xname . '_LIBADD', - "use `${xname}_LDADD', not `${xname}_LIBADD'"); - - if (! variable_defined ($xname . '_LDFLAGS')) - { - # Define the prog_LDFLAGS variable. - &define_variable ($xname . '_LDFLAGS', ''); - } - - # Determine program to use for link. - my $xlink; - if (variable_defined ($xname . '_LINK')) - { - $xlink = $xname . '_LINK'; - } - else - { - $xlink = $linker ? $linker : 'LINK'; - } - - # If the resulting program lies into a subdirectory, - # make sure this directory will exist. - my $dirstamp = require_build_directory_maybe ($one_file); - - # Don't add $(EXEEXT) if user already did. - my $extension = ($one_file !~ /\$\(EXEEXT\)$/ - ? "\$(EXEEXT)" - : ''); - - $output_rules .= &file_contents ('program', - ('PROGRAM' => $one_file, - 'XPROGRAM' => $xname, - 'XLINK' => $xlink, - 'DIRSTAMP' => $dirstamp, - 'EXEEXT' => $extension)); - - if ($seen_libobjs || $seen_global_libobjs) - { - if (variable_defined ($xname . '_LDADD')) - { - &check_libobjs_sources ($xname, $xname . '_LDADD'); - } - elsif (variable_defined ('LDADD')) - { - &check_libobjs_sources ($xname, 'LDADD'); - } - } - } -} - - -# handle_libraries () -# ------------------- -# Handle libraries. -sub handle_libraries -{ - my @liblist = &am_install_var ('libs', 'LIBRARIES', - 'lib', 'pkglib', 'noinst', 'check'); - return if ! @liblist; - - my @prefix = am_primary_prefixes ('LIBRARIES', 0, 'lib', 'pkglib', - 'noinst', 'check'); - - require_variables_for_macro ($prefix[0] . '_LIBRARIES', - 'library used', 'RANLIB') - if (@prefix); - - foreach my $onelib (@liblist) - { - my $seen_libobjs = 0; - # Check that the library fits the standard naming convention. - if (basename ($onelib) !~ /^lib.*\.a/) - { - # FIXME should put line number here. That means mapping - # from library name back to variable name. - err_am "`$onelib' is not a standard library name"; - } - - my $obj = &get_object_extension ($onelib); - - # Canonicalize names and check for misspellings. - my $xlib = &check_canonical_spelling ($onelib, '_LIBADD', '_SOURCES', - '_OBJECTS', '_DEPENDENCIES', - '_AR'); - - if (! variable_defined ($xlib . '_AR')) - { - &define_variable ($xlib . '_AR', '$(AR) cru'); - } - - if (variable_defined ($xlib . '_LIBADD')) - { - if (&handle_lib_objects ($xlib, $xlib . '_LIBADD')) - { - $seen_libobjs = 1; - } - } - else - { - # Generate support for conditional object inclusion in - # libraries. - &define_variable ($xlib . "_LIBADD", ''); - } - - reject_var ($xlib . '_LDADD', - "use `${xlib}_LIBADD', not `${xlib}_LDADD'"); - - # Make sure we at look at this. - &examine_variable ($xlib . '_DEPENDENCIES'); - - &handle_source_transform ($xlib, $onelib, $obj); - - # If the resulting library lies into a subdirectory, - # make sure this directory will exist. - my $dirstamp = require_build_directory_maybe ($onelib); - - $output_rules .= &file_contents ('library', - ('LIBRARY' => $onelib, - 'XLIBRARY' => $xlib, - 'DIRSTAMP' => $dirstamp)); - - if ($seen_libobjs) - { - if (variable_defined ($xlib . '_LIBADD')) - { - &check_libobjs_sources ($xlib, $xlib . '_LIBADD'); - } - } - } -} - - -# handle_ltlibraries () -# --------------------- -# Handle shared libraries. -sub handle_ltlibraries -{ - my @liblist = &am_install_var ('ltlib', 'LTLIBRARIES', - 'noinst', 'lib', 'pkglib', 'check'); - return if ! @liblist; - - my %instdirs; - my @prefix = am_primary_prefixes ('LTLIBRARIES', 0, 'lib', 'pkglib', - 'noinst', 'check'); - - require_variables_for_macro ($prefix[0] . '_LTLIBRARIES', - 'Libtool library used', 'LIBTOOL') - if (@prefix); - - foreach my $key (@prefix) - { - # Get the installation directory of each library. - (my $dir = $key) =~ s/^nobase_//; - for (variable_value_as_list_recursive ($key . '_LTLIBRARIES', 'all')) - { - # We reject libraries which are installed in several places, - # because we don't handle this in the rules (think `-rpath'). - # - # However, we allow the same library to be listed many times - # for the same directory. This is for users who need setups - # like - # if COND1 - # lib_LTLIBRARIES = libfoo.la - # endif - # if COND2 - # lib_LTLIBRARIES = libfoo.la - # endif - # - # Actually this will also allow - # lib_LTLIBRARIES = libfoo.la libfoo.la - # Diagnosing this case doesn't seem worth the plain (we'd - # have to fill $instdirs on a per-condition basis, check - # implied conditions, etc.) - if (defined $instdirs{$_} && $instdirs{$_} ne $dir) - { - err_am ("`$_' is already going to be installed in " - . "`$instdirs{$_}'"); - } - else - { - $instdirs{$_} = $dir; - } - } - } - - foreach my $onelib (@liblist) - { - my $seen_libobjs = 0; - my $obj = &get_object_extension ($onelib); - - # Canonicalize names and check for misspellings. - my $xlib = &check_canonical_spelling ($onelib, '_LIBADD', '_LDFLAGS', - '_SOURCES', '_OBJECTS', - '_DEPENDENCIES'); - - if (! variable_defined ($xlib . '_LDFLAGS')) - { - # Define the lib_LDFLAGS variable. - &define_variable ($xlib . '_LDFLAGS', ''); - } - - # Check that the library fits the standard naming convention. - my $libname_rx = "^lib.*\.la"; - if ((variable_defined ($xlib . '_LDFLAGS') - && grep (/-module/, - &variable_value_as_list_recursive ($xlib . '_LDFLAGS', - 'all'))) - || (variable_defined ('LDFLAGS') - && grep (/-module/, - &variable_value_as_list_recursive ('LDFLAGS', 'all')))) - { - # Relax name checking for libtool modules. - $libname_rx = "\.la"; - } - if (basename ($onelib) !~ /$libname_rx$/) - { - # FIXME should put line number here. That means mapping - # from library name back to variable name. - msg_am ('error-gnu/warn', - "`$onelib' is not a standard libtool library name"); - } - - if (variable_defined ($xlib . '_LIBADD')) - { - if (&handle_lib_objects ($xlib, $xlib . '_LIBADD')) - { - $seen_libobjs = 1; - } - } - else - { - # Generate support for conditional object inclusion in - # libraries. - &define_variable ($xlib . "_LIBADD", ''); - } - - reject_var ("${xlib}_LDADD", - "use `${xlib}_LIBADD', not `${xlib}_LDADD'"); - - # Make sure we at look at this. - &examine_variable ($xlib . '_DEPENDENCIES'); - - my $linker = &handle_source_transform ($xlib, $onelib, $obj); - - # Determine program to use for link. - my $xlink; - if (variable_defined ($xlib . '_LINK')) - { - $xlink = $xlib . '_LINK'; - } - else - { - $xlink = $linker ? $linker : 'LINK'; - } - - my $rpath; - if ($instdirs{$onelib} eq 'EXTRA' - || $instdirs{$onelib} eq 'noinst' - || $instdirs{$onelib} eq 'check') - { - # It's an EXTRA_ library, so we can't specify -rpath, - # because we don't know where the library will end up. - # The user probably knows, but generally speaking automake - # doesn't -- and in fact configure could decide - # dynamically between two different locations. - $rpath = ''; - } - else - { - $rpath = ('-rpath $(' . $instdirs{$onelib} . 'dir)'); - } - - # If the resulting library lies into a subdirectory, - # make sure this directory will exist. - my $dirstamp = require_build_directory_maybe ($onelib); - - # Remember to cleanup .libs/ in this directory. - my $dirname = dirname $onelib; - $libtool_clean_directories{$dirname} = 1; - - $output_rules .= &file_contents ('ltlibrary', - ('LTLIBRARY' => $onelib, - 'XLTLIBRARY' => $xlib, - 'RPATH' => $rpath, - 'XLINK' => $xlink, - 'DIRSTAMP' => $dirstamp)); - if ($seen_libobjs) - { - if (variable_defined ($xlib . '_LIBADD')) - { - &check_libobjs_sources ($xlib, $xlib . '_LIBADD'); - } - } - } -} - -# See if any _SOURCES variable were misspelled. -sub check_typos () -{ - # It is ok if the user sets this particular variable. - &examine_variable ('AM_LDFLAGS'); - - foreach my $varname (keys %var_value) - { - foreach my $primary ('_SOURCES', '_LIBADD', '_LDADD', '_LDFLAGS', - '_DEPENDENCIES') - { - msg_var 'syntax', $varname, "unused variable: `$varname'" - # Note that a configure variable is always legitimate. - if ($varname =~ /$primary$/ && ! $content_seen{$varname} - && ! exists $configure_vars{$varname}); - } - } -} - - -# Handle scripts. -sub handle_scripts -{ - # NOTE we no longer automatically clean SCRIPTS, because it is - # useful to sometimes distribute scripts verbatim. This happens - # eg in Automake itself. - &am_install_var ('-candist', 'scripts', 'SCRIPTS', - 'bin', 'sbin', 'libexec', 'pkgdata', - 'noinst', 'check'); -} - - -# ($OUTFILE, $VFILE, @CLEAN_FILES) -# &scan_texinfo_file ($FILENAME) -# ------------------------------ -# $OUTFILE is the name of the info file produced by $FILENAME. -# $VFILE is the name of the version.texi file used (empty if none). -# @CLEAN_FILES is the list of by products (indexes etc.) -sub scan_texinfo_file -{ - my ($filename) = @_; - - # These are always created, no matter whether indexes are used or not. - # (Actually tmp is only created if an @macro is used and a certain e-TeX - # feature is not available.) - my @clean_suffixes = qw(aux log toc tmp - cp fn ky vr tp pg); # grep new.*index texinfo.tex - - # There are predefined indexes which don't follow the regular rules. - my %predefined_index = qw(c cps - f fns - k kys - v vrs - t tps - p pgs); - - # There are commands which include a hidden index command. - my %hidden_index = (tp => 'tps'); - $hidden_index{$_} = 'fns' foreach qw(fn un typefn typefun max spec - op typeop method typemethod); - $hidden_index{$_} = 'vrs' foreach qw(vr var typevr typevar opt cv - ivar typeivar); - - # Indexes stored into another one. In this case, the *.??s file - # is not created. - my @syncodeindexes = (); - - my $texi = new Automake::XFile "< $filename"; - verb "reading $filename"; - - my ($outfile, $vfile); - while ($_ = $texi->getline) - { - if (/^\@setfilename +(\S+)/) - { - $outfile = $1; - if ($outfile =~ /\.(.+)$/ && $1 ne 'info') - { - err "$filename:$.", "output `$outfile' has unrecognized extension"; - return; - } - } - # A "version.texi" file is actually any file whose name - # matches "vers*.texi". - elsif (/^\@include\s+(vers[^.]*\.texi)\s*$/) - { - $vfile = $1; - } - - # Try to find what are the indexes which are used. - - # Creating a new category of index. - elsif (/^\@def(code)?index (\w+)/) - { - push @clean_suffixes, $2; - } - - # Storing in a predefined index. - elsif (/^\@([cfkvtp])index /) - { - push @clean_suffixes, $predefined_index{$1}; - } - elsif (/^\@def(\w+) /) - { - push @clean_suffixes, $hidden_index{$1} - if defined $hidden_index{$1}; - } - - # Merging an index into an another. - elsif (/^\@syn(code)?index (\w+) (\w+)/) - { - push @syncodeindexes, "$2s"; - push @clean_suffixes, "$3s"; - } - - } - - if ($outfile eq '') - { - err_am "`$filename' missing \@setfilename"; - return; - } - - my $infobase = basename ($filename); - $infobase =~ s/\.te?xi(nfo)?$//; - my %clean_files = map { +"$infobase.$_" => 1 } @clean_suffixes; - grep { delete $clean_files{"$infobase.$_"} } @syncodeindexes; - return ($outfile, $vfile, (sort keys %clean_files)); -} - -# ($DIRSTAMP, @CLEAN_FILES) -# output_texinfo_build_rules ($SOURCE, $DEST, @DEPENDENCIES) -# ---------------------------------------------------------- -# SOURCE - the source Texinfo file -# DEST - the destination Info file -# DEPENDENCIES - known dependencies -sub output_texinfo_build_rules ($$@) -{ - my ($source, $dest, @deps) = @_; - - # Split `a.texi' into `a' and `.texi'. - my ($spfx, $ssfx) = ($source =~ /^(.*?)(\.[^.]*)?$/); - my ($dpfx, $dsfx) = ($dest =~ /^(.*?)(\.[^.]*)?$/); - - $ssfx ||= ""; - $dsfx ||= ""; - - # We can output two kinds of rules: the "generic" rules - # use Make suffix rules and are appropritate when - # $source and $dest lie in the current directory; the "specifix" - # rules is needed in the other case. - # - # The former are output only once (this is not really apparent - # here, but just remember that some logic deeper in Automake will - # not output the same rule twice); while the later need to be output - # for each Texinfo source. - my $generic; - my $makeinfoflags; - my $sdir = dirname $source; - if ($sdir eq '.' && dirname ($dest) eq '.') - { - $generic = 1; - $makeinfoflags = '-I $(srcdir)'; - } - else - { - $generic = 0; - $makeinfoflags = "-I $sdir -I \$(srcdir)/$sdir"; - } - - # If the resulting file lie into a subdirectory, - # make sure this directory will exist. - my $dirstamp = require_build_directory_maybe ($dest); - - $output_rules .= &file_contents ('texibuild', - GENERIC => $generic, - SOURCE_SUFFIX => $ssfx, - SOURCE => ($generic ? '$<' : $source), - SOURCE_REAL => $source, - DEST_PREFIX => $dpfx, - DEST_SUFFIX => $dsfx, - MAKEINFOFLAGS => $makeinfoflags, - DEPS => "@deps", - DIRSTAMP => $dirstamp); - return ($dirstamp, "$dpfx.dvi", "$dpfx.pdf", "$dpfx.ps"); -} - - -# ($DO-SOMETHING, $TEXICLEANS) -# handle_texinfo_helper () -# ------------------------ -# Handle all Texinfo source; helper for handle_texinfo -sub handle_texinfo_helper -{ - reject_var 'TEXINFOS', "`TEXINFOS' is an anachronism; use `info_TEXINFOS'"; - reject_var 'html_TEXINFOS', "HTML generation not yet supported"; - - return (0, '') if ! variable_defined ('info_TEXINFOS'); - - my @texis = &variable_value_as_list_recursive ('info_TEXINFOS', 'all'); - - my (@info_deps_list, @dvis_list, @pdfs_list, @pss_list, @texi_deps); - my %versions; - my $done = 0; - my @texi_cleans; - my $canonical; - - foreach my $info_cursor (@texis) - { - my $infobase = $info_cursor; - $infobase =~ s/\.(txi|texinfo|texi)$//; - - if ($infobase eq $info_cursor) - { - # FIXME: report line number. - err_am "texinfo file `$info_cursor' has unrecognized extension"; - next; - } - - # If 'version.texi' is referenced by input file, then include - # automatic versioning capability. - my ($out_file, $vtexi, @clean_files) = - &scan_texinfo_file ("$relative_dir/$info_cursor") - or next; - push (@texi_cleans, @clean_files); - - # If the Texinfo source is in a subdirectory, create the - # resulting info in this subdirectory. If it is in the - # current directory, try hard to not prefix "./" because - # it breaks the generic rules. - my $outdir = dirname ($info_cursor) . '/'; - $outdir = "" if $outdir eq './'; - $out_file = $outdir . $out_file; - - # If user specified file_TEXINFOS, then use that as explicit - # dependency list. - @texi_deps = (); - push (@texi_deps, "$outdir$vtexi") if $vtexi; - - my $canonical = &canonicalize ($infobase); - if (variable_defined ($canonical . "_TEXINFOS")) - { - push (@texi_deps, '$(' . $canonical . '_TEXINFOS)'); - &push_dist_common ('$(' . $canonical . '_TEXINFOS)'); - } - - my ($dirstamp, @cfiles) = - output_texinfo_build_rules ($info_cursor, $out_file, @texi_deps); - push (@texi_cleans, @cfiles); - - push (@info_deps_list, $out_file); - push (@dvis_list, $infobase . '.dvi'); - push (@pdfs_list, $infobase . '.pdf'); - push (@pss_list, $infobase . '.ps'); - - # If a vers*.texi file is needed, emit the rule. - if ($vtexi) - { - err_am ("`$vtexi', included in `$info_cursor', " - . "also included in `$versions{$vtexi}'") - if defined $versions{$vtexi}; - $versions{$vtexi} = $info_cursor; - - # We number the stamp-vti files. This is doable since the - # actual names don't matter much. We only number starting - # with the second one, so that the common case looks nice. - my $vti = ($done ? $done : 'vti'); - ++$done; - - # This is ugly, but it is our historical practice. - if ($config_aux_dir_set_in_configure_in) - { - require_conf_file_with_macro ('TRUE', 'info_TEXINFOS', FOREIGN, - 'mdate-sh'); - } - else - { - require_file_with_macro ('TRUE', 'info_TEXINFOS', - FOREIGN, 'mdate-sh'); - } - - my $conf_dir; - if ($config_aux_dir_set_in_configure_in) - { - $conf_dir = $config_aux_dir; - $conf_dir .= '/' unless $conf_dir =~ /\/$/; - } - else - { - $conf_dir = '$(srcdir)/'; - } - $output_rules .= &file_contents ('texi-vers', - TEXI => $info_cursor, - VTI => $vti, - STAMPVTI => "${outdir}stamp-$vti", - VTEXI => "$outdir$vtexi", - MDDIR => $conf_dir, - DIRSTAMP => $dirstamp); - } - } - - # Handle location of texinfo.tex. - my $need_texi_file = 0; - my $texinfodir; - if ($cygnus_mode) - { - $texinfodir = '$(top_srcdir)/../texinfo'; - &define_variable ('TEXINFO_TEX', "$texinfodir/texinfo.tex"); - } - elsif ($config_aux_dir_set_in_configure_in) - { - $texinfodir = $config_aux_dir; - &define_variable ('TEXINFO_TEX', "$texinfodir/texinfo.tex"); - $need_texi_file = 2; # so that we require_conf_file later - } - elsif (variable_defined ('TEXINFO_TEX')) - { - # The user defined TEXINFO_TEX so assume he knows what he is - # doing. - $texinfodir = ('$(srcdir)/' - . dirname (&variable_value ('TEXINFO_TEX'))); - } - else - { - $texinfodir = '$(srcdir)'; - $need_texi_file = 1; - } - &define_variable ('am__TEXINFO_TEX_DIR', $texinfodir); - - # The return value. - my $texiclean = &pretty_print_internal ("", "\t ", @texi_cleans); - - push (@dist_targets, 'dist-info'); - - if (! defined $options{'no-installinfo'}) - { - # Make sure documentation is made and installed first. Use - # $(INFO_DEPS), not 'info', because otherwise recursive makes - # get run twice during "make all". - unshift (@all, '$(INFO_DEPS)'); - } - - &define_variable ("INFO_DEPS", "@info_deps_list"); - &define_variable ("DVIS", "@dvis_list"); - &define_variable ("PDFS", "@pdfs_list"); - &define_variable ("PSS", "@pss_list"); - # This next isn't strictly needed now -- the places that look here - # could easily be changed to look in info_TEXINFOS. But this is - # probably better, in case noinst_TEXINFOS is ever supported. - &define_variable ("TEXINFOS", &variable_value ('info_TEXINFOS')); - - # Do some error checking. Note that this file is not required - # when in Cygnus mode; instead we defined TEXINFO_TEX explicitly - # up above. - if ($need_texi_file && ! defined $options{'no-texinfo.tex'}) - { - if ($need_texi_file > 1) - { - require_conf_file_with_macro ('TRUE', 'info_TEXINFOS', FOREIGN, - 'texinfo.tex'); - } - else - { - require_file_with_macro ('TRUE', 'info_TEXINFOS', FOREIGN, - 'texinfo.tex'); - } - } - - return (1, $texiclean); -} - -# handle_texinfo () -# ----------------- -# Handle all Texinfo source. -sub handle_texinfo -{ - my ($do_something, $texiclean) = handle_texinfo_helper (); - $output_rules .= &file_contents ('texinfos', - ('TEXICLEAN' => $texiclean, - 'LOCAL-TEXIS' => $do_something)); -} - -# Handle any man pages. -sub handle_man_pages -{ - reject_var 'MANS', "`MANS' is an anachronism; use `man_MANS'"; - - # Find all the sections in use. We do this by first looking for - # "standard" sections, and then looking for any additional - # sections used in man_MANS. - my (%sections, %vlist); - # We handle nodist_ for uniformity. man pages aren't distributed - # by default so it isn't actually very important. - foreach my $pfx ('', 'dist_', 'nodist_') - { - # Add more sections as needed. - foreach my $section ('0'..'9', 'n', 'l') - { - if (variable_defined ($pfx . 'man' . $section . '_MANS')) - { - $sections{$section} = 1; - $vlist{'$(' . $pfx . 'man' . $section . '_MANS)'} = 1; - - &push_dist_common ('$(' . $pfx . 'man' . $section . '_MANS)') - if $pfx eq 'dist_'; - } - } - - if (variable_defined ($pfx . 'man_MANS')) - { - $vlist{'$(' . $pfx . 'man_MANS)'} = 1; - foreach (&variable_value_as_list_recursive ($pfx . 'man_MANS', 'all')) - { - # A page like `foo.1c' goes into man1dir. - if (/\.([0-9a-z])([a-z]*)$/) - { - $sections{$1} = 1; - } - } - - &push_dist_common ('$(' . $pfx . 'man_MANS)') - if $pfx eq 'dist_'; - } - } - - return unless %sections; - - # Now for each section, generate an install and unintall rule. - # Sort sections so output is deterministic. - foreach my $section (sort keys %sections) - { - $output_rules .= &file_contents ('mans', ('SECTION' => $section)); - } - - my @mans = sort keys %vlist; - $output_vars .= file_contents ('mans-vars', - ('MANS' => "@mans")); - - if (! defined $options{'no-installman'}) - { - push (@all, '$(MANS)'); - } -} - -# Handle DATA variables. -sub handle_data -{ - &am_install_var ('-noextra', '-candist', 'data', 'DATA', - 'data', 'sysconf', 'sharedstate', 'localstate', - 'pkgdata', 'noinst', 'check'); -} - -# Handle TAGS. -sub handle_tags -{ - my @tag_deps = (); - my @ctag_deps = (); - if (variable_defined ('SUBDIRS')) - { - $output_rules .= ("tags-recursive:\n" - . "\tlist=\'\$(SUBDIRS)\'; for subdir in \$\$list; do \\\n" - # Never fail here if a subdir fails; it - # isn't important. - . "\t test \"\$\$subdir\" = . || (cd \$\$subdir" - . " && \$(MAKE) \$(AM_MAKEFLAGS) tags); \\\n" - . "\tdone\n"); - push (@tag_deps, 'tags-recursive'); - &depend ('.PHONY', 'tags-recursive'); - - $output_rules .= ("ctags-recursive:\n" - . "\tlist=\'\$(SUBDIRS)\'; for subdir in \$\$list; do \\\n" - # Never fail here if a subdir fails; it - # isn't important. - . "\t test \"\$\$subdir\" = . || (cd \$\$subdir" - . " && \$(MAKE) \$(AM_MAKEFLAGS) ctags); \\\n" - . "\tdone\n"); - push (@ctag_deps, 'ctags-recursive'); - &depend ('.PHONY', 'ctags-recursive'); - } - - if (&saw_sources_p (1) - || variable_defined ('ETAGS_ARGS') - || @tag_deps) - { - my @config; - foreach my $spec (@config_headers) - { - my ($out, @ins) = split_config_file_spec ($spec); - foreach my $in (@ins) - { - # If the config header source is in this directory, - # require it. - push @config, basename ($in) - if $relative_dir eq dirname ($in); - } - } - $output_rules .= &file_contents ('tags', - ('CONFIG' => "@config", - 'TAGSDIRS' => "@tag_deps", - 'CTAGSDIRS' => "@ctag_deps")); - &examine_variable ('TAGS_DEPENDENCIES'); - } - elsif (reject_var ('TAGS_DEPENDENCIES', - "doesn't make sense to define `TAGS_DEPENDENCIES'" - . "without\nsources or `ETAGS_ARGS'")) - { - } - else - { - # Every Makefile must define some sort of TAGS rule. - # Otherwise, it would be possible for a top-level "make TAGS" - # to fail because some subdirectory failed. - $output_rules .= "tags: TAGS\nTAGS:\n\n"; - # Ditto ctags. - $output_rules .= "ctags: CTAGS\nCTAGS:\n\n"; - } -} - -# Handle multilib support. -sub handle_multilib -{ - if ($seen_multilib && $relative_dir eq '.') - { - $output_rules .= &file_contents ('multilib'); - } -} - - -# $BOOLEAN -# &for_dist_common ($A, $B) -# ------------------------- -# Subroutine for &handle_dist: sort files to dist. -# -# We put README first because it then becomes easier to make a -# Usenet-compliant shar file (in these, README must be first). -# -# FIXME: do more ordering of files here. -sub for_dist_common -{ - return 0 - if $a eq $b; - return -1 - if $a eq 'README'; - return 1 - if $b eq 'README'; - return $a cmp $b; -} - - -# handle_dist ($MAKEFILE) -# ----------------------- -# Handle 'dist' target. -sub handle_dist -{ - my ($makefile) = @_; - - # `make dist' isn't used in a Cygnus-style tree. - # Omit the rules so that people don't try to use them. - return if $cygnus_mode; - - # Look for common files that should be included in distribution. - # If the aux dir is set, and it does not have a Makefile.am, then - # we check for these files there as well. - my $check_aux = 0; - my $auxdir = ''; - if ($relative_dir eq '.' - && $config_aux_dir_set_in_configure_in) - { - ($auxdir = $config_aux_dir) =~ s,^\$\(top_srcdir\)/,,; - if (! &is_make_dir ($auxdir)) - { - $check_aux = 1; - } - } - foreach my $cfile (@common_files) - { - if (-f ($relative_dir . "/" . $cfile) - # The file might be absent, but if it can be built it's ok. - || exists $targets{$cfile}) - { - &push_dist_common ($cfile); - } - - # Don't use `elsif' here because a file might meaningfully - # appear in both directories. - if ($check_aux && -f ($auxdir . '/' . $cfile)) - { - &push_dist_common ($auxdir . '/' . $cfile); - } - } - - # We might copy elements from $configure_dist_common to - # %dist_common if we think we need to. If the file appears in our - # directory, we would have discovered it already, so we don't - # check that. But if the file is in a subdir without a Makefile, - # we want to distribute it here if we are doing `.'. Ugly! - if ($relative_dir eq '.') - { - foreach my $file (split (' ' , $configure_dist_common)) - { - push_dist_common ($file) - unless is_make_dir (dirname ($file)); - } - } - - - - # Files to distributed. Don't use &variable_value_as_list_recursive - # as it recursively expands `$(dist_pkgdata_DATA)' etc. - check_variable_defined_unconditionally ('DIST_COMMON'); - my @dist_common = split (' ', variable_value ('DIST_COMMON', 'TRUE')); - @dist_common = uniq (sort for_dist_common (@dist_common)); - pretty_print ('DIST_COMMON = ', "\t", @dist_common); - - # Now that we've processed DIST_COMMON, disallow further attempts - # to set it. - $handle_dist_run = 1; - - # Scan EXTRA_DIST to see if we need to distribute anything from a - # subdir. If so, add it to the list. I didn't want to do this - # originally, but there were so many requests that I finally - # relented. - if (variable_defined ('EXTRA_DIST')) - { - # FIXME: This should be fixed to work with conditionals. That - # will require only making the entries in %dist_dirs under the - # appropriate condition. This is meaningful if the nature of - # the distribution should depend upon the configure options - # used. - foreach (&variable_value_as_list_recursive ('EXTRA_DIST', '')) - { - next if /^\@.*\@$/; - next unless s,/+[^/]+$,,; - $dist_dirs{$_} = 1 - unless $_ eq '.'; - } - } - - # We have to check DIST_COMMON for extra directories in case the - # user put a source used in AC_OUTPUT into a subdir. - my $topsrcdir = backname ($relative_dir); - foreach (&variable_value_as_list_recursive ('DIST_COMMON', 'all')) - { - next if /^\@.*\@$/; - s/\$\(top_srcdir\)/$topsrcdir/; - s/\$\(srcdir\)/./; - next unless s,/+[^/]+$,,; - $dist_dirs{$_} = 1 - unless $_ eq '.'; - } - - # Rule to check whether a distribution is viable. - my %transform = ('DISTCHECK-HOOK' => &target_defined ('distcheck-hook'), - 'GETTEXT' => $seen_gettext); - - # Prepend $(distdir) to each directory given. - my %rewritten = map { '$(distdir)/' . "$_" => 1 } keys %dist_dirs; - $transform{'DISTDIRS'} = join (' ', sort keys %rewritten); - - # If we have SUBDIRS, create all dist subdirectories and do - # recursive build. - if (variable_defined ('SUBDIRS')) - { - # If SUBDIRS is conditionally defined, then set DIST_SUBDIRS - # to all possible directories, and use it. If DIST_SUBDIRS is - # defined, just use it. - my $dist_subdir_name; - # Note that we check DIST_SUBDIRS first on purpose. At least - # one project uses so many conditional subdirectories that - # calling variable_conditionally_defined on SUBDIRS will cause - # automake to grow to 150Mb. Sigh. - if (variable_defined ('DIST_SUBDIRS') - || variable_conditionally_defined ('SUBDIRS')) - { - $dist_subdir_name = 'DIST_SUBDIRS'; - if (! variable_defined ('DIST_SUBDIRS')) - { - define_pretty_variable - ('DIST_SUBDIRS', '', - uniq (&variable_value_as_list_recursive ('SUBDIRS', 'all'))); - } - } - else - { - $dist_subdir_name = 'SUBDIRS'; - # We always define this because that is what `distclean' - # wants. - define_pretty_variable ('DIST_SUBDIRS', '', '$(SUBDIRS)'); - } - - $transform{'DIST_SUBDIR_NAME'} = $dist_subdir_name; - } - - # If the target `dist-hook' exists, make sure it is run. This - # allows users to do random weird things to the distribution - # before it is packaged up. - push (@dist_targets, 'dist-hook') - if &target_defined ('dist-hook'); - $transform{'DIST-TARGETS'} = join(' ', @dist_targets); - - # Defining $(DISTDIR). - $transform{'DISTDIR'} = !variable_defined('distdir'); - $transform{'TOP_DISTDIR'} = backname ($relative_dir); - - $output_rules .= &file_contents ('distdir', %transform); -} - - -# Handle subdirectories. -sub handle_subdirs -{ - return - unless variable_defined ('SUBDIRS'); - - my @subdirs = &variable_value_as_list_recursive ('SUBDIRS', 'all'); - my @dsubdirs = (); - @dsubdirs = &variable_value_as_list_recursive ('DIST_SUBDIRS', 'all') - if variable_defined ('DIST_SUBDIRS'); - - # If an `obj/' directory exists, BSD make will enter it before - # reading `Makefile'. Hence the `Makefile' in the current directory - # will not be read. - # - # % cat Makefile - # all: - # echo Hello - # % cat obj/Makefile - # all: - # echo World - # % make # GNU make - # echo Hello - # Hello - # % pmake # BSD make - # echo World - # World - msg_var ('portability', 'SUBDIRS', - "naming a subdirectory `obj' causes troubles with BSD make") - if grep ($_ eq 'obj', @subdirs); - msg_var ('portability', 'DIST_SUBDIRS', - "naming a subdirectory `obj' causes troubles with BSD make") - if grep ($_ eq 'obj', @dsubdirs); - - # Make sure each directory mentioned in SUBDIRS actually exists. - foreach my $dir (@subdirs) - { - # Skip directories substituted by configure. - next if $dir =~ /^\@.*\@$/; - - if (! -d $am_relative_dir . '/' . $dir) - { - err_var ('SUBDIRS', "required directory $am_relative_dir/$dir " - . "does not exist"); - next; - } - - err_var 'SUBDIRS', "directory should not contain `/'" - if $dir =~ /\//; - } - - $output_rules .= &file_contents ('subdirs'); - variable_pretty_output ('RECURSIVE_TARGETS', 'TRUE'); -} - - -# ($REGEN, @DEPENDENCIES) -# &scan_aclocal_m4 -# ---------------- -# If aclocal.m4 creation is automated, return the list of its dependencies. -sub scan_aclocal_m4 -{ - my $regen_aclocal = 0; - - return (0, ()) - unless $relative_dir eq '.'; - - &examine_variable ('CONFIG_STATUS_DEPENDENCIES'); - &examine_variable ('CONFIGURE_DEPENDENCIES'); - - if (-f 'aclocal.m4') - { - &define_variable ("ACLOCAL_M4", '$(top_srcdir)/aclocal.m4'); - &push_dist_common ('aclocal.m4'); - - my $aclocal = new Automake::XFile "< aclocal.m4"; - my $line = $aclocal->getline; - $regen_aclocal = $line =~ 'generated automatically by aclocal'; - } - - my @ac_deps = (); - - if (-f 'acinclude.m4') - { - $regen_aclocal = 1; - push @ac_deps, 'acinclude.m4'; - } - - if (variable_defined ('ACLOCAL_M4_SOURCES')) - { - push (@ac_deps, '$(ACLOCAL_M4_SOURCES)'); - } - elsif (variable_defined ('ACLOCAL_AMFLAGS')) - { - # Scan all -I directories for m4 files. These are our - # dependencies. - my $examine_next = 0; - foreach my $amdir (&variable_value_as_list_recursive ('ACLOCAL_AMFLAGS', '')) - { - if ($examine_next) - { - $examine_next = 0; - if ($amdir !~ /^\// && -d $amdir) - { - foreach my $ac_dep (&my_glob ($amdir . '/*.m4')) - { - $ac_dep =~ s/^\.\/+//; - push (@ac_deps, $ac_dep) - unless $ac_dep eq "aclocal.m4" - || $ac_dep eq "acinclude.m4"; - } - } - } - elsif ($amdir eq '-I') - { - $examine_next = 1; - } - } - } - - # Note that it might be possible that aclocal.m4 doesn't exist but - # should be auto-generated. This case probably isn't very - # important. - - return ($regen_aclocal, @ac_deps); -} - - -# @DEPENDENCY -# &rewrite_inputs_into_dependencies ($ADD_SRCDIR, @INPUTS) -# -------------------------------------------------------- -# Rewrite a list of input files into a form suitable to put on a -# dependency list. The idea is that if an input file has a directory -# part the same as the current directory, then the directory part is -# simply removed. But if the directory part is different, then -# $(top_srcdir) is prepended. Among other things, this is used to -# generate the dependency list for the output files generated by -# AC_OUTPUT. Consider what the dependencies should look like in this -# case: -# AC_OUTPUT(src/out:src/in1:lib/in2) -# The first argument, ADD_SRCDIR, is 1 if $(top_srcdir) should be added. -# If 0 then files that require this addition will simply be ignored. -sub rewrite_inputs_into_dependencies ($@) -{ - my ($add_srcdir, @inputs) = @_; - my @newinputs; - - foreach my $single (@inputs) - { - if (dirname ($single) eq $relative_dir) - { - push (@newinputs, basename ($single)); - } - elsif ($add_srcdir) - { - push (@newinputs, '$(top_srcdir)/' . $single); - } - } - - return @newinputs; -} - -# Handle remaking and configure stuff. -# We need the name of the input file, to do proper remaking rules. -sub handle_configure -{ - my ($local, $input, @secondary_inputs) = @_; - - my $input_base = basename ($input); - my $local_base = basename ($local); - - my $amfile = $input_base . '.am'; - # We know we can always add '.in' because it really should be an - # error if the .in was missing originally. - my $infile = '$(srcdir)/' . $input_base . '.in'; - my $colon_infile = ''; - if ($local ne $input || @secondary_inputs) - { - $colon_infile = ':' . $input . '.in'; - } - $colon_infile .= ':' . join (':', @secondary_inputs) - if @secondary_inputs; - - my @rewritten = rewrite_inputs_into_dependencies (1, @secondary_inputs); - - my ($regen_aclocal_m4, @aclocal_m4_deps) = scan_aclocal_m4 (); - - $output_rules .= - &file_contents ('configure', - ('MAKEFILE' - => $local_base, - 'MAKEFILE-DEPS' - => "@rewritten", - 'CONFIG-MAKEFILE' - => ((($relative_dir eq '.') ? '$@' : '$(subdir)/$@') - . $colon_infile), - 'MAKEFILE-IN' - => $infile, - 'MAKEFILE-IN-DEPS' - => "@include_stack", - 'MAKEFILE-AM' - => $amfile, - 'STRICTNESS' - => $cygnus_mode ? 'cygnus' : $strictness_name, - 'USE-DEPS' - => $cmdline_use_dependencies ? '' : ' --ignore-deps', - 'MAKEFILE-AM-SOURCES' - => "$input$colon_infile", - 'REGEN-ACLOCAL-M4' - => $regen_aclocal_m4, - 'ACLOCAL_M4_DEPS' - => "@aclocal_m4_deps")); - - if ($relative_dir eq '.') - { - &push_dist_common ('acconfig.h') - if -f 'acconfig.h'; - } - - # If we have a configure header, require it. - my $hdr_index = 0; - my @distclean_config; - foreach my $spec (@config_headers) - { - $hdr_index += 1; - # $CONFIG_H_PATH: config.h from top level. - my ($config_h_path, @ins) = split_config_file_spec ($spec); - my $config_h_dir = dirname ($config_h_path); - - # If the header is in the current directory we want to build - # the header here. Otherwise, if we're at the topmost - # directory and the header's directory doesn't have a - # Makefile, then we also want to build the header. - if ($relative_dir eq $config_h_dir - || ($relative_dir eq '.' && ! &is_make_dir ($config_h_dir))) - { - my ($cn_sans_dir, $stamp_dir); - if ($relative_dir eq $config_h_dir) - { - $cn_sans_dir = basename ($config_h_path); - $stamp_dir = ''; - } - else - { - $cn_sans_dir = $config_h_path; - if ($config_h_dir eq '.') - { - $stamp_dir = ''; - } - else - { - $stamp_dir = $config_h_dir . '/'; - } - } - - # Compute relative path from directory holding output - # header to directory holding input header. FIXME: - # doesn't handle case where we have multiple inputs. - my $in0_sans_dir; - if (dirname ($ins[0]) eq $relative_dir) - { - $in0_sans_dir = basename ($ins[0]); - } - else - { - $in0_sans_dir = backname ($relative_dir) . '/' . $ins[0]; - } - - require_file ($config_header_location, FOREIGN, $in0_sans_dir); - - # Header defined and in this directory. - my @files; - if (-f $config_h_path . '.top') - { - push (@files, "$cn_sans_dir.top"); - } - if (-f $config_h_path . '.bot') - { - push (@files, "$cn_sans_dir.bot"); - } - - push_dist_common (@files); - - # For now, acconfig.h can only appear in the top srcdir. - if (-f 'acconfig.h') - { - push (@files, '$(top_srcdir)/acconfig.h'); - } - - my $stamp = "${stamp_dir}stamp-h${hdr_index}"; - $output_rules .= - file_contents ('remake-hdr', - ('FILES' => "@files", - 'CONFIG_H' => $cn_sans_dir, - 'CONFIG_HIN' => $in0_sans_dir, - 'CONFIG_H_PATH' => $config_h_path, - 'STAMP' => "$stamp")); - - push @distclean_config, $cn_sans_dir, $stamp; - } - } - - $output_rules .= file_contents ('clean-hdr', - ('FILES' => "@distclean_config")) - if @distclean_config; - - # Set location of mkinstalldirs. - define_variable ('mkinstalldirs', - ('$(SHELL) ' . $config_aux_dir . '/mkinstalldirs')); - - reject_var ('CONFIG_HEADER', - "`CONFIG_HEADER' is an anachronism; now determined " - . "automatically\nfrom `$configure_ac'"); - - my @config_h; - foreach my $spec (@config_headers) - { - my ($out, @ins) = split_config_file_spec ($spec); - # Generate CONFIG_HEADER define. - if ($relative_dir eq dirname ($out)) - { - push @config_h, basename ($out); - } - else - { - push @config_h, "\$(top_builddir)/$out"; - } - } - define_variable ("CONFIG_HEADER", "@config_h") - if @config_h; - - # Now look for other files in this directory which must be remade - # by config.status, and generate rules for them. - my @actual_other_files = (); - foreach my $lfile (@other_input_files) - { - my $file; - my @inputs; - if ($lfile =~ /^([^:]*):(.*)$/) - { - # This is the ":" syntax of AC_OUTPUT. - $file = $1; - @inputs = split (':', $2); - } - else - { - # Normal usage. - $file = $lfile; - @inputs = $file . '.in'; - } - - # Automake files should not be stored in here, but in %MAKE_LIST. - prog_error "$lfile in \@other_input_files" - if -f $file . '.am'; - - my $local = basename ($file); - - # Make sure the dist directory for each input file is created. - # We only have to do this at the topmost level though. This - # is a bit ugly but it easier than spreading out the logic, - # especially in cases like AC_OUTPUT(foo/out:bar/in), where - # there is no Makefile in bar/. - if ($relative_dir eq '.') - { - foreach (@inputs) - { - $dist_dirs{dirname ($_)} = 1; - } - } - - # We skip files that aren't in this directory. However, if - # the file's directory does not have a Makefile, and we are - # currently doing `.', then we create a rule to rebuild the - # file in the subdir. - my $fd = dirname ($file); - if ($fd ne $relative_dir) - { - if ($relative_dir eq '.' && ! &is_make_dir ($fd)) - { - $local = $file; - } - else - { - next; - } - } - - my @rewritten_inputs = rewrite_inputs_into_dependencies (1, @inputs); - $output_rules .= ($local . ': ' - . '$(top_builddir)/config.status ' - . "@rewritten_inputs\n" - . "\t" - . 'cd $(top_builddir) && ' - . '$(SHELL) ./config.status ' - . ($relative_dir eq '.' ? '' : '$(subdir)/') - . '$@' - . "\n"); - push (@actual_other_files, $local); - - # Require all input files. - require_file ($ac_config_files_location, FOREIGN, - rewrite_inputs_into_dependencies (0, @inputs)); - } - - # These files get removed by "make clean". - define_pretty_variable ('CONFIG_CLEAN_FILES', '', @actual_other_files); -} - -# Handle C headers. -sub handle_headers -{ - my @r = &am_install_var ('-defaultdist', 'header', 'HEADERS', 'include', - 'oldinclude', 'pkginclude', - 'noinst', 'check'); - foreach (@r) - { - next unless /\..*$/; - &saw_extension ($&); - } -} - -sub handle_gettext -{ - return if ! $seen_gettext || $relative_dir ne '.'; - - if (! variable_defined ('SUBDIRS')) - { - err_ac "AM_GNU_GETTEXT used but SUBDIRS not defined"; - return; - } - - my @subdirs = &variable_value_as_list_recursive ('SUBDIRS', 'all'); - err_var 'SUBDIRS', "AM_GNU_GETTEXT used but `po' not in SUBDIRS" - if ! grep ($_ eq 'po', @subdirs); - # intl/ is not required when AM_GNU_GETTEXT is called with - # the `external' option. - err_var 'SUBDIRS', "AM_GNU_GETTEXT used but `intl' not in SUBDIRS" - if (! $seen_gettext_external - && ! grep ($_ eq 'intl', @subdirs)); - - require_file ($ac_gettext_location, GNU, 'ABOUT-NLS'); -} - -# Handle footer elements. -sub handle_footer -{ - # NOTE don't use define_pretty_variable here, because - # $contents{...} is already defined. - $output_vars .= 'SOURCES = ' . variable_value ('SOURCES') . "\n\n" - if variable_value ('SOURCES'); - - reject_target ('.SUFFIXES', - "use variable `SUFFIXES', not target `.SUFFIXES'"); - - # Note: AIX 4.1 /bin/make will fail if any suffix rule appears - # before .SUFFIXES. So we make sure that .SUFFIXES appears before - # anything else, by sticking it right after the default: target. - $output_header .= ".SUFFIXES:\n"; - if (@suffixes || variable_defined ('SUFFIXES')) - { - # Make sure suffixes has unique elements. Sort them to ensure - # the output remains consistent. However, $(SUFFIXES) is - # always at the start of the list, unsorted. This is done - # because make will choose rules depending on the ordering of - # suffixes, and this lets the user have some control. Push - # actual suffixes, and not $(SUFFIXES). Some versions of make - # do not like variable substitutions on the .SUFFIXES line. - my @user_suffixes = (variable_defined ('SUFFIXES') - ? &variable_value_as_list_recursive ('SUFFIXES', '') - : ()); - - my %suffixes = map { $_ => 1 } @suffixes; - delete @suffixes{@user_suffixes}; - - $output_header .= (".SUFFIXES: " - . join (' ', @user_suffixes, sort keys %suffixes) - . "\n"); - } - - $output_trailer .= file_contents ('footer'); -} - -# Deal with installdirs target. -sub handle_installdirs () -{ - $output_rules .= - &file_contents ('install', - ('am__installdirs' - => variable_value ('am__installdirs') || '', - 'installdirs-local' - => (target_defined ('installdirs-local') - ? ' installdirs-local' : ''))); -} - - -# Deal with all and all-am. -sub handle_all ($) -{ - my ($makefile) = @_; - - # Output `all-am'. - - # Put this at the beginning for the sake of non-GNU makes. This - # is still wrong if these makes can run parallel jobs. But it is - # right enough. - unshift (@all, basename ($makefile)); - - foreach my $spec (@config_headers) - { - my ($out, @ins) = split_config_file_spec ($spec); - push (@all, basename ($out)) - if dirname ($out) eq $relative_dir; - } - - # Install `all' hooks. - if (&target_defined ("all-local")) - { - push (@all, "all-local"); - &depend ('.PHONY', "all-local"); - } - - &pretty_print_rule ("all-am:", "\t\t", @all); - &depend ('.PHONY', 'all-am', 'all'); - - - # Output `all'. - - my @local_headers = (); - push @local_headers, '$(BUILT_SOURCES)' - if variable_defined ('BUILT_SOURCES'); - foreach my $spec (@config_headers) - { - my ($out, @ins) = split_config_file_spec ($spec); - push @local_headers, basename ($out) - if dirname ($out) eq $relative_dir; - } - - if (@local_headers) - { - # We need to make sure config.h is built before we recurse. - # We also want to make sure that built sources are built - # before any ordinary `all' targets are run. We can't do this - # by changing the order of dependencies to the "all" because - # that breaks when using parallel makes. Instead we handle - # things explicitly. - $output_all .= ("all: @local_headers" - . "\n\t" - . '$(MAKE) $(AM_MAKEFLAGS) ' - . (variable_defined ('SUBDIRS') - ? 'all-recursive' : 'all-am') - . "\n\n"); - } - else - { - $output_all .= "all: " . (variable_defined ('SUBDIRS') - ? 'all-recursive' : 'all-am') . "\n\n"; - } -} - - -# Handle check merge target specially. -sub do_check_merge_target -{ - if (&target_defined ('check-local')) - { - # User defined local form of target. So include it. - push (@check_tests, 'check-local'); - &depend ('.PHONY', 'check-local'); - } - - # In --cygnus mode, check doesn't depend on all. - if ($cygnus_mode) - { - # Just run the local check rules. - &pretty_print_rule ('check-am:', "\t\t", @check); - } - else - { - # The check target must depend on the local equivalent of - # `all', to ensure all the primary targets are built. Then it - # must build the local check rules. - $output_rules .= "check-am: all-am\n"; - &pretty_print_rule ("\t\$(MAKE) \$(AM_MAKEFLAGS)", "\t ", - @check) - if @check; - } - &pretty_print_rule ("\t\$(MAKE) \$(AM_MAKEFLAGS)", "\t ", - @check_tests) - if @check_tests; - - &depend ('.PHONY', 'check', 'check-am'); - $output_rules .= ("check: " - . (variable_defined ('SUBDIRS') - ? 'check-recursive' : 'check-am') - . "\n"); -} - -# Handle all 'clean' targets. -sub handle_clean -{ - # Clean the files listed in user variables if they exist. - $clean_files{'$(MOSTLYCLEANFILES)'} = MOSTLY_CLEAN - if variable_defined ('MOSTLYCLEANFILES'); - $clean_files{'$(CLEANFILES)'} = CLEAN - if variable_defined ('CLEANFILES'); - $clean_files{'$(DISTCLEANFILES)'} = DIST_CLEAN - if variable_defined ('DISTCLEANFILES'); - $clean_files{'$(MAINTAINERCLEANFILES)'} = MAINTAINER_CLEAN - if variable_defined ('MAINTAINERCLEANFILES'); - - # Built sources are automatically removed by maintainer-clean. - $clean_files{'$(BUILT_SOURCES)'} = MAINTAINER_CLEAN - if variable_defined ('BUILT_SOURCES'); - - # Compute a list of "rm"s to run for each target. - my %rms = (MOSTLY_CLEAN, [], - CLEAN, [], - DIST_CLEAN, [], - MAINTAINER_CLEAN, []); - - foreach my $file (keys %clean_files) - { - my $when = $clean_files{$file}; - prog_error 'invalid entry in %clean_files' - unless exists $rms{$when}; - - my $rm = "rm -f $file"; - # If file is a variable, make sure when don't call `rm -f' without args. - $rm ="test -z \"$file\" || $rm" - if ($file =~ /^\s*\$(\(.*\)|\{.*\})\s*$/); - - push @{$rms{$when}}, "\t-$rm\n"; - } - - $output_rules .= &file_contents - ('clean', - MOSTLYCLEAN_RMS => join ('', @{$rms{&MOSTLY_CLEAN}}), - CLEAN_RMS => join ('', @{$rms{&CLEAN}}), - DISTCLEAN_RMS => join ('', @{$rms{&DIST_CLEAN}}), - MAINTAINER_CLEAN_RMS => join ('', @{$rms{&MAINTAINER_CLEAN}})); -} - - -# &depend ($CATEGORY, @DEPENDENDEES) -# ---------------------------------- -# The target $CATEGORY depends on @DEPENDENDEES. -sub depend -{ - my ($category, @dependendees) = @_; - { - push (@{$dependencies{$category}}, @dependendees); - } -} - - -# &target_cmp ($A, $B) -# -------------------- -# Subroutine for &handle_factored_dependencies to let `.PHONY' be last. -sub target_cmp -{ - return 0 - if $a eq $b; - return -1 - if $b eq '.PHONY'; - return 1 - if $a eq '.PHONY'; - return $a cmp $b; -} - - -# &handle_factored_dependencies () -# -------------------------------- -# Handle everything related to gathered targets. -sub handle_factored_dependencies -{ - # Reject bad hooks. - foreach my $utarg ('uninstall-data-local', 'uninstall-data-hook', - 'uninstall-exec-local', 'uninstall-exec-hook') - { - my $x = $utarg; - $x =~ s/(data|exec)-//; - reject_target ($utarg, "use `$x', not `$utarg'"); - } - - reject_target ('install-local', - "use `install-data-local' or `install-exec-local', " - . "not `install-local'"); - - reject_target ('install-info-local', - "`install-info-local' target defined but " - . "`no-installinfo' option not in use") - unless defined $options{'no-installinfo'}; - - # Install the -local hooks. - foreach (keys %dependencies) - { - # Hooks are installed on the -am targets. - s/-am$// or next; - if (&target_defined ("$_-local")) - { - depend ("$_-am", "$_-local"); - &depend ('.PHONY', "$_-local"); - } - } - - # Install the -hook hooks. - # FIXME: Why not be as liberal as we are with -local hooks? - foreach ('install-exec', 'install-data', 'uninstall') - { - if (&target_defined ("$_-hook")) - { - $actions{"$_-am"} .= - ("\t\@\$(NORMAL_INSTALL)\n" - . "\t" . '$(MAKE) $(AM_MAKEFLAGS) ' . "$_-hook\n"); - } - } - - # All the required targets are phony. - depend ('.PHONY', keys %required_targets); - - # Actually output gathered targets. - foreach (sort target_cmp keys %dependencies) - { - # If there is nothing about this guy, skip it. - next - unless (@{$dependencies{$_}} - || $actions{$_} - || $required_targets{$_}); - &pretty_print_rule ("$_:", "\t", - uniq (sort @{$dependencies{$_}})); - $output_rules .= $actions{$_} - if defined $actions{$_}; - $output_rules .= "\n"; - } -} - - -# &handle_tests_dejagnu () -# ------------------------ -sub handle_tests_dejagnu -{ - push (@check_tests, 'check-DEJAGNU'); - $output_rules .= file_contents ('dejagnu'); -} - - -# Handle TESTS variable and other checks. -sub handle_tests -{ - if (defined $options{'dejagnu'}) - { - &handle_tests_dejagnu; - } - else - { - foreach my $c ('DEJATOOL', 'RUNTEST', 'RUNTESTFLAGS') - { - reject_var ($c, "`$c' defined but `dejagnu' not in " - . "`AUTOMAKE_OPTIONS'"); - } - } - - if (variable_defined ('TESTS')) - { - push (@check_tests, 'check-TESTS'); - $output_rules .= &file_contents ('check'); - } -} - -# Handle Emacs Lisp. -sub handle_emacs_lisp -{ - my @elfiles = &am_install_var ('-candist', 'lisp', 'LISP', - 'lisp', 'noinst'); - - return if ! @elfiles; - - # Generate .elc files. - my @elcfiles = map { $_ . 'c' } @elfiles; - define_pretty_variable ('ELCFILES', '', @elcfiles); - - push (@all, '$(ELCFILES)'); - - require_variables ("$am_file.am", "Emacs Lisp sources seen", 'TRUE', - 'EMACS', 'lispdir'); - require_conf_file ("$am_file.am", FOREIGN, 'elisp-comp'); - &define_variable ('elisp_comp', $config_aux_dir . '/elisp-comp'); -} - -# Handle Python -sub handle_python -{ - my @pyfiles = &am_install_var ('-defaultdist', 'python', 'PYTHON', - 'noinst'); - return if ! @pyfiles; - - require_variables ("$am_file.am", "Python sources seen", 'TRUE', - 'PYTHON'); - require_conf_file ("$am_file.am", FOREIGN, 'py-compile'); - &define_variable ('py_compile', $config_aux_dir . '/py-compile'); -} - -# Handle Java. -sub handle_java -{ - my @sourcelist = &am_install_var ('-candist', - 'java', 'JAVA', - 'java', 'noinst', 'check'); - return if ! @sourcelist; - - my @prefix = am_primary_prefixes ('JAVA', 1, - 'java', 'noinst', 'check'); - - my $dir; - foreach my $curs (@prefix) - { - next - if $curs eq 'EXTRA'; - - err_var "${curs}_JAVA", "multiple _JAVA primaries in use" - if defined $dir; - $dir = $curs; - } - - - push (@all, 'class' . $dir . '.stamp'); -} - - -# Handle some of the minor options. -sub handle_minor_options -{ - if (defined $options{'readme-alpha'}) - { - if ($relative_dir eq '.') - { - if ($package_version !~ /^$GNITS_VERSION_PATTERN$/) - { - msg ('error-gnits', $package_version_location, - "version `$package_version' doesn't follow " . - "Gnits standards"); - } - if (defined $1 && -f 'README-alpha') - { - # This means we have an alpha release. See - # GNITS_VERSION_PATTERN for details. - require_file_with_macro ('TRUE', 'AUTOMAKE_OPTIONS', - FOREIGN, 'README-alpha'); - } - } - } -} - -################################################################ - -# ($OUTPUT, @INPUTS) -# &split_config_file_spec ($SPEC) -# ------------------------------- -# Decode the Autoconf syntax for config files (files, headers, links -# etc.). -sub split_config_file_spec ($) -{ - my ($spec) = @_; - my ($output, @inputs) = split (/:/, $spec); - - push @inputs, "$output.in" - unless @inputs; - - return ($output, @inputs); -} - - -my %make_list; - -# &scan_autoconf_config_files ($CONFIG-FILES) -# ------------------------------------------- -# Study $CONFIG-FILES which is the first argument to AC_CONFIG_FILES -# (or AC_OUTPUT). -sub scan_autoconf_config_files -{ - my ($config_files) = @_; - # Look at potential Makefile.am's. - foreach (split ' ', $config_files) - { - # Must skip empty string for Perl 4. - next if $_ eq "\\" || $_ eq ''; - - # Handle $local:$input syntax. Note that we ignore - # every input file past the first, though we keep - # those around for later. - my ($local, $input, @rest) = split (/:/); - if (! $input) - { - $input = $local; - } - else - { - # FIXME: should be error if .in is missing. - $input =~ s/\.in$//; - } - - if (-f $input . '.am') - { - # We have a file that automake should generate. - $make_list{$input} = join (':', ($local, @rest)); - } - else - { - # We have a file that automake should cause to be - # rebuilt, but shouldn't generate itself. - push (@other_input_files, $_); - } - } -} - - -# &scan_autoconf_traces ($FILENAME) -# --------------------------------- -sub scan_autoconf_traces ($) -{ - my ($filename) = @_; - - my @traced = qw(AC_CANONICAL_HOST - AC_CANONICAL_SYSTEM - AC_CONFIG_AUX_DIR - AC_CONFIG_FILES - AC_CONFIG_HEADERS - AC_INIT - AC_LIBSOURCE - AC_SUBST - AM_AUTOMAKE_VERSION - AM_CONDITIONAL - AM_GNU_GETTEXT - AM_INIT_AUTOMAKE - AM_MAINTAINER_MODE - AM_PROG_CC_C_O); - - my $traces = ($ENV{AUTOCONF} || 'autoconf') . " "; - - # Use a separator unlikely to be used, not `:', the default, which - # has a precise meaning for AC_CONFIG_FILES and so on. - $traces .= join (' ', - map { "--trace=$_" . ':\$f:\$l::\$n::\${::}%' } @traced); - - my $tracefh = new Automake::XFile ("$traces $filename |"); - verb "reading $traces"; - - while ($_ = $tracefh->getline) - { - chomp; - my ($here, @args) = split /::/; - my $macro = $args[0]; - - # Alphabetical ordering please. - if ($macro eq 'AC_CANONICAL_HOST') - { - if (! $seen_canonical) - { - $seen_canonical = AC_CANONICAL_HOST; - $canonical_location = $here; - }; - } - elsif ($macro eq 'AC_CANONICAL_SYSTEM') - { - $seen_canonical = AC_CANONICAL_SYSTEM; - $canonical_location = $here; - } - elsif ($macro eq 'AC_CONFIG_AUX_DIR') - { - @config_aux_path = $args[1]; - $config_aux_dir_set_in_configure_in = 1; - } - elsif ($macro eq 'AC_CONFIG_FILES') - { - # Look at potential Makefile.am's. - $ac_config_files_location = $here; - &scan_autoconf_config_files ($args[1]); - } - elsif ($macro eq 'AC_CONFIG_HEADERS') - { - $config_header_location = $here; - push @config_headers, split (' ', $args[1]); - } - elsif ($macro eq 'AC_INIT') - { - if (defined $args[2]) - { - $package_version = $args[2]; - $package_version_location = $here; - } - } - elsif ($macro eq 'AC_LIBSOURCE') - { - $libsources{$args[1]} = $here; - } - elsif ($macro eq 'AC_SUBST') - { - # Just check for alphanumeric in AC_SUBST. If you do - # AC_SUBST(5), then too bad. - $configure_vars{$args[1]} = $here - if $args[1] =~ /^\w+$/; - } - elsif ($macro eq 'AM_AUTOMAKE_VERSION') - { - err ($here, - "version mismatch. This is Automake $VERSION,\n" . - "but the definition used by this AM_INIT_AUTOMAKE\n" . - "comes from Automake $args[1]. You should recreate\n" . - "aclocal.m4 with aclocal and run automake again.\n") - if ($VERSION ne $args[1]); - - $seen_automake_version = 1; - } - elsif ($macro eq 'AM_CONDITIONAL') - { - $configure_cond{$args[1]} = $here; - } - elsif ($macro eq 'AM_GNU_GETTEXT') - { - $seen_gettext = $here; - $ac_gettext_location = $here; - $seen_gettext_external = grep ($_ eq 'external', @args); - } - elsif ($macro eq 'AM_INIT_AUTOMAKE') - { - $seen_init_automake = $here; - if (defined $args[2]) - { - $package_version = $args[2]; - $package_version_location = $here; - } - elsif (defined $args[1]) - { - $global_options = $args[1]; - } - } - elsif ($macro eq 'AM_MAINTAINER_MODE') - { - $seen_maint_mode = $here; - } - elsif ($macro eq 'AM_PROG_CC_C_O') - { - $seen_cc_c_o = $here; - } - } -} - - -# &scan_autoconf_files () -# ----------------------- -# Check whether we use `configure.ac' or `configure.in'. -# Scan it (and possibly `aclocal.m4') for interesting things. -# We must scan aclocal.m4 because there might be AC_SUBSTs and such there. -sub scan_autoconf_files -{ - # Reinitialize libsources here. This isn't really necessary, - # since we currently assume there is only one configure.ac. But - # that won't always be the case. - %libsources = (); - - $configure_ac = find_configure_ac; - fatal "`configure.ac' or `configure.in' is required\n" - if !$configure_ac; - - scan_autoconf_traces ($configure_ac); - - # Set input and output files if not specified by user. - if (! @input_files) - { - @input_files = sort keys %make_list; - %output_files = %make_list; - } - - @configure_input_files = sort keys %make_list; - - err_ac "`AM_INIT_AUTOMAKE' must be used" - if ! $seen_init_automake; - - if (! $seen_automake_version) - { - if (-f 'aclocal.m4') - { - err ($seen_init_automake || $me, - "your implementation of AM_INIT_AUTOMAKE comes from " . - "an\nold Automake version. You should recreate " . - "aclocal.m4\nwith aclocal and run automake again.\n"); - } - else - { - err ($seen_init_automake || $me, - "no proper implementation of AM_INIT_AUTOMAKE was " . - "found,\nprobably because aclocal.m4 is missing...\n" . - "You should run aclocal to create this file, then\n" . - "run automake again.\n"); - } - } - - # Look for some files we need. Always check for these. This - # check must be done for every run, even those where we are only - # looking at a subdir Makefile. We must set relative_dir so that - # the file-finding machinery works. - # FIXME: Is this broken because it needs dynamic scopes. - # My tests seems to show it's not the case. - $relative_dir = '.'; - require_conf_file ($configure_ac, FOREIGN, - 'install-sh', 'mkinstalldirs', 'missing'); - err_am "`install.sh' is an anachronism; use `install-sh' instead" - if -f $config_aux_path[0] . '/install.sh'; - - # Preserve dist_common for later. - $configure_dist_common = variable_value ('DIST_COMMON', 'TRUE') || ''; -} - -################################################################ - -# Set up for Cygnus mode. -sub check_cygnus -{ - return unless $cygnus_mode; - - &set_strictness ('foreign'); - $options{'no-installinfo'} = 1; - $options{'no-dependencies'} = 1; - $use_dependencies = 0; - - err_ac "`AM_MAINTAINER_MODE' required when --cygnus specified" - if !$seen_maint_mode; -} - -# Do any extra checking for GNU standards. -sub check_gnu_standards -{ - if ($relative_dir eq '.') - { - # In top level (or only) directory. - - # Accept one of these three licenses; default to COPYING. - my $license = 'COPYING'; - foreach (qw /COPYING.LIB COPYING.LESSER/) - { - $license = $_ if -f $_; - } - require_file ("$am_file.am", GNU, $license, - qw/INSTALL NEWS README AUTHORS ChangeLog/); - } - - for my $opt ('no-installman', 'no-installinfo') - { - msg_var ('error-gnu', 'AUTOMAKE_OPTIONS', - "option `$opt' disallowed by GNU standards") - if (defined $options{$opt}); - } -} - -# Do any extra checking for GNITS standards. -sub check_gnits_standards -{ - if ($relative_dir eq '.') - { - # In top level (or only) directory. - require_file ("$am_file.am", GNITS, 'THANKS'); - } -} - -################################################################ -# -# Functions to handle files of each language. - -# Each `lang_X_rewrite($DIRECTORY, $BASE, $EXT)' function follows a -# simple formula: Return value is LANG_SUBDIR if the resulting object -# file should be in a subdir if the source file is, LANG_PROCESS if -# file is to be dealt with, LANG_IGNORE otherwise. - -# Much of the actual processing is handled in -# handle_single_transform_list. These functions exist so that -# auxiliary information can be recorded for a later cleanup pass. -# Note that the calls to these functions are computed, so don't bother -# searching for their precise names in the source. - -# This is just a convenience function that can be used to determine -# when a subdir object should be used. -sub lang_sub_obj -{ - return defined $options{'subdir-objects'} ? LANG_SUBDIR : LANG_PROCESS; -} - -# Rewrite a single C source file. -sub lang_c_rewrite -{ - my ($directory, $base, $ext) = @_; - - if (defined $options{'ansi2knr'} && $base =~ /_$/) - { - # FIXME: include line number in error. - err_am "C source file `$base.c' would be deleted by ansi2knr rules"; - } - - my $r = LANG_PROCESS; - if (defined $options{'subdir-objects'}) - { - $r = LANG_SUBDIR; - $base = $directory . '/' . $base - unless $directory eq '.' || $directory eq ''; - - err_am ("C objects in subdir but `AM_PROG_CC_C_O' " - . "not in `$configure_ac'", - uniq_scope => US_GLOBAL) - unless $seen_cc_c_o; - - require_conf_file ("$am_file.am", FOREIGN, 'compile'); - - # In this case we already have the directory information, so - # don't add it again. - $de_ansi_files{$base} = ''; - } - else - { - $de_ansi_files{$base} = (($directory eq '.' || $directory eq '') - ? '' - : "$directory/"); - } - - return $r; -} - -# Rewrite a single C++ source file. -sub lang_cxx_rewrite -{ - return &lang_sub_obj; -} - -# Rewrite a single header file. -sub lang_header_rewrite -{ - # Header files are simply ignored. - return LANG_IGNORE; -} - -# Rewrite a single yacc file. -sub lang_yacc_rewrite -{ - my ($directory, $base, $ext) = @_; - - my $r = &lang_sub_obj; - (my $newext = $ext) =~ tr/y/c/; - return ($r, $newext); -} - -# Rewrite a single yacc++ file. -sub lang_yaccxx_rewrite -{ - my ($directory, $base, $ext) = @_; - - my $r = &lang_sub_obj; - (my $newext = $ext) =~ tr/y/c/; - return ($r, $newext); -} - -# Rewrite a single lex file. -sub lang_lex_rewrite -{ - my ($directory, $base, $ext) = @_; - - my $r = &lang_sub_obj; - (my $newext = $ext) =~ tr/l/c/; - return ($r, $newext); -} - -# Rewrite a single lex++ file. -sub lang_lexxx_rewrite -{ - my ($directory, $base, $ext) = @_; - - my $r = &lang_sub_obj; - (my $newext = $ext) =~ tr/l/c/; - return ($r, $newext); -} - -# Rewrite a single assembly file. -sub lang_asm_rewrite -{ - return &lang_sub_obj; -} - -# Rewrite a single Fortran 77 file. -sub lang_f77_rewrite -{ - return LANG_PROCESS; -} - -# Rewrite a single preprocessed Fortran 77 file. -sub lang_ppf77_rewrite -{ - return LANG_PROCESS; -} - -# Rewrite a single ratfor file. -sub lang_ratfor_rewrite -{ - return LANG_PROCESS; -} - -# Rewrite a single Objective C file. -sub lang_objc_rewrite -{ - return &lang_sub_obj; -} - -# Rewrite a single Java file. -sub lang_java_rewrite -{ - return LANG_SUBDIR; -} - -# The lang_X_finish functions are called after all source file -# processing is done. Each should handle defining rules for the -# language, etc. A finish function is only called if a source file of -# the appropriate type has been seen. - -sub lang_c_finish -{ - # Push all libobjs files onto de_ansi_files. We actually only - # push files which exist in the current directory, and which are - # genuine source files. - foreach my $file (keys %libsources) - { - if ($file =~ /^(.*)\.[cly]$/ && -f "$relative_dir/$file") - { - $de_ansi_files{$1} = (($relative_dir eq '.' || $relative_dir eq '') - ? '' - : "$relative_dir/"); - } - } - - if (defined $options{'ansi2knr'} && keys %de_ansi_files) - { - # Make all _.c files depend on their corresponding .c files. - my @objects; - foreach my $base (sort keys %de_ansi_files) - { - # Each _.c file must depend on ansi2knr; otherwise it - # might be used in a parallel build before it is built. - # We need to support files in the srcdir and in the build - # dir (because these files might be auto-generated. But - # we can't use $< -- some makes only define $< during a - # suffix rule. - my $ansfile = $de_ansi_files{$base} . $base . '.c'; - $output_rules .= ($base . "_.c: $ansfile \$(ANSI2KNR)\n\t" - . '$(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) ' - . '`if test -f $(srcdir)/' . $ansfile - . '; then echo $(srcdir)/' . $ansfile - . '; else echo ' . $ansfile . '; fi` ' - . "| sed 's/^# \\([0-9]\\)/#line \\1/' " - . '| $(ANSI2KNR) > ' . $base . "_.c" - # If ansi2knr fails then we shouldn't - # create the _.c file - . " || rm -f ${base}_.c\n"); - push (@objects, $base . '_.$(OBJEXT)'); - push (@objects, $base . '_.lo') - if variable_defined ('LIBTOOL'); - } - - # Make all _.o (and _.lo) files depend on ansi2knr. - # Use a sneaky little hack to make it print nicely. - &pretty_print_rule ('', '', @objects, ':', '$(ANSI2KNR)'); - } -} - -# This is a yacc helper which is called whenever we have decided to -# compile a yacc file. -sub lang_yacc_target_hook -{ - my ($self, $aggregate, $output, $input) = @_; - - my $flag = $aggregate . "_YFLAGS"; - if ((variable_defined ($flag) - && &variable_value ($flag) =~ /$DASH_D_PATTERN/o) - || (variable_defined ('YFLAGS') - && &variable_value ('YFLAGS') =~ /$DASH_D_PATTERN/o)) - { - (my $output_base = $output) =~ s/$KNOWN_EXTENSIONS_PATTERN$//; - my $header = $output_base . '.h'; - - # Found a `-d' that applies to the compilation of this file. - # Add a dependency for the generated header file, and arrange - # for that file to be included in the distribution. - # FIXME: this fails for `nodist_*_SOURCES'. - $output_rules .= ("${header}: $output\n" - # Recover from removal of $header - . "\t\@if test ! -f \$@; then \\\n" - . "\t rm -f $output; \\\n" - . "\t \$(MAKE) $output; \\\n" - . "\telse :; fi\n"); - &push_dist_common ($header); - # If the files are built in the build directory, then we want - # to remove them with `make clean'. If they are in srcdir - # they shouldn't be touched. However, we can't determine this - # statically, and the GNU rules say that yacc/lex output files - # should be removed by maintainer-clean. So that's what we - # do. - $clean_files{$header} = MAINTAINER_CLEAN; - } - # Erase $OUTPUT on `make maintainer-clean' (by GNU standards). - # See the comment above for $HEADER. - $clean_files{$output} = MAINTAINER_CLEAN; -} - -# This is a lex helper which is called whenever we have decided to -# compile a lex file. -sub lang_lex_target_hook -{ - my ($self, $aggregate, $output, $input) = @_; - # If the files are built in the build directory, then we want to - # remove them with `make clean'. If they are in srcdir they - # shouldn't be touched. However, we can't determine this - # statically, and the GNU rules say that yacc/lex output files - # should be removed by maintainer-clean. So that's what we do. - $clean_files{$output} = MAINTAINER_CLEAN; -} - -# This is a helper for both lex and yacc. -sub yacc_lex_finish_helper -{ - return if defined $language_scratch{'lex-yacc-done'}; - $language_scratch{'lex-yacc-done'} = 1; - - # If there is more than one distinct yacc (resp lex) source file - # in a given directory, then the `ylwrap' program is required to - # allow parallel builds to work correctly. FIXME: for now, no - # line number. - require_conf_file ($configure_ac, FOREIGN, 'ylwrap'); - if ($config_aux_dir_set_in_configure_in) - { - &define_variable ('YLWRAP', $config_aux_dir . "/ylwrap"); - } - else - { - &define_variable ('YLWRAP', '$(top_srcdir)/ylwrap'); - } -} - -sub lang_yacc_finish -{ - return if defined $language_scratch{'yacc-done'}; - $language_scratch{'yacc-done'} = 1; - - reject_var 'YACCFLAGS', "`YACCFLAGS' obsolete; use `YFLAGS' instead"; - - &yacc_lex_finish_helper - if count_files_for_language ('yacc') > 1; -} - - -sub lang_lex_finish -{ - return if defined $language_scratch{'lex-done'}; - $language_scratch{'lex-done'} = 1; - - &yacc_lex_finish_helper - if count_files_for_language ('lex') > 1; -} - - -# Given a hash table of linker names, pick the name that has the most -# precedence. This is lame, but something has to have global -# knowledge in order to eliminate the conflict. Add more linkers as -# required. -sub resolve_linker -{ - my (%linkers) = @_; - - foreach my $l (qw(GCJLINK CXXLINK F77LINK OBJCLINK)) - { - return $l if defined $linkers{$l}; - } - return 'LINK'; -} - -# Called to indicate that an extension was used. -sub saw_extension -{ - my ($ext) = @_; - if (! defined $extension_seen{$ext}) - { - $extension_seen{$ext} = 1; - } - else - { - ++$extension_seen{$ext}; - } -} - -# Return the number of files seen for a given language. Knows about -# special cases we care about. FIXME: this is hideous. We need -# something that involves real language objects. For instance yacc -# and yaccxx could both derive from a common yacc class which would -# know about the strange ylwrap requirement. (Or better yet we could -# just not support legacy yacc!) -sub count_files_for_language -{ - my ($name) = @_; - - my @names; - if ($name eq 'yacc' || $name eq 'yaccxx') - { - @names = ('yacc', 'yaccxx'); - } - elsif ($name eq 'lex' || $name eq 'lexxx') - { - @names = ('lex', 'lexxx'); - } - else - { - @names = ($name); - } - - my $r = 0; - foreach $name (@names) - { - my $lang = $languages{$name}; - foreach my $ext (@{$lang->extensions}) - { - $r += $extension_seen{$ext} - if defined $extension_seen{$ext}; - } - } - - return $r -} - -# Called to ask whether source files have been seen . If HEADERS is 1, -# headers can be included. -sub saw_sources_p -{ - my ($headers) = @_; - - # count all the sources - my $count = 0; - foreach my $val (values %extension_seen) - { - $count += $val; - } - - if (!$headers) - { - $count -= count_files_for_language ('header'); - } - - return $count > 0; -} - - -# register_language (%ATTRIBUTE) -# ------------------------------ -# Register a single language. -# Each %ATTRIBUTE is of the form ATTRIBUTE => VALUE. -sub register_language (%) -{ - my (%option) = @_; - - # Set the defaults. - $option{'ansi'} = 0 - unless defined $option{'ansi'}; - $option{'autodep'} = 'no' - unless defined $option{'autodep'}; - $option{'linker'} = '' - unless defined $option{'linker'}; - $option{'flags'} = [] - unless defined $option{'flags'}; - $option{'output_extensions'} = sub { return ( '.$(OBJEXT)', '.lo' ) } - unless defined $option{'output_extensions'}; - - my $lang = new Language (%option); - - # Fill indexes. - grep ($extension_map{$_} = $lang->name, @{$lang->extensions}); - $languages{$lang->name} = $lang; - - # Update the pattern of known extensions. - accept_extensions (@{$lang->extensions}); - - # Upate the $suffix_rule map. - foreach my $suffix (@{$lang->extensions}) - { - foreach my $dest (&{$lang->output_extensions} ($suffix)) - { - ®ister_suffix_rule ('internal', $suffix, $dest); - } - } -} - -# derive_suffix ($EXT, $OBJ) -# -------------------------- -# This function is used to find a path from a user-specified suffix $EXT -# to $OBJ or to some other suffix we recognize internally, eg `cc'. -sub derive_suffix ($$) -{ - my ($source_ext, $obj) = @_; - - while (! $extension_map{$source_ext} - && $source_ext ne $obj - && exists $suffix_rules->{$source_ext} - && exists $suffix_rules->{$source_ext}{$obj}) - { - $source_ext = $suffix_rules->{$source_ext}{$obj}[0]; - } - - return $source_ext; -} - - -################################################################ - -# Pretty-print something. HEAD is what should be printed at the -# beginning of the first line, FILL is what should be printed at the -# beginning of every subsequent line. -sub pretty_print_internal -{ - my ($head, $fill, @values) = @_; - - my $column = length ($head); - my $result = $head; - - # Fill length is number of characters. However, each Tab - # character counts for eight. So we count the number of Tabs and - # multiply by 7. - my $fill_length = length ($fill); - $fill_length += 7 * ($fill =~ tr/\t/\t/d); - - foreach (@values) - { - # "71" because we also print a space. - if ($column + length ($_) > 71) - { - $result .= " \\\n" . $fill; - $column = $fill_length; - } - $result .= ' ' if $result =~ /\S\z/; - $result .= $_; - $column += length ($_) + 1; - } - - $result .= "\n"; - return $result; -} - -# Pretty-print something and append to output_vars. -sub pretty_print -{ - $output_vars .= &pretty_print_internal (@_); -} - -# Pretty-print something and append to output_rules. -sub pretty_print_rule -{ - $output_rules .= &pretty_print_internal (@_); -} - - -################################################################ - - -# $STRING -# &conditional_string(@COND-STACK) -# -------------------------------- -# Build a string which denotes the conditional in @COND-STACK. Some -# simplifications are done: `TRUE' entries are elided, and any `FALSE' -# entry results in a return of `FALSE'. -sub conditional_string -{ - my (@stack) = @_; - - if (grep (/^FALSE$/, @stack)) - { - return 'FALSE'; - } - else - { - return join (' ', uniq sort grep (!/^TRUE$/, @stack)); - } -} - - -# $BOOLEAN -# &conditional_true_when ($COND, $WHEN) -# ------------------------------------- -# See if a conditional is true. Both arguments are conditional -# strings. This returns true if the first conditional is true when -# the second conditional is true. -# For instance with $COND = `BAR FOO', and $WHEN = `BAR BAZ FOO', -# obviously return 1, and 0 when, for instance, $WHEN = `FOO'. -sub conditional_true_when ($$) -{ - my ($cond, $when) = @_; - - # Make a hash holding all the values from $WHEN. - my %cond_vals = map { $_ => 1 } split (' ', $when); - - # Nothing is true when FALSE (not even FALSE itself, but it - # shouldn't hurt if you decide to change that). - return 0 if exists $cond_vals{'FALSE'}; - - # Check each component of $cond, which looks `COND1 COND2'. - foreach my $comp (split (' ', $cond)) - { - # TRUE is always true. - next if $comp eq 'TRUE'; - return 0 if ! defined $cond_vals{$comp}; - } - - return 1; -} - - -# $BOOLEAN -# &conditional_is_redundant ($COND, @WHENS) -# ---------------------------------------- -# Determine whether $COND is redundant with respect to @WHENS. -# -# Returns true if $COND is true for any of the conditions in @WHENS. -# -# If there are no @WHENS, then behave as if @WHENS contained a single empty -# condition. -sub conditional_is_redundant ($@) -{ - my ($cond, @whens) = @_; - - @whens = ("") if @whens == 0; - - foreach my $when (@whens) - { - return 1 if conditional_true_when ($cond, $when); - } - return 0; -} - - -# $BOOLEAN -# &conditional_implies_any ($COND, @CONDS) -# ---------------------------------------- -# Returns true iff $COND implies any of the conditions in @CONDS. -sub conditional_implies_any ($@) -{ - my ($cond, @conds) = @_; - - @conds = ("") if @conds == 0; - - foreach my $c (@conds) - { - return 1 if conditional_true_when ($c, $cond); - } - return 0; -} - - -# $NEGATION -# condition_negate ($COND) -# ------------------------ -sub condition_negate ($) -{ - my ($cond) = @_; - - $cond =~ s/TRUE$/TRUEO/; - $cond =~ s/FALSE$/TRUE/; - $cond =~ s/TRUEO$/FALSE/; - - return $cond; -} - - -# Compare condition names. -# Issue them in alphabetical order, foo_TRUE before foo_FALSE. -sub by_condition -{ - # Be careful we might be comparing `' or `#'. - $a =~ /^(.*)_(TRUE|FALSE)$/; - my ($aname, $abool) = ($1 || '', $2 || ''); - $b =~ /^(.*)_(TRUE|FALSE)$/; - my ($bname, $bbool) = ($1 || '', $2 || ''); - return ($aname cmp $bname - # Don't bother with IFs, given that TRUE is after FALSE - # just cmp in the reverse order. - || $bbool cmp $abool - # Just in case... - || $a cmp $b); -} - - -# &make_condition (@CONDITIONS) -# ----------------------------- -# Transform a list of conditions (themselves can be an internal list -# of conditions, e.g., @CONDITIONS = ('cond1 cond2', 'cond3')) into a -# Make conditional (a pattern for AC_SUBST). -# Correctly returns the empty string when there are no conditions. -sub make_condition -{ - my $res = conditional_string (@_); - - # There are no conditions. - if ($res eq '') - { - # Nothing to do. - } - # It's impossible. - elsif ($res eq 'FALSE') - { - $res = '#'; - } - # Build it. - else - { - $res = '@' . $res . '@'; - $res =~ s/ /@@/g; - } - - return $res; -} - - - -## ------------------------------ ## -## Handling the condition stack. ## -## ------------------------------ ## - - -# $COND_STRING -# cond_stack_if ($NEGATE, $COND, $WHERE) -# -------------------------------------- -sub cond_stack_if ($$$) -{ - my ($negate, $cond, $where) = @_; - - err $where, "$cond does not appear in AM_CONDITIONAL" - if ! $configure_cond{$cond} && $cond !~ /^TRUE|FALSE$/; - - $cond = "${cond}_TRUE" - unless $cond =~ /^TRUE|FALSE$/; - $cond = condition_negate ($cond) - if $negate; - - push (@cond_stack, $cond); - - return conditional_string (@cond_stack); -} - - -# $COND_STRING -# cond_stack_else ($NEGATE, $COND, $WHERE) -# ---------------------------------------- -sub cond_stack_else ($$$) -{ - my ($negate, $cond, $where) = @_; - - if (! @cond_stack) - { - err $where, "else without if"; - return; - } - - $cond_stack[$#cond_stack] = condition_negate ($cond_stack[$#cond_stack]); - - # If $COND is given, check against it. - if (defined $cond) - { - $cond = "${cond}_TRUE" - unless $cond =~ /^TRUE|FALSE$/; - $cond = condition_negate ($cond) - if $negate; - - err ($where, "else reminder ($negate$cond) incompatible with " - . "current conditional: $cond_stack[$#cond_stack]") - if $cond_stack[$#cond_stack] ne $cond; - } - - return conditional_string (@cond_stack); -} - - -# $COND_STRING -# cond_stack_endif ($NEGATE, $COND, $WHERE) -# ----------------------------------------- -sub cond_stack_endif ($$$) -{ - my ($negate, $cond, $where) = @_; - my $old_cond; - - if (! @cond_stack) - { - err $where, "endif without if: $negate$cond"; - return; - } - - - # If $COND is given, check against it. - if (defined $cond) - { - $cond = "${cond}_TRUE" - unless $cond =~ /^TRUE|FALSE$/; - $cond = condition_negate ($cond) - if $negate; - - err ($where, "endif reminder ($negate$cond) incompatible with " - . "current conditional: $cond_stack[$#cond_stack]") - if $cond_stack[$#cond_stack] ne $cond; - } - - pop @cond_stack; - - return conditional_string (@cond_stack); -} - - - - - -## ------------------------ ## -## Handling the variables. ## -## ------------------------ ## - - -# check_ambiguous_conditional ($VAR, $COND, $WHERE) -# ------------------------------------------------- -# Check for an ambiguous conditional. This is called when a variable -# is being defined conditionally. If we already know about a -# definition that is true under the same conditions, then we have an -# ambiguity. -sub check_ambiguous_conditional ($$$) -{ - my ($var, $cond, $where) = @_; - my ($message, $ambig_cond) = - conditional_ambiguous_p ($var, $cond, keys %{$var_value{$var}}); - if ($message) - { - msg 'syntax', $where, "$message ..."; - msg_var ('syntax', $var, "... `$var' previously defined here."); - verb (macro_dump ($var)); - } -} - -# $STRING, $AMBIG_COND -# conditional_ambiguous_p ($WHAT, $COND, @CONDS) -# ---------------------------------------------- -# Check for an ambiguous conditional. Return an error message and -# the other condition involved if we have one, two empty strings otherwise. -# WHAT: the thing being defined -# COND: the condition under which is is being defined -# CONDS: the conditons under which is had already been defined -sub conditional_ambiguous_p ($$@) -{ - my ($var, $cond, @conds) = @_; - foreach my $vcond (@conds) - { - # Note that these rules doesn't consider the following - # example as ambiguous. - # - # if COND1 - # FOO = foo - # endif - # if COND2 - # FOO = bar - # endif - # - # It's up to the user to not define COND1 and COND2 - # simultaneously. - my $message; - if ($vcond eq $cond) - { - return ("$var multiply defined in condition $cond", $vcond); - } - elsif (&conditional_true_when ($vcond, $cond)) - { - return ("$var was already defined in condition $vcond, " - . "which implies condition $cond", $vcond); - } - elsif (&conditional_true_when ($cond, $vcond)) - { - return ("$var was already defined in condition $vcond, " - . "which is implied by condition $cond", $vcond); - } - } - return ('', ''); -} - -# @MISSING_CONDS -# variable_not_always_defined_in_cond ($VAR, $COND) -# --------------------------------------------- -# Check whether $VAR is always defined for condition $COND. -# Return a list of conditions where the definition is missing. -# -# For instance, given -# -# if COND1 -# if COND2 -# A = foo -# D = d1 -# else -# A = bar -# D = d2 -# endif -# else -# D = d3 -# endif -# if COND3 -# A = baz -# B = mumble -# endif -# C = mumble -# -# we should have: -# variable_not_always_defined_in_cond ('A', 'COND1_TRUE COND2_TRUE') -# => () -# variable_not_always_defined_in_cond ('A', 'COND1_TRUE') -# => () -# variable_not_always_defined_in_cond ('A', 'TRUE') -# => ("COND1_FALSE COND2_FALSE COND3_FALSE", -# "COND1_FALSE COND2_TRUE COND3_FALSE", -# "COND1_TRUE COND2_FALSE COND3_FALSE", -# "COND1_TRUE COND2_TRUE COND3_FALSE") -# variable_not_always_defined_in_cond ('B', 'COND1_TRUE') -# => ("COND3_FALSE") -# variable_not_always_defined_in_cond ('C', 'COND1_TRUE') -# => () -# variable_not_always_defined_in_cond ('D', 'TRUE') -# => () -# variable_not_always_defined_in_cond ('Z', 'TRUE') -# => ("TRUE") -# -sub variable_not_always_defined_in_cond ($$) -{ - my ($var, $cond) = @_; - - # It's easy to answer if the variable is not defined. - return ("TRUE",) unless exists $var_value{$var}; - - # How does it work? Let's take the second example: - # - # variable_not_always_defined_in_cond ('A', 'COND1_TRUE') - # - # (1) First, we get the list of conditions where A is defined: - # - # ("COND1_TRUE COND2_TRUE", "COND1_TRUE COND2_FALSE", "COND3_TRUE") - # - # (2) Then we generate the set of inverted conditions: - # - # ("COND1_FALSE COND2_TRUE COND3_FALSE", - # "COND1_FALSE COND2_FALSE COND3_FALSE") - # - # (3) Finally we remove these conditions which are not implied by - # COND1_TRUE. This yields an empty list and we are done. - - my @res = (); - my @cond_defs = keys %{$var_value{$var}}; # (1) - foreach my $icond (invert_conditions (@cond_defs)) # (2) - { - prog_error "invert_conditions returned an input condition" - if exists $var_value{$var}{$icond}; - - push @res, $icond - if (conditional_true_when ($cond, $icond)); # (3) - } - return @res; -} - -# ¯o_define($VAR, $OWNER, $TYPE, $COND, $VALUE, $WHERE) -# ------------------------------------------------------------- -# The $VAR can go from Automake to user, but not the converse. -sub macro_define ($$$$$$) -{ - my ($var, $owner, $type, $cond, $value, $where) = @_; - - # We will adjust the owener of this variable unless told otherwise. - my $adjust_owner = 1; - - err $where, "bad characters in variable name `$var'" - if $var !~ /$MACRO_PATTERN/o; - - # NEWS-OS 4.2R complains if a Makefile variable begins with `_'. - msg ('portability', $where, - "$var: variable names starting with `_' are not portable") - if $var =~ /^_/; - - # `:='-style assignments are not acknowledged by POSIX. Moreover it - # has multiple meanings. In GNU make or BSD make it means "assign - # with immediate expansion", while in OSF make it is used for - # conditional assignments. - msg ('portability', $where, "`:='-style assignments are not portable") - if $type eq ':'; - - check_variable_expansions ($value, $where); - - $cond ||= 'TRUE'; - - # An Automake variable must be consistently defined with the same - # sign by Automake. A user variable must be set by either `=' or - # `:=', and later promoted to `+='. - if ($owner == VAR_AUTOMAKE) - { - if (exists $var_type{$var} - && exists $var_type{$var}{$cond} - && $var_type{$var}{$cond} ne $type) - { - err ($where, "$var was set with `$var_type{$var}=' " - . "and is now set with `$type='"); - } - } - else - { - if (!exists $var_type{$var} && $type eq '+') - { - err $where, "$var must be set with `=' before using `+='"; - } - } - $var_type{$var}{$cond} = $type; - - # When adding, since we rewrite, don't try to preserve the - # Automake continuation backslashes. - $value =~ s/\\$//mg - if $type eq '+' && $owner == VAR_AUTOMAKE; - - # Differentiate assignment types. - - # 1. append (+=) to a variable defined for current condition - if ($type eq '+' && exists $var_value{$var}{$cond}) - { - if (chomp $var_value{$var}{$cond}) - { - # Insert a backslash before a trailing newline. - $var_value{$var}{$cond} .= "\\\n"; - } - elsif ($var_value{$var}{$cond}) - { - # Insert a separator. - $var_value{$var}{$cond} .= ' '; - } - $var_value{$var}{$cond} .= $value; - } - # 2. append (+=) to a variable defined for *another* condition - elsif ($type eq '+' && keys %{$var_value{$var}}) - { - # * Generally, $cond is not TRUE. For instance: - # FOO = foo - # if COND - # FOO += bar - # endif - # In this case, we declare an helper variable conditionally, - # and append it to FOO: - # FOO = foo $(am__append_1) - # @COND_TRUE@am__append_1 = bar - # Of course if FOO is defined under several conditions, we add - # $(am__append_1) to each definitions. - # - # * If $cond is TRUE, we don't need the helper variable. E.g., in - # if COND1 - # FOO = foo1 - # else - # FOO = foo2 - # endif - # FOO += bar - # we can add bar directly to all definition of FOO, and output - # @COND_TRUE@FOO = foo1 bar - # @COND_FALSE@FOO = foo2 bar - - # Do we need an helper variable? - if ($cond ne 'TRUE') - { - # Does the helper variable already exists? - my $key = "$var:$cond"; - if (exists $appendvar{$key}) - { - # Yes, let's simply append to it. - $var = $appendvar{$key}; - $owner = VAR_AUTOMAKE; - } - else - { - # No, create it. - my $num = 1 + keys (%appendvar); - my $hvar = "am__append_$num"; - $appendvar{$key} = $hvar; - ¯o_define ($hvar, VAR_AUTOMAKE, '+', - $cond, $value, $where); - push @var_list, $hvar; - # Now HVAR is to be added to VAR. - $value = "\$($hvar)"; - } - } - - # Add VALUE to all definitions of VAR. - foreach my $vcond (keys %{$var_value{$var}}) - { - # We have a bit of error detection to do here. - # This: - # if COND1 - # X = Y - # endif - # X += Z - # should be rejected because X is not defined for all conditions - # where `+=' applies. - my @undef_cond = variable_not_always_defined_in_cond $var, $cond; - if (@undef_cond != 0) - { - err ($where, - "Cannot apply `+=' because `$var' is not defined " - . "in\nthe following conditions:\n " - . join ("\n ", @undef_cond) - . "\nEither define `$var' in these conditions," - . " or use\n`+=' in the same conditions as" - . " the definitions."); - } - else - { - ¯o_define ($var, $owner, '+', $vcond, $value, $where); - } - } - # Don't adjust the owner. The above ¯o_define did it in the - # right conditions. - $adjust_owner = 0; - } - # 3. first assignment (=, :=, or +=) - else - { - # If Automake tries to override a value specified by the user, - # just don't let it do. - if (exists $var_value{$var}{$cond} - && $var_owner{$var} != VAR_AUTOMAKE - && $owner == VAR_AUTOMAKE) - { - verb ("refusing to override the user definition of:\n" - . macro_dump ($var) - ."with `$cond' => `$value'"); - } - else - { - # There must be no previous value unless the user is redefining - # an Automake variable or an AC_SUBST variable for an existing - # condition. - check_ambiguous_conditional ($var, $cond, $where) - unless (exists $var_owner{$var}{$cond} - && (($var_owner{$var}{$cond} == VAR_AUTOMAKE - && $owner != VAR_AUTOMAKE) - || $var_owner{$var}{$cond} == VAR_CONFIGURE)); - - $var_value{$var}{$cond} = $value; - # Assignments to a macro set its location. We don't adjust - # locations for `+='. Ideally I suppose we would associate - # line numbers with random bits of text. - $var_location{$var}{$cond} = $where; - } - } - - # The owner of a variable can only increase, because an Automake - # variable can be given to the user, but not the converse. - if ($adjust_owner && - (! exists $var_owner{$var}{$cond} - || $owner > $var_owner{$var}{$cond})) - { - $var_owner{$var}{$cond} = $owner; - # Always adjust the location when the owner changes (even for - # `+=' statements). The risk otherwise is to warn about - # a VAR_MAKEFILE variable and locate it in configure.ac... - $var_location{$var}{$cond} = $where; - } - - # Call var_VAR_trigger if it's defined. - # This hook helps to update some internal state *while* - # parsing the file. For instance the handling of SUFFIXES - # requires this (see var_SUFFIXES_trigger). - my $var_trigger = "var_${var}_trigger"; - &$var_trigger($type, $value) if defined &$var_trigger; -} - - -# ¯o_delete ($VAR, [@CONDS]) -# ------------------------------ -# Forget about $VAR under the conditions @CONDS, or completely if -# @CONDS is empty. -sub macro_delete ($@) -{ - my ($var, @conds) = @_; - - if (!@conds) - { - delete $var_value{$var}; - delete $var_location{$var}; - delete $var_owner{$var}; - delete $var_comment{$var}; - delete $var_type{$var}; - } - else - { - foreach my $cond (@conds) - { - delete $var_value{$var}{$cond}; - delete $var_location{$var}{$cond}; - delete $var_owner{$var}{$cond}; - delete $var_comment{$var}{$cond}; - delete $var_type{$var}{$cond}; - } - } -} - - -# ¯o_dump ($VAR) -# ------------------ -sub macro_dump ($) -{ - my ($var) = @_; - my $text = ''; - - if (!exists $var_value{$var}) - { - $text = " $var does not exist\n"; - } - else - { - $text .= " $var $var_type{$var}=\n {\n"; - foreach my $vcond (sort by_condition keys %{$var_value{$var}}) - { - prog_error ("`$var' is a key in \$var_value, " - . "but not in \$var_owner\n") - unless exists $var_owner{$var}{$vcond}; - - my $var_owner; - if ($var_owner{$var}{$vcond} == VAR_AUTOMAKE) - { - $var_owner = 'Automake'; - } - elsif ($var_owner{$var}{$vcond} == VAR_CONFIGURE) - { - $var_owner = 'Configure'; - } - elsif ($var_owner{$var}{$vcond} == VAR_MAKEFILE) - { - $var_owner = 'Makefile'; - } - else - { - prog_error ("unexpected value for `\$var_owner{$var}{$vcond}': " - . $var_owner{$var}{$vcond}) - unless defined $var_owner; - } - - my $where = (defined $var_location{$var}{$vcond} - ? $var_location{$var}{$vcond} : "undefined"); - $text .= "$var_comment{$var}{$vcond}" - if exists $var_comment{$var}{$vcond}; - $text .= " $vcond => $var_value{$var}{$vcond}\n"; - } - $text .= " }\n"; - } - return $text; -} - - -# ¯os_dump () -# --------------- -sub macros_dump () -{ - my ($var) = @_; - - my $text = "%var_value =\n{\n"; - foreach my $var (sort (keys %var_value)) - { - $text .= macro_dump ($var); - } - $text .= "}\n"; - return $text; -} - - -# $BOOLEAN -# variable_defined ($VAR, [$COND]) -# --------------------------------- -# See if a variable exists. $VAR is the variable name, and $COND is -# the condition which we should check. If no condition is given, we -# currently return true if the variable is defined under any -# condition. -sub variable_defined ($;$) -{ - my ($var, $cond) = @_; - - if (! exists $var_value{$var} - || (defined $cond && ! exists $var_value{$var}{$cond})) - { - # VAR is not defined. - - # Check there is no target defined with the name of the - # variable we check. - - # adl> I'm wondering if this error still makes any sense today. I - # adl> guess it was because targets and variables used to share - # adl> the same namespace in older versions of Automake? - # tom> While what you say is definitely part of it, I think it - # tom> might also have been due to someone making a "spelling error" - # tom> -- writing "foo:..." instead of "foo = ...". - # tom> I'm not sure whether it is really worth diagnosing - # tom> this sort of problem. In the old days I used to add warnings - # tom> and errors like this pretty randomly, based on bug reports I - # tom> got. But there's a plausible argument that I was trying - # tom> too hard to prevent people from making mistakes. - if (exists $targets{$var} - && (! defined $cond || exists $targets{$var}{$cond})) - { - for my $tcond ($cond || keys %{$targets{$var}}) - { - prog_error ("\$targets{$var}{$tcond} exists but " - . "\$target_owner doesn't") - unless exists $target_owner{$var}{$tcond}; - # Diagnose the first user target encountered, if any. - # Restricting this test to user targets allows Automake - # to create rules for things like `bin_PROGRAMS = LDADD'. - if ($target_owner{$var}{$tcond} == TARGET_USER) - { - msg_cond_target ('syntax', $tcond, $var, - "`$var' is a target; " - . "expected a variable"); - return 0; - } - } - } - return 0; - } - - # Even a var_value examination is good enough for us. FIXME: - # really should maintain examined status on a per-condition basis. - $content_seen{$var} = 1; - return 1; -} - - -# $BOOLEAN -# variable_assert ($VAR, $WHERE) -# ------------------------------ -# Make sure a variable exists. $VAR is the variable name, and $WHERE -# is the name of a macro which refers to $VAR. -sub variable_assert ($$) -{ - my ($var, $where) = @_; - - return 1 - if variable_defined $var; - - require_variables ($where, "variable `$var' is used", 'TRUE', $var); - - return 0; -} - -# Mark a variable as examined. -sub examine_variable -{ - my ($var) = @_; - variable_defined ($var); -} - - -# &variable_conditions_recursive ($VAR) -# ------------------------------------- -# Return the set of conditions for which a variable is defined. - -# If the variable is not defined conditionally, and is not defined in -# terms of any variables which are defined conditionally, then this -# returns the empty list. - -# If the variable is defined conditionally, but is not defined in -# terms of any variables which are defined conditionally, then this -# returns the list of conditions for which the variable is defined. - -# If the variable is defined in terms of any variables which are -# defined conditionally, then this returns a full set of permutations -# of the subvariable conditions. For example, if the variable is -# defined in terms of a variable which is defined for COND_TRUE, -# then this returns both COND_TRUE and COND_FALSE. This is -# because we will need to define the variable under both conditions. -sub variable_conditions_recursive ($) -{ - my ($var) = @_; - - %vars_scanned = (); - - my @new_conds = variable_conditions_recursive_sub ($var, ''); - - # Now we want to return all permutations of the subvariable - # conditions. - my %allconds = (); - foreach my $item (@new_conds) - { - foreach (split (' ', $item)) - { - s/^(.*)_(TRUE|FALSE)$/$1_TRUE/; - $allconds{$_} = 1; - } - } - @new_conds = variable_conditions_permutations (sort keys %allconds); - - my %uniqify; - foreach my $cond (@new_conds) - { - my $reduce = variable_conditions_reduce (split (' ', $cond)); - next - if $reduce eq 'FALSE'; - $uniqify{$cond} = 1; - } - - # Note we cannot just do `return sort keys %uniqify', because this - # function is sometimes used in a scalar context. - my @uniq_list = sort by_condition keys %uniqify; - return @uniq_list; -} - - -# @CONDS -# variable_conditions ($VAR) -# -------------------------- -# Get the list of conditions that a variable is defined with, without -# recursing through the conditions of any subvariables. -# Argument is $VAR: the variable to get the conditions of. -# Returns the list of conditions. -sub variable_conditions ($) -{ - my ($var) = @_; - my @conds = keys %{$var_value{$var}}; - return sort by_condition @conds; -} - - -# $BOOLEAN -# &variable_conditionally_defined ($VAR) -# -------------------------------------- -sub variable_conditionally_defined ($) -{ - my ($var) = @_; - foreach my $cond (variable_conditions_recursive ($var)) - { - return 1 - unless $cond =~ /^TRUE|FALSE$/; - } - return 0; -} - -# @LIST -# &scan_variable_expansions ($TEXT) -# --------------------------------- -# Return the list of variable names expanded in $TEXT. -# Note that unlike some other functions, $TEXT is not split -# on spaces before we check for subvariables. -sub scan_variable_expansions ($) -{ - my ($text) = @_; - my @result = (); - - # Strip comments. - $text =~ s/#.*$//; - - # Record each use of ${stuff} or $(stuff) that do not follow a $. - while ($text =~ /(? 0) - { - $cond = shift(@conds); - - # FALSE is absorbent. - return 'FALSE' - if $cond eq 'FALSE'; - - if (!conditional_is_redundant ($cond, @ret, @conds)) - { - push (@ret, $cond); - } - } - - return "TRUE" if @ret == 0; - return @ret; -} - -# @CONDS -# invert_conditions (@CONDS) -# -------------------------- -# Invert a list of conditionals. Returns a set of conditionals which -# are never true for any of the input conditionals, and when taken -# together with the input conditionals cover all possible cases. -# -# For example: -# invert_conditions("A_TRUE B_TRUE", "A_FALSE B_FALSE") -# => ("A_FALSE B_TRUE", "A_TRUE B_FALSE") -# -# invert_conditions("A_TRUE B_TRUE", "A_TRUE B_FALSE", "A_FALSE") -# => () -sub invert_conditions -{ - my (@conds) = @_; - - my @notconds = (); - - # Generate all permutation for all inputs. - my @perm = - map { variable_conditions_permutations (split(' ', $_)); } @conds; - # Remove redundant conditions. - @perm = variable_conditions_reduce @perm; - - # Now remove all conditions which imply one of the input conditions. - foreach my $perm (@perm) - { - push @notconds, $perm - if ! conditional_implies_any ($perm, @conds); - } - return @notconds; -} - -# Return a list of permutations of a conditional string. -# (But never output FALSE conditions, they are useless.) -# -# Examples: -# variable_conditions_permutations ("FOO_FALSE", "BAR_TRUE") -# => ("FOO_FALSE BAR_FALSE", -# "FOO_FALSE BAR_TRUE", -# "FOO_TRUE BAR_FALSE", -# "FOO_TRUE BAR_TRUE") -# variable_conditions_permutations ("FOO_FALSE", "TRUE") -# => ("FOO_FALSE TRUE", -# "FOO_TRUE TRUE") -# variable_conditions_permutations ("TRUE") -# => ("TRUE") -# variable_conditions_permutations ("FALSE") -# => ("TRUE") -sub variable_conditions_permutations -{ - my (@comps) = @_; - return () - if ! @comps; - my $comp = shift (@comps); - return variable_conditions_permutations (@comps) - if $comp eq ''; - my $neg = condition_negate ($comp); - - my @ret; - foreach my $sub (variable_conditions_permutations (@comps)) - { - push (@ret, "$comp $sub") if $comp ne 'FALSE'; - push (@ret, "$neg $sub") if $neg ne 'FALSE'; - } - if (! @ret) - { - push (@ret, $comp) if $comp ne 'FALSE'; - push (@ret, $neg) if $neg ne 'FALSE'; - } - return @ret; -} - - -# $BOOL -# &check_variable_defined_unconditionally($VAR, $PARENT) -# ------------------------------------------------------ -# Warn if a variable is conditionally defined. This is called if we -# are using the value of a variable. -sub check_variable_defined_unconditionally ($$) -{ - my ($var, $parent) = @_; - foreach my $cond (keys %{$var_value{$var}}) - { - next - if $cond =~ /^TRUE|FALSE$/; - - if ($parent) - { - msg_var ('unsupported', $parent, - "automake does not support conditional definition of " - . "$var in $parent"); - } - else - { - msg_var ('unsupported', $var, - "automake does not support $var being defined " - . "conditionally"); - } - } -} - - -# Get the TRUE value of a variable, warn if the variable is -# conditionally defined. -sub variable_value -{ - my ($var) = @_; - &check_variable_defined_unconditionally ($var); - return $var_value{$var}{'TRUE'}; -} - - -# @VALUES -# &value_to_list ($VAR, $VAL, $COND) -# ---------------------------------- -# Convert a variable value to a list, split as whitespace. This will -# recursively follow $(...) and ${...} inclusions. It preserves @...@ -# substitutions. -# -# If COND is 'all', then all values under all conditions should be -# returned; if COND is a particular condition (all conditions are -# surrounded by @...@) then only the value for that condition should -# be returned; otherwise, warn if VAR is conditionally defined. -# SCANNED is a global hash listing whose keys are all the variables -# already scanned; it is an error to rescan a variable. -sub value_to_list ($$$) -{ - my ($var, $val, $cond) = @_; - my @result; - - # Strip backslashes - $val =~ s/\\(\n|$)/ /g; - - foreach (split (' ', $val)) - { - # If a comment seen, just leave. - last if /^#/; - - # Handle variable substitutions. - if (/^\$\{([^}]*)\}$/ || /^\$\(([^)]*)\)$/) - { - my $varname = $1; - - # If the user uses a losing variable name, just ignore it. - # This isn't ideal, but people have requested it. - next if ($varname =~ /\@.*\@/); - - my ($from, $to); - my @temp_list; - if ($varname =~ /$SUBST_REF_PATTERN/o) - { - $varname = $1; - $to = $3; - $from = quotemeta $2; - } - - # Find the value. - @temp_list = - variable_value_as_list_recursive_worker ($1, $cond, $var); - - # Now rewrite the value if appropriate. - if (defined $from) - { - grep (s/$from$/$to/, @temp_list); - } - - push (@result, @temp_list); - } - else - { - push (@result, $_); - } - } - - return @result; -} - - -# @VALUES -# variable_value_as_list ($VAR, $COND, $PARENT) -# --------------------------------------------- -# Get the value of a variable given a specified condition. without -# recursing through any subvariables. -# Arguments are: -# $VAR is the variable -# $COND is the condition. If this is not given, the value for the -# "TRUE" condition will be returned. -# $PARENT is the variable in which the variable is used: this is used -# only for error messages. -# Returns the list of conditions. -# For example, if A is defined as "foo $(B) bar", and B is defined as -# "baz", this will return ("foo", "$(B)", "bar") -sub variable_value_as_list -{ - my ($var, $cond, $parent) = @_; - my @result; - - # Check defined - return - unless variable_assert $var, $parent; - - # Get value for given condition - $cond ||= 'TRUE'; - my $onceflag; - foreach my $vcond (keys %{$var_value{$var}}) - { - my $val = $var_value{$var}{$vcond}; - - if (&conditional_true_when ($vcond, $cond)) - { - # Unless variable is not defined conditionally, there should only - # be one value of $vcond true when $cond. - &check_variable_defined_unconditionally ($var, $parent) - if $onceflag; - $onceflag = 1; - - # Strip backslashes - $val =~ s/\\(\n|$)/ /g; - - foreach (split (' ', $val)) - { - # If a comment seen, just leave. - last if /^#/; - - push (@result, $_); - } - } - } - - return @result; -} - - -# @VALUE -# &variable_value_as_list_recursive_worker ($VAR, $COND, $PARENT) -# --------------------------------------------------------------- -# Return contents of VAR as a list, split on whitespace. This will -# recursively follow $(...) and ${...} inclusions. It preserves @...@ -# substitutions. If COND is 'all', then all values under all -# conditions should be returned; if COND is a particular condition -# (all conditions are surrounded by @...@) then only the value for -# that condition should be returned; otherwise, warn if VAR is -# conditionally defined. If PARENT is specified, it is the name of -# the including variable; this is only used for error reports. -sub variable_value_as_list_recursive_worker ($$$) -{ - my ($var, $cond, $parent) = @_; - my @result = (); - - return - unless variable_assert $var, $parent; - - if (defined $vars_scanned{$var}) - { - # `vars_scanned' is a global we use to keep track of which - # variables we've already examined. - err_var $parent, "variable `$var' recursively defined"; - } - elsif ($cond eq 'all') - { - $vars_scanned{$var} = 1; - foreach my $vcond (keys %{$var_value{$var}}) - { - my $val = $var_value{$var}{$vcond}; - push (@result, &value_to_list ($var, $val, $cond)); - } - } - else - { - $cond ||= 'TRUE'; - $vars_scanned{$var} = 1; - my $onceflag; - foreach my $vcond (keys %{$var_value{$var}}) - { - my $val = $var_value{$var}{$vcond}; - if (&conditional_true_when ($vcond, $cond)) - { - # Warn if we have an ambiguity. It's hard to know how - # to handle this case correctly. - &check_variable_defined_unconditionally ($var, $parent) - if $onceflag; - $onceflag = 1; - push (@result, &value_to_list ($var, $val, $cond)); - } - } - } - - # Unset our entry in vars_scanned. We only care about recursive - # definitions. - delete $vars_scanned{$var}; - - return @result; -} - - -# &variable_output ($VAR, [@CONDS]) -# --------------------------------- -# Output all the values of $VAR is @COND is not specified, else only -# that corresponding to @COND. -sub variable_output ($@) -{ - my ($var, @conds) = @_; - - @conds = keys %{$var_value{$var}} - unless @conds; - - foreach my $cond (sort by_condition @conds) - { - prog_error ("unknown condition `$cond' for `$var'") - unless exists $var_value{$var}{$cond}; - - if (exists $var_comment{$var} && exists $var_comment{$var}{$cond}) - { - $output_vars .= $var_comment{$var}{$cond}; - } - - my $val = $var_value{$var}{$cond}; - my $equals = $var_type{$var}{$cond} eq ':' ? ':=' : '='; - my $output_var = "$var $equals $val"; - $output_var =~ s/^/make_condition ($cond)/meg; - $output_vars .= $output_var . "\n"; - } -} - - -# &variable_pretty_output ($VAR, [@CONDS]) -# ---------------------------------------- -# Likewise, but pretty, i.e., we *split* the values at spaces. Use only -# with variables holding filenames. -sub variable_pretty_output ($@) -{ - my ($var, @conds) = @_; - - @conds = keys %{$var_value{$var}} - unless @conds; - - foreach my $cond (sort by_condition @conds) - { - prog_error ("unknown condition `$cond' for `$var'") - unless exists $var_value{$var}{$cond}; - - if (exists $var_comment{$var} && exists $var_comment{$var}{$cond}) - { - $output_vars .= $var_comment{$var}{$cond}; - } - - my $val = $var_value{$var}{$cond}; - my $equals = $var_type{$var}{$cond} eq ':' ? ':=' : '='; - my $make_condition = make_condition ($cond); - $output_vars .= pretty_print_internal ("$make_condition$var $equals", - "$make_condition\t", - split (' ' , $val)); - } -} - - -# &variable_value_as_list_recursive ($VAR, $COND, $PARENT) -# -------------------------------------------------------- -# This is just a wrapper for variable_value_as_list_recursive_worker that -# initializes the global hash `vars_scanned'. This hash is used to -# avoid infinite recursion. -sub variable_value_as_list_recursive ($$@) -{ - my ($var, $cond, $parent) = @_; - %vars_scanned = (); - return &variable_value_as_list_recursive_worker ($var, $cond, $parent); -} - - -# &define_pretty_variable ($VAR, $COND, @VALUE) -# --------------------------------------------- -# Like define_variable, but the value is a list, and the variable may -# be defined conditionally. The second argument is the conditional -# under which the value should be defined; this should be the empty -# string to define the variable unconditionally. The third argument -# is a list holding the values to use for the variable. The value is -# pretty printed in the output file. -sub define_pretty_variable ($$@) -{ - my ($var, $cond, @value) = @_; - - # Beware that an empty $cond has a different semantics for - # macro_define and variable_pretty_output. - $cond ||= 'TRUE'; - - if (! variable_defined ($var, $cond)) - { - macro_define ($var, VAR_AUTOMAKE, '', $cond, "@value", undef); - variable_pretty_output ($var, $cond || 'TRUE'); - $content_seen{$var} = 1; - } -} - - -# define_variable ($VAR, $VALUE) -# ------------------------------ -# Define a new user variable VAR to VALUE, but only if not already defined. -sub define_variable ($$) -{ - my ($var, $value) = @_; - define_pretty_variable ($var, 'TRUE', $value); -} - - -# Like define_variable, but define a variable to be the configure -# substitution by the same name. -sub define_configure_variable ($) -{ - my ($var) = @_; - if (! variable_defined ($var, 'TRUE') - # Explicitly avoid ANSI2KNR -- we AC_SUBST that in - # protos.m4, but later define it elsewhere. This is - # pretty hacky. We also explicitly avoid AMDEPBACKSLASH: - # it might be subst'd by `\', which certainly would not be - # appreciated by Make. - && ! grep { $_ eq $var } (qw(ANSI2KNR AMDEPBACKSLASH))) - { - macro_define ($var, VAR_CONFIGURE, '', 'TRUE', - subst $var, $configure_vars{$var}); - variable_pretty_output ($var, 'TRUE'); - } -} - - -# define_compiler_variable ($LANG) -# -------------------------------- -# Define a compiler variable. We also handle defining the `LT' -# version of the command when using libtool. -sub define_compiler_variable ($) -{ - my ($lang) = @_; - - my ($var, $value) = ($lang->compiler, $lang->compile); - &define_variable ($var, $value); - &define_variable ("LT$var", "\$(LIBTOOL) --mode=compile $value") - if variable_defined ('LIBTOOL'); -} - - -# define_linker_variable ($LANG) -# ------------------------------ -# Define linker variables. -sub define_linker_variable ($) -{ - my ($lang) = @_; - - my ($var, $value) = ($lang->lder, $lang->ld); - # CCLD = $(CC). - &define_variable ($lang->lder, $lang->ld); - # CCLINK = $(CCLD) blah blah... - &define_variable ($lang->linker, - ((variable_defined ('LIBTOOL') - ? '$(LIBTOOL) --mode=link ' : '') - . $lang->link)); -} - -################################################################ - -## ---------------- ## -## Handling rules. ## -## ---------------- ## - -sub register_suffix_rule ($$$) -{ - my ($where, $src, $dest) = @_; - - verb "Sources ending in $src become $dest"; - push @suffixes, $src, $dest; - - # When tranforming sources to objects, Automake uses the - # %suffix_rules to move from each source extension to - # `.$(OBJEXT)', not to `.o' or `.obj'. However some people - # define suffix rules for `.o' or `.obj', so internally we will - # consider these extensions equivalent to `.$(OBJEXT)'. We - # CANNOT rewrite the target (i.e., automagically replace `.o' - # and `.obj' by `.$(OBJEXT)' in the output), or warn the user - # that (s)he'd better use `.$(OBJEXT)', because Automake itself - # output suffix rules for `.o' or `.obj'... - $dest = '.$(OBJEXT)' if ($dest eq '.o' || $dest eq '.obj'); - - # Reading the comments near the declaration of $suffix_rules might - # help to understand the update of $suffix_rules that follows... - - # Register $dest as a possible destination from $src. - # We might have the create the \hash. - if (exists $suffix_rules->{$src}) - { - $suffix_rules->{$src}{$dest} = [ $dest, 1 ]; - } - else - { - $suffix_rules->{$src} = { $dest => [ $dest, 1 ] }; - } - - # If we know how to transform $dest in something else, then - # we know how to transform $src in that "something else". - if (exists $suffix_rules->{$dest}) - { - for my $dest2 (keys %{$suffix_rules->{$dest}}) - { - my $dist = $suffix_rules->{$dest}{$dest2}[1] + 1; - # Overwrite an existing $src->$dest2 path only if - # the path via $dest which is shorter. - if (! exists $suffix_rules->{$src}{$dest2} - || $suffix_rules->{$src}{$dest2}[1] > $dist) - { - $suffix_rules->{$src}{$dest2} = [ $dest, $dist ]; - } - } - } - - # Similarly, any extension that can be derived into $src - # can be derived into the same extenstions as $src can. - my @dest2 = keys %{$suffix_rules->{$src}}; - for my $src2 (keys %$suffix_rules) - { - if (exists $suffix_rules->{$src2}{$src}) - { - for my $dest2 (@dest2) - { - my $dist = $suffix_rules->{$src}{$dest2} + 1; - # Overwrite an existing $src2->$dest2 path only if - # the path via $src is shorter. - if (! exists $suffix_rules->{$src2}{$dest2} - || $suffix_rules->{$src2}{$dest2}[1] > $dist) - { - $suffix_rules->{$src2}{$dest2} = [ $src, $dist ]; - } - } - } - } -} - -# @CONDS -# rule_define ($TARGET, $SOURCE, $OWNER, $COND, $WHERE) -# ----------------------------------------------------- -# Define a new rule. $TARGET is the rule name. $SOURCE -# is the filename the rule comes from. $OWNER is the -# owener of the rule (TARGET_AUTOMAKE or TARGET_USER). -# $COND is the condition string under which the rule is defined. -# $WHERE is where the rule is defined (file name and/or line number). -# Returns a (possibly empty) list of conditions where the rule -# should be defined. -sub rule_define ($$$$$) -{ - my ($target, $source, $owner, $cond, $where) = @_; - - # Don't even think about defining a rule in condition FALSE. - return () if $cond eq 'FALSE'; - - # For now `foo:' will override `foo$(EXEEXT):'. This is temporary, - # though, so we emit a warning. - (my $noexe = $target) =~ s,\$\(EXEEXT\)$,,; - if ($noexe ne $target - && exists $targets{$noexe} - && exists $targets{$noexe}{$cond} - && $target_name{$noexe}{$cond} ne $target) - { - # The no-exeext option enables this feature. - if (! defined $options{'no-exeext'}) - { - msg ('obsolete', $noexe, - "deprecated feature: `$noexe' overrides `$noexe\$(EXEEXT)'\n" - . "change your target to read `$noexe\$(EXEEXT)'"); - } - # Don't define. - return (); - } - - # For now on, strip off $(EXEEXT) from $target, so we can diagnose - # a clash if `ctags$(EXEEXT):' is redefined after `ctags:'. - my $realtarget = $target; - $target = $noexe; - - # A GNU make-style pattern rule has a single "%" in the target name. - msg ('portability', $where, - "`%'-style pattern rules are a GNU make extension") - if $target =~ /^[^%]*%[^%]*$/; - - # Diagnose target redefinitions. - if (exists $target_source{$target}{$cond}) - { - # Sanity checks. - prog_error ("\$target_source{$target}{$cond} exists, but \$target_owner" - . " doesn't.") - unless exists $target_owner{$target}{$cond}; - prog_error ("\$target_source{$target}{$cond} exists, but \$targets" - . " doesn't.") - unless exists $targets{$target}{$cond}; - prog_error ("\$target_source{$target}{$cond} exists, but \$target_name" - . " doesn't.") - unless exists $target_name{$target}{$cond}; - - my $oldowner = $target_owner{$target}{$cond}; - - # Don't mention true conditions in diagnostics. - my $condmsg = $cond ne 'TRUE' ? " in condition `$cond'" : ''; - - if ($owner == TARGET_USER) - { - if ($oldowner eq TARGET_USER) - { - # Ignore `%'-style pattern rules. We'd need the - # dependencies to detect duplicates, and they are - # already diagnosed as unportable by -Wportability. - if ($target !~ /^[^%]*%[^%]*$/) - { - ## FIXME: Presently we can't diagnose duplcate user rules - ## because we doesn't distinguish rules with commands - ## from rules that only add dependencies. E.g., - ## .PHONY: foo - ## .PHONY: bar - ## is legitimate. (This is phony.test.) - - # msg ('syntax', $where, - # "redefinition of `$target'$condmsg..."); - # msg_cond_target ('syntax', $cond, $target, - # "... `$target' previously defined here."); - } - # Return so we don't redefine the rule in our tables, - # don't check for ambiguous conditional, etc. The rule - # will be output anyway beauce &read_am_file ignore the - # return code. - return (); - } - else - { - # Since we parse the user Makefile.am before reading - # the Automake fragments, this condition should never happen. - prog_error ("user target `$target' seen after Automake's " - . "definition\nfrom `$targets{$target}$condmsg'"); - } - } - else # $owner == TARGET_AUTOMAKE - { - if ($oldowner == TARGET_USER) - { - # Don't overwrite the user definition of TARGET. - return (); - } - else # $oldowner == TARGET_AUTOMAKE - { - # Automake should ignore redefinitions of its own - # rules if they came from the same file. This makes - # it easier to process a Makefile fragment several times. - # Hower it's an error if the target is defined in many - # files. E.g., the user might be using bin_PROGRAMS = ctags - # which clashes with our `ctags' rule. - # (It would be more accurate if we had a way to compare - # the *content* of both rules. Then $targets_source would - # be useless.) - my $oldsource = $target_source{$target}{$cond}; - return () if $source eq $oldsource; - - msg ('syntax', $where, "redefinition of `$target'$condmsg..."); - msg_cond_target ('syntax', $cond, $target, - "... `$target' previously defined here."); - return (); - } - } - # Never reached. - prog_error ("Unreachable place reached."); - } - - # Conditions for which the rule should be defined. - my @conds = $cond; - - # Check ambiguous conditional definitions. - my ($message, $ambig_cond) = - conditional_ambiguous_p ($target, $cond, keys %{$targets{$target}}); - if ($message) # We have an ambiguty. - { - if ($owner == TARGET_USER) - { - # For user rules, just diagnose the ambiguity. - msg 'syntax', $where, "$message ..."; - msg_cond_target ('syntax', $ambig_cond, $target, - "... `$target' previously defined here."); - return (); - } - else - { - # FIXME: for Automake rules, we can't diagnose ambiguities yet. - # The point is that Automake doesn't propagate conditionals - # everywhere. For instance &handle_PROGRAMS doesn't care if - # bin_PROGRAMS was defined conditionally or not. - # On the following input - # if COND1 - # foo: - # ... - # else - # bin_PROGRAMS = foo - # endif - # &handle_PROGRAMS will attempt to define a `foo:' rule - # in condition TRUE (which conflicts with COND1). Fixing - # this in &handle_PROGRAMS and siblings seems hard: you'd - # have to explain &file_contents what to do with a - # conditional. So for now we do our best *here*. If `foo:' - # was already defined in condition COND1 and we want to define - # it in condition TRUE, then define it only in condition !COND1. - # (See cond14.test and cond15.test for some test cases.) - my @defined_conds = keys %{$targets{$target}}; - @conds = (); - for my $undefined_cond (invert_conditions(@defined_conds)) - { - push @conds, make_condition ($cond, $undefined_cond); - } - # No conditions left to define the rule. - # Warn, because our workaround is meaningless in this case. - if (scalar @conds == 0) - { - msg 'syntax', $where, "$message ..."; - msg_cond_target ('syntax', $ambig_cond, $target, - "... `$target' previously defined here."); - return (); - } - } - } - - # Finally define this rule. - for my $c (@conds) - { - $targets{$target}{$c} = $where; - $target_source{$target}{$c} = $source; - $target_owner{$target}{$c} = $owner; - $target_name{$target}{$c} = $realtarget; - } - - # Check the rule for being a suffix rule. If so, store in a hash. - # Either it's a rule for two known extensions... - if ($target =~ /^($KNOWN_EXTENSIONS_PATTERN)($KNOWN_EXTENSIONS_PATTERN)$/ - # ...or it's a rule with unknown extensions (.i.e, the rule looks like - # `.foo.bar:' but `.foo' or `.bar' are not declared in SUFFIXES - # and are not known language extensions). - # Automake will complete SUFFIXES from @suffixes automatically - # (see handle_footer). - || ($target =~ /$SUFFIX_RULE_PATTERN/o && accept_extensions($1))) - { - register_suffix_rule ($where, $1, $2); - } - - # Return "" instead of TRUE so it can be used with make_paragraphs - # directly. - return "" if 1 == @conds && $conds[0] eq 'TRUE'; - return @conds; -} - - -# See if a target exists. -sub target_defined -{ - my ($target) = @_; - return exists $targets{$target}; -} - - -################################################################ - -# &append_comments ($VARIABLE, $SPACING, $COMMENT) -# ------------------------------------------------ -# Apped $COMMENT to the other comments for $VARIABLE, using -# $SPACING as separator. -sub append_comments ($$$$) -{ - my ($cond, $var, $spacing, $comment) = @_; - $var_comment{$var}{$cond} .= $spacing - if (!defined $var_comment{$var}{$cond} - || $var_comment{$var}{$cond} !~ /\n$/o); - $var_comment{$var}{$cond} .= $comment; -} - - -# &read_am_file ($AMFILE) -# ----------------------- -# Read Makefile.am and set up %contents. Simultaneously copy lines -# from Makefile.am into $output_trailer or $output_vars as -# appropriate. NOTE we put rules in the trailer section. We want -# user rules to come after our generated stuff. -sub read_am_file ($) -{ - my ($amfile) = @_; - - my $am_file = new Automake::XFile ("< $amfile"); - verb "reading $amfile"; - - my $spacing = ''; - my $comment = ''; - my $blank = 0; - my $saw_bk = 0; - - use constant IN_VAR_DEF => 0; - use constant IN_RULE_DEF => 1; - use constant IN_COMMENT => 2; - my $prev_state = IN_RULE_DEF; - - while ($_ = $am_file->getline) - { - if (/$IGNORE_PATTERN/o) - { - # Merely delete comments beginning with two hashes. - } - elsif (/$WHITE_PATTERN/o) - { - err "$amfile:$.", "blank line following trailing backslash" - if $saw_bk; - # Stick a single white line before the incoming macro or rule. - $spacing = "\n"; - $blank = 1; - # Flush all comments seen so far. - if ($comment ne '') - { - $output_vars .= $comment; - $comment = ''; - } - } - elsif (/$COMMENT_PATTERN/o) - { - # Stick comments before the incoming macro or rule. Make - # sure a blank line preceeds first block of comments. - $spacing = "\n" unless $blank; - $blank = 1; - $comment .= $spacing . $_; - $spacing = ''; - $prev_state = IN_COMMENT; - } - else - { - last; - } - $saw_bk = /\\$/ && ! /$IGNORE_PATTERN/o; - } - - # We save the conditional stack on entry, and then check to make - # sure it is the same on exit. This lets us conditonally include - # other files. - my @saved_cond_stack = @cond_stack; - my $cond = conditional_string (@cond_stack); - - my $last_var_name = ''; - my $last_var_type = ''; - my $last_var_value = ''; - # FIXME: shouldn't use $_ in this loop; it is too big. - while ($_) - { - my $here = "$amfile:$."; - - # Make sure the line is \n-terminated. - chomp; - $_ .= "\n"; - - # Don't look at MAINTAINER_MODE_TRUE here. That shouldn't be - # used by users. @MAINT@ is an anachronism now. - $_ =~ s/\@MAINT\@//g - unless $seen_maint_mode; - - my $new_saw_bk = /\\$/ && ! /$IGNORE_PATTERN/o; - - if (/$IGNORE_PATTERN/o) - { - # Merely delete comments beginning with two hashes. - } - elsif (/$WHITE_PATTERN/o) - { - # Stick a single white line before the incoming macro or rule. - $spacing = "\n"; - err $here, "blank line following trailing backslash" - if $saw_bk; - } - elsif (/$COMMENT_PATTERN/o) - { - # Stick comments before the incoming macro or rule. - $comment .= $spacing . $_; - $spacing = ''; - err $here, "comment following trailing backslash" - if $saw_bk && $comment eq ''; - $prev_state = IN_COMMENT; - } - elsif ($saw_bk) - { - if ($prev_state == IN_RULE_DEF) - { - $output_trailer .= &make_condition (@cond_stack); - $output_trailer .= $_; - } - elsif ($prev_state == IN_COMMENT) - { - # If the line doesn't start with a `#', add it. - # We do this because a continuated comment like - # # A = foo \ - # bar \ - # baz - # is not portable. BSD make doesn't honor - # escaped newlines in comments. - s/^#?/#/; - $comment .= $spacing . $_; - } - else # $prev_state == IN_VAR_DEF - { - $last_var_value .= ' ' - unless $last_var_value =~ /\s$/; - $last_var_value .= $_; - - if (!/\\$/) - { - append_comments ($cond || 'TRUE', - $last_var_name, $spacing, $comment); - $comment = $spacing = ''; - macro_define ($last_var_name, VAR_MAKEFILE, - $last_var_type, $cond, - $last_var_value, $here) - if $cond ne 'FALSE'; - push (@var_list, $last_var_name); - } - } - } - - elsif (/$IF_PATTERN/o) - { - $cond = cond_stack_if ($1, $2, $here); - } - elsif (/$ELSE_PATTERN/o) - { - $cond = cond_stack_else ($1, $2, $here); - } - elsif (/$ENDIF_PATTERN/o) - { - $cond = cond_stack_endif ($1, $2, $here); - } - - elsif (/$RULE_PATTERN/o) - { - # Found a rule. - $prev_state = IN_RULE_DEF; - - # For now we have to output all definitions of user rules - # and can't diagnose duplicates (see the comment in - # rule_define). So we go on and ignore the return value. - rule_define ($1, $amfile, TARGET_USER, $cond || 'TRUE', $here); - - check_variable_expansions ($_, $here); - - $output_trailer .= $comment . $spacing; - $output_trailer .= &make_condition (@cond_stack); - $output_trailer .= $_; - $comment = $spacing = ''; - } - elsif (/$ASSIGNMENT_PATTERN/o) - { - # Found a macro definition. - $prev_state = IN_VAR_DEF; - $last_var_name = $1; - $last_var_type = $2; - $last_var_value = $3; - if ($3 ne '' && substr ($3, -1) eq "\\") - { - # We preserve the `\' because otherwise the long lines - # that are generated will be truncated by broken - # `sed's. - $last_var_value = $3 . "\n"; - } - - if (!/\\$/) - { - # Accumulating variables must not be output. - append_comments ($cond || 'TRUE', - $last_var_name, $spacing, $comment); - $comment = $spacing = ''; - - macro_define ($last_var_name, VAR_MAKEFILE, - $last_var_type, $cond, - $last_var_value, $here) - if $cond ne 'FALSE'; - push (@var_list, $last_var_name); - } - } - elsif (/$INCLUDE_PATTERN/o) - { - my $path = $1; - - if ($path =~ s/^\$\(top_srcdir\)\///) - { - push (@include_stack, "\$\(top_srcdir\)/$path"); - # Distribute any included file. - - # Always use the $(top_srcdir) prefix in DIST_COMMON, - # otherwise OSF make will implicitely copy the included - # file in the build tree during `make distdir' to satisfy - # the dependency. - # (subdircond2.test and subdircond3.test will fail.) - push_dist_common ("\$\(top_srcdir\)/$path"); - } - else - { - $path =~ s/\$\(srcdir\)\///; - push (@include_stack, "\$\(srcdir\)/$path"); - # Always use the $(srcdir) prefix in DIST_COMMON, - # otherwise OSF make will implicitely copy the included - # file in the build tree during `make distdir' to satisfy - # the dependency. - # (subdircond2.test and subdircond3.test will fail.) - push_dist_common ("\$\(srcdir\)/$path"); - $path = $relative_dir . "/" . $path; - } - &read_am_file ($path); - } - else - { - # This isn't an error; it is probably a continued rule. - # In fact, this is what we assume. - $prev_state = IN_RULE_DEF; - check_variable_expansions ($_, $here); - $output_trailer .= $comment . $spacing; - $output_trailer .= &make_condition (@cond_stack); - $output_trailer .= $_; - $comment = $spacing = ''; - err $here, "`#' comment at start of rule is unportable" - if $_ =~ /^\t\s*\#/; - } - - $saw_bk = $new_saw_bk; - $_ = $am_file->getline; - } - - $output_trailer .= $comment; - - err_am (@cond_stack ? "unterminated conditionals: @cond_stack" - : "too many conditionals closed in include file") - if "@saved_cond_stack" ne "@cond_stack"; -} - - -# define_standard_variables () -# ---------------------------- -# A helper for read_main_am_file which initializes configure variables -# and variables from header-vars.am. -sub define_standard_variables -{ - my $saved_output_vars = $output_vars; - my ($comments, undef, $rules) = - file_contents_internal (1, "$libdir/am/header-vars.am"); - - # This will output the definitions in $output_vars, which we don't - # want... - foreach my $var (sort keys %configure_vars) - { - &define_configure_variable ($var); - push (@var_list, $var); - } - - # ... hence, we restore $output_vars. - $output_vars = $saved_output_vars . $comments . $rules; -} - -# Read main am file. -sub read_main_am_file -{ - my ($amfile) = @_; - - # This supports the strange variable tricks we are about to play. - prog_error (macros_dump () . "variable defined before read_main_am_file") - if (scalar keys %var_value > 0); - - # Generate copyright header for generated Makefile.in. - # We do discard the output of predefined variables, handled below. - $output_vars = ("# $in_file_name generated by automake " - . $VERSION . " from $am_file_name.\n"); - $output_vars .= '# ' . subst ('configure_input') . "\n"; - $output_vars .= $gen_copyright; - - # We want to predefine as many variables as possible. This lets - # the user set them with `+=' in Makefile.am. However, we don't - # want these initial definitions to end up in the output quite - # yet. So we just load them, but output them later. - &define_standard_variables; - - # Read user file, which might override some of our values. - &read_am_file ($amfile); - - # Output all the Automake variables. If the user changed one, - # then it is now marked as VAR_CONFIGURE or VAR_MAKEFILE. - foreach my $var (uniq @var_list) - { - # Some variables, like AMDEPBACKSLASH are in @var_list - # but don't have a owner. This is good, because we don't want - # to output them. - foreach my $cond (keys %{$var_owner{$var}}) - { - variable_output ($var, $cond) - if $var_owner{$var}{$cond} == VAR_AUTOMAKE; - } - } - - # Now dump the user variables that were defined. We do it in the same - # order in which they were defined (skipping duplicates). - foreach my $var (uniq @var_list) - { - foreach my $cond (keys %{$var_owner{$var}}) - { - variable_output ($var, $cond) - if $var_owner{$var}{$cond} != VAR_AUTOMAKE; - } - } -} - -################################################################ - -# $FLATTENED -# &flatten ($STRING) -# ------------------ -# Flatten the $STRING and return the result. -sub flatten -{ - $_ = shift; - - s/\\\n//somg; - s/\s+/ /g; - s/^ //; - s/ $//; - - return $_; -} - - -# @PARAGRAPHS -# &make_paragraphs ($MAKEFILE, [%TRANSFORM]) -# ------------------------------------------ -# Load a $MAKEFILE, apply the %TRANSFORM, and return it as a list of -# paragraphs. -sub make_paragraphs ($%) -{ - my ($file, %transform) = @_; - - # Complete %transform with global options and make it a Perl - # $command. - my $command = - "s/$IGNORE_PATTERN//gm;" - . transform (%transform, - - 'CYGNUS' => $cygnus_mode, - 'MAINTAINER-MODE' - => $seen_maint_mode ? subst ('MAINTAINER_MODE_TRUE') : '', - - 'SHAR' => $options{'dist-shar'} || 0, - 'BZIP2' => $options{'dist-bzip2'} || 0, - 'ZIP' => $options{'dist-zip'} || 0, - 'COMPRESS' => $options{'dist-tarZ'} || 0, - - 'INSTALL-INFO' => !$options{'no-installinfo'}, - 'INSTALL-MAN' => !$options{'no-installman'}, - 'CK-NEWS' => $options{'check-news'} || 0, - - 'SUBDIRS' => variable_defined ('SUBDIRS'), - 'TOPDIR' => backname ($relative_dir), - 'TOPDIR_P' => $relative_dir eq '.', - 'CONFIGURE-AC' => $configure_ac, - - 'BUILD' => $seen_canonical == AC_CANONICAL_SYSTEM, - 'HOST' => $seen_canonical, - 'TARGET' => $seen_canonical == AC_CANONICAL_SYSTEM, - - 'LIBTOOL' => variable_defined ('LIBTOOL')) - # We don't need more than two consecutive new-lines. - . 's/\n{3,}/\n\n/g'; - - # Swallow the file and apply the COMMAND. - my $fc_file = new Automake::XFile "< $file"; - # Looks stupid? - verb "reading $file"; - my $saved_dollar_slash = $/; - undef $/; - $_ = $fc_file->getline; - $/ = $saved_dollar_slash; - eval $command; - $fc_file->close; - my $content = $_; - - # Split at unescaped new lines. - my @lines = split (/(? 0 } @prefixes; - $valid{'EXTRA'} = 0; - foreach my $varname (keys %var_value) - { - # Automake is allowed to define variables that look like primaries - # but which aren't. E.g. INSTALL_sh_DATA. - # Autoconf can also define variables like INSTALL_DATA, so - # ignore all configure variables (at least those which are not - # redefined in Makefile.am). - # FIXME: We should make sure that these variables are not - # conditionally defined (or else adjust the condition below). - next - if (exists $var_owner{$varname} - && exists $var_owner{$varname}{'TRUE'} - && $var_owner{$varname}{'TRUE'} != VAR_MAKEFILE); - - if ($varname =~ /^(nobase_)?(dist_|nodist_)?(.*)_$primary$/) - { - my ($base, $dist, $X) = ($1 || '', $2 || '', $3 || ''); - if ($dist ne '' && ! $can_dist) - { - err_var ($varname, - "invalid variable `$varname': `dist' is forbidden"); - } - # Standard directories must be explicitely allowed. - elsif (! defined $valid{$X} && exists $standard_prefix{$X}) - { - err_var ($varname, - "`${X}dir' is not a legitimate directory " . - "for `$primary'"); - } - # A not explicitely valid directory is allowed if Xdir is defined. - elsif (! defined $valid{$X} && - require_variables_for_macro ($varname, "`$varname' is used", - "${X}dir")) - { - # Nothing to do. Any error message has been output - # by require_variables_for_macro. - } - else - { - # Ensure all extended prefixes are actually used. - $valid{"$base$dist$X"} = 1; - } - } - } - - # Return only those which are actually defined. - return sort grep { variable_defined ($_ . '_' . $primary) } keys %valid; -} - - -# Handle `where_HOW' variable magic. Does all lookups, generates -# install code, and possibly generates code to define the primary -# variable. The first argument is the name of the .am file to munge, -# the second argument is the primary variable (eg HEADERS), and all -# subsequent arguments are possible installation locations. Returns -# list of all values of all _HOW targets. -# -# FIXME: this should be rewritten to be cleaner. It should be broken -# up into multiple functions. -# -# Usage is: am_install_var (OPTION..., file, HOW, where...) -sub am_install_var -{ - my (@args) = @_; - - my $do_require = 1; - my $can_dist = 0; - my $default_dist = 0; - while (@args) - { - if ($args[0] eq '-noextra') - { - $do_require = 0; - } - elsif ($args[0] eq '-candist') - { - $can_dist = 1; - } - elsif ($args[0] eq '-defaultdist') - { - $default_dist = 1; - $can_dist = 1; - } - elsif ($args[0] !~ /^-/) - { - last; - } - shift (@args); - } - - my ($file, $primary, @prefix) = @args; - - # Now that configure substitutions are allowed in where_HOW - # variables, it is an error to actually define the primary. We - # allow `JAVA', as it is customarily used to mean the Java - # interpreter. This is but one of several Java hacks. Similarly, - # `PYTHON' is customarily used to mean the Python interpreter. - reject_var $primary, "`$primary' is an anachronism" - unless $primary eq 'JAVA' || $primary eq 'PYTHON'; - - # Get the prefixes which are valid and actually used. - @prefix = am_primary_prefixes ($primary, $can_dist, @prefix); - - # If a primary includes a configure substitution, then the EXTRA_ - # form is required. Otherwise we can't properly do our job. - my $require_extra; - - my @used = (); - my @result = (); - - # True if the iteration is the first one. Used for instance to - # output parts of the associated file only once. - my $first = 1; - foreach my $X (@prefix) - { - my $nodir_name = $X; - my $one_name = $X . '_' . $primary; - - my $strip_subdir = 1; - # If subdir prefix should be preserved, do so. - if ($nodir_name =~ /^nobase_/) - { - $strip_subdir = 0; - $nodir_name =~ s/^nobase_//; - } - - # If files should be distributed, do so. - my $dist_p = 0; - if ($can_dist) - { - $dist_p = (($default_dist && $nodir_name !~ /^nodist_/) - || (! $default_dist && $nodir_name =~ /^dist_/)); - $nodir_name =~ s/^(dist|nodist)_//; - } - - # Append actual contents of where_PRIMARY variable to - # result. - foreach my $rcurs (&variable_value_as_list_recursive ($one_name, 'all')) - { - # Skip configure substitutions. Possibly bogus. - if ($rcurs =~ /^\@.*\@$/) - { - if ($nodir_name eq 'EXTRA') - { - err_var ($one_name, - "`$one_name' contains configure substitution, " - . "but shouldn't"); - } - # Check here to make sure variables defined in - # configure.ac do not imply that EXTRA_PRIMARY - # must be defined. - elsif (! defined $configure_vars{$one_name}) - { - $require_extra = $one_name - if $do_require; - } - - next; - } - - push (@result, $rcurs); - } - # A blatant hack: we rewrite each _PROGRAMS primary to include - # EXEEXT. - append_exeext ($one_name) - if $primary eq 'PROGRAMS'; - # "EXTRA" shouldn't be used when generating clean targets, - # all, or install targets. We used to warn if EXTRA_FOO was - # defined uselessly, but this was annoying. - next - if $nodir_name eq 'EXTRA'; - - if ($nodir_name eq 'check') - { - push (@check, '$(' . $one_name . ')'); - } - else - { - push (@used, '$(' . $one_name . ')'); - } - - # Is this to be installed? - my $install_p = $nodir_name ne 'noinst' && $nodir_name ne 'check'; - - # If so, with install-exec? (or install-data?). - my $exec_p = ($nodir_name =~ /$EXEC_DIR_PATTERN/o); - - my $check_options_p = $install_p - && defined $options{'std-options'}; - - # Singular form of $PRIMARY. - (my $one_primary = $primary) =~ s/S$//; - $output_rules .= &file_contents ($file, - ('FIRST' => $first, - - 'PRIMARY' => $primary, - 'ONE_PRIMARY' => $one_primary, - 'DIR' => $X, - 'NDIR' => $nodir_name, - 'BASE' => $strip_subdir, - - 'EXEC' => $exec_p, - 'INSTALL' => $install_p, - 'DIST' => $dist_p, - 'CK-OPTS' => $check_options_p)); - - $first = 0; - } - - # The JAVA variable is used as the name of the Java interpreter. - # The PYTHON variable is used as the name of the Python interpreter. - if (@used && $primary ne 'JAVA' && $primary ne 'PYTHON') - { - # Define it. - define_pretty_variable ($primary, '', @used); - $output_vars .= "\n"; - } - - err_var ($require_extra, - "`$require_extra' contains configure substitution,\n" - . "but `EXTRA_$primary' not defined") - if ($require_extra && ! variable_defined ('EXTRA_' . $primary)); - - # Push here because PRIMARY might be configure time determined. - push (@all, '$(' . $primary . ')') - if @used && $primary ne 'JAVA' && $primary ne 'PYTHON'; - - # Make the result unique. This lets the user use conditionals in - # a natural way, but still lets us program lazily -- we don't have - # to worry about handling a particular object more than once. - return uniq (sort @result); -} - - -################################################################ - -# Each key in this hash is the name of a directory holding a -# Makefile.in. These variables are local to `is_make_dir'. -my %make_dirs = (); -my $make_dirs_set = 0; - -sub is_make_dir -{ - my ($dir) = @_; - if (! $make_dirs_set) - { - foreach my $iter (@configure_input_files) - { - $make_dirs{dirname ($iter)} = 1; - } - # We also want to notice Makefile.in's. - foreach my $iter (@other_input_files) - { - if ($iter =~ /Makefile\.in$/) - { - $make_dirs{dirname ($iter)} = 1; - } - } - $make_dirs_set = 1; - } - return defined $make_dirs{$dir}; -} - -################################################################ - -# This variable is local to the "require file" set of functions. -my @require_file_paths = (); - - -# &maybe_push_required_file ($DIR, $FILE, $FULLFILE) -# -------------------------------------------------- -# See if we want to push this file onto dist_common. This function -# encodes the rules for deciding when to do so. -sub maybe_push_required_file -{ - my ($dir, $file, $fullfile) = @_; - - if ($dir eq $relative_dir) - { - push_dist_common ($file); - return 1; - } - elsif ($relative_dir eq '.' && ! &is_make_dir ($dir)) - { - # If we are doing the topmost directory, and the file is in a - # subdir which does not have a Makefile, then we distribute it - # here. - push_dist_common ($fullfile); - return 1; - } - return 0; -} - - -# &require_file_internal ($WHERE, $MYSTRICT, @FILES) -# -------------------------------------------------- -# Verify that the file must exist in the current directory. -# $MYSTRICT is the strictness level at which this file becomes required. -# -# Must set require_file_paths before calling this function. -# require_file_paths is set to hold a single directory (the one in -# which the first file was found) before return. -sub require_file_internal ($$@) -{ - my ($where, $mystrict, @files) = @_; - - foreach my $file (@files) - { - my $fullfile; - my $errdir; - my $errfile; - my $save_dir; - - my $found_it = 0; - my $dangling_sym = 0; - foreach my $dir (@require_file_paths) - { - $fullfile = $dir . "/" . $file; - $errdir = $dir unless $errdir; - - # Use different name for "error filename". Otherwise on - # an error the bad file will be reported as eg - # `../../install-sh' when using the default - # config_aux_path. - $errfile = $errdir . '/' . $file; - - if (-l $fullfile && ! -f $fullfile) - { - $dangling_sym = 1; - last; - } - elsif (-f $fullfile) - { - $found_it = 1; - maybe_push_required_file ($dir, $file, $fullfile); - $save_dir = $dir; - last; - } - } - - # `--force-missing' only has an effect if `--add-missing' is - # specified. - if ($found_it && (! $add_missing || ! $force_missing)) - { - # Prune the path list. - @require_file_paths = $save_dir; - } - else - { - # If we've already looked for it, we're done. You might - # wonder why we don't do this before searching for the - # file. If we do that, then something like - # AC_OUTPUT(subdir/foo foo) will fail to put foo.in into - # DIST_COMMON. - if (! $found_it) - { - next if defined $require_file_found{$fullfile}; - $require_file_found{$fullfile} = 1; - } - - if ($strictness >= $mystrict) - { - if ($dangling_sym && $add_missing) - { - unlink ($fullfile); - } - - my $trailer = ''; - my $suppress = 0; - - # Only install missing files according to our desired - # strictness level. - my $message = "required file `$errfile' not found"; - if ($add_missing) - { - $suppress = 1; - - if (-f ("$libdir/$file")) - { - # Install the missing file. Symlink if we - # can, copy if we must. Note: delete the file - # first, in case it is a dangling symlink. - $message = "installing `$errfile'"; - # Windows Perl will hang if we try to delete a - # file that doesn't exist. - unlink ($errfile) if -f $errfile; - if ($symlink_exists && ! $copy_missing) - { - if (! symlink ("$libdir/$file", $errfile)) - { - $suppress = 0; - $trailer = "; error while making link: $!"; - } - } - elsif (system ('cp', "$libdir/$file", $errfile)) - { - $suppress = 0; - $trailer = "\n error while copying"; - } - } - - if (! maybe_push_required_file (dirname ($errfile), - $file, $errfile)) - { - if (! $found_it) - { - # We have added the file but could not push it - # into DIST_COMMON (probably because this is - # an auxiliary file and we are not processing - # the top level Makefile). This is unfortunate, - # since it means we are using a file which is not - # distributed! - - # Get Automake to be run again: on the second - # run the file will be found, and pushed into - # the toplevel DIST_COMMON automatically. - $automake_needs_to_reprocess_all_files = 1; - } - } - - # Prune the path list. - @require_file_paths = &dirname ($errfile); - } - - # If --force-missing was specified, and we have - # actually found the file, then do nothing. - next - if $found_it && $force_missing; - - msg ($suppress ? 'note' : 'error', $where, "$message$trailer"); - } - } - } -} - -# &require_file ($WHERE, $MYSTRICT, @FILES) -# ----------------------------------------- -sub require_file ($$@) -{ - my ($where, $mystrict, @files) = @_; - @require_file_paths = $relative_dir; - require_file_internal ($where, $mystrict, @files); -} - -# &require_file_with_macro ($COND, $MACRO, $MYSTRICT, @FILES) -# ----------------------------------------------------------- -sub require_file_with_macro ($$$@) -{ - my ($cond, $macro, $mystrict, @files) = @_; - require_file ($var_location{$macro}{$cond}, $mystrict, @files); -} - - -# &require_conf_file ($WHERE, $MYSTRICT, @FILES) -# ---------------------------------------------- -# Looks in configuration path, as specified by AC_CONFIG_AUX_DIR. -sub require_conf_file ($$@) -{ - my ($where, $mystrict, @files) = @_; - @require_file_paths = @config_aux_path; - require_file_internal ($where, $mystrict, @files); - my $dir = $require_file_paths[0]; - @config_aux_path = @require_file_paths; - # Avoid unsightly '/.'s. - $config_aux_dir = '$(top_srcdir)' . ($dir eq '.' ? "" : "/$dir"); -} - - -# &require_conf_file_with_macro ($COND, $MACRO, $MYSTRICT, @FILES) -# ---------------------------------------------------------------- -sub require_conf_file_with_macro ($$$@) -{ - my ($cond, $macro, $mystrict, @files) = @_; - require_conf_file ($var_location{$macro}{$cond}, $mystrict, @files); -} - -################################################################ - -# &require_build_directory ($DIRECTORY) -# ------------------------------------ -# Emit rules to create $DIRECTORY if needed, and return -# the file that any target requiring this directory should be made -# dependent upon. -sub require_build_directory ($) -{ - my $directory = shift; - my $dirstamp = "$directory/.dirstamp"; - - # Don't emit the rule twice. - if (! defined $directory_map{$directory}) - { - $directory_map{$directory} = 1; - - # Directory must be removed by `make distclean'. - $clean_files{$dirstamp} = DIST_CLEAN; - - $output_rules .= ("$dirstamp:\n" - . "\t\@\$(mkinstalldirs) $directory\n" - . "\t\@: > $dirstamp\n"); - } - - return $dirstamp; -} - -# &require_build_directory_maybe ($FILE) -# -------------------------------------- -# If $FILE lies in a subdirectory, emit a rule to create this -# directory and return the file that $FILE should be made -# dependent upon. Otherwise, just return the empty string. -sub require_build_directory_maybe ($) -{ - my $file = shift; - my $directory = dirname ($file); - - if ($directory ne '.') - { - return require_build_directory ($directory); - } - else - { - return ''; - } -} - -################################################################ - -# Push a list of files onto dist_common. -sub push_dist_common -{ - prog_error "push_dist_common run after handle_dist" - if $handle_dist_run; - macro_define ('DIST_COMMON', VAR_AUTOMAKE, '+', '', "@_", ''); -} - - -# Set strictness. -sub set_strictness -{ - $strictness_name = $_[0]; - - # FIXME: 'portability' warnings are currently disabled by default. - # Eventually we want to turn them on in GNU and GNITS modes, but - # we don't do this yet in Automake 1.7 to help the 1.6/1.7 transition. - # - # Indeed there would be only two ways to get rid of these new warnings: - # 1. adjusting Makefile.am - # This is not always easy (or wanted). Consider %-rules or - # $(function args) variables. - # 2. using -Wno-portability - # This means there is no way to have the same Makefile.am - # working both with Automake 1.6 and 1.7 (since 1.6 does not - # understand -Wno-portability). - # - # In Automake 1.8 (or whatever it is called) we can turn these - # warnings on, since -Wno-portability will not be an issue for - # the 1.7/1.8 transition. - if ($strictness_name eq 'gnu') - { - $strictness = GNU; - setup_channel 'error-gnu', silent => 0; - setup_channel 'error-gnu/warn', silent => 0, type => 'error'; - setup_channel 'error-gnits', silent => 1; - # setup_channel 'portability', silent => 0; - setup_channel 'gnu', silent => 0; - } - elsif ($strictness_name eq 'gnits') - { - $strictness = GNITS; - setup_channel 'error-gnu', silent => 0; - setup_channel 'error-gnu/warn', silent => 0, type => 'error'; - setup_channel 'error-gnits', silent => 0; - # setup_channel 'portability', silent => 0; - setup_channel 'gnu', silent => 0; - } - elsif ($strictness_name eq 'foreign') - { - $strictness = FOREIGN; - setup_channel 'error-gnu', silent => 1; - setup_channel 'error-gnu/warn', silent => 0, type => 'warning'; - setup_channel 'error-gnits', silent => 1; - # setup_channel 'portability', silent => 1; - setup_channel 'gnu', silent => 1; - } - else - { - prog_error "level `$strictness_name' not recognized\n"; - } -} - - -################################################################ - -# Glob something. Do this to avoid indentation screwups everywhere we -# want to glob. Gross! -sub my_glob -{ - my ($pat) = @_; - return <${pat}>; -} - -################################################################ - -# INTEGER -# require_variables ($WHERE, $REASON, $COND, @VARIABLES) -# ------------------------------------------------------ -# Make sure that each supplied variable is defined in $COND. -# Otherwise, issue a warning. If we know which macro can -# define this variable, hint the user. -# Return the number of undefined variables. -sub require_variables ($$$@) -{ - my ($where, $reason, $cond, @vars) = @_; - my $res = 0; - $reason .= ' but ' unless $reason eq ''; - - VARIABLE: - foreach my $var (@vars) - { - # Nothing to do if the variable exists. The $configure_vars test - # needed for strange variables like AMDEPBACKSLASH or ANSI2KNR - # that are AC_SUBST'ed but never macro_define'd. - next VARIABLE - if ((exists $var_value{$var} && exists $var_value{$var}{$cond}) - || exists $configure_vars{$var}); - - my @undef_cond = variable_not_always_defined_in_cond $var, $cond; - next VARIABLE - unless @undef_cond; - - my $text = "$reason`$var' is undefined\n"; - if (@undef_cond && $undef_cond[0] ne 'TRUE') - { - $text .= ("in the following conditions:\n " - . join ("\n ", @undef_cond)); - } - - ++$res; - - if (exists $am_macro_for_var{$var}) - { - $text .= "\nThe usual way to define `$var' is to add " - . "`$am_macro_for_var{$var}'\nto `$configure_ac' and run " - . "`aclocal' and `autoconf' again."; - } - elsif (exists $ac_macro_for_var{$var}) - { - $text .= "\nThe usual way to define `$var' is to add " - . "`$ac_macro_for_var{$var}'\nto `$configure_ac' and run " - . "`autoconf' again."; - } - - err $where, $text, uniq_scope => US_GLOBAL; - } - return $res; -} - -# INTEGER -# require_variables_for_macro ($MACRO, $REASON, @VARIABLES) -# --------------------------------------------------------- -# Same as require_variables, but take a macro mame as first argument. -sub require_variables_for_macro ($$@) -{ - my ($macro, $reason, @args) = @_; - for my $cond (keys %{$var_value{$macro}}) - { - return require_variables ($var_location{$macro}{$cond}, $reason, - $cond, @args); - } -} - -# Print usage information. -sub usage () -{ - print "Usage: $0 [OPTION] ... [Makefile]... - -Generate Makefile.in for configure from Makefile.am. - -Operation modes: - --help print this help, then exit - --version print version number, then exit - -v, --verbose verbosely list files processed - --no-force only update Makefile.in's that are out of date - -W, --warnings=CATEGORY report the warnings falling in CATEGORY - -Dependency tracking: - -i, --ignore-deps disable dependency tracking code - --include-deps enable dependency tracking code - -Flavors: - --cygnus assume program is part of Cygnus-style tree - --foreign set strictness to foreign - --gnits set strictness to gnits - --gnu set strictness to gnu - -Library files: - -a, --add-missing add missing standard files to package - --libdir=DIR directory storing library files - -c, --copy with -a, copy missing files (default is symlink) - -f, --force-missing force update of standard files - -Warning categories include: - `gnu' GNU coding standards (default in gnu and gnits modes) - `obsolete' obsolete features or constructions - `portability' portability issues - `syntax' dubious syntactic constructs (default) - `unsupported' unsupported or incomplete features (default) - `all' all the warnings - `no-CATEGORY' turn off warnings in CATEGORY - `none' turn off all the warnings - `error' treat warnings as errors -"; - - my ($last, @lcomm); - $last = ''; - foreach my $iter (sort ((@common_files, @common_sometimes))) - { - push (@lcomm, $iter) unless $iter eq $last; - $last = $iter; - } - - my @four; - print "\nFiles which are automatically distributed, if found:\n"; - format USAGE_FORMAT = - @<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<< - $four[0], $four[1], $four[2], $four[3] -. - $~ = "USAGE_FORMAT"; - - my $cols = 4; - my $rows = int(@lcomm / $cols); - my $rest = @lcomm % $cols; - - if ($rest) - { - $rows++; - } - else - { - $rest = $cols; - } - - for (my $y = 0; $y < $rows; $y++) - { - @four = ("", "", "", ""); - for (my $x = 0; $x < $cols; $x++) - { - last if $y + 1 == $rows && $x == $rest; - - my $idx = (($x > $rest) - ? ($rows * $rest + ($rows - 1) * ($x - $rest)) - : ($rows * $x)); - - $idx += $y; - $four[$x] = $lcomm[$idx]; - } - write; - } - - print "\nReport bugs to .\n"; - - # --help always returns 0 per GNU standards. - exit 0; -} - - -# &version () -# ----------- -# Print version information -sub version () -{ - print <. - -Copyright 2002 Free Software Foundation, Inc. -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -EOF - # --version always returns 0 per GNU standards. - exit 0; -} - -### Setup "GNU" style for perl-mode and cperl-mode. -## Local Variables: -## perl-indent-level: 2 -## perl-continued-statement-offset: 2 -## perl-continued-brace-offset: 0 -## perl-brace-offset: 0 -## perl-brace-imaginary-offset: 0 -## perl-label-offset: -2 -## cperl-indent-level: 2 -## cperl-brace-offset: 0 -## cperl-continued-brace-offset: 0 -## cperl-label-offset: -2 -## cperl-extra-newline-before-brace: t -## cperl-merge-trailing-else: nil -## cperl-continued-statement-offset: 2 -## End: diff --git a/bin/autoopts-config b/bin/autoopts-config deleted file mode 100644 index a5b0ff70..00000000 --- a/bin/autoopts-config +++ /dev/null @@ -1,104 +0,0 @@ -#!/bin/sh -## --------------------------------------------------------------------- -## autoopts-config.in -- Tell a client where to find installed autoopts -## -## Autoopts copyright 1992-2002 Bruce Korb -## -## Time-stamp: "2002-09-14 11:28:43 bkorb" -## Author: Bruce Korb -## Maintainer: Bruce Korb -## Created: Mon Jun 30 15:35:12 1997 -## by: bkorb -## --------------------------------------------------------------------- -## $Id: autoopts-config.in,v 2.14 2002/09/14 18:36:27 bkorb Exp $ -## --------------------------------------------------------------------- -## Code: - -# Configured values: -# - prefix=/usr - datadir=${prefix}/share - includedir=${prefix}/include -exec_prefix=${prefix} - bindir=${exec_prefix}/bin - libdir=${exec_prefix}/lib - exeext=.exe - package=autogen - version=18:4:9 - -# Derived values: -# - tag=libopts-`echo ${version} | sed 's,:,.,g'` - autogen="${bindir}/autogen${exeext}" - ldflags="-L${libdir} -lopts" - libs="${ldflags}" - pkgdatadir="${datadir}/${package}" - libsrc="${pkgdatadir}/${tag}.tar.gz" -static_libs="${libdir}/libopts.a" - everything="NOT FOR DISPLAY" - -[ "${includedir}" = "/usr/include" ] && cflags="" || cflags="-I${includedir}" - -# Displayable values: -# -optlist="autogen bindir cflags exec_prefix ldflags libs libsrc package - pkgdatadir prefix static_libs version everything" - -for o in $optlist -do eval echo_${o}=false ; done - -usage() -{ - cat <> [ ... ] -Options may be one or more of: -EOF - for o in $optlist - do - echo " ${o}" - done | sed 's,_,-,g' - echo '"everything" will print out the list of names and values.' - exit $1 -} - -if test $# -eq 0; then - usage 1 1>&2 -fi - -# Figure out what's wanted -# -while test $# -gt 0; do - o=`echo $1 | sed 's,^-*,,;s/-/_/g'` - - case $o in - everything | \ - \*) for o in $optlist - do eval echo_${o}=true - done ;; - - help | h | \? ) usage 0 ;; - - *) eval "f=\$echo_${o}" || usage 1 2>&1 - [ -n "$f" ] || usage 1 2>&1 - eval echo_${o}=true || usage 1 2>&1 - ;; - esac - shift -done - -if ${echo_everything} -then - echo_everything=false - for o in $optlist - do if eval \${echo_${o}} - then eval printf \""%-12s --> %s\\n"\" ${o} \"\${${o}}\" ; fi - done -else - for o in $optlist - do if eval \${echo_${o}} - then eval echo \${${o}} ; fi - done -fi - -exit 0 -## end autoopts-config.in diff --git a/bin/autoreconf b/bin/autoreconf deleted file mode 100644 index 767ba7fc..00000000 --- a/bin/autoreconf +++ /dev/null @@ -1,616 +0,0 @@ -#! /bin/perl -w -# -*- perl -*- -# @configure_input@ - -eval 'case $# in 0) exec /bin/perl -S "$0";; *) exec /bin/perl -S "$0" "$@";; esac' - if 0; - -# autoreconf - install the GNU Build System in a directory tree -# Copyright (C) 1994, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# Written by David J. MacKenzie. -# Extended and rewritten in Perl by Akim Demaille. - -BEGIN -{ - my $perllibdir = $ENV{'autom4te_perllibdir'} || '/usr/share/autoconf'; - unshift @INC, "$perllibdir"; -} - -use Autom4te::General; -use Autom4te::XFile; -# Do not use Cwd::chdir, since it might hang. -use Cwd 'cwd'; -use strict; - -## ----------- ## -## Variables. ## -## ----------- ## - -# $HELP -# ----- -$help = "Usage: $0 [OPTION] ... [CONFIGURE-AC or DIRECTORY] ... - -Run `autoconf' (and `autoheader', `aclocal', `automake', `autopoint' -(formerly `gettextize'), and `libtoolize' where appropriate) -repeatedly to remake the GNU Build System files in the DIRECTORIES or -the directory trees driven by CONFIGURE-AC (defaulting to `.'). - -By default, it only remakes those files that are older than their -predecessors. If you install new versions of the GNU Build System, -running `autoreconf' remakes all of the files by giving it the -`--force' option. - -Operation modes: - -h, --help print this help, then exit - -V, --version print version number, then exit - -v, --verbose verbosely report processing - -d, --debug don't remove temporary files - -f, --force consider all files obsolete - -i, --install copy missing auxiliary files - -s, --symlink with -i, install symbolic links instead of copies - -m, --make when applicable, re-run ./configure && make - -W, --warnings=CATEGORY report the warnings falling in CATEGORY [syntax] - -Warning categories include: - \`cross\' cross compilation issues - \`obsolete\' obsolete constructs - \`portability\' portability issues - \`syntax\' dubious syntactic constructs - \`all\' all the warnings - \`no-CATEGORY\' turn off the warnings on CATEGORY - \`none\' turn off all the warnings - \`error\' warnings are error - -The environment variable \`WARNINGS\' is honored. Some subtools might -support other warning types, using \`all' is encouraged. - -Library directories: - -B, --prepend-include=DIR prepend directory DIR to search path - -I, --include=DIR append directory DIR to search path - -The environment variables AUTOCONF, AUTOHEADER, AUTOMAKE, ACLOCAL, -AUTOPOINT, LIBTOOLIZE are honored. - -Report bugs to . -"; - -# $VERSION -# -------- -$version = "autoreconf (GNU Autoconf) 2.56 -Written by David J. MacKenzie and Akim Demaille. - -Copyright 2002 Free Software Foundation, Inc. -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -"; - -# Lib files. -my $autoconf = $ENV{'AUTOCONF'} || '/usr/bin/autoconf'; -my $autoheader = $ENV{'AUTOHEADER'} || '/usr/bin/autoheader'; -my $automake = $ENV{'AUTOMAKE'} || 'automake'; -my $aclocal = $ENV{'ACLOCAL'} || 'aclocal'; -my $libtoolize = $ENV{'LIBTOOLIZE'} || 'libtoolize'; -my $autopoint = $ENV{'AUTOPOINT'} || 'autopoint'; - -# --install -- as --add-missing in other tools. -my $install = 0; -# symlink -- when --install, use symlinks instead. -my $symlink = 0; - -my @prepend_include; -my @include; - -# List of warnings. -my @warning; - -# Rerun `./configure && make'? -my $make = 0; - -## ---------- ## -## Routines. ## -## ---------- ## - - -# parse_args () -# ------------- -# Process any command line arguments. -sub parse_args () -{ - my $srcdir; - - getopt ("W|warnings=s" => \@warning, - 'I|include=s' => \@include, - 'B|prepend-include=s' => \@prepend_include, - 'i|install' => \$install, - 's|symlink' => \$symlink, - 'm|make' => \$make); - - # Split the warnings as a list of elements instead of a list of - # lists. - @warning = map { split /,/ } @warning; - - # Even if the user specified a configure.ac, trim to get the - # directory, and look for configure.ac again. Because (i) the code - # is simpler, and (ii) we are still able to diagnose simultaneous - # presence of configure.ac and configure.in. - @ARGV = map { /configure\.(ac|in)$/ ? dirname ($_) : $_ } @ARGV; - push @ARGV, '.' unless @ARGV; - - if ($verbose && $debug) - { - for my $prog ($autoconf, $autoheader, - $automake, $aclocal, - $autopoint, - $libtoolize) - { - xsystem ("$prog --version | sed 1q >&2"); - print STDERR "\n"; - } - } - - # Dispatch autoreconf's option to the tools. - # --include; - $autoconf .= join (' --include=', '', @include); - $autoconf .= join (' --prepend-include=', '', @prepend_include); - $autoheader .= join (' --include=', '', @include); - $autoheader .= join (' --prepend-include=', '', @prepend_include); - - # --install and --symlink; - if ($install) - { - $automake .= ' --add-missing'; - $automake .= ' --copy' unless $symlink; - $libtoolize .= ' --copy' unless $symlink; - } - # --force; - if ($force) - { - $autoconf .= ' --force'; - $autoheader .= ' --force'; - $automake .= ' --force-missing'; - $autopoint .= ' --force'; - $libtoolize .= ' --force'; - } - else - { - $automake .= ' --no-force'; - } - # --debug; - if ($debug) - { - $autoconf .= ' --verbose --debug'; - $autoheader .= ' --verbose --debug'; - $automake .= ' --verbose'; - $aclocal .= ' --verbose'; - $libtoolize .= ' --debug'; - } - # --warnings; - if (@warning) - { - $autoconf .= ' --warnings=' . join (',', @warning); - $autoheader .= ' --warnings=' . join (',', @warning); - $automake .= ' --warnings=' . join (',', @warning) - if `$automake --help` =~ /--warnings/; - } -} - - -# &autoreconf_current_directory -# ----------------------------- -sub autoreconf_current_directory () -{ - my $configure_ac = find_configure_ac; - error "cannot find `configure.ac'" - unless $configure_ac; - - # ---------------------- # - # Is it using Autoconf? # - # ---------------------- # - - my $uses_autoconf; - my $uses_gettext; - my $configure_ac_file = new Autom4te::XFile $configure_ac; - while ($_ = $configure_ac_file->getline) - { - s/#.*//; - s/dnl.*//; - $uses_autoconf = 1 if /AC_INIT/; - # See below for why we look for gettext here. - $uses_gettext = 1 if /^AM_GNU_GETTEXT_VERSION/; - } - - if (!$uses_autoconf) - { - verbose "$configure_ac: not using Autoconf"; - return; - } - - - # ------------------- # - # Running autopoint. # - # ------------------- # - - # Gettext is a bit of a problem: its macros are not necessarily - # visible to aclocal, so if we start with a completely striped down - # package (think of a fresh CVS checkout), running `aclocal' first - # will fail: the Gettext macros are missing. - # - # Therefore, we can't use the traces to decide if we use Gettext or - # not. I guess that once Gettext move to 2.5x we will be able to, - # but in the meanwhile forget it. - # - # We can only grep for AM_GNU_GETTEXT_VERSION in configure.ac. You - # might think this approach is naive, and indeed it is, as it - # prevents one to embed AM_GNU_GETTEXT_VERSION in another *.m4, but - # anyway we don't limit the generality, since... that's what - # autopoint does. Actually, it is even more restrictive, as it - # greps for `^AM_GNU_GETTEXT_VERSION('. We did this above, while - # scanning configure.ac. - if (!$uses_gettext) - { - verbose "$configure_ac: not using Gettext"; - } - elsif (!$install) - { - verbose "$configure_ac: not running autopoint: --install not given"; - } - else - { - xsystem "$autopoint"; - } - - - # ----------------- # - # Running aclocal. # - # ----------------- # - - # Run it first: it might discover new macros to add, e.g., - # AC_PROG_LIBTOOL, which we will trace later to see if Libtool is - # used. - # - # Always run it. Tracking its sources for up-to-dateness is too - # complex and too error prone. The best we can do is avoiding - # nuking the time stamp. - my $uses_aclocal = 1; - - # Nevertheless, if aclocal.m4 exists and is not made by aclocal, - # don't run aclocal. - - if (-f 'aclocal.m4') - { - my $aclocal_m4 = new Autom4te::XFile 'aclocal.m4'; - $_ = $aclocal_m4->getline; - $uses_aclocal = 0 - unless /generated.*by aclocal/; - } - - # If there are flags for aclocal in Makefile.am, use them. - my $aclocal_flags = ''; - if ($uses_aclocal && -f 'Makefile.am') - { - my $makefile = new Autom4te::XFile 'Makefile.am'; - while ($_ = $makefile->getline) - { - if (/^ACLOCAL_[A-Z_]*FLAGS\s*=\s*(.*)/) - { - $aclocal_flags = $1; - last; - } - } - } - - if (!$uses_aclocal) - { - verbose "$configure_ac: not using aclocal"; - } - else - { - # Some filesystems have sub-second time stamps, and if so we may - # run into trouble later, after we rerun autoconf and set the - # time stamps of input files to be no greater than aclocal.m4, - # because the time-stamp-setting operation (utime) has a - # resolution of only 1 second. Work around the problem by - # ensuring that there is at least a one-second window before the - # time stamp of aclocal.m4t in which no file time stamps can - # fall. - sleep 1; - - xsystem ("$aclocal $aclocal_flags --output=aclocal.m4t"); - # aclocal may produce no output. - update_file ('aclocal.m4t', 'aclocal.m4') - if -f 'aclocal.m4t'; - } - - # We might have to rerun aclocal if Libtool (or others) imports new - # macros. - my $rerun_aclocal = 0; - - - - # ------------------------------- # - # See what tools will be needed. # - # ------------------------------- # - - # Perform a single trace reading to avoid --force forcing a rerun - # between two --trace, that's useless. If there is no AC_INIT, then - # we are not interested: it looks like a Cygnus thingy. - my $uses_gettext_via_traces; - my $uses_libtool; - my $uses_autoheader; - my @subdir; - verbose "$configure_ac: tracing"; - my $traces = new Autom4te::XFile - ("$autoconf" - . join (' --trace=', '', - # If you change this list, update the - # `Autoreconf-preselections' section of autom4te.in. - 'AC_CONFIG_HEADERS', - 'AC_CONFIG_SUBDIRS:AC_CONFIG_SUBDIRS:\$1', - 'AC_INIT', - 'AC_PROG_LIBTOOL', - 'AM_GNU_GETTEXT', - ) - . ' |'); - while ($_ = $traces->getline) - { - $uses_autoconf = 1 if /AC_INIT/; - $uses_gettext_via_traces = 1 if /AM_GNU_GETTEXT/; - $uses_libtool = 1 if /AC_PROG_LIBTOOL/; - $uses_autoheader = 1 if /AC_CONFIG_HEADERS/; - push @subdir, split (' ', $1) if /AC_CONFIG_SUBDIRS:(.*)/; - } - - # The subdirs are *optional*, they may not exist. - foreach (@subdir) - { - if (-d) - { - verbose "$configure_ac: subdirectory $_ to autoreconf"; - autoreconf ($_); - } - else - { - verbose "$configure_ac: subdirectory $_ not present"; - } - } - - # Gettext consistency checks... - error "$configure_ac: AM_GNU_GETTEXT is used, but not AM_GNU_GETTEXT_VERSION" - if $uses_gettext_via_traces && ! $uses_gettext; - error "$configure_ac: AM_GNU_GETTEXT_VERSION is used, but not AM_GNU_GETTEXT" - if $uses_gettext && ! $uses_gettext_via_traces; - - - # -------------------- # - # Running libtoolize. # - # -------------------- # - - if (!$uses_libtool) - { - verbose "$configure_ac: not using Libtool"; - } - elsif ($install) - { - xsystem ($libtoolize); - $rerun_aclocal = 1; - } - else - { - verbose "$configure_ac: not running libtoolize: --install not given"; - } - - - - # ------------------- # - # Rerunning aclocal. # - # ------------------- # - - # If we re-installed Libtool or Gettext, the macros might have changed. - # Automake also needs an up-to-date aclocal.m4. - if ($rerun_aclocal) - { - if (!$uses_aclocal) - { - verbose "$configure_ac: not using aclocal"; - } - else - { - xsystem ("$aclocal $aclocal_flags --output=aclocal.m4t"); - # aclocal may produce no output. - if (-f 'aclocal.m4t') - { - update_file ('aclocal.m4t', 'aclocal.m4'); - # Make sure that the local m4 files are older than - # aclocal.m4. - # - # Why is not always the case? Because we already run - # aclocal at first (before tracing), which, for instance, - # can find Gettext's macros in .../share/aclocal, so we - # may have had the right aclocal.m4 already. Then - # autopoint is run, and installs locally these M4 - # files. Then autoreconf, via update_file, sees it is - # the _same_ aclocal.m4, and doesn't change its - # timestamp. But later, Automake's Makefile expresses - # that aclocal.m4 depends on these local files, which - # are newer, so it triggers aclocal again. - # - # To make sure aclocal.m4 is no older, we change the - # modification times of the local M4 files to be - # not newer than it. - # - # First, where are the local files? - my $aclocal_local_dir = '.'; - if ($aclocal_flags =~ /-I\s+(\S+)/) - { - $aclocal_local_dir = $1; - } - # All the local files newer than aclocal.m4 are to be - # made not newer than it. - my $aclocal_m4_mtime = mtime ('aclocal.m4'); - for my $file (glob ("$aclocal_local_dir/*.m4"), 'acinclude.m4') - { - if ($aclocal_m4_mtime < mtime ($file)) - { - debug "aging $file to be not newer than aclocal.m4"; - utime $aclocal_m4_mtime, $aclocal_m4_mtime, $file; - } - } - } - } - } - - - # ------------------ # - # Running autoconf. # - # ------------------ # - - # Don't try to be smarter than `autoconf', which does its own up to - # date checks. - # - # We prefer running autoconf before autoheader, because (i) the - # latter runs the former, and (ii) autoconf is stricter than - # autoheader. So all in all, autoconf should give better error - # messages. - xsystem ($autoconf); - - - # -------------------- # - # Running autoheader. # - # -------------------- # - - # We now consider that if AC_CONFIG_HEADERS is used, then autoheader - # is used too. - # - # Just as for autoconf, up to date ness is performed by the tool - # itself. - # - # Run it before automake, since the latter checks the presence of - # config.h.in when it sees an AC_CONFIG_HEADERS. - if (!$uses_autoheader) - { - verbose "$configure_ac: not using Autoheader"; - } - else - { - xsystem ($autoheader); - } - - - # ------------------ # - # Running automake. # - # ------------------ # - - # Assumes that there is a Makefile.am in the topmost directory. - if (!-f 'Makefile.am') - { - verbose "$configure_ac: not using Automake"; - } - else - { - # We should always run automake, and let it decide whether it shall - # update the file or not. In fact, the effect of `$force' is already - # included in `$automake' via `--no-force'. - xsystem ($automake); - } - - - # -------------- # - # Running make. # - # -------------- # - - if ($make) - { - if (!-f "config.status") - { - verbose "no config.status: cannot re-make"; - } - else - { - xsystem ("./config.status --recheck"); - xsystem ("./config.status"); - if (!-f "Makefile") - { - verbose "no Makefile: cannot re-make"; - } - else - { - xsystem ("make"); - } - } - } -} - - -# &autoreconf ($DIRECTORY) -# ------------------------ -# Reconf the $DIRECTORY. -sub autoreconf ($) -{ - my ($directory) = @_; - my $cwd = cwd; - - # The format for this message is not free: taken from Emacs, itself - # using GNU Make's format. - verbose "Entering directory `$directory'"; - chdir $directory - or error "cannot chdir to $directory: $!"; - - autoreconf_current_directory; - - # The format is not free: taken from Emacs, itself using GNU Make's - # format. - verbose "Leaving directory `$directory'"; - chdir $cwd - or error "cannot chdir to $cwd: $!"; -} - - -## ------ ## -## Main. ## -## ------ ## - -# When debugging, it is convenient that all the related temporary -# files be at the same place. -mktmpdir ('ar'); -$ENV{'TMPDIR'} = $tmp; -parse_args; - -# Autoreconf all the given configure.ac. A while loop, not a for, -# since the list can change at runtime because of AC_CONFIG_SUBDIRS. -for my $directory (@ARGV) - { - autoreconf ($directory); - } - -### Setup "GNU" style for perl-mode and cperl-mode. -## Local Variables: -## perl-indent-level: 2 -## perl-continued-statement-offset: 2 -## perl-continued-brace-offset: 0 -## perl-brace-offset: 0 -## perl-brace-imaginary-offset: 0 -## perl-label-offset: -2 -## cperl-indent-level: 2 -## cperl-brace-offset: 0 -## cperl-continued-brace-offset: 0 -## cperl-label-offset: -2 -## cperl-extra-newline-before-brace: t -## cperl-merge-trailing-else: nil -## cperl-continued-statement-offset: 2 -## End: diff --git a/bin/autoscan b/bin/autoscan deleted file mode 100644 index 8a8da7c4..00000000 --- a/bin/autoscan +++ /dev/null @@ -1,645 +0,0 @@ -#! /bin/perl -w -# -*- perl -*- -# autoscan - Create configure.scan (a preliminary configure.ac) for a package. -# Copyright (C) 1994, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# Written by David MacKenzie . - -eval 'case $# in 0) exec /bin/perl -S "$0";; *) exec /bin/perl -S "$0" "$@";; esac' - if 0; - -BEGIN -{ - my $perllibdir = $ENV{'autom4te_perllibdir'} || "/usr/share/autoconf"; - unshift @INC, "$perllibdir"; -} - -use Autom4te::General; -use Autom4te::XFile; -use File::Basename; -use File::Find; -use strict; - -use vars qw(@cfiles @makefiles @shfiles %printed); - -# The kind of the words we are looking for. -my @kinds = qw (function header identifier program - makevar librarie); - -# For each kind, the default macro. -my %generic_macro = - ( - 'function' => 'AC_CHECK_FUNCS', - 'header' => 'AC_CHECK_HEADERS', - 'identifier' => 'AC_CHECK_TYPES', - 'program' => 'AC_CHECK_PROGS', - 'library' => 'AC_CHECK_LIB' - ); - -my %kind_comment = - ( - 'function' => 'Checks for library functions.', - 'header' => 'Checks for header files.', - 'identifier' => 'Checks for typedefs, structures, and compiler characteristics.', - 'program' => 'Checks for programs.', - ); - -# $USED{KIND}{ITEM} is the list of locations where the ITEM (of KIND) was used -# in the user package. -# For instance $USED{function}{alloca} is the list of `file:line' where -# `alloca (...)' appears. -my %used = (); - -# $MACRO{KIND}{ITEM} is the list of macros to use to test ITEM. -# Initialized from lib/autoscan/*. E.g., $MACRO{function}{alloca} contains -# the singleton AC_FUNC_ALLOCA. Some require several checks. -my %macro = (); - -# $NEEDED_MACROS{MACRO} is an array of locations requiring MACRO. -# E.g., $NEEDED_MACROS{AC_FUNC_ALLOC} the list of `file:line' containing -# `alloca (...)'. -my %needed_macros = - ( - 'AC_PREREQ' => [$me], - ); - -my $configure_scan = 'configure.scan'; -my $log = new Autom4te::XFile ">$me.log"; - -# Autoconf and lib files. -my $autom4te = $ENV{'AUTOM4TE'} || '/usr/bin/autom4te'; -my $autoconf = "$autom4te --language=autoconf"; -my @prepend_include; -my @include = ('/usr/share/autoconf'); - -# $help -# ----- -$help = "Usage: $0 [OPTION] ... [SRCDIR] - -Examine source files in the directory tree rooted at SRCDIR, or the -current directory if none is given. Search the source files for -common portability problems, check for incompleteness of -`configure.ac', and create a file `$configure_scan' which is a -preliminary `configure.ac' for that package. - - -h, --help print this help, then exit - -V, --version print version number, then exit - -v, --verbose verbosely report processing - -d, --debug don't remove temporary files - -Library directories: - -B, --prepend-include=DIR prepend directory DIR to search path - -I, --include=DIR append directory DIR to search path - -Report bugs to .\n"; - -# $version -# -------- -$version = "autoscan (GNU Autoconf) 2.56 -Written by David J. MacKenzie and Akim Demaille. - -Copyright 2002 Free Software Foundation, Inc. -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"; - - - - -## ------------------------ ## -## Command line interface. ## -## ------------------------ ## - -# parse_args () -# ------------- -# Process any command line arguments. -sub parse_args () -{ - getopt ('I|include=s' => \@include, - 'B|prepend-include=s' => \@prepend_include); - - die "$me: too many arguments -Try `$me --help' for more information.\n" - if @ARGV > 1; - - my $srcdir = $ARGV[0] || "."; - - verbose "srcdir = $srcdir"; - chdir $srcdir || error "cannot cd to $srcdir: $!"; -} - - -# init_tables () -# -------------- -# Put values in the tables of what to do with each token. -sub init_tables () -{ - # The data file format supports only one line of macros per function. - # If more than that is required for a common portability problem, - # a new Autoconf macro should probably be written for that case, - # instead of duplicating the code in lots of configure.ac files. - my $file = find_file ("autoscan/autoscan.list", - reverse (@prepend_include), @include); - my $table = new Autom4te::XFile $file; - my $tables_are_consistent = 1; - - while ($_ = $table->getline) - { - # Ignore blank lines and comments. - next - if /^\s*$/ || /^\s*\#/; - - # ': ' or... - # ': warn: '. - if (/^(\S+):\s+(\S+)\s+(\S.*)$/) - { - my ($kind, $word, $macro) = ($1, $2, $3); - error "$file:$.: invalid kind: $_" - unless grep { $_ eq $kind } @kinds; - push @{$macro{$kind}{$word}}, $macro; - } - else - { - error "$file:$.: invalid definition: $_"; - } - } - - if ($debug) - { - foreach my $kind (@kinds) - { - foreach my $word (sort keys %{$macro{$kind}}) - { - print "$kind: $word: @{$macro{$kind}{$word}}\n"; - } - } - - } -} - - -# used ($KIND, $WORD, [$WHERE]) -# ----------------------------- -# $WORD is used as a $KIND. -sub used ($$;$) -{ - my ($kind, $word, $where) = @_; - $where ||= "$File::Find::name:$."; - if ( - # Check for all the libraries. But `-links' is certainly a - # `find' argument, and `-le', a `test' argument. - ($kind eq 'library' && $word !~ /^(e|inks)$/) - # Other than libraries are to be checked only if listed in - # the Autoscan library files. - || defined $macro{$kind}{$word} - ) - { - push (@{$used{$kind}{$word}}, $where); - } -} - - - -## ----------------------- ## -## Scanning source files. ## -## ----------------------- ## - - -# scan_c_file ($FILENAME) -# ----------------------- -sub scan_c_file ($) -{ - my ($filename) = @_; - push @cfiles, $File::Find::name; - - # Nonzero if in a multiline comment. - my $in_comment = 0; - - my $file = new Autom4te::XFile "<$filename"; - - while ($_ = $file->getline) - { - # Strip out comments. - if ($in_comment && s,^.*?\*/,,) - { - $in_comment = 0; - } - # The whole line is inside a commment. - next if $in_comment; - # All on one line. - s,/\*.*?\*/,,g; - - # Starting on this line. - if (s,/\*.*$,,) - { - $in_comment = 1; - } - - # Preprocessor directives. - if (s/^\s*\#\s*//) - { - if (/^include\s*<([^>]*)>/) - { - used ('header', $1); - } - if (s/^(if|ifdef|ifndef|elif)\s+//) - { - foreach my $word (split (/\W+/)) - { - used ('identifier', $word) - unless $word eq 'defined' || $word !~ /^[a-zA-Z_]/; - } - } - # Ignore other preprocessor directives. - next; - } - - # Remove string and character constants. - s,\"[^\"]*\",,g; - s,\'[^\']*\',,g; - - # Tokens in the code. - # Maybe we should ignore function definitions (in column 0)? - while (s/\b([a-zA-Z_]\w*)\s*\(/ /) - { - used ('function', $1); - } - while (s/\b([a-zA-Z_]\w*)\b/ /) - { - used ('identifier', $1); - } - } - - $file->close; -} - - -# scan_makefile($MAKEFILE-NAME) -# ----------------------------- -sub scan_makefile ($) -{ - my ($filename) = @_; - push @makefiles, $File::Find::name; - - my $file = new Autom4te::XFile "<$filename"; - - while ($_ = $file->getline) - { - # Strip out comments. - s/#.*//; - - # Variable assignments. - while (s/\b([a-zA-Z_]\w*)\s*=/ /) - { - used ('makevar', $1); - } - # Be sure to catch a whole word. For instance `lex$U.$(OBJEXT)' - # is a single token. Otherwise we might believe `lex' is needed. - foreach my $word (split (/\s+/)) - { - # Libraries. - if ($word =~ /^-l([a-zA-Z_]\w*)$/) - { - used ('library', $1); - } - # Tokens in the code. - # We allow some additional characters, e.g., `+', since - # autoscan/programs includes `c++'. - if ($word =~ /^[a-zA-Z_][\w+]*$/) - { - used ('program', $word); - } - } - } - - $file->close; -} - - -# scan_sh_file($SHELL-SCRIPT-NAME) -# -------------------------------- -sub scan_sh_file ($) -{ - my ($filename) = @_; - push @shfiles, $File::Find::name; - - my $file = new Autom4te::XFile "<$filename"; - - while ($_ = $file->getline) - { - # Strip out comments and variable references. - s/#.*//; - s/\${[^\}]*}//g; - s/@[^@]*@//g; - - # Tokens in the code. - while (s/\b([a-zA-Z_]\w*)\b/ /) - { - used ('program', $1); - } - } - - $file->close; -} - - -# scan_file () -# ------------ -# Called by &find on each file. $_ contains the current filename with -# the current directory of the walk through. -sub scan_file () -{ - # Wanted only if there is no corresponding FILE.in. - return - if -f "$_.in"; - - # Save $_ as Find::File requires it to be preserved. - local $_ = $_; - - # Strip a useless leading `./'. - $File::Find::name =~ s,^\./,,; - - if (/\.[chlym](\.in)?$/) - { - used 'program', 'cc', $File::Find::name; - scan_c_file ($_); - } - elsif (/\.(cc|cpp|cxx|CC|C|hh|hpp|hxx|HH|H|yy|ypp|ll|lpp)(\.in)?$/) - { - used 'program', 'c++', $File::Find::name; - scan_c_file ($_); - } - elsif ((/^((?:GNUm|M|m)akefile)(\.in)?$/ && ! -f "$1.am") - || /^(?:GNUm|M|m)akefile(\.am)?$/) - { - scan_makefile ($_); - } - elsif (/\.sh(\.in)?$/) - { - scan_sh_file ($_); - } -} - - -# scan_files () -# ------------- -# Read through the files and collect lists of tokens in them -# that might create nonportabilities. -sub scan_files () -{ - find (\&scan_file, '.'); - - if ($verbose) - { - print "cfiles: @cfiles\n"; - print "makefiles: @makefiles\n"; - print "shfiles: @shfiles\n"; - - foreach my $kind (@kinds) - { - print "\n$kind:\n"; - foreach my $word (sort keys %{$used{$kind}}) - { - print "$word: @{$used{$kind}{$word}}\n"; - } - } - } -} - - -## ----------------------- ## -## Output configure.scan. ## -## ----------------------- ## - - -# output_kind ($FILE, $KIND) -# -------------------------- -sub output_kind ($$) -{ - my ($file, $kind) = @_; - # Lists of words to be checked with the generic macro. - my @have; - - print $file "\n# $kind_comment{$kind}\n" - if exists $kind_comment{$kind}; - foreach my $word (sort keys %{$used{$kind}}) - { - # Output the needed macro invocations in $configure_scan if not - # already printed, and remember these macros are needed. - foreach my $macro (@{$macro{$kind}{$word}}) - { - if ($macro =~ /^warn:\s+(.*)/) - { - my $message = $1; - foreach my $location (@{$used{$kind}{$word}}) - { - warn "$location: warning: $message\n"; - } - } - elsif (exists $generic_macro{$kind} - && $macro eq $generic_macro{$kind}) - { - push (@have, $word); - push (@{$needed_macros{"$generic_macro{$kind}([$word])"}}, - @{$used{$kind}{$word}}); - } - else - { - if (! $printed{$macro}) - { - print $file "$macro\n"; - $printed{$macro} = 1; - } - push (@{$needed_macros{$macro}}, - @{$used{$kind}{$word}}); - } - } - } - print $file "$generic_macro{$kind}([" . join(' ', sort(@have)) . "])\n" - if @have; -} - - -# output_libraries ($FILE) -# ------------------------ -sub output_libraries ($) -{ - my ($file) = @_; - - print $file "\n# Checks for libraries.\n"; - foreach my $word (sort keys %{$used{'library'}}) - { - print $file "# FIXME: Replace `main' with a function in `-l$word':\n"; - print $file "AC_CHECK_LIB([$word], [main])\n"; - } -} - - -# output ($CONFIGURE_SCAN) -# ------------------------ -# Print a proto configure.ac. -sub output ($) -{ - my $configure_scan = shift; - my %unique_makefiles; - - my $file = new Autom4te::XFile ">$configure_scan"; - - print $file - ("# -*- Autoconf -*-\n" . - "# Process this file with autoconf to produce a configure script.\n" . - "\n" . - "AC_PREREQ(2.56)\n" . - "AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)\n"); - if (defined $cfiles[0]) - { - print $file "AC_CONFIG_SRCDIR([$cfiles[0]])\n"; - print $file "AC_CONFIG_HEADER([config.h])\n"; - } - - output_kind ($file, 'program'); - output_kind ($file, 'makevar'); - output_libraries ($file); - output_kind ($file, 'header'); - output_kind ($file, 'identifier'); - output_kind ($file, 'function'); - - if (@makefiles) - { - # Change DIR/Makefile.in to DIR/Makefile. - foreach my $m (@makefiles) - { - $m =~ s/\.(?:in|am)$//; - $unique_makefiles{$m}++; - } - print $file ("\nAC_CONFIG_FILES([", - join ("\n ", - sort keys %unique_makefiles), "])\n"); - } - print $file "AC_OUTPUT\n"; - - $file->close; -} - - - -## --------------------------------------- ## -## Checking the accuracy of configure.ac. ## -## --------------------------------------- ## - - -# &check_configure_ac ($CONFIGURE_AC) -# ----------------------------------- -# Use autoconf to check if all the suggested macros are included -# in CONFIGURE_AC. -sub check_configure_ac ($) -{ - my ($configure_ac) = @_; - - # Find what needed macros are invoked in CONFIGURE_AC. - # I'd be very happy if someone could explain to me why sort (uniq ...) - # doesn't work properly: I need `uniq (sort ...)'. --akim - my $trace_option = - join (' --trace=', '', - uniq (sort (map { s/\(.*//; $_ } keys %needed_macros))); - - verbose "running: $autoconf $trace_option $configure_ac"; - my $traces = - new Autom4te::XFile "$autoconf $trace_option $configure_ac|"; - - while ($_ = $traces->getline) - { - chomp; - my ($file, $line, $macro, @args) = split (/:/, $_); - if ($macro =~ /^AC_CHECK_(HEADER|FUNC|TYPE|MEMBER)S$/) - { - # To be rigorous, we should distinguish between space and comma - # separated macros. But there is no point. - foreach my $word (split (/\s|,/, $args[0])) - { - # AC_CHECK_MEMBERS wants `struct' or `union'. - if ($macro eq "AC_CHECK_MEMBERS" - && $word =~ /^stat.st_/) - { - $word = "struct " . $word; - } - delete $needed_macros{"$macro([$word])"}; - } - } - else - { - delete $needed_macros{$macro}; - } - } - - $traces->close; - - # Report the missing macros. - foreach my $macro (sort keys %needed_macros) - { - warn ("$configure_ac: warning: missing $macro wanted by: " - . (${$needed_macros{$macro}}[0]) - . "\n"); - print $log "$me: warning: missing $macro wanted by: \n"; - foreach my $need (@{$needed_macros{$macro}}) - { - print $log "\t$need\n"; - } - } -} - - -## -------------- ## -## Main program. ## -## -------------- ## - -parse_args; -$autoconf .= " --debug" if $debug; -$autoconf .= " --verbose" if $verbose; -$autoconf .= join (' --include=', '', @include); -$autoconf .= join (' --prepend-include=', '', @prepend_include); - -my $configure_ac = find_configure_ac; -init_tables; -scan_files; -output ('configure.scan'); -if ($configure_ac) - { - check_configure_ac ($configure_ac); - } -# This close is really needed. For some reason, probably best named -# a bug, it seems that the dtor of $LOG is not called automatically -# at END. It results in a truncated file. -$log->close; -exit 0; - -### Setup "GNU" style for perl-mode and cperl-mode. -## Local Variables: -## perl-indent-level: 2 -## perl-continued-statement-offset: 2 -## perl-continued-brace-offset: 0 -## perl-brace-offset: 0 -## perl-brace-imaginary-offset: 0 -## perl-label-offset: -2 -## cperl-indent-level: 2 -## cperl-brace-offset: 0 -## cperl-continued-brace-offset: 0 -## cperl-label-offset: -2 -## cperl-extra-newline-before-brace: t -## cperl-merge-trailing-else: nil -## cperl-continued-statement-offset: 2 -## End: diff --git a/bin/autoupdate b/bin/autoupdate deleted file mode 100644 index c38abf94..00000000 --- a/bin/autoupdate +++ /dev/null @@ -1,1054 +0,0 @@ -#! /bin/perl -w -# -*- perl -*- -# autoupdate - modernize an Autoconf file. -# Copyright (C) 1994, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# Originally written by David MacKenzie . -# Rewritten by Akim Demaille . - -eval 'case $# in 0) exec /bin/perl -S "$0";; *) exec /bin/perl -S "$0" "$@";; esac' - if 0; - -BEGIN -{ - my $perllibdir = $ENV{'autom4te_perllibdir'} || "/usr/share/autoconf"; - unshift @INC, "$perllibdir"; -} - -use File::Basename; -use Autom4te::General; -use Autom4te::XFile; -use strict; - -# Lib files. -my $autom4te = $ENV{'AUTOM4TE'} || '/usr/bin/autom4te'; -my $autoconf = "$autom4te --language=autoconf"; -# We need to find m4sugar. -my @prepend_include; -my @include = ('/usr/share/autoconf'); -my $force = 0; -# m4. -my $m4 = $ENV{"M4"} || "/bin/m4"; - - -# $HELP -# ----- -$help = "Usage: $0 [OPTION] ... [TEMPLATE-FILE...] - -Update the TEMPLATE-FILE... if given, or `configure.ac' if present, -or else `configure.in', to the syntax of the current version of -Autoconf. The original files are backed up. - -Operation modes: - -h, --help print this help, then exit - -V, --version print version number, then exit - -v, --verbose verbosely report processing - -d, --debug don't remove temporary files - -f, --force consider all files obsolete - -Library directories: - -B, --prepend-include=DIR prepend directory DIR to search path - -I, --include=DIR append directory DIR to search path - -Report bugs to . -"; - -# $VERSION -# -------- -$version = "autoupdate (GNU Autoconf) 2.56 -Written by David J. MacKenzie and Akim Demaille. - -Copyright 2002 Free Software Foundation, Inc. -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -"; - -## ---------- ## -## Routines. ## -## ---------- ## - - -# parse_args () -# ------------- -# Process any command line arguments. -sub parse_args () -{ - my $srcdir; - - getopt ('I|include=s' => \@include, - 'B|prepend-include=s' => \@prepend_include, - 'f|force' => \$force); - - if (! @ARGV) - { - my $configure_ac = find_configure_ac; - error "no input file" - unless $configure_ac; - push @ARGV, $configure_ac; - } -} - - -# ------------- # -# M4 builtins. # -# ------------- # - -my @m4_builtins; - -# &handle_m4_symbols () -# --------------------- -# Create the following $tmp files: -# m4.m4 -- enable the m4 builtins. -# unm4.m4 -- disable the m4 builtins. -# savem4.m4 -- save the m4 builtins. -sub handle_m4_macros () -{ - # Get the list of builtins. - xsystem ("echo dumpdef | $m4 2>$tmp/m4.defs >/dev/null"); - my $m4_defs = new Autom4te::XFile "$tmp/m4.defs"; - while ($_ = $m4_defs->getline) - { - push @m4_builtins, $1 - if /^(\w+):/; - } - $m4_defs->close; - - # Output the files. - my $m4_m4 = new Autom4te::XFile ">$tmp/m4.m4"; - print $m4_m4 "# m4.m4 -- enable the m4 builtins.\n"; - my $unm4_m4 = new Autom4te::XFile ">$tmp/unm4.m4"; - print $unm4_m4 "# unm4.m4 -- disable the m4 builtins.\n"; - print $unm4_m4 "# Because Autoconf, via M4sugar, redefines some of these\n"; - print $unm4_m4 "# macros, and therefore since unac.m4 disables them,\n"; - print $unm4_m4 "# disable only if defined.\n"; - my $m4save_m4 = new Autom4te::XFile ">$tmp/m4save.m4"; - print $m4save_m4 "# savem4.m4 -- save the m4 builtins.\n"; - foreach (@m4_builtins) - { - print $m4save_m4 "define([_au_$_], defn([$_]))\n"; - print $unm4_m4 "_au_ifdef([$_], [_au_undefine([$_])])\n"; - print $m4_m4 "_au_define([$_], _au_defn([_au_$_]))\n"; - } -} - - - -# ----------------- # -# Autoconf macros. # -# ----------------- # - - -# @AU_MACROS & AC_MACROS -- AU and AC macros and yet another useful comment. -my (%ac_macros, %au_macros); - - -# HANDLE_AUTOCONF_MACROS () -# ------------------------- -# @M4_BUILTINS -- M4 builtins and a useful comment. -sub handle_autoconf_macros () -{ - my $macros = new Autom4te::XFile ("$autoconf" - . " --trace AU_DEFUN:'AU:\$f:\$1'" - . " --trace define:'AC:\$f:\$1'" - . " --melt /dev/null |"); - while ($_ = $macros->getline) - { - chomp; - my ($domain, $file, $macro) = /^(AC|AU):(.*):([^:]*)$/ or next; - # ../lib/m4sugar/m4sugar.m4 -> m4sugar - # ../lib/autoconf/general.m4 -> autoconf - # aclocal.m4 -> aclocal - my $set = basename (dirname ($file)); - $set = 'aclocal' if $file eq 'aclocal.m4'; - error "unknown set: $set: $_" - unless $set =~ /^(m4sugar|aclocal|autoconf)$/; - if ($domain eq "AC") - { - $ac_macros{$macro} = $set; - } - else - { - $au_macros{$macro} = $set; - } - } - $macros->close; - - # Don't keep AU macros in @AC_MACROS. - delete $ac_macros{$_} - foreach (keys %au_macros); - # Don't keep M4sugar macros which are redefined by Autoconf, - # such as `builtin', `changequote' etc. See autoconf/autoconf.m4. - delete $ac_macros{$_} - foreach (@m4_builtins); - error "no current Autoconf macros found" - unless keys %ac_macros; - error "no obsolete Autoconf macros found" - unless keys %au_macros; - - if ($debug) - { - print STDERR "Current Autoconf macros:\n"; - print STDERR join (' ', sort keys %ac_macros) . "\n\n"; - print STDERR "Obsolete Autoconf macros:\n"; - print STDERR join (' ', sort keys %au_macros) . "\n\n"; - } - - # ac.m4 -- autoquoting definitions of the AC macros (M4sugar excluded). - # unac.m4 -- undefine the AC macros. - my $ac_m4 = new Autom4te::XFile ">$tmp/ac.m4"; - print $ac_m4 "# ac.m4 -- autoquoting definitions of the AC macros.\n"; - my $unac_m4 = new Autom4te::XFile ">$tmp/unac.m4"; - print $unac_m4 "# unac.m4 -- undefine the AC macros.\n"; - foreach (sort grep { $ac_macros{$_} ne 'm4sugar' } keys %ac_macros) - { - print $ac_m4 "_au_define([$_], [[\$0(\$\@)]])\n"; - print $unac_m4 "_au_undefine([$_])\n"; - } -} - - -## -------------- ## -## Main program. ## -## -------------- ## - -parse_args; -$autoconf .= " --debug" if $debug; -$autoconf .= " --force" if $force; -$autoconf .= " --verbose" if $verbose; -$autoconf .= join (' --include=', '', @include); -$autoconf .= join (' --prepend-include=', '', @prepend_include); - -mktmpdir ('au'); -handle_m4_macros; -handle_autoconf_macros; - -# $au_changequote -- enable the quote `[', `]' right before any AU macro. -my $au_changequote = - 's/\b(' . join ('|', keys %au_macros) . ')\b/_au_changequote([,])$1/g'; - -# au.m4 -- definitions the AU macros. -xsystem ("$autoconf --trace AU_DEFUN:'_au_defun(\@<:\@\$1\@:>\@, -\@<:\@\$2\@:>\@)' --melt /dev/null " - . ">$tmp/au.m4"); - - - -## ------------------- ## -## Process the files. ## -## ------------------- ## - -foreach my $file (@ARGV) - { - my $filename = $file; - # We need an actual file. - if ($file eq '-') - { - $file = "$tmp/stdin"; - system "cat >$file"; - } - elsif (! -r "$file") - { - die "$me: $file: No such file or directory"; - } - - # input.m4 -- m4 program to produce the updated file. - # Load the values, the dispatcher, neutralize m4, and the prepared - # input file. - my $input_m4 = <<\EOF; - divert(-1) -*- Autoconf -*- - changequote([, ]) - - # Move all the builtins into the `_au_' pseudo namespace - include([m4save.m4]) - - # _au_defun(NAME, BODY) - # --------------------- - # Define NAME to BODY, plus AU activation/deactivation. - _au_define([_au_defun], - [_au_define([$1], - [_au_enable()dnl - $2[]dnl - _au_disable()])]) - - # Import the definition of the obsolete macros. - _au_include([au.m4]) - - - ## ------------------------ ## - ## _au_enable/_au_disable. ## - ## ------------------------ ## - - # They work by pair: each time an AU macro is activated, it runs - # _au_enable, and at its end its runs _au_disable (see _au_defun - # above). AU macros might use AU macros, which should - # enable/disable only for the outer AU macros. - # - # `_au_enabled' is used to this end, determining whether we really - # enable/disable. - - - # __au_enable - # ----------- - # Reenable the builtins, and m4sugar. - _au_define([__au_enable], - [_au_divert(-1) - # Enable special characters. - _au_changecom([#]) - - # Enable the m4 builtins, m4sugar and the autoquoting AC macros. - _au_include([m4.m4]) - _au_include([m4sugar/m4sugar.m4]) - _au_include([ac.m4]) - - _au_divert(0)]) - - # _au_enable - # ---------- - # Called at the beginning of all the obsolete macros. Reenable the - # builtins, and m4sugar if needed. - _au_define([_au_enable], - [_au_ifdef([_au_enabled], - [], - [__au_enable()])_au_dnl - _au_pushdef([_au_enabled])]) - - - # __au_disable - # ------------ - # Disable the builtins, and m4sugar. - _au_define([__au_disable], - [_au_divert(-1) - # Disable m4sugar, the AC autoquoting macros, and m4. - _au_include([unac.m4]) - _au_include([unm4.m4]) - - # Disable special characters. - _au_changequote() - _au_changecom() - - _au_divert(0)]) - - # _au_disable - # ----------- - # Called at the end of all the obsolete macros. Disable the - # builtins, and m4sugar if needed.. - _au_define([_au_disable], - [_au_popdef([_au_enabled])_au_dnl - _au_ifdef([_au_enabled], - [], - [__au_disable()])]) - - - ## ------------------------------- ## - ## Disable, and process the file. ## - ## ------------------------------- ## - _au_divert(-1) - # Disable m4: M4sugar and the AC autoquoting macros are not loaded yet, - # hence invoking `_au_disable' is wrong. - _au_include([unm4.m4]) - - # Disable special characters. - _au_changequote() - _au_changecom() - - _au_divert(0)_au_dnl -EOF - - $input_m4 =~ s/^ //mg; - - # prepared input -- input, but reenables the quote before each AU macro. - open INPUT_M4, ">$tmp/input.m4" - or error "cannot open: $!"; - open FILE, "<$file" - or error "cannot open: $!"; - print INPUT_M4 "$input_m4"; - while () - { - eval $au_changequote; - print INPUT_M4; - } - close FILE - or error "cannot close $file: $!"; - close INPUT_M4 - or error "cannot close $tmp/input.m4: $!"; - - # Now ask m4 to perform the update. - xsystem ("$m4 --include=$tmp" - . join (' --include=', '', reverse (@prepend_include)) - . join (' --include=', '', @include) - . " $tmp/input.m4 >$tmp/updated"); - update_file ("$tmp/updated", - "$file" eq "$tmp/stdin" ? '-' : "$file"); - } -exit 0; - - -# ## ---------------------------- ## -# ## How `autoupdate' functions. ## -# ## ---------------------------- ## -# -# The task of `autoupdate' is not trivial: the biggest difficulty being -# that you must limit the changes to the parts that really need to be -# updated. Finding a satisfying implementation proved to be quite hard, -# as this is the fourth implementation of `autoupdate'. -# -# Below, we will use a simple example of obsolete macro: -# -# AU_DEFUN([OLD], [NEW([$1, $2], m4_eval([$1 + $2]))]) -# AC_DEFUN([NEW], [echo "sum($1) = $2"]) -# -# the input file contains -# -# dnl The Unbelievable Truth -# OLD(1, 2) -# NEW([0, 0], [0]) -# -# Of course the expected output is -# -# dnl The Unbelievable Truth -# NEW([1, 2], [3]) -# NEW([0, 0], [0]) -# -# -# # First implementation: sed -# # ========================= -# -# The first implementation was only able to change the name of obsolete -# macros. -# -# The file `acoldnames.m4' defined the old names based on the new names. -# It was simple then to produce a sed script such as: -# -# s/OLD/NEW/g -# -# Updating merely consisted in running this script on the file to -# update. -# -# This scheme suffers an obvious limitation: that `autoupdate' was -# unable to cope with new macros that just swap some of its arguments -# compared to the old macro. Fortunately, that was enough to upgrade -# from Autoconf 1 to Autoconf 2. (But I have no idea whether the -# changes in Autoconf 2 were precisely limited by this constraint.) -# -# -# # Second implementation: hooks -# # ============================ -# -# The version 2.15 of Autoconf brought a vast number of changes compared -# to 2.13, so a solution was needed. One could think to extend the -# `sed' scripts with specialized code for complex macros. But this -# approach is of course full of flaws: -# -# a. the Autoconf maintainers have to write these snippets, which we -# just don't want to, -# -# b. I really don't think you'll ever manage to handle the quoting of -# m4 from sed. -# -# To satisfy a., let's remark that the code which implements the old -# features in term of the new feature is exactly the code which should -# replace the old code. -# -# To answer point b, as usual in the history of Autoconf, the answer, at -# least on the paper, is simple: m4 is the best tool to parse m4, so -# let's use m4. -# -# Therefore the specification is: -# -# I want to be able to tell Autoconf, well, m4, that the macro I -# am currently defining is an obsolete macro (so that the user is -# warned), which code is the code to use when running autoconf, -# but that the very same code has to be used when running -# autoupdate. To summarize, the interface I want is -# `AU_DEFUN(OLD-NAME, NEW-CODE)'. -# -# -# Now for the technical details. -# -# When running autoconf, except for the warning, AU_DEFUN is basically -# AC_DEFUN. -# -# When running autoupdate, we want *only* OLD-NAMEs to be expanded. -# This obviously means that acgeneral.m4 and acspecific.m4 must not be -# loaded. Nonetheless, because we want to use a rich set of m4 -# features, m4sugar.m4 is needed. Please note that the fact that -# Autoconf's macros are not loaded is positive on two points: -# -# - we do get an updated `configure.ac', not a `configure'! -# -# - the old macros are replaced by *calls* to the new-macros, not the -# body of the new macros, since their body is not defined!!! -# (Whoa, that's really beautiful!). -# -# Additionally we need to disable the quotes when reading the input for -# two reasons: first because otherwise `m4' will swallow the quotes of -# other macros: -# -# NEW([1, 2], 3) -# => NEW(1, 2, 3) -# -# and second, because we want to update the macro calls which are -# quoted, i.e., we want -# -# FOO([OLD(1, 2)]) -# => FOO([NEW([1, 2], [3])]) -# -# If we don't disable the quotes, only the macros called at the top -# level would be updated. -# -# So, let's disable the quotes. -# -# Well, not quite: m4sugar.m4 still needs to use quotes for some macros. -# Well, in this case, when running in autoupdate code, each macro first -# reestablishes the quotes, expands itself, and disables the quotes. -# -# Thinking a bit more, you realize that in fact, people may use `define' -# `ifelse' etc. in their files, and you certainly don't want to process -# them. Another example is `dnl': you don't want to remove the -# comments. You then realize you don't want exactly to import m4sugar: -# you want to specify when it is enabled (macros active), and disabled. -# m4sugar provides m4_disable/m4_enable to this end. -# -# You're getting close to it. Now remains one task: how to handle -# twofold definitions? -# -# Remember that the same AU_DEFUN must be understood in two different -# ways, the AC way, and the AU way. -# -# One first solution is to check whether acgeneral.m4 was loaded. But -# that's definitely not cute. Another is simply to install `hooks', -# that is to say, to keep in some place m4 knows, late `define' to be -# triggered *only* in AU mode. -# -# You first think to design AU_DEFUN like this: -# -# 1. AC_DEFUN(OLD-NAME, -# [Warn the user OLD-NAME is obsolete. -# NEW-CODE]) -# -# 2. Store for late AU binding([define(OLD_NAME, -# [Reestablish the quotes. -# NEW-CODE -# Disable the quotes.])]) -# -# but this will not work: NEW-CODE has probably $1, $2 etc. and these -# guys will be replaced with the argument of `Store for late AU binding' -# when you call it. -# -# I don't think there is a means to avoid this using this technology -# (remember that $1 etc. are *always* expanded in m4). You may also try -# to replace them with $[1] to preserve them for a later evaluation, but -# if `Store for late AU binding' is properly written, it will remain -# quoted till the end... -# -# You have to change technology. Since the problem is that `$1' -# etc. should be `consumed' right away, one solution is to define now a -# second macro, `AU_OLD-NAME', and to install a hook than binds OLD-NAME -# to AU_OLD-NAME. Then, autoupdate.m4 just need to run the hooks. By -# the way, the same method was used in autoheader. -# -# -# # Third implementation: m4 namespaces by m4sugar -# # ============================================== -# -# Actually, this implementation was just a clean up of the previous -# implementation: instead of defining hooks by hand, m4sugar was equipped -# with `namespaces'. What are they? -# -# Sometimes we want to disable some *set* of macros, and restore them -# later. We provide support for this via namespaces. -# -# There are basically three characters playing this scene: defining a -# macro in a namespace, disabling a namespace, and restoring a namespace -# (i.e., all the definitions it holds). -# -# Technically, to define a MACRO in NAMESPACE means to define the macro -# named `NAMESPACE::MACRO' to the VALUE. At the same time, we append -# `undefine(NAME)' in the macro named `m4_disable(NAMESPACE)', and -# similarly a binding of NAME to the value of `NAMESPACE::MACRO' in -# `m4_enable(NAMESPACE)'. These mechanisms allow to bind the macro of -# NAMESPACE and to unbind them at will. -# -# Of course this implementation is really inefficient: m4 has to grow -# strings which can become quickly huge, which slows it significantly. -# -# In particular one should avoid as much as possible to use `define' for -# temporaries. Now that `define' as quite a complex meaning, it is an -# expensive operations that should be limited to macros. Use -# `m4_define' for temporaries. -# -# Private copies of the macros we used in entering / exiting the m4sugar -# namespace. It is much more convenient than fighting with the renamed -# version of define etc. -# -# -# -# Those two implementations suffered from serious problems: -# -# - namespaces were really expensive, and incurred a major performance -# loss on `autoconf' itself, not only `autoupdate'. One solution -# would have been the limit the use of namespaces to `autoupdate', but -# that's again some complications on m4sugar, which really doesn't need -# this. So we wanted to get rid of the namespaces. -# -# - since the quotes were disabled, autoupdate was sometimes making -# wrong guesses, for instance on: -# -# foo([1, 2]) -# -# m4 saw 2 arguments: `[1'and `2]'. A simple solution, somewhat -# fragile, is to reestablish the quotes right before all the obsolete -# macros, i.e., to use sed so that the previous text becomes -# -# changequote([, ])foo([1, 2]) -# -# To this end, one wants to trace the definition of obsolete macros. -# -# It was there that the limitations of the namespace approach became -# painful: because it was a complex machinery playing a lot with the -# builtins of m4 (hence, quite fragile), tracing was almost impossible. -# -# -# So this approach was dropped. -# -# -# # The fourth implementation: two steps -# # ==================================== -# -# If you drop the uses of namespaces, you no longer can compute the -# updated value, and replace the old call with it simultaneously. -# -# Obviously you will use m4 to compute the updated values, but you may -# use some other tool to achieve the replacement. Personally, I trust -# nobody but m4 to parse m4, so below, m4 will perform the two tasks. -# -# How can m4 be used to replace *some* macros calls with newer values. -# Well, that's dead simple: m4 should learn the definitions of obsolete -# macros, forget its builtins, disable the quotes, and then run on the -# input file, which amounts to doing this: -# -# divert(-1)dnl -# changequote([, ]) -# define([OLD], [NEW([$1, $2], m4_eval([$1 + $2]))changequote()]) -# undefine([dnl]) -# undefine([m4_eval]) -# # Some more undefines... -# changequote() -# divert(0)dnl -# dnl The Unbelievable Truth -# changequote([, ])OLD(1, 2) -# NEW([0, 0], -# 0) -# -# which will result in -# -# dnl The Unbelievable Truth -# NEW(1, 2, m4_eval(1 + 2)) -# NEW([0, 0], -# 0) -# -# Grpmh. Two problems. A minor problem: it would have been much better -# to have the `m4_eval' computed, and a major problem: you lost the -# quotation in the result. -# -# Let's address the big problem first. One solution is to define any -# modern macro to rewrite its calls with the proper quotation, thanks to -# `$@'. Again, tracing the `define's makes it possible to know which -# are these macros, so you input is: -# -# divert(-1)dnl -# changequote([, ]) -# define([OLD], [NEW([$1, $2], m4_eval([$1 + $2]))changequote()]) -# define([NEW], [[NEW($@)]changequote()]) -# undefine([dnl]) -# undefine([m4_eval]) -# # Some more undefines... -# changequote() -# divert(0)dnl -# dnl The Unbelievable Truth -# changequote([, ])OLD(1, 2) -# changequote([, ])NEW([0, 0], -# 0) -# -# which results in -# -# dnl The Unbelievable Truth -# NEW([1, 2],[m4_eval(1 + 2)]) -# NEW([0, 0],[0]) -# -# Our problem is solved, i.e., the first call to `NEW' is properly -# quoted, but introduced another problem: we changed the layout of the -# second calls, which can be a drama in the case of huge macro calls -# (think of `AC_TRY_RUN' for instance). This example didn't show it, -# but we also introduced parens to macros which did not have some: -# -# AC_INIT -# => AC_INIT() -# -# No big deal for the semantics (unless the macro depends upon $#, which -# is bad), but the users would not be happy. -# -# Additionally, we introduced quotes that we not there before, which is -# OK in most cases, but could change the semantics of the file. -# -# Cruel dilemma: we do want the auto-quoting definition of `NEW' when -# evaluating `OLD', but we don't when we evaluate the second `NEW'. -# Back to namespaces? -# -# No. -# -# -# # Second step: replacement -# # ------------------------ -# -# No, as announced above, we will work in two steps: in a first step we -# compute the updated values, and in a second step we replace them. Our -# goal is something like this: -# -# divert(-1)dnl -# changequote([, ]) -# define([OLD], [NEW([1, 2], [3])changequote()]) -# undefine([dnl]) -# undefine([m4_eval]) -# # Some more undefines... -# changequote() -# divert(0)dnl -# dnl The Unbelievable Truth -# changequote([, ])OLD(1, 2) -# NEW([0, 0], -# 0) -# -# i.e., the new value of `OLD' is precomputed using the auto-quoting -# definition of `NEW' and the m4 builtins. We'll see how afterwards, -# let's finish with the replacement. -# -# Of course the solution above is wrong: if there were other calls to -# `OLD' with different values, we would smash them to the same value. -# But it is quite easy to generalize the scheme above: -# -# divert(-1)dnl -# changequote([, ]) -# define([OLD([1],[2])], [NEW([1, 2], [3])]) -# define([OLD], [defn([OLD($@)])changequote()]) -# undefine([dnl]) -# undefine([m4_eval]) -# # Some more undefines... -# changequote() -# divert(0)dnl -# dnl The Unbelievable Truth -# changequote([, ])OLD(1, 2) -# NEW([0, 0], -# 0) -# -# i.e., for each call to obsolete macros, we build an array `call => -# value', and use a macro to dispatch these values. This results in: -# -# dnl The Unbelievable Truth -# NEW([1, 2], [3]) -# NEW([0, 0], -# 0) -# -# In French, we say `Youpi !', which you might roughly translate as -# `Yippee!'. -# -# -# # First step: computation -# # ----------------------- -# -# Let's study the anatomy of the file, and name its sections: -# -# prologue -# divert(-1)dnl -# changequote([, ]) -# values -# define([OLD([1],[2])], [NEW([1, 2], [3])]) -# dispatcher -# define([OLD], [defn([OLD($@)])changequote()]) -# disabler -# undefine([dnl]) -# undefine([m4_eval]) -# # Some more undefines... -# changequote() -# divert(0)dnl -# input -# dnl The Unbelievable Truth -# changequote([, ])OLD(1, 2) -# NEW([0, 0], -# 0) -# -# -# # Computing the `values' section -# # .............................. -# -# First we need to get the list of all the AU macro uses. To this end, -# first get the list of all the AU macros names by tracing `AU_DEFUN' in -# the initialization of autoconf. This list is computed in the file -# `au.txt' below. -# -# Then use this list to trace all the AU macro uses in the input. The -# goal is obtain in the case of our example: -# -# [define([OLD([1],[2])],]@<<@OLD([1],[2])@>>@[)] -# -# This is the file `values.in' below. -# -# We want to evaluate this with only the builtins (in fact m4sugar), the -# auto-quoting definitions of the new macros (`new.m4'), and the -# definition of the old macros (`old.m4'). Computing these last two -# files is easy: it's just a matter of using the right `--trace' option. -# -# So the content of `values.in' is: -# -# include($autoconf_dir/m4sugar.m4) -# m4_include(new.m4) -# m4_include(old.m4) -# divert(0)dnl -# [define([OLD([1],[2])],]@<<@OLD([1],[2])@>>@[)] -# -# We run m4 on it, which yields: -# -# define([OLD([1],[2])],@<<@NEW([1, 2], [3])@>>@) -# -# Transform `@<<@' and `@>>@' into quotes and we get -# -# define([OLD([1],[2])],[NEW([1, 2], [3])]) -# -# This is `values.m4'. -# -# -# # Computing the `dispatcher' section -# # .................................. -# -# The `prologue', and the `disabler' are simple and need no commenting. -# -# To compute the `dispatcher' (`dispatch.m4'), again, it is a simple -# matter of using the right `--trace'. -# -# Finally, the input is not exactly the input file, rather it is the -# input file with the added `changequote'. To this end, we build -# `quote.sed'. -# -# -# # Putting it all together -# # ....................... -# -# We build the file `input.m4' which contains: -# -# divert(-1)dnl -# changequote([, ]) -# include(values.m4) -# include(dispatch.m4) -# undefine([dnl]) -# undefine([eval]) -# # Some more undefines... -# changequote() -# divert(0)dnl -# dnl The Unbelievable Truth -# changequote([, ])OLD(1, 2) -# NEW([0, 0], -# 0) -# -# And we just run m4 on it. Et voila`, Monsieur ! Mais oui, mais oui. -# -# Well, there are a few additional technicalities. For instance, we -# rely on `changequote', `ifelse' and `defn', but we don't want to -# interpret the changequotes of the user, so we simply use another name: -# `_au_changequote' etc. -# -# -# # Failure of the fourth approach -# # ------------------------------ -# -# This approach is heavily based on traces, but then there is an obvious -# problem: non expanded code will never be seen/ In particular, the body -# of a `define' definition is not seen, so on the input -# -# define([idem], [OLD(0, [$1])]) -# -# autoupdate would never see the `OLD', and wouldn't have updated it. -# Worse yet, if `idem(0)' was used later, then autoupdate sees that -# `OLD' is used, computes the result for `OLD(0, 0)' and sets up a -# dispatcher for `OLD'. Since there was no computed value for `OLD(0, -# [$1])', the dispatcher would have replaced with... nothing, leading -# to -# -# define([idem], []) -# -# With some more thinking, you see that the two step approach is wrong, -# the namespace approach was much saner. -# -# But you learned a lot, in particular you realized that using traces -# can make it possible to simulate namespaces! -# -# -# -# # The fifth implementation: m4 namespaces by files -# # ================================================ -# -# The fourth implementation demonstrated something unsurprising: you -# cannot precompute, i.e., the namespace approach was the right one. -# Still, we no longer want them, they're too expensive. Let's have a -# look at the way it worked. -# -# When updating -# -# dnl The Unbelievable Truth -# OLD(1, 2) -# NEW([0, 0], [0]) -# -# you evaluate `input.m4': -# -# divert(-1) -# changequote([, ]) -# define([OLD], -# [m4_enable()NEW([$1, $2], m4_eval([$1 + $2]))m4_disable()]) -# ... -# m4_disable() -# dnl The Unbelievable Truth -# OLD(1, 2) -# NEW([0, 0], [0]) -# -# where `m4_disable' undefines the m4 and m4sugar, and disables the quotes -# and comments: -# -# define([m4_disable], -# [undefine([__file__]) -# ... -# changecom(#) -# changequote()]) -# -# `m4_enable' does the converse: reestablish quotes and comments -# --easy--, reestablish m4sugar --easy: just load `m4sugar.m4' again-- and -# reenable the builtins. This later task requires that you first save -# the builtins. And BTW, the definition above of `m4_disable' cannot -# work: you undefined `changequote' before using it! So you need to use -# your privates copies of the builtins. Let's introduce three files for -# this: -# -# `m4save.m4' -# moves the m4 builtins into the `_au_' pseudo namespace -# `unm4.m4' -# undefines the builtins -# `m4.m4' -# restores them -# -# So `input.m4' is: -# -# divert(-1) -# changequote([, ]) -# -# include([m4save.m4]) -# -# # Import AU. -# define([OLD], -# [m4_enable()NEW([$1, $2], m4_eval([$1 + $2]))m4_disable()]) -# -# define([_au_enable], -# [_au_changecom([#]) -# _au_include([m4.m4]) -# _au_include(m4sugar.m4)]) -# -# define([_au_disable], -# [# Disable m4sugar. -# # Disable the m4 builtins. -# _au_include([unm4.m4]) -# # 1. Disable special characters. -# _au_changequote() -# _au_changecom()]) -# -# m4_disable() -# dnl The Unbelievable Truth -# OLD(1, 2) -# NEW([0, 0], [0]) -# -# Based on what we learned in the fourth implementation we know that we -# have to enable the quotes *before* any AU macro, and we know we need -# to build autoquoting versions of the AC macros. But the autoquoting -# AC definitions must be disabled in the rest of the file, and enabled -# inside AU macros. -# -# Using `autoconf --trace' it is easy to build the files -# -# `ac.m4' -# define the autoquoting AC fake macros -# `disable.m4' -# undefine the m4sugar and AC autoquoting macros. -# `au.m4' -# definitions of the AU macros (such as `OLD' above). -# -# Now, `input.m4' is: -# -# divert(-1) -# changequote([, ]) -# -# include([m4save.m4]) -# # Import AU. -# include([au.m4]) -# -# define([_au_enable], -# [_au_changecom([#]) -# _au_include([m4.m4]) -# _au_include(m4sugar.m4) -# _au_include(ac.m4)]) -# -# define([_au_disable], -# [_au_include([disable.m4]) -# _au_include([unm4.m4]) -# # 1. Disable special characters. -# _au_changequote() -# _au_changecom()]) -# -# m4_disable() -# dnl The Unbelievable Truth -# _au_changequote([, ])OLD(1, 2) -# NEW([0, 0], [0]) -# -# Finally, version V is ready. -# -# Well... almost. -# -# There is a slight problem that remains: if an AU macro OUTER includes -# an AU macro INNER, then _au_enable will be run when entering OUTER -# and when entering INNER (not good, but not too bad yet). But when -# getting out of INNER, _au_disable will disable everything while we -# were still in OUTER. Badaboom. -# -# Therefore _au_enable and _au_disable have to be written to work by -# pairs: each _au_enable pushdef's _au_enabled, and each _au_disable -# popdef's _au_enabled. And of course _au_enable and _au_disable are -# effective when _au_enabled is *not* defined. -# -# Finally, version V' is ready. And there is much rejoicing. (And I -# have free time again. I think. Yeah, right.) - -### Setup "GNU" style for perl-mode and cperl-mode. -## Local Variables: -## perl-indent-level: 2 -## perl-continued-statement-offset: 2 -## perl-continued-brace-offset: 0 -## perl-brace-offset: 0 -## perl-brace-imaginary-offset: 0 -## perl-label-offset: -2 -## cperl-indent-level: 2 -## cperl-brace-offset: 0 -## cperl-continued-brace-offset: 0 -## cperl-label-offset: -2 -## cperl-extra-newline-before-brace: t -## cperl-merge-trailing-else: nil -## cperl-continued-statement-offset: 2 -## End: diff --git a/bin/bashbug b/bin/bashbug deleted file mode 100644 index 5af6ce41..00000000 --- a/bin/bashbug +++ /dev/null @@ -1,272 +0,0 @@ -#!/bin/sh - -# -# bashbug - create a bug report and mail it to the bug address -# -# The bug address depends on the release status of the shell. Versions -# with status `devel', `alpha', `beta', or `rc' mail bug reports to -# chet@cwru.edu and, optionally, to bash-testers@cwru.edu. -# Other versions send mail to bug-bash@gnu.org. -# -# Copyright (C) 1996-2004 Free Software Foundation, Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. - -# -# configuration section: -# these variables are filled in by the make target in Makefile -# -MACHINE="i686" -OS="msys" -CC="gcc" -CFLAGS=" -DPROGRAM='bash.exe' -DCONF_HOSTTYPE='i686' -DCONF_OSTYPE='msys' -DCONF_MACHTYPE='i686-pc-msys' -DCONF_VENDOR='pc' -DLOCALEDIR='/msys/share/locale' -DPACKAGE='bash' -DSHELL -DHAVE_CONFIG_H -DRECYCLES_PIDS -I. -I../../src/bash/bash-3.1 -I../../src/bash/bash-3.1/include -I../../src/bash/bash-3.1/lib -I../../src/bash/bash-3.1/lib/intl -I/devshop/msys/pkgupdate/bld/bash/lib/intl -O2 -s -fnative-struct -mcpu=i686" -RELEASE="3.1" -PATCHLEVEL="0" -RELSTATUS="release" -MACHTYPE="i686-pc-msys" - -PATH=/bin:/usr/bin:/usr/local/bin:$PATH -export PATH - -# Check if TMPDIR is set, default to /tmp -: ${TMPDIR:=/tmp} - -#Securely create a temporary directory for the temporary files -TEMPDIR=$TMPDIR/bbug.$$ -(umask 077 && mkdir $TEMPDIR) || { - echo "$0: could not create temporary directory" >&2 - exit 1 -} - -TEMPFILE1=$TEMPDIR/bbug1 -TEMPFILE2=$TEMPDIR/bbug2 - -USAGE="Usage: $0 [--help] [--version] [bug-report-email-address]" -VERSTR="GNU bashbug, version ${RELEASE}.${PATCHLEVEL}-${RELSTATUS}" - -do_help= do_version= - -while [ $# -gt 0 ]; do - case "$1" in - --help) shift ; do_help=y ;; - --version) shift ; do_version=y ;; - --) shift ; break ;; - -*) echo "bashbug: ${1}: invalid option" >&2 - echo "$USAGE" >& 2 - exit 2 ;; - *) break ;; - esac -done - -if [ -n "$do_version" ]; then - echo "${VERSTR}" - exit 0 -fi - -if [ -n "$do_help" ]; then - echo "${VERSTR}" - echo "${USAGE}" - echo - cat << HERE_EOF -Bashbug is used to send mail to the Bash maintainers -for when Bash doesn't behave like you'd like, or expect. - -Bashbug will start up your editor (as defined by the shell's -EDITOR environment variable) with a preformatted bug report -template for you to fill in. The report will be mailed to the -bash maintainers by default. See the manual for details. - -If you invoke bashbug by accident, just quit your editor without -saving any changes to the template, and no bug report will be sent. -HERE_EOF - exit 0 -fi - -# Figure out how to echo a string without a trailing newline -N=`echo 'hi there\c'` -case "$N" in -*c) n=-n c= ;; -*) n= c='\c' ;; -esac - -BASHTESTERS="bash-testers@cwru.edu" - -case "$RELSTATUS" in -alpha*|beta*|devel*|rc*) BUGBASH=chet@cwru.edu ;; -*) BUGBASH=bug-bash@gnu.org ;; -esac - -case "$RELSTATUS" in -alpha*|beta*|devel*|rc*) - echo "$0: This is a testing release. Would you like your bug report" - echo "$0: to be sent to the bash-testers mailing list?" - echo $n "$0: Send to bash-testers? $c" - read ans - case "$ans" in - y*|Y*) BUGBASH="${BUGBASH},${BASHTESTERS}" ;; - esac ;; -esac - -BUGADDR="${1-$BUGBASH}" - -if [ -z "$DEFEDITOR" ] && [ -z "$EDITOR" ]; then - if [ -x /usr/bin/editor ]; then - DEFEDITOR=editor - elif [ -x /usr/local/bin/ce ]; then - DEFEDITOR=ce - elif [ -x /usr/local/bin/emacs ]; then - DEFEDITOR=emacs - elif [ -x /usr/contrib/bin/emacs ]; then - DEFEDITOR=emacs - elif [ -x /usr/bin/emacs ]; then - DEFEDITOR=emacs - elif [ -x /usr/bin/xemacs ]; then - DEFEDITOR=xemacs - elif [ -x /usr/contrib/bin/jove ]; then - DEFEDITOR=jove - elif [ -x /usr/local/bin/jove ]; then - DEFEDITOR=jove - elif [ -x /usr/bin/vi ]; then - DEFEDITOR=vi - else - echo "$0: No default editor found: attempting to use vi" >&2 - DEFEDITOR=vi - fi -fi - - -: ${EDITOR=$DEFEDITOR} - -: ${USER=${LOGNAME-`whoami`}} - -trap 'rm -rf "$TEMPDIR"; exit 1' 1 2 3 13 15 -trap 'rm -rf "$TEMPDIR"' 0 - -UN= -if (uname) >/dev/null 2>&1; then - UN=`uname -a` -fi - -if [ -f /usr/lib/sendmail ] ; then - RMAIL="/usr/lib/sendmail" - SMARGS="-i -t" -elif [ -f /usr/sbin/sendmail ] ; then - RMAIL="/usr/sbin/sendmail" - SMARGS="-i -t" -else - RMAIL=rmail - SMARGS="$BUGADDR" -fi - -INITIAL_SUBJECT='[50 character or so descriptive subject here (for reference)]' - -cat > "$TEMPFILE1" <> $HOME/dead.bashbug - echo "$0: mail failed: report saved in $HOME/dead.bashbug" >&2 -} - -exit 0 diff --git a/bin/c_rehash b/bin/c_rehash deleted file mode 100644 index 589f7cab..00000000 --- a/bin/c_rehash +++ /dev/null @@ -1,158 +0,0 @@ -#!/bin/perl - - -# Perl c_rehash script, scan all files in a directory -# and add symbolic links to their hash values. - -my $openssl; - -my $dir = "/usr/ssl"; - -if(defined $ENV{OPENSSL}) { - $openssl = $ENV{OPENSSL}; -} else { - $openssl = "openssl"; - $ENV{OPENSSL} = $openssl; -} - -$ENV{PATH} .= ":$dir/bin"; - -if(! -f $openssl) { - my $found = 0; - foreach (split /:/, $ENV{PATH}) { - if(-f "$_/$openssl") { - $found = 1; - last; - } - } - if($found == 0) { - print STDERR "c_rehash: rehashing skipped ('openssl' program not available)\n"; - exit 0; - } -} - -if(@ARGV) { - @dirlist = @ARGV; -} elsif($ENV{SSL_CERT_DIR}) { - @dirlist = split /:/, $ENV{SSL_CERT_DIR}; -} else { - $dirlist[0] = "$dir/certs"; -} - - -foreach (@dirlist) { - if(-d $_ and -w $_) { - hash_dir($_); - } -} - -sub hash_dir { - my %hashlist; - print "Doing $_[0]\n"; - chdir $_[0]; - opendir(DIR, "."); - my @flist = readdir(DIR); - # Delete any existing symbolic links - foreach (grep {/^[\da-f]+\.r{0,1}\d+$/} @flist) { - if(-l $_) { - unlink $_; - } - } - closedir DIR; - FILE: foreach $fname (grep {/\.pem$/} @flist) { - # Check to see if certificates and/or CRLs present. - my ($cert, $crl) = check_file($fname); - if(!$cert && !$crl) { - print STDERR "WARNING: $fname does not contain a certificate or CRL: skipping\n"; - next; - } - link_hash_cert($fname) if($cert); - link_hash_crl($fname) if($crl); - } -} - -sub check_file { - my ($is_cert, $is_crl) = (0,0); - my $fname = $_[0]; - open IN, $fname; - while() { - if(/^-----BEGIN (.*)-----/) { - my $hdr = $1; - if($hdr =~ /^(X509 |TRUSTED |)CERTIFICATE$/) { - $is_cert = 1; - last if($is_crl); - } elsif($hdr eq "X509 CRL") { - $is_crl = 1; - last if($is_cert); - } - } - } - close IN; - return ($is_cert, $is_crl); -} - - -# Link a certificate to its subject name hash value, each hash is of -# the form . where n is an integer. If the hash value already exists -# then we need to up the value of n, unless its a duplicate in which -# case we skip the link. We check for duplicates by comparing the -# certificate fingerprints - -sub link_hash_cert { - my $fname = $_[0]; - my ($hash, $fprint) = `$openssl x509 -hash -fingerprint -noout -in $fname`; - chomp $hash; - chomp $fprint; - $fprint =~ s/^.*=//; - $fprint =~ tr/://d; - my $suffix = 0; - # Search for an unused hash filename - while(exists $hashlist{"$hash.$suffix"}) { - # Hash matches: if fingerprint matches its a duplicate cert - if($hashlist{"$hash.$suffix"} eq $fprint) { - print STDERR "WARNING: Skipping duplicate certificate $fname\n"; - return; - } - $suffix++; - } - $hash .= ".$suffix"; - print "$fname => $hash\n"; - $symlink_exists=eval {symlink("",""); 1}; - if ($symlink_exists) { - symlink $fname, $hash; - } else { - system ("cp", $fname, $hash); - } - $hashlist{$hash} = $fprint; -} - -# Same as above except for a CRL. CRL links are of the form .r - -sub link_hash_crl { - my $fname = $_[0]; - my ($hash, $fprint) = `$openssl crl -hash -fingerprint -noout -in $fname`; - chomp $hash; - chomp $fprint; - $fprint =~ s/^.*=//; - $fprint =~ tr/://d; - my $suffix = 0; - # Search for an unused hash filename - while(exists $hashlist{"$hash.r$suffix"}) { - # Hash matches: if fingerprint matches its a duplicate cert - if($hashlist{"$hash.r$suffix"} eq $fprint) { - print STDERR "WARNING: Skipping duplicate CRL $fname\n"; - return; - } - $suffix++; - } - $hash .= ".r$suffix"; - print "$fname => $hash\n"; - $symlink_exists=eval {symlink("",""); 1}; - if ($symlink_exists) { - symlink $fname, $hash; - } else { - system ("cp", $fname, $hash); - } - $hashlist{$hash} = $fprint; -} - diff --git a/bin/cls b/bin/cls deleted file mode 100644 index de4a3f9f..00000000 --- a/bin/cls +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# Copyright (C) 2003, Earnie Boyd -# mailto:earnie@users.sf.net -# This file is a part of Minimal SYStem (MSYS) -# http://www.mingw.org/msys.shtml -# File: cls - -#Clear the screen -echo -ne "\033[2J" diff --git a/bin/clsb b/bin/clsb deleted file mode 100644 index fa7af2a7..00000000 --- a/bin/clsb +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# Copyright (C) 2003, Earnie Boyd -# mailto:earnie@users.sf.net -# This file is a part of Minimal SYStem (MSYS) -# http://www.mingw.org/msys.shtml -# File: clsb - -# Clear the screen and buffer -echo -ne "\033c" diff --git a/bin/columns.exe b/bin/columns.exe deleted file mode 100644 index f1d7d2a49c3846201c46b0abb112a21550cf319d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcwPel00001 literal 39936 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

2oL3ZFGWj2Y`+}D{(&QmcxC?Hk;~o_{ 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 stMBx$G4y9=KKmDdFzc2d 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/dev/null | cat - /etc/passwd | grep "^$LOGNAME:" | - cut -f5 -d':' | sed -e 's/,.*//' > $TEMP - ORIGINATOR="`cat $TEMP`" - rm -f $TEMP - fi -fi - -if [ "$ORIGINATOR" = "" ]; then - grep "^$LOGNAME:" /etc/passwd | cut -f5 -d':' | sed -e 's/,.*//' > $TEMP - ORIGINATOR="`cat $TEMP`" - rm -f $TEMP -fi - -if [ -n "$ORGANIZATION" ]; then - if [ -f "$ORGANIZATION" ]; then - ORGANIZATION="`cat $ORGANIZATION`" - fi -else - if [ -n "$DEFAULT_ORGANIZATION" ]; then - ORGANIZATION="$DEFAULT_ORGANIZATION" - elif [ -f $HOME/.organization ]; then - ORGANIZATION="`cat $HOME/.organization`" - elif [ -f $HOME/.signature ]; then - ORGANIZATION="`cat $HOME/.signature`" - fi -fi - -# If they don't have a preferred editor set, then use -if [ -z "$VISUAL" ]; then - if [ -z "$EDITOR" ]; then - EDIT=vi - else - EDIT="$EDITOR" - fi -else - EDIT="$VISUAL" -fi - -# Find out some information. -SYSTEM=`( [ -f /bin/uname ] && /bin/uname -a ) || \ - ( [ -f /usr/bin/uname ] && /usr/bin/uname -a ) || echo ""` -ARCH=`[ -f /bin/arch ] && /bin/arch` -MACHINE=`[ -f /bin/machine ] && /bin/machine` - -COMMAND=`echo $0 | sed -e 's,.*/,,'` -## USAGE="Usage: $COMMAND [-PVL] [-t address] [-f filename] [--request-id] -USAGE="Usage: $COMMAND [-PVL] -[--version]" -REMOVE= -BATCH= - -while [ $# -gt 0 ]; do - case "$1" in - -r) ;; # Ignore for backward compat. -## -t | --to) if [ $# -eq 1 ]; then echo "$USAGE"; exit 1; fi -## shift ; GNATS_ADDR="$1" -## EXPLICIT_GNATS_ADDR=true -## ;; -## -f | --file) if [ $# -eq 1 ]; then echo "$USAGE"; exit 1; fi -## shift ; IN_FILE="$1" -## if [ "$IN_FILE" != "-" -a ! -r "$IN_FILE" ]; then -## echo "$COMMAND: cannot read $IN_FILE" -## exit 1 -## fi -## ;; - -b | --batch) BATCH=true ;; - -p | -P | --print) PRINT=true ;; - -L | --list) FORMAT=norm ;; - -l | -CL | --lisp) FORMAT=lisp ;; -## --request-id) REQUEST_ID=true ;; - -h | --help) echo "$USAGE"; exit 0 ;; - -V | --version) echo "$VERSION"; exit 0 ;; - -*) echo "$USAGE" ; exit 1 ;; - *) echo "$USAGE" ; exit 1 -## if [ -z "$USER_GNATS_SITE" ]; then -## if [ ! -r "$DATADIR/gnats/$1" ]; then -## echo "$COMMAND: the GNATS site $1 does not have a categories list." -## exit 1 -## else -## # The site name is the alias they'll have to have created. -## USER_GNATS_SITE=$1 -## fi -## else -## echo "$USAGE" ; exit 1 -## fi - ;; - esac - shift -done - -if [ -n "$USER_GNATS_SITE" ]; then - GNATS_SITE=$USER_GNATS_SITE - GNATS_ADDR=$USER_GNATS_SITE-gnats -fi - -if [ "$SUBMITTER" = "unknown" -a -z "$REQUEST_ID" -a -z "$IN_FILE" ]; then - cat << '__EOF__' -It seems that send-pr is not installed with your unique submitter-id. -You need to run - - install-sid YOUR-SID - -where YOUR-SID is the identification code you received with `send-pr'. -`send-pr' will automatically insert this value into the template field -`>Submitter-Id'. If you've downloaded `send-pr' from the Net, use `net' -for this value. If you do not know your id, run `send-pr --request-id' to -get one from your support site. -__EOF__ - exit 1 -fi - -## if [ -r "$DATADIR/gnats/$GNATS_SITE" ]; then -## CATEGORIES=`grep -v '^#' $DATADIR/gnats/$GNATS_SITE | sort` -## else -## echo "$COMMAND: could not read $DATADIR/gnats/$GNATS_SITE for categories list." -## exit 1 -## fi -CATEGORIES="contrib cvs doc pcl-cvs portability" - -if [ -z "$CATEGORIES" ]; then - echo "$COMMAND: the categories list for $GNATS_SITE was empty!" - exit 1 -fi - -case "$FORMAT" in - lisp) echo "$CATEGORIES" | \ - awk 'BEGIN {printf "( "} - {printf "(\"%s\") ",$0} - END {printf ")\n"}' - exit 0 - ;; - norm) l=`echo "$CATEGORIES" | \ - awk 'BEGIN {max = 0; } - { if (length($0) > max) { max = length($0); } } - END {print max + 1;}'` - c=`expr 70 / $l` - if [ $c -eq 0 ]; then c=1; fi - echo "$CATEGORIES" | \ - awk 'BEGIN {print "Known categories:"; i = 0 } - { printf ("%-'$l'.'$l's", $0); if ((++i % '$c') == 0) { print "" } } - END { print ""; }' - exit 0 - ;; -esac - -ORIGINATOR_C='' -ORGANIZATION_C='' -CONFIDENTIAL_C='<[ yes | no ] (one line)>' -SYNOPSIS_C='' -SEVERITY_C='<[ non-critical | serious | critical ] (one line)>' -PRIORITY_C='<[ low | medium | high ] (one line)>' -CATEGORY_C='' -CLASS_C='<[ sw-bug | doc-bug | change-request | support ] (one line)>' -RELEASE_C='' -ENVIRONMENT_C='' -DESCRIPTION_C='' -HOW_TO_REPEAT_C='' -FIX_C='' - -# Catch some signals. ($xs kludge needed by Sun /bin/sh) -xs=0 -trap 'rm -f $REF $TEMP; exit $xs' 0 -trap 'echo "$COMMAND: Aborting ..."; rm -f $REF $TEMP; xs=1; exit' 1 2 3 13 15 - -# If they told us to use a specific file, then do so. -if [ -n "$IN_FILE" ]; then - if [ "$IN_FILE" = "-" ]; then - # The PR is coming from the standard input. - if [ -n "$EXPLICIT_GNATS_ADDR" ]; then - sed -e "s;^[Tt][Oo]:.*;To: $GNATS_ADDR;" > $TEMP - else - cat > $TEMP - fi - else - # Use the file they named. - if [ -n "$EXPLICIT_GNATS_ADDR" ]; then - sed -e "s;^[Tt][Oo]:.*;To: $GNATS_ADDR;" $IN_FILE > $TEMP - else - cat $IN_FILE > $TEMP - fi - fi -else - - if [ -n "$PR_FORM" -a -z "$PRINT_INTERN" ]; then - # If their PR_FORM points to a bogus entry, then bail. - if [ ! -f "$PR_FORM" -o ! -r "$PR_FORM" -o ! -s "$PR_FORM" ]; then - echo "$COMMAND: can't seem to read your template file (\`$PR_FORM'), ignoring PR_FORM" - sleep 1 - PRINT_INTERN=bad_prform - fi - fi - - if [ -n "$PR_FORM" -a -z "$PRINT_INTERN" ]; then - cp $PR_FORM $TEMP || - ( echo "$COMMAND: could not copy $PR_FORM" ; xs=1; exit ) - else - for file in $TEMP $REF ; do - cat > $file << '__EOF__' -SEND-PR: -*- send-pr -*- -SEND-PR: Lines starting with `SEND-PR' will be removed automatically, as -SEND-PR: will all comments (text enclosed in `<' and `>'). -SEND-PR: -SEND-PR: Choose from the following categories: -SEND-PR: -__EOF__ - - # Format the categories so they fit onto lines. - l=`echo "$CATEGORIES" | \ - awk 'BEGIN {max = 0; } - { if (length($0) > max) { max = length($0); } } - END {print max + 1;}'` - c=`expr 61 / $l` - if [ $c -eq 0 ]; then c=1; fi - echo "$CATEGORIES" | \ - awk 'BEGIN {printf "SEND-PR: "; i = 0 } - { printf ("%-'$l'.'$l's", $0); - if ((++i % '$c') == 0) { printf "\nSEND-PR: " } } - END { printf "\nSEND-PR:\n"; }' >> $file - - cat >> $file << __EOF__ -To: $GNATS_ADDR -Subject: -From: $FROM -Reply-To: $REPLY_TO -X-send-pr-version: $VERSION - - ->Submitter-Id: $SUBMITTER ->Originator: $ORIGINATOR ->Organization: -${ORGANIZATION-$ORGANIZATION_C} ->Confidential: $CONFIDENTIAL_C ->Synopsis: $SYNOPSIS_C ->Severity: $SEVERITY_C ->Priority: $PRIORITY_C ->Category: $CATEGORY_C ->Class: $CLASS_C ->Release: ${DEFAULT_RELEASE-$RELEASE_C} ->Environment: - $ENVIRONMENT_C -`[ -n "$SYSTEM" ] && echo System: $SYSTEM` -`[ -n "$ARCH" ] && echo Architecture: $ARCH` -`[ -n "$MACHINE" ] && echo Machine: $MACHINE` ->Description: - $DESCRIPTION_C ->How-To-Repeat: - $HOW_TO_REPEAT_C ->Fix: - $FIX_C -__EOF__ - done - fi - - if [ "$PRINT" = true -o "$PRINT_INTERN" = true ]; then - cat $TEMP - xs=0; exit - fi - - chmod u+w $TEMP - if [ -z "$REQUEST_ID" ]; then - eval $EDIT $TEMP - else - ed -s $TEMP << '__EOF__' -/^Subject/s/^Subject:.*/Subject: request for a customer id/ -/^>Category/s/^>Category:.*/>Category: send-pr/ -w -q -__EOF__ - fi - - if cmp -s $REF $TEMP ; then - echo "$COMMAND: problem report not filled out, therefore not sent" - xs=1; exit - fi -fi - -# -# Check the enumeration fields - -# This is a "sed-subroutine" with one keyword parameter -# (with workaround for Sun sed bug) -# -SED_CMD=' -/$PATTERN/{ -s||| -s|<.*>|| -s|^[ ]*|| -s|[ ]*$|| -p -q -}' - - -while [ -z "$REQUEST_ID" ]; do - CNT=0 - - # 1) Confidential - # - PATTERN=">Confidential:" - CONFIDENTIAL=`eval sed -n -e "\"$SED_CMD\"" $TEMP` - case "$CONFIDENTIAL" in - ""|yes|no) CNT=`expr $CNT + 1` ;; - *) echo "$COMMAND: \`$CONFIDENTIAL' is not a valid value for \`Confidential'." ;; - esac - # - # 2) Severity - # - PATTERN=">Severity:" - SEVERITY=`eval sed -n -e "\"$SED_CMD\"" $TEMP` - case "$SEVERITY" in - ""|non-critical|serious|critical) CNT=`expr $CNT + 1` ;; - *) echo "$COMMAND: \`$SEVERITY' is not a valid value for \`Severity'." - esac - # - # 3) Priority - # - PATTERN=">Priority:" - PRIORITY=`eval sed -n -e "\"$SED_CMD\"" $TEMP` - case "$PRIORITY" in - ""|low|medium|high) CNT=`expr $CNT + 1` ;; - *) echo "$COMMAND: \`$PRIORITY' is not a valid value for \`Priority'." - esac - # - # 4) Category - # - PATTERN=">Category:" - CATEGORY=`eval sed -n -e "\"$SED_CMD\"" $TEMP` - FOUND= - for C in $CATEGORIES - do - if [ "$C" = "$CATEGORY" ]; then FOUND=true ; break ; fi - done - if [ -n "$FOUND" ]; then - CNT=`expr $CNT + 1` - else - if [ -z "$CATEGORY" ]; then - echo "$COMMAND: you must include a Category: field in your report." - else - echo "$COMMAND: \`$CATEGORY' is not a known category." - fi - fi - # - # 5) Class - # - PATTERN=">Class:" - CLASS=`eval sed -n -e "\"$SED_CMD\"" $TEMP` - case "$CLASS" in - ""|sw-bug|doc-bug|change-request|support) CNT=`expr $CNT + 1` ;; - *) echo "$COMMAND: \`$CLASS' is not a valid value for \`Class'." - esac - - [ $CNT -lt 5 -a -z "$BATCH" ] && - echo "Errors were found with the problem report." - - while true; do - if [ -z "$BATCH" ]; then - $ECHON1 "a)bort, e)dit or s)end? $ECHON2" - read input - else - if [ $CNT -eq 5 ]; then - input=s - else - input=a - fi - fi - case "$input" in - a*) - if [ -z "$BATCH" ]; then - echo "$COMMAND: the problem report remains in $BAD and is not sent." - mv $TEMP $BAD - else - echo "$COMMAND: the problem report is not sent." - fi - xs=1; exit - ;; - e*) - eval $EDIT $TEMP - continue 2 - ;; - s*) - break 2 - ;; - esac - done -done -# -# Remove comments and send the problem report -# (we have to use patterns, where the comment contains regex chars) -# -# /^>Originator:/s;$ORIGINATOR;; -sed -e " -/^SEND-PR:/d -/^>Organization:/,/^>[A-Za-z-]*:/s;$ORGANIZATION_C;; -/^>Confidential:/s;<.*>;; -/^>Synopsis:/s;$SYNOPSIS_C;; -/^>Severity:/s;<.*>;; -/^>Priority:/s;<.*>;; -/^>Category:/s;$CATEGORY_C;; -/^>Class:/s;<.*>;; -/^>Release:/,/^>[A-Za-z-]*:/s;$RELEASE_C;; -/^>Environment:/,/^>[A-Za-z-]*:/s;$ENVIRONMENT_C;; -/^>Description:/,/^>[A-Za-z-]*:/s;$DESCRIPTION_C;; -/^>How-To-Repeat:/,/^>[A-Za-z-]*:/s;$HOW_TO_REPEAT_C;; -/^>Fix:/,/^>[A-Za-z-]*:/s;$FIX_C;; -" $TEMP > $REF - -if $MAIL_AGENT < $REF; then - echo "$COMMAND: problem report sent" - xs=0; exit -else - echo "$COMMAND: mysterious mail failure." - if [ -z "$BATCH" ]; then - echo "$COMMAND: the problem report remains in $BAD and is not sent." - mv $REF $BAD - else - echo "$COMMAND: the problem report is not sent." - fi - xs=1; exit -fi diff --git a/bin/ex b/bin/ex deleted file mode 100644 index 2158582e..00000000 --- a/bin/ex +++ /dev/null @@ -1,8 +0,0 @@ -#! /bin/sh -# Copyright (C) 2002, Earnie Boyd -# mailto:earnie@users.sf.net -# This file is a part of Minimal SYStem -# http://www.mingw.org/msys.html -# File: ex - -exec vim -e "$@" diff --git a/bin/find2perl b/bin/find2perl deleted file mode 100644 index fd2a7b2f..00000000 --- a/bin/find2perl +++ /dev/null @@ -1,846 +0,0 @@ -#!/usr/bin/perl - eval 'exec /usr/bin/perl -S $0 ${1+"$@"}' - if $running_under_some_shell; -(my $perlpath = <<'/../') =~ s/\s*\z//; -/usr/bin/perl -/../ -use strict; -use vars qw/$statdone/; -use File::Spec::Functions 'curdir'; -my $startperl = "#! $perlpath -w"; - -# -# Modified September 26, 1993 to provide proper handling of years after 1999 -# Tom Link -# University of Pittsburgh -# -# Modified April 7, 1998 with nasty hacks to implement the troublesome -follow -# Billy Constantine -# University of Adelaide, Adelaide, South Australia -# -# Modified 1999-06-10, 1999-07-07 to migrate to cleaner perl5 usage -# Ken Pizzini -# -# Modified 2000-01-28 to use the 'follow' option of File::Find - -my @roots = (); -while ($ARGV[0] =~ /^[^-!(]/) { - push(@roots, shift); -} -@roots = (curdir()) unless @roots; -for (@roots) { $_ = "e($_) } -my $roots = join(', ', @roots); - -my $find = "find"; -my $indent_depth = 1; -my $stat = 'lstat'; -my $decl = ''; -my $flushall = ''; -my $initfile = ''; -my $initnewer = ''; -my $out = ''; -my %init = (); -my ($follow_in_effect,$Skip_And) = (0,0); - -while (@ARGV) { - $_ = shift; - s/^-// || /^[()!]/ || die "Unrecognized switch: $_\n"; - if ($_ eq '(') { - $out .= &tab . "(\n"; - $indent_depth++; - next; - } elsif ($_ eq ')') { - --$indent_depth; - $out .= &tab . ")"; - } elsif ($_ eq 'follow') { - $follow_in_effect= 1; - $stat = 'stat'; - $Skip_And= 1; - } elsif ($_ eq '!') { - $out .= &tab . "!"; - next; - } elsif ($_ eq 'name') { - $out .= &tab . '/' . &fileglob_to_re(shift) . "/s"; - } elsif ($_ eq 'perm') { - my $onum = shift; - $onum =~ /^-?[0-7]+$/ - || die "Malformed -perm argument: $onum\n"; - $out .= &tab; - if ($onum =~ s/^-//) { - $onum = sprintf("0%o", oct($onum) & 07777); - $out .= "((\$mode & $onum) == $onum)"; - } else { - $onum =~ s/^0*/0/; - $out .= "((\$mode & 0777) == $onum)"; - } - } elsif ($_ eq 'type') { - (my $filetest = shift) =~ tr/s/S/; - $out .= &tab . "-$filetest _"; - } elsif ($_ eq 'print') { - $out .= &tab . 'print("$name\n")'; - } elsif ($_ eq 'print0') { - $out .= &tab . 'print("$name\0")'; - } elsif ($_ eq 'fstype') { - my $type = shift; - $out .= &tab; - if ($type eq 'nfs') { - $out .= '($dev < 0)'; - } else { - $out .= '($dev >= 0)'; #XXX - } - } elsif ($_ eq 'user') { - my $uname = shift; - $out .= &tab . "(\$uid == \$uid{'$uname'})"; - $init{user} = 1; - } elsif ($_ eq 'group') { - my $gname = shift; - $out .= &tab . "(\$gid == \$gid{'$gname'})"; - $init{group} = 1; - } elsif ($_ eq 'nouser') { - $out .= &tab . '!exists $uid{$uid}'; - $init{user} = 1; - } elsif ($_ eq 'nogroup') { - $out .= &tab . '!exists $gid{$gid}'; - $init{group} = 1; - } elsif ($_ eq 'links') { - $out .= &tab . &n('$nlink', shift); - } elsif ($_ eq 'inum') { - $out .= &tab . &n('$ino', shift); - } elsif ($_ eq 'size') { - $_ = shift; - my $n = 'int(((-s _) + 511) / 512)'; - if (s/c\z//) { - $n = 'int(-s _)'; - } elsif (s/k\z//) { - $n = 'int(((-s _) + 1023) / 1024)'; - } - $out .= &tab . &n($n, $_); - } elsif ($_ eq 'atime') { - $out .= &tab . &n('int(-A _)', shift); - } elsif ($_ eq 'mtime') { - $out .= &tab . &n('int(-M _)', shift); - } elsif ($_ eq 'ctime') { - $out .= &tab . &n('int(-C _)', shift); - } elsif ($_ eq 'exec') { - my @cmd = (); - while (@ARGV && $ARGV[0] ne ';') - { push(@cmd, shift) } - shift; - $out .= &tab; - if ($cmd[0] =~m#^(?:(?:/usr)?/bin/)?rm$# - && $cmd[$#cmd] eq '{}' - && (@cmd == 2 || (@cmd == 3 && $cmd[1] eq '-f'))) { - if (@cmd == 2) { - $out .= '(unlink($_) || warn "$name: $!\n")'; - } elsif (!@ARGV) { - $out .= 'unlink($_)'; - } else { - $out .= '(unlink($_) || 1)'; - } - } else { - for (@cmd) - { s/'/\\'/g } - { local $" = "','"; $out .= "&doexec(0, '@cmd')"; } - $init{doexec} = 1; - } - } elsif ($_ eq 'ok') { - my @cmd = (); - while (@ARGV && $ARGV[0] ne ';') - { push(@cmd, shift) } - shift; - $out .= &tab; - for (@cmd) - { s/'/\\'/g } - { local $" = "','"; $out .= "&doexec(0, '@cmd')"; } - $init{doexec} = 1; - } elsif ($_ eq 'prune') { - $out .= &tab . '($File::Find::prune = 1)'; - } elsif ($_ eq 'xdev') { - $out .= &tab . '!($File::Find::prune |= ($dev != $File::Find::topdev))' -; - } elsif ($_ eq 'newer') { - my $file = shift; - my $newername = 'AGE_OF' . $file; - $newername =~ s/\W/_/g; - $newername = '$' . $newername; - $out .= &tab . "(-M _ < $newername)"; - $initnewer .= "my $newername = -M " . "e($file) . ";\n"; - } elsif ($_ eq 'eval') { - my $prog = shift; - $prog =~ s/'/\\'/g; - $out .= &tab . "eval {$prog}"; - } elsif ($_ eq 'depth') { - $find = 'finddepth'; - next; - } elsif ($_ eq 'ls') { - $out .= &tab . "&ls"; - $init{ls} = 1; - } elsif ($_ eq 'tar') { - die "-tar must have a filename argument\n" unless @ARGV; - my $file = shift; - my $fh = 'FH' . $file; - $fh =~ s/\W/_/g; - $out .= &tab . "&tar(*$fh, \$name)"; - $flushall .= "&tflushall;\n"; - $initfile .= "open($fh, " . "e('> ' . $file) . - qq{) || die "Can't open $fh: \$!\\n";\n}; - $init{tar} = 1; - } elsif (/^(n?)cpio\z/) { - die "-$_ must have a filename argument\n" unless @ARGV; - my $file = shift; - my $fh = 'FH' . $file; - $fh =~ s/\W/_/g; - $out .= &tab . "&cpio(*$fh, \$name, '$1')"; - $find = 'finddepth'; - $flushall .= "&cflushall;\n"; - $initfile .= "open($fh, " . "e('> ' . $file) . - qq{) || die "Can't open $fh: \$!\\n";\n}; - $init{cpio} = 1; - } else { - die "Unrecognized switch: -$_\n"; - } - - if (@ARGV) { - if ($ARGV[0] eq '-o') { - { local($statdone) = 1; $out .= "\n" . &tab . "||\n"; } - $statdone = 0 if $indent_depth == 1 && exists $init{delayedstat}; - $init{saw_or} = 1; - shift; - } else { - $out .= " &&" unless $Skip_And || $ARGV[0] eq ')'; - $out .= "\n"; - shift if $ARGV[0] eq '-a'; - } - } -} - - -print <<"END"; -$startperl - eval 'exec $perlpath -S \$0 \${1+"\$@"}' - if 0; #\$running_under_some_shell - -use strict; -use File::Find (); - -# Set the variable \$File::Find::dont_use_nlink if you're using AFS, -# since AFS cheats. - -# for the convenience of &wanted calls, including -eval statements: -use vars qw/*name *dir *prune/; -*name = *File::Find::name; -*dir = *File::Find::dir; -*prune = *File::Find::prune; - -END - - -if (exists $init{ls}) { - print <<'END'; -my @rwx = qw(--- --x -w- -wx r-- r-x rw- rwx); -my @moname = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); - -END -} - -if (exists $init{user} || exists $init{ls} || exists $init{tar}) { - print "my (%uid, %user);\n"; - print "while (my (\$name, \$pw, \$uid) = getpwent) {\n"; - print ' $uid{$name} = $uid{$uid} = $uid;', "\n" - if exists $init{user}; - print ' $user{$uid} = $name unless exists $user{$uid};', "\n" - if exists $init{ls} || exists $init{tar}; - print "}\n\n"; -} - -if (exists $init{group} || exists $init{ls} || exists $init{tar}) { - print "my (%gid, %group);\n"; - print "while (my (\$name, \$pw, \$gid) = getgrent) {\n"; - print ' $gid{$name} = $gid{$gid} = $gid;', "\n" - if exists $init{group}; - print ' $group{$gid} = $name unless exists $group{$gid};', "\n" - if exists $init{ls} || exists $init{tar}; - print "}\n\n"; -} - -print $initnewer, "\n" if $initnewer ne ''; -print $initfile, "\n" if $initfile ne ''; -$flushall .= "exit;\n"; -if (exists $init{declarestat}) { - $out = <<'END' . $out; - my ($dev,$ino,$mode,$nlink,$uid,$gid); - -END -} - -if ( $follow_in_effect ) { -$out =~ s/lstat\(\$_\)/lstat(_)/; -print <<"END"; -$decl -# Traverse desired filesystems -File::Find::$find( {wanted => \\&wanted, follow => 1}, $roots); -$flushall - -sub wanted { -$out; -} - -END -} else { -print <<"END"; -$decl -# Traverse desired filesystems -File::Find::$find({wanted => \\&wanted}, $roots); -$flushall - -sub wanted { -$out; -} - -END -} - -if (exists $init{doexec}) { - print <<'END'; - -use Cwd (); -my $cwd = Cwd::cwd(); - -sub doexec { - my $ok = shift; - for my $word (@_) - { $word =~ s#{}#$name#g } - if ($ok) { - my $old = select(STDOUT); - $| = 1; - print "@_"; - select($old); - return 0 unless =~ /^y/; - } - chdir $cwd; #sigh - system @_; - chdir $File::Find::dir; - return !$?; -} - -END -} - -if (exists $init{ls}) { - print <<'INTRO', <<"SUB", <<'END'; - -sub sizemm { - my $rdev = shift; - sprintf("%3d, %3d", ($rdev >> 8) & 0xff, $rdev & 0xff); -} - -sub ls { - my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, -INTRO - \$atime,\$mtime,\$ctime,\$blksize,\$blocks) = $stat(_); -SUB - my $pname = $name; - - $blocks - or $blocks = int(($size + 1023) / 1024); - - my $perms = $rwx[$mode & 7]; - $mode >>= 3; - $perms = $rwx[$mode & 7] . $perms; - $mode >>= 3; - $perms = $rwx[$mode & 7] . $perms; - substr($perms, 2, 1) =~ tr/-x/Ss/ if -u _; - substr($perms, 5, 1) =~ tr/-x/Ss/ if -g _; - substr($perms, 8, 1) =~ tr/-x/Tt/ if -k _; - if (-f _) { $perms = '-' . $perms; } - elsif (-d _) { $perms = 'd' . $perms; } - elsif (-l _) { $perms = 'l' . $perms; $pname .= ' -> ' . readlink($_); } - elsif (-c _) { $perms = 'c' . $perms; $size = sizemm($rdev); } - elsif (-b _) { $perms = 'b' . $perms; $size = sizemm($rdev); } - elsif (-p _) { $perms = 'p' . $perms; } - elsif (-S _) { $perms = 's' . $perms; } - else { $perms = '?' . $perms; } - - my $user = $user{$uid} || $uid; - my $group = $group{$gid} || $gid; - - my ($sec,$min,$hour,$mday,$mon,$timeyear) = localtime($mtime); - if (-M _ > 365.25 / 2) { - $timeyear += 1900; - } else { - $timeyear = sprintf("%02d:%02d", $hour, $min); - } - - printf "%5lu %4ld %-10s %3d %-8s %-8s %8s %s %2d %5s %s\n", - $ino, - $blocks, - $perms, - $nlink, - $user, - $group, - $size, - $moname[$mon], - $mday, - $timeyear, - $pname; - 1; -} - -END -} - - -if (exists $init{cpio} || exists $init{tar}) { -print <<'END'; - -my %blocks = (); - -sub flush { - my ($fh, $varref, $blksz) = @_; - - while (length($$varref) >= $blksz) { - no strict qw/refs/; - syswrite($fh, $$varref, $blksz); - substr($$varref, 0, $blksz) = ''; - ++$blocks{$fh}; - } -} - -END -} - - -if (exists $init{cpio}) { - print <<'INTRO', <<"SUB", <<'END'; - -my %cpout = (); -my %nc = (); - -sub cpio { - my ($fh, $fname, $nc) = @_; - my $text = ''; - my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, - $atime,$mtime,$ctime,$blksize,$blocks); - local (*IN); - - if ( ! defined $fname ) { - $fname = 'TRAILER!!!'; - ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, - $atime,$mtime,$ctime,$blksize,$blocks) = (0) x 13; - } else { - ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, -INTRO - \$atime,\$mtime,\$ctime,\$blksize,\$blocks) = $stat(_); -SUB - if (-f _) { - open(IN, "./$_\0") || do { - warn "Couldn't open $fname: $!\n"; - return; - } - } else { - $text = readlink($_); - $size = 0 unless defined $text; - } - } - - $fname =~ s#^\./##; - $nc{$fh} = $nc; - if ($nc eq 'n') { - $cpout{$fh} .= - sprintf("%06o%06o%06o%06o%06o%06o%06o%06o%011lo%06o%011lo%s\0", - 070707, - $dev & 0777777, - $ino & 0777777, - $mode & 0777777, - $uid & 0777777, - $gid & 0777777, - $nlink & 0777777, - $rdev & 0177777, - $mtime, - length($fname)+1, - $size, - $fname); - } else { - $cpout{$fh} .= "\0" if length($cpout{$fh}) & 1; - $cpout{$fh} .= pack("SSSSSSSSLSLa*", - 070707, $dev, $ino, $mode, $uid, $gid, $nlink, $rdev, $mtime, - length($fname)+1, $size, - $fname . (length($fname) & 1 ? "\0" : "\0\0")); - } - - if ($text ne '') { - $cpout{$fh} .= $text; - } elsif ($size) { - my $l; - flush($fh, \$cpout{$fh}, 5120) - while ($l = length($cpout{$fh})) >= 5120; - while (sysread(IN, $cpout{$fh}, 5120 - $l, $l)) { - flush($fh, \$cpout{$fh}, 5120); - $l = length($cpout{$fh}); - } - close IN; - } -} - -sub cflushall { - for my $fh (keys %cpout) { - &cpio($fh, undef, $nc{$fh}); - $cpout{$fh} .= "0" x (5120 - length($cpout{$fh})); - flush($fh, \$cpout{$fh}, 5120); - print $blocks{$fh} * 10, " blocks\n"; - } -} - -END -} - -if (exists $init{tar}) { - print <<'INTRO', <<"SUB", <<'END'; - -my %tarout = (); -my %linkseen = (); - -sub tar { - my ($fh, $fname) = @_; - my $prefix = ''; - my $typeflag = '0'; - my $linkname; - my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, -INTRO - \$atime,\$mtime,\$ctime,\$blksize,\$blocks) = $stat(_); -SUB - local (*IN); - - if ($nlink > 1) { - if ($linkname = $linkseen{$fh, $dev, $ino}) { - if (length($linkname) > 100) { - warn "$0: omitting file with linkname ", - "too long for tar output: $linkname\n"; - return; - } - $typeflag = '1'; - $size = 0; - } else { - $linkseen{$fh, $dev, $ino} = $fname; - } - } - if ($typeflag eq '0') { - if (-f _) { - open(IN, "./$_\0") || do { - warn "Couldn't open $fname: $!\n"; - return; - } - } else { - $linkname = readlink($_); - if (defined $linkname) { $typeflag = '2' } - elsif (-c _) { $typeflag = '3' } - elsif (-b _) { $typeflag = '4' } - elsif (-d _) { $typeflag = '5' } - elsif (-p _) { $typeflag = '6' } - } - } - - if (length($fname) > 100) { - ($prefix, $fname) = ($fname =~ m#\A(.*?)/(.{,100})\Z(?!\n)#); - if (!defined($fname) || length($prefix) > 155) { - warn "$0: omitting file with name too long for tar output: ", - $fname, "\n"; - return; - } - } - - $size = 0 if $typeflag ne '0'; - my $header = pack("a100a8a8a8a12a12a8a1a100a6a2a32a32a8a8a155", - $fname, - sprintf("%7o ", $mode & 0777), - sprintf("%7o ", $uid & 0777777), - sprintf("%7o ", $gid & 0777777), - sprintf("%11o ", $size), - sprintf("%11o ", $mtime), - ' 'x8, - $typeflag, - defined $linkname ? $linkname : '', - "ustar\0", - "00", - $user{$uid}, - $group{$gid}, - ($rdev >> 8) & 0xff, - $rdev & 0xff, - $prefix, - ); - substr($header, 148, 8) = sprintf("%7o ", unpack("%16C*", $header)); - my $l = length($header) % 512; - $tarout{$fh} .= $header; - $tarout{$fh} .= "\0" x (512 - $l) if $l; - - if ($size) { - flush($fh, \$tarout{$fh}, 10240) - while ($l = length($tarout{$fh})) >= 10240; - while (sysread(IN, $tarout{$fh}, 10240 - $l, $l)) { - my $slop = length($tarout{$fh}) % 512; - $tarout{$fh} .= "\0" x (512 - $slop) if $slop; - flush($fh, \$tarout{$fh}, 10240); - $l = length($tarout{$fh}); - } - close IN; - } -} - -sub tflushall { - my $len; - for my $fh (keys %tarout) { - $len = 10240 - length($tarout{$fh}); - $len += 10240 if $len < 1024; - $tarout{$fh} .= "\0" x $len; - flush($fh, \$tarout{$fh}, 10240); - } -} - -END -} - -exit; - -############################################################################ - -sub tab { - my $tabstring; - - $tabstring = "\t" x ($indent_depth/2) . ' ' x ($indent_depth%2 * 4); - if (!$statdone) { - if ($_ =~ /^(?:name|print|prune|exec|ok|\(|\))/) { - $init{delayedstat} = 1; - } else { - my $statcall = '(($dev,$ino,$mode,$nlink,$uid,$gid) = ' - . $stat . '($_))'; - if (exists $init{saw_or}) { - $tabstring .= "(\$nlink || $statcall) &&\n" . $tabstring; - } else { - $tabstring .= "$statcall &&\n" . $tabstring; - } - $statdone = 1; - $init{declarestat} = 1; - } - } - $tabstring =~ s/^\s+/ / if $out =~ /!$/; - $tabstring; -} - -sub fileglob_to_re { - my $x = shift; - $x =~ s#([./^\$()])#\\$1#g; - $x =~ s#([?*])#.$1#g; - "^$x\\z"; -} - -sub n { - my ($pre, $n) = @_; - $n =~ s/^-/< / || $n =~ s/^\+/> / || $n =~ s/^/== /; - $n =~ s/ 0*(\d)/ $1/; - "($pre $n)"; -} - -sub quote { - my $string = shift; - $string =~ s/\\/\\\\/g; - $string =~ s/'/\\'/g; - "'$string'"; -} - -__END__ - -=head1 NAME - -find2perl - translate find command lines to Perl code - -=head1 SYNOPSIS - - find2perl [paths] [predicates] | perl - -=head1 DESCRIPTION - -find2perl is a little translator to convert find command lines to -equivalent Perl code. The resulting code is typically faster than -running find itself. - -"paths" are a set of paths where find2perl will start its searches and -"predicates" are taken from the following list. - -=over 4 - -=item C - -Negate the sense of the following predicate. The C must be passed as -a distinct argument, so it may need to be surrounded by whitespace and/or -quoted from interpretation by the shell using a backslash (just as with -using C). - -=item C<( PREDICATES )> - -Group the given PREDICATES. The parentheses must be passed as distinct -arguments, so they may need to be surrounded by whitespace and/or -quoted from interpretation by the shell using a backslash (just as with -using C). - -=item C - -True if _both_ PREDICATE1 and PREDICATE2 are true; PREDICATE2 is not -evaluated if PREDICATE1 is false. - -=item C - -True if either one of PREDICATE1 or PREDICATE2 is true; PREDICATE2 is -not evaluated if PREDICATE1 is true. - -=item C<-follow> - -Follow (dereference) symlinks. The checking of file attributes depends -on the position of the C<-follow> option. If it precedes the file -check option, an C is done which means the file check applies to the -file the symbolic link is pointing to. If C<-follow> option follows the -file check option, this now applies to the symbolic link itself, i.e. -an C is done. - -=item C<-depth> - -Change directory traversal algorithm from breadth-first to depth-first. - -=item C<-prune> - -Do not descend into the directory currently matched. - -=item C<-xdev> - -Do not traverse mount points (prunes search at mount-point directories). - -=item C<-name GLOB> - -File name matches specified GLOB wildcard pattern. GLOB may need to be -quoted to avoid interpretation by the shell (just as with using -C). - -=item C<-perm PERM> - -Low-order 9 bits of permission match octal value PERM. - -=item C<-perm -PERM> - -The bits specified in PERM are all set in file's permissions. - -=item C<-type X> - -The file's type matches perl's C<-X> operator. - -=item C<-fstype TYPE> - -Filesystem of current path is of type TYPE (only NFS/non-NFS distinction -is implemented). - -=item C<-user USER> - -True if USER is owner of file. - -=item C<-group GROUP> - -True if file's group is GROUP. - -=item C<-nouser> - -True if file's owner is not in password database. - -=item C<-nogroup> - -True if file's group is not in group database. - -=item C<-inum INUM> - -True file's inode number is INUM. - -=item C<-links N> - -True if (hard) link count of file matches N (see below). - -=item C<-size N> - -True if file's size matches N (see below) N is normally counted in -512-byte blocks, but a suffix of "c" specifies that size should be -counted in characters (bytes) and a suffix of "k" specifes that -size should be counted in 1024-byte blocks. - -=item C<-atime N> - -True if last-access time of file matches N (measured in days) (see -below). - -=item C<-ctime N> - -True if last-changed time of file's inode matches N (measured in days, -see below). - -=item C<-mtime N> - -True if last-modified time of file matches N (measured in days, see below). - -=item C<-newer FILE> - -True if last-modified time of file matches N. - -=item C<-print> - -Print out path of file (always true). - -=item C<-print0> - -Like -print, but terminates with \0 instead of \n. - -=item C<-exec OPTIONS ;> - -exec() the arguments in OPTIONS in a subprocess; any occurence of {} in -OPTIONS will first be substituted with the path of the current -file. Note that the command "rm" has been special-cased to use perl's -unlink() function instead (as an optimization). The C<;> must be passed as -a distinct argument, so it may need to be surrounded by whitespace and/or -quoted from interpretation by the shell using a backslash (just as with -using C). - -=item C<-ok OPTIONS ;> - -Like -exec, but first prompts user; if user's response does not begin -with a y, skip the exec. The C<;> must be passed as -a distinct argument, so it may need to be surrounded by whitespace and/or -quoted from interpretation by the shell using a backslash (just as with -using C). - -=item C<-eval EXPR> - -Has the perl script eval() the EXPR. - -=item C<-ls> - -Simulates C<-exec ls -dils {} ;> - -=item C<-tar FILE> - -Adds current output to tar-format FILE. - -=item C<-cpio FILE> - -Adds current output to old-style cpio-format FILE. - -=item C<-ncpio FILE> - -Adds current output to "new"-style cpio-format FILE. - -=back - -Predicates which take a numeric argument N can come in three forms: - - * N is prefixed with a +: match values greater than N - * N is prefixed with a -: match values less than N - * N is not prefixed with either + or -: match only values equal to N - -=head1 SEE ALSO - -find - -=cut diff --git a/bin/fold.exe b/bin/fold.exe deleted file mode 100644 index a88e89ba74766971130edbf6667ba8250fbc0e9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcwPel00001 literal 21504 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 F-vOqvL0kX; diff --git a/bin/ftp b/bin/ftp deleted file mode 100644 index b68085e7..00000000 --- a/bin/ftp +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -# Copyright (C) 2002, Earnie Boyd -# mailto:earnie@users.sf.net -# This file is part of Minimal SYStem. -# http://www.mingw.org/msys.shtml -# File: ftp - -cmd //c start ftp "$@" diff --git a/bin/ftp.exe b/bin/ftp.exe deleted file mode 100644 index 6ea0d6e708048350578553b2e208f4139a2c55ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcwPel00001 literal 101207 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 --- September 1997 -;;;; -;;;; Copyright (C) 1998, 2001 Free Software Foundation, Inc. -;;;; -;;;; This program is free software; you can redistribute it and/or modify -;;;; it under the terms of the GNU General Public License as published by -;;;; the Free Software Foundation; either version 2, or (at your option) -;;;; any later version. -;;;; -;;;; This program is distributed in the hope that it will be useful, -;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;;;; GNU General Public License for more details. -;;;; -;;;; You should have received a copy of the GNU General Public License -;;;; along with this software; see the file COPYING. If not, write to -;;;; the Free Software Foundation, Inc., 59 Temple Place, Suite 330, -;;;; Boston, MA 02111-1307 USA -;;;; -;;;; As a special exception, the Free Software Foundation gives permission -;;;; for additional uses of the text contained in its release of GUILE. -;;;; -;;;; The exception is that, if you link the GUILE library with other files -;;;; to produce an executable, this does not by itself cause the -;;;; resulting executable to be covered by the GNU General Public License. -;;;; Your use of that executable is in no way restricted on account of -;;;; linking the GUILE library code into it. -;;;; -;;;; This exception does not however invalidate any other reasons why -;;;; the executable file might be covered by the GNU General Public License. -;;;; -;;;; This exception applies only to the code released by the -;;;; Free Software Foundation under the name GUILE. If you copy -;;;; code from other Free Software Foundation releases into a copy of -;;;; GUILE, as the General Public License permits, the exception does -;;;; not apply to the code that you add in this way. To avoid misleading -;;;; anyone as to the status of such modified files, you must delete -;;;; this exception notice from them. -;;;; -;;;; If you write modifications of your own for GUILE, it is your choice -;;;; whether to permit this exception to apply to your modifications. -;;;; If you do not wish that, delete this exception notice. - -;;; TODO: -;;; * Add some plausible structure for returning the right exit status, -;;; just something that encourages people to do the correct thing. -;;; * Implement the static library support. This requires that -;;; some portion of the module system be done. - -(use-modules (ice-9 string-fun)) - - -;;;; main function, command-line processing - -;;; The script's entry point. -(define (main args) - (set-program-name! (car args)) - (let ((args (cdr args))) - (cond - ((null? args) (show-help '()) - (quit 1)) - ((assoc (car args) command-table) - => (lambda (row) - (set! subcommand-name (car args)) - ((cadr row) (cdr args)))) - (else (show-help '()) - (quit 1))))) - -(define program-name #f) -(define subcommand-name #f) -(define program-version "1.6.0") - -;;; Given an executable path PATH, set program-name to something -;;; appropriate f or use in error messages (i.e., with leading -;;; directory names stripped). -(define (set-program-name! path) - (set! program-name (basename path))) - -(define (show-help args) - (cond - ((null? args) (show-help-overview)) - ((assoc (car args) command-table) - => (lambda (row) ((caddr row)))) - (else - (show-help-overview)))) - -(define (show-help-overview) - (display-line-error "Usage: ") - (for-each (lambda (row) ((cadddr row))) - command-table)) - -(define (usage-help) - (let ((dle display-line-error) - (p program-name)) - (dle " " p " --help - show usage info (this message)") - (dle " " p " --help SUBCOMMAND - show help for SUBCOMMAND"))) - -(define (show-version args) - (display-line-error program-name " - Guile version " program-version)) - -(define (help-version) - (let ((dle display-line-error)) - (dle "Usage: " program-name " --version") - (dle "Show the version of this script. This is also the version of") - (dle "Guile this script was installed with."))) - -(define (usage-version) - (display-line-error - " " program-name " --version - show installed script and Guile version")) - - -;;;; the "link" subcommand - -;;; Write a set of linker flags to standard output to include the -;;; libraries that libguile needs to link against. -;;; -;;; In the long run, we want to derive these flags from Guile module -;;; declarations files that are installed along the load path. For -;;; now, we're just going to reach into Guile's configuration info and -;;; hack it out. -(define (build-link args) - - ;; If PATH has the form FOO/libBAR.a, return the substring - ;; BAR, otherwise return #f. - (define (match-lib path) - (let* ((base (basename path)) - (len (string-length base))) - (if (and (> len 5) - (string=? (substring base 0 3) "lib") - (string=? (substring base (- len 2)) ".a")) - (substring base 3 (- len 2)) - #f))) - - (if (> (length args) 0) - (error - (string-append program-name - " link: arguments to subcommand not yet implemented"))) - - (let ((libdir (get-build-info 'libdir)) - (other-flags - (let loop ((libs - ;; Get the string of linker flags we used to build - ;; Guile, and break it up into a list. - (separate-fields-discarding-char #\space - (get-build-info 'LIBS) - list))) - - (cond - ((null? libs) '()) - - ;; Turn any "FOO/libBAR.a" elements into "-lBAR". - ((match-lib (car libs)) - => (lambda (bar) - (cons (string-append "-l" bar) - (loop (cdr libs))))) - - ;; Remove any empty strings that may have seeped in there. - ((string=? (car libs) "") (loop (cdr libs))) - - (else (cons (car libs) (loop (cdr libs)))))))) - - ;; Include libguile itself in the list, along with the directory - ;; it was installed in, but do *not* add /usr/lib since that may - ;; prevent other programs from specifying non-/usr/lib versions - ;; via their foo-config scripts. If *any* app puts -L/usr/lib in - ;; the output of its foo-config script then it may prevent the use - ;; a non-/usr/lib install of anything that also has a /usr/lib - ;; install. For now we hard-code /usr/lib, but later maybe we can - ;; do something more dynamic (i.e. what do we need. - - ;; Display the flags, separated by spaces. - (if (or (string=? libdir "/usr/lib") - (string=? libdir "/usr/lib/")) - (display-separated (cons "-lguile" other-flags)) - (display-separated (cons - (string-append "-L" (get-build-info 'libdir)) - (cons "-lguile" other-flags)))) - (newline))) - -(define (help-link) - (let ((dle display-line-error)) - (dle "Usage: " program-name " link") - (dle "Print linker flags for building the `guile' executable.") - (dle "Print the linker command-line flags necessary to link against") - (dle "the Guile library, and any other libraries it requires."))) - -(define (usage-link) - (display-line-error - " " program-name " link - print libraries to link with")) - - - -;;;; The "compile" subcommand - -(define (build-compile args) - (if (> (length args) 0) - (error - (string-append program-name - " compile: no arguments expected"))) - - ;; See gcc manual wrt fixincludes. Search for "Use of - ;; `-I/usr/include' may cause trouble." For now we hard-code this. - ;; Later maybe we can do something more dynamic. - (if (not (string=? (get-build-info 'includedir) "/usr/include")) - (display-line "-I" (get-build-info 'includedir)))) - -(define (help-compile) - (let ((dle display-line-error)) - (dle "Usage: " program-name " compile") - (dle "Print C compiler flags for compiling code that uses Guile.") - (dle "This includes any `-I' flags needed to find Guile's header files."))) - -(define (usage-compile) - (display-line-error - " " program-name " compile - print C compiler flags to compile with")) - - -;;;; The "info" subcommand - -(define (build-info args) - (cond - ((null? args) (show-all-vars)) - ((null? (cdr args)) (show-var (car args))) - (else (display-line-error "Usage: " program-name " info [VAR]") - (quit 2)))) - -(define (show-all-vars) - (for-each (lambda (binding) - (display-line (car binding) " = " (cdr binding))) - %guile-build-info)) - -(define (show-var var) - (display (get-build-info (string->symbol var))) - (newline)) - -(define (help-info) - (let ((d display-line-error)) - (d "Usage: " program-name " info [VAR]") - (d "Display the value of the Makefile variable VAR used when Guile") - (d "was built. If VAR is omitted, display all Makefile variables.") - (d "Use this command to find out where Guile was installed,") - (d "where it will look for Scheme code at run-time, and so on."))) - -(define (usage-info) - (display-line-error - " " program-name " info [VAR] - print Guile build directories")) - - -;;;; trivial utilities - -(define (get-build-info name) - (let ((val (assq name %guile-build-info))) - (if (not (pair? val)) - (begin - (display-line-error - program-name " " subcommand-name ": no such build-info: " name) - (quit 2))) - (cdr val))) - -(define (display-line . args) - (apply display-line-port (current-output-port) args)) - -(define (display-line-error . args) - (apply display-line-port (current-error-port) args)) - -(define (display-line-port port . args) - (for-each (lambda (arg) (display arg port)) - args) - (newline port)) - -(define (display-separated args) - (if (not (null? args)) - (begin - (display (car args)) - (for-each - (lambda (arg) (display " ") (display arg)) - (cdr args))))) - - -;;;; the command table - -;;; We define this down here, so Guile builds the list after all the -;;; functions have been defined. -(define command-table - (list - (list "--version" show-version help-version usage-version) - (list "--help" show-help show-help-overview usage-help) - (list "link" build-link help-link usage-link) - (list "compile" build-compile help-compile usage-compile) - (list "info" build-info help-info usage-info))) - - -;;; Local Variables: -;;; mode: scheme -;;; End: diff --git a/bin/guile-snarf b/bin/guile-snarf deleted file mode 100644 index 79026813..00000000 --- a/bin/guile-snarf +++ /dev/null @@ -1,91 +0,0 @@ -#!/bin/sh -# Extract the initialization actions from source files. -# -# Copyright (C) 1996, 97, 98, 99, 2000, 2001, 2002 Free Software Foundation, Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this software; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 59 Temple Place, Suite 330, -# Boston, MA 02111-1307 USA - -# Commentary: - -# Usage: guile-snarf [-o OUTFILE] [CPP-ARGS ...] - -# Initialization actions are extracted to OUTFILE or to standard -# output when no OUTFILE has been specified or when OUTFILE is "-". -# The C preprocessor is called with CPP-ARGS (which usually include a -# input file) and the output is filtered for the actions. -# -# If there are errors during processing, OUTFILE is deleted and the -# program exits with non-zero status. -# -# During snarfing, the pre-processor macro SCM_MAGIC_SNARFER is -# defined. You can use this to avoid including snarfer output files -# that don't yet exist by writing code like this: -# -# #ifndef SCM_MAGIC_SNARFER -# #include "foo.x" -# #endif -# -# If the environment variable CPP is set, use its value instead of the -# C pre-processor determined at Guile configure-time: "gcc -E". - -# Code: - -## funcs - -modern_snarf () # writes stdout -{ - ## Apparently, AIX's preprocessor is unhappy if you try to #include an - ## empty file. - echo "/* cpp arguments: $@ */" ; - ${cpp} -DSCM_MAGIC_SNARF_INITS -DSCM_MAGIC_SNARFER "$@" > ${temp} && cpp_ok_p=true - grep "^ *\^ *\^" ${temp} | sed -e "s/^ *\^ *\^//" -} - -## main - -# process command line -if [ x"$1" = x--help ] ; then - gawk '/^#.Commentary:/,/^#.Code:/' $0 | grep -v Code: \ - | sed -e 1,2d -e 's/^. *//g' - exit 0 -fi -if [ x"$1" = x-o ] - then outfile="$2" ; shift ; shift ; - else outfile="-" ; -fi - -# set vars and handler -- handle CPP override -cpp_ok_p=false -temp="/tmp/snarf.$$" -if [ x"$CPP" = x ] ; then cpp="gcc -E" ; else cpp="$CPP" ; fi - -trap "rm -f $temp" 0 1 2 15 - -if [ ! "$outfile" = "-" ] ; then - modern_snarf "$@" > $outfile -else - modern_snarf "$@" -fi - -# zonk outfile if errors occurred -if $cpp_ok_p ; then - exit 0 -else - [ ! "$outfile" = "-" ] && rm -f $outfile - exit 1 -fi - -# guile-snarf ends here diff --git a/bin/guile.exe b/bin/guile.exe deleted file mode 100644 index 15ac1d63f0e4f63f8db250d0f31d11ce030cd3d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcwPel00001 literal 532992 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%0D--Z)HE_()(Mn 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ℑ&va@0ycFQ26K7yir>?Qcp+I4)MYM35 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

?0uZzMMCFeqwMVaOUq85b4bS+V4E<6Lw?)#^L z)3}<1gO%+dW{mlIi860N7}|v2kg#h`aAbqZf>Z0|+|1wt_UNr;RMn=d2nMg zv;#Mq9FZJvqZDgPk8=UGq>;G4`+xHLECH2_5BwhY3A@AaSo2%>RL+19ETehjviSKd z$xEXhg1TDVaE6A@oqFhjU(on1;^!M@Xn2#9E|?eqe4Ga6Gv_Oj;0;(G!Xq5+HsS6K zf2PqKiSLul_euC32ef-WN9h<`J84}tolKe0fu1syP@p|tO7uVRd*x$(j30UX|DdnBD)YASJxyvp%PeF_jO~yQu}H*mh*0$rYSkX%4j4B0rX>^!V?6B}+iJ?UnGY~%yQu8UhW1$!vK=RQ-vGFRvhw@(YKUf_0=jMxovI{3_k35uic_2gDB$yUt&(9h9 z@cjJ3#z}-^NNVvpjwI3IbG-cZa75W290W@$lQ|q$s>Mc}pNgF`aF!Kt0}r1q@W%@H zU0kj|)l`<3m88^E`Ae%y$Mm&6d@;OoBIAl{kx5M=LH}wRKUB9qzZH75{j?oV?4p;_ z0y^Ls!qrN<$As%7E5%s0w10XfFwS3$>d-XTLp$)TF4Nz1{k@bCtk&K z!Ba56ebdSzR$7^4&`HX6F3byEehbab*S>~dh;Q1|57l;Q|9sMd?~enY1HQWe-wrFj z^ZUbh*7wABiPOM0O(kCU>L(3!cflI<7_}0*v-(7LRxG;PdZU{ywv-j6i>1oyF;O%L z_8i&8HKmDoD%=OoktjO10rHlg1e~9V!FiR)*W@{f_IQr=;SGfMLclv^eU4(u!!G*h z6NcwpT|;|4D&eS~DRWkNVFEEy@6*2eCkToRV@u}S@dnE*QAvCp7R;R0ZNc;AtV*K9 zka9PA#GNG`Nya^9&T0+F4@ZNQ29>U=5~8SdzsxQCE6BU)2EQa#-Ej5Qn0Wk>8hLza ziG20irKOcumz0(Ii>ph<`=#aOLNq6=(~sE|QfYNXak;0g0(j$^vKpzhV)5!5JXw_$ zOXQl;5>N4+m9pfyvutUFyxdb#wzN$0)Rf&_3h6obJbv*Y-drQ*rDq$G^uqkz-mWA8 zH96fcypaW8q5bp~p7$nv#bFu(XNUyOa1uDfg~3H~D7?50{k zuNVQIXdk@D1Wo#rk?TREe}zG@|k&TZEC8nn4>D|=!1ImssP*CP!HL?ZIQ4QKq&3fYzoT(z>wtyCqNXE}_U_!|YL zgC#fb7LoBPb^DNo;oQXMZU?8Yl$_N0UZ*clE5PK2e43cg!BEg(gzR9P_7J0>XP_V^ z_;EQFi^=DV30eheI{t_fF`?HdT7%s%`XA6^y_7(){)e&bAww}f3&p$H(GbOFOw#4? zzSzvG{&*HPQ!Q#CP7}&xDR*$Z_f>wsoa}>VtAcZ~ERD`HoDf71g<1}_^EqOr>zvge zWU%^qoXJn@gUP?{-^bva%%4RsQh*jO(OX9!!^QY9WOHfd-}O&}A0tC^kn<+98L;E5 z%;|eC_F_&Kn#`#_d3y7ilg`r4bFA&;`x`cth|TtHJ96A-8QQD<^xZ?t(&$55?L!Zt zEzvrtew&wIZ63-Cdi#jtU4-q+G2;UbE{frk8yEncu$BSd5UxZ9* z`fh}VL zpFmpbAcv6J6qqVroC7!=7?^s=MW}opx?$=hctd*SI67b0+?km}DHHXSlk}7`V^TiI zQ(n?5<-C}bE=;*EFm)#;fW4IFre+#+Z+*@WZ^v?7d(3H}O6=l_x6=?J;R8?0l29~S3G^L_=d8y^Grc$nkp)&2X z+=V=FA@KWOY)664=05=6+7(~v{JwF}e>xCam2iKRo%#RXq5BI=dOJ&a>@0u(ufgx@ z2Oj(Whn9a|%=iB$xSDwy2$DLX@#)z)f)AdEP@H*ztftuE4)P1W!p6NbFi37oz$OH5 zn;RWPu4xUY1?laCL?{9QD2w4Q)UmWRoWZ z?sf>$73gBD1?6Io>W)s3KnVtJSWVW>5;0%z1DdooLDGH|=4;PQI}IW!_1%rAb2q+_ zg?6M}Xubn7Mm>5L!|NpV-mc9ED$LVXTy`dcidOcbzO+SYW!=1Z3MaaEE(1~2BUqoN z8zdm=HGe2w1=3RuQfi_CL=MJ}A1`o1P{7&JFsH!&DM)fZx(}%^N;`kp1&_l6Ani;c zuG53u!cDVh!BEu)kUbCiU9DL{BSL-J%K^@@W7fAYYumk$^`;yqC{?v)8Tp8<|1%~j zxa$nrxMR(n{U^G=LBe!&wx_*o$S$=w1(ry95ePkurChTX4~*Xb4-l2MT%Tis{tclc z2>J>_o1&l{2>rGep^qZ8)qwi9nUy|*m3~!Yw0rV<2IvY=o#n1&Mf^_qi!A==|9m z6r1}?fo9kKy*hvPDT^ot1ku+Qyg#NSxG zLH~hfSN<~GJJ76BBP!|r%i>wT>`NBMRz)8aG5XUl{hrbv{l3JQXGipThB(u?E!t{d z`HXgsdT-d5?{9~F&)@qwRa+kM_!a$71P!D1p;_!UPr6CpsqmA{HH} zYs(ZHZ{ip+`_|ZfQ4Zb7weOC@pCq60^`%mrRbex}x6*EQ8m_%FinYe7>jzG;h?uy0 zoQ3{P*o#N(rz70h4zX3J=k7kkuh~512KMhBC*y_+mrc{AK@L=|W0wBx*>HCHAH$7# zlKnJUdM(3HXFhF43O-^{`B2n1HfvF)LZ<%B%kZnDbV*qSii`QT=4Re+!5EG7P$we-w_e8xYeEh9e#5g^ly~wXWbITxSE+ z!9C43X*kzAF0-@Zs*VD2dk6XGYg8Lq+e!)PxlVcPHk^_jKNT=!ms9#m%@g_QElYGf zy}&6Q!cbdh0-wjrsp^GjwqUu9N~I4wN)t3+s~>I7;e?Il%v6q=P8)w+k8D>5u*=J9 z+rkkhw76gqZ&)Q#S9ze`IBJ%;y5tImP~pzv5>Him@#0dHF+9SG;_9;EJIhNw#pTtd z#U-mfa>bpMkk}K2Z?tNvMOSzmBE+IhR0q&R`6S6g+0Qprt;zdfaSewLI`?7t<)=i$ zR3K(Hd9b=d+;E1<8f9dAEp7(Sb{Ax0m--xhe9t7Cr}v$a-U0s40~s_=>XeLM77zF<<+%m`pzcA-i-z zbU$u|rfQo{n)};eCWS3B;#J2Xje@080<4-gS_YBvHstlvbx9KsR(xcD@L-W0C`{%& zJ4&0lf(2h=`}HWRR2MOKVA??m@}Flkfe=Ma@L&_jpNeMg%_uAR7kmJS*f=(uC;TFh zrXVudHv>fb?T=BO@B+Eo+)nZY2{CQ02DeTVw{fY#t>^61xpl(sW2`*?O;s~=Gs78J zZsk(Otp|rh>Emja{0Jkv{iv*>N|uD>#do2aXNijWE`$vC#_$bfBSx@cFPf1zh4JF#h}~qhGE5M|NHydF(oBB^|3Ktb^GL5hK0pc zKzehBb1t5Fn>Pdy-&WFo>*MvI zaI!@`kciLcZi^9WgSj@*j;(+;x(wQ&7r64~YR_yzx}PPI#%C|&j9L%O78Ri`%G3=% zd|DkOqv)9%PEfVzMD8*ou|Sq1!3pb6bQ@9Iw_=ZPI%G#Z5zG|Tm%M2Zd?-E-UbD)% zB(>=QdoSBhuaiuPU1Xf%-f)T-m-y7C;AQBq0Vah5Td+f$Fi8}4(}<=v@lytxKy*OG{P@HGUxP6-x!rQn|Rgq^!8YGhvnBxx56cf+u2#V3il_GBlD(oiB_-{R{Vjn_75Fuk_7WuZqz{5cSQ zYL~MV^kOK!7)39TIVjXF8%vx4mMSl!Bo|6rMb6J}$k;)@61MKm)KdtOiso51oa36Lw-lzJ+ccuZ{T$i2a{ zc7{L?eOMN7rB_*vvD4BRm6fk%`AbVEdqeL%SC6^&5qw%mNrg#D$bQQpCpZWR8}B2+ z5}MyQb1ZHY=RagO_zG#ENg@KZZb8a|aUjZbs1UXo|04&1B&>lC?KAT{Cz{k%{7ffx z_Z#vcvK_NI)zzzg3xn=ui^}BP4utQ{B2^>4Ss*I6i)K3-h+m=B#PNHCnz0$fUZCSx z(0`;D_@8dRW7B@Rz7mXFV}u4{1z1MFD1uOL-ZenfSBX&=6{SlpNF#Llv=<5xU5SSP zT{ig8wtj6V>`OPR7o^`VO3Aca`#3HR)Y}EJ7jpwlKBnI8OuyYFU99s5)};SwN$P^6 zfUkHp+ofbX*Wa9I!J3IFla?jx_kbwyO;{=DPR|q*Hlq17`LqvH=nm!~Add`dcW?MY z2%+iGhNF=Iuxq^A{H3$G!+{|;27K^YUGkQMy4NuaUL1v952}Lg3HU!ZK%^Y<(BG}t zDV{=jEEdFz`EzqnFUHNUv<(!WY|I&pLJi%v1*r$06rTvJkGCsczDX_U;$oLD8RWew z7(*p9@p&@1y_zx9BO9k+o=mqg0)GS(xxGP#{uY0%zcCS86lkIlKLzNHSt$so`^1F0 zZ_&Y_VW4ZlSuMsZM2yvj)a%oBC2af|cDj%v$i^GU!Cp}>W4cx+J}Kwp^)GKoarexE zNpR`+$OQ;dXSvjoihFlFEs$)sKxVm=Dp6VK3dRR^iHaOj7w$Lulm3~hSkKHbe>z@7bCl2|M~rK^;*O#VKX%XH3R;XZ_-Xl7oz-}1!Biz zr^%a3zV;Aa(z^|as3+}|d{jLjv!oY=rLo+<5limZlmEy_4vFM;70Ue(0;fi95LX>jRFk# zYf*5R9jQ%*;R}~Xueic9e@5QTz=q!7k^H5eC1k@0o2yQ~J&eNFcvhBHm%^^9zb=tW zJyNA-@#@9pr8PGgw94Sc&>mzNFwUPKZ@kPQY{r?7)VAbPJZR`#rk_Umx4?@=g!;6v zm$74uj5g!dDLr8~vS3hRtC{?k#RNm{%%AfakgEqXfQY|+mz@|k|5YC&=Z>#lzRND? z=L+op3YjKrcl&Kn%;cYfFn}voFUyZ*O~H(-@6x4*Woxx915tDsgsEqaHADyDsBtv% z?nltsCAXOdT1O3y{$T{oF+p2RP#1zGn4rmr3=omu5w|%k`bQVLcaHtQ>Xs#GC+ZnP zu6GRe0gX$URlg_t^#k~Nt*A^>i0bancHzK1k}G z!41)N(l{*9>My3#0jfwEu$~McAW`>p7~I^GEGb2v(!%(+ns^{S^9@p~`7C>yn(0i> zbV*J%i72s?_h>{WvM z{|HAopqm4<>g3arM!upzEMiWkq$yB#Oc8j0><{Oi?o~i46kv5=CGV!1%`Y&>^oyQl`( zShJmVhY~ib0y+h7GbPk+uNzsD4H%VCSTUTJUYj^yyZj5TkMJfU!^3^j`Lsn3gd?f@ zU}-4_n~yrvK9UBjwQglfLuT4X@;~ve<(>rP9Nj6=FJUDIufUat4f1cnm3C+o7q>gm z-&h0eq}0s#1Z;d)@M>;tJPLyz+w`k3)TBp0w+jscGIS;c)cpmXWBAXNrNwt~3u*z~ z&ZSJVzUk-pbivGfSLx~$e{qdJMM6o-0$5R8E|>NKl~l@imak?hEU-R`nlAKN3^2ic z7BOAtbMekm;|oB$J9Y_pKffRxxZ4SXO#vg(bySEv&cObk+LZ3?PN>JI=y?Rh#kwYWqPkX8&jGnTbzfRbLVXJY#K+hfgex$49ZYEPF{B-tY45E0 z8}mCm5;_Vzv@hG!6t11j6-c}9#>bmcz^5My>NmA*FUAhQ0d+LH=tAR<{LZgq7Gw+{Sks*i2>P& z3-~dD9ydWPX0BQU)taDg6Z8Or?leJ(#|_YC1kEx*lT6TC2)fDy%`-tCA!w)xT5p2> zfuNo|1N4FkivJuyhw>Qb5MvWS`0(W|6STKZMk3LB5kGS}I)~r=tJM#j2pgGu>;k*z zMrHVs82X@`6b&-(yS0(|^IxsfU(bu`FJ@ufb;JTlo8PwTeF9+qJ^z_m|`|7Cs*4 z(h}%peNk7w*5eWR+|Ac6eHw%nc3^3dA-erlK|ZMk|0MXS#rur;zR3h-A}Dx^0eaR1 z`4H4@rD?NM3>_OJ1#_z+<13xLrH{G+wQuE6sO)S z1}k~81gQYSeGQRrhLoWZbjahs3D}oqwnA<39$H!H*G>VBNBWx@PrCuvhr78x+}V7> z?zmA5I-uCB;3zH&r(cWS4yE72%ReC(085#%s3ZA_9@e4#;%)tG3WUBm(uyc;2`}xA z5VK2ZeCWQ+3GaM!wO8&1{vumsX9(lfbMSD0P8=>$-ov2n|G>7Som!En^g!e0>=qx# zMW1$RkK-PS`qb^$&rFKIzRWU0D~>v$=L4ISb0R~qbxN1X zpXj^>`%Wn@tyn7gIg`S9lBlng>e40p&ze$cj1W7Xz%%&7Br+EEVf*4Sh;{pj5-%H+&r)qW%ruZw8v0Tz zMk8h#B26gtX3e`L&!@k{Q>iif!}7`%rGVijfVE!d(Ft@O4HKQ=>si5)D>@$JZ)tFpWKjJ?O3h!-Ub5~0%V zdZko8uQ_r4GLdDw7;09%NvzVLRB0T8JOKqZsJTfn%ajm07~HW^tUFXo9Qz>hl}gE~ z4?(@H>MjI?jo#9rmIjze|XQk2#$vJH*H(CBd(rSw=w;!qb< zIDCiQ9E72K5D20)BR*so;5P>U1YXum_%Cw9_{d@I7?EWN7IbtTJoDiK7 zAN>=)Us>$dMwU!$!y879;1<|2)fk-<$P;YosFPrCdmH}4&tl#ViVNW zWq@c*ojH!^Gk>lRLs5N=V2I|)BnJ~;@pB#~leKmIhhzgz4~CHb+TD0ao!W$h_Hpy) z&a^h^`g-yWt|Z={k=7>vGk6*KsmYxQy@5c#F|;lGSQC$s+ov+#?3w9im*r zyaV~PEwywyr?f@s$_#JMWAJ*KDv&yi@5xrxnQ=EL*NNhiOC4%lbH20@CsSP$+P;V8 z`n1hnDCz>#1<;9DovK6J{;8$6N@f+*j(21%F#@?FhJx0GxJ=)J? z)L1k6O*(4??apNMJJX3@jTw`TS7RfQGZDqk+0sXofvRvFWmsK*7^#NR%Iwvi{2K4@ z6HsYDh+2=S>mT)?)10{?vtFM;Zg{km;Uw_Dw7%24dB&Qq)?v2wci7LUBd{>_UMeg@ zROkn535JL*=)xeSH8BID+tT{zFo87|`p8_ z*zPJZFm)^4d%TVxVT{L>?O%El7Ue4+h9hRQhQfSp;cxWwtwOCwJk5 zQ;_PWU)zOXIZ1^zP)vZXLMw081TmB(@uP2!YRY$ z9BwO|uN^jl%LZx34}>iT(m$5VB!Om-U{0o}`6D~|E-;9T(Q(oR8_qD_^PKAMJ_R+t z^{OFHcwLGds;>+ zOg5UD<9a)7jWBMZ>+Hg~T`+l z_v}Jii+pPzjaYjf3y%VgsKG|;$e*u$%6XCkr_#{MFs3x1r&~4K$*($1KqZ2W%p@lO zlC*S}C>YyhA8X6QOys>F(IsKXlcJE4Z(SYdMz4etVLAF%nF0|snpjh2=^Xt7`KK~;pvV=lS`!*8mizMa_{THVr z(J=CXNyl)wm)d-qq@9i!btgrcU!tq}ytyF1pjWecZ%FZ>X(iel*k%eoe>-e?jKtsZ zZNx0YZMmvoEU>4`d% zP2zINARfs!PD%n2gY-tXEp0{&bZxQIEYA%Yn5+j*#gD|?=bsFpbG4)%3m)}*EQ5?Y z5=s6eVRnb*L-^LtdD--Z6~?1a7j)}j^m##mY*R)@Ao&Ng9Kz-dZkwXnp;m2^E`DO7 zi!srQn8?Qy-Q>VTi%l8zcQEc;RHiH6vlqK|J+igzs z=;Ehk; z$UJS}+I#F*oK-?Kcdn5MD%_sXPc{q29XgK|k55}oCingy%@G1zSvh1T;Kg*xm z^nfibBwd|3BkiL#UkCG|OBxeXQhub~Wmj5*L*ef#lHcpIK&W@zC_>RtuChJt>ow=_ zG7sH2JMHV*ugO~5vpPJ*vKJ=jkS^Wa)C!t@FSbZpg7rsFH&|G)(i9Yn9BXoTzt1ofx zGLdEb*?;w+4<*Pzs;>xLSt_~Vakb&qT$zcqj#7NF6P3xR3f;XjzAjQbf?^vk8-#JP zSc9pHL@)W3z$M4Ca z^dRI6P&f>yk5o!p#%)&V!JHE8*dj`9z=Iv@NrgU0BiQ(`yK^T8K<~c!PrLB#E*c%W zGzGJP-rw~fbY7!;1;fo(>~LDK4hEmY;kaJc*CuvLBcLlZUqqJRivOVb;!OmsZt`|n zRoYDFRLIiVcj!Zi`s}GRK=T>s3)H0pBHx{1tWbCK3dOJ;7=O*y^*}+_CU@GwHSd{z z5v}X5LM|_#uCG6K_`@I2$*T~BN&X;LEiSGpjd?U=3%6A~v)(frMkq$nZ1F&x|A+?t za#5e>f6X08+~@kVW3^0s3Igl%e%icJd(`2 z!2!>8d!!O&hw@$n^cA)fhjBkjJMXU+-Qcx>+OQy>#}oOq10ULjO%AAo&dWhSF+m>^ z2;U9hZOFPsZiK~QC_Q_1G`gSUWC`ep!x-5S0H=PU&O6-&{e1PemcdPo#x(a$oMn!$ zcn`n#mapw8rSa7b(FZ8am`Y#bvtsZwOUKWIRklSy3Q=(@lO7bzb{5qej+q-}Dbs3J zFTb<0+-k$#?O)_3?%oa^Xv8h@z7&In-(rGZM9^I(NQj@QpIg0&AYY%L_Yrh$pCHmXq5?)1{xsR4T?- z5~*ui<79Sm!MNV?^>>!}A}cdulz9;=^Bi90U`Ah!lC64+=<^$WOPZ_C1z|IB9PF0; zKAGL0x0b2LZD7voqqq<0^vB$187X#INO6)$hp`popEKkqy)7eSsPRCwEH|9WL5n3{PRs5zzTg>U1 zmB%vs9zB}*`f8ilXctm@f{S(ihR!RD=(X`XkzPiz3qNoDm)M0TE$qVgZ7Z$u`<|t? z{t%8P;a_W_m7}rh`T|ooq6?2>!T08 zwdZ~b0>y6b0b+nTW7+snTHN?3?TTO8*&RgI>@Il;M@v$4AL|#zM}jWoC#a|O3nF}r zOpN9g>gPc^C#0Dr*83u`FA7zZ_C81pvTpP8Fza!;H=Iz1#`e|-hGutQ8?Rquj|2z8 z#*E!wrFVODGz*F8BuF@dzaobmotlPJ4Uv}0EfXW)>N~;am=-yRgFaR^fde(`ma6ajWz@*m|FvA=8 ze7E_3JPODEX}i#SbHXGTwt$i>embiAa;SNE2ybSnfCFzBkl@uxMa3~T>Wjb)J(vmid{e?i1f2B4o)ei;3%I~RIa{lxd8 zpOiNHi6~6u_CFnTd`xbR*d2FU@NrKpK6GZyijQJ-1%@!?5sT9bx}>RwJrk#+x3xsk z(VJTExKe2gpdrheCc5SzD|biXD|z=1##bNnEtdZDhqKWJ z&iiK>6z2zp06 z-W7Ye(Qw$mY9zfTwq`g_x@Hu;qrE=TVkF&|M6YSn(^^>4hSBtn_JI9n(nro^uaO}B zktc0EkKWO8f8Il7D*u!x&A5Qx(MYXrF$6AdU$eASVjl7iSg~T2p34T{DDJfnpjIEhEwuU*kCZLYTMa(vCw|6HSvao-%2M>OI z+6fGc=G_Z2iRJowk!!d2O-#w|c_(b#g$oyE>M$d86fAMW{)wMyVUgOee*&|hl?zT6 zgV+mFXC9vJM~SIEt!xQ5Tt?Lc=2RWPo(Gx$^kObb$yNc(9nGZ!_n9U7{8eLf1phOT zwNSez=n&K)8>i<0v;U@Y?Hy=B8CNn{zg&)hJLupXuQ=Cx_bT3PK5ZIgQoJqN_~Q<8 z+0umI+7{^UgV?X!7Ij2Y05Yxi*b*LL*V^$+IQd>`uhOP`6!_F3jl4S{aMCWtO`ag7 zX28c)_;Fc=>fU%jc5d7!C2#DJMt!?o5F&zf4)hOy3K98}fab`^7}u8J)84uX`s>|^ zhtWQ*5gQ}7)YrDcj0(R#5E6g$Yt_4rq{lS?)Wf+9(pGfvc5_dR(wIit}BX zN7RBhl@a((TX-DxPi`#}^W-)u&bmWVJa!h3m%G`}<<+zEqc%0)Ic~esTA%nfqHo;x z=1=2n+g0y=bqwa`s|B5Dt+mb# zyVk#mUYpZe*T%!|x#TaLOa+$>)^@jIq$<_hin^tpZZ%(Y*%do{K`rnK9$>oQQyYJB z($iu7%{NjfsE2KH}pgYK<7E-6=?kYAy^$ z_grms3A;j(eR*)e?(EBvURnJV0eRi&(m*e_UKA&8AVro-;QL9q) zW_{6KrKqV#yqBG)8_5RI{LTo32Cn^7&Agl)V2pX5n|lftRhyCJ!w1nZcQeK&Y*iPE zcyL~{U(IyVn>KZ!i{2boGu`y2U0s++Z;q*%N%Tfj7ber2PBqWdeA2EIbeTi0oZ!w^r0+mOC;!b{Ujwv>)Ix^;X!?1_jYvOta{77h-x&S0LwaQbBc6LBIKR5tu#DJb z+&}yuq@R|>zwyuiTS;h(Af2ls{sG$uZZ}Bi5Z$*4(E=cednrZES1cg8R&$|^4NNqR zEojNp_UA;?Sn2MXQZgr4LZn02oKA@5cQ_r{JCV~7G6Ll6^Uuby*ZEO-bSQmlr_~aHyQE{(VHV@r#D8vrJF4DrdlLJ zFAKe?cF`LPy{S&5Hx_zRolI{`dIR%39ptSYe6`<#BqQj|H*93w(Ka%${LwA$o<(8i zpVN|6*MI2(0@Hu}Si}QVn3&ju`YgLo`+F8Gz+J+s0J98jfmONXD6BMiIg{KPd-M#; zCTed%a!v@*mGds8wu!T!SpEFVnYn4g#w9>A`!!3UbC1c8D#OOkBupbfT%%7Rc4sf* zN3zcIF=~846O4*aJC%&?w}#HcM!d;(;t3WSy@T9>5_x`2U|g`v!UgN+EHr$-yRR?W zoE1%*D{r&VX3S>N=B=4{UT>w%Lt|(&$ZJu=dA>HeT_?^{&qA4jatFuhzT*nDfES3H zyw}#F$b0o>6l&LIvg0YBmD_x{@L-Ml3bijkF({_goL;n7dNWY_rXXDh2;6Y@ zR?2xP7Vh1-nF#06Pl#|@*L0{pE8?rq20o}{p<#dW)l4L}E$oamPy2Lc^osAx@{;{C z#3LjHDRM=bRFhIwins338Tc$gd#4iy-`|h|gO|0MnXgX016@&} z6QgcF{?x{^E(E5Q6X0Cp)Vh4y1)t!IhMDGec)K>2k7d_vU&69Bi!5TzqO18?ui*C~ zi~ZgZEDFyC{M#lNprr`fI>b03K4#`xj-V$@P@JsBLni$O#6SQEgk&CvtVJ7HTW?dU`;(zNhK+lddPQGbP9CkU(JB3L)?mj(2 zxC6vp8Hbp&oPk~f3G!)c_yZ(r#32~xCC`=KZVX&LqJ&|3Tr2Q7LEJOQd8UW0cy?Ir z^FNmWqq}n>jBdVmdO6!!FbM(l?|kjKjePex2)hq={Gr>96BS|2y~b!RBxWu4X%8Kb z_Bj&8%P$kOFAuYM6N<3dn>1j5UuTaNB79nQbU6l&UWNSF;Q}OP3heW7<67&*d*K^< zsCx``9_Kx{Cdn3kF0YkB0mcz8!)?C7LBwg9J0fiLQEk4%YzXz%(xjZe&d%ESTnFAW z0NSIt^@<-hUIBf=W#FOLtIXF<)yqO6mYDBc=sA=p%{5=U(f3_jUn_lad2vlmO63w` zZ>M{~Xj(lW5E_thf4NA(OrA}h$@nkN#F>I{-Ath=m3_CSMn5;+G&@J=NEh|k1nW*67GM=fvtNq0~)3C1CwS7cU(JDI0}EhN$mR${*8Zq!K*CaeZkjTzWajf zf35w%t1RjMmHNL6uKzXl18?|mmfv9c{@)0X{-+#bvTM$q99$5-*!P7-6*kSkQo=% zyY_mqAvg}!Y%IWr0KBWG#g7fc>Ttwi0#zW#Z;)P{aq4;a<&>Q2i~$|!9T6Yh(q-z5 zQH+JAdqfx+Z~)NuF_mW`^gDPLUw<=L_>5=M=q_YF-Db@c*)^eAz(4MUU4#|n0M05; zOISo9yNHe{t-(u(!|Q3b$pdJpg2QQr2VH#q(vvkN&{a&oqf)$fHJ;e;5USGMNw z8T=JU@fdPD9UQ4*IbC=YLO1brlMg)*pgOTyvRS|yCpG95>GX=KYdlGYDe35b={8Ya z5mnJ4HJ)9*;$H9u_XsvQUg-)Zp}w#S?>T$J(2}%*u>3GLU})i-8!%sG((36#B`{^h z%$HJed07dML6~BMXPl0)Kzh9$!#pe4kgef{&Q}h=M-_uMRBHYZ^Plk5icnjmU!@cX( zhMnNm{uSAUU7SbVfZ2whCEKA8&-M$@>`*mo70*M`AmB2dlME`_tuu z!J!rU@5B6CmqWGJKF9(?&i6lr@1DhXQ_ESLNtHsmtj~$u0l#)Hw`qW8lcGtI@bg(GC`RLir5U$n&}4LyAVOg zOi;H8szT5n6ZE_54G_((7XcLIx7dtjfwOHvC!sH2yZ00=S4P#6bxAj0yL;Ig?hj_5 zZr{9vyx#}($f`)c0rh2DFyIZ3*|Fw$I67trv#rxz#Ej|TPCOXOp%sPsnqX}KMyr5# z;WE8;yQSJfUS-cqmMRAx51W_ntaTQ!i=Y_l@vDFKQSYXcmU@S=dN&&NIvV<@xYk;6 zLx-het1ThBfS6&{bb+;|Bv#Y8WoN;!Uf&RFeV+d6GwxLuYFkfOY8u4eZSkM!J6{pM z1x!wU=|XKmUwFFXMDOug?1GqnE$T==2^- z`b0JJ6c9h*j;ZkBiE=_&VDUXPi1v{VjD)F@XF>{%xv~Rz{rh1RR>7Joo7(^1{}2CR z@PGBWzk0rJ{b$S1?GIvX#odJ#r$LvhHne%8iFGde@7>;$8S%&$s@XKhX5bvlFwS&{ zFgt2k{4*zuf7W!mCmZIkQ(4#KU=TOVt$z?Ir#gij+*Vi>UyXtF`neYj*7 zjJx3${vl5%|6fA`($6oan2T@W8VI1qYt#9CGXzt<=3DGjV|pFof**I zpZ?g6E}Z2!)e-bG5F?>)SL+5)a~jJrX1MmcN6b^Nqw!AXX4VV|vXhx|m9#*!fz1J&P^&X86`Ft%4bo z-uw?|AacP9ibjgB>t~JiXfieukiq9s{)31pNns-ZeojSzNs=FjT%`f+pt} zxqdSfK#!ZC39}5)%LuA9LFFdsEdVv0p?&HX_r z+m+_PQFcas0?(+gkWw?@<0|~PEK?n{@h`G-;~pt_g^)_q%-Q{j?Bz) z+w*){eAwdiJUT9K0%LbVadK>ol0NRdknfRU{^$6dB=rAuIeC}lXHP!uOonmmXvdXN zw~lz<`ntb`vwW^TY8k9Vx$uA)Od*ybHbV>+Y!6YA}R0uiMY}PeAKG@T9fH%1mbw(K?o0Ovs2HqhL zQ8Q1YW=f#@UE8qi%~(mG7DHTYw$ogOsnKyS{A_rO{Fv-Yl9!NZ=WPDet`u}C?*k?r zIWDE;%1l5?r&17p9^D^G;{wgF$vNqAqLi#;In^01B?~jYH4NbESBb)!xVI*qwe5EbcGkgvt{8oWx{<0i$J3%+*J#l$~Dlr=Y=G6*R|e;Dn=2iJ3qZB zaRpw4QnI?$ET@tcQnOr2O_!1t4(#ZHO;)AQZ;mRL(gn?C4UP-!3I&${q$fknkjgf! zbyCyksreMEc!DL;wS2LfCpIFg((LjmjMoR_u;CsjiD(0$idlGHafkbsgpK2E=+KuM zpY6o1WD^!(_GCgWj`f2x0=v3+6)Dy#JeDdFW2z9b3ReER0*z97l{4X9G@#L&o!Gn5 zVEk?eS$1VJe8>B=%L5b|Jzs=I@Tv2|8zJRFchak!HGyE3I>(tlWDU$ZX$J4qRo3z@ zw3IhoFYiQjaX5D3`Z--r8l2Luqx9TLdzlQ1?fH zIfHYst|ZjGATS*aUs(xtPYL`Sa9VNLkl2~yIJ{h+uyHGmRks5QUeJxSf2g&=|bo#K+$RJ`q}5u&7R=ySS}%_++~FHNs)uf0PlIE?-azukrJ8LwF_;n?}zHwOtzsb#$n&?$`DZVvSBqN2DVwM_prmE?5H~g>oThRI4FP3ui*W- zsP|~E0;^90@@o&C!|maY?dH~wy2z%q!QkQu#$@%R5(@KffV%h*o}9k?Wz0f znq<53PM-2nU6T~2ywiNro`>-!?5Ry464{k5pVC&h4$SU3mV2Ys#Z8aMm4K zdl`2&DL(`c=hBoNjD~QZiR*7l>dH_;!9nJIiTcuQ)~T9OR$`o8=Q>jlF=8S+)e$(& zf@_fdT8dV#W9j5Aj%HcBI#&!9H>AhW{JI=Px*gUTHtqwwdGJN5a7eBISPm~WwCy8wNjiI{7)jPAM3pV`%6wvVJMVjyw{BpkUF33fJ3}5pY8cV8+mzPc#%8P3xwuV#a zjfDmmI8%FYE11Ez0>Vn1x=;*G=SaB>o3|?pDF@ItZHomd$yNXX9G|G#zq}LS_)`Vo;J3}dIgD4n^GY!zq7Pj$j+OQ>-Dh#NU5om zs~4B@2jkd{KO1D!fS0Z)tCaP}iqcgQ|A`k@rpK0|zbHk0QL%)=IFwkUzph+STD_#a za^-ZPYNZU#sG84ai0SW$)I8n(dHFDI4^9e4eA=CZ*zuIdRR1($3>%-8Jk(SS>57R$ z?Sg*_Oy5;>4yuGcxF8(ajH4RZnGs-SU`1H?sIMatof=(}EaRo@=Z{a3EG38$tGyZ0t0jaLFfN}?7aziR7KV|etRKlLLf~Dt1JOT zL|GM-ut>H}*wds*f@s8$bm#;~V$w}O2?;ihT$*THP{(CP#%0`Q+COVk%=dr4$Ir)b`_`|jZq=z%Ri~;>oufkUtI#(H=~Za{ z)e6*%(6`^H>uVM2hNOO9g-VtxkQt%pRH#*j1|xL03T?YafyNF65>d){+1@W!3_o^30jVF;{-iV!avE4)j$g#q;MB0au9Mf7Xu>htF=Y|E z<4E97*?NH{pmlgZp)hO_3odlg{hK7?bgQYWRK1icTzQzr6D)}YEAoiWw*yhlZm@MMt0fT(b@HXzP)Ii-@l~e@|ge6 zmxm^olupVM`+vSXG^4$o)p2>^+n1*!WqJ6IFPckTxz2H`a@G~QoT_bG{9bWhUMv&Q zWAh8_tMX#YO6<7>`31Qkz!euwi``%oTt%h!+~O5Q1vlFBcqHe#5<6jK_Eq^Ttc(`k z<)sD8yRLlR6&fK2UA;p-1x2yWoPt%bbT7?WCv;MH_)m?*KfT%o3;yNySX@c)AjpeX zt$q5S!ow1!gZc&Oj%kdmsJr7IUCVUFYT+r3$b|m9zwQSUbGqvsLK0|GmelYeUM@Hc zaahEkiqRLcY)~gP#GuYHBbrZ&a^DS^Y>gRMb*jvHMP+!^sS@V|U$?4LF6YH8->APE z2dcKrJoF7iw)~B1_{P@c9y;T5QGc&>`!9~VrH76bq-(EBCjHM%%aVm!{-^!jRoH*> zud$Qg@?ReOLEWP~Zp~WEF-)o8(?xp3>An@i;uWk0u7i9_E^I?}8dRd0cZ7arS*76yt|P-%`nju@v3|9zps0YZ zr@`-8{5ft7_YmEFjJSsRt)x*Q&AT+g+Y+CnLv~CR0rb_(ZY4scKjSqLPjTD@t z;{49xigRkTqp5XHZ5A6pI^5lOpSLoSrFZ=Uvf?H@d5+7)7J$VA%t`e@o)g+9W0|~0 zA0!vm&wBR3eED-=_&zc6S+sJI6e(u6`d$V)*^IOCe0g?by`d7~r&|O2aJ_s#jb|Gx z=z~$7$;?W);-pzK5c2&AihuU|huRFZdx@?{GEmx2w)Gj&rqRSg6Qg`P;+-7eG?!Je z2Hn^3?;NIPO2~VQ$bKm|NjepsCJw9fbr)T&>N&mh2Gli<5Aq$ao<>p1=J-Iov(S*; zT5WuAn85D7L@Y<=0V$Dq^i!QU>_UHieBjpXOeGCjoa^Xl~h$6E_H^%zvV6y^U&=w z)f+H1Id5|eydD>dc$Cp|i%t*?sP7C_m7kHY({)=i4maWvWi4J9|7^Ty-kT74~eoPycM` z7RzDeX#?a_y?$!I6NvH*L^lYm@iYAKqFy~yr0wumv~0`<7yb}B2-5Or2HBkn(NMw} z4Vkhg57(P%3R6ZaOi9QUX}A(a1?Th~Rdfq#{`;uq{NW(3`~v*`ckIjcz^~Y@?O4_| zG?;^`ObQ1@A$>Irt+H}3Q$3uAOm$0l7=5k%-ADXlMpJzvW2?j_ajCyPu~lvvtFb%G9Dvs4Gp7hg@0RX)v0plHAs+dNDkw(F5d!KKAZCn&ic9)FzZuBi}FD}BlibY>kWZ4XV}(c zLz{1?9DPto^bz?ePs}KD4zG-uQR2M7cOjN{hRZdWtU)(sD(jTewZ;dM zX<>EGl=jwRg)1O3OK|{Nuxfqp0I=)UN^v*qaF1Rz-sf9XLz>d9V$8ihi+ujU1jDcNCo^@C%pKckcRc$fze@}9rjp!mwMs934qqc33@_6{ACTp^9&_}PX8|*JAc(QE zY*NZytpQ&&mnX6uxfpRdi--Y*vC>3(Yt1S&XG(c@$UgnD3a3f^6oga~Q#IgK(#d?S zOkPszDlRK6DHk}Y$qkIW> zFysjyA=+^QU+xr3@S8ug>tMx1DNzL1$x@SAp`3~|5TwD)e`o^_J3Z5j;qiG2;HMX4-~80 z{|K#Dp#ddIG2#)*0Z84$SMFTEh)`|3yxQmqXYxe4Rhq6N0X6x)@E{4b1ZF~s3#pp@ zIObw3=svQ1Rpt_7Yrvb->dlr$1p-k*NIZ(eLu3}?-PTr zO$@$m$Tb3&6ta1j;=G;Ibs673(McIcDrFQW2H$Al{D57>(FA?Qu?<%GQlCRQ>OGFb zFeW(0Vvul1C+jZOcf;)foH!Zxx8GRf|BakcR+@|Jn{uO+8A1w$aMsB>3DVd;K zRjW7AWZm%q)o1TItS=fQ+IXW;8^dVb@dm~C8;e1qcynnKbTon6eb{lFqIf9^$Lpj> z8GWD7)$90>(Q2jrk>(`wVuu~Zy5nhzGIyPF6M&tNk7G-JXMw#;SU3lj8E_sCg+M|J z3RHsn4LYuCll(SZP;3 zA_nRz>jX{?ahIT{m{0AH&|oCWEm3-GcUihHL?$!*j?P=`}ozKN~y{D$Tmb zz#XgMoY_s7T}-`4QDk>7Wznyc3} z{MD%FYclqZ^2F%`c_kX{xU~#dq6WqUiNFNZHe+C|%yp5dT~NEUE}*ab79?}(2Hoq$ zX$^}YZ}C*!DSZbm5zSjd`~(s;Y$JN%PwC0+?HVO*yWA+%+to%fD~<9=ChZTNWxI6Q zEJ{ zuAv@XjLQ7>29XMt(})&BLukw2G6dj}0);!UQ|ife|he!)Z69Vck$is*dQ^2K=3nRIJ+FBsTimM8W@YgEW>LOuzsXb?9NinQqWnau}aw4KEgZ10P zpUq+Jgdg8P`}FdX&hI!30aPxlbc90v4xv&B@~LaTwqa-oq9_n}_if9(0zcd4S zJP3Un(KtdsLG)<_bu6h+7Lq?9Jua_R>eN)BEF?`RUJX#8iKPlelGo{-3UpVQvecy^ z@5oNQ)~*-d$LWB-dk4)5w_%^cU+g?Zy6v`h{66_Mncquq>xkdqu>NQH-B1xJPWM{O zxSX)W;LQ-rfX?RX5Qg8;*g3;<;ci*b+HHY}$;kZ`8JSw=%`0U4sv&}MI1`ka{Pvbk zx$8}-`cI*C04;fLqLs7+BQ1SSSV&z?3s2{9QUmgh70EqV^%k?kpC)aKoEo6Q{c42zUu61O+O z58YnT(};7r$Aou1JjW5#r1err^>zW#?Qg^HxLr~1b$B1nO9?OaU^ciLV%{f3J!3I@ z-)y2|;#MzxAYE6Vg$|Lu88LwmS&$*aEN=f8GvAImh}-v4iSSTs4E+Y~=pJn74dS^7o*;*2Kr{+AxBVon-{W?>gFw{k-;@w45NZ>m$+S`nD|}qoA|rhI4G`ujb5zxzJy#H*H%8PhIeGn zimdVV;t7Mx9M`ty$n=O`o`b(I9)Gc_~O*{cj2*uGgik`z* zo59$m*{1gGSvyzH2a@2H{J@ZHjyvI;<)!qq;~GmRZ#8e({w-F&PJH*$40H9mK-{OL zW*E=5>bK~`eGnA)Y1xUb9*hG4{IhozV{cCU(m9og2o<#tE{)X+R=2 zu~Sb%_5;F?*Y?y&rslWwF18_IV0g-SkSPwL?c`t!x*?}wHnG`(1WWhI_-EZ5Azx%#o{3|?q ziOsKA@kh5;YT;omG^V3#L_GLjN~O? zvtbjp2`}+BTOv_D$AJ}{8N=8*9k@xl@e(}0r(4;#;KXYXcj2|yA~zn>xSryx0?&tJ zy{ItE#!`Kp0At`OUDU02ur!udZ<(=rX~1(R>Q-DPRac;4#4MPiB7yh)@)Q;24a2Bw zjPpE)D!=e8VTzcUVzcaCK=HSSGXwb*#;@%k!}PnqGtnnDki8^pb%`+(Yof{j8L<&_ z{wl=R*lK&}3VZN=c!n7zb!`_L!@AhstvG%k-j*yhcJcRn!CySj^yiDe81n2aeeD_W zy&d57mPSqgY7FULjUoN3F{FPrV*hHkn8TcXd7m;{K_2-du#a@nXg%+Gu5huj;X+t{ zah0}k@jydg9c^0Jr2db~4v##wmGTJ-W#Ae`B1Wdv^cRfcSEJwwC`CyhrAUEh=wgks z6iTN8v`i1PN>g6POS(RX!w#4ANyhR%TM^lw z-f6c2EnXg_SBAQ~^s*kcD*}i;h3%IUz5nu92lS>4x?RXbI%(5m%78~PPz0qIM@PaC zw7|^#gYXff7aK8z+dzJ}9b|+q{(dj`v6}Nsf4;c<{m^oRrf)n0{%Z&L*~)v~1+C&2 z;sR8_6)lat!eY>mgPghfWk&(1gmu$625AW*_&B zCw&QszregGDE>`GC4L$2qi7r(yVy{7MUzmuhki%nZ&xJ5@%59>$FW~_$8hM3H=$=E z)u5c(2Vt$$rjNR{iI%H%zG1o(`&w+Q)G*C2FfEey;=Vxrm@hJeLSG}(A5CI*qxXyU`7zaf%_#a6VtVx=){K_uN+fSUD&Fwt^+AsMe|LjU42X&R9pQ-~fw zj;2NYvocAdAWWQRTu7GxkSv@+jYO747@R!Km2c6no}OkG;y$+CgCJLgr+Gt|7g~{A zJ^6~D@~%|e?HmZg4ikFFOr2L?w#`LdeTot5gD&f;K_XL114W4-m1R852on$ZM!4H_ zXv`HNLmRBYeMN6?Jo3@iCsG!;3%p0OLKv>GD~WcW#5#W3_zyj~-{DJUbh?v$CyZAQ z$La-cN~Z>Q>&zh3MR~II+^Wt4J7lAjeVG?Nw6;PCPYp$R&}x(IfYL}8!$!JBh`{8t z#_iBYy7>FO;2)o7`t!v<4taK#{_q*_Z#%%xcDw^tH(90qErEbx=gBgP6`USff}}8f>RNh}(bF3+?xa=H3liJU>KX_?;@luaX)5sXyvu zcTE+2)UQ+0aQr&olz(A6$_OS~7MjFw$NzUL{C_Xdsf)kg3;ywWraxc&N#7!#lvwt$)1yOCZotZQ%MUazBaktbiciSDLDg4@_^s*z;Hl>3wj+=++()cJmfox<0vlW&UNo;(hl}IZ*{Z=W0Jmker z3QTIA?m8ZITNPwIJ-e|oAJv>Pq-x`RqU9L*CBg*9*y1OnNnVNcfoNXieRKiqdAH@5 zG0E4Pf?kt@Bx7pI^orw^mq4x?UiS6UqJ(Vto(J+=l2S0{_gJ3B%4oVw_dFKH_=QdW}aS&7{)VoRZezoU-drkk{lGMf&O&rbu6FWa(?% zc6C;XQHw!I#c0$&=Hl1nZA|=XH@!sj1CWQ9y@rxM1CMm^_j|z?pJ)2>#TSP>J4=84 z8SoVy;Ah+4+5D3EBg`*F`aryh9TIL<%J&*>^V&Ofc%`G*Gnn#iE}2PU3zXhH;U3-O=yOOSPR zn;hm%T$hw+Y4d@ChW{>F+(bwA|cO>9EWWH<4G_d|ro<^2!= zY7pMV-|q!K_Qd(6KVMw_erP#D(>I<0|Fr}B+~(um-)am@YWA*W)*R%Occ3+lN!-8I zqz~EArr>?u^+L$DbWg^H8=-JjP@Y@5`1`%!_VY}CzPLT)*;)FMGvMVN;EVxd&yN36 zz77OJ^uF<~x8h0BE1)H5Z-Ozfm-!ahUONhX@oMfSXydn%m!_@~h2E#fR81sw@-uRf zC?CBaIgMpO_>6HhAMt77x;(I~$WmR1yT{i7>pp&{XpAZA$EQ6zN?Wq$4gJrO|tL{58pHHH- zpD7z#Vyt9u1O*b4HC@_CHg*Op;!Z1yJ24Q?3|~i4Jl!hYk8#kyWUTn5cw%~XYt(IC zlz1uzSKfd+r500l%za{pzuNc;toLj9?I5;dhpaNpvf$GfW1}1sDH`u{TbhiizCO(U z2TCg}&~Hphn(k_?91GcRc+qDL#tCD>kD60z62|@Bn>}E9_F$BLB1tYX0h9zG8-7rg z89KTT?r;_tl?g@8Vn>;PzgN-kRYF0L-8n7?0u=L;%X9K#bMo>^?PX>1x_kilm!s;^ zqOGd*XP7SSYujlQdXS1(k`3NE4_50zyeBg3QC0)b|=0SmpFwqYl<~3 zeX+Hjji_wAt6gttH46L&xNPb_fo{$u;>{VoxDU-%4Al5X*ftk$l%wl$9p2WR{2aT8 zGX|d0U3#2T^>jZTXH*J|(kc7-;um#odVWW>59z%aSR9`~_i4ozG;5T=?#M(|SNOeV zi85sIJqHRbsBv>{n2{di2IF27<_gpu&Rndmovx0o4>FVwce*!Q4 zIGOH|k!7_afRt&amqO@t*Ia>0O8Fv=d1k1bxHoPur6`QfVkxE!&}&k7Qz6ksl!(z= z+*kLNx%(cbSXL*QLz6f6*OLaEfT|2Qu))tj+(+BuDXXM$$DqV54!d218RaCHlwCLFW4s^F59cqWm znO9t1BqXIRv{{A3IjKQ+5G=e;p#qCv?;KHShLT5Zs)kl;SdRNc%`n16ZTcG&s3D!+ zVOm3xG}9*OujET8Xc}sxZq0(u*~hWvMU*sBbTq|Dlc9;c;kfOor~Z>ph-CoGxu+q0 zvxpuz@Dw8)>QZQywqzP)Ju@_ZiMQ9%r3=*awas7Fy=UJ1rP#Rn?R+s&53^-{J#=Al zsj*(5i^zK$-q0(~aK!8;x4lX491P36Y&UvJe2E4vH04dj8`V$o?wUWdQs*=~ZiV8r z8!XaV=&DZ;*LSazdb|CmH3Mrp%H(igSQcuDFi1lL%xD5+B-`gBO7vDJf$1M=g&uKA zFJ`n7Ay`HWX{*?k$_ZYbq6Y!t)+w^qBbrrJ;*MZ(FHqtdAntO;Pdp-0cYt(BhJpO9 zn>_&(o)~rC1RCVmhxZq%%T1{0TDo!dweTtDi=uNyX(zj67_v|P_eF`(o zX)}5aKsjA4mMT3{I<(jzOgdDZ)_-fv2jy zMogXP92*b+jE?u3H|=+sHht(Eys6pQA4f~_=2&aQpXAL^GQ`J2-Nqb1UwwM9k@TBT z_+Zv%s5Wm#Yi;@E78e!SbDhHSf}%VD_kHX|U6{J2|1xBI)p+HRi$}5fIjaj+t(%6H z|1|m|rhIRBK6d-Tl~MWB@ApGV8xmlgh1dShyoM`u%z`EkD1`=5%WvWpTU}9-XI*8#(Mx4?}ssZ}aOk$OG5@Koy*9mHS@a(%uUrp0w-(R|evS*oA zr^3Re=da|puY-J7uzbn?5)@zwy++n2;msqV;Sbu+=%pLApV3K|s-N*!r|Ox{PHfrV z;-_=hKU=VfzA16+2Gq1UCDkum|li)&8b8o9>(s(YCmmwRjJxNCi93IoqZm^#&B+ zv0uBS7sa_5;xOOF&Oc}`6cYFgu!Hy|(kelv)!?+wXw^G}R>m5ISfi~nu|8kOi1j~6 ztSBTFed_0*Q9kI1T*x~4rNyhcj?c#94`2*SO;#p%^-f|g^%~Jqb(Zv5{3d*JbFROW9W7D(P654x{my!Lvs<&oux>2`Rv~2Q)*LbfnirJes28jQWxz0%i*GrGxTctF^EjOTH9K z(+ulwn7uvC>$}s9(74@eWC4~UP3fr@;=ZWtj&|bTTho{7Q`iru9)|Y?d}D=K=`AQv z5W;Px_8g~U0)*F6m0wR}-zIw2qARr%;)Cl0czbt~)MJ6n5MILAL1L9P%j>}?R+zcB zSfwEg83)8lhvqX5*sXLIDokS|v<7^~Jyme_$KeJ;ty0`cb}hU+?RVi04Cc=ng@)TK z5yzk<0p)Hkb}(nLz?YSw{cHjCvuJHU>xTV|f_w2`WE*Fn8b|d`wwtgSo>FF0m;H(2 zTn2G)%<1chAyzZ6;0tgpSi^m{0mGrSVwCN0^++)ajn#OK+7e@3B+YF??Qs(CVwv5H z?%a*2?wWGRf%HdQLH?QRgN-eVM20p`m%(DSIa*W)6)`? zlM-x;<$#503oY{R`Dtm^#Dt`If-Nm+-ZIUH+M#kOe>HFT)r37XF-L zrN`nV_RL7e=dxr=Vn!vr?Kv=u?Q^ zs-RH9*D+-M(H3q^w;o?ts}XuRKE#k~SOiB~z#updVaOacj^6PNhFr-r8RYmLUoTc8 zq&R-TkbXyHvYf`(a5X}-BWxFh{BneSWkkFnIQn47(Iavk$50Hs00aNUq7^1OF2vWJ zYMh&)?>Hu5;FCP7Fidq7hTN-0i@?Cy80h9%jc}ynt5c1mhozij83r!nS-}EZaIC_R z1xhri%Nh)senckV27Dc>Mu>LYf+2$_q{*=zUtV2(I>1k9AE{RiDow;a(Iab=16;of zU4c-&3eDf6Kr;|}T7}lDP$ELNtB~Uv1)}}eH7fM9n(E4DvAtDj;yVhIfKa>&t&$I|~C#q9vg@-An}Zay9AsrdC`-J}om#dqU&Ipyo#gnw<&3!DGx z&6aStaSvPW1)u8%ZBI;(WkNS&abAkaSXl60MHhgXfC z$m7pzAOGTx;$vsP_!ns7zS{>tF&cVm?Mq~6(W>c!4U@$k=B{AYB$ z*VN&%xmH~^dxeXrQ)2k*q@D=eC}wVSE3#I@SLMRtZ-fguDR=ogXB~>x(wMcK|Ie5HB=T z;Go!@B6!&X$5ph{C$ z`{f&|cM>^m=bK@;HIbPvy*5i*|Etvc&&2v)rKvxCFZD=B{bzPue=Se<(^kJbV*#Vs zeAewx6Y&18L;0D4cYdv&Hz@7j0_#hgRr=(r;QmVqHh-n?w}x?PZ{;q5E;T9Jkl8g_ zLx@!R9<20X=fuAx3iSKB-BzS6UAj;$BGH(l9zCpM_6q#;Zj&x+KpSzm(RhZk{+2D% z0ZKVZE-5+|+W*zk7R^*j%f@R=Fy$~Gud%#6sk}E!+VXb3f4{P*xV$LVQC#K}X2U#s*cPQGH1#d2UB47Y6Qi;l^zvcB&tBW&ecu zXy(9bCRbw`RR`i&)QQPkF5vHRMa9l>`NgiHJi%GIZd}faoPr{usCXQnhykmw!{2#1 z&KyB2XU-)4HA$nV0T1=Z{iqqPS4}Q%Oc+f1t>2MXToTWnJ@``iGM<@C16@u1hVNss>FmSQ+<;vM^ z|AwerW-<-hxBi_h)P9mIoP@vK{2BW9-@NfB66XIL(KNr$MG^PBg-T$Qw-u zPO_U-mr>k{mc@rFmc`Z43{{rf|mfO`tGWF6+}=1nm9R^cnTVw>SjY(ZOhu`VU`W!lvDd`JqXLcEjwxy4I( znV=5|#?Fg)3McyOTV$2oO9KI4?;36LB_C?{@o^0>->00frRE$ur z3LQ|PwFu2tp?m+WKqSbFQ=!@iD z$9Cu)`09B7OC=`NwpS)w&&Y~&Z;Zyr^|*k+36ZU0ic6fMV++b+^Xw(C3dFsT@v*TP zW%gK#m#fAc9a~%~2jF*gA0&7j2tjP=O_m@;nifJnL)WigAX z#=37z23MqbWuV(O_Bo($mN(qn7n6Z#3&ry$>(Tee8!dr`V*=ZdP#v@gUg$%p0Mt;5 zJ6X-a=#i})^(~Y41J02i2ex%i59b{!ExMq?y5;9g2hp!_Ez{+H!Ti-FZ*|N@^4e)1-=W(?pyV6)(>@XDW8VO`pHof|p)J|Cxv! z(tlBwUADqrWG^kqJzHXjCXy*%6GZokUjyAEZum`fzkF*KbRQB-_YZE7>E4U>$IpiL z|Fi6zX%9s2NjoVSFf^GN>BYr56KfE;DRj^j>8}Jg1&wPss12d?L=C8`?o&KQEp7Bp zt^3g=o~--IC{FI-O>7dAdlp*4bP|yqphfRtUA}aMx8@l zpW1Y8b-m}>bFOO_V^hLQA!E~TuJZ+(&%Vy6?R+kEe)yVmuJhTC30J+?!I;4J4e+qr zVFO`LG5<3In``%^TF5l+Kv`tHaWig@$HyHgZR*^!Tm8*i;TywM*LGs5vF@nJ{oX7Q zEh~y)s;4-OLtoh^IJc%X2bYs(&2n-oTTZ$_~))pJ)2>#f47r(C~B3|9sQ`r^?q+dfdbnIJ-0p zI({1N8vyesW5izGImU(qrvrf+h11yFs*YzqTr3I1L$AC2mqp$3sX#nrfp7GNMe>02 z`0E|={QncDgF&BuQmrzkchKM1=1E9@3-R~4^Gl|nLE8rZ+@(|fX{wtqM&B&YhptO8 zh&Et`Hz&2l^4niL<;Xg`#N+F)-VaqEQ=Kl@rzdGd;LN`Rr+1wErHK{tlpiWDRnWwV zr^}8+sI&CE$aNajd9To_=t1-kQErHk*Uu?Nype%+VlUtd3+@){h7>t(?X?#xeZi*W z*(W5=Fw|F2^2>+()QPrBg$#9ZTxwroUt7YD9N3Fukb~%-ZZC7j=9I3WvsPHH6~`78 zJ7e>UOIOF{#Fms6m)J{V@g{4?ehQw#LU|41E`Et-Ag{mU=+8{w>l1iN-_+{pF7PFa zLP@NwP?DrAwN;vW7tn%kr)Na|9cjJs6m204_Ua*u%jEv1&DRa+(S5f!-N-Q4F(fK} zr_d}dxrvEqt?qAHGMQ~9Ki+2x`V8J@O9FaI(SzttzNgkX0oRtu&<=hvDa$HJrq6uSAK6L`w#{OdhTj21wUFiH1#FMi z7%y5{)h>x`fVtKkHdrMaHUSyhs0-+`#J6nBFm9w``z1O!e_f*wwHw7oLxR!DTe`27bymX@l}`X)-HmpgNo3YFux4AZo> z6kp|hK!??A5YfA2)dyvNgmh~l2kHa*z6OCglD0}~q79^FO4d5s?cbLalt7yc<*1Rk zqO{mmQbxDN%avIMrj^old{RM8uaJ2}?p%f8((R|(*b3WQZsZr5P4I-myT(h7X!+Ws z^k`q4Sf$Kpc7O30Dg^!;0H)G-tq#pk=uv;8sjfwjcQOuGr2GJo*SqUR%7mAa+55>H<4}vhVPh1 zUWk?p_lGD}xLQv$(_W>|Kl6f4APripv>rbY4ze7*72#W|5f!6Tlr|qe6dF0z|*9d+F+NWd$qb_cCX3 z3B6-)E-A>vr;9ySu!o($+VQ=Np=As$<7gR2F^?6cCHP*#@iKTgo$E-)InAoM=WV7t z2VGq7Hlwk)QI#80A}L7PBUsb>jEQT)O>_S=e9cD#9yKvIww z_fcRB?XB4N85ol9h8GllxlihTH1S*MeNcdd(oO`C(oo9RH#ZoS0;KA!QcW@ISgk-J z>6%D`u-iBczS)G9ng`#^F1?Ueduzbb#7qq%Dva!p!m@wyAp1+tDpUzPPRuTyZCzqeslRgDwLMNpV$PS zfHl((CdCp1qaj-PFf7H1;A$Mw(UzDrA3hI~KRLnJ$_inY3vu9GdAw=Ov{|J^7&XK1 zWe!P=x9>KF35g;ER2q31J0CBZlGf$tz_;WxHBp&(Px$yH1 zn^b-_%lz!0)Q+Ed=9$khe#RH2RjOD1c7Ephw*BoK`I!oU{A^yS;pao)zm=a`DaS%R znUA`b_7j+k7A>3i31Rc@SRT&ljol5hNKZAo>nRwSiq;gA78eQ5)g>@*@(0~9f;HLd zm1R!*>XP9?`K3WR3w*EUTCPEg-<>75pDfYFhDa-Y_`6J~X(YXDznRNCq1N4G6~b4I zP*C?@p-G9}&R4x1d9BO5EA}Q0So|f+q!pLbmLq?|z27z{; zJ+*jB#5J&KCmMw^kj_e6PUt>C`qju3xLRX%8laiak#`P+<9z!xGdS2(Cz;}bt_Iau zA#p548ut%~gnMT}CV0ANpG@gyBMj$grf|1$B4dfe-T01Vg_`k0e<9x2TuTLUa#e9| z&MLdcM*{9(@jJ!QM8Ztud=sR1Jf&DtGfk>(*aT5(Xg3}jQ>W|=vc|-_xRmJfr}+9; z-kn?E=DTw`r3n&3njit!zZ;+}>u}(g(qTVY_yl#Ur?o6A&Z`ux+6(G+c! zZrY%cu~)AwD$WyZS1(9Rn{So3k%YX0QhTnmxOAORwr=&Rf})kea-h!2ab+d;+yYqI zk%m91BX3bKUN4B`wd_)1HiWX(JeCH!rf<&XZ`&HC1 zXnkBb@t7-Or%(lJ=6yH=?%w${#CSDA0ekEe;sJb-_+j_Xml0Ky_S`8v1nAuY`5OoP z?}+!(;@87cY8{_nckg^3@t#^d7VxVT{2=1pw741YI0gR#@o+6(3-~~W<9>4l(0vgj z)2LcBF%|=&7LWoaVKT$&m*xuU7}*-N)6!}c{XNhrP1k!i*XZSOvb(^>$(LZ9Bxa0ci{~t0u*GIeNVVATcf$Pnf_0A7vW)DA z%}Gs2OkYgT`RNPrnV4b2N7C&1$@Jupw1pHa1#OniNu8Zx#m5}T3m*)dlZOA!y2AZyOTq}ljmNs^UPEJ?8~h4DQnFP1iz%S#KKcJ@FjH62jw|ssK^tKPhD^9eHuIH$ud!+by(0xfdMOd+;cMV-O%9nD z^8MW`LNCWMeEmX=5baorA@B1D{TyrX^-VRxAjbv_d5TBSJGSEM14;y}Cyta-w+K8} zxE;|A+T{0P$SR(En&Z#-nyp5-#PKAC%;OQ#9nazG3^hW!<5di~ghyEDsKwU{)CeOS zdoZN?-7*nAz}HjTHFeyNA<}jhA;R%Fz8+K~T<183A@w}MMUL#w|y+@5u6nJEebfj`9f=sC;}H@abMf`(yOanwIu>Eb;k#Ib4UVhvb)Ooc(2;{7 zJ9&gs$4Y#CR*kUS;lz+X@(B5k_4s<59D$CJHet~G%kdcLyJanbhlM!prSn@69Z%@{ zh?*7D@z6jEJ7f|Z6Y+TA;xWo`k$I2;#Ua#Fh4M}+_tEK4;^&JM=wp@&p-XY!`V$qJ z+M=YQE$uf{NVq^rwHHJmX@?3;yucz~IN6WTW)*r!hIEdv5L&51hgIk&gshqj2P=>c zw{NGYP|0AW%DoX9q(WO%Xdps?(F*j43dJIHOoeJyXf#6asL*FBGy$Q%sgPeS;gty8 zsY2Ev3Un1hYgOnW6|x|dtwN0|v;d(*6?#Q&*V%4^UEFhFhwytI&)AN(rYS^pFbG^jC_p03nYGUEijhgVG*tp$bI` z78#=Lz%&&)tmlxP?Vn6mq4=Q+A3lIP4g*!_;XlmhKBDut(gilZv@NH>D? z@{YqE6*7e@^`cenUsY(vFy&kOAeMB83LOqtzC{bcaus^q#0$^Yc-N|s)Sai|ONs;) zT0Bh2Fc#&ui&W?#wHTui>Y+lDBb8JnK{j5fKrgDP8W8%o3LRFVpAmXZg^WFw3`up;!M$Bb>fLUScqwF|PaNGm9J`1(KRN0JW zRP8TO)UbOyvA?9Q1AeQ$D7mE6Lms>XWJWXzgEFr6@df(dfgOq$e<$Y|n{$f1i73KSrsncHIN(U(z2Udg9`M zhLVQ+fSzozJCHAS`5^PbeOh~8b=+2+G=r6u-I;7+Q6IQl*Z!NabS0?T<FEEb|8d?sfJ4k-yPH6&s zke}UGlKm)}H-FhK`*Sf~z&wUgxK*lM+(JqX{w$l+)Wq4HsRG)hKOJmiDu(mcULc?M zXVNLJaTzn+W4v$Py5nx#czhGeBGoe@CfDMkhtBYM#$3_E;dVFp3uZr@>X~tTHyhj$iKc=v?zF_vN|!~_E)Uw#WLzG@0Y5^-Gl2NTpkiSqlV`JkrLWwN0k> z!yE{waiV>DN;A8_#&m&o>l{<)GC-jV2`5AEk;gk|7^o2U^-MZi$uMWE!L9`7xWO z%u-eKj!m;jc?~r*mak|D`0TjXkCF#kI*mWdyqlQaGw&KT8{%K)9YP7F3(kSK|H1Ts zemV}{eGAV60C0WB^910)alC&`NpUxA3IbG^;Cnb5j}O)f0t{o-FEzHo7k`!df3Me` zYpnfIFY7yY%(+kg~q=mQ-<%^-$>cO*YS((!NX&5GciKBg{wEKHD+QTe* ziS&dIiF%E5FH!F3B3#$e+)BdE|J)XAkFs(F+untruPkCWy%ZNi4)hMjRC#0-J7tc- z^RNm!o+EpY2F2cElF>Vn+k5;%JOM+s+!Bw0*o9;AL-3TQ-l>ySb_WoG&hrQvdZ*m~ zQU9t3$VR^LeE;?!svEDv-E*xxvxLbrPIL{5`ZfdV0(!Bc)msq>KcxG=lX;KaxZ%+) zI?xkw{{0g)3fq%)ea9GaFYQ!w`gq=PMJfl6xWD=|ln+llsGMu=Al2dyHqcXoH_+d) z^9^)uxkw)^(9l`g&aj#M#rJZ--)LY3f5F`raP`7gro!#3Mj0V^J2}^}x;QWNycSA> zZ5X3%!*JGydTc-5MlrmN^p4^Yko}Ff>$rYg`}QdaZJ*h^ed0CkQ^V>n={3iVHYspi zuGZHQtJY@?e>#iypfY_^bC&H9m#4Oev_7Z^3fW^q$j;7_kn}dCj0wDquOsP6UZ-+o zZj<>}Jx^l?%ByqARtm)>_M&n5dG@kU|3>EaM?+XYJR16CB;*@bbGB#8OLBPyaYV(m zTsPq2T>@7@VJFVcp-KcprWCP@6d=TUUnHmZ&X@6S%F=ID3Ze2z>zSByxKF0gux~XK zBKb_F{^- zu{2TKj{#g47hbo~s|m?~y0|P(IR!>iU@r=>Q;3;D%yKj<1>!O-YG+b3$OiO2K%>Pw zo}O$-LsVyx}I3@n#qpnBK|IV~k%8HuNV|@vtZl`lC|ySzI@ru{UpB zCTogVYT?t;yGKJlc!us+cuX!$%~4jGH<)&M^Ts1IO7~R$hQ{Ma`6&zL86#=cPG_IyuSGi6eUS_6@Ocy$%0MU$GGB z)o)02vPvIcN1}{X8fjv;RvbH^1gsd1f6}p!0HZz78UQ)wUf!g1SYHz~=P^AVvu3RA zNBY_Fc$+^4a=d#h8*k&<8z}CY;0LpLgNZ*g{f98kktUn6^z0LtZ|zJ4JY>q+oXt)m z&C>f{DI^Vp$UI%&kc)Yy8rlA_Qr75@vZDV=n$NzL8{~$sScBZ}2{8Q~D&s94js8y1 zd{%15W6E*)1wpo8QAwmCk{f#N33ZoA+^0sFuXkPo8DAm7(A(lZ8s>`dh6m9H#SDtl zM^s#Bb4+GZ--pTlK$u*o^Yoy{Ym71UNenF3;@+=?srCz>Yz@|bfMw&ZRp=kBWyn@np@@IRU zI<-DOVn)4!>T_o4XX#R2AFftc;HCxGoktj-!}@c}5n3(PNR?k`gg?;o;nTFFI zM-=(*3s&z}d_}B$Tr-NTXRwn~`4?_h^h19|i8Dg`(X2D}&-=fUzqjvm_PsY{{W{A2 z+l`&}&(&Ibcg#DgjJa$)WcFvz*~*wrOE{IKX`gq*G<`y6VOL_G;gC$h zw#8tK=EG`l9H99ukJ$sk7EWY?bP7DB+o2cpc^}4)RuYG^1=JC+0nFmqALRSd(u6}Y zso484Bdp)*72wj(sX={~yN589(iyI zOc43QYF=@U7BmXIrS|fIA|e&Z;`n3a4E}pstg7J`%lIo+$aP>Gt-YHr`0JrbQ1In9 zpDlmAm?87mse|XlU)Ovt^H<%$kp4qO_@ttf{|3>D|D9km|8zJt|iiy$K9I)DtkZ(WvhOqM*dEG@B#BD@>rnvB87xlRN zU5!gwiuUJ9*`=%{vW}GSr1uVlE=Mz^D?gLD>aPbFO%5pjVkw_p>pSxon@{?6vQDS= zzNl7?iPXq30~Il5>*Xl_s{OfhX@+82s(!mPItJ zGp~Ot(>mc3M(YP;d4_74byMf^Von}WS>-*Ksov6>Cn%0VI*}KDoD3OZVGv!oYhv;=gA#Ozi%DqiW$=W%2CCSBGUzIW?EPNeDCtT$)5>iLG>mL)y8h;P7VNmtHbXKnHZ>?&H0vc5XMGyP$C02+P;Wd2pf*$zOL zFOrv)6}7znQt`h#6ixbvj75t55t2_1$m7wZe{*>V#-n6uOV%-on9XM!k6&w~vxd&DXUNpK{7T65t@Xcg zNf%~4izOX>;`;TSUFq(cV;)IUIkehS+Y$&^&yN1ykBOR!{wnJk%ATJe#3 zUjAoIUbo13ZQyyy{+KAkN7u;b>5twEDT0<@1Q}x1t=biOe`3!T`#%+z!Rh^pP`~?EW;g243){bIfE({xpKg_)S=d6vW znxUKE{MGYL#Yhwas-{jrCTJ}TLpO$BC4m$)bjRSixEsdr_f;FKaRjv@UYDe~^{_mr zjF$7k_Z3``lLB-hFNR&-ldC+aM%gdn_xH9Oivqh8sQFC>Pc+0Z3M=nmq7 zR@pn$YXSJrHy^&MnQYtlF8Y98`vIBzrhQNB&YiP1((~bZ(^liOsm6iMMs%a7Cy?SgF>c&Xu8Z9jt-^->RnsSs6Llme zR3%-yJrU?Rn$a^>q326PPnoV{J;{+s!??;r{N~7bA#GWDa@xZASHq92bp9hfIV&9= zN$Hk^#qhK&NtzFjg=tBP7bCnlJ!4@KJQJ)|%fe(r7ADS5OPYs2lP&WTFp}+Rh?BA` zIm4Qg49`@{VtU&66W{0a_xbESEo&hQpdZQ0lIEvbmRORM`!45r%f-c9hsk!(Y2ZGkSmYD!Ds;lXpc zyCiOeW!dLA6#a~`4iw0Gt!}cJl1xwwLT?5^dT9(n#u+GAY9WUJBCgbf&>o0x3Pw$U ze*YPweGttLMymk*fY3pR&JIRlbdsJUbR?pe1Qp37-A&M?2t@@ajE97437w4SPmXrz zQbK1T`cW_%3+N0&XCwNO76s}JCnyb}`+^{y6h=@MLX|;~Uh*A6Xci zLKi11(Dw+L6$sJ0s6O3r4!h|xVEEV|b!+NJI|KUqmd3z!TQ zy7&qOBB_0v3dLWkWJprhFco?_PDw=)lTn54ou;%GP52FdokkZYMpbp{@20Wr&G+^4 zZLR0wr|%NBUD20sSLj&Bey@bz?`4`lTPP9V4e(}5K|ZvZeMZy(_F8Z+!U{_?+hJ6k zqEq5l>hvf+efnpVKx65H&e2ccrABAZ*9HRWo66+7*M`B%6F9p#FM4e-0>fCe@YhD* zTkqE{!U$+u&e`p?3*k3zX{2XLY14F?eJgeEU)E~EYv5LSB-v1;$eVA0oFzS3uQ|N7 zN#6J5_1W$9^5J!J1+CX9`CnFcvR~AJ{ms7lUO}^27-WSr^loA_nap}D^n|XH{YL>Pc>ej!hTtp zCtW&*FCBeDsXc6CTLQX(93e~U!SPr(slYhj(JR-!he==j0}C<2`44y_{R!&qO$CZR z>woH6qD>l^z!soT#Ah#MdSJ53uiW=o!?yQNJwWzPP5zlDgdQ9ZG$fdTRSl>H3@}yU~N?7`rfUalDj0k>knSPE#h6`E-s8~3s-de{oDl6+f$e$o4V&Zj zI%lLep7Br}^fP9{*4H!0e?@L_QJGMZQ&2h!tx}E4%_$u&B&991S=nnIyyoV?f2H)u zp+^pT%b~X%hUG9UhhaH{<*;-)EL{#um&4NKuyi>rT@Fi^!_vv0;!>kxz=6iRS2Q*ZBbtF{m?n>ct7BX@K%D~}#@TFGYe@wrT2`p) zLqMtY9qF$tX`_|25%82o7U~2>jbMG#7@K?My{LBUyy$g&s`iLsuFOVHy*KNs-qMO`HddIJDjNPkBfNcSzkzy{pmT;pH0*J-Q|!kG zlLFH#%u&@17?=?$W;Eey-APPBz77^Nc@rY7QVFxG>jSRvi!F6WjR^F1pVB$wD#JY= zIwO2bYH-B7%4ekv=DJan#uDjXKfnYN^p1y6XK3t>XYnygy+1-0UXurzn9i}U2L&yF zpn zif$Vc2n0BhqBh-!dclw;%2UHNg!j(HEf_PD$12s1z^*~Aw;^f8=t&=9g=UxqSND43 z>sSL{1QoWoNi@Fh-bG(ne~42)Y7;E2w0kg?<4iQc9i_}do!1g$m3rsvSPN9#H0d3r zh2{A4t|Np+<_v)`CdG3Aga<+TUx#yk>ePcU;Rnlsc(mY-E z7lYSl%gq<0=K0<)G6Jft$F$&&5XkI4vZJqhKNF$25l=U;S~^ z9GVdt*{Qj{LzQ^GYPD%&4@;W_>rse}J2$N47fhLK{}*KtPik*Q@Or#e}z}3)j$O! z#$$LV$9s+}e-H%!H!NV#eoOJj@f8O9^&8JZwN|>}D1TdH271hPe1b`c z?1?*ipe_H)@WKup4W5N#`NP|3erD$~19P^69}-iT2JEk54FG4SdB5tan$H^Xw)?f8hT7%;LMbgiZ`A`fKpR1;El&9q@sQl zex%psx%?@Zf;GprJeY!K`KXO@Xd__d0JRU-0<&j%{~NRI1=6pY}{k=8LqoZ^ha@%ve*;5+eo+w@7*yjtTt1-M zG>8kd0)zHMpMRRn-%<>+o&7ozW40uCHz_cL|o7w(F5X&;fG%OjUD&bnWg4zka37pdo46g!Xym<(q7O=jn%ikz%7$kb}C zIwWwRhxAOOi`-QQC@`KmB6^$+@acguCc!c@S3Zx@MAvXnXX;H{jiKpK*P*jwV?sSs zoPHAP&$v753|Q+>kUcvC8bBOaA#rHmy3TmS#?kfmV`8KE-QD{2Z^q_(poSW}U#;3ajkMr@93rHFJn|Bla@-l}0xjDYH6CC{*6G9aqy<5Y- z%N8vcYNF!)V!qcnUs0=@xJHGgTDLS z%}(}@Mli(@T5Ol_*X#{69f8$szDx1f06gyf58rAx+J-Y7%t432|8xe_uerXv@4>U5 zp3YDx5KCmL%#Y126XlXMb!Uh)TCoL{KuUmG(Cu2@okF}fqLJs61(mit&$sCfw2M+f z!xpU_XrSC?60_SWvuJbY6rcsZACLKAt?lWDi>1^VVnLhX+jRpZYjd%9!;H^qk2aaI z!r}u`qPs)ZV1_kVS|1qA-!JH%>F5gChRXJDc6+g8%B5FKxsD$UWj|teQ&3OKErM-z z4QPOL{(PNb_qwFwgkcZUqyqi$YkCtX*U6>L=^^5-@#WoR7gFVi4ZDlQVGmDtowL}+ z!sAju#pDFDz)4pCR?3M~pcI08YJ>U1QBKX>15C_?q6N8^7rx0D(OI!ZyjCinv&95yrH-yniQ*_+EGfNGt4+@&Rc>U>(|o^>F?-tMgxH zuy(H-2;(jual^wLkO7N`ELc3k^f33N5H%kR3}*0HcOz=#SWM4P#|9O8TlGjz=G7w05)5ka|soVmX6N5y2(qLzu*|`fk2NiI9L9#6# zFUfhA_&8NsWpajWv!wzCp}P#Obt6b{-HX;07%A-`d>bt-YMJg^qpJ6^T>XwyA!oh) zf%Jx{;|r5Z|0}Q><7=&{gynghzgT@}`VyE4wLV|dy8TMtG7Um$6-NUtC-Rne28OX~ z-i89c3J@N56<=<;*Zu>Q{z$$?IofaK;)N?7koC{Bxp<+Ox`vhV?5f<_dj*xjFCG6f z+B3xi72sj5Xg2>(4!Ru=U5;X*Yw;G6c+LtkzXw?=RN-?^g6l z?K@Y&J7AuhtLUiMm#!YtdQ(9u8qvbfZK9TPDc54>GPPt5*=l><6693po#n$irvgX^ z=a(Shm~G~}{w&PkIQ7^8+JviT_{M)>@myZM8|sQ2s7$dC$O4`Z-5xLRWGJdUcg34CI{x3 zm4blZiENNeh~!BIvMaIl5*TG5O*_P&^9(v59?vtV`CTvr=1TQEMj8vfwkLDlWD2_- zOSZ!vN5Iw@?J1PsM>5KowI_;={-p+i?PpRJ@{{*LS8MYyJ0`ap#jgNQ+zuNG07>{+ zy$X&Qi2S??sXX^G`*0p{XZ)KA?wZz*pe>V&=eo`f-*_CSpU)9g3c3ov0KS7j7Fi{P zICcq&;Yg!AoJ%=8%}%@~MM~sWqa-L+qeW~KPm6nL0{#a9jeLxEOZ^Cq`CvjI8eOaV zv6_;RxqpVzP*dkF6(l2J2)(QaP>ae^#>fmxP5IqtIR=#hrso=TU>%XG$KcwP^8GU$ ze+qww;m^_+{(cs;_}jh^I@*y#__Hmfpm>?r(zU$ynZS5$EaSB+iPz@8LHLT~q3aPv zPpCXZz2xPv9I8be_V#;7>jzLC0p7u$18-m#H*&5SqXYL5yyeUo0mTM{^5twkN>9Ey z2HpJJbM%0;6_we-c>$Ad8EwlH2n+`Zu+!8n<|_0AktFqhA@KDm0vNMi?*$moATd^} zz&Lw949Pl&0i#3)#(mL&aWe_5`fO#t-vt)@Iy8uu_RC>~4=pC6#CEX^I`f|om>s(n*nKSUW5`>P0S9p* z`V=v%bFD~Ag0qDk*;;dXS*e_(|vUj)*y~D9EBx)2mA1C0X4A|}d{W5)`r902}#BAsm z@l`|qYi!(TzZHGbsj921lna`(6hWpEDSbTgGc=TXstY9t?bUS zji!!`C6kMwu(~s=IPwSqV=D1H=k2x0NnjWYg0u!5uVv z%t)TXhx~Cd4B0aa{bL7!DjB^d=CbFm2T1JU`8c``k{-S_i_MSnS+V*9@>tPtp?-$D z>;mnx@&~woov$Hl$yqAy8~qO;zywF=67%EbND1dIS#!PU`Kk+^tht!>@x`-Wwayq( zr}4@SH|U&nD8-?X!Ak9Flati1Gl)+n>DvVTdTMqe0buvs<$^nJ)uzvQo9IBnliN8< z6MeJz<)6NXCo$*;&os#^^&U%gj*&s&9xQM(zYxBb`k#=TvS<0*ST&7hPBSwH!=2x= ztq>O}UX;&GBVGdCt-vUphPpT)-;jL9?HAlLO+&ENU`mp3nC0km_$C zP!F7`dkUoMm_T7KV>`xZX16n=-D4~Um8m8O}%h^F~~eH&No$eb_OI;K{eE_MV> zYvxNEOw!==+Ui*$v7j5EZ5t@o(ZVsubY@z$Sbq{rX*!EmsgbN5;&c<#cD1HB%7cP! z01Z{i*F&=q<8VaiyJ(l@nDD-*>^AZmrPe6^qBhlE1Xbc>Uyr$Jo4~E!J3${4t!GuZf@J$ObfqFD~<= z_u>mvT|IazuJoU@kpbV#4wHewmsK|GU6)K1SyyrNJ-rj(Y4Lla4p6lEBp9RBXV7$! zT>32-yd%UQExy|JXPU;B zmYUwlT|Vhe+;>&H&w5$_6egP;|3C$&d>E|oe}jUGB=|1aM)~X6V=xeN`_Z=;bJZ)c zuzbC15H#^hKw08Gn9z7@vh50-I!@E~U-$C(SuHIO40T~R)mW8^laY$Y3p_qcL&SSE z=h*KeN0%*rv#aA%9*Q7)&Q%%;@h*RmYcV8>fu# z!f4|w?df9IJ_LTP#_#Zvrs7C{ixaT=^h4dL4i)&#Cr;^QxMD#EcMxV~CRPOnY z43+d686GGXeGUZIUOh1OsK6k4ECtFY*#i)XW3nff2^}NC<1Q0=?+V*8?8)}H;(fQ4 zfuxqoQzfgV*s*?Xk6=#;(Jlnc7arvH2)3W3!c@tQzwYf3%$u(@Fz&wf-k$0ihEK?A z+xXm>v!bh5%sx$h6ZT<_*DG@zdXGWzU+M7QeLnmnD8eZ9Qw^nd0<9|4S&*7h&|P*T zV!7b7;(zak!4v9co8PT7Sc6h|uvpBT1szNlvtca=S~6UvZj4hav~Zr~9E+``v(~Vg zLgvSu1fbED} zlnY#xkB`gzR5umsX7t$mN!C`pDVI=zzIZ!SzBRX}IKyT4% z5{t!)7<0tJxAZ22jl*S}hWz0I&{Ufy!uylyg=?%q!*1IILr5$?i2n40*mZFzyFDhm zP3*)mrNC5VJJ#?OH0U~~wDu1Sb=mJIcMG=uuy*2YfXKngQ>4OXqV(>JpUsYsa8Hv2 z?pr8u%_wlqRsV+X{;Rprwap-b>l|tzh7ilUogv!|$l8oA`29nn>~7no9KVb|exv|F zu*YGE_M>D6WMmX3+Y^A8Pz}QU24JA%8Kd_CW?_-Ecb5$#mTRj{U0W;}*;@aQqYh`( zUHYSFPxU`7aQl?ufvA$nr*aEzZjdNj1ETDq(TxcO-F)}uAqMmWE}%$?rIsFGQI5=|k zhg;9=-8yl`yPy8y^mj`q-m-bzvEQt_apIP5uka;}HB8+3*>|3QtUoYe%LD6uJ;e zJz!quTT>4oDlEM$^R2@l&1rD_I9?tf`y83Y#`*Ci7VGOdNs%;`ZJ9G?2wp2_ZNBuT z^iJ{c2BbbN~9)R>4c2ky|S}vh3G- z-OeWaz`b$Tu6`xwz^ljSjctVYJ^MA?jr7z7Or8d@v$;WR zpFQDkz|ZSH@ie#(%QbArydD^mOL=C$+#BnLW&%b}1HLqE0tUlXIF$;v@9_=LA7H?y zFVdi@`v?}q!Xy&BZjWzT!07eJw~qGwXFaU*cnm3H?}j*diW6~^cL?^$&d&1DF#K_B zBGuCjqP5LgYa2)WN(CWno4qqI9DlRoz#umNo?C~90*~yowqa}X#9_qy;s2^X|K1117m>5TZqr6Sn zFbDoMZMf0V({IDLPjDoalg8L%KS3T7JySCdZAgCNR&!{RDdV<`Llqr+O}C8Y^AB85 z15Mi!*(9NpPU@s`{qWFO>Tujt1d%NdERWgnvuG;7D(*}Rd>u2DE}+XeRgqY2604Kp z+lI~^i;Ihk&-eqWVmoLQrg580Q;ms&@s4i-$(L>@7eY;-4%8xX!zA!4okDfpzoRKsu!dyG`UNhTT&3b#6n2thLOa?5ebZ(k-z5GSWgxta zI%iP2+4U1>VaXPIGIuNmeuesPd2+&PFnB;Zj>dngljB@RO`i;R26DyvGsj#%#8=;C z48&7~>iI@aez4l(2dw%h4ft;x86x?Mg!}KXgygh)?t{FH92H$r!C{vt^UWM(k!vCm54nzy|#KyNId1} z3E9TdqHz*v67&q&&YKwnUtrAu1p^8IGBd&ILlN&T#^?cSJ6@b??SOUSVOTnh;u(Ak z)Q!VuK=&zZ4P|$Tu1$@gqqJovRDhX$!Za=riy!kgnFcvSptB;$+Txu}W@j;ONAr_C z@la>hUelm4&L-PvsQ@g7ZuI!`LjXDI-dawcZ<+BNH!4_IN)FV|^G*4_E2P?TE9}ef zFDe}~vCLMwWW{3IPukeFSzvigFibp|opFrYiDVqOSx%t+*J74}DfkF1LuY<%U@-dG>TJ!^<%sm(DSHJk04CI7;du@?>dGW)pj|m z8}~%!dZ)+ppzfNp6i;>+K81A`p9=VVEj@=Po|AwRZ&tjz?%1wt@sJopadQ1NQyrMj z;rbl@b`~|80k0c&L-CTS$l)fGYx#41oeAgEKtuw15LSTdS4u)kf_m;d)0}q+8i?DN z%r8$C%)dcr9ej&5Ke-Jpp9WkPS;;ms^WvW{W?o~9%^YJ-od#4v3tWaZXs&wH#O&dC z^XI8C)l(X$I)XQuA72JfLnECFHdq<{vns5==&$zC-v6u>(f|5-=fCqWry}|v`5WsR z0|Oj&4RSseN8KCa3oPd92Vwv^_2zf8Eu#-*xGHYOFig_<)9)J3!T$W6V#3`n{w&S?x;I~-j=hW|7m8E!dN2^ie?3;+6{fG;*i|2rS${CE8| zZjAm1_^(C!t5xZ*_KopYpuZC&8%0-uvg(`iVbQY~z&1|KpW^ac#uo%jzXy~6Bd;d! zqPHB7YMFuA>us<&1_NH%9w|u90O&sY4A85T9W*q+%H=p~0<#CKo$R1Aky}_7$@%9Z zO`m;Q(`S%u`siKi`}jKH+<<*zOlP;vCKU!%^CxJ#STTRzoN3VUM_^XC8C1}gr?Y@Y z{Mf4nr1gjb{ROLw>bdx2YvY)SY^`MU&i-rP#Xd)7vCkPxGS|c~v7cdL za!VZ|;Y&aQQ2h@o)sKdH8J==X>{XeWa=ASbUYgvpKf`1H(X+qhlz$?K5w9n6to;#& zqH{3>{PJ1e*qedtys=sEZy>>QK=HQ_J{(;c6(b#8&7Yy&K&+?1(?EE47&LhIn?5yvUh4?{%KZ3)48N-$m+?DplU4cqGRj|X z&(Bx(OaK0F`{ybo>WIVvMn>CJPZ<>eTw_ZDF^9qF=&YksyHaXu%uFypUSyQ@84dh1 z5dJq*n?9d`w@6G$+ciCC5J20B$;dDpHV7rtT!|&!Ud}0qm1@zi@(4E2rG*i;azthjN z-_zQSWtf z*&YjjG#lsszQE>w>(CHPK0fm{vlD}LtEYxCTworthFJYeALFOBJPpd|pak4nd zYu^*zC&SlnNpIR~4WU6~un&QeJt1te{*-x*x$0u38CMN5lDT9s|K@o_dwG22q|43D zC*eC;Mm6x{3DbDf=kOZH0A>^Yg9`x(Y@(daR$+RzRj|S5cK%)ddp7L1{C9sZ&$WM# z{en99_dnS`@>5S;WtYM1#DJvFX?LKIKRJR=F!NAg7JpKYPsqEF!JnW+_}qd|uIzDD zo`okb!w*1+F)*0RYyNyQdu{-;X0+Q8G;FW{vMMuUF1N=`H9Ob9vQb$MjDAst89oKu z=)hwBKKwM=G6M6_Mju_6ER`qELjrW?_`byrCo9?R*k}%aysMoenOJnw74mD=WVt*B zBTxCIiE&~lr>|aANcje{MJt!DT2{1HV2>xszbD~U@XO%eg|;OtSKv1u--BQHN%jfa zyxI0-InKvi^*ezF`DlW!X*3z9&CWMslv zPoanYDkGM}pnrswNOMj8uMPZscNRbUXNVD4n6*&y9?*mD!IA8It~I`&+1X?!j;o_xhrWMHDoO$3jyw8rP(ij&&Zk zWuZ;D!6ZFos+n0VCC>wcWNvYW%QkYgg`()3O|}bmuuXCLfZwq!ysj?L&w1FsKm9NP z%X!#bwbCdX;kankFc77{WazZfjZZ+qVIVgKAWTu}z$8+az;gr>p4U}C)MC(sXvXCR zSw4TLK*Dwj;7zm>oU<7Qyp!Yo2r3p|NT@4OQHRGCJLdY{6iE_;RAgAggYy`_MB}{( zOQxxXc!GtkziiwWA;9LEpreneL!-Y|2*dA)u)#~08Cd%T!lgzp`+X!-#2gcgaU(zk|_3#>fSIydpbW;d)J|c*B_I4 z9pkKr$#K>hN6gi8j54EJjcCte@c0BNNy~Tki>Wrtdj_ae-WX(*ftkb@-H%A$mcuDv zKcfIVQu@+wVW?u7L8xK;{i-1C5xe# z8NR(djy(K<1sUxd;#gdFfldGnFC7B{U=j}I5tB6EB=dj1j{iHu_`fp>|HFtKxG4Qc zkca!TLTqU=pWpZxr`zVce0=Huo?HoWN+4?N`M z__ALEIvlFnL!2DxrB^Q1lH)`nbAm8&g79!r>B>oRo?Xf%WwZ_95Hp&c?f@$JE}g z=yS}rTGm4>Vm%)@?L+r|MnX6wx_CMl($;esk@dy^PUm&_!$g8>P zZgf`%{ddI36n?juO-evPyG+?V2f>yp8!o#2V`G?K_ht0^Zb!fG6W>uB-VmU#mleNm zGmB%w2m6fJsMp%=Pl8WAN6-L`3UkoJem%^fB#ihostjhmJaKY)GE@x8!sJglO}GDf zqk104?7Y$tDNg>}mpFMy6(_|yaWbZKB8U@A41>FSb4+5kPqMbnl(KywQ*w$$>z5Sa zlwtkScIE0pvTzx~gi8wGJF0y7H2ts`B;kVjc3}9;26a6~=r5r#O!r2BSwSmkpL!gO zfH(eP5ajdx8ax=kB|Hq(V4+3D0@jx?(dyrb{+}F@3}EhMfAepJyh%haoT*B+zRfY0rM<`4-O!nZ-)ct zHy6qAH!{D<=|O})Y0`sG-TSewVsI{BvO7+XF> zBTwx2MUf@5RaN!`c|GPjFeH*D1!R zEIB8JXnF?K*W>g4uLz&FFsM)EhK4F*aP{1yL7z*5K1Ls^B-u#%4WFag`Kc;PXkvj2 zIeeHnc{++XSzwUQ?YiZ$qZ`X_4&kvRnCI{)a%5*zITFw0$hsO3B>cSDauz?WmnK;t zP4a$;G#S160$G|2Wzu92wHH;Me8S{O$n5+Ip86|Th7%3ke>g;NpCWcL$lpftWo>!5 zd;$2Iomo9P7Wz0yui@Aq=>br`CkCGt%;Op*B$z$ z^2{Busq!D`QzI=FlC*eYeVDX}wO{5R`JZr5?P{bh<$N8Qp1+HfUyUTcP(MMa4gwh> z9+72{{a<2N;24Jw<%d#WGv@+j|4QajS$@>MsF5F3`LYYN^5YtT-*1oku;zv3n7LoR z&w_I2WiA4T@dU22@?Yd?qy3F5;S zkW*h0Hm~LZ8`DKA(q8k_cyFOkgWCO(sP*|j0RdJMw*Il^W3AYk$dl)asu_^0N1&vsZlC6`6DvtE>jQajC^O?eATf!Es*<4hk)m0wP0UZYc&|WTGQ#DqsyOqzhvke zf5iv;#@}Oq)8Vh4#YydZO09?G4$lzHdgJ(5laJi=2 zzeGZ7Ye4D~|NGB_{{uSwZ{_%Z*1tYRi~pD~{F@{2-#`cy&+OODw}#JmlYesr2VcXcw5Xcr zdt77G(i?Lh5zW17quFt8uEZ&ASsTJVX&99Qp z&xynFV;(;BypTH4DfKkb+d0>M!I0%e>F0fM6}*Wvda;CNbDbUUUa;=k{K!UY{c- ztVmMzxmJD7zV@dy`2wkO9#($k=8zJlIYy}F_Xsu%{2oEB(3zceMkPHt@MAk`djJ`R z@B9w*w5`d^By_w6Ew?8a1m)cKC2TL~h(;+hKlUON`LUe2ZErHto`Gc4$HAJNpt}n$ zpGDl~IAd^pZxDAM3Ir~W67ToBF92|R17q;15_J9<0zCXo<32UWPqO;(z%z!NJ44aW z5BI}S%`^e6U>th?VwS1wE*6A7m>sV_Yh05j-D^s(y-oZMBhW5n_EvB4XMIlP za&Z##pRi!Ggfs5Izu5cj{@atn$@tAZM8wNPSYGE9<-hw(X`qJSRO3V7X|xVzj2ux1+A7ZvXSKed{CN?(Un}JNM}1mz&Gy zM*l&y88|5pBu6+pR-dW?a!g6odXR}I7sVUcMFz0=pmj>=Bv2K(k&>H^))MHN6phvJ zMFN8t*bVctfNVcZQ2Y-o!Yqdcfb|A48;*cIZ#7?=tTK}8pu^;~B>KotvcI)t6%kjO#-yEml+w6>uSM(1;Z&g177beHz*dEY0 zv0ZCGj4(3Ia~AVWyJY*$aVk`8Z>uhB$K##kk2wvo|*n-gFHDmLC+U-B+M(mQcn z>3llU04W6v(w9QwA)~%*WH_R87;EMDc7F~Hp(RB0wG@Y)!*Z)_JdOY6u`JIoV6};H z;Y9IbEg|vO8vo%Oc|T~>GEjOKMJm0YMN-Ii|5-!C`p=rq;p-)4beDIU4?M^W6(Ew= ziAbOiMkiZ)(b-;(?DKU$y3jQ=lBTDTx?M7jq{#8S(MYAKR!1tYb5hyre=k-;Do0}V zq;jXp5N=QB?dnqffk0fwa4Q97-&}&axMp6TMx*~{{cj49{C4_tYCnqz<{`b6ayw~^ zwxtAO=!9@q)3?96CNM+a!EadyqZt|Gu~mWO!zN8j2O?YA#O#yS2>WCbYjK|5KKYO@ z3;<@(m(rMS%LN5#xV`ANT5B~-zkMXsw|@K4XMM|yZ$Ixtzg7Iz3N;*z(Nn`LW0d`c zDWB2g@8z?8Qnp&YWzz?;fZ1@v<*NU88u2r|Xv8+X5i?v5g!ev`fneeJ&Z2?hz-N8x z#m`3=G0$QFcLKL(zFjQq1ISmUu&g^EzzPVG!uZn#`y!yu;Wq(dq{50_c{U47SKR|C5 z;hV1vQH`CeW&btq7liw-=PLedbV&MN9iaHH=csoADf?UFw+Z8w{Vg!HQXT^hv~&Q8 z8ML-meE`%}h{jCOO?Q_wKx8XPYE>sf z+I}q+d|kZHR0;q)X(&4_Ww%P!R%r`PCcSgASltd^iXE9#1lwIw_SeWjQQP0i7HGpG-8JD@s8a_*H0ElkFoS~v=yj^1F zv^KhyH>SKnsm}(`#T0lzPAoVW=;!he7qbsacbg=8qgYtK&$@@mXsEv9pr6l`W0 zb$q>&3TowZ-PyI2bpKPpSSdjAQ^4OU8Gi+Pr0hMCvzzcYMcmTH@Ha!S&65f~tsXWL zGsY)L);(f1;jg+|#@}SgT2JZZSDD{E6b*Uf?Tw`_hP*w7cFF!JAa5EV&xw7A);*3O zAP=#_iUq}%Po^>sM zHicPZ%vMT2BxXNN`R!|n{9h0Y@mx1jU5x!%E%{%qkpHQH;p9K(uSot?j<9@mjQ&4} zq<6|GXAc(M=y!qc z-;Xdi$G%TAdb2h@=uVPyI|{+roJEGqizxk~+eor5L5lh42vzj&?@{xM_4dXW0^c9I zqmXTkY(b@#_<^);U;D7=zsSUf&E-@P40K_XXr{Qy3+) zpPo?;{9A~$KkByY?9t)e9?ey^OJ>J2CHy@0DATle3gOURxLsqAZqgg1caX||{BA(% zYzE!=`i>$EQqs2r^YnfE=UwXKMvZ^sPTbg<#no(0i+lUjry!%V+vun2NC}oC9DWqTrVl)CZ z)ugABKmQ!z|9OWQZ`%FjZ)8gqUHGc^Vw#C*{0tm7%itKt!7;9Pa6~cQ@O6KQ-ds)7 zgTwfa430kiHy6LFgU8J(Ja9z*rU)VNm$zxkrQBZK7p70KyT5>Vueg(KSZ%pVneaQ)!@w`ksX zae06yAWm;8Q27vLhC^huTKM!V`st0)OmAy1{un1V;+OigUq`*w_x!AH>*hB^ogWU! z9~)(Uhu@_6m2)coiOo;S2dms`^tjv&-WTIT%rKu4kH0+!TN*qKE&DzDo8QI~&wlTV z0?yxw|9a&5Tj-b8ioZq$g1HKLI+DKeP5-8IebM)2Z~h|s9{-jO67eb|a9sNRJjVBG zd=~QjyFaP+F1In2`@hy|_VcLnqgeSByb*<)xWB@6h5gsQi)`Ix1|_eKy0w=FW8)#8 zS8ubhUQ$RA_JqWdRoqaco7qi^2?3 z3b4ag*6#_{Z!39QwOePeMyk-Q{;tGuNtDKVyqT?Q^Y&TYtleg8*K2h*uK``%t!cMb zGbK%Yh}-{CV&r`4UhmTSA0NXlhUv%*S@A6QSghGu3;i{p1!kysH?+8#&o)n(5BLGn zFKqM{)a!^|>y3}}KUy38LlgT_fNprbZ-&3)4V{J1$Ss6=|N8@aiKjmH8qIH}`;@2F zUGMQVyMUPwxKDc;JgqIKar>!o2iiG1dJ$jm^-3SL{@DqA?>`m4*7s~4dtEmhb^qx^ zf4pXrF$m@zpO@pi!Ui02;Q*p{ij*W42?hj(KPdXRhh5^qqF(T_%qtak8X04VVqez1 z%J>EIvz-%Nc#?=6VuSS@Y)n)D%eU)|&CjFL*LMHJc!Y=cqTNB76hC+Mm+jk*T;H0@ z1;Ia~efRuUNd^HX3>lOc7{j=jD$6v}?ewg#qGX{CEh*}+2eXZdt&jD}2v#`QsKkGRF9M*-@ z=`E~jF0Vl@d)8Y}(`!6WWpDc(&-&l#*EfCceYtP?{MRcw`h1qtXN~{Xh!J4C3#TN$YwW z{~a!Vg?SN2)aYSy`cGZG_t>iPdPlN&{T}l=NE6ZZ|c(saX69`B5Un8xs&Z z-;&*=Gh^6yOhdQ@zp+Y`jF3t&?qx4X%Y0gYf13^XCQH4E;MV+E37au{s8!6y>J&4r z{!J$JgE8DIu;C^6^?ML-HL_>Ay0D`ek5iba4KzI(gCqsinME|6y!W~h>Y*q>Nc;Vg7--zW3Yk+CFwPa|pF`C0*NM z@n6~%3d#DjELd(={VyaJW}S%Qf0@FDC;MNl(7tziJi1_JD@Jw8S>{;K4D*v-d-Lm8klw8oAtUb6wP`i zAHvL@KIi|!dFKD3ZvJWN{K-4eY>b@$3rwHq{DSw>;Wgcn*5E;7+LLV6ziHLC-wc($Mk)LIJlLnm_aPFy~A= z!GeCB^g4Y#y)yWwNCL-q{Y%dEHDkwfeb4yMf6&dCM#E-|Lt%cITQN%$7jgEXTJd&K z3+|^`H2xT{1Z#>l=jEu{X)pR?HmUxYkqgU~tSAviE?l&-3_olO;g_w{zGBfrTai$@ z(!SyWfs*TtnaH#32*t}*t}GQ66)jnY$&p8vJydFg7w<0%;ZELc&c?;VEGuf?M*W)&mg~zxK zCfCpxQvq;=?FiygwBGZ`RLT_$Z_4**E&B!_;cI5w7XwJdv&MsgLOe`;t!CXzAywl+ zYB`84kDtKX#IrWRz_o+~BWv^N=I}M+B|mFGtDTHARpt~ZVupk)lA&=A

VNM47ySOnr1SARwfV9;90xBwML4)u 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 Mbg)Ds%&CPe*GLrwcqMa@T4lZJXg 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

Gv<@idcPHCT)UK$!9 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 -# and Paul Eggert . - -BEGIN -{ - my $datadir = ($ENV{'autom4te_perllibdir'} || '/usr/share/autoconf'); - unshift @INC, "$datadir"; -} - -use Autom4te::General; -use Autom4te::XFile; - -# $HELP -# ----- -$help = "Usage: $0 [OPTION] ... [FILE] ... - -Scan all of the C source FILES (or the standard input, if none are -given) and write to the standard output a sorted list of all the -identifiers that appear in those files in `#if', `#elif', `#ifdef', or -`#ifndef' directives. Print each identifier on a line, followed by a -space-separated list of the files in which that identifier occurs. - - -h, --help print this help, then exit - -V, --version print version number, then exit - -Report bugs to ."; - - -# $VERSION -# -------- -$version = "\ -ifnames (GNU Autoconf) 2.56 -Written by David J. MacKenzie and Paul Eggert. - -Copyright 2002 Free Software Foundation, Inc. -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."; - - -# &parse_args () -# -------------- -# Process any command line arguments. -sub parse_args () -{ - getopt (); -} - - -# %OCCURRENCE -# ----------- -my %occurrence; - - -# &scan_file ($FILENAME) -# ---------------------- -sub scan_file ($) -{ - my ($filename) = @_; - my $file = new Autom4te::XFile ($filename); - while ($_ = $file->getline) - { - # Continuation lines. - $_ .= $file->getline - while (s/\\$//); - - # Preprocessor directives. - if (s/^\s*\#\s*(if|ifdef|ifndef|elif)\s+//) - { - # Remove comments. Not perfect, but close enough. - s(/\*.*?\*/)(); - s(/\*.*)(); - foreach my $word (split (/\W+/)) - { - next - if $word eq 'defined' || $word !~ /^[a-zA-Z_]/; - $occurrence{$word}{$filename} = 1; - } - } - } -} - - -## ------ ## -## Main. ## -## ------ ## - -parse_args(); -foreach (@ARGV) - { - scan_file ($_); - } -foreach (sort keys %occurrence) - { - print "$_ ", join (' ', sort keys %{$occurrence{$_}}), "\n"; - } - -### Setup "GNU" style for perl-mode and cperl-mode. -## Local Variables: -## perl-indent-level: 2 -## perl-continued-statement-offset: 2 -## perl-continued-brace-offset: 0 -## perl-brace-offset: 0 -## perl-brace-imaginary-offset: 0 -## perl-label-offset: -2 -## cperl-indent-level: 2 -## cperl-brace-offset: 0 -## cperl-continued-brace-offset: 0 -## cperl-label-offset: -2 -## cperl-extra-newline-before-brace: t -## cperl-merge-trailing-else: nil -## cperl-continued-statement-offset: 2 -## End: diff --git a/bin/info.exe b/bin/info.exe deleted file mode 100644 index 41d17d184e00babb0d0c738cab223f5660a1c9b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcwPel00001 literal 163840 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 diff --git a/bin/libtool b/bin/libtool deleted file mode 100644 index 07a0f914..00000000 --- a/bin/libtool +++ /dev/null @@ -1,6967 +0,0 @@ -#! /bin/sh - -# libtoolT - Provide generalized library-building support services. -# Generated automatically by (GNU libtool 1.4e (1.1162 2002/11/22 22:36:25)) -# NOTE: Changes made to this file will be lost: look at ltmain.sh. -# -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. -# -# This file is part of GNU Libtool: -# Originally by Gordon Matzigkeit , 1996 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# Sed that helps us avoid accidentally triggering echo(1) options like -n. -Xsed="sed -e s/^X//" - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi - -# The names of the tagged configurations supported by this script. -available_tags=" CXX F77 GCJ" - -# ### BEGIN LIBTOOL CONFIG - -# Libtool was configured on host du216771: - -# Shell to use when invoking shell scripts. -SHELL="/bin/sh" - -# Whether or not to build shared libraries. -build_libtool_libs=no - -# Whether or not to build static libraries. -build_old_libs=yes - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=yes - -# Whether or not to disallow shared libs when runtime libs are static -allow_libtool_libs_with_static_runtimes=no - -# Whether or not to optimize for fast installation. -fast_install=yes - -# The host system. -host_alias= -host=i686-pc-msys - -# An echo program that does not interpret backslashes. -echo="echo" - -# The archiver. -AR="ar" -AR_FLAGS="cru" - -# A C compiler. -LTCC="gcc" - -# A language-specific compiler. -CC="gcc" - -# Is the compiler the GNU C compiler? -with_gcc=yes - -# An ERE matcher. -EGREP="grep -E" - -# The linker used to build libraries. -LD="/usr/msys/bin/ld.exe" - -# Whether we need hard or soft links. -LN_S="ln -s" - -# A BSD-compatible nm program. -NM="/bin/nm -B" - -# A sed program that does not truncate output. -SED="/bin/sed" - -# A symbol stripping program -STRIP=strip - -# Used to examine libraries when file_magic_cmd begins "file" -MAGIC_CMD=file - -# Used on cygwin: DLL creation program. -DLLTOOL="dlltool" - -# Used on cygwin: object dumper. -OBJDUMP="objdump" - -# Used on cygwin: assembler. -AS="as" - -# The name of the directory that contains temporary libtool files. -objdir=.libs - -# How to create reloadable object files. -reload_flag=" -r" -reload_cmds="\$LD\$reload_flag -o \$output\$reload_objs" - -# How to pass a linker flag through the compiler. -wl="-Wl," - -# Object file suffix (normally "o"). -objext="o" - -# Old archive suffix (normally "a"). -libext="a" - -# Executable file suffix (normally ""). -exeext="" - -# Additional compiler flags for building library objects. -pic_flag=" -DPIC" -pic_mode=default - -# What is the maximum length of a command? -max_cmd_len=262144 - -# Does compiler simultaneously support -c and -o options? -compiler_c_o="yes" - -# Must we lock files when doing compilation ? -need_locks="no" - -# Do we need the lib prefix for modules? -need_lib_prefix=unknown - -# Do we need a version for libraries? -need_version=unknown - -# Whether dlopen is supported. -dlopen_support=yes - -# Whether dlopen of programs is supported. -dlopen_self=no - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=unknown - -# Compiler flag to prevent dynamic linking. -link_static_flag="-static" - -# Compiler flag to turn off builtin functions. -no_builtin_flag=" -fno-builtin -fno-rtti -fno-exceptions" - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec="\${wl}--export-dynamic" - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec="\${wl}--whole-archive\$convenience \${wl}--no-whole-archive" - -# Compiler flag to generate thread-safe objects. -thread_safe_flag_spec="" - -# Library versioning type. -version_type=none - -# Format of library name prefix. -libname_spec="lib\$name" - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME. -library_names_spec="" - -# The coded name of the library, if different from the real name. -soname_spec="" - -# Commands used to build and install an old-style archive. -RANLIB="ranlib" -old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs\$old_deplibs~\$RANLIB \$oldlib" -old_postinstall_cmds="\$RANLIB \$oldlib~chmod 644 \$oldlib" -old_postuninstall_cmds="" - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds="" - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds="" - -# Commands used to build and install a shared archive. -archive_cmds="\$CC -shared \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname -o \$lib" -archive_expsym_cmds="\$CC -shared \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname \${wl}-retain-symbols-file \$wl\$export_symbols -o \$lib" -postinstall_cmds="" -postuninstall_cmds="" - -# Commands to strip libraries. -old_striplib="strip --strip-debug" -striplib="strip --strip-unneeded" - -# Dependencies to place before the objects being linked to create a -# shared library. -predep_objects="" - -# Dependencies to place after the objects being linked to create a -# shared library. -postdep_objects="" - -# Dependencies to place before the objects being linked to create a -# shared library. -predeps="" - -# Dependencies to place after the objects being linked to create a -# shared library. -postdeps="" - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path="" - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method="unknown" - -# Command to use when deplibs_check_method == file_magic. -file_magic_cmd="\$MAGIC_CMD" - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag="" - -# Flag that forces no undefined symbols. -no_undefined_flag="" - -# Commands used to finish a libtool library installation in a directory. -finish_cmds="" - -# Same as above, but a single script fragment to be evaled but not shown. -finish_eval="" - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe="sed -n -e 's/^.*[ ]\\([ABCDGISTW][ABCDGISTW]*\\)[ ][ ]*\\(_\\)\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2\\3 \\3/p'" - -# Transform the output of nm in a proper C declaration -global_symbol_to_cdecl="sed -n -e 's/^. .* \\(.*\\)\$/extern int \\1;/p'" - -# Transform the output of nm in a C name address pair -global_symbol_to_c_name_address="sed -n -e 's/^: \\([^ ]*\\) \$/ {\\\"\\1\\\", (lt_ptr) 0},/p' -e 's/^[BCDEGRST] \\([^ ]*\\) \\([^ ]*\\)\$/ {\"\\2\", (lt_ptr) \\&\\2},/p'" - -# This is the shared library runtime path variable. -runpath_var=LD_RUN_PATH - -# This is the shared library path variable. -shlibpath_var= - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=unknown - -# How to hardcode a shared library path into an executable. -hardcode_action=immediate - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=no - -# Flag to hardcode $libdir into a binary during linking. -# This must work even if $libdir does not exist. -hardcode_libdir_flag_spec="\${wl}--rpath \${wl}\$libdir" - -# Whether we need a single -rpath flag with a separated argument. -hardcode_libdir_separator="" - -# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the -# resulting binary. -hardcode_direct=no - -# Set to yes if using the -LDIR flag during linking hardcodes DIR into the -# resulting binary. -hardcode_minus_L=no - -# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into -# the resulting binary. -hardcode_shlibpath_var=unsupported - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at relink time. -variables_saved_for_relink="PATH LD_RUN_PATH GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=unknown - -# Compile-time system search path for libraries -sys_lib_search_path_spec=" /bin/../lib/gcc-lib/msys/2.95.3-1/ /bin/../lib/gcc-lib/ /usr/lib/gcc-lib/msys/2.95.3-1/ /usr/lib/gcc/msys/2.95.3-1/ /bin/../lib/gcc-lib/msys/2.95.3-1/../../../../msys/lib/msys/2.95.3-1/ /bin/../lib/gcc-lib/msys/2.95.3-1/../../../../msys/lib/ /usr/lib/gcc-lib/msys/2.95.3-1/../../../../msys/lib/msys/2.95.3-1/ /usr/lib/gcc-lib/msys/2.95.3-1/../../../../msys/lib/" - -# Run-time system search path for libraries -sys_lib_dlsearch_path_spec="/lib /usr/lib" - -# Fix the shell variable $srcfile for the compiler. -fix_srcfile_path="" - -# Set to yes if exported symbols are required. -always_export_symbols=no - -# The commands to list exported symbols. -export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | sed 's/.* //' | sort | uniq > \$export_symbols" - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds="" - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms="_GLOBAL_OFFSET_TABLE_" - -# Symbols that must always be exported. -include_expsyms="" - -# ### END LIBTOOL CONFIG - -# ltmain.sh - Provide generalized library-building support services. -# NOTE: Changing this file will not affect anything until you rerun configure. -# -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. -# Originally by Gordon Matzigkeit , 1996 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# Check that we have a working $echo. -if test "X$1" = X--no-reexec; then - # Discard the --no-reexec flag, and continue. - shift -elif test "X$1" = X--fallback-echo; then - # Avoid inline document here, it may be left over - : -elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then - # Yippee, $echo works! - : -else - # Restart under the correct shell, and then maybe $echo will work. - exec $SHELL "$0" --no-reexec ${1+"$@"} -fi - -if test "X$1" = X--fallback-echo; then - # used as fallback echo - shift - cat <&2 - echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 - exit 1 -fi - -# Global variables. -mode=$default_mode -nonopt= -prev= -prevopt= -run= -show="$echo" -show_help= -execute_dlfiles= -lo2o="s/\\.lo\$/.${objext}/" -o2lo="s/\\.${objext}\$/.lo/" - -##################################### -# Shell function definitions: -# This seems to be the best place for them - -# Need a lot of goo to handle *both* DLLs and import libs -# Has to be a shell function in order to 'eat' the argument -# that is supplied when $file_magic_command is called. -win32_libid () { - win32_libid_type="unknown" - if eval $OBJDUMP -f $1 2>/dev/null | \ - grep -E 'file format pei+-i386(.*architecture: i386)?' >/dev/null ; then - win32_libid_type="x86 DLL" - else - if eval $OBJDUMP -f $1 2>/dev/null | \ - grep -E 'file format pei*-i386(.*architecture: i386)?' >/dev/null ; then - win32_libid_type="x86" - if eval file $1 2>/dev/null | \ - grep -E 'ar archive' >/dev/null; then - win32_libid_type="$win32_libid_type archive" - if eval $NM -f posix -A $1 | awk '{print $3}' | grep "I" >/dev/null ; then - win32_libid_type="$win32_libid_type import" - else - win32_libid_type="$win32_libid_type static" - fi - fi - fi - fi - echo $win32_libid_type -} - -# End of Shell function definitions -##################################### - - -# Parse our command line options once, thoroughly. -while test "$#" -gt 0 -do - arg="$1" - shift - - case $arg in - -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; - *) optarg= ;; - esac - - # If the previous option needs an argument, assign it. - if test -n "$prev"; then - case $prev in - execute_dlfiles) - execute_dlfiles="$execute_dlfiles $arg" - ;; - tag) - tagname="$arg" - - # Check whether tagname contains only valid characters - case $tagname in - *[!-_A-Za-z0-9,/]*) - echo "$progname: invalid tag name: $tagname" 1>&2 - exit 1 - ;; - esac - - case $tagname in - CC) - # Don't test for the "default" C tag, as we know, it's there, but - # not specially marked. - ;; - *) - if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$0" > /dev/null; then - taglist="$taglist $tagname" - # Evaluate the configuration. - eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $0`" - else - echo "$progname: ignoring unknown tag $tagname" 1>&2 - fi - ;; - esac - ;; - *) - eval "$prev=\$arg" - ;; - esac - - prev= - prevopt= - continue - fi - - # Have we seen a non-optional argument yet? - case $arg in - --help) - show_help=yes - ;; - - --version) - echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" - echo - echo "Copyright 1996, 1997, 1998, 1999, 2000, 2001" - echo "Free Software Foundation, Inc." - echo "This is free software; see the source for copying conditions. There is NO" - echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - exit 0 - ;; - - --config) - ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $0 - # Now print the configurations for the tags. - for tagname in $taglist; do - ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$0" - done - exit 0 - ;; - - --debug) - echo "$progname: enabling shell trace mode" - set -x - ;; - - --dry-run | -n) - run=: - ;; - - --features) - echo "host: $host" - if test "$build_libtool_libs" = yes; then - echo "enable shared libraries" - else - echo "disable shared libraries" - fi - if test "$build_old_libs" = yes; then - echo "enable static libraries" - else - echo "disable static libraries" - fi - exit 0 - ;; - - --finish) mode="finish" ;; - - --mode) prevopt="--mode" prev=mode ;; - --mode=*) mode="$optarg" ;; - - --preserve-dup-deps) duplicate_deps="yes" ;; - - --quiet | --silent) - show=: - ;; - - --tag) prevopt="--tag" prev=tag ;; - --tag=*) - set tag "$optarg" ${1+"$@"} - shift - prev=tag - ;; - - -dlopen) - prevopt="-dlopen" - prev=execute_dlfiles - ;; - - -*) - $echo "$modename: unrecognized option \`$arg'" 1>&2 - $echo "$help" 1>&2 - exit 1 - ;; - - *) - nonopt="$arg" - break - ;; - esac -done - -if test -n "$prevopt"; then - $echo "$modename: option \`$prevopt' requires an argument" 1>&2 - $echo "$help" 1>&2 - exit 1 -fi - -# If this variable is set in any of the actions, the command in it -# will be execed at the end. This prevents here-documents from being -# left over by shells. -exec_cmd= - -if test -z "$show_help"; then - - # Infer the operation mode. - if test -z "$mode"; then - $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 - $echo "*** Future versions of Libtool will require -mode=MODE be specified." 1>&2 - case $nonopt in - *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) - mode=link - for arg - do - case $arg in - -c) - mode=compile - break - ;; - esac - done - ;; - *db | *dbx | *strace | *truss) - mode=execute - ;; - *install*|cp|mv) - mode=install - ;; - *rm) - mode=uninstall - ;; - *) - # If we have no mode, but dlfiles were specified, then do execute mode. - test -n "$execute_dlfiles" && mode=execute - - # Just use the default operation mode. - if test -z "$mode"; then - if test -n "$nonopt"; then - $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 - else - $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 - fi - fi - ;; - esac - fi - - # Only execute mode is allowed to have -dlopen flags. - if test -n "$execute_dlfiles" && test "$mode" != execute; then - $echo "$modename: unrecognized option \`-dlopen'" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - # Change the help message to a mode-specific one. - generic_help="$help" - help="Try \`$modename --help --mode=$mode' for more information." - - # These modes are in order of execution frequency so that they run quickly. - case $mode in - # libtool compile mode - compile) - modename="$modename: compile" - # Get the compilation command and the source file. - base_compile= - srcfile="$nonopt" # always keep a non-empty value in "srcfile" - suppress_output= - arg_mode=normal - libobj= - - for arg - do - case "$arg_mode" in - arg ) - # do not "continue". Instead, add this to base_compile - lastarg="$arg" - arg_mode=normal - ;; - - target ) - libobj="$arg" - arg_mode=normal - continue - ;; - - normal ) - # Accept any command-line options. - case $arg in - -o) - if test -n "$libobj" ; then - $echo "$modename: you cannot specify \`-o' more than once" 1>&2 - exit 1 - fi - arg_mode=target - continue - ;; - - -static) - build_old_libs=yes - continue - ;; - - -prefer-pic) - pic_mode=yes - continue - ;; - - -prefer-non-pic) - pic_mode=no - continue - ;; - - -Xcompiler) - arg_mode=arg # the next one goes into the "base_compile" arg list - continue # The current "srcfile" will either be retained or - ;; # replaced later. I would guess that would be a bug. - - -Wc,*) - args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` - lastarg= - save_ifs="$IFS"; IFS=',' - for arg in $args; do - IFS="$save_ifs" - - # Double-quote args containing other shell metacharacters. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - lastarg="$lastarg $arg" - done - IFS="$save_ifs" - lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` - - # Add the arguments to base_compile. - base_compile="$base_compile $lastarg" - continue - ;; - - * ) - # Accept the current argument as the source file. - # The previous "srcfile" becomes the current argument. - # - lastarg="$srcfile" - srcfile="$arg" - ;; - esac # case $arg - ;; - esac # case $arg_mode - - # Aesthetically quote the previous argument. - lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` - - case $lastarg in - # Double-quote args containing other shell metacharacters. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - lastarg="\"$lastarg\"" - ;; - esac - - base_compile="$base_compile $lastarg" - done # for arg - - case $arg_mode in - arg) - $echo "$modename: you must specify an argument for -Xcompile" - exit 1 - ;; - target) - $echo "$modename: you must specify a target with \`-o'" 1>&2 - exit 1 - ;; - *) - # Get the name of the library object. - [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` - ;; - esac - - # Recognize several different file suffixes. - # If the user specifies -o file.o, it is replaced with file.lo - xform='[cCFSifmso]' - case $libobj in - *.ada) xform=ada ;; - *.adb) xform=adb ;; - *.ads) xform=ads ;; - *.asm) xform=asm ;; - *.c++) xform=c++ ;; - *.cc) xform=cc ;; - *.ii) xform=ii ;; - *.class) xform=class ;; - *.cpp) xform=cpp ;; - *.cxx) xform=cxx ;; - *.f90) xform=f90 ;; - *.for) xform=for ;; - *.java) xform=java ;; - esac - - libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` - - case $libobj in - *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; - *) - $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 - exit 1 - ;; - esac - - # Infer tagged configuration to use if any are available and - # if one wasn't chosen via the "--tag" command line option. - # Only attempt this if the compiler in the base compile - # command doesn't match the default compiler. - if test -n "$available_tags" && test -z "$tagname"; then - case $base_compile in - # Blanks in the command may have been stripped by the calling shell, - # but not from the CC environment variable when configure was run. - " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "*) ;; - # Blanks at the start of $base_compile will cause this to fail - # if we don't check for them as well. - *) - for z in $available_tags; do - if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$0" > /dev/null; then - # Evaluate the configuration. - eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $0`" - case "$base_compile " in - "$CC "* | " $CC "* | "`$echo $CC` "* | " `$echo $CC` "*) - # The compiler in the base compile command matches - # the one in the tagged configuration. - # Assume this is the tagged configuration we want. - tagname=$z - break - ;; - esac - fi - done - # If $tagname still isn't set, then no tagged configuration - # was found and let the user know that the "--tag" command - # line option must be used. - if test -z "$tagname"; then - echo "$modename: unable to infer tagged configuration" - echo "$modename: specify a tag with \`--tag'" 1>&2 - exit 1 -# else -# echo "$modename: using $tagname tagged configuration" - fi - ;; - esac - fi - - objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` - xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$obj"; then - xdir= - else - xdir=$xdir/ - fi - lobj=${xdir}$objdir/$objname - - if test -z "$base_compile"; then - $echo "$modename: you must specify a compilation command" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - # Delete any leftover library objects. - if test "$build_old_libs" = yes; then - removelist="$obj $lobj $libobj ${libobj}T" - else - removelist="$lobj $libobj ${libobj}T" - fi - - $run $rm $removelist - trap "$run $rm $removelist; exit 1" 1 2 15 - - # On Cygwin there's no "real" PIC flag so we must build both object types - case $host_os in - cygwin* | mingw* | pw32* | os2*) - pic_mode=default - ;; - esac - if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then - # non-PIC code in shared libraries is not supported - pic_mode=default - fi - - # Calculate the filename of the output object if compiler does - # not support -o with -c - if test "$compiler_c_o" = no; then - output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} - lockfile="$output_obj.lock" - removelist="$removelist $output_obj $lockfile" - trap "$run $rm $removelist; exit 1" 1 2 15 - else - output_obj= - need_locks=no - lockfile= - fi - - # Lock this critical section if it is needed - # We use this script file to make the link, it avoids creating a new file - if test "$need_locks" = yes; then - until $run ln "$0" "$lockfile" 2>/dev/null; do - $show "Waiting for $lockfile to be removed" - sleep 2 - done - elif test "$need_locks" = warn; then - if test -f "$lockfile"; then - echo "\ -*** ERROR, $lockfile exists and contains: -`cat $lockfile 2>/dev/null` - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $run $rm $removelist - exit 1 - fi - echo $srcfile > "$lockfile" - fi - - if test -n "$fix_srcfile_path"; then - eval srcfile=\"$fix_srcfile_path\" - fi - - $run $rm "$libobj" "${libobj}T" - - # Create a libtool object file (analogous to a ".la" file), - # but don't create it if we're doing a dry run. - test -z "$run" && cat > ${libobj}T </dev/null`" != "X$srcfile"; then - echo "\ -*** ERROR, $lockfile contains: -`cat $lockfile 2>/dev/null` - -but it should contain: -$srcfile - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $run $rm $removelist - exit 1 - fi - - # Just move the object if needed, then go on to compile the next one - if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then - $show "$mv $output_obj $lobj" - if $run $mv $output_obj $lobj; then : - else - error=$? - $run $rm $removelist - exit $error - fi - fi - - # Append the name of the PIC object to the libtool object file. - test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null`" != "X$srcfile"; then - echo "\ -*** ERROR, $lockfile contains: -`cat $lockfile 2>/dev/null` - -but it should contain: -$srcfile - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $run $rm $removelist - exit 1 - fi - - # Just move the object if needed - if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then - $show "$mv $output_obj $obj" - if $run $mv $output_obj $obj; then : - else - error=$? - $run $rm $removelist - exit $error - fi - fi - - # Append the name of the non-PIC object the libtool object file. - # Only append if the libtool object file exists. - test -z "$run" && cat >> ${libobj}T <> ${libobj}T <&2 - fi - if test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - else - if test -z "$pic_flag" && test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - fi - build_libtool_libs=no - build_old_libs=yes - prefer_static_libs=yes - break - ;; - esac - done - - # See if our shared archives depend on static archives. - test -n "$old_archive_from_new_cmds" && build_old_libs=yes - - # Go through the arguments, transforming them on the way. - while test "$#" -gt 0; do - arg="$1" - base_compile="$base_compile $arg" - shift - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test - ;; - *) qarg=$arg ;; - esac - libtool_args="$libtool_args $qarg" - - # If the previous option needs an argument, assign it. - if test -n "$prev"; then - case $prev in - output) - compile_command="$compile_command @OUTPUT@" - finalize_command="$finalize_command @OUTPUT@" - ;; - esac - - case $prev in - dlfiles|dlprefiles) - if test "$preload" = no; then - # Add the symbol object into the linking commands. - compile_command="$compile_command @SYMFILE@" - finalize_command="$finalize_command @SYMFILE@" - preload=yes - fi - case $arg in - *.la | *.lo) ;; # We handle these cases below. - force) - if test "$dlself" = no; then - dlself=needless - export_dynamic=yes - fi - prev= - continue - ;; - self) - if test "$prev" = dlprefiles; then - dlself=yes - elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then - dlself=yes - else - dlself=needless - export_dynamic=yes - fi - prev= - continue - ;; - *) - if test "$prev" = dlfiles; then - dlfiles="$dlfiles $arg" - else - dlprefiles="$dlprefiles $arg" - fi - prev= - continue - ;; - esac - ;; - expsyms) - export_symbols="$arg" - if test ! -f "$arg"; then - $echo "$modename: symbol file \`$arg' does not exist" - exit 1 - fi - prev= - continue - ;; - expsyms_regex) - export_symbols_regex="$arg" - prev= - continue - ;; - inst_prefix) - inst_prefix_dir="$arg" - prev= - continue - ;; - release) - release="-$arg" - prev= - continue - ;; - objectlist) - if test -f "$arg"; then - save_arg=$arg - moreargs= - for fil in `cat $save_arg` - do -# moreargs="$moreargs $fil" - arg=$fil - # A libtool-controlled object. - - # Check to see that this really is a libtool object. - if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - pic_object= - non_pic_object= - - # Read the .lo file - # If there is no directory component, then add one. - case $arg in - */* | *\\*) . $arg ;; - *) . ./$arg ;; - esac - - if test -z "$pic_object" || \ - test -z "$non_pic_object" || - test "$pic_object" = none && \ - test "$non_pic_object" = none; then - $echo "$modename: cannot find name of object for \`$arg'" 1>&2 - exit 1 - fi - - # Extract subdirectory from the argument. - xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$arg"; then - xdir= - else - xdir="$xdir/" - fi - - if test "$pic_object" != none; then - # Prepend the subdirectory the object is found in. - pic_object="$xdir$pic_object" - - if test "$prev" = dlfiles; then - if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then - dlfiles="$dlfiles $pic_object" - prev= - continue - else - # If libtool objects are unsupported, then we need to preload. - prev=dlprefiles - fi - fi - - # CHECK ME: I think I busted this. -Ossama - if test "$prev" = dlprefiles; then - # Preload the old-style object. - dlprefiles="$dlprefiles $pic_object" - prev= - fi - - # A PIC object. - libobjs="$libobjs $pic_object" - arg="$pic_object" - fi - - # Non-PIC object. - if test "$non_pic_object" != none; then - # Prepend the subdirectory the object is found in. - non_pic_object="$xdir$non_pic_object" - - # A standard non-PIC object - non_pic_objects="$non_pic_objects $non_pic_object" - if test -z "$pic_object" || test "$pic_object" = none ; then - arg="$non_pic_object" - fi - fi - else - # Only an error if not doing a dry-run. - if test -z "$run"; then - $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 - exit 1 - else - # Dry-run case. - - # Extract subdirectory from the argument. - xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$arg"; then - xdir= - else - xdir="$xdir/" - fi - - pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` - non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` - libobjs="$libobjs $pic_object" - non_pic_objects="$non_pic_objects $non_pic_object" - fi - fi - done - else - $echo "$modename: link input file \`$save_arg' does not exist" - exit 1 - fi - arg=$save_arg - prev= - continue - ;; - rpath | xrpath) - # We need an absolute path. - case $arg in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - $echo "$modename: only absolute run-paths are allowed" 1>&2 - exit 1 - ;; - esac - if test "$prev" = rpath; then - case "$rpath " in - *" $arg "*) ;; - *) rpath="$rpath $arg" ;; - esac - else - case "$xrpath " in - *" $arg "*) ;; - *) xrpath="$xrpath $arg" ;; - esac - fi - prev= - continue - ;; - xcompiler) - compiler_flags="$compiler_flags $qarg" - prev= - compile_command="$compile_command $qarg" - finalize_command="$finalize_command $qarg" - continue - ;; - xlinker) - linker_flags="$linker_flags $qarg" - compiler_flags="$compiler_flags $wl$qarg" - prev= - compile_command="$compile_command $wl$qarg" - finalize_command="$finalize_command $wl$qarg" - continue - ;; - xcclinker) - linker_flags="$linker_flags $qarg" - compiler_flags="$compiler_flags $qarg" - prev= - compile_command="$compile_command $qarg" - finalize_command="$finalize_command $qarg" - continue - ;; - *) - eval "$prev=\"\$arg\"" - prev= - continue - ;; - esac - fi # test -n "$prev" - - prevarg="$arg" - - case $arg in - -all-static) - if test -n "$link_static_flag"; then - compile_command="$compile_command $link_static_flag" - finalize_command="$finalize_command $link_static_flag" - fi - continue - ;; - - -allow-undefined) - # FIXME: remove this flag sometime in the future. - $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 - continue - ;; - - -avoid-version) - avoid_version=yes - continue - ;; - - -dlopen) - prev=dlfiles - continue - ;; - - -dlpreopen) - prev=dlprefiles - continue - ;; - - -export-dynamic) - export_dynamic=yes - continue - ;; - - -export-symbols | -export-symbols-regex) - if test -n "$export_symbols" || test -n "$export_symbols_regex"; then - $echo "$modename: more than one -exported-symbols argument is not allowed" - exit 1 - fi - if test "X$arg" = "X-export-symbols"; then - prev=expsyms - else - prev=expsyms_regex - fi - continue - ;; - - -inst-prefix-dir) - prev=inst_prefix - continue - ;; - - # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* - # so, if we see these flags be careful not to treat them like -L - -L[A-Z][A-Z]*:*) - case $with_gcc/$host in - no/*-*-irix* | /*-*-irix*) - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" - ;; - esac - continue - ;; - - -L*) - dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - absdir=`cd "$dir" && pwd` - if test -z "$absdir"; then - $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 - exit 1 - fi - dir="$absdir" - ;; - esac - case "$deplibs " in - *" -L$dir "*) ;; - *) - deplibs="$deplibs -L$dir" - lib_search_path="$lib_search_path $dir" - ;; - esac - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) - case :$dllsearchpath: in - *":$dir:"*) ;; - *) dllsearchpath="$dllsearchpath:$dir";; - esac - ;; - esac - continue - ;; - - -l*) - if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then - case $host in - *-*-cygwin* | *-*-pw32* | *-*-beos*) - # These systems don't actually have a C or math library (as such) - continue - ;; - *-*-mingw* | *-*-os2*) - # These systems don't actually have a C library (as such) - test "X$arg" = "X-lc" && continue - ;; - *-*-openbsd* | *-*-freebsd*) - # Do not include libc due to us having libc/libc_r. - test "X$arg" = "X-lc" && continue - ;; - *-*-rhapsody* | *-*-darwin1.[012]) - # Rhapsody C and math libraries are in the System framework - deplibs="$deplibs -framework System" - continue - esac - elif test "X$arg" = "X-lc_r"; then - case $host in - *-*-openbsd* | *-*-freebsd*) - # Do not include libc_r directly, use -pthread flag. - continue - ;; - esac - fi - deplibs="$deplibs $arg" - continue - ;; - - -module) - module=yes - continue - ;; - - # gcc -m* arguments should be passed to the linker via $compiler_flags - # in order to pass architecture information to the linker - # (e.g. 32 vs 64-bit). This may also be accomplished via -Wl,-mfoo - # but this is not reliable with gcc because gcc may use -mfoo to - # select a different linker, different libraries, etc, while - # -Wl,-mfoo simply passes -mfoo to the linker. - -m*) - # Unknown arguments in both finalize_command and compile_command need - # to be aesthetically quoted because they are evaled later. - arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" - if test "$with_gcc" = "yes" ; then - compiler_flags="$compiler_flags $arg" - fi - continue - ;; - - -no-fast-install) - fast_install=no - continue - ;; - - -no-install) - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) - # The PATH hackery in wrapper scripts is required on Windows - # in order for the loader to find any dlls it needs. - $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 - $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 - fast_install=no - ;; - *) no_install=yes ;; - esac - continue - ;; - - -no-undefined) - allow_undefined=no - continue - ;; - - -objectlist) - prev=objectlist - continue - ;; - - -o) prev=output ;; - - -release) - prev=release - continue - ;; - - -rpath) - prev=rpath - continue - ;; - - -R) - prev=xrpath - continue - ;; - - -R*) - dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - $echo "$modename: only absolute run-paths are allowed" 1>&2 - exit 1 - ;; - esac - case "$xrpath " in - *" $dir "*) ;; - *) xrpath="$xrpath $dir" ;; - esac - continue - ;; - - -static) - # The effects of -static are defined in a previous loop. - # We used to do the same as -all-static on platforms that - # didn't have a PIC flag, but the assumption that the effects - # would be equivalent was wrong. It would break on at least - # Digital Unix and AIX. - continue - ;; - - -thread-safe) - thread_safe=yes - continue - ;; - - -version-info) - prev=vinfo - continue - ;; - - -Wc,*) - args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` - arg= - save_ifs="$IFS"; IFS=',' - for flag in $args; do - IFS="$save_ifs" - case $flag in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - flag="\"$flag\"" - ;; - esac - arg="$arg $wl$flag" - compiler_flags="$compiler_flags $flag" - done - IFS="$save_ifs" - arg=`$echo "X$arg" | $Xsed -e "s/^ //"` - ;; - - -Wl,*) - args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` - arg= - save_ifs="$IFS"; IFS=',' - for flag in $args; do - IFS="$save_ifs" - case $flag in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - flag="\"$flag\"" - ;; - esac - arg="$arg $wl$flag" - compiler_flags="$compiler_flags $wl$flag" - linker_flags="$linker_flags $flag" - done - IFS="$save_ifs" - arg=`$echo "X$arg" | $Xsed -e "s/^ //"` - ;; - - -Xcompiler) - prev=xcompiler - continue - ;; - - -Xlinker) - prev=xlinker - continue - ;; - - -XCClinker) - prev=xcclinker - continue - ;; - - # Some other compiler flag. - -* | +*) - # Unknown arguments in both finalize_command and compile_command need - # to be aesthetically quoted because they are evaled later. - arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - ;; - - *.$objext) - # A standard object. - objs="$objs $arg" - ;; - - *.lo) - # A libtool-controlled object. - - # Check to see that this really is a libtool object. - if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - pic_object= - non_pic_object= - - # Read the .lo file - # If there is no directory component, then add one. - case $arg in - */* | *\\*) . $arg ;; - *) . ./$arg ;; - esac - - if test -z "$pic_object" || \ - test -z "$non_pic_object" || - test "$pic_object" = none && \ - test "$non_pic_object" = none; then - $echo "$modename: cannot find name of object for \`$arg'" 1>&2 - exit 1 - fi - - # Extract subdirectory from the argument. - xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$arg"; then - xdir= - else - xdir="$xdir/" - fi - - if test "$pic_object" != none; then - # Prepend the subdirectory the object is found in. - pic_object="$xdir$pic_object" - - if test "$prev" = dlfiles; then - if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then - dlfiles="$dlfiles $pic_object" - prev= - continue - else - # If libtool objects are unsupported, then we need to preload. - prev=dlprefiles - fi - fi - - # CHECK ME: I think I busted this. -Ossama - if test "$prev" = dlprefiles; then - # Preload the old-style object. - dlprefiles="$dlprefiles $pic_object" - prev= - fi - - # A PIC object. - libobjs="$libobjs $pic_object" - arg="$pic_object" - fi - - # Non-PIC object. - if test "$non_pic_object" != none; then - # Prepend the subdirectory the object is found in. - non_pic_object="$xdir$non_pic_object" - - # A standard non-PIC object - non_pic_objects="$non_pic_objects $non_pic_object" - if test -z "$pic_object" || test "$pic_object" = none ; then - arg="$non_pic_object" - fi - fi - else - # Only an error if not doing a dry-run. - if test -z "$run"; then - $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 - exit 1 - else - # Dry-run case. - - # Extract subdirectory from the argument. - xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$arg"; then - xdir= - else - xdir="$xdir/" - fi - - pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` - non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` - libobjs="$libobjs $pic_object" - non_pic_objects="$non_pic_objects $non_pic_object" - fi - fi - ;; - - *.$libext) - # An archive. - deplibs="$deplibs $arg" - old_deplibs="$old_deplibs $arg" - continue - ;; - - *.la) - # A libtool-controlled library. - - if test "$prev" = dlfiles; then - # This library was specified with -dlopen. - dlfiles="$dlfiles $arg" - prev= - elif test "$prev" = dlprefiles; then - # The library was specified with -dlpreopen. - dlprefiles="$dlprefiles $arg" - prev= - else - deplibs="$deplibs $arg" - fi - continue - ;; - - # Some other compiler argument. - *) - # Unknown arguments in both finalize_command and compile_command need - # to be aesthetically quoted because they are evaled later. - arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - ;; - esac # arg - - # Now actually substitute the argument into the commands. - if test -n "$arg"; then - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" - fi - done # argument parsing loop - - if test -n "$prev"; then - $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - # Infer tagged configuration to use if any are available and - # if one wasn't chosen via the "--tag" command line option. - # Only attempt this if the compiler in the base link - # command doesn't match the default compiler. - if test -n "$available_tags" && test -z "$tagname"; then - case $base_compile in - # Blanks in the command may have been stripped by the calling shell, - # but not from the CC environment variable when configure was run. - "$CC "* | " $CC "* | "`$echo $CC` "* | " `$echo $CC` "*) ;; - # Blanks at the start of $base_compile will cause this to fail - # if we don't check for them as well. - *) - for z in $available_tags; do - if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$0" > /dev/null; then - # Evaluate the configuration. - eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $0`" - case $base_compile in - "$CC "* | " $CC "* | "`$echo $CC` "* | " `$echo $CC` "*) - # The compiler in $compile_command matches - # the one in the tagged configuration. - # Assume this is the tagged configuration we want. - tagname=$z - break - ;; - esac - fi - done - # If $tagname still isn't set, then no tagged configuration - # was found and let the user know that the "--tag" command - # line option must be used. - if test -z "$tagname"; then - echo "$modename: unable to infer tagged configuration" - echo "$modename: specify a tag with \`--tag'" 1>&2 - exit 1 -# else -# echo "$modename: using $tagname tagged configuration" - fi - ;; - esac - fi - - if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then - eval arg=\"$export_dynamic_flag_spec\" - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" - fi - - oldlibs= - # calculate the name of the file, without its directory - outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` - libobjs_save="$libobjs" - - if test -n "$shlibpath_var"; then - # get the directories listed in $shlibpath_var - eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` - else - shlib_search_path= - fi - eval sys_lib_search_path=\"$sys_lib_search_path_spec\" - eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" - - output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` - if test "X$output_objdir" = "X$output"; then - output_objdir="$objdir" - else - output_objdir="$output_objdir/$objdir" - fi - # Create the object directory. - if test ! -d "$output_objdir"; then - $show "$mkdir $output_objdir" - $run $mkdir $output_objdir - status=$? - if test "$status" -ne 0 && test ! -d "$output_objdir"; then - exit $status - fi - fi - - # Determine the type of output - case $output in - "") - $echo "$modename: you must specify an output file" 1>&2 - $echo "$help" 1>&2 - exit 1 - ;; - *.$libext) linkmode=oldlib ;; - *.lo | *.$objext) linkmode=obj ;; - *.la) linkmode=lib ;; - *) linkmode=prog ;; # Anything else should be a program. - esac - - case $host in - *cygwin* | *mingw* | *pw32*) - # don't eliminate duplcations in $postdeps and $predeps - duplicate_compiler_generated_deps=yes - ;; - *) - duplicate_compiler_generated_deps=$duplicate_deps - ;; - esac - specialdeplibs= - - libs= - # Find all interdependent deplibs by searching for libraries - # that are linked more than once (e.g. -la -lb -la) - for deplib in $deplibs; do - if test "X$duplicate_deps" = "Xyes" ; then - case "$libs " in - *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; - esac - fi - libs="$libs $deplib" - done - - if test "$linkmode" = lib; then - libs="$predeps $libs $compiler_lib_search_path $postdeps" - - # Compute libraries that are listed more than once in $predeps - # $postdeps and mark them as special (i.e., whose duplicates are - # not to be eliminated). - pre_post_deps= - if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then - for pre_post_dep in $predeps $postdeps; do - case "$pre_post_deps " in - *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; - esac - pre_post_deps="$pre_post_deps $pre_post_dep" - done - fi - pre_post_deps= - fi - - deplibs= - newdependency_libs= - newlib_search_path= - need_relink=no # whether we're linking any uninstalled libtool libraries - notinst_deplibs= # not-installed libtool libraries - notinst_path= # paths that contain not-installed libtool libraries - case $linkmode in - lib) - passes="conv link" - for file in $dlfiles $dlprefiles; do - case $file in - *.la) ;; - *) - $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 - exit 1 - ;; - esac - done - ;; - prog) - compile_deplibs= - finalize_deplibs= - alldeplibs=no - newdlfiles= - newdlprefiles= - passes="conv scan dlopen dlpreopen link" - ;; - *) passes="conv" - ;; - esac - for pass in $passes; do - if test "$linkmode,$pass" = "lib,link" || - test "$linkmode,$pass" = "prog,scan"; then - libs="$deplibs" - deplibs= - fi - if test "$linkmode" = prog; then - case $pass in - dlopen) libs="$dlfiles" ;; - dlpreopen) libs="$dlprefiles" ;; - link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; - esac - fi - if test "$pass" = dlopen; then - # Collect dlpreopened libraries - save_deplibs="$deplibs" - deplibs= - fi - for deplib in $libs; do - lib= - found=no - case $deplib in - -l*) - if test "$linkmode" != lib && test "$linkmode" != prog; then - $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 - continue - fi - if test "$pass" = conv; then - deplibs="$deplib $deplibs" - continue - fi - name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` - for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do - # Search the libtool library - lib="$searchdir/lib${name}.la" - if test -f "$lib"; then - found=yes - break - fi - done - if test "$found" != yes; then - # deplib doesn't seem to be a libtool library - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" - fi - continue - else # deplib is a libtool library - # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, - # We need to do some special things here, and not later. - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - case " $predeps $postdeps " in - *" $deplib "*) - if (${SED} -e '2q' $lib | - grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - library_names= - old_library= - case $lib in - */* | *\\*) . $lib ;; - *) . ./$lib ;; - esac - for l in $old_library $library_names; do - ll="$l" - done - if test "X$ll" = "X$old_library" ; then # only static version available - found=no - ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` - test "X$ladir" = "X$lib" && ladir="." - lib=$ladir/$old_library - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" - fi - continue - fi - fi - ;; - *) ;; - esac - fi - fi - ;; # -l - -L*) - case $linkmode in - lib) - deplibs="$deplib $deplibs" - test "$pass" = conv && continue - newdependency_libs="$deplib $newdependency_libs" - newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` - ;; - prog) - if test "$pass" = conv; then - deplibs="$deplib $deplibs" - continue - fi - if test "$pass" = scan; then - deplibs="$deplib $deplibs" - newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` - else - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - fi - ;; - *) - $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 - ;; - esac # linkmode - continue - ;; # -L - -R*) - if test "$pass" = link; then - dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` - # Make sure the xrpath contains only unique directories. - case "$xrpath " in - *" $dir "*) ;; - *) xrpath="$xrpath $dir" ;; - esac - fi - deplibs="$deplib $deplibs" - continue - ;; - *.la) lib="$deplib" ;; - *.$libext) - if test "$pass" = conv; then - deplibs="$deplib $deplibs" - continue - fi - case $linkmode in - lib) - if test "$deplibs_check_method" != pass_all; then - echo - echo "*** Warning: Trying to link with static lib archive $deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because the file extensions .$libext of this argument makes me believe" - echo "*** that it is just a static archive that I should not used here." - else - echo - echo "*** Warning: Linking the shared library $output against the" - echo "*** static library $deplib is not portable!" - deplibs="$deplib $deplibs" - fi - continue - ;; - prog) - if test "$pass" != link; then - deplibs="$deplib $deplibs" - else - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - fi - continue - ;; - esac # linkmode - ;; # *.$libext - *.lo | *.$objext) - if test "$pass" = conv; then - deplibs="$deplib $deplibs" - elif test "$linkmode" = prog; then - if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then - # If there is no dlopen support or we're linking statically, - # we need to preload. - newdlprefiles="$newdlprefiles $deplib" - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - newdlfiles="$newdlfiles $deplib" - fi - fi - continue - ;; - %DEPLIBS%) - alldeplibs=yes - continue - ;; - esac # case $deplib - if test "$found" = yes || test -f "$lib"; then : - else - $echo "$modename: cannot find the library \`$lib'" 1>&2 - exit 1 - fi - - # Check to see that this really is a libtool archive. - if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : - else - $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 - exit 1 - fi - - ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` - test "X$ladir" = "X$lib" && ladir="." - - dlname= - dlopen= - dlpreopen= - libdir= - library_names= - old_library= - # If the library was installed with an old release of libtool, - # it will not redefine variable installed. - installed=yes - - # Read the .la file - case $lib in - */* | *\\*) . $lib ;; - *) . ./$lib ;; - esac - - if test "$linkmode,$pass" = "lib,link" || - test "$linkmode,$pass" = "prog,scan" || - { test "$linkmode" != prog && test "$linkmode" != lib; }; then - test -n "$dlopen" && dlfiles="$dlfiles $dlopen" - test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" - fi - - if test "$pass" = conv; then - # Only check for convenience libraries - deplibs="$lib $deplibs" - if test -z "$libdir"; then - if test -z "$old_library"; then - $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 - exit 1 - fi - # It is a libtool convenience library, so add in its objects. - convenience="$convenience $ladir/$objdir/$old_library" - old_convenience="$old_convenience $ladir/$objdir/$old_library" - tmp_libs= - for deplib in $dependency_libs; do - deplibs="$deplib $deplibs" - if test "X$duplicate_deps" = "Xyes" ; then - case "$tmp_libs " in - *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; - esac - fi - tmp_libs="$tmp_libs $deplib" - done - elif test "$linkmode" != prog && test "$linkmode" != lib; then - $echo "$modename: \`$lib' is not a convenience library" 1>&2 - exit 1 - fi - continue - fi # $pass = conv - - # Get the name of the library we link against. - linklib= - for l in $old_library $library_names; do - linklib="$l" - done - if test -z "$linklib"; then - $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 - exit 1 - fi - - # This library was specified with -dlopen. - if test "$pass" = dlopen; then - if test -z "$libdir"; then - $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 - exit 1 - fi - if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then - # If there is no dlname, no dlopen support or we're linking - # statically, we need to preload. We also need to preload any - # dependent libraries so libltdl's deplib preloader doesn't - # bomb out in the load deplibs phase. - dlprefiles="$dlprefiles $lib $dependency_libs" - else - newdlfiles="$newdlfiles $lib" - fi - continue - fi # $pass = dlopen - - # We need an absolute path. - case $ladir in - [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; - *) - abs_ladir=`cd "$ladir" && pwd` - if test -z "$abs_ladir"; then - $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 - $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 - abs_ladir="$ladir" - fi - ;; - esac - laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` - - # Find the relevant object directory and library name. - if test "X$installed" = Xyes; then - if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then - $echo "$modename: warning: library \`$lib' was moved." 1>&2 - dir="$ladir" - absdir="$abs_ladir" - libdir="$abs_ladir" - else - dir="$libdir" - absdir="$libdir" - fi - else - dir="$ladir/$objdir" - absdir="$abs_ladir/$objdir" - # Remove this search path later - notinst_path="$notinst_path $abs_ladir" - fi # $installed = yes - name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` - - # This library was specified with -dlpreopen. - if test "$pass" = dlpreopen; then - if test -z "$libdir"; then - $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 - exit 1 - fi - # Prefer using a static library (so that no silly _DYNAMIC symbols - # are required to link). - if test -n "$old_library"; then - newdlprefiles="$newdlprefiles $dir/$old_library" - # Otherwise, use the dlname, so that lt_dlopen finds it. - elif test -n "$dlname"; then - newdlprefiles="$newdlprefiles $dir/$dlname" - else - newdlprefiles="$newdlprefiles $dir/$linklib" - fi - fi # $pass = dlpreopen - - if test -z "$libdir"; then - # Link the convenience library - if test "$linkmode" = lib; then - deplibs="$dir/$old_library $deplibs" - elif test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$dir/$old_library $compile_deplibs" - finalize_deplibs="$dir/$old_library $finalize_deplibs" - else - deplibs="$lib $deplibs" # used for prog,scan pass - fi - continue - fi - - if test "$linkmode" = prog && test "$pass" != link; then - newlib_search_path="$newlib_search_path $ladir" - deplibs="$lib $deplibs" - - linkalldeplibs=no - if test "$link_all_deplibs" != no || test -z "$library_names" || - test "$build_libtool_libs" = no; then - linkalldeplibs=yes - fi - - tmp_libs= - for deplib in $dependency_libs; do - case $deplib in - -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test - esac - # Need to link against all dependency_libs? - if test "$linkalldeplibs" = yes; then - deplibs="$deplib $deplibs" - else - # Need to hardcode shared library paths - # or/and link against static libraries - newdependency_libs="$deplib $newdependency_libs" - fi - if test "X$duplicate_deps" = "Xyes" ; then - case "$tmp_libs " in - *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; - esac - fi - tmp_libs="$tmp_libs $deplib" - done # for deplib - continue - fi # $linkmode = prog... - - if test "$linkmode,$pass" = "prog,link"; then - if test -n "$library_names" && - { test "$prefer_static_libs" = no || test -z "$old_library"; }; then - # We need to hardcode the library path - if test -n "$shlibpath_var"; then - # Make sure the rpath contains only unique directories. - case "$temp_rpath " in - *" $dir "*) ;; - *" $absdir "*) ;; - *) temp_rpath="$temp_rpath $dir" ;; - esac - fi - - # Hardcode the library path. - # Skip directories that are in the system default run-time - # search path. - case " $sys_lib_dlsearch_path " in - *" $absdir "*) ;; - *) - case "$compile_rpath " in - *" $absdir "*) ;; - *) compile_rpath="$compile_rpath $absdir" - esac - ;; - esac - case " $sys_lib_dlsearch_path " in - *" $libdir "*) ;; - *) - case "$finalize_rpath " in - *" $libdir "*) ;; - *) finalize_rpath="$finalize_rpath $libdir" - esac - ;; - esac - fi # $linkmode,$pass = prog,link... - - if test "$alldeplibs" = yes && - { test "$deplibs_check_method" = pass_all || - { test "$build_libtool_libs" = yes && - test -n "$library_names"; }; }; then - # We only need to search for static libraries - continue - fi - fi - - link_static=no # Whether the deplib will be linked statically - if test -n "$library_names" && - { test "$prefer_static_libs" = no || test -z "$old_library"; }; then - if test "$installed" = no; then - notinst_deplibs="$notinst_deplibs $lib" - need_relink=yes - fi - # This is a shared library - if test "$linkmode" = lib && - test "$hardcode_into_libs" = yes; then - # Hardcode the library path. - # Skip directories that are in the system default run-time - # search path. - case " $sys_lib_dlsearch_path " in - *" $absdir "*) ;; - *) - case "$compile_rpath " in - *" $absdir "*) ;; - *) compile_rpath="$compile_rpath $absdir" - esac - ;; - esac - case " $sys_lib_dlsearch_path " in - *" $libdir "*) ;; - *) - case "$finalize_rpath " in - *" $libdir "*) ;; - *) finalize_rpath="$finalize_rpath $libdir" - esac - ;; - esac - fi - - if test -n "$old_archive_from_expsyms_cmds"; then - # figure out the soname - set dummy $library_names - realname="$2" - shift; shift - libname=`eval \\$echo \"$libname_spec\"` - # use dlname if we got it. it's perfectly good, no? - if test -n "$dlname"; then - soname="$dlname" - elif test -n "$soname_spec"; then - # bleh windows - case $host in - *cygwin* | mingw*) - major=`expr $current - $age` - versuffix="-$major" - ;; - esac - eval soname=\"$soname_spec\" - else - soname="$realname" - fi - - # Make a new name for the extract_expsyms_cmds to use - soroot="$soname" - soname=`echo $soroot | ${SED} -e 's/^.*\///'` - newlib="libimp-`echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" - - # If the library has no export list, then create one now - if test -f "$output_objdir/$soname-def"; then : - else - $show "extracting exported symbol list from \`$soname'" - save_ifs="$IFS"; IFS='~' - eval cmds=\"$extract_expsyms_cmds\" - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - fi - - # Create $newlib - if test -f "$output_objdir/$newlib"; then :; else - $show "generating import library for \`$soname'" - save_ifs="$IFS"; IFS='~' - eval cmds=\"$old_archive_from_expsyms_cmds\" - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - fi - # make sure the library variables are pointing to the new library - dir=$output_objdir - linklib=$newlib - fi # test -n "$old_archive_from_expsyms_cmds" - - if test "$linkmode" = prog || test "$mode" != relink; then - add_shlibpath= - add_dir= - add= - lib_linked=yes - case $hardcode_action in - immediate | unsupported) - if test "$hardcode_direct" = no; then - case $host in - *-*-sco3.2v5* ) add_dir="-L$dir" ;; - esac - add="$dir/$linklib" - elif test "$hardcode_minus_L" = no; then - case $host in - *-*-sunos*) add_shlibpath="$dir" ;; - esac - add_dir="-L$dir" - add="-l$name" - elif test "$hardcode_shlibpath_var" = no; then - add_shlibpath="$dir" - add="-l$name" - else - lib_linked=no - fi - ;; - relink) - if test "$hardcode_direct" = yes; then - add="$dir/$linklib" - elif test "$hardcode_minus_L" = yes; then - add_dir="-L$dir" - # Try looking first in the location we're being installed to. - if test -n "$inst_prefix_dir"; then - case "$libdir" in - [\\/]*) - add_dir="-L$inst_prefix_dir$libdir $add_dir" - ;; - esac - fi - add="-l$name" - elif test "$hardcode_shlibpath_var" = yes; then - add_shlibpath="$dir" - add="-l$name" - else - lib_linked=no - fi - ;; - *) lib_linked=no ;; - esac - - if test "$lib_linked" != yes; then - $echo "$modename: configuration error: unsupported hardcode properties" - exit 1 - fi - - if test -n "$add_shlibpath"; then - case :$compile_shlibpath: in - *":$add_shlibpath:"*) ;; - *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; - esac - fi - if test "$linkmode" = prog; then - test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" - test -n "$add" && compile_deplibs="$add $compile_deplibs" - else - test -n "$add_dir" && deplibs="$add_dir $deplibs" - test -n "$add" && deplibs="$add $deplibs" - if test "$hardcode_direct" != yes && \ - test "$hardcode_minus_L" != yes && \ - test "$hardcode_shlibpath_var" = yes; then - case :$finalize_shlibpath: in - *":$libdir:"*) ;; - *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; - esac - fi - fi - fi - - if test "$linkmode" = prog || test "$mode" = relink; then - add_shlibpath= - add_dir= - add= - # Finalize command for both is simple: just hardcode it. - if test "$hardcode_direct" = yes; then - add="$libdir/$linklib" - elif test "$hardcode_minus_L" = yes; then - add_dir="-L$libdir" - add="-l$name" - elif test "$hardcode_shlibpath_var" = yes; then - case :$finalize_shlibpath: in - *":$libdir:"*) ;; - *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; - esac - add="-l$name" - else - # We cannot seem to hardcode it, guess we'll fake it. - add_dir="-L$libdir" - # Try looking first in the location we're being installed to. - if test -n "$inst_prefix_dir"; then - case "$libdir" in - [\\/]*) - add_dir="-L$inst_prefix_dir$libdir $add_dir" - ;; - esac - fi - add="-l$name" - fi - - if test "$linkmode" = prog; then - test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" - test -n "$add" && finalize_deplibs="$add $finalize_deplibs" - else - test -n "$add_dir" && deplibs="$add_dir $deplibs" - test -n "$add" && deplibs="$add $deplibs" - fi - fi - elif test "$linkmode" = prog; then - # Here we assume that one of hardcode_direct or hardcode_minus_L - # is not unsupported. This is valid on all known static and - # shared platforms. - if test "$hardcode_direct" != unsupported; then - test -n "$old_library" && linklib="$old_library" - compile_deplibs="$dir/$linklib $compile_deplibs" - finalize_deplibs="$dir/$linklib $finalize_deplibs" - else - compile_deplibs="-l$name -L$dir $compile_deplibs" - finalize_deplibs="-l$name -L$dir $finalize_deplibs" - fi - elif test "$build_libtool_libs" = yes; then - # Not a shared library - if test "$deplibs_check_method" != pass_all; then - # We're trying link a shared library against a static one - # but the system doesn't support it. - - # Just print a warning and add the library to dependency_libs so - # that the program can be linked against the static library. - echo - echo "*** Warning: This system can not link to static lib archive $lib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have." - if test "$module" = yes; then - echo "*** But as you try to build a module library, libtool will still create " - echo "*** a static module, that should work as long as the dlopening application" - echo "*** is linked with the -dlopen flag to resolve symbols at runtime." - if test -z "$global_symbol_pipe"; then - echo - echo "*** However, this would only work if libtool was able to extract symbol" - echo "*** lists from a program, using \`nm' or equivalent, but libtool could" - echo "*** not find such a program. So, this module is probably useless." - echo "*** \`nm' from GNU binutils and a full rebuild may help." - fi - if test "$build_old_libs" = no; then - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - fi - else - convenience="$convenience $dir/$old_library" - old_convenience="$old_convenience $dir/$old_library" - deplibs="$dir/$old_library $deplibs" - link_static=yes - fi - fi # link shared/static library? - - if test "$linkmode" = lib; then - if test -n "$dependency_libs" && - { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || - test "$link_static" = yes; }; then - # Extract -R from dependency_libs - temp_deplibs= - for libdir in $dependency_libs; do - case $libdir in - -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` - case " $xrpath " in - *" $temp_xrpath "*) ;; - *) xrpath="$xrpath $temp_xrpath";; - esac;; - *) temp_deplibs="$temp_deplibs $libdir";; - esac - done - dependency_libs="$temp_deplibs" - fi - - newlib_search_path="$newlib_search_path $absdir" - # Link against this library - test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" - # ... and its dependency_libs - tmp_libs= - for deplib in $dependency_libs; do - newdependency_libs="$deplib $newdependency_libs" - if test "X$duplicate_deps" = "Xyes" ; then - case "$tmp_libs " in - *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; - esac - fi - tmp_libs="$tmp_libs $deplib" - done - - if test "$link_all_deplibs" != no; then - # Add the search paths of all dependency libraries - for deplib in $dependency_libs; do - case $deplib in - -L*) path="$deplib" ;; - *.la) - dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` - test "X$dir" = "X$deplib" && dir="." - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; - *) - absdir=`cd "$dir" && pwd` - if test -z "$absdir"; then - $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 - absdir="$dir" - fi - ;; - esac - if grep "^installed=no" $deplib > /dev/null; then - path="-L$absdir/$objdir" - else - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` - if test -z "$libdir"; then - $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 - exit 1 - fi - if test "$absdir" != "$libdir"; then - $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 - fi - path="-L$absdir" - fi - ;; - *) continue ;; - esac - case " $deplibs " in - *" $path "*) ;; - *) deplibs="$deplibs $path" ;; - esac - done - fi # link_all_deplibs != no - fi # linkmode = lib - done # for deplib in $libs - dependency_libs="$newdependency_libs" - if test "$pass" = dlpreopen; then - # Link the dlpreopened libraries before other libraries - for deplib in $save_deplibs; do - deplibs="$deplib $deplibs" - done - fi - if test "$pass" != dlopen; then - if test "$pass" != conv; then - # Make sure lib_search_path contains only unique directories. - lib_search_path= - for dir in $newlib_search_path; do - case "$lib_search_path " in - *" $dir "*) ;; - *) lib_search_path="$lib_search_path $dir" ;; - esac - done - newlib_search_path= - fi - - if test "$linkmode,$pass" != "prog,link"; then - vars="deplibs" - else - vars="compile_deplibs finalize_deplibs" - fi - for var in $vars dependency_libs; do - # Add libraries to $var in reverse order - eval tmp_libs=\"\$$var\" - new_libs= - for deplib in $tmp_libs; do - # FIXME: Pedantically, this is the right thing to do, so - # that some nasty dependency loop isn't accidentally - # broken: - #new_libs="$deplib $new_libs" - # Pragmatically, this seems to cause very few problems in - # practice: - case $deplib in - -L*) new_libs="$deplib $new_libs" ;; - *) - # And here is the reason: when a library appears more - # than once as an explicit dependence of a library, or - # is implicitly linked in more than once by the - # compiler, it is considered special, and multiple - # occurrences thereof are not removed. Compare this - # with having the same library being listed as a - # dependency of multiple other libraries: in this case, - # we know (pedantically, we assume) the library does not - # need to be listed more than once, so we keep only the - # last copy. This is not always right, but it is rare - # enough that we require users that really mean to play - # such unportable linking tricks to link the library - # using -Wl,-lname, so that libtool does not consider it - # for duplicate removal. - case " $specialdeplibs " in - *" $deplib "*) new_libs="$deplib $new_libs" ;; - *) - case " $new_libs " in - *" $deplib "*) ;; - *) new_libs="$deplib $new_libs" ;; - esac - ;; - esac - ;; - esac - done - tmp_libs= - for deplib in $new_libs; do - case $deplib in - -L*) - case " $tmp_libs " in - *" $deplib "*) ;; - *) tmp_libs="$tmp_libs $deplib" ;; - esac - ;; - *) tmp_libs="$tmp_libs $deplib" ;; - esac - done - eval $var=\"$tmp_libs\" - done # for var - fi - # Last step: remove runtime libs from dependency_libs (they stay in deplibs) - tmp_libs= - for i in $dependency_libs ; do - case " $predeps $postdeps $compiler_lib_search_path " in - *" $i "*) - i="" - ;; - esac - if test -n "$i" ; then - tmp_libs="$tmp_libs $i" - fi - done - dependency_libs=$tmp_libs - done # for pass - if test "$linkmode" = prog; then - dlfiles="$newdlfiles" - dlprefiles="$newdlprefiles" - fi - - case $linkmode in - oldlib) - if test -n "$deplibs"; then - $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 - fi - - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 - fi - - if test -n "$rpath"; then - $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 - fi - - if test -n "$xrpath"; then - $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 - fi - - if test -n "$vinfo"; then - $echo "$modename: warning: \`-version-info' is ignored for archives" 1>&2 - fi - - if test -n "$release"; then - $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 - fi - - if test -n "$export_symbols" || test -n "$export_symbols_regex"; then - $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 - fi - - # Now set the variables for building old libraries. - build_libtool_libs=no - oldlibs="$output" - objs="$objs$old_deplibs" - ;; - - lib) - # Make sure we only generate libraries of the form `libNAME.la'. - case $outputname in - lib*) - name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` - eval libname=\"$libname_spec\" - ;; - *) - if test "$module" = no; then - $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - if test "$need_lib_prefix" != no; then - # Add the "lib" prefix for modules if required - name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` - eval libname=\"$libname_spec\" - else - libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` - fi - ;; - esac - - if test -n "$objs"; then - if test "$deplibs_check_method" != pass_all; then - $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 - exit 1 - else - echo - echo "*** Warning: Linking the shared library $output against the non-libtool" - echo "*** objects $objs is not portable!" - libobjs="$libobjs $objs" - fi - fi - - if test "$dlself" != no; then - $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 - fi - - set dummy $rpath - if test "$#" -gt 2; then - $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 - fi - install_libdir="$2" - - oldlibs= - if test -z "$rpath"; then - if test "$build_libtool_libs" = yes; then - # Building a libtool convenience library. - # Some compilers have problems with a `.al' extension so - # convenience libraries should have the same extension an - # archive normally would. - oldlibs="$output_objdir/$libname.$libext $oldlibs" - build_libtool_libs=convenience - build_old_libs=yes - fi - - if test -n "$vinfo"; then - $echo "$modename: warning: \`-version-info' is ignored for convenience libraries" 1>&2 - fi - - if test -n "$release"; then - $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 - fi - else - - # Parse the version information argument. - save_ifs="$IFS"; IFS=':' - set dummy $vinfo 0 0 0 - IFS="$save_ifs" - - if test -n "$8"; then - $echo "$modename: too many parameters to \`-version-info'" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - current="$2" - revision="$3" - age="$4" - - # Check that each of the things are valid numbers. - case $current in - 0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;; - *) - $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2 - $echo "$modename: \`$vinfo' is not valid version information" 1>&2 - exit 1 - ;; - esac - - case $revision in - 0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;; - *) - $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2 - $echo "$modename: \`$vinfo' is not valid version information" 1>&2 - exit 1 - ;; - esac - - case $age in - 0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;; - *) - $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2 - $echo "$modename: \`$vinfo' is not valid version information" 1>&2 - exit 1 - ;; - esac - - if test "$age" -gt "$current"; then - $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 - $echo "$modename: \`$vinfo' is not valid version information" 1>&2 - exit 1 - fi - - # Calculate the version variables. - major= - versuffix= - verstring= - case $version_type in - none) ;; - - darwin) - # Like Linux, but with the current version available in - # verstring for coding it into the library header - major=.`expr $current - $age` - versuffix="$major.$age.$revision" - # Darwin ld doesn't like 0 for these options... - minor_current=`expr $current + 1` - verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" - ;; - - freebsd-aout) - major=".$current" - versuffix=".$current.$revision"; - ;; - - freebsd-elf) - major=".$current" - versuffix=".$current"; - ;; - - irix | nonstopux) - major=`expr $current - $age` - - case $version_type in - nonstopux) verstring_prefix=nonstopux ;; - *) verstring_prefix=sgi ;; - esac - verstring="$verstring_prefix$major.$revision" - - # Add in all the interfaces that we are compatible with. - loop=$revision - while test "$loop" -ne 0; do - iface=`expr $revision - $loop` - loop=`expr $loop - 1` - verstring="$verstring_prefix$major.$iface:$verstring" - done - - # Before this point, $major must not contain `.'. - major=.$major - versuffix="$major.$revision" - ;; - - linux) - major=.`expr $current - $age` - versuffix="$major.$age.$revision" - ;; - - osf) - major=.`expr $current - $age` - versuffix=".$current.$age.$revision" - verstring="$current.$age.$revision" - - # Add in all the interfaces that we are compatible with. - loop=$age - while test "$loop" -ne 0; do - iface=`expr $current - $loop` - loop=`expr $loop - 1` - verstring="$verstring:${iface}.0" - done - - # Make executables depend on our current version. - verstring="$verstring:${current}.0" - ;; - - sunos) - major=".$current" - versuffix=".$current.$revision" - ;; - - windows) - # Use '-' rather than '.', since we only want one - # extension on DOS 8.3 filesystems. - major=`expr $current - $age` - versuffix="-$major" - ;; - - *) - $echo "$modename: unknown library version type \`$version_type'" 1>&2 - echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 - exit 1 - ;; - esac - - # Clear the version info if we defaulted, and they specified a release. - if test -z "$vinfo" && test -n "$release"; then - major= - case $version_type in - darwin) - # we can't check for "0.0" in archive_cmds due to quoting - # problems, so we reset it completely - verstring= - ;; - *) - verstring="0.0" - ;; - esac - if test "$need_version" = no; then - versuffix= - else - versuffix=".0.0" - fi - fi - - # Remove version info from name if versioning should be avoided - if test "$avoid_version" = yes && test "$need_version" = no; then - major= - versuffix= - verstring="" - fi - - # Check to see if the archive will have undefined symbols. - if test "$allow_undefined" = yes; then - if test "$allow_undefined_flag" = unsupported; then - $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 - build_libtool_libs=no - build_old_libs=yes - fi - else - # Don't allow undefined symbols. - allow_undefined_flag="$no_undefined_flag" - fi - fi - - if test "$mode" != relink; then - # Remove our outputs, but don't remove object files since they - # may have been created when compiling PIC objects. - removelist= - tempremovelist=`echo "$output_objdir/*"` - for p in $tempremovelist; do - case $p in - *.$objext) - ;; - $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) - removelist="$removelist $p" - ;; - *) ;; - esac - done - if test -n "$removelist"; then - $show "${rm}r $removelist" - $run ${rm}r $removelist - fi - fi - - # Now set the variables for building old libraries. - if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then - oldlibs="$oldlibs $output_objdir/$libname.$libext" - - # Transform .lo files to .o files. - oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` - fi - - # Eliminate all temporary directories. - for path in $notinst_path; do - lib_search_path=`echo "$lib_search_path " | ${SED} -e 's% $path % %g'` - deplibs=`echo "$deplibs " | ${SED} -e 's% -L$path % %g'` - dependency_libs=`echo "$dependency_libs " | ${SED} -e 's% -L$path % %g'` - done - - if test -n "$xrpath"; then - # If the user specified any rpath flags, then add them. - temp_xrpath= - for libdir in $xrpath; do - temp_xrpath="$temp_xrpath -R$libdir" - case "$finalize_rpath " in - *" $libdir "*) ;; - *) finalize_rpath="$finalize_rpath $libdir" ;; - esac - done - if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then - dependency_libs="$temp_xrpath $dependency_libs" - fi - fi - - # Make sure dlfiles contains only unique files that won't be dlpreopened - old_dlfiles="$dlfiles" - dlfiles= - for lib in $old_dlfiles; do - case " $dlprefiles $dlfiles " in - *" $lib "*) ;; - *) dlfiles="$dlfiles $lib" ;; - esac - done - - # Make sure dlprefiles contains only unique files - old_dlprefiles="$dlprefiles" - dlprefiles= - for lib in $old_dlprefiles; do - case "$dlprefiles " in - *" $lib "*) ;; - *) dlprefiles="$dlprefiles $lib" ;; - esac - done - - if test "$build_libtool_libs" = yes; then - if test -n "$rpath"; then - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) - # these systems don't actually have a c library (as such)! - ;; - *-*-rhapsody* | *-*-darwin1.[012]) - # Rhapsody C library is in the System framework - deplibs="$deplibs -framework System" - ;; - *-*-netbsd*) - # Don't link with libc until the a.out ld.so is fixed. - ;; - *-*-openbsd* | *-*-freebsd*) - # Do not include libc due to us having libc/libc_r. - test "X$arg" = "X-lc" && continue - ;; - *) - # Add libc to deplibs on all other systems if necessary. - if test "$build_libtool_need_lc" = "yes"; then - deplibs="$deplibs -lc" - fi - ;; - esac - fi - - # Transform deplibs into only deplibs that can be linked in shared. - name_save=$name - libname_save=$libname - release_save=$release - versuffix_save=$versuffix - major_save=$major - # I'm not sure if I'm treating the release correctly. I think - # release should show up in the -l (ie -lgmp5) so we don't want to - # add it in twice. Is that correct? - release="" - versuffix="" - major="" - newdeplibs= - droppeddeps=no - case $deplibs_check_method in - pass_all) - # Don't check for shared/static. Everything works. - # This might be a little naive. We might want to check - # whether the library exists or not. But this is on - # osf3 & osf4 and I'm not really sure... Just - # implementing what was already the behavior. - newdeplibs=$deplibs - ;; - test_compile) - # This code stresses the "libraries are programs" paradigm to its - # limits. Maybe even breaks it. We compile a program, linking it - # against the deplibs as a proxy for the library. Then we can check - # whether they linked in statically or dynamically with ldd. - $rm conftest.c - cat > conftest.c </dev/null` - for potent_lib in $potential_libs; do - # Follow soft links. - if ls -lLd "$potent_lib" 2>/dev/null \ - | grep " -> " >/dev/null; then - continue - fi - # The statement above tries to avoid entering an - # endless loop below, in case of cyclic links. - # We might still enter an endless loop, since a link - # loop can be closed while we follow links, - # but so what? - potlib="$potent_lib" - while test -h "$potlib" 2>/dev/null; do - potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` - case $potliblink in - [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; - *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; - esac - done - if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ - | ${SED} 10q \ - | $EGREP "$file_magic_regex" > /dev/null; then - newdeplibs="$newdeplibs $a_deplib" - a_deplib="" - break 2 - fi - done - done - fi - if test -n "$a_deplib" ; then - droppeddeps=yes - echo - echo "*** Warning: linker path does not have real file for library $a_deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because I did check the linker path looking for a file starting" - if test -z "$potlib" ; then - echo "*** with $libname but no candidates were found. (...for file magic test)" - else - echo "*** with $libname and none of the candidates passed a file format test" - echo "*** using a file magic. Last file checked: $potlib" - fi - fi - else - # Add a -L argument. - newdeplibs="$newdeplibs $a_deplib" - fi - done # Gone through all deplibs. - ;; - match_pattern*) - set dummy $deplibs_check_method - match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` - for a_deplib in $deplibs; do - name="`expr $a_deplib : '-l\(.*\)'`" - # If $name is empty we are operating on a -L argument. - if test -n "$name" && test "$name" != "0"; then - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - case " $predeps $postdeps " in - *" $a_deplib "*) - newdeplibs="$newdeplibs $a_deplib" - a_deplib="" - ;; - esac - fi - if test -n "$a_deplib" ; then - libname=`eval \\$echo \"$libname_spec\"` - for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do - potential_libs=`ls $i/$libname[.-]* 2>/dev/null` - for potent_lib in $potential_libs; do - potlib="$potent_lib" # see symlink-check above in file_magic test - if eval echo \"$potent_lib\" 2>/dev/null \ - | ${SED} 10q \ - | $EGREP "$match_pattern_regex" > /dev/null; then - newdeplibs="$newdeplibs $a_deplib" - a_deplib="" - break 2 - fi - done - done - fi - if test -n "$a_deplib" ; then - droppeddeps=yes - echo - echo "*** Warning: linker path does not have real file for library $a_deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because I did check the linker path looking for a file starting" - if test -z "$potlib" ; then - echo "*** with $libname but no candidates were found. (...for regex pattern test)" - else - echo "*** with $libname and none of the candidates passed a file format test" - echo "*** using a regex pattern. Last file checked: $potlib" - fi - fi - else - # Add a -L argument. - newdeplibs="$newdeplibs $a_deplib" - fi - done # Gone through all deplibs. - ;; - none | unknown | *) - newdeplibs="" - tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ - -e 's/ -[LR][^ ]*//g'` - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - for i in $predeps $postdeps ; do - # can't use Xsed below, because $i might contain '/' - tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` - done - fi - if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ - | grep . >/dev/null; then - echo - if test "X$deplibs_check_method" = "Xnone"; then - echo "*** Warning: inter-library dependencies are not supported in this platform." - else - echo "*** Warning: inter-library dependencies are not known to be supported." - fi - echo "*** All declared inter-library dependencies are being dropped." - droppeddeps=yes - fi - ;; - esac - versuffix=$versuffix_save - major=$major_save - release=$release_save - libname=$libname_save - name=$name_save - - case $host in - *-*-rhapsody* | *-*-darwin1.[012]) - # On Rhapsody replace the C library is the System framework - newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` - ;; - esac - - if test "$droppeddeps" = yes; then - if test "$module" = yes; then - echo - echo "*** Warning: libtool could not satisfy all declared inter-library" - echo "*** dependencies of module $libname. Therefore, libtool will create" - echo "*** a static module, that should work as long as the dlopening" - echo "*** application is linked with the -dlopen flag." - if test -z "$global_symbol_pipe"; then - echo - echo "*** However, this would only work if libtool was able to extract symbol" - echo "*** lists from a program, using \`nm' or equivalent, but libtool could" - echo "*** not find such a program. So, this module is probably useless." - echo "*** \`nm' from GNU binutils and a full rebuild may help." - fi - if test "$build_old_libs" = no; then - oldlibs="$output_objdir/$libname.$libext" - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - else - echo "*** The inter-library dependencies that have been dropped here will be" - echo "*** automatically added whenever a program is linked with this library" - echo "*** or is declared to -dlopen it." - - if test "$allow_undefined" = no; then - echo - echo "*** Since this library must not contain undefined symbols," - echo "*** because either the platform does not support them or" - echo "*** it was explicitly requested with -no-undefined," - echo "*** libtool will only create a static version of it." - if test "$build_old_libs" = no; then - oldlibs="$output_objdir/$libname.$libext" - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - fi - fi - fi - # Done checking deplibs! - deplibs=$newdeplibs - fi - - # All the library-specific variables (install_libdir is set above). - library_names= - old_library= - dlname= - - # Test again, we may have decided not to build it any more - if test "$build_libtool_libs" = yes; then - if test "$hardcode_into_libs" = yes; then - # Hardcode the library paths - hardcode_libdirs= - dep_rpath= - rpath="$finalize_rpath" - test "$mode" != relink && rpath="$compile_rpath$rpath" - for libdir in $rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - dep_rpath="$dep_rpath $flag" - fi - elif test -n "$runpath_var"; then - case "$perm_rpath " in - *" $libdir "*) ;; - *) perm_rpath="$perm_rpath $libdir" ;; - esac - fi - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - eval dep_rpath=\"$hardcode_libdir_flag_spec\" - fi - if test -n "$runpath_var" && test -n "$perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $perm_rpath; do - rpath="$rpath$dir:" - done - eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" - fi - test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" - fi - - shlibpath="$finalize_shlibpath" - test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" - if test -n "$shlibpath"; then - eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" - fi - - # Get the real and link names of the library. - eval library_names=\"$library_names_spec\" - set dummy $library_names - realname="$2" - shift; shift - - if test -n "$soname_spec"; then - eval soname=\"$soname_spec\" - else - soname="$realname" - fi - if test -z "$dlname"; then - dlname=$soname - fi - - lib="$output_objdir/$realname" - for link - do - linknames="$linknames $link" - done - - # Use standard objects if they are pic - test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then - $show "generating symbol list for \`$libname.la'" - export_symbols="$output_objdir/$libname.exp" - $run $rm $export_symbols - eval cmds=\"$export_symbols_cmds\" - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - if len=`expr "X$cmd" : ".*"` && - test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then - $show "$cmd" - $run eval "$cmd" || exit $? - skipped_export=false - else - # The command line is too long to execute in one step. - $show "using reloadable object file for export list..." - skipped_export=: - fi - done - IFS="$save_ifs" - if test -n "$export_symbols_regex"; then - $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" - $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' - $show "$mv \"${export_symbols}T\" \"$export_symbols\"" - $run eval '$mv "${export_symbols}T" "$export_symbols"' - fi - fi - fi - - if test -n "$export_symbols" && test -n "$include_expsyms"; then - $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' - fi - - if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec"; then - save_libobjs=$libobjs - eval libobjs=\"\$libobjs $whole_archive_flag_spec\" - else - gentop="$output_objdir/${outputname}x" - $show "${rm}r $gentop" - $run ${rm}r "$gentop" - $show "$mkdir $gentop" - $run $mkdir "$gentop" - status=$? - if test "$status" -ne 0 && test ! -d "$gentop"; then - exit $status - fi - generated="$generated $gentop" - - for xlib in $convenience; do - # Extract the objects. - case $xlib in - [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; - *) xabs=`pwd`"/$xlib" ;; - esac - xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` - xdir="$gentop/$xlib" - - $show "${rm}r $xdir" - $run ${rm}r "$xdir" - $show "$mkdir $xdir" - $run $mkdir "$xdir" - status=$? - if test "$status" -ne 0 && test ! -d "$xdir"; then - exit $status - fi - $show "(cd $xdir && $AR x $xabs)" - $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? - - libobjs="$libobjs "`find $xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` - done - fi - fi - - if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then - eval flag=\"$thread_safe_flag_spec\" - linker_flags="$linker_flags $flag" - fi - - # Make a backup of the uninstalled library when relinking - if test "$mode" = relink; then - $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? - fi - - # Do each of the archive commands. - if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then - eval cmds=\"$archive_expsym_cmds\" - else - save_deplibs="$deplibs" - for conv in $convenience; do - tmp_deplibs= - for test_deplib in $deplibs; do - if test "$test_deplib" != "$conv"; then - tmp_deplibs="$tmp_deplibs $test_deplib" - fi - done - deplibs="$tmp_deplibs" - done - eval cmds=\"$archive_cmds\" - deplibs="$save_deplibs" - fi - - if test "X$skipped_export" != "X:" && len=`expr "X$cmds" : ".*"` && - test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then - : - else - # The command line is too long to link in one step, link piecewise. - $echo "creating reloadable object files..." - - # Save the value of $output and $libobjs because we want to - # use them later. If we have whole_archive_flag_spec, we - # want to use save_libobjs as it was before - # whole_archive_flag_spec was expanded, because we can't - # assume the linker understands whole_archive_flag_spec. - # This may have to be revisited, in case too many - # convenience libraries get linked in and end up exceeding - # the spec. - if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then - save_libobjs=$libobjs - fi - save_output=$output - - # Clear the reloadable object creation command queue and - # initialize k to one. - test_cmds= - concat_cmds= - objlist= - delfiles= - last_robj= - k=1 - output=$output_objdir/$save_output-${k}.$objext - # Loop over the list of objects to be linked. - for obj in $save_libobjs - do - eval test_cmds=\"$reload_cmds $objlist $last_robj\" - if test "X$objlist" = X || - { len=`expr "X$test_cmds" : ".*"` && - test "$len" -le "$max_cmd_len"; }; then - objlist="$objlist $obj" - else - # The command $test_cmds is almost too long, add a - # command to the queue. - if test "$k" -eq 1 ; then - # The first file doesn't have a previous command to add. - eval concat_cmds=\"$reload_cmds $objlist $last_robj\" - else - # All subsequent reloadable object files will link in - # the last one created. - eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" - fi - last_robj=$output_objdir/$save_output-${k}.$objext - k=`expr $k + 1` - output=$output_objdir/$save_output-${k}.$objext - objlist=$obj - len=1 - fi - done - # Handle the remaining objects by creating one last - # reloadable object file. All subsequent reloadable object - # files will link in the last one created. - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" - - if ${skipped_export-false}; then - $show "generating symbol list for \`$libname.la'" - export_symbols="$output_objdir/$libname.exp" - $run $rm $export_symbols - libobjs=$output - # Append the command to create the export file. - eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" - fi - - # Set up a command to remove the reloadale object files - # after they are used. - i=0 - while test "$i" -lt "$k" - do - i=`expr $i + 1` - delfiles="$delfiles $output_objdir/$save_output-${i}.$objext" - done - - $echo "creating a temporary reloadable object file: $output" - - # Loop through the commands generated above and execute them. - save_ifs="$IFS"; IFS='~' - for cmd in $concat_cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - - libobjs=$output - # Restore the value of output. - output=$save_output - - if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then - eval libobjs=\"\$libobjs $whole_archive_flag_spec\" - fi - # Expand the library linking commands again to reset the - # value of $libobjs for piecewise linking. - - # Do each of the archive commands. - if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then - eval cmds=\"$archive_expsym_cmds\" - else - eval cmds=\"$archive_cmds\" - fi - - # Append the command to remove the reloadable object files - # to the just-reset $cmds. - eval cmds=\"\$cmds~$rm $delfiles\" - fi - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - - # Restore the uninstalled library and exit - if test "$mode" = relink; then - $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $? - exit 0 - fi - - # Create links to the real library. - for linkname in $linknames; do - if test "$realname" != "$linkname"; then - $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" - $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? - fi - done - - # If -module or -export-dynamic was specified, set the dlname. - if test "$module" = yes || test "$export_dynamic" = yes; then - # On all known operating systems, these are identical. - dlname="$soname" - fi - fi - ;; - - obj) - if test -n "$deplibs"; then - $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 - fi - - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 - fi - - if test -n "$rpath"; then - $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 - fi - - if test -n "$xrpath"; then - $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 - fi - - if test -n "$vinfo"; then - $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 - fi - - if test -n "$release"; then - $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 - fi - - case $output in - *.lo) - if test -n "$objs$old_deplibs"; then - $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 - exit 1 - fi - libobj="$output" - obj=`$echo "X$output" | $Xsed -e "$lo2o"` - ;; - *) - libobj= - obj="$output" - ;; - esac - - # Delete the old objects. - $run $rm $obj $libobj - - # Objects from convenience libraries. This assumes - # single-version convenience libraries. Whenever we create - # different ones for PIC/non-PIC, this we'll have to duplicate - # the extraction. - reload_conv_objs= - gentop= - # reload_cmds runs $LD directly, so let us get rid of - # -Wl from whole_archive_flag_spec - wl= - - if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec"; then - eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\" - else - gentop="$output_objdir/${obj}x" - $show "${rm}r $gentop" - $run ${rm}r "$gentop" - $show "$mkdir $gentop" - $run $mkdir "$gentop" - status=$? - if test "$status" -ne 0 && test ! -d "$gentop"; then - exit $status - fi - generated="$generated $gentop" - - for xlib in $convenience; do - # Extract the objects. - case $xlib in - [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; - *) xabs=`pwd`"/$xlib" ;; - esac - xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` - xdir="$gentop/$xlib" - - $show "${rm}r $xdir" - $run ${rm}r "$xdir" - $show "$mkdir $xdir" - $run $mkdir "$xdir" - status=$? - if test "$status" -ne 0 && test ! -d "$xdir"; then - exit $status - fi - $show "(cd $xdir && $AR x $xabs)" - $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? - - reload_conv_objs="$reload_objs "`find $xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` - done - fi - fi - - # Create the old-style object. - reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test - - output="$obj" - eval cmds=\"$reload_cmds\" - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - - # Exit if we aren't doing a library object file. - if test -z "$libobj"; then - if test -n "$gentop"; then - $show "${rm}r $gentop" - $run ${rm}r $gentop - fi - - exit 0 - fi - - if test "$build_libtool_libs" != yes; then - if test -n "$gentop"; then - $show "${rm}r $gentop" - $run ${rm}r $gentop - fi - - # Create an invalid libtool object if no PIC, so that we don't - # accidentally link it into a program. - # $show "echo timestamp > $libobj" - # $run eval "echo timestamp > $libobj" || exit $? - exit 0 - fi - - if test -n "$pic_flag" || test "$pic_mode" != default; then - # Only do commands if we really have different PIC objects. - reload_objs="$libobjs $reload_conv_objs" - output="$libobj" - eval cmds=\"$reload_cmds\" - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - fi - - if test -n "$gentop"; then - $show "${rm}r $gentop" - $run ${rm}r $gentop - fi - - exit 0 - ;; - - prog) - case $host in - *cygwin*) output=`echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; - esac - if test -n "$vinfo"; then - $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 - fi - - if test -n "$release"; then - $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 - fi - - if test "$preload" = yes; then - if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && - test "$dlopen_self_static" = unknown; then - $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." - fi - fi - - case $host in - *-*-rhapsody* | *-*-darwin1.[012]) - # On Rhapsody replace the C library is the System framework - compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` - finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` - ;; - esac - - compile_command="$compile_command $compile_deplibs" - finalize_command="$finalize_command $finalize_deplibs" - - if test -n "$rpath$xrpath"; then - # If the user specified any rpath flags, then add them. - for libdir in $rpath $xrpath; do - # This is the magic to use -rpath. - case "$finalize_rpath " in - *" $libdir "*) ;; - *) finalize_rpath="$finalize_rpath $libdir" ;; - esac - done - fi - - # Now hardcode the library paths - rpath= - hardcode_libdirs= - for libdir in $compile_rpath $finalize_rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - rpath="$rpath $flag" - fi - elif test -n "$runpath_var"; then - case "$perm_rpath " in - *" $libdir "*) ;; - *) perm_rpath="$perm_rpath $libdir" ;; - esac - fi - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) - case :$dllsearchpath: in - *":$libdir:"*) ;; - *) dllsearchpath="$dllsearchpath:$libdir";; - esac - ;; - esac - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - eval rpath=\" $hardcode_libdir_flag_spec\" - fi - compile_rpath="$rpath" - - rpath= - hardcode_libdirs= - for libdir in $finalize_rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - rpath="$rpath $flag" - fi - elif test -n "$runpath_var"; then - case "$finalize_perm_rpath " in - *" $libdir "*) ;; - *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; - esac - fi - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - eval rpath=\" $hardcode_libdir_flag_spec\" - fi - finalize_rpath="$rpath" - - if test -n "$libobjs" && test "$build_old_libs" = yes; then - # Transform all the library objects into standard objects. - compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` - finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` - fi - - dlsyms= - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - if test -n "$NM" && test -n "$global_symbol_pipe"; then - dlsyms="${outputname}S.c" - else - $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 - fi - fi - - if test -n "$dlsyms"; then - case $dlsyms in - "") ;; - *.c) - # Discover the nlist of each of the dlfiles. - nlist="$output_objdir/${outputname}.nm" - - $show "$rm $nlist ${nlist}S ${nlist}T" - $run $rm "$nlist" "${nlist}S" "${nlist}T" - - # Parse the name list into a source file. - $show "creating $output_objdir/$dlsyms" - - test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ -/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ -/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ - -#ifdef __cplusplus -extern \"C\" { -#endif - -/* Prevent the only kind of declaration conflicts we can make. */ -#define lt_preloaded_symbols some_other_symbol - -/* External symbol declarations for the compiler. */\ -" - - if test "$dlself" = yes; then - $show "generating symbol list for \`$output'" - - test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" - - # Add our own program objects to the symbol list. - progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` - for arg in $progfiles; do - $show "extracting global C symbols from \`$arg'" - $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" - done - - if test -n "$exclude_expsyms"; then - $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' - $run eval '$mv "$nlist"T "$nlist"' - fi - - if test -n "$export_symbols_regex"; then - $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' - $run eval '$mv "$nlist"T "$nlist"' - fi - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - export_symbols="$output_objdir/$output.exp" - $run $rm $export_symbols - $run eval "${SED} -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' - else - $run eval "${SED} -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"' - $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T' - $run eval 'mv "$nlist"T "$nlist"' - fi - fi - - for arg in $dlprefiles; do - $show "extracting global C symbols from \`$arg'" - name=`echo "$arg" | ${SED} -e 's%^.*/%%'` - $run eval 'echo ": $name " >> "$nlist"' - $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" - done - - if test -z "$run"; then - # Make sure we have at least an empty file. - test -f "$nlist" || : > "$nlist" - - if test -n "$exclude_expsyms"; then - $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T - $mv "$nlist"T "$nlist" - fi - - # Try sorting and uniquifying the output. - if grep -v "^: " < "$nlist" | - if sort -k 3 /dev/null 2>&1; then - sort -k 3 - else - sort +2 - fi | - uniq > "$nlist"S; then - : - else - grep -v "^: " < "$nlist" > "$nlist"S - fi - - if test -f "$nlist"S; then - eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' - else - echo '/* NONE */' >> "$output_objdir/$dlsyms" - fi - - $echo >> "$output_objdir/$dlsyms" "\ - -#undef lt_preloaded_symbols - -#if defined (__STDC__) && __STDC__ -# define lt_ptr void * -#else -# define lt_ptr char * -# define const -#endif - -/* The mapping between symbol names and symbols. */ -const struct { - const char *name; - lt_ptr address; -} -lt_preloaded_symbols[] = -{\ -" - - eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" - - $echo >> "$output_objdir/$dlsyms" "\ - {0, (lt_ptr) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif\ -" - fi - - pic_flag_for_symtable= - case $host in - # compiling the symbol table file with pic_flag works around - # a FreeBSD bug that causes programs to crash when -lm is - # linked before any other PIC object. But we must not use - # pic_flag when linking with -static. The problem exists in - # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. - *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) - case "$compile_command " in - *" -static "*) ;; - *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; - esac;; - *-*-hpux*) - case "$compile_command " in - *" -static "*) ;; - *) pic_flag_for_symtable=" $pic_flag";; - esac - esac - - # Now compile the dynamic symbol file. - $show "(cd $output_objdir && $LTCC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" - $run eval '(cd $output_objdir && $LTCC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? - - # Clean up the generated files. - $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" - $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" - - # Transform the symbol file into the correct name. - compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` - finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` - ;; - *) - $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 - exit 1 - ;; - esac - else - # We keep going just in case the user didn't refer to - # lt_preloaded_symbols. The linker will fail if global_symbol_pipe - # really was required. - - # Nullify the symbol file. - compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` - finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` - fi - - if test "$need_relink" = no || test "$build_libtool_libs" != yes; then - # Replace the output file specification. - compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` - link_command="$compile_command$compile_rpath" - - # We have no uninstalled library dependencies, so finalize right now. - $show "$link_command" - $run eval "$link_command" - status=$? - - # Delete the generated files. - if test -n "$dlsyms"; then - $show "$rm $output_objdir/${outputname}S.${objext}" - $run $rm "$output_objdir/${outputname}S.${objext}" - fi - - exit $status - fi - - if test -n "$shlibpath_var"; then - # We should set the shlibpath_var - rpath= - for dir in $temp_rpath; do - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) - # Absolute path. - rpath="$rpath$dir:" - ;; - *) - # Relative path: add a thisdir entry. - rpath="$rpath\$thisdir/$dir:" - ;; - esac - done - temp_rpath="$rpath" - fi - - if test -n "$compile_shlibpath$finalize_shlibpath"; then - compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" - fi - if test -n "$finalize_shlibpath"; then - finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" - fi - - compile_var= - finalize_var= - if test -n "$runpath_var"; then - if test -n "$perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $perm_rpath; do - rpath="$rpath$dir:" - done - compile_var="$runpath_var=\"$rpath\$$runpath_var\" " - fi - if test -n "$finalize_perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $finalize_perm_rpath; do - rpath="$rpath$dir:" - done - finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " - fi - fi - - if test "$no_install" = yes; then - # We don't need to create a wrapper script. - link_command="$compile_var$compile_command$compile_rpath" - # Replace the output file specification. - link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` - # Delete the old output file. - $run $rm $output - # Link the executable and exit - $show "$link_command" - $run eval "$link_command" || exit $? - exit 0 - fi - - if test "$hardcode_action" = relink; then - # Fast installation is not supported - link_command="$compile_var$compile_command$compile_rpath" - relink_command="$finalize_var$finalize_command$finalize_rpath" - - $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 - $echo "$modename: \`$output' will be relinked during installation" 1>&2 - else - if test "$fast_install" != no; then - link_command="$finalize_var$compile_command$finalize_rpath" - if test "$fast_install" = yes; then - relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` - else - # fast_install is set to needless - relink_command= - fi - else - link_command="$compile_var$compile_command$compile_rpath" - relink_command="$finalize_var$finalize_command$finalize_rpath" - fi - fi - - # Replace the output file specification. - link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` - - # Delete the old output files. - $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname - - $show "$link_command" - $run eval "$link_command" || exit $? - - # Now create the wrapper script. - $show "creating $output" - - # Quote the relink command for shipping. - if test -n "$relink_command"; then - # Preserve any variables that may affect compiler behavior - for var in $variables_saved_for_relink; do - if eval test -z \"\${$var+set}\"; then - relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" - elif eval var_value=\$$var; test -z "$var_value"; then - relink_command="$var=; export $var; $relink_command" - else - var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` - relink_command="$var=\"$var_value\"; export $var; $relink_command" - fi - done - relink_command="(cd `pwd`; $relink_command)" - relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` - fi - - # Quote $echo for shipping. - if test "X$echo" = "X$SHELL $0 --fallback-echo"; then - case $0 in - [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $0 --fallback-echo";; - *) qecho="$SHELL `pwd`/$0 --fallback-echo";; - esac - qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` - else - qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` - fi - - # Only actually do things if our run command is non-null. - if test -z "$run"; then - # win32 will think the script is a binary if it has - # a .exe suffix, so we strip it off here. - case $output in - *.exe) output=`echo $output|${SED} 's,.exe$,,'` ;; - esac - # test for cygwin because mv fails w/o .exe extensions - case $host in - *cygwin*) - exeext=.exe - outputname=`echo $outputname|${SED} 's,.exe$,,'` ;; - *) exeext= ;; - esac - $rm $output - trap "$rm $output; exit 1" 1 2 15 - - $echo > $output "\ -#! $SHELL - -# $output - temporary wrapper script for $objdir/$outputname -# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP -# -# The $output program cannot be directly executed until all the libtool -# libraries that it depends on are installed. -# -# This wrapper script should never be moved out of the build directory. -# If it is, it will not operate correctly. - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -Xsed='${SED} -e 1s/^X//' -sed_quote_subst='$sed_quote_subst' - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -if test \"\${CDPATH+set}\" = set; then CDPATH=:; export CDPATH; fi - -relink_command=\"$relink_command\" - -# This environment variable determines our operation mode. -if test \"\$libtool_install_magic\" = \"$magic\"; then - # install mode needs the following variable: - notinst_deplibs='$notinst_deplibs' -else - # When we are sourced in execute mode, \$file and \$echo are already set. - if test \"\$libtool_execute_magic\" != \"$magic\"; then - echo=\"$qecho\" - file=\"\$0\" - # Make sure echo works. - if test \"X\$1\" = X--no-reexec; then - # Discard the --no-reexec flag, and continue. - shift - elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then - # Yippee, \$echo works! - : - else - # Restart under the correct shell, and then maybe \$echo will work. - exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} - fi - fi\ -" - $echo >> $output "\ - - # Find the directory that this script lives in. - thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` - test \"x\$thisdir\" = \"x\$file\" && thisdir=. - - # Follow symbolic links until we get to the real thisdir. - file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` - while test -n \"\$file\"; do - destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` - - # If there was a directory component, then change thisdir. - if test \"x\$destdir\" != \"x\$file\"; then - case \"\$destdir\" in - [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; - *) thisdir=\"\$thisdir/\$destdir\" ;; - esac - fi - - file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` - file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` - done - - # Try to get the absolute directory name. - absdir=\`cd \"\$thisdir\" && pwd\` - test -n \"\$absdir\" && thisdir=\"\$absdir\" -" - - if test "$fast_install" = yes; then - echo >> $output "\ - program=lt-'$outputname'$exeext - progdir=\"\$thisdir/$objdir\" - - if test ! -f \"\$progdir/\$program\" || \\ - { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ - test \"X\$file\" != \"X\$progdir/\$program\"; }; then - - file=\"\$\$-\$program\" - - if test ! -d \"\$progdir\"; then - $mkdir \"\$progdir\" - else - $rm \"\$progdir/\$file\" - fi" - - echo >> $output "\ - - # relink executable if necessary - if test -n \"\$relink_command\"; then - if relink_command_output=\`eval \$relink_command 2>&1\`; then : - else - $echo \"\$relink_command_output\" >&2 - $rm \"\$progdir/\$file\" - exit 1 - fi - fi - - $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || - { $rm \"\$progdir/\$program\"; - $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } - $rm \"\$progdir/\$file\" - fi" - else - echo >> $output "\ - program='$outputname' - progdir=\"\$thisdir/$objdir\" -" - fi - - echo >> $output "\ - - if test -f \"\$progdir/\$program\"; then" - - # Export our shlibpath_var if we have one. - if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then - $echo >> $output "\ - # Add our own library path to $shlibpath_var - $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" - - # Some systems cannot cope with colon-terminated $shlibpath_var - # The second colon is a workaround for a bug in BeOS R4 sed - $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` - - export $shlibpath_var -" - fi - - # fixup the dll searchpath if we need to. - if test -n "$dllsearchpath"; then - $echo >> $output "\ - # Add the dll search path components to the executable PATH - PATH=$dllsearchpath:\$PATH -" - fi - - $echo >> $output "\ - if test \"\$libtool_execute_magic\" != \"$magic\"; then - # Run the actual program with our arguments. -" - case $host in - # Backslashes separate directories on plain windows - *-*-mingw | *-*-os2*) - $echo >> $output "\ - exec \$progdir\\\\\$program \${1+\"\$@\"} -" - ;; - - *) - $echo >> $output "\ - exec \$progdir/\$program \${1+\"\$@\"} -" - ;; - esac - $echo >> $output "\ - \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\" - exit 1 - fi - else - # The program doesn't exist. - \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2 - \$echo \"This script is just a wrapper for \$program.\" 1>&2 - echo \"See the $PACKAGE documentation for more information.\" 1>&2 - exit 1 - fi -fi\ -" - chmod +x $output - fi - exit 0 - ;; - esac - - # See if we need to build an old-fashioned archive. - for oldlib in $oldlibs; do - - if test "$build_libtool_libs" = convenience; then - oldobjs="$libobjs_save" - addlibs="$convenience" - build_libtool_libs=no - else - if test "$build_libtool_libs" = module; then - oldobjs="$libobjs_save" - build_libtool_libs=no - else - oldobjs="$old_deplibs $non_pic_objects" - fi - addlibs="$old_convenience" - fi - - if test -n "$addlibs"; then - gentop="$output_objdir/${outputname}x" - $show "${rm}r $gentop" - $run ${rm}r "$gentop" - $show "$mkdir $gentop" - $run $mkdir "$gentop" - status=$? - if test "$status" -ne 0 && test ! -d "$gentop"; then - exit $status - fi - generated="$generated $gentop" - - # Add in members from convenience archives. - for xlib in $addlibs; do - # Extract the objects. - case $xlib in - [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; - *) xabs=`pwd`"/$xlib" ;; - esac - xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` - xdir="$gentop/$xlib" - - $show "${rm}r $xdir" - $run ${rm}r "$xdir" - $show "$mkdir $xdir" - $run $mkdir "$xdir" - status=$? - if test "$status" -ne 0 && test ! -d "$xdir"; then - exit $status - fi - $show "(cd $xdir && $AR x $xabs)" - $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? - - oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP` - done - fi - - # Do each command in the archive commands. - if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then - eval cmds=\"$old_archive_from_new_cmds\" - else - eval cmds=\"$old_archive_cmds\" - - if len=`expr "X$cmds" : ".*"` && - test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then - : - else - # the command line is too long to link in one step, link in parts - $echo "using piecewise archive linking..." - save_RANLIB=$RANLIB - RANLIB=: - objlist= - concat_cmds= - save_oldobjs=$oldobjs - # GNU ar 2.10+ was changed to match POSIX; thus no paths are - # encoded into archives. This makes 'ar r' malfunction in - # this piecewise linking case whenever conflicting object - # names appear in distinct ar calls; check, warn and compensate. - if (for obj in $save_oldobjs - do - $echo "X$obj" | $Xsed -e 's%^.*/%%' - done | sort | sort -uc >/dev/null 2>&1); then - : - else - $echo "$modename: warning: object name conflicts; overriding AR_FLAGS to 'cq'" 1>&2 - $echo "$modename: warning: to ensure that POSIX-compatible ar will work" 1>&2 - AR_FLAGS=cq - fi - for obj in $save_oldobjs - do - oldobjs="$objlist $obj" - objlist="$objlist $obj" - eval test_cmds=\"$old_archive_cmds\" - if len=`expr "X$test_cmds" : ".*"` && - test "$len" -le "$max_cmd_len"; then - : - else - # the above command should be used before it gets too long - oldobjs=$objlist - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" - objlist= - fi - done - RANLIB=$save_RANLIB - oldobjs=$objlist - eval cmds=\"\$concat_cmds~$old_archive_cmds\" - fi - fi - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - done - - if test -n "$generated"; then - $show "${rm}r$generated" - $run ${rm}r$generated - fi - - # Now create the libtool archive. - case $output in - *.la) - old_library= - test "$build_old_libs" = yes && old_library="$libname.$libext" - $show "creating $output" - - # Preserve any variables that may affect compiler behavior - for var in $variables_saved_for_relink; do - if eval test -z \"\${$var+set}\"; then - relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" - elif eval var_value=\$$var; test -z "$var_value"; then - relink_command="$var=; export $var; $relink_command" - else - var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` - relink_command="$var=\"$var_value\"; export $var; $relink_command" - fi - done - # Quote the link command for shipping. - relink_command="(cd `pwd`; $SHELL $0 --mode=relink $libtool_args @inst_prefix_dir@)" - relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` - - # Only create the output if not a dry run. - if test -z "$run"; then - for installed in no yes; do - if test "$installed" = yes; then - if test -z "$install_libdir"; then - break - fi - output="$output_objdir/$outputname"i - # Replace all uninstalled libtool libraries with the installed ones - newdependency_libs= - for deplib in $dependency_libs; do - case $deplib in - *.la) - name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` - if test -z "$libdir"; then - $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 - exit 1 - fi - newdependency_libs="$newdependency_libs $libdir/$name" - ;; - *) newdependency_libs="$newdependency_libs $deplib" ;; - esac - done - dependency_libs="$newdependency_libs" - newdlfiles= - for lib in $dlfiles; do - name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` - if test -z "$libdir"; then - $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 - exit 1 - fi - newdlfiles="$newdlfiles $libdir/$name" - done - dlfiles="$newdlfiles" - newdlprefiles= - for lib in $dlprefiles; do - name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` - if test -z "$libdir"; then - $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 - exit 1 - fi - newdlprefiles="$newdlprefiles $libdir/$name" - done - dlprefiles="$newdlprefiles" - fi - $rm $output - # place dlname in correct position for cygwin - tdlname=$dlname - case $host,$output,$installed,$module,$dlname in - *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; - esac - $echo > $output "\ -# $outputname - a libtool library file -# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='$tdlname' - -# Names of this library. -library_names='$library_names' - -# The name of the static archive. -old_library='$old_library' - -# Libraries that this one depends upon. -dependency_libs='$dependency_libs' - -# Version information for $libname. -current=$current -age=$age -revision=$revision - -# Is this an already installed library? -installed=$installed - -# Files to dlopen/dlpreopen -dlopen='$dlfiles' -dlpreopen='$dlprefiles' - -# Directory that this library needs to be installed in: -libdir='$install_libdir'" - if test "$installed" = no && test "$need_relink" = yes; then - $echo >> $output "\ -relink_command=\"$relink_command\"" - fi - done - fi - - # Do a symbolic link so that the libtool archive can be found in - # LD_LIBRARY_PATH before the program is installed. - $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" - $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? - ;; - esac - exit 0 - ;; - - # libtool install mode - install) - modename="$modename: install" - - # There may be an optional sh(1) argument at the beginning of - # install_prog (especially on Windows NT). - if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || - # Allow the use of GNU shtool's install command. - $echo "X$nonopt" | $Xsed | grep shtool > /dev/null; then - # Aesthetically quote it. - arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) - arg="\"$arg\"" - ;; - esac - install_prog="$arg " - arg="$1" - shift - else - install_prog= - arg="$nonopt" - fi - - # The real first argument should be the name of the installation program. - # Aesthetically quote it. - arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) - arg="\"$arg\"" - ;; - esac - install_prog="$install_prog$arg" - - # We need to accept at least all the BSD install flags. - dest= - files= - opts= - prev= - install_type= - isdir=no - stripme= - for arg - do - if test -n "$dest"; then - files="$files $dest" - dest="$arg" - continue - fi - - case $arg in - -d) isdir=yes ;; - -f) prev="-f" ;; - -g) prev="-g" ;; - -m) prev="-m" ;; - -o) prev="-o" ;; - -s) - stripme=" -s" - continue - ;; - -*) ;; - - *) - # If the previous option needed an argument, then skip it. - if test -n "$prev"; then - prev= - else - dest="$arg" - continue - fi - ;; - esac - - # Aesthetically quote the argument. - arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) - arg="\"$arg\"" - ;; - esac - install_prog="$install_prog $arg" - done - - if test -z "$install_prog"; then - $echo "$modename: you must specify an install program" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - if test -n "$prev"; then - $echo "$modename: the \`$prev' option requires an argument" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - if test -z "$files"; then - if test -z "$dest"; then - $echo "$modename: no file or destination specified" 1>&2 - else - $echo "$modename: you must specify a destination" 1>&2 - fi - $echo "$help" 1>&2 - exit 1 - fi - - # Strip any trailing slash from the destination. - dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` - - # Check to see that the destination is a directory. - test -d "$dest" && isdir=yes - if test "$isdir" = yes; then - destdir="$dest" - destname= - else - destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` - test "X$destdir" = "X$dest" && destdir=. - destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` - - # Not a directory, so check to see that there is only one file specified. - set dummy $files - if test "$#" -gt 2; then - $echo "$modename: \`$dest' is not a directory" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - fi - case $destdir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - for file in $files; do - case $file in - *.lo) ;; - *) - $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 - $echo "$help" 1>&2 - exit 1 - ;; - esac - done - ;; - esac - - # This variable tells wrapper scripts just to set variables rather - # than running their programs. - libtool_install_magic="$magic" - - staticlibs= - future_libdirs= - current_libdirs= - for file in $files; do - - # Do each installation. - case $file in - *.$libext) - # Do the static libraries later. - staticlibs="$staticlibs $file" - ;; - - *.la) - # Check to see that this really is a libtool archive. - if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : - else - $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - library_names= - old_library= - relink_command= - # If there is no directory component, then add one. - case $file in - */* | *\\*) . $file ;; - *) . ./$file ;; - esac - - # Add the libdir to current_libdirs if it is the destination. - if test "X$destdir" = "X$libdir"; then - case "$current_libdirs " in - *" $libdir "*) ;; - *) current_libdirs="$current_libdirs $libdir" ;; - esac - else - # Note the libdir as a future libdir. - case "$future_libdirs " in - *" $libdir "*) ;; - *) future_libdirs="$future_libdirs $libdir" ;; - esac - fi - - dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ - test "X$dir" = "X$file/" && dir= - dir="$dir$objdir" - - if test -n "$relink_command"; then - # Determine the prefix the user has applied to our future dir. - inst_prefix_dir=`$echo "$destdir" | sed "s%$libdir\$%%"` - - # Don't allow the user to place us outside of our expected - # location b/c this prevents finding dependent libraries that - # are installed to the same prefix. - # At present, this check doesn't affect windows .dll's that - # are installed into $libdir/../bin (currently, that works fine) - # but it's something to keep an eye on. - if test "$inst_prefix_dir" = "$destdir"; then - $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 - exit 1 - fi - - if test -n "$inst_prefix_dir"; then - # Stick the inst_prefix_dir data into the link command. - relink_command=`$echo "$relink_command" | sed "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` - else - relink_command=`$echo "$relink_command" | sed "s%@inst_prefix_dir@%%"` - fi - - $echo "$modename: warning: relinking \`$file'" 1>&2 - $show "$relink_command" - if $run eval "$relink_command"; then : - else - $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 - exit 1 - fi - fi - - # See the names of the shared library. - set dummy $library_names - if test -n "$2"; then - realname="$2" - shift - shift - - srcname="$realname" - test -n "$relink_command" && srcname="$realname"T - - # Install the shared library and build the symlinks. - $show "$install_prog $dir/$srcname $destdir/$realname" - $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? - if test -n "$stripme" && test -n "$striplib"; then - $show "$striplib $destdir/$realname" - $run eval "$striplib $destdir/$realname" || exit $? - fi - - if test "$#" -gt 0; then - # Delete the old symlinks, and create new ones. - for linkname - do - if test "$linkname" != "$realname"; then - $show "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" - $run eval "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" - fi - done - fi - - # Do each command in the postinstall commands. - lib="$destdir/$realname" - eval cmds=\"$postinstall_cmds\" - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - fi - - # Install the pseudo-library for information purposes. - name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - instname="$dir/$name"i - $show "$install_prog $instname $destdir/$name" - $run eval "$install_prog $instname $destdir/$name" || exit $? - - # Maybe install the static library, too. - test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" - ;; - - *.lo) - # Install (i.e. copy) a libtool object. - - # Figure out destination file name, if it wasn't already specified. - if test -n "$destname"; then - destfile="$destdir/$destname" - else - destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - destfile="$destdir/$destfile" - fi - - # Deduce the name of the destination old-style object file. - case $destfile in - *.lo) - staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` - ;; - *.$objext) - staticdest="$destfile" - destfile= - ;; - *) - $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 - $echo "$help" 1>&2 - exit 1 - ;; - esac - - # Install the libtool object if requested. - if test -n "$destfile"; then - $show "$install_prog $file $destfile" - $run eval "$install_prog $file $destfile" || exit $? - fi - - # Install the old object if enabled. - if test "$build_old_libs" = yes; then - # Deduce the name of the old-style object file. - staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` - - $show "$install_prog $staticobj $staticdest" - $run eval "$install_prog \$staticobj \$staticdest" || exit $? - fi - exit 0 - ;; - - *) - # Figure out destination file name, if it wasn't already specified. - if test -n "$destname"; then - destfile="$destdir/$destname" - else - destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - destfile="$destdir/$destfile" - fi - - # If the file is missing, and there is a .exe on the end, strip it - # because it is most likely a libtool script we actually want to - # install - stripped_ext="" - case $file in - *.exe) - if test ! -f "$file"; then - file=`echo $file|${SED} 's,.exe$,,'` - stripped_ext=".exe" - fi - ;; - esac - - # Do a test to see if this is really a libtool program. - case $host in - *cygwin*|*mingw*) - wrapper=`echo $file | ${SED} -e 's,.exe$,,'` - ;; - *) - wrapper=$file - ;; - esac - if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then - notinst_deplibs= - relink_command= - - # If there is no directory component, then add one. - case $file in - */* | *\\*) . $wrapper ;; - *) . ./$wrapper ;; - esac - - # Check the variables that should have been set. - if test -z "$notinst_deplibs"; then - $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2 - exit 1 - fi - - finalize=yes - for lib in $notinst_deplibs; do - # Check to see that each library is installed. - libdir= - if test -f "$lib"; then - # If there is no directory component, then add one. - case $lib in - */* | *\\*) . $lib ;; - *) . ./$lib ;; - esac - fi - libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test - if test -n "$libdir" && test ! -f "$libfile"; then - $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 - finalize=no - fi - done - - relink_command= - # If there is no directory component, then add one. - case $file in - */* | *\\*) . $file ;; - *) . ./$file ;; - esac - - outputname= - if test "$fast_install" = no && test -n "$relink_command"; then - if test "$finalize" = yes && test -z "$run"; then - tmpdir="/tmp" - test -n "$TMPDIR" && tmpdir="$TMPDIR" - tmpdir="$tmpdir/libtool-$$" - if $mkdir -p "$tmpdir" && chmod 700 "$tmpdir"; then : - else - $echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2 - continue - fi - file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` - outputname="$tmpdir/$file" - # Replace the output file specification. - relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` - - $show "$relink_command" - if $run eval "$relink_command"; then : - else - $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 - ${rm}r "$tmpdir" - continue - fi - file="$outputname" - else - $echo "$modename: warning: cannot relink \`$file'" 1>&2 - fi - else - # Install the binary that we compiled earlier. - file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` - fi - fi - - # remove .exe since cygwin /usr/bin/install will append another - # one anyways - case $install_prog,$host in - */usr/bin/install*,*cygwin*) - case $file:$destfile in - *.exe:*.exe) - # this is ok - ;; - *.exe:*) - destfile=$destfile.exe - ;; - *:*.exe) - destfile=`echo $destfile | ${SED} -e 's,.exe$,,'` - ;; - esac - ;; - esac - $show "$install_prog$stripme $file $destfile" - $run eval "$install_prog\$stripme \$file \$destfile" || exit $? - test -n "$outputname" && ${rm}r "$tmpdir" - ;; - esac - done - - for file in $staticlibs; do - name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - - # Set up the ranlib parameters. - oldlib="$destdir/$name" - - $show "$install_prog $file $oldlib" - $run eval "$install_prog \$file \$oldlib" || exit $? - - if test -n "$stripme" && test -n "$striplib"; then - $show "$old_striplib $oldlib" - $run eval "$old_striplib $oldlib" || exit $? - fi - - # Do each command in the postinstall commands. - eval cmds=\"$old_postinstall_cmds\" - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - done - - if test -n "$future_libdirs"; then - $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 - fi - - if test -n "$current_libdirs"; then - # Maybe just do a dry run. - test -n "$run" && current_libdirs=" -n$current_libdirs" - exec_cmd='$SHELL $0 --finish$current_libdirs' - else - exit 0 - fi - ;; - - # libtool finish mode - finish) - modename="$modename: finish" - libdirs="$nonopt" - admincmds= - - if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then - for dir - do - libdirs="$libdirs $dir" - done - - for libdir in $libdirs; do - if test -n "$finish_cmds"; then - # Do each command in the finish commands. - eval cmds=\"$finish_cmds\" - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || admincmds="$admincmds - $cmd" - done - IFS="$save_ifs" - fi - if test -n "$finish_eval"; then - # Do the single finish_eval. - eval cmds=\"$finish_eval\" - $run eval "$cmds" || admincmds="$admincmds - $cmds" - fi - done - fi - - # Exit here if they wanted silent mode. - test "$show" = : && exit 0 - - echo "----------------------------------------------------------------------" - echo "Libraries have been installed in:" - for libdir in $libdirs; do - echo " $libdir" - done - echo - echo "If you ever happen to want to link against installed libraries" - echo "in a given directory, LIBDIR, you must either use libtool, and" - echo "specify the full pathname of the library, or use the \`-LLIBDIR'" - echo "flag during linking and do at least one of the following:" - if test -n "$shlibpath_var"; then - echo " - add LIBDIR to the \`$shlibpath_var' environment variable" - echo " during execution" - fi - if test -n "$runpath_var"; then - echo " - add LIBDIR to the \`$runpath_var' environment variable" - echo " during linking" - fi - if test -n "$hardcode_libdir_flag_spec"; then - libdir=LIBDIR - eval flag=\"$hardcode_libdir_flag_spec\" - - echo " - use the \`$flag' linker flag" - fi - if test -n "$admincmds"; then - echo " - have your system administrator run these commands:$admincmds" - fi - if test -f /etc/ld.so.conf; then - echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" - fi - echo - echo "See any operating system documentation about shared libraries for" - echo "more information, such as the ld(1) and ld.so(8) manual pages." - echo "----------------------------------------------------------------------" - exit 0 - ;; - - # libtool execute mode - execute) - modename="$modename: execute" - - # The first argument is the command name. - cmd="$nonopt" - if test -z "$cmd"; then - $echo "$modename: you must specify a COMMAND" 1>&2 - $echo "$help" - exit 1 - fi - - # Handle -dlopen flags immediately. - for file in $execute_dlfiles; do - if test ! -f "$file"; then - $echo "$modename: \`$file' is not a file" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - dir= - case $file in - *.la) - # Check to see that this really is a libtool archive. - if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : - else - $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - # Read the libtool library. - dlname= - library_names= - - # If there is no directory component, then add one. - case $file in - */* | *\\*) . $file ;; - *) . ./$file ;; - esac - - # Skip this library if it cannot be dlopened. - if test -z "$dlname"; then - # Warn if it was a shared library. - test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" - continue - fi - - dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` - test "X$dir" = "X$file" && dir=. - - if test -f "$dir/$objdir/$dlname"; then - dir="$dir/$objdir" - else - $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 - exit 1 - fi - ;; - - *.lo) - # Just add the directory containing the .lo file. - dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` - test "X$dir" = "X$file" && dir=. - ;; - - *) - $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 - continue - ;; - esac - - # Get the absolute pathname. - absdir=`cd "$dir" && pwd` - test -n "$absdir" && dir="$absdir" - - # Now add the directory to shlibpath_var. - if eval "test -z \"\$$shlibpath_var\""; then - eval "$shlibpath_var=\"\$dir\"" - else - eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" - fi - done - - # This variable tells wrapper scripts just to set shlibpath_var - # rather than running their programs. - libtool_execute_magic="$magic" - - # Check if any of the arguments is a wrapper script. - args= - for file - do - case $file in - -*) ;; - *) - # Do a test to see if this is really a libtool program. - if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - # If there is no directory component, then add one. - case $file in - */* | *\\*) . $file ;; - *) . ./$file ;; - esac - - # Transform arg to wrapped name. - file="$progdir/$program" - fi - ;; - esac - # Quote arguments (to preserve shell metacharacters). - file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` - args="$args \"$file\"" - done - - if test -z "$run"; then - if test -n "$shlibpath_var"; then - # Export the shlibpath_var. - eval "export $shlibpath_var" - fi - - # Restore saved environment variables - if test "${save_LC_ALL+set}" = set; then - LC_ALL="$save_LC_ALL"; export LC_ALL - fi - if test "${save_LANG+set}" = set; then - LANG="$save_LANG"; export LANG - fi - - # Now prepare to actually exec the command. - exec_cmd="\$cmd$args" - else - # Display what would be done. - if test -n "$shlibpath_var"; then - eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" - $echo "export $shlibpath_var" - fi - $echo "$cmd$args" - exit 0 - fi - ;; - - # libtool clean and uninstall mode - clean | uninstall) - modename="$modename: $mode" - rm="$nonopt" - files= - rmforce= - exit_status=0 - - # This variable tells wrapper scripts just to set variables rather - # than running their programs. - libtool_install_magic="$magic" - - for arg - do - case $arg in - -f) rm="$rm $arg"; rmforce=yes ;; - -*) rm="$rm $arg" ;; - *) files="$files $arg" ;; - esac - done - - if test -z "$rm"; then - $echo "$modename: you must specify an RM program" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - rmdirs= - - for file in $files; do - dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` - if test "X$dir" = "X$file"; then - dir=. - objdir="$objdir" - else - objdir="$dir/$objdir" - fi - name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - test "$mode" = uninstall && objdir="$dir" - - # Remember objdir for removal later, being careful to avoid duplicates - if test "$mode" = clean; then - case " $rmdirs " in - *" $objdir "*) ;; - *) rmdirs="$rmdirs $objdir" ;; - esac - fi - - # Don't error if the file doesn't exist and rm -f was used. - if (test -L "$file") >/dev/null 2>&1 \ - || (test -h "$file") >/dev/null 2>&1 \ - || test -f "$file"; then - : - elif test -d "$file"; then - exit_status=1 - continue - elif test "$rmforce" = yes; then - continue - fi - - rmfiles="$file" - - case $name in - *.la) - # Possibly a libtool archive, so verify it. - if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - . $dir/$name - - # Delete the libtool libraries and symlinks. - for n in $library_names; do - rmfiles="$rmfiles $objdir/$n" - done - test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" - test "$mode" = clean && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" - - if test "$mode" = uninstall; then - if test -n "$library_names"; then - # Do each command in the postuninstall commands. - eval cmds=\"$postuninstall_cmds\" - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" - if test "$?" -ne 0 && test "$rmforce" != yes; then - exit_status=1 - fi - done - IFS="$save_ifs" - fi - - if test -n "$old_library"; then - # Do each command in the old_postuninstall commands. - eval cmds=\"$old_postuninstall_cmds\" - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" - if test "$?" -ne 0 && test "$rmforce" != yes; then - exit_status=1 - fi - done - IFS="$save_ifs" - fi - # FIXME: should reinstall the best remaining shared library. - fi - fi - ;; - - *.lo) - # Possibly a libtool object, so verify it. - if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - - # Read the .lo file - . $dir/$name - - # Add PIC object to the list of files to remove. - if test -n "$pic_object" \ - && test "$pic_object" != none; then - rmfiles="$rmfiles $dir/$pic_object" - fi - - # Add non-PIC object to the list of files to remove. - if test -n "$non_pic_object" \ - && test "$non_pic_object" != none; then - rmfiles="$rmfiles $dir/$non_pic_object" - fi - fi - ;; - - *) - # Do a test to see if this is a libtool program. - if test "$mode" = clean && - (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - relink_command= - . $dir/$file - - rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" - if test "$fast_install" = yes && test -n "$relink_command"; then - rmfiles="$rmfiles $objdir/lt-$name" - fi - fi - ;; - esac - $show "$rm $rmfiles" - $run $rm $rmfiles || exit_status=1 - done - - # Try to remove the ${objdir}s in the directories where we deleted files - for dir in $rmdirs; do - if test -d "$dir"; then - $show "rmdir $dir" - $run rmdir $dir >/dev/null 2>&1 - fi - done - - exit $exit_status - ;; - - "") - $echo "$modename: you must specify a MODE" 1>&2 - $echo "$generic_help" 1>&2 - exit 1 - ;; - esac - - if test -z "$exec_cmd"; then - $echo "$modename: invalid operation mode \`$mode'" 1>&2 - $echo "$generic_help" 1>&2 - exit 1 - fi -fi # test -z "$show_help" - -if test -n "$exec_cmd"; then - eval exec $exec_cmd - exit 1 -fi - -# We need to display help for each of the modes. -case $mode in -"") $echo \ -"Usage: $modename [OPTION]... [MODE-ARG]... - -Provide generalized library-building support services. - - --config show all configuration variables - --debug enable verbose shell tracing --n, --dry-run display commands without modifying any files - --features display basic configuration information and exit - --finish same as \`--mode=finish' - --help display this help message and exit - --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] - --quiet same as \`--silent' - --silent don't print informational messages - --tag=TAG use configuration variables from tag TAG - --version print version information - -MODE must be one of the following: - - clean remove files from the build directory - compile compile a source file into a libtool object - execute automatically set library path, then run a program - finish complete the installation of libtool libraries - install install libraries or executables - link create a library or an executable - uninstall remove libraries from an installed directory - -MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for -a more detailed description of MODE." - exit 0 - ;; - -clean) - $echo \ -"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE... - -Remove files from the build directory. - -RM is the name of the program to use to delete files associated with each FILE -(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed -to RM. - -If FILE is a libtool library, object or program, all the files associated -with it are deleted. Otherwise, only FILE itself is deleted using RM." - ;; - -compile) - $echo \ -"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE - -Compile a source file into a libtool library object. - -This mode accepts the following additional options: - - -o OUTPUT-FILE set the output file name to OUTPUT-FILE - -prefer-pic try to building PIC objects only - -prefer-non-pic try to building non-PIC objects only - -static always build a \`.o' file suitable for static linking - -COMPILE-COMMAND is a command to be used in creating a \`standard' object file -from the given SOURCEFILE. - -The output file name is determined by removing the directory component from -SOURCEFILE, then substituting the C source code suffix \`.c' with the -library object suffix, \`.lo'." - ;; - -execute) - $echo \ -"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... - -Automatically set library path, then run a program. - -This mode accepts the following additional options: - - -dlopen FILE add the directory containing FILE to the library path - -This mode sets the library path environment variable according to \`-dlopen' -flags. - -If any of the ARGS are libtool executable wrappers, then they are translated -into their corresponding uninstalled binary, and any of their required library -directories are added to the library path. - -Then, COMMAND is executed, with ARGS as arguments." - ;; - -finish) - $echo \ -"Usage: $modename [OPTION]... --mode=finish [LIBDIR]... - -Complete the installation of libtool libraries. - -Each LIBDIR is a directory that contains libtool libraries. - -The commands that this mode executes may require superuser privileges. Use -the \`--dry-run' option if you just want to see what would be executed." - ;; - -install) - $echo \ -"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... - -Install executables or libraries. - -INSTALL-COMMAND is the installation command. The first component should be -either the \`install' or \`cp' program. - -The rest of the components are interpreted as arguments to that command (only -BSD-compatible install options are recognized)." - ;; - -link) - $echo \ -"Usage: $modename [OPTION]... --mode=link LINK-COMMAND... - -Link object files or libraries together to form another library, or to -create an executable program. - -LINK-COMMAND is a command using the C compiler that you would use to create -a program from several object files. - -The following components of LINK-COMMAND are treated specially: - - -all-static do not do any dynamic linking at all - -avoid-version do not add a version suffix if possible - -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime - -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols - -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) - -export-symbols SYMFILE - try to export only the symbols listed in SYMFILE - -export-symbols-regex REGEX - try to export only the symbols matching REGEX - -LLIBDIR search LIBDIR for required installed libraries - -lNAME OUTPUT-FILE requires the installed library libNAME - -module build a library that can dlopened - -no-fast-install disable the fast-install mode - -no-install link a not-installable executable - -no-undefined declare that a library does not refer to external symbols - -o OUTPUT-FILE create OUTPUT-FILE from the specified objects - -objectlist FILE Use a list of object files found in FILE to specify objects - -release RELEASE specify package release information - -rpath LIBDIR the created library will eventually be installed in LIBDIR - -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries - -static do not do any dynamic linking of libtool libraries - -version-info CURRENT[:REVISION[:AGE]] - specify library version info [each variable defaults to 0] - -All other options (arguments beginning with \`-') are ignored. - -Every other argument is treated as a filename. Files ending in \`.la' are -treated as uninstalled libtool libraries, other files are standard or library -object files. - -If the OUTPUT-FILE ends in \`.la', then a libtool library is created, -only library objects (\`.lo' files) may be specified, and \`-rpath' is -required, except when creating a convenience library. - -If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created -using \`ar' and \`ranlib', or on Windows using \`lib'. - -If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file -is created, otherwise an executable program is created." - ;; - -uninstall) - $echo \ -"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... - -Remove libraries from an installation directory. - -RM is the name of the program to use to delete files associated with each FILE -(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed -to RM. - -If FILE is a libtool library, all the files associated with it are deleted. -Otherwise, only FILE itself is deleted using RM." - ;; - -*) - $echo "$modename: invalid operation mode \`$mode'" 1>&2 - $echo "$help" 1>&2 - exit 1 - ;; -esac - -echo -$echo "Try \`$modename --help' for more information about other modes." - -exit 0 - -# The TAGs below are defined such that we never get into a situation -# in which we disable both kinds of libraries. Given conflicting -# choices, we go for a static library, that is the most portable, -# since we can't tell whether shared libraries were disabled because -# the user asked for that or because the platform doesn't support -# them. This is particularly important on AIX, because we don't -# support having both static and shared libraries enabled at the same -# time on that platform, so we default to a shared-only configuration. -# If a disable-shared tag is given, we'll fallback to a static-only -# configuration. But we'll never go from static-only to shared-only. - -# ### BEGIN LIBTOOL TAG CONFIG: disable-shared -build_libtool_libs=no -build_old_libs=yes -# ### END LIBTOOL TAG CONFIG: disable-shared - -# ### BEGIN LIBTOOL TAG CONFIG: disable-static -build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` -# ### END LIBTOOL TAG CONFIG: disable-static - -# Local Variables: -# mode:shell-script -# sh-indentation:2 -# End: -# ### BEGIN LIBTOOL TAG CONFIG: CXX - -# Libtool was configured on host du216771: - -# Shell to use when invoking shell scripts. -SHELL="/bin/sh" - -# Whether or not to build shared libraries. -build_libtool_libs=no - -# Whether or not to build static libraries. -build_old_libs=yes - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=yes - -# Whether or not to disallow shared libs when runtime libs are static -allow_libtool_libs_with_static_runtimes=no - -# Whether or not to optimize for fast installation. -fast_install=needless - -# The host system. -host_alias= -host=i686-pc-msys - -# An echo program that does not interpret backslashes. -echo="echo" - -# The archiver. -AR="ar" -AR_FLAGS="cru" - -# A C compiler. -LTCC="gcc" - -# A language-specific compiler. -CC="g++" - -# Is the compiler the GNU C compiler? -with_gcc=yes - -# An ERE matcher. -EGREP="grep -E" - -# The linker used to build libraries. -LD="/usr/msys/bin/ld.exe" - -# Whether we need hard or soft links. -LN_S="ln -s" - -# A BSD-compatible nm program. -NM="/bin/nm -B" - -# A sed program that does not truncate output. -SED="/bin/sed" - -# A symbol stripping program -STRIP=strip - -# Used to examine libraries when file_magic_cmd begins "file" -MAGIC_CMD=file - -# Used on cygwin: DLL creation program. -DLLTOOL="dlltool" - -# Used on cygwin: object dumper. -OBJDUMP="objdump" - -# Used on cygwin: assembler. -AS="as" - -# The name of the directory that contains temporary libtool files. -objdir=.libs - -# How to create reloadable object files. -reload_flag=" -r" -reload_cmds="\$LD\$reload_flag -o \$output\$reload_objs" - -# How to pass a linker flag through the compiler. -wl="-Wl," - -# Object file suffix (normally "o"). -objext="o" - -# Old archive suffix (normally "a"). -libext="a" - -# Executable file suffix (normally ""). -exeext="" - -# Additional compiler flags for building library objects. -pic_flag=" -DPIC" -pic_mode=default - -# What is the maximum length of a command? -max_cmd_len=262144 - -# Does compiler simultaneously support -c and -o options? -compiler_c_o="yes" - -# Must we lock files when doing compilation ? -need_locks="no" - -# Do we need the lib prefix for modules? -need_lib_prefix=unknown - -# Do we need a version for libraries? -need_version=unknown - -# Whether dlopen is supported. -dlopen_support=yes - -# Whether dlopen of programs is supported. -dlopen_self=no - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=unknown - -# Compiler flag to prevent dynamic linking. -link_static_flag="-static" - -# Compiler flag to turn off builtin functions. -no_builtin_flag=" -fno-builtin" - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec="\${wl}--export-dynamic" - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec="\${wl}--whole-archive\$convenience \${wl}--no-whole-archive" - -# Compiler flag to generate thread-safe objects. -thread_safe_flag_spec="" - -# Library versioning type. -version_type=none - -# Format of library name prefix. -libname_spec="lib\$name" - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME. -library_names_spec="" - -# The coded name of the library, if different from the real name. -soname_spec="" - -# Commands used to build and install an old-style archive. -RANLIB="ranlib" -old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs\$old_deplibs~\$RANLIB \$oldlib" -old_postinstall_cmds="\$RANLIB \$oldlib~chmod 644 \$oldlib" -old_postuninstall_cmds="" - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds="" - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds="" - -# Commands used to build and install a shared archive. -archive_cmds="\$CC -shared -nostdlib \$predep_objects \$libobjs \$deplibs \$postdep_objects \$compiler_flags \${wl}-soname \$wl\$soname -o \$lib" -archive_expsym_cmds="\$CC -shared -nostdlib \$predep_objects \$libobjs \$deplibs \$postdep_objects \$compiler_flags \${wl}-soname \$wl\$soname \${wl}-retain-symbols-file \$wl\$export_symbols -o \$lib" -postinstall_cmds="" -postuninstall_cmds="" - -# Commands to strip libraries. -old_striplib="strip --strip-debug" -striplib="strip --strip-unneeded" - -# Dependencies to place before the objects being linked to create a -# shared library. -predep_objects="" - -# Dependencies to place after the objects being linked to create a -# shared library. -postdep_objects="" - -# Dependencies to place before the objects being linked to create a -# shared library. -predeps="" - -# Dependencies to place after the objects being linked to create a -# shared library. -postdeps="-lstdc++ -lgcc -lmsys-1.0 -luser32 -lkernel32 -ladvapi32 -lshell32 -lgcc" - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path="-L/usr/lib -L/usr/lib -L/usr/lib/w32api -L/bin/../lib/gcc-lib/msys/2.95.3-1 -L/bin/../lib/gcc-lib -L/usr/lib/gcc-lib/msys/2.95.3-1 -L/bin/../lib/gcc-lib/msys/2.95.3-1/../../../../msys/lib -L/usr/lib/gcc-lib/msys/2.95.3-1/../../../../msys/lib" - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method="unknown" - -# Command to use when deplibs_check_method == file_magic. -file_magic_cmd="\$MAGIC_CMD" - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag="" - -# Flag that forces no undefined symbols. -no_undefined_flag="" - -# Commands used to finish a libtool library installation in a directory. -finish_cmds="" - -# Same as above, but a single script fragment to be evaled but not shown. -finish_eval="" - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe="sed -n -e 's/^.*[ ]\\([ABCDGISTW][ABCDGISTW]*\\)[ ][ ]*\\(_\\)\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2\\3 \\3/p'" - -# Transform the output of nm in a proper C declaration -global_symbol_to_cdecl="sed -n -e 's/^. .* \\(.*\\)\$/extern int \\1;/p'" - -# Transform the output of nm in a C name address pair -global_symbol_to_c_name_address="sed -n -e 's/^: \\([^ ]*\\) \$/ {\\\"\\1\\\", (lt_ptr) 0},/p' -e 's/^[BCDEGRST] \\([^ ]*\\) \\([^ ]*\\)\$/ {\"\\2\", (lt_ptr) \\&\\2},/p'" - -# This is the shared library runtime path variable. -runpath_var=LD_RUN_PATH - -# This is the shared library path variable. -shlibpath_var= - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=unknown - -# How to hardcode a shared library path into an executable. -hardcode_action=immediate - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=no - -# Flag to hardcode $libdir into a binary during linking. -# This must work even if $libdir does not exist. -hardcode_libdir_flag_spec="\${wl}--rpath \${wl}\$libdir" - -# Whether we need a single -rpath flag with a separated argument. -hardcode_libdir_separator="" - -# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the -# resulting binary. -hardcode_direct=no - -# Set to yes if using the -LDIR flag during linking hardcodes DIR into the -# resulting binary. -hardcode_minus_L=no - -# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into -# the resulting binary. -hardcode_shlibpath_var= - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at relink time. -variables_saved_for_relink="PATH LD_RUN_PATH GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=unknown - -# Compile-time system search path for libraries -sys_lib_search_path_spec=" /bin/../lib/gcc-lib/msys/2.95.3-1/ /bin/../lib/gcc-lib/ /usr/lib/gcc-lib/msys/2.95.3-1/ /usr/lib/gcc/msys/2.95.3-1/ /bin/../lib/gcc-lib/msys/2.95.3-1/../../../../msys/lib/msys/2.95.3-1/ /bin/../lib/gcc-lib/msys/2.95.3-1/../../../../msys/lib/ /usr/lib/gcc-lib/msys/2.95.3-1/../../../../msys/lib/msys/2.95.3-1/ /usr/lib/gcc-lib/msys/2.95.3-1/../../../../msys/lib/" - -# Run-time system search path for libraries -sys_lib_dlsearch_path_spec="/lib /usr/lib" - -# Fix the shell variable $srcfile for the compiler. -fix_srcfile_path="" - -# Set to yes if exported symbols are required. -always_export_symbols=no - -# The commands to list exported symbols. -export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | sed 's/.* //' | sort | uniq > \$export_symbols" - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds="" - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms="" - -# Symbols that must always be exported. -include_expsyms="" - -# ### END LIBTOOL TAG CONFIG: CXX - -# ### BEGIN LIBTOOL TAG CONFIG: F77 - -# Libtool was configured on host du216771: - -# Shell to use when invoking shell scripts. -SHELL="/bin/sh" - -# Whether or not to build shared libraries. -build_libtool_libs=no - -# Whether or not to build static libraries. -build_old_libs=yes - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=yes - -# Whether or not to disallow shared libs when runtime libs are static -allow_libtool_libs_with_static_runtimes=no - -# Whether or not to optimize for fast installation. -fast_install=needless - -# The host system. -host_alias= -host=i686-pc-msys - -# An echo program that does not interpret backslashes. -echo="echo" - -# The archiver. -AR="ar" -AR_FLAGS="cru" - -# A C compiler. -LTCC="gcc" - -# A language-specific compiler. -CC="g77" - -# Is the compiler the GNU C compiler? -with_gcc=yes - -# An ERE matcher. -EGREP="grep -E" - -# The linker used to build libraries. -LD="/usr/msys/bin/ld.exe" - -# Whether we need hard or soft links. -LN_S="ln -s" - -# A BSD-compatible nm program. -NM="/bin/nm -B" - -# A sed program that does not truncate output. -SED="/bin/sed" - -# A symbol stripping program -STRIP=strip - -# Used to examine libraries when file_magic_cmd begins "file" -MAGIC_CMD=file - -# Used on cygwin: DLL creation program. -DLLTOOL="dlltool" - -# Used on cygwin: object dumper. -OBJDUMP="objdump" - -# Used on cygwin: assembler. -AS="as" - -# The name of the directory that contains temporary libtool files. -objdir=.libs - -# How to create reloadable object files. -reload_flag=" -r" -reload_cmds="\$LD\$reload_flag -o \$output\$reload_objs" - -# How to pass a linker flag through the compiler. -wl="-Wl," - -# Object file suffix (normally "o"). -objext="o" - -# Old archive suffix (normally "a"). -libext="a" - -# Executable file suffix (normally ""). -exeext="" - -# Additional compiler flags for building library objects. -pic_flag=" -DPIC" -pic_mode=default - -# What is the maximum length of a command? -max_cmd_len=262144 - -# Does compiler simultaneously support -c and -o options? -compiler_c_o="yes" - -# Must we lock files when doing compilation ? -need_locks="no" - -# Do we need the lib prefix for modules? -need_lib_prefix=unknown - -# Do we need a version for libraries? -need_version=unknown - -# Whether dlopen is supported. -dlopen_support=yes - -# Whether dlopen of programs is supported. -dlopen_self=no - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=unknown - -# Compiler flag to prevent dynamic linking. -link_static_flag="-static" - -# Compiler flag to turn off builtin functions. -no_builtin_flag="" - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec="\${wl}--export-dynamic" - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec="\${wl}--whole-archive\$convenience \${wl}--no-whole-archive" - -# Compiler flag to generate thread-safe objects. -thread_safe_flag_spec="" - -# Library versioning type. -version_type=none - -# Format of library name prefix. -libname_spec="lib\$name" - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME. -library_names_spec="" - -# The coded name of the library, if different from the real name. -soname_spec="" - -# Commands used to build and install an old-style archive. -RANLIB="ranlib" -old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs\$old_deplibs~\$RANLIB \$oldlib" -old_postinstall_cmds="\$RANLIB \$oldlib~chmod 644 \$oldlib" -old_postuninstall_cmds="" - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds="" - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds="" - -# Commands used to build and install a shared archive. -archive_cmds="\$CC -shared \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname -o \$lib" -archive_expsym_cmds="\$CC -shared \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname \${wl}-retain-symbols-file \$wl\$export_symbols -o \$lib" -postinstall_cmds="" -postuninstall_cmds="" - -# Commands to strip libraries. -old_striplib="strip --strip-debug" -striplib="strip --strip-unneeded" - -# Dependencies to place before the objects being linked to create a -# shared library. -predep_objects="" - -# Dependencies to place after the objects being linked to create a -# shared library. -postdep_objects="" - -# Dependencies to place before the objects being linked to create a -# shared library. -predeps="" - -# Dependencies to place after the objects being linked to create a -# shared library. -postdeps="" - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path="" - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method="unknown" - -# Command to use when deplibs_check_method == file_magic. -file_magic_cmd="\$MAGIC_CMD" - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag="" - -# Flag that forces no undefined symbols. -no_undefined_flag="" - -# Commands used to finish a libtool library installation in a directory. -finish_cmds="" - -# Same as above, but a single script fragment to be evaled but not shown. -finish_eval="" - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe="sed -n -e 's/^.*[ ]\\([ABCDGISTW][ABCDGISTW]*\\)[ ][ ]*\\(_\\)\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2\\3 \\3/p'" - -# Transform the output of nm in a proper C declaration -global_symbol_to_cdecl="sed -n -e 's/^. .* \\(.*\\)\$/extern int \\1;/p'" - -# Transform the output of nm in a C name address pair -global_symbol_to_c_name_address="sed -n -e 's/^: \\([^ ]*\\) \$/ {\\\"\\1\\\", (lt_ptr) 0},/p' -e 's/^[BCDEGRST] \\([^ ]*\\) \\([^ ]*\\)\$/ {\"\\2\", (lt_ptr) \\&\\2},/p'" - -# This is the shared library runtime path variable. -runpath_var=LD_RUN_PATH - -# This is the shared library path variable. -shlibpath_var= - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=unknown - -# How to hardcode a shared library path into an executable. -hardcode_action=immediate - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=no - -# Flag to hardcode $libdir into a binary during linking. -# This must work even if $libdir does not exist. -hardcode_libdir_flag_spec="\${wl}--rpath \${wl}\$libdir" - -# Whether we need a single -rpath flag with a separated argument. -hardcode_libdir_separator="" - -# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the -# resulting binary. -hardcode_direct=no - -# Set to yes if using the -LDIR flag during linking hardcodes DIR into the -# resulting binary. -hardcode_minus_L=no - -# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into -# the resulting binary. -hardcode_shlibpath_var=unsupported - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at relink time. -variables_saved_for_relink="PATH LD_RUN_PATH GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=unknown - -# Compile-time system search path for libraries -sys_lib_search_path_spec=" /bin/../lib/gcc-lib/msys/2.95.3-1/ /bin/../lib/gcc-lib/ /usr/lib/gcc-lib/msys/2.95.3-1/ /usr/lib/gcc/msys/2.95.3-1/ /bin/../lib/gcc-lib/msys/2.95.3-1/../../../../msys/lib/msys/2.95.3-1/ /bin/../lib/gcc-lib/msys/2.95.3-1/../../../../msys/lib/ /usr/lib/gcc-lib/msys/2.95.3-1/../../../../msys/lib/msys/2.95.3-1/ /usr/lib/gcc-lib/msys/2.95.3-1/../../../../msys/lib/" - -# Run-time system search path for libraries -sys_lib_dlsearch_path_spec="/lib /usr/lib" - -# Fix the shell variable $srcfile for the compiler. -fix_srcfile_path="" - -# Set to yes if exported symbols are required. -always_export_symbols=no - -# The commands to list exported symbols. -export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | sed 's/.* //' | sort | uniq > \$export_symbols" - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds="" - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms="_GLOBAL_OFFSET_TABLE_" - -# Symbols that must always be exported. -include_expsyms="" - -# ### END LIBTOOL TAG CONFIG: F77 - -# ### BEGIN LIBTOOL TAG CONFIG: GCJ - -# Libtool was configured on host du216771: - -# Shell to use when invoking shell scripts. -SHELL="/bin/sh" - -# Whether or not to build shared libraries. -build_libtool_libs=no - -# Whether or not to build static libraries. -build_old_libs=yes - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=yes - -# Whether or not to disallow shared libs when runtime libs are static -allow_libtool_libs_with_static_runtimes=no - -# Whether or not to optimize for fast installation. -fast_install=needless - -# The host system. -host_alias= -host=i686-pc-msys - -# An echo program that does not interpret backslashes. -echo="echo" - -# The archiver. -AR="ar" -AR_FLAGS="cru" - -# A C compiler. -LTCC="gcc" - -# A language-specific compiler. -CC="no" - -# Is the compiler the GNU C compiler? -with_gcc= - -# An ERE matcher. -EGREP="grep -E" - -# The linker used to build libraries. -LD="" - -# Whether we need hard or soft links. -LN_S="ln -s" - -# A BSD-compatible nm program. -NM="/bin/nm -B" - -# A sed program that does not truncate output. -SED="/bin/sed" - -# A symbol stripping program -STRIP=strip - -# Used to examine libraries when file_magic_cmd begins "file" -MAGIC_CMD=file - -# Used on cygwin: DLL creation program. -DLLTOOL="dlltool" - -# Used on cygwin: object dumper. -OBJDUMP="objdump" - -# Used on cygwin: assembler. -AS="as" - -# The name of the directory that contains temporary libtool files. -objdir=.libs - -# How to create reloadable object files. -reload_flag=" -r" -reload_cmds="\$LD\$reload_flag -o \$output\$reload_objs" - -# How to pass a linker flag through the compiler. -wl="-Wl," - -# Object file suffix (normally "o"). -objext="o" - -# Old archive suffix (normally "a"). -libext="a" - -# Executable file suffix (normally ""). -exeext="" - -# Additional compiler flags for building library objects. -pic_flag="" -pic_mode=default - -# What is the maximum length of a command? -max_cmd_len=262144 - -# Does compiler simultaneously support -c and -o options? -compiler_c_o="no" - -# Must we lock files when doing compilation ? -need_locks="no" - -# Do we need the lib prefix for modules? -need_lib_prefix=unknown - -# Do we need a version for libraries? -need_version=unknown - -# Whether dlopen is supported. -dlopen_support=yes - -# Whether dlopen of programs is supported. -dlopen_self=no - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=unknown - -# Compiler flag to prevent dynamic linking. -link_static_flag="-static" - -# Compiler flag to turn off builtin functions. -no_builtin_flag=" -fno-builtin -fno-rtti -fno-exceptions" - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec="\${wl}--export-dynamic" - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec="\${wl}--whole-archive\$convenience \${wl}--no-whole-archive" - -# Compiler flag to generate thread-safe objects. -thread_safe_flag_spec="" - -# Library versioning type. -version_type=none - -# Format of library name prefix. -libname_spec="lib\$name" - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME. -library_names_spec="" - -# The coded name of the library, if different from the real name. -soname_spec="" - -# Commands used to build and install an old-style archive. -RANLIB="ranlib" -old_archive_cmds="" -old_postinstall_cmds="\$RANLIB \$oldlib~chmod 644 \$oldlib" -old_postuninstall_cmds="" - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds="" - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds="" - -# Commands used to build and install a shared archive. -archive_cmds="\$CC -shared \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname -o \$lib" -archive_expsym_cmds="\$CC -shared \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname \${wl}-retain-symbols-file \$wl\$export_symbols -o \$lib" -postinstall_cmds="" -postuninstall_cmds="" - -# Commands to strip libraries. -old_striplib="strip --strip-debug" -striplib="strip --strip-unneeded" - -# Dependencies to place before the objects being linked to create a -# shared library. -predep_objects="" - -# Dependencies to place after the objects being linked to create a -# shared library. -postdep_objects="" - -# Dependencies to place before the objects being linked to create a -# shared library. -predeps="" - -# Dependencies to place after the objects being linked to create a -# shared library. -postdeps="" - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path="" - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method="unknown" - -# Command to use when deplibs_check_method == file_magic. -file_magic_cmd="\$MAGIC_CMD" - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag="" - -# Flag that forces no undefined symbols. -no_undefined_flag="" - -# Commands used to finish a libtool library installation in a directory. -finish_cmds="" - -# Same as above, but a single script fragment to be evaled but not shown. -finish_eval="" - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe="sed -n -e 's/^.*[ ]\\([ABCDGISTW][ABCDGISTW]*\\)[ ][ ]*\\(_\\)\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2\\3 \\3/p'" - -# Transform the output of nm in a proper C declaration -global_symbol_to_cdecl="sed -n -e 's/^. .* \\(.*\\)\$/extern int \\1;/p'" - -# Transform the output of nm in a C name address pair -global_symbol_to_c_name_address="sed -n -e 's/^: \\([^ ]*\\) \$/ {\\\"\\1\\\", (lt_ptr) 0},/p' -e 's/^[BCDEGRST] \\([^ ]*\\) \\([^ ]*\\)\$/ {\"\\2\", (lt_ptr) \\&\\2},/p'" - -# This is the shared library runtime path variable. -runpath_var=LD_RUN_PATH - -# This is the shared library path variable. -shlibpath_var= - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=unknown - -# How to hardcode a shared library path into an executable. -hardcode_action=immediate - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=no - -# Flag to hardcode $libdir into a binary during linking. -# This must work even if $libdir does not exist. -hardcode_libdir_flag_spec="\${wl}--rpath \${wl}\$libdir" - -# Whether we need a single -rpath flag with a separated argument. -hardcode_libdir_separator="" - -# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the -# resulting binary. -hardcode_direct=no - -# Set to yes if using the -LDIR flag during linking hardcodes DIR into the -# resulting binary. -hardcode_minus_L=no - -# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into -# the resulting binary. -hardcode_shlibpath_var=unsupported - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at relink time. -variables_saved_for_relink="PATH LD_RUN_PATH GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=unknown - -# Compile-time system search path for libraries -sys_lib_search_path_spec="" - -# Run-time system search path for libraries -sys_lib_dlsearch_path_spec="/lib /usr/lib" - -# Fix the shell variable $srcfile for the compiler. -fix_srcfile_path="" - -# Set to yes if exported symbols are required. -always_export_symbols=no - -# The commands to list exported symbols. -export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | sed 's/.* //' | sort | uniq > \$export_symbols" - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds="" - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms="_GLOBAL_OFFSET_TABLE_" - -# Symbols that must always be exported. -include_expsyms="" - -# ### END LIBTOOL TAG CONFIG: GCJ - diff --git a/bin/libtoolize b/bin/libtoolize deleted file mode 100644 index b3cdaa13..00000000 --- a/bin/libtoolize +++ /dev/null @@ -1,353 +0,0 @@ -#! /bin/sh -# libtoolize - Prepare a package to use libtool. -# libtoolize. Generated from libtoolize.in by configure. -# Copyright (C) 1996-2000, 2001 Free Software Foundation, Inc. -# Originally by Gordon Matzigkeit , 1996 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# The name of this program. -progname=`echo "$0" | sed 's%^.*/%%'` - -# Constants. -PROGRAM=libtoolize -PACKAGE=libtool -VERSION=1.4e - -# Directory names. -prefix=/usr -datadir=${prefix}/share -pkgdatadir=${datadir}/libtool -aclocaldir=${datadir}/aclocal - -libtool_m4="$aclocaldir/libtool.m4" -ltdl_m4="$aclocaldir/ltdl.m4" - -dry_run=no -help="Try \`$progname --help' for more information." -rm="rm -f" -ln_s="ln -s" -cp="cp -f" -mkdir="mkdir" - -# Global variables. -automake= -copy= -force= -ltdl= -ltdl_tar= -configure_ac= -status=0 - -for arg -do - case "$arg" in - --help) - cat <&2 - echo "$help" 1>&2 - exit 1 - ;; - - *) - echo "$progname: too many arguments" 1>&2 - echo "$help" 1>&2 - exit 1 - ;; - esac -done - -if test -f configure.ac; then - configure_ac=configure.ac -elif test -f configure.in; then - configure_ac=configure.in -else - echo "$progname: \`configure.ac' does not exist" 1>&2 - echo "$help" 1>&2 - exit 1 -fi - - -files=`cd $pkgdatadir && ls` -if test -z "$files"; then - echo "$progname: cannot list files in \`$pkgdatadir'" 1>&2 - exit 1 -fi -files='config.guess config.sub ltmain.sh' - -auxdir=. -auxdirline=`grep '^AC_CONFIG_AUX_DIR' $configure_ac 2>/dev/null` -if test -n "$auxdirline"; then - # Handle explicit AC_CONFIG_AUX_DIR settings. - auxdir=`echo "$auxdirline" | sed 's/^AC_CONFIG_AUX_DIR(\([^)]*\)).*$/\1/'` - - if test "$auxdir" = "$auxdirline"; then - echo "$progname: invalid AC_CONFIG_AUX_DIR syntax: $auxdirline" 1>&2 - exit 1 - else - # Strip any quote brackets. - auxdir=`echo "$auxdir" | sed 's/^\[\(.*\)\]$/\1/g'` - case "$auxdir" in - *\$*) - echo "$progname: cannot handle variables in AC_CONFIG_AUX_DIR" 1>&2 - exit 1 - ;; - *) - ;; - esac - fi -else - # Try to discover auxdir the same way it is discovered by configure. - # Note that we default to the current directory. - for dir in . .. ../..; do - if test -f $dir/install-sh; then - auxdir=$dir - break - elif test -f $dir/install.sh; then - auxdir=$dir - break - fi - done -fi - -if test -z "$automake"; then - if grep '^A[MC]_PROG_LIBTOOL' $configure_ac >/dev/null 2>&1; then : - else - echo "Remember to add \`AC_PROG_LIBTOOL' to \`$configure_ac'." - fi - - if grep '^AC_PROG_RANLIB' $configure_ac >/dev/null 2>&1; then - echo "Using \`AC_PROG_RANLIB' is rendered obsolete by \`AC_PROG_LIBTOOL'" - fi - - if grep 'generated automatically by aclocal' aclocal.m4 >/dev/null 2>&1; then - updatemsg="update your \`aclocal.m4' by running aclocal" - else - updatemsg="add the contents of \`$libtool_m4' to \`aclocal.m4'" - fi - - if grep '^AC_DEFUN(\[A[MC]_PROG_LIBTOOL' aclocal.m4 >/dev/null 2>&1; then - # Check the version number on libtool.m4 and the one used in aclocal.m4. - instserial=`grep '^# serial ' $libtool_m4 | grep 'A[MC]_PROG_LIBTOOL' | sed -e 's/^# serial \([0-9][0-9]*\).*$/\1/; q'` - - if test -z "$instserial"; then - echo "$progname: warning: no serial number on \`$libtool_m4'" 1>&2 - else - # If the local macro has no serial number, we assume it's ancient. - localserial=`grep '^# serial ' aclocal.m4 | grep 'A[MC]_PROG_LIBTOOL' | sed -e 's/^# serial \([0-9][0-9]*\).*$/\1/; q'` - - test -z "$localserial" && localserial=0 - - if test "$localserial" -lt "$instserial"; then - echo "You should $updatemsg." - elif test "$localserial" -gt "$instserial"; then - echo "$progname: \`$libtool_m4' is serial $instserial, less than $localserial in \`aclocal.m4'" 1>&2 - if test -z "$force"; then - echo "Use \`--force' to replace newer libtool files with this version." 1>&2 - exit 1 - fi - echo "To remain compatible, you should $updatemsg." - fi - fi - else - echo "You should $updatemsg." - fi - - if grep '^AC_LIB_LTDL' $configure_ac >/dev/null 2>&1; then - if grep 'generated automatically by aclocal' aclocal.m4 >/dev/null 2>&1; then - updatemsg="update your \`aclocal.m4' by running aclocal" - else - updatemsg="add the contents of \`$ltdl_m4' to \`aclocal.m4'" - fi - - if grep '^AC_DEFUN(AC_LIB_LTDL' aclocal.m4 >/dev/null 2>&1; then - # Check the version number on ltdl.m4 and the one used in aclocal.m4. - instserial=`grep '^# serial ' $ltdl_m4 | grep 'AC_LIB_LTDL' | sed -e 's/^# serial \([0-9][0-9]*\).*$/\1/; q'` - - if test -z "$instserial"; then - echo "$progname: warning: no serial number on \`$ltdl_m4'" 1>&2 - else - # If the local macro has no serial number, we assume it's ancient. - localserial=`grep '^# serial ' aclocal.m4 | grep 'AC_LIB_LTDL' | sed -e 's/^# serial \([0-9][0-9]*\).*$/\1/; q'` - - test -z "$localserial" && localserial=0 - - if test "$localserial" -lt "$instserial"; then - echo "You should $updatemsg." - elif test "$localserial" -gt "$instserial"; then - echo "$progname: \`$ltld_m4' is serial $instserial, less than $localserial in \`aclocal.m4'" 1>&2 - if test -z "$force"; then - echo "Use \`--force' to replace newer libtool files with this version." 1>&2 - exit 1 - fi - echo "To remain compatible, you should $updatemsg." - fi - fi - else - echo "You should $updatemsg." - fi - fi -fi - - -if test "x$ltdl" = xyes; then - test -d libltdl || $mkdir libltdl - ltdlfiles=`cd $pkgdatadir && ls libltdl/*` -else - ltdlfiles= -fi - -for file in $ltdlfiles; do - if test -f "$file" && test -z "$force"; then - test -z "$automake" && echo "$progname: \`$file' exists: use \`--force' to overwrite" 1>&2 - continue - fi - - $rm $file - if test -n "$ln_s" && $ln_s $pkgdatadir/$file $file; then : - elif $cp $pkgdatadir/$file $file; then : - else - echo "$progname: cannot copy \`$pkgdatadir/$file' to \`$file'" 1>&2 - status=1 - fi -done - -if test "x$ltdl_tar" = x"yes"; then - if test "x$dry_run" = x"yes"; then - echo "tar -cf - libltdl | gzip --best > libltdl.tar.gz" - elif test -f libltdl.tar.gz && test -z "$force"; then - test -z "$automake" && echo "$progname: \`libltdl.tar.gz' exists: use \`--force' to overwrite" 1>&2 - else - test -d libltdl && ${rm}r libltdl - $mkdir libltdl - ltdlfiles=`cd $pkgdatadir && ls libltdl/*` - for file in $ltdlfiles; do - if $cp $pkgdatadir/$file $file; then : - else - echo "$progname: cannot copy \`$pkgdatadir/$file' to \`$file'" 1>&2 - status=1 - break - fi - done - for file in $files; do - if $cp $pkgdatadir/$file libltdl/$file; then : - else - echo "$progname: cannot copy \`$pkgdatadir/$file' to \`libltdl/$file'" 1>&2 - status=1 - break - fi - done - tar -cf - libltdl | gzip --best > libltdl.tar.gz - ${rm}r libltdl - fi -fi - -# Change to the auxiliary directory. -if test "$auxdir" != .; then - test -z "$automake" && echo "Putting files in AC_CONFIG_AUX_DIR, \`$auxdir'." - cd $auxdir || exit 1 -fi - -for file in $files; do - if test -f "$file" && test -z "$force"; then - test -z "$automake" && echo "$progname: \`$file' exists: use \`--force' to overwrite" 1>&2 - continue - fi - - $rm $file - if test -n "$ln_s" && $ln_s $pkgdatadir/$file $file; then : - elif $cp $pkgdatadir/$file $file; then : - else - echo "$progname: cannot copy \`$pkgdatadir/$file' to \`$file'" 1>&2 - status=1 - fi -done - -exit $status - -# Local Variables: -# mode:shell-script -# sh-indentation:2 -# End: diff --git a/bin/lnkcnv b/bin/lnkcnv deleted file mode 100644 index 77a3d84b..00000000 --- a/bin/lnkcnv +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh -# Copyright (C) 2002, Earnie Boyd -# mailto:earnie@users.sf.net -# This file is part of Minimal SYStem. -# http://www.mingw.org/msys.shtml -# File: lnkcnv - .lnk symlink file to actual file converter. - -Param1=$1 -LinkName=`echo $Param1 | sed -e 's/\.lnk$//'` -FileName=`cat $Param1 | tr '[:cntrl:]' ' ' | \ - sed -e 's/ / /g' \ - -e 's/ / /g' \ - -e 's/ / /g' \ - -e 's/ / /g' \ - -e 's/ / /g' | \ - cut -f 4 -d ' '` - -ln -s $FileName $LinkName -rm -f $Param1 diff --git a/bin/m4.exe b/bin/m4.exe deleted file mode 100644 index 988199f23f6489e515ee9861ee436e1f94c63ab1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcwPel00001 literal 118148 zcwX$idwdkt**HF%Y+wlsyFgIT0E-eKLXapZNr-L|Hh>aX5)!fH$C4QM9G4+KEdwY8qBZneX$Qb7ppSGk|?*zqqkm5B{C`bw4IK6QK@Ic1n-QD0Y8y2inyza)78ox`)bg4ar}^!Vx# zV9Z~wz}E@9Lrv9jP!A%_GXX$U)bK!78DFu|qX!|>EESe5^Y|F7366^8HB=gq-6z!X z^$5X*5SD?js7hN^>Z_@!SzfO}sOM|z0F|dqpoo`2LC3NRUp?<&c@e@qgs?)W@bGw3 zUr`0j)*uLVbv{phy`#Ri+T+j=Ab*z%6;*si4I#pfB_ZRoiq&cAdldxaE%P`^9ZRYw zFCOclnNXCaRaFrfT#&zvOLY4@&?uDwK7hZ>Q_2fIDx|boluu<m!cuPUvr7NMb4w60r)yq>|$FD&k#Rx>G(Sgxe?kM+Ed3cXnGXf2Z)DzyW0ZO1q zL_*|mxu*uz(&JciDW*E+%ynFXMsvwn2gwcG`91o8#Mu?q6<`NYG2T~OMHn*!;qt!H z@(N}yx<5^L$m$t$ia`~4PYvoLVZ}@=3KjL%SKRK&b{EdlRioa+JL=a|FRiTtldHW= zs6&nbk4u+Uc^sG@0nA1KKp)g|d0G|HmOZDqAlFq00Lr|jHOoQlKE7gEMOg(9#xgoc zMnhkanD48--BSZ8`Bv0m+kpn)s41;RIaC?uAl{-zs9x&vL7qC5WDu!P z1%9G-nWL^0@K6Uy{9lEdhuUX7hWin0n4^T|@bTVK=01^h0L6R3%9hryq%5j8u!Y1~ z%N(f3s37Qem(g30_mZ@+6VQa9t@f2Ogz(zuDJ_SvzyWcJ8i`iHbrC$rvFCEQY`XM0 zaK-7KYvKC-A}6Q*K{ti_@}fw3K3t#ao@c`KN8R%*xDM#bd*IrxOP>wbv$}LQTuLi>*4#Q?0G7CzD1XRI$VXi=VG{K z>z;Y8_aCt(PHn$9_QOII4#OO7RjscayybE*B2L%3a9Rt-(KvzAdsL1D5nN0hz(utX zoG#emSi{VzjS#1I@?3OK!|9z6S6;!$t>=jI;WY1d4i}x9IX%;rpE+Y@=B&)wnR7DT z^9nPIGUsO&XO?GXda5#OGwbG_k|Jr5RrWhf zoD{!x_WT@9KK3%l$zRXqxOP_$3NBsgcnv~){~6x4;m;spWy~wd$xiOAQBJOF#Q$9? zACgBpx%qIF!^OkZ4A;veBl!-FjL!cBKEq`mMc?6-tjquJUP(~C_#84R*QK?@hc< zuBDy$P{2C_!@dh<35Kr-KLGf&O57!WiaJI+nt}t)$@AN${?t5TDxBi4ZXpV@s&6 zJ;BTngvz7nor9DmtMJy(XirFHl8P;b^1e2Z+dltZhyRRX3pjcd#h*Qu^zugoRBsbx^fu!^8?Zb7 z&Il@RPJR*ZvayZeY|Xm}^e|JG$3b1>$4JgFQyYu-b9@;fFC9_u2gCd7n9SxRczL5i zW_<6A$^7_Gcsagz=Diod`ysKJq4x5bWR@8#(g6>xsPEz#`Lzw;@htxX|J?8r{B!1a z9Jd7p9%$nSL2kGF&`Qcx3&>0EYv#CsVr%|}Bl;%goBiQpe&+hV{_u3ZU#Qj}=K0wn zFQBi?R#sZ%j}!e=rl2Xxm+gQ`zjiU> zhjeYAo3{eg68W=>3FYFMK({TBq@a$NRUHA6D&yp}BuBWC(?}>KZyZ~m2er&{S%ga< z+53l!H8RZdJ!=8oSHGf_ehTUW*=)f_(6$giDJhx#;=VUOhGMUwKk0dz`~FE`Xe_AE zb<}>`@{r%68$vE05k^7<2@qwnU;geQW*9kdP^Jw>wP2}*a{OBIR=x$uA#a0jlQzyGdJX zkz5ui)sK|I_XqaS_j(E5e$lxkIG>aXzI+)vh2R@w@dqL*3`_V(Xa%8DO??$aJ*@k} zewQtSK&pNviKptzs>`{00mo(`reXn6y|-c+##SW$suSwH0FSGyts_6BJju>gm)_># zJ=Jv(m#p%Y;t!50aS#SUUG?se+IEj|9|3L3>XpN)&3)1Ie_hq%!9E%CL#fveB zT)Y@=upHc6kmBS9z-5IC|IE63^>6XwB@^COG-Yu_s9dx*T%f*0S z?2B&oss-}f!&LuPX<8r$o~=bT&t946?5%Uo?XmMZqFrC1XTAH$fKZa z=!#bAJ+6{x{^-JclKfdfawZVB{rDIs=U;2#_?y)VnWgwpyp(4KRnC^`Ed;z<{_0sI z9!swuW)cQsbG0g2HvbEJ#$J2-jA5)HDv>=y!60TN6FgRgEIb+X$hX|O_`n{6;2HiF z&`>#ylZtC8J0S0aW>Rh&IZ1iea)$@NdrCf_$tb@ zvOf+p{hO42djMAlLpuo$$6_vMDRoB$kt?v*W8YNUl)&Cq=uv@ z^;n@mERHOcime&NJ+|OjjCH6R@Hh0B8m|&N+a4QXBI91 zhgc#NB+XOmt#ZW$B*9c~^*0RT_$(>A37m@<))ik+B-iSS4};RcHH>V3kJt8!T}R z6a3i@;sF9rfqdkVr+^{#W^eOly2kdkS0J$5XhOMJ;u|kxC4>=j=MOaZUVU!q6=IU< zZ4h4uFg%86L)_)hFxdjrDU3MbTHuZ3vb&WPX1VNXFvC4)Tx(S`tWTC3exPQUr<$P` zom}WP+TQ0|Bs-YyDHHgrQ*r#Vj)RbC8|DD;rp9MrRT{|_cTC*SX;5TiI*Ng?{%%{QcXvv@e{KW%EXNHYi*sphx?#~S-eeRVJ7)q~Wq zJPGQ7`7IKJlxal2Lznqa$MaR|hWk$^tcUb?Ot)hC0Gi&%zvo~6b}MMtnI*50Iu zN1=-qpKHy^rQ9tllt=X^$RGmjb^?Qk0E3H4Frxbe93$j5-5lXD3**YkD6Au;9%oSd z!9Vz4BA22~%&_*Um;YjOKsboKtQLYo^j_-35SdCD%}qvYId+4+mYHZtpuwp%XTO>T$Y@!t`nqX zLzjKR7JO2*2C4W2Z6&bJAZ?}HRXZ@e(BB9x#B6^f#12)`qE3inq#}FjZt;*mY;G8c zh0R6sZ~H}>3bQ}YYL;A`=|>3n<0ZF6EbfwAVR7=EiYpwtOs?-z6sh0@nvJ;y5PJDE zosuQco|xhSimVw0Cv2N;25Gk}7}veqEL;tWku}32^l3U6w{gKZX~r;dcl-kD$wQ-e ziwmsMTyyF{X|Y{Anz}z@cVoP`*b4c@85ZxPGQeO~gs>uX$!`xN)cPC3obB!$w5XvE zK_?_|gooGKK?gHGMTKN*K0s_S- zGn9Z?nT#;L>94^s4DL=RM9N(s9o)SPMWI~iDmp#_tOA(wmDSMmcF3=GGX0pOV_qTj zcH}P-b?v+FEHQc>U5Hj&2Oh7k0t61RJ@guJiHGBol=@3FU#G?fBrs^O>LorBC4NPx zL1b_ctf@nxt}sgErcQ&n;Gt)AB1bEhe>s)N-TTg!PU1})?Gf206938MzXs|`I$!}s zSRrry26%$m&lXR3KL>#F2mNq#gdrdGEDlw2^MF1eI8>nemwc-e;{@VZO(pVtb0ko( zK;p(>O1_nJIKKvHG!{Iq2>Z#aKftT42=eTGyu#A*iq&XkI3j?PxH#?SBlGyvXgnK}>triH7v`%j>WmQfWlh0MJL`=+&SF71pF6pHdxzT zpCkH{M?;oYxJR&a(~q3|Ufk7kC-P=vUvWRQKp}s_=NxaIyRUB=L?}(yr3n*awfQbn zM4S6T;yx}7)LAKz6<4R!(5Yu~YJt2uP3(?^FufOqNfg4GKgIwcp`kA7E-I1x>I##f zP%7>$#K3zuI8oEBR<#w28Xtg0N3cuS4QRMhQ|uei1w9usQ0y7dQ|g$20wDGu)AXzf z8EALXQ#$SbmK4H>I^PTm6iRrV^uI43?M{)CLk3Fp>XWJx^&|dERV0y! zJM4TDO?Z2>#1nTidB?Y=ci#Y_KBVifk8e4qT40pH($0{A|rcVpl8D+7){_Joe(-~339KVgpH z_@(kQ9R?hCJz?Ze7{6!!_xU~g%vt#TY5ckPEnpv$^(3TG{xhbAt2DO1fsNx1*?{dg zJ`QYun2Y$EGf~_ZWdrVyd0gYZ;DG|deC$1fvm6!6@+;$GSUy_5MmAvik*%?wlFX?9 zzuoe{dw@8j`dXx7HtulBq*Jj!VO!Z8yYU!dGbDL?CQEA)d|q^3@I z;HwFoK74~0G4Z)T_&F6ss^jNhke_#a3AC7zQ9?BLGU z(HNwwPE1GRAa%{8lYsMI=V46y54|8g#~?N7AQ^QxHtC8EjqYx^peSQuY}*@cqY;1f z73x&l=LR;q|JT64w{`v~nvXyH&A?Re|Fw>f_n@h6I*X|eikRvE+P?pX?6o>KJ?b{I3Q~S^r4HNmrqhzU6FAI`}Ux)=A&@R|6-V z_DHOg7W%3qSIk%M?&;;LBfdqQ604&2NX;IsI^oCIwDn{}|MJdb(=Yd^x*QrtmvijN zc4Gg=T~Z|P`2wSEhm;3#X`ULF7Rk?bN8tB^#C_1M%fmLPC2w4M_tR!!id1jOsJ99U z*0_y%&}5~Ojl=LGabf@*rNN- zs3)-sf?Wu?^SFV6NDqO6;0B}^1=(}lKtXPONM|((q>xFlM^@i-U?kg0`8*@qKQ~Ps z&tHfs(Zj|~Q`3a2@pU45jqwvE*me$M-ri1AoS_NKzPI6oa%g1wF_yu`idxll+8(4h z2(e(o6Xk#Y86?;Xx!XG?S692HUqPq*O0nC2dOUye`hJ09yft(wj)$C11xxc{?_cxH?|4;e9?+yLm554^#(Q7u;5Z^FKW7#{% zvWxy?z_M3<0WAA1By0V19mC|$3>fDBg^pqMsM`AOvoXi!DP&B-Mtq6|Gm-vQ?~E(x zP|*ciSYrAp^<-!;U>_rUPvf~a*uekS5WSke5&-0rFJ|3a{oD%Uepj%*D`u?)xNGFjJL-rCKEjDn|~ z;Lku@Q-cDp{s?#ZEqyk+&NR0PSH(8MV<|nsMiaKfwg4_LC2et9#~zN_e@n5FS$t-F z!Nx;pc5f_JAZw=Uj4k*S$L7akL4NRcq+Rb1iBNu{9a{DlmvY9XK-qQghN{mLAfOid zyf_xby=MUdrD&0ccSD!Q7FzhVzA8c@ge*|)IK+Gb&@G-p4h8;nMp4v~{aMLNpkz!K zf-#6fVvx0#jJ4;CLF(;dCyPPqSqvhERZ+#p=9(LhnBxOzjz2qU;D#sO59YYqz#KhC z4O}pHzs?+UX{k6izK)JgboGQ1aecF^hiX^2GEFMznI|v*j`=A|QV%yo*O-Oy?Th&FU#tw5XIuU6PbEFb$OW)8G>aX{VU(}PesH~@#MFv6-#_V;*<+!L2pOgW0K@XZIU?YqSQUH!^KCx(ulJK#w$2yog~dOOD=1C z9F88lF-F5!>BeXK1k;v-r{YX%EK6J%S#^e$0y` z5ftWM5|@cME@e0xtsReJo){)h(gX3+41|##E6LO>Ye-3d73W)hp5;PSsSkJ0;nvZL z+8Ww-AmQmbwWGDwMS|JtQohWKTL^oDqO*8Z7iLGrY7r;#6*`HU4-A|{zgFzN8#oE) z2L?{!*gZNYu^H8iT3wx)F4k#x9j7ts=k%wO{-6WE_9*B&F1p@v#{?`n3Pex8{Trvw z??LOi=MSh&T?>l5<#TlC7XtbYoQ#ZFlad3O!@=T1V)6b$cO~ZrC-jb6zK?-);GzKG zxLiVj+WpEIs9q^N6nP)lLqBsjKyRbID&7`={s_0TS6rqv3~YDpMRgX#5StBZg(r?Y zv3L$cweH@5`QEb!=Dk|^!+&SSLdTOQY2(S8{=u>FaQpiXrr$1&BREzAD% z>CK|!MPhrb(qO%1;V%)rDVL?gRBxn${qww^yLISC6Z8(rbsU?Nmr>zyoq8@5=y(#X z!+jWi!G3qNPJFeAP))Y(PZID8jI42v=wjBv+f8blduC?X}v?kqX|KS0Xq6fV?^? zO_f|9K#`28y(bXC*|srm26#!Vl|DwZZ{u)j14`eky&N25CBAvI&YP#u0YsWE2W&4Smu65e( zZ%e`Xcei)TG$bOa5Jwxy*0CaR1o^m7>^B&NcI#AWAXBCE7{pDGQF4N|j-krbQTwmR zx@P$tdC< zVbpw?egyYR$pXMEiC*$J7$Am*vHhUI8D=+lk(q8_t(0q54xME^uyl?8w5egD)->YG zg**%ij$H`%(p><)p03wD9X0&baZu^K6t4L$t!)&t0f&HfB8%9`Kk}ms0o)k2z5&<& zvh}=9T>sqW2FBtd(%TnC2CnsE`MNRb6qOJ`UUJZY(We7|=qCS}D3Y%}XwaM=4n#;E zhcumurb$2Ei_h}RTO!mM(sr4~*XNM0Z3p!9k#+TypV1@bzc^q(++-bbOL3IkN@f-0 zb%UXL^Vq<3%xJW{c(AI`SIBt>j7O~B$pdLLf}hk@l^tk~REz4o1;>R<#89pB@844t zR^Ox|{nXkxwF<@Zhx-jAu>#jBV zKl%yqw@`nY+6}mRu^&QKvIIL?i;CI}xcc>-5v~enQJUN9BO5cP$kukMHofLw+}^Fw z%*fOKqSKsv0DNdfE3utkfD7fBIY#!vd?}f)xslA*knw4-rJd3goSfNP?N1u)L#(v#7{cN1R4OqC>faa6y zX&Vql^OZ(4zq?-72FUMQiA5Xhzr5>DT=Ys={kW#>_X(zX1`7cGLvvks9F24a!h9C*yR(?8ti0N=`CAf-Ugg6>135uia_J z)R03yxf`NGk{%s`+|x)h=VhE;w>@_5C7O;Q*oTD9J*8wjxSY_fDjCIk{L^&`a-qM$ z!r3;riM#xNF^SikwfzRm&q9yVpwaWJAw4=Bx?I(aT6x%R108w^V1Y+;lkYP9@(G!*dJv zh+J0GN!+x9yhxH0k8zyZzkr5FuXyJf|BlG9*aB*s(3Hsu{kQi8ws(vGIku)BYl$;I zLptP_*f!uEMd*<41w&x=_jtLJd+tYG^VzS+es6+njV}Fu-8~;uwi&K+-E&1u`Y+%j z`u?^lw8;N<95@RaufJ^$75Lw_gl4MG_E5I}ZAWOT`s@s)HND*w8b_a--ZzCtG`$}O zy%X|$$JN5&8A8v7U)7}l+f@jf1H$$ z;aLd{&q}P)91PDIBkNuo$+psbkZ4a`<4;-~SN@rL;K> zklP(6?gy+GT(bRCe6lnY1G=nSD?cbJ*Fx5Wy5)zd{}o4&T*uhbT$=M{3*YF+CG*f_ z0JHO1xBTHz=1tcvBsrQ$jwuL4eo@Wzf|ltT$<>_U+ACZkxtf+`xY~rvNN`E_ zab>x!e_$-6VQ2Q2>z3RDvet zZ;RJPGUH3+fst~yz#%#?RT=Lc2erV`d;UmUn|y10$BSgJXdAJr>dE9RlT6eU{k+LbuzREAGiEige*x->2CBlatb_i4VpA%KL&B8@R_mAb7IY znpY0UT5GSjh-=}0YbeoAmH_TL9BHsq>K$lBDfQeqZUR)KDy1mJhjsa1?C*7qBV1Zs z=kqwmrKXbYzGt0A`!V}}W8kF%+pl$8cinX{Yy0d{1B8TK-g}|)@`=-Au#IZ6gTDX= z=jf3(zr^Hs^~rXYjH_I|k6`lu&}8!VQ9M!WF?{==T4(?iisLcvgU*WgH<-3AQbMqJ zeHHMkg1tIpvfT~cXJ%ChY5-NxpAD|9j4^AM)WdBpXF zl}X-qM6~S`DHIwd|MgY2sZn2~0gKq7NFLC+=|+Xj<#;cw#4#6IvMHM^c5E1o3BxhL z0}1kpp2)20I8d`xvYnhrktv!QyXc1;GJl{5W?t&#yz-xs5Qz5CqU2-mM#dSU&M$iX zFyX8Q;~DboP>o}_+WuMif!GMr!;o-UOe995=OhUi>cRXjtSF&t3BQ}Ba_Vr^FYql6 zu6YM6LvwrOFl+0C#PqgMk~$s;7-}IW>C;F0v|+Ceoega+PcwJKlogjQF=f3dlIcTz zCObczWFjg%Dw64iLs50n%;B@}In80GKDoC!{5ou84x(Dfz#OV0CBPhRL+!d5Udews zg>89c%v@SDj46#R_&75QLhyuh6FlJD1b=&(qizwnaJfJOHC*iQ*@=olX-;5oBoqc{RX|A>{DpV?yG#;lQ7cTN8j)I|pr{K>2KDwG6d0U4Ag2e`3kjLy>!Y{7eS&>EG9(AGw`P5*NxP>Ng!P)LZ zw5a-q=1K7XFsAXNzyVwHdw4SG4`XciycN&UOifcWZGl(e$w|Zzvc6^ktf7S0$oyL$ zbO|gU$KL{Wz#!X+KwChdPn-Gv{@sT{BdGs)Iu88(?%!zZi=Q^}WBj`hWE^Z5A?~;R zu8--E*oW5WMy5thAZ_94ZNpGoCIKPAyg!2;(0cg8i)U;iG1Xm z49{cOeK}mW!PVt+a-aI>yD!=An3!@u=K282Oo!|K|3%sVFoDnxJYx* z(F*@=Lk;b?%S6{>GUd2jxPU6qHvCXbhu5U8Z`g+8RvkA+o)hqSX5<-FtYfP7%;04U zeHc8_bsyF{UB!p$+JT!;7(5$3%Uo3c7JJjFY$1u2K+W#h$5Hy5PF*Y5S;9a}_$>nI zhj&{!JkPXuc`K>ER(_f=fF%roccHp%{qd(lU5`B!pKjSU7=PxA-HiUrv_feAp{#8~ z@Mp4?zD`RYgb5dKOTwQdv3uJEc+-E|h4^C@yVKj)q%J$(2IEoPx*YYOfN|9o@B$Zn zRV?@Nj=EAjq1@}Kuc%KY%XW;5k)-JJ6VC>JX(>B1JoVhG(9TxgLyw!&ftX&gvZCDM zSh~h>yT?}>MN&a+xlmPWm}C^6(+wQzDbJWyz;6dc&L^>}OP9qd$n*9DY{l@846b#M zwmV$pmfudGBXEwuF~O#}#f0ssJVt=$k@);~@;nEh2jcTb zJ(S#E<_6>|i*(CSTSdB^@6naACY`sf~{Lw!( z;jAM93zxX%uM*VmM4kWi0KTvP^gzB}$R-u^{9$Zp9R6Gv8r>>i^9<9!)jD<^@c_F# zd+B-6CGx6&YWy0&2NBRl;6YLp57ha&C{7sk|Dpc+npX=|k%~vH`-;?kTY^^i?`YjS z9^};Z0;K+3TK(VA>VIdX)EmSfB=DE40xm#&6v_tgz+V=+TI`nk+J5Ki5&MQ_sq6oG z0!R2YQeW}#FHZgd@6+j<8uiVEpkndAVLV%-^CD@t^ z$W0$x^K^yikt2$S7eaf2?Qv)zX@<#uy%>HH{y1=19GM0PU%(IahlkmkU*=c~NwDwx zo-u@9LYa}OTB@)#xTq&Ig*ehjwOpChpT=vsrlq&}ujPb3WEzg{W)b_4LbuUE{_r6F zb=+}E2n=QF>jAGXhrGCVMxF-Q0l~-q@P+&k0tYG=M=D3;hbxMX>eoRzqFmAnPNk>} z>At#^(D3)~RKjOc!msDfPxy=9=?Oo(1+zZ(x#=JfmuO_nqGa5l<;o^xK z|AKSlPpA0PRs2K$)A&E?JSYCqtp1%0|B!zNe-bgZMPO=!g;WBkLdB*k|0NXZyJ*sF zLej}0p@H-bMxO8{F1<}%pQnds6DAXQ!(-v4MZp_|#~I(x8aNH~v@l6jLF?M{h~Iqv zlnS^8+lvg%Uq1DX$}cx{4|i!fr{nsxL|~e!FPYzmyVSm%OW?q4 zQC#fPYUrjQ1;yT#%jaTEcy|7#}bc>eKoS(vtVM2k0r`HDYmT9r=Za>v&y0f|&Dm(%r;!2Ok{ z2=|BMKK{WcFQ!5%kr$s*g~Eb0u{-wsWG?a|CpT}pE1%;gag%Q3CavZsO{DSf9Vb2o zY``*{Y2`;M1y;YyZYFEBdvIZTpb9t>x`CaSK%Sm#a&lC@c(lJ_#}#6h*p**5y-L^) zH6`;Mi8wQOYNH)D2n7*{ZD&S~NbdYfitu~sVZ3e1N)fUovX>}oEw_~cYp{@suYS@D z>pm_;nPF8ZdCxKVylC1NzzH~RU!VeiUgBPW+e*CMiBwBFFndd1^KmlRWM9>Y(_eRJ z@%pekAzo)!itgU%N@Bkj-MeJCC_Ymt1?2aFDKzpWQ|KZ}l_@lc(q#f=C;WVoYd*pc zp_T9x+Dx{<0{Gb%SdK(DAK9eD02dNf5lNz@NmMHX3BH*xBo=aqU zIg=@<85Jw8?ije8a8x9vLW9)(;N%hS7-Q$C!qSc5@fne9;x6f7ybqdxMR{x6d0}vV z?jdnAzMUbmcYSf3&@B9+J+Lr_$ceVV0|3VX-oqVQvM3ctuM26q0Qte;)R8im8X4gtB zm=k;(ejkGmY|HduEYgPw(uZS_irt3z#J8Jv5SM6c&gzTHOims$$0KNh?GjIxg%(>U>jF`yZtguQMX! zThrTiZYEgJXRQ_zb|OLB?Y${AU&+Y)I<%Mo9-#v)*rj{|SbUiRj?>lq-$oGO!wAZU z=QIE}3XC_!)PN3KFsRShv~!l_0vEfG<#U} z(pmK(@ki(btKoF>+10*dteH6tL;c?Ol3u?*{@TBTG@T8Jv<=090_~27{FbI zZiys0q0iEoK!&>A{u7qZlE=s^UScDrF^g@c_dgRXZW1?7f)`LFF*q4+LVd*UeH=Hl zY3d}woN;v3_u?na1Ne6!Hcqg%kkDr%d8<0MsS0VJCkcI;ZZ~nfO?m}snj^k44PgS= z_=~)hb|AWqeS<|N@pK-m*ZO{{^4O#Rrtfo_CIZQO;#%UG+xXEG%Pfj!_27;1xp^eP zqL4RhzTOwlNv}*LJjNKHoiGN``F9Y+4fc}{Pty`e&w@}yHUmqf;xYcSyO&@OQds@g zo3Gy&H|hH4$1{fTanGl1jJv)ifV#dhj)|XNARZl0>O#S%9%i17ALOLLn)om(LTI4a z-CI3UiJ$QAz$$T#R*BrC5(^PGWAxJT7n6bhXy$O&3qMYOc!lUsoucWFKRgZ8XPQoZ zE`NcpKz4{9MXOKZnP5Sa7{oe~4}>wDIkf6~O=A!~YK*Swpt6)6CafWt#eL9~D+nBj zXu&}0FMfwT91>ruj#cbDc~p93p~kI@eT{uY!Z8YVJmFi&8C(tigun*bt-H7-4poL? z3)VqdlGF(e+!wtx(7Z2xBGs;;vsMo#{L}O;e%6}rLDj?{Dw!(inV~sk>7TN+eKC-5nav#ve(dlOz$)sRzZ)ZjDQRB6lJ@HLUgT zn6AE>uDx2KzS6n{v8(9)J1_v@8Z8;*26#t)DWQ?P;(I4Q43@xa)HK~@XtjzqX$Mjl zG+#r{Q<6xKZ8{WB=!++Tc03`>v_HL@5yo4nny2n#eJ0_WV51UH)=g?P*pIp8Y1-9f zr{eUJa-gf}P;#tu*Jy?`8J9)JEX=H6<=BqkL6Q@KCCt7NVL^FH`rOr57$BWsgme-` z%7l3x$GeQ^{r0J-qIPMXm6mAfyD<(RC`5%N@-Hq2dP5>YoxA!<9B(nG|5N88^hYP^hF6&*f#HjCg0js@9_c^&D`4apt8awDm7$f&@CG#Fd^3Biab}c+{ z1IKlw#?$$C?*&lMdlCLK`93nu=av^fg8~bCEAJy4!VBda;DtmEO?|WGKJ_Ds>22RX z$(x6_Sxw~71mQx7oM`%H-F^DcDDs8M6g&@AnSw{NdVL5I&;ALM6Yax@j~>S=zenCU z{B(gkJswqljb(!(m5H*S5ay7kJcNjDk3xj_tMK)@Uij+>{znmiqguz+3@|~3;N&?G z{D4g%z~qbwnSei@;#UtIEe>Z5#qYt|g1?KbulN+#vKNGbqZ@O*L6)fG6xTctQL zQ9LZ}4jd7>XrAJ*XloW5LEskk+jn6Tj_T4aq{yEJiMn|2zfU(!wrUo~$%#*^ z^^>msF~l5Di5V14%vVoE5p%Wt@l%=@fWKQQt)Wr!JVwd~dQwiz1X9*R3F%_sSK#m& zMTuhfIruCUbcqGwtN}z^n--9@=Uqe*mS3Y$;I;qE$;tUDja@`hYoF4MKKK4}t*-Nw z;itdphw7JkJmu7$iN%r+MjDhdDqrR;#czgte2yh4Wn*K3#2h?5tEwuEe%cc7>GQdL z9(XDEJPuEk?>HMJQ`AVcg?_Jo$am@k$1<*yDmKNK}f(kBhRFujI-magM73L=S=hKO1YWqhi5v?kK^zKly*og=_gM0)*oe_fI9Fth^ zx&PDv{0Jt^H&e|AZ~3o)gZv1Y-$-TgvP!}bMgq?FDbx9-!L_EW2Dx!0A*OSlyyr0h z(jXICdviK58nTG0aS~~mOhqKuqOAl9&U49w7>el+Fci<{u^_C|baWq1&Yj3`ecm{l zVCb4Bmp+E?J|~}x>2k|APgkul&<#ki^);19E=UPK7D4jdh8QF_s7Sg@o%=LihWe_^ z$a*Z684h{*h8Sk_$%~Rl!|_434V9ocQo(U$OmN&oV4QG?4^c<(GW-28S3lkTKOb^( z>V7(?7h&N3VGtPgP$ejmKTM-F?Y7+=BJX+#2P!#vTngm-0AtjZoXWr(UstC?hd?dj z-N0zKd=IpWvQ`0%_$(#oXN>(;VunN&#jX{1X-JLlm(4f9GH^oZ&c z#aujqCuAe%b-4@WJ`dB@BLNHGA6?UL;-~tvaUTT7Um@T39;uDwvbwz=Jgn`IxaZfT zeWy_#p6cWVIJAPzwC+Y^v@^y2LaNIsGY{W>wwT4#Q8HFRtf(5ZjH`oek>GCUxR3ldJD!=J%*B#ZNs#7S0hcXuw3F$50~^jTB) ziJhT-jDB*!VDr!QHHkW{m;ZUM(|U=fKsZSY{IqIGLXX&JArPgZM3DBa_#@qD2|3XJ zXI+n*C9lWLlGnrkbhG5VLizp&QO8yFi)^&kc(JW*9@*}N4Bi~=Ey%%?=q=v;CG{4adT;R){2X+lM4v?* z>d<)r)&1iabUfws%Q_QiS1G03XnbTADNxUsmfhx9TFaMtu?JFDTep}(imW+LDk6p{ z4U?SsarlAw$w{()yyG=p``}dDhihcte&{Y@5v9(q)LFfM*s8S=xBVizjkuJ2Fu=jq zU$H_Kxg4@lEs}DrThSj%x%RD_$ZyitcgXLst?14%5;(?R6>*ZGvCJOiRgKi@ySD1A zesCtFJnFzFLWBHtr@osgI+PhuqA zuP5>CYk<02!K2C__W+4FQ)1iMCu28n??^Mz@xIpy%R1x-&nQY$qlvRM?=V}G66uVXW>((03-yi8m z-zg7A`guyfcqU`FFjoHZUt|nlNTREfOR1XC`h2XodOC6;d#n7jFfMz9P?UZD#?A(t zipbf@sv}G$kz$V^seC<3R=c_CktEfAl@uNQ(El%MuB1o_^<7-cFXm^veJJmFi{D*)U^7l|#v0co@ zG2Q6ncn9DJFy?y%^S#aTE$p3d3CTw|@+f9~lx2OWch*N4$j30>YL>66cRm~fRs$O5 ziClB@$yN>$p+&~iUq}9K!K#ZNq6Z#{N3aZMN3e`+-H!U!(Z{5Yhf;sMjH*`bqRR*9 zATQSLa63=u344ssS~zwS7V z00b{3(0{u*jvpoa8L;_!U?UOO3-^*>yPYFZH-wJ`7BR;R&8wJWk-NYQ>Hfzj`l|e< z{2v~tKFjap_Uoaj8n&Hr8Aok_0!YK*bQk>Mf(Bdj(^Nl$xhA*lR##5jn#aVE_Eu%& zoxS{ZeJBV0HSSTnF|>UBfE_PG>Stqv&2Gt&)4%OZXzDmyMX6;j~$&|N5 zOh)@4g8bD{LV@JKr~}?5tw! zeEA-Yoi9Qn8{r#fiWmC%PcOCwa5rr%-Ooip3jI~Oaei3i_rYHJ70qvLe;D$6&^>46 z_ucpC^-Hx^2XDad?NFrp)1IYL)6MBtWHvYho*OY@?ANN>Og(01mOk z&jPZ*lL~pwpoH z<46Yj$%zedS~x|TYI)*6Bf2XLmsc_T%b#I`ZWm0XZO71s5yo{h#(k|Z?r|OCHbu4% zz8l4|^%0h_aIG$MEn`8$*k7>x2??JErUwKNU*^-l@;Rr?+AYmLS)rJ%>w zybcXy#1d+Gkt3kM@&b41`1Tii1XK~7>+QgA=(R@a4>q&NhBF!)eyd|cAhL__GXwqk zxBU4Q>8$)1xhaYtuhtpxqi_Q78tP$R|%W!2>9*NvE{^Ss@D)iit%?+lzUBT2LYtTg2PV5KKq! z(@84Q+E=x+wmw=vogtUz0dE$MhL))QujTCi50j3Du4emJRsUCOQAw%SwtoLW=zCu5-rC>?^XZu{4n- z4u7j=G?BFpf2@w7=~05<%Dc`NZR==yj1*A<=MB7#XV1@d9+TM(aIBtoK$+#;yPEVUyw~c!20sPUuH{fruYq>S~%gLH#U4 z#{ezfZi$;VPDoT-Cqh=@52vLH@k+r7Qpr}1RPyato!n-q)aUSP-bR1%neG4XG5Fq4 z2aaZ{=bPaP*!?cz)bGgHn%_ev%ov7_eh+d6LV>{Nc(dLPO~NN|CkOG&wD34v;4vf@ zrKOIy^}UUax4ois439yYJSBks`tOxA{j%S)_V}*LXgrIXtHo|ou?@6hk8h(D`3iow zZKJ>VOlVewF1cv9Mm3*IDCW`237JSKKUx0!DMBTGIgUOQcf~Bq1x6H>$ZuOH`esg@ zUtAzx7*Cs^dhl1*R2tOhND9=)14UYiVt`yNQi&Dk3(!M>rDhNvrc)bTQn6LcMQ<(U zT0*1bFDh8??Dsl|O$c#FGie}+wjb+c+TJmqoRCOo_;hxH8{F-Z+bR}+-tOuo?T<4_ z1Z;R3qg4x@tR-?&V3*lxEMNTtQ>(rv8h0$}ERqk?ov&K|AG`v}?KFNQ zPe$q+KIeoae?w=SFpzPg-PQFHnt3l)2n{+`5Iz7u==Xp8|7BL3T6b<%{Lh_wR`?ra za7P1`i0IFjqD|lSEl!6D{lzBYmo^tx> zy|mfW=3I;8)@9z(n&kkRSI3Ii;rt?=`$mrW!W;2WR>C;Y zyM)wj%i~yPrb!%tH{yQL^cX@67@()@AXpHgkMmNH7t3#|+a2g-1)|Od>`{ z@5DuiisTV2vEd<(AE_RhI24B^iyth+mCY-X_hGn^5vT?J>*@)qUTss zcZvJaqQ&-I-^7uVhVjVX$VtQZpXa1u1N9(eT__dYKW~BLdJw<4qxh2K&Ce0svg>cS zZowkW!>?rU@K2nOMx59Eg$vwLPO@?c{Zb|^4n(`Cc@+Icw}Jk-0qyj?&3F&f7| z)|37gU?4PH4BT_a((%^sNQ|NkK%o*p8!R|9Pwu9=OJ0=7GCT#Jz)dT<*mFz~7;DIe zQ8ljFpy#aM(uN}0eu8xzguh6Oj_SS%RE&GdaVwFKB;}HIn1j)M17$t)ib|whsBUQD zydtpn0Z>cwJ#6`@a)bKiI-q`kY{WLL*Y|fwJRvQz`@_((tS2o?!2G6@wXd7u?s~X} zv0r?q?MuB`{(i7=`;t!Dm+|t3F513~MiCX64cnL7;&5j?X;#`m!O;Jg8MG)(qtO31 za*?k#82>T*Wy=%Gd>&k)%zLWqYJH`?HFP!MvRa>`ykez?7@2=x!)1i!A^-1DxDaV>| zw9zcS2fdSB_Kd^6ujLWIC9w}^(@6Q3OPMl&)Z{PLv9*trM^aCk4>5D&Rm#o6F!q$VKUY*k5nzJ>l+X=`L>)r;HON_#LD zv?n~ux-9Jp&$GMGHGVwX!Dp8D0&U_h!bx$aSv)n~Z7~f+_~L4dl)l$mmkt{4SB#G%7Et!3y0xr{uCn&CS@|MRN5@+76P>7SAIg z5I7lo;R2kT8H4q9*-d%Yj;k>#8>xlJFO@u4(4X1@Wn@#H-D2DD4n#{(RvELoc(;>V zbkND&`<9a%4c7~Mom>uFhxa(SQn)%HeGOb&7_V^d-;JNA4UOIMJb5Kdx9uF|$1jq| zcalE3UCoO}kOJZ1wKO!llBx9;LW6on@cpvK2%r7GhVODie2?D#-@^C$X(N1-{%iQIH^kSr z=D&sSlT$|c+&=~1U=^R-55RQ1fP>-;?+gv^(o;tEadb5lXo{>iHbCD|3dzP4bfA-C z5CsSLfGpy|8tI1&I)8}5nBlH85uYLZSF4`Y)@%j{a@->7U7y_r-nC#A^R5r!de6_} zsj~q$v_P4HNadGT5eH%-#H5m@rDKOWzU{Ir1vut-_p`VTx;r?-B)X15?(4Bn`z0( zLu-u4`$W5@k(Bj+4;zVm(JJPej6^yIeN?{ZH(kpK&Hikpm$Ti2=lQ5o7^R}0 zMseR3jT>FMyV4;arw%=IIYEy5|Mb|CDB9?>UKsKyhJHpEE|D722RksmOf5S7}Mm!x3@r1FTXu2*@NTdcw z1|AxY;+Or3KNXA7RPR~P6Zxit8k1nW4;>p4Ed`G7(+DAA93fP?*^;_PyxH2GfT=We zYSr!@)$X2WcjACIpxS{0woTZ16yMwRr8#TB5=dNk6I3gBlL>bynBB@0H@uVQ4aJa4 z9DomMco|Hx1kD38cCWgmJ&wT6rO{n3jqY-3bhq1{v3up8#1U9%3l=wZZbb?uyEqi- zBg+xZro%L5lbn{+Lxf$Cb!e8<%X^1!*jL$Rb%NWxrH-6yh1-18mmqQrj%?qVpB z5Bju_c$!?WKKCAF0bDK=d_sOx-FB+~wgi3>z_w{9=u%b!GTRpHhogb}K(O&dh$LXn*k^10mct|C z=){x+odA9$X_~%WfhfC_tL5L3NiIhRPDkNSx6OX3tEimdZXR7ji@&H!a^C?shEvb-$}<> z>{(MN`(Huiu9xu`6KT=Q@gqbxZ>W zksC*#tzo46kNK33FT4wUoLbBHxWP`cD#8aP-gZa{^@A=*iT6FYT_ESyQaRwMb?=e5 zJiGur=J)Vg6t>|Y573y;h~89)Y<6wSaJ@l3(;~UvaC<)_a8A`A6CaHFju*1PE+4l? zoI^X&J>&%aLXz7e4rncf9Y!l|63x?i#clKiNqW!1;f8 z+cfnGzMuLXH*0!Z2f7vYeAuW(&0CJ6`tEnj?KT|ykVdo>vgNh5<`$wOJxaYrsW&f> zp8!Nso@JkT>J@(ag+4JHpJ#EpWq%Ekx=I%CzgnY-&!%I2PX1bTt?(2%{~;<{wm$fV zYNAit`rvp956`!tTTyYom$;fc3h{7?=m}tn%`K z2(dk$=+4RLS-cx81pcr}NXjz&8XM?>U>scO zy&kx#%Co$*%2AD{i}ST??09iiZS8GBoqjG3#}LTZ%h|LVezD6U?#YwL7HkNA>bOQ4H z;$#EF3O$k#mXd#--W@WFe?r0HX9B}?xqOoR``fg^w{^$y_!ePEdRsuT1sbqvINGri zf4T$RLVvdJxF-8xX8rxKcEOWNMZqi zDJHu9s&b5c&`N}pH;m{`9<}{E;t9}T(9G6)Q8-CbA2D7WiSUIt0M<4szTIgdF;P68 zMVV&~J%Kbo$EwVR*d>;r^V%PCFw|sAZj@wGaLAHL+TFqv1{cYx1Yr3Mpi*8LnLih7GOi;Jw z2Yn`}1b#SX0R{zRv>O#e_=or%&AaY{Xf1coEt+-X?3)(n%`Gf+<;~~P(#Xf_YU_9$ z&m_C8@vMsKr4`GCTA@BMc0NR(IV}ydm)CmgYsT`9(yFT3RgTigly{=he(oq_Wk0bz zl=gX62o*k0{do)O$_q6I z@-CD}?-7l-$Sw^uNfi*bo z-k|jbagQ`e>MNSW3;pe8|1R?l!Z(uZ0{|FGYYkej6bp_9jx>$}7^K7c`{8mp0bv(RUC@bPHy?|DECfh^7Qzyeg#<$qcV_^V#l=k|lVz2*SZS|qvC`i3Ew|-X zN~uK*9|hFh+o;rHO_f@D-E_IVv8EU_u>a>d=gjQPPC(4Hec%6kZ*-Vve{;@xKF-&3 z&YU@?0$Sic*?zrfzs}FLUnis@+pmk-ukYIS>w*wANAG9aZ)wopN!jL~agUhTHqQXv<8)fYIC0b=^aFZu%RjOo<_%a~qNHljGi{P_ zGr-dkQQmJa;7j3z5&lc}$g4-}(Cd;SObaqT=bLw%SY9G$^ESw~dxRMQUm85}!6W}> zBPZU?A6agIx`aCyrO5k7A2Ha@3QrXQCVoUdE^Kj{6sO>nBTR3&JOpwoVwl}Fthqxl z&zvRxEm)ay%F#_K*sa+4iz6iL{JSN`xkw^JL2UxZtx-pJa74>1xJUc|m00SX)K#{4 zQMkOCb#UTY>93QiN`-N+*lfqd=P_BFdpHN;kVJjwIbkWjK^Mycvknj+bAqgVG;dop zyY{zGB9-Iky4P^bR=RE5qR%7TQ>v`TAsE`LjQwFu^hr<29$nv0CPaR4SbYp)#Z&?Lg56wXS<&^)mVg`Jvxc8a!T(BZlN&?%!5R7axV^5ZhFlrf%3x6vv z1dEe3Ujt1rHIH%QGHZCM#V|Q=#n} z=Fo)bG)xAJa6)Z_AFhThx{Ho~X$Z_2EMD2Q=hXrItL3iC{FYs=$0R>WiT?`nPbPx4 zrA8BII5d@oG>1osN`r?ZNghB ziT>gO(NmXT?&j1^P(L{XPo!H8DH7t^E-(V*;?smO&Jfd4uo1LTig-Z(Sa%+&LwVKD z7sGR<8JwY%EB?rFW~ov&_oXguZH_;W{9m{)=& z7@`g*!^F##oP79^ba8`wL!;;6bob`kD$y&rWAB8iUUb~*lH1j+>~~-Q#Rtd?@#R&@ z7+1Ujz5g@sQSZM43=w|s3XHVRDtweQ$vG>K)CiLFFIJ&D6(9!`e1FxTY`$?#Hk;LK zly$=ay5cW2DyGD8^@o2`pLI#X7~;dUC}A2lR0-9!-~dlbZ}gnsCIMZo~pWf6c2H4eU-O1#!}fZ zs~T``dPCI)w@RM+`YJLEP=dvz*K4|i9+q_-WctF84zw-WAK!O<;$=-C$J{Jhb3W4OL_5}a;F zCtAV7k-W+N>a=H+IRY|c5SVoWn>umj%XV}O9XkhpVF&o5A02|elg>Mw^y4FgJ<$Ki z){hQhV-`cc0!Wqyv2Fe6WWsmx$EgHN8oeA~j&rf%LNesX_c`m+%feYGyD38IT6*~I z6)0y4o~%PoZ@!NsJ0(TM-tc>0=Gf7I`IB&5;z&7VH=}yNij?3OsiIw~*acoyVZ~m) z`CS<5wI#JW@f`NH>-`v4B*WLkz>q(CKY1=;GIQ*dK z1dJ*|<}p|(XPajswlR^s^Dy94E0odbCUbOpxNbQV<6|%!gF5&I-@JJs8nwMClm;E` zlg?s|ZVx(kQEFGfx04gVS=>o~?+o~Mli$1P@7-jvBm90Ae#21lSt#kjRFaS#n}tPY zTNl5*5?>uuwx2XvdRlL%eljikN3_cRgee>J?OnDw{M!YJvX4Tnp09Gsx(iv~lXqU1 zz7H?c=-c|~KT6->J-crserQE^4>l_wJFK`V9pCc*+=hdl-JEzcQ9qripPvCCPU2f3 zzFC3*Cmlh!+PD|Eo`2%-V+CjpLh}rgleQ8gv1JH~&`e~(1HZ51Zei0!U?7eLdb02! z{Cl6^j(i2$ZXj2Riwd24(I+4c)V&q*>8noz*S2Cqt7Cs?o>86lemU*^e&7DdLK6IY zAK#J1INhlsIxngN&RR?8)0fphJ@O{ZzRm|*KwBDEwk{g0;tS4zX!S5{0`ro zZlvwucw)amhbg!i&G*FjR5^V94w}Qx6sbtb;UXo6!5i6Vj^>A-sUSIgBg^3*T>1iY z*q0KVph&okWbi7Y3)tyK(2hS?d<9x-{z!6aglFIFIlB2HbFN6oNTAVRNdCy|DYm1+ zh=@Smdt90#LjJUIf*Wk(T`jlz#-I;ErW8a>{E;yBL*b?dNWL#b??p{jH z>-GDBcO7tOfG&`KR1eHaT$fd2|<1bL(K}uUWdGp#{w%&wm?AMP8Uz($+)bq6o=wCS7 zCFgEj=zXhnntVwt>$W$Y>gG$4?pJc~ekBJTDbXf#G%LJpF;NO?*=VLz^~EnxDHMz~ zl1pPPq_6#CqOs=}+9VzQ2bGc2?TRKK#!1D5l!|QDKFNz29D_$)fN_e^32Z)66-^rGqBz(y8o@0dmUyM?ZoF#sBCP+^Zk^WbChnVg3gU zX4zlCZ<3_sfDcn!I zy@8wY3-WGEv7&u(&}m%+CW4grE+r`j)G4;bQv5ni@joFpSklZl-)AN|tl(RwA%zp6 znLrR8yD5*8j{O{Xkv1PRC>a2SD$YTfEp$MLjqtOLgKR-j(9UB>W;wym7C=e;gVbjT zccVFlj9}$nTV=P92JX)=;YQ4pHfKj`vh|8%f81TzY!0%0QhV?*bLzJ;=urb?eXB_ z0RA{0+y>x*c+d~vi*aDfV^HP}bpR^8E1l9j*$Ph}#z~BksKR{|kJFg!q7jz{`AAkT zGucH$uXOVsZZP{cOBB}1A#BtsBUI}wA(ZLtAk5NPR=8W2Ey7Lu>}xrY%1Y-asibt$ zBE>iV41Q)`BfLa z;8{tMp=Z@6(J0i;sBi;RIZ}V;Tyf%{B`RLT&dS;DpF6_hpPOh#Kci>rCnO%%=ID@H z)DBgPS_w?X_as3e@TuFDMw{OdCh-SnNBvudMLF?SdJa$5mD7-HYf<#dtHKEWU=chu zfCe8xZ2n+L)Nov?Z14H_2HBsc9ZEV5@-73Lo*#|HWxdvqPf-jvA@6wxF^Bcy2@BtH zBNU#VC&nt{-L(OqmE(6rp+)a$q~Y%5#&Fy${D*J;E0pe@Wdz4IPU&F2e81em?7uPA z=+OzKw*&nZ{C0jUnNZq)(avqQ6miM@cJA;cJ9lV!5w{PnLxWt;T0Z-d!wyfN_k#)A z^lnTXJnjF^^@8cM!@R=y)(!jYu%Gw(FQfMN)GKyw{(zl+XHj9jcru-D*)tknVWvcj zQlpL?c;ZGypNPx*LgwFKHiyh*xXuT&?&R#)EGggo)}L{>(`R@`s_Y9o`hyj{A+tZ| z+XWufEk0!LuyzHEcU>zXehTD|`;~IsXngWS2z**;UAiL6-Y^dBF6pU7uEv(Joz8AQe<{K?-6+5KfiN|165*sWp zG`BvDoA|*9j1IOg(JXjwG-knY^ob5e7=jHz6qGNP3-?C;TM_Upz-%>Y{v?RfCa+*Eg zRh7CQTXpj`$!y+6sgLsH&B|iUx5n!MQsPs)PguBGcog>Ns2P1qba zK@S?h?I(cccqpJ4cqg5?+PMtM=f6&8l%dON^{j9wE9o~ z?M7*ksT@404`*)VrU#|p)${Li#v1u%-v|(+OWnIaI0Bz`)A5=(oH&xp0DBo%ct|g8 zCga)eP*W7U{yU-R+V%&|if+YtvrsJ7dd^!3U=rb%xgk+*_v2KeZ{Fuc?fUUQ*yu!D9 zU{p+&b}yJL2~FmO>}h#L%*GKs-!f*T>}T=KcaMx4OKPnI5q!cOnC?@tbWhBZ)4h3Q zY~9mtPK2s#ZHG?hcrwSeTlwY{M%Fj&#x>4=;NmO%bDZvd$id|6ny;<9SNs0w{l9ya z*U#6kPY&ngsVaKUqy6kO=Rnl3HQ|>jq{HqbViL}Am_RX_M z+wMq_tW4+TKY-3}QJs4goqOYS?v2yAH%{kXsx!1cIkK3f{n<_qFvZ1X?TctVSR%a^ zIG%v2B@r8d7ZtHE>M}J*O1L5y#6)YP;}Vu2JxzCg!qW9OhG*oGDc=Nq7B%osIzNWG z<%%wm-vAiPa870Y4dI{V$N>rWCDQ3hy=9m}zw#ifhsPaA#crvWl;WDCxKeD@l;Y4v z{1~w1<6*4aTlgm;!*In?bR`Vbair3XkHmIK+)dg%saG=veOuCX<+D2-b)CD1XurE^2XD%InUG-~tp{9PNevx`y^L=A#&qQ3m zdQq152bSydKEFI8-uraF`vr=8b?e2s-K{_YDD_nHie*Z1Z)Q;QTa= z2|jxJ?_mOvP3MH1G$oec3IW7mpcXRP`=lrWEG(FLpD-`N z)AtLPCJXoaFWo2D=q#WS{rpcM2GHPo3%q~EqrxpcJsexl=AQwM=Q|wPH~3M$<#l=J zuv;1U7*%iJRPDdk-~ET$eslu125Tzx{jYqkf;*h69rJR%5YL(H?X@d&NNB{g7oZx1Yr#wUg`!Hvkdk zQEcVTB`}JOOe8f6=a_JmOKRKm*)TxBHPboOdaco~r zd|rn!M`FwlP8n~MXUi`uf27!xJ+k4W5%_3l49t+jN47F#3?evt7^#n)D@o>mvgDvk z81g|D8)rs}81kDeCR1c8S)vh{7?bxG_zd5ZM8=Xe8p5 ziX-~RticKhGuBW-e{b!LF+m<58=j#WX7l_!zNIfAe{ZXo41`<+9$7}r13WDpbM zxcs^2I}nJ4VCiE(K~5(YP&CNrLO3q)N6M0ZiFgA318vQm2OhpePNPq@i#!BqElVO_ ziO~6Z%f;d}1K*sBZ)esTQ2$%`BeM-h&shw|Lqe_*6nqLlPiz}DbCh72nZmd5@N0H_ zFeoadGvlyV7#;-M>$N2>K*xM{(hG=tywYfhL40$|;N8hg^nAG}c(>=^uPc|)8WI5_~14Lx&k zNPE&88ISe%q%krkd@NH=4{8ZCOkt=`e9ODI)dI9yd{8N za);<9XMz4JVlpXIFrsZR(6Ds>{z9>z5B&`-$x2QOeyRtBBIpsJ@YC&aRp=jMQ z2HcU!4r?f7SY(2{U8Fg;&|%#&BIvMA>XjVwTml3orsbV2 zDPRGSC&n92jb{+%1}i2m4mvXyEe-lomx0!0xPcj@xri)Yo=%ExdP@f%+J~z<`mYFS z_&xg8#0O^gJO@b0f}U?(A?J{huQauL9BsSM$` z*_D>yiWI4`13xpGof_I~kbJl;i@`v)T;UAL6f=AOFj$v?uiWt5y->%Lk_5#&MsNF#QnNYicI!CBIK)pq%9YA#wsx{!-4`r&8 zyg}Lr)Gf9myd9~)CFdh#Y1qZysDpjPOa?mYZ99Eh+$)-xH zRCykp7?YSPiRYwmmqD6^PU~Z%OwMG<*^NUz-`U7$a(r{Q$%*MqdR=m!#Ui_P9JB#8 zXWC<x8RdW%y(1J_T*WN@*6tQaM8L4uoY+~`SO?;LQ%)SZ77rt&5V$iu;GXEl2 zxi4t`Wl-EDnUBB-GK|@A%JaLP@i!^?2g$E)?hsdk2vWtFp!2Nc>;k22zw?X?isx;A z-82j;wdCv4X6QZgIja?6;1o1}HCVY{GJhR71gbf!xNXdTH$6j>8d+jObKjMI!Jf|2@B zVxc=24OnR{>a(IHEN!#XGA`jp&S{YaM8AH6=)m-YzI0oncZQS*?mKz)y~!MY4J*d| zW_0KiDP{@(oM6zDW8&Xsi9dshJJJKtBux(5&B2N^$qHfy7g>Up-L}duF)1jXnJgwt zIT2`S&rEitm>gEgD4Q&Vx!&_lPMtq^oZ@iEp1{msMxh%L(_zGqn^pV5r_7{LI%R$l zZ;>_FMJ+Ltf;8IZNZyoeJH5#=*^wL>4(%0X1wEo<{wb&!TxKBwQ%T0ZfWb#X@ZlJI zEb%|Uk@dl&pR8 zogio{6|@a+MUpcNq85(uyhBU?I(6H`E@31LJSX{}UrLE2NEat#m4#vv?)g{T&h28b zq7(ZKsiKqkxxN(Q=XR$SvHt$?8;ZEHaYfvy@!+Mh>!F*AxLeYSxPe=XxQz57t{SfW zaJ>iDvM3}=fV43MclrL5D%`IlZv>7nMK^c!}ZbKMclKKi@3)D zn+0^R5@Z?y>Oiy88Sr&*(BFt%Ht~!&9`f(3&DX^@zfIP_q)3i4P&I7*!UsX;8U7%& z7M*Q4+V2EwK#S2)V9w!N{sou5IK$$Lc#aN)_MO2uFlVv$H-8n=sQ{jj`R*c7ZV37y3i!|v#mb3edQQ^y3}^f{s5!sD@XkX}670ds1GcyM?Oz{5@>>LX zpG++(bfUbEVJKgx|FNhU*CPhO1P(M##aUYg2rZCAQosh##@b#NJ|K)oflT~C6Iiz` zEh~}$Vzf=*4;~Lf1AK6FD4DEpk>0YM_NKRJ`D0$QU)&B& zaA!!!GDu=4E`j5l%_^b6$glI;-^FD#l^}9Z7P%7u58Y+v&NNc%vX?Pj3-8QVXGo8&mK%}3l0(Ihzz1st6) zIOvorPV~6(j6YJC!R!~!Pa-#{{3%aqxK%)N&=#!RE183!7-|LG0JPvK+mVLym9gzp z%)`n<;%!?0hFEpFbSZGu7;(z&LuZ@y%B%drEa@n~&2I>|@du9)Wdmk$^v)}<;ya&X zpu|P@H4g?+We7^-64@c)5o8tuEVu7Jzq4P8!h(eebILUc|ZCVj^ zTxc`Q9J48Drq!D~Gg+`iCeOS*3g5iID8R9wLJ zCv1Xy#RYOuL+E=3T;@B9Z}}z?kC+npmZzwqZHWcNX1-+`8L{0&ChVZkJ21KOP`g!_ zlks1z=CASxdH&%22E%FFQE$H7KZ@-^^OKOH66C137joKmY|AiW-lvLa<0rkvA6#m{ zjnX}@gUq2vz>x&Wiw#tCBNaVx%mh-x$V+;4az%ehsC0$dcFg-=u;OrN%VLA{t~?&@ z=YNubV>;VWe)~D{66xRA$nICS(2*T38j6kVq7z~xJMjO8V-29AJDFFgbR)3xd_PzT zHRFKo_@tV+4}bQo#{JfuojuY;;=eN!wrqhO2z!yB6NK6Zoh#p*4pz zDD>Zf63;i^Mz(9qeueasBW;z*n=FOIGu)W)3+$_L9~O8r)>e_cX;k6U_=NvP2WvyX z4f5NL3Xl>0!b-oG3Bw-Y)*#^>bOMWQwl}eLg4Wz`ds7@q#)p-DzWMimLm5a9GEVM5 zc8`qjKq|V>VRD|C1pTPPKMDGW@KzHZje?Ed1ZeJHuoK4pw9b@;e|8g@&BJXk7LLSO zEi}-3&?mEXz%$4?kFcTQjN#25RDx)g1S2Gy^Ne7PfZvh=y@W7~xYN)ESuV~_OXr(& zLDHVf$*AlZXqA)rmR|S~DGXMe1OF5P;97%>|9wg(Ne~SB?f=qnNCJ5Q{d>^)8 z=ZHi7492g*6ltETD>nIAoE6$XjCAeVkk z-*?LupKhso{x6;%VrG>nR?lWAJ#6FpAsPr+cD9>R<5j#!b zX=$npw(8&gjOyasqad2<;yk3S9|zQx18PQ3aF{&5bQRlRYe&W@uX;;x-;q?dyWnzz z1Xb;9q2si7G7h=_5_DX^AGi7o62x)*!7>AX&~C&TYE>^&aR_yW@jOUyU~ruIRD^q4_Q;LU1Nk59lt)Mx0xLy@j(YUr=u+%#+F zKfu<5G)e;>D(BE%)&6gi@m8qBh}Iq1W-@;|)37NaaNHD$gi3}XINV=2Ml?&uBfo=Q z&*TV8kQ0@sVQ}E=JXv(v8aR4I3eCrn1fEjJ+WWQ<{!0eoMp}WPsW}Fi|I%>21!omb zw%{v+B={{1Z(Ct({WkuTPWrc+4C0sC$isr!3AjU0=gDGVaO{foG-2?JL7s1GTWSgw zUj_*j?lTSi_D$G3egZyQ2Y>K1e{i<>=s8mXNza=>)0G`B@VbU2P>6Y6roe{=a7qHl zuSnm<^l-(;T?XP*ot%By+H*7QZv&^UNH5`Y|0NSW(Gm(KlRcL|SOUg1LBEMFMxOiw z3cA4DdRoQRWROl%j(p%KKA&xxX%?%pU*Qiv3a&w?qO9$b?_U3-MovgUMQlfXS^U8z zMxYZS>C(j_cs#+sWduC$W6!~VDIWm=N=GGp+|_bS=(b%F>sTH|R;xvyX%fq_-#~`8 zPkgx~`Z3?+wi4s*vlGNSq?d5*j`U%1;nPU?#_$J=FhEjU=~(0Kr8g!Bf3kfdSZFjc z5z53#`(n}(45P-EVew*7it=i#QvZV=#^f#edw8n z?-d@2O1}PJ>DLE>zE*HXLd93`Jwxf&`-8q6-t8(NuU zgb_)P^}nz)8@%>6DYbt&sr}$zwJeXT{{~I{zhTh&f0L&E8?IgdNzE^j{jI;VYjVm= z=JE#l-P3s`8r^v{%WP7*pmNqOmaFZusUT*PTT%wI$+8<&Gw?}r*AwCCgnP{}`F(`e zK)V&Et(dh>|L@u7w-<|Kdd*Gz8_12@lu%*orZk=s_ zpD-}%c@7VqB8R9wa{(v$p`|i%CyPy7&*)2-9u99Ffb>d8dPiZ@F5Em9{%w80D5q6o z>dCqcVaa@uqto2ugp`!>qABEfOyyCd^s1>MEaC8Bocsg@#V5|r*73MGE+$yHbN)zT zBo(~EIZ)w;2P@7)ClZY$;?%;CqUekC#g)}Sn_cF3jRMDuKQb(Gt33XK$S{T;9`r%% z`=c zhU{ipf1D>1HmK*wB2dVnqT%jtz}uuQKH_=I1)M?wriqNHFjYONvuUJeLI(z5J+s0} zdk|hmrh5Bv))!|ZLQPTZNh^DyTODY51IK=6LYuE(S6UwEhi*95=}Hv`LURW2M=A8X zjziG(9`)F;>-CT{NY}eZ+x3e3B=eJ@M=sN@xi46;9~xXJYKOe10=`Zt8V`}NCB9wo zF8V1)<^^YtR?T(HoOy#-fG-m|?YLHfw1x)$h@CWAM?+xR{jx$7g*Y*C>8_Hq!XfeOJ$yK8TVd2KknAK+!j4-^WAj)$dW$=pN9x zi&ljtXvA-}90SrZ+b4X0xMjwf!|496Ge^;FcS1O^F~A@EiYz9X*%&Y!=UcxIk0W>L z0vL{mib0J5|CZFtBLyA;N3w$KCz*6xikpU)j=fyAIDFQ^7LW;R0W|y$0{dr-5`GlK z6qjG&kCa7^zHc$SiLpW{rp0C9A1E>M43z_s3~<+B$SPUsLDjg+-_m6v$3R*57ETU0 z0+I#=ADU-M0*HhsrY?<&$waMua3FA=()=AZjmfvZ>VMzVX8umbfTgR| z{GH}k#D}vxB9F!5TfmG4FeA-u!|R*R8BPNcS&Z{(1EH^gp9rDmVXw@}VX+yWx4a_$ z9P)!dm?RI5jv8Krppo$;Rqmqs36nS~^7VjYz#Iw5^?yL3AI!>TR+qa|NQ`jl3LWOXijbPW07c9S^@Y5??5#kO>uWB;8F7-`3!I zkvF7|10R@={>8-Pc_2mk8pR+ago@K6##XRWQt`G=u$S8SZiGKof}a#{a>SOXFv{;9 zc-il~Z16vj=8u^D)oG7Oy%~m%bLO@sY5w>B%W|xBN!k+7wG66K{Na;9M{-#>j0c_e zTg3#jUMtQP^V#{Bm8o&j=c2#jcnyYzR*}3I;-7ZB7V>qmeJH-)dKQI9Xsfv3fB!wp zvDYIM80LTfWy>-D``8^mTJFJoKC=YrFc$e)fdy55EEA(Z~ecc#L(${;^_{IB|3%hJlC(=g(@Eak@qDT2Z*&>cw3w6ib{ECo3YTpW0{?g^9vTdyY6Nv7J zhDr?CuM|3xy+#SrqB{l%iT+O}3HL;Jzc0!O!&@K~zipC`wzlP>&*CrKB8-XLu#-F+ z1<#WFwk;xKvx@M+WwlQ0+|9R#%u>kQf*ECUSZr2t1Z@hE$@r_|!rX@=*&W(;9CFG4 z(ukw!8c|$ztn7DEb_F^t=q2ou!S=hY6SCiclKw+nhbtt!h@qt}_4jGgTZQ5Pza8Ik zu=Ne#e~*_w!VJqWM4L%bC_?k|Oks6(|#aj1@kN|Vr|!jlc&_8g7%uU9>2TRhUU6Fax#q3wqaSNRTzA-_u z58}6(4Xx&E7!wR^`4Bo9TZu)y8KgIgHw5oDL(7Vqi2n-WFC%FMEBd4*7E{H5v?Lj1 zzAX31v9^_*+Z$YBj${NqBsR8H{fp5KxRzxxNd~R(SFnH)h8AhIPrPSrGdx{DTct;n zrANV^MiW39!@-G22>%if)6|@iME7o{ZCM32IHcjm))SnqgkOa5@F#B?_6jBG(ujG| zl2j1(iXzP-S(-)Bx1?jh2w2~PS%5|=f&Y`GE|W<@DOd-By3*1)g60?G9=gE#Gm}(8 z1$}9sDVOwU2Bc*mqT$BViH2MzY!k0jwqYu<;?Jm4@?|3NXaDV(aq$&1Us{2;<79>3jx=1^j8BxC|GMLP-VQYWHnXc=%pYlcE2^ zNf%$3=(0%qL*S@o7Jk3sv2N?Zdtf+s5BZe3XVOuirE^ke&;qQZ=hWpyq#JNA4Ht9R zn_6&J^z3&cY1=OB$7bt~r_31~dD6dRY4}ze=DFoncyL(Xl4#dX*2YHfEC7tP1=yeC z$xC4F$ej>wy(N5re1dEZ^n(MF-O=+0xo%6xN$x-=-%f6pFrGkBl8nXTRKU;Czf*x` z_;(5kk-7Z7BDiI(CbyK*a zCA*ih`+Rn9X7?@Zet_M%HS~Uh{XWd@JK24J-OsaoFT3w%_b|JgSvno;_p|K2oZZXF z9m*@@(ebO^qj#3G@Du4hO7|C#@Bg>_;l@vc{e3bB_S+0Qrw)F4mYw_eILvaNoja+* z@V;`HojVMe`Y(OCo!cLWbp!T;xb)@}+qq}su+3k#bI+*a;xn_&&h2EFfn8-^v2($= za4Fe#t~rjcFvHII;;@=RJNIxLRtxDp6o;ivv2(R?*f|KdI?e``TsyZSPL{oScCI{5 zx7{o3+=94p7w)!m_s3z@Ognd99Cire&WOWyOt*7+aag*;&P|Eq+rHAy-5nP$Tw>?$ zh|f2>olA?utVMQiY+T#}GwobboDIy2?3^hsTv?@^`}7XG@|*AltnUtO+|C7d?k{)5 z;*!5rcJ5Cq48u(X?AsyA zFL78#m7Uug7x!?L_V?BP)OmySeS_fm_vrgj*5E3I>n^xb;JW+=I~RfLZMZt&Isn)A z;QA_D^>Agvb>*C$y8u^LBKN<4|AYSQt79dosm8!ftTJ%(Ram*(z~xoNm$KMj@|xJQ zbf7cgDuAmLuK944!?hBw8n~L^YKChMT zxKiQDfGZQO0=P=yDuZh!T(xjD!LVm5qt}tAEaB-k- zGF+)}Wx$mM*G#zPz*P>{>YA8t{}c3_Xt>`kI2&ukdiR{FhMIbJ5yuVZTrRiA)6fXd zZw7ipRb2yyUBkJmg@>EmE}&D4RcjhO0+(m35*pWXTt43GIBq)L>!GbOR^vgK)fn#~ zWA(%9Hq|w_>KX*Mr=bcSa{*&beZ8yNBV@T;v&*uxo7^5(lc$kPzCLMmS8o(JZjaHu zxeo3>GOn$zZ}hq`t$zU;pS@sQyS85R)*^Pui07#jak&oT+Que#19#lGmK+=dqH!mH z7KLi=SLE*HP8!#G+*LK)DZE3fzc#MLqqVu;7}sv{)Cq*o?~Uu+5QY0A-rWrw5nE;2 zpy;&Lw86chx(UyA37Hg8xGobBh5L=^AurnRcP1hV z_b%R9;unAhbJbw@QD(1OSR<0S`DSn3I%+;{f!V7hT5k4wtE(DFm@k{Xf~OjkfxoX1 zy4HjA3PMvED+x_yUyU?mb|ZvZi*y4Gw2smwkOyg!s~or0?0wh^$|AkfENo~ZN7-}S zvu3e@T8!hqZ{8R)KC~+jI2JE(%+Jl40$GmFQvmz_+qD7Aa!>Y@ELq3@FaOb+ALYIc zLv|cXlY(ZobNMQIJ>2{({5Mtf3o7~p6+OWaqgSfvb`{;HqQ@I!bg7D7ucDt)(LYqt zCsg#GRP?Q;7+s{I-75Mi75zNW>0BD2ajGnXyMySCf2G`=+%Oidl=~9LEA%AJs?eD# zdMY=Mooyx@K+VR zZdi=ICox8ECiFZr`>DwAbYd+16rg1opYfa*~vBNR^K7vmqv_WyeJzi(qzOjSb zGc^Un=M#Dgp{EnNl+Xo)UQTEmp*IkE7NH*}^u2_Bn$X3B{t=ggXi^q z46j-P`jYTB5_}7xZzA-wgr;TnMM94!^xK5Knb4OBP3u(pIHYf(=@a@+Lbnk5ON9Ps zLf^&7f7fa&t`+9r#?debK^_y7GG%Jq|6Wh^)j~54Fb13< zOw7v6o;1rtZiQJ{Ia$gd{K}rL{1tL|ge(c4L&N7l_`>WQcv9ckur6IrE%*9T6B}^2 z?5 z2ukz<8ogjr;XS!I)AI`o@n0pBj+>1Jw_$eVPn(uI4MNfoN{(e`F^RGu&Fq{4nr%u- zv2b!xK+y|xra@9`>l>?BG09QX%7dp|O{2J`-c29HGQ9vF5wobD$1*oN2Ln_$ZfL4^ zZ&q~3h79x;;3Ufo5-bzSQBGmqhN^Y!cWw>>v4|?M+r|{N)^(&IFXh=mcf9 zhdYyWV`E(neFS!2T-0l6nA!g1^H7qZ@35V5JTATIig`x_Bn#DtNJ{l znLup5veDzJZuAP?8RZiTu%+|n6jasJs7qPByGm2YytQ>}1=mKX5){qPi=n{BD=^%a zkN5_$UU1bl)X6B+E(Kl_L-Pr%n!1f(VHvZrG98l?=WmIiP}SUJix-wSmMmGg*fke4 znvs>M0`dUJRsm&>1?6)qoHKIt7yvVJRqzA(Gx9PEIgfjti<}rv_(A=3FIebW?6`jk zFe-vOBwvcRoXiruy4qv@HY(yo&E zMN5`A0Gb9`U|zebJnN_y(8_qTb2c@4YP{+UZU9}qnk)vOp;42)gv;)_jhVDmK(@zP{i!Yc^Lmu3dY5f#sUXYS~oL>%r!OgvL8@ zBxtmIvX$EJ6>8w&^@n$1a{<9iX3zlHQ?g=dp|2sgQZ9V6kelPe<{C0Bn>M4^ii(;C zIphHtTP0DA8+G>9J>sUJ@>z5UwF!GI8KrTdiM^UM9=E$efTXThdQuh9dM+?Kv>V>RhoPtd(@E_G)Zu3Agm#~3~1zo5&Hy?kyyzXjs9VHm_ zj9Re}tZfvvEinyRQ}wV`ID$4d#0iM#!)~Q5XEG6ZQ!EMA6w}Z#I438@u+CefwEQ{K z@|k8;0=@*J%Au3x%?9-ptD`%0H+#g?tZS&zs<^g+W-fYHF(c+?Q!C2l10ATf6Nx*4 zR>;oE$s>mKt`XNV?!<#~t*P?5X?pn>H49~6tg*<(c~h>nO^se!jHeSPNiN5HfghHZG9DOatlcQWak4^SMO#>HZ=4Ityw#RiB9q>Kd;bLzhI?-R=iz zD5Y`|<5LSk5UM|Uk4VE!lf&h+OoC9;sNmunMZ?^JJffi(vt(W#WvLYKyn-wiO{AvD znXWDsIfX1kr-1>X1h^WMaPd`;h0D#)EI^|wQcTOEQmmdbQuYeYtT=ccF^U$0$Z*p^Vs@SkF<$-|cEy;lZ zAQL#rOsW|z)DcAT<&u7V~vAcf;?`oY}4tqyu?tY@yEh| zaMLue5^_3~0N=gW*Lhj4$lb^ESW&6oDAcP_$wN1lq+-^bwRJF()sJ zTw;Uhb=Q!RglXr+GSwqAKIj66RgjaH^R~)cE!1sryJXIJ*_s@h#&QTU zJtqq*16p1a!A2`TT!pT6RU0-`k**IY*-XqPC=_elvxq4`YphEiDD$kyXHL(`!{)89 z5acc(RhcM61zcTg3;^%sDZhFsw}C)$evhi z>Qd#`33PGNMw}iZiDr_TSBJxNQt&94Px>|}Owf0DWWll(uf19Wqp@g10)v7^1Pt;3sLInP;hX@JZnt71bbJ^quExDlfv3rm%3~u0^JO!O zbu|h&T^4;AwK&bOh*vr|1%q;)orsw_t6J7iV_7q}1hV95nFSX&SVA7RDt) zITTQ%LSnR9#f*?^Q`am-v%D-BzFMQR)?Fot9@0z<7KBav$C{>E^q6V#Y@kXUYvsuX z5&8%Dd5-?Ml1I~No2z|VB?un*ao$xDSBIIV4^!RPP@@i#KX?%N@pS#;#)fLQ{Fqpr zjy?+r_Zd_#+7#jH!uWxaoQh{ttl^_0ym&q|gj&{Yl|ip_=5?K0Xl%mi3HY}T#;{P@ z$ZP|&eGOF`6gQE|TU+JDDKCx0INq9pk#gARNOp2JDl_UfHfFt+NZ99K-T91pCM8&n zdo9QMDHj4DcrG%VsGRqdtB~*4MBXTm!=1?j(lM#8DWlJbEEt3)XnPsJv z!kI-v6l9iD!j`#^rJ0qvXf~y?Gv_cWC$n4zb2FDPDlfB?QPVP)Gb%r`oKe#=7nM+| zAaf3*Y?(_a1tY#vMrCI%XB04DRBmR8tXN)V2~#L%T4o7TBqu+!ged@}qlBpdgNqWT z1Y}$B{0FE(vNB6(vbotn%`S5+qQ7!7okh!C<*Efy3ooSn8OOo10lkTRM3jHSWX^J z(?T?nd@2-qfU~lYQ`atEP+qEF0D_HB#iF@nwwt_A%u>3ur0b_}EqJaqqDsS2gN7xezzauv$DYMgCs^whXw4+><_O6S7JM6AXRB8zll z-h%o@G8vL1`>eHf>uO~{ZeL30f+GnPoxCt*y&R}37LZAk9NEFCCzUrRSLsi#W!!aZ z>hGx*8a-%Tbl_d!f&zowJf(#vQ#&Q)3m3cQ&s|dPa*_8|+HpDbU?c(rEY%16tXJ3n z`}g1fo5I#?`RpAVZ!sDvsF@8ptU*bWNg3Nf|c>tG|h+LlImlmo`p~9D(b? zcr|hwE^C?^c@tyZDkH89c`oQ<8d7dkhj|Y!%N@Qyd)XBq}s9*pG%Xm5r(9q`RO zJMPk^T*fb5;2Mtp$mHmS?TPCz9%6Hl6pXk$(onT%<-00CKp5l^=qf0;FcP8o{$<+BL|Z0qNBscuT!sjob*gmG`T8 z-400l95s>!NVf*D1G0Ip8d(5H**s0YH`H^r^VDI!3}Mb`khOs9en5>p1jr!`;sd08 zz8cw%yqs#}Yk-6`$ahe^1!|-nkck@PXDE*b=>TNQLN)RlAjxHFL9PJOxmb;ifLqoQHIfRqG6j*_L%Fqqmj6DEyM+d2e{y@Mv_FQ`@Vs0dWRUjI zYT)AjjPg{fk;8y= zD~OysvhF5>9eTT0IrX2MJI|Uv+XqmrVUWM3QH5c-^G}?dJJ{|H?%SML6`wm=1W(ka zNcx~XBmUtxJ9bU({2oiD2ElDh4!G6!`70o4>(se3fcaIcMl2xWfjTuZ7LYUR)kr!Z z`yW&zc*Jo*y^OeU#gE&wp`%_M1~*N!Z%`vnKsq$YG7Qt8MydeWsX@GeT+kpsK$;uX z$aX+7nq)*S39_9{hK|vosm8W)N!X*51WxxSmjuP~hID-xRuX>5$t7WJqh~{v5MLHZ zJ#C6F2{AVt)AU-Nu$+#`uoHBDQ5)uS=)PLfeULCrcie)K=?*^S zBksX;PkB6EcP;XD2$UJPx?cGALkQEpJ-)un=|C=zpkJ27{=R5U@v8=^X6uWxrds3(1PX_)t|@t|#?d}LR=Zz;SiJ@{a@I_HeTum1yyWu{t0vZeVqJbp-6mWD zqi4RV1Aw$@kPehkgLDEi z|NHT!PR>(k6H+0sH2FBRQrD{w!%7``=WG;NRqbgUwAA%|Kfcsyk+;##vOEL{1G3`> zEH4I;5dSVgm;*ml=T|Z$m$y%ij0a@SkJT2N2*_p)k_SllkL6gh4P^&di2*R0p+TqbLkgbdQ}XZ}^47k>hz_C+=FH$Yl{ zsYZgHW|*u$prIXuJ)z$d5sb z)MMAS;Y$$4enPGLt5|+c#Op4n45KXwHcpeq=h40QI$DVWMR)clYY^Q}oQT(5i*$n) z^(U{b`(GeTmPuU_J_RIQgABK*WG2X1K&+ZD85T-X#6^YXy8b=hhO&e(CQ9PCM>VqO zZ7A;mpbDe2VVOP*vtg-XL$cw=puLs(*YP%tAuhI0i1pW3x1p?;9Lr?rf`7+o!!W%L zUq{d#t>IcV}pB2ZcH8$W*O+!sX^R;biF|}y_)ABSX43-qy>=qm(?xgHxYpZ zV&2z}0oi=38hHhf)(JA=0>$tnvEFn8OUFf2bypAEW>BRZhFBSQsF9Dc9BPme;H3!~ zDP|Jhk#`X+#m^lz8k{bCIAk7-&r+^&NAV&e&cb6J@9re;6e?|!nvKDfAzMzz6|1wBNll%Je zjP0tn{T-w{>q?MZp7De{=H;&O3RTq)4pMXLCmQ0)vljVyxQtxA<|aWevSX4uzs3R5 zuR$hZn7h?TAs`u()yP~xb}5K#F3QWirTb?^I#FV7>lD(Q9qhgKlk@CQsuUgf1#tU^9kKMrO*0 zEOW0S^B^AM7c6s!BD3nVR8@XpUZiKn=Y5yH*0LTK1q$Z<~W_s z>INYuGyXLzVXkfG&5E7V;g+HeqqFlh{1(N|$@(yi*Y11b?VPH!^L(A1Qxf9sd|GGc zb6mWg(OYH+$o4%ac>_I_Z_-2X4i3FuH#;6jOV_8NZcptbnn)2 z@6&M)>vTUfB<_Bl?s+=y^L5fOLD|P3F#Qltpd#jH79vyd!j(d1W z+)wDZZ`N_&spEcLXZhYCaX+NvUa#ZctmA${$Gv|@+*@_rXX?0@>$n$uLEH;;ZQTVO zcXK?FpK6Zh&P^E#_gvS*El{(9ixbN3-uhDVeqT{|_XL;+8xTotZe@4gs zf{uHaPWRLyaqrXV-mc@`q2s<%$31;W+|TK_@6vJKr{kWX<34dn-1~Lh_vyHw&~dNT zanBkO_flQH_v^S@bv16LIi7pLkhq(5+z;uvcjA0^R68AJ6 z_bwgxu#Wo)9rxNHaqrNTIzh*MhmL!qI_{f?#Qm&}`wkuV zy*lnzo#p*Q;(kEKy;jHFuj77Lr+e#=xVP)LuhelDblmsoxbGYi_nkWKr8@2_b=>Fc zxbGek_uV?~^L5;7blg|!xbGPf_bwgxW*zrub=)~!scRn+_tQG=TXfua>A3gmbl*QD z?wqczJD}seC5r+cO@-}{HeJx`~5SjU~y z>7K09otruo?qxdeW?gHOrsKX^$K5g{?#Vjt9Xj35a`D`E=`3#@68Eq!-=EcSKcM4Y zpyQr8B<_24+?VUPH|e-H$8v|gg()^&{e4_5ejAV6m2}n$wPM4A9H*L*mgfOvEexFQ zPp8*lVd6C%EDY5mCxv6&4M>>=3o|WCmT<6lH_SeBxNC%o*XwiT&a=AQDbwXnEf_waES?8A-q98?lK>4i2)S^^3|urq@^E^~%xf zm8H{5iyTdok!$Of^$*l*ZMh*BEURip*>^i-)$RCqr ztSp(=5i% z3^To4?w1E!u^F$|=dygg&his=mbY{9mQU7M{yW#v>&4QMdp#8|rp5AqT<+u`O|5$M zUN7Ubb1-ivca1R2KKrhtWc~wn&nx9VQ?F^6pRN1!Cb|3!Rx+9HhZNmoTf(dVF#d8) z%QjYn49z}QU)y|5`>;J9&KcxAA6hN(Wdr~E&3<26f%%m-vOvk#<0w|ro4uG2}%^ccsoDH>!$ z6Px`eNMn=W_IS7hCUwdyAmtqzy=nnDtwA=9h^@Y+$c_;)Kb#`}49G4`tQP>W$E-mQ zvSf2avhMh$A1;%`6YMDRHqkv@g?u!Era=)GJ2o;srWZR(@=y$62V!<;c=5@xRd5s; zmrPHmi^+UfGF{umWM+qH?!HHzPC+utr?$oe$+7mCA}&BKC@H(>fuU?hT27|{!W>YA zp$2N#gn5K5l8TkFRzSAIVv&!@W8Xp3Fi%4mxlduagXw7O{4z=yE1C4DQ??F-*wEdu zvCh-jP#OzEk8WkNyEF_rT$Rl>%QC+LDQ9tNdENsgO+g@5EJgbhm>^42G@AEe;WH!UnG;0Z^w?PP7c0HbL6}1ZwH7}HWTIIu&o4*D zT5Oi@fOHvR<(VG1+pE~e&D!}|O{}vJYamv}*zv(l*I1G0VyDH1V`bGvKFFxj*6#Bo zXt#*m+kqF-0Vke5bLGFB_QM$wZ-ndRA0#TJdG=SI=}Sz_t@ z1&}!!}woR57;N)bFE5ueAnPvz+fWM(mTAak!KzwU)FR;4_P4z$;bR&ifjbrL`)ubDD$3J>1D@6TQ&A+=CwUOJto?s z(c)_mX0s|~dQ9^a>lYSMX*CkKG5bD11qYgJkGG*3%P40#LBrqsmx zBOvt}C0ej!qt9w&zS$a^Rint=fCw67Iw0k- zl<8-XT(?=(+K}Da4{7pr0mNFaNv9DIdn^_^_PSpaYYT)4YhvvHq*a6Lw$k#&dJt9P zYf!@MXO3;m&PM^+r>UpE24p~!^1FcS*B}=#R!nzx%y_EChL<4BUQMjT(UiNK7xWnK z-I`cwEKE$o0v%EYh&;1Rk=3K=slYL$el-2Ykny6;DtnV9^V&R`?)}8V&;#DtT3I>F z6A-2|mOJv{>akkD4i`VGiSx@R8AC8WFc}J0#k-J&pPLE(`>xkrZeuKKl`ek<9 zdDj0a>}rx*w_&i3(DodiOq0Gvm#>?)o6htG99gCv)v~0~PvZ2X-Sq@LK{x%r4mI-0Q{0GeURa*Ub=@rOORSiN`!zhrZuI6$oaT1uD`njdme+Nr*iUha%uQ=Q*9@Mn zEzndTx_FGIw#RycQzuISAoyIbqlz6d4m~O7D)Smxwz3m*v05v3P(3BC!UqyMLR8K5 zXn0Tz(R#CAuWDX#mDXMo2nuK5qz&k}ngQ2OQVVOoPW9-y(GVExthC%|$9Pj~UJtNe zs?x~p`BRO{!>pbK?YZMj8q+T862ogff%y`pvHIzqEi~4PI`fq49H%4*7mJH6!{rbl zj#;jUH

0-edK~!sYT*XgANK9vV?V7RzP{=#K7L=&-U$ewt(w0z4IsCzxaM-z2bh zGX93VWg`N*)K>X1Yn7iXHr3PGxoDd>oK6K`9ISmo7Xa4-DHh!I0q!R$P2g=dDE+yz zTp54Nfu~J2h~37r24(IXQbg(iR6BjjwOMVA(HwI*sU@38m}{Kp`m8xl?X8$mlR7j= zCm@2*QTNnR2&|$J-XwOdxnp2Y$(Je=woUP69Kg#6Drh@;_9<$GY6J4#p z8M-buOUBH3j0?yiUtSaKdz?sm&oB+cl}1px0-L9`bHFiH4}|P4P=~{M!g-)-0@XH{ z&c7=WbN;yPvIE%cnTzFJc0A?t@c5Hddj!svUnCY3wLSb|n$m%y+mcd!i3r=uD ztmv1aHnB$3PQvMLZ_Gz|UL0mMnJPKGIQ$(T8`K@0dCf{x#yfd6Y;gv`06y27d3i{8}0QL>v zujJLtb*!ZLP@v(1ZmtRQuyuDUV*fb353y}biq_37Llo;ccKWcSC-CZP55d|;&^ydmGsHzIDGxJl!K6?-4&x)e&MrC|!G{;RKv_!L9{7d(KmR^)SeK{9+&Oi{J9`uwH6+ zLV*K{%;D+N_9W|ozw^3nC^*uRwj7@#HFx;skH^O`a)b(`7L+upZP(Xe^;qBmP56{l zYsBn3rU>nOQ78-b_!Fx$nA9aAMeN2x^L&|?OIpRRa{&Q9>t-NG?%G4B8K;gA=sYWM zg)l+muW|VuCwCWr!|Bk)pFe-fY}-XPPr8bY13taU&V=P%c_HY(?L^`Rbc`jJu60!k z3>3UCgVnsNOlW7rB=!#{ELIMbBm%)QPstl*ku*n933R)j>SG>S3*}fdqmnLw9oAL9n_@j1N%Xy z2L~VfIo-yR3(gm`yj6UC3U{;T>TL=@Y-ng$7GT>uzGS7gS(5?&6zxH*jwrue%-h7p z@#}=x1-Bq;Qy_o5^{d)W;I57e5ZBC=zkF>Q(C$=|)G4UZ#`~VQnd~(p`wE*+r^5}0 zR@<=(4Nv60$uYbQ{@5)1+oLbLjl7XAT(`rW9h64Bne)z?vIzW{d}CW$xJj2XFsRuH z%b%|DGC5Dt;DN+b5ex0@2t!pQd2T0 cd7Gqg6h}#N@|O3@`0m6tcOIL4R(o^Y74R>uF#?7#oj!!vZkQ$yKfgI<}~s=M@+ ziR73@r4^ zu3Q!FF=o^c*69~8m!7dz5ReK_vUutt46#GEp5v`!{7rw!apbxFh@R+T%*4~;PqIkD zw108TGLZd0{+A)ywoCB7zedjya_Kch@IMn{TQbV6k`>&~0iTHWB6xfBG3m^VwPlog zz3BcaWMYS6U1*6AvtZ{T3Z=& zxGLNZSD8~Tw=sw8a>+HNHjk~`E0^LwCWsB}6%y-Zjz~Vq;dXIv#H~8Y?ABVz=3x$N zZLQ5!?%1v=OdAyAS2Jq@q8_&0W2<1>Yn*Hw+bUU0oi?`B;VQRnXIpKaQmf>sQAt$& z1G1~eTIO*xx!f&T%gSsniOHo_kLqNSyB3~u z>keKAwbn`-cU8C{UgB6w4x7jTE+%0J5e2_YV%{Ato(vpipq_0zarlw#K z7L+kBP{cgE<~+a)!F`X-D?9N8WjgW2JXVlnk}naRnV?)P+q~!~cW-mCS`x@w z03~XaoUGO@yUM-rB9Djx;ehV9){b5b2K2m+oi;DIn7fvsyTMgnuGSPdE8K30oXoY& z1wz1FZUKP%Y#@s@fV_iC4m1GS%W7;cnL$0;;it;&QNeM#o$hVGFO@W^dMB&qNLJf+ zuw)l`aTnjtXqBjtUfS zM+H`hqXI+;Sc5&SqXKLZo&X#?4LEuwzyi3-E>T($Abhr~;it@LgJ$kv_8ql$5FBDB z#S8Mis)JQ}+;T0e;2aYYk9-F3HcqwbV--%>Yxg)R?GkrF`vn(g7QC!Zw~T(sV%uJ8 zb$PK++jgoS+x9Z2wT8q*v?Nh+YP+(5ZrY*ZL>{%W!Q;|IxFX>mkK4m+SIdsA%;v&J zuCaNnfG4O&P()sQGh0oq9e%71C!;X1CLMx%Mf5)@1VSZ=G>>erMuOe7+oMj^Rb!Lv?(*%iUe)K&LUL$8sfY-7#Hk78fucw%4*S&Y zssrBwA!x?xo4@c^gI5$MXpGy%8($IhRMb$yp*oyyuZ??Ad7_cJ#fifJnb@b(KM9!K_Y)6+l+FWzRMTpiHh> zYb{_wPNx+Wh!uEf6QPg>be?NR4YOL=I@@Jzbs<~LE@jJDULniNW4l=$yN2yzTiBKC z3NWxQX1Q!3%V6nj7MsDQ!U$&~nEQ!r5cHMSG8@Y&^(+RR>9Uo2Y}RVfDA0G-_Sebf zP)BJ372x&ereZrxU7V4Tk&{W`iy64j+Bf#iFPb-jh=Gy8rcBD3m%WI%&Zb~ZFQWQp z(+Z}uCAKmf+AD08dnO7oi1%9$jwDNbn-n^FlsIczc8w0YX}SzsDD9o07H4iiWT7(^f= zrnE8~XPQy8n;x5j_O01lX0m!JNy(UyQW@$RREgI%%Ou%lugT>$fs}(FfGT4-wI17I zwq@5;6R24Tvz5;>mCBOIYu#qrl2$eq^`6OHVM0v|C3!(OOlbL;N}cYqYPO~BtQm7M z33M~r+sW&TvyO)2C*PURI^wT@U;Ojs&O(=zj3)Nb3(QP0xOB|-TykKf6CxIkw8L** zMN2unjQb3FUuc&+DBn+!!EwIlLKe(80yEw+OOF{X$}f(wJ`g4g2=nx6=3$W0qWpZW zj)mhfpm&a$nlcmRA>sI1%=J=plQe~8cgg#o#sRnh)_7DtAHX3hnTSdPpkh&eLU@>B zpw81kt?P%9m6-j-nSzp+-zQ2`CJn(9c1-cUQ^%TY%BCy*CpI5sIrc17mLpbh>SEx& zJ!^3yODh9`a(GSdQm-3y2Q)K{{kJ&H3lgvKvotTr;5l1QbF@fL4I(dMvF2t@)gJ6|mW=N&nK0`3Fg0iGMmH7*Nxrgomhn%UbS;|;& zni_$EWZ#Wwlt8Tnhcs;knB7&0%7s~6k_$skmaxAh)YvBf%})gp{vds?U!iA#%}1~j zm#->XoxWuG+VtYWf_2MRuQD-!qmEOlAbF54cV4u_rt_i1qqREL`6msrMMxT}nx||W zill{rx5!ub039#XMCCqMt&8Abxq@?-STawU2>F7g(VX)K=(q^h6An2lGINo}uyUV_ z(cSi2#v}dJF{Kn$>jWpRsM1kO5JkSbNzahxoN~ujP)}gW=BD!gj-(bsRh=<*!}?;C zv{jt6xytS#QPP-lYkag&keabr5nWeB>8stOp>M8|2bnwXfVSI`1W^5j-7U-L-PIAF zBq~2D2EN=SL~LS5JUYVg7sypW3S!jO4HKZql@8*Q@(~doLJ0=szA_*pp(tkSuMz>A zMXz11XUc(Uowk)z?fwd3er<=^Jp_0J#$ll=nl^;9U)w#d08|1a zG500YKldNnuS{qfoBWT{eoimo8`OEu7v*8Cnv|c|Io?5?_tUJS*y{w!6>jJJG%DrM$x?&tDwntWYd*bp?u_0-i-P~l$8(kG^~v>9Hm@KEU_Mx6_xR~0e^?dg7O$kI@?MaL`ezX5H2-#nd0 zu5#i;t?c-dlt$q{=Od@$aN_l#jDeVD6zh+|csdrhJxlxUo%2gmxTY`Ox^k z)*S|3+g}}PW^3*LoCp>C%w>8~aV-{vRAsimhoSdDXv?t=IM<)+4ww@x%AU*gT$ga6 zzG@1U2|$aKfpZuO52+=junSUFAyhyN-4xsV-x4v|3w{0 z!)Abz?0@gsgDGbAWITvb&;9I+`=o0i4K@r6R_>n+loczRH&D|CCSM5|uALNAH}vDeWi?o zMb9(wNDLEBt=DS=nP^QQ)(sUQwj+7k{`9>D%8QTe%B#}uF^O1Hp`0~$&wWGDrILNK#gEqOGeygvm|o`@)q6#5MW z1XTWHAs~I~s8r2wM6{-l0kl??0p^#e#Z6H0o`4CSLXo|B5R^P!)t>@=%0Cve{5W?F2$YUmh3bj(zC4S?ixV>rK^$hbTY$QT3oCn2mY%AWxihdWid@9c0ne^Ql6 z2v=%`{5jlG*VIwSUXy}0lycGxWvuq)_B0`hMZBQpSkS@N$G5hfk0^C)`ET@0S1vXHsHrjZ488y} zk4Jij5`O{ztCX!%`oX`tfBZ8M|A$a|F45qBegyxY56~0T48;UcIVF?F^h*gFgUEby zRg6q%=om(Hq$}IvunjbGdCp8N1;k}@HVEMNf=+tL8h76AB-BM^9Z zE&#t+MfpNVGJ%8FX@q+MZy2-FfZpM~Bz|>O?|LeUp>J(fn(|9M;ITM{KICWXgTSB0 z!@#KD5u;we65x-S6BJ)6VD_P?M)NnEYxhM9yz`eKy-r!oBG1;S3a`ViR(EzPkzR@tMDErJcw?&NzwXTwou975`qT$FoBx6HYInH-r;G&XbSsptOT=6n;Pt4ls1{js*u2KW{v8qhU@yWWDD3#;~MLjT}Qpd@=^7 zMyknXHpTQVh!fCaQGT(I@yU&d?S$kE4#$s$#KA$phwu<|YU(;h7SAJDoUE)5L(8yf zql%Sr3%ON&RLaCe*w7Ri5(Q0=k96^$FsO8suzl^1qPKXH zPAkiOhm0CLp`TI**6*AYb2}XA5n@imeg>M0@`OpJwI(0Dlv_>_I}hq^_7@y74^wI; zfB|F%R9bMJX|FSuKU{aGs)Z3P7lA5MPBGQ)NLPMhifKP4Kolfx+z7}Lm@gC{j*L

nB#AbI~WJ;Vp<%bRe3S3H`ls6auI#eNq`cGh^EIz1J& z*=KW2f>R1D$Ltj0XW;!hbaIH2UX?&slU1klGRsr28G@W{(t| zSI&zugWQqJ^nL91iM;@Pf-DM+5CFU{#_$6(^fJt-K2|!sUWcpFgi8y!v{7!Wz*z)l zVuH3=*avP-=qT*Md>w_|{1w7i{UQ+0TmNQ$pNWs=7i?1{@6Bz>J@lD4b(e7j)hO$@~*KZ-+G0|J2^8 zPPf?aL0F?kV7E5*1;+S7!3zHboLH`IdK^&#cm)8*=nL(V5`7^+$`>-poh#}W?J_nN zBIwO0n(9szJc&Y+b+WnfMd|0peZvbH4@o8KZ4%62IPFMLiD@}EZinD+7F~Ishf%U`R8f&WWK;bd$K?{%jk3i<^ zrh;&A9-u6MP4PiBPV}8JNn?R9Fv7Nu@Bw8;->J>O%~QL8n*jIl3jYyo2!X=m79{}P zn!i0z*aa1sUD)jz>uXE&qb~$H50Zo|$_cOz{5U6>94P6A5dXa9aA7wJPvgOF!ePjZ z8PD&V@ll?U=jt#tBSUeH-}VCJ7e))NqQuy1aza+P^8+UA&H62GUdx)w42F01zk~L zw`PgxwLF{v@5bhYqnKo0TaPbfG~RF&gfcw2@sVsZ>8CDuZ&_$&44!&;Y8P^Uy?B!0 zF~Kt%9y2@^5xzyF?I=8sLzK=vLf?TOcLE3N#CQw*gVA3T^$$V+=BR%t`d3E%M)c=K z{pX=SJ?h78*uim8{|NLC5q=o$`%8`^$%5X4oZfpDa(ZVkGP5qE1>TpzV}geXH$KOZ z)7^k+o-(*gE5!0KYao`6ok*Y<@kq~G?P@+sdT@j*-r zdERMkGd3u|ls&8gT#te)XOOYs5BN428}`E6|K78I1#Y#XO!)WH@`SN*56Qth{zIs3 zKa7(`?Su|ZFU2pIEoGVEXBPfUH3yO#-jov>4ohPjPD-P{g3)~#=T+Ja=wxB}eV-C% zHqR`4$JYjZ!T*MI)bByJ))QbBdm9wHUb$_tKDy|LD??ZC0RL=XVaVYBf=oIf9H>s+ zGYreBKQ&Dr4KRuWV7maEV_4abKg&m~&{@bvYOm0O2d(Av894Bp9*@H?rG2H2dKCG5 zwMUtR0yA;}z?gC=?fCW^7r%C0r`3lV|`d)7dqVu?u?9u!R%yoA6Mo}hgTn=tyA8jXk$ zn3;UO3t_EP*2E-!RGWAyh78K%J-<4;vr@;qa(NtPx)PJzSHjolo#=Vs5@9KH+hz3M zaS4yyg`R6lcqH=Nz&sRK&^ z_K-GSr=&&VRj|XSiOCr*jSWYbkjB50qW()E5OcG5hU7&btsmWO!hgsdebC?5D;*!w zO3L07It}&HFIK6C0kNd~gd&rJtC~T^AaE_HW6__iMB>-*Twg5KMc@^mP$3AAZ;D8S zcOj3YrmJhyQR4+&8%G*k3P#ZZj4jon?>9*O`JBJXdk?$bc$mN?~ZQ6dVgVQM8JQA{`=R`_5u7BY+N9WWa$ZE8H&J0wH^87_xmTOB7>7=u4X{J-$<52>y)Nc-y@| z{73MZ3V|{3o(1ozh1@?&JYPXLgZDsqlHnOG!c8J=E1JAPGxDdEtljyoWaMV}PqvbE zo7PH3?RfB$H9NAEjM$;zC+ju76^+)&+!2mrqnj5TpMj-uko^7wC?lmSuE>l7g*|#0>1F0zAX=!Wl)c~RyBPpBz9=OI3X|${bchm zje_4r612diJcwgJGN$MXl!W|=*lHYrCx)zKV9axhb@U;FsYic}dY|!gy){s`RiZy{E|H}0O zun8Av0qWcSBfevt2_a;{L@6^5erDiLT3$fc@EkCqO&Zg1TpIZR@nDE=zu^I5!3Vz1 zxV$|7q3Lh`0DMenTB6fil+RD-Xf)Zrw%G0~LSz5_IeMl})<|$sXK*d6qwp~j(&u{C21ag&mXdXHtwmYz z4G!#EdFQb$Q1?0+3>M|5b8vY04255F6_nVt6mVXA0w>TO^Pk50O2GQkwNF1t26^FQ zx-RIKNt3FG)rl;ISs#?SjWHH_k}mk!T0Y zptDpNbnvRzydkKmVydfyaX4cN=l%zdR-_lO_dLChZxKP=6{@npS`63TgN< zXvQT;dylu31S%TUessROM6bQ;NoVGBd3f!SvXl%SNqU?Wwc?kdn zq5&-RAM$_py`lL(2VlMrIFzpu$_yzhAAV-x&(!=tV#6x{7kn{PTI+M#P2^Dz5=eoex6p`o+7A4Yx6FuILO5#zz0r zkpUF4RYO^TYK0?~s2T(V4l<$CAuUyT~?to{*dgW52 z`2wA&1$Zm@kcmzXK^o(}^}65?+Ap&%C0tw1#SM_iF5MSD0K0%qZ^wX{hHRRKY?_8_O6V6%TNDguQ_~VX zG&9R_vcC{Rv_jU*5YmCnnuR2F#q9OD?!+u$4_`m1ilhBNpH7EVjVH)vL4zQ%gFJCM zK9T-ISfvR~+ry1vDJ7Ud_WWvTD4N%X(IBP6pmF^t;=`sEw=_5!S|x70s$YOT)^_Z% zp2Z#u(xDM65A`4Fd`TCvuc4^}Il43Jn||E|m=`N6rgJIzD-x0<4dafX#)c;#b>}!# z#(%|>8S=pPMs!?-?8s;$H|X(cQBj!FL@5KeDfm0OUwS*D^!_Jq=~6JY{HHmr=?Bpw zeh%T$EPm45>{q=hP3se~-}IhWzaT@7YiC!PvtRHUvJZLw(++rD3}(d%ZUR;rK*r6G zxAQ0kgqm(cm}}Q7)dcVd>EC>zpWET4KlW2m)pP$@POYaeMF2t{IxgTF6(GwW?U=x~_$>!`syC)!J z`H6cm2p61N9-*x{W+-DXIs-%Qr!44hLG#mZ*b|N?U?(*DGRGlc=(q+dpHG2`IH{iQ zNb7y5yc7DLr{R)9xDr`O# zr4pB@j0EDu{!npxB|_hNrRN?kY4_dpZAhCI`i`Ux?~gQ6|J^Eq8))aD)GhBZtWgFzQ+;N{14NKEtAIW8IgjPcq$s}$;+f6dy-PnQXhtvdY6bK zGd<26903rMVUP^!Zdb%W*B!AaTi(~j?hB6WcR=Hyp2noJkPfs=e-MqpE%fAI+zM&% z9>ZMF%0|%2pK~WE=mJ2uO~Mfapt~E77580E}YIHe$AX>bRUM@vk|Q8q6?$jYX3Y}EFE&id4Z}7hY1bZZMG<@ zenn<#UmH812uk`&OeU2!uJB> zP@B^Jv+Vak$%9PoF$~SwB`4+wQ-r;gQzyq=5=_iV#G@CeY>OHX%m46q&7^r2X#WKL zm8$CG9u=Vk3@QT7JRTuP=q9jcp+M3m9z?N5YaX zH?!bqod3^lLyaw6BqA&jp-eh~yQ8Mx!?b6f^%F?fZ&1D-52P3C`F;~ffN(98SU{3SVN!aN~%mIH%PfIIxAw3rRE+}QKa%4Oom(n??-B|Fam=udl*6etPBHQ2K zD^o9^VT{KpyQ`9we;g4buwvzL%vWSk$7a7HZ$irI>e$47_;NfD@KXv1Re`f6O-wVP-K!&W4vdUH1a#aGNK~^z?{Q|Vo^`|%_V5>+>p!Wv zuiy|i7Nt`(mf)`;!R+Q3#ys6c5*dz1=BO>{_hW@zwT#ssELGbJ9;6pHKty!P;=~-g z2Y==*W>M{slL`LB9JkYim+$1JW~I^<5vbv`YQ;Ni)-0T~;PzK~E`4ga1mD_aECZ62Z9vOKAp+7K{nw|1ScchEr>qTJmQwd9;1hD(b zy#U;#8+~Hi)L!%yD<(`cjz=WJFytU_>YT4Hi$>o;jTgiEuBmA6J9+DX*k|$>W|WT+NMr+lIr?8r z6=0A_Ov?1-zC&D_;>*PoNlY3icmkM7n8BhTlhs2`*p#MNYibv1E*?|oWwH*dqk3%L zdkk}Oa-{RG9hfsk8WbGWoU>R;3L1SK@xj4-KBmJE)Gf_#Xp`T_eoHp^yMnvPcvBm-O0$47_1XadXK?Uh05d(94f?HR3`F|lDq6LYE}$@LT3kwQr^VO_Gx=~rdUoH%3ZwCOA@Ep0oS zR_^eCGh?oorDt5l)Oww)z*pz- z7vZo>v1s3G&BEU45XYGBK2NQd1$4e<4D$99h*i?DQfPv?^9DWHUl4=&l;P1BydoXp z{nJ6)fYvIjBk<_9ix8&&-@irD=jypW!(|cW=u2uiUp`>%VDZ!?P}NN{HiD^%u&btT zP&OtibXXg{B|G z)^v7eY#Z7yGwekgviI^doM2KoS04|D`I-k$BU+;NygfAJhMxsOng5q}S1;=lvgH0i9rqwiA5$2zG*pe~NXb?E&u}tY@+H zgYq$_xi9}TvcGF^U)fjDpqY&(8~|(P6Trebx@g=9D70>F%W*{7a69$4D7%*R%D)p; zfP?+-NA8y?;90JD#X?{P|pB zbo|+h?hDl6(C>M<{`X+S`41I@IDD#>Rx#zCN1=}^IA2)1l+)P2?=hj=#zs8Z z3>@xNeSE&qE1Mx*Ep= zZ-`#?6MuB7{6(HVc(u?^Rb!P=R2o$_Qg3MW$3bd;K?2R0bQI8sQ$P}F05Aa|zkZM) z`wNl+MM?ewzUsWpUofI2vVHMS2(%!Dp!&zQ`l6G_$pTND-dEN?qKlCeerI)b3|~j9 zQa?-w=4%^ZQKlc@^Q%1@?6bYNW_WBM&a-qA@g`8Dd&!yG)s!#psH-w4-TQTHZx`oJ z3r`xNDYF&~v?vJ&BJtf-Ny_v4NiAW3f5h!-)4KZrZs?@I{XVgDd#67EemcyCo*ST( zL>GQBhHX#|gF1W~<(399i$+qjn8=&k0wxd0IvU*KKbbEg5_~z$O#aOOTI12Wh##G zo?3&dTqmj&9f>H{VIoI!FcI|!=-1AyHb^=}v+}TcE8yw+htNG&gHG*yM<>>&eppQj z&H3_uwChV~O5UP}8vc8WPThCz7JcEqm=^uTU;As(uk8EQEjm!wvqAaht9}~wgh-<{ zK%>6$|5lT}@vrA-($#@zW0L*} z(y+#^+d*e6|Cpjf_G=}7ZeROiG?)JkO07=Fzp(+k548=vPF4g*Bw~+!Yh>1|$fP1N za!8BJwEkM*znR(!b0V$qNwQ;Jyv6{X{d|7*nmSQzbjbi-`T7;n=z6XrLndhQza4zl z|9)p7ZU932l}Z}X8Zg`#Fhf-)sI~Se6sKOC{5z(P>5@%3Y315`vI8Ya9fcv9Eq$)L z$#5H*2NvZYPtn>@RygY<%645+T`eElEX(eYCI^ZQfx&_Nr0l#Td2}G(K>dH7!J_CR zbPf*0;j)t9&qcxXKpYAn&N+=i#JCR(za-%^5u#_p+%P+6SPJD`a|;mDVR!`VB`XZ= z$=J}zXn{H~9PD1d9)7S=(KH3ngh3pYv75tz$i};nD)qEDo{{5aTMR##&Puc>_dSVc zX+r+?wHyKa!JVkKHUJtbafH`+3h>t&!gLxin9wZvj+{#H8=gYSeRz?~7!=LI1Yvh` zExT5E?~K;Ax-@UqQdYn$tBaRk7IPkq?l%fi#$2@H_!h&$?!ZXoga18$NmoZav4qjq zra^#C-~t#Qd<8^kMc~y|5&;2>j{8IMCH{6lUe$uRih2TOzN?L#DSQK55q2E`Gu{XW zb?h8~$_WDf76Xn;aP4a!G?{4a`U%ZINw6Iw;NA4y_Mct@4Pw?A z9X~bLcvzbK?9CA5Z+}wH)T^7v`QLo@76^QDKqM%!BR&Le#B@zQvv1!6P1b2(GyXuaBJ3434SHGc7(|lSgM~-|BgaXpjytsZ+Q)?}g7PA?ql{S~W zF!5}wIEDDN9@=!IDZwpEv=_)-0m^g--$OL5pTOyCmWd_e0y-WVz`a3{IZj+2u`Xtl z#CwJ*Eq(4qUK7rQW+bw-^ch|gGZouxrnHP17?Nm;{9))8#A7OiqerapXW+_=>=bM0 zIhy>*(O(h>^Kks@ zFfi^YJYLTDOm4aI#AB!yjs>7Vet#NT3#@ZiJRua=nH0zuIw7AcgvPKGUw<)^M{BNk z1rz1qPj%`HGLK)P;hqI?__|%~|8{E0!4Fz+yy^JM4ov!Ly8srsQNV(8)paMBlu2v~ z1@aT{jtzV%S9~pMpF_9_Av{N)5J?Vh;9RA2&mgIM5-a^9+}7PCF0=w@$(CZJS;q&T zq4oBkBa8*Fs1uaM%4{kFtjeihM^@i{g^4x|)bW~2h7J@2>k>Q+P#C!?xC%y#3lMIH zx~l`)$_C}vL3Jdt!G0ftdHH3kkPS))^dX(M#PRijP=q7TJg;M5{#+g6i$`s8s(@5X zkW?^@0EQ0siT&{#?0>{y*UQ+H@H|cD;HB?OXKjmrat^AAA7=ib>C%LOi&h@r zI?BKDIMA^sPldz7%mZ|htv{{yhw4f=%^r6HcTucO9>_ZgaRKhQp8U)%Uag;-&Q$I0F+Ikr~0 z;t{pNfFVUH$#ZCJBQTOr@W!27qSqOu+5Uel-7{hWo*FgoJ8*J|PG^um#p65mr!u6E z@G`yP4fdA>llcCCo?`nE48W3p@+DCfz`{U{-)-OuBNdw*4hNJb3W1vH!kXIqwP-@7 zBIW%!VmRnbf5{2I41=*p{Doa;p}u$u^~y2Q94F(5s@M8bbaUF>2=ySy^>g3<5(^OR zP`u}dIcL~zKFz2Haw)VXSFGIodGB?y?@*t!KUeGX+s_}#1No*d91iuV+g@e&Yo0y* znOf+$zJ(5r6gmJ3{G_*uc185-Zx9P=-z)qdta`P7O8LT9mZ$z(mv+F z(foY!Zb;v7ngsmvUwy)9_VC@l;WUl-eBW@ID|{$693&H0*cgqj43>Z%e_L>P6Fx-A z`uvqz%df)iy6ShCqaQPle2V$Iernib-G)%$MY|ZHpWxMg?-oBaN-!gzr~UCiH_N}2 z+3#0m`}s!n%c@OokfI8wd)ry}C^~IWoA^oRNYYs*j}0<=@XNU-t7J+mV`*g> zFfc8LA1>!699ky9$X_q7X-UAnbs@Z}H?&Ef^Hd&MHKAQ{{8Lu614mM{*m*L$37Sm% zQ)0-F=cXY82Y_?QB~5r=U(|m&_?tF&6)S(_Cs2HJTI%y}r(**n@d~r)N2VX}ABu}V z0loCz6SQ&bH{XbLJoz*&n1z>3%9 ztzDNM`MO`>sOLRvE>?N3s9j9TS6^odPuoVYg?Kh&wtQs7QbW)`1=P4j9##~3|6 zwa_Hl=`0kq9{f-!PEe$k(I=*JWRxK72l&KowAvu`{@LbITcyKwRrD4sY|b8+)oG${ zuPqeZDChmcEcL<|x|`eAcE%SPX1u}A$DMZT&v5?dcRKZ^iteh(O8R}Y&`Glc10xWBqN6U*Q7CWYg)Qx_D({9L;q2+n;U!shLG5rs$%6i!we)BSQNN5UE)2 z)A7SNCUN9uvU26UNF67qh?9f!f<+@ZEk%NsD-HhjDFkpF!YC5t6bW*Q1UUoz^JB>I z)g>%6-tbZanvn_N$&H7a&FnX~o0;VnGi$&7hkLgC+{_+~@c zW>IbCq>lI#ABg?&shSCs*}?%8T8gsS@RgXOn5~-HIQ=z7Nw|yDOGms}01n6ZP`zMn zg$uhnR}9pQuQ7_rnNdWo&;2(<0fqn;AA;PSrw2sfDUa%P|BXz*zZ&sB1o(G8Gk}L& zg&~jkL?+kl*I_{J84#XvBxUW|k9C-Qk$WC@L*u2r%<4F1x&kuF^Qgz_IyVjw_nAkE zTA>!zZL!~l0f)a)FAoS~xD0Uqc+fBv(`C}bxna9fm%WzNt zhFu&09VdjKCF*w}&i9G$LR@)=_PY>Nm+Q1CYLy&Hu}+(U&qxi8R@kk01*m%er#l`! z1jX1;8qZPI0i@4wS0UkF=aP7Szhv}#McwuXkPjJOQaQn#W`6$XK&&)e5pnfBqZ8#5 zzp0aM-Ryi9?{xVU(`f}rd|Npx9KFA?JW7muaE~5hWqFEIUzae>*bp$_L|ejqW5aa@ zQC1w4MPGJ_%*T}*utpn?8h>`VK|P=Eqr2;iIJ6awN3Z>~GZ*pOK3c~*=c4QLa18od z>Y@}!PQP78_}j;h8s@Js4A}=j<&Yp zHU^Qw(VFkS9YXDW)t|YUK>-MLl?YJQRA>c5$|RgfOXzQcbXR_X2(z0wfBDxy+7M#l z7h3gUY?vPhgm;nZ=GH!Llxk=MzNAFw^IxOPep9?fgYZwn6epM2EXlz$IeQ^tJp($XU~t3|KeurRM|2PZ*f^QP1)UX35C>#WBZby!PgB-u>5jxXX zP8zK9c}Uv)ol4MS2|v?mDCBD5a%JRgP)%3sLj`}YL=_!Xs5^ry5#-O)Kg;MHb{A)+lvwZd? z+TkyV`K;iOnDNOLG@7Gdp{MmX?WgFyQ(57vCB3b1u@aWZkC!HjFHhq;*6OB@*i*Fg zEa$kO^lxDu(+3{-Cmb{%Z@~WG-1*C758Xn5Yl|)^VrQ%S@c0#`#)caPV6RS+>P_*5 z7s-16SJ_`lWzepD;f2=@4jBGQN^qDsFGc$AA))`yEW9=`VE79qIIlSpfAK>a{dfoV zVmUB9 z7w<>lIi@LNHaz!Wx!(dt?+5cSjsK7aZZkYx;ID;uvL?Oy7VA4;eJtvPv8l#CzcU!) zzmTqFiuy0={9BBFLFdyk{_M^_#P}C>-lh75@is%)TGB*e3`r@fA=G)3)({Fhcz8~5 zQxslqa8-2t1^&gs#WDVigBj8Od4uxDYjyZ-W?^4$P%3|+L)nbNyIhfO;zNEEiZ(q7 z#W7@I?%ig#yv59JzvqX0j{T3BeF@JY0ej8e-2DhVwfAuMFnFtFf0xHB@+ZTyRKPv- zKRoWx-LVhiGVGq{o1eGM5qh?>3fRyb9)cqXwGU}r4`IPY*oMErHvBM%i4y+=Y1z(& zJblm4qS~3h$DDAdnRO1(sr4_G(2^jv^3vnjNuldT=(IX<>r0q=)g6f)@djZo1V*B3 z|A%pb>#^J2i~VijdhCt&VyCM#J}x>iev5p>y!^e6n`cHW|0faoCf2lv>CufLp%Ecn}AqZ^3?}a66lRhPq5+x%<(t9!KQk*Q=iU!CAy9Hxk+Qd6U zYygM%(hYcgMrE6XV}DWqCXf?+vNeyXm)q3Kt@UfuY57gt2(}^~E;_LqbMODb$HZqK z8{6vW`_cAhOqsHYX|@uta+_+bQkk8;=B7@NP3?WhE#KhO3F8Oe9|}_*EUkst4hk3= zsar~p^hyuhr_S`LU#SDUm0NhIg=e-Tt);DL6E9bLMI1qXhkok0&!YWQ>u3G>@__kzmAU!lBR@3avUqL#JZpPq*mU zUJ)HTYQV!Y2HCOayr%qTbI#wor78bzcx{B5Me86*wGM`h?FX6qPT>Xp5Me2?g~?d z!)a4*U{W)f$d(gET-cmpd5HQA2v*&FpRw&?H8xDaFV+H5XUsjb2dQc&UWcqNk=H?7Sw zm3eGdT4>m^&Rsi|@1%>_zg%nc*sZl*(+;=nF_|TIE#K|twYz0!Iev&?o5xyP3j+h( z^`|aQnLJj>4h>DRTPYNmp)O`rqzOPI5*#QHY;<#Uxu_p3&yHk?i-T z+<)eEtN;N*d;lDEfQYJx<$hH_1$VI&_0+GtG)NEcqT z5ZD}|Poq4Yh4S_qx^SmS=Zk9p8<{VkvRfQkN=Dt%`<{_z1V2~>KeU8IE3jGJdP@6J zLt-+N`3qugUaQ6*QFTw_UdXc5ru%aFws>_(BbT=qkEak%ORxHg9|?r1*dr-qD=Eiz_c>W zHv#)EAH~;H;g(SiYd5%RK77Iv(CXjF!1by@k%22ePq4D*+ny)j*Q?TY!!;nCH||2i zlXuj~SuZvoHa3hxdo7R;rbM>!29!cDo8o>CLo9f@{|`Q0-|;yYjB}O2zmGF47*F46 zZG2Hq0IoC!!Pv|S(fBtcvbprNp zAB?)yaP|m)7kU+023d`#lrz4j-CI5 zb1fI(zPR5Ez@{`tS8}G$O4VVSKT$My*==sC*}uV7XSDz8Pru_zhw%T;@;&gHU zZ*2QL_z(=cA2zec{trHne8=ZpFwRxRIoj{hnD&cHGIUoWjmcn;NIMy*&v}DaT4UJQ z@FXPIGZ4S{@JDdvn2n9UV7L)C<|>ORQf3kS%)pJKl*^8AZE%w= zstpR1Pp{Ll??6w1D5LCpP$Kj(^pjjoT=KsHYtHB~qN2uPMbTwLiAvlNk%UHN(ga^F z4cDYm;zlM(q&xZ+FXQNMxejtDcl=t+KZS?zD#wckj(ixi@PWtor4dMmF_w&^7y_<; zh1Y!#z^Zx=EpMKTTapFC@QjOIltdp{KQ(cgmcUgVH!Z(jWZ z&Z73R(=7^9LUR4iv2lT_WeJ5p?r{ed>b``QvL%987K>PO>{q>`WE1qxqvARZ>N zln0Zh5=%a3jiz}U$tk^8>qHPF-%l;9}R~)Z)LRp_ah*G!*%^2zfgnxs-qg@ z^EAkR(%$!e8-Y9C>w*`_9QY^Tjwg4yzW*`s@2Kww|DEko{D1aO4gS~tGm3xuIq)Ck z%e|EdH>9}PD~ufc!S5v}|m(a8V7{_y`P z@t*LXrW|{P({Z z#lPl2fA}{?`9DL+fAdGjf9W;-$^U+h{A=;oY4Cq&|5@?p{GXy+|HhAwKYr48Zf7^fI{~YDO>pwdF9XtDz|2B>Mzpj=4*ERCrFaEbi@t>*ae|-E0_J{vd z&uZlVHLd)=rjh?=&x${npQ%dzYd<>vOLz1q|NAuZuf<=d!T+IsTKwrgSUO08CvALm z{^=EN)+Q>SzpT0Ats@?7O8nE>O(wd3#>cOpS#R%e|MQ!y|NYPBQ)%M~XLbMc4%+|B z58TJx5vZ>1ZKk`PCo4<0<6&67)e&&4<01C2&^vQm9;}f-Nzapv3JC=aH{%)PXVgJvJa95-_0{!c$?1J& z!=>SUX2RuxtvGKV%z!L&O7Mkz(hadQ~6oyqoC9C7`Lf_>qIA5zix8Ex5Svr*(chqT# zgok~14^X+dfA2(qcI^e~5h6b)LU|)+yJEL#&sVH9#6}dk*^2Y;G3UTy(_W~|kER`? zn9r5=B4toC?L1|~xza9B-gQROrYp*;=SZ8a{3)9DLgkrrrCq2rM$PFkN?a7`IAy4S8oj$a28Uebjp|71`O2|Z z&Vlb@<$-A0(aK}zN_(+V7fm}?xlx-I^*T-M$U`FA#_%hcKZ-)%>g`9NPk%D1&~snW zDD>HyI|bfp1qG3a_>WRvcsX)&SaUBL25BhAPtE=Mkh>&A_ zIZDou*53Uqox_}^ocLSpIn0p#q2HKU)%nWI_jyF*n`c~3w;bzzmUDq}|KECtWh%G! z2^+7}_X%65IQxW6P%i5ec7d{_PuN&xc5GPgrBo&PLjN`2i~6qt_21nKR8C;TA&f|% zh@V6v>=)p2;pI;=Rcteqf4mfXR#d>BF2Kyj4Eucu=HgyphDX7SRQ9|S(+2tX^Z5L0 z&a?QYnfR=u>fMfp2^M9_<7!Vc#J4yyNgo_4=3;XuF!>OE3|!sAqtJ*bZx%EZLZhA#$0+Q^sTwQt7d7wK2EXY4zG!xnrxN9DJC} zEjgU%rqphp+RanDc$7`DGY2MhP#OnMkZ!)GJ8Uk- zH!`zYTquT8T@rKHwwF1XtJGV|mKU#1U$9_)c6!!)jeDNPJy+wNqj6_x+_R(Z?5J}= z)Ok_Vd12J4DN<9Sra*0ZtfV+Suef0OayHH7HrZTd?sBM->FjdZDYKn2E3i9UHm{BC zw6n|YvK4A;r##fzb{SoE;8!nceNRvh8-Z!R>Tcux)O(-tDy3%GGQu zI2|?#PwoPwtqxYQv(#42v!%C_>R)@=Bbuma@;;6Jkm<+PJ&B3H?Y@JmC zrb`lA=XJX(txWQ=b+V@#%auHA9S?J}Vw>dMW_5wv1z9SsPIo1foRqW%YD%hR>!6i6 zTst6zgRQe$0k|DfRynGf1clk0a;3~bO4eCxK!zkME8b?cJDd*Y-3Cq@5$fH_ilN4> z#1yX#g?infEEvdVu>*<+$X+jmdP-g&o;JJ_Ifd=M`mjQ87dC4uW)#PCJmE8Bhk6 z<;xzDqM99SrPV2sQ$nY82dnXd12;lBSdE9RbUVwfTM;Cbwi1K{a6^xar-rA7LAzdQ z1(o3@M$}Y;&+UQS4oXvL^#agJcBxfDII~Qb;w$x*@xtvgujxtv5gk(Fd)c~fNEw#Bl#JXxLyTrPci)Pg}aMudAl`VJ4 z)sjP!K}*SOxnw0)fP^eBvk8z6FD9yWfYd>ISdPawoIr^T>KBx{3s__$$#IlxBCXJU zffBFbatqpXnGD2x$OF1Vl~cQiEpwoJLCq|)m3nO3nBB&fS!EDVyOk}KtFYP}44U6k z8JsR~y4X^{vJA6VLVGB4OJ37b?EcDFC7|Fz9zwe>0tcq4*a1#ZUv}siSdrD^M#3xH ztjJO2U=>yHcDXQ1g@aja9-alH$?Ao^1$tdp=#{t-*q|W;-!Lt7g@xW)8{h-dZF93i zS0#xzC=;xVYG!k?e7h_mzU4ci9z4)ypi5y(cz&qF4K^n@%671VozRF_nU@u~q4Y9H zSLTNLg_=MoVB&#R=YkFflvJq=TScjx<=aq{9E(i((8@uKN?k190X=mMI33`$1FKo7 z9U6sGaJ{sWH?&^;IN8GWEb^`TeU_i+v*2KLe@A;#f$#Kr@@UQV!iQcpv*2Q} zzB|CDUL=0UgQ~Ill7Ae2VX4Wm$(Pf(?B{6hnl$;lAiwhW?P5*xl5{FoUB&#vAH=S? z|BJhKfsd-V9>?!ZHX($>U4-xwa7B3pLLdrCUKkPrC$^6!Pb(v_-bUe$WW(IExes_q%U9j*f%lh zm}jOSjYfM1%O@TRTD$vqy!O&3S)Q~{1o?9og))p04r3&+e@#BTScho%jqg3kTPoRvfLT=N`dS;oOCYbjCv!m2eXn`DX zUxeO}piak?=4*rB&k$Z7An10RxWyr`71Fmg&?@L=sdVBsqTXD1q}AywSHF(|LzTap zb|&$D(jLp^s9o0pq%XWdX>n-3e+kfCA(DT#a`3eY?+5K{QvAS)@J*{jxGx|9fF>hQ zv;kygg#Bzk?=ApwQxN&`5QLbhr6K9R5)6AN0L%rheD8wp($@91HUYRy)gb=m_xg%i1x$LT1d@@<$Tw+ z**5<@{SM9*g}g#-;FF>uX<+pq5H|hWrs0_Qs8@M2|F@y?h6ks%)*lB7+P)L0|5KH2 zz>%g4wh`iGuV3NHK>c!9{h|W(OZsge_3P&=Y=GJ&u-e(#d5m7aJAb3s?|5+is>g)L zQ#B3?-ZuM?1q#1scC_C&nR-RHgG6e33+`c6aglm_9B#;CpUKr~H|g6gh1xVI&Ub~< zspeqXVy$G8S-uuk%Ci>bXFG2x1#KYvmPPru6*)^QWl&s-1-2x|kMvDot8%_xU%03U zRQ4&0gemX~q8AszMQckcH&h7Mu+_0!xK^MQd}(C`eZLuy2}Mp}QMNGd+N5byQ-w+= zK25(dRhTvFyq8PDzv8ubVC<>VqVhX%YV7G@T)7t1u#)tQv2K%pOmA}A>ctz&NDObY zDcRk%XBJ3L(ug7iWWFJYu2%EAYf~1BO_w~Y@If?%&zK)^7pf@7Vl+@Q*S0e!=if2)_m4pF;Q_ z2H=0g;A4Z~pGWvlv2q&`{?-8epBa335WK_nBEl{}*wMlCztlVYzmORt5&lad2>zAc z;a^4mJh2n_vnLq-_1@u|5q=%Q-y017ZYaEs;Qxa3|FqNZ_Z1;j-Mb-Bg9++1QoS0X zQmOp_^8Pn_#Wx)Br6J@%-RQ0zNqTM!onQseU48u{{{$8tz-?byIv$vSt zPWofh-ayBS0hR~T#P!3H_QIn>KMEju`4K1%BjP{yoDrq?5NpDz9|H+-ItjzB0hJ`u zAAtyi&NZUcoG3LvM$NXN17k6ap)#>-jB5_GrXzQ;R`;!WzdZ;-e{U^(Acdg;DLf^1e40fdfd$hAp*o_Q!i)#yqeTu{O>{;v|YTL}K z%f7D4xgI7Acljne#saK>rJ2&{a#lG}gU4`gIsi*9CFh#T)oh_-$nK=hq+>oYt8wqc z;DWw0Q(>1P3v4(+PP^&a+t@~ziz^?FcTzm8LO+#xb!4ohyS#)#AP znbA%7g`%_WC9~+?Efs~Pz03~VLuV!>OEC^BW>@wRkP_3t-s!D*c7uhwZ{QPl*0hF9 zg}z|Kw|;G}BE%>(2jFqyyG<8pH5`Y&_H-HVYu8;3pmSr`bp>;6ELwR0cqal^>%iZR zMn#iF)a_=Vblo)Y=Xw~DGX!a*ItSy+(M3YZJD@6aELm8$w1))wBujH>_8o+eZc2yO zfdt2{Y>S{ISkw-t*EvhkgaJCmFlDX{qtMR9(4Wd&OY_{pY!r_~2{w0F@Hq>{tGQ$A6$HRYq^E@=*6^G)XEPVKW?9UKauiiN+6g};e~ zzmA0;R`WF;7tp$AS~NOJKPIBSeQvoti21yR>EZflA$V@HJjkDY%1=pcw~2bZv2zJ> zB*-sZ#h^g+?@yH|ZV~S222ZcYVx^ z%cM1DIPw;2jm%Xi%b$G`N)hA-)clU*{NvRaq204TTFLKFT5t@~1Ti6>2OqQn;b^gw z)}ZE}Q1ZL@&47$=zzAtZ+tuelQO@D4^bORLjHWa#<)CeB&^BHth9q$AQjME5*nGy! zdZ@+C9n>dgCVyNrXqzQEt-sWfW|!L2Vx?1Q(UMl17QI=z)06%eGRe0j?e(pN(FEh} z-#F^pJsT~8{7;YJW4b>};GTfgR#3azYMVb=j=hz2Gv?BP5+_RgCJ&>4Vb#N$GfB88 zEk3I{hwN1F%CV=}Z6It4>`PBxj*h`h2*WI2RN+RUy1KHwymEuH#J*~ier1STau$)N z`Es1@@u+OA6X$;lu(}+SXMK)MU}Ko(cD(y{6zzg^Agy2mompWQu6$?0nQCZK=9C$**1?uIP?Gs}HqhSo%RIT*TXu@*D-)M-Sp4y8)Miq@CD7d_iBxpo?iVEW{V? zhfxWG+FDnS!YE(EN!4;cx(ZbjK6l`b#keoQ5${VJ`>e#Xh#gzM)id*`-Ph1X8gHm1FZ7vqrav<8ysi zQYXyH6hd6?#t}0B<^3E_+D<|Kj_BOTFQm04?S)oB*DB$Fc^5I*2QYU^L zqFVk$^Kiv>5isC9{wI<%9eLWa?Yy$=vaWulE;v4ihRs>U8`d!dH1)l{1++eyi?)`7 z5jGFVb7({9rWO>uP~NzZ^3FZbqdeaO6j9cEeV4$Zp)jd~YY+0D7K%{lOs;Yk%T*|a zC@{BkGH~sDYy1oY3K$QXqwIE~131R}WownmM)UwG&n>WGg)08npoAsRJ4@pr!rD@| z9?KwuMR8#bi(3Xvzh6!=?}Qj=%;U}3txWWAEu)?N(bylFRP~Eruh1`kjnHy!y8QPI z=JyK(sTqAagR2ynRQZ<0uJDO-l0U2&$$=u%HcK`Di~+zXn3pVR(emGv(*cR~bPf)m zuJCj=<#gv2D*F~|*Z!PtayV!S4}?8UoleCk>6m?2H(Vrrff=?o&9>R)R^@%=-HhZ`YaMEX+bmJOX(oOEj`Qe$*1BDkXR2}-%6}KiKMd7A2-ER9 zZJ_jX)u8PO+Fxg!BYN9p)TPcQNJ(2qc+T3TiPrmY8uOg(FI|mMOa@b+2+!FX$wq-9 zNFQTFD5oclVmx9jEm%PM7Jdqk(AnxJ)ZV?H>04ADW2>5TRLwt%!f9VvrghKANG0bl zO8(n0xMm&cn;I`&!D6#Jl(c)){I`|-qg-o(?AE&D=+b>QK`st1)2#4h_$HX|8~iWz z@%nXsV#FM*w)dFTyA?|2&c0UfDkP)ks3==%b6UfCtOt~Lv85jlXT2lgqWZ<1;eGXs z#o>DVC1UU1{;3gI-j?xfo$vhu)dJ5v>3Tp0`Aw1=b&t znEEYp?;9vcY-cL4*uY|SuV~dZo2_Bo131I#r3jo*xYf(a7td z$2LcF5D}$&qKSg&(Bj#4W4&dFBUihdhoGzJz-`SH9XJyV^=t->7Wb>L(J)ZT=(aYt z!H#@vK|X%I3~l>-R)MV;8M)gyk&&*je-M!$+^g?*UxnZMx%$I*fQF=9dXfx!(+P$_ zUcjn2kmcTPfJFOqPJljo70Zo~V;JN$4D!xU$OQNfj01K~2Esv0R9Bo-4l9Q)SwF3x zJt90cTdOJo4l0L~!TkXDJ4G z>R^VSEq+jRiE4f;tGq5YpcV2k<~OWdbG590v0Kr&GB8S41_tX#iw=^J4((UCC~-by zUXQX^GCj12m?*PAs+dkL7qs=dEzD=h+GZI9T{Q}1pe4;Nx9fA(ud;E@q9&xdYK+R~ zDz;f=$Bi{;v^&(P-cIQ@Qm`W(+R<(L@R?4VXOKC*wcg^z1u5Gts~`MOeWnHE#Xc3i zNEndKH2*83T3A22k?mpGNnZ`@ zW8Jl_kA1AAjAmLaEZD}?Vb*ig=@rkv=;0!o1y5Ci{Ylsva+2SZ{%6WE3lKI(?1E<$ zs$~07+F4TT8J!!7R~z z$z)E-j&a}x2Qd!qUD|f(R^qV5VB%=P2BWw_r|3gRQx|<`*Dr%R)r1WOlN>C+l{jn_ z-YL=ryAcQBb-W$z9~mNFHqr9^j&%fhu2p3`0}4Wa8Z|$|!u`2Sf=V6wEeS>U7%S<6>v1E_Oh=AAOif z_rx%PiKyqk;@bhB{a1RnMhQ|WizccB;h3i5n55$v6FQLQp5@o9F3(Gw1YOlzzIu0_mGSi=QEU6RLpZf8OT^+d-$Q$n2jK?oDX@onpU)Jf9#)mlA zL*sAc02Y-*hfhR#G?ruryI<|Amd=7XZDbY<7WQ9mxxtehD3a3u~{PC_M;Gq zI1fH(yO#w^M2b{vI$;mK`%k4Y3_bfs+#AI{{np)jpB_ny#c6m~vzWqhQ@Ti(KG}WE z>ar;BG5IiJZ)ZF6LH8M|qwEat>_B{QLSJs6zn0CWr&DP*or*GLgpz4d;_#6!P4)Fx zm&HIS2e>O!ps(Tvs63J~;U#?RQuq4%Fm$TEo;RgMfev*a%0B$&p=(x~@G(~#ao6lx07IeyY!70FP}soRm)cmgl{$bhN#Z?(|F@y&xbufPl(t-W4rI4X{Hr;II0u?vaOLAI*ouddeE zw3qJ@guDV*cz1>nKv{>RX45`!Vc_ffTBaqx-sKt)1fH+g?2h2}Mw)NChi{WQ*m5YO zq!Cn7Xq966D#^Dcv|<~IsxS^{N`O~Up7c{Fk)##oaCX<1`T*? zO(4O$wGT2%wy+VgMBnWv`!e@6cKh6-^-jCI4!E5|S1}elOVH?eTH+0OnI*NY-pKX| za~I~@$GYQLz){qvmsHUaoPF|Sm$Q7`c-q)rivf5M9&fiRt*l7wD>y0q%Xb&8ai-v& z^|D2dCATbExFRtz(Y_>mDcuM%=avQ8@E$GniD5}qQH8s_NOIbjFkdf)u+l?M7H^r6?AYy zo9o$Yi;CTN)aaJb8>ze!5|BBFgE}rhf0^s7a8?zS+bih~L3c{Do&HUpO#Gi*Ub?na zN?(|t!#>;Zf^vCqVf@G%$v%NoXdhb=pJ-qJ(x9H9|JGGG-Oeg#(n?ucCrftcdS`{b zbTvm6$c@d_BeR{~#%Y&arEWWcK<(_nSt*dSqH;2ssw2|_|Il9nigvU3&UljHo?PWz z?L;>gr=4e@&S1iWLm`9$0}mf2PIDo$ z7qM1kIqhy|xwDuM7*#;qqe^J?$`Tp)jNLCj(8*vBtg5WMGl(qSFJ@O3XJXRQoCQJQ zwpj<(5#ZINA=T0m%v*BaoEv*))N|@1wfCZf{YQ-P!?K!&(d2AwG&%yCOr`-Pb`%$Z zV$4Y()3{s!W|35h?m?aDU+J2PO1e}PC1r-&DWOzAQ-Yx0>jJp|Z5zlIJOpm59gV7ZDed0L zZWSYxVN5tLJ!`0g04a35iei}4flX$jKwi7bSvA?sh7W5q4p{6eT8GugX5s1Nq(wPM zVot8auExOAc_*`*QSeR$qq4LLFjT^%2qKqN8EX=s(APL$#5y$1GgNn^BG9g;`Jw{n zqsfM&SWx-Q#|Jt&)q&ZQ2aI6dAbKv)ruLwIwyMa@3rKfMu_ByH#l@9X#0OwK z0jFHBhAa7ibdD#9iOuG6u0@paw-mbnh6)N7!Yn8hnVbMSJc~-cm993 ztfss$x2&vyAvHb$COn#gSy`#ryBWX*QLQX;m*QmzhF$`~-%X>P;R;a-Xv|D@m;TUc z>Q#Isne;Q93jv1uR&dpXVEdO_Ds)-UQw8I`6>i|>WNfa<S`^Val`T?q)q)7sN0@|Q6+YFdf2+u9{*|+qK2d~C}E`=b_+Yntw zX+?3lOtVW-6?B_*Fn$vbTlU|9z1gaK1z;Id%9o*?Q&6GNVU^U8wV580#cwoSgHHeXX z$o9?50HKuC#JHYWDKR92iBUZ>1QJ7XnOM>@mzgc08BMI{nbFJ+o{`Iw;) zW?AQ7jqA+fK<`AWeHtQ_G#><}9#p)sn?iGk^tgmT*9A$*wR*~nI<1?edFATWsXa1d zZ%YVt*8ePXppzwpbl3Ca>0JTI-dF^E&q-3zSmwign}}fAQjn+ zh%X>|$Hx$nq6dijMzOI^3><}dJ#k)4`f{ijYz&imQFLBRChb2I8N(E4rCxO8=w5i# zJ5Gj-08q46%Ir=feI=o87p> ztLS13|G+kJa7!XIXJWM80bG@9f%CMXE!DA2GGiMZgv}<-60|9VO};ZIAq*0R zP{MMS;Bp)ggvJ)yWE`d!)NTQ=uWsZ8?Jw1>4_H~x(>vjFL;>Kz8xda&;hV}6TKYr6 zvy^Z;h%`qGBs@R~AD0=MzINL8jiSQW#R5c?UihhNVtu%{<2IjEKj?7tg)X8 zfPFbDex+SGDWnGFRr7FdplAp4^ zAZ5cwVQh&Iv?FScze1bCXg|GHc1w6;9PrUuRa&gOg}TSXR6kkR(EI$Bh4;)=jK`fL zXHQ2GKFP1_`vSPEq6&(}f@|v4o7mPiZC0W1>m8jCv^W+Lh1B!x@nQXXF6?@%?-aHa zo1!nMOtnuDdhCVj%OHk7xS4~nn^wi>CyOiFV9uJBWWx1Rr(PetKbKXxZc|n18kc0B zkcGzr_BmBfr#+90TKgQdoTnvT0!$UfAgXnT$%Tt>qZXqPZA!G;Z>yAno10*c0C_J} zm9CO;a|t)0b*UYV3lFBe!B|`C*4Np%>8@`QI^$(?Q5FaLFHTx zL`rfSwdNaCOO5xYoz9M8s|UsB}~gR z1Blw}0Kh@`;;P3f>&YZGx6sRv=>=V*mF$kT_^ouc>>BwfT4+S74R&~_ z&)i3sKUvtVWP69s5_XQBCA=E)|5L+e3Aw|AzfB#{6HfpC7gq(I-yapgVebR}LjSiw z-qY~^rC@^&`w?+U{PIWt?1ptEgj1Kt@wgnrNOkicD)<$&l*MY{i7P zi7ZFfT-y zsP0Rap4ELFP_@PQ{r(2{SSGZo7CoMfCw(LGSB}FHk6?*qBSoQUBPmoibviz%ahzzS zT{*41e~C_KN=y9d%V3>cKRZ0kQJ@J|8Ps;UjuP9STPf-cu#?ryMzR-q1U|Pt7;a*Y zwiPq~1yY;#!cW@|gA#|_MTSw(aP=j60_P_weaNdb386hFZ6%2UkQASGur?cynUMtS z0uKo0BK#vnLD{Foa{4cW$$0!B&)#syVy$hs!4{HL*s=i*-FFA?azDm6U>;_0=Frvw zIlRSVkw$d(!#4j$dFv95H*!w`!k!8tta3$wutP#m!tO`HMxi%hr$6Ee?ApK5*IS5AfoY27D%Wb>zAR!`$d<1zOOsRLzgd)so_|$+6rseyjJHE&xw|j09J7bHwj? z31}@H(eOs5Am70kN{EhZpyU-OMmJDR?HGdxGyx)DdeD+}`w*z=*!a*kTC-elqu8&x zH9tksl8W_^d)Ir?sh(22fzQ&v-Tk$irEjubW2U<5S9BPCd48|p#U?Tnmy zXRElE+Y;H$F%8Wz*gC9xM%wbU)N(GCrR%t(f52A``M1vw{QGSj8syzG+E=Z{l3!T> zQIg*mGq--JsE|XS(wclonuM6W$E0h~6>v1V1`hX}jgf|oSz%b>b5X{#|Q)a=>MEn^$OBH*=ywAYg z7CviM{72Th2jM;G2nIwrTyyO<%ZSi`2p;qv8{x>)vY4OGWhqt?Z}EKR-!j~1X}D$M zplz1nP--WX`VEx&C6xNlgR=*SLT#!b%~A8at$Qq^@3ExJ$yD;YJzaKay{>3zy{`W9 z7|_BG&hF>8`@}g21)a!>5Z^$e^e+U{YSTsw@+*Mlpd|%6Z(*LcX(^vCgr(*SuCpm< z5?z39j!(l}KQXdPjB1;dAEo4Xfovd4?NQJ}a?3J+i16$vhxQTSrTap6peGu7Y~xjp z-wk9D2BOsbK+npBp0%!!yX;OS3C!)kuhH$lhw1j;Rwfq>dRXj8)tllAV((oF(u3Q&ZMZ2jKr0!Mq zv&7{6>oG`LE;r}BX&|>E#(98D^HdvM-xJ@G!3>|p{kgz5vDKj!A|vu+l-5beGn*JD zk~b%i5b(w=bZ8j`yy4~+h|G7*o=oWyb3ZD7pRtEC@+zH?S8{hYPFerAd7O04fJdI)FmsDlMz*Yb(BB(oHUAwPtqT@ zSq5dL83H%?to)^#eTwzlSypV74kb*@KNUV*@3#dGZPyZ!-IHrqG3}rwj9tv6q+|7x zo3}(z;2t%*o$Be2-O2WZ(Xpi4p}n(Qpw0fF8o-?A3gBsEKG~f}aY? z*BC2%@G)+6FMK>{@bTnj<>N5M$KF_YlCkhytjMdHe=>-La-PU$U1H(MzFDX>@iC~5 zxGbXATK6!M`2E;?j&k3AKDj?1!`57mlDW_y<_kZM%%>sBOv`K2!lLC^#?(w^SYGcu z#KOPz=F5UHAV~#)X)=h|@zRvJ@G}vA#?Dpy^+s&7LF`xIbLUc1Osa`WK2WoowedW7 z>|dKUC_@g<^38)5Punb8=J>8^NUM=!7D_kz2J-#IKu7R)R>z|wYcZPc=a#- zZaHl(!uYSJ%xMtPd{%iFjb+u`t8S%25m+h}!Mpj9o_mq`U$=OS453_*FQ zOlM)&SeUeeNVBsj?nQ4*q$7hVeeHA3!R=5o=|Nj+Sqel;H%#HqyG5E+gq!olRZcYF z3s}#gPJ$c%*p7Ff!hmBuL^x8+Q z45CB%Mrpsq`p~w_sLVI<&mZ$q%FDJ_}f&DV^ zl!#}ay~-Cnf62SEblo~Uy9qt7Bg>2uaujd}8Nh-NTT@BarFdMG7%eQ!Umz^aSs>5^ zgC;8i9j+>!IYoC;lzulm7@|O1WNFQh&lvu`Mc@)Vb*A&tT<6-#^?~}C?4KDuB{CUmGxv#93_)ery+_D(fEi{2+O#RFDoZxaOq+sC zok_(6;s5V3HyHD=v7+xXJRx1L1^Z-Tl$C3z&eD@hZ{ZTt>Rr)OV;;0j5V)6dbs<-L zU&B9_+&h`-8#Bx|fGO65mFa59hd~*h&XnQnGfm3yVfjn%v6>$!UCNnDE}!ZCL`D35 zrV#of`L@sHz)zS(7Id;7*Eor}-o4c`h{3J!qCF1^gu=^5HXmV|C|izF^RW1j``YRR z7Vlf%3mmMg6bHum{rXlQt5MRiTa!PiiDTJkL`wrGrbBI7c(nZQdbdd7ag$G5>nY$Z z0i}g6hb1BOiwM_5=oj^~!$pUdJ69KP?=z%6uS0}9F`_elbr$zXyZParP0fgEYJE76-w(QMDUwzjgC*)!JmN3I}qt);C z+4%hqlyMp(o$KCc|Doo0=W4M)3e~|>%dh{yrvY~Sww!sZGtB(tPM)Ao5^=kJN#cXe zDnoWX3U5B^u3zJyD4egKMtMT35oC603}1Gn-OLsO>8-S-JzP65PhgjcbmVGJGB&h< zR28%@as>T!E-EQEY@vU(pwanP%QkF~B=V27F5 z&m7v0nR*wy)97ND(V=;al*Q~zzye@u64a4&OhkpW zm$X@LD;kDhrs<7RtTz{7|Iqk8AK?N`)quPh**~=7HXl zYCbQVXcyAta(i)kk=va<20ahPz!EWS9sW#NH&aL}FP)iIB#D15Tu~<4MJ6@mNrDUI= z72znRoQFydZ>O~$4W~Fgd+-lwC)D1TOdi)e5UZ|tus#%zeFZ;bk0`qq*c084i=)`x zw9DwbjRpC=tej#h3cm^<{nX!aRN$p|t{vDyug%3>a{4L=rpQdbL}uTUP9Nk1=n5qH zN6_4WIlXgrcv0Yklwc(Sc>zII%{8O+Fr%PXFlF9co+SgQ>c15)b9e2-gej2Fn4x!~ zckt8E7^qPM`({VLBltCPF5k7l(3o0R2A?nO_zjk$cTA#vGS|ll`|%teWY&@AMbghy80$O4m|#!ov8AVv9A9`4nLJD7?NzlO`_gXCopY!HrquCbA1l4 zrb8u%HtHs0FX@4xy(D5^^Sr>~q=0knGO-NSCDAm$ndHa$cagZvU{vhEKbK!-Al6=F z#`HLo%=j>j%Z!g+^!wXtMS&m2T~_`unb9`3=ly6F zcnI(l@l#(KLm>D>ym*><2weC?ocHy#Y1A6rbPU=^!yaD-0*~F-rmK}hDeQGRw@B1V z-vfXVc)uim9_OLEP^V%XUUsz)iX=>lQE{q;a*p1BbN?N16&N0Y`}=T*87wc~ z?X<6|q7Va8rF~85dZ)d}04t)KZH)^K(4*40lYq{!S#Wy?4soIb6qzAZeEto%#KHtF z$h9Y1VP)fZgsW-se+a~uOzX@VCd&Pqvj*e5;E#xUlz{TI+0SCgJbX1E5F6R)w+#%V z`~Gy>rdT!+ChcuQyUIqRpr>}4i~VLNnLYxU$;kVz@1TReax;@Q0)=|Th{jW&^ZNnO zA4RlTecVzDtFR4??e)-zBOmguRnrMwI(`?VvAgkaQm2Q9p1kgQU88%$b0EfZ5O2|t zKTSH8I;sN@)J!Bi82=U-1z9W);YrY!NqVjavlwLchr99mP0v}soWN_tZ1#UK7y3(> zUtnW8;!i}XMbz!-)vPE_mk3j8SD4lNA$|zH8bKbc2MydmlW?>>hd|RcwrnmF3d%67 zpufe4NP4l+@`7$Tve-Ob8S)s6c*-vfL$c?e<76*<9?AAO@c!W%c>p|S8}SH%v_f=L zK#KHX((NcH6NxMqfN*F~g9Q=-7LVhK)~-usS0hEs|V8_MOycj#evC%B}#wUPTva?Ui9sd>wXV`D)L(@lu56+)6plx@Y!4F}Yoi;rs4;#z5(m2{HiO zWO+oE=WG~gKRhqL6{_t4=(gTtTf#8bwVdxc*B=qu<@qYR1A(pyo0a@s&2VC`F9M%q zw+$9CME+?Ek^g1#cTz0hRu`k?D}CZE%;YbYaekU;x_QcTZl<;FD&Wl4@t$)NrQEGH z&$)4I|DVPQ@c&$z74Kyh+BE*YnHigJjq{w#u-3sMLuh+PG}b?K_1Ba5aTkMU3$XnWMp)?(;;` z)Xj;Bi8bSe{0jYsn;K!^qB|DO%E`V)AW+>cueiKYpNRrCQf=R$Y+7o$`z+SfTK68Y zjS1f2FO%TitL#s`%_3EJ_Qlj^#(0ti`AcNMn1#TZZ}ieRVX(Jc_Go z8;{ng{x;awNH*BP9^(G&ok87`;lGz&HJBVJose8=w)I>!~sf~k?2^4Ug+va zA-*!Tb@vD}Dp%>m|G zoyf=x3U#jC6oI85<+W-vu{8HE2i@%y_mL97UD;LDTTHg&6 z5x?FMb@!*=0vaX1Ta6nAn3D6mx7y;fyM5ybfPI9;N`AL*aC3II$oP8o24Hu0m=L%{ zuO`YagS1&r#0=KA5eE2)?zYFniEWSaHfILYLv`A(@T9la&b)USywYXxcm{8+TL7={WVd>62t#E9+9-U!G-jB;CrSrt(Sr zyUKge82wWjf+5TCB;LLi1! z7jN8F<8Tmok67M8MZmGVSPRxcj zVTyye;?Pb5p-n8W&4i{9@5XXyNq~vU6(iUc1#G1@aU5-FQ2hd;A^AYfTE-}{!^a+> ze62J$sM+mFN457RzIoccZ-C^XN69+C7Sw@_s`$sC0ShpI*_wz!gm8Mh@+G^ z6gEtH;J<*759~PWF}Tx7j>^;2QMEfT5B}mm4Rt()K5D0?={S%;Z6Cb)Heh>ECm;!u zyuZe&?2CVY(-d~Ic7R!|>q66KZ<{^P&o7=yzLi}C;rqKfiaOkjL7*c%ZDLj2w%LPp z`2ITlaVGeYj%8Slv{h9zjo9p_NkNy__Ap}}gh??>FN2kL>&8)xTD8l8P2JYCUp z)Im#hwC_`;Gm{kxb1pKaI+c3TK}%S)pE?Qkiqr_~WHR-SD8wwcZ<5TT@L+Z>Fy5-aC*gGLAtfUgx|Vn zz&$ZGQwdq;DPq_E28zHr`6W{Yl+!S6v?L#}{&XfTiTR8gq3tra=T=X8HJMSbr+a5o zg4YxB)r_!hF@x&ftho{!W6*V5p*iHp+P`nTCuR`Cla>5I^*fDt*5t@76FF(OUCXsN zk&MHesY0yJckm~gKe~+1QO2Oqd#Ki)Bm_dS2l)Yv3hv9wCyW&3Bd8Sg&mlef=ih3R zLCOz>{t2B(pfEtmM3c2XjMiPqSCCM6ud&z?#O2)M0WQ-gWj~o(2W_g|ASGqNPXhjo z&r%2Vx~X;`u&G8KSqJEjr#;8e#jBCaJ-p>9?HbNJHvi*BiQN~+dwHbYlr)DL`C#>D zO1mLB(TnPgofO+bO+-`(*+e~xDaj!1X+Dh*ztN}DF9RxbjgWAG03UNotK3r17FTHK zYYc0G7V)c`cIVo4(k7w2wBk-@MM?UYvFz*P2G_!Rb>rN5u6UMsZ$GY)6tw=v#v(r1IrqIHc+lQ`9WN}>*#!eFt>z)yf9%-%nIUzWXmrHs(QFi4c z8msr8_)J^y4lVLMeyD?&#AoEWJ_FokLfNg_UC(1(V8yGABn=AF*@esVuMv1xD-!|m zsdr(qgU3Z6ca8kFXi0khr&xZit_9#KMdA=aRKBY}->MbAi{zbT=Ty0xW@kx=e;$ER z`QsV*d~F(i16p1qKs$q-uZ^VdFepwyrKO1se1R50*iR7ZdUK8i+CSgnIgXohjv1??LRR-h? zZDcI#>e#22j1Yz0AJf^rtu`GW1ZfzaSLnpJzYGxL!P76|$o){*?h|^p6O?V0k>_Sp z9^ZVv-v?R8Ae{xHvHFZ0+b;54GI)+hUJe*g4yb3YYaD`)M{rKP%~NwykgWQMduTY@ zUh(tcbPs#S>ox(1_foh1@i^r?PC0MaKej@9%nlFqw`@pgy8+kkuXlrDg>wecqrLtU z-tleJ+SiJKWiAd!y+Nl^gH8=;&?)~4ZBTP7A^L&W^k}8^0|Kq|hhaTiDS*D^Q~*8n zKFE(lJWSEguuqQc(OA~HM@fEg4ELHakXda*2p(#=$3_NPuDh?sgFfd<0qC{_GmGB2 z5Q}0?U5G_rUfqL5dC>tDsYB1lqGx?(7M<+DqJ3BO?9bIk?n+Z`pOgACW=AimLdKfA zulf&I;~R|eW@sOlNO8C_5J&n|J$pI|a_E+S7!usmA0J}w>DW}zsTKVr^>i+BCH-To zAl(i!iy-fSk3I*RN!f+cnaLm5+{})YVEG4{{FiBV>7Qw_(idsb(x+*O(wMXa2^Dqg z9!oT{Sw)h^d`2?Iq3w7OcYyU{+>6p*GbmV|b9GO}m1(Hx5yaF_{(-%K+G)fUV7lX{ z;s2TLc+G*!p*!C2YA?EDWL${u_`?2+(j7O8t*-i1nFy5nD7`R{bcj(r!U zJFa-8Z@sG>mAh=staq(*0_x9Cpx)(sAXxAEoeTdqaPAXj|S8m{Mt{ z(!+=8N)G68Z-gp2i?u~>a3$yCp(b@=v3AoNhB_gXZS9>|x_dj^V3rDyH? z$AM@ha)?V8TF;`9r(HmiAdDAQ3b-Z(LBY?B0E z@3|=15cbl4EgNpSPzg*nJn`axCmUK{y(rl*>%~50gWPV6`(GMEJx}}PKK*%#_Vax~ zLw(p_eIPE;Htq`@>iJs9K0egH8e|&4`Pu^dZmXSXz!qpT7;J%dzzkcU+4mWPNd#&J z!fRWpd9c5CAq{@!XT57P)X`zg?k)xP`S8MrV0m!*)1c7_6_5u3Kd{oV zN>^Zg(awkKw^#O}?EQh5%P}^ZFt(xXAL%nQS@a>U-#-Ufd>gTl8>z$YM}i-_Qde@Q zK|nwp#LwO<1A2?yH;3Qf-CeI&`jxi;3c69mE2tFZqEL9{ouE&y_YhC|l|lN?DN=3N z#=#$AL-Zg1-YGGohI?bp0z$4TPalKf;HAnGlojS@wwX279el=2vO@e1WyMFYTn<^` z`*Sa{VoywntXSJySv_UNhtKytlDp3%D6Y5=dL}3~^o?HbFh(*4!hzH=g|6dkX$zxJ zt7tSvUl}#nVjJ|YfD%huKU6 z_%`j1S4{)BP;;=?ws7+p-rf5c9vQIj;_KhP^|>%9be&p@{omTxI1UJe$$tx;V{shA z9IFr7Ol!|McBzrM{S(vjW0t;O(M@X%#1pX#gZViMTwO>`=M{pP#P9Ljr&pMUs4dM%&lH%ITr z=-$SP$B1FLfXN%tT6a3~Ka)45FJ2CLvw3GP@@8RFh`jm!g^Q9mtN(Cb-K4iIV_oDt zdZ7}S$g!NKgpS^~jCJ)S`9dWy_2gI2o_E{3HMoQxt#gXE&Rc)J*w)edXdMk&=YRhY z)H-bT+Zh?sI(PI|R?qGBL%%=ocKgv@cz2TX?)yJopaix9xBB;eFZ)iYHMk3Et-C** zS;}`@qMz=hoD(3r3Q#Fod|4cwCIG zrrY6KLD)Ji2DaT19GkR&_8Yr%T_pr_BmncE0W*Q^)6tI1Isnre-lw_Fq5a(J_qR2K z>F4Qus%yLpr#k#K&rbKX_E>YGCP-T96qd&GKSTMS3CX{xM}9T`sE3x4DLBowI9$&m zai9H_;M&&GM9hqq*6W>Tu)dFV_wU$rJy#@V0@shilChQT3AfxuD#Z%zDo``j6(>+7 zNHx=P;IBb5Ehqphv_&s4jQSsZF`URf_jg>Lt3Df zG6x&qC~kj?&<=!N{vK|`tm2?SyXVux%zKJ__uQ_3Y$Zsxb3Q=-c$6TI5@e^S>+StX za~< zo2~ZD7%8Im%y>E0y2qA$Shgg+=?hcd&)8-Ih+*D0<>P3U1`u}n2p;c5?8Zhv$c}x+ zap#9_Zo>Q6CSYv%ySy19e*}Xu4=obUg<0#+w`uDYo^zr!yltk1+lQaCSno@Mm$oA! z+N)!C!?5P{>qO=2kN|A|x#*1l+FI8ngvO`5cAMq;UgIlV598t)ftv2J6dn>^A*pA4 zg)2nC7qN%@jYrj?tM)NzG&z7^#I=pgiv$Ji7a-8otGvhLPl3s0G1|Xh#+|lC%%X%- z7yIB9_<}iEr+=MZqZGp0)?&y*R!mZ-FPgn8pCDRTDTmQaSO|qXH2*nXuzUiPC`o~d`CPa>sqs1J9iXPIZhQeA z>hrr+E14GGctFsG9t7mS2hS9;{v`(5xSK%&AUXo?zr^4!fCEij+mW2a0LzVxMxl@;yuHO!6m_MZdMaRbc*6 zOgAhOw1ZDVt`+Er?Gv-Mg+pKY4*JT!Yg04i(V&sxjEI^n+3~!n7bb_#@vX%(JB#Zz zU{s#=n2}OYKi{$~%i;^4wM_)3L;=Eo1H!MB!`nn(c;>b+{t<1LzCIX6l;n5iF4jZ? z#UO8|e8p=x+I>-c{#d9hsDn6^UtUjj6rJ3G)|3u0N#?{su`(<`C>5toaA?Ftg7XCXweSO#wbDlQaJ$q-@6_A90IFx55aFn za!d8i$dSzOCVby_BFxct?5U>r0xP&@-$>U2!3iKC=u%TDCb9QLu=$42V>7jf=H z%*s9jQ(_v}dm~4pj%)z+62CNOSr9{WIQ?ct;h)samMsH4+rLHh@W^lNUO8->kR&jMy&?I_68en5=1Yu6t==cl#^gt}44!JgP(hqc61 zrB(U((lyRj=4Tv%_Tbvc!+usWm2~(FqbCLE@y8+nR1WAyg8DvJ)Bmj;n>cN%J25eF zJVyDGDl6^fmADRtN!5r$m`W>k{i1pyqqwrfxp}O+##oysu=x6_9HWw@b0eAxVxXB* z^tY?AgZ_3jc91Y@Cj)*EYBcvjPZ~%SSaOf`;__BdW=w7V%*_T$b?tAd;i+ zKJ)F(g0Lalcir7*{P47XBy^EH8gI2Q-hOnDPr%+E!k8L{X}fU41+qr$3cnj8lr(=& zIvF!l_s1fg@fiA@Td+S&j~#=0xf^#drHy=X zn$8!e1#D%S^xKPFndAmb5WIfT#zQGV4sSV4bb>kbqxu|`EL^QVQxoE6+wgLpN zy{XP>eiU94FbY*;b$Sfd5p7r1SoC*La=Oi$cZ~6bAWSdUeQZ2*`;85nTp?r%AyXK# z{B9^;i9^_sIM^e39PBt;6_Vq~RC?&@g`_y<)stXQF_k|l`5pfOnPnKSvb%RWI~b9; z#X=OR`CUZ$)BxoT`4mEioMG`njcZ2)P?so}4^ly_Z^4ay94IT%W$(5FumlLiZ+X0v z$)d8BbAD~d)93siip)CTd8kGRUwE8N?JXz#eEb!_e}}Js5zRrWfq6LRcV@)cVGU|2tsmK^>85L?q(F#g%oP0aHqfnL}7SulHp|{q=@Y>RyzfKF;+92EGF~#zu#dN8<@P(ocuf`uM8w>waDuC z@Mr&z;V14!zhB!+L@qGMP54}YBG(^!>N1`L1I}VRJq3~vUAgsoklA%mJthz(Cm#+F z`t~Dy@>=@`Zm^9ZsZECGr;Mk7)%jqfNZl+w(5GNrJR17Vb7~k#p>EU;pV|QehKm;F zuv;?{2;>10=20wz+B6$_7E@pt9?S##lGgn-XqH?8EkDhQ0Q`B(kp0$8=-<6q-yeuY z;(X$*-XmK^VgL>9P!yIHFZt5OOaDk4BYl>(Li$_MF^u|Wq$Ywcc{Ave*T`&n2-*oB zj{&JjTm`wfS&9!?H45m%`Oa&6(rR(j)C5bE^?Ia!?w-Ue)GvfjHvM{>vSHe>-{aIp z*5^tj6{Fm4A$3+7Kpgnpv!KpK&>?~{2j#0WCx)$3=GYpqqrZbuy_$|FdhrJ!UncJn z89gOEy8r3G*KjLgC=l+OeqNW;<6jHCx|{}V;<@~%JClRAcuu@wGUj4e^fKKqO3jHf zId%klb#SK+R1iX)IzD@b_uk-gb(f7zy358oa@n}aWN&&Y{u)o~Ea=-`gV!$T{^(k| zzULy`S3c~err-T8;8@{%fupB!he}Aapl@A?yk|8SzEL!Or3mfOw=jsZ?pzd5>9}W+ zyo@`G%F7#PGch(;9fd=_W^6_ieqsAhbT>3cB4UX?{#QJ}T&NCIkBVop^{)cl;wW~tpM2!t~w@5x*9U*>fxLeHMI6K&@$bNBNMQ=PE;Mx35e+g<6rr4U^V}sve ztnB*rk7fx>u~t4&noVx=BiIb=(2ngEFxF|qmjcr#<$=u+Eu6zX7tNQuo(3!-`Dg3- zA7%L+dVaK}?sg#tx(zQ+Ta77QqSSvEN_ZdI7jOsDXjT$_PTCvn!;RyKT@m5>#Wko$ zeo5ibc+9jO@&KB0MT~Mz=?YTp$4OJ>z|Tbd89PUf>`k#hXejnyhR>N3e=e0w5^Kgo zB?<}y7ks?=FMU03QCfXhWHGSnkEl*P$d})tsFux}aMx_>wwt(q1zkk=bQ69zBl2>o4<(pm{BumV@NL zWr=*sTpRR@%FcUX%_FCT%M<4HqN1$^$#v{sMmPtW`Mlp7ae1nju&Y-tb!|Q=I|`#` z#qj;T(D+&D*a^2;QhJG>)qwCw!{rGu%py+#IeNq_sIhYJ^xj4h(W`)X!k$l`wC#{BpV-;%u#QQXR2{hLQ3#WLw`?8$e0k-(A z`fA$+Vq>AImjQZI6SfcC7S$aT8*6SGC17Bz?!E$J(VDcY7uix16B0q}>oZvK?%;~E zm3bUjV0oOqZyQK~F?f^R-6P0Yq4q087aCx!BVO*fEF47kT`06z2V>v;zd|nAkbNCN z?2FPU0om8lcU&=Cn^MJ0Yb2%xpHFY+dI`ux?XE&t%uPixS z(worLK~;+hitBo)hmH^qWm;*@T=oxrgVC%@2cN? zqzgp>S)|d>_7dsZJ6~bb2d#B-qM$z|g?gqp7|QM(lWTg4;hNsS+kwm+Zs64SZc@(l>Ch$V2=QuTv+(P{l{zz-_139|_XU4Y)%F-0unQ zP%vDKanfg;Rix|dJ9fBKpk4L3u2qcGx7;)6Q%9lplPB1gdz#Wo=NN}Qw3S`^%iu$& z0`2xEOovW|+M*{+hfV>Z8Kf)qdj2Hc;?d7hJSTO!PJ;RpNoP;}LQb6?JQ+B3QVHHp z%Ei``LJwJOW315mFcyUj6*R&qXaL~yUBTx+tnV?d5{Bp~xYttBZuBYsElhLt_!h3E z_4sDdCYZks&SMQ2J~t3)Zywd+{$h4o-X(5HIy_%F^N+v* z`}$%$M+#a$#c*3sIZ2JXX9ulbqiIjO>8CsBGCcgqZ0FiAIDwiM<;&&vtknJUW9rjD z+SyRrQA;}?*U!OJ*@ib#*(S*`P=gUhJMR9JlPf((JpCf+Nc?oR1018qV!7ld4jPd> zK%4WKu0MLxkrq+Dn&?Z-j;W4I&9>Fp6xx?)j`%6xt?|dQitwvL$(pd^3s3}z0#p+2 zLB?$QBUchuzNmAkP+R(GP&Ya6zcg3X%%FRCb%#sb8gfm27|O_jW^H>x)Z?AezNgju zYxt1VnL6F^IjHn=^;}3mnOz$K)cD5f=UIZbYB1a2!?cO*y6Hlmb}LzZ+vYGd)h~O} z*R>#;nL+p_X$M~j#&@NGZ<6-$R{?xy$l%-d3d-QrI0xXe-iPr8lRE1yc>9$Q-?HyS z7+#EOi36X4hRVOoH@?5Pd-`Oe?tF4bKu5gm>| zzKgXpHp{Wetx{y|Mt_DBp6MG@JEKPK&)#nJMWD&YE2@YF8A;wFTi->gLx)7yJR;C# zbX{dap*HUycsC2`aM)~@dVlcgLhVnV5bXup?>@oZL{kL2>!(h23mGoAbDfZ}o_>of z%jLBdtE-BNrP9g@w=j0K(LSYXDk`gx!EULlXcHN>GCS9z)zC<0jx&2*_V2{a`54O$ zottn8)_yOZ4_FlMVCZ_yUK{+fgA3}`^t6&ck>%g&uzAx-Ku=@+961KIZ|MQ zcP{bK>`yEQPJ`sHa-JtC8GS zkuN3I`)=d3dxs&tuFp-he|Vfv3f6lwMV&e74$PRfjr>D7cO0U!ow$>MwhJ?0nfwJP zT%U4o3cf3Qg|h)%48TRfa@vxXA%D!{-Rat=;!Ob9WAxivkK`SXuiY>D+=|2dFG1#CX6 zJ+oQ5T3@%e11q#Ip5jwd(F(TBoeD|yoIwM-3Atx)m_yx;2y-(P`m2RgF?LpO3dqp- zJ$#<`Px!g>6q1Kv^Xh-2ox_N_EtwZ_cn<%TR94#87FBGrvoYjGF=UcLr67jv6V?`O zw2v)`@67@{0DA|)hRVK*N;{6q^-dF30V6i0O_56Qr|LY$?eH&6sB!|JSWVYATs!f7f`+TNS}rBp@Y1FRb3Ex$jhN;^ zjW+-1C{PU0@uKakMB6j?eWmqcq_Bt;R0>991twj$-c>d{t;6rDj@4i&HbB*r|SI z3_In|w6RnF%)w1G1T%*djqm)76#(QxcGow++6Am(aMtLOY|BkE#9 z9J5_T7Kig~CcB%xB`_XHMtjToQzMR!WP05?x_wrq5F7EqUJ-O`VRl zR$f?%FzJD%pwbTfj&Da^?;>8OQ}vmGJBq5#V%Bl)6E}Au_m!QZ0;@0J@4ipNm6l1AdyewL z5(M176vJw!-7QGP>Z=6vk1*xcty7Xevbf6Uz~IHm<>4k>Ju65_wQFU+3n;0tL-@}x8Y^u4+tAS3Cx|3=fs^HtTA3hzR z@o>LDeSh{@fX3(h=?XrpuerO_r+Jy;L)1~h&0g0zHuTiNqVj&~gV+St`p5CZPp})~ z-Rvyta?-JFBaHxdS5jeZPXR$`0sl0h>w2W?Af=xDl#z8dTDEFcpTlf89SGHyeoo?~ zKeE}cpV}_*OhZNP=bZW$CtG5d0{Ca|g}(BGx2^ zac4weg|(4k)H;yyFTsoU@n?L6r9|+~T*5nZ+a%O*UL~O{-x5-Q|F?kx7MThd$_w~8 z7Epi%Y|;yuzzXoBlL9V9XnF0}-;A+CqeEZn;(BQJQWD50XK8N(rInRimmMog7AIqw?>Xn*XXcr~toN<=^T*c$?sI>f zd+xdCo_p@S=bp=t=kGv{;D pxoxRfOnwq=H`KSpadrcQ@sO60lB_Y?;u&uM`I+N zo@#kwj?5EtWS*EK^TZsPC+5h!1a$x+LNg_+`w$s5D92oT6G6IA*Gxvu_xGbA^2b%Y z!1^Z#bQ^qNxUQnC+*Z9LL>(hltgl`bst4&lEIOZpY5U^e;!3h^E@vgti)g9fjQ;~9 zXMRlDPX~F25E@P_YlGRf1FfV4`Dt?7vu3!i9$Qf%Xx$j#7cp^VPTnZuKu!Y6g%1N_y0dp5t|Vh*AVgFOZd6%f1@C_ zMiH~YKlV8A5WDWFpcINn9(n0$;E^LoK~4+`(VwH(p>>jR58R4db)y5*h;s;TfUKP3 z_jjO`Hd}!Dxz3rbQCY8Z-Ikegk9Hr|x4C%-ulxdpF%eO=7-dO4WxU_&m-mz zRE>;z~EW67K zBb_J`*p3d_OJB(EGmnsPHe^%Z$D;+LB29efO0>(VhMeIQYDqzU@R&a&mTw1s(DGw` zS(f;JGMV)6Z{*N;)(55H0gtckXk2dMV z-}^S{rY&b`(*5rRn&f}4Pm|_V*GMTw8+<$;o`9${MQ*VB-QDu2joNf`Q;~n7Rl%eF zLI-@7ReruqqWBo!M{V$KhX3Gh57KSMNDUj1$#&edi zcOXvf44yumdH8L_p~W|>Yii3^R#Yo>Rkzy8%9m8EC@-^>%C;&9*hZEa?9r4M{n^#a zX&#u|OWXkMzeLMPAcIrv|LuQ;{=fb~ArlwQ1Qz`mJIp@fDI3sFiB>1fdRR;)+a~gz z{;tY2cKdp6RI*pITh+oCtteitGpl)VYN1uLC#ZSxnmtj?OK3)8ay2gz;I-xHp z;!Zf!+edpZ67yj*nqQNA!hqVQ=8bmM+ax(gv)k0X6mL@Vv4;o?7jBJx)!gfMu(n5f z{g4LG=v`SgQcdCy+0sfpr$;N1dEU9M)5*%LYrR(sd%)aNE}v=TG}q}A zc?xv?z=k#F`jeGd*J+zP-gSDMJO+L#iA~ea#SQ!};y!^Q1u>|NYwO@GM{uTEA*INx{yhVCBEvPy zCiDZ5G$TS1@ATowMtdda-yt)zet_zixDAB<<$4_Krnk7b2t1f+qwa_Tfc*BH;Wiy! z_Ij~ z&-D;H!`%D~#;%G}XIRnre?~&HkaHaSs2!+J;Qdt09mD0=jCk_P6{Xovc>4~n8Hs8( zRz)^n`lZwrt5$&MhPCz0)n&KBat(dU!)k4Mb?x#}S;iGPri0QnZrr$7e7Sj8?DPum zX(z>I;~JF&3-KTEj~|>L42}cp%IP4K-t7`kMUE~Xw{)BhJq#pEqd}ufmSS`8jcF+s z#t~K-{0Z?dFuR)LNltz0YRVT^EUAE*hdV7;jP;5dq*Z6cbn1%5PT}A{I6czwU0zy) z?oeeXz(wHXf{0um80(+stf;f)lyWF~V`x*Oylhg?!9Kl?Ss~k2Ra8~cZO>KJwaZX8 z6mWM$GJ+9M;D4pAoGQL4HFZUGYF$lLg?y>4x(10R)s8j#_b&<@AK?iyQWPd#^s7+4 z#75;((HB(Ee-b_zfHl&C-1HcCR$0YL{Z(&lJ-zCURwY?AlhG3dbv1N>u^@b5(G*B6 zUoB^zg$JNiZFvfZ-WnCF)J&KjG6$9qM9E-LNBk>gp^bQ zC1IU_I~VwfIS>N=B6nk>kkcTH*y&-YMfj^&f8uWa{APQvetz>zAoQfZolH;jy;||& zROv;$6vPj!V|gLGLChTY>BmZU9`B_UgV-iXbY<_Rr>F)AMO}$ve|yO9XAl3b*WZk0 zma2Ovs!rm8y&?KzR_6(kizcF@GD&W7g;Jj?dOYr3NNJ!4~JLi>|5dUm`Qzpzg}URu|nsMRoJFi_`=OtVOw~G zr*`(Kkjkj;-MxW*Cs@d!e!!j4S{et^2VEqjTQdYoqn;>WkLv&}jUA{=4@TwHeaO;y zgf>F)A{2ml8NMk;-N`4ZLc zLZiz~&k&97csW3$7bQIKVL88oVRy-+y?%D*8%Xx&w$NgcRULr-ZGT7{i)ZfC^mhxemh#IJa#>ZO7O`tQWOt!>YdMr{qoSGP_+ z&%ed%p*2|pwrby-4H;g9|7`8}smy~$IrZ1oztf~qG;(IFu zRK7{Ph`PLT7`tRyNNpGCwGGtVZ|TG6iwSW1&{Bf$pVDKNO06!JE1HjTh1=nL7@r4bWb-CH5?S!jSZVE-1n%5^}VK$!--4i=q;}`2AGCaG)|xOE2j$Ps=fPjF0@`hPg9M;_-Ra{RkG~%d<_JF-#u#RnLPM&VCG^ z@+RU_Jx{$rV#{fM3HP>cL2~mn8{(5B218-bo(i>(@Qq1In; z;{oNEHi5X4a*1M=#`|%Oq6)6nh`V`D&&Z}*n5Yd(lSTe6>v{fHv2fu}6v1Od#GTxmH7!9}0}4 zAtu?i7Gn5DUJfAf`CkKb*U27i713-WzAhWk1gJ1#{7?YnnOv$6#z+3D(}XaFd>0bN zJcG@fC~zj>p;=Xe2P%YH!3Hm+}RtT7sJ#Et27K z8xd(N^_^#0L_hV75RhZ!^j!Frg1;`!)nd;Ga!(K>BCC0jx5jQlz@|18@3H)Bm}58X zCTI>;Q-#crUnmHG{izcjd|oM_eFUBQ(VY4Y=irx6dFmyP9ciQ@-9L_4p^&veq)I)f z@}2|!4QPpOyssMOH6aZJ)UVeHG5+vnXetnx6YKtrqF9Urn!QUghDgy$@uZ}nIym#s zdOKRF1w6q5fpl7KcA}Y*^c>x;H{h}_+%7!rg4Na z>^Ec}dgA1JK4J6Hc4Lj0!Go*0x!Uv3z@K9AHW97O9K37+XTiCAZW4^{U>#&~xqXW+ z6Kw&7z8Z~2bcMboLK6Bry>K*%^n0$UyT?Ts^{0fpx!UY2_H60w#Yer@qVp7?D%y|* z3R&THqG~bw_D{UhS7@=Sp!06$_0;@1DBiH!Yp~n5t`Xh7Esat!VLK+=1qqNf0e%u4EQwOnM21exup}fy59p5C^c0;( zvH|JV=_#D@I=;^BeegwV96O@iDsm2g8FNlXCpIwGa$VbsE1y46hMvlZW>myawL1z3 z9tp-ZmkX^NINIuY{uuTi%hglq_Na3QlqzQVf6^l-^K}HOpEL%bUiQH4f*8LVZ(K1n z{7L6yScT8vYH0{6+%pAh=fFj;6B`z?DJ?XRpyU85X(K)W1o-ZL{IdcaWSw6D^x<4$ z)!E98Z|4f-*3#I>hnlk#u}#{Ei&5UI*6_90`*X<$b;#PwSE%!sSbI%*R-ai6CsKHr zmARE%7CDz;JxJ%-iX*AQ%* z`V4Q|DMoPWe}%`fTYXux1p@vUgGu_2J)Y{S^q^i8jA{p+{A z0!LAKe1nkKmS@Be-*2p$L~H@OGPLGPLux*WQAbx}&F2Pdw(f-3-WLNkFAJ~v;dP?s zO;3xOcN=Ra89tZo{A)8?mTRrSuixN6#9HMzcwJQKFos5ufDc#rv^gSbWoNAzpa# zM~%h%v7Q^Kc*mPk$okddeu>6AU!+F+qYk4u5G@<4E3Ce`&O4AW*FK9g(;2o5f=wE$ zFSO8`9hSM^Y-M(fGD4NcwKJCa?2kWOCV=VyM3wDq)NL#%!z-xrOKak^O&CxIF;785|!uOy5 zw?_l|{jjX%<#MUbDa$pfcz&`ndpH!VEw6J92aqe|@)dIS@U%%bd|E}iL>g7Pyk?R# zB6ZQYu@{fIbab*ba^%R>67J~pt$Tc4f$SyLpGeX7uUW6qWa#mOcj=8qoK}Ya3AOwa zd>RO-CJX2>7IHeI%+&WfqS*WQ_4=9fZ;&^81P!_KT-oH{Oz97~F(A`DmHI=_?fYNA zzLf3_E(Z0f=XcNZ5e|do1c}G~5BKUKfaZ+#&kJ;fa&(%MBaS5KX1gB7-92m(-$0`Y z%+mOt6uj>y_RlskF^U}Qz9)o8*Z0q`$YYR~3|Y9lW6*9mMu^EqXoUVgsh&zW(2P&& zPjel?bg;)Rm{C zQ2V>+j&SX-;c+BR0FtkukQF^n-CNAMey@v3p+sHs1UFf?y1Rvj@!<}lDzL)SrF!OK zr}Z7cH2Mj#CCuq|8{WZGLbit6{}?utzH_aPhL}k&dc5yUiuUrGp&9&`)Dgh3xP(2x zF)v}6Jk~po+ouNFU)#{j*Ez+7Y{}!IBtVJ%z2GrGJ`0h*8p*OnFgAK}xTRszC~Pxi zn2Z@lLk4f5pzlUgo@CiIsC$~#)K5t#xjPLrz5JMtej+eH`tGJkhjY$5=$igJNb$x8 z?gRLW(Ln@@_*)xYlPr8=lplbvHk+KCxcG}CJ3Kj zOzo?*@$N0)iw-gjk0ciy4%`C@4x_b4(IOiKc3(d+uO{Ly?I?Pn6_398_C}HOYh#4@IQhLJd zq^{9XIkTPA(x<~1?&hn*81AWUVU?ijR#?LR{5uhEX&k59N&S<@aXTqNjS_ZOAZO4{ z>gnHw+DV1YA0rK~tfQbux3Q}$>QHb8&zhxtJn7EEH`%4D#RbLGn@h`rugIs$x7L)? zVXH34#Q85q!SqvJMJK+&(`%eaYO3+JV;NNY!w0l2UUJ zNBo%ne^fuUmVjaGifUU?4X;TmstL@GLHmNL(#6Z_Y-lsUZ-wgb7TC(l>uMmzc5^u% zk5|Zb2uLoiU0NU$MNrPQs^#0j#7Uiw)V2NPI3A4ATh_dyseTP~4#(4shP zRRYaj^7N+2#@%vG)@V747}Lt1ssJWVR)uj%PoY-S#rMtI0m!K3V(Ll0n6i2!{W&&m z245B)eAgdv0%d8u0V?m#L4@Yw%6@)KtGyG63iZZoGlU4Z|51J1^@C)ZvFke}Zayib zfu(ULj{J{cuowqrF+21GRJSiMD2v(O?IDA*n8j}m8>4~tx?Y4&v?zbKd zgF}P6m>vFYAYL?%@c7Sfh3Go*TRu}jljJ#~%}B~L?2jYM1Svln26J+e5BHBTu?7=& ziA0J|aA>)S4mNw3Zno4gbA$={+GKH`gBsI1Gzv0t-O9NUi?3ToHbB~PHu*4uV*MNDj4*XHfwCa{eQPtYAIa=i zn-Sw+FKjVThw;8;uvox7r$FE0B1l^m)2DO)^ZT&Q?aT}7+^d4b4|J}zPv`#e_hFs; zWL{Y3e!V3Oj_BM|kLdDPoPg0IvBm6yEuweN-6DDy8+8Zr_zdoq=fFG0ao`M$gBwjq ztK-BctK&dv6)ZuW9Oqzey+#}i$B|$>1)=<%$ah@g4=M!6hiXKKYV^uuVRYM(8%8(( zBVp}5AlrMt5o9|aIw-aydttQv>=h zg0nQHNAQs~5_6Aq;>bD%tQHtql{B)-U}W7y4SeIEKC*I*BkNdjWF1>7s{Cw-KC<-p zd4R4DQ({Lg^mA~ySsMR99A<5pINH+qTjHdnh$GqgdHeD6-)NV9{B~=%-!C+7c{CKG z1UzuDJ*;=nK|J5FG~#W1RXOV2qjuwqKNdG$QVTHH2|ln@J3fhaO$e(M{0`Z?J-{RC zo&t7FP6(Ia3r_5wK#j4)C|Xgw8o|+CrQI0QhxJZ3hq2y&ri8IxRsdqabOj$d#|dTX zLweEx-aOn;hUO8V1^9dv(8wAfQ^9`%WU{!c@zP<+pdCd++GZHKzebpwb(n)V zOiuJ-Y=phXQ@(>h2i~1Z9a$#POR&RY^?N;;XndM!!;3rI?oOh83s*L-?}2%q$Fq|9 zI0;2roP&&feIEO6?vC`?UkmgsZch}->ceW$lj~1c4>U=Zdv3>=eC)xw?5Q$XJldb* zc^gYHg&cMlvLUsYvXhT{3h!`{eLTJ`L3ewYZ!QWPh_<%cAEP;e?s=%n)>iu?Lb?JU zsrF}b9PEe#@pwkHZzuZaKQ~w13+wVXv~Wvf=Sm5kT5mGP>wSydiXPev|` zQ#-Zu+=t|t?pz>tSNZ|>0XZ9TY6~CB$ytKORdJW);s;c98CLZjR`nfLRrFxS2lWF0B>MK<>dgjzgzCK$5LATP zl5t(U<(`F5HMYj$E=1#ug%4(2AFo6Libw#6R2UYvsnti8Mw1ce1ex@hmvC2-h z&2wYy&o+A>Yu{l4=@~Nz`+p;`NY8BS-p8OXp>KDpt#h3{pWzDk8Ge%`{RnO@eL_6p zs~lIt8 zoG$=(IZe?>rHutF>OsEi1f0KShL-;fyKr-%W`8cy zzS&W%(=(%;eA>YG17f7tr)ty{4z`|WarN?db&J^sp2tOdTJO!~AN7w&N~u=#Tx8K^ zwdfHPZv6n|0`~p=I2axwPp?1IwX&N3hz7WqIOCBR$|J?>xA&7!C}GQ~mW}#O-;KOd zt?2IXTL0%`=31~VhO~vf?`*m;g_>XOFHJ)%{JGG+iym@U{_?n~^AKrRWpE^)^!x-LO?B;v^Q3~x@&u+qMyTEd?{!1m}j zCg#oxxiNun4XLXVy@SqhUjpwX)0GK>Z(Q7HqzkNpGuG`JiG|1+JA8g~tvF^i_|Syb zz?hsIqCCB_IZS!lab=kDfF@leXbUA^Z4VJ|;MDWn1ta0@sNVo}!*YYHCjb88|!GhBG~2)b~-L z_b1?OoF1;zi54b>wh%onFKiFgrTauhH28~yDZ-y!#Y*FErcrOr#A-@{>cD+lp$uP7{w{|tB9jWBHhQ^0vfzyTo5 z_lP-MIYvOXh5!li5l{K;uL~^@^tGJP-idra`w{9E)RV9Kx2`2#)VwtioA+&R!RMz8@<&7c_Z3Qn`VQe4t#%tQH5!WIK8RxSPrQTOlA|Yxcaj>e@cYHv zN6t^bhQ-6j_lO9N%z`Ga8kzu18i48G_DNmp>97Yp{x|9&Fj)b+ei}}u`=W^;#3SpDk^xocEBhruPmV)QD`l*nEG4P?w9csr?;QrRu*Os1BObxc4s0d zu4{LW!+8ye3a?c&KQAI3&eP#`zX$z?n+T$#M zO4y-!oY6z;UqtmEx{K1BSTo-bdHWl*?Z`DU!kH&0_;+=PKTg}|y7JQ6#m+^+8=}cJ zv|6}0L{773Z-xPh#vo_19#QQ+<5iQhT#xG)$@e(|qw~`=wC^Y5WW^epEglzYn4F`S zrW@qs#av3RzEhWylftFsEgxmfM7TvX@l79k#Ixmdb0oc1;M#R~3;IwWS;>tE zXs-r4Aujt#r%r?MlV+k*{8k~^1o1Ch$-L+PL~1v<1==8K13C*r&+_^`*}kHT-~S}5h* zfJMj57ZVdukH3ZL@XYA%V56qcK_c%N=lz&<#{Il22(AEmwz1*$_lAy*eW@@ul(@5u z2dC@oT7&yY{cs|HVLYsMh~7SFhVjrV(PRfX3TZ6t`VPm!-S-*Cf;>e>_sZ~#X2ZVg z4Ll@x#4jv|dSEVhf7-4gXWz92lDR}9Sg?}cY)POksq9d>*Z)?Ne3A|ChV$4Jbu#Gb(!8@>!l(1`RTZ)m%D`H{R%*C^Z!4{;1pv3&$ReRmnh9Do zy;AHf7rDtrzz@R4e>|Up{^M^hUs7F*C9zZrI)N!gAAT#AqTRz8oy)_&96C&gCZyO> zY;^Ho{E5v$z^E(+$D4k~Xc0H{d-d|~jAnlFOup}m>QfFfm;;j81+ztOT@=BWQ{9%v zr%b{9^64Y27WWLC>(LcZXNQODpiYF%e)l)BRC_pRsV0`j^Mm8!*)gQRIVy8_t=q9+ zbH1qcF;h^z1D@-|#1oDF0Gn1dfR1-z5Fa+)6j+=48fK2L3ZEgs^UJrUAM(ui zYk%3#SH6|6I=<9t9!<%jVCGl$$e;6iz`CozDF><1=FL9>HHZ~kqP&cD|5sZ zA}jLIylcc@`Ul8w{dI3XOFjRM5r@R|-TdWaoNZo4{_>h~)IE3s^@@vt)rN<&+NV2+ z)8Zo3{2uf$7#DHIcdkQ}`ZYW7Lp}Y|mZ7Pb*|QmcgLt{vplT0p?xWqGr*`+%?`zit z_4`Ju8&tplapkW1xCmteppb4rVPx}}l>L9r)Hpg7(Cx0jz-g&I9@vIf6fko<+ySiLid#8WZ=_ZquU~c; zN!jo%;S%=ja!`2A4cf@gF6tF#FTcnh3#^8deV(`mwGE*EY-sq<<1|yGgY6*qNIe1P zVixyra8jELWLQIiQA$Gd775*rEop9szf16quf0*;617{{>z>c;b*G}n=G+EZ*g3cA z?3cprb)y~5XC>VA9>`NX(@kg$d_Gy|p4Q*nYKqOzatQl@w1%yT7 zr293bb_ZHHHgjt3&>Yr`Z`Wp~A4&e!GsA=r&c0K>M1M{9C4@G1wa869vLjE+u_kwB z>|OJLcQUzM;-$W=PfI_db|$xF?8P-cFTWehdshX^=V|df)XuTFRxI!K%cDfEPJ0Pg zAQ~(x%rC)jHh!hxO>w1CzPr0-2_LO*rp ztl`RkbQXGvS2Q+euJfNdkRo2AF^eug2HFYj)5}lStUqaSYMmBd)AsJ&9~yRndeHuTpJW4i*C<@9BV!bKz*$T zI@38`M`4-F8{5lKShHRSbvc5{RwRSV!qDlI>_bAve;uZuRS5KvA1DJr1Ox^=2>}}P zG~{C?V`5Mmgb0E_-_luu=-xMQvGnit0Z~xj51KP3heQDcOIU3kP${L8lts`&&Lshw zKU;VfNXfSU}7la=o;zA3l^`pvT2vF&HaRVwikG zHT!Cb=m`fK1h{j7tI2O7WVyU`!sJ(o()K^ zRN)%i=7d#xitT1arb}aF886$GR4d%YU65Aztof^^{<)Ijh2k+NNh15>toNJRz-A3b zK0;IBoqD7aONv;>xqLNT$Tm#r^>4Et6w6L@IRTL`!$Owl`&`oB3!>Xw_BfEku7KTM zJ-&=wNcud~%^D{Qeg2(qdPVui4dtELgy8*v%Qh)cBfpb$wO*rl6`!9S#g(RJ#LL0H zxrM-HbkZvmg)AwM_geIG`b)gG9B1kbf4`Gt4j?@S^}MW3L}WGEGomS=+i$sh7E(~0 zoeXN`?Eyv{{ag|kTsqXbGJJ_$62PP;R z#+f%em}_|mue>PI0fUO=g!-c#^;XhXNmU4;gH^ZzR-$&HtP05QtAdsLu<~N|NtG_d z&ePL0$vcqur(XX7!xOqcK<5QS=VHM~GItNMvkFm63DWrt1b(a7NZ=1Zj&Bn^PE5%5 z-_8k)@@}nd)cCPCPMR`0d1Th);gX$B!B#J?T2x+Dj#dh1m{LRM*Ndmk$(whb!*0v1 zu3lzy6y?skI?pydb^Q1_Qwy&y96x^AylJ*+)r%>$`0{b-+4F6~#rL=}8Bal~N>?o9_lHC8pTWA=RwtJ(US_LaSzf!Os(O`e^vE(> zsts>*LE?|$A1n_OSSWxp0pP44vMx?dwOw0YUSlH{s=~GdouJ|_ws3@sLA;_JJF9we zX_akdX>A2Pqna7Joc!3g z(daj6HMG(bPp^}B%;$TuUZ+spFm=;tA36cEG^&tK-LGv*L390|G+Srvw=|+jF*eoW zJ|Yo)5n1IHkhc_Yy4Fk@A<3mg-Iy74Fu@;hbol6oonK zQ500#m~9nFZxAUMyXN0G!1q~UfPb+Hj}5MPJ$P(@zifgH&SDX~!PGMYFls#eTIPq1 zA@y|ede~p|{8mX$^Pn639*0(BE%0nf^Wkm&T)L5jq^tzaju2J;T&Lfzb8IpRmoTlJF-($YY$!vm*EHUwQ-E~HcFJQVG zvi81-x(3!q^9Ye4c>F3=nks8pBv~C>TchUbu(M}{=BZ{MpB8y$i9D@QH;F2n8zA6a zw^3VdPCv41CQRYFzgTn*@OHUA<(t)Z?@-si(Rr@#SFZgO8|gn68u?|JB<uW~MZb zuUALVdgpKFL*;F&@j!&%odLl(f|@Q$u}DhE*9L(p(U~$4lU?M zdSOqY^Cf6urHQS%&F?q7I^c6ScVg2`&X771S&uKIj^&Fvx)IJ-&liV~`Uzw$CE-mQ zdLIkxA-M-dy~ChPp>q#b4RzcWJWfsGh5S+cIFnKg4I#%rHkE)U< zNg;Y>V9L8LGB7X8tNPAmnZ~&+6+U!nc5OhKP1U8@L|1Qr`EpmUO&;g!9Uv#WdSm4g zx-=VNlwKU|H1>~EVtK%aRfQN<%1y3p2L(#>nQS&fyc!`+!wRN|!KDn*fmO3RP8kN5 zv7Q>XR8N|xCy7ZuRp=)Q;5k#rGdSb(@_Fo19nXnWDo39wu7cvEQ)7cIjRPW3j>m!? zL4p33#_w@)+-tKmerv+PK2bmx^D&=h472hc8}vw%6qv~^ZvMf0Mb?S23<A(>szah({)fv6Lwt2 zTp5%xxBuq{Wz0=_Qb5M^#=_teo!MV>rhK(J0bA$l9i=2db12S&*i<8hyesf&PgieN zSfYZ7Z(}0g_4;hN;hb+|-RT(|V+`_)Z=&4a z<;%3V6HP%zw0Cq$fzfJlA2jgjROaf!%L=cP45rH-7;ZJYM;r|0=3I7N7m=Z1QjSug zwyPif?0ut#)&6=J?~Ho#VAlES2{Nq0sRVb$oZUlUV(U*q5}9w`Y@DS4p93d>XjcjT zRNEUS<|w8dhx7X(xx8ghofIuQQ?vBT0YQ2qF)MUpqT&-ICheOb08ouyM(O3sN|5Aq z9hE#b`D6%g(^=}tAXTAIt2x2QQg-i6eZkp+;J*I$jHS7}3{H$`Y~QznGo4{fJC!~C zElxZLL^O3tMQxqT`Dlf*yu7v)O`WobPpvJzxnl9~@bh8Z&8}FXh)j9>tGsTw?M!8j zaYZ#X5U#3mmJUDL`t&EkH^MT;&#GSaV|Dx__(nJZdknn#Dx9px&UNMv1uncXaDFm8;tq_x@$8>a_g@3U}$H}W@srCo#$10YWE-eqfZ(>7FEv04j1fY1U zBXG9^M&K_po|D^MyQ3Uz;9!1t5j`plCbxSw+-Hop;nwJh>oLOTypX>3-5}B105-h+ zi7yIjBukso`j6BxE_=$@hhG~8m;{RVTVD&#$NWfZ4D>ny*7fa~WIobr8U3)BqGyStPG7=K#IqTy);TT-QM>KuyEH z{Kd93XexVh6lHU;OOEKC+ltv;*BOuSu&>04&$#j$VAUn`=1}%<{E&>Pl{HI)srVrU z5Oz64nTZ#>}TF%`5?D|JvflxYeENJn@a+Nk7}I(wLUkW z-*S;$`(UwPrB>AFtypy;v=xCKy^$?ALDY8pO1Pt# zJzR{JyDmpcG)&HttBk9M6?7( zp8#48UnN7^6NJYN_BiF~Dq&lSL|1T{+`!_zVmxpwb)d`}Wn!@~4fpx+6-u7h$&URS zDRQ^ymLNrfGF*uPl^K*}wNw3eeTxHKKm0siQuil+t0gpk4Ec_L(D#GT-y0PAdyPVW zziW3y#vaR^4P5pU?Mlqp>2U%v;NptfoGJwNr_u4!6ygg2ro z+Oli6x`!rf_1&fgR?~*}8$L0~k)C3kWmnXO*YV+UOXEH$+Pyc@()bF_q@4gg(lg!m zJ4|+ESCNthE5#ZL4AePuDVyIB!m8zLMu(V$YF^i;o+@1t%f|kal;L`AC%e#C9Q!pU zG$M_iVld+)?hvbf3tWNLS`l)jYtOL)_C{$)?P=@)GhQF8D=)W6^bA~8#foL+E6TX^ zGRiIxK!UmAX!P#BPr`^AljOvUF%BZe_zB0->54D1Qk&D#kaKCrC^};P;r`t4MOc5X`r?QCQ$Q_e1$w5c z*F*OUmawaIfH2~R6^8&{!Y&F!kM$4aE@a;n;SjG85IgFnvt$1D=V6$?^7&7|eDmi& zhj771HhI;t8I!NuK zbpHh;wj_@f_7CVT)Y*xWthMnM#IpCv>UouYCPu9$jI-I}bNz2&#$NMzrD^pl= zl6Z6SGET19qgPYK9)*(L`N3-M<&e^kKqXW4{bHWDjMYLSRLnWR;rugH&psF)!f(r1 zK8Jwyyxtm>)n{tbZQn(cr|Kn_vq8s0K&@aAp%GQ=o6kZbD!oatHVXnc^jR2yme7a_ zw*504Oj&~ejWz>XQ4GInRw+3O*oM#ed2@(<_lvEC@E&Ch3OY1JMp4&)HfQN6l01AP z@pH7`=ezQQ{2ZM+9W813jd5yY#*PZ)S$pT$wh%O~xUunp50~a8S2`vh=1FL0hg zaaZVmx49aADUUa?MD%Sf%!wOF$HX}W*ulh1y&?B8#Q3=o$Ir9q1=u)#KD?GQOn`q= zNc5&Rr=f1(^9yT-;h$rpFfMR*f_0hMCYVya1EHUI0nFR|FGCKA)zPHe{Et~$#eGj~-^C%H-2hwb;mczal%Z@MZ+vBc|u=!B%+EC0SuZ)@cw_TTw^?0JG` zT4y*V`|x8ib)Dsu>_t7#tUw;#dzm`7gm>c&$NO|62WDnfABW7=W_H8Jm^VeB7;5JR z;|_OYp=EJwkQrw(b@DGNNYFGuMSm^G)P>~s`Q@v{@tZn5Mx8+CaH6>uS2i_CiB>7l z_wDc){jlvSeIxt=z2!-)_9HRPjD9`1DKdoJphu4|L|??FedG_}%i#V)4jcWEu2gWQ zVI}yjFO7R=1$dvf>)$8|>4F^A@nJZR#25D6HVtS+d2GjrA$^v|p7>Dgpz%#q?6|Of zUk-<#>L^R}yqX!E8V(OazVX8l+@`a95utC%_T7O^W67cDOlJw95i?l7zW4=?k-~f% z#pr-%u(qSfit`PucozEDg00wm^lY2b)7a{xVOz$$?htwS!#Zi^(GVJyv*e>&rw!D0Kb?vPe$A+HUkmMZWy_u)0PD6=gm?!lr zLA7yE^~+-Bb04v6+MRx6!(LiEAw3;)3a_3&>$*jGa|#OVdGn;yRN@Z)PC4I=$5+jl z-(0a&saERx+|4s)PE93O?bYRVD=w97$ZD%>r7LWuwM&&BG=mJOZ1K-5AM!%|j}$bN z$K!^@)k{}Y+*V!|+8FM)^o;3*Y%DkKuc)djUkZarq@||XMlR+>D^{#5t*R&sOEJ9t zZovOcsOu%pihls*5?kN?`oWSvSpF;>AjbIu^p*c0%HATYYVT>t%*1PwJtQqb@>%XF zjU+W(x3JCLNCJ2eC_*`jBzZa?c%7z;|m=muB~kE%GJ%GWM)Z zhtK3aYSDA<-D?xI{5VhIeV(`%)qUDPEmAe9gIs&ft`_rb{54?@#lJCTNegY+CE;&XzCCy;wRBBI){jd7eOh4H&G{wa$z&3PNH)1rQ3+aHtxGR zKTeBZ-;kNA^lQ4t)ObL-j5C^~-|nfv-KfDh)ciD*$dP$RVXU}|qqcdMrSHZYxbis- z-=$g}+&vOsAj&cAQ3p#zU;IrsbQ_PG1(%C{Ty08~uXNQXLec?9YFHg1DWhP>TXxMi zHDpS%73OQpu853w`Jr5VTk~Z4ZuHW;#TOWfTM`;mnn$gsct~h2Z z|Iw8AR(m^*#;NEVouLhMe!HqLHUFr0G}f;S(TW(XBrZgbW5Nb+z4jU8Hq!}%(V1e&*LzFwP!H&zh0JwJOvwhiHQ zun3923DJ0&F2@2Rw_%FJ-_`;OyKXZBj2UV+a#M#24Z!{YjOXJ(aG11d_w^uCC_}M3 zA{?5@;XDz7`<_YAi(|BW1_B#Wk$ItvWtT*GQzjbo{%X=M+)hL)H*VWz90XHv5X|m} zl7_i%HJi9yOb$w^Bu@El!6DOuPuT0WW7yuIg!uX%!n!I1>tmV!cUZ%mMu<0LWLn(! zMN86-Ol-zo(Z6t&uKEPL_E>aOvnQxlppZ5<2482DV&(7_h@U>X0dwXoG>j)pI@OpV+m$cf1&iy}r*>=390hp+>>-(uVR_PAtThK~ugALGMo!p(z&?3e@{$7}Fkr zG&L#6uqZj39HxeeB^LK7m=_yPPqMhbLS4#!7?E$axA8x3@jqz!g~-YM)d9%P-US;2 zQ_6J0F3GZMuS4LK5>odCP&XuU#7ZsKUAz$+ z!v*1u6YjKuW)M7Ac)`)&H%OUW`)OPH5Tp13kHvehY*k zZ9LYu>30>*D5&?WH0@tk>zOq8?`z6Vb^MuvFPViXTbXN`^wpSr5_it>n8ldc)|eZ zQZ*C!dy+|)s_7=8?=M=F5Ulq7T7H6Rf_@^wD#vM4?lFB@X?Zn(}3wc5@}qSN)n-n4h1WMODeBZ%vXWLS%HzC^&=xc>59H1UrG3DrZ*ma zF@|?q5J4#8Dc>BrXOfTGJ={Mg?L|pAhTFdh-i@Su!Wa0$IGEwIqIj5gC_m&aEM|ZB z#$ZIe@htgGJpXNd^W#31Ux{J(=K6tPoX@YsVRQ~f2lnP(>+vgAkrYKq#yz%R8tS}; zG`|ubO!Jt-%0c}JAvtE4LvSJdT#;wQ?~2G!{Pg&V#&}^ngC6hk%xx^*7LxmG_PAE+ z9K3R5Y5X_>8O+*>OJS+wV1(c?zBJd8s&I~o+=wpMEsf`()If)wR!1?rC0*Y^GS?sD z4_tT&DpaxxxhUP;t@P9K%&N(|RJ$GDhbbv$lLDn?|fy^1kj^x9C& z{FiY<3Ov5H0ibM56HfTY@*?W(WmYa>j6VuNl*q7`cp-FAftMFoIfu{uPEQDW^_Da5>2HOR~SsGbb||c+v);6 zU>IFtYh20~uB|4-yyH4kKxb4>ZI^mp#D&eb&#G^pddG$KT~-H6Ne`f5X}k#Y<6B2P zg~bk*%rT})?NF(f;6B2gI3Vys_R07F5nm=Ea@Pqj>9n;p;?$<@MW+ZCsf)}o!Ok#a z#?~1zIy=ah;_xv+;|EdW>jS-2>z{#bQzO(Fao(7Xtux|ClpuS!`O|W)-N+R;=vdTS zC{gXFW)ly|f|ta5SVOePkaCyk<<=dCRdYXek~dGA5z^xsJckPn7gEOy>h~w=2G9rQ zw(88?Ll0iB>C{~bhK|`v$zzXm;E*}kLw6Ss1pEy4U`nNgY0rnGS&R9@4$8phM{sVs zQwsE_HUVSMkrefanR;Z-IK4*(wnkw(M!$@|ys0jFur@W2!>pe4a_<`b(*m2`@<=ra z%Ry)eZ%W2T^1$`I2ts%fxnvw}hLdok28umGgIquvQ)voHnb#x24T(pHf2HV+%ggKPN|%<`N#m8e+VOSH z(%SOzRd{o|+~`l7Y)!Oie35JVIvl1$I^O5=G8%2ocKISLjlYA4j=ebcrkf#0EM^|q z@fTd3`a1q-3cT?Z)3KFHv=aZy7`EAuPb}!$9UX2%Qazpu?4>6qtS+BL86)H)@Pd`+ ziDTDMaok)G@~EdH7eV;WRYt<92E^m#0f=#IEU#>ns4T&dWW~x_v|_Vs&wpK~V=Z^# zvv2+pn?}#cmFB@u8T`ob(+EFz!_Ox8c?^D@gP+&n=P>*nhabzI-dEc@@EJ$3j%iOn zbm|+mrQ>Od=q0|}I)1~yJ?0BLHbOA@O(=F31Tx;V+|Tjz-VW*T`D^i6h4h2(Uy1Jp z;`;&dJxhEGT6(j@w`i_6Mc6zMac%s><0X_rxK?@z?;mLLWicItd+`xIefW--#x1Xw z^7#3K@eNk~4j3p)x6-}u7)gnt0jk<#*gIp;UR|{xb7ebFDN!b}{V6!W*o*LINyc7f zAbWyGY~~TT*^61R6LGT_!+zSTBY9TTrTd7}^1HPDYJQiizDttP)s1HFLSaTXE(^!# zlCyvPyTV~KW>n%@?I&n9I3V$@+uO_yQ^qSXYW;~01Z$WV-ahs2%TXpeyP|b<`$6Ve zkYMvn8)_NR$>xp*tjkZZZ<1kMClP$|pM1i>R_c{2m$O5V?3y@SZejbAvBG02cdpmC ziPZ2oP(V$V#wj>u+N~W|MGzQhn*SD@v7I9vbT)+dNCEIG$pqNJc1MfA-=cM?tQ92| zu=Xe}ya18>#JOxLq^kB#tv)8$tWyU)xA@hM4WIMQ9fT+4pLVKk?Dk8sRSc^hMOF6{ zYeg{y22=nto6Dx?2wbTL^7X(72x#@4AvI35KoSrwk-#74r@TBh>veGw98Et7(x zzjC~0Kki@;j@EnNAx$~{>KKR7ACslA2F-aOJ_X~W^>}4KM+w>a#L@E)&cNsM^~>ep~MR zHF9OqQLUC9#Z&3as=jCJ%&XP>9`&8{1Dd@Z-}{8j1#xQ8ah!aIwtQl??20tCUti3D4?yDV`4Ct@IH=&<60Rvw^m()*tWq0-}YE1A>d#3H!^c(m{sBbwN<4)sz#FO6S3^LJ%LP zMf{`Qk70`jC=Rm3#O~e2^gvwMJH;TIyOmSKA(+< z4^bB~1hNjX2TsmJbmu2PfBXa#w0dTGPi^;}C*;FXEjIz;BG+`9sdLk{xXvGk;vK-} zhxFavbF}!*T+JS@TEoW&*&f(Im$7Q|_4Qj_3X4A_yr)g7ORJ4Y?^aK%owH#Q8Kb@v zxiFptaRIw(1dO;nxsWU4gWCS8&wDPPA26qKL~Y|1Q3v+U%3G8-XV$E#^Xw7^(cKRQ z^5@L9&zo9s9foHY<=YFc&coomtMhrXy|8fV40|Dlr_P#%f9B5@^DW&Yjb63DKf?V& z3Fx!)LEC`8N8sl;{CMG~3x2+bAGLc&5k^heaTER-2j3MK7`a2iKSSZW0Rw|~Y$)M( z26sG&fv6q7fj@x!)Y&tN01tz2J3P`o52|EqFA1v1{m?ubAF2tgfe%O0Q|5!!ePMD} zj?m3Ob^R3$X7l3&|B`Ue1?k`I$@S~~gf?Ha0u#Wu4VNSn8lN248?bvxzzvOjtNQ?M z+r+53BfRI(8aj6b4V&E2_y@(U^EtqNE`n)4ZPc-m5pqV8MWoL!)}7Z3MgFP%fLqV8~= z9i>DoGUd;L_2u{~GRa(!FhXtkD((*}& zTt8@(>jzP;w|M&t{cesKUrO`*FeHF=u+CR9|FH zoSGL;o=@No$(9M|G_X_!=|TGE~5>zICgVr^bpKH1oK}#j4v-RHfo1$L9P_8 zt8g{f>fno6{XdO%1JsX=D#+YI=S`sUu`gr!(8z(AMs}?OUB^o6fOtm-7|4+Jmd_$I^W|=QNo6&ZJx`SNUvW8$+(uVX=vRnCSm7vXGZQ2c zGqAyy>WBWB#E<^3rb?+Tt;&{G@IYO5$Xj*`aUMr`^q|CL@zxu0|L4-7oR&W4lk|PT zP)S?|@0ORt3{~OU+aI-7o8^T_Z7^Pp>z)>2ijl2&(aUU%|beM4_`Rj0H(V` z7@-G7^FX>^?4PLn)XQlbOZE%BC*yMJ>Po4YIfh^cS_(BxUSx4U4uO5q(sb0P(wffS zVS{gP;Wr%fx(S&NiP9rjpd6mOsn8wg;{I(>p*zE)cSy%c36uYLrQ5^_d( z`%(QmJr*H7Ambt>j)NSnUgr9T2{BNv!~>QHycCSGG}86O$3W7Mh_7+`9V5=ci0JiS zti%5G88%|Y`0KmX7kYMq4-nSSzD;av6b5{ypjs-v=G~vr#`7=~?}wM!+*8&;b#=}99xS@rn<@-y550hO_kjZToHm%hF^S8B#zs(GlEYgVTX zHEX#s@F&Ldx7@fT5Wt7Fod3NU11;Bey8A%$$xh5Gb*o+$Q|UQ9luertKbE#aQ|0J@_5X7@A` z$g^{DEiXh+Q27sTuUHzBpw_HQERBP4w%ODL@N+c}{%N??B*`NzFHALcPm6^7R+ z2T^(WmOJs&ye~pRkfF6$us;noK~78Kb2wdY>ZA(X_=k)Plhl^*Dq@3GG(}{^D*d63 zeYvJsZ@)&owiY2Zw_%4zA>Y*wU}yw@hAPja0{RMKZk!8M&k2apUcm~Du?%A=Epos{ zJX_s_F&=ZQHh3#SZ(CWfxhdI=3E4>Ux~Lua$FxV?beuZUSKyz}fHQ5|1$=s;x2;kT zktB@II4O@zKcHnJrWxPWU8oJlVUgTU{BAP8VVd@ad1}UYwOuNK(L4xN9e@aE6R?n$ zgaw)r!N@4gf=sXp(JJ7bG}pl%K_@8YlLFf)%)4!47z9IM#tV1y!i%u*w3B9yT4|!v zexj_O7!#OP+k{Nlof~JPI}ruMeZZAH=o0a7=M%@NA7Kwn;TO&{4;GlqF5zjeSBS&q z1R)&!gcp|(>2fC7!np zztkiw0E>OpiOIl{R)^ttGJXCum?9Dfi^G@TIgL2fKsTW7L-Ga2lfhF5O>ZZ^k>@_7 zbf{c#i2Mub3|+B8fnlL)m}jcrwD+3iJ#s&_b3I54BV zE{^(nAK%?# zlPy|(qM;dY;-qb7u5xCT2Ws`UkT$*v^NCt?!c~4EMvm9&M})K|{v4?NgKm5LZcG~; zl9m_?Y41?!E?0S%8FQqZp|n;%F(mdnKcVAumHQ&)Sx-jD30i$x=nl0BR&g+1cF|D| zHpwJkq}5*$lF59osm(JjA;LQVz1L#E?3p&uPfwuz++udqc@$BZ zi92+~EE#v$rVaJ)lg8)p8*nh27C6|!NWL=W^o-vpEy}^Pg^7g@_I#w!ahZfE<0z%b z2Bm(Zr<^dP9u?1r^=&FKFFGKtS@p-^`?$);0qOXq4fJXcTW=qPH-S z-3KMHmHWU(ej|nBK*_2`ig%~6WBHaO@8~1+W%qPzo=N@vRIPtp(0gY?2yZ*Dgz`@9G0P2x3#+RR7KplnplrKN6 zfS&r$qkwTu$E`8!sZC(_S$e_wC_OsRw)1{aUZcg0A$z7nM}+Ry3}?l}pO$M+dLHvl zZa}I1qi7ht^9c5>(RNaJ6ZuU$*kERM*~8yGkhymgwP5DKn45zv^+Up<1 zJfNzryKQcj#;wi_=E1^wl*BEX+@2pUydrIkdMxOCP5jGff>R z4bobrqK@L)(Z4u#M_uy`iS$p?JT|iH&?Ka7#p?glsoJ!SPr!X(lG3R~PwNG7ibnEk z#HbYdtcs$vSK2X)1f{v7_h>Yj-NY$vl(zH}HK6X|MWt1P33^I{C=pWGNVzYL1D+B z|4ke1zps3|+UF<3VsA&^V%k@=*XL)c4r_OQ$adYsbTRT(Qrh0i6#VbI=fm^eKE)LtYib|8wBne<6BIjv4Nv#K%bv%{aQbU5h?<9 zh+{iYj`WlF)#t|fSosTltf9sRUS+$n1l=9a^RoHx)tvJW)6owRqVDA%YpCwjJgUv> zQ|-BmZc|p0w=#)}8>H^2t2j*gy~CQ-)015r{Zn{*rJFSq6@;&;o|VQ!_UJ}3_koay$b4ApIVcr%JJWQV6% zw`u)&JAHlGgGr(C2B&oyqK``};?UB&;XLxrT@a&GJd<=b$(LPhmz%HLsq zL|1VN#R&Q-P?wiQIPpt5##lzvd)osmVVw~P7?d%Ro@*x zZMnCyC$;JDVEO6xx<~p^%DpPPyKSb-IdCYW`p( zS6lZvb;`U3-?-Dh_TI{D%75`N`tKjXTKk-zMHWm;nx+ZN=HK;Q_o5P7Up^PSKIl3< zO;>+ulW@m+og5Cj&IML~PgU#54`IEHKSR}cD+hFM|D}1b>>qC8yo8F|8ODrI7 zJ6FE_Jj&)}r<0H6zfPP|V|eFv?-@>gdeS)7Ik-W_ z%;pd1-I%I}yK&v%AiZ6Mc4fnl7$Ek=@!`i$r}&sabsT$+-S#I93hWAs?EupW&2OX zzgl)`SN=?UYi)gdzxHu-3jg@rT67nBvNGeiH+el>RO&uc=+jX*>nis_yq~z2s;)!|M!I-9h^%pO!(a;R9K82za z5Z#_aZE7?$uUW4~TJ=RW8X6MT)3g5iJ8LxB#=r>l_Zm%HV|XwN)7xX~H7ap^tkJY> z45uRetIWOiN#2e)h52~7o}OxXJ9=xy>%usHnmi91ux>KzomPclqLd+1lWd&~qX2+X?)s4XuNhSI1+x&}JU2?>X<-Dr&edYP9TSh;sI| z$z8b(oz2g#!ktvGHuSqxjblb4#td3{>P@#i@d2Y)d!TnbaF0!giLc*pW1~(@p0^Af3*Ys%*;+|`s<;D0}6k-p@?Tu{a`Mkz->W6u#f_{vvc^K%jMO=H~Fc+s)M@d@^}sPmMC3xmDq zt2oaV;SC}@ScKCAPZWGeY%dkz6v0bF=?NY$xI*wk!5M<%1)me?8AW)P2%iw_7V!%N zFB0)pf=7t>biwxuo+@~*;9-Itq4J9Tj|ol{@x4O%iTDP=OG5dI?aKtO74dyU_<#ua z6ya(SP7>iAB3vNC`$afggtG*%5IjKeO2M_lezV{sf&+pV3A<5(SBv;E5k4)#S`k(R zCkj3qs&A;CBD_lQ3da0=51scvW|TM7uQ&(!IbSZta6kh^8O4u8rd;T?>y>p!dKL@?yQm&WKz9O#$(Bnm3 z70^9J{DaULk8=Am=qizy6MDo`+{Oy6T*c!}lAbJ;VLY_EV=mL9sGOoaxzJ05{msw? z*K?f#z2D1iuBI~NbA5%RFP3yyNq2zWEcQL$EnAs?hU=5v!Zybx{gtFYmGpi|zbEN! zlHMTc)slWy($7nJsidEj^kb5)l=S_QwoBR|=?Rj)P10GCzE;v#NIF&09VD%i^r^04 zeN56{N&2v)4@kOJ(mN%+P10+j7gTe-8aky9?*moPRhRJiXQ20Q;rc1)*+M_jHGEz? z1ifS{kGD}eA8-Xotu*8(M4Q=j=_;M@9S~=mRhCbox{I z`||kSwC^?^e;IVB|M!3%mcexw=nA0|x`xk-AG(BfgQUNZ^g-x`OW#x8{(AujV=ddV`2RlY+d~a{VpzhIL#ApwGR{^&#llZ*lz>=zB$8wPYjq-AU;P z`)$xYMH$|Kb~|}Lc@uiA7<*r(yi7d)8PXeg{L_@zOI$xrd5N}K0G;tJ*YlyZqCelC z5^lE{&n=>4Mo$3qv0F>pBaQW2k<5x6`od`&Cn@lcwQT&bl#A3m86$J@A!tNv$#`u-t`ETP3RfW)j}6RCyF+i41K`N z``F#kyRPMBm>{J;2D;%XZZjJCh-mW>(2gEF-=WY8M4R*{8&R)5(2A)0WzdI&&85&Q zMP5BRg~#o#&~qp8yb_^Lh;jy#!uo4Te=6zsCB0SB>m>cEr2i=C$0c1Z>H8#oucQl- z!sp1Xl8)q_=$@@S3RD1dfcpUt-~h}(Aus{B9mww3w#3X1KtO=0BeBP zfGS`)@HFrQumE@%CGz&@CmRF*a=hv zn}Kz}D$yTXa*^6FRnm{uU<`owf}e%2056B11AY#ECU^zB3;aC11^fbh3HU{L1Gox) z3iu`XyTLERj|0B~e+PIa{7CSt@Wa7>g3kfJ27fbn75ok0*Wok4e}+#7zX5+Gcr|<) z_)Yj8;5G0m;J4sAg4e<)fY-rm!Rz7AZ_ifVhCc<~0N((92fhxx5&m=VCisKk&G7rd zTj2MAx5C$ex4~}(SHo`rzYD(xydC~Ea1DHjtH3+pp9Q}M|9kLG_$R^d!#@Vz1wS9W z8~$PN9{2~rAHdH7*TOr&AHq)u?}ayl_rXsA?}wiN{s?|7_%HCIz<-6$2OogH1^hSo zLEw+!GrggO3A$4u2kVt}o!f2Oow1C-_VF zerVdh$Pn zP5}NcG%f2N5}MZXYlWug2Gv5-bAq)(cLY`nO^@G~37rHi61tPp)K%=sRvy~JuT`_b z&OKti32XwWUPa)00IJsnZ~;K|8Vw!>P`z@%Hv&|zLEvius#hOy8bI~B7@P!9y*g0Z z0M$zYf4@7M)$1hqYk=xi4?YM`y$*nD0jk$-@OFUewGI3>K=oP+ehr|<^ee$H0LjqL zf&T!cKtBzB0_Xz05bOoILjM{(2j~X<0N4Z2nCJvg11^Ft0Z#_HL*D})3-o}#1AHsc z6FLu^1zZe01e^(60^JXMC2%S96%+@gLHD3C0+&H2ffInsq1%AZ@5)xLfIbWU4(J8_ z5Ac^jZ|Kj#e*>m7aAaE1(0dOsl1-%=*9k>~K8+bi% z3-nvy*MOl^ckl`z8~R!B?*W?mECDYBXx88dR{(j?^T0EJVbCsc5s(jE2)+xr6?zN()*A{(dLsOwcF6UjuhQ z*Mq+V3ZOp+9|XowJAn5BW1&9)zYC0m-U?n1jHh-0zYN?7{UZ2T;4bJtf}aE?KtBOq z08E7Tg6{|JhMozw0QW$f!Fpg4^b{%=a4+;I@GxL9bPjkhFa>%b_*$S4`fBhcz*OiS z;Lem5v<@5(6hX&<&%c+g7@*IBj{!!7UcAM%2{1t)0)GS)L+=Ie07{_W1#bjOq2C6- z37Db(41NWe23-Yy2AB@L6ubzqK>rr(1+37&2G0R(&<}v`1MJW?$`f!v8^Duj8}vl* zSilK=2Y3YFg3bpI1>DeC;6Z=~dI0zuUI za2@#$cmVnz;Cf&-bO8K0Kwmz67<>?*&vYFCe+bYgmG*$Efw|CIz#D*h(Cff&01rd2 z0zVIwLoWwE4OBos1^z8i3H=-JeBjs6m6Rv&2=x767j1)ffX#pxx)?kKcocdP_%6Vw zT$o#RHanULb1gknYCiWJAvmtNq2!w1gS50gRu>d56sE_?t);oHm3q!kRuqlU*)Eft ze%jWix0>XAjV>m*O8>RH=yeyQ$)aNIPaD}iRBf|4VIA4Spi11JmUMRvtM0k-1r%UCbvHCKxeXiKv zP0Ej42Pr>t=R1eDbq?o8?tlny@bmDyBD_Lue_e!^ig1+(uM**<&9*NR z;bWm+hLX~!^1Gz;DQxK+t}l&IlcX?>QzNA?jZfK9n643nMS9CbdKn^2j;;^sQn*a{ zvCF$UN4XIg0Hg!&O2=2Fgk7X(z0J2}^)Ip;XWf$3ztnBD+|o|T{5q%cT%|PA5Y|fJ z&IoIya9f1cQuw>$e1EkFe|4Pi9}0hbobMkB?`#&{a-63Z3cn@NQwhA(Ec{22eklB; zNG}xrjYuyPo_jo}$ynq$9+x{?$mx%V>ql;Uvv9%j@G+K;K{S{Db@hD_8;#c*^p~tSZdL^&2EdS*lu%2v|{No(y;iXxiIc9Bd&c5Zv*N`&k@Hk-#sHlw+vVX8&DmP^-yU5lk_*{&tikeyXO&F(BU>5XPviPC}# z*-?LqVAg0C$wszAp(2_#?JupHHrB&r^R%$JMLUzt?VJ^ZT`VU$*%|Cs`U#*Gx6A28 z8xzQ}@gUk@1*bPS?Y3Fgh&F7Tj5@M#J3|a*BfIHE(PwmI=W$x1nep^YtsRM`b~E&? zk5#grtL4+Di6c8>aqDB6Y-h4MN@KBexp6#N@Ai#$2D3Y+cDC7Z-6}H~*-sHiurs%^ zO?G5g6wOHCcF|i|^s5-o4RYqD=At zvAgvVu5h9BOl5kjBSMWE>p{OK7{NGXXE8^vag+2S7&ng3dZ*j&F_gAe!bUs0V^%EV zbFtlN)khdRnv^esark(+92R}+$D&Dk5sbs-v%7JQM4e;dbhDc8kKR+suGnLXJlPR; zk+wJX7fcUKPJPsq-K{T*={#a~(J~L&;S7mpXSNwJ>x^tibt!Y2iX)gbv5R)?3fa+! z5R09|X~xNJG@4o&)aCSOlHa0{@}u-x&6@QWq!q2ol3m0qOLk=1YK4a=D_~MVSzhU5V2k%WaRs`T*DtR4%dIx!B?F*t+W;<4I_o%*O(n%G>V zdl}g|?K7j9{Nf@whu*1=W<##XZl4~_=HKCBosUOzKlj*jA?s3^ty(p;yDmn%>tnEs zwS2MK{ap2kbzSP`DqpPa7pvV*UJorylAPNUvM z|0CPc+M3=LdCiIJJT4Pvb`DRZ<*p0Kce-hoK_6v8Np>^z&Zx_Ev9>kY6`P$dcMSJs zv@WH0nOmJZU#OkI9B~<>(JmHuA?+NiT`Z35{!_1m7n)v?#cr5Ri&GKq8OgZ}PLnCh zJW};D+C_7**pT~gsqY1@OBpR@R}3rk(H*4|X?ZBremK$Sp;gpuF|L{Et|yuy?8qeQ zZAc7DQq29->rxi8E$V#yLi=De_lsT2?&q}g#Ly8gB)wQ%tajvLSdxl4y$i8(IL%gl zlobRv{+SGRn=!H_8`o^?VSuIBT;g#?7zM2+qgih+n%3$BS~#}87OS06@771OV(*Q( zV@Qr4kEo+sWBZw-%{dy|FN!70*JzIVo=2#iqb*IjV_XcXDM7X8UHr5WiR0NKUzjEP;hOeJ~?CK6^t z>(2tn#kwv7Lwgr>MYlD<;tzQX=K5f_TTQluM7 zpKP3huNCq1UOXK{>XHKmH-8sZc0c9!vB=|MniNN%ck$`hX6c{lF367;u8NX*5bakOHIueSj=r zA}|%O0A;{jU;(fQSO!!9tAMq@W?%^;UfL5zfl7OB-A7B8G4U7UN0!F|A z%m(HI3xOrT3Sbqm0jLIc0sDbNKma%aC~+Dk5l8`g0U1CRFaj74Oa&}J889DM1S|tq z0&9V4pcXg)90eMHb8+GJ`lapuwYKZ48g6orwi`Vb(+IuIXffr`XTu5$O-`qc&gCA^ zR=t^xX+=t*!9B}iqR&>OsP#p5r(5Z!)*B4sIo}Oxz1wb9l$+E=E|cDApm$q_sttMz z?ssYX9cqKc?lLL&sSUGAW}0n<^vKp})6+A>a<$Q7DKt3U8HI(n7G!2ROwK}w)6SA! zrZ$zCG5o%wF6Ifqy`e5Hws>6Z^_jQS#U&=UOIfRCuY4KY&PtuA(%Ow*MQz;3-;*{d#gn=BUPBX#jir+ByL6E(6z zZ4NV@$yPQ#Cv7S*Q{W4xZR{FK%03Ni8s#I+eJ(n_A8S|>DW4LHLZoV4Cb#&do7=Un z#ze+zT`q&(#?re>%bE~e&r8Zk1ceI z@w|3MV~2WGJEO7k>$IURqESZXkG(yA)b-c(GqNfuDTw<8(P4GXa$TF*FC)}$|84Gn E0ljyh#g2fZp*c4iny#ME%_q^vl=e$2Nl-(0%j10q=;87HY>1OE9$$aw956`q4e>{yj zp8E5--R%0G&)wY6=(D$aTXuSDcH3)fnwwjA`woxYD>U01o9(3=E9|>l>O8qqr>4zU zVYoPkS{H&FDHoe|E^tt*hZ{Aif1Nu~<>C(0E zysb;4=>7rHteVE~4P80Thu`Ybd*K<`uhP|Hqp%SxBgm`~X4%T23lR`%|70~vvCg)+0^Lcu`Q2nafp(dP9TJoCy}u*Ep2my2S%f* zsbw#WtexN6VsB~1(Ev;^Jc7?tFEjzQP5UWVKrkBX_hZ#K0}Ik9vYZ?$7kUEfTAFW$ z&I&xR%wE&HpKpMs*><&JEz;s^00uzcYHK|{ANFN0_621wxi2KAW(UBsH|_@G*y`~D zQB-<7bxC6iY-#rR(&BWX%q0V>YxK1?)$F(PXlY3?46fa?uaS>8Qm25fk=hNdKqtD1 z)`XvQpn!d~ExVxwP*>x#*Li%k-o_ms6d-%~>JqzS$zn&Y-Cl)kC6p7^@C_a+VQIh^ zp{WiHe+}uT$E#7$Qcnq2T?7DvST)fiBMhZ{3seBPPpcvPu?DL0LWIbxz&AGeoI9I^+!pW7J93%O9;!>zE2M4a;CcR@!0B;i*`=V90p;ok zrNvL}vVfA!Pq9IYzX^(WO=_@DcQU&e`8%^1CUDwz6f2TiN3oK!jHHJFhSF-0Lsbkj z@)(0P$GZ@)%M~cHCxOn>fv%>Y?@~eA=GIlg}ll7s8AObnUq~eokFeJ_vN}ny-0=;(H+*Ft< zc=}DVnPM${i{KW|6#EM^Zm~YXMI|o1(;W@G!HU>W;xa^AaExD_|GsZ!Xs-foI(qo5 z!mYx>{6F(^ilJerDWh;JpH|o`OzStKMbg9lhOLolFuvW0KQb+R$WXj0|9$W2egos^ zx%czipYJ1ml-y>20mI)YO=TW-qC8liF^rY6Y^gBG(G!^}j;(@X;g1B$^L;stcL(ET zvV2UK@W-O^$88Z`dv5+v(9tdA%EX zy}^wmU=Q{PYXhfa4QO7WRFxi+d^0Jwx#VkUBr-1y)w&M?CV-XF{Y8klD&**97_ojR z2Ofb4#}vULLHUYS6JJ0m`bQ{^+)DB>GnZrr zH&YP-m~&Jx_iJF50T{|&lQ`z+33+6~*JRW6ag#L52gbEYDEO#q{aD?~XUK%pipS8QyYd(+>Ak0aruUI8`c1ZI@FHv7cC<+&q6DMYE)Z85vtH6l0QBb%tzbD zRX0GWYpkByEZ&ol#XwPYlFn$= z>5Ok?5S{V!YpBksj_VAp)P+frGgD!9nnZ3WGFKc!u|;`=iBvA{EC)g4hKSf%I~Ey{ zrZbc@nFf~#8{L;g_wf)Xi(I$DodM*Md#GIEj=Lmxce(s<89+IOK+amfRA)f-A^Vr# zWbL>M;{F3RB~3`Vv)^REsS@HYxzz5bnPX|7*@kWIk z478nq9{meLEFEU93KaDu^=VMor`fbmwKm$Po_L?IQWqv8PLQpl;UoxAy?vt)=Bf~e z;}Eb?7bac6*M^&*n#{Nuomw@^Pi`by7ldwXm8II+vF}4g0U3kgu|PGK>?h?mi5nVo zTAch^Dk4m~o)%ksf|f;;mPf6sL(m>~2-=B5(2m8CTf=nfxQAA_O#BkSR4#vRV_dz? zlQ^@BYS@g8s)l{(PF2H>+zA334z!(PgmOxaJ&Bq;9W_o$&197tdz_j)LXEv$71%uh zeB>1t;c5c;0;HsE=N4^yG0^rRWBt-^$#BL1FDt-!Rwv2&9U!ww?W4N(@6qr?A`8%zpwPx^=R( znc2FP+3RiOJ*qcE{D^GuBjkF}1rEhArW$C~TszJWa2JXH?zTvVqhwtK=6;=>h+z4h zWY#p?3CV`7@JAj^rIYIPC{3595g`q6QIQ)SsUq0_P?U{&Pe>a`!3g%N3nLQvC#J8h65W?Z z{taRLge5#7tQdKmAvm8S30&}qV*@FuKS`w&;$XlpvR53_+L825tsWDvM||gv=tGTy zeYhixjQav|^M3qu5dR#u#}|`k*;P#VE3b7Ddj?~0?K;9!h_mwIKNBZ|6f`(((6}BN zOPqzcIPxD>(ZPu+*5KZ&iUP~stwDv~g66u2dC;l1Z4V~&%@I1-KQgPf?ZLQhdyv?+ z2UUHupp??Y%HNF=4=m7jiP2%OCt=9bVPNJG3{@%ydmKX^!C==g^p|KD)~Xn&*+L`& zMdD0C;?f~;QY3$wtlEV*5*I<@)R5G~k-Yhiio`qtNp%vERvi*QMG{hxRL7CD5+v0c zlJQju?Hb7jG(pAMfyWkI*fHk{&a8IsNK)sH z>1ARb>0HSq)yl;?cZ_uIh}OC97i*nc`ZnbxxOs>Lknp%JmrM^vQo3)^p+-M+IRG?MB^$aF#xZoPw2x6_{&GRA74I0y9Vi2GeqH3301g`M^pFw+I)-4F3iF zmdhh06L1bE;f(5Vs>|hX8Y#}rPCQS=Rkmb6gZY4gN*qAA6U`ZSf)Z`*@X(SF*8>jo3733Ri6)R!B=tQ~IvZEXL- zK4F-&KT$3}O-rT8MXz0BdXden5yYdqqsk{2MdpR%gn8QnEsz5-kk`=FcR7Bk{J zZ|(RtPR$iSi&$Z9Ux`38W{D*hm_)ZoYfNHq@9P=jsrEM*$nSl_ocgO?*{r28VN30e zn8MOVQ}B6f5dDY17cC6GNLpk5R83PrH*7SEciBj@Y-yuK{8{fC8RD5N(rVb8da8HC ztR^vTOZ{2MR1ldgj)^g&(;}9nla{wg8*QJiWeT>li6t3oyEW;bicsuhx_DQnMrX#S z!$#>`lOdMaBa4auP$f%FA_NsO$~zG}B5{!nQclKp5K1CuaZE`;G1nFm>Rz##>||IJ z!7PVUakDg$KduNiwdg(ui?n@rU7OMgZALM37Rd}J<$c{u@^-_*p=PJY_c2SDTbbP5 zEldgH+E}q}OMH)?__-%R-XsQ%K%0dTCOdjY`cd}V%#2{}vbB;8E@|d?5O+_;BU5nC zq-lhw$y$(q)Z+_rLg#w47s(4aypvu%<)Fv-Ql-|0H@v&(0tHnYwMl%|0p zv;)aI3X$X}qMb|8;*N)oiVDdcEtmgkl8XB)T13<$euzkIv1A(qM$iV(O$7QSu+=et zL4hzu;h>u_e|`b~9%OYII(h_)RCcMKE$J_2naEu5@e2$1Sz)Nu$sRHki)FD@ooq)B zZz?Ph{s>Yb374MB%F%D5^68j&Gv-aw@&v2As|fY7EZV@;j@*x4LRoZ^#9abUVYFP% zG{;B7+Ob_h0|$gzHdV@%OkC3nw}WNww?&NNSV_qA4KkdCc?_RHJOfL)vNTV=IZ>T| z6_xWf08IW9bXzKuMY9+SdCutPVsz&^tqpvzG<1L!(mJxj^q#lKwNSwW4Sj z`8){=E=s0{#s1#6lJwupdj0n@>c9R-T3BiWLv~SG+Kv33g{Bz6LCW$EL}S)q7oAxM?z+JJ#D=Voj(;-Dkm!gswTNVI(?OcrrLs{e{gC)Fa(6I}vA_3^W;Ka%Tk6Y^sbM5^jU7j1X&Bjy zdq;%51&HzP&&1yAMk+yiKo=s+beNL)n~}f8+Kjj$%?|AUFY>p|QYCLKQ2A>O{^=@i z=U$L90{Z}9n&iwF`TA9YThF^cGlX}l+C~EIv*iop*1*eDXKx#4-~CktX#n1v4eaZHcjqBGJZ{`?`Zob<^ zB4rylaGQ(E@5cBBcNtf{t^}i-*Ok#?uA-uN4OfBj;`Qq>*s^5{IgbKW9*9layG@xN zd}1kB&#@@{?SbbEJcIBI!7~hx3{Uqe_!GG;++BuYZn(P=!_S4gcVKu!xO+E-*M_?V z45x*=+cBIJ?mh$|5MR7ujT`7-Fv943iO~iHF%&P?%yNoc?(}wX2$&(v8O8`96AP3{x8L62q|yEX!DEm7@76wo3If!A5BrdKCT@ z3|aU!n4o=yeEfDz4@@0M!E(%wToWc5`u{@VQOtxI?N_mcPYvKP?Ay1&>e)t|F8SWi zPw=_Sun0++=vTo4MfI$%jwuSETRpFCGo$tRIyCUFWUL)uLg}A_E>9!{<>q=IeHOy? znX2ST8nwKs?e}1#&}*96jjj#akK1t9E|>cA(5jWRGUJYu{PWwi>DV!qIvowzij@7k zR>t2zmLZV!o!b&V%QW!HE|58Rk~AqX7fsbT;gT;dgA$*40a?wEyi=%(Bod zK7a?b2MdkIYp*oRiwleJmgLN0a#wXuH6W(?Qbl?I?0l zO_}QMf^cNdsmwOOQlpZtMKZKVrWUblk@;F=0gX7u9E#W{UKe3YI*s6v+6uSxmO>|Q zE?fl8X|^zuf1NOsh)RXrzZf0zk?&Jm=3lYh8vG8#`;APA#HEWFoioI!#g6OQlFk_& zXZhLwE4h5S|B92h`mZeF)BIPmLA_nsE)0wP{uQ}G6WP`#&D|N|b)7RTHdtfQwouP0 zjEeox8EJa{tGp90&a41J#G!?Qu5$Tm8v2fzq5-nN=gCkU^1xyoS3Ha-O9(Dg$&+td zj2A}2fnS(AjnJ#90fnUp0)>l&70;owUFZ~2badFn>!1^0zQQE|#URWi#7rRn_b~hl z%YU)c7;^pEe}&y+D%>tKP-u&U1q4u;U7St$VM_2L0pT67ALz*zZlb)Kuky~2s7tDi zl4{!p3#Dy=cwOKZET9%{gTakn61>LFr5E&tO(w6Jg73IKxRm$iE!sbEjOXF$C*5R6^M_a(q;-HyIAPNK95x&2nn zBrgqpgNb3gaftwMHQ@FB3i-x7&1zhuwkgxv@Mp!pSf2?p806+#G z#iR+Ar3f<_ktM9d1J$e@_Ym+=0zQZVj4{K{5qlE|Yy^H<0)D5VFil7U1pTYnw1_zj zLvDmr*LD5P>lz zo%l@Sl@eiUxl0yMicBAnVm5j-V?wid3rff)iEs3-bU1l@SmekbnyLy&OWd_!=%m9{-T+XG@P_gK{~amIa>*w zQ}(Y=M$;46bsFJbxNgYF+Qe!9+y{eE2?`SaU{Fi@r3n`p(6jS0HY#?ou z6aFH)u4tWON}jS zXl^*!I){oCw(rh`r+Bj%J!CA2ydKu{oOb7y_|f3+pe_q#PR}3mSpsxV`)wF}r{gT- zSjAIhA1?U3V8S(wI7m7aj_>IqgWEFnh{0rpwx%hdkjHxMyj5z;)OF+qw2Pb^@W?iP zy3}S*>g5ZPJ6&{N3V1G=`D>-N`AOYLpMv)s#aG9;^d3H4YFm(0nwbW)y+qoN20WuC zY@hwH?WMNmN%?mxgrr!&6EpJbpEMxsyrdfUv5^#dj~2Vc^4CjkOOq;?rm=&e(hNgn zdN^ddmc%9l&qAfsS(p5^1x#WG>QBTOA4eyP?n136(`LkZ$F)(8=FMdl8IaHpe_cPm_Shg**!X@|8GO{xOCAp-;ZHHF>td(5Sm6Xlj){(a=RIZJtYoiz4)S{^u`SBZ!B3tb9!SY_Eh^DRx6AuB+Ma;!TQYe zFTEKueIp$;f&87%p$k4vEt(mO-`$8;;>N{1^{A1Ky_`ZXMh0T6Fa>Z1hBE@O3?YTw zTEOaCOzIgxP!Vk8fDh5{tMUCoQg8h--X|UUh`gK)CE(>h%X` z8R)f%Wy7#;JdE!vI&eRROTRoAs!&9CG}vbiehsq6`quENV||ZVgNM+y7y_a~cPV07 z6iDOuImRMY^t=+*3EXnPxD>jQw@Ko%T_`XpTM}o7cqYU%HdQ2Ru}zg^+rAe_#63p$ zuxLsXe;F8nm7dP2aG({m9WYI2D3`Qd*G69p z6JG~7&JzC>PueZMtoYq>(6H8LOiMb!R6jYHpS)sJ#br)6u_qgmW^Layjw2h%Wgv#c&(B+X=AKja`VUv(&}{Y|E4M;^v|0FkVlZ z_*Ce9r)kC^wwR#&c|Xe}+|N(g*PvzSGo*`S){}<(GeU|u7)d35itx6hCvIbiuUf>w zVz|qOYh-R*qG!DBSpF&Nm;69|e(c}@$sJn+6NwvN2-ydhNoBExy)ewdo`W~wU7gI% zkmbi>Kgh^*ST?ibj6k0$&}-TtfEOJV%VLpRQNNiAL~b;A_TY_p!ooqTLm^AI`0_{F zw86S+jxPva!6JE7`2xx5jrw=&|)t zta%h04WtZqI2khI!4==W1}yODEbvvLklQ)KePEA|l2@11La9N@RxR|BBDZKgG|{ zcHhoWdl5msli$nJmIQD_y(F@h6{nKIHdRDh8e&Ix=WhNryGn_!sY$OP+;_WIyW^v3(hyleyXFN94PzbZSuxthC zJfB6%A~%qIcZ-zX?k~s@CU@S+c04cSQZ_Kc)NZsxBcGc>_G-kL*<@*f4e1r{sZ(%` ziW_d}3_r#Hevb7KdhfvrW`8C!A4{wqS4}GCRZi?C?!n~Xa^WBsUWfo;=yW#*54>)yKb)133Rh`i_d}SSZffkMv%LJv#A^(P0WXpe`e?%A$6SHIK(`-%0P5DiRdFb zqK{Fctt!#sIMGK4(P2H&V{<+g(MJn$cCKV_G;RL;0&B2gGQ)J^uGh%tC)57?EhvGu z42B2CDT=$PX)wBy%N#sw4W{Eo2Fez4)dD6j@6d!+4_ zmI=GMs=w2)@hP3kb)zCKQampmSGeU7_KybTLgyite$n>BMJ1^7=CjF@DCXlP3jNR zk?4?4Hiu%7I*vpx;kngnlTHN(KMq#vKgE)1!5;UcjMycO^27#uw# z2A0|u_eC@j=%0lXOU>>o#PU0w!dFyv20mYbFo&o`;+*4am0#+e?OfnzFGHBm$*$j<6XSk5cV_wy&t{5GQhAmaXSZ`Ch@7Czcb)8U%l|-#|E61J)0NX z2AsIH#tb-ZG|0d}w`U?5L>AAbipjB5u^C1U_sPyAoej5{rR^Ewka3MoTw}{0@)?yi z>46V!-;;WBA3(!9xhI!HWZ`R}(i<~zJF3A}g|97qcP0o!`VFDXS<)I?@32uU$&@yx z_r7k#q&z3JSG>!P$7O+2=JL>*OqZNOu5+XN0Bov~@!nO^eS_|C=!X2#HR`z=UYrSi zqguh^i@%T?__ol0*xpf;FrGJ7b>o+=77n>~u_3(bzZ9rpal^9x1I5ZPdrhD<&%1$0)jSmpoK@T_)KtA1CkKy5!7s>bh|@)|C-jdL5E|)wyR0o&<^S z2Hxzc5C;MSnN{)wNW@zx^P#O7WIQXXo);XYU&-B%w860D*|Wkvx&Gwa7x#R?#D&`LC{%}Cn0Q6ee_eI)> zfSDUg#1kYuCUR#q5*`aZo^ig_K3{{-H=TV!q^$^?x!*{{6C^w$x?hZwa6IqrUp(8Z z0qDP$eeILE5Ei*Xjf608;d|Bt?|n8d92VW@bX>Tl{~y+THZB|jA4wzO5O86}>bxgE z8y7l6_XQmn*hg1?_}RGN7r9}L1V3T%0$=7$4}ama@ui8-GOFXt zSMPi5!_UT-20}|rqXm<|moJs<|ITOP3uwy(N9LN3uS?=c)G;*ojAO{iJr4cck#)mZ z??4K4Fy@HP9dblbG7p=bKXCT+_ND^OXB@G)QAf-e37vJ@~@_ew*#qmy^NM!9HxRNG~-cVE|$u&uD+EYiI)WFhD=^!ApNg zh8{dX$LXz~zdm;Yf(DA<<;l1AC3k^)1Tg%=)L)NIz~BcAe@efHn}DH-Vn`Wz^Is-# z=rI5vJNnM}1n?aI{uM*Z&SdaZqK@ZvuD>M|$AD;&KdbVuD7^zF3LKf{2hirxjF$psAI+*v)IXz?$t>bwqa}Jr3 zz^WseKX~pHJy^=O!{*=rpYw0&AQLf(9r)IbNq`>%z@EydPgB5WE)S-vlmR2=EgbC~ zm;`W#AY1MAVe{9OTS|I+(*SG~vJ>olJma5ldgQ6zJ}Ur^L5Vt4$Mf=!e099Hf2Iz+ zrYrjHzSlDW!y|yE;a+praXl@L^d^K{*W73sPOD=Et`jrTdW$_0V!NxjeDk^z_xj>;yUShf+E_t8AsD~2FPNom_@xL%NT&{D%i9^Q+^`Zzasfbfx^jWNn>O87T56!3yhO`6(<;h2@XK3KLkE zmQPG#w3h)sBClnh-7Q}H@JU0BfZrvs22^w4wS%&W7U+y1k`kq{trPa3cYb z+2SQXfD$Do^C5Bo084wkqZz=LYrX;nu7)4!p}b?%HVU+?U1{W9OI{u zyIkMGw;smSxd+|C>j7DH&^!HJk44&MlZ5m@QT9VPxo*o}HVEK^d0jmayB?Q>Dac!kj%CcwGvL6Y2>uu?2_vZao%b7TFp=Z zlZ1YlDuC}^yl+T)mxP;Rm#`W zIw)6NnGZvU2eofY#r*>d@E>oiX5pML%Udbu@w*ZhN6*OXP?dbkN$exN8YnS6Ndj{O z&uvO9cxz!GfO}F5iQ&0-E~$|{zu5^vUN#BRF9wN-OqBvpK=Dyze`NANi47wICAhVS zHyFf{1p_5(Eu_hM6A4`7yD`{2N`m=v5U)BgqH&-k;{wUbyx4?+{US+~p4jaq`i+qv z!yWFD0|O;X@eAYwCCj&vpb)=&J5b^*d`P|0fa>^^Ir-aQO4fMT$%Mm7*7ApG*r0|T zYIr~moocv14d<(2Ol_a1rp;<-Qp3$^Xjj7~HLO#^rE18lVY(WYs$sPny3}yJ8Xi)^ z!)oYP!&WuSR>Q4oXi>vQ)UZ$uZECny4Z~{qm>O@I!oUCi_x|uj(U1ELt)Tg=n#ORYF8%l4|ID8=oQN-dgkfTkzNE`r3wcjG{LyyW z?`bIOhUYXqgYaB{M}}t<+kAy#%r9Dt_-p2P4w0?*^{ zJPFTnczWP@5uPD&zdWPWRara;~ANVpf@Qexi3xTkp!#upkJ zeKkD4ALE}l?vD4R-niSdySA0&w;KssCS;7GWd@Ca7HYm^B1Dj)Cor9<$`!X4wDXfcX8z#xb;gG MYk7bF{m=OQC%GZOhX4Qo diff --git a/bin/perlbug b/bin/perlbug deleted file mode 100644 index e9a22a30..00000000 --- a/bin/perlbug +++ /dev/null @@ -1,1150 +0,0 @@ -#!/usr/bin/perl - eval 'exec /usr/bin/perl -S $0 ${1+"$@"}' - if $running_under_some_shell; - -my $config_tag1 = 'v5.6.1 - Sat May 18 14:14:54 EDT 2002'; - -my $patchlevel_date = 986778897; -my $patch_tags = ''; -my @patches = ( - '' -); - -use Config; -use File::Spec; # keep perlbug Perl 5.005 compatible -use Getopt::Std; -use strict; - -sub paraprint; - -BEGIN { - eval "use Mail::Send;"; - $::HaveSend = ($@ eq ""); - eval "use Mail::Util;"; - $::HaveUtil = ($@ eq ""); -}; - -my $Version = "1.33"; - -# Changed in 1.06 to skip Mail::Send and Mail::Util if not available. -# Changed in 1.07 to see more sendmail execs, and added pipe output. -# Changed in 1.08 to use correct address for sendmail. -# Changed in 1.09 to close the REP file before calling it up in the editor. -# Also removed some old comments duplicated elsewhere. -# Changed in 1.10 to run under VMS without Mail::Send; also fixed -# temp filename generation. -# Changed in 1.11 to clean up some text and removed Mail::Send deactivator. -# Changed in 1.12 to check for editor errors, make save/send distinction -# clearer and add $ENV{REPLYTO}. -# Changed in 1.13 to hopefully make it more difficult to accidentally -# send mail -# Changed in 1.14 to make the prompts a little more clear on providing -# helpful information. Also let file read fail gracefully. -# Changed in 1.15 to add warnings to stop people using perlbug for non-bugs. -# Also report selected environment variables. -# Changed in 1.16 to include @INC, and allow user to re-edit if no changes. -# Changed in 1.17 Win32 support added. GSAR 97-04-12 -# Changed in 1.18 add '-ok' option for reporting build success. CFR 97-06-18 -# Changed in 1.19 '-ok' default not '-v' -# add local patch information -# warn on '-ok' if this is an old system; add '-okay' -# Changed in 1.20 Added patchlevel.h reading and version/config checks -# Changed in 1.21 Added '-nok' for reporting build failure DFD 98-05-05 -# Changed in 1.22 Heavy reformatting & minor bugfixes HVDS 98-05-10 -# Changed in 1.23 Restore -ok(ay): say 'success'; don't prompt -# Changed in 1.24 Added '-F' to save report HVDS 98-07-01 -# Changed in 1.25 Warn on failure to open save file. HVDS 98-07-12 -# Changed in 1.26 Don't require -t STDIN for -ok. HVDS 98-07-15 -# Changed in 1.27 Added Mac OS and File::Spec support CNANDOR 99-07-27 -# Changed in 1.28 Additional questions for Perlbugtron RFOLEY 20.03.2000 -# Changed in 1.29 Perlbug(tron): auto(-ok), short prompts RFOLEY 05-05-2000 -# Changed in 1.30 Added warnings on failure to open files MSTEVENS 13-07-2000 -# Changed in 1.31 Add checks on close().Fix my $var unless. TJENNESS 26-07-2000 -# Changed in 1.32 Use File::Spec->tmpdir TJENNESS 20-08-2000 -# Changed in 1.33 Don't require -t STDOUT for -ok. - -# TODO: - Allow the user to re-name the file on mail failure, and -# make sure failure (transmission-wise) of Mail::Send is -# accounted for. -# - Test -b option - -my( $file, $usefile, $cc, $address, $perlbug, $testaddress, $filename, - $subject, $from, $verbose, $ed, $outfile, $Is_MacOS, $category, $severity, - $fh, $me, $Is_MSWin32, $Is_VMS, $msg, $body, $andcc, %REP, $ok); - -my $perl_version = $^V ? sprintf("v%vd", $^V) : $]; - -my $config_tag2 = "$perl_version - $Config{cf_time}"; - -Init(); - -if ($::opt_h) { Help(); exit; } -if ($::opt_d) { Dump(*STDOUT); exit; } -if (!-t STDIN && !($ok and not $::opt_n)) { - paraprint < { - 'default' => 'core', - 'ok' => 'install', - 'opts' => [qw(core docs install library utilities)], # patch, notabug - }, - 'severity' => { - 'default' => 'low', - 'ok' => 'none', - 'opts' => [qw(critical high medium low wishlist none)], # zero - }, - ); - die "Invalid alternative($name) requested\n" unless grep(/^$name$/, keys %alts); - my $alt = ""; - if ($ok) { - $alt = $alts{$name}{'ok'}; - } else { - my @alts = @{$alts{$name}{'opts'}}; - paraprint < 5) { - die "Invalid $name: aborting.\n"; - } - print "Please enter a \u$name [$alts{$name}{'default'}]: "; - $alt = <>; - chomp $alt; - if ($alt =~ /^\s*$/) { - $alt = $alts{$name}{'default'}; - } - } while !((($alt) = grep(/^$alt/i, @alts))); - } - lc $alt; -} - -sub Init { - # -------- Setup -------- - - $Is_MSWin32 = $^O eq 'MSWin32'; - $Is_VMS = $^O eq 'VMS'; - $Is_MacOS = $^O eq 'MacOS'; - - @ARGV = split m/\s+/, - MacPerl::Ask('Provide command-line args here (-h for help):') - if $Is_MacOS && $MacPerl::Version =~ /App/; - - if (!getopts("Adhva:s:b:f:F:r:e:SCc:to:n:")) { Help(); exit; }; - - # This comment is needed to notify metaconfig that we are - # using the $perladmin, $cf_by, and $cf_time definitions. - - # -------- Configuration --------- - - # perlbug address - $perlbug = 'perlbug@perl.org'; - - # Test address - $testaddress = 'perlbug-test@perl.com'; - - # Target address - $address = $::opt_a || ($::opt_t ? $testaddress : $perlbug); - - # Users address, used in message and in Reply-To header - $from = $::opt_r || ""; - - # Include verbose configuration information - $verbose = $::opt_v || 0; - - # Subject of bug-report message - $subject = $::opt_s || ""; - - # Send a file - $usefile = ($::opt_f || 0); - - # File to send as report - $file = $::opt_f || ""; - - # File to output to - $outfile = $::opt_F || ""; - - # Body of report - $body = $::opt_b || ""; - - # Editor - $ed = $::opt_e || $ENV{VISUAL} || $ENV{EDITOR} || $ENV{EDIT} - || ($Is_VMS && "edit/tpu") - || ($Is_MSWin32 && "notepad") - || ($Is_MacOS && '') - || "vi"; - - # Not OK - provide build failure template by finessing OK report - if ($::opt_n) { - if (substr($::opt_n, 0, 2) eq 'ok' ) { - $::opt_o = substr($::opt_n, 1); - } else { - Help(); - exit(); - } - } - - # OK - send "OK" report for build on this system - $ok = 0; - if ($::opt_o) { - if ($::opt_o eq 'k' or $::opt_o eq 'kay') { - my $age = time - $patchlevel_date; - if ($::opt_o eq 'k' and $age > 60 * 24 * 60 * 60 ) { - my $date = localtime $patchlevel_date; - print <<"EOF"; -"perlbug -ok" and "perlbug -nok" do not report on Perl versions which -are more than 60 days old. This Perl version was constructed on -$date. If you really want to report this, use -"perlbug -okay" or "perlbug -nokay". -EOF - exit(); - } - # force these options - unless ($::opt_n) { - $::opt_S = 1; # don't prompt for send - $::opt_b = 1; # we have a body - $body = "Perl reported to build OK on this system.\n"; - } - $::opt_C = 1; # don't send a copy to the local admin - $::opt_s = 1; # we have a subject line - $subject = ($::opt_n ? 'Not ' : '') - . "OK: perl $perl_version ${patch_tags}on" - ." $::Config{'archname'} $::Config{'osvers'} $subject"; - $ok = 1; - } else { - Help(); - exit(); - } - } - - # Possible administrator addresses, in order of confidence - # (Note that cf_email is not mentioned to metaconfig, since - # we don't really want it. We'll just take it if we have to.) - # - # This has to be after the $ok stuff above because of the way - # that $::opt_C is forced. - $cc = $::opt_C ? "" : ( - $::opt_c || $::Config{'perladmin'} - || $::Config{'cf_email'} || $::Config{'cf_by'} - ); - - # My username - $me = $Is_MSWin32 ? $ENV{'USERNAME'} - : $^O eq 'os2' ? $ENV{'USER'} || $ENV{'LOGNAME'} - : $Is_MacOS ? $ENV{'USER'} - : eval { getpwuid($<) }; # May be missing - - $from = $::Config{'cf_email'} - if !$from && $::Config{'cf_email'} && $::Config{'cf_by'} && $me && - ($me eq $::Config{'cf_by'}); -} # sub Init - -sub Query { - # Explain what perlbug is - unless ($ok) { - paraprint <; - - my $err = 0; - while ($subject !~ /\S/) { - print "\nPlease enter a subject: "; - $subject = <>; - if ($err++ > 5) { - die "Aborting.\n"; - } - } - chop $subject; - } - - # Prompt for return address, if needed - unless ($from) { - # Try and guess return address - my $guess; - - $guess = $ENV{'REPLY-TO'} || $ENV{'REPLYTO'} || ''; - if ($Is_MacOS) { - require Mac::InternetConfig; - $guess = $Mac::InternetConfig::InternetConfig{ - Mac::InternetConfig::kICEmail() - }; - } - - unless ($guess) { - my $domain; - if ($::HaveUtil) { - $domain = Mail::Util::maildomain(); - } elsif ($Is_MSWin32) { - $domain = $ENV{'USERDOMAIN'}; - } else { - require Sys::Hostname; - $domain = Sys::Hostname::hostname(); - } - if ($domain) { - if ($Is_VMS && !$::Config{'d_socket'}) { - $guess = "$domain\:\:$me"; - } else { - $guess = "$me\@$domain" if $domain; - } - } - } - - if ($guess) { - unless ($ok) { - paraprint <; - chop $from; - $from = $guess if $from eq ''; - } - } - - if ($from eq $cc or $me eq $cc) { - # Try not to copy ourselves - $cc = "yourself"; - } - - # Prompt for administrator address, unless an override was given - if( !$::opt_C and !$::opt_c ) { - paraprint <; - chop $entry; - - if ($entry ne "") { - $cc = $entry; - $cc = '' if $me eq $cc; - } - } - - $cc = '' if $cc =~ /^(none|yourself|me|myself|ourselves)$/i; - $andcc = " and $cc" if $cc; - - # Prompt for editor, if no override is given -editor: - unless ($::opt_e || $::opt_f || $::opt_b) { - paraprint <; - chop $entry; - - $usefile = 0; - if ($entry eq "file") { - $usefile = 1; - } elsif ($entry ne "") { - $ed = $entry; - } - } - - # Prompt for category of bug - $category ||= ask_for_alternatives('category'); - - # Prompt for severity of bug - $severity ||= ask_for_alternatives('severity'); - - # Generate scratch file to edit report in - $filename = filename(); - - # Prompt for file to read report from, if needed - if ($usefile and !$file) { -filename: - paraprint <; - chop $entry; - - if ($entry eq "") { - paraprint <$filename") or die "Unable to create report file `$filename': $!\n"; - my $reptype = !$ok ? "bug" : $::opt_n ? "build failure" : "success"; - - print REP <) { - print REP $_ - } - close(F) or die "Error closing `$file': $!"; - } else { - print REP <) { - s/\s+//g; - $REP{$_}++; - } - close(REP) or die "Error closing report file `$filename': $!"; -} # sub Query - -sub Dump { - local(*OUT) = @_; - - print OUT <; - chop $entry; - $ed = $entry unless $entry eq ''; - } - -tryagain: - my $sts; - $sts = system("$ed $filename") unless $Is_MacOS; - if ($Is_MacOS) { - require ExtUtils::MakeMaker; - ExtUtils::MM_MacOS::launch_file($filename); - paraprint <; - } - if ($sts) { - paraprint <; - chop $entry; - - if ($entry ne "") { - $ed = $entry; - goto tryagain; - } else { - paraprint <) { - s/\s+//g; - $unseen++ if $_ ne '' and not exists $REP{$_}; - } - - while ($unseen == 0) { - paraprint <); - if ($action =~ /^[re]/i) { # etry dit - goto tryagain; - } elsif ($action =~ /^[cq]/i) { # ancel, uit - Cancel(); - } - } -} # sub Edit - -sub Cancel { - 1 while unlink($filename); # remove all versions under VMS - print "\nCancelling.\n"; - exit(0); -} - -sub NowWhat { - # Report is done, prompt for further action - if( !$::opt_S ) { - while(1) { - paraprint <; - chop $action; - - if ($action =~ /^(f|sa)/i) { # ile/ve - print "\n\nName of file to save message in [perlbug.rep]: "; - my $file = scalar <>; - chop $file; - $file = "perlbug.rep" if $file eq ""; - - unless (open(FILE, ">$file")) { - print "\nError opening $file: $!\n\n"; - goto retry; - } - open(REP, "<$filename") or die "Couldn't open file `$filename': $!\n"; - print FILE "To: $address\nSubject: $subject\n"; - print FILE "Cc: $cc\n" if $cc; - print FILE "Reply-To: $from\n" if $from; - print FILE "\n"; - while () { print FILE } - close(REP) or die "Error closing report file `$filename': $!"; - close(FILE) or die "Error closing $file: $!"; - - print "\nMessage saved in `$file'.\n"; - exit; - } elsif ($action =~ /^(d|l|sh)/i ) { # isplay, ist, ow - # Display the message - open(REP, "<$filename") or die "Couldn't open file `$filename': $!\n"; - while () { print $_ } - close(REP) or die "Error closing report file `$filename': $!"; - } elsif ($action =~ /^se/i) { # end - # Send the message - print "Are you certain you want to send this message?\n" - . 'Please type "yes" if you are: '; - my $reply = scalar ; - chop $reply; - if ($reply eq "yes") { - last; - } else { - paraprint <dit, e-edit - # edit the message - Edit(); - } elsif ($action =~ /^[qc]/i) { # ancel, uit - Cancel(); - } elsif ($action =~ /^s/i) { - paraprint <$outfile" or die "Couldn't open '$outfile': $!\n"; - goto sendout; - } - if ($::HaveSend) { - $msg = new Mail::Send Subject => $subject, To => $address; - $msg->cc($cc) if $cc; - $msg->add("Reply-To",$from) if $from; - - $fh = $msg->open; - open(REP, "<$filename") or die "Couldn't open `$filename': $!\n"; - while () { print $fh $_ } - close(REP) or die "Error closing $filename: $!"; - $fh->close; - - print "\nMessage sent.\n"; - } elsif ($Is_VMS) { - if ( ($address =~ /@/ and $address !~ /^\w+%"/) or - ($cc =~ /@/ and $cc !~ /^\w+%"/) ) { - my $prefix; - foreach (qw[ IN MX SMTP UCX PONY WINS ], '') { - $prefix = "$_%", last if $ENV{"MAIL\$PROTOCOL_$_"}; - } - $address = qq[${prefix}"$address"] unless $address =~ /^\w+%"/; - $cc = qq[${prefix}"$cc"] unless !$cc || $cc =~ /^\w+%"/; - } - $subject =~ s/"/""/g; $address =~ s/"/""/g; $cc =~ s/"/""/g; - my $sts = system(qq[mail/Subject="$subject" $filename. "$address","$cc"]); - if ($sts) { - die <) { print SENDMAIL $_ } - close(REP) or die "Error closing $filename: $!"; - - if (close(SENDMAIL)) { - printf "\nMessage %s.\n", $outfile ? "saved" : "sent"; - } else { - warn "\nSendmail returned status '", $? >> 8, "'\n"; - } - } - 1 while unlink($filename); # remove all versions under VMS -} # sub Send - -sub Help { - print <tmpdir(); - $filename = "bugrep0$$"; - $filename++ while -e File::Spec->catfile($dir, $filename); - $filename = File::Spec->catfile($dir, $filename); -} - -sub paraprint { - my @paragraphs = split /\n{2,}/, "@_"; - print "\n\n"; - for (@paragraphs) { # implicit local $_ - s/(\S)\s*\n/$1 /g; - write; - print "\n"; - } -} - -format STDOUT = -^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ~~ -$_ -. - -__END__ - -=head1 NAME - -perlbug - how to submit bug reports on Perl - -=head1 SYNOPSIS - -B S<[ B<-v> ]> S<[ B<-a> I

]> S<[ B<-s> I ]> -S<[ B<-b> I | B<-f> I ]> S<[ B<-F> I ]> -S<[ B<-r> I ]> -S<[ B<-e> I ]> S<[ B<-c> I | B<-C> ]> -S<[ B<-S> ]> S<[ B<-t> ]> S<[ B<-d> ]> S<[ B<-A> ]> S<[ B<-h> ]> - -B S<[ B<-v> ]> S<[ B<-r> I ]> - S<[ B<-A> ]> S<[ B<-ok> | B<-okay> | B<-nok> | B<-nokay> ]> - -=head1 DESCRIPTION - -A program to help generate bug reports about perl or the modules that -come with it, and mail them. - -If you have found a bug with a non-standard port (one that was not part -of the I), a binary distribution, or a -non-standard module (such as Tk, CGI, etc), then please see the -documentation that came with that distribution to determine the correct -place to report bugs. - -C is designed to be used interactively. Normally no arguments -will be needed. Simply run it, and follow the prompts. - -If you are unable to run B (most likely because you don't have -a working setup to send mail that perlbug recognizes), you may have to -compose your own report, and email it to B. You might -find the B<-d> option useful to get summary information in that case. - -In any case, when reporting a bug, please make sure you have run through -this checklist: - -=over 4 - -=item What version of Perl you are running? - -Type C at the command line to find out. - -=item Are you running the latest released version of perl? - -Look at http://www.perl.com/ to find out. If it is not the latest -released version, get that one and see whether your bug has been -fixed. Note that bug reports about old versions of Perl, especially -those prior to the 5.0 release, are likely to fall upon deaf ears. -You are on your own if you continue to use perl1 .. perl4. - -=item Are you sure what you have is a bug? - -A significant number of the bug reports we get turn out to be documented -features in Perl. Make sure the behavior you are witnessing doesn't fall -under that category, by glancing through the documentation that comes -with Perl (we'll admit this is no mean task, given the sheer volume of -it all, but at least have a look at the sections that I relevant). - -Be aware of the familiar traps that perl programmers of various hues -fall into. See L. - -Check in L to see what any Perl error message(s) mean. -If message isn't in perldiag, it probably isn't generated by Perl. -Consult your operating system documentation instead. - -If you are on a non-UNIX platform check also L, as some -features may be unimplemented or work differently. - -Try to study the problem under the Perl debugger, if necessary. -See L. - -=item Do you have a proper test case? - -The easier it is to reproduce your bug, the more likely it will be -fixed, because if no one can duplicate the problem, no one can fix it. -A good test case has most of these attributes: fewest possible number -of lines; few dependencies on external commands, modules, or -libraries; runs on most platforms unimpeded; and is self-documenting. - -A good test case is almost always a good candidate to be on the perl -test suite. If you have the time, consider making your test case so -that it will readily fit into the standard test suite. - -Remember also to include the B error messages, if any. -"Perl complained something" is not an exact error message. - -If you get a core dump (or equivalent), you may use a debugger -(B, B, etc) to produce a stack trace to include in the bug -report. NOTE: unless your Perl has been compiled with debug info -(often B<-g>), the stack trace is likely to be somewhat hard to use -because it will most probably contain only the function names and not -their arguments. If possible, recompile your Perl with debug info and -reproduce the dump and the stack trace. - -=item Can you describe the bug in plain English? - -The easier it is to understand a reproducible bug, the more likely it -will be fixed. Anything you can provide by way of insight into the -problem helps a great deal. In other words, try to analyze the -problem (to the extent you can) and report your discoveries. - -=item Can you fix the bug yourself? - -A bug report which I will almost -definitely be fixed. Use the C program to generate your patches -(C is being maintained by the GNU folks as part of the B -package, so you should be able to get it from any of the GNU software -repositories). If you do submit a patch, the cool-dude counter at -perlbug@perl.org will register you as a savior of the world. Your -patch may be returned with requests for changes, or requests for more -detailed explanations about your fix. - -Here are some clues for creating quality patches: Use the B<-c> or -B<-u> switches to the diff program (to create a so-called context or -unified diff). Make sure the patch is not reversed (the first -argument to diff is typically the original file, the second argument -your changed file). Make sure you test your patch by applying it with -the C program before you send it on its way. Try to follow the -same style as the code you are trying to patch. Make sure your patch -really does work (C, if the thing you're patching supports -it). - -=item Can you use C to submit the report? - -B will, amongst other things, ensure your report includes -crucial information about your version of perl. If C is unable -to mail your report after you have typed it in, you may have to compose -the message yourself, add the output produced by C and email -it to B. If, for some reason, you cannot run -C at all on your system, be sure to include the entire output -produced by running C (note the uppercase V). - -Whether you use C or send the email manually, please make -your Subject line informative. "a bug" not informative. Neither is -"perl crashes" nor "HELP!!!". These don't help. -A compact description of what's wrong is fine. - -=back - -Having done your bit, please be prepared to wait, to be told the bug -is in your code, or even to get no reply at all. The Perl maintainers -are busy folks, so if your problem is a small one or if it is difficult -to understand or already known, they may not respond with a personal reply. -If it is important to you that your bug be fixed, do monitor the -C file in any development releases since the time you submitted -the bug, and encourage the maintainers with kind words (but never any -flames!). Feel free to resend your bug report if the next released -version of perl comes out and your bug is still present. - -=head1 OPTIONS - -=over 8 - -=item B<-a> - -Address to send the report to. Defaults to `perlbug@perl.org'. - -=item B<-A> - -Don't send a bug received acknowledgement to the reply address. -Generally it is only a sensible to use this option if you are a -perl maintainer actively watching perl porters for your message to -arrive. - -=item B<-b> - -Body of the report. If not included on the command line, or -in a file with B<-f>, you will get a chance to edit the message. - -=item B<-C> - -Don't send copy to administrator. - -=item B<-c> - -Address to send copy of report to. Defaults to the address of the -local perl administrator (recorded when perl was built). - -=item B<-d> - -Data mode (the default if you redirect or pipe output). This prints out -your configuration data, without mailing anything. You can use this -with B<-v> to get more complete data. - -=item B<-e> - -Editor to use. - -=item B<-f> - -File containing the body of the report. Use this to quickly send a -prepared message. - -=item B<-F> - -File to output the results to instead of sending as an email. Useful -particularly when running perlbug on a machine with no direct internet -connection. - -=item B<-h> - -Prints a brief summary of the options. - -=item B<-ok> - -Report successful build on this system to perl porters. Forces B<-S> -and B<-C>. Forces and supplies values for B<-s> and B<-b>. Only -prompts for a return address if it cannot guess it (for use with -B). Honors return address specified with B<-r>. You can use this -with B<-v> to get more complete data. Only makes a report if this -system is less than 60 days old. - -=item B<-okay> - -As B<-ok> except it will report on older systems. - -=item B<-nok> - -Report unsuccessful build on this system. Forces B<-C>. Forces and -supplies a value for B<-s>, then requires you to edit the report -and say what went wrong. Alternatively, a prepared report may be -supplied using B<-f>. Only prompts for a return address if it -cannot guess it (for use with B). Honors return address -specified with B<-r>. You can use this with B<-v> to get more -complete data. Only makes a report if this system is less than 60 -days old. - -=item B<-nokay> - -As B<-nok> except it will report on older systems. - -=item B<-r> - -Your return address. The program will ask you to confirm its default -if you don't use this option. - -=item B<-S> - -Send without asking for confirmation. - -=item B<-s> - -Subject to include with the message. You will be prompted if you don't -supply one on the command line. - -=item B<-t> - -Test mode. The target address defaults to `perlbug-test@perl.com'. - -=item B<-v> - -Include verbose configuration data in the report. - -=back - -=head1 AUTHORS - -Kenneth Albanowski (Ekjahds@kjahds.comE), subsequently Itored -by Gurusamy Sarathy (Egsar@activestate.comE), Tom Christiansen -(Etchrist@perl.comE), Nathan Torkington (Egnat@frii.comE), -Charles F. Randall (Ecfr@pobox.comE), Mike Guy -(Emjtg@cam.a.ukE), Dominic Dunlop (Edomo@computer.orgE), -Hugo van der Sanden (Ehv@crypt0.demon.co.ukE), -Jarkko Hietaniemi (Ejhi@iki.fiE), Chris Nandor -(Epudge@pobox.comE), Jon Orwant (Eorwant@media.mit.eduE, -and Richard Foley (Erichard@rfi.netE). - -=head1 SEE ALSO - -perl(1), perldebug(1), perldiag(1), perlport(1), perltrap(1), -diff(1), patch(1), dbx(1), gdb(1) - -=head1 BUGS - -None known (guess what must have been used to report them?) - -=cut - diff --git a/bin/perlcc b/bin/perlcc deleted file mode 100644 index 14cf3a8d..00000000 --- a/bin/perlcc +++ /dev/null @@ -1,627 +0,0 @@ -#!/usr/bin/perl - eval 'exec /usr/bin/perl -S $0 ${1+"$@"}' - if $running_under_some_shell; ---$running_under_some_shell; - -# Version 2.0, Simon Cozens, Thu Mar 30 17:52:45 JST 2000 -# Version 2.01, Tom Christiansen, Thu Mar 30 08:25:14 MST 2000 -# Version 2.02, Simon Cozens, Sun Apr 16 01:53:36 JST 2000 -# Version 2.03, Edward Peschko, Mon Feb 26 12:04:17 PST 2001 - -use strict; -use warnings; -use v5.6.0; - -use FileHandle; -use Config; -use Fcntl qw(:DEFAULT :flock); -use File::Temp qw(tempfile); -use Cwd; -our $VERSION = 2.03; -$| = 1; - -$SIG{INT} = sub { exit(); }; # exit gracefully and clean up after ourselves. - -use subs qw{ - cc_harness check_read check_write checkopts_byte choose_backend - compile_byte compile_cstyle compile_module generate_code - grab_stash parse_argv sanity_check vprint yclept spawnit -}; -sub opt(*); # imal quoting - -our ($Options, $BinPerl, $Backend); -our ($Input => $Output); -our ($logfh); -our ($cfile); - -# eval { main(); 1 } or die; - -main(); - -sub main { - parse_argv(); - check_write($Output); - choose_backend(); - generate_code(); - run_code(); - _die("XXX: Not reached?"); -} - -####################################################################### - -sub choose_backend { - # Choose the backend. - $Backend = 'C'; - if (opt(B)) { - checkopts_byte(); - $Backend = 'Bytecode'; - } - if (opt(S) && opt(c)) { - # die "$0: Do you want me to compile this or not?\n"; - delete $Options->{S}; - } - $Backend = 'CC' if opt(O); -} - - -sub generate_code { - - vprint 0, "Compiling $Input"; - - $BinPerl = yclept(); # Calling convention for perl. - - if (opt(shared)) { - compile_module(); - } else { - if ($Backend eq 'Bytecode') { - compile_byte(); - } else { - compile_cstyle(); - } - } - exit(0) if (!opt('r')); -} - -sub run_code { - vprint 0, "Running code"; - run("$Output @ARGV"); - exit(0); -} - -# usage: vprint [level] msg args -sub vprint { - my $level; - if (@_ == 1) { - $level = 1; - } elsif ($_[0] =~ /^\d$/) { - $level = shift; - } else { - # well, they forgot to use a number; means >0 - $level = 0; - } - my $msg = "@_"; - $msg .= "\n" unless substr($msg, -1) eq "\n"; - if (opt(v) > $level) - { - print "$0: $msg" if !opt('log'); - print $logfh "$0: $msg" if opt('log'); - } -} - -sub parse_argv { - - use Getopt::Long; -# Getopt::Long::Configure("bundling"); turned off. this is silly because -# it doesn't allow for long switches. - Getopt::Long::Configure("no_ignore_case"); - - # no difference in exists and defined for %ENV; also, a "0" - # argument or a "" would not help cc, so skip - unshift @ARGV, split ' ', $ENV{PERLCC_OPTS} if $ENV{PERLCC_OPTS}; - - $Options = {}; - Getopt::Long::GetOptions( $Options, - 'L:s', # lib directory - 'I:s', # include directories (FOR C, NOT FOR PERL) - 'o:s', # Output executable - 'v:i', # Verbosity level - 'e:s', # One-liner - 'r', # run resulting executable - 'B', # Byte compiler backend - 'O', # Optimised C backend - 'c', # Compile only - 'h', # Help me - 'S', # Dump C files - 'r', # run the resulting executable - 'static', # Dirty hack to enable -shared/-static - 'shared', # Create a shared library (--shared for compat.) - 'log:s' # where to log compilation process information - ); - - # This is an attempt to make perlcc's arg. handling look like cc. - # if ( opt('s') ) { # must quote: looks like s)foo)bar)! - # if (opt('s') eq 'hared') { - # $Options->{shared}++; - # } elsif (opt('s') eq 'tatic') { - # $Options->{static}++; - # } else { - # warn "$0: Unknown option -s", opt('s'); - # } - # } - - $Options->{v} += 0; - - helpme() if opt(h); # And exit - - $Output = opt(o) || 'a.out'; - $Output = relativize($Output); - $logfh = new FileHandle(">> " . opt('log')) if (opt('log')); - - if (opt(e)) { - warn "$0: using -e 'code' as input file, ignoring @ARGV\n" if @ARGV; - # We don't use a temporary file here; why bother? - # XXX: this is not bullet proof -- spaces or quotes in name! - $Input = "-e '".opt(e)."'"; # Quotes eaten by shell - } else { - $Input = shift @ARGV; # XXX: more files? - _usage_and_die("$0: No input file specified\n") unless $Input; - # DWIM modules. This is bad but necessary. - $Options->{shared}++ if $Input =~ /\.pm\z/; - warn "$0: using $Input as input file, ignoring @ARGV\n" if @ARGV; - check_read($Input); - check_perl($Input); - sanity_check(); - } - -} - -sub opt(*) { - my $opt = shift; - return exists($Options->{$opt}) && ($Options->{$opt} || 0); -} - -sub compile_module { - die "$0: Compiling to shared libraries is currently disabled\n"; -} - -sub compile_byte { - require ByteLoader; - my $stash = grab_stash(); - my $command = "$BinPerl -MO=Bytecode,$stash $Input"; - # The -a option means we'd have to close the file and lose the - # lock, which would create the tiniest of races. Instead, append - # the output ourselves. - vprint 1, "Writing on $Output"; - - my $openflags = O_WRONLY | O_CREAT; - $openflags |= O_BINARY if eval { O_BINARY; 1 }; - $openflags |= O_EXLOCK if eval { O_EXLOCK; 1 }; - - # these dies are not "$0: .... \n" because they "can't happen" - - sysopen(OUT, $Output, $openflags) - or die "can't write to $Output: $!"; - - # this is blocking; hold on; why are we doing this?? - # flock OUT, LOCK_EX or die "can't lock $Output: $!" - # unless eval { O_EXLOCK; 1 }; - - truncate(OUT, 0) - or die "couldn't trunc $Output: $!"; - - print OUT < ".c"); - close $cfh; # See comment just below - } - vprint 1, "Writing C on $cfile"; - - my $max_line_len = ''; - if ($^O eq 'MSWin32' && $Config{cc} =~ /^cl/i) { - $max_line_len = '-l2000,'; - } - - # This has to do the write itself, so we can't keep a lock. Life - # sucks. - my $command = "$BinPerl -MO=$Backend,$max_line_len$stash,-o$cfile $Input"; - vprint 1, "Compiling..."; - vprint 1, "Calling $command"; - - my ($output_r, $error_r) = spawnit($command); - my @output = @$output_r; - my @error = @$error_r; - - if (@error && $? != 0) { - _die("$0: $Input did not compile, which can't happen:\n@error\n"); - } - - cc_harness($cfile,$stash) unless opt(c); - - if ($lose) { - vprint 2, "unlinking $cfile"; - unlink $cfile or _die("can't unlink $cfile: $!"); - } -} - -sub cc_harness { - my ($cfile,$stash)=@_; - use ExtUtils::Embed (); - my $command = ExtUtils::Embed::ccopts." -o $Output $cfile "; - $command .= " -DUSEIMPORTLIB"; - $command .= " -I".$_ for split /\s+/, opt(I); - $command .= " -L".$_ for split /\s+/, opt(L); - my @mods = split /-?u /, $stash; - $command .= " ".ExtUtils::Embed::ldopts("-std", \@mods,['-lperl5_6_1']); - vprint 3, "running $Config{cc} $command"; - system("$Config{cc} $command"); -} - -# Where Perl is, and which include path to give it. -sub yclept { - my $command = "$^X "; - - # DWIM the -I to be Perl, not C, include directories. - if (opt(I) && $Backend eq "Bytecode") { - for (split /\s+/, opt(I)) { - if (-d $_) { - push @INC, $_; - } else { - warn "$0: Include directory $_ not found, skipping\n"; - } - } - } - - $command .= "-I$_ " for @INC; - return $command; -} - -# Use B::Stash to find additional modules and stuff. -{ - my $_stash; - sub grab_stash { - - warn "already called get_stash once" if $_stash; - - my $command = "$BinPerl -MB::Stash -c $Input"; - # Filename here is perfectly sanitised. - vprint 3, "Calling $command\n"; - - my ($stash_r, $error_r) = spawnit($command); - my @stash = @$stash_r; - my @error = @$error_r; - - if (@error && $? != 0) { - _die("$0: $Input did not compile:\n@error\n"); - } - - $stash[0] =~ s/,-u\//; - vprint 2, "Stash: ", join " ", split /,?-u/, $stash[0]; - chomp $stash[0]; - return $_stash = $stash[0]; - } - -} - -# Check the consistency of options if -B is selected. -# To wit, (-B|-O) ==> no -shared, no -S, no -c -sub checkopts_byte { - - _die("$0: Please choose one of either -B and -O.\n") if opt(O); - - if (opt(shared)) { - warn "$0: Will not create a shared library for bytecode\n"; - delete $Options->{shared}; - } - - for my $o ( qw[c S] ) { - if (opt($o)) { - warn "$0: Compiling to bytecode is a one-pass process--", - "-$o ignored\n"; - delete $Options->{$o}; - } - } - -} - -# Check the input and output files make sense, are read/writeable. -sub sanity_check { - if ($Input eq $Output) { - if ($Input eq 'a.out') { - _die("$0: Compiling a.out is probably not what you want to do.\n"); - # You fully deserve what you get now. No you *don't*. typos happen. - } else { - warn "$0: Will not write output on top of input file, ", - "compiling to a.out instead\n"; - $Output = "a.out"; - } - } -} - -sub check_read { - my $file = shift; - unless (-r $file) { - _die("$0: Input file $file is a directory, not a file\n") if -d _; - unless (-e _) { - _die("$0: Input file $file was not found\n"); - } else { - _die("$0: Cannot read input file $file: $!\n"); - } - } - unless (-f _) { - # XXX: die? don't try this on /dev/tty - warn "$0: WARNING: input $file is not a plain file\n"; - } -} - -sub check_write { - my $file = shift; - if (-d $file) { - _die("$0: Cannot write on $file, is a directory\n"); - } - if (-e _) { - _die("$0: Cannot write on $file: $!\n") unless -w _; - } - unless (-w cwd()) { - _die("$0: Cannot write in this directory: $!\n"); - } -} - -sub check_perl { - my $file = shift; - unless (-T $file) { - warn "$0: Binary `$file' sure doesn't smell like perl source!\n"; - print "Checking file type... "; - system("file", $file); - _die("Please try a perlier file!\n"); - } - - open(my $handle, "<", $file) or _die("XXX: can't open $file: $!"); - local $_ = <$handle>; - if (/^#!/ && !/perl/) { - _die("$0: $file is a ", /^#!\s*(\S+)/, " script, not perl\n"); - } - -} - -# File spawning and error collecting -sub spawnit { - my ($command) = shift; - my (@error,@output); - my $errname; - (undef, $errname) = tempfile("pccXXXXX"); - { - open (S_OUT, "$command 2>$errname |") - or _die("$0: Couldn't spawn the compiler.\n"); - @output = ; - } - open (S_ERROR, $errname) or _die("$0: Couldn't read the error file.\n"); - @error = ; - close S_ERROR; - close S_OUT; - unlink $errname or _die("$0: Can't unlink error file $errname"); - return (\@output, \@error); -} - -sub helpme { - print "perlcc compiler frontend, version $VERSION\n\n"; - { no warnings; - exec "pod2usage $0"; - exec "perldoc $0"; - exec "pod2text $0"; - } -} - -sub relativize { - my ($args) = @_; - - return() if ($args =~ m"^[/\\]"); - return("./$args"); -} - -sub _die { - $logfh->print(@_) if opt('log'); - print STDERR @_; - exit(); # should die eventually. However, needed so that a 'make compile' - # can compile all the way through to the end for standard dist. -} - -sub _usage_and_die { - _die(<print(interruptrun(@commands)) if (opt('log')); -} - -sub interruptrun -{ - my (@commands) = @_; - - my $command = join('', @commands); - local(*FD); - my $pid = open(FD, "$command |"); - my $text; - - local($SIG{HUP}) = sub { kill 9, $pid; exit }; - local($SIG{INT}) = sub { kill 9, $pid; exit }; - - my $needalarm = - ($ENV{PERLCC_TIMEOUT} && - $Config{'osname'} ne 'MSWin32' && - $command =~ m"(^|\s)perlcc\s"); - - eval - { - local($SIG{ALRM}) = sub { die "INFINITE LOOP"; }; - alarm($ENV{PERLCC_TIMEOUT}) if ($needalarm); - $text = join('', ); - alarm(0) if ($needalarm); - }; - - if ($@) - { - eval { kill 'HUP', $pid }; - vprint 0, "SYSTEM TIMEOUT (infinite loop?)\n"; - } - - close(FD); - return($text); -} - -END { - unlink $cfile if ($cfile && !opt(S) && !opt(c)); -} - -__END__ - -=head1 NAME - -perlcc - generate executables from Perl programs - -=head1 SYNOPSIS - - $ perlcc hello # Compiles into executable 'a.out' - $ perlcc -o hello hello.pl # Compiles into executable 'hello' - - $ perlcc -O file # Compiles using the optimised C backend - $ perlcc -B file # Compiles using the bytecode backend - - $ perlcc -c file # Creates a C file, 'file.c' - $ perlcc -S -o hello file # Creates a C file, 'file.c', - # then compiles it to executable 'hello' - $ perlcc -c out.c file # Creates a C file, 'out.c' from 'file' - - $ perlcc -e 'print q//' # Compiles a one-liner into 'a.out' - $ perlcc -c -e 'print q//' # Creates a C file 'a.out.c' - - $ perlcc -r hello # compiles 'hello' into 'a.out', runs 'a.out'. - - $ perlcc -r hello a b c # compiles 'hello' into 'a.out', runs 'a.out'. - # with arguments 'a b c' - - $ perlcc hello -log c # compiles 'hello' into 'a.out' logs compile - # log into 'c'. - -=head1 DESCRIPTION - -F creates standalone executables from Perl programs, using the -code generators provided by the L module. At present, you may -either create executable Perl bytecode, using the C<-B> option, or -generate and compile C files using the standard and 'optimised' C -backends. - -The code generated in this way is not guaranteed to work. The whole -codegen suite (C included) should be considered B -experimental. Use for production purposes is strongly discouraged. - -=head1 OPTIONS - -=over 4 - -=item -LI - -Adds the given directories to the library search path when C code is -passed to your C compiler. - -=item -II - -Adds the given directories to the include file search path when C code is -passed to your C compiler; when using the Perl bytecode option, adds the -given directories to Perl's include path. - -=item -o I - -Specifies the file name for the final compiled executable. - -=item -c I - -Create C code only; do not compile to a standalone binary. - -=item -e I - -Compile a one-liner, much the same as C - -=item -S - -Do not delete generated C code after compilation. - -=item -B - -Use the Perl bytecode code generator. - -=item -O - -Use the 'optimised' C code generator. This is more experimental than -everything else put together, and the code created is not guaranteed to -compile in finite time and memory, or indeed, at all. - -=item -v - -Increase verbosity of output; can be repeated for more verbose output. - -=item -r - -Run the resulting compiled script after compiling it. - -=item -log - -Log the output of compiling to a file rather than to stdout. - -=back - -=cut - diff --git a/bin/perldoc b/bin/perldoc deleted file mode 100644 index b305814e..00000000 --- a/bin/perldoc +++ /dev/null @@ -1,829 +0,0 @@ -#!/usr/bin/perl - eval 'exec /usr/bin/perl -S $0 ${1+"$@"}' - if 0; - -use warnings; -use strict; - -# make sure creat()s are neither too much nor too little -INIT { eval { umask(0077) } } # doubtless someone has no mask - -(my $pager = <<'/../') =~ s/\s*\z//; -/bin/less -/../ -my @pagers = (); -push @pagers, $pager if -x $pager; - -(my $bindir = <<'/../') =~ s/\s*\z//; -/usr/bin -/../ - - -use Fcntl; # for sysopen -use Getopt::Std; -use Config '%Config'; -use File::Spec::Functions qw(catfile splitdir); - -# -# Perldoc revision #1 -- look up a piece of documentation in .pod format that -# is embedded in the perl installation tree. -# -# This is not to be confused with Tom Christiansen's perlman, which is a -# man replacement, written in perl. This perldoc is strictly for reading -# the perl manuals, though it too is written in perl. -# -# Massive security and correctness patches applied to this -# noisome program by Tom Christiansen Sat Mar 11 15:22:33 MST 2000 - -if (@ARGV<1) { - my $me = $0; # Editing $0 is unportable - $me =~ s,.*/,,; - die < == 0 || $< == 0) - && !am_taint_checking()) -{{ - if ($opt_U) { - my $id = eval { getpwnam("nobody") }; - $id = eval { getpwnam("nouser") } unless defined $id; - $id = -2 unless defined $id; - eval { - $> = $id; # must do this one first! - $< = $id; - }; - last if !$@ && $< && $>; - } - die "Superuser must not run $0 without security audit and taint checks.\n"; -}} - -$opt_n = "nroff" if !$opt_n; - -my $podidx; -if ($opt_X) { - $podidx = "$Config{'archlib'}/pod.idx"; - $podidx = "" unless -f $podidx && -r _ && -M _ <= 7; -} - -if ((my $opts = do{ no warnings; $opt_t + $opt_u + $opt_m + $opt_l }) > 1) { - usage("only one of -t, -u, -m or -l") -} -elsif ($Is_MSWin32 - || $Is_Dos - || !($ENV{TERM} && $ENV{TERM} !~ /dumb|emacs|none|unknown/i)) -{ - $opt_t = 1 unless $opts; -} - -if ($opt_t) { require Pod::Text; import Pod::Text; } - -my @pages; -if ($opt_f) { - @pages = ("perlfunc"); -} -elsif ($opt_q) { - @pages = ("perlfaq1" .. "perlfaq9"); -} -else { - @pages = @ARGV; -} - -# Does this look like a module or extension directory? -if (-f "Makefile.PL") { - - # Add ., lib to @INC (if they exist) - eval q{ use lib qw(. lib); 1; } or die; - - # don't add if superuser - if ($< && $> && -f "blib") { # don't be looking too hard now! - eval q{ use blib; 1 }; - warn $@ if $@ && $opt_v; - } -} - -sub containspod { - my($file, $readit) = @_; - return 1 if !$readit && $file =~ /\.pod\z/i; - local($_); - open(TEST,"<", $file) or die "Can't open $file: $!"; - while () { - if (/^=head/) { - close(TEST) or die "Can't close $file: $!"; - return 1; - } - } - close(TEST) or die "Can't close $file: $!"; - return 0; -} - -sub minus_f_nocase { - my($dir,$file) = @_; - my $path = catfile($dir,$file); - return $path if -f $path and -r _; - if (!$opt_i or $Is_VMS or $Is_MSWin32 or $Is_Dos or $^O eq 'os2') { - # on a case-forgiving file system or if case is important - # that is it all we can do - warn "Ignored $path: unreadable\n" if -f _; - return ''; - } - local *DIR; - # this is completely wicked. don't mess with $", and if - # you do, don't assume / is the dirsep! - local($")="/"; - my @p = ($dir); - my($p,$cip); - foreach $p (splitdir $file){ - my $try = catfile @p, $p; - stat $try; - if (-d _) { - push @p, $p; - if ( $p eq $global_target) { - my $tmp_path = catfile @p; - my $path_f = 0; - for (@global_found) { - $path_f = 1 if $_ eq $tmp_path; - } - push (@global_found, $tmp_path) unless $path_f; - print STDERR "Found as @p but directory\n" if $opt_v; - } - } - elsif (-f _ && -r _) { - return $try; - } - elsif (-f _) { - warn "Ignored $try: unreadable\n"; - } - elsif (-d "@p") { - my $found=0; - my $lcp = lc $p; - opendir DIR, "@p" or die "opendir @p: $!"; - while ($cip=readdir(DIR)) { - if (lc $cip eq $lcp){ - $found++; - last; - } - } - closedir DIR or die "closedir @p: $!"; - return "" unless $found; - push @p, $cip; - return "@p" if -f "@p" and -r _; - warn "Ignored @p: unreadable\n" if -f _; - } - } - return ""; -} - - -sub check_file { - my($dir,$file) = @_; - return "" if length $dir and not -d $dir; - if ($opt_m) { - return minus_f_nocase($dir,$file); - } - else { - my $path = minus_f_nocase($dir,$file); - return $path if length $path and containspod($path); - } - return ""; -} - - -sub searchfor { - my($recurse,$s,@dirs) = @_; - $s =~ s!::!/!g; - $s = VMS::Filespec::unixify($s) if $Is_VMS; - return $s if -f $s && containspod($s); - printf STDERR "Looking for $s in @dirs\n" if $opt_v; - my $ret; - my $i; - my $dir; - $global_target = (splitdir $s)[-1]; # XXX: why not use File::Basename? - for ($i=0; $i<@dirs; $i++) { - $dir = $dirs[$i]; - ($dir = VMS::Filespec::unixpath($dir)) =~ s!/\z!! if $Is_VMS; - if ( ( $ret = check_file $dir,"$s.pod") - or ( $ret = check_file $dir,"$s.pm") - or ( $ret = check_file $dir,$s) - or ( $Is_VMS and - $ret = check_file $dir,"$s.com") - or ( $^O eq 'os2' and - $ret = check_file $dir,"$s.cmd") - or ( ($Is_MSWin32 or $Is_Dos or $^O eq 'os2') and - $ret = check_file $dir,"$s.bat") - or ( $ret = check_file "$dir/pod","$s.pod") - or ( $ret = check_file "$dir/pod",$s) - or ( $ret = check_file "$dir/pods","$s.pod") - or ( $ret = check_file "$dir/pods",$s) - ) { - return $ret; - } - - if ($recurse) { - opendir(D,$dir) or die "Can't opendir $dir: $!"; - my @newdirs = map catfile($dir, $_), grep { - not /^\.\.?\z/s and - not /^auto\z/s and # save time! don't search auto dirs - -d catfile($dir, $_) - } readdir D; - closedir(D) or die "Can't closedir $dir: $!"; - next unless @newdirs; - # what a wicked map! - @newdirs = map((s/\.dir\z//,$_)[1],@newdirs) if $Is_VMS; - print STDERR "Also looking in @newdirs\n" if $opt_v; - push(@dirs,@newdirs); - } - } - return (); -} - -sub filter_nroff { - my @data = split /\n{2,}/, shift; - shift @data while @data and $data[0] !~ /\S/; # Go to header - shift @data if @data and $data[0] =~ /Contributed\s+Perl/; # Skip header - pop @data if @data and $data[-1] =~ /^\w/; # Skip footer, like - # 28/Jan/99 perl 5.005, patch 53 1 - join "\n\n", @data; -} - -sub printout { - my ($file, $tmp, $filter) = @_; - my $err; - - if ($opt_t) { - # why was this append? - sysopen(OUT, $tmp, O_WRONLY | O_EXCL | O_CREAT, 0600) - or die ("Can't open $tmp: $!"); - Pod::Text->new()->parse_from_file($file,\*OUT); - close OUT or die "can't close $tmp: $!"; - } - elsif (not $opt_u) { - my $cmd = catfile($bindir, 'pod2man') . " --lax $file | $opt_n -man"; - $cmd .= " | col -x" if $^O =~ /hpux/; - my $rslt = `$cmd`; - $rslt = filter_nroff($rslt) if $filter; - unless (($err = $?)) { - # why was this append? - sysopen(TMP, $tmp, O_WRONLY | O_EXCL | O_CREAT, 0600) - or die "Can't open $tmp: $!"; - print TMP $rslt - or die "Can't print $tmp: $!"; - close TMP - or die "Can't close $tmp: $!"; - } - } - if ($opt_u or $err or -z $tmp) { # XXX: race with -z - # why was this append? - sysopen(OUT, $tmp, O_WRONLY | O_EXCL | O_CREAT, 0600) - or die "Can't open $tmp: $!"; - open(IN,"<", $file) or die("Can't open $file: $!"); - my $cut = 1; - local $_; - while () { - $cut = $1 eq 'cut' if /^=(\w+)/; - next if $cut; - print OUT - or die "Can't print $tmp: $!"; - } - close IN or die "Can't close $file: $!"; - close OUT or die "Can't close $tmp: $!"; - } -} - -sub page { - my ($tmp, $no_tty, @pagers) = @_; - if ($no_tty) { - open(TMP,"<", $tmp) or die "Can't open $tmp: $!"; - local $_; - while () { - print or die "Can't print to stdout: $!"; - } - close TMP or die "Can't close while $tmp: $!"; - } - else { - foreach my $pager (@pagers) { - if ($Is_VMS) { - last if system("$pager $tmp") == 0; # quoting prevents logical expansion - } else { - last if system("$pager \"$tmp\"") == 0; - } - } - } -} - -sub cleanup { - my @files = @_; - for (@files) { - if ($Is_VMS) { - 1 while unlink($_); # XXX: expect failure - } else { - unlink($_); # or die "Can't unlink $_: $!"; - } - } -} - -my @found; -foreach (@pages) { - if ($podidx && open(PODIDX, $podidx)) { - my $searchfor = catfile split '::'; - print STDERR "Searching for '$searchfor' in $podidx\n" if $opt_v; - local $_; - while () { - chomp; - push(@found, $_) if m,/$searchfor(?:\.(?:pod|pm))?\z,i; - } - close(PODIDX) or die "Can't close $podidx: $!"; - next; - } - print STDERR "Searching for $_\n" if $opt_v; - # We must look both in @INC for library modules and in $bindir - # for executables, like h2xs or perldoc itself. - my @searchdirs = (@INC, $bindir); - if ($opt_F) { - next unless -r; - push @found, $_ if $opt_m or containspod($_); - next; - } - unless ($opt_m) { - if ($Is_VMS) { - my($i,$trn); - for ($i = 0; $trn = $ENV{'DCL$PATH;'.$i}; $i++) { - push(@searchdirs,$trn); - } - push(@searchdirs,'perl_root:[lib.pod]') # installed pods - } - else { - push(@searchdirs, grep(-d, split($Config{path_sep}, - $ENV{'PATH'}))); - } - } - my @files = searchfor(0,$_,@searchdirs); - if (@files) { - print STDERR "Found as @files\n" if $opt_v; - } - else { - # no match, try recursive search - @searchdirs = grep(!/^\.\z/s,@INC); - @files= searchfor(1,$_,@searchdirs) if $opt_r; - if (@files) { - print STDERR "Loosely found as @files\n" if $opt_v; - } - else { - print STDERR "No documentation found for \"$_\".\n"; - if (@global_found) { - print STDERR "However, try\n"; - for my $dir (@global_found) { - opendir(DIR, $dir) or die "opendir $dir: $!"; - while (my $file = readdir(DIR)) { - next if ($file =~ /^\./s); - $file =~ s/\.(pm|pod)\z//; # XXX: badfs - print STDERR "\tperldoc $_\::$file\n"; - } - closedir DIR or die "closedir $dir: $!"; - } - } - } - } - push(@found,@files); -} - -if (!@found) { - exit ($Is_VMS ? 98962 : 1); -} - -if ($opt_l) { - print join("\n", @found), "\n"; - exit; -} - -my $lines = $ENV{LINES} || 24; - -my $no_tty; -if (! -t STDOUT) { $no_tty = 1 } -END { close(STDOUT) || die "Can't close STDOUT: $!" } - -# until here we could simply exit or die -# now we create temporary files that we have to clean up -# namely $tmp, $buffer -# that's because you did it wrong, should be descriptor based --tchrist - -my $tmp; -my $buffer; -if ($Is_MSWin32) { - $tmp = "$ENV{TEMP}\\perldoc1.$$"; - $buffer = "$ENV{TEMP}\\perldoc1.b$$"; - push @pagers, qw( more< less notepad ); - unshift @pagers, $ENV{PAGER} if $ENV{PAGER}; - for (@found) { s,/,\\,g } -} -elsif ($Is_VMS) { - $tmp = 'Sys$Scratch:perldoc.tmp1_'.$$; - $buffer = 'Sys$Scratch:perldoc.tmp1_b'.$$; - push @pagers, qw( most more less type/page ); -} -elsif ($Is_Dos) { - $tmp = "$ENV{TEMP}/perldoc1.$$"; - $buffer = "$ENV{TEMP}/perldoc1.b$$"; - $tmp =~ tr!\\/!//!s; - $buffer =~ tr!\\/!//!s; - push @pagers, qw( less.exe more.com< ); - unshift @pagers, $ENV{PAGER} if $ENV{PAGER}; -} -else { - if ($^O eq 'os2') { - require POSIX; - $tmp = POSIX::tmpnam(); - $buffer = POSIX::tmpnam(); - unshift @pagers, 'less', 'cmd /c more <'; - } - else { - # XXX: this is not secure, because it doesn't open it - ($tmp, $buffer) = eval { require POSIX } - ? (POSIX::tmpnam(), POSIX::tmpnam() ) - : ("/tmp/perldoc1.$$", "/tmp/perldoc1.b$$" ); - } - push @pagers, qw( more less pg view cat ); - unshift @pagers, $ENV{PAGER} if $ENV{PAGER}; -} -unshift @pagers, $ENV{PERLDOC_PAGER} if $ENV{PERLDOC_PAGER}; - -# make sure cleanup called -eval q{ - sub END { cleanup($tmp, $buffer) } - 1; -} || die; - -# exit/die in a windows sighandler is dangerous, so let it do the -# default thing, which is to exit -eval q{ use sigtrap qw(die INT TERM HUP QUIT) } unless $^O eq 'MSWin32'; - -if ($opt_m) { - foreach my $pager (@pagers) { - if (system($pager, @found) == 0) { - exit; - } - } - if ($Is_VMS) { - eval q{ - use vmsish qw(status exit); - exit $?; - 1; - } or die; - } - exit(1); -} - -my @pod; -if ($opt_f) { - my $perlfunc = shift @found; - open(PFUNC, "<", $perlfunc) - or die("Can't open $perlfunc: $!"); - - # Functions like -r, -e, etc. are listed under `-X'. - my $search_string = ($opt_f =~ /^-[rwxoRWXOeszfdlpSbctugkTBMAC]$/) - ? 'I<-X' : $opt_f ; - - # Skip introduction - local $_; - while () { - last if /^=head2 Alphabetical Listing of Perl Functions/; - } - - # Look for our function - my $found = 0; - my $inlist = 0; - while () { - if (/^=item\s+\Q$search_string\E\b/o) { - $found = 1; - } - elsif (/^=item/) { - last if $found > 1 and not $inlist; - } - next unless $found; - if (/^=over/) { - ++$inlist; - } - elsif (/^=back/) { - --$inlist; - } - push @pod, $_; - ++$found if /^\w/; # found descriptive text - } - if (!@pod) { - die "No documentation for perl function `$opt_f' found\n"; - } - close PFUNC or die "Can't open $perlfunc: $!"; -} - -if ($opt_q) { - local @ARGV = @found; # I'm lazy, sue me. - my $found = 0; - my %found_in; - my $rx = eval { qr/$opt_q/ } or die <|]/ } - local $_; - while (<>) { - if (/^=head2\s+.*(?:$opt_q)/oi) { - $found = 1; - push @pod, "=head1 Found in $ARGV\n\n" unless $found_in{$ARGV}++; - } - elsif (/^=head2/) { - $found = 0; - } - next unless $found; - push @pod, $_; - } - if (!@pod) { - die("No documentation for perl FAQ keyword `$opt_q' found\n"); - } -} - -my $filter; - -if (@pod) { - sysopen(TMP, $buffer, O_WRONLY | O_EXCL | O_CREAT) - or die("Can't open $buffer: $!"); - print TMP "=over 8\n\n"; - print TMP @pod or die "Can't print $buffer: $!"; - print TMP "=back\n"; - close TMP or die "Can't close $buffer: $!"; - @found = $buffer; - $filter = 1; -} - -foreach (@found) { - printout($_, $tmp, $filter); -} -page($tmp, $no_tty, @pagers); - -exit; - -sub is_tainted { - my $arg = shift; - my $nada = substr($arg, 0, 0); # zero-length - local $@; # preserve caller's version - eval { eval "# $nada" }; - return length($@) != 0; -} - -sub am_taint_checking { - my($k,$v) = each %ENV; - return is_tainted($v); -} - - -__END__ - -=head1 NAME - -perldoc - Look up Perl documentation in pod format. - -=head1 SYNOPSIS - -B [B<-h>] [B<-v>] [B<-t>] [B<-u>] [B<-m>] [B<-l>] [B<-F>] [B<-X>] PageName|ModuleName|ProgramName - -B B<-f> BuiltinFunction - -B B<-q> FAQ Keyword - -=head1 DESCRIPTION - -I looks up a piece of documentation in .pod format that is embedded -in the perl installation tree or in a perl script, and displays it via -C. (In addition, if running under HP-UX, -C will be used.) This is primarily used for the documentation for -the perl library modules. - -Your system may also have man pages installed for those modules, in -which case you can probably just use the man(1) command. - -=head1 OPTIONS - -=over 5 - -=item B<-h> help - -Prints out a brief help message. - -=item B<-v> verbose - -Describes search for the item in detail. - -=item B<-t> text output - -Display docs using plain text converter, instead of nroff. This may be faster, -but it won't look as nice. - -=item B<-u> unformatted - -Find docs only; skip reformatting by pod2* - -=item B<-m> module - -Display the entire module: both code and unformatted pod documentation. -This may be useful if the docs don't explain a function in the detail -you need, and you'd like to inspect the code directly; perldoc will find -the file for you and simply hand it off for display. - -=item B<-l> file name only - -Display the file name of the module found. - -=item B<-F> file names - -Consider arguments as file names, no search in directories will be performed. - -=item B<-f> perlfunc - -The B<-f> option followed by the name of a perl built in function will -extract the documentation of this function from L. - -=item B<-q> perlfaq - -The B<-q> option takes a regular expression as an argument. It will search -the question headings in perlfaq[1-9] and print the entries matching -the regular expression. - -=item B<-X> use an index if present - -The B<-X> option looks for a entry whose basename matches the name given on the -command line in the file C<$Config{archlib}/pod.idx>. The pod.idx file should -contain fully qualified filenames, one per line. - -=item B<-U> run insecurely - -Because B does not run properly tainted, and is known to -have security issues, it will not normally execute as the superuser. -If you use the B<-U> flag, it will do so, but only after setting -the effective and real IDs to nobody's or nouser's account, or -2 -if unavailable. If it cannot relinguish its privileges, it will not -run. - -=item B - -The item you want to look up. Nested modules (such as C) -are specified either as C or C. You may also -give a descriptive name of a page, such as C. You may also give a -partial or wrong-case name, such as "basename" for "File::Basename", but -this will be slower, if there is more then one page with the same partial -name, you will only get the first one. - -=back - -=head1 ENVIRONMENT - -Any switches in the C environment variable will be used before the -command line arguments. C also searches directories -specified by the C (or C if C is not -defined) and C environment variables. -(The latter is so that embedded pods for executables, such as -C itself, are available.) C will use, in order of -preference, the pager defined in C, C, or -C before trying to find a pager on its own. (C is not -used if C was told to display plain text or unformatted pod.) - -One useful value for C is C. - -=head1 VERSION - -This is perldoc v2.03. - -=head1 AUTHOR - -Kenneth Albanowski - -Minor updates by Andy Dougherty , -and others. - -=cut - -# -# Version 2.03: Sun Apr 23 16:56:34 BST 2000 -# Hugo van der Sanden -# don't die when 'use blib' fails -# Version 2.02: Mon Mar 13 18:03:04 MST 2000 -# Tom Christiansen -# Added -U insecurity option -# Version 2.01: Sat Mar 11 15:22:33 MST 2000 -# Tom Christiansen , querulously. -# Security and correctness patches. -# What a twisted bit of distasteful spaghetti code. -# Version 2.0: ???? -# Version 1.15: Tue Aug 24 01:50:20 EST 1999 -# Charles Wilson -# changed /pod/ directory to /pods/ for cygwin -# to support cygwin/win32 -# Version 1.14: Wed Jul 15 01:50:20 EST 1998 -# Robin Barker -# -strict, -w cleanups -# Version 1.13: Fri Feb 27 16:20:50 EST 1997 -# Gurusamy Sarathy -# -doc tweaks for -F and -X options -# Version 1.12: Sat Apr 12 22:41:09 EST 1997 -# Gurusamy Sarathy -# -various fixes for win32 -# Version 1.11: Tue Dec 26 09:54:33 EST 1995 -# Kenneth Albanowski -# -added Charles Bailey's further VMS patches, and -u switch -# -added -t switch, with pod2text support -# -# Version 1.10: Thu Nov 9 07:23:47 EST 1995 -# Kenneth Albanowski -# -added VMS support -# -added better error recognition (on no found pages, just exit. On -# missing nroff/pod2man, just display raw pod.) -# -added recursive/case-insensitive matching (thanks, Andreas). This -# slows things down a bit, unfortunately. Give a precise name, and -# it'll run faster. -# -# Version 1.01: Tue May 30 14:47:34 EDT 1995 -# Andy Dougherty -# -added pod documentation. -# -added PATH searching. -# -added searching pod/ subdirectory (mainly to pick up perlfunc.pod -# and friends. -# -# -# TODO: -# -# Cache directories read during sloppy match diff --git a/bin/perlld b/bin/perlld deleted file mode 100644 index 98527cf6..00000000 --- a/bin/perlld +++ /dev/null @@ -1,89 +0,0 @@ -# -# Perl script being a wrapper around the gnu ld. When a dll is specified to -# to be built, special processing is done, else the standard ld is called. -# - -# theese are pretty mandatory -my $CC = 'gcc'; -my $DLLWRAP = 'dllwrap'; - -# following are optional. -my $WRAPDRIVER = 'gcc'; -my $AS = 'as'; -my $DLLTOOL = 'dlltool'; -my $EXPORT_ALL = 1; -# if some of extensions are undefined, -# no corresponding output will be done. -# most probably, you'd like to have an export library -my $DEF_EXT = '.def'; -# my $EXP_EXT = '.exp'; -my $LIB_EXT = '.a'; - -#my $DEBUG ="perlld.out"; -my $DEBUG =undef; - -my $args = join(" ",@ARGV); # get args -my $verbose =grep(/^\-(v|\-verbose)$/, @ARGV); - -sub shellexec; - -if ($DEBUG) { - open DEBUGFILE, ">>$DEBUG"; - print DEBUGFILE "\n--- " .localtime() ."\nargs:\n$args\n\nenvironment:\n"; - foreach (keys(%ENV)) { print DEBUGFILE $_, "=", $ENV{$_}, "\n"; }; -} - -if ($args !~ /\-o (\S+)/) { - print DEBUGFILE "+ no dll output -- passing to gcc\n\n" if $DEBUG; - shellexec("$CC $args\n"); -} else { - my ($path, $command, $dllname, $libname) =''; - - $dllname =$1; - print DEBUGFILE "output file: $dllname\n" if $DEBUG; - # remove -o from args - $args =~ s/(^| )\-o \S+/$1/; - - # Check for path: - if( $dllname =~ /.*[\/\\]/){ - $dllname = $'; - $path = $&; - $path =~ s,[/\\](\.[/\\])*,/,g; - } - if ($dllname =~ /\./) { $libname =$`; } else { $libname =$dllname; }; - $dllname ="$libname.dll"; - $libname ="lib$libname" unless ($libname =~ /^lib/); - print DEBUGFILE "dll name: $dllname\nimport library: $libname\npath: $path\n" if $DEBUG; - - $command ="$DLLWRAP --dllname $dllname"; - $command .=" --driver-name $WRAPDRIVER" if $WRAPDRIVER; - $command .=" --dlltool $DLLTOOL" if $DLLTOOL; - $command .=" --export-all-symbols" if $EXPORT_ALL; - $command .=" --as $AS" if $AS; - $command .=" --verbose" if $verbose; - - $command .=" --output-def $libname$DEF_EXT" if $DEF_EXT; - $command .=" --output-exp $libname$EXP_EXT" if $EXP_EXT; - $command .=" --output-lib $libname$LIB_EXT" if $LIB_EXT; - - # other args are passed through - shellexec("$command \\\n$args\n"); - - if ($path) { - $command ="mv $dllname"; - $command .=" $libname$LIB_EXT" if $LIB_EXT; - shellexec("$command $path\n"); - }; -}; -close DEBUGFILE if $DEBUG; - -#--------------------------------------------------------------------------- -sub shellexec{ - my $command =shift; - print $command; - print DEBUGFILE $command if $DEBUG; - system($command) == 0 - or die "perlld: *** system() failed to execute\n$command\n"; -}; - -1; diff --git a/bin/rcp.exe b/bin/rcp.exe deleted file mode 100644 index 66702cda16ccbcffc17538e8aa83a10e96589df8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcwPel00001 literal 42735 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 triplets -logTZ= # time zone for log dates (if empty, use local time) -recursive= # t if we want recursive rlog -revision= # t if we want revision numbers -rlog_options= # options to pass to rlog -tabwidth=8 # width of horizontal tab - -while : -do - case $1 in - -c) changelog=${2?}; shift;; - -i) indent=${2?}; shift;; - -h) hostname=${2?}; shift;; - -l) length=${2?}; shift;; - -[nu]) # -n is obsolescent; it is replaced by -u. - case $1 in - -n) case ${2?}${3?}${4?} in - *"$tab"* | *"$nl"*) - echo >&2 "$0: -n '$2' '$3' '$4': tabs, newlines not allowed" - exit 1 - esac - case $loginFullnameMailaddrs in - '') loginFullnameMailaddrs=$2$tab$3$tab$4;; - ?*) loginFullnameMailaddrs=$loginFullnameMailaddrs$nl$2$tab$3$tab$4 - esac - shift; shift; shift;; - -u) - # If $2 is not tab-separated, use colon for separator. - case ${2?} in - *"$nl"*) - echo >&2 "$0: -u '$2': newlines not allowed" - exit 1;; - *"$tab"*) - t=$tab;; - *) - t=: - esac - case $2 in - *"$t"*"$t"*"$t"*) - echo >&2 "$0: -u '$2': too many fields" - exit 1;; - *"$t"*"$t"*) - ;; - *) - echo >&2 "$0: -u '$2': not enough fields" - exit 1 - esac - case $loginFullnameMailaddrs in - '') loginFullnameMailaddrs=$2;; - ?*) loginFullnameMailaddrs=$loginFullnameMailaddrs$nl$2 - esac - shift - esac - case $logins in - '') logins=$login;; - ?*) logins=$logins$nl$login - esac - ;; - -r) - case $rlog_options in - '') rlog_options=${2?};; - ?*) rlog_options=$rlog_options$nl${2?} - esac - shift;; - -R) recursive=t;; - -t) tabwidth=${2?}; shift;; - -v) revision=t;; - --version) - set $Id - rcs2logVersion=$3 - echo >&2 "rcs2log (GNU Emacs) $rcs2logVersion$nl$Copyright" - exit 0;; - -*) echo >&2 "Usage: $0 [OPTION]... [FILE ...]$nl$Help" - case $1 in - --help) exit 0;; - *) exit 1 - esac;; - *) break - esac - shift -done - -month_data=' - m[0]="Jan"; m[1]="Feb"; m[2]="Mar" - m[3]="Apr"; m[4]="May"; m[5]="Jun" - m[6]="Jul"; m[7]="Aug"; m[8]="Sep" - m[9]="Oct"; m[10]="Nov"; m[11]="Dec" -' - - -# Put rlog output into $rlogout. - -# If no rlog options are given, -# log the revisions checked in since the first ChangeLog entry. -# Since ChangeLog is only by date, some of these revisions may be duplicates of -# what's already in ChangeLog; it's the user's responsibility to remove them. -case $rlog_options in -'') - if test -s "$changelog" - then - e=' - /^[0-9]+-[0-9][0-9]-[0-9][0-9]/{ - # ISO 8601 date - print $1 - exit - } - /^... ... [ 0-9][0-9] [ 0-9][0-9]:[0-9][0-9]:[0-9][0-9] [0-9]+ /{ - # old-fashioned date and time (Emacs 19.31 and earlier) - '"$month_data"' - year = $5 - for (i=0; i<=11; i++) if (m[i] == $2) break - dd = $3 - printf "%d-%02d-%02d\n", year, i+1, dd - exit - } - ' - d=`$AWK "$e" <"$changelog"` || exit - case $d in - ?*) datearg="-d>$d" - esac - fi -esac - -# Use TZ specified by ChangeLog local variable, if any. -if test -s "$changelog" -then - extractTZ=' - /^.*change-log-time-zone-rule['"$tab"' ]*:['"$tab"' ]*"\([^"]*\)".*/{ - s//\1/; p; q - } - /^.*change-log-time-zone-rule['"$tab"' ]*:['"$tab"' ]*t.*/{ - s//UTC0/; p; q - } - ' - logTZ=`tail "$changelog" | sed -n "$extractTZ"` - case $logTZ in - ?*) TZ=$logTZ; export TZ - esac -fi - -# If CVS is in use, examine its repository, not the normal RCS files. -if test ! -f CVS/Repository -then - rlog=rlog - repository= -else - rlog='cvs -q log' - repository=`sed 1q &2 "$0: $repository: bad repository (see CVS/Repository)" - exit 1 - fi - esac -fi - -# Use $rlog's -zLT option, if $rlog supports it. -case `$rlog -zLT 2>&1` in -*' option'*) ;; -*) - case $rlog_options in - '') rlog_options=-zLT;; - ?*) rlog_options=-zLT$nl$rlog_options - esac -esac - -# With no arguments, examine all files under the RCS directory. -case $# in -0) - case $repository in - '') - oldIFS=$IFS - IFS=$nl - case $recursive in - t) - RCSdirs=`find . -name RCS -type d -print` - filesFromRCSfiles='s|,v$||; s|/RCS/|/|; s|^\./||' - files=` - { - case $RCSdirs in - ?*) find $RCSdirs \ - -type f \ - ! -name '*_' \ - ! -name ',*,' \ - ! -name '.*_' \ - ! -name .rcsfreeze.log \ - ! -name .rcsfreeze.ver \ - -print - esac - find . -name '*,v' -print - } | - sort -u | - sed "$filesFromRCSfiles" - `;; - *) - files= - for file in RCS/.* RCS/* .*,v *,v - do - case $file in - RCS/. | RCS/.. | RCS/,*, | RCS/*_) continue;; - RCS/.rcsfreeze.log | RCS/.rcsfreeze.ver) continue;; - RCS/.\* | RCS/\* | .\*,v | \*,v) test -f "$file" || continue;; - RCS/*,v | RCS/.*,v) ;; - RCS/* | RCS/.*) test -f "$file" || continue - esac - case $files in - '') files=$file;; - ?*) files=$files$nl$file - esac - done - case $files in - '') exit 0 - esac - esac - set x $files - shift - IFS=$oldIFS - esac -esac - -llogout=$TMPDIR/rcs2log$$l -rlogout=$TMPDIR/rcs2log$$r -trap exit 1 2 13 15 -trap "rm -f $llogout $rlogout; exit 1" 0 - -case $datearg in -?*) $rlog $rlog_options "$datearg" ${1+"$@"} >$rlogout;; -'') $rlog $rlog_options ${1+"$@"} >$rlogout -esac || exit - - -# Get the full name of each author the logs mention, and set initialize_fullname -# to awk code that initializes the `fullname' awk associative array. -# Warning: foreign authors (i.e. not known in the passwd file) are mishandled; -# you have to fix the resulting output by hand. - -initialize_fullname= -initialize_mailaddr= - -case $loginFullnameMailaddrs in -?*) - case $loginFullnameMailaddrs in - *\"* | *\\*) - sed 's/["\\]/\\&/g' >$llogout <$llogout </dev/null | - $AWK -F: "$awkscript" - `$initialize_fullname -esac - - -# Function to print a single log line. -# We don't use awk functions, to stay compatible with old awk versions. -# `Log' is the log message (with \n replaced by \001). -# `files' contains the affected files. -printlogline='{ - - # Following the GNU coding standards, rewrite - # * file: (function): comment - # to - # * file (function): comment - if (Log ~ /^\([^)]*\): /) { - i = index(Log, ")") - files = files " " substr(Log, 1, i) - Log = substr(Log, i+3) - } - - # If "label: comment" is too long, break the line after the ":". - sep = " " - if ('"$length"' <= '"$indent"' + 1 + length(files) + index(Log, SOH)) sep = "\n" indent_string - - # Print the label. - printf "%s*%s:", indent_string, files - - # Print each line of the log, transliterating \001 to \n. - while ((i = index(Log, SOH)) != 0) { - logline = substr(Log, 1, i-1) - if (logline ~ /[^'"$tab"' ]/) { - printf "%s%s\n", sep, logline - } else { - print "" - } - sep = indent_string - Log = substr(Log, i+1) - } -}' - -# Pattern to match the `revision' line of rlog output. -rlog_revision_pattern='^revision [0-9]+\.[0-9]+(\.[0-9]+\.[0-9]+)*(['"$tab"' ]+locked by: [^'"$tab"' $,.0-9:;@]*[^'"$tab"' $,:;@][^'"$tab"' $,.0-9:;@]*;)?['"$tab"' ]*$' - -case $hostname in -'') - hostname=`( - hostname || uname -n || uuname -l || cat /etc/whoami - ) 2>/dev/null` || { - echo >&2 "$0: cannot deduce hostname" - exit 1 - } - - case $hostname in - *.*) ;; - *) - domainname=`(domainname) 2>/dev/null` && - case $domainname in - *.*) hostname=$hostname.$domainname - esac - esac -esac - - -# Process the rlog output, generating ChangeLog style entries. - -# First, reformat the rlog output so that each line contains one log entry. -# Transliterate \n to \001 so that multiline entries fit on a single line. -# Discard irrelevant rlog output. -$AWK <$rlogout ' - BEGIN { repository = "'"$repository"'" } - /^RCS file:/ { - if (repository != "") { - filename = $3 - if (substr(filename, 1, length(repository) + 1) == repository "/") { - filename = substr(filename, length(repository) + 2) - } - if (filename ~ /,v$/) { - filename = substr(filename, 1, length(filename) - 2) - } - if (filename ~ /(^|\/)Attic\/[^\/]*$/) { - i = length(filename) - while (substr(filename, i, 1) != "/") i-- - filename = substr(filename, 1, i - 6) substr(filename, i + 1) - } - } - rev = "?" - } - /^Working file:/ { if (repository == "") filename = $3 } - /'"$rlog_revision_pattern"'/, /^(-----------*|===========*)$/ { - line = $0 - if (line ~ /'"$rlog_revision_pattern"'/) { - rev = $2 - next - } - if (line ~ /^date: [0-9][- +\/0-9:]*;/) { - date = $2 - if (date ~ /\//) { - # This is a traditional RCS format date YYYY/MM/DD. - # Replace "/"s with "-"s to get ISO format. - newdate = "" - while ((i = index(date, "/")) != 0) { - newdate = newdate substr(date, 1, i-1) "-" - date = substr(date, i+1) - } - date = newdate date - } - time = substr($3, 1, length($3) - 1) - author = substr($5, 1, length($5)-1) - printf "%s %s %s %s %s %c", filename, rev, date, time, author, 1 - rev = "?" - next - } - if (line ~ /^branches: /) { next } - if (line ~ /^(-----------*|===========*)$/) { print ""; next } - if (line == "Initial revision" || line ~ /^file .+ was initially added on branch .+\.$/) { - line = "New file." - } - printf "%s%c", line, 1 - } -' | - -# Now each line is of the form -# FILENAME REVISION YYYY-MM-DD HH:MM:SS[+-TIMEZONE] AUTHOR \001LOG -# where \001 stands for a carriage return, -# and each line of the log is terminated by \001 instead of \n. -# Sort the log entries, first by date+time (in reverse order), -# then by author, then by log entry, and finally by file name and revision -# (just in case). -sort +2 -4r +4 +0 | - -# Finally, reformat the sorted log entries. -$AWK ' - BEGIN { - logTZ = "'"$logTZ"'" - revision = "'"$revision"'" - - # Some awk variants do not understand "\001", so we have to - # put the char directly in the file. - SOH="" # <-- There is a single SOH (octal code 001) here. - - # Initialize the fullname and mailaddr associative arrays. - '"$initialize_fullname"' - '"$initialize_mailaddr"' - - # Initialize indent string. - indent_string = "" - i = '"$indent"' - if (0 < '"$tabwidth"') - for (; '"$tabwidth"' <= i; i -= '"$tabwidth"') - indent_string = indent_string "\t" - while (1 <= i--) - indent_string = indent_string " " - } - - { - newlog = substr($0, 1 + index($0, SOH)) - - # Ignore log entries prefixed by "#". - if (newlog ~ /^#/) { next } - - if (Log != newlog || date != $3 || author != $5) { - - # The previous log and this log differ. - - # Print the old log. - if (date != "") '"$printlogline"' - - # Logs that begin with "{clumpname} " should be grouped together, - # and the clumpname should be removed. - # Extract the new clumpname from the log header, - # and use it to decide whether to output a blank line. - newclumpname = "" - sep = "\n" - if (date == "") sep = "" - if (newlog ~ /^\{[^'"$tab"' }]*}['"$tab"' ]/) { - i = index(newlog, "}") - newclumpname = substr(newlog, 1, i) - while (substr(newlog, i+1) ~ /^['"$tab"' ]/) i++ - newlog = substr(newlog, i+1) - if (clumpname == newclumpname) sep = "" - } - printf sep - clumpname = newclumpname - - # Get ready for the next log. - Log = newlog - if (files != "") - for (i in filesknown) - filesknown[i] = 0 - files = "" - } - if (date != $3 || author != $5) { - # The previous date+author and this date+author differ. - # Print the new one. - date = $3 - time = $4 - author = $5 - - zone = "" - if (logTZ && ((i = index(time, "-")) || (i = index(time, "+")))) - zone = " " substr(time, i) - - # Print "date[ timezone] fullname ". - # Get fullname and email address from associative arrays; - # default to author and author@hostname if not in arrays. - if (fullname[author]) - auth = fullname[author] - else - auth = author - printf "%s%s %s ", date, zone, auth - if (mailaddr[author]) - printf "<%s>\n\n", mailaddr[author] - else - printf "<%s@%s>\n\n", author, "'"$hostname"'" - } - if (! filesknown[$1]) { - filesknown[$1] = 1 - if (files == "") files = " " $1 - else files = files ", " $1 - if (revision && $2 != "?") files = files " " $2 - } - } - END { - # Print the last log. - if (date != "") { - '"$printlogline"' - printf "\n" - } - } -' && - - -# Exit successfully. - -exec rm -f $llogout $rlogout - -# Local Variables: -# tab-width:4 -# End: diff --git a/bin/rlogin.exe b/bin/rlogin.exe deleted file mode 100644 index 7952e940e3157e488c034eec0dfbbe9bb69904a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcwPel00001 literal 11776 zcwX%~4Rlo1nRoueWHMm}2pBQKLkNP9kO*u;2r>|+>KfWHA)yr_#K|KwaWWHU-UC93 z3=X4=kEz)n>CtYjQ1EY;?Q*O?p$dkC&EVE*^mw``S*2CG4+pzevoK(q+3&mezDdA< z?b&lYXWPD$Z@&BU-TVFA?|%2Y?`7p39mGHgF#@F1gme=2ILKE&VSuqye=(Lkm;I}0 zow}-DO{=FL?dJif`8lErCX{I5*cagU{h|5>llz zl8?TqUZTx=irDlyI(-?r4k~5vw9`*i_)e*@NQBVnpfCJLZTE3 zxbF_MO2P`~^4gn)S>7gpASgD@Cb6?1`}Q*xuxVD;)hP8=bp?o|81@;LIY=U^eu3eP zK1EP4ulPuIiPNZ0X5YJu&6Dk!ICM4ubyARTdOCfPaOK?eRzc=$5y=K=Qr z3FH4S@EpLgEA;;kAYrO%bx)=F(z8VzNH07C z6_w-=^3$imsbM9P6O@VA7~74@o;0afjYZNy&uy@S(rJaR zpTT4WU)qO1@q&o9;CbK_%maFi(JtAf9?ylri-}}XkK|Gr)bRzlVWOV_k?lo_Txu4y z#d?8B^sGD{yv-@IOcTd7M}MQOtJ zyM``Geb4G6lw)m`tNM7+-!C!yH8PJXHUjm9-CO%07^h*w)vWVipr}^gyPEQdcD19qJddM+?zC#=%PjZ5QnHMeRp6cRCpw|L=FWAm z_H4iq=MMP&qFeF?{DRvT2#F9V$Bfd(urSHGLh5xBP;2J^SSgSS7QbW&@Ii?I2wPW|aEl;tA^7+`jqo+JRo@r|Dkj9{@fJ^*TQf*UCZeD@w&-EdNSU}6IBdU=o=V83dBCF+v+db^uK0abz(r&B z>_ko7?>_*ebiK)0U{4Hj82RGSJ{npW?ft{FYk(H^m#&6)-InRvC8r@=A4ZW#`ve-| z(hFb418W_lfvwbvTWQnTC=%JF8-OTY--oWh3P{4@o5^11@4=*>q%kZu>!IU=JZ&4& zv5VPQLAr5xY(9=%`DPxC0Xv<)r%_?2^OMXRkFz=0P`%U+9r5UK)Xy^}WOQ&%#%Y>t z{rkw_h;hce{Lo}wLLH9L)%qj=$Pc|(X-Oz z$PypW>2ND$27NXG!uHwt6Hn7P`f5*5Y-l7MJQk{Fu(#*jNfzBEsrxM~RJ@%}&x+j^ z7Al?qvVAYpC%iL~ucdQTW@)DhH*f?xXzTG_NkDC9?L5bH= zi7_b<+7GIB&f-aw`N(7-dKY2|f+QDAxkhl{u?O$7qinYG@M61x7Bc z5sC^!^@X7|MWW#LGz9Ch#Yb~_e?yBXKwT?4>OFywWFcOkPi$)N36Q4a!L_l$CyPQ+ zks$K55$bBtl!mx-(AAt)8^?1~No`xlE;ixWA-^APAKWIrV|zjVqv9NloZ6P%%Obd2 zuk8yo)4ey*vmF9|!pz($JG~Hl)Twk*Azq&X=gg0qrzez1qX% zGt>NoPxR|?7+`4oj2b4x`#L&NynavV*NjZWW%rzhMo$udj0GdQ^JzDp=1=0JeQ{A;vrdx{?TlMCSN%g4+l4deElnU{vX13dh9MeNpYr> z+QEI;9Gi$KfO_N{+-$@XBkhn^V>?oBW`0mJMDH}k?Wai98qcxo)(Qcb z6{v+q8q@D#F&*r5xu;^?I(%nJqbt5K4T;iC1avP9l?w#^3PTpg%etB_c)Z@K+JV1P zwin-ZfWKair;z8z(?*E;6uXkZNqPhNL0zWfNvcCit9$msD0O?T<}sk&YPA`vF3|T|t)Xb1tLzOzS9mXJ;;u$SDG2N7}gF ztP0Silw5(|ix$QY?l3fJSZgv}&*hAw{X;n;w69Y)=X^j^phcE;zov-fxlEMKAPFS9S!)jrJUxMdVw_gOB|b(iH!y0&GHTxo-4*#4;V zmHc~Y_Qg7nkfp*hiq2EDM#|~YY|W?eKB}~v!LMjM|1|C#aH&6n?t~N1L3>R8l*aSb z>L=M4fj_U}hk#*@rgdNNtC{mem_BKASTID=>5HFfHpjAn1ib_c-| zGTqm~^YL`y3~1}LHcurvcNl*A7+Hd_jew9a7@`L zY0S+#y5#>UO~+EP?&w>xFLJ&}wlJO+9iIY4&PvmFgOMfXWq9P3hZmPi3vXAZ-~!C6 zQKy-iS9D1hM>3o9kDYLNuARw!M{!tPsvg#$b18J4{ulTOZ_$-Y*HRV<(;03HU}lRx zh$P#{2>#4uRCg@I`W89O+rBldye8Ou6s&kyu$^Nx!3>V19wn-{NTOEAr8>)jQ*ufN zt^kTLJS$UrFPe|JAASM2?78-*_y-(qm+>;_(e@zq9j95T#T2DlS!uo9r9SmXJZ$Ze z)Q~M&4|fD=57?@TF%oy_W3_`!)`W8a7cab7Ph=b9EvHNM8GnGp;}Cvyj2(x?*W=2k=)GWSW@_(}K*ilHyf5U`0k3!ra6)lIKS@<)3xnkMzs#LJ!6X~jR zN2wHJBi%+Uf*2n}J~k|0KD&F-yK*Gf&Y16blF)=ssn0ul${0Hu*_va7T@`6h!BEJ~ zs0Sn`<9=r*t_2g{M_ZYNVIYpt*`fz9wk)BJYl}WkE6fQi6sJ90RxT|7i{tWvFDh4~ zH(oGa>Wyn>jr7Lf8Z>Wg$M-ILx+M@q=zfC*ae+KI-DI5ZpEJ`L9Z5q6&KJ38z8@I) zeoGeNde-MDt8&cIwB-*6xroT>eq@sh!$&6#8lBm6dbg3W1-k*%jhyyf3bWHuXb2|4yD<&%TrGm_zV=h>h>JURGaP zNwa=W9vIGZ>l}1xbG1Tk<5G9gPbLEW5Oih;KhWWjUgHF?Dmt30T8&}^dE&$neU*Qu z063gKKz3jR=PE?TX7yqIN+SgsQfU``J51$`^-$>(mByzjfesPkRAyJwCA#Ez?r$~64q7|>rqd5ayo%%rHSmoA4Z`C3}@e6spB0$lKuL+8{_!t@V31iouXq zYQvVw2A_9BAn5lt6br&KpHHB(g&_6AfAA0+;h?($fA;dZ*qvQgyg-<>TnyeV`oy-` z!h(4>E}FM!A-R{+-Ux6TfFIy~fFA-J2bc>%<~tBq4?+rHh8%Z2T#~xRL;76E2mEkU z*7Vsijh&kanB^{qGeLVo0FDuL{GY9x<}iAEWPpkh{Tl%mji`SY;2R_AZ2${K)VBbX zjHus1zTU?X9xl&?gC%b}Ayp&V2BA&Ze(9*;=fe?wDJUE7gS#p~0YC{r6~HQhwE&F( ztpJ+=!T`Gf9s$@7a1fvi;5C4^0r~+{fB^s!fi(rN1LOnD0GJC<25<|&DuDF>K7g$N zy8s>r*aL6?pcCL2Kp#LqfC?}GKtMMu>Wn(>_{-I4mhNUzS{Z1Rec~+*{zjj;jF4=y zZk-qm`UB8^4U}6Nytt*vQoXyu=L@*8e2?DU*0jm%U+48p_`%1AV(S}yzIE=PRI+Z} zH(jNrtzr;gUb@9li0sjeo4v3>4(KK$?&bx+|8UOWIh6M~j&ju{}S%(+Pd_WM(QUI5Y+;5cJ zV5tU43X&LLe$9i`_4VP z*H{LRu@e?Z{cBH`wUx0P%3hC*SH+r@JcDZ~XrT*bXLTx;0JJF>IQd5nkKMM$O2 zNIw0xdP9=$FtO^hbovsq7#d~(J%EkDDx`2~b-kvyj%b)ZJGDm35TSMv!fCWv*fbIw zNqgL2hmrijABV{A6#;*A3(*upTd&fC18W>Uujs`g^ua1dbL&((Cn5cgU4nr1O4c#m z(}i>ajUlxeY$vk-mQST~0^QYfe|r9ZK6UaJ(a{Cb4P=#*5K(vT{mv`a*Iifg`@c#g znq(JkWN(Bw2^;UXUWuL_^Q&{6L~Wi&h&<{!6>BH$d_)L@L&VPq+en1>23rXqYK(NW zi9{0k2nmJlfl!+y5+A=yYR0gR9i<@`J8>J;LGU*7rCh$i?XZV@`GO~3*kKQHbv3SP z54Qu6)3fE?np$p0`Mp(DcWtfUcHC9H+2L?_JZ1v&U3>XPN#wcYXgI`0_|`D=2pxjR zw{keyZ00z-uaL9bsTSN-PpuRQ;Y1bD*6E zsgQT+a4;ZLB-vqm&SSJ_WBydV^P0_gsT`1R}?!*+%=3Yj=MhBkgB0k z4UOw48q!)5h@z**TZ$5^)!#3K_&*svZFBaVm-LE3KJ(^1@Ln9pygG4&{MQSjNp?+) zm?3_EEAokUP7rB9w9}-2WUf+f>?*N~W*`A!II47x4*Z*5kxaKsqcPWn>^dE*8<*?O z#$02v>s+kvE4gm);!)TI?*?eRHaY0S_6uzAIc)rS za&RKC){QJp5Mxvx@{MYwEkq5_8W2?$qx3CEdOxOVXNu%*sA*Y+5>f^8Cb?PEwTx7! z-VC+t7-dmsrK$FPX6pPTvv*jH_>aIIp;ZJq6z-5{hfokZ~Vy zI*bK>d9QXL4E+c|XDww`{m^$ezmAtITTx`}mz?FPASDCXA5brW5Cbwt{FU9&rKXEJ+7 zZqn?#pw>$zWhk>Cq@lM)t$;J29M?4S{{`Cm3|jx&9OyoU3Vx`W@w{fn!ju_)3kcY* z)D2Z9erA2M+~ihVr`_t)Ihy%g&!tYYCiZRUif%w^(n(qMYpmWeX{42bu;3`TI8-SoMy%+vywBk<@wz_>J6pt zT($cCJm$CY7JbYEzUZeN<1L07^=~J~tTpP3v^Al)2HiEFdGF+)u0^kQ%+q9y>qKhb z=wh%>ukMD)9!lpHQK|~E3S{+O5I?!;u?0Vb}}jC22?0hsr#r}eQa*Z z=|uew8Ui2W8%5ZQU|;>^XeDfVu(fK#Tj#Q<)`AAFXVAN9l7mjYeHs#-nw=!kdK6cV zTmAY5x*W8FS@N$pXrAvh5o^z8NWsxg8`L)F=&CZJmw71gxojuZ6Xo-^*EGD zRgN4Rgv!7xSZ2tvbAY1HW4T1#2h-w&jn$zZ%Dn>)<1n6cWla5?)x0e z@#6FF4m&qRznR^BNqL$|_)LF{?(9^=d&8N=_0&TxWIGf#^*dWKRu`)})VIVazK+KJ z{3g1Xw`5QoMh+{+^^C{(5uJDtRI68dP%5ljPPO`qjd^qbd>!pBIAiTDP9zc+o1lRG zN4?%dh9f;xUf(FHpt-XJR_Ov=C7XK0nsjP``m&We)!KcNPKzSu*wb*GxoFU(t|5o0 zk^`XRfSRH7AuGlB7AS#`2Elv7 zmj?&F%uuLZOO3x8vEnk;K#utLIn>$8uc?RO2pH28u%@l~gX-{{Yp6kAlQ-r}DzQ{O zI!9Atxe}w^>!UI)H;&|{_Wyd!VWK8^s`=g2*C^H6(|rXO3H4ICV`(c!2b*Cq_WTiO z?|7);ExZTPGqwd10fdal6kSimTj+U8S^p}TI1Ztg_|Lz({I2fp=qV!%N-8X0wfb@P zbp?uEo*4N>sH9y%5(Td3@#^k;yH5j);hRC@uDOKf&wXatajWn<=$5Ymoa;a zz}Xy<9NvHfZfOqQC*4VU^Mz85z#rbQQoe^9L=3JtuUa7SlpLy{=O%F>DC+i~SdymW z=4>r%ToPBpU`>5$V5{ciWZORgv($p@q`hF*c6BZ^-Tu?*{4RsQq^FayU`whqgC1{M zl6vG$)#HpdkfutDS$!!fCAC(X&6b$Qrk=>Uj?FceYuNmNWg45;TBg{%*z!G_4M~cz zgk(~`0P($(cB4u&=n~JmhTZREO=I_8Cp)R6hqLHCBqhsZQv1zd`>Gk_ZD;a66bmtG zB}+|e=)tUMtp9mdn)UT6m-RjCGqSE;iyTyC1|8lrCv~{-Y8@_^r?L9)&?t|Z;&0Qg z??ai_v30k3s;#z3Ic?@?Y`w=k#nv_E@7cOANkRSpZRVu^(dL=r`{T^1HmB+GdFC`W z$CI5@(yub7#FU99$a?iLdI&awL}T%XBa41H`YLX&pT&)NT7Dm|saGG;XbvsfMpIc$ zVz8I(cZqxp^!4@%0Yv3+(=t1yGR|%1t=xr&ULHprZ?=p2}E5<)LtP$A7+;|37 zCzd(MG2ACEJ_37YFW!B`m3R-zrG$HRcIoCc$}31&o3@YRi1qJHa&{TIlM+V1E){Q< z&&nSkIQ_)zl3{W7=I(y!zl-6(CZFs%F9oAt+aZd?9R zn_GSHJ3QaPE$E81$D?PLb$HbjV>IU0!_8RJHSQY2#p~LuCz4fhja@9(r{V$b(#P>f zCHX8Yz8)8U6J7lC@}TS*2N%tePu=dBa6)6`ZqP+>O~9dH*dWf|XN`{Q#f*|=;_c;7 zEXQJLxnk(<7jNqRT+Dq5ULqo9!$IaHe4nH*q9ca#a^O{*D84kZASu6UEZRAiuvYw& z47D@1&2U^-jCX)w9#g(sshZfPUd~_(CjC|$mIvgM(N8obzD6ZhiuO%VtiWQ~CdJ(S zmbj?T#O=3$tKbKu1HGUk>IG;pmw&(MYzgk_4$)>Tp} zt^tqZ@sjh*2CB)bieMCkhl3j$Xh%I+p)_i&1x(K%x1 zMShJ__(hEDeH*dkdU|q{+ALGgdC{y?WLac=asS9{baI8+675_-M3dqfQ>qro3nznp z-@bhW{yIoU2Wck~5s46JZ42_myQ`G!3O7pvTzc8>7IwRo3}{~%Vjs_Tes4R^Q92xg zSHZ!~W+tV|guZoQjJvD1sb{`{03W|1Wzp=T`5HA~cj`qtdZ&)le)<`jrcZjIbeW1j zjQ31j!4Dtc5y&9jnJ|!`T}mG1AqUC#65oeLDfq zjaZZSPOZJMoZbulJHc`Of&vU_Q?){U<5r)f*GBE5<0#%>`f$n_<2>*x2AaEC#cUIM z{=yY{v6(3WPVWD(yBi_6@=>r!_35=Od>l?V#r+pQ0oAC!@+qo)yxe$%B9m%BWHDhY z+C{V{9_@zGK`9E)*&)T1uNtB#$LOS|jBF+P91I`EupgNnFSlVOUcQ%Tu_2eQh?j3U zN~cu5Op*IJifW&tD9?oNi;KvHc=-ZfA$Bb~NJqFQDXQqU(=$U0QJ)2kR6`4uG7r_C5exTKfU=)AQ3a^W$_+ z){oUd%tE^|t*@)5gw1eF$I}U=&~sz*J309zY?$8h|o@EdXwS`v80Z zB0v|w0f2)5PXQbOI0|qA;55KFfFXckfKh;P02An&1Hb_k0+a!40k{vq2hawvAK(DM zL4aogUatA$*L{UHk!aQ~IVh{AZFTnEww@mqdZY^-U3;C*+F0nHSskNC8OJ1_RVF z{qO3)Z=l44Z8`$}H3Y(qVvrOV0)kf*F{P0^4ZGpKNXSEm)|BosLrN4GG=M1Rea}Ee zlJ^af##Z3=fg!?s0sjkPHgT4b{Zxg1fx3wQfC%+ljcNZP0#81+nNCGU!7quv@E-7B zu~7&#dwo6_C9AQ{x3-BL*dpX-*w)-f)?*zV*6I~-e|f+th>=Er1jlyJdTSfjJ+$6N z?c9lVShO%uHDNuZ5e2Z$CO>a%PdWLxaZe;5^7Q}q?r~Lbbycpu!{G~3`8n=C4rmoR R1beY#RZ{Ptp8wnDe*k+q)+GP{ diff --git a/bin/rvi b/bin/rvi deleted file mode 100644 index 0bd5d088..00000000 --- a/bin/rvi +++ /dev/null @@ -1,8 +0,0 @@ -#! /bin/sh -# Copyright (C) 2002, Earnie Boyd -# mailto:earnie@uses.sf.net -# This file is a part of Minimal SYStem -# http://www.mingw.org/msys.shtml -# File: rvi - -exec vim -Z "$@" diff --git a/bin/rview b/bin/rview deleted file mode 100644 index 9f84af6d..00000000 --- a/bin/rview +++ /dev/null @@ -1,8 +0,0 @@ -#! /bin/sh -# Copyright (C) 2002, Earnie Boyd -# mailto:earnie@users.sf.net -# This file is a part of Minimal SYStem -# http://www.mingw.org/msys.shtml -# File: rview - -exec vim -ZR "$@" diff --git a/bin/rvim b/bin/rvim deleted file mode 100644 index 2b9ae4f8..00000000 --- a/bin/rvim +++ /dev/null @@ -1,8 +0,0 @@ -#! /bin/sh -# Copyright (C) 2002, Earnie Boyd -# mailto:earnie@users.sf.net -# This file is a part of Minimal SYStem -# http://www.mingw.org/msys.shtml -# File: rvim - -exec vim -Z "$@" diff --git a/bin/sftp.exe b/bin/sftp.exe deleted file mode 100644 index e7562478e0406e3f669960f67e3c7514d5ecb146..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcwPel00001 literal 84992 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 diff --git a/bin/telnet.exe b/bin/telnet.exe deleted file mode 100644 index 44d66b261221e56f64d8ddde385c2008ca950873..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcwPel00001 literal 109127 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 A(f|Me diff --git a/bin/texi2dvi b/bin/texi2dvi deleted file mode 100644 index b0754747..00000000 --- a/bin/texi2dvi +++ /dev/null @@ -1,657 +0,0 @@ -#! /bin/sh -# texi2dvi --- produce DVI (or PDF) files from Texinfo (or LaTeX) sources. -# $Id: texi2dvi,v 1.1 2002/12/05 21:07:19 earnie Exp $ -# -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, -# 2002 Free Software Foundation, Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, you can either send email to this -# program's maintainer or write to: The Free Software Foundation, -# Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA. -# -# Original author: Noah Friedman . -# -# Please send bug reports, etc. to bug-texinfo@gnu.org. -# If possible, please send a copy of the output of the script called with -# the `--debug' option when making a bug report. - -# This string is expanded by rcs automatically when this file is checked out. -rcs_revision='$Revision: 1.1 $' -rcs_version=`set - $rcs_revision; echo $2` -program=`echo $0 | sed -e 's!.*/!!'` -version="texi2dvi (GNU Texinfo 4.3) $rcs_version - -Copyright (C) 2002 Free Software Foundation, Inc. -There is NO warranty. You may redistribute this software -under the terms of the GNU General Public License. -For more information about these matters, see the files named COPYING." - -usage="Usage: $program [OPTION]... FILE... - -Run each Texinfo or LaTeX FILE through TeX in turn until all -cross-references are resolved, building all indices. The directory -containing each FILE is searched for included files. The suffix of FILE -is used to determine its language (LaTeX or Texinfo). - -Makeinfo is used to perform Texinfo macro expansion before running TeX -when needed. - -Operation modes: - -b, --batch no interaction - -c, --clean remove all auxiliary files - -D, --debug turn on shell debugging (set -x) - -h, --help display this help and exit successfully - -o, --output=OFILE leave output in OFILE (implies --clean); - Only one input FILE may be specified in this case - -q, --quiet no output unless errors (implies --batch) - -s, --silent same as --quiet - -v, --version display version information and exit successfully - -V, --verbose report on what is done - -TeX tuning: - -@ use @input instead of \input; for preloaded Texinfo - -e, -E, --expand force macro expansion using makeinfo - -I DIR search DIR for Texinfo files - -l, --language=LANG specify the LANG of FILE (LaTeX or Texinfo) - -p, --pdf use pdftex or pdflatex for processing - -t, --texinfo=CMD insert CMD after @setfilename in copy of input file - multiple values accumulate - -The values of the BIBTEX, LATEX (or PDFLATEX), MAKEINDEX, MAKEINFO, -TEX (or PDFTEX), and TEXINDEX environment variables are used to run -those commands, if they are set. - -Email bug reports to , -general questions and discussion to . -Texinfo home page: http://www.gnu.org/software/texinfo/" - -# Initialize variables for option overriding and otherwise. -# Don't use `unset' since old bourne shells don't have this command. -# Instead, assign them an empty value. -batch=false # eval for batch mode -clean= -debug= -escape='\' -expand= # t for expansion via makeinfo -miincludes= # makeinfo include path -oformat=dvi -oname= # --output -quiet= # by default let the tools' message be displayed -set_language= -textra= -tmpdir=${TMPDIR:-/tmp}/t2d$$ # avoid collisions on 8.3 filesystems. -txincludes= # TEXINPUTS extensions, with trailing colon -txiprereq=19990129 # minimum texinfo.tex version to have macro expansion -verbose=false # echo for verbose mode - -orig_pwd=`pwd` - -# Systems which define $COMSPEC or $ComSpec use semicolons to separate -# directories in TEXINPUTS. -if test -n "$COMSPEC$ComSpec"; then - path_sep=";" -else - path_sep=":" -fi - -# Pacify verbose cds. -CDPATH=${ZSH_VERSION+.}$path_sep - -# Save this so we can construct a new TEXINPUTS path for each file. -TEXINPUTS_orig="$TEXINPUTS" -# Unfortunately makeindex does not read TEXINPUTS. -INDEXSTYLE_orig="$INDEXSTYLE" -export TEXINPUTS INDEXSTYLE - -# Push a token among the arguments that will be used to notice when we -# ended options/arguments parsing. -# Use "set dummy ...; shift" rather than 'set - ..." because on -# Solaris set - turns off set -x (but keeps set -e). -# Use ${1+"$@"} rather than "$@" because Digital Unix and Ultrix 4.3 -# still expand "$@" to a single argument (the empty string) rather -# than nothing at all. -arg_sep="$$--$$" -set dummy ${1+"$@"} "$arg_sep"; shift - -# -# Parse command line arguments. -while test x"$1" != x"$arg_sep"; do - - # Handle --option=value by splitting apart and putting back on argv. - case "$1" in - --*=*) - opt=`echo "$1" | sed -e 's/=.*//'` - val=`echo "$1" | sed -e 's/[^=]*=//'` - shift - set dummy "$opt" "$val" ${1+"$@"}; shift - ;; - esac - - # This recognizes --quark as --quiet. So what. - case "$1" in - -@ ) escape=@;; - # Silently and without documentation accept -b and --b[atch] as synonyms. - -b | --b*) batch=eval;; - -q | -s | --q* | --s*) quiet=t; batch=eval;; - -c | --c*) clean=t;; - -D | --d*) debug=t;; - -e | -E | --e*) expand=t;; - -h | --h*) echo "$usage"; exit 0;; - -I | --I*) - shift - miincludes="$miincludes -I $1" - txincludes="$txincludes$1$path_sep" - ;; - -l | --l*) shift; set_language=$1;; - -o | --o*) - shift - clean=t - case "$1" in - /* | ?:/*) oname=$1;; - *) oname="$orig_pwd/$1";; - esac;; - -p | --p*) oformat=pdf;; - -t | --t*) shift; textra="$textra\\ -$1";; - -v | --vers*) echo "$version"; exit 0;; - -V | --verb*) verbose=echo;; - --) # What remains are not options. - shift - while test x"$1" != x"$arg_sep"; do - set dummy ${1+"$@"} "$1"; shift - shift - done - break;; - -*) - echo "$0: Unknown or ambiguous option \`$1'." >&2 - echo "$0: Try \`--help' for more information." >&2 - exit 1;; - *) set dummy ${1+"$@"} "$1"; shift;; - esac - shift -done -# Pop the token -shift - -# Interpret remaining command line args as filenames. -case $# in - 0) - echo "$0: Missing file arguments." >&2 - echo "$0: Try \`--help' for more information." >&2 - exit 2 - ;; - 1) ;; - *) - if test -n "$oname"; then - echo "$0: Can't use option \`--output' with more than one argument." >&2 - exit 2 - fi - ;; -esac - -# Prepare the temporary directory. Remove it at exit, unless debugging. -if test -z "$debug"; then - trap "cd / && rm -rf $tmpdir" 0 1 2 15 -fi - -# Create the temporary directory with strict rights -(umask 077 && mkdir $tmpdir) || exit 1 - -# Prepare the tools we might need. This may be extra work in some -# cases, but improves the readibility of the script. -utildir=$tmpdir/utils -mkdir $utildir || exit 1 - -# A sed script that preprocesses Texinfo sources in order to keep the -# iftex sections only. We want to remove non TeX sections, and -# comment (with `@c texi2dvi') TeX sections so that makeinfo does not -# try to parse them. Nevertheless, while commenting TeX sections, -# don't comment @macro/@end macro so that makeinfo does propagate -# them. Unfortunately makeinfo --iftex --no-ifhtml --no-ifinfo -# doesn't work well enough (yet) to use that, so work around with sed. -comment_iftex_sed=$utildir/comment.sed -cat <$comment_iftex_sed -/^@tex/,/^@end tex/{ - s/^/@c texi2dvi/ -} -/^@iftex/,/^@end iftex/{ - s/^/@c texi2dvi/ - /^@c texi2dvi@macro/,/^@c texi2dvi@end macro/{ - s/^@c texi2dvi// - } -} -/^@html/,/^@end html/{ - s/^/@c (texi2dvi)/ -} -/^@ifhtml/,/^@end ifhtml/{ - s/^/@c (texi2dvi)/ -} -/^@ifnottex/,/^@end ifnottex/{ - s/^/@c (texi2dvi)/ -} -/^@ifinfo/,/^@end ifinfo/{ - /^@node/p - /^@menu/,/^@end menu/p - t - s/^/@c (texi2dvi)/ -} -s/^@ifnotinfo/@c texi2dvi@ifnotinfo/ -s/^@end ifnotinfo/@c texi2dvi@end ifnotinfo/ -EOF -# Uncommenting is simple: Remove any leading `@c texi2dvi'. -uncomment_iftex_sed=$utildir/uncomment.sed -cat <$uncomment_iftex_sed -s/^@c texi2dvi// -EOF - -# A shell script that computes the list of xref files. -# Takes the filename (without extension) of which we look for xref -# files as argument. The index files must be reported last. -get_xref_files=$utildir/get_xref.sh -cat <<\EOF >$get_xref_files -#! /bin/sh - -# Get list of xref files (indexes, tables and lists). -# Find all files having root filename with a two-letter extension, -# saves the ones that are really Texinfo-related files. .?o? catches -# many files: .toc, .log, LaTeX tables and lists, FiXme's .lox, maybe more. -for this_file in "$1".?o? "$1".aux "$1".?? "$1".idx; do - # If file is empty, skip it. - test -s "$this_file" || continue - # If the file is not suitable to be an index or xref file, don't - # process it. The file can't be if its first character is not a - # backslash or single quote. - first_character=`sed -n '1s/^\(.\).*$/\1/p;q' $this_file` - if test "x$first_character" = "x\\" \ - || test "x$first_character" = "x'"; then - xref_files="$xref_files ./$this_file" - fi -done -echo "$xref_files" -EOF -chmod 500 $get_xref_files - -# File descriptor usage: -# 0 standard input -# 1 standard output (--verbose messages) -# 2 standard error -# 3 some systems may open it to /dev/tty -# 4 used on the Kubota Titan -# 5 tools output (turned off by --quiet) - -# Tools' output. If quiet, discard, else redirect to the message flow. -if test "$quiet" = t; then - exec 5>/dev/null -else - exec 5>&1 -fi - -# Enable tracing -test "$debug" = t && set -x - -# -# TeXify files. - -for command_line_filename in ${1+"$@"}; do - $verbose "Processing $command_line_filename ..." - - # If the COMMAND_LINE_FILENAME is not absolute (e.g., --debug.tex), - # prepend `./' in order to avoid that the tools take it as an option. - echo "$command_line_filename" | egrep '^(/|[A-z]:/)' >/dev/null \ - || command_line_filename="./$command_line_filename" - - # See if the file exists. If it doesn't we're in trouble since, even - # though the user may be able to reenter a valid filename at the tex - # prompt (assuming they're attending the terminal), this script won't - # be able to find the right xref files and so forth. - if test ! -r "$command_line_filename"; then - echo "$0: Could not read $command_line_filename, skipping." >&2 - continue - fi - - # Get the name of the current directory. We want the full path - # because in clean mode we are in tmp, in which case a relative - # path has no meaning. - filename_dir=`echo $command_line_filename | sed 's!/[^/]*$!!;s!^$!.!'` - filename_dir=`cd "$filename_dir" >/dev/null && pwd` - - # Strip directory part but leave extension. - filename_ext=`basename "$command_line_filename"` - # Strip extension. - filename_noext=`echo "$filename_ext" | sed 's/\.[^.]*$//'` - ext=`echo "$filename_ext" | sed 's/^.*\.//'` - - # _src. Use same basename since we want to generate aux files with - # the same basename as the manual. If --expand, then output the - # macro-expanded file to here, else copy the original file. - tmpdir_src=$tmpdir/src - filename_src=$tmpdir_src/$filename_noext.$ext - - # _xtr. The file with the user's extra commands. - tmpdir_xtr=$tmpdir/xtr - filename_xtr=$tmpdir_xtr/$filename_noext.$ext - - # _bak. Copies of the previous xref files (another round is run if - # they differ from the new one). - tmpdir_bak=$tmpdir/bak - - # Make all those directories and give up if we can't succeed. - mkdir $tmpdir_src $tmpdir_xtr $tmpdir_bak || exit 1 - - # Source file might include additional sources. - # We want `.:$orig_pwd' before anything else. (We'll add `.:' later - # after all other directories have been turned into absolute paths.) - # `.' goes first to ensure that any old .aux, .cps, - # etc. files in ${directory} don't get used in preference to fresher - # files in `.'. Include orig_pwd in case we are in clean mode, where - # we've cd'd to a temp directory. - common="$orig_pwd$path_sep$filename_dir$path_sep$txincludes" - TEXINPUTS="$common$TEXINPUTS_orig" - INDEXSTYLE="$common$INDEXSTYLE_orig" - - # Convert relative paths to absolute paths, so we can run in another - # directory (e.g., in --clean mode, or during the macro-support - # detection.) - # - # Empty path components are meaningful to tex. We rewrite them - # as `EMPTY' so they don't get lost when we split on $path_sep. - TEXINPUTS=`echo $TEXINPUTS |sed 's/^:/EMPTY:/;s/:$/:EMPTY/;s/::/:EMPTY:/g'` - INDEXSTYLE=`echo $INDEXSTYLE |sed 's/^:/EMPTY:/;s/:$/:EMPTY/;s/::/:EMPTY:/g'` - save_IFS=$IFS - IFS=$path_sep - set x $TEXINPUTS; shift - TEXINPUTS=. - for dir - do - case $dir in - EMPTY) - TEXINPUTS=$TEXINPUTS$path_sep - ;; - [\\/]* | ?:[\\/]*) # Absolute paths don't need to be expansed. - TEXINPUTS=$TEXINPUTS$path_sep$dir - ;; - *) - abs=`cd "$dir" && pwd` && TEXINPUTS=$TEXINPUTS$path_sep$abs - ;; - esac - done - set x $INDEXSTYLE; shift - INDEXSTYLE=. - for dir - do - case $dir in - EMPTY) - INDEXSTYLE=$INDEXSTYLE$path_sep - ;; - [\\/]* | ?:[\\/]*) # Absolute paths don't need to be expansed. - INDEXSTYLE=$INDEXSTYLE$path_sep$dir - ;; - *) - abs=`cd "$dir" && pwd` && INDEXSTYLE=$INDEXSTYLE$path_sep$abs - ;; - esac - done - IFS=$save_IFS - - # If the user explicitly specified the language, use that. - # Otherwise, if the first line is \input texinfo, assume it's texinfo. - # Otherwise, guess from the file extension. - if test -n "$set_language"; then - language=$set_language - elif sed 1q "$command_line_filename" | fgrep 'input texinfo' >/dev/null; then - language=texinfo - else - language= - fi - - # Get the type of the file (latex or texinfo) from the given language - # we just guessed, or from the file extension if not set yet. - case ${language:-$filename_ext} in - [lL]a[tT]e[xX] | *.ltx | *.tex) - # Assume a LaTeX file. LaTeX needs bibtex and uses latex for - # compilation. No makeinfo. - bibtex=${BIBTEX:-bibtex} - makeinfo= # no point in running makeinfo on latex source. - texindex=${MAKEINDEX:-makeindex} - if test $oformat = dvi; then - tex=${LATEX:-latex} - else - tex=${PDFLATEX:-pdflatex} - fi - ;; - - *) - # Assume a Texinfo file. Texinfo files need makeinfo, texindex and tex. - bibtex= - texindex=${TEXINDEX:-texindex} - if test $oformat = dvi; then - tex=${TEX:-tex} - else - tex=${PDFTEX:-pdftex} - fi - # Unless required by the user, makeinfo expansion is wanted only - # if texinfo.tex is too old. - if test "$expand" = t; then - makeinfo=${MAKEINFO:-makeinfo} - else - # Check if texinfo.tex performs macro expansion by looking for - # its version. The version is a date of the form YEAR-MO-DA. - # We don't need to use [0-9] to match the digits since anyway - # the comparison with $txiprereq, a number, will fail with non - # digits. - txiversion_tex=txiversion.tex - echo '\input texinfo.tex @bye' >$tmpdir/$txiversion_tex - # Run in the tmpdir to avoid leaving files. - eval `cd $tmpdir >/dev/null && - $tex $txiversion_tex 2>/dev/null | - sed -n 's/^.*\[\(.*\)version \(....\)-\(..\)-\(..\).*$/txiformat=\1 txiversion="\2\3\4"/p'` - $verbose "texinfo.tex preloaded as \`$txiformat', version is \`$txiversion' ..." - if test "$txiprereq" -le "$txiversion" >/dev/null 2>&1; then - makeinfo= - else - makeinfo=${MAKEINFO:-makeinfo} - fi - # As long as we had to run TeX, offer the user this convenience - if test "$txiformat" = Texinfo; then - escape=@ - fi - fi - ;; - esac - - # Expand macro commands in the original source file using Makeinfo. - # Always use `end' footnote style, since the `separate' style - # generates different output (arguably this is a bug in -E). - # Discard main info output, the user asked to run TeX, not makeinfo. - if test -n "$makeinfo"; then - $verbose "Macro-expanding $command_line_filename to $filename_src ..." - sed -f $comment_iftex_sed "$command_line_filename" \ - | $makeinfo --footnote-style=end -I "$filename_dir" $miincludes \ - -o /dev/null --macro-expand=- \ - | sed -f $uncomment_iftex_sed >"$filename_src" - filename_input=$filename_src - fi - - # If makeinfo failed (or was not even run), use the original file as input. - if test $? -ne 0 \ - || test ! -r "$filename_src"; then - $verbose "Reverting to $command_line_filename ..." - filename_input=$filename_dir/$filename_ext - fi - - # Used most commonly for @finalout, @smallbook, etc. - if test -n "$textra"; then - $verbose "Inserting extra commands: $textra" - sed '/^@setfilename/a\ -'"$textra" "$filename_input" >$filename_xtr - filename_input=$filename_xtr - fi - - # If clean mode was specified, then move to the temporary directory. - if test "$clean" = t; then - $verbose "cd $tmpdir_src" - cd "$tmpdir_src" || exit 1 - fi - - while :; do # will break out of loop below - orig_xref_files=`$get_xref_files "$filename_noext"` - - # Save copies of originals for later comparison. - if test -n "$orig_xref_files"; then - $verbose "Backing up xref files: `echo $orig_xref_files | sed 's|\./||g'`" - cp $orig_xref_files $tmpdir_bak - fi - - # Run bibtex on current file. - # - If its input (AUX) exists. - # - If AUX contains both `\bibdata' and `\bibstyle'. - # - If some citations are missing (LOG contains `Citation'). - # or the LOG complains of a missing .bbl - # - # We run bibtex first, because I can see reasons for the indexes - # to change after bibtex is run, but I see no reason for the - # converse. - # - # Don't try to be too smart. Running bibtex only if the bbl file - # exists and is older than the LaTeX file is wrong, since the - # document might include files that have changed. Because there - # can be several AUX (if there are \include's), but a single LOG, - # looking for missing citations in LOG is easier, though we take - # the risk to match false messages. - if test -n "$bibtex" \ - && test -r "$filename_noext.aux" \ - && test -r "$filename_noext.log" \ - && (grep '^\\bibdata[{]' "$filename_noext.aux" \ - && grep '^\\bibstyle[{]' "$filename_noext.aux" \ - && (grep 'Warning:.*Citation.*undefined' "$filename_noext.log" \ - || grep 'No file .*\.bbl\.' "$filename_noext.log")) \ - >/dev/null 2>&1; \ - then - $verbose "Running $bibtex $filename_noext ..." - if $bibtex "$filename_noext" >&5; then :; else - echo "$0: $bibtex exited with bad status, quitting." >&2 - exit 1 - fi - fi - - # What we'll run texindex on -- exclude non-index files. - # Since we know index files are last, it is correct to remove everything - # before .aux and .?o?. But don't really do o - # -- don't match whitespace as . - # Otherwise, if orig_xref_files contains something like - # foo.xo foo.whatever - # the space after the o will get matched. - index_files=`echo "$orig_xref_files" \ - | sed "s!.*\.aux!!g; - s!./$filename_noext\.[^ ]o[^ ]!!g; - s/^[ ]*//;s/[ ]*$//"` - # Run texindex (or makeindex) on current index files. If they - # already exist, and after running TeX a first time the index - # files don't change, then there's no reason to run TeX again. - # But we won't know that if the index files are out of date or - # nonexistent. - if test -n "$texindex" && test -n "$index_files"; then - $verbose "Running $texindex $index_files ..." - if $texindex $index_files 2>&5 1>&2; then :; else - echo "$0: $texindex exited with bad status, quitting." >&2 - exit 1 - fi - fi - - # Finally, run TeX. - # Prevent $ESCAPE from being interpreted by the shell if it happens - # to be `/'. - $batch tex_args="\\${escape}nonstopmode\ \\${escape}input" - cmd="$tex $tex_args $filename_input" - $verbose "Running $cmd ..." - if $cmd >&5; then :; else - echo "$0: $tex exited with bad status, quitting." >&2 - echo "$0: see $filename_noext.log for errors." >&2 - test "$clean" = t \ - && cp "$filename_noext.log" "$orig_pwd" - exit 1 - fi - - - # Decide if looping again is needed. - finished=t - - # LaTeX (and the package changebar) report in the LOG file if it - # should be rerun. This is needed for files included from - # subdirs, since texi2dvi does not try to compare xref files in - # subdirs. Performing xref files test is still good since LaTeX - # does not report changes in xref files. - if fgrep "Rerun to get" "$filename_noext.log" >/dev/null 2>&1; then - finished= - fi - - # Check if xref files changed. - new_xref_files=`$get_xref_files "$filename_noext"` - $verbose "Original xref files = `echo $orig_xref_files | sed 's|\./||g'`" - $verbose "New xref files = `echo $new_xref_files | sed 's|\./||g'`" - - # If old and new lists don't at least have the same file list, - # then one file or another has definitely changed. - test "x$orig_xref_files" != "x$new_xref_files" && finished= - - # File list is the same. We must compare each file until we find - # a difference. - if test -n "$finished"; then - for this_file in $new_xref_files; do - $verbose "Comparing xref file `echo $this_file | sed 's|\./||g'` ..." - # cmp -s returns nonzero exit status if files differ. - if cmp -s "$this_file" "$tmpdir_bak/$this_file"; then :; else - # We only need to keep comparing until we find one that - # differs, because we'll have to run texindex & tex again no - # matter how many more there might be. - finished= - $verbose "xref file `echo $this_file | sed 's|\./||g'` differed ..." - test "$debug" = t && diff -c "$tmpdir_bak/$this_file" "$this_file" - break - fi - done - fi - - # If finished, exit the loop, else rerun the loop. - test -n "$finished" && break - done - - # If we were in clean mode, compilation was in a tmp directory. - # Copy the DVI (or PDF) file into the directory where the compilation - # has been done. (The temp dir is about to get removed anyway.) - # We also return to the original directory so that - # - the next file is processed in correct conditions - # - the temporary file can be removed - if test -n "$clean"; then - if test -n "$oname"; then - dest=$oname - else - dest=$orig_pwd - fi - $verbose "Copying $oformat file from `pwd` to $dest" - cp -p "./$filename_noext.$oformat" "$dest" - cd / # in case $orig_pwd is on a different drive (for DOS) - cd $orig_pwd || exit 1 - fi - - # Remove temporary files. - if test "x$debug" = "x"; then - $verbose "Removing $tmpdir_src $tmpdir_xtr $tmpdir_bak ..." - cd / - rm -rf $tmpdir_src $tmpdir_xtr $tmpdir_bak - fi -done - -$verbose "$0 done." -exit 0 # exit successfully, not however we ended the loop. diff --git a/bin/texindex.exe b/bin/texindex.exe deleted file mode 100644 index 78df4ee53fbb0a5d780ef914cc25a19f7daa7766..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcwPel00001 literal 29184 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 diff --git a/bin/tftp.exe b/bin/tftp.exe deleted file mode 100644 index dec441580778f9a9ff90ed0f442b3abbe7c6bcf6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcwPel00001 literal 40946 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. - commit_prep A perl script, to be combined with log_accum.pl, to - log_accum provide for a way to combine the individual log - messages of a multi-directory "commit" into a - single log message, and mail the result somewhere. - Can also do other checks for $Id and that you are - committing the correct revision of the file. - Read the comments carefully. - Contributed by David Hampton . - mfpipe Another perl script for logging. Allows you to - pipe the log message to a file and/or send mail - to some alias. - Contributed by John Clyne . - rcs-to-cvs Script to import sources that may have been under - RCS control already. - Contributed by Per Cederqvist . - cvscheck Identifies files added, changed, or removed in a - cvscheck.man checked out CVS tree; also notices unknown files. - Contributed by Lowell Skoog - cvshelp.man An introductory manual page written by Lowell Skoog - . It is most likely - out-of-date relative to CVS 1.3, but still may be - useful. - dirfns A shar file which contains some code that might - help your system support opendir/readdir/closedir, - if it does not already. - Copied from the C-News distribution. - rcslock A perl script that can be added to your commitinfo - file that tries to determine if your RCS file is - currently locked by someone else, as might be the - case for a binary file. - Contributed by John Rouillard . - cvs_acls A perl script that implements Access Control Lists - by using the "commitinfo" hook provided with the - "cvs commit" command. - Contributed by David G. Grubbs . - descend A shell script that can be used to recursively - descend.man descend through a directory. In CVS 1.2, this was - very useful, since many of the commands were not - recursive. In CVS 1.3 (and later), however, most of - the commands are recursive. However, this may still - come in handy. - Contributed by Lowell Skoog - cln_hist A perl script to compress your - $CVSROOT/CVSROOT/history file, as it can grow quite - large after extended use. - Contributed by David G. Grubbs - sccs2rcs A C-shell script that can convert (some) SCCS files - into RCS files, retaining the info contained in the - SCCS file (like dates, author, and log message). - Contributed by Ken Cox . - intro.doc A user's view of what you need to know to get - started with CVS. - Contributed by . - rcs2sccs A shell script to convert simple RCS files into - SCCS files, originally gleaned off the network - somewhere (originally by "kenc") and modified by - Jerry Jelinek and - Brian Berliner to increase - robustness and add support for one-level of branches. - rcs2log A shell script to create a ChangeLog-format file - given only a set of RCS files. - Contributed by Paul Eggert . - clmerge A perl script to handle merge conflicts in GNU - style ChangeLog files . - Contributed by Tom Tromey . - cvs2vendor A shell script to move changes from a repository - that was started without a vendor branch to one - that has a vendor branch. - Contributed by Greg A. Woods diff --git a/lib/cvs/contrib/clmerge b/lib/cvs/contrib/clmerge deleted file mode 100644 index cb32fabe..00000000 --- a/lib/cvs/contrib/clmerge +++ /dev/null @@ -1,152 +0,0 @@ -#! /bin/perl - -# Merge conflicted ChangeLogs -# tromey Mon Aug 15 1994 - -# Usage is: -# -# cl-merge [-i] file ... -# -# With -i, it works in place (backups put in a ~ file). Otherwise the -# merged ChangeLog is printed to stdout. - -# Please report any bugs to me. I wrote this yesterday, so there are no -# guarantees about its performance. I recommend checking its output -# carefully. If you do send a bug report, please include the failing -# ChangeLog, so I can include it in my test suite. -# -# Tom -# --- -# tromey@busco.lanl.gov Member, League for Programming Freedom -# Sadism and farce are always inexplicably linked. -# -- Alexander Theroux - - -# Month->number mapping. Used for sorting. -%months = ('Jan', 0, - 'Feb', 1, - 'Mar', 2, - 'Apr', 3, - 'May', 4, - 'Jun', 5, - 'Jul', 6, - 'Aug', 7, - 'Sep', 8, - 'Oct', 9, - 'Nov', 10, - 'Dec', 11); - -# If '-i' is given, do it in-place. -if ($ARGV[0] eq '-i') { - shift (@ARGV); - $^I = '~'; -} - -$lastkey = ''; -$lastval = ''; -$conf = 0; -%conflist = (); - -$tjd = 0; - -# Simple state machine. The states: -# -# 0 Not in conflict. Just copy input to output. -# 1 Beginning an entry. Next non-blank line is key. -# 2 In entry. Entry beginner transitions to state 1. -while (<>) { - if (/^<<<>>>/) { - # End of conflict. Output. - - # Copy last key into array. - if ($lastkey ne '') { - $conflist{$lastkey} = $lastval; - - $lastkey = ''; - $lastval = ''; - } - - foreach (reverse sort clcmp keys %conflist) { - print STDERR "doing $_" if $tjd; - print $_; - print $conflist{$_}; - } - - $lastkey = ''; - $lastval = ''; - $conf = 0; - %conflist = (); - } elsif ($conf == 1) { - # Beginning an entry. Skip empty lines. Error if not a real - # beginner. - if (/^$/) { - # Empty line; just skip at this point. - } elsif (/^[MTWFS]/) { - # Looks like the name of a day; assume opener and move to - # "in entry" state. - $lastkey = $_; - $conf = 2; - print STDERR "found $_" if $tjd; - } else { - die ("conflict crosses entry boundaries: $_"); - } - } elsif ($conf == 2) { - # In entry. Copy into variable until we see beginner line. - if (/^[MTWFS]/) { - # Entry beginner line. - - # Copy last key into array. - if ($lastkey ne '') { - $conflist{$lastkey} = $lastval; - - $lastkey = ''; - $lastval = ''; - } - - $lastkey = $_; - print STDERR "found $_" if $tjd; - $lastval = ''; - } else { - $lastval .= $_; - } - } else { - # Just copy. - print; - } -} - -# Compare ChangeLog time strings like <=>. -# -# 0 1 2 3 -# Thu Aug 11 13:22:42 1994 Tom Tromey (tromey@creche.colorado.edu) -# 0123456789012345678901234567890 -# -sub clcmp { - # First check year. - $r = substr ($a, 20, 4) <=> substr ($b, 20, 4); - - # Now check month. - $r = $months{substr ($a, 4, 3)} <=> $months{substr ($b, 4, 3)} if !$r; - - # Now check day. - $r = substr ($a, 8, 2) <=> substr ($b, 8, 2) if !$r; - - # Now check time (3 parts). - $r = substr ($a, 11, 2) <=> substr ($b, 11, 2) if !$r; - $r = substr ($a, 14, 2) <=> substr ($b, 14, 2) if !$r; - $r = substr ($a, 17, 2) <=> substr ($b, 17, 2) if !$r; - - $r; -} diff --git a/lib/cvs/contrib/cln_hist b/lib/cvs/contrib/cln_hist deleted file mode 100644 index 0cacbc83..00000000 --- a/lib/cvs/contrib/cln_hist +++ /dev/null @@ -1,91 +0,0 @@ -#! /bin/perl -# -*-Perl-*- -# -# Contributed by David G. Grubbs -# -# Clean up the history file. 10 Record types: MAR OFT WUCG -# -# WUCG records are thrown out. -# MAR records are retained. -# T records: retain only last tag with same combined tag/module. -# -# Two passes: Walk through the first time and remember the -# 1. Last Tag record with same "tag" and "module" names. -# 2. Last O record with unique user/module/directory, unless followed -# by a matching F record. -# - -$r = $ENV{"CVSROOT"}; -$c = "$r/CVSROOT"; -$h = "$c/history"; - -eval "print STDERR \$die='Unknown parameter $1\n' if !defined \$$1; \$$1=\$';" - while ($ARGV[0] =~ /^(\w+)=/ && shift(@ARGV)); -exit 255 if $die; # process any variable=value switches - -%tags = (); -%outs = (); - -# -# Move history file to safe place and re-initialize a new one. -# -rename($h, "$h.bak"); -open(XX, ">$h"); -close(XX); - -# -# Pass1 -- remember last tag and checkout. -# -open(HIST, "$h.bak"); -while () { - next if /^[MARWUCG]/; - - # Save whole line keyed by tag|module - if (/^T/) { - @tmp = split(/\|/, $_); - $tags{$tmp[4] . '|' . $tmp[5]} = $_; - } - # Save whole line - if (/^[OF]/) { - @tmp = split(/\|/, $_); - $outs{$tmp[1] . '|' . $tmp[2] . '|' . $tmp[5]} = $_; - } -} - -# -# Pass2 -- print out what we want to save. -# -open(SAVE, ">$h.work"); -open(HIST, "$h.bak"); -while () { - next if /^[FWUCG]/; - - # If whole line matches saved (i.e. "last") one, print it. - if (/^T/) { - @tmp = split(/\|/, $_); - next if $tags{$tmp[4] . '|' . $tmp[5]} ne $_; - } - # Save whole line - if (/^O/) { - @tmp = split(/\|/, $_); - next if $outs{$tmp[1] . '|' . $tmp[2] . '|' . $tmp[5]} ne $_; - } - - print SAVE $_; -} - -# -# Put back the saved stuff -# -system "cat $h >> $h.work"; - -if (-s $h) { - rename ($h, "$h.interim"); - print "history.interim has non-zero size.\n"; -} else { - unlink($h); -} - -rename ("$h.work", $h); - -exit(0); diff --git a/lib/cvs/contrib/commit_prep b/lib/cvs/contrib/commit_prep deleted file mode 100644 index 56f83842..00000000 --- a/lib/cvs/contrib/commit_prep +++ /dev/null @@ -1,215 +0,0 @@ -#! /bin/perl -# -*-Perl-*- -# -# -# Perl filter to handle pre-commit checking of files. This program -# records the last directory where commits will be taking place for -# use by the log_accum.pl script. For new files, it forces the -# existence of a RCS "Id" keyword in the first ten lines of the file. -# For existing files, it checks version number in the "Id" line to -# prevent losing changes because an old version of a file was copied -# into the direcory. -# -# Possible future enhancements: -# -# Check for cruft left by unresolved conflicts. Search for -# "^<<<<<<<$", "^-------$", and "^>>>>>>>$". -# -# Look for a copyright and automagically update it to the -# current year. [[ bad idea! -- woods ]] -# -# -# Contributed by David Hampton -# -# Hacked on lots by Greg A. Woods - -# -# Configurable options -# - -# Constants (remember to protect strings from RCS keyword substitution) -# -$LAST_FILE = "/tmp/#cvs.lastdir"; # must match name in log_accum.pl -$ENTRIES = "CVS/Entries"; - -# Patterns to find $Log keywords in files -# -$LogString1 = "\\\$\\Log: .* \\\$"; -$LogString2 = "\\\$\\Log\\\$"; -$NoLog = "%s - contains an RCS \$Log keyword. It must not!\n"; - -# pattern to match an RCS Id keyword line with an existing ID -# -$IDstring = "\"@\\(#\\)[^:]*:.*\\\$\Id: .*\\\$\""; -$NoId = " -%s - Does not contain a properly formatted line with the keyword \"Id:\". - I.e. no lines match \"" . $IDstring . "\". - Please see the template files for an example.\n"; - -# pattern to match an RCS Id keyword line for a new file (i.e. un-expanded) -# -$NewId = "\"@(#)[^:]*:.*\\$\Id\\$\""; - -$NoName = " -%s - The ID line should contain only \"@(#)module/path:\$Name\$:\$\Id\$\" - for a newly created file.\n"; - -$BadName = " -%s - The file name '%s' in the ID line does not match - the actual filename.\n"; - -$BadVersion = " -%s - How dare you!!! You replaced your copy of the file '%s', - which was based upon version %s, with an %s version based - upon %s. Please move your '%s' out of the way, perform an - update to get the current version, and them merge your changes - into that file, then try the commit again.\n"; - -# -# Subroutines -# - -sub write_line { - local($filename, $line) = @_; - open(FILE, ">$filename") || die("Cannot open $filename, stopped"); - print(FILE $line, "\n"); - close(FILE); -} - -sub check_version { - local($i, $id, $rname, $version); - local($filename, $cvsversion) = @_; - - open(FILE, "<$filename") || return(0); - - @all_lines = (); - $idpos = -1; - $newidpos = -1; - for ($i = 0; ; $i++) { - chop; - push(@all_lines, $_); - if ($_ =~ /$IDstring/) { - $idpos = $i; - } - if ($_ =~ /$NewId/) { - $newidpos = $i; - } - } - - if (grep(/$LogString1/, @all_lines) || grep(/$LogString2/, @all_lines)) { - print STDERR sprintf($NoLog, $filename); - return(1); - } - - if ($debug != 0) { - print STDERR sprintf("file = %s, version = %d.\n", $filename, $cvsversion{$filename}); - } - - if ($cvsversion{$filename} == 0) { - if ($newidpos != -1 && $all_lines[$newidpos] !~ /$NewId/) { - print STDERR sprintf($NoName, $filename); - return(1); - } - return(0); - } - - if ($idpos == -1) { - print STDERR sprintf($NoId, $filename); - return(1); - } - - $line = $all_lines[$idpos]; - $pos = index($line, "Id: "); - if ($debug != 0) { - print STDERR sprintf("%d in '%s'.\n", $pos, $line); - } - ($id, $rname, $version) = split(' ', substr($line, $pos)); - if ($rname ne "$filename,v") { - print STDERR sprintf($BadName, $filename, substr($rname, 0, length($rname)-2)); - return(1); - } - if ($cvsversion{$filename} < $version) { - print STDERR sprintf($BadVersion, $filename, $filename, $cvsversion{$filename}, - "newer", $version, $filename); - return(1); - } - if ($cvsversion{$filename} > $version) { - print STDERR sprintf($BadVersion, $filename, $filename, $cvsversion{$filename}, - "older", $version, $filename); - return(1); - } - return(0); -} - -# -# Main Body -# - -$id = getpgrp(); # You *must* use a shell that does setpgrp()! - -# Check each file (except dot files) for an RCS "Id" keyword. -# -$check_id = 0; - -# Record the directory for later use by the log_accumulate stript. -# -$record_directory = 0; - -# parse command line arguments -# -while (@ARGV) { - $arg = shift @ARGV; - - if ($arg eq '-d') { - $debug = 1; - print STDERR "Debug turned on...\n"; - } elsif ($arg eq '-c') { - $check_id = 1; - } elsif ($arg eq '-r') { - $record_directory = 1; - } else { - push(@files, $arg); - } -} - -$directory = shift @files; - -if ($debug != 0) { - print STDERR "dir - ", $directory, "\n"; - print STDERR "files - ", join(":", @files), "\n"; - print STDERR "id - ", $id, "\n"; -} - -# Suck in the CVS/Entries file -# -open(ENTRIES, $ENTRIES) || die("Cannot open $ENTRIES.\n"); -while () { - local($filename, $version) = split('/', substr($_, 1)); - $cvsversion{$filename} = $version; -} - -# Now check each file name passed in, except for dot files. Dot files -# are considered to be administrative files by this script. -# -if ($check_id != 0) { - $failed = 0; - foreach $arg (@files) { - if (index($arg, ".") == 0) { - next; - } - $failed += &check_version($arg); - } - if ($failed) { - print STDERR "\n"; - exit(1); - } -} - -# Record this directory as the last one checked. This will be used -# by the log_accumulate script to determine when it is processing -# the final directory of a multi-directory commit. -# -if ($record_directory != 0) { - &write_line("$LAST_FILE.$id", $directory); -} -exit(0); diff --git a/lib/cvs/contrib/cvs2vendor b/lib/cvs/contrib/cvs2vendor deleted file mode 100644 index 234f4d95..00000000 --- a/lib/cvs/contrib/cvs2vendor +++ /dev/null @@ -1,142 +0,0 @@ -#! /bin/sh -# -# cvs2vendor - move revsisions from files in A to files in B -# -# The primary reason for this script is to move deltas from a -# non-vendor branched repository onto a fresh vendor branched one, -# skipping the initial checkin in assumption that it is the same in -# both repositories. This way you can take a project that was moved -# into CVS without the benefit of the vendor branch and for all -# intents and purposes add the vendor branch underneath the existing -# deltas. -# -# This script is also a decent example of repository maintenance using -# raw RCS commands (if I do say so myself! ;-). -# -# Tags are preserved. -# -# The timestamp of the initial vendor branch revision will be adjusted -# to be the same as the 1.1 revision of each source file. -# -# Extra branches in the source directory will cause breakage. -# -# Intermediate files are created in the current working directory -# where this script is started. -# -# Written by Greg A. Woods , based on rcs2sccs -# (retains some of the rlog parsing from it). -# -# The copyright is in the Public Domain. -# - -if [ $# -ne 2 ]; then - echo USAGE: $0 srcdir dstdir - exit 2 -fi -tsrcdir=$1 -tdstdir=$2 - -revfile=/tmp/cvs2vendor_$$_rev -rm -f $revfile - -commentfile=/tmp/cvs2vendor_$$_comment -rm -f $commentfile - -srcdirs=`cd $tsrcdir && find . -type d -print | sed 's~^\.[/]*~~'` - -# the "" is a trick to get $tsrcdir itself without resorting to '.' -for ldir in "" $srcdirs; do - - srcdir=$tsrcdir/$ldir - dstdir=$tdstdir/$ldir - - # Loop over every RCS file in srcdir - # - for vfile in $srcdir/*,v; do - # get rid of the ",v" at the end of the name - file=`echo $vfile | sed -e 's/,v$//'` - bfile=`basename $file` - - if [ ! -d $dstdir ]; then - echo "making locally added directory $dstdir" - mkdir -p $dstdir - fi - if [ ! -f $dstdir/$bfile,v ]; then - echo "copying locally added file $dstdir/$bfile ..." - cp $vfile $dstdir - continue; - fi - - # work on each rev of that file in ascending order - rlog $file | grep "^revision [0-9][0-9]*\." | awk '{print $2}' | sed -e 's/\./ /g' | sort -n -u +0 +1 +2 +3 +4 +5 +6 +7 +8 | sed -e 's/ /./g' > $revfile - - for rev in `cat $revfile`; do - - case "$rev" in - 1.1) - newdate=`rlog -r$rev $file | grep "^date: " | awk '{printf("%s.%s\n",$2,$3); exit}' | sed -e 's~/~.~g' -e 's/:/./g' -e 's/;//' -e 's/^19//'` - olddate=`rlog -r1.1.1.1 $dstdir/$bfile | grep "^date: " | awk '{printf("%s.%s\n",$2,$3); exit}' | sed -e 's~/~.~g' -e 's/:/./g' -e 's/;//' -e 's/^19//'` - sed "s/$olddate/$newdate/" < $dstdir/$bfile,v > $dstdir/$bfile.x - mv -f $dstdir/$bfile.x $dstdir/$bfile,v - chmod -w $dstdir/$bfile,v - symname=`rlog -h $file | sed -e '1,/^symbolic names:/d' -e 's/[ ]*//g' | awk -F: '$2 == "'"$rev"'" {printf("-n%s:1.1.1.1\n",$1)}'` - if [ -n "$symname" ]; then - echo "tagging $file with $symname ..." - rcs $symname $dstdir/$bfile,v - if [ $? != 0 ]; then - echo ERROR - rcs $symname $dstdir/$bfile,v - exit 1 - fi - fi - continue # skip first rev.... - ;; - esac - - # get a lock on the destination local branch tip revision - co -r1 -l $dstdir/$bfile - if [ $? != 0 ]; then - echo ERROR - co -r1 -l $dstdir/$bfile - exit 1 - fi - rm -f $dstdir/$bfile - - # get file into current dir and get stats - date=`rlog -r$rev $file | grep "^date: " | awk '{printf("%s %s\n",$2,$3); exit}' | sed -e 's/;//'` - author=`rlog -r$rev $file | grep "^date: " | awk '{print $5; exit}' | sed -e 's/;//'` - - symname=`rlog -h $file | sed -e '1,/^symbolic names:/d' -e 's/[ ]*//g' | awk -F: '$2 == "'"$rev"'" {printf("-n%s\n",$1)}'` - - rlog -r$rev $file | sed -e '/^branches: /d' -e '1,/^date: /d' -e '/^===========/d' | awk '{if ((total += length($0) + 1) < 510) print $0}' > $commentfile - - echo "==> file $file, rev=$rev, date=$date, author=$author $symname" - - co -p -r$rev $file > $bfile - if [ $? != 0 ]; then - echo ERROR - co -p -r$rev $file - exit 1 - fi - - # check file into vendor repository... - ci -f -m"`cat $commentfile`" -d"$date" $symname -w"$author" $bfile $dstdir/$bfile,v - if [ $? != 0 ]; then - echo ERROR - ci -f -m"`cat $commentfile`" -d"$date" $symname -w"$author" $bfile $dstdir/$bfile,v - exit 1 - fi - rm -f $bfile - - # set the default branch to the trunk... - # XXX really only need to do this once.... - rcs -b1 $dstdir/$bfile - if [ $? != 0 ]; then - echo ERROR - rcs -b1 $dstdir/$bfile - exit 1 - fi - done - done -done - -echo cleaning up... -rm -f $commentfile -echo " Conversion Completed Successfully" - -exit 0 diff --git a/lib/cvs/contrib/cvs_acls b/lib/cvs/contrib/cvs_acls deleted file mode 100644 index d408908b..00000000 --- a/lib/cvs/contrib/cvs_acls +++ /dev/null @@ -1,141 +0,0 @@ -#! /bin/perl -# -*-Perl-*- -# -# Access control lists for CVS. dgg@ksr.com (David G. Grubbs) -# -# CVS "commitinfo" for matching repository names, running the program it finds -# on the same line. More information is available in the CVS man pages. -# -# ==== INSTALLATION: -# -# To use this program as I intended, do the following four things: -# -# 0. Install PERL. :-) -# -# 1. Put one line, as the *only* non-comment line, in your commitinfo file: -# -# DEFAULT /usr/local/bin/cvs_acls -# -# 2. Install this file as /usr/local/bin/cvs_acls and make it executable. -# -# 3. Create a file named $CVSROOT/CVSROOT/avail. -# -# ==== FORMAT OF THE avail FILE: -# -# The avail file determines whether you may commit files. It contains lines -# read from top to bottom, keeping track of a single "bit". The "bit" -# defaults to "on". It can be turned "off" by "unavail" lines and "on" by -# "avail" lines. ==> Last one counts. -# -# Any line not beginning with "avail" or "unavail" is ignored. -# -# Lines beginning with "avail" or "unavail" are assumed to be '|'-separated -# triples: (All spaces and tabs are ignored in a line.) -# -# {avail.*,unavail.*} [| user,user,... [| repos,repos,...]] -# -# 1. String starting with "avail" or "unavail". -# 2. Optional, comma-separated list of usernames. -# 3. Optional, comma-separated list of repository pathnames. -# These are pathnames relative to $CVSROOT. They can be directories or -# filenames. A directory name allows access to all files and -# directories below it. -# -# Example: (Text from the ';;' rightward may not appear in the file.) -# -# unavail ;; Make whole repository unavailable. -# avail|dgg ;; Except for user "dgg". -# avail|fred, john|bin/ls ;; Except when "fred" or "john" commit to -# ;; the module whose repository is "bin/ls" -# -# PROGRAM LOGIC: -# -# CVS passes to @ARGV an absolute directory pathname (the repository -# appended to your $CVSROOT variable), followed by a list of filenames -# within that directory. -# -# We walk through the avail file looking for a line that matches both -# the username and repository. -# -# A username match is simply the user's name appearing in the second -# column of the avail line in a space-or-comma separate list. -# -# A repository match is either: -# - One element of the third column matches $ARGV[0], or some -# parent directory of $ARGV[0]. -# - Otherwise *all* file arguments ($ARGV[1..$#ARGV]) must be -# in the file list in one avail line. -# - In other words, using directory names in the third column of -# the avail file allows committing of any file (or group of -# files in a single commit) in the tree below that directory. -# - If individual file names are used in the third column of -# the avail file, then files must be committed individually or -# all files specified in a single commit must all appear in -# third column of a single avail line. -# - -$debug = 0; -$cvsroot = $ENV{'CVSROOT'}; -$availfile = $cvsroot . "/CVSROOT/avail"; -$myname = $ENV{"USER"} if !($myname = $ENV{"LOGNAME"}); - -eval "print STDERR \$die='Unknown parameter $1\n' if !defined \$$1; \$$1=\$';" - while ($ARGV[0] =~ /^(\w+)=/ && shift(@ARGV)); -exit 255 if $die; # process any variable=value switches - -die "Must set CVSROOT\n" if !$cvsroot; -($repos = shift) =~ s:^$cvsroot/::; -grep($_ = $repos . '/' . $_, @ARGV); - -print "$$ Repos: $repos\n","$$ ==== ",join("\n$$ ==== ",@ARGV),"\n" if $debug; - -$exit_val = 0; # Good Exit value - -$universal_off = 0; -open (AVAIL, $availfile) || exit(0); # It is ok for avail file not to exist -while () { - chop; - next if /^\s*\#/; - next if /^\s*$/; - ($flagstr, $u, $m) = split(/[\s,]*\|[\s,]*/, $_); - - # Skip anything not starting with "avail" or "unavail" and complain. - (print "Bad avail line: $_\n"), next - if ($flagstr !~ /^avail/ && $flagstr !~ /^unavail/); - - # Set which bit we are playing with. ('0' is OK == Available). - $flag = (($& eq "avail") ? 0 : 1); - - # If we find a "universal off" flag (i.e. a simple "unavail") remember it - $universal_off = 1 if ($flag && !$u && !$m); - - # $myname considered "in user list" if actually in list or is NULL - $in_user = (!$u || grep ($_ eq $myname, split(/[\s,]+/,$u))); - print "$$ \$myname($myname) in user list: $_\n" if $debug && $in_user; - - # Module matches if it is a NULL module list in the avail line. If module - # list is not null, we check every argument combination. - if (!($in_repo = !$m)) { - @tmp = split(/[\s,]+/,$m); - for $j (@tmp) { - # If the repos from avail is a parent(or equal) dir of $repos, OK - $in_repo = 1, last if ($repos eq $j || $repos =~ /^$j\//); - } - if (!$in_repo) { - $in_repo = 1; - for $j (@ARGV) { - last if !($in_repo = grep ($_ eq $j, @tmp)); - } - } - } - print "$$ \$repos($repos) in repository list: $_\n" if $debug && $in_repo; - - $exit_val = $flag if ($in_user && $in_repo); - print "$$ ==== \$exit_val = $exit_val\n$$ ==== \$flag = $flag\n" if $debug; -} -close(AVAIL); -print "$$ ==== \$exit_val = $exit_val\n" if $debug; -print "**** Access denied: Insufficient Karma ($myname|$repos)\n" if $exit_val; -print "**** Access allowed: Personal Karma exceeds Environmental Karma.\n" - if $universal_off && !$exit_val; -exit($exit_val); diff --git a/lib/cvs/contrib/cvscheck b/lib/cvs/contrib/cvscheck deleted file mode 100644 index f711b430..00000000 --- a/lib/cvs/contrib/cvscheck +++ /dev/null @@ -1,83 +0,0 @@ -#! /bin/sh -# -# cvscheck - identify files added, changed, or removed -# in CVS working directory -# -# Contributed by Lowell Skoog -# -# This program should be run in a working directory that has been -# checked out using CVS. It identifies files that have been added, -# changed, or removed in the working directory, but not "cvs -# committed". It also determines whether the files have been "cvs -# added" or "cvs removed". For directories, it is only practical to -# determine whether they have been added. - -name=cvscheck -changes=0 - -# If we can't run CVS commands in this directory -cvs status . > /dev/null 2>&1 -if [ $? != 0 ] ; then - - # Bail out - echo "$name: there is no version here; bailing out" 1>&2 - exit 1 -fi - -# Identify files added to working directory -for file in .* * ; do - - # Skip '.' and '..' - if [ $file = '.' -o $file = '..' ] ; then - continue - fi - - # If a regular file - if [ -f $file ] ; then - if cvs status $file | grep -s '^From:[ ]*New file' ; then - echo "file added: $file - not CVS committed" - changes=`expr $changes + 1` - elif cvs status $file | grep -s '^From:[ ]*no entry for' ; then - echo "file added: $file - not CVS added, not CVS committed" - changes=`expr $changes + 1` - fi - - # Else if a directory - elif [ -d $file -a $file != CVS.adm ] ; then - - # Move into it - cd $file - - # If CVS commands don't work inside - cvs status . > /dev/null 2>&1 - if [ $? != 0 ] ; then - echo "directory added: $file - not CVS added" - changes=`expr $changes + 1` - fi - - # Move back up - cd .. - fi -done - -# Identify changed files -changedfiles=`cvs diff | egrep '^diff' | awk '{print $3}'` -for file in $changedfiles ; do - echo "file changed: $file - not CVS committed" - changes=`expr $changes + 1` -done - -# Identify files removed from working directory -removedfiles=`cvs status | egrep '^File:[ ]*no file' | awk '{print $4}'` - -# Determine whether each file has been cvs removed -for file in $removedfiles ; do - if cvs status $file | grep -s '^From:[ ]*-' ; then - echo "file removed: $file - not CVS committed" - else - echo "file removed: $file - not CVS removed, not CVS committed" - fi - changes=`expr $changes + 1` -done - -exit $changes diff --git a/lib/cvs/contrib/cvscheck.man b/lib/cvs/contrib/cvscheck.man deleted file mode 100644 index 2b90b49a..00000000 --- a/lib/cvs/contrib/cvscheck.man +++ /dev/null @@ -1,52 +0,0 @@ -.\" Contributed by Lowell Skoog -.TH CVSCHECK LOCAL "4 March 1991" FLUKE -.SH NAME -cvscheck \- identify files added, changed, or removed in a CVS working -directory -.SH SYNOPSIS -.B cvscheck -.SH DESCRIPTION -This command is a housekeeping aid. It should be run in a working -directory that has been checked out using CVS. It identifies files -that have been added, changed, or removed in the working directory, but -not CVS -.BR commit ted. -It also determines whether the files have been CVS -.BR add ed -or CVS -.BR remove d. -For directories, this command determines only whether they have been -.BR add ed. -It operates in the current directory only. -.LP -This command provides information that is available using CVS -.B status -and CVS -.BR diff . -The advantage of -.B cvscheck -is that its output is very concise. It saves you the strain (and -potential error) of interpreting the output of CVS -.B status -and -.BR diff . -.LP -See -.BR cvs (local) -or -.BR cvshelp (local) -for instructions on how to add or remove a file or directory in a -CVS-controlled package. -.SH DIAGNOSTICS -The exit status is 0 if no files have been added, changed, or removed -from the current directory. Otherwise, the command returns a count of -the adds, changes, and deletes. -.SH SEE ALSO -.BR cvs (local), -.BR cvshelp (local) -.SH AUTHOR -Lowell Skoog -.br -Software Technology Group -.br -Technical Computing diff --git a/lib/cvs/contrib/intro.doc b/lib/cvs/contrib/intro.doc deleted file mode 100644 index a6d4ec12..00000000 --- a/lib/cvs/contrib/intro.doc +++ /dev/null @@ -1,112 +0,0 @@ -Date: Tue, 16 Jun 1992 17:05:23 +0200 -From: Steven.Pemberton@cwi.nl -Message-Id: <9206161505.AA06927.steven@sijs.cwi.nl> -To: berliner@Sun.COM -Subject: cvs - -INTRODUCTION TO USING CVS - - CVS is a system that lets groups of people work simultaneously on - groups of files (for instance program sources). - - It works by holding a central 'repository' of the most recent version - of the files. You may at any time create a personal copy of these - files; if at a later date newer versions of the files are put in the - repository, you can 'update' your copy. - - You may edit your copy of the files freely. If new versions of the - files have been put in the repository in the meantime, doing an update - merges the changes in the central copy into your copy. - (It can be that when you do an update, the changes in the - central copy clash with changes you have made in your own - copy. In this case cvs warns you, and you have to resolve the - clash in your copy.) - - When you are satisfied with the changes you have made in your copy of - the files, you can 'commit' them into the central repository. - (When you do a commit, if you haven't updated to the most - recent version of the files, cvs tells you this; then you have - to first update, resolve any possible clashes, and then redo - the commit.) - -USING CVS - - Suppose that a number of repositories have been stored in - /usr/src/cvs. Whenever you use cvs, the environment variable - CVSROOT must be set to this (for some reason): - - CVSROOT=/usr/src/cvs - export CVSROOT - -TO CREATE A PERSONAL COPY OF A REPOSITORY - - Suppose you want a copy of the files in repository 'views' to be - created in your directory src. Go to the place where you want your - copy of the directory, and do a 'checkout' of the directory you - want: - - cd $HOME/src - cvs checkout views - - This creates a directory called (in this case) 'views' in the src - directory, containing a copy of the files, which you may now work - on to your heart's content. - -TO UPDATE YOUR COPY - - Use the command 'cvs update'. - - This will update your copy with any changes from the central - repository, telling you which files have been updated (their names - are displayed with a U before them), and which have been modified - by you and not yet committed (preceded by an M). You will be - warned of any files that contain clashes, the clashes will be - marked in the file surrounded by lines of the form <<<< and >>>>. - -TO COMMIT YOUR CHANGES - - Use the command 'cvs commit'. - - You will be put in an editor to make a message that describes the - changes that you have made (for future reference). Your changes - will then be added to the central copy. - -ADDING AND REMOVING FILES - - It can be that the changes you want to make involve a completely - new file, or removing an existing one. The commands to use here - are: - - cvs add - cvs remove - - You still have to do a commit after these commands. You may make - any number of new files in your copy of the repository, but they - will not be committed to the central copy unless you do a 'cvs add'. - -OTHER USEFUL COMMANDS AND HINTS - - To see the commit messages for files, and who made them, use: - - cvs log [filenames] - - To see the differences between your version and the central version: - - cvs diff [filenames] - - To give a file a new name, rename it and do an add and a remove. - - To lose your changes and go back to the version from the - repository, delete the file and do an update. - - After an update where there have been clashes, your original - version of the file is saved as .#file.version. - - All the cvs commands mentioned accept a flag '-n', that doesn't do - the action, but lets you see what would happen. For instance, you - can use 'cvs -n update' to see which files would be updated. - -MORE INFORMATION - - This is necessarily a very brief introduction. See the manual page - (man cvs) for full details. diff --git a/lib/cvs/contrib/log b/lib/cvs/contrib/log deleted file mode 100644 index 2b8ad86b..00000000 --- a/lib/cvs/contrib/log +++ /dev/null @@ -1,182 +0,0 @@ -#! /bin/perl -# -*-Perl-*- -# -# XXX: FIXME: handle multiple '-f logfile' arguments -# -# XXX -- I HATE Perl! This *will* be re-written in shell/awk/sed soon! -# - -# Usage: log.pl [-u user] [[-m mailto] ...] [-s] -f logfile 'dirname file ...' -# -# -u user - $USER passed from loginfo -# -m mailto - for each user to receive cvs log reports -# (multiple -m's permitted) -# -s - to prevent "cvs status -v" messages -# -f logfile - for the logfile to append to (mandatory, -# but only one logfile can be specified). - -# here is what the output looks like: -# -# From: woods@kuma.domain.top -# Subject: CVS update: testmodule -# -# Date: Wednesday November 23, 1994 @ 14:15 -# Author: woods -# -# Update of /local/src-CVS/testmodule -# In directory kuma:/home/kuma/woods/work.d/testmodule -# -# Modified Files: -# test3 -# Added Files: -# test6 -# Removed Files: -# test4 -# Log Message: -# - wow, what a test -# -# (and for each file the "cvs status -v" output is appended unless -s is used) -# -# ================================================================== -# File: test3 Status: Up-to-date -# -# Working revision: 1.41 Wed Nov 23 14:15:59 1994 -# Repository revision: 1.41 /local/src-CVS/cvs/testmodule/test3,v -# Sticky Options: -ko -# -# Existing Tags: -# local-v2 (revision: 1.7) -# local-v1 (revision: 1.1.1.2) -# CVS-1_4A2 (revision: 1.1.1.2) -# local-v0 (revision: 1.2) -# CVS-1_4A1 (revision: 1.1.1.1) -# CVS (branch: 1.1.1) - -$cvsroot = $ENV{'CVSROOT'}; - -# turn off setgid -# -$) = $(; - -$dostatus = 1; - -# parse command line arguments -# -while (@ARGV) { - $arg = shift @ARGV; - - if ($arg eq '-m') { - $users = "$users " . shift @ARGV; - } elsif ($arg eq '-u') { - $login = shift @ARGV; - } elsif ($arg eq '-f') { - ($logfile) && die "Too many '-f' args"; - $logfile = shift @ARGV; - } elsif ($arg eq '-s') { - $dostatus = 0; - } else { - ($donefiles) && die "Too many arguments!\n"; - $donefiles = 1; - @files = split(/ /, $arg); - } -} - -# the first argument is the module location relative to $CVSROOT -# -$modulepath = shift @files; - -$mailcmd = "| Mail -s 'CVS update: $modulepath'"; - -# Initialise some date and time arrays -# -@mos = (January,February,March,April,May,June,July,August,September, - October,November,December); -@days = (Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday); - -($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime; -$year += 1900; - -# get a login name for the guy doing the commit.... -# -if ($login eq '') { - $login = getlogin || (getpwuid($<))[0] || "nobody"; -} - -# open log file for appending -# -open(OUT, ">>" . $logfile) || die "Could not open(" . $logfile . "): $!\n"; - -# send mail, if there's anyone to send to! -# -if ($users) { - $mailcmd = "$mailcmd $users"; - open(MAIL, $mailcmd) || die "Could not Exec($mailcmd): $!\n"; -} - -# print out the log Header -# -print OUT "\n"; -print OUT "****************************************\n"; -print OUT "Date:\t$days[$wday] $mos[$mon] $mday, $year @ $hour:" . sprintf("%02d", $min) . "\n"; -print OUT "Author:\t$login\n\n"; - -if (MAIL) { - print MAIL "\n"; - print MAIL "Date:\t$days[$wday] $mos[$mon] $mday, $year @ $hour:" . sprintf("%02d", $min) . "\n"; - print MAIL "Author:\t$login\n\n"; -} - -# print the stuff from logmsg that comes in on stdin to the logfile -# -open(IN, "-"); -while () { - print OUT $_; - if (MAIL) { - print MAIL $_; - } -} -close(IN); - -print OUT "\n"; - -# after log information, do an 'cvs -Qq status -v' on each file in the arguments. -# -if ($dostatus != 0) { - while (@files) { - $file = shift @files; - if ($file eq "-") { - print OUT "[input file was '-']\n"; - if (MAIL) { - print MAIL "[input file was '-']\n"; - } - last; - } - $pid = open(RCS, "-|"); - if ( !defined $pid ) - { - die "fork failed: $!"; - } - if ($pid == 0) - { - exec 'cvs', '-nQq', 'status', '-v', $file; - die "cvs exec failed: $!"; - } - while () { - print OUT; - if (MAIL) { - print MAIL; - } - } - close(RCS); - } -} - -close(OUT); -die "Write to $logfile failed" if $?; - -close(MAIL); -die "Pipe to $mailcmd failed" if $?; - -## must exit cleanly -## -exit 0; diff --git a/lib/cvs/contrib/log_accum b/lib/cvs/contrib/log_accum deleted file mode 100644 index 4b99e485..00000000 --- a/lib/cvs/contrib/log_accum +++ /dev/null @@ -1,576 +0,0 @@ -#! /bin/perl -# -*-Perl-*- -# -# Perl filter to handle the log messages from the checkin of files in -# a directory. This script will group the lists of files by log -# message, and mail a single consolidated log message at the end of -# the commit. -# -# This file assumes a pre-commit checking program that leaves the -# names of the first and last commit directories in a temporary file. -# -# Contributed by David Hampton -# -# hacked greatly by Greg A. Woods - -# Usage: log_accum.pl [-d] [-s] [-w] [-M module] [-u user] [[-m mailto] ...] [[-R replyto] ...] [-f logfile] -# -d - turn on debugging -# -m mailto - send mail to "mailto" (multiple) -# -R replyto - set the "Reply-To:" to "replyto" (multiple) -# -M modulename - set module name to "modulename" -# -f logfile - write commit messages to logfile too -# -s - *don't* run "cvs status -v" for each file -# -w - show working directory with log message -# -u user - $USER passed from loginfo - -# -# Configurable options -# - -# set this to something that takes a whole message on stdin -$MAILER = "/usr/lib/sendmail -t"; - -# -# End user configurable options. -# - -# Constants (don't change these!) -# -$STATE_NONE = 0; -$STATE_CHANGED = 1; -$STATE_ADDED = 2; -$STATE_REMOVED = 3; -$STATE_LOG = 4; - -$LAST_FILE = "/tmp/#cvs.lastdir"; - -$CHANGED_FILE = "/tmp/#cvs.files.changed"; -$ADDED_FILE = "/tmp/#cvs.files.added"; -$REMOVED_FILE = "/tmp/#cvs.files.removed"; -$LOG_FILE = "/tmp/#cvs.files.log"; - -$FILE_PREFIX = "#cvs.files"; - -# -# Subroutines -# - -sub cleanup_tmpfiles { - local($wd, @files); - - $wd = `pwd`; - chdir("/tmp") || die("Can't chdir('/tmp')\n"); - opendir(DIR, "."); - push(@files, grep(/^$FILE_PREFIX\..*\.$id$/, readdir(DIR))); - closedir(DIR); - foreach (@files) { - unlink $_; - } - unlink $LAST_FILE . "." . $id; - - chdir($wd); -} - -sub write_logfile { - local($filename, @lines) = @_; - - open(FILE, ">$filename") || die("Cannot open log file $filename.\n"); - print FILE join("\n", @lines), "\n"; - close(FILE); -} - -sub append_to_logfile { - local($filename, @lines) = @_; - - open(FILE, ">$filename") || die("Cannot open log file $filename.\n"); - print FILE join("\n", @lines), "\n"; - close(FILE); -} - -sub format_names { - local($dir, @files) = @_; - local(@lines); - - $format = "\t%-" . sprintf("%d", length($dir)) . "s%s "; - - $lines[0] = sprintf($format, $dir, ":"); - - if ($debug) { - print STDERR "format_names(): dir = ", $dir, "; files = ", join(":", @files), ".\n"; - } - foreach $file (@files) { - if (length($lines[$#lines]) + length($file) > 65) { - $lines[++$#lines] = sprintf($format, " ", " "); - } - $lines[$#lines] .= $file . " "; - } - - @lines; -} - -sub format_lists { - local(@lines) = @_; - local(@text, @files, $lastdir); - - if ($debug) { - print STDERR "format_lists(): ", join(":", @lines), "\n"; - } - @text = (); - @files = (); - $lastdir = shift @lines; # first thing is always a directory - if ($lastdir !~ /.*\/$/) { - die("Damn, $lastdir doesn't look like a directory!\n"); - } - foreach $line (@lines) { - if ($line =~ /.*\/$/) { - push(@text, &format_names($lastdir, @files)); - $lastdir = $line; - @files = (); - } else { - push(@files, $line); - } - } - push(@text, &format_names($lastdir, @files)); - - @text; -} - -sub append_names_to_file { - local($filename, $dir, @files) = @_; - - if (@files) { - open(FILE, ">>$filename") || die("Cannot open file $filename.\n"); - print FILE $dir, "\n"; - print FILE join("\n", @files), "\n"; - close(FILE); - } -} - -sub read_line { - local($line); - local($filename) = @_; - - open(FILE, "<$filename") || die("Cannot open file $filename.\n"); - $line = ; - close(FILE); - chop($line); - $line; -} - -sub read_logfile { - local(@text); - local($filename, $leader) = @_; - - open(FILE, "<$filename"); - while () { - chop; - push(@text, $leader.$_); - } - close(FILE); - @text; -} - -sub build_header { - local($header); - local($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); - $header = sprintf("CVSROOT:\t%s\nModule name:\t%s\nRepository:\t%s\nChanges by:\t%s@%s\t%02d/%02d/%02d %02d:%02d:%02d", - $cvsroot, - $modulename, - $dir, - $login, $hostdomain, - $year%100, $mon+1, $mday, - $hour, $min, $sec); -} - -sub mail_notification { - local(@text) = @_; - - # if only we had strftime()... stuff stolen from perl's ctime.pl: - local($[) = 0; - - @DoW = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); - @MoY = ('Jan','Feb','Mar','Apr','May','Jun', - 'Jul','Aug','Sep','Oct','Nov','Dec'); - - # Determine what time zone is in effect. - # Use GMT if TZ is defined as null, local time if TZ undefined. - # There's no portable way to find the system default timezone. - # - $TZ = defined($ENV{'TZ'}) ? ( $ENV{'TZ'} ? $ENV{'TZ'} : 'GMT' ) : ''; - - # Hack to deal with 'PST8PDT' format of TZ - # Note that this can't deal with all the esoteric forms, but it - # does recognize the most common: [:]STDoff[DST[off][,rule]] - # - if ($TZ =~ /^([^:\d+\-,]{3,})([+-]?\d{1,2}(:\d{1,2}){0,2})([^\d+\-,]{3,})?/) { - $TZ = $isdst ? $4 : $1; - $tzoff = sprintf("%05d", -($2) * 100); - } - - # perl-4.036 doesn't have the $zone or $gmtoff... - ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst, $zone, $gmtoff) = - ($TZ eq 'GMT') ? gmtime(time) : localtime(time); - - $year += ($year < 70) ? 2000 : 1900; - - if ($gmtoff != 0) { - $tzoff = sprintf("%05d", ($gmtoff / 60) * 100); - } - if ($zone ne '') { - $TZ = $zone; - } - - # ok, let's try.... - $rfc822date = sprintf("%s, %2d %s %4d %2d:%02d:%02d %s (%s)", - $DoW[$wday], $mday, $MoY[$mon], $year, - $hour, $min, $sec, $tzoff, $TZ); - - open(MAIL, "| $MAILER"); - print MAIL "Date: " . $rfc822date . "\n"; - print MAIL "Subject: CVS Update: " . $modulename . "\n"; - print MAIL "To: " . $mailto . "\n"; - print MAIL "Reply-To: " . $replyto . "\n"; - print MAIL "\n"; - print MAIL join("\n", @text), "\n"; - close(MAIL); -} - -sub write_commitlog { - local($logfile, @text) = @_; - - open(FILE, ">>$logfile"); - print FILE join("\n", @text), "\n"; - close(FILE); -} - -# -# Main Body -# - -# Initialize basic variables -# -$debug = 0; -$id = getpgrp(); # note, you *must* use a shell which does setpgrp() -$state = $STATE_NONE; -chop($hostname = `hostname`); -chop($domainname = `domainname`); -if ($domainname !~ '^\..*') { - $domainname = '.' . $domainname; -} -$hostdomain = $hostname . $domainname; -$cvsroot = $ENV{'CVSROOT'}; -$do_status = 1; # moderately useful -$show_wd = 0; # useless in client/server -$modulename = ""; - -# parse command line arguments (file list is seen as one arg) -# -while (@ARGV) { - $arg = shift @ARGV; - - if ($arg eq '-d') { - $debug = 1; - print STDERR "Debug turned on...\n"; - } elsif ($arg eq '-m') { - if ($mailto eq '') { - $mailto = shift @ARGV; - } else { - $mailto = $mailto . ", " . shift @ARGV; - } - } elsif ($arg eq '-R') { - if ($replyto eq '') { - $replyto = shift @ARGV; - } else { - $replyto = $replyto . ", " . shift @ARGV; - } - } elsif ($arg eq '-M') { - $modulename = shift @ARGV; - } elsif ($arg eq '-u') { - $login = shift @ARGV; - } elsif ($arg eq '-s') { - $do_status = 0; - } elsif ($arg eq '-w') { - $show_wd = 1; - } elsif ($arg eq '-f') { - ($commitlog) && die("Too many '-f' args\n"); - $commitlog = shift @ARGV; - } else { - ($donefiles) && die("Too many arguments! Check usage.\n"); - $donefiles = 1; - @files = split(/ /, $arg); - } -} -if ($login eq '') { - $login = getlogin || (getpwuid($<))[0] || "nobody"; -} -($mailto) || die("No mail recipient specified (use -m)\n"); -if ($replyto eq '') { - $replyto = $login; -} - -# for now, the first "file" is the repository directory being committed, -# relative to the $CVSROOT location -# -@path = split('/', $files[0]); - -# XXX There are some ugly assumptions in here about module names and -# XXX directories relative to the $CVSROOT location -- really should -# XXX read $CVSROOT/CVSROOT/modules, but that's not so easy to do, since -# XXX we have to parse it backwards. -# XXX -# XXX Fortunately it's relatively easy for the user to specify the -# XXX module name as appropriate with a '-M' via the directory -# XXX matching in loginfo. -# -if ($modulename eq "") { - $modulename = $path[0]; # I.e. the module name == top-level dir -} -if ($#path == 0) { - $dir = "."; -} else { - $dir = join('/', @path); -} -$dir = $dir . "/"; - -if ($debug) { - print STDERR "module - ", $modulename, "\n"; - print STDERR "dir - ", $dir, "\n"; - print STDERR "path - ", join(":", @path), "\n"; - print STDERR "files - ", join(":", @files), "\n"; - print STDERR "id - ", $id, "\n"; -} - -# Check for a new directory first. This appears with files set as follows: -# -# files[0] - "path/name/newdir" -# files[1] - "-" -# files[2] - "New" -# files[3] - "directory" -# -if ($files[2] =~ /New/ && $files[3] =~ /directory/) { - local(@text); - - @text = (); - push(@text, &build_header()); - push(@text, ""); - push(@text, $files[0]); - push(@text, ""); - - while () { - chop; # Drop the newline - push(@text, $_); - } - - &mail_notification($mailto, @text); - - exit 0; -} - -# Check for an import command. This appears with files set as follows: -# -# files[0] - "path/name" -# files[1] - "-" -# files[2] - "Imported" -# files[3] - "sources" -# -if ($files[2] =~ /Imported/ && $files[3] =~ /sources/) { - local(@text); - - @text = (); - push(@text, &build_header()); - push(@text, ""); - push(@text, $files[0]); - push(@text, ""); - - while () { - chop; # Drop the newline - push(@text, $_); - } - - &mail_notification(@text); - - exit 0; -} - -# Iterate over the body of the message collecting information. -# -while () { - chop; # Drop the newline - - if (/^In directory/) { - if ($show_wd) { # useless in client/server mode - push(@log_lines, $_); - push(@log_lines, ""); - } - next; - } - - if (/^Modified Files/) { $state = $STATE_CHANGED; next; } - if (/^Added Files/) { $state = $STATE_ADDED; next; } - if (/^Removed Files/) { $state = $STATE_REMOVED; next; } - if (/^Log Message/) { $state = $STATE_LOG; next; } - - s/^[ \t\n]+//; # delete leading whitespace - s/[ \t\n]+$//; # delete trailing whitespace - - if ($state == $STATE_CHANGED) { push(@changed_files, split); } - if ($state == $STATE_ADDED) { push(@added_files, split); } - if ($state == $STATE_REMOVED) { push(@removed_files, split); } - if ($state == $STATE_LOG) { push(@log_lines, $_); } -} - -# Strip leading and trailing blank lines from the log message. Also -# compress multiple blank lines in the body of the message down to a -# single blank line. -# -while ($#log_lines > -1) { - last if ($log_lines[0] ne ""); - shift(@log_lines); -} -while ($#log_lines > -1) { - last if ($log_lines[$#log_lines] ne ""); - pop(@log_lines); -} -for ($i = $#log_lines; $i > 0; $i--) { - if (($log_lines[$i - 1] eq "") && ($log_lines[$i] eq "")) { - splice(@log_lines, $i, 1); - } -} - -if ($debug) { - print STDERR "Searching for log file index..."; -} -# Find an index to a log file that matches this log message -# -for ($i = 0; ; $i++) { - local(@text); - - last if (! -e "$LOG_FILE.$i.$id"); # the next available one - @text = &read_logfile("$LOG_FILE.$i.$id", ""); - last if ($#text == -1); # nothing in this file, use it - last if (join(" ", @log_lines) eq join(" ", @text)); # it's the same log message as another -} -if ($debug) { - print STDERR " found log file at $i.$id, now writing tmp files.\n"; -} - -# Spit out the information gathered in this pass. -# -&append_names_to_file("$CHANGED_FILE.$i.$id", $dir, @changed_files); -&append_names_to_file("$ADDED_FILE.$i.$id", $dir, @added_files); -&append_names_to_file("$REMOVED_FILE.$i.$id", $dir, @removed_files); -&write_logfile("$LOG_FILE.$i.$id", @log_lines); - -# Check whether this is the last directory. If not, quit. -# -if ($debug) { - print STDERR "Checking current dir against last dir.\n"; -} -$_ = &read_line("$LAST_FILE.$id"); - -if ($_ ne $cvsroot . "/" . $files[0]) { - if ($debug) { - print STDERR sprintf("Current directory %s is not last directory %s.\n", $cvsroot . "/" .$files[0], $_); - } - exit 0; -} -if ($debug) { - print STDERR sprintf("Current directory %s is last directory %s -- all commits done.\n", $files[0], $_); -} - -# -# End Of Commits! -# - -# This is it. The commits are all finished. Lump everything together -# into a single message, fire a copy off to the mailing list, and drop -# it on the end of the Changes file. -# - -# -# Produce the final compilation of the log messages -# -@text = (); -@status_txt = (); -push(@text, &build_header()); -push(@text, ""); - -for ($i = 0; ; $i++) { - last if (! -e "$LOG_FILE.$i.$id"); # we're done them all! - @lines = &read_logfile("$CHANGED_FILE.$i.$id", ""); - if ($#lines >= 0) { - push(@text, "Modified files:"); - push(@text, &format_lists(@lines)); - } - @lines = &read_logfile("$ADDED_FILE.$i.$id", ""); - if ($#lines >= 0) { - push(@text, "Added files:"); - push(@text, &format_lists(@lines)); - } - @lines = &read_logfile("$REMOVED_FILE.$i.$id", ""); - if ($#lines >= 0) { - push(@text, "Removed files:"); - push(@text, &format_lists(@lines)); - } - if ($#text >= 0) { - push(@text, ""); - } - @lines = &read_logfile("$LOG_FILE.$i.$id", "\t"); - if ($#lines >= 0) { - push(@text, "Log message:"); - push(@text, @lines); - push(@text, ""); - } - if ($do_status) { - local(@changed_files); - - @changed_files = (); - push(@changed_files, &read_logfile("$CHANGED_FILE.$i.$id", "")); - push(@changed_files, &read_logfile("$ADDED_FILE.$i.$id", "")); - push(@changed_files, &read_logfile("$REMOVED_FILE.$i.$id", "")); - - if ($debug) { - print STDERR "main: pre-sort changed_files = ", join(":", @changed_files), ".\n"; - } - sort(@changed_files); - if ($debug) { - print STDERR "main: post-sort changed_files = ", join(":", @changed_files), ".\n"; - } - - foreach $dofile (@changed_files) { - if ($dofile =~ /\/$/) { - next; # ignore the silly "dir" entries - } - if ($debug) { - print STDERR "main(): doing 'cvs -nQq status -v $dofile'\n"; - } - open(STATUS, "-|") || exec 'cvs', '-nQq', 'status', '-v', $dofile; - while () { - chop; - push(@status_txt, $_); - } - } - } -} - -# Write to the commitlog file -# -if ($commitlog) { - &write_commitlog($commitlog, @text); -} - -if ($#status_txt >= 0) { - push(@text, @status_txt); -} - -# Mailout the notification. -# -&mail_notification(@text); - -# cleanup -# -if (! $debug) { - &cleanup_tmpfiles(); -} - -exit 0; diff --git a/lib/cvs/contrib/mfpipe b/lib/cvs/contrib/mfpipe deleted file mode 100644 index 6dd18c4d..00000000 --- a/lib/cvs/contrib/mfpipe +++ /dev/null @@ -1,85 +0,0 @@ -#! /bin/perl -# -*-Perl-*- -# -# From: clyne@niwot.scd.ucar.EDU (John Clyne) -# Date: Fri, 28 Feb 92 09:54:21 MST -# -# BTW, i wrote a perl script that is similar to 'nfpipe' except that in -# addition to logging to a file it provides a command line option for mailing -# change notices to a group of users. Obviously you probably wouldn't want -# to mail every change. But there may be certain directories that are commonly -# accessed by a group of users who would benefit from an email notice. -# Especially if they regularly beat on the same directory. Anyway if you -# think anyone would be interested here it is. -# -# File: mfpipe -# -# Author: John Clyne -# National Center for Atmospheric Research -# PO 3000, Boulder, Colorado -# -# Date: Wed Feb 26 18:34:53 MST 1992 -# -# Description: Tee standard input to mail a list of users and to -# a file. Used by CVS logging. -# -# Usage: mfpipe [-f file] [user@host...] -# -# Environment: CVSROOT -# Path to CVS root. -# -# Files: -# -# -# Options: -f file -# Capture output to 'file' -# - -$header = "Log Message:\n"; - -$mailcmd = "| mail -s 'CVS update notice'"; -$whoami = `whoami`; -chop $whoami; -$date = `date`; -chop $date; - -$cvsroot = $ENV{'CVSROOT'}; - -while (@ARGV) { - $arg = shift @ARGV; - - if ($arg eq '-f') { - $file = shift @ARGV; - } - else { - $users = "$users $arg"; - } -} - -if ($users) { - $mailcmd = "$mailcmd $users"; - open(MAIL, $mailcmd) || die "Execing $mail: $!\n"; -} - -if ($file) { - $logfile = "$cvsroot/LOG/$file"; - open(FILE, ">> $logfile") || die "Opening $logfile: $!\n"; -} - -print FILE "$whoami $date--------BEGIN LOG ENTRY-------------\n" if ($logfile); - -while (<>) { - print FILE $log if ($log && $logfile); - - print FILE $_ if ($logfile); - print MAIL $_ if ($users); - - $log = "log: " if ($_ eq $header); -} - -close FILE; -die "Write failed" if $?; -close MAIL; -die "Mail failed" if $?; - -exit 0; diff --git a/lib/cvs/contrib/rcs-to-cvs b/lib/cvs/contrib/rcs-to-cvs deleted file mode 100644 index 66a62a9d..00000000 --- a/lib/cvs/contrib/rcs-to-cvs +++ /dev/null @@ -1,184 +0,0 @@ -#! /bin/sh -# -# Based on the CVS 1.0 checkin csh script. -# Contributed by Per Cederqvist . -# Rewritten in sh by David MacKenzie . -# -# Copyright (c) 1989, Brian Berliner -# -# You may distribute under the terms of the GNU General Public License. -# -############################################################################# -# -# Check in sources that previously were under RCS or no source control system. -# -# The repository is the directory where the sources should be deposited. -# -# Traverses the current directory, ensuring that an -# identical directory structure exists in the repository directory. It -# then checks the files in in the following manner: -# -# 1) If the file doesn't yet exist, check it in as revision 1.1 -# -# The script also is somewhat verbose in letting the user know what is -# going on. It prints a diagnostic when it creates a new file, or updates -# a file that has been modified on the trunk. -# -# Bugs: doesn't put the files in branch 1.1.1 -# doesn't put in release and vendor tags -# -############################################################################# - -usage="Usage: rcs-to-cvs [-v] [-m message] [-f message_file] repository" -vbose=0 -message="" -if [ -d /var/tmp ]; then message_file=/var/tmp/checkin.$$; else message_file=/usr/tmp/checkin.$$; fi -got_one=0 - -if [ $# -lt 1 ]; then - echo "$usage" >&2 - exit 1 -fi - -while [ $# -ne 0 ]; do - case "$1" in - -v) - vbose=1 - ;; - -m) - shift - echo $1 > $message_file - got_one=1 - ;; - -f) - shift - message_file=$1 - got_one=2 - ;; - *) - break - esac - shift -done - -if [ $# -lt 1 ]; then - echo "$usage" >&2 - exit 1 -fi - -repository=$1 -shift - -if [ -z "$CVSROOT" ]; then - echo "Please the environmental variable CVSROOT to the root" >&2 - echo " of the tree you wish to update" >&2 - exit 1 -fi - -if [ $got_one -eq 0 ]; then - echo "Please Edit this file to contain the RCS log information" >$message_file - echo "to be associated with this directory (please remove these lines)">>$message_file - ${EDITOR-vi} $message_file - got_one=1 -fi - -# Ya gotta share. -umask 0 - -update_dir=${CVSROOT}/${repository} -[ ! -d ${update_dir} ] && mkdir $update_dir - -if [ -d SCCS ]; then - echo SCCS files detected! >&2 - exit 1 -fi -if [ -d RCS ]; then - co RCS/* -fi - -for name in * .[a-zA-Z0-9]* -do - case "$name" in - RCS | *~ | \* | .\[a-zA-Z0-9\]\* ) continue ;; - esac - echo $name - if [ $vbose -ne 0 ]; then - echo "Updating ${repository}/${name}" - fi - if [ -d "$name" ]; then - if [ ! -d "${update_dir}/${name}" ]; then - echo "WARNING: Creating new directory ${repository}/${name}" - mkdir "${update_dir}/${name}" - if [ $? -ne 0 ]; then - echo "ERROR: mkdir failed - aborting" >&2 - exit 1 - fi - fi - cd "$name" - if [ $? -ne 0 ]; then - echo "ERROR: Couldn\'t cd to $name - aborting" >&2 - exit 1 - fi - if [ $vbose -ne 0 ]; then - $0 -v -f $message_file "${repository}/${name}" - else - $0 -f $message_file "${repository}/${name}" - fi - if [ $? -ne 0 ]; then - exit 1 - fi - cd .. - else # if not directory - if [ ! -f "$name" ]; then - echo "WARNING: $name is neither a regular file" - echo " nor a directory - ignored" - continue - fi - file="${update_dir}/${name},v" - comment="" - if grep -s '\$Log.*\$' "${name}"; then # If $Log keyword - myext=`echo $name | sed 's,.*\.,,'` - [ "$myext" = "$name" ] && myext= - case "$myext" in - c | csh | e | f | h | l | mac | me | mm | ms | p | r | red | s | sh | sl | cl | ml | el | tex | y | ye | yr | "" ) - ;; - - * ) - echo "For file ${file}:" - grep '\$Log.*\$' "${name}" - echo -n "Please insert a comment leader for file ${name} > " - read comment - ;; - esac - fi - if [ ! -f "$file" ]; then # If not exists in repository - if [ ! -f "${update_dir}/Attic/${name},v" ]; then - echo "WARNING: Creating new file ${repository}/${name}" - if [ -f RCS/"${name}",v ]; then - echo "MSG: Copying old rcs file." - cp RCS/"${name}",v "$file" - else - if [ -n "${comment}" ]; then - rcs -q -i -c"${comment}" -t${message_file} -m'.' "$file" - fi - ci -q -u1.1 -t${message_file} -m'.' "$file" - if [ $? -ne 0 ]; then - echo "ERROR: Initial check-in of $file failed - aborting" >&2 - exit 1 - fi - fi - else - file="${update_dir}/Attic/${name},v" - echo "WARNING: IGNORED: ${repository}/Attic/${name}" - continue - fi - else # File existed - echo "ERROR: File exists in repository: Ignored: $file" - continue - fi - fi -done - -[ $got_one -eq 1 ] && rm -f $message_file - -exit 0 diff --git a/lib/cvs/contrib/rcs2log b/lib/cvs/contrib/rcs2log deleted file mode 100644 index bc663d84..00000000 --- a/lib/cvs/contrib/rcs2log +++ /dev/null @@ -1,677 +0,0 @@ -#! /bin/sh - -# RCS to ChangeLog generator - -# Generate a change log prefix from RCS files (perhaps in the CVS repository) -# and the ChangeLog (if any). -# Output the new prefix to standard output. -# You can edit this prefix by hand, and then prepend it to ChangeLog. - -# Ignore log entries that start with `#'. -# Clump together log entries that start with `{topic} ', -# where `topic' contains neither white space nor `}'. - -Help='The default FILEs are the files registered under the working directory. -Options: - - -c CHANGELOG Output a change log prefix to CHANGELOG (default ChangeLog). - -h HOSTNAME Use HOSTNAME in change log entries (default current host). - -i INDENT Indent change log lines by INDENT spaces (default 8). - -l LENGTH Try to limit log lines to LENGTH characters (default 79). - -R If no FILEs are given and RCS is used, recurse through working directory. - -r OPTION Pass OPTION to subsidiary log command. - -t TABWIDTH Tab stops are every TABWIDTH characters (default 8). - -u "LOGINFULLNAMEMAILADDR" Assume LOGIN has FULLNAME and MAILADDR. - -v Append RCS revision to file names in log lines. - --help Output help. - --version Output version number. - -Report bugs to .' - -Id='$Id: rcs2log,v 1.45 1998/08/12 22:33:01 eggert Exp $' - -# Copyright 1992, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING. If not, write to the -# Free Software Foundation, Inc., 59 Temple Place - Suite 330, -# Boston, MA 02111-1307, USA. - -Copyright='Copyright 1998 Free Software Foundation, Inc. -This program comes with NO WARRANTY, to the extent permitted by law. -You may redistribute copies of this program -under the terms of the GNU General Public License. -For more information about these matters, see the files named COPYING. -Author: Paul Eggert ' - -tab=' ' -nl=' -' - -# Parse options. - -# defaults -: ${AWK=awk} -: ${TMPDIR=/tmp} -changelog=ChangeLog # change log file name -datearg= # rlog date option -hostname= # name of local host (if empty, will deduce it later) -indent=8 # indent of log line -length=79 # suggested max width of log line -logins= # login names for people we know fullnames and mailaddrs of -loginFullnameMailaddrs= # loginfullnamemailaddr triplets -logTZ= # time zone for log dates (if empty, use local time) -recursive= # t if we want recursive rlog -revision= # t if we want revision numbers -rlog_options= # options to pass to rlog -tabwidth=8 # width of horizontal tab - -while : -do - case $1 in - -c) changelog=${2?}; shift;; - -i) indent=${2?}; shift;; - -h) hostname=${2?}; shift;; - -l) length=${2?}; shift;; - -[nu]) # -n is obsolescent; it is replaced by -u. - case $1 in - -n) case ${2?}${3?}${4?} in - *"$tab"* | *"$nl"*) - echo >&2 "$0: -n '$2' '$3' '$4': tabs, newlines not allowed" - exit 1 - esac - case $loginFullnameMailaddrs in - '') loginFullnameMailaddrs=$2$tab$3$tab$4;; - ?*) loginFullnameMailaddrs=$loginFullnameMailaddrs$nl$2$tab$3$tab$4 - esac - shift; shift; shift;; - -u) - # If $2 is not tab-separated, use colon for separator. - case ${2?} in - *"$nl"*) - echo >&2 "$0: -u '$2': newlines not allowed" - exit 1;; - *"$tab"*) - t=$tab;; - *) - t=: - esac - case $2 in - *"$t"*"$t"*"$t"*) - echo >&2 "$0: -u '$2': too many fields" - exit 1;; - *"$t"*"$t"*) - ;; - *) - echo >&2 "$0: -u '$2': not enough fields" - exit 1 - esac - case $loginFullnameMailaddrs in - '') loginFullnameMailaddrs=$2;; - ?*) loginFullnameMailaddrs=$loginFullnameMailaddrs$nl$2 - esac - shift - esac - case $logins in - '') logins=$login;; - ?*) logins=$logins$nl$login - esac - ;; - -r) - case $rlog_options in - '') rlog_options=${2?};; - ?*) rlog_options=$rlog_options$nl${2?} - esac - shift;; - -R) recursive=t;; - -t) tabwidth=${2?}; shift;; - -v) revision=t;; - --version) - set $Id - rcs2logVersion=$3 - echo >&2 "rcs2log (GNU Emacs) $rcs2logVersion$nl$Copyright" - exit 0;; - -*) echo >&2 "Usage: $0 [OPTION]... [FILE ...]$nl$Help" - case $1 in - --help) exit 0;; - *) exit 1 - esac;; - *) break - esac - shift -done - -month_data=' - m[0]="Jan"; m[1]="Feb"; m[2]="Mar" - m[3]="Apr"; m[4]="May"; m[5]="Jun" - m[6]="Jul"; m[7]="Aug"; m[8]="Sep" - m[9]="Oct"; m[10]="Nov"; m[11]="Dec" -' - - -# Put rlog output into $rlogout. - -# If no rlog options are given, -# log the revisions checked in since the first ChangeLog entry. -# Since ChangeLog is only by date, some of these revisions may be duplicates of -# what's already in ChangeLog; it's the user's responsibility to remove them. -case $rlog_options in -'') - if test -s "$changelog" - then - e=' - /^[0-9]+-[0-9][0-9]-[0-9][0-9]/{ - # ISO 8601 date - print $1 - exit - } - /^... ... [ 0-9][0-9] [ 0-9][0-9]:[0-9][0-9]:[0-9][0-9] [0-9]+ /{ - # old-fashioned date and time (Emacs 19.31 and earlier) - '"$month_data"' - year = $5 - for (i=0; i<=11; i++) if (m[i] == $2) break - dd = $3 - printf "%d-%02d-%02d\n", year, i+1, dd - exit - } - ' - d=`$AWK "$e" <"$changelog"` || exit - case $d in - ?*) datearg="-d>$d" - esac - fi -esac - -# Use TZ specified by ChangeLog local variable, if any. -if test -s "$changelog" -then - extractTZ=' - /^.*change-log-time-zone-rule['"$tab"' ]*:['"$tab"' ]*"\([^"]*\)".*/{ - s//\1/; p; q - } - /^.*change-log-time-zone-rule['"$tab"' ]*:['"$tab"' ]*t.*/{ - s//UTC0/; p; q - } - ' - logTZ=`tail "$changelog" | sed -n "$extractTZ"` - case $logTZ in - ?*) TZ=$logTZ; export TZ - esac -fi - -# If CVS is in use, examine its repository, not the normal RCS files. -if test ! -f CVS/Repository -then - rlog=rlog - repository= -else - rlog='cvs -q log' - repository=`sed 1q &2 "$0: $repository: bad repository (see CVS/Repository)" - exit 1 - fi - esac -fi - -# Use $rlog's -zLT option, if $rlog supports it. -case `$rlog -zLT 2>&1` in -*' option'*) ;; -*) - case $rlog_options in - '') rlog_options=-zLT;; - ?*) rlog_options=-zLT$nl$rlog_options - esac -esac - -# With no arguments, examine all files under the RCS directory. -case $# in -0) - case $repository in - '') - oldIFS=$IFS - IFS=$nl - case $recursive in - t) - RCSdirs=`find . -name RCS -type d -print` - filesFromRCSfiles='s|,v$||; s|/RCS/|/|; s|^\./||' - files=` - { - case $RCSdirs in - ?*) find $RCSdirs \ - -type f \ - ! -name '*_' \ - ! -name ',*,' \ - ! -name '.*_' \ - ! -name .rcsfreeze.log \ - ! -name .rcsfreeze.ver \ - -print - esac - find . -name '*,v' -print - } | - sort -u | - sed "$filesFromRCSfiles" - `;; - *) - files= - for file in RCS/.* RCS/* .*,v *,v - do - case $file in - RCS/. | RCS/.. | RCS/,*, | RCS/*_) continue;; - RCS/.rcsfreeze.log | RCS/.rcsfreeze.ver) continue;; - RCS/.\* | RCS/\* | .\*,v | \*,v) test -f "$file" || continue;; - RCS/*,v | RCS/.*,v) ;; - RCS/* | RCS/.*) test -f "$file" || continue - esac - case $files in - '') files=$file;; - ?*) files=$files$nl$file - esac - done - case $files in - '') exit 0 - esac - esac - set x $files - shift - IFS=$oldIFS - esac -esac - -llogout=$TMPDIR/rcs2log$$l -rlogout=$TMPDIR/rcs2log$$r -trap exit 1 2 13 15 -trap "rm -f $llogout $rlogout; exit 1" 0 - -case $datearg in -?*) $rlog $rlog_options "$datearg" ${1+"$@"} >$rlogout;; -'') $rlog $rlog_options ${1+"$@"} >$rlogout -esac || exit - - -# Get the full name of each author the logs mention, and set initialize_fullname -# to awk code that initializes the `fullname' awk associative array. -# Warning: foreign authors (i.e. not known in the passwd file) are mishandled; -# you have to fix the resulting output by hand. - -initialize_fullname= -initialize_mailaddr= - -case $loginFullnameMailaddrs in -?*) - case $loginFullnameMailaddrs in - *\"* | *\\*) - sed 's/["\\]/\\&/g' >$llogout <$llogout </dev/null | - $AWK -F: "$awkscript" - `$initialize_fullname -esac - - -# Function to print a single log line. -# We don't use awk functions, to stay compatible with old awk versions. -# `Log' is the log message (with \n replaced by \001). -# `files' contains the affected files. -printlogline='{ - - # Following the GNU coding standards, rewrite - # * file: (function): comment - # to - # * file (function): comment - if (Log ~ /^\([^)]*\): /) { - i = index(Log, ")") - files = files " " substr(Log, 1, i) - Log = substr(Log, i+3) - } - - # If "label: comment" is too long, break the line after the ":". - sep = " " - if ('"$length"' <= '"$indent"' + 1 + length(files) + index(Log, SOH)) sep = "\n" indent_string - - # Print the label. - printf "%s*%s:", indent_string, files - - # Print each line of the log, transliterating \001 to \n. - while ((i = index(Log, SOH)) != 0) { - logline = substr(Log, 1, i-1) - if (logline ~ /[^'"$tab"' ]/) { - printf "%s%s\n", sep, logline - } else { - print "" - } - sep = indent_string - Log = substr(Log, i+1) - } -}' - -# Pattern to match the `revision' line of rlog output. -rlog_revision_pattern='^revision [0-9]+\.[0-9]+(\.[0-9]+\.[0-9]+)*(['"$tab"' ]+locked by: [^'"$tab"' $,.0-9:;@]*[^'"$tab"' $,:;@][^'"$tab"' $,.0-9:;@]*;)?['"$tab"' ]*$' - -case $hostname in -'') - hostname=`( - hostname || uname -n || uuname -l || cat /etc/whoami - ) 2>/dev/null` || { - echo >&2 "$0: cannot deduce hostname" - exit 1 - } - - case $hostname in - *.*) ;; - *) - domainname=`(domainname) 2>/dev/null` && - case $domainname in - *.*) hostname=$hostname.$domainname - esac - esac -esac - - -# Process the rlog output, generating ChangeLog style entries. - -# First, reformat the rlog output so that each line contains one log entry. -# Transliterate \n to \001 so that multiline entries fit on a single line. -# Discard irrelevant rlog output. -$AWK <$rlogout ' - BEGIN { repository = "'"$repository"'" } - /^RCS file:/ { - if (repository != "") { - filename = $3 - if (substr(filename, 1, length(repository) + 1) == repository "/") { - filename = substr(filename, length(repository) + 2) - } - if (filename ~ /,v$/) { - filename = substr(filename, 1, length(filename) - 2) - } - if (filename ~ /(^|\/)Attic\/[^\/]*$/) { - i = length(filename) - while (substr(filename, i, 1) != "/") i-- - filename = substr(filename, 1, i - 6) substr(filename, i + 1) - } - } - rev = "?" - } - /^Working file:/ { if (repository == "") filename = $3 } - /'"$rlog_revision_pattern"'/, /^(-----------*|===========*)$/ { - line = $0 - if (line ~ /'"$rlog_revision_pattern"'/) { - rev = $2 - next - } - if (line ~ /^date: [0-9][- +\/0-9:]*;/) { - date = $2 - if (date ~ /\//) { - # This is a traditional RCS format date YYYY/MM/DD. - # Replace "/"s with "-"s to get ISO format. - newdate = "" - while ((i = index(date, "/")) != 0) { - newdate = newdate substr(date, 1, i-1) "-" - date = substr(date, i+1) - } - date = newdate date - } - time = substr($3, 1, length($3) - 1) - author = substr($5, 1, length($5)-1) - printf "%s %s %s %s %s %c", filename, rev, date, time, author, 1 - rev = "?" - next - } - if (line ~ /^branches: /) { next } - if (line ~ /^(-----------*|===========*)$/) { print ""; next } - if (line == "Initial revision" || line ~ /^file .+ was initially added on branch .+\.$/) { - line = "New file." - } - printf "%s%c", line, 1 - } -' | - -# Now each line is of the form -# FILENAME REVISION YYYY-MM-DD HH:MM:SS[+-TIMEZONE] AUTHOR \001LOG -# where \001 stands for a carriage return, -# and each line of the log is terminated by \001 instead of \n. -# Sort the log entries, first by date+time (in reverse order), -# then by author, then by log entry, and finally by file name and revision -# (just in case). -sort +2 -4r +4 +0 | - -# Finally, reformat the sorted log entries. -$AWK ' - BEGIN { - logTZ = "'"$logTZ"'" - revision = "'"$revision"'" - - # Some awk variants do not understand "\001", so we have to - # put the char directly in the file. - SOH="" # <-- There is a single SOH (octal code 001) here. - - # Initialize the fullname and mailaddr associative arrays. - '"$initialize_fullname"' - '"$initialize_mailaddr"' - - # Initialize indent string. - indent_string = "" - i = '"$indent"' - if (0 < '"$tabwidth"') - for (; '"$tabwidth"' <= i; i -= '"$tabwidth"') - indent_string = indent_string "\t" - while (1 <= i--) - indent_string = indent_string " " - } - - { - newlog = substr($0, 1 + index($0, SOH)) - - # Ignore log entries prefixed by "#". - if (newlog ~ /^#/) { next } - - if (Log != newlog || date != $3 || author != $5) { - - # The previous log and this log differ. - - # Print the old log. - if (date != "") '"$printlogline"' - - # Logs that begin with "{clumpname} " should be grouped together, - # and the clumpname should be removed. - # Extract the new clumpname from the log header, - # and use it to decide whether to output a blank line. - newclumpname = "" - sep = "\n" - if (date == "") sep = "" - if (newlog ~ /^\{[^'"$tab"' }]*}['"$tab"' ]/) { - i = index(newlog, "}") - newclumpname = substr(newlog, 1, i) - while (substr(newlog, i+1) ~ /^['"$tab"' ]/) i++ - newlog = substr(newlog, i+1) - if (clumpname == newclumpname) sep = "" - } - printf sep - clumpname = newclumpname - - # Get ready for the next log. - Log = newlog - if (files != "") - for (i in filesknown) - filesknown[i] = 0 - files = "" - } - if (date != $3 || author != $5) { - # The previous date+author and this date+author differ. - # Print the new one. - date = $3 - time = $4 - author = $5 - - zone = "" - if (logTZ && ((i = index(time, "-")) || (i = index(time, "+")))) - zone = " " substr(time, i) - - # Print "date[ timezone] fullname ". - # Get fullname and email address from associative arrays; - # default to author and author@hostname if not in arrays. - if (fullname[author]) - auth = fullname[author] - else - auth = author - printf "%s%s %s ", date, zone, auth - if (mailaddr[author]) - printf "<%s>\n\n", mailaddr[author] - else - printf "<%s@%s>\n\n", author, "'"$hostname"'" - } - if (! filesknown[$1]) { - filesknown[$1] = 1 - if (files == "") files = " " $1 - else files = files ", " $1 - if (revision && $2 != "?") files = files " " $2 - } - } - END { - # Print the last log. - if (date != "") { - '"$printlogline"' - printf "\n" - } - } -' && - - -# Exit successfully. - -exec rm -f $llogout $rlogout - -# Local Variables: -# tab-width:4 -# End: diff --git a/lib/cvs/contrib/rcslock b/lib/cvs/contrib/rcslock deleted file mode 100644 index 0f7664c4..00000000 --- a/lib/cvs/contrib/rcslock +++ /dev/null @@ -1,235 +0,0 @@ -#! /bin/perl -# -*-Perl-*- - -# Author: John Rouillard (rouilj@cs.umb.edu) -# Supported: Yeah right. (Well what do you expect for 2 hours work?) -# Blame-to: rouilj@cs.umb.edu -# Complaints to: Anybody except Brian Berliner, he's blameless for -# this script. -# Acknowlegements: The base code for this script has been acquired -# from the log.pl script. - -# rcslock.pl - A program to prevent commits when a file to be ckecked -# in is locked in the repository. - -# There are times when you need exclusive access to a file. This -# often occurs when binaries are checked into the repository, since -# cvs's (actually rcs's) text based merging mechanism won't work. This -# script allows you to use the rcs lock mechanism (rcs -l) to make -# sure that no changes to a repository are able to be committed if -# those changes would result in a locked file being changed. - -# WARNING: -# This script will work only if locking is set to strict. -# - -# Setup: -# Add the following line to the commitinfo file: - -# ALL /local/location/for/script/lockcheck [options] - -# Where ALL is replaced by any suitable regular expression. -# Options are -v for verbose info, or -d for debugging info. -# The %s will provide the repository directory name and the names of -# all changed files. - -# Use: -# When a developer needs exclusive access to a version of a file, s/he -# should use "rcs -l" in the repository tree to lock the version they -# are working on. CVS will automagically release the lock when the -# commit is performed. - -# Method: -# An "rlog -h" is exec'ed to give info on all about to be -# committed files. This (header) information is parsed to determine -# if any locks are outstanding and what versions of the file are -# locked. This filename, version number info is used to index an -# associative array. All of the files to be committed are checked to -# see if any locks are outstanding. If locks are outstanding, the -# version number of the current file (taken from the CVS/Entries -# subdirectory) is used in the key to determine if that version is -# locked. If the file being checked in is locked by the person doing -# the checkin, the commit is allowed, but if the lock is held on that -# version of a file by another person, the commit is not allowed. - -$ext = ",v"; # The extension on your rcs files. - -$\="\n"; # I hate having to put \n's at the end of my print statements -$,=' '; # Spaces should occur between arguments to print when printed - -# turn off setgid -# -$) = $(; - -# -# parse command line arguments -# -require 'getopts.pl'; - -&Getopts("vd"); # verbose or debugging - -# Verbose is useful when debugging -$opt_v = $opt_d if defined $opt_d; - -# $files[0] is really the name of the subdirectory. -# @files = split(/ /,$ARGV[0]); -@files = @ARGV[0..$#ARGV]; -$cvsroot = $ENV{'CVSROOT'}; - -# -# get login name -# -$login = getlogin || (getpwuid($<))[0] || "nobody"; - -# -# save the current directory since we have to return here to parse the -# CVS/Entries file if a lock is found. -# -$pwd = `/bin/pwd`; -chop $pwd; - -print "Starting directory is $pwd" if defined $opt_d ; - -# -# cd to the repository directory and check on the files. -# -print "Checking directory ", $files[0] if defined $opt_v ; - -if ( $files[0] =~ /^\// ) -{ - print "Directory path is $files[0]" if defined $opt_d ; - chdir $files[0] || die "Can't change to repository directory $files[0]" ; -} -else -{ - print "Directory path is $cvsroot/$files[0]" if defined $opt_d ; - chdir ($cvsroot . "/" . $files[0]) || - die "Can't change to repository directory $files[0] in $cvsroot" ; -} - - -# Open the rlog process and apss all of the file names to that one -# process to cut down on exec overhead. This may backfire if there -# are too many files for the system buffer to handle, but if there are -# that many files, chances are that the cvs repository is not set up -# cleanly. - -print "opening rlog -h @files[1..$#files] |" if defined $opt_d; - -open( RLOG, "rlog -h @files[1..$#files] |") || die "Can't run rlog command" ; - -# Create the locks associative array. The elements in the array are -# of two types: -# -# The name of the RCS file with a value of the total number of locks found -# for that file, -# or -# -# The name of the rcs file concatenated with the version number of the lock. -# The value of this element is the name of the locker. - -# The regular expressions used to split the rcs info may have to be changed. -# The current ones work for rcs 5.6. - -$lock = 0; - -while () -{ - chop; - next if /^$/; # ditch blank lines - - if ( $_ =~ /^RCS file: (.*)$/ ) - { - $curfile = $1; - next; - } - - if ( $_ =~ /^locks: strict$/ ) - { - $lock = 1 ; - next; - } - - if ( $lock ) - { - # access list: is the line immediately following the list of locks. - if ( /^access list:/ ) - { # we are done getting lock info for this file. - $lock = 0; - } - else - { # We are accumulating lock info. - - # increment the lock count - $locks{$curfile}++; - # save the info on the version that is locked. $2 is the - # version number $1 is the name of the locker. - $locks{"$curfile" . "$2"} = $1 - if /[ ]*([a-zA-Z._]*): ([0-9.]*)$/; - - print "lock by $1 found on $curfile version $2" if defined $opt_d; - - } - } -} - -# Lets go back to the starting directory and see if any locked files -# are ones we are interested in. - -chdir $pwd; - -# fo all of the file names (remember $files[0] is the directory name -foreach $i (@files[1..$#files]) -{ - if ( defined $locks{$i . $ext} ) - { # well the file has at least one lock outstanding - - # find the base version number of our file - &parse_cvs_entry($i,*entry); - - # is our version of this file locked? - if ( defined $locks{$i . $ext . $entry{"version"}} ) - { # if so, it is by us? - if ( $login ne ($by = $locks{$i . $ext . $entry{"version"}}) ) - {# crud somebody else has it locked. - $outstanding_lock++ ; - print "$by has file $i locked for version " , $entry{"version"}; - } - else - { # yeah I have it locked. - print "You have a lock on file $i for version " , $entry{"version"} - if defined $opt_v; - } - } - } -} - -exit $outstanding_lock; - - -### End of main program - -sub parse_cvs_entry -{ # a very simple minded hack at parsing an entries file. -local ( $file, *entry ) = @_; -local ( @pp ); - - -open(ENTRIES, "< CVS/Entries") || die "Can't open entries file"; - -while () - { - if ( $_ =~ /^\/$file\// ) - { - @pp = split('/'); - - $entry{"name"} = $pp[1]; - $entry{"version"} = $pp[2]; - $entry{"dates"} = $pp[3]; - $entry{"name"} = $pp[4]; - $entry{"name"} = $pp[5]; - $entry{"sticky"} = $pp[6]; - return; - } - } -} diff --git a/lib/cvs/contrib/sccs2rcs b/lib/cvs/contrib/sccs2rcs deleted file mode 100644 index 61207e22..00000000 --- a/lib/cvs/contrib/sccs2rcs +++ /dev/null @@ -1,280 +0,0 @@ -#! no -f -# -# Sccs2rcs is a script to convert an existing SCCS -# history into an RCS history without losing any of -# the information contained therein. -# It has been tested under the following OS's: -# SunOS 3.5, 4.0.3, 4.1 -# Ultrix-32 2.0, 3.1 -# -# Things to note: -# + It will NOT delete or alter your ./SCCS history under any circumstances. -# -# + Run in a directory where ./SCCS exists and where you can -# create ./RCS -# -# + /usr/local/bin is put in front of the default path. -# (SCCS under Ultrix is set-uid sccs, bad bad bad, so -# /usr/local/bin/sccs here fixes that) -# -# + Date, time, author, comments, branches, are all preserved. -# -# + If a command fails somewhere in the middle, it bombs with -# a message -- remove what it's done so far and try again. -# "rm -rf RCS; sccs unedit `sccs tell`; sccs clean" -# There is no recovery and exit is far from graceful. -# If a particular module is hanging you up, consider -# doing it separately; move it from the current area so that -# the next run will have a better chance or working. -# Also (for the brave only) you might consider hacking -# the s-file for simpler problems: I've successfully changed -# the date of a delta to be in sync, then run "sccs admin -z" -# on the thing. -# -# + After everything finishes, ./SCCS will be moved to ./old-SCCS. -# -# This file may be copied, processed, hacked, mutilated, and -# even destroyed as long as you don't tell anyone you wrote it. -# -# Ken Cox -# Viewlogic Systems, Inc. -# kenstir@viewlogic.com -# ...!harvard!cg-atla!viewlog!kenstir -# -# Various hacks made by Brian Berliner before inclusion in CVS contrib area. - - -#we'll assume the user set up the path correctly -# for the Pmax, /usr/ucb/sccs is suid sccs, what a pain -# /usr/local/bin/sccs should override /usr/ucb/sccs there -set path = (/usr/local/bin $path) - - -############################################################ -# Error checking -# -if (! -w .) then - echo "Error: ./ not writeable by you." - exit 1 -endif -if (! -d SCCS) then - echo "Error: ./SCCS directory not found." - exit 1 -endif -set edits = (`sccs tell`) -if ($#edits) then - echo "Error: $#edits file(s) out for edit...clean up before converting." - exit 1 -endif -if (-d RCS) then - echo "Warning: RCS directory exists" - if (`ls -a RCS | wc -l` > 2) then - echo "Error: RCS directory not empty - exit 1 - endif -else - mkdir RCS -endif - -sccs clean - -set logfile = /tmp/sccs2rcs_$$_log -rm -f $logfile -set tmpfile = /tmp/sccs2rcs_$$_tmp -rm -f $tmpfile -set emptyfile = /tmp/sccs2rcs_$$_empty -echo -n "" > $emptyfile -set initialfile = /tmp/sccs2rcs_$$_init -echo "Initial revision" > $initialfile -set sedfile = /tmp/sccs2rcs_$$_sed -rm -f $sedfile -set revfile = /tmp/sccs2rcs_$$_rev -rm -f $revfile - -# the quotes surround the dollar signs to fool RCS when I check in this script -set sccs_keywords = (\ - '%W%[ ]*%G%'\ - '%W%[ ]*%E%'\ - '%W%'\ - '%Z%%M%[ ]*%I%[ ]*%G%'\ - '%Z%%M%[ ]*%I%[ ]*%E%'\ - '%M%[ ]*%I%[ ]*%G%'\ - '%M%[ ]*%I%[ ]*%E%'\ - '%M%'\ - '%I%'\ - '%G%'\ - '%E%'\ - '%U%') -set rcs_keywords = (\ - '$'Id'$'\ - '$'Id'$'\ - '$'Id'$'\ - '$'SunId'$'\ - '$'SunId'$'\ - '$'Id'$'\ - '$'Id'$'\ - '$'RCSfile'$'\ - '$'Revision'$'\ - '$'Date'$'\ - '$'Date'$'\ - '') - - -############################################################ -# Get some answers from user -# -echo "" -echo "Do you want to be prompted for a description of each" -echo "file as it is checked in to RCS initially?" -echo -n "(y=prompt for description, n=null description) [y] ?" -set ans = $< -if ((_$ans == _) || (_$ans == _y) || (_$ans == _Y)) then - set nodesc = 0 -else - set nodesc = 1 -endif -echo "" -echo "The default keyword substitutions are as follows and are" -echo "applied in the order specified:" -set i = 1 -while ($i <= $#sccs_keywords) -# echo ' '\"$sccs_keywords[$i]\"' ==> '\"$rcs_keywords[$i]\" - echo " $sccs_keywords[$i] ==> $rcs_keywords[$i]" - @ i = $i + 1 -end -echo "" -echo -n "Do you want to change them [n] ?" -set ans = $< -if ((_$ans != _) && (_$ans != _n) && (_$ans != _N)) then - echo "You can't always get what you want." - echo "Edit this script file and change the variables:" - echo ' $sccs_keywords' - echo ' $rcs_keywords' -else - echo "good idea." -endif - -# create the sed script -set i = 1 -while ($i <= $#sccs_keywords) - echo "s,$sccs_keywords[$i],$rcs_keywords[$i],g" >> $sedfile - @ i = $i + 1 -end - -onintr ERROR - -############################################################ -# Loop over every s-file in SCCS dir -# -foreach sfile (SCCS/s.*) - # get rid of the "s." at the beginning of the name - set file = `echo $sfile:t | sed -e "s/^..//"` - - # work on each rev of that file in ascending order - set firsttime = 1 - sccs prs $file | grep "^D " | awk '{print $2}' | sed -e 's/\./ /g' | sort -n -u +0 +1 +2 +3 +4 +5 +6 +7 +8 | sed -e 's/ /./g' > $revfile - foreach rev (`cat $revfile`) - if ($status != 0) goto ERROR - - # get file into current dir and get stats - set year = `echo $date | cut -c3-4` - if ($year < 70) then - # Y2K Bug, change century to 20 - set date = `echo $date | sed -e s/19/20/` - endif - set date = `sccs prs -r$rev $file | grep "^D " | awk '{printf("19%s %s", $3, $4); exit}'` - set author = `sccs prs -r$rev $file | grep "^D " | awk '{print $5; exit}'` - echo "" - echo "==> file $file, rev=$rev, date=$date, author=$author" - sccs edit -r$rev $file >>& $logfile - if ($status != 0) goto ERROR - echo checked out of SCCS - - # add RCS keywords in place of SCCS keywords - sed -f $sedfile $file > $tmpfile - if ($status != 0) goto ERROR - echo performed keyword substitutions - cp $tmpfile $file - - # check file into RCS - if ($firsttime) then - set firsttime = 0 - if ($nodesc) then - echo about to do ci - echo ci -f -r$rev -d"$date" -w$author -t$emptyfile $file - ci -f -r$rev -d"$date" -w$author -t$emptyfile $file < $initialfile >>& $logfile - if ($status != 0) goto ERROR - echo initial rev checked into RCS without description - else - echo "" - echo Enter a brief description of the file $file \(end w/ Ctrl-D\): - cat > $tmpfile - ci -f -r$rev -d"$date" -w$author -t$tmpfile $file < $initialfile >>& $logfile - if ($status != 0) goto ERROR - echo initial rev checked into RCS - endif - else - # get RCS lock - set lckrev = `echo $rev | sed -e 's/\.[0-9]*$//'` - if ("$lckrev" =~ [0-9]*.*) then - # need to lock the brach -- it is OK if the lock fails - rcs -l$lckrev $file >>& $logfile - else - # need to lock the trunk -- must succeed - rcs -l $file >>& $logfile - if ($status != 0) goto ERROR - endif - echo got lock - sccs prs -r$rev $file | grep "." > $tmpfile - # it's OK if grep fails here and gives status == 1 - # put the delta message in $tmpfile - ed $tmpfile >>& $logfile <>& $logfile - if ($status != 0) goto ERROR - echo checked into RCS - endif - sccs unedit $file >>& $logfile - if ($status != 0) goto ERROR - end - rm -f $file -end - - -############################################################ -# Clean up -# -echo cleaning up... -mv SCCS old-SCCS -rm -f $tmpfile $emptyfile $initialfile $sedfile -echo =================================================== -echo " Conversion Completed Successfully" -echo "" -echo " SCCS history now in old-SCCS/" -echo =================================================== -set exitval = 0 -goto cleanup - -ERROR: -foreach f (`sccs tell`) - sccs unedit $f -end -echo "" -echo "" -echo Danger\! Danger\! -echo Some command exited with a non-zero exit status. -echo Log file exists in $logfile. -echo "" -echo Incomplete history in ./RCS -- remove it -echo Original unchanged history in ./SCCS -set exitval = 1 - -cleanup: -# leave log file -rm -f $tmpfile $emptyfile $initialfile $sedfile $revfile - -exit $exitval diff --git a/lib/perl5/5.6.1/CGI.pm b/lib/perl5/5.6.1/CGI.pm deleted file mode 100644 index 1c9d2d46..00000000 --- a/lib/perl5/5.6.1/CGI.pm +++ /dev/null @@ -1,6639 +0,0 @@ -package CGI; -require 5.004; -use Carp 'croak'; - -# See the bottom of this file for the POD documentation. Search for the -# string '=head'. - -# You can run this file through either pod2man or pod2html to produce pretty -# documentation in manual or html file format (these utilities are part of the -# Perl 5 distribution). - -# Copyright 1995-1998 Lincoln D. Stein. All rights reserved. -# It may be used and modified freely, but I do request that this copyright -# notice remain attached to the file. You may modify this module as you -# wish, but if you redistribute a modified version, please attach a note -# listing the modifications you have made. - -# The most recent version and complete docs are available at: -# http://stein.cshl.org/WWW/software/CGI/ - -$CGI::revision = '$Id: CGI.pm,v 1.49 2001/02/04 23:08:39 lstein Exp $'; -$CGI::VERSION='2.752'; - -# HARD-CODED LOCATION FOR FILE UPLOAD TEMPORARY FILES. -# UNCOMMENT THIS ONLY IF YOU KNOW WHAT YOU'RE DOING. -# $TempFile::TMPDIRECTORY = '/usr/tmp'; -use CGI::Util qw(rearrange make_attributes unescape escape expires); - -use constant XHTML_DTD => ['-//W3C//DTD XHTML Basic 1.0//EN', - 'http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd']; - -# >>>>> Here are some globals that you might want to adjust <<<<<< -sub initialize_globals { - # Set this to 1 to enable copious autoloader debugging messages - $AUTOLOAD_DEBUG = 0; - - # Set this to 1 to generate XTML-compatible output - $XHTML = 1; - - # Change this to the preferred DTD to print in start_html() - # or use default_dtd('text of DTD to use'); - $DEFAULT_DTD = [ '-//W3C//DTD HTML 4.01 Transitional//EN', - 'http://www.w3.org/TR/html4/loose.dtd' ] ; - - # Set this to 1 to enable NOSTICKY scripts - # or: - # 1) use CGI qw(-nosticky) - # 2) $CGI::nosticky(1) - $NOSTICKY = 0; - - # Set this to 1 to enable NPH scripts - # or: - # 1) use CGI qw(-nph) - # 2) CGI::nph(1) - # 3) print header(-nph=>1) - $NPH = 0; - - # Set this to 1 to enable debugging from @ARGV - # Set to 2 to enable debugging from STDIN - $DEBUG = 1; - - # Set this to 1 to make the temporary files created - # during file uploads safe from prying eyes - # or do... - # 1) use CGI qw(:private_tempfiles) - # 2) CGI::private_tempfiles(1); - $PRIVATE_TEMPFILES = 0; - - # Set this to a positive value to limit the size of a POSTing - # to a certain number of bytes: - $POST_MAX = -1; - - # Change this to 1 to disable uploads entirely: - $DISABLE_UPLOADS = 0; - - # Automatically determined -- don't change - $EBCDIC = 0; - - # Change this to 1 to suppress redundant HTTP headers - $HEADERS_ONCE = 0; - - # separate the name=value pairs by semicolons rather than ampersands - $USE_PARAM_SEMICOLONS = 1; - - # Other globals that you shouldn't worry about. - undef $Q; - $BEEN_THERE = 0; - undef @QUERY_PARAM; - undef %EXPORT; - undef $QUERY_CHARSET; - undef %QUERY_FIELDNAMES; - - # prevent complaints by mod_perl - 1; -} - -# ------------------ START OF THE LIBRARY ------------ - -# make mod_perlhappy -initialize_globals(); - -# FIGURE OUT THE OS WE'RE RUNNING UNDER -# Some systems support the $^O variable. If not -# available then require() the Config library -unless ($OS) { - unless ($OS = $^O) { - require Config; - $OS = $Config::Config{'osname'}; - } -} -if ($OS =~ /^MSWin/i) { - $OS = 'WINDOWS'; -} elsif ($OS =~ /^VMS/i) { - $OS = 'VMS'; -} elsif ($OS =~ /^dos/i) { - $OS = 'DOS'; -} elsif ($OS =~ /^MacOS/i) { - $OS = 'MACINTOSH'; -} elsif ($OS =~ /^os2/i) { - $OS = 'OS2'; -} elsif ($OS =~ /^epoc/i) { - $OS = 'EPOC'; -} else { - $OS = 'UNIX'; -} - -# Some OS logic. Binary mode enabled on DOS, NT and VMS -$needs_binmode = $OS=~/^(WINDOWS|DOS|OS2|MSWin)/; - -# This is the default class for the CGI object to use when all else fails. -$DefaultClass = 'CGI' unless defined $CGI::DefaultClass; - -# This is where to look for autoloaded routines. -$AutoloadClass = $DefaultClass unless defined $CGI::AutoloadClass; - -# The path separator is a slash, backslash or semicolon, depending -# on the paltform. -$SL = { - UNIX=>'/', OS2=>'\\', EPOC=>'/', - WINDOWS=>'\\', DOS=>'\\', MACINTOSH=>':', VMS=>'/' - }->{$OS}; - -# This no longer seems to be necessary -# Turn on NPH scripts by default when running under IIS server! -# $NPH++ if defined($ENV{'SERVER_SOFTWARE'}) && $ENV{'SERVER_SOFTWARE'}=~/IIS/; -$IIS++ if defined($ENV{'SERVER_SOFTWARE'}) && $ENV{'SERVER_SOFTWARE'}=~/IIS/; - -# Turn on special checking for Doug MacEachern's modperl -if (exists $ENV{'GATEWAY_INTERFACE'} - && - ($MOD_PERL = $ENV{'GATEWAY_INTERFACE'} =~ /^CGI-Perl\//)) -{ - $| = 1; - require Apache; -} -# Turn on special checking for ActiveState's PerlEx -$PERLEX++ if defined($ENV{'GATEWAY_INTERFACE'}) && $ENV{'GATEWAY_INTERFACE'} =~ /^CGI-PerlEx/; - -# Define the CRLF sequence. I can't use a simple "\r\n" because the meaning -# of "\n" is different on different OS's (sometimes it generates CRLF, sometimes LF -# and sometimes CR). The most popular VMS web server -# doesn't accept CRLF -- instead it wants a LR. EBCDIC machines don't -# use ASCII, so \015\012 means something different. I find this all -# really annoying. -$EBCDIC = "\t" ne "\011"; -if ($OS eq 'VMS') { - $CRLF = "\n"; -} elsif ($EBCDIC) { - $CRLF= "\r\n"; -} else { - $CRLF = "\015\012"; -} - -if ($needs_binmode) { - $CGI::DefaultClass->binmode(main::STDOUT); - $CGI::DefaultClass->binmode(main::STDIN); - $CGI::DefaultClass->binmode(main::STDERR); -} - -%EXPORT_TAGS = ( - ':html2'=>['h1'..'h6',qw/p br hr ol ul li dl dt dd menu code var strong em - tt u i b blockquote pre img a address cite samp dfn html head - base body Link nextid title meta kbd start_html end_html - input Select option comment charset escapeHTML/], - ':html3'=>[qw/div table caption th td TR Tr sup Sub strike applet Param - embed basefont style span layer ilayer font frameset frame script small big/], - ':netscape'=>[qw/blink fontsize center/], - ':form'=>[qw/textfield textarea filefield password_field hidden checkbox checkbox_group - submit reset defaults radio_group popup_menu button autoEscape - scrolling_list image_button start_form end_form startform endform - start_multipart_form end_multipart_form isindex tmpFileName uploadInfo URL_ENCODED MULTIPART/], - ':cgi'=>[qw/param upload path_info path_translated url self_url script_name cookie Dump - raw_cookie request_method query_string Accept user_agent remote_host content_type - remote_addr referer server_name server_software server_port server_protocol - virtual_host remote_ident auth_type http - save_parameters restore_parameters param_fetch - remote_user user_name header redirect import_names put - Delete Delete_all url_param cgi_error/], - ':ssl' => [qw/https/], - ':imagemap' => [qw/Area Map/], - ':cgi-lib' => [qw/ReadParse PrintHeader HtmlTop HtmlBot SplitParam Vars/], - ':html' => [qw/:html2 :html3 :netscape/], - ':standard' => [qw/:html2 :html3 :form :cgi/], - ':push' => [qw/multipart_init multipart_start multipart_end multipart_final/], - ':all' => [qw/:html2 :html3 :netscape :form :cgi :internal/] - ); - -# to import symbols into caller -sub import { - my $self = shift; - -# This causes modules to clash. -# undef %EXPORT_OK; -# undef %EXPORT; - - $self->_setup_symbols(@_); - my ($callpack, $callfile, $callline) = caller; - - # To allow overriding, search through the packages - # Till we find one in which the correct subroutine is defined. - my @packages = ($self,@{"$self\:\:ISA"}); - foreach $sym (keys %EXPORT) { - my $pck; - my $def = ${"$self\:\:AutoloadClass"} || $DefaultClass; - foreach $pck (@packages) { - if (defined(&{"$pck\:\:$sym"})) { - $def = $pck; - last; - } - } - *{"${callpack}::$sym"} = \&{"$def\:\:$sym"}; - } -} - -sub compile { - my $pack = shift; - $pack->_setup_symbols('-compile',@_); -} - -sub expand_tags { - my($tag) = @_; - return ("start_$1","end_$1") if $tag=~/^(?:\*|start_|end_)(.+)/; - my(@r); - return ($tag) unless $EXPORT_TAGS{$tag}; - foreach (@{$EXPORT_TAGS{$tag}}) { - push(@r,&expand_tags($_)); - } - return @r; -} - -#### Method: new -# The new routine. This will check the current environment -# for an existing query string, and initialize itself, if so. -#### -sub new { - my($class,$initializer) = @_; - my $self = {}; - bless $self,ref $class || $class || $DefaultClass; - if ($MOD_PERL && defined Apache->request) { - Apache->request->register_cleanup(\&CGI::_reset_globals); - undef $NPH; - } - $self->_reset_globals if $PERLEX; - $self->init($initializer); - return $self; -} - -# We provide a DESTROY method so that the autoloader -# doesn't bother trying to find it. -sub DESTROY { } - -#### Method: param -# Returns the value(s)of a named parameter. -# If invoked in a list context, returns the -# entire list. Otherwise returns the first -# member of the list. -# If name is not provided, return a list of all -# the known parameters names available. -# If more than one argument is provided, the -# second and subsequent arguments are used to -# set the value of the parameter. -#### -sub param { - my($self,@p) = self_or_default(@_); - return $self->all_parameters unless @p; - my($name,$value,@other); - - # For compatibility between old calling style and use_named_parameters() style, - # we have to special case for a single parameter present. - if (@p > 1) { - ($name,$value,@other) = rearrange([NAME,[DEFAULT,VALUE,VALUES]],@p); - my(@values); - - if (substr($p[0],0,1) eq '-') { - @values = defined($value) ? (ref($value) && ref($value) eq 'ARRAY' ? @{$value} : $value) : (); - } else { - foreach ($value,@other) { - push(@values,$_) if defined($_); - } - } - # If values is provided, then we set it. - if (@values) { - $self->add_parameter($name); - $self->{$name}=[@values]; - } - } else { - $name = $p[0]; - } - - return unless defined($name) && $self->{$name}; - return wantarray ? @{$self->{$name}} : $self->{$name}->[0]; -} - -sub self_or_default { - return @_ if defined($_[0]) && (!ref($_[0])) &&($_[0] eq 'CGI'); - unless (defined($_[0]) && - (ref($_[0]) eq 'CGI' || UNIVERSAL::isa($_[0],'CGI')) # slightly optimized for common case - ) { - $Q = $CGI::DefaultClass->new unless defined($Q); - unshift(@_,$Q); - } - return wantarray ? @_ : $Q; -} - -sub self_or_CGI { - local $^W=0; # prevent a warning - if (defined($_[0]) && - (substr(ref($_[0]),0,3) eq 'CGI' - || UNIVERSAL::isa($_[0],'CGI'))) { - return @_; - } else { - return ($DefaultClass,@_); - } -} - -######################################## -# THESE METHODS ARE MORE OR LESS PRIVATE -# GO TO THE __DATA__ SECTION TO SEE MORE -# PUBLIC METHODS -######################################## - -# Initialize the query object from the environment. -# If a parameter list is found, this object will be set -# to an associative array in which parameter names are keys -# and the values are stored as lists -# If a keyword list is found, this method creates a bogus -# parameter list with the single parameter 'keywords'. - -sub init { - my($self,$initializer) = @_; - my($query_string,$meth,$content_length,$fh,@lines) = ('','','',''); - local($/) = "\n"; - - # if we get called more than once, we want to initialize - # ourselves from the original query (which may be gone - # if it was read from STDIN originally.) - if (defined(@QUERY_PARAM) && !defined($initializer)) { - foreach (@QUERY_PARAM) { - $self->param('-name'=>$_,'-value'=>$QUERY_PARAM{$_}); - } - $self->charset($QUERY_CHARSET); - $self->{'.fieldnames'} = {%QUERY_FIELDNAMES}; - return; - } - - $meth=$ENV{'REQUEST_METHOD'} if defined($ENV{'REQUEST_METHOD'}); - $content_length = defined($ENV{'CONTENT_LENGTH'}) ? $ENV{'CONTENT_LENGTH'} : 0; - - $fh = to_filehandle($initializer) if $initializer; - - # set charset to the safe ISO-8859-1 - $self->charset('ISO-8859-1'); - - METHOD: { - - # avoid unreasonably large postings - if (($POST_MAX > 0) && ($content_length > $POST_MAX)) { - $self->cgi_error("413 Request entity too large"); - last METHOD; - } - - # Process multipart postings, but only if the initializer is - # not defined. - if ($meth eq 'POST' - && defined($ENV{'CONTENT_TYPE'}) - && $ENV{'CONTENT_TYPE'}=~m|^multipart/form-data| - && !defined($initializer) - ) { - my($boundary) = $ENV{'CONTENT_TYPE'} =~ /boundary=\"?([^\";,]+)\"?/; - $self->read_multipart($boundary,$content_length); - last METHOD; - } - - # If initializer is defined, then read parameters - # from it. - if (defined($initializer)) { - if (UNIVERSAL::isa($initializer,'CGI')) { - $query_string = $initializer->query_string; - last METHOD; - } - if (ref($initializer) && ref($initializer) eq 'HASH') { - foreach (keys %$initializer) { - $self->param('-name'=>$_,'-value'=>$initializer->{$_}); - } - last METHOD; - } - - if (defined($fh) && ($fh ne '')) { - while (<$fh>) { - chomp; - last if /^=/; - push(@lines,$_); - } - # massage back into standard format - if ("@lines" =~ /=/) { - $query_string=join("&",@lines); - } else { - $query_string=join("+",@lines); - } - last METHOD; - } - - # last chance -- treat it as a string - $initializer = $$initializer if ref($initializer) eq 'SCALAR'; - $query_string = $initializer; - - last METHOD; - } - - # If method is GET or HEAD, fetch the query from - # the environment. - if ($meth=~/^(GET|HEAD)$/) { - if ($MOD_PERL) { - $query_string = Apache->request->args; - } else { - $query_string = $ENV{'QUERY_STRING'} if defined $ENV{'QUERY_STRING'}; - $query_string ||= $ENV{'REDIRECT_QUERY_STRING'} if defined $ENV{'REDIRECT_QUERY_STRING'}; - } - last METHOD; - } - - if ($meth eq 'POST') { - $self->read_from_client(\*STDIN,\$query_string,$content_length,0) - if $content_length > 0; - # Some people want to have their cake and eat it too! - # Uncomment this line to have the contents of the query string - # APPENDED to the POST data. - # $query_string .= (length($query_string) ? '&' : '') . $ENV{'QUERY_STRING'} if defined $ENV{'QUERY_STRING'}; - last METHOD; - } - - # If $meth is not of GET, POST or HEAD, assume we're being debugged offline. - # Check the command line and then the standard input for data. - # We use the shellwords package in order to behave the way that - # UN*X programmers expect. - $query_string = read_from_cmdline() if $DEBUG; - } - - # We now have the query string in hand. We do slightly - # different things for keyword lists and parameter lists. - if (defined $query_string && length $query_string) { - if ($query_string =~ /[&=;]/) { - $self->parse_params($query_string); - } else { - $self->add_parameter('keywords'); - $self->{'keywords'} = [$self->parse_keywordlist($query_string)]; - } - } - - # Special case. Erase everything if there is a field named - # .defaults. - if ($self->param('.defaults')) { - undef %{$self}; - } - - # Associative array containing our defined fieldnames - $self->{'.fieldnames'} = {}; - foreach ($self->param('.cgifields')) { - $self->{'.fieldnames'}->{$_}++; - } - - # Clear out our default submission button flag if present - $self->delete('.submit'); - $self->delete('.cgifields'); - - $self->save_request unless $initializer; -} - -# FUNCTIONS TO OVERRIDE: -# Turn a string into a filehandle -sub to_filehandle { - my $thingy = shift; - return undef unless $thingy; - return $thingy if UNIVERSAL::isa($thingy,'GLOB'); - return $thingy if UNIVERSAL::isa($thingy,'FileHandle'); - if (!ref($thingy)) { - my $caller = 1; - while (my $package = caller($caller++)) { - my($tmp) = $thingy=~/[\':]/ ? $thingy : "$package\:\:$thingy"; - return $tmp if defined(fileno($tmp)); - } - } - return undef; -} - -# send output to the browser -sub put { - my($self,@p) = self_or_default(@_); - $self->print(@p); -} - -# print to standard output (for overriding in mod_perl) -sub print { - shift; - CORE::print(@_); -} - -# get/set last cgi_error -sub cgi_error { - my ($self,$err) = self_or_default(@_); - $self->{'.cgi_error'} = $err if defined $err; - return $self->{'.cgi_error'}; -} - -sub save_request { - my($self) = @_; - # We're going to play with the package globals now so that if we get called - # again, we initialize ourselves in exactly the same way. This allows - # us to have several of these objects. - @QUERY_PARAM = $self->param; # save list of parameters - foreach (@QUERY_PARAM) { - next unless defined $_; - $QUERY_PARAM{$_}=$self->{$_}; - } - $QUERY_CHARSET = $self->charset; - %QUERY_FIELDNAMES = %{$self->{'.fieldnames'}}; -} - -sub parse_params { - my($self,$tosplit) = @_; - my(@pairs) = split(/[&;]/,$tosplit); - my($param,$value); - foreach (@pairs) { - ($param,$value) = split('=',$_,2); - $value = '' unless defined $value; - $param = unescape($param); - $value = unescape($value); - $self->add_parameter($param); - push (@{$self->{$param}},$value); - } -} - -sub add_parameter { - my($self,$param)=@_; - return unless defined $param; - push (@{$self->{'.parameters'}},$param) - unless defined($self->{$param}); -} - -sub all_parameters { - my $self = shift; - return () unless defined($self) && $self->{'.parameters'}; - return () unless @{$self->{'.parameters'}}; - return @{$self->{'.parameters'}}; -} - -# put a filehandle into binary mode (DOS) -sub binmode { - CORE::binmode($_[1]); -} - -sub _make_tag_func { - my ($self,$tagname) = @_; - my $func = qq( - sub $tagname { - shift if \$_[0] && - (ref(\$_[0]) && - (substr(ref(\$_[0]),0,3) eq 'CGI' || - UNIVERSAL::isa(\$_[0],'CGI'))); - my(\$attr) = ''; - if (ref(\$_[0]) && ref(\$_[0]) eq 'HASH') { - my(\@attr) = make_attributes(shift()||undef,1); - \$attr = " \@attr" if \@attr; - } - ); - if ($tagname=~/start_(\w+)/i) { - $func .= qq! return "<\L$1\E\$attr>";} !; - } elsif ($tagname=~/end_(\w+)/i) { - $func .= qq! return "<\L/$1\E>"; } !; - } else { - $func .= qq# - return \$XHTML ? "\L<$tagname\E\$attr />" : "\L<$tagname\E\$attr>" unless \@_; - my(\$tag,\$untag) = ("\L<$tagname\E\$attr>","\L\E"); - my \@result = map { "\$tag\$_\$untag" } - (ref(\$_[0]) eq 'ARRAY') ? \@{\$_[0]} : "\@_"; - return "\@result"; - }#; - } -return $func; -} - -sub AUTOLOAD { - print STDERR "CGI::AUTOLOAD for $AUTOLOAD\n" if $CGI::AUTOLOAD_DEBUG; - my $func = &_compile; - goto &$func; -} - -sub _compile { - my($func) = $AUTOLOAD; - my($pack,$func_name); - { - local($1,$2); # this fixes an obscure variable suicide problem. - $func=~/(.+)::([^:]+)$/; - ($pack,$func_name) = ($1,$2); - $pack=~s/::SUPER$//; # fix another obscure problem - $pack = ${"$pack\:\:AutoloadClass"} || $CGI::DefaultClass - unless defined(${"$pack\:\:AUTOLOADED_ROUTINES"}); - - my($sub) = \%{"$pack\:\:SUBS"}; - unless (%$sub) { - my($auto) = \${"$pack\:\:AUTOLOADED_ROUTINES"}; - eval "package $pack; $$auto"; - croak("$AUTOLOAD: $@") if $@; - $$auto = ''; # Free the unneeded storage (but don't undef it!!!) - } - my($code) = $sub->{$func_name}; - - $code = "sub $AUTOLOAD { }" if (!$code and $func_name eq 'DESTROY'); - if (!$code) { - (my $base = $func_name) =~ s/^(start_|end_)//i; - if ($EXPORT{':any'} || - $EXPORT{'-any'} || - $EXPORT{$base} || - (%EXPORT_OK || grep(++$EXPORT_OK{$_},&expand_tags(':html'))) - && $EXPORT_OK{$base}) { - $code = $CGI::DefaultClass->_make_tag_func($func_name); - } - } - croak("Undefined subroutine $AUTOLOAD\n") unless $code; - eval "package $pack; $code"; - if ($@) { - $@ =~ s/ at .*\n//; - croak("$AUTOLOAD: $@"); - } - } - CORE::delete($sub->{$func_name}); #free storage - return "$pack\:\:$func_name"; -} - -sub _reset_globals { initialize_globals(); } - -sub _setup_symbols { - my $self = shift; - my $compile = 0; - foreach (@_) { - $HEADERS_ONCE++, next if /^[:-]unique_headers$/; - $NPH++, next if /^[:-]nph$/; - $NOSTICKY++, next if /^[:-]nosticky$/; - $DEBUG=0, next if /^[:-]no_?[Dd]ebug$/; - $DEBUG=2, next if /^[:-][Dd]ebug$/; - $USE_PARAM_SEMICOLONS++, next if /^[:-]newstyle_urls$/; - $XHTML++, next if /^[:-]xhtml$/; - $XHTML=0, next if /^[:-]no_?xhtml$/; - $USE_PARAM_SEMICOLONS=0, next if /^[:-]oldstyle_urls$/; - $PRIVATE_TEMPFILES++, next if /^[:-]private_tempfiles$/; - $EXPORT{$_}++, next if /^[:-]any$/; - $compile++, next if /^[:-]compile$/; - - # This is probably extremely evil code -- to be deleted some day. - if (/^[-]autoload$/) { - my($pkg) = caller(1); - *{"${pkg}::AUTOLOAD"} = sub { - my($routine) = $AUTOLOAD; - $routine =~ s/^.*::/CGI::/; - &$routine; - }; - next; - } - - foreach (&expand_tags($_)) { - tr/a-zA-Z0-9_//cd; # don't allow weird function names - $EXPORT{$_}++; - } - } - _compile_all(keys %EXPORT) if $compile; -} - -sub charset { - my ($self,$charset) = self_or_default(@_); - $self->{'.charset'} = $charset if defined $charset; - $self->{'.charset'}; -} - -############################################################################### -################# THESE FUNCTIONS ARE AUTOLOADED ON DEMAND #################### -############################################################################### -$AUTOLOADED_ROUTINES = ''; # get rid of -w warning -$AUTOLOADED_ROUTINES=<<'END_OF_AUTOLOAD'; - -%SUBS = ( - -'URL_ENCODED'=> <<'END_OF_FUNC', -sub URL_ENCODED { 'application/x-www-form-urlencoded'; } -END_OF_FUNC - -'MULTIPART' => <<'END_OF_FUNC', -sub MULTIPART { 'multipart/form-data'; } -END_OF_FUNC - -'SERVER_PUSH' => <<'END_OF_FUNC', -sub SERVER_PUSH { 'multipart/x-mixed-replace;boundary="' . shift() . '"'; } -END_OF_FUNC - -'new_MultipartBuffer' => <<'END_OF_FUNC', -# Create a new multipart buffer -sub new_MultipartBuffer { - my($self,$boundary,$length,$filehandle) = @_; - return MultipartBuffer->new($self,$boundary,$length,$filehandle); -} -END_OF_FUNC - -'read_from_client' => <<'END_OF_FUNC', -# Read data from a file handle -sub read_from_client { - my($self, $fh, $buff, $len, $offset) = @_; - local $^W=0; # prevent a warning - return undef unless defined($fh); - return read($fh, $$buff, $len, $offset); -} -END_OF_FUNC - -'delete' => <<'END_OF_FUNC', -#### Method: delete -# Deletes the named parameter entirely. -#### -sub delete { - my($self,@p) = self_or_default(@_); - my($name) = rearrange([NAME],@p); - CORE::delete $self->{$name}; - CORE::delete $self->{'.fieldnames'}->{$name}; - @{$self->{'.parameters'}}=grep($_ ne $name,$self->param()); - return wantarray ? () : undef; -} -END_OF_FUNC - -#### Method: import_names -# Import all parameters into the given namespace. -# Assumes namespace 'Q' if not specified -#### -'import_names' => <<'END_OF_FUNC', -sub import_names { - my($self,$namespace,$delete) = self_or_default(@_); - $namespace = 'Q' unless defined($namespace); - die "Can't import names into \"main\"\n" if \%{"${namespace}::"} == \%::; - if ($delete || $MOD_PERL || exists $ENV{'FCGI_ROLE'}) { - # can anyone find an easier way to do this? - foreach (keys %{"${namespace}::"}) { - local *symbol = "${namespace}::${_}"; - undef $symbol; - undef @symbol; - undef %symbol; - } - } - my($param,@value,$var); - foreach $param ($self->param) { - # protect against silly names - ($var = $param)=~tr/a-zA-Z0-9_/_/c; - $var =~ s/^(?=\d)/_/; - local *symbol = "${namespace}::$var"; - @value = $self->param($param); - @symbol = @value; - $symbol = $value[0]; - } -} -END_OF_FUNC - -#### Method: keywords -# Keywords acts a bit differently. Calling it in a list context -# returns the list of keywords. -# Calling it in a scalar context gives you the size of the list. -#### -'keywords' => <<'END_OF_FUNC', -sub keywords { - my($self,@values) = self_or_default(@_); - # If values is provided, then we set it. - $self->{'keywords'}=[@values] if @values; - my(@result) = defined($self->{'keywords'}) ? @{$self->{'keywords'}} : (); - @result; -} -END_OF_FUNC - -# These are some tie() interfaces for compatibility -# with Steve Brenner's cgi-lib.pl routines -'Vars' => <<'END_OF_FUNC', -sub Vars { - my $q = shift; - my %in; - tie(%in,CGI,$q); - return %in if wantarray; - return \%in; -} -END_OF_FUNC - -# These are some tie() interfaces for compatibility -# with Steve Brenner's cgi-lib.pl routines -'ReadParse' => <<'END_OF_FUNC', -sub ReadParse { - local(*in); - if (@_) { - *in = $_[0]; - } else { - my $pkg = caller(); - *in=*{"${pkg}::in"}; - } - tie(%in,CGI); - return scalar(keys %in); -} -END_OF_FUNC - -'PrintHeader' => <<'END_OF_FUNC', -sub PrintHeader { - my($self) = self_or_default(@_); - return $self->header(); -} -END_OF_FUNC - -'HtmlTop' => <<'END_OF_FUNC', -sub HtmlTop { - my($self,@p) = self_or_default(@_); - return $self->start_html(@p); -} -END_OF_FUNC - -'HtmlBot' => <<'END_OF_FUNC', -sub HtmlBot { - my($self,@p) = self_or_default(@_); - return $self->end_html(@p); -} -END_OF_FUNC - -'SplitParam' => <<'END_OF_FUNC', -sub SplitParam { - my ($param) = @_; - my (@params) = split ("\0", $param); - return (wantarray ? @params : $params[0]); -} -END_OF_FUNC - -'MethGet' => <<'END_OF_FUNC', -sub MethGet { - return request_method() eq 'GET'; -} -END_OF_FUNC - -'MethPost' => <<'END_OF_FUNC', -sub MethPost { - return request_method() eq 'POST'; -} -END_OF_FUNC - -'TIEHASH' => <<'END_OF_FUNC', -sub TIEHASH { - return $_[1] if defined $_[1]; - return $Q ||= new shift; -} -END_OF_FUNC - -'STORE' => <<'END_OF_FUNC', -sub STORE { - my $self = shift; - my $tag = shift; - my $vals = shift; - my @vals = index($vals,"\0")!=-1 ? split("\0",$vals) : $vals; - $self->param(-name=>$tag,-value=>\@vals); -} -END_OF_FUNC - -'FETCH' => <<'END_OF_FUNC', -sub FETCH { - return $_[0] if $_[1] eq 'CGI'; - return undef unless defined $_[0]->param($_[1]); - return join("\0",$_[0]->param($_[1])); -} -END_OF_FUNC - -'FIRSTKEY' => <<'END_OF_FUNC', -sub FIRSTKEY { - $_[0]->{'.iterator'}=0; - $_[0]->{'.parameters'}->[$_[0]->{'.iterator'}++]; -} -END_OF_FUNC - -'NEXTKEY' => <<'END_OF_FUNC', -sub NEXTKEY { - $_[0]->{'.parameters'}->[$_[0]->{'.iterator'}++]; -} -END_OF_FUNC - -'EXISTS' => <<'END_OF_FUNC', -sub EXISTS { - exists $_[0]->{$_[1]}; -} -END_OF_FUNC - -'DELETE' => <<'END_OF_FUNC', -sub DELETE { - $_[0]->delete($_[1]); -} -END_OF_FUNC - -'CLEAR' => <<'END_OF_FUNC', -sub CLEAR { - %{$_[0]}=(); -} -#### -END_OF_FUNC - -#### -# Append a new value to an existing query -#### -'append' => <<'EOF', -sub append { - my($self,@p) = @_; - my($name,$value) = rearrange([NAME,[VALUE,VALUES]],@p); - my(@values) = defined($value) ? (ref($value) ? @{$value} : $value) : (); - if (@values) { - $self->add_parameter($name); - push(@{$self->{$name}},@values); - } - return $self->param($name); -} -EOF - -#### Method: delete_all -# Delete all parameters -#### -'delete_all' => <<'EOF', -sub delete_all { - my($self) = self_or_default(@_); - undef %{$self}; -} -EOF - -'Delete' => <<'EOF', -sub Delete { - my($self,@p) = self_or_default(@_); - $self->delete(@p); -} -EOF - -'Delete_all' => <<'EOF', -sub Delete_all { - my($self,@p) = self_or_default(@_); - $self->delete_all(@p); -} -EOF - -#### Method: autoescape -# If you want to turn off the autoescaping features, -# call this method with undef as the argument -'autoEscape' => <<'END_OF_FUNC', -sub autoEscape { - my($self,$escape) = self_or_default(@_); - $self->{'dontescape'}=!$escape; -} -END_OF_FUNC - - -#### Method: version -# Return the current version -#### -'version' => <<'END_OF_FUNC', -sub version { - return $VERSION; -} -END_OF_FUNC - -#### Method: url_param -# Return a parameter in the QUERY_STRING, regardless of -# whether this was a POST or a GET -#### -'url_param' => <<'END_OF_FUNC', -sub url_param { - my ($self,@p) = self_or_default(@_); - my $name = shift(@p); - return undef unless exists($ENV{QUERY_STRING}); - unless (exists($self->{'.url_param'})) { - $self->{'.url_param'}={}; # empty hash - if ($ENV{QUERY_STRING} =~ /=/) { - my(@pairs) = split(/[&;]/,$ENV{QUERY_STRING}); - my($param,$value); - foreach (@pairs) { - ($param,$value) = split('=',$_,2); - $param = unescape($param); - $value = unescape($value); - push(@{$self->{'.url_param'}->{$param}},$value); - } - } else { - $self->{'.url_param'}->{'keywords'} = [$self->parse_keywordlist($ENV{QUERY_STRING})]; - } - } - return keys %{$self->{'.url_param'}} unless defined($name); - return () unless $self->{'.url_param'}->{$name}; - return wantarray ? @{$self->{'.url_param'}->{$name}} - : $self->{'.url_param'}->{$name}->[0]; -} -END_OF_FUNC - -#### Method: Dump -# Returns a string in which all the known parameter/value -# pairs are represented as nested lists, mainly for the purposes -# of debugging. -#### -'Dump' => <<'END_OF_FUNC', -sub Dump { - my($self) = self_or_default(@_); - my($param,$value,@result); - return '

    ' unless $self->param; - push(@result,"
      "); - foreach $param ($self->param) { - my($name)=$self->escapeHTML($param); - push(@result,"
    • $param"); - push(@result,"
        "); - foreach $value ($self->param($param)) { - $value = $self->escapeHTML($value); - $value =~ s/\n/
        \n/g; - push(@result,"
      • $value"); - } - push(@result,"
      "); - } - push(@result,"
    \n"); - return join("\n",@result); -} -END_OF_FUNC - -#### Method as_string -# -# synonym for "dump" -#### -'as_string' => <<'END_OF_FUNC', -sub as_string { - &Dump(@_); -} -END_OF_FUNC - -#### Method: save -# Write values out to a filehandle in such a way that they can -# be reinitialized by the filehandle form of the new() method -#### -'save' => <<'END_OF_FUNC', -sub save { - my($self,$filehandle) = self_or_default(@_); - $filehandle = to_filehandle($filehandle); - my($param); - local($,) = ''; # set print field separator back to a sane value - local($\) = ''; # set output line separator to a sane value - foreach $param ($self->param) { - my($escaped_param) = escape($param); - my($value); - foreach $value ($self->param($param)) { - print $filehandle "$escaped_param=",escape("$value"),"\n"; - } - } - foreach (keys %{$self->{'.fieldnames'}}) { - print $filehandle ".cgifields=",escape("$_"),"\n"; - } - print $filehandle "=\n"; # end of record -} -END_OF_FUNC - - -#### Method: save_parameters -# An alias for save() that is a better name for exportation. -# Only intended to be used with the function (non-OO) interface. -#### -'save_parameters' => <<'END_OF_FUNC', -sub save_parameters { - my $fh = shift; - return save(to_filehandle($fh)); -} -END_OF_FUNC - -#### Method: restore_parameters -# A way to restore CGI parameters from an initializer. -# Only intended to be used with the function (non-OO) interface. -#### -'restore_parameters' => <<'END_OF_FUNC', -sub restore_parameters { - $Q = $CGI::DefaultClass->new(@_); -} -END_OF_FUNC - -#### Method: multipart_init -# Return a Content-Type: style header for server-push -# This has to be NPH on most web servers, and it is advisable to set $| = 1 -# -# Many thanks to Ed Jordan for this -# contribution, updated by Andrew Benham (adsb@bigfoot.com) -#### -'multipart_init' => <<'END_OF_FUNC', -sub multipart_init { - my($self,@p) = self_or_default(@_); - my($boundary,@other) = rearrange([BOUNDARY],@p); - $boundary = $boundary || '------- =_aaaaaaaaaa0'; - $self->{'separator'} = "$CRLF--$boundary$CRLF"; - $self->{'final_separator'} = "$CRLF--$boundary--$CRLF"; - $type = SERVER_PUSH($boundary); - return $self->header( - -nph => 1, - -type => $type, - (map { split "=", $_, 2 } @other), - ) . "WARNING: YOUR BROWSER DOESN'T SUPPORT THIS SERVER-PUSH TECHNOLOGY." . $self->multipart_end; -} -END_OF_FUNC - - -#### Method: multipart_start -# Return a Content-Type: style header for server-push, start of section -# -# Many thanks to Ed Jordan for this -# contribution, updated by Andrew Benham (adsb@bigfoot.com) -#### -'multipart_start' => <<'END_OF_FUNC', -sub multipart_start { - my(@header); - my($self,@p) = self_or_default(@_); - my($type,@other) = rearrange([TYPE],@p); - $type = $type || 'text/html'; - push(@header,"Content-Type: $type"); - - # rearrange() was designed for the HTML portion, so we - # need to fix it up a little. - foreach (@other) { - next unless my($header,$value) = /([^\s=]+)=\"?(.+?)\"?$/; - ($_ = $header) =~ s/^(\w)(.*)/$1 . lc ($2) . ': '.$self->unescapeHTML($value)/e; - } - push(@header,@other); - my $header = join($CRLF,@header)."${CRLF}${CRLF}"; - return $header; -} -END_OF_FUNC - - -#### Method: multipart_end -# Return a MIME boundary separator for server-push, end of section -# -# Many thanks to Ed Jordan for this -# contribution -#### -'multipart_end' => <<'END_OF_FUNC', -sub multipart_end { - my($self,@p) = self_or_default(@_); - return $self->{'separator'}; -} -END_OF_FUNC - - -#### Method: multipart_final -# Return a MIME boundary separator for server-push, end of all sections -# -# Contributed by Andrew Benham (adsb@bigfoot.com) -#### -'multipart_final' => <<'END_OF_FUNC', -sub multipart_final { - my($self,@p) = self_or_default(@_); - return $self->{'final_separator'} . "WARNING: YOUR BROWSER DOESN'T SUPPORT THIS SERVER-PUSH TECHNOLOGY." . $CRLF; -} -END_OF_FUNC - - -#### Method: header -# Return a Content-Type: style header -# -#### -'header' => <<'END_OF_FUNC', -sub header { - my($self,@p) = self_or_default(@_); - my(@header); - - return undef if $self->{'.header_printed'}++ and $HEADERS_ONCE; - - my($type,$status,$cookie,$target,$expires,$nph,$charset,$attachment,@other) = - rearrange([['TYPE','CONTENT_TYPE','CONTENT-TYPE'], - 'STATUS',['COOKIE','COOKIES'],'TARGET', - 'EXPIRES','NPH','CHARSET', - 'ATTACHMENT'],@p); - - $nph ||= $NPH; - if (defined $charset) { - $self->charset($charset); - } else { - $charset = $self->charset; - } - - # rearrange() was designed for the HTML portion, so we - # need to fix it up a little. - foreach (@other) { - next unless my($header,$value) = /([^\s=]+)=\"?(.+?)\"?$/; - ($_ = $header) =~ s/^(\w)(.*)/$1 . lc ($2) . ': '.$self->unescapeHTML($value)/e; - } - - $type ||= 'text/html' unless defined($type); - $type .= "; charset=$charset" if $type ne '' and $type =~ m!^text/! and $type !~ /\bcharset\b/; - - # Maybe future compatibility. Maybe not. - my $protocol = $ENV{SERVER_PROTOCOL} || 'HTTP/1.0'; - push(@header,$protocol . ' ' . ($status || '200 OK')) if $nph; - push(@header,"Server: " . &server_software()) if $nph; - - push(@header,"Status: $status") if $status; - push(@header,"Window-Target: $target") if $target; - # push all the cookies -- there may be several - if ($cookie) { - my(@cookie) = ref($cookie) && ref($cookie) eq 'ARRAY' ? @{$cookie} : $cookie; - foreach (@cookie) { - my $cs = UNIVERSAL::isa($_,'CGI::Cookie') ? $_->as_string : $_; - push(@header,"Set-Cookie: $cs") if $cs ne ''; - } - } - # if the user indicates an expiration time, then we need - # both an Expires and a Date header (so that the browser is - # uses OUR clock) - push(@header,"Expires: " . expires($expires,'http')) - if $expires; - push(@header,"Date: " . expires(0,'http')) if $expires || $cookie || $nph; - push(@header,"Pragma: no-cache") if $self->cache(); - push(@header,"Content-Disposition: attachment; filename=\"$attachment\"") if $attachment; - push(@header,@other); - push(@header,"Content-Type: $type") if $type ne ''; - - my $header = join($CRLF,@header)."${CRLF}${CRLF}"; - if ($MOD_PERL and not $nph) { - my $r = Apache->request; - $r->send_cgi_header($header); - return ''; - } - return $header; -} -END_OF_FUNC - - -#### Method: cache -# Control whether header() will produce the no-cache -# Pragma directive. -#### -'cache' => <<'END_OF_FUNC', -sub cache { - my($self,$new_value) = self_or_default(@_); - $new_value = '' unless $new_value; - if ($new_value ne '') { - $self->{'cache'} = $new_value; - } - return $self->{'cache'}; -} -END_OF_FUNC - - -#### Method: redirect -# Return a Location: style header -# -#### -'redirect' => <<'END_OF_FUNC', -sub redirect { - my($self,@p) = self_or_default(@_); - my($url,$target,$cookie,$nph,@other) = rearrange([[LOCATION,URI,URL],TARGET,COOKIE,NPH],@p); - $url ||= $self->self_url; - my(@o); - foreach (@other) { tr/\"//d; push(@o,split("=",$_,2)); } - unshift(@o, - '-Status'=>'302 Moved', - '-Location'=>$url, - '-nph'=>$nph); - unshift(@o,'-Target'=>$target) if $target; - unshift(@o,'-Cookie'=>$cookie) if $cookie; - unshift(@o,'-Type'=>''); - return $self->header(@o); -} -END_OF_FUNC - - -#### Method: start_html -# Canned HTML header -# -# Parameters: -# $title -> (optional) The title for this HTML document (-title) -# $author -> (optional) e-mail address of the author (-author) -# $base -> (optional) if set to true, will enter the BASE address of this document -# for resolving relative references (-base) -# $xbase -> (optional) alternative base at some remote location (-xbase) -# $target -> (optional) target window to load all links into (-target) -# $script -> (option) Javascript code (-script) -# $no_script -> (option) Javascript -END - ; - my($other) = @other ? " @other" : ''; - push(@result,""); - return join("\n",@result); -} -END_OF_FUNC - -### Method: _style -# internal method for generating a CSS style section -#### -'_style' => <<'END_OF_FUNC', -sub _style { - my ($self,$style) = @_; - my (@result); - my $type = 'text/css'; - - my $cdata_start = $XHTML ? "\n\n" : " -->\n"; - - if (ref($style)) { - my($src,$code,$stype,@other) = - rearrange([SRC,CODE,TYPE], - '-foo'=>'bar', # a trick to allow the '-' to be omitted - ref($style) eq 'ARRAY' ? @$style : %$style); - $type = $stype if $stype; - if (ref($src) eq "ARRAY") # Check to see if the $src variable is an array reference - { # If it is, push a LINK tag for each one. - foreach $src (@$src) - { - push(@result,$XHTML ? qq() - : qq(/)) if $src; - } - } - else - { # Otherwise, push the single -src, if it exists. - push(@result,$XHTML ? qq() - : qq() - ) if $src; - } - push(@result,style({'type'=>$type},"$cdata_start\n$code\n$cdata_end")) if $code; - } else { - push(@result,style({'type'=>$type},"$cdata_start\n$style\n$cdata_end")); - } - @result; -} -END_OF_FUNC - -'_script' => <<'END_OF_FUNC', -sub _script { - my ($self,$script) = @_; - my (@result); - - my (@scripts) = ref($script) eq 'ARRAY' ? @$script : ($script); - foreach $script (@scripts) { - my($src,$code,$language); - if (ref($script)) { # script is a hash - ($src,$code,$language, $type) = - rearrange([SRC,CODE,LANGUAGE,TYPE], - '-foo'=>'bar', # a trick to allow the '-' to be omitted - ref($script) eq 'ARRAY' ? @$script : %$script); - # User may not have specified language - $language ||= 'JavaScript'; - unless (defined $type) { - $type = lc $language; - # strip '1.2' from 'javascript1.2' - $type =~ s/^(\D+).*$/text\/$1/; - } - } else { - ($src,$code,$language, $type) = ('',$script,'JavaScript', 'text/javascript'); - } - - my $comment = '//'; # javascript by default - $comment = '#' if $type=~/perl|tcl/i; - $comment = "'" if $type=~/vbscript/i; - - my $cdata_start = "\n\n"; - - my(@satts); - push(@satts,'src'=>$src) if $src; - push(@satts,'language'=>$language); - push(@satts,'type'=>$type); - $code = "$cdata_start$code$cdata_end" if defined $code; - push(@result,script({@satts},$code || '')); - } - @result; -} -END_OF_FUNC - -#### Method: end_html -# End an HTML document. -# Trivial method for completeness. Just returns "" -#### -'end_html' => <<'END_OF_FUNC', -sub end_html { - return ""; -} -END_OF_FUNC - - -################################ -# METHODS USED IN BUILDING FORMS -################################ - -#### Method: isindex -# Just prints out the isindex tag. -# Parameters: -# $action -> optional URL of script to run -# Returns: -# A string containing a tag -'isindex' => <<'END_OF_FUNC', -sub isindex { - my($self,@p) = self_or_default(@_); - my($action,@other) = rearrange([ACTION],@p); - $action = qq/action="$action"/ if $action; - my($other) = @other ? " @other" : ''; - return $XHTML ? "" : ""; -} -END_OF_FUNC - - -#### Method: startform -# Start a form -# Parameters: -# $method -> optional submission method to use (GET or POST) -# $action -> optional URL of script to run -# $enctype ->encoding to use (URL_ENCODED or MULTIPART) -'startform' => <<'END_OF_FUNC', -sub startform { - my($self,@p) = self_or_default(@_); - - my($method,$action,$enctype,@other) = - rearrange([METHOD,ACTION,ENCTYPE],@p); - - $method = lc($method) || 'post'; - $enctype = $enctype || &URL_ENCODED; - unless (defined $action) { - $action = $self->url(-absolute=>1,-path=>1); - $action .= "?$ENV{QUERY_STRING}" if $ENV{QUERY_STRING}; - } - $action = qq(action="$action"); - my($other) = @other ? " @other" : ''; - $self->{'.parametersToAdd'}={}; - return qq/
    \n/; -} -END_OF_FUNC - - -#### Method: start_form -# synonym for startform -'start_form' => <<'END_OF_FUNC', -sub start_form { - &startform; -} -END_OF_FUNC - -'end_multipart_form' => <<'END_OF_FUNC', -sub end_multipart_form { - &endform; -} -END_OF_FUNC - -#### Method: start_multipart_form -# synonym for startform -'start_multipart_form' => <<'END_OF_FUNC', -sub start_multipart_form { - my($self,@p) = self_or_default(@_); - if (defined($param[0]) && substr($param[0],0,1) eq '-') { - my(%p) = @p; - $p{'-enctype'}=&MULTIPART; - return $self->startform(%p); - } else { - my($method,$action,@other) = - rearrange([METHOD,ACTION],@p); - return $self->startform($method,$action,&MULTIPART,@other); - } -} -END_OF_FUNC - - -#### Method: endform -# End a form -'endform' => <<'END_OF_FUNC', -sub endform { - my($self,@p) = self_or_default(@_); - if ( $NOSTICKY ) { - return wantarray ? ("
    ") : "\n"; - } else { - return wantarray ? ($self->get_fields,"") : - $self->get_fields ."\n"; - } -} -END_OF_FUNC - - -#### Method: end_form -# synonym for endform -'end_form' => <<'END_OF_FUNC', -sub end_form { - &endform; -} -END_OF_FUNC - - -'_textfield' => <<'END_OF_FUNC', -sub _textfield { - my($self,$tag,@p) = self_or_default(@_); - my($name,$default,$size,$maxlength,$override,@other) = - rearrange([NAME,[DEFAULT,VALUE],SIZE,MAXLENGTH,[OVERRIDE,FORCE]],@p); - - my $current = $override ? $default : - (defined($self->param($name)) ? $self->param($name) : $default); - - $current = defined($current) ? $self->escapeHTML($current,1) : ''; - $name = defined($name) ? $self->escapeHTML($name) : ''; - my($s) = defined($size) ? qq/ size="$size"/ : ''; - my($m) = defined($maxlength) ? qq/ maxlength="$maxlength"/ : ''; - my($other) = @other ? " @other" : ''; - # this entered at cristy's request to fix problems with file upload fields - # and WebTV -- not sure it won't break stuff - my($value) = $current ne '' ? qq(value="$current") : ''; - return $XHTML ? qq() - : qq//; -} -END_OF_FUNC - -#### Method: textfield -# Parameters: -# $name -> Name of the text field -# $default -> Optional default value of the field if not -# already defined. -# $size -> Optional width of field in characaters. -# $maxlength -> Optional maximum number of characters. -# Returns: -# A string containing a field -# -'textfield' => <<'END_OF_FUNC', -sub textfield { - my($self,@p) = self_or_default(@_); - $self->_textfield('text',@p); -} -END_OF_FUNC - - -#### Method: filefield -# Parameters: -# $name -> Name of the file upload field -# $size -> Optional width of field in characaters. -# $maxlength -> Optional maximum number of characters. -# Returns: -# A string containing a field -# -'filefield' => <<'END_OF_FUNC', -sub filefield { - my($self,@p) = self_or_default(@_); - $self->_textfield('file',@p); -} -END_OF_FUNC - - -#### Method: password -# Create a "secret password" entry field -# Parameters: -# $name -> Name of the field -# $default -> Optional default value of the field if not -# already defined. -# $size -> Optional width of field in characters. -# $maxlength -> Optional maximum characters that can be entered. -# Returns: -# A string containing a field -# -'password_field' => <<'END_OF_FUNC', -sub password_field { - my ($self,@p) = self_or_default(@_); - $self->_textfield('password',@p); -} -END_OF_FUNC - -#### Method: textarea -# Parameters: -# $name -> Name of the text field -# $default -> Optional default value of the field if not -# already defined. -# $rows -> Optional number of rows in text area -# $columns -> Optional number of columns in text area -# Returns: -# A string containing a tag -# -'textarea' => <<'END_OF_FUNC', -sub textarea { - my($self,@p) = self_or_default(@_); - - my($name,$default,$rows,$cols,$override,@other) = - rearrange([NAME,[DEFAULT,VALUE],ROWS,[COLS,COLUMNS],[OVERRIDE,FORCE]],@p); - - my($current)= $override ? $default : - (defined($self->param($name)) ? $self->param($name) : $default); - - $name = defined($name) ? $self->escapeHTML($name) : ''; - $current = defined($current) ? $self->escapeHTML($current) : ''; - my($r) = $rows ? " rows=$rows" : ''; - my($c) = $cols ? " cols=$cols" : ''; - my($other) = @other ? " @other" : ''; - return qq{}; -} -END_OF_FUNC - - -#### Method: button -# Create a javascript button. -# Parameters: -# $name -> (optional) Name for the button. (-name) -# $value -> (optional) Value of the button when selected (and visible name) (-value) -# $onclick -> (optional) Text of the JavaScript to run when the button is -# clicked. -# Returns: -# A string containing a tag -#### -'button' => <<'END_OF_FUNC', -sub button { - my($self,@p) = self_or_default(@_); - - my($label,$value,$script,@other) = rearrange([NAME,[VALUE,LABEL], - [ONCLICK,SCRIPT]],@p); - - $label=$self->escapeHTML($label); - $value=$self->escapeHTML($value,1); - $script=$self->escapeHTML($script); - - my($name) = ''; - $name = qq/ name="$label"/ if $label; - $value = $value || $label; - my($val) = ''; - $val = qq/ value="$value"/ if $value; - $script = qq/ onclick="$script"/ if $script; - my($other) = @other ? " @other" : ''; - return $XHTML ? qq() - : qq//; -} -END_OF_FUNC - - -#### Method: submit -# Create a "submit query" button. -# Parameters: -# $name -> (optional) Name for the button. -# $value -> (optional) Value of the button when selected (also doubles as label). -# $label -> (optional) Label printed on the button(also doubles as the value). -# Returns: -# A string containing a tag -#### -'submit' => <<'END_OF_FUNC', -sub submit { - my($self,@p) = self_or_default(@_); - - my($label,$value,@other) = rearrange([NAME,[VALUE,LABEL]],@p); - - $label=$self->escapeHTML($label); - $value=$self->escapeHTML($value,1); - - my($name) = ' name=".submit"' unless $NOSTICKY; - $name = qq/ name="$label"/ if defined($label); - $value = defined($value) ? $value : $label; - my($val) = ''; - $val = qq/ value="$value"/ if defined($value); - my($other) = @other ? " @other" : ''; - return $XHTML ? qq() - : qq//; -} -END_OF_FUNC - - -#### Method: reset -# Create a "reset" button. -# Parameters: -# $name -> (optional) Name for the button. -# Returns: -# A string containing a tag -#### -'reset' => <<'END_OF_FUNC', -sub reset { - my($self,@p) = self_or_default(@_); - my($label,@other) = rearrange([NAME],@p); - $label=$self->escapeHTML($label); - my($value) = defined($label) ? qq/ value="$label"/ : ''; - my($other) = @other ? " @other" : ''; - return $XHTML ? qq() - : qq//; -} -END_OF_FUNC - - -#### Method: defaults -# Create a "defaults" button. -# Parameters: -# $name -> (optional) Name for the button. -# Returns: -# A string containing a tag -# -# Note: this button has a special meaning to the initialization script, -# and tells it to ERASE the current query string so that your defaults -# are used again! -#### -'defaults' => <<'END_OF_FUNC', -sub defaults { - my($self,@p) = self_or_default(@_); - - my($label,@other) = rearrange([[NAME,VALUE]],@p); - - $label=$self->escapeHTML($label,1); - $label = $label || "Defaults"; - my($value) = qq/ value="$label"/; - my($other) = @other ? " @other" : ''; - return $XHTML ? qq() - : qq//; -} -END_OF_FUNC - - -#### Method: comment -# Create an HTML -# Parameters: a string -'comment' => <<'END_OF_FUNC', -sub comment { - my($self,@p) = self_or_CGI(@_); - return ""; -} -END_OF_FUNC - -#### Method: checkbox -# Create a checkbox that is not logically linked to any others. -# The field value is "on" when the button is checked. -# Parameters: -# $name -> Name of the checkbox -# $checked -> (optional) turned on by default if true -# $value -> (optional) value of the checkbox, 'on' by default -# $label -> (optional) a user-readable label printed next to the box. -# Otherwise the checkbox name is used. -# Returns: -# A string containing a field -#### -'checkbox' => <<'END_OF_FUNC', -sub checkbox { - my($self,@p) = self_or_default(@_); - - my($name,$checked,$value,$label,$override,@other) = - rearrange([NAME,[CHECKED,SELECTED,ON],VALUE,LABEL,[OVERRIDE,FORCE]],@p); - - $value = defined $value ? $value : 'on'; - - if (!$override && ($self->{'.fieldnames'}->{$name} || - defined $self->param($name))) { - $checked = grep($_ eq $value,$self->param($name)) ? ' checked' : ''; - } else { - $checked = $checked ? qq/ checked/ : ''; - } - my($the_label) = defined $label ? $label : $name; - $name = $self->escapeHTML($name); - $value = $self->escapeHTML($value,1); - $the_label = $self->escapeHTML($the_label); - my($other) = @other ? " @other" : ''; - $self->register_parameter($name); - return $XHTML ? qq{$the_label} - : qq{$the_label}; -} -END_OF_FUNC - - -#### Method: checkbox_group -# Create a list of logically-linked checkboxes. -# Parameters: -# $name -> Common name for all the check boxes -# $values -> A pointer to a regular array containing the -# values for each checkbox in the group. -# $defaults -> (optional) -# 1. If a pointer to a regular array of checkbox values, -# then this will be used to decide which -# checkboxes to turn on by default. -# 2. If a scalar, will be assumed to hold the -# value of a single checkbox in the group to turn on. -# $linebreak -> (optional) Set to true to place linebreaks -# between the buttons. -# $labels -> (optional) -# A pointer to an associative array of labels to print next to each checkbox -# in the form $label{'value'}="Long explanatory label". -# Otherwise the provided values are used as the labels. -# Returns: -# An ARRAY containing a series of fields -#### -'checkbox_group' => <<'END_OF_FUNC', -sub checkbox_group { - my($self,@p) = self_or_default(@_); - - my($name,$values,$defaults,$linebreak,$labels,$rows,$columns, - $rowheaders,$colheaders,$override,$nolabels,@other) = - rearrange([NAME,[VALUES,VALUE],[DEFAULTS,DEFAULT], - LINEBREAK,LABELS,ROWS,[COLUMNS,COLS], - ROWHEADERS,COLHEADERS, - [OVERRIDE,FORCE],NOLABELS],@p); - - my($checked,$break,$result,$label); - - my(%checked) = $self->previous_or_default($name,$defaults,$override); - - if ($linebreak) { - $break = $XHTML ? "
    " : "
    "; - } - else { - $break = ''; - } - $name=$self->escapeHTML($name); - - # Create the elements - my(@elements,@values); - - @values = $self->_set_values_and_labels($values,\$labels,$name); - - my($other) = @other ? " @other" : ''; - foreach (@values) { - $checked = $checked{$_} ? qq/ checked/ : ''; - $label = ''; - unless (defined($nolabels) && $nolabels) { - $label = $_; - $label = $labels->{$_} if defined($labels) && defined($labels->{$_}); - $label = $self->escapeHTML($label); - } - $_ = $self->escapeHTML($_,1); - push(@elements,$XHTML ? qq(${label}${break}) - : qq/${label}${break}/); - } - $self->register_parameter($name); - return wantarray ? @elements : join(' ',@elements) - unless defined($columns) || defined($rows); - return _tableize($rows,$columns,$rowheaders,$colheaders,@elements); -} -END_OF_FUNC - -# Escape HTML -- used internally -'escapeHTML' => <<'END_OF_FUNC', -sub escapeHTML { - my ($self,$toencode,$newlinestoo) = CGI::self_or_default(@_); - return undef unless defined($toencode); - return $toencode if ref($self) && $self->{'dontescape'}; - $toencode =~ s{&}{&}gso; - $toencode =~ s{<}{<}gso; - $toencode =~ s{>}{>}gso; - $toencode =~ s{"}{"}gso; - my $latin = uc $self->{'.charset'} eq 'ISO-8859-1' || - uc $self->{'.charset'} eq 'WINDOWS-1252'; - if ($latin) { # bug in some browsers - $toencode =~ s{'}{'}gso; - $toencode =~ s{\x8b}{‹}gso; - $toencode =~ s{\x9b}{›}gso; - if (defined $newlinestoo && $newlinestoo) { - $toencode =~ s{\012}{ }gso; - $toencode =~ s{\015}{ }gso; - } - } - return $toencode; -} -END_OF_FUNC - -# unescape HTML -- used internally -'unescapeHTML' => <<'END_OF_FUNC', -sub unescapeHTML { - my ($self,$string) = CGI::self_or_default(@_); - return undef unless defined($string); - my $latin = defined $self->{'.charset'} ? $self->{'.charset'} =~ /^(ISO-8859-1|WINDOWS-1252)$/i - : 1; - # thanks to Randal Schwartz for the correct solution to this one - $string=~ s[&(.*?);]{ - local $_ = $1; - /^amp$/i ? "&" : - /^quot$/i ? '"' : - /^gt$/i ? ">" : - /^lt$/i ? "<" : - /^#(\d+)$/ && $latin ? chr($1) : - /^#x([0-9a-f]+)$/i && $latin ? chr(hex($1)) : - $_ - }gex; - return $string; -} -END_OF_FUNC - -# Internal procedure - don't use -'_tableize' => <<'END_OF_FUNC', -sub _tableize { - my($rows,$columns,$rowheaders,$colheaders,@elements) = @_; - $rowheaders = [] unless defined $rowheaders; - $colheaders = [] unless defined $colheaders; - my($result); - - if (defined($columns)) { - $rows = int(0.99 + @elements/$columns) unless defined($rows); - } - if (defined($rows)) { - $columns = int(0.99 + @elements/$rows) unless defined($columns); - } - - # rearrange into a pretty table - $result = ""; - my($row,$column); - unshift(@$colheaders,'') if @$colheaders && @$rowheaders; - $result .= "" if @{$colheaders}; - foreach (@{$colheaders}) { - $result .= ""; - } - for ($row=0;$row<$rows;$row++) { - $result .= ""; - $result .= "" if @$rowheaders; - for ($column=0;$column<$columns;$column++) { - $result .= "" - if defined($elements[$column*$rows + $row]); - } - $result .= ""; - } - $result .= "
    $_
    $rowheaders->[$row]" . $elements[$column*$rows + $row] . "
    "; - return $result; -} -END_OF_FUNC - - -#### Method: radio_group -# Create a list of logically-linked radio buttons. -# Parameters: -# $name -> Common name for all the buttons. -# $values -> A pointer to a regular array containing the -# values for each button in the group. -# $default -> (optional) Value of the button to turn on by default. Pass '-' -# to turn _nothing_ on. -# $linebreak -> (optional) Set to true to place linebreaks -# between the buttons. -# $labels -> (optional) -# A pointer to an associative array of labels to print next to each checkbox -# in the form $label{'value'}="Long explanatory label". -# Otherwise the provided values are used as the labels. -# Returns: -# An ARRAY containing a series of fields -#### -'radio_group' => <<'END_OF_FUNC', -sub radio_group { - my($self,@p) = self_or_default(@_); - - my($name,$values,$default,$linebreak,$labels, - $rows,$columns,$rowheaders,$colheaders,$override,$nolabels,@other) = - rearrange([NAME,[VALUES,VALUE],DEFAULT,LINEBREAK,LABELS, - ROWS,[COLUMNS,COLS], - ROWHEADERS,COLHEADERS, - [OVERRIDE,FORCE],NOLABELS],@p); - my($result,$checked); - - if (!$override && defined($self->param($name))) { - $checked = $self->param($name); - } else { - $checked = $default; - } - my(@elements,@values); - @values = $self->_set_values_and_labels($values,\$labels,$name); - - # If no check array is specified, check the first by default - $checked = $values[0] unless defined($checked) && $checked ne ''; - $name=$self->escapeHTML($name); - - my($other) = @other ? " @other" : ''; - foreach (@values) { - my($checkit) = $checked eq $_ ? qq/ checked/ : ''; - my($break); - if ($linebreak) { - $break = $XHTML ? "
    " : "
    "; - } - else { - $break = ''; - } - my($label)=''; - unless (defined($nolabels) && $nolabels) { - $label = $_; - $label = $labels->{$_} if defined($labels) && defined($labels->{$_}); - $label = $self->escapeHTML($label,1); - } - $_=$self->escapeHTML($_); - push(@elements,$XHTML ? qq(${label}${break}) - : qq/${label}${break}/); - } - $self->register_parameter($name); - return wantarray ? @elements : join(' ',@elements) - unless defined($columns) || defined($rows); - return _tableize($rows,$columns,$rowheaders,$colheaders,@elements); -} -END_OF_FUNC - - -#### Method: popup_menu -# Create a popup menu. -# Parameters: -# $name -> Name for all the menu -# $values -> A pointer to a regular array containing the -# text of each menu item. -# $default -> (optional) Default item to display -# $labels -> (optional) -# A pointer to an associative array of labels to print next to each checkbox -# in the form $label{'value'}="Long explanatory label". -# Otherwise the provided values are used as the labels. -# Returns: -# A string containing the definition of a popup menu. -#### -'popup_menu' => <<'END_OF_FUNC', -sub popup_menu { - my($self,@p) = self_or_default(@_); - - my($name,$values,$default,$labels,$override,@other) = - rearrange([NAME,[VALUES,VALUE],[DEFAULT,DEFAULTS],LABELS,[OVERRIDE,FORCE]],@p); - my($result,$selected); - - if (!$override && defined($self->param($name))) { - $selected = $self->param($name); - } else { - $selected = $default; - } - $name=$self->escapeHTML($name); - my($other) = @other ? " @other" : ''; - - my(@values); - @values = $self->_set_values_and_labels($values,\$labels,$name); - - $result = qq/\n"; - return $result; -} -END_OF_FUNC - - -#### Method: scrolling_list -# Create a scrolling list. -# Parameters: -# $name -> name for the list -# $values -> A pointer to a regular array containing the -# values for each option line in the list. -# $defaults -> (optional) -# 1. If a pointer to a regular array of options, -# then this will be used to decide which -# lines to turn on by default. -# 2. Otherwise holds the value of the single line to turn on. -# $size -> (optional) Size of the list. -# $multiple -> (optional) If set, allow multiple selections. -# $labels -> (optional) -# A pointer to an associative array of labels to print next to each checkbox -# in the form $label{'value'}="Long explanatory label". -# Otherwise the provided values are used as the labels. -# Returns: -# A string containing the definition of a scrolling list. -#### -'scrolling_list' => <<'END_OF_FUNC', -sub scrolling_list { - my($self,@p) = self_or_default(@_); - my($name,$values,$defaults,$size,$multiple,$labels,$override,@other) - = rearrange([NAME,[VALUES,VALUE],[DEFAULTS,DEFAULT], - SIZE,MULTIPLE,LABELS,[OVERRIDE,FORCE]],@p); - - my($result,@values); - @values = $self->_set_values_and_labels($values,\$labels,$name); - - $size = $size || scalar(@values); - - my(%selected) = $self->previous_or_default($name,$defaults,$override); - my($is_multiple) = $multiple ? qq/ multiple/ : ''; - my($has_size) = $size ? qq/ size="$size"/: ''; - my($other) = @other ? " @other" : ''; - - $name=$self->escapeHTML($name); - $result = qq/\n"; - $self->register_parameter($name); - return $result; -} -END_OF_FUNC - - -#### Method: hidden -# Parameters: -# $name -> Name of the hidden field -# @default -> (optional) Initial values of field (may be an array) -# or -# $default->[initial values of field] -# Returns: -# A string containing a -#### -'hidden' => <<'END_OF_FUNC', -sub hidden { - my($self,@p) = self_or_default(@_); - - # this is the one place where we departed from our standard - # calling scheme, so we have to special-case (darn) - my(@result,@value); - my($name,$default,$override,@other) = - rearrange([NAME,[DEFAULT,VALUE,VALUES],[OVERRIDE,FORCE]],@p); - - my $do_override = 0; - if ( ref($p[0]) || substr($p[0],0,1) eq '-') { - @value = ref($default) ? @{$default} : $default; - $do_override = $override; - } else { - foreach ($default,$override,@other) { - push(@value,$_) if defined($_); - } - } - - # use previous values if override is not set - my @prev = $self->param($name); - @value = @prev if !$do_override && @prev; - - $name=$self->escapeHTML($name); - foreach (@value) { - $_ = defined($_) ? $self->escapeHTML($_,1) : ''; - push @result,$XHTML ? qq() - : qq(); - } - return wantarray ? @result : join('',@result); -} -END_OF_FUNC - - -#### Method: image_button -# Parameters: -# $name -> Name of the button -# $src -> URL of the image source -# $align -> Alignment style (TOP, BOTTOM or MIDDLE) -# Returns: -# A string containing a -#### -'image_button' => <<'END_OF_FUNC', -sub image_button { - my($self,@p) = self_or_default(@_); - - my($name,$src,$alignment,@other) = - rearrange([NAME,SRC,ALIGN],@p); - - my($align) = $alignment ? " align=\U$alignment" : ''; - my($other) = @other ? " @other" : ''; - $name=$self->escapeHTML($name); - return $XHTML ? qq() - : qq//; -} -END_OF_FUNC - - -#### Method: self_url -# Returns a URL containing the current script and all its -# param/value pairs arranged as a query. You can use this -# to create a link that, when selected, will reinvoke the -# script with all its state information preserved. -#### -'self_url' => <<'END_OF_FUNC', -sub self_url { - my($self,@p) = self_or_default(@_); - return $self->url('-path_info'=>1,'-query'=>1,'-full'=>1,@p); -} -END_OF_FUNC - - -# This is provided as a synonym to self_url() for people unfortunate -# enough to have incorporated it into their programs already! -'state' => <<'END_OF_FUNC', -sub state { - &self_url; -} -END_OF_FUNC - - -#### Method: url -# Like self_url, but doesn't return the query string part of -# the URL. -#### -'url' => <<'END_OF_FUNC', -sub url { - my($self,@p) = self_or_default(@_); - my ($relative,$absolute,$full,$path_info,$query,$base) = - rearrange(['RELATIVE','ABSOLUTE','FULL',['PATH','PATH_INFO'],['QUERY','QUERY_STRING'],'BASE'],@p); - my $url; - $full++ if $base || !($relative || $absolute); - - my $path = $self->path_info; - my $script_name = $self->script_name; - -# If anybody knows why I ever wrote this please tell me! -# if (exists($ENV{REQUEST_URI})) { -# my $index; -# $script_name = $ENV{REQUEST_URI}; -# # strip query string -# substr($script_name,$index) = '' if ($index = index($script_name,'?')) >= 0; -# # and path -# if (exists($ENV{PATH_INFO})) { -# (my $encoded_path = $ENV{PATH_INFO}) =~ s!([^a-zA-Z0-9_./-])!uc sprintf("%%%02x",ord($1))!eg;; -# substr($script_name,$index) = '' if ($index = rindex($script_name,$encoded_path)) >= 0; -# } -# } else { -# $script_name = $self->script_name; -# } - - if ($full) { - my $protocol = $self->protocol(); - $url = "$protocol://"; - my $vh = http('host'); - if ($vh) { - $url .= $vh; - } else { - $url .= server_name(); - my $port = $self->server_port; - $url .= ":" . $port - unless (lc($protocol) eq 'http' && $port == 80) - || (lc($protocol) eq 'https' && $port == 443); - } - return $url if $base; - $url .= $script_name; - } elsif ($relative) { - ($url) = $script_name =~ m!([^/]+)$!; - } elsif ($absolute) { - $url = $script_name; - } - - $url .= $path if $path_info and defined $path; - $url .= "?" . $self->query_string if $query and $self->query_string; - $url = '' unless defined $url; - $url =~ s/([^a-zA-Z0-9_.%;&?\/\\:+=~-])/uc sprintf("%%%02x",ord($1))/eg; - return $url; -} - -END_OF_FUNC - -#### Method: cookie -# Set or read a cookie from the specified name. -# Cookie can then be passed to header(). -# Usual rules apply to the stickiness of -value. -# Parameters: -# -name -> name for this cookie (optional) -# -value -> value of this cookie (scalar, array or hash) -# -path -> paths for which this cookie is valid (optional) -# -domain -> internet domain in which this cookie is valid (optional) -# -secure -> if true, cookie only passed through secure channel (optional) -# -expires -> expiry date in format Wdy, DD-Mon-YYYY HH:MM:SS GMT (optional) -#### -'cookie' => <<'END_OF_FUNC', -sub cookie { - my($self,@p) = self_or_default(@_); - my($name,$value,$path,$domain,$secure,$expires) = - rearrange([NAME,[VALUE,VALUES],PATH,DOMAIN,SECURE,EXPIRES],@p); - - require CGI::Cookie; - - # if no value is supplied, then we retrieve the - # value of the cookie, if any. For efficiency, we cache the parsed - # cookies in our state variables. - unless ( defined($value) ) { - $self->{'.cookies'} = CGI::Cookie->fetch - unless $self->{'.cookies'}; - - # If no name is supplied, then retrieve the names of all our cookies. - return () unless $self->{'.cookies'}; - return keys %{$self->{'.cookies'}} unless $name; - return () unless $self->{'.cookies'}->{$name}; - return $self->{'.cookies'}->{$name}->value if defined($name) && $name ne ''; - } - - # If we get here, we're creating a new cookie - return undef unless defined($name) && $name ne ''; # this is an error - - my @param; - push(@param,'-name'=>$name); - push(@param,'-value'=>$value); - push(@param,'-domain'=>$domain) if $domain; - push(@param,'-path'=>$path) if $path; - push(@param,'-expires'=>$expires) if $expires; - push(@param,'-secure'=>$secure) if $secure; - - return new CGI::Cookie(@param); -} -END_OF_FUNC - -'parse_keywordlist' => <<'END_OF_FUNC', -sub parse_keywordlist { - my($self,$tosplit) = @_; - $tosplit = unescape($tosplit); # unescape the keywords - $tosplit=~tr/+/ /; # pluses to spaces - my(@keywords) = split(/\s+/,$tosplit); - return @keywords; -} -END_OF_FUNC - -'param_fetch' => <<'END_OF_FUNC', -sub param_fetch { - my($self,@p) = self_or_default(@_); - my($name) = rearrange([NAME],@p); - unless (exists($self->{$name})) { - $self->add_parameter($name); - $self->{$name} = []; - } - - return $self->{$name}; -} -END_OF_FUNC - -############################################### -# OTHER INFORMATION PROVIDED BY THE ENVIRONMENT -############################################### - -#### Method: path_info -# Return the extra virtual path information provided -# after the URL (if any) -#### -'path_info' => <<'END_OF_FUNC', -sub path_info { - my ($self,$info) = self_or_default(@_); - if (defined($info)) { - $info = "/$info" if $info ne '' && substr($info,0,1) ne '/'; - $self->{'.path_info'} = $info; - } elsif (! defined($self->{'.path_info'}) ) { - $self->{'.path_info'} = defined($ENV{'PATH_INFO'}) ? - $ENV{'PATH_INFO'} : ''; - - # hack to fix broken path info in IIS - $self->{'.path_info'} =~ s/^\Q$ENV{'SCRIPT_NAME'}\E// if $IIS; - - } - return $self->{'.path_info'}; -} -END_OF_FUNC - - -#### Method: request_method -# Returns 'POST', 'GET', 'PUT' or 'HEAD' -#### -'request_method' => <<'END_OF_FUNC', -sub request_method { - return $ENV{'REQUEST_METHOD'}; -} -END_OF_FUNC - -#### Method: content_type -# Returns the content_type string -#### -'content_type' => <<'END_OF_FUNC', -sub content_type { - return $ENV{'CONTENT_TYPE'}; -} -END_OF_FUNC - -#### Method: path_translated -# Return the physical path information provided -# by the URL (if any) -#### -'path_translated' => <<'END_OF_FUNC', -sub path_translated { - return $ENV{'PATH_TRANSLATED'}; -} -END_OF_FUNC - - -#### Method: query_string -# Synthesize a query string from our current -# parameters -#### -'query_string' => <<'END_OF_FUNC', -sub query_string { - my($self) = self_or_default(@_); - my($param,$value,@pairs); - foreach $param ($self->param) { - my($eparam) = escape($param); - foreach $value ($self->param($param)) { - $value = escape($value); - next unless defined $value; - push(@pairs,"$eparam=$value"); - } - } - foreach (keys %{$self->{'.fieldnames'}}) { - push(@pairs,".cgifields=".escape("$_")); - } - return join($USE_PARAM_SEMICOLONS ? ';' : '&',@pairs); -} -END_OF_FUNC - - -#### Method: accept -# Without parameters, returns an array of the -# MIME types the browser accepts. -# With a single parameter equal to a MIME -# type, will return undef if the browser won't -# accept it, 1 if the browser accepts it but -# doesn't give a preference, or a floating point -# value between 0.0 and 1.0 if the browser -# declares a quantitative score for it. -# This handles MIME type globs correctly. -#### -'Accept' => <<'END_OF_FUNC', -sub Accept { - my($self,$search) = self_or_CGI(@_); - my(%prefs,$type,$pref,$pat); - - my(@accept) = split(',',$self->http('accept')); - - foreach (@accept) { - ($pref) = /q=(\d\.\d+|\d+)/; - ($type) = m#(\S+/[^;]+)#; - next unless $type; - $prefs{$type}=$pref || 1; - } - - return keys %prefs unless $search; - - # if a search type is provided, we may need to - # perform a pattern matching operation. - # The MIME types use a glob mechanism, which - # is easily translated into a perl pattern match - - # First return the preference for directly supported - # types: - return $prefs{$search} if $prefs{$search}; - - # Didn't get it, so try pattern matching. - foreach (keys %prefs) { - next unless /\*/; # not a pattern match - ($pat = $_) =~ s/([^\w*])/\\$1/g; # escape meta characters - $pat =~ s/\*/.*/g; # turn it into a pattern - return $prefs{$_} if $search=~/$pat/; - } -} -END_OF_FUNC - - -#### Method: user_agent -# If called with no parameters, returns the user agent. -# If called with one parameter, does a pattern match (case -# insensitive) on the user agent. -#### -'user_agent' => <<'END_OF_FUNC', -sub user_agent { - my($self,$match)=self_or_CGI(@_); - return $self->http('user_agent') unless $match; - return $self->http('user_agent') =~ /$match/i; -} -END_OF_FUNC - - -#### Method: raw_cookie -# Returns the magic cookies for the session. -# The cookies are not parsed or altered in any way, i.e. -# cookies are returned exactly as given in the HTTP -# headers. If a cookie name is given, only that cookie's -# value is returned, otherwise the entire raw cookie -# is returned. -#### -'raw_cookie' => <<'END_OF_FUNC', -sub raw_cookie { - my($self,$key) = self_or_CGI(@_); - - require CGI::Cookie; - - if (defined($key)) { - $self->{'.raw_cookies'} = CGI::Cookie->raw_fetch - unless $self->{'.raw_cookies'}; - - return () unless $self->{'.raw_cookies'}; - return () unless $self->{'.raw_cookies'}->{$key}; - return $self->{'.raw_cookies'}->{$key}; - } - return $self->http('cookie') || $ENV{'COOKIE'} || ''; -} -END_OF_FUNC - -#### Method: virtual_host -# Return the name of the virtual_host, which -# is not always the same as the server -###### -'virtual_host' => <<'END_OF_FUNC', -sub virtual_host { - my $vh = http('host') || server_name(); - $vh =~ s/:\d+$//; # get rid of port number - return $vh; -} -END_OF_FUNC - -#### Method: remote_host -# Return the name of the remote host, or its IP -# address if unavailable. If this variable isn't -# defined, it returns "localhost" for debugging -# purposes. -#### -'remote_host' => <<'END_OF_FUNC', -sub remote_host { - return $ENV{'REMOTE_HOST'} || $ENV{'REMOTE_ADDR'} - || 'localhost'; -} -END_OF_FUNC - - -#### Method: remote_addr -# Return the IP addr of the remote host. -#### -'remote_addr' => <<'END_OF_FUNC', -sub remote_addr { - return $ENV{'REMOTE_ADDR'} || '127.0.0.1'; -} -END_OF_FUNC - - -#### Method: script_name -# Return the partial URL to this script for -# self-referencing scripts. Also see -# self_url(), which returns a URL with all state information -# preserved. -#### -'script_name' => <<'END_OF_FUNC', -sub script_name { - return $ENV{'SCRIPT_NAME'} if defined($ENV{'SCRIPT_NAME'}); - # These are for debugging - return "/$0" unless $0=~/^\//; - return $0; -} -END_OF_FUNC - - -#### Method: referer -# Return the HTTP_REFERER: useful for generating -# a GO BACK button. -#### -'referer' => <<'END_OF_FUNC', -sub referer { - my($self) = self_or_CGI(@_); - return $self->http('referer'); -} -END_OF_FUNC - - -#### Method: server_name -# Return the name of the server -#### -'server_name' => <<'END_OF_FUNC', -sub server_name { - return $ENV{'SERVER_NAME'} || 'localhost'; -} -END_OF_FUNC - -#### Method: server_software -# Return the name of the server software -#### -'server_software' => <<'END_OF_FUNC', -sub server_software { - return $ENV{'SERVER_SOFTWARE'} || 'cmdline'; -} -END_OF_FUNC - -#### Method: server_port -# Return the tcp/ip port the server is running on -#### -'server_port' => <<'END_OF_FUNC', -sub server_port { - return $ENV{'SERVER_PORT'} || 80; # for debugging -} -END_OF_FUNC - -#### Method: server_protocol -# Return the protocol (usually HTTP/1.0) -#### -'server_protocol' => <<'END_OF_FUNC', -sub server_protocol { - return $ENV{'SERVER_PROTOCOL'} || 'HTTP/1.0'; # for debugging -} -END_OF_FUNC - -#### Method: http -# Return the value of an HTTP variable, or -# the list of variables if none provided -#### -'http' => <<'END_OF_FUNC', -sub http { - my ($self,$parameter) = self_or_CGI(@_); - return $ENV{$parameter} if $parameter=~/^HTTP/; - $parameter =~ tr/-/_/; - return $ENV{"HTTP_\U$parameter\E"} if $parameter; - my(@p); - foreach (keys %ENV) { - push(@p,$_) if /^HTTP/; - } - return @p; -} -END_OF_FUNC - -#### Method: https -# Return the value of HTTPS -#### -'https' => <<'END_OF_FUNC', -sub https { - local($^W)=0; - my ($self,$parameter) = self_or_CGI(@_); - return $ENV{HTTPS} unless $parameter; - return $ENV{$parameter} if $parameter=~/^HTTPS/; - $parameter =~ tr/-/_/; - return $ENV{"HTTPS_\U$parameter\E"} if $parameter; - my(@p); - foreach (keys %ENV) { - push(@p,$_) if /^HTTPS/; - } - return @p; -} -END_OF_FUNC - -#### Method: protocol -# Return the protocol (http or https currently) -#### -'protocol' => <<'END_OF_FUNC', -sub protocol { - local($^W)=0; - my $self = shift; - return 'https' if uc($self->https()) eq 'ON'; - return 'https' if $self->server_port == 443; - my $prot = $self->server_protocol; - my($protocol,$version) = split('/',$prot); - return "\L$protocol\E"; -} -END_OF_FUNC - -#### Method: remote_ident -# Return the identity of the remote user -# (but only if his host is running identd) -#### -'remote_ident' => <<'END_OF_FUNC', -sub remote_ident { - return $ENV{'REMOTE_IDENT'}; -} -END_OF_FUNC - - -#### Method: auth_type -# Return the type of use verification/authorization in use, if any. -#### -'auth_type' => <<'END_OF_FUNC', -sub auth_type { - return $ENV{'AUTH_TYPE'}; -} -END_OF_FUNC - - -#### Method: remote_user -# Return the authorization name used for user -# verification. -#### -'remote_user' => <<'END_OF_FUNC', -sub remote_user { - return $ENV{'REMOTE_USER'}; -} -END_OF_FUNC - - -#### Method: user_name -# Try to return the remote user's name by hook or by -# crook -#### -'user_name' => <<'END_OF_FUNC', -sub user_name { - my ($self) = self_or_CGI(@_); - return $self->http('from') || $ENV{'REMOTE_IDENT'} || $ENV{'REMOTE_USER'}; -} -END_OF_FUNC - -#### Method: nosticky -# Set or return the NOSTICKY global flag -#### -'nosticky' => <<'END_OF_FUNC', -sub nosticky { - my ($self,$param) = self_or_CGI(@_); - $CGI::NOSTICKY = $param if defined($param); - return $CGI::NOSTICKY; -} -END_OF_FUNC - -#### Method: nph -# Set or return the NPH global flag -#### -'nph' => <<'END_OF_FUNC', -sub nph { - my ($self,$param) = self_or_CGI(@_); - $CGI::NPH = $param if defined($param); - return $CGI::NPH; -} -END_OF_FUNC - -#### Method: private_tempfiles -# Set or return the private_tempfiles global flag -#### -'private_tempfiles' => <<'END_OF_FUNC', -sub private_tempfiles { - my ($self,$param) = self_or_CGI(@_); - $CGI::PRIVATE_TEMPFILES = $param if defined($param); - return $CGI::PRIVATE_TEMPFILES; -} -END_OF_FUNC - -#### Method: default_dtd -# Set or return the default_dtd global -#### -'default_dtd' => <<'END_OF_FUNC', -sub default_dtd { - my ($self,$param,$param2) = self_or_CGI(@_); - if (defined $param2 && defined $param) { - $CGI::DEFAULT_DTD = [ $param, $param2 ]; - } elsif (defined $param) { - $CGI::DEFAULT_DTD = $param; - } - return $CGI::DEFAULT_DTD; -} -END_OF_FUNC - -# -------------- really private subroutines ----------------- -'previous_or_default' => <<'END_OF_FUNC', -sub previous_or_default { - my($self,$name,$defaults,$override) = @_; - my(%selected); - - if (!$override && ($self->{'.fieldnames'}->{$name} || - defined($self->param($name)) ) ) { - grep($selected{$_}++,$self->param($name)); - } elsif (defined($defaults) && ref($defaults) && - (ref($defaults) eq 'ARRAY')) { - grep($selected{$_}++,@{$defaults}); - } else { - $selected{$defaults}++ if defined($defaults); - } - - return %selected; -} -END_OF_FUNC - -'register_parameter' => <<'END_OF_FUNC', -sub register_parameter { - my($self,$param) = @_; - $self->{'.parametersToAdd'}->{$param}++; -} -END_OF_FUNC - -'get_fields' => <<'END_OF_FUNC', -sub get_fields { - my($self) = @_; - return $self->CGI::hidden('-name'=>'.cgifields', - '-values'=>[keys %{$self->{'.parametersToAdd'}}], - '-override'=>1); -} -END_OF_FUNC - -'read_from_cmdline' => <<'END_OF_FUNC', -sub read_from_cmdline { - my($input,@words); - my($query_string); - if ($DEBUG && @ARGV) { - @words = @ARGV; - } elsif ($DEBUG > 1) { - require "shellwords.pl"; - print STDERR "(offline mode: enter name=value pairs on standard input)\n"; - chomp(@lines = ); # remove newlines - $input = join(" ",@lines); - @words = &shellwords($input); - } - foreach (@words) { - s/\\=/%3D/g; - s/\\&/%26/g; - } - - if ("@words"=~/=/) { - $query_string = join('&',@words); - } else { - $query_string = join('+',@words); - } - return $query_string; -} -END_OF_FUNC - -##### -# subroutine: read_multipart -# -# Read multipart data and store it into our parameters. -# An interesting feature is that if any of the parts is a file, we -# create a temporary file and open up a filehandle on it so that the -# caller can read from it if necessary. -##### -'read_multipart' => <<'END_OF_FUNC', -sub read_multipart { - my($self,$boundary,$length,$filehandle) = @_; - my($buffer) = $self->new_MultipartBuffer($boundary,$length,$filehandle); - return unless $buffer; - my(%header,$body); - my $filenumber = 0; - while (!$buffer->eof) { - %header = $buffer->readHeader; - - unless (%header) { - $self->cgi_error("400 Bad request (malformed multipart POST)"); - return; - } - - my($param)= $header{'Content-Disposition'}=~/ name="?([^\";]*)"?/; - - # Bug: Netscape doesn't escape quotation marks in file names!!! - my($filename) = $header{'Content-Disposition'}=~/ filename="?([^\"]*)"?/; - - # add this parameter to our list - $self->add_parameter($param); - - # If no filename specified, then just read the data and assign it - # to our parameter list. - if ( !defined($filename) || $filename eq '' ) { - my($value) = $buffer->readBody; - push(@{$self->{$param}},$value); - next; - } - - my ($tmpfile,$tmp,$filehandle); - UPLOADS: { - # If we get here, then we are dealing with a potentially large - # uploaded form. Save the data to a temporary file, then open - # the file for reading. - - # skip the file if uploads disabled - if ($DISABLE_UPLOADS) { - while (defined($data = $buffer->read)) { } - last UPLOADS; - } - - # choose a relatively unpredictable tmpfile sequence number - my $seqno = unpack("%16C*",join('',localtime,values %ENV)); - for (my $cnt=10;$cnt>0;$cnt--) { - next unless $tmpfile = new TempFile($seqno); - $tmp = $tmpfile->as_string; - last if defined($filehandle = Fh->new($filename,$tmp,$PRIVATE_TEMPFILES)); - $seqno += int rand(100); - } - die "CGI open of tmpfile: $!\n" unless $filehandle; - $CGI::DefaultClass->binmode($filehandle) if $CGI::needs_binmode; - - my ($data); - local($\) = ''; - while (defined($data = $buffer->read)) { - print $filehandle $data; - } - - # back up to beginning of file - seek($filehandle,0,0); - $CGI::DefaultClass->binmode($filehandle) if $CGI::needs_binmode; - - # Save some information about the uploaded file where we can get - # at it later. - $self->{'.tmpfiles'}->{fileno($filehandle)}= { - name => $tmpfile, - info => {%header}, - }; - push(@{$self->{$param}},$filehandle); - } - } -} -END_OF_FUNC - -'upload' =><<'END_OF_FUNC', -sub upload { - my($self,$param_name) = self_or_default(@_); - my $param = $self->param($param_name); - return unless $param; - return unless ref($param) && fileno($param); - return $param; -} -END_OF_FUNC - -'tmpFileName' => <<'END_OF_FUNC', -sub tmpFileName { - my($self,$filename) = self_or_default(@_); - return $self->{'.tmpfiles'}->{fileno($filename)}->{name} ? - $self->{'.tmpfiles'}->{fileno($filename)}->{name}->as_string - : ''; -} -END_OF_FUNC - -'uploadInfo' => <<'END_OF_FUNC', -sub uploadInfo { - my($self,$filename) = self_or_default(@_); - return $self->{'.tmpfiles'}->{fileno($filename)}->{info}; -} -END_OF_FUNC - -# internal routine, don't use -'_set_values_and_labels' => <<'END_OF_FUNC', -sub _set_values_and_labels { - my $self = shift; - my ($v,$l,$n) = @_; - $$l = $v if ref($v) eq 'HASH' && !ref($$l); - return $self->param($n) if !defined($v); - return $v if !ref($v); - return ref($v) eq 'HASH' ? keys %$v : @$v; -} -END_OF_FUNC - -'_compile_all' => <<'END_OF_FUNC', -sub _compile_all { - foreach (@_) { - next if defined(&$_); - $AUTOLOAD = "CGI::$_"; - _compile(); - } -} -END_OF_FUNC - -); -END_OF_AUTOLOAD -; - -######################################################### -# Globals and stubs for other packages that we use. -######################################################### - -################### Fh -- lightweight filehandle ############### -package Fh; -use overload - '""' => \&asString, - 'cmp' => \&compare, - 'fallback'=>1; - -$FH='fh00000'; - -*Fh::AUTOLOAD = \&CGI::AUTOLOAD; - -$AUTOLOADED_ROUTINES = ''; # prevent -w error -$AUTOLOADED_ROUTINES=<<'END_OF_AUTOLOAD'; -%SUBS = ( -'asString' => <<'END_OF_FUNC', -sub asString { - my $self = shift; - # get rid of package name - (my $i = $$self) =~ s/^\*(\w+::fh\d{5})+//; - $i =~ s/%(..)/ chr(hex($1)) /eg; - return $i; -# BEGIN DEAD CODE -# This was an extremely clever patch that allowed "use strict refs". -# Unfortunately it relied on another bug that caused leaky file descriptors. -# The underlying bug has been fixed, so this no longer works. However -# "strict refs" still works for some reason. -# my $self = shift; -# return ${*{$self}{SCALAR}}; -# END DEAD CODE -} -END_OF_FUNC - -'compare' => <<'END_OF_FUNC', -sub compare { - my $self = shift; - my $value = shift; - return "$self" cmp $value; -} -END_OF_FUNC - -'new' => <<'END_OF_FUNC', -sub new { - my($pack,$name,$file,$delete) = @_; - require Fcntl unless defined &Fcntl::O_RDWR; - (my $safename = $name) =~ s/([':%])/ sprintf '%%%02X', ord $1 /eg; - my $fv = ++$FH . $safename; - my $ref = \*{"Fh::$fv"}; - sysopen($ref,$file,Fcntl::O_RDWR()|Fcntl::O_CREAT()|Fcntl::O_EXCL(),0600) || return; - unlink($file) if $delete; - CORE::delete $Fh::{$fv}; - return bless $ref,$pack; -} -END_OF_FUNC - -'DESTROY' => <<'END_OF_FUNC', -sub DESTROY { - my $self = shift; - close $self; -} -END_OF_FUNC - -); -END_OF_AUTOLOAD - -######################## MultipartBuffer #################### -package MultipartBuffer; - -# how many bytes to read at a time. We use -# a 4K buffer by default. -$INITIAL_FILLUNIT = 1024 * 4; -$TIMEOUT = 240*60; # 4 hour timeout for big files -$SPIN_LOOP_MAX = 2000; # bug fix for some Netscape servers -$CRLF=$CGI::CRLF; - -#reuse the autoload function -*MultipartBuffer::AUTOLOAD = \&CGI::AUTOLOAD; - -# avoid autoloader warnings -sub DESTROY {} - -############################################################################### -################# THESE FUNCTIONS ARE AUTOLOADED ON DEMAND #################### -############################################################################### -$AUTOLOADED_ROUTINES = ''; # prevent -w error -$AUTOLOADED_ROUTINES=<<'END_OF_AUTOLOAD'; -%SUBS = ( - -'new' => <<'END_OF_FUNC', -sub new { - my($package,$interface,$boundary,$length,$filehandle) = @_; - $FILLUNIT = $INITIAL_FILLUNIT; - my $IN; - if ($filehandle) { - my($package) = caller; - # force into caller's package if necessary - $IN = $filehandle=~/[':]/ ? $filehandle : "$package\:\:$filehandle"; - } - $IN = "main::STDIN" unless $IN; - - $CGI::DefaultClass->binmode($IN) if $CGI::needs_binmode; - - # If the user types garbage into the file upload field, - # then Netscape passes NOTHING to the server (not good). - # We may hang on this read in that case. So we implement - # a read timeout. If nothing is ready to read - # by then, we return. - - # Netscape seems to be a little bit unreliable - # about providing boundary strings. - my $boundary_read = 0; - if ($boundary) { - - # Under the MIME spec, the boundary consists of the - # characters "--" PLUS the Boundary string - - # BUG: IE 3.01 on the Macintosh uses just the boundary -- not - # the two extra hyphens. We do a special case here on the user-agent!!!! - $boundary = "--$boundary" unless CGI::user_agent('MSIE\s+3\.0[12];\s*Mac'); - - } else { # otherwise we find it ourselves - my($old); - ($old,$/) = ($/,$CRLF); # read a CRLF-delimited line - $boundary = <$IN>; # BUG: This won't work correctly under mod_perl - $length -= length($boundary); - chomp($boundary); # remove the CRLF - $/ = $old; # restore old line separator - $boundary_read++; - } - - my $self = {LENGTH=>$length, - BOUNDARY=>$boundary, - IN=>$IN, - INTERFACE=>$interface, - BUFFER=>'', - }; - - $FILLUNIT = length($boundary) - if length($boundary) > $FILLUNIT; - - my $retval = bless $self,ref $package || $package; - - # Read the preamble and the topmost (boundary) line plus the CRLF. - unless ($boundary_read) { - while ($self->read(0)) { } - } - die "Malformed multipart POST\n" if $self->eof; - - return $retval; -} -END_OF_FUNC - -'readHeader' => <<'END_OF_FUNC', -sub readHeader { - my($self) = @_; - my($end); - my($ok) = 0; - my($bad) = 0; - - local($CRLF) = "\015\012" if $CGI::OS eq 'VMS'; - - do { - $self->fillBuffer($FILLUNIT); - $ok++ if ($end = index($self->{BUFFER},"${CRLF}${CRLF}")) >= 0; - $ok++ if $self->{BUFFER} eq ''; - $bad++ if !$ok && $self->{LENGTH} <= 0; - # this was a bad idea - # $FILLUNIT *= 2 if length($self->{BUFFER}) >= $FILLUNIT; - } until $ok || $bad; - return () if $bad; - - my($header) = substr($self->{BUFFER},0,$end+2); - substr($self->{BUFFER},0,$end+4) = ''; - my %return; - - - # See RFC 2045 Appendix A and RFC 822 sections 3.4.8 - # (Folding Long Header Fields), 3.4.3 (Comments) - # and 3.4.5 (Quoted-Strings). - - my $token = '[-\w!\#$%&\'*+.^_\`|{}~]'; - $header=~s/$CRLF\s+/ /og; # merge continuation lines - while ($header=~/($token+):\s+([^$CRLF]*)/mgox) { - my ($field_name,$field_value) = ($1,$2); # avoid taintedness - $field_name =~ s/\b(\w)/uc($1)/eg; #canonicalize - $return{$field_name}=$field_value; - } - return %return; -} -END_OF_FUNC - -# This reads and returns the body as a single scalar value. -'readBody' => <<'END_OF_FUNC', -sub readBody { - my($self) = @_; - my($data); - my($returnval)=''; - while (defined($data = $self->read)) { - $returnval .= $data; - } - return $returnval; -} -END_OF_FUNC - -# This will read $bytes or until the boundary is hit, whichever happens -# first. After the boundary is hit, we return undef. The next read will -# skip over the boundary and begin reading again; -'read' => <<'END_OF_FUNC', -sub read { - my($self,$bytes) = @_; - - # default number of bytes to read - $bytes = $bytes || $FILLUNIT; - - # Fill up our internal buffer in such a way that the boundary - # is never split between reads. - $self->fillBuffer($bytes); - - # Find the boundary in the buffer (it may not be there). - my $start = index($self->{BUFFER},$self->{BOUNDARY}); - # protect against malformed multipart POST operations - die "Malformed multipart POST\n" unless ($start >= 0) || ($self->{LENGTH} > 0); - - # If the boundary begins the data, then skip past it - # and return undef. - if ($start == 0) { - - # clear us out completely if we've hit the last boundary. - if (index($self->{BUFFER},"$self->{BOUNDARY}--")==0) { - $self->{BUFFER}=''; - $self->{LENGTH}=0; - return undef; - } - - # just remove the boundary. - substr($self->{BUFFER},0,length($self->{BOUNDARY}))=''; - $self->{BUFFER} =~ s/^\012\015?//; - return undef; - } - - my $bytesToReturn; - if ($start > 0) { # read up to the boundary - $bytesToReturn = $start > $bytes ? $bytes : $start; - } else { # read the requested number of bytes - # leave enough bytes in the buffer to allow us to read - # the boundary. Thanks to Kevin Hendrick for finding - # this one. - $bytesToReturn = $bytes - (length($self->{BOUNDARY})+1); - } - - my $returnval=substr($self->{BUFFER},0,$bytesToReturn); - substr($self->{BUFFER},0,$bytesToReturn)=''; - - # If we hit the boundary, remove the CRLF from the end. - return ($start > 0) ? substr($returnval,0,-2) : $returnval; -} -END_OF_FUNC - - -# This fills up our internal buffer in such a way that the -# boundary is never split between reads -'fillBuffer' => <<'END_OF_FUNC', -sub fillBuffer { - my($self,$bytes) = @_; - return unless $self->{LENGTH}; - - my($boundaryLength) = length($self->{BOUNDARY}); - my($bufferLength) = length($self->{BUFFER}); - my($bytesToRead) = $bytes - $bufferLength + $boundaryLength + 2; - $bytesToRead = $self->{LENGTH} if $self->{LENGTH} < $bytesToRead; - - # Try to read some data. We may hang here if the browser is screwed up. - my $bytesRead = $self->{INTERFACE}->read_from_client($self->{IN}, - \$self->{BUFFER}, - $bytesToRead, - $bufferLength); - $self->{BUFFER} = '' unless defined $self->{BUFFER}; - - # An apparent bug in the Apache server causes the read() - # to return zero bytes repeatedly without blocking if the - # remote user aborts during a file transfer. I don't know how - # they manage this, but the workaround is to abort if we get - # more than SPIN_LOOP_MAX consecutive zero reads. - if ($bytesRead == 0) { - die "CGI.pm: Server closed socket during multipart read (client aborted?).\n" - if ($self->{ZERO_LOOP_COUNTER}++ >= $SPIN_LOOP_MAX); - } else { - $self->{ZERO_LOOP_COUNTER}=0; - } - - $self->{LENGTH} -= $bytesRead; -} -END_OF_FUNC - - -# Return true when we've finished reading -'eof' => <<'END_OF_FUNC' -sub eof { - my($self) = @_; - return 1 if (length($self->{BUFFER}) == 0) - && ($self->{LENGTH} <= 0); - undef; -} -END_OF_FUNC - -); -END_OF_AUTOLOAD - -#################################################################################### -################################## TEMPORARY FILES ################################# -#################################################################################### -package TempFile; - -$SL = $CGI::SL; -$MAC = $CGI::OS eq 'MACINTOSH'; -my ($vol) = $MAC ? MacPerl::Volumes() =~ /:(.*)/ : ""; -unless ($TMPDIRECTORY) { - @TEMP=("${SL}usr${SL}tmp","${SL}var${SL}tmp", - "C:${SL}temp","${SL}tmp","${SL}temp", - "${vol}${SL}Temporary Items", - "${SL}WWW_ROOT", "${SL}SYS\$SCRATCH", - "C:${SL}system${SL}temp"); - unshift(@TEMP,$ENV{'TMPDIR'}) if exists $ENV{'TMPDIR'}; - - # this feature was supposed to provide per-user tmpfiles, but - # it is problematic. - # unshift(@TEMP,(getpwuid($<))[7].'/tmp') if $CGI::OS eq 'UNIX'; - # Rob: getpwuid() is unfortunately UNIX specific. On brain dead OS'es this - # : can generate a 'getpwuid() not implemented' exception, even though - # : it's never called. Found under DOS/Win with the DJGPP perl port. - # : Refer to getpwuid() only at run-time if we're fortunate and have UNIX. - # unshift(@TEMP,(eval {(getpwuid($>))[7]}).'/tmp') if $CGI::OS eq 'UNIX' and $> != 0; - - foreach (@TEMP) { - do {$TMPDIRECTORY = $_; last} if -d $_ && -w _; - } -} - -$TMPDIRECTORY = $MAC ? "" : "." unless $TMPDIRECTORY; -$MAXTRIES = 5000; - -# cute feature, but overload implementation broke it -# %OVERLOAD = ('""'=>'as_string'); -*TempFile::AUTOLOAD = \&CGI::AUTOLOAD; - -############################################################################### -################# THESE FUNCTIONS ARE AUTOLOADED ON DEMAND #################### -############################################################################### -$AUTOLOADED_ROUTINES = ''; # prevent -w error -$AUTOLOADED_ROUTINES=<<'END_OF_AUTOLOAD'; -%SUBS = ( - -'new' => <<'END_OF_FUNC', -sub new { - my($package,$sequence) = @_; - my $filename; - for (my $i = 0; $i < $MAXTRIES; $i++) { - last if ! -f ($filename = sprintf("${TMPDIRECTORY}${SL}CGItemp%d",$sequence++)); - } - # untaint the darn thing - return unless $filename =~ m!^([a-zA-Z0-9_ '":/.\$\\-]+)$!; - $filename = $1; - return bless \$filename; -} -END_OF_FUNC - -'DESTROY' => <<'END_OF_FUNC', -sub DESTROY { - my($self) = @_; - unlink $$self; # get rid of the file -} -END_OF_FUNC - -'as_string' => <<'END_OF_FUNC' -sub as_string { - my($self) = @_; - return $$self; -} -END_OF_FUNC - -); -END_OF_AUTOLOAD - -package CGI; - -# We get a whole bunch of warnings about "possibly uninitialized variables" -# when running with the -w switch. Touch them all once to get rid of the -# warnings. This is ugly and I hate it. -if ($^W) { - $CGI::CGI = ''; - $CGI::CGI=<'words', - -values=>['eenie','meenie','minie','moe'], - -defaults=>['eenie','minie']), p, - "What's your favorite color? ", - popup_menu(-name=>'color', - -values=>['red','green','blue','chartreuse']),p, - submit, - end_form, - hr; - - if (param()) { - print "Your name is",em(param('name')),p, - "The keywords are: ",em(join(", ",param('words'))),p, - "Your favorite color is ",em(param('color')), - hr; - } - -=head1 ABSTRACT - -This perl library uses perl5 objects to make it easy to create Web -fill-out forms and parse their contents. This package defines CGI -objects, entities that contain the values of the current query string -and other state variables. Using a CGI object's methods, you can -examine keywords and parameters passed to your script, and create -forms whose initial values are taken from the current query (thereby -preserving state information). The module provides shortcut functions -that produce boilerplate HTML, reducing typing and coding errors. It -also provides functionality for some of the more advanced features of -CGI scripting, including support for file uploads, cookies, cascading -style sheets, server push, and frames. - -CGI.pm also provides a simple function-oriented programming style for -those who don't need its object-oriented features. - -The current version of CGI.pm is available at - - http://www.genome.wi.mit.edu/ftp/pub/software/WWW/cgi_docs.html - ftp://ftp-genome.wi.mit.edu/pub/software/WWW/ - -=head1 DESCRIPTION - -=head2 PROGRAMMING STYLE - -There are two styles of programming with CGI.pm, an object-oriented -style and a function-oriented style. In the object-oriented style you -create one or more CGI objects and then use object methods to create -the various elements of the page. Each CGI object starts out with the -list of named parameters that were passed to your CGI script by the -server. You can modify the objects, save them to a file or database -and recreate them. Because each object corresponds to the "state" of -the CGI script, and because each object's parameter list is -independent of the others, this allows you to save the state of the -script and restore it later. - -For example, using the object oriented style, here is how you create -a simple "Hello World" HTML page: - - #!/usr/local/bin/perl -w - use CGI; # load CGI routines - $q = new CGI; # create new CGI object - print $q->header, # create the HTTP header - $q->start_html('hello world'), # start the HTML - $q->h1('hello world'), # level 1 header - $q->end_html; # end the HTML - -In the function-oriented style, there is one default CGI object that -you rarely deal with directly. Instead you just call functions to -retrieve CGI parameters, create HTML tags, manage cookies, and so -on. This provides you with a cleaner programming interface, but -limits you to using one CGI object at a time. The following example -prints the same page, but uses the function-oriented interface. -The main differences are that we now need to import a set of functions -into our name space (usually the "standard" functions), and we don't -need to create the CGI object. - - #!/usr/local/bin/perl - use CGI qw/:standard/; # load standard CGI routines - print header, # create the HTTP header - start_html('hello world'), # start the HTML - h1('hello world'), # level 1 header - end_html; # end the HTML - -The examples in this document mainly use the object-oriented style. -See HOW TO IMPORT FUNCTIONS for important information on -function-oriented programming in CGI.pm - -=head2 CALLING CGI.PM ROUTINES - -Most CGI.pm routines accept several arguments, sometimes as many as 20 -optional ones! To simplify this interface, all routines use a named -argument calling style that looks like this: - - print $q->header(-type=>'image/gif',-expires=>'+3d'); - -Each argument name is preceded by a dash. Neither case nor order -matters in the argument list. -type, -Type, and -TYPE are all -acceptable. In fact, only the first argument needs to begin with a -dash. If a dash is present in the first argument, CGI.pm assumes -dashes for the subsequent ones. - -Several routines are commonly called with just one argument. In the -case of these routines you can provide the single argument without an -argument name. header() happens to be one of these routines. In this -case, the single argument is the document type. - - print $q->header('text/html'); - -Other such routines are documented below. - -Sometimes named arguments expect a scalar, sometimes a reference to an -array, and sometimes a reference to a hash. Often, you can pass any -type of argument and the routine will do whatever is most appropriate. -For example, the param() routine is used to set a CGI parameter to a -single or a multi-valued value. The two cases are shown below: - - $q->param(-name=>'veggie',-value=>'tomato'); - $q->param(-name=>'veggie',-value=>['tomato','tomahto','potato','potahto']); - -A large number of routines in CGI.pm actually aren't specifically -defined in the module, but are generated automatically as needed. -These are the "HTML shortcuts," routines that generate HTML tags for -use in dynamically-generated pages. HTML tags have both attributes -(the attribute="value" pairs within the tag itself) and contents (the -part between the opening and closing pairs.) To distinguish between -attributes and contents, CGI.pm uses the convention of passing HTML -attributes as a hash reference as the first argument, and the -contents, if any, as any subsequent arguments. It works out like -this: - - Code Generated HTML - ---- -------------- - h1()

    - h1('some','contents');

    some contents

    - h1({-align=>left});

    - h1({-align=>left},'contents');

    contents

    - -HTML tags are described in more detail later. - -Many newcomers to CGI.pm are puzzled by the difference between the -calling conventions for the HTML shortcuts, which require curly braces -around the HTML tag attributes, and the calling conventions for other -routines, which manage to generate attributes without the curly -brackets. Don't be confused. As a convenience the curly braces are -optional in all but the HTML shortcuts. If you like, you can use -curly braces when calling any routine that takes named arguments. For -example: - - print $q->header( {-type=>'image/gif',-expires=>'+3d'} ); - -If you use the B<-w> switch, you will be warned that some CGI.pm argument -names conflict with built-in Perl functions. The most frequent of -these is the -values argument, used to create multi-valued menus, -radio button clusters and the like. To get around this warning, you -have several choices: - -=over 4 - -=item 1. - -Use another name for the argument, if one is available. -For example, -value is an alias for -values. - -=item 2. - -Change the capitalization, e.g. -Values - -=item 3. - -Put quotes around the argument name, e.g. '-values' - -=back - -Many routines will do something useful with a named argument that it -doesn't recognize. For example, you can produce non-standard HTTP -header fields by providing them as named arguments: - - print $q->header(-type => 'text/html', - -cost => 'Three smackers', - -annoyance_level => 'high', - -complaints_to => 'bit bucket'); - -This will produce the following nonstandard HTTP header: - - HTTP/1.0 200 OK - Cost: Three smackers - Annoyance-level: high - Complaints-to: bit bucket - Content-type: text/html - -Notice the way that underscores are translated automatically into -hyphens. HTML-generating routines perform a different type of -translation. - -This feature allows you to keep up with the rapidly changing HTTP and -HTML "standards". - -=head2 CREATING A NEW QUERY OBJECT (OBJECT-ORIENTED STYLE): - - $query = new CGI; - -This will parse the input (from both POST and GET methods) and store -it into a perl5 object called $query. - -=head2 CREATING A NEW QUERY OBJECT FROM AN INPUT FILE - - $query = new CGI(INPUTFILE); - -If you provide a file handle to the new() method, it will read -parameters from the file (or STDIN, or whatever). The file can be in -any of the forms describing below under debugging (i.e. a series of -newline delimited TAG=VALUE pairs will work). Conveniently, this type -of file is created by the save() method (see below). Multiple records -can be saved and restored. - -Perl purists will be pleased to know that this syntax accepts -references to file handles, or even references to filehandle globs, -which is the "official" way to pass a filehandle: - - $query = new CGI(\*STDIN); - -You can also initialize the CGI object with a FileHandle or IO::File -object. - -If you are using the function-oriented interface and want to -initialize CGI state from a file handle, the way to do this is with -B. This will (re)initialize the -default CGI object from the indicated file handle. - - open (IN,"test.in") || die; - restore_parameters(IN); - close IN; - -You can also initialize the query object from an associative array -reference: - - $query = new CGI( {'dinosaur'=>'barney', - 'song'=>'I love you', - 'friends'=>[qw/Jessica George Nancy/]} - ); - -or from a properly formatted, URL-escaped query string: - - $query = new CGI('dinosaur=barney&color=purple'); - -or from a previously existing CGI object (currently this clones the -parameter list, but none of the other object-specific fields, such as -autoescaping): - - $old_query = new CGI; - $new_query = new CGI($old_query); - -To create an empty query, initialize it from an empty string or hash: - - $empty_query = new CGI(""); - - -or- - - $empty_query = new CGI({}); - -=head2 FETCHING A LIST OF KEYWORDS FROM THE QUERY: - - @keywords = $query->keywords - -If the script was invoked as the result of an search, the -parsed keywords can be obtained as an array using the keywords() method. - -=head2 FETCHING THE NAMES OF ALL THE PARAMETERS PASSED TO YOUR SCRIPT: - - @names = $query->param - -If the script was invoked with a parameter list -(e.g. "name1=value1&name2=value2&name3=value3"), the param() method -will return the parameter names as a list. If the script was invoked -as an script and contains a string without ampersands -(e.g. "value1+value2+value3") , there will be a single parameter named -"keywords" containing the "+"-delimited keywords. - -NOTE: As of version 1.5, the array of parameter names returned will -be in the same order as they were submitted by the browser. -Usually this order is the same as the order in which the -parameters are defined in the form (however, this isn't part -of the spec, and so isn't guaranteed). - -=head2 FETCHING THE VALUE OR VALUES OF A SINGLE NAMED PARAMETER: - - @values = $query->param('foo'); - - -or- - - $value = $query->param('foo'); - -Pass the param() method a single argument to fetch the value of the -named parameter. If the parameter is multivalued (e.g. from multiple -selections in a scrolling list), you can ask to receive an array. Otherwise -the method will return a single value. - -If a value is not given in the query string, as in the queries -"name1=&name2=" or "name1&name2", it will be returned as an empty -string. This feature is new in 2.63. - -=head2 SETTING THE VALUE(S) OF A NAMED PARAMETER: - - $query->param('foo','an','array','of','values'); - -This sets the value for the named parameter 'foo' to an array of -values. This is one way to change the value of a field AFTER -the script has been invoked once before. (Another way is with -the -override parameter accepted by all methods that generate -form elements.) - -param() also recognizes a named parameter style of calling described -in more detail later: - - $query->param(-name=>'foo',-values=>['an','array','of','values']); - - -or- - - $query->param(-name=>'foo',-value=>'the value'); - -=head2 APPENDING ADDITIONAL VALUES TO A NAMED PARAMETER: - - $query->append(-name=>'foo',-values=>['yet','more','values']); - -This adds a value or list of values to the named parameter. The -values are appended to the end of the parameter if it already exists. -Otherwise the parameter is created. Note that this method only -recognizes the named argument calling syntax. - -=head2 IMPORTING ALL PARAMETERS INTO A NAMESPACE: - - $query->import_names('R'); - -This creates a series of variables in the 'R' namespace. For example, -$R::foo, @R:foo. For keyword lists, a variable @R::keywords will appear. -If no namespace is given, this method will assume 'Q'. -WARNING: don't import anything into 'main'; this is a major security -risk!!!! - -In older versions, this method was called B. As of version 2.20, -this name has been removed completely to avoid conflict with the built-in -Perl module B operator. - -=head2 DELETING A PARAMETER COMPLETELY: - - $query->delete('foo'); - -This completely clears a parameter. It sometimes useful for -resetting parameters that you don't want passed down between -script invocations. - -If you are using the function call interface, use "Delete()" instead -to avoid conflicts with Perl's built-in delete operator. - -=head2 DELETING ALL PARAMETERS: - - $query->delete_all(); - -This clears the CGI object completely. It might be useful to ensure -that all the defaults are taken when you create a fill-out form. - -Use Delete_all() instead if you are using the function call interface. - -=head2 DIRECT ACCESS TO THE PARAMETER LIST: - - $q->param_fetch('address')->[1] = '1313 Mockingbird Lane'; - unshift @{$q->param_fetch(-name=>'address')},'George Munster'; - -If you need access to the parameter list in a way that isn't covered -by the methods above, you can obtain a direct reference to it by -calling the B method with the name of the . This -will return an array reference to the named parameters, which you then -can manipulate in any way you like. - -You can also use a named argument style using the B<-name> argument. - -=head2 FETCHING THE PARAMETER LIST AS A HASH: - - $params = $q->Vars; - print $params->{'address'}; - @foo = split("\0",$params->{'foo'}); - %params = $q->Vars; - - use CGI ':cgi-lib'; - $params = Vars; - -Many people want to fetch the entire parameter list as a hash in which -the keys are the names of the CGI parameters, and the values are the -parameters' values. The Vars() method does this. Called in a scalar -context, it returns the parameter list as a tied hash reference. -Changing a key changes the value of the parameter in the underlying -CGI parameter list. Called in a list context, it returns the -parameter list as an ordinary hash. This allows you to read the -contents of the parameter list, but not to change it. - -When using this, the thing you must watch out for are multivalued CGI -parameters. Because a hash cannot distinguish between scalar and -list context, multivalued parameters will be returned as a packed -string, separated by the "\0" (null) character. You must split this -packed string in order to get at the individual values. This is the -convention introduced long ago by Steve Brenner in his cgi-lib.pl -module for Perl version 4. - -If you wish to use Vars() as a function, import the I<:cgi-lib> set of -function calls (also see the section on CGI-LIB compatibility). - -=head2 SAVING THE STATE OF THE SCRIPT TO A FILE: - - $query->save(FILEHANDLE) - -This will write the current state of the form to the provided -filehandle. You can read it back in by providing a filehandle -to the new() method. Note that the filehandle can be a file, a pipe, -or whatever! - -The format of the saved file is: - - NAME1=VALUE1 - NAME1=VALUE1' - NAME2=VALUE2 - NAME3=VALUE3 - = - -Both name and value are URL escaped. Multi-valued CGI parameters are -represented as repeated names. A session record is delimited by a -single = symbol. You can write out multiple records and read them -back in with several calls to B. You can do this across several -sessions by opening the file in append mode, allowing you to create -primitive guest books, or to keep a history of users' queries. Here's -a short example of creating multiple session records: - - use CGI; - - open (OUT,">>test.out") || die; - $records = 5; - foreach (0..$records) { - my $q = new CGI; - $q->param(-name=>'counter',-value=>$_); - $q->save(OUT); - } - close OUT; - - # reopen for reading - open (IN,"test.out") || die; - while (!eof(IN)) { - my $q = new CGI(IN); - print $q->param('counter'),"\n"; - } - -The file format used for save/restore is identical to that used by the -Whitehead Genome Center's data exchange format "Boulderio", and can be -manipulated and even databased using Boulderio utilities. See - - http://stein.cshl.org/boulder/ - -for further details. - -If you wish to use this method from the function-oriented (non-OO) -interface, the exported name for this method is B. - -=head2 RETRIEVING CGI ERRORS - -Errors can occur while processing user input, particularly when -processing uploaded files. When these errors occur, CGI will stop -processing and return an empty parameter list. You can test for -the existence and nature of errors using the I function. -The error messages are formatted as HTTP status codes. You can either -incorporate the error text into an HTML page, or use it as the value -of the HTTP status: - - my $error = $q->cgi_error; - if ($error) { - print $q->header(-status=>$error), - $q->start_html('Problems'), - $q->h2('Request not processed'), - $q->strong($error); - exit 0; - } - -When using the function-oriented interface (see the next section), -errors may only occur the first time you call I. Be ready -for this! - -=head2 USING THE FUNCTION-ORIENTED INTERFACE - -To use the function-oriented interface, you must specify which CGI.pm -routines or sets of routines to import into your script's namespace. -There is a small overhead associated with this importation, but it -isn't much. - - use CGI ; - -The listed methods will be imported into the current package; you can -call them directly without creating a CGI object first. This example -shows how to import the B and B -methods, and then use them directly: - - use CGI 'param','header'; - print header('text/plain'); - $zipcode = param('zipcode'); - -More frequently, you'll import common sets of functions by referring -to the groups by name. All function sets are preceded with a ":" -character as in ":html3" (for tags defined in the HTML 3 standard). - -Here is a list of the function sets you can import: - -=over 4 - -=item B<:cgi> - -Import all CGI-handling methods, such as B, B -and the like. - -=item B<:form> - -Import all fill-out form generating methods, such as B. - -=item B<:html2> - -Import all methods that generate HTML 2.0 standard elements. - -=item B<:html3> - -Import all methods that generate HTML 3.0 proposed elements (such as -, and ). - -=item B<:netscape> - -Import all methods that generate Netscape-specific HTML extensions. - -=item B<:html> - -Import all HTML-generating shortcuts (i.e. 'html2' + 'html3' + -'netscape')... - -=item B<:standard> - -Import "standard" features, 'html2', 'html3', 'form' and 'cgi'. - -=item B<:all> - -Import all the available methods. For the full list, see the CGI.pm -code, where the variable %EXPORT_TAGS is defined. - -=back - -If you import a function name that is not part of CGI.pm, the module -will treat it as a new HTML tag and generate the appropriate -subroutine. You can then use it like any other HTML tag. This is to -provide for the rapidly-evolving HTML "standard." For example, say -Microsoft comes out with a new tag called (which causes the -user's desktop to be flooded with a rotating gradient fill until his -machine reboots). You don't need to wait for a new version of CGI.pm -to start using it immediately: - - use CGI qw/:standard :html3 gradient/; - print gradient({-start=>'red',-end=>'blue'}); - -Note that in the interests of execution speed CGI.pm does B use -the standard L syntax for specifying load symbols. This may -change in the future. - -If you import any of the state-maintaining CGI or form-generating -methods, a default CGI object will be created and initialized -automatically the first time you use any of the methods that require -one to be present. This includes B, B, -B and the like. (If you need direct access to the CGI -object, you can find it in the global variable B<$CGI::Q>). By -importing CGI.pm methods, you can create visually elegant scripts: - - use CGI qw/:standard/; - print - header, - start_html('Simple Script'), - h1('Simple Script'), - start_form, - "What's your name? ",textfield('name'),p, - "What's the combination?", - checkbox_group(-name=>'words', - -values=>['eenie','meenie','minie','moe'], - -defaults=>['eenie','moe']),p, - "What's your favorite color?", - popup_menu(-name=>'color', - -values=>['red','green','blue','chartreuse']),p, - submit, - end_form, - hr,"\n"; - - if (param) { - print - "Your name is ",em(param('name')),p, - "The keywords are: ",em(join(", ",param('words'))),p, - "Your favorite color is ",em(param('color')),".\n"; - } - print end_html; - -=head2 PRAGMAS - -In addition to the function sets, there are a number of pragmas that -you can import. Pragmas, which are always preceded by a hyphen, -change the way that CGI.pm functions in various ways. Pragmas, -function sets, and individual functions can all be imported in the -same use() line. For example, the following use statement imports the -standard set of functions and enables debugging mode (pragma --debug): - - use CGI qw/:standard -debug/; - -The current list of pragmas is as follows: - -=over 4 - -=item -any - -When you I, then any method that the query object -doesn't recognize will be interpreted as a new HTML tag. This allows -you to support the next I Netscape or Microsoft HTML -extension. This lets you go wild with new and unsupported tags: - - use CGI qw(-any); - $q=new CGI; - print $q->gradient({speed=>'fast',start=>'red',end=>'blue'}); - -Since using any causes any mistyped method name -to be interpreted as an HTML tag, use it with care or not at -all. - -=item -compile - -This causes the indicated autoloaded methods to be compiled up front, -rather than deferred to later. This is useful for scripts that run -for an extended period of time under FastCGI or mod_perl, and for -those destined to be crunched by Malcom Beattie's Perl compiler. Use -it in conjunction with the methods or method families you plan to use. - - use CGI qw(-compile :standard :html3); - -or even - - use CGI qw(-compile :all); - -Note that using the -compile pragma in this way will always have -the effect of importing the compiled functions into the current -namespace. If you want to compile without importing use the -compile() method instead (see below). - -=item -nosticky - -This makes CGI.pm not generating the hidden fields .submit -and .cgifields. It is very useful if you don't want to -have the hidden fields appear in the querystring in a GET method. -For example, a search script generated this way will have -a very nice url with search parameters for bookmarking. - -=item -no_xhtml - -By default, CGI.pm versions 2.69 and higher emit XHTML -(http://www.w3.org/TR/xhtml1/). The -no_xhtml pragma disables this -feature. Thanks to Michalis Kabrianis for this -feature. - -=item -nph - -This makes CGI.pm produce a header appropriate for an NPH (no -parsed header) script. You may need to do other things as well -to tell the server that the script is NPH. See the discussion -of NPH scripts below. - -=item -newstyle_urls - -Separate the name=value pairs in CGI parameter query strings with -semicolons rather than ampersands. For example: - - ?name=fred;age=24;favorite_color=3 - -Semicolon-delimited query strings are always accepted, but will not be -emitted by self_url() and query_string() unless the -newstyle_urls -pragma is specified. - -This became the default in version 2.64. - -=item -oldstyle_urls - -Separate the name=value pairs in CGI parameter query strings with -ampersands rather than semicolons. This is no longer the default. - -=item -autoload - -This overrides the autoloader so that any function in your program -that is not recognized is referred to CGI.pm for possible evaluation. -This allows you to use all the CGI.pm functions without adding them to -your symbol table, which is of concern for mod_perl users who are -worried about memory consumption. I when -I<-autoload> is in effect, you cannot use "poetry mode" -(functions without the parenthesis). Use I rather -than I
    , or add something like I -to the top of your script. - -=item -no_debug - -This turns off the command-line processing features. If you want to -run a CGI.pm script from the command line to produce HTML, and you -don't want it to read CGI parameters from the command line or STDIN, -then use this pragma: - - use CGI qw(-no_debug :standard); - -=item -debug - -This turns on full debugging. In addition to reading CGI arguments -from the command-line processing, CGI.pm will pause and try to read -arguments from STDIN, producing the message "(offline mode: enter -name=value pairs on standard input)" features. - -See the section on debugging for more details. - -=item -private_tempfiles - -CGI.pm can process uploaded file. Ordinarily it spools the uploaded -file to a temporary directory, then deletes the file when done. -However, this opens the risk of eavesdropping as described in the file -upload section. Another CGI script author could peek at this data -during the upload, even if it is confidential information. On Unix -systems, the -private_tempfiles pragma will cause the temporary file -to be unlinked as soon as it is opened and before any data is written -into it, reducing, but not eliminating the risk of eavesdropping -(there is still a potential race condition). To make life harder for -the attacker, the program chooses tempfile names by calculating a 32 -bit checksum of the incoming HTTP headers. - -To ensure that the temporary file cannot be read by other CGI scripts, -use suEXEC or a CGI wrapper program to run your script. The temporary -file is created with mode 0600 (neither world nor group readable). - -The temporary directory is selected using the following algorithm: - - 1. if the current user (e.g. "nobody") has a directory named - "tmp" in its home directory, use that (Unix systems only). - - 2. if the environment variable TMPDIR exists, use the location - indicated. - - 3. Otherwise try the locations /usr/tmp, /var/tmp, C:\temp, - /tmp, /temp, ::Temporary Items, and \WWW_ROOT. - -Each of these locations is checked that it is a directory and is -writable. If not, the algorithm tries the next choice. - -=back - -=head2 SPECIAL FORMS FOR IMPORTING HTML-TAG FUNCTIONS - -Many of the methods generate HTML tags. As described below, tag -functions automatically generate both the opening and closing tags. -For example: - - print h1('Level 1 Header'); - -produces - -

    Level 1 Header

    - -There will be some times when you want to produce the start and end -tags yourself. In this case, you can use the form start_I -and end_I, as in: - - print start_h1,'Level 1 Header',end_h1; - -With a few exceptions (described below), start_I and -end_I functions are not generated automatically when you -I. However, you can specify the tags you want to generate -I functions for by putting an asterisk in front of their -name, or, alternatively, requesting either "start_I" or -"end_I" in the import list. - -Example: - - use CGI qw/:standard *table start_ul/; - -In this example, the following functions are generated in addition to -the standard ones: - -=over 4 - -=item 1. start_table() (generates a
    tag) - -=item 2. end_table() (generates a
    tag) - -=item 3. start_ul() (generates a
      tag) - -=item 4. end_ul() (generates a
    tag) - -=back - -=head1 GENERATING DYNAMIC DOCUMENTS - -Most of CGI.pm's functions deal with creating documents on the fly. -Generally you will produce the HTTP header first, followed by the -document itself. CGI.pm provides functions for generating HTTP -headers of various types as well as for generating HTML. For creating -GIF images, see the GD.pm module. - -Each of these functions produces a fragment of HTML or HTTP which you -can print out directly so that it displays in the browser window, -append to a string, or save to a file for later use. - -=head2 CREATING A STANDARD HTTP HEADER: - -Normally the first thing you will do in any CGI script is print out an -HTTP header. This tells the browser what type of document to expect, -and gives other optional information, such as the language, expiration -date, and whether to cache the document. The header can also be -manipulated for special purposes, such as server push and pay per view -pages. - - print $query->header; - - -or- - - print $query->header('image/gif'); - - -or- - - print $query->header('text/html','204 No response'); - - -or- - - print $query->header(-type=>'image/gif', - -nph=>1, - -status=>'402 Payment required', - -expires=>'+3d', - -cookie=>$cookie, - -charset=>'utf-7', - -attachment=>'foo.gif', - -Cost=>'$2.00'); - -header() returns the Content-type: header. You can provide your own -MIME type if you choose, otherwise it defaults to text/html. An -optional second parameter specifies the status code and a human-readable -message. For example, you can specify 204, "No response" to create a -script that tells the browser to do nothing at all. - -The last example shows the named argument style for passing arguments -to the CGI methods using named parameters. Recognized parameters are -B<-type>, B<-status>, B<-expires>, and B<-cookie>. Any other named -parameters will be stripped of their initial hyphens and turned into -header fields, allowing you to specify any HTTP header you desire. -Internal underscores will be turned into hyphens: - - print $query->header(-Content_length=>3002); - -Most browsers will not cache the output from CGI scripts. Every time -the browser reloads the page, the script is invoked anew. You can -change this behavior with the B<-expires> parameter. When you specify -an absolute or relative expiration interval with this parameter, some -browsers and proxy servers will cache the script's output until the -indicated expiration date. The following forms are all valid for the --expires field: - - +30s 30 seconds from now - +10m ten minutes from now - +1h one hour from now - -1d yesterday (i.e. "ASAP!") - now immediately - +3M in three months - +10y in ten years time - Thursday, 25-Apr-1999 00:40:33 GMT at the indicated time & date - -The B<-cookie> parameter generates a header that tells the browser to provide -a "magic cookie" during all subsequent transactions with your script. -Netscape cookies have a special format that includes interesting attributes -such as expiration time. Use the cookie() method to create and retrieve -session cookies. - -The B<-nph> parameter, if set to a true value, will issue the correct -headers to work with a NPH (no-parse-header) script. This is important -to use with certain servers that expect all their scripts to be NPH. - -The B<-charset> parameter can be used to control the character set -sent to the browser. If not provided, defaults to ISO-8859-1. As a -side effect, this sets the charset() method as well. - -The B<-attachment> parameter can be used to turn the page into an -attachment. Instead of displaying the page, some browsers will prompt -the user to save it to disk. The value of the argument is the -suggested name for the saved file. In order for this to work, you may -have to set the B<-type> to "application/octet-stream". - -=head2 GENERATING A REDIRECTION HEADER - - print $query->redirect('http://somewhere.else/in/movie/land'); - -Sometimes you don't want to produce a document yourself, but simply -redirect the browser elsewhere, perhaps choosing a URL based on the -time of day or the identity of the user. - -The redirect() function redirects the browser to a different URL. If -you use redirection like this, you should B print out a header as -well. - -One hint I can offer is that relative links may not work correctly -when you generate a redirection to another document on your site. -This is due to a well-intentioned optimization that some servers use. -The solution to this is to use the full URL (including the http: part) -of the document you are redirecting to. - -You can also use named arguments: - - print $query->redirect(-uri=>'http://somewhere.else/in/movie/land', - -nph=>1); - -The B<-nph> parameter, if set to a true value, will issue the correct -headers to work with a NPH (no-parse-header) script. This is important -to use with certain servers, such as Microsoft Internet Explorer, which -expect all their scripts to be NPH. - -=head2 CREATING THE HTML DOCUMENT HEADER - - print $query->start_html(-title=>'Secrets of the Pyramids', - -author=>'fred@capricorn.org', - -base=>'true', - -target=>'_blank', - -meta=>{'keywords'=>'pharaoh secret mummy', - 'copyright'=>'copyright 1996 King Tut'}, - -style=>{'src'=>'/styles/style1.css'}, - -BGCOLOR=>'blue'); - -After creating the HTTP header, most CGI scripts will start writing -out an HTML document. The start_html() routine creates the top of the -page, along with a lot of optional information that controls the -page's appearance and behavior. - -This method returns a canned HTML header and the opening tag. -All parameters are optional. In the named parameter form, recognized -parameters are -title, -author, -base, -xbase, -dtd, -lang and -target -(see below for the explanation). Any additional parameters you -provide, such as the Netscape unofficial BGCOLOR attribute, are added -to the tag. Additional parameters must be proceeded by a -hyphen. - -The argument B<-xbase> allows you to provide an HREF for the tag -different from the current location, as in - - -xbase=>"http://home.mcom.com/" - -All relative links will be interpreted relative to this tag. - -The argument B<-target> allows you to provide a default target frame -for all the links and fill-out forms on the page. B -See the Netscape documentation on frames for details of how to -manipulate this. - - -target=>"answer_window" - -All relative links will be interpreted relative to this tag. -You add arbitrary meta information to the header with the B<-meta> -argument. This argument expects a reference to an associative array -containing name/value pairs of meta information. These will be turned -into a series of header tags that look something like this: - - - - -To create an HTTP-EQUIV type of tag, use B<-head>, described -below. - -The B<-style> argument is used to incorporate cascading stylesheets -into your code. See the section on CASCADING STYLESHEETS for more -information. - -The B<-lang> argument is used to incorporate a language attribute into -the tag. The default if not specified is "en-US" for US -English. For example: - - print $q->start_html(-lang=>'fr-CA'); - -You can place other arbitrary HTML elements to the section with the -B<-head> tag. For example, to place the rarely-used element in the -head section, use this: - - print start_html(-head=>Link({-rel=>'next', - -href=>'http://www.capricorn.com/s2.html'})); - -To incorporate multiple HTML elements into the section, just pass an -array reference: - - print start_html(-head=>[ - Link({-rel=>'next', - -href=>'http://www.capricorn.com/s2.html'}), - Link({-rel=>'previous', - -href=>'http://www.capricorn.com/s1.html'}) - ] - ); - -And here's how to create an HTTP-EQUIV tag: - - print start_html(-head=>meta({-http_equiv => 'Content-Type', - -content => 'text/html'})) - - -JAVASCRIPTING: The B<-script>, B<-noScript>, B<-onLoad>, -B<-onMouseOver>, B<-onMouseOut> and B<-onUnload> parameters are used -to add Netscape JavaScript calls to your pages. B<-script> should -point to a block of text containing JavaScript function definitions. -This block will be placed within a \n"; - warningsToBrowser(1); # re-enable warnings - -Note: In this respect warningsToBrowser() differs fundamentally from -fatalsToBrowser(), which you should never call yourself! - -=head1 CHANGE LOG - -1.05 carpout() added and minor corrections by Marc Hedlund - on 11/26/95. - -1.06 fatalsToBrowser() no longer aborts for fatal errors within - eval() statements. - -1.08 set_message() added and carpout() expanded to allow for FileHandle - objects. - -1.09 set_message() now allows users to pass a code REFERENCE for - really custom error messages. croak and carp are now - exported by default. Thanks to Gunther Birznieks for the - patches. - -1.10 Patch from Chris Dean (ctdean@cogit.com) to allow - module to run correctly under mod_perl. - -1.11 Changed order of > and < escapes. - -1.12 Changed die() on line 217 to CORE::die to avoid B<-w> warning. - -1.13 Added cluck() to make the module orthogonal with Carp. - More mod_perl related fixes. - -1.20 Patch from Ilmari Karonen (perl@itz.pp.sci.fi): Added - warningsToBrowser(). Replaced tags with
     in
    -     fatalsToBrowser() output.
    -
    -=head1 AUTHORS
    -
    -Copyright 1995-1998, Lincoln D. Stein.  All rights reserved.  
    -
    -This library is free software; you can redistribute it and/or modify
    -it under the same terms as Perl itself.
    -
    -Address bug reports and comments to: lstein@cshl.org
    -
    -=head1 SEE ALSO
    -
    -Carp, CGI::Base, CGI::BasePlus, CGI::Request, CGI::MiniSvr, CGI::Form,
    -CGI::Response
    -
    -=cut
    -
    -require 5.000;
    -use Exporter;
    -use Carp;
    -
    -@ISA = qw(Exporter);
    -@EXPORT = qw(confess croak carp);
    -@EXPORT_OK = qw(carpout fatalsToBrowser warningsToBrowser wrap set_message cluck);
    -
    -$main::SIG{__WARN__}=\&CGI::Carp::warn;
    -$main::SIG{__DIE__}=\&CGI::Carp::die;
    -$CGI::Carp::VERSION = '1.20';
    -$CGI::Carp::CUSTOM_MSG = undef;
    -
    -# fancy import routine detects and handles 'errorWrap' specially.
    -sub import {
    -    my $pkg = shift;
    -    my(%routines);
    -    grep($routines{$_}++,@_,@EXPORT);
    -    $WRAP++ if $routines{'fatalsToBrowser'} || $routines{'wrap'};
    -    $WARN++ if $routines{'warningsToBrowser'};
    -    my($oldlevel) = $Exporter::ExportLevel;
    -    $Exporter::ExportLevel = 1;
    -    Exporter::import($pkg,keys %routines);
    -    $Exporter::ExportLevel = $oldlevel;
    -}
    -
    -# These are the originals
    -sub realwarn { CORE::warn(@_); }
    -sub realdie { CORE::die(@_); }
    -
    -sub id {
    -    my $level = shift;
    -    my($pack,$file,$line,$sub) = caller($level);
    -    my($id) = $file=~m|([^/]+)$|;
    -    return ($file,$line,$id);
    -}
    -
    -sub stamp {
    -    my $time = scalar(localtime);
    -    my $frame = 0;
    -    my ($id,$pack,$file);
    -    do {
    -	$id = $file;
    -	($pack,$file) = caller($frame++);
    -    } until !$file;
    -    ($id) = $id=~m|([^/]+)$|;
    -    return "[$time] $id: ";
    -}
    -
    -sub warn {
    -    my $message = shift;
    -    my($file,$line,$id) = id(1);
    -    $message .= " at $file line $line.\n" unless $message=~/\n$/;
    -    _warn($message) if $WARN;
    -    my $stamp = stamp;
    -    $message=~s/^/$stamp/gm;
    -    realwarn $message;
    -}
    -
    -sub _warn {
    -    my $msg = shift;
    -    if ($EMIT_WARNINGS) {
    -	# We need to mangle the message a bit to make it a valid HTML
    -	# comment.  This is done by substituting similar-looking ISO
    -	# 8859-1 characters for <, > and -.  This is a hack.
    -	$msg =~ tr/<>-/\253\273\255/;
    -	chomp $msg;
    -	print STDOUT "\n";
    -    } else {
    -	push @WARNINGS, $msg;
    -    }
    -}
    -
    -sub ineval { _longmess() =~ /eval [\{\']/m }
    -
    -# The mod_perl package Apache::Registry loads CGI programs by calling
    -# eval.  These evals don't count when looking at the stack backtrace.
    -sub _longmess {
    -    my $message = Carp::longmess();
    -    my $mod_perl = exists $ENV{MOD_PERL};
    -    $message =~ s,eval[^\n]+Apache/Registry\.pm.*,,s if $mod_perl;
    -    return $message;    
    -}
    -
    -sub die {
    -  realdie @_ if ineval;
    -  my ($message) = @_;
    -  my $time = scalar(localtime);
    -  my($file,$line,$id) = id(1);
    -  $message .= " at $file line $line." unless $message=~/\n$/;
    -  &fatalsToBrowser($message) if $WRAP;
    -  my $stamp = stamp;
    -  $message=~s/^/$stamp/gm;
    -  realdie $message;
    -}
    -
    -sub set_message {
    -    $CGI::Carp::CUSTOM_MSG = shift;
    -    return $CGI::Carp::CUSTOM_MSG;
    -}
    -
    -# Avoid generating "subroutine redefined" warnings with the following
    -# hack:
    -{
    -    local $^W=0;
    -    eval <&STDERR");
    -    open(STDERR, ">&$no") or 
    -	( print SAVEERR "Unable to redirect STDERR: $!\n" and exit(1) );
    -}
    -
    -sub warningsToBrowser {
    -    $EMIT_WARNINGS = @_ ? shift : 1;
    -    _warn(shift @WARNINGS) while $EMIT_WARNINGS and @WARNINGS;
    -}
    -
    -# headers
    -sub fatalsToBrowser {
    -    my($msg) = @_;
    -    $msg=~s/&/&/g;
    -    $msg=~s/>/>/g;
    -    $msg=~s/$ENV{SERVER_ADMIN})] :
    -	"this site's webmaster";
    -    my ($outer_message) = <Software error:
    -
    $msg
    -

    -$outer_message -END - ; - - if ($mod_perl && (my $r = Apache->request)) { - # If bytes have already been sent, then - # we print the message out directly. - # Otherwise we make a custom error - # handler to produce the doc for us. - if ($r->bytes_sent) { - $r->print($mess); - $r->exit; - } else { - $r->status(500); - $r->custom_response(500,$mess); - } - } else { - print STDOUT $mess; - } -} - -# Cut and paste from CGI.pm so that we don't have the overhead of -# always loading the entire CGI module. -sub to_filehandle { - my $thingy = shift; - return undef unless $thingy; - return $thingy if UNIVERSAL::isa($thingy,'GLOB'); - return $thingy if UNIVERSAL::isa($thingy,'FileHandle'); - if (!ref($thingy)) { - my $caller = 1; - while (my $package = caller($caller++)) { - my($tmp) = $thingy=~/[\':]/ ? $thingy : "$package\:\:$thingy"; - return $tmp if defined(fileno($tmp)); - } - } - return undef; -} - -1; diff --git a/lib/perl5/5.6.1/CGI/Cookie.pm b/lib/perl5/5.6.1/CGI/Cookie.pm deleted file mode 100644 index de91be27..00000000 --- a/lib/perl5/5.6.1/CGI/Cookie.pm +++ /dev/null @@ -1,429 +0,0 @@ -package CGI::Cookie; - -# See the bottom of this file for the POD documentation. Search for the -# string '=head'. - -# You can run this file through either pod2man or pod2html to produce pretty -# documentation in manual or html file format (these utilities are part of the -# Perl 5 distribution). - -# Copyright 1995-1999, Lincoln D. Stein. All rights reserved. -# It may be used and modified freely, but I do request that this copyright -# notice remain attached to the file. You may modify this module as you -# wish, but if you redistribute a modified version, please attach a note -# listing the modifications you have made. - -$CGI::Cookie::VERSION='1.18'; - -use CGI::Util qw(rearrange unescape escape); -use overload '""' => \&as_string, - 'cmp' => \&compare, - 'fallback'=>1; - -# fetch a list of cookies from the environment and -# return as a hash. the cookies are parsed as normal -# escaped URL data. -sub fetch { - my $class = shift; - my $raw_cookie = $ENV{HTTP_COOKIE} || $ENV{COOKIE}; - return () unless $raw_cookie; - return $class->parse($raw_cookie); -} - -# fetch a list of cookies from the environment and -# return as a hash. the cookie values are not unescaped -# or altered in any way. -sub raw_fetch { - my $class = shift; - my $raw_cookie = $ENV{HTTP_COOKIE} || $ENV{COOKIE}; - return () unless $raw_cookie; - my %results; - my($key,$value); - - my(@pairs) = split("; ?",$raw_cookie); - foreach (@pairs) { - s/\s*(.*?)\s*/$1/; - if (/^([^=]+)=(.*)/) { - $key = $1; - $value = $2; - } - else { - $key = $_; - $value = ''; - } - $results{$key} = $value; - } - return \%results unless wantarray; - return %results; -} - - -sub parse { - my ($self,$raw_cookie) = @_; - my %results; - - my(@pairs) = split("; ?",$raw_cookie); - foreach (@pairs) { - s/\s*(.*?)\s*/$1/; - my($key,$value) = split("="); - - # Some foreign cookies are not in name=value format, so ignore - # them. - next if !defined($value); - my @values = (); - if ($value ne '') { - @values = map CGI::unescape($_),split(/[&;]/,$value.'&dmy'); - pop @values; - } - $key = unescape($key); - # A bug in Netscape can cause several cookies with same name to - # appear. The FIRST one in HTTP_COOKIE is the most recent version. - $results{$key} ||= $self->new(-name=>$key,-value=>\@values); - } - return \%results unless wantarray; - return %results; -} - -sub new { - my $class = shift; - $class = ref($class) if ref($class); - my($name,$value,$path,$domain,$secure,$expires) = - rearrange([NAME,[VALUE,VALUES],PATH,DOMAIN,SECURE,EXPIRES],@_); - - # Pull out our parameters. - my @values; - if (ref($value)) { - if (ref($value) eq 'ARRAY') { - @values = @$value; - } elsif (ref($value) eq 'HASH') { - @values = %$value; - } - } else { - @values = ($value); - } - - bless my $self = { - 'name'=>$name, - 'value'=>[@values], - },$class; - - # IE requires the path and domain to be present for some reason. - $path ||= "/"; - # however, this breaks networks which use host tables without fully qualified - # names, so we comment it out. - # $domain = CGI::virtual_host() unless defined $domain; - - $self->path($path) if defined $path; - $self->domain($domain) if defined $domain; - $self->secure($secure) if defined $secure; - $self->expires($expires) if defined $expires; - return $self; -} - -sub as_string { - my $self = shift; - return "" unless $self->name; - - my(@constant_values,$domain,$path,$expires,$secure); - - push(@constant_values,"domain=$domain") if $domain = $self->domain; - push(@constant_values,"path=$path") if $path = $self->path; - push(@constant_values,"expires=$expires") if $expires = $self->expires; - push(@constant_values,"secure") if $secure = $self->secure; - - my($key) = escape($self->name); - my($cookie) = join("=",$key,join("&",map escape($_),$self->value)); - return join("; ",$cookie,@constant_values); -} - -sub compare { - my $self = shift; - my $value = shift; - return "$self" cmp $value; -} - -# accessors -sub name { - my $self = shift; - my $name = shift; - $self->{'name'} = $name if defined $name; - return $self->{'name'}; -} - -sub value { - my $self = shift; - my $value = shift; - $self->{'value'} = $value if defined $value; - return wantarray ? @{$self->{'value'}} : $self->{'value'}->[0] -} - -sub domain { - my $self = shift; - my $domain = shift; - $self->{'domain'} = $domain if defined $domain; - return $self->{'domain'}; -} - -sub secure { - my $self = shift; - my $secure = shift; - $self->{'secure'} = $secure if defined $secure; - return $self->{'secure'}; -} - -sub expires { - my $self = shift; - my $expires = shift; - $self->{'expires'} = CGI::Util::expires($expires,'cookie') if defined $expires; - return $self->{'expires'}; -} - -sub path { - my $self = shift; - my $path = shift; - $self->{'path'} = $path if defined $path; - return $self->{'path'}; -} - -1; - -=head1 NAME - -CGI::Cookie - Interface to Netscape Cookies - -=head1 SYNOPSIS - - use CGI qw/:standard/; - use CGI::Cookie; - - # Create new cookies and send them - $cookie1 = new CGI::Cookie(-name=>'ID',-value=>123456); - $cookie2 = new CGI::Cookie(-name=>'preferences', - -value=>{ font => Helvetica, - size => 12 } - ); - print header(-cookie=>[$cookie1,$cookie2]); - - # fetch existing cookies - %cookies = fetch CGI::Cookie; - $id = $cookies{'ID'}->value; - - # create cookies returned from an external source - %cookies = parse CGI::Cookie($ENV{COOKIE}); - -=head1 DESCRIPTION - -CGI::Cookie is an interface to Netscape (HTTP/1.1) cookies, an -innovation that allows Web servers to store persistent information on -the browser's side of the connection. Although CGI::Cookie is -intended to be used in conjunction with CGI.pm (and is in fact used by -it internally), you can use this module independently. - -For full information on cookies see - - http://www.ics.uci.edu/pub/ietf/http/rfc2109.txt - -=head1 USING CGI::Cookie - -CGI::Cookie is object oriented. Each cookie object has a name and a -value. The name is any scalar value. The value is any scalar or -array value (associative arrays are also allowed). Cookies also have -several optional attributes, including: - -=over 4 - -=item B<1. expiration date> - -The expiration date tells the browser how long to hang on to the -cookie. If the cookie specifies an expiration date in the future, the -browser will store the cookie information in a disk file and return it -to the server every time the user reconnects (until the expiration -date is reached). If the cookie species an expiration date in the -past, the browser will remove the cookie from the disk file. If the -expiration date is not specified, the cookie will persist only until -the user quits the browser. - -=item B<2. domain> - -This is a partial or complete domain name for which the cookie is -valid. The browser will return the cookie to any host that matches -the partial domain name. For example, if you specify a domain name -of ".capricorn.com", then Netscape will return the cookie to -Web servers running on any of the machines "www.capricorn.com", -"ftp.capricorn.com", "feckless.capricorn.com", etc. Domain names -must contain at least two periods to prevent attempts to match -on top level domains like ".edu". If no domain is specified, then -the browser will only return the cookie to servers on the host the -cookie originated from. - -=item B<3. path> - -If you provide a cookie path attribute, the browser will check it -against your script's URL before returning the cookie. For example, -if you specify the path "/cgi-bin", then the cookie will be returned -to each of the scripts "/cgi-bin/tally.pl", "/cgi-bin/order.pl", and -"/cgi-bin/customer_service/complain.pl", but not to the script -"/cgi-private/site_admin.pl". By default, the path is set to "/", so -that all scripts at your site will receive the cookie. - -=item B<4. secure flag> - -If the "secure" attribute is set, the cookie will only be sent to your -script if the CGI request is occurring on a secure channel, such as SSL. - -=back - -=head2 Creating New Cookies - - $c = new CGI::Cookie(-name => 'foo', - -value => 'bar', - -expires => '+3M', - -domain => '.capricorn.com', - -path => '/cgi-bin/database' - -secure => 1 - ); - -Create cookies from scratch with the B method. The B<-name> and -B<-value> parameters are required. The name must be a scalar value. -The value can be a scalar, an array reference, or a hash reference. -(At some point in the future cookies will support one of the Perl -object serialization protocols for full generality). - -B<-expires> accepts any of the relative or absolute date formats -recognized by CGI.pm, for example "+3M" for three months in the -future. See CGI.pm's documentation for details. - -B<-domain> points to a domain name or to a fully qualified host name. -If not specified, the cookie will be returned only to the Web server -that created it. - -B<-path> points to a partial URL on the current server. The cookie -will be returned to all URLs beginning with the specified path. If -not specified, it defaults to '/', which returns the cookie to all -pages at your site. - -B<-secure> if set to a true value instructs the browser to return the -cookie only when a cryptographic protocol is in use. - -=head2 Sending the Cookie to the Browser - -Within a CGI script you can send a cookie to the browser by creating -one or more Set-Cookie: fields in the HTTP header. Here is a typical -sequence: - - my $c = new CGI::Cookie(-name => 'foo', - -value => ['bar','baz'], - -expires => '+3M'); - - print "Set-Cookie: $c\n"; - print "Content-Type: text/html\n\n"; - -To send more than one cookie, create several Set-Cookie: fields. -Alternatively, you may concatenate the cookies together with "; " and -send them in one field. - -If you are using CGI.pm, you send cookies by providing a -cookie -argument to the header() method: - - print header(-cookie=>$c); - -Mod_perl users can set cookies using the request object's header_out() -method: - - $r->header_out('Set-Cookie',$c); - -Internally, Cookie overloads the "" operator to call its as_string() -method when incorporated into the HTTP header. as_string() turns the -Cookie's internal representation into an RFC-compliant text -representation. You may call as_string() yourself if you prefer: - - print "Set-Cookie: ",$c->as_string,"\n"; - -=head2 Recovering Previous Cookies - - %cookies = fetch CGI::Cookie; - -B returns an associative array consisting of all cookies -returned by the browser. The keys of the array are the cookie names. You -can iterate through the cookies this way: - - %cookies = fetch CGI::Cookie; - foreach (keys %cookies) { - do_something($cookies{$_}); - } - -In a scalar context, fetch() returns a hash reference, which may be more -efficient if you are manipulating multiple cookies. - -CGI.pm uses the URL escaping methods to save and restore reserved characters -in its cookies. If you are trying to retrieve a cookie set by a foreign server, -this escaping method may trip you up. Use raw_fetch() instead, which has the -same semantics as fetch(), but performs no unescaping. - -You may also retrieve cookies that were stored in some external -form using the parse() class method: - - $COOKIES = `cat /usr/tmp/Cookie_stash`; - %cookies = parse CGI::Cookie($COOKIES); - -=head2 Manipulating Cookies - -Cookie objects have a series of accessor methods to get and set cookie -attributes. Each accessor has a similar syntax. Called without -arguments, the accessor returns the current value of the attribute. -Called with an argument, the accessor changes the attribute and -returns its new value. - -=over 4 - -=item B - -Get or set the cookie's name. Example: - - $name = $c->name; - $new_name = $c->name('fred'); - -=item B - -Get or set the cookie's value. Example: - - $value = $c->value; - @new_value = $c->value(['a','b','c','d']); - -B is context sensitive. In a list context it will return -the current value of the cookie as an array. In a scalar context it -will return the B value of a multivalued cookie. - -=item B - -Get or set the cookie's domain. - -=item B - -Get or set the cookie's path. - -=item B - -Get or set the cookie's expiration time. - -=back - - -=head1 AUTHOR INFORMATION - -Copyright 1997-1998, Lincoln D. Stein. All rights reserved. - -This library is free software; you can redistribute it and/or modify -it under the same terms as Perl itself. - -Address bug reports and comments to: lstein@cshl.org - -=head1 BUGS - -This section intentionally left blank. - -=head1 SEE ALSO - -L, L - -=cut diff --git a/lib/perl5/5.6.1/CGI/Fast.pm b/lib/perl5/5.6.1/CGI/Fast.pm deleted file mode 100644 index b4851862..00000000 --- a/lib/perl5/5.6.1/CGI/Fast.pm +++ /dev/null @@ -1,174 +0,0 @@ -package CGI::Fast; - -# See the bottom of this file for the POD documentation. Search for the -# string '=head'. - -# You can run this file through either pod2man or pod2html to produce pretty -# documentation in manual or html file format (these utilities are part of the -# Perl 5 distribution). - -# Copyright 1995,1996, Lincoln D. Stein. All rights reserved. -# It may be used and modified freely, but I do request that this copyright -# notice remain attached to the file. You may modify this module as you -# wish, but if you redistribute a modified version, please attach a note -# listing the modifications you have made. - -# The most recent version and complete docs are available at: -# http://www.genome.wi.mit.edu/ftp/pub/software/WWW/cgi_docs.html -# ftp://ftp-genome.wi.mit.edu/pub/software/WWW/ -$CGI::Fast::VERSION='1.02'; - -use CGI; -use FCGI; -@ISA = ('CGI'); - -# workaround for known bug in libfcgi -while (($ignore) = each %ENV) { } - -# override the initialization behavior so that -# state is NOT maintained between invocations -sub save_request { - # no-op -} - -# New is slightly different in that it calls FCGI's -# accept() method. -sub new { - my ($self, $initializer, @param) = @_; - unless (defined $initializer) { - return undef unless FCGI::accept() >= 0; - } - return $CGI::Q = $self->SUPER::new($initializer, @param); -} - -1; - -=head1 NAME - -CGI::Fast - CGI Interface for Fast CGI - -=head1 SYNOPSIS - - use CGI::Fast qw(:standard); - $COUNTER = 0; - while (new CGI::Fast) { - print header; - print start_html("Fast CGI Rocks"); - print - h1("Fast CGI Rocks"), - "Invocation number ",b($COUNTER++), - " PID ",b($$),".", - hr; - print end_html; - } - -=head1 DESCRIPTION - -CGI::Fast is a subclass of the CGI object created by -CGI.pm. It is specialized to work well with the Open Market -FastCGI standard, which greatly speeds up CGI scripts by -turning them into persistently running server processes. Scripts -that perform time-consuming initialization processes, such as -loading large modules or opening persistent database connections, -will see large performance improvements. - -=head1 OTHER PIECES OF THE PUZZLE - -In order to use CGI::Fast you'll need a FastCGI-enabled Web -server. Open Market's server is FastCGI-savvy. There are also -freely redistributable FastCGI modules for NCSA httpd 1.5 and Apache. -FastCGI-enabling modules for Microsoft Internet Information Server and -Netscape Communications Server have been announced. - -In addition, you'll need a version of the Perl interpreter that has -been linked with the FastCGI I/O library. Precompiled binaries are -available for several platforms, including DEC Alpha, HP-UX and -SPARC/Solaris, or you can rebuild Perl from source with patches -provided in the FastCGI developer's kit. The FastCGI Perl interpreter -can be used in place of your normal Perl without ill consequences. - -You can find FastCGI modules for Apache and NCSA httpd, precompiled -Perl interpreters, and the FastCGI developer's kit all at URL: - - http://www.fastcgi.com/ - -=head1 WRITING FASTCGI PERL SCRIPTS - -FastCGI scripts are persistent: one or more copies of the script -are started up when the server initializes, and stay around until -the server exits or they die a natural death. After performing -whatever one-time initialization it needs, the script enters a -loop waiting for incoming connections, processing the request, and -waiting some more. - -A typical FastCGI script will look like this: - - #!/usr/local/bin/perl # must be a FastCGI version of perl! - use CGI::Fast; - &do_some_initialization(); - while ($q = new CGI::Fast) { - &process_request($q); - } - -Each time there's a new request, CGI::Fast returns a -CGI object to your loop. The rest of the time your script -waits in the call to new(). When the server requests that -your script be terminated, new() will return undef. You can -of course exit earlier if you choose. A new version of the -script will be respawned to take its place (this may be -necessary in order to avoid Perl memory leaks in long-running -scripts). - -CGI.pm's default CGI object mode also works. Just modify the loop -this way: - - while (new CGI::Fast) { - &process_request; - } - -Calls to header(), start_form(), etc. will all operate on the -current request. - -=head1 INSTALLING FASTCGI SCRIPTS - -See the FastCGI developer's kit documentation for full details. On -the Apache server, the following line must be added to srm.conf: - - AddType application/x-httpd-fcgi .fcgi - -FastCGI scripts must end in the extension .fcgi. For each script you -install, you must add something like the following to srm.conf: - - AppClass /usr/etc/httpd/fcgi-bin/file_upload.fcgi -processes 2 - -This instructs Apache to launch two copies of file_upload.fcgi at -startup time. - -=head1 USING FASTCGI SCRIPTS AS CGI SCRIPTS - -Any script that works correctly as a FastCGI script will also work -correctly when installed as a vanilla CGI script. However it will -not see any performance benefit. - -=head1 CAVEATS - -I haven't tested this very much. - -=head1 AUTHOR INFORMATION - -Copyright 1996-1998, Lincoln D. Stein. All rights reserved. - -This library is free software; you can redistribute it and/or modify -it under the same terms as Perl itself. - -Address bug reports and comments to: lstein@cshl.org - -=head1 BUGS - -This section intentionally left blank. - -=head1 SEE ALSO - -L, L - -=cut diff --git a/lib/perl5/5.6.1/CGI/Pretty.pm b/lib/perl5/5.6.1/CGI/Pretty.pm deleted file mode 100644 index a26ab81d..00000000 --- a/lib/perl5/5.6.1/CGI/Pretty.pm +++ /dev/null @@ -1,235 +0,0 @@ -package CGI::Pretty; - -# See the bottom of this file for the POD documentation. Search for the -# string '=head'. - -# You can run this file through either pod2man or pod2html to produce pretty -# documentation in manual or html file format (these utilities are part of the -# Perl 5 distribution). - -use strict; -use CGI (); - -$CGI::Pretty::VERSION = '1.05'; -$CGI::DefaultClass = __PACKAGE__; -$CGI::Pretty::AutoloadClass = 'CGI'; -@CGI::Pretty::ISA = qw( CGI ); - -initialize_globals(); - -sub _prettyPrint { - my $input = shift; - - foreach my $i ( @CGI::Pretty::AS_IS ) { - if ( $$input =~ /<\/$i>/si ) { - my ( $a, $b, $c, $d, $e ) = $$input =~ /(.*)<$i(\s?)(.*?)>(.*?)<\/$i>(.*)/si; - _prettyPrint( \$a ); - _prettyPrint( \$e ); - - $$input = "$a<$i$b$c>$d$e"; - return; - } - } - $$input =~ s/$CGI::Pretty::LINEBREAK/$CGI::Pretty::LINEBREAK$CGI::Pretty::INDENT/g if $CGI::Pretty::LINEBREAK; -} - -sub comment { - my($self,@p) = CGI::self_or_CGI(@_); - - my $s = "@p"; - $s =~ s/$CGI::Pretty::LINEBREAK/$CGI::Pretty::LINEBREAK$CGI::Pretty::INDENT/g if $CGI::Pretty::LINEBREAK; - - return $self->SUPER::comment( "$CGI::Pretty::LINEBREAK$CGI::Pretty::INDENT$s$CGI::Pretty::LINEBREAK" ) . $CGI::Pretty::LINEBREAK; -} - -sub _make_tag_func { - my ($self,$tagname) = @_; - return $self->SUPER::_make_tag_func($tagname) if $tagname=~/^(start|end)_/; - - # As Lincoln as noted, the last else clause is VERY hairy, and it - # took me a while to figure out what I was trying to do. - # What it does is look for tags that shouldn't be indented (e.g. PRE) - # and makes sure that when we nest tags, those tags don't get - # indented. - # For an example, try print td( pre( "hello\nworld" ) ); - # If we didn't care about stuff like that, the code would be - # MUCH simpler. BTW: I won't claim to be a regular expression - # guru, so if anybody wants to contribute something that would - # be quicker, easier to read, etc, I would be more than - # willing to put it in - Brian - - return qq{ - sub $tagname { - # handle various cases in which we're called - # most of this bizarre stuff is to avoid -w errors - shift if \$_[0] && - (ref(\$_[0]) && - (substr(ref(\$_[0]),0,3) eq 'CGI' || - UNIVERSAL::isa(\$_[0],'CGI'))); - - my(\$attr) = ''; - if (ref(\$_[0]) && ref(\$_[0]) eq 'HASH') { - my(\@attr) = make_attributes(shift); - \$attr = " \@attr" if \@attr; - } - - my(\$tag,\$untag) = ("\L<$tagname\E\$attr>","\L\E"); - return \$tag unless \@_; - - my \@result; - my \$NON_PRETTIFY_ENDTAGS = join "", map { "" } \@CGI::Pretty::AS_IS; - - if ( \$NON_PRETTIFY_ENDTAGS =~ /\$untag/ ) { - \@result = map { "\$tag\$_\$untag\$CGI::Pretty::LINEBREAK" } - (ref(\$_[0]) eq 'ARRAY') ? \@{\$_[0]} : "\@_"; - } - else { - \@result = map { - chomp; - if ( \$_ !~ /<\\// ) { - s/\$CGI::Pretty::LINEBREAK/\$CGI::Pretty::LINEBREAK\$CGI::Pretty::INDENT/g if \$CGI::Pretty::LINEBREAK; - } - else { - my \$tmp = \$_; - CGI::Pretty::_prettyPrint( \\\$tmp ); - \$_ = \$tmp; - } - "\$tag\$CGI::Pretty::LINEBREAK\$CGI::Pretty::INDENT\$_\$CGI::Pretty::LINEBREAK\$untag\$CGI::Pretty::LINEBREAK" } - (ref(\$_[0]) eq 'ARRAY') ? \@{\$_[0]} : "\@_"; - } - local \$" = ""; - return "\@result"; - } - }; -} - -sub start_html { - return CGI::start_html( @_ ) . $CGI::Pretty::LINEBREAK; -} - -sub end_html { - return CGI::end_html( @_ ) . $CGI::Pretty::LINEBREAK; -} - -sub new { - my $class = shift; - my $this = $class->SUPER::new( @_ ); - - Apache->request->register_cleanup(\&CGI::Pretty::_reset_globals) if ($CGI::MOD_PERL); - $class->_reset_globals if $CGI::PERLEX; - - return bless $this, $class; -} - -sub initialize_globals { - # This is the string used for indentation of tags - $CGI::Pretty::INDENT = "\t"; - - # This is the string used for seperation between tags - $CGI::Pretty::LINEBREAK = "\n"; - - # These tags are not prettify'd. - @CGI::Pretty::AS_IS = qw( a pre code script textarea ); - - 1; -} -sub _reset_globals { initialize_globals(); } - -1; - -=head1 NAME - -CGI::Pretty - module to produce nicely formatted HTML code - -=head1 SYNOPSIS - - use CGI::Pretty qw( :html3 ); - - # Print a table with a single data element - print table( TR( td( "foo" ) ) ); - -=head1 DESCRIPTION - -CGI::Pretty is a module that derives from CGI. It's sole function is to -allow users of CGI to output nicely formatted HTML code. - -When using the CGI module, the following code: - print table( TR( td( "foo" ) ) ); - -produces the following output: -
    foo
    - -If a user were to create a table consisting of many rows and many columns, -the resultant HTML code would be quite difficult to read since it has no -carriage returns or indentation. - -CGI::Pretty fixes this problem. What it does is add a carriage -return and indentation to the HTML code so that one can easily read -it. - - print table( TR( td( "foo" ) ) ); - -now produces the following output: - - - - -
    - foo -
    - - -=head2 Tags that won't be formatted - -The and

     tags are not formatted.  If these tags were formatted, the
    -user would see the extra indentation on the web browser causing the page to
    -look different than what would be expected.  If you wish to add more tags to
    -the list of tags that are not to be touched, push them onto the C<@AS_IS> array:
    -
    -    push @CGI::Pretty::AS_IS,qw(CODE XMP);
    -
    -=head2 Customizing the Indenting
    -
    -If you wish to have your own personal style of indenting, you can change the
    -C<$INDENT> variable:
    -
    -    $CGI::Pretty::INDENT = "\t\t";
    -
    -would cause the indents to be two tabs.
    -
    -Similarly, if you wish to have more space between lines, you may change the
    -C<$LINEBREAK> variable:
    -
    -    $CGI::Pretty::LINEBREAK = "\n\n";
    -
    -would create two carriage returns between lines.
    -
    -If you decide you want to use the regular CGI indenting, you can easily do 
    -the following:
    -
    -    $CGI::Pretty::INDENT = $CGI::Pretty::LINEBREAK = "";
    -
    -=head1 BUGS
    -
    -This section intentionally left blank.
    -
    -=head1 AUTHOR
    -
    -Brian Paulsen , with minor modifications by
    -Lincoln Stein  for incorporation into the CGI.pm
    -distribution.
    -
    -Copyright 1999, Brian Paulsen.  All rights reserved.
    -
    -This library is free software; you can redistribute it and/or modify
    -it under the same terms as Perl itself.
    -
    -Bug reports and comments to Brian@ThePaulsens.com.  You can also write
    -to lstein@cshl.org, but this code looks pretty hairy to me and I'm not
    -sure I understand it!
    -
    -=head1 SEE ALSO
    -
    -L
    -
    -=cut
    diff --git a/lib/perl5/5.6.1/CGI/Push.pm b/lib/perl5/5.6.1/CGI/Push.pm
    deleted file mode 100644
    index 9e72abda..00000000
    --- a/lib/perl5/5.6.1/CGI/Push.pm
    +++ /dev/null
    @@ -1,325 +0,0 @@
    -package CGI::Push;
    -
    -# See the bottom of this file for the POD documentation.  Search for the
    -# string '=head'.
    -
    -# You can run this file through either pod2man or pod2html to produce pretty
    -# documentation in manual or html file format (these utilities are part of the
    -# Perl 5 distribution).
    -
    -# Copyright 1995-2000, Lincoln D. Stein.  All rights reserved.
    -# It may be used and modified freely, but I do request that this copyright
    -# notice remain attached to the file.  You may modify this module as you 
    -# wish, but if you redistribute a modified version, please attach a note
    -# listing the modifications you have made.
    -
    -# The most recent version and complete docs are available at:
    -#   http://stein.cshl.org/WWW/software/CGI/
    -
    -$CGI::Push::VERSION='1.04';
    -use CGI;
    -use CGI::Util 'rearrange';
    -@ISA = ('CGI');
    -
    -$CGI::DefaultClass = 'CGI::Push';
    -$CGI::Push::AutoloadClass = 'CGI';
    -
    -# add do_push() and push_delay() to exported tags
    -push(@{$CGI::EXPORT_TAGS{':standard'}},'do_push','push_delay');
    -
    -sub do_push {
    -    my ($self,@p) = CGI::self_or_default(@_);
    -
    -    # unbuffer output
    -    $| = 1;
    -    srand;
    -    my ($random) = sprintf("%08.0f",rand()*1E8);
    -    my ($boundary) = "----=_NeXtPaRt$random";
    -
    -    my (@header);
    -    my ($type,$callback,$delay,$last_page,$cookie,$target,$expires,$nph,@other) = rearrange([TYPE,NEXT_PAGE,DELAY,LAST_PAGE,[COOKIE,COOKIES],TARGET,EXPIRES,NPH],@p);
    -    $type = 'text/html' unless $type;
    -    $callback = \&simple_counter unless $callback && ref($callback) eq 'CODE';
    -    $delay = 1 unless defined($delay);
    -    $self->push_delay($delay);
    -    $nph = 1 unless defined($nph);
    -
    -    my(@o);
    -    foreach (@other) { push(@o,split("=")); }
    -    push(@o,'-Target'=>$target) if defined($target);
    -    push(@o,'-Cookie'=>$cookie) if defined($cookie);
    -    push(@o,'-Type'=>"multipart/x-mixed-replace;boundary=\"$boundary\"");
    -    push(@o,'-Server'=>"CGI.pm Push Module") if $nph;
    -    push(@o,'-Status'=>'200 OK');
    -    push(@o,'-nph'=>1) if $nph;
    -    print $self->header(@o);
    -
    -    $boundary = "$CGI::CRLF--$boundary";
    -
    -    print "WARNING: YOUR BROWSER DOESN'T SUPPORT THIS SERVER-PUSH TECHNOLOGY.${boundary}$CGI::CRLF";
    -
    -    my (@contents) = &$callback($self,++$COUNTER);
    -
    -    # now we enter a little loop
    -    while (1) {
    -        print "Content-type: ${type}$CGI::CRLF$CGI::CRLF" unless $type =~ /^dynamic|heterogeneous$/i;
    -        print @contents;
    -        @contents = &$callback($self,++$COUNTER);
    -        if ((@contents) && defined($contents[0])) {
    -            print "${boundary}$CGI::CRLF";
    -            do_sleep($self->push_delay()) if $self->push_delay();
    -        } else {
    -            if ($last_page && ref($last_page) eq 'CODE') {
    -                print "${boundary}$CGI::CRLF";
    -                do_sleep($self->push_delay()) if $self->push_delay();
    -                print "Content-type: ${type}$CGI::CRLF$CGI::CRLF" unless $type =~ /^dynamic|heterogeneous$/i;
    -                print  &$last_page($self,$COUNTER);
    -            }
    -            print "${boundary}--$CGI::CRLF";
    -            last;
    -        }
    -    }
    -    print "WARNING: YOUR BROWSER DOESN'T SUPPORT THIS SERVER-PUSH TECHNOLOGY.$CGI::CRLF";
    -}
    -
    -sub simple_counter {
    -    my ($self,$count) = @_;
    -    return $self->start_html("CGI::Push Default Counter"),
    -           $self->h1("CGI::Push Default Counter"),
    -           "This page has been updated ",$self->strong($count)," times.",
    -           $self->hr(),
    -           $self->a({'-href'=>'http://www.genome.wi.mit.edu/ftp/pub/software/WWW/cgi_docs.html'},'CGI.pm home page'),
    -           $self->end_html;
    -}
    -
    -sub do_sleep {
    -    my $delay = shift;
    -    if ( ($delay >= 1) && ($delay!~/\./) ){
    -        sleep($delay);
    -    } else {
    -        select(undef,undef,undef,$delay);
    -    }
    -}
    -
    -sub push_delay {
    -    my ($self,$delay) = CGI::self_or_default(@_);
    -    return defined($delay) ? $self->{'.delay'} = 
    -        $delay : $self->{'.delay'};
    -}
    -
    -1;
    -
    -=head1 NAME
    -
    -CGI::Push - Simple Interface to Server Push
    -
    -=head1 SYNOPSIS
    -
    -    use CGI::Push qw(:standard);
    -
    -    do_push(-next_page=>\&next_page,
    -            -last_page=>\&last_page,
    -            -delay=>0.5);
    -
    -    sub next_page {
    -        my($q,$counter) = @_;
    -        return undef if $counter >= 10;
    -        return start_html('Test'),
    -               h1('Visible'),"\n",
    -               "This page has been called ", strong($counter)," times",
    -               end_html();
    -    }
    -
    -    sub last_page {
    -        my($q,$counter) = @_;
    -        return start_html('Done'),
    -               h1('Finished'),
    -               strong($counter - 1),' iterations.',
    -               end_html;
    -    }
    -
    -=head1 DESCRIPTION
    -
    -CGI::Push is a subclass of the CGI object created by CGI.pm.  It is
    -specialized for server push operations, which allow you to create
    -animated pages whose content changes at regular intervals.
    -
    -You provide CGI::Push with a pointer to a subroutine that will draw
    -one page.  Every time your subroutine is called, it generates a new
    -page.  The contents of the page will be transmitted to the browser
    -in such a way that it will replace what was there beforehand.  The
    -technique will work with HTML pages as well as with graphics files, 
    -allowing you to create animated GIFs.
    -
    -Only Netscape Navigator supports server push.  Internet Explorer
    -browsers do not.
    -
    -=head1 USING CGI::Push
    -
    -CGI::Push adds one new method to the standard CGI suite, do_push().
    -When you call this method, you pass it a reference to a subroutine
    -that is responsible for drawing each new page, an interval delay, and
    -an optional subroutine for drawing the last page.  Other optional
    -parameters include most of those recognized by the CGI header()
    -method.
    -
    -You may call do_push() in the object oriented manner or not, as you
    -prefer:
    -
    -    use CGI::Push;
    -    $q = new CGI::Push;
    -    $q->do_push(-next_page=>\&draw_a_page);
    -
    -        -or-
    -
    -    use CGI::Push qw(:standard);
    -    do_push(-next_page=>\&draw_a_page);
    -
    -Parameters are as follows:
    -
    -=over 4
    -
    -=item -next_page
    -
    -    do_push(-next_page=>\&my_draw_routine);
    -
    -This required parameter points to a reference to a subroutine responsible for
    -drawing each new page.  The subroutine should expect two parameters
    -consisting of the CGI object and a counter indicating the number
    -of times the subroutine has been called.  It should return the
    -contents of the page as an B of one or more items to print.  
    -It can return a false value (or an empty array) in order to abort the
    -redrawing loop and print out the final page (if any)
    -
    -    sub my_draw_routine {
    -        my($q,$counter) = @_;
    -        return undef if $counter > 100;
    -        return start_html('testing'),
    -               h1('testing'),
    -               "This page called $counter times";
    -    }
    -
    -You are of course free to refer to create and use global variables
    -within your draw routine in order to achieve special effects.
    -
    -=item -last_page
    -
    -This optional parameter points to a reference to the subroutine
    -responsible for drawing the last page of the series.  It is called
    -after the -next_page routine returns a false value.  The subroutine
    -itself should have exactly the same calling conventions as the
    --next_page routine.
    -
    -=item -type
    -
    -This optional parameter indicates the content type of each page.  It
    -defaults to "text/html".  Normally the module assumes that each page
    -is of a homogenous MIME type.  However if you provide either of the
    -magic values "heterogeneous" or "dynamic" (the latter provided for the
    -convenience of those who hate long parameter names), you can specify
    -the MIME type -- and other header fields -- on a per-page basis.  See 
    -"heterogeneous pages" for more details.
    -
    -=item -delay
    -
    -This indicates the delay, in seconds, between frames.  Smaller delays
    -refresh the page faster.  Fractional values are allowed.
    -
    -B
    -
    -=item -cookie, -target, -expires, -nph
    -
    -These have the same meaning as the like-named parameters in
    -CGI::header().
    -
    -If not specified, -nph will default to 1 (as needed for many servers, see below).
    -
    -=back
    -
    -=head2 Heterogeneous Pages
    -
    -Ordinarily all pages displayed by CGI::Push share a common MIME type.
    -However by providing a value of "heterogeneous" or "dynamic" in the
    -do_push() -type parameter, you can specify the MIME type of each page
    -on a case-by-case basis.  
    -
    -If you use this option, you will be responsible for producing the
    -HTTP header for each page.  Simply modify your draw routine to
    -look like this:
    -
    -    sub my_draw_routine {
    -        my($q,$counter) = @_;
    -        return header('text/html'),   # note we're producing the header here
    -               start_html('testing'),
    -               h1('testing'),
    -               "This page called $counter times";
    -    }
    -
    -You can add any header fields that you like, but some (cookies and
    -status fields included) may not be interpreted by the browser.  One
    -interesting effect is to display a series of pages, then, after the
    -last page, to redirect the browser to a new URL.  Because redirect() 
    -does b work, the easiest way is with a -refresh header field,
    -as shown below:
    -
    -    sub my_draw_routine {
    -        my($q,$counter) = @_;
    -        return undef if $counter > 10;
    -        return header('text/html'),   # note we're producing the header here
    -               start_html('testing'),
    -               h1('testing'),
    -               "This page called $counter times";
    -    }
    -
    -    sub my_last_page {
    -        return header(-refresh=>'5; URL=http://somewhere.else/finished.html',
    -                      -type=>'text/html'),
    -               start_html('Moved'),
    -               h1('This is the last page'),
    -               'Goodbye!'
    -               hr,
    -               end_html; 
    -    }
    -
    -=head2 Changing the Page Delay on the Fly
    -
    -If you would like to control the delay between pages on a page-by-page
    -basis, call push_delay() from within your draw routine.  push_delay()
    -takes a single numeric argument representing the number of seconds you
    -wish to delay after the current page is displayed and before
    -displaying the next one.  The delay may be fractional.  Without
    -parameters, push_delay() just returns the current delay.
    -
    -=head1 INSTALLING CGI::Push SCRIPTS
    -
    -Server push scripts must be installed as no-parsed-header (NPH)
    -scripts in order to work correctly on many servers.  On Unix systems,
    -this is most often accomplished by prefixing the script's name with "nph-".  
    -Recognition of NPH scripts happens automatically with WebSTAR and 
    -Microsoft IIS.  Users of other servers should see their documentation
    -for help.
    -
    -Apache web server from version 1.3b2 on does not need server
    -push scripts installed as NPH scripts: the -nph parameter to do_push()
    -may be set to a false value to disable the extra headers needed by an
    -NPH script.
    -
    -=head1 AUTHOR INFORMATION
    -
    -Copyright 1995-1998, Lincoln D. Stein.  All rights reserved.  
    -
    -This library is free software; you can redistribute it and/or modify
    -it under the same terms as Perl itself.
    -
    -Address bug reports and comments to: lstein@cshl.org
    -
    -=head1 BUGS
    -
    -This section intentionally left blank.
    -
    -=head1 SEE ALSO
    -
    -L, L
    -
    -=cut
    -
    diff --git a/lib/perl5/5.6.1/CGI/Switch.pm b/lib/perl5/5.6.1/CGI/Switch.pm
    deleted file mode 100644
    index b16b9c06..00000000
    --- a/lib/perl5/5.6.1/CGI/Switch.pm
    +++ /dev/null
    @@ -1,24 +0,0 @@
    -use CGI;
    -1;
    -
    -__END__
    -
    -=head1 NAME
    -
    -CGI::Switch - Backward compatibility module for defunct CGI::Switch
    -
    -=head1 SYNOPSIS
    -
    -Do not use this module.  It is deprecated.
    -
    -=head1 ABSTRACT
    -
    -=head1 DESCRIPTION
    -
    -=head1 AUTHOR INFORMATION
    -
    -=head1 BUGS
    -
    -=head1 SEE ALSO
    -
    -=cut
    diff --git a/lib/perl5/5.6.1/CGI/Util.pm b/lib/perl5/5.6.1/CGI/Util.pm
    deleted file mode 100644
    index aba0ba58..00000000
    --- a/lib/perl5/5.6.1/CGI/Util.pm
    +++ /dev/null
    @@ -1,258 +0,0 @@
    -package CGI::Util;
    -
    -use strict;
    -use vars '$VERSION','@EXPORT_OK','@ISA','$EBCDIC','@A2E','@E2A';
    -require Exporter;
    -@ISA = qw(Exporter);
    -@EXPORT_OK = qw(rearrange make_attributes unescape escape expires);
    -
    -$VERSION = '1.1';
    -
    -$EBCDIC = "\t" ne "\011";
    -if ($EBCDIC) {
    -# (ord('^') == 95) for codepage 1047 as on os390, vmesa
    -@A2E = (
    -  0,  1,  2,  3, 55, 45, 46, 47, 22,  5, 21, 11, 12, 13, 14, 15,
    - 16, 17, 18, 19, 60, 61, 50, 38, 24, 25, 63, 39, 28, 29, 30, 31,
    - 64, 90,127,123, 91,108, 80,125, 77, 93, 92, 78,107, 96, 75, 97,
    -240,241,242,243,244,245,246,247,248,249,122, 94, 76,126,110,111,
    -124,193,194,195,196,197,198,199,200,201,209,210,211,212,213,214,
    -215,216,217,226,227,228,229,230,231,232,233,173,224,189, 95,109,
    -121,129,130,131,132,133,134,135,136,137,145,146,147,148,149,150,
    -151,152,153,162,163,164,165,166,167,168,169,192, 79,208,161,  7,
    - 32, 33, 34, 35, 36, 37,  6, 23, 40, 41, 42, 43, 44,  9, 10, 27,
    - 48, 49, 26, 51, 52, 53, 54,  8, 56, 57, 58, 59,  4, 20, 62,255,
    - 65,170, 74,177,159,178,106,181,187,180,154,138,176,202,175,188,
    -144,143,234,250,190,160,182,179,157,218,155,139,183,184,185,171,
    -100,101, 98,102, 99,103,158,104,116,113,114,115,120,117,118,119,
    -172,105,237,238,235,239,236,191,128,253,254,251,252,186,174, 89,
    - 68, 69, 66, 70, 67, 71,156, 72, 84, 81, 82, 83, 88, 85, 86, 87,
    -140, 73,205,206,203,207,204,225,112,221,222,219,220,141,142,223
    -      );
    -@E2A = (
    -  0,  1,  2,  3,156,  9,134,127,151,141,142, 11, 12, 13, 14, 15,
    - 16, 17, 18, 19,157, 10,  8,135, 24, 25,146,143, 28, 29, 30, 31,
    -128,129,130,131,132,133, 23, 27,136,137,138,139,140,  5,  6,  7,
    -144,145, 22,147,148,149,150,  4,152,153,154,155, 20, 21,158, 26,
    - 32,160,226,228,224,225,227,229,231,241,162, 46, 60, 40, 43,124,
    - 38,233,234,235,232,237,238,239,236,223, 33, 36, 42, 41, 59, 94,
    - 45, 47,194,196,192,193,195,197,199,209,166, 44, 37, 95, 62, 63,
    -248,201,202,203,200,205,206,207,204, 96, 58, 35, 64, 39, 61, 34,
    -216, 97, 98, 99,100,101,102,103,104,105,171,187,240,253,254,177,
    -176,106,107,108,109,110,111,112,113,114,170,186,230,184,198,164,
    -181,126,115,116,117,118,119,120,121,122,161,191,208, 91,222,174,
    -172,163,165,183,169,167,182,188,189,190,221,168,175, 93,180,215,
    -123, 65, 66, 67, 68, 69, 70, 71, 72, 73,173,244,246,242,243,245,
    -125, 74, 75, 76, 77, 78, 79, 80, 81, 82,185,251,252,249,250,255,
    - 92,247, 83, 84, 85, 86, 87, 88, 89, 90,178,212,214,210,211,213,
    - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,179,219,220,217,218,159
    -      );
    -if (ord('^') == 106) { # as in the BS2000 posix-bc coded character set
    -    $A2E[91] = 187;   $A2E[92] = 188;  $A2E[94] = 106;  $A2E[96] = 74;
    -    $A2E[123] = 251;  $A2E[125] = 253; $A2E[126] = 255; $A2E[159] = 95;
    -    $A2E[162] = 176;  $A2E[166] = 208; $A2E[168] = 121; $A2E[172] = 186;
    -    $A2E[175] = 161;  $A2E[217] = 224; $A2E[219] = 221; $A2E[221] = 173;
    -    $A2E[249] = 192;
    -
    -    $E2A[74] = 96;   $E2A[95] = 159;  $E2A[106] = 94;  $E2A[121] = 168;
    -    $E2A[161] = 175; $E2A[173] = 221; $E2A[176] = 162; $E2A[186] = 172;
    -    $E2A[187] = 91;  $E2A[188] = 92;  $E2A[192] = 249; $E2A[208] = 166;
    -    $E2A[221] = 219; $E2A[224] = 217; $E2A[251] = 123; $E2A[253] = 125;
    -    $E2A[255] = 126;
    -}
    -elsif (ord('^') == 176) { # as in codepage 037 on os400
    -    $A2E[10] = 37;  $A2E[91] = 186;  $A2E[93] = 187; $A2E[94] = 176;
    -    $A2E[133] = 21; $A2E[168] = 189; $A2E[172] = 95; $A2E[221] = 173;
    -
    -    $E2A[21] = 133; $E2A[37] = 10;  $E2A[95] = 172; $E2A[173] = 221;
    -    $E2A[176] = 94; $E2A[186] = 91; $E2A[187] = 93; $E2A[189] = 168;
    -}
    -}
    -
    -# Smart rearrangement of parameters to allow named parameter
    -# calling.  We do the rearangement if:
    -# the first parameter begins with a -
    -sub rearrange {
    -    my($order,@param) = @_;
    -    return () unless @param;
    -
    -    if (ref($param[0]) eq 'HASH') {
    -	@param = %{$param[0]};
    -    } else {
    -	return @param 
    -	    unless (defined($param[0]) && substr($param[0],0,1) eq '-');
    -    }
    -
    -    # map parameters into positional indices
    -    my ($i,%pos);
    -    $i = 0;
    -    foreach (@$order) {
    -	foreach (ref($_) eq 'ARRAY' ? @$_ : $_) { $pos{lc($_)} = $i; }
    -	$i++;
    -    }
    -
    -    my (@result,%leftover);
    -    $#result = $#$order;  # preextend
    -    while (@param) {
    -	my $key = lc(shift(@param));
    -	$key =~ s/^\-//;
    -	if (exists $pos{$key}) {
    -	    $result[$pos{$key}] = shift(@param);
    -	} else {
    -	    $leftover{$key} = shift(@param);
    -	}
    -    }
    -
    -    push (@result,make_attributes(\%leftover,1)) if %leftover;
    -    @result;
    -}
    -
    -sub make_attributes {
    -    my $attr = shift;
    -    return () unless $attr && ref($attr) && ref($attr) eq 'HASH';
    -    my $escape = shift || 0;
    -    my(@att);
    -    foreach (keys %{$attr}) {
    -	my($key) = $_;
    -	$key=~s/^\-//;     # get rid of initial - if present
    -	$key=~tr/A-Z_/a-z-/; # parameters are lower case, use dashes
    -	my $value = $escape ? simple_escape($attr->{$_}) : $attr->{$_};
    -	push(@att,defined($attr->{$_}) ? qq/$key="$value"/ : qq/$key/);
    -    }
    -    return @att;
    -}
    -
    -sub simple_escape {
    -  return unless defined(my $toencode = shift);
    -  $toencode =~ s{&}{&}gso;
    -  $toencode =~ s{<}{<}gso;
    -  $toencode =~ s{>}{>}gso;
    -  $toencode =~ s{\"}{"}gso;
    -# Doesn't work.  Can't work.  forget it.
    -#  $toencode =~ s{\x8b}{‹}gso;
    -#  $toencode =~ s{\x9b}{›}gso;
    -  $toencode;
    -}
    -
    -# unescape URL-encoded data
    -sub unescape {
    -  shift() if ref($_[0]) || (defined $_[1] && $_[0] eq $CGI::DefaultClass);
    -  my $todecode = shift;
    -  return undef unless defined($todecode);
    -  $todecode =~ tr/+/ /;       # pluses become spaces
    -    $EBCDIC = "\t" ne "\011";
    -    if ($EBCDIC) {
    -      $todecode =~ s/%([0-9a-fA-F]{2})/chr $A2E[hex($1)]/ge;
    -    } else {
    -      $todecode =~ s/%([0-9a-fA-F]{2})/chr hex($1)/ge;
    -    }
    -  return $todecode;
    -}
    -
    -# URL-encode data
    -sub escape {
    -  shift() if ref($_[0]) || (defined $_[1] && $_[0] eq $CGI::DefaultClass);
    -  my $toencode = shift;
    -  return undef unless defined($toencode);
    -    if ($EBCDIC) {
    -      $toencode=~s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x",$E2A[ord($1)])/eg;
    -    } else {
    -      $toencode=~s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x",ord($1))/eg;
    -    }
    -  return $toencode;
    -}
    -
    -# This internal routine creates date strings suitable for use in
    -# cookies and HTTP headers.  (They differ, unfortunately.)
    -# Thanks to Mark Fisher for this.
    -sub expires {
    -    my($time,$format) = @_;
    -    $format ||= 'http';
    -
    -    my(@MON)=qw/Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec/;
    -    my(@WDAY) = qw/Sun Mon Tue Wed Thu Fri Sat/;
    -
    -    # pass through preformatted dates for the sake of expire_calc()
    -    $time = expire_calc($time);
    -    return $time unless $time =~ /^\d+$/;
    -
    -    # make HTTP/cookie date string from GMT'ed time
    -    # (cookies use '-' as date separator, HTTP uses ' ')
    -    my($sc) = ' ';
    -    $sc = '-' if $format eq "cookie";
    -    my($sec,$min,$hour,$mday,$mon,$year,$wday) = gmtime($time);
    -    $year += 1900;
    -    return sprintf("%s, %02d$sc%s$sc%04d %02d:%02d:%02d GMT",
    -                   $WDAY[$wday],$mday,$MON[$mon],$year,$hour,$min,$sec);
    -}
    -
    -# This internal routine creates an expires time exactly some number of
    -# hours from the current time.  It incorporates modifications from 
    -# Mark Fisher.
    -sub expire_calc {
    -    my($time) = @_;
    -    my(%mult) = ('s'=>1,
    -                 'm'=>60,
    -                 'h'=>60*60,
    -                 'd'=>60*60*24,
    -                 'M'=>60*60*24*30,
    -                 'y'=>60*60*24*365);
    -    # format for time can be in any of the forms...
    -    # "now" -- expire immediately
    -    # "+180s" -- in 180 seconds
    -    # "+2m" -- in 2 minutes
    -    # "+12h" -- in 12 hours
    -    # "+1d"  -- in 1 day
    -    # "+3M"  -- in 3 months
    -    # "+2y"  -- in 2 years
    -    # "-3m"  -- 3 minutes ago(!)
    -    # If you don't supply one of these forms, we assume you are
    -    # specifying the date yourself
    -    my($offset);
    -    if (!$time || (lc($time) eq 'now')) {
    -        $offset = 0;
    -    } elsif ($time=~/^\d+/) {
    -        return $time;
    -    } elsif ($time=~/^([+-]?(?:\d+|\d*\.\d*))([mhdMy]?)/) {
    -        $offset = ($mult{$2} || 1)*$1;
    -    } else {
    -        return $time;
    -    }
    -    return (time+$offset);
    -}
    -
    -1;
    -
    -__END__
    -
    -=head1 NAME
    -
    -CGI::Util - Internal utilities used by CGI module
    -
    -=head1 SYNOPSIS
    -
    -none
    -
    -=head1 DESCRIPTION
    -
    -no public subroutines
    -
    -=head1 AUTHOR INFORMATION
    -
    -Copyright 1995-1998, Lincoln D. Stein.  All rights reserved.  
    -
    -This library is free software; you can redistribute it and/or modify
    -it under the same terms as Perl itself.
    -
    -Address bug reports and comments to: lstein@cshl.org.  When sending
    -bug reports, please provide the version of CGI.pm, the version of
    -Perl, the name and version of your Web server, and the name and
    -version of the operating system you are using.  If the problem is even
    -remotely browser dependent, please provide information about the
    -affected browers as well.
    -
    -=head1 SEE ALSO
    -
    -L
    -
    -=cut
    diff --git a/lib/perl5/5.6.1/CPAN.pm b/lib/perl5/5.6.1/CPAN.pm
    deleted file mode 100644
    index fdaadb3b..00000000
    --- a/lib/perl5/5.6.1/CPAN.pm
    +++ /dev/null
    @@ -1,6992 +0,0 @@
    -# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*-
    -package CPAN;
    -$VERSION = '1.59_54';
    -# $Id: CPAN.pm,v 1.385 2001/02/09 21:37:57 k Exp $
    -
    -# only used during development:
    -$Revision = "";
    -# $Revision = "[".substr(q$Revision: 1.385 $, 10)."]";
    -
    -use Carp ();
    -use Config ();
    -use Cwd ();
    -use DirHandle;
    -use Exporter ();
    -use ExtUtils::MakeMaker (); # $SelfLoader::DEBUG=1;
    -use File::Basename ();
    -use File::Copy ();
    -use File::Find;
    -use File::Path ();
    -use FileHandle ();
    -use Safe ();
    -use Text::ParseWords ();
    -use Text::Wrap;
    -use File::Spec;
    -no lib "."; # we need to run chdir all over and we would get at wrong
    -            # libraries there
    -
    -END { $End++; &cleanup; }
    -
    -%CPAN::DEBUG = qw[
    -		  CPAN              1
    -		  Index             2
    -		  InfoObj           4
    -		  Author            8
    -		  Distribution     16
    -		  Bundle           32
    -		  Module           64
    -		  CacheMgr        128
    -		  Complete        256
    -		  FTP             512
    -		  Shell          1024
    -		  Eval           2048
    -		  Config         4096
    -		  Tarzip         8192
    -		  Version       16384
    -		  Queue         32768
    -];
    -
    -$CPAN::DEBUG ||= 0;
    -$CPAN::Signal ||= 0;
    -$CPAN::Frontend ||= "CPAN::Shell";
    -$CPAN::Defaultsite ||= "ftp://ftp.perl.org/pub/CPAN";
    -
    -package CPAN;
    -use strict qw(vars);
    -
    -use vars qw($VERSION @EXPORT $AUTOLOAD $DEBUG $META $HAS_USABLE $term
    -            $Revision $Signal $End $Suppress_readline $Frontend
    -            $Defaultsite $Have_warned);
    -
    -@CPAN::ISA = qw(CPAN::Debug Exporter);
    -
    -@EXPORT = qw(
    -	     autobundle bundle expand force get cvs_import
    -	     install make readme recompile shell test clean
    -	    );
    -
    -#-> sub CPAN::AUTOLOAD ;
    -sub AUTOLOAD {
    -    my($l) = $AUTOLOAD;
    -    $l =~ s/.*:://;
    -    my(%EXPORT);
    -    @EXPORT{@EXPORT} = '';
    -    CPAN::Config->load unless $CPAN::Config_loaded++;
    -    if (exists $EXPORT{$l}){
    -	CPAN::Shell->$l(@_);
    -    } else {
    -	$CPAN::Frontend->mywarn(qq{Unknown command "$AUTOLOAD". }.
    -				qq{Type ? for help.
    -});
    -    }
    -}
    -
    -#-> sub CPAN::shell ;
    -sub shell {
    -    my($self) = @_;
    -    $Suppress_readline = ! -t STDIN unless defined $Suppress_readline;
    -    CPAN::Config->load unless $CPAN::Config_loaded++;
    -
    -    my $oprompt = shift || "cpan> ";
    -    my $prompt = $oprompt;
    -    my $commandline = shift || "";
    -
    -    local($^W) = 1;
    -    unless ($Suppress_readline) {
    -	require Term::ReadLine;
    -        if (! $term
    -            or
    -            $term->ReadLine eq "Term::ReadLine::Stub"
    -           ) {
    -            $term = Term::ReadLine->new('CPAN Monitor');
    -        }
    -	if ($term->ReadLine eq "Term::ReadLine::Gnu") {
    -	    my $attribs = $term->Attribs;
    -	     $attribs->{attempted_completion_function} = sub {
    -		 &CPAN::Complete::gnu_cpl;
    -	     }
    -	} else {
    -	    $readline::rl_completion_function =
    -		$readline::rl_completion_function = 'CPAN::Complete::cpl';
    -	}
    -	# $term->OUT is autoflushed anyway
    -	my $odef = select STDERR;
    -	$| = 1;
    -	select STDOUT;
    -	$| = 1;
    -	select $odef;
    -    }
    -
    -    # no strict; # I do not recall why no strict was here (2000-09-03)
    -    $META->checklock();
    -    my $cwd = CPAN::anycwd();
    -    my $try_detect_readline;
    -    $try_detect_readline = $term->ReadLine eq "Term::ReadLine::Stub" if $term;
    -    my $rl_avail = $Suppress_readline ? "suppressed" :
    -	($term->ReadLine ne "Term::ReadLine::Stub") ? "enabled" :
    -	    "available (try 'install Bundle::CPAN')";
    -
    -    $CPAN::Frontend->myprint(
    -			     sprintf qq{
    -cpan shell -- CPAN exploration and modules installation (v%s%s)
    -ReadLine support %s
    -
    -},
    -                             $CPAN::VERSION,
    -                             $CPAN::Revision,
    -                             $rl_avail
    -                            )
    -        unless $CPAN::Config->{'inhibit_startup_message'} ;
    -    my($continuation) = "";
    -  SHELLCOMMAND: while () {
    -	if ($Suppress_readline) {
    -	    print $prompt;
    -	    last SHELLCOMMAND unless defined ($_ = <> );
    -	    chomp;
    -	} else {
    -	    last SHELLCOMMAND unless
    -                defined ($_ = $term->readline($prompt, $commandline));
    -	}
    -	$_ = "$continuation$_" if $continuation;
    -	s/^\s+//;
    -	next SHELLCOMMAND if /^$/;
    -	$_ = 'h' if /^\s*\?/;
    -	if (/^(?:q(?:uit)?|bye|exit)$/i) {
    -	    last SHELLCOMMAND;
    -	} elsif (s/\\$//s) {
    -	    chomp;
    -	    $continuation = $_;
    -	    $prompt = "    > ";
    -	} elsif (/^\!/) {
    -	    s/^\!//;
    -	    my($eval) = $_;
    -	    package CPAN::Eval;
    -	    use vars qw($import_done);
    -	    CPAN->import(':DEFAULT') unless $import_done++;
    -	    CPAN->debug("eval[$eval]") if $CPAN::DEBUG;
    -	    eval($eval);
    -	    warn $@ if $@;
    -	    $continuation = "";
    -	    $prompt = $oprompt;
    -	} elsif (/./) {
    -	    my(@line);
    -	    if ($] < 5.00322) { # parsewords had a bug until recently
    -		@line = split;
    -	    } else {
    -		eval { @line = Text::ParseWords::shellwords($_) };
    -		warn($@), next SHELLCOMMAND if $@;
    -                warn("Text::Parsewords could not parse the line [$_]"),
    -                    next SHELLCOMMAND unless @line;
    -	    }
    -	    $CPAN::META->debug("line[".join("|",@line)."]") if $CPAN::DEBUG;
    -	    my $command = shift @line;
    -	    eval { CPAN::Shell->$command(@line) };
    -	    warn $@ if $@;
    -	    chdir $cwd or $CPAN::Frontend->mydie(qq{Could not chdir to "$cwd": $!});
    -	    $CPAN::Frontend->myprint("\n");
    -	    $continuation = "";
    -	    $prompt = $oprompt;
    -	}
    -    } continue {
    -      $commandline = ""; # I do want to be able to pass a default to
    -                         # shell, but on the second command I see no
    -                         # use in that
    -      $Signal=0;
    -      CPAN::Queue->nullify_queue;
    -      if ($try_detect_readline) {
    -	if ($CPAN::META->has_inst("Term::ReadLine::Gnu")
    -	    ||
    -	    $CPAN::META->has_inst("Term::ReadLine::Perl")
    -	   ) {
    -	    delete $INC{"Term/ReadLine.pm"};
    -	    my $redef = 0;
    -	    local($SIG{__WARN__}) = CPAN::Shell::paintdots_onreload(\$redef);
    -	    require Term::ReadLine;
    -	    $CPAN::Frontend->myprint("\n$redef subroutines in ".
    -				     "Term::ReadLine redefined\n");
    -            @_ = ($oprompt,"");
    -	    goto &shell;
    -	}
    -      }
    -    }
    -    chdir $cwd or $CPAN::Frontend->mydie(qq{Could not chdir to "$cwd": $!});
    -}
    -
    -package CPAN::CacheMgr;
    -@CPAN::CacheMgr::ISA = qw(CPAN::InfoObj CPAN);
    -use File::Find;
    -
    -package CPAN::Config;
    -use vars qw(%can $dot_cpan);
    -
    -%can = (
    -  'commit' => "Commit changes to disk",
    -  'defaults' => "Reload defaults from disk",
    -  'init'   => "Interactive setting of all options",
    -);
    -
    -package CPAN::FTP;
    -use vars qw($Ua $Thesite $Themethod);
    -@CPAN::FTP::ISA = qw(CPAN::Debug);
    -
    -package CPAN::LWP::UserAgent;
    -use vars qw(@ISA $USER $PASSWD $SETUPDONE);
    -# we delay requiring LWP::UserAgent and setting up inheritence until we need it
    -
    -package CPAN::Complete;
    -@CPAN::Complete::ISA = qw(CPAN::Debug);
    -@CPAN::Complete::COMMANDS = sort qw(
    -		       ! a b d h i m o q r u autobundle clean dump
    -		       make test install force readme reload look
    -                       cvs_import ls
    -) unless @CPAN::Complete::COMMANDS;
    -
    -package CPAN::Index;
    -use vars qw($LAST_TIME $DATE_OF_02 $DATE_OF_03);
    -@CPAN::Index::ISA = qw(CPAN::Debug);
    -$LAST_TIME ||= 0;
    -$DATE_OF_03 ||= 0;
    -# use constant PROTOCOL => "2.0"; # outcommented to avoid warning on upgrade from 1.57
    -sub PROTOCOL { 2.0 }
    -
    -package CPAN::InfoObj;
    -@CPAN::InfoObj::ISA = qw(CPAN::Debug);
    -
    -package CPAN::Author;
    -@CPAN::Author::ISA = qw(CPAN::InfoObj);
    -
    -package CPAN::Distribution;
    -@CPAN::Distribution::ISA = qw(CPAN::InfoObj);
    -
    -package CPAN::Bundle;
    -@CPAN::Bundle::ISA = qw(CPAN::Module);
    -
    -package CPAN::Module;
    -@CPAN::Module::ISA = qw(CPAN::InfoObj);
    -
    -package CPAN::Shell;
    -use vars qw($AUTOLOAD @ISA $COLOR_REGISTERED $ADVANCED_QUERY $PRINT_ORNAMENTING);
    -@CPAN::Shell::ISA = qw(CPAN::Debug);
    -$COLOR_REGISTERED ||= 0;
    -$PRINT_ORNAMENTING ||= 0;
    -
    -#-> sub CPAN::Shell::AUTOLOAD ;
    -sub AUTOLOAD {
    -    my($autoload) = $AUTOLOAD;
    -    my $class = shift(@_);
    -    # warn "autoload[$autoload] class[$class]";
    -    $autoload =~ s/.*:://;
    -    if ($autoload =~ /^w/) {
    -	if ($CPAN::META->has_inst('CPAN::WAIT')) {
    -	    CPAN::WAIT->$autoload(@_);
    -	} else {
    -	    $CPAN::Frontend->mywarn(qq{
    -Commands starting with "w" require CPAN::WAIT to be installed.
    -Please consider installing CPAN::WAIT to use the fulltext index.
    -For this you just need to type
    -    install CPAN::WAIT
    -});
    -	}
    -    } else {
    -	$CPAN::Frontend->mywarn(qq{Unknown command '$autoload'. }.
    -				qq{Type ? for help.
    -});
    -    }
    -}
    -
    -package CPAN::Tarzip;
    -use vars qw($AUTOLOAD @ISA $BUGHUNTING);
    -@CPAN::Tarzip::ISA = qw(CPAN::Debug);
    -$BUGHUNTING = 0; # released code must have turned off
    -
    -package CPAN::Queue;
    -
    -# One use of the queue is to determine if we should or shouldn't
    -# announce the availability of a new CPAN module
    -
    -# Now we try to use it for dependency tracking. For that to happen
    -# we need to draw a dependency tree and do the leaves first. This can
    -# easily be reached by running CPAN.pm recursively, but we don't want
    -# to waste memory and run into deep recursion. So what we can do is
    -# this:
    -
    -# CPAN::Queue is the package where the queue is maintained. Dependencies
    -# often have high priority and must be brought to the head of the queue,
    -# possibly by jumping the queue if they are already there. My first code
    -# attempt tried to be extremely correct. Whenever a module needed
    -# immediate treatment, I either unshifted it to the front of the queue,
    -# or, if it was already in the queue, I spliced and let it bypass the
    -# others. This became a too correct model that made it impossible to put
    -# an item more than once into the queue. Why would you need that? Well,
    -# you need temporary duplicates as the manager of the queue is a loop
    -# that
    -#
    -#  (1) looks at the first item in the queue without shifting it off
    -#
    -#  (2) cares for the item
    -#
    -#  (3) removes the item from the queue, *even if its agenda failed and
    -#      even if the item isn't the first in the queue anymore* (that way
    -#      protecting against never ending queues)
    -#
    -# So if an item has prerequisites, the installation fails now, but we
    -# want to retry later. That's easy if we have it twice in the queue.
    -#
    -# I also expect insane dependency situations where an item gets more
    -# than two lives in the queue. Simplest example is triggered by 'install
    -# Foo Foo Foo'. People make this kind of mistakes and I don't want to
    -# get in the way. I wanted the queue manager to be a dumb servant, not
    -# one that knows everything.
    -#
    -# Who would I tell in this model that the user wants to be asked before
    -# processing? I can't attach that information to the module object,
    -# because not modules are installed but distributions. So I'd have to
    -# tell the distribution object that it should ask the user before
    -# processing. Where would the question be triggered then? Most probably
    -# in CPAN::Distribution::rematein.
    -# Hope that makes sense, my head is a bit off:-) -- AK
    -
    -use vars qw{ @All };
    -
    -# CPAN::Queue::new ;
    -sub new {
    -  my($class,$s) = @_;
    -  my $self = bless { qmod => $s }, $class;
    -  push @All, $self;
    -  return $self;
    -}
    -
    -# CPAN::Queue::first ;
    -sub first {
    -  my $obj = $All[0];
    -  $obj->{qmod};
    -}
    -
    -# CPAN::Queue::delete_first ;
    -sub delete_first {
    -  my($class,$what) = @_;
    -  my $i;
    -  for my $i (0..$#All) {
    -    if (  $All[$i]->{qmod} eq $what ) {
    -      splice @All, $i, 1;
    -      return;
    -    }
    -  }
    -}
    -
    -# CPAN::Queue::jumpqueue ;
    -sub jumpqueue {
    -    my $class = shift;
    -    my @what = @_;
    -    CPAN->debug(sprintf("before jumpqueue All[%s] what[%s]",
    -                        join(",",map {$_->{qmod}} @All),
    -                        join(",",@what)
    -                       )) if $CPAN::DEBUG;
    -  WHAT: for my $what (reverse @what) {
    -        my $jumped = 0;
    -        for (my $i=0; $i<$#All;$i++) { #prevent deep recursion
    -            CPAN->debug("i[$All[$i]]what[$what]") if $CPAN::DEBUG;
    -            if ($All[$i]->{qmod} eq $what){
    -                $jumped++;
    -                if ($jumped > 100) { # one's OK if e.g. just
    -                                     # processing now; more are OK if
    -                                     # user typed it several times
    -                    $CPAN::Frontend->mywarn(
    -qq{Object [$what] queued more than 100 times, ignoring}
    -				 );
    -                    next WHAT;
    -                }
    -            }
    -        }
    -        my $obj = bless { qmod => $what }, $class;
    -        unshift @All, $obj;
    -    }
    -    CPAN->debug(sprintf("after jumpqueue All[%s] what[%s]",
    -                        join(",",map {$_->{qmod}} @All),
    -                        join(",",@what)
    -                       )) if $CPAN::DEBUG;
    -}
    -
    -# CPAN::Queue::exists ;
    -sub exists {
    -  my($self,$what) = @_;
    -  my @all = map { $_->{qmod} } @All;
    -  my $exists = grep { $_->{qmod} eq $what } @All;
    -  # warn "in exists what[$what] all[@all] exists[$exists]";
    -  $exists;
    -}
    -
    -# CPAN::Queue::delete ;
    -sub delete {
    -  my($self,$mod) = @_;
    -  @All = grep { $_->{qmod} ne $mod } @All;
    -}
    -
    -# CPAN::Queue::nullify_queue ;
    -sub nullify_queue {
    -  @All = ();
    -}
    -
    -
    -
    -package CPAN;
    -
    -$META ||= CPAN->new; # In case we re-eval ourselves we need the ||
    -
    -# from here on only subs.
    -################################################################################
    -
    -#-> sub CPAN::all_objects ;
    -sub all_objects {
    -    my($mgr,$class) = @_;
    -    CPAN::Config->load unless $CPAN::Config_loaded++;
    -    CPAN->debug("mgr[$mgr] class[$class]") if $CPAN::DEBUG;
    -    CPAN::Index->reload;
    -    values %{ $META->{readwrite}{$class} }; # unsafe meta access, ok
    -}
    -*all = \&all_objects;
    -
    -# Called by shell, not in batch mode. In batch mode I see no risk in
    -# having many processes updating something as installations are
    -# continually checked at runtime. In shell mode I suspect it is
    -# unintentional to open more than one shell at a time
    -
    -#-> sub CPAN::checklock ;
    -sub checklock {
    -    my($self) = @_;
    -    my $lockfile = MM->catfile($CPAN::Config->{cpan_home},".lock");
    -    if (-f $lockfile && -M _ > 0) {
    -	my $fh = FileHandle->new($lockfile) or
    -            $CPAN::Frontend->mydie("Could not open $lockfile: $!");
    -	my $other = <$fh>;
    -	$fh->close;
    -	if (defined $other && $other) {
    -	    chomp $other;
    -	    return if $$==$other; # should never happen
    -	    $CPAN::Frontend->mywarn(
    -				    qq{
    -There seems to be running another CPAN process ($other). Contacting...
    -});
    -	    if (kill 0, $other) {
    -		$CPAN::Frontend->mydie(qq{Other job is running.
    -You may want to kill it and delete the lockfile, maybe. On UNIX try:
    -    kill $other
    -    rm $lockfile
    -});
    -	    } elsif (-w $lockfile) {
    -		my($ans) =
    -		    ExtUtils::MakeMaker::prompt
    -			(qq{Other job not responding. Shall I overwrite }.
    -			 qq{the lockfile? (Y/N)},"y");
    -		$CPAN::Frontend->myexit("Ok, bye\n")
    -		    unless $ans =~ /^y/i;
    -	    } else {
    -		Carp::croak(
    -			    qq{Lockfile $lockfile not writeable by you. }.
    -			    qq{Cannot proceed.\n}.
    -			    qq{    On UNIX try:\n}.
    -			    qq{    rm $lockfile\n}.
    -			    qq{  and then rerun us.\n}
    -			   );
    -	    }
    -	} else {
    -            $CPAN::Frontend->mydie(sprintf("CPAN.pm panic: Lockfile $lockfile ".
    -                                           "reports other process with ID ".
    -                                           "$other. Cannot proceed.\n"));
    -        }
    -    }
    -    my $dotcpan = $CPAN::Config->{cpan_home};
    -    eval { File::Path::mkpath($dotcpan);};
    -    if ($@) {
    -      # A special case at least for Jarkko.
    -      my $firsterror = $@;
    -      my $seconderror;
    -      my $symlinkcpan;
    -      if (-l $dotcpan) {
    -	$symlinkcpan = readlink $dotcpan;
    -	die "readlink $dotcpan failed: $!" unless defined $symlinkcpan;
    -	eval { File::Path::mkpath($symlinkcpan); };
    -	if ($@) {
    -	  $seconderror = $@;
    -	} else {
    -	  $CPAN::Frontend->mywarn(qq{
    -Working directory $symlinkcpan created.
    -});
    -	}
    -      }
    -      unless (-d $dotcpan) {
    -	my $diemess = qq{
    -Your configuration suggests "$dotcpan" as your
    -CPAN.pm working directory. I could not create this directory due
    -to this error: $firsterror\n};
    -	$diemess .= qq{
    -As "$dotcpan" is a symlink to "$symlinkcpan",
    -I tried to create that, but I failed with this error: $seconderror
    -} if $seconderror;
    -	$diemess .= qq{
    -Please make sure the directory exists and is writable.
    -};
    -	$CPAN::Frontend->mydie($diemess);
    -      }
    -    }
    -    my $fh;
    -    unless ($fh = FileHandle->new(">$lockfile")) {
    -	if ($! =~ /Permission/) {
    -	    my $incc = $INC{'CPAN/Config.pm'};
    -	    my $myincc = MM->catfile($ENV{HOME},'.cpan','CPAN','MyConfig.pm');
    -	    $CPAN::Frontend->myprint(qq{
    -
    -Your configuration suggests that CPAN.pm should use a working
    -directory of
    -    $CPAN::Config->{cpan_home}
    -Unfortunately we could not create the lock file
    -    $lockfile
    -due to permission problems.
    -
    -Please make sure that the configuration variable
    -    \$CPAN::Config->{cpan_home}
    -points to a directory where you can write a .lock file. You can set
    -this variable in either
    -    $incc
    -or
    -    $myincc
    -
    -});
    -	}
    -	$CPAN::Frontend->mydie("Could not open >$lockfile: $!");
    -    }
    -    $fh->print($$, "\n");
    -    $self->{LOCK} = $lockfile;
    -    $fh->close;
    -    $SIG{TERM} = sub {
    -      &cleanup;
    -      $CPAN::Frontend->mydie("Got SIGTERM, leaving");
    -    };
    -    $SIG{INT} = sub {
    -      # no blocks!!!
    -      &cleanup if $Signal;
    -      $CPAN::Frontend->mydie("Got another SIGINT") if $Signal;
    -      print "Caught SIGINT\n";
    -      $Signal++;
    -    };
    -
    -#       From: Larry Wall 
    -#       Subject: Re: deprecating SIGDIE
    -#       To: perl5-porters@perl.org
    -#       Date: Thu, 30 Sep 1999 14:58:40 -0700 (PDT)
    -#
    -#       The original intent of __DIE__ was only to allow you to substitute one
    -#       kind of death for another on an application-wide basis without respect
    -#       to whether you were in an eval or not.  As a global backstop, it should
    -#       not be used any more lightly (or any more heavily :-) than class
    -#       UNIVERSAL.  Any attempt to build a general exception model on it should
    -#       be politely squashed.  Any bug that causes every eval {} to have to be
    -#       modified should be not so politely squashed.
    -#
    -#       Those are my current opinions.  It is also my optinion that polite
    -#       arguments degenerate to personal arguments far too frequently, and that
    -#       when they do, it's because both people wanted it to, or at least didn't
    -#       sufficiently want it not to.
    -#
    -#       Larry
    -
    -    # global backstop to cleanup if we should really die
    -    $SIG{__DIE__} = \&cleanup;
    -    $self->debug("Signal handler set.") if $CPAN::DEBUG;
    -}
    -
    -#-> sub CPAN::DESTROY ;
    -sub DESTROY {
    -    &cleanup; # need an eval?
    -}
    -
    -#-> sub CPAN::anycwd ;
    -sub anycwd () {
    -    my $getcwd;
    -    $getcwd = $CPAN::Config->{'getcwd'} || 'cwd';
    -    CPAN->$getcwd();
    -}
    -
    -#-> sub CPAN::cwd ;
    -sub cwd {Cwd::cwd();}
    -
    -#-> sub CPAN::getcwd ;
    -sub getcwd {Cwd::getcwd();}
    -
    -#-> sub CPAN::exists ;
    -sub exists {
    -    my($mgr,$class,$id) = @_;
    -    CPAN::Config->load unless $CPAN::Config_loaded++;
    -    CPAN::Index->reload;
    -    ### Carp::croak "exists called without class argument" unless $class;
    -    $id ||= "";
    -    exists $META->{readonly}{$class}{$id} or
    -        exists $META->{readwrite}{$class}{$id}; # unsafe meta access, ok
    -}
    -
    -#-> sub CPAN::delete ;
    -sub delete {
    -  my($mgr,$class,$id) = @_;
    -  delete $META->{readonly}{$class}{$id}; # unsafe meta access, ok
    -  delete $META->{readwrite}{$class}{$id}; # unsafe meta access, ok
    -}
    -
    -#-> sub CPAN::has_usable
    -# has_inst is sometimes too optimistic, we should replace it with this
    -# has_usable whenever a case is given
    -sub has_usable {
    -    my($self,$mod,$message) = @_;
    -    return 1 if $HAS_USABLE->{$mod};
    -    my $has_inst = $self->has_inst($mod,$message);
    -    return unless $has_inst;
    -    my $usable;
    -    $usable = {
    -               LWP => [ # we frequently had "Can't locate object
    -                        # method "new" via package "LWP::UserAgent" at
    -                        # (eval 69) line 2006
    -                       sub {require LWP},
    -                       sub {require LWP::UserAgent},
    -                       sub {require HTTP::Request},
    -                       sub {require URI::URL},
    -                      ],
    -               Net::FTP => [
    -                            sub {require Net::FTP},
    -                            sub {require Net::Config},
    -                           ]
    -              };
    -    if ($usable->{$mod}) {
    -      for my $c (0..$#{$usable->{$mod}}) {
    -        my $code = $usable->{$mod}[$c];
    -        my $ret = eval { &$code() };
    -        if ($@) {
    -          warn "DEBUG: c[$c]\$\@[$@]ret[$ret]";
    -          return;
    -        }
    -      }
    -    }
    -    return $HAS_USABLE->{$mod} = 1;
    -}
    -
    -#-> sub CPAN::has_inst
    -sub has_inst {
    -    my($self,$mod,$message) = @_;
    -    Carp::croak("CPAN->has_inst() called without an argument")
    -	unless defined $mod;
    -    if (defined $message && $message eq "no"
    -        ||
    -        exists $CPAN::META->{dontload_hash}{$mod} # unsafe meta access, ok
    -        ||
    -        exists $CPAN::Config->{dontload_hash}{$mod}
    -       ) {
    -      $CPAN::META->{dontload_hash}{$mod}||=1; # unsafe meta access, ok
    -      return 0;
    -    }
    -    my $file = $mod;
    -    my $obj;
    -    $file =~ s|::|/|g;
    -    $file =~ s|/|\\|g if $^O eq 'MSWin32';
    -    $file .= ".pm";
    -    if ($INC{$file}) {
    -	# checking %INC is wrong, because $INC{LWP} may be true
    -	# although $INC{"URI/URL.pm"} may have failed. But as
    -	# I really want to say "bla loaded OK", I have to somehow
    -	# cache results.
    -	### warn "$file in %INC"; #debug
    -	return 1;
    -    } elsif (eval { require $file }) {
    -	# eval is good: if we haven't yet read the database it's
    -	# perfect and if we have installed the module in the meantime,
    -	# it tries again. The second require is only a NOOP returning
    -	# 1 if we had success, otherwise it's retrying
    -
    -	$CPAN::Frontend->myprint("CPAN: $mod loaded ok\n");
    -	if ($mod eq "CPAN::WAIT") {
    -	    push @CPAN::Shell::ISA, CPAN::WAIT;
    -	}
    -	return 1;
    -    } elsif ($mod eq "Net::FTP") {
    -	$CPAN::Frontend->mywarn(qq{
    -  Please, install Net::FTP as soon as possible. CPAN.pm installs it for you
    -  if you just type
    -      install Bundle::libnet
    -
    -}) unless $Have_warned->{"Net::FTP"}++;
    -	sleep 3;
    -    } elsif ($mod eq "MD5"){
    -	$CPAN::Frontend->myprint(qq{
    -  CPAN: MD5 security checks disabled because MD5 not installed.
    -  Please consider installing the MD5 module.
    -
    -});
    -	sleep 2;
    -    } else {
    -	delete $INC{$file}; # if it inc'd LWP but failed during, say, URI
    -    }
    -    return 0;
    -}
    -
    -#-> sub CPAN::instance ;
    -sub instance {
    -    my($mgr,$class,$id) = @_;
    -    CPAN::Index->reload;
    -    $id ||= "";
    -    # unsafe meta access, ok?
    -    return $META->{readwrite}{$class}{$id} if exists $META->{readwrite}{$class}{$id};
    -    $META->{readwrite}{$class}{$id} ||= $class->new(ID => $id);
    -}
    -
    -#-> sub CPAN::new ;
    -sub new {
    -    bless {}, shift;
    -}
    -
    -#-> sub CPAN::cleanup ;
    -sub cleanup {
    -  # warn "cleanup called with arg[@_] End[$End] Signal[$Signal]";
    -  local $SIG{__DIE__} = '';
    -  my($message) = @_;
    -  my $i = 0;
    -  my $ineval = 0;
    -  if (
    -      0 &&           # disabled, try reload cpan with it
    -      $] > 5.004_60  # thereabouts
    -     ) {
    -    $ineval = $^S;
    -  } else {
    -    my($subroutine);
    -    while ((undef,undef,undef,$subroutine) = caller(++$i)) {
    -      $ineval = 1, last if
    -	  $subroutine eq '(eval)';
    -    }
    -  }
    -  return if $ineval && !$End;
    -  return unless defined $META->{LOCK}; # unsafe meta access, ok
    -  return unless -f $META->{LOCK}; # unsafe meta access, ok
    -  unlink $META->{LOCK}; # unsafe meta access, ok
    -  # require Carp;
    -  # Carp::cluck("DEBUGGING");
    -  $CPAN::Frontend->mywarn("Lockfile removed.\n");
    -}
    -
    -package CPAN::CacheMgr;
    -
    -#-> sub CPAN::CacheMgr::as_string ;
    -sub as_string {
    -    eval { require Data::Dumper };
    -    if ($@) {
    -	return shift->SUPER::as_string;
    -    } else {
    -	return Data::Dumper::Dumper(shift);
    -    }
    -}
    -
    -#-> sub CPAN::CacheMgr::cachesize ;
    -sub cachesize {
    -    shift->{DU};
    -}
    -
    -#-> sub CPAN::CacheMgr::tidyup ;
    -sub tidyup {
    -  my($self) = @_;
    -  return unless -d $self->{ID};
    -  while ($self->{DU} > $self->{'MAX'} ) {
    -    my($toremove) = shift @{$self->{FIFO}};
    -    $CPAN::Frontend->myprint(sprintf(
    -				     "Deleting from cache".
    -				     ": $toremove (%.1f>%.1f MB)\n",
    -				     $self->{DU}, $self->{'MAX'})
    -			    );
    -    return if $CPAN::Signal;
    -    $self->force_clean_cache($toremove);
    -    return if $CPAN::Signal;
    -  }
    -}
    -
    -#-> sub CPAN::CacheMgr::dir ;
    -sub dir {
    -    shift->{ID};
    -}
    -
    -#-> sub CPAN::CacheMgr::entries ;
    -sub entries {
    -    my($self,$dir) = @_;
    -    return unless defined $dir;
    -    $self->debug("reading dir[$dir]") if $CPAN::DEBUG;
    -    $dir ||= $self->{ID};
    -    my($cwd) = CPAN::anycwd();
    -    chdir $dir or Carp::croak("Can't chdir to $dir: $!");
    -    my $dh = DirHandle->new(File::Spec->curdir)
    -        or Carp::croak("Couldn't opendir $dir: $!");
    -    my(@entries);
    -    for ($dh->read) {
    -	next if $_ eq "." || $_ eq "..";
    -	if (-f $_) {
    -	    push @entries, MM->catfile($dir,$_);
    -	} elsif (-d _) {
    -	    push @entries, MM->catdir($dir,$_);
    -	} else {
    -	    $CPAN::Frontend->mywarn("Warning: weird direntry in $dir: $_\n");
    -	}
    -    }
    -    chdir $cwd or Carp::croak("Can't chdir to $cwd: $!");
    -    sort { -M $b <=> -M $a} @entries;
    -}
    -
    -#-> sub CPAN::CacheMgr::disk_usage ;
    -sub disk_usage {
    -    my($self,$dir) = @_;
    -    return if exists $self->{SIZE}{$dir};
    -    return if $CPAN::Signal;
    -    my($Du) = 0;
    -    find(
    -	 sub {
    -	   $File::Find::prune++ if $CPAN::Signal;
    -	   return if -l $_;
    -	   if ($^O eq 'MacOS') {
    -	     require Mac::Files;
    -	     my $cat  = Mac::Files::FSpGetCatInfo($_);
    -	     $Du += $cat->ioFlLgLen() + $cat->ioFlRLgLen() if $cat;
    -	   } else {
    -	     $Du += (-s _);
    -	   }
    -	 },
    -	 $dir
    -	);
    -    return if $CPAN::Signal;
    -    $self->{SIZE}{$dir} = $Du/1024/1024;
    -    push @{$self->{FIFO}}, $dir;
    -    $self->debug("measured $dir is $Du") if $CPAN::DEBUG;
    -    $self->{DU} += $Du/1024/1024;
    -    $self->{DU};
    -}
    -
    -#-> sub CPAN::CacheMgr::force_clean_cache ;
    -sub force_clean_cache {
    -    my($self,$dir) = @_;
    -    return unless -e $dir;
    -    $self->debug("have to rmtree $dir, will free $self->{SIZE}{$dir}")
    -	if $CPAN::DEBUG;
    -    File::Path::rmtree($dir);
    -    $self->{DU} -= $self->{SIZE}{$dir};
    -    delete $self->{SIZE}{$dir};
    -}
    -
    -#-> sub CPAN::CacheMgr::new ;
    -sub new {
    -    my $class = shift;
    -    my $time = time;
    -    my($debug,$t2);
    -    $debug = "";
    -    my $self = {
    -		ID => $CPAN::Config->{'build_dir'},
    -		MAX => $CPAN::Config->{'build_cache'},
    -		SCAN => $CPAN::Config->{'scan_cache'} || 'atstart',
    -		DU => 0
    -	       };
    -    File::Path::mkpath($self->{ID});
    -    my $dh = DirHandle->new($self->{ID});
    -    bless $self, $class;
    -    $self->scan_cache;
    -    $t2 = time;
    -    $debug .= "timing of CacheMgr->new: ".($t2 - $time);
    -    $time = $t2;
    -    CPAN->debug($debug) if $CPAN::DEBUG;
    -    $self;
    -}
    -
    -#-> sub CPAN::CacheMgr::scan_cache ;
    -sub scan_cache {
    -    my $self = shift;
    -    return if $self->{SCAN} eq 'never';
    -    $CPAN::Frontend->mydie("Unknown scan_cache argument: $self->{SCAN}")
    -	unless $self->{SCAN} eq 'atstart';
    -    $CPAN::Frontend->myprint(
    -			     sprintf("Scanning cache %s for sizes\n",
    -				     $self->{ID}));
    -    my $e;
    -    for $e ($self->entries($self->{ID})) {
    -	next if $e eq ".." || $e eq ".";
    -	$self->disk_usage($e);
    -	return if $CPAN::Signal;
    -    }
    -    $self->tidyup;
    -}
    -
    -package CPAN::Debug;
    -
    -#-> sub CPAN::Debug::debug ;
    -sub debug {
    -    my($self,$arg) = @_;
    -    my($caller,$func,$line,@rest) = caller(1); # caller(0) eg
    -                                               # Complete, caller(1)
    -                                               # eg readline
    -    ($caller) = caller(0);
    -    $caller =~ s/.*:://;
    -    $arg = "" unless defined $arg;
    -    my $rest = join "|", map { defined $_ ? $_ : "UNDEF" } @rest;
    -    if ($CPAN::DEBUG{$caller} & $CPAN::DEBUG){
    -	if ($arg and ref $arg) {
    -	    eval { require Data::Dumper };
    -	    if ($@) {
    -		$CPAN::Frontend->myprint($arg->as_string);
    -	    } else {
    -		$CPAN::Frontend->myprint(Data::Dumper::Dumper($arg));
    -	    }
    -	} else {
    -	    $CPAN::Frontend->myprint("Debug($caller:$func,$line,[$rest]): $arg\n");
    -	}
    -    }
    -}
    -
    -package CPAN::Config;
    -
    -#-> sub CPAN::Config::edit ;
    -# returns true on successful action
    -sub edit {
    -    my($self,@args) = @_;
    -    return unless @args;
    -    CPAN->debug("self[$self]args[".join(" | ",@args)."]");
    -    my($o,$str,$func,$args,$key_exists);
    -    $o = shift @args;
    -    if($can{$o}) {
    -	$self->$o(@args);
    -	return 1;
    -    } else {
    -        CPAN->debug("o[$o]") if $CPAN::DEBUG;
    -	if ($o =~ /list$/) {
    -	    $func = shift @args;
    -	    $func ||= "";
    -            CPAN->debug("func[$func]") if $CPAN::DEBUG;
    -            my $changed;
    -	    # Let's avoid eval, it's easier to comprehend without.
    -	    if ($func eq "push") {
    -		push @{$CPAN::Config->{$o}}, @args;
    -                $changed = 1;
    -	    } elsif ($func eq "pop") {
    -		pop @{$CPAN::Config->{$o}};
    -                $changed = 1;
    -	    } elsif ($func eq "shift") {
    -		shift @{$CPAN::Config->{$o}};
    -                $changed = 1;
    -	    } elsif ($func eq "unshift") {
    -		unshift @{$CPAN::Config->{$o}}, @args;
    -                $changed = 1;
    -	    } elsif ($func eq "splice") {
    -		splice @{$CPAN::Config->{$o}}, @args;
    -                $changed = 1;
    -	    } elsif (@args) {
    -		$CPAN::Config->{$o} = [@args];
    -                $changed = 1;
    -	    } else {
    -                $self->prettyprint($o);
    -	    }
    -            if ($o eq "urllist" && $changed) {
    -                # reset the cached values
    -                undef $CPAN::FTP::Thesite;
    -                undef $CPAN::FTP::Themethod;
    -            }
    -            return $changed;
    -	} else {
    -	    $CPAN::Config->{$o} = $args[0] if defined $args[0];
    -	    $self->prettyprint($o);
    -	}
    -    }
    -}
    -
    -sub prettyprint {
    -  my($self,$k) = @_;
    -  my $v = $CPAN::Config->{$k};
    -  if (ref $v) {
    -    my(@report) = ref $v eq "ARRAY" ?
    -        @$v :
    -            map { sprintf("   %-18s => %s\n",
    -                          $_,
    -                          defined $v->{$_} ? $v->{$_} : "UNDEFINED"
    -                         )} keys %$v;
    -    $CPAN::Frontend->myprint(
    -                             join(
    -                                  "",
    -                                  sprintf(
    -                                          "    %-18s\n",
    -                                          $k
    -                                         ),
    -                                  map {"\t$_\n"} @report
    -                                 )
    -                            );
    -  } elsif (defined $v) {
    -    $CPAN::Frontend->myprint(sprintf "    %-18s %s\n", $k, $v);
    -  } else {
    -    $CPAN::Frontend->myprint(sprintf "    %-18s %s\n", $k, "UNDEFINED");
    -  }
    -}
    -
    -#-> sub CPAN::Config::commit ;
    -sub commit {
    -    my($self,$configpm) = @_;
    -    unless (defined $configpm){
    -	$configpm ||= $INC{"CPAN/MyConfig.pm"};
    -	$configpm ||= $INC{"CPAN/Config.pm"};
    -	$configpm || Carp::confess(q{
    -CPAN::Config::commit called without an argument.
    -Please specify a filename where to save the configuration or try
    -"o conf init" to have an interactive course through configing.
    -});
    -    }
    -    my($mode);
    -    if (-f $configpm) {
    -	$mode = (stat $configpm)[2];
    -	if ($mode && ! -w _) {
    -	    Carp::confess("$configpm is not writable");
    -	}
    -    }
    -
    -    my $msg;
    -    $msg = <new;
    -    rename $configpm, "$configpm~" if -f $configpm;
    -    open $fh, ">$configpm" or
    -        $CPAN::Frontend->mydie("Couldn't open >$configpm: $!");
    -    $fh->print(qq[$msg\$CPAN::Config = \{\n]);
    -    foreach (sort keys %$CPAN::Config) {
    -	$fh->print(
    -		   "  '$_' => ",
    -		   ExtUtils::MakeMaker::neatvalue($CPAN::Config->{$_}),
    -		   ",\n"
    -		  );
    -    }
    -
    -    $fh->print("};\n1;\n__END__\n");
    -    close $fh;
    -
    -    #$mode = 0444 | ( $mode & 0111 ? 0111 : 0 );
    -    #chmod $mode, $configpm;
    -###why was that so?    $self->defaults;
    -    $CPAN::Frontend->myprint("commit: wrote $configpm\n");
    -    1;
    -}
    -
    -*default = \&defaults;
    -#-> sub CPAN::Config::defaults ;
    -sub defaults {
    -    my($self) = @_;
    -    $self->unload;
    -    $self->load;
    -    1;
    -}
    -
    -sub init {
    -    my($self) = @_;
    -    undef $CPAN::Config->{'inhibit_startup_message'}; # lazy trick to
    -                                                      # have the least
    -                                                      # important
    -                                                      # variable
    -                                                      # undefined
    -    $self->load;
    -    1;
    -}
    -
    -#-> sub CPAN::Config::load ;
    -sub load {
    -    my($self) = shift;
    -    my(@miss);
    -    use Carp;
    -    eval {require CPAN::Config;};       # We eval because of some
    -                                        # MakeMaker problems
    -    unless ($dot_cpan++){
    -      unshift @INC, MM->catdir($ENV{HOME},".cpan");
    -      eval {require CPAN::MyConfig;};   # where you can override
    -                                        # system wide settings
    -      shift @INC;
    -    }
    -    return unless @miss = $self->missing_config_data;
    -
    -    require CPAN::FirstTime;
    -    my($configpm,$fh,$redo,$theycalled);
    -    $redo ||= "";
    -    $theycalled++ if @miss==1 && $miss[0] eq 'inhibit_startup_message';
    -    if (defined $INC{"CPAN/Config.pm"} && -w $INC{"CPAN/Config.pm"}) {
    -	$configpm = $INC{"CPAN/Config.pm"};
    -	$redo++;
    -    } elsif (defined $INC{"CPAN/MyConfig.pm"} && -w $INC{"CPAN/MyConfig.pm"}) {
    -	$configpm = $INC{"CPAN/MyConfig.pm"};
    -	$redo++;
    -    } else {
    -	my($path_to_cpan) = File::Basename::dirname($INC{"CPAN.pm"});
    -	my($configpmdir) = MM->catdir($path_to_cpan,"CPAN");
    -	my($configpmtest) = MM->catfile($configpmdir,"Config.pm");
    -	if (-d $configpmdir or File::Path::mkpath($configpmdir)) {
    -	    if (-w $configpmtest) {
    -		$configpm = $configpmtest;
    -	    } elsif (-w $configpmdir) {
    -		#_#_# following code dumped core on me with 5.003_11, a.k.
    -		unlink "$configpmtest.bak" if -f "$configpmtest.bak";
    -		rename $configpmtest, "$configpmtest.bak" if -f $configpmtest;
    -		my $fh = FileHandle->new;
    -		if ($fh->open(">$configpmtest")) {
    -		    $fh->print("1;\n");
    -		    $configpm = $configpmtest;
    -		} else {
    -		    # Should never happen
    -		    Carp::confess("Cannot open >$configpmtest");
    -		}
    -	    }
    -	}
    -	unless ($configpm) {
    -	    $configpmdir = MM->catdir($ENV{HOME},".cpan","CPAN");
    -	    File::Path::mkpath($configpmdir);
    -	    $configpmtest = MM->catfile($configpmdir,"MyConfig.pm");
    -	    if (-w $configpmtest) {
    -		$configpm = $configpmtest;
    -	    } elsif (-w $configpmdir) {
    -		#_#_# following code dumped core on me with 5.003_11, a.k.
    -		my $fh = FileHandle->new;
    -		if ($fh->open(">$configpmtest")) {
    -		    $fh->print("1;\n");
    -		    $configpm = $configpmtest;
    -		} else {
    -		    # Should never happen
    -		    Carp::confess("Cannot open >$configpmtest");
    -		}
    -	    } else {
    -		Carp::confess(qq{WARNING: CPAN.pm is unable to }.
    -			      qq{create a configuration file.});
    -	    }
    -	}
    -    }
    -    local($") = ", ";
    -    $CPAN::Frontend->myprint(<myprint(qq{
    -$configpm initialized.
    -});
    -    sleep 2;
    -    CPAN::FirstTime::init($configpm);
    -}
    -
    -#-> sub CPAN::Config::missing_config_data ;
    -sub missing_config_data {
    -    my(@miss);
    -    for (
    -         "cpan_home", "keep_source_where", "build_dir", "build_cache",
    -         "scan_cache", "index_expire", "gzip", "tar", "unzip", "make",
    -         "pager",
    -         "makepl_arg", "make_arg", "make_install_arg", "urllist",
    -         "inhibit_startup_message", "ftp_proxy", "http_proxy", "no_proxy",
    -         "prerequisites_policy",
    -         "cache_metadata",
    -        ) {
    -	push @miss, $_ unless defined $CPAN::Config->{$_};
    -    }
    -    return @miss;
    -}
    -
    -#-> sub CPAN::Config::unload ;
    -sub unload {
    -    delete $INC{'CPAN/MyConfig.pm'};
    -    delete $INC{'CPAN/Config.pm'};
    -}
    -
    -#-> sub CPAN::Config::help ;
    -sub help {
    -    $CPAN::Frontend->myprint(q[
    -Known options:
    -  defaults  reload default config values from disk
    -  commit    commit session changes to disk
    -  init      go through a dialog to set all parameters
    -
    -You may edit key values in the follow fashion (the "o" is a literal
    -letter o):
    -
    -  o conf build_cache 15
    -
    -  o conf build_dir "/foo/bar"
    -
    -  o conf urllist shift
    -
    -  o conf urllist unshift ftp://ftp.foo.bar/
    -
    -]);
    -    undef; #don't reprint CPAN::Config
    -}
    -
    -#-> sub CPAN::Config::cpl ;
    -sub cpl {
    -    my($word,$line,$pos) = @_;
    -    $word ||= "";
    -    CPAN->debug("word[$word] line[$line] pos[$pos]") if $CPAN::DEBUG;
    -    my(@words) = split " ", substr($line,0,$pos+1);
    -    if (
    -	defined($words[2])
    -	and
    -	(
    -	 $words[2] =~ /list$/ && @words == 3
    -	 ||
    -	 $words[2] =~ /list$/ && @words == 4 && length($word)
    -	)
    -       ) {
    -	return grep /^\Q$word\E/, qw(splice shift unshift pop push);
    -    } elsif (@words >= 4) {
    -	return ();
    -    }
    -    my(@o_conf) = (keys %CPAN::Config::can, keys %$CPAN::Config);
    -    return grep /^\Q$word\E/, @o_conf;
    -}
    -
    -package CPAN::Shell;
    -
    -#-> sub CPAN::Shell::h ;
    -sub h {
    -    my($class,$about) = @_;
    -    if (defined $about) {
    -	$CPAN::Frontend->myprint("Detailed help not yet implemented\n");
    -    } else {
    -	$CPAN::Frontend->myprint(q{
    -Display Information
    - command  argument          description
    - a,b,d,m  WORD or /REGEXP/  about authors, bundles, distributions, modules
    - i        WORD or /REGEXP/  about anything of above
    - r        NONE              reinstall recommendations
    - ls       AUTHOR            about files in the author's directory
    -
    -Download, Test, Make, Install...
    - get                        download
    - make                       make (implies get)
    - test      MODULES,         make test (implies make)
    - install   DISTS, BUNDLES   make install (implies test)
    - clean                      make clean
    - look                       open subshell in these dists' directories
    - readme                     display these dists' README files
    -
    -Other
    - h,?           display this menu       ! perl-code   eval a perl command
    - o conf [opt]  set and query options   q             quit the cpan shell
    - reload cpan   load CPAN.pm again      reload index  load newer indices
    - autobundle    Snapshot                force cmd     unconditionally do cmd});
    -    }
    -}
    -
    -*help = \&h;
    -
    -#-> sub CPAN::Shell::a ;
    -sub a {
    -  my($self,@arg) = @_;
    -  # authors are always UPPERCASE
    -  for (@arg) {
    -    $_ = uc $_ unless /=/;
    -  }
    -  $CPAN::Frontend->myprint($self->format_result('Author',@arg));
    -}
    -
    -#-> sub CPAN::Shell::ls ;
    -sub ls      {
    -    my($self,@arg) = @_;
    -    my @accept;
    -    for (@arg) {
    -        unless (/^[A-Z\-]+$/i) {
    -            $CPAN::Frontend->mywarn("ls command rejects argument $_: not an author");
    -            next;
    -        }
    -        push @accept, uc $_;
    -    }
    -    for my $a (@accept){
    -        my $author = $self->expand('Author',$a) or die "No author found for $a";
    -        $author->ls;
    -    }
    -}
    -
    -#-> sub CPAN::Shell::local_bundles ;
    -sub local_bundles {
    -    my($self,@which) = @_;
    -    my($incdir,$bdir,$dh);
    -    foreach $incdir ($CPAN::Config->{'cpan_home'},@INC) {
    -        my @bbase = "Bundle";
    -        while (my $bbase = shift @bbase) {
    -            $bdir = MM->catdir($incdir,split /::/, $bbase);
    -            CPAN->debug("bdir[$bdir]\@bbase[@bbase]") if $CPAN::DEBUG;
    -            if ($dh = DirHandle->new($bdir)) { # may fail
    -                my($entry);
    -                for $entry ($dh->read) {
    -                    next if $entry =~ /^\./;
    -                    if (-d MM->catdir($bdir,$entry)){
    -                        push @bbase, "$bbase\::$entry";
    -                    } else {
    -                        next unless $entry =~ s/\.pm(?!\n)\Z//;
    -                        $CPAN::META->instance('CPAN::Bundle',"$bbase\::$entry");
    -                    }
    -                }
    -            }
    -        }
    -    }
    -}
    -
    -#-> sub CPAN::Shell::b ;
    -sub b {
    -    my($self,@which) = @_;
    -    CPAN->debug("which[@which]") if $CPAN::DEBUG;
    -    $self->local_bundles;
    -    $CPAN::Frontend->myprint($self->format_result('Bundle',@which));
    -}
    -
    -#-> sub CPAN::Shell::d ;
    -sub d { $CPAN::Frontend->myprint(shift->format_result('Distribution',@_));}
    -
    -#-> sub CPAN::Shell::m ;
    -sub m { # emacs confused here }; sub mimimimimi { # emacs in sync here
    -    $CPAN::Frontend->myprint(shift->format_result('Module',@_));
    -}
    -
    -#-> sub CPAN::Shell::i ;
    -sub i {
    -    my($self) = shift;
    -    my(@args) = @_;
    -    my(@type,$type,@m);
    -    @type = qw/Author Bundle Distribution Module/;
    -    @args = '/./' unless @args;
    -    my(@result);
    -    for $type (@type) {
    -	push @result, $self->expand($type,@args);
    -    }
    -    my $result = @result == 1 ?
    -	$result[0]->as_string :
    -            @result == 0 ?
    -                "No objects found of any type for argument @args\n" :
    -                    join("",
    -                         (map {$_->as_glimpse} @result),
    -                         scalar @result, " items found\n",
    -                        );
    -    $CPAN::Frontend->myprint($result);
    -}
    -
    -#-> sub CPAN::Shell::o ;
    -
    -# CPAN::Shell::o and CPAN::Config::edit are closely related. 'o conf'
    -# should have been called set and 'o debug' maybe 'set debug'
    -sub o {
    -    my($self,$o_type,@o_what) = @_;
    -    $o_type ||= "";
    -    CPAN->debug("o_type[$o_type] o_what[".join(" | ",@o_what)."]\n");
    -    if ($o_type eq 'conf') {
    -	shift @o_what if @o_what && $o_what[0] eq 'help';
    -	if (!@o_what) { # print all things, "o conf"
    -	    my($k,$v);
    -	    $CPAN::Frontend->myprint("CPAN::Config options");
    -	    if (exists $INC{'CPAN/Config.pm'}) {
    -	      $CPAN::Frontend->myprint(" from $INC{'CPAN/Config.pm'}");
    -	    }
    -	    if (exists $INC{'CPAN/MyConfig.pm'}) {
    -	      $CPAN::Frontend->myprint(" and $INC{'CPAN/MyConfig.pm'}");
    -	    }
    -	    $CPAN::Frontend->myprint(":\n");
    -	    for $k (sort keys %CPAN::Config::can) {
    -		$v = $CPAN::Config::can{$k};
    -		$CPAN::Frontend->myprint(sprintf "    %-18s %s\n", $k, $v);
    -	    }
    -	    $CPAN::Frontend->myprint("\n");
    -	    for $k (sort keys %$CPAN::Config) {
    -                CPAN::Config->prettyprint($k);
    -	    }
    -	    $CPAN::Frontend->myprint("\n");
    -	} elsif (!CPAN::Config->edit(@o_what)) {
    -	    $CPAN::Frontend->myprint(qq{Type 'o conf' to view configuration }.
    -                                     qq{edit options\n\n});
    -	}
    -    } elsif ($o_type eq 'debug') {
    -	my(%valid);
    -	@o_what = () if defined $o_what[0] && $o_what[0] =~ /help/i;
    -	if (@o_what) {
    -	    while (@o_what) {
    -		my($what) = shift @o_what;
    -                if ($what =~ s/^-// && exists $CPAN::DEBUG{$what}) {
    -                    $CPAN::DEBUG &= $CPAN::DEBUG ^ $CPAN::DEBUG{$what};
    -                    next;
    -                }
    -		if ( exists $CPAN::DEBUG{$what} ) {
    -		    $CPAN::DEBUG |= $CPAN::DEBUG{$what};
    -		} elsif ($what =~ /^\d/) {
    -		    $CPAN::DEBUG = $what;
    -		} elsif (lc $what eq 'all') {
    -		    my($max) = 0;
    -		    for (values %CPAN::DEBUG) {
    -			$max += $_;
    -		    }
    -		    $CPAN::DEBUG = $max;
    -		} else {
    -		    my($known) = 0;
    -		    for (keys %CPAN::DEBUG) {
    -			next unless lc($_) eq lc($what);
    -			$CPAN::DEBUG |= $CPAN::DEBUG{$_};
    -			$known = 1;
    -		    }
    -		    $CPAN::Frontend->myprint("unknown argument [$what]\n")
    -			unless $known;
    -		}
    -	    }
    -	} else {
    -	  my $raw = "Valid options for debug are ".
    -	      join(", ",sort(keys %CPAN::DEBUG), 'all').
    -		  qq{ or a number. Completion works on the options. }.
    -		      qq{Case is ignored.};
    -	  require Text::Wrap;
    -	  $CPAN::Frontend->myprint(Text::Wrap::fill("","",$raw));
    -	  $CPAN::Frontend->myprint("\n\n");
    -	}
    -	if ($CPAN::DEBUG) {
    -	    $CPAN::Frontend->myprint("Options set for debugging:\n");
    -	    my($k,$v);
    -	    for $k (sort {$CPAN::DEBUG{$a} <=> $CPAN::DEBUG{$b}} keys %CPAN::DEBUG) {
    -		$v = $CPAN::DEBUG{$k};
    -		$CPAN::Frontend->myprint(sprintf "    %-14s(%s)\n", $k, $v)
    -                    if $v & $CPAN::DEBUG;
    -	    }
    -	} else {
    -	    $CPAN::Frontend->myprint("Debugging turned off completely.\n");
    -	}
    -    } else {
    -	$CPAN::Frontend->myprint(qq{
    -Known options:
    -  conf    set or get configuration variables
    -  debug   set or get debugging options
    -});
    -    }
    -}
    -
    -sub paintdots_onreload {
    -    my($ref) = shift;
    -    sub {
    -	if ( $_[0] =~ /[Ss]ubroutine (\w+) redefined/ ) {
    -	    my($subr) = $1;
    -	    ++$$ref;
    -	    local($|) = 1;
    -	    # $CPAN::Frontend->myprint(".($subr)");
    -	    $CPAN::Frontend->myprint(".");
    -	    return;
    -	}
    -	warn @_;
    -    };
    -}
    -
    -#-> sub CPAN::Shell::reload ;
    -sub reload {
    -    my($self,$command,@arg) = @_;
    -    $command ||= "";
    -    $self->debug("self[$self]command[$command]arg[@arg]") if $CPAN::DEBUG;
    -    if ($command =~ /cpan/i) {
    -	CPAN->debug("reloading the whole CPAN.pm") if $CPAN::DEBUG;
    -	my $fh = FileHandle->new($INC{'CPAN.pm'});
    -	local($/);
    -	my $redef = 0;
    -	local($SIG{__WARN__}) = paintdots_onreload(\$redef);
    -	eval <$fh>;
    -	warn $@ if $@;
    -	$CPAN::Frontend->myprint("\n$redef subroutines redefined\n");
    -    } elsif ($command =~ /index/) {
    -      CPAN::Index->force_reload;
    -    } else {
    -      $CPAN::Frontend->myprint(qq{cpan     re-evals the CPAN.pm file
    -index    re-reads the index files\n});
    -    }
    -}
    -
    -#-> sub CPAN::Shell::_binary_extensions ;
    -sub _binary_extensions {
    -    my($self) = shift @_;
    -    my(@result,$module,%seen,%need,$headerdone);
    -    for $module ($self->expand('Module','/./')) {
    -	my $file  = $module->cpan_file;
    -	next if $file eq "N/A";
    -	next if $file =~ /^Contact Author/;
    -        my $dist = $CPAN::META->instance('CPAN::Distribution',$file);
    -	next if $dist->isa_perl;
    -	next unless $module->xs_file;
    -	local($|) = 1;
    -	$CPAN::Frontend->myprint(".");
    -	push @result, $module;
    -    }
    -#    print join " | ", @result;
    -    $CPAN::Frontend->myprint("\n");
    -    return @result;
    -}
    -
    -#-> sub CPAN::Shell::recompile ;
    -sub recompile {
    -    my($self) = shift @_;
    -    my($module,@module,$cpan_file,%dist);
    -    @module = $self->_binary_extensions();
    -    for $module (@module){  # we force now and compile later, so we
    -                            # don't do it twice
    -	$cpan_file = $module->cpan_file;
    -	my $pack = $CPAN::META->instance('CPAN::Distribution',$cpan_file);
    -	$pack->force;
    -	$dist{$cpan_file}++;
    -    }
    -    for $cpan_file (sort keys %dist) {
    -	$CPAN::Frontend->myprint("  CPAN: Recompiling $cpan_file\n\n");
    -	my $pack = $CPAN::META->instance('CPAN::Distribution',$cpan_file);
    -	$pack->install;
    -	$CPAN::Signal = 0; # it's tempting to reset Signal, so we can
    -                           # stop a package from recompiling,
    -                           # e.g. IO-1.12 when we have perl5.003_10
    -    }
    -}
    -
    -#-> sub CPAN::Shell::_u_r_common ;
    -sub _u_r_common {
    -    my($self) = shift @_;
    -    my($what) = shift @_;
    -    CPAN->debug("self[$self] what[$what] args[@_]") if $CPAN::DEBUG;
    -    Carp::croak "Usage: \$obj->_u_r_common(a|r|u)" unless
    -          $what && $what =~ /^[aru]$/;
    -    my(@args) = @_;
    -    @args = '/./' unless @args;
    -    my(@result,$module,%seen,%need,$headerdone,
    -       $version_undefs,$version_zeroes);
    -    $version_undefs = $version_zeroes = 0;
    -    my $sprintf = "%s%-25s%s %9s %9s  %s\n";
    -    my @expand = $self->expand('Module',@args);
    -    my $expand = scalar @expand;
    -    if (0) { # Looks like noise to me, was very useful for debugging
    -             # for metadata cache
    -        $CPAN::Frontend->myprint(sprintf "%d matches in the database\n", $expand);
    -    }
    -    for $module (@expand) {
    -	my $file  = $module->cpan_file;
    -	next unless defined $file; # ??
    -	my($latest) = $module->cpan_version;
    -	my($inst_file) = $module->inst_file;
    -	my($have);
    -	return if $CPAN::Signal;
    -	if ($inst_file){
    -	    if ($what eq "a") {
    -		$have = $module->inst_version;
    -	    } elsif ($what eq "r") {
    -		$have = $module->inst_version;
    -		local($^W) = 0;
    -		if ($have eq "undef"){
    -		    $version_undefs++;
    -		} elsif ($have == 0){
    -		    $version_zeroes++;
    -		}
    -		next unless CPAN::Version->vgt($latest, $have);
    -# to be pedantic we should probably say:
    -#    && !($have eq "undef" && $latest ne "undef" && $latest gt "");
    -# to catch the case where CPAN has a version 0 and we have a version undef
    -	    } elsif ($what eq "u") {
    -		next;
    -	    }
    -	} else {
    -	    if ($what eq "a") {
    -		next;
    -	    } elsif ($what eq "r") {
    -		next;
    -	    } elsif ($what eq "u") {
    -		$have = "-";
    -	    }
    -	}
    -	return if $CPAN::Signal; # this is sometimes lengthy
    -	$seen{$file} ||= 0;
    -	if ($what eq "a") {
    -	    push @result, sprintf "%s %s\n", $module->id, $have;
    -	} elsif ($what eq "r") {
    -	    push @result, $module->id;
    -	    next if $seen{$file}++;
    -	} elsif ($what eq "u") {
    -	    push @result, $module->id;
    -	    next if $seen{$file}++;
    -	    next if $file =~ /^Contact/;
    -	}
    -	unless ($headerdone++){
    -	    $CPAN::Frontend->myprint("\n");
    -	    $CPAN::Frontend->myprint(sprintf(
    -                                             $sprintf,
    -                                             "",
    -                                             "Package namespace",
    -                                             "",
    -                                             "installed",
    -                                             "latest",
    -                                             "in CPAN file"
    -                                            ));
    -	}
    -        my $color_on = "";
    -        my $color_off = "";
    -        if (
    -            $COLOR_REGISTERED
    -            &&
    -            $CPAN::META->has_inst("Term::ANSIColor")
    -            &&
    -            $module->{RO}{description}
    -           ) {
    -            $color_on = Term::ANSIColor::color("green");
    -            $color_off = Term::ANSIColor::color("reset");
    -        }
    -	$CPAN::Frontend->myprint(sprintf $sprintf,
    -                                 $color_on,
    -                                 $module->id,
    -                                 $color_off,
    -                                 $have,
    -                                 $latest,
    -                                 $file);
    -	$need{$module->id}++;
    -    }
    -    unless (%need) {
    -	if ($what eq "u") {
    -	    $CPAN::Frontend->myprint("No modules found for @args\n");
    -	} elsif ($what eq "r") {
    -	    $CPAN::Frontend->myprint("All modules are up to date for @args\n");
    -	}
    -    }
    -    if ($what eq "r") {
    -	if ($version_zeroes) {
    -	    my $s_has = $version_zeroes > 1 ? "s have" : " has";
    -	    $CPAN::Frontend->myprint(qq{$version_zeroes installed module$s_has }.
    -		qq{a version number of 0\n});
    -	}
    -	if ($version_undefs) {
    -	    my $s_has = $version_undefs > 1 ? "s have" : " has";
    -	    $CPAN::Frontend->myprint(qq{$version_undefs installed module$s_has no }.
    -		qq{parseable version number\n});
    -	}
    -    }
    -    @result;
    -}
    -
    -#-> sub CPAN::Shell::r ;
    -sub r {
    -    shift->_u_r_common("r",@_);
    -}
    -
    -#-> sub CPAN::Shell::u ;
    -sub u {
    -    shift->_u_r_common("u",@_);
    -}
    -
    -#-> sub CPAN::Shell::autobundle ;
    -sub autobundle {
    -    my($self) = shift;
    -    CPAN::Config->load unless $CPAN::Config_loaded++;
    -    my(@bundle) = $self->_u_r_common("a",@_);
    -    my($todir) = MM->catdir($CPAN::Config->{'cpan_home'},"Bundle");
    -    File::Path::mkpath($todir);
    -    unless (-d $todir) {
    -	$CPAN::Frontend->myprint("Couldn't mkdir $todir for some reason\n");
    -	return;
    -    }
    -    my($y,$m,$d) =  (localtime)[5,4,3];
    -    $y+=1900;
    -    $m++;
    -    my($c) = 0;
    -    my($me) = sprintf "Snapshot_%04d_%02d_%02d_%02d", $y, $m, $d, $c;
    -    my($to) = MM->catfile($todir,"$me.pm");
    -    while (-f $to) {
    -	$me = sprintf "Snapshot_%04d_%02d_%02d_%02d", $y, $m, $d, ++$c;
    -	$to = MM->catfile($todir,"$me.pm");
    -    }
    -    my($fh) = FileHandle->new(">$to") or Carp::croak "Can't open >$to: $!";
    -    $fh->print(
    -	       "package Bundle::$me;\n\n",
    -	       "\$VERSION = '0.01';\n\n",
    -	       "1;\n\n",
    -	       "__END__\n\n",
    -	       "=head1 NAME\n\n",
    -	       "Bundle::$me - Snapshot of installation on ",
    -	       $Config::Config{'myhostname'},
    -	       " on ",
    -	       scalar(localtime),
    -	       "\n\n=head1 SYNOPSIS\n\n",
    -	       "perl -MCPAN -e 'install Bundle::$me'\n\n",
    -	       "=head1 CONTENTS\n\n",
    -	       join("\n", @bundle),
    -	       "\n\n=head1 CONFIGURATION\n\n",
    -	       Config->myconfig,
    -	       "\n\n=head1 AUTHOR\n\n",
    -	       "This Bundle has been generated automatically ",
    -	       "by the autobundle routine in CPAN.pm.\n",
    -	      );
    -    $fh->close;
    -    $CPAN::Frontend->myprint("\nWrote bundle file
    -    $to\n\n");
    -}
    -
    -#-> sub CPAN::Shell::expandany ;
    -sub expandany {
    -    my($self,$s) = @_;
    -    CPAN->debug("s[$s]") if $CPAN::DEBUG;
    -    if ($s =~ m|/|) { # looks like a file
    -        $s = CPAN::Distribution->normalize($s);
    -        return $CPAN::META->instance('CPAN::Distribution',$s);
    -        # Distributions spring into existence, not expand
    -    } elsif ($s =~ m|^Bundle::|) {
    -        $self->local_bundles; # scanning so late for bundles seems
    -                              # both attractive and crumpy: always
    -                              # current state but easy to forget
    -                              # somewhere
    -        return $self->expand('Bundle',$s);
    -    } else {
    -        return $self->expand('Module',$s)
    -            if $CPAN::META->exists('CPAN::Module',$s);
    -    }
    -    return;
    -}
    -
    -#-> sub CPAN::Shell::expand ;
    -sub expand {
    -    shift;
    -    my($type,@args) = @_;
    -    my($arg,@m);
    -    CPAN->debug("type[$type]args[@args]") if $CPAN::DEBUG;
    -    for $arg (@args) {
    -	my($regex,$command);
    -	if ($arg =~ m|^/(.*)/$|) {
    -	    $regex = $1;
    -	} elsif ($arg =~ m/=/) {
    -            $command = 1;
    -        }
    -	my $class = "CPAN::$type";
    -	my $obj;
    -        CPAN->debug(sprintf "class[%s]regex[%s]command[%s]",
    -                    $class,
    -                    defined $regex ? $regex : "UNDEFINED",
    -                    $command || "UNDEFINED",
    -                   ) if $CPAN::DEBUG;
    -	if (defined $regex) {
    -            for $obj (
    -                      sort
    -                      {$a->id cmp $b->id}
    -                      $CPAN::META->all_objects($class)
    -                     ) {
    -                unless ($obj->id){
    -                    # BUG, we got an empty object somewhere
    -                    require Data::Dumper;
    -                    CPAN->debug(sprintf(
    -                                        "Bug in CPAN: Empty id on obj[%s][%s]",
    -                                        $obj,
    -                                        Data::Dumper::Dumper($obj)
    -                                       )) if $CPAN::DEBUG;
    -                    next;
    -                }
    -                push @m, $obj
    -                    if $obj->id =~ /$regex/i
    -                        or
    -                            (
    -                             (
    -                              $] < 5.00303 ### provide sort of
    -                              ### compatibility with 5.003
    -                              ||
    -                              $obj->can('name')
    -                             )
    -                             &&
    -                             $obj->name  =~ /$regex/i
    -                            );
    -            }
    -        } elsif ($command) {
    -            die "equal sign in command disabled (immature interface), ".
    -                "you can set
    - ! \$CPAN::Shell::ADVANCED_QUERY=1
    -to enable it. But please note, this is HIGHLY EXPERIMENTAL code
    -that may go away anytime.\n"
    -                    unless $ADVANCED_QUERY;
    -            my($method,$criterion) = $arg =~ /(.+?)=(.+)/;
    -            my($matchcrit) = $criterion =~ m/^~(.+)/;
    -            for my $self (
    -                          sort
    -                          {$a->id cmp $b->id}
    -                          $CPAN::META->all_objects($class)
    -                         ) {
    -                my $lhs = $self->$method() or next; # () for 5.00503
    -                if ($matchcrit) {
    -                    push @m, $self if $lhs =~ m/$matchcrit/;
    -                } else {
    -                    push @m, $self if $lhs eq $criterion;
    -                }
    -            }
    -	} else {
    -	    my($xarg) = $arg;
    -	    if ( $type eq 'Bundle' ) {
    -		$xarg =~ s/^(Bundle::)?(.*)/Bundle::$2/;
    -	    } elsif ($type eq "Distribution") {
    -                $xarg = CPAN::Distribution->normalize($arg);
    -            }
    -	    if ($CPAN::META->exists($class,$xarg)) {
    -		$obj = $CPAN::META->instance($class,$xarg);
    -	    } elsif ($CPAN::META->exists($class,$arg)) {
    -		$obj = $CPAN::META->instance($class,$arg);
    -	    } else {
    -		next;
    -	    }
    -	    push @m, $obj;
    -	}
    -    }
    -    return wantarray ? @m : $m[0];
    -}
    -
    -#-> sub CPAN::Shell::format_result ;
    -sub format_result {
    -    my($self) = shift;
    -    my($type,@args) = @_;
    -    @args = '/./' unless @args;
    -    my(@result) = $self->expand($type,@args);
    -    my $result = @result == 1 ?
    -	$result[0]->as_string :
    -            @result == 0 ?
    -                "No objects of type $type found for argument @args\n" :
    -                    join("",
    -                         (map {$_->as_glimpse} @result),
    -                         scalar @result, " items found\n",
    -                        );
    -    $result;
    -}
    -
    -# The only reason for this method is currently to have a reliable
    -# debugging utility that reveals which output is going through which
    -# channel. No, I don't like the colors ;-)
    -
    -#-> sub CPAN::Shell::print_ornameted ;
    -sub print_ornamented {
    -    my($self,$what,$ornament) = @_;
    -    my $longest = 0;
    -    return unless defined $what;
    -
    -    if ($CPAN::Config->{term_is_latin}){
    -        # courtesy jhi:
    -        $what
    -            =~ s{([\xC0-\xDF])([\x80-\xBF])}{chr(ord($1)<<6&0xC0|ord($2)&0x3F)}eg; #};
    -    }
    -    if ($PRINT_ORNAMENTING) {
    -	unless (defined &color) {
    -	    if ($CPAN::META->has_inst("Term::ANSIColor")) {
    -		import Term::ANSIColor "color";
    -	    } else {
    -		*color = sub { return "" };
    -	    }
    -	}
    -	my $line;
    -	for $line (split /\n/, $what) {
    -	    $longest = length($line) if length($line) > $longest;
    -	}
    -	my $sprintf = "%-" . $longest . "s";
    -	while ($what){
    -	    $what =~ s/(.*\n?)//m;
    -	    my $line = $1;
    -	    last unless $line;
    -	    my($nl) = chomp $line ? "\n" : "";
    -	    #	print "line[$line]ornament[$ornament]sprintf[$sprintf]\n";
    -	    print color($ornament), sprintf($sprintf,$line), color("reset"), $nl;
    -	}
    -    } else {
    -	print $what;
    -    }
    -}
    -
    -sub myprint {
    -    my($self,$what) = @_;
    -
    -    $self->print_ornamented($what, 'bold blue on_yellow');
    -}
    -
    -sub myexit {
    -    my($self,$what) = @_;
    -    $self->myprint($what);
    -    exit;
    -}
    -
    -sub mywarn {
    -    my($self,$what) = @_;
    -    $self->print_ornamented($what, 'bold red on_yellow');
    -}
    -
    -sub myconfess {
    -    my($self,$what) = @_;
    -    $self->print_ornamented($what, 'bold red on_white');
    -    Carp::confess "died";
    -}
    -
    -sub mydie {
    -    my($self,$what) = @_;
    -    $self->print_ornamented($what, 'bold red on_white');
    -    die "\n";
    -}
    -
    -sub setup_output {
    -    return if -t STDOUT;
    -    my $odef = select STDERR;
    -    $| = 1;
    -    select STDOUT;
    -    $| = 1;
    -    select $odef;
    -}
    -
    -#-> sub CPAN::Shell::rematein ;
    -# RE-adme||MA-ke||TE-st||IN-stall
    -sub rematein {
    -    shift;
    -    my($meth,@some) = @_;
    -    my $pragma = "";
    -    if ($meth eq 'force') {
    -	$pragma = $meth;
    -	$meth = shift @some;
    -    }
    -    setup_output();
    -    CPAN->debug("pragma[$pragma]meth[$meth] some[@some]") if $CPAN::DEBUG;
    -
    -    # Here is the place to set "test_count" on all involved parties to
    -    # 0. We then can pass this counter on to the involved
    -    # distributions and those can refuse to test if test_count > X. In
    -    # the first stab at it we could use a 1 for "X".
    -
    -    # But when do I reset the distributions to start with 0 again?
    -    # Jost suggested to have a random or cycling interaction ID that
    -    # we pass through. But the ID is something that is just left lying
    -    # around in addition to the counter, so I'd prefer to set the
    -    # counter to 0 now, and repeat at the end of the loop. But what
    -    # about dependencies? They appear later and are not reset, they
    -    # enter the queue but not its copy. How do they get a sensible
    -    # test_count?
    -
    -    # construct the queue
    -    my($s,@s,@qcopy);
    -    foreach $s (@some) {
    -	my $obj;
    -	if (ref $s) {
    -            CPAN->debug("s is an object[$s]") if $CPAN::DEBUG;
    -	    $obj = $s;
    -	} elsif ($s =~ m|^/|) { # looks like a regexp
    -            $CPAN::Frontend->mywarn("Sorry, $meth with a regular expression is ".
    -                                    "not supported\n");
    -            sleep 2;
    -            next;
    -	} else {
    -            CPAN->debug("calling expandany [$s]") if $CPAN::DEBUG;
    -	    $obj = CPAN::Shell->expandany($s);
    -	}
    -	if (ref $obj) {
    -            $obj->color_cmd_tmps(0,1);
    -            CPAN::Queue->new($obj->id);
    -            push @qcopy, $obj;
    -	} elsif ($CPAN::META->exists('CPAN::Author',$s)) {
    -	    $obj = $CPAN::META->instance('CPAN::Author',$s);
    -            if ($meth eq "dump") {
    -                $obj->dump;
    -            } else {
    -                $CPAN::Frontend->myprint(
    -                                         join "",
    -                                         "Don't be silly, you can't $meth ",
    -                                         $obj->fullname,
    -                                         " ;-)\n"
    -                                        );
    -                sleep 2;
    -            }
    -	} else {
    -	    $CPAN::Frontend
    -		->myprint(qq{Warning: Cannot $meth $s, }.
    -			  qq{don\'t know what it is.
    -Try the command
    -
    -    i /$s/
    -
    -to find objects with matching identifiers.
    -});
    -            sleep 2;
    -	}
    -    }
    -
    -    # queuerunner (please be warned: when I started to change the
    -    # queue to hold objects instead of names, I made one or two
    -    # mistakes and never found which. I reverted back instead)
    -    while ($s = CPAN::Queue->first) {
    -        my $obj;
    -	if (ref $s) {
    -	    $obj = $s; # I do not believe, we would survive if this happened
    -	} else {
    -	    $obj = CPAN::Shell->expandany($s);
    -	}
    -        if ($pragma
    -            &&
    -            ($] < 5.00303 || $obj->can($pragma))){
    -            ### compatibility with 5.003
    -            $obj->$pragma($meth); # the pragma "force" in
    -                                  # "CPAN::Distribution" must know
    -                                  # what we are intending
    -        }
    -        if ($]>=5.00303 && $obj->can('called_for')) {
    -            $obj->called_for($s);
    -        }
    -        CPAN->debug(
    -                    qq{pragma[$pragma]meth[$meth]obj[$obj]as_string\[}.
    -                    $obj->as_string.
    -                    qq{\]}
    -                   ) if $CPAN::DEBUG;
    -
    -        if ($obj->$meth()){
    -            CPAN::Queue->delete($s);
    -        } else {
    -            CPAN->debug("failed");
    -        }
    -
    -        $obj->undelay;
    -	CPAN::Queue->delete_first($s);
    -    }
    -    for my $obj (@qcopy) {
    -        $obj->color_cmd_tmps(0,0);
    -    }
    -}
    -
    -#-> sub CPAN::Shell::dump ;
    -sub dump    { shift->rematein('dump',@_); }
    -#-> sub CPAN::Shell::force ;
    -sub force   { shift->rematein('force',@_); }
    -#-> sub CPAN::Shell::get ;
    -sub get     { shift->rematein('get',@_); }
    -#-> sub CPAN::Shell::readme ;
    -sub readme  { shift->rematein('readme',@_); }
    -#-> sub CPAN::Shell::make ;
    -sub make    { shift->rematein('make',@_); }
    -#-> sub CPAN::Shell::test ;
    -sub test    { shift->rematein('test',@_); }
    -#-> sub CPAN::Shell::install ;
    -sub install { shift->rematein('install',@_); }
    -#-> sub CPAN::Shell::clean ;
    -sub clean   { shift->rematein('clean',@_); }
    -#-> sub CPAN::Shell::look ;
    -sub look   { shift->rematein('look',@_); }
    -#-> sub CPAN::Shell::cvs_import ;
    -sub cvs_import   { shift->rematein('cvs_import',@_); }
    -
    -package CPAN::LWP::UserAgent;
    -
    -sub config {
    -    return if $SETUPDONE;
    -    if ($CPAN::META->has_usable('LWP::UserAgent')) {
    -        require LWP::UserAgent;
    -        @ISA = qw(Exporter LWP::UserAgent);
    -        $SETUPDONE++;
    -    } else {
    -        $CPAN::Frontent->mywarn("LWP::UserAgent not available\n");
    -    }
    -}
    -
    -sub get_basic_credentials {
    -    my($self, $realm, $uri, $proxy) = @_;
    -    return unless $proxy;
    -    if ($USER && $PASSWD) {
    -    } elsif (defined $CPAN::Config->{proxy_user} &&
    -        defined $CPAN::Config->{proxy_pass}) {
    -        $USER = $CPAN::Config->{proxy_user};
    -        $PASSWD = $CPAN::Config->{proxy_pass};
    -    } else {
    -        require ExtUtils::MakeMaker;
    -        ExtUtils::MakeMaker->import(qw(prompt));
    -        $USER = prompt("Proxy authentication needed!
    - (Note: to permanently configure username and password run
    -   o conf proxy_user your_username
    -   o conf proxy_pass your_password
    - )\nUsername:");
    -        if ($CPAN::META->has_inst("Term::ReadKey")) {
    -            Term::ReadKey::ReadMode("noecho");
    -        } else {
    -            $CPAN::Frontend->mywarn("Warning: Term::ReadKey seems not to be available, your password will be echoed to the terminal!\n");
    -        }
    -        $PASSWD = prompt("Password:");
    -        if ($CPAN::META->has_inst("Term::ReadKey")) {
    -            Term::ReadKey::ReadMode("restore");
    -        }
    -        $CPAN::Frontend->myprint("\n\n");
    -    }
    -    return($USER,$PASSWD);
    -}
    -
    -sub mirror {
    -    my($self,$url,$aslocal) = @_;
    -    my $result = $self->SUPER::mirror($url,$aslocal);
    -    if ($result->code == 407) {
    -        undef $USER;
    -        undef $PASSWD;
    -        $result = $self->SUPER::mirror($url,$aslocal);
    -    }
    -    $result;
    -}
    -
    -package CPAN::FTP;
    -
    -#-> sub CPAN::FTP::ftp_get ;
    -sub ftp_get {
    -  my($class,$host,$dir,$file,$target) = @_;
    -  $class->debug(
    -		qq[Going to fetch file [$file] from dir [$dir]
    -	on host [$host] as local [$target]\n]
    -		      ) if $CPAN::DEBUG;
    -  my $ftp = Net::FTP->new($host);
    -  return 0 unless defined $ftp;
    -  $ftp->debug(1) if $CPAN::DEBUG{'FTP'} & $CPAN::DEBUG;
    -  $class->debug(qq[Going to login("anonymous","$Config::Config{cf_email}")]);
    -  unless ( $ftp->login("anonymous",$Config::Config{'cf_email'}) ){
    -    warn "Couldn't login on $host";
    -    return;
    -  }
    -  unless ( $ftp->cwd($dir) ){
    -    warn "Couldn't cwd $dir";
    -    return;
    -  }
    -  $ftp->binary;
    -  $class->debug(qq[Going to ->get("$file","$target")\n]) if $CPAN::DEBUG;
    -  unless ( $ftp->get($file,$target) ){
    -    warn "Couldn't fetch $file from $host\n";
    -    return;
    -  }
    -  $ftp->quit; # it's ok if this fails
    -  return 1;
    -}
    -
    -# If more accuracy is wanted/needed, Chris Leach sent me this patch...
    -
    - # > *** /install/perl/live/lib/CPAN.pm-	Wed Sep 24 13:08:48 1997
    - # > --- /tmp/cp	Wed Sep 24 13:26:40 1997
    - # > ***************
    - # > *** 1562,1567 ****
    - # > --- 1562,1580 ----
    - # >       return 1 if substr($url,0,4) eq "file";
    - # >       return 1 unless $url =~ m|://([^/]+)|;
    - # >       my $host = $1;
    - # > +     my $proxy = $CPAN::Config->{'http_proxy'} || $ENV{'http_proxy'};
    - # > +     if ($proxy) {
    - # > +         $proxy =~ m|://([^/:]+)|;
    - # > +         $proxy = $1;
    - # > +         my $noproxy = $CPAN::Config->{'no_proxy'} || $ENV{'no_proxy'};
    - # > +         if ($noproxy) {
    - # > +             if ($host !~ /$noproxy$/) {
    - # > +                 $host = $proxy;
    - # > +             }
    - # > +         } else {
    - # > +             $host = $proxy;
    - # > +         }
    - # > +     }
    - # >       require Net::Ping;
    - # >       return 1 unless $Net::Ping::VERSION >= 2;
    - # >       my $p;
    -
    -
    -#-> sub CPAN::FTP::localize ;
    -sub localize {
    -    my($self,$file,$aslocal,$force) = @_;
    -    $force ||= 0;
    -    Carp::croak "Usage: ->localize(cpan_file,as_local_file[,$force])"
    -	unless defined $aslocal;
    -    $self->debug("file[$file] aslocal[$aslocal] force[$force]")
    -	if $CPAN::DEBUG;
    -
    -    if ($^O eq 'MacOS') {
    -        # Comment by AK on 2000-09-03: Uniq short filenames would be
    -        # available in CHECKSUMS file
    -        my($name, $path) = File::Basename::fileparse($aslocal, '');
    -        if (length($name) > 31) {
    -            $name =~ s/(
    -                        \.(
    -                           readme(\.(gz|Z))? |
    -                           (tar\.)?(gz|Z) |
    -                           tgz |
    -                           zip |
    -                           pm\.(gz|Z)
    -                          )
    -                       )$//x;
    -            my $suf = $1;
    -            my $size = 31 - length($suf);
    -            while (length($name) > $size) {
    -                chop $name;
    -            }
    -            $name .= $suf;
    -            $aslocal = File::Spec->catfile($path, $name);
    -        }
    -    }
    -
    -    return $aslocal if -f $aslocal && -r _ && !($force & 1);
    -    my($restore) = 0;
    -    if (-f $aslocal){
    -	rename $aslocal, "$aslocal.bak";
    -	$restore++;
    -    }
    -
    -    my($aslocal_dir) = File::Basename::dirname($aslocal);
    -    File::Path::mkpath($aslocal_dir);
    -    $CPAN::Frontend->mywarn(qq{Warning: You are not allowed to write into }.
    -	qq{directory "$aslocal_dir".
    -    I\'ll continue, but if you encounter problems, they may be due
    -    to insufficient permissions.\n}) unless -w $aslocal_dir;
    -
    -    # Inheritance is not easier to manage than a few if/else branches
    -    if ($CPAN::META->has_usable('LWP::UserAgent')) {
    - 	unless ($Ua) {
    -            CPAN::LWP::UserAgent->config;
    -	    eval {$Ua = CPAN::LWP::UserAgent->new;}; # Why is has_usable still not fit enough?
    -            if ($@) {
    -                $CPAN::Frontent->mywarn("CPAN::LWP::UserAgent->new dies with $@")
    -                    if $CPAN::DEBUG;
    -            } else {
    -                my($var);
    -                $Ua->proxy('ftp',  $var)
    -                    if $var = $CPAN::Config->{ftp_proxy} || $ENV{ftp_proxy};
    -                $Ua->proxy('http', $var)
    -                    if $var = $CPAN::Config->{http_proxy} || $ENV{http_proxy};
    -
    -
    -# >>>>> On Wed, 13 Dec 2000 09:21:34 -0500, "Robison, Jonathon (J.M.)"  said:
    -# 
    -#  > I note that although CPAN.pm can use proxies, it doesn't seem equipped to
    -#  > use ones that require basic autorization.
    -#  
    -#  > Example of when I use it manually in my own stuff:
    -#  
    -#  > $ua->proxy(['http','ftp'], http://my.proxy.server:83');
    -#  > $req->proxy_authorization_basic("username","password");
    -#  > $res = $ua->request($req);
    -# 
    -
    -                $Ua->no_proxy($var)
    -                    if $var = $CPAN::Config->{no_proxy} || $ENV{no_proxy};
    -            }
    -	}
    -    }
    -    $ENV{ftp_proxy} = $CPAN::Config->{ftp_proxy} if $CPAN::Config->{ftp_proxy};
    -    $ENV{http_proxy} = $CPAN::Config->{http_proxy}
    -        if $CPAN::Config->{http_proxy};
    -    $ENV{no_proxy} = $CPAN::Config->{no_proxy} if $CPAN::Config->{no_proxy};
    -
    -    # Try the list of urls for each single object. We keep a record
    -    # where we did get a file from
    -    my(@reordered,$last);
    -    $CPAN::Config->{urllist} ||= [];
    -    $last = $#{$CPAN::Config->{urllist}};
    -    if ($force & 2) { # local cpans probably out of date, don't reorder
    -	@reordered = (0..$last);
    -    } else {
    -	@reordered =
    -	    sort {
    -		(substr($CPAN::Config->{urllist}[$b],0,4) eq "file")
    -		    <=>
    -		(substr($CPAN::Config->{urllist}[$a],0,4) eq "file")
    -		    or
    -		defined($Thesite)
    -		    and
    -		($b == $Thesite)
    -		    <=>
    -		($a == $Thesite)
    -	    } 0..$last;
    -    }
    -    my(@levels);
    -    if ($Themethod) {
    -	@levels = ($Themethod, grep {$_ ne $Themethod} qw/easy hard hardest/);
    -    } else {
    -	@levels = qw/easy hard hardest/;
    -    }
    -    @levels = qw/easy/ if $^O eq 'MacOS';
    -    my($levelno);
    -    for $levelno (0..$#levels) {
    -        my $level = $levels[$levelno];
    -	my $method = "host$level";
    -	my @host_seq = $level eq "easy" ?
    -	    @reordered : 0..$last;  # reordered has CDROM up front
    -	@host_seq = (0) unless @host_seq;
    -	my $ret = $self->$method(\@host_seq,$file,$aslocal);
    -	if ($ret) {
    -	  $Themethod = $level;
    -	  my $now = time;
    -	  # utime $now, $now, $aslocal; # too bad, if we do that, we
    -                                      # might alter a local mirror
    -	  $self->debug("level[$level]") if $CPAN::DEBUG;
    -	  return $ret;
    -	} else {
    -	  unlink $aslocal;
    -          last if $CPAN::Signal; # need to cleanup
    -	}
    -    }
    -    unless ($CPAN::Signal) {
    -        my(@mess);
    -        push @mess,
    -            qq{Please check, if the URLs I found in your configuration file \(}.
    -                join(", ", @{$CPAN::Config->{urllist}}).
    -                    qq{\) are valid. The urllist can be edited.},
    -                        qq{E.g. with 'o conf urllist push ftp://myurl/'};
    -        $CPAN::Frontend->myprint(Text::Wrap::wrap("","",@mess). "\n\n");
    -        sleep 2;
    -        $CPAN::Frontend->myprint("Could not fetch $file\n");
    -    }
    -    if ($restore) {
    -	rename "$aslocal.bak", $aslocal;
    -	$CPAN::Frontend->myprint("Trying to get away with old file:\n" .
    -				 $self->ls($aslocal));
    -	return $aslocal;
    -    }
    -    return;
    -}
    -
    -sub hosteasy {
    -    my($self,$host_seq,$file,$aslocal) = @_;
    -    my($i);
    -  HOSTEASY: for $i (@$host_seq) {
    -        my $url = $CPAN::Config->{urllist}[$i] || $CPAN::Defaultsite;
    -	$url .= "/" unless substr($url,-1) eq "/";
    -	$url .= $file;
    -	$self->debug("localizing perlish[$url]") if $CPAN::DEBUG;
    -	if ($url =~ /^file:/) {
    -	    my $l;
    -	    if ($CPAN::META->has_inst('URI::URL')) {
    -		my $u =  URI::URL->new($url);
    -		$l = $u->path;
    -	    } else { # works only on Unix, is poorly constructed, but
    -		# hopefully better than nothing.
    -		# RFC 1738 says fileurl BNF is
    -		# fileurl = "file://" [ host | "localhost" ] "/" fpath
    -		# Thanks to "Mark D. Baushke"  for
    -		# the code
    -		($l = $url) =~ s|^file://[^/]*/|/|; # discard the host part
    -		$l =~ s|^file:||;                   # assume they
    -                                                    # meant
    -                                                    # file://localhost
    -		$l =~ s|^/||s unless -f $l;         # e.g. /P:
    -		$self->debug("without URI::URL we try local file $l") if $CPAN::DEBUG;
    -	    }
    -	    if ( -f $l && -r _) {
    -		$Thesite = $i;
    -		return $l;
    -	    }
    -	    # Maybe mirror has compressed it?
    -	    if (-f "$l.gz") {
    -		$self->debug("found compressed $l.gz") if $CPAN::DEBUG;
    -		CPAN::Tarzip->gunzip("$l.gz", $aslocal);
    -		if ( -f $aslocal) {
    -		    $Thesite = $i;
    -		    return $aslocal;
    -		}
    -	    }
    -	}
    -        if ($CPAN::META->has_usable('LWP')) {
    -	  $CPAN::Frontend->myprint("Fetching with LWP:
    -  $url
    -");
    -	  unless ($Ua) {
    -              CPAN::LWP::UserAgent->config;
    -              eval { $Ua = CPAN::LWP::UserAgent->new; };
    -              if ($@) {
    -                  $CPAN::Frontent->mywarn("CPAN::LWP::UserAgent->new dies with $@");
    -              }
    -	  }
    -	  my $res = $Ua->mirror($url, $aslocal);
    -	  if ($res->is_success) {
    -	    $Thesite = $i;
    -	    my $now = time;
    -	    utime $now, $now, $aslocal; # download time is more
    -                                        # important than upload time
    -	    return $aslocal;
    -	  } elsif ($url !~ /\.gz(?!\n)\Z/) {
    -	    my $gzurl = "$url.gz";
    -	    $CPAN::Frontend->myprint("Fetching with LWP:
    -  $gzurl
    -");
    -	    $res = $Ua->mirror($gzurl, "$aslocal.gz");
    -	    if ($res->is_success &&
    -		CPAN::Tarzip->gunzip("$aslocal.gz",$aslocal)
    -	       ) {
    -	      $Thesite = $i;
    -	      return $aslocal;
    -	    }
    -	  } else {
    -              $CPAN::Frontend->myprint(sprintf(
    -                                               "LWP failed with code[%s] message[%s]\n",
    -                                               $res->code,
    -                                               $res->message,
    -                                              ));
    -	    # Alan Burlison informed me that in firewall environments
    -	    # Net::FTP can still succeed where LWP fails. So we do not
    -	    # skip Net::FTP anymore when LWP is available.
    -	  }
    -	} else {
    -            $CPAN::Frontend->myprint("LWP not available\n");
    -	}
    -        return if $CPAN::Signal;
    -	if ($url =~ m|^ftp://(.*?)/(.*)/(.*)|) {
    -	    # that's the nice and easy way thanks to Graham
    -	    my($host,$dir,$getfile) = ($1,$2,$3);
    -	    if ($CPAN::META->has_usable('Net::FTP')) {
    -		$dir =~ s|/+|/|g;
    -		$CPAN::Frontend->myprint("Fetching with Net::FTP:
    -  $url
    -");
    -		$self->debug("getfile[$getfile]dir[$dir]host[$host]" .
    -			     "aslocal[$aslocal]") if $CPAN::DEBUG;
    -		if (CPAN::FTP->ftp_get($host,$dir,$getfile,$aslocal)) {
    -		    $Thesite = $i;
    -		    return $aslocal;
    -		}
    -		if ($aslocal !~ /\.gz(?!\n)\Z/) {
    -		    my $gz = "$aslocal.gz";
    -		    $CPAN::Frontend->myprint("Fetching with Net::FTP
    -  $url.gz
    -");
    -		   if (CPAN::FTP->ftp_get($host,
    -					   $dir,
    -					   "$getfile.gz",
    -					   $gz) &&
    -			CPAN::Tarzip->gunzip($gz,$aslocal)
    -		       ){
    -			$Thesite = $i;
    -			return $aslocal;
    -		    }
    -		}
    -		# next HOSTEASY;
    -	    }
    -	}
    -        return if $CPAN::Signal;
    -    }
    -}
    -
    -sub hosthard {
    -  my($self,$host_seq,$file,$aslocal) = @_;
    -
    -  # Came back if Net::FTP couldn't establish connection (or
    -  # failed otherwise) Maybe they are behind a firewall, but they
    -  # gave us a socksified (or other) ftp program...
    -
    -  my($i);
    -  my($devnull) = $CPAN::Config->{devnull} || "";
    -  # < /dev/null ";
    -  my($aslocal_dir) = File::Basename::dirname($aslocal);
    -  File::Path::mkpath($aslocal_dir);
    -  HOSTHARD: for $i (@$host_seq) {
    -	my $url = $CPAN::Config->{urllist}[$i] || $CPAN::Defaultsite;
    -	$url .= "/" unless substr($url,-1) eq "/";
    -	$url .= $file;
    -	my($proto,$host,$dir,$getfile);
    -
    -	# Courtesy Mark Conty mark_conty@cargill.com change from
    -	# if ($url =~ m|^ftp://(.*?)/(.*)/(.*)|) {
    -	# to
    -	if ($url =~ m|^([^:]+)://(.*?)/(.*)/(.*)|) {
    -	  # proto not yet used
    -	  ($proto,$host,$dir,$getfile) = ($1,$2,$3,$4);
    -	} else {
    -	  next HOSTHARD; # who said, we could ftp anything except ftp?
    -	}
    -        next HOSTHARD if $proto eq "file"; # file URLs would have had
    -                                           # success above. Likely a bogus URL
    -
    -	$self->debug("localizing funkyftpwise[$url]") if $CPAN::DEBUG;
    -	my($f,$funkyftp);
    -	for $f ('lynx','ncftpget','ncftp','wget') {
    -	  next unless exists $CPAN::Config->{$f};
    -	  $funkyftp = $CPAN::Config->{$f};
    -	  next unless defined $funkyftp;
    -	  next if $funkyftp =~ /^\s*$/;
    -	  my($asl_ungz, $asl_gz);
    -	  ($asl_ungz = $aslocal) =~ s/\.gz//;
    -          $asl_gz = "$asl_ungz.gz";
    -	  my($src_switch) = "";
    -	  if ($f eq "lynx"){
    -	    $src_switch = " -source";
    -	  } elsif ($f eq "ncftp"){
    -	    $src_switch = " -c";
    -          } elsif ($f eq "wget"){
    -              $src_switch = " -O -";
    -	  }
    -	  my($chdir) = "";
    -	  my($stdout_redir) = " > $asl_ungz";
    -	  if ($f eq "ncftpget"){
    -	    $chdir = "cd $aslocal_dir && ";
    -	    $stdout_redir = "";
    -	  }
    -	  $CPAN::Frontend->myprint(
    -				   qq[
    -Trying with "$funkyftp$src_switch" to get
    -    $url
    -]);
    -	  my($system) =
    -	      "$chdir$funkyftp$src_switch '$url' $devnull$stdout_redir";
    -	  $self->debug("system[$system]") if $CPAN::DEBUG;
    -	  my($wstatus);
    -	  if (($wstatus = system($system)) == 0
    -	      &&
    -	      ($f eq "lynx" ?
    -	       -s $asl_ungz # lynx returns 0 when it fails somewhere
    -	       : 1
    -	      )
    -	     ) {
    -	    if (-s $aslocal) {
    -	      # Looks good
    -	    } elsif ($asl_ungz ne $aslocal) {
    -	      # test gzip integrity
    -	      if (CPAN::Tarzip->gtest($asl_ungz)) {
    -                  # e.g. foo.tar is gzipped --> foo.tar.gz
    -                  rename $asl_ungz, $aslocal;
    -	      } else {
    -                  CPAN::Tarzip->gzip($asl_ungz,$asl_gz);
    -	      }
    -	    }
    -	    $Thesite = $i;
    -	    return $aslocal;
    -	  } elsif ($url !~ /\.gz(?!\n)\Z/) {
    -	    unlink $asl_ungz if
    -		-f $asl_ungz && -s _ == 0;
    -	    my $gz = "$aslocal.gz";
    -	    my $gzurl = "$url.gz";
    -	    $CPAN::Frontend->myprint(
    -				     qq[
    -Trying with "$funkyftp$src_switch" to get
    -  $url.gz
    -]);
    -	    my($system) = "$funkyftp$src_switch '$url.gz' $devnull > $asl_gz";
    -	    $self->debug("system[$system]") if $CPAN::DEBUG;
    -	    my($wstatus);
    -	    if (($wstatus = system($system)) == 0
    -		&&
    -		-s $asl_gz
    -	       ) {
    -	      # test gzip integrity
    -	      if (CPAN::Tarzip->gtest($asl_gz)) {
    -                  CPAN::Tarzip->gunzip($asl_gz,$aslocal);
    -	      } else {
    -                  # somebody uncompressed file for us?
    -                  rename $asl_ungz, $aslocal;
    -	      }
    -	      $Thesite = $i;
    -	      return $aslocal;
    -	    } else {
    -	      unlink $asl_gz if -f $asl_gz;
    -	    }
    -	  } else {
    -	    my $estatus = $wstatus >> 8;
    -	    my $size = -f $aslocal ?
    -		", left\n$aslocal with size ".-s _ :
    -		    "\nWarning: expected file [$aslocal] doesn't exist";
    -	    $CPAN::Frontend->myprint(qq{
    -System call "$system"
    -returned status $estatus (wstat $wstatus)$size
    -});
    -	  }
    -          return if $CPAN::Signal;
    -	} # lynx,ncftpget,ncftp
    -    } # host
    -}
    -
    -sub hosthardest {
    -    my($self,$host_seq,$file,$aslocal) = @_;
    -
    -    my($i);
    -    my($aslocal_dir) = File::Basename::dirname($aslocal);
    -    File::Path::mkpath($aslocal_dir);
    -  HOSTHARDEST: for $i (@$host_seq) {
    -	unless (length $CPAN::Config->{'ftp'}) {
    -	    $CPAN::Frontend->myprint("No external ftp command available\n\n");
    -	    last HOSTHARDEST;
    -	}
    -	my $url = $CPAN::Config->{urllist}[$i] || $CPAN::Defaultsite;
    -	$url .= "/" unless substr($url,-1) eq "/";
    -	$url .= $file;
    -	$self->debug("localizing ftpwise[$url]") if $CPAN::DEBUG;
    -	unless ($url =~ m|^ftp://(.*?)/(.*)/(.*)|) {
    -	    next;
    -	}
    -	my($host,$dir,$getfile) = ($1,$2,$3);
    -	my $timestamp = 0;
    -	my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,
    -	   $ctime,$blksize,$blocks) = stat($aslocal);
    -	$timestamp = $mtime ||= 0;
    -	my($netrc) = CPAN::FTP::netrc->new;
    -	my($netrcfile) = $netrc->netrc;
    -	my($verbose) = $CPAN::DEBUG{'FTP'} & $CPAN::DEBUG ? " -v" : "";
    -	my $targetfile = File::Basename::basename($aslocal);
    -	my(@dialog);
    -	push(
    -	     @dialog,
    -	     "lcd $aslocal_dir",
    -	     "cd /",
    -	     map("cd $_", split "/", $dir), # RFC 1738
    -	     "bin",
    -	     "get $getfile $targetfile",
    -	     "quit"
    -	    );
    -	if (! $netrcfile) {
    -	    CPAN->debug("No ~/.netrc file found") if $CPAN::DEBUG;
    -	} elsif ($netrc->hasdefault || $netrc->contains($host)) {
    -	    CPAN->debug(sprintf("hasdef[%d]cont($host)[%d]",
    -				$netrc->hasdefault,
    -				$netrc->contains($host))) if $CPAN::DEBUG;
    -	    if ($netrc->protected) {
    -		$CPAN::Frontend->myprint(qq{
    -  Trying with external ftp to get
    -    $url
    -  As this requires some features that are not thoroughly tested, we\'re
    -  not sure, that we get it right....
    -
    -}
    -		     );
    -		$self->talk_ftp("$CPAN::Config->{'ftp'}$verbose $host",
    -				@dialog);
    -		($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
    -		 $atime,$mtime,$ctime,$blksize,$blocks) = stat($aslocal);
    -		$mtime ||= 0;
    -		if ($mtime > $timestamp) {
    -		    $CPAN::Frontend->myprint("GOT $aslocal\n");
    -		    $Thesite = $i;
    -		    return $aslocal;
    -		} else {
    -		    $CPAN::Frontend->myprint("Hmm... Still failed!\n");
    -		}
    -                return if $CPAN::Signal;
    -	    } else {
    -		$CPAN::Frontend->mywarn(qq{Your $netrcfile is not }.
    -					qq{correctly protected.\n});
    -	    }
    -	} else {
    -	    $CPAN::Frontend->mywarn("Your ~/.netrc neither contains $host
    -  nor does it have a default entry\n");
    -	}
    -
    -	# OK, they don't have a valid ~/.netrc. Use 'ftp -n'
    -	# then and login manually to host, using e-mail as
    -	# password.
    -	$CPAN::Frontend->myprint(qq{Issuing "$CPAN::Config->{'ftp'}$verbose -n"\n});
    -	unshift(
    -		@dialog,
    -		"open $host",
    -		"user anonymous $Config::Config{'cf_email'}"
    -	       );
    -	$self->talk_ftp("$CPAN::Config->{'ftp'}$verbose -n", @dialog);
    -	($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
    -	 $atime,$mtime,$ctime,$blksize,$blocks) = stat($aslocal);
    -	$mtime ||= 0;
    -	if ($mtime > $timestamp) {
    -	    $CPAN::Frontend->myprint("GOT $aslocal\n");
    -	    $Thesite = $i;
    -	    return $aslocal;
    -	} else {
    -	    $CPAN::Frontend->myprint("Bad luck... Still failed!\n");
    -	}
    -        return if $CPAN::Signal;
    -	$CPAN::Frontend->myprint("Can't access URL $url.\n\n");
    -	sleep 2;
    -    } # host
    -}
    -
    -sub talk_ftp {
    -    my($self,$command,@dialog) = @_;
    -    my $fh = FileHandle->new;
    -    $fh->open("|$command") or die "Couldn't open ftp: $!";
    -    foreach (@dialog) { $fh->print("$_\n") }
    -    $fh->close;		# Wait for process to complete
    -    my $wstatus = $?;
    -    my $estatus = $wstatus >> 8;
    -    $CPAN::Frontend->myprint(qq{
    -Subprocess "|$command"
    -  returned status $estatus (wstat $wstatus)
    -}) if $wstatus;
    -}
    -
    -# find2perl needs modularization, too, all the following is stolen
    -# from there
    -# CPAN::FTP::ls
    -sub ls {
    -    my($self,$name) = @_;
    -    my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$sizemm,
    -     $atime,$mtime,$ctime,$blksize,$blocks) = lstat($name);
    -
    -    my($perms,%user,%group);
    -    my $pname = $name;
    -
    -    if ($blocks) {
    -	$blocks = int(($blocks + 1) / 2);
    -    }
    -    else {
    -	$blocks = int(($sizemm + 1023) / 1024);
    -    }
    -
    -    if    (-f _) { $perms = '-'; }
    -    elsif (-d _) { $perms = 'd'; }
    -    elsif (-c _) { $perms = 'c'; $sizemm = &sizemm; }
    -    elsif (-b _) { $perms = 'b'; $sizemm = &sizemm; }
    -    elsif (-p _) { $perms = 'p'; }
    -    elsif (-S _) { $perms = 's'; }
    -    else         { $perms = 'l'; $pname .= ' -> ' . readlink($_); }
    -
    -    my(@rwx) = ('---','--x','-w-','-wx','r--','r-x','rw-','rwx');
    -    my(@moname) = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
    -    my $tmpmode = $mode;
    -    my $tmp = $rwx[$tmpmode & 7];
    -    $tmpmode >>= 3;
    -    $tmp = $rwx[$tmpmode & 7] . $tmp;
    -    $tmpmode >>= 3;
    -    $tmp = $rwx[$tmpmode & 7] . $tmp;
    -    substr($tmp,2,1) =~ tr/-x/Ss/ if -u _;
    -    substr($tmp,5,1) =~ tr/-x/Ss/ if -g _;
    -    substr($tmp,8,1) =~ tr/-x/Tt/ if -k _;
    -    $perms .= $tmp;
    -
    -    my $user = $user{$uid} || $uid;   # too lazy to implement lookup
    -    my $group = $group{$gid} || $gid;
    -
    -    my($sec,$min,$hour,$mday,$mon,$year) = localtime($mtime);
    -    my($timeyear);
    -    my($moname) = $moname[$mon];
    -    if (-M _ > 365.25 / 2) {
    -	$timeyear = $year + 1900;
    -    }
    -    else {
    -	$timeyear = sprintf("%02d:%02d", $hour, $min);
    -    }
    -
    -    sprintf "%5lu %4ld %-10s %2d %-8s %-8s %8s %s %2d %5s %s\n",
    -	    $ino,
    -		 $blocks,
    -		      $perms,
    -			    $nlink,
    -				$user,
    -				     $group,
    -					  $sizemm,
    -					      $moname,
    -						 $mday,
    -						     $timeyear,
    -							 $pname;
    -}
    -
    -package CPAN::FTP::netrc;
    -
    -sub new {
    -    my($class) = @_;
    -    my $file = MM->catfile($ENV{HOME},".netrc");
    -
    -    my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
    -       $atime,$mtime,$ctime,$blksize,$blocks)
    -	= stat($file);
    -    $mode ||= 0;
    -    my $protected = 0;
    -
    -    my($fh,@machines,$hasdefault);
    -    $hasdefault = 0;
    -    $fh = FileHandle->new or die "Could not create a filehandle";
    -
    -    if($fh->open($file)){
    -	$protected = ($mode & 077) == 0;
    -	local($/) = "";
    -      NETRC: while (<$fh>) {
    -	    my(@tokens) = split " ", $_;
    -	  TOKEN: while (@tokens) {
    -		my($t) = shift @tokens;
    -		if ($t eq "default"){
    -		    $hasdefault++;
    -		    last NETRC;
    -		}
    -		last TOKEN if $t eq "macdef";
    -		if ($t eq "machine") {
    -		    push @machines, shift @tokens;
    -		}
    -	    }
    -	}
    -    } else {
    -	$file = $hasdefault = $protected = "";
    -    }
    -
    -    bless {
    -	   'mach' => [@machines],
    -	   'netrc' => $file,
    -	   'hasdefault' => $hasdefault,
    -	   'protected' => $protected,
    -	  }, $class;
    -}
    -
    -# CPAN::FTP::hasdefault;
    -sub hasdefault { shift->{'hasdefault'} }
    -sub netrc      { shift->{'netrc'}      }
    -sub protected  { shift->{'protected'}  }
    -sub contains {
    -    my($self,$mach) = @_;
    -    for ( @{$self->{'mach'}} ) {
    -	return 1 if $_ eq $mach;
    -    }
    -    return 0;
    -}
    -
    -package CPAN::Complete;
    -
    -sub gnu_cpl {
    -    my($text, $line, $start, $end) = @_;
    -    my(@perlret) = cpl($text, $line, $start);
    -    # find longest common match. Can anybody show me how to peruse
    -    # T::R::Gnu to have this done automatically? Seems expensive.
    -    return () unless @perlret;
    -    my($newtext) = $text;
    -    for (my $i = length($text)+1;;$i++) {
    -	last unless length($perlret[0]) && length($perlret[0]) >= $i;
    -	my $try = substr($perlret[0],0,$i);
    -	my @tries = grep {substr($_,0,$i) eq $try} @perlret;
    -	# warn "try[$try]tries[@tries]";
    -	if (@tries == @perlret) {
    -	    $newtext = $try;
    -	} else {
    -	    last;
    -	}
    -    }
    -    ($newtext,@perlret);
    -}
    -
    -#-> sub CPAN::Complete::cpl ;
    -sub cpl {
    -    my($word,$line,$pos) = @_;
    -    $word ||= "";
    -    $line ||= "";
    -    $pos ||= 0;
    -    CPAN->debug("word [$word] line[$line] pos[$pos]") if $CPAN::DEBUG;
    -    $line =~ s/^\s*//;
    -    if ($line =~ s/^(force\s*)//) {
    -	$pos -= length($1);
    -    }
    -    my @return;
    -    if ($pos == 0) {
    -	@return = grep /^$word/, @CPAN::Complete::COMMANDS;
    -    } elsif ( $line !~ /^[\!abcdghimorutl]/ ) {
    -	@return = ();
    -    } elsif ($line =~ /^(a|ls)\s/) {
    -	@return = cplx('CPAN::Author',uc($word));
    -    } elsif ($line =~ /^b\s/) {
    -        CPAN::Shell->local_bundles;
    -	@return = cplx('CPAN::Bundle',$word);
    -    } elsif ($line =~ /^d\s/) {
    -	@return = cplx('CPAN::Distribution',$word);
    -    } elsif ($line =~ m/^(
    -                          [mru]|make|clean|dump|get|test|install|readme|look|cvs_import
    -                         )\s/x ) {
    -        if ($word =~ /^Bundle::/) {
    -            CPAN::Shell->local_bundles;
    -        }
    -	@return = (cplx('CPAN::Module',$word),cplx('CPAN::Bundle',$word));
    -    } elsif ($line =~ /^i\s/) {
    -	@return = cpl_any($word);
    -    } elsif ($line =~ /^reload\s/) {
    -	@return = cpl_reload($word,$line,$pos);
    -    } elsif ($line =~ /^o\s/) {
    -	@return = cpl_option($word,$line,$pos);
    -    } elsif ($line =~ m/^\S+\s/ ) {
    -        # fallback for future commands and what we have forgotten above
    -	@return = (cplx('CPAN::Module',$word),cplx('CPAN::Bundle',$word));
    -    } else {
    -	@return = ();
    -    }
    -    return @return;
    -}
    -
    -#-> sub CPAN::Complete::cplx ;
    -sub cplx {
    -    my($class, $word) = @_;
    -    # I believed for many years that this was sorted, today I
    -    # realized, it wasn't sorted anymore. Now (rev 1.301 / v 1.55) I
    -    # make it sorted again. Maybe sort was dropped when GNU-readline
    -    # support came in? The RCS file is difficult to read on that:-(
    -    sort grep /^\Q$word\E/, map { $_->id } $CPAN::META->all_objects($class);
    -}
    -
    -#-> sub CPAN::Complete::cpl_any ;
    -sub cpl_any {
    -    my($word) = shift;
    -    return (
    -	    cplx('CPAN::Author',$word),
    -	    cplx('CPAN::Bundle',$word),
    -	    cplx('CPAN::Distribution',$word),
    -	    cplx('CPAN::Module',$word),
    -	   );
    -}
    -
    -#-> sub CPAN::Complete::cpl_reload ;
    -sub cpl_reload {
    -    my($word,$line,$pos) = @_;
    -    $word ||= "";
    -    my(@words) = split " ", $line;
    -    CPAN->debug("word[$word] line[$line] pos[$pos]") if $CPAN::DEBUG;
    -    my(@ok) = qw(cpan index);
    -    return @ok if @words == 1;
    -    return grep /^\Q$word\E/, @ok if @words == 2 && $word;
    -}
    -
    -#-> sub CPAN::Complete::cpl_option ;
    -sub cpl_option {
    -    my($word,$line,$pos) = @_;
    -    $word ||= "";
    -    my(@words) = split " ", $line;
    -    CPAN->debug("word[$word] line[$line] pos[$pos]") if $CPAN::DEBUG;
    -    my(@ok) = qw(conf debug);
    -    return @ok if @words == 1;
    -    return grep /^\Q$word\E/, @ok if @words == 2 && length($word);
    -    if (0) {
    -    } elsif ($words[1] eq 'index') {
    -	return ();
    -    } elsif ($words[1] eq 'conf') {
    -	return CPAN::Config::cpl(@_);
    -    } elsif ($words[1] eq 'debug') {
    -	return sort grep /^\Q$word\E/, sort keys %CPAN::DEBUG, 'all';
    -    }
    -}
    -
    -package CPAN::Index;
    -
    -#-> sub CPAN::Index::force_reload ;
    -sub force_reload {
    -    my($class) = @_;
    -    $CPAN::Index::LAST_TIME = 0;
    -    $class->reload(1);
    -}
    -
    -#-> sub CPAN::Index::reload ;
    -sub reload {
    -    my($cl,$force) = @_;
    -    my $time = time;
    -
    -    # XXX check if a newer one is available. (We currently read it
    -    # from time to time)
    -    for ($CPAN::Config->{index_expire}) {
    -	$_ = 0.001 unless $_ && $_ > 0.001;
    -    }
    -    unless (1 || $CPAN::Have_warned->{readmetadatacache}++) {
    -        # debug here when CPAN doesn't seem to read the Metadata
    -        require Carp;
    -        Carp::cluck("META-PROTOCOL[$CPAN::META->{PROTOCOL}]");
    -    }
    -    unless ($CPAN::META->{PROTOCOL}) {
    -        $cl->read_metadata_cache;
    -        $CPAN::META->{PROTOCOL} ||= "1.0";
    -    }
    -    if ( $CPAN::META->{PROTOCOL} < PROTOCOL  ) {
    -        # warn "Setting last_time to 0";
    -        $LAST_TIME = 0; # No warning necessary
    -    }
    -    return if $LAST_TIME + $CPAN::Config->{index_expire}*86400 > $time
    -	and ! $force;
    -    if (0) {
    -        # IFF we are developing, it helps to wipe out the memory
    -        # between reloads, otherwise it is not what a user expects.
    -        undef $CPAN::META; # Neue Gruendlichkeit since v1.52(r1.274)
    -        $CPAN::META = CPAN->new;
    -    }
    -    {
    -        my($debug,$t2);
    -        local $LAST_TIME = $time;
    -        local $CPAN::META->{PROTOCOL} = PROTOCOL;
    -
    -        my $needshort = $^O eq "dos";
    -
    -        $cl->rd_authindex($cl
    -                          ->reload_x(
    -                                     "authors/01mailrc.txt.gz",
    -                                     $needshort ?
    -                                     File::Spec->catfile('authors', '01mailrc.gz') :
    -                                     File::Spec->catfile('authors', '01mailrc.txt.gz'),
    -                                     $force));
    -        $t2 = time;
    -        $debug = "timing reading 01[".($t2 - $time)."]";
    -        $time = $t2;
    -        return if $CPAN::Signal; # this is sometimes lengthy
    -        $cl->rd_modpacks($cl
    -                         ->reload_x(
    -                                    "modules/02packages.details.txt.gz",
    -                                    $needshort ?
    -                                    File::Spec->catfile('modules', '02packag.gz') :
    -                                    File::Spec->catfile('modules', '02packages.details.txt.gz'),
    -                                    $force));
    -        $t2 = time;
    -        $debug .= "02[".($t2 - $time)."]";
    -        $time = $t2;
    -        return if $CPAN::Signal; # this is sometimes lengthy
    -        $cl->rd_modlist($cl
    -                        ->reload_x(
    -                                   "modules/03modlist.data.gz",
    -                                   $needshort ?
    -                                   File::Spec->catfile('modules', '03mlist.gz') :
    -                                   File::Spec->catfile('modules', '03modlist.data.gz'),
    -                                   $force));
    -        $cl->write_metadata_cache;
    -        $t2 = time;
    -        $debug .= "03[".($t2 - $time)."]";
    -        $time = $t2;
    -        CPAN->debug($debug) if $CPAN::DEBUG;
    -    }
    -    $LAST_TIME = $time;
    -    $CPAN::META->{PROTOCOL} = PROTOCOL;
    -}
    -
    -#-> sub CPAN::Index::reload_x ;
    -sub reload_x {
    -    my($cl,$wanted,$localname,$force) = @_;
    -    $force |= 2; # means we're dealing with an index here
    -    CPAN::Config->load; # we should guarantee loading wherever we rely
    -                        # on Config XXX
    -    $localname ||= $wanted;
    -    my $abs_wanted = MM->catfile($CPAN::Config->{'keep_source_where'},
    -				   $localname);
    -    if (
    -	-f $abs_wanted &&
    -	-M $abs_wanted < $CPAN::Config->{'index_expire'} &&
    -	!($force & 1)
    -       ) {
    -	my $s = $CPAN::Config->{'index_expire'} == 1 ? "" : "s";
    -	$cl->debug(qq{$abs_wanted younger than $CPAN::Config->{'index_expire'} }.
    -		   qq{day$s. I\'ll use that.});
    -	return $abs_wanted;
    -    } else {
    -	$force |= 1; # means we're quite serious about it.
    -    }
    -    return CPAN::FTP->localize($wanted,$abs_wanted,$force);
    -}
    -
    -#-> sub CPAN::Index::rd_authindex ;
    -sub rd_authindex {
    -    my($cl, $index_target) = @_;
    -    my @lines;
    -    return unless defined $index_target;
    -    $CPAN::Frontend->myprint("Going to read $index_target\n");
    -    local(*FH);
    -    tie *FH, CPAN::Tarzip, $index_target;
    -    local($/) = "\n";
    -    push @lines, split /\012/ while ;
    -    foreach (@lines) {
    -	my($userid,$fullname,$email) =
    -	    m/alias\s+(\S+)\s+\"([^\"\<]+)\s+\<([^\>]+)\>\"/;
    -	next unless $userid && $fullname && $email;
    -
    -	# instantiate an author object
    - 	my $userobj = $CPAN::META->instance('CPAN::Author',$userid);
    -	$userobj->set('FULLNAME' => $fullname, 'EMAIL' => $email);
    -	return if $CPAN::Signal;
    -    }
    -}
    -
    -sub userid {
    -  my($self,$dist) = @_;
    -  $dist = $self->{'id'} unless defined $dist;
    -  my($ret) = $dist =~ m|(?:\w/\w\w/)?([^/]+)/|;
    -  $ret;
    -}
    -
    -#-> sub CPAN::Index::rd_modpacks ;
    -sub rd_modpacks {
    -    my($self, $index_target) = @_;
    -    my @lines;
    -    return unless defined $index_target;
    -    $CPAN::Frontend->myprint("Going to read $index_target\n");
    -    my $fh = CPAN::Tarzip->TIEHANDLE($index_target);
    -    local($/) = "\n";
    -    while ($_ = $fh->READLINE) {
    -	s/\012/\n/g;
    -	my @ls = map {"$_\n"} split /\n/, $_;
    -	unshift @ls, "\n" x length($1) if /^(\n+)/;
    -	push @lines, @ls;
    -    }
    -    # read header
    -    my($line_count,$last_updated);
    -    while (@lines) {
    -	my $shift = shift(@lines);
    -	last if $shift =~ /^\s*$/;
    -	$shift =~ /^Line-Count:\s+(\d+)/ and $line_count = $1;
    -        $shift =~ /^Last-Updated:\s+(.+)/ and $last_updated = $1;
    -    }
    -    if (not defined $line_count) {
    -
    -	warn qq{Warning: Your $index_target does not contain a Line-Count header.
    -Please check the validity of the index file by comparing it to more
    -than one CPAN mirror. I'll continue but problems seem likely to
    -happen.\a
    -};
    -
    -	sleep 5;
    -    } elsif ($line_count != scalar @lines) {
    -
    -	warn sprintf qq{Warning: Your %s
    -contains a Line-Count header of %d but I see %d lines there. Please
    -check the validity of the index file by comparing it to more than one
    -CPAN mirror. I'll continue but problems seem likely to happen.\a\n},
    -$index_target, $line_count, scalar(@lines);
    -
    -    }
    -    if (not defined $last_updated) {
    -
    -	warn qq{Warning: Your $index_target does not contain a Last-Updated header.
    -Please check the validity of the index file by comparing it to more
    -than one CPAN mirror. I'll continue but problems seem likely to
    -happen.\a
    -};
    -
    -	sleep 5;
    -    } else {
    -
    -	$CPAN::Frontend
    -            ->myprint(sprintf qq{  Database was generated on %s\n},
    -                      $last_updated);
    -        $DATE_OF_02 = $last_updated;
    -
    -        if ($CPAN::META->has_inst(HTTP::Date)) {
    -            require HTTP::Date;
    -            my($age) = (time - HTTP::Date::str2time($last_updated))/3600/24;
    -            if ($age > 30) {
    -
    -                $CPAN::Frontend
    -                    ->mywarn(sprintf
    -                             qq{Warning: This index file is %d days old.
    -  Please check the host you chose as your CPAN mirror for staleness.
    -  I'll continue but problems seem likely to happen.\a\n},
    -                             $age);
    -
    -            }
    -        } else {
    -            $CPAN::Frontend->myprint("  HTTP::Date not available\n");
    -        }
    -    }
    -
    -
    -    # A necessity since we have metadata_cache: delete what isn't
    -    # there anymore
    -    my $secondtime = $CPAN::META->exists("CPAN::Module","CPAN");
    -    CPAN->debug("secondtime[$secondtime]") if $CPAN::DEBUG;
    -    my(%exists);
    -    foreach (@lines) {
    -	chomp;
    -        # before 1.56 we split into 3 and discarded the rest. From
    -        # 1.57 we assign remaining text to $comment thus allowing to
    -        # influence isa_perl
    -	my($mod,$version,$dist,$comment) = split " ", $_, 4;
    -	my($bundle,$id,$userid);
    -
    -	if ($mod eq 'CPAN' &&
    -	    ! (
    -	       CPAN::Queue->exists('Bundle::CPAN') ||
    -	       CPAN::Queue->exists('CPAN')
    -	      )
    -	   ) {
    -            local($^W)= 0;
    -            if ($version > $CPAN::VERSION){
    -                $CPAN::Frontend->myprint(qq{
    -  There's a new CPAN.pm version (v$version) available!
    -  [Current version is v$CPAN::VERSION]
    -  You might want to try
    -    install Bundle::CPAN
    -    reload cpan
    -  without quitting the current session. It should be a seamless upgrade
    -  while we are running...
    -}); #});
    -                sleep 2;
    -		$CPAN::Frontend->myprint(qq{\n});
    -	    }
    -	    last if $CPAN::Signal;
    -	} elsif ($mod =~ /^Bundle::(.*)/) {
    -	    $bundle = $1;
    -	}
    -
    -	if ($bundle){
    -	    $id =  $CPAN::META->instance('CPAN::Bundle',$mod);
    -	    # Let's make it a module too, because bundles have so much
    -	    # in common with modules.
    -
    -            # Changed in 1.57_63: seems like memory bloat now without
    -            # any value, so commented out
    -
    -	    # $CPAN::META->instance('CPAN::Module',$mod);
    -
    -	} else {
    -
    -	    # instantiate a module object
    -	    $id = $CPAN::META->instance('CPAN::Module',$mod);
    -
    -	}
    -
    -	if ($id->cpan_file ne $dist){ # update only if file is
    -                                      # different. CPAN prohibits same
    -                                      # name with different version
    -	    $userid = $self->userid($dist);
    -	    $id->set(
    -		     'CPAN_USERID' => $userid,
    -		     'CPAN_VERSION' => $version,
    -		     'CPAN_FILE' => $dist,
    -		    );
    -	}
    -
    -	# instantiate a distribution object
    -	if ($CPAN::META->exists('CPAN::Distribution',$dist)) {
    -	  # we do not need CONTAINSMODS unless we do something with
    -	  # this dist, so we better produce it on demand.
    -
    -	  ## my $obj = $CPAN::META->instance(
    -	  ## 				  'CPAN::Distribution' => $dist
    -	  ## 				 );
    -	  ## $obj->{CONTAINSMODS}{$mod} = undef; # experimental
    -	} else {
    -	  $CPAN::META->instance(
    -				'CPAN::Distribution' => $dist
    -			       )->set(
    -				      'CPAN_USERID' => $userid,
    -                                      'CPAN_COMMENT' => $comment,
    -				     );
    -	}
    -        if ($secondtime) {
    -            for my $name ($mod,$dist) {
    -                CPAN->debug("exists name[$name]") if $CPAN::DEBUG;
    -                $exists{$name} = undef;
    -            }
    -        }
    -	return if $CPAN::Signal;
    -    }
    -    undef $fh;
    -    if ($secondtime) {
    -        for my $class (qw(CPAN::Module CPAN::Bundle CPAN::Distribution)) {
    -            for my $o ($CPAN::META->all_objects($class)) {
    -                next if exists $exists{$o->{ID}};
    -                $CPAN::META->delete($class,$o->{ID});
    -                CPAN->debug("deleting ID[$o->{ID}] in class[$class]")
    -                    if $CPAN::DEBUG;
    -            }
    -        }
    -    }
    -}
    -
    -#-> sub CPAN::Index::rd_modlist ;
    -sub rd_modlist {
    -    my($cl,$index_target) = @_;
    -    return unless defined $index_target;
    -    $CPAN::Frontend->myprint("Going to read $index_target\n");
    -    my $fh = CPAN::Tarzip->TIEHANDLE($index_target);
    -    my @eval;
    -    local($/) = "\n";
    -    while ($_ = $fh->READLINE) {
    -	s/\012/\n/g;
    -	my @ls = map {"$_\n"} split /\n/, $_;
    -	unshift @ls, "\n" x length($1) if /^(\n+)/;
    -	push @eval, @ls;
    -    }
    -    while (@eval) {
    -	my $shift = shift(@eval);
    -	if ($shift =~ /^Date:\s+(.*)/){
    -	    return if $DATE_OF_03 eq $1;
    -	    ($DATE_OF_03) = $1;
    -	}
    -	last if $shift =~ /^\s*$/;
    -    }
    -    undef $fh;
    -    push @eval, q{CPAN::Modulelist->data;};
    -    local($^W) = 0;
    -    my($comp) = Safe->new("CPAN::Safe1");
    -    my($eval) = join("", @eval);
    -    my $ret = $comp->reval($eval);
    -    Carp::confess($@) if $@;
    -    return if $CPAN::Signal;
    -    for (keys %$ret) {
    -	my $obj = $CPAN::META->instance("CPAN::Module",$_);
    -        delete $ret->{$_}{modid}; # not needed here, maybe elsewhere
    -	$obj->set(%{$ret->{$_}});
    -	return if $CPAN::Signal;
    -    }
    -}
    -
    -#-> sub CPAN::Index::write_metadata_cache ;
    -sub write_metadata_cache {
    -    my($self) = @_;
    -    return unless $CPAN::Config->{'cache_metadata'};
    -    return unless $CPAN::META->has_usable("Storable");
    -    my $cache;
    -    foreach my $k (qw(CPAN::Bundle CPAN::Author CPAN::Module
    -		      CPAN::Distribution)) {
    -	$cache->{$k} = $CPAN::META->{readonly}{$k}; # unsafe meta access, ok
    -    }
    -    my $metadata_file = MM->catfile($CPAN::Config->{cpan_home},"Metadata");
    -    $cache->{last_time} = $LAST_TIME;
    -    $cache->{DATE_OF_02} = $DATE_OF_02;
    -    $cache->{PROTOCOL} = PROTOCOL;
    -    $CPAN::Frontend->myprint("Going to write $metadata_file\n");
    -    eval { Storable::nstore($cache, $metadata_file) };
    -    $CPAN::Frontend->mywarn($@) if $@;
    -}
    -
    -#-> sub CPAN::Index::read_metadata_cache ;
    -sub read_metadata_cache {
    -    my($self) = @_;
    -    return unless $CPAN::Config->{'cache_metadata'};
    -    return unless $CPAN::META->has_usable("Storable");
    -    my $metadata_file = MM->catfile($CPAN::Config->{cpan_home},"Metadata");
    -    return unless -r $metadata_file and -f $metadata_file;
    -    $CPAN::Frontend->myprint("Going to read $metadata_file\n");
    -    my $cache;
    -    eval { $cache = Storable::retrieve($metadata_file) };
    -    $CPAN::Frontend->mywarn($@) if $@;
    -    if (!$cache || ref $cache ne 'HASH'){
    -        $LAST_TIME = 0;
    -        return;
    -    }
    -    if (exists $cache->{PROTOCOL}) {
    -        if (PROTOCOL > $cache->{PROTOCOL}) {
    -            $CPAN::Frontend->mywarn(sprintf("Ignoring Metadata cache written ".
    -                                            "with protocol v%s, requiring v%s",
    -                                            $cache->{PROTOCOL},
    -                                            PROTOCOL)
    -                                   );
    -            return;
    -        }
    -    } else {
    -        $CPAN::Frontend->mywarn("Ignoring Metadata cache written ".
    -                                "with protocol v1.0");
    -        return;
    -    }
    -    my $clcnt = 0;
    -    my $idcnt = 0;
    -    while(my($class,$v) = each %$cache) {
    -	next unless $class =~ /^CPAN::/;
    -	$CPAN::META->{readonly}{$class} = $v; # unsafe meta access, ok
    -        while (my($id,$ro) = each %$v) {
    -            $CPAN::META->{readwrite}{$class}{$id} ||=
    -                $class->new(ID=>$id, RO=>$ro);
    -            $idcnt++;
    -        }
    -        $clcnt++;
    -    }
    -    unless ($clcnt) { # sanity check
    -        $CPAN::Frontend->myprint("Warning: Found no data in $metadata_file\n");
    -        return;
    -    }
    -    if ($idcnt < 1000) {
    -        $CPAN::Frontend->myprint("Warning: Found only $idcnt objects ".
    -                                 "in $metadata_file\n");
    -        return;
    -    }
    -    $CPAN::META->{PROTOCOL} ||=
    -        $cache->{PROTOCOL}; # reading does not up or downgrade, but it
    -                            # does initialize to some protocol
    -    $LAST_TIME = $cache->{last_time};
    -    $DATE_OF_02 = $cache->{DATE_OF_02};
    -    $CPAN::Frontend->myprint("  Database was generated on $DATE_OF_02\n");
    -    return;
    -}
    -
    -package CPAN::InfoObj;
    -
    -# Accessors
    -sub cpan_userid { shift->{RO}{CPAN_USERID} }
    -sub id { shift->{ID}; }
    -
    -#-> sub CPAN::InfoObj::new ;
    -sub new {
    -    my $this = bless {}, shift;
    -    %$this = @_;
    -    $this
    -}
    -
    -# The set method may only be used by code that reads index data or
    -# otherwise "objective" data from the outside world. All session
    -# related material may do anything else with instance variables but
    -# must not touch the hash under the RO attribute. The reason is that
    -# the RO hash gets written to Metadata file and is thus persistent.
    -
    -#-> sub CPAN::InfoObj::set ;
    -sub set {
    -    my($self,%att) = @_;
    -    my $class = ref $self;
    -
    -    # This must be ||=, not ||, because only if we write an empty
    -    # reference, only then the set method will write into the readonly
    -    # area. But for Distributions that spring into existence, maybe
    -    # because of a typo, we do not like it that they are written into
    -    # the readonly area and made permanent (at least for a while) and
    -    # that is why we do not "allow" other places to call ->set.
    -    unless ($self->id) {
    -        CPAN->debug("Bug? Empty ID, rejecting");
    -        return;
    -    }
    -    my $ro = $self->{RO} =
    -        $CPAN::META->{readonly}{$class}{$self->id} ||= {};
    -
    -    while (my($k,$v) = each %att) {
    -        $ro->{$k} = $v;
    -    }
    -}
    -
    -#-> sub CPAN::InfoObj::as_glimpse ;
    -sub as_glimpse {
    -    my($self) = @_;
    -    my(@m);
    -    my $class = ref($self);
    -    $class =~ s/^CPAN:://;
    -    push @m, sprintf "%-15s %s\n", $class, $self->{ID};
    -    join "", @m;
    -}
    -
    -#-> sub CPAN::InfoObj::as_string ;
    -sub as_string {
    -    my($self) = @_;
    -    my(@m);
    -    my $class = ref($self);
    -    $class =~ s/^CPAN:://;
    -    push @m, $class, " id = $self->{ID}\n";
    -    for (sort keys %{$self->{RO}}) {
    -	# next if m/^(ID|RO)$/;
    -	my $extra = "";
    -	if ($_ eq "CPAN_USERID") {
    -            $extra .= " (".$self->author;
    -            my $email; # old perls!
    -            if ($email = $CPAN::META->instance("CPAN::Author",
    -                                               $self->cpan_userid
    -                                              )->email) {
    -                $extra .= " <$email>";
    -            } else {
    -                $extra .= " ";
    -            }
    -            $extra .= ")";
    -        } elsif ($_ eq "FULLNAME") { # potential UTF-8 conversion
    -            push @m, sprintf "    %-12s %s\n", $_, $self->fullname;
    -            next;
    -        }
    -        next unless defined $self->{RO}{$_};
    -        push @m, sprintf "    %-12s %s%s\n", $_, $self->{RO}{$_}, $extra;
    -    }
    -    for (sort keys %$self) {
    -	next if m/^(ID|RO)$/;
    -	if (ref($self->{$_}) eq "ARRAY") {
    -	  push @m, sprintf "    %-12s %s\n", $_, "@{$self->{$_}}";
    -	} elsif (ref($self->{$_}) eq "HASH") {
    -	  push @m, sprintf(
    -			   "    %-12s %s\n",
    -			   $_,
    -			   join(" ",keys %{$self->{$_}}),
    -                          );
    -	} else {
    -	  push @m, sprintf "    %-12s %s\n", $_, $self->{$_};
    -	}
    -    }
    -    join "", @m, "\n";
    -}
    -
    -#-> sub CPAN::InfoObj::author ;
    -sub author {
    -    my($self) = @_;
    -    $CPAN::META->instance("CPAN::Author",$self->cpan_userid)->fullname;
    -}
    -
    -#-> sub CPAN::InfoObj::dump ;
    -sub dump {
    -  my($self) = @_;
    -  require Data::Dumper;
    -  print Data::Dumper::Dumper($self);
    -}
    -
    -package CPAN::Author;
    -
    -#-> sub CPAN::Author::id
    -sub id {
    -    my $self = shift;
    -    my $id = $self->{ID};
    -    $CPAN::Frontend->mydie("Illegal author id[$id]") unless $id =~ /^[A-Z]/;
    -    $id;
    -}
    -
    -#-> sub CPAN::Author::as_glimpse ;
    -sub as_glimpse {
    -    my($self) = @_;
    -    my(@m);
    -    my $class = ref($self);
    -    $class =~ s/^CPAN:://;
    -    push @m, sprintf(qq{%-15s %s ("%s" <%s>)\n},
    -                     $class,
    -                     $self->{ID},
    -                     $self->fullname,
    -                     $self->email);
    -    join "", @m;
    -}
    -
    -#-> sub CPAN::Author::fullname ;
    -sub fullname {
    -    shift->{RO}{FULLNAME};
    -}
    -*name = \&fullname;
    -
    -#-> sub CPAN::Author::email ;
    -sub email    { shift->{RO}{EMAIL}; }
    -
    -#-> sub CPAN::Author::ls ;
    -sub ls {
    -    my $self = shift;
    -    my $id = $self->id;
    -
    -    # adapted from CPAN::Distribution::verifyMD5 ;
    -    my(@csf); # chksumfile
    -    @csf = $self->id =~ /(.)(.)(.*)/;
    -    $csf[1] = join "", @csf[0,1];
    -    $csf[2] = join "", @csf[1,2];
    -    my(@dl);
    -    @dl = $self->dir_listing([$csf[0],"CHECKSUMS"], 0);
    -    unless (grep {$_->[2] eq $csf[1]} @dl) {
    -        $CPAN::Frontend->myprint("No files in the directory of $id\n");
    -        return;
    -    }
    -    @dl = $self->dir_listing([@csf[0,1],"CHECKSUMS"], 0);
    -    unless (grep {$_->[2] eq $csf[2]} @dl) {
    -        $CPAN::Frontend->myprint("No files in the directory of $id\n");
    -        return;
    -    }
    -    @dl = $self->dir_listing([@csf,"CHECKSUMS"], 1);
    -    $CPAN::Frontend->myprint(join "", map {
    -        sprintf("%8d %10s %s/%s\n", $_->[0], $_->[1], $id, $_->[2])
    -    } sort { $a->[2] cmp $b->[2] } @dl);
    -}
    -
    -# returns an array of arrays, the latter contain (size,mtime,filename)
    -#-> sub CPAN::Author::dir_listing ;
    -sub dir_listing {
    -    my $self = shift;
    -    my $chksumfile = shift;
    -    my $recursive = shift;
    -    my $lc_want =
    -	MM->catfile($CPAN::Config->{keep_source_where},
    -                    "authors", "id", @$chksumfile);
    -    local($") = "/";
    -    # connect "force" argument with "index_expire".
    -    my $force = 0;
    -    if (my @stat = stat $lc_want) {
    -        $force = $stat[9] + $CPAN::Config->{index_expire}*86400 <= time;
    -    }
    -    my $lc_file = CPAN::FTP->localize("authors/id/@$chksumfile",
    -                                      $lc_want,$force);
    -    unless ($lc_file) {
    -        $CPAN::Frontend->myprint("Trying $lc_want.gz\n");
    -	$chksumfile->[-1] .= ".gz";
    -	$lc_file = CPAN::FTP->localize("authors/id/@$chksumfile",
    -                                       "$lc_want.gz",1);
    -	if ($lc_file) {
    -	    $lc_file =~ s{\.gz(?!\n)\Z}{}; #};
    -	    CPAN::Tarzip->gunzip("$lc_file.gz",$lc_file);
    -	} else {
    -	    return;
    -	}
    -    }
    -
    -    # adapted from CPAN::Distribution::MD5_check_file ;
    -    my $fh = FileHandle->new;
    -    my($cksum);
    -    if (open $fh, $lc_file){
    -	local($/);
    -	my $eval = <$fh>;
    -	$eval =~ s/\015?\012/\n/g;
    -	close $fh;
    -	my($comp) = Safe->new();
    -	$cksum = $comp->reval($eval);
    -	if ($@) {
    -	    rename $lc_file, "$lc_file.bad";
    -	    Carp::confess($@) if $@;
    -	}
    -    } else {
    -	Carp::carp "Could not open $lc_file for reading";
    -    }
    -    my(@result,$f);
    -    for $f (sort keys %$cksum) {
    -        if (exists $cksum->{$f}{isdir}) {
    -            if ($recursive) {
    -                my(@dir) = @$chksumfile;
    -                pop @dir;
    -                push @dir, $f, "CHECKSUMS";
    -                push @result, map {
    -                    [$_->[0], $_->[1], "$f/$_->[2]"]
    -                } $self->dir_listing(\@dir,1);
    -            } else {
    -                push @result, [ 0, "-", $f ];
    -            }
    -        } else {
    -            push @result, [
    -                           ($cksum->{$f}{"size"}||0),
    -                           $cksum->{$f}{"mtime"}||"---",
    -                           $f
    -                          ];
    -        }
    -    }
    -    @result;
    -}
    -
    -package CPAN::Distribution;
    -
    -# Accessors
    -sub cpan_comment { shift->{RO}{CPAN_COMMENT} }
    -
    -sub undelay {
    -    my $self = shift;
    -    delete $self->{later};
    -}
    -
    -# CPAN::Distribution::normalize
    -sub normalize {
    -    my($self,$s) = @_;
    -    $s = $self->id unless defined $s;
    -    if (
    -        $s =~ tr|/|| == 1
    -        or
    -        $s !~ m|[A-Z]/[A-Z-]{2}/[A-Z-]{2,}/|
    -       ) {
    -        return $s if $s =~ m:^N/A|^Contact Author: ;
    -        $s =~ s|^(.)(.)([^/]*/)(.+)$|$1/$1$2/$1$2$3$4| or
    -            $CPAN::Frontend->mywarn("Strange distribution name [$s]");
    -        CPAN->debug("s[$s]") if $CPAN::DEBUG;
    -    }
    -    $s;
    -}
    -
    -#-> sub CPAN::Distribution::color_cmd_tmps ;
    -sub color_cmd_tmps {
    -    my($self) = shift;
    -    my($depth) = shift || 0;
    -    my($color) = shift || 0;
    -    # a distribution needs to recurse into its prereq_pms
    -
    -    return if exists $self->{incommandcolor}
    -        && $self->{incommandcolor}==$color;
    -    $CPAN::Frontend->mydie(sprintf("CPAN.pm panic: deep recursion in ".
    -                                   "color_cmd_tmps depth[%s] self[%s] id[%s]",
    -                                   $depth,
    -                                   $self,
    -                                   $self->id
    -                                  )) if $depth>=100;
    -    ##### warn "color_cmd_tmps $depth $color " . $self->id; # sleep 1;
    -    my $prereq_pm = $self->prereq_pm;
    -    if (defined $prereq_pm) {
    -        for my $pre (keys %$prereq_pm) {
    -            my $premo = CPAN::Shell->expand("Module",$pre);
    -            $premo->color_cmd_tmps($depth+1,$color);
    -        }
    -    }
    -    if ($color==0) {
    -        delete $self->{sponsored_mods};
    -        delete $self->{badtestcnt};
    -    }
    -    $self->{incommandcolor} = $color;
    -}
    -
    -#-> sub CPAN::Distribution::as_string ;
    -sub as_string {
    -  my $self = shift;
    -  $self->containsmods;
    -  $self->SUPER::as_string(@_);
    -}
    -
    -#-> sub CPAN::Distribution::containsmods ;
    -sub containsmods {
    -  my $self = shift;
    -  return keys %{$self->{CONTAINSMODS}} if exists $self->{CONTAINSMODS};
    -  my $dist_id = $self->{ID};
    -  for my $mod ($CPAN::META->all_objects("CPAN::Module")) {
    -    my $mod_file = $mod->cpan_file or next;
    -    my $mod_id = $mod->{ID} or next;
    -    # warn "mod_file[$mod_file] dist_id[$dist_id] mod_id[$mod_id]";
    -    # sleep 1;
    -    $self->{CONTAINSMODS}{$mod_id} = undef if $mod_file eq $dist_id;
    -  }
    -  keys %{$self->{CONTAINSMODS}};
    -}
    -
    -#-> sub CPAN::Distribution::uptodate ;
    -sub uptodate {
    -    my($self) = @_;
    -    my $c;
    -    foreach $c ($self->containsmods) {
    -        my $obj = CPAN::Shell->expandany($c);
    -        return 0 unless $obj->uptodate;
    -    }
    -    return 1;
    -}
    -
    -#-> sub CPAN::Distribution::called_for ;
    -sub called_for {
    -    my($self,$id) = @_;
    -    $self->{CALLED_FOR} = $id if defined $id;
    -    return $self->{CALLED_FOR};
    -}
    -
    -#-> sub CPAN::Distribution::safe_chdir ;
    -sub safe_chdir {
    -    my($self,$todir) = @_;
    -    # we die if we cannot chdir and we are debuggable
    -    Carp::confess("safe_chdir called without todir argument")
    -          unless defined $todir and length $todir;
    -    if (chdir $todir) {
    -        $self->debug(sprintf "changed directory to %s", CPAN::anycwd())
    -            if $CPAN::DEBUG;
    -    } else {
    -        my $cwd = CPAN::anycwd();
    -        $CPAN::Frontend->mydie(qq{Could not chdir from cwd[$cwd] }.
    -                               qq{to todir[$todir]: $!});
    -    }
    -}
    -
    -#-> sub CPAN::Distribution::get ;
    -sub get {
    -    my($self) = @_;
    -  EXCUSE: {
    -	my @e;
    -	exists $self->{'build_dir'} and push @e,
    -	    "Is already unwrapped into directory $self->{'build_dir'}";
    -	$CPAN::Frontend->myprint(join "", map {"  $_\n"} @e) and return if @e;
    -    }
    -    my $sub_wd = CPAN::anycwd(); # for cleaning up as good as possible
    -
    -    #
    -    # Get the file on local disk
    -    #
    -
    -    my($local_file);
    -    my($local_wanted) =
    -        MM->catfile(
    -                    $CPAN::Config->{keep_source_where},
    -                    "authors",
    -                    "id",
    -                    split("/",$self->id)
    -                   );
    -
    -    $self->debug("Doing localize") if $CPAN::DEBUG;
    -    unless ($local_file =
    -            CPAN::FTP->localize("authors/id/$self->{ID}",
    -                                $local_wanted)) {
    -        my $note = "";
    -        if ($CPAN::Index::DATE_OF_02) {
    -            $note = "Note: Current database in memory was generated ".
    -                "on $CPAN::Index::DATE_OF_02\n";
    -        }
    -        $CPAN::Frontend->mydie("Giving up on '$local_wanted'\n$note");
    -    }
    -    $self->debug("local_file[$local_file]") if $CPAN::DEBUG;
    -    $self->{localfile} = $local_file;
    -    return if $CPAN::Signal;
    -
    -    #
    -    # Check integrity
    -    #
    -    if ($CPAN::META->has_inst("MD5")) {
    -	$self->debug("MD5 is installed, verifying");
    -	$self->verifyMD5;
    -    } else {
    -	$self->debug("MD5 is NOT installed");
    -    }
    -    return if $CPAN::Signal;
    -
    -    #
    -    # Create a clean room and go there
    -    #
    -    $CPAN::META->{cachemgr} ||= CPAN::CacheMgr->new(); # unsafe meta access, ok
    -    my $builddir = $CPAN::META->{cachemgr}->dir; # unsafe meta access, ok
    -    $self->safe_chdir($builddir);
    -    $self->debug("Removing tmp") if $CPAN::DEBUG;
    -    File::Path::rmtree("tmp");
    -    mkdir "tmp", 0755 or Carp::croak "Couldn't mkdir tmp: $!";
    -    if ($CPAN::Signal){
    -        $self->safe_chdir($sub_wd);
    -        return;
    -    }
    -    $self->safe_chdir("tmp");
    -
    -    #
    -    # Unpack the goods
    -    #
    -    if ($local_file =~ /(\.tar\.(gz|Z)|\.tgz)(?!\n)\Z/i){
    -        $self->{was_uncompressed}++ unless CPAN::Tarzip->gtest($local_file);
    -	$self->untar_me($local_file);
    -    } elsif ( $local_file =~ /\.zip(?!\n)\Z/i ) {
    -	$self->unzip_me($local_file);
    -    } elsif ( $local_file =~ /\.pm\.(gz|Z)(?!\n)\Z/) {
    -        $self->{was_uncompressed}++ unless CPAN::Tarzip->gtest($local_file);
    -	$self->pm2dir_me($local_file);
    -    } else {
    -	$self->{archived} = "NO";
    -        $self->safe_chdir($sub_wd);
    -        return;
    -    }
    -
    -    # we are still in the tmp directory!
    -    # Let's check if the package has its own directory.
    -    my $dh = DirHandle->new(File::Spec->curdir)
    -        or Carp::croak("Couldn't opendir .: $!");
    -    my @readdir = grep $_ !~ /^\.\.?(?!\n)\Z/s, $dh->read; ### MAC??
    -    $dh->close;
    -    my ($distdir,$packagedir);
    -    if (@readdir == 1 && -d $readdir[0]) {
    -        $distdir = $readdir[0];
    -        $packagedir = MM->catdir($builddir,$distdir);
    -        $self->debug("packagedir[$packagedir]builddir[$builddir]distdir[$distdir]")
    -            if $CPAN::DEBUG;
    -        -d $packagedir and $CPAN::Frontend->myprint("Removing previously used ".
    -                                                    "$packagedir\n");
    -        File::Path::rmtree($packagedir);
    -        rename($distdir,$packagedir) or
    -            Carp::confess("Couldn't rename $distdir to $packagedir: $!");
    -        $self->debug(sprintf("renamed distdir[%s] to packagedir[%s] -e[%s]-d[%s]",
    -                             $distdir,
    -                             $packagedir,
    -                             -e $packagedir,
    -                             -d $packagedir,
    -                            )) if $CPAN::DEBUG;
    -    } else {
    -        my $userid = $self->cpan_userid;
    -        unless ($userid) {
    -            CPAN->debug("no userid? self[$self]");
    -            $userid = "anon";
    -        }
    -        my $pragmatic_dir = $userid . '000';
    -        $pragmatic_dir =~ s/\W_//g;
    -        $pragmatic_dir++ while -d "../$pragmatic_dir";
    -        $packagedir = MM->catdir($builddir,$pragmatic_dir);
    -        $self->debug("packagedir[$packagedir]") if $CPAN::DEBUG;
    -        File::Path::mkpath($packagedir);
    -        my($f);
    -        for $f (@readdir) { # is already without "." and ".."
    -            my $to = MM->catdir($packagedir,$f);
    -            rename($f,$to) or Carp::confess("Couldn't rename $f to $to: $!");
    -        }
    -    }
    -    if ($CPAN::Signal){
    -        $self->safe_chdir($sub_wd);
    -        return;
    -    }
    -
    -    $self->{'build_dir'} = $packagedir;
    -    $self->safe_chdir(File::Spec->updir);
    -    File::Path::rmtree("tmp");
    -
    -    my($mpl) = MM->catfile($packagedir,"Makefile.PL");
    -    my($mpl_exists) = -f $mpl;
    -    unless ($mpl_exists) {
    -        # NFS has been reported to have racing problems after the
    -        # renaming of a directory in some environments.
    -        # This trick helps.
    -        sleep 1;
    -        my $mpldh = DirHandle->new($packagedir)
    -            or Carp::croak("Couldn't opendir $packagedir: $!");
    -        $mpl_exists = grep /^Makefile\.PL$/, $mpldh->read;
    -        $mpldh->close;
    -    }
    -    unless ($mpl_exists) {
    -        $self->debug(sprintf("makefilepl[%s]anycwd[%s]",
    -                             $mpl,
    -                             CPAN::anycwd(),
    -                            )) if $CPAN::DEBUG;
    -        my($configure) = MM->catfile($packagedir,"Configure");
    -        if (-f $configure) {
    -            # do we have anything to do?
    -            $self->{'configure'} = $configure;
    -        } elsif (-f MM->catfile($packagedir,"Makefile")) {
    -            $CPAN::Frontend->myprint(qq{
    -Package comes with a Makefile and without a Makefile.PL.
    -We\'ll try to build it with that Makefile then.
    -});
    -            $self->{writemakefile} = "YES";
    -            sleep 2;
    -        } else {
    -            my $cf = $self->called_for || "unknown";
    -            if ($cf =~ m|/|) {
    -                $cf =~ s|.*/||;
    -                $cf =~ s|\W.*||;
    -            }
    -            $cf =~ s|[/\\:]||g; # risk of filesystem damage
    -            $cf = "unknown" unless length($cf);
    -            $CPAN::Frontend->myprint(qq{Package seems to come without Makefile.PL.
    -  (The test -f "$mpl" returned false.)
    -  Writing one on our own (setting NAME to $cf)\a\n});
    -            $self->{had_no_makefile_pl}++;
    -            sleep 3;
    -
    -            # Writing our own Makefile.PL
    -
    -            my $fh = FileHandle->new;
    -            $fh->open(">$mpl")
    -                or Carp::croak("Could not open >$mpl: $!");
    -            $fh->print(
    -qq{# This Makefile.PL has been autogenerated by the module CPAN.pm
    -# because there was no Makefile.PL supplied.
    -# Autogenerated on: }.scalar localtime().qq{
    -
    -use ExtUtils::MakeMaker;
    -WriteMakefile(NAME => q[$cf]);
    -
    -});
    -            $fh->close;
    -        }
    -    }
    -
    -    return $self;
    -}
    -
    -# CPAN::Distribution::untar_me ;
    -sub untar_me {
    -    my($self,$local_file) = @_;
    -    $self->{archived} = "tar";
    -    if (CPAN::Tarzip->untar($local_file)) {
    -	$self->{unwrapped} = "YES";
    -    } else {
    -	$self->{unwrapped} = "NO";
    -    }
    -}
    -
    -# CPAN::Distribution::unzip_me ;
    -sub unzip_me {
    -    my($self,$local_file) = @_;
    -    $self->{archived} = "zip";
    -    if (CPAN::Tarzip->unzip($local_file)) {
    -	$self->{unwrapped} = "YES";
    -    } else {
    -	$self->{unwrapped} = "NO";
    -    }
    -    return;
    -}
    -
    -sub pm2dir_me {
    -    my($self,$local_file) = @_;
    -    $self->{archived} = "pm";
    -    my $to = File::Basename::basename($local_file);
    -    $to =~ s/\.(gz|Z)(?!\n)\Z//;
    -    if (CPAN::Tarzip->gunzip($local_file,$to)) {
    -	$self->{unwrapped} = "YES";
    -    } else {
    -	$self->{unwrapped} = "NO";
    -    }
    -}
    -
    -#-> sub CPAN::Distribution::new ;
    -sub new {
    -    my($class,%att) = @_;
    -
    -    # $CPAN::META->{cachemgr} ||= CPAN::CacheMgr->new();
    -
    -    my $this = { %att };
    -    return bless $this, $class;
    -}
    -
    -#-> sub CPAN::Distribution::look ;
    -sub look {
    -    my($self) = @_;
    -
    -    if ($^O eq 'MacOS') {
    -      $self->ExtUtils::MM_MacOS::look;
    -      return;
    -    }
    -
    -    if (  $CPAN::Config->{'shell'} ) {
    -	$CPAN::Frontend->myprint(qq{
    -Trying to open a subshell in the build directory...
    -});
    -    } else {
    -	$CPAN::Frontend->myprint(qq{
    -Your configuration does not define a value for subshells.
    -Please define it with "o conf shell "
    -});
    -	return;
    -    }
    -    my $dist = $self->id;
    -    my $dir;
    -    unless ($dir = $self->dir) {
    -        $self->get;
    -    }
    -    unless ($dir ||= $self->dir) {
    -	$CPAN::Frontend->mywarn(qq{
    -Could not determine which directory to use for looking at $dist.
    -});
    -	return;
    -    }
    -    my $pwd  = CPAN::anycwd();
    -    $self->safe_chdir($dir);
    -    $CPAN::Frontend->myprint(qq{Working directory is $dir\n});
    -    system($CPAN::Config->{'shell'}) == 0
    -	or $CPAN::Frontend->mydie("Subprocess shell error");
    -    $self->safe_chdir($pwd);
    -}
    -
    -# CPAN::Distribution::cvs_import ;
    -sub cvs_import {
    -    my($self) = @_;
    -    $self->get;
    -    my $dir = $self->dir;
    -
    -    my $package = $self->called_for;
    -    my $module = $CPAN::META->instance('CPAN::Module', $package);
    -    my $version = $module->cpan_version;
    -
    -    my $userid = $self->cpan_userid;
    -
    -    my $cvs_dir = (split '/', $dir)[-1];
    -    $cvs_dir =~ s/-\d+[^-]+(?!\n)\Z//;
    -    my $cvs_root = 
    -      $CPAN::Config->{cvsroot} || $ENV{CVSROOT};
    -    my $cvs_site_perl = 
    -      $CPAN::Config->{cvs_site_perl} || $ENV{CVS_SITE_PERL};
    -    if ($cvs_site_perl) {
    -	$cvs_dir = "$cvs_site_perl/$cvs_dir";
    -    }
    -    my $cvs_log = qq{"imported $package $version sources"};
    -    $version =~ s/\./_/g;
    -    my @cmd = ('cvs', '-d', $cvs_root, 'import', '-m', $cvs_log,
    -	       "$cvs_dir", $userid, "v$version");
    -
    -    my $pwd  = CPAN::anycwd();
    -    chdir($dir) or $CPAN::Frontend->mydie(qq{Could not chdir to "$dir": $!});
    -
    -    $CPAN::Frontend->myprint(qq{Working directory is $dir\n});
    -
    -    $CPAN::Frontend->myprint(qq{@cmd\n});
    -    system(@cmd) == 0 or
    -	$CPAN::Frontend->mydie("cvs import failed");
    -    chdir($pwd) or $CPAN::Frontend->mydie(qq{Could not chdir to "$pwd": $!});
    -}
    -
    -#-> sub CPAN::Distribution::readme ;
    -sub readme {
    -    my($self) = @_;
    -    my($dist) = $self->id;
    -    my($sans,$suffix) = $dist =~ /(.+)\.(tgz|tar[\._-]gz|tar\.Z|zip)$/;
    -    $self->debug("sans[$sans] suffix[$suffix]\n") if $CPAN::DEBUG;
    -    my($local_file);
    -    my($local_wanted) =
    -	 MM->catfile(
    -			$CPAN::Config->{keep_source_where},
    -			"authors",
    -			"id",
    -			split("/","$sans.readme"),
    -		       );
    -    $self->debug("Doing localize") if $CPAN::DEBUG;
    -    $local_file = CPAN::FTP->localize("authors/id/$sans.readme",
    -				      $local_wanted)
    -	or $CPAN::Frontend->mydie(qq{No $sans.readme found});;
    -
    -    if ($^O eq 'MacOS') {
    -        ExtUtils::MM_MacOS::launch_file($local_file);
    -        return;
    -    }
    -
    -    my $fh_pager = FileHandle->new;
    -    local($SIG{PIPE}) = "IGNORE";
    -    $fh_pager->open("|$CPAN::Config->{'pager'}")
    -	or die "Could not open pager $CPAN::Config->{'pager'}: $!";
    -    my $fh_readme = FileHandle->new;
    -    $fh_readme->open($local_file)
    -	or $CPAN::Frontend->mydie(qq{Could not open "$local_file": $!});
    -    $CPAN::Frontend->myprint(qq{
    -Displaying file
    -  $local_file
    -with pager "$CPAN::Config->{'pager'}"
    -});
    -    sleep 2;
    -    $fh_pager->print(<$fh_readme>);
    -}
    -
    -#-> sub CPAN::Distribution::verifyMD5 ;
    -sub verifyMD5 {
    -    my($self) = @_;
    -  EXCUSE: {
    -	my @e;
    -	$self->{MD5_STATUS} ||= "";
    -	$self->{MD5_STATUS} eq "OK" and push @e, "MD5 Checksum was ok";
    -	$CPAN::Frontend->myprint(join "", map {"  $_\n"} @e) and return if @e;
    -    }
    -    my($lc_want,$lc_file,@local,$basename);
    -    @local = split("/",$self->id);
    -    pop @local;
    -    push @local, "CHECKSUMS";
    -    $lc_want =
    -	MM->catfile($CPAN::Config->{keep_source_where},
    -		      "authors", "id", @local);
    -    local($") = "/";
    -    if (
    -	-s $lc_want
    -	&&
    -	$self->MD5_check_file($lc_want)
    -       ) {
    -	return $self->{MD5_STATUS} = "OK";
    -    }
    -    $lc_file = CPAN::FTP->localize("authors/id/@local",
    -				   $lc_want,1);
    -    unless ($lc_file) {
    -        $CPAN::Frontend->myprint("Trying $lc_want.gz\n");
    -	$local[-1] .= ".gz";
    -	$lc_file = CPAN::FTP->localize("authors/id/@local",
    -				       "$lc_want.gz",1);
    -	if ($lc_file) {
    -	    $lc_file =~ s/\.gz(?!\n)\Z//;
    -	    CPAN::Tarzip->gunzip("$lc_file.gz",$lc_file);
    -	} else {
    -	    return;
    -	}
    -    }
    -    $self->MD5_check_file($lc_file);
    -}
    -
    -#-> sub CPAN::Distribution::MD5_check_file ;
    -sub MD5_check_file {
    -    my($self,$chk_file) = @_;
    -    my($cksum,$file,$basename);
    -    $file = $self->{localfile};
    -    $basename = File::Basename::basename($file);
    -    my $fh = FileHandle->new;
    -    if (open $fh, $chk_file){
    -	local($/);
    -	my $eval = <$fh>;
    -	$eval =~ s/\015?\012/\n/g;
    -	close $fh;
    -	my($comp) = Safe->new();
    -	$cksum = $comp->reval($eval);
    -	if ($@) {
    -	    rename $chk_file, "$chk_file.bad";
    -	    Carp::confess($@) if $@;
    -	}
    -    } else {
    -	Carp::carp "Could not open $chk_file for reading";
    -    }
    -
    -    if (exists $cksum->{$basename}{md5}) {
    -	$self->debug("Found checksum for $basename:" .
    -		     "$cksum->{$basename}{md5}\n") if $CPAN::DEBUG;
    -
    -	open($fh, $file);
    -	binmode $fh;
    -	my $eq = $self->eq_MD5($fh,$cksum->{$basename}{'md5'});
    -	$fh->close;
    -	$fh = CPAN::Tarzip->TIEHANDLE($file);
    -
    -	unless ($eq) {
    -	  # had to inline it, when I tied it, the tiedness got lost on
    -	  # the call to eq_MD5. (Jan 1998)
    -	  my $md5 = MD5->new;
    -	  my($data,$ref);
    -	  $ref = \$data;
    -	  while ($fh->READ($ref, 4096) > 0){
    -	    $md5->add($data);
    -	  }
    -	  my $hexdigest = $md5->hexdigest;
    -	  $eq += $hexdigest eq $cksum->{$basename}{'md5-ungz'};
    -	}
    -
    -	if ($eq) {
    -	  $CPAN::Frontend->myprint("Checksum for $file ok\n");
    -	  return $self->{MD5_STATUS} = "OK";
    -	} else {
    -	    $CPAN::Frontend->myprint(qq{\nChecksum mismatch for }.
    -				     qq{distribution file. }.
    -				     qq{Please investigate.\n\n}.
    -				     $self->as_string,
    -				     $CPAN::META->instance(
    -							   'CPAN::Author',
    -							   $self->cpan_userid
    -							  )->as_string);
    -
    -	    my $wrap = qq{I\'d recommend removing $file. Its MD5
    -checksum is incorrect. Maybe you have configured your 'urllist' with
    -a bad URL. Please check this array with 'o conf urllist', and
    -retry.};
    -
    -            $CPAN::Frontend->mydie(Text::Wrap::wrap("","",$wrap));
    -
    -            # former versions just returned here but this seems a
    -            # serious threat that deserves a die
    -
    -	    # $CPAN::Frontend->myprint("\n\n");
    -	    # sleep 3;
    -	    # return;
    -	}
    -	# close $fh if fileno($fh);
    -    } else {
    -	$self->{MD5_STATUS} ||= "";
    -	if ($self->{MD5_STATUS} eq "NIL") {
    -	    $CPAN::Frontend->mywarn(qq{
    -Warning: No md5 checksum for $basename in $chk_file.
    -
    -The cause for this may be that the file is very new and the checksum
    -has not yet been calculated, but it may also be that something is
    -going awry right now.
    -});
    -            my $answer = ExtUtils::MakeMaker::prompt("Proceed?", "yes");
    -            $answer =~ /^\s*y/i or $CPAN::Frontend->mydie("Aborted.");
    -	}
    -	$self->{MD5_STATUS} = "NIL";
    -	return;
    -    }
    -}
    -
    -#-> sub CPAN::Distribution::eq_MD5 ;
    -sub eq_MD5 {
    -    my($self,$fh,$expectMD5) = @_;
    -    my $md5 = MD5->new;
    -    my($data);
    -    while (read($fh, $data, 4096)){
    -      $md5->add($data);
    -    }
    -    # $md5->addfile($fh);
    -    my $hexdigest = $md5->hexdigest;
    -    # warn "fh[$fh] hex[$hexdigest] aexp[$expectMD5]";
    -    $hexdigest eq $expectMD5;
    -}
    -
    -#-> sub CPAN::Distribution::force ;
    -
    -# Both modules and distributions know if "force" is in effect by
    -# autoinspection, not by inspecting a global variable. One of the
    -# reason why this was chosen to work that way was the treatment of
    -# dependencies. They should not autpomatically inherit the force
    -# status. But this has the downside that ^C and die() will return to
    -# the prompt but will not be able to reset the force_update
    -# attributes. We try to correct for it currently in the read_metadata
    -# routine, and immediately before we check for a Signal. I hope this
    -# works out in one of v1.57_53ff
    -
    -sub force {
    -  my($self, $method) = @_;
    -  for my $att (qw(
    -  MD5_STATUS archived build_dir localfile make install unwrapped
    -  writemakefile
    - )) {
    -    delete $self->{$att};
    -  }
    -  if ($method && $method eq "install") {
    -    $self->{"force_update"}++; # name should probably have been force_install
    -  }
    -}
    -
    -#-> sub CPAN::Distribution::unforce ;
    -sub unforce {
    -  my($self) = @_;
    -  delete $self->{'force_update'};
    -}
    -
    -#-> sub CPAN::Distribution::isa_perl ;
    -sub isa_perl {
    -  my($self) = @_;
    -  my $file = File::Basename::basename($self->id);
    -  if ($file =~ m{ ^ perl
    -                  -?
    -		  (5)
    -		  ([._-])
    -		  (
    -                   \d{3}(_[0-4][0-9])?
    -                   |
    -                   \d*[24680]\.\d+
    -                  )
    -		  \.tar[._-]gz
    -		  (?!\n)\Z
    -		}xs){
    -    return "$1.$3";
    -  } elsif ($self->cpan_comment
    -           &&
    -           $self->cpan_comment =~ /isa_perl\(.+?\)/){
    -    return $1;
    -  }
    -}
    -
    -#-> sub CPAN::Distribution::perl ;
    -sub perl {
    -    my($self) = @_;
    -    my($perl) = MM->file_name_is_absolute($^X) ? $^X : "";
    -    my $pwd  = CPAN::anycwd();
    -    my $candidate = MM->catfile($pwd,$^X);
    -    $perl ||= $candidate if MM->maybe_command($candidate);
    -    unless ($perl) {
    -	my ($component,$perl_name);
    -      DIST_PERLNAME: foreach $perl_name ($^X, 'perl', 'perl5', "perl$]") {
    -	    PATH_COMPONENT: foreach $component (MM->path(),
    -						$Config::Config{'binexp'}) {
    -		  next unless defined($component) && $component;
    -		  my($abs) = MM->catfile($component,$perl_name);
    -		  if (MM->maybe_command($abs)) {
    -		      $perl = $abs;
    -		      last DIST_PERLNAME;
    -		  }
    -	      }
    -	  }
    -    }
    -    $perl;
    -}
    -
    -#-> sub CPAN::Distribution::make ;
    -sub make {
    -    my($self) = @_;
    -    $CPAN::Frontend->myprint(sprintf "Running make for %s\n", $self->id);
    -    # Emergency brake if they said install Pippi and get newest perl
    -    if ($self->isa_perl) {
    -      if (
    -	  $self->called_for ne $self->id &&
    -          ! $self->{force_update}
    -	 ) {
    -        # if we die here, we break bundles
    -	$CPAN::Frontend->mywarn(sprintf qq{
    -The most recent version "%s" of the module "%s"
    -comes with the current version of perl (%s).
    -I\'ll build that only if you ask for something like
    -    force install %s
    -or
    -    install %s
    -},
    -			       $CPAN::META->instance(
    -						     'CPAN::Module',
    -						     $self->called_for
    -						    )->cpan_version,
    -			       $self->called_for,
    -			       $self->isa_perl,
    -			       $self->called_for,
    -			       $self->id);
    -        sleep 5; return;
    -      }
    -    }
    -    $self->get;
    -  EXCUSE: {
    -	my @e;
    -	$self->{archived} eq "NO" and push @e,
    -	"Is neither a tar nor a zip archive.";
    -
    -	$self->{unwrapped} eq "NO" and push @e,
    -	"had problems unarchiving. Please build manually";
    -
    -	exists $self->{writemakefile} &&
    -	    $self->{writemakefile} =~ m/ ^ NO\s* ( .* ) /sx and push @e,
    -		$1 || "Had some problem writing Makefile";
    -
    -	defined $self->{'make'} and push @e,
    -            "Has already been processed within this session";
    -
    -        exists $self->{later} and length($self->{later}) and
    -            push @e, $self->{later};
    -
    -	$CPAN::Frontend->myprint(join "", map {"  $_\n"} @e) and return if @e;
    -    }
    -    $CPAN::Frontend->myprint("\n  CPAN.pm: Going to build ".$self->id."\n\n");
    -    my $builddir = $self->dir;
    -    chdir $builddir or Carp::croak("Couldn't chdir $builddir: $!");
    -    $self->debug("Changed directory to $builddir") if $CPAN::DEBUG;
    -
    -    if ($^O eq 'MacOS') {
    -        ExtUtils::MM_MacOS::make($self);
    -        return;
    -    }
    -
    -    my $system;
    -    if ($self->{'configure'}) {
    -      $system = $self->{'configure'};
    -    } else {
    -	my($perl) = $self->perl or die "Couldn\'t find executable perl\n";
    -	my $switch = "";
    -# This needs a handler that can be turned on or off:
    -#	$switch = "-MExtUtils::MakeMaker ".
    -#	    "-Mops=:default,:filesys_read,:filesys_open,require,chdir"
    -#	    if $] > 5.00310;
    -	$system = "$perl $switch Makefile.PL $CPAN::Config->{makepl_arg}";
    -    }
    -    unless (exists $self->{writemakefile}) {
    -	local($SIG{ALRM}) = sub { die "inactivity_timeout reached\n" };
    -	my($ret,$pid);
    -	$@ = "";
    -	if ($CPAN::Config->{inactivity_timeout}) {
    -	    eval {
    -		alarm $CPAN::Config->{inactivity_timeout};
    -		local $SIG{CHLD}; # = sub { wait };
    -		if (defined($pid = fork)) {
    -		    if ($pid) { #parent
    -			# wait;
    -			waitpid $pid, 0;
    -		    } else {    #child
    -		      # note, this exec isn't necessary if
    -		      # inactivity_timeout is 0. On the Mac I'd
    -		      # suggest, we set it always to 0.
    -		      exec $system;
    -		    }
    -		} else {
    -		    $CPAN::Frontend->myprint("Cannot fork: $!");
    -		    return;
    -		}
    -	    };
    -	    alarm 0;
    -	    if ($@){
    -		kill 9, $pid;
    -		waitpid $pid, 0;
    -		$CPAN::Frontend->myprint($@);
    -		$self->{writemakefile} = "NO $@";
    -		$@ = "";
    -		return;
    -	    }
    -	} else {
    -	  $ret = system($system);
    -	  if ($ret != 0) {
    -	    $self->{writemakefile} = "NO Makefile.PL returned status $ret";
    -	    return;
    -	  }
    -	}
    -	if (-f "Makefile") {
    -	  $self->{writemakefile} = "YES";
    -          delete $self->{make_clean}; # if cleaned before, enable next
    -	} else {
    -	  $self->{writemakefile} =
    -	      qq{NO Makefile.PL refused to write a Makefile.};
    -	  # It's probably worth to record the reason, so let's retry
    -	  # local $/;
    -	  # my $fh = IO::File->new("$system |"); # STDERR? STDIN?
    -	  # $self->{writemakefile} .= <$fh>;
    -	}
    -    }
    -    if ($CPAN::Signal){
    -      delete $self->{force_update};
    -      return;
    -    }
    -    if (my @prereq = $self->unsat_prereq){
    -      return 1 if $self->follow_prereqs(@prereq); # signal success to the queuerunner
    -    }
    -    $system = join " ", $CPAN::Config->{'make'}, $CPAN::Config->{make_arg};
    -    if (system($system) == 0) {
    -	 $CPAN::Frontend->myprint("  $system -- OK\n");
    -	 $self->{'make'} = "YES";
    -    } else {
    -	 $self->{writemakefile} ||= "YES";
    -	 $self->{'make'} = "NO";
    -	 $CPAN::Frontend->myprint("  $system -- NOT OK\n");
    -    }
    -}
    -
    -sub follow_prereqs {
    -    my($self) = shift;
    -    my(@prereq) = @_;
    -    my $id = $self->id;
    -    $CPAN::Frontend->myprint("---- Unsatisfied dependencies detected ".
    -                             "during [$id] -----\n");
    -
    -    for my $p (@prereq) {
    -	$CPAN::Frontend->myprint("    $p\n");
    -    }
    -    my $follow = 0;
    -    if ($CPAN::Config->{prerequisites_policy} eq "follow") {
    -	$follow = 1;
    -    } elsif ($CPAN::Config->{prerequisites_policy} eq "ask") {
    -	require ExtUtils::MakeMaker;
    -	my $answer = ExtUtils::MakeMaker::prompt(
    -"Shall I follow them and prepend them to the queue
    -of modules we are processing right now?", "yes");
    -	$follow = $answer =~ /^\s*y/i;
    -    } else {
    -	local($") = ", ";
    -	$CPAN::Frontend->
    -            myprint("  Ignoring dependencies on modules @prereq\n");
    -    }
    -    if ($follow) {
    -        # color them as dirty
    -        for my $p (@prereq) {
    -            CPAN::Shell->expandany($p)->color_cmd_tmps(0,1);
    -        }
    -        CPAN::Queue->jumpqueue(@prereq,$id); # queue them and requeue yourself
    -        $self->{later} = "Delayed until after prerequisites";
    -        return 1; # signal success to the queuerunner
    -    }
    -}
    -
    -#-> sub CPAN::Distribution::unsat_prereq ;
    -sub unsat_prereq {
    -    my($self) = @_;
    -    my $prereq_pm = $self->prereq_pm or return;
    -    my(@need);
    -  NEED: while (my($need_module, $need_version) = each %$prereq_pm) {
    -        my $nmo = $CPAN::META->instance("CPAN::Module",$need_module);
    -        # we were too demanding:
    -        next if $nmo->uptodate;
    -
    -        # if they have not specified a version, we accept any installed one
    -        if (not defined $need_version or
    -           $need_version == 0 or
    -           $need_version eq "undef") {
    -            next if defined $nmo->inst_file;
    -        }
    -
    -        # We only want to install prereqs if either they're not installed
    -        # or if the installed version is too old. We cannot omit this
    -        # check, because if 'force' is in effect, nobody else will check.
    -        {
    -            local($^W) = 0;
    -            if (
    -                defined $nmo->inst_file &&
    -                ! CPAN::Version->vgt($need_version, $nmo->inst_version)
    -               ){
    -                CPAN->debug(sprintf "id[%s]inst_file[%s]inst_version[%s]need_version[%s]",
    -                            $nmo->id,
    -                            $nmo->inst_file,
    -                            $nmo->inst_version,
    -                            CPAN::Version->readable($need_version)
    -                           );
    -                next NEED;
    -            }
    -        }
    -
    -        if ($self->{sponsored_mods}{$need_module}++){
    -            # We have already sponsored it and for some reason it's still
    -            # not available. So we do nothing. Or what should we do?
    -            # if we push it again, we have a potential infinite loop
    -            next;
    -        }
    -        push @need, $need_module;
    -    }
    -    @need;
    -}
    -
    -#-> sub CPAN::Distribution::prereq_pm ;
    -sub prereq_pm {
    -  my($self) = @_;
    -  return $self->{prereq_pm} if
    -      exists $self->{prereq_pm_detected} && $self->{prereq_pm_detected};
    -  return unless $self->{writemakefile}; # no need to have succeeded
    -                                        # but we must have run it
    -  my $build_dir = $self->{build_dir} or die "Panic: no build_dir?";
    -  my $makefile = File::Spec->catfile($build_dir,"Makefile");
    -  my(%p) = ();
    -  my $fh;
    -  if (-f $makefile
    -      and
    -      $fh = FileHandle->new("<$makefile\0")) {
    -
    -      local($/) = "\n";
    -
    -      #  A.Speer @p -> %p, where %p is $p{Module::Name}=Required_Version
    -      while (<$fh>) {
    -          last if /MakeMaker post_initialize section/;
    -          my($p) = m{^[\#]
    -		 \s+PREREQ_PM\s+=>\s+(.+)
    -		 }x;
    -          next unless $p;
    -          # warn "Found prereq expr[$p]";
    -
    -          #  Regexp modified by A.Speer to remember actual version of file
    -          #  PREREQ_PM hash key wants, then add to
    -          while ( $p =~ m/(?:\s)([\w\:]+)=>q\[(.*?)\],?/g ){
    -              # In case a prereq is mentioned twice, complain.
    -              if ( defined $p{$1} ) {
    -                  warn "Warning: PREREQ_PM mentions $1 more than once, last mention wins";
    -              }
    -              $p{$1} = $2;
    -          }
    -          last;
    -      }
    -  }
    -  $self->{prereq_pm_detected}++;
    -  return $self->{prereq_pm} = \%p;
    -}
    -
    -#-> sub CPAN::Distribution::test ;
    -sub test {
    -    my($self) = @_;
    -    $self->make;
    -    if ($CPAN::Signal){
    -      delete $self->{force_update};
    -      return;
    -    }
    -    $CPAN::Frontend->myprint("Running make test\n");
    -    if (my @prereq = $self->unsat_prereq){
    -      return 1 if $self->follow_prereqs(@prereq); # signal success to the queuerunner
    -    }
    -  EXCUSE: {
    -	my @e;
    -	exists $self->{make} or exists $self->{later} or push @e,
    -	"Make had some problems, maybe interrupted? Won't test";
    -
    -	exists $self->{'make'} and
    -	    $self->{'make'} eq 'NO' and
    -		push @e, "Can't test without successful make";
    -
    -	exists $self->{build_dir} or push @e, "Has no own directory";
    -        $self->{badtestcnt} ||= 0;
    -        $self->{badtestcnt} > 0 and
    -            push @e, "Won't repeat unsuccessful test during this command";
    -
    -        exists $self->{later} and length($self->{later}) and
    -            push @e, $self->{later};
    -
    -	$CPAN::Frontend->myprint(join "", map {"  $_\n"} @e) and return if @e;
    -    }
    -    chdir $self->{'build_dir'} or
    -	Carp::croak("Couldn't chdir to $self->{'build_dir'}");
    -    $self->debug("Changed directory to $self->{'build_dir'}")
    -	if $CPAN::DEBUG;
    -
    -    if ($^O eq 'MacOS') {
    -        ExtUtils::MM_MacOS::make_test($self);
    -        return;
    -    }
    -
    -    my $system = join " ", $CPAN::Config->{'make'}, "test";
    -    if (system($system) == 0) {
    -	 $CPAN::Frontend->myprint("  $system -- OK\n");
    -	 $self->{make_test} = "YES";
    -    } else {
    -	 $self->{make_test} = "NO";
    -         $self->{badtestcnt}++;
    -	 $CPAN::Frontend->myprint("  $system -- NOT OK\n");
    -    }
    -}
    -
    -#-> sub CPAN::Distribution::clean ;
    -sub clean {
    -    my($self) = @_;
    -    $CPAN::Frontend->myprint("Running make clean\n");
    -  EXCUSE: {
    -	my @e;
    -        exists $self->{make_clean} and $self->{make_clean} eq "YES" and
    -            push @e, "make clean already called once";
    -	exists $self->{build_dir} or push @e, "Has no own directory";
    -	$CPAN::Frontend->myprint(join "", map {"  $_\n"} @e) and return if @e;
    -    }
    -    chdir $self->{'build_dir'} or
    -	Carp::croak("Couldn't chdir to $self->{'build_dir'}");
    -    $self->debug("Changed directory to $self->{'build_dir'}") if $CPAN::DEBUG;
    -
    -    if ($^O eq 'MacOS') {
    -        ExtUtils::MM_MacOS::make_clean($self);
    -        return;
    -    }
    -
    -    my $system = join " ", $CPAN::Config->{'make'}, "clean";
    -    if (system($system) == 0) {
    -      $CPAN::Frontend->myprint("  $system -- OK\n");
    -
    -      # $self->force;
    -
    -      # Jost Krieger pointed out that this "force" was wrong because
    -      # it has the effect that the next "install" on this distribution
    -      # will untar everything again. Instead we should bring the
    -      # object's state back to where it is after untarring.
    -
    -      delete $self->{force_update};
    -      delete $self->{install};
    -      delete $self->{writemakefile};
    -      delete $self->{make};
    -      delete $self->{make_test}; # no matter if yes or no, tests must be redone
    -      $self->{make_clean} = "YES";
    -
    -    } else {
    -      # Hmmm, what to do if make clean failed?
    -
    -      $CPAN::Frontend->myprint(qq{  $system -- NOT OK
    -
    -make clean did not succeed, marking directory as unusable for further work.
    -});
    -      $self->force("make"); # so that this directory won't be used again
    -
    -    }
    -}
    -
    -#-> sub CPAN::Distribution::install ;
    -sub install {
    -    my($self) = @_;
    -    $self->test;
    -    if ($CPAN::Signal){
    -      delete $self->{force_update};
    -      return;
    -    }
    -    $CPAN::Frontend->myprint("Running make install\n");
    -  EXCUSE: {
    -	my @e;
    -	exists $self->{build_dir} or push @e, "Has no own directory";
    -
    -	exists $self->{make} or exists $self->{later} or push @e,
    -	"Make had some problems, maybe interrupted? Won't install";
    -
    -	exists $self->{'make'} and
    -	    $self->{'make'} eq 'NO' and
    -		push @e, "make had returned bad status, install seems impossible";
    -
    -	push @e, "make test had returned bad status, ".
    -	    "won't install without force"
    -	    if exists $self->{'make_test'} and
    -	    $self->{'make_test'} eq 'NO' and
    -	    ! $self->{'force_update'};
    -
    -	exists $self->{'install'} and push @e,
    -	$self->{'install'} eq "YES" ?
    -	    "Already done" : "Already tried without success";
    -
    -        exists $self->{later} and length($self->{later}) and
    -            push @e, $self->{later};
    -
    -	$CPAN::Frontend->myprint(join "", map {"  $_\n"} @e) and return if @e;
    -    }
    -    chdir $self->{'build_dir'} or
    -	Carp::croak("Couldn't chdir to $self->{'build_dir'}");
    -    $self->debug("Changed directory to $self->{'build_dir'}")
    -	if $CPAN::DEBUG;
    -
    -    if ($^O eq 'MacOS') {
    -        ExtUtils::MM_MacOS::make_install($self);
    -        return;
    -    }
    -
    -    my $system = join(" ", $CPAN::Config->{'make'},
    -		      "install", $CPAN::Config->{make_install_arg});
    -    my($stderr) = $^O =~ /Win/i ? "" : " 2>&1 ";
    -    my($pipe) = FileHandle->new("$system $stderr |");
    -    my($makeout) = "";
    -    while (<$pipe>){
    -	$CPAN::Frontend->myprint($_);
    -	$makeout .= $_;
    -    }
    -    $pipe->close;
    -    if ($?==0) {
    -	 $CPAN::Frontend->myprint("  $system -- OK\n");
    -	 return $self->{'install'} = "YES";
    -    } else {
    -	 $self->{'install'} = "NO";
    -	 $CPAN::Frontend->myprint("  $system -- NOT OK\n");
    -	 if ($makeout =~ /permission/s && $> > 0) {
    -	     $CPAN::Frontend->myprint(qq{    You may have to su }.
    -				      qq{to root to install the package\n});
    -	 }
    -    }
    -    delete $self->{force_update};
    -}
    -
    -#-> sub CPAN::Distribution::dir ;
    -sub dir {
    -    shift->{'build_dir'};
    -}
    -
    -package CPAN::Bundle;
    -
    -sub undelay {
    -    my $self = shift;
    -    delete $self->{later};
    -    for my $c ( $self->contains ) {
    -        my $obj = CPAN::Shell->expandany($c) or next;
    -        $obj->undelay;
    -    }
    -}
    -
    -#-> sub CPAN::Bundle::color_cmd_tmps ;
    -sub color_cmd_tmps {
    -    my($self) = shift;
    -    my($depth) = shift || 0;
    -    my($color) = shift || 0;
    -    # a module needs to recurse to its cpan_file, a distribution needs
    -    # to recurse into its prereq_pms, a bundle needs to recurse into its modules
    -
    -    return if exists $self->{incommandcolor}
    -        && $self->{incommandcolor}==$color;
    -    $CPAN::Frontend->mydie(sprintf("CPAN.pm panic: deep recursion in ".
    -                                   "color_cmd_tmps depth[%s] self[%s] id[%s]",
    -                                   $depth,
    -                                   $self,
    -                                   $self->id
    -                                  )) if $depth>=100;
    -    ##### warn "color_cmd_tmps $depth $color " . $self->id; # sleep 1;
    -
    -    for my $c ( $self->contains ) {
    -        my $obj = CPAN::Shell->expandany($c) or next;
    -        CPAN->debug("c[$c]obj[$obj]") if $CPAN::DEBUG;
    -        $obj->color_cmd_tmps($depth+1,$color);
    -    }
    -    if ($color==0) {
    -        delete $self->{badtestcnt};
    -    }
    -    $self->{incommandcolor} = $color;
    -}
    -
    -#-> sub CPAN::Bundle::as_string ;
    -sub as_string {
    -    my($self) = @_;
    -    $self->contains;
    -    # following line must be "=", not "||=" because we have a moving target
    -    $self->{INST_VERSION} = $self->inst_version;
    -    return $self->SUPER::as_string;
    -}
    -
    -#-> sub CPAN::Bundle::contains ;
    -sub contains {
    -    my($self) = @_;
    -    my($inst_file) = $self->inst_file || "";
    -    my($id) = $self->id;
    -    $self->debug("inst_file[$inst_file]id[$id]") if $CPAN::DEBUG;
    -    unless ($inst_file) {
    -        # Try to get at it in the cpan directory
    -        $self->debug("no inst_file") if $CPAN::DEBUG;
    -        my $cpan_file;
    -        $CPAN::Frontend->mydie("I don't know a bundle with ID $id\n") unless
    -              $cpan_file = $self->cpan_file;
    -        if ($cpan_file eq "N/A") {
    -            $CPAN::Frontend->mydie("Bundle $id not found on disk and not on CPAN.
    -  Maybe stale symlink? Maybe removed during session? Giving up.\n");
    -        }
    -        my $dist = $CPAN::META->instance('CPAN::Distribution',
    -                                         $self->cpan_file);
    -        $dist->get;
    -        $self->debug($dist->as_string) if $CPAN::DEBUG;
    -        my($todir) = $CPAN::Config->{'cpan_home'};
    -        my(@me,$from,$to,$me);
    -        @me = split /::/, $self->id;
    -        $me[-1] .= ".pm";
    -        $me = MM->catfile(@me);
    -        $from = $self->find_bundle_file($dist->{'build_dir'},$me);
    -        $to = MM->catfile($todir,$me);
    -        File::Path::mkpath(File::Basename::dirname($to));
    -        File::Copy::copy($from, $to)
    -              or Carp::confess("Couldn't copy $from to $to: $!");
    -        $inst_file = $to;
    -    }
    -    my @result;
    -    my $fh = FileHandle->new;
    -    local $/ = "\n";
    -    open($fh,$inst_file) or die "Could not open '$inst_file': $!";
    -    my $in_cont = 0;
    -    $self->debug("inst_file[$inst_file]") if $CPAN::DEBUG;
    -    while (<$fh>) {
    -        $in_cont = m/^=(?!head1\s+CONTENTS)/ ? 0 :
    -            m/^=head1\s+CONTENTS/ ? 1 : $in_cont;
    -        next unless $in_cont;
    -        next if /^=/;
    -        s/\#.*//;
    -        next if /^\s+$/;
    -        chomp;
    -        push @result, (split " ", $_, 2)[0];
    -    }
    -    close $fh;
    -    delete $self->{STATUS};
    -    $self->{CONTAINS} = \@result;
    -    $self->debug("CONTAINS[@result]") if $CPAN::DEBUG;
    -    unless (@result) {
    -        $CPAN::Frontend->mywarn(qq{
    -The bundle file "$inst_file" may be a broken
    -bundlefile. It seems not to contain any bundle definition.
    -Please check the file and if it is bogus, please delete it.
    -Sorry for the inconvenience.
    -});
    -    }
    -    @result;
    -}
    -
    -#-> sub CPAN::Bundle::find_bundle_file
    -sub find_bundle_file {
    -    my($self,$where,$what) = @_;
    -    $self->debug("where[$where]what[$what]") if $CPAN::DEBUG;
    -### The following two lines let CPAN.pm become Bundle/CPAN.pm :-(
    -###    my $bu = MM->catfile($where,$what);
    -###    return $bu if -f $bu;
    -    my $manifest = MM->catfile($where,"MANIFEST");
    -    unless (-f $manifest) {
    -	require ExtUtils::Manifest;
    -	my $cwd = CPAN::anycwd();
    -	chdir $where or $CPAN::Frontend->mydie(qq{Could not chdir to "$where": $!});
    -	ExtUtils::Manifest::mkmanifest();
    -	chdir $cwd or $CPAN::Frontend->mydie(qq{Could not chdir to "$cwd": $!});
    -    }
    -    my $fh = FileHandle->new($manifest)
    -	or Carp::croak("Couldn't open $manifest: $!");
    -    local($/) = "\n";
    -    my $what2 = $what;
    -    if ($^O eq 'MacOS') {
    -      $what =~ s/^://;
    -      $what2 =~ tr|:|/|;
    -      $what2 =~ s/:Bundle://;
    -      $what2 =~ tr|:|/|;
    -    } else {
    -	$what2 =~ s|Bundle[/\\]||;
    -    }
    -    my $bu;
    -    while (<$fh>) {
    -	next if /^\s*\#/;
    -	my($file) = /(\S+)/;
    -	if ($file =~ m|\Q$what\E$|) {
    -	    $bu = $file;
    -	    # return MM->catfile($where,$bu); # bad
    -	    last;
    -	}
    -	# retry if she managed to
    -	# have no Bundle directory
    -	$bu = $file if $file =~ m|\Q$what2\E$|;
    -    }
    -    $bu =~ tr|/|:| if $^O eq 'MacOS';
    -    return MM->catfile($where, $bu) if $bu;
    -    Carp::croak("Couldn't find a Bundle file in $where");
    -}
    -
    -# needs to work quite differently from Module::inst_file because of
    -# cpan_home/Bundle/ directory and the possibility that we have
    -# shadowing effect. As it makes no sense to take the first in @INC for
    -# Bundles, we parse them all for $VERSION and take the newest.
    -
    -#-> sub CPAN::Bundle::inst_file ;
    -sub inst_file {
    -    my($self) = @_;
    -    my($inst_file);
    -    my(@me);
    -    @me = split /::/, $self->id;
    -    $me[-1] .= ".pm";
    -    my($incdir,$bestv);
    -    foreach $incdir ($CPAN::Config->{'cpan_home'},@INC) {
    -        my $bfile = MM->catfile($incdir, @me);
    -        CPAN->debug("bfile[$bfile]") if $CPAN::DEBUG;
    -        next unless -f $bfile;
    -        my $foundv = MM->parse_version($bfile);
    -        if (!$bestv || CPAN::Version->vgt($foundv,$bestv)) {
    -            $self->{INST_FILE} = $bfile;
    -            $self->{INST_VERSION} = $bestv = $foundv;
    -        }
    -    }
    -    $self->{INST_FILE};
    -}
    -
    -#-> sub CPAN::Bundle::inst_version ;
    -sub inst_version {
    -    my($self) = @_;
    -    $self->inst_file; # finds INST_VERSION as side effect
    -    $self->{INST_VERSION};
    -}
    -
    -#-> sub CPAN::Bundle::rematein ;
    -sub rematein {
    -    my($self,$meth) = @_;
    -    $self->debug("self[$self] meth[$meth]") if $CPAN::DEBUG;
    -    my($id) = $self->id;
    -    Carp::croak "Can't $meth $id, don't have an associated bundle file. :-(\n"
    -	unless $self->inst_file || $self->cpan_file;
    -    my($s,%fail);
    -    for $s ($self->contains) {
    -	my($type) = $s =~ m|/| ? 'CPAN::Distribution' :
    -	    $s =~ m|^Bundle::| ? 'CPAN::Bundle' : 'CPAN::Module';
    -	if ($type eq 'CPAN::Distribution') {
    -	    $CPAN::Frontend->mywarn(qq{
    -The Bundle }.$self->id.qq{ contains
    -explicitly a file $s.
    -});
    -	    sleep 3;
    -	}
    -	# possibly noisy action:
    -        $self->debug("type[$type] s[$s]") if $CPAN::DEBUG;
    -	my $obj = $CPAN::META->instance($type,$s);
    -	$obj->$meth();
    -        if ($obj->isa(CPAN::Bundle)
    -            &&
    -            exists $obj->{install_failed}
    -            &&
    -            ref($obj->{install_failed}) eq "HASH"
    -           ) {
    -          for (keys %{$obj->{install_failed}}) {
    -            $self->{install_failed}{$_} = undef; # propagate faiure up
    -                                                 # to me in a
    -                                                 # recursive call
    -            $fail{$s} = 1; # the bundle itself may have succeeded but
    -                           # not all children
    -          }
    -        } else {
    -          my $success;
    -          $success = $obj->can("uptodate") ? $obj->uptodate : 0;
    -          $success ||= $obj->{'install'} && $obj->{'install'} eq "YES";
    -          if ($success) {
    -            delete $self->{install_failed}{$s};
    -          } else {
    -            $fail{$s} = 1;
    -          }
    -        }
    -    }
    -
    -    # recap with less noise
    -    if ( $meth eq "install" ) {
    -	if (%fail) {
    -	    require Text::Wrap;
    -	    my $raw = sprintf(qq{Bundle summary:
    -The following items in bundle %s had installation problems:},
    -			      $self->id
    -			     );
    -	    $CPAN::Frontend->myprint(Text::Wrap::fill("","",$raw));
    -	    $CPAN::Frontend->myprint("\n");
    -	    my $paragraph = "";
    -            my %reported;
    -	    for $s ($self->contains) {
    -              if ($fail{$s}){
    -		$paragraph .= "$s ";
    -                $self->{install_failed}{$s} = undef;
    -                $reported{$s} = undef;
    -              }
    -	    }
    -            my $report_propagated;
    -            for $s (sort keys %{$self->{install_failed}}) {
    -              next if exists $reported{$s};
    -              $paragraph .= "and the following items had problems
    -during recursive bundle calls: " unless $report_propagated++;
    -              $paragraph .= "$s ";
    -            }
    -	    $CPAN::Frontend->myprint(Text::Wrap::fill("  ","  ",$paragraph));
    -	    $CPAN::Frontend->myprint("\n");
    -	} else {
    -	    $self->{'install'} = 'YES';
    -	}
    -    }
    -}
    -
    -#sub CPAN::Bundle::xs_file
    -sub xs_file {
    -    # If a bundle contains another that contains an xs_file we have
    -    # here, we just don't bother I suppose
    -    return 0;
    -}
    -
    -#-> sub CPAN::Bundle::force ;
    -sub force   { shift->rematein('force',@_); }
    -#-> sub CPAN::Bundle::get ;
    -sub get     { shift->rematein('get',@_); }
    -#-> sub CPAN::Bundle::make ;
    -sub make    { shift->rematein('make',@_); }
    -#-> sub CPAN::Bundle::test ;
    -sub test    {
    -    my $self = shift;
    -    $self->{badtestcnt} ||= 0;
    -    $self->rematein('test',@_);
    -}
    -#-> sub CPAN::Bundle::install ;
    -sub install {
    -  my $self = shift;
    -  $self->rematein('install',@_);
    -}
    -#-> sub CPAN::Bundle::clean ;
    -sub clean   { shift->rematein('clean',@_); }
    -
    -#-> sub CPAN::Bundle::uptodate ;
    -sub uptodate {
    -    my($self) = @_;
    -    return 0 unless $self->SUPER::uptodate; # we mut have the current Bundle def
    -    my $c;
    -    foreach $c ($self->contains) {
    -        my $obj = CPAN::Shell->expandany($c);
    -        return 0 unless $obj->uptodate;
    -    }
    -    return 1;
    -}
    -
    -#-> sub CPAN::Bundle::readme ;
    -sub readme  {
    -    my($self) = @_;
    -    my($file) = $self->cpan_file or $CPAN::Frontend->myprint(qq{
    -No File found for bundle } . $self->id . qq{\n}), return;
    -    $self->debug("self[$self] file[$file]") if $CPAN::DEBUG;
    -    $CPAN::META->instance('CPAN::Distribution',$file)->readme;
    -}
    -
    -package CPAN::Module;
    -
    -# Accessors
    -# sub cpan_userid { shift->{RO}{CPAN_USERID} }
    -sub userid {
    -    my $self = shift;
    -    return unless exists $self->{RO}; # should never happen
    -    return $self->{RO}{CPAN_USERID} || $self->{RO}{userid};
    -}
    -sub description { shift->{RO}{description} }
    -
    -sub undelay {
    -    my $self = shift;
    -    delete $self->{later};
    -    if ( my $dist = CPAN::Shell->expand("Distribution", $self->cpan_file) ) {
    -        $dist->undelay;
    -    }
    -}
    -
    -#-> sub CPAN::Module::color_cmd_tmps ;
    -sub color_cmd_tmps {
    -    my($self) = shift;
    -    my($depth) = shift || 0;
    -    my($color) = shift || 0;
    -    # a module needs to recurse to its cpan_file
    -
    -    return if exists $self->{incommandcolor}
    -        && $self->{incommandcolor}==$color;
    -    $CPAN::Frontend->mydie(sprintf("CPAN.pm panic: deep recursion in ".
    -                                   "color_cmd_tmps depth[%s] self[%s] id[%s]",
    -                                   $depth,
    -                                   $self,
    -                                   $self->id
    -                                  )) if $depth>=100;
    -    ##### warn "color_cmd_tmps $depth $color " . $self->id; # sleep 1;
    -
    -    if ( my $dist = CPAN::Shell->expand("Distribution", $self->cpan_file) ) {
    -        $dist->color_cmd_tmps($depth+1,$color);
    -    }
    -    if ($color==0) {
    -        delete $self->{badtestcnt};
    -    }
    -    $self->{incommandcolor} = $color;
    -}
    -
    -#-> sub CPAN::Module::as_glimpse ;
    -sub as_glimpse {
    -    my($self) = @_;
    -    my(@m);
    -    my $class = ref($self);
    -    $class =~ s/^CPAN:://;
    -    my $color_on = "";
    -    my $color_off = "";
    -    if (
    -        $CPAN::Shell::COLOR_REGISTERED
    -        &&
    -        $CPAN::META->has_inst("Term::ANSIColor")
    -        &&
    -        $self->{RO}{description}
    -       ) {
    -        $color_on = Term::ANSIColor::color("green");
    -        $color_off = Term::ANSIColor::color("reset");
    -    }
    -    push @m, sprintf("%-15s %s%-15s%s (%s)\n",
    -                     $class,
    -                     $color_on,
    -                     $self->id,
    -                     $color_off,
    -		     $self->cpan_file);
    -    join "", @m;
    -}
    -
    -#-> sub CPAN::Module::as_string ;
    -sub as_string {
    -    my($self) = @_;
    -    my(@m);
    -    CPAN->debug($self) if $CPAN::DEBUG;
    -    my $class = ref($self);
    -    $class =~ s/^CPAN:://;
    -    local($^W) = 0;
    -    push @m, $class, " id = $self->{ID}\n";
    -    my $sprintf = "    %-12s %s\n";
    -    push @m, sprintf($sprintf, 'DESCRIPTION', $self->description)
    -	if $self->description;
    -    my $sprintf2 = "    %-12s %s (%s)\n";
    -    my($userid);
    -    if ($userid = $self->cpan_userid || $self->userid){
    -	my $author;
    -	if ($author = CPAN::Shell->expand('Author',$userid)) {
    -	  my $email = "";
    -	  my $m; # old perls
    -	  if ($m = $author->email) {
    -            $email = " <$m>";
    -          }
    -	  push @m, sprintf(
    -			   $sprintf2,
    -			   'CPAN_USERID',
    -			   $userid,
    -			   $author->fullname . $email
    -			  );
    -	}
    -    }
    -    push @m, sprintf($sprintf, 'CPAN_VERSION', $self->cpan_version)
    -	if $self->cpan_version;
    -    push @m, sprintf($sprintf, 'CPAN_FILE', $self->cpan_file)
    -	if $self->cpan_file;
    -    my $sprintf3 = "    %-12s %1s%1s%1s%1s (%s,%s,%s,%s)\n";
    -    my(%statd,%stats,%statl,%stati);
    -    @statd{qw,? i c a b R M S,} = qw,unknown idea
    -	pre-alpha alpha beta released mature standard,;
    -    @stats{qw,? m d u n,}       = qw,unknown mailing-list
    -	developer comp.lang.perl.* none,;
    -    @statl{qw,? p c + o h,}       = qw,unknown perl C C++ other hybrid,;
    -    @stati{qw,? f r O h,}         = qw,unknown functions
    -	references+ties object-oriented hybrid,;
    -    $statd{' '} = 'unknown';
    -    $stats{' '} = 'unknown';
    -    $statl{' '} = 'unknown';
    -    $stati{' '} = 'unknown';
    -    push @m, sprintf(
    -		     $sprintf3,
    -		     'DSLI_STATUS',
    -		     $self->{RO}{statd},
    -		     $self->{RO}{stats},
    -		     $self->{RO}{statl},
    -		     $self->{RO}{stati},
    -		     $statd{$self->{RO}{statd}},
    -		     $stats{$self->{RO}{stats}},
    -		     $statl{$self->{RO}{statl}},
    -		     $stati{$self->{RO}{stati}}
    -		    ) if $self->{RO}{statd};
    -    my $local_file = $self->inst_file;
    -    unless ($self->{MANPAGE}) {
    -        if ($local_file) {
    -            $self->{MANPAGE} = $self->manpage_headline($local_file);
    -        } else {
    -            # If we have already untarred it, we should look there
    -            my $dist = $CPAN::META->instance('CPAN::Distribution',
    -                                             $self->cpan_file);
    -            # warn "dist[$dist]";
    -            # mff=manifest file; mfh=manifest handle
    -            my($mff,$mfh);
    -            if (
    -                $dist->{build_dir}
    -                and
    -                (-f  ($mff = MM->catfile($dist->{build_dir}, "MANIFEST")))
    -                and
    -                $mfh = FileHandle->new($mff)
    -               ) {
    -                CPAN->debug("mff[$mff]") if $CPAN::DEBUG;
    -                my $lfre = $self->id; # local file RE
    -                $lfre =~ s/::/./g;
    -                $lfre .= "\\.pm\$";
    -                my($lfl); # local file file
    -                local $/ = "\n";
    -                my(@mflines) = <$mfh>;
    -                for (@mflines) {
    -                    s/^\s+//;
    -                    s/\s.*//s;
    -                }
    -                while (length($lfre)>5 and !$lfl) {
    -                    ($lfl) = grep /$lfre/, @mflines;
    -                    CPAN->debug("lfl[$lfl]lfre[$lfre]") if $CPAN::DEBUG;
    -                    $lfre =~ s/.+?\.//;
    -                }
    -                $lfl =~ s/\s.*//; # remove comments
    -                $lfl =~ s/\s+//g; # chomp would maybe be too system-specific
    -                my $lfl_abs = MM->catfile($dist->{build_dir},$lfl);
    -                # warn "lfl_abs[$lfl_abs]";
    -                if (-f $lfl_abs) {
    -                    $self->{MANPAGE} = $self->manpage_headline($lfl_abs);
    -                }
    -            }
    -        }
    -    }
    -    my($item);
    -    for $item (qw/MANPAGE/) {
    -	push @m, sprintf($sprintf, $item, $self->{$item})
    -	    if exists $self->{$item};
    -    }
    -    for $item (qw/CONTAINS/) {
    -	push @m, sprintf($sprintf, $item, join(" ",@{$self->{$item}}))
    -	    if exists $self->{$item} && @{$self->{$item}};
    -    }
    -    push @m, sprintf($sprintf, 'INST_FILE',
    -		     $local_file || "(not installed)");
    -    push @m, sprintf($sprintf, 'INST_VERSION',
    -		     $self->inst_version) if $local_file;
    -    join "", @m, "\n";
    -}
    -
    -sub manpage_headline {
    -  my($self,$local_file) = @_;
    -  my(@local_file) = $local_file;
    -  $local_file =~ s/\.pm(?!\n)\Z/.pod/;
    -  push @local_file, $local_file;
    -  my(@result,$locf);
    -  for $locf (@local_file) {
    -    next unless -f $locf;
    -    my $fh = FileHandle->new($locf)
    -	or $Carp::Frontend->mydie("Couldn't open $locf: $!");
    -    my $inpod = 0;
    -    local $/ = "\n";
    -    while (<$fh>) {
    -      $inpod = m/^=(?!head1\s+NAME)/ ? 0 :
    -	  m/^=head1\s+NAME/ ? 1 : $inpod;
    -      next unless $inpod;
    -      next if /^=/;
    -      next if /^\s+$/;
    -      chomp;
    -      push @result, $_;
    -    }
    -    close $fh;
    -    last if @result;
    -  }
    -  join " ", @result;
    -}
    -
    -#-> sub CPAN::Module::cpan_file ;
    -# Note: also inherited by CPAN::Bundle
    -sub cpan_file {
    -    my $self = shift;
    -    CPAN->debug(sprintf "id[%s]", $self->id) if $CPAN::DEBUG;
    -    unless (defined $self->{RO}{CPAN_FILE}) {
    -	CPAN::Index->reload;
    -    }
    -    if (exists $self->{RO}{CPAN_FILE} && defined $self->{RO}{CPAN_FILE}){
    -	return $self->{RO}{CPAN_FILE};
    -    } else {
    -        my $userid = $self->userid;
    -        if ( $userid ) {
    -            if ($CPAN::META->exists("CPAN::Author",$userid)) {
    -                my $author = $CPAN::META->instance("CPAN::Author",
    -                                                   $userid);
    -                my $fullname = $author->fullname;
    -                my $email = $author->email;
    -                unless (defined $fullname && defined $email) {
    -                    return sprintf("Contact Author %s",
    -                                   $userid,
    -                                  );
    -                }
    -                return "Contact Author $fullname <$email>";
    -            } else {
    -                return "UserID $userid";
    -            }
    -        } else {
    -            return "N/A";
    -        }
    -    }
    -}
    -
    -#-> sub CPAN::Module::cpan_version ;
    -sub cpan_version {
    -    my $self = shift;
    -
    -    $self->{RO}{CPAN_VERSION} = 'undef'
    -	unless defined $self->{RO}{CPAN_VERSION};
    -    # I believe this is always a bug in the index and should be reported
    -    # as such, but usually I find out such an error and do not want to
    -    # provoke too many bugreports
    -
    -    $self->{RO}{CPAN_VERSION};
    -}
    -
    -#-> sub CPAN::Module::force ;
    -sub force {
    -    my($self) = @_;
    -    $self->{'force_update'}++;
    -}
    -
    -#-> sub CPAN::Module::rematein ;
    -sub rematein {
    -    my($self,$meth) = @_;
    -    $CPAN::Frontend->myprint(sprintf("Running %s for module %s\n",
    -                                     $meth,
    -                                     $self->id));
    -    my $cpan_file = $self->cpan_file;
    -    if ($cpan_file eq "N/A" || $cpan_file =~ /^Contact Author/){
    -      $CPAN::Frontend->mywarn(sprintf qq{
    -  The module %s isn\'t available on CPAN.
    -
    -  Either the module has not yet been uploaded to CPAN, or it is
    -  temporary unavailable. Please contact the author to find out
    -  more about the status. Try 'i %s'.
    -},
    -			      $self->id,
    -			      $self->id,
    -			     );
    -      return;
    -    }
    -    my $pack = $CPAN::META->instance('CPAN::Distribution',$cpan_file);
    -    $pack->called_for($self->id);
    -    $pack->force($meth) if exists $self->{'force_update'};
    -    $pack->$meth();
    -    $pack->unforce if $pack->can("unforce") && exists $self->{'force_update'};
    -    delete $self->{'force_update'};
    -}
    -
    -#-> sub CPAN::Module::readme ;
    -sub readme { shift->rematein('readme') }
    -#-> sub CPAN::Module::look ;
    -sub look { shift->rematein('look') }
    -#-> sub CPAN::Module::cvs_import ;
    -sub cvs_import { shift->rematein('cvs_import') }
    -#-> sub CPAN::Module::get ;
    -sub get    { shift->rematein('get',@_); }
    -#-> sub CPAN::Module::make ;
    -sub make   {
    -    my $self = shift;
    -    $self->rematein('make');
    -}
    -#-> sub CPAN::Module::test ;
    -sub test   {
    -    my $self = shift;
    -    $self->{badtestcnt} ||= 0;
    -    $self->rematein('test',@_);
    -}
    -#-> sub CPAN::Module::uptodate ;
    -sub uptodate {
    -    my($self) = @_;
    -    my($latest) = $self->cpan_version;
    -    $latest ||= 0;
    -    my($inst_file) = $self->inst_file;
    -    my($have) = 0;
    -    if (defined $inst_file) {
    -	$have = $self->inst_version;
    -    }
    -    local($^W)=0;
    -    if ($inst_file
    -	&&
    -	! CPAN::Version->vgt($latest, $have)
    -       ) {
    -        CPAN->debug("returning uptodate. inst_file[$inst_file] ".
    -                    "latest[$latest] have[$have]") if $CPAN::DEBUG;
    -        return 1;
    -    }
    -    return;
    -}
    -#-> sub CPAN::Module::install ;
    -sub install {
    -    my($self) = @_;
    -    my($doit) = 0;
    -    if ($self->uptodate
    -	&&
    -	not exists $self->{'force_update'}
    -       ) {
    -	$CPAN::Frontend->myprint( $self->id. " is up to date.\n");
    -    } else {
    -	$doit = 1;
    -    }
    -    $self->rematein('install') if $doit;
    -}
    -#-> sub CPAN::Module::clean ;
    -sub clean  { shift->rematein('clean') }
    -
    -#-> sub CPAN::Module::inst_file ;
    -sub inst_file {
    -    my($self) = @_;
    -    my($dir,@packpath);
    -    @packpath = split /::/, $self->{ID};
    -    $packpath[-1] .= ".pm";
    -    foreach $dir (@INC) {
    -	my $pmfile = MM->catfile($dir,@packpath);
    -	if (-f $pmfile){
    -	    return $pmfile;
    -	}
    -    }
    -    return;
    -}
    -
    -#-> sub CPAN::Module::xs_file ;
    -sub xs_file {
    -    my($self) = @_;
    -    my($dir,@packpath);
    -    @packpath = split /::/, $self->{ID};
    -    push @packpath, $packpath[-1];
    -    $packpath[-1] .= "." . $Config::Config{'dlext'};
    -    foreach $dir (@INC) {
    -	my $xsfile = MM->catfile($dir,'auto',@packpath);
    -	if (-f $xsfile){
    -	    return $xsfile;
    -	}
    -    }
    -    return;
    -}
    -
    -#-> sub CPAN::Module::inst_version ;
    -sub inst_version {
    -    my($self) = @_;
    -    my $parsefile = $self->inst_file or return;
    -    local($^W) = 0 if $] < 5.00303 && $ExtUtils::MakeMaker::VERSION < 5.38;
    -    my $have;
    -
    -    # there was a bug in 5.6.0 that let lots of unini warnings out of
    -    # parse_version. Fixed shortly after 5.6.0 by PMQS. We can remove
    -    # the following workaround after 5.6.1 is out.
    -    local($SIG{__WARN__}) =  sub { my $w = shift;
    -                                   return if $w =~ /uninitialized/i;
    -                                   warn $w;
    -                                 };
    -
    -    $have = MM->parse_version($parsefile) || "undef";
    -    $have =~ s/^ //; # since the %vd hack these two lines here are needed
    -    $have =~ s/ $//; # trailing whitespace happens all the time
    -
    -    # My thoughts about why %vd processing should happen here
    -
    -    # Alt1 maintain it as string with leading v:
    -    # read index files     do nothing
    -    # compare it           use utility for compare
    -    # print it             do nothing
    -
    -    # Alt2 maintain it as what is is
    -    # read index files     convert
    -    # compare it           use utility because there's still a ">" vs "gt" issue
    -    # print it             use CPAN::Version for print
    -
    -    # Seems cleaner to hold it in memory as a string starting with a "v"
    -
    -    # If the author of this module made a mistake and wrote a quoted
    -    # "v1.13" instead of v1.13, we simply leave it at that with the
    -    # effect that *we* will treat it like a v-tring while the rest of
    -    # perl won't. Seems sensible when we consider that any action we
    -    # could take now would just add complexity.
    -
    -    $have = CPAN::Version->readable($have);
    -
    -    $have =~ s/\s*//g; # stringify to float around floating point issues
    -    $have; # no stringify needed, \s* above matches always
    -}
    -
    -package CPAN::Tarzip;
    -
    -# CPAN::Tarzip::gzip
    -sub gzip {
    -  my($class,$read,$write) = @_;
    -  if ($CPAN::META->has_inst("Compress::Zlib")) {
    -    my($buffer,$fhw);
    -    $fhw = FileHandle->new($read)
    -	or $CPAN::Frontend->mydie("Could not open $read: $!");
    -    my $gz = Compress::Zlib::gzopen($write, "wb")
    -	or $CPAN::Frontend->mydie("Cannot gzopen $write: $!\n");
    -    $gz->gzwrite($buffer)
    -	while read($fhw,$buffer,4096) > 0 ;
    -    $gz->gzclose() ;
    -    $fhw->close;
    -    return 1;
    -  } else {
    -    system("$CPAN::Config->{gzip} -c $read > $write")==0;
    -  }
    -}
    -
    -
    -# CPAN::Tarzip::gunzip
    -sub gunzip {
    -  my($class,$read,$write) = @_;
    -  if ($CPAN::META->has_inst("Compress::Zlib")) {
    -    my($buffer,$fhw);
    -    $fhw = FileHandle->new(">$write")
    -	or $CPAN::Frontend->mydie("Could not open >$write: $!");
    -    my $gz = Compress::Zlib::gzopen($read, "rb")
    -	or $CPAN::Frontend->mydie("Cannot gzopen $read: $!\n");
    -    $fhw->print($buffer)
    -	while $gz->gzread($buffer) > 0 ;
    -    $CPAN::Frontend->mydie("Error reading from $read: $!\n")
    -	if $gz->gzerror != Compress::Zlib::Z_STREAM_END();
    -    $gz->gzclose() ;
    -    $fhw->close;
    -    return 1;
    -  } else {
    -    system("$CPAN::Config->{gzip} -dc $read > $write")==0;
    -  }
    -}
    -
    -
    -# CPAN::Tarzip::gtest
    -sub gtest {
    -  my($class,$read) = @_;
    -  # After I had reread the documentation in zlib.h, I discovered that
    -  # uncompressed files do not lead to an gzerror (anymore?).
    -  if ( $CPAN::META->has_inst("Compress::Zlib") ) {
    -    my($buffer,$len);
    -    $len = 0;
    -    my $gz = Compress::Zlib::gzopen($read, "rb")
    -	or $CPAN::Frontend->mydie(sprintf("Cannot gzopen %s: %s\n",
    -                                          $read,
    -                                          $Compress::Zlib::gzerrno));
    -    while ($gz->gzread($buffer) > 0 ){
    -        $len += length($buffer);
    -        $buffer = "";
    -    }
    -    my $err = $gz->gzerror;
    -    my $success = ! $err || $err == Compress::Zlib::Z_STREAM_END();
    -    if ($len == -s $read){
    -        $success = 0;
    -        CPAN->debug("hit an uncompressed file") if $CPAN::DEBUG;
    -    }
    -    $gz->gzclose();
    -    CPAN->debug("err[$err]success[$success]") if $CPAN::DEBUG;
    -    return $success;
    -  } else {
    -      return system("$CPAN::Config->{gzip} -dt $read")==0;
    -  }
    -}
    -
    -
    -# CPAN::Tarzip::TIEHANDLE
    -sub TIEHANDLE {
    -  my($class,$file) = @_;
    -  my $ret;
    -  $class->debug("file[$file]");
    -  if ($CPAN::META->has_inst("Compress::Zlib")) {
    -    my $gz = Compress::Zlib::gzopen($file,"rb") or
    -	die "Could not gzopen $file";
    -    $ret = bless {GZ => $gz}, $class;
    -  } else {
    -    my $pipe = "$CPAN::Config->{gzip} --decompress --stdout $file |";
    -    my $fh = FileHandle->new($pipe) or die "Could not pipe[$pipe]: $!";
    -    binmode $fh;
    -    $ret = bless {FH => $fh}, $class;
    -  }
    -  $ret;
    -}
    -
    -
    -# CPAN::Tarzip::READLINE
    -sub READLINE {
    -  my($self) = @_;
    -  if (exists $self->{GZ}) {
    -    my $gz = $self->{GZ};
    -    my($line,$bytesread);
    -    $bytesread = $gz->gzreadline($line);
    -    return undef if $bytesread <= 0;
    -    return $line;
    -  } else {
    -    my $fh = $self->{FH};
    -    return scalar <$fh>;
    -  }
    -}
    -
    -
    -# CPAN::Tarzip::READ
    -sub READ {
    -  my($self,$ref,$length,$offset) = @_;
    -  die "read with offset not implemented" if defined $offset;
    -  if (exists $self->{GZ}) {
    -    my $gz = $self->{GZ};
    -    my $byteread = $gz->gzread($$ref,$length);# 30eaf79e8b446ef52464b5422da328a8
    -    return $byteread;
    -  } else {
    -    my $fh = $self->{FH};
    -    return read($fh,$$ref,$length);
    -  }
    -}
    -
    -
    -# CPAN::Tarzip::DESTROY
    -sub DESTROY {
    -    my($self) = @_;
    -    if (exists $self->{GZ}) {
    -        my $gz = $self->{GZ};
    -        $gz->gzclose() if defined $gz; # hard to say if it is allowed
    -                                       # to be undef ever. AK, 2000-09
    -    } else {
    -        my $fh = $self->{FH};
    -        $fh->close if defined $fh;
    -    }
    -    undef $self;
    -}
    -
    -
    -# CPAN::Tarzip::untar
    -sub untar {
    -  my($class,$file) = @_;
    -  my($prefer) = 0;
    -
    -  if (0) { # makes changing order easier
    -  } elsif ($BUGHUNTING){
    -      $prefer=2;
    -  } elsif (MM->maybe_command($CPAN::Config->{gzip})
    -           &&
    -           MM->maybe_command($CPAN::Config->{'tar'})) {
    -      # should be default until Archive::Tar is fixed
    -      $prefer = 1;
    -  } elsif (
    -           $CPAN::META->has_inst("Archive::Tar")
    -           &&
    -           $CPAN::META->has_inst("Compress::Zlib") ) {
    -      $prefer = 2;
    -  } else {
    -    $CPAN::Frontend->mydie(qq{
    -CPAN.pm needs either both external programs tar and gzip installed or
    -both the modules Archive::Tar and Compress::Zlib. Neither prerequisite
    -is available. Can\'t continue.
    -});
    -  }
    -  if ($prefer==1) { # 1 => external gzip+tar
    -    my($system);
    -    my $is_compressed = $class->gtest($file);
    -    if ($is_compressed) {
    -        $system = "$CPAN::Config->{gzip} --decompress --stdout " .
    -            "< $file | $CPAN::Config->{tar} xvf -";
    -    } else {
    -        $system = "$CPAN::Config->{tar} xvf $file";
    -    }
    -    if (system($system) != 0) {
    -        # people find the most curious tar binaries that cannot handle
    -        # pipes
    -        if ($is_compressed) {
    -            (my $ungzf = $file) =~ s/\.gz(?!\n)\Z//;
    -            if (CPAN::Tarzip->gunzip($file, $ungzf)) {
    -                $CPAN::Frontend->myprint(qq{Uncompressed $file successfully\n});
    -            } else {
    -                $CPAN::Frontend->mydie(qq{Couldn\'t uncompress $file\n});
    -            }
    -            $file = $ungzf;
    -        }
    -        $system = "$CPAN::Config->{tar} xvf $file";
    -        $CPAN::Frontend->myprint(qq{Using Tar:$system:\n});
    -        if (system($system)==0) {
    -            $CPAN::Frontend->myprint(qq{Untarred $file successfully\n});
    -        } else {
    -            $CPAN::Frontend->mydie(qq{Couldn\'t untar $file\n});
    -        }
    -        return 1;
    -    } else {
    -        return 1;
    -    }
    -  } elsif ($prefer==2) { # 2 => modules
    -    my $tar = Archive::Tar->new($file,1);
    -    my $af; # archive file
    -    my @af;
    -    if ($BUGHUNTING) {
    -        # RCS 1.337 had this code, it turned out unacceptable slow but
    -        # it revealed a bug in Archive::Tar. Code is only here to hunt
    -        # the bug again. It should never be enabled in published code.
    -        # GDGraph3d-0.53 was an interesting case according to Larry
    -        # Virden.
    -        warn(">>>Bughunting code enabled<<< " x 20);
    -        for $af ($tar->list_files) {
    -            if ($af =~ m!^(/|\.\./)!) {
    -                $CPAN::Frontend->mydie("ALERT: Archive contains ".
    -                                       "illegal member [$af]");
    -            }
    -            $CPAN::Frontend->myprint("$af\n");
    -            $tar->extract($af); # slow but effective for finding the bug
    -            return if $CPAN::Signal;
    -        }
    -    } else {
    -        for $af ($tar->list_files) {
    -            if ($af =~ m!^(/|\.\./)!) {
    -                $CPAN::Frontend->mydie("ALERT: Archive contains ".
    -                                       "illegal member [$af]");
    -            }
    -            $CPAN::Frontend->myprint("$af\n");
    -            push @af, $af;
    -            return if $CPAN::Signal;
    -        }
    -        $tar->extract(@af);
    -    }
    -
    -    ExtUtils::MM_MacOS::convert_files([$tar->list_files], 1)
    -        if ($^O eq 'MacOS');
    -
    -    return 1;
    -  }
    -}
    -
    -sub unzip {
    -    my($class,$file) = @_;
    -    if ($CPAN::META->has_inst("Archive::Zip")) {
    -        # blueprint of the code from Archive::Zip::Tree::extractTree();
    -        my $zip = Archive::Zip->new();
    -        my $status;
    -        $status = $zip->read($file);
    -        die "Read of file[$file] failed\n" if $status != Archive::Zip::AZ_OK();
    -        $CPAN::META->debug("Successfully read file[$file]") if $CPAN::DEBUG;
    -        my @members = $zip->members();
    -        for my $member ( @members ) {
    -            my $af = $member->fileName();
    -            if ($af =~ m!^(/|\.\./)!) {
    -                $CPAN::Frontend->mydie("ALERT: Archive contains ".
    -                                       "illegal member [$af]");
    -            }
    -            my $status = $member->extractToFileNamed( $af );
    -            $CPAN::META->debug("af[$af]status[$status]") if $CPAN::DEBUG;
    -            die "Extracting of file[$af] from zipfile[$file] failed\n" if
    -                $status != Archive::Zip::AZ_OK();
    -            return if $CPAN::Signal;
    -        }
    -        return 1;
    -    } else {
    -        my $unzip = $CPAN::Config->{unzip} or
    -            $CPAN::Frontend->mydie("Cannot unzip, no unzip program available");
    -        my @system = ($unzip, $file);
    -        return system(@system) == 0;
    -    }
    -}
    -
    -
    -package CPAN::Version;
    -# CPAN::Version::vcmp courtesy Jost Krieger
    -sub vcmp {
    -  my($self,$l,$r) = @_;
    -  local($^W) = 0;
    -  CPAN->debug("l[$l] r[$r]") if $CPAN::DEBUG;
    -
    -  return 0 if $l eq $r; # short circuit for quicker success
    -
    -  if ($l=~/^v/ <=> $r=~/^v/) {
    -      for ($l,$r) {
    -          next if /^v/;
    -          $_ = $self->float2vv($_);
    -      }
    -  }
    -
    -  return
    -      ($l ne "undef") <=> ($r ne "undef") ||
    -          ($] >= 5.006 &&
    -           $l =~ /^v/ &&
    -           $r =~ /^v/ &&
    -           $self->vstring($l) cmp $self->vstring($r)) ||
    -               $l <=> $r ||
    -                   $l cmp $r;
    -}
    -
    -sub vgt {
    -  my($self,$l,$r) = @_;
    -  $self->vcmp($l,$r) > 0;
    -}
    -
    -sub vstring {
    -  my($self,$n) = @_;
    -  $n =~ s/^v// or die "CPAN::Version::vstring() called with invalid arg [$n]";
    -  pack "U*", split /\./, $n;
    -}
    -
    -# vv => visible vstring
    -sub float2vv {
    -    my($self,$n) = @_;
    -    my($rev) = int($n);
    -    $rev ||= 0;
    -    my($mantissa) = $n =~ /\.(\d{1,12})/; # limit to 12 digits to limit
    -                                          # architecture influence
    -    $mantissa ||= 0;
    -    $mantissa .= "0" while length($mantissa)%3;
    -    my $ret = "v" . $rev;
    -    while ($mantissa) {
    -        $mantissa =~ s/(\d{1,3})// or
    -            die "Panic: length>0 but not a digit? mantissa[$mantissa]";
    -        $ret .= ".".int($1);
    -    }
    -    # warn "n[$n]ret[$ret]";
    -    $ret;
    -}
    -
    -sub readable {
    -  my($self,$n) = @_;
    -  $n =~ /^([\w\-\+\.]+)/;
    -
    -  return $1 if defined $1 && length($1)>0;
    -  # if the first user reaches version v43, he will be treated as "+".
    -  # We'll have to decide about a new rule here then, depending on what
    -  # will be the prevailing versioning behavior then.
    -
    -  if ($] < 5.006) { # or whenever v-strings were introduced
    -    # we get them wrong anyway, whatever we do, because 5.005 will
    -    # have already interpreted 0.2.4 to be "0.24". So even if he
    -    # indexer sends us something like "v0.2.4" we compare wrongly.
    -
    -    # And if they say v1.2, then the old perl takes it as "v12"
    -
    -    $CPAN::Frontend->mywarn("Suspicious version string seen [$n]");
    -    return $n;
    -  }
    -  my $better = sprintf "v%vd", $n;
    -  CPAN->debug("n[$n] better[$better]") if $CPAN::DEBUG;
    -  return $better;
    -}
    -
    -package CPAN;
    -
    -1;
    -
    -__END__
    -
    -=head1 NAME
    -
    -CPAN - query, download and build perl modules from CPAN sites
    -
    -=head1 SYNOPSIS
    -
    -Interactive mode:
    -
    -  perl -MCPAN -e shell;
    -
    -Batch mode:
    -
    -  use CPAN;
    -
    -  autobundle, clean, install, make, recompile, test
    -
    -=head1 DESCRIPTION
    -
    -The CPAN module is designed to automate the make and install of perl
    -modules and extensions. It includes some searching capabilities and
    -knows how to use Net::FTP or LWP (or lynx or an external ftp client)
    -to fetch the raw data from the net.
    -
    -Modules are fetched from one or more of the mirrored CPAN
    -(Comprehensive Perl Archive Network) sites and unpacked in a dedicated
    -directory.
    -
    -The CPAN module also supports the concept of named and versioned
    -I of modules. Bundles simplify the handling of sets of
    -related modules. See Bundles below.
    -
    -The package contains a session manager and a cache manager. There is
    -no status retained between sessions. The session manager keeps track
    -of what has been fetched, built and installed in the current
    -session. The cache manager keeps track of the disk space occupied by
    -the make processes and deletes excess space according to a simple FIFO
    -mechanism.
    -
    -For extended searching capabilities there's a plugin for CPAN available,
    -L|CPAN::WAIT>. C is a full-text search engine
    -that indexes all documents available in CPAN authors directories. If
    -C is installed on your system, the interactive shell of
    -CPAN.pm will enable the C, C, C, C, and C commands
    -which send queries to the WAIT server that has been configured for your
    -installation.
    -
    -All other methods provided are accessible in a programmer style and in an
    -interactive shell style.
    -
    -=head2 Interactive Mode
    -
    -The interactive mode is entered by running
    -
    -    perl -MCPAN -e shell
    -
    -which puts you into a readline interface. You will have the most fun if
    -you install Term::ReadKey and Term::ReadLine to enjoy both history and
    -command completion.
    -
    -Once you are on the command line, type 'h' and the rest should be
    -self-explanatory.
    -
    -The function call C takes two optional arguments, one is the
    -prompt, the second is the default initial command line (the latter
    -only works if a real ReadLine interface module is installed).
    -
    -The most common uses of the interactive modes are
    -
    -=over 2
    -
    -=item Searching for authors, bundles, distribution files and modules
    -
    -There are corresponding one-letter commands C, C, C, and C
    -for each of the four categories and another, C for any of the
    -mentioned four. Each of the four entities is implemented as a class
    -with slightly differing methods for displaying an object.
    -
    -Arguments you pass to these commands are either strings exactly matching
    -the identification string of an object or regular expressions that are
    -then matched case-insensitively against various attributes of the
    -objects. The parser recognizes a regular expression only if you
    -enclose it between two slashes.
    -
    -The principle is that the number of found objects influences how an
    -item is displayed. If the search finds one item, the result is
    -displayed with the rather verbose method C, but if we find
    -more than one, we display each object with the terse method
    -.
    -
    -=item make, test, install, clean  modules or distributions
    -
    -These commands take any number of arguments and investigate what is
    -necessary to perform the action. If the argument is a distribution
    -file name (recognized by embedded slashes), it is processed. If it is
    -a module, CPAN determines the distribution file in which this module
    -is included and processes that, following any dependencies named in
    -the module's Makefile.PL (this behavior is controlled by
    -I.)
    -
    -Any C or C are run unconditionally. An
    -
    -  install 
    -
    -also is run unconditionally. But for
    -
    -  install 
    -
    -CPAN checks if an install is actually needed for it and prints
    -I in the case that the distribution file containing
    -the module doesn't need to be updated.
    -
    -CPAN also keeps track of what it has done within the current session
    -and doesn't try to build a package a second time regardless if it
    -succeeded or not. The C command takes as a first argument the
    -method to invoke (currently: C, C, or C) and executes the
    -command from scratch.
    -
    -Example:
    -
    -    cpan> install OpenGL
    -    OpenGL is up to date.
    -    cpan> force install OpenGL
    -    Running make
    -    OpenGL-0.4/
    -    OpenGL-0.4/COPYRIGHT
    -    [...]
    -
    -A C command results in a
    -
    -  make clean
    -
    -being executed within the distribution file's working directory.
    -
    -=item get, readme, look module or distribution
    -
    -C downloads a distribution file without further action. C
    -displays the README file of the associated distribution. C gets
    -and untars (if not yet done) the distribution file, changes to the
    -appropriate directory and opens a subshell process in that directory.
    -
    -=item ls author
    -
    -C lists all distribution files in and below an author's CPAN
    -directory. Only those files that contain modules are listed and if
    -there is more than one for any given module, only the most recent one
    -is listed.
    -
    -=item Signals
    -
    -CPAN.pm installs signal handlers for SIGINT and SIGTERM. While you are
    -in the cpan-shell it is intended that you can press C<^C> anytime and
    -return to the cpan-shell prompt. A SIGTERM will cause the cpan-shell
    -to clean up and leave the shell loop. You can emulate the effect of a
    -SIGTERM by sending two consecutive SIGINTs, which usually means by
    -pressing C<^C> twice.
    -
    -CPAN.pm ignores a SIGPIPE. If the user sets inactivity_timeout, a
    -SIGALRM is used during the run of the C subprocess.
    -
    -=back
    -
    -=head2 CPAN::Shell
    -
    -The commands that are available in the shell interface are methods in
    -the package CPAN::Shell. If you enter the shell command, all your
    -input is split by the Text::ParseWords::shellwords() routine which
    -acts like most shells do. The first word is being interpreted as the
    -method to be called and the rest of the words are treated as arguments
    -to this method. Continuation lines are supported if a line ends with a
    -literal backslash.
    -
    -=head2 autobundle
    -
    -C writes a bundle file into the
    -C<$CPAN::Config-E{cpan_home}/Bundle> directory. The file contains
    -a list of all modules that are both available from CPAN and currently
    -installed within @INC. The name of the bundle file is based on the
    -current date and a counter.
    -
    -=head2 recompile
    -
    -recompile() is a very special command in that it takes no argument and
    -runs the make/test/install cycle with brute force over all installed
    -dynamically loadable extensions (aka XS modules) with 'force' in
    -effect. The primary purpose of this command is to finish a network
    -installation. Imagine, you have a common source tree for two different
    -architectures. You decide to do a completely independent fresh
    -installation. You start on one architecture with the help of a Bundle
    -file produced earlier. CPAN installs the whole Bundle for you, but
    -when you try to repeat the job on the second architecture, CPAN
    -responds with a C<"Foo up to date"> message for all modules. So you
    -invoke CPAN's recompile on the second architecture and you're done.
    -
    -Another popular use for C is to act as a rescue in case your
    -perl breaks binary compatibility. If one of the modules that CPAN uses
    -is in turn depending on binary compatibility (so you cannot run CPAN
    -commands), then you should try the CPAN::Nox module for recovery.
    -
    -=head2 The four C Classes: Author, Bundle, Module, Distribution
    -
    -Although it may be considered internal, the class hierarchy does matter
    -for both users and programmer. CPAN.pm deals with above mentioned four
    -classes, and all those classes share a set of methods. A classical
    -single polymorphism is in effect. A metaclass object registers all
    -objects of all kinds and indexes them with a string. The strings
    -referencing objects have a separated namespace (well, not completely
    -separated):
    -
    -         Namespace                         Class
    -
    -   words containing a "/" (slash)      Distribution
    -    words starting with Bundle::          Bundle
    -          everything else            Module or Author
    -
    -Modules know their associated Distribution objects. They always refer
    -to the most recent official release. Developers may mark their releases
    -as unstable development versions (by inserting an underbar into the
    -visible version number), so the really hottest and newest distribution
    -file is not always the default.  If a module Foo circulates on CPAN in
    -both version 1.23 and 1.23_90, CPAN.pm offers a convenient way to
    -install version 1.23 by saying
    -
    -    install Foo
    -
    -This would install the complete distribution file (say
    -BAR/Foo-1.23.tar.gz) with all accompanying material. But if you would
    -like to install version 1.23_90, you need to know where the
    -distribution file resides on CPAN relative to the authors/id/
    -directory. If the author is BAR, this might be BAR/Foo-1.23_90.tar.gz;
    -so you would have to say
    -
    -    install BAR/Foo-1.23_90.tar.gz
    -
    -The first example will be driven by an object of the class
    -CPAN::Module, the second by an object of class CPAN::Distribution.
    -
    -=head2 Programmer's interface
    -
    -If you do not enter the shell, the available shell commands are both
    -available as methods (Cinstall(...)>) and as
    -functions in the calling package (C).
    -
    -There's currently only one class that has a stable interface -
    -CPAN::Shell. All commands that are available in the CPAN shell are
    -methods of the class CPAN::Shell. Each of the commands that produce
    -listings of modules (C, C, C) also return a list of
    -the IDs of all modules within the list.
    -
    -=over 2
    -
    -=item expand($type,@things)
    -
    -The IDs of all objects available within a program are strings that can
    -be expanded to the corresponding real objects with the
    -Cexpand("Module",@things)> method. Expand returns a
    -list of CPAN::Module objects according to the C<@things> arguments
    -given. In scalar context it only returns the first element of the
    -list.
    -
    -=item expandany(@things)
    -
    -Like expand, but returns objects of the appropriate type, i.e.
    -CPAN::Bundle objects for bundles, CPAN::Module objects for modules and
    -CPAN::Distribution objects fro distributions.
    -
    -=item Programming Examples
    -
    -This enables the programmer to do operations that combine
    -functionalities that are available in the shell.
    -
    -    # install everything that is outdated on my disk:
    -    perl -MCPAN -e 'CPAN::Shell->install(CPAN::Shell->r)'
    -
    -    # install my favorite programs if necessary:
    -    for $mod (qw(Net::FTP MD5 Data::Dumper)){
    -        my $obj = CPAN::Shell->expand('Module',$mod);
    -        $obj->install;
    -    }
    -
    -    # list all modules on my disk that have no VERSION number
    -    for $mod (CPAN::Shell->expand("Module","/./")){
    -	next unless $mod->inst_file;
    -        # MakeMaker convention for undefined $VERSION:
    -	next unless $mod->inst_version eq "undef";
    -	print "No VERSION in ", $mod->id, "\n";
    -    }
    -
    -    # find out which distribution on CPAN contains a module:
    -    print CPAN::Shell->expand("Module","Apache::Constants")->cpan_file
    -
    -Or if you want to write a cronjob to watch The CPAN, you could list
    -all modules that need updating. First a quick and dirty way:
    -
    -    perl -e 'use CPAN; CPAN::Shell->r;'
    -
    -If you don't want to get any output in the case that all modules are
    -up to date, you can parse the output of above command for the regular
    -expression //modules are up to date// and decide to mail the output
    -only if it doesn't match. Ick?
    -
    -If you prefer to do it more in a programmer style in one single
    -process, maybe something like this suits you better:
    -
    -  # list all modules on my disk that have newer versions on CPAN
    -  for $mod (CPAN::Shell->expand("Module","/./")){
    -    next unless $mod->inst_file;
    -    next if $mod->uptodate;
    -    printf "Module %s is installed as %s, could be updated to %s from CPAN\n",
    -        $mod->id, $mod->inst_version, $mod->cpan_version;
    -  }
    -
    -If that gives you too much output every day, you maybe only want to
    -watch for three modules. You can write
    -
    -  for $mod (CPAN::Shell->expand("Module","/Apache|LWP|CGI/")){
    -
    -as the first line instead. Or you can combine some of the above
    -tricks:
    -
    -  # watch only for a new mod_perl module
    -  $mod = CPAN::Shell->expand("Module","mod_perl");
    -  exit if $mod->uptodate;
    -  # new mod_perl arrived, let me know all update recommendations
    -  CPAN::Shell->r;
    -
    -=back
    -
    -=head2 Methods in the other Classes
    -
    -The programming interface for the classes CPAN::Module,
    -CPAN::Distribution, CPAN::Bundle, and CPAN::Author is still considered
    -beta and partially even alpha. In the following paragraphs only those
    -methods are documented that have proven useful over a longer time and
    -thus are unlikely to change.
    -
    -=over
    -
    -=item CPAN::Author::as_glimpse()
    -
    -Returns a one-line description of the author
    -
    -=item CPAN::Author::as_string()
    -
    -Returns a multi-line description of the author
    -
    -=item CPAN::Author::email()
    -
    -Returns the author's email address
    -
    -=item CPAN::Author::fullname()
    -
    -Returns the author's name
    -
    -=item CPAN::Author::name()
    -
    -An alias for fullname
    -
    -=item CPAN::Bundle::as_glimpse()
    -
    -Returns a one-line description of the bundle
    -
    -=item CPAN::Bundle::as_string()
    -
    -Returns a multi-line description of the bundle
    -
    -=item CPAN::Bundle::clean()
    -
    -Recursively runs the C method on all items contained in the bundle.
    -
    -=item CPAN::Bundle::contains()
    -
    -Returns a list of objects' IDs contained in a bundle. The associated
    -objects may be bundles, modules or distributions.
    -
    -=item CPAN::Bundle::force($method,@args)
    -
    -Forces CPAN to perform a task that normally would have failed. Force
    -takes as arguments a method name to be called and any number of
    -additional arguments that should be passed to the called method. The
    -internals of the object get the needed changes so that CPAN.pm does
    -not refuse to take the action. The C is passed recursively to
    -all contained objects.
    -
    -=item CPAN::Bundle::get()
    -
    -Recursively runs the C method on all items contained in the bundle
    -
    -=item CPAN::Bundle::inst_file()
    -
    -Returns the highest installed version of the bundle in either @INC or
    -C<$CPAN::Config->{cpan_home}>. Note that this is different from
    -CPAN::Module::inst_file.
    -
    -=item CPAN::Bundle::inst_version()
    -
    -Like CPAN::Bundle::inst_file, but returns the $VERSION
    -
    -=item CPAN::Bundle::uptodate()
    -
    -Returns 1 if the bundle itself and all its members are uptodate.
    -
    -=item CPAN::Bundle::install()
    -
    -Recursively runs the C method on all items contained in the bundle
    -
    -=item CPAN::Bundle::make()
    -
    -Recursively runs the C method on all items contained in the bundle
    -
    -=item CPAN::Bundle::readme()
    -
    -Recursively runs the C method on all items contained in the bundle
    -
    -=item CPAN::Bundle::test()
    -
    -Recursively runs the C method on all items contained in the bundle
    -
    -=item CPAN::Distribution::as_glimpse()
    -
    -Returns a one-line description of the distribution
    -
    -=item CPAN::Distribution::as_string()
    -
    -Returns a multi-line description of the distribution
    -
    -=item CPAN::Distribution::clean()
    -
    -Changes to the directory where the distribution has been unpacked and
    -runs C there.
    -
    -=item CPAN::Distribution::containsmods()
    -
    -Returns a list of IDs of modules contained in a distribution file.
    -Only works for distributions listed in the 02packages.details.txt.gz
    -file. This typically means that only the most recent version of a
    -distribution is covered.
    -
    -=item CPAN::Distribution::cvs_import()
    -
    -Changes to the directory where the distribution has been unpacked and
    -runs something like
    -
    -    cvs -d $cvs_root import -m $cvs_log $cvs_dir $userid v$version
    -
    -there.
    -
    -=item CPAN::Distribution::dir()
    -
    -Returns the directory into which this distribution has been unpacked.
    -
    -=item CPAN::Distribution::force($method,@args)
    -
    -Forces CPAN to perform a task that normally would have failed. Force
    -takes as arguments a method name to be called and any number of
    -additional arguments that should be passed to the called method. The
    -internals of the object get the needed changes so that CPAN.pm does
    -not refuse to take the action.
    -
    -=item CPAN::Distribution::get()
    -
    -Downloads the distribution from CPAN and unpacks it. Does nothing if
    -the distribution has already been downloaded and unpacked within the
    -current session.
    -
    -=item CPAN::Distribution::install()
    -
    -Changes to the directory where the distribution has been unpacked and
    -runs the external command C there. If C has not
    -yet been run, it will be run first. A C will be issued in
    -any case and if this fails, the install will be cancelled. The
    -cancellation can be avoided by letting C run the C for
    -you.
    -
    -=item CPAN::Distribution::isa_perl()
    -
    -Returns 1 if this distribution file seems to be a perl distribution.
    -Normally this is derived from the file name only, but the index from
    -CPAN can contain a hint to achieve a return value of true for other
    -filenames too.
    -
    -=item CPAN::Distribution::look()
    -
    -Changes to the directory where the distribution has been unpacked and
    -opens a subshell there. Exiting the subshell returns.
    -
    -=item CPAN::Distribution::make()
    -
    -First runs the C method to make sure the distribution is
    -downloaded and unpacked. Changes to the directory where the
    -distribution has been unpacked and runs the external commands C and C there.
    -
    -=item CPAN::Distribution::prereq_pm()
    -
    -Returns the hash reference that has been announced by a distribution
    -as the PREREQ_PM hash in the Makefile.PL. Note: works only after an
    -attempt has been made to C the distribution. Returns undef
    -otherwise.
    -
    -=item CPAN::Distribution::readme()
    -
    -Downloads the README file associated with a distribution and runs it
    -through the pager specified in C<$CPAN::Config->{pager}>.
    -
    -=item CPAN::Distribution::test()
    -
    -Changes to the directory where the distribution has been unpacked and
    -runs C there.
    -
    -=item CPAN::Distribution::uptodate()
    -
    -Returns 1 if all the modules contained in the distribution are
    -uptodate. Relies on containsmods.
    -
    -=item CPAN::Index::force_reload()
    -
    -Forces a reload of all indices.
    -
    -=item CPAN::Index::reload()
    -
    -Reloads all indices if they have been read more than
    -C<$CPAN::Config->{index_expire}> days.
    -
    -=item CPAN::InfoObj::dump()
    -
    -CPAN::Author, CPAN::Bundle, CPAN::Module, and CPAN::Distribution
    -inherit this method. It prints the data structure associated with an
    -object. Useful for debugging. Note: the data structure is considered
    -internal and thus subject to change without notice.
    -
    -=item CPAN::Module::as_glimpse()
    -
    -Returns a one-line description of the module
    -
    -=item CPAN::Module::as_string()
    -
    -Returns a multi-line description of the module
    -
    -=item CPAN::Module::clean()
    -
    -Runs a clean on the distribution associated with this module.
    -
    -=item CPAN::Module::cpan_file()
    -
    -Returns the filename on CPAN that is associated with the module.
    -
    -=item CPAN::Module::cpan_version()
    -
    -Returns the latest version of this module available on CPAN.
    -
    -=item CPAN::Module::cvs_import()
    -
    -Runs a cvs_import on the distribution associated with this module.
    -
    -=item CPAN::Module::description()
    -
    -Returns a 44 chracter description of this module. Only available for
    -modules listed in The Module List (CPAN/modules/00modlist.long.html
    -or 00modlist.long.txt.gz)
    -
    -=item CPAN::Module::force($method,@args)
    -
    -Forces CPAN to perform a task that normally would have failed. Force
    -takes as arguments a method name to be called and any number of
    -additional arguments that should be passed to the called method. The
    -internals of the object get the needed changes so that CPAN.pm does
    -not refuse to take the action.
    -
    -=item CPAN::Module::get()
    -
    -Runs a get on the distribution associated with this module.
    -
    -=item CPAN::Module::inst_file()
    -
    -Returns the filename of the module found in @INC. The first file found
    -is reported just like perl itself stops searching @INC when it finds a
    -module.
    -
    -=item CPAN::Module::inst_version()
    -
    -Returns the version number of the module in readable format.
    -
    -=item CPAN::Module::install()
    -
    -Runs an C on the distribution associated with this module.
    -
    -=item CPAN::Module::look()
    -
    -Changes to the directory where the distribution assoicated with this
    -module has been unpacked and opens a subshell there. Exiting the
    -subshell returns.
    -
    -=item CPAN::Module::make()
    -
    -Runs a C on the distribution associated with this module.
    -
    -=item CPAN::Module::manpage_headline()
    -
    -If module is installed, peeks into the module's manpage, reads the
    -headline and returns it. Moreover, if the module has been downloaded
    -within this session, does the equivalent on the downloaded module even
    -if it is not installed.
    -
    -=item CPAN::Module::readme()
    -
    -Runs a C on the distribution associated with this module.
    -
    -=item CPAN::Module::test()
    -
    -Runs a C on the distribution associated with this module.
    -
    -=item CPAN::Module::uptodate()
    -
    -Returns 1 if the module is installed and up-to-date.
    -
    -=item CPAN::Module::userid()
    -
    -Returns the author's ID of the module.
    -
    -=back
    -
    -=head2 Cache Manager
    -
    -Currently the cache manager only keeps track of the build directory
    -($CPAN::Config->{build_dir}). It is a simple FIFO mechanism that
    -deletes complete directories below C as soon as the size of
    -all directories there gets bigger than $CPAN::Config->{build_cache}
    -(in MB). The contents of this cache may be used for later
    -re-installations that you intend to do manually, but will never be
    -trusted by CPAN itself. This is due to the fact that the user might
    -use these directories for building modules on different architectures.
    -
    -There is another directory ($CPAN::Config->{keep_source_where}) where
    -the original distribution files are kept. This directory is not
    -covered by the cache manager and must be controlled by the user. If
    -you choose to have the same directory as build_dir and as
    -keep_source_where directory, then your sources will be deleted with
    -the same fifo mechanism.
    -
    -=head2 Bundles
    -
    -A bundle is just a perl module in the namespace Bundle:: that does not
    -define any functions or methods. It usually only contains documentation.
    -
    -It starts like a perl module with a package declaration and a $VERSION
    -variable. After that the pod section looks like any other pod with the
    -only difference being that I exists starting with
    -(verbatim):
    -
    -	=head1 CONTENTS
    -
    -In this pod section each line obeys the format
    -
    -        Module_Name [Version_String] [- optional text]
    -
    -The only required part is the first field, the name of a module
    -(e.g. Foo::Bar, ie. I the name of the distribution file). The rest
    -of the line is optional. The comment part is delimited by a dash just
    -as in the man page header.
    -
    -The distribution of a bundle should follow the same convention as
    -other distributions.
    -
    -Bundles are treated specially in the CPAN package. If you say 'install
    -Bundle::Tkkit' (assuming such a bundle exists), CPAN will install all
    -the modules in the CONTENTS section of the pod. You can install your
    -own Bundles locally by placing a conformant Bundle file somewhere into
    -your @INC path. The autobundle() command which is available in the
    -shell interface does that for you by including all currently installed
    -modules in a snapshot bundle file.
    -
    -=head2 Prerequisites
    -
    -If you have a local mirror of CPAN and can access all files with
    -"file:" URLs, then you only need a perl better than perl5.003 to run
    -this module. Otherwise Net::FTP is strongly recommended. LWP may be
    -required for non-UNIX systems or if your nearest CPAN site is
    -associated with an URL that is not C.
    -
    -If you have neither Net::FTP nor LWP, there is a fallback mechanism
    -implemented for an external ftp command or for an external lynx
    -command.
    -
    -=head2 Finding packages and VERSION
    -
    -This module presumes that all packages on CPAN
    -
    -=over 2
    -
    -=item *
    -
    -declare their $VERSION variable in an easy to parse manner. This
    -prerequisite can hardly be relaxed because it consumes far too much
    -memory to load all packages into the running program just to determine
    -the $VERSION variable. Currently all programs that are dealing with
    -version use something like this
    -
    -    perl -MExtUtils::MakeMaker -le \
    -        'print MM->parse_version(shift)' filename
    -
    -If you are author of a package and wonder if your $VERSION can be
    -parsed, please try the above method.
    -
    -=item *
    -
    -come as compressed or gzipped tarfiles or as zip files and contain a
    -Makefile.PL (well, we try to handle a bit more, but without much
    -enthusiasm).
    -
    -=back
    -
    -=head2 Debugging
    -
    -The debugging of this module is a bit complex, because we have
    -interferences of the software producing the indices on CPAN, of the
    -mirroring process on CPAN, of packaging, of configuration, of
    -synchronicity, and of bugs within CPAN.pm.
    -
    -For code debugging in interactive mode you can try "o debug" which
    -will list options for debugging the various parts of the code. You
    -should know that "o debug" has built-in completion support.
    -
    -For data debugging there is the C command which takes the same
    -arguments as make/test/install and outputs the object's Data::Dumper
    -dump.
    -
    -=head2 Floppy, Zip, Offline Mode
    -
    -CPAN.pm works nicely without network too. If you maintain machines
    -that are not networked at all, you should consider working with file:
    -URLs. Of course, you have to collect your modules somewhere first. So
    -you might use CPAN.pm to put together all you need on a networked
    -machine. Then copy the $CPAN::Config->{keep_source_where} (but not
    -$CPAN::Config->{build_dir}) directory on a floppy. This floppy is kind
    -of a personal CPAN. CPAN.pm on the non-networked machines works nicely
    -with this floppy. See also below the paragraph about CD-ROM support.
    -
    -=head1 CONFIGURATION
    -
    -When the CPAN module is installed, a site wide configuration file is
    -created as CPAN/Config.pm. The default values defined there can be
    -overridden in another configuration file: CPAN/MyConfig.pm. You can
    -store this file in $HOME/.cpan/CPAN/MyConfig.pm if you want, because
    -$HOME/.cpan is added to the search path of the CPAN module before the
    -use() or require() statements.
    -
    -Currently the following keys in the hash reference $CPAN::Config are
    -defined:
    -
    -  build_cache        size of cache for directories to build modules
    -  build_dir          locally accessible directory to build modules
    -  index_expire       after this many days refetch index files
    -  cache_metadata     use serializer to cache metadata
    -  cpan_home          local directory reserved for this package
    -  dontload_hash      anonymous hash: modules in the keys will not be
    -                     loaded by the CPAN::has_inst() routine
    -  gzip		     location of external program gzip
    -  inactivity_timeout breaks interactive Makefile.PLs after this
    -                     many seconds inactivity. Set to 0 to never break.
    -  inhibit_startup_message
    -                     if true, does not print the startup message
    -  keep_source_where  directory in which to keep the source (if we do)
    -  make               location of external make program
    -  make_arg	     arguments that should always be passed to 'make'
    -  make_install_arg   same as make_arg for 'make install'
    -  makepl_arg	     arguments passed to 'perl Makefile.PL'
    -  pager              location of external program more (or any pager)
    -  prerequisites_policy
    -                     what to do if you are missing module prerequisites
    -                     ('follow' automatically, 'ask' me, or 'ignore')
    -  proxy_user         username for accessing an authenticating proxy
    -  proxy_pass         password for accessing an authenticating proxy
    -  scan_cache	     controls scanning of cache ('atstart' or 'never')
    -  tar                location of external program tar
    -  term_is_latin      if true internal UTF-8 is translated to ISO-8859-1
    -                     (and nonsense for characters outside latin range)
    -  unzip              location of external program unzip
    -  urllist	     arrayref to nearby CPAN sites (or equivalent locations)
    -  wait_list          arrayref to a wait server to try (See CPAN::WAIT)
    -  ftp_proxy,      }  the three usual variables for configuring
    -    http_proxy,   }  proxy requests. Both as CPAN::Config variables
    -    no_proxy      }  and as environment variables configurable.
    -
    -You can set and query each of these options interactively in the cpan
    -shell with the command set defined within the C command:
    -
    -=over 2
    -
    -=item Cscalar optionE>
    -
    -prints the current value of the I
    -
    -=item Cscalar optionE EvalueE>
    -
    -Sets the value of the I to I
    -
    -=item Clist optionE>
    -
    -prints the current value of the I in MakeMaker's
    -neatvalue format.
    -
    -=item Clist optionE [shift|pop]>
    -
    -shifts or pops the array in the I variable
    -
    -=item Clist optionE [unshift|push|splice] ElistE>
    -
    -works like the corresponding perl commands.
    -
    -=back
    -
    -=head2 Note on urllist parameter's format
    -
    -urllist parameters are URLs according to RFC 1738. We do a little
    -guessing if your URL is not compliant, but if you have problems with
    -file URLs, please try the correct format. Either:
    -
    -    file://localhost/whatever/ftp/pub/CPAN/
    -
    -or
    -
    -    file:///home/ftp/pub/CPAN/
    -
    -=head2 urllist parameter has CD-ROM support
    -
    -The C parameter of the configuration table contains a list of
    -URLs that are to be used for downloading. If the list contains any
    -C URLs, CPAN always tries to get files from there first. This
    -feature is disabled for index files. So the recommendation for the
    -owner of a CD-ROM with CPAN contents is: include your local, possibly
    -outdated CD-ROM as a C URL at the end of urllist, e.g.
    -
    -  o conf urllist push file://localhost/CDROM/CPAN
    -
    -CPAN.pm will then fetch the index files from one of the CPAN sites
    -that come at the beginning of urllist. It will later check for each
    -module if there is a local copy of the most recent version.
    -
    -Another peculiarity of urllist is that the site that we could
    -successfully fetch the last file from automatically gets a preference
    -token and is tried as the first site for the next request. So if you
    -add a new site at runtime it may happen that the previously preferred
    -site will be tried another time. This means that if you want to disallow
    -a site for the next transfer, it must be explicitly removed from
    -urllist.
    -
    -=head1 SECURITY
    -
    -There's no strong security layer in CPAN.pm. CPAN.pm helps you to
    -install foreign, unmasked, unsigned code on your machine. We compare
    -to a checksum that comes from the net just as the distribution file
    -itself. If somebody has managed to tamper with the distribution file,
    -they may have as well tampered with the CHECKSUMS file. Future
    -development will go towards strong authentication.
    -
    -=head1 EXPORT
    -
    -Most functions in package CPAN are exported per default. The reason
    -for this is that the primary use is intended for the cpan shell or for
    -oneliners.
    -
    -=head1 POPULATE AN INSTALLATION WITH LOTS OF MODULES
    -
    -Populating a freshly installed perl with my favorite modules is pretty
    -easy if you maintain a private bundle definition file. To get a useful
    -blueprint of a bundle definition file, the command autobundle can be used
    -on the CPAN shell command line. This command writes a bundle definition
    -file for all modules that are installed for the currently running perl
    -interpreter. It's recommended to run this command only once and from then
    -on maintain the file manually under a private name, say
    -Bundle/my_bundle.pm. With a clever bundle file you can then simply say
    -
    -    cpan> install Bundle::my_bundle
    -
    -then answer a few questions and then go out for a coffee.
    -
    -Maintaining a bundle definition file means keeping track of two
    -things: dependencies and interactivity. CPAN.pm sometimes fails on
    -calculating dependencies because not all modules define all MakeMaker
    -attributes correctly, so a bundle definition file should specify
    -prerequisites as early as possible. On the other hand, it's a bit
    -annoying that many distributions need some interactive configuring. So
    -what I try to accomplish in my private bundle file is to have the
    -packages that need to be configured early in the file and the gentle
    -ones later, so I can go out after a few minutes and leave CPAN.pm
    -untended.
    -
    -=head1 WORKING WITH CPAN.pm BEHIND FIREWALLS
    -
    -Thanks to Graham Barr for contributing the following paragraphs about
    -the interaction between perl, and various firewall configurations. For
    -further informations on firewalls, it is recommended to consult the
    -documentation that comes with the ncftp program. If you are unable to
    -go through the firewall with a simple Perl setup, it is very likely
    -that you can configure ncftp so that it works for your firewall.
    -
    -=head2 Three basic types of firewalls
    -
    -Firewalls can be categorized into three basic types.
    -
    -=over
    -
    -=item http firewall
    -
    -This is where the firewall machine runs a web server and to access the
    -outside world you must do it via the web server. If you set environment
    -variables like http_proxy or ftp_proxy to a values beginning with http://
    -or in your web browser you have to set proxy information then you know
    -you are running a http firewall.
    -
    -To access servers outside these types of firewalls with perl (even for
    -ftp) you will need to use LWP.
    -
    -=item ftp firewall
    -
    -This where the firewall machine runs a ftp server. This kind of
    -firewall will only let you access ftp servers outside the firewall.
    -This is usually done by connecting to the firewall with ftp, then
    -entering a username like "user@outside.host.com"
    -
    -To access servers outside these type of firewalls with perl you
    -will need to use Net::FTP.
    -
    -=item One way visibility
    -
    -I say one way visibility as these firewalls try to make themselve look
    -invisible to the users inside the firewall. An FTP data connection is
    -normally created by sending the remote server your IP address and then
    -listening for the connection. But the remote server will not be able to
    -connect to you because of the firewall. So for these types of firewall
    -FTP connections need to be done in a passive mode.
    -
    -There are two that I can think off.
    -
    -=over
    -
    -=item SOCKS
    -
    -If you are using a SOCKS firewall you will need to compile perl and link
    -it with the SOCKS library, this is what is normally called a 'socksified'
    -perl. With this executable you will be able to connect to servers outside
    -the firewall as if it is not there.
    -
    -=item IP Masquerade
    -
    -This is the firewall implemented in the Linux kernel, it allows you to
    -hide a complete network behind one IP address. With this firewall no
    -special compiling is needed as you can access hosts directly.
    -
    -=back
    -
    -=back
    -
    -=head2 Configuring lynx or ncftp for going through a firewall
    -
    -If you can go through your firewall with e.g. lynx, presumably with a
    -command such as
    -
    -    /usr/local/bin/lynx -pscott:tiger
    -
    -then you would configure CPAN.pm with the command
    -
    -    o conf lynx "/usr/local/bin/lynx -pscott:tiger"
    -
    -That's all. Similarly for ncftp or ftp, you would configure something
    -like
    -
    -    o conf ncftp "/usr/bin/ncftp -f /home/scott/ncftplogin.cfg"
    -
    -Your milage may vary...
    -
    -=head1 FAQ
    -
    -=over
    -
    -=item 1)
    -
    -I installed a new version of module X but CPAN keeps saying,
    -I have the old version installed
    -
    -Most probably you B have the old version installed. This can
    -happen if a module installs itself into a different directory in the
    -@INC path than it was previously installed. This is not really a
    -CPAN.pm problem, you would have the same problem when installing the
    -module manually. The easiest way to prevent this behaviour is to add
    -the argument C to the C call, and that is why
    -many people add this argument permanently by configuring
    -
    -  o conf make_install_arg UNINST=1
    -
    -=item 2)
    -
    -So why is UNINST=1 not the default?
    -
    -Because there are people who have their precise expectations about who
    -may install where in the @INC path and who uses which @INC array. In
    -fine tuned environments C can cause damage.
    -
    -=item 3)
    -
    -I want to clean up my mess, and install a new perl along with
    -all modules I have. How do I go about it?
    -
    -Run the autobundle command for your old perl and optionally rename the
    -resulting bundle file (e.g. Bundle/mybundle.pm), install the new perl
    -with the Configure option prefix, e.g.
    -
    -    ./Configure -Dprefix=/usr/local/perl-5.6.78.9
    -
    -Install the bundle file you produced in the first step with something like
    -
    -    cpan> install Bundle::mybundle
    -
    -and you're done.
    -
    -=item 4)
    -
    -When I install bundles or multiple modules with one command
    -there is too much output to keep track of.
    -
    -You may want to configure something like
    -
    -  o conf make_arg "| tee -ai /root/.cpan/logs/make.out"
    -  o conf make_install_arg "| tee -ai /root/.cpan/logs/make_install.out"
    -
    -so that STDOUT is captured in a file for later inspection.
    -
    -
    -=item 5)
    -
    -I am not root, how can I install a module in a personal directory?
    -
    -You will most probably like something like this:
    -
    -  o conf makepl_arg "LIB=~/myperl/lib \
    -                    INSTALLMAN1DIR=~/myperl/man/man1 \
    -                    INSTALLMAN3DIR=~/myperl/man/man3"
    -  install Sybase::Sybperl
    -
    -You can make this setting permanent like all C settings with
    -C.
    -
    -You will have to add ~/myperl/man to the MANPATH environment variable
    -and also tell your perl programs to look into ~/myperl/lib, e.g. by
    -including
    -
    -  use lib "$ENV{HOME}/myperl/lib";
    -
    -or setting the PERL5LIB environment variable.
    -
    -Another thing you should bear in mind is that the UNINST parameter
    -should never be set if you are not root.
    -
    -=item 6)
    -
    -How to get a package, unwrap it, and make a change before building it?
    -
    -  look Sybase::Sybperl
    -
    -=item 7)
    -
    -I installed a Bundle and had a couple of fails. When I
    -retried, everything resolved nicely. Can this be fixed to work
    -on first try?
    -
    -The reason for this is that CPAN does not know the dependencies of all
    -modules when it starts out. To decide about the additional items to
    -install, it just uses data found in the generated Makefile. An
    -undetected missing piece breaks the process. But it may well be that
    -your Bundle installs some prerequisite later than some depending item
    -and thus your second try is able to resolve everything. Please note,
    -CPAN.pm does not know the dependency tree in advance and cannot sort
    -the queue of things to install in a topologically correct order. It
    -resolves perfectly well IFF all modules declare the prerequisites
    -correctly with the PREREQ_PM attribute to MakeMaker. For bundles which
    -fail and you need to install often, it is recommended sort the Bundle
    -definition file manually. It is planned to improve the metadata
    -situation for dependencies on CPAN in general, but this will still
    -take some time.
    -
    -=item 8)
    -
    -In our intranet we have many modules for internal use. How
    -can I integrate these modules with CPAN.pm but without uploading
    -the modules to CPAN?
    -
    -Have a look at the CPAN::Site module.
    -
    -=item 9)
    -
    -When I run CPAN's shell, I get error msg about line 1 to 4,
    -setting meta input/output via the /etc/inputrc file.
    -
    -Some versions of readline are picky about capitalization in the
    -/etc/inputrc file and specifically RedHat 6.2 comes with a
    -/etc/inputrc that contains the word C in lowercase. Change the
    -occurrences of C to C and the bug should disappear.
    -
    -=item 10)
    -
    -Some authors have strange characters in their names.
    -
    -Internally CPAN.pm uses the UTF-8 charset. If your terminal is
    -expecting ISO-8859-1 charset, a converter can be activated by setting
    -term_is_latin to a true value in your config file. One way of doing so
    -would be
    -
    -    cpan> ! $CPAN::Config->{term_is_latin}=1
    -
    -Extended support for converters will be made available as soon as perl
    -becomes stable with regard to charset issues.
    -
    -=back
    -
    -=head1 BUGS
    -
    -We should give coverage for B of the CPAN and not just the PAUSE
    -part, right? In this discussion CPAN and PAUSE have become equal --
    -but they are not. PAUSE is authors/, modules/ and scripts/. CPAN is
    -PAUSE plus the clpa/, doc/, misc/, ports/, and src/.
    -
    -Future development should be directed towards a better integration of
    -the other parts.
    -
    -If a Makefile.PL requires special customization of libraries, prompts
    -the user for special input, etc. then you may find CPAN is not able to
    -build the distribution. In that case, you should attempt the
    -traditional method of building a Perl module package from a shell.
    -
    -=head1 AUTHOR
    -
    -Andreas Koenig Eandreas.koenig@anima.deE
    -
    -=head1 TRANSLATIONS
    -
    -Kawai,Takanori provides a Japanese translation of this manpage at
    -http://member.nifty.ne.jp/hippo2000/perltips/CPAN.htm
    -
    -=head1 SEE ALSO
    -
    -perl(1), CPAN::Nox(3)
    -
    -=cut
    -
    diff --git a/lib/perl5/5.6.1/CPAN/FirstTime.pm b/lib/perl5/5.6.1/CPAN/FirstTime.pm
    deleted file mode 100644
    index 0429db15..00000000
    --- a/lib/perl5/5.6.1/CPAN/FirstTime.pm
    +++ /dev/null
    @@ -1,671 +0,0 @@
    -# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*-
    -package CPAN::Mirrored::By;
    -
    -sub new { 
    -    my($self,@arg) = @_;
    -    bless [@arg], $self;
    -}
    -sub continent { shift->[0] }
    -sub country { shift->[1] }
    -sub url { shift->[2] }
    -
    -package CPAN::FirstTime;
    -
    -use strict;
    -use ExtUtils::MakeMaker qw(prompt);
    -use FileHandle ();
    -use File::Basename ();
    -use File::Path ();
    -use vars qw($VERSION);
    -$VERSION = substr q$Revision: 1.53 $, 10;
    -
    -=head1 NAME
    -
    -CPAN::FirstTime - Utility for CPAN::Config file Initialization
    -
    -=head1 SYNOPSIS
    -
    -CPAN::FirstTime::init()
    -
    -=head1 DESCRIPTION
    -
    -The init routine asks a few questions and writes a CPAN::Config
    -file. Nothing special.
    -
    -=cut
    -
    -
    -sub init {
    -    my($configpm) = @_;
    -    use Config;
    -    unless ($CPAN::VERSION) {
    -	require CPAN::Nox;
    -    }
    -    eval {require CPAN::Config;};
    -    $CPAN::Config ||= {};
    -    local($/) = "\n";
    -    local($\) = "";
    -    local($|) = 1;
    -
    -    my($ans,$default,$local,$cont,$url,$expected_size);
    -
    -    #
    -    # Files, directories
    -    #
    -
    -    print qq[
    -
    -CPAN is the world-wide archive of perl resources. It consists of about
    -100 sites that all replicate the same contents all around the globe.
    -Many countries have at least one CPAN site already. The resources
    -found on CPAN are easily accessible with the CPAN.pm module. If you
    -want to use CPAN.pm, you have to configure it properly.
    -
    -If you do not want to enter a dialog now, you can answer 'no' to this
    -question and I\'ll try to autoconfigure. (Note: you can revisit this
    -dialog anytime later by typing 'o conf init' at the cpan prompt.)
    -
    -];
    -
    -    my $manual_conf =
    -	ExtUtils::MakeMaker::prompt("Are you ready for manual configuration?",
    -				    "yes");
    -    my $fastread;
    -    {
    -      local $^W;
    -      if ($manual_conf =~ /^\s*y/i) {
    -	$fastread = 0;
    -	*prompt = \&ExtUtils::MakeMaker::prompt;
    -      } else {
    -	$fastread = 1;
    -	$CPAN::Config->{urllist} ||= [];
    -	# prototype should match that of &MakeMaker::prompt
    -	*prompt = sub ($;$) {
    -	  my($q,$a) = @_;
    -	  my($ret) = defined $a ? $a : "";
    -	  printf qq{%s [%s]\n\n}, $q, $ret;
    -	  $ret;
    -	};
    -      }
    -    }
    -    print qq{
    -
    -The following questions are intended to help you with the
    -configuration. The CPAN module needs a directory of its own to cache
    -important index files and maybe keep a temporary mirror of CPAN files.
    -This may be a site-wide directory or a personal directory.
    -
    -};
    -
    -    my $cpan_home = $CPAN::Config->{cpan_home} || MM->catdir($ENV{HOME}, ".cpan");
    -    if (-d $cpan_home) {
    -	print qq{
    -
    -I see you already have a  directory
    -    $cpan_home
    -Shall we use it as the general CPAN build and cache directory?
    -
    -};
    -    } else {
    -	print qq{
    -
    -First of all, I\'d like to create this directory. Where?
    -
    -};
    -    }
    -
    -    $default = $cpan_home;
    -    while ($ans = prompt("CPAN build and cache directory?",$default)) {
    -      eval { File::Path::mkpath($ans); }; # dies if it can't
    -      if ($@) {
    -	warn "Couldn't create directory $ans.
    -Please retry.\n";
    -	next;
    -      }
    -      if (-d $ans && -w _) {
    -	last;
    -      } else {
    -	warn "Couldn't find directory $ans
    -  or directory is not writable. Please retry.\n";
    -      }
    -    }
    -    $CPAN::Config->{cpan_home} = $ans;
    -
    -    print qq{
    -
    -If you want, I can keep the source files after a build in the cpan
    -home directory. If you choose so then future builds will take the
    -files from there. If you don\'t want to keep them, answer 0 to the
    -next question.
    -
    -};
    -
    -    $CPAN::Config->{keep_source_where} = MM->catdir($CPAN::Config->{cpan_home},"sources");
    -    $CPAN::Config->{build_dir} = MM->catdir($CPAN::Config->{cpan_home},"build");
    -
    -    #
    -    # Cache size, Index expire
    -    #
    -
    -    print qq{
    -
    -How big should the disk cache be for keeping the build directories
    -with all the intermediate files\?
    -
    -};
    -
    -    $default = $CPAN::Config->{build_cache} || 10;
    -    $ans = prompt("Cache size for build directory (in MB)?", $default);
    -    $CPAN::Config->{build_cache} = $ans;
    -
    -    # XXX This the time when we refetch the index files (in days)
    -    $CPAN::Config->{'index_expire'} = 1;
    -
    -    print qq{
    -
    -By default, each time the CPAN module is started, cache scanning
    -is performed to keep the cache size in sync. To prevent from this,
    -disable the cache scanning with 'never'.
    -
    -};
    -
    -    $default = $CPAN::Config->{scan_cache} || 'atstart';
    -    do {
    -        $ans = prompt("Perform cache scanning (atstart or never)?", $default);
    -    } while ($ans ne 'atstart' && $ans ne 'never');
    -    $CPAN::Config->{scan_cache} = $ans;
    -
    -    #
    -    # cache_metadata
    -    #
    -    print qq{
    -
    -To considerably speed up the initial CPAN shell startup, it is
    -possible to use Storable to create a cache of metadata. If Storable
    -is not available, the normal index mechanism will be used.
    -
    -};
    -
    -    defined($default = $CPAN::Config->{cache_metadata}) or $default = 1;
    -    do {
    -        $ans = prompt("Cache metadata (yes/no)?", ($default ? 'yes' : 'no'));
    -    } while ($ans !~ /^\s*[yn]/i);
    -    $CPAN::Config->{cache_metadata} = ($ans =~ /^\s*y/i ? 1 : 0);
    -
    -    #
    -    # term_is_latin
    -    #
    -    print qq{
    -
    -The next option deals with the charset your terminal supports. In
    -general CPAN is English speaking territory, thus the charset does not
    -matter much, but some of the aliens out there who upload their
    -software to CPAN bear names that are outside the ASCII range. If your
    -terminal supports UTF-8, you say no to the next question, if it
    -supports ISO-8859-1 (also known as LATIN1) then you say yes, and if it
    -supports neither nor, your answer does not matter, you will not be
    -able to read the names of some authors anyway. If you answer no, names
    -will be output in UTF-8.
    -
    -};
    -
    -    defined($default = $CPAN::Config->{term_is_latin}) or $default = 1;
    -    do {
    -        $ans = prompt("Your terminal expects ISO-8859-1 (yes/no)?",
    -                      ($default ? 'yes' : 'no'));
    -    } while ($ans !~ /^\s*[yn]/i);
    -    $CPAN::Config->{term_is_latin} = ($ans =~ /^\s*y/i ? 1 : 0);
    -
    -    #
    -    # prerequisites_policy
    -    # Do we follow PREREQ_PM?
    -    #
    -    print qq{
    -
    -The CPAN module can detect when a module that which you are trying to
    -build depends on prerequisites. If this happens, it can build the
    -prerequisites for you automatically ('follow'), ask you for
    -confirmation ('ask'), or just ignore them ('ignore'). Please set your
    -policy to one of the three values.
    -
    -};
    -
    -    $default = $CPAN::Config->{prerequisites_policy} || 'ask';
    -    do {
    -      $ans =
    -	  prompt("Policy on building prerequisites (follow, ask or ignore)?",
    -		 $default);
    -    } while ($ans ne 'follow' && $ans ne 'ask' && $ans ne 'ignore');
    -    $CPAN::Config->{prerequisites_policy} = $ans;
    -
    -    #
    -    # External programs
    -    #
    -
    -    print qq{
    -
    -The CPAN module will need a few external programs to work properly.
    -Please correct me, if I guess the wrong path for a program. Don\'t
    -panic if you do not have some of them, just press ENTER for those. To
    -disable the use of a download program, you can type a space followed
    -by ENTER.
    -
    -};
    -
    -    my $old_warn = $^W;
    -    local $^W if $^O eq 'MacOS';
    -    my(@path) = split /$Config{'path_sep'}/, $ENV{'PATH'};
    -    local $^W = $old_warn;
    -    my $progname;
    -    for $progname (qw/gzip tar unzip make lynx wget ncftpget ncftp ftp/){
    -      if ($^O eq 'MacOS') {
    -          $CPAN::Config->{$progname} = 'not_here';
    -          next;
    -      }
    -      my $progcall = $progname;
    -      # we don't need ncftp if we have ncftpget
    -      next if $progname eq "ncftp" && $CPAN::Config->{ncftpget} gt " ";
    -      my $path = $CPAN::Config->{$progname} 
    -	  || $Config::Config{$progname}
    -	      || "";
    -      if (MM->file_name_is_absolute($path)) {
    -	# testing existence is not good enough, some have these exe
    -	# extensions
    -
    -	# warn "Warning: configured $path does not exist\n" unless -e $path;
    -	# $path = "";
    -      } else {
    -	$path = '';
    -      }
    -      unless ($path) {
    -	# e.g. make -> nmake
    -	$progcall = $Config::Config{$progname} if $Config::Config{$progname};
    -      }
    -
    -      $path ||= find_exe($progcall,[@path]);
    -      warn "Warning: $progcall not found in PATH\n" unless
    -	  $path; # not -e $path, because find_exe already checked that
    -      $ans = prompt("Where is your $progname program?",$path) || $path;
    -      $CPAN::Config->{$progname} = $ans;
    -    }
    -    my $path = $CPAN::Config->{'pager'} || 
    -	$ENV{PAGER} || find_exe("less",[@path]) || 
    -	    find_exe("more",[@path]) || ($^O eq 'MacOS' ? $ENV{EDITOR} : 0 )
    -	    || "more";
    -    $ans = prompt("What is your favorite pager program?",$path);
    -    $CPAN::Config->{'pager'} = $ans;
    -    $path = $CPAN::Config->{'shell'};
    -    if (MM->file_name_is_absolute($path)) {
    -	warn "Warning: configured $path does not exist\n" unless -e $path;
    -	$path = "";
    -    }
    -    $path ||= $ENV{SHELL};
    -    if ($^O eq 'MacOS') {
    -        $CPAN::Config->{'shell'} = 'not_here';
    -    } else {
    -        $path =~ s,\\,/,g if $^O eq 'os2';	# Cosmetic only
    -        $ans = prompt("What is your favorite shell?",$path);
    -        $CPAN::Config->{'shell'} = $ans;
    -    }
    -
    -    #
    -    # Arguments to make etc.
    -    #
    -
    -    print qq{
    -
    -Every Makefile.PL is run by perl in a separate process. Likewise we
    -run \'make\' and \'make install\' in processes. If you have any
    -parameters \(e.g. PREFIX, LIB, UNINST or the like\) you want to pass
    -to the calls, please specify them here.
    -
    -If you don\'t understand this question, just press ENTER.
    -
    -};
    -
    -    $default = $CPAN::Config->{makepl_arg} || "";
    -    $CPAN::Config->{makepl_arg} =
    -	prompt("Parameters for the 'perl Makefile.PL' command?
    -Typical frequently used settings:
    -
    -    POLLUTE=1        increasing backwards compatibility
    -    LIB=~/perl       non-root users (please see manual for more hints)
    -
    -Your choice: ",$default);
    -    $default = $CPAN::Config->{make_arg} || "";
    -    $CPAN::Config->{make_arg} = prompt("Parameters for the 'make' command?
    -Typical frequently used setting:
    -
    -    -j3              dual processor system
    -
    -Your choice: ",$default);
    -
    -    $default = $CPAN::Config->{make_install_arg} || $CPAN::Config->{make_arg} || "";
    -    $CPAN::Config->{make_install_arg} =
    -	prompt("Parameters for the 'make install' command?
    -Typical frequently used setting:
    -
    -    UNINST=1         to always uninstall potentially conflicting files
    -
    -Your choice: ",$default);
    -
    -    #
    -    # Alarm period
    -    #
    -
    -    print qq{
    -
    -Sometimes you may wish to leave the processes run by CPAN alone
    -without caring about them. As sometimes the Makefile.PL contains
    -question you\'re expected to answer, you can set a timer that will
    -kill a 'perl Makefile.PL' process after the specified time in seconds.
    -
    -If you set this value to 0, these processes will wait forever. This is
    -the default and recommended setting.
    -
    -};
    -
    -    $default = $CPAN::Config->{inactivity_timeout} || 0;
    -    $CPAN::Config->{inactivity_timeout} =
    -	prompt("Timeout for inactivity during Makefile.PL?",$default);
    -
    -    # Proxies
    -
    -    print qq{
    -
    -If you\'re accessing the net via proxies, you can specify them in the
    -CPAN configuration or via environment variables. The variable in
    -the \$CPAN::Config takes precedence.
    -
    -};
    -
    -    for (qw/ftp_proxy http_proxy no_proxy/) {
    -	$default = $CPAN::Config->{$_} || $ENV{$_};
    -	$CPAN::Config->{$_} = prompt("Your $_?",$default);
    -    }
    -
    -    if ($CPAN::Config->{ftp_proxy} ||
    -        $CPAN::Config->{http_proxy}) {
    -        $default = $CPAN::Config->{proxy_user} || $CPAN::LWP::UserAgent::USER;
    -        print qq{
    -
    -If your proxy is an authenticating proxy, you can store your username
    -permanently. If you do not want that, just press RETURN. You will then
    -be asked for your username in every future session.
    -
    -};
    -        if ($CPAN::Config->{proxy_user} = prompt("Your proxy user id?",$default)) {
    -            print qq{
    -
    -Your password for the authenticating proxy can also be stored
    -permanently on disk. If this violates your security policy, just press
    -RETURN. You will then be asked for the password in every future
    -session.
    -
    -};
    -
    -            if ($CPAN::META->has_inst("Term::ReadKey")) {
    -                Term::ReadKey::ReadMode("noecho");
    -            } else {
    -                print qq{
    -
    -Warning: Term::ReadKey seems not to be available, your password will
    -be echoed to the terminal!
    -
    -};
    -            }
    -            $CPAN::Config->{proxy_pass} = prompt("Your proxy password?");
    -            if ($CPAN::META->has_inst("Term::ReadKey")) {
    -                Term::ReadKey::ReadMode("restore");
    -            }
    -            $CPAN::Frontend->myprint("\n\n");
    -        }
    -    }
    -
    -    #
    -    # MIRRORED.BY
    -    #
    -
    -    conf_sites() unless $fastread;
    -
    -    unless (@{$CPAN::Config->{'wait_list'}||[]}) {
    -	print qq{
    -
    -WAIT support is available as a Plugin. You need the CPAN::WAIT module
    -to actually use it.  But we need to know your favorite WAIT server. If
    -you don\'t know a WAIT server near you, just press ENTER.
    -
    -};
    -	$default = "wait://ls6.informatik.uni-dortmund.de:1404";
    -	$ans = prompt("Your favorite WAIT server?\n  ",$default);
    -	push @{$CPAN::Config->{'wait_list'}}, $ans;
    -    }
    -
    -    # We don't ask that now, it will be noticed in time, won't it?
    -    $CPAN::Config->{'inhibit_startup_message'} = 0;
    -    $CPAN::Config->{'getcwd'} = 'cwd';
    -
    -    print "\n\n";
    -    CPAN::Config->commit($configpm);
    -}
    -
    -sub conf_sites {
    -  my $m = 'MIRRORED.BY';
    -  my $mby = MM->catfile($CPAN::Config->{keep_source_where},$m);
    -  File::Path::mkpath(File::Basename::dirname($mby));
    -  if (-f $mby && -f $m && -M $m < -M $mby) {
    -    require File::Copy;
    -    File::Copy::copy($m,$mby) or die "Could not update $mby: $!";
    -  }
    -  my $loopcount = 0;
    -  local $^T = time;
    -  my $overwrite_local = 0;
    -  if ($mby && -f $mby && -M _ <= 60 && -s _ > 0) {
    -      my $mtime = localtime((stat _)[9]);
    -      my $prompt = qq{Found $mby as of $mtime
    -
    -I\'d use that as a database of CPAN sites. If that is OK for you,
    -please answer 'y', but if you want me to get a new database now,
    -please answer 'n' to the following question.
    -
    -Shall I use the local database in $mby?};
    -      my $ans = prompt($prompt,"y");
    -      $overwrite_local = 1 unless $ans =~ /^y/i;
    -  }
    -  while ($mby) {
    -    if ($overwrite_local) {
    -      print qq{Trying to overwrite $mby
    -};
    -      $mby = CPAN::FTP->localize($m,$mby,3);
    -      $overwrite_local = 0;
    -    } elsif ( ! -f $mby ){
    -      print qq{You have no $mby
    -  I\'m trying to fetch one
    -};
    -      $mby = CPAN::FTP->localize($m,$mby,3);
    -    } elsif (-M $mby > 60 && $loopcount == 0) {
    -      print qq{Your $mby is older than 60 days,
    -  I\'m trying to fetch one
    -};
    -      $mby = CPAN::FTP->localize($m,$mby,3);
    -      $loopcount++;
    -    } elsif (-s $mby == 0) {
    -      print qq{You have an empty $mby,
    -  I\'m trying to fetch one
    -};
    -      $mby = CPAN::FTP->localize($m,$mby,3);
    -    } else {
    -      last;
    -    }
    -  }
    -  read_mirrored_by($mby);
    -  bring_your_own();
    -}
    -
    -sub find_exe {
    -    my($exe,$path) = @_;
    -    my($dir);
    -    #warn "in find_exe exe[$exe] path[@$path]";
    -    for $dir (@$path) {
    -	my $abs = MM->catfile($dir,$exe);
    -	if (($abs = MM->maybe_command($abs))) {
    -	    return $abs;
    -	}
    -    }
    -}
    -
    -sub picklist {
    -    my($items,$prompt,$default,$require_nonempty,$empty_warning)=@_;
    -    $default ||= '';
    -
    -    my ($item, $i);
    -    for $item (@$items) {
    -	printf "(%d) %s\n", ++$i, $item;
    -    }
    -
    -    my @nums;
    -    while (1) {
    -	my $num = prompt($prompt,$default);
    -	@nums = split (' ', $num);
    -	(warn "invalid items entered, try again\n"), next
    -	    if grep (/\D/ || $_ < 1 || $_ > $i, @nums);
    -	if ($require_nonempty) {
    -	    (warn "$empty_warning\n"), next
    -		unless @nums;
    -	}
    -	last;
    -    }
    -    print "\n";
    -    for (@nums) { $_-- }
    -    @{$items}[@nums];
    -}
    -
    -sub read_mirrored_by {
    -    my $local = shift or return;
    -    my(%all,$url,$expected_size,$default,$ans,$host,$dst,$country,$continent,@location);
    -    my $fh = FileHandle->new;
    -    $fh->open($local) or die "Couldn't open $local: $!";
    -    local $/ = "\012";
    -    while (<$fh>) {
    -	($host) = /^([\w\.\-]+)/ unless defined $host;
    -	next unless defined $host;
    -	next unless /\s+dst_(dst|location)/;
    -	/location\s+=\s+\"([^\"]+)/ and @location = (split /\s*,\s*/, $1) and
    -	    ($continent, $country) = @location[-1,-2];
    -	$continent =~ s/\s\(.*//;
    -	$continent =~ s/\W+$//; # if Jarkko doesn't know latitude/longitude
    -	/dst_dst\s+=\s+\"([^\"]+)/  and $dst = $1;
    -	next unless $host && $dst && $continent && $country;
    -	$all{$continent}{$country}{$dst} = CPAN::Mirrored::By->new($continent,$country,$dst);
    -	undef $host;
    -	$dst=$continent=$country="";
    -    }
    -    $fh->close;
    -    $CPAN::Config->{urllist} ||= [];
    -    my(@previous_urls);
    -    if (@previous_urls = @{$CPAN::Config->{urllist}}) {
    -	$CPAN::Config->{urllist} = [];
    -    }
    -
    -    print qq{
    -
    -Now we need to know where your favorite CPAN sites are located. Push
    -a few sites onto the array (just in case the first on the array won\'t
    -work). If you are mirroring CPAN to your local workstation, specify a
    -file: URL.
    -
    -First, pick a nearby continent and country (you can pick several of
    -each, separated by spaces, or none if you just want to keep your
    -existing selections). Then, you will be presented with a list of URLs
    -of CPAN mirrors in the countries you selected, along with previously
    -selected URLs. Select some of those URLs, or just keep the old list.
    -Finally, you will be prompted for any extra URLs -- file:, ftp:, or
    -http: -- that host a CPAN mirror.
    -
    -};
    -
    -    my (@cont, $cont, %cont, @countries, @urls, %seen);
    -    my $no_previous_warn = 
    -       "Sorry! since you don't have any existing picks, you must make a\n" .
    -       "geographic selection.";
    -    @cont = picklist([sort keys %all],
    -                     "Select your continent (or several nearby continents)",
    -                     '',
    -                     ! @previous_urls,
    -                     $no_previous_warn);
    -
    -
    -    foreach $cont (@cont) {
    -        my @c = sort keys %{$all{$cont}};
    -        @cont{@c} = map ($cont, 0..$#c);
    -        @c = map ("$_ ($cont)", @c) if @cont > 1;
    -        push (@countries, @c);
    -    }
    -
    -    if (@countries) {
    -        @countries = picklist (\@countries,
    -                               "Select your country (or several nearby countries)",
    -                               '',
    -                               ! @previous_urls,
    -                               $no_previous_warn);
    -        %seen = map (($_ => 1), @previous_urls);
    -        # hmmm, should take list of defaults from CPAN::Config->{'urllist'}...
    -        foreach $country (@countries) {
    -            (my $bare_country = $country) =~ s/ \(.*\)//;
    -            my @u = sort keys %{$all{$cont{$bare_country}}{$bare_country}};
    -            @u = grep (! $seen{$_}, @u);
    -            @u = map ("$_ ($bare_country)", @u)
    -               if @countries > 1;
    -            push (@urls, @u);
    -        }
    -    }
    -    push (@urls, map ("$_ (previous pick)", @previous_urls));
    -    my $prompt = "Select as many URLs as you like,
    -put them on one line, separated by blanks";
    -    if (@previous_urls) {
    -       $default = join (' ', ((scalar @urls) - (scalar @previous_urls) + 1) ..
    -                             (scalar @urls));
    -       $prompt .= "\n(or just hit RETURN to keep your previous picks)";
    -    }
    -
    -    @urls = picklist (\@urls, $prompt, $default);
    -    foreach (@urls) { s/ \(.*\)//; }
    -    push @{$CPAN::Config->{urllist}}, @urls;
    -}
    -
    -sub bring_your_own {
    -    my %seen = map (($_ => 1), @{$CPAN::Config->{urllist}});
    -    my($ans,@urls);
    -    do {
    -	my $prompt = "Enter another URL or RETURN to quit:";
    -	unless (%seen) {
    -	    $prompt = qq{CPAN.pm needs at least one URL where it can fetch CPAN files from.
    -
    -Please enter your CPAN site:};
    -	}
    -        $ans = prompt ($prompt, "");
    -
    -        if ($ans) {
    -            $ans =~ s|/?\z|/|; # has to end with one slash
    -            $ans = "file:$ans" unless $ans =~ /:/; # without a scheme is a file:
    -            if ($ans =~ /^\w+:\/./) {
    -                push @urls, $ans unless $seen{$ans}++;
    -            } else {
    -                printf(qq{"%s" doesn\'t look like an URL at first sight.
    -I\'ll ignore it for now.
    -You can add it to your %s
    -later if you\'re sure it\'s right.\n},
    -                       $ans,
    -                       $INC{'CPAN/MyConfig.pm'} || $INC{'CPAN/Config.pm'} || "configuration file",
    -                      );
    -            }
    -        }
    -    } while $ans || !%seen;
    -
    -    push @{$CPAN::Config->{urllist}}, @urls;
    -    # xxx delete or comment these out when you're happy that it works
    -    print "New set of picks:\n";
    -    map { print "  $_\n" } @{$CPAN::Config->{urllist}};
    -}
    -
    -1;
    diff --git a/lib/perl5/5.6.1/CPAN/Nox.pm b/lib/perl5/5.6.1/CPAN/Nox.pm
    deleted file mode 100644
    index 8b59ca07..00000000
    --- a/lib/perl5/5.6.1/CPAN/Nox.pm
    +++ /dev/null
    @@ -1,44 +0,0 @@
    -package CPAN::Nox;
    -use strict;
    -use vars qw($VERSION @EXPORT);
    -
    -BEGIN{
    -  $CPAN::Suppress_readline=1 unless defined $CPAN::term;
    -}
    -
    -use base 'Exporter';
    -use CPAN;
    -
    -$VERSION = "1.00";
    -$CPAN::META->has_inst('MD5','no');
    -$CPAN::META->has_inst('LWP','no');
    -$CPAN::META->has_inst('Compress::Zlib','no');
    -@EXPORT = @CPAN::EXPORT;
    -
    -*AUTOLOAD = \&CPAN::AUTOLOAD;
    -
    -__END__
    -
    -=head1 NAME
    -
    -CPAN::Nox - Wrapper around CPAN.pm without using any XS module
    -
    -=head1 SYNOPSIS
    -
    -Interactive mode:
    -
    -  perl -MCPAN::Nox -e shell;
    -
    -=head1 DESCRIPTION
    -
    -This package has the same functionality as CPAN.pm, but tries to
    -prevent the usage of compiled extensions during it's own
    -execution. It's primary purpose is a rescue in case you upgraded perl
    -and broke binary compatibility somehow.
    -
    -=head1  SEE ALSO
    -
    -CPAN(3)
    -
    -=cut
    -
    diff --git a/lib/perl5/5.6.1/pods/perl.pod b/lib/perl5/5.6.1/pods/perl.pod
    deleted file mode 100644
    index b7e88fb2..00000000
    --- a/lib/perl5/5.6.1/pods/perl.pod
    +++ /dev/null
    @@ -1,368 +0,0 @@
    -=head1 NAME
    -
    -perl - Practical Extraction and Report Language
    -
    -=head1 SYNOPSIS
    -
    -B	S<[ B<-sTuU> ]> S<[ B<-hv> ] [ B<-V>[:I] ]>
    -    S<[ B<-cw> ] [ B<-d>[:I] ] [ B<-D>[I] ]>
    -    S<[ B<-pna> ] [ B<-F>I ] [ B<-l>[I] ] [ B<-0>[I] ]>
    -    S<[ B<-I>I ] [ B<-m>[B<->]I ] [ B<-M>[B<->]I<'module...'> ]>
    -    S<[ B<-P> ]> S<[ B<-S> ]> S<[ B<-x>[I] ]>
    -    S<[ B<-i>[I] ]> S<[ B<-e> I<'command'> ] 
    -    [ B<--> ] [ I ] [ I ]...>
    -
    -For ease of access, the Perl manual has been split up into several sections:
    -
    -    perl		Perl overview (this section)
    -    perlfaq		Perl frequently asked questions
    -    perltoc		Perl documentation table of contents
    -    perlbook		Perl book information
    -
    -    perlsyn		Perl syntax
    -    perldata		Perl data structures
    -    perlop		Perl operators and precedence
    -    perlsub		Perl subroutines
    -    perlfunc		Perl builtin functions
    -    perlreftut		Perl references short introduction
    -    perldsc		Perl data structures intro
    -    perlrequick		Perl regular expressions quick start
    -    perlpod		Perl plain old documentation
    -    perlstyle		Perl style guide
    -    perltrap		Perl traps for the unwary
    -
    -    perlrun		Perl execution and options
    -    perldiag		Perl diagnostic messages
    -    perllexwarn		Perl warnings and their control
    -    perldebtut		Perl debugging tutorial
    -    perldebug		Perl debugging
    -
    -    perlvar		Perl predefined variables
    -    perllol		Perl data structures: arrays of arrays
    -    perlopentut		Perl open() tutorial
    -    perlretut		Perl regular expressions tutorial
    -
    -    perlre		Perl regular expressions, the rest of the story
    -    perlref		Perl references, the rest of the story
    -
    -    perlform		Perl formats
    -
    -    perlboot		Perl OO tutorial for beginners
    -    perltoot		Perl OO tutorial, part 1
    -    perltootc		Perl OO tutorial, part 2
    -    perlobj		Perl objects
    -    perlbot		Perl OO tricks and examples
    -    perltie		Perl objects hidden behind simple variables
    -
    -    perlipc		Perl interprocess communication
    -    perlfork		Perl fork() information
    -    perlnumber		Perl number semantics
    -    perlthrtut		Perl threads tutorial
    -
    -    perlport		Perl portability guide
    -    perllocale		Perl locale support
    -    perlunicode		Perl unicode support
    -    perlebcdic		Considerations for running Perl on EBCDIC platforms
    -
    -    perlsec		Perl security
    -
    -    perlmod		Perl modules: how they work
    -    perlmodlib		Perl modules: how to write and use
    -    perlmodinstall	Perl modules: how to install from CPAN
    -    perlnewmod		Perl modules: preparing a new module for distribution
    -
    -    perlfaq1		General Questions About Perl
    -    perlfaq2		Obtaining and Learning about Perl
    -    perlfaq3		Programming Tools
    -    perlfaq4		Data Manipulation
    -    perlfaq5		Files and Formats
    -    perlfaq6		Regexes
    -    perlfaq7		Perl Language Issues
    -    perlfaq8		System Interaction
    -    perlfaq9		Networking
    -
    -    perlcompile		Perl compiler suite intro
    -
    -    perlembed		Perl ways to embed perl in your C or C++ application
    -    perldebguts		Perl debugging guts and tips
    -    perlxstut		Perl XS tutorial
    -    perlxs		Perl XS application programming interface
    -    perlclib		Internal replacements for standard C library functions
    -    perlguts		Perl internal functions for those doing extensions
    -    perlcall		Perl calling conventions from C
    -    perlutil		utilities packaged with the Perl distribution
    -    perlfilter		Perl source filters
    -    perldbmfilter	Perl DBM filters
    -    perlapi		Perl API listing (autogenerated)
    -    perlintern		Perl internal functions (autogenerated)
    -    perlapio		Perl internal IO abstraction interface
    -    perltodo		Perl things to do
    -    perlhack		Perl hackers guide
    -
    -    perlhist		Perl history records
    -    perldelta		Perl changes since previous version
    -    perl5005delta	Perl changes in version 5.005
    -    perl5004delta	Perl changes in version 5.004
    -
    -    perlaix		Perl notes for AIX
    -    perlamiga		Perl notes for Amiga
    -    perlbs2000		Perl notes for POSIX-BC BS2000
    -    perlcygwin		Perl notes for Cygwin
    -    perldos		Perl notes for DOS
    -    perlepoc		Perl notes for EPOC
    -    perlhpux		Perl notes for HP-UX
    -    perlmachten		Perl notes for Power MachTen
    -    perlmacos		Perl notes for Mac OS (Classic)
    -    perlmpeix		Perl notes for MPE/iX
    -    perlos2		Perl notes for OS/2
    -    perlos390		Perl notes for OS/390
    -    perlsolaris 	Perl notes for Solaris
    -    perlvmesa		Perl notes for VM/ESA
    -    perlvms		Perl notes for VMS
    -    perlvos		Perl notes for Stratus VOS
    -    perlwin32		Perl notes for Windows
    -
    -(If you're intending to read these straight through for the first time,
    -the suggested order will tend to reduce the number of forward references.)
    -
    -By default, the manpages listed above are installed in the 
    -F directory.  
    -
    -Extensive additional documentation for Perl modules is available.  The
    -default configuration for perl will place this additional documentation
    -in the F directory (or else in the F
    -subdirectory of the Perl library directory).  Some of this additional
    -documentation is distributed standard with Perl, but you'll also find
    -documentation for third-party modules there.
    -
    -You should be able to view Perl's documentation with your man(1)
    -program by including the proper directories in the appropriate start-up
    -files, or in the MANPATH environment variable.  To find out where the
    -configuration has installed the manpages, type:
    -
    -    perl -V:man.dir
    -
    -If the directories have a common stem, such as F
    -and F, you need only to add that stem
    -(F) to your man(1) configuration files or your MANPATH
    -environment variable.  If they do not share a stem, you'll have to add
    -both stems.
    -
    -If that doesn't work for some reason, you can still use the
    -supplied F script to view module information.  You might
    -also look into getting a replacement man program.
    -
    -If something strange has gone wrong with your program and you're not
    -sure where you should look for help, try the B<-w> switch first.  It
    -will often point out exactly where the trouble is.
    -
    -=head1 DESCRIPTION
    -
    -Perl is a language optimized for scanning arbitrary
    -text files, extracting information from those text files, and printing
    -reports based on that information.  It's also a good language for many
    -system management tasks.  The language is intended to be practical
    -(easy to use, efficient, complete) rather than beautiful (tiny,
    -elegant, minimal).
    -
    -Perl combines (in the author's opinion, anyway) some of the best
    -features of C, B, B, and B, so people familiar with
    -those languages should have little difficulty with it.  (Language
    -historians will also note some vestiges of B, Pascal, and even
    -BASIC-PLUS.)  Expression syntax corresponds closely to C
    -expression syntax.  Unlike most Unix utilities, Perl does not
    -arbitrarily limit the size of your data--if you've got the memory,
    -Perl can slurp in your whole file as a single string.  Recursion is of
    -unlimited depth.  And the tables used by hashes (sometimes called
    -"associative arrays") grow as necessary to prevent degraded
    -performance.  Perl can use sophisticated pattern matching techniques to
    -scan large amounts of data quickly.  Although optimized for
    -scanning text, Perl can also deal with binary data, and can make dbm
    -files look like hashes.  Setuid Perl scripts are safer than C programs
    -through a dataflow tracing mechanism that prevents many stupid
    -security holes.
    -
    -If you have a problem that would ordinarily use B or B or
    -B, but it exceeds their capabilities or must run a little faster,
    -and you don't want to write the silly thing in C, then Perl may be for
    -you.  There are also translators to turn your B and B
    -scripts into Perl scripts.
    -
    -But wait, there's more...
    -
    -Begun in 1993 (see L), Perl version 5 is nearly a complete
    -rewrite that provides the following additional benefits:
    -
    -=over 4
    -
    -=item *
    -
    -modularity and reusability using innumerable modules 
    -
    -Described in L, L, and L.
    -
    -=item *
    -
    -embeddable and extensible 
    -
    -Described in L, L, L, L,
    -L, and L.
    -
    -=item *
    -
    -roll-your-own magic variables (including multiple simultaneous DBM implementations)
    -
    -Described in L and L.
    -
    -=item *
    -
    -subroutines can now be overridden, autoloaded, and prototyped
    -
    -Described in L.
    -
    -=item *
    -
    -arbitrarily nested data structures and anonymous functions
    -
    -Described in L, L, L, and L.
    -
    -=item *
    -
    -object-oriented programming
    -
    -Described in L, L, and L.
    -
    -=item *
    -
    -compilability into C code or Perl bytecode
    -
    -Described in L and L.
    -
    -=item *
    -
    -support for light-weight processes (threads)
    -
    -Described in L and L.
    -
    -=item *
    -
    -support for internationalization, localization, and Unicode 
    -
    -Described in L and L.
    -
    -=item *
    -
    -lexical scoping
    -
    -Described in L.
    -
    -=item *
    -
    -regular expression enhancements
    -
    -Described in L, with additional examples in L.
    -
    -=item *
    -
    -enhanced debugger and interactive Perl environment,
    -with integrated editor support
    -
    -Described in L.
    -
    -=item *
    -
    -POSIX 1003.1 compliant library
    -
    -Described in L.
    -
    -=back
    -
    -Okay, that's I enough hype.
    -
    -=head1 AVAILABILITY
    -
    -Perl is available for most operating systems, including virtually
    -all Unix-like platforms.  See L
    -for a listing.
    -
    -=head1 ENVIRONMENT
    -
    -See L.
    -
    -=head1 AUTHOR
    -
    -Larry Wall , with the help of oodles of other folks.
    -
    -If your Perl success stories and testimonials may be of help to others 
    -who wish to advocate the use of Perl in their applications, 
    -or if you wish to simply express your gratitude to Larry and the 
    -Perl developers, please write to perl-thanks@perl.org .
    -
    -=head1 FILES
    -
    - "@INC"			locations of perl libraries
    -
    -=head1 SEE ALSO
    -
    - a2p	awk to perl translator
    - s2p	sed to perl translator
    -
    - http://www.perl.com/	    the Perl Home Page
    - http://www.perl.com/CPAN   the Comprehensive Perl Archive
    -
    -=head1 DIAGNOSTICS
    -
    -The C pragma (and the B<-w> switch) produces some 
    -lovely diagnostics.
    -
    -See L for explanations of all Perl's diagnostics.  The C pragma automatically turns Perl's normally terse warnings
    -and errors into these longer forms.
    -
    -Compilation errors will tell you the line number of the error, with an
    -indication of the next token or token type that was to be examined.
    -(In a script passed to Perl via B<-e> switches, each
    -B<-e> is counted as one line.)
    -
    -Setuid scripts have additional constraints that can produce error
    -messages such as "Insecure dependency".  See L.
    -
    -Did we mention that you should definitely consider using the B<-w>
    -switch?
    -
    -=head1 BUGS
    -
    -The B<-w> switch is not mandatory.
    -
    -Perl is at the mercy of your machine's definitions of various
    -operations such as type casting, atof(), and floating-point
    -output with sprintf().
    -
    -If your stdio requires a seek or eof between reads and writes on a
    -particular stream, so does Perl.  (This doesn't apply to sysread()
    -and syswrite().)
    -
    -While none of the built-in data types have any arbitrary size limits
    -(apart from memory size), there are still a few arbitrary limits:  a
    -given variable name may not be longer than 251 characters.  Line numbers
    -displayed by diagnostics are internally stored as short integers,
    -so they are limited to a maximum of 65535 (higher numbers usually being
    -affected by wraparound).
    -
    -You may mail your bug reports (be sure to include full configuration
    -information as output by the myconfig program in the perl source
    -tree, or by C) to perlbug@perl.org .  If you've succeeded
    -in compiling perl, the B script in the F subdirectory
    -can be used to help mail in a bug report.
    -
    -Perl actually stands for Pathologically Eclectic Rubbish Lister, but
    -don't tell anyone I said that.
    -
    -=head1 NOTES
    -
    -The Perl motto is "There's more than one way to do it."  Divining
    -how many more is left as an exercise to the reader.
    -
    -The three principal virtues of a programmer are Laziness,
    -Impatience, and Hubris.  See the Camel Book for why.
    -
    diff --git a/lib/perl5/5.6.1/pods/perl5004delta.pod b/lib/perl5/5.6.1/pods/perl5004delta.pod
    deleted file mode 100644
    index 429cba93..00000000
    --- a/lib/perl5/5.6.1/pods/perl5004delta.pod
    +++ /dev/null
    @@ -1,1612 +0,0 @@
    -=head1 NAME
    -
    -perldelta - what's new for perl5.004
    -
    -=head1 DESCRIPTION
    -
    -This document describes differences between the 5.003 release (as
    -documented in I, second edition--the Camel Book) and
    -this one.
    -
    -=head1 Supported Environments
    -
    -Perl5.004 builds out of the box on Unix, Plan 9, LynxOS, VMS, OS/2,
    -QNX, AmigaOS, and Windows NT.  Perl runs on Windows 95 as well, but it
    -cannot be built there, for lack of a reasonable command interpreter.
    -
    -=head1 Core Changes
    -
    -Most importantly, many bugs were fixed, including several security
    -problems.  See the F file in the distribution for details.
    -
    -=head2 List assignment to %ENV works
    -
    -C<%ENV = ()> and C<%ENV = @list> now work as expected (except on VMS
    -where it generates a fatal error).
    -
    -=head2 Change to "Can't locate Foo.pm in @INC" error
    -
    -The error "Can't locate Foo.pm in @INC" now lists the contents of @INC
    -for easier debugging.
    -
    -=head2 Compilation option: Binary compatibility with 5.003
    -
    -There is a new Configure question that asks if you want to maintain
    -binary compatibility with Perl 5.003.  If you choose binary
    -compatibility, you do not have to recompile your extensions, but you
    -might have symbol conflicts if you embed Perl in another application,
    -just as in the 5.003 release.  By default, binary compatibility
    -is preserved at the expense of symbol table pollution.
    -
    -=head2 $PERL5OPT environment variable
    -
    -You may now put Perl options in the $PERL5OPT environment variable.
    -Unless Perl is running with taint checks, it will interpret this
    -variable as if its contents had appeared on a "#!perl" line at the
    -beginning of your script, except that hyphens are optional.  PERL5OPT
    -may only be used to set the following switches: B<-[DIMUdmw]>.
    -
    -=head2 Limitations on B<-M>, B<-m>, and B<-T> options
    -
    -The C<-M> and C<-m> options are no longer allowed on the C<#!> line of
    -a script.  If a script needs a module, it should invoke it with the
    -C pragma.
    -
    -The B<-T> option is also forbidden on the C<#!> line of a script,
    -unless it was present on the Perl command line.  Due to the way C<#!>
    -works, this usually means that B<-T> must be in the first argument.
    -Thus:
    -
    -    #!/usr/bin/perl -T -w
    -
    -will probably work for an executable script invoked as C,
    -while:
    -
    -    #!/usr/bin/perl -w -T
    -
    -will probably fail under the same conditions.  (Non-Unix systems will
    -probably not follow this rule.)  But C is guaranteed
    -to fail, since then there is no chance of B<-T> being found on the
    -command line before it is found on the C<#!> line.
    -
    -=head2 More precise warnings
    -
    -If you removed the B<-w> option from your Perl 5.003 scripts because it
    -made Perl too verbose, we recommend that you try putting it back when
    -you upgrade to Perl 5.004.  Each new perl version tends to remove some
    -undesirable warnings, while adding new warnings that may catch bugs in
    -your scripts.
    -
    -=head2 Deprecated: Inherited C for non-methods
    -
    -Before Perl 5.004, C functions were looked up as methods
    -(using the C<@ISA> hierarchy), even when the function to be autoloaded
    -was called as a plain function (e.g. C), not a method
    -(e.g. C<< Foo->bar() >> or C<< $obj->bar() >>).
    -
    -Perl 5.005 will use method lookup only for methods' Cs.
    -However, there is a significant base of existing code that may be using
    -the old behavior.  So, as an interim step, Perl 5.004 issues an optional
    -warning when a non-method uses an inherited C.
    -
    -The simple rule is:  Inheritance will not work when autoloading
    -non-methods.  The simple fix for old code is:  In any module that used to
    -depend on inheriting C for non-methods from a base class named
    -C, execute C<*AUTOLOAD = \&BaseClass::AUTOLOAD> during startup.
    -
    -=head2 Previously deprecated %OVERLOAD is no longer usable
    -
    -Using %OVERLOAD to define overloading was deprecated in 5.003.
    -Overloading is now defined using the overload pragma. %OVERLOAD is
    -still used internally but should not be used by Perl scripts. See
    -L for more details.
    -
    -=head2 Subroutine arguments created only when they're modified
    -
    -In Perl 5.004, nonexistent array and hash elements used as subroutine
    -parameters are brought into existence only if they are actually
    -assigned to (via C<@_>).
    -
    -Earlier versions of Perl vary in their handling of such arguments.
    -Perl versions 5.002 and 5.003 always brought them into existence.
    -Perl versions 5.000 and 5.001 brought them into existence only if
    -they were not the first argument (which was almost certainly a bug).
    -Earlier versions of Perl never brought them into existence.
    -
    -For example, given this code:
    -
    -     undef @a; undef %a;
    -     sub show { print $_[0] };
    -     sub change { $_[0]++ };
    -     show($a[2]);
    -     change($a{b});
    -
    -After this code executes in Perl 5.004, $a{b} exists but $a[2] does
    -not.  In Perl 5.002 and 5.003, both $a{b} and $a[2] would have existed
    -(but $a[2]'s value would have been undefined).
    -
    -=head2 Group vector changeable with C<$)>
    -
    -The C<$)> special variable has always (well, in Perl 5, at least)
    -reflected not only the current effective group, but also the group list
    -as returned by the C C function (if there is one).
    -However, until this release, there has not been a way to call the
    -C C function from Perl.
    -
    -In Perl 5.004, assigning to C<$)> is exactly symmetrical with examining
    -it: The first number in its string value is used as the effective gid;
    -if there are any numbers after the first one, they are passed to the
    -C C function (if there is one).
    -
    -=head2 Fixed parsing of $$, &$, etc.
    -
    -Perl versions before 5.004 misinterpreted any type marker followed by
    -"$" and a digit.  For example, "$$0" was incorrectly taken to mean
    -"${$}0" instead of "${$0}".  This bug is (mostly) fixed in Perl 5.004.
    -
    -However, the developers of Perl 5.004 could not fix this bug completely,
    -because at least two widely-used modules depend on the old meaning of
    -"$$0" in a string.  So Perl 5.004 still interprets "$$" in the
    -old (broken) way inside strings; but it generates this message as a
    -warning.  And in Perl 5.005, this special treatment will cease.
    -
    -=head2 Fixed localization of $, $&, etc.
    -
    -Perl versions before 5.004 did not always properly localize the
    -regex-related special variables.  Perl 5.004 does localize them, as
    -the documentation has always said it should.  This may result in $1,
    -$2, etc. no longer being set where existing programs use them.
    -
    -=head2 No resetting of $. on implicit close
    -
    -The documentation for Perl 5.0 has always stated that C<$.> is I
    -reset when an already-open file handle is reopened with no intervening
    -call to C.  Due to a bug, perl versions 5.000 through 5.003
    -I reset C<$.> under that circumstance; Perl 5.004 does not.
    -
    -=head2 C may return undef
    -
    -The C operator returns true if a subroutine is expected to
    -return a list, and false otherwise.  In Perl 5.004, C can
    -also return the undefined value if a subroutine's return value will
    -not be used at all, which allows subroutines to avoid a time-consuming
    -calculation of a return value if it isn't going to be used.
    -
    -=head2 C determines value of EXPR in scalar context
    -
    -Perl (version 5) used to determine the value of EXPR inconsistently,
    -sometimes incorrectly using the surrounding context for the determination.
    -Now, the value of EXPR (before being parsed by eval) is always determined in
    -a scalar context.  Once parsed, it is executed as before, by providing
    -the context that the scope surrounding the eval provided.  This change
    -makes the behavior Perl4 compatible, besides fixing bugs resulting from
    -the inconsistent behavior.  This program:
    -
    -    @a = qw(time now is time);
    -    print eval @a;
    -    print '|', scalar eval @a;
    -
    -used to print something like "timenowis881399109|4", but now (and in perl4)
    -prints "4|4".
    -
    -=head2 Changes to tainting checks
    -
    -A bug in previous versions may have failed to detect some insecure
    -conditions when taint checks are turned on.  (Taint checks are used
    -in setuid or setgid scripts, or when explicitly turned on with the
    -C<-T> invocation option.)  Although it's unlikely, this may cause a
    -previously-working script to now fail -- which should be construed
    -as a blessing, since that indicates a potentially-serious security
    -hole was just plugged.
    -
    -The new restrictions when tainting include:
    -
    -=over 4
    -
    -=item No glob() or <*>
    -
    -These operators may spawn the C shell (csh), which cannot be made
    -safe.  This restriction will be lifted in a future version of Perl
    -when globbing is implemented without the use of an external program.
    -
    -=item No spawning if tainted $CDPATH, $ENV, $BASH_ENV
    -
    -These environment variables may alter the behavior of spawned programs
    -(especially shells) in ways that subvert security.  So now they are
    -treated as dangerous, in the manner of $IFS and $PATH.
    -
    -=item No spawning if tainted $TERM doesn't look like a terminal name
    -
    -Some termcap libraries do unsafe things with $TERM.  However, it would be
    -unnecessarily harsh to treat all $TERM values as unsafe, since only shell
    -metacharacters can cause trouble in $TERM.  So a tainted $TERM is
    -considered to be safe if it contains only alphanumerics, underscores,
    -dashes, and colons, and unsafe if it contains other characters (including
    -whitespace).
    -
    -=back
    -
    -=head2 New Opcode module and revised Safe module
    -
    -A new Opcode module supports the creation, manipulation and
    -application of opcode masks.  The revised Safe module has a new API
    -and is implemented using the new Opcode module.  Please read the new
    -Opcode and Safe documentation.
    -
    -=head2 Embedding improvements
    -
    -In older versions of Perl it was not possible to create more than one
    -Perl interpreter instance inside a single process without leaking like a
    -sieve and/or crashing.  The bugs that caused this behavior have all been
    -fixed.  However, you still must take care when embedding Perl in a C
    -program.  See the updated perlembed manpage for tips on how to manage
    -your interpreters.
    -
    -=head2 Internal change: FileHandle class based on IO::* classes
    -
    -File handles are now stored internally as type IO::Handle.  The
    -FileHandle module is still supported for backwards compatibility, but
    -it is now merely a front end to the IO::* modules -- specifically,
    -IO::Handle, IO::Seekable, and IO::File.  We suggest, but do not
    -require, that you use the IO::* modules in new code.
    -
    -In harmony with this change, C<*GLOB{FILEHANDLE}> is now just a
    -backward-compatible synonym for C<*GLOB{IO}>.
    -
    -=head2 Internal change: PerlIO abstraction interface
    -
    -It is now possible to build Perl with AT&T's sfio IO package
    -instead of stdio.  See L for more details, and
    -the F file for how to use it.
    -
    -=head2 New and changed syntax
    -
    -=over 4
    -
    -=item $coderef->(PARAMS)
    -
    -A subroutine reference may now be suffixed with an arrow and a
    -(possibly empty) parameter list.  This syntax denotes a call of the
    -referenced subroutine, with the given parameters (if any).
    -
    -This new syntax follows the pattern of S{FOO} >>> and
    -S[$foo] >>>: You may now write S> as
    -S($foo) >>>.  All these arrow terms may be chained;
    -thus, S{FOO}}($bar) >>> may now be written
    -S{FOO}->($bar) >>>.
    -
    -=back
    -
    -=head2 New and changed builtin constants
    -
    -=over 4
    -
    -=item __PACKAGE__
    -
    -The current package name at compile time, or the undefined value if
    -there is no current package (due to a C directive).  Like
    -C<__FILE__> and C<__LINE__>, C<__PACKAGE__> does I interpolate
    -into strings.
    -
    -=back
    -
    -=head2 New and changed builtin variables
    -
    -=over 4
    -
    -=item $^E
    -
    -Extended error message on some platforms.  (Also known as
    -$EXTENDED_OS_ERROR if you C).
    -
    -=item $^H
    -
    -The current set of syntax checks enabled by C.  See the
    -documentation of C for more details.  Not actually new, but
    -newly documented.
    -Because it is intended for internal use by Perl core components,
    -there is no C long name for this variable.
    -
    -=item $^M
    -
    -By default, running out of memory it is not trappable.  However, if
    -compiled for this, Perl may use the contents of C<$^M> as an emergency
    -pool after die()ing with this message.  Suppose that your Perl were
    -compiled with -DPERL_EMERGENCY_SBRK and used Perl's malloc.  Then
    -
    -    $^M = 'a' x (1<<16);
    -
    -would allocate a 64K buffer for use when in emergency.
    -See the F file for information on how to enable this option.
    -As a disincentive to casual use of this advanced feature,
    -there is no C long name for this variable.
    -
    -=back
    -
    -=head2 New and changed builtin functions
    -
    -=over 4
    -
    -=item delete on slices
    -
    -This now works.  (e.g. C)
    -
    -=item flock
    -
    -is now supported on more platforms, prefers fcntl to lockf when
    -emulating, and always flushes before (un)locking.
    -
    -=item printf and sprintf
    -
    -Perl now implements these functions itself; it doesn't use the C
    -library function sprintf() any more, except for floating-point
    -numbers, and even then only known flags are allowed.  As a result, it
    -is now possible to know which conversions and flags will work, and
    -what they will do.
    -
    -The new conversions in Perl's sprintf() are:
    -
    -   %i	a synonym for %d
    -   %p	a pointer (the address of the Perl value, in hexadecimal)
    -   %n	special: *stores* the number of characters output so far
    -        into the next variable in the parameter list 
    -
    -The new flags that go between the C<%> and the conversion are:
    -
    -   #	prefix octal with "0", hex with "0x"
    -   h	interpret integer as C type "short" or "unsigned short"
    -   V	interpret integer as Perl's standard integer type
    -
    -Also, where a number would appear in the flags, an asterisk ("*") may
    -be used instead, in which case Perl uses the next item in the
    -parameter list as the given number (that is, as the field width or
    -precision).  If a field width obtained through "*" is negative, it has
    -the same effect as the '-' flag: left-justification.
    -
    -See L for a complete list of conversion and flags.
    -
    -=item keys as an lvalue
    -
    -As an lvalue, C allows you to increase the number of hash buckets
    -allocated for the given hash.  This can gain you a measure of efficiency if
    -you know the hash is going to get big.  (This is similar to pre-extending
    -an array by assigning a larger number to $#array.)  If you say
    -
    -    keys %hash = 200;
    -
    -then C<%hash> will have at least 200 buckets allocated for it.  These
    -buckets will be retained even if you do C<%hash = ()>; use C if you want to free the storage while C<%hash> is still in scope.
    -You can't shrink the number of buckets allocated for the hash using
    -C in this way (but you needn't worry about doing this by accident,
    -as trying has no effect).
    -
    -=item my() in Control Structures
    -
    -You can now use my() (with or without the parentheses) in the control
    -expressions of control structures such as:
    -
    -    while (defined(my $line = <>)) {
    -        $line = lc $line;
    -    } continue {
    -        print $line;
    -    }
    -
    -    if ((my $answer = ) =~ /^y(es)?$/i) {
    -        user_agrees();
    -    } elsif ($answer =~ /^n(o)?$/i) {
    -        user_disagrees();
    -    } else {
    -        chomp $answer;
    -        die "`$answer' is neither `yes' nor `no'";
    -    }
    -
    -Also, you can declare a foreach loop control variable as lexical by
    -preceding it with the word "my".  For example, in:
    -
    -    foreach my $i (1, 2, 3) {
    -        some_function();
    -    }
    -
    -$i is a lexical variable, and the scope of $i extends to the end of
    -the loop, but not beyond it.
    -
    -Note that you still cannot use my() on global punctuation variables
    -such as $_ and the like.
    -
    -=item pack() and unpack()
    -
    -A new format 'w' represents a BER compressed integer (as defined in
    -ASN.1).  Its format is a sequence of one or more bytes, each of which
    -provides seven bits of the total value, with the most significant
    -first.  Bit eight of each byte is set, except for the last byte, in
    -which bit eight is clear.
    -
    -If 'p' or 'P' are given undef as values, they now generate a NULL
    -pointer.
    -
    -Both pack() and unpack() now fail when their templates contain invalid
    -types.  (Invalid types used to be ignored.)
    -
    -=item sysseek()
    -
    -The new sysseek() operator is a variant of seek() that sets and gets the
    -file's system read/write position, using the lseek(2) system call.  It is
    -the only reliable way to seek before using sysread() or syswrite().  Its
    -return value is the new position, or the undefined value on failure.
    -
    -=item use VERSION
    -
    -If the first argument to C is a number, it is treated as a version
    -number instead of a module name.  If the version of the Perl interpreter
    -is less than VERSION, then an error message is printed and Perl exits
    -immediately.  Because C occurs at compile time, this check happens
    -immediately during the compilation process, unlike C,
    -which waits until runtime for the check.  This is often useful if you
    -need to check the current Perl version before Cing library modules
    -which have changed in incompatible ways from older versions of Perl.
    -(We try not to do this more than we have to.)
    -
    -=item use Module VERSION LIST
    -
    -If the VERSION argument is present between Module and LIST, then the
    -C will call the VERSION method in class Module with the given
    -version as an argument.  The default VERSION method, inherited from
    -the UNIVERSAL class, croaks if the given version is larger than the
    -value of the variable $Module::VERSION.  (Note that there is not a
    -comma after VERSION!)
    -
    -This version-checking mechanism is similar to the one currently used
    -in the Exporter module, but it is faster and can be used with modules
    -that don't use the Exporter.  It is the recommended method for new
    -code.
    -
    -=item prototype(FUNCTION)
    -
    -Returns the prototype of a function as a string (or C if the
    -function has no prototype).  FUNCTION is a reference to or the name of the
    -function whose prototype you want to retrieve.
    -(Not actually new; just never documented before.)
    -
    -=item srand
    -
    -The default seed for C, which used to be C was
    -(mis)interpreted as C.  This bug has been fixed in 5.004.
    -
    -=item nested C closures work now
    -
    -Prior to the 5.004 release, nested anonymous functions didn't work
    -right.  They do now.
    -
    -=item formats work right on changing lexicals
    -
    -Just like anonymous functions that contain lexical variables
    -that change (like a lexical index variable for a C loop),
    -formats now work properly.  For example, this silently failed
    -before (printed only zeros), but is fine now:
    -
    -    my $i;
    -    foreach $i ( 1 .. 10 ) {
    -	write;
    -    }
    -    format =
    -	my i is @#
    -	$i
    -    .
    -
    -However, it still fails (without a warning) if the foreach is within a
    -subroutine:
    -
    -    my $i;
    -    sub foo {
    -      foreach $i ( 1 .. 10 ) {
    -	write;
    -      }
    -    }
    -    foo;
    -    format =
    -	my i is @#
    -	$i
    -    .
    -
    -=back
    -
    -=head2 New builtin methods
    -
    -The C package automatically contains the following methods that
    -are inherited by all other classes:
    -
    -=over 4
    -
    -=item isa(CLASS)
    -
    -C returns I if its object is blessed into a subclass of C
    -
    -C is also exportable and can be called as a sub with two arguments. This
    -allows the ability to check what a reference points to. Example:
    -
    -    use UNIVERSAL qw(isa);
    -
    -    if(isa($ref, 'ARRAY')) {
    -       ...
    -    }
    -
    -=item can(METHOD)
    -
    -C checks to see if its object has a method called C,
    -if it does then a reference to the sub is returned; if it does not then
    -I is returned.
    -
    -=item VERSION( [NEED] )
    -
    -C returns the version number of the class (package).  If the
    -NEED argument is given then it will check that the current version (as
    -defined by the $VERSION variable in the given package) not less than
    -NEED; it will die if this is not the case.  This method is normally
    -called as a class method.  This method is called automatically by the
    -C form of C.
    -
    -    use A 1.2 qw(some imported subs);
    -    # implies:
    -    A->VERSION(1.2);
    -
    -=back
    -
    -B C directly uses Perl's internal code for method lookup, and
    -C uses a very similar method and caching strategy. This may cause
    -strange effects if the Perl code dynamically changes @ISA in any package.
    -
    -You may add other methods to the UNIVERSAL class via Perl or XS code.
    -You do not need to C in order to make these methods
    -available to your program.  This is necessary only if you wish to
    -have C available as a plain subroutine in the current package.
    -
    -=head2 TIEHANDLE now supported
    -
    -See L for other kinds of tie()s.
    -
    -=over 4
    -
    -=item TIEHANDLE classname, LIST
    -
    -This is the constructor for the class.  That means it is expected to
    -return an object of some sort. The reference can be used to
    -hold some internal information.
    -
    -    sub TIEHANDLE {
    -	print "\n";
    -	my $i;
    -	return bless \$i, shift;
    -    }
    -
    -=item PRINT this, LIST
    -
    -This method will be triggered every time the tied handle is printed to.
    -Beyond its self reference it also expects the list that was passed to
    -the print function.
    -
    -    sub PRINT {
    -	$r = shift;
    -	$$r++;
    -	return print join( $, => map {uc} @_), $\;
    -    }
    -
    -=item PRINTF this, LIST
    -
    -This method will be triggered every time the tied handle is printed to
    -with the C function.
    -Beyond its self reference it also expects the format and list that was
    -passed to the printf function.
    -
    -    sub PRINTF {
    -        shift;
    -	  my $fmt = shift;
    -        print sprintf($fmt, @_)."\n";
    -    }
    -
    -=item READ this LIST
    -
    -This method will be called when the handle is read from via the C
    -or C functions.
    -
    -    sub READ {
    -	$r = shift;
    -	my($buf,$len,$offset) = @_;
    -	print "READ called, \$buf=$buf, \$len=$len, \$offset=$offset";
    -    }
    -
    -=item READLINE this
    -
    -This method will be called when the handle is read from. The method
    -should return undef when there is no more data.
    -
    -    sub READLINE {
    -	$r = shift;
    -	return "PRINT called $$r times\n"
    -    }
    -
    -=item GETC this
    -
    -This method will be called when the C function is called.
    -
    -    sub GETC { print "Don't GETC, Get Perl"; return "a"; }
    -
    -=item DESTROY this
    -
    -As with the other types of ties, this method will be called when the
    -tied handle is about to be destroyed. This is useful for debugging and
    -possibly for cleaning up.
    -
    -    sub DESTROY {
    -	print "\n";
    -    }
    -
    -=back
    -
    -=head2 Malloc enhancements
    -
    -If perl is compiled with the malloc included with the perl distribution
    -(that is, if C is 'define') then you can print
    -memory statistics at runtime by running Perl thusly:
    -
    -  env PERL_DEBUG_MSTATS=2 perl your_script_here
    -
    -The value of 2 means to print statistics after compilation and on
    -exit; with a value of 1, the statistics are printed only on exit.
    -(If you want the statistics at an arbitrary time, you'll need to
    -install the optional module Devel::Peek.)
    -
    -Three new compilation flags are recognized by malloc.c.  (They have no
    -effect if perl is compiled with system malloc().)
    -
    -=over 4
    -
    -=item -DPERL_EMERGENCY_SBRK
    -
    -If this macro is defined, running out of memory need not be a fatal
    -error: a memory pool can allocated by assigning to the special
    -variable C<$^M>.  See L<"$^M">.
    -
    -=item -DPACK_MALLOC
    -
    -Perl memory allocation is by bucket with sizes close to powers of two.
    -Because of these malloc overhead may be big, especially for data of
    -size exactly a power of two.  If C is defined, perl uses
    -a slightly different algorithm for small allocations (up to 64 bytes
    -long), which makes it possible to have overhead down to 1 byte for
    -allocations which are powers of two (and appear quite often).
    -
    -Expected memory savings (with 8-byte alignment in C) is
    -about 20% for typical Perl usage.  Expected slowdown due to additional
    -malloc overhead is in fractions of a percent (hard to measure, because
    -of the effect of saved memory on speed).
    -
    -=item -DTWO_POT_OPTIMIZE
    -
    -Similarly to C, this macro improves allocations of data
    -with size close to a power of two; but this works for big allocations
    -(starting with 16K by default).  Such allocations are typical for big
    -hashes and special-purpose scripts, especially image processing.
    -
    -On recent systems, the fact that perl requires 2M from system for 1M
    -allocation will not affect speed of execution, since the tail of such
    -a chunk is not going to be touched (and thus will not require real
    -memory).  However, it may result in a premature out-of-memory error.
    -So if you will be manipulating very large blocks with sizes close to
    -powers of two, it would be wise to define this macro.
    -
    -Expected saving of memory is 0-100% (100% in applications which
    -require most memory in such 2**n chunks); expected slowdown is
    -negligible.
    -
    -=back
    -
    -=head2 Miscellaneous efficiency enhancements
    -
    -Functions that have an empty prototype and that do nothing but return
    -a fixed value are now inlined (e.g. C).
    -
    -Each unique hash key is only allocated once, no matter how many hashes
    -have an entry with that key.  So even if you have 100 copies of the
    -same hash, the hash keys never have to be reallocated.
    -
    -=head1 Support for More Operating Systems
    -
    -Support for the following operating systems is new in Perl 5.004.
    -
    -=head2 Win32
    -
    -Perl 5.004 now includes support for building a "native" perl under
    -Windows NT, using the Microsoft Visual C++ compiler (versions 2.0
    -and above) or the Borland C++ compiler (versions 5.02 and above).
    -The resulting perl can be used under Windows 95 (if it
    -is installed in the same directory locations as it got installed
    -in Windows NT).  This port includes support for perl extension
    -building tools like L and L, so that many extensions
    -available on the Comprehensive Perl Archive Network (CPAN) can now be
    -readily built under Windows NT.  See http://www.perl.com/ for more
    -information on CPAN and F in the perl distribution for more
    -details on how to get started with building this port.
    -
    -There is also support for building perl under the Cygwin32 environment.
    -Cygwin32 is a set of GNU tools that make it possible to compile and run
    -many Unix programs under Windows NT by providing a mostly Unix-like 
    -interface for compilation and execution.  See F in the
    -perl distribution for more details on this port and how to obtain the
    -Cygwin32 toolkit.
    -
    -=head2 Plan 9
    -
    -See F in the perl distribution.
    -
    -=head2 QNX
    -
    -See F in the perl distribution.
    -
    -=head2 AmigaOS
    -
    -See F in the perl distribution.
    -
    -=head1 Pragmata
    -
    -Six new pragmatic modules exist:
    -
    -=over 4
    -
    -=item use autouse MODULE => qw(sub1 sub2 sub3)
    -
    -Defers C until someone calls one of the specified
    -subroutines (which must be exported by MODULE).  This pragma should be
    -used with caution, and only when necessary.
    -
    -=item use blib
    -
    -=item use blib 'dir'
    -
    -Looks for MakeMaker-like I<'blib'> directory structure starting in
    -I (or current directory) and working back up to five levels of
    -parent directories.
    -
    -Intended for use on command line with B<-M> option as a way of testing
    -arbitrary scripts against an uninstalled version of a package.
    -
    -=item use constant NAME => VALUE
    -
    -Provides a convenient interface for creating compile-time constants,
    -See L.
    -
    -=item use locale
    -
    -Tells the compiler to enable (or disable) the use of POSIX locales for
    -builtin operations.
    -
    -When C is in effect, the current LC_CTYPE locale is used
    -for regular expressions and case mapping; LC_COLLATE for string
    -ordering; and LC_NUMERIC for numeric formatting in printf and sprintf
    -(but B in print).  LC_NUMERIC is always used in write, since
    -lexical scoping of formats is problematic at best.
    -
    -Each C or C affects statements to the end of
    -the enclosing BLOCK or, if not inside a BLOCK, to the end of the
    -current file.  Locales can be switched and queried with
    -POSIX::setlocale().
    -
    -See L for more information.
    -
    -=item use ops
    -
    -Disable unsafe opcodes, or any named opcodes, when compiling Perl code.
    -
    -=item use vmsish
    -
    -Enable VMS-specific language features.  Currently, there are three
    -VMS-specific features available: 'status', which makes C<$?> and
    -C return genuine VMS status values instead of emulating POSIX;
    -'exit', which makes C take a genuine VMS status value instead of
    -assuming that C is an error; and 'time', which makes all times
    -relative to the local time zone, in the VMS tradition.
    -
    -=back
    -
    -=head1 Modules
    -
    -=head2 Required Updates
    -
    -Though Perl 5.004 is compatible with almost all modules that work
    -with Perl 5.003, there are a few exceptions:
    -
    -    Module   Required Version for Perl 5.004
    -    ------   -------------------------------
    -    Filter   Filter-1.12
    -    LWP      libwww-perl-5.08
    -    Tk       Tk400.202 (-w makes noise)
    -
    -Also, the majordomo mailing list program, version 1.94.1, doesn't work
    -with Perl 5.004 (nor with perl 4), because it executes an invalid
    -regular expression.  This bug is fixed in majordomo version 1.94.2.
    -
    -=head2 Installation directories
    -
    -The I script now places the Perl source files for
    -extensions in the architecture-specific library directory, which is
    -where the shared libraries for extensions have always been.  This
    -change is intended to allow administrators to keep the Perl 5.004
    -library directory unchanged from a previous version, without running
    -the risk of binary incompatibility between extensions' Perl source and
    -shared libraries.
    -
    -=head2 Module information summary
    -
    -Brand new modules, arranged by topic rather than strictly
    -alphabetically:
    -
    -    CGI.pm               Web server interface ("Common Gateway Interface")
    -    CGI/Apache.pm        Support for Apache's Perl module
    -    CGI/Carp.pm          Log server errors with helpful context
    -    CGI/Fast.pm          Support for FastCGI (persistent server process)
    -    CGI/Push.pm          Support for server push
    -    CGI/Switch.pm        Simple interface for multiple server types
    -
    -    CPAN                 Interface to Comprehensive Perl Archive Network
    -    CPAN::FirstTime      Utility for creating CPAN configuration file
    -    CPAN::Nox            Runs CPAN while avoiding compiled extensions
    -
    -    IO.pm                Top-level interface to IO::* classes
    -    IO/File.pm           IO::File extension Perl module
    -    IO/Handle.pm         IO::Handle extension Perl module
    -    IO/Pipe.pm           IO::Pipe extension Perl module
    -    IO/Seekable.pm       IO::Seekable extension Perl module
    -    IO/Select.pm         IO::Select extension Perl module
    -    IO/Socket.pm         IO::Socket extension Perl module
    -
    -    Opcode.pm            Disable named opcodes when compiling Perl code
    -
    -    ExtUtils/Embed.pm    Utilities for embedding Perl in C programs
    -    ExtUtils/testlib.pm  Fixes up @INC to use just-built extension
    -
    -    FindBin.pm           Find path of currently executing program
    -
    -    Class/Struct.pm      Declare struct-like datatypes as Perl classes
    -    File/stat.pm         By-name interface to Perl's builtin stat
    -    Net/hostent.pm       By-name interface to Perl's builtin gethost*
    -    Net/netent.pm        By-name interface to Perl's builtin getnet*
    -    Net/protoent.pm      By-name interface to Perl's builtin getproto*
    -    Net/servent.pm       By-name interface to Perl's builtin getserv*
    -    Time/gmtime.pm       By-name interface to Perl's builtin gmtime
    -    Time/localtime.pm    By-name interface to Perl's builtin localtime
    -    Time/tm.pm           Internal object for Time::{gm,local}time
    -    User/grent.pm        By-name interface to Perl's builtin getgr*
    -    User/pwent.pm        By-name interface to Perl's builtin getpw*
    -
    -    Tie/RefHash.pm       Base class for tied hashes with references as keys
    -
    -    UNIVERSAL.pm         Base class for *ALL* classes
    -
    -=head2 Fcntl
    -
    -New constants in the existing Fcntl modules are now supported,
    -provided that your operating system happens to support them:
    -
    -    F_GETOWN F_SETOWN
    -    O_ASYNC O_DEFER O_DSYNC O_FSYNC O_SYNC
    -    O_EXLOCK O_SHLOCK
    -
    -These constants are intended for use with the Perl operators sysopen()
    -and fcntl() and the basic database modules like SDBM_File.  For the
    -exact meaning of these and other Fcntl constants please refer to your
    -operating system's documentation for fcntl() and open().
    -
    -In addition, the Fcntl module now provides these constants for use
    -with the Perl operator flock():
    -
    -	LOCK_SH LOCK_EX LOCK_NB LOCK_UN
    -
    -These constants are defined in all environments (because where there is
    -no flock() system call, Perl emulates it).  However, for historical
    -reasons, these constants are not exported unless they are explicitly
    -requested with the ":flock" tag (e.g. C).
    -
    -=head2 IO
    -
    -The IO module provides a simple mechanism to load all the IO modules at one
    -go.  Currently this includes:
    -
    -     IO::Handle
    -     IO::Seekable
    -     IO::File
    -     IO::Pipe
    -     IO::Socket
    -
    -For more information on any of these modules, please see its
    -respective documentation.
    -
    -=head2 Math::Complex
    -
    -The Math::Complex module has been totally rewritten, and now supports
    -more operations.  These are overloaded:
    -
    -     + - * / ** <=> neg ~ abs sqrt exp log sin cos atan2 "" (stringify)
    -
    -And these functions are now exported:
    -
    -    pi i Re Im arg
    -    log10 logn ln cbrt root
    -    tan
    -    csc sec cot
    -    asin acos atan
    -    acsc asec acot
    -    sinh cosh tanh
    -    csch sech coth
    -    asinh acosh atanh
    -    acsch asech acoth
    -    cplx cplxe
    -
    -=head2 Math::Trig
    -
    -This new module provides a simpler interface to parts of Math::Complex for
    -those who need trigonometric functions only for real numbers.
    -
    -=head2 DB_File
    -
    -There have been quite a few changes made to DB_File. Here are a few of
    -the highlights:
    -
    -=over 4
    -
    -=item *
    -
    -Fixed a handful of bugs.
    -
    -=item *
    -
    -By public demand, added support for the standard hash function exists().
    -
    -=item *
    -
    -Made it compatible with Berkeley DB 1.86.
    -
    -=item *
    -
    -Made negative subscripts work with RECNO interface.
    -
    -=item *
    -
    -Changed the default flags from O_RDWR to O_CREAT|O_RDWR and the default
    -mode from 0640 to 0666.
    -
    -=item *
    -
    -Made DB_File automatically import the open() constants (O_RDWR,
    -O_CREAT etc.) from Fcntl, if available.
    -
    -=item *
    -
    -Updated documentation.
    -
    -=back
    -
    -Refer to the HISTORY section in DB_File.pm for a complete list of
    -changes. Everything after DB_File 1.01 has been added since 5.003.
    -
    -=head2 Net::Ping
    -
    -Major rewrite - support added for both udp echo and real icmp pings.
    -
    -=head2 Object-oriented overrides for builtin operators
    -
    -Many of the Perl builtins returning lists now have
    -object-oriented overrides.  These are:
    -
    -    File::stat
    -    Net::hostent
    -    Net::netent
    -    Net::protoent
    -    Net::servent
    -    Time::gmtime
    -    Time::localtime
    -    User::grent
    -    User::pwent
    -
    -For example, you can now say
    -
    -    use File::stat;
    -    use User::pwent;
    -    $his = (stat($filename)->st_uid == pwent($whoever)->pw_uid);
    -
    -=head1 Utility Changes
    -
    -=head2 pod2html
    -
    -=over 4
    -
    -=item Sends converted HTML to standard output
    -
    -The I utility included with Perl 5.004 is entirely new.
    -By default, it sends the converted HTML to its standard output,
    -instead of writing it to a file like Perl 5.003's I did.
    -Use the B<--outfile=FILENAME> option to write to a file.
    -
    -=back
    -
    -=head2 xsubpp
    -
    -=over 4
    -
    -=item C XSUBs now default to returning nothing
    -
    -Due to a documentation/implementation bug in previous versions of
    -Perl, XSUBs with a return type of C have actually been
    -returning one value.  Usually that value was the GV for the XSUB,
    -but sometimes it was some already freed or reused value, which would
    -sometimes lead to program failure.
    -
    -In Perl 5.004, if an XSUB is declared as returning C, it
    -actually returns no value, i.e. an empty list (though there is a
    -backward-compatibility exception; see below).  If your XSUB really
    -does return an SV, you should give it a return type of C.
    -
    -For backward compatibility, I tries to guess whether a
    -C XSUB is really C or if it wants to return an C.
    -It does so by examining the text of the XSUB: if I finds
    -what looks like an assignment to C, it assumes that the
    -XSUB's return type is really C.
    -
    -=back
    -
    -=head1 C Language API Changes
    -
    -=over 4
    -
    -=item C and C
    -
    -The C function finds a method for an object, just like
    -in Perl 5.003.  The GV it returns may be a method cache entry.
    -However, in Perl 5.004, method cache entries are not visible to users;
    -therefore, they can no longer be passed directly to C.
    -Instead, you should use the C macro on the GV to extract its CV,
    -and pass the CV to C.
    -
    -The most likely symptom of passing the result of C to
    -C is Perl's producing an "Undefined subroutine called"
    -error on the I call to a given method (since there is no cache
    -on the first call).
    -
    -=item C
    -
    -A new function handy for eval'ing strings of Perl code inside C code.
    -This function returns the value from the eval statement, which can
    -be used instead of fetching globals from the symbol table.  See
    -L, L and L for details and examples.
    -
    -=item Extended API for manipulating hashes
    -
    -Internal handling of hash keys has changed.  The old hashtable API is
    -still fully supported, and will likely remain so.  The additions to the
    -API allow passing keys as Cs, so that C hashes can be given
    -real scalars as keys rather than plain strings (nontied hashes still
    -can only use strings as keys).  New extensions must use the new hash
    -access functions and macros if they wish to use C keys.  These
    -additions also make it feasible to manipulate Cs (hash entries),
    -which can be more efficient.  See L for details.
    -
    -=back
    -
    -=head1 Documentation Changes
    -
    -Many of the base and library pods were updated.  These
    -new pods are included in section 1:
    -
    -=over 4
    -
    -=item L
    -
    -This document.
    -
    -=item L
    -
    -Frequently asked questions.
    -
    -=item L
    -
    -Locale support (internationalization and localization).
    -
    -=item L
    -
    -Tutorial on Perl OO programming.
    -
    -=item L
    -
    -Perl internal IO abstraction interface.
    -
    -=item L
    -
    -Perl module library and recommended practice for module creation.
    -Extracted from L (which is much smaller as a result).
    -
    -=item L
    -
    -Although not new, this has been massively updated.
    -
    -=item L
    -
    -Although not new, this has been massively updated.
    -
    -=back
    -
    -=head1 New Diagnostics
    -
    -Several new conditions will trigger warnings that were
    -silent before.  Some only affect certain platforms.
    -The following new warnings and errors outline these.
    -These messages are classified as follows (listed in
    -increasing order of desperation):
    -
    -   (W) A warning (optional).
    -   (D) A deprecation (optional).
    -   (S) A severe warning (mandatory).
    -   (F) A fatal error (trappable).
    -   (P) An internal error you should never see (trappable).
    -   (X) A very fatal error (nontrappable).
    -   (A) An alien error message (not generated by Perl).
    -
    -=over 4
    -
    -=item "my" variable %s masks earlier declaration in same scope
    -
    -(W) A lexical variable has been redeclared in the same scope, effectively
    -eliminating all access to the previous instance.  This is almost always
    -a typographical error.  Note that the earlier variable will still exist
    -until the end of the scope or until all closure referents to it are
    -destroyed.
    -
    -=item %s argument is not a HASH element or slice
    -
    -(F) The argument to delete() must be either a hash element, such as
    -
    -    $foo{$bar}
    -    $ref->[12]->{"susie"}
    -
    -or a hash slice, such as
    -
    -    @foo{$bar, $baz, $xyzzy}
    -    @{$ref->[12]}{"susie", "queue"}
    -
    -=item Allocation too large: %lx
    -
    -(X) You can't allocate more than 64K on an MS-DOS machine.
    -
    -=item Allocation too large
    -
    -(F) You can't allocate more than 2^31+"small amount" bytes.
    -
    -=item Applying %s to %s will act on scalar(%s)
    -
    -(W) The pattern match (//), substitution (s///), and transliteration (tr///)
    -operators work on scalar values.  If you apply one of them to an array
    -or a hash, it will convert the array or hash to a scalar value -- the
    -length of an array, or the population info of a hash -- and then work on
    -that scalar value.  This is probably not what you meant to do.  See
    -L and L for alternatives.
    -
    -=item Attempt to free nonexistent shared string
    -
    -(P) Perl maintains a reference counted internal table of strings to
    -optimize the storage and access of hash keys and other strings.  This
    -indicates someone tried to decrement the reference count of a string
    -that can no longer be found in the table.
    -
    -=item Attempt to use reference as lvalue in substr
    -
    -(W) You supplied a reference as the first argument to substr() used
    -as an lvalue, which is pretty strange.  Perhaps you forgot to
    -dereference it first.  See L.
    -
    -=item Bareword "%s" refers to nonexistent package
    -
    -(W) You used a qualified bareword of the form C, but
    -the compiler saw no other uses of that namespace before that point.
    -Perhaps you need to predeclare a package?
    -
    -=item Can't redefine active sort subroutine %s
    -
    -(F) Perl optimizes the internal handling of sort subroutines and keeps
    -pointers into them.  You tried to redefine one such sort subroutine when it
    -was currently active, which is not allowed.  If you really want to do
    -this, you should write C instead of C.
    -
    -=item Can't use bareword ("%s") as %s ref while "strict refs" in use
    -
    -(F) Only hard references are allowed by "strict refs".  Symbolic references
    -are disallowed.  See L.
    -
    -=item Cannot resolve method `%s' overloading `%s' in package `%s'
    -
    -(P) Internal error trying to resolve overloading specified by a method
    -name (as opposed to a subroutine reference).
    -
    -=item Constant subroutine %s redefined
    -
    -(S) You redefined a subroutine which had previously been eligible for
    -inlining.  See L for commentary and
    -workarounds.
    -
    -=item Constant subroutine %s undefined
    -
    -(S) You undefined a subroutine which had previously been eligible for
    -inlining.  See L for commentary and
    -workarounds.
    -
    -=item Copy method did not return a reference
    -
    -(F) The method which overloads "=" is buggy. See L.
    -
    -=item Died
    -
    -(F) You passed die() an empty string (the equivalent of C) or
    -you called it with no args and both C<$@> and C<$_> were empty.
    -
    -=item Exiting pseudo-block via %s
    -
    -(W) You are exiting a rather special block construct (like a sort block or
    -subroutine) by unconventional means, such as a goto, or a loop control
    -statement.  See L.
    -
    -=item Identifier too long
    -
    -(F) Perl limits identifiers (names for variables, functions, etc.) to
    -252 characters for simple names, somewhat more for compound names (like
    -C<$A::B>).  You've exceeded Perl's limits.  Future versions of Perl are
    -likely to eliminate these arbitrary limitations.
    -
    -=item Illegal character %s (carriage return)
    -
    -(F) A carriage return character was found in the input.  This is an
    -error, and not a warning, because carriage return characters can break
    -multi-line strings, including here documents (e.g., C).
    -
    -=item Illegal switch in PERL5OPT: %s
    -
    -(X) The PERL5OPT environment variable may only be used to set the
    -following switches: B<-[DIMUdmw]>.
    -
    -=item Integer overflow in hex number
    -
    -(S) The literal hex number you have specified is too big for your
    -architecture. On a 32-bit architecture the largest hex literal is
    -0xFFFFFFFF.
    -
    -=item Integer overflow in octal number
    -
    -(S) The literal octal number you have specified is too big for your
    -architecture. On a 32-bit architecture the largest octal literal is
    -037777777777.
    -
    -=item internal error: glob failed
    -
    -(P) Something went wrong with the external program(s) used for C
    -and C<< <*.c> >>.  This may mean that your csh (C shell) is
    -broken.  If so, you should change all of the csh-related variables in
    -config.sh:  If you have tcsh, make the variables refer to it as if it
    -were csh (e.g. C); otherwise, make them all
    -empty (except that C should be C<'undef'>) so that Perl will
    -think csh is missing.  In either case, after editing config.sh, run
    -C<./Configure -S> and rebuild Perl.
    -
    -=item Invalid conversion in %s: "%s"
    -
    -(W) Perl does not understand the given format conversion.
    -See L.
    -
    -=item Invalid type in pack: '%s'
    -
    -(F) The given character is not a valid pack type.  See L.
    -
    -=item Invalid type in unpack: '%s'
    -
    -(F) The given character is not a valid unpack type.  See L.
    -
    -=item Name "%s::%s" used only once: possible typo
    -
    -(W) Typographical errors often show up as unique variable names.
    -If you had a good reason for having a unique name, then just mention
    -it again somehow to suppress the message (the C pragma is
    -provided for just this purpose).
    -
    -=item Null picture in formline
    -
    -(F) The first argument to formline must be a valid format picture
    -specification.  It was found to be empty, which probably means you
    -supplied it an uninitialized value.  See L.
    -
    -=item Offset outside string
    -
    -(F) You tried to do a read/write/send/recv operation with an offset
    -pointing outside the buffer.  This is difficult to imagine.
    -The sole exception to this is that Cing past the buffer
    -will extend the buffer and zero pad the new area.
    -
    -=item Out of memory!
    -
    -(X|F) The malloc() function returned 0, indicating there was insufficient
    -remaining memory (or virtual memory) to satisfy the request.
    -
    -The request was judged to be small, so the possibility to trap it
    -depends on the way Perl was compiled.  By default it is not trappable.
    -However, if compiled for this, Perl may use the contents of C<$^M> as
    -an emergency pool after die()ing with this message.  In this case the
    -error is trappable I.
    -
    -=item Out of memory during request for %s
    -
    -(F) The malloc() function returned 0, indicating there was insufficient
    -remaining memory (or virtual memory) to satisfy the request. However,
    -the request was judged large enough (compile-time default is 64K), so
    -a possibility to shut down by trapping this error is granted.
    -
    -=item panic: frexp
    -
    -(P) The library function frexp() failed, making printf("%f") impossible.
    -
    -=item Possible attempt to put comments in qw() list
    -
    -(W) qw() lists contain items separated by whitespace; as with literal
    -strings, comment characters are not ignored, but are instead treated
    -as literal data.  (You may have used different delimiters than the
    -parentheses shown here; braces are also frequently used.)
    -
    -You probably wrote something like this:
    -
    -    @list = qw(
    -        a # a comment
    -        b # another comment
    -    );
    -
    -when you should have written this:
    -
    -    @list = qw(
    -        a
    -        b
    -    );
    -
    -If you really want comments, build your list the
    -old-fashioned way, with quotes and commas:
    -
    -    @list = (
    -        'a',    # a comment
    -        'b',    # another comment
    -    );
    -
    -=item Possible attempt to separate words with commas
    -
    -(W) qw() lists contain items separated by whitespace; therefore commas
    -aren't needed to separate the items. (You may have used different
    -delimiters than the parentheses shown here; braces are also frequently
    -used.)
    -
    -You probably wrote something like this:
    -
    -    qw! a, b, c !;
    -
    -which puts literal commas into some of the list items.  Write it without
    -commas if you don't want them to appear in your data:
    -
    -    qw! a b c !;
    -
    -=item Scalar value @%s{%s} better written as $%s{%s}
    -
    -(W) You've used a hash slice (indicated by @) to select a single element of
    -a hash.  Generally it's better to ask for a scalar value (indicated by $).
    -The difference is that C<$foo{&bar}> always behaves like a scalar, both when
    -assigning to it and when evaluating its argument, while C<@foo{&bar}> behaves
    -like a list when you assign to it, and provides a list context to its
    -subscript, which can do weird things if you're expecting only one subscript.
    -
    -=item Stub found while resolving method `%s' overloading `%s' in %s
    -
    -(P) Overloading resolution over @ISA tree may be broken by importing stubs.
    -Stubs should never be implicitly created, but explicit calls to C
    -may break this.
    -
    -=item Too late for "B<-T>" option
    -
    -(X) The #! line (or local equivalent) in a Perl script contains the
    -B<-T> option, but Perl was not invoked with B<-T> in its argument
    -list.  This is an error because, by the time Perl discovers a B<-T> in
    -a script, it's too late to properly taint everything from the
    -environment.  So Perl gives up.
    -
    -=item untie attempted while %d inner references still exist
    -
    -(W) A copy of the object returned from C (or C) was still
    -valid when C was called.
    -
    -=item Unrecognized character %s
    -
    -(F) The Perl parser has no idea what to do with the specified character
    -in your Perl script (or eval).  Perhaps you tried to run a compressed
    -script, a binary program, or a directory as a Perl program.
    -
    -=item Unsupported function fork
    -
    -(F) Your version of executable does not support forking.
    -
    -Note that under some systems, like OS/2, there may be different flavors of
    -Perl executables, some of which may support fork, some not. Try changing
    -the name you call Perl by to C, C, and so on.
    -
    -=item Use of "$$" to mean "${$}" is deprecated
    -
    -(D) Perl versions before 5.004 misinterpreted any type marker followed
    -by "$" and a digit.  For example, "$$0" was incorrectly taken to mean
    -"${$}0" instead of "${$0}".  This bug is (mostly) fixed in Perl 5.004.
    -
    -However, the developers of Perl 5.004 could not fix this bug completely,
    -because at least two widely-used modules depend on the old meaning of
    -"$$0" in a string.  So Perl 5.004 still interprets "$$" in the
    -old (broken) way inside strings; but it generates this message as a
    -warning.  And in Perl 5.005, this special treatment will cease.
    -
    -=item Value of %s can be "0"; test with defined()
    -
    -(W) In a conditional expression, you used , <*> (glob), C,
    -or C as a boolean value.  Each of these constructs can return a
    -value of "0"; that would make the conditional expression false, which is
    -probably not what you intended.  When using these constructs in conditional
    -expressions, test their values with the C operator.
    -
    -=item Variable "%s" may be unavailable
    -
    -(W) An inner (nested) I subroutine is inside a I
    -subroutine, and outside that is another subroutine; and the anonymous
    -(innermost) subroutine is referencing a lexical variable defined in
    -the outermost subroutine.  For example:
    -
    -   sub outermost { my $a; sub middle { sub { $a } } }
    -
    -If the anonymous subroutine is called or referenced (directly or
    -indirectly) from the outermost subroutine, it will share the variable
    -as you would expect.  But if the anonymous subroutine is called or
    -referenced when the outermost subroutine is not active, it will see
    -the value of the shared variable as it was before and during the
    -*first* call to the outermost subroutine, which is probably not what
    -you want.
    -
    -In these circumstances, it is usually best to make the middle
    -subroutine anonymous, using the C syntax.  Perl has specific
    -support for shared variables in nested anonymous subroutines; a named
    -subroutine in between interferes with this feature.
    -
    -=item Variable "%s" will not stay shared
    -
    -(W) An inner (nested) I subroutine is referencing a lexical
    -variable defined in an outer subroutine.
    -
    -When the inner subroutine is called, it will probably see the value of
    -the outer subroutine's variable as it was before and during the
    -*first* call to the outer subroutine; in this case, after the first
    -call to the outer subroutine is complete, the inner and outer
    -subroutines will no longer share a common value for the variable.  In
    -other words, the variable will no longer be shared.
    -
    -Furthermore, if the outer subroutine is anonymous and references a
    -lexical variable outside itself, then the outer and inner subroutines
    -will I share the given variable.
    -
    -This problem can usually be solved by making the inner subroutine
    -anonymous, using the C syntax.  When inner anonymous subs that
    -reference variables in outer subroutines are called or referenced,
    -they are automatically rebound to the current values of such
    -variables.
    -
    -=item Warning: something's wrong
    -
    -(W) You passed warn() an empty string (the equivalent of C) or
    -you called it with no args and C<$_> was empty.
    -
    -=item Ill-formed logical name |%s| in prime_env_iter
    -
    -(W) A warning peculiar to VMS.  A logical name was encountered when preparing
    -to iterate over %ENV which violates the syntactic rules governing logical
    -names.  Since it cannot be translated normally, it is skipped, and will not
    -appear in %ENV.  This may be a benign occurrence, as some software packages
    -might directly modify logical name tables and introduce nonstandard names,
    -or it may indicate that a logical name table has been corrupted.
    -
    -=item Got an error from DosAllocMem
    -
    -(P) An error peculiar to OS/2.  Most probably you're using an obsolete
    -version of Perl, and this should not happen anyway.
    -
    -=item Malformed PERLLIB_PREFIX
    -
    -(F) An error peculiar to OS/2.  PERLLIB_PREFIX should be of the form
    -
    -    prefix1;prefix2
    -
    -or
    -
    -    prefix1 prefix2
    -
    -with nonempty prefix1 and prefix2.  If C is indeed a prefix
    -of a builtin library search path, prefix2 is substituted.  The error
    -may appear if components are not found, or are too long.  See
    -"PERLLIB_PREFIX" in F.
    -
    -=item PERL_SH_DIR too long
    -
    -(F) An error peculiar to OS/2. PERL_SH_DIR is the directory to find the
    -C-shell in.  See "PERL_SH_DIR" in F.
    -
    -=item Process terminated by SIG%s
    -
    -(W) This is a standard message issued by OS/2 applications, while *nix
    -applications die in silence.  It is considered a feature of the OS/2
    -port.  One can easily disable this by appropriate sighandlers, see
    -L.  See also "Process terminated by SIGTERM/SIGINT"
    -in F.
    -
    -=back
    -
    -=head1 BUGS
    -
    -If you find what you think is a bug, you might check the headers of
    -recently posted articles in the comp.lang.perl.misc newsgroup.
    -There may also be information at http://www.perl.com/perl/, the Perl
    -Home Page.
    -
    -If you believe you have an unreported bug, please run the B
    -program included with your release.  Make sure you trim your bug down
    -to a tiny but sufficient test case.  Your bug report, along with the
    -output of C, will be sent off to > to be
    -analysed by the Perl porting team.
    -
    -=head1 SEE ALSO
    -
    -The F file for exhaustive details on what changed.
    -
    -The F file for how to build Perl.  This file has been
    -significantly updated for 5.004, so even veteran users should
    -look through it.
    -
    -The F file for general stuff.
    -
    -The F file for copyright information.
    -
    -=head1 HISTORY
    -
    -Constructed by Tom Christiansen, grabbing material with permission
    -from innumerable contributors, with kibitzing by more than a few Perl
    -porters.
    -
    -Last update: Wed May 14 11:14:09 EDT 1997
    diff --git a/lib/perl5/5.6.1/pods/perl5005delta.pod b/lib/perl5/5.6.1/pods/perl5005delta.pod
    deleted file mode 100644
    index 78bf90f6..00000000
    --- a/lib/perl5/5.6.1/pods/perl5005delta.pod
    +++ /dev/null
    @@ -1,993 +0,0 @@
    -=head1 NAME
    -
    -perldelta - what's new for perl5.005
    -
    -=head1 DESCRIPTION
    -
    -This document describes differences between the 5.004 release and this one.
    -
    -=head1 About the new versioning system
    -
    -Perl is now developed on two tracks: a maintenance track that makes
    -small, safe updates to released production versions with emphasis on
    -compatibility; and a development track that pursues more aggressive
    -evolution.  Maintenance releases (which should be considered production
    -quality) have subversion numbers that run from C<1> to C<49>, and
    -development releases (which should be considered "alpha" quality) run
    -from C<50> to C<99>.
    -
    -Perl 5.005 is the combined product of the new dual-track development
    -scheme.
    -
    -=head1 Incompatible Changes
    -
    -=head2 WARNING:  This version is not binary compatible with Perl 5.004.
    -
    -Starting with Perl 5.004_50 there were many deep and far-reaching changes
    -to the language internals.  If you have dynamically loaded extensions
    -that you built under perl 5.003 or 5.004, you can continue to use them
    -with 5.004, but you will need to rebuild and reinstall those extensions
    -to use them 5.005.  See F for detailed instructions on how to
    -upgrade.
    -
    -=head2 Default installation structure has changed
    -
    -The new Configure defaults are designed to allow a smooth upgrade from
    -5.004 to 5.005, but you should read F for a detailed
    -discussion of the changes in order to adapt them to your system.
    -
    -=head2 Perl Source Compatibility
    -
    -When none of the experimental features are enabled, there should be
    -very few user-visible Perl source compatibility issues.
    -
    -If threads are enabled, then some caveats apply. C<@_> and C<$_> become
    -lexical variables.  The effect of this should be largely transparent to
    -the user, but there are some boundary conditions under which user will
    -need to be aware of the issues.  For example, C results in
    -a "Can't localize lexical variable @_ ..." message.  This may be enabled
    -in a future version.
    -
    -Some new keywords have been introduced.  These are generally expected to
    -have very little impact on compatibility.  See L keyword>,
    -L keyword>, and L operator>.
    -
    -Certain barewords are now reserved.  Use of these will provoke a warning
    -if you have asked for them with the C<-w> switch.
    -See L is now a reserved word>.
    -
    -=head2 C Source Compatibility
    -
    -There have been a large number of changes in the internals to support
    -the new features in this release.
    -
    -=over 4
    -
    -=item *
    -
    -Core sources now require ANSI C compiler
    -
    -An ANSI C compiler is now B to build perl.  See F.
    -
    -=item *
    -
    -All Perl global variables must now be referenced with an explicit prefix
    -
    -All Perl global variables that are visible for use by extensions now
    -have a C prefix.  New extensions should C refer to perl globals
    -by their unqualified names.  To preserve sanity, we provide limited
    -backward compatibility for globals that are being widely used like
    -C and C (which should now be written as C,
    -C etc.)
    -
    -If you find that your XS extension does not compile anymore because a
    -perl global is not visible, try adding a C prefix to the global
    -and rebuild.
    -
    -It is strongly recommended that all functions in the Perl API that don't
    -begin with C be referenced with a C prefix.  The bare function
    -names without the C prefix are supported with macros, but this
    -support may cease in a future release.
    -
    -See L.
    -
    -=item *
    -
    -Enabling threads has source compatibility issues
    -
    -Perl built with threading enabled requires extensions to use the new
    -C macro to initialize the handle to access per-thread data.
    -If you see a compiler error that talks about the variable C not
    -being declared (when building a module that has XS code),  you need
    -to add C at the beginning of the block that elicited the error.
    -
    -The API function C should be used instead of
    -directly accessing perl globals as C.  The API call is
    -backward compatible with existing perls and provides source compatibility
    -with threading is enabled.
    -
    -See L<"C Source Compatibility"> for more information.
    -
    -=back
    -
    -=head2 Binary Compatibility
    -
    -This version is NOT binary compatible with older versions.  All extensions
    -will need to be recompiled.  Further binaries built with threads enabled
    -are incompatible with binaries built without.  This should largely be
    -transparent to the user, as all binary incompatible configurations have
    -their own unique architecture name, and extension binaries get installed at
    -unique locations.  This allows coexistence of several configurations in
    -the same directory hierarchy.  See F.
    -
    -=head2 Security fixes may affect compatibility
    -
    -A few taint leaks and taint omissions have been corrected.  This may lead
    -to "failure" of scripts that used to work with older versions.  Compiling
    -with -DINCOMPLETE_TAINTS provides a perl with minimal amounts of changes
    -to the tainting behavior.  But note that the resulting perl will have
    -known insecurities.
    -
    -Oneliners with the C<-e> switch do not create temporary files anymore.
    -
    -=head2 Relaxed new mandatory warnings introduced in 5.004
    -
    -Many new warnings that were introduced in 5.004 have been made
    -optional.  Some of these warnings are still present, but perl's new
    -features make them less often a problem.  See L.
    -
    -=head2 Licensing
    -
    -Perl has a new Social Contract for contributors.  See F.
    -
    -The license included in much of the Perl documentation has changed.
    -Most of the Perl documentation was previously under the implicit GNU
    -General Public License or the Artistic License (at the user's choice).
    -Now much of the documentation unambiguously states the terms under which
    -it may be distributed.  Those terms are in general much less restrictive
    -than the GNU GPL.  See L and the individual perl man pages listed
    -therein.
    -
    -=head1 Core Changes
    -
    -
    -=head2 Threads
    -
    -WARNING: Threading is considered an B feature.  Details of the
    -implementation may change without notice.  There are known limitations
    -and some bugs.  These are expected to be fixed in future versions.
    -
    -See F.
    -
    -=head2 Compiler
    -
    -WARNING: The Compiler and related tools are considered B.
    -Features may change without notice, and there are known limitations
    -and bugs.  Since the compiler is fully external to perl, the default
    -configuration will build and install it.
    -
    -The Compiler produces three different types of transformations of a
    -perl program.  The C backend generates C code that captures perl's state
    -just before execution begins.  It eliminates the compile-time overheads
    -of the regular perl interpreter, but the run-time performance remains
    -comparatively the same.  The CC backend generates optimized C code
    -equivalent to the code path at run-time.  The CC backend has greater
    -potential for big optimizations, but only a few optimizations are
    -implemented currently.  The Bytecode backend generates a platform
    -independent bytecode representation of the interpreter's state
    -just before execution.  Thus, the Bytecode back end also eliminates
    -much of the compilation overhead of the interpreter.
    -
    -The compiler comes with several valuable utilities.
    -
    -C is an experimental module to detect and warn about suspicious
    -code, especially the cases that the C<-w> switch does not detect.
    -
    -C can be used to demystify perl code, and understand
    -how perl optimizes certain constructs.
    -
    -C generates cross reference reports of all definition and use
    -of variables, subroutines and formats in a program.
    -
    -C show the lexical variables used by a subroutine or file
    -at a glance.
    -
    -C is a simple frontend for compiling perl.
    -
    -See C, L, and the respective compiler modules.
    -
    -=head2 Regular Expressions
    -
    -Perl's regular expression engine has been seriously overhauled, and
    -many new constructs are supported.  Several bugs have been fixed.
    -
    -Here is an itemized summary:
    -
    -=over 4
    -
    -=item Many new and improved optimizations
    -
    -Changes in the RE engine:
    -
    -	Unneeded nodes removed;
    -	Substrings merged together;
    -	New types of nodes to process (SUBEXPR)* and similar expressions
    -	    quickly, used if the SUBEXPR has no side effects and matches
    -	    strings of the same length;
    -	Better optimizations by lookup for constant substrings;
    -	Better search for constants substrings anchored by $ ;
    -
    -Changes in Perl code using RE engine:
    -
    -	More optimizations to s/longer/short/;
    -	study() was not working;
    -	/blah/ may be optimized to an analogue of index() if $& $` $' not seen;
    -	Unneeded copying of matched-against string removed;
    -	Only matched part of the string is copying if $` $' were not seen;
    -
    -=item Many bug fixes
    -
    -Note that only the major bug fixes are listed here.  See F for others.
    -
    -	Backtracking might not restore start of $3.
    -	No feedback if max count for * or + on "complex" subexpression
    -	    was reached, similarly (but at compile time) for {3,34567}
    -	Primitive restrictions on max count introduced to decrease a 
    -	    possibility of a segfault;
    -	(ZERO-LENGTH)* could segfault;
    -	(ZERO-LENGTH)* was prohibited;
    -	Long REs were not allowed;
    -	/RE/g could skip matches at the same position after a 
    -	  zero-length match;
    -
    -=item New regular expression constructs
    -
    -The following new syntax elements are supported:
    -
    -	(?<=RE)
    -	(?RE)
    -	\z
    -
    -=item New operator for precompiled regular expressions
    -
    -See L operator>.
    -
    -=item Other improvements
    -
    -	Better debugging output (possibly with colors),
    -            even from non-debugging Perl;
    -	RE engine code now looks like C, not like assembler;
    -	Behaviour of RE modifiable by `use re' directive;
    -	Improved documentation;
    -	Test suite significantly extended;
    -	Syntax [:^upper:] etc., reserved inside character classes;
    -
    -=item Incompatible changes
    -
    -	(?i) localized inside enclosing group;
    -	$( is not interpolated into RE any more;
    -	/RE/g may match at the same position (with non-zero length)
    -	    after a zero-length match (bug fix).
    -
    -=back
    -
    -See L and L.
    -
    -=head2   Improved malloc()
    -
    -See banner at the beginning of C for details.
    -
    -=head2 Quicksort is internally implemented
    -
    -Perl now contains its own highly optimized qsort() routine.  The new qsort()
    -is resistant to inconsistent comparison functions, so Perl's C will
    -not provoke coredumps any more when given poorly written sort subroutines.
    -(Some C library Cs that were being used before used to have this
    -problem.)  In our testing, the new C required the minimal number
    -of pair-wise compares on average, among all known C implementations.
    -
    -See C.
    -
    -=head2 Reliable signals
    -
    -Perl's signal handling is susceptible to random crashes, because signals
    -arrive asynchronously, and the Perl runtime is not reentrant at arbitrary
    -times.
    -
    -However, one experimental implementation of reliable signals is available
    -when threads are enabled.  See C.  Also see F for
    -how to build a Perl capable of threads.
    -
    -=head2 Reliable stack pointers
    -
    -The internals now reallocate the perl stack only at predictable times.
    -In particular, magic calls never trigger reallocations of the stack,
    -because all reentrancy of the runtime is handled using a "stack of stacks".
    -This should improve reliability of cached stack pointers in the internals
    -and in XSUBs.
    -
    -=head2 More generous treatment of carriage returns
    -
    -Perl used to complain if it encountered literal carriage returns in
    -scripts.  Now they are mostly treated like whitespace within program text.
    -Inside string literals and here documents, literal carriage returns are
    -ignored if they occur paired with linefeeds, or get interpreted as whitespace
    -if they stand alone.  This behavior means that literal carriage returns
    -in files should be avoided.  You can get the older, more compatible (but
    -less generous) behavior by defining the preprocessor symbol
    -C when building perl.  Of course, all this has nothing
    -whatever to do with how escapes like C<\r> are handled within strings.
    -
    -Note that this doesn't somehow magically allow you to keep all text files
    -in DOS format.  The generous treatment only applies to files that perl
    -itself parses.  If your C compiler doesn't allow carriage returns in
    -files, you may still be unable to build modules that need a C compiler.
    -
    -=head2 Memory leaks
    -
    -C, C and C don't leak memory anymore when used in lvalue
    -context.  Many small leaks that impacted applications that embed multiple
    -interpreters have been fixed.
    -
    -=head2 Better support for multiple interpreters
    -
    -The build-time option C<-DMULTIPLICITY> has had many of the details
    -reworked.  Some previously global variables that should have been
    -per-interpreter now are.  With care, this allows interpreters to call
    -each other.  See the C extension on CPAN.
    -
    -=head2 Behavior of local() on array and hash elements is now well-defined
    -
    -See L.
    -
    -=head2 C<%!> is transparently tied to the L module
    -
    -See L, and L.
    -
    -=head2 Pseudo-hashes are supported
    -
    -See L.
    -
    -=head2 C is supported
    -
    -See L.
    -
    -=head2 Keywords can be globally overridden
    -
    -See L.
    -
    -=head2 C<$^E> is meaningful on Win32
    -
    -See L.
    -
    -=head2 C optimized
    -
    -C is now optimized into a counting loop.  It does
    -not try to allocate a 1000000-size list anymore.
    -
    -=head2 C can be used as implicitly quoted package name
    -
    -Barewords caused unintuitive behavior when a subroutine with the same
    -name as a package happened to be defined.  Thus, C,
    -use the result of the call to C instead of C being treated
    -as a literal.  The recommended way to write barewords in the indirect
    -object slot is C.  Note that the method C is
    -called with a first argument of C, not C when you do that.
    -
    -=head2 C tests existence of a package
    -
    -It was impossible to test for the existence of a package without
    -actually creating it before.  Now C can be
    -used to test if the C namespace has been created.
    -
    -=head2 Better locale support
    -
    -See L.
    -
    -=head2 Experimental support for 64-bit platforms
    -
    -Perl5 has always had 64-bit support on systems with 64-bit longs.
    -Starting with 5.005, the beginnings of experimental support for systems
    -with 32-bit long and 64-bit 'long long' integers has been added.
    -If you add -DUSE_LONG_LONG to your ccflags in config.sh (or manually
    -define it in perl.h) then perl will be built with 'long long' support.
    -There will be many compiler warnings, and the resultant perl may not
    -work on all systems.  There are many other issues related to
    -third-party extensions and libraries.  This option exists to allow
    -people to work on those issues.
    -
    -=head2 prototype() returns useful results on builtins
    -
    -See L.
    -
    -=head2 Extended support for exception handling
    -
    -C now accepts a reference value, and C<$@> gets set to that
    -value in exception traps.  This makes it possible to propagate
    -exception objects.  This is an undocumented B feature.
    -
    -=head2 Re-blessing in DESTROY() supported for chaining DESTROY() methods
    -
    -See L.
    -
    -=head2 All C format conversions are handled internally
    -
    -See L.
    -
    -=head2 New C keyword
    -
    -C subs are like C and C, but they get run just before
    -the perl runtime begins execution.  e.g., the Perl Compiler makes use of
    -C blocks to initialize and resolve pointers to XSUBs.
    -
    -=head2 New C keyword
    -
    -The C keyword is the fundamental synchronization primitive
    -in threaded perl.  When threads are not enabled, it is currently a noop.
    -
    -To minimize impact on source compatibility this keyword is "weak", i.e., any
    -user-defined subroutine of the same name overrides it, unless a C
    -has been seen.
    -
    -=head2 New C operator
    -
    -The C operator, which is syntactically similar to the other quote-like
    -operators, is used to create precompiled regular expressions.  This compiled
    -form can now be explicitly passed around in variables, and interpolated in
    -other regular expressions.  See L.
    -
    -=head2 C is now a reserved word
    -
    -Calling a subroutine with the name C will now provoke a warning when
    -using the C<-w> switch.
    -
    -=head2 Tied arrays are now fully supported
    -
    -See L.
    -
    -=head2 Tied handles support is better
    -
    -Several missing hooks have been added.  There is also a new base class for
    -TIEARRAY implementations.  See L.
    -
    -=head2 4th argument to substr
    -
    -substr() can now both return and replace in one operation.  The optional
    -4th argument is the replacement string.  See L.
    -
    -=head2 Negative LENGTH argument to splice
    -
    -splice() with a negative LENGTH argument now work similar to what the
    -LENGTH did for substr().  Previously a negative LENGTH was treated as
    -0.  See L.
    -
    -=head2 Magic lvalues are now more magical
    -
    -When you say something like C, the scalar returned
    -by substr() is special, in that any modifications to it affect $x.
    -(This is called a 'magic lvalue' because an 'lvalue' is something on
    -the left side of an assignment.)  Normally, this is exactly what you
    -would expect to happen, but Perl uses the same magic if you use substr(),
    -pos(), or vec() in a context where they might be modified, like taking
    -a reference with C<\> or as an argument to a sub that modifies C<@_>.
    -In previous versions, this 'magic' only went one way, but now changes
    -to the scalar the magic refers to ($x in the above example) affect the
    -magic lvalue too. For instance, this code now acts differently:
    -
    -    $x = "hello";
    -    sub printit {
    -	$x = "g'bye";
    -	print $_[0], "\n";
    -    }
    -    printit(substr($x, 0, 5));
    -
    -In previous versions, this would print "hello", but it now prints "g'bye".
    -
    -=head2 <> now reads in records
    -
    -If C<$/> is a reference to an integer, or a scalar that holds an integer,
    -<> will read in records instead of lines. For more info, see
    -L.
    -
    -=head1 Supported Platforms
    -
    -Configure has many incremental improvements.  Site-wide policy for building
    -perl can now be made persistent, via Policy.sh.  Configure also records
    -the command-line arguments used in F.
    -
    -=head2 New Platforms
    -
    -BeOS is now supported.  See F.
    -
    -DOS is now supported under the DJGPP tools.  See F (installed 
    -as L on some systems).
    -
    -MiNT is now supported.  See F.
    -
    -MPE/iX is now supported.  See F.
    -
    -MVS (aka OS390, aka Open Edition) is now supported.  See F 
    -(installed as L on some systems).
    -
    -Stratus VOS is now supported.  See F.
    -
    -=head2 Changes in existing support
    -
    -Win32 support has been vastly enhanced.  Support for Perl Object, a C++
    -encapsulation of Perl.  GCC and EGCS are now supported on Win32.
    -See F, aka L.
    -
    -VMS configuration system has been rewritten.  See F (installed 
    -as L on some systems).
    -
    -The hints files for most Unix platforms have seen incremental improvements.
    -
    -=head1 Modules and Pragmata
    -
    -=head2 New Modules
    -
    -=over 4
    -
    -=item B
    -
    -Perl compiler and tools.  See L.
    -
    -=item Data::Dumper
    -
    -A module to pretty print Perl data.  See L.
    -
    -=item Dumpvalue
    -
    -A module to dump perl values to the screen. See L.
    -
    -=item Errno
    -
    -A module to look up errors more conveniently.  See L.
    -
    -=item File::Spec
    -
    -A portable API for file operations.
    -
    -=item ExtUtils::Installed
    -
    -Query and manage installed modules.
    -
    -=item ExtUtils::Packlist
    -
    -Manipulate .packlist files.
    -
    -=item Fatal
    -
    -Make functions/builtins succeed or die.
    -
    -=item IPC::SysV
    -
    -Constants and other support infrastructure for System V IPC operations
    -in perl.
    -
    -=item Test
    -
    -A framework for writing testsuites.
    -
    -=item Tie::Array
    -
    -Base class for tied arrays.
    -
    -=item Tie::Handle
    -
    -Base class for tied handles.
    -
    -=item Thread
    -
    -Perl thread creation, manipulation, and support.
    -
    -=item attrs
    -
    -Set subroutine attributes.
    -
    -=item fields
    -
    -Compile-time class fields.
    -
    -=item re
    -
    -Various pragmata to control behavior of regular expressions.
    -
    -=back
    -
    -=head2 Changes in existing modules
    -
    -=over 4
    -
    -=item Benchmark
    -
    -You can now run tests for I seconds instead of guessing the right
    -number of tests to run.
    -
    -Keeps better time.
    -
    -=item Carp
    -
    -Carp has a new function cluck(). cluck() warns, like carp(), but also adds
    -a stack backtrace to the error message, like confess().
    -
    -=item CGI
    -
    -CGI has been updated to version 2.42.
    -
    -=item Fcntl
    -
    -More Fcntl constants added: F_SETLK64, F_SETLKW64, O_LARGEFILE for
    -large (more than 4G) file access (the 64-bit support is not yet
    -working, though, so no need to get overly excited), Free/Net/OpenBSD
    -locking behaviour flags F_FLOCK, F_POSIX, Linux F_SHLCK, and
    -O_ACCMODE: the mask of O_RDONLY, O_WRONLY, and O_RDWR.
    -
    -=item Math::Complex
    -
    -The accessors methods Re, Im, arg, abs, rho, theta, methods can
    -($z->Re()) now also act as mutators ($z->Re(3)).
    -
    -=item Math::Trig
    -
    -A little bit of radial trigonometry (cylindrical and spherical) added,
    -for example the great circle distance.
    -
    -=item POSIX
    -
    -POSIX now has its own platform-specific hints files.
    -
    -=item DB_File
    -
    -DB_File supports version 2.x of Berkeley DB.  See C.
    -
    -=item MakeMaker
    -
    -MakeMaker now supports writing empty makefiles, provides a way to
    -specify that site umask() policy should be honored.  There is also
    -better support for manipulation of .packlist files, and getting
    -information about installed modules.
    -
    -Extensions that have both architecture-dependent and
    -architecture-independent files are now always installed completely in
    -the architecture-dependent locations.  Previously, the shareable parts
    -were shared both across architectures and across perl versions and were
    -therefore liable to be overwritten with newer versions that might have
    -subtle incompatibilities.
    -
    -=item CPAN
    -
    -See  and L.
    -
    -=item Cwd
    -
    -Cwd::cwd is faster on most platforms.
    -
    -=back
    -
    -=head1 Utility Changes
    -
    -C and related utilities have been vastly overhauled.
    -
    -C, a new experimental front end for the compiler is available.
    -
    -The crude GNU C emulator is now called C to
    -avoid trampling on C under case-insensitive filesystems.
    -
    -C used to be rather slow.  The slower features are now optional.
    -In particular, case-insensitive searches need the C<-i> switch, and
    -recursive searches need C<-r>.  You can set these switches in the
    -C environment variable to get the old behavior.
    -
    -=head1 Documentation Changes
    -
    -Config.pm now has a glossary of variables.
    -
    -F has detailed instructions on how to create and
    -submit patches for perl.
    -
    -L specifies guidelines on how to write portably. 
    -
    -L describes how to fetch and install modules from C
    -sites.
    -
    -Some more Perl traps are documented now.  See L.
    -
    -L gives a tutorial on using open().
    -
    -L gives a tutorial on references.
    -
    -L gives a tutorial on threads.
    -
    -=head1 New Diagnostics
    -
    -=over 4
    -
    -=item Ambiguous call resolved as CORE::%s(), qualify as such or use &
    -
    -(W) A subroutine you have declared has the same name as a Perl keyword,
    -and you have used the name without qualification for calling one or the
    -other.  Perl decided to call the builtin because the subroutine is
    -not imported.
    -
    -To force interpretation as a subroutine call, either put an ampersand
    -before the subroutine name, or qualify the name with its package.
    -Alternatively, you can import the subroutine (or pretend that it's
    -imported with the C pragma).
    -
    -To silently interpret it as the Perl operator, use the C prefix
    -on the operator (e.g. C) or by declaring the subroutine
    -to be an object method (see L).
    -
    -=item Bad index while coercing array into hash
    -
    -(F) The index looked up in the hash found as the 0'th element of a
    -pseudo-hash is not legal.  Index values must be at 1 or greater.
    -See L.
    -
    -=item Bareword "%s" refers to nonexistent package
    -
    -(W) You used a qualified bareword of the form C, but
    -the compiler saw no other uses of that namespace before that point.
    -Perhaps you need to predeclare a package?
    -
    -=item Can't call method "%s" on an undefined value
    -
    -(F) You used the syntax of a method call, but the slot filled by the
    -object reference or package name contains an undefined value.
    -Something like this will reproduce the error:
    -
    -    $BADREF = 42;
    -    process $BADREF 1,2,3;
    -    $BADREF->process(1,2,3);
    -
    -=item Can't check filesystem of script "%s" for nosuid
    -
    -(P) For some reason you can't check the filesystem of the script for nosuid.
    -
    -=item Can't coerce array into hash
    -
    -(F) You used an array where a hash was expected, but the array has no
    -information on how to map from keys to array indices.  You can do that
    -only with arrays that have a hash reference at index 0.
    -
    -=item Can't goto subroutine from an eval-string
    -
    -(F) The "goto subroutine" call can't be used to jump out of an eval "string".
    -(You can use it to jump out of an eval {BLOCK}, but you probably don't want to.)
    -
    -=item Can't localize pseudo-hash element
    -
    -(F) You said something like C<< local $ar->{'key'} >>, where $ar is
    -a reference to a pseudo-hash.  That hasn't been implemented yet, but
    -you can get a similar effect by localizing the corresponding array
    -element directly -- C<< local $ar->[$ar->[0]{'key'}] >>.
    -
    -=item Can't use %%! because Errno.pm is not available
    -
    -(F) The first time the %! hash is used, perl automatically loads the
    -Errno.pm module. The Errno module is expected to tie the %! hash to
    -provide symbolic names for C<$!> errno values.
    -
    -=item Cannot find an opnumber for "%s"
    -
    -(F) A string of a form C was given to prototype(), but
    -there is no builtin with the name C.
    -
    -=item Character class syntax [. .] is reserved for future extensions
    -
    -(W) Within regular expression character classes ([]) the syntax beginning
    -with "[." and ending with ".]" is reserved for future extensions.
    -If you need to represent those character sequences inside a regular
    -expression character class, just quote the square brackets with the
    -backslash: "\[." and ".\]".
    -
    -=item Character class syntax [: :] is reserved for future extensions
    -
    -(W) Within regular expression character classes ([]) the syntax beginning
    -with "[:" and ending with ":]" is reserved for future extensions.
    -If you need to represent those character sequences inside a regular
    -expression character class, just quote the square brackets with the
    -backslash: "\[:" and ":\]".
    -
    -=item Character class syntax [= =] is reserved for future extensions
    -
    -(W) Within regular expression character classes ([]) the syntax
    -beginning with "[=" and ending with "=]" is reserved for future extensions.
    -If you need to represent those character sequences inside a regular
    -expression character class, just quote the square brackets with the
    -backslash: "\[=" and "=\]".
    -
    -=item %s: Eval-group in insecure regular expression
    -
    -(F) Perl detected tainted data when trying to compile a regular expression
    -that contains the C<(?{ ... })> zero-width assertion, which is unsafe.
    -See L, and L.
    -
    -=item %s: Eval-group not allowed, use re 'eval'
    -
    -(F) A regular expression contained the C<(?{ ... })> zero-width assertion,
    -but that construct is only allowed when the C pragma is
    -in effect.  See L.
    -
    -=item %s: Eval-group not allowed at run time
    -
    -(F) Perl tried to compile a regular expression containing the C<(?{ ... })>
    -zero-width assertion at run time, as it would when the pattern contains
    -interpolated values.  Since that is a security risk, it is not allowed.
    -If you insist, you may still do this by explicitly building the pattern
    -from an interpolated string at run time and using that in an eval().
    -See L.
    -
    -=item Explicit blessing to '' (assuming package main)
    -
    -(W) You are blessing a reference to a zero length string.  This has
    -the effect of blessing the reference into the package main.  This is
    -usually not what you want.  Consider providing a default target
    -package, e.g. bless($ref, $p || 'MyPackage');
    -
    -=item Illegal hex digit ignored
    -
    -(W) You may have tried to use a character other than 0 - 9 or A - F in a
    -hexadecimal number.  Interpretation of the hexadecimal number stopped
    -before the illegal character.
    -
    -=item No such array field
    -
    -(F) You tried to access an array as a hash, but the field name used is
    -not defined.  The hash at index 0 should map all valid field names to
    -array indices for that to work.
    -
    -=item No such field "%s" in variable %s of type %s
    -
    -(F) You tried to access a field of a typed variable where the type
    -does not know about the field name.  The field names are looked up in
    -the %FIELDS hash in the type package at compile time.  The %FIELDS hash
    -is usually set up with the 'fields' pragma.
    -
    -=item Out of memory during ridiculously large request
    -
    -(F) You can't allocate more than 2^31+"small amount" bytes.  This error
    -is most likely to be caused by a typo in the Perl program. e.g., C<$arr[time]>
    -instead of C<$arr[$time]>.
    -
    -=item Range iterator outside integer range
    -
    -(F) One (or both) of the numeric arguments to the range operator ".."
    -are outside the range which can be represented by integers internally.
    -One possible workaround is to force Perl to use magical string
    -increment by prepending "0" to your numbers.
    -
    -=item Recursive inheritance detected while looking for method '%s' %s
    -
    -(F) More than 100 levels of inheritance were encountered while invoking a
    -method.  Probably indicates an unintended loop in your inheritance hierarchy.
    -
    -=item Reference found where even-sized list expected
    -
    -(W) You gave a single reference where Perl was expecting a list with
    -an even number of elements (for assignment to a hash). This
    -usually means that you used the anon hash constructor when you meant 
    -to use parens. In any case, a hash requires key/value B.
    -
    -    %hash = { one => 1, two => 2, };   # WRONG
    -    %hash = [ qw/ an anon array / ];   # WRONG
    -    %hash = ( one => 1, two => 2, );   # right
    -    %hash = qw( one 1 two 2 );                 # also fine
    -
    -=item Undefined value assigned to typeglob
    -
    -(W) An undefined value was assigned to a typeglob, a la C<*foo = undef>.
    -This does nothing.  It's possible that you really mean C.
    -
    -=item Use of reserved word "%s" is deprecated
    -
    -(D) The indicated bareword is a reserved word.  Future versions of perl
    -may use it as a keyword, so you're better off either explicitly quoting
    -the word in a manner appropriate for its context of use, or using a
    -different name altogether.  The warning can be suppressed for subroutine
    -names by either adding a C<&> prefix, or using a package qualifier,
    -e.g. C<&our()>, or C.
    -
    -=item perl: warning: Setting locale failed.
    -
    -(S) The whole warning message will look something like:
    -
    -       perl: warning: Setting locale failed.
    -       perl: warning: Please check that your locale settings:
    -               LC_ALL = "En_US",
    -               LANG = (unset)
    -           are supported and installed on your system.
    -       perl: warning: Falling back to the standard locale ("C").
    -
    -Exactly what were the failed locale settings varies.  In the above the
    -settings were that the LC_ALL was "En_US" and the LANG had no value.
    -This error means that Perl detected that you and/or your system
    -administrator have set up the so-called variable system but Perl could
    -not use those settings.  This was not dead serious, fortunately: there
    -is a "default locale" called "C" that Perl can and will use, the
    -script will be run.  Before you really fix the problem, however, you
    -will get the same error message each time you run Perl.  How to really
    -fix the problem can be found in L.
    -
    -=back
    -
    -
    -=head1 Obsolete Diagnostics
    -
    -=over 4
    -
    -=item Can't mktemp()
    -
    -(F) The mktemp() routine failed for some reason while trying to process
    -a B<-e> switch.  Maybe your /tmp partition is full, or clobbered.
    -
    -Removed because B<-e> doesn't use temporary files any more.
    -
    -=item Can't write to temp file for B<-e>: %s
    -
    -(F) The write routine failed for some reason while trying to process
    -a B<-e> switch.  Maybe your /tmp partition is full, or clobbered.
    -
    -Removed because B<-e> doesn't use temporary files any more.
    -
    -=item Cannot open temporary file
    -
    -(F) The create routine failed for some reason while trying to process
    -a B<-e> switch.  Maybe your /tmp partition is full, or clobbered.
    -
    -Removed because B<-e> doesn't use temporary files any more.
    -
    -=item regexp too big
    -
    -(F) The current implementation of regular expressions uses shorts as
    -address offsets within a string.  Unfortunately this means that if
    -the regular expression compiles to longer than 32767, it'll blow up.
    -Usually when you want a regular expression this big, there is a better
    -way to do it with multiple statements.  See L.
    -
    -=back
    -
    -=head1 Configuration Changes
    -
    -You can use "Configure -Uinstallusrbinperl" which causes installperl
    -to skip installing perl also as /usr/bin/perl.  This is useful if you
    -prefer not to modify /usr/bin for some reason or another but harmful
    -because many scripts assume to find Perl in /usr/bin/perl.
    -
    -=head1 BUGS
    -
    -If you find what you think is a bug, you might check the headers of
    -recently posted articles in the comp.lang.perl.misc newsgroup.
    -There may also be information at http://www.perl.com/perl/, the Perl
    -Home Page.
    -
    -If you believe you have an unreported bug, please run the B
    -program included with your release.  Make sure you trim your bug down
    -to a tiny but sufficient test case.  Your bug report, along with the
    -output of C, will be sent off to > to be
    -analysed by the Perl porting team.
    -
    -=head1 SEE ALSO
    -
    -The F file for exhaustive details on what changed.
    -
    -The F file for how to build Perl.
    -
    -The F file for general stuff.
    -
    -The F and F files for copyright information.
    -
    -=head1 HISTORY
    -
    -Written by Gurusamy Sarathy >, with many contributions
    -from The Perl Porters.
    -
    -Send omissions or corrections to >.
    -
    -=cut
    diff --git a/lib/perl5/5.6.1/pods/perlaix.pod b/lib/perl5/5.6.1/pods/perlaix.pod
    deleted file mode 100644
    index bf83535e..00000000
    --- a/lib/perl5/5.6.1/pods/perlaix.pod
    +++ /dev/null
    @@ -1,174 +0,0 @@
    -If you read this file _as_is_, just ignore the funny characters you see.
    -It is written in the POD format (see pod/perlpod.pod) which is specially
    -designed to be readable as is.
    -
    -=head1 NAME
    -
    -README.aix - Perl version 5 on IBM Unix (AIX) systems
    -
    -=head1 DESCRIPTION
    -
    -This document describes various features of IBM's Unix operating
    -system (AIX) that will affect how Perl version 5 (hereafter just Perl)
    -is compiled and/or runs.
    -
    -=head2 Compiling Perl 5 on AIX
    -
    -When compiling Perl, you must use an ANSI C compiler. AIX does not ship
    -an ANSI compliant C-compiler with AIX by default, but binary builds of
    -gcc for AIX are widely available.
    -
    -At the moment of writing, AIX supports two different native C compilers,
    -for which you have to pay: B and B. If you decide to use eiter
    -of these two (which is quite a lot easier than using gcc), be sure to
    -upgrade to the latest available patch level. Currently:
    -
    -    xlC.C     3.1.4.0
    -    vac.C     4.4.0.3	(5.0 is already available)
    -
    -Perl can be compiled with either IBM's ANSI C compiler or with gcc.
    -The former is recommended, as not only can it compile Perl with no
    -difficulty, but also can take advantage of features listed later that
    -require the use of IBM compiler-specific command-line flags.
    -
    -If you decide to use gcc, make sure your installation is recent and
    -complete, and be sure to read the Perl README file for more gcc-specific
    -details.
    -
    -=head2 OS level
    -
    -Before installing the patches to the IBM C-compiler you need to know the
    -level of patching for the Operating System. IBM's command 'oslevel' will
    -show the base, but is not always complete:
    -
    -    # oslevel
    -    4.3.0.0
    -    # lslpp -l | grep 'bos.rte '
    -    bos.rte      4.3.2.1  COMMITTED  Base Operating System Runtime
    -    bos.rte      4.3.2.0  COMMITTED  Base Operating System Runtime
    -    #
    -
    -=head2 Building Dynamic Extensions on AIX
    -
    -AIX supports dynamically loadable libraries (shared libraries).
    -Shared libraries end with the suffix .a, which is a bit misleading,
    -because *all* libraries are shared ;-).
    -
    -=head2 The IBM ANSI C Compiler
    -
    -All defaults for Configure can be used.
    -
    -If you've chosen to use vac 4, be sure to run 4.4.0.3. Older versions
    -will turn up nasty later on.
    -
    -Here's a brief lead of how to upgrade the compiler to the latest
    -level.  Of course this is subject to changes.  You can only upgrade
    -versions from ftp-available updates if the first three digit groups
    -are the same (in where you can skip intermediate unlike the patches
    -in the developer snapshots of perl), or to one version up where the
    -`base' is available.  In other words, the AIX compiler patches are
    -cumulative.
    -
    - vac.C.4.4.0.1 => vac.C.4.4.0.3  is OK     (vac.C.4.4.0.2 not needed)
    - xlC.C.3.1.3.3 => xlC.C.3.1.4.10 is NOT OK (xlC.C.3.1.4.0 is not available)
    -
    - # ftp ftp.software.ibm.com
    - Connected to service.boulder.ibm.com.
    - : welcome message ...
    - Name (ftp.software.ibm.com:merijn): anonymous
    - 331 Guest login ok, send your complete e-mail address as password.
    - Password:
    - ... accepted login stuff
    - ftp> cd /aix/fixes/v4/
    - ftp> dir other other.ll
    - output to local-file: other.ll? y
    - 200 PORT command successful.
    - 150 Opening ASCII mode data connection for /bin/ls.
    - 226 Transfer complete.
    - ftp> dir xlc xlc.ll
    - output to local-file: xlc.ll? y
    - 200 PORT command successful.
    - 150 Opening ASCII mode data connection for /bin/ls.
    - 226 Transfer complete.
    - ftp> bye
    - ... goodbye messages
    - # ls -l *.ll
    - -rw-rw-rw-   1 merijn   system    1169432 Nov  2 17:29 other.ll
    - -rw-rw-rw-   1 merijn   system      29170 Nov  2 17:29 xlc.ll
    -
    -On AIX 4.2 using xlC, we continue:
    -
    - # lslpp -l | fgrep 'xlC.C '
    -   xlC.C                     3.1.4.9  COMMITTED  C for AIX Compiler
    -   xlC.C                     3.1.4.0  COMMITTED  C for AIX Compiler
    - # grep 'xlC.C.3.1.4.*.bff' xlc.ll
    - -rw-r--r--   1 45776101 1        6286336 Jul 22 1996  xlC.C.3.1.4.1.bff
    - -rw-rw-r--   1 45776101 1        6173696 Aug 24 1998  xlC.C.3.1.4.10.bff
    - -rw-r--r--   1 45776101 1        6319104 Aug 14 1996  xlC.C.3.1.4.2.bff
    - -rw-r--r--   1 45776101 1        6316032 Oct 21 1996  xlC.C.3.1.4.3.bff
    - -rw-r--r--   1 45776101 1        6315008 Dec 20 1996  xlC.C.3.1.4.4.bff
    - -rw-rw-r--   1 45776101 1        6178816 Mar 28 1997  xlC.C.3.1.4.5.bff
    - -rw-rw-r--   1 45776101 1        6188032 May 22 1997  xlC.C.3.1.4.6.bff
    - -rw-rw-r--   1 45776101 1        6191104 Sep  5 1997  xlC.C.3.1.4.7.bff
    - -rw-rw-r--   1 45776101 1        6185984 Jan 13 1998  xlC.C.3.1.4.8.bff
    - -rw-rw-r--   1 45776101 1        6169600 May 27 1998  xlC.C.3.1.4.9.bff
    - # wget ftp://ftp.software.ibm.com/aix/fixes/v4/xlc/xlC.C.3.1.4.10.bff
    - #
    -
    -On AIX 4.3 using vac, we continue:
    -
    - # lslpp -l | fgrep 'vac.C '
    -   vac.C                      4.4.0.2  COMMITTED  C for AIX Compiler
    -   vac.C                      4.4.0.0  COMMITTED  C for AIX Compiler
    - # grep 'vac.C.4.4.0.*.bff' other.ll
    - -rw-rw-r--   1 45776101 1        13466624 May 26 1999  vac.C.4.4.0.1.bff
    - -rw-rw-r--   1 45776101 1        13473792 Aug 31 1999  vac.C.4.4.0.2.bff
    - -rw-rw-r--   1 45776101 1        13480960 May 19 20:32 vac.C.4.4.0.3.bff
    - # wget ftp://ftp.software.ibm.com/aix/fixes/v4/other/vac.C.4.4.0.3.bff
    - #
    -
    -Then execute the following command, and fill in its choices
    -
    - # smit install_update
    -  -> Install and Update from LATEST Available Software
    -  * INPUT device / directory for software [ vac.C.4.4.0.3.bff    ]
    -  [ OK ]
    -  [ OK ]
    -
    -Follow the messages ... and you're done.
    -
    -=head2 Using GNU's gcc for building perl
    -
    -... ?
    -
    -=head2 Using Large Files with Perl
    -
    -... ?
    -
    -=head2 Threaded Perl
    -
    -... ?
    -
    -=head2 64-bit Perl
    -
    -... ?
    -
    -=head2 GDBM and Threads
    -
    -... ?
    -
    -=head2 NFS filesystems and utime(2)
    -
    -... ?
    -
    -=head1 AUTHOR
    -
    -H.Merijn Brand 
    -
    -Structure copied from README.hpux
    -
    -=head1 DATE
    -
    -Version 0.0.1: 16-10-2000
    -
    -=cut
    diff --git a/lib/perl5/5.6.1/pods/perlamiga.pod b/lib/perl5/5.6.1/pods/perlamiga.pod
    deleted file mode 100644
    index 97478f92..00000000
    --- a/lib/perl5/5.6.1/pods/perlamiga.pod
    +++ /dev/null
    @@ -1,297 +0,0 @@
    -If you read this file _as_is_, just ignore the funny characters you
    -see. It is written in the POD format (see perlpod manpage) which is
    -specially designed to be readable as is.
    -
    -=head1 NAME
    -
    -perlamiga - Perl under Amiga OS
    -
    -=head1 SYNOPSIS
    -
    -One can read this document in the following formats:
    -
    -	man perlamiga
    -	multiview perlamiga.guide
    -
    -to list some (not all may be available simultaneously), or it may
    -be read I: either as F, or F.
    -
    -A recent version of perl for the Amiga can be found at the Geek Gadgets
    -section of the Aminet:
    -  
    -      http://www.aminet.net/~aminet/dirs/dev_gg.html
    -
    -=cut
    -
    -Contents
    - 
    - perlamiga - Perl under Amiga OS
    -
    -       NAME 
    -       SYNOPSIS 
    -       DESCRIPTION 
    -         -  Prerequisites 
    -         -  Starting Perl programs under AmigaOS
    -         -  Shortcomings of Perl under AmigaOS
    -       INSTALLATION 
    -       Accessing documentation 
    -         -  Manpages 
    -         -  HTML 
    -         -  GNU info files 
    -         -  LaTeX docs 
    -       BUILD 
    -         -  Prerequisites 
    -         -  Getting the perl source 
    -         -  Application of the patches 
    -         -  Making 
    -         -  Testing 
    -         -  Installing the built perl 
    -       AUTHOR 
    -       SEE ALSO 
    -
    -=head1 DESCRIPTION
    -
    -=head2 Prerequisites
    -
    -=over 6
    -
    -=item B
    -
    -You need the Unix emulation for AmigaOS, whose most important part is
    -B. For a minimum setup, get the latest versions
    -of the following packages from the Aminet archives (http://www.aminet.net/~aminet/):
    -
    -	ixemul-bin
    -	ixemul-env-bin
    -	pdksh-bin
    -
    -Note also that this is a minimum setup; you might want to add other
    -packages of B (the I).
    -
    -=item B
    -
    -You need at the very least AmigaOS version 2.0. Recommended is version 3.1.
    -
    -=back
    -
    -=head2 Starting Perl programs under AmigaOS
    -
    -Start your Perl program F with arguments C the
    -same way as on any other platform, by
    -
    -	perl foo arg1 arg2 arg3
    -
    -If you want to specify perl options C<-my_opts> to the perl itself (as
    -opposed to to your program), use
    -
    -	perl -my_opts foo arg1 arg2 arg3
    -
    -Alternately, you can try to get a replacement for the system's B
    -command that honors the #!/usr/bin/perl syntax in scripts and set the s-Bit
    -of your scripts. Then you can invoke your scripts like under UNIX with
    -
    -	foo arg1 arg2 arg3
    -
    -(Note that having *nixish full path to perl F is not
    -necessary, F would be enough, but having full path would make it
    -easier to use your script under *nix.)
    -
    -=head2 Shortcomings of Perl under AmigaOS
    -
    -Perl under AmigaOS lacks some features of perl under UNIX because of
    -deficiencies in the UNIX-emulation, most notably:
    -
    -=over 4
    -
    -=item * 
    -
    -fork()
    -
    -=item *
    -
    -some features of the UNIX filesystem regarding link count and file dates
    -
    -=item *
    -
    -inplace operation (the B<-i> switch) without backup file
    -
    -=item *
    -
    -umask() works, but the correct permissions are only set when the file is
    -finally close()d
    -
    -=back
    -
    -=head1 INSTALLATION
    -
    -Change to the installation directory (most probably ADE:), and
    -extract the binary distribution:
    -
    -lha -mraxe x perl-$VERSION-bin.lha
    -
    -or
    -
    -tar xvzpf perl-$VERSION-bin.tgz
    -
    -(Of course you need lha or tar and gunzip for this.)
    -
    -For installation of the Unix emulation, read the appropriate docs.
    -
    -=head1 Accessing documentation
    -
    -=head2 Manpages
    -
    -If you have C installed on your system, and you installed perl
    -manpages, use something like this:
    -
    -	man perlfunc
    -	man less
    -	man ExtUtils.MakeMaker
    -
    -to access documentation for different components of Perl. Start with
    -
    -	man perl
    -
    -Note: You have to modify your man.conf file to search for manpages
    -in the /ade/lib/perl5/man/man3 directory, or the man pages for the
    -perl library will not be found. 
    -
    -Note that dot (F<.>) is used as a package separator for documentation
    -for packages, and as usual, sometimes you need to give the section - C<3>
    -above - to avoid shadowing by the I.
    -
    -
    -=head2 B
    -
    -If you have some WWW browser available, you can build B docs.
    -Cd to directory with F<.pod> files, and do like this
    -
    -	cd /ade/lib/perl5/pod
    -	pod2html
    -
    -After this you can direct your browser the file F in this
    -directory, and go ahead with reading docs.
    -
    -Alternatively you may be able to get these docs prebuilt from C.
    -
    -=head2 B C files
    -
    -Users of C would appreciate it very much, especially with
    -C mode loaded. You need to get latest C from C,
    -or, alternately, prebuilt info pages.
    -
    -=head2 C docs
    -
    -can be constructed using C.
    -
    -=head1 BUILD
    -
    -Here we discuss how to build Perl under AmigaOS.
    -
    -=head2 Prerequisites
    -
    -You need to have the latest B (Unix emulation for Amiga)
    -from Aminet.
    -
    -=head2 Getting the perl source
    -
    -You can either get the latest perl-for-amiga source from Ninemoons
    -and extract it with:
    -
    -  tar xvzpf perl-$VERSION-src.tgz
    -
    -or get the official source from CPAN:
    -
    -  http://www.perl.com/CPAN/src/5.0
    -
    -Extract it like this
    -
    -  tar xvzpf perl-$VERSION.tar.gz
    -
    -You will see a message about errors while extracting F. This
    -is normal and expected. (There is a conflict with a similarly-named file
    -F, but it causes no harm.)
    -
    -=head2 Making
    -
    -=over 4
    -
    -=item *
    -
    -remember to use a healthy sized stack (I used 2000000)
    -
    -=item *
    -
    -your PATH environment variable must include /bin (e.g. ".:/bin" is good)
    -(or, more precisely, it must include the directory where you have your
    -basic UNIX utilities like test, cat, sed, and so on)
    -
    -=item *
    -	
    -  sh Configure -Dprefix=/ade -Dloclibpth=/ade/lib
    -
    -=item *
    -
    -fix makedepend
    -
    -	In the file 'makedepend' there are three spots like this `$cat ...`:
    -	a for loop near line 75, an egrep near line 161, and a for loop near
    -	line 175.  In all those spots using an editor change the $cat to
    -	/bin/cat.
    -
    -=item *
    -
    -now type make depend
    -
    -	When the make depend has ended load the gnumakefile into
    -	an editor and go to the end of the file.
    -
    -	Move upwards in the file until you reach av.o: EXTERN.h
    -	and delete all lines down to # WARNING: Put....
    -
    -=item *
    -
    -now go to the x2p directory
    -
    -	Load the gnumakefile into an editor.
    -
    -	Go to the end moveup until you reach hash.o: EXTERN.h
    -	and delete all lines dowonwards until you reach a line saying
    -
    -	# WARNING: Put nothing....
    -
    -=item *
    -
    -Now!
    -
    -  make
    -
    -=back
    -
    -=head2 Testing
    -
    -Now run
    -
    -  make test
    -
    -Some tests will be skipped because they need the fork() function:
    -
    -F, F, F, F, F, 
    -F, F
    -
    -=head2 Installing the built perl
    -
    -Run
    -
    -  make install
    -
    -=head1 AUTHORS
    -
    -Norbert Pueschel, pueschel@imsdd.meb.uni-bonn.de
    -Jan-Erik Karlsson, trg@privat.utfors.se
    -
    -=head1 SEE ALSO
    -
    -perl(1).
    -
    -=cut
    diff --git a/lib/perl5/5.6.1/pods/perlapi.pod b/lib/perl5/5.6.1/pods/perlapi.pod
    deleted file mode 100644
    index 67009d0f..00000000
    --- a/lib/perl5/5.6.1/pods/perlapi.pod
    +++ /dev/null
    @@ -1,3546 +0,0 @@
    -=head1 NAME
    -
    -perlapi - autogenerated documentation for the perl public API
    -
    -=head1 DESCRIPTION
    -
    -This file contains the documentation of the perl public API generated by 
    -embed.pl, specifically a listing of functions, macros, flags, and variables 
    -that may be used by extension writers.  The interfaces of any functions that 
    -are not listed here are subject to change without notice.  For this reason,
    -blindly using functions listed in proto.h is to be avoided when writing
    -extensions.
    -
    -Note that all Perl API global variables must be referenced with the C
    -prefix.  Some macros are provided for compatibility with the older,
    -unadorned names, but this support may be disabled in a future release.
    -
    -The listing is alphabetical, case insensitive.
    -
    -=over 8
    -
    -=item AvFILL
    -
    -Same as C.  Deprecated, use C instead.
    -
    -	int	AvFILL(AV* av)
    -
    -=for hackers
    -Found in file av.h
    -
    -=item av_clear
    -
    -Clears an array, making it empty.  Does not free the memory used by the
    -array itself.
    -
    -	void	av_clear(AV* ar)
    -
    -=for hackers
    -Found in file av.c
    -
    -=item av_delete
    -
    -Deletes the element indexed by C from the array.  Returns the
    -deleted element. C is currently ignored.
    -
    -	SV*	av_delete(AV* ar, I32 key, I32 flags)
    -
    -=for hackers
    -Found in file av.c
    -
    -=item av_exists
    -
    -Returns true if the element indexed by C has been initialized.
    -
    -This relies on the fact that uninitialized array elements are set to
    -C<&PL_sv_undef>.
    -
    -	bool	av_exists(AV* ar, I32 key)
    -
    -=for hackers
    -Found in file av.c
    -
    -=item av_extend
    -
    -Pre-extend an array.  The C is the index to which the array should be
    -extended.
    -
    -	void	av_extend(AV* ar, I32 key)
    -
    -=for hackers
    -Found in file av.c
    -
    -=item av_fetch
    -
    -Returns the SV at the specified index in the array.  The C is the
    -index.  If C is set then the fetch will be part of a store.  Check
    -that the return value is non-null before dereferencing it to a C.
    -
    -See L for
    -more information on how to use this function on tied arrays. 
    -
    -	SV**	av_fetch(AV* ar, I32 key, I32 lval)
    -
    -=for hackers
    -Found in file av.c
    -
    -=item av_fill
    -
    -Ensure than an array has a given number of elements, equivalent to
    -Perl's C<$#array = $fill;>.
    -
    -	void	av_fill(AV* ar, I32 fill)
    -
    -=for hackers
    -Found in file av.c
    -
    -=item av_len
    -
    -Returns the highest index in the array.  Returns -1 if the array is
    -empty.
    -
    -	I32	av_len(AV* ar)
    -
    -=for hackers
    -Found in file av.c
    -
    -=item av_make
    -
    -Creates a new AV and populates it with a list of SVs.  The SVs are copied
    -into the array, so they may be freed after the call to av_make.  The new AV
    -will have a reference count of 1.
    -
    -	AV*	av_make(I32 size, SV** svp)
    -
    -=for hackers
    -Found in file av.c
    -
    -=item av_pop
    -
    -Pops an SV off the end of the array.  Returns C<&PL_sv_undef> if the array
    -is empty.
    -
    -	SV*	av_pop(AV* ar)
    -
    -=for hackers
    -Found in file av.c
    -
    -=item av_push
    -
    -Pushes an SV onto the end of the array.  The array will grow automatically
    -to accommodate the addition.
    -
    -	void	av_push(AV* ar, SV* val)
    -
    -=for hackers
    -Found in file av.c
    -
    -=item av_shift
    -
    -Shifts an SV off the beginning of the array.
    -
    -	SV*	av_shift(AV* ar)
    -
    -=for hackers
    -Found in file av.c
    -
    -=item av_store
    -
    -Stores an SV in an array.  The array index is specified as C.  The
    -return value will be NULL if the operation failed or if the value did not
    -need to be actually stored within the array (as in the case of tied
    -arrays). Otherwise it can be dereferenced to get the original C.  Note
    -that the caller is responsible for suitably incrementing the reference
    -count of C before the call, and decrementing it if the function
    -returned NULL.
    -
    -See L for
    -more information on how to use this function on tied arrays.
    -
    -	SV**	av_store(AV* ar, I32 key, SV* val)
    -
    -=for hackers
    -Found in file av.c
    -
    -=item av_undef
    -
    -Undefines the array.  Frees the memory used by the array itself.
    -
    -	void	av_undef(AV* ar)
    -
    -=for hackers
    -Found in file av.c
    -
    -=item av_unshift
    -
    -Unshift the given number of C values onto the beginning of the
    -array.  The array will grow automatically to accommodate the addition.  You
    -must then use C to assign values to these new elements.
    -
    -	void	av_unshift(AV* ar, I32 num)
    -
    -=for hackers
    -Found in file av.c
    -
    -=item bytes_from_utf8
    -
    -Converts a string C of length C from UTF8 into byte encoding.
    -Unlike  but like C, returns a pointer to
    -the newly-created string, and updates C to contain the new
    -length.  Returns the original string if no conversion occurs, C
    -is unchanged. Do nothing if C points to 0. Sets C to
    -0 if C is converted or contains all 7bit characters.
    -
    -NOTE: this function is experimental and may change or be
    -removed without notice.
    -
    -	U8*	bytes_from_utf8(U8 *s, STRLEN *len, bool *is_utf8)
    -
    -=for hackers
    -Found in file utf8.c
    -
    -=item bytes_to_utf8
    -
    -Converts a string C of length C from ASCII into UTF8 encoding.
    -Returns a pointer to the newly-created string, and sets C to
    -reflect the new length.
    -
    -NOTE: this function is experimental and may change or be
    -removed without notice.
    -
    -	U8*	bytes_to_utf8(U8 *s, STRLEN *len)
    -
    -=for hackers
    -Found in file utf8.c
    -
    -=item call_argv
    -
    -Performs a callback to the specified Perl sub.  See L.
    -
    -NOTE: the perl_ form of this function is deprecated.
    -
    -	I32	call_argv(const char* sub_name, I32 flags, char** argv)
    -
    -=for hackers
    -Found in file perl.c
    -
    -=item call_method
    -
    -Performs a callback to the specified Perl method.  The blessed object must
    -be on the stack.  See L.
    -
    -NOTE: the perl_ form of this function is deprecated.
    -
    -	I32	call_method(const char* methname, I32 flags)
    -
    -=for hackers
    -Found in file perl.c
    -
    -=item call_pv
    -
    -Performs a callback to the specified Perl sub.  See L.
    -
    -NOTE: the perl_ form of this function is deprecated.
    -
    -	I32	call_pv(const char* sub_name, I32 flags)
    -
    -=for hackers
    -Found in file perl.c
    -
    -=item call_sv
    -
    -Performs a callback to the Perl sub whose name is in the SV.  See
    -L.
    -
    -NOTE: the perl_ form of this function is deprecated.
    -
    -	I32	call_sv(SV* sv, I32 flags)
    -
    -=for hackers
    -Found in file perl.c
    -
    -=item CLASS
    -
    -Variable which is setup by C to indicate the 
    -class name for a C++ XS constructor.  This is always a C.  See C.
    -
    -	char*	CLASS
    -
    -=for hackers
    -Found in file XSUB.h
    -
    -=item Copy
    -
    -The XSUB-writer's interface to the C C function.  The C is the
    -source, C is the destination, C is the number of items, and C is
    -the type.  May fail on overlapping copies.  See also C.
    -
    -	void	Copy(void* src, void* dest, int nitems, type)
    -
    -=for hackers
    -Found in file handy.h
    -
    -=item croak
    -
    -This is the XSUB-writer's interface to Perl's C function.
    -Normally use this function the same way you use the C C
    -function.  See C.
    -
    -If you want to throw an exception object, assign the object to
    -C<$@> and then pass C to croak():
    -
    -   errsv = get_sv("@", TRUE);
    -   sv_setsv(errsv, exception_object);
    -   croak(Nullch);
    -
    -	void	croak(const char* pat, ...)
    -
    -=for hackers
    -Found in file util.c
    -
    -=item CvSTASH
    -
    -Returns the stash of the CV.
    -
    -	HV*	CvSTASH(CV* cv)
    -
    -=for hackers
    -Found in file cv.h
    -
    -=item dMARK
    -
    -Declare a stack marker variable, C, for the XSUB.  See C and
    -C.
    -
    -		dMARK;
    -
    -=for hackers
    -Found in file pp.h
    -
    -=item dORIGMARK
    -
    -Saves the original stack mark for the XSUB.  See C.
    -
    -		dORIGMARK;
    -
    -=for hackers
    -Found in file pp.h
    -
    -=item dSP
    -
    -Declares a local copy of perl's stack pointer for the XSUB, available via
    -the C macro.  See C.
    -
    -		dSP;
    -
    -=for hackers
    -Found in file pp.h
    -
    -=item dXSARGS
    -
    -Sets up stack and mark pointers for an XSUB, calling dSP and dMARK.  This
    -is usually handled automatically by C.  Declares the C
    -variable to indicate the number of items on the stack.
    -
    -		dXSARGS;
    -
    -=for hackers
    -Found in file XSUB.h
    -
    -=item dXSI32
    -
    -Sets up the C variable for an XSUB which has aliases.  This is usually
    -handled automatically by C.
    -
    -		dXSI32;
    -
    -=for hackers
    -Found in file XSUB.h
    -
    -=item ENTER
    -
    -Opening bracket on a callback.  See C and L.
    -
    -		ENTER;
    -
    -=for hackers
    -Found in file scope.h
    -
    -=item eval_pv
    -
    -Tells Perl to C the given string and return an SV* result.
    -
    -NOTE: the perl_ form of this function is deprecated.
    -
    -	SV*	eval_pv(const char* p, I32 croak_on_error)
    -
    -=for hackers
    -Found in file perl.c
    -
    -=item eval_sv
    -
    -Tells Perl to C the string in the SV.
    -
    -NOTE: the perl_ form of this function is deprecated.
    -
    -	I32	eval_sv(SV* sv, I32 flags)
    -
    -=for hackers
    -Found in file perl.c
    -
    -=item EXTEND
    -
    -Used to extend the argument stack for an XSUB's return values. Once
    -used, guarantees that there is room for at least C to be pushed
    -onto the stack.
    -
    -	void	EXTEND(SP, int nitems)
    -
    -=for hackers
    -Found in file pp.h
    -
    -=item fbm_compile
    -
    -Analyses the string in order to make fast searches on it using fbm_instr()
    --- the Boyer-Moore algorithm.
    -
    -	void	fbm_compile(SV* sv, U32 flags)
    -
    -=for hackers
    -Found in file util.c
    -
    -=item fbm_instr
    -
    -Returns the location of the SV in the string delimited by C and
    -C.  It returns C if the string can't be found.  The C
    -does not have to be fbm_compiled, but the search will not be as fast
    -then.
    -
    -	char*	fbm_instr(unsigned char* big, unsigned char* bigend, SV* littlesv, U32 flags)
    -
    -=for hackers
    -Found in file util.c
    -
    -=item FREETMPS
    -
    -Closing bracket for temporaries on a callback.  See C and
    -L.
    -
    -		FREETMPS;
    -
    -=for hackers
    -Found in file scope.h
    -
    -=item get_av
    -
    -Returns the AV of the specified Perl array.  If C is set and the
    -Perl variable does not exist then it will be created.  If C is not
    -set and the variable does not exist then NULL is returned.
    -
    -NOTE: the perl_ form of this function is deprecated.
    -
    -	AV*	get_av(const char* name, I32 create)
    -
    -=for hackers
    -Found in file perl.c
    -
    -=item get_cv
    -
    -Returns the CV of the specified Perl subroutine.  If C is set and
    -the Perl subroutine does not exist then it will be declared (which has the
    -same effect as saying C).  If C is not set and the
    -subroutine does not exist then NULL is returned.
    -
    -NOTE: the perl_ form of this function is deprecated.
    -
    -	CV*	get_cv(const char* name, I32 create)
    -
    -=for hackers
    -Found in file perl.c
    -
    -=item get_hv
    -
    -Returns the HV of the specified Perl hash.  If C is set and the
    -Perl variable does not exist then it will be created.  If C is not
    -set and the variable does not exist then NULL is returned.
    -
    -NOTE: the perl_ form of this function is deprecated.
    -
    -	HV*	get_hv(const char* name, I32 create)
    -
    -=for hackers
    -Found in file perl.c
    -
    -=item get_sv
    -
    -Returns the SV of the specified Perl scalar.  If C is set and the
    -Perl variable does not exist then it will be created.  If C is not
    -set and the variable does not exist then NULL is returned.
    -
    -NOTE: the perl_ form of this function is deprecated.
    -
    -	SV*	get_sv(const char* name, I32 create)
    -
    -=for hackers
    -Found in file perl.c
    -
    -=item GIMME
    -
    -A backward-compatible version of C which can only return
    -C or C; in a void context, it returns C.
    -Deprecated.  Use C instead.
    -
    -	U32	GIMME
    -
    -=for hackers
    -Found in file op.h
    -
    -=item GIMME_V
    -
    -The XSUB-writer's equivalent to Perl's C.  Returns C,
    -C or C for void, scalar or list context,
    -respectively.
    -
    -	U32	GIMME_V
    -
    -=for hackers
    -Found in file op.h
    -
    -=item GvSV
    -
    -Return the SV from the GV.
    -
    -	SV*	GvSV(GV* gv)
    -
    -=for hackers
    -Found in file gv.h
    -
    -=item gv_fetchmeth
    -
    -Returns the glob with the given C and a defined subroutine or
    -C.  The glob lives in the given C, or in the stashes
    -accessible via @ISA and @UNIVERSAL.
    -
    -The argument C should be either 0 or -1.  If C, as a
    -side-effect creates a glob with the given C in the given C
    -which in the case of success contains an alias for the subroutine, and sets
    -up caching info for this glob.  Similarly for all the searched stashes.
    -
    -This function grants C<"SUPER"> token as a postfix of the stash name. The
    -GV returned from C may be a method cache entry, which is not
    -visible to Perl code.  So when calling C, you should not use
    -the GV directly; instead, you should use the method's CV, which can be
    -obtained from the GV with the C macro.
    -
    -	GV*	gv_fetchmeth(HV* stash, const char* name, STRLEN len, I32 level)
    -
    -=for hackers
    -Found in file gv.c
    -
    -=item gv_fetchmethod
    -
    -See L.
    -
    -	GV*	gv_fetchmethod(HV* stash, const char* name)
    -
    -=for hackers
    -Found in file gv.c
    -
    -=item gv_fetchmethod_autoload
    -
    -Returns the glob which contains the subroutine to call to invoke the method
    -on the C.  In fact in the presence of autoloading this may be the
    -glob for "AUTOLOAD".  In this case the corresponding variable $AUTOLOAD is
    -already setup.
    -
    -The third parameter of C determines whether
    -AUTOLOAD lookup is performed if the given method is not present: non-zero
    -means yes, look for AUTOLOAD; zero means no, don't look for AUTOLOAD.
    -Calling C is equivalent to calling C
    -with a non-zero C parameter.
    -
    -These functions grant C<"SUPER"> token as a prefix of the method name. Note
    -that if you want to keep the returned glob for a long time, you need to
    -check for it being "AUTOLOAD", since at the later time the call may load a
    -different subroutine due to $AUTOLOAD changing its value. Use the glob
    -created via a side effect to do this.
    -
    -These functions have the same side-effects and as C with
    -C.  C should be writable if contains C<':'> or C<'
    -''>. The warning against passing the GV returned by C to
    -C apply equally to these functions.
    -
    -	GV*	gv_fetchmethod_autoload(HV* stash, const char* name, I32 autoload)
    -
    -=for hackers
    -Found in file gv.c
    -
    -=item gv_stashpv
    -
    -Returns a pointer to the stash for a specified package.  C should
    -be a valid UTF-8 string.  If C is set then the package will be
    -created if it does not already exist.  If C is not set and the
    -package does not exist then NULL is returned.
    -
    -	HV*	gv_stashpv(const char* name, I32 create)
    -
    -=for hackers
    -Found in file gv.c
    -
    -=item gv_stashsv
    -
    -Returns a pointer to the stash for a specified package, which must be a
    -valid UTF-8 string.  See C.
    -
    -	HV*	gv_stashsv(SV* sv, I32 create)
    -
    -=for hackers
    -Found in file gv.c
    -
    -=item G_ARRAY
    -
    -Used to indicate list context.  See C, C and
    -L.
    -
    -=for hackers
    -Found in file cop.h
    -
    -=item G_DISCARD
    -
    -Indicates that arguments returned from a callback should be discarded.  See
    -L.
    -
    -=for hackers
    -Found in file cop.h
    -
    -=item G_EVAL
    -
    -Used to force a Perl C wrapper around a callback.  See
    -L.
    -
    -=for hackers
    -Found in file cop.h
    -
    -=item G_NOARGS
    -
    -Indicates that no arguments are being sent to a callback.  See
    -L.
    -
    -=for hackers
    -Found in file cop.h
    -
    -=item G_SCALAR
    -
    -Used to indicate scalar context.  See C, C, and
    -L.
    -
    -=for hackers
    -Found in file cop.h
    -
    -=item G_VOID
    -
    -Used to indicate void context.  See C and L.
    -
    -=for hackers
    -Found in file cop.h
    -
    -=item HEf_SVKEY
    -
    -This flag, used in the length slot of hash entries and magic structures,
    -specifies the structure contains a C pointer where a C pointer
    -is to be expected. (For information only--not to be used).
    -
    -=for hackers
    -Found in file hv.h
    -
    -=item HeHASH
    -
    -Returns the computed hash stored in the hash entry.
    -
    -	U32	HeHASH(HE* he)
    -
    -=for hackers
    -Found in file hv.h
    -
    -=item HeKEY
    -
    -Returns the actual pointer stored in the key slot of the hash entry. The
    -pointer may be either C or C, depending on the value of
    -C.  Can be assigned to.  The C or C macros are
    -usually preferable for finding the value of a key.
    -
    -	void*	HeKEY(HE* he)
    -
    -=for hackers
    -Found in file hv.h
    -
    -=item HeKLEN
    -
    -If this is negative, and amounts to C, it indicates the entry
    -holds an C key.  Otherwise, holds the actual length of the key.  Can
    -be assigned to. The C macro is usually preferable for finding key
    -lengths.
    -
    -	STRLEN	HeKLEN(HE* he)
    -
    -=for hackers
    -Found in file hv.h
    -
    -=item HePV
    -
    -Returns the key slot of the hash entry as a C value, doing any
    -necessary dereferencing of possibly C keys.  The length of the string
    -is placed in C (this is a macro, so do I use C<&len>).  If you do
    -not care about what the length of the key is, you may use the global
    -variable C, though this is rather less efficient than using a local
    -variable.  Remember though, that hash keys in perl are free to contain
    -embedded nulls, so using C or similar is not a good way to find
    -the length of hash keys. This is very similar to the C macro
    -described elsewhere in this document.
    -
    -	char*	HePV(HE* he, STRLEN len)
    -
    -=for hackers
    -Found in file hv.h
    -
    -=item HeSVKEY
    -
    -Returns the key as an C, or C if the hash entry does not
    -contain an C key.
    -
    -	SV*	HeSVKEY(HE* he)
    -
    -=for hackers
    -Found in file hv.h
    -
    -=item HeSVKEY_force
    -
    -Returns the key as an C.  Will create and return a temporary mortal
    -C if the hash entry contains only a C key.
    -
    -	SV*	HeSVKEY_force(HE* he)
    -
    -=for hackers
    -Found in file hv.h
    -
    -=item HeSVKEY_set
    -
    -Sets the key to a given C, taking care to set the appropriate flags to
    -indicate the presence of an C key, and returns the same
    -C.
    -
    -	SV*	HeSVKEY_set(HE* he, SV* sv)
    -
    -=for hackers
    -Found in file hv.h
    -
    -=item HeVAL
    -
    -Returns the value slot (type C) stored in the hash entry.
    -
    -	SV*	HeVAL(HE* he)
    -
    -=for hackers
    -Found in file hv.h
    -
    -=item HvNAME
    -
    -Returns the package name of a stash.  See C, C.
    -
    -	char*	HvNAME(HV* stash)
    -
    -=for hackers
    -Found in file hv.h
    -
    -=item hv_clear
    -
    -Clears a hash, making it empty.
    -
    -	void	hv_clear(HV* tb)
    -
    -=for hackers
    -Found in file hv.c
    -
    -=item hv_delete
    -
    -Deletes a key/value pair in the hash.  The value SV is removed from the
    -hash and returned to the caller.  The C is the length of the key. 
    -The C value will normally be zero; if set to G_DISCARD then NULL
    -will be returned.
    -
    -	SV*	hv_delete(HV* tb, const char* key, U32 klen, I32 flags)
    -
    -=for hackers
    -Found in file hv.c
    -
    -=item hv_delete_ent
    -
    -Deletes a key/value pair in the hash.  The value SV is removed from the
    -hash and returned to the caller.  The C value will normally be zero;
    -if set to G_DISCARD then NULL will be returned.  C can be a valid
    -precomputed hash value, or 0 to ask for it to be computed.
    -
    -	SV*	hv_delete_ent(HV* tb, SV* key, I32 flags, U32 hash)
    -
    -=for hackers
    -Found in file hv.c
    -
    -=item hv_exists
    -
    -Returns a boolean indicating whether the specified hash key exists.  The
    -C is the length of the key.
    -
    -	bool	hv_exists(HV* tb, const char* key, U32 klen)
    -
    -=for hackers
    -Found in file hv.c
    -
    -=item hv_exists_ent
    -
    -Returns a boolean indicating whether the specified hash key exists. C
    -can be a valid precomputed hash value, or 0 to ask for it to be
    -computed.
    -
    -	bool	hv_exists_ent(HV* tb, SV* key, U32 hash)
    -
    -=for hackers
    -Found in file hv.c
    -
    -=item hv_fetch
    -
    -Returns the SV which corresponds to the specified key in the hash.  The
    -C is the length of the key.  If C is set then the fetch will be
    -part of a store.  Check that the return value is non-null before
    -dereferencing it to a C. 
    -
    -See L for more
    -information on how to use this function on tied hashes.
    -
    -	SV**	hv_fetch(HV* tb, const char* key, U32 klen, I32 lval)
    -
    -=for hackers
    -Found in file hv.c
    -
    -=item hv_fetch_ent
    -
    -Returns the hash entry which corresponds to the specified key in the hash.
    -C must be a valid precomputed hash number for the given C, or 0
    -if you want the function to compute it.  IF C is set then the fetch
    -will be part of a store.  Make sure the return value is non-null before
    -accessing it.  The return value when C is a tied hash is a pointer to a
    -static location, so be sure to make a copy of the structure if you need to
    -store it somewhere. 
    -
    -See L for more
    -information on how to use this function on tied hashes.
    -
    -	HE*	hv_fetch_ent(HV* tb, SV* key, I32 lval, U32 hash)
    -
    -=for hackers
    -Found in file hv.c
    -
    -=item hv_iterinit
    -
    -Prepares a starting point to traverse a hash table.  Returns the number of
    -keys in the hash (i.e. the same as C).  The return value is
    -currently only meaningful for hashes without tie magic. 
    -
    -NOTE: Before version 5.004_65, C used to return the number of
    -hash buckets that happen to be in use.  If you still need that esoteric
    -value, you can get it through the macro C.
    -
    -	I32	hv_iterinit(HV* tb)
    -
    -=for hackers
    -Found in file hv.c
    -
    -=item hv_iterkey
    -
    -Returns the key from the current position of the hash iterator.  See
    -C.
    -
    -	char*	hv_iterkey(HE* entry, I32* retlen)
    -
    -=for hackers
    -Found in file hv.c
    -
    -=item hv_iterkeysv
    -
    -Returns the key as an C from the current position of the hash
    -iterator.  The return value will always be a mortal copy of the key.  Also
    -see C.
    -
    -	SV*	hv_iterkeysv(HE* entry)
    -
    -=for hackers
    -Found in file hv.c
    -
    -=item hv_iternext
    -
    -Returns entries from a hash iterator.  See C.
    -
    -	HE*	hv_iternext(HV* tb)
    -
    -=for hackers
    -Found in file hv.c
    -
    -=item hv_iternextsv
    -
    -Performs an C, C, and C in one
    -operation.
    -
    -	SV*	hv_iternextsv(HV* hv, char** key, I32* retlen)
    -
    -=for hackers
    -Found in file hv.c
    -
    -=item hv_iterval
    -
    -Returns the value from the current position of the hash iterator.  See
    -C.
    -
    -	SV*	hv_iterval(HV* tb, HE* entry)
    -
    -=for hackers
    -Found in file hv.c
    -
    -=item hv_magic
    -
    -Adds magic to a hash.  See C.
    -
    -	void	hv_magic(HV* hv, GV* gv, int how)
    -
    -=for hackers
    -Found in file hv.c
    -
    -=item hv_store
    -
    -Stores an SV in a hash.  The hash key is specified as C and C is
    -the length of the key.  The C parameter is the precomputed hash
    -value; if it is zero then Perl will compute it.  The return value will be
    -NULL if the operation failed or if the value did not need to be actually
    -stored within the hash (as in the case of tied hashes).  Otherwise it can
    -be dereferenced to get the original C.  Note that the caller is
    -responsible for suitably incrementing the reference count of C before
    -the call, and decrementing it if the function returned NULL.  
    -
    -See L for more
    -information on how to use this function on tied hashes.
    -
    -	SV**	hv_store(HV* tb, const char* key, U32 klen, SV* val, U32 hash)
    -
    -=for hackers
    -Found in file hv.c
    -
    -=item hv_store_ent
    -
    -Stores C in a hash.  The hash key is specified as C.  The C
    -parameter is the precomputed hash value; if it is zero then Perl will
    -compute it.  The return value is the new hash entry so created.  It will be
    -NULL if the operation failed or if the value did not need to be actually
    -stored within the hash (as in the case of tied hashes).  Otherwise the
    -contents of the return value can be accessed using the C macros
    -described here.  Note that the caller is responsible for suitably
    -incrementing the reference count of C before the call, and
    -decrementing it if the function returned NULL. 
    -
    -See L for more
    -information on how to use this function on tied hashes.
    -
    -	HE*	hv_store_ent(HV* tb, SV* key, SV* val, U32 hash)
    -
    -=for hackers
    -Found in file hv.c
    -
    -=item hv_undef
    -
    -Undefines the hash.
    -
    -	void	hv_undef(HV* tb)
    -
    -=for hackers
    -Found in file hv.c
    -
    -=item isALNUM
    -
    -Returns a boolean indicating whether the C C is an ASCII alphanumeric
    -character (including underscore) or digit.
    -
    -	bool	isALNUM(char ch)
    -
    -=for hackers
    -Found in file handy.h
    -
    -=item isALPHA
    -
    -Returns a boolean indicating whether the C C is an ASCII alphabetic
    -character.
    -
    -	bool	isALPHA(char ch)
    -
    -=for hackers
    -Found in file handy.h
    -
    -=item isDIGIT
    -
    -Returns a boolean indicating whether the C C is an ASCII
    -digit.
    -
    -	bool	isDIGIT(char ch)
    -
    -=for hackers
    -Found in file handy.h
    -
    -=item isLOWER
    -
    -Returns a boolean indicating whether the C C is a lowercase
    -character.
    -
    -	bool	isLOWER(char ch)
    -
    -=for hackers
    -Found in file handy.h
    -
    -=item isSPACE
    -
    -Returns a boolean indicating whether the C C is whitespace.
    -
    -	bool	isSPACE(char ch)
    -
    -=for hackers
    -Found in file handy.h
    -
    -=item isUPPER
    -
    -Returns a boolean indicating whether the C C is an uppercase
    -character.
    -
    -	bool	isUPPER(char ch)
    -
    -=for hackers
    -Found in file handy.h
    -
    -=item is_utf8_char
    -
    -Tests if some arbitrary number of bytes begins in a valid UTF-8 character.
    -The actual number of bytes in the UTF-8 character will be returned if it
    -is valid, otherwise 0. 
    - 
    -	STRLEN	is_utf8_char(U8 *p)
    -
    -=for hackers
    -Found in file utf8.c
    -
    -=item is_utf8_string
    -
    -Returns true if first C bytes of the given string form valid a UTF8
    -string, false otherwise.
    -
    -	bool	is_utf8_string(U8 *s, STRLEN len)
    -
    -=for hackers
    -Found in file utf8.c
    -
    -=item items
    -
    -Variable which is setup by C to indicate the number of 
    -items on the stack.  See L.
    -
    -	I32	items
    -
    -=for hackers
    -Found in file XSUB.h
    -
    -=item ix
    -
    -Variable which is setup by C to indicate which of an 
    -XSUB's aliases was used to invoke it.  See L.
    -
    -	I32	ix
    -
    -=for hackers
    -Found in file XSUB.h
    -
    -=item LEAVE
    -
    -Closing bracket on a callback.  See C and L.
    -
    -		LEAVE;
    -
    -=for hackers
    -Found in file scope.h
    -
    -=item looks_like_number
    -
    -Test if an the content of an SV looks like a number (or is a
    -number).
    -
    -	I32	looks_like_number(SV* sv)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item MARK
    -
    -Stack marker variable for the XSUB.  See C.
    -
    -=for hackers
    -Found in file pp.h
    -
    -=item mg_clear
    -
    -Clear something magical that the SV represents.  See C.
    -
    -	int	mg_clear(SV* sv)
    -
    -=for hackers
    -Found in file mg.c
    -
    -=item mg_copy
    -
    -Copies the magic from one SV to another.  See C.
    -
    -	int	mg_copy(SV* sv, SV* nsv, const char* key, I32 klen)
    -
    -=for hackers
    -Found in file mg.c
    -
    -=item mg_find
    -
    -Finds the magic pointer for type matching the SV.  See C.
    -
    -	MAGIC*	mg_find(SV* sv, int type)
    -
    -=for hackers
    -Found in file mg.c
    -
    -=item mg_free
    -
    -Free any magic storage used by the SV.  See C.
    -
    -	int	mg_free(SV* sv)
    -
    -=for hackers
    -Found in file mg.c
    -
    -=item mg_get
    -
    -Do magic after a value is retrieved from the SV.  See C.
    -
    -	int	mg_get(SV* sv)
    -
    -=for hackers
    -Found in file mg.c
    -
    -=item mg_length
    -
    -Report on the SV's length.  See C.
    -
    -	U32	mg_length(SV* sv)
    -
    -=for hackers
    -Found in file mg.c
    -
    -=item mg_magical
    -
    -Turns on the magical status of an SV.  See C.
    -
    -	void	mg_magical(SV* sv)
    -
    -=for hackers
    -Found in file mg.c
    -
    -=item mg_set
    -
    -Do magic after a value is assigned to the SV.  See C.
    -
    -	int	mg_set(SV* sv)
    -
    -=for hackers
    -Found in file mg.c
    -
    -=item Move
    -
    -The XSUB-writer's interface to the C C function.  The C is the
    -source, C is the destination, C is the number of items, and C is
    -the type.  Can do overlapping moves.  See also C.
    -
    -	void	Move(void* src, void* dest, int nitems, type)
    -
    -=for hackers
    -Found in file handy.h
    -
    -=item New
    -
    -The XSUB-writer's interface to the C C function.
    -
    -	void	New(int id, void* ptr, int nitems, type)
    -
    -=for hackers
    -Found in file handy.h
    -
    -=item newAV
    -
    -Creates a new AV.  The reference count is set to 1.
    -
    -	AV*	newAV()
    -
    -=for hackers
    -Found in file av.c
    -
    -=item Newc
    -
    -The XSUB-writer's interface to the C C function, with
    -cast.
    -
    -	void	Newc(int id, void* ptr, int nitems, type, cast)
    -
    -=for hackers
    -Found in file handy.h
    -
    -=item newCONSTSUB
    -
    -Creates a constant sub equivalent to Perl C which is
    -eligible for inlining at compile-time.
    -
    -	void	newCONSTSUB(HV* stash, char* name, SV* sv)
    -
    -=for hackers
    -Found in file op.c
    -
    -=item newHV
    -
    -Creates a new HV.  The reference count is set to 1.
    -
    -	HV*	newHV()
    -
    -=for hackers
    -Found in file hv.c
    -
    -=item newRV_inc
    -
    -Creates an RV wrapper for an SV.  The reference count for the original SV is
    -incremented.
    -
    -	SV*	newRV_inc(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item newRV_noinc
    -
    -Creates an RV wrapper for an SV.  The reference count for the original
    -SV is B incremented.
    -
    -	SV*	newRV_noinc(SV *sv)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item NEWSV
    -
    -Creates a new SV.  A non-zero C parameter indicates the number of
    -bytes of preallocated string space the SV should have.  An extra byte for a
    -tailing NUL is also reserved.  (SvPOK is not set for the SV even if string
    -space is allocated.)  The reference count for the new SV is set to 1.
    -C is an integer id between 0 and 1299 (used to identify leaks).
    -
    -	SV*	NEWSV(int id, STRLEN len)
    -
    -=for hackers
    -Found in file handy.h
    -
    -=item newSViv
    -
    -Creates a new SV and copies an integer into it.  The reference count for the
    -SV is set to 1.
    -
    -	SV*	newSViv(IV i)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item newSVnv
    -
    -Creates a new SV and copies a floating point value into it.
    -The reference count for the SV is set to 1.
    -
    -	SV*	newSVnv(NV n)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item newSVpv
    -
    -Creates a new SV and copies a string into it.  The reference count for the
    -SV is set to 1.  If C is zero, Perl will compute the length using
    -strlen().  For efficiency, consider using C instead.
    -
    -	SV*	newSVpv(const char* s, STRLEN len)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item newSVpvf
    -
    -Creates a new SV an initialize it with the string formatted like
    -C.
    -
    -	SV*	newSVpvf(const char* pat, ...)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item newSVpvn
    -
    -Creates a new SV and copies a string into it.  The reference count for the
    -SV is set to 1.  Note that if C is zero, Perl will create a zero length 
    -string.  You are responsible for ensuring that the source string is at least
    -C bytes long.
    -
    -	SV*	newSVpvn(const char* s, STRLEN len)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item newSVrv
    -
    -Creates a new SV for the RV, C, to point to.  If C is not an RV then
    -it will be upgraded to one.  If C is non-null then the new SV will
    -be blessed in the specified package.  The new SV is returned and its
    -reference count is 1.
    -
    -	SV*	newSVrv(SV* rv, const char* classname)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item newSVsv
    -
    -Creates a new SV which is an exact duplicate of the original SV.
    -
    -	SV*	newSVsv(SV* old)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item newSVuv
    -
    -Creates a new SV and copies an unsigned integer into it.
    -The reference count for the SV is set to 1.
    -
    -	SV*	newSVuv(UV u)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item newXS
    -
    -Used by C to hook up XSUBs as Perl subs.
    -
    -=for hackers
    -Found in file op.c
    -
    -=item newXSproto
    -
    -Used by C to hook up XSUBs as Perl subs.  Adds Perl prototypes to
    -the subs.
    -
    -=for hackers
    -Found in file XSUB.h
    -
    -=item Newz
    -
    -The XSUB-writer's interface to the C C function.  The allocated
    -memory is zeroed with C.
    -
    -	void	Newz(int id, void* ptr, int nitems, type)
    -
    -=for hackers
    -Found in file handy.h
    -
    -=item Nullav
    -
    -Null AV pointer.
    -
    -=for hackers
    -Found in file av.h
    -
    -=item Nullch
    -
    -Null character pointer.
    -
    -=for hackers
    -Found in file handy.h
    -
    -=item Nullcv
    -
    -Null CV pointer.
    -
    -=for hackers
    -Found in file cv.h
    -
    -=item Nullhv
    -
    -Null HV pointer.
    -
    -=for hackers
    -Found in file hv.h
    -
    -=item Nullsv
    -
    -Null SV pointer.
    -
    -=for hackers
    -Found in file handy.h
    -
    -=item ORIGMARK
    -
    -The original stack mark for the XSUB.  See C.
    -
    -=for hackers
    -Found in file pp.h
    -
    -=item perl_alloc
    -
    -Allocates a new Perl interpreter.  See L.
    -
    -	PerlInterpreter*	perl_alloc()
    -
    -=for hackers
    -Found in file perl.c
    -
    -=item perl_construct
    -
    -Initializes a new Perl interpreter.  See L.
    -
    -	void	perl_construct(PerlInterpreter* interp)
    -
    -=for hackers
    -Found in file perl.c
    -
    -=item perl_destruct
    -
    -Shuts down a Perl interpreter.  See L.
    -
    -	void	perl_destruct(PerlInterpreter* interp)
    -
    -=for hackers
    -Found in file perl.c
    -
    -=item perl_free
    -
    -Releases a Perl interpreter.  See L.
    -
    -	void	perl_free(PerlInterpreter* interp)
    -
    -=for hackers
    -Found in file perl.c
    -
    -=item perl_parse
    -
    -Tells a Perl interpreter to parse a Perl script.  See L.
    -
    -	int	perl_parse(PerlInterpreter* interp, XSINIT_t xsinit, int argc, char** argv, char** env)
    -
    -=for hackers
    -Found in file perl.c
    -
    -=item perl_run
    -
    -Tells a Perl interpreter to run.  See L.
    -
    -	int	perl_run(PerlInterpreter* interp)
    -
    -=for hackers
    -Found in file perl.c
    -
    -=item PL_modglobal
    -
    -C is a general purpose, interpreter global HV for use by 
    -extensions that need to keep information on a per-interpreter basis.
    -In a pinch, it can also be used as a symbol table for extensions 
    -to share data among each other.  It is a good idea to use keys 
    -prefixed by the package name of the extension that owns the data.
    -
    -	HV*	PL_modglobal
    -
    -=for hackers
    -Found in file intrpvar.h
    -
    -=item PL_na
    -
    -A convenience variable which is typically used with C when one
    -doesn't care about the length of the string.  It is usually more efficient
    -to either declare a local variable and use that instead or to use the
    -C macro.
    -
    -	STRLEN	PL_na
    -
    -=for hackers
    -Found in file thrdvar.h
    -
    -=item PL_sv_no
    -
    -This is the C SV.  See C.  Always refer to this as
    -C<&PL_sv_no>.
    -
    -	SV	PL_sv_no
    -
    -=for hackers
    -Found in file intrpvar.h
    -
    -=item PL_sv_undef
    -
    -This is the C SV.  Always refer to this as C<&PL_sv_undef>.
    -
    -	SV	PL_sv_undef
    -
    -=for hackers
    -Found in file intrpvar.h
    -
    -=item PL_sv_yes
    -
    -This is the C SV.  See C.  Always refer to this as
    -C<&PL_sv_yes>.
    -
    -	SV	PL_sv_yes
    -
    -=for hackers
    -Found in file intrpvar.h
    -
    -=item POPi
    -
    -Pops an integer off the stack.
    -
    -	IV	POPi
    -
    -=for hackers
    -Found in file pp.h
    -
    -=item POPl
    -
    -Pops a long off the stack.
    -
    -	long	POPl
    -
    -=for hackers
    -Found in file pp.h
    -
    -=item POPn
    -
    -Pops a double off the stack.
    -
    -	NV	POPn
    -
    -=for hackers
    -Found in file pp.h
    -
    -=item POPp
    -
    -Pops a string off the stack.
    -
    -	char*	POPp
    -
    -=for hackers
    -Found in file pp.h
    -
    -=item POPs
    -
    -Pops an SV off the stack.
    -
    -	SV*	POPs
    -
    -=for hackers
    -Found in file pp.h
    -
    -=item PUSHi
    -
    -Push an integer onto the stack.  The stack must have room for this element.
    -Handles 'set' magic.  See C.
    -
    -	void	PUSHi(IV iv)
    -
    -=for hackers
    -Found in file pp.h
    -
    -=item PUSHMARK
    -
    -Opening bracket for arguments on a callback.  See C and
    -L.
    -
    -		PUSHMARK;
    -
    -=for hackers
    -Found in file pp.h
    -
    -=item PUSHn
    -
    -Push a double onto the stack.  The stack must have room for this element.
    -Handles 'set' magic.  See C.
    -
    -	void	PUSHn(NV nv)
    -
    -=for hackers
    -Found in file pp.h
    -
    -=item PUSHp
    -
    -Push a string onto the stack.  The stack must have room for this element.
    -The C indicates the length of the string.  Handles 'set' magic.  See
    -C.
    -
    -	void	PUSHp(char* str, STRLEN len)
    -
    -=for hackers
    -Found in file pp.h
    -
    -=item PUSHs
    -
    -Push an SV onto the stack.  The stack must have room for this element.
    -Does not handle 'set' magic.  See C.
    -
    -	void	PUSHs(SV* sv)
    -
    -=for hackers
    -Found in file pp.h
    -
    -=item PUSHu
    -
    -Push an unsigned integer onto the stack.  The stack must have room for this
    -element.  See C.
    -
    -	void	PUSHu(UV uv)
    -
    -=for hackers
    -Found in file pp.h
    -
    -=item PUTBACK
    -
    -Closing bracket for XSUB arguments.  This is usually handled by C.
    -See C and L for other uses.
    -
    -		PUTBACK;
    -
    -=for hackers
    -Found in file pp.h
    -
    -=item Renew
    -
    -The XSUB-writer's interface to the C C function.
    -
    -	void	Renew(void* ptr, int nitems, type)
    -
    -=for hackers
    -Found in file handy.h
    -
    -=item Renewc
    -
    -The XSUB-writer's interface to the C C function, with
    -cast.
    -
    -	void	Renewc(void* ptr, int nitems, type, cast)
    -
    -=for hackers
    -Found in file handy.h
    -
    -=item require_pv
    -
    -Tells Perl to C a module.
    -
    -NOTE: the perl_ form of this function is deprecated.
    -
    -	void	require_pv(const char* pv)
    -
    -=for hackers
    -Found in file perl.c
    -
    -=item RETVAL
    -
    -Variable which is setup by C to hold the return value for an 
    -XSUB. This is always the proper type for the XSUB. See 
    -L.
    -
    -	(whatever)	RETVAL
    -
    -=for hackers
    -Found in file XSUB.h
    -
    -=item Safefree
    -
    -The XSUB-writer's interface to the C C function.
    -
    -	void	Safefree(void* ptr)
    -
    -=for hackers
    -Found in file handy.h
    -
    -=item savepv
    -
    -Copy a string to a safe spot.  This does not use an SV.
    -
    -	char*	savepv(const char* sv)
    -
    -=for hackers
    -Found in file util.c
    -
    -=item savepvn
    -
    -Copy a string to a safe spot.  The C indicates number of bytes to
    -copy.  This does not use an SV.
    -
    -	char*	savepvn(const char* sv, I32 len)
    -
    -=for hackers
    -Found in file util.c
    -
    -=item SAVETMPS
    -
    -Opening bracket for temporaries on a callback.  See C and
    -L.
    -
    -		SAVETMPS;
    -
    -=for hackers
    -Found in file scope.h
    -
    -=item SP
    -
    -Stack pointer.  This is usually handled by C.  See C and
    -C.
    -
    -=for hackers
    -Found in file pp.h
    -
    -=item SPAGAIN
    -
    -Refetch the stack pointer.  Used after a callback.  See L.
    -
    -		SPAGAIN;
    -
    -=for hackers
    -Found in file pp.h
    -
    -=item ST
    -
    -Used to access elements on the XSUB's stack.
    -
    -	SV*	ST(int ix)
    -
    -=for hackers
    -Found in file XSUB.h
    -
    -=item strEQ
    -
    -Test two strings to see if they are equal.  Returns true or false.
    -
    -	bool	strEQ(char* s1, char* s2)
    -
    -=for hackers
    -Found in file handy.h
    -
    -=item strGE
    -
    -Test two strings to see if the first, C, is greater than or equal to
    -the second, C.  Returns true or false.
    -
    -	bool	strGE(char* s1, char* s2)
    -
    -=for hackers
    -Found in file handy.h
    -
    -=item strGT
    -
    -Test two strings to see if the first, C, is greater than the second,
    -C.  Returns true or false.
    -
    -	bool	strGT(char* s1, char* s2)
    -
    -=for hackers
    -Found in file handy.h
    -
    -=item strLE
    -
    -Test two strings to see if the first, C, is less than or equal to the
    -second, C.  Returns true or false.
    -
    -	bool	strLE(char* s1, char* s2)
    -
    -=for hackers
    -Found in file handy.h
    -
    -=item strLT
    -
    -Test two strings to see if the first, C, is less than the second,
    -C.  Returns true or false.
    -
    -	bool	strLT(char* s1, char* s2)
    -
    -=for hackers
    -Found in file handy.h
    -
    -=item strNE
    -
    -Test two strings to see if they are different.  Returns true or
    -false.
    -
    -	bool	strNE(char* s1, char* s2)
    -
    -=for hackers
    -Found in file handy.h
    -
    -=item strnEQ
    -
    -Test two strings to see if they are equal.  The C parameter indicates
    -the number of bytes to compare.  Returns true or false. (A wrapper for
    -C).
    -
    -	bool	strnEQ(char* s1, char* s2, STRLEN len)
    -
    -=for hackers
    -Found in file handy.h
    -
    -=item strnNE
    -
    -Test two strings to see if they are different.  The C parameter
    -indicates the number of bytes to compare.  Returns true or false. (A
    -wrapper for C).
    -
    -	bool	strnNE(char* s1, char* s2, STRLEN len)
    -
    -=for hackers
    -Found in file handy.h
    -
    -=item StructCopy
    -
    -This is an architecture-independent macro to copy one structure to another.
    -
    -	void	StructCopy(type src, type dest, type)
    -
    -=for hackers
    -Found in file handy.h
    -
    -=item SvCUR
    -
    -Returns the length of the string which is in the SV.  See C.
    -
    -	STRLEN	SvCUR(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvCUR_set
    -
    -Set the length of the string which is in the SV.  See C.
    -
    -	void	SvCUR_set(SV* sv, STRLEN len)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvEND
    -
    -Returns a pointer to the last character in the string which is in the SV.
    -See C.  Access the character as *(SvEND(sv)).
    -
    -	char*	SvEND(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvGETMAGIC
    -
    -Invokes C on an SV if it has 'get' magic.  This macro evaluates its
    -argument more than once.
    -
    -	void	SvGETMAGIC(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvGROW
    -
    -Expands the character buffer in the SV so that it has room for the
    -indicated number of bytes (remember to reserve space for an extra trailing
    -NUL character).  Calls C to perform the expansion if necessary. 
    -Returns a pointer to the character buffer.
    -
    -	void	SvGROW(SV* sv, STRLEN len)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvIOK
    -
    -Returns a boolean indicating whether the SV contains an integer.
    -
    -	bool	SvIOK(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvIOKp
    -
    -Returns a boolean indicating whether the SV contains an integer.  Checks
    -the B setting.  Use C.
    -
    -	bool	SvIOKp(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvIOK_notUV
    -
    -Returns a boolean indicating whether the SV contains an signed integer.
    -
    -	void	SvIOK_notUV(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvIOK_off
    -
    -Unsets the IV status of an SV.
    -
    -	void	SvIOK_off(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvIOK_on
    -
    -Tells an SV that it is an integer.
    -
    -	void	SvIOK_on(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvIOK_only
    -
    -Tells an SV that it is an integer and disables all other OK bits.
    -
    -	void	SvIOK_only(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvIOK_only_UV
    -
    -Tells and SV that it is an unsigned integer and disables all other OK bits.
    -
    -	void	SvIOK_only_UV(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvIOK_UV
    -
    -Returns a boolean indicating whether the SV contains an unsigned integer.
    -
    -	void	SvIOK_UV(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvIV
    -
    -Coerces the given SV to an integer and returns it.
    -
    -	IV	SvIV(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvIVX
    -
    -Returns the integer which is stored in the SV, assuming SvIOK is
    -true.
    -
    -	IV	SvIVX(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvLEN
    -
    -Returns the size of the string buffer in the SV, not including any part
    -attributable to C.  See C.
    -
    -	STRLEN	SvLEN(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvNIOK
    -
    -Returns a boolean indicating whether the SV contains a number, integer or
    -double.
    -
    -	bool	SvNIOK(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvNIOKp
    -
    -Returns a boolean indicating whether the SV contains a number, integer or
    -double.  Checks the B setting.  Use C.
    -
    -	bool	SvNIOKp(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvNIOK_off
    -
    -Unsets the NV/IV status of an SV.
    -
    -	void	SvNIOK_off(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvNOK
    -
    -Returns a boolean indicating whether the SV contains a double.
    -
    -	bool	SvNOK(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvNOKp
    -
    -Returns a boolean indicating whether the SV contains a double.  Checks the
    -B setting.  Use C.
    -
    -	bool	SvNOKp(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvNOK_off
    -
    -Unsets the NV status of an SV.
    -
    -	void	SvNOK_off(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvNOK_on
    -
    -Tells an SV that it is a double.
    -
    -	void	SvNOK_on(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvNOK_only
    -
    -Tells an SV that it is a double and disables all other OK bits.
    -
    -	void	SvNOK_only(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvNV
    -
    -Coerce the given SV to a double and return it.
    -
    -	NV	SvNV(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvNVX
    -
    -Returns the double which is stored in the SV, assuming SvNOK is
    -true.
    -
    -	NV	SvNVX(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvOK
    -
    -Returns a boolean indicating whether the value is an SV.
    -
    -	bool	SvOK(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvOOK
    -
    -Returns a boolean indicating whether the SvIVX is a valid offset value for
    -the SvPVX.  This hack is used internally to speed up removal of characters
    -from the beginning of a SvPV.  When SvOOK is true, then the start of the
    -allocated string buffer is really (SvPVX - SvIVX).
    -
    -	bool	SvOOK(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvPOK
    -
    -Returns a boolean indicating whether the SV contains a character
    -string.
    -
    -	bool	SvPOK(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvPOKp
    -
    -Returns a boolean indicating whether the SV contains a character string.
    -Checks the B setting.  Use C.
    -
    -	bool	SvPOKp(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvPOK_off
    -
    -Unsets the PV status of an SV.
    -
    -	void	SvPOK_off(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvPOK_on
    -
    -Tells an SV that it is a string.
    -
    -	void	SvPOK_on(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvPOK_only
    -
    -Tells an SV that it is a string and disables all other OK bits.
    -
    -	void	SvPOK_only(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvPOK_only_UTF8
    -
    -Tells an SV that it is a UTF8 string (do not use frivolously)
    -and disables all other OK bits.
    -  
    -	void	SvPOK_only_UTF8(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvPV
    -
    -Returns a pointer to the string in the SV, or a stringified form of the SV
    -if the SV does not contain a string.  Handles 'get' magic.
    -
    -	char*	SvPV(SV* sv, STRLEN len)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvPVX
    -
    -Returns a pointer to the string in the SV.  The SV must contain a
    -string.
    -
    -	char*	SvPVX(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvPV_force
    -
    -Like  but will force the SV into becoming a string (SvPOK).  You want
    -force if you are going to update the SvPVX directly.
    -
    -	char*	SvPV_force(SV* sv, STRLEN len)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvPV_nolen
    -
    -Returns a pointer to the string in the SV, or a stringified form of the SV
    -if the SV does not contain a string.  Handles 'get' magic.
    -
    -	char*	SvPV_nolen(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvREFCNT
    -
    -Returns the value of the object's reference count.
    -
    -	U32	SvREFCNT(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvREFCNT_dec
    -
    -Decrements the reference count of the given SV.
    -
    -	void	SvREFCNT_dec(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvREFCNT_inc
    -
    -Increments the reference count of the given SV.
    -
    -	SV*	SvREFCNT_inc(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvROK
    -
    -Tests if the SV is an RV.
    -
    -	bool	SvROK(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvROK_off
    -
    -Unsets the RV status of an SV.
    -
    -	void	SvROK_off(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvROK_on
    -
    -Tells an SV that it is an RV.
    -
    -	void	SvROK_on(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvRV
    -
    -Dereferences an RV to return the SV.
    -
    -	SV*	SvRV(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvSETMAGIC
    -
    -Invokes C on an SV if it has 'set' magic.  This macro evaluates its
    -argument more than once.
    -
    -	void	SvSETMAGIC(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvSetSV
    -
    -Calls C if dsv is not the same as ssv.  May evaluate arguments
    -more than once.
    -
    -	void	SvSetSV(SV* dsb, SV* ssv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvSetSV_nosteal
    -
    -Calls a non-destructive version of C if dsv is not the same as
    -ssv. May evaluate arguments more than once.
    -
    -	void	SvSetSV_nosteal(SV* dsv, SV* ssv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvSTASH
    -
    -Returns the stash of the SV.
    -
    -	HV*	SvSTASH(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvTAINT
    -
    -Taints an SV if tainting is enabled
    -
    -	void	SvTAINT(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvTAINTED
    -
    -Checks to see if an SV is tainted. Returns TRUE if it is, FALSE if
    -not.
    -
    -	bool	SvTAINTED(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvTAINTED_off
    -
    -Untaints an SV. Be I careful with this routine, as it short-circuits
    -some of Perl's fundamental security features. XS module authors should not
    -use this function unless they fully understand all the implications of
    -unconditionally untainting the value. Untainting should be done in the
    -standard perl fashion, via a carefully crafted regexp, rather than directly
    -untainting variables.
    -
    -	void	SvTAINTED_off(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvTAINTED_on
    -
    -Marks an SV as tainted.
    -
    -	void	SvTAINTED_on(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvTRUE
    -
    -Returns a boolean indicating whether Perl would evaluate the SV as true or
    -false, defined or undefined.  Does not handle 'get' magic.
    -
    -	bool	SvTRUE(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item svtype
    -
    -An enum of flags for Perl types.  These are found in the file B 
    -in the C enum.  Test these flags with the C macro.
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvTYPE
    -
    -Returns the type of the SV.  See C.
    -
    -	svtype	SvTYPE(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SVt_IV
    -
    -Integer type flag for scalars.  See C.
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SVt_NV
    -
    -Double type flag for scalars.  See C.
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SVt_PV
    -
    -Pointer type flag for scalars.  See C.
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SVt_PVAV
    -
    -Type flag for arrays.  See C.
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SVt_PVCV
    -
    -Type flag for code refs.  See C.
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SVt_PVHV
    -
    -Type flag for hashes.  See C.
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SVt_PVMG
    -
    -Type flag for blessed scalars.  See C.
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvUPGRADE
    -
    -Used to upgrade an SV to a more complex form.  Uses C to
    -perform the upgrade if necessary.  See C.
    -
    -	void	SvUPGRADE(SV* sv, svtype type)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvUTF8
    -
    -Returns a boolean indicating whether the SV contains UTF-8 encoded data.
    -
    -	void	SvUTF8(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvUTF8_off
    -
    -Unsets the UTF8 status of an SV.
    -
    -	void	SvUTF8_off(SV *sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvUTF8_on
    -
    -Tells an SV that it is a string and encoded in UTF8.  Do not use frivolously.
    -
    -	void	SvUTF8_on(SV *sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvUV
    -
    -Coerces the given SV to an unsigned integer and returns it.
    -
    -	UV	SvUV(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item SvUVX
    -
    -Returns the unsigned integer which is stored in the SV, assuming SvIOK is
    -true.
    -
    -	UV	SvUVX(SV* sv)
    -
    -=for hackers
    -Found in file sv.h
    -
    -=item sv_2mortal
    -
    -Marks an SV as mortal.  The SV will be destroyed when the current context
    -ends.
    -
    -	SV*	sv_2mortal(SV* sv)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_bless
    -
    -Blesses an SV into a specified package.  The SV must be an RV.  The package
    -must be designated by its stash (see C).  The reference count
    -of the SV is unaffected.
    -
    -	SV*	sv_bless(SV* sv, HV* stash)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_catpv
    -
    -Concatenates the string onto the end of the string which is in the SV.
    -Handles 'get' magic, but not 'set' magic.  See C.
    -
    -	void	sv_catpv(SV* sv, const char* ptr)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_catpvf
    -
    -Processes its arguments like C and appends the formatted output
    -to an SV.  Handles 'get' magic, but not 'set' magic.  C must
    -typically be called after calling this function to handle 'set' magic.
    -
    -	void	sv_catpvf(SV* sv, const char* pat, ...)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_catpvf_mg
    -
    -Like C, but also handles 'set' magic.
    -
    -	void	sv_catpvf_mg(SV *sv, const char* pat, ...)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_catpvn
    -
    -Concatenates the string onto the end of the string which is in the SV.  The
    -C indicates number of bytes to copy.  Handles 'get' magic, but not
    -'set' magic.  See C.
    -
    -	void	sv_catpvn(SV* sv, const char* ptr, STRLEN len)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_catpvn_mg
    -
    -Like C, but also handles 'set' magic.
    -
    -	void	sv_catpvn_mg(SV *sv, const char *ptr, STRLEN len)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_catpv_mg
    -
    -Like C, but also handles 'set' magic.
    -
    -	void	sv_catpv_mg(SV *sv, const char *ptr)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_catsv
    -
    -Concatenates the string from SV C onto the end of the string in
    -SV C.  Modifies C but not C.  Handles 'get' magic, but
    -not 'set' magic.  See C.
    -
    -	void	sv_catsv(SV* dsv, SV* ssv)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_catsv_mg
    -
    -Like C, but also handles 'set' magic.
    -
    -	void	sv_catsv_mg(SV *dstr, SV *sstr)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_chop
    -
    -Efficient removal of characters from the beginning of the string buffer. 
    -SvPOK(sv) must be true and the C must be a pointer to somewhere inside
    -the string buffer.  The C becomes the first character of the adjusted
    -string.
    -
    -	void	sv_chop(SV* sv, char* ptr)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_clear
    -
    -Clear an SV, making it empty. Does not free the memory used by the SV
    -itself.
    -
    -	void	sv_clear(SV* sv)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_cmp
    -
    -Compares the strings in two SVs.  Returns -1, 0, or 1 indicating whether the
    -string in C is less than, equal to, or greater than the string in
    -C.
    -
    -	I32	sv_cmp(SV* sv1, SV* sv2)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_cmp_locale
    -
    -Compares the strings in two SVs in a locale-aware manner. See
    -L
    -
    -	I32	sv_cmp_locale(SV* sv1, SV* sv2)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_dec
    -
    -Auto-decrement of the value in the SV.
    -
    -	void	sv_dec(SV* sv)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_derived_from
    -
    -Returns a boolean indicating whether the SV is derived from the specified
    -class.  This is the function that implements C.  It works
    -for class names as well as for objects.
    -
    -	bool	sv_derived_from(SV* sv, const char* name)
    -
    -=for hackers
    -Found in file universal.c
    -
    -=item sv_eq
    -
    -Returns a boolean indicating whether the strings in the two SVs are
    -identical.
    -
    -	I32	sv_eq(SV* sv1, SV* sv2)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_free
    -
    -Free the memory used by an SV.
    -
    -	void	sv_free(SV* sv)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_gets
    -
    -Get a line from the filehandle and store it into the SV, optionally
    -appending to the currently-stored string.
    -
    -	char*	sv_gets(SV* sv, PerlIO* fp, I32 append)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_grow
    -
    -Expands the character buffer in the SV.  This will use C and will
    -upgrade the SV to C.  Returns a pointer to the character buffer.
    -Use C.
    -
    -	char*	sv_grow(SV* sv, STRLEN newlen)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_inc
    -
    -Auto-increment of the value in the SV.
    -
    -	void	sv_inc(SV* sv)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_insert
    -
    -Inserts a string at the specified offset/length within the SV. Similar to
    -the Perl substr() function.
    -
    -	void	sv_insert(SV* bigsv, STRLEN offset, STRLEN len, char* little, STRLEN littlelen)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_isa
    -
    -Returns a boolean indicating whether the SV is blessed into the specified
    -class.  This does not check for subtypes; use C to verify
    -an inheritance relationship.
    -
    -	int	sv_isa(SV* sv, const char* name)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_isobject
    -
    -Returns a boolean indicating whether the SV is an RV pointing to a blessed
    -object.  If the SV is not an RV, or if the object is not blessed, then this
    -will return false.
    -
    -	int	sv_isobject(SV* sv)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_len
    -
    -Returns the length of the string in the SV.  See also C.
    -
    -	STRLEN	sv_len(SV* sv)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_len_utf8
    -
    -Returns the number of characters in the string in an SV, counting wide
    -UTF8 bytes as a single character.
    -
    -	STRLEN	sv_len_utf8(SV* sv)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_magic
    -
    -Adds magic to an SV.
    -
    -	void	sv_magic(SV* sv, SV* obj, int how, const char* name, I32 namlen)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_mortalcopy
    -
    -Creates a new SV which is a copy of the original SV.  The new SV is marked
    -as mortal.
    -
    -	SV*	sv_mortalcopy(SV* oldsv)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_newmortal
    -
    -Creates a new SV which is mortal.  The reference count of the SV is set to 1.
    -
    -	SV*	sv_newmortal()
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_pvn_force
    -
    -Get a sensible string out of the SV somehow.
    -
    -	char*	sv_pvn_force(SV* sv, STRLEN* lp)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_pvutf8n_force
    -
    -Get a sensible UTF8-encoded string out of the SV somehow. See
    -L.
    -
    -	char*	sv_pvutf8n_force(SV* sv, STRLEN* lp)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_reftype
    -
    -Returns a string describing what the SV is a reference to.
    -
    -	char*	sv_reftype(SV* sv, int ob)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_replace
    -
    -Make the first argument a copy of the second, then delete the original.
    -
    -	void	sv_replace(SV* sv, SV* nsv)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_rvweaken
    -
    -Weaken a reference.
    -
    -	SV*	sv_rvweaken(SV *sv)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_setiv
    -
    -Copies an integer into the given SV.  Does not handle 'set' magic.  See
    -C.
    -
    -	void	sv_setiv(SV* sv, IV num)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_setiv_mg
    -
    -Like C, but also handles 'set' magic.
    -
    -	void	sv_setiv_mg(SV *sv, IV i)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_setnv
    -
    -Copies a double into the given SV.  Does not handle 'set' magic.  See
    -C.
    -
    -	void	sv_setnv(SV* sv, NV num)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_setnv_mg
    -
    -Like C, but also handles 'set' magic.
    -
    -	void	sv_setnv_mg(SV *sv, NV num)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_setpv
    -
    -Copies a string into an SV.  The string must be null-terminated.  Does not
    -handle 'set' magic.  See C.
    -
    -	void	sv_setpv(SV* sv, const char* ptr)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_setpvf
    -
    -Processes its arguments like C and sets an SV to the formatted
    -output.  Does not handle 'set' magic.  See C.
    -
    -	void	sv_setpvf(SV* sv, const char* pat, ...)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_setpvf_mg
    -
    -Like C, but also handles 'set' magic.
    -
    -	void	sv_setpvf_mg(SV *sv, const char* pat, ...)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_setpviv
    -
    -Copies an integer into the given SV, also updating its string value.
    -Does not handle 'set' magic.  See C.
    -
    -	void	sv_setpviv(SV* sv, IV num)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_setpviv_mg
    -
    -Like C, but also handles 'set' magic.
    -
    -	void	sv_setpviv_mg(SV *sv, IV iv)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_setpvn
    -
    -Copies a string into an SV.  The C parameter indicates the number of
    -bytes to be copied.  Does not handle 'set' magic.  See C.
    -
    -	void	sv_setpvn(SV* sv, const char* ptr, STRLEN len)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_setpvn_mg
    -
    -Like C, but also handles 'set' magic.
    -
    -	void	sv_setpvn_mg(SV *sv, const char *ptr, STRLEN len)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_setpv_mg
    -
    -Like C, but also handles 'set' magic.
    -
    -	void	sv_setpv_mg(SV *sv, const char *ptr)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_setref_iv
    -
    -Copies an integer into a new SV, optionally blessing the SV.  The C
    -argument will be upgraded to an RV.  That RV will be modified to point to
    -the new SV.  The C argument indicates the package for the
    -blessing.  Set C to C to avoid the blessing.  The new SV
    -will be returned and will have a reference count of 1.
    -
    -	SV*	sv_setref_iv(SV* rv, const char* classname, IV iv)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_setref_nv
    -
    -Copies a double into a new SV, optionally blessing the SV.  The C
    -argument will be upgraded to an RV.  That RV will be modified to point to
    -the new SV.  The C argument indicates the package for the
    -blessing.  Set C to C to avoid the blessing.  The new SV
    -will be returned and will have a reference count of 1.
    -
    -	SV*	sv_setref_nv(SV* rv, const char* classname, NV nv)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_setref_pv
    -
    -Copies a pointer into a new SV, optionally blessing the SV.  The C
    -argument will be upgraded to an RV.  That RV will be modified to point to
    -the new SV.  If the C argument is NULL then C will be placed
    -into the SV.  The C argument indicates the package for the
    -blessing.  Set C to C to avoid the blessing.  The new SV
    -will be returned and will have a reference count of 1.
    -
    -Do not use with other Perl types such as HV, AV, SV, CV, because those
    -objects will become corrupted by the pointer copy process.
    -
    -Note that C copies the string while this copies the pointer.
    -
    -	SV*	sv_setref_pv(SV* rv, const char* classname, void* pv)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_setref_pvn
    -
    -Copies a string into a new SV, optionally blessing the SV.  The length of the
    -string must be specified with C.  The C argument will be upgraded to
    -an RV.  That RV will be modified to point to the new SV.  The C
    -argument indicates the package for the blessing.  Set C to
    -C to avoid the blessing.  The new SV will be returned and will have
    -a reference count of 1.
    -
    -Note that C copies the pointer while this copies the string.
    -
    -	SV*	sv_setref_pvn(SV* rv, const char* classname, char* pv, STRLEN n)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_setsv
    -
    -Copies the contents of the source SV C into the destination SV C.
    -The source SV may be destroyed if it is mortal.  Does not handle 'set'
    -magic.  See the macro forms C, C and
    -C.
    -
    -	void	sv_setsv(SV* dsv, SV* ssv)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_setsv_mg
    -
    -Like C, but also handles 'set' magic.
    -
    -	void	sv_setsv_mg(SV *dstr, SV *sstr)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_setuv
    -
    -Copies an unsigned integer into the given SV.  Does not handle 'set' magic.
    -See C.
    -
    -	void	sv_setuv(SV* sv, UV num)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_setuv_mg
    -
    -Like C, but also handles 'set' magic.
    -
    -	void	sv_setuv_mg(SV *sv, UV u)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_true
    -
    -Returns true if the SV has a true value by Perl's rules.
    -
    -	I32	sv_true(SV *sv)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_unmagic
    -
    -Removes magic from an SV.
    -
    -	int	sv_unmagic(SV* sv, int type)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_unref
    -
    -Unsets the RV status of the SV, and decrements the reference count of
    -whatever was being referenced by the RV.  This can almost be thought of
    -as a reversal of C.  See C.
    -
    -	void	sv_unref(SV* sv)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_upgrade
    -
    -Upgrade an SV to a more complex form.  Use C.  See
    -C.
    -
    -	bool	sv_upgrade(SV* sv, U32 mt)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_usepvn
    -
    -Tells an SV to use C to find its string value.  Normally the string is
    -stored inside the SV but sv_usepvn allows the SV to use an outside string. 
    -The C should point to memory that was allocated by C.  The
    -string length, C, must be supplied.  This function will realloc the
    -memory pointed to by C, so that pointer should not be freed or used by
    -the programmer after giving it to sv_usepvn.  Does not handle 'set' magic.
    -See C.
    -
    -	void	sv_usepvn(SV* sv, char* ptr, STRLEN len)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_usepvn_mg
    -
    -Like C, but also handles 'set' magic.
    -
    -	void	sv_usepvn_mg(SV *sv, char *ptr, STRLEN len)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_utf8_downgrade
    -
    -Attempt to convert the PV of an SV from UTF8-encoded to byte encoding.
    -This may not be possible if the PV contains non-byte encoding characters;
    -if this is the case, either returns false or, if C is not
    -true, croaks.
    -
    -NOTE: this function is experimental and may change or be
    -removed without notice.
    -
    -	bool	sv_utf8_downgrade(SV *sv, bool fail_ok)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_utf8_encode
    -
    -Convert the PV of an SV to UTF8-encoded, but then turn off the C
    -flag so that it looks like bytes again. Nothing calls this. 
    -
    -NOTE: this function is experimental and may change or be
    -removed without notice.
    -
    -	void	sv_utf8_encode(SV *sv)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_utf8_upgrade
    -
    -Convert the PV of an SV to its UTF8-encoded form.
    -
    -NOTE: this function is experimental and may change or be
    -removed without notice.
    -
    -	void	sv_utf8_upgrade(SV *sv)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_vcatpvfn
    -
    -Processes its arguments like C and appends the formatted output
    -to an SV.  Uses an array of SVs if the C style variable argument list is
    -missing (NULL).  When running with taint checks enabled, indicates via
    -C if results are untrustworthy (often due to the use of
    -locales).
    -
    -	void	sv_vcatpvfn(SV* sv, const char* pat, STRLEN patlen, va_list* args, SV** svargs, I32 svmax, bool *maybe_tainted)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item sv_vsetpvfn
    -
    -Works like C but copies the text into the SV instead of
    -appending it.
    -
    -	void	sv_vsetpvfn(SV* sv, const char* pat, STRLEN patlen, va_list* args, SV** svargs, I32 svmax, bool *maybe_tainted)
    -
    -=for hackers
    -Found in file sv.c
    -
    -=item THIS
    -
    -Variable which is setup by C to designate the object in a C++ 
    -XSUB.  This is always the proper type for the C++ object.  See C and 
    -L.
    -
    -	(whatever)	THIS
    -
    -=for hackers
    -Found in file XSUB.h
    -
    -=item toLOWER
    -
    -Converts the specified character to lowercase.
    -
    -	char	toLOWER(char ch)
    -
    -=for hackers
    -Found in file handy.h
    -
    -=item toUPPER
    -
    -Converts the specified character to uppercase.
    -
    -	char	toUPPER(char ch)
    -
    -=for hackers
    -Found in file handy.h
    -
    -=item utf8_distance
    -
    -Returns the number of UTF8 characters between the UTF-8 pointers C
    -and C.
    -
    -WARNING: use only if you *know* that the pointers point inside the
    -same UTF-8 buffer.
    -
    -NOTE: this function is experimental and may change or be
    -removed without notice.
    -
    -	IV	utf8_distance(U8 *a, U8 *b)
    -
    -=for hackers
    -Found in file utf8.c
    -
    -=item utf8_hop
    -
    -Return the UTF-8 pointer C displaced by C characters, either
    -forward or backward.
    -
    -WARNING: do not use the following unless you *know* C is within
    -the UTF-8 data pointed to by C *and* that on entry C is aligned
    -on the first byte of character or just after the last byte of a character.
    -
    -NOTE: this function is experimental and may change or be
    -removed without notice.
    -
    -	U8*	utf8_hop(U8 *s, I32 off)
    -
    -=for hackers
    -Found in file utf8.c
    -
    -=item utf8_length
    -
    -Return the length of the UTF-8 char encoded string C in characters.
    -Stops at C (inclusive).  If C s> or if the scan would end
    -up past C, croaks.
    -
    -NOTE: this function is experimental and may change or be
    -removed without notice.
    -
    -	STRLEN	utf8_length(U8* s, U8 *e)
    -
    -=for hackers
    -Found in file utf8.c
    -
    -=item utf8_to_bytes
    -
    -Converts a string C of length C from UTF8 into byte encoding.
    -Unlike C, this over-writes the original string, and
    -updates len to contain the new length.
    -Returns zero on failure, setting C to -1.
    -
    -NOTE: this function is experimental and may change or be
    -removed without notice.
    -
    -	U8*	utf8_to_bytes(U8 *s, STRLEN *len)
    -
    -=for hackers
    -Found in file utf8.c
    -
    -=item utf8_to_uv
    -
    -Returns the character value of the first character in the string C
    -which is assumed to be in UTF8 encoding and no longer than C;
    -C will be set to the length, in bytes, of that character.
    -
    -If C does not point to a well-formed UTF8 character, the behaviour
    -is dependent on the value of C: if it contains UTF8_CHECK_ONLY,
    -it is assumed that the caller will raise a warning, and this function
    -will silently just set C to C<-1> and return zero.  If the
    -C does not contain UTF8_CHECK_ONLY, warnings about
    -malformations will be given, C will be set to the expected
    -length of the UTF-8 character in bytes, and zero will be returned.
    -
    -The C can also contain various flags to allow deviations from
    -the strict UTF-8 encoding (see F).
    -
    -NOTE: this function is experimental and may change or be
    -removed without notice.
    -
    -	UV	utf8_to_uv(U8 *s, STRLEN curlen, STRLEN* retlen, U32 flags)
    -
    -=for hackers
    -Found in file utf8.c
    -
    -=item utf8_to_uv_simple
    -
    -Returns the character value of the first character in the string C
    -which is assumed to be in UTF8 encoding; C will be set to the
    -length, in bytes, of that character.
    -
    -If C does not point to a well-formed UTF8 character, zero is
    -returned and retlen is set, if possible, to -1.
    -
    -NOTE: this function is experimental and may change or be
    -removed without notice.
    -
    -	UV	utf8_to_uv_simple(U8 *s, STRLEN* retlen)
    -
    -=for hackers
    -Found in file utf8.c
    -
    -=item uv_to_utf8
    -
    -Adds the UTF8 representation of the Unicode codepoint C to the end
    -of the string C; C should be have at least C free
    -bytes available. The return value is the pointer to the byte after the
    -end of the new character. In other words, 
    -
    -    d = uv_to_utf8(d, uv);
    -
    -is the recommended Unicode-aware way of saying
    -
    -    *(d++) = uv;
    -
    -NOTE: this function is experimental and may change or be
    -removed without notice.
    -
    -	U8*	uv_to_utf8(U8 *d, UV uv)
    -
    -=for hackers
    -Found in file utf8.c
    -
    -=item warn
    -
    -This is the XSUB-writer's interface to Perl's C function.  Use this
    -function the same way you use the C C function.  See
    -C.
    -
    -	void	warn(const char* pat, ...)
    -
    -=for hackers
    -Found in file util.c
    -
    -=item XPUSHi
    -
    -Push an integer onto the stack, extending the stack if necessary.  Handles
    -'set' magic. See C.
    -
    -	void	XPUSHi(IV iv)
    -
    -=for hackers
    -Found in file pp.h
    -
    -=item XPUSHn
    -
    -Push a double onto the stack, extending the stack if necessary.  Handles
    -'set' magic.  See C.
    -
    -	void	XPUSHn(NV nv)
    -
    -=for hackers
    -Found in file pp.h
    -
    -=item XPUSHp
    -
    -Push a string onto the stack, extending the stack if necessary.  The C
    -indicates the length of the string.  Handles 'set' magic.  See
    -C.
    -
    -	void	XPUSHp(char* str, STRLEN len)
    -
    -=for hackers
    -Found in file pp.h
    -
    -=item XPUSHs
    -
    -Push an SV onto the stack, extending the stack if necessary.  Does not
    -handle 'set' magic.  See C.
    -
    -	void	XPUSHs(SV* sv)
    -
    -=for hackers
    -Found in file pp.h
    -
    -=item XPUSHu
    -
    -Push an unsigned integer onto the stack, extending the stack if necessary.
    -See C.
    -
    -	void	XPUSHu(UV uv)
    -
    -=for hackers
    -Found in file pp.h
    -
    -=item XS
    -
    -Macro to declare an XSUB and its C parameter list.  This is handled by
    -C.
    -
    -=for hackers
    -Found in file XSUB.h
    -
    -=item XSRETURN
    -
    -Return from XSUB, indicating number of items on the stack.  This is usually
    -handled by C.
    -
    -	void	XSRETURN(int nitems)
    -
    -=for hackers
    -Found in file XSUB.h
    -
    -=item XSRETURN_EMPTY
    -
    -Return an empty list from an XSUB immediately.
    -
    -		XSRETURN_EMPTY;
    -
    -=for hackers
    -Found in file XSUB.h
    -
    -=item XSRETURN_IV
    -
    -Return an integer from an XSUB immediately.  Uses C.
    -
    -	void	XSRETURN_IV(IV iv)
    -
    -=for hackers
    -Found in file XSUB.h
    -
    -=item XSRETURN_NO
    -
    -Return C<&PL_sv_no> from an XSUB immediately.  Uses C.
    -
    -		XSRETURN_NO;
    -
    -=for hackers
    -Found in file XSUB.h
    -
    -=item XSRETURN_NV
    -
    -Return an double from an XSUB immediately.  Uses C.
    -
    -	void	XSRETURN_NV(NV nv)
    -
    -=for hackers
    -Found in file XSUB.h
    -
    -=item XSRETURN_PV
    -
    -Return a copy of a string from an XSUB immediately.  Uses C.
    -
    -	void	XSRETURN_PV(char* str)
    -
    -=for hackers
    -Found in file XSUB.h
    -
    -=item XSRETURN_UNDEF
    -
    -Return C<&PL_sv_undef> from an XSUB immediately.  Uses C.
    -
    -		XSRETURN_UNDEF;
    -
    -=for hackers
    -Found in file XSUB.h
    -
    -=item XSRETURN_YES
    -
    -Return C<&PL_sv_yes> from an XSUB immediately.  Uses C.
    -
    -		XSRETURN_YES;
    -
    -=for hackers
    -Found in file XSUB.h
    -
    -=item XST_mIV
    -
    -Place an integer into the specified position C on the stack.  The
    -value is stored in a new mortal SV.
    -
    -	void	XST_mIV(int pos, IV iv)
    -
    -=for hackers
    -Found in file XSUB.h
    -
    -=item XST_mNO
    -
    -Place C<&PL_sv_no> into the specified position C on the
    -stack.
    -
    -	void	XST_mNO(int pos)
    -
    -=for hackers
    -Found in file XSUB.h
    -
    -=item XST_mNV
    -
    -Place a double into the specified position C on the stack.  The value
    -is stored in a new mortal SV.
    -
    -	void	XST_mNV(int pos, NV nv)
    -
    -=for hackers
    -Found in file XSUB.h
    -
    -=item XST_mPV
    -
    -Place a copy of a string into the specified position C on the stack. 
    -The value is stored in a new mortal SV.
    -
    -	void	XST_mPV(int pos, char* str)
    -
    -=for hackers
    -Found in file XSUB.h
    -
    -=item XST_mUNDEF
    -
    -Place C<&PL_sv_undef> into the specified position C on the
    -stack.
    -
    -	void	XST_mUNDEF(int pos)
    -
    -=for hackers
    -Found in file XSUB.h
    -
    -=item XST_mYES
    -
    -Place C<&PL_sv_yes> into the specified position C on the
    -stack.
    -
    -	void	XST_mYES(int pos)
    -
    -=for hackers
    -Found in file XSUB.h
    -
    -=item XS_VERSION
    -
    -The version identifier for an XS module.  This is usually
    -handled automatically by C.  See C.
    -
    -=for hackers
    -Found in file XSUB.h
    -
    -=item XS_VERSION_BOOTCHECK
    -
    -Macro to verify that a PM module's $VERSION variable matches the XS
    -module's C variable.  This is usually handled automatically by
    -C.  See L.
    -
    -		XS_VERSION_BOOTCHECK;
    -
    -=for hackers
    -Found in file XSUB.h
    -
    -=item Zero
    -
    -The XSUB-writer's interface to the C C function.  The C is the
    -destination, C is the number of items, and C is the type.
    -
    -	void	Zero(void* dest, int nitems, type)
    -
    -=for hackers
    -Found in file handy.h
    -
    -=back
    -
    -=head1 AUTHORS
    -
    -Until May 1997, this document was maintained by Jeff Okamoto
    -.  It is now maintained as part of Perl itself.
    -
    -With lots of help and suggestions from Dean Roehrich, Malcolm Beattie,
    -Andreas Koenig, Paul Hudson, Ilya Zakharevich, Paul Marquess, Neil
    -Bowers, Matthew Green, Tim Bunce, Spider Boardman, Ulrich Pfeifer,
    -Stephen McCamant, and Gurusamy Sarathy.
    -
    -API Listing originally by Dean Roehrich .
    -
    -Updated to be autogenerated from comments in the source by Benjamin Stuhl.
    -
    -=head1 SEE ALSO
    -
    -perlguts(1), perlxs(1), perlxstut(1), perlintern(1)
    -
    diff --git a/lib/perl5/5.6.1/pods/perlapio.pod b/lib/perl5/5.6.1/pods/perlapio.pod
    deleted file mode 100644
    index 90475a95..00000000
    --- a/lib/perl5/5.6.1/pods/perlapio.pod
    +++ /dev/null
    @@ -1,274 +0,0 @@
    -=head1 NAME
    -
    -perlapio - perl's IO abstraction interface.
    -
    -=head1 SYNOPSIS
    -
    -    PerlIO *PerlIO_stdin(void);
    -    PerlIO *PerlIO_stdout(void);
    -    PerlIO *PerlIO_stderr(void);
    -
    -    PerlIO *PerlIO_open(const char *,const char *);
    -    int     PerlIO_close(PerlIO *);
    -
    -    int     PerlIO_stdoutf(const char *,...)
    -    int     PerlIO_puts(PerlIO *,const char *);
    -    int     PerlIO_putc(PerlIO *,int);
    -    int     PerlIO_write(PerlIO *,const void *,size_t);
    -    int     PerlIO_printf(PerlIO *, const char *,...);
    -    int     PerlIO_vprintf(PerlIO *, const char *, va_list);
    -    int     PerlIO_flush(PerlIO *);
    -
    -    int     PerlIO_eof(PerlIO *);
    -    int     PerlIO_error(PerlIO *);
    -    void    PerlIO_clearerr(PerlIO *);
    -
    -    int     PerlIO_getc(PerlIO *);
    -    int     PerlIO_ungetc(PerlIO *,int);
    -    int     PerlIO_read(PerlIO *,void *,size_t);
    -
    -    int     PerlIO_fileno(PerlIO *);
    -    PerlIO *PerlIO_fdopen(int, const char *);
    -    PerlIO *PerlIO_importFILE(FILE *, int flags);
    -    FILE   *PerlIO_exportFILE(PerlIO *, int flags);
    -    FILE   *PerlIO_findFILE(PerlIO *);
    -    void    PerlIO_releaseFILE(PerlIO *,FILE *);
    -
    -    void    PerlIO_setlinebuf(PerlIO *);
    -
    -    long    PerlIO_tell(PerlIO *);
    -    int     PerlIO_seek(PerlIO *,off_t,int);
    -    int     PerlIO_getpos(PerlIO *,Fpos_t *)
    -    int     PerlIO_setpos(PerlIO *,Fpos_t *)
    -    void    PerlIO_rewind(PerlIO *);
    -
    -    int     PerlIO_has_base(PerlIO *);
    -    int     PerlIO_has_cntptr(PerlIO *);
    -    int     PerlIO_fast_gets(PerlIO *);
    -    int     PerlIO_canset_cnt(PerlIO *);
    -
    -    char   *PerlIO_get_ptr(PerlIO *);
    -    int     PerlIO_get_cnt(PerlIO *);
    -    void    PerlIO_set_cnt(PerlIO *,int);
    -    void    PerlIO_set_ptrcnt(PerlIO *,char *,int);
    -    char   *PerlIO_get_base(PerlIO *);
    -    int     PerlIO_get_bufsiz(PerlIO *);
    -
    -=head1 DESCRIPTION
    -
    -Perl's source code should use the above functions instead of those
    -defined in ANSI C's I.  The perl headers will C<#define> them to
    -the I/O mechanism selected at Configure time.
    -
    -The functions are modeled on those in I, but parameter order
    -has been "tidied up a little".
    -
    -=over 4
    -
    -=item B
    -
    -This takes the place of FILE *. Like FILE * it should be treated as
    -opaque (it is probably safe to assume it is a pointer to something).
    -
    -=item B, B, B
    -
    -Use these rather than C, C, C. They are written
    -to look like "function calls" rather than variables because this makes
    -it easier to I function calls if platform cannot export data
    -to loaded modules, or if (say) different "threads" might have different
    -values.
    -
    -=item B, B
    -
    -These correspond to fopen()/fdopen() arguments are the same.
    -
    -=item B, B
    -
    -These are fprintf()/vfprintf() equivalents.
    -
    -=item B
    -
    -This is printf() equivalent. printf is #defined to this function,
    -so it is (currently) legal to use C in perl sources.
    -
    -=item B, B
    -
    -These correspond to fread() and fwrite(). Note that arguments
    -are different, there is only one "count" and order has
    -"file" first.
    -
    -=item B
    -
    -=item B, B
    -
    -These correspond to fputs() and fputc().
    -Note that arguments have been revised to have "file" first.
    -
    -=item B
    -
    -This corresponds to ungetc().
    -Note that arguments have been revised to have "file" first.
    -
    -=item B
    -
    -This corresponds to getc().
    -
    -=item B
    -
    -This corresponds to feof().
    -
    -=item B
    -
    -This corresponds to ferror().
    -
    -=item B
    -
    -This corresponds to fileno(), note that on some platforms,
    -the meaning of "fileno" may not match Unix.
    -
    -=item B
    -
    -This corresponds to clearerr(), i.e., clears 'eof' and 'error'
    -flags for the "stream".
    -
    -=item B
    -
    -This corresponds to fflush().
    -
    -=item B
    -
    -This corresponds to ftell().
    -
    -=item B
    -
    -This corresponds to fseek().
    -
    -=item B, B
    -
    -These correspond to fgetpos() and fsetpos(). If platform does not
    -have the stdio calls then they are implemented in terms of PerlIO_tell()
    -and PerlIO_seek().
    -
    -=item B
    -
    -This corresponds to rewind(). Note may be redefined
    -in terms of PerlIO_seek() at some point.
    -
    -=item B
    -
    -This corresponds to tmpfile(), i.e., returns an anonymous
    -PerlIO which will automatically be deleted when closed.
    -
    -=back
    -
    -=head2 Co-existence with stdio
    -
    -There is outline support for co-existence of PerlIO with stdio.
    -Obviously if PerlIO is implemented in terms of stdio there is
    -no problem. However if perlio is implemented on top of (say) sfio
    -then mechanisms must exist to create a FILE * which can be passed
    -to library code which is going to use stdio calls.
    -
    -=over 4
    -
    -=item B
    -
    -Used to get a PerlIO * from a FILE *.
    -May need additional arguments, interface under review.
    -
    -=item B
    -
    -Given an PerlIO * return a 'native' FILE * suitable for
    -passing to code expecting to be compiled and linked with
    -ANSI C I.
    -
    -The fact that such a FILE * has been 'exported' is recorded,
    -and may affect future PerlIO operations on the original
    -PerlIO *.
    -
    -=item B
    -
    -Returns previously 'exported' FILE * (if any).
    -Place holder until interface is fully defined.
    -
    -=item B
    -
    -Calling PerlIO_releaseFILE informs PerlIO that all use
    -of FILE * is complete. It is removed from list of 'exported'
    -FILE *s, and associated PerlIO * should revert to original
    -behaviour.
    -
    -=item B
    -
    -This corresponds to setlinebuf(). Use is deprecated pending
    -further discussion. (Perl core uses it I when "dumping";
    -it has nothing to do with $| auto-flush.)
    -
    -=back
    -
    -In addition to user API above there is an "implementation" interface
    -which allows perl to get at internals of PerlIO.
    -The following calls correspond to the various FILE_xxx macros determined
    -by Configure. This section is really of interest to only those
    -concerned with detailed perl-core behaviour or implementing a
    -PerlIO mapping.
    -
    -=over 4
    -
    -=item B
    -
    -Implementation can return pointer to current position in the "buffer" and
    -a count of bytes available in the buffer.
    -
    -=item B
    -
    -Return pointer to next readable byte in buffer.
    -
    -=item B
    -
    -Return count of readable bytes in the buffer.
    -
    -=item B
    -
    -Implementation can adjust its idea of number of
    -bytes in the buffer.
    -
    -=item B
    -
    -Implementation has all the interfaces required to
    -allow perl's fast code to handle  mechanism.
    -
    -  PerlIO_fast_gets(f) = PerlIO_has_cntptr(f) && \
    -                        PerlIO_canset_cnt(f) && \
    -                        `Can set pointer into buffer'
    -
    -=item B
    -
    -Set pointer into buffer, and a count of bytes still in the
    -buffer. Should be used only to set
    -pointer to within range implied by previous calls
    -to C and C.
    -
    -=item B
    -
    -Obscure - set count of bytes in the buffer. Deprecated.
    -Currently used in only doio.c to force count < -1 to -1.
    -Perhaps should be PerlIO_set_empty or similar.
    -This call may actually do nothing if "count" is deduced from pointer
    -and a "limit".
    -
    -=item B
    -
    -Implementation has a buffer, and can return pointer
    -to whole buffer and its size. Used by perl for B<-T> / B<-B> tests.
    -Other uses would be very obscure...
    -
    -=item B
    -
    -Return I of buffer.
    -
    -=item B
    -
    -Return I of buffer.
    -
    -=back
    diff --git a/lib/perl5/5.6.1/pods/perlbook.pod b/lib/perl5/5.6.1/pods/perlbook.pod
    deleted file mode 100644
    index 44f0233e..00000000
    --- a/lib/perl5/5.6.1/pods/perlbook.pod
    +++ /dev/null
    @@ -1,17 +0,0 @@
    -=head1 NAME
    -
    -perlbook - Perl book information
    -
    -=head1 DESCRIPTION
    -
    -The Camel Book, officially known as I, by Larry Wall et al, ISBN 0-596-00027-8, is the definitive
    -reference work covering nearly all of Perl.  You can order it and
    -other Perl books from O'Reilly & Associates, 1-800-998-9938.
    -Local/overseas is +1 707 829 0515.  If you can locate an O'Reilly
    -order form, you can also fax to +1 707 829 0104.  If you're
    -web-connected, you can even mosey on over to http://www.oreilly.com/
    -for an online order form.
    -
    -Other Perl books from various publishers and authors 
    -can be found listed in L.
    diff --git a/lib/perl5/5.6.1/pods/perlboot.pod b/lib/perl5/5.6.1/pods/perlboot.pod
    deleted file mode 100644
    index 3c18246f..00000000
    --- a/lib/perl5/5.6.1/pods/perlboot.pod
    +++ /dev/null
    @@ -1,815 +0,0 @@
    -=head1 NAME
    -
    -perlboot - Beginner's Object-Oriented Tutorial
    -
    -=head1 DESCRIPTION
    -
    -If you're not familiar with objects from other languages, some of the
    -other Perl object documentation may be a little daunting, such as
    -L, a basic reference in using objects, and L, which
    -introduces readers to the peculiarities of Perl's object system in a
    -tutorial way.
    -
    -So, let's take a different approach, presuming no prior object
    -experience. It helps if you know about subroutines (L),
    -references (L et. seq.), and packages (L), so become
    -familiar with those first if you haven't already.
    -
    -=head2 If we could talk to the animals...
    -
    -Let's let the animals talk for a moment:
    -
    -    sub Cow::speak {
    -      print "a Cow goes moooo!\n";
    -    }
    -    sub Horse::speak {
    -      print "a Horse goes neigh!\n";
    -    }
    -    sub Sheep::speak {
    -      print "a Sheep goes baaaah!\n"
    -    }
    -
    -    Cow::speak;
    -    Horse::speak;
    -    Sheep::speak;
    -
    -This results in:
    -
    -    a Cow goes moooo!
    -    a Horse goes neigh!
    -    a Sheep goes baaaah!
    -
    -Nothing spectacular here.  Simple subroutines, albeit from separate
    -packages, and called using the full package name.  So let's create
    -an entire pasture:
    -
    -    # Cow::speak, Horse::speak, Sheep::speak as before
    -    @pasture = qw(Cow Cow Horse Sheep Sheep);
    -    foreach $animal (@pasture) {
    -      &{$animal."::speak"};
    -    }
    -
    -This results in:
    -
    -    a Cow goes moooo!
    -    a Cow goes moooo!
    -    a Horse goes neigh!
    -    a Sheep goes baaaah!
    -    a Sheep goes baaaah!
    -
    -Wow.  That symbolic coderef de-referencing there is pretty nasty.
    -We're counting on C mode, certainly not recommended
    -for larger programs.  And why was that necessary?  Because the name of
    -the package seems to be inseparable from the name of the subroutine we
    -want to invoke within that package.
    -
    -Or is it?
    -
    -=head2 Introducing the method invocation arrow
    -
    -For now, let's say that C<< Class->method >> invokes subroutine
    -C in package C.  (Here, "Class" is used in its
    -"category" meaning, not its "scholastic" meaning.) That's not
    -completely accurate, but we'll do this one step at a time.  Now let's
    -use it like so:
    -
    -    # Cow::speak, Horse::speak, Sheep::speak as before
    -    Cow->speak;
    -    Horse->speak;
    -    Sheep->speak;
    -
    -And once again, this results in:
    -
    -    a Cow goes moooo!
    -    a Horse goes neigh!
    -    a Sheep goes baaaah!
    -
    -That's not fun yet.  Same number of characters, all constant, no
    -variables.  But yet, the parts are separable now.  Watch:
    -
    -    $a = "Cow";
    -    $a->speak; # invokes Cow->speak
    -
    -Ahh!  Now that the package name has been parted from the subroutine
    -name, we can use a variable package name.  And this time, we've got
    -something that works even when C is enabled.
    -
    -=head2 Invoking a barnyard
    -
    -Let's take that new arrow invocation and put it back in the barnyard
    -example:
    -
    -    sub Cow::speak {
    -      print "a Cow goes moooo!\n";
    -    }
    -    sub Horse::speak {
    -      print "a Horse goes neigh!\n";
    -    }
    -    sub Sheep::speak {
    -      print "a Sheep goes baaaah!\n"
    -    }
    -
    -    @pasture = qw(Cow Cow Horse Sheep Sheep);
    -    foreach $animal (@pasture) {
    -      $animal->speak;
    -    }
    -
    -There!  Now we have the animals all talking, and safely at that,
    -without the use of symbolic coderefs.
    -
    -But look at all that common code.  Each of the C routines has a
    -similar structure: a C operator and a string that contains
    -common text, except for two of the words.  It'd be nice if we could
    -factor out the commonality, in case we decide later to change it all
    -to C instead of C.
    -
    -And we actually have a way of doing that without much fuss, but we
    -have to hear a bit more about what the method invocation arrow is
    -actually doing for us.
    -
    -=head2 The extra parameter of method invocation
    -
    -The invocation of:
    -
    -    Class->method(@args)
    -
    -attempts to invoke subroutine C as:
    -
    -    Class::method("Class", @args);
    -
    -(If the subroutine can't be found, "inheritance" kicks in, but we'll
    -get to that later.)  This means that we get the class name as the
    -first parameter (the only parameter, if no arguments are given).  So
    -we can rewrite the C speaking subroutine as:
    -
    -    sub Sheep::speak {
    -      my $class = shift;
    -      print "a $class goes baaaah!\n";
    -    }
    -
    -And the other two animals come out similarly:
    -
    -    sub Cow::speak {
    -      my $class = shift;
    -      print "a $class goes moooo!\n";
    -    }
    -    sub Horse::speak {
    -      my $class = shift;
    -      print "a $class goes neigh!\n";
    -    }
    -
    -In each case, C<$class> will get the value appropriate for that
    -subroutine.  But once again, we have a lot of similar structure.  Can
    -we factor that out even further?  Yes, by calling another method in
    -the same class.
    -
    -=head2 Calling a second method to simplify things
    -
    -Let's call out from C to a helper method called C.
    -This method provides the constant text for the sound itself.
    -
    -    { package Cow;
    -      sub sound { "moooo" }
    -      sub speak {
    -	my $class = shift;
    -	print "a $class goes ", $class->sound, "!\n"
    -      }
    -    }
    -
    -Now, when we call C<< Cow->speak >>, we get a C<$class> of C in
    -C.  This in turn selects the C<< Cow->sound >> method, which
    -returns C.  But how different would this be for the C?
    -
    -    { package Horse;
    -      sub sound { "neigh" }
    -      sub speak {
    -	my $class = shift;
    -	print "a $class goes ", $class->sound, "!\n"
    -      }
    -    }
    -
    -Only the name of the package and the specific sound change.  So can we
    -somehow share the definition for C between the Cow and the
    -Horse?  Yes, with inheritance!
    -
    -=head2 Inheriting the windpipes
    -
    -We'll define a common subroutine package called C, with the
    -definition for C:
    -
    -    { package Animal;
    -      sub speak {
    -	my $class = shift;
    -	print "a $class goes ", $class->sound, "!\n"
    -      }
    -    }
    -
    -Then, for each animal, we say it "inherits" from C, along
    -with the animal-specific sound:
    -
    -    { package Cow;
    -      @ISA = qw(Animal);
    -      sub sound { "moooo" }
    -    }
    -
    -Note the added C<@ISA> array.  We'll get to that in a minute.
    -
    -But what happens when we invoke C<< Cow->speak >> now?
    -
    -First, Perl constructs the argument list.  In this case, it's just
    -C.  Then Perl looks for C.  But that's not there, so
    -Perl checks for the inheritance array C<@Cow::ISA>.  It's there,
    -and contains the single name C.
    -
    -Perl next checks for C inside C instead, as in
    -C.  And that's found, so Perl invokes that subroutine
    -with the already frozen argument list.
    -
    -Inside the C subroutine, C<$class> becomes C (the
    -first argument).  So when we get to the step of invoking
    -C<< $class->sound >>, it'll be looking for C<< Cow->sound >>, which
    -gets it on the first try without looking at C<@ISA>.  Success!
    -
    -=head2 A few notes about @ISA
    -
    -This magical C<@ISA> variable (pronounced "is a" not "ice-uh"), has
    -declared that C "is a" C.  Note that it's an array,
    -not a simple single value, because on rare occasions, it makes sense
    -to have more than one parent class searched for the missing methods.
    -
    -If C also had an C<@ISA>, then we'd check there too.  The
    -search is recursive, depth-first, left-to-right in each C<@ISA>.
    -Typically, each C<@ISA> has only one element (multiple elements means
    -multiple inheritance and multiple headaches), so we get a nice tree of
    -inheritance.
    -
    -When we turn on C, we'll get complaints on C<@ISA>, since
    -it's not a variable containing an explicit package name, nor is it a
    -lexical ("my") variable.  We can't make it a lexical variable though
    -(it has to belong to the package to be found by the inheritance mechanism),
    -so there's a couple of straightforward ways to handle that.
    -
    -The easiest is to just spell the package name out:
    -
    -    @Cow::ISA = qw(Animal);
    -
    -Or allow it as an implicitly named package variable:
    -
    -    package Cow;
    -    use vars qw(@ISA);
    -    @ISA = qw(Animal);
    -
    -If you're bringing in the class from outside, via an object-oriented
    -module, you change:
    -
    -    package Cow;
    -    use Animal;
    -    use vars qw(@ISA);
    -    @ISA = qw(Animal);
    -
    -into just:
    -
    -    package Cow;
    -    use base qw(Animal);
    -
    -And that's pretty darn compact.
    -
    -=head2 Overriding the methods
    -
    -Let's add a mouse, which can barely be heard:
    -
    -    # Animal package from before
    -    { package Mouse;
    -      @ISA = qw(Animal);
    -      sub sound { "squeak" }
    -      sub speak {
    -        my $class = shift;
    -	print "a $class goes ", $class->sound, "!\n";
    -	print "[but you can barely hear it!]\n";
    -      }
    -    }
    -
    -    Mouse->speak;
    -
    -which results in:
    -
    -    a Mouse goes squeak!
    -    [but you can barely hear it!]
    -
    -Here, C has its own speaking routine, so C<< Mouse->speak >>
    -doesn't immediately invoke C<< Animal->speak >>.  This is known as
    -"overriding".  In fact, we didn't even need to say that a C was
    -an C at all, since all of the methods needed for C are
    -completely defined with C.
    -
    -But we've now duplicated some of the code from C<< Animal->speak >>,
    -and this can once again be a maintenance headache.  So, can we avoid
    -that?  Can we say somehow that a C does everything any other
    -C does, but add in the extra comment?  Sure!
    -
    -First, we can invoke the C method directly:
    -
    -    # Animal package from before
    -    { package Mouse;
    -      @ISA = qw(Animal);
    -      sub sound { "squeak" }
    -      sub speak {
    -        my $class = shift;
    -        Animal::speak($class);
    -	print "[but you can barely hear it!]\n";
    -      }
    -    }
    -
    -Note that we have to include the C<$class> parameter (almost surely
    -the value of C<"Mouse">) as the first parameter to C,
    -since we've stopped using the method arrow.  Why did we stop?  Well,
    -if we invoke C<< Animal->speak >> there, the first parameter to the
    -method will be C<"Animal"> not C<"Mouse">, and when time comes for it
    -to call for the C, it won't have the right class to come back
    -to this package.
    -
    -Invoking C directly is a mess, however.  What if
    -C didn't exist before, and was being inherited from a
    -class mentioned in C<@Animal::ISA>?  Because we are no longer using
    -the method arrow, we get one and only one chance to hit the right
    -subroutine.
    -
    -Also note that the C classname is now hardwired into the
    -subroutine selection.  This is a mess if someone maintains the code,
    -changing C<@ISA> for  and didn't notice C there in
    -C.  So, this is probably not the right way to go.
    -
    -=head2 Starting the search from a different place
    -
    -A better solution is to tell Perl to search from a higher place
    -in the inheritance chain:
    -
    -    # same Animal as before
    -    { package Mouse;
    -      # same @ISA, &sound as before
    -      sub speak {
    -        my $class = shift;
    -        $class->Animal::speak;
    -        print "[but you can barely hear it!]\n";
    -      }
    -    }
    -
    -Ahh.  This works.  Using this syntax, we start with C to find
    -C, and use all of C's inheritance chain if not found
    -immediately.  And yet the first parameter will be C<$class>, so the
    -found C method will get C as its first entry, and
    -eventually work its way back to C for the details.
    -
    -But this isn't the best solution.  We still have to keep the C<@ISA>
    -and the initial search package coordinated.  Worse, if C had
    -multiple entries in C<@ISA>, we wouldn't necessarily know which one
    -had actually defined C.  So, is there an even better way?
    -
    -=head2 The SUPER way of doing things
    -
    -By changing the C class to the C class in that
    -invocation, we get a search of all of our super classes (classes
    -listed in C<@ISA>) automatically:
    -
    -    # same Animal as before
    -    { package Mouse;
    -      # same @ISA, &sound as before
    -      sub speak {
    -        my $class = shift;
    -        $class->SUPER::speak;
    -        print "[but you can barely hear it!]\n";
    -      }
    -    }
    -
    -So, C means look in the current package's C<@ISA> for
    -C, invoking the first one found.
    -
    -=head2 Where we're at so far...
    -
    -So far, we've seen the method arrow syntax:
    -
    -  Class->method(@args);
    -
    -or the equivalent:
    -
    -  $a = "Class";
    -  $a->method(@args);
    -
    -which constructs an argument list of:
    -
    -  ("Class", @args)
    -
    -and attempts to invoke
    -
    -  Class::method("Class", @Args);
    -
    -However, if C is not found, then C<@Class::ISA> is examined
    -(recursively) to locate a package that does indeed contain C,
    -and that subroutine is invoked instead.
    -
    -Using this simple syntax, we have class methods, (multiple)
    -inheritance, overriding, and extending.  Using just what we've seen so
    -far, we've been able to factor out common code, and provide a nice way
    -to reuse implementations with variations.  This is at the core of what
    -objects provide, but objects also provide instance data, which we
    -haven't even begun to cover.
    -
    -=head2 A horse is a horse, of course of course -- or is it?
    -
    -Let's start with the code for the C class
    -and the C class:
    -
    -  { package Animal;
    -    sub speak {
    -      my $class = shift;
    -      print "a $class goes ", $class->sound, "!\n"
    -    }
    -  }
    -  { package Horse;
    -    @ISA = qw(Animal);
    -    sub sound { "neigh" }
    -  }
    -
    -This lets us invoke C<< Horse->speak >> to ripple upward to
    -C, calling back to C to get the specific
    -sound, and the output of:
    -
    -  a Horse goes neigh!
    -
    -But all of our Horse objects would have to be absolutely identical.
    -If I add a subroutine, all horses automatically share it.  That's
    -great for making horses the same, but how do we capture the
    -distinctions about an individual horse?  For example, suppose I want
    -to give my first horse a name.  There's got to be a way to keep its
    -name separate from the other horses.
    -
    -We can do that by drawing a new distinction, called an "instance".
    -An "instance" is generally created by a class.  In Perl, any reference
    -can be an instance, so let's start with the simplest reference
    -that can hold a horse's name: a scalar reference.
    -
    -  my $name = "Mr. Ed";
    -  my $talking = \$name;
    -
    -So now C<$talking> is a reference to what will be the instance-specific
    -data (the name).  The final step in turning this into a real instance
    -is with a special operator called C:
    -
    -  bless $talking, Horse;
    -
    -This operator stores information about the package named C into
    -the thing pointed at by the reference.  At this point, we say
    -C<$talking> is an instance of C.  That is, it's a specific
    -horse.  The reference is otherwise unchanged, and can still be used
    -with traditional dereferencing operators.
    -
    -=head2 Invoking an instance method
    -
    -The method arrow can be used on instances, as well as names of
    -packages (classes).  So, let's get the sound that C<$talking> makes:
    -
    -  my $noise = $talking->sound;
    -
    -To invoke C, Perl first notes that C<$talking> is a blessed
    -reference (and thus an instance).  It then constructs an argument
    -list, in this case from just C<($talking)>.  (Later we'll see that
    -arguments will take their place following the instance variable,
    -just like with classes.)
    -
    -Now for the fun part: Perl takes the class in which the instance was
    -blessed, in this case C, and uses that to locate the subroutine
    -to invoke the method.  In this case, C is found directly
    -(without using inheritance), yielding the final subroutine invocation:
    -
    -  Horse::sound($talking)
    -
    -Note that the first parameter here is still the instance, not the name
    -of the class as before.  We'll get C as the return value, and
    -that'll end up as the C<$noise> variable above.
    -
    -If Horse::sound had not been found, we'd be wandering up the
    -C<@Horse::ISA> list to try to find the method in one of the
    -superclasses, just as for a class method.  The only difference between
    -a class method and an instance method is whether the first parameter
    -is an instance (a blessed reference) or a class name (a string).
    -
    -=head2 Accessing the instance data
    -
    -Because we get the instance as the first parameter, we can now access
    -the instance-specific data.  In this case, let's add a way to get at
    -the name:
    -
    -  { package Horse;
    -    @ISA = qw(Animal);
    -    sub sound { "neigh" }
    -    sub name {
    -      my $self = shift;
    -      $$self;
    -    }
    -  }
    -
    -Now we call for the name:
    -
    -  print $talking->name, " says ", $talking->sound, "\n";
    -
    -Inside C, the C<@_> array contains just C<$talking>,
    -which the C stores into C<$self>.  (It's traditional to shift
    -the first parameter off into a variable named C<$self> for instance
    -methods, so stay with that unless you have strong reasons otherwise.)
    -Then, C<$self> gets de-referenced as a scalar ref, yielding C,
    -and we're done with that.  The result is:
    -
    -  Mr. Ed says neigh.
    -
    -=head2 How to build a horse
    -
    -Of course, if we constructed all of our horses by hand, we'd most
    -likely make mistakes from time to time.  We're also violating one of
    -the properties of object-oriented programming, in that the "inside
    -guts" of a Horse are visible.  That's good if you're a veterinarian,
    -but not if you just like to own horses.  So, let's let the Horse class
    -build a new horse:
    -
    -  { package Horse;
    -    @ISA = qw(Animal);
    -    sub sound { "neigh" }
    -    sub name {
    -      my $self = shift;
    -      $$self;
    -    }
    -    sub named {
    -      my $class = shift;
    -      my $name = shift;
    -      bless \$name, $class;
    -    }
    -  }
    -
    -Now with the new C method, we can build a horse:
    -
    -  my $talking = Horse->named("Mr. Ed");
    -
    -Notice we're back to a class method, so the two arguments to
    -C are C and C.  The C operator
    -not only blesses C<$name>, it also returns the reference to C<$name>,
    -so that's fine as a return value.  And that's how to build a horse.
    -
    -We've called the constructor C here, so that it quickly denotes
    -the constructor's argument as the name for this particular C.
    -You can use different constructors with different names for different
    -ways of "giving birth" to the object (like maybe recording its
    -pedigree or date of birth).  However, you'll find that most people
    -coming to Perl from more limited languages use a single constructor
    -named C, with various ways of interpreting the arguments to
    -C.  Either style is fine, as long as you document your particular
    -way of giving birth to an object.  (And you I going to do that,
    -right?)
    -
    -=head2 Inheriting the constructor
    -
    -But was there anything specific to C in that method?  No.  Therefore,
    -it's also the same recipe for building anything else that inherited from
    -C, so let's put it there:
    -
    -  { package Animal;
    -    sub speak {
    -      my $class = shift;
    -      print "a $class goes ", $class->sound, "!\n"
    -    }
    -    sub name {
    -      my $self = shift;
    -      $$self;
    -    }
    -    sub named {
    -      my $class = shift;
    -      my $name = shift;
    -      bless \$name, $class;
    -    }
    -  }
    -  { package Horse;
    -    @ISA = qw(Animal);
    -    sub sound { "neigh" }
    -  }
    -
    -Ahh, but what happens if we invoke C on an instance?
    -
    -  my $talking = Horse->named("Mr. Ed");
    -  $talking->speak;
    -
    -We get a debugging value:
    -
    -  a Horse=SCALAR(0xaca42ac) goes neigh!
    -
    -Why?  Because the C routine is expecting a classname as
    -its first parameter, not an instance.  When the instance is passed in,
    -we'll end up using a blessed scalar reference as a string, and that
    -shows up as we saw it just now.
    -
    -=head2 Making a method work with either classes or instances
    -
    -All we need is for a method to detect if it is being called on a class
    -or called on an instance.  The most straightforward way is with the
    -C operator.  This returns a string (the classname) when used on a
    -blessed reference, and C when used on a string (like a
    -classname).  Let's modify the C method first to notice the change:
    -
    -  sub name {
    -    my $either = shift;
    -    ref $either
    -      ? $$either # it's an instance, return name
    -      : "an unnamed $either"; # it's a class, return generic
    -  }
    -
    -Here, the C operator comes in handy to select either the
    -dereference or a derived string.  Now we can use this with either an
    -instance or a class.  Note that I've changed the first parameter
    -holder to C<$either> to show that this is intended:
    -
    -  my $talking = Horse->named("Mr. Ed");
    -  print Horse->name, "\n"; # prints "an unnamed Horse\n"
    -  print $talking->name, "\n"; # prints "Mr Ed.\n"
    -
    -and now we'll fix C to use this:
    -
    -  sub speak {
    -    my $either = shift;
    -    print $either->name, " goes ", $either->sound, "\n";
    -  }
    -
    -And since C already worked with either a class or an instance,
    -we're done!
    -
    -=head2 Adding parameters to a method
    -
    -Let's train our animals to eat:
    -
    -  { package Animal;
    -    sub named {
    -      my $class = shift;
    -      my $name = shift;
    -      bless \$name, $class;
    -    }
    -    sub name {
    -      my $either = shift;
    -      ref $either
    -	? $$either # it's an instance, return name
    -	: "an unnamed $either"; # it's a class, return generic
    -    }
    -    sub speak {
    -      my $either = shift;
    -      print $either->name, " goes ", $either->sound, "\n";
    -    }
    -    sub eat {
    -      my $either = shift;
    -      my $food = shift;
    -      print $either->name, " eats $food.\n";
    -    }
    -  }
    -  { package Horse;
    -    @ISA = qw(Animal);
    -    sub sound { "neigh" }
    -  }
    -  { package Sheep;
    -    @ISA = qw(Animal);
    -    sub sound { "baaaah" }
    -  }
    -
    -And now try it out:
    -
    -  my $talking = Horse->named("Mr. Ed");
    -  $talking->eat("hay");
    -  Sheep->eat("grass");
    -
    -which prints:
    -
    -  Mr. Ed eats hay.
    -  an unnamed Sheep eats grass.
    -
    -An instance method with parameters gets invoked with the instance,
    -and then the list of parameters.  So that first invocation is like:
    -
    -  Animal::eat($talking, "hay");
    -
    -=head2 More interesting instances
    -
    -What if an instance needs more data?  Most interesting instances are
    -made of many items, each of which can in turn be a reference or even
    -another object.  The easiest way to store these is often in a hash.
    -The keys of the hash serve as the names of parts of the object (often
    -called "instance variables" or "member variables"), and the
    -corresponding values are, well, the values.
    -
    -But how do we turn the horse into a hash?  Recall that an object was
    -any blessed reference.  We can just as easily make it a blessed hash
    -reference as a blessed scalar reference, as long as everything that
    -looks at the reference is changed accordingly.
    -
    -Let's make a sheep that has a name and a color:
    -
    -  my $bad = bless { Name => "Evil", Color => "black" }, Sheep;
    -
    -so C<< $bad->{Name} >> has C, and C<< $bad->{Color} >> has
    -C.  But we want to make C<< $bad->name >> access the name, and
    -that's now messed up because it's expecting a scalar reference.  Not
    -to worry, because that's pretty easy to fix up:
    -
    -  ## in Animal
    -  sub name {
    -    my $either = shift;
    -    ref $either ?
    -      $either->{Name} :
    -      "an unnamed $either";
    -  }
    -
    -And of course C still builds a scalar sheep, so let's fix that
    -as well:
    -
    -  ## in Animal
    -  sub named {
    -    my $class = shift;
    -    my $name = shift;
    -    my $self = { Name => $name, Color => $class->default_color };
    -    bless $self, $class;
    -  }
    -
    -What's this C?  Well, if C has only the name,
    -we still need to set a color, so we'll have a class-specific initial color.
    -For a sheep, we might define it as white:
    -
    -  ## in Sheep
    -  sub default_color { "white" }
    -
    -And then to keep from having to define one for each additional class,
    -we'll define a "backstop" method that serves as the "default default",
    -directly in C:
    -
    -  ## in Animal
    -  sub default_color { "brown" }
    -
    -Now, because C and C were the only methods that
    -referenced the "structure" of the object, the rest of the methods can
    -remain the same, so C still works as before.
    -
    -=head2 A horse of a different color
    -
    -But having all our horses be brown would be boring.  So let's add a
    -method or two to get and set the color.
    -
    -  ## in Animal
    -  sub color {
    -    $_[0]->{Color}
    -  }
    -  sub set_color {
    -    $_[0]->{Color} = $_[1];
    -  }
    -
    -Note the alternate way of accessing the arguments: C<$_[0]> is used
    -in-place, rather than with a C.  (This saves us a bit of time
    -for something that may be invoked frequently.)  And now we can fix
    -that color for Mr. Ed:
    -
    -  my $talking = Horse->named("Mr. Ed");
    -  $talking->set_color("black-and-white");
    -  print $talking->name, " is colored ", $talking->color, "\n";
    -
    -which results in:
    -
    -  Mr. Ed is colored black-and-white
    -
    -=head2 Summary
    -
    -So, now we have class methods, constructors, instance methods,
    -instance data, and even accessors.  But that's still just the
    -beginning of what Perl has to offer.  We haven't even begun to talk
    -about accessors that double as getters and setters, destructors,
    -indirect object notation, subclasses that add instance data, per-class
    -data, overloading, "isa" and "can" tests, C class, and so
    -on.  That's for the rest of the Perl documentation to cover.
    -Hopefully, this gets you started, though.
    -
    -=head1 SEE ALSO
    -
    -For more information, see L (for all the gritty details about
    -Perl objects, now that you've seen the basics), L (the
    -tutorial for those who already know objects), L (dealing
    -with class data), L (for some more tricks), and books such as
    -Damian Conway's excellent I.
    -
    -Some modules which might prove interesting are Class::Accessor,
    -Class::Class, Class::Contract, Class::Data::Inheritable,
    -Class::MethodMaker and Tie::SecureHash
    -
    -=head1 COPYRIGHT
    -
    -Copyright (c) 1999, 2000 by Randal L. Schwartz and Stonehenge
    -Consulting Services, Inc.  Permission is hereby granted to distribute
    -this document intact with the Perl distribution, and in accordance
    -with the licenses of the Perl distribution; derived documents must
    -include this copyright notice intact.
    -
    -Portions of this text have been derived from Perl Training materials
    -originally appearing in the I course taught by instructors for Stonehenge Consulting
    -Services, Inc. and used with permission.
    -
    -Portions of this text have been derived from materials originally
    -appearing in I and used with permission.
    diff --git a/lib/perl5/5.6.1/pods/perlbot.pod b/lib/perl5/5.6.1/pods/perlbot.pod
    deleted file mode 100644
    index bc4e4da1..00000000
    --- a/lib/perl5/5.6.1/pods/perlbot.pod
    +++ /dev/null
    @@ -1,527 +0,0 @@
    -=head1 NAME
    -
    -perlbot - Bag'o Object Tricks (the BOT)
    -
    -=head1 DESCRIPTION
    -
    -The following collection of tricks and hints is intended to whet curious
    -appetites about such things as the use of instance variables and the
    -mechanics of object and class relationships.  The reader is encouraged to
    -consult relevant textbooks for discussion of Object Oriented definitions and
    -methodology.  This is not intended as a tutorial for object-oriented
    -programming or as a comprehensive guide to Perl's object oriented features,
    -nor should it be construed as a style guide.
    -
    -The Perl motto still holds:  There's more than one way to do it.
    -
    -=head1 OO SCALING TIPS
    -
    -=over 5
    -
    -=item 1
    -
    -Do not attempt to verify the type of $self.  That'll break if the class is
    -inherited, when the type of $self is valid but its package isn't what you
    -expect.  See rule 5.
    -
    -=item 2
    -
    -If an object-oriented (OO) or indirect-object (IO) syntax was used, then the
    -object is probably the correct type and there's no need to become paranoid
    -about it.  Perl isn't a paranoid language anyway.  If people subvert the OO
    -or IO syntax then they probably know what they're doing and you should let
    -them do it.  See rule 1.
    -
    -=item 3
    -
    -Use the two-argument form of bless().  Let a subclass use your constructor.
    -See L.
    -
    -=item 4
    -
    -The subclass is allowed to know things about its immediate superclass, the
    -superclass is allowed to know nothing about a subclass.
    -
    -=item 5
    -
    -Don't be trigger happy with inheritance.  A "using", "containing", or
    -"delegation" relationship (some sort of aggregation, at least) is often more
    -appropriate.  See L, L,
    -and L<"DELEGATION">.
    -
    -=item 6
    -
    -The object is the namespace.  Make package globals accessible via the
    -object.  This will remove the guess work about the symbol's home package.
    -See L.
    -
    -=item 7
    -
    -IO syntax is certainly less noisy, but it is also prone to ambiguities that
    -can cause difficult-to-find bugs.  Allow people to use the sure-thing OO
    -syntax, even if you don't like it.
    -
    -=item 8
    -
    -Do not use function-call syntax on a method.  You're going to be bitten
    -someday.  Someone might move that method into a superclass and your code
    -will be broken.  On top of that you're feeding the paranoia in rule 2.
    -
    -=item 9
    -
    -Don't assume you know the home package of a method.  You're making it
    -difficult for someone to override that method.  See L.
    -
    -=back
    -
    -=head1 INSTANCE VARIABLES
    -
    -An anonymous array or anonymous hash can be used to hold instance
    -variables.  Named parameters are also demonstrated.
    -
    -	package Foo;
    -
    -	sub new {
    -		my $type = shift;
    -		my %params = @_;
    -		my $self = {};
    -		$self->{'High'} = $params{'High'};
    -		$self->{'Low'}  = $params{'Low'};
    -		bless $self, $type;
    -	}
    -
    -
    -	package Bar;
    -
    -	sub new {
    -		my $type = shift;
    -		my %params = @_;
    -		my $self = [];
    -		$self->[0] = $params{'Left'};
    -		$self->[1] = $params{'Right'};
    -		bless $self, $type;
    -	}
    -
    -	package main;
    -
    -	$a = Foo->new( 'High' => 42, 'Low' => 11 );
    -	print "High=$a->{'High'}\n";
    -	print "Low=$a->{'Low'}\n";
    -
    -	$b = Bar->new( 'Left' => 78, 'Right' => 40 );
    -	print "Left=$b->[0]\n";
    -	print "Right=$b->[1]\n";
    -
    -=head1 SCALAR INSTANCE VARIABLES
    -
    -An anonymous scalar can be used when only one instance variable is needed.
    -
    -	package Foo;
    -
    -	sub new {
    -		my $type = shift;
    -		my $self;
    -		$self = shift;
    -		bless \$self, $type;
    -	}
    -
    -	package main;
    -
    -	$a = Foo->new( 42 );
    -	print "a=$$a\n";
    -
    -
    -=head1 INSTANCE VARIABLE INHERITANCE
    -
    -This example demonstrates how one might inherit instance variables from a
    -superclass for inclusion in the new class.  This requires calling the
    -superclass's constructor and adding one's own instance variables to the new
    -object.
    -
    -	package Bar;
    -
    -	sub new {
    -		my $type = shift;
    -		my $self = {};
    -		$self->{'buz'} = 42;
    -		bless $self, $type;
    -	}
    -
    -	package Foo;
    -	@ISA = qw( Bar );
    -
    -	sub new {
    -		my $type = shift;
    -		my $self = Bar->new;
    -		$self->{'biz'} = 11;
    -		bless $self, $type;
    -	}
    -
    -	package main;
    -
    -	$a = Foo->new;
    -	print "buz = ", $a->{'buz'}, "\n";
    -	print "biz = ", $a->{'biz'}, "\n";
    -
    -
    -
    -=head1 OBJECT RELATIONSHIPS
    -
    -The following demonstrates how one might implement "containing" and "using"
    -relationships between objects.
    -
    -	package Bar;
    -
    -	sub new {
    -		my $type = shift;
    -		my $self = {};
    -		$self->{'buz'} = 42;
    -		bless $self, $type;
    -	}
    -
    -	package Foo;
    -
    -	sub new {
    -		my $type = shift;
    -		my $self = {};
    -		$self->{'Bar'} = Bar->new;
    -		$self->{'biz'} = 11;
    -		bless $self, $type;
    -	}
    -
    -	package main;
    -
    -	$a = Foo->new;
    -	print "buz = ", $a->{'Bar'}->{'buz'}, "\n";
    -	print "biz = ", $a->{'biz'}, "\n";
    -
    -
    -
    -=head1 OVERRIDING SUPERCLASS METHODS
    -
    -The following example demonstrates how to override a superclass method and
    -then call the overridden method.  The B pseudo-class allows the
    -programmer to call an overridden superclass method without actually knowing
    -where that method is defined.
    -
    -	package Buz;
    -	sub goo { print "here's the goo\n" }
    -
    -	package Bar; @ISA = qw( Buz );
    -	sub google { print "google here\n" }
    -
    -	package Baz;
    -	sub mumble { print "mumbling\n" }
    -
    -	package Foo;
    -	@ISA = qw( Bar Baz );
    -
    -	sub new {
    -		my $type = shift;
    -		bless [], $type;
    -	}
    -	sub grr { print "grumble\n" }
    -	sub goo {
    -		my $self = shift;
    -		$self->SUPER::goo();
    -	}
    -	sub mumble {
    -		my $self = shift;
    -		$self->SUPER::mumble();
    -	}
    -	sub google {
    -		my $self = shift;
    -		$self->SUPER::google();
    -	}
    -
    -	package main;
    -
    -	$foo = Foo->new;
    -	$foo->mumble;
    -	$foo->grr;
    -	$foo->goo;
    -	$foo->google;
    -
    -
    -=head1 USING RELATIONSHIP WITH SDBM
    -
    -This example demonstrates an interface for the SDBM class.  This creates a
    -"using" relationship between the SDBM class and the new class Mydbm.
    -
    -	package Mydbm;
    -
    -	require SDBM_File;
    -	require Tie::Hash;
    -	@ISA = qw( Tie::Hash );
    -
    -	sub TIEHASH {
    -	    my $type = shift;
    -	    my $ref  = SDBM_File->new(@_);
    -	    bless {'dbm' => $ref}, $type;
    -	}
    -	sub FETCH {
    -	    my $self = shift;
    -	    my $ref  = $self->{'dbm'};
    -	    $ref->FETCH(@_);
    -	}
    -	sub STORE {
    -	    my $self = shift;
    -	    if (defined $_[0]){
    -		my $ref = $self->{'dbm'};
    -		$ref->STORE(@_);
    -	    } else {
    -		die "Cannot STORE an undefined key in Mydbm\n";
    -	    }
    -	}
    -
    -	package main;
    -	use Fcntl qw( O_RDWR O_CREAT );
    -
    -	tie %foo, "Mydbm", "Sdbm", O_RDWR|O_CREAT, 0640;
    -	$foo{'bar'} = 123;
    -	print "foo-bar = $foo{'bar'}\n";
    -
    -	tie %bar, "Mydbm", "Sdbm2", O_RDWR|O_CREAT, 0640;
    -	$bar{'Cathy'} = 456;
    -	print "bar-Cathy = $bar{'Cathy'}\n";
    -
    -=head1 THINKING OF CODE REUSE
    -
    -One strength of Object-Oriented languages is the ease with which old code
    -can use new code.  The following examples will demonstrate first how one can
    -hinder code reuse and then how one can promote code reuse.
    -
    -This first example illustrates a class which uses a fully-qualified method
    -call to access the "private" method BAZ().  The second example will show
    -that it is impossible to override the BAZ() method.
    -
    -	package FOO;
    -
    -	sub new {
    -		my $type = shift;
    -		bless {}, $type;
    -	}
    -	sub bar {
    -		my $self = shift;
    -		$self->FOO::private::BAZ;
    -	}
    -
    -	package FOO::private;
    -
    -	sub BAZ {
    -		print "in BAZ\n";
    -	}
    -
    -	package main;
    -
    -	$a = FOO->new;
    -	$a->bar;
    -
    -Now we try to override the BAZ() method.  We would like FOO::bar() to call
    -GOOP::BAZ(), but this cannot happen because FOO::bar() explicitly calls
    -FOO::private::BAZ().
    -
    -	package FOO;
    -
    -	sub new {
    -		my $type = shift;
    -		bless {}, $type;
    -	}
    -	sub bar {
    -		my $self = shift;
    -		$self->FOO::private::BAZ;
    -	}
    -
    -	package FOO::private;
    -
    -	sub BAZ {
    -		print "in BAZ\n";
    -	}
    -
    -	package GOOP;
    -	@ISA = qw( FOO );
    -	sub new {
    -		my $type = shift;
    -		bless {}, $type;
    -	}
    -
    -	sub BAZ {
    -		print "in GOOP::BAZ\n";
    -	}
    -
    -	package main;
    -
    -	$a = GOOP->new;
    -	$a->bar;
    -
    -To create reusable code we must modify class FOO, flattening class
    -FOO::private.  The next example shows a reusable class FOO which allows the
    -method GOOP::BAZ() to be used in place of FOO::BAZ().
    -
    -	package FOO;
    -
    -	sub new {
    -		my $type = shift;
    -		bless {}, $type;
    -	}
    -	sub bar {
    -		my $self = shift;
    -		$self->BAZ;
    -	}
    -
    -	sub BAZ {
    -		print "in BAZ\n";
    -	}
    -
    -	package GOOP;
    -	@ISA = qw( FOO );
    -
    -	sub new {
    -		my $type = shift;
    -		bless {}, $type;
    -	}
    -	sub BAZ {
    -		print "in GOOP::BAZ\n";
    -	}
    -
    -	package main;
    -
    -	$a = GOOP->new;
    -	$a->bar;
    -
    -=head1 CLASS CONTEXT AND THE OBJECT
    -
    -Use the object to solve package and class context problems.  Everything a
    -method needs should be available via the object or should be passed as a
    -parameter to the method.
    -
    -A class will sometimes have static or global data to be used by the
    -methods.  A subclass may want to override that data and replace it with new
    -data.  When this happens the superclass may not know how to find the new
    -copy of the data.
    -
    -This problem can be solved by using the object to define the context of the
    -method.  Let the method look in the object for a reference to the data.  The
    -alternative is to force the method to go hunting for the data ("Is it in my
    -class, or in a subclass?  Which subclass?"), and this can be inconvenient
    -and will lead to hackery.  It is better just to let the object tell the
    -method where that data is located.
    -
    -	package Bar;
    -
    -	%fizzle = ( 'Password' => 'XYZZY' );
    -
    -	sub new {
    -		my $type = shift;
    -		my $self = {};
    -		$self->{'fizzle'} = \%fizzle;
    -		bless $self, $type;
    -	}
    -
    -	sub enter {
    -		my $self = shift;
    -
    -		# Don't try to guess if we should use %Bar::fizzle
    -		# or %Foo::fizzle.  The object already knows which
    -		# we should use, so just ask it.
    -		#
    -		my $fizzle = $self->{'fizzle'};
    -
    -		print "The word is ", $fizzle->{'Password'}, "\n";
    -	}
    -
    -	package Foo;
    -	@ISA = qw( Bar );
    -
    -	%fizzle = ( 'Password' => 'Rumple' );
    -
    -	sub new {
    -		my $type = shift;
    -		my $self = Bar->new;
    -		$self->{'fizzle'} = \%fizzle;
    -		bless $self, $type;
    -	}
    -
    -	package main;
    -
    -	$a = Bar->new;
    -	$b = Foo->new;
    -	$a->enter;
    -	$b->enter;
    -
    -=head1 INHERITING A CONSTRUCTOR
    -
    -An inheritable constructor should use the second form of bless() which allows
    -blessing directly into a specified class.  Notice in this example that the
    -object will be a BAR not a FOO, even though the constructor is in class FOO.
    -
    -	package FOO;
    -
    -	sub new {
    -		my $type = shift;
    -		my $self = {};
    -		bless $self, $type;
    -	}
    -
    -	sub baz {
    -		print "in FOO::baz()\n";
    -	}
    -
    -	package BAR;
    -	@ISA = qw(FOO);
    -
    -	sub baz {
    -		print "in BAR::baz()\n";
    -	}
    -
    -	package main;
    -
    -	$a = BAR->new;
    -	$a->baz;
    -
    -=head1 DELEGATION
    -
    -Some classes, such as SDBM_File, cannot be effectively subclassed because
    -they create foreign objects.  Such a class can be extended with some sort of
    -aggregation technique such as the "using" relationship mentioned earlier or
    -by delegation.
    -
    -The following example demonstrates delegation using an AUTOLOAD() function to
    -perform message-forwarding.  This will allow the Mydbm object to behave
    -exactly like an SDBM_File object.  The Mydbm class could now extend the
    -behavior by adding custom FETCH() and STORE() methods, if this is desired.
    -
    -	package Mydbm;
    -
    -	require SDBM_File;
    -	require Tie::Hash;
    -	@ISA = qw(Tie::Hash);
    -
    -	sub TIEHASH {
    -		my $type = shift;
    -		my $ref = SDBM_File->new(@_);
    -		bless {'delegate' => $ref};
    -	}
    -
    -	sub AUTOLOAD {
    -		my $self = shift;
    -
    -		# The Perl interpreter places the name of the
    -		# message in a variable called $AUTOLOAD.
    -
    -		# DESTROY messages should never be propagated.
    -		return if $AUTOLOAD =~ /::DESTROY$/;
    -
    -		# Remove the package name.
    -		$AUTOLOAD =~ s/^Mydbm:://;
    -
    -		# Pass the message to the delegate.
    -		$self->{'delegate'}->$AUTOLOAD(@_);
    -	}
    -
    -	package main;
    -	use Fcntl qw( O_RDWR O_CREAT );
    -
    -	tie %foo, "Mydbm", "adbm", O_RDWR|O_CREAT, 0640;
    -	$foo{'bar'} = 123;
    -	print "foo-bar = $foo{'bar'}\n";
    diff --git a/lib/perl5/5.6.1/pods/perlbs2000.pod b/lib/perl5/5.6.1/pods/perlbs2000.pod
    deleted file mode 100644
    index 566ba212..00000000
    --- a/lib/perl5/5.6.1/pods/perlbs2000.pod
    +++ /dev/null
    @@ -1,202 +0,0 @@
    -This document is written in pod format hence there are punctuation
    -characters in in odd places.  Do not worry, you've apparently got the
    -ASCII->EBCDIC translation worked out correctly.  You can read more
    -about pod in pod/perlpod.pod or the short summary in the INSTALL file.
    -
    -=head1 NAME
    -
    -README.BS2000 - building and installing Perl for BS2000.
    -
    -=head1 SYNOPSIS
    -
    -This document will help you Configure, build, test and install Perl
    -on BS2000 in the POSIX subsystem.
    -
    -=head1 DESCRIPTION
    -
    -This is a ported perl for the POSIX subsystem in BS2000 VERSION OSD
    -V3.1A or later.  It may work on other versions, but we started porting
    -and testing it with 3.1A and are currently using Version V4.0A.
    -
    -You may need the following GNU programs in order to install perl:
    -
    -=head2 gzip
    -
    -We used version 1.2.4, which could be installed out of the box with
    -one failure during 'make check'.
    -
    -=head2 bison
    -
    -The yacc coming with BS2000 POSIX didn't work for us.  So we had to
    -use bison.  We had to make a few changes to perl in order to use the
    -pure (reentrant) parser of bison.  We used version 1.25, but we had to
    -add a few changes due to EBCDIC.  See below for more details
    -concerning yacc.
    -
    -=head2 Unpacking
    -
    -To extract an ASCII tar archive on BS2000 POSIX you need an ASCII
    -filesystem (we used the mountpoint /usr/local/ascii for this).  Now
    -you extract the archive in the ASCII filesystem without
    -I/O-conversion:
    -
    -cd /usr/local/ascii
    -export IO_CONVERSION=NO
    -gunzip < /usr/local/src/perl.tar.gz | pax -r
    -
    -You may ignore the error message for the first element of the archive
    -(this doesn't look like a tar archive / skipping to next file...),
    -it's only the directory which will be created automatically anyway.
    -
    -After extracting the archive you copy the whole directory tree to your
    -EBCDIC filesystem.  B:
    -
    -cd /usr/local/src
    -IO_CONVERSION=YES
    -cp -r /usr/local/ascii/perl5.005_02 ./
    -
    -=head2 Compiling
    -
    -There is a "hints" file for BS2000 called hints.posix-bc (because
    -posix-bc is the OS name given by `uname`) that specifies the correct
    -values for most things.  The major problem is (of course) the EBCDIC
    -character set.  We have german EBCDIC version.
    -
    -Because of our problems with the native yacc we used GNU bison to
    -generate a pure (=reentrant) parser for perly.y.  So our yacc is
    -really the following script:
    -
    ------8<-----/usr/local/bin/yacc-----8<-----
    -#! /usr/bin/sh
    -
    -# Bison as a reentrant yacc:
    -
    -# save parameters:
    -params=""
    -while [[ $# -gt 1 ]]; do
    -    params="$params $1"
    -    shift
    -done
    -
    -# add flag %pure_parser:
    -
    -tmpfile=/tmp/bison.$$.y
    -echo %pure_parser > $tmpfile
    -cat $1 >> $tmpfile
    -
    -# call bison:
    -
    -echo "/usr/local/bin/bison --yacc $params $1\t\t\t(Pure Parser)"
    -/usr/local/bin/bison --yacc $params $tmpfile
    -
    -# cleanup:
    -
    -rm -f $tmpfile
    ------8<----------8<-----
    -
    -We still use the normal yacc for a2p.y though!!!  We made a softlink
    -called byacc to distinguish between the two versions:
    -
    -ln -s /usr/bin/yacc /usr/local/bin/byacc
    -
    -We build perl using GNU make.  We tried the native make once and it
    -worked too.
    -
    -=head2 Testing
    -
    -We still got a few errors during C.  Some of them are the
    -result of using bison.  Bison prints I instead of I, so we may ignore them.  The following list shows
    -our errors, your results may differ:
    -
    -op/numconvert.......FAILED tests 1409-1440
    -op/regexp...........FAILED tests 483, 496
    -op/regexp_noamp.....FAILED tests 483, 496
    -pragma/overload.....FAILED tests 152-153, 170-171
    -pragma/warnings.....FAILED tests 14, 82, 129, 155, 192, 205, 207
    -lib/bigfloat........FAILED tests 351-352, 355
    -lib/bigfltpm........FAILED tests 354-355, 358
    -lib/complex.........FAILED tests 267, 487
    -lib/dumper..........FAILED tests 43, 45
    -Failed 11/231 test scripts, 95.24% okay. 57/10595 subtests failed, 99.46% okay.
    -
    -=head2 Install
    -
    -We have no nroff on BS2000 POSIX (yet), so we ignored any errors while
    -installing the documentation.
    -
    -
    -=head2 Using Perl in the Posix-Shell
    -
    -BS2000 POSIX doesn't support the shebang notation
    -(C<#!/usr/local/bin/perl>), so you have to use the following lines
    -instead:
    -
    -: # use perl
    -    eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}'
    -        if $running_under_some_shell;
    -
    -=head2 Using Perl in "native" BS2000
    -
    -We don't have much experience with this yet, but try the following:
    -
    -Copy your Perl executable to a BS2000 LLM using bs2cp:
    -
    -C
    -
    -Now you can start it with the following (SDF) command:
    -
    -C
    -
    -First you get the BS2000 commandline prompt ('*').  Here you may enter
    -your parameters, e.g. C<-e 'print "Hello World!\\n";'> (note the
    -double backslash!) or C<-w> and the name of your Perl script.
    -Filenames starting with C are searched in in the Posix filesystem,
    -others are searched in the BS2000 filesystem.  You may even use
    -wildcards if you put a C<%> in front of your filename (e.g. C<-w
    -checkfiles.pl %*.c>).  Read your C/C++ manual for additional
    -possibilities of the commandline prompt (look for
    -PARAMETER-PROMPTING).
    -
    -=head2 Floating point anomalies
    -
    -There appears to be a bug in the floating point implementation on BS2000 POSIX
    -systems such that calling int() on the product of a number and a small
    -magnitude number is not the same as calling int() on the quotient of
    -that number and a large magnitude number.  For example, in the following
    -Perl code:
    -
    -    my $x = 100000.0;
    -    my $y = int($x * 1e-5) * 1e5; # '0'
    -    my $z = int($x / 1e+5) * 1e5;  # '100000'
    -    print "\$y is $y and \$z is $z\n"; # $y is 0 and $z is 100000
    -
    -Although one would expect the quantities $y and $z to be the same and equal
    -to 100000 they will differ and instead will be 0 and 100000 respectively.
    -
    -=head1 AUTHORS
    -
    -Thomas Dorner
    -
    -=head1 SEE ALSO
    -
    -L, L.
    -
    -=head2 Mailing list
    -
    -The Perl Institute (http://www.perl.org/) maintains a perl-mvs mailing
    -list of interest to all folks building and/or using perl on EBCDIC
    -platforms.  To subscribe, send a message of:
    -
    -    subscribe perl-mvs
    -
    -to majordomo@perl.org.
    -
    -=head1 HISTORY
    -
    -This document was originally written by Thomas Dorner for the 5.005
    -release of Perl.
    -
    -This document was podified for the 5.6 release of perl 11 July 2000.
    -
    -=cut
    diff --git a/lib/perl5/5.6.1/pods/perlcall.pod b/lib/perl5/5.6.1/pods/perlcall.pod
    deleted file mode 100644
    index 40f1d65a..00000000
    --- a/lib/perl5/5.6.1/pods/perlcall.pod
    +++ /dev/null
    @@ -1,1957 +0,0 @@
    -=head1 NAME
    -
    -perlcall - Perl calling conventions from C
    -
    -=head1 DESCRIPTION
    -
    -The purpose of this document is to show you how to call Perl subroutines
    -directly from C, i.e., how to write I.
    -
    -Apart from discussing the C interface provided by Perl for writing
    -callbacks the document uses a series of examples to show how the
    -interface actually works in practice.  In addition some techniques for
    -coding callbacks are covered.
    -
    -Examples where callbacks are necessary include
    -
    -=over 5
    -
    -=item * An Error Handler
    -
    -You have created an XSUB interface to an application's C API.
    -
    -A fairly common feature in applications is to allow you to define a C
    -function that will be called whenever something nasty occurs. What we
    -would like is to be able to specify a Perl subroutine that will be
    -called instead.
    -
    -=item * An Event Driven Program
    -
    -The classic example of where callbacks are used is when writing an
    -event driven program like for an X windows application.  In this case
    -you register functions to be called whenever specific events occur,
    -e.g., a mouse button is pressed, the cursor moves into a window or a
    -menu item is selected.
    -
    -=back
    -
    -Although the techniques described here are applicable when embedding
    -Perl in a C program, this is not the primary goal of this document.
    -There are other details that must be considered and are specific to
    -embedding Perl. For details on embedding Perl in C refer to
    -L.
    -
    -Before you launch yourself head first into the rest of this document,
    -it would be a good idea to have read the following two documents -
    -L and L.
    -
    -=head1 THE CALL_ FUNCTIONS
    -
    -Although this stuff is easier to explain using examples, you first need
    -be aware of a few important definitions.
    -
    -Perl has a number of C functions that allow you to call Perl
    -subroutines.  They are
    -
    -    I32 call_sv(SV* sv, I32 flags) ;
    -    I32 call_pv(char *subname, I32 flags) ;
    -    I32 call_method(char *methname, I32 flags) ;
    -    I32 call_argv(char *subname, I32 flags, register char **argv) ;
    -
    -The key function is I.  All the other functions are
    -fairly simple wrappers which make it easier to call Perl subroutines in
    -special cases. At the end of the day they will all call I
    -to invoke the Perl subroutine.
    -
    -All the I functions have a C parameter which is
    -used to pass a bit mask of options to Perl.  This bit mask operates
    -identically for each of the functions.  The settings available in the
    -bit mask are discussed in L.
    -
    -Each of the functions will now be discussed in turn.
    -
    -=over 5
    -
    -=item call_sv
    -
    -I takes two parameters, the first, C, is an SV*.
    -This allows you to specify the Perl subroutine to be called either as a
    -C string (which has first been converted to an SV) or a reference to a
    -subroutine. The section, I, shows how you can make
    -use of I.
    -
    -=item call_pv
    -
    -The function, I, is similar to I except it
    -expects its first parameter to be a C char* which identifies the Perl
    -subroutine you want to call, e.g., C.  If the
    -subroutine you want to call is in another package, just include the
    -package name in the string, e.g., C<"pkg::fred">.
    -
    -=item call_method
    -
    -The function I is used to call a method from a Perl
    -class.  The parameter C corresponds to the name of the method
    -to be called.  Note that the class that the method belongs to is passed
    -on the Perl stack rather than in the parameter list. This class can be
    -either the name of the class (for a static method) or a reference to an
    -object (for a virtual method).  See L for more information on
    -static and virtual methods and L for an example
    -of using I.
    -
    -=item call_argv
    -
    -I calls the Perl subroutine specified by the C string
    -stored in the C parameter. It also takes the usual C
    -parameter.  The final parameter, C, consists of a NULL terminated
    -list of C strings to be passed as parameters to the Perl subroutine.
    -See I.
    -
    -=back
    -
    -All the functions return an integer. This is a count of the number of
    -items returned by the Perl subroutine. The actual items returned by the
    -subroutine are stored on the Perl stack.
    -
    -As a general rule you should I check the return value from
    -these functions.  Even if you are expecting only a particular number of
    -values to be returned from the Perl subroutine, there is nothing to
    -stop someone from doing something unexpected--don't say you haven't
    -been warned.
    -
    -=head1 FLAG VALUES
    -
    -The C parameter in all the I functions is a bit mask
    -which can consist of any combination of the symbols defined below,
    -OR'ed together.
    -
    -
    -=head2  G_VOID
    -
    -Calls the Perl subroutine in a void context.
    -
    -This flag has 2 effects:
    -
    -=over 5
    -
    -=item 1.
    -
    -It indicates to the subroutine being called that it is executing in
    -a void context (if it executes I the result will be the
    -undefined value).
    -
    -=item 2.
    -
    -It ensures that nothing is actually returned from the subroutine.
    -
    -=back
    -
    -The value returned by the I function indicates how many
    -items have been returned by the Perl subroutine - in this case it will
    -be 0.
    -
    -
    -=head2  G_SCALAR
    -
    -Calls the Perl subroutine in a scalar context.  This is the default
    -context flag setting for all the I functions.
    -
    -This flag has 2 effects:
    -
    -=over 5
    -
    -=item 1.
    -
    -It indicates to the subroutine being called that it is executing in a
    -scalar context (if it executes I the result will be false).
    -
    -=item 2.
    -
    -It ensures that only a scalar is actually returned from the subroutine.
    -The subroutine can, of course,  ignore the I and return a
    -list anyway. If so, then only the last element of the list will be
    -returned.
    -
    -=back
    -
    -The value returned by the I function indicates how many
    -items have been returned by the Perl subroutine - in this case it will
    -be either 0 or 1.
    -
    -If 0, then you have specified the G_DISCARD flag.
    -
    -If 1, then the item actually returned by the Perl subroutine will be
    -stored on the Perl stack - the section I shows how
    -to access this value on the stack.  Remember that regardless of how
    -many items the Perl subroutine returns, only the last one will be
    -accessible from the stack - think of the case where only one value is
    -returned as being a list with only one element.  Any other items that
    -were returned will not exist by the time control returns from the
    -I function.  The section I shows an example of this behavior.
    -
    -
    -=head2 G_ARRAY
    -
    -Calls the Perl subroutine in a list context.
    -
    -As with G_SCALAR, this flag has 2 effects:
    -
    -=over 5
    -
    -=item 1.
    -
    -It indicates to the subroutine being called that it is executing in a
    -list context (if it executes I the result will be true).
    -
    -
    -=item 2.
    -
    -It ensures that all items returned from the subroutine will be
    -accessible when control returns from the I function.
    -
    -=back
    -
    -The value returned by the I function indicates how many
    -items have been returned by the Perl subroutine.
    -
    -If 0, then you have specified the G_DISCARD flag.
    -
    -If not 0, then it will be a count of the number of items returned by
    -the subroutine. These items will be stored on the Perl stack.  The
    -section I gives an example of using the
    -G_ARRAY flag and the mechanics of accessing the returned items from the
    -Perl stack.
    -
    -=head2 G_DISCARD
    -
    -By default, the I functions place the items returned from
    -by the Perl subroutine on the stack.  If you are not interested in
    -these items, then setting this flag will make Perl get rid of them
    -automatically for you.  Note that it is still possible to indicate a
    -context to the Perl subroutine by using either G_SCALAR or G_ARRAY.
    -
    -If you do not set this flag then it is I important that you make
    -sure that any temporaries (i.e., parameters passed to the Perl
    -subroutine and values returned from the subroutine) are disposed of
    -yourself.  The section I gives details of how to
    -dispose of these temporaries explicitly and the section I discusses the specific circumstances where you
    -can ignore the problem and let Perl deal with it for you.
    -
    -=head2 G_NOARGS
    -
    -Whenever a Perl subroutine is called using one of the I
    -functions, it is assumed by default that parameters are to be passed to
    -the subroutine.  If you are not passing any parameters to the Perl
    -subroutine, you can save a bit of time by setting this flag.  It has
    -the effect of not creating the C<@_> array for the Perl subroutine.
    -
    -Although the functionality provided by this flag may seem
    -straightforward, it should be used only if there is a good reason to do
    -so.  The reason for being cautious is that even if you have specified
    -the G_NOARGS flag, it is still possible for the Perl subroutine that
    -has been called to think that you have passed it parameters.
    -
    -In fact, what can happen is that the Perl subroutine you have called
    -can access the C<@_> array from a previous Perl subroutine.  This will
    -occur when the code that is executing the I function has
    -itself been called from another Perl subroutine. The code below
    -illustrates this
    -
    -    sub fred
    -      { print "@_\n"  }
    -
    -    sub joe
    -      { &fred }
    -
    -    &joe(1,2,3) ;
    -
    -This will print
    -
    -    1 2 3
    -
    -What has happened is that C accesses the C<@_> array which
    -belongs to C.
    -
    -
    -=head2 G_EVAL
    -
    -It is possible for the Perl subroutine you are calling to terminate
    -abnormally, e.g., by calling I explicitly or by not actually
    -existing.  By default, when either of these events occurs, the
    -process will terminate immediately.  If you want to trap this
    -type of event, specify the G_EVAL flag.  It will put an I
    -around the subroutine call.
    -
    -Whenever control returns from the I function you need to
    -check the C<$@> variable as you would in a normal Perl script.
    -
    -The value returned from the I function is dependent on
    -what other flags have been specified and whether an error has
    -occurred.  Here are all the different cases that can occur:
    -
    -=over 5
    -
    -=item *
    -
    -If the I function returns normally, then the value
    -returned is as specified in the previous sections.
    -
    -=item *
    -
    -If G_DISCARD is specified, the return value will always be 0.
    -
    -=item *
    -
    -If G_ARRAY is specified I an error has occurred, the return value
    -will always be 0.
    -
    -=item *
    -
    -If G_SCALAR is specified I an error has occurred, the return value
    -will be 1 and the value on the top of the stack will be I. This
    -means that if you have already detected the error by checking C<$@> and
    -you want the program to continue, you must remember to pop the I
    -from the stack.
    -
    -=back
    -
    -See I for details on using G_EVAL.
    -
    -=head2 G_KEEPERR
    -
    -You may have noticed that using the G_EVAL flag described above will
    -B clear the C<$@> variable and set it to a string describing
    -the error iff there was an error in the called code.  This unqualified
    -resetting of C<$@> can be problematic in the reliable identification of
    -errors using the C mechanism, because the possibility exists
    -that perl will call other code (end of block processing code, for
    -example) between the time the error causes C<$@> to be set within
    -C, and the subsequent statement which checks for the value of
    -C<$@> gets executed in the user's script.
    -
    -This scenario will mostly be applicable to code that is meant to be
    -called from within destructors, asynchronous callbacks, signal
    -handlers, C<__DIE__> or C<__WARN__> hooks, and C functions.  In
    -such situations, you will not want to clear C<$@> at all, but simply to
    -append any new errors to any existing value of C<$@>.
    -
    -The G_KEEPERR flag is meant to be used in conjunction with G_EVAL in
    -I functions that are used to implement such code.  This flag
    -has no effect when G_EVAL is not used.
    -
    -When G_KEEPERR is used, any errors in the called code will be prefixed
    -with the string "\t(in cleanup)", and appended to the current value
    -of C<$@>.
    -
    -The G_KEEPERR flag was introduced in Perl version 5.002.
    -
    -See I for an example of a situation that warrants the
    -use of this flag.
    -
    -=head2 Determining the Context
    -
    -As mentioned above, you can determine the context of the currently
    -executing subroutine in Perl with I.  The equivalent test
    -can be made in C by using the C macro, which returns
    -C if you have been called in a list context, C if
    -in a scalar context, or C if in a void context (i.e. the
    -return value will not be used).  An older version of this macro is
    -called C; in a void context it returns C instead of
    -C.  An example of using the C macro is shown in
    -section I.
    -
    -=head1 KNOWN PROBLEMS
    -
    -This section outlines all known problems that exist in the
    -I functions.
    -
    -=over 5
    -
    -=item 1.
    -
    -If you are intending to make use of both the G_EVAL and G_SCALAR flags
    -in your code, use a version of Perl greater than 5.000.  There is a bug
    -in version 5.000 of Perl which means that the combination of these two
    -flags will not work as described in the section I.
    -
    -Specifically, if the two flags are used when calling a subroutine and
    -that subroutine does not call I, the value returned by
    -I will be wrong.
    -
    -
    -=item 2.
    -
    -In Perl 5.000 and 5.001 there is a problem with using I if
    -the Perl sub you are calling attempts to trap a I.
    -
    -The symptom of this problem is that the called Perl sub will continue
    -to completion, but whenever it attempts to pass control back to the
    -XSUB, the program will immediately terminate.
    -
    -For example, say you want to call this Perl sub
    -
    -    sub fred
    -    {
    -        eval { die "Fatal Error" ; }
    -        print "Trapped error: $@\n"
    -            if $@ ;
    -    }
    -
    -via this XSUB
    -
    -    void
    -    Call_fred()
    -        CODE:
    -        PUSHMARK(SP) ;
    -        call_pv("fred", G_DISCARD|G_NOARGS) ;
    -        fprintf(stderr, "back in Call_fred\n") ;
    -
    -When C is executed it will print
    -
    -    Trapped error: Fatal Error
    -
    -As control never returns to C, the C<"back in Call_fred">
    -string will not get printed.
    -
    -To work around this problem, you can either upgrade to Perl 5.002 or
    -higher, or use the G_EVAL flag with I as shown below
    -
    -    void
    -    Call_fred()
    -        CODE:
    -        PUSHMARK(SP) ;
    -        call_pv("fred", G_EVAL|G_DISCARD|G_NOARGS) ;
    -        fprintf(stderr, "back in Call_fred\n") ;
    -
    -=back
    -
    -
    -
    -=head1 EXAMPLES
    -
    -Enough of the definition talk, let's have a few examples.
    -
    -Perl provides many macros to assist in accessing the Perl stack.
    -Wherever possible, these macros should always be used when interfacing
    -to Perl internals.  We hope this should make the code less vulnerable
    -to any changes made to Perl in the future.
    -
    -Another point worth noting is that in the first series of examples I
    -have made use of only the I function.  This has been done
    -to keep the code simpler and ease you into the topic.  Wherever
    -possible, if the choice is between using I and
    -I, you should always try to use I.  See
    -I for details.
    -
    -=head2 No Parameters, Nothing returned
    -
    -This first trivial example will call a Perl subroutine, I, to
    -print out the UID of the process.
    -
    -    sub PrintUID
    -    {
    -        print "UID is $<\n" ;
    -    }
    -
    -and here is a C function to call it
    -
    -    static void
    -    call_PrintUID()
    -    {
    -        dSP ;
    -
    -        PUSHMARK(SP) ;
    -        call_pv("PrintUID", G_DISCARD|G_NOARGS) ;
    -    }
    -
    -Simple, eh.
    -
    -A few points to note about this example.
    -
    -=over 5
    -
    -=item 1.
    -
    -Ignore C and C for now. They will be discussed in
    -the next example.
    -
    -=item 2.
    -
    -We aren't passing any parameters to I so G_NOARGS can be
    -specified.
    -
    -=item 3.
    -
    -We aren't interested in anything returned from I, so
    -G_DISCARD is specified. Even if I was changed to
    -return some value(s), having specified G_DISCARD will mean that they
    -will be wiped by the time control returns from I.
    -
    -=item 4.
    -
    -As I is being used, the Perl subroutine is specified as a
    -C string. In this case the subroutine name has been 'hard-wired' into the
    -code.
    -
    -=item 5.
    -
    -Because we specified G_DISCARD, it is not necessary to check the value
    -returned from I. It will always be 0.
    -
    -=back
    -
    -=head2 Passing Parameters
    -
    -Now let's make a slightly more complex example. This time we want to
    -call a Perl subroutine, C, which will take 2 parameters--a
    -string ($s) and an integer ($n).  The subroutine will simply
    -print the first $n characters of the string.
    -
    -So the Perl subroutine would look like this
    -
    -    sub LeftString
    -    {
    -        my($s, $n) = @_ ;
    -        print substr($s, 0, $n), "\n" ;
    -    }
    -
    -The C function required to call I would look like this.
    -
    -    static void
    -    call_LeftString(a, b)
    -    char * a ;
    -    int b ;
    -    {
    -        dSP ;
    -
    -	ENTER ;
    -        SAVETMPS ;
    -
    -        PUSHMARK(SP) ;
    -        XPUSHs(sv_2mortal(newSVpv(a, 0)));
    -        XPUSHs(sv_2mortal(newSViv(b)));
    -        PUTBACK ;
    -
    -        call_pv("LeftString", G_DISCARD);
    -
    -        FREETMPS ;
    -        LEAVE ;
    -    }
    -
    -Here are a few notes on the C function I.
    -
    -=over 5
    -
    -=item 1.
    -
    -Parameters are passed to the Perl subroutine using the Perl stack.
    -This is the purpose of the code beginning with the line C and
    -ending with the line C.  The C declares a local copy
    -of the stack pointer.  This local copy should B be accessed
    -as C.
    -
    -=item 2.
    -
    -If you are going to put something onto the Perl stack, you need to know
    -where to put it. This is the purpose of the macro C--it declares
    -and initializes a I copy of the Perl stack pointer.
    -
    -All the other macros which will be used in this example require you to
    -have used this macro.
    -
    -The exception to this rule is if you are calling a Perl subroutine
    -directly from an XSUB function. In this case it is not necessary to
    -use the C macro explicitly--it will be declared for you
    -automatically.
    -
    -=item 3.
    -
    -Any parameters to be pushed onto the stack should be bracketed by the
    -C and C macros.  The purpose of these two macros, in
    -this context, is to count the number of parameters you are
    -pushing automatically.  Then whenever Perl is creating the C<@_> array for the
    -subroutine, it knows how big to make it.
    -
    -The C macro tells Perl to make a mental note of the current
    -stack pointer. Even if you aren't passing any parameters (like the
    -example shown in the section I) you
    -must still call the C macro before you can call any of the
    -I functions--Perl still needs to know that there are no
    -parameters.
    -
    -The C macro sets the global copy of the stack pointer to be
    -the same as our local copy. If we didn't do this I
    -wouldn't know where the two parameters we pushed were--remember that
    -up to now all the stack pointer manipulation we have done is with our
    -local copy, I the global copy.
    -
    -=item 4.
    -
    -Next, we come to XPUSHs. This is where the parameters actually get
    -pushed onto the stack. In this case we are pushing a string and an
    -integer.
    -
    -See L for details
    -on how the XPUSH macros work.
    -
    -=item 5.
    -
    -Because we created temporary values (by means of sv_2mortal() calls)
    -we will have to tidy up the Perl stack and dispose of mortal SVs.
    -
    -This is the purpose of
    -
    -    ENTER ;
    -    SAVETMPS ;
    -
    -at the start of the function, and
    -
    -    FREETMPS ;
    -    LEAVE ;
    -
    -at the end. The C/C pair creates a boundary for any
    -temporaries we create.  This means that the temporaries we get rid of
    -will be limited to those which were created after these calls.
    -
    -The C/C pair will get rid of any values returned by
    -the Perl subroutine (see next example), plus it will also dump the
    -mortal SVs we have created.  Having C/C at the
    -beginning of the code makes sure that no other mortals are destroyed.
    -
    -Think of these macros as working a bit like using C<{> and C<}> in Perl
    -to limit the scope of local variables.
    -
    -See the section I for details of
    -an alternative to using these macros.
    -
    -=item 6.
    -
    -Finally, I can now be called via the I function.
    -The only flag specified this time is G_DISCARD. Because we are passing
    -2 parameters to the Perl subroutine this time, we have not specified
    -G_NOARGS.
    -
    -=back
    -
    -=head2 Returning a Scalar
    -
    -Now for an example of dealing with the items returned from a Perl
    -subroutine.
    -
    -Here is a Perl subroutine, I, that takes 2 integer parameters
    -and simply returns their sum.
    -
    -    sub Adder
    -    {
    -        my($a, $b) = @_ ;
    -        $a + $b ;
    -    }
    -
    -Because we are now concerned with the return value from I, the C
    -function required to call it is now a bit more complex.
    -
    -    static void
    -    call_Adder(a, b)
    -    int a ;
    -    int b ;
    -    {
    -        dSP ;
    -        int count ;
    -
    -        ENTER ;
    -        SAVETMPS;
    -
    -        PUSHMARK(SP) ;
    -        XPUSHs(sv_2mortal(newSViv(a)));
    -        XPUSHs(sv_2mortal(newSViv(b)));
    -        PUTBACK ;
    -
    -        count = call_pv("Adder", G_SCALAR);
    -
    -        SPAGAIN ;
    -
    -        if (count != 1)
    -            croak("Big trouble\n") ;
    -
    -        printf ("The sum of %d and %d is %d\n", a, b, POPi) ;
    -
    -        PUTBACK ;
    -        FREETMPS ;
    -        LEAVE ;
    -    }
    -
    -Points to note this time are
    -
    -=over 5
    -
    -=item 1.
    -
    -The only flag specified this time was G_SCALAR. That means the C<@_>
    -array will be created and that the value returned by I will
    -still exist after the call to I.
    -
    -=item 2.
    -
    -The purpose of the macro C is to refresh the local copy of the
    -stack pointer. This is necessary because it is possible that the memory
    -allocated to the Perl stack has been reallocated whilst in the
    -I call.
    -
    -If you are making use of the Perl stack pointer in your code you must
    -always refresh the local copy using SPAGAIN whenever you make use
    -of the I functions or any other Perl internal function.
    -
    -=item 3.
    -
    -Although only a single value was expected to be returned from I,
    -it is still good practice to check the return code from I
    -anyway.
    -
    -Expecting a single value is not quite the same as knowing that there
    -will be one. If someone modified I to return a list and we
    -didn't check for that possibility and take appropriate action the Perl
    -stack would end up in an inconsistent state. That is something you
    -I don't want to happen ever.
    -
    -=item 4.
    -
    -The C macro is used here to pop the return value from the stack.
    -In this case we wanted an integer, so C was used.
    -
    -
    -Here is the complete list of POP macros available, along with the types
    -they return.
    -
    -    POPs	SV
    -    POPp	pointer
    -    POPn	double
    -    POPi	integer
    -    POPl	long
    -
    -=item 5.
    -
    -The final C is used to leave the Perl stack in a consistent
    -state before exiting the function.  This is necessary because when we
    -popped the return value from the stack with C it updated only our
    -local copy of the stack pointer.  Remember, C sets the global
    -stack pointer to be the same as our local copy.
    -
    -=back
    -
    -
    -=head2 Returning a list of values
    -
    -Now, let's extend the previous example to return both the sum of the
    -parameters and the difference.
    -
    -Here is the Perl subroutine
    -
    -    sub AddSubtract
    -    {
    -       my($a, $b) = @_ ;
    -       ($a+$b, $a-$b) ;
    -    }
    -
    -and this is the C function
    -
    -    static void
    -    call_AddSubtract(a, b)
    -    int a ;
    -    int b ;
    -    {
    -        dSP ;
    -        int count ;
    -
    -        ENTER ;
    -        SAVETMPS;
    -
    -        PUSHMARK(SP) ;
    -        XPUSHs(sv_2mortal(newSViv(a)));
    -        XPUSHs(sv_2mortal(newSViv(b)));
    -        PUTBACK ;
    -
    -        count = call_pv("AddSubtract", G_ARRAY);
    -
    -        SPAGAIN ;
    -
    -        if (count != 2)
    -            croak("Big trouble\n") ;
    -
    -        printf ("%d - %d = %d\n", a, b, POPi) ;
    -        printf ("%d + %d = %d\n", a, b, POPi) ;
    -
    -        PUTBACK ;
    -        FREETMPS ;
    -        LEAVE ;
    -    }
    -
    -If I is called like this
    -
    -    call_AddSubtract(7, 4) ;
    -
    -then here is the output
    -
    -    7 - 4 = 3
    -    7 + 4 = 11
    -
    -Notes
    -
    -=over 5
    -
    -=item 1.
    -
    -We wanted list context, so G_ARRAY was used.
    -
    -=item 2.
    -
    -Not surprisingly C is used twice this time because we were
    -retrieving 2 values from the stack. The important thing to note is that
    -when using the C macros they come off the stack in I
    -order.
    -
    -=back
    -
    -=head2 Returning a list in a scalar context
    -
    -Say the Perl subroutine in the previous section was called in a scalar
    -context, like this
    -
    -    static void
    -    call_AddSubScalar(a, b)
    -    int a ;
    -    int b ;
    -    {
    -        dSP ;
    -        int count ;
    -        int i ;
    -
    -        ENTER ;
    -        SAVETMPS;
    -
    -        PUSHMARK(SP) ;
    -        XPUSHs(sv_2mortal(newSViv(a)));
    -        XPUSHs(sv_2mortal(newSViv(b)));
    -        PUTBACK ;
    -
    -        count = call_pv("AddSubtract", G_SCALAR);
    -
    -        SPAGAIN ;
    -
    -        printf ("Items Returned = %d\n", count) ;
    -
    -        for (i = 1 ; i <= count ; ++i)
    -            printf ("Value %d = %d\n", i, POPi) ;
    -
    -        PUTBACK ;
    -        FREETMPS ;
    -        LEAVE ;
    -    }
    -
    -The other modification made is that I will print the
    -number of items returned from the Perl subroutine and their value (for
    -simplicity it assumes that they are integer).  So if
    -I is called
    -
    -    call_AddSubScalar(7, 4) ;
    -
    -then the output will be
    -
    -    Items Returned = 1
    -    Value 1 = 3
    -
    -In this case the main point to note is that only the last item in the
    -list is returned from the subroutine, I actually made it back to
    -I.
    -
    -
    -=head2 Returning Data from Perl via the parameter list
    -
    -It is also possible to return values directly via the parameter list -
    -whether it is actually desirable to do it is another matter entirely.
    -
    -The Perl subroutine, I, below takes 2 parameters and increments
    -each directly.
    -
    -    sub Inc
    -    {
    -        ++ $_[0] ;
    -        ++ $_[1] ;
    -    }
    -
    -and here is a C function to call it.
    -
    -    static void
    -    call_Inc(a, b)
    -    int a ;
    -    int b ;
    -    {
    -        dSP ;
    -        int count ;
    -        SV * sva ;
    -        SV * svb ;
    -
    -        ENTER ;
    -        SAVETMPS;
    -
    -        sva = sv_2mortal(newSViv(a)) ;
    -        svb = sv_2mortal(newSViv(b)) ;
    -
    -        PUSHMARK(SP) ;
    -        XPUSHs(sva);
    -        XPUSHs(svb);
    -        PUTBACK ;
    -
    -        count = call_pv("Inc", G_DISCARD);
    -
    -        if (count != 0)
    -            croak ("call_Inc: expected 0 values from 'Inc', got %d\n",
    -                   count) ;
    -
    -        printf ("%d + 1 = %d\n", a, SvIV(sva)) ;
    -        printf ("%d + 1 = %d\n", b, SvIV(svb)) ;
    -
    -    	FREETMPS ;
    -        LEAVE ;
    -    }
    -
    -To be able to access the two parameters that were pushed onto the stack
    -after they return from I it is necessary to make a note
    -of their addresses--thus the two variables C and C.
    -
    -The reason this is necessary is that the area of the Perl stack which
    -held them will very likely have been overwritten by something else by
    -the time control returns from I.
    -
    -
    -
    -
    -=head2 Using G_EVAL
    -
    -Now an example using G_EVAL. Below is a Perl subroutine which computes
    -the difference of its 2 parameters. If this would result in a negative
    -result, the subroutine calls I.
    -
    -    sub Subtract
    -    {
    -        my ($a, $b) = @_ ;
    -
    -        die "death can be fatal\n" if $a < $b ;
    -
    -        $a - $b ;
    -    }
    -
    -and some C to call it
    -
    -    static void
    -    call_Subtract(a, b)
    -    int a ;
    -    int b ;
    -    {
    -        dSP ;
    -        int count ;
    -
    -        ENTER ;
    -        SAVETMPS;
    -
    -        PUSHMARK(SP) ;
    -        XPUSHs(sv_2mortal(newSViv(a)));
    -        XPUSHs(sv_2mortal(newSViv(b)));
    -        PUTBACK ;
    -
    -        count = call_pv("Subtract", G_EVAL|G_SCALAR);
    -
    -        SPAGAIN ;
    -
    -        /* Check the eval first */
    -        if (SvTRUE(ERRSV))
    -        {
    -	    STRLEN n_a;
    -            printf ("Uh oh - %s\n", SvPV(ERRSV, n_a)) ;
    -            POPs ;
    -        }
    -        else
    -        {
    -            if (count != 1)
    -               croak("call_Subtract: wanted 1 value from 'Subtract', got %d\n",
    -                        count) ;
    -
    -            printf ("%d - %d = %d\n", a, b, POPi) ;
    -        }
    -
    -        PUTBACK ;
    -        FREETMPS ;
    -        LEAVE ;
    -    }
    -
    -If I is called thus
    -
    -    call_Subtract(4, 5)
    -
    -the following will be printed
    -
    -    Uh oh - death can be fatal
    -
    -Notes
    -
    -=over 5
    -
    -=item 1.
    -
    -We want to be able to catch the I so we have used the G_EVAL
    -flag.  Not specifying this flag would mean that the program would
    -terminate immediately at the I statement in the subroutine
    -I.
    -
    -=item 2.
    -
    -The code
    -
    -    if (SvTRUE(ERRSV))
    -    {
    -	STRLEN n_a;
    -        printf ("Uh oh - %s\n", SvPV(ERRSV, n_a)) ;
    -        POPs ;
    -    }
    -
    -is the direct equivalent of this bit of Perl
    -
    -    print "Uh oh - $@\n" if $@ ;
    -
    -C is a perl global of type C that points to the
    -symbol table entry containing the error.  C therefore
    -refers to the C equivalent of C<$@>.
    -
    -=item 3.
    -
    -Note that the stack is popped using C in the block where
    -C is true.  This is necessary because whenever a
    -I function invoked with G_EVAL|G_SCALAR returns an error,
    -the top of the stack holds the value I. Because we want the
    -program to continue after detecting this error, it is essential that
    -the stack is tidied up by removing the I.
    -
    -=back
    -
    -
    -=head2 Using G_KEEPERR
    -
    -Consider this rather facetious example, where we have used an XS
    -version of the call_Subtract example above inside a destructor:
    -
    -    package Foo;
    -    sub new { bless {}, $_[0] }
    -    sub Subtract {
    -        my($a,$b) = @_;
    -        die "death can be fatal" if $a < $b ;
    -        $a - $b;
    -    }
    -    sub DESTROY { call_Subtract(5, 4); }
    -    sub foo { die "foo dies"; }
    -
    -    package main;
    -    eval { Foo->new->foo };
    -    print "Saw: $@" if $@;             # should be, but isn't
    -
    -This example will fail to recognize that an error occurred inside the
    -C.  Here's why: the call_Subtract code got executed while perl
    -was cleaning up temporaries when exiting the eval block, and because
    -call_Subtract is implemented with I using the G_EVAL
    -flag, it promptly reset C<$@>.  This results in the failure of the
    -outermost test for C<$@>, and thereby the failure of the error trap.
    -
    -Appending the G_KEEPERR flag, so that the I call in
    -call_Subtract reads:
    -
    -        count = call_pv("Subtract", G_EVAL|G_SCALAR|G_KEEPERR);
    -
    -will preserve the error and restore reliable error handling.
    -
    -=head2 Using call_sv
    -
    -In all the previous examples I have 'hard-wired' the name of the Perl
    -subroutine to be called from C.  Most of the time though, it is more
    -convenient to be able to specify the name of the Perl subroutine from
    -within the Perl script.
    -
    -Consider the Perl code below
    -
    -    sub fred
    -    {
    -        print "Hello there\n" ;
    -    }
    -
    -    CallSubPV("fred") ;
    -
    -Here is a snippet of XSUB which defines I.
    -
    -    void
    -    CallSubPV(name)
    -    	char *	name
    -    	CODE:
    -    	PUSHMARK(SP) ;
    -    	call_pv(name, G_DISCARD|G_NOARGS) ;
    -
    -That is fine as far as it goes. The thing is, the Perl subroutine
    -can be specified as only a string.  For Perl 4 this was adequate,
    -but Perl 5 allows references to subroutines and anonymous subroutines.
    -This is where I is useful.
    -
    -The code below for I is identical to I except
    -that the C parameter is now defined as an SV* and we use
    -I instead of I.
    -
    -    void
    -    CallSubSV(name)
    -    	SV *	name
    -    	CODE:
    -    	PUSHMARK(SP) ;
    -    	call_sv(name, G_DISCARD|G_NOARGS) ;
    -
    -Because we are using an SV to call I the following can all be used
    -
    -    CallSubSV("fred") ;
    -    CallSubSV(\&fred) ;
    -    $ref = \&fred ;
    -    CallSubSV($ref) ;
    -    CallSubSV( sub { print "Hello there\n" } ) ;
    -
    -As you can see, I gives you much greater flexibility in
    -how you can specify the Perl subroutine.
    -
    -You should note that if it is necessary to store the SV (C in the
    -example above) which corresponds to the Perl subroutine so that it can
    -be used later in the program, it not enough just to store a copy of the
    -pointer to the SV. Say the code above had been like this
    -
    -    static SV * rememberSub ;
    -
    -    void
    -    SaveSub1(name)
    -    	SV *	name
    -    	CODE:
    -    	rememberSub = name ;
    -
    -    void
    -    CallSavedSub1()
    -    	CODE:
    -    	PUSHMARK(SP) ;
    -    	call_sv(rememberSub, G_DISCARD|G_NOARGS) ;
    -
    -The reason this is wrong is that by the time you come to use the
    -pointer C in C, it may or may not still refer
    -to the Perl subroutine that was recorded in C.  This is
    -particularly true for these cases
    -
    -    SaveSub1(\&fred) ;
    -    CallSavedSub1() ;
    -
    -    SaveSub1( sub { print "Hello there\n" } ) ;
    -    CallSavedSub1() ;
    -
    -By the time each of the C statements above have been executed,
    -the SV*s which corresponded to the parameters will no longer exist.
    -Expect an error message from Perl of the form
    -
    -    Can't use an undefined value as a subroutine reference at ...
    -
    -for each of the C lines.
    -
    -Similarly, with this code
    -
    -    $ref = \&fred ;
    -    SaveSub1($ref) ;
    -    $ref = 47 ;
    -    CallSavedSub1() ;
    -
    -you can expect one of these messages (which you actually get is dependent on
    -the version of Perl you are using)
    -
    -    Not a CODE reference at ...
    -    Undefined subroutine &main::47 called ...
    -
    -The variable $ref may have referred to the subroutine C
    -whenever the call to C was made but by the time
    -C gets called it now holds the number C<47>. Because we
    -saved only a pointer to the original SV in C, any changes to
    -$ref will be tracked by the pointer C. This means that
    -whenever C gets called, it will attempt to execute the
    -code which is referenced by the SV* C.  In this case
    -though, it now refers to the integer C<47>, so expect Perl to complain
    -loudly.
    -
    -A similar but more subtle problem is illustrated with this code
    -
    -    $ref = \&fred ;
    -    SaveSub1($ref) ;
    -    $ref = \&joe ;
    -    CallSavedSub1() ;
    -
    -This time whenever C get called it will execute the Perl
    -subroutine C (assuming it exists) rather than C as was
    -originally requested in the call to C.
    -
    -To get around these problems it is necessary to take a full copy of the
    -SV.  The code below shows C modified to do that
    -
    -    static SV * keepSub = (SV*)NULL ;
    -
    -    void
    -    SaveSub2(name)
    -        SV *	name
    -    	CODE:
    -     	/* Take a copy of the callback */
    -    	if (keepSub == (SV*)NULL)
    -    	    /* First time, so create a new SV */
    -    	    keepSub = newSVsv(name) ;
    -    	else
    -    	    /* Been here before, so overwrite */
    -    	    SvSetSV(keepSub, name) ;
    -
    -    void
    -    CallSavedSub2()
    -    	CODE:
    -    	PUSHMARK(SP) ;
    -    	call_sv(keepSub, G_DISCARD|G_NOARGS) ;
    -
    -To avoid creating a new SV every time C is called,
    -the function first checks to see if it has been called before.  If not,
    -then space for a new SV is allocated and the reference to the Perl
    -subroutine, C is copied to the variable C in one
    -operation using C.  Thereafter, whenever C is called
    -the existing SV, C, is overwritten with the new value using
    -C.
    -
    -=head2 Using call_argv
    -
    -Here is a Perl subroutine which prints whatever parameters are passed
    -to it.
    -
    -    sub PrintList
    -    {
    -        my(@list) = @_ ;
    -
    -        foreach (@list) { print "$_\n" }
    -    }
    -
    -and here is an example of I which will call
    -I.
    -
    -    static char * words[] = {"alpha", "beta", "gamma", "delta", NULL} ;
    -
    -    static void
    -    call_PrintList()
    -    {
    -        dSP ;
    -
    -        call_argv("PrintList", G_DISCARD, words) ;
    -    }
    -
    -Note that it is not necessary to call C in this instance.
    -This is because I will do it for you.
    -
    -=head2 Using call_method
    -
    -Consider the following Perl code
    -
    -    {
    -        package Mine ;
    -
    -        sub new
    -        {
    -            my($type) = shift ;
    -            bless [@_]
    -        }
    -
    -        sub Display
    -        {
    -            my ($self, $index) = @_ ;
    -            print "$index: $$self[$index]\n" ;
    -        }
    -
    -        sub PrintID
    -        {
    -            my($class) = @_ ;
    -            print "This is Class $class version 1.0\n" ;
    -        }
    -    }
    -
    -It implements just a very simple class to manage an array.  Apart from
    -the constructor, C, it declares methods, one static and one
    -virtual. The static method, C, prints out simply the class
    -name and a version number. The virtual method, C, prints out a
    -single element of the array.  Here is an all Perl example of using it.
    -
    -    $a = new Mine ('red', 'green', 'blue') ;
    -    $a->Display(1) ;
    -    PrintID Mine;
    -
    -will print
    -
    -    1: green
    -    This is Class Mine version 1.0
    -
    -Calling a Perl method from C is fairly straightforward. The following
    -things are required
    -
    -=over 5
    -
    -=item *
    -
    -a reference to the object for a virtual method or the name of the class
    -for a static method.
    -
    -=item *
    -
    -the name of the method.
    -
    -=item *
    -
    -any other parameters specific to the method.
    -
    -=back
    -
    -Here is a simple XSUB which illustrates the mechanics of calling both
    -the C and C methods from C.
    -
    -    void
    -    call_Method(ref, method, index)
    -        SV *	ref
    -        char *	method
    -        int		index
    -        CODE:
    -        PUSHMARK(SP);
    -        XPUSHs(ref);
    -        XPUSHs(sv_2mortal(newSViv(index))) ;
    -        PUTBACK;
    -
    -        call_method(method, G_DISCARD) ;
    -
    -    void
    -    call_PrintID(class, method)
    -        char *	class
    -        char *	method
    -        CODE:
    -        PUSHMARK(SP);
    -        XPUSHs(sv_2mortal(newSVpv(class, 0))) ;
    -        PUTBACK;
    -
    -        call_method(method, G_DISCARD) ;
    -
    -
    -So the methods C and C can be invoked like this
    -
    -    $a = new Mine ('red', 'green', 'blue') ;
    -    call_Method($a, 'Display', 1) ;
    -    call_PrintID('Mine', 'PrintID') ;
    -
    -The only thing to note is that in both the static and virtual methods,
    -the method name is not passed via the stack--it is used as the first
    -parameter to I.
    -
    -=head2 Using GIMME_V
    -
    -Here is a trivial XSUB which prints the context in which it is
    -currently executing.
    -
    -    void
    -    PrintContext()
    -        CODE:
    -        I32 gimme = GIMME_V;
    -        if (gimme == G_VOID)
    -            printf ("Context is Void\n") ;
    -        else if (gimme == G_SCALAR)
    -            printf ("Context is Scalar\n") ;
    -        else
    -            printf ("Context is Array\n") ;
    -
    -and here is some Perl to test it
    -
    -    PrintContext ;
    -    $a = PrintContext ;
    -    @a = PrintContext ;
    -
    -The output from that will be
    -
    -    Context is Void
    -    Context is Scalar
    -    Context is Array
    -
    -=head2 Using Perl to dispose of temporaries
    -
    -In the examples given to date, any temporaries created in the callback
    -(i.e., parameters passed on the stack to the I function or
    -values returned via the stack) have been freed by one of these methods
    -
    -=over 5
    -
    -=item *
    -
    -specifying the G_DISCARD flag with I.
    -
    -=item *
    -
    -explicitly disposed of using the C/C -
    -C/C pairing.
    -
    -=back
    -
    -There is another method which can be used, namely letting Perl do it
    -for you automatically whenever it regains control after the callback
    -has terminated.  This is done by simply not using the
    -
    -    ENTER ;
    -    SAVETMPS ;
    -    ...
    -    FREETMPS ;
    -    LEAVE ;
    -
    -sequence in the callback (and not, of course, specifying the G_DISCARD
    -flag).
    -
    -If you are going to use this method you have to be aware of a possible
    -memory leak which can arise under very specific circumstances.  To
    -explain these circumstances you need to know a bit about the flow of
    -control between Perl and the callback routine.
    -
    -The examples given at the start of the document (an error handler and
    -an event driven program) are typical of the two main sorts of flow
    -control that you are likely to encounter with callbacks.  There is a
    -very important distinction between them, so pay attention.
    -
    -In the first example, an error handler, the flow of control could be as
    -follows.  You have created an interface to an external library.
    -Control can reach the external library like this
    -
    -    perl --> XSUB --> external library
    -
    -Whilst control is in the library, an error condition occurs. You have
    -previously set up a Perl callback to handle this situation, so it will
    -get executed. Once the callback has finished, control will drop back to
    -Perl again.  Here is what the flow of control will be like in that
    -situation
    -
    -    perl --> XSUB --> external library
    -                      ...
    -                      error occurs
    -                      ...
    -                      external library --> call_* --> perl
    -                                                          |
    -    perl <-- XSUB <-- external library <-- call_* <----+
    -
    -After processing of the error using I is completed,
    -control reverts back to Perl more or less immediately.
    -
    -In the diagram, the further right you go the more deeply nested the
    -scope is.  It is only when control is back with perl on the extreme
    -left of the diagram that you will have dropped back to the enclosing
    -scope and any temporaries you have left hanging around will be freed.
    -
    -In the second example, an event driven program, the flow of control
    -will be more like this
    -
    -    perl --> XSUB --> event handler
    -                      ...
    -                      event handler --> call_* --> perl
    -                                                       |
    -                      event handler <-- call_* <----+
    -                      ...
    -                      event handler --> call_* --> perl
    -                                                       |
    -                      event handler <-- call_* <----+
    -                      ...
    -                      event handler --> call_* --> perl
    -                                                       |
    -                      event handler <-- call_* <----+
    -
    -In this case the flow of control can consist of only the repeated
    -sequence
    -
    -    event handler --> call_* --> perl
    -
    -for practically the complete duration of the program.  This means that
    -control may I drop back to the surrounding scope in Perl at the
    -extreme left.
    -
    -So what is the big problem? Well, if you are expecting Perl to tidy up
    -those temporaries for you, you might be in for a long wait.  For Perl
    -to dispose of your temporaries, control must drop back to the
    -enclosing scope at some stage.  In the event driven scenario that may
    -never happen.  This means that as time goes on, your program will
    -create more and more temporaries, none of which will ever be freed. As
    -each of these temporaries consumes some memory your program will
    -eventually consume all the available memory in your system--kapow!
    -
    -So here is the bottom line--if you are sure that control will revert
    -back to the enclosing Perl scope fairly quickly after the end of your
    -callback, then it isn't absolutely necessary to dispose explicitly of
    -any temporaries you may have created. Mind you, if you are at all
    -uncertain about what to do, it doesn't do any harm to tidy up anyway.
    -
    -
    -=head2 Strategies for storing Callback Context Information
    -
    -
    -Potentially one of the trickiest problems to overcome when designing a
    -callback interface can be figuring out how to store the mapping between
    -the C callback function and the Perl equivalent.
    -
    -To help understand why this can be a real problem first consider how a
    -callback is set up in an all C environment.  Typically a C API will
    -provide a function to register a callback.  This will expect a pointer
    -to a function as one of its parameters.  Below is a call to a
    -hypothetical function C which registers the C function
    -to get called when a fatal error occurs.
    -
    -    register_fatal(cb1) ;
    -
    -The single parameter C is a pointer to a function, so you must
    -have defined C in your code, say something like this
    -
    -    static void
    -    cb1()
    -    {
    -        printf ("Fatal Error\n") ;
    -        exit(1) ;
    -    }
    -
    -Now change that to call a Perl subroutine instead
    -
    -    static SV * callback = (SV*)NULL;
    -
    -    static void
    -    cb1()
    -    {
    -        dSP ;
    -
    -        PUSHMARK(SP) ;
    -
    -        /* Call the Perl sub to process the callback */
    -        call_sv(callback, G_DISCARD) ;
    -    }
    -
    -
    -    void
    -    register_fatal(fn)
    -        SV *	fn
    -        CODE:
    -        /* Remember the Perl sub */
    -        if (callback == (SV*)NULL)
    -            callback = newSVsv(fn) ;
    -        else
    -            SvSetSV(callback, fn) ;
    -
    -        /* register the callback with the external library */
    -        register_fatal(cb1) ;
    -
    -where the Perl equivalent of C and the callback it
    -registers, C, might look like this
    -
    -    # Register the sub pcb1
    -    register_fatal(\&pcb1) ;
    -
    -    sub pcb1
    -    {
    -        die "I'm dying...\n" ;
    -    }
    -
    -The mapping between the C callback and the Perl equivalent is stored in
    -the global variable C.
    -
    -This will be adequate if you ever need to have only one callback
    -registered at any time. An example could be an error handler like the
    -code sketched out above. Remember though, repeated calls to
    -C will replace the previously registered callback
    -function with the new one.
    -
    -Say for example you want to interface to a library which allows asynchronous
    -file i/o.  In this case you may be able to register a callback whenever
    -a read operation has completed. To be of any use we want to be able to
    -call separate Perl subroutines for each file that is opened.  As it
    -stands, the error handler example above would not be adequate as it
    -allows only a single callback to be defined at any time. What we
    -require is a means of storing the mapping between the opened file and
    -the Perl subroutine we want to be called for that file.
    -
    -Say the i/o library has a function C which associates a C
    -function C with a file handle C--this assumes that it
    -has also provided some routine to open the file and so obtain the file
    -handle.
    -
    -    asynch_read(fh, ProcessRead)
    -
    -This may expect the C I function of this form
    -
    -    void
    -    ProcessRead(fh, buffer)
    -    int	fh ;
    -    char *	buffer ;
    -    {
    -         ...
    -    }
    -
    -To provide a Perl interface to this library we need to be able to map
    -between the C parameter and the Perl subroutine we want called.  A
    -hash is a convenient mechanism for storing this mapping.  The code
    -below shows a possible implementation
    -
    -    static HV * Mapping = (HV*)NULL ;
    -
    -    void
    -    asynch_read(fh, callback)
    -        int	fh
    -        SV *	callback
    -        CODE:
    -        /* If the hash doesn't already exist, create it */
    -        if (Mapping == (HV*)NULL)
    -            Mapping = newHV() ;
    -
    -        /* Save the fh -> callback mapping */
    -        hv_store(Mapping, (char*)&fh, sizeof(fh), newSVsv(callback), 0) ;
    -
    -        /* Register with the C Library */
    -        asynch_read(fh, asynch_read_if) ;
    -
    -and C could look like this
    -
    -    static void
    -    asynch_read_if(fh, buffer)
    -    int	fh ;
    -    char *	buffer ;
    -    {
    -        dSP ;
    -        SV ** sv ;
    -
    -        /* Get the callback associated with fh */
    -        sv =  hv_fetch(Mapping, (char*)&fh , sizeof(fh), FALSE) ;
    -        if (sv == (SV**)NULL)
    -            croak("Internal error...\n") ;
    -
    -        PUSHMARK(SP) ;
    -        XPUSHs(sv_2mortal(newSViv(fh))) ;
    -        XPUSHs(sv_2mortal(newSVpv(buffer, 0))) ;
    -        PUTBACK ;
    -
    -        /* Call the Perl sub */
    -        call_sv(*sv, G_DISCARD) ;
    -    }
    -
    -For completeness, here is C.  This shows how to remove
    -the entry from the hash C.
    -
    -    void
    -    asynch_close(fh)
    -        int	fh
    -        CODE:
    -        /* Remove the entry from the hash */
    -        (void) hv_delete(Mapping, (char*)&fh, sizeof(fh), G_DISCARD) ;
    -
    -        /* Now call the real asynch_close */
    -        asynch_close(fh) ;
    -
    -So the Perl interface would look like this
    -
    -    sub callback1
    -    {
    -        my($handle, $buffer) = @_ ;
    -    }
    -
    -    # Register the Perl callback
    -    asynch_read($fh, \&callback1) ;
    -
    -    asynch_close($fh) ;
    -
    -The mapping between the C callback and Perl is stored in the global
    -hash C this time. Using a hash has the distinct advantage that
    -it allows an unlimited number of callbacks to be registered.
    -
    -What if the interface provided by the C callback doesn't contain a
    -parameter which allows the file handle to Perl subroutine mapping?  Say
    -in the asynchronous i/o package, the callback function gets passed only
    -the C parameter like this
    -
    -    void
    -    ProcessRead(buffer)
    -    char *	buffer ;
    -    {
    -        ...
    -    }
    -
    -Without the file handle there is no straightforward way to map from the
    -C callback to the Perl subroutine.
    -
    -In this case a possible way around this problem is to predefine a
    -series of C functions to act as the interface to Perl, thus
    -
    -    #define MAX_CB		3
    -    #define NULL_HANDLE	-1
    -    typedef void (*FnMap)() ;
    -
    -    struct MapStruct {
    -        FnMap    Function ;
    -        SV *     PerlSub ;
    -        int      Handle ;
    -      } ;
    -
    -    static void  fn1() ;
    -    static void  fn2() ;
    -    static void  fn3() ;
    -
    -    static struct MapStruct Map [MAX_CB] =
    -        {
    -            { fn1, NULL, NULL_HANDLE },
    -            { fn2, NULL, NULL_HANDLE },
    -            { fn3, NULL, NULL_HANDLE }
    -        } ;
    -
    -    static void
    -    Pcb(index, buffer)
    -    int index ;
    -    char * buffer ;
    -    {
    -        dSP ;
    -
    -        PUSHMARK(SP) ;
    -        XPUSHs(sv_2mortal(newSVpv(buffer, 0))) ;
    -        PUTBACK ;
    -
    -        /* Call the Perl sub */
    -        call_sv(Map[index].PerlSub, G_DISCARD) ;
    -    }
    -
    -    static void
    -    fn1(buffer)
    -    char * buffer ;
    -    {
    -        Pcb(0, buffer) ;
    -    }
    -
    -    static void
    -    fn2(buffer)
    -    char * buffer ;
    -    {
    -        Pcb(1, buffer) ;
    -    }
    -
    -    static void
    -    fn3(buffer)
    -    char * buffer ;
    -    {
    -        Pcb(2, buffer) ;
    -    }
    -
    -    void
    -    array_asynch_read(fh, callback)
    -        int		fh
    -        SV *	callback
    -        CODE:
    -        int index ;
    -        int null_index = MAX_CB ;
    -
    -        /* Find the same handle or an empty entry */
    -        for (index = 0 ; index < MAX_CB ; ++index)
    -        {
    -            if (Map[index].Handle == fh)
    -                break ;
    -
    -            if (Map[index].Handle == NULL_HANDLE)
    -                null_index = index ;
    -        }
    -
    -        if (index == MAX_CB && null_index == MAX_CB)
    -            croak ("Too many callback functions registered\n") ;
    -
    -        if (index == MAX_CB)
    -            index = null_index ;
    -
    -        /* Save the file handle */
    -        Map[index].Handle = fh ;
    -
    -        /* Remember the Perl sub */
    -        if (Map[index].PerlSub == (SV*)NULL)
    -            Map[index].PerlSub = newSVsv(callback) ;
    -        else
    -            SvSetSV(Map[index].PerlSub, callback) ;
    -
    -        asynch_read(fh, Map[index].Function) ;
    -
    -    void
    -    array_asynch_close(fh)
    -        int	fh
    -        CODE:
    -        int index ;
    -
    -        /* Find the file handle */
    -        for (index = 0; index < MAX_CB ; ++ index)
    -            if (Map[index].Handle == fh)
    -                break ;
    -
    -        if (index == MAX_CB)
    -            croak ("could not close fh %d\n", fh) ;
    -
    -        Map[index].Handle = NULL_HANDLE ;
    -        SvREFCNT_dec(Map[index].PerlSub) ;
    -        Map[index].PerlSub = (SV*)NULL ;
    -
    -        asynch_close(fh) ;
    -
    -In this case the functions C, C, and C are used to
    -remember the Perl subroutine to be called. Each of the functions holds
    -a separate hard-wired index which is used in the function C to
    -access the C array and actually call the Perl subroutine.
    -
    -There are some obvious disadvantages with this technique.
    -
    -Firstly, the code is considerably more complex than with the previous
    -example.
    -
    -Secondly, there is a hard-wired limit (in this case 3) to the number of
    -callbacks that can exist simultaneously. The only way to increase the
    -limit is by modifying the code to add more functions and then
    -recompiling.  None the less, as long as the number of functions is
    -chosen with some care, it is still a workable solution and in some
    -cases is the only one available.
    -
    -To summarize, here are a number of possible methods for you to consider
    -for storing the mapping between C and the Perl callback
    -
    -=over 5
    -
    -=item 1. Ignore the problem - Allow only 1 callback
    -
    -For a lot of situations, like interfacing to an error handler, this may
    -be a perfectly adequate solution.
    -
    -=item 2. Create a sequence of callbacks - hard wired limit
    -
    -If it is impossible to tell from the parameters passed back from the C
    -callback what the context is, then you may need to create a sequence of C
    -callback interface functions, and store pointers to each in an array.
    -
    -=item 3. Use a parameter to map to the Perl callback
    -
    -A hash is an ideal mechanism to store the mapping between C and Perl.
    -
    -=back
    -
    -
    -=head2 Alternate Stack Manipulation
    -
    -
    -Although I have made use of only the C macros to access values
    -returned from Perl subroutines, it is also possible to bypass these
    -macros and read the stack using the C macro (See L for a
    -full description of the C macro).
    -
    -Most of the time the C macros should be adequate, the main
    -problem with them is that they force you to process the returned values
    -in sequence. This may not be the most suitable way to process the
    -values in some cases. What we want is to be able to access the stack in
    -a random order. The C macro as used when coding an XSUB is ideal
    -for this purpose.
    -
    -The code below is the example given in the section I recoded to use C instead of C.
    -
    -    static void
    -    call_AddSubtract2(a, b)
    -    int a ;
    -    int b ;
    -    {
    -        dSP ;
    -        I32 ax ;
    -        int count ;
    -
    -        ENTER ;
    -        SAVETMPS;
    -
    -        PUSHMARK(SP) ;
    -        XPUSHs(sv_2mortal(newSViv(a)));
    -        XPUSHs(sv_2mortal(newSViv(b)));
    -        PUTBACK ;
    -
    -        count = call_pv("AddSubtract", G_ARRAY);
    -
    -        SPAGAIN ;
    -        SP -= count ;
    -        ax = (SP - PL_stack_base) + 1 ;
    -
    -        if (count != 2)
    -            croak("Big trouble\n") ;
    -
    -        printf ("%d + %d = %d\n", a, b, SvIV(ST(0))) ;
    -        printf ("%d - %d = %d\n", a, b, SvIV(ST(1))) ;
    -
    -        PUTBACK ;
    -        FREETMPS ;
    -        LEAVE ;
    -    }
    -
    -Notes
    -
    -=over 5
    -
    -=item 1.
    -
    -Notice that it was necessary to define the variable C.  This is
    -because the C macro expects it to exist.  If we were in an XSUB it
    -would not be necessary to define C as it is already defined for
    -you.
    -
    -=item 2.
    -
    -The code
    -
    -        SPAGAIN ;
    -        SP -= count ;
    -        ax = (SP - PL_stack_base) + 1 ;
    -
    -sets the stack up so that we can use the C macro.
    -
    -=item 3.
    -
    -Unlike the original coding of this example, the returned
    -values are not accessed in reverse order.  So C refers to the
    -first value returned by the Perl subroutine and C
    -refers to the last.
    -
    -=back
    -
    -=head2 Creating and calling an anonymous subroutine in C
    -
    -As we've already shown, C can be used to invoke an
    -anonymous subroutine.  However, our example showed a Perl script
    -invoking an XSUB to perform this operation.  Let's see how it can be
    -done inside our C code:
    -
    - ...
    -
    - SV *cvrv = eval_pv("sub { print 'You will not find me cluttering any namespace!' }", TRUE);
    -
    - ...
    -
    - call_sv(cvrv, G_VOID|G_NOARGS);
    -
    -C is used to compile the anonymous subroutine, which
    -will be the return value as well (read more about C in
    -L).  Once this code reference is in hand, it
    -can be mixed in with all the previous examples we've shown.
    -
    -=head1 SEE ALSO
    -
    -L, L, L
    -
    -=head1 AUTHOR
    -
    -Paul Marquess 
    -
    -Special thanks to the following people who assisted in the creation of
    -the document.
    -
    -Jeff Okamoto, Tim Bunce, Nick Gianniotis, Steve Kelem, Gurusamy Sarathy
    -and Larry Wall.
    -
    -=head1 DATE
    -
    -Version 1.3, 14th Apr 1997
    diff --git a/lib/perl5/5.6.1/pods/perlclib.pod b/lib/perl5/5.6.1/pods/perlclib.pod
    deleted file mode 100644
    index a0f4a80e..00000000
    --- a/lib/perl5/5.6.1/pods/perlclib.pod
    +++ /dev/null
    @@ -1,197 +0,0 @@
    -=head1 NAME
    -
    -perlclib - Internal replacements for standard C library functions
    -
    -=head1 DESCRIPTION
    -
    -One thing Perl porters should note is that F doesn't tend to use that
    -much of the C standard library internally; you'll see very little use of, 
    -for example, the F functions in there. This is because Perl
    -tends to reimplement or abstract standard library functions, so that we
    -know exactly how they're going to operate.
    -
    -This is a reference card for people who are familiar with the C library
    -and who want to do things the Perl way; to tell them which functions
    -they ought to use instead of the more normal C functions. 
    -
    -=head2 Conventions
    -
    -In the following tables:
    -
    -=over 3
    -
    -=item C
    -
    -is a type.
    -
    -=item C

    - -is a pointer. - -=item C - -is a number. - -=item C - -is a string. - -=back - -C, C, C, etc. represent variables of their respective types. - -=head2 File Operations - -Instead of the F functions, you should use the Perl abstraction -layer. Instead of C types, you need to be handling C -types. Don't forget that with the new PerlIO layered I/O abstraction -C types may not even be available. See also the C -documentation for more information about the following functions: - - Instead Of: Use: - - stdin PerlIO_stdin() - stdout PerlIO_stdout() - stderr PerlIO_stderr() - - fopen(fn, mode) PerlIO_open(fn, mode) - freopen(fn, mode, stream) PerlIO_reopen(fn, mode, perlio) (Deprecated) - fflush(stream) PerlIO_flush(perlio) - fclose(stream) PerlIO_close(perlio) - -=head2 File Input and Output - - Instead Of: Use: - - fprintf(stream, fmt, ...) PerlIO_printf(perlio, fmt, ...) - - [f]getc(stream) PerlIO_getc(perlio) - [f]putc(stream, n) PerlIO_putc(perlio, n) - ungetc(n, stream) PerlIO_ungetc(perlio, n) - -Note that the PerlIO equivalents of C and C are slightly -different from their C library counterparts: - - fread(p, size, n, stream) PerlIO_read(perlio, buf, numbytes) - fwrite(p, size, n, stream) PerlIO_write(perlio, buf, numbytes) - - fputs(s, stream) PerlIO_puts(perlio, s) - -There is no equivalent to C; one should use C instead: - - fgets(s, n, stream) sv_gets(sv, perlio, append) - -=head2 File Positioning - - Instead Of: Use: - - feof(stream) PerlIO_eof(perlio) - fseek(stream, n, whence) PerlIO_seek(perlio, n, whence) - rewind(stream) PerlIO_rewind(perlio) - - fgetpos(stream, p) PerlIO_getpos(perlio, sv) - fsetpos(stream, p) PerlIO_setpos(perlio, sv) - - ferror(stream) PerlIO_error(perlio) - clearerr(stream) PerlIO_clearerr(perlio) - -=head2 Memory Management and String Handling - - Instead Of: Use: - - t* p = malloc(n) New(id, p, n, t) - t* p = calloc(n, s) Newz(id, p, n, t) - p = realloc(p, n) Renew(p, n, t) - memcpy(dst, src, n) Copy(src, dst, n, t) - memmove(dst, src, n) Move(src, dst, n, t) - memcpy/*(struct foo *) StructCopy(src, dst, t) - free(p) Safefree(p) - - strdup(p) savepv(p) - strndup(p, n) savepvn(p, n) (Hey, strndup doesn't exist!) - - strstr(big, little) instr(big, little) - strcmp(s1, s2) strLE(s1, s2) / strEQ(s1, s2) / strGT(s1,s2) - strncmp(s1, s2, n) strnNE(s1, s2, n) / strnEQ(s1, s2, n) - -Notice the different order of arguments to C and C than used -in C and C. - -Most of the time, though, you'll want to be dealing with SVs internally -instead of raw C strings: - - strlen(s) sv_len(sv) - strcpy(dt, src) sv_setpv(sv, s) - strncpy(dt, src, n) sv_setpvn(sv, s, n) - strcat(dt, src) sv_catpv(sv, s) - strncat(dt, src) sv_catpvn(sv, s) - sprintf(s, fmt, ...) sv_setpvf(sv, fmt, ...) - -Note also the existence of C and C, combining -concatenation with formatting. - -=head2 Character Class Tests - -There are two types of character class tests that Perl implements: one -type deals in Cs and are thus B Unicode aware (and hence -deprecated unless you B you should use them) and the other type -deal in Cs and know about Unicode properties. In the following -table, C is a C, and C is a Unicode codepoint. - - Instead Of: Use: But better use: - - isalnum(c) isALNUM(c) isALNUM_uni(u) - isalpha(c) isALPHA(c) isALPHA_uni(u) - iscntrl(c) isCNTRL(c) isCNTRL_uni(u) - isdigit(c) isDIGIT(c) isDIGIT_uni(u) - isgraph(c) isGRAPH(c) isGRAPH_uni(u) - islower(c) isLOWER(c) isLOWER_uni(u) - isprint(c) isPRINT(c) isPRINT_uni(u) - ispunct(c) isPUNCT(c) isPUNCT_uni(u) - isspace(c) isSPACE(c) isSPACE_uni(u) - isupper(c) isUPPER(c) isUPPER_uni(u) - isxdigit(c) isXDIGIT(c) isXDIGIT_uni(u) - - tolower(c) toLOWER(c) toLOWER_uni(u) - toupper(c) toUPPER(c) toUPPER_uni(u) - -=head2 F functions - - Instead Of: Use: - - atof(s) Atof(s) - atol(s) Atol(s) - strtod(s, *p) Nothing. Just don't use it. - strtol(s, *p, n) Strtol(s, *p, n) - strtoul(s, *p, n) Strtoul(s, *p, n) - -Notice also the C, C, and C functions in -F for converting strings representing numbers in the respective -bases into Cs. - -In theory C and C may not be defined if the machine perl is -built on doesn't actually have strtol and strtoul. But as those 2 -functions are part of the 1989 ANSI C spec we suspect you'll find them -everywhere by now. - - int rand() double Drand01() - srand(n) { seedDrand01((Rand_seed_t)n); - PL_srand_called = TRUE; } - - exit(n) my_exit(n) - system(s) Don't. Look at pp_system or use my_popen - - getenv(s) PerlEnv_getenv(s) - setenv(s, val) my_putenv(s, val) - -=head2 Miscellaneous functions - -You should not even B to use F functions, but if you -think you do, use the C stack in F instead. - -For C/C, use C. - -=head1 SEE ALSO - -C, C, C - diff --git a/lib/perl5/5.6.1/pods/perlcompile.pod b/lib/perl5/5.6.1/pods/perlcompile.pod deleted file mode 100644 index 282592e9..00000000 --- a/lib/perl5/5.6.1/pods/perlcompile.pod +++ /dev/null @@ -1,441 +0,0 @@ -=head1 NAME - -perlcompile - Introduction to the Perl Compiler-Translator - -=head1 DESCRIPTION - -Perl has always had a compiler: your source is compiled into an -internal form (a parse tree) which is then optimized before being -run. Since version 5.005, Perl has shipped with a module -capable of inspecting the optimized parse tree (C), and this has -been used to write many useful utilities, including a module that lets -you turn your Perl into C source code that can be compiled into an -native executable. - -The C module provides access to the parse tree, and other modules -("back ends") do things with the tree. Some write it out as -bytecode, C source code, or a semi-human-readable text. Another -traverses the parse tree to build a cross-reference of which -subroutines, formats, and variables are used where. Another checks -your code for dubious constructs. Yet another back end dumps the -parse tree back out as Perl source, acting as a source code beautifier -or deobfuscator. - -Because its original purpose was to be a way to produce C code -corresponding to a Perl program, and in turn a native executable, the -C module and its associated back ends are known as "the -compiler", even though they don't really compile anything. -Different parts of the compiler are more accurately a "translator", -or an "inspector", but people want Perl to have a "compiler -option" not an "inspector gadget". What can you do? - -This document covers the use of the Perl compiler: which modules -it comprises, how to use the most important of the back end modules, -what problems there are, and how to work around them. - -=head2 Layout - -The compiler back ends are in the C hierarchy, and the front-end -(the module that you, the user of the compiler, will sometimes -interact with) is the O module. Some back ends (e.g., C) have -programs (e.g., I) to hide the modules' complexity. - -Here are the important back ends to know about, with their status -expressed as a number from 0 (outline for later implementation) to -10 (if there's a bug in it, we're very surprised): - -=over 4 - -=item B::Bytecode - -Stores the parse tree in a machine-independent format, suitable -for later reloading through the ByteLoader module. Status: 5 (some -things work, some things don't, some things are untested). - -=item B::C - -Creates a C source file containing code to rebuild the parse tree -and resume the interpreter. Status: 6 (many things work adequately, -including programs using Tk). - -=item B::CC - -Creates a C source file corresponding to the run time code path in -the parse tree. This is the closest to a Perl-to-C translator there -is, but the code it generates is almost incomprehensible because it -translates the parse tree into a giant switch structure that -manipulates Perl structures. Eventual goal is to reduce (given -sufficient type information in the Perl program) some of the -Perl data structure manipulations into manipulations of C-level -ints, floats, etc. Status: 5 (some things work, including -uncomplicated Tk examples). - -=item B::Lint - -Complains if it finds dubious constructs in your source code. Status: -6 (it works adequately, but only has a very limited number of areas -that it checks). - -=item B::Deparse - -Recreates the Perl source, making an attempt to format it coherently. -Status: 8 (it works nicely, but a few obscure things are missing). - -=item B::Xref - -Reports on the declaration and use of subroutines and variables. -Status: 8 (it works nicely, but still has a few lingering bugs). - -=back - -=head1 Using The Back Ends - -The following sections describe how to use the various compiler back -ends. They're presented roughly in order of maturity, so that the -most stable and proven back ends are described first, and the most -experimental and incomplete back ends are described last. - -The O module automatically enabled the B<-c> flag to Perl, which -prevents Perl from executing your code once it has been compiled. -This is why all the back ends print: - - myperlprogram syntax OK - -before producing any other output. - -=head2 The Cross Referencing Back End - -The cross referencing back end (B::Xref) produces a report on your program, -breaking down declarations and uses of subroutines and variables (and -formats) by file and subroutine. For instance, here's part of the -report from the I program that comes with Perl: - - Subroutine clear_noremap - Package (lexical) - $ready_to_print i1069, 1079 - Package main - $& 1086 - $. 1086 - $0 1086 - $1 1087 - $2 1085, 1085 - $3 1085, 1085 - $ARGV 1086 - %HTML_Escapes 1085, 1085 - -This shows the variables used in the subroutine C. The -variable C<$ready_to_print> is a my() (lexical) variable, -Bntroduced (first declared with my()) on line 1069, and used on -line 1079. The variable C<$&> from the main package is used on 1086, -and so on. - -A line number may be prefixed by a single letter: - -=over 4 - -=item i - -Lexical variable introduced (declared with my()) for the first time. - -=item & - -Subroutine or method call. - -=item s - -Subroutine defined. - -=item r - -Format defined. - -=back - -The most useful option the cross referencer has is to save the report -to a separate file. For instance, to save the report on -I to the file I: - - $ perl -MO=Xref,-oreport myperlprogram - -=head2 The Decompiling Back End - -The Deparse back end turns your Perl source back into Perl source. It -can reformat along the way, making it useful as a de-obfuscator. The -most basic way to use it is: - - $ perl -MO=Deparse myperlprogram - -You'll notice immediately that Perl has no idea of how to paragraph -your code. You'll have to separate chunks of code from each other -with newlines by hand. However, watch what it will do with -one-liners: - - $ perl -MO=Deparse -e '$op=shift||die "usage: $0 - code [...]";chomp(@ARGV=<>)unless@ARGV; for(@ARGV){$was=$_;eval$op; - die$@ if$@; rename$was,$_ unless$was eq $_}' - -e syntax OK - $op = shift @ARGV || die("usage: $0 code [...]"); - chomp(@ARGV = ) unless @ARGV; - foreach $_ (@ARGV) { - $was = $_; - eval $op; - die $@ if $@; - rename $was, $_ unless $was eq $_; - } - -The decompiler has several options for the code it generates. For -instance, you can set the size of each indent from 4 (as above) to -2 with: - - $ perl -MO=Deparse,-si2 myperlprogram - -The B<-p> option adds parentheses where normally they are omitted: - - $ perl -MO=Deparse -e 'print "Hello, world\n"' - -e syntax OK - print "Hello, world\n"; - $ perl -MO=Deparse,-p -e 'print "Hello, world\n"' - -e syntax OK - print("Hello, world\n"); - -See L for more information on the formatting options. - -=head2 The Lint Back End - -The lint back end (B::Lint) inspects programs for poor style. One -programmer's bad style is another programmer's useful tool, so options -let you select what is complained about. - -To run the style checker across your source code: - - $ perl -MO=Lint myperlprogram - -To disable context checks and undefined subroutines: - - $ perl -MO=Lint,-context,-undefined-subs myperlprogram - -See L for information on the options. - -=head2 The Simple C Back End - -This module saves the internal compiled state of your Perl program -to a C source file, which can be turned into a native executable -for that particular platform using a C compiler. The resulting -program links against the Perl interpreter library, so it -will not save you disk space (unless you build Perl with a shared -library) or program size. It may, however, save you startup time. - -The C tool generates such executables by default. - - perlcc myperlprogram.pl - -=head2 The Bytecode Back End - -This back end is only useful if you also have a way to load and -execute the bytecode that it produces. The ByteLoader module provides -this functionality. - -To turn a Perl program into executable byte code, you can use C -with the C<-b> switch: - - perlcc -b myperlprogram.pl - -The byte code is machine independent, so once you have a compiled -module or program, it is as portable as Perl source (assuming that -the user of the module or program has a modern-enough Perl interpreter -to decode the byte code). - -See B for information on options to control the -optimization and nature of the code generated by the Bytecode module. - -=head2 The Optimized C Back End - -The optimized C back end will turn your Perl program's run time -code-path into an equivalent (but optimized) C program that manipulates -the Perl data structures directly. The program will still link against -the Perl interpreter library, to allow for eval(), C, -C, etc. - -The C tool generates such executables when using the -opt -switch. To compile a Perl program (ending in C<.pl> -or C<.p>): - - perlcc -opt myperlprogram.pl - -To produce a shared library from a Perl module (ending in C<.pm>): - - perlcc -opt Myperlmodule.pm - -For more information, see L and L. - -=over 4 - -=item B - -This module is the introspective ("reflective" in Java terms) -module, which allows a Perl program to inspect its innards. The -back end modules all use this module to gain access to the compiled -parse tree. You, the user of a back end module, will not need to -interact with B. - -=item O - -This module is the front-end to the compiler's back ends. Normally -called something like this: - - $ perl -MO=Deparse myperlprogram - -This is like saying C in your Perl program. - -=item B::Asmdata - -This module is used by the B::Assembler module, which is in turn used -by the B::Bytecode module, which stores a parse-tree as -bytecode for later loading. It's not a back end itself, but rather a -component of a back end. - -=item B::Assembler - -This module turns a parse-tree into data suitable for storing -and later decoding back into a parse-tree. It's not a back end -itself, but rather a component of a back end. It's used by the -I program that produces bytecode. - -=item B::Bblock - -This module is used by the B::CC back end. It walks "basic blocks". -A basic block is a series of operations which is known to execute from -start to finish, with no possibility of branching or halting. - -=item B::Bytecode - -This module is a back end that generates bytecode from a -program's parse tree. This bytecode is written to a file, from where -it can later be reconstructed back into a parse tree. The goal is to -do the expensive program compilation once, save the interpreter's -state into a file, and then restore the state from the file when the -program is to be executed. See L -for details about usage. - -=item B::C - -This module writes out C code corresponding to the parse tree and -other interpreter internal structures. You compile the corresponding -C file, and get an executable file that will restore the internal -structures and the Perl interpreter will begin running the -program. See L for details about usage. - -=item B::CC - -This module writes out C code corresponding to your program's -operations. Unlike the B::C module, which merely stores the -interpreter and its state in a C program, the B::CC module makes a -C program that does not involve the interpreter. As a consequence, -programs translated into C by B::CC can execute faster than normal -interpreted programs. See L for -details about usage. - -=item B::Debug - -This module dumps the Perl parse tree in verbose detail to STDOUT. -It's useful for people who are writing their own back end, or who -are learning about the Perl internals. It's not useful to the -average programmer. - -=item B::Deparse - -This module produces Perl source code from the compiled parse tree. -It is useful in debugging and deconstructing other people's code, -also as a pretty-printer for your own source. See -L for details about usage. - -=item B::Disassembler - -This module turns bytecode back into a parse tree. It's not a back -end itself, but rather a component of a back end. It's used by the -I program that comes with the bytecode. - -=item B::Lint - -This module inspects the compiled form of your source code for things -which, while some people frown on them, aren't necessarily bad enough -to justify a warning. For instance, use of an array in scalar context -without explicitly saying C is something that Lint -can identify. See L for details about usage. - -=item B::Showlex - -This module prints out the my() variables used in a function or a -file. To get a list of the my() variables used in the subroutine -mysub() defined in the file myperlprogram: - - $ perl -MO=Showlex,mysub myperlprogram - -To get a list of the my() variables used in the file myperlprogram: - - $ perl -MO=Showlex myperlprogram - -[BROKEN] - -=item B::Stackobj - -This module is used by the B::CC module. It's not a back end itself, -but rather a component of a back end. - -=item B::Stash - -This module is used by the L program, which compiles a module -into an executable. B::Stash prints the symbol tables in use by a -program, and is used to prevent B::CC from producing C code for the -B::* and O modules. It's not a back end itself, but rather a -component of a back end. - -=item B::Terse - -This module prints the contents of the parse tree, but without as much -information as B::Debug. For comparison, C -produced 96 lines of output from B::Debug, but only 6 from B::Terse. - -This module is useful for people who are writing their own back end, -or who are learning about the Perl internals. It's not useful to the -average programmer. - -=item B::Xref - -This module prints a report on where the variables, subroutines, and -formats are defined and used within a program and the modules it -loads. See L for details about -usage. - -=back - -=head1 KNOWN PROBLEMS - -The simple C backend currently only saves typeglobs with alphanumeric -names. - -The optimized C backend outputs code for more modules than it should -(e.g., DirHandle). It also has little hope of properly handling -C outside the running subroutine (C is okay). -C currently does not work at all in this backend. -It also creates a huge initialization function that gives -C compilers headaches. Splitting the initialization function gives -better results. Other problems include: unsigned math does not -work correctly; some opcodes are handled incorrectly by default -opcode handling mechanism. - -BEGIN{} blocks are executed while compiling your code. Any external -state that is initialized in BEGIN{}, such as opening files, initiating -database connections etc., do not behave properly. To work around -this, Perl has an INIT{} block that corresponds to code being executed -before your program begins running but after your program has finished -being compiled. Execution order: BEGIN{}, (possible save of state -through compiler back-end), INIT{}, program runs, END{}. - -=head1 AUTHOR - -This document was originally written by Nathan Torkington, and is now -maintained by the perl5-porters mailing list -I. - -=cut diff --git a/lib/perl5/5.6.1/pods/perlcygwin.pod b/lib/perl5/5.6.1/pods/perlcygwin.pod deleted file mode 100644 index 6264a157..00000000 --- a/lib/perl5/5.6.1/pods/perlcygwin.pod +++ /dev/null @@ -1,592 +0,0 @@ -If you read this file _as_is_, just ignore the funny characters you -see. It is written in the POD format (see pod/perlpod.pod) which is -specially designed to be readable as is. - -=head1 NAME - -README.cygwin - Perl for Cygwin - -=head1 SYNOPSIS - -This document will help you configure, make, test and install Perl -on Cygwin. This document also describes features of Cygwin that will -affect how Perl behaves at runtime. - -B There are pre-built Perl packages available for Cygwin and a -version of Perl is provided on the Cygwin CD. If you do not need to -customize the configuration, consider using one of these packages: - - http://cygutils.netpedia.net/ - -=head1 PREREQUISITES - -=head2 Cygwin = GNU+Cygnus+Windows (Don't leave UNIX without it) - -The Cygwin tools are ports of the popular GNU development tools for Win32 -platforms. They run thanks to the Cygwin library which provides the UNIX -system calls and environment these programs expect. More information -about this project can be found at: - - http://www.cygwin.com/ - -A recent net or commercial release of Cygwin is required. - -At the time this document was last updated, Cygwin 1.1.5 was current. - -B At this point, minimal effort has been made to provide -compatibility with old (beta) Cygwin releases. The focus has been to -provide a high quality release and not worry about working around old -bugs. If you wish to use Perl with Cygwin B20.1 or earlier, consider -using perl5.005_03, which is available in source and binary form at -C. If there is significant demand, -a patch kit can be developed to port back to earlier Cygwin versions. - -=head2 Cygwin Configuration - -While building Perl some changes may be necessary to your Cygwin setup so -that Perl builds cleanly. These changes are B required for normal -Perl usage. - -B The binaries that are built will run on all Win32 versions. -They do not depend on your host system (Win9x/WinME, WinNT/Win2K) -or your Cygwin configuration (I, I, binary/text mounts). -The only dependencies come from hard-coded pathnames like C. -However, your host system and Cygwin configuration will affect Perl's -runtime behavior (see L). - -=over 4 - -=item * C - -Set the C environment variable so that Configure finds the Cygwin -versions of programs. Any Windows directories should be removed or -moved to the end of your C. - -=item * I - -If you do not have I (which is part of the I package), -Configure will B prompt you to install I pages. - -=item * Permissions - -On WinNT with either the I or I C settings, directory -and file permissions may not be set correctly. Since the build process -creates directories and files, to be safe you may want to run a `C' on the entire Perl source tree. - -Also, it is a well known WinNT "feature" that files created by a login -that is a member of the I group will be owned by the -I group. Depending on your umask, you may find that you -can not write to files that you just created (because you are no longer -the owner). When using the I C setting, this is not an -issue because it "corrects" the ownership to what you would expect on -a UNIX system. - -=back - -=head1 CONFIGURE - -The default options gathered by Configure with the assistance of -F will build a Perl that supports dynamic loading -(which requires a shared F). - -This will run Configure and keep a record: - - ./Configure 2>&1 | tee log.configure - -If you are willing to accept all the defaults run Configure with B<-de>. -However, several useful customizations are available. - -=head2 Strip Binaries - -It is possible to strip the EXEs and DLLs created by the build process. -The resulting binaries will be significantly smaller. If you want the -binaries to be stripped, you can either add a B<-s> option when Configure -prompts you, - - Any additional ld flags (NOT including libraries)? [none] -s - Any special flags to pass to gcc to use dynamic linking? [none] -s - Any special flags to pass to ld2 to create a dynamically loaded library? - [none] -s - -or you can edit F and uncomment the relevant variables -near the end of the file. - -=head2 Optional Libraries - -Several Perl functions and modules depend on the existence of -some optional libraries. Configure will find them if they are -installed in one of the directories listed as being used for library -searches. Pre-built packages for most of these are available at -C. - -=over 4 - -=item * C<-lcrypt> - -The crypt package distributed with Cygwin is a Linux compatible 56-bit -DES crypt port by Corinna Vinschen. - -Alternatively, the crypt libraries in GNU libc have been ported to Cygwin. - -The DES based Ultra Fast Crypt port was done by Alexey Truhan: - - ftp://ftp.franken.de/pub/win32/develop/gnuwin32/cygwin/porters/Okhapkin_Sergey/cw32crypt-dist-0.tgz - -NOTE: There are various export restrictions on DES implementations, -see the glibc README for more details. - -The MD5 port was done by Andy Piper: - - ftp://ftp.franken.de/pub/win32/develop/gnuwin32/cygwin/porters/Okhapkin_Sergey/libcrypt.tgz - -=item * C<-lgdbm> (C) - -GDBM is available for Cygwin. GDBM's ndbm/dbm compatibility feature -also makes C and C possible (although they add -little extra value). - -NOTE: The ndbm/dbm emulations only completely work on NTFS partitions. - -=item * C<-ldb> (C) - -BerkeleyDB is available for Cygwin. Some details can be found in -F. - -NOTE: The BerkeleyDB library only completely works on NTFS partitions. - -=item * C<-lcygipc> (C) - -A port of SysV IPC is available for Cygwin. - -NOTE: This has B been extensively tested. In particular, -C is undefined because it fails a Configure test -and on Win9x the I functions seem to hang. It also creates -a compile time dependency because F includes F<> -and F<> (which will be required in the future when compiling -CPAN modules). - -=back - -=head2 Configure-time Options - -The F document describes several Configure-time options. Some of -these will work with Cygwin, others are not yet possible. Also, some of -these are experimental. You can either select an option when Configure -prompts you or you can define (undefine) symbols on the command line. - -=over 4 - -=item * C<-Uusedl> - -Undefining this symbol forces Perl to be compiled statically. - -=item * C<-Uusemymalloc> - -By default Perl uses the malloc() included with the Perl source. If you -want to force Perl to build with the system malloc() undefine this symbol. - -=item * C<-Dusemultiplicity> - -Multiplicity is required when embedding Perl in a C program and using -more than one interpreter instance. This works with the Cygwin port. - -=item * C<-Duseperlio> - -The PerlIO abstraction works with the Cygwin port. - -=item * C<-Duse64bitint> - -I supports 64-bit integers. However, several additional long long -functions are necessary to use them within Perl (I<{strtol,strtoul}l>). -These are B yet available with Cygwin. - -=item * C<-Duselongdouble> - -I supports long doubles (12 bytes). However, several additional -long double math functions are necessary to use them within Perl -(I<{atan2,cos,exp,floor,fmod,frexp,isnan,log,modf,pow,sin,sqrt}l,strtold>). -These are B yet available with Cygwin. - -=item * C<-Dusethreads> - -POSIX threads are B yet implemented in Cygwin. - -=item * C<-Duselargefiles> - -Although Win32 supports large files, Cygwin currently uses 32-bit integers -for internal size and position calculations. - -=back - -=head2 Suspicious Warnings - -You may see some messages during Configure that seem suspicious. - -=over 4 - -=item * I - -I is needed to build dynamic libraries, but it does not exist -when dlsym() checking occurs (it is not created until `C' runs). -You will see the following message: - - Checking whether your dlsym() needs a leading underscore ... - ld2: not found - I can't compile and run the test program. - I'm guessing that dlsym doesn't need a leading underscore. - -Since the guess is correct, this is not a problem. - -=item * Win9x and C - -Win9x does not correctly report C with a non-blocking read on a -closed pipe. You will see the following messages: - - But it also returns -1 to signal EOF, so be careful! - WARNING: you can't distinguish between EOF and no data! - - *** WHOA THERE!!! *** - The recommended value for $d_eofnblk on this machine was "define"! - Keep the recommended value? [y] - -At least for consistency with WinNT, you should keep the recommended -value. - -=item * Compiler/Preprocessor defines - -The following error occurs because of the Cygwin C<#define> of -C<_LONG_DOUBLE>: - - Guessing which symbols your C compiler and preprocessor define... - try.c:: parse error - -This failure does not seem to cause any problems. - -=back - -=head1 MAKE - -Simply run I and wait: - - make 2>&1 | tee log.make - -=head2 Warnings - -Warnings like these are normal: - - warning: overriding commands for target - warning: ignoring old commands for target - - dllwrap: no export definition file provided - dllwrap: creating one, but that may not be what you want - -=head2 ld2 - -During `C', I will be created and installed in your $installbin -directory (where you said to put public executables). It does not -wait until the `C' process to install the I script, -this is because the remainder of the `C' refers to I without -fully specifying its path and does this from multiple subdirectories. -The assumption is that $installbin is in your current C. If this -is not the case `C' will fail at some point. If this happens, -just manually copy I from the source directory to somewhere in -your C. - -=head1 TEST - -There are two steps to running the test suite: - - make test 2>&1 | tee log.make-test - - cd t;./perl harness 2>&1 | tee ../log.harness - -The same tests are run both times, but more information is provided when -running as `C<./perl harness>'. - -Test results vary depending on your host system and your Cygwin -configuration. If a test can pass in some Cygwin setup, it is always -attempted and explainable test failures are documented. It is possible -for Perl to pass all the tests, but it is more likely that some tests -will fail for one of the reasons listed below. - -=head2 File Permissions - -UNIX file permissions are based on sets of mode bits for -{read,write,execute} for each {user,group,other}. By default Cygwin -only tracks the Win32 read-only attribute represented as the UNIX file -user write bit (files are always readable, files are executable if they -have a F<.{com,bat,exe}> extension or begin with C<#!>, directories are -always readable and executable). On WinNT with the I C -setting, the additional mode bits are stored as extended file attributes. -On WinNT with the I C setting, permissions use the standard -WinNT security descriptors and access control lists. Without one of -these options, these tests will fail: - - Failed Test List of failed - ------------------------------------ - io/fs.t 5, 7, 9-10 - lib/anydbm.t 2 - lib/db-btree.t 20 - lib/db-hash.t 16 - lib/db-recno.t 18 - lib/gdbm.t 2 - lib/ndbm.t 2 - lib/odbm.t 2 - lib/sdbm.t 2 - op/stat.t 9, 20 (.tmp not an executable extension) - -=head2 Hard Links - -FAT partitions do not support hard links (whereas NTFS does), in which -case Cygwin implements link() by copying the file. On remote (network) -drives Cygwin's stat() always sets C to 1, so the link count -for remote directories and files is not available. In either case, -these tests will fail: - - Failed Test List of failed - ------------------------------------ - io/fs.t 4 - op/stat.t 3 - -=head2 Filetime Granularity - -On FAT partitions the filetime granularity is 2 seconds. The following -test will fail: - - Failed Test List of failed - ------------------------------------ - io/fs.t 18 - -=head2 Tainting Checks - -When Perl is running in taint mode, C<$ENV{PATH}> is considered tainted -and not used, so DLLs not in the default system directories will not -be found. While the tests are running you will see warnings popup from -the system with messages like: - - Win9x - Error Starting Program - A required .DLL file, CYGWIN1.DLL, was not found - - WinNT - perl.exe - Unable to Locate DLL - The dynamic link library cygwin1.dll could not be found in the - specified path ... - -Just click OK and ignore them. When running `C', 2 popups -occur. During `C<./perl harness>', 4 popups occur. Also, these tests -will fail: - - Failed Test List of failed - ------------------------------------ - op/taint.t 1, 3, 31, 37 - -Alternatively, you can copy F into the directory where the -tests run: - - cp /bin/cygwin1.dll t - -or one of the Windows system directories (although, this is B -recommended). - -=head2 /etc/group - -Cygwin does not require F, in which case the F -test will be skipped. The check performed by F expects to -see entries that use the members field, otherwise this test will fail: - - Failed Test List of failed - ------------------------------------ - op/grent.t 1 - -=head2 Script Portability - -Cygwin does an outstanding job of providing UNIX-like semantics on top of -Win32 systems. However, in addition to the items noted above, there are -some differences that you should know about. This is a very brief guide -to portability, more information can be found in the Cygwin documentation. - -=over 4 - -=item * Pathnames - -Cygwin pathnames can be separated by forward (F) or backward (F<\>) -slashes. They may also begin with drive letters (F) or Universal -Naming Codes (F). DOS device names (F, F, F, -F, F, F) are invalid as base filenames. However, they -can be used in extensions (e.g., F). Names may contain all -printable characters except these: - - : * ? " < > | - -File names are case insensitive, but case preserving. A pathname that -contains a backslash or drive letter is a Win32 pathname (and not subject -to the translations applied to POSIX style pathnames). - -=item * Text/Binary - -When a file is opened it is in either text or binary mode. In text mode -a file is subject to CR/LF/Ctrl-Z translations. With Cygwin, the default -mode for an open() is determined by the mode of the mount that underlies -the file. Perl provides a binmode() function to set binary mode on files -that otherwise would be treated as text. sysopen() with the C -flag sets text mode on files that otherwise would be treated as binary: - - sysopen(FOO, "bar", O_WRONLY|O_CREAT|O_TEXT) - -lseek(), tell() and sysseek() only work with files opened in binary mode. - -The text/binary issue is covered at length in the Cygwin documentation. - -=item * F<.exe> - -The Cygwin stat(), lstat() and readlink() functions make the F<.exe> -extension transparent by looking for F when you ask for F -(unless a F also exists). Cygwin does not require a F<.exe> -extension, but I adds it automatically when building a program. -However, when accessing an executable as a normal file (e.g., I -in a makefile) the F<.exe> is not transparent. The I included -with Cygwin automatically appends a F<.exe> when necessary. - -=item * chown() - -On WinNT chown() can change a file's user and group IDs. On Win9x chown() -is a no-op, although this is appropriate since there is no security model. - -=item * Miscellaneous - -File locking using the C command to fcntl() is a stub that -returns C. - -Win9x can not rename() an open file (although WinNT can). - -The Cygwin chroot() implementation has holes (it can not restrict file -access by native Win32 programs). - -=back - -=head1 INSTALL - -This will install Perl, including I pages. - - make install | tee log.make-install - -NOTE: If C is redirected `C' will B prompt -you to install I into F. - -You may need to be I to run `C'. If you -are not, you must have write access to the directories in question. - -Information on installing the Perl documentation in HTML format can be -found in the F document. - -=head1 MANIFEST - -These are the files in the Perl release that contain references to Cygwin. -These very brief notes attempt to explain the reason for all conditional -code. Hopefully, keeping this up to date will allow the Cygwin port to -be kept as clean as possible. - -=over 4 - -=item Documentation - - INSTALL README.cygwin README.win32 MANIFEST - Changes Changes5.005 Changes5.004 Changes5.6 - pod/perl.pod pod/perlport.pod pod/perlfaq3.pod - pod/perldelta.pod pod/perl5004delta.pod pod/perl56delta.pod - pod/perlhist.pod pod/perlmodlib.pod pod/buildtoc.PL pod/perltoc.pod - -=item Build, Configure, Make, Install - - cygwin/Makefile.SHs - cygwin/ld2.in - cygwin/perlld.in - ext/IPC/SysV/hints/cygwin.pl - ext/NDBM_File/hints/cygwin.pl - ext/ODBM_File/hints/cygwin.pl - hints/cygwin.sh - Configure - help finding hints from uname, - shared libperl required for dynamic loading - Makefile.SH - linklibperl - Porting/patchls - cygwin in port list - installman - man pages with :: translated to . - installperl - install dll/ld2/perlld, install to pods - makedepend.SH - uwinfix - -=item Tests - - t/io/tell.t - binmode - t/lib/b.t - ignore Cwd from os_extras - t/lib/glob-basic.t - Win32 directory list access differs from read mode - t/op/magic.t - $^X/symlink WORKAROUND, s/.exe// - t/op/stat.t - no /dev, skip Win32 ftCreationTime quirk - (cache manager sometimes preserves ctime of file - previously created and deleted), no -u (setuid) - -=item Compiled Perl Source - - EXTERN.h - __declspec(dllimport) - XSUB.h - __declspec(dllexport) - cygwin/cygwin.c - os_extras (getcwd, spawn) - perl.c - os_extras - perl.h - binmode - doio.c - win9x can not rename a file when it is open - pp_sys.c - do not define h_errno, pp_system with spawn - util.c - use setenv - -=item Compiled Module Source - - ext/POSIX/POSIX.xs - tzname defined externally - ext/SDBM_File/sdbm/pair.c - - EXTCONST needs to be redefined from EXTERN.h - ext/SDBM_File/sdbm/sdbm.c - - binary open - -=item Perl Modules/Scripts - - lib/Cwd.pm - hook to internal Cwd::cwd - lib/ExtUtils/MakeMaker.pm - - require MM_Cygwin.pm - lib/ExtUtils/MM_Cygwin.pm - - canonpath, cflags, manifypods, perl_archive - lib/File/Find.pm - on remote drives stat() always sets st_nlink to 1 - lib/File/Spec/Unix.pm - preserve //unc - lib/File/Temp.pm - no directory sticky bit - lib/perl5db.pl - use stdin not /dev/tty - utils/perldoc.PL - version comment - -=back - -=head1 BUGS - -When I starts, it warns about overriding commands for F. - -`C' does not remove library F<.def> or F<.exe.stackdump> -files. - -The I script contains references to the source directory. You should -change these to $installbin after `C'. - -Support for swapping real and effective user and group IDs is incomplete. -On WinNT Cygwin provides setuid(), seteuid(), setgid() and setegid(). -However, additional Cygwin calls for manipulating WinNT access tokens -and security contexts are required. - -When building DLLs, `C' is used to export -global symbols. It might be better to generate an explicit F<.def> file -(see F). Also, DLLs can now be build with `C'. - -=head1 AUTHORS - -Charles Wilson , -Eric Fifer , -alexander smishlajev , -Steven Morlock , -Sebastien Barre , -Teun Burgers . - -=head1 HISTORY - -Last updated: 9 November 2000 diff --git a/lib/perl5/5.6.1/pods/perldata.pod b/lib/perl5/5.6.1/pods/perldata.pod deleted file mode 100644 index 315f716e..00000000 --- a/lib/perl5/5.6.1/pods/perldata.pod +++ /dev/null @@ -1,829 +0,0 @@ -=head1 NAME - -perldata - Perl data types - -=head1 DESCRIPTION - -=head2 Variable names - -Perl has three built-in data types: scalars, arrays of scalars, and -associative arrays of scalars, known as "hashes". Normal arrays -are ordered lists of scalars indexed by number, starting with 0 and with -negative subscripts counting from the end. Hashes are unordered -collections of scalar values indexed by their associated string key. - -Values are usually referred to by name, or through a named reference. -The first character of the name tells you to what sort of data -structure it refers. The rest of the name tells you the particular -value to which it refers. Usually this name is a single I, -that is, a string beginning with a letter or underscore, and -containing letters, underscores, and digits. In some cases, it may -be a chain of identifiers, separated by C<::> (or by the slightly -archaic C<'>); all but the last are interpreted as names of packages, -to locate the namespace in which to look up the final identifier -(see L for details). It's possible to substitute -for a simple identifier, an expression that produces a reference -to the value at runtime. This is described in more detail below -and in L. - -Perl also has its own built-in variables whose names don't follow -these rules. They have strange names so they don't accidentally -collide with one of your normal variables. Strings that match -parenthesized parts of a regular expression are saved under names -containing only digits after the C<$> (see L and L). -In addition, several special variables that provide windows into -the inner working of Perl have names containing punctuation characters -and control characters. These are documented in L. - -Scalar values are always named with '$', even when referring to a -scalar that is part of an array or a hash. The '$' symbol works -semantically like the English word "the" in that it indicates a -single value is expected. - - $days # the simple scalar value "days" - $days[28] # the 29th element of array @days - $days{'Feb'} # the 'Feb' value from hash %days - $#days # the last index of array @days - -Entire arrays (and slices of arrays and hashes) are denoted by '@', -which works much like the word "these" or "those" does in English, -in that it indicates multiple values are expected. - - @days # ($days[0], $days[1],... $days[n]) - @days[3,4,5] # same as ($days[3],$days[4],$days[5]) - @days{'a','c'} # same as ($days{'a'},$days{'c'}) - -Entire hashes are denoted by '%': - - %days # (key1, val1, key2, val2 ...) - -In addition, subroutines are named with an initial '&', though this -is optional when unambiguous, just as the word "do" is often redundant -in English. Symbol table entries can be named with an initial '*', -but you don't really care about that yet (if ever :-). - -Every variable type has its own namespace, as do several -non-variable identifiers. This means that you can, without fear -of conflict, use the same name for a scalar variable, an array, or -a hash--or, for that matter, for a filehandle, a directory handle, a -subroutine name, a format name, or a label. This means that $foo -and @foo are two different variables. It also means that C<$foo[1]> -is a part of @foo, not a part of $foo. This may seem a bit weird, -but that's okay, because it is weird. - -Because variable references always start with '$', '@', or '%', the -"reserved" words aren't in fact reserved with respect to variable -names. They I reserved with respect to labels and filehandles, -however, which don't have an initial special character. You can't -have a filehandle named "log", for instance. Hint: you could say -C rather than C. Using -uppercase filehandles also improves readability and protects you -from conflict with future reserved words. Case I significant--"FOO", -"Foo", and "foo" are all different names. Names that start with a -letter or underscore may also contain digits and underscores. - -It is possible to replace such an alphanumeric name with an expression -that returns a reference to the appropriate type. For a description -of this, see L. - -Names that start with a digit may contain only more digits. Names -that do not start with a letter, underscore, or digit are limited to -one character, e.g., C<$%> or C<$$>. (Most of these one character names -have a predefined significance to Perl. For instance, C<$$> is the -current process id.) - -=head2 Context - -The interpretation of operations and values in Perl sometimes depends -on the requirements of the context around the operation or value. -There are two major contexts: list and scalar. Certain operations -return list values in contexts wanting a list, and scalar values -otherwise. If this is true of an operation it will be mentioned in -the documentation for that operation. In other words, Perl overloads -certain operations based on whether the expected return value is -singular or plural. Some words in English work this way, like "fish" -and "sheep". - -In a reciprocal fashion, an operation provides either a scalar or a -list context to each of its arguments. For example, if you say - - int( ) - -the integer operation provides scalar context for the <> -operator, which responds by reading one line from STDIN and passing it -back to the integer operation, which will then find the integer value -of that line and return that. If, on the other hand, you say - - sort( ) - -then the sort operation provides list context for <>, which -will proceed to read every line available up to the end of file, and -pass that list of lines back to the sort routine, which will then -sort those lines and return them as a list to whatever the context -of the sort was. - -Assignment is a little bit special in that it uses its left argument -to determine the context for the right argument. Assignment to a -scalar evaluates the right-hand side in scalar context, while -assignment to an array or hash evaluates the righthand side in list -context. Assignment to a list (or slice, which is just a list -anyway) also evaluates the righthand side in list context. - -When you use the C pragma or Perl's B<-w> command-line -option, you may see warnings -about useless uses of constants or functions in "void context". -Void context just means the value has been discarded, such as a -statement containing only C<"fred";> or C. It still -counts as scalar context for functions that care whether or not -they're being called in list context. - -User-defined subroutines may choose to care whether they are being -called in a void, scalar, or list context. Most subroutines do not -need to bother, though. That's because both scalars and lists are -automatically interpolated into lists. See L -for how you would dynamically discern your function's calling -context. - -=head2 Scalar values - -All data in Perl is a scalar, an array of scalars, or a hash of -scalars. A scalar may contain one single value in any of three -different flavors: a number, a string, or a reference. In general, -conversion from one form to another is transparent. Although a -scalar may not directly hold multiple values, it may contain a -reference to an array or hash which in turn contains multiple values. - -Scalars aren't necessarily one thing or another. There's no place -to declare a scalar variable to be of type "string", type "number", -type "reference", or anything else. Because of the automatic -conversion of scalars, operations that return scalars don't need -to care (and in fact, cannot care) whether their caller is looking -for a string, a number, or a reference. Perl is a contextually -polymorphic language whose scalars can be strings, numbers, or -references (which includes objects). Although strings and numbers -are considered pretty much the same thing for nearly all purposes, -references are strongly-typed, uncastable pointers with builtin -reference-counting and destructor invocation. - -A scalar value is interpreted as TRUE in the Boolean sense if it is not -the null string or the number 0 (or its string equivalent, "0"). The -Boolean context is just a special kind of scalar context where no -conversion to a string or a number is ever performed. - -There are actually two varieties of null strings (sometimes referred -to as "empty" strings), a defined one and an undefined one. The -defined version is just a string of length zero, such as C<"">. -The undefined version is the value that indicates that there is -no real value for something, such as when there was an error, or -at end of file, or when you refer to an uninitialized variable or -element of an array or hash. Although in early versions of Perl, -an undefined scalar could become defined when first used in a -place expecting a defined value, this no longer happens except for -rare cases of autovivification as explained in L. You can -use the defined() operator to determine whether a scalar value is -defined (this has no meaning on arrays or hashes), and the undef() -operator to produce an undefined value. - -To find out whether a given string is a valid non-zero number, it's -sometimes enough to test it against both numeric 0 and also lexical -"0" (although this will cause B<-w> noises). That's because strings -that aren't numbers count as 0, just as they do in B: - - if ($str == 0 && $str ne "0") { - warn "That doesn't look like a number"; - } - -That method may be best because otherwise you won't treat IEEE -notations like C or C properly. At other times, you -might prefer to determine whether string data can be used numerically -by calling the POSIX::strtod() function or by inspecting your string -with a regular expression (as documented in L). - - warn "has nondigits" if /\D/; - warn "not a natural number" unless /^\d+$/; # rejects -3 - warn "not an integer" unless /^-?\d+$/; # rejects +3 - warn "not an integer" unless /^[+-]?\d+$/; - warn "not a decimal number" unless /^-?\d+\.?\d*$/; # rejects .2 - warn "not a decimal number" unless /^-?(?:\d+(?:\.\d*)?|\.\d+)$/; - warn "not a C float" - unless /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/; - -The length of an array is a scalar value. You may find the length -of array @days by evaluating C<$#days>, as in B. However, this -isn't the length of the array; it's the subscript of the last element, -which is a different value since there is ordinarily a 0th element. -Assigning to C<$#days> actually changes the length of the array. -Shortening an array this way destroys intervening values. Lengthening -an array that was previously shortened does not recover values -that were in those elements. (It used to do so in Perl 4, but we -had to break this to make sure destructors were called when expected.) - -You can also gain some miniscule measure of efficiency by pre-extending -an array that is going to get big. You can also extend an array -by assigning to an element that is off the end of the array. You -can truncate an array down to nothing by assigning the null list -() to it. The following are equivalent: - - @whatever = (); - $#whatever = -1; - -If you evaluate an array in scalar context, it returns the length -of the array. (Note that this is not true of lists, which return -the last value, like the C comma operator, nor of built-in functions, -which return whatever they feel like returning.) The following is -always true: - - scalar(@whatever) == $#whatever - $[ + 1; - -Version 5 of Perl changed the semantics of C<$[>: files that don't set -the value of C<$[> no longer need to worry about whether another -file changed its value. (In other words, use of C<$[> is deprecated.) -So in general you can assume that - - scalar(@whatever) == $#whatever + 1; - -Some programmers choose to use an explicit conversion so as to -leave nothing to doubt: - - $element_count = scalar(@whatever); - -If you evaluate a hash in scalar context, it returns false if the -hash is empty. If there are any key/value pairs, it returns true; -more precisely, the value returned is a string consisting of the -number of used buckets and the number of allocated buckets, separated -by a slash. This is pretty much useful only to find out whether -Perl's internal hashing algorithm is performing poorly on your data -set. For example, you stick 10,000 things in a hash, but evaluating -%HASH in scalar context reveals C<"1/16">, which means only one out -of sixteen buckets has been touched, and presumably contains all -10,000 of your items. This isn't supposed to happen. - -You can preallocate space for a hash by assigning to the keys() function. -This rounds up the allocated buckets to the next power of two: - - keys(%users) = 1000; # allocate 1024 buckets - -=head2 Scalar value constructors - -Numeric literals are specified in any of the following floating point or -integer formats: - - 12345 - 12345.67 - .23E-10 # a very small number - 4_294_967_296 # underline for legibility - 0xff # hex - 0377 # octal - 0b011011 # binary - -String literals are usually delimited by either single or double -quotes. They work much like quotes in the standard Unix shells: -double-quoted string literals are subject to backslash and variable -substitution; single-quoted strings are not (except for C<\'> and -C<\\>). The usual C-style backslash rules apply for making -characters such as newline, tab, etc., as well as some more exotic -forms. See L for a list. - -Hexadecimal, octal, or binary, representations in string literals -(e.g. '0xff') are not automatically converted to their integer -representation. The hex() and oct() functions make these conversions -for you. See L and L for more details. - -You can also embed newlines directly in your strings, i.e., they can end -on a different line than they begin. This is nice, but if you forget -your trailing quote, the error will not be reported until Perl finds -another line containing the quote character, which may be much further -on in the script. Variable substitution inside strings is limited to -scalar variables, arrays, and array or hash slices. (In other words, -names beginning with $ or @, followed by an optional bracketed -expression as a subscript.) The following code segment prints out "The -price is $Z<>100." - - $Price = '$100'; # not interpreted - print "The price is $Price.\n"; # interpreted - -As in some shells, you can enclose the variable name in braces to -disambiguate it from following alphanumerics (and underscores). -You must also do -this when interpolating a variable into a string to separate the -variable name from a following double-colon or an apostrophe, since -these would be otherwise treated as a package separator: - - $who = "Larry"; - print PASSWD "${who}::0:0:Superuser:/:/bin/perl\n"; - print "We use ${who}speak when ${who}'s here.\n"; - -Without the braces, Perl would have looked for a $whospeak, a -C<$who::0>, and a C<$who's> variable. The last two would be the -$0 and the $s variables in the (presumably) non-existent package -C. - -In fact, an identifier within such curlies is forced to be a string, -as is any simple identifier within a hash subscript. Neither need -quoting. Our earlier example, C<$days{'Feb'}> can be written as -C<$days{Feb}> and the quotes will be assumed automatically. But -anything more complicated in the subscript will be interpreted as -an expression. - -A literal of the form C is parsed as a string composed -of characters with the specified ordinals. This provides an alternative, -more readable way to construct strings, rather than use the somewhat less -readable interpolation form C<"\x{1}\x{14}\x{12c}\x{fa0}">. This is useful -for representing Unicode strings, and for comparing version "numbers" -using the string comparison operators, C, C, C etc. -If there are two or more dots in the literal, the leading C may be -omitted. - - print v9786; # prints UTF-8 encoded SMILEY, "\x{263a}" - print v102.111.111; # prints "foo" - print 102.111.111; # same - -Such literals are accepted by both C and C for -doing a version check. The C<$^V> special variable also contains the -running Perl interpreter's version in this form. See L. - -The special literals __FILE__, __LINE__, and __PACKAGE__ -represent the current filename, line number, and package name at that -point in your program. They may be used only as separate tokens; they -will not be interpolated into strings. If there is no current package -(due to an empty C directive), __PACKAGE__ is the undefined -value. - -The two control characters ^D and ^Z, and the tokens __END__ and __DATA__ -may be used to indicate the logical end of the script before the actual -end of file. Any following text is ignored. - -Text after __DATA__ but may be read via the filehandle C, -where C is the package that was current when the __DATA__ -token was encountered. The filehandle is left open pointing to the -contents after __DATA__. It is the program's responsibility to -C when it is done reading from it. For compatibility with -older scripts written before __DATA__ was introduced, __END__ behaves -like __DATA__ in the toplevel script (but not in files loaded with -C or C) and leaves the remaining contents of the -file accessible via C. - -See L for more description of __DATA__, and -an example of its use. Note that you cannot read from the DATA -filehandle in a BEGIN block: the BEGIN block is executed as soon -as it is seen (during compilation), at which point the corresponding -__DATA__ (or __END__) token has not yet been seen. - -A word that has no other interpretation in the grammar will -be treated as if it were a quoted string. These are known as -"barewords". As with filehandles and labels, a bareword that consists -entirely of lowercase letters risks conflict with future reserved -words, and if you use the C pragma or the B<-w> switch, -Perl will warn you about any -such words. Some people may wish to outlaw barewords entirely. If you -say - - use strict 'subs'; - -then any bareword that would NOT be interpreted as a subroutine call -produces a compile-time error instead. The restriction lasts to the -end of the enclosing block. An inner block may countermand this -by saying C. - -Arrays and slices are interpolated into double-quoted strings -by joining the elements with the delimiter specified in the C<$"> -variable (C<$LIST_SEPARATOR> in English), space by default. The -following are equivalent: - - $temp = join($", @ARGV); - system "echo $temp"; - - system "echo @ARGV"; - -Within search patterns (which also undergo double-quotish substitution) -there is an unfortunate ambiguity: Is C to be interpreted as -C (where C<[bar]> is a character class for the regular -expression) or as C (where C<[bar]> is the subscript to array -@foo)? If @foo doesn't otherwise exist, then it's obviously a -character class. If @foo exists, Perl takes a good guess about C<[bar]>, -and is almost always right. If it does guess wrong, or if you're just -plain paranoid, you can force the correct interpretation with curly -braces as above. - -A line-oriented form of quoting is based on the shell "here-document" -syntax. Following a C<< << >> you specify a string to terminate -the quoted material, and all lines following the current line down to -the terminating string are the value of the item. The terminating -string may be either an identifier (a word), or some quoted text. If -quoted, the type of quotes you use determines the treatment of the -text, just as in regular quoting. An unquoted identifier works like -double quotes. There must be no space between the C<< << >> and -the identifier, unless the identifier is quoted. (If you put a space it -will be treated as a null identifier, which is valid, and matches the first -empty line.) The terminating string must appear by itself (unquoted and -with no surrounding whitespace) on the terminating line. - - print <, -the quoted material must come on the lines following the final delimiter. -So instead of - - s/this/<. - -Additionally, the quoting rules for the identifier are not related to -Perl's quoting rules -- C, C, and the like are not supported -in place of C<''> and C<"">, and the only interpolation is for backslashing -the quoting character: - - print << "abc\"def"; - testing... - abc"def - -Finally, quoted strings cannot span multiple lines. The general rule is -that the identifier must be a string literal. Stick with that, and you -should be safe. - -=head2 List value constructors - -List values are denoted by separating individual values by commas -(and enclosing the list in parentheses where precedence requires it): - - (LIST) - -In a context not requiring a list value, the value of what appears -to be a list literal is simply the value of the final element, as -with the C comma operator. For example, - - @foo = ('cc', '-E', $bar); - -assigns the entire list value to array @foo, but - - $foo = ('cc', '-E', $bar); - -assigns the value of variable $bar to the scalar variable $foo. -Note that the value of an actual array in scalar context is the -length of the array; the following assigns the value 3 to $foo: - - @foo = ('cc', '-E', $bar); - $foo = @foo; # $foo gets 3 - -You may have an optional comma before the closing parenthesis of a -list literal, so that you can say: - - @foo = ( - 1, - 2, - 3, - ); - -To use a here-document to assign an array, one line per element, -you might use an approach like this: - - @sauces = < interpolate, see L. - -The null list is represented by (). Interpolating it in a list -has no effect. Thus ((),(),()) is equivalent to (). Similarly, -interpolating an array with no elements is the same as if no -array had been interpolated at that point. - -This interpolation combines with the facts that the opening -and closing parentheses are optional (except necessary for -precedence) and lists may end with an optional comma to mean that -multiple commas within lists are legal syntax. The list C<1,,3> is a -concatenation of two lists, C<1,> and C<3>, the first of which ends -with that optional comma. C<1,,3> is C<(1,),(3)> is C<1,3> (And -similarly for C<1,,,3> is C<(1,),(,),3> is C<1,3> and so on.) Not that -we'd advise you to use this obfuscation. - -A list value may also be subscripted like a normal array. You must -put the list in parentheses to avoid ambiguity. For example: - - # Stat returns list value. - $time = (stat($file))[8]; - - # SYNTAX ERROR HERE. - $time = stat($file)[8]; # OOPS, FORGOT PARENTHESES - - # Find a hex digit. - $hexdigit = ('a','b','c','d','e','f')[$digit-10]; - - # A "reverse comma operator". - return (pop(@foo),pop(@foo))[0]; - -Lists may be assigned to only when each element of the list -is itself legal to assign to: - - ($a, $b, $c) = (1, 2, 3); - - ($map{'red'}, $map{'blue'}, $map{'green'}) = (0x00f, 0x0f0, 0xf00); - -An exception to this is that you may assign to C in a list. -This is useful for throwing away some of the return values of a -function: - - ($dev, $ino, undef, undef, $uid, $gid) = stat($file); - -List assignment in scalar context returns the number of elements -produced by the expression on the right side of the assignment: - - $x = (($foo,$bar) = (3,2,1)); # set $x to 3, not 2 - $x = (($foo,$bar) = f()); # set $x to f()'s return count - -This is handy when you want to do a list assignment in a Boolean -context, because most list functions return a null list when finished, -which when assigned produces a 0, which is interpreted as FALSE. - -The final element may be an array or a hash: - - ($a, $b, @rest) = split; - my($a, $b, %rest) = @_; - -You can actually put an array or hash anywhere in the list, but the first one -in the list will soak up all the values, and anything after it will become -undefined. This may be useful in a my() or local(). - -A hash can be initialized using a literal list holding pairs of -items to be interpreted as a key and a value: - - # same as map assignment above - %map = ('red',0x00f,'blue',0x0f0,'green',0xf00); - -While literal lists and named arrays are often interchangeable, that's -not the case for hashes. Just because you can subscript a list value like -a normal array does not mean that you can subscript a list value as a -hash. Likewise, hashes included as parts of other lists (including -parameters lists and return lists from functions) always flatten out into -key/value pairs. That's why it's good to use references sometimes. - -It is often more readable to use the C<< => >> operator between key/value -pairs. The C<< => >> operator is mostly just a more visually distinctive -synonym for a comma, but it also arranges for its left-hand operand to be -interpreted as a string--if it's a bareword that would be a legal identifier. -This makes it nice for initializing hashes: - - %map = ( - red => 0x00f, - blue => 0x0f0, - green => 0xf00, - ); - -or for initializing hash references to be used as records: - - $rec = { - witch => 'Mable the Merciless', - cat => 'Fluffy the Ferocious', - date => '10/31/1776', - }; - -or for using call-by-named-parameter to complicated functions: - - $field = $query->radio_group( - name => 'group_name', - values => ['eenie','meenie','minie'], - default => 'meenie', - linebreak => 'true', - labels => \%labels - ); - -Note that just because a hash is initialized in that order doesn't -mean that it comes out in that order. See L for examples -of how to arrange for an output ordering. - -=head2 Slices - -A common way to access an array or a hash is one scalar element at a -time. You can also subscript a list to get a single element from it. - - $whoami = $ENV{"USER"}; # one element from the hash - $parent = $ISA[0]; # one element from the array - $dir = (getpwnam("daemon"))[7]; # likewise, but with list - -A slice accesses several elements of a list, an array, or a hash -simultaneously using a list of subscripts. It's more convenient -than writing out the individual elements as a list of separate -scalar values. - - ($him, $her) = @folks[0,-1]; # array slice - @them = @folks[0 .. 3]; # array slice - ($who, $home) = @ENV{"USER", "HOME"}; # hash slice - ($uid, $dir) = (getpwnam("daemon"))[2,7]; # list slice - -Since you can assign to a list of variables, you can also assign to -an array or hash slice. - - @days[3..5] = qw/Wed Thu Fri/; - @colors{'red','blue','green'} - = (0xff0000, 0x0000ff, 0x00ff00); - @folks[0, -1] = @folks[-1, 0]; - -The previous assignments are exactly equivalent to - - ($days[3], $days[4], $days[5]) = qw/Wed Thu Fri/; - ($colors{'red'}, $colors{'blue'}, $colors{'green'}) - = (0xff0000, 0x0000ff, 0x00ff00); - ($folks[0], $folks[-1]) = ($folks[0], $folks[-1]); - -Since changing a slice changes the original array or hash that it's -slicing, a C construct will alter some--or even all--of the -values of the array or hash. - - foreach (@array[ 4 .. 10 ]) { s/peter/paul/ } - - foreach (@hash{keys %hash}) { - s/^\s+//; # trim leading whitespace - s/\s+$//; # trim trailing whitespace - s/(\w+)/\u\L$1/g; # "titlecase" words - } - -A slice of an empty list is still an empty list. Thus: - - @a = ()[1,0]; # @a has no elements - @b = (@a)[0,1]; # @b has no elements - @c = (0,1)[2,3]; # @c has no elements - -But: - - @a = (1)[1,0]; # @a has two elements - @b = (1,undef)[1,0,2]; # @b has three elements - -This makes it easy to write loops that terminate when a null list -is returned: - - while ( ($home, $user) = (getpwent)[7,0]) { - printf "%-8s %s\n", $user, $home; - } - -As noted earlier in this document, the scalar sense of list assignment -is the number of elements on the right-hand side of the assignment. -The null list contains no elements, so when the password file is -exhausted, the result is 0, not 2. - -If you're confused about why you use an '@' there on a hash slice -instead of a '%', think of it like this. The type of bracket (square -or curly) governs whether it's an array or a hash being looked at. -On the other hand, the leading symbol ('$' or '@') on the array or -hash indicates whether you are getting back a singular value (a -scalar) or a plural one (a list). - -=head2 Typeglobs and Filehandles - -Perl uses an internal type called a I to hold an entire -symbol table entry. The type prefix of a typeglob is a C<*>, because -it represents all types. This used to be the preferred way to -pass arrays and hashes by reference into a function, but now that -we have real references, this is seldom needed. - -The main use of typeglobs in modern Perl is create symbol table aliases. -This assignment: - - *this = *that; - -makes $this an alias for $that, @this an alias for @that, %this an alias -for %that, &this an alias for &that, etc. Much safer is to use a reference. -This: - - local *Here::blue = \$There::green; - -temporarily makes $Here::blue an alias for $There::green, but doesn't -make @Here::blue an alias for @There::green, or %Here::blue an alias for -%There::green, etc. See L for more examples -of this. Strange though this may seem, this is the basis for the whole -module import/export system. - -Another use for typeglobs is to pass filehandles into a function or -to create new filehandles. If you need to use a typeglob to save away -a filehandle, do it this way: - - $fh = *STDOUT; - -or perhaps as a real reference, like this: - - $fh = \*STDOUT; - -See L for examples of using these as indirect filehandles -in functions. - -Typeglobs are also a way to create a local filehandle using the local() -operator. These last until their block is exited, but may be passed back. -For example: - - sub newopen { - my $path = shift; - local *FH; # not my! - open (FH, $path) or return undef; - return *FH; - } - $fh = newopen('/etc/passwd'); - -Now that we have the C<*foo{THING}> notation, typeglobs aren't used as much -for filehandle manipulations, although they're still needed to pass brand -new file and directory handles into or out of functions. That's because -C<*HANDLE{IO}> only works if HANDLE has already been used as a handle. -In other words, C<*FH> must be used to create new symbol table entries; -C<*foo{THING}> cannot. When in doubt, use C<*FH>. - -All functions that are capable of creating filehandles (open(), -opendir(), pipe(), socketpair(), sysopen(), socket(), and accept()) -automatically create an anonymous filehandle if the handle passed to -them is an uninitialized scalar variable. This allows the constructs -such as C and C to be used to -create filehandles that will conveniently be closed automatically when -the scope ends, provided there are no other references to them. This -largely eliminates the need for typeglobs when opening filehandles -that must be passed around, as in the following example: - - sub myopen { - open my $fh, "@_" - or die "Can't open '@_': $!"; - return $fh; - } - - { - my $f = myopen("; - # $f implicitly closed here - } - -Another way to create anonymous filehandles is with the Symbol -module or with the IO::Handle module and its ilk. These modules -have the advantage of not hiding different types of the same name -during the local(). See the bottom of L for an -example. - -=head1 SEE ALSO - -See L for a description of Perl's built-in variables and -a discussion of legal variable names. See L, L, -and L for more discussion on typeglobs and -the C<*foo{THING}> syntax. diff --git a/lib/perl5/5.6.1/pods/perldbmfilter.pod b/lib/perl5/5.6.1/pods/perldbmfilter.pod deleted file mode 100644 index 8384999e..00000000 --- a/lib/perl5/5.6.1/pods/perldbmfilter.pod +++ /dev/null @@ -1,168 +0,0 @@ -=head1 NAME - -perldbmfilter - Perl DBM Filters - -=head1 SYNOPSIS - - $db = tie %hash, 'DBM', ... - - $old_filter = $db->filter_store_key ( sub { ... } ) ; - $old_filter = $db->filter_store_value( sub { ... } ) ; - $old_filter = $db->filter_fetch_key ( sub { ... } ) ; - $old_filter = $db->filter_fetch_value( sub { ... } ) ; - -=head1 DESCRIPTION - -The four C methods shown above are available in all the DBM -modules that ship with Perl, namely DB_File, GDBM_File, NDBM_File, -ODBM_File and SDBM_File. - -Each of the methods work identically, and are used to install (or -uninstall) a single DBM Filter. The only difference between them is the -place that the filter is installed. - -To summarise: - -=over 5 - -=item B - -If a filter has been installed with this method, it will be invoked -every time you write a key to a DBM database. - -=item B - -If a filter has been installed with this method, it will be invoked -every time you write a value to a DBM database. - - -=item B - -If a filter has been installed with this method, it will be invoked -every time you read a key from a DBM database. - -=item B - -If a filter has been installed with this method, it will be invoked -every time you read a value from a DBM database. - -=back - -You can use any combination of the methods from none to all four. - -All filter methods return the existing filter, if present, or C -in not. - -To delete a filter pass C to it. - -=head2 The Filter - -When each filter is called by Perl, a local copy of C<$_> will contain -the key or value to be filtered. Filtering is achieved by modifying -the contents of C<$_>. The return code from the filter is ignored. - -=head2 An Example -- the NULL termination problem. - -DBM Filters are useful for a class of problems where you I -want to make the same transformation to all keys, all values or both. - -For example, consider the following scenario. You have a DBM database -that you need to share with a third-party C application. The C application -assumes that I keys and values are NULL terminated. Unfortunately -when Perl writes to DBM databases it doesn't use NULL termination, so -your Perl application will have to manage NULL termination itself. When -you write to the database you will have to use something like this: - - $hash{"$key\0"} = "$value\0" ; - -Similarly the NULL needs to be taken into account when you are considering -the length of existing keys/values. - -It would be much better if you could ignore the NULL terminations issue -in the main application code and have a mechanism that automatically -added the terminating NULL to all keys and values whenever you write to -the database and have them removed when you read from the database. As I'm -sure you have already guessed, this is a problem that DBM Filters can -fix very easily. - - use strict ; - use warnings ; - use SDBM_File ; - use Fcntl ; - - my %hash ; - my $filename = "/tmp/filt" ; - unlink $filename ; - - my $db = tie(%hash, 'SDBM_File', $filename, O_RDWR|O_CREAT, 0640) - or die "Cannot open $filename: $!\n" ; - - # Install DBM Filters - $db->filter_fetch_key ( sub { s/\0$// } ) ; - $db->filter_store_key ( sub { $_ .= "\0" } ) ; - $db->filter_fetch_value( - sub { no warnings 'uninitialized' ;s/\0$// } ) ; - $db->filter_store_value( sub { $_ .= "\0" } ) ; - - $hash{"abc"} = "def" ; - my $a = $hash{"ABC"} ; - # ... - undef $db ; - untie %hash ; - -The code above uses SDBM_File, but it will work with any of the DBM -modules. - -Hopefully the contents of each of the filters should be -self-explanatory. Both "fetch" filters remove the terminating NULL, -and both "store" filters add a terminating NULL. - - -=head2 Another Example -- Key is a C int. - -Here is another real-life example. By default, whenever Perl writes to -a DBM database it always writes the key and value as strings. So when -you use this: - - $hash{12345} = "something" ; - -the key 12345 will get stored in the DBM database as the 5 byte string -"12345". If you actually want the key to be stored in the DBM database -as a C int, you will have to use C when writing, and C -when reading. - -Here is a DBM Filter that does it: - - use strict ; - use warnings ; - use DB_File ; - my %hash ; - my $filename = "/tmp/filt" ; - unlink $filename ; - - - my $db = tie %hash, 'DB_File', $filename, O_CREAT|O_RDWR, 0666, $DB_HASH - or die "Cannot open $filename: $!\n" ; - - $db->filter_fetch_key ( sub { $_ = unpack("i", $_) } ) ; - $db->filter_store_key ( sub { $_ = pack ("i", $_) } ) ; - $hash{123} = "def" ; - # ... - undef $db ; - untie %hash ; - -The code above uses DB_File, but again it will work with any of the -DBM modules. - -This time only two filters have been used -- we only need to manipulate -the contents of the key, so it wasn't necessary to install any value -filters. - -=head1 SEE ALSO - -L, L, L, L and L. - -=head1 AUTHOR - -Paul Marquess - diff --git a/lib/perl5/5.6.1/pods/perldebguts.pod b/lib/perl5/5.6.1/pods/perldebguts.pod deleted file mode 100644 index 20cc5460..00000000 --- a/lib/perl5/5.6.1/pods/perldebguts.pod +++ /dev/null @@ -1,925 +0,0 @@ -=head1 NAME - -perldebguts - Guts of Perl debugging - -=head1 DESCRIPTION - -This is not the perldebug(1) manpage, which tells you how to use -the debugger. This manpage describes low-level details ranging -between difficult and impossible for anyone who isn't incredibly -intimate with Perl's guts to understand. Caveat lector. - -=head1 Debugger Internals - -Perl has special debugging hooks at compile-time and run-time used -to create debugging environments. These hooks are not to be confused -with the I command described in L, which is -usable only if a special Perl is built per the instructions in the -F podpage in the Perl source tree. - -For example, whenever you call Perl's built-in C function -from the package DB, the arguments that the corresponding stack -frame was called with are copied to the @DB::args array. The -general mechanisms is enabled by calling Perl with the B<-d> switch, the -following additional features are enabled (cf. L): - -=over 4 - -=item * - -Perl inserts the contents of C<$ENV{PERL5DB}> (or C if not present) before the first line of your program. - -=item * - -Each array C<@{"_<$filename"}> holds the lines of $filename for a -file compiled by Perl. The same for Ced strings that contain -subroutines, or which are currently being executed. The $filename -for Ced strings looks like C<(eval 34)>. Code assertions -in regexes look like C<(re_eval 19)>. - -Values in this array are magical in numeric context: they compare -equal to zero only if the line is not breakable. - -=item * - -Each hash C<%{"_<$filename"}> contains breakpoints and actions keyed -by line number. Individual entries (as opposed to the whole hash) -are settable. Perl only cares about Boolean true here, although -the values used by F have the form -C<"$break_condition\0$action">. - -The same holds for evaluated strings that contain subroutines, or -which are currently being executed. The $filename for Ced strings -looks like C<(eval 34)> or C<(re_eval 19)>. - -=item * - -Each scalar C<${"_<$filename"}> contains C<"_<$filename">. This is -also the case for evaluated strings that contain subroutines, or -which are currently being executed. The $filename for Ced -strings looks like C<(eval 34)> or C<(re_eval 19)>. - -=item * - -After each Cd file is compiled, but before it is executed, -C is called if the subroutine -C exists. Here, the $filename is the expanded name of -the Cd file, as found in the values of %INC. - -=item * - -After each subroutine C is compiled, the existence of -C<$DB::postponed{subname}> is checked. If this key exists, -C is called if the C subroutine -also exists. - -=item * - -A hash C<%DB::sub> is maintained, whose keys are subroutine names -and whose values have the form C. -C has the form C<(eval 34)> for subroutines defined inside -Cs, or C<(re_eval 19)> for those within regex code assertions. - -=item * - -When the execution of your program reaches a point that can hold a -breakpoint, the C subroutine is called any of the variables -$DB::trace, $DB::single, or $DB::signal is true. These variables -are not Cizable. This feature is disabled when executing -inside C, including functions called from it -unless C<< $^D & (1<<30) >> is true. - -=item * - -When execution of the program reaches a subroutine call, a call to -C<&DB::sub>(I) is made instead, with C<$DB::sub> holding the -name of the called subroutine. This doesn't happen if the subroutine -was compiled in the C package.) - -=back - -Note that if C<&DB::sub> needs external data for it to work, no -subroutine call is possible until this is done. For the standard -debugger, the C<$DB::deep> variable (how many levels of recursion -deep into the debugger you can go before a mandatory break) gives -an example of such a dependency. - -=head2 Writing Your Own Debugger - -The minimal working debugger consists of one line - - sub DB::DB {} - -which is quite handy as contents of C environment -variable: - - $ PERL5DB="sub DB::DB {}" perl -d your-script - -Another brief debugger, slightly more useful, could be created -with only the line: - - sub DB::DB {print ++$i; scalar } - -This debugger would print the sequential number of encountered -statement, and would wait for you to hit a newline before continuing. - -The following debugger is quite functional: - - { - package DB; - sub DB {} - sub sub {print ++$i, " $sub\n"; &$sub} - } - -It prints the sequential number of subroutine call and the name of the -called subroutine. Note that C<&DB::sub> should be compiled into the -package C. - -At the start, the debugger reads your rc file (F<./.perldb> or -F<~/.perldb> under Unix), which can set important options. This file may -define a subroutine C<&afterinit> to be executed after the debugger is -initialized. - -After the rc file is read, the debugger reads the PERLDB_OPTS -environment variable and parses this as the remainder of a C -line as one might enter at the debugger prompt. - -The debugger also maintains magical internal variables, such as -C<@DB::dbline>, C<%DB::dbline>, which are aliases for -C<@{"::_ C<%{"::_. Here C -is the currently selected file, either explicitly chosen with the -debugger's C command, or implicitly by flow of execution. - -Some functions are provided to simplify customization. See -L for description of options parsed by -C. The function C skips the specified number of frames and returns a list -containing information about the calling frames (all of them, if -C is missing). Each entry is reference to a hash with -keys C (either C<.>, C<$>, or C<@>), C (subroutine -name, or info about C), C (C or a reference to -an array), C, and C. - -The function C prints -formatted info about caller frames. The last two functions may be -convenient as arguments to C<< < >>, C<< << >> commands. - -Note that any variables and functions that are not documented in -this manpages (or in L) are considered for internal -use only, and as such are subject to change without notice. - -=head1 Frame Listing Output Examples - -The C option can be used to control the output of frame -information. For example, contrast this expression trace: - - $ perl -de 42 - Stack dump during die enabled outside of evals. - - Loading DB routines from perl5db.pl patch level 0.94 - Emacs support available. - - Enter h or `h h' for help. - - main::(-e:1): 0 - DB<1> sub foo { 14 } - - DB<2> sub bar { 3 } - - DB<3> t print foo() * bar() - main::((eval 172):3): print foo() + bar(); - main::foo((eval 168):2): - main::bar((eval 170):2): - 42 - -with this one, once the Cption C has been set: - - DB<4> O f=2 - frame = '2' - DB<5> t print foo() * bar() - 3: foo() * bar() - entering main::foo - 2: sub foo { 14 }; - exited main::foo - entering main::bar - 2: sub bar { 3 }; - exited main::bar - 42 - -By way of demonstration, we present below a laborious listing -resulting from setting your C environment variable to -the value C, and running I from the command line. -Examples use various values of C are shown to give you a feel -for the difference between settings. Long those it may be, this -is not a complete listing, but only excerpts. - -=over 4 - -=item 1 - - entering main::BEGIN - entering Config::BEGIN - Package lib/Exporter.pm. - Package lib/Carp.pm. - Package lib/Config.pm. - entering Config::TIEHASH - entering Exporter::import - entering Exporter::export - entering Config::myconfig - entering Config::FETCH - entering Config::FETCH - entering Config::FETCH - entering Config::FETCH - -=item 2 - - entering main::BEGIN - entering Config::BEGIN - Package lib/Exporter.pm. - Package lib/Carp.pm. - exited Config::BEGIN - Package lib/Config.pm. - entering Config::TIEHASH - exited Config::TIEHASH - entering Exporter::import - entering Exporter::export - exited Exporter::export - exited Exporter::import - exited main::BEGIN - entering Config::myconfig - entering Config::FETCH - exited Config::FETCH - entering Config::FETCH - exited Config::FETCH - entering Config::FETCH - -=item 4 - - in $=main::BEGIN() from /dev/null:0 - in $=Config::BEGIN() from lib/Config.pm:2 - Package lib/Exporter.pm. - Package lib/Carp.pm. - Package lib/Config.pm. - in $=Config::TIEHASH('Config') from lib/Config.pm:644 - in $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0 - in $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from li - in @=Config::myconfig() from /dev/null:0 - in $=Config::FETCH(ref(Config), 'package') from lib/Config.pm:574 - in $=Config::FETCH(ref(Config), 'baserev') from lib/Config.pm:574 - in $=Config::FETCH(ref(Config), 'PERL_VERSION') from lib/Config.pm:574 - in $=Config::FETCH(ref(Config), 'PERL_SUBVERSION') from lib/Config.pm:574 - in $=Config::FETCH(ref(Config), 'osname') from lib/Config.pm:574 - in $=Config::FETCH(ref(Config), 'osvers') from lib/Config.pm:574 - -=item 6 - - in $=main::BEGIN() from /dev/null:0 - in $=Config::BEGIN() from lib/Config.pm:2 - Package lib/Exporter.pm. - Package lib/Carp.pm. - out $=Config::BEGIN() from lib/Config.pm:0 - Package lib/Config.pm. - in $=Config::TIEHASH('Config') from lib/Config.pm:644 - out $=Config::TIEHASH('Config') from lib/Config.pm:644 - in $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0 - in $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/ - out $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/ - out $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0 - out $=main::BEGIN() from /dev/null:0 - in @=Config::myconfig() from /dev/null:0 - in $=Config::FETCH(ref(Config), 'package') from lib/Config.pm:574 - out $=Config::FETCH(ref(Config), 'package') from lib/Config.pm:574 - in $=Config::FETCH(ref(Config), 'baserev') from lib/Config.pm:574 - out $=Config::FETCH(ref(Config), 'baserev') from lib/Config.pm:574 - in $=Config::FETCH(ref(Config), 'PERL_VERSION') from lib/Config.pm:574 - out $=Config::FETCH(ref(Config), 'PERL_VERSION') from lib/Config.pm:574 - in $=Config::FETCH(ref(Config), 'PERL_SUBVERSION') from lib/Config.pm:574 - -=item 14 - - in $=main::BEGIN() from /dev/null:0 - in $=Config::BEGIN() from lib/Config.pm:2 - Package lib/Exporter.pm. - Package lib/Carp.pm. - out $=Config::BEGIN() from lib/Config.pm:0 - Package lib/Config.pm. - in $=Config::TIEHASH('Config') from lib/Config.pm:644 - out $=Config::TIEHASH('Config') from lib/Config.pm:644 - in $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0 - in $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/E - out $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/E - out $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0 - out $=main::BEGIN() from /dev/null:0 - in @=Config::myconfig() from /dev/null:0 - in $=Config::FETCH('Config=HASH(0x1aa444)', 'package') from lib/Config.pm:574 - out $=Config::FETCH('Config=HASH(0x1aa444)', 'package') from lib/Config.pm:574 - in $=Config::FETCH('Config=HASH(0x1aa444)', 'baserev') from lib/Config.pm:574 - out $=Config::FETCH('Config=HASH(0x1aa444)', 'baserev') from lib/Config.pm:574 - -=item 30 - - in $=CODE(0x15eca4)() from /dev/null:0 - in $=CODE(0x182528)() from lib/Config.pm:2 - Package lib/Exporter.pm. - out $=CODE(0x182528)() from lib/Config.pm:0 - scalar context return from CODE(0x182528): undef - Package lib/Config.pm. - in $=Config::TIEHASH('Config') from lib/Config.pm:628 - out $=Config::TIEHASH('Config') from lib/Config.pm:628 - scalar context return from Config::TIEHASH: empty hash - in $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0 - in $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/Exporter.pm:171 - out $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/Exporter.pm:171 - scalar context return from Exporter::export: '' - out $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0 - scalar context return from Exporter::import: '' - -=back - -In all cases shown above, the line indentation shows the call tree. -If bit 2 of C is set, a line is printed on exit from a -subroutine as well. If bit 4 is set, the arguments are printed -along with the caller info. If bit 8 is set, the arguments are -printed even if they are tied or references. If bit 16 is set, the -return value is printed, too. - -When a package is compiled, a line like this - - Package lib/Carp.pm. - -is printed with proper indentation. - -=head1 Debugging regular expressions - -There are two ways to enable debugging output for regular expressions. - -If your perl is compiled with C<-DDEBUGGING>, you may use the -B<-Dr> flag on the command line. - -Otherwise, one can C, which has effects at -compile time and run time. It is not lexically scoped. - -=head2 Compile-time output - -The debugging output at compile time looks like this: - - compiling RE `[bc]d(ef*g)+h[ij]k$' - size 43 first at 1 - 1: ANYOF(11) - 11: EXACT (13) - 13: CURLYX {1,32767}(27) - 15: OPEN1(17) - 17: EXACT (19) - 19: STAR(22) - 20: EXACT (0) - 22: EXACT (24) - 24: CLOSE1(26) - 26: WHILEM(0) - 27: NOTHING(28) - 28: EXACT (30) - 30: ANYOF(40) - 40: EXACT (42) - 42: EOL(43) - 43: END(0) - anchored `de' at 1 floating `gh' at 3..2147483647 (checking floating) - stclass `ANYOF' minlen 7 - -The first line shows the pre-compiled form of the regex. The second -shows the size of the compiled form (in arbitrary units, usually -4-byte words) and the label I of the first node that does a -match. - -The last line (split into two lines above) contains optimizer -information. In the example shown, the optimizer found that the match -should contain a substring C at offset 1, plus substring C -at some offset between 3 and infinity. Moreover, when checking for -these substrings (to abandon impossible matches quickly), Perl will check -for the substring C before checking for the substring C. The -optimizer may also use the knowledge that the match starts (at the -C I) with a character class, and the match cannot be -shorter than 7 chars. - -The fields of interest which may appear in the last line are - -=over 4 - -=item C I C I - -=item C I C I - -See above. - -=item C - -Which substring to check first. - -=item C - -The minimal length of the match. - -=item C I - -Type of first matching node. - -=item C - -Don't scan for the found substrings. - -=item C - -Means that the optimizer info is all that the regular -expression contains, and thus one does not need to enter the regex engine at -all. - -=item C - -Set if the pattern contains C<\G>. - -=item C - -Set if the pattern starts with a repeated char (as in C). - -=item C - -Set if the pattern starts with C<.*>. - -=item C - -Set if the pattern contain eval-groups, such as C<(?{ code })> and -C<(??{ code })>. - -=item C - -If the pattern may match only at a handful of places, (with C -being C, C, or C. See the table below. - -=back - -If a substring is known to match at end-of-line only, it may be -followed by C<$>, as in C. - -The optimizer-specific info is used to avoid entering (a slow) regex -engine on strings that will not definitely match. If C flag -is set, a call to the regex engine may be avoided even when the optimizer -found an appropriate place for the match. - -The rest of the output contains the list of I of the compiled -form of the regex. Each line has format - -C< >I: I I (I) - -=head2 Types of nodes - -Here are the possible types, with short descriptions: - - # TYPE arg-description [num-args] [longjump-len] DESCRIPTION - - # Exit points - END no End of program. - SUCCEED no Return from a subroutine, basically. - - # Anchors: - BOL no Match "" at beginning of line. - MBOL no Same, assuming multiline. - SBOL no Same, assuming singleline. - EOS no Match "" at end of string. - EOL no Match "" at end of line. - MEOL no Same, assuming multiline. - SEOL no Same, assuming singleline. - BOUND no Match "" at any word boundary - BOUNDL no Match "" at any word boundary - NBOUND no Match "" at any word non-boundary - NBOUNDL no Match "" at any word non-boundary - GPOS no Matches where last m//g left off. - - # [Special] alternatives - ANY no Match any one character (except newline). - SANY no Match any one character. - ANYOF sv Match character in (or not in) this class. - ALNUM no Match any alphanumeric character - ALNUML no Match any alphanumeric char in locale - NALNUM no Match any non-alphanumeric character - NALNUML no Match any non-alphanumeric char in locale - SPACE no Match any whitespace character - SPACEL no Match any whitespace char in locale - NSPACE no Match any non-whitespace character - NSPACEL no Match any non-whitespace char in locale - DIGIT no Match any numeric character - NDIGIT no Match any non-numeric character - - # BRANCH The set of branches constituting a single choice are hooked - # together with their "next" pointers, since precedence prevents - # anything being concatenated to any individual branch. The - # "next" pointer of the last BRANCH in a choice points to the - # thing following the whole choice. This is also where the - # final "next" pointer of each individual branch points; each - # branch starts with the operand node of a BRANCH node. - # - BRANCH node Match this alternative, or the next... - - # BACK Normal "next" pointers all implicitly point forward; BACK - # exists to make loop structures possible. - # not used - BACK no Match "", "next" ptr points backward. - - # Literals - EXACT sv Match this string (preceded by length). - EXACTF sv Match this string, folded (prec. by length). - EXACTFL sv Match this string, folded in locale (w/len). - - # Do nothing - NOTHING no Match empty string. - # A variant of above which delimits a group, thus stops optimizations - TAIL no Match empty string. Can jump here from outside. - - # STAR,PLUS '?', and complex '*' and '+', are implemented as circular - # BRANCH structures using BACK. Simple cases (one character - # per match) are implemented with STAR and PLUS for speed - # and to minimize recursive plunges. - # - STAR node Match this (simple) thing 0 or more times. - PLUS node Match this (simple) thing 1 or more times. - - CURLY sv 2 Match this simple thing {n,m} times. - CURLYN no 2 Match next-after-this simple thing - # {n,m} times, set parens. - CURLYM no 2 Match this medium-complex thing {n,m} times. - CURLYX sv 2 Match this complex thing {n,m} times. - - # This terminator creates a loop structure for CURLYX - WHILEM no Do curly processing and see if rest matches. - - # OPEN,CLOSE,GROUPP ...are numbered at compile time. - OPEN num 1 Mark this point in input as start of #n. - CLOSE num 1 Analogous to OPEN. - - REF num 1 Match some already matched string - REFF num 1 Match already matched string, folded - REFFL num 1 Match already matched string, folded in loc. - - # grouping assertions - IFMATCH off 1 2 Succeeds if the following matches. - UNLESSM off 1 2 Fails if the following matches. - SUSPEND off 1 1 "Independent" sub-regex. - IFTHEN off 1 1 Switch, should be preceded by switcher . - GROUPP num 1 Whether the group matched. - - # Support for long regex - LONGJMP off 1 1 Jump far away. - BRANCHJ off 1 1 BRANCH with long offset. - - # The heavy worker - EVAL evl 1 Execute some Perl code. - - # Modifiers - MINMOD no Next operator is not greedy. - LOGICAL no Next opcode should set the flag only. - - # This is not used yet - RENUM off 1 1 Group with independently numbered parens. - - # This is not really a node, but an optimized away piece of a "long" node. - # To simplify debugging output, we mark it as if it were a node - OPTIMIZED off Placeholder for dump. - -=head2 Run-time output - -First of all, when doing a match, one may get no run-time output even -if debugging is enabled. This means that the regex engine was never -entered and that all of the job was therefore done by the optimizer. - -If the regex engine was entered, the output may look like this: - - Matching `[bc]d(ef*g)+h[ij]k$' against `abcdefg__gh__' - Setting an EVAL scope, savestack=3 - 2 | 1: ANYOF - 3 | 11: EXACT - 4 | 13: CURLYX {1,32767} - 4 | 26: WHILEM - 0 out of 1..32767 cc=effff31c - 4 | 15: OPEN1 - 4 | 17: EXACT - 5 | 19: STAR - EXACT can match 1 times out of 32767... - Setting an EVAL scope, savestack=3 - 6 | 22: EXACT - 7 <__gh__> | 24: CLOSE1 - 7 <__gh__> | 26: WHILEM - 1 out of 1..32767 cc=effff31c - Setting an EVAL scope, savestack=12 - 7 <__gh__> | 15: OPEN1 - 7 <__gh__> | 17: EXACT - restoring \1 to 4(4)..7 - failed, try continuation... - 7 <__gh__> | 27: NOTHING - 7 <__gh__> | 28: EXACT - failed... - failed... - -The most significant information in the output is about the particular I -of the compiled regex that is currently being tested against the target string. -The format of these lines is - -C< >I > > |I: I - -The I info is indented with respect to the backtracking level. -Other incidental information appears interspersed within. - -=head1 Debugging Perl memory usage - -Perl is a profligate wastrel when it comes to memory use. There -is a saying that to estimate memory usage of Perl, assume a reasonable -algorithm for memory allocation, multiply that estimate by 10, and -while you still may miss the mark, at least you won't be quite so -astonished. This is not absolutely true, but may provide a good -grasp of what happens. - -Assume that an integer cannot take less than 20 bytes of memory, a -float cannot take less than 24 bytes, a string cannot take less -than 32 bytes (all these examples assume 32-bit architectures, the -result are quite a bit worse on 64-bit architectures). If a variable -is accessed in two of three different ways (which require an integer, -a float, or a string), the memory footprint may increase yet another -20 bytes. A sloppy malloc(3) implementation can inflate these -numbers dramatically. - -On the opposite end of the scale, a declaration like - - sub foo; - -may take up to 500 bytes of memory, depending on which release of Perl -you're running. - -Anecdotal estimates of source-to-compiled code bloat suggest an -eightfold increase. This means that the compiled form of reasonable -(normally commented, properly indented etc.) code will take -about eight times more space in memory than the code took -on disk. - -There are two Perl-specific ways to analyze memory usage: -$ENV{PERL_DEBUG_MSTATS} and B<-DL> command-line switch. The first -is available only if Perl is compiled with Perl's malloc(); the -second only if Perl was built with C<-DDEBUGGING>. See the -instructions for how to do this in the F podpage at -the top level of the Perl source tree. - -=head2 Using C<$ENV{PERL_DEBUG_MSTATS}> - -If your perl is using Perl's malloc() and was compiled with the -necessary switches (this is the default), then it will print memory -usage statistics after compiling your code when C<< $ENV{PERL_DEBUG_MSTATS} -> 1 >>, and before termination of the program when C<< -$ENV{PERL_DEBUG_MSTATS} >= 1 >>. The report format is similar to -the following example: - - $ PERL_DEBUG_MSTATS=2 perl -e "require Carp" - Memory allocation statistics after compilation: (buckets 4(4)..8188(8192) - 14216 free: 130 117 28 7 9 0 2 2 1 0 0 - 437 61 36 0 5 - 60924 used: 125 137 161 55 7 8 6 16 2 0 1 - 74 109 304 84 20 - Total sbrk(): 77824/21:119. Odd ends: pad+heads+chain+tail: 0+636+0+2048. - Memory allocation statistics after execution: (buckets 4(4)..8188(8192) - 30888 free: 245 78 85 13 6 2 1 3 2 0 1 - 315 162 39 42 11 - 175816 used: 265 176 1112 111 26 22 11 27 2 1 1 - 196 178 1066 798 39 - Total sbrk(): 215040/47:145. Odd ends: pad+heads+chain+tail: 0+2192+0+6144. - -It is possible to ask for such a statistic at arbitrary points in -your execution using the mstat() function out of the standard -Devel::Peek module. - -Here is some explanation of that format: - -=over 4 - -=item C - -Perl's malloc() uses bucketed allocations. Every request is rounded -up to the closest bucket size available, and a bucket is taken from -the pool of buckets of that size. - -The line above describes the limits of buckets currently in use. -Each bucket has two sizes: memory footprint and the maximal size -of user data that can fit into this bucket. Suppose in the above -example that the smallest bucket were size 4. The biggest bucket -would have usable size 8188, and the memory footprint would be 8192. - -In a Perl built for debugging, some buckets may have negative usable -size. This means that these buckets cannot (and will not) be used. -For larger buckets, the memory footprint may be one page greater -than a power of 2. If so, case the corresponding power of two is -printed in the C field above. - -=item Free/Used - -The 1 or 2 rows of numbers following that correspond to the number -of buckets of each size between C and C. In -the first row, the sizes (memory footprints) of buckets are powers -of two--or possibly one page greater. In the second row, if present, -the memory footprints of the buckets are between the memory footprints -of two buckets "above". - -For example, suppose under the previous example, the memory footprints -were - - free: 8 16 32 64 128 256 512 1024 2048 4096 8192 - 4 12 24 48 80 - -With non-C perl, the buckets starting from C<128> have -a 4-byte overhead, and thus a 8192-long bucket may take up to -8188-byte allocations. - -=item C - -The first two fields give the total amount of memory perl sbrk(2)ed -(ess-broken? :-) and number of sbrk(2)s used. The third number is -what perl thinks about continuity of returned chunks. So long as -this number is positive, malloc() will assume that it is probable -that sbrk(2) will provide continuous memory. - -Memory allocated by external libraries is not counted. - -=item C - -The amount of sbrk(2)ed memory needed to keep buckets aligned. - -=item C - -Although memory overhead of bigger buckets is kept inside the bucket, for -smaller buckets, it is kept in separate areas. This field gives the -total size of these areas. - -=item C - -malloc() may want to subdivide a bigger bucket into smaller buckets. -If only a part of the deceased bucket is left unsubdivided, the rest -is kept as an element of a linked list. This field gives the total -size of these chunks. - -=item C - -To minimize the number of sbrk(2)s, malloc() asks for more memory. This -field gives the size of the yet unused part, which is sbrk(2)ed, but -never touched. - -=back - -=head2 Example of using B<-DL> switch - -Below we show how to analyse memory usage by - - do 'lib/auto/POSIX/autosplit.ix'; - -The file in question contains a header and 146 lines similar to - - sub getcwd; - -B: The discussion below supposes 32-bit architecture. In -newer releases of Perl, memory usage of the constructs discussed -here is greatly improved, but the story discussed below is a real-life -story. This story is mercilessly terse, and assumes rather more than cursory -knowledge of Perl internals. Type space to continue, `q' to quit. -(Actually, you just want to skip to the next section.) - -Here is the itemized list of Perl allocations performed during parsing -of this file: - - !!! "after" at test.pl line 3. - Id subtot 4 8 12 16 20 24 28 32 36 40 48 56 64 72 80 80+ - 0 02 13752 . . . . 294 . . . . . . . . . . 4 - 0 54 5545 . . 8 124 16 . . . 1 1 . . . . . 3 - 5 05 32 . . . . . . . 1 . . . . . . . . - 6 02 7152 . . . . . . . . . . 149 . . . . . - 7 02 3600 . . . . . 150 . . . . . . . . . . - 7 03 64 . -1 . 1 . . 2 . . . . . . . . . - 7 04 7056 . . . . . . . . . . . . . . . 7 - 7 17 38404 . . . . . . . 1 . . 442 149 . . 147 . - 9 03 2078 17 249 32 . . . . 2 . . . . . . . . - - -To see this list, insert two C statements around the call: - - warn('!'); - do 'lib/auto/POSIX/autosplit.ix'; - warn('!!! "after"'); - -and run it with Perl's B<-DL> option. The first warn() will print -memory allocation info before parsing the file and will memorize -the statistics at this point (we ignore what it prints). The second -warn() prints increments with respect to these memorized data. This -is the printout shown above. - -Different Is on the left correspond to different subsystems of -the perl interpreter. They are just the first argument given to -the perl memory allocation API named New(). To find what C<9 03> -means, just B the perl source for C<903>. You'll find it in -F, function savepvn(). (I know, you wonder why we told you -to B and then gave away the answer. That's because grepping -the source is good for the soul.) This function is used to store -a copy of an existing chunk of memory. Using a C debugger, one can -see that the function was called either directly from gv_init() or -via sv_magic(), and that gv_init() is called from gv_fetchpv()--which -was itself called from newSUB(). Please stop to catch your breath now. - -B: To reach this point in the debugger and skip the calls to -savepvn() during the compilation of the main program, you should -set a C breakpoint -in Perl_warn(), continue until this point is reached, and I set -a C breakpoint in Perl_savepvn(). Note that you may need to skip a -handful of Perl_savepvn() calls that do not correspond to mass production -of CVs (there are more C<903> allocations than 146 similar lines of -F). Note also that C prefixes are -added by macroization code in perl header files to avoid conflicts -with external libraries. - -Anyway, we see that C<903> ids correspond to creation of globs, twice -per glob - for glob name, and glob stringification magic. - -Here are explanations for other Is above: - -=over 4 - -=item C<717> - -Creates bigger C structures. In the case above, it -creates 3 Cs per subroutine, one for a list of lexical variable -names, one for a scratchpad (which contains lexical variables and -C), and one for the array of scratchpads needed for -recursion. - -It also creates a C and a C per subroutine, all called from -start_subparse(). - -=item C<002> - -Creates a C array corresponding to the C of scratchpads and the -scratchpad itself. The first fake entry of this scratchpad is -created though the subroutine itself is not defined yet. - -It also creates C arrays to keep data for the stash. This is one HV, -but it grows; thus, there are 4 big allocations: the big chunks are not -freed, but are kept as additional arenas for C allocations. - -=item C<054> - -Creates a C for the name of the glob for the subroutine. This -name is a key in a I. - -Big allocations with this I correspond to allocations of new -arenas to keep C. - -=item C<602> - -Creates a C for the glob for the subroutine. - -=item C<702> - -Creates the C for the glob for the subroutine. - -=item C<704> - -Creates I which keep SVs. - -=back - -=head2 B<-DL> details - -If Perl is run with B<-DL> option, then warn()s that start with `!' -behave specially. They print a list of I of memory -allocations, and statistics of allocations of different sizes for -these categories. - -If warn() string starts with - -=over 4 - -=item C - -print changed categories only, print the differences in counts of allocations. - -=item C - -print grown categories only; print the absolute values of counts, and totals. - -=item C - -print nonempty categories, print the absolute values of counts and totals. - -=back - -=head2 Limitations of B<-DL> statistics - -If an extension or external library does not use the Perl API to -allocate memory, such allocations are not counted. - -=head1 SEE ALSO - -L, -L, -L -L, -and -L. diff --git a/lib/perl5/5.6.1/pods/perldebtut.pod b/lib/perl5/5.6.1/pods/perldebtut.pod deleted file mode 100644 index e11102e5..00000000 --- a/lib/perl5/5.6.1/pods/perldebtut.pod +++ /dev/null @@ -1,721 +0,0 @@ -=head1 NAME - -perldebtut - Perl debugging tutorial - -=head1 DESCRIPTION - -A (very) lightweight introduction in the use of the perl debugger, and a -pointer to existing, deeper sources of information on the subject of debugging -perl programs. - -There's an extraordinary number of people out there who don't appear to know -anything about using the perl debugger, though they use the language every -day. -This is for them. - - -=head1 use strict - -First of all, there's a few things you can do to make your life a lot more -straightforward when it comes to debugging perl programs, without using the -debugger at all. To demonstrate, here's a simple script with a problem: - - #!/usr/bin/perl - - $var1 = 'Hello World'; # always wanted to do that :-) - $var2 = "$varl\n"; - - print $var2; - exit; - -While this compiles and runs happily, it probably won't do what's expected, -namely it doesn't print "Hello World\n" at all; It will on the other hand do -exactly what it was told to do, computers being a bit that way inclined. That -is, it will print out a newline character, and you'll get what looks like a -blank line. It looks like there's 2 variables when (because of the typo) -there's really 3: - - $var1 = 'Hello World' - $varl = undef - $var2 = "\n" - -To catch this kind of problem, we can force each variable to be declared -before use by pulling in the strict module, by putting 'use strict;' after the -first line of the script. - -Now when you run it, perl complains about the 3 undeclared variables and we -get four error messages because one variable is referenced twice: - - Global symbol "$var1" requires explicit package name at ./t1 line 4. - Global symbol "$var2" requires explicit package name at ./t1 line 5. - Global symbol "$varl" requires explicit package name at ./t1 line 5. - Global symbol "$var2" requires explicit package name at ./t1 line 7. - Execution of ./hello aborted due to compilation errors. - -Luvverly! and to fix this we declare all variables explicitly and now our -script looks like this: - - #!/usr/bin/perl - use strict; - - my $var1 = 'Hello World'; - my $varl = ''; - my $var2 = "$varl\n"; - - print $var2; - exit; - -We then do (always a good idea) a syntax check before we try to run it again: - - > perl -c hello - hello syntax OK - -And now when we run it, we get "\n" still, but at least we know why. Just -getting this script to compile has exposed the '$varl' (with the letter 'l) -variable, and simply changing $varl to $var1 solves the problem. - - -=head1 Looking at data and -w and w - -Ok, but how about when you want to really see your data, what's in that -dynamic variable, just before using it? - - #!/usr/bin/perl - use strict; - - my $key = 'welcome'; - my %data = ( - 'this' => qw(that), - 'tom' => qw(and jerry), - 'welcome' => q(Hello World), - 'zip' => q(welcome), - ); - my @data = keys %data; - - print "$data{$key}\n"; - exit; - -Looks OK, after it's been through the syntax check (perl -c scriptname), we -run it and all we get is a blank line again! Hmmmm. - -One common debugging approach here, would be to liberally sprinkle a few print -statements, to add a check just before we print out our data, and another just -after: - - print "All OK\n" if grep($key, keys %data); - print "$data{$key}\n"; - print "done: '$data{$key}'\n"; - -And try again: - - > perl data - All OK - - done: '' - -After much staring at the same piece of code and not seeing the wood for the -trees for some time, we get a cup of coffee and try another approach. That -is, we bring in the cavalry by giving perl the 'B<-d>' switch on the command -line: - - > perl -d data - Default die handler restored. - - Loading DB routines from perl5db.pl version 1.07 - Editor support available. - - Enter h or `h h' for help, or `man perldebug' for more help. - - main::(./data:4): my $key = 'welcome'; - -Now, what we've done here is to launch the built-in perl debugger on our -script. It's stopped at the first line of executable code and is waiting for -input. - -Before we go any further, you'll want to know how to quit the debugger: use -just the letter 'B', not the words 'quit' or 'exit': - - DB<1> q - > - -That's it, you're back on home turf again. - - -=head1 help - -Fire the debugger up again on your script and we'll look at the help menu. -There's a couple of ways of calling help: a simple 'B' will get you a long -scrolled list of help, 'B<|h>' (pipe-h) will pipe the help through your pager -('more' or 'less' probably), and finally, 'B' (h-space-h) will give you a -helpful mini-screen snapshot: - - DB<1> h h - List/search source lines: Control script execution: - l [ln|sub] List source code T Stack trace - - or . List previous/current line s [expr] Single step [in expr] - w [line] List around line n [expr] Next, steps over subs - f filename View source in file Repeat last n or s - /pattern/ ?patt? Search forw/backw r Return from subroutine - v Show versions of modules c [ln|sub] Continue until position - Debugger controls: L List -break/watch/actions - O [...] Set debugger options t [expr] Toggle trace [trace expr] - <[<]|{[{]|>[>] [cmd] Do pre/post-prompt b [ln|event|sub] [cnd] Set breakpoint - ! [N|pat] Redo a previous command d [ln] or D Delete a/all breakpoints - H [-num] Display last num commands a [ln] cmd Do cmd before line - = [a val] Define/list an alias W expr Add a watch expression - h [db_cmd] Get help on command A or W Delete all actions/watch - |[|]db_cmd Send output to pager ![!] syscmd Run cmd in a subprocess - q or ^D Quit R Attempt a restart - Data Examination: expr Execute perl code, also see: s,n,t expr - x|m expr Evals expr in list context, dumps the result or lists methods. - p expr Print expression (uses script's current package). - S [[!]pat] List subroutine names [not] matching pattern - V [Pk [Vars]] List Variables in Package. Vars can be ~pattern or !pattern. - X [Vars] Same as "V current_package [Vars]". - For more help, type h cmd_letter, or run man perldebug for all docs. - -More confusing options than you can shake a big stick at! It's not as bad as -it looks and it's very useful to know more about all of it, and fun too! - -There's a couple of useful ones to know about straight away. You wouldn't -think we're using any libraries at all at the moment, but 'B' will show -which modules are currently loaded, by the debugger as well your script. -'B' and 'B' show variables in the program by package scope and can be -constrained by pattern. 'B' shows methods and 'B' shows all subroutines -(by pattern): - - DB<2>S str - dumpvar::stringify - strict::bits - strict::import - strict::unimport - -Using 'X' and cousins requires you not to use the type identifiers ($@%), just -the 'name': - - DM<3>X ~err - FileHandle(stderr) => fileno(2) - -Remember we're in our tiny program with a problem, we should have a look at -where we are, and what our data looks like. First of all let's have a window -on our present position (the first line of code in this case), via the letter -'B': - - DB<4> w - 1 #!/usr/bin/perl - 2: use strict; - 3 - 4==> my $key = 'welcome'; - 5: my %data = ( - 6 'this' => qw(that), - 7 'tom' => qw(and jerry), - 8 'welcome' => q(Hello World), - 9 'zip' => q(welcome), - 10 ); - -At line number 4 is a helpful pointer, that tells you where you are now. To -see more code, type 'w' again: - - DB<4> w - 8 'welcome' => q(Hello World), - 9 'zip' => q(welcome), - 10 ); - 11: my @data = keys %data; - 12: print "All OK\n" if grep($key, keys %data); - 13: print "$data{$key}\n"; - 14: print "done: '$data{$key}'\n"; - 15: exit; - -And if you wanted to list line 5 again, type 'l 5', (note the space): - - DB<4> l 5 - 5: my %data = ( - -In this case, there's not much to see, but of course normally there's pages of -stuff to wade through, and 'l' can be very useful. To reset your view to the -line we're about to execute, type a lone period '.': - - DB<5> . - main::(./data_a:4): my $key = 'welcome'; - -The line shown is the one that is about to be executed B, it hasn't -happened yet. So while we can print a variable with the letter 'B

    ', at -this point all we'd get is an empty (undefined) value back. What we need to -do is to step through the next executable statement with an 'B': - - DB<6> s - main::(./data_a:5): my %data = ( - main::(./data_a:6): 'this' => qw(that), - main::(./data_a:7): 'tom' => qw(and jerry), - main::(./data_a:8): 'welcome' => q(Hello World), - main::(./data_a:9): 'zip' => q(welcome), - main::(./data_a:10): ); - -Now we can have a look at that first ($key) variable: - - DB<7> p $key - welcome - -line 13 is where the action is, so let's continue down to there via the letter -'B', which by the way, inserts a 'one-time-only' breakpoint at the given -line or sub routine: - - DB<8> c 13 - All OK - main::(./data_a:13): print "$data{$key}\n"; - -We've gone past our check (where 'All OK' was printed) and have stopped just -before the meat of our task. We could try to print out a couple of variables -to see what is happening: - - DB<9> p $data{$key} - -Not much in there, lets have a look at our hash: - - DB<10> p %data - Hello Worldziptomandwelcomejerrywelcomethisthat - - DB<11> p keys %data - Hello Worldtomwelcomejerrythis - -Well, this isn't very easy to read, and using the helpful manual (B), the -'B' command looks promising: - - DB<12> x %data - 0 'Hello World' - 1 'zip' - 2 'tom' - 3 'and' - 4 'welcome' - 5 undef - 6 'jerry' - 7 'welcome' - 8 'this' - 9 'that' - -That's not much help, a couple of welcomes in there, but no indication of -which are keys, and which are values, it's just a listed array dump and, in -this case, not particularly helpful. The trick here, is to use a B -to the data structure: - - DB<13> x \%data - 0 HASH(0x8194bc4) - 'Hello World' => 'zip' - 'jerry' => 'welcome' - 'this' => 'that' - 'tom' => 'and' - 'welcome' => undef - -The reference is truly dumped and we can finally see what we're dealing with. -Our quoting was perfectly valid but wrong for our purposes, with 'and jerry' -being treated as 2 separate words rather than a phrase, thus throwing the -evenly paired hash structure out of alignment. - -The 'B<-w>' switch would have told us about this, had we used it at the start, -and saved us a lot of trouble: - - > perl -w data - Odd number of elements in hash assignment at ./data line 5. - -We fix our quoting: 'tom' => q(and jerry), and run it again, this time we get -our expected output: - - > perl -w data - Hello World - - -While we're here, take a closer look at the 'B' command, it's really useful -and will merrily dump out nested references, complete objects, partial objects -- just about whatever you throw at it: - -Let's make a quick object and x-plode it, first we'll start the the debugger: -it wants some form of input from STDIN, so we give it something non-commital, -a zero: - - > perl -de 0 - Default die handler restored. - - Loading DB routines from perl5db.pl version 1.07 - Editor support available. - - Enter h or `h h' for help, or `man perldebug' for more help. - - main::(-e:1): 0 - -Now build an on-the-fly object over a couple of lines (note the backslash): - - DB<1> $obj = bless({'unique_id'=>'123', 'attr'=> \ - cont: {'col' => 'black', 'things' => [qw(this that etc)]}}, 'MY_class') - -And let's have a look at it: - - DB<2> x $obj - 0 MY_class=HASH(0x828ad98) - 'attr' => HASH(0x828ad68) - 'col' => 'black' - 'things' => ARRAY(0x828abb8) - 0 'this' - 1 'that' - 2 'etc' - 'unique_id' => 123 - DB<3> - -Useful, huh? You can eval nearly anything in there, and experiment with bits -of code or regexes until the cows come home: - - DB<3> @data = qw(this that the other atheism leather theory scythe) - - DB<4> p 'saw -> '.($cnt += map { print "\t:\t$_\n" } grep(/the/, sort @data)) - atheism - leather - other - scythe - the - theory - saw -> 6 - -If you want to see the command History, type an 'B': - - DB<5> H - 4: p 'saw -> '.($cnt += map { print "\t:\t$_\n" } grep(/the/, sort @data)) - 3: @data = qw(this that the other atheism leather theory scythe) - 2: x $obj - 1: $obj = bless({'unique_id'=>'123', 'attr'=> - {'col' => 'black', 'things' => [qw(this that etc)]}}, 'MY_class') - DB<5> - -And if you want to repeat any previous command, use the exclamation: 'B': - - DB<5> !4 - p 'saw -> '.($cnt += map { print "$_\n" } grep(/the/, sort @data)) - atheism - leather - other - scythe - the - theory - saw -> 12 - -For more on references see L and L - - -=head1 Stepping through code - -Here's a simple program which converts between Celsius and Fahrenheit, it too -has a problem: - - #!/usr/bin/perl -w - use strict; - - my $arg = $ARGV[0] || '-c20'; - - if ($arg =~ /^\-(c|f)((\-|\+)*\d+(\.\d+)*)$/) { - my ($deg, $num) = ($1, $2); - my ($in, $out) = ($num, $num); - if ($deg eq 'c') { - $deg = 'f'; - $out = &c2f($num); - } else { - $deg = 'c'; - $out = &f2c($num); - } - $out = sprintf('%0.2f', $out); - $out =~ s/^((\-|\+)*\d+)\.0+$/$1/; - print "$out $deg\n"; - } else { - print "Usage: $0 -[c|f] num\n"; - } - exit; - - sub f2c { - my $f = shift; - my $c = 5 * $f - 32 / 9; - return $c; - } - - sub c2f { - my $c = shift; - my $f = 9 * $c / 5 + 32; - return $f; - } - - -For some reason, the Fahrenheit to Celsius conversion fails to return the -expected output. This is what it does: - - > temp -c0.72 - 33.30 f - - > temp -f33.3 - 162.94 c - -Not very consistent! We'll set a breakpoint in the code manually and run it -under the debugger to see what's going on. A breakpoint is a flag, to which -the debugger will run without interruption, when it reaches the breakpoint, it -will stop execution and offer a prompt for further interaction. In normal -use, these debugger commands are completely ignored, and they are safe - if a -little messy, to leave in production code. - - my ($in, $out) = ($num, $num); - $DB::single=2; # insert at line 9! - if ($deg eq 'c') - ... - - > perl -d temp -f33.3 - Default die handler restored. - - Loading DB routines from perl5db.pl version 1.07 - Editor support available. - - Enter h or `h h' for help, or `man perldebug' for more help. - - main::(temp:4): my $arg = $ARGV[0] || '-c100'; - -We'll simply continue down to our pre-set breakpoint with a 'B': - - DB<1> c - main::(temp:10): if ($deg eq 'c') { - -Followed by a window command to see where we are: - - DB<1> w - 7: my ($deg, $num) = ($1, $2); - 8: my ($in, $out) = ($num, $num); - 9: $DB::single=2; - 10==> if ($deg eq 'c') { - 11: $deg = 'f'; - 12: $out = &c2f($num); - 13 } else { - 14: $deg = 'c'; - 15: $out = &f2c($num); - 16 } - -And a print to show what values we're currently using: - - DB<1> p $deg, $num - f33.3 - -We can put another break point on any line beginning with a colon, we'll use -line 17 as that's just as we come out of the subroutine, and we'd like to -pause there later on: - - DB<2> b 17 - -There's no feedback from this, but you can see what breakpoints are set by -using the list 'L' command: - - DB<3> L - temp: - 17: print "$out $deg\n"; - break if (1) - -Note that to delete a breakpoint you use 'd' or 'D'. - -Now we'll continue down into our subroutine, this time rather than by line -number, we'll use the subroutine name, followed by the now familiar 'w': - - DB<3> c f2c - main::f2c(temp:30): my $f = shift; - - DB<4> w - 24: exit; - 25 - 26 sub f2c { - 27==> my $f = shift; - 28: my $c = 5 * $f - 32 / 9; - 29: return $c; - 30 } - 31 - 32 sub c2f { - 33: my $c = shift; - - -Note that if there was a subroutine call between us and line 29, and we wanted -to B through it, we could use the 'B' command, and to step -over it we would use 'B' which would execute the sub, but not descend into -it for inspection. In this case though, we simply continue down to line 29: - - DB<4> c 29 - main::f2c(temp:29): return $c; - -And have a look at the return value: - - DB<5> p $c - 162.944444444444 - -This is not the right answer at all, but the sum looks correct. I wonder if -it's anything to do with operator precedence? We'll try a couple of other -possibilities with our sum: - - DB<6> p (5 * $f - 32 / 9) - 162.944444444444 - - DB<7> p 5 * $f - (32 / 9) - 162.944444444444 - - DB<8> p (5 * $f) - 32 / 9 - 162.944444444444 - - DB<9> p 5 * ($f - 32) / 9 - 0.722222222222221 - -:-) that's more like it! Ok, now we can set our return variable and we'll -return out of the sub with an 'r': - - DB<10> $c = 5 * ($f - 32) / 9 - - DB<11> r - scalar context return from main::f2c: 0.722222222222221 - -Looks good, let's just continue off the end of the script: - - DB<12> c - 0.72 c - Debugged program terminated. Use q to quit or R to restart, - use O inhibit_exit to avoid stopping after program termination, - h q, h R or h O to get additional info. - -A quick fix to the offending line (insert the missing parentheses) in the -actual program and we're finished. - - -=head1 Placeholder for a, w, t, T - -Actions, watch variables, stack traces etc.: on the TODO list. - - a - - W - - t - - T - - -=head1 REGULAR EXPRESSIONS - -Ever wanted to know what a regex looked like? You'll need perl compiled with -the DEBUGGING flag for this one: - - > perl -Dr -e '/^pe(a)*rl$/i' - Compiling REx `^pe(a)*rl$' - size 17 first at 2 - rarest char - at 0 - 1: BOL(2) - 2: EXACTF (4) - 4: CURLYN[1] {0,32767}(14) - 6: NOTHING(8) - 8: EXACTF (0) - 12: WHILEM(0) - 13: NOTHING(14) - 14: EXACTF (16) - 16: EOL(17) - 17: END(0) - floating `'$ at 4..2147483647 (checking floating) stclass `EXACTF ' -anchored(BOL) minlen 4 - Omitting $` $& $' support. - - EXECUTING... - - Freeing REx: `^pe(a)*rl$' - -Did you really want to know? :-) -For more gory details on getting regular expressions to work, have a look at -L, L, and to decode the mysterious labels (BOL and CURLYN, -etc. above), see L. - - -=head1 OUTPUT TIPS - -To get all the output from your error log, and not miss any messages via -helpful operating system buffering, insert a line like this, at the start of -your script: - - $|=1; - -To watch the tail of a dynamically growing logfile, (from the command line): - - tail -f $error_log - -Wrapping all die calls in a handler routine can be useful to see how, and from -where, they're being called, L has more information: - - BEGIN { $SIG{__DIE__} = sub { require Carp; Carp::confess(@_) } } - -Various useful techniques for the redirection of STDOUT and STDERR filehandles -are explained in L and L. - - -=head1 CGI - -Just a quick hint here for all those CGI programmers who can't figure out how -on earth to get past that 'waiting for input' prompt, when running their CGI -script from the command-line, try something like this: - - > perl -d my_cgi.pl -nodebug - -Of course L and L will tell you more. - - -=head1 GUIs - -The command line interface is tightly integrated with an B extension -and there's a B interface too. - -You don't have to do this all on the command line, though, there are a few GUI -options out there. The nice thing about these is you can wave a mouse over a -variable and a dump of it's data will appear in an appropriate window, or in a -popup balloon, no more tiresome typing of 'x $varname' :-) - -In particular have a hunt around for the following: - -B perlTK based wrapper for the built-in debugger - -B data display debugger - -B and B are NT specific - -NB. (more info on these and others would be appreciated). - - -=head1 SUMMARY - -We've seen how to encourage good coding practices with B and -B<-w>. We can run the perl debugger B to inspect your -data from within the perl debugger with the B

    and B commands. You can -walk through your code, set breakpoints with B and step through that code -with B or B, continue with B and return from a sub with B. Fairly -intuitive stuff when you get down to it. - -There is of course lots more to find out about, this has just scratched the -surface. The best way to learn more is to use perldoc to find out more about -the language, to read the on-line help (L is probably the next -place to go), and of course, experiment. - - -=head1 SEE ALSO - -L, -L, -L, -L, -L - - -=head1 AUTHOR - -Richard Foley Copyright (c) 2000 - - -=head1 CONTRIBUTORS - -Various people have made helpful suggestions and contributions, in particular: - -Ronald J Kimball - -Hugo van der Sanden - -Peter Scott - diff --git a/lib/perl5/5.6.1/pods/perldebug.pod b/lib/perl5/5.6.1/pods/perldebug.pod deleted file mode 100644 index 0aff91a5..00000000 --- a/lib/perl5/5.6.1/pods/perldebug.pod +++ /dev/null @@ -1,956 +0,0 @@ -=head1 NAME - -perldebug - Perl debugging - -=head1 DESCRIPTION - -First of all, have you tried using the B<-w> switch? - -=head1 The Perl Debugger - -If you invoke Perl with the B<-d> switch, your script runs under the -Perl source debugger. This works like an interactive Perl -environment, prompting for debugger commands that let you examine -source code, set breakpoints, get stack backtraces, change the values of -variables, etc. This is so convenient that you often fire up -the debugger all by itself just to test out Perl constructs -interactively to see what they do. For example: - - $ perl -d -e 42 - -In Perl, the debugger is not a separate program the way it usually is in the -typical compiled environment. Instead, the B<-d> flag tells the compiler -to insert source information into the parse trees it's about to hand off -to the interpreter. That means your code must first compile correctly -for the debugger to work on it. Then when the interpreter starts up, it -preloads a special Perl library file containing the debugger. - -The program will halt I the first run-time executable -statement (but see below regarding compile-time statements) and ask you -to enter a debugger command. Contrary to popular expectations, whenever -the debugger halts and shows you a line of code, it always displays the -line it's I to execute, rather than the one it has just executed. - -Any command not recognized by the debugger is directly executed -(C'd) as Perl code in the current package. (The debugger -uses the DB package for keeping its own state information.) - -For any text entered at the debugger prompt, leading and trailing whitespace -is first stripped before further processing. If a debugger command -coincides with some function in your own program, merely precede the -function with something that doesn't look like a debugger command, such -as a leading C<;> or perhaps a C<+>, or by wrapping it with parentheses -or braces. - -=head2 Debugger Commands - -The debugger understands the following commands: - -=over 12 - -=item h [command] - -Prints out a help message. - -If you supply another debugger command as an argument to the C command, -it prints out the description for just that command. The special -argument of C produces a more compact help listing, designed to fit -together on one screen. - -If the output of the C command (or any command, for that matter) scrolls -past your screen, precede the command with a leading pipe symbol so -that it's run through your pager, as in - - DB> |h - -You may change the pager which is used via C command. - -=item p expr - -Same as C in the current package. In particular, -because this is just Perl's own C function, this means that nested -data structures and objects are not dumped, unlike with the C command. - -The C filehandle is opened to F, regardless of -where STDOUT may be redirected to. - -=item x expr - -Evaluates its expression in list context and dumps out the result -in a pretty-printed fashion. Nested data structures are printed out -recursively, unlike the real C function in Perl. -See L if you'd like to do this yourself. - -The output format is governed by multiple options described under -L<"Configurable Options">. - -=item V [pkg [vars]] - -Display all (or some) variables in package (defaulting to C

    ) -using a data pretty-printer (hashes show their keys and values so -you see what's what, control characters are made printable, etc.). -Make sure you don't put the type specifier (like C<$>) there, just -the symbol names, like this: - - V DB filename line - -Use C<~pattern> and C for positive and negative regexes. - -This is similar to calling the C command on each applicable var. - -=item X [vars] - -Same as C. - -=item T - -Produce a stack backtrace. See below for details on its output. - -=item s [expr] - -Single step. Executes until the beginning of another -statement, descending into subroutine calls. If an expression is -supplied that includes function calls, it too will be single-stepped. - -=item n [expr] - -Next. Executes over subroutine calls, until the beginning -of the next statement. If an expression is supplied that includes -function calls, those functions will be executed with stops before -each statement. - -=item r - -Continue until the return from the current subroutine. -Dump the return value if the C option is set (default). - -=item - -Repeat last C or C command. - -=item c [line|sub] - -Continue, optionally inserting a one-time-only breakpoint -at the specified line or subroutine. - -=item l - -List next window of lines. - -=item l min+incr - -List C lines starting at C. - -=item l min-max - -List lines C through C. C is synonymous to C<->. - -=item l line - -List a single line. - -=item l subname - -List first window of lines from subroutine. I may -be a variable that contains a code reference. - -=item - - -List previous window of lines. - -=item w [line] - -List window (a few lines) around the current line. - -=item . - -Return the internal debugger pointer to the line last -executed, and print out that line. - -=item f filename - -Switch to viewing a different file or C statement. If I -is not a full pathname found in the values of %INC, it is considered -a regex. - -Ced strings (when accessible) are considered to be filenames: -C and C access the body of the 7th Ced string -(in the order of execution). The bodies of the currently executed C -and of Ced strings that define subroutines are saved and thus -accessible. - -=item /pattern/ - -Search forwards for pattern (a Perl regex); final / is optional. - -=item ?pattern? - -Search backwards for pattern; final ? is optional. - -=item L - -List all breakpoints and actions. - -=item S [[!]regex] - -List subroutine names [not] matching the regex. - -=item t - -Toggle trace mode (see also the C option). - -=item t expr - -Trace through execution of C. -See L for examples. - -=item b [line] [condition] - -Set a breakpoint before the given line. If I is omitted, set a -breakpoint on the line about to be executed. If a condition -is specified, it's evaluated each time the statement is reached: a -breakpoint is taken only if the condition is true. Breakpoints may -only be set on lines that begin an executable statement. Conditions -don't use C: - - b 237 $x > 30 - b 237 ++$count237 < 11 - b 33 /pattern/i - -=item b subname [condition] - -Set a breakpoint before the first line of the named subroutine. I may -be a variable containing a code reference (in this case I -is not supported). - -=item b postpone subname [condition] - -Set a breakpoint at first line of subroutine after it is compiled. - -=item b load filename - -Set a breakpoint before the first executed line of the I, -which should be a full pathname found amongst the %INC values. - -=item b compile subname - -Sets a breakpoint before the first statement executed after the specified -subroutine is compiled. - -=item d [line] - -Delete a breakpoint from the specified I. If I is omitted, deletes -the breakpoint from the line about to be executed. - -=item D - -Delete all installed breakpoints. - -=item a [line] command - -Set an action to be done before the line is executed. If I is -omitted, set an action on the line about to be executed. -The sequence of steps taken by the debugger is - - 1. check for a breakpoint at this line - 2. print the line if necessary (tracing) - 3. do any actions associated with that line - 4. prompt user if at a breakpoint or in single-step - 5. evaluate line - -For example, this will print out $foo every time line -53 is passed: - - a 53 print "DB FOUND $foo\n" - -=item a [line] - -Delete an action from the specified line. If I is omitted, delete -the action on the line that is about to be executed. - -=item A - -Delete all installed actions. - -=item W expr - -Add a global watch-expression. We hope you know what one of these -is, because they're supposed to be obvious. B: It is far -too easy to destroy your watch expressions by accidentally omitting -the I. - -=item W - -Delete all watch-expressions. - -=item O booloption ... - -Set each listed Boolean option to the value C<1>. - -=item O anyoption? ... - -Print out the value of one or more options. - -=item O option=value ... - -Set the value of one or more options. If the value has internal -whitespace, it should be quoted. For example, you could set C to call B with those specific options. -You may use either single or double quotes, but if you do, you must -escape any embedded instances of same sort of quote you began with, -as well as any escaping any escapes that immediately precede that -quote but which are not meant to escape the quote itself. In other -words, you follow single-quoting rules irrespective of the quote; -eg: C or C. - -For historical reasons, the C<=value> is optional, but defaults to -1 only where it is safe to do so--that is, mostly for Boolean -options. It is always better to assign a specific value using C<=>. -The C
    package and type - - @articles = sort {$b <=> $a} @files; - -then C<$a> and C<$b> are C<$main::a> and C<$main::b> (or C<$::a> and C<$::b>), -but if you're in the C package, it's the same as typing - - @articles = sort {$FooPack::b <=> $FooPack::a} @files; - -The comparison function is required to behave. If it returns -inconsistent results (sometimes saying C<$x[1]> is less than C<$x[2]> and -sometimes saying the opposite, for example) the results are not -well-defined. - -=item splice ARRAY,OFFSET,LENGTH,LIST - -=item splice ARRAY,OFFSET,LENGTH - -=item splice ARRAY,OFFSET - -=item splice ARRAY - -Removes the elements designated by OFFSET and LENGTH from an array, and -replaces them with the elements of LIST, if any. In list context, -returns the elements removed from the array. In scalar context, -returns the last element removed, or C if no elements are -removed. The array grows or shrinks as necessary. -If OFFSET is negative then it starts that far from the end of the array. -If LENGTH is omitted, removes everything from OFFSET onward. -If LENGTH is negative, leaves that many elements off the end of the array. -If both OFFSET and LENGTH are omitted, removes everything. - -The following equivalences hold (assuming C<$[ == 0>): - - push(@a,$x,$y) splice(@a,@a,0,$x,$y) - pop(@a) splice(@a,-1) - shift(@a) splice(@a,0,1) - unshift(@a,$x,$y) splice(@a,0,0,$x,$y) - $a[$x] = $y splice(@a,$x,1,$y) - -Example, assuming array lengths are passed before arrays: - - sub aeq { # compare two list values - my(@a) = splice(@_,0,shift); - my(@b) = splice(@_,0,shift); - return 0 unless @a == @b; # same len? - while (@a) { - return 0 if pop(@a) ne pop(@b); - } - return 1; - } - if (&aeq($len,@foo[1..$len],0+@bar,@bar)) { ... } - -=item split /PATTERN/,EXPR,LIMIT - -=item split /PATTERN/,EXPR - -=item split /PATTERN/ - -=item split - -Splits a string into a list of strings and returns that list. By default, -empty leading fields are preserved, and empty trailing ones are deleted. - -In scalar context, returns the number of fields found and splits into -the C<@_> array. Use of split in scalar context is deprecated, however, -because it clobbers your subroutine arguments. - -If EXPR is omitted, splits the C<$_> string. If PATTERN is also omitted, -splits on whitespace (after skipping any leading whitespace). Anything -matching PATTERN is taken to be a delimiter separating the fields. (Note -that the delimiter may be longer than one character.) - -If LIMIT is specified and positive, splits into no more than that -many fields (though it may split into fewer). If LIMIT is unspecified -or zero, trailing null fields are stripped (which potential users -of C would do well to remember). If LIMIT is negative, it is -treated as if an arbitrarily large LIMIT had been specified. - -A pattern matching the null string (not to be confused with -a null pattern C, which is just one member of the set of patterns -matching a null string) will split the value of EXPR into separate -characters at each point it matches that way. For example: - - print join(':', split(/ */, 'hi there')); - -produces the output 'h:i:t:h:e:r:e'. - -Empty leading (or trailing) fields are produced when there positive width -matches at the beginning (or end) of the string; a zero-width match at the -beginning (or end) of the string does not produce an empty field. For -example: - - print join(':', split(/(?=\w)/, 'hi there!')); - -produces the output 'h:i :t:h:e:r:e!'. - -The LIMIT parameter can be used to split a line partially - - ($login, $passwd, $remainder) = split(/:/, $_, 3); - -When assigning to a list, if LIMIT is omitted, Perl supplies a LIMIT -one larger than the number of variables in the list, to avoid -unnecessary work. For the list above LIMIT would have been 4 by -default. In time critical applications it behooves you not to split -into more fields than you really need. - -If the PATTERN contains parentheses, additional list elements are -created from each matching substring in the delimiter. - - split(/([,-])/, "1-10,20", 3); - -produces the list value - - (1, '-', 10, ',', 20) - -If you had the entire header of a normal Unix email message in $header, -you could split it up into fields and their values this way: - - $header =~ s/\n\s+/ /g; # fix continuation lines - %hdrs = (UNIX_FROM => split /^(\S*?):\s*/m, $header); - -The pattern C may be replaced with an expression to specify -patterns that vary at runtime. (To do runtime compilation only once, -use C.) - -As a special case, specifying a PATTERN of space (C<' '>) will split on -white space just as C with no arguments does. Thus, C can -be used to emulate B's default behavior, whereas C -will give you as many null initial fields as there are leading spaces. -A C on C is like a C except that any leading -whitespace produces a null first field. A C with no arguments -really does a C internally. - -A PATTERN of C is treated as if it were C, since it isn't -much use otherwise. - -Example: - - open(PASSWD, '/etc/passwd'); - while () { - chomp; - ($login, $passwd, $uid, $gid, - $gcos, $home, $shell) = split(/:/); - #... - } - - -=item sprintf FORMAT, LIST - -Returns a string formatted by the usual C conventions of the C -library function C. See below for more details -and see L or L on your system for an explanation of -the general principles. - -For example: - - # Format number with up to 8 leading zeroes - $result = sprintf("%08d", $number); - - # Round number to 3 digits after decimal point - $rounded = sprintf("%.3f", $number); - -Perl does its own C formatting--it emulates the C -function C, but it doesn't use it (except for floating-point -numbers, and even then only the standard modifiers are allowed). As a -result, any non-standard extensions in your local C are not -available from Perl. - -Unlike C, C does not do what you probably mean when you -pass it an array as your first argument. The array is given scalar context, -and instead of using the 0th element of the array as the format, Perl will -use the count of elements in the array as the format, which is almost never -useful. - -Perl's C permits the following universally-known conversions: - - %% a percent sign - %c a character with the given number - %s a string - %d a signed integer, in decimal - %u an unsigned integer, in decimal - %o an unsigned integer, in octal - %x an unsigned integer, in hexadecimal - %e a floating-point number, in scientific notation - %f a floating-point number, in fixed decimal notation - %g a floating-point number, in %e or %f notation - -In addition, Perl permits the following widely-supported conversions: - - %X like %x, but using upper-case letters - %E like %e, but using an upper-case "E" - %G like %g, but with an upper-case "E" (if applicable) - %b an unsigned integer, in binary - %p a pointer (outputs the Perl value's address in hexadecimal) - %n special: *stores* the number of characters output so far - into the next variable in the parameter list - -Finally, for backward (and we do mean "backward") compatibility, Perl -permits these unnecessary but widely-supported conversions: - - %i a synonym for %d - %D a synonym for %ld - %U a synonym for %lu - %O a synonym for %lo - %F a synonym for %f - -Note that the number of exponent digits in the scientific notation by -C<%e>, C<%E>, C<%g> and C<%G> for numbers with the modulus of the -exponent less than 100 is system-dependent: it may be three or less -(zero-padded as necessary). In other words, 1.23 times ten to the -99th may be either "1.23e99" or "1.23e099". - -Perl permits the following universally-known flags between the C<%> -and the conversion letter: - - space prefix positive number with a space - + prefix positive number with a plus sign - - left-justify within the field - 0 use zeros, not spaces, to right-justify - # prefix non-zero octal with "0", non-zero hex with "0x" - number minimum field width - .number "precision": digits after decimal point for - floating-point, max length for string, minimum length - for integer - l interpret integer as C type "long" or "unsigned long" - h interpret integer as C type "short" or "unsigned short" - If no flags, interpret integer as C type "int" or "unsigned" - -There are also two Perl-specific flags: - - V interpret integer as Perl's standard integer type - v interpret string as a vector of integers, output as - numbers separated either by dots, or by an arbitrary - string received from the argument list when the flag - is preceded by C<*> - -Where a number would appear in the flags, an asterisk (C<*>) may be -used instead, in which case Perl uses the next item in the parameter -list as the given number (that is, as the field width or precision). -If a field width obtained through C<*> is negative, it has the same -effect as the C<-> flag: left-justification. - -The C flag is useful for displaying ordinal values of characters -in arbitrary strings: - - printf "version is v%vd\n", $^V; # Perl's version - printf "address is %*vX\n", ":", $addr; # IPv6 address - printf "bits are %*vb\n", " ", $bits; # random bitstring - -If C is in effect, the character used for the decimal -point in formatted real numbers is affected by the LC_NUMERIC locale. -See L. - -If Perl understands "quads" (64-bit integers) (this requires -either that the platform natively support quads or that Perl -be specifically compiled to support quads), the characters - - d u o x X b i D U O - -print quads, and they may optionally be preceded by - - ll L q - -For example - - %lld %16LX %qo - -You can find out whether your Perl supports quads via L: - - use Config; - ($Config{use64bitint} eq 'define' || $Config{longsize} == 8) && - print "quads\n"; - -If Perl understands "long doubles" (this requires that the platform -support long doubles), the flags - - e f g E F G - -may optionally be preceded by - - ll L - -For example - - %llf %Lg - -You can find out whether your Perl supports long doubles via L: - - use Config; - $Config{d_longdbl} eq 'define' && print "long doubles\n"; - -=item sqrt EXPR - -=item sqrt - -Return the square root of EXPR. If EXPR is omitted, returns square -root of C<$_>. Only works on non-negative operands, unless you've -loaded the standard Math::Complex module. - - use Math::Complex; - print sqrt(-2); # prints 1.4142135623731i - -=item srand EXPR - -=item srand - -Sets the random number seed for the C operator. If EXPR is -omitted, uses a semi-random value supplied by the kernel (if it supports -the F device) or based on the current time and process -ID, among other things. In versions of Perl prior to 5.004 the default -seed was just the current C
    . If you have multiply nested -packages, pass their names to C, separated by C<::> as in the Perl -language itself. - -Alternately, if you have an SV that is a blessed reference, you can find -out the stash pointer by using: - - HV* SvSTASH(SvRV(SV*)); - -then use the following to get the package name itself: - - char* HvNAME(HV* stash); - -If you need to bless or re-bless an object you can use the following -function: - - SV* sv_bless(SV*, HV* stash) - -where the first argument, an C, must be a reference, and the second -argument is a stash. The returned C can now be used in the same way -as any other SV. - -For more information on references and blessings, consult L. - -=head2 Double-Typed SVs - -Scalar variables normally contain only one type of value, an integer, -double, pointer, or reference. Perl will automatically convert the -actual scalar data from the stored type into the requested type. - -Some scalar variables contain more than one type of scalar data. For -example, the variable C<$!> contains either the numeric value of C -or its string equivalent from either C or C. - -To force multiple data values into an SV, you must do two things: use the -C routines to add the additional scalar type, then set a flag -so that Perl will believe it contains more than one type of data. The -four macros to set the flags are: - - SvIOK_on - SvNOK_on - SvPOK_on - SvROK_on - -The particular macro you must use depends on which C routine -you called first. This is because every C routine turns on -only the bit for the particular type of data being set, and turns off -all the rest. - -For example, to create a new Perl variable called "dberror" that contains -both the numeric and descriptive string error values, you could use the -following code: - - extern int dberror; - extern char *dberror_list; - - SV* sv = get_sv("dberror", TRUE); - sv_setiv(sv, (IV) dberror); - sv_setpv(sv, dberror_list[dberror]); - SvIOK_on(sv); - -If the order of C and C had been reversed, then the -macro C would need to be called instead of C. - -=head2 Magic Variables - -[This section still under construction. Ignore everything here. Post no -bills. Everything not permitted is forbidden.] - -Any SV may be magical, that is, it has special features that a normal -SV does not have. These features are stored in the SV structure in a -linked list of C's, typedef'ed to C. - - struct magic { - MAGIC* mg_moremagic; - MGVTBL* mg_virtual; - U16 mg_private; - char mg_type; - U8 mg_flags; - SV* mg_obj; - char* mg_ptr; - I32 mg_len; - }; - -Note this is current as of patchlevel 0, and could change at any time. - -=head2 Assigning Magic - -Perl adds magic to an SV using the sv_magic function: - - void sv_magic(SV* sv, SV* obj, int how, const char* name, I32 namlen); - -The C argument is a pointer to the SV that is to acquire a new magical -feature. - -If C is not already magical, Perl uses the C macro to -set the C flag for the C. Perl then continues by adding -it to the beginning of the linked list of magical features. Any prior -entry of the same type of magic is deleted. Note that this can be -overridden, and multiple instances of the same type of magic can be -associated with an SV. - -The C and C arguments are used to associate a string with -the magic, typically the name of a variable. C is stored in the -C field and if C is non-null and C >= 0 a malloc'd -copy of the name is stored in C field. - -The sv_magic function uses C to determine which, if any, predefined -"Magic Virtual Table" should be assigned to the C field. -See the "Magic Virtual Table" section below. The C argument is also -stored in the C field. - -The C argument is stored in the C field of the C -structure. If it is not the same as the C argument, the reference -count of the C object is incremented. If it is the same, or if -the C argument is "#", or if it is a NULL pointer, then C is -merely stored, without the reference count being incremented. - -There is also a function to add magic to an C: - - void hv_magic(HV *hv, GV *gv, int how); - -This simply calls C and coerces the C argument into an C. - -To remove the magic from an SV, call the function sv_unmagic: - - void sv_unmagic(SV *sv, int type); - -The C argument should be equal to the C value when the C -was initially made magical. - -=head2 Magic Virtual Tables - -The C field in the C structure is a pointer to a -C, which is a structure of function pointers and stands for -"Magic Virtual Table" to handle the various operations that might be -applied to that variable. - -The C has five pointers to the following routine types: - - int (*svt_get)(SV* sv, MAGIC* mg); - int (*svt_set)(SV* sv, MAGIC* mg); - U32 (*svt_len)(SV* sv, MAGIC* mg); - int (*svt_clear)(SV* sv, MAGIC* mg); - int (*svt_free)(SV* sv, MAGIC* mg); - -This MGVTBL structure is set at compile-time in C and there are -currently 19 types (or 21 with overloading turned on). These different -structures contain pointers to various routines that perform additional -actions depending on which function is being called. - - Function pointer Action taken - ---------------- ------------ - svt_get Do something after the value of the SV is retrieved. - svt_set Do something after the SV is assigned a value. - svt_len Report on the SV's length. - svt_clear Clear something the SV represents. - svt_free Free any extra storage associated with the SV. - -For instance, the MGVTBL structure called C (which corresponds -to an C of '\0') contains: - - { magic_get, magic_set, magic_len, 0, 0 } - -Thus, when an SV is determined to be magical and of type '\0', if a get -operation is being performed, the routine C is called. All -the various routines for the various magical types begin with C. -NOTE: the magic routines are not considered part of the Perl API, and may -not be exported by the Perl library. - -The current kinds of Magic Virtual Tables are: - - mg_type MGVTBL Type of magic - ------- ------ ---------------------------- - \0 vtbl_sv Special scalar variable - A vtbl_amagic %OVERLOAD hash - a vtbl_amagicelem %OVERLOAD hash element - c (none) Holds overload table (AMT) on stash - B vtbl_bm Boyer-Moore (fast string search) - D vtbl_regdata Regex match position data (@+ and @- vars) - d vtbl_regdatum Regex match position data element - E vtbl_env %ENV hash - e vtbl_envelem %ENV hash element - f vtbl_fm Formline ('compiled' format) - g vtbl_mglob m//g target / study()ed string - I vtbl_isa @ISA array - i vtbl_isaelem @ISA array element - k vtbl_nkeys scalar(keys()) lvalue - L (none) Debugger %_'s -C field points to a C structure: - - struct ufuncs { - I32 (*uf_val)(IV, SV*); - I32 (*uf_set)(IV, SV*); - IV uf_index; - }; - -When the SV is read from or written to, the C or C -function will be called with C as the first arg and a -pointer to the SV as the second. A simple example of how to add 'U' -magic is shown below. Note that the ufuncs structure is copied by -sv_magic, so you can safely allocate it on the stack. - - void - Umagic(sv) - SV *sv; - PREINIT: - struct ufuncs uf; - CODE: - uf.uf_val = &my_get_fn; - uf.uf_set = &my_set_fn; - uf.uf_index = 0; - sv_magic(sv, 0, 'U', (char*)&uf, sizeof(uf)); - -Note that because multiple extensions may be using '~' or 'U' magic, -it is important for extensions to take extra care to avoid conflict. -Typically only using the magic on objects blessed into the same class -as the extension is sufficient. For '~' magic, it may also be -appropriate to add an I32 'signature' at the top of the private data -area and check that. - -Also note that the C and C functions described -earlier do B invoke 'set' magic on their targets. This must -be done by the user either by calling the C macro after -calling these functions, or by using one of the C or -C functions. Similarly, generic C code must call the -C macro to invoke any 'get' magic if they use an SV -obtained from external sources in functions that don't handle magic. -See L for a description of these functions. -For example, calls to the C functions typically need to be -followed by C, but they don't need a prior C -since their implementation handles 'get' magic. - -=head2 Finding Magic - - MAGIC* mg_find(SV*, int type); /* Finds the magic pointer of that type */ - -This routine returns a pointer to the C structure stored in the SV. -If the SV does not have that magical feature, C is returned. Also, -if the SV is not of type SVt_PVMG, Perl may core dump. - - int mg_copy(SV* sv, SV* nsv, const char* key, STRLEN klen); - -This routine checks to see what types of magic C has. If the mg_type -field is an uppercase letter, then the mg_obj is copied to C, but -the mg_type field is changed to be the lowercase letter. - -=head2 Understanding the Magic of Tied Hashes and Arrays - -Tied hashes and arrays are magical beasts of the 'P' magic type. - -WARNING: As of the 5.004 release, proper usage of the array and hash -access functions requires understanding a few caveats. Some -of these caveats are actually considered bugs in the API, to be fixed -in later releases, and are bracketed with [MAYCHANGE] below. If -you find yourself actually applying such information in this section, be -aware that the behavior may change in the future, umm, without warning. - -The perl tie function associates a variable with an object that implements -the various GET, SET etc methods. To perform the equivalent of the perl -tie function from an XSUB, you must mimic this behaviour. The code below -carries out the necessary steps - firstly it creates a new hash, and then -creates a second hash which it blesses into the class which will implement -the tie methods. Lastly it ties the two hashes together, and returns a -reference to the new tied hash. Note that the code below does NOT call the -TIEHASH method in the MyTie class - -see L for details on how -to do this. - - SV* - mytie() - PREINIT: - HV *hash; - HV *stash; - SV *tie; - CODE: - hash = newHV(); - tie = newRV_noinc((SV*)newHV()); - stash = gv_stashpv("MyTie", TRUE); - sv_bless(tie, stash); - hv_magic(hash, tie, 'P'); - RETVAL = newRV_noinc(hash); - OUTPUT: - RETVAL - -The C function, when given a tied array argument, merely -copies the magic of the array onto the value to be "stored", using -C. It may also return NULL, indicating that the value did not -actually need to be stored in the array. [MAYCHANGE] After a call to -C on a tied array, the caller will usually need to call -C to actually invoke the perl level "STORE" method on the -TIEARRAY object. If C did return NULL, a call to -C will also be usually necessary to avoid a memory -leak. [/MAYCHANGE] - -The previous paragraph is applicable verbatim to tied hash access using the -C and C functions as well. - -C and the corresponding hash functions C and -C actually return an undefined mortal value whose magic -has been initialized using C. Note the value so returned does not -need to be deallocated, as it is already mortal. [MAYCHANGE] But you will -need to call C on the returned value in order to actually invoke -the perl level "FETCH" method on the underlying TIE object. Similarly, -you may also call C on the return value after possibly assigning -a suitable value to it using C, which will invoke the "STORE" -method on the TIE object. [/MAYCHANGE] - -[MAYCHANGE] -In other words, the array or hash fetch/store functions don't really -fetch and store actual values in the case of tied arrays and hashes. They -merely call C to attach magic to the values that were meant to be -"stored" or "fetched". Later calls to C and C actually -do the job of invoking the TIE methods on the underlying objects. Thus -the magic mechanism currently implements a kind of lazy access to arrays -and hashes. - -Currently (as of perl version 5.004), use of the hash and array access -functions requires the user to be aware of whether they are operating on -"normal" hashes and arrays, or on their tied variants. The API may be -changed to provide more transparent access to both tied and normal data -types in future versions. -[/MAYCHANGE] - -You would do well to understand that the TIEARRAY and TIEHASH interfaces -are mere sugar to invoke some perl method calls while using the uniform hash -and array syntax. The use of this sugar imposes some overhead (typically -about two to four extra opcodes per FETCH/STORE operation, in addition to -the creation of all the mortal variables required to invoke the methods). -This overhead will be comparatively small if the TIE methods are themselves -substantial, but if they are only a few statements long, the overhead -will not be insignificant. - -=head2 Localizing changes - -Perl has a very handy construction - - { - local $var = 2; - ... - } - -This construction is I equivalent to - - { - my $oldvar = $var; - $var = 2; - ... - $var = $oldvar; - } - -The biggest difference is that the first construction would -reinstate the initial value of $var, irrespective of how control exits -the block: C, C, C/C etc. It is a little bit -more efficient as well. - -There is a way to achieve a similar task from C via Perl API: create a -I, and arrange for some changes to be automatically -undone at the end of it, either explicit, or via a non-local exit (via -die()). A I-like construct is created by a pair of -C/C macros (see L). -Such a construct may be created specially for some important localized -task, or an existing one (like boundaries of enclosing Perl -subroutine/block, or an existing pair for freeing TMPs) may be -used. (In the second case the overhead of additional localization must -be almost negligible.) Note that any XSUB is automatically enclosed in -an C/C pair. - -Inside such a I the following service is available: - -=over 4 - -=item C - -=item C - -=item C - -=item C - -These macros arrange things to restore the value of integer variable -C at the end of enclosing I. - -=item C - -=item C - -These macros arrange things to restore the value of pointers C and -C

    . C must be a pointer of a type which survives conversion to -C and back, C

    should be able to survive conversion to C -and back. - -=item C - -The refcount of C would be decremented at the end of -I. This is similar to C in that it is also a -mechanism for doing a delayed C. However, while C -extends the lifetime of C until the beginning of the next statement, -C extends it until the end of the enclosing scope. These -lifetimes can be wildly different. - -Also compare C. - -=item C - -Just like C, but mortalizes C at the end of the current -scope instead of decrementing its reference count. This usually has the -effect of keeping C alive until the statement that called the currently -live scope has finished executing. - -=item C - -The C is op_free()ed at the end of I. - -=item C - -The chunk of memory which is pointed to by C

    is Safefree()ed at the -end of I. - -=item C - -Clears a slot in the current scratchpad which corresponds to C at -the end of I. - -=item C - -The key C of C is deleted at the end of I. The -string pointed to by C is Safefree()ed. If one has a I in -short-lived storage, the corresponding string may be reallocated like -this: - - SAVEDELETE(PL_defstash, savepv(tmpbuf), strlen(tmpbuf)); - -=item C - -At the end of I the function C is called with the -only argument C

    . - -=item C - -At the end of I the function C is called with the -implicit context argument (if any), and C

    . - -=item C - -The current offset on the Perl internal stack (cf. C) is restored -at the end of I. - -=back - -The following API list contains functions, thus one needs to -provide pointers to the modifiable data explicitly (either C pointers, -or Perlish Cs). Where the above macros take C, a similar -function takes C. - -=over 4 - -=item C - -Equivalent to Perl code C. - -=item C - -=item C - -Similar to C, but localize C<@gv> and C<%gv>. - -=item C - -Duplicates the current value of C, on the exit from the current -C/C I will restore the value of C -using the stored value. - -=item C - -A variant of C which takes multiple arguments via an array -C of C of length C. - -=item C - -Similar to C, but will reinstate a C. - -=item C - -=item C - -Similar to C, but localize C and C. - -=back - -The C module implements localization of the basic types within the -I. People who are interested in how to localize things in -the containing scope should take a look there too. - -=head1 Subroutines - -=head2 XSUBs and the Argument Stack - -The XSUB mechanism is a simple way for Perl programs to access C subroutines. -An XSUB routine will have a stack that contains the arguments from the Perl -program, and a way to map from the Perl data structures to a C equivalent. - -The stack arguments are accessible through the C macro, which returns -the C'th stack argument. Argument 0 is the first argument passed in the -Perl subroutine call. These arguments are C, and can be used anywhere -an C is used. - -Most of the time, output from the C routine can be handled through use of -the RETVAL and OUTPUT directives. However, there are some cases where the -argument stack is not already long enough to handle all the return values. -An example is the POSIX tzname() call, which takes no arguments, but returns -two, the local time zone's standard and summer time abbreviations. - -To handle this situation, the PPCODE directive is used and the stack is -extended using the macro: - - EXTEND(SP, num); - -where C is the macro that represents the local copy of the stack pointer, -and C is the number of elements the stack should be extended by. - -Now that there is room on the stack, values can be pushed on it using the -macros to push IVs, doubles, strings, and SV pointers respectively: - - PUSHi(IV) - PUSHn(double) - PUSHp(char*, I32) - PUSHs(SV*) - -And now the Perl program calling C, the two values will be assigned -as in: - - ($standard_abbrev, $summer_abbrev) = POSIX::tzname; - -An alternate (and possibly simpler) method to pushing values on the stack is -to use the macros: - - XPUSHi(IV) - XPUSHn(double) - XPUSHp(char*, I32) - XPUSHs(SV*) - -These macros automatically adjust the stack for you, if needed. Thus, you -do not need to call C to extend the stack. -However, see L - -For more information, consult L and L. - -=head2 Calling Perl Routines from within C Programs - -There are four routines that can be used to call a Perl subroutine from -within a C program. These four are: - - I32 call_sv(SV*, I32); - I32 call_pv(const char*, I32); - I32 call_method(const char*, I32); - I32 call_argv(const char*, I32, register char**); - -The routine most often used is C. The C argument -contains either the name of the Perl subroutine to be called, or a -reference to the subroutine. The second argument consists of flags -that control the context in which the subroutine is called, whether -or not the subroutine is being passed arguments, how errors should be -trapped, and how to treat return values. - -All four routines return the number of arguments that the subroutine returned -on the Perl stack. - -These routines used to be called C etc., before Perl v5.6.0, -but those names are now deprecated; macros of the same name are provided for -compatibility. - -When using any of these routines (except C), the programmer -must manipulate the Perl stack. These include the following macros and -functions: - - dSP - SP - PUSHMARK() - PUTBACK - SPAGAIN - ENTER - SAVETMPS - FREETMPS - LEAVE - XPUSH*() - POP*() - -For a detailed description of calling conventions from C to Perl, -consult L. - -=head2 Memory Allocation - -All memory meant to be used with the Perl API functions should be manipulated -using the macros described in this section. The macros provide the necessary -transparency between differences in the actual malloc implementation that is -used within perl. - -It is suggested that you enable the version of malloc that is distributed -with Perl. It keeps pools of various sizes of unallocated memory in -order to satisfy allocation requests more quickly. However, on some -platforms, it may cause spurious malloc or free errors. - - New(x, pointer, number, type); - Newc(x, pointer, number, type, cast); - Newz(x, pointer, number, type); - -These three macros are used to initially allocate memory. - -The first argument C was a "magic cookie" that was used to keep track -of who called the macro, to help when debugging memory problems. However, -the current code makes no use of this feature (most Perl developers now -use run-time memory checkers), so this argument can be any number. - -The second argument C should be the name of a variable that will -point to the newly allocated memory. - -The third and fourth arguments C and C specify how many of -the specified type of data structure should be allocated. The argument -C is passed to C. The final argument to C, C, -should be used if the C argument is different from the C -argument. - -Unlike the C and C macros, the C macro calls C -to zero out all the newly allocated memory. - - Renew(pointer, number, type); - Renewc(pointer, number, type, cast); - Safefree(pointer) - -These three macros are used to change a memory buffer size or to free a -piece of memory no longer needed. The arguments to C and C -match those of C and C with the exception of not needing the -"magic cookie" argument. - - Move(source, dest, number, type); - Copy(source, dest, number, type); - Zero(dest, number, type); - -These three macros are used to move, copy, or zero out previously allocated -memory. The C and C arguments point to the source and -destination starting points. Perl will move, copy, or zero out C -instances of the size of the C data structure (using the C -function). - -=head2 PerlIO - -The most recent development releases of Perl has been experimenting with -removing Perl's dependency on the "normal" standard I/O suite and allowing -other stdio implementations to be used. This involves creating a new -abstraction layer that then calls whichever implementation of stdio Perl -was compiled with. All XSUBs should now use the functions in the PerlIO -abstraction layer and not make any assumptions about what kind of stdio -is being used. - -For a complete description of the PerlIO abstraction, consult L. - -=head2 Putting a C value on Perl stack - -A lot of opcodes (this is an elementary operation in the internal perl -stack machine) put an SV* on the stack. However, as an optimization -the corresponding SV is (usually) not recreated each time. The opcodes -reuse specially assigned SVs (Is) which are (as a corollary) -not constantly freed/created. - -Each of the targets is created only once (but see -L below), and when an opcode needs to put -an integer, a double, or a string on stack, it just sets the -corresponding parts of its I and puts the I on stack. - -The macro to put this target on stack is C, and it is -directly used in some opcodes, as well as indirectly in zillions of -others, which use it via C<(X)PUSH[pni]>. - -Because the target is reused, you must be careful when pushing multiple -values on the stack. The following code will not do what you think: - - XPUSHi(10); - XPUSHi(20); - -This translates as "set C to 10, push a pointer to C onto -the stack; set C to 20, push a pointer to C onto the stack". -At the end of the operation, the stack does not contain the values 10 -and 20, but actually contains two pointers to C, which we have set -to 20. If you need to push multiple different values, use C, -which bypasses C. - -On a related note, if you do use C<(X)PUSH[npi]>, then you're going to -need a C in your variable declarations so that the C<*PUSH*> -macros can make use of the local variable C. - -=head2 Scratchpads - -The question remains on when the SVs which are Is for opcodes -are created. The answer is that they are created when the current unit -- -a subroutine or a file (for opcodes for statements outside of -subroutines) -- is compiled. During this time a special anonymous Perl -array is created, which is called a scratchpad for the current -unit. - -A scratchpad keeps SVs which are lexicals for the current unit and are -targets for opcodes. One can deduce that an SV lives on a scratchpad -by looking on its flags: lexicals have C set, and -Is have C set. - -The correspondence between OPs and Is is not 1-to-1. Different -OPs in the compile tree of the unit can use the same target, if this -would not conflict with the expected life of the temporary. - -=head2 Scratchpads and recursion - -In fact it is not 100% true that a compiled unit contains a pointer to -the scratchpad AV. In fact it contains a pointer to an AV of -(initially) one element, and this element is the scratchpad AV. Why do -we need an extra level of indirection? - -The answer is B, and maybe (sometime soon) B. Both -these can create several execution pointers going into the same -subroutine. For the subroutine-child not write over the temporaries -for the subroutine-parent (lifespan of which covers the call to the -child), the parent and the child should have different -scratchpads. (I the lexicals should be separate anyway!) - -So each subroutine is born with an array of scratchpads (of length 1). -On each entry to the subroutine it is checked that the current -depth of the recursion is not more than the length of this array, and -if it is, new scratchpad is created and pushed into the array. - -The Is on this scratchpad are Cs, but they are already -marked with correct flags. - -=head1 Compiled code - -=head2 Code tree - -Here we describe the internal form your code is converted to by -Perl. Start with a simple example: - - $a = $b + $c; - -This is converted to a tree similar to this one: - - assign-to - / \ - + $a - / \ - $b $c - -(but slightly more complicated). This tree reflects the way Perl -parsed your code, but has nothing to do with the execution order. -There is an additional "thread" going through the nodes of the tree -which shows the order of execution of the nodes. In our simplified -example above it looks like: - - $b ---> $c ---> + ---> $a ---> assign-to - -But with the actual compile tree for C<$a = $b + $c> it is different: -some nodes I. As a corollary, though the actual tree -contains more nodes than our simplified example, the execution order -is the same as in our example. - -=head2 Examining the tree - -If you have your perl compiled for debugging (usually done with C<-D -optimize=-g> on C command line), you may examine the -compiled tree by specifying C<-Dx> on the Perl command line. The -output takes several lines per node, and for C<$b+$c> it looks like -this: - - 5 TYPE = add ===> 6 - TARG = 1 - FLAGS = (SCALAR,KIDS) - { - TYPE = null ===> (4) - (was rv2sv) - FLAGS = (SCALAR,KIDS) - { - 3 TYPE = gvsv ===> 4 - FLAGS = (SCALAR) - GV = main::b - } - } - { - TYPE = null ===> (5) - (was rv2sv) - FLAGS = (SCALAR,KIDS) - { - 4 TYPE = gvsv ===> 5 - FLAGS = (SCALAR) - GV = main::c - } - } - -This tree has 5 nodes (one per C specifier), only 3 of them are -not optimized away (one per number in the left column). The immediate -children of the given node correspond to C<{}> pairs on the same level -of indentation, thus this listing corresponds to the tree: - - add - / \ - null null - | | - gvsv gvsv - -The execution order is indicated by C<===E> marks, thus it is C<3 -4 5 6> (node C<6> is not included into above listing), i.e., -C. - -Each of these nodes represents an op, a fundamental operation inside the -Perl core. The code which implements each operation can be found in the -F files; the function which implements the op with type C -is C, and so on. As the tree above shows, different ops have -different numbers of children: C is a binary operator, as one would -expect, and so has two children. To accommodate the various different -numbers of children, there are various types of op data structure, and -they link together in different ways. - -The simplest type of op structure is C: this has no children. Unary -operators, Cs, have one child, and this is pointed to by the -C field. Binary operators (Cs) have not only an -C field but also an C field. The most complex type of -op is a C, which has any number of children. In this case, the -first child is pointed to by C and the last child by -C. The children in between can be found by iteratively -following the C pointer from the first child to the last. - -There are also two other op types: a C holds a regular expression, -and has no children, and a C may or may not have children. If the -C field is non-zero, it behaves like a C. To -complicate matters, if a C is actually a C op after -optimization (see L) it will still -have children in accordance with its former type. - -=head2 Compile pass 1: check routines - -The tree is created by the compiler while I code feeds it -the constructions it recognizes. Since I works bottom-up, so does -the first pass of perl compilation. - -What makes this pass interesting for perl developers is that some -optimization may be performed on this pass. This is optimization by -so-called "check routines". The correspondence between node names -and corresponding check routines is described in F (do not -forget to run C if you modify this file). - -A check routine is called when the node is fully constructed except -for the execution-order thread. Since at this time there are no -back-links to the currently constructed node, one can do most any -operation to the top-level node, including freeing it and/or creating -new nodes above/below it. - -The check routine returns the node which should be inserted into the -tree (if the top-level node was not modified, check routine returns -its argument). - -By convention, check routines have names C. They are usually -called from C subroutines (or C) (which in turn are -called from F). - -=head2 Compile pass 1a: constant folding - -Immediately after the check routine is called the returned node is -checked for being compile-time executable. If it is (the value is -judged to be constant) it is immediately executed, and a I -node with the "return value" of the corresponding subtree is -substituted instead. The subtree is deleted. - -If constant folding was not performed, the execution-order thread is -created. - -=head2 Compile pass 2: context propagation - -When a context for a part of compile tree is known, it is propagated -down through the tree. At this time the context can have 5 values -(instead of 2 for runtime context): void, boolean, scalar, list, and -lvalue. In contrast with the pass 1 this pass is processed from top -to bottom: a node's context determines the context for its children. - -Additional context-dependent optimizations are performed at this time. -Since at this moment the compile tree contains back-references (via -"thread" pointers), nodes cannot be free()d now. To allow -optimized-away nodes at this stage, such nodes are null()ified instead -of free()ing (i.e. their type is changed to OP_NULL). - -=head2 Compile pass 3: peephole optimization - -After the compile tree for a subroutine (or for an C or a file) -is created, an additional pass over the code is performed. This pass -is neither top-down or bottom-up, but in the execution order (with -additional complications for conditionals). These optimizations are -done in the subroutine peep(). Optimizations performed at this stage -are subject to the same restrictions as in the pass 2. - -=head1 Examining internal data structures with the C functions - -To aid debugging, the source file F contains a number of -functions which produce formatted output of internal data structures. - -The most commonly used of these functions is C; it's used -for dumping SVs, AVs, HVs, and CVs. The C module calls -C to produce debugging output from Perl-space, so users of that -module should already be familiar with its format. - -C can be used to dump an C structure or any of its -derivatives, and produces output similiar to C; in fact, -C will dump the main root of the code being evaluated, -exactly like C<-Dx>. - -Other useful functions are C, which turns a C into an -op tree, C which calls C on all the -subroutines in a package like so: (Thankfully, these are all xsubs, so -there is no op tree) - - (gdb) print Perl_dump_packsubs(PL_defstash) - - SUB attributes::bootstrap = (xsub 0x811fedc 0) - - SUB UNIVERSAL::can = (xsub 0x811f50c 0) - - SUB UNIVERSAL::isa = (xsub 0x811f304 0) - - SUB UNIVERSAL::VERSION = (xsub 0x811f7ac 0) - - SUB DynaLoader::boot_DynaLoader = (xsub 0x805b188 0) - -and C, which dumps all the subroutines in the stash and -the op tree of the main root. - -=head1 How multiple interpreters and concurrency are supported - -=head2 Background and PERL_IMPLICIT_CONTEXT - -The Perl interpreter can be regarded as a closed box: it has an API -for feeding it code or otherwise making it do things, but it also has -functions for its own use. This smells a lot like an object, and -there are ways for you to build Perl so that you can have multiple -interpreters, with one interpreter represented either as a C++ object, -a C structure, or inside a thread. The thread, the C structure, or -the C++ object will contain all the context, the state of that -interpreter. - -Three macros control the major Perl build flavors: MULTIPLICITY, -USE_THREADS and PERL_OBJECT. The MULTIPLICITY build has a C structure -that packages all the interpreter state, there is a similar thread-specific -data structure under USE_THREADS, and the (now deprecated) PERL_OBJECT -build has a C++ class to maintain interpreter state. In all three cases, -PERL_IMPLICIT_CONTEXT is also normally defined, and enables the -support for passing in a "hidden" first argument that represents all three -data structures. - -All this obviously requires a way for the Perl internal functions to be -C++ methods, subroutines taking some kind of structure as the first -argument, or subroutines taking nothing as the first argument. To -enable these three very different ways of building the interpreter, -the Perl source (as it does in so many other situations) makes heavy -use of macros and subroutine naming conventions. - -First problem: deciding which functions will be public API functions and -which will be private. All functions whose names begin C are private -(think "S" for "secret" or "static"). All other functions begin with -"Perl_", but just because a function begins with "Perl_" does not mean it is -part of the API. (See L.) The easiest way to be B a -function is part of the API is to find its entry in L. -If it exists in L, it's part of the API. If it doesn't, and you -think it should be (i.e., you need it for your extension), send mail via -L explaining why you think it should be. - -Second problem: there must be a syntax so that the same subroutine -declarations and calls can pass a structure as their first argument, -or pass nothing. To solve this, the subroutines are named and -declared in a particular way. Here's a typical start of a static -function used within the Perl guts: - - STATIC void - S_incline(pTHX_ char *s) - -STATIC becomes "static" in C, and is #define'd to nothing in C++. - -A public function (i.e. part of the internal API, but not necessarily -sanctioned for use in extensions) begins like this: - - void - Perl_sv_setsv(pTHX_ SV* dsv, SV* ssv) - -C is one of a number of macros (in perl.h) that hide the -details of the interpreter's context. THX stands for "thread", "this", -or "thingy", as the case may be. (And no, George Lucas is not involved. :-) -The first character could be 'p' for a B

    rototype, 'a' for Brgument, -or 'd' for Beclaration, so we have C, C and C, and -their variants. - -When Perl is built without options that set PERL_IMPLICIT_CONTEXT, there is no -first argument containing the interpreter's context. The trailing underscore -in the pTHX_ macro indicates that the macro expansion needs a comma -after the context argument because other arguments follow it. If -PERL_IMPLICIT_CONTEXT is not defined, pTHX_ will be ignored, and the -subroutine is not prototyped to take the extra argument. The form of the -macro without the trailing underscore is used when there are no additional -explicit arguments. - -When a core function calls another, it must pass the context. This -is normally hidden via macros. Consider C. It expands into -something like this: - - ifdef PERL_IMPLICIT_CONTEXT - define sv_setsv(a,b) Perl_sv_setsv(aTHX_ a, b) - /* can't do this for vararg functions, see below */ - else - define sv_setsv Perl_sv_setsv - endif - -This works well, and means that XS authors can gleefully write: - - sv_setsv(foo, bar); - -and still have it work under all the modes Perl could have been -compiled with. - -Under PERL_OBJECT in the core, that will translate to either: - - CPerlObj::Perl_sv_setsv(foo,bar); # in CPerlObj functions, - # C++ takes care of 'this' - or - - pPerl->Perl_sv_setsv(foo,bar); # in truly static functions, - # see objXSUB.h - -Under PERL_OBJECT in extensions (aka PERL_CAPI), or under -MULTIPLICITY/USE_THREADS with PERL_IMPLICIT_CONTEXT in both core -and extensions, it will become: - - Perl_sv_setsv(aTHX_ foo, bar); # the canonical Perl "API" - # for all build flavors - -This doesn't work so cleanly for varargs functions, though, as macros -imply that the number of arguments is known in advance. Instead we -either need to spell them out fully, passing C as the first -argument (the Perl core tends to do this with functions like -Perl_warner), or use a context-free version. - -The context-free version of Perl_warner is called -Perl_warner_nocontext, and does not take the extra argument. Instead -it does dTHX; to get the context from thread-local storage. We -C<#define warner Perl_warner_nocontext> so that extensions get source -compatibility at the expense of performance. (Passing an arg is -cheaper than grabbing it from thread-local storage.) - -You can ignore [pad]THX[xo] when browsing the Perl headers/sources. -Those are strictly for use within the core. Extensions and embedders -need only be aware of [pad]THX. - -=head2 So what happened to dTHR? - -C was introduced in perl 5.005 to support the older thread model. -The older thread model now uses the C mechanism to pass context -pointers around, so C is not useful any more. Perl 5.6.0 and -later still have it for backward source compatibility, but it is defined -to be a no-op. - -=head2 How do I use all this in extensions? - -When Perl is built with PERL_IMPLICIT_CONTEXT, extensions that call -any functions in the Perl API will need to pass the initial context -argument somehow. The kicker is that you will need to write it in -such a way that the extension still compiles when Perl hasn't been -built with PERL_IMPLICIT_CONTEXT enabled. - -There are three ways to do this. First, the easy but inefficient way, -which is also the default, in order to maintain source compatibility -with extensions: whenever XSUB.h is #included, it redefines the aTHX -and aTHX_ macros to call a function that will return the context. -Thus, something like: - - sv_setsv(asv, bsv); - -in your extension will translate to this when PERL_IMPLICIT_CONTEXT is -in effect: - - Perl_sv_setsv(Perl_get_context(), asv, bsv); - -or to this otherwise: - - Perl_sv_setsv(asv, bsv); - -You have to do nothing new in your extension to get this; since -the Perl library provides Perl_get_context(), it will all just -work. - -The second, more efficient way is to use the following template for -your Foo.xs: - - #define PERL_NO_GET_CONTEXT /* we want efficiency */ - #include "EXTERN.h" - #include "perl.h" - #include "XSUB.h" - - static my_private_function(int arg1, int arg2); - - static SV * - my_private_function(int arg1, int arg2) - { - dTHX; /* fetch context */ - ... call many Perl API functions ... - } - - [... etc ...] - - MODULE = Foo PACKAGE = Foo - - /* typical XSUB */ - - void - my_xsub(arg) - int arg - CODE: - my_private_function(arg, 10); - -Note that the only two changes from the normal way of writing an -extension is the addition of a C<#define PERL_NO_GET_CONTEXT> before -including the Perl headers, followed by a C declaration at -the start of every function that will call the Perl API. (You'll -know which functions need this, because the C compiler will complain -that there's an undeclared identifier in those functions.) No changes -are needed for the XSUBs themselves, because the XS() macro is -correctly defined to pass in the implicit context if needed. - -The third, even more efficient way is to ape how it is done within -the Perl guts: - - - #define PERL_NO_GET_CONTEXT /* we want efficiency */ - #include "EXTERN.h" - #include "perl.h" - #include "XSUB.h" - - /* pTHX_ only needed for functions that call Perl API */ - static my_private_function(pTHX_ int arg1, int arg2); - - static SV * - my_private_function(pTHX_ int arg1, int arg2) - { - /* dTHX; not needed here, because THX is an argument */ - ... call Perl API functions ... - } - - [... etc ...] - - MODULE = Foo PACKAGE = Foo - - /* typical XSUB */ - - void - my_xsub(arg) - int arg - CODE: - my_private_function(aTHX_ arg, 10); - -This implementation never has to fetch the context using a function -call, since it is always passed as an extra argument. Depending on -your needs for simplicity or efficiency, you may mix the previous -two approaches freely. - -Never add a comma after C yourself--always use the form of the -macro with the underscore for functions that take explicit arguments, -or the form without the argument for functions with no explicit arguments. - -=head2 Should I do anything special if I call perl from multiple threads? - -If you create interpreters in one thread and then proceed to call them in -another, you need to make sure perl's own Thread Local Storage (TLS) slot is -initialized correctly in each of those threads. - -The C and C API functions will automatically set -the TLS slot to the interpreter they created, so that there is no need to do -anything special if the interpreter is always accessed in the same thread that -created it, and that thread did not create or call any other interpreters -afterwards. If that is not the case, you have to set the TLS slot of the -thread before calling any functions in the Perl API on that particular -interpreter. This is done by calling the C macro in that -thread as the first thing you do: - - /* do this before doing anything else with some_perl */ - PERL_SET_CONTEXT(some_perl); - - ... other Perl API calls on some_perl go here ... - -=head2 Future Plans and PERL_IMPLICIT_SYS - -Just as PERL_IMPLICIT_CONTEXT provides a way to bundle up everything -that the interpreter knows about itself and pass it around, so too are -there plans to allow the interpreter to bundle up everything it knows -about the environment it's running on. This is enabled with the -PERL_IMPLICIT_SYS macro. Currently it only works with PERL_OBJECT -and USE_THREADS on Windows (see inside iperlsys.h). - -This allows the ability to provide an extra pointer (called the "host" -environment) for all the system calls. This makes it possible for -all the system stuff to maintain their own state, broken down into -seven C structures. These are thin wrappers around the usual system -calls (see win32/perllib.c) for the default perl executable, but for a -more ambitious host (like the one that would do fork() emulation) all -the extra work needed to pretend that different interpreters are -actually different "processes", would be done here. - -The Perl engine/interpreter and the host are orthogonal entities. -There could be one or more interpreters in a process, and one or -more "hosts", with free association between them. - -=head1 Internal Functions - -All of Perl's internal functions which will be exposed to the outside -world are be prefixed by C so that they will not conflict with XS -functions or functions used in a program in which Perl is embedded. -Similarly, all global variables begin with C. (By convention, -static functions start with C) - -Inside the Perl core, you can get at the functions either with or -without the C prefix, thanks to a bunch of defines that live in -F. This header file is generated automatically from -F. F also creates the prototyping header files for -the internal functions, generates the documentation and a lot of other -bits and pieces. It's important that when you add a new function to the -core or change an existing one, you change the data in the table at the -end of F as well. Here's a sample entry from that table: - - Apd |SV** |av_fetch |AV* ar|I32 key|I32 lval - -The second column is the return type, the third column the name. Columns -after that are the arguments. The first column is a set of flags: - -=over 3 - -=item A - -This function is a part of the public API. - -=item p - -This function has a C prefix; ie, it is defined as C - -=item d - -This function has documentation using the C feature which we'll -look at in a second. - -=back - -Other available flags are: - -=over 3 - -=item s - -This is a static function and is defined as C, and usually -called within the sources as C. - -=item n - -This does not use C and C to pass interpreter context. (See -L.) - -=item r - -This function never returns; C, C and friends. - -=item f - -This function takes a variable number of arguments, C style. -The argument list should end with C<...>, like this: - - Afprd |void |croak |const char* pat|... - -=item M - -This function is part of the experimental development API, and may change -or disappear without notice. - -=item o - -This function should not have a compatibility macro to define, say, -C to C. It must be called as C. - -=item j - -This function is not a member of C. If you don't know -what this means, don't use it. - -=item x - -This function isn't exported out of the Perl core. - -=back - -If you edit F, you will need to run C to -force a rebuild of F and other auto-generated files. - -=head2 Formatted Printing of IVs, UVs, and NVs - -If you are printing IVs, UVs, or NVS instead of the stdio(3) style -formatting codes like C<%d>, C<%ld>, C<%f>, you should use the -following macros for portability - - IVdf IV in decimal - UVuf UV in decimal - UVof UV in octal - UVxf UV in hexadecimal - NVef NV %e-like - NVff NV %f-like - NVgf NV %g-like - -These will take care of 64-bit integers and long doubles. -For example: - - printf("IV is %"IVdf"\n", iv); - -The IVdf will expand to whatever is the correct format for the IVs. - -If you are printing addresses of pointers, use UVxf combined -with PTR2UV(), do not use %lx or %p. - -=head2 Pointer-To-Integer and Integer-To-Pointer - -Because pointer size does not necessarily equal integer size, -use the follow macros to do it right. - - PTR2UV(pointer) - PTR2IV(pointer) - PTR2NV(pointer) - INT2PTR(pointertotype, integer) - -For example: - - IV iv = ...; - SV *sv = INT2PTR(SV*, iv); - -and - - AV *av = ...; - UV uv = PTR2UV(av); - -=head2 Source Documentation - -There's an effort going on to document the internal functions and -automatically produce reference manuals from them - L is one -such manual which details all the functions which are available to XS -writers. L is the autogenerated manual for the functions -which are not part of the API and are supposedly for internal use only. - -Source documentation is created by putting POD comments into the C -source, like this: - - /* - =for apidoc sv_setiv - - Copies an integer into the given SV. Does not handle 'set' magic. See - C. - - =cut - */ - -Please try and supply some documentation if you add functions to the -Perl core. - -=head1 Unicode Support - -Perl 5.6.0 introduced Unicode support. It's important for porters and XS -writers to understand this support and make sure that the code they -write does not corrupt Unicode data. - -=head2 What B Unicode, anyway? - -In the olden, less enlightened times, we all used to use ASCII. Most of -us did, anyway. The big problem with ASCII is that it's American. Well, -no, that's not actually the problem; the problem is that it's not -particularly useful for people who don't use the Roman alphabet. What -used to happen was that particular languages would stick their own -alphabet in the upper range of the sequence, between 128 and 255. Of -course, we then ended up with plenty of variants that weren't quite -ASCII, and the whole point of it being a standard was lost. - -Worse still, if you've got a language like Chinese or -Japanese that has hundreds or thousands of characters, then you really -can't fit them into a mere 256, so they had to forget about ASCII -altogether, and build their own systems using pairs of numbers to refer -to one character. - -To fix this, some people formed Unicode, Inc. and -produced a new character set containing all the characters you can -possibly think of and more. There are several ways of representing these -characters, and the one Perl uses is called UTF8. UTF8 uses -a variable number of bytes to represent a character, instead of just -one. You can learn more about Unicode at http://www.unicode.org/ - -=head2 How can I recognise a UTF8 string? - -You can't. This is because UTF8 data is stored in bytes just like -non-UTF8 data. The Unicode character 200, (C<0xC8> for you hex types) -capital E with a grave accent, is represented by the two bytes -C. Unfortunately, the non-Unicode string C -has that byte sequence as well. So you can't tell just by looking - this -is what makes Unicode input an interesting problem. - -The API function C can help; it'll tell you if a string -contains only valid UTF8 characters. However, it can't do the work for -you. On a character-by-character basis, C will tell you -whether the current character in a string is valid UTF8. - -=head2 How does UTF8 represent Unicode characters? - -As mentioned above, UTF8 uses a variable number of bytes to store a -character. Characters with values 1...128 are stored in one byte, just -like good ol' ASCII. Character 129 is stored as C; this -continues up to character 191, which is C. Now we've run out of -bits (191 is binary C<10111111>) so we move on; 192 is C. And -so it goes on, moving to three bytes at character 2048. - -Assuming you know you're dealing with a UTF8 string, you can find out -how long the first character in it is with the C macro: - - char *utf = "\305\233\340\240\201"; - I32 len; - - len = UTF8SKIP(utf); /* len is 2 here */ - utf += len; - len = UTF8SKIP(utf); /* len is 3 here */ - -Another way to skip over characters in a UTF8 string is to use -C, which takes a string and a number of characters to skip -over. You're on your own about bounds checking, though, so don't use it -lightly. - -All bytes in a multi-byte UTF8 character will have the high bit set, so -you can test if you need to do something special with this character -like this: - - UV uv; - - if (utf & 0x80) - /* Must treat this as UTF8 */ - uv = utf8_to_uv(utf); - else - /* OK to treat this character as a byte */ - uv = *utf; - -You can also see in that example that we use C to get the -value of the character; the inverse function C is available -for putting a UV into UTF8: - - if (uv > 0x80) - /* Must treat this as UTF8 */ - utf8 = uv_to_utf8(utf8, uv); - else - /* OK to treat this character as a byte */ - *utf8++ = uv; - -You B convert characters to UVs using the above functions if -you're ever in a situation where you have to match UTF8 and non-UTF8 -characters. You may not skip over UTF8 characters in this case. If you -do this, you'll lose the ability to match hi-bit non-UTF8 characters; -for instance, if your UTF8 string contains C, and you skip -that character, you can never match a C in a non-UTF8 string. -So don't do that! - -=head2 How does Perl store UTF8 strings? - -Currently, Perl deals with Unicode strings and non-Unicode strings -slightly differently. If a string has been identified as being UTF-8 -encoded, Perl will set a flag in the SV, C. You can check and -manipulate this flag with the following macros: - - SvUTF8(sv) - SvUTF8_on(sv) - SvUTF8_off(sv) - -This flag has an important effect on Perl's treatment of the string: if -Unicode data is not properly distinguished, regular expressions, -C, C and other string handling operations will have -undesirable results. - -The problem comes when you have, for instance, a string that isn't -flagged is UTF8, and contains a byte sequence that could be UTF8 - -especially when combining non-UTF8 and UTF8 strings. - -Never forget that the C flag is separate to the PV value; you -need be sure you don't accidentally knock it off while you're -manipulating SVs. More specifically, you cannot expect to do this: - - SV *sv; - SV *nsv; - STRLEN len; - char *p; - - p = SvPV(sv, len); - frobnicate(p); - nsv = newSVpvn(p, len); - -The C string does not tell you the whole story, and you can't -copy or reconstruct an SV just by copying the string value. Check if the -old SV has the UTF8 flag set, and act accordingly: - - p = SvPV(sv, len); - frobnicate(p); - nsv = newSVpvn(p, len); - if (SvUTF8(sv)) - SvUTF8_on(nsv); - -In fact, your C function should be made aware of whether or -not it's dealing with UTF8 data, so that it can handle the string -appropriately. - -=head2 How do I convert a string to UTF8? - -If you're mixing UTF8 and non-UTF8 strings, you might find it necessary -to upgrade one of the strings to UTF8. If you've got an SV, the easiest -way to do this is: - - sv_utf8_upgrade(sv); - -However, you must not do this, for example: - - if (!SvUTF8(left)) - sv_utf8_upgrade(left); - -If you do this in a binary operator, you will actually change one of the -strings that came into the operator, and, while it shouldn't be noticeable -by the end user, it can cause problems. - -Instead, C will give you a UTF8-encoded B of its -string argument. This is useful for having the data available for -comparisons and so on, without harming the original SV. There's also -C to go the other way, but naturally, this will fail if -the string contains any characters above 255 that can't be represented -in a single byte. - -=head2 Is there anything else I need to know? - -Not really. Just remember these things: - -=over 3 - -=item * - -There's no way to tell if a string is UTF8 or not. You can tell if an SV -is UTF8 by looking at is C flag. Don't forget to set the flag if -something should be UTF8. Treat the flag as part of the PV, even though -it's not - if you pass on the PV to somewhere, pass on the flag too. - -=item * - -If a string is UTF8, B use C to get at the value, -unless C in which case you can use C<*s>. - -=item * - -When writing to a UTF8 string, B use C, unless -C in which case you can use C<*s = uv>. - -=item * - -Mixing UTF8 and non-UTF8 strings is tricky. Use C to get -a new string which is UTF8 encoded. There are tricks you can use to -delay deciding whether you need to use a UTF8 string until you get to a -high character - C is one of those. - -=back - -=head1 AUTHORS - -Until May 1997, this document was maintained by Jeff Okamoto -. It is now maintained as part of Perl itself -by the Perl 5 Porters . - -With lots of help and suggestions from Dean Roehrich, Malcolm Beattie, -Andreas Koenig, Paul Hudson, Ilya Zakharevich, Paul Marquess, Neil -Bowers, Matthew Green, Tim Bunce, Spider Boardman, Ulrich Pfeifer, -Stephen McCamant, and Gurusamy Sarathy. - -API Listing originally by Dean Roehrich . - -Modifications to autogenerate the API listing (L) by Benjamin -Stuhl. - -=head1 SEE ALSO - -perlapi(1), perlintern(1), perlxs(1), perlembed(1) diff --git a/lib/perl5/5.6.1/pods/perlhack.pod b/lib/perl5/5.6.1/pods/perlhack.pod deleted file mode 100644 index d524fe55..00000000 --- a/lib/perl5/5.6.1/pods/perlhack.pod +++ /dev/null @@ -1,1722 +0,0 @@ -=head1 NAME - -perlhack - How to hack at the Perl internals - -=head1 DESCRIPTION - -This document attempts to explain how Perl development takes place, -and ends with some suggestions for people wanting to become bona fide -porters. - -The perl5-porters mailing list is where the Perl standard distribution -is maintained and developed. The list can get anywhere from 10 to 150 -messages a day, depending on the heatedness of the debate. Most days -there are two or three patches, extensions, features, or bugs being -discussed at a time. - -A searchable archive of the list is at: - - http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/ - -The list is also archived under the usenet group name -C at: - - http://www.deja.com/ - -List subscribers (the porters themselves) come in several flavours. -Some are quiet curious lurkers, who rarely pitch in and instead watch -the ongoing development to ensure they're forewarned of new changes or -features in Perl. Some are representatives of vendors, who are there -to make sure that Perl continues to compile and work on their -platforms. Some patch any reported bug that they know how to fix, -some are actively patching their pet area (threads, Win32, the regexp -engine), while others seem to do nothing but complain. In other -words, it's your usual mix of technical people. - -Over this group of porters presides Larry Wall. He has the final word -in what does and does not change in the Perl language. Various -releases of Perl are shepherded by a ``pumpking'', a porter -responsible for gathering patches, deciding on a patch-by-patch -feature-by-feature basis what will and will not go into the release. -For instance, Gurusamy Sarathy is the pumpking for the 5.6 release of -Perl. - -In addition, various people are pumpkings for different things. For -instance, Andy Dougherty and Jarkko Hietaniemi share the I -pumpkin, and Tom Christiansen is the documentation pumpking. - -Larry sees Perl development along the lines of the US government: -there's the Legislature (the porters), the Executive branch (the -pumpkings), and the Supreme Court (Larry). The legislature can -discuss and submit patches to the executive branch all they like, but -the executive branch is free to veto them. Rarely, the Supreme Court -will side with the executive branch over the legislature, or the -legislature over the executive branch. Mostly, however, the -legislature and the executive branch are supposed to get along and -work out their differences without impeachment or court cases. - -You might sometimes see reference to Rule 1 and Rule 2. Larry's power -as Supreme Court is expressed in The Rules: - -=over 4 - -=item 1 - -Larry is always by definition right about how Perl should behave. -This means he has final veto power on the core functionality. - -=item 2 - -Larry is allowed to change his mind about any matter at a later date, -regardless of whether he previously invoked Rule 1. - -=back - -Got that? Larry is always right, even when he was wrong. It's rare -to see either Rule exercised, but they are often alluded to. - -New features and extensions to the language are contentious, because -the criteria used by the pumpkings, Larry, and other porters to decide -which features should be implemented and incorporated are not codified -in a few small design goals as with some other languages. Instead, -the heuristics are flexible and often difficult to fathom. Here is -one person's list, roughly in decreasing order of importance, of -heuristics that new features have to be weighed against: - -=over 4 - -=item Does concept match the general goals of Perl? - -These haven't been written anywhere in stone, but one approximation -is: - - 1. Keep it fast, simple, and useful. - 2. Keep features/concepts as orthogonal as possible. - 3. No arbitrary limits (platforms, data sizes, cultures). - 4. Keep it open and exciting to use/patch/advocate Perl everywhere. - 5. Either assimilate new technologies, or build bridges to them. - -=item Where is the implementation? - -All the talk in the world is useless without an implementation. In -almost every case, the person or people who argue for a new feature -will be expected to be the ones who implement it. Porters capable -of coding new features have their own agendas, and are not available -to implement your (possibly good) idea. - -=item Backwards compatibility - -It's a cardinal sin to break existing Perl programs. New warnings are -contentious--some say that a program that emits warnings is not -broken, while others say it is. Adding keywords has the potential to -break programs, changing the meaning of existing token sequences or -functions might break programs. - -=item Could it be a module instead? - -Perl 5 has extension mechanisms, modules and XS, specifically to avoid -the need to keep changing the Perl interpreter. You can write modules -that export functions, you can give those functions prototypes so they -can be called like built-in functions, you can even write XS code to -mess with the runtime data structures of the Perl interpreter if you -want to implement really complicated things. If it can be done in a -module instead of in the core, it's highly unlikely to be added. - -=item Is the feature generic enough? - -Is this something that only the submitter wants added to the language, -or would it be broadly useful? Sometimes, instead of adding a feature -with a tight focus, the porters might decide to wait until someone -implements the more generalized feature. For instance, instead of -implementing a ``delayed evaluation'' feature, the porters are waiting -for a macro system that would permit delayed evaluation and much more. - -=item Does it potentially introduce new bugs? - -Radical rewrites of large chunks of the Perl interpreter have the -potential to introduce new bugs. The smaller and more localized the -change, the better. - -=item Does it preclude other desirable features? - -A patch is likely to be rejected if it closes off future avenues of -development. For instance, a patch that placed a true and final -interpretation on prototypes is likely to be rejected because there -are still options for the future of prototypes that haven't been -addressed. - -=item Is the implementation robust? - -Good patches (tight code, complete, correct) stand more chance of -going in. Sloppy or incorrect patches might be placed on the back -burner until the pumpking has time to fix, or might be discarded -altogether without further notice. - -=item Is the implementation generic enough to be portable? - -The worst patches make use of a system-specific features. It's highly -unlikely that nonportable additions to the Perl language will be -accepted. - -=item Is there enough documentation? - -Patches without documentation are probably ill-thought out or -incomplete. Nothing can be added without documentation, so submitting -a patch for the appropriate manpages as well as the source code is -always a good idea. If appropriate, patches should add to the test -suite as well. - -=item Is there another way to do it? - -Larry said ``Although the Perl Slogan is I, I hesitate to make 10 ways to do something''. This is a -tricky heuristic to navigate, though--one man's essential addition is -another man's pointless cruft. - -=item Does it create too much work? - -Work for the pumpking, work for Perl programmers, work for module -authors, ... Perl is supposed to be easy. - -=item Patches speak louder than words - -Working code is always preferred to pie-in-the-sky ideas. A patch to -add a feature stands a much higher chance of making it to the language -than does a random feature request, no matter how fervently argued the -request might be. This ties into ``Will it be useful?'', as the fact -that someone took the time to make the patch demonstrates a strong -desire for the feature. - -=back - -If you're on the list, you might hear the word ``core'' bandied -around. It refers to the standard distribution. ``Hacking on the -core'' means you're changing the C source code to the Perl -interpreter. ``A core module'' is one that ships with Perl. - -=head2 Keeping in sync - -The source code to the Perl interpreter, in its different versions, is -kept in a repository managed by a revision control system (which is -currently the Perforce program, see http://perforce.com/). The -pumpkings and a few others have access to the repository to check in -changes. Periodically the pumpking for the development version of Perl -will release a new version, so the rest of the porters can see what's -changed. The current state of the main trunk of repository, and patches -that describe the individual changes that have happened since the last -public release are available at this location: - - ftp://ftp.linux.activestate.com/pub/staff/gsar/APC/ - -If you are a member of the perl5-porters mailing list, it is a good -thing to keep in touch with the most recent changes. If not only to -verify if what you would have posted as a bug report isn't already -solved in the most recent available perl development branch, also -known as perl-current, bleading edge perl, bleedperl or bleadperl. - -Needless to say, the source code in perl-current is usually in a perpetual -state of evolution. You should expect it to be very buggy. Do B use -it for any purpose other than testing and development. - -Keeping in sync with the most recent branch can be done in several ways, -but the most convenient and reliable way is using B, available at -ftp://rsync.samba.org/pub/rsync/ . (You can also get the most recent -branch by FTP.) - -If you choose to keep in sync using rsync, there are two approaches -to doing so: - -=over 4 - -=item rsync'ing the source tree - -Presuming you are in the directory where your perl source resides -and you have rsync installed and available, you can `upgrade' to -the bleadperl using: - - # rsync -avz rsync://ftp.linux.activestate.com/perl-current/ . - -This takes care of updating every single item in the source tree to -the latest applied patch level, creating files that are new (to your -distribution) and setting date/time stamps of existing files to -reflect the bleadperl status. - -You can than check what patch was the latest that was applied by -looking in the file B<.patch>, which will show the number of the -latest patch. - -If you have more than one machine to keep in sync, and not all of -them have access to the WAN (so you are not able to rsync all the -source trees to the real source), there are some ways to get around -this problem. - -=over 4 - -=item Using rsync over the LAN - -Set up a local rsync server which makes the rsynced source tree -available to the LAN and sync the other machines against this -directory. - -From http://rsync.samba.org/README.html: - - "Rsync uses rsh or ssh for communication. It does not need to be - setuid and requires no special privileges for installation. It - does not require a inetd entry or a deamon. You must, however, - have a working rsh or ssh system. Using ssh is recommended for - its security features." - -=item Using pushing over the NFS - -Having the other systems mounted over the NFS, you can take an -active pushing approach by checking the just updated tree against -the other not-yet synced trees. An example would be - - #!/usr/bin/perl -w - - use strict; - use File::Copy; - - my %MF = map { - m/(\S+)/; - $1 => [ (stat $1)[2, 7, 9] ]; # mode, size, mtime - } `cat MANIFEST`; - - my %remote = map { $_ => "/$_/pro/3gl/CPAN/perl-5.7.1" } qw(host1 host2); - - foreach my $host (keys %remote) { - unless (-d $remote{$host}) { - print STDERR "Cannot Xsync for host $host\n"; - next; - } - foreach my $file (keys %MF) { - my $rfile = "$remote{$host}/$file"; - my ($mode, $size, $mtime) = (stat $rfile)[2, 7, 9]; - defined $size or ($mode, $size, $mtime) = (0, 0, 0); - $size == $MF{$file}[1] && $mtime == $MF{$file}[2] and next; - printf "%4s %-34s %8d %9d %8d %9d\n", - $host, $file, $MF{$file}[1], $MF{$file}[2], $size, $mtime; - unlink $rfile; - copy ($file, $rfile); - utime time, $MF{$file}[2], $rfile; - chmod $MF{$file}[0], $rfile; - } - } - -though this is not perfect. It could be improved with checking -file checksums before updating. Not all NFS systems support -reliable utime support (when used over the NFS). - -=back - -=item rsync'ing the patches - -The source tree is maintained by the pumpking who applies patches to -the files in the tree. These patches are either created by the -pumpking himself using C after updating the file manually or -by applying patches sent in by posters on the perl5-porters list. -These patches are also saved and rsync'able, so you can apply them -yourself to the source files. - -Presuming you are in a directory where your patches reside, you can -get them in sync with - - # rsync -avz rsync://ftp.linux.activestate.com/perl-current-diffs/ . - -This makes sure the latest available patch is downloaded to your -patch directory. - -It's then up to you to apply these patches, using something like - - # last=`ls -rt1 *.gz | tail -1` - # rsync -avz rsync://ftp.linux.activestate.com/perl-current-diffs/ . - # find . -name '*.gz' -newer $last -exec gzcat {} \; >blead.patch - # cd ../perl-current - # patch -p1 -N <../perl-current-diffs/blead.patch - -or, since this is only a hint towards how it works, use CPAN-patchaperl -from Andreas König to have better control over the patching process. - -=back - -=head2 Why rsync the source tree - -=over 4 - -=item It's easier - -Since you don't have to apply the patches yourself, you are sure all -files in the source tree are in the right state. - -=item It's more recent - -According to Gurusamy Sarathy: - - "... The rsync mirror is automatic and syncs with the repository - every five minutes. - - "Updating the patch area still requires manual intervention - (with all the goofiness that implies, which you've noted) and - is typically on a daily cycle. Making this process automatic - is on my tuit list, but don't ask me when." - -=item It's more reliable - -Well, since the patches are updated by hand, I don't have to say any -more ... (see Sarathy's remark). - -=back - -=head2 Why rsync the patches - -=over 4 - -=item It's easier - -If you have more than one machine that you want to keep in track with -bleadperl, it's easier to rsync the patches only once and then apply -them to all the source trees on the different machines. - -In case you try to keep in pace on 5 different machines, for which -only one of them has access to the WAN, rsync'ing all the source -trees should than be done 5 times over the NFS. Having -rsync'ed the patches only once, I can apply them to all the source -trees automatically. Need you say more ;-) - -=item It's a good reference - -If you do not only like to have the most recent development branch, -but also like to B bugs, or extend features, you want to dive -into the sources. If you are a seasoned perl core diver, you don't -need no manuals, tips, roadmaps, perlguts.pod or other aids to find -your way around. But if you are a starter, the patches may help you -in finding where you should start and how to change the bits that -bug you. - -The file B is updated on occasions the pumpking sees as his -own little sync points. On those occasions, he releases a tar-ball of -the current source tree (i.e. perl@7582.tar.gz), which will be an -excellent point to start with when choosing to use the 'rsync the -patches' scheme. Starting with perl@7582, which means a set of source -files on which the latest applied patch is number 7582, you apply all -succeeding patches available from then on (7583, 7584, ...). - -You can use the patches later as a kind of search archive. - -=over 4 - -=item Finding a start point - -If you want to fix/change the behaviour of function/feature Foo, just -scan the patches for patches that mention Foo either in the subject, -the comments, or the body of the fix. A good chance the patch shows -you the files that are affected by that patch which are very likely -to be the starting point of your journey into the guts of perl. - -=item Finding how to fix a bug - -If you've found I the function/feature Foo misbehaves, but you -don't know how to fix it (but you do know the change you want to -make), you can, again, peruse the patches for similar changes and -look how others apply the fix. - -=item Finding the source of misbehaviour - -When you keep in sync with bleadperl, the pumpking would love to -I that the community efforts realy work. So after each of his -sync points, you are to 'make test' to check if everything is still -in working order. If it is, you do 'make ok', which will send an OK -report to perlbug@perl.org. (If you do not have access to a mailer -from the system you just finished successfully 'make test', you can -do 'make okfile', which creates the file C, which you can -than take to your favourite mailer and mail yourself). - -But of course, as always, things will not allways lead to a success -path, and one or more test do not pass the 'make test'. Before -sending in a bug report (using 'make nok' or 'make nokfile'), check -the mailing list if someone else has reported the bug already and if -so, confirm it by replying to that message. If not, you might want to -trace the source of that misbehaviour B sending in the bug, -which will help all the other porters in finding the solution. - -Here the saved patches come in very handy. You can check the list of -patches to see which patch changed what file and what change caused -the misbehaviour. If you note that in the bug report, it saves the -one trying to solve it, looking for that point. - -=back - -If searching the patches is too bothersome, you might consider using -perl's bugtron to find more information about discussions and -ramblings on posted bugs. - -=back - -If you want to get the best of both worlds, rsync both the source -tree for convenience, reliability and ease and rsync the patches -for reference. - -=head2 Submitting patches - -Always submit patches to I. This lets other -porters review your patch, which catches a surprising number of errors -in patches. Either use the diff program (available in source code -form from I), or use Johan Vromans' -I (available from I). Unified diffs -are preferred, but context diffs are accepted. Do not send RCS-style -diffs or diffs without context lines. More information is given in -the I file in the Perl source distribution. -Please patch against the latest B version (e.g., if -you're fixing a bug in the 5.005 track, patch against the latest -5.005_5x version). Only patches that survive the heat of the -development branch get applied to maintenance versions. - -Your patch should update the documentation and test suite. - -To report a bug in Perl, use the program I which comes with -Perl (if you can't get Perl to work, send mail to the address -I or I). Reporting bugs through -I feeds into the automated bug-tracking system, access to -which is provided through the web at I. It -often pays to check the archives of the perl5-porters mailing list to -see whether the bug you're reporting has been reported before, and if -so whether it was considered a bug. See above for the location of -the searchable archives. - -The CPAN testers (I) are a group of -volunteers who test CPAN modules on a variety of platforms. Perl Labs -(I) automatically tests Perl source releases on -platforms and gives feedback to the CPAN testers mailing list. Both -efforts welcome volunteers. - -It's a good idea to read and lurk for a while before chipping in. -That way you'll get to see the dynamic of the conversations, learn the -personalities of the players, and hopefully be better prepared to make -a useful contribution when do you speak up. - -If after all this you still think you want to join the perl5-porters -mailing list, send mail to I. To -unsubscribe, send mail to I. - -To hack on the Perl guts, you'll need to read the following things: - -=over 3 - -=item L - -This is of paramount importance, since it's the documentation of what -goes where in the Perl source. Read it over a couple of times and it -might start to make sense - don't worry if it doesn't yet, because the -best way to study it is to read it in conjunction with poking at Perl -source, and we'll do that later on. - -You might also want to look at Gisle Aas's illustrated perlguts - -there's no guarantee that this will be absolutely up-to-date with the -latest documentation in the Perl core, but the fundamentals will be -right. (http://gisle.aas.no/perl/illguts/) - -=item L and L - -A working knowledge of XSUB programming is incredibly useful for core -hacking; XSUBs use techniques drawn from the PP code, the portion of the -guts that actually executes a Perl program. It's a lot gentler to learn -those techniques from simple examples and explanation than from the core -itself. - -=item L - -The documentation for the Perl API explains what some of the internal -functions do, as well as the many macros used in the source. - -=item F - -This is a collection of words of wisdom for a Perl porter; some of it is -only useful to the pumpkin holder, but most of it applies to anyone -wanting to go about Perl development. - -=item The perl5-porters FAQ - -This is posted to perl5-porters at the beginning on every month, and -should be available from http://perlhacker.org/p5p-faq; alternatively, -you can get the FAQ emailed to you by sending mail to -C. It contains hints on reading -perl5-porters, information on how perl5-porters works and how Perl -development in general works. - -=back - -=head2 Finding Your Way Around - -Perl maintenance can be split into a number of areas, and certain people -(pumpkins) will have responsibility for each area. These areas sometimes -correspond to files or directories in the source kit. Among the areas are: - -=over 3 - -=item Core modules - -Modules shipped as part of the Perl core live in the F and F -subdirectories: F is for the pure-Perl modules, and F -contains the core XS modules. - -=item Documentation - -Documentation maintenance includes looking after everything in the -F directory, (as well as contributing new documentation) and -the documentation to the modules in core. - -=item Configure - -The configure process is the way we make Perl portable across the -myriad of operating systems it supports. Responsibility for the -configure, build and installation process, as well as the overall -portability of the core code rests with the configure pumpkin - others -help out with individual operating systems. - -The files involved are the operating system directories, (F, -F, F and so on) the shell scripts which generate F -and F, as well as the metaconfig files which generate -F. (metaconfig isn't included in the core distribution.) - -=item Interpreter - -And of course, there's the core of the Perl interpreter itself. Let's -have a look at that in a little more detail. - -=back - -Before we leave looking at the layout, though, don't forget that -F contains not only the file names in the Perl distribution, -but short descriptions of what's in them, too. For an overview of the -important files, try this: - - perl -lne 'print if /^[^\/]+\.[ch]\s+/' MANIFEST - -=head2 Elements of the interpreter - -The work of the interpreter has two main stages: compiling the code -into the internal representation, or bytecode, and then executing it. -L explains exactly how the compilation stage -happens. - -Here is a short breakdown of perl's operation: - -=over 3 - -=item Startup - -The action begins in F. (or F for miniperl) -This is very high-level code, enough to fit on a single screen, and it -resembles the code found in L; most of the real action takes -place in F - -First, F allocates some memory and constructs a Perl -interpreter: - - 1 PERL_SYS_INIT3(&argc,&argv,&env); - 2 - 3 if (!PL_do_undump) { - 4 my_perl = perl_alloc(); - 5 if (!my_perl) - 6 exit(1); - 7 perl_construct(my_perl); - 8 PL_perl_destruct_level = 0; - 9 } - -Line 1 is a macro, and its definition is dependent on your operating -system. Line 3 references C, a global variable - all -global variables in Perl start with C. This tells you whether the -current running program was created with the C<-u> flag to perl and then -F, which means it's going to be false in any sane context. - -Line 4 calls a function in F to allocate memory for a Perl -interpreter. It's quite a simple function, and the guts of it looks like -this: - - my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter)); - -Here you see an example of Perl's system abstraction, which we'll see -later: C is either your system's C, or Perl's -own C as defined in F if you selected that option at -configure time. - -Next, in line 7, we construct the interpreter; this sets up all the -special variables that Perl needs, the stacks, and so on. - -Now we pass Perl the command line options, and tell it to go: - - exitstatus = perl_parse(my_perl, xs_init, argc, argv, (char **)NULL); - if (!exitstatus) { - exitstatus = perl_run(my_perl); - } - - -C is actually a wrapper around C, as defined -in F, which processes the command line options, sets up any -statically linked XS modules, opens the program and calls C to -parse it. - -=item Parsing - -The aim of this stage is to take the Perl source, and turn it into an op -tree. We'll see what one of those looks like later. Strictly speaking, -there's three things going on here. - -C, the parser, lives in F, although you're better off -reading the original YACC input in F. (Yes, Virginia, there -B a YACC grammar for Perl!) The job of the parser is to take your -code and `understand' it, splitting it into sentences, deciding which -operands go with which operators and so on. - -The parser is nobly assisted by the lexer, which chunks up your input -into tokens, and decides what type of thing each token is: a variable -name, an operator, a bareword, a subroutine, a core function, and so on. -The main point of entry to the lexer is C, and that and its -associated routines can be found in F. Perl isn't much like -other computer languages; it's highly context sensitive at times, it can -be tricky to work out what sort of token something is, or where a token -ends. As such, there's a lot of interplay between the tokeniser and the -parser, which can get pretty frightening if you're not used to it. - -As the parser understands a Perl program, it builds up a tree of -operations for the interpreter to perform during execution. The routines -which construct and link together the various operations are to be found -in F, and will be examined later. - -=item Optimization - -Now the parsing stage is complete, and the finished tree represents -the operations that the Perl interpreter needs to perform to execute our -program. Next, Perl does a dry run over the tree looking for -optimisations: constant expressions such as C<3 + 4> will be computed -now, and the optimizer will also see if any multiple operations can be -replaced with a single one. For instance, to fetch the variable C<$foo>, -instead of grabbing the glob C<*foo> and looking at the scalar -component, the optimizer fiddles the op tree to use a function which -directly looks up the scalar in question. The main optimizer is C -in F, and many ops have their own optimizing functions. - -=item Running - -Now we're finally ready to go: we have compiled Perl byte code, and all -that's left to do is run it. The actual execution is done by the -C function in F; more specifically, it's done by -these three innocent looking lines: - - while ((PL_op = CALL_FPTR(PL_op->op_ppaddr)(aTHX))) { - PERL_ASYNC_CHECK(); - } - -You may be more comfortable with the Perl version of that: - - PERL_ASYNC_CHECK() while $Perl::op = &{$Perl::op->{function}}; - -Well, maybe not. Anyway, each op contains a function pointer, which -stipulates the function which will actually carry out the operation. -This function will return the next op in the sequence - this allows for -things like C which choose the next op dynamically at run time. -The C makes sure that things like signals interrupt -execution if required. - -The actual functions called are known as PP code, and they're spread -between four files: F contains the `hot' code, which is most -often used and highly optimized, F contains all the -system-specific functions, F contains the functions which -implement control structures (C, C and the like) and F -contains everything else. These are, if you like, the C code for Perl's -built-in functions and operators. - -=back - -=head2 Internal Variable Types - -You should by now have had a look at L, which tells you about -Perl's internal variable types: SVs, HVs, AVs and the rest. If not, do -that now. - -These variables are used not only to represent Perl-space variables, but -also any constants in the code, as well as some structures completely -internal to Perl. The symbol table, for instance, is an ordinary Perl -hash. Your code is represented by an SV as it's read into the parser; -any program files you call are opened via ordinary Perl filehandles, and -so on. - -The core L module lets us examine SVs from a -Perl program. Let's see, for instance, how Perl treats the constant -C<"hello">. - - % perl -MDevel::Peek -e 'Dump("hello")' - 1 SV = PV(0xa041450) at 0xa04ecbc - 2 REFCNT = 1 - 3 FLAGS = (POK,READONLY,pPOK) - 4 PV = 0xa0484e0 "hello"\0 - 5 CUR = 5 - 6 LEN = 6 - -Reading C output takes a bit of practise, so let's go -through it line by line. - -Line 1 tells us we're looking at an SV which lives at C<0xa04ecbc> in -memory. SVs themselves are very simple structures, but they contain a -pointer to a more complex structure. In this case, it's a PV, a -structure which holds a string value, at location C<0xa041450>. Line 2 -is the reference count; there are no other references to this data, so -it's 1. - -Line 3 are the flags for this SV - it's OK to use it as a PV, it's a -read-only SV (because it's a constant) and the data is a PV internally. -Next we've got the contents of the string, starting at location -C<0xa0484e0>. - -Line 5 gives us the current length of the string - note that this does -B include the null terminator. Line 6 is not the length of the -string, but the length of the currently allocated buffer; as the string -grows, Perl automatically extends the available storage via a routine -called C. - -You can get at any of these quantities from C very easily; just add -C to the name of the field shown in the snippet, and you've got a -macro which will return the value: C returns the current -length of the string, C returns the reference count, -C returns the string itself with its length, and so on. -More macros to manipulate these properties can be found in L. - -Let's take an example of manipulating a PV, from C, in F - - 1 void - 2 Perl_sv_catpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len) - 3 { - 4 STRLEN tlen; - 5 char *junk; - - 6 junk = SvPV_force(sv, tlen); - 7 SvGROW(sv, tlen + len + 1); - 8 if (ptr == junk) - 9 ptr = SvPVX(sv); - 10 Move(ptr,SvPVX(sv)+tlen,len,char); - 11 SvCUR(sv) += len; - 12 *SvEND(sv) = '\0'; - 13 (void)SvPOK_only_UTF8(sv); /* validate pointer */ - 14 SvTAINT(sv); - 15 } - -This is a function which adds a string, C, of length C onto -the end of the PV stored in C. The first thing we do in line 6 is -make sure that the SV B a valid PV, by calling the C -macro to force a PV. As a side effect, C gets set to the current -value of the PV, and the PV itself is returned to C. - -In line 7, we make sure that the SV will have enough room to accommodate -the old string, the new string and the null terminator. If C isn't -big enough, C will reallocate space for us. - -Now, if C is the same as the string we're trying to add, we can -grab the string directly from the SV; C is the address of the PV -in the SV. - -Line 10 does the actual catenation: the C macro moves a chunk of -memory around: we move the string C to the end of the PV - that's -the start of the PV plus its current length. We're moving C bytes -of type C. After doing so, we need to tell Perl we've extended the -string, by altering C to reflect the new length. C is a -macro which gives us the end of the string, so that needs to be a -C<"\0">. - -Line 13 manipulates the flags; since we've changed the PV, any IV or NV -values will no longer be valid: if we have C<$a=10; $a.="6";> we don't -want to use the old IV of 10. C is a special UTF8-aware -version of C, a macro which turns off the IOK and NOK flags -and turns on POK. The final C is a macro which launders tainted -data if taint mode is turned on. - -AVs and HVs are more complicated, but SVs are by far the most common -variable type being thrown around. Having seen something of how we -manipulate these, let's go on and look at how the op tree is -constructed. - -=head2 Op Trees - -First, what is the op tree, anyway? The op tree is the parsed -representation of your program, as we saw in our section on parsing, and -it's the sequence of operations that Perl goes through to execute your -program, as we saw in L. - -An op is a fundamental operation that Perl can perform: all the built-in -functions and operators are ops, and there are a series of ops which -deal with concepts the interpreter needs internally - entering and -leaving a block, ending a statement, fetching a variable, and so on. - -The op tree is connected in two ways: you can imagine that there are two -"routes" through it, two orders in which you can traverse the tree. -First, parse order reflects how the parser understood the code, and -secondly, execution order tells perl what order to perform the -operations in. - -The easiest way to examine the op tree is to stop Perl after it has -finished parsing, and get it to dump out the tree. This is exactly what -the compiler backends L and L do. - -Let's have a look at how Perl sees C<$a = $b + $c>: - - % perl -MO=Terse -e '$a=$b+$c' - 1 LISTOP (0x8179888) leave - 2 OP (0x81798b0) enter - 3 COP (0x8179850) nextstate - 4 BINOP (0x8179828) sassign - 5 BINOP (0x8179800) add [1] - 6 UNOP (0x81796e0) null [15] - 7 SVOP (0x80fafe0) gvsv GV (0x80fa4cc) *b - 8 UNOP (0x81797e0) null [15] - 9 SVOP (0x8179700) gvsv GV (0x80efeb0) *c - 10 UNOP (0x816b4f0) null [15] - 11 SVOP (0x816dcf0) gvsv GV (0x80fa460) *a - -Let's start in the middle, at line 4. This is a BINOP, a binary -operator, which is at location C<0x8179828>. The specific operator in -question is C - scalar assignment - and you can find the code -which implements it in the function C in F. As a -binary operator, it has two children: the add operator, providing the -result of C<$b+$c>, is uppermost on line 5, and the left hand side is on -line 10. - -Line 10 is the null op: this does exactly nothing. What is that doing -there? If you see the null op, it's a sign that something has been -optimized away after parsing. As we mentioned in L, -the optimization stage sometimes converts two operations into one, for -example when fetching a scalar variable. When this happens, instead of -rewriting the op tree and cleaning up the dangling pointers, it's easier -just to replace the redundant operation with the null op. Originally, -the tree would have looked like this: - - 10 SVOP (0x816b4f0) rv2sv [15] - 11 SVOP (0x816dcf0) gv GV (0x80fa460) *a - -That is, fetch the C entry from the main symbol table, and then look -at the scalar component of it: C (C into F) -happens to do both these things. - -The right hand side, starting at line 5 is similar to what we've just -seen: we have the C op (C also in F) add together -two Cs. - -Now, what's this about? - - 1 LISTOP (0x8179888) leave - 2 OP (0x81798b0) enter - 3 COP (0x8179850) nextstate - -C and C are scoping ops, and their job is to perform any -housekeeping every time you enter and leave a block: lexical variables -are tidied up, unreferenced variables are destroyed, and so on. Every -program will have those first three lines: C is a list, and its -children are all the statements in the block. Statements are delimited -by C, so a block is a collection of C ops, with -the ops to be performed for each statement being the children of -C. C is a single op which functions as a marker. - -That's how Perl parsed the program, from top to bottom: - - Program - | - Statement - | - = - / \ - / \ - $a + - / \ - $b $c - -However, it's impossible to B the operations in this order: -you have to find the values of C<$b> and C<$c> before you add them -together, for instance. So, the other thread that runs through the op -tree is the execution order: each op has a field C which points -to the next op to be run, so following these pointers tells us how perl -executes the code. We can traverse the tree in this order using -the C option to C: - - % perl -MO=Terse,exec -e '$a=$b+$c' - 1 OP (0x8179928) enter - 2 COP (0x81798c8) nextstate - 3 SVOP (0x81796c8) gvsv GV (0x80fa4d4) *b - 4 SVOP (0x8179798) gvsv GV (0x80efeb0) *c - 5 BINOP (0x8179878) add [1] - 6 SVOP (0x816dd38) gvsv GV (0x80fa468) *a - 7 BINOP (0x81798a0) sassign - 8 LISTOP (0x8179900) leave - -This probably makes more sense for a human: enter a block, start a -statement. Get the values of C<$b> and C<$c>, and add them together. -Find C<$a>, and assign one to the other. Then leave. - -The way Perl builds up these op trees in the parsing process can be -unravelled by examining F, the YACC grammar. Let's take the -piece we need to construct the tree for C<$a = $b + $c> - - 1 term : term ASSIGNOP term - 2 { $$ = newASSIGNOP(OPf_STACKED, $1, $2, $3); } - 3 | term ADDOP term - 4 { $$ = newBINOP($2, 0, scalar($1), scalar($3)); } - -If you're not used to reading BNF grammars, this is how it works: You're -fed certain things by the tokeniser, which generally end up in upper -case. Here, C, is provided when the tokeniser sees C<+> in your -code. C is provided when C<=> is used for assigning. These are -`terminal symbols', because you can't get any simpler than them. - -The grammar, lines one and three of the snippet above, tells you how to -build up more complex forms. These complex forms, `non-terminal symbols' -are generally placed in lower case. C here is a non-terminal -symbol, representing a single expression. - -The grammar gives you the following rule: you can make the thing on the -left of the colon if you see all the things on the right in sequence. -This is called a "reduction", and the aim of parsing is to completely -reduce the input. There are several different ways you can perform a -reduction, separated by vertical bars: so, C followed by C<=> -followed by C makes a C, and C followed by C<+> -followed by C can also make a C. - -So, if you see two terms with an C<=> or C<+>, between them, you can -turn them into a single expression. When you do this, you execute the -code in the block on the next line: if you see C<=>, you'll do the code -in line 2. If you see C<+>, you'll do the code in line 4. It's this code -which contributes to the op tree. - - | term ADDOP term - { $$ = newBINOP($2, 0, scalar($1), scalar($3)); } - -What this does is creates a new binary op, and feeds it a number of -variables. The variables refer to the tokens: C<$1> is the first token in -the input, C<$2> the second, and so on - think regular expression -backreferences. C<$$> is the op returned from this reduction. So, we -call C to create a new binary operator. The first parameter to -C, a function in F, is the op type. It's an addition -operator, so we want the type to be C. We could specify this -directly, but it's right there as the second token in the input, so we -use C<$2>. The second parameter is the op's flags: 0 means `nothing -special'. Then the things to add: the left and right hand side of our -expression, in scalar context. - -=head2 Stacks - -When perl executes something like C, how does it pass on its -results to the next op? The answer is, through the use of stacks. Perl -has a number of stacks to store things it's currently working on, and -we'll look at the three most important ones here. - -=over 3 - -=item Argument stack - -Arguments are passed to PP code and returned from PP code using the -argument stack, C. The typical way to handle arguments is to pop -them off the stack, deal with them how you wish, and then push the result -back onto the stack. This is how, for instance, the cosine operator -works: - - NV value; - value = POPn; - value = Perl_cos(value); - XPUSHn(value); - -We'll see a more tricky example of this when we consider Perl's macros -below. C gives you the NV (floating point value) of the top SV on -the stack: the C<$x> in C. Then we compute the cosine, and push -the result back as an NV. The C in C means that the stack -should be extended if necessary - it can't be necessary here, because we -know there's room for one more item on the stack, since we've just -removed one! The C macros at least guarantee safety. - -Alternatively, you can fiddle with the stack directly: C gives you -the first element in your portion of the stack, and C gives you -the top SV/IV/NV/etc. on the stack. So, for instance, to do unary -negation of an integer: - - SETi(-TOPi); - -Just set the integer value of the top stack entry to its negation. - -Argument stack manipulation in the core is exactly the same as it is in -XSUBs - see L, L and L for a longer -description of the macros used in stack manipulation. - -=item Mark stack - -I say `your portion of the stack' above because PP code doesn't -necessarily get the whole stack to itself: if your function calls -another function, you'll only want to expose the arguments aimed for the -called function, and not (necessarily) let it get at your own data. The -way we do this is to have a `virtual' bottom-of-stack, exposed to each -function. The mark stack keeps bookmarks to locations in the argument -stack usable by each function. For instance, when dealing with a tied -variable, (internally, something with `P' magic) Perl has to call -methods for accesses to the tied variables. However, we need to separate -the arguments exposed to the method to the argument exposed to the -original function - the store or fetch or whatever it may be. Here's how -the tied C is implemented; see C in F: - - 1 PUSHMARK(SP); - 2 EXTEND(SP,2); - 3 PUSHs(SvTIED_obj((SV*)av, mg)); - 4 PUSHs(val); - 5 PUTBACK; - 6 ENTER; - 7 call_method("PUSH", G_SCALAR|G_DISCARD); - 8 LEAVE; - 9 POPSTACK; - -The lines which concern the mark stack are the first, fifth and last -lines: they save away, restore and remove the current position of the -argument stack. - -Let's examine the whole implementation, for practice: - - 1 PUSHMARK(SP); - -Push the current state of the stack pointer onto the mark stack. This is -so that when we've finished adding items to the argument stack, Perl -knows how many things we've added recently. - - 2 EXTEND(SP,2); - 3 PUSHs(SvTIED_obj((SV*)av, mg)); - 4 PUSHs(val); - -We're going to add two more items onto the argument stack: when you have -a tied array, the C subroutine receives the object and the value -to be pushed, and that's exactly what we have here - the tied object, -retrieved with C, and the value, the SV C. - - 5 PUTBACK; - -Next we tell Perl to make the change to the global stack pointer: C -only gave us a local copy, not a reference to the global. - - 6 ENTER; - 7 call_method("PUSH", G_SCALAR|G_DISCARD); - 8 LEAVE; - -C and C localise a block of code - they make sure that all -variables are tidied up, everything that has been localised gets -its previous value returned, and so on. Think of them as the C<{> and -C<}> of a Perl block. - -To actually do the magic method call, we have to call a subroutine in -Perl space: C takes care of that, and it's described in -L. We call the C method in scalar context, and we're -going to discard its return value. - - 9 POPSTACK; - -Finally, we remove the value we placed on the mark stack, since we -don't need it any more. - -=item Save stack - -C doesn't have a concept of local scope, so perl provides one. We've -seen that C and C are used as scoping braces; the save -stack implements the C equivalent of, for example: - - { - local $foo = 42; - ... - } - -See L for how to use the save stack. - -=back - -=head2 Millions of Macros - -One thing you'll notice about the Perl source is that it's full of -macros. Some have called the pervasive use of macros the hardest thing -to understand, others find it adds to clarity. Let's take an example, -the code which implements the addition operator: - - 1 PP(pp_add) - 2 { - 3 dSP; dATARGET; tryAMAGICbin(add,opASSIGN); - 4 { - 5 dPOPTOPnnrl_ul; - 6 SETn( left + right ); - 7 RETURN; - 8 } - 9 } - -Every line here (apart from the braces, of course) contains a macro. The -first line sets up the function declaration as Perl expects for PP code; -line 3 sets up variable declarations for the argument stack and the -target, the return value of the operation. Finally, it tries to see if -the addition operation is overloaded; if so, the appropriate subroutine -is called. - -Line 5 is another variable declaration - all variable declarations start -with C - which pops from the top of the argument stack two NVs (hence -C) and puts them into the variables C and C, hence the -C. These are the two operands to the addition operator. Next, we -call C to set the NV of the return value to the result of adding -the two values. This done, we return - the C macro makes sure -that our return value is properly handled, and we pass the next operator -to run back to the main run loop. - -Most of these macros are explained in L, and some of the more -important ones are explained in L as well. Pay special attention -to L for information on -the C<[pad]THX_?> macros. - - -=head2 Poking at Perl - -To really poke around with Perl, you'll probably want to build Perl for -debugging, like this: - - ./Configure -d -D optimize=-g - make - -C<-g> is a flag to the C compiler to have it produce debugging -information which will allow us to step through a running program. -F will also turn on the C compilation symbol which -enables all the internal debugging code in Perl. There are a whole bunch -of things you can debug with this: L lists them all, and the -best way to find out about them is to play about with them. The most -useful options are probably - - l Context (loop) stack processing - t Trace execution - o Method and overloading resolution - c String/numeric conversions - -Some of the functionality of the debugging code can be achieved using XS -modules. - - -Dr => use re 'debug' - -Dx => use O 'Debug' - -=head2 Using a source-level debugger - -If the debugging output of C<-D> doesn't help you, it's time to step -through perl's execution with a source-level debugger. - -=over 3 - -=item * - -We'll use C for our examples here; the principles will apply to any -debugger, but check the manual of the one you're using. - -=back - -To fire up the debugger, type - - gdb ./perl - -You'll want to do that in your Perl source tree so the debugger can read -the source code. You should see the copyright message, followed by the -prompt. - - (gdb) - -C will get you into the documentation, but here are the most -useful commands: - -=over 3 - -=item run [args] - -Run the program with the given arguments. - -=item break function_name - -=item break source.c:xxx - -Tells the debugger that we'll want to pause execution when we reach -either the named function (but see L!) or the given -line in the named source file. - -=item step - -Steps through the program a line at a time. - -=item next - -Steps through the program a line at a time, without descending into -functions. - -=item continue - -Run until the next breakpoint. - -=item finish - -Run until the end of the current function, then stop again. - -=item 'enter' - -Just pressing Enter will do the most recent operation again - it's a -blessing when stepping through miles of source code. - -=item print - -Execute the given C code and print its results. B: Perl makes -heavy use of macros, and F is not aware of macros. You'll have to -substitute them yourself. So, for instance, you can't say - - print SvPV_nolen(sv) - -but you have to say - - print Perl_sv_2pv_nolen(sv) - -You may find it helpful to have a "macro dictionary", which you can -produce by saying C. Even then, F won't -recursively apply the macros for you. - -=back - -=head2 Dumping Perl Data Structures - -One way to get around this macro hell is to use the dumping functions in -F; these work a little like an internal -L, but they also cover OPs and other structures -that you can't get at from Perl. Let's take an example. We'll use the -C<$a = $b + $c> we used before, but give it a bit of context: -C<$b = "6XXXX"; $c = 2.3;>. Where's a good place to stop and poke around? - -What about C, the function we examined earlier to implement the -C<+> operator: - - (gdb) break Perl_pp_add - Breakpoint 1 at 0x46249f: file pp_hot.c, line 309. - -Notice we use C and not C - see L. -With the breakpoint in place, we can run our program: - - (gdb) run -e '$b = "6XXXX"; $c = 2.3; $a = $b + $c' - -Lots of junk will go past as gdb reads in the relevant source files and -libraries, and then: - - Breakpoint 1, Perl_pp_add () at pp_hot.c:309 - 309 dSP; dATARGET; tryAMAGICbin(add,opASSIGN); - (gdb) step - 311 dPOPTOPnnrl_ul; - (gdb) - -We looked at this bit of code before, and we said that C -arranges for two Cs to be placed into C and C - let's -slightly expand it: - - #define dPOPTOPnnrl_ul NV right = POPn; \ - SV *leftsv = TOPs; \ - NV left = USE_LEFT(leftsv) ? SvNV(leftsv) : 0.0 - -C takes the SV from the top of the stack and obtains its NV either -directly (if C is set) or by calling the C function. -C takes the next SV from the top of the stack - yes, C uses -C - but doesn't remove it. We then use C to get the NV from -C in the same way as before - yes, C uses C. - -Since we don't have an NV for C<$b>, we'll have to use C to -convert it. If we step again, we'll find ourselves there: - - Perl_sv_2nv (sv=0xa0675d0) at sv.c:1669 - 1669 if (!sv) - (gdb) - -We can now use C to investigate the SV: - - SV = PV(0xa057cc0) at 0xa0675d0 - REFCNT = 1 - FLAGS = (POK,pPOK) - PV = 0xa06a510 "6XXXX"\0 - CUR = 5 - LEN = 6 - $1 = void - -We know we're going to get C<6> from this, so let's finish the -subroutine: - - (gdb) finish - Run till exit from #0 Perl_sv_2nv (sv=0xa0675d0) at sv.c:1671 - 0x462669 in Perl_pp_add () at pp_hot.c:311 - 311 dPOPTOPnnrl_ul; - -We can also dump out this op: the current op is always stored in -C, and we can dump it with C. This'll give us -similar output to L. - - { - 13 TYPE = add ===> 14 - TARG = 1 - FLAGS = (SCALAR,KIDS) - { - TYPE = null ===> (12) - (was rv2sv) - FLAGS = (SCALAR,KIDS) - { - 11 TYPE = gvsv ===> 12 - FLAGS = (SCALAR) - GV = main::b - } - } - -< finish this later > - -=head2 Patching - -All right, we've now had a look at how to navigate the Perl sources and -some things you'll need to know when fiddling with them. Let's now get -on and create a simple patch. Here's something Larry suggested: if a -C is the first active format during a C, (for example, -C) then the resulting string should be treated as -UTF8 encoded. - -How do we prepare to fix this up? First we locate the code in question - -the C happens at runtime, so it's going to be in one of the F -files. Sure enough, C is in F. Since we're going to be -altering this file, let's copy it to F. - -Now let's look over C: we take a pattern into C, and then -loop over the pattern, taking each format character in turn into -C. Then for each possible format character, we swallow up -the other arguments in the pattern (a field width, an asterisk, and so -on) and convert the next chunk input into the specified format, adding -it onto the output SV C. - -How do we know if the C is the first format in the C? Well, if -we have a pointer to the start of C then, if we see a C we can -test whether we're still at the start of the string. So, here's where -C is set up: - - STRLEN fromlen; - register char *pat = SvPVx(*++MARK, fromlen); - register char *patend = pat + fromlen; - register I32 len; - I32 datumtype; - SV *fromstr; - -We'll have another string pointer in there: - - STRLEN fromlen; - register char *pat = SvPVx(*++MARK, fromlen); - register char *patend = pat + fromlen; - + char *patcopy; - register I32 len; - I32 datumtype; - SV *fromstr; - -And just before we start the loop, we'll set C to be the start -of C: - - items = SP - MARK; - MARK++; - sv_setpvn(cat, "", 0); - + patcopy = pat; - while (pat < patend) { - -Now if we see a C which was at the start of the string, we turn on -the UTF8 flag for the output SV, C: - - + if (datumtype == 'U' && pat==patcopy+1) - + SvUTF8_on(cat); - if (datumtype == '#') { - while (pat < patend && *pat != '\n') - pat++; - -Remember that it has to be C because the first character of -the string is the C which has been swallowed into C - -Oops, we forgot one thing: what if there are spaces at the start of the -pattern? C will have C as the first active -character, even though it's not the first thing in the pattern. In this -case, we have to advance C along with C when we see spaces: - - if (isSPACE(datumtype)) - continue; - -needs to become - - if (isSPACE(datumtype)) { - patcopy++; - continue; - } - -OK. That's the C part done. Now we must do two additional things before -this patch is ready to go: we've changed the behaviour of Perl, and so -we must document that change. We must also provide some more regression -tests to make sure our patch works and doesn't create a bug somewhere -else along the line. - -The regression tests for each operator live in F, and so we make -a copy of F to F. Now we can add our tests -to the end. First, we'll test that the C does indeed create Unicode -strings: - - print 'not ' unless "1.20.300.4000" eq sprintf "%vd", pack("U*",1,20,300,4000); - print "ok $test\n"; $test++; - -Now we'll test that we got that space-at-the-beginning business right: - - print 'not ' unless "1.20.300.4000" eq - sprintf "%vd", pack(" U*",1,20,300,4000); - print "ok $test\n"; $test++; - -And finally we'll test that we don't make Unicode strings if C is B -the first active format: - - print 'not ' unless v1.20.300.4000 ne - sprintf "%vd", pack("C0U*",1,20,300,4000); - print "ok $test\n"; $test++; - -Mustn't forget to change the number of tests which appears at the top, or -else the automated tester will get confused: - - -print "1..156\n"; - +print "1..159\n"; - -We now compile up Perl, and run it through the test suite. Our new -tests pass, hooray! - -Finally, the documentation. The job is never done until the paperwork is -over, so let's describe the change we've just made. The relevant place -is F; again, we make a copy, and then we'll insert -this text in the description of C: - - =item * - - If the pattern begins with a C, the resulting string will be treated - as Unicode-encoded. You can force UTF8 encoding on in a string with an - initial C, and the bytes that follow will be interpreted as Unicode - characters. If you don't want this to happen, you can begin your pattern - with C (or anything else) to force Perl not to UTF8 encode your - string, and then follow this with a C somewhere in your pattern. - -All done. Now let's create the patch. F tells us -that if we're making major changes, we should copy the entire directory -to somewhere safe before we begin fiddling, and then do - - diff -ruN old new > patch - -However, we know which files we've changed, and we can simply do this: - - diff -u pp.c~ pp.c > patch - diff -u t/op/pack.t~ t/op/pack.t >> patch - diff -u pod/perlfunc.pod~ pod/perlfunc.pod >> patch - -We end up with a patch looking a little like this: - - --- pp.c~ Fri Jun 02 04:34:10 2000 - +++ pp.c Fri Jun 16 11:37:25 2000 - @@ -4375,6 +4375,7 @@ - register I32 items; - STRLEN fromlen; - register char *pat = SvPVx(*++MARK, fromlen); - + char *patcopy; - register char *patend = pat + fromlen; - register I32 len; - I32 datumtype; - @@ -4405,6 +4406,7 @@ - ... - -And finally, we submit it, with our rationale, to perl5-porters. Job -done! - -=head1 EXTERNAL TOOLS FOR DEBUGGING PERL - -Sometimes it helps to use external tools while debugging and -testing Perl. This section tries to guide you through using -some common testing and debugging tools with Perl. This is -meant as a guide to interfacing these tools with Perl, not -as any kind of guide to the use of the tools themselves. - -=head2 Rational Software's Purify - -Purify is a commercial tool that is helpful in identifying -memory overruns, wild pointers, memory leaks and other such -badness. Perl must be compiled in a specific way for -optimal testing with Purify. Purify is available under -Windows NT, Solaris, HP-UX, SGI, and Siemens Unix. - -The only currently known leaks happen when there are -compile-time errors within eval or require. (Fixing these -is non-trivial, unfortunately, but they must be fixed -eventually.) - -=head2 Purify on Unix - -On Unix, Purify creates a new Perl binary. To get the most -benefit out of Purify, you should create the perl to Purify -using: - - sh Configure -Accflags=-DPURIFY -Doptimize='-g' \ - -Uusemymalloc -Dusemultiplicity - -where these arguments mean: - -=over 4 - -=item -Accflags=-DPURIFY - -Disables Perl's arena memory allocation functions, as well as -forcing use of memory allocation functions derived from the -system malloc. - -=item -Doptimize='-g' - -Adds debugging information so that you see the exact source -statements where the problem occurs. Without this flag, all -you will see is the source filename of where the error occurred. - -=item -Uusemymalloc - -Disable Perl's malloc so that Purify can more closely monitor -allocations and leaks. Using Perl's malloc will make Purify -report most leaks in the "potential" leaks category. - -=item -Dusemultiplicity - -Enabling the multiplicity option allows perl to clean up -thoroughly when the interpreter shuts down, which reduces the -number of bogus leak reports from Purify. - -=back - -Once you've compiled a perl suitable for Purify'ing, then you -can just: - - make pureperl - -which creates a binary named 'pureperl' that has been Purify'ed. -This binary is used in place of the standard 'perl' binary -when you want to debug Perl memory problems. - -As an example, to show any memory leaks produced during the -standard Perl testset you would create and run the Purify'ed -perl as: - - make pureperl - cd t - ../pureperl -I../lib harness - -which would run Perl on test.pl and report any memory problems. - -Purify outputs messages in "Viewer" windows by default. If -you don't have a windowing environment or if you simply -want the Purify output to unobtrusively go to a log file -instead of to the interactive window, use these following -options to output to the log file "perl.log": - - setenv PURIFYOPTIONS "-chain-length=25 -windows=no \ - -log-file=perl.log -append-logfile=yes" - -If you plan to use the "Viewer" windows, then you only need this option: - - setenv PURIFYOPTIONS "-chain-length=25" - -=head2 Purify on NT - -Purify on Windows NT instruments the Perl binary 'perl.exe' -on the fly. There are several options in the makefile you -should change to get the most use out of Purify: - -=over 4 - -=item DEFINES - -You should add -DPURIFY to the DEFINES line so the DEFINES -line looks something like: - - DEFINES = -DWIN32 -D_CONSOLE -DNO_STRICT $(CRYPT_FLAG) -DPURIFY=1 - -to disable Perl's arena memory allocation functions, as -well as to force use of memory allocation functions derived -from the system malloc. - -=item USE_MULTI = define - -Enabling the multiplicity option allows perl to clean up -thoroughly when the interpreter shuts down, which reduces the -number of bogus leak reports from Purify. - -=item #PERL_MALLOC = define - -Disable Perl's malloc so that Purify can more closely monitor -allocations and leaks. Using Perl's malloc will make Purify -report most leaks in the "potential" leaks category. - -=item CFG = Debug - -Adds debugging information so that you see the exact source -statements where the problem occurs. Without this flag, all -you will see is the source filename of where the error occurred. - -=back - -As an example, to show any memory leaks produced during the -standard Perl testset you would create and run Purify as: - - cd win32 - make - cd ../t - purify ../perl -I../lib harness - -which would instrument Perl in memory, run Perl on test.pl, -then finally report any memory problems. - -=head2 CONCLUSION - -We've had a brief look around the Perl source, an overview of the stages -F goes through when it's running your code, and how to use a -debugger to poke at the Perl guts. We took a very simple problem and -demonstrated how to solve it fully - with documentation, regression -tests, and finally a patch for submission to p5p. Finally, we talked -about how to use external tools to debug and test Perl. - -I'd now suggest you read over those references again, and then, as soon -as possible, get your hands dirty. The best way to learn is by doing, -so: - -=over 3 - -=item * - -Subscribe to perl5-porters, follow the patches and try and understand -them; don't be afraid to ask if there's a portion you're not clear on - -who knows, you may unearth a bug in the patch... - -=item * - -Keep up to date with the bleeding edge Perl distributions and get -familiar with the changes. Try and get an idea of what areas people are -working on and the changes they're making. - -=item * - -Do read the README associated with your operating system, e.g. README.aix -on the IBM AIX OS. Don't hesitate to supply patches to that README if -you find anything missing or changed over a new OS release. - -=item * - -Find an area of Perl that seems interesting to you, and see if you can -work out how it works. Scan through the source, and step over it in the -debugger. Play, poke, investigate, fiddle! You'll probably get to -understand not just your chosen area but a much wider range of F's -activity as well, and probably sooner than you'd think. - -=back - -=over 3 - -=item I - -=back - -If you can do these things, you've started on the long road to Perl porting. -Thanks for wanting to help make Perl better - and happy hacking! - -=head1 AUTHOR - -This document was written by Nathan Torkington, and is maintained by -the perl5-porters mailing list. - diff --git a/lib/perl5/5.6.1/pods/perlhist.pod b/lib/perl5/5.6.1/pods/perlhist.pod deleted file mode 100644 index 914c9639..00000000 --- a/lib/perl5/5.6.1/pods/perlhist.pod +++ /dev/null @@ -1,571 +0,0 @@ -=head1 NAME - -perlhist - the Perl history records - -=for RCS - -=begin RCS - -# -# $Id: perlhist.pod,v 1.2 2000/01/24 11:44:47 jhi Exp $ -# - -=end RCS - -=head1 DESCRIPTION - -This document aims to record the Perl source code releases. - -=head1 INTRODUCTION - -Perl history in brief, by Larry Wall: - - Perl 0 introduced Perl to my officemates. - Perl 1 introduced Perl to the world, and changed /\(...\|...\)/ to - /(...|...)/. \(Dan Faigin still hasn't forgiven me. :-\) - Perl 2 introduced Henry Spencer's regular expression package. - Perl 3 introduced the ability to handle binary data (embedded nulls). - Perl 4 introduced the first Camel book. Really. We mostly just - switched version numbers so the book could refer to 4.000. - Perl 5 introduced everything else, including the ability to - introduce everything else. - -=head1 THE KEEPERS OF THE PUMPKIN - -Larry Wall, Andy Dougherty, Tom Christiansen, Charles Bailey, Nick -Ing-Simmons, Chip Salzenberg, Tim Bunce, Malcolm Beattie, Gurusamy -Sarathy, Graham Barr, Jarkko Hietaniemi. - -=head2 PUMPKIN? - -[from Porting/pumpkin.pod in the Perl source code distribution] - -Chip Salzenberg gets credit for that, with a nod to his cow orker, -David Croy. We had passed around various names (baton, token, hot -potato) but none caught on. Then, Chip asked: - -[begin quote] - - Who has the patch pumpkin? - -To explain: David Croy once told me once that at a previous job, -there was one tape drive and multiple systems that used it for backups. -But instead of some high-tech exclusion software, they used a low-tech -method to prevent multiple simultaneous backups: a stuffed pumpkin. -No one was allowed to make backups unless they had the "backup pumpkin". - -[end quote] - -The name has stuck. The holder of the pumpkin is sometimes called -the pumpking (keeping the source afloat?) or the pumpkineer (pulling -the strings?). - -=head1 THE RECORDS - - Pump- Release Date Notes - king (by no means - comprehensive, - see Changes* - for details) - =========================================================================== - - Larry 0 Classified. Don't ask. - - Larry 1.000 1987-Dec-18 - - 1.001..10 1988-Jan-30 - 1.011..14 1988-Feb-02 - - Larry 2.000 1988-Jun-05 - - 2.001 1988-Jun-28 - - Larry 3.000 1989-Oct-18 - - 3.001 1989-Oct-26 - 3.002..4 1989-Nov-11 - 3.005 1989-Nov-18 - 3.006..8 1989-Dec-22 - 3.009..13 1990-Mar-02 - 3.014 1990-Mar-13 - 3.015 1990-Mar-14 - 3.016..18 1990-Mar-28 - 3.019..27 1990-Aug-10 User subs. - 3.028 1990-Aug-14 - 3.029..36 1990-Oct-17 - 3.037 1990-Oct-20 - 3.040 1990-Nov-10 - 3.041 1990-Nov-13 - 3.042..43 1990-Jan-?? - 3.044 1991-Jan-12 - - Larry 4.000 1991-Mar-21 - - 4.001..3 1991-Apr-12 - 4.004..9 1991-Jun-07 - 4.010 1991-Jun-10 - 4.011..18 1991-Nov-05 - 4.019 1991-Nov-11 Stable. - 4.020..33 1992-Jun-08 - 4.034 1992-Jun-11 - 4.035 1992-Jun-23 - Larry 4.036 1993-Feb-05 Very stable. - - 5.000alpha1 1993-Jul-31 - 5.000alpha2 1993-Aug-16 - 5.000alpha3 1993-Oct-10 - 5.000alpha4 1993-???-?? - 5.000alpha5 1993-???-?? - 5.000alpha6 1994-Mar-18 - 5.000alpha7 1994-Mar-25 - Andy 5.000alpha8 1994-Apr-04 - Larry 5.000alpha9 1994-May-05 ext appears. - 5.000alpha10 1994-Jun-11 - 5.000alpha11 1994-Jul-01 - Andy 5.000a11a 1994-Jul-07 To fit 14. - 5.000a11b 1994-Jul-14 - 5.000a11c 1994-Jul-19 - 5.000a11d 1994-Jul-22 - Larry 5.000alpha12 1994-Aug-04 - Andy 5.000a12a 1994-Aug-08 - 5.000a12b 1994-Aug-15 - 5.000a12c 1994-Aug-22 - 5.000a12d 1994-Aug-22 - 5.000a12e 1994-Aug-22 - 5.000a12f 1994-Aug-24 - 5.000a12g 1994-Aug-24 - 5.000a12h 1994-Aug-24 - Larry 5.000beta1 1994-Aug-30 - Andy 5.000b1a 1994-Sep-06 - Larry 5.000beta2 1994-Sep-14 Core slushified. - Andy 5.000b2a 1994-Sep-14 - 5.000b2b 1994-Sep-17 - 5.000b2c 1994-Sep-17 - Larry 5.000beta3 1994-Sep-?? - Andy 5.000b3a 1994-Sep-18 - 5.000b3b 1994-Sep-22 - 5.000b3c 1994-Sep-23 - 5.000b3d 1994-Sep-27 - 5.000b3e 1994-Sep-28 - 5.000b3f 1994-Sep-30 - 5.000b3g 1994-Oct-04 - Andy 5.000b3h 1994-Oct-07 - Larry? 5.000gamma 1994-Oct-13? - - Larry 5.000 1994-Oct-17 - - Andy 5.000a 1994-Dec-19 - 5.000b 1995-Jan-18 - 5.000c 1995-Jan-18 - 5.000d 1995-Jan-18 - 5.000e 1995-Jan-18 - 5.000f 1995-Jan-18 - 5.000g 1995-Jan-18 - 5.000h 1995-Jan-18 - 5.000i 1995-Jan-26 - 5.000j 1995-Feb-07 - 5.000k 1995-Feb-11 - 5.000l 1995-Feb-21 - 5.000m 1995-Feb-28 - 5.000n 1995-Mar-07 - 5.000o 1995-Mar-13? - - Larry 5.001 1995-Mar-13 - - Andy 5.001a 1995-Mar-15 - 5.001b 1995-Mar-31 - 5.001c 1995-Apr-07 - 5.001d 1995-Apr-14 - 5.001e 1995-Apr-18 Stable. - 5.001f 1995-May-31 - 5.001g 1995-May-25 - 5.001h 1995-May-25 - 5.001i 1995-May-30 - 5.001j 1995-Jun-05 - 5.001k 1995-Jun-06 - 5.001l 1995-Jun-06 Stable. - 5.001m 1995-Jul-02 Very stable. - 5.001n 1995-Oct-31 Very unstable. - 5.002beta1 1995-Nov-21 - 5.002b1a 1995-Dec-04 - 5.002b1b 1995-Dec-04 - 5.002b1c 1995-Dec-04 - 5.002b1d 1995-Dec-04 - 5.002b1e 1995-Dec-08 - 5.002b1f 1995-Dec-08 - Tom 5.002b1g 1995-Dec-21 Doc release. - Andy 5.002b1h 1996-Jan-05 - 5.002b2 1996-Jan-14 - Larry 5.002b3 1996-Feb-02 - Andy 5.002gamma 1996-Feb-11 - Larry 5.002delta 1996-Feb-27 - - Larry 5.002 1996-Feb-29 Prototypes. - - Charles 5.002_01 1996-Mar-25 - - 5.003 1996-Jun-25 Security release. - - 5.003_01 1996-Jul-31 - Nick 5.003_02 1996-Aug-10 - Andy 5.003_03 1996-Aug-28 - 5.003_04 1996-Sep-02 - 5.003_05 1996-Sep-12 - 5.003_06 1996-Oct-07 - 5.003_07 1996-Oct-10 - Chip 5.003_08 1996-Nov-19 - 5.003_09 1996-Nov-26 - 5.003_10 1996-Nov-29 - 5.003_11 1996-Dec-06 - 5.003_12 1996-Dec-19 - 5.003_13 1996-Dec-20 - 5.003_14 1996-Dec-23 - 5.003_15 1996-Dec-23 - 5.003_16 1996-Dec-24 - 5.003_17 1996-Dec-27 - 5.003_18 1996-Dec-31 - 5.003_19 1997-Jan-04 - 5.003_20 1997-Jan-07 - 5.003_21 1997-Jan-15 - 5.003_22 1997-Jan-16 - 5.003_23 1997-Jan-25 - 5.003_24 1997-Jan-29 - 5.003_25 1997-Feb-04 - 5.003_26 1997-Feb-10 - 5.003_27 1997-Feb-18 - 5.003_28 1997-Feb-21 - 5.003_90 1997-Feb-25 Ramping up to the 5.004 release. - 5.003_91 1997-Mar-01 - 5.003_92 1997-Mar-06 - 5.003_93 1997-Mar-10 - 5.003_94 1997-Mar-22 - 5.003_95 1997-Mar-25 - 5.003_96 1997-Apr-01 - 5.003_97 1997-Apr-03 Fairly widely used. - 5.003_97a 1997-Apr-05 - 5.003_97b 1997-Apr-08 - 5.003_97c 1997-Apr-10 - 5.003_97d 1997-Apr-13 - 5.003_97e 1997-Apr-15 - 5.003_97f 1997-Apr-17 - 5.003_97g 1997-Apr-18 - 5.003_97h 1997-Apr-24 - 5.003_97i 1997-Apr-25 - 5.003_97j 1997-Apr-28 - 5.003_98 1997-Apr-30 - 5.003_99 1997-May-01 - 5.003_99a 1997-May-09 - p54rc1 1997-May-12 Release Candidates. - p54rc2 1997-May-14 - - Chip 5.004 1997-May-15 A major maintenance release. - - Tim 5.004_01 1997-Jun-13 The 5.004 maintenance track. - 5.004_02 1997-Aug-07 - 5.004_03 1997-Sep-05 - 5.004_04 1997-Oct-15 - 5.004m5t1 1998-Mar-04 Maintenance Trials (for 5.004_05). - 5.004_04-m2 1997-May-01 - 5.004_04-m3 1998-May-15 - 5.004_04-m4 1998-May-19 - 5.004_04-MT5 1998-Jul-21 - 5.004_04-MT6 1998-Oct-09 - 5.004_04-MT7 1998-Nov-22 - 5.004_04-MT8 1998-Dec-03 - Chip 5.004_04-MT9 1999-Apr-26 - 5.004_05 1999-Apr-29 - - Malcolm 5.004_50 1997-Sep-09 The 5.005 development track. - 5.004_51 1997-Oct-02 - 5.004_52 1997-Oct-15 - 5.004_53 1997-Oct-16 - 5.004_54 1997-Nov-14 - 5.004_55 1997-Nov-25 - 5.004_56 1997-Dec-18 - 5.004_57 1998-Feb-03 - 5.004_58 1998-Feb-06 - 5.004_59 1998-Feb-13 - 5.004_60 1998-Feb-20 - 5.004_61 1998-Feb-27 - 5.004_62 1998-Mar-06 - 5.004_63 1998-Mar-17 - 5.004_64 1998-Apr-03 - 5.004_65 1998-May-15 - 5.004_66 1998-May-29 - Sarathy 5.004_67 1998-Jun-15 - 5.004_68 1998-Jun-23 - 5.004_69 1998-Jun-29 - 5.004_70 1998-Jul-06 - 5.004_71 1998-Jul-09 - 5.004_72 1998-Jul-12 - 5.004_73 1998-Jul-13 - 5.004_74 1998-Jul-14 5.005 beta candidate. - 5.004_75 1998-Jul-15 5.005 beta1. - 5.004_76 1998-Jul-21 5.005 beta2. - 5.005 1998-Jul-22 Oneperl. - - Sarathy 5.005_01 1998-Jul-27 The 5.005 maintenance track. - 5.005_02-T1 1998-Aug-02 - 5.005_02-T2 1998-Aug-05 - 5.005_02 1998-Aug-08 - Graham 5.005_03-MT1 1998-Nov-30 - 5.005_03-MT2 1999-Jan-04 - 5.005_03-MT3 1999-Jan-17 - 5.005_03-MT4 1999-Jan-26 - 5.005_03-MT5 1999-Jan-28 - 5.005_03 1999-Mar-28 - Chip 5.005_04 2000-***-** - - Sarathy 5.005_50 1998-Jul-26 The 5.6 development track. - 5.005_51 1998-Aug-10 - 5.005_52 1998-Sep-25 - 5.005_53 1998-Oct-31 - 5.005_54 1998-Nov-30 - 5.005_55 1999-Feb-16 - 5.005_56 1999-Mar-01 - 5.005_57 1999-May-25 - 5.005_58 1999-Jul-27 - 5.005_59 1999-Aug-02 - 5.005_60 1999-Aug-02 - 5.005_61 1999-Aug-20 - 5.005_62 1999-Oct-15 - 5.005_63 1999-Dec-09 - 5.5.640 2000-Feb-02 - 5.5.650 2000-Feb-08 beta1 - 5.5.660 2000-Feb-22 beta2 - 5.5.670 2000-Feb-29 beta3 - 5.6.0-RC1 2000-Mar-09 release candidate 1 - 5.6.0-RC2 2000-Mar-14 release candidate 2 - 5.6.0-RC3 2000-Mar-21 release candidate 3 - 5.6.0 2000-Mar-22 - - Sarathy 5.6.1-TRIAL1 2000-Dec-18 The 5.6 maintenance track. - 5.6.1-TRIAL2 2001-Jan-31 - 5.6.1-TRIAL3 2001-Mar-19 - 5.6.1-foolish 2001-Apr-01 The "fools-gold" release. - 5.6.1 2001-Apr-08 - - Jarkko 5.7.0 2000-Sep-02 The 5.7 track: Development. - -=head2 SELECTED RELEASE SIZES - -For example the notation "core: 212 29" in the release 1.000 means that -it had in the core 212 kilobytes, in 29 files. The "core".."doc" are -explained below. - - release core lib ext t doc - ====================================================================== - - 1.000 212 29 - - - - 38 51 62 3 - 1.014 219 29 - - - - 39 52 68 4 - 2.000 309 31 2 3 - - 55 57 92 4 - 2.001 312 31 2 3 - - 55 57 94 4 - 3.000 508 36 24 11 - - 79 73 156 5 - 3.044 645 37 61 20 - - 90 74 190 6 - 4.000 635 37 59 20 - - 91 75 198 4 - 4.019 680 37 85 29 - - 98 76 199 4 - 4.036 709 37 89 30 - - 98 76 208 5 - 5.000alpha2 785 50 114 32 - - 112 86 209 5 - 5.000alpha3 801 50 117 33 - - 121 87 209 5 - 5.000alpha9 1022 56 149 43 116 29 125 90 217 6 - 5.000a12h 978 49 140 49 205 46 152 97 228 9 - 5.000b3h 1035 53 232 70 216 38 162 94 218 21 - 5.000 1038 53 250 76 216 38 154 92 536 62 - 5.001m 1071 54 388 82 240 38 159 95 544 29 - 5.002 1121 54 661 101 287 43 155 94 847 35 - 5.003 1129 54 680 102 291 43 166 100 853 35 - 5.003_07 1231 60 748 106 396 53 213 137 976 39 - 5.004 1351 60 1230 136 408 51 355 161 1587 55 - 5.004_01 1356 60 1258 138 410 51 358 161 1587 55 - 5.004_04 1375 60 1294 139 413 51 394 162 1629 55 - 5.004_05 1463 60 1435 150 394 50 445 175 1855 59 - 5.004_51 1401 61 1260 140 413 53 358 162 1594 56 - 5.004_53 1422 62 1295 141 438 70 394 162 1637 56 - 5.004_56 1501 66 1301 140 447 74 408 165 1648 57 - 5.004_59 1555 72 1317 142 448 74 424 171 1678 58 - 5.004_62 1602 77 1327 144 629 92 428 173 1674 58 - 5.004_65 1626 77 1358 146 615 92 446 179 1698 60 - 5.004_68 1856 74 1382 152 619 92 463 187 1784 60 - 5.004_70 1863 75 1456 154 675 92 494 194 1809 60 - 5.004_73 1874 76 1467 152 762 102 506 196 1883 61 - 5.004_75 1877 76 1467 152 770 103 508 196 1896 62 - 5.005 1896 76 1469 152 795 103 509 197 1945 63 - 5.005_03 1936 77 1541 153 813 104 551 201 2176 72 - 5.005_50 1969 78 1842 301 795 103 514 198 1948 63 - 5.005_53 1999 79 1885 303 806 104 602 224 2002 67 - 5.005_56 2086 79 1970 307 866 113 672 238 2221 75 - -The "core"..."doc" mean the following files from the Perl source code -distribution. The glob notation ** means recursively, (.) means -regular files. - - core *.[hcy] - lib lib/**/*.p[ml] - ext ext/**/*.{[hcyt],xs,pm} - t t/**/*(.) - doc {README*,INSTALL,*[_.]man{,.?},pod/**/*.pod} - -Here are some statistics for the other subdirectories and one file in -the Perl source distribution for somewhat more selected releases. - - ====================================================================== - Legend: kB # - - 1.014 2.001 3.044 4.000 4.019 4.036 - - atarist - - - - - - - - - - 113 31 - Configure 31 1 37 1 62 1 73 1 83 1 86 1 - eg - - 34 28 47 39 47 39 47 39 47 39 - emacs - - - - - - 67 4 67 4 67 4 - h2pl - - - - 12 12 12 12 12 12 12 12 - hints - - - - - - - - 5 42 11 56 - msdos - - - - 41 13 57 15 58 15 60 15 - os2 - - - - 63 22 81 29 81 29 113 31 - usub - - - - 21 16 25 7 43 8 43 8 - x2p 103 17 104 17 137 17 147 18 152 19 154 19 - - ====================================================================== - - 5.000a2 5.000a12h 5.000b3h 5.000 5.001m 5.002 5.003 - - atarist 113 31 113 31 - - - - - - - - - - - bench - - 0 1 - - - - - - - - - - - Bugs 2 5 26 1 - - - - - - - - - - - dlperl 40 5 - - - - - - - - - - - - - do 127 71 - - - - - - - - - - - - - Configure - - 153 1 159 1 160 1 180 1 201 1 201 1 - Doc - - 26 1 75 7 11 1 11 1 - - - - - eg 79 58 53 44 51 43 54 44 54 44 54 44 54 44 - emacs 67 4 104 6 104 6 104 1 104 6 108 1 108 1 - h2pl 12 12 12 12 12 12 12 12 12 12 12 12 12 12 - hints 11 56 12 46 18 48 18 48 44 56 73 59 77 60 - msdos 60 15 60 15 - - - - - - - - - - - os2 113 31 113 31 - - - - - - 84 17 56 10 - U - - 62 8 112 42 - - - - - - - - - usub 43 8 - - - - - - - - - - - - - utils - - - - - - - - - - 87 7 88 7 - vms - - 80 7 123 9 184 15 304 20 500 24 475 26 - x2p 171 22 171 21 162 20 162 20 279 20 280 20 280 20 - - ====================================================================== - - 5.003_07 5.004 5.004_04 5.004_62 5.004_65 5.004_68 - - beos - - - - - - - - 1 1 1 1 - Configure 217 1 225 1 225 1 240 1 248 1 256 1 - cygwin32 - - 23 5 23 5 23 5 24 5 24 5 - djgpp - - - - - - 14 5 14 5 14 5 - eg 54 44 81 62 81 62 81 62 81 62 81 62 - emacs 143 1 194 1 204 1 212 2 212 2 212 2 - h2pl 12 12 12 12 12 12 12 12 12 12 12 12 - hints 90 62 129 69 132 71 144 72 151 74 155 74 - os2 117 42 121 42 127 42 127 44 129 44 129 44 - plan9 79 15 82 15 82 15 82 15 82 15 82 15 - Porting 51 1 94 2 109 4 203 6 234 8 241 9 - qnx - - 1 2 1 2 1 2 1 2 1 2 - utils 97 7 112 8 118 8 124 8 156 9 159 9 - vms 505 27 518 34 524 34 538 34 569 34 569 34 - win32 - - 285 33 378 36 470 39 493 39 575 41 - x2p 280 19 281 19 281 19 281 19 282 19 281 19 - - ====================================================================== - - 5.004_70 5.004_73 5.004_75 5.005 5.005_03 - - apollo - - - - - - - - 0 1 - beos 1 1 1 1 1 1 1 1 1 1 - Configure 256 1 256 1 264 1 264 1 270 1 - cygwin32 24 5 24 5 24 5 24 5 24 5 - djgpp 14 5 14 5 14 5 14 5 15 5 - eg 86 65 86 65 86 65 86 65 86 65 - emacs 262 2 262 2 262 2 262 2 274 2 - h2pl 12 12 12 12 12 12 12 12 12 12 - hints 157 74 157 74 159 74 160 74 179 77 - mint - - - - - - - - 4 7 - mpeix - - - - 5 3 5 3 5 3 - os2 129 44 139 44 142 44 143 44 148 44 - plan9 82 15 82 15 82 15 82 15 82 15 - Porting 241 9 253 9 259 10 264 12 272 13 - qnx 1 2 1 2 1 2 1 2 1 2 - utils 160 9 160 9 160 9 160 9 164 9 - vms 570 34 572 34 573 34 575 34 583 34 - vos - - - - - - - - 156 10 - win32 577 41 585 41 585 41 587 41 600 42 - x2p 281 19 281 19 281 19 281 19 281 19 - -=head2 SELECTED PATCH SIZES - -The "diff lines kb" means that for example the patch 5.003_08, to be -applied on top of the 5.003_07 (or whatever was before the 5.003_08) -added lines for 110 kilobytes, it removed lines for 19 kilobytes, and -changed lines for 424 kilobytes. Just the lines themselves are -counted, not their context. The "+ - !" become from the diff(1) -context diff output format. - - Pump- Release Date diff lines kB - king ------------- - + - ! - =========================================================================== - - Chip 5.003_08 1996-Nov-19 110 19 424 - 5.003_09 1996-Nov-26 38 9 248 - 5.003_10 1996-Nov-29 29 2 27 - 5.003_11 1996-Dec-06 73 12 165 - 5.003_12 1996-Dec-19 275 6 436 - 5.003_13 1996-Dec-20 95 1 56 - 5.003_14 1996-Dec-23 23 7 333 - 5.003_15 1996-Dec-23 0 0 1 - 5.003_16 1996-Dec-24 12 3 50 - 5.003_17 1996-Dec-27 19 1 14 - 5.003_18 1996-Dec-31 21 1 32 - 5.003_19 1997-Jan-04 80 3 85 - 5.003_20 1997-Jan-07 18 1 146 - 5.003_21 1997-Jan-15 38 10 221 - 5.003_22 1997-Jan-16 4 0 18 - 5.003_23 1997-Jan-25 71 15 119 - 5.003_24 1997-Jan-29 426 1 20 - 5.003_25 1997-Feb-04 21 8 169 - 5.003_26 1997-Feb-10 16 1 15 - 5.003_27 1997-Feb-18 32 10 38 - 5.003_28 1997-Feb-21 58 4 66 - 5.003_90 1997-Feb-25 22 2 34 - 5.003_91 1997-Mar-01 37 1 39 - 5.003_92 1997-Mar-06 16 3 69 - 5.003_93 1997-Mar-10 12 3 15 - 5.003_94 1997-Mar-22 407 7 200 - 5.003_95 1997-Mar-25 41 1 37 - 5.003_96 1997-Apr-01 283 5 261 - 5.003_97 1997-Apr-03 13 2 34 - 5.003_97a 1997-Apr-05 57 1 27 - 5.003_97b 1997-Apr-08 14 1 20 - 5.003_97c 1997-Apr-10 20 1 16 - 5.003_97d 1997-Apr-13 8 0 16 - 5.003_97e 1997-Apr-15 15 4 46 - 5.003_97f 1997-Apr-17 7 1 33 - 5.003_97g 1997-Apr-18 6 1 42 - 5.003_97h 1997-Apr-24 23 3 68 - 5.003_97i 1997-Apr-25 23 1 31 - 5.003_97j 1997-Apr-28 36 1 49 - 5.003_98 1997-Apr-30 171 12 539 - 5.003_99 1997-May-01 6 0 7 - 5.003_99a 1997-May-09 36 2 61 - p54rc1 1997-May-12 8 1 11 - p54rc2 1997-May-14 6 0 40 - - 5.004 1997-May-15 4 0 4 - - Tim 5.004_01 1997-Jun-13 222 14 57 - 5.004_02 1997-Aug-07 112 16 119 - 5.004_03 1997-Sep-05 109 0 17 - 5.004_04 1997-Oct-15 66 8 173 - -=head1 THE KEEPERS OF THE RECORDS - -Jarkko Hietaniemi >. - -Thanks to the collective memory of the Perlfolk. In addition to the -Keepers of the Pumpkin also Alan Champion, Andreas König, John -Macdonald, Matthias Neeracher, Jeff Okamoto, Michael Peppler, -Randal Schwartz, and Paul D. Smith sent corrections and additions. - -=cut diff --git a/lib/perl5/5.6.1/pods/perlhpux.pod b/lib/perl5/5.6.1/pods/perlhpux.pod deleted file mode 100644 index 7d019835..00000000 --- a/lib/perl5/5.6.1/pods/perlhpux.pod +++ /dev/null @@ -1,280 +0,0 @@ -If you read this file _as_is_, just ignore the funny characters you see. -It is written in the POD format (see pod/perlpod.pod) which is specially -designed to be readable as is. - -=head1 NAME - -README.hpux - Perl version 5 on Hewlett-Packard Unix (HP-UX) systems - -=head1 DESCRIPTION - -This document describes various features of HP's Unix operating system -(HP-UX) that will affect how Perl version 5 (hereafter just Perl) is -compiled and/or runs. - -=head2 Compiling Perl 5 on HP-UX - -When compiling Perl, you must use an ANSI C compiler. The C compiler -that ships with all HP-UX systems is a K&R compiler that should only be -used to build new kernels. - -Perl can be compiled with either HP's ANSI C compiler or with gcc. The -former is recommended, as not only can it compile Perl with no -difficulty, but also can take advantage of features listed later that -require the use of HP compiler-specific command-line flags. - -If you decide to use gcc, make sure your installation is recent and -complete, and be sure to read the Perl README file for more gcc-specific -details. - -=head2 PA-RISC - -HP's current Unix systems run on its own Precision Architecture -(PA-RISC) chip. HP-UX used to run on the Motorola MC68000 family of -chips, but any machine with this chip in it is quite obsolete and this -document will not attempt to address issues for compiling Perl on the -Motorola chipset. - -The most recent version of PA-RISC at the time of this document's last -update is 2.0. - -=head2 PA-RISC 1.0 - -The original version of PA-RISC, HP no longer sells any system with this chip. - -The following systems contain PA-RISC 1.0 chips: - - 600, 635, 645, 808, 815, 822, 825, 832, 834, 835, 840, 842, 845, 850, 852, - 855, 860, 865, 870, 890 - -=head2 PA-RISC 1.1 - -An upgrade to the PA-RISC design, it shipped for many years in many different -system. - -The following systems contain with PA-RISC 1.1 chips: - - 705, 710, 712, 715, 720, 722, 725, 728, 730, 735, 742, 743, 745, 747, 750, - 755, 770, 777, 778, 779, 800, 801, 803, 806, 807, 809, 811, 813, 816, 817, - 819, 821, 826, 827, 829, 831, 837, 839, 841, 847, 849, 851, 856, 857, 859, - 867, 869, 877, 887, 891, 892, 897, A180, A180C, B115, B120, B132L, B132L+, - B160L, B180L, C100, C110, C115, C120, C160L, D200, D210, D220, D230, D250, - D260, D310, D320, D330, D350, D360, D410, DX0, DX5, DZO, E25, E35, E45, - E55, F10, F20, F30, G30, G40, G50, G60, G70, H20, H30, H40, H50, H60, H70, - I30, I40, I50, I60, I70, J200, J210, J210XC, K100, K200, K210, K220, K230, - K400, K410, K420, S700i, S715, S724, S760, T500, T520 - -=head2 PA-RISC 2.0 - -The most recent upgrade to the PA-RISC design, it added support for -64-bit integer data. - -As of the date of this document's last update, the following systems -contain PA-RISC 2.0 chips (this is very likely to be out of date): - - 700, 780, 781, 782, 783, 785, 802, 804, 810, 820, 861, 871, 879, 889, 893, - 895, 896, 898, 899, B1000, C130, C140, C160, C180, C180+, C180-XP, C200+, - C400+, C3000, C360, CB260, D270, D280, D370, D380, D390, D650, J220, J2240, - J280, J282, J400, J410, J5000, J7000, K250, K260, K260-EG, K270, K360, - K370, K380, K450, K460, K460-EG, K460-XP, K470, K570, K580, L1000, L2000, - N4000, R380, R390, T540, T600, V2000, V2200, V2250, V2500 - -A complete list of models at the time the OS was built is in the file -/opt/langtools/lib/sched.models. The first column corresponds to the -output of the "uname -m" command (without the leading "9000/"). The -second column is the PA-RISC version and the third column is the exact -chip type used. - -=head2 Portability Between PA-RISC Versions - -An executable compiled on a PA-RISC 2.0 platform will not execute on a -PA-RISC 1.1 platform, even if they are running the same version of -HP-UX. If you are building Perl on a PA-RISC 2.0 platform and want that -Perl to to also run on a PA-RISC 1.1, the compiler flags +DAportable and -+DS32 should be used. - -It is no longer possible to compile PA-RISC 1.0 executables on either -the PA-RISC 1.1 or 2.0 platforms. - -=head2 Building Dynamic Extensions on HP-UX - -HP-UX supports dynamically loadable libraries (shared libraries). -Shared libraries end with the suffix .sl. - -Shared libraries created on a platform using a particular PA-RISC -version are not usable on platforms using an earlier PA-RISC version by -default. However, this backwards compatibility may be enabled using the -same +DAportable compiler flag (with the same PA-RISC 1.0 caveat -mentioned above). - -To create a shared library, the following steps must be performed: - - 1. Compile source modules with +z or +Z flag to create a .o module - which contains Position-Independent Code (PIC). The linker will - tell you in the next step if +Z was needed. - - 2. Link the shared library using the -b flag. If the code calls - any functions in other system libraries (e.g., libm), it must - be included on this line. - -(Note that these steps are usually handled automatically by the extension's -Makefile). - -If these dependent libraries are not listed at shared library creation -time, you will get fatal "Unresolved symbol" errors at run time when the -library is loaded. - -You may create a shared library that refers to another library, which -may be either an archive library or a shared library. If this second -library is a shared library, this is called a "dependent library". The -dependent library's name is recorded in the main shared library, but it -is not linked into the shared library. Instead, it is loaded when the -main shared library is loaded. This can cause problems if you build an -extension on one system and move it to another system where the -libraries may not be located in the same place as on the first system. - -If the referred library is an archive library, then it is treated as a -simple collection of .o modules (all of which must contain PIC). These -modules are then linked into the shared library. - -Note that it is okay to create a library which contains a dependent -library that is already linked into perl. - -It is no longer possible to link PA-RISC 1.0 shared libraries. - -=head2 The HP ANSI C Compiler - -When using this compiler to build Perl, you should make sure that the -flag -Aa is added to the cpprun and cppstdin variables in the config.sh -file (though see the section on 64-bit perl below). - -=head2 Using Large Files with Perl - -Beginning with HP-UX version 10.20, files larger than 2GB (2^31 bytes) -may be created and manipulated. Three separate methods of doing this -are available. Of these methods, the best method for Perl is to compile -using the -Duselargefiles flag to Configure. This causes Perl to be -compiled using structures and functions in which these are 64 bits wide, -rather than 32 bits wide. (Note that this will only work with HP's ANSI -C compiler. If you want to compile Perl using gcc, you will have to get -a version of the compiler that support 64-bit operations.) - -There are some drawbacks to this approach. One is that any extension -which calls any file-manipulating C function will need to be recompiled -(just follow the usual "perl Makefile.PL; make; make test; make install" -procedure). - -The list of functions that will need to recompiled is: -creat, fgetpos, fopen, -freopen, fsetpos, fstat, -fstatvfs, fstatvfsdev, ftruncate, -ftw, lockf, lseek, -lstat, mmap, nftw, -open, prealloc, stat, -statvfs, statvfsdev, tmpfile, -truncate, getrlimit, setrlimit - -Another drawback is only valid for Perl versions before 5.6.0. This -drawback is that the seek and tell functions (both the builtin version -and POSIX module version) will not perform correctly. - -It is strongly recommended that you use this flag when you run -Configure. If you do not do this, but later answer the question about -large files when Configure asks you, you may get a configuration that -cannot be compiled, or that does not function as expected. - -=head2 Threaded Perl - -It is possible to compile a version of threaded Perl on any version of -HP-UX before 10.30, but it is strongly suggested that you be running on -HP-UX 11.00 at least. - -To compile Perl with threads, add -Dusethreads to the arguments of -Configure. Verify that the -D_POSIX_C_SOURCE=199506L compiler flag is -automatically added to the list of flags. Also make sure that -lpthread -is listed before -lc in the list of libraries to link Perl with. - -As of the date of this document, Perl threads are not fully supported on -HP-UX. - -HP-UX versions before 10.30 require a seperate installation of a POSIX -threads library package. Two examples are the HP DCE package, available -on "HP-UX Hardware Extensions 3.0, Install and Core OS, Release 10.20, -April 1999 (B3920-13941)" or the Freely available PTH package, available -though worldwide HP-UX mirrors of precompiled packages -(e.g. http://hpux.tn.tudelft.nl/hppd/hpux/alpha.html) - -=head2 64-bit Perl - -Beginning with HP-UX 11.00, programs compiled under HP-UX can take -advantage of the LP64 programming environment (LP64 means Longs and -Pointers are 64 bits wide). - -Work is being performed on Perl to make it 64-bit compliant on all -versions of Unix. Once this is complete, scalar variables will be able -to hold numbers larger than 2^32 with complete precision. - -As of the date of this document, Perl is not 64-bit compliant on HP-UX. - -Should a user wish to experiment with compiling Perl in the LP64 -environment, use the -Duse64bitall flag to Configure. This will force -Perl to be compiled in a pure LP64 environment (via the +DD64 flag). - -You can also use the -Duse64bitint flag to Configure. Although there -are some minor differences between compiling Perl with this flag versus -the -Duse64bitall flag, they should not be noticeable from a Perl user's -perspective. - -In both cases, it is strongly recommended that you use these flags when -you run Configure. If you do not use do this, but later answer the -questions about 64-bit numbers when Configure asks you, you may get a -configuration that cannot be compiled, or that does not function as -expected. - -(Note that these Configure flags will only work with HP's ANSI C -compiler. If you want to compile Perl using gcc, you will have to get a -version of the compiler that support 64-bit operations.) - -=head2 GDBM and Threads - -If you attempt to compile Perl with threads on an 11.X system and also -link in the GDBM library, then Perl will immediately core dump when it -starts up. The only workaround at this point is to relink the GDBM -library under 11.X, then relink it into Perl. - -=head2 NFS filesystems and utime(2) - -If you are compiling Perl on a remotely-mounted NFS filesystem, the test -io/fs.t may fail on test #18. This appears to be a bug in HP-UX and no -fix is currently available. - -=head2 perl -P and // - -In HP-UX Perl is compiled with flags that will cause problems if the --P flag of Perl (preprocess Perl code with the C preprocessor before -perl sees it) is used. The problem is that C, being a C++-style -until-end-of-line comment, will disappear along with the remainder -of the line. This means that common Perl constructs like - - s/foo//; - -will turn into illegal code - - s/foo - -The workaround is to use some other quoting separator than C<"/">, -like for example C<"!">: - - s!foo!!; - -=head1 AUTHOR - -Jeff Okamoto - -With much assistance regarding shared libraries from Marc Sabatella. - -=head1 DATE - -Version 0.6.2: 2001-02-02 - -=cut diff --git a/lib/perl5/5.6.1/pods/perlintern.pod b/lib/perl5/5.6.1/pods/perlintern.pod deleted file mode 100644 index e50be288..00000000 --- a/lib/perl5/5.6.1/pods/perlintern.pod +++ /dev/null @@ -1,120 +0,0 @@ -=head1 NAME - -perlintern - autogenerated documentation of purely B - Perl functions - -=head1 DESCRIPTION - -This file is the autogenerated documentation of functions in the -Perl interpreter that are documented using Perl's internal documentation -format but are not marked as part of the Perl API. In other words, -B! - -=over 8 - -=item is_gv_magical - -Returns C if given the name of a magical GV. - -Currently only useful internally when determining if a GV should be -created even in rvalue contexts. - -C is not used at present but available for future extension to -allow selecting particular classes of magical variable. - - bool is_gv_magical(char *name, STRLEN len, U32 flags) - -=for hackers -Found in file gv.c - -=item LVRET - -True if this op will be the return value of an lvalue subroutine - -=for hackers -Found in file pp.h - -=item PL_DBsingle - -When Perl is run in debugging mode, with the B<-d> switch, this SV is a -boolean which indicates whether subs are being single-stepped. -Single-stepping is automatically turned on after every step. This is the C -variable which corresponds to Perl's $DB::single variable. See -C. - - SV * PL_DBsingle - -=for hackers -Found in file intrpvar.h - -=item PL_DBsub - -When Perl is run in debugging mode, with the B<-d> switch, this GV contains -the SV which holds the name of the sub being debugged. This is the C -variable which corresponds to Perl's $DB::sub variable. See -C. - - GV * PL_DBsub - -=for hackers -Found in file intrpvar.h - -=item PL_DBtrace - -Trace variable used when Perl is run in debugging mode, with the B<-d> -switch. This is the C variable which corresponds to Perl's $DB::trace -variable. See C. - - SV * PL_DBtrace - -=for hackers -Found in file intrpvar.h - -=item PL_dowarn - -The C variable which corresponds to Perl's $^W warning variable. - - bool PL_dowarn - -=for hackers -Found in file intrpvar.h - -=item PL_last_in_gv - -The GV which was last used for a filehandle input operation. (C<< >>) - - GV* PL_last_in_gv - -=for hackers -Found in file thrdvar.h - -=item PL_ofs_sv - -The output field separator - C<$,> in Perl space. - - SV* PL_ofs_sv - -=for hackers -Found in file thrdvar.h - -=item PL_rs - -The input record separator - C<$/> in Perl space. - - SV* PL_rs - -=for hackers -Found in file thrdvar.h - -=back - -=head1 AUTHORS - -The autodocumentation system was originally added to the Perl core by -Benjamin Stuhl. Documentation is by whoever was kind enough to -document their functions. - -=head1 SEE ALSO - -perlguts(1), perlapi(1) - diff --git a/lib/perl5/5.6.1/pods/perlipc.pod b/lib/perl5/5.6.1/pods/perlipc.pod deleted file mode 100644 index a1df3e42..00000000 --- a/lib/perl5/5.6.1/pods/perlipc.pod +++ /dev/null @@ -1,1509 +0,0 @@ -=head1 NAME - -perlipc - Perl interprocess communication (signals, fifos, pipes, safe subprocesses, sockets, and semaphores) - -=head1 DESCRIPTION - -The basic IPC facilities of Perl are built out of the good old Unix -signals, named pipes, pipe opens, the Berkeley socket routines, and SysV -IPC calls. Each is used in slightly different situations. - -=head1 Signals - -Perl uses a simple signal handling model: the %SIG hash contains names or -references of user-installed signal handlers. These handlers will be called -with an argument which is the name of the signal that triggered it. A -signal may be generated intentionally from a particular keyboard sequence like -control-C or control-Z, sent to you from another process, or -triggered automatically by the kernel when special events transpire, like -a child process exiting, your process running out of stack space, or -hitting file size limit. - -For example, to trap an interrupt signal, set up a handler like this. -Do as little as you possibly can in your handler; notice how all we do is -set a global variable and then raise an exception. That's because on most -systems, libraries are not re-entrant; particularly, memory allocation and -I/O routines are not. That means that doing nearly I in your -handler could in theory trigger a memory fault and subsequent core dump. - - sub catch_zap { - my $signame = shift; - $shucks++; - die "Somebody sent me a SIG$signame"; - } - $SIG{INT} = 'catch_zap'; # could fail in modules - $SIG{INT} = \&catch_zap; # best strategy - -The names of the signals are the ones listed out by C on your -system, or you can retrieve them from the Config module. Set up an -@signame list indexed by number to get the name and a %signo table -indexed by name to get the number: - - use Config; - defined $Config{sig_name} || die "No sigs?"; - foreach $name (split(' ', $Config{sig_name})) { - $signo{$name} = $i; - $signame[$i] = $name; - $i++; - } - -So to check whether signal 17 and SIGALRM were the same, do just this: - - print "signal #17 = $signame[17]\n"; - if ($signo{ALRM}) { - print "SIGALRM is $signo{ALRM}\n"; - } - -You may also choose to assign the strings C<'IGNORE'> or C<'DEFAULT'> as -the handler, in which case Perl will try to discard the signal or do the -default thing. - -On most Unix platforms, the C (sometimes also known as C) signal -has special behavior with respect to a value of C<'IGNORE'>. -Setting C<$SIG{CHLD}> to C<'IGNORE'> on such a platform has the effect of -not creating zombie processes when the parent process fails to C -on its child processes (i.e. child processes are automatically reaped). -Calling C with C<$SIG{CHLD}> set to C<'IGNORE'> usually returns -C<-1> on such platforms. - -Some signals can be neither trapped nor ignored, such as -the KILL and STOP (but not the TSTP) signals. One strategy for -temporarily ignoring signals is to use a local() statement, which will be -automatically restored once your block is exited. (Remember that local() -values are "inherited" by functions called from within that block.) - - sub precious { - local $SIG{INT} = 'IGNORE'; - &more_functions; - } - sub more_functions { - # interrupts still ignored, for now... - } - -Sending a signal to a negative process ID means that you send the signal -to the entire Unix process-group. This code sends a hang-up signal to all -processes in the current process group (and sets $SIG{HUP} to IGNORE so -it doesn't kill itself): - - { - local $SIG{HUP} = 'IGNORE'; - kill HUP => -$$; - # snazzy writing of: kill('HUP', -$$) - } - -Another interesting signal to send is signal number zero. This doesn't -actually affect another process, but instead checks whether it's alive -or has changed its UID. - - unless (kill 0 => $kid_pid) { - warn "something wicked happened to $kid_pid"; - } - -You might also want to employ anonymous functions for simple signal -handlers: - - $SIG{INT} = sub { die "\nOutta here!\n" }; - -But that will be problematic for the more complicated handlers that need -to reinstall themselves. Because Perl's signal mechanism is currently -based on the signal(3) function from the C library, you may sometimes be so -misfortunate as to run on systems where that function is "broken", that -is, it behaves in the old unreliable SysV way rather than the newer, more -reasonable BSD and POSIX fashion. So you'll see defensive people writing -signal handlers like this: - - sub REAPER { - $waitedpid = wait; - # loathe sysV: it makes us not only reinstate - # the handler, but place it after the wait - $SIG{CHLD} = \&REAPER; - } - $SIG{CHLD} = \&REAPER; - # now do something that forks... - -or even the more elaborate: - - use POSIX ":sys_wait_h"; - sub REAPER { - my $child; - while (($child = waitpid(-1,WNOHANG)) > 0) { - $Kid_Status{$child} = $?; - } - $SIG{CHLD} = \&REAPER; # still loathe sysV - } - $SIG{CHLD} = \&REAPER; - # do something that forks... - -Signal handling is also used for timeouts in Unix, While safely -protected within an C block, you set a signal handler to trap -alarm signals and then schedule to have one delivered to you in some -number of seconds. Then try your blocking operation, clearing the alarm -when it's done but not before you've exited your C block. If it -goes off, you'll use die() to jump out of the block, much as you might -using longjmp() or throw() in other languages. - -Here's an example: - - eval { - local $SIG{ALRM} = sub { die "alarm clock restart" }; - alarm 10; - flock(FH, 2); # blocking write lock - alarm 0; - }; - if ($@ and $@ !~ /alarm clock restart/) { die } - -If the operation being timed out is system() or qx(), this technique -is liable to generate zombies. If this matters to you, you'll -need to do your own fork() and exec(), and kill the errant child process. - -For more complex signal handling, you might see the standard POSIX -module. Lamentably, this is almost entirely undocumented, but -the F file from the Perl source distribution has some -examples in it. - -=head1 Named Pipes - -A named pipe (often referred to as a FIFO) is an old Unix IPC -mechanism for processes communicating on the same machine. It works -just like a regular, connected anonymous pipes, except that the -processes rendezvous using a filename and don't have to be related. - -To create a named pipe, use the Unix command mknod(1) or on some -systems, mkfifo(1). These may not be in your normal path. - - # system return val is backwards, so && not || - # - $ENV{PATH} .= ":/etc:/usr/etc"; - if ( system('mknod', $path, 'p') - && system('mkfifo', $path) ) - { - die "mk{nod,fifo} $path failed"; - } - - -A fifo is convenient when you want to connect a process to an unrelated -one. When you open a fifo, the program will block until there's something -on the other end. - -For example, let's say you'd like to have your F<.signature> file be a -named pipe that has a Perl program on the other end. Now every time any -program (like a mailer, news reader, finger program, etc.) tries to read -from that file, the reading program will block and your program will -supply the new signature. We'll use the pipe-checking file test B<-p> -to find out whether anyone (or anything) has accidentally removed our fifo. - - chdir; # go home - $FIFO = '.signature'; - $ENV{PATH} .= ":/etc:/usr/games"; - - while (1) { - unless (-p $FIFO) { - unlink $FIFO; - system('mknod', $FIFO, 'p') - && die "can't mknod $FIFO: $!"; - } - - # next line blocks until there's a reader - open (FIFO, "> $FIFO") || die "can't write $FIFO: $!"; - print FIFO "John Smith (smith\@host.org)\n", `fortune -s`; - close FIFO; - sleep 2; # to avoid dup signals - } - -=head2 WARNING - -By installing Perl code to deal with signals, you're exposing yourself -to danger from two things. First, few system library functions are -re-entrant. If the signal interrupts while Perl is executing one function -(like malloc(3) or printf(3)), and your signal handler then calls the -same function again, you could get unpredictable behavior--often, a -core dump. Second, Perl isn't itself re-entrant at the lowest levels. -If the signal interrupts Perl while Perl is changing its own internal -data structures, similarly unpredictable behaviour may result. - -There are two things you can do, knowing this: be paranoid or be -pragmatic. The paranoid approach is to do as little as possible in your -signal handler. Set an existing integer variable that already has a -value, and return. This doesn't help you if you're in a slow system call, -which will just restart. That means you have to C to longjump(3) out -of the handler. Even this is a little cavalier for the true paranoiac, -who avoids C in a handler because the system I out to get you. -The pragmatic approach is to say ``I know the risks, but prefer the -convenience'', and to do anything you want in your signal handler, -prepared to clean up core dumps now and again. - -To forbid signal handlers altogether would bars you from -many interesting programs, including virtually everything in this manpage, -since you could no longer even write SIGCHLD handlers. - - -=head1 Using open() for IPC - -Perl's basic open() statement can also be used for unidirectional interprocess -communication by either appending or prepending a pipe symbol to the second -argument to open(). Here's how to start something up in a child process you -intend to write to: - - open(SPOOLER, "| cat -v | lpr -h 2>/dev/null") - || die "can't fork: $!"; - local $SIG{PIPE} = sub { die "spooler pipe broke" }; - print SPOOLER "stuff\n"; - close SPOOLER || die "bad spool: $! $?"; - -And here's how to start up a child process you intend to read from: - - open(STATUS, "netstat -an 2>&1 |") - || die "can't fork: $!"; - while () { - next if /^(tcp|udp)/; - print; - } - close STATUS || die "bad netstat: $! $?"; - -If one can be sure that a particular program is a Perl script that is -expecting filenames in @ARGV, the clever programmer can write something -like this: - - % program f1 "cmd1|" - f2 "cmd2|" f3 < tmpfile - -and irrespective of which shell it's called from, the Perl program will -read from the file F, the process F, standard input (F -in this case), the F file, the F command, and finally the F -file. Pretty nifty, eh? - -You might notice that you could use backticks for much the -same effect as opening a pipe for reading: - - print grep { !/^(tcp|udp)/ } `netstat -an 2>&1`; - die "bad netstat" if $?; - -While this is true on the surface, it's much more efficient to process the -file one line or record at a time because then you don't have to read the -whole thing into memory at once. It also gives you finer control of the -whole process, letting you to kill off the child process early if you'd -like. - -Be careful to check both the open() and the close() return values. If -you're I to a pipe, you should also trap SIGPIPE. Otherwise, -think of what happens when you start up a pipe to a command that doesn't -exist: the open() will in all likelihood succeed (it only reflects the -fork()'s success), but then your output will fail--spectacularly. Perl -can't know whether the command worked because your command is actually -running in a separate process whose exec() might have failed. Therefore, -while readers of bogus commands return just a quick end of file, writers -to bogus command will trigger a signal they'd better be prepared to -handle. Consider: - - open(FH, "|bogus") or die "can't fork: $!"; - print FH "bang\n" or die "can't write: $!"; - close FH or die "can't close: $!"; - -That won't blow up until the close, and it will blow up with a SIGPIPE. -To catch it, you could use this: - - $SIG{PIPE} = 'IGNORE'; - open(FH, "|bogus") or die "can't fork: $!"; - print FH "bang\n" or die "can't write: $!"; - close FH or die "can't close: status=$?"; - -=head2 Filehandles - -Both the main process and any child processes it forks share the same -STDIN, STDOUT, and STDERR filehandles. If both processes try to access -them at once, strange things can happen. You may also want to close -or reopen the filehandles for the child. You can get around this by -opening your pipe with open(), but on some systems this means that the -child process cannot outlive the parent. - -=head2 Background Processes - -You can run a command in the background with: - - system("cmd &"); - -The command's STDOUT and STDERR (and possibly STDIN, depending on your -shell) will be the same as the parent's. You won't need to catch -SIGCHLD because of the double-fork taking place (see below for more -details). - -=head2 Complete Dissociation of Child from Parent - -In some cases (starting server processes, for instance) you'll want to -completely dissociate the child process from the parent. This is -often called daemonization. A well behaved daemon will also chdir() -to the root directory (so it doesn't prevent unmounting the filesystem -containing the directory from which it was launched) and redirect its -standard file descriptors from and to F (so that random -output doesn't wind up on the user's terminal). - - use POSIX 'setsid'; - - sub daemonize { - chdir '/' or die "Can't chdir to /: $!"; - open STDIN, '/dev/null' or die "Can't read /dev/null: $!"; - open STDOUT, '>/dev/null' - or die "Can't write to /dev/null: $!"; - defined(my $pid = fork) or die "Can't fork: $!"; - exit if $pid; - setsid or die "Can't start a new session: $!"; - open STDERR, '>&STDOUT' or die "Can't dup stdout: $!"; - } - -The fork() has to come before the setsid() to ensure that you aren't a -process group leader (the setsid() will fail if you are). If your -system doesn't have the setsid() function, open F and use the -C ioctl() on it instead. See L for details. - -Non-Unix users should check their Your_OS::Process module for other -solutions. - -=head2 Safe Pipe Opens - -Another interesting approach to IPC is making your single program go -multiprocess and communicate between (or even amongst) yourselves. The -open() function will accept a file argument of either C<"-|"> or C<"|-"> -to do a very interesting thing: it forks a child connected to the -filehandle you've opened. The child is running the same program as the -parent. This is useful for safely opening a file when running under an -assumed UID or GID, for example. If you open a pipe I minus, you can -write to the filehandle you opened and your kid will find it in his -STDIN. If you open a pipe I minus, you can read from the filehandle -you opened whatever your kid writes to his STDOUT. - - use English; - my $sleep_count = 0; - - do { - $pid = open(KID_TO_WRITE, "|-"); - unless (defined $pid) { - warn "cannot fork: $!"; - die "bailing out" if $sleep_count++ > 6; - sleep 10; - } - } until defined $pid; - - if ($pid) { # parent - print KID_TO_WRITE @some_data; - close(KID_TO_WRITE) || warn "kid exited $?"; - } else { # child - ($EUID, $EGID) = ($UID, $GID); # suid progs only - open (FILE, "> /safe/file") - || die "can't open /safe/file: $!"; - while () { - print FILE; # child's STDIN is parent's KID - } - exit; # don't forget this - } - -Another common use for this construct is when you need to execute -something without the shell's interference. With system(), it's -straightforward, but you can't use a pipe open or backticks safely. -That's because there's no way to stop the shell from getting its hands on -your arguments. Instead, use lower-level control to call exec() directly. - -Here's a safe backtick or pipe open for read: - - # add error processing as above - $pid = open(KID_TO_READ, "-|"); - - if ($pid) { # parent - while () { - # do something interesting - } - close(KID_TO_READ) || warn "kid exited $?"; - - } else { # child - ($EUID, $EGID) = ($UID, $GID); # suid only - exec($program, @options, @args) - || die "can't exec program: $!"; - # NOTREACHED - } - - -And here's a safe pipe open for writing: - - # add error processing as above - $pid = open(KID_TO_WRITE, "|-"); - $SIG{ALRM} = sub { die "whoops, $program pipe broke" }; - - if ($pid) { # parent - for (@data) { - print KID_TO_WRITE; - } - close(KID_TO_WRITE) || warn "kid exited $?"; - - } else { # child - ($EUID, $EGID) = ($UID, $GID); - exec($program, @options, @args) - || die "can't exec program: $!"; - # NOTREACHED - } - -Note that these operations are full Unix forks, which means they may not be -correctly implemented on alien systems. Additionally, these are not true -multithreading. If you'd like to learn more about threading, see the -F file mentioned below in the SEE ALSO section. - -=head2 Bidirectional Communication with Another Process - -While this works reasonably well for unidirectional communication, what -about bidirectional communication? The obvious thing you'd like to do -doesn't actually work: - - open(PROG_FOR_READING_AND_WRITING, "| some program |") - -and if you forget to use the C pragma or the B<-w> flag, -then you'll miss out entirely on the diagnostic message: - - Can't do bidirectional pipe at -e line 1. - -If you really want to, you can use the standard open2() library function -to catch both ends. There's also an open3() for tridirectional I/O so you -can also catch your child's STDERR, but doing so would then require an -awkward select() loop and wouldn't allow you to use normal Perl input -operations. - -If you look at its source, you'll see that open2() uses low-level -primitives like Unix pipe() and exec() calls to create all the connections. -While it might have been slightly more efficient by using socketpair(), it -would have then been even less portable than it already is. The open2() -and open3() functions are unlikely to work anywhere except on a Unix -system or some other one purporting to be POSIX compliant. - -Here's an example of using open2(): - - use FileHandle; - use IPC::Open2; - $pid = open2(*Reader, *Writer, "cat -u -n" ); - print Writer "stuff\n"; - $got = ; - -The problem with this is that Unix buffering is really going to -ruin your day. Even though your C filehandle is auto-flushed, -and the process on the other end will get your data in a timely manner, -you can't usually do anything to force it to give it back to you -in a similarly quick fashion. In this case, we could, because we -gave I a B<-u> flag to make it unbuffered. But very few Unix -commands are designed to operate over pipes, so this seldom works -unless you yourself wrote the program on the other end of the -double-ended pipe. - -A solution to this is the nonstandard F library. It uses -pseudo-ttys to make your program behave more reasonably: - - require 'Comm.pl'; - $ph = open_proc('cat -n'); - for (1..10) { - print $ph "a line\n"; - print "got back ", scalar <$ph>; - } - -This way you don't have to have control over the source code of the -program you're using. The F library also has expect() -and interact() functions. Find the library (and we hope its -successor F) at your nearest CPAN archive as detailed -in the SEE ALSO section below. - -The newer Expect.pm module from CPAN also addresses this kind of thing. -This module requires two other modules from CPAN: IO::Pty and IO::Stty. -It sets up a pseudo-terminal to interact with programs that insist on -using talking to the terminal device driver. If your system is -amongst those supported, this may be your best bet. - -=head2 Bidirectional Communication with Yourself - -If you want, you may make low-level pipe() and fork() -to stitch this together by hand. This example only -talks to itself, but you could reopen the appropriate -handles to STDIN and STDOUT and call other processes. - - #!/usr/bin/perl -w - # pipe1 - bidirectional communication using two pipe pairs - # designed for the socketpair-challenged - use IO::Handle; # thousands of lines just for autoflush :-( - pipe(PARENT_RDR, CHILD_WTR); # XXX: failure? - pipe(CHILD_RDR, PARENT_WTR); # XXX: failure? - CHILD_WTR->autoflush(1); - PARENT_WTR->autoflush(1); - - if ($pid = fork) { - close PARENT_RDR; close PARENT_WTR; - print CHILD_WTR "Parent Pid $$ is sending this\n"; - chomp($line = ); - print "Parent Pid $$ just read this: `$line'\n"; - close CHILD_RDR; close CHILD_WTR; - waitpid($pid,0); - } else { - die "cannot fork: $!" unless defined $pid; - close CHILD_RDR; close CHILD_WTR; - chomp($line = ); - print "Child Pid $$ just read this: `$line'\n"; - print PARENT_WTR "Child Pid $$ is sending this\n"; - close PARENT_RDR; close PARENT_WTR; - exit; - } - -But you don't actually have to make two pipe calls. If you -have the socketpair() system call, it will do this all for you. - - #!/usr/bin/perl -w - # pipe2 - bidirectional communication using socketpair - # "the best ones always go both ways" - - use Socket; - use IO::Handle; # thousands of lines just for autoflush :-( - # We say AF_UNIX because although *_LOCAL is the - # POSIX 1003.1g form of the constant, many machines - # still don't have it. - socketpair(CHILD, PARENT, AF_UNIX, SOCK_STREAM, PF_UNSPEC) - or die "socketpair: $!"; - - CHILD->autoflush(1); - PARENT->autoflush(1); - - if ($pid = fork) { - close PARENT; - print CHILD "Parent Pid $$ is sending this\n"; - chomp($line = ); - print "Parent Pid $$ just read this: `$line'\n"; - close CHILD; - waitpid($pid,0); - } else { - die "cannot fork: $!" unless defined $pid; - close CHILD; - chomp($line = ); - print "Child Pid $$ just read this: `$line'\n"; - print PARENT "Child Pid $$ is sending this\n"; - close PARENT; - exit; - } - -=head1 Sockets: Client/Server Communication - -While not limited to Unix-derived operating systems (e.g., WinSock on PCs -provides socket support, as do some VMS libraries), you may not have -sockets on your system, in which case this section probably isn't going to do -you much good. With sockets, you can do both virtual circuits (i.e., TCP -streams) and datagrams (i.e., UDP packets). You may be able to do even more -depending on your system. - -The Perl function calls for dealing with sockets have the same names as -the corresponding system calls in C, but their arguments tend to differ -for two reasons: first, Perl filehandles work differently than C file -descriptors. Second, Perl already knows the length of its strings, so you -don't need to pass that information. - -One of the major problems with old socket code in Perl was that it used -hard-coded values for some of the constants, which severely hurt -portability. If you ever see code that does anything like explicitly -setting C<$AF_INET = 2>, you know you're in for big trouble: An -immeasurably superior approach is to use the C module, which more -reliably grants access to various constants and functions you'll need. - -If you're not writing a server/client for an existing protocol like -NNTP or SMTP, you should give some thought to how your server will -know when the client has finished talking, and vice-versa. Most -protocols are based on one-line messages and responses (so one party -knows the other has finished when a "\n" is received) or multi-line -messages and responses that end with a period on an empty line -("\n.\n" terminates a message/response). - -=head2 Internet Line Terminators - -The Internet line terminator is "\015\012". Under ASCII variants of -Unix, that could usually be written as "\r\n", but under other systems, -"\r\n" might at times be "\015\015\012", "\012\012\015", or something -completely different. The standards specify writing "\015\012" to be -conformant (be strict in what you provide), but they also recommend -accepting a lone "\012" on input (but be lenient in what you require). -We haven't always been very good about that in the code in this manpage, -but unless you're on a Mac, you'll probably be ok. - -=head2 Internet TCP Clients and Servers - -Use Internet-domain sockets when you want to do client-server -communication that might extend to machines outside of your own system. - -Here's a sample TCP client using Internet-domain sockets: - - #!/usr/bin/perl -w - use strict; - use Socket; - my ($remote,$port, $iaddr, $paddr, $proto, $line); - - $remote = shift || 'localhost'; - $port = shift || 2345; # random port - if ($port =~ /\D/) { $port = getservbyname($port, 'tcp') } - die "No port" unless $port; - $iaddr = inet_aton($remote) || die "no host: $remote"; - $paddr = sockaddr_in($port, $iaddr); - - $proto = getprotobyname('tcp'); - socket(SOCK, PF_INET, SOCK_STREAM, $proto) || die "socket: $!"; - connect(SOCK, $paddr) || die "connect: $!"; - while (defined($line = )) { - print $line; - } - - close (SOCK) || die "close: $!"; - exit; - -And here's a corresponding server to go along with it. We'll -leave the address as INADDR_ANY so that the kernel can choose -the appropriate interface on multihomed hosts. If you want sit -on a particular interface (like the external side of a gateway -or firewall machine), you should fill this in with your real address -instead. - - #!/usr/bin/perl -Tw - use strict; - BEGIN { $ENV{PATH} = '/usr/ucb:/bin' } - use Socket; - use Carp; - my $EOL = "\015\012"; - - sub logmsg { print "$0 $$: @_ at ", scalar localtime, "\n" } - - my $port = shift || 2345; - my $proto = getprotobyname('tcp'); - - ($port) = $port =~ /^(\d+)$/ or die "invalid port"; - - socket(Server, PF_INET, SOCK_STREAM, $proto) || die "socket: $!"; - setsockopt(Server, SOL_SOCKET, SO_REUSEADDR, - pack("l", 1)) || die "setsockopt: $!"; - bind(Server, sockaddr_in($port, INADDR_ANY)) || die "bind: $!"; - listen(Server,SOMAXCONN) || die "listen: $!"; - - logmsg "server started on port $port"; - - my $paddr; - - $SIG{CHLD} = \&REAPER; - - for ( ; $paddr = accept(Client,Server); close Client) { - my($port,$iaddr) = sockaddr_in($paddr); - my $name = gethostbyaddr($iaddr,AF_INET); - - logmsg "connection from $name [", - inet_ntoa($iaddr), "] - at port $port"; - - print Client "Hello there, $name, it's now ", - scalar localtime, $EOL; - } - -And here's a multithreaded version. It's multithreaded in that -like most typical servers, it spawns (forks) a slave server to -handle the client request so that the master server can quickly -go back to service a new client. - - #!/usr/bin/perl -Tw - use strict; - BEGIN { $ENV{PATH} = '/usr/ucb:/bin' } - use Socket; - use Carp; - my $EOL = "\015\012"; - - sub spawn; # forward declaration - sub logmsg { print "$0 $$: @_ at ", scalar localtime, "\n" } - - my $port = shift || 2345; - my $proto = getprotobyname('tcp'); - - ($port) = $port =~ /^(\d+)$/ or die "invalid port"; - - socket(Server, PF_INET, SOCK_STREAM, $proto) || die "socket: $!"; - setsockopt(Server, SOL_SOCKET, SO_REUSEADDR, - pack("l", 1)) || die "setsockopt: $!"; - bind(Server, sockaddr_in($port, INADDR_ANY)) || die "bind: $!"; - listen(Server,SOMAXCONN) || die "listen: $!"; - - logmsg "server started on port $port"; - - my $waitedpid = 0; - my $paddr; - - sub REAPER { - $waitedpid = wait; - $SIG{CHLD} = \&REAPER; # loathe sysV - logmsg "reaped $waitedpid" . ($? ? " with exit $?" : ''); - } - - $SIG{CHLD} = \&REAPER; - - for ( $waitedpid = 0; - ($paddr = accept(Client,Server)) || $waitedpid; - $waitedpid = 0, close Client) - { - next if $waitedpid and not $paddr; - my($port,$iaddr) = sockaddr_in($paddr); - my $name = gethostbyaddr($iaddr,AF_INET); - - logmsg "connection from $name [", - inet_ntoa($iaddr), "] - at port $port"; - - spawn sub { - $|=1; - print "Hello there, $name, it's now ", scalar localtime, $EOL; - exec '/usr/games/fortune' # XXX: `wrong' line terminators - or confess "can't exec fortune: $!"; - }; - - } - - sub spawn { - my $coderef = shift; - - unless (@_ == 0 && $coderef && ref($coderef) eq 'CODE') { - confess "usage: spawn CODEREF"; - } - - my $pid; - if (!defined($pid = fork)) { - logmsg "cannot fork: $!"; - return; - } elsif ($pid) { - logmsg "begat $pid"; - return; # I'm the parent - } - # else I'm the child -- go spawn - - open(STDIN, "<&Client") || die "can't dup client to stdin"; - open(STDOUT, ">&Client") || die "can't dup client to stdout"; - ## open(STDERR, ">&STDOUT") || die "can't dup stdout to stderr"; - exit &$coderef(); - } - -This server takes the trouble to clone off a child version via fork() for -each incoming request. That way it can handle many requests at once, -which you might not always want. Even if you don't fork(), the listen() -will allow that many pending connections. Forking servers have to be -particularly careful about cleaning up their dead children (called -"zombies" in Unix parlance), because otherwise you'll quickly fill up your -process table. - -We suggest that you use the B<-T> flag to use taint checking (see L) -even if we aren't running setuid or setgid. This is always a good idea -for servers and other programs run on behalf of someone else (like CGI -scripts), because it lessens the chances that people from the outside will -be able to compromise your system. - -Let's look at another TCP client. This one connects to the TCP "time" -service on a number of different machines and shows how far their clocks -differ from the system on which it's being run: - - #!/usr/bin/perl -w - use strict; - use Socket; - - my $SECS_of_70_YEARS = 2208988800; - sub ctime { scalar localtime(shift) } - - my $iaddr = gethostbyname('localhost'); - my $proto = getprotobyname('tcp'); - my $port = getservbyname('time', 'tcp'); - my $paddr = sockaddr_in(0, $iaddr); - my($host); - - $| = 1; - printf "%-24s %8s %s\n", "localhost", 0, ctime(time()); - - foreach $host (@ARGV) { - printf "%-24s ", $host; - my $hisiaddr = inet_aton($host) || die "unknown host"; - my $hispaddr = sockaddr_in($port, $hisiaddr); - socket(SOCKET, PF_INET, SOCK_STREAM, $proto) || die "socket: $!"; - connect(SOCKET, $hispaddr) || die "bind: $!"; - my $rtime = ' '; - read(SOCKET, $rtime, 4); - close(SOCKET); - my $histime = unpack("N", $rtime) - $SECS_of_70_YEARS ; - printf "%8d %s\n", $histime - time, ctime($histime); - } - -=head2 Unix-Domain TCP Clients and Servers - -That's fine for Internet-domain clients and servers, but what about local -communications? While you can use the same setup, sometimes you don't -want to. Unix-domain sockets are local to the current host, and are often -used internally to implement pipes. Unlike Internet domain sockets, Unix -domain sockets can show up in the file system with an ls(1) listing. - - % ls -l /dev/log - srw-rw-rw- 1 root 0 Oct 31 07:23 /dev/log - -You can test for these with Perl's B<-S> file test: - - unless ( -S '/dev/log' ) { - die "something's wicked with the log system"; - } - -Here's a sample Unix-domain client: - - #!/usr/bin/perl -w - use Socket; - use strict; - my ($rendezvous, $line); - - $rendezvous = shift || '/tmp/catsock'; - socket(SOCK, PF_UNIX, SOCK_STREAM, 0) || die "socket: $!"; - connect(SOCK, sockaddr_un($rendezvous)) || die "connect: $!"; - while (defined($line = )) { - print $line; - } - exit; - -And here's a corresponding server. You don't have to worry about silly -network terminators here because Unix domain sockets are guaranteed -to be on the localhost, and thus everything works right. - - #!/usr/bin/perl -Tw - use strict; - use Socket; - use Carp; - - BEGIN { $ENV{PATH} = '/usr/ucb:/bin' } - sub spawn; # forward declaration - sub logmsg { print "$0 $$: @_ at ", scalar localtime, "\n" } - - my $NAME = '/tmp/catsock'; - my $uaddr = sockaddr_un($NAME); - my $proto = getprotobyname('tcp'); - - socket(Server,PF_UNIX,SOCK_STREAM,0) || die "socket: $!"; - unlink($NAME); - bind (Server, $uaddr) || die "bind: $!"; - listen(Server,SOMAXCONN) || die "listen: $!"; - - logmsg "server started on $NAME"; - - my $waitedpid; - - sub REAPER { - $waitedpid = wait; - $SIG{CHLD} = \&REAPER; # loathe sysV - logmsg "reaped $waitedpid" . ($? ? " with exit $?" : ''); - } - - $SIG{CHLD} = \&REAPER; - - - for ( $waitedpid = 0; - accept(Client,Server) || $waitedpid; - $waitedpid = 0, close Client) - { - next if $waitedpid; - logmsg "connection on $NAME"; - spawn sub { - print "Hello there, it's now ", scalar localtime, "\n"; - exec '/usr/games/fortune' or die "can't exec fortune: $!"; - }; - } - - sub spawn { - my $coderef = shift; - - unless (@_ == 0 && $coderef && ref($coderef) eq 'CODE') { - confess "usage: spawn CODEREF"; - } - - my $pid; - if (!defined($pid = fork)) { - logmsg "cannot fork: $!"; - return; - } elsif ($pid) { - logmsg "begat $pid"; - return; # I'm the parent - } - # else I'm the child -- go spawn - - open(STDIN, "<&Client") || die "can't dup client to stdin"; - open(STDOUT, ">&Client") || die "can't dup client to stdout"; - ## open(STDERR, ">&STDOUT") || die "can't dup stdout to stderr"; - exit &$coderef(); - } - -As you see, it's remarkably similar to the Internet domain TCP server, so -much so, in fact, that we've omitted several duplicate functions--spawn(), -logmsg(), ctime(), and REAPER()--which are exactly the same as in the -other server. - -So why would you ever want to use a Unix domain socket instead of a -simpler named pipe? Because a named pipe doesn't give you sessions. You -can't tell one process's data from another's. With socket programming, -you get a separate session for each client: that's why accept() takes two -arguments. - -For example, let's say that you have a long running database server daemon -that you want folks from the World Wide Web to be able to access, but only -if they go through a CGI interface. You'd have a small, simple CGI -program that does whatever checks and logging you feel like, and then acts -as a Unix-domain client and connects to your private server. - -=head1 TCP Clients with IO::Socket - -For those preferring a higher-level interface to socket programming, the -IO::Socket module provides an object-oriented approach. IO::Socket is -included as part of the standard Perl distribution as of the 5.004 -release. If you're running an earlier version of Perl, just fetch -IO::Socket from CPAN, where you'll also find modules providing easy -interfaces to the following systems: DNS, FTP, Ident (RFC 931), NIS and -NISPlus, NNTP, Ping, POP3, SMTP, SNMP, SSLeay, Telnet, and Time--just -to name a few. - -=head2 A Simple Client - -Here's a client that creates a TCP connection to the "daytime" -service at port 13 of the host name "localhost" and prints out everything -that the server there cares to provide. - - #!/usr/bin/perl -w - use IO::Socket; - $remote = IO::Socket::INET->new( - Proto => "tcp", - PeerAddr => "localhost", - PeerPort => "daytime(13)", - ) - or die "cannot connect to daytime port at localhost"; - while ( <$remote> ) { print } - -When you run this program, you should get something back that -looks like this: - - Wed May 14 08:40:46 MDT 1997 - -Here are what those parameters to the C constructor mean: - -=over 4 - -=item C - -This is which protocol to use. In this case, the socket handle returned -will be connected to a TCP socket, because we want a stream-oriented -connection, that is, one that acts pretty much like a plain old file. -Not all sockets are this of this type. For example, the UDP protocol -can be used to make a datagram socket, used for message-passing. - -=item C - -This is the name or Internet address of the remote host the server is -running on. We could have specified a longer name like C<"www.perl.com">, -or an address like C<"204.148.40.9">. For demonstration purposes, we've -used the special hostname C<"localhost">, which should always mean the -current machine you're running on. The corresponding Internet address -for localhost is C<"127.1">, if you'd rather use that. - -=item C - -This is the service name or port number we'd like to connect to. -We could have gotten away with using just C<"daytime"> on systems with a -well-configured system services file,[FOOTNOTE: The system services file -is in I under Unix] but just in case, we've specified the -port number (13) in parentheses. Using just the number would also have -worked, but constant numbers make careful programmers nervous. - -=back - -Notice how the return value from the C constructor is used as -a filehandle in the C loop? That's what's called an indirect -filehandle, a scalar variable containing a filehandle. You can use -it the same way you would a normal filehandle. For example, you -can read one line from it this way: - - $line = <$handle>; - -all remaining lines from is this way: - - @lines = <$handle>; - -and send a line of data to it this way: - - print $handle "some data\n"; - -=head2 A Webget Client - -Here's a simple client that takes a remote host to fetch a document -from, and then a list of documents to get from that host. This is a -more interesting client than the previous one because it first sends -something to the server before fetching the server's response. - - #!/usr/bin/perl -w - use IO::Socket; - unless (@ARGV > 1) { die "usage: $0 host document ..." } - $host = shift(@ARGV); - $EOL = "\015\012"; - $BLANK = $EOL x 2; - foreach $document ( @ARGV ) { - $remote = IO::Socket::INET->new( Proto => "tcp", - PeerAddr => $host, - PeerPort => "http(80)", - ); - unless ($remote) { die "cannot connect to http daemon on $host" } - $remote->autoflush(1); - print $remote "GET $document HTTP/1.0" . $BLANK; - while ( <$remote> ) { print } - close $remote; - } - -The web server handing the "http" service, which is assumed to be at -its standard port, number 80. If the web server you're trying to -connect to is at a different port (like 1080 or 8080), you should specify -as the named-parameter pair, C<< PeerPort => 8080 >>. The C -method is used on the socket because otherwise the system would buffer -up the output we sent it. (If you're on a Mac, you'll also need to -change every C<"\n"> in your code that sends data over the network to -be a C<"\015\012"> instead.) - -Connecting to the server is only the first part of the process: once you -have the connection, you have to use the server's language. Each server -on the network has its own little command language that it expects as -input. The string that we send to the server starting with "GET" is in -HTTP syntax. In this case, we simply request each specified document. -Yes, we really are making a new connection for each document, even though -it's the same host. That's the way you always used to have to speak HTTP. -Recent versions of web browsers may request that the remote server leave -the connection open a little while, but the server doesn't have to honor -such a request. - -Here's an example of running that program, which we'll call I: - - % webget www.perl.com /guanaco.html - HTTP/1.1 404 File Not Found - Date: Thu, 08 May 1997 18:02:32 GMT - Server: Apache/1.2b6 - Connection: close - Content-type: text/html - - 404 File Not Found -

    File Not Found

    - The requested URL /guanaco.html was not found on this server.

    - - -Ok, so that's not very interesting, because it didn't find that -particular document. But a long response wouldn't have fit on this page. - -For a more fully-featured version of this program, you should look to -the I program included with the LWP modules from CPAN. - -=head2 Interactive Client with IO::Socket - -Well, that's all fine if you want to send one command and get one answer, -but what about setting up something fully interactive, somewhat like -the way I works? That way you can type a line, get the answer, -type a line, get the answer, etc. - -This client is more complicated than the two we've done so far, but if -you're on a system that supports the powerful C call, the solution -isn't that rough. Once you've made the connection to whatever service -you'd like to chat with, call C to clone your process. Each of -these two identical process has a very simple job to do: the parent -copies everything from the socket to standard output, while the child -simultaneously copies everything from standard input to the socket. -To accomplish the same thing using just one process would be I -harder, because it's easier to code two processes to do one thing than it -is to code one process to do two things. (This keep-it-simple principle -a cornerstones of the Unix philosophy, and good software engineering as -well, which is probably why it's spread to other systems.) - -Here's the code: - - #!/usr/bin/perl -w - use strict; - use IO::Socket; - my ($host, $port, $kidpid, $handle, $line); - - unless (@ARGV == 2) { die "usage: $0 host port" } - ($host, $port) = @ARGV; - - # create a tcp connection to the specified host and port - $handle = IO::Socket::INET->new(Proto => "tcp", - PeerAddr => $host, - PeerPort => $port) - or die "can't connect to port $port on $host: $!"; - - $handle->autoflush(1); # so output gets there right away - print STDERR "[Connected to $host:$port]\n"; - - # split the program into two processes, identical twins - die "can't fork: $!" unless defined($kidpid = fork()); - - # the if{} block runs only in the parent process - if ($kidpid) { - # copy the socket to standard output - while (defined ($line = <$handle>)) { - print STDOUT $line; - } - kill("TERM", $kidpid); # send SIGTERM to child - } - # the else{} block runs only in the child process - else { - # copy standard input to the socket - while (defined ($line = )) { - print $handle $line; - } - } - -The C function in the parent's C block is there to send a -signal to our child process (current running in the C block) -as soon as the remote server has closed its end of the connection. - -If the remote server sends data a byte at time, and you need that -data immediately without waiting for a newline (which might not happen), -you may wish to replace the C loop in the parent with the -following: - - my $byte; - while (sysread($handle, $byte, 1) == 1) { - print STDOUT $byte; - } - -Making a system call for each byte you want to read is not very efficient -(to put it mildly) but is the simplest to explain and works reasonably -well. - -=head1 TCP Servers with IO::Socket - -As always, setting up a server is little bit more involved than running a client. -The model is that the server creates a special kind of socket that -does nothing but listen on a particular port for incoming connections. -It does this by calling the C<< IO::Socket::INET->new() >> method with -slightly different arguments than the client did. - -=over 4 - -=item Proto - -This is which protocol to use. Like our clients, we'll -still specify C<"tcp"> here. - -=item LocalPort - -We specify a local -port in the C argument, which we didn't do for the client. -This is service name or port number for which you want to be the -server. (Under Unix, ports under 1024 are restricted to the -superuser.) In our sample, we'll use port 9000, but you can use -any port that's not currently in use on your system. If you try -to use one already in used, you'll get an "Address already in use" -message. Under Unix, the C command will show -which services current have servers. - -=item Listen - -The C parameter is set to the maximum number of -pending connections we can accept until we turn away incoming clients. -Think of it as a call-waiting queue for your telephone. -The low-level Socket module has a special symbol for the system maximum, which -is SOMAXCONN. - -=item Reuse - -The C parameter is needed so that we restart our server -manually without waiting a few minutes to allow system buffers to -clear out. - -=back - -Once the generic server socket has been created using the parameters -listed above, the server then waits for a new client to connect -to it. The server blocks in the C method, which eventually an -bidirectional connection to the remote client. (Make sure to autoflush -this handle to circumvent buffering.) - -To add to user-friendliness, our server prompts the user for commands. -Most servers don't do this. Because of the prompt without a newline, -you'll have to use the C variant of the interactive client above. - -This server accepts one of five different commands, sending output -back to the client. Note that unlike most network servers, this one -only handles one incoming client at a time. Multithreaded servers are -covered in Chapter 6 of the Camel. - -Here's the code. We'll - - #!/usr/bin/perl -w - use IO::Socket; - use Net::hostent; # for OO version of gethostbyaddr - - $PORT = 9000; # pick something not in use - - $server = IO::Socket::INET->new( Proto => 'tcp', - LocalPort => $PORT, - Listen => SOMAXCONN, - Reuse => 1); - - die "can't setup server" unless $server; - print "[Server $0 accepting clients]\n"; - - while ($client = $server->accept()) { - $client->autoflush(1); - print $client "Welcome to $0; type help for command list.\n"; - $hostinfo = gethostbyaddr($client->peeraddr); - printf "[Connect from %s]\n", $hostinfo->name || $client->peerhost; - print $client "Command? "; - while ( <$client>) { - next unless /\S/; # blank line - if (/quit|exit/i) { last; } - elsif (/date|time/i) { printf $client "%s\n", scalar localtime; } - elsif (/who/i ) { print $client `who 2>&1`; } - elsif (/cookie/i ) { print $client `/usr/games/fortune 2>&1`; } - elsif (/motd/i ) { print $client `cat /etc/motd 2>&1`; } - else { - print $client "Commands: quit date who cookie motd\n"; - } - } continue { - print $client "Command? "; - } - close $client; - } - -=head1 UDP: Message Passing - -Another kind of client-server setup is one that uses not connections, but -messages. UDP communications involve much lower overhead but also provide -less reliability, as there are no promises that messages will arrive at -all, let alone in order and unmangled. Still, UDP offers some advantages -over TCP, including being able to "broadcast" or "multicast" to a whole -bunch of destination hosts at once (usually on your local subnet). If you -find yourself overly concerned about reliability and start building checks -into your message system, then you probably should use just TCP to start -with. - -Note that UDP datagrams are I a bytestream and should not be treated -as such. This makes using I/O mechanisms with internal buffering -like stdio (i.e. print() and friends) especially cumbersome. Use syswrite(), -or better send(), like in the example below. - -Here's a UDP program similar to the sample Internet TCP client given -earlier. However, instead of checking one host at a time, the UDP version -will check many of them asynchronously by simulating a multicast and then -using select() to do a timed-out wait for I/O. To do something similar -with TCP, you'd have to use a different socket handle for each host. - - #!/usr/bin/perl -w - use strict; - use Socket; - use Sys::Hostname; - - my ( $count, $hisiaddr, $hispaddr, $histime, - $host, $iaddr, $paddr, $port, $proto, - $rin, $rout, $rtime, $SECS_of_70_YEARS); - - $SECS_of_70_YEARS = 2208988800; - - $iaddr = gethostbyname(hostname()); - $proto = getprotobyname('udp'); - $port = getservbyname('time', 'udp'); - $paddr = sockaddr_in(0, $iaddr); # 0 means let kernel pick - - socket(SOCKET, PF_INET, SOCK_DGRAM, $proto) || die "socket: $!"; - bind(SOCKET, $paddr) || die "bind: $!"; - - $| = 1; - printf "%-12s %8s %s\n", "localhost", 0, scalar localtime time; - $count = 0; - for $host (@ARGV) { - $count++; - $hisiaddr = inet_aton($host) || die "unknown host"; - $hispaddr = sockaddr_in($port, $hisiaddr); - defined(send(SOCKET, 0, 0, $hispaddr)) || die "send $host: $!"; - } - - $rin = ''; - vec($rin, fileno(SOCKET), 1) = 1; - - # timeout after 10.0 seconds - while ($count && select($rout = $rin, undef, undef, 10.0)) { - $rtime = ''; - ($hispaddr = recv(SOCKET, $rtime, 4, 0)) || die "recv: $!"; - ($port, $hisiaddr) = sockaddr_in($hispaddr); - $host = gethostbyaddr($hisiaddr, AF_INET); - $histime = unpack("N", $rtime) - $SECS_of_70_YEARS ; - printf "%-12s ", $host; - printf "%8d %s\n", $histime - time, scalar localtime($histime); - $count--; - } - -Note that this example does not include any retries and may consequently -fail to contact a reachable host. The most prominent reason for this -is congestion of the queues on the sending host if the number of -list of hosts to contact is sufficiently large. - -=head1 SysV IPC - -While System V IPC isn't so widely used as sockets, it still has some -interesting uses. You can't, however, effectively use SysV IPC or -Berkeley mmap() to have shared memory so as to share a variable amongst -several processes. That's because Perl would reallocate your string when -you weren't wanting it to. - -Here's a small example showing shared memory usage. - - use IPC::SysV qw(IPC_PRIVATE IPC_RMID S_IRWXU); - - $size = 2000; - $id = shmget(IPC_PRIVATE, $size, S_IRWXU) || die "$!"; - print "shm key $id\n"; - - $message = "Message #1"; - shmwrite($id, $message, 0, 60) || die "$!"; - print "wrote: '$message'\n"; - shmread($id, $buff, 0, 60) || die "$!"; - print "read : '$buff'\n"; - - # the buffer of shmread is zero-character end-padded. - substr($buff, index($buff, "\0")) = ''; - print "un" unless $buff eq $message; - print "swell\n"; - - print "deleting shm $id\n"; - shmctl($id, IPC_RMID, 0) || die "$!"; - -Here's an example of a semaphore: - - use IPC::SysV qw(IPC_CREAT); - - $IPC_KEY = 1234; - $id = semget($IPC_KEY, 10, 0666 | IPC_CREAT ) || die "$!"; - print "shm key $id\n"; - -Put this code in a separate file to be run in more than one process. -Call the file F: - - # create a semaphore - - $IPC_KEY = 1234; - $id = semget($IPC_KEY, 0 , 0 ); - die if !defined($id); - - $semnum = 0; - $semflag = 0; - - # 'take' semaphore - # wait for semaphore to be zero - $semop = 0; - $opstring1 = pack("s!s!s!", $semnum, $semop, $semflag); - - # Increment the semaphore count - $semop = 1; - $opstring2 = pack("s!s!s!", $semnum, $semop, $semflag); - $opstring = $opstring1 . $opstring2; - - semop($id,$opstring) || die "$!"; - -Put this code in a separate file to be run in more than one process. -Call this file F: - - # 'give' the semaphore - # run this in the original process and you will see - # that the second process continues - - $IPC_KEY = 1234; - $id = semget($IPC_KEY, 0, 0); - die if !defined($id); - - $semnum = 0; - $semflag = 0; - - # Decrement the semaphore count - $semop = -1; - $opstring = pack("s!s!s!", $semnum, $semop, $semflag); - - semop($id,$opstring) || die "$!"; - -The SysV IPC code above was written long ago, and it's definitely -clunky looking. For a more modern look, see the IPC::SysV module -which is included with Perl starting from Perl 5.005. - -A small example demonstrating SysV message queues: - - use IPC::SysV qw(IPC_PRIVATE IPC_RMID IPC_CREAT S_IRWXU); - - my $id = msgget(IPC_PRIVATE, IPC_CREAT | S_IRWXU); - - my $sent = "message"; - my $type = 1234; - my $rcvd; - my $type_rcvd; - - if (defined $id) { - if (msgsnd($id, pack("l! a*", $type_sent, $sent), 0)) { - if (msgrcv($id, $rcvd, 60, 0, 0)) { - ($type_rcvd, $rcvd) = unpack("l! a*", $rcvd); - if ($rcvd eq $sent) { - print "okay\n"; - } else { - print "not okay\n"; - } - } else { - die "# msgrcv failed\n"; - } - } else { - die "# msgsnd failed\n"; - } - msgctl($id, IPC_RMID, 0) || die "# msgctl failed: $!\n"; - } else { - die "# msgget failed\n"; - } - -=head1 NOTES - -Most of these routines quietly but politely return C when they -fail instead of causing your program to die right then and there due to -an uncaught exception. (Actually, some of the new I conversion -functions croak() on bad arguments.) It is therefore essential to -check return values from these functions. Always begin your socket -programs this way for optimal success, and don't forget to add B<-T> -taint checking flag to the #! line for servers: - - #!/usr/bin/perl -Tw - use strict; - use sigtrap; - use Socket; - -=head1 BUGS - -All these routines create system-specific portability problems. As noted -elsewhere, Perl is at the mercy of your C libraries for much of its system -behaviour. It's probably safest to assume broken SysV semantics for -signals and to stick with simple TCP and UDP socket operations; e.g., don't -try to pass open file descriptors over a local UDP datagram socket if you -want your code to stand a chance of being portable. - -As mentioned in the signals section, because few vendors provide C -libraries that are safely re-entrant, the prudent programmer will do -little else within a handler beyond setting a numeric variable that -already exists; or, if locked into a slow (restarting) system call, -using die() to raise an exception and longjmp(3) out. In fact, even -these may in some cases cause a core dump. It's probably best to avoid -signals except where they are absolutely inevitable. This -will be addressed in a future release of Perl. - -=head1 AUTHOR - -Tom Christiansen, with occasional vestiges of Larry Wall's original -version and suggestions from the Perl Porters. - -=head1 SEE ALSO - -There's a lot more to networking than this, but this should get you -started. - -For intrepid programmers, the indispensable textbook is I by W. Richard Stevens (published by Addison-Wesley). Note -that most books on networking address networking from the perspective of -a C programmer; translation to Perl is left as an exercise for the reader. - -The IO::Socket(3) manpage describes the object library, and the Socket(3) -manpage describes the low-level interface to sockets. Besides the obvious -functions in L, you should also check out the F file -at your nearest CPAN site. (See L or best yet, the F for a description of what CPAN is and where to get it.) - -Section 5 of the F file is devoted to "Networking, Device Control -(modems), and Interprocess Communication", and contains numerous unbundled -modules numerous networking modules, Chat and Expect operations, CGI -programming, DCE, FTP, IPC, NNTP, Proxy, Ptty, RPC, SNMP, SMTP, Telnet, -Threads, and ToolTalk--just to name a few. diff --git a/lib/perl5/5.6.1/pods/perllexwarn.pod b/lib/perl5/5.6.1/pods/perllexwarn.pod deleted file mode 100644 index 951a470b..00000000 --- a/lib/perl5/5.6.1/pods/perllexwarn.pod +++ /dev/null @@ -1,514 +0,0 @@ -=head1 NAME - -perllexwarn - Perl Lexical Warnings - -=head1 DESCRIPTION - -The C pragma is a replacement for both the command line -flag B<-w> and the equivalent Perl variable, C<$^W>. - -The pragma works just like the existing "strict" pragma. -This means that the scope of the warning pragma is limited to the -enclosing block. It also means that the pragma setting will not -leak across files (via C, C or C). This allows -authors to independently define the degree of warning checks that will -be applied to their module. - -By default, optional warnings are disabled, so any legacy code that -doesn't attempt to control the warnings will work unchanged. - -All warnings are enabled in a block by either of these: - - use warnings ; - use warnings 'all' ; - -Similarly all warnings are disabled in a block by either of these: - - no warnings ; - no warnings 'all' ; - -For example, consider the code below: - - use warnings ; - my @a ; - { - no warnings ; - my $b = @a[0] ; - } - my $c = @a[0]; - -The code in the enclosing block has warnings enabled, but the inner -block has them disabled. In this case that means the assignment to the -scalar C<$c> will trip the C<"Scalar value @a[0] better written as $a[0]"> -warning, but the assignment to the scalar C<$b> will not. - -=head2 Default Warnings and Optional Warnings - -Before the introduction of lexical warnings, Perl had two classes of -warnings: mandatory and optional. - -As its name suggests, if your code tripped a mandatory warning, you -would get a warning whether you wanted it or not. -For example, the code below would always produce an C<"isn't numeric"> -warning about the "2:". - - my $a = "2:" + 3; - -With the introduction of lexical warnings, mandatory warnings now become -I warnings. The difference is that although the previously -mandatory warnings are still enabled by default, they can then be -subsequently enabled or disabled with the lexical warning pragma. For -example, in the code below, an C<"isn't numeric"> warning will only -be reported for the C<$a> variable. - - my $a = "2:" + 3; - no warnings ; - my $b = "2:" + 3; - -Note that neither the B<-w> flag or the C<$^W> can be used to -disable/enable default warnings. They are still mandatory in this case. - -=head2 What's wrong with B<-w> and C<$^W> - -Although very useful, the big problem with using B<-w> on the command -line to enable warnings is that it is all or nothing. Take the typical -scenario when you are writing a Perl program. Parts of the code you -will write yourself, but it's very likely that you will make use of -pre-written Perl modules. If you use the B<-w> flag in this case, you -end up enabling warnings in pieces of code that you haven't written. - -Similarly, using C<$^W> to either disable or enable blocks of code is -fundamentally flawed. For a start, say you want to disable warnings in -a block of code. You might expect this to be enough to do the trick: - - { - local ($^W) = 0 ; - my $a =+ 2 ; - my $b ; chop $b ; - } - -When this code is run with the B<-w> flag, a warning will be produced -for the C<$a> line -- C<"Reversed += operator">. - -The problem is that Perl has both compile-time and run-time warnings. To -disable compile-time warnings you need to rewrite the code like this: - - { - BEGIN { $^W = 0 } - my $a =+ 2 ; - my $b ; chop $b ; - } - -The other big problem with C<$^W> is the way you can inadvertently -change the warning setting in unexpected places in your code. For example, -when the code below is run (without the B<-w> flag), the second call -to C will trip a C<"Use of uninitialized value"> warning, whereas -the first will not. - - sub doit - { - my $b ; chop $b ; - } - - doit() ; - - { - local ($^W) = 1 ; - doit() - } - -This is a side-effect of C<$^W> being dynamically scoped. - -Lexical warnings get around these limitations by allowing finer control -over where warnings can or can't be tripped. - -=head2 Controlling Warnings from the Command Line - -There are three Command Line flags that can be used to control when -warnings are (or aren't) produced: - -=over 5 - -=item B<-w> - -This is the existing flag. If the lexical warnings pragma is B -used in any of you code, or any of the modules that you use, this flag -will enable warnings everywhere. See L for -details of how this flag interacts with lexical warnings. - -=item B<-W> - -If the B<-W> flag is used on the command line, it will enable all warnings -throughout the program regardless of whether warnings were disabled -locally using C or C<$^W =0>. This includes all files that get -included via C, C or C. -Think of it as the Perl equivalent of the "lint" command. - -=item B<-X> - -Does the exact opposite to the B<-W> flag, i.e. it disables all warnings. - -=back - -=head2 Backward Compatibility - -If you are used with working with a version of Perl prior to the -introduction of lexically scoped warnings, or have code that uses both -lexical warnings and C<$^W>, this section will describe how they interact. - -How Lexical Warnings interact with B<-w>/C<$^W>: - -=over 5 - -=item 1. - -If none of the three command line flags (B<-w>, B<-W> or B<-X>) that -control warnings is used and neither C<$^W> or the C pragma -are used, then default warnings will be enabled and optional warnings -disabled. -This means that legacy code that doesn't attempt to control the warnings -will work unchanged. - -=item 2. - -The B<-w> flag just sets the global C<$^W> variable as in 5.005 -- this -means that any legacy code that currently relies on manipulating C<$^W> -to control warning behavior will still work as is. - -=item 3. - -Apart from now being a boolean, the C<$^W> variable operates in exactly -the same horrible uncontrolled global way, except that it cannot -disable/enable default warnings. - -=item 4. - -If a piece of code is under the control of the C pragma, -both the C<$^W> variable and the B<-w> flag will be ignored for the -scope of the lexical warning. - -=item 5. - -The only way to override a lexical warnings setting is with the B<-W> -or B<-X> command line flags. - -=back - -The combined effect of 3 & 4 is that it will allow code which uses -the C pragma to control the warning behavior of $^W-type -code (using a C) if it really wants to, but not vice-versa. - -=head2 Category Hierarchy - -A hierarchy of "categories" have been defined to allow groups of warnings -to be enabled/disabled in isolation. - -The current hierarchy is: - - all -+ - | - +- chmod - | - +- closure - | - +- exiting - | - +- glob - | - +- io -----------+ - | | - | +- closed - | | - | +- exec - | | - | +- newline - | | - | +- pipe - | | - | +- unopened - | - +- misc - | - +- numeric - | - +- once - | - +- overflow - | - +- pack - | - +- portable - | - +- recursion - | - +- redefine - | - +- regexp - | - +- severe -------+ - | | - | +- debugging - | | - | +- inplace - | | - | +- internal - | | - | +- malloc - | - +- signal - | - +- substr - | - +- syntax -------+ - | | - | +- ambiguous - | | - | +- bareword - | | - | +- deprecated - | | - | +- digit - | | - | +- parenthesis - | | - | +- precedence - | | - | +- printf - | | - | +- prototype - | | - | +- qw - | | - | +- reserved - | | - | +- semicolon - | - +- taint - | - +- umask - | - +- uninitialized - | - +- unpack - | - +- untie - | - +- utf8 - | - +- void - | - +- y2k - -Just like the "strict" pragma any of these categories can be combined - - use warnings qw(void redefine) ; - no warnings qw(io syntax untie) ; - -Also like the "strict" pragma, if there is more than one instance of the -C pragma in a given scope the cumulative effect is additive. - - use warnings qw(void) ; # only "void" warnings enabled - ... - use warnings qw(io) ; # only "void" & "io" warnings enabled - ... - no warnings qw(void) ; # only "io" warnings enabled - -To determine which category a specific warning has been assigned to see -L. - -=head2 Fatal Warnings - -The presence of the word "FATAL" in the category list will escalate any -warnings detected from the categories specified in the lexical scope -into fatal errors. In the code below, the use of C a hash. -The keys of this hash are variable names for formatting, such as -C and C. The values are the -corresponding, er, values. See L for a longer -example listing the categories an implementation might be expected to -provide; some provide more and others fewer. You don't need an -explicit C, because localeconv() always observes the -current locale. - -Here's a simple-minded example program that rewrites its command-line -parameters as integers correctly formatted in the current locale: - - # See comments in previous example - require 5.004; - use POSIX qw(locale_h); - - # Get some of locale's numeric formatting parameters - my ($thousands_sep, $grouping) = - @{localeconv()}{'thousands_sep', 'grouping'}; - - # Apply defaults if values are missing - $thousands_sep = ',' unless $thousands_sep; - - # grouping and mon_grouping are packed lists - # of small integers (characters) telling the - # grouping (thousand_seps and mon_thousand_seps - # being the group dividers) of numbers and - # monetary quantities. The integers' meanings: - # 255 means no more grouping, 0 means repeat - # the previous grouping, 1-254 means use that - # as the current grouping. Grouping goes from - # right to left (low to high digits). In the - # below we cheat slightly by never using anything - # else than the first grouping (whatever that is). - if ($grouping) { - @grouping = unpack("C*", $grouping); - } else { - @grouping = (3); - } - - # Format command line params for current locale - for (@ARGV) { - $_ = int; # Chop non-integer part - 1 while - s/(\d)(\d{$grouping[0]}($|$thousands_sep))/$1$thousands_sep$2/; - print "$_"; - } - print "\n"; - -=head1 LOCALE CATEGORIES - -The following subsections describe basic locale categories. Beyond these, -some combination categories allow manipulation of more than one -basic category at a time. See L<"ENVIRONMENT"> for a discussion of these. - -=head2 Category LC_COLLATE: Collation - -In the scope of S>, Perl looks to the C -environment variable to determine the application's notions on collation -(ordering) of characters. For example, 'b' follows 'a' in Latin -alphabets, but where do 'E' and 'E' belong? And while -'color' follows 'chocolate' in English, what about in Spanish? - -The following collations all make sense and you may meet any of them -if you "use locale". - - A B C D E a b c d e - A a B b C c D d E e - a A b B c C d D e E - a b c d e A B C D E - -Here is a code snippet to tell what "word" -characters are in the current locale, in that locale's order: - - use locale; - print +(sort grep /\w/, map { chr } 0..255), "\n"; - -Compare this with the characters that you see and their order if you -state explicitly that the locale should be ignored: - - no locale; - print +(sort grep /\w/, map { chr } 0..255), "\n"; - -This machine-native collation (which is what you get unless S> has appeared earlier in the same block) must be used for -sorting raw binary data, whereas the locale-dependent collation of the -first example is useful for natural text. - -As noted in L, C compares according to the current -collation locale when C is in effect, but falls back to a -byte-by-byte comparison for strings that the locale says are equal. You -can use POSIX::strcoll() if you don't want this fall-back: - - use POSIX qw(strcoll); - $equal_in_locale = - !strcoll("space and case ignored", "SpaceAndCaseIgnored"); - -$equal_in_locale will be true if the collation locale specifies a -dictionary-like ordering that ignores space characters completely and -which folds case. - -If you have a single string that you want to check for "equality in -locale" against several others, you might think you could gain a little -efficiency by using POSIX::strxfrm() in conjunction with C: - - use POSIX qw(strxfrm); - $xfrm_string = strxfrm("Mixed-case string"); - print "locale collation ignores spaces\n" - if $xfrm_string eq strxfrm("Mixed-casestring"); - print "locale collation ignores hyphens\n" - if $xfrm_string eq strxfrm("Mixedcase string"); - print "locale collation ignores case\n" - if $xfrm_string eq strxfrm("mixed-case string"); - -strxfrm() takes a string and maps it into a transformed string for use -in byte-by-byte comparisons against other transformed strings during -collation. "Under the hood", locale-affected Perl comparison operators -call strxfrm() for both operands, then do a byte-by-byte -comparison of the transformed strings. By calling strxfrm() explicitly -and using a non locale-affected comparison, the example attempts to save -a couple of transformations. But in fact, it doesn't save anything: Perl -magic (see L) creates the transformed version of a -string the first time it's needed in a comparison, then keeps this version around -in case it's needed again. An example rewritten the easy way with -C runs just about as fast. It also copes with null characters -embedded in strings; if you call strxfrm() directly, it treats the first -null it finds as a terminator. don't expect the transformed strings -it produces to be portable across systems--or even from one revision -of your operating system to the next. In short, don't call strxfrm() -directly: let Perl do it for you. - -Note: C isn't shown in some of these examples because it isn't -needed: strcoll() and strxfrm() exist only to generate locale-dependent -results, and so always obey the current C locale. - -=head2 Category LC_CTYPE: Character Types - -In the scope of S>, Perl obeys the C locale -setting. This controls the application's notion of which characters are -alphabetic. This affects Perl's C<\w> regular expression metanotation, -which stands for alphanumeric characters--that is, alphabetic, -numeric, and including other special characters such as the underscore or -hyphen. (Consult L for more information about -regular expressions.) Thanks to C, depending on your locale -setting, characters like 'E', 'E', 'E', and -'E' may be understood as C<\w> characters. - -The C locale also provides the map used in transliterating -characters between lower and uppercase. This affects the case-mapping -functions--lc(), lcfirst, uc(), and ucfirst(); case-mapping -interpolation with C<\l>, C<\L>, C<\u>, or C<\U> in double-quoted strings -and C substitutions; and case-independent regular expression -pattern matching using the C modifier. - -Finally, C affects the POSIX character-class test -functions--isalpha(), islower(), and so on. For example, if you move -from the "C" locale to a 7-bit Scandinavian one, you may find--possibly -to your surprise--that "|" moves from the ispunct() class to isalpha(). - -B A broken or malicious C locale definition may result -in clearly ineligible characters being considered to be alphanumeric by -your application. For strict matching of (mundane) letters and -digits--for example, in command strings--locale-aware applications -should use C<\w> inside a C block. See L<"SECURITY">. - -=head2 Category LC_NUMERIC: Numeric Formatting - -In the scope of S>, Perl obeys the C locale -information, which controls an application's idea of how numbers should -be formatted for human readability by the printf(), sprintf(), and -write() functions. String-to-numeric conversion by the POSIX::strtod() -function is also affected. In most implementations the only effect is to -change the character used for the decimal point--perhaps from '.' to ','. -These functions aren't aware of such niceties as thousands separation and -so on. (See L if you care about these things.) - -Output produced by print() is also affected by the current locale: it -depends on whether C or C is in effect, and -corresponds to what you'd get from printf() in the "C" locale. The -same is true for Perl's internal conversions between numeric and -string formats: - - use POSIX qw(strtod); - use locale; - - $n = 5/2; # Assign numeric 2.5 to $n - - $a = " $n"; # Locale-dependent conversion to string - - print "half five is $n\n"; # Locale-dependent output - - printf "half five is %g\n", $n; # Locale-dependent output - - print "DECIMAL POINT IS COMMA\n" - if $n == (strtod("2,5"))[0]; # Locale-dependent conversion - -=head2 Category LC_MONETARY: Formatting of monetary amounts - -The C standard defines the C category, but no function -that is affected by its contents. (Those with experience of standards -committees will recognize that the working group decided to punt on the -issue.) Consequently, Perl takes no notice of it. If you really want -to use C, you can query its contents--see -L--and use the information that it returns in your -application's own formatting of currency amounts. However, you may well -find that the information, voluminous and complex though it may be, still -does not quite meet your requirements: currency formatting is a hard nut -to crack. - -=head2 LC_TIME - -Output produced by POSIX::strftime(), which builds a formatted -human-readable date/time string, is affected by the current C -locale. Thus, in a French locale, the output produced by the C<%B> -format element (full month name) for the first month of the year would -be "janvier". Here's how to get a list of long month names in the -current locale: - - use POSIX qw(strftime); - for (0..11) { - $long_month_name[$_] = - strftime("%B", 0, 0, 0, 1, $_, 96); - } - -Note: C isn't needed in this example: as a function that -exists only to generate locale-dependent results, strftime() always -obeys the current C locale. - -=head2 Other categories - -The remaining locale category, C (possibly supplemented -by others in particular implementations) is not currently used by -Perl--except possibly to affect the behavior of library functions -called by extensions outside the standard Perl distribution and by the -operating system and its utilities. Note especially that the string -value of C<$!> and the error messages given by external utilities may -be changed by C. If you want to have portable error -codes, use C<%!>. See L. - -=head1 SECURITY - -Although the main discussion of Perl security issues can be found in -L, a discussion of Perl's locale handling would be incomplete -if it did not draw your attention to locale-dependent security issues. -Locales--particularly on systems that allow unprivileged users to -build their own locales--are untrustworthy. A malicious (or just plain -broken) locale can make a locale-aware application give unexpected -results. Here are a few possibilities: - -=over 4 - -=item * - -Regular expression checks for safe file names or mail addresses using -C<\w> may be spoofed by an C locale that claims that -characters such as "E" and "|" are alphanumeric. - -=item * - -String interpolation with case-mapping, as in, say, C<$dest = -"C:\U$name.$ext">, may produce dangerous results if a bogus LC_CTYPE -case-mapping table is in effect. - -=item * - -A sneaky C locale could result in the names of students with -"D" grades appearing ahead of those with "A"s. - -=item * - -An application that takes the trouble to use information in -C may format debits as if they were credits and vice versa -if that locale has been subverted. Or it might make payments in US -dollars instead of Hong Kong dollars. - -=item * - -The date and day names in dates formatted by strftime() could be -manipulated to advantage by a malicious user able to subvert the -C locale. ("Look--it says I wasn't in the building on -Sunday.") - -=back - -Such dangers are not peculiar to the locale system: any aspect of an -application's environment which may be modified maliciously presents -similar challenges. Similarly, they are not specific to Perl: any -programming language that allows you to write programs that take -account of their environment exposes you to these issues. - -Perl cannot protect you from all possibilities shown in the -examples--there is no substitute for your own vigilance--but, when -C is in effect, Perl uses the tainting mechanism (see -L) to mark string results that become locale-dependent, and -which may be untrustworthy in consequence. Here is a summary of the -tainting behavior of operators and functions that may be affected by -the locale: - -=over 4 - -=item * - -B (C, C, C, C and C): - -Scalar true/false (or less/equal/greater) result is never tainted. - -=item * - -B (with C<\l>, C<\L>, C<\u> or C<\U>) - -Result string containing interpolated material is tainted if -C is in effect. - -=item * - -B (C): - -Scalar true/false result never tainted. - -Subpatterns, either delivered as a list-context result or as $1 etc. -are tainted if C is in effect, and the subpattern regular -expression contains C<\w> (to match an alphanumeric character), C<\W> -(non-alphanumeric character), C<\s> (white-space character), or C<\S> -(non white-space character). The matched-pattern variable, $&, $` -(pre-match), $' (post-match), and $+ (last match) are also tainted if -C is in effect and the regular expression contains C<\w>, -C<\W>, C<\s>, or C<\S>. - -=item * - -B (C): - -Has the same behavior as the match operator. Also, the left -operand of C<=~> becomes tainted when C in effect -if modified as a result of a substitution based on a regular -expression match involving C<\w>, C<\W>, C<\s>, or C<\S>; or of -case-mapping with C<\l>, C<\L>,C<\u> or C<\U>. - -=item * - -B (printf() and write()): - -Results are never tainted because otherwise even output from print, -for example C, should be tainted if C is in -effect. - -=item * - -B (lc(), lcfirst(), uc(), ucfirst()): - -Results are tainted if C is in effect. - -=item * - -B (localeconv(), strcoll(), -strftime(), strxfrm()): - -Results are never tainted. - -=item * - -B (isalnum(), isalpha(), isdigit(), -isgraph(), islower(), isprint(), ispunct(), isspace(), isupper(), -isxdigit()): - -True/false results are never tainted. - -=back - -Three examples illustrate locale-dependent tainting. -The first program, which ignores its locale, won't run: a value taken -directly from the command line may not be used to name an output file -when taint checks are enabled. - - #/usr/local/bin/perl -T - # Run with taint checking - - # Command line sanity check omitted... - $tainted_output_file = shift; - - open(F, ">$tainted_output_file") - or warn "Open of $untainted_output_file failed: $!\n"; - -The program can be made to run by "laundering" the tainted value through -a regular expression: the second example--which still ignores locale -information--runs, creating the file named on its command line -if it can. - - #/usr/local/bin/perl -T - - $tainted_output_file = shift; - $tainted_output_file =~ m%[\w/]+%; - $untainted_output_file = $&; - - open(F, ">$untainted_output_file") - or warn "Open of $untainted_output_file failed: $!\n"; - -Compare this with a similar but locale-aware program: - - #/usr/local/bin/perl -T - - $tainted_output_file = shift; - use locale; - $tainted_output_file =~ m%[\w/]+%; - $localized_output_file = $&; - - open(F, ">$localized_output_file") - or warn "Open of $localized_output_file failed: $!\n"; - -This third program fails to run because $& is tainted: it is the result -of a match involving C<\w> while C is in effect. - -=head1 ENVIRONMENT - -=over 12 - -=item PERL_BADLANG - -A string that can suppress Perl's warning about failed locale settings -at startup. Failure can occur if the locale support in the operating -system is lacking (broken) in some way--or if you mistyped the name of -a locale when you set up your environment. If this environment -variable is absent, or has a value that does not evaluate to integer -zero--that is, "0" or ""-- Perl will complain about locale setting -failures. - -B: PERL_BADLANG only gives you a way to hide the warning message. -The message tells about some problem in your system's locale support, -and you should investigate what the problem is. - -=back - -The following environment variables are not specific to Perl: They are -part of the standardized (ISO C, XPG4, POSIX 1.c) setlocale() method -for controlling an application's opinion on data. - -=over 12 - -=item LC_ALL - -C is the "override-all" locale environment variable. If -set, it overrides all the rest of the locale environment variables. - -=item LANGUAGE - -B: C is a GNU extension, it affects you only if you -are using the GNU libc. This is the case if you are using e.g. Linux. -If you are using "commercial" UNIXes you are most probably I -using GNU libc and you can ignore C. - -However, in the case you are using C: it affects the -language of informational, warning, and error messages output by -commands (in other words, it's like C) but it has higher -priority than L. Moreover, it's not a single value but -instead a "path" (":"-separated list) of I (not locales). -See the GNU C library documentation for more information. - -=item LC_CTYPE - -In the absence of C, C chooses the character type -locale. In the absence of both C and C, C -chooses the character type locale. - -=item LC_COLLATE - -In the absence of C, C chooses the collation -(sorting) locale. In the absence of both C and C, -C chooses the collation locale. - -=item LC_MONETARY - -In the absence of C, C chooses the monetary -formatting locale. In the absence of both C and C, -C chooses the monetary formatting locale. - -=item LC_NUMERIC - -In the absence of C, C chooses the numeric format -locale. In the absence of both C and C, C -chooses the numeric format. - -=item LC_TIME - -In the absence of C, C chooses the date and time -formatting locale. In the absence of both C and C, -C chooses the date and time formatting locale. - -=item LANG - -C is the "catch-all" locale environment variable. If it is set, it -is used as the last resort after the overall C and the -category-specific C. - -=back - -=head1 NOTES - -=head2 Backward compatibility - -Versions of Perl prior to 5.004 B ignored locale information, -generally behaving as if something similar to the C<"C"> locale were -always in force, even if the program environment suggested otherwise -(see L). By default, Perl still behaves this -way for backward compatibility. If you want a Perl application to pay -attention to locale information, you B use the S> -pragma (see L) to instruct it to do so. - -Versions of Perl from 5.002 to 5.003 did use the C -information if available; that is, C<\w> did understand what -were the letters according to the locale environment variables. -The problem was that the user had no control over the feature: -if the C library supported locales, Perl used them. - -=head2 I18N:Collate obsolete - -In versions of Perl prior to 5.004, per-locale collation was possible -using the C library module. This module is now mildly -obsolete and should be avoided in new applications. The C -functionality is now integrated into the Perl core language: One can -use locale-specific scalar data completely normally with C, -so there is no longer any need to juggle with the scalar references of -C. - -=head2 Sort speed and memory use impacts - -Comparing and sorting by locale is usually slower than the default -sorting; slow-downs of two to four times have been observed. It will -also consume more memory: once a Perl scalar variable has participated -in any string comparison or sorting operation obeying the locale -collation rules, it will take 3-15 times more memory than before. (The -exact multiplier depends on the string's contents, the operating system -and the locale.) These downsides are dictated more by the operating -system's implementation of the locale system than by Perl. - -=head2 write() and LC_NUMERIC - -Formats are the only part of Perl that unconditionally use information -from a program's locale; if a program's environment specifies an -LC_NUMERIC locale, it is always used to specify the decimal point -character in formatted output. Formatted output cannot be controlled by -C because the pragma is tied to the block structure of the -program, and, for historical reasons, formats exist outside that block -structure. - -=head2 Freely available locale definitions - -There is a large collection of locale definitions at -C. You should be aware that it is -unsupported, and is not claimed to be fit for any purpose. If your -system allows installation of arbitrary locales, you may find the -definitions useful as they are, or as a basis for the development of -your own locales. - -=head2 I18n and l10n - -"Internationalization" is often abbreviated as B because its first -and last letters are separated by eighteen others. (You may guess why -the internalin ... internaliti ... i18n tends to get abbreviated.) In -the same way, "localization" is often abbreviated to B. - -=head2 An imperfect standard - -Internationalization, as defined in the C and POSIX standards, can be -criticized as incomplete, ungainly, and having too large a granularity. -(Locales apply to a whole process, when it would arguably be more useful -to have them apply to a single thread, window group, or whatever.) They -also have a tendency, like standards groups, to divide the world into -nations, when we all know that the world can equally well be divided -into bankers, bikers, gamers, and so on. But, for now, it's the only -standard we've got. This may be construed as a bug. - -=head1 BUGS - -=head2 Broken systems - -In certain systems, the operating system's locale support -is broken and cannot be fixed or used by Perl. Such deficiencies can -and will result in mysterious hangs and/or Perl core dumps when the -C is in effect. When confronted with such a system, -please report in excruciating detail to >, and -complain to your vendor: bug fixes may exist for these problems -in your operating system. Sometimes such bug fixes are called an -operating system upgrade. - -=head1 SEE ALSO - -L, L, L, -L, L, L, -L, L, L, -L, L, L, -L, L, L, -L. - -=head1 HISTORY - -Jarkko Hietaniemi's original F heavily hacked by Dominic -Dunlop, assisted by the perl5-porters. Prose worked over a bit by -Tom Christiansen. - -Last update: Thu Jun 11 08:44:13 MDT 1998 diff --git a/lib/perl5/5.6.1/pods/perllol.pod b/lib/perl5/5.6.1/pods/perllol.pod deleted file mode 100644 index 5c16bfdd..00000000 --- a/lib/perl5/5.6.1/pods/perllol.pod +++ /dev/null @@ -1,303 +0,0 @@ -=head1 NAME - -perllol - Manipulating Arrays of Arrays in Perl - -=head1 DESCRIPTION - -=head2 Declaration and Access of Arrays of Arrays - -The simplest thing to build an array of arrays (sometimes imprecisely -called a list of lists). It's reasonably easy to understand, and -almost everything that applies here will also be applicable later -on with the fancier data structures. - -An array of an array is just a regular old array @AoA that you can -get at with two subscripts, like C<$AoA[3][2]>. Here's a declaration -of the array: - - # assign to our array, an array of array references - @AoA = ( - [ "fred", "barney" ], - [ "george", "jane", "elroy" ], - [ "homer", "marge", "bart" ], - ); - - print $AoA[2][2]; - bart - -Now you should be very careful that the outer bracket type -is a round one, that is, a parenthesis. That's because you're assigning to -an @array, so you need parentheses. If you wanted there I to be an @AoA, -but rather just a reference to it, you could do something more like this: - - # assign a reference to array of array references - $ref_to_AoA = [ - [ "fred", "barney", "pebbles", "bambam", "dino", ], - [ "homer", "bart", "marge", "maggie", ], - [ "george", "jane", "elroy", "judy", ], - ]; - - print $ref_to_AoA->[2][2]; - -Notice that the outer bracket type has changed, and so our access syntax -has also changed. That's because unlike C, in perl you can't freely -interchange arrays and references thereto. $ref_to_AoA is a reference to an -array, whereas @AoA is an array proper. Likewise, C<$AoA[2]> is not an -array, but an array ref. So how come you can write these: - - $AoA[2][2] - $ref_to_AoA->[2][2] - -instead of having to write these: - - $AoA[2]->[2] - $ref_to_AoA->[2]->[2] - -Well, that's because the rule is that on adjacent brackets only (whether -square or curly), you are free to omit the pointer dereferencing arrow. -But you cannot do so for the very first one if it's a scalar containing -a reference, which means that $ref_to_AoA always needs it. - -=head2 Growing Your Own - -That's all well and good for declaration of a fixed data structure, -but what if you wanted to add new elements on the fly, or build -it up entirely from scratch? - -First, let's look at reading it in from a file. This is something like -adding a row at a time. We'll assume that there's a flat file in which -each line is a row and each word an element. If you're trying to develop an -@AoA array containing all these, here's the right way to do that: - - while (<>) { - @tmp = split; - push @AoA, [ @tmp ]; - } - -You might also have loaded that from a function: - - for $i ( 1 .. 10 ) { - $AoA[$i] = [ somefunc($i) ]; - } - -Or you might have had a temporary variable sitting around with the -array in it. - - for $i ( 1 .. 10 ) { - @tmp = somefunc($i); - $AoA[$i] = [ @tmp ]; - } - -It's very important that you make sure to use the C<[]> array reference -constructor. That's because this will be very wrong: - - $AoA[$i] = @tmp; - -You see, assigning a named array like that to a scalar just counts the -number of elements in @tmp, which probably isn't what you want. - -If you are running under C, you'll have to add some -declarations to make it happy: - - use strict; - my(@AoA, @tmp); - while (<>) { - @tmp = split; - push @AoA, [ @tmp ]; - } - -Of course, you don't need the temporary array to have a name at all: - - while (<>) { - push @AoA, [ split ]; - } - -You also don't have to use push(). You could just make a direct assignment -if you knew where you wanted to put it: - - my (@AoA, $i, $line); - for $i ( 0 .. 10 ) { - $line = <>; - $AoA[$i] = [ split ' ', $line ]; - } - -or even just - - my (@AoA, $i); - for $i ( 0 .. 10 ) { - $AoA[$i] = [ split ' ', <> ]; - } - -You should in general be leery of using functions that could -potentially return lists in scalar context without explicitly stating -such. This would be clearer to the casual reader: - - my (@AoA, $i); - for $i ( 0 .. 10 ) { - $AoA[$i] = [ split ' ', scalar(<>) ]; - } - -If you wanted to have a $ref_to_AoA variable as a reference to an array, -you'd have to do something like this: - - while (<>) { - push @$ref_to_AoA, [ split ]; - } - -Now you can add new rows. What about adding new columns? If you're -dealing with just matrices, it's often easiest to use simple assignment: - - for $x (1 .. 10) { - for $y (1 .. 10) { - $AoA[$x][$y] = func($x, $y); - } - } - - for $x ( 3, 7, 9 ) { - $AoA[$x][20] += func2($x); - } - -It doesn't matter whether those elements are already -there or not: it'll gladly create them for you, setting -intervening elements to C as need be. - -If you wanted just to append to a row, you'd have -to do something a bit funnier looking: - - # add new columns to an existing row - push @{ $AoA[0] }, "wilma", "betty"; - -Notice that I I say just: - - push $AoA[0], "wilma", "betty"; # WRONG! - -In fact, that wouldn't even compile. How come? Because the argument -to push() must be a real array, not just a reference to such. - -=head2 Access and Printing - -Now it's time to print your data structure out. How -are you going to do that? Well, if you want only one -of the elements, it's trivial: - - print $AoA[0][0]; - -If you want to print the whole thing, though, you can't -say - - print @AoA; # WRONG - -because you'll get just references listed, and perl will never -automatically dereference things for you. Instead, you have to -roll yourself a loop or two. This prints the whole structure, -using the shell-style for() construct to loop across the outer -set of subscripts. - - for $aref ( @AoA ) { - print "\t [ @$aref ],\n"; - } - -If you wanted to keep track of subscripts, you might do this: - - for $i ( 0 .. $#AoA ) { - print "\t elt $i is [ @{$AoA[$i]} ],\n"; - } - -or maybe even this. Notice the inner loop. - - for $i ( 0 .. $#AoA ) { - for $j ( 0 .. $#{$AoA[$i]} ) { - print "elt $i $j is $AoA[$i][$j]\n"; - } - } - -As you can see, it's getting a bit complicated. That's why -sometimes is easier to take a temporary on your way through: - - for $i ( 0 .. $#AoA ) { - $aref = $AoA[$i]; - for $j ( 0 .. $#{$aref} ) { - print "elt $i $j is $AoA[$i][$j]\n"; - } - } - -Hmm... that's still a bit ugly. How about this: - - for $i ( 0 .. $#AoA ) { - $aref = $AoA[$i]; - $n = @$aref - 1; - for $j ( 0 .. $n ) { - print "elt $i $j is $AoA[$i][$j]\n"; - } - } - -=head2 Slices - -If you want to get at a slice (part of a row) in a multidimensional -array, you're going to have to do some fancy subscripting. That's -because while we have a nice synonym for single elements via the -pointer arrow for dereferencing, no such convenience exists for slices. -(Remember, of course, that you can always write a loop to do a slice -operation.) - -Here's how to do one operation using a loop. We'll assume an @AoA -variable as before. - - @part = (); - $x = 4; - for ($y = 7; $y < 13; $y++) { - push @part, $AoA[$x][$y]; - } - -That same loop could be replaced with a slice operation: - - @part = @{ $AoA[4] } [ 7..12 ]; - -but as you might well imagine, this is pretty rough on the reader. - -Ah, but what if you wanted a I, such as having -$x run from 4..8 and $y run from 7 to 12? Hmm... here's the simple way: - - @newAoA = (); - for ($startx = $x = 4; $x <= 8; $x++) { - for ($starty = $y = 7; $y <= 12; $y++) { - $newAoA[$x - $startx][$y - $starty] = $AoA[$x][$y]; - } - } - -We can reduce some of the looping through slices - - for ($x = 4; $x <= 8; $x++) { - push @newAoA, [ @{ $AoA[$x] } [ 7..12 ] ]; - } - -If you were into Schwartzian Transforms, you would probably -have selected map for that - - @newAoA = map { [ @{ $AoA[$_] } [ 7..12 ] ] } 4 .. 8; - -Although if your manager accused of seeking job security (or rapid -insecurity) through inscrutable code, it would be hard to argue. :-) -If I were you, I'd put that in a function: - - @newAoA = splice_2D( \@AoA, 4 => 8, 7 => 12 ); - sub splice_2D { - my $lrr = shift; # ref to array of array refs! - my ($x_lo, $x_hi, - $y_lo, $y_hi) = @_; - - return map { - [ @{ $lrr->[$_] } [ $y_lo .. $y_hi ] ] - } $x_lo .. $x_hi; - } - - -=head1 SEE ALSO - -perldata(1), perlref(1), perldsc(1) - -=head1 AUTHOR - -Tom Christiansen > - -Last update: Thu Jun 4 16:16:23 MDT 1998 diff --git a/lib/perl5/5.6.1/pods/perlmachten.pod b/lib/perl5/5.6.1/pods/perlmachten.pod deleted file mode 100644 index 8e14fc71..00000000 --- a/lib/perl5/5.6.1/pods/perlmachten.pod +++ /dev/null @@ -1,89 +0,0 @@ -If you read this file _as_is_, just ignore the funny characters you -see. It is written in the POD format (see pod/perlpod.pod) which is -specially designed to be readable as is. - -=head1 NAME - -README.machten - Perl version 5 on Power MachTen systems - -=head1 DESCRIPTION - -This document describes how to build Perl 5 on Power MachTen systems, -and discusses a few wrinkles in the implementation. - -=head2 Compiling Perl 5 on MachTen - -To compile perl under MachTen 4.1.4 (and probably earlier versions): - - ./Configure -de - make - make test - make install - -This builds and installs a statically-linked perl; MachTen's dynamic -linking facilities are not adequate to support Perl's use of -dynamically linked libraries. (See F for more -information.) - -You should have at least 32 megabytes of free memory on your -system before running the C command. - -For much more information on building perl -- for example, on how to -change the default installation directory -- see F. - -=head2 Failures during C - -=over 4 - -=item op/lexassign.t - -This test may fail when first run after building perl. It does not -fail subsequently. The cause is unknown. - -=item pragma/warnings.t - -Test 257 fails due to a failure to warn about attempts to read from a -filehandle which is a duplicate of stdout when stdout is attached to a -pipe. The output of the test contains a block comment which discusses -a different failure, not applicable to MachTen. - -The root of the problem is that Machten does not assign a file type to -either end of a pipe (see L), resulting, among other things -in Perl's C<-p> test failing on file descriptors belonging to pipes. -As a result, perl becomes confused, and the test for reading from a -write-only file fails. I am reluctant to patch perl to get around -this, as it's clearly an OS bug (about which Tenon has been informed), -and limited in its effect on practical Perl programs. - -=back - -=head2 Building external modules - -To add an external module to perl, build in the normal way, which -is documented in L, or which can be driven -automatically by the CPAN module (see L), which is part of the -standard distribution. If you want to install a module which -contains XS code (C or C++ source which compiles to object code -for linking with perl), you will have to replace your perl binary with -a new version containing the new statically-linked object module. The -build process tells you how to do this. - -There is a gotcha, however, which users usually encounter immediately -they respond to CPAN's invitation to C. When -installing a I -- a group of modules which together achieve -some particular purpose, the installation process for later modules in -the bundle tends to assume that earlier modules have been fully -installed and are available for use. This is not true on a -statically-linked system for earlier modules which contain XS code. -As a result the installation of the bundle fails. The work-around is -not to install the bundle as a one-shot operation, but instead to see -what modules it contains, and install these one-at-a-time by hand in -the order given. - -=head1 AUTHOR - -Dominic Dunlop - -=head1 DATE - -Version 1.0.1 2000-03-27 diff --git a/lib/perl5/5.6.1/pods/perlmacos.pod b/lib/perl5/5.6.1/pods/perlmacos.pod deleted file mode 100644 index 792b1545..00000000 --- a/lib/perl5/5.6.1/pods/perlmacos.pod +++ /dev/null @@ -1,63 +0,0 @@ -If you read this file _as_is_, just ignore the funny characters you see. -It is written in the POD format (see pod/perlpod.pod) which is specially -designed to be readable as is. - -=head1 NAME - -README.macos - Perl under Mac OS (Classic) - - -=head1 SYNOPSIS - -This document briefly describes perl under Mac OS (Classic). -If you are running perl under Mac OS X, you don't want to be -here (unless you are in the Classic environment under Mac OS X). - -When we say "Mac OS" below, we mean pre-Mac OS X, which includes -Mac OS 7, 8, and 9. - - -=head1 DESCRIPTION - -The perl 5.6.1 source itself builds on Mac OS, with some additional -pieces. Support for Mac OS is now in the perl core, and MacPerl will be -able to, in the future, keep in closer sync with regular perl releases. - -At this time, though, it is very buggy, and is under development. An -alpha release is available, with work progressing toward a beta. - -To build perl for Mac OS (as an MPW tool), you will need the addition -of the "macos" subdirectory, distributed separately. It includes extra -source files, config files, and make files. It also includes a lot of -extra Mac-specific modules. - -To build the MacPerl application, you will also need the "macperl" -directory, which includes the source files for creating the -application itself. - -All of this is available from the development site, via -HTTP and anonymous CVS. - - http://dev.macperl.org/ - -The source is also in the main perl repository in the maint-5.6/macperl -branch. - -You will also need compilers and libraries, all of them freely -available. These are linked to from the SourceForge site. Go that site -for all things having to do with MacPerl development. - -MacPerl 5.2.0r4 is available on the CPAN and on SourceForge. It -is based on perl 5.004. - - -=head1 AUTHOR - -perl was ported to Mac OS by Matthias Neeracher -Eneeracher@mac.comE. It is currently maintained by Chris -Nandor Epudge@pobox.comE. - - -=head1 DATE - -Last modified 2001.07.19. diff --git a/lib/perl5/5.6.1/pods/perlmod.pod b/lib/perl5/5.6.1/pods/perlmod.pod deleted file mode 100644 index 01056f1d..00000000 --- a/lib/perl5/5.6.1/pods/perlmod.pod +++ /dev/null @@ -1,455 +0,0 @@ -=head1 NAME - -perlmod - Perl modules (packages and symbol tables) - -=head1 DESCRIPTION - -=head2 Packages - -Perl provides a mechanism for alternative namespaces to protect -packages from stomping on each other's variables. In fact, there's -really no such thing as a global variable in Perl. The package -statement declares the compilation unit as being in the given -namespace. The scope of the package declaration is from the -declaration itself through the end of the enclosing block, C, -or file, whichever comes first (the same scope as the my() and -local() operators). Unqualified dynamic identifiers will be in -this namespace, except for those few identifiers that if unqualified, -default to the main package instead of the current one as described -below. A package statement affects only dynamic variables--including -those you've used local() on--but I lexical variables created -with my(). Typically it would be the first declaration in a file -included by the C, C, or C operators. You can -switch into a package in more than one place; it merely influences -which symbol table is used by the compiler for the rest of that -block. You can refer to variables and filehandles in other packages -by prefixing the identifier with the package name and a double -colon: C<$Package::Variable>. If the package name is null, the -C

    package is assumed. That is, C<$::sail> is equivalent to -C<$main::sail>. - -The old package delimiter was a single quote, but double colon is now the -preferred delimiter, in part because it's more readable to humans, and -in part because it's more readable to B macros. It also makes C++ -programmers feel like they know what's going on--as opposed to using the -single quote as separator, which was there to make Ada programmers feel -like they knew what's going on. Because the old-fashioned syntax is still -supported for backwards compatibility, if you try to use a string like -C<"This is $owner's house">, you'll be accessing C<$owner::s>; that is, -the $s variable in package C, which is probably not what you meant. -Use braces to disambiguate, as in C<"This is ${owner}'s house">. - -Packages may themselves contain package separators, as in -C<$OUTER::INNER::var>. This implies nothing about the order of -name lookups, however. There are no relative packages: all symbols -are either local to the current package, or must be fully qualified -from the outer package name down. For instance, there is nowhere -within package C that C<$INNER::var> refers to -C<$OUTER::INNER::var>. It would treat package C as a totally -separate global package. - -Only identifiers starting with letters (or underscore) are stored -in a package's symbol table. All other symbols are kept in package -C
    , including all punctuation variables, like $_. In addition, -when unqualified, the identifiers STDIN, STDOUT, STDERR, ARGV, -ARGVOUT, ENV, INC, and SIG are forced to be in package C
    , -even when used for other purposes than their built-in one. If you -have a package called C, C, or C, then you can't use the -qualified form of an identifier because it would be instead interpreted -as a pattern match, a substitution, or a transliteration. - -Variables beginning with underscore used to be forced into package -main, but we decided it was more useful for package writers to be able -to use leading underscore to indicate private variables and method names. -$_ is still global though. See also -L. - -Ced strings are compiled in the package in which the eval() was -compiled. (Assignments to C<$SIG{}>, however, assume the signal -handler specified is in the C
    package. Qualify the signal handler -name if you wish to have a signal handler in a package.) For an -example, examine F in the Perl library. It initially switches -to the C package so that the debugger doesn't interfere with variables -in the program you are trying to debug. At various points, however, it -temporarily switches back to the C
    package to evaluate various -expressions in the context of the C
    package (or wherever you came -from). See L. - -The special symbol C<__PACKAGE__> contains the current package, but cannot -(easily) be used to construct variables. - -See L for other scoping issues related to my() and local(), -and L regarding closures. - -=head2 Symbol Tables - -The symbol table for a package happens to be stored in the hash of that -name with two colons appended. The main symbol table's name is thus -C<%main::>, or C<%::> for short. Likewise the symbol table for the nested -package mentioned earlier is named C<%OUTER::INNER::>. - -The value in each entry of the hash is what you are referring to when you -use the C<*name> typeglob notation. In fact, the following have the same -effect, though the first is more efficient because it does the symbol -table lookups at compile time: - - local *main::foo = *main::bar; - local $main::{foo} = $main::{bar}; - -(Be sure to note the B difference between the second line above -and C. The former is accessing the hash -C<%main::>, which is the symbol table of package C
    . The latter is -simply assigning scalar C<$bar> in package C
    to scalar C<$foo> of -the same package.) - -You can use this to print out all the variables in a package, for -instance. The standard but antiquated F library and -the CPAN module Devel::Symdump make use of this. - -Assignment to a typeglob performs an aliasing operation, i.e., - - *dick = *richard; - -causes variables, subroutines, formats, and file and directory handles -accessible via the identifier C also to be accessible via the -identifier C. If you want to alias only a particular variable or -subroutine, assign a reference instead: - - *dick = \$richard; - -Which makes $richard and $dick the same variable, but leaves -@richard and @dick as separate arrays. Tricky, eh? - -This mechanism may be used to pass and return cheap references -into or from subroutines if you don't want to copy the whole -thing. It only works when assigning to dynamic variables, not -lexicals. - - %some_hash = (); # can't be my() - *some_hash = fn( \%another_hash ); - sub fn { - local *hashsym = shift; - # now use %hashsym normally, and you - # will affect the caller's %another_hash - my %nhash = (); # do what you want - return \%nhash; - } - -On return, the reference will overwrite the hash slot in the -symbol table specified by the *some_hash typeglob. This -is a somewhat tricky way of passing around references cheaply -when you don't want to have to remember to dereference variables -explicitly. - -Another use of symbol tables is for making "constant" scalars. - - *PI = \3.14159265358979; - -Now you cannot alter C<$PI>, which is probably a good thing all in all. -This isn't the same as a constant subroutine, which is subject to -optimization at compile-time. A constant subroutine is one prototyped -to take no arguments and to return a constant expression. See -L for details on these. The C pragma is a -convenient shorthand for these. - -You can say C<*foo{PACKAGE}> and C<*foo{NAME}> to find out what name and -package the *foo symbol table entry comes from. This may be useful -in a subroutine that gets passed typeglobs as arguments: - - sub identify_typeglob { - my $glob = shift; - print 'You gave me ', *{$glob}{PACKAGE}, '::', *{$glob}{NAME}, "\n"; - } - identify_typeglob *foo; - identify_typeglob *bar::baz; - -This prints - - You gave me main::foo - You gave me bar::baz - -The C<*foo{THING}> notation can also be used to obtain references to the -individual elements of *foo. See L. - -Subroutine definitions (and declarations, for that matter) need -not necessarily be situated in the package whose symbol table they -occupy. You can define a subroutine outside its package by -explicitly qualifying the name of the subroutine: - - package main; - sub Some_package::foo { ... } # &foo defined in Some_package - -This is just a shorthand for a typeglob assignment at compile time: - - BEGIN { *Some_package::foo = sub { ... } } - -and is I the same as writing: - - { - package Some_package; - sub foo { ... } - } - -In the first two versions, the body of the subroutine is -lexically in the main package, I in Some_package. So -something like this: - - package main; - - $Some_package::name = "fred"; - $main::name = "barney"; - - sub Some_package::foo { - print "in ", __PACKAGE__, ": \$name is '$name'\n"; - } - - Some_package::foo(); - -prints: - - in main: $name is 'barney' - -rather than: - - in Some_package: $name is 'fred' - -This also has implications for the use of the SUPER:: qualifier -(see L). - -=head2 Package Constructors and Destructors - -Four special subroutines act as package constructors and destructors. -These are the C, C, C, and C routines. The -C is optional for these routines. - -A C subroutine is executed as soon as possible, that is, the moment -it is completely defined, even before the rest of the containing file -is parsed. You may have multiple C blocks within a file--they -will execute in order of definition. Because a C block executes -immediately, it can pull in definitions of subroutines and such from other -files in time to be visible to the rest of the file. Once a C -has run, it is immediately undefined and any code it used is returned to -Perl's memory pool. This means you can't ever explicitly call a C. - -An C subroutine is executed as late as possible, that is, after -perl has finished running the program and just before the interpreter -is being exited, even if it is exiting as a result of a die() function. -(But not if it's polymorphing into another program via C, or -being blown out of the water by a signal--you have to trap that yourself -(if you can).) You may have multiple C blocks within a file--they -will execute in reverse order of definition; that is: last in, first -out (LIFO). C blocks are not executed when you run perl with the -C<-c> switch, or if compilation fails. - -Inside an C subroutine, C<$?> contains the value that the program is -going to pass to C. You can modify C<$?> to change the exit -value of the program. Beware of changing C<$?> by accident (e.g. by -running something via C). - -Similar to C blocks, C blocks are run just before the -Perl runtime begins execution, in "first in, first out" (FIFO) order. -For example, the code generators documented in L make use of -C blocks to initialize and resolve pointers to XSUBs. - -Similar to C blocks, C blocks are run just after the -Perl compile phase ends and before the run time begins, in -LIFO order. C blocks are again useful in the Perl compiler -suite to save the compiled state of the program. - -When you use the B<-n> and B<-p> switches to Perl, C and -C work just as they do in B, as a degenerate case. -Both C and C blocks are run when you use the B<-c> -switch for a compile-only syntax check, although your main code -is not. - -=head2 Perl Classes - -There is no special class syntax in Perl, but a package may act -as a class if it provides subroutines to act as methods. Such a -package may also derive some of its methods from another class (package) -by listing the other package name(s) in its global @ISA array (which -must be a package global, not a lexical). - -For more on this, see L and L. - -=head2 Perl Modules - -A module is just a set of related functions in a library file, i.e., -a Perl package with the same name as the file. It is specifically -designed to be reusable by other modules or programs. It may do this -by providing a mechanism for exporting some of its symbols into the -symbol table of any package using it. Or it may function as a class -definition and make its semantics available implicitly through -method calls on the class and its objects, without explicitly -exporting anything. Or it can do a little of both. - -For example, to start a traditional, non-OO module called Some::Module, -create a file called F and start with this template: - - package Some::Module; # assumes Some/Module.pm - - use strict; - use warnings; - - BEGIN { - use Exporter (); - our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS); - - # set the version for version checking - $VERSION = 1.00; - # if using RCS/CVS, this may be preferred - $VERSION = do { my @r = (q$Revision: 2.21 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; # must be all one line, for MakeMaker - - @ISA = qw(Exporter); - @EXPORT = qw(&func1 &func2 &func4); - %EXPORT_TAGS = ( ); # eg: TAG => [ qw!name1 name2! ], - - # your exported package globals go here, - # as well as any optionally exported functions - @EXPORT_OK = qw($Var1 %Hashit &func3); - } - our @EXPORT_OK; - - # exported package globals go here - our $Var1; - our %Hashit; - - # non-exported package globals go here - our @more; - our $stuff; - - # initialize package globals, first exported ones - $Var1 = ''; - %Hashit = (); - - # then the others (which are still accessible as $Some::Module::stuff) - $stuff = ''; - @more = (); - - # all file-scoped lexicals must be created before - # the functions below that use them. - - # file-private lexicals go here - my $priv_var = ''; - my %secret_hash = (); - - # here's a file-private function as a closure, - # callable as &$priv_func; it cannot be prototyped. - my $priv_func = sub { - # stuff goes here. - }; - - # make all your functions, whether exported or not; - # remember to put something interesting in the {} stubs - sub func1 {} # no prototype - sub func2() {} # proto'd void - sub func3($$) {} # proto'd to 2 scalars - - # this one isn't exported, but could be called! - sub func4(\%) {} # proto'd to 1 hash ref - - END { } # module clean-up code here (global destructor) - - ## YOUR CODE GOES HERE - - 1; # don't forget to return a true value from the file - -Then go on to declare and use your variables in functions without -any qualifications. See L and the L for -details on mechanics and style issues in module creation. - -Perl modules are included into your program by saying - - use Module; - -or - - use Module LIST; - -This is exactly equivalent to - - BEGIN { require Module; import Module; } - -or - - BEGIN { require Module; import Module LIST; } - -As a special case - - use Module (); - -is exactly equivalent to - - BEGIN { require Module; } - -All Perl module files have the extension F<.pm>. The C operator -assumes this so you don't have to spell out "F" in quotes. -This also helps to differentiate new modules from old F<.pl> and -F<.ph> files. Module names are also capitalized unless they're -functioning as pragmas; pragmas are in effect compiler directives, -and are sometimes called "pragmatic modules" (or even "pragmata" -if you're a classicist). - -The two statements: - - require SomeModule; - require "SomeModule.pm"; - -differ from each other in two ways. In the first case, any double -colons in the module name, such as C, are translated -into your system's directory separator, usually "/". The second -case does not, and would have to be specified literally. The other -difference is that seeing the first C clues in the compiler -that uses of indirect object notation involving "SomeModule", as -in C<$ob = purge SomeModule>, are method calls, not function calls. -(Yes, this really can make a difference.) - -Because the C statement implies a C block, the importing -of semantics happens as soon as the C statement is compiled, -before the rest of the file is compiled. This is how it is able -to function as a pragma mechanism, and also how modules are able to -declare subroutines that are then visible as list or unary operators for -the rest of the current file. This will not work if you use C -instead of C. With C you can get into this problem: - - require Cwd; # make Cwd:: accessible - $here = Cwd::getcwd(); - - use Cwd; # import names from Cwd:: - $here = getcwd(); - - require Cwd; # make Cwd:: accessible - $here = getcwd(); # oops! no main::getcwd() - -In general, C is recommended over C, -because it determines module availability at compile time, not in the -middle of your program's execution. An exception would be if two modules -each tried to C each other, and each also called a function from -that other module. In that case, it's easy to use Cs instead. - -Perl packages may be nested inside other package names, so we can have -package names containing C<::>. But if we used that package name -directly as a filename it would make for unwieldy or impossible -filenames on some systems. Therefore, if a module's name is, say, -C, then its definition is actually found in the library -file F. - -Perl modules always have a F<.pm> file, but there may also be -dynamically linked executables (often ending in F<.so>) or autoloaded -subroutine definitions (often ending in F<.al>) associated with the -module. If so, these will be entirely transparent to the user of -the module. It is the responsibility of the F<.pm> file to load -(or arrange to autoload) any additional functionality. For example, -although the POSIX module happens to do both dynamic loading and -autoloading, the user can say just C to get it all. - -=head1 SEE ALSO - -See L for general style issues related to building Perl -modules and classes, as well as descriptions of the standard library -and CPAN, L for how Perl's standard import/export mechanism -works, L and L for an in-depth tutorial on -creating classes, L for a hard-core reference document on -objects, L for an explanation of functions and scoping, -and L and L for more information on writing -extension modules. diff --git a/lib/perl5/5.6.1/pods/perlmodinstall.pod b/lib/perl5/5.6.1/pods/perlmodinstall.pod deleted file mode 100644 index 0fc359e9..00000000 --- a/lib/perl5/5.6.1/pods/perlmodinstall.pod +++ /dev/null @@ -1,486 +0,0 @@ -=head1 NAME - -perlmodinstall - Installing CPAN Modules - -=head1 DESCRIPTION - -You can think of a module as the fundamental unit of reusable Perl -code; See L for details. Whenever anyone creates a chunk -of Perl code that they think will be useful to the world, they -register as a Perl developer at -http://www.perl.com/CPAN/modules/04pause.html so that they can then -upload their code to CPAN. CPAN is the Comprehensive Perl Archive -Network and can be accessed at http://www.perl.com/CPAN/, or searched -via http://cpan.perl.com/ and -http://theory.uwinnipeg.ca/mod_perl/cpan-search.pl . - -This documentation is for people who want to download CPAN modules -and install them on their own computer. - -=head2 PREAMBLE - -You have a file ending in F<.tar.gz> (or, less often, F<.zip>). -You know there's a tasty module inside. You must now take four -steps: - -=over 5 - -=item B the file - -=item B the file into a directory - -=item B the module (sometimes unnecessary) - -=item B the module. - -=back - -Here's how to perform each step for each operating system. This is -I a substitute for reading the README and INSTALL files that -might have come with your module! - -Also note that these instructions are tailored for installing the -module into your system's repository of Perl modules. But you can -install modules into any directory you wish. For instance, where I -say C, you can substitute C to install the modules -into C. Then you can use the modules -from your Perl programs with C or sometimes just C. - -=over 4 - -=item * - -B - -You can use Andreas Koenig's CPAN module -(which comes standard with Perl, or can itself be downloaded -from http://www.perl.com/CPAN/modules/by-module/CPAN) -to automate the following steps, from DECOMPRESS through INSTALL. - -A. DECOMPRESS - -Decompress the file with C - -You can get gzip from ftp://prep.ai.mit.edu/pub/gnu. - -Or, you can combine this step with the next to save disk space: - - gzip -dc yourmodule.tar.gz | tar -xof - - -B. UNPACK - -Unpack the result with C - -C. BUILD - -Go into the newly-created directory and type: - - perl Makefile.PL - make - make test - -D. INSTALL - -While still in that directory, type: - - make install - -Make sure you have appropriate permissions to install the module -in your Perl 5 library directory. Often, you'll need to be root. - -Perl maintains a record of all module installations. To look at -this list, simply type: - - perldoc perllocal - -That's all you need to do on Unix systems with dynamic linking. -Most Unix systems have dynamic linking--if yours doesn't, or if for -another reason you have a statically-linked perl, I the -module requires compilation, you'll need to build a new Perl binary -that includes the module. Again, you'll probably need to be root. - -=item * - -B - - A. DECOMPRESS - -You can use the shareware B program ( http://www.winzip.com ) to -decompress and unpack modules. - - B. UNPACK - -If you used WinZip, this was already done for you. - - C. BUILD - -Does the module require compilation (i.e. does it have files -that end in .xs, .c, .h, .y, .cc, .cxx, or .C)? If it does, you're on -your own. You can try compiling it yourself if you have a C compiler. -If you're successful, consider uploading the resulting binary to -CPAN for others to use. If it doesn't, go to INSTALL. - - D. INSTALL - -Copy the module into your Perl's I directory. That'll be one -of the directories you see when you type - - perl -e 'print "@INC"' - -=item * - -B - - A. DECOMPRESS - -When you download the module, make sure it ends in either -F<.tar.gz> or F<.zip>. Windows browsers sometimes -download C<.tar.gz> files as C<_tar.tar>, because -early versions of Windows prohibited more than one dot in a filename. - -You can use the shareware B program ( http://www.winzip.com ) to -decompress and unpack modules. - -Or, you can use InfoZip's C utility ( -http://www.cdrom.com/pub/infozip/ ) to uncompress C<.zip> files; type -C in your shell. - -Or, if you have a working C and C, you can -type - - gzip -cd yourmodule.tar.gz | tar xvf - - -in the shell to decompress C. This will -UNPACK your module as well. - - B. UNPACK - -The methods in DECOMPRESS will have done this for you. - - C. BUILD - -Go into the newly-created directory and type: - - perl Makefile.PL - dmake - dmake test - -Depending on your perl configuration, C might not be -available. You might have to substitute whatever C says. (Usually, that will be C or -C.) - - D. INSTALL - -While still in that directory, type: - - dmake install - -=item * - -B - -A. DECOMPRESS - -First thing you should do is make sure you have the latest B -distribution ( http://www.cpan.org/authors/id/CNANDOR/ ), which has -utilities for doing all of the steps. Read the cpan-mac directions -carefully and install it. If you choose not to use cpan-mac -for some reason, there are alternatives listed here. - -After installing cpan-mac, drop the module archive on the -B droplet, which will decompress and unpack for you. - -B, you can either use the shareware B program -( http://www.aladdinsys.com/expander/ ) -in combination with B -( http://www.aladdinsys.com/dropstuff/ ) -or the freeware B program ( -http://persephone.cps.unizar.es/general/gente/spd/gzip/gzip.html ). - -B. UNPACK - -If you're using untarzipme or StuffIt, the archive should be extracted -now. B, you can use the freeware B or I ( -http://hyperarchive.lcs.mit.edu/HyperArchive/Archive/cmp/ ). - -C. BUILD - -Check the contents of the distribution. -Read the module's documentation, looking for -reasons why you might have trouble using it with MacPerl. Look for -F<.xs> and F<.c> files, which normally denote that the distribution -must be compiled, and you cannot install it "out of the box." -(See L<"PORTABILITY">.) - -If a module does not work on MacPerl but should, or needs to be -compiled, see if the module exists already as a port on the -MacPerl Module Porters site (http://pudge.net/mmp/). -For more information on doing XS with MacPerl yourself, see -Arved Sandstrom's XS tutorial (http://macperl.com/depts/Tutorials/), -and then consider uploading your binary to the CPAN and -registering it on the MMP site. - -D. INSTALL - -If you are using cpan-mac, just drop the folder on the -B droplet, and use the module. - -B, if you aren't using cpan-mac, do some manual labor. - -Make sure the newlines for the modules are in Mac format, not Unix format. -If they are not then you might have decompressed them incorrectly. Check -your decompression and unpacking utilities settings to make sure they are -translating text files properly. - -As a last resort, you can use the perl one-liner: - - perl -i.bak -pe 's/(?:\015)?\012/\015/g' - -on the source files. - -Then move the files (probably just the F<.pm> files, though there -may be some additional ones, too; check the module documentation) -to their final destination: This will -most likely be in C<$ENV{MACPERL}site_lib:> (i.e., -C). You can add new paths to -the default C<@INC> in the Preferences menu item in the -MacPerl application (C<$ENV{MACPERL}site_lib:> is added -automagically). Create whatever directory structures are required -(i.e., for C, create -C<$ENV{MACPERL}site_lib:Some:> and put -C in that directory). - -Then run the following script (or something like it): - - #!perl -w - use AutoSplit; - my $dir = "${MACPERL}site_perl"; - autosplit("$dir:Some:Module.pm", "$dir:auto", 0, 1, 1); - -=item * - -B - - A. DECOMPRESS - -djtarx ( ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2/ ) -will both uncompress and unpack. - - B. UNPACK - -See above. - - C. BUILD - -Go into the newly-created directory and type: - - perl Makefile.PL - make - make test - -You will need the packages mentioned in F -in the Perl distribution. - - D. INSTALL - -While still in that directory, type: - - make install - -You will need the packages mentioned in F in the Perl distribution. - -=item * - -B - -Get the EMX development suite and gzip/tar, from either Hobbes ( -http://hobbes.nmsu.edu ) or Leo ( http://www.leo.org ), and then follow -the instructions for Unix. - -=item * - -B - -When downloading from CPAN, save your file with a F<.tgz> -extension instead of F<.tar.gz>. All other periods in the -filename should be replaced with underscores. For example, -C should be downloaded as -C. - -A. DECOMPRESS - -Type - - gzip -d Your-Module.tgz - -or, for zipped modules, type - - unzip Your-Module.zip - -Executables for gzip, zip, and VMStar ( Alphas: -http://www.openvms.digital.com/freeware/000TOOLS/ALPHA/ and Vaxen: -http://www.openvms.digital.com/freeware/000TOOLS/VAX/ ). - -gzip and tar -are also available at ftp://ftp.digital.com/pub/VMS. - -Note that GNU's gzip/gunzip is not the same as Info-ZIP's zip/unzip -package. The former is a simple compression tool; the latter permits -creation of multi-file archives. - -B. UNPACK - -If you're using VMStar: - - VMStar xf Your-Module.tar - -Or, if you're fond of VMS command syntax: - - tar/extract/verbose Your_Module.tar - -C. BUILD - -Make sure you have MMS (from Digital) or the freeware MMK ( available from -MadGoat at http://www.madgoat.com ). Then type this to create the -DESCRIP.MMS for the module: - - perl Makefile.PL - -Now you're ready to build: - - mms - mms test - -Substitute C for C above if you're using MMK. - -D. INSTALL - -Type - - mms install - -Substitute C for C above if you're using MMK. - -=item * - -B, - -Introduce the F<.tar.gz> file into an HFS as binary; don't translate from -ASCII to EBCDIC. - -A. DECOMPRESS - - Decompress the file with C - - You can get gzip from - http://www.s390.ibm.com/products/oe/bpxqp1.html. - -B. UNPACK - -Unpack the result with - - pax -o to=IBM-1047,from=ISO8859-1 -r < yourmodule.tar - -The BUILD and INSTALL steps are identical to those for Unix. Some -modules generate Makefiles that work better with GNU make, which is -available from http://www.mks.com/s390/gnu/index.htm. - -=back - - -=head1 PORTABILITY - -Note that not all modules will work with on all platforms. -See L for more information on portability issues. -Read the documentation to see if the module will work on your -system. There are basically three categories -of modules that will not work "out of the box" with all -platforms (with some possibility of overlap): - -=over 4 - -=item * - -B These need to be fixed; consider -contacting the author and possibly writing a patch. - -=item * - -B (These modules contain -F<.xs> or F<.c> files, usually.) You might be able to find -existing binaries on the CPAN or elsewhere, or you might -want to try getting compilers and building it yourself, and then -release the binary for other poor souls to use. - -=item * - -B -(Such as the Win32:: modules.) If the module is targeted -specifically at a platform other than yours, you're out -of luck, most likely. - -=back - - - -Check the CPAN Testers if a module should work with your platform -but it doesn't behave as you'd expect, or you aren't sure whether or -not a module will work under your platform. If the module you want -isn't listed there, you can test it yourself and let CPAN Testers know, -you can join CPAN Testers, or you can request it be tested. - - http://testers.cpan.org/ - - -=head1 HEY - -If you have any suggested changes for this page, let me know. Please -don't send me mail asking for help on how to install your modules. -There are too many modules, and too few Orwants, for me to be able to -answer or even acknowledge all your questions. Contact the module -author instead, or post to comp.lang.perl.modules, or ask someone -familiar with Perl on your operating system. - -=head1 AUTHOR - -Jon Orwant - -orwant@tpj.com - -The Perl Journal, http://tpj.com - -with invaluable help from Brandon Allbery, Charles Bailey, Graham -Barr, Dominic Dunlop, Jarkko Hietaniemi, Ben Holzman, Tom Horsley, -Nick Ing-Simmons, Tuomas J. Lukka, Laszlo Molnar, Chris Nandor, Alan -Olsen, Peter Prymmer, Gurusamy Sarathy, Christoph Spalinger, Dan -Sugalski, Larry Virden, and Ilya Zakharevich. - -First version July 22, 1998 - -Last Modified August 22, 2000 - -=head1 COPYRIGHT - -Copyright (C) 1998, 2000 Jon Orwant. All Rights Reserved. - -Permission is granted to make and distribute verbatim copies of this -documentation provided the copyright notice and this permission notice are -preserved on all copies. - -Permission is granted to copy and distribute modified versions of this -documentation under the conditions for verbatim copying, provided also -that they are marked clearly as modified versions, that the authors' -names and title are unchanged (though subtitles and additional -authors' names may be added), and that the entire resulting derived -work is distributed under the terms of a permission notice identical -to this one. - -Permission is granted to copy and distribute translations of this -documentation into another language, under the above conditions for -modified versions. diff --git a/lib/perl5/5.6.1/pods/perlmodlib.pod b/lib/perl5/5.6.1/pods/perlmodlib.pod deleted file mode 100644 index 90bdb439..00000000 --- a/lib/perl5/5.6.1/pods/perlmodlib.pod +++ /dev/null @@ -1,2042 +0,0 @@ -# Generated by perlmodlib.PL DO NOT EDIT! - -=head1 NAME - -perlmodlib - constructing new Perl modules and finding existing ones - -=head1 DESCRIPTION - -=head1 THE PERL MODULE LIBRARY - -Many modules are included the Perl distribution. These are described -below, and all end in F<.pm>. You may discover compiled library -file (usually ending in F<.so>) or small pieces of modules to be -autoloaded (ending in F<.al>); these were automatically generated -by the installation process. You may also discover files in the -library directory that end in either F<.pl> or F<.ph>. These are -old libraries supplied so that old programs that use them still -run. The F<.pl> files will all eventually be converted into standard -modules, and the F<.ph> files made by B will probably end up -as extension modules made by B. (Some F<.ph> values may -already be available through the POSIX, Errno, or Fcntl modules.) -The B file in the distribution may help in your conversion, -but it's just a mechanical process and therefore far from bulletproof. - -=head2 Pragmatic Modules - -They work somewhat like compiler directives (pragmata) in that they -tend to affect the compilation of your program, and thus will usually -work well only when used within a C, or C. Most of these -are lexically scoped, so an inner BLOCK may countermand them -by saying: - - no integer; - no strict 'refs'; - no warnings; - -which lasts until the end of that BLOCK. - -Some pragmas are lexically scoped--typically those that affect the -C<$^H> hints variable. Others affect the current package instead, -like C and C, which allow you to predeclare a -variables or subroutines within a particular I rather than -just a block. Such declarations are effective for the entire file -for which they were declared. You cannot rescind them with C or C. - -The following pragmas are defined (and have their own documentation). - -=over 12 - -=item attributes - -Get/set subroutine or variable attributes - -=item attrs - -Set/get attributes of a subroutine (deprecated) - -=item autouse - -Postpone load of modules until a function is used - -=item base - -Establish IS-A relationship with base class at compile time - -=item blib - -Use MakeMaker's uninstalled version of a package - -=item bytes - -Force byte semantics rather than character semantics - -=item charnames - -Define character names for C<\N{named}> string literal escape. - -=item constant - -Declare constants - -=item diagnostics - -Perl compiler pragma to force verbose warning diagnostics - -=item fields - -Compile-time class fields - -=item filetest - -Control the filetest permission operators - -=item integer - -Use integer arithmetic instead of floating point - -=item less - -Request less of something from the compiler - -=item lib - -Manipulate @INC at compile time - -=item locale - -Use and avoid POSIX locales for built-in operations - -=item open - -Set default disciplines for input and output - -=item ops - -Restrict unsafe operations when compiling - -=item overload - -Package for overloading perl operations - -=item re - -Alter regular expression behaviour - -=item sigtrap - -Enable simple signal handling - -=item strict - -Restrict unsafe constructs - -=item subs - -Predeclare sub names - -=item utf8 - -Enable/disable UTF-8 in source code - -=item vars - -Predeclare global variable names (obsolete) - -=item warnings - -Control optional warnings - -=item warnings::register - -Warnings import function - -=back - -=head2 Standard Modules - -Standard, bundled modules are all expected to behave in a well-defined -manner with respect to namespace pollution because they use the -Exporter module. See their own documentation for details. - -=over 12 - -=item AnyDBM_File - -Provide framework for multiple DBMs - -=item AutoLoader - -Load subroutines only on demand - -=item AutoSplit - -Split a package for autoloading - -=item B - -The Perl Compiler - -=item B::Asmdata - -Autogenerated data about Perl ops, used to generate bytecode - -=item B::Assembler - -Assemble Perl bytecode - -=item B::Bblock - -Walk basic blocks - -=item B::Bytecode - -Perl compiler's bytecode backend - -=item B::C - -Perl compiler's C backend - -=item B::CC - -Perl compiler's optimized C translation backend - -=item B::Concise - -Walk Perl syntax tree, printing concise info about ops - -=item B::Debug - -Walk Perl syntax tree, printing debug info about ops - -=item B::Deparse - -Perl compiler backend to produce perl code - -=item B::Disassembler - -Disassemble Perl bytecode - -=item B::Lint - -Perl lint - -=item B::Showlex - -Show lexical variables used in functions or files - -=item B::Stackobj - -Helper module for CC backend - -=item B::Stash - -Show what stashes are loaded - -=item B::Terse - -Walk Perl syntax tree, printing terse info about ops - -=item B::Xref - -Generates cross reference reports for Perl programs - -=item Benchmark - -Benchmark running times of Perl code - -=item ByteLoader - -Load byte compiled perl code - -=item CGI - -Simple Common Gateway Interface Class - -=item CGI::Apache - -Backward compatibility module for CGI.pm - -=item CGI::Carp - -CGI routines for writing to the HTTPD (or other) error log - -=item CGI::Cookie - -Interface to Netscape Cookies - -=item CGI::Fast - -CGI Interface for Fast CGI - -=item CGI::Pretty - -Module to produce nicely formatted HTML code - -=item CGI::Push - -Simple Interface to Server Push - -=item CGI::Switch - -Backward compatibility module for defunct CGI::Switch - -=item CGI::Util - -Internal utilities used by CGI module - -=item CPAN - -Query, download and build perl modules from CPAN sites - -=item CPAN::FirstTime - -Utility for CPAN::Config file Initialization - -=item CPAN::Nox - -Wrapper around CPAN.pm without using any XS module - -=item Carp - -Warn of errors (from perspective of caller) - -=item Carp::Heavy - -Carp guts - -=item Class::Struct - -Declare struct-like datatypes as Perl classes - -=item Cwd - -Get pathname of current working directory - -=item DB - -Programmatic interface to the Perl debugging API (draft, subject to - -=item DB_File - -Perl5 access to Berkeley DB version 1.x - -=item Devel::SelfStubber - -Generate stubs for a SelfLoading module - -=item DirHandle - -Supply object methods for directory handles - -=item Dumpvalue - -Provides screen dump of Perl data. - -=item English - -Use nice English (or awk) names for ugly punctuation variables - -=item Env - -Perl module that imports environment variables as scalars or arrays - -=item Exporter - -Implements default import method for modules - -=item Exporter::Heavy - -Exporter guts - -=item ExtUtils::Command - -Utilities to replace common UNIX commands in Makefiles etc. - -=item ExtUtils::Embed - -Utilities for embedding Perl in C/C++ applications - -=item ExtUtils::Install - -Install files from here to there - -=item ExtUtils::Installed - -Inventory management of installed modules - -=item ExtUtils::Liblist - -Determine libraries to use and how to use them - -=item ExtUtils::MM_Cygwin - -Methods to override UN*X behaviour in ExtUtils::MakeMaker - -=item ExtUtils::MM_OS2 - -Methods to override UN*X behaviour in ExtUtils::MakeMaker - -=item ExtUtils::MM_Unix - -Methods used by ExtUtils::MakeMaker - -=item ExtUtils::MM_VMS - -Methods to override UN*X behaviour in ExtUtils::MakeMaker - -=item ExtUtils::MM_Win32 - -Methods to override UN*X behaviour in ExtUtils::MakeMaker - -=item ExtUtils::MakeMaker - -Create an extension Makefile - -=item ExtUtils::Manifest - -Utilities to write and check a MANIFEST file - -=item ExtUtils::Mkbootstrap - -Make a bootstrap file for use by DynaLoader - -=item ExtUtils::Mksymlists - -Write linker options files for dynamic extension - -=item ExtUtils::Packlist - -Manage .packlist files - -=item ExtUtils::testlib - -Add blib/* directories to @INC - -=item Fatal - -Replace functions with equivalents which succeed or die - -=item Fcntl - -Load the C Fcntl.h defines - -=item File::Basename - -Split a pathname into pieces - -=item File::CheckTree - -Run many filetest checks on a tree - -=item File::Compare - -Compare files or filehandles - -=item File::Copy - -Copy files or filehandles - -=item File::DosGlob - -DOS like globbing and then some - -=item File::Find - -Traverse a file tree - -=item File::Path - -Create or remove directory trees - -=item File::Spec - -Portably perform operations on file names - -=item File::Spec::Epoc - -Methods for Epoc file specs - -=item File::Spec::Functions - -Portably perform operations on file names - -=item File::Spec::Mac - -File::Spec for MacOS - -=item File::Spec::OS2 - -Methods for OS/2 file specs - -=item File::Spec::Unix - -Methods used by File::Spec - -=item File::Spec::VMS - -Methods for VMS file specs - -=item File::Spec::Win32 - -Methods for Win32 file specs - -=item File::Temp - -Return name and handle of a temporary file safely - -=item File::stat - -By-name interface to Perl's built-in stat() functions - -=item FileCache - -Keep more files open than the system permits - -=item FileHandle - -Supply object methods for filehandles - -=item FindBin - -Locate directory of original perl script - -=item GDBM_File - -Perl5 access to the gdbm library. - -=item Getopt::Long - -Extended processing of command line options - -=item Getopt::Std - -Process single-character switches with switch clustering - -=item I18N::Collate - -Compare 8-bit scalar data according to the current locale - -=item IO - -Load various IO modules - -=item IPC::Open2 - -Open a process for both reading and writing - -=item IPC::Open3 - -Open a process for reading, writing, and error handling - -=item Math::BigFloat - -Arbitrary length float math package - -=item Math::BigInt - -Arbitrary size integer math package - -=item Math::Complex - -Complex numbers and associated mathematical functions - -=item Math::Trig - -Trigonometric functions - -=item Net::Ping - -Check a remote host for reachability - -=item Net::hostent - -By-name interface to Perl's built-in gethost*() functions - -=item Net::netent - -By-name interface to Perl's built-in getnet*() functions - -=item Net::protoent - -By-name interface to Perl's built-in getproto*() functions - -=item Net::servent - -By-name interface to Perl's built-in getserv*() functions - -=item O - -Generic interface to Perl Compiler backends - -=item Opcode - -Disable named opcodes when compiling perl code - -=item POSIX - -Perl interface to IEEE Std 1003.1 - -=item Pod::Checker - -Check pod documents for syntax errors - -=item Pod::Find - -Find POD documents in directory trees - -=item Pod::Html - -Module to convert pod files to HTML - -=item Pod::InputObjects - -Objects representing POD input paragraphs, commands, etc. - -=item Pod::LaTeX - -Convert Pod data to formatted Latex - -=item Pod::Man - -Convert POD data to formatted *roff input - -=item Pod::ParseUtils - -Helpers for POD parsing and conversion - -=item Pod::Parser - -Base class for creating POD filters and translators - -=item Pod::Plainer - -Perl extension for converting Pod to old style Pod. - -=item Pod::Select - -Extract selected sections of POD from input - -=item Pod::Text - -Convert POD data to formatted ASCII text - -=item Pod::Text::Color - -Convert POD data to formatted color ASCII text - -=item Pod::Text::Overstrike - -Convert POD data to formatted overstrike text - -=item Pod::Text::Termcap - -Convert POD data to ASCII text with format escapes - -=item Pod::Usage - -Print a usage message from embedded pod documentation - -=item SDBM_File - -Tied access to sdbm files - -=item Safe - -Compile and execute code in restricted compartments - -=item Search::Dict - -Search for key in dictionary file - -=item SelectSaver - -Save and restore selected file handle - -=item SelfLoader - -Load functions only on demand - -=item Shell - -Run shell commands transparently within perl - -=item Socket - -Load the C socket.h defines and structure manipulators - -=item Symbol - -Manipulate Perl symbols and their names - -=item Term::ANSIColor - -Color screen output using ANSI escape sequences - -=item Term::Cap - -Perl termcap interface - -=item Term::Complete - -Perl word completion module - -=item Term::ReadLine - -Perl interface to various C packages. If - -=item Test - -Provides a simple framework for writing test scripts - -=item Test::Harness - -Run perl standard test scripts with statistics - -=item Text::Abbrev - -Create an abbreviation table from a list - -=item Text::ParseWords - -Parse text into an array of tokens or array of arrays - -=item Text::Soundex - -Implementation of the Soundex Algorithm as Described by Knuth - -=item Text::Tabs - -Expand and unexpand tabs per the unix expand(1) and unexpand(1) - -=item Text::Wrap - -Line wrapping to form simple paragraphs - -=item Thread - -Manipulate threads in Perl (EXPERIMENTAL, subject to change) - -=item Thread::Queue - -Thread-safe queues - -=item Thread::Semaphore - -Thread-safe semaphores - -=item Thread::Signal - -Start a thread which runs signal handlers reliably - -=item Thread::Specific - -Thread-specific keys - -=item Tie::Array - -Base class for tied arrays - -=item Tie::Handle - -Base class definitions for tied handles - -=item Tie::Hash - -Base class definitions for tied hashes - -=item Tie::RefHash - -Use references as hash keys - -=item Tie::Scalar - -Base class definitions for tied scalars - -=item Tie::SubstrHash - -Fixed-table-size, fixed-key-length hashing - -=item Time::Local - -Efficiently compute time from local and GMT time - -=item Time::gmtime - -By-name interface to Perl's built-in gmtime() function - -=item Time::localtime - -By-name interface to Perl's built-in localtime() function - -=item Time::tm - -Internal object used by Time::gmtime and Time::localtime - -=item UNIVERSAL - -Base class for ALL classes (blessed references) - -=item User::grent - -By-name interface to Perl's built-in getgr*() functions - -=item User::pwent - -By-name interface to Perl's built-in getpw*() functions - -=item Win32 - -Interfaces to some Win32 API Functions - -=back - -To find out I modules installed on your system, including -those without documentation or outside the standard release, -just do this: - - % find `perl -e 'print "@INC"'` -name '*.pm' -print - -They should all have their own documentation installed and accessible -via your system man(1) command. If you do not have a B -program, you can use the Perl B program instead, which -generates Perl code as output you can run through perl. If you -have a B program but it doesn't find your modules, you'll have -to fix your manpath. See L for details. If you have no -system B command, you might try the B program. - -=head2 Extension Modules - -Extension modules are written in C (or a mix of Perl and C). They -are usually dynamically loaded into Perl if and when you need them, -but may also be be linked in statically. Supported extension modules -include Socket, Fcntl, and POSIX. - -Many popular C extension modules do not come bundled (at least, not -completely) due to their sizes, volatility, or simply lack of time -for adequate testing and configuration across the multitude of -platforms on which Perl was beta-tested. You are encouraged to -look for them on CPAN (described below), or using web search engines -like Alta Vista or Deja News. - -=head1 CPAN - -CPAN stands for Comprehensive Perl Archive Network; it's a globally -replicated trove of Perl materials, including documentation, style -guides, tricks and traps, alternate ports to non-Unix systems and -occasional binary distributions for these. Search engines for -CPAN can be found at http://cpan.perl.com/ and at -http://theory.uwinnipeg.ca/mod_perl/cpan-search.pl . - -Most importantly, CPAN includes around a thousand unbundled modules, -some of which require a C compiler to build. Major categories of -modules are: - -=over - -=item * - -Language Extensions and Documentation Tools - -=item * - -Development Support - -=item * - -Operating System Interfaces - -=item * - -Networking, Device Control (modems) and InterProcess Communication - -=item * - -Data Types and Data Type Utilities - -=item * - -Database Interfaces - -=item * - -User Interfaces - -=item * - -Interfaces to / Emulations of Other Programming Languages - -=item * - -File Names, File Systems and File Locking (see also File Handles) - -=item * - -String Processing, Language Text Processing, Parsing, and Searching - -=item * - -Option, Argument, Parameter, and Configuration File Processing - -=item * - -Internationalization and Locale - -=item * - -Authentication, Security, and Encryption - -=item * - -World Wide Web, HTML, HTTP, CGI, MIME - -=item * - -Server and Daemon Utilities - -=item * - -Archiving and Compression - -=item * - -Images, Pixmap and Bitmap Manipulation, Drawing, and Graphing - -=item * - -Mail and Usenet News - -=item * - -Control Flow Utilities (callbacks and exceptions etc) - -=item * - -File Handle and Input/Output Stream Utilities - -=item * - -Miscellaneous Modules - -=back - -Registered CPAN sites as of this writing include the following. -You should try to choose one close to you: - -=head2 Africa - -=over 4 - -=item * - -South Africa - - ftp://ftp.is.co.za/programming/perl/CPAN/ - ftp://ftp.saix.net/pub/CPAN/ - ftp://ftpza.co.za/pub/mirrors/cpan/ - ftp://ftp.sun.ac.za/CPAN/ - -=back - -=head2 Asia - -=over 4 - -=item * - -China - - ftp://freesoft.cei.gov.cn/pub/languages/perl/CPAN/ - http://www2.linuxforum.net/mirror/CPAN/ - http://cpan.shellhung.org/ - ftp://ftp.shellhung.org/pub/CPAN - -=item * - -Hong Kong - - http://CPAN.pacific.net.hk/ - ftp://ftp.pacific.net.hk/pub/mirror/CPAN/ - -=item * - -Indonesia - - http://piksi.itb.ac.id/CPAN/ - ftp://mirrors.piksi.itb.ac.id/CPAN/ - http://CPAN.mweb.co.id/ - ftp://ftp.mweb.co.id/pub/languages/perl/CPAN/ - -=item * - -Israel - - http://www.iglu.org.il:/pub/CPAN/ - ftp://ftp.iglu.org.il/pub/CPAN/ - http://bioinfo.weizmann.ac.il/pub/software/perl/CPAN/ - ftp://bioinfo.weizmann.ac.il/pub/software/perl/CPAN/ - -=item * - -Japan - - ftp://ftp.u-aizu.ac.jp/pub/lang/perl/CPAN/ - ftp://ftp.kddlabs.co.jp/CPAN/ - http://mirror.nucba.ac.jp/mirror/Perl/ - ftp://mirror.nucba.ac.jp/mirror/Perl/ - ftp://ftp.meisei-u.ac.jp/pub/CPAN/ - ftp://ftp.jaist.ac.jp/pub/lang/perl/CPAN/ - ftp://ftp.dti.ad.jp/pub/lang/CPAN/ - ftp://ftp.ring.gr.jp/pub/lang/perl/CPAN/ - -=item * - -Saudi Arabia - - ftp://ftp.isu.net.sa/pub/CPAN/ - -=item * - -Singapore - - http://cpan.hjc.edu.sg - http://ftp.nus.edu.sg/unix/perl/CPAN/ - ftp://ftp.nus.edu.sg/pub/unix/perl/CPAN/ - -=item * - -South Korea - - http://CPAN.bora.net/ - ftp://ftp.bora.net/pub/CPAN/ - http://ftp.kornet.net/CPAN/ - ftp://ftp.kornet.net/pub/CPAN/ - ftp://ftp.nuri.net/pub/CPAN/ - -=item * - -Taiwan - - ftp://coda.nctu.edu.tw/UNIX/perl/CPAN - ftp://ftp.ee.ncku.edu.tw/pub/perl/CPAN/ - ftp://ftp1.sinica.edu.tw/pub1/perl/CPAN/ - -=item * - -Thailand - - http://download.nectec.or.th/CPAN/ - ftp://ftp.nectec.or.th/pub/languages/CPAN/ - ftp://ftp.cs.riubon.ac.th/pub/mirrors/CPAN/ - -=back - -=head2 Central America - -=over 4 - -=item * - -Costa Rica - - ftp://ftp.linux.co.cr/mirrors/CPAN/ - http://ftp.ucr.ac.cr/Unix/CPAN/ - ftp://ftp.ucr.ac.cr/pub/Unix/CPAN/ - -=back - -=head2 Europe - -=over 4 - -=item * - -Austria - - ftp://ftp.tuwien.ac.at/pub/languages/perl/CPAN/ - -=item * - -Belgium - - http://ftp.easynet.be/CPAN/ - ftp://ftp.easynet.be/CPAN/ - ftp://ftp.kulnet.kuleuven.ac.be/pub/mirror/CPAN/ - -=item * - -Bulgaria - - ftp://ftp.ntrl.net/pub/mirrors/CPAN/ - -=item * - -Croatia - - ftp://ftp.linux.hr/pub/CPAN/ - -=item * - -Czech Republic - - http://www.fi.muni.cz/pub/perl/ - ftp://ftp.fi.muni.cz/pub/perl/ - ftp://sunsite.mff.cuni.cz/MIRRORS/ftp.funet.fi/pub/languages/perl/CPAN/ - -=item * - -Denmark - - ftp://sunsite.auc.dk/pub/languages/perl/CPAN/ - http://www.cpan.dk/CPAN/ - ftp://www.cpan.dk/ftp.cpan.org/CPAN/ - -=item * - -England - - http://www.mirror.ac.uk/sites/ftp.funet.fi/pub/languages/perl/CPAN - ftp://ftp.mirror.ac.uk/sites/ftp.funet.fi/pub/languages/perl/CPAN/ - ftp://ftp.demon.co.uk/pub/mirrors/perl/CPAN/ - ftp://ftp.flirble.org/pub/languages/perl/CPAN/ - ftp://ftp.plig.org/pub/CPAN/ - ftp://sunsite.doc.ic.ac.uk/packages/CPAN/ - http://mirror.uklinux.net/CPAN/ - ftp://mirror.uklinux.net/pub/CPAN/ - ftp://usit.shef.ac.uk/pub/packages/CPAN/ - -=item * - -Estonia - - ftp://ftp.ut.ee/pub/languages/perl/CPAN/ - -=item * - -Finland - - ftp://ftp.funet.fi/pub/languages/perl/CPAN/ - -=item * - -France - - ftp://cpan.ftp.worldonline.fr/pub/CPAN/ - ftp://ftp.club-internet.fr/pub/perl/CPAN/ - ftp://ftp.lip6.fr/pub/perl/CPAN/ - ftp://ftp.oleane.net/pub/mirrors/CPAN/ - ftp://ftp.pasteur.fr/pub/computing/CPAN/ - ftp://cpan.cict.fr/pub/CPAN/ - ftp://ftp.uvsq.fr/pub/perl/CPAN/ - -=item * - -Germany - - ftp://ftp.rz.ruhr-uni-bochum.de/pub/CPAN/ - ftp://ftp.freenet.de/pub/ftp.cpan.org/pub/CPAN/ - ftp://ftp.uni-erlangen.de/pub/source/CPAN/ - ftp://ftp-stud.fht-esslingen.de/pub/Mirrors/CPAN - ftp://ftp.gigabell.net/pub/CPAN/ - http://ftp.gwdg.de/pub/languages/perl/CPAN/ - ftp://ftp.gwdg.de/pub/languages/perl/CPAN/ - ftp://ftp.uni-hamburg.de/pub/soft/lang/perl/CPAN/ - ftp://ftp.leo.org/pub/comp/general/programming/languages/script/perl/CPAN/ - ftp://ftp.mpi-sb.mpg.de/pub/perl/CPAN/ - ftp://ftp.gmd.de/mirrors/CPAN/ - -=item * - -Greece - - ftp://ftp.forthnet.gr/pub/languages/perl/CPAN - ftp://ftp.ntua.gr/pub/lang/perl/ - -=item * - -Hungary - - http://cpan.artifact.hu/ - ftp://cpan.artifact.hu/CPAN/ - ftp://ftp.kfki.hu/pub/packages/perl/CPAN/ - -=item * - -Iceland - - http://cpan.gm.is/ - ftp://ftp.gm.is/pub/CPAN/ - -=item * - -Ireland - - http://cpan.indigo.ie/ - ftp://cpan.indigo.ie/pub/CPAN/ - http://sunsite.compapp.dcu.ie/pub/perl/ - ftp://sunsite.compapp.dcu.ie/pub/perl/ - -=item * - -Italy - - http://cpan.nettuno.it/ - http://gusp.dyndns.org/CPAN/ - ftp://gusp.dyndns.org/pub/CPAN - http://softcity.iol.it/cpan - ftp://softcity.iol.it/pub/cpan - ftp://ftp.unina.it/pub/Other/CPAN/ - ftp://ftp.unipi.it/pub/mirror/perl/CPAN/ - ftp://cis.uniRoma2.it/CPAN/ - ftp://ftp.edisontel.it/pub/CPAN_Mirror/ - ftp://ftp.flashnet.it/pub/CPAN/ - -=item * - -Latvia - - http://kvin.lv/pub/CPAN/ - -=item * - -Netherlands - - ftp://download.xs4all.nl/pub/mirror/CPAN/ - ftp://ftp.nl.uu.net/pub/CPAN/ - ftp://ftp.nluug.nl/pub/languages/perl/CPAN/ - ftp://ftp.cpan.nl/pub/CPAN/ - http://www.cs.uu.nl/mirror/CPAN/ - ftp://ftp.cs.uu.nl/mirror/CPAN/ - -=item * - -Norway - - ftp://sunsite.uio.no/pub/languages/perl/CPAN/ - ftp://ftp.uit.no/pub/languages/perl/cpan/ - -=item * - -Poland - - ftp://ftp.pk.edu.pl/pub/lang/perl/CPAN/ - ftp://ftp.mega.net.pl/pub/mirrors/ftp.perl.com/ - ftp://ftp.man.torun.pl/pub/doc/CPAN/ - ftp://sunsite.icm.edu.pl/pub/CPAN/ - -=item * - -Portugal - - ftp://ftp.ua.pt/pub/CPAN/ - ftp://perl.di.uminho.pt/pub/CPAN/ - ftp://ftp.ist.utl.pt/pub/CPAN/ - ftp://ftp.netc.pt/pub/CPAN/ - -=item * - -Romania - - ftp://archive.logicnet.ro/mirrors/ftp.cpan.org/CPAN/ - ftp://ftp.kappa.ro/pub/mirrors/ftp.perl.org/pub/CPAN/ - ftp://ftp.dntis.ro/pub/cpan/ - ftp://ftp.opsynet.com/cpan/ - ftp://ftp.dnttm.ro/pub/CPAN/ - ftp://ftp.timisoara.roedu.net/mirrors/CPAN/ - -=item * - -Russia - - ftp://ftp.chg.ru/pub/lang/perl/CPAN/ - http://cpan.rinet.ru/ - ftp://cpan.rinet.ru/pub/mirror/CPAN/ - ftp://ftp.aha.ru/pub/CPAN/ - ftp://ftp.sai.msu.su/pub/lang/perl/CPAN/ - -=item * - -Slovakia - - ftp://ftp.entry.sk/pub/languages/perl/CPAN/ - -=item * - -Slovenia - - ftp://ftp.arnes.si/software/perl/CPAN/ - -=item * - -Spain - - ftp://ftp.rediris.es/mirror/CPAN/ - ftp://ftp.etse.urv.es/pub/perl/ - -=item * - -Sweden - - http://ftp.du.se/CPAN/ - ftp://ftp.du.se/pub/CPAN/ - ftp://ftp.sunet.se/pub/lang/perl/CPAN/ - -=item * - -Switzerland - - ftp://ftp.danyk.ch/CPAN/ - ftp://sunsite.cnlab-switch.ch/mirror/CPAN/ - -=item * - -Turkey - - ftp://sunsite.bilkent.edu.tr/pub/languages/CPAN/ - -=back - -=head2 North America - -=over 4 - -=item * - -Canada - -=over 8 - -=item * - -Alberta - - http://sunsite.ualberta.ca/pub/Mirror/CPAN/ - ftp://sunsite.ualberta.ca/pub/Mirror/CPAN/ - -=item * - -Manitoba - - http://theoryx5.uwinnipeg.ca/pub/CPAN/ - ftp://theoryx5.uwinnipeg.ca/pub/CPAN/ - -=item * - -Nova Scotia - - ftp://cpan.chebucto.ns.ca/pub/CPAN/ - -=item * - -Ontario - - ftp://ftp.crc.ca/pub/packages/lang/perl/CPAN/ - -=item * - -Mexico - - http://www.msg.com.mx/CPAN/ - ftp://ftp.msg.com.mx/pub/CPAN/ - -=back - -=item * - -United States - -=over 8 - -=item * - -Alabama - - http://mirror.hiwaay.net/CPAN/ - ftp://mirror.hiwaay.net/CPAN/ - -=item * - -California - - http://www.cpan.org/ - ftp://ftp.cpan.org/CPAN/ - ftp://cpan.nas.nasa.gov/pub/perl/CPAN/ - ftp://ftp.digital.com/pub/plan/perl/CPAN/ - http://www.kernel.org/pub/mirrors/cpan/ - ftp://ftp.kernel.org/pub/mirrors/cpan/ - http://www.perl.com/CPAN/ - http://download.sourceforge.net/mirrors/CPAN/ - -=item * - -Colorado - - ftp://ftp.cs.colorado.edu/pub/perl/CPAN/ - -=item * - -Florida - - ftp://ftp.cise.ufl.edu/pub/perl/CPAN/ - -=item * - -Georgia - - ftp://ftp.twoguys.org/CPAN/ - -=item * - -Illinois - - http://www.neurogames.com/mirrors/CPAN - http://uiarchive.uiuc.edu/mirrors/ftp/ftp.cpan.org/pub/CPAN/ - ftp://uiarchive.uiuc.edu/mirrors/ftp/ftp.cpan.org/pub/CPAN/ - -=item * - -Indiana - - ftp://ftp.uwsg.indiana.edu/pub/perl/CPAN/ - http://cpan.nitco.com/ - ftp://cpan.nitco.com/pub/CPAN/ - ftp://cpan.in-span.net/ - http://csociety-ftp.ecn.purdue.edu/pub/CPAN - ftp://csociety-ftp.ecn.purdue.edu/pub/CPAN - -=item * - -Kentucky - - http://cpan.uky.edu/ - ftp://cpan.uky.edu/pub/CPAN/ - -=item * - -Massachusetts - - ftp://ftp.ccs.neu.edu/net/mirrors/ftp.funet.fi/pub/languages/perl/CPAN/ - ftp://ftp.iguide.com/pub/mirrors/packages/perl/CPAN/ - -=item * - -New Jersey - - ftp://ftp.cpanel.net/pub/CPAN/ - -=item * - -New York - - ftp://ftp.freesoftware.com/pub/perl/CPAN/ - http://www.deao.net/mirrors/CPAN/ - ftp://ftp.deao.net/pub/CPAN/ - ftp://ftp.stealth.net/pub/mirrors/ftp.cpan.org/pub/CPAN/ - http://mirror.nyc.anidea.com/CPAN/ - ftp://mirror.nyc.anidea.com/pub/CPAN/ - http://www.rge.com/pub/languages/perl/ - ftp://ftp.rge.com/pub/languages/perl/ - ftp://mirrors.cloud9.net/pub/mirrors/CPAN/ - -=item * - -North Carolina - - ftp://ftp.duke.edu/pub/perl/ - -=item * - -Ohio - - ftp://ftp.loaded.net/pub/CPAN/ - -=item * - -Oklahoma - - ftp://ftp.ou.edu/mirrors/CPAN/ - -=item * - -Oregon - - ftp://ftp.orst.edu/pub/packages/CPAN/ - -=item * - -Pennsylvania - - http://ftp.epix.net/CPAN/ - ftp://ftp.epix.net/pub/languages/perl/ - ftp://carroll.cac.psu.edu/pub/CPAN/ - -=item * - -Tennessee - - ftp://ftp.sunsite.utk.edu/pub/CPAN/ - -=item * - -Texas - - http://ftp.sedl.org/pub/mirrors/CPAN/ - http://jhcloos.com/pub/mirror/CPAN/ - ftp://jhcloos.com/pub/mirror/CPAN/ - -=item * - -Utah - - ftp://mirror.xmission.com/CPAN/ - -=item * - -Virginia - - http://mirrors.rcn.net/pub/lang/CPAN/ - ftp://mirrors.rcn.net/pub/lang/CPAN/ - ftp://ruff.cs.jmu.edu/pub/CPAN/ - http://perl.Liquidation.com/CPAN/ - -=item * - -Washington - - http://cpan.llarian.net/ - ftp://cpan.llarian.net/pub/CPAN/ - ftp://ftp-mirror.internap.com/pub/CPAN/ - ftp://ftp.spu.edu/pub/CPAN/ - -=back - -=back - -=head2 Oceania - -=over 4 - -=item * - -Australia - - http://ftp.planetmirror.com/pub/CPAN/ - ftp://ftp.planetmirror.com/pub/CPAN/ - ftp://mirror.aarnet.edu.au/pub/perl/CPAN/ - ftp://cpan.topend.com.au/pub/CPAN/ - -=item * - -New Zealand - - ftp://ftp.auckland.ac.nz/pub/perl/CPAN/ - -=back - -=head2 South America - -=over 4 - -=item * - -Argentina - - ftp://mirrors.bannerlandia.com.ar/mirrors/CPAN/ - -=item * - -Brazil - - ftp://cpan.pop-mg.com.br/pub/CPAN/ - ftp://ftp.matrix.com.br/pub/perl/ - ftp://cpan.if.usp.br/pub/mirror/CPAN/ - -=item * - -Chile - - ftp://ftp.psinet.cl/pub/programming/perl/CPAN/ - ftp://sunsite.dcc.uchile.cl/pub/lang/perl/ - -=back - -For an up-to-date listing of CPAN sites, -see http://www.cpan.org/SITES or ftp://www.cpan.org/SITES . - -=head1 Modules: Creation, Use, and Abuse - -(The following section is borrowed directly from Tim Bunce's modules -file, available at your nearest CPAN site.) - -Perl implements a class using a package, but the presence of a -package doesn't imply the presence of a class. A package is just a -namespace. A class is a package that provides subroutines that can be -used as methods. A method is just a subroutine that expects, as its -first argument, either the name of a package (for "static" methods), -or a reference to something (for "virtual" methods). - -A module is a file that (by convention) provides a class of the same -name (sans the .pm), plus an import method in that class that can be -called to fetch exported symbols. This module may implement some of -its methods by loading dynamic C or C++ objects, but that should be -totally transparent to the user of the module. Likewise, the module -might set up an AUTOLOAD function to slurp in subroutine definitions on -demand, but this is also transparent. Only the F<.pm> file is required to -exist. See L, L, and L for details about -the AUTOLOAD mechanism. - -=head2 Guidelines for Module Creation - -=over 4 - -=item * - -Do similar modules already exist in some form? - -If so, please try to reuse the existing modules either in whole or -by inheriting useful features into a new class. If this is not -practical try to get together with the module authors to work on -extending or enhancing the functionality of the existing modules. -A perfect example is the plethora of packages in perl4 for dealing -with command line options. - -If you are writing a module to expand an already existing set of -modules, please coordinate with the author of the package. It -helps if you follow the same naming scheme and module interaction -scheme as the original author. - -=item * - -Try to design the new module to be easy to extend and reuse. - -Try to C (or C). -Remember that you can add C to individual blocks -of code that need less warnings. - -Use blessed references. Use the two argument form of bless to bless -into the class name given as the first parameter of the constructor, -e.g.,: - - sub new { - my $class = shift; - return bless {}, $class; - } - -or even this if you'd like it to be used as either a static -or a virtual method. - - sub new { - my $self = shift; - my $class = ref($self) || $self; - return bless {}, $class; - } - -Pass arrays as references so more parameters can be added later -(it's also faster). Convert functions into methods where -appropriate. Split large methods into smaller more flexible ones. -Inherit methods from other modules if appropriate. - -Avoid class name tests like: C. -Generally you can delete the C part with no harm at all. -Let the objects look after themselves! Generally, avoid hard-wired -class names as far as possible. - -Avoid C<< $r->Class::func() >> where using C<@ISA=qw(... Class ...)> and -C<< $r->func() >> would work (see L for more details). - -Use autosplit so little used or newly added functions won't be a -burden to programs that don't use them. Add test functions to -the module after __END__ either using AutoSplit or by saying: - - eval join('',) || die $@ unless caller(); - -Does your module pass the 'empty subclass' test? If you say -C<@SUBCLASS::ISA = qw(YOURCLASS);> your applications should be able -to use SUBCLASS in exactly the same way as YOURCLASS. For example, -does your application still work if you change: C<$obj = new YOURCLASS;> -into: C<$obj = new SUBCLASS;> ? - -Avoid keeping any state information in your packages. It makes it -difficult for multiple other packages to use yours. Keep state -information in objects. - -Always use B<-w>. - -Try to C (or C). -Remember that you can add C to individual blocks -of code that need less strictness. - -Always use B<-w>. - -Follow the guidelines in the perlstyle(1) manual. - -Always use B<-w>. - -=item * - -Some simple style guidelines - -The perlstyle manual supplied with Perl has many helpful points. - -Coding style is a matter of personal taste. Many people evolve their -style over several years as they learn what helps them write and -maintain good code. Here's one set of assorted suggestions that -seem to be widely used by experienced developers: - -Use underscores to separate words. It is generally easier to read -$var_names_like_this than $VarNamesLikeThis, especially for -non-native speakers of English. It's also a simple rule that works -consistently with VAR_NAMES_LIKE_THIS. - -Package/Module names are an exception to this rule. Perl informally -reserves lowercase module names for 'pragma' modules like integer -and strict. Other modules normally begin with a capital letter and -use mixed case with no underscores (need to be short and portable). - -You may find it helpful to use letter case to indicate the scope -or nature of a variable. For example: - - $ALL_CAPS_HERE constants only (beware clashes with Perl vars) - $Some_Caps_Here package-wide global/static - $no_caps_here function scope my() or local() variables - -Function and method names seem to work best as all lowercase. -e.g., C<< $obj->as_string() >>. - -You can use a leading underscore to indicate that a variable or -function should not be used outside the package that defined it. - -=item * - -Select what to export. - -Do NOT export method names! - -Do NOT export anything else by default without a good reason! - -Exports pollute the namespace of the module user. If you must -export try to use @EXPORT_OK in preference to @EXPORT and avoid -short or common names to reduce the risk of name clashes. - -Generally anything not exported is still accessible from outside the -module using the ModuleName::item_name (or C<< $blessed_ref->method >>) -syntax. By convention you can use a leading underscore on names to -indicate informally that they are 'internal' and not for public use. - -(It is actually possible to get private functions by saying: -C. But there's no way to call that -directly as a method, because a method must have a name in the symbol -table.) - -As a general rule, if the module is trying to be object oriented -then export nothing. If it's just a collection of functions then -@EXPORT_OK anything but use @EXPORT with caution. - -=item * - -Select a name for the module. - -This name should be as descriptive, accurate, and complete as -possible. Avoid any risk of ambiguity. Always try to use two or -more whole words. Generally the name should reflect what is special -about what the module does rather than how it does it. Please use -nested module names to group informally or categorize a module. -There should be a very good reason for a module not to have a nested name. -Module names should begin with a capital letter. - -Having 57 modules all called Sort will not make life easy for anyone -(though having 23 called Sort::Quick is only marginally better :-). -Imagine someone trying to install your module alongside many others. -If in any doubt ask for suggestions in comp.lang.perl.misc. - -If you are developing a suite of related modules/classes it's good -practice to use nested classes with a common prefix as this will -avoid namespace clashes. For example: Xyz::Control, Xyz::View, -Xyz::Model etc. Use the modules in this list as a naming guide. - -If adding a new module to a set, follow the original author's -standards for naming modules and the interface to methods in -those modules. - -If developing modules for private internal or project specific use, -that will never be released to the public, then you should ensure -that their names will not clash with any future public module. You -can do this either by using the reserved Local::* category or by -using a category name that includes an underscore like Foo_Corp::*. - -To be portable each component of a module name should be limited to -11 characters. If it might be used on MS-DOS then try to ensure each is -unique in the first 8 characters. Nested modules make this easier. - -=item * - -Have you got it right? - -How do you know that you've made the right decisions? Have you -picked an interface design that will cause problems later? Have -you picked the most appropriate name? Do you have any questions? - -The best way to know for sure, and pick up many helpful suggestions, -is to ask someone who knows. Comp.lang.perl.misc is read by just about -all the people who develop modules and it's the best place to ask. - -All you need to do is post a short summary of the module, its -purpose and interfaces. A few lines on each of the main methods is -probably enough. (If you post the whole module it might be ignored -by busy people - generally the very people you want to read it!) - -Don't worry about posting if you can't say when the module will be -ready - just say so in the message. It might be worth inviting -others to help you, they may be able to complete it for you! - -=item * - -README and other Additional Files. - -It's well known that software developers usually fully document the -software they write. If, however, the world is in urgent need of -your software and there is not enough time to write the full -documentation please at least provide a README file containing: - -=over 10 - -=item * - -A description of the module/package/extension etc. - -=item * - -A copyright notice - see below. - -=item * - -Prerequisites - what else you may need to have. - -=item * - -How to build it - possible changes to Makefile.PL etc. - -=item * - -How to install it. - -=item * - -Recent changes in this release, especially incompatibilities - -=item * - -Changes / enhancements you plan to make in the future. - -=back - -If the README file seems to be getting too large you may wish to -split out some of the sections into separate files: INSTALL, -Copying, ToDo etc. - -=over 4 - -=item Adding a Copyright Notice. - - -How you choose to license your work is a personal decision. -The general mechanism is to assert your Copyright and then make -a declaration of how others may copy/use/modify your work. - -Perl, for example, is supplied with two types of licence: The GNU -GPL and The Artistic Licence (see the files README, Copying, and -Artistic). Larry has good reasons for NOT just using the GNU GPL. - -My personal recommendation, out of respect for Larry, Perl, and the -Perl community at large is to state something simply like: - - Copyright (c) 1995 Your Name. All rights reserved. - This program is free software; you can redistribute it and/or - modify it under the same terms as Perl itself. - -This statement should at least appear in the README file. You may -also wish to include it in a Copying file and your source files. -Remember to include the other words in addition to the Copyright. - -=item * - -Give the module a version/issue/release number. - -To be fully compatible with the Exporter and MakeMaker modules you -should store your module's version number in a non-my package -variable called $VERSION. This should be a floating point -number with at least two digits after the decimal (i.e., hundredths, -e.g, C<$VERSION = "0.01">). Don't use a "1.3.2" style version. -See L for details. - -It may be handy to add a function or method to retrieve the number. -Use the number in announcements and archive file names when -releasing the module (ModuleName-1.02.tar.Z). -See perldoc ExtUtils::MakeMaker.pm for details. - -=item * - -How to release and distribute a module. - -It's good idea to post an announcement of the availability of your -module (or the module itself if small) to the comp.lang.perl.announce -Usenet newsgroup. This will at least ensure very wide once-off -distribution. - -If possible, register the module with CPAN. You should -include details of its location in your announcement. - -Some notes about ftp archives: Please use a long descriptive file -name that includes the version number. Most incoming directories -will not be readable/listable, i.e., you won't be able to see your -file after uploading it. Remember to send your email notification -message as soon as possible after uploading else your file may get -deleted automatically. Allow time for the file to be processed -and/or check the file has been processed before announcing its -location. - -FTP Archives for Perl Modules: - -Follow the instructions and links on: - - http://www.cpan.org/modules/00modlist.long.html - http://www.cpan.org/modules/04pause.html - -or upload to one of these sites: - - https://pause.kbx.de/pause/ - http://pause.perl.org/pause/ - -and notify . - -By using the WWW interface you can ask the Upload Server to mirror -your modules from your ftp or WWW site into your own directory on -CPAN! - -Please remember to send me an updated entry for the Module list! - -=item * - -Take care when changing a released module. - -Always strive to remain compatible with previous released versions. -Otherwise try to add a mechanism to revert to the -old behavior if people rely on it. Document incompatible changes. - -=back - -=back - -=head2 Guidelines for Converting Perl 4 Library Scripts into Modules - -=over 4 - -=item * - -There is no requirement to convert anything. - -If it ain't broke, don't fix it! Perl 4 library scripts should -continue to work with no problems. You may need to make some minor -changes (like escaping non-array @'s in double quoted strings) but -there is no need to convert a .pl file into a Module for just that. - -=item * - -Consider the implications. - -All Perl applications that make use of the script will need to -be changed (slightly) if the script is converted into a module. Is -it worth it unless you plan to make other changes at the same time? - -=item * - -Make the most of the opportunity. - -If you are going to convert the script to a module you can use the -opportunity to redesign the interface. The guidelines for module -creation above include many of the issues you should consider. - -=item * - -The pl2pm utility will get you started. - -This utility will read *.pl files (given as parameters) and write -corresponding *.pm files. The pl2pm utilities does the following: - -=over 10 - -=item * - -Adds the standard Module prologue lines - -=item * - -Converts package specifiers from ' to :: - -=item * - -Converts die(...) to croak(...) - -=item * - -Several other minor changes - -=back - -Being a mechanical process pl2pm is not bullet proof. The converted -code will need careful checking, especially any package statements. -Don't delete the original .pl file till the new .pm one works! - -=back - -=head2 Guidelines for Reusing Application Code - -=over 4 - -=item * - -Complete applications rarely belong in the Perl Module Library. - -=item * - -Many applications contain some Perl code that could be reused. - -Help save the world! Share your code in a form that makes it easy -to reuse. - -=item * - -Break-out the reusable code into one or more separate module files. - -=item * - -Take the opportunity to reconsider and redesign the interfaces. - -=item * - -In some cases the 'application' can then be reduced to a small - -fragment of code built on top of the reusable modules. In these cases -the application could invoked as: - - % perl -e 'use Module::Name; method(@ARGV)' ... -or - % perl -mModule::Name ... (in perl5.002 or higher) - -=back - -=head1 NOTE - -Perl does not enforce private and public parts of its modules as you may -have been used to in other languages like C++, Ada, or Modula-17. Perl -doesn't have an infatuation with enforced privacy. It would prefer -that you stayed out of its living room because you weren't invited, not -because it has a shotgun. - -The module and its user have a contract, part of which is common law, -and part of which is "written". Part of the common law contract is -that a module doesn't pollute any namespace it wasn't asked to. The -written contract for the module (A.K.A. documentation) may make other -provisions. But then you know when you C that -you're redefining the world and willing to take the consequences. diff --git a/lib/perl5/5.6.1/pods/perlmpeix.pod b/lib/perl5/5.6.1/pods/perlmpeix.pod deleted file mode 100644 index 7976db54..00000000 --- a/lib/perl5/5.6.1/pods/perlmpeix.pod +++ /dev/null @@ -1,675 +0,0 @@ -If you read this file _as_is_, just ignore the funny characters you -see. It is written in the POD format (see perlpod manpage) which is -specially designed to be readable as is. - -=head1 NAME - -README.mpeix - Perl/iX for HP e3000 MPE - -=head1 SYNOPSIS - - http://www.bixby.org/mark/perlix.html - Perl language for MPE - Last updated June 2, 2000 @ 0400 UTC - -=head1 NOTE - -This is a podified version of the above-mentioned web page, -podified by Jarkko Hietaniemi 2001-Jan-01. - -=head1 What's New - -June 1, 2000 - -=over 4 - -=item * - -Rebuilt to be compatible with mod_perl. If you plan on using -mod_perl, you MUST download and install this version of Perl/iX! - -=item * - -bincompat5005="undef": sorry, but you will have to recompile any -binary 5.005 extensions that you may be using (if any; there is no -5.005 code in what you download from bixby.org) -uselargefiles="undef": not available in MPE for POSIX files yet. - -=item * - -Now bundled with various add-on packages: - -=over 8 - -=item * - -libnet (http://www.gbarr.demon.co.uk/libnet/FAQ.html) - -=item * - -libwww-perl (LWP) which lets Perl programs behave like web browsers: - - 1. #!/PERL/PUB/perl - 2. use LWP::Simple; - 3. $doc = get('http://www.bixby.org/mark/perlix.html'); # reads the - web page into variable $doc - -(http://www.bixby.org/mark/perlix.html) - -=item * - -mod_perl (just the perl portion; the actual DSO will be released -soon with Apache/iX 1.3.12 from bixby.org). This module allows you to -write high performance persistent Perl CGI scripts and all sorts of -cool things. (http://perl.apache.org/) - -and much much more hiding under /PERL/PUB/.cpan/ - -=item * - -The CPAN module now works for automatic downloading and -installing of add-on packages: - - 1. export FTP_PASSIVE=1 - 2. perl -MCPAN -e shell - 3. Ignore any terminal I/O related complaints! - -(http://theoryx5.uwinnipeg.ca/CPAN/data/perl/CPAN.html) - -=back - -=back - -May 20, 2000 - -=over 4 - -=item * - -Updated to version 5.6.0. Builds straight out of the box on MPE/iX. - -=item * - -Perl's getpwnam() function which had regressed to being -unimplemented on MPE is now implemented once again. - -=back - -September 17, 1999 - -=over 4 - -=item * - -Migrated from cccd.edu to bixby.org. - -=back - -=head1 Welcome - -This is the official home page for the HP e3000 MPE/iX -(http://www.businessservers.hp.com/) port of the Perl scripting -language (http://www.perl.com/) which gives you all of the power of C, -awk, sed, and sh in a single language. Check here for the latest news, -implemented functionality, known bugs, to-do list, etc. Status reports -about major milestones will also be posted to the HP3000-L mailing list -(http://www.lsoft.com/scripts/wl.exe?SL1=HP3000-L&H=RAVEN.UTC.EDU) and -its associated gatewayed newsgroup comp.sys.hp.mpe. - -I'm doing this port because I can't live without Perl on the Unix -machines that I administer, and I want to have the same power -available to me on MPE. - -Please send your comments, questions, and bug reports directly to me, -Mark Bixby (http://www.bixby.org/mark/), by e-mailing to -mark@bixby.org. Or just post them to HP3000-L. - -The platform I'm using to do this port is an HP 3000 957RX running -MPE/iX 6.0 and using the GNU gcc C compiler -(http://jazz.external.hp.com/src/gnu/gnuframe.html). - -The combined porting wisdom from all of my ports can be found in my -MPE/iX Porting Guide (http://www.bixby.org/mark/porting.html). - -IMPORTANT NOTICE: Yes, I do work for the HP CSY R&D lab, but ALL of -the software you download from bixby.org is my personal freeware that -is NOT supported by HP. - -=head1 System Requirements - -=over 4 - -=item * - -MPE/iX 5.5 or later. This version of Perl/iX does NOT run on -MPE/iX 5.0 or earlier, nor does it run on "classic" MPE/V machines. - -=item * - -If you wish to recompile Perl, you must install both GNUCORE and -GNUGCC from jazz (http://jazz.external.hp.com/src/gnu/gnuframe.html). - -=item * - -Perl/iX will be happier on MPE/iX 5.5 if you install the MPEKX40B -extended POSIX filename characters patch, but this is optional. - -=item * - -Patch LBCJXT6A is required on MPE/iX 5.5 machines in order to -prevent Perl/iX from dying with an unresolved external reference -to _getenv_libc. - -=item * - -If you will be compiling Perl/iX yourself, you will also need -Syslog/iX (http://www.bixby.org/mark/syslogix.html) and the -/BIND/PUB/include and /BIND/PUB/lib portions of BIND/iX -(http://www.bixby.org/mark/bindix.html). - -=back - -=head1 How to Obtain Perl/iX - -=over 4 - -=item 1. - -Download Perl using either FTP.ARPA.SYS or some other client - -=item 2. - -Extract the installation script - -=item 3. - -Edit the installation script - -=item 4. - -Run the installation script - -=item 5. - -Convert your *.a system archive libraries to *.sl shared libraries - -=back - -Download Perl using FTP.ARPA.SYS from your HP 3000 (the preferred -method)..... - - :HELLO MANAGER.SYS - :XEQ FTP.ARPA.SYS - open ftp.bixby.org - anonymous - your@email.address - bytestream - cd /pub/mpe - get perl-5.6.0-mpe.tar.Z /tmp/perl.tar.Z;disc=2147483647 - exit - -.....Or download using some other generic web or ftp client (the alternate -method) - -Download the following files (make sure that you use "binary mode" or -whatever client feature that is 8-bit clean): - -=over 4 - -=item * - -Perl from - - http://www.bixby.org/ftp/pub/mpe/perl-5.6.0-mpe.tar.Z - -or - - ftp://ftp.bixby.org/pub/mpe/perl-5.6.0-mpe.tar.Z - -=item * - -Upload those files to your HP 3000 in an 8-bit clean bytestream manner to: - - /tmp/perl.tar.Z - -=item * - -Then extract the installation script (after both download methods) - - :CHDIR /tmp - :XEQ TAR.HPBIN.SYS 'xvfopz /tmp/perl.tar.Z INSTALL' - -=item * - -Edit the installation script - -Examine the accounting structure creation commands and modify if -necessary (adding additional capabilities, choosing a non-system -volume set, etc). - - :XEQ VI.HPBIN.SYS /tmp/INSTALL - -=item * - -Run the installation script. - -The accounting structure will be created and then all files will be -extracted from the archive. - - :XEQ SH.HPBIN.SYS /tmp/INSTALL - -=item * - -Convert your *.a system archive libraries to *.sl shared libraries - -You only have to do this ONCE on your MPE/iX 5.5 machine in order to -convert /lib/lib*.a and /usr/lib/lib*.a libraries to their *.sl -equivalents. This step should not be necessary on MPE/iX 6.0 or later -machines because the 6.0 or later update process does it for you. - - :XEQ SH.HPBIN.SYS /PERL/PUB/LIBSHP3K - -=back - -=head1 Distribution Contents Highlights - -=over 4 - -=item README - -The file you're reading now. - -=item INSTALL - -Perl/iX Installation script. - -=item LIBSHP3K - -Script to convert *.a system archive libraries to *.sl shared libraries. - -=item PERL - -Perl NMPRG executable. A version-numbered backup copy also -exists. You might wish to "ln -s /PERL/PUB/PERL /usr/local/bin/perl". - -=item .cpan/ - -Much add-on source code downloaded with the CPAN module. - -=item lib/ - -Perl libraries, both core and add-on. - -=item man/ - -Perl man page documentation. - -=item public_html/feedback.cgi - -Sample feedback CGI form written in Perl. - -=item src/perl-5.6.0-mpe - -Source code. - -=back - -=head1 How to Compile Perl/iX - -=over 4 - -=item 1. - -cd src/perl-5.6.0-mpe - -=item 2. - -Read the INSTALL file for the official instructions - -=item 3. - -./Configure -d - -=item 4. - -make - -=item 5. - -./mpeix/relink - -=item 6. - -make test (expect approximately 15 out of 11306 subtests to fail, -mostly due to MPE not supporting hard links, UDP socket problems, -and handling exit() return codes improperly) - -=item 7. - -make install - -=item 8. - -Optionally create symbolic links that point to the Perl -executable, i.e. ln -s /PERL/PUB/PERL /usr/local/bin/perl - -=back - -The summary test results from "cd t; ./perl -I../lib harness": - - Failed Test Status Wstat Total Fail Failed List of failed - --------------------------------------------------------------------------- - io/fs.t 29 8 27.59% 2-5, 7-9, 11 - io/openpid.t 10 1 10.00% 7 - lib/io_sock.t 14 1 7.14% 13 - lib/io_udp.t 7 2 28.57% 3, 5 - lib/posix.t 27 1 3.70% 12 - op/lex_assign.t 187 1 0.53% 13 - op/stat.t 58 1 1.72% 3 - 15 tests and 94 subtests skipped. - Failed 7/236 test scripts, 97.03% okay. 15/11306 subtests failed, 99.87% okay. - -=head1 Getting Started with Perl/iX - -Create your Perl script files with "#!/PERL/PUB/perl" (or an -equivalent symbolic link) as the first line. Use the chmod command to -make sure that your script has execute permission. Run your script! - -Be sure to take a look at the CPAN module list -(http://www.cpan.org/CPAN.html). A wide variety of free Perl software -is available. You can automatically download these packages by using -the CPAN module (http://theoryx5.uwinnipeg.ca/CPAN/data/perl/CPAN.html). - -=head1 MPE/iX Implementation Considerations - -There some minor functionality issues to be aware of when comparing -Perl for Unix (Perl/UX) to Perl/iX: - -=over 4 - -=item * - -MPE gcc/ld doesn't properly support linking NMPRG executables against -NMXL dynamic libraries, so you must manually run mpeix/relink after -each re-build of Perl. - -=item * - -Perl/iX File::Copy will use MPE's /bin/cp command to copy files by -name in order to preserve file attributes like file code. - -=item * - -MPE (and thus Perl/iX) lacks support for setgrent(), endgrent(), -setpwent(), endpwent(). - -=item * - -MPE (and thus Perl/iX) lacks support for hard links. - -=item * - -MPE requires GETPRIVMODE() in order to bind() to ports less than 1024. -Perl/iX will call GETPRIVMODE() automatically on your behalf if you -attempt to bind() to these low-numbered ports. Note that the Perl/iX -executable and the PERL account do not normally have CAP=PM, so if you -will be bind()-ing to these privileged ports, you will manually need -to add PM capability as appropriate. - -=item * - -MPE requires that you bind() to an IP address of zero. Perl/iX -automatically replaces the IP address that you pass to bind() with -a zero. - -=item * - -If you use Perl/iX fcntl() against a socket it will fail, because MPE -requires that you use sfcntl() instead. Perl/iX does not presently -support sfcntl(). - -=item * - -MPE requires GETPRIVMODE() in order to setuid(). There are too many -calls to setuid() within Perl/iX, so I have not attempted an automatic -GETPRIVMODE() solution similar to bind(). - -=back - -=head1 Known Bugs Under Investigation - -None. - -=head1 To-Do List - -=over 4 - -=item * - -Make setuid()/setgid() support work. - -=item * - -Make sure that fcntl() against a socket descriptor is redirected to sfcntl(). - -=item * - -Add support for Berkeley DB once I've finished porting Berkeley DB. - -=item * - -Write an MPE XS extension library containing miscellaneous important -MPE functions like GETPRIVMODE(), GETUSERMODE(), and sfcntl(). - -=back - -=head1 Change History - -May 6, 1999 - -=over 4 - -=item * - -Patch LBCJXT6A is required on MPE/iX 5.5 machines in order to prevent -Perl/iX from dying with an unresolved external reference to _getenv_libc. - -=back - -April 7, 1999 - -=over 4 - -=item * - -Updated to version 5.005_03. - -=item * - -The official source distribution once again compiles "straight out -of the box" for MPE. - -=item * - -The current incarnation of the 5.5 POSIX filename extended -characters patch is now MPEKX40B. - -=item * - -The LIBSHP3K *.a -> *.sl library conversion script is now included -as /PERL/PUB/LIBSHP3K. - -=back - -November 20, 1998 - -=over 4 - -=item * - -Updated to version 5.005_02. - -=item * - -Fixed a DynaLoader bug that was unable to load symbols from relative -path name libraries. - -=item * - -Fixed a .xs compilation bug where the mpeixish.sh include file wasn't -being installed into the proper directory. - -=item * - -All bugfixes will be submitted back to the official Perl developers. - -=item * - -The current incarnation of the POSIX filename extended characters -patch is now MPEKXJ3A. - -=back - -August 14, 1998 - -=over 4 - -=item * - -The previous POSIX filename extended characters patch MPEKX44C has -been superseded by MPEKXB5A. - -=back - -August 7, 1998 - -=over 4 - -=item * - -The previous POSIX filename extended characters patch MPEKX76A has -been superseded by MPEKX44C. - -=over 4 - -=back - -July 28, 1998 - -=item * - -Updated to version 5.005_01. - -=back - -July 23, 1998 - -=over 4 - -=item * - -Updated to version 5.005 (production release). The public -freeware sources are now 100% MPE-ready "straight out of the box". - -=back - -July 17, 1998 - -=over 4 - -=item * - -Updated to version 5.005b1 (public beta release). The public -freeware sources are now 99.9% MPE-ready. By installing and -testing this beta on your own HP3000, you will be helping to -insure that the final release of 5.005 will be 100% MPE-ready and -100% bug free. - -=item * - -My MPE binary release is now extracted using my standard INSTALL script. - -=back - -July 15, 1998 - -=over 4 - -=item * - -Changed startperl to #!/PERL/PUB/perl so that Perl will recognize -scripts more easily and efficiently. - -=back - -July 8, 1998 - -=over 4 - -=item * - -Updated to version 5.004_70 (internal developer release) which is now -MPE-ready. The next public freeware release of Perl should compile -"straight out of the box" on MPE. Note that this version of Perl/iX -was strictly internal to me and never publicly released. Note that -[21]BIND/iX is now required (well, the include files and libbind.a) if -you wish to compile Perl/iX. - -=back - -November 6, 1997 - -=over 4 - -=item * - -Updated to version 5.004_04. No changes in MPE-specific functionality. - -=back - -October 16, 1997 - -=over 4 - -=item * - -Added Demos section to the Perl/iX home page so you can see some -sample Perl applications running on my 3000. - -=back - -October 3, 1997 - -=over 4 - -=item * - -Added System Requirements section to the Perl/iX home page just so the -prerequisites stand out more. Various other home page tweaks. - -=back - -October 2, 1997 - -=over 4 - -=item * - -Initial public release. - -=back - -September 1997 - -=over 4 - -=item * - -Porting begins. - -=back - -=head1 Author - -Mark Bixby, mark@bixby.org - diff --git a/lib/perl5/5.6.1/pods/perlnewmod.pod b/lib/perl5/5.6.1/pods/perlnewmod.pod deleted file mode 100644 index ace8d851..00000000 --- a/lib/perl5/5.6.1/pods/perlnewmod.pod +++ /dev/null @@ -1,282 +0,0 @@ -=head1 NAME - -perlnewmod - preparing a new module for distribution - -=head1 DESCRIPTION - -This document gives you some suggestions about how to go about writing -Perl modules, preparing them for distribution, and making them available -via CPAN. - -One of the things that makes Perl really powerful is the fact that Perl -hackers tend to want to share the solutions to problems they've faced, -so you and I don't have to battle with the same problem again. - -The main way they do this is by abstracting the solution into a Perl -module. If you don't know what one of these is, the rest of this -document isn't going to be much use to you. You're also missing out on -an awful lot of useful code; consider having a look at L, -L and L before coming back here. - -When you've found that there isn't a module available for what you're -trying to do, and you've had to write the code yourself, consider -packaging up the solution into a module and uploading it to CPAN so that -others can benefit. - -=head2 Warning - -We're going to primarily concentrate on Perl-only modules here, rather -than XS modules. XS modules serve a rather different purpose, and -you should consider different things before distributing them - the -popularity of the library you are gluing, the portability to other -operating systems, and so on. However, the notes on preparing the Perl -side of the module and packaging and distributing it will apply equally -well to an XS module as a pure-Perl one. - -=head2 What should I make into a module? - -You should make a module out of any code that you think is going to be -useful to others. Anything that's likely to fill a hole in the communal -library and which someone else can slot directly into their program. Any -part of your code which you can isolate and extract and plug into -something else is a likely candidate. - -Let's take an example. Suppose you're reading in data from a local -format into a hash-of-hashes in Perl, turning that into a tree, walking -the tree and then piping each node to an Acme Transmogrifier Server. - -Now, quite a few people have the Acme Transmogrifier, and you've had to -write something to talk the protocol from scratch - you'd almost -certainly want to make that into a module. The level at which you pitch -it is up to you: you might want protocol-level modules analogous to -L which then talk to higher level modules analogous -to L. The choice is yours, but you do want to get -a module out for that server protocol. - -Nobody else on the planet is going to talk your local data format, so we -can ignore that. But what about the thing in the middle? Building tree -structures from Perl variables and then traversing them is a nice, -general problem, and if nobody's already written a module that does -that, you might want to modularise that code too. - -So hopefully you've now got a few ideas about what's good to modularise. -Let's now see how it's done. - -=head2 Step-by-step: Preparing the ground - -Before we even start scraping out the code, there are a few things we'll -want to do in advance. - -=over 3 - -=item Look around - -Dig into a bunch of modules to see how they're written. I'd suggest -starting with L, since it's in the standard -library and is nice and simple, and then looking at something like -L, L and then some of the -C modules if you're planning on writing object oriented code. - -These should give you an overall feel for how modules are laid out and -written. - -=item Check it's new - -There are a lot of modules on CPAN, and it's easy to miss one that's -similar to what you're planning on contributing. Have a good plough -through the modules list and the F directories, and make sure -you're not the one reinventing the wheel! - -=item Discuss the need - -You might love it. You might feel that everyone else needs it. But there -might not actually be any real demand for it out there. If you're unsure -about the demand you're module will have, consider sending out feelers -on the C newsgroup, or as a last resort, ask the -modules list at C. Remember that this is a closed list -with a very long turn-around time - be prepared to wait a good while for -a response from them. - -=item Choose a name - -Perl modules included on CPAN have a naming hierarchy you should try to -fit in with. See L for more details on how this works, and -browse around CPAN and the modules list to get a feel of it. At the very -least, remember this: modules should be title capitalised, (This::Thing) -fit in with a category, and explain their purpose succinctly. - -=item Check again - -While you're doing that, make really sure you haven't missed a module -similar to the one you're about to write. - -When you've got your name sorted out and you're sure that your module is -wanted and not currently available, it's time to start coding. - -=back - -=head2 Step-by-step: Making the module - -=over 3 - -=item Start with F - -Originally a utility to convert C header files into XS modules, -L has become a useful utility for churning out skeletons for -Perl-only modules as well. If you don't want to use the -L which splits up big modules into smaller -subroutine-sized chunks, you'll say something like this: - - h2xs -AX -n Net::Acme - -The C<-A> omits the Autoloader code, C<-X> omits XS elements, and C<-n> -specifies the name of the module. - -=item Use L and L - -A module's code has to be warning and strict-clean, since you can't -guarantee the conditions that it'll be used under. Besides, you wouldn't -want to distribute code that wasn't warning or strict-clean anyway, -right? - -=item Use L - -The L module allows you to present your error messages from -the caller's perspective; this gives you a way to signal a problem with -the caller and not your module. For instance, if you say this: - - warn "No hostname given"; - -the user will see something like this: - - No hostname given at /usr/local/lib/perl5/site_perl/5.6.0/Net/Acme.pm - line 123. - -which looks like your module is doing something wrong. Instead, you want -to put the blame on the user, and say this: - - No hostname given at bad_code, line 10. - -You do this by using L and replacing your Cs with -Cs. If you need to C, say C instead. However, keep -C and C in place for your sanity checks - where it really is -your module at fault. - -=item Use L - wisely! - -C provides stubs for L, which gives you a -standard way of exporting symbols and subroutines from your module into -the caller's namespace. For instance, saying C -would import the C subroutine. - -The package variable C<@EXPORT> will determine which symbols will get -exported when the caller simply says C - you will hardly -ever want to put anything in there. C<@EXPORT_OK>, on the other hand, -specifies which symbols you're willing to export. If you do want to -export a bunch of symbols, use the C<%EXPORT_TAGS> and define a standard -export set - look at L for more details. - -=item Use L - -The work isn't over until the paperwork is done, and you're going to -need to put in some time writing some documentation for your module. -C will provide a stub for you to fill in; if you're not sure about -the format, look at L for an introduction. Provide a good -synopsis of how your module is used in code, a description, and then -notes on the syntax and function of the individual subroutines or -methods. Use Perl comments for developer notes and POD for end-user -notes. - -=item Write tests - -You're encouraged to create self-tests for your module to ensure it's -working as intended on the myriad platforms Perl supports; if you upload -your module to CPAN, a host of testers will build your module and send -you the results of the tests. Again, C provides a test framework -which you can extend - you should do something more than just checking -your module will compile. - -=item Write the README - -If you're uploading to CPAN, the automated gremlins will extract the -README file and place that in your CPAN directory. It'll also appear in -the main F and F directories if you make it onto -the modules list. It's a good idea to put here what the module actually -does in detail, and the user-visible changes since the last release. - -=back - -=head2 Step-by-step: Distributing your module - -=over 3 - -=item Get a CPAN user ID - -Every developer publishing modules on CPAN needs a CPAN ID. See the -instructions at C (or -equivalent on your nearest mirror) to find out how to do this. - -=item C - -Once again, C has done all the work for you. It produces the -standard C you'll have seen when you downloaded and -installs modules, and this produces a Makefile with a C target. - -Once you've ensured that your module passes its own tests - always a -good thing to make sure - you can C, and the Makefile will -hopefully produce you a nice tarball of your module, ready for upload. - -=item Upload the tarball - -The email you got when you received your CPAN ID will tell you how to -log in to PAUSE, the Perl Authors Upload SErver. From the menus there, -you can upload your module to CPAN. - -=item Announce to the modules list - -Once uploaded, it'll sit unnoticed in your author directory. If you want -it connected to the rest of the CPAN, you'll need to tell the modules -list about it. The best way to do this is to email them a line in the -style of the modules list, like this: - - Net::Acme bdpO Interface to Acme Frobnicator servers FOOBAR - ^ ^^^^ ^ ^ - | |||| Module description Your ID - | |||| - | |||\- Interface: (O)OP, (r)eferences, (h)ybrid, (f)unctions - | ||| - | ||\-- Language: (p)ure Perl, C(+)+, (h)ybrid, (C), (o)ther - | || - Module |\--- Support: (d)eveloper, (m)ailing list, (u)senet, (n)one - Name | - \---- Maturity: (i)dea, (c)onstructions, (a)lpha, (b)eta, - (R)eleased, (M)ature, (S)tandard - -plus a description of the module and why you think it should be -included. If you hear nothing back, that means your module will -probably appear on the modules list at the next update. Don't try -subscribing to C; it's not another mailing list. Just -have patience. - -=item Announce to clpa - -If you have a burning desire to tell the world about your release, post -an announcement to the moderated C newsgroup. - -=item Fix bugs! - -Once you start accumulating users, they'll send you bug reports. If -you're lucky, they'll even send you patches. Welcome to the joys of -maintaining a software project... - -=back - -=head1 AUTHOR - -Simon Cozens, C - -=head1 SEE ALSO - -L, L, L, L, L, -L, L, L, L, L, -http://www.cpan.org/ diff --git a/lib/perl5/5.6.1/pods/perlnumber.pod b/lib/perl5/5.6.1/pods/perlnumber.pod deleted file mode 100644 index 44d921cf..00000000 --- a/lib/perl5/5.6.1/pods/perlnumber.pod +++ /dev/null @@ -1,185 +0,0 @@ -=head1 NAME - -perlnumber - semantics of numbers and numeric operations in Perl - -=head1 SYNOPSIS - - $n = 1234; # decimal integer - $n = 0b1110011; # binary integer - $n = 01234; # octal integer - $n = 0x1234; # hexadecimal integer - $n = 12.34e-56; # exponential notation - $n = "-12.34e56"; # number specified as a string - $n = "1234"; # number specified as a string - $n = v49.50.51.52; # number specified as a string, which in - # turn is specified in terms of numbers :-) - -=head1 DESCRIPTION - -This document describes how Perl internally handles numeric values. - -Perl's operator overloading facility is completely ignored here. Operator -overloading allows user-defined behaviors for numbers, such as operations -over arbitrarily large integers, floating points numbers with arbitrary -precision, operations over "exotic" numbers such as modular arithmetic or -p-adic arithmetic, and so on. See L for details. - -=head1 Storing numbers - -Perl can internally represent numbers in 3 different ways: as native -integers, as native floating point numbers, and as decimal strings. -Decimal strings may have an exponential notation part, as in C<"12.34e-56">. -I here means "a format supported by the C compiler which was used -to build perl". - -The term "native" does not mean quite as much when we talk about native -integers, as it does when native floating point numbers are involved. -The only implication of the term "native" on integers is that the limits for -the maximal and the minimal supported true integral quantities are close to -powers of 2. However, "native" floats have a most fundamental -restriction: they may represent only those numbers which have a relatively -"short" representation when converted to a binary fraction. For example, -0.9 cannot be represented by a native float, since the binary fraction -for 0.9 is infinite: - - binary0.1110011001100... - -with the sequence C<1100> repeating again and again. In addition to this -limitation, the exponent of the binary number is also restricted when it -is represented as a floating point number. On typical hardware, floating -point values can store numbers with up to 53 binary digits, and with binary -exponents between -1024 and 1024. In decimal representation this is close -to 16 decimal digits and decimal exponents in the range of -304..304. -The upshot of all this is that Perl cannot store a number like -12345678901234567 as a floating point number on such architectures without -loss of information. - -Similarly, decimal strings can represent only those numbers which have a -finite decimal expansion. Being strings, and thus of arbitrary length, there -is no practical limit for the exponent or number of decimal digits for these -numbers. (But realize that what we are discussing the rules for just the -I of these numbers. The fact that you can store such "large" numbers -does not mean that the I over these numbers will use all -of the significant digits. -See L<"Numeric operators and numeric conversions"> for details.) - -In fact numbers stored in the native integer format may be stored either -in the signed native form, or in the unsigned native form. Thus the limits -for Perl numbers stored as native integers would typically be -2**31..2**32-1, -with appropriate modifications in the case of 64-bit integers. Again, this -does not mean that Perl can do operations only over integers in this range: -it is possible to store many more integers in floating point format. - -Summing up, Perl numeric values can store only those numbers which have -a finite decimal expansion or a "short" binary expansion. - -=head1 Numeric operators and numeric conversions - -As mentioned earlier, Perl can store a number in any one of three formats, -but most operators typically understand only one of those formats. When -a numeric value is passed as an argument to such an operator, it will be -converted to the format understood by the operator. - -Six such conversions are possible: - - native integer --> native floating point (*) - native integer --> decimal string - native floating_point --> native integer (*) - native floating_point --> decimal string (*) - decimal string --> native integer - decimal string --> native floating point (*) - -These conversions are governed by the following general rules: - -=over 4 - -=item * - -If the source number can be represented in the target form, that -representation is used. - -=item * - -If the source number is outside of the limits representable in the target form, -a representation of the closest limit is used. (I) - -=item * - -If the source number is between two numbers representable in the target form, -a representation of one of these numbers is used. (I) - -=item * - -In C<< native floating point --> native integer >> conversions the magnitude -of the result is less than or equal to the magnitude of the source. -(I<"Rounding to zero".>) - -=item * - -If the C<< decimal string --> native integer >> conversion cannot be done -without loss of information, the result is compatible with the conversion -sequence C<< decimal_string --> native_floating_point --> native_integer >>. -In particular, rounding is strongly biased to 0, though a number like -C<"0.99999999999999999999"> has a chance of being rounded to 1. - -=back - -B: The conversions marked with C<(*)> above involve steps -performed by the C compiler. In particular, bugs/features of the compiler -used may lead to breakage of some of the above rules. - -=head1 Flavors of Perl numeric operations - -Perl operations which take a numeric argument treat that argument in one -of four different ways: they may force it to one of the integer/floating/ -string formats, or they may behave differently depending on the format of -the operand. Forcing a numeric value to a particular format does not -change the number stored in the value. - -All the operators which need an argument in the integer format treat the -argument as in modular arithmetic, e.g., C on a 32-bit -architecture. C therefore provides the same result as -C. - -=over 4 - -=item Arithmetic operators except, C - -force the argument into the floating point format. - -=item Arithmetic operators except, C - -=item Bitwise operators, C - -force the argument into the integer format if it is not a string. - -=item Bitwise operators, C - -force the argument into the integer format - -=item Operators which expect an integer - -force the argument into the integer format. This is applicable -to the third and fourth arguments of C, for example. - -=item Operators which expect a string - -force the argument into the string format. For example, this is -applicable to C. - -=back - -Though forcing an argument into a particular form does not change the -stored number, Perl remembers the result of such conversions. In -particular, though the first such conversion may be time-consuming, -repeated operations will not need to redo the conversion. - -=head1 AUTHOR - -Ilya Zakharevich C - -Editorial adjustments by Gurusamy Sarathy - -=head1 SEE ALSO - -L diff --git a/lib/perl5/5.6.1/pods/perlobj.pod b/lib/perl5/5.6.1/pods/perlobj.pod deleted file mode 100644 index 285ed997..00000000 --- a/lib/perl5/5.6.1/pods/perlobj.pod +++ /dev/null @@ -1,566 +0,0 @@ -=head1 NAME - -perlobj - Perl objects - -=head1 DESCRIPTION - -First you need to understand what references are in Perl. -See L for that. Second, if you still find the following -reference work too complicated, a tutorial on object-oriented programming -in Perl can be found in L and L. - -If you're still with us, then -here are three very simple definitions that you should find reassuring. - -=over 4 - -=item 1. - -An object is simply a reference that happens to know which class it -belongs to. - -=item 2. - -A class is simply a package that happens to provide methods to deal -with object references. - -=item 3. - -A method is simply a subroutine that expects an object reference (or -a package name, for class methods) as the first argument. - -=back - -We'll cover these points now in more depth. - -=head2 An Object is Simply a Reference - -Unlike say C++, Perl doesn't provide any special syntax for -constructors. A constructor is merely a subroutine that returns a -reference to something "blessed" into a class, generally the -class that the subroutine is defined in. Here is a typical -constructor: - - package Critter; - sub new { bless {} } - -That word C isn't special. You could have written -a construct this way, too: - - package Critter; - sub spawn { bless {} } - -This might even be preferable, because the C++ programmers won't -be tricked into thinking that C works in Perl as it does in C++. -It doesn't. We recommend that you name your constructors whatever -makes sense in the context of the problem you're solving. For example, -constructors in the Tk extension to Perl are named after the widgets -they create. - -One thing that's different about Perl constructors compared with those in -C++ is that in Perl, they have to allocate their own memory. (The other -things is that they don't automatically call overridden base-class -constructors.) The C<{}> allocates an anonymous hash containing no -key/value pairs, and returns it The bless() takes that reference and -tells the object it references that it's now a Critter, and returns -the reference. This is for convenience, because the referenced object -itself knows that it has been blessed, and the reference to it could -have been returned directly, like this: - - sub new { - my $self = {}; - bless $self; - return $self; - } - -You often see such a thing in more complicated constructors -that wish to call methods in the class as part of the construction: - - sub new { - my $self = {}; - bless $self; - $self->initialize(); - return $self; - } - -If you care about inheritance (and you should; see -L), -then you want to use the two-arg form of bless -so that your constructors may be inherited: - - sub new { - my $class = shift; - my $self = {}; - bless $self, $class; - $self->initialize(); - return $self; - } - -Or if you expect people to call not just C<< CLASS->new() >> but also -C<< $obj->new() >>, then use something like this. The initialize() -method used will be of whatever $class we blessed the -object into: - - sub new { - my $this = shift; - my $class = ref($this) || $this; - my $self = {}; - bless $self, $class; - $self->initialize(); - return $self; - } - -Within the class package, the methods will typically deal with the -reference as an ordinary reference. Outside the class package, -the reference is generally treated as an opaque value that may -be accessed only through the class's methods. - -Although a constructor can in theory re-bless a referenced object -currently belonging to another class, this is almost certainly going -to get you into trouble. The new class is responsible for all -cleanup later. The previous blessing is forgotten, as an object -may belong to only one class at a time. (Although of course it's -free to inherit methods from many classes.) If you find yourself -having to do this, the parent class is probably misbehaving, though. - -A clarification: Perl objects are blessed. References are not. Objects -know which package they belong to. References do not. The bless() -function uses the reference to find the object. Consider -the following example: - - $a = {}; - $b = $a; - bless $a, BLAH; - print "\$b is a ", ref($b), "\n"; - -This reports $b as being a BLAH, so obviously bless() -operated on the object and not on the reference. - -=head2 A Class is Simply a Package - -Unlike say C++, Perl doesn't provide any special syntax for class -definitions. You use a package as a class by putting method -definitions into the class. - -There is a special array within each package called @ISA, which says -where else to look for a method if you can't find it in the current -package. This is how Perl implements inheritance. Each element of the -@ISA array is just the name of another package that happens to be a -class package. The classes are searched (depth first) for missing -methods in the order that they occur in @ISA. The classes accessible -through @ISA are known as base classes of the current class. - -All classes implicitly inherit from class C as their -last base class. Several commonly used methods are automatically -supplied in the UNIVERSAL class; see L<"Default UNIVERSAL methods"> for -more details. - -If a missing method is found in a base class, it is cached -in the current class for efficiency. Changing @ISA or defining new -subroutines invalidates the cache and causes Perl to do the lookup again. - -If neither the current class, its named base classes, nor the UNIVERSAL -class contains the requested method, these three places are searched -all over again, this time looking for a method named AUTOLOAD(). If an -AUTOLOAD is found, this method is called on behalf of the missing method, -setting the package global $AUTOLOAD to be the fully qualified name of -the method that was intended to be called. - -If none of that works, Perl finally gives up and complains. - -If you want to stop the AUTOLOAD inheritance say simply - - sub AUTOLOAD; - -and the call will die using the name of the sub being called. - -Perl classes do method inheritance only. Data inheritance is left up -to the class itself. By and large, this is not a problem in Perl, -because most classes model the attributes of their object using an -anonymous hash, which serves as its own little namespace to be carved up -by the various classes that might want to do something with the object. -The only problem with this is that you can't sure that you aren't using -a piece of the hash that isn't already used. A reasonable workaround -is to prepend your fieldname in the hash with the package name. - - sub bump { - my $self = shift; - $self->{ __PACKAGE__ . ".count"}++; - } - -=head2 A Method is Simply a Subroutine - -Unlike say C++, Perl doesn't provide any special syntax for method -definition. (It does provide a little syntax for method invocation -though. More on that later.) A method expects its first argument -to be the object (reference) or package (string) it is being invoked -on. There are two ways of calling methods, which we'll call class -methods and instance methods. - -A class method expects a class name as the first argument. It -provides functionality for the class as a whole, not for any -individual object belonging to the class. Constructors are often -class methods, but see L and L for alternatives. -Many class methods simply ignore their first argument, because they -already know what package they're in and don't care what package -they were invoked via. (These aren't necessarily the same, because -class methods follow the inheritance tree just like ordinary instance -methods.) Another typical use for class methods is to look up an -object by name: - - sub find { - my ($class, $name) = @_; - $objtable{$name}; - } - -An instance method expects an object reference as its first argument. -Typically it shifts the first argument into a "self" or "this" variable, -and then uses that as an ordinary reference. - - sub display { - my $self = shift; - my @keys = @_ ? @_ : sort keys %$self; - foreach $key (@keys) { - print "\t$key => $self->{$key}\n"; - } - } - -=head2 Method Invocation - -There are two ways to invoke a method, one of which you're already -familiar with, and the other of which will look familiar. Perl 4 -already had an "indirect object" syntax that you use when you say - - print STDERR "help!!!\n"; - -This same syntax can be used to call either class or instance methods. -We'll use the two methods defined above, the class method to lookup -an object reference and the instance method to print out its attributes. - - $fred = find Critter "Fred"; - display $fred 'Height', 'Weight'; - -These could be combined into one statement by using a BLOCK in the -indirect object slot: - - display {find Critter "Fred"} 'Height', 'Weight'; - -For C++ fans, there's also a syntax using -> notation that does exactly -the same thing. The parentheses are required if there are any arguments. - - $fred = Critter->find("Fred"); - $fred->display('Height', 'Weight'); - -or in one statement, - - Critter->find("Fred")->display('Height', 'Weight'); - -There are times when one syntax is more readable, and times when the -other syntax is more readable. The indirect object syntax is less -cluttered, but it has the same ambiguity as ordinary list operators. -Indirect object method calls are usually parsed using the same rule as list -operators: "If it looks like a function, it is a function". (Presuming -for the moment that you think two words in a row can look like a -function name. C++ programmers seem to think so with some regularity, -especially when the first word is "new".) Thus, the parentheses of - - new Critter ('Barney', 1.5, 70) - -are assumed to surround ALL the arguments of the method call, regardless -of what comes after. Saying - - new Critter ('Bam' x 2), 1.4, 45 - -would be equivalent to - - Critter->new('Bam' x 2), 1.4, 45 - -which is unlikely to do what you want. Confusingly, however, this -rule applies only when the indirect object is a bareword package name, -not when it's a scalar, a BLOCK, or a C qualified package name. -In those cases, the arguments are parsed in the same way as an -indirect object list operator like print, so - - new Critter:: ('Bam' x 2), 1.4, 45 - -is the same as - - Critter::->new(('Bam' x 2), 1.4, 45) - -For more reasons why the indirect object syntax is ambiguous, see -L<"WARNING"> below. - -There are times when you wish to specify which class's method to use. -Here you can call your method as an ordinary subroutine -call, being sure to pass the requisite first argument explicitly: - - $fred = MyCritter::find("Critter", "Fred"); - MyCritter::display($fred, 'Height', 'Weight'); - -Unlike method calls, function calls don't consider inheritance. If you wish -merely to specify that Perl should I looking for a method in a -particular package, use an ordinary method call, but qualify the method -name with the package like this: - - $fred = Critter->MyCritter::find("Fred"); - $fred->MyCritter::display('Height', 'Weight'); - -If you're trying to control where the method search begins I you're -executing in the class itself, then you may use the SUPER pseudo class, -which says to start looking in your base class's @ISA list without having -to name it explicitly: - - $self->SUPER::display('Height', 'Weight'); - -Please note that the C construct is meaningful I within the -class. - -Sometimes you want to call a method when you don't know the method name -ahead of time. You can use the arrow form, replacing the method name -with a simple scalar variable containing the method name or a -reference to the function. - - $method = $fast ? "findfirst" : "findbest"; - $fred->$method(@args); # call by name - - if ($coderef = $fred->can($parent . "::findbest")) { - $self->$coderef(@args); # call by coderef - } - -=head2 WARNING - -While indirect object syntax may well be appealing to English speakers and -to C++ programmers, be not seduced! It suffers from two grave problems. - -The first problem is that an indirect object is limited to a name, -a scalar variable, or a block, because it would have to do too much -lookahead otherwise, just like any other postfix dereference in the -language. (These are the same quirky rules as are used for the filehandle -slot in functions like C and C.) This can lead to horribly -confusing precedence problems, as in these next two lines: - - move $obj->{FIELD}; # probably wrong! - move $ary[$i]; # probably wrong! - -Those actually parse as the very surprising: - - $obj->move->{FIELD}; # Well, lookee here - $ary->move([$i]); # Didn't expect this one, eh? - -Rather than what you might have expected: - - $obj->{FIELD}->move(); # You should be so lucky. - $ary[$i]->move; # Yeah, sure. - -The left side of ``->'' is not so limited, because it's an infix operator, -not a postfix operator. - -As if that weren't bad enough, think about this: Perl must guess I whether C and C above are functions or methods. -Usually Perl gets it right, but when it doesn't it, you get a function -call compiled as a method, or vice versa. This can introduce subtle -bugs that are hard to unravel. For example, calling a method C -in indirect notation--as C++ programmers are so wont to do--can -be miscompiled into a subroutine call if there's already a C -function in scope. You'd end up calling the current package's C -as a subroutine, rather than the desired class's method. The compiler -tries to cheat by remembering bareword Cs, but the grief if it -messes up just isn't worth the years of debugging it would likely take -you to track such subtle bugs down. - -The infix arrow notation using ``C<< -> >>'' doesn't suffer from either -of these disturbing ambiguities, so we recommend you use it exclusively. - -=head2 Default UNIVERSAL methods - -The C package automatically contains the following methods that -are inherited by all other classes: - -=over 4 - -=item isa(CLASS) - -C returns I if its object is blessed into a subclass of C - -C is also exportable and can be called as a sub with two arguments. This -allows the ability to check what a reference points to. Example - - use UNIVERSAL qw(isa); - - if(isa($ref, 'ARRAY')) { - #... - } - -=item can(METHOD) - -C checks to see if its object has a method called C, -if it does then a reference to the sub is returned, if it does not then -I is returned. - -=item VERSION( [NEED] ) - -C returns the version number of the class (package). If the -NEED argument is given then it will check that the current version (as -defined by the $VERSION variable in the given package) not less than -NEED; it will die if this is not the case. This method is normally -called as a class method. This method is called automatically by the -C form of C. - - use A 1.2 qw(some imported subs); - # implies: - A->VERSION(1.2); - -=back - -B C directly uses Perl's internal code for method lookup, and -C uses a very similar method and cache-ing strategy. This may cause -strange effects if the Perl code dynamically changes @ISA in any package. - -You may add other methods to the UNIVERSAL class via Perl or XS code. -You do not need to C to make these methods -available to your program. This is necessary only if you wish to -have C available as a plain subroutine in the current package. - -=head2 Destructors - -When the last reference to an object goes away, the object is -automatically destroyed. (This may even be after you exit, if you've -stored references in global variables.) If you want to capture control -just before the object is freed, you may define a DESTROY method in -your class. It will automatically be called at the appropriate moment, -and you can do any extra cleanup you need to do. Perl passes a reference -to the object under destruction as the first (and only) argument. Beware -that the reference is a read-only value, and cannot be modified by -manipulating C<$_[0]> within the destructor. The object itself (i.e. -the thingy the reference points to, namely C<${$_[0]}>, C<@{$_[0]}>, -C<%{$_[0]}> etc.) is not similarly constrained. - -If you arrange to re-bless the reference before the destructor returns, -perl will again call the DESTROY method for the re-blessed object after -the current one returns. This can be used for clean delegation of -object destruction, or for ensuring that destructors in the base classes -of your choosing get called. Explicitly calling DESTROY is also possible, -but is usually never needed. - -Do not confuse the previous discussion with how objects I in the current -one are destroyed. Such objects will be freed and destroyed automatically -when the current object is freed, provided no other references to them exist -elsewhere. - -=head2 Summary - -That's about all there is to it. Now you need just to go off and buy a -book about object-oriented design methodology, and bang your forehead -with it for the next six months or so. - -=head2 Two-Phased Garbage Collection - -For most purposes, Perl uses a fast and simple, reference-based -garbage collection system. That means there's an extra -dereference going on at some level, so if you haven't built -your Perl executable using your C compiler's C<-O> flag, performance -will suffer. If you I built Perl with C, then this -probably won't matter. - -A more serious concern is that unreachable memory with a non-zero -reference count will not normally get freed. Therefore, this is a bad -idea: - - { - my $a; - $a = \$a; - } - -Even thought $a I go away, it can't. When building recursive data -structures, you'll have to break the self-reference yourself explicitly -if you don't care to leak. For example, here's a self-referential -node such as one might use in a sophisticated tree structure: - - sub new_node { - my $self = shift; - my $class = ref($self) || $self; - my $node = {}; - $node->{LEFT} = $node->{RIGHT} = $node; - $node->{DATA} = [ @_ ]; - return bless $node => $class; - } - -If you create nodes like that, they (currently) won't go away unless you -break their self reference yourself. (In other words, this is not to be -construed as a feature, and you shouldn't depend on it.) - -Almost. - -When an interpreter thread finally shuts down (usually when your program -exits), then a rather costly but complete mark-and-sweep style of garbage -collection is performed, and everything allocated by that thread gets -destroyed. This is essential to support Perl as an embedded or a -multithreadable language. For example, this program demonstrates Perl's -two-phased garbage collection: - - #!/usr/bin/perl - package Subtle; - - sub new { - my $test; - $test = \$test; - warn "CREATING " . \$test; - return bless \$test; - } - - sub DESTROY { - my $self = shift; - warn "DESTROYING $self"; - } - - package main; - - warn "starting program"; - { - my $a = Subtle->new; - my $b = Subtle->new; - $$a = 0; # break selfref - warn "leaving block"; - } - - warn "just exited block"; - warn "time to die..."; - exit; - -When run as F, the following output is produced: - - starting program at /tmp/test line 18. - CREATING SCALAR(0x8e5b8) at /tmp/test line 7. - CREATING SCALAR(0x8e57c) at /tmp/test line 7. - leaving block at /tmp/test line 23. - DESTROYING Subtle=SCALAR(0x8e5b8) at /tmp/test line 13. - just exited block at /tmp/test line 26. - time to die... at /tmp/test line 27. - DESTROYING Subtle=SCALAR(0x8e57c) during global destruction. - -Notice that "global destruction" bit there? That's the thread -garbage collector reaching the unreachable. - -Objects are always destructed, even when regular refs aren't. Objects -are destructed in a separate pass before ordinary refs just to -prevent object destructors from using refs that have been themselves -destructed. Plain refs are only garbage-collected if the destruct level -is greater than 0. You can test the higher levels of global destruction -by setting the PERL_DESTRUCT_LEVEL environment variable, presuming -C<-DDEBUGGING> was enabled during perl build time. - -A more complete garbage collection strategy will be implemented -at a future date. - -In the meantime, the best solution is to create a non-recursive container -class that holds a pointer to the self-referential data structure. -Define a DESTROY method for the containing object's class that manually -breaks the circularities in the self-referential structure. - -=head1 SEE ALSO - -A kinder, gentler tutorial on object-oriented programming in Perl can -be found in L, L and L. You should -also check out L for other object tricks, traps, and tips, as -well as L for some style guides on constructing both -modules and classes. diff --git a/lib/perl5/5.6.1/pods/perlop.pod b/lib/perl5/5.6.1/pods/perlop.pod deleted file mode 100644 index 9cae3a21..00000000 --- a/lib/perl5/5.6.1/pods/perlop.pod +++ /dev/null @@ -1,1936 +0,0 @@ -=head1 NAME - -perlop - Perl operators and precedence - -=head1 SYNOPSIS - -Perl operators have the following associativity and precedence, -listed from highest precedence to lowest. Operators borrowed from -C keep the same precedence relationship with each other, even where -C's precedence is slightly screwy. (This makes learning Perl easier -for C folks.) With very few exceptions, these all operate on scalar -values only, not array values. - - left terms and list operators (leftward) - left -> - nonassoc ++ -- - right ** - right ! ~ \ and unary + and - - left =~ !~ - left * / % x - left + - . - left << >> - nonassoc named unary operators - nonassoc < > <= >= lt gt le ge - nonassoc == != <=> eq ne cmp - left & - left | ^ - left && - left || - nonassoc .. ... - right ?: - right = += -= *= etc. - left , => - nonassoc list operators (rightward) - right not - left and - left or xor - -In the following sections, these operators are covered in precedence order. - -Many operators can be overloaded for objects. See L. - -=head1 DESCRIPTION - -=head2 Terms and List Operators (Leftward) - -A TERM has the highest precedence in Perl. They include variables, -quote and quote-like operators, any expression in parentheses, -and any function whose arguments are parenthesized. Actually, there -aren't really functions in this sense, just list operators and unary -operators behaving as functions because you put parentheses around -the arguments. These are all documented in L. - -If any list operator (print(), etc.) or any unary operator (chdir(), etc.) -is followed by a left parenthesis as the next token, the operator and -arguments within parentheses are taken to be of highest precedence, -just like a normal function call. - -In the absence of parentheses, the precedence of list operators such as -C, C, or C is either very high or very low depending on -whether you are looking at the left side or the right side of the operator. -For example, in - - @ary = (1, 3, sort 4, 2); - print @ary; # prints 1324 - -the commas on the right of the sort are evaluated before the sort, -but the commas on the left are evaluated after. In other words, -list operators tend to gobble up all arguments that follow, and -then act like a simple TERM with regard to the preceding expression. -Be careful with parentheses: - - # These evaluate exit before doing the print: - print($foo, exit); # Obviously not what you want. - print $foo, exit; # Nor is this. - - # These do the print before evaluating exit: - (print $foo), exit; # This is what you want. - print($foo), exit; # Or this. - print ($foo), exit; # Or even this. - -Also note that - - print ($foo & 255) + 1, "\n"; - -probably doesn't do what you expect at first glance. See -L for more discussion of this. - -Also parsed as terms are the C and C constructs, as -well as subroutine and method calls, and the anonymous -constructors C<[]> and C<{}>. - -See also L toward the end of this section, -as well as L<"I/O Operators">. - -=head2 The Arrow Operator - -"C<< -> >>" is an infix dereference operator, just as it is in C -and C++. If the right side is either a C<[...]>, C<{...}>, or a -C<(...)> subscript, then the left side must be either a hard or -symbolic reference to an array, a hash, or a subroutine respectively. -(Or technically speaking, a location capable of holding a hard -reference, if it's an array or hash reference being used for -assignment.) See L and L. - -Otherwise, the right side is a method name or a simple scalar -variable containing either the method name or a subroutine reference, -and the left side must be either an object (a blessed reference) -or a class name (that is, a package name). See L. - -=head2 Auto-increment and Auto-decrement - -"++" and "--" work as in C. That is, if placed before a variable, they -increment or decrement the variable before returning the value, and if -placed after, increment or decrement the variable after returning the value. - -The auto-increment operator has a little extra builtin magic to it. If -you increment a variable that is numeric, or that has ever been used in -a numeric context, you get a normal increment. If, however, the -variable has been used in only string contexts since it was set, and -has a value that is not the empty string and matches the pattern -C, the increment is done as a string, preserving each -character within its range, with carry: - - print ++($foo = '99'); # prints '100' - print ++($foo = 'a0'); # prints 'a1' - print ++($foo = 'Az'); # prints 'Ba' - print ++($foo = 'zz'); # prints 'aaa' - -The auto-decrement operator is not magical. - -=head2 Exponentiation - -Binary "**" is the exponentiation operator. It binds even more -tightly than unary minus, so -2**4 is -(2**4), not (-2)**4. (This is -implemented using C's pow(3) function, which actually works on doubles -internally.) - -=head2 Symbolic Unary Operators - -Unary "!" performs logical negation, i.e., "not". See also C for a lower -precedence version of this. - -Unary "-" performs arithmetic negation if the operand is numeric. If -the operand is an identifier, a string consisting of a minus sign -concatenated with the identifier is returned. Otherwise, if the string -starts with a plus or minus, a string starting with the opposite sign -is returned. One effect of these rules is that C<-bareword> is equivalent -to C<"-bareword">. - -Unary "~" performs bitwise negation, i.e., 1's complement. For -example, C<0666 & ~027> is 0640. (See also L and -L.) Note that the width of the result is -platform-dependent: ~0 is 32 bits wide on a 32-bit platform, but 64 -bits wide on a 64-bit platform, so if you are expecting a certain bit -width, remember use the & operator to mask off the excess bits. - -Unary "+" has no effect whatsoever, even on strings. It is useful -syntactically for separating a function name from a parenthesized expression -that would otherwise be interpreted as the complete list of function -arguments. (See examples above under L.) - -Unary "\" creates a reference to whatever follows it. See L -and L. Do not confuse this behavior with the behavior of -backslash within a string, although both forms do convey the notion -of protecting the next thing from interpolation. - -=head2 Binding Operators - -Binary "=~" binds a scalar expression to a pattern match. Certain operations -search or modify the string $_ by default. This operator makes that kind -of operation work on some other string. The right argument is a search -pattern, substitution, or transliteration. The left argument is what is -supposed to be searched, substituted, or transliterated instead of the default -$_. When used in scalar context, the return value generally indicates the -success of the operation. Behavior in list context depends on the particular -operator. See L for details. - -If the right argument is an expression rather than a search pattern, -substitution, or transliteration, it is interpreted as a search pattern at run -time. This can be less efficient than an explicit search, because the -pattern must be compiled every time the expression is evaluated. - -Binary "!~" is just like "=~" except the return value is negated in -the logical sense. - -=head2 Multiplicative Operators - -Binary "*" multiplies two numbers. - -Binary "/" divides two numbers. - -Binary "%" computes the modulus of two numbers. Given integer -operands C<$a> and C<$b>: If C<$b> is positive, then C<$a % $b> is -C<$a> minus the largest multiple of C<$b> that is not greater than -C<$a>. If C<$b> is negative, then C<$a % $b> is C<$a> minus the -smallest multiple of C<$b> that is not less than C<$a> (i.e. the -result will be less than or equal to zero). -Note than when C is in scope, "%" gives you direct access -to the modulus operator as implemented by your C compiler. This -operator is not as well defined for negative operands, but it will -execute faster. - -Binary "x" is the repetition operator. In scalar context or if the left -operand is not enclosed in parentheses, it returns a string consisting -of the left operand repeated the number of times specified by the right -operand. In list context, if the left operand is enclosed in -parentheses, it repeats the list. - - print '-' x 80; # print row of dashes - - print "\t" x ($tab/8), ' ' x ($tab%8); # tab over - - @ones = (1) x 80; # a list of 80 1's - @ones = (5) x @ones; # set all elements to 5 - - -=head2 Additive Operators - -Binary "+" returns the sum of two numbers. - -Binary "-" returns the difference of two numbers. - -Binary "." concatenates two strings. - -=head2 Shift Operators - -Binary "<<" returns the value of its left argument shifted left by the -number of bits specified by the right argument. Arguments should be -integers. (See also L.) - -Binary ">>" returns the value of its left argument shifted right by -the number of bits specified by the right argument. Arguments should -be integers. (See also L.) - -=head2 Named Unary Operators - -The various named unary operators are treated as functions with one -argument, with optional parentheses. These include the filetest -operators, like C<-f>, C<-M>, etc. See L. - -If any list operator (print(), etc.) or any unary operator (chdir(), etc.) -is followed by a left parenthesis as the next token, the operator and -arguments within parentheses are taken to be of highest precedence, -just like a normal function call. For example, -because named unary operators are higher precedence than ||: - - chdir $foo || die; # (chdir $foo) || die - chdir($foo) || die; # (chdir $foo) || die - chdir ($foo) || die; # (chdir $foo) || die - chdir +($foo) || die; # (chdir $foo) || die - -but, because * is higher precedence than named operators: - - chdir $foo * 20; # chdir ($foo * 20) - chdir($foo) * 20; # (chdir $foo) * 20 - chdir ($foo) * 20; # (chdir $foo) * 20 - chdir +($foo) * 20; # chdir ($foo * 20) - - rand 10 * 20; # rand (10 * 20) - rand(10) * 20; # (rand 10) * 20 - rand (10) * 20; # (rand 10) * 20 - rand +(10) * 20; # rand (10 * 20) - -See also L<"Terms and List Operators (Leftward)">. - -=head2 Relational Operators - -Binary "<" returns true if the left argument is numerically less than -the right argument. - -Binary ">" returns true if the left argument is numerically greater -than the right argument. - -Binary "<=" returns true if the left argument is numerically less than -or equal to the right argument. - -Binary ">=" returns true if the left argument is numerically greater -than or equal to the right argument. - -Binary "lt" returns true if the left argument is stringwise less than -the right argument. - -Binary "gt" returns true if the left argument is stringwise greater -than the right argument. - -Binary "le" returns true if the left argument is stringwise less than -or equal to the right argument. - -Binary "ge" returns true if the left argument is stringwise greater -than or equal to the right argument. - -=head2 Equality Operators - -Binary "==" returns true if the left argument is numerically equal to -the right argument. - -Binary "!=" returns true if the left argument is numerically not equal -to the right argument. - -Binary "<=>" returns -1, 0, or 1 depending on whether the left -argument is numerically less than, equal to, or greater than the right -argument. If your platform supports NaNs (not-a-numbers) as numeric -values, using them with "<=>" returns undef. NaN is not "<", "==", ">", -"<=" or ">=" anything (even NaN), so those 5 return false. NaN != NaN -returns true, as does NaN != anything else. If your platform doesn't -support NaNs then NaN is just a string with numeric value 0. - - perl -le '$a = NaN; print "No NaN support here" if $a == $a' - perl -le '$a = NaN; print "NaN support here" if $a != $a' - -Binary "eq" returns true if the left argument is stringwise equal to -the right argument. - -Binary "ne" returns true if the left argument is stringwise not equal -to the right argument. - -Binary "cmp" returns -1, 0, or 1 depending on whether the left -argument is stringwise less than, equal to, or greater than the right -argument. - -"lt", "le", "ge", "gt" and "cmp" use the collation (sort) order specified -by the current locale if C is in effect. See L. - -=head2 Bitwise And - -Binary "&" returns its operators ANDed together bit by bit. -(See also L and L.) - -=head2 Bitwise Or and Exclusive Or - -Binary "|" returns its operators ORed together bit by bit. -(See also L and L.) - -Binary "^" returns its operators XORed together bit by bit. -(See also L and L.) - -=head2 C-style Logical And - -Binary "&&" performs a short-circuit logical AND operation. That is, -if the left operand is false, the right operand is not even evaluated. -Scalar or list context propagates down to the right operand if it -is evaluated. - -=head2 C-style Logical Or - -Binary "||" performs a short-circuit logical OR operation. That is, -if the left operand is true, the right operand is not even evaluated. -Scalar or list context propagates down to the right operand if it -is evaluated. - -The C<||> and C<&&> operators differ from C's in that, rather than returning -0 or 1, they return the last value evaluated. Thus, a reasonably portable -way to find out the home directory (assuming it's not "0") might be: - - $home = $ENV{'HOME'} || $ENV{'LOGDIR'} || - (getpwuid($<))[7] || die "You're homeless!\n"; - -In particular, this means that you shouldn't use this -for selecting between two aggregates for assignment: - - @a = @b || @c; # this is wrong - @a = scalar(@b) || @c; # really meant this - @a = @b ? @b : @c; # this works fine, though - -As more readable alternatives to C<&&> and C<||> when used for -control flow, Perl provides C and C operators (see below). -The short-circuit behavior is identical. The precedence of "and" and -"or" is much lower, however, so that you can safely use them after a -list operator without the need for parentheses: - - unlink "alpha", "beta", "gamma" - or gripe(), next LINE; - -With the C-style operators that would have been written like this: - - unlink("alpha", "beta", "gamma") - || (gripe(), next LINE); - -Using "or" for assignment is unlikely to do what you want; see below. - -=head2 Range Operators - -Binary ".." is the range operator, which is really two different -operators depending on the context. In list context, it returns an -array of values counting (up by ones) from the left value to the right -value. If the left value is greater than the right value then it -returns the empty array. The range operator is useful for writing -C loops and for doing slice operations on arrays. In -the current implementation, no temporary array is created when the -range operator is used as the expression in C loops, but older -versions of Perl might burn a lot of memory when you write something -like this: - - for (1 .. 1_000_000) { - # code - } - -In scalar context, ".." returns a boolean value. The operator is -bistable, like a flip-flop, and emulates the line-range (comma) operator -of B, B, and various editors. Each ".." operator maintains its -own boolean state. It is false as long as its left operand is false. -Once the left operand is true, the range operator stays true until the -right operand is true, I which the range operator becomes false -again. It doesn't become false till the next time the range operator is -evaluated. It can test the right operand and become false on the same -evaluation it became true (as in B), but it still returns true once. -If you don't want it to test the right operand till the next -evaluation, as in B, just use three dots ("...") instead of -two. In all other regards, "..." behaves just like ".." does. - -The right operand is not evaluated while the operator is in the -"false" state, and the left operand is not evaluated while the -operator is in the "true" state. The precedence is a little lower -than || and &&. The value returned is either the empty string for -false, or a sequence number (beginning with 1) for true. The -sequence number is reset for each range encountered. The final -sequence number in a range has the string "E0" appended to it, which -doesn't affect its numeric value, but gives you something to search -for if you want to exclude the endpoint. You can exclude the -beginning point by waiting for the sequence number to be greater -than 1. If either operand of scalar ".." is a constant expression, -that operand is implicitly compared to the C<$.> variable, the -current line number. Examples: - -As a scalar operator: - - if (101 .. 200) { print; } # print 2nd hundred lines - next line if (1 .. /^$/); # skip header lines - s/^/> / if (/^$/ .. eof()); # quote body - - # parse mail messages - while (<>) { - $in_header = 1 .. /^$/; - $in_body = /^$/ .. eof(); - # do something based on those - } continue { - close ARGV if eof; # reset $. each file - } - -As a list operator: - - for (101 .. 200) { print; } # print $_ 100 times - @foo = @foo[0 .. $#foo]; # an expensive no-op - @foo = @foo[$#foo-4 .. $#foo]; # slice last 5 items - -The range operator (in list context) makes use of the magical -auto-increment algorithm if the operands are strings. You -can say - - @alphabet = ('A' .. 'Z'); - -to get all normal letters of the alphabet, or - - $hexdigit = (0 .. 9, 'a' .. 'f')[$num & 15]; - -to get a hexadecimal digit, or - - @z2 = ('01' .. '31'); print $z2[$mday]; - -to get dates with leading zeros. If the final value specified is not -in the sequence that the magical increment would produce, the sequence -goes until the next value would be longer than the final value -specified. - -=head2 Conditional Operator - -Ternary "?:" is the conditional operator, just as in C. It works much -like an if-then-else. If the argument before the ? is true, the -argument before the : is returned, otherwise the argument after the : -is returned. For example: - - printf "I have %d dog%s.\n", $n, - ($n == 1) ? '' : "s"; - -Scalar or list context propagates downward into the 2nd -or 3rd argument, whichever is selected. - - $a = $ok ? $b : $c; # get a scalar - @a = $ok ? @b : @c; # get an array - $a = $ok ? @b : @c; # oops, that's just a count! - -The operator may be assigned to if both the 2nd and 3rd arguments are -legal lvalues (meaning that you can assign to them): - - ($a_or_b ? $a : $b) = $c; - -Because this operator produces an assignable result, using assignments -without parentheses will get you in trouble. For example, this: - - $a % 2 ? $a += 10 : $a += 2 - -Really means this: - - (($a % 2) ? ($a += 10) : $a) += 2 - -Rather than this: - - ($a % 2) ? ($a += 10) : ($a += 2) - -That should probably be written more simply as: - - $a += ($a % 2) ? 10 : 2; - -=head2 Assignment Operators - -"=" is the ordinary assignment operator. - -Assignment operators work as in C. That is, - - $a += 2; - -is equivalent to - - $a = $a + 2; - -although without duplicating any side effects that dereferencing the lvalue -might trigger, such as from tie(). Other assignment operators work similarly. -The following are recognized: - - **= += *= &= <<= &&= - -= /= |= >>= ||= - .= %= ^= - x= - -Although these are grouped by family, they all have the precedence -of assignment. - -Unlike in C, the scalar assignment operator produces a valid lvalue. -Modifying an assignment is equivalent to doing the assignment and -then modifying the variable that was assigned to. This is useful -for modifying a copy of something, like this: - - ($tmp = $global) =~ tr [A-Z] [a-z]; - -Likewise, - - ($a += 2) *= 3; - -is equivalent to - - $a += 2; - $a *= 3; - -Similarly, a list assignment in list context produces the list of -lvalues assigned to, and a list assignment in scalar context returns -the number of elements produced by the expression on the right hand -side of the assignment. - -=head2 Comma Operator - -Binary "," is the comma operator. In scalar context it evaluates -its left argument, throws that value away, then evaluates its right -argument and returns that value. This is just like C's comma operator. - -In list context, it's just the list argument separator, and inserts -both its arguments into the list. - -The => digraph is mostly just a synonym for the comma operator. It's useful for -documenting arguments that come in pairs. As of release 5.001, it also forces -any word to the left of it to be interpreted as a string. - -=head2 List Operators (Rightward) - -On the right side of a list operator, it has very low precedence, -such that it controls all comma-separated expressions found there. -The only operators with lower precedence are the logical operators -"and", "or", and "not", which may be used to evaluate calls to list -operators without the need for extra parentheses: - - open HANDLE, "filename" - or die "Can't open: $!\n"; - -See also discussion of list operators in L. - -=head2 Logical Not - -Unary "not" returns the logical negation of the expression to its right. -It's the equivalent of "!" except for the very low precedence. - -=head2 Logical And - -Binary "and" returns the logical conjunction of the two surrounding -expressions. It's equivalent to && except for the very low -precedence. This means that it short-circuits: i.e., the right -expression is evaluated only if the left expression is true. - -=head2 Logical or and Exclusive Or - -Binary "or" returns the logical disjunction of the two surrounding -expressions. It's equivalent to || except for the very low precedence. -This makes it useful for control flow - - print FH $data or die "Can't write to FH: $!"; - -This means that it short-circuits: i.e., the right expression is evaluated -only if the left expression is false. Due to its precedence, you should -probably avoid using this for assignment, only for control flow. - - $a = $b or $c; # bug: this is wrong - ($a = $b) or $c; # really means this - $a = $b || $c; # better written this way - -However, when it's a list-context assignment and you're trying to use -"||" for control flow, you probably need "or" so that the assignment -takes higher precedence. - - @info = stat($file) || die; # oops, scalar sense of stat! - @info = stat($file) or die; # better, now @info gets its due - -Then again, you could always use parentheses. - -Binary "xor" returns the exclusive-OR of the two surrounding expressions. -It cannot short circuit, of course. - -=head2 C Operators Missing From Perl - -Here is what C has that Perl doesn't: - -=over 8 - -=item unary & - -Address-of operator. (But see the "\" operator for taking a reference.) - -=item unary * - -Dereference-address operator. (Perl's prefix dereferencing -operators are typed: $, @, %, and &.) - -=item (TYPE) - -Type-casting operator. - -=back - -=head2 Quote and Quote-like Operators - -While we usually think of quotes as literal values, in Perl they -function as operators, providing various kinds of interpolating and -pattern matching capabilities. Perl provides customary quote characters -for these behaviors, but also provides a way for you to choose your -quote character for any of them. In the following table, a C<{}> represents -any pair of delimiters you choose. - - Customary Generic Meaning Interpolates - '' q{} Literal no - "" qq{} Literal yes - `` qx{} Command yes (unless '' is delimiter) - qw{} Word list no - // m{} Pattern match yes (unless '' is delimiter) - qr{} Pattern yes (unless '' is delimiter) - s{}{} Substitution yes (unless '' is delimiter) - tr{}{} Transliteration no (but see below) - -Non-bracketing delimiters use the same character fore and aft, but the four -sorts of brackets (round, angle, square, curly) will all nest, which means -that - - q{foo{bar}baz} - -is the same as - - 'foo{bar}baz' - -Note, however, that this does not always work for quoting Perl code: - - $s = q{ if($a eq "}") ... }; # WRONG - -is a syntax error. The C module on CPAN is able to do this -properly. - -There can be whitespace between the operator and the quoting -characters, except when C<#> is being used as the quoting character. -C is parsed as the string C, while C is the -operator C followed by a comment. Its argument will be taken -from the next line. This allows you to write: - - s {foo} # Replace foo - {bar} # with bar. - -For constructs that do interpolate, variables beginning with "C<$>" -or "C<@>" are interpolated, as are the following escape sequences. Within -a transliteration, the first eleven of these sequences may be used. - - \t tab (HT, TAB) - \n newline (NL) - \r return (CR) - \f form feed (FF) - \b backspace (BS) - \a alarm (bell) (BEL) - \e escape (ESC) - \033 octal char (ESC) - \x1b hex char (ESC) - \x{263a} wide hex char (SMILEY) - \c[ control char (ESC) - \N{name} named char - - \l lowercase next char - \u uppercase next char - \L lowercase till \E - \U uppercase till \E - \E end case modification - \Q quote non-word characters till \E - -If C is in effect, the case map used by C<\l>, C<\L>, C<\u> -and C<\U> is taken from the current locale. See L. For -documentation of C<\N{name}>, see L. - -All systems use the virtual C<"\n"> to represent a line terminator, -called a "newline". There is no such thing as an unvarying, physical -newline character. It is only an illusion that the operating system, -device drivers, C libraries, and Perl all conspire to preserve. Not all -systems read C<"\r"> as ASCII CR and C<"\n"> as ASCII LF. For example, -on a Mac, these are reversed, and on systems without line terminator, -printing C<"\n"> may emit no actual data. In general, use C<"\n"> when -you mean a "newline" for your system, but use the literal ASCII when you -need an exact character. For example, most networking protocols expect -and prefer a CR+LF (C<"\015\012"> or C<"\cM\cJ">) for line terminators, -and although they often accept just C<"\012">, they seldom tolerate just -C<"\015">. If you get in the habit of using C<"\n"> for networking, -you may be burned some day. - -You cannot include a literal C<$> or C<@> within a C<\Q> sequence. -An unescaped C<$> or C<@> interpolates the corresponding variable, -while escaping will cause the literal string C<\$> to be inserted. -You'll need to write something like C. - -Patterns are subject to an additional level of interpretation as a -regular expression. This is done as a second pass, after variables are -interpolated, so that regular expressions may be incorporated into the -pattern from the variables. If this is not what you want, use C<\Q> to -interpolate a variable literally. - -Apart from the behavior described above, Perl does not expand -multiple levels of interpolation. In particular, contrary to the -expectations of shell programmers, back-quotes do I interpolate -within double quotes, nor do single quotes impede evaluation of -variables when used within double quotes. - -=head2 Regexp Quote-Like Operators - -Here are the quote-like operators that apply to pattern -matching and related activities. - -=over 8 - -=item ?PATTERN? - -This is just like the C search, except that it matches only -once between calls to the reset() operator. This is a useful -optimization when you want to see only the first occurrence of -something in each file of a set of files, for instance. Only C -patterns local to the current package are reset. - - while (<>) { - if (?^$?) { - # blank line between header and body - } - } continue { - reset if eof; # clear ?? status for next file - } - -This usage is vaguely deprecated, which means it just might possibly -be removed in some distant future version of Perl, perhaps somewhere -around the year 2168. - -=item m/PATTERN/cgimosx - -=item /PATTERN/cgimosx - -Searches a string for a pattern match, and in scalar context returns -true if it succeeds, false if it fails. If no string is specified -via the C<=~> or C operator, the $_ string is searched. (The -string specified with C<=~> need not be an lvalue--it may be the -result of an expression evaluation, but remember the C<=~> binds -rather tightly.) See also L. See L for -discussion of additional considerations that apply when C -is in effect. - -Options are: - - c Do not reset search position on a failed match when /g is in effect. - g Match globally, i.e., find all occurrences. - i Do case-insensitive pattern matching. - m Treat string as multiple lines. - o Compile pattern only once. - s Treat string as single line. - x Use extended regular expressions. - -If "/" is the delimiter then the initial C is optional. With the C -you can use any pair of non-alphanumeric, non-whitespace characters -as delimiters. This is particularly useful for matching path names -that contain "/", to avoid LTS (leaning toothpick syndrome). If "?" is -the delimiter, then the match-only-once rule of C applies. -If "'" is the delimiter, no interpolation is performed on the PATTERN. - -PATTERN may contain variables, which will be interpolated (and the -pattern recompiled) every time the pattern search is evaluated, except -for when the delimiter is a single quote. (Note that C<$(>, C<$)>, and -C<$|> are not interpolated because they look like end-of-string tests.) -If you want such a pattern to be compiled only once, add a C after -the trailing delimiter. This avoids expensive run-time recompilations, -and is useful when the value you are interpolating won't change over -the life of the script. However, mentioning C constitutes a promise -that you won't change the variables in the pattern. If you change them, -Perl won't even notice. See also L<"qr/STRING/imosx">. - -If the PATTERN evaluates to the empty string, the last -I matched regular expression is used instead. - -If the C option is not used, C in list context returns a -list consisting of the subexpressions matched by the parentheses in the -pattern, i.e., (C<$1>, C<$2>, C<$3>...). (Note that here C<$1> etc. are -also set, and that this differs from Perl 4's behavior.) When there are -no parentheses in the pattern, the return value is the list C<(1)> for -success. With or without parentheses, an empty list is returned upon -failure. - -Examples: - - open(TTY, '/dev/tty'); - =~ /^y/i && foo(); # do foo if desired - - if (/Version: *([0-9.]*)/) { $version = $1; } - - next if m#^/usr/spool/uucp#; - - # poor man's grep - $arg = shift; - while (<>) { - print if /$arg/o; # compile only once - } - - if (($F1, $F2, $Etc) = ($foo =~ /^(\S+)\s+(\S+)\s*(.*)/)) - -This last example splits $foo into the first two words and the -remainder of the line, and assigns those three fields to $F1, $F2, and -$Etc. The conditional is true if any variables were assigned, i.e., if -the pattern matched. - -The C modifier specifies global pattern matching--that is, -matching as many times as possible within the string. How it behaves -depends on the context. In list context, it returns a list of the -substrings matched by any capturing parentheses in the regular -expression. If there are no parentheses, it returns a list of all -the matched strings, as if there were parentheses around the whole -pattern. - -In scalar context, each execution of C finds the next match, -returning true if it matches, and false if there is no further match. -The position after the last match can be read or set using the pos() -function; see L. A failed match normally resets the -search position to the beginning of the string, but you can avoid that -by adding the C modifier (e.g. C). Modifying the target -string also resets the search position. - -You can intermix C matches with C, where C<\G> is a -zero-width assertion that matches the exact position where the previous -C, if any, left off. Without the C modifier, the C<\G> assertion -still anchors at pos(), but the match is of course only attempted once. -Using C<\G> without C on a target string that has not previously had a -C match applied to it is the same as using the C<\A> assertion to match -the beginning of the string. - -Examples: - - # list context - ($one,$five,$fifteen) = (`uptime` =~ /(\d+\.\d+)/g); - - # scalar context - $/ = ""; - while (defined($paragraph = <>)) { - while ($paragraph =~ /[a-z]['")]*[.!?]+['")]*\s/g) { - $sentences++; - } - } - print "$sentences\n"; - - # using m//gc with \G - $_ = "ppooqppqq"; - while ($i++ < 2) { - print "1: '"; - print $1 while /(o)/gc; print "', pos=", pos, "\n"; - print "2: '"; - print $1 if /\G(q)/gc; print "', pos=", pos, "\n"; - print "3: '"; - print $1 while /(p)/gc; print "', pos=", pos, "\n"; - } - print "Final: '$1', pos=",pos,"\n" if /\G(.)/; - -The last example should print: - - 1: 'oo', pos=4 - 2: 'q', pos=5 - 3: 'pp', pos=7 - 1: '', pos=7 - 2: 'q', pos=8 - 3: '', pos=8 - Final: 'q', pos=8 - -Notice that the final match matched C instead of C

    , which a match -without the C<\G> anchor would have done. Also note that the final match -did not update C -- C is only updated on a C match. If the -final match did indeed match C

    , it's a good bet that you're running an -older (pre-5.6.0) Perl. - -A useful idiom for C-like scanners is C. You can -combine several regexps like this to process a string part-by-part, -doing different actions depending on which regexp matched. Each -regexp tries to match where the previous one leaves off. - - $_ = <<'EOL'; - $url = new URI::URL "http://www/"; die if $url eq "xXx"; - EOL - LOOP: - { - print(" digits"), redo LOOP if /\G\d+\b[,.;]?\s*/gc; - print(" lowercase"), redo LOOP if /\G[a-z]+\b[,.;]?\s*/gc; - print(" UPPERCASE"), redo LOOP if /\G[A-Z]+\b[,.;]?\s*/gc; - print(" Capitalized"), redo LOOP if /\G[A-Z][a-z]+\b[,.;]?\s*/gc; - print(" MiXeD"), redo LOOP if /\G[A-Za-z]+\b[,.;]?\s*/gc; - print(" alphanumeric"), redo LOOP if /\G[A-Za-z0-9]+\b[,.;]?\s*/gc; - print(" line-noise"), redo LOOP if /\G[^A-Za-z0-9]+/gc; - print ". That's all!\n"; - } - -Here is the output (split into several lines): - - line-noise lowercase line-noise lowercase UPPERCASE line-noise - UPPERCASE line-noise lowercase line-noise lowercase line-noise - lowercase lowercase line-noise lowercase lowercase line-noise - MiXeD line-noise. That's all! - -=item q/STRING/ - -=item C<'STRING'> - -A single-quoted, literal string. A backslash represents a backslash -unless followed by the delimiter or another backslash, in which case -the delimiter or backslash is interpolated. - - $foo = q!I said, "You said, 'She said it.'"!; - $bar = q('This is it.'); - $baz = '\n'; # a two-character string - -=item qq/STRING/ - -=item "STRING" - -A double-quoted, interpolated string. - - $_ .= qq - (*** The previous line contains the naughty word "$1".\n) - if /\b(tcl|java|python)\b/i; # :-) - $baz = "\n"; # a one-character string - -=item qr/STRING/imosx - -This operator quotes (and possibly compiles) its I as a regular -expression. I is interpolated the same way as I -in C. If "'" is used as the delimiter, no interpolation -is done. Returns a Perl value which may be used instead of the -corresponding C expression. - -For example, - - $rex = qr/my.STRING/is; - s/$rex/foo/; - -is equivalent to - - s/my.STRING/foo/is; - -The result may be used as a subpattern in a match: - - $re = qr/$pattern/; - $string =~ /foo${re}bar/; # can be interpolated in other patterns - $string =~ $re; # or used standalone - $string =~ /$re/; # or this way - -Since Perl may compile the pattern at the moment of execution of qr() -operator, using qr() may have speed advantages in some situations, -notably if the result of qr() is used standalone: - - sub match { - my $patterns = shift; - my @compiled = map qr/$_/i, @$patterns; - grep { - my $success = 0; - foreach my $pat (@compiled) { - $success = 1, last if /$pat/; - } - $success; - } @_; - } - -Precompilation of the pattern into an internal representation at -the moment of qr() avoids a need to recompile the pattern every -time a match C is attempted. (Perl has many other internal -optimizations, but none would be triggered in the above example if -we did not use qr() operator.) - -Options are: - - i Do case-insensitive pattern matching. - m Treat string as multiple lines. - o Compile pattern only once. - s Treat string as single line. - x Use extended regular expressions. - -See L for additional information on valid syntax for STRING, and -for a detailed look at the semantics of regular expressions. - -=item qx/STRING/ - -=item `STRING` - -A string which is (possibly) interpolated and then executed as a -system command with C or its equivalent. Shell wildcards, -pipes, and redirections will be honored. The collected standard -output of the command is returned; standard error is unaffected. In -scalar context, it comes back as a single (potentially multi-line) -string, or undef if the command failed. In list context, returns a -list of lines (however you've defined lines with $/ or -$INPUT_RECORD_SEPARATOR), or an empty list if the command failed. - -Because backticks do not affect standard error, use shell file descriptor -syntax (assuming the shell supports this) if you care to address this. -To capture a command's STDERR and STDOUT together: - - $output = `cmd 2>&1`; - -To capture a command's STDOUT but discard its STDERR: - - $output = `cmd 2>/dev/null`; - -To capture a command's STDERR but discard its STDOUT (ordering is -important here): - - $output = `cmd 2>&1 1>/dev/null`; - -To exchange a command's STDOUT and STDERR in order to capture the STDERR -but leave its STDOUT to come out the old STDERR: - - $output = `cmd 3>&1 1>&2 2>&3 3>&-`; - -To read both a command's STDOUT and its STDERR separately, it's easiest -and safest to redirect them separately to files, and then read from those -files when the program is done: - - system("program args 1>/tmp/program.stdout 2>/tmp/program.stderr"); - -Using single-quote as a delimiter protects the command from Perl's -double-quote interpolation, passing it on to the shell instead: - - $perl_info = qx(ps $$); # that's Perl's $$ - $shell_info = qx'ps $$'; # that's the new shell's $$ - -How that string gets evaluated is entirely subject to the command -interpreter on your system. On most platforms, you will have to protect -shell metacharacters if you want them treated literally. This is in -practice difficult to do, as it's unclear how to escape which characters. -See L for a clean and safe example of a manual fork() and exec() -to emulate backticks safely. - -On some platforms (notably DOS-like ones), the shell may not be -capable of dealing with multiline commands, so putting newlines in -the string may not get you what you want. You may be able to evaluate -multiple commands in a single line by separating them with the command -separator character, if your shell supports that (e.g. C<;> on many Unix -shells; C<&> on the Windows NT C shell). - -Beginning with v5.6.0, Perl will attempt to flush all files opened for -output before starting the child process, but this may not be supported -on some platforms (see L). To be safe, you may need to set -C<$|> ($AUTOFLUSH in English) or call the C method of -C on any open handles. - -Beware that some command shells may place restrictions on the length -of the command line. You must ensure your strings don't exceed this -limit after any necessary interpolations. See the platform-specific -release notes for more details about your particular environment. - -Using this operator can lead to programs that are difficult to port, -because the shell commands called vary between systems, and may in -fact not be present at all. As one example, the C command under -the POSIX shell is very different from the C command under DOS. -That doesn't mean you should go out of your way to avoid backticks -when they're the right way to get something done. Perl was made to be -a glue language, and one of the things it glues together is commands. -Just understand what you're getting yourself into. - -See L<"I/O Operators"> for more discussion. - -=item qw/STRING/ - -Evaluates to a list of the words extracted out of STRING, using embedded -whitespace as the word delimiters. It can be understood as being roughly -equivalent to: - - split(' ', q/STRING/); - -the difference being that it generates a real list at compile time. So -this expression: - - qw(foo bar baz) - -is semantically equivalent to the list: - - 'foo', 'bar', 'baz' - -Some frequently seen examples: - - use POSIX qw( setlocale localeconv ) - @EXPORT = qw( foo bar baz ); - -A common mistake is to try to separate the words with comma or to -put comments into a multi-line C-string. For this reason, the -C pragma and the B<-w> switch (that is, the C<$^W> variable) -produces warnings if the STRING contains the "," or the "#" character. - -=item s/PATTERN/REPLACEMENT/egimosx - -Searches a string for a pattern, and if found, replaces that pattern -with the replacement text and returns the number of substitutions -made. Otherwise it returns false (specifically, the empty string). - -If no string is specified via the C<=~> or C operator, the C<$_> -variable is searched and modified. (The string specified with C<=~> must -be scalar variable, an array element, a hash element, or an assignment -to one of those, i.e., an lvalue.) - -If the delimiter chosen is a single quote, no interpolation is -done on either the PATTERN or the REPLACEMENT. Otherwise, if the -PATTERN contains a $ that looks like a variable rather than an -end-of-string test, the variable will be interpolated into the pattern -at run-time. If you want the pattern compiled only once the first time -the variable is interpolated, use the C option. If the pattern -evaluates to the empty string, the last successfully executed regular -expression is used instead. See L for further explanation on these. -See L for discussion of additional considerations that apply -when C is in effect. - -Options are: - - e Evaluate the right side as an expression. - g Replace globally, i.e., all occurrences. - i Do case-insensitive pattern matching. - m Treat string as multiple lines. - o Compile pattern only once. - s Treat string as single line. - x Use extended regular expressions. - -Any non-alphanumeric, non-whitespace delimiter may replace the -slashes. If single quotes are used, no interpretation is done on the -replacement string (the C modifier overrides this, however). Unlike -Perl 4, Perl 5 treats backticks as normal delimiters; the replacement -text is not evaluated as a command. If the -PATTERN is delimited by bracketing quotes, the REPLACEMENT has its own -pair of quotes, which may or may not be bracketing quotes, e.g., -C or C<< s/bar/ >>. A C will cause the -replacement portion to be treated as a full-fledged Perl expression -and evaluated right then and there. It is, however, syntax checked at -compile-time. A second C modifier will cause the replacement portion -to be Ced before being run as a Perl expression. - -Examples: - - s/\bgreen\b/mauve/g; # don't change wintergreen - - $path =~ s|/usr/bin|/usr/local/bin|; - - s/Login: $foo/Login: $bar/; # run-time pattern - - ($foo = $bar) =~ s/this/that/; # copy first, then change - - $count = ($paragraph =~ s/Mister\b/Mr./g); # get change-count - - $_ = 'abc123xyz'; - s/\d+/$&*2/e; # yields 'abc246xyz' - s/\d+/sprintf("%5d",$&)/e; # yields 'abc 246xyz' - s/\w/$& x 2/eg; # yields 'aabbcc 224466xxyyzz' - - s/%(.)/$percent{$1}/g; # change percent escapes; no /e - s/%(.)/$percent{$1} || $&/ge; # expr now, so /e - s/^=(\w+)/&pod($1)/ge; # use function call - - # expand variables in $_, but dynamics only, using - # symbolic dereferencing - s/\$(\w+)/${$1}/g; - - # Add one to the value of any numbers in the string - s/(\d+)/1 + $1/eg; - - # This will expand any embedded scalar variable - # (including lexicals) in $_ : First $1 is interpolated - # to the variable name, and then evaluated - s/(\$\w+)/$1/eeg; - - # Delete (most) C comments. - $program =~ s { - /\* # Match the opening delimiter. - .*? # Match a minimal number of characters. - \*/ # Match the closing delimiter. - } []gsx; - - s/^\s*(.*?)\s*$/$1/; # trim white space in $_, expensively - - for ($variable) { # trim white space in $variable, cheap - s/^\s+//; - s/\s+$//; - } - - s/([^ ]*) *([^ ]*)/$2 $1/; # reverse 1st two fields - -Note the use of $ instead of \ in the last example. Unlike -B, we use the \> form in only the left hand side. -Anywhere else it's $>. - -Occasionally, you can't use just a C to get all the changes -to occur that you might want. Here are two common cases: - - # put commas in the right places in an integer - 1 while s/(\d)(\d\d\d)(?!\d)/$1,$2/g; - - # expand tabs to 8-column spacing - 1 while s/\t+/' ' x (length($&)*8 - length($`)%8)/e; - -=item tr/SEARCHLIST/REPLACEMENTLIST/cds - -=item y/SEARCHLIST/REPLACEMENTLIST/cds - -Transliterates all occurrences of the characters found in the search list -with the corresponding character in the replacement list. It returns -the number of characters replaced or deleted. If no string is -specified via the =~ or !~ operator, the $_ string is transliterated. (The -string specified with =~ must be a scalar variable, an array element, a -hash element, or an assignment to one of those, i.e., an lvalue.) - -A character range may be specified with a hyphen, so C -does the same replacement as C. -For B devotees, C is provided as a synonym for C. If the -SEARCHLIST is delimited by bracketing quotes, the REPLACEMENTLIST has -its own pair of quotes, which may or may not be bracketing quotes, -e.g., C or C. - -Note that C does B do regular expression character classes -such as C<\d> or C<[:lower:]>. The operator is not equivalent to -the tr(1) utility. If you want to map strings between lower/upper -cases, see L and L, and in general consider -using the C operator if you need regular expressions. - -Note also that the whole range idea is rather unportable between -character sets--and even within character sets they may cause results -you probably didn't expect. A sound principle is to use only ranges -that begin from and end at either alphabets of equal case (a-e, A-E), -or digits (0-4). Anything else is unsafe. If in doubt, spell out the -character sets in full. - -Options: - - c Complement the SEARCHLIST. - d Delete found but unreplaced characters. - s Squash duplicate replaced characters. - -If the C modifier is specified, the SEARCHLIST character set -is complemented. If the C modifier is specified, any characters -specified by SEARCHLIST not found in REPLACEMENTLIST are deleted. -(Note that this is slightly more flexible than the behavior of some -B programs, which delete anything they find in the SEARCHLIST, -period.) If the C modifier is specified, sequences of characters -that were transliterated to the same character are squashed down -to a single instance of the character. - -If the C modifier is used, the REPLACEMENTLIST is always interpreted -exactly as specified. Otherwise, if the REPLACEMENTLIST is shorter -than the SEARCHLIST, the final character is replicated till it is long -enough. If the REPLACEMENTLIST is empty, the SEARCHLIST is replicated. -This latter is useful for counting characters in a class or for -squashing character sequences in a class. - -Examples: - - $ARGV[1] =~ tr/A-Z/a-z/; # canonicalize to lower case - - $cnt = tr/*/*/; # count the stars in $_ - - $cnt = $sky =~ tr/*/*/; # count the stars in $sky - - $cnt = tr/0-9//; # count the digits in $_ - - tr/a-zA-Z//s; # bookkeeper -> bokeper - - ($HOST = $host) =~ tr/a-z/A-Z/; - - tr/a-zA-Z/ /cs; # change non-alphas to single space - - tr [\200-\377] - [\000-\177]; # delete 8th bit - -If multiple transliterations are given for a character, only the -first one is used: - - tr/AAA/XYZ/ - -will transliterate any A to X. - -Because the transliteration table is built at compile time, neither -the SEARCHLIST nor the REPLACEMENTLIST are subjected to double quote -interpolation. That means that if you want to use variables, you -must use an eval(): - - eval "tr/$oldlist/$newlist/"; - die $@ if $@; - - eval "tr/$oldlist/$newlist/, 1" or die $@; - -=back - -=head2 Gory details of parsing quoted constructs - -When presented with something that might have several different -interpretations, Perl uses the B (that's "Do What I Mean") -principle to pick the most probable interpretation. This strategy -is so successful that Perl programmers often do not suspect the -ambivalence of what they write. But from time to time, Perl's -notions differ substantially from what the author honestly meant. - -This section hopes to clarify how Perl handles quoted constructs. -Although the most common reason to learn this is to unravel labyrinthine -regular expressions, because the initial steps of parsing are the -same for all quoting operators, they are all discussed together. - -The most important Perl parsing rule is the first one discussed -below: when processing a quoted construct, Perl first finds the end -of that construct, then interprets its contents. If you understand -this rule, you may skip the rest of this section on the first -reading. The other rules are likely to contradict the user's -expectations much less frequently than this first one. - -Some passes discussed below are performed concurrently, but because -their results are the same, we consider them individually. For different -quoting constructs, Perl performs different numbers of passes, from -one to five, but these passes are always performed in the same order. - -=over 4 - -=item Finding the end - -The first pass is finding the end of the quoted construct, whether -it be a multicharacter delimiter C<"\nEOF\n"> in the C<< -construct, a C that terminates a C construct, a C<]> which -terminates C construct, or a C<< > >> which terminates a -fileglob started with C<< < >>. - -When searching for single-character non-pairing delimiters, such -as C, combinations of C<\\> and C<\/> are skipped. However, -when searching for single-character pairing delimiter like C<[>, -combinations of C<\\>, C<\]>, and C<\[> are all skipped, and nested -C<[>, C<]> are skipped as well. When searching for multicharacter -delimiters, nothing is skipped. - -For constructs with three-part delimiters (C, C, and -C), the search is repeated once more. - -During this search no attention is paid to the semantics of the construct. -Thus: - - "$hash{"$foo/$bar"}" - -or: - - m/ - bar # NOT a comment, this slash / terminated m//! - /x - -do not form legal quoted expressions. The quoted part ends on the -first C<"> and C, and the rest happens to be a syntax error. -Because the slash that terminated C was followed by a C, -the example above is not C, but rather C with no C -modifier. So the embedded C<#> is interpreted as a literal C<#>. - -=item Removal of backslashes before delimiters - -During the second pass, text between the starting and ending -delimiters is copied to a safe location, and the C<\> is removed -from combinations consisting of C<\> and delimiter--or delimiters, -meaning both starting and ending delimiters will should these differ. -This removal does not happen for multi-character delimiters. -Note that the combination C<\\> is left intact, just as it was. - -Starting from this step no information about the delimiters is -used in parsing. - -=item Interpolation - -The next step is interpolation in the text obtained, which is now -delimiter-independent. There are four different cases. - -=over 4 - -=item C<<<'EOF'>, C, C, C, C - -No interpolation is performed. - -=item C<''>, C - -The only interpolation is removal of C<\> from pairs C<\\>. - -=item C<"">, C<``>, C, C, C<< >> - -C<\Q>, C<\U>, C<\u>, C<\L>, C<\l> (possibly paired with C<\E>) are -converted to corresponding Perl constructs. Thus, C<"$foo\Qbaz$bar"> -is converted to C<$foo . (quotemeta("baz" . $bar))> internally. -The other combinations are replaced with appropriate expansions. - -Let it be stressed that I and C<\E>> -is interpolated in the usual way. Something like C<"\Q\\E"> has -no C<\E> inside. instead, it has C<\Q>, C<\\>, and C, so the -result is the same as for C<"\\\\E">. As a general rule, backslashes -between C<\Q> and C<\E> may lead to counterintuitive results. So, -C<"\Q\t\E"> is converted to C, which is the same -as C<"\\\t"> (since TAB is not alphanumeric). Note also that: - - $str = '\t'; - return "\Q$str"; - -may be closer to the conjectural I of the writer of C<"\Q\t\E">. - -Interpolated scalars and arrays are converted internally to the C and -C<.> catenation operations. Thus, C<"$foo XXX '@arr'"> becomes: - - $foo . " XXX '" . (join $", @arr) . "'"; - -All operations above are performed simultaneously, left to right. - -Because the result of C<"\Q STRING \E"> has all metacharacters -quoted, there is no way to insert a literal C<$> or C<@> inside a -C<\Q\E> pair. If protected by C<\>, C<$> will be quoted to became -C<"\\\$">; if not, it is interpreted as the start of an interpolated -scalar. - -Note also that the interpolation code needs to make a decision on -where the interpolated scalar ends. For instance, whether -C<< "a $b -> {c}" >> really means: - - "a " . $b . " -> {c}"; - -or: - - "a " . $b -> {c}; - -Most of the time, the longest possible text that does not include -spaces between components and which contains matching braces or -brackets. because the outcome may be determined by voting based -on heuristic estimators, the result is not strictly predictable. -Fortunately, it's usually correct for ambiguous cases. - -=item C, C, C, C, - -Processing of C<\Q>, C<\U>, C<\u>, C<\L>, C<\l>, and interpolation -happens (almost) as with C constructs, but the substitution -of C<\> followed by RE-special chars (including C<\>) is not -performed. Moreover, inside C<(?{BLOCK})>, C<(?# comment )>, and -a C<#>-comment in a C-regular expression, no processing is -performed whatsoever. This is the first step at which the presence -of the C modifier is relevant. - -Interpolation has several quirks: C<$|>, C<$(>, and C<$)> are not -interpolated, and constructs C<$var[SOMETHING]> are voted (by several -different estimators) to be either an array element or C<$var> -followed by an RE alternative. This is where the notation -C<${arr[$bar]}> comes handy: C is interpreted as -array element C<-9>, not as a regular expression from the variable -C<$arr> followed by a digit, which would be the interpretation of -C. Since voting among different estimators may occur, -the result is not predictable. - -It is at this step that C<\1> is begrudgingly converted to C<$1> in -the replacement text of C to correct the incorrigible -I hackers who haven't picked up the saner idiom yet. A warning -is emitted if the C pragma or the B<-w> command-line flag -(that is, the C<$^W> variable) was set. - -The lack of processing of C<\\> creates specific restrictions on -the post-processed text. If the delimiter is C, one cannot get -the combination C<\/> into the result of this step. C will -finish the regular expression, C<\/> will be stripped to C on -the previous step, and C<\\/> will be left as is. Because C is -equivalent to C<\/> inside a regular expression, this does not -matter unless the delimiter happens to be character special to the -RE engine, such as in C, C, or C; or an -alphanumeric char, as in: - - m m ^ a \s* b mmx; - -In the RE above, which is intentionally obfuscated for illustration, the -delimiter is C, the modifier is C, and after backslash-removal the -RE is the same as for C). There's more than one -reason you're encouraged to restrict your delimiters to non-alphanumeric, -non-whitespace choices. - -=back - -This step is the last one for all constructs except regular expressions, -which are processed further. - -=item Interpolation of regular expressions - -Previous steps were performed during the compilation of Perl code, -but this one happens at run time--although it may be optimized to -be calculated at compile time if appropriate. After preprocessing -described above, and possibly after evaluation if catenation, -joining, casing translation, or metaquoting are involved, the -resulting I is passed to the RE engine for compilation. - -Whatever happens in the RE engine might be better discussed in L, -but for the sake of continuity, we shall do so here. - -This is another step where the presence of the C modifier is -relevant. The RE engine scans the string from left to right and -converts it to a finite automaton. - -Backslashed characters are either replaced with corresponding -literal strings (as with C<\{>), or else they generate special nodes -in the finite automaton (as with C<\b>). Characters special to the -RE engine (such as C<|>) generate corresponding nodes or groups of -nodes. C<(?#...)> comments are ignored. All the rest is either -converted to literal strings to match, or else is ignored (as is -whitespace and C<#>-style comments if C is present). - -Parsing of the bracketed character class construct, C<[...]>, is -rather different than the rule used for the rest of the pattern. -The terminator of this construct is found using the same rules as -for finding the terminator of a C<{}>-delimited construct, the only -exception being that C<]> immediately following C<[> is treated as -though preceded by a backslash. Similarly, the terminator of -C<(?{...})> is found using the same rules as for finding the -terminator of a C<{}>-delimited construct. - -It is possible to inspect both the string given to RE engine and the -resulting finite automaton. See the arguments C/C -in the C> pragma, as well as Perl's B<-Dr> command-line -switch documented in L. - -=item Optimization of regular expressions - -This step is listed for completeness only. Since it does not change -semantics, details of this step are not documented and are subject -to change without notice. This step is performed over the finite -automaton that was generated during the previous pass. - -It is at this stage that C silently optimizes C to -mean C. - -=back - -=head2 I/O Operators - -There are several I/O operators you should know about. - -A string enclosed by backticks (grave accents) first undergoes -double-quote interpolation. It is then interpreted as an external -command, and the output of that command is the value of the -backtick string, like in a shell. In scalar context, a single string -consisting of all output is returned. In list context, a list of -values is returned, one per line of output. (You can set C<$/> to use -a different line terminator.) The command is executed each time the -pseudo-literal is evaluated. The status value of the command is -returned in C<$?> (see L for the interpretation of C<$?>). -Unlike in B, no translation is done on the return data--newlines -remain newlines. Unlike in any of the shells, single quotes do not -hide variable names in the command from interpretation. To pass a -literal dollar-sign through to the shell you need to hide it with a -backslash. The generalized form of backticks is C. (Because -backticks always undergo shell expansion as well, see L for -security concerns.) - -In scalar context, evaluating a filehandle in angle brackets yields -the next line from that file (the newline, if any, included), or -C at end-of-file or on error. When C<$/> is set to C -(sometimes known as file-slurp mode) and the file is empty, it -returns C<''> the first time, followed by C subsequently. - -Ordinarily you must assign the returned value to a variable, but -there is one situation where an automatic assignment happens. If -and only if the input symbol is the only thing inside the conditional -of a C statement (even if disguised as a C loop), -the value is automatically assigned to the global variable $_, -destroying whatever was there previously. (This may seem like an -odd thing to you, but you'll use the construct in almost every Perl -script you write.) The $_ variable is not implicitly localized. -You'll have to put a C before the loop if you want that -to happen. - -The following lines are equivalent: - - while (defined($_ = )) { print; } - while ($_ = ) { print; } - while () { print; } - for (;;) { print; } - print while defined($_ = ); - print while ($_ = ); - print while ; - -This also behaves similarly, but avoids $_ : - - while (my $line = ) { print $line } - -In these loop constructs, the assigned value (whether assignment -is automatic or explicit) is then tested to see whether it is -defined. The defined test avoids problems where line has a string -value that would be treated as false by Perl, for example a "" or -a "0" with no trailing newline. If you really mean for such values -to terminate the loop, they should be tested for explicitly: - - while (($_ = ) ne '0') { ... } - while () { last unless $_; ... } - -In other boolean contexts, C<< > >> without an -explicit C test or comparison elicit a warning if the -C pragma or the B<-w> -command-line switch (the C<$^W> variable) is in effect. - -The filehandles STDIN, STDOUT, and STDERR are predefined. (The -filehandles C, C, and C will also work except -in packages, where they would be interpreted as local identifiers -rather than global.) Additional filehandles may be created with -the open() function, amongst others. See L and -L for details on this. - -If a is used in a context that is looking for -a list, a list comprising all input lines is returned, one line per -list element. It's easy to grow to a rather large data space this -way, so use with care. - - may also be spelled C. -See L. - -The null filehandle <> is special: it can be used to emulate the -behavior of B and B. Input from <> comes either from -standard input, or from each file listed on the command line. Here's -how it works: the first time <> is evaluated, the @ARGV array is -checked, and if it is empty, C<$ARGV[0]> is set to "-", which when opened -gives you standard input. The @ARGV array is then processed as a list -of filenames. The loop - - while (<>) { - ... # code for each line - } - -is equivalent to the following Perl-like pseudo code: - - unshift(@ARGV, '-') unless @ARGV; - while ($ARGV = shift) { - open(ARGV, $ARGV); - while () { - ... # code for each line - } - } - -except that it isn't so cumbersome to say, and will actually work. -It really does shift the @ARGV array and put the current filename -into the $ARGV variable. It also uses filehandle I -internally--<> is just a synonym for , which -is magical. (The pseudo code above doesn't work because it treats - as non-magical.) - -You can modify @ARGV before the first <> as long as the array ends up -containing the list of filenames you really want. Line numbers (C<$.>) -continue as though the input were one big happy file. See the example -in L for how to reset line numbers on each file. - -If you want to set @ARGV to your own list of files, go right ahead. -This sets @ARGV to all plain text files if no @ARGV was given: - - @ARGV = grep { -f && -T } glob('*') unless @ARGV; - -You can even set them to pipe commands. For example, this automatically -filters compressed arguments through B: - - @ARGV = map { /\.(gz|Z)$/ ? "gzip -dc < $_ |" : $_ } @ARGV; - -If you want to pass switches into your script, you can use one of the -Getopts modules or put a loop on the front like this: - - while ($_ = $ARGV[0], /^-/) { - shift; - last if /^--$/; - if (/^-D(.*)/) { $debug = $1 } - if (/^-v/) { $verbose++ } - # ... # other switches - } - - while (<>) { - # ... # code for each line - } - -The <> symbol will return C for end-of-file only once. -If you call it again after this, it will assume you are processing another -@ARGV list, and if you haven't set @ARGV, will read input from STDIN. - -If angle brackets contain is a simple scalar variable (e.g., -<$foo>), then that variable contains the name of the -filehandle to input from, or its typeglob, or a reference to the -same. For example: - - $fh = \*STDIN; - $line = <$fh>; - -If what's within the angle brackets is neither a filehandle nor a simple -scalar variable containing a filehandle name, typeglob, or typeglob -reference, it is interpreted as a filename pattern to be globbed, and -either a list of filenames or the next filename in the list is returned, -depending on context. This distinction is determined on syntactic -grounds alone. That means C<< <$x> >> is always a readline() from -an indirect handle, but C<< <$hash{key}> >> is always a glob(). -That's because $x is a simple scalar variable, but C<$hash{key}> is -not--it's a hash element. - -One level of double-quote interpretation is done first, but you can't -say C<< <$foo> >> because that's an indirect filehandle as explained -in the previous paragraph. (In older versions of Perl, programmers -would insert curly brackets to force interpretation as a filename glob: -C<< <${foo}> >>. These days, it's considered cleaner to call the -internal function directly as C, which is probably the right -way to have done it in the first place.) For example: - - while (<*.c>) { - chmod 0644, $_; - } - -is roughly equivalent to: - - open(FOO, "echo *.c | tr -s ' \t\r\f' '\\012\\012\\012\\012'|"); - while () { - chomp; - chmod 0644, $_; - } - -except that the globbing is actually done internally using the standard -C extension. Of course, the shortest way to do the above is: - - chmod 0644, <*.c>; - -A (file)glob evaluates its (embedded) argument only when it is -starting a new list. All values must be read before it will start -over. In list context, this isn't important because you automatically -get them all anyway. However, in scalar context the operator returns -the next value each time it's called, or C when the list has -run out. As with filehandle reads, an automatic C is -generated when the glob occurs in the test part of a C, -because legal glob returns (e.g. a file called F<0>) would otherwise -terminate the loop. Again, C is returned only once. So if -you're expecting a single value from a glob, it is much better to -say - - ($file) = ; - -than - - $file = ; - -because the latter will alternate between returning a filename and -returning false. - -It you're trying to do variable interpolation, it's definitely better -to use the glob() function, because the older notation can cause people -to become confused with the indirect filehandle notation. - - @files = glob("$dir/*.[ch]"); - @files = glob($files[$i]); - -=head2 Constant Folding - -Like C, Perl does a certain amount of expression evaluation at -compile time whenever it determines that all arguments to an -operator are static and have no side effects. In particular, string -concatenation happens at compile time between literals that don't do -variable substitution. Backslash interpolation also happens at -compile time. You can say - - 'Now is the time for all' . "\n" . - 'good men to come to.' - -and this all reduces to one string internally. Likewise, if -you say - - foreach $file (@filenames) { - if (-s $file > 5 + 100 * 2**16) { } - } - -the compiler will precompute the number which that expression -represents so that the interpreter won't have to. - -=head2 Bitwise String Operators - -Bitstrings of any size may be manipulated by the bitwise operators -(C<~ | & ^>). - -If the operands to a binary bitwise op are strings of different -sizes, B<|> and B<^> ops act as though the shorter operand had -additional zero bits on the right, while the B<&> op acts as though -the longer operand were truncated to the length of the shorter. -The granularity for such extension or truncation is one or more -bytes. - - # ASCII-based examples - print "j p \n" ^ " a h"; # prints "JAPH\n" - print "JA" | " ph\n"; # prints "japh\n" - print "japh\nJunk" & '_____'; # prints "JAPH\n"; - print 'p N$' ^ " E bitwise operation. You may explicitly show which type of -operation you intend by using C<""> or C<0+>, as in the examples below. - - $foo = 150 | 105 ; # yields 255 (0x96 | 0x69 is 0xFF) - $foo = '150' | 105 ; # yields 255 - $foo = 150 | '105'; # yields 255 - $foo = '150' | '105'; # yields string '155' (under ASCII) - - $baz = 0+$foo & 0+$bar; # both ops explicitly numeric - $biz = "$foo" ^ "$bar"; # both ops explicitly stringy - -See L for information on how to manipulate individual bits -in a bit vector. - -=head2 Integer Arithmetic - -By default, Perl assumes that it must do most of its arithmetic in -floating point. But by saying - - use integer; - -you may tell the compiler that it's okay to use integer operations -(if it feels like it) from here to the end of the enclosing BLOCK. -An inner BLOCK may countermand this by saying - - no integer; - -which lasts until the end of that BLOCK. Note that this doesn't -mean everything is only an integer, merely that Perl may use integer -operations if it is so inclined. For example, even under C, if you take the C, you'll still get C<1.4142135623731> -or so. - -Used on numbers, the bitwise operators ("&", "|", "^", "~", "<<", -and ">>") always produce integral results. (But see also -L.) However, C still has meaning for -them. By default, their results are interpreted as unsigned integers, but -if C is in effect, their results are interpreted -as signed integers. For example, C<~0> usually evaluates to a large -integral value. However, C is C<-1> on twos-complement -machines. - -=head2 Floating-point Arithmetic - -While C provides integer-only arithmetic, there is no -analogous mechanism to provide automatic rounding or truncation to a -certain number of decimal places. For rounding to a certain number -of digits, sprintf() or printf() is usually the easiest route. -See L. - -Floating-point numbers are only approximations to what a mathematician -would call real numbers. There are infinitely more reals than floats, -so some corners must be cut. For example: - - printf "%.20g\n", 123456789123456789; - # produces 123456789123456784 - -Testing for exact equality of floating-point equality or inequality is -not a good idea. Here's a (relatively expensive) work-around to compare -whether two floating-point numbers are equal to a particular number of -decimal places. See Knuth, volume II, for a more robust treatment of -this topic. - - sub fp_equal { - my ($X, $Y, $POINTS) = @_; - my ($tX, $tY); - $tX = sprintf("%.${POINTS}g", $X); - $tY = sprintf("%.${POINTS}g", $Y); - return $tX eq $tY; - } - -The POSIX module (part of the standard perl distribution) implements -ceil(), floor(), and other mathematical and trigonometric functions. -The Math::Complex module (part of the standard perl distribution) -defines mathematical functions that work on both the reals and the -imaginary numbers. Math::Complex not as efficient as POSIX, but -POSIX can't work with complex numbers. - -Rounding in financial applications can have serious implications, and -the rounding method used should be specified precisely. In these -cases, it probably pays not to trust whichever system rounding is -being used by Perl, but to instead implement the rounding function you -need yourself. - -=head2 Bigger Numbers - -The standard Math::BigInt and Math::BigFloat modules provide -variable-precision arithmetic and overloaded operators, although -they're currently pretty slow. At the cost of some space and -considerable speed, they avoid the normal pitfalls associated with -limited-precision representations. - - use Math::BigInt; - $x = Math::BigInt->new('123456789123456789'); - print $x * $x; - - # prints +15241578780673678515622620750190521 - -There are several modules that let you calculate with (bound only by -memory and cpu-time) unlimited or fixed precision. There are also -some non-standard modules that provide faster implementations via -external C libraries. - -Here is a short, but incomplete summary: - - Math::Fraction big, unlimited fractions like 9973 / 12967 - Math::String treat string sequences like numbers - Math::FixedPrecision calculate with a fixed precision - Math::Currency for currency calculations - Bit::Vector manipulate bit vectors fast (uses C) - Math::BigIntFast Bit::Vector wrapper for big numbers - Math::Pari provides access to the Pari C library - Math::BigInteger uses an external C library - Math::Cephes uses external Cephes C library (no big numbers) - Math::Cephes::Fraction fractions via the Cephes library - Math::GMP another one using an external C library - -Choose wisely. - -=cut diff --git a/lib/perl5/5.6.1/pods/perlopentut.pod b/lib/perl5/5.6.1/pods/perlopentut.pod deleted file mode 100644 index b4003f4f..00000000 --- a/lib/perl5/5.6.1/pods/perlopentut.pod +++ /dev/null @@ -1,864 +0,0 @@ -=head1 NAME - -perlopentut - tutorial on opening things in Perl - -=head1 DESCRIPTION - -Perl has two simple, built-in ways to open files: the shell way for -convenience, and the C way for precision. The choice is yours. - -=head1 Open E la shell - -Perl's C function was designed to mimic the way command-line -redirection in the shell works. Here are some basic examples -from the shell: - - $ myprogram file1 file2 file3 - $ myprogram < inputfile - $ myprogram > outputfile - $ myprogram >> outputfile - $ myprogram | otherprogram - $ otherprogram | myprogram - -And here are some more advanced examples: - - $ otherprogram | myprogram f1 - f2 - $ otherprogram 2>&1 | myprogram - - $ myprogram <&3 - $ myprogram >&4 - -Programmers accustomed to constructs like those above can take comfort -in learning that Perl directly supports these familiar constructs using -virtually the same syntax as the shell. - -=head2 Simple Opens - -The C function takes two arguments: the first is a filehandle, -and the second is a single string comprising both what to open and how -to open it. C returns true when it works, and when it fails, -returns a false value and sets the special variable $! to reflect -the system error. If the filehandle was previously opened, it will -be implicitly closed first. - -For example: - - open(INFO, "datafile") || die("can't open datafile: $!"); - open(INFO, "< datafile") || die("can't open datafile: $!"); - open(RESULTS,"> runstats") || die("can't open runstats: $!"); - open(LOG, ">> logfile ") || die("can't open logfile: $!"); - -If you prefer the low-punctuation version, you could write that this way: - - open INFO, "< datafile" or die "can't open datafile: $!"; - open RESULTS,"> runstats" or die "can't open runstats: $!"; - open LOG, ">> logfile " or die "can't open logfile: $!"; - -A few things to notice. First, the leading less-than is optional. -If omitted, Perl assumes that you want to open the file for reading. - -The other important thing to notice is that, just as in the shell, -any white space before or after the filename is ignored. This is good, -because you wouldn't want these to do different things: - - open INFO, "; # oops, \n still there - open(EXTRA, "< $filename") || die "can't open $filename: $!"; - -This is not a bug, but a feature. Because C mimics the shell in -its style of using redirection arrows to specify how to open the file, it -also does so with respect to extra white space around the filename itself -as well. For accessing files with naughty names, see -L<"Dispelling the Dweomer">. - -=head2 Pipe Opens - -In C, when you want to open a file using the standard I/O library, -you use the C function, but when opening a pipe, you use the -C function. But in the shell, you just use a different redirection -character. That's also the case for Perl. The C call -remains the same--just its argument differs. - -If the leading character is a pipe symbol, C starts up a new -command and open a write-only filehandle leading into that command. -This lets you write into that handle and have what you write show up on -that command's standard input. For example: - - open(PRINTER, "| lpr -Plp1") || die "cannot fork: $!"; - print PRINTER "stuff\n"; - close(PRINTER) || die "can't close lpr: $!"; - -If the trailing character is a pipe, you start up a new command and open a -read-only filehandle leading out of that command. This lets whatever that -command writes to its standard output show up on your handle for reading. -For example: - - open(NET, "netstat -i -n |") || die "cannot fork: $!"; - while () { } # do something with input - close(NET) || die "can't close netstat: $!"; - -What happens if you try to open a pipe to or from a non-existent command? -In most systems, such an C will not return an error. That's -because in the traditional C/C model, running the other -program happens only in the forked child process, which means that -the failed C can't be reflected in the return value of C. -Only a failed C shows up there. See -L -to see how to cope with this. There's also an explanation in L. - -If you would like to open a bidirectional pipe, the IPC::Open2 -library will handle this for you. Check out -L - -=head2 The Minus File - -Again following the lead of the standard shell utilities, Perl's -C function treats a file whose name is a single minus, "-", in a -special way. If you open minus for reading, it really means to access -the standard input. If you open minus for writing, it really means to -access the standard output. - -If minus can be used as the default input or default output, what happens -if you open a pipe into or out of minus? What's the default command it -would run? The same script as you're currently running! This is actually -a stealth C hidden inside an C call. See -L for details. - -=head2 Mixing Reads and Writes - -It is possible to specify both read and write access. All you do is -add a "+" symbol in front of the redirection. But as in the shell, -using a less-than on a file never creates a new file; it only opens an -existing one. On the other hand, using a greater-than always clobbers -(truncates to zero length) an existing file, or creates a brand-new one -if there isn't an old one. Adding a "+" for read-write doesn't affect -whether it only works on existing files or always clobbers existing ones. - - open(WTMP, "+< /usr/adm/wtmp") - || die "can't open /usr/adm/wtmp: $!"; - - open(SCREEN, "+> /tmp/lkscreen") - || die "can't open /tmp/lkscreen: $!"; - - open(LOGFILE, "+>> /tmp/applog" - || die "can't open /tmp/applog: $!"; - -The first one won't create a new file, and the second one will always -clobber an old one. The third one will create a new file if necessary -and not clobber an old one, and it will allow you to read at any point -in the file, but all writes will always go to the end. In short, -the first case is substantially more common than the second and third -cases, which are almost always wrong. (If you know C, the plus in -Perl's C is historically derived from the one in C's fopen(3S), -which it ultimately calls.) - -In fact, when it comes to updating a file, unless you're working on -a binary file as in the WTMP case above, you probably don't want to -use this approach for updating. Instead, Perl's B<-i> flag comes to -the rescue. The following command takes all the C, C++, or yacc source -or header files and changes all their foo's to bar's, leaving -the old version in the original file name with a ".orig" tacked -on the end: - - $ perl -i.orig -pe 's/\bfoo\b/bar/g' *.[Cchy] - -This is a short cut for some renaming games that are really -the best way to update textfiles. See the second question in -L for more details. - -=head2 Filters - -One of the most common uses for C is one you never -even notice. When you process the ARGV filehandle using -C<< >>, Perl actually does an implicit open -on each file in @ARGV. Thus a program called like this: - - $ myprogram file1 file2 file3 - -Can have all its files opened and processed one at a time -using a construct no more complex than: - - while (<>) { - # do something with $_ - } - -If @ARGV is empty when the loop first begins, Perl pretends you've opened -up minus, that is, the standard input. In fact, $ARGV, the currently -open file during C<< >> processing, is even set to "-" -in these circumstances. - -You are welcome to pre-process your @ARGV before starting the loop to -make sure it's to your liking. One reason to do this might be to remove -command options beginning with a minus. While you can always roll the -simple ones by hand, the Getopts modules are good for this. - - use Getopt::Std; - - # -v, -D, -o ARG, sets $opt_v, $opt_D, $opt_o - getopts("vDo:"); - - # -v, -D, -o ARG, sets $args{v}, $args{D}, $args{o} - getopts("vDo:", \%args); - -Or the standard Getopt::Long module to permit named arguments: - - use Getopt::Long; - GetOptions( "verbose" => \$verbose, # --verbose - "Debug" => \$debug, # --Debug - "output=s" => \$output ); - # --output=somestring or --output somestring - -Another reason for preprocessing arguments is to make an empty -argument list default to all files: - - @ARGV = glob("*") unless @ARGV; - -You could even filter out all but plain, text files. This is a bit -silent, of course, and you might prefer to mention them on the way. - - @ARGV = grep { -f && -T } @ARGV; - -If you're using the B<-n> or B<-p> command-line options, you -should put changes to @ARGV in a C block. - -Remember that a normal C has special properties, in that it might -call fopen(3S) or it might called popen(3S), depending on what its -argument looks like; that's why it's sometimes called "magic open". -Here's an example: - - $pwdinfo = `domainname` =~ /^(\(none\))?$/ - ? '< /etc/passwd' - : 'ypcat passwd |'; - - open(PWD, $pwdinfo) - or die "can't open $pwdinfo: $!"; - -This sort of thing also comes into play in filter processing. Because -C<< >> processing employs the normal, shell-style Perl C, -it respects all the special things we've already seen: - - $ myprogram f1 "cmd1|" - f2 "cmd2|" f3 < tmpfile - -That program will read from the file F, the process F, standard -input (F in this case), the F file, the F command, -and finally the F file. - -Yes, this also means that if you have a file named "-" (and so on) in -your directory, that they won't be processed as literal files by C. -You'll need to pass them as "./-" much as you would for the I program. -Or you could use C as described below. - -One of the more interesting applications is to change files of a certain -name into pipes. For example, to autoprocess gzipped or compressed -files by decompressing them with I: - - @ARGV = map { /^\.(gz|Z)$/ ? "gzip -dc $_ |" : $_ } @ARGV; - -Or, if you have the I program installed from LWP, -you can fetch URLs before processing them: - - @ARGV = map { m#^\w+://# ? "GET $_ |" : $_ } @ARGV; - -It's not for nothing that this is called magic C<< >>. -Pretty nifty, eh? - -=head1 Open E la C - -If you want the convenience of the shell, then Perl's C is -definitely the way to go. On the other hand, if you want finer precision -than C's simplistic fopen(3S) provides, then you should look to Perl's -C, which is a direct hook into the open(2) system call. -That does mean it's a bit more involved, but that's the price of -precision. - -C takes 3 (or 4) arguments. - - sysopen HANDLE, PATH, FLAGS, [MASK] - -The HANDLE argument is a filehandle just as with C. The PATH is -a literal path, one that doesn't pay attention to any greater-thans or -less-thans or pipes or minuses, nor ignore white space. If it's there, -it's part of the path. The FLAGS argument contains one or more values -derived from the Fcntl module that have been or'd together using the -bitwise "|" operator. The final argument, the MASK, is optional; if -present, it is combined with the user's current umask for the creation -mode of the file. You should usually omit this. - -Although the traditional values of read-only, write-only, and read-write -are 0, 1, and 2 respectively, this is known not to hold true on some -systems. Instead, it's best to load in the appropriate constants first -from the Fcntl module, which supplies the following standard flags: - - O_RDONLY Read only - O_WRONLY Write only - O_RDWR Read and write - O_CREAT Create the file if it doesn't exist - O_EXCL Fail if the file already exists - O_APPEND Append to the file - O_TRUNC Truncate the file - O_NONBLOCK Non-blocking access - -Less common flags that are sometimes available on some operating -systems include C, C, C, C, -C, C, C, C, C, -C, C and C. Consult your open(2) -manpage or its local equivalent for details. (Note: starting from -Perl release 5.6 the O_LARGEFILE flag, if available, is automatically -added to the sysopen() flags because large files are the default.) - -Here's how to use C to emulate the simple C calls we had -before. We'll omit the C<|| die $!> checks for clarity, but make sure -you always check the return values in real code. These aren't quite -the same, since C will trim leading and trailing white space, -but you'll get the idea: - -To open a file for reading: - - open(FH, "< $path"); - sysopen(FH, $path, O_RDONLY); - -To open a file for writing, creating a new file if needed or else truncating -an old file: - - open(FH, "> $path"); - sysopen(FH, $path, O_WRONLY | O_TRUNC | O_CREAT); - -To open a file for appending, creating one if necessary: - - open(FH, ">> $path"); - sysopen(FH, $path, O_WRONLY | O_APPEND | O_CREAT); - -To open a file for update, where the file must already exist: - - open(FH, "+< $path"); - sysopen(FH, $path, O_RDWR); - -And here are things you can do with C that you cannot do with -a regular C. As you see, it's just a matter of controlling the -flags in the third argument. - -To open a file for writing, creating a new file which must not previously -exist: - - sysopen(FH, $path, O_WRONLY | O_EXCL | O_CREAT); - -To open a file for appending, where that file must already exist: - - sysopen(FH, $path, O_WRONLY | O_APPEND); - -To open a file for update, creating a new file if necessary: - - sysopen(FH, $path, O_RDWR | O_CREAT); - -To open a file for update, where that file must not already exist: - - sysopen(FH, $path, O_RDWR | O_EXCL | O_CREAT); - -To open a file without blocking, creating one if necessary: - - sysopen(FH, $path, O_WRONLY | O_NONBLOCK | O_CREAT); - -=head2 Permissions E la mode - -If you omit the MASK argument to C, Perl uses the octal value -0666. The normal MASK to use for executables and directories should -be 0777, and for anything else, 0666. - -Why so permissive? Well, it isn't really. The MASK will be modified -by your process's current C. A umask is a number representing -I permissions bits; that is, bits that will not be turned on -in the created files' permissions field. - -For example, if your C were 027, then the 020 part would -disable the group from writing, and the 007 part would disable others -from reading, writing, or executing. Under these conditions, passing -C 0666 would create a file with mode 0640, since C<0666 &~ 027> -is 0640. - -You should seldom use the MASK argument to C. That takes -away the user's freedom to choose what permission new files will have. -Denying choice is almost always a bad thing. One exception would be for -cases where sensitive or private data is being stored, such as with mail -folders, cookie files, and internal temporary files. - -=head1 Obscure Open Tricks - -=head2 Re-Opening Files (dups) - -Sometimes you already have a filehandle open, and want to make another -handle that's a duplicate of the first one. In the shell, we place an -ampersand in front of a file descriptor number when doing redirections. -For example, C<< 2>&1 >> makes descriptor 2 (that's STDERR in Perl) -be redirected into descriptor 1 (which is usually Perl's STDOUT). -The same is essentially true in Perl: a filename that begins with an -ampersand is treated instead as a file descriptor if a number, or as a -filehandle if a string. - - open(SAVEOUT, ">&SAVEERR") || die "couldn't dup SAVEERR: $!"; - open(MHCONTEXT, "<&4") || die "couldn't dup fd4: $!"; - -That means that if a function is expecting a filename, but you don't -want to give it a filename because you already have the file open, you -can just pass the filehandle with a leading ampersand. It's best to -use a fully qualified handle though, just in case the function happens -to be in a different package: - - somefunction("&main::LOGFILE"); - -This way if somefunction() is planning on opening its argument, it can -just use the already opened handle. This differs from passing a handle, -because with a handle, you don't open the file. Here you have something -you can pass to open. - -If you have one of those tricky, newfangled I/O objects that the C++ -folks are raving about, then this doesn't work because those aren't a -proper filehandle in the native Perl sense. You'll have to use fileno() -to pull out the proper descriptor number, assuming you can: - - use IO::Socket; - $handle = IO::Socket::INET->new("www.perl.com:80"); - $fd = $handle->fileno; - somefunction("&$fd"); # not an indirect function call - -It can be easier (and certainly will be faster) just to use real -filehandles though: - - use IO::Socket; - local *REMOTE = IO::Socket::INET->new("www.perl.com:80"); - die "can't connect" unless defined(fileno(REMOTE)); - somefunction("&main::REMOTE"); - -If the filehandle or descriptor number is preceded not just with a simple -"&" but rather with a "&=" combination, then Perl will not create a -completely new descriptor opened to the same place using the dup(2) -system call. Instead, it will just make something of an alias to the -existing one using the fdopen(3S) library call This is slightly more -parsimonious of systems resources, although this is less a concern -these days. Here's an example of that: - - $fd = $ENV{"MHCONTEXTFD"}; - open(MHCONTEXT, "<&=$fd") or die "couldn't fdopen $fd: $!"; - -If you're using magic C<< >>, you could even pass in as a -command line argument in @ARGV something like C<"<&=$MHCONTEXTFD">, -but we've never seen anyone actually do this. - -=head2 Dispelling the Dweomer - -Perl is more of a DWIMmer language than something like Java--where DWIM -is an acronym for "do what I mean". But this principle sometimes leads -to more hidden magic than one knows what to do with. In this way, Perl -is also filled with I, an obscure word meaning an enchantment. -Sometimes, Perl's DWIMmer is just too much like dweomer for comfort. - -If magic C is a bit too magical for you, you don't have to turn -to C. To open a file with arbitrary weird characters in -it, it's necessary to protect any leading and trailing whitespace. -Leading whitespace is protected by inserting a C<"./"> in front of a -filename that starts with whitespace. Trailing whitespace is protected -by appending an ASCII NUL byte (C<"\0">) at the end off the string. - - $file =~ s#^(\s)#./$1#; - open(FH, "< $file\0") || die "can't open $file: $!"; - -This assumes, of course, that your system considers dot the current -working directory, slash the directory separator, and disallows ASCII -NULs within a valid filename. Most systems follow these conventions, -including all POSIX systems as well as proprietary Microsoft systems. -The only vaguely popular system that doesn't work this way is the -proprietary Macintosh system, which uses a colon where the rest of us -use a slash. Maybe C isn't such a bad idea after all. - -If you want to use C<< >> processing in a totally boring -and non-magical way, you could do this first: - - # "Sam sat on the ground and put his head in his hands. - # 'I wish I had never come here, and I don't want to see - # no more magic,' he said, and fell silent." - for (@ARGV) { - s#^([^./])#./$1#; - $_ .= "\0"; - } - while (<>) { - # now process $_ - } - -But be warned that users will not appreciate being unable to use "-" -to mean standard input, per the standard convention. - -=head2 Paths as Opens - -You've probably noticed how Perl's C and C functions can -produce messages like: - - Some warning at scriptname line 29, line 7. - -That's because you opened a filehandle FH, and had read in seven records -from it. But what was the name of the file, not the handle? - -If you aren't running with C, or if you've turn them off -temporarily, then all you have to do is this: - - open($path, "< $path") || die "can't open $path: $!"; - while (<$path>) { - # whatever - } - -Since you're using the pathname of the file as its handle, -you'll get warnings more like - - Some warning at scriptname line 29, line 7. - -=head2 Single Argument Open - -Remember how we said that Perl's open took two arguments? That was a -passive prevarication. You see, it can also take just one argument. -If and only if the variable is a global variable, not a lexical, you -can pass C just one argument, the filehandle, and it will -get the path from the global scalar variable of the same name. - - $FILE = "/etc/motd"; - open FILE or die "can't open $FILE: $!"; - while () { - # whatever - } - -Why is this here? Someone has to cater to the hysterical porpoises. -It's something that's been in Perl since the very beginning, if not -before. - -=head2 Playing with STDIN and STDOUT - -One clever move with STDOUT is to explicitly close it when you're done -with the program. - - END { close(STDOUT) || die "can't close stdout: $!" } - -If you don't do this, and your program fills up the disk partition due -to a command line redirection, it won't report the error exit with a -failure status. - -You don't have to accept the STDIN and STDOUT you were given. You are -welcome to reopen them if you'd like. - - open(STDIN, "< datafile") - || die "can't open datafile: $!"; - - open(STDOUT, "> output") - || die "can't open output: $!"; - -And then these can be read directly or passed on to subprocesses. -This makes it look as though the program were initially invoked -with those redirections from the command line. - -It's probably more interesting to connect these to pipes. For example: - - $pager = $ENV{PAGER} || "(less || more)"; - open(STDOUT, "| $pager") - || die "can't fork a pager: $!"; - -This makes it appear as though your program were called with its stdout -already piped into your pager. You can also use this kind of thing -in conjunction with an implicit fork to yourself. You might do this -if you would rather handle the post processing in your own program, -just in a different process: - - head(100); - while (<>) { - print; - } - - sub head { - my $lines = shift || 20; - return unless $pid = open(STDOUT, "|-"); - die "cannot fork: $!" unless defined $pid; - while () { - print; - last if --$lines < 0; - } - exit; - } - -This technique can be applied to repeatedly push as many filters on your -output stream as you wish. - -=head1 Other I/O Issues - -These topics aren't really arguments related to C or C, -but they do affect what you do with your open files. - -=head2 Opening Non-File Files - -When is a file not a file? Well, you could say when it exists but -isn't a plain file. We'll check whether it's a symbolic link first, -just in case. - - if (-l $file || ! -f _) { - print "$file is not a plain file\n"; - } - -What other kinds of files are there than, well, files? Directories, -symbolic links, named pipes, Unix-domain sockets, and block and character -devices. Those are all files, too--just not I files. This isn't -the same issue as being a text file. Not all text files are plain files. -Not all plain files are textfiles. That's why there are separate C<-f> -and C<-T> file tests. - -To open a directory, you should use the C function, then -process it with C, carefully restoring the directory -name if necessary: - - opendir(DIR, $dirname) or die "can't opendir $dirname: $!"; - while (defined($file = readdir(DIR))) { - # do something with "$dirname/$file" - } - closedir(DIR); - -If you want to process directories recursively, it's better to use the -File::Find module. For example, this prints out all files recursively, -add adds a slash to their names if the file is a directory. - - @ARGV = qw(.) unless @ARGV; - use File::Find; - find sub { print $File::Find::name, -d && '/', "\n" }, @ARGV; - -This finds all bogus symbolic links beneath a particular directory: - - find sub { print "$File::Find::name\n" if -l && !-e }, $dir; - -As you see, with symbolic links, you can just pretend that it is -what it points to. Or, if you want to know I it points to, then -C is called for: - - if (-l $file) { - if (defined($whither = readlink($file))) { - print "$file points to $whither\n"; - } else { - print "$file points nowhere: $!\n"; - } - } - -Named pipes are a different matter. You pretend they're regular files, -but their opens will normally block until there is both a reader and -a writer. You can read more about them in L. -Unix-domain sockets are rather different beasts as well; they're -described in L. - -When it comes to opening devices, it can be easy and it can tricky. -We'll assume that if you're opening up a block device, you know what -you're doing. The character devices are more interesting. These are -typically used for modems, mice, and some kinds of printers. This is -described in L -It's often enough to open them carefully: - - sysopen(TTYIN, "/dev/ttyS1", O_RDWR | O_NDELAY | O_NOCTTY) - # (O_NOCTTY no longer needed on POSIX systems) - or die "can't open /dev/ttyS1: $!"; - open(TTYOUT, "+>&TTYIN") - or die "can't dup TTYIN: $!"; - - $ofh = select(TTYOUT); $| = 1; select($ofh); - - print TTYOUT "+++at\015"; - $answer = ; - -With descriptors that you haven't opened using C, such as a -socket, you can set them to be non-blocking using C: - - use Fcntl; - fcntl(Connection, F_SETFL, O_NONBLOCK) - or die "can't set non blocking: $!"; - -Rather than losing yourself in a morass of twisting, turning Cs, -all dissimilar, if you're going to manipulate ttys, it's best to -make calls out to the stty(1) program if you have it, or else use the -portable POSIX interface. To figure this all out, you'll need to read the -termios(3) manpage, which describes the POSIX interface to tty devices, -and then L, which describes Perl's interface to POSIX. There are -also some high-level modules on CPAN that can help you with these games. -Check out Term::ReadKey and Term::ReadLine. - -What else can you open? To open a connection using sockets, you won't use -one of Perl's two open functions. See -L for that. Here's an -example. Once you have it, you can use FH as a bidirectional filehandle. - - use IO::Socket; - local *FH = IO::Socket::INET->new("www.perl.com:80"); - -For opening up a URL, the LWP modules from CPAN are just what -the doctor ordered. There's no filehandle interface, but -it's still easy to get the contents of a document: - - use LWP::Simple; - $doc = get('http://www.linpro.no/lwp/'); - -=head2 Binary Files - -On certain legacy systems with what could charitably be called terminally -convoluted (some would say broken) I/O models, a file isn't a file--at -least, not with respect to the C standard I/O library. On these old -systems whose libraries (but not kernels) distinguish between text and -binary streams, to get files to behave properly you'll have to bend over -backwards to avoid nasty problems. On such infelicitous systems, sockets -and pipes are already opened in binary mode, and there is currently no -way to turn that off. With files, you have more options. - -Another option is to use the C function on the appropriate -handles before doing regular I/O on them: - - binmode(STDIN); - binmode(STDOUT); - while () { print } - -Passing C a non-standard flag option will also open the file in -binary mode on those systems that support it. This is the equivalent of -opening the file normally, then calling Cing on the handle. - - sysopen(BINDAT, "records.data", O_RDWR | O_BINARY) - || die "can't open records.data: $!"; - -Now you can use C and C on that handle without worrying -about the system non-standard I/O library breaking your data. It's not -a pretty picture, but then, legacy systems seldom are. CP/M will be -with us until the end of days, and after. - -On systems with exotic I/O systems, it turns out that, astonishingly -enough, even unbuffered I/O using C and C might do -sneaky data mutilation behind your back. - - while (sysread(WHENCE, $buf, 1024)) { - syswrite(WHITHER, $buf, length($buf)); - } - -Depending on the vicissitudes of your runtime system, even these calls -may need C or C first. Systems known to be free of -such difficulties include Unix, the Mac OS, Plan9, and Inferno. - -=head2 File Locking - -In a multitasking environment, you may need to be careful not to collide -with other processes who want to do I/O on the same files as others -are working on. You'll often need shared or exclusive locks -on files for reading and writing respectively. You might just -pretend that only exclusive locks exist. - -Never use the existence of a file C<-e $file> as a locking indication, -because there is a race condition between the test for the existence of -the file and its creation. Atomicity is critical. - -Perl's most portable locking interface is via the C function, -whose simplicity is emulated on systems that don't directly support it, -such as SysV or WindowsNT. The underlying semantics may affect how -it all works, so you should learn how C is implemented on your -system's port of Perl. - -File locking I lock out another process that would like to -do I/O. A file lock only locks out others trying to get a lock, not -processes trying to do I/O. Because locks are advisory, if one process -uses locking and another doesn't, all bets are off. - -By default, the C call will block until a lock is granted. -A request for a shared lock will be granted as soon as there is no -exclusive locker. A request for a exclusive lock will be granted as -soon as there is no locker of any kind. Locks are on file descriptors, -not file names. You can't lock a file until you open it, and you can't -hold on to a lock once the file has been closed. - -Here's how to get a blocking shared lock on a file, typically used -for reading: - - use 5.004; - use Fcntl qw(:DEFAULT :flock); - open(FH, "< filename") or die "can't open filename: $!"; - flock(FH, LOCK_SH) or die "can't lock filename: $!"; - # now read from FH - -You can get a non-blocking lock by using C. - - flock(FH, LOCK_SH | LOCK_NB) - or die "can't lock filename: $!"; - -This can be useful for producing more user-friendly behaviour by warning -if you're going to be blocking: - - use 5.004; - use Fcntl qw(:DEFAULT :flock); - open(FH, "< filename") or die "can't open filename: $!"; - unless (flock(FH, LOCK_SH | LOCK_NB)) { - $| = 1; - print "Waiting for lock..."; - flock(FH, LOCK_SH) or die "can't lock filename: $!"; - print "got it.\n" - } - # now read from FH - -To get an exclusive lock, typically used for writing, you have to be -careful. We C the file so it can be locked before it gets -emptied. You can get a nonblocking version using C. - - use 5.004; - use Fcntl qw(:DEFAULT :flock); - sysopen(FH, "filename", O_WRONLY | O_CREAT) - or die "can't open filename: $!"; - flock(FH, LOCK_EX) - or die "can't lock filename: $!"; - truncate(FH, 0) - or die "can't truncate filename: $!"; - # now write to FH - -Finally, due to the uncounted millions who cannot be dissuaded from -wasting cycles on useless vanity devices called hit counters, here's -how to increment a number in a file safely: - - use Fcntl qw(:DEFAULT :flock); - - sysopen(FH, "numfile", O_RDWR | O_CREAT) - or die "can't open numfile: $!"; - # autoflush FH - $ofh = select(FH); $| = 1; select ($ofh); - flock(FH, LOCK_EX) - or die "can't write-lock numfile: $!"; - - $num = || 0; - seek(FH, 0, 0) - or die "can't rewind numfile : $!"; - print FH $num+1, "\n" - or die "can't write numfile: $!"; - - truncate(FH, tell(FH)) - or die "can't truncate numfile: $!"; - close(FH) - or die "can't close numfile: $!"; - -=head1 SEE ALSO - -The C and C function in perlfunc(1); -the standard open(2), dup(2), fopen(3), and fdopen(3) manpages; -the POSIX documentation. - -=head1 AUTHOR and COPYRIGHT - -Copyright 1998 Tom Christiansen. - -When included as part of the Standard Version of Perl, or as part of -its complete documentation whether printed or otherwise, this work may -be distributed only under the terms of Perl's Artistic License. Any -distribution of this file or derivatives thereof outside of that -package require that special arrangements be made with copyright -holder. - -Irrespective of its distribution, all code examples in these files are -hereby placed into the public domain. You are permitted and -encouraged to use this code in your own programs for fun or for profit -as you see fit. A simple comment in the code giving credit would be -courteous but is not required. - -=head1 HISTORY - -First release: Sat Jan 9 08:09:11 MST 1999 diff --git a/lib/perl5/5.6.1/pods/perlos2.pod b/lib/perl5/5.6.1/pods/perlos2.pod deleted file mode 100644 index fbc2731a..00000000 --- a/lib/perl5/5.6.1/pods/perlos2.pod +++ /dev/null @@ -1,1942 +0,0 @@ -If you read this file _as_is_, just ignore the funny characters you -see. It is written in the POD format (see perlpod manpage) which is -specially designed to be readable as is. - -=head1 NAME - -perlos2 - Perl under OS/2, DOS, Win0.3*, Win0.95 and WinNT. - -=head1 SYNOPSIS - -One can read this document in the following formats: - - man perlos2 - view perl perlos2 - explorer perlos2.html - info perlos2 - -to list some (not all may be available simultaneously), or it may -be read I: either as F, or F. - -To read the F<.INF> version of documentation (B recommended) -outside of OS/2, one needs an IBM's reader (may be available on IBM -ftp sites (?) (URL anyone?)) or shipped with PC DOS 7.0 and IBM's -Visual Age C++ 3.5. - -A copy of a Win* viewer is contained in the "Just add OS/2 Warp" package - - ftp://ftp.software.ibm.com/ps/products/os2/tools/jaow/jaow.zip - -in F. This gives one an access to EMX's -F<.INF> docs as well (text form is available in F in -EMX's distribution). - -Note that if you have F installed, you can follow WWW links -from this document in F<.INF> format. If you have EMX docs installed -correctly, you can follow library links (you need to have C -working by setting C environment variable as it is described -in EMX docs). - -=cut - -Contents - - perlos2 - Perl under OS/2, DOS, Win0.3*, Win0.95 and WinNT. - - NAME - SYNOPSIS - DESCRIPTION - - Target - - Other OSes - - Prerequisites - - Starting Perl programs under OS/2 (and DOS and...) - - Starting OS/2 (and DOS) programs under Perl - Frequently asked questions - - I cannot run external programs - - I cannot embed perl into my program, or use perl.dll from my program. - - `` and pipe-open do not work under DOS. - - Cannot start find.exe "pattern" file - INSTALLATION - - Automatic binary installation - - Manual binary installation - - Warning - Accessing documentation - - OS/2 .INF file - - Plain text - - Manpages - - HTML - - GNU info files - - .PDF files - - LaTeX docs - BUILD - - Prerequisites - - Getting perl source - - Application of the patches - - Hand-editing - - Making - - Testing - - Installing the built perl - - a.out-style build - Build FAQ - - Some / became \ in pdksh. - - 'errno' - unresolved external - - Problems with tr - - Some problem (forget which ;-) - - Library ... not found - - Segfault in make - Specific (mis)features of EMX port - - setpriority, getpriority - - system() - - extproc on the first line - - Additional modules: - - Prebuilt methods: - - Misfeatures - - Modifications - Perl flavors - - perl.exe - - perl_.exe - - perl__.exe - - perl___.exe - - Why strange names? - - Why dynamic linking? - - Why chimera build? - ENVIRONMENT - - PERLLIB_PREFIX - - PERL_BADLANG - - PERL_BADFREE - - PERL_SH_DIR - - TMP or TEMP - Evolution - - Priorities - - DLL name mangling - - Threading - - Calls to external programs - - Memory allocation - - Threads - AUTHOR - SEE ALSO - -=head1 DESCRIPTION - -=head2 Target - -The target is to make OS/2 the best supported platform for -using/building/developing Perl and I, as well as -make Perl the best language to use under OS/2. The secondary target is -to try to make this work under DOS and Win* as well (but not B hard). - -The current state is quite close to this target. Known limitations: - -=over 5 - -=item * - -Some *nix programs use fork() a lot; with the mostly useful flavors of perl -for OS/2 (there are several built simultaneously) this is supported; -some flavors do not. Using fork() after Iing dynamically loading -extensions would not work with very old versions of EMX. - -=item * - -You need a separate perl executable F (see L) -if you want to use PM code in your application (as Perl/Tk or OpenGL -Perl modules do) without having a text-mode window present. - -While using the standard F from a text-mode window is possible -too, I have seen cases when this causes degradation of the system stability. -Using F avoids such a degradation. - -=item * - -There is no simple way to access WPS objects. The only way I know -is via C extension (see L), and we do not have access to -convenience methods of Object-REXX. (Is it possible at all? I know -of no Object-REXX API.) The C extension (currently in alpha-text) -may eventually remove this shortcoming. - -=back - -Please keep this list up-to-date by informing me about other items. - -=head2 Other OSes - -Since OS/2 port of perl uses a remarkable EMX environment, it can -run (and build extensions, and - possibly - be built itself) under any -environment which can run EMX. The current list is DOS, -DOS-inside-OS/2, Win0.3*, Win0.95 and WinNT. Out of many perl flavors, -only one works, see L<"perl_.exe">. - -Note that not all features of Perl are available under these -environments. This depends on the features the I - most -probably RSX - decided to implement. - -Cf. L. - -=head2 Prerequisites - -=over 6 - -=item EMX - -EMX runtime is required (may be substituted by RSX). Note that -it is possible to make F to run under DOS without any -external support by binding F/F to it, see L. Note -that under DOS for best results one should use RSX runtime, which -has much more functions working (like C, C and so on). In -fact RSX is required if there is no VCPI present. Note the -RSX requires DPMI. - -Only the latest runtime is supported, currently C<0.9d fix 03>. Perl may run -under earlier versions of EMX, but this is not tested. - -One can get different parts of EMX from, say - - http://www.leo.org/pub/comp/os/os2/leo/gnu/emx+gcc/ - http://powerusersbbs.com/pub/os2/dev/ [EMX+GCC Development] - http://hobbes.nmsu.edu/pub/os2/dev/emx/v0.9d/ - -The runtime component should have the name F. - -B. It is enough to have F/F on your path. One -does not need to specify them explicitly (though this - - emx perl_.exe -de 0 - -will work as well.) - -=item RSX - -To run Perl on DPMI platforms one needs RSX runtime. This is -needed under DOS-inside-OS/2, Win0.3*, Win0.95 and WinNT (see -L<"Other OSes">). RSX would not work with VCPI -only, as EMX would, it requires DMPI. - -Having RSX and the latest F one gets a fully functional -B<*nix>-ish environment under DOS, say, C, C<``> and -pipe-C work. In fact, MakeMaker works (for static build), so one -can have Perl development environment under DOS. - -One can get RSX from, say - - ftp://ftp.cdrom.com/pub/os2/emx09c/contrib - ftp://ftp.uni-bielefeld.de/pub/systems/msdos/misc - ftp://ftp.leo.org/pub/comp/os/os2/leo/devtools/emx+gcc/contrib - -Contact the author on C. - -The latest F with DOS hooks is available in - - ftp://ftp.math.ohio-state.edu/pub/users/ilya/os2/ - -as F or under similar names starting with C, C etc. - -=item HPFS - -Perl does not care about file systems, but to install the whole perl -library intact one needs a file system which supports long file names. - -Note that if you do not plan to build the perl itself, it may be -possible to fool EMX to truncate file names. This is not supported, -read EMX docs to see how to do it. - -=item pdksh - -To start external programs with complicated command lines (like with -pipes in between, and/or quoting of arguments), Perl uses an external -shell. With EMX port such shell should be named F, and located -either in the wired-in-during-compile locations (usually F), -or in configurable location (see L<"PERL_SH_DIR">). - -For best results use EMX pdksh. The standard binary (5.2.14 or later) runs -under DOS (with L) as well, see - - ftp://ftp.math.ohio-state.edu/pub/users/ilya/os2/ - -=back - -=head2 Starting Perl programs under OS/2 (and DOS and...) - -Start your Perl program F with arguments C the -same way as on any other platform, by - - perl foo.pl arg1 arg2 arg3 - -If you want to specify perl options C<-my_opts> to the perl itself (as -opposed to to your program), use - - perl -my_opts foo.pl arg1 arg2 arg3 - -Alternately, if you use OS/2-ish shell, like CMD or 4os2, put -the following at the start of your perl script: - - extproc perl -S -my_opts - -rename your program to F, and start it by typing - - foo arg1 arg2 arg3 - -Note that because of stupid OS/2 limitations the full path of the perl -script is not available when you use C, thus you are forced to -use C<-S> perl switch, and your script should be on the C. As a plus -side, if you know a full path to your script, you may still start it -with - - perl ../../blah/foo.cmd arg1 arg2 arg3 - -(note that the argument C<-my_opts> is taken care of by the C line -in your script, see L on the first line>). - -To understand what the above I does, read perl docs about C<-S> -switch - see L, and cmdref about C: - - view perl perlrun - man perlrun - view cmdref extproc - help extproc - -or whatever method you prefer. - -There are also endless possibilities to use I of -4os2, I of WPS and so on... However, if you use -*nixish shell (like F supplied in the binary distribution), -you need to follow the syntax specified in L. - -Note that B<-S> switch enables a search with additional extensions -F<.cmd>, F<.btm>, F<.bat>, F<.pl> as well. - -=head2 Starting OS/2 (and DOS) programs under Perl - -This is what system() (see L), C<``> (see -L), and I (see L) -are for. (Avoid exec() (see L) unless you know what you -do). - -Note however that to use some of these operators you need to have a -sh-syntax shell installed (see L<"Pdksh">, -L<"Frequently asked questions">), and perl should be able to find it -(see L<"PERL_SH_DIR">). - -The cases when the shell is used are: - -=over - -=item 1 - -One-argument system() (see L), exec() (see L) -with redirection or shell meta-characters; - -=item 2 - -Pipe-open (see L) with the command which contains redirection -or shell meta-characters; - -=item 3 - -Backticks C<``> (see L) with the command which contains -redirection or shell meta-characters; - -=item 4 - -If the executable called by system()/exec()/pipe-open()/C<``> is a script -with the "magic" C<#!> line or C line which specifies shell; - -=item 5 - -If the executable called by system()/exec()/pipe-open()/C<``> is a script -without "magic" line, and C<$ENV{EXECSHELL}> is set to shell; - -=item 6 - -If the executable called by system()/exec()/pipe-open()/C<``> is not -found; - -=item 7 - -For globbing (see L, L). - -=back - -For the sake of speed for a common case, in the above algorithms -backslashes in the command name are not considered as shell metacharacters. - -Perl starts scripts which begin with cookies -C or C<#!> directly, without an intervention of shell. Perl uses the -same algorithm to find the executable as F: if the path -on C<#!> line does not work, and contains C, then the executable -is searched in F<.> and on C. To find arguments for these scripts -Perl uses a different algorithm than F: up to 3 arguments are -recognized, and trailing whitespace is stripped. - -If a script -does not contain such a cooky, then to avoid calling F, Perl uses -the same algorithm as F: if C<$ENV{EXECSHELL}> is set, the -script is given as the first argument to this command, if not set, then -C<$ENV{COMSPEC} /c> is used (or a hardwired guess if C<$ENV{COMSPEC}> is -not set). - -If starting scripts directly, Perl will use exactly the same algorithm as for -the search of script given by B<-S> command-line option: it will look in -the current directory, then on components of C<$ENV{PATH}> using the -following order of appended extensions: no extension, F<.cmd>, F<.btm>, -F<.bat>, F<.pl>. - -Note that Perl will start to look for scripts only if OS/2 cannot start the -specified application, thus C will not look for a script if -there is an executable file F I on C. - -Note also that executable files on OS/2 can have an arbitrary extension, -but F<.exe> will be automatically appended if no dot is present in the name. -The workaround as as simple as that: since F and F denote the -same file, to start an executable residing in file F (no -extension) give an argument C (dot appended) to system(). - -Perl will correctly start PM programs from VIO (=text-mode) Perl process; -the opposite is not true: when you start a non-PM program from a PM -Perl process, it would not run it in a separate session. If a separate -session is desired, either ensure -that shell will be used, as in C, or start it using -optional arguments to system() documented in C module. This -is considered to be a feature. - -=head1 Frequently asked questions - -=head2 "It does not work" - -Perl binary distributions come with a F script which tries -to detect common problems with misconfigured installations. There is a -pretty large chance it will discover which step of the installation you -managed to goof. C<;-)> - -=head2 I cannot run external programs - -=over 4 - -=item * - -Did you run your programs with C<-w> switch? See -L. - -=item * - -Do you try to run I shell commands, like C<`copy a b`> -(internal for F), or C<`glob a*b`> (internal for ksh)? You -need to specify your shell explicitly, like C<`cmd /c copy a b`>, -since Perl cannot deduce which commands are internal to your shell. - -=back - -=head2 I cannot embed perl into my program, or use F from my -program. - -=over 4 - -=item Is your program EMX-compiled with C<-Zmt -Zcrtdll>? - -If not, you need to build a stand-alone DLL for perl. Contact me, I -did it once. Sockets would not work, as a lot of other stuff. - -=item Did you use L? - -I had reports it does not work. Somebody would need to fix it. - -=back - -=head2 C<``> and pipe-C do not work under DOS. - -This may a variant of just L<"I cannot run external programs">, or a -deeper problem. Basically: you I RSX (see L<"Prerequisites">) -for these commands to work, and you may need a port of F which -understands command arguments. One of such ports is listed in -L<"Prerequisites"> under RSX. Do not forget to set variable -C> as well. - -DPMI is required for RSX. - -=head2 Cannot start C - -Use one of - - system 'cmd', '/c', 'find "pattern" file'; - `cmd /c 'find "pattern" file'` - -This would start F via F via C via -C, but this is a price to pay if you want to use -non-conforming program. In fact F cannot be started at all -using C library API only. Otherwise the following command-lines would be -equivalent: - - find "pattern" file - find pattern file - -=head1 INSTALLATION - -=head2 Automatic binary installation - -The most convenient way of installing a binary distribution of perl is via perl installer -F. Just follow the instructions, and 99% of the -installation blues would go away. - -Note however, that you need to have F on your path, and -EMX environment I. The latter means that if you just -installed EMX, and made all the needed changes to F, -you may need to reboot in between. Check EMX runtime by running - - emxrev - -A folder is created on your desktop which contains some useful -objects. - -B - -=over 15 - -=item C - -may be needed if you change your codepage I perl installation, -and the new value is not supported by EMX. See L<"PERL_BADLANG">. - -=item C - -see L<"PERL_BADFREE">. - -=item F - -This file resides somewhere deep in the location you installed your -perl library, find it out by - - perl -MConfig -le "print $INC{'Config.pm'}" - -While most important values in this file I updated by the binary -installer, some of them may need to be hand-edited. I know no such -data, please keep me informed if you find one. - -=back - -B. Because of a typo the binary installer of 5.00305 -would install a variable C into F. Please -remove this variable and put C> instead. - -=head2 Manual binary installation - -As of version 5.00305, OS/2 perl binary distribution comes split -into 11 components. Unfortunately, to enable configurable binary -installation, the file paths in the zip files are not absolute, but -relative to some directory. - -Note that the extraction with the stored paths is still necessary -(default with unzip, specify C<-d> to pkunzip). However, you -need to know where to extract the files. You need also to manually -change entries in F to reflect where did you put the -files. Note that if you have some primitive unzipper (like -pkunzip), you may get a lot of warnings/errors during -unzipping. Upgrade to C<(w)unzip>. - -Below is the sample of what to do to reproduce the configuration on my -machine: - -=over 3 - -=item Perl VIO and PM executables (dynamically linked) - - unzip perl_exc.zip *.exe *.ico -d f:/emx.add/bin - unzip perl_exc.zip *.dll -d f:/emx.add/dll - -(have the directories with C<*.exe> on PATH, and C<*.dll> on -LIBPATH); - -=item Perl_ VIO executable (statically linked) - - unzip perl_aou.zip -d f:/emx.add/bin - -(have the directory on PATH); - -=item Executables for Perl utilities - - unzip perl_utl.zip -d f:/emx.add/bin - -(have the directory on PATH); - -=item Main Perl library - - unzip perl_mlb.zip -d f:/perllib/lib - -If this directory is exactly the same as the prefix which was compiled -into F, you do not need to change -anything. However, for perl to find the library if you use a different -path, you need to -C in F, see L<"PERLLIB_PREFIX">. - -=item Additional Perl modules - - unzip perl_ste.zip -d f:/perllib/lib/site_perl/5.8.3/ - -Same remark as above applies. Additionally, if this directory is not -one of directories on @INC (and @INC is influenced by C), you -need to put this -directory and subdirectory F<./os2> in C or C -variable. Do not use C unless you have it set already. See -L. - -=item Tools to compile Perl modules - - unzip perl_blb.zip -d f:/perllib/lib - -Same remark as for F. - -=item Manpages for Perl and utilities - - unzip perl_man.zip -d f:/perllib/man - -This directory should better be on C. You need to have a -working man to access these files. - -=item Manpages for Perl modules - - unzip perl_mam.zip -d f:/perllib/man - -This directory should better be on C. You need to have a -working man to access these files. - -=item Source for Perl documentation - - unzip perl_pod.zip -d f:/perllib/lib - -This is used by the C program (see L), and may be used to -generate HTML documentation usable by WWW browsers, and -documentation in zillions of other formats: C, C, -C, C and so on. - -=item Perl manual in F<.INF> format - - unzip perl_inf.zip -d d:/os2/book - -This directory should better be on C. - -=item Pdksh - - unzip perl_sh.zip -d f:/bin - -This is used by perl to run external commands which explicitly -require shell, like the commands using I and I. It is also used instead of explicit F. - -Set C (see L<"PERL_SH_DIR">) if you move F from -the above location. - -B It may be possible to use some other sh-compatible shell -(file globbing - if done via shell - may break). - -=back - -After you installed the components you needed and updated the -F correspondingly, you need to hand-edit -F. This file resides somewhere deep in the location you -installed your perl library, find it out by - - perl -MConfig -le "print $INC{'Config.pm'}" - -You need to correct all the entries which look like file paths (they -currently start with C). - -=head2 B - -The automatic and manual perl installation leave precompiled paths -inside perl executables. While these paths are overwriteable (see -L<"PERLLIB_PREFIX">, L<"PERL_SH_DIR">), one may get better results by -binary editing of paths inside the executables/DLLs. - -=head1 Accessing documentation - -Depending on how you built/installed perl you may have (otherwise -identical) Perl documentation in the following formats: - -=head2 OS/2 F<.INF> file - -Most probably the most convenient form. Under OS/2 view it as - - view perl - view perl perlfunc - view perl less - view perl ExtUtils::MakeMaker - -(currently the last two may hit a wrong location, but this may improve -soon). Under Win* see L<"SYNOPSIS">. - -If you want to build the docs yourself, and have I, run - - pod2ipf > perl.ipf - -in F directory, then - - ipfc /inf perl.ipf - -(Expect a lot of errors during the both steps.) Now move it on your -BOOKSHELF path. - -=head2 Plain text - -If you have perl documentation in the source form, perl utilities -installed, and GNU groff installed, you may use - - perldoc perlfunc - perldoc less - perldoc ExtUtils::MakeMaker - -to access the perl documentation in the text form (note that you may get -better results using perl manpages). - -Alternately, try running pod2text on F<.pod> files. - -=head2 Manpages - -If you have man installed on your system, and you installed perl -manpages, use something like this: - - man perlfunc - man 3 less - man ExtUtils.MakeMaker - -to access documentation for different components of Perl. Start with - - man perl - -Note that dot (F<.>) is used as a package separator for documentation -for packages, and as usual, sometimes you need to give the section - C<3> -above - to avoid shadowing by the I. - -Make sure that the directory B the directory with manpages is -on our C, like this - - set MANPATH=c:/man;f:/perllib/man - -for Perl manpages in C etc. - -=head2 HTML - -If you have some WWW browser available, installed the Perl -documentation in the source form, and Perl utilities, you can build -HTML docs. Cd to directory with F<.pod> files, and do like this - - cd f:/perllib/lib/pod - pod2html - -After this you can direct your browser the file F in this -directory, and go ahead with reading docs, like this: - - explore file:///f:/perllib/lib/pod/perl.html - -Alternatively you may be able to get these docs prebuilt from CPAN. - -=head2 GNU C files - -Users of Emacs would appreciate it very much, especially with -C mode loaded. You need to get latest C from C, -or, alternately, prebuilt info pages. - -=head2 F<.PDF> files - -for C are available on CPAN (for slightly old version of -perl). - -=head2 C docs - -can be constructed using C. - -=head1 BUILD - -Here we discuss how to build Perl under OS/2. There is an alternative -(but maybe older) view on http://www.shadow.net/~troc/os2perl.html - -=head2 The short story - -Assume that you are a seasoned porter, so are sure that all the necessary -tools are already present on your system, and you know how to get the Perl -source distribution. Untar it, change to the extract directory, and - - gnupatch -p0 < os2\diff.configure - sh Configure -des -D prefix=f:/perllib - make - make test - make install - make aout_test - make aout_install - -This puts the executables in f:/perllib/bin. Manually move them to the -C, manually move the built F to C (here F<*> is -a not-very-meaningful hex checksum), and run - - make installcmd INSTALLCMDDIR=d:/ir/on/path - -What follows is a detailed guide through these steps. - -=head2 Prerequisites - -You need to have the latest EMX development environment, the full -GNU tool suite (gawk renamed to awk, and GNU F -earlier on path than the OS/2 F, same with F, to -check use - - find --version - sort --version - -). You need the latest version of F installed as F. - -Check that you have B libraries and headers installed, and - -optionally - Berkeley DB headers and libraries, and crypt. - -Possible locations to get this from are - - ftp://hobbes.nmsu.edu/os2/unix/ - ftp://ftp.cdrom.com/pub/os2/unix/ - ftp://ftp.cdrom.com/pub/os2/dev32/ - ftp://ftp.cdrom.com/pub/os2/emx09c/ - -It is reported that the following archives contain enough utils to -build perl: F, F, F, F, -F, F, F, F and -F (or a later version). Note that all these utilities are -known to be available from LEO: - - ftp://ftp.leo.org/pub/comp/os/os2/leo/gnu - -If you have I installed already, -make sure that no copies or perl are currently running. Later steps -of the build may fail since an older version of F loaded into -memory may be found. - -Also make sure that you have F directory on the current drive, -and F<.> directory in your C. One may try to correct the -latter condition by - - set BEGINLIBPATH . - -if you use something like F or latest versions of F<4os2.exe>. - -Make sure your gcc is good for C<-Zomf> linking: run C -script in F directory. - -Check that you have link386 installed. It comes standard with OS/2, -but may be not installed due to customization. If typing - - link386 - -shows you do not have it, do I, and choose C in I. If you get into -link386 prompts, press C to exit. - -=head2 Getting perl source - -You need to fetch the latest perl source (including developers -releases). With some probability it is located in - - http://www.perl.com/CPAN/src/5.0 - http://www.perl.com/CPAN/src/5.0/unsupported - -If not, you may need to dig in the indices to find it in the directory -of the current maintainer. - -Quick cycle of developers release may break the OS/2 build time to -time, looking into - - http://www.perl.com/CPAN/ports/os2/ilyaz/ - -may indicate the latest release which was publicly released by the -maintainer. Note that the release may include some additional patches -to apply to the current source of perl. - -Extract it like this - - tar vzxf perl5.00409.tar.gz - -You may see a message about errors while extracting F. This is -because there is a conflict with a similarly-named file F. - -Change to the directory of extraction. - -=head2 Application of the patches - -You need to apply the patches in F<./os2/diff.*> like this: - - gnupatch -p0 < os2\diff.configure - -You may also need to apply the patches supplied with the binary -distribution of perl. - -Note also that the F and F from the EMX distribution -are not suitable for multi-threaded compile (even single-threaded -flavor of Perl uses multi-threaded C RTL, for -compatibility with XFree86-OS/2). Get a corrected one from - - ftp://ftp.math.ohio-state.edu/pub/users/ilya/os2/db_mt.zip - -=head2 Hand-editing - -You may look into the file F<./hints/os2.sh> and correct anything -wrong you find there. I do not expect it is needed anywhere. - -=head2 Making - - sh Configure -des -D prefix=f:/perllib - -C means: where to install the resulting perl library. Giving -correct prefix you may avoid the need to specify C, -see L<"PERLLIB_PREFIX">. - -I, and about C<-c> option to -tr>. The latter is most probably already fixed, if you see it and can trace -where the latter spurious warning comes from, please inform me. - -Now - - make - -At some moment the built may die, reporting a I or -I>. This means that you do not have F<.> in -your LIBPATH, so F cannot find the needed F (treat -these hex digits as line noise). After this is fixed the build -should finish without a lot of fuss. - -=head2 Testing - -Now run - - make test - -All tests should succeed (with some of them skipped). - -Some tests may generate extra messages similar to - -=over 4 - -=item A lot of C - -in database tests related to Berkeley DB. I -If it persists, you may disable this warnings, see L<"PERL_BADFREE">. - -=item Process terminated by SIGTERM/SIGINT - -This is a standard message issued by OS/2 applications. *nix -applications die in silence. It is considered to be a feature. One can -easily disable this by appropriate sighandlers. - -However the test engine bleeds these message to screen in unexpected -moments. Two messages of this kind I be present during -testing. - -=back - -To get finer test reports, call - - perl t/harness - -The report with F failing may look like this: - - Failed Test Status Wstat Total Fail Failed List of failed - ------------------------------------------------------------ - io/pipe.t 12 1 8.33% 9 - 7 tests skipped, plus 56 subtests skipped. - Failed 1/195 test scripts, 99.49% okay. 1/6542 subtests failed, 99.98% okay. - -The reasons for most important skipped tests are: - -=over 8 - -=item F - -=over 4 - -=item 18 - -Checks C and C of C - unfortunately, HPFS -provides only 2sec time granularity (for compatibility with FAT?). - -=item 25 - -Checks C on a filehandle just opened for write - I do not -know why this should or should not work. - -=back - -=item F - -Checks C. Tests: - -=over 4 - -=item 4 - -Checks C and C of C - unfortunately, HPFS -provides only 2sec time granularity (for compatibility with FAT?). - -=back - -=back - -=head2 Installing the built perl - -If you haven't yet moved perl.dll onto LIBPATH, do it now. - -Run - - make install - -It would put the generated files into needed locations. Manually put -F, F and F to a location on your -PATH, F to a location on your LIBPATH. - -Run - - make installcmd INSTALLCMDDIR=d:/ir/on/path - -to convert perl utilities to F<.cmd> files and put them on -PATH. You need to put F<.EXE>-utilities on path manually. They are -installed in C<$prefix/bin>, here C<$prefix> is what you gave to -F, see L. - -=head2 C-style build - -Proceed as above, but make F (see L<"perl_.exe">) by - - make perl_ - -test and install by - - make aout_test - make aout_install - -Manually put F to a location on your PATH. - -B The build process for C I about all the -dependencies, so you should make sure that anything is up-to-date, -say, by doing - - make perl_dll - -first. - -=head1 Build FAQ - -=head2 Some C became C<\> in pdksh. - -You have a very old pdksh. See L. - -=head2 C<'errno'> - unresolved external - -You do not have MT-safe F. See L. - -=head2 Problems with tr or sed - -reported with very old version of tr and sed. - -=head2 Some problem (forget which ;-) - -You have an older version of F on your LIBPATH, which -broke the build of extensions. - -=head2 Library ... not found - -You did not run C. See L. - -=head2 Segfault in make - -You use an old version of GNU make. See L. - -=head2 op/sprintf test failure - -This can result from a bug in emx sprintf which was fixed in 0.9d fix 03. - -=head1 Specific (mis)features of OS/2 port - -=head2 C, C - -Note that these functions are compatible with *nix, not with the older -ports of '94 - 95. The priorities are absolute, go from 32 to -95, -lower is quicker. 0 is the default priority. - -B. Calling C on a non-existing process can lock the -system before Warp3 fixpak22. - -=head2 C - -Multi-argument form of C allows an additional numeric -argument. The meaning of this argument is described in -L. - -When finding a program to run, Perl first asks the OS to look for executables -on C. If not found, it looks for a script with possible extensions -added in this order: no extension, F<.cmd>, F<.btm>, -F<.bat>, F<.pl>. If found, Perl checks the start of the file for magic -strings C<"#!"> and C<"extproc ">. If found, Perl uses the rest of the -first line as the beginning of the command line to run this script. The -only mangling done to the first line is extraction of arguments (currently -up to 3), and ignoring of the path-part of the "interpreter" name if it can't -be found using the full path. - -E.g., C may lead Perl to finding -F with the first line being - - extproc /bin/bash -x -c - -If F is not found, and appending of executable extensions to -F does not help either, then Perl looks for an executable F on -C. If found in F, then the above system() is -translated to - - system qw(C:/emx.add/bin/bash.exe -x -c C:/emx/bin/foo.cmd bar baz) - -One additional translation is performed: instead of F Perl uses -the hardwired-or-customized shell (see C>). - -The above search for "interpreter" is recursive: if F executable is not -found, but F is found, Perl will investigate its first line etc. -The only hardwired limit on the recursion depth is implicit: there is a limit -4 on the number of additional arguments inserted before the actual arguments -given to system(). In particular, if no additional arguments are specified -on the "magic" first lines, then the limit on the depth is 4. - -If Perl finds that the found executable is of different type than the -current session, it will start the new process in a separate session of -necessary type. Call via C to disable this magic. - -=head2 C on the first line - -If the first chars of a Perl script are C<"extproc ">, this line is treated -as C<#!>-line, thus all the switches on this line are processed (twice -if script was started via cmd.exe). See L. - -=head2 Additional modules: - -L, L, L, L, L. These -modules provide access to additional numeric argument for C -and to the information about the running process, -to DLLs having functions with REXX signature and to the REXX runtime, to -OS/2 databases in the F<.INI> format, and to Extended Attributes. - -Two additional extensions by Andreas Kaiser, C, and -C, are included into C directory, mirrored on CPAN. - -=head2 Prebuilt methods: - -=over 4 - -=item C - -used by C, see L. - -=item C - -used by C for DLL name mangling. - -=item C - -Self explanatory. - -=item C - -leaves drive as it is. - -=item C - -chanes the "current" drive. - -=item C - -means has drive letter and is_rooted. - -=item C - -means has leading C<[/\\]> (maybe after a drive-letter:). - -=item C - -means changes with current dir. - -=item C - -Interface to cwd from EMX. Used by C. - -=item C - -Really really odious function to implement. Returns absolute name of -file which would have C if CWD were C

    . C defaults to the -current dir. - -=item C - -Get current value of extended library search path. If C is -present and I, works with END_LIBPATH, otherwise with -C. - -=item C - -Set current value of extended library search path. If C is -present and I, works with END_LIBPATH, otherwise with -C. - -=item C - -Returns C if it was not called yet, otherwise bit 1 is -set if on the previous call do_harderror was enabled, bit -2 is set if if on previous call do_exception was enabled. - -This function enables/disables error popups associated with -hardware errors (Disk not ready etc.) and software exceptions. - -I know of no way to find out the state of popups I the first call -to this function. - -=item C - -Returns C if it was not called yet, otherwise return false if errors -were not requested to be written to a hard drive, or the drive letter if -this was requested. - -This function may redirect error popups associated with hardware errors -(Disk not ready etc.) and software exceptions to the file POPUPLOG.OS2 at -the root directory of the specified drive. Overrides OS2::Error() specified -by individual programs. Given argument undef will disable redirection. - -Has global effect, persists after the application exits. - -I know of no way to find out the state of redirection of popups to the disk -I the first call to this function. - -=item OS2::SysInfo() - -Returns a hash with system information. The keys of the hash are - - MAX_PATH_LENGTH, MAX_TEXT_SESSIONS, MAX_PM_SESSIONS, - MAX_VDM_SESSIONS, BOOT_DRIVE, DYN_PRI_VARIATION, - MAX_WAIT, MIN_SLICE, MAX_SLICE, PAGE_SIZE, - VERSION_MAJOR, VERSION_MINOR, VERSION_REVISION, - MS_COUNT, TIME_LOW, TIME_HIGH, TOTPHYSMEM, TOTRESMEM, - TOTAVAILMEM, MAXPRMEM, MAXSHMEM, TIMER_INTERVAL, - MAX_COMP_LENGTH, FOREGROUND_FS_SESSION, - FOREGROUND_PROCESS - -=item OS2::BootDrive() - -Returns a letter without colon. - -=item C, C - -Transforms the current application into a PM application and back. -The argument true means that a real message loop is going to be served. -OS2::MorphPM() returns the PM message queue handle as an integer. - -See L<"Centralized management of resources"> for additional details. - -=item C - -Fake on-demand retrieval of outstanding PM messages. If C is false, -will not dispatch messages if a real message loop is known to -be present. Returns number of messages retrieved. - -Dies with "QUITing..." if WM_QUIT message is obtained. - -=item C - -Retrieval of PM messages until window creation/destruction. -If C is false, will not dispatch messages if a real message loop -is known to be present. - -Returns change in number of windows. If C is given, -it is incremented by the number of messages retrieved. - -Dies with "QUITing..." if WM_QUIT message is obtained. - -=item C - -the same as L<_control87(3)> of EMX. Takes integers as arguments, returns -the previous coprocessor control word as an integer. Only bits in C which -are present in C are changed in the control word. - -=item OS2::get_control87() - -gets the coprocessor control word as an integer. - -=item C - -The variant of OS2::_control87() with default values good for -handling exception mask: if no C, uses exception mask part of C -only. If no C, disables all the floating point exceptions. - -See L<"Misfeatures"> for details. - -=back - -(Note that some of these may be moved to different libraries - -eventually). - - -=head2 Prebuilt variables: - -=over 4 - -=item $OS2::emx_rev - -same as _emx_rev of EMX, a string similar to C<0.9c>. - -=item $OS2::emx_env - -same as _emx_env of EMX, a number similar to 0x8001. - -=item $OS2::os_ver - -a number C. - -=back - -=head2 Misfeatures - -=over 4 - -=item * - -Since L is present in EMX, but is not functional, it is -emulated by perl. To disable the emulations, set environment variable -C. - -=item * - -Here is the list of things which may be "broken" on -EMX (from EMX docs): - -=over 4 - -=item * - -The functions L, L, and L are not -implemented. - -=item * - -L is not required and not implemented. - -=item * - -L is not yet implemented (dummy function). (Perl has a workaround.) - -=item * - -L: Special treatment of PID=0, PID=1 and PID=-1 is not implemented. - -=item * - -L: - - WUNTRACED - Not implemented. - waitpid() is not implemented for negative values of PID. - -=back - -Note that C does not work with the current version of EMX. - -=item * - -Since F is used for globing (see L), the bugs -of F plague perl as well. - -In particular, uppercase letters do not work in C<[...]>-patterns with -the current pdksh. - -=item * - -Unix-domain sockets on OS/2 live in a pseudo-file-system C. -To avoid a failure to create a socket with a name of a different form, -C<"/socket/"> is prepended to the socket name (unless it starts with this -already). - -This may lead to problems later in case the socket is accessed via the -"usual" file-system calls using the "initial" name. - -=item * - -Apparently, IBM used a compiler (for some period of time around '95?) which -changes FP mask right and left. This is not I bad for IBM's -programs, but the same compiler was used for DLLs which are used with -general-purpose applications. When these DLLs are used, the state of -floating-point flags in the application is not predictable. - -What is much worse, some DLLs change the floating point flags when in -_DLLInitTerm() (e.g., F). This means that even if you do not I -any function in the DLL, just the act of loading this DLL will reset your -flags. What is worse, the same compiler was used to compile some HOOK DLLs. -Given that HOOK dlls are executed in the context of I the applications -in the system, this means a complete unpredictablity of floating point -flags on systems using such HOOK DLLs. E.g., F of B -origin changes the floating point flags on each write to the TTY of a VIO -(windowed text-mode) applications. - -Some other (not completely debugged) situations when FP flags change include -some video drivers (?), and some operations related to creation of the windows. -People who code B may have more experience on this. - -Perl is generally used in the situation when all the floating-point -exceptions are ignored, as is the default under EMX. If they are not ignored, -some benign Perl programs would get a C and would die a horrible death. - -To circumvent this, Perl uses two hacks. They help against I type of -damage only: FP flags changed when loading a DLL. - -One of the hacks is to disable floating point exceptions on startup (as -is the default with EMX). This helps only with compile-time-linked DLLs -changing the flags before main() had a chance to be called. - -The other hack is to restore FP flags after a call to dlopen(). This helps -against similar damage done by DLLs _DLLInitTerm() at runtime. Currently -no way to switch these hacks off is provided. - -=back - -=head2 Modifications - -Perl modifies some standard C library calls in the following ways: - -=over 9 - -=item C - -C uses F if shell is required, cf. L<"PERL_SH_DIR">. - -=item C - -is created using C or C environment variable, via -C. - -=item C - -If the current directory is not writable, file is created using modified -C, so there may be a race condition. - -=item C - -a dummy implementation. - -=item C - -C special-cases F and F. - -=item C, C - -these EMX functions do not work if the path contains a trailing C. -Perl contains a workaround for this. - -=item C - -Since L is present in EMX, but is not functional, it is -emulated by perl. To disable the emulations, set environment variable -C. - -=back - -=head2 Identifying DLLs - -All the DLLs built with the current versions of Perl have ID strings -identifying the name of the extension, its version, and the version -of Perl required for this DLL. Run C to find this -info. - -=head2 Centralized management of resources - -Since to call certain OS/2 API one needs to have a correctly initialized -C subsystem, OS/2-specific extensions may require getting Cs and -Cs. If an extension would do it on its own, another extension could -fail to initialize. - -Perl provides a centralized management of these resources: - -=over - -=item C - -To get the HAB, the extension should call C in C. After -this call is performed, C may be accessed as C. There is -no need to release the HAB after it is used. - -If by some reasons F cannot be included, use - - extern int Perl_hab_GET(void); - -instead. - -=item C - -There are two cases: - -=over - -=item * - -the extension needs an C only because some API will not work otherwise. -Use C below. - -=item * - -the extension needs an C since it wants to engage in a PM event loop. -Use C below. - -=back - -To get an C, the extension should call C in C. -After this call is performed, C may be accessed as C. - -To signal to Perl that HMQ is not needed any more, call -C. Perl process will automatically morph/unmorph itself -into/from a PM process if HMQ is needed/not-needed. Perl will automatically -enable/disable C message during shutdown if the message queue is -served/not-served. - -B. If during a shutdown there is a message queue which did not disable -WM_QUIT, and which did not process the received WM_QUIT message, the -shutdown will be automatically cancelled. Do not call C -unless you are going to process messages on an orderly basis. - -=back - -=head1 Perl flavors - -Because of idiosyncrasies of OS/2 one cannot have all the eggs in the -same basket (though EMX environment tries hard to overcome this -limitations, so the situation may somehow improve). There are 4 -executables for Perl provided by the distribution: - -=head2 F - -The main workhorse. This is a chimera executable: it is compiled as an -C-style executable, but is linked with C-style dynamic -library F, and with dynamic CRT DLL. This executable is a -VIO application. - -It can load perl dynamic extensions, and it can fork(). - -B Keep in mind that fork() is needed to open a pipe to yourself. - -=head2 F - -This is a statically linked C-style executable. It cannot -load dynamic Perl extensions. The executable supplied in binary -distributions has a lot of extensions prebuilt, thus the above restriction is -important only if you use custom-built extensions. This executable is a VIO -application. - -I The -friends locked into C world would appreciate the fact that this -executable runs under DOS, Win0.3*, Win0.95 and WinNT with an -appropriate extender. See L<"Other OSes">. - -=head2 F - -This is the same executable as F, but it is a PM -application. - -B Usually (unless explicitly redirected during the startup) -STDIN, STDERR, and STDOUT of a PM -application are redirected to F. However, it is possible to I -them if you start C from a PM program which emulates a -console window, like I of Emacs or EPM. Thus it I to use Perl debugger (see L) to debug your PM -application (but beware of the message loop lockups - this will not -work if you have a message queue to serve, unless you hook the serving -into the getc() function of the debugger). - -Another way to see the output of a PM program is to run it as - - pm_prog args 2>&1 | cat - - -with a shell I from F, so that it does not create -a link between a VIO session and the session of C. (Such a link -closes the VIO window.) E.g., this works with F - or with Perl! - - open P, 'pm_prog args 2>&1 |' or die; - print while

    ; - -The flavor F is required if you want to start your program without -a VIO window present, but not Ced (run C for more info). -Very useful for extensions which use PM, like C or C. - -=head2 F - -This is an C-style executable which is dynamically linked to -F and CRT DLL. I know no advantages of this executable -over C, but it cannot fork() at all. Well, one advantage is -that the build process is not so convoluted as with C. - -It is a VIO application. - -=head2 Why strange names? - -Since Perl processes the C<#!>-line (cf. -L, L, -L, -L), it should know when a -program I. There is some naming convention which allows -Perl to distinguish correct lines from wrong ones. The above names are -almost the only names allowed by this convention which do not contain -digits (which have absolutely different semantics). - -=head2 Why dynamic linking? - -Well, having several executables dynamically linked to the same huge -library has its advantages, but this would not substantiate the -additional work to make it compile. The reason is the complicated-to-developers -but very quick and convenient-to-users "hard" dynamic linking used by OS/2. - -There are two distinctive features of the dyna-linking model of OS/2: -all the references to external functions are resolved at the compile time; -there is no runtime fixup of the DLLs after they are loaded into memory. -The first feature is an enormous advantage over other models: it avoids -conflicts when several DLLs used by an application export entries with -the same name. In such cases "other" models of dyna-linking just choose -between these two entry points using some random criterion - with predictable -disasters as results. But it is the second feature which requires the build -of F. - -The address tables of DLLs are patched only once, when they are -loaded. The addresses of the entry points into DLLs are guaranteed to be -the same for all the programs which use the same DLL. This removes the -runtime fixup - once DLL is loaded, its code is read-only. - -While this allows some (significant?) performance advantages, this makes life -much harder for developers, since the above scheme makes it impossible -for a DLL to be "linked" to a symbol in the F<.EXE> file. Indeed, this -would need a DLL to have different relocations tables for the -(different) executables which use this DLL. - -However, a dynamically loaded Perl extension is forced to use some symbols -from the perl -executable, e.g., to know how to find the arguments to the functions: -the arguments live on the perl -internal evaluation stack. The solution is to put the main code of -the interpreter into a DLL, and make the F<.EXE> file which just loads -this DLL into memory and supplies command-arguments. The extension DLL -cannot link to symbols in F<.EXE>, but it has no problem linking -to symbols in the F<.DLL>. - -This I increases the load time for the application (as well as -complexity of the compilation). Since interpreter is in a DLL, -the C RTL is basically forced to reside in a DLL as well (otherwise -extensions would not be able to use CRT). There are some advantages if -you use different flavors of perl, such as running F and -F simultaneously: they share the memory of F. - -B. There is one additional effect which makes DLLs more wasteful: -DLLs are loaded in the shared memory region, which is a scarse resource -given the 512M barrier of the "standard" OS/2 virtual memory. The code of -F<.EXE> files is also shared by all the processes which use the particular -F<.EXE>, but they are "shared in the private address space of the process"; -this is possible because the address at which different sections -of the F<.EXE> file are loaded is decided at compile-time, thus all the -processes have these sections loaded at same addresses, and no fixup -of internal links inside the F<.EXE> is needed. - -Since DLLs may be loaded at run time, to have the same mechanism for for DLLs -one needs to have the address range of I DLLs in the -system to be available I which did not load a particular -DLL yet. This is why the DLLs are mapped to the shared memory region. - -=head2 Why chimera build? - -Current EMX environment does not allow DLLs compiled using Unixish -C format to export symbols for data (or at least some types of -data). This forces C-style compile of F. - -Current EMX environment does not allow F<.EXE> files compiled in -C format to fork(). fork() is needed for exactly three Perl -operations: - -=over 4 - -=item * - -explicit fork() in the script, - -=item * - -C - -=item * - -C, in other words, opening pipes to itself. - -=back - -While these operations are not questions of life and death, they are -needed for a lot of -useful scripts. This forces C-style compile of -F. - - -=head1 ENVIRONMENT - -Here we list environment variables with are either OS/2- and DOS- and -Win*-specific, or are more important under OS/2 than under other OSes. - -=head2 C - -Specific for EMX port. Should have the form - - path1;path2 - -or - - path1 path2 - -If the beginning of some prebuilt path matches F, it is -substituted with F. - -Should be used if the perl library is moved from the default -location in preference to C, since this would not leave wrong -entries in @INC. For example, if the compiled version of perl looks for @INC -in F, and you want to install the library in -F, do - - set PERLLIB_PREFIX=f:/perllib/lib;h:/opt/gnu - -This will cause Perl with the prebuilt @INC of - - f:/perllib/lib/5.00553/os2 - f:/perllib/lib/5.00553 - f:/perllib/lib/site_perl/5.00553/os2 - f:/perllib/lib/site_perl/5.00553 - . - -to use the following @INC: - - h:/opt/gnu/5.00553/os2 - h:/opt/gnu/5.00553 - h:/opt/gnu/site_perl/5.00553/os2 - h:/opt/gnu/site_perl/5.00553 - . - -=head2 C - -If 0, perl ignores setlocale() failing. May be useful with some -strange Is. - -=head2 C - -If 0, perl would not warn of in case of unwarranted free(). With older -perls this might be -useful in conjunction with the module DB_File, which was buggy when -dynamically linked and OMF-built. - -Should not be set with newer Perls, since this may hide some I problems. - -=head2 C - -Specific for EMX port. Gives the directory part of the location for -F. - -=head2 C - -Specific for EMX port. Since L is present in EMX, but is not -functional, it is emulated by perl. To disable the emulations, set -environment variable C. - -=head2 C or C - -Specific for EMX port. Used as storage place for temporary files. - -=head1 Evolution - -Here we list major changes which could make you by surprise. - -=head2 Priorities - -C and C are not compatible with earlier -ports by Andreas Kaiser. See C<"setpriority, getpriority">. - -=head2 DLL name mangling - -With the release 5.003_01 the dynamically loadable libraries -should be rebuilt when a different version of Perl is compiled. In particular, -DLLs (including F) are now created with the names -which contain a checksum, thus allowing workaround for OS/2 scheme of -caching DLLs. - -It may be possible to code a simple workaround which would - -=over - -=item * - -find the old DLLs looking through the old @INC; - -=item * - -mangle the names according to the scheme of new perl and copy the DLLs to -these names; - -=item * - -edit the internal C tables of DLL to reflect the change of the name -(probably not needed for Perl extension DLLs, since the internally coded names -are not used for "specific" DLLs, they used only for "global" DLLs). - -=item * - -edit the internal C tables and change the name of the "old" -F to the "new" F. - -=back - -=head2 Threading - -As of release 5.003_01 perl is linked to multithreaded C RTL -DLL. If perl itself is not compiled multithread-enabled, so will not be perl's -malloc(). However, extensions may use multiple thread on their own -risk. - -This was needed to compile C for XFree86-OS/2 out-of-the-box, and -link with DLLs for other useful libraries, which typically are compiled -with C<-Zmt -Zcrtdll>. - -=head2 Calls to external programs - -Due to a popular demand the perl external program calling has been -changed wrt Andreas Kaiser's port. I perl needs to call an -external program I, the F will be called, or -whatever is the override, see L<"PERL_SH_DIR">. - -Thus means that you need to get some copy of a F as well (I -use one from pdksh). The path F above is set up automatically during -the build to a correct value on the builder machine, but is -overridable at runtime, - -B a consensus on C was that perl should use -one non-overridable shell per platform. The obvious choices for OS/2 -are F and F. Having perl build itself would be impossible -with F as a shell, thus I picked up C. This assures almost -100% compatibility with the scripts coming from *nix. As an added benefit -this works as well under DOS if you use DOS-enabled port of pdksh -(see L<"Prerequisites">). - -B currently F of pdksh calls external programs -via fork()/exec(), and there is I functioning exec() on -OS/2. exec() is emulated by EMX by an asynchronous call while the caller -waits for child completion (to pretend that the C did not change). This -means that 1 I copy of F is made active via fork()/exec(), -which may lead to some resources taken from the system (even if we do -not count extra work needed for fork()ing). - -Note that this a lesser issue now when we do not spawn F -unless needed (metachars found). - -One can always start F explicitly via - - system 'cmd', '/c', 'mycmd', 'arg1', 'arg2', ... - -If you need to use F, and do not want to hand-edit thousands of your -scripts, the long-term solution proposed on p5-p is to have a directive - - use OS2::Cmd; - -which will override system(), exec(), C<``>, and -C. With current perl you may override only system(), -readpipe() - the explicit version of C<``>, and maybe exec(). The code -will substitute the one-argument call to system() by -C. - -If you have some working code for C, please send it to me, -I will include it into distribution. I have no need for such a module, so -cannot test it. - -For the details of the current situation with calling external programs, -see L. Set us mention a couple -of features: - -=over 4 - -=item * - -External scripts may be called by their basename. Perl will try the same -extensions as when processing B<-S> command-line switch. - -=item * - -External scripts starting with C<#!> or C will be executed directly, -without calling the shell, by calling the program specified on the rest of -the first line. - -=back - -=head2 Memory allocation - -Perl uses its own malloc() under OS/2 - interpreters are usually malloc-bound -for speed, but perl is not, since its malloc is lightning-fast. -Perl-memory-usage-tuned benchmarks show that Perl's malloc is 5 times quicker -than EMX one. I do not have convincing data about memory footprint, but -a (pretty random) benchmark showed that Perl's one is 5% better. - -Combination of perl's malloc() and rigid DLL name resolution creates -a special problem with library functions which expect their return value to -be free()d by system's free(). To facilitate extensions which need to call -such functions, system memory-allocation functions are still available with -the prefix C added. (Currently only DLL perl has this, it should -propagate to F shortly.) - -=head2 Threads - -One can build perl with thread support enabled by providing C<-D usethreads> -option to F. Currently OS/2 support of threads is very -preliminary. - -Most notable problems: - -=over 4 - -=item C - -may have a race condition. Needs a reimplementation (in terms of chaining -waiting threads, with the linked list stored in per-thread structure?). - -=item F - -has a couple of static variables used in OS/2-specific functions. (Need to be -moved to per-thread structure, or serialized?) - -=back - -Note that these problems should not discourage experimenting, since they -have a low probability of affecting small programs. - -=cut - -OS/2 extensions -~~~~~~~~~~~~~~~ -I include 3 extensions by Andreas Kaiser, OS2::REXX, OS2::UPM, and OS2::FTP, -into my ftp directory, mirrored on CPAN. I made -some minor changes needed to compile them by standard tools. I cannot -test UPM and FTP, so I will appreciate your feedback. Other extensions -there are OS2::ExtAttr, OS2::PrfDB for tied access to EAs and .INI -files - and maybe some other extensions at the time you read it. - -Note that OS2 perl defines 2 pseudo-extension functions -OS2::Copy::copy and DynaLoader::mod2fname (many more now, see -L). - -The -R switch of older perl is deprecated. If you need to call a REXX code -which needs access to variables, include the call into a REXX compartment -created by - REXX_call {...block...}; - -Two new functions are supported by REXX code, - REXX_eval 'string'; - REXX_eval_with 'string', REXX_function_name => \&perl_sub_reference; - -If you have some other extensions you want to share, send the code to -me. At least two are available: tied access to EA's, and tied access -to system databases. - -=head1 AUTHOR - -Ilya Zakharevich, ilya@math.ohio-state.edu - -=head1 SEE ALSO - -perl(1). - -=cut - diff --git a/lib/perl5/5.6.1/pods/perlos390.pod b/lib/perl5/5.6.1/pods/perlos390.pod deleted file mode 100644 index 61a97096..00000000 --- a/lib/perl5/5.6.1/pods/perlos390.pod +++ /dev/null @@ -1,406 +0,0 @@ - -This document is written in pod format hence there are punctuation -characters in odd places. Do not worry, you've apparently got -the ASCII->EBCDIC translation worked out correctly. You can read -more about pod in pod/perlpod.pod or the short summary in the -INSTALL file. - -=head1 NAME - -README.os390 - building and installing Perl for OS/390. - -=head1 SYNOPSIS - -This document will help you Configure, build, test and install Perl -on OS/390 Unix System Services. - -=head1 DESCRIPTION - -This is a fully ported Perl for OS/390 Version 2 Release 3, 5, 6, 7, -8, and 9. It may work on other versions or releases, but those are -the ones we've tested it on. - -You may need to carry out some system configuration tasks before -running the Configure script for Perl. - -=head2 Unpacking - -Gunzip/gzip for OS/390 is discussed at: - - http://www.s390.ibm.com/products/oe/bpxqp1.html - -to extract an ASCII tar archive on OS/390, try this: - - pax -o to=IBM-1047,from=ISO8859-1 -r < latest.tar - -=head2 Setup and utilities - -Be sure that your yacc installation is in place including any necessary -parser template files. If you have not already done so then be sure to: - - cp /samples/yyparse.c /etc - -This may also be a good time to ensure that your /etc/protocol file -and either your /etc/resolv.conf or /etc/hosts files are in place. -The IBM document that described such USS system setup issues was -SC28-1890-07 "OS/390 UNIX System Services Planning", in particular -Chapter 6 on customizing the OE shell. - -GNU make for OS/390, which is recommended for the build of perl (as well as -building CPAN modules and extensions), is available from: - - http://www.mks.com/s390/gnu/index.htm - -Some people have reported encountering "Out of memory!" errors while -trying to build Perl using GNU make binaries. If you encounter such -trouble then try to download the source code kit and build GNU make -from source to eliminate any such trouble. You might also find GNU make -(as well as Perl and Apache) in the red-piece/book "Open Source Software -for OS/390 UNIX", SG24-5944-00 from IBM. - -If instead of the recommended GNU make you would like to use the system -supplied make program then be sure to install the default rules file -properly via the shell command: - - cp /samples/startup.mk /etc - -and be sure to also set the environment variable _C89_CCMODE=1 (exporting -_C89_CCMODE=1 is also a good idea for users of GNU make). - -You might also want to have GNU groff for OS/390 installed before -running the `make install` step for Perl. - -There is a syntax error in the /usr/include/sys/socket.h header file -that IBM supplies with USS V2R7, V2R8, and possibly V2R9. The problem with -the header file is that near the definition of the SO_REUSEPORT constant -there is a spurious extra '/' character outside of a comment like so: - - #define SO_REUSEPORT 0x0200 /* allow local address & port - reuse */ / - -You could edit that header yourself to remove that last '/', or you might -note that Language Environment (LE) APAR PQ39997 describes the problem -and PTF's UQ46272 and UQ46271 are the (R8 at least) fixes and apply them. -If left unattended that syntax error will turn up as an inability for Perl -to build its "Socket" extension. - -For successful testing you may need to turn on the sticky bit for your -world readable /tmp directory if you have not already done so (see man chmod). - -=head2 Configure - -Once you've unpacked the distribution, run "sh Configure" (see INSTALL -for a full discussion of the Configure options). There is a "hints" file -for os390 that specifies the correct values for most things. Some things -to watch out for include: - -=over 4 - -=item * - -A message of the form: - - (I see you are using the Korn shell. Some ksh's blow up on Configure, - mainly on older exotic systems. If yours does, try the Bourne shell instead.) - -is nothing to worry about at all. - -=item * - -Some of the parser default template files in /samples are needed in /etc. -In particular be sure that you at least copy /samples/yyparse.c to /etc -before running Perl's Configure. This step ensures successful extraction -of EBCDIC versions of parser files such as perly.c, perly.h, and x2p/a2p.c. -This has to be done before running Configure the first time. If you failed -to do so then the easiest way to re-Configure Perl is to delete your -misconfigured build root and re-extract the source from the tar ball. -Then you must ensure that /etc/yyparse.c is properly in place before -attempting to re-run Configure. - -=item * - -This port will support dynamic loading, but it is not selected by -default. If you would like to experiment with dynamic loading then -be sure to specify -Dusedl in the arguments to the Configure script. -See the comments in hints/os390.sh for more information on dynamic loading. -If you build with dynamic loading then you will need to add the -$archlibexp/CORE directory to your LIBPATH environment variable in order -for perl to work. See the config.sh file for the value of $archlibexp. -If in trying to use Perl you see an error message similar to: - - CEE3501S The module libperl.dll was not found. - From entry point __dllstaticinit at compile unit offset +00000194 at - -then your LIBPATH does not have the location of libperl.x and either -libperl.dll or libperl.so in it. Add that directory to your LIBPATH and -proceed. - -=item * - -Do not turn on the compiler optimization flag "-O". There is -a bug in either the optimizer or perl that causes perl to -not work correctly when the optimizer is on. - -=item * - -Some of the configuration files in /etc used by the -networking APIs are either missing or have the wrong -names. In particular, make sure that there's either -an /etc/resolv.conf or an /etc/hosts, so that -gethostbyname() works, and make sure that the file -/etc/proto has been renamed to /etc/protocol (NOT -/etc/protocols, as used by other Unix systems). -You may have to look for things like HOSTNAME and DOMAINORIGIN -in the "//'SYS1.TCPPARMS(TCPDATA)'" PDS member in order to -properly set up your /etc networking files. - -=back - -=head2 Build, test, install - -Simply put: - - sh Configure - make - make test - -if everything looks ok (see the next section for test/IVP diagnosis) then: - - make install - -this last step may or may not require UID=0 privileges depending -on how you answered the questions that Configure asked and whether -or not you have write access to the directories you specified. - -=head2 build anomalies - -"Out of memory!" messages during the build of Perl are most often fixed -by re building the GNU make utility for OS/390 from a source code kit. - -Another memory limiting item to check is your MAXASSIZE parameter in your -'SYS1.PARMLIB(BPXPRMxx)' data set (note too that as of V2R8 address space -limits can be set on a per user ID basis in the USS segment of a RACF -profile). People have reported successful builds of Perl with MAXASSIZE -parameters as small as 503316480 (and it may be possible to build Perl -with a MAXASSIZE smaller than that). - -Within USS your /etc/profile or $HOME/.profile may limit your ulimit -settings. Check that the following command returns reasonable values: - - ulimit -a - -To conserve memory you should have your compiler modules loaded into the -Link Pack Area (LPA/ELPA) rather than in a link list or step lib. - -If the c89 compiler complains of syntax errors during the build of the -Socket extension then be sure to fix the syntax error in the system -header /usr/include/sys/socket.h. - -=head2 testing anomalies - -The `make test` step runs a Perl Verification Procedure, usually before -installation. You might encounter STDERR messages even during a successful -run of `make test`. Here is a guide to some of the more commonly seen -anomalies: - -=over 4 - -=item * - -A message of the form: - - comp/cpp.............ERROR CBC3191 ./.301989890.c:1 The character $ is not a - valid C source character. - FSUM3065 The COMPILE step ended with return code 12. - FSUM3017 Could not compile .301989890.c. Correct the errors and try again. - ok - -indicates that the t/comp/cpp.t test of Perl's -P command line switch has -passed but that the particular invocation of c89 -E in the cpp script does -not suppress the C compiler check of source code validity. - -=item * - -A message of the form: - - io/openpid...........CEE5210S The signal SIGHUP was received. - CEE5210S The signal SIGHUP was received. - CEE5210S The signal SIGHUP was received. - ok - -indicates that the t/io/openpid.t test of Perl has passed but done so -with extraneous messages on stderr from CEE. - -=item * - -A message of the form: - - lib/ftmp-security....File::Temp::_gettemp: Parent directory (/tmp/) is not safe - (sticky bit not set when world writable?) at lib/ftmp-security.t line 100 - File::Temp::_gettemp: Parent directory (/tmp/) is not safe (sticky bit not - set when world writable?) at lib/ftmp-security.t line 100 - ok - -indicates a problem with the permissions on your /tmp directory within the HFS. -To correct that problem issue the command: - - chmod a+t /tmp - -from an account with write access to the directory entry for /tmp. - -=back - -=head2 installation anomalies - -The installman script will try to run on OS/390. There will be fewer errors -if you have a roff utility installed. You can obtain GNU groff from the -Redbook SG24-5944-00 ftp site. - -=head2 Usage Hints - -When using perl on OS/390 please keep in mind that the EBCDIC and ASCII -character sets are different. See perlebcdic.pod for more on such character -set issues. Perl builtin functions that may behave differently under -EBCDIC are also mentioned in the perlport.pod document. - -Open Edition (UNIX System Services) from V2R8 onward does support -#!/path/to/perl script invocation. There is a PTF available from -IBM for V2R7 that will allow shell/kernel support for #!. USS -releases prior to V2R7 did not support the #! means of script invocation. -If you are running V2R6 or earlier then see: - - head `whence perldoc` - -for an example of how to use the "eval exec" trick to ask the shell to -have Perl run your scripts on those older releases of Unix System Services. - -If you are having trouble with square brackets then consider switching your -rlogin or telnet client. Try to avoid older 3270 emulators and ISHELL for -working with Perl on USS. - -=head2 Floating point anomalies - -There appears to be a bug in the floating point implementation on S/390 -systems such that calling int() on the product of a number and a small -magnitude number is not the same as calling int() on the quotient of -that number and a large magnitude number. For example, in the following -Perl code: - - my $x = 100000.0; - my $y = int($x * 1e-5) * 1e5; # '0' - my $z = int($x / 1e+5) * 1e5; # '100000' - print "\$y is $y and \$z is $z\n"; # $y is 0 and $z is 100000 - -Although one would expect the quantities $y and $z to be the same and equal -to 100000 they will differ and instead will be 0 and 100000 respectively. - -The problem can be further examined in a roughly equivalent C program: - - #include - #include - main() - { - double r1,r2; - double x = 100000.0; - double y = 0.0; - double z = 0.0; - x = 100000.0 * 1e-5; - r1 = modf (x,&y); - x = 100000.0 / 1e+5; - r2 = modf (x,&z); - printf("y is %e and z is %e\n",y*1e5,z*1e5); - /* y is 0.000000e+00 and z is 1.000000e+05 (with c89) */ - } - -=head2 Modules and Extensions - -Pure pure (that is non xs) modules may be installed via the usual: - - perl Makefile.PL - make - make test - make install - -If you built perl with dynamic loading capability then that would also -be the way to build xs based extensions. However, if you built perl with -the default static linking you can still build xs based extensions for OS/390 -but you will need to follow the instructions in ExtUtils::MakeMaker for -building statically linked perl binaries. In the simplest configurations -building a static perl + xs extension boils down to: - - perl Makefile.PL - make - make perl - make test - make install - make -f Makefile.aperl inst_perl MAP_TARGET=perl - -In most cases people have reported better results with GNU make rather -than the system's /bin/make program, whether for plain modules or for -xs based extensions. - -If the make process encounters trouble with either compilation or -linking then try setting the _C89_CCMODE to 1. Assuming sh is your -login shell then run: - - export _C89_CCMODE=1 - -If tcsh is your login shell then use the setenv command. - -=head1 AUTHORS - -David Fiander and Peter Prymmer with thanks to Dennis Longnecker -and William Raffloer for valuable reports, LPAR and PTF feedback. -Thanks to Mike MacIsaac and Egon Terwedow for SG24-5944-00. -Thanks to Ignasi Roca for pointing out the floating point problems. -Thanks to John Goodyear for dynamic loading help. - -=head1 SEE ALSO - -L, L, L, L. - - http://www.mks.com/s390/gnu/index.htm - - http://www.redbooks.ibm.com/abstracts/sg245944.html - - http://www.s390.ibm.com/products/oe/bpxa1ty1.html#opensrc - - http://www.s390.ibm.com/products/oe/portbk/bpxacenv.html - - http://www.xray.mpe.mpg.de/mailing-lists/perl-mvs/ - -=head2 Mailing list - -The Perl Institute (http://www.perl.org/) maintains a perl-mvs -mailing list of interest to all folks building and/or -using perl on all EBCDIC platforms (not just OS/390). -To subscribe, send a message of: - - subscribe perl-mvs - -to majordomo@perl.org. See also: - - http://lists.perl.org/showlist.cgi?name=perl-mvs - -There are web archives of the mailing list at: - - http://www.xray.mpe.mpg.de/mailing-lists/perl-mvs/ - http://archive.develooper.com/perl-mvs@perl.org/ - -=head1 HISTORY - -This document was originally written by David Fiander for the 5.005 -release of Perl. - -This document was podified for the 5.005_03 release of Perl 11 March 1999. - -Updated 12 November 2000 for the 5.7.1 release of Perl. - -Updated 15 January 2001 for the 5.7.1 release of Perl. - -Updated 24 January 2001 to mention dynamic loading. - -Updated 12 March 2001 to mention //'SYS1.TCPPARMS(TCPDATA)'. - -=cut - diff --git a/lib/perl5/5.6.1/pods/perlpod.pod b/lib/perl5/5.6.1/pods/perlpod.pod deleted file mode 100644 index 1076ffe4..00000000 --- a/lib/perl5/5.6.1/pods/perlpod.pod +++ /dev/null @@ -1,318 +0,0 @@ -=head1 NAME - -perlpod - plain old documentation - -=head1 DESCRIPTION - -A pod-to-whatever translator reads a pod file paragraph by paragraph, -and translates it to the appropriate output format. There are -three kinds of paragraphs: -L, -L, and -L. - -=head2 Verbatim Paragraph - -A verbatim paragraph, distinguished by being indented (that is, -it starts with space or tab). It should be reproduced exactly, -with tabs assumed to be on 8-column boundaries. There are no -special formatting escapes, so you can't italicize or anything -like that. A \ means \, and nothing else. - -=head2 Command Paragraph - -All command paragraphs start with "=", followed by an -identifier, followed by arbitrary text that the command can -use however it pleases. Currently recognized commands are - - =head1 heading - =head2 heading - =item text - =over N - =back - =cut - =pod - =for X - =begin X - =end X - -=over 4 - -=item =pod - -=item =cut - -The "=pod" directive does nothing beyond telling the compiler to lay -off parsing code through the next "=cut". It's useful for adding -another paragraph to the doc if you're mixing up code and pod a lot. - -=item =head1 - -=item =head2 - -Head1 and head2 produce first and second level headings, with the text in -the same paragraph as the "=headn" directive forming the heading description. - -=item =over - -=item =back - -=item =item - -Item, over, and back require a little more explanation: "=over" starts a -section specifically for the generation of a list using "=item" commands. At -the end of your list, use "=back" to end it. You will probably want to give -"4" as the number to "=over", as some formatters will use this for indentation. -The unit of indentation is optional. If the unit is not given the natural -indentation of the formatting system applied will be used. Note also that -there are some basic rules to using =item: don't use them outside of -an =over/=back block, use at least one inside an =over/=back block, you don't -_have_ to include the =back if the list just runs off the document, and -perhaps most importantly, keep the items consistent: either use "=item *" for -all of them, to produce bullets, or use "=item 1.", "=item 2.", etc., to -produce numbered lists, or use "=item foo", "=item bar", etc., i.e., things -that looks nothing like bullets or numbers. If you start with bullets or -numbers, stick with them, as many formatters use the first "=item" type to -decide how to format the list. - -=item =for - -=item =begin - -=item =end - -For, begin, and end let you include sections that are not interpreted -as pod text, but passed directly to particular formatters. A formatter -that can utilize that format will use the section, otherwise it will be -completely ignored. The directive "=for" specifies that the entire next -paragraph is in the format indicated by the first word after -"=for", like this: - - =for html
    -

    This is a raw HTML paragraph

    - -The paired commands "=begin" and "=end" work very similarly to "=for", but -instead of only accepting a single paragraph, all text from "=begin" to a -paragraph with a matching "=end" are treated as a particular format. - -Here are some examples of how to use these: - - =begin html - -
    Figure 1.
    - - =end html - - =begin text - - --------------- - | foo | - | bar | - --------------- - - ^^^^ Figure 1. ^^^^ - - =end text - -Some format names that formatters currently are known to accept include -"roff", "man", "latex", "tex", "text", and "html". (Some formatters will -treat some of these as synonyms.) - -And don't forget, when using any command, that the command lasts up until -the end of the B, not the line. Hence in the examples below, you -can see the empty lines after each command to end its paragraph. - -Some examples of lists include: - - =over 4 - - =item * - - First item - - =item * - - Second item - - =back - - =over 4 - - =item Foo() - - Description of Foo function - - =item Bar() - - Description of Bar function - - =back - -=back - -=head2 Ordinary Block of Text - -It will be filled, and maybe even -justified. Certain interior sequences are recognized both -here and in commands: - - I Italicize text, used for emphasis or variables - B Embolden text, used for switches and programs - S Text contains non-breaking spaces - C Render code in a typewriter font, or give some other - indication that this represents program text - L A link (cross reference) to name - L manual page - L item in manual page - L section in other manual page - L<"sec"> section in this manual page - (the quotes are optional) - L ditto - same as above but only 'text' is used for output. - (Text can not contain the characters '/' and '|', - and should contain matched '<' or '>') - L - L - L - L - L - - F Used for filenames - X An index entry - Z<> A zero-width character - E A named character (very similar to HTML escapes) - E A literal < - E A literal > - E A literal / - E A literal | - (these are optional except in other interior - sequences and when preceded by a capital letter) - E Character number n (probably in ASCII) - E Some non-numeric HTML entity, such - as E - -Most of the time, you will only need a single set of angle brackets to -delimit the beginning and end of interior sequences. However, sometimes -you will want to put a right angle bracket (or greater-than sign '>') -inside of a sequence. This is particularly common when using a sequence -to provide a different font-type for a snippet of code. As with all -things in Perl, there is more than one way to do it. One way is to -simply escape the closing bracket using an C sequence: - - C<$a E=E $b> - -This will produce: "C<$a E=E $b>" - -A more readable, and perhaps more "plain" way is to use an alternate set of -delimiters that doesn't require a ">" to be escaped. As of perl5.5.660, -doubled angle brackets ("<<" and ">>") may be used I For example, the following will do the -trick: - - C<< $a <=> $b >> - -In fact, you can use as many repeated angle-brackets as you like so -long as you have the same number of them in the opening and closing -delimiters, and make sure that whitespace immediately follows the last -'<' of the opening delimiter, and immediately precedes the first '>' of -the closing delimiter. So the following will also work: - - C<<< $a <=> $b >>> - C<<<< $a <=> $b >>>> - -This is currently supported by pod2text (Pod::Text), pod2man (Pod::Man), -and any other pod2xxx and Pod::Xxxx translator that uses Pod::Parser -1.093 or later. - - -=head2 The Intent - -That's it. The intent is simplicity, not power. I wanted paragraphs -to look like paragraphs (block format), so that they stand out -visually, and so that I could run them through fmt easily to reformat -them (that's F7 in my version of B). I wanted the translator (and not -me) to worry about whether " or ' is a left quote or a right quote -within filled text, and I wanted it to leave the quotes alone, dammit, in -verbatim mode, so I could slurp in a working program, shift it over 4 -spaces, and have it print out, er, verbatim. And presumably in a -constant width font. - -In particular, you can leave things like this verbatim in your text: - - Perl - FILEHANDLE - $variable - function() - manpage(3r) - -Doubtless a few other commands or sequences will need to be added along -the way, but I've gotten along surprisingly well with just these. - -Note that I'm not at all claiming this to be sufficient for producing a -book. I'm just trying to make an idiot-proof common source for nroff, -TeX, and other markup languages, as used for online documentation. -Translators exist for B (that's for nroff(1) and troff(1)), -B, B, B, and B. - -=head2 Embedding Pods in Perl Modules - -You can embed pod documentation in your Perl scripts. Start your -documentation with a "=head1" command at the beginning, and end it -with a "=cut" command. Perl will ignore the pod text. See any of the -supplied library modules for examples. If you're going to put your -pods at the end of the file, and you're using an __END__ or __DATA__ -cut mark, make sure to put an empty line there before the first pod -directive. - - __END__ - - =head1 NAME - - modern - I am a modern module - -If you had not had that empty line there, then the translators wouldn't -have seen it. - -=head2 Common Pod Pitfalls - -=over 4 - -=item * - -Pod translators usually will require paragraphs to be separated by -completely empty lines. If you have an apparently empty line with -some spaces on it, this can cause odd formatting. - -=item * - -Translators will mostly add wording around a LEE link, so that -Cfoo(1)E> becomes "the I(1) manpage", for example (see -B for details). Thus, you shouldn't write things like CfooE manpage>, if you want the translated document to read -sensibly. - -If you need total control of the text used for a link in the output -use the form LEshow this text|fooE instead. - -=item * - -The B command is provided to check pod syntax -for errors and warnings. For example, it checks for completely -blank lines in pod segments and for unknown escape sequences. -It is still advised to pass it through -one or more translators and proofread the result, or print out the -result and proofread that. Some of the problems found may be bugs in -the translators, which you may or may not wish to work around. - -=back - -=head1 SEE ALSO - -L, L, -L - -=head1 AUTHOR - -Larry Wall - diff --git a/lib/perl5/5.6.1/pods/perlport.pod b/lib/perl5/5.6.1/pods/perlport.pod deleted file mode 100644 index 5eb32cef..00000000 --- a/lib/perl5/5.6.1/pods/perlport.pod +++ /dev/null @@ -1,2078 +0,0 @@ -=head1 NAME - -perlport - Writing portable Perl - -=head1 DESCRIPTION - -Perl runs on numerous operating systems. While most of them share -much in common, they also have their own unique features. - -This document is meant to help you to find out what constitutes portable -Perl code. That way once you make a decision to write portably, -you know where the lines are drawn, and you can stay within them. - -There is a tradeoff between taking full advantage of one particular -type of computer and taking advantage of a full range of them. -Naturally, as you broaden your range and become more diverse, the -common factors drop, and you are left with an increasingly smaller -area of common ground in which you can operate to accomplish a -particular task. Thus, when you begin attacking a problem, it is -important to consider under which part of the tradeoff curve you -want to operate. Specifically, you must decide whether it is -important that the task that you are coding have the full generality -of being portable, or whether to just get the job done right now. -This is the hardest choice to be made. The rest is easy, because -Perl provides many choices, whichever way you want to approach your -problem. - -Looking at it another way, writing portable code is usually about -willfully limiting your available choices. Naturally, it takes -discipline and sacrifice to do that. The product of portability -and convenience may be a constant. You have been warned. - -Be aware of two important points: - -=over 4 - -=item Not all Perl programs have to be portable - -There is no reason you should not use Perl as a language to glue Unix -tools together, or to prototype a Macintosh application, or to manage the -Windows registry. If it makes no sense to aim for portability for one -reason or another in a given program, then don't bother. - -=item Nearly all of Perl already I portable - -Don't be fooled into thinking that it is hard to create portable Perl -code. It isn't. Perl tries its level-best to bridge the gaps between -what's available on different platforms, and all the means available to -use those features. Thus almost all Perl code runs on any machine -without modification. But there are some significant issues in -writing portable code, and this document is entirely about those issues. - -=back - -Here's the general rule: When you approach a task commonly done -using a whole range of platforms, think about writing portable -code. That way, you don't sacrifice much by way of the implementation -choices you can avail yourself of, and at the same time you can give -your users lots of platform choices. On the other hand, when you have to -take advantage of some unique feature of a particular platform, as is -often the case with systems programming (whether for Unix, Windows, -S, VMS, etc.), consider writing platform-specific code. - -When the code will run on only two or three operating systems, you -may need to consider only the differences of those particular systems. -The important thing is to decide where the code will run and to be -deliberate in your decision. - -The material below is separated into three main sections: main issues of -portability (L<"ISSUES">, platform-specific issues (L<"PLATFORMS">, and -built-in perl functions that behave differently on various ports -(L<"FUNCTION IMPLEMENTATIONS">. - -This information should not be considered complete; it includes possibly -transient information about idiosyncrasies of some of the ports, almost -all of which are in a state of constant evolution. Thus, this material -should be considered a perpetual work in progress -(Under Construction). - -=head1 ISSUES - -=head2 Newlines - -In most operating systems, lines in files are terminated by newlines. -Just what is used as a newline may vary from OS to OS. Unix -traditionally uses C<\012>, one type of DOSish I/O uses C<\015\012>, -and S uses C<\015>. - -Perl uses C<\n> to represent the "logical" newline, where what is -logical may depend on the platform in use. In MacPerl, C<\n> always -means C<\015>. In DOSish perls, C<\n> usually means C<\012>, but -when accessing a file in "text" mode, STDIO translates it to (or -from) C<\015\012>, depending on whether you're reading or writing. -Unix does the same thing on ttys in canonical mode. C<\015\012> -is commonly referred to as CRLF. - -A common cause of unportable programs is the misuse of chop() to trim -newlines: - - # XXX UNPORTABLE! - while() { - chop; - @array = split(/:/); - #... - } - -You can get away with this on Unix and MacOS (they have a single -character end-of-line), but the same program will break under DOSish -perls because you're only chop()ing half the end-of-line. Instead, -chomp() should be used to trim newlines. The Dunce::Files module can -help audit your code for misuses of chop(). - -When dealing with binary files (or text files in binary mode) be sure -to explicitly set $/ to the appropriate value for your file format -before using chomp(). - -Because of the "text" mode translation, DOSish perls have limitations -in using C and C on a file accessed in "text" mode. -Stick to C-ing to locations you got from C (and no -others), and you are usually free to use C and C even -in "text" mode. Using C or C or other file operations -may be non-portable. If you use C on a file, however, you -can usually C and C with arbitrary values in safety. - -A common misconception in socket programming is that C<\n> eq C<\012> -everywhere. When using protocols such as common Internet protocols, -C<\012> and C<\015> are called for specifically, and the values of -the logical C<\n> and C<\r> (carriage return) are not reliable. - - print SOCKET "Hi there, client!\r\n"; # WRONG - print SOCKET "Hi there, client!\015\012"; # RIGHT - -However, using C<\015\012> (or C<\cM\cJ>, or C<\x0D\x0A>) can be tedious -and unsightly, as well as confusing to those maintaining the code. As -such, the Socket module supplies the Right Thing for those who want it. - - use Socket qw(:DEFAULT :crlf); - print SOCKET "Hi there, client!$CRLF" # RIGHT - -When reading from a socket, remember that the default input record -separator C<$/> is C<\n>, but robust socket code will recognize as -either C<\012> or C<\015\012> as end of line: - - while () { - # ... - } - -Because both CRLF and LF end in LF, the input record separator can -be set to LF and any CR stripped later. Better to write: - - use Socket qw(:DEFAULT :crlf); - local($/) = LF; # not needed if $/ is already \012 - - while () { - s/$CR?$LF/\n/; # not sure if socket uses LF or CRLF, OK - # s/\015?\012/\n/; # same thing - } - -This example is preferred over the previous one--even for Unix -platforms--because now any C<\015>'s (C<\cM>'s) are stripped out -(and there was much rejoicing). - -Similarly, functions that return text data--such as a function that -fetches a web page--should sometimes translate newlines before -returning the data, if they've not yet been translated to the local -newline representation. A single line of code will often suffice: - - $data =~ s/\015?\012/\n/g; - return $data; - -Some of this may be confusing. Here's a handy reference to the ASCII CR -and LF characters. You can print it out and stick it in your wallet. - - LF == \012 == \x0A == \cJ == ASCII 10 - CR == \015 == \x0D == \cM == ASCII 13 - - | Unix | DOS | Mac | - --------------------------- - \n | LF | LF | CR | - \r | CR | CR | LF | - \n * | LF | CRLF | CR | - \r * | CR | CR | LF | - --------------------------- - * text-mode STDIO - -The Unix column assumes that you are not accessing a serial line -(like a tty) in canonical mode. If you are, then CR on input becomes -"\n", and "\n" on output becomes CRLF. - -These are just the most common definitions of C<\n> and C<\r> in Perl. -There may well be others. - -=head2 Numbers endianness and Width - -Different CPUs store integers and floating point numbers in different -orders (called I) and widths (32-bit and 64-bit being the -most common today). This affects your programs when they attempt to transfer -numbers in binary format from one CPU architecture to another, -usually either "live" via network connection, or by storing the -numbers to secondary storage such as a disk file or tape. - -Conflicting storage orders make utter mess out of the numbers. If a -little-endian host (Intel, VAX) stores 0x12345678 (305419896 in -decimal), a big-endian host (Motorola, Sparc, PA) reads it as -0x78563412 (2018915346 in decimal). Alpha and MIPS can be either: -Digital/Compaq used/uses them in little-endian mode; SGI/Cray uses -them in big-endian mode. To avoid this problem in network (socket) -connections use the C and C formats C and C, the -"network" orders. These are guaranteed to be portable. - -You can explore the endianness of your platform by unpacking a -data structure packed in native format such as: - - print unpack("h*", pack("s2", 1, 2)), "\n"; - # '10002000' on e.g. Intel x86 or Alpha 21064 in little-endian mode - # '00100020' on e.g. Motorola 68040 - -If you need to distinguish between endian architectures you could use -either of the variables set like so: - - $is_big_endian = unpack("h*", pack("s", 1)) =~ /01/; - $is_little_endian = unpack("h*", pack("s", 1)) =~ /^1/; - -Differing widths can cause truncation even between platforms of equal -endianness. The platform of shorter width loses the upper parts of the -number. There is no good solution for this problem except to avoid -transferring or storing raw binary numbers. - -One can circumnavigate both these problems in two ways. Either -transfer and store numbers always in text format, instead of raw -binary, or else consider using modules like Data::Dumper (included in -the standard distribution as of Perl 5.005) and Storable (included as -of perl 5.8). Keeping all data as text significantly simplifies matters. - -=head2 Files and Filesystems - -Most platforms these days structure files in a hierarchical fashion. -So, it is reasonably safe to assume that all platforms support the -notion of a "path" to uniquely identify a file on the system. How -that path is really written, though, differs considerably. - -Although similar, file path specifications differ between Unix, -Windows, S, OS/2, VMS, VOS, S, and probably others. -Unix, for example, is one of the few OSes that has the elegant idea -of a single root directory. - -DOS, OS/2, VMS, VOS, and Windows can work similarly to Unix with C -as path separator, or in their own idiosyncratic ways (such as having -several root directories and various "unrooted" device files such NIL: -and LPT:). - -S uses C<:> as a path separator instead of C. - -The filesystem may support neither hard links (C) nor -symbolic links (C, C, C). - -The filesystem may support neither access timestamp nor change -timestamp (meaning that about the only portable timestamp is the -modification timestamp), or one second granularity of any timestamps -(e.g. the FAT filesystem limits the time granularity to two seconds). - -VOS perl can emulate Unix filenames with C as path separator. The -native pathname characters greater-than, less-than, number-sign, and -percent-sign are always accepted. - -S perl can emulate Unix filenames with C as path -separator, or go native and use C<.> for path separator and C<:> to -signal filesystems and disk names. - -If all this is intimidating, have no (well, maybe only a little) -fear. There are modules that can help. The File::Spec modules -provide methods to do the Right Thing on whatever platform happens -to be running the program. - - use File::Spec::Functions; - chdir(updir()); # go up one directory - $file = catfile(curdir(), 'temp', 'file.txt'); - # on Unix and Win32, './temp/file.txt' - # on Mac OS, ':temp:file.txt' - # on VMS, '[.temp]file.txt' - -File::Spec is available in the standard distribution as of version -5.004_05. File::Spec::Functions is only in File::Spec 0.7 and later, -and some versions of perl come with version 0.6. If File::Spec -is not updated to 0.7 or later, you must use the object-oriented -interface from File::Spec (or upgrade File::Spec). - -In general, production code should not have file paths hardcoded. -Making them user-supplied or read from a configuration file is -better, keeping in mind that file path syntax varies on different -machines. - -This is especially noticeable in scripts like Makefiles and test suites, -which often assume C as a path separator for subdirectories. - -Also of use is File::Basename from the standard distribution, which -splits a pathname into pieces (base filename, full path to directory, -and file suffix). - -Even when on a single platform (if you can call Unix a single platform), -remember not to count on the existence or the contents of particular -system-specific files or directories, like F, -F, F, or even F
    . For -example, F may exist but not contain the encrypted -passwords, because the system is using some form of enhanced security. -Or it may not contain all the accounts, because the system is using NIS. -If code does need to rely on such a file, include a description of the -file and its format in the code's documentation, then make it easy for -the user to override the default location of the file. - -Don't assume a text file will end with a newline. They should, -but people forget. - -Do not have two files of the same name with different case, like -F and F, as many platforms have case-insensitive -filenames. Also, try not to have non-word characters (except for C<.>) -in the names, and keep them to the 8.3 convention, for maximum -portability, onerous a burden though this may appear. - -Likewise, when using the AutoSplit module, try to keep your functions to -8.3 naming and case-insensitive conventions; or, at the least, -make it so the resulting files have a unique (case-insensitively) -first 8 characters. - -Whitespace in filenames is tolerated on most systems, but not all. -Many systems (DOS, VMS) cannot have more than one C<.> in their filenames. - -Don't assume C<< > >> won't be the first character of a filename. -Always use C<< < >> explicitly to open a file for reading, -unless you want the user to be able to specify a pipe open. - - open(FILE, "< $existing_file") or die $!; - -If filenames might use strange characters, it is safest to open it -with C instead of C. C is magic and can -translate characters like C<< > >>, C<< < >>, and C<|>, which may -be the wrong thing to do. (Sometimes, though, it's the right thing.) - -=head2 System Interaction - -Not all platforms provide a command line. These are usually platforms -that rely primarily on a Graphical User Interface (GUI) for user -interaction. A program requiring a command line interface might -not work everywhere. This is probably for the user of the program -to deal with, so don't stay up late worrying about it. - -Some platforms can't delete or rename files held open by the system. -Remember to C files when you are done with them. Don't -C or C an open file. Don't C or C a -file already tied or opened; C or C it first. - -Don't open the same file more than once at a time for writing, as some -operating systems put mandatory locks on such files. - -Don't count on a specific environment variable existing in C<%ENV>. -Don't count on C<%ENV> entries being case-sensitive, or even -case-preserving. Don't try to clear %ENV by saying C<%ENV = ();>, or, -if you really have to, make it conditional on C<$^O ne 'VMS'> since in -VMS the C<%ENV> table is much more than a per-process key-value string -table. - -Don't count on signals or C<%SIG> for anything. - -Don't count on filename globbing. Use C, C, and -C instead. - -Don't count on per-program environment variables, or per-program current -directories. - -Don't count on specific values of C<$!>. - -=head2 Interprocess Communication (IPC) - -In general, don't directly access the system in code meant to be -portable. That means, no C, C, C, C, -C<``>, C, C with a C<|>, nor any of the other things -that makes being a perl hacker worth being. - -Commands that launch external processes are generally supported on -most platforms (though many of them do not support any type of -forking). The problem with using them arises from what you invoke -them on. External tools are often named differently on different -platforms, may not be available in the same location, might accept -different arguments, can behave differently, and often present their -results in a platform-dependent way. Thus, you should seldom depend -on them to produce consistent results. (Then again, if you're calling -I, you probably don't expect it to run on both Unix and CP/M.) - -One especially common bit of Perl code is opening a pipe to B: - - open(MAIL, '|/usr/lib/sendmail -t') - or die "cannot fork sendmail: $!"; - -This is fine for systems programming when sendmail is known to be -available. But it is not fine for many non-Unix systems, and even -some Unix systems that may not have sendmail installed. If a portable -solution is needed, see the various distributions on CPAN that deal -with it. Mail::Mailer and Mail::Send in the MailTools distribution are -commonly used, and provide several mailing methods, including mail, -sendmail, and direct SMTP (via Net::SMTP) if a mail transfer agent is -not available. Mail::Sendmail is a standalone module that provides -simple, platform-independent mailing. - -The Unix System V IPC (C) is not available -even on all Unix platforms. - -The rule of thumb for portable code is: Do it all in portable Perl, or -use a module (that may internally implement it with platform-specific -code, but expose a common interface). - -=head2 External Subroutines (XS) - -XS code can usually be made to work with any platform, but dependent -libraries, header files, etc., might not be readily available or -portable, or the XS code itself might be platform-specific, just as Perl -code might be. If the libraries and headers are portable, then it is -normally reasonable to make sure the XS code is portable, too. - -A different type of portability issue arises when writing XS code: -availability of a C compiler on the end-user's system. C brings -with it its own portability issues, and writing XS code will expose -you to some of those. Writing purely in Perl is an easier way to -achieve portability. - -=head2 Standard Modules - -In general, the standard modules work across platforms. Notable -exceptions are the CPAN module (which currently makes connections to external -programs that may not be available), platform-specific modules (like -ExtUtils::MM_VMS), and DBM modules. - -There is no one DBM module available on all platforms. -SDBM_File and the others are generally available on all Unix and DOSish -ports, but not in MacPerl, where only NBDM_File and DB_File are -available. - -The good news is that at least some DBM module should be available, and -AnyDBM_File will use whichever module it can find. Of course, then -the code needs to be fairly strict, dropping to the greatest common -factor (e.g., not exceeding 1K for each record), so that it will -work with any DBM module. See L for more details. - -=head2 Time and Date - -The system's notion of time of day and calendar date is controlled in -widely different ways. Don't assume the timezone is stored in C<$ENV{TZ}>, -and even if it is, don't assume that you can control the timezone through -that variable. - -Don't assume that the epoch starts at 00:00:00, January 1, 1970, -because that is OS- and implementation-specific. It is better to store a date -in an unambiguous representation. The ISO-8601 standard defines -"YYYY-MM-DD" as the date format. A text representation (like "1987-12-18") -can be easily converted into an OS-specific value using a module like -Date::Parse. An array of values, such as those returned by -C, can be converted to an OS-specific representation using -Time::Local. - -When calculating specific times, such as for tests in time or date modules, -it may be appropriate to calculate an offset for the epoch. - - require Time::Local; - $offset = Time::Local::timegm(0, 0, 0, 1, 0, 70); - -The value for C<$offset> in Unix will be C<0>, but in Mac OS will be -some large number. C<$offset> can then be added to a Unix time value -to get what should be the proper value on any system. - -=head2 Character sets and character encoding - -Assume little about character sets. Assume nothing about -numerical values (C, C) of characters. Do not -assume that the alphabetic characters are encoded contiguously (in -the numeric sense). Do not assume anything about the ordering of the -characters. The lowercase letters may come before or after the -uppercase letters; the lowercase and uppercase may be interlaced so -that both `a' and `A' come before `b'; the accented and other -international characters may be interlaced so that E comes -before `b'. - -=head2 Internationalisation - -If you may assume POSIX (a rather large assumption), you may read -more about the POSIX locale system from L. The locale -system at least attempts to make things a little bit more portable, -or at least more convenient and native-friendly for non-English -users. The system affects character sets and encoding, and date -and time formatting--amongst other things. - -=head2 System Resources - -If your code is destined for systems with severely constrained (or -missing!) virtual memory systems then you want to be I mindful -of avoiding wasteful constructs such as: - - # NOTE: this is no longer "bad" in perl5.005 - for (0..10000000) {} # bad - for (my $x = 0; $x <= 10000000; ++$x) {} # good - - @lines = ; # bad - - while () {$file .= $_} # sometimes bad - $file = join('', ); # better - -The last two constructs may appear unintuitive to most people. The -first repeatedly grows a string, whereas the second allocates a -large chunk of memory in one go. On some systems, the second is -more efficient that the first. - -=head2 Security - -Most multi-user platforms provide basic levels of security, usually -implemented at the filesystem level. Some, however, do -not--unfortunately. Thus the notion of user id, or "home" directory, -or even the state of being logged-in, may be unrecognizable on many -platforms. If you write programs that are security-conscious, it -is usually best to know what type of system you will be running -under so that you can write code explicitly for that platform (or -class of platforms). - -=head2 Style - -For those times when it is necessary to have platform-specific code, -consider keeping the platform-specific code in one place, making porting -to other platforms easier. Use the Config module and the special -variable C<$^O> to differentiate platforms, as described in -L<"PLATFORMS">. - -Be careful in the tests you supply with your module or programs. -Module code may be fully portable, but its tests might not be. This -often happens when tests spawn off other processes or call external -programs to aid in the testing, or when (as noted above) the tests -assume certain things about the filesystem and paths. Be careful -not to depend on a specific output style for errors, such as when -checking C<$!> after an system call. Some platforms expect a certain -output format, and perl on those platforms may have been adjusted -accordingly. Most specifically, don't anchor a regex when testing -an error value. - -=head1 CPAN Testers - -Modules uploaded to CPAN are tested by a variety of volunteers on -different platforms. These CPAN testers are notified by mail of each -new upload, and reply to the list with PASS, FAIL, NA (not applicable to -this platform), or UNKNOWN (unknown), along with any relevant notations. - -The purpose of the testing is twofold: one, to help developers fix any -problems in their code that crop up because of lack of testing on other -platforms; two, to provide users with information about whether -a given module works on a given platform. - -=over 4 - -=item Mailing list: cpan-testers@perl.org - -=item Testing results: http://testers.cpan.org/ - -=back - -=head1 PLATFORMS - -As of version 5.002, Perl is built with a C<$^O> variable that -indicates the operating system it was built on. This was implemented -to help speed up code that would otherwise have to C -and use the value of C<$Config{osname}>. Of course, to get more -detailed information about the system, looking into C<%Config> is -certainly recommended. - -C<%Config> cannot always be trusted, however, because it was built -at compile time. If perl was built in one place, then transferred -elsewhere, some values may be wrong. The values may even have been -edited after the fact. - -=head2 Unix - -Perl works on a bewildering variety of Unix and Unix-like platforms (see -e.g. most of the files in the F directory in the source code kit). -On most of these systems, the value of C<$^O> (hence C<$Config{'osname'}>, -too) is determined either by lowercasing and stripping punctuation from the -first field of the string returned by typing C (or a similar command) -at the shell prompt or by testing the file system for the presence of -uniquely named files such as a kernel or header file. Here, for example, -are a few of the more popular Unix flavors: - - uname $^O $Config{'archname'} - -------------------------------------------- - AIX aix aix - BSD/OS bsdos i386-bsdos - dgux dgux AViiON-dgux - DYNIX/ptx dynixptx i386-dynixptx - FreeBSD freebsd freebsd-i386 - Linux linux arm-linux - Linux linux i386-linux - Linux linux i586-linux - Linux linux ppc-linux - HP-UX hpux PA-RISC1.1 - IRIX irix irix - Mac OS X darwin darwin - MachTen PPC machten powerpc-machten - NeXT 3 next next-fat - NeXT 4 next OPENSTEP-Mach - openbsd openbsd i386-openbsd - OSF1 dec_osf alpha-dec_osf - reliantunix-n svr4 RM400-svr4 - SCO_SV sco_sv i386-sco_sv - SINIX-N svr4 RM400-svr4 - sn4609 unicos CRAY_C90-unicos - sn6521 unicosmk t3e-unicosmk - sn9617 unicos CRAY_J90-unicos - SunOS solaris sun4-solaris - SunOS solaris i86pc-solaris - SunOS4 sunos sun4-sunos - -Because the value of C<$Config{archname}> may depend on the -hardware architecture, it can vary more than the value of C<$^O>. - -=head2 DOS and Derivatives - -Perl has long been ported to Intel-style microcomputers running under -systems like PC-DOS, MS-DOS, OS/2, and most Windows platforms you can -bring yourself to mention (except for Windows CE, if you count that). -Users familiar with I or I style shells should -be aware that each of these file specifications may have subtle -differences: - - $filespec0 = "c:/foo/bar/file.txt"; - $filespec1 = "c:\\foo\\bar\\file.txt"; - $filespec2 = 'c:\foo\bar\file.txt'; - $filespec3 = 'c:\\foo\\bar\\file.txt'; - -System calls accept either C or C<\> as the path separator. -However, many command-line utilities of DOS vintage treat C as -the option prefix, so may get confused by filenames containing C. -Aside from calling any external programs, C will work just fine, -and probably better, as it is more consistent with popular usage, -and avoids the problem of remembering what to backwhack and what -not to. - -The DOS FAT filesystem can accommodate only "8.3" style filenames. Under -the "case-insensitive, but case-preserving" HPFS (OS/2) and NTFS (NT) -filesystems you may have to be careful about case returned with functions -like C or used with functions like C or C. - -DOS also treats several filenames as special, such as AUX, PRN, -NUL, CON, COM1, LPT1, LPT2, etc. Unfortunately, sometimes these -filenames won't even work if you include an explicit directory -prefix. It is best to avoid such filenames, if you want your code -to be portable to DOS and its derivatives. It's hard to know what -these all are, unfortunately. - -Users of these operating systems may also wish to make use of -scripts such as I or I to -put wrappers around your scripts. - -Newline (C<\n>) is translated as C<\015\012> by STDIO when reading from -and writing to files (see L<"Newlines">). C -will keep C<\n> translated as C<\012> for that filehandle. Since it is a -no-op on other systems, C should be used for cross-platform code -that deals with binary data. That's assuming you realize in advance -that your data is in binary. General-purpose programs should -often assume nothing about their data. - -The C<$^O> variable and the C<$Config{archname}> values for various -DOSish perls are as follows: - - OS $^O $Config{'archname'} - -------------------------------------------- - MS-DOS dos - PC-DOS dos - OS/2 os2 - Windows 95 MSWin32 MSWin32-x86 - Windows 98 MSWin32 MSWin32-x86 - Windows NT MSWin32 MSWin32-x86 - Windows NT MSWin32 MSWin32-ALPHA - Windows NT MSWin32 MSWin32-ppc - Cygwin cygwin - -The various MSWin32 Perl's can distinguish the OS they are running on -via the value of the fifth element of the list returned from -Win32::GetOSVersion(). For example: - - if ($^O eq 'MSWin32') { - my @os_version_info = Win32::GetOSVersion(); - print +('3.1','95','NT')[$os_version_info[4]],"\n"; - } - -Also see: - -=over 4 - -=item * - -The djgpp environment for DOS, http://www.delorie.com/djgpp/ -and L. - -=item * - -The EMX environment for DOS, OS/2, etc. emx@iaehv.nl, -http://www.leo.org/pub/comp/os/os2/leo/gnu/emx+gcc/index.html or -ftp://hobbes.nmsu.edu/pub/os2/dev/emx. Also L. - -=item * - -Build instructions for Win32 in L, or under the Cygnus environment -in L. - -=item * - -The C modules in L. - -=item * - -The ActiveState Pages, http://www.activestate.com/ - -=item * - -The Cygwin environment for Win32; F (installed -as L), http://www.cygwin.com/ - -=item * - -The U/WIN environment for Win32, -http://www.research.att.com/sw/tools/uwin/ - -=item * - -Build instructions for OS/2, L - -=back - -=head2 S - -Any module requiring XS compilation is right out for most people, because -MacPerl is built using non-free (and non-cheap!) compilers. Some XS -modules that can work with MacPerl are built and distributed in binary -form on CPAN. - -Directories are specified as: - - volume:folder:file for absolute pathnames - volume:folder: for absolute pathnames - :folder:file for relative pathnames - :folder: for relative pathnames - :file for relative pathnames - file for relative pathnames - -Files are stored in the directory in alphabetical order. Filenames are -limited to 31 characters, and may include any character except for -null and C<:>, which is reserved as the path separator. - -Instead of C, see C and C in the -Mac::Files module, or C and C. - -In the MacPerl application, you can't run a program from the command line; -programs that expect C<@ARGV> to be populated can be edited with something -like the following, which brings up a dialog box asking for the command -line arguments. - - if (!@ARGV) { - @ARGV = split /\s+/, MacPerl::Ask('Arguments?'); - } - -A MacPerl script saved as a "droplet" will populate C<@ARGV> with the full -pathnames of the files dropped onto the script. - -Mac users can run programs under a type of command line interface -under MPW (Macintosh Programmer's Workshop, a free development -environment from Apple). MacPerl was first introduced as an MPW -tool, and MPW can be used like a shell: - - perl myscript.plx some arguments - -ToolServer is another app from Apple that provides access to MPW tools -from MPW and the MacPerl app, which allows MacPerl programs to use -C, backticks, and piped C. - -"S" is the proper name for the operating system, but the value -in C<$^O> is "MacOS". To determine architecture, version, or whether -the application or MPW tool version is running, check: - - $is_app = $MacPerl::Version =~ /App/; - $is_tool = $MacPerl::Version =~ /MPW/; - ($version) = $MacPerl::Version =~ /^(\S+)/; - $is_ppc = $MacPerl::Architecture eq 'MacPPC'; - $is_68k = $MacPerl::Architecture eq 'Mac68K'; - -S, based on NeXT's OpenStep OS, runs MacPerl natively, under the -"Classic" environment. There is no "Carbon" version of MacPerl to run -under the primary Mac OS X environment. S and its Open Source -version, Darwin, both run Unix perl natively. - -Also see: - -=over 4 - -=item * - -MacPerl Development, http://dev.macperl.org/ . - -=item * - -The MacPerl Pages, http://www.macperl.com/ . - -=item * - -The MacPerl mailing lists, http://lists.perl.org/ . - -=back - -=head2 VMS - -Perl on VMS is discussed in L in the perl distribution. -Perl on VMS can accept either VMS- or Unix-style file -specifications as in either of the following: - - $ perl -ne "print if /perl_setup/i" SYS$LOGIN:LOGIN.COM - $ perl -ne "print if /perl_setup/i" /sys$login/login.com - -but not a mixture of both as in: - - $ perl -ne "print if /perl_setup/i" sys$login:/login.com - Can't open sys$login:/login.com: file specification syntax error - -Interacting with Perl from the Digital Command Language (DCL) shell -often requires a different set of quotation marks than Unix shells do. -For example: - - $ perl -e "print ""Hello, world.\n""" - Hello, world. - -There are several ways to wrap your perl scripts in DCL F<.COM> files, if -you are so inclined. For example: - - $ write sys$output "Hello from DCL!" - $ if p1 .eqs. "" - $ then perl -x 'f$environment("PROCEDURE") - $ else perl -x - 'p1 'p2 'p3 'p4 'p5 'p6 'p7 'p8 - $ deck/dollars="__END__" - #!/usr/bin/perl - - print "Hello from Perl!\n"; - - __END__ - $ endif - -Do take care with C<$ ASSIGN/nolog/user SYS$COMMAND: SYS$INPUT> if your -perl-in-DCL script expects to do things like C<< $read = ; >>. - -Filenames are in the format "name.extension;version". The maximum -length for filenames is 39 characters, and the maximum length for -extensions is also 39 characters. Version is a number from 1 to -32767. Valid characters are C. - -VMS's RMS filesystem is case-insensitive and does not preserve case. -C returns lowercased filenames, but specifying a file for -opening remains case-insensitive. Files without extensions have a -trailing period on them, so doing a C with a file named F -will return F (though that file could be opened with -C). - -RMS had an eight level limit on directory depths from any rooted logical -(allowing 16 levels overall) prior to VMS 7.2. Hence -C is a valid directory specification but -C is not. F authors might -have to take this into account, but at least they can refer to the former -as C. - -The VMS::Filespec module, which gets installed as part of the build -process on VMS, is a pure Perl module that can easily be installed on -non-VMS platforms and can be helpful for conversions to and from RMS -native formats. - -What C<\n> represents depends on the type of file opened. It usually -represents C<\012> but it could also be C<\015>, C<\012>, C<\015\012>, -C<\000>, C<\040>, or nothing depending on the file organiztion and -record format. The VMS::Stdio module provides access to the -special fopen() requirements of files with unusual attributes on VMS. - -TCP/IP stacks are optional on VMS, so socket routines might not be -implemented. UDP sockets may not be supported. - -The value of C<$^O> on OpenVMS is "VMS". To determine the architecture -that you are running on without resorting to loading all of C<%Config> -you can examine the content of the C<@INC> array like so: - - if (grep(/VMS_AXP/, @INC)) { - print "I'm on Alpha!\n"; - - } elsif (grep(/VMS_VAX/, @INC)) { - print "I'm on VAX!\n"; - - } else { - print "I'm not so sure about where $^O is...\n"; - } - -On VMS, perl determines the UTC offset from the C -logical name. Although the VMS epoch began at 17-NOV-1858 00:00:00.00, -calls to C are adjusted to count offsets from -01-JAN-1970 00:00:00.00, just like Unix. - -Also see: - -=over 4 - -=item * - -F (installed as L), L - -=item * - -vmsperl list, majordomo@perl.org - -(Put the words C in message body.) - -=item * - -vmsperl on the web, http://www.sidhe.org/vmsperl/index.html - -=back - -=head2 VOS - -Perl on VOS is discussed in F in the perl distribution -(installed as L). Perl on VOS can accept either VOS- or -Unix-style file specifications as in either of the following: - - $ perl -ne "print if /perl_setup/i" >system>notices - $ perl -ne "print if /perl_setup/i" /system/notices - -or even a mixture of both as in: - - $ perl -ne "print if /perl_setup/i" >system/notices - -Even though VOS allows the slash character to appear in object -names, because the VOS port of Perl interprets it as a pathname -delimiting character, VOS files, directories, or links whose names -contain a slash character cannot be processed. Such files must be -renamed before they can be processed by Perl. Note that VOS limits -file names to 32 or fewer characters. - -See F for restrictions that apply when Perl is built -with the alpha version of VOS POSIX.1 support. - -Perl on VOS is built without any extensions and does not support -dynamic loading. - -The value of C<$^O> on VOS is "VOS". To determine the architecture that -you are running on without resorting to loading all of C<%Config> you -can examine the content of the @INC array like so: - - if ($^O =~ /VOS/) { - print "I'm on a Stratus box!\n"; - } else { - print "I'm not on a Stratus box!\n"; - die; - } - - if (grep(/860/, @INC)) { - print "This box is a Stratus XA/R!\n"; - - } elsif (grep(/7100/, @INC)) { - print "This box is a Stratus HP 7100 or 8xxx!\n"; - - } elsif (grep(/8000/, @INC)) { - print "This box is a Stratus HP 8xxx!\n"; - - } else { - print "This box is a Stratus 68K!\n"; - } - -Also see: - -=over 4 - -=item * - -F - -=item * - -The VOS mailing list. - -There is no specific mailing list for Perl on VOS. You can post -comments to the comp.sys.stratus newsgroup, or subscribe to the general -Stratus mailing list. Send a letter with "Subscribe Info-Stratus" in -the message body to majordomo@list.stratagy.com. - -=item * - -VOS Perl on the web at http://ftp.stratus.com/pub/vos/vos.html - -=back - -=head2 EBCDIC Platforms - -Recent versions of Perl have been ported to platforms such as OS/400 on -AS/400 minicomputers as well as OS/390, VM/ESA, and BS2000 for S/390 -Mainframes. Such computers use EBCDIC character sets internally (usually -Character Code Set ID 0037 for OS/400 and either 1047 or POSIX-BC for S/390 -systems). On the mainframe perl currently works under the "Unix system -services for OS/390" (formerly known as OpenEdition), VM/ESA OpenEdition, or -the BS200 POSIX-BC system (BS2000 is supported in perl 5.6 and greater). -See L for details. - -As of R2.5 of USS for OS/390 and Version 2.3 of VM/ESA these Unix -sub-systems do not support the C<#!> shebang trick for script invocation. -Hence, on OS/390 and VM/ESA perl scripts can be executed with a header -similar to the following simple script: - - : # use perl - eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}' - if 0; - #!/usr/local/bin/perl # just a comment really - - print "Hello from perl!\n"; - -OS/390 will support the C<#!> shebang trick in release 2.8 and beyond. -Calls to C and backticks can use POSIX shell syntax on all -S/390 systems. - -On the AS/400, if PERL5 is in your library list, you may need -to wrap your perl scripts in a CL procedure to invoke them like so: - - BEGIN - CALL PGM(PERL5/PERL) PARM('/QOpenSys/hello.pl') - ENDPGM - -This will invoke the perl script F in the root of the -QOpenSys file system. On the AS/400 calls to C or backticks -must use CL syntax. - -On these platforms, bear in mind that the EBCDIC character set may have -an effect on what happens with some perl functions (such as C, -C, C, C, C, C, C, C), as -well as bit-fiddling with ASCII constants using operators like C<^>, C<&> -and C<|>, not to mention dealing with socket interfaces to ASCII computers -(see L<"Newlines">). - -Fortunately, most web servers for the mainframe will correctly -translate the C<\n> in the following statement to its ASCII equivalent -(C<\r> is the same under both Unix and OS/390 & VM/ESA): - - print "Content-type: text/html\r\n\r\n"; - -The values of C<$^O> on some of these platforms includes: - - uname $^O $Config{'archname'} - -------------------------------------------- - OS/390 os390 os390 - OS400 os400 os400 - POSIX-BC posix-bc BS2000-posix-bc - VM/ESA vmesa vmesa - -Some simple tricks for determining if you are running on an EBCDIC -platform could include any of the following (perhaps all): - - if ("\t" eq "\05") { print "EBCDIC may be spoken here!\n"; } - - if (ord('A') == 193) { print "EBCDIC may be spoken here!\n"; } - - if (chr(169) eq 'z') { print "EBCDIC may be spoken here!\n"; } - -One thing you may not want to rely on is the EBCDIC encoding -of punctuation characters since these may differ from code page to code -page (and once your module or script is rumoured to work with EBCDIC, -folks will want it to work with all EBCDIC character sets). - -Also see: - -=over 4 - -=item * - -* - -L, F, F, F, -L. - -=item * - -The perl-mvs@perl.org list is for discussion of porting issues as well as -general usage issues for all EBCDIC Perls. Send a message body of -"subscribe perl-mvs" to majordomo@perl.org. - -=item * - -AS/400 Perl information at -http://as400.rochester.ibm.com/ -as well as on CPAN in the F directory. - -=back - -=head2 Acorn RISC OS - -Because Acorns use ASCII with newlines (C<\n>) in text files as C<\012> like -Unix, and because Unix filename emulation is turned on by default, -most simple scripts will probably work "out of the box". The native -filesystem is modular, and individual filesystems are free to be -case-sensitive or insensitive, and are usually case-preserving. Some -native filesystems have name length limits, which file and directory -names are silently truncated to fit. Scripts should be aware that the -standard filesystem currently has a name length limit of B<10> -characters, with up to 77 items in a directory, but other filesystems -may not impose such limitations. - -Native filenames are of the form - - Filesystem#Special_Field::DiskName.$.Directory.Directory.File - -where - - Special_Field is not usually present, but may contain . and $ . - Filesystem =~ m|[A-Za-z0-9_]| - DsicName =~ m|[A-Za-z0-9_/]| - $ represents the root directory - . is the path separator - @ is the current directory (per filesystem but machine global) - ^ is the parent directory - Directory and File =~ m|[^\0- "\.\$\%\&:\@\\^\|\177]+| - -The default filename translation is roughly C - -Note that C<"ADFS::HardDisk.$.File" ne 'ADFS::HardDisk.$.File'> and that -the second stage of C<$> interpolation in regular expressions will fall -foul of the C<$.> if scripts are not careful. - -Logical paths specified by system variables containing comma-separated -search lists are also allowed; hence C is a valid -filename, and the filesystem will prefix C with each section of -C until a name is made that points to an object on disk. -Writing to a new file C would be allowed only if -C contains a single item list. The filesystem will also -expand system variables in filenames if enclosed in angle brackets, so -C<< .Modules >> would look for the file -S>. The obvious implication of this is -that B >>> and should -be protected when C is used for input. - -Because C<.> was in use as a directory separator and filenames could not -be assumed to be unique after 10 characters, Acorn implemented the C -compiler to strip the trailing C<.c> C<.h> C<.s> and C<.o> suffix from -filenames specified in source code and store the respective files in -subdirectories named after the suffix. Hence files are translated: - - foo.h h.foo - C:foo.h C:h.foo (logical path variable) - sys/os.h sys.h.os (C compiler groks Unix-speak) - 10charname.c c.10charname - 10charname.o o.10charname - 11charname_.c c.11charname (assuming filesystem truncates at 10) - -The Unix emulation library's translation of filenames to native assumes -that this sort of translation is required, and it allows a user-defined list -of known suffixes that it will transpose in this fashion. This may -seem transparent, but consider that with these rules C -and C both map to C, and that C and -C cannot and do not attempt to emulate the reverse mapping. Other -C<.>'s in filenames are translated to C. - -As implied above, the environment accessed through C<%ENV> is global, and -the convention is that program specific environment variables are of the -form C. Each filesystem maintains a current directory, -and the current filesystem's current directory is the B current -directory. Consequently, sociable programs don't change the current -directory but rely on full pathnames, and programs (and Makefiles) cannot -assume that they can spawn a child process which can change the current -directory without affecting its parent (and everyone else for that -matter). - -Because native operating system filehandles are global and are currently -allocated down from 255, with 0 being a reserved value, the Unix emulation -library emulates Unix filehandles. Consequently, you can't rely on -passing C, C, or C to your children. - -The desire of users to express filenames of the form -C<< .Bar >> on the command line unquoted causes problems, -too: C<``> command output capture has to perform a guessing game. It -assumes that a string C<< <[^<>]+\$[^<>]> >> is a -reference to an environment variable, whereas anything else involving -C<< < >> or C<< > >> is redirection, and generally manages to be 99% -right. Of course, the problem remains that scripts cannot rely on any -Unix tools being available, or that any tools found have Unix-like command -line arguments. - -Extensions and XS are, in theory, buildable by anyone using free -tools. In practice, many don't, as users of the Acorn platform are -used to binary distributions. MakeMaker does run, but no available -make currently copes with MakeMaker's makefiles; even if and when -this should be fixed, the lack of a Unix-like shell will cause -problems with makefile rules, especially lines of the form C, and anything using quoting. - -"S" is the proper name for the operating system, but the value -in C<$^O> is "riscos" (because we don't like shouting). - -=head2 Other perls - -Perl has been ported to many platforms that do not fit into any of -the categories listed above. Some, such as AmigaOS, Atari MiNT, -BeOS, HP MPE/iX, QNX, Plan 9, and VOS, have been well-integrated -into the standard Perl source code kit. You may need to see the -F directory on CPAN for information, and possibly binaries, -for the likes of: aos, Atari ST, lynxos, riscos, Novell Netware, -Tandem Guardian, I (Yes, we know that some of these OSes may -fall under the Unix category, but we are not a standards body.) - -Some approximate operating system names and their C<$^O> values -in the "OTHER" category include: - - OS $^O $Config{'archname'} - ------------------------------------------ - Amiga DOS amigaos m68k-amigos - MPE/iX mpeix PA-RISC1.1 - -See also: - -=over 4 - -=item * - -Amiga, F (installed as L). - -=item * - -Atari, F and Guido Flohr's web page -http://stud.uni-sb.de/~gufl0000/ - -=item * - -Be OS, F - -=item * - -HP 300 MPE/iX, F and Mark Bixby's web page -http://www.bixby.org/mark/perlix.html - -=item * - -A free perl5-based PERL.NLM for Novell Netware is available in -precompiled binary and source code form from http://www.novell.com/ -as well as from CPAN. - -=item * - -Plan 9, F - -=back - -=head1 FUNCTION IMPLEMENTATIONS - -Listed below are functions that are either completely unimplemented -or else have been implemented differently on various platforms. -Following each description will be, in parentheses, a list of -platforms that the description applies to. - -The list may well be incomplete, or even wrong in some places. When -in doubt, consult the platform-specific README files in the Perl -source distribution, and any other documentation resources accompanying -a given port. - -Be aware, moreover, that even among Unix-ish systems there are variations. - -For many functions, you can also query C<%Config>, exported by -default from the Config module. For example, to check whether the -platform has the C call, check C<$Config{d_lstat}>. See -L for a full description of available variables. - -=head2 Alphabetical Listing of Perl Functions - -=over 8 - -=item -X FILEHANDLE - -=item -X EXPR - -=item -X - -C<-r>, C<-w>, and C<-x> have a limited meaning only; directories -and applications are executable, and there are no uid/gid -considerations. C<-o> is not supported. (S) - -C<-r>, C<-w>, C<-x>, and C<-o> tell whether the file is accessible, -which may not reflect UIC-based file protections. (VMS) - -C<-s> returns the size of the data fork, not the total size of data fork -plus resource fork. (S). - -C<-s> by name on an open file will return the space reserved on disk, -rather than the current extent. C<-s> on an open filehandle returns the -current size. (S) - -C<-R>, C<-W>, C<-X>, C<-O> are indistinguishable from C<-r>, C<-w>, -C<-x>, C<-o>. (S, Win32, VMS, S) - -C<-b>, C<-c>, C<-k>, C<-g>, C<-p>, C<-u>, C<-A> are not implemented. -(S) - -C<-g>, C<-k>, C<-l>, C<-p>, C<-u>, C<-A> are not particularly meaningful. -(Win32, VMS, S) - -C<-d> is true if passed a device spec without an explicit directory. -(VMS) - -C<-T> and C<-B> are implemented, but might misclassify Mac text files -with foreign characters; this is the case will all platforms, but may -affect S often. (S) - -C<-x> (or C<-X>) determine if a file ends in one of the executable -suffixes. C<-S> is meaningless. (Win32) - -C<-x> (or C<-X>) determine if a file has an executable file type. -(S) - -=item alarm SECONDS - -=item alarm - -Not implemented. (Win32) - -=item binmode FILEHANDLE - -Meaningless. (S, S) - -Reopens file and restores pointer; if function fails, underlying -filehandle may be closed, or pointer may be in a different position. -(VMS) - -The value returned by C may be affected after the call, and -the filehandle may be flushed. (Win32) - -=item chmod LIST - -Only limited meaning. Disabling/enabling write permission is mapped to -locking/unlocking the file. (S) - -Only good for changing "owner" read-write access, "group", and "other" -bits are meaningless. (Win32) - -Only good for changing "owner" and "other" read-write access. (S) - -Access permissions are mapped onto VOS access-control list changes. (VOS) - -=item chown LIST - -Not implemented. (S, Win32, Plan9, S, VOS) - -Does nothing, but won't fail. (Win32) - -=item chroot FILENAME - -=item chroot - -Not implemented. (S, Win32, VMS, Plan9, S, VOS, VM/ESA) - -=item crypt PLAINTEXT,SALT - -May not be available if library or source was not provided when building -perl. (Win32) - -Not implemented. (VOS) - -=item dbmclose HASH - -Not implemented. (VMS, Plan9, VOS) - -=item dbmopen HASH,DBNAME,MODE - -Not implemented. (VMS, Plan9, VOS) - -=item dump LABEL - -Not useful. (S, S) - -Not implemented. (Win32) - -Invokes VMS debugger. (VMS) - -=item exec LIST - -Not implemented. (S) - -Implemented via Spawn. (VM/ESA) - -Does not automatically flush output handles on some platforms. -(SunOS, Solaris, HP-UX) - -=item fcntl FILEHANDLE,FUNCTION,SCALAR - -Not implemented. (Win32, VMS) - -=item flock FILEHANDLE,OPERATION - -Not implemented (S, VMS, S, VOS). - -Available only on Windows NT (not on Windows 95). (Win32) - -=item fork - -Not implemented. (S, AmigaOS, S, VOS, VM/ESA) - -Emulated using multiple interpreters. See L. (Win32) - -Does not automatically flush output handles on some platforms. -(SunOS, Solaris, HP-UX) - -=item getlogin - -Not implemented. (S, S) - -=item getpgrp PID - -Not implemented. (S, Win32, VMS, S, VOS) - -=item getppid - -Not implemented. (S, Win32, VMS, S) - -=item getpriority WHICH,WHO - -Not implemented. (S, Win32, VMS, S, VOS, VM/ESA) - -=item getpwnam NAME - -Not implemented. (S, Win32) - -Not useful. (S) - -=item getgrnam NAME - -Not implemented. (S, Win32, VMS, S) - -=item getnetbyname NAME - -Not implemented. (S, Win32, Plan9) - -=item getpwuid UID - -Not implemented. (S, Win32) - -Not useful. (S) - -=item getgrgid GID - -Not implemented. (S, Win32, VMS, S) - -=item getnetbyaddr ADDR,ADDRTYPE - -Not implemented. (S, Win32, Plan9) - -=item getprotobynumber NUMBER - -Not implemented. (S) - -=item getservbyport PORT,PROTO - -Not implemented. (S) - -=item getpwent - -Not implemented. (S, Win32, VM/ESA) - -=item getgrent - -Not implemented. (S, Win32, VMS, VM/ESA) - -=item gethostent - -Not implemented. (S, Win32) - -=item getnetent - -Not implemented. (S, Win32, Plan9) - -=item getprotoent - -Not implemented. (S, Win32, Plan9) - -=item getservent - -Not implemented. (Win32, Plan9) - -=item setpwent - -Not implemented. (S, Win32, S) - -=item setgrent - -Not implemented. (S, Win32, VMS, S) - -=item sethostent STAYOPEN - -Not implemented. (S, Win32, Plan9, S) - -=item setnetent STAYOPEN - -Not implemented. (S, Win32, Plan9, S) - -=item setprotoent STAYOPEN - -Not implemented. (S, Win32, Plan9, S) - -=item setservent STAYOPEN - -Not implemented. (Plan9, Win32, S) - -=item endpwent - -Not implemented. (S, MPE/iX, VM/ESA, Win32) - -=item endgrent - -Not implemented. (S, MPE/iX, S, VM/ESA, VMS, Win32) - -=item endhostent - -Not implemented. (S, Win32) - -=item endnetent - -Not implemented. (S, Win32, Plan9) - -=item endprotoent - -Not implemented. (S, Win32, Plan9) - -=item endservent - -Not implemented. (Plan9, Win32) - -=item getsockopt SOCKET,LEVEL,OPTNAME - -Not implemented. (S, Plan9) - -=item glob EXPR - -=item glob - -This operator is implemented via the File::Glob extension on most -platforms. See L for portability information. - -=item ioctl FILEHANDLE,FUNCTION,SCALAR - -Not implemented. (VMS) - -Available only for socket handles, and it does what the ioctlsocket() call -in the Winsock API does. (Win32) - -Available only for socket handles. (S) - -=item kill SIGNAL, LIST - -C is implemented for the sake of taint checking; -use with other signals is unimplemented. (S) - -Not implemented, hence not useful for taint checking. (S) - -C doesn't have the semantics of C, i.e. it doesn't send -a signal to the identified process like it does on Unix platforms. -Instead C terminates the process identified by $pid, -and makes it exit immediately with exit status $sig. As in Unix, if -$sig is 0 and the specified process exists, it returns true without -actually terminating it. (Win32) - -=item link OLDFILE,NEWFILE - -Not implemented. (S, MPE/iX, VMS, S) - -Link count not updated because hard links are not quite that hard -(They are sort of half-way between hard and soft links). (AmigaOS) - -Hard links are implemented on Win32 (Windows NT and Windows 2000) -under NTFS only. - -=item lstat FILEHANDLE - -=item lstat EXPR - -=item lstat - -Not implemented. (VMS, S) - -Return values (especially for device and inode) may be bogus. (Win32) - -=item msgctl ID,CMD,ARG - -=item msgget KEY,FLAGS - -=item msgsnd ID,MSG,FLAGS - -=item msgrcv ID,VAR,SIZE,TYPE,FLAGS - -Not implemented. (S, Win32, VMS, Plan9, S, VOS) - -=item open FILEHANDLE,EXPR - -=item open FILEHANDLE - -The C<|> variants are supported only if ToolServer is installed. -(S) - -open to C<|-> and C<-|> are unsupported. (S, Win32, S) - -Opening a process does not automatically flush output handles on some -platforms. (SunOS, Solaris, HP-UX) - -=item pipe READHANDLE,WRITEHANDLE - -Very limited functionality. (MiNT) - -=item readlink EXPR - -=item readlink - -Not implemented. (Win32, VMS, S) - -=item select RBITS,WBITS,EBITS,TIMEOUT - -Only implemented on sockets. (Win32) - -Only reliable on sockets. (S) - -Note that the C form is generally portable. - -=item semctl ID,SEMNUM,CMD,ARG - -=item semget KEY,NSEMS,FLAGS - -=item semop KEY,OPSTRING - -Not implemented. (S, Win32, VMS, S, VOS) - -=item setgrent - -Not implemented. (MPE/iX, Win32) - -=item setpgrp PID,PGRP - -Not implemented. (S, Win32, VMS, S, VOS) - -=item setpriority WHICH,WHO,PRIORITY - -Not implemented. (S, Win32, VMS, S, VOS) - -=item setpwent - -Not implemented. (MPE/iX, Win32) - -=item setsockopt SOCKET,LEVEL,OPTNAME,OPTVAL - -Not implemented. (S, Plan9) - -=item shmctl ID,CMD,ARG - -=item shmget KEY,SIZE,FLAGS - -=item shmread ID,VAR,POS,SIZE - -=item shmwrite ID,STRING,POS,SIZE - -Not implemented. (S, Win32, VMS, S, VOS) - -=item socketpair SOCKET1,SOCKET2,DOMAIN,TYPE,PROTOCOL - -Not implemented. (Win32, VMS, S, VOS, VM/ESA) - -=item stat FILEHANDLE - -=item stat EXPR - -=item stat - -Platforms that do not have rdev, blksize, or blocks will return these -as '', so numeric comparison or manipulation of these fields may cause -'not numeric' warnings. - -mtime and atime are the same thing, and ctime is creation time instead of -inode change time. (S) - -device and inode are not meaningful. (Win32) - -device and inode are not necessarily reliable. (VMS) - -mtime, atime and ctime all return the last modification time. Device and -inode are not necessarily reliable. (S) - -dev, rdev, blksize, and blocks are not available. inode is not -meaningful and will differ between stat calls on the same file. (os2) - -=item symlink OLDFILE,NEWFILE - -Not implemented. (Win32, VMS, S) - -=item syscall LIST - -Not implemented. (S, Win32, VMS, S, VOS, VM/ESA) - -=item sysopen FILEHANDLE,FILENAME,MODE,PERMS - -The traditional "0", "1", and "2" MODEs are implemented with different -numeric values on some systems. The flags exported by C -(O_RDONLY, O_WRONLY, O_RDWR) should work everywhere though. (S, OS/390, VM/ESA) - -=item system LIST - -Only implemented if ToolServer is installed. (S) - -As an optimization, may not call the command shell specified in -C<$ENV{PERL5SHELL}>. C spawns an external -process and immediately returns its process designator, without -waiting for it to terminate. Return value may be used subsequently -in C or C. Failure to spawn() a subprocess is indicated -by setting $? to "255 << 8". C<$?> is set in a way compatible with -Unix (i.e. the exitstatus of the subprocess is obtained by "$? >> 8", -as described in the documentation). (Win32) - -There is no shell to process metacharacters, and the native standard is -to pass a command line terminated by "\n" "\r" or "\0" to the spawned -program. Redirection such as C<< > foo >> is performed (if at all) by -the run time library of the spawned program. C I will call -the Unix emulation library's C emulation, which attempts to provide -emulation of the stdin, stdout, stderr in force in the parent, providing -the child program uses a compatible version of the emulation library. -I will call the native command line direct and no such emulation -of a child Unix program will exists. Mileage B vary. (S) - -Far from being POSIX compliant. Because there may be no underlying -/bin/sh tries to work around the problem by forking and execing the -first token in its argument string. Handles basic redirection -("<" or ">") on its own behalf. (MiNT) - -Does not automatically flush output handles on some platforms. -(SunOS, Solaris, HP-UX) - -=item times - -Only the first entry returned is nonzero. (S) - -"cumulative" times will be bogus. On anything other than Windows NT -or Windows 2000, "system" time will be bogus, and "user" time is -actually the time returned by the clock() function in the C runtime -library. (Win32) - -Not useful. (S) - -=item truncate FILEHANDLE,LENGTH - -=item truncate EXPR,LENGTH - -Not implemented. (VMS) - -Truncation to zero-length only. (VOS) - -If a FILEHANDLE is supplied, it must be writable and opened in append -mode (i.e., use C>filename')> -or C. If a filename is supplied, it -should not be held open elsewhere. (Win32) - -=item umask EXPR - -=item umask - -Returns undef where unavailable, as of version 5.005. - -C works but the correct permissions are set only when the file -is finally closed. (AmigaOS) - -=item utime LIST - -Only the modification time is updated. (S, VMS, S) - -May not behave as expected. Behavior depends on the C runtime -library's implementation of utime(), and the filesystem being -used. The FAT filesystem typically does not support an "access -time" field, and it may limit timestamps to a granularity of -two seconds. (Win32) - -=item wait - -=item waitpid PID,FLAGS - -Not implemented. (S, VOS) - -Can only be applied to process handles returned for processes spawned -using C or pseudo processes created with C. (Win32) - -Not useful. (S) - -=back - -=head1 CHANGES - -=over 4 - -=item v1.48, 02 February 2001 - -Various updates from perl5-porters over the past year, supported -platforms update from Jarkko Hietaniemi. - -=item v1.47, 22 March 2000 - -Various cleanups from Tom Christiansen, including migration of -long platform listings from L. - -=item v1.46, 12 February 2000 - -Updates for VOS and MPE/iX. (Peter Prymmer) Other small changes. - -=item v1.45, 20 December 1999 - -Small changes from 5.005_63 distribution, more changes to EBCDIC info. - -=item v1.44, 19 July 1999 - -A bunch of updates from Peter Prymmer for C<$^O> values, -endianness, File::Spec, VMS, BS2000, OS/400. - -=item v1.43, 24 May 1999 - -Added a lot of cleaning up from Tom Christiansen. - -=item v1.42, 22 May 1999 - -Added notes about tests, sprintf/printf, and epoch offsets. - -=item v1.41, 19 May 1999 - -Lots more little changes to formatting and content. - -Added a bunch of C<$^O> and related values -for various platforms; fixed mail and web addresses, and added -and changed miscellaneous notes. (Peter Prymmer) - -=item v1.40, 11 April 1999 - -Miscellaneous changes. - -=item v1.39, 11 February 1999 - -Changes from Jarkko and EMX URL fixes Michael Schwern. Additional -note about newlines added. - -=item v1.38, 31 December 1998 - -More changes from Jarkko. - -=item v1.37, 19 December 1998 - -More minor changes. Merge two separate version 1.35 documents. - -=item v1.36, 9 September 1998 - -Updated for Stratus VOS. Also known as version 1.35. - -=item v1.35, 13 August 1998 - -Integrate more minor changes, plus addition of new sections under -L<"ISSUES">: L<"Numbers endianness and Width">, -L<"Character sets and character encoding">, -L<"Internationalisation">. - -=item v1.33, 06 August 1998 - -Integrate more minor changes. - -=item v1.32, 05 August 1998 - -Integrate more minor changes. - -=item v1.30, 03 August 1998 - -Major update for RISC OS, other minor changes. - -=item v1.23, 10 July 1998 - -First public release with perl5.005. - -=back - -=head1 Supported Platforms - -As of early 2001 (the Perl releases 5.6.1 and 5.7.1), the following -platforms are able to build Perl from the standard source code -distribution available at http://www.perl.com/CPAN/src/index.html - - AIX - AmigaOS - Darwin (Mac OS X) - DG/UX - DOS DJGPP 1) - DYNIX/ptx - EPOC - FreeBSD - HP-UX - IRIX - Linux - MachTen - MacOS Classic 2) - NonStop-UX - ReliantUNIX (SINIX) - OpenBSD - OpenVMS (VMS) - OS/2 - OS X - QNX - Solaris - Tru64 UNIX (DEC OSF/1, Digital UNIX) - UNICOS - UNICOS/mk - VOS - Win32/NT/2K 3) - - 1) in DOS mode either the DOS or OS/2 ports can be used - 2) Mac OS Classic (pre-X) is almost 5.6.1-ready; building from - the source does work with 5.6.1, but additional MacOS specific - source code is needed for a complete build. See the web - site http://dev.macperl.org/ for more information. - 3) compilers: Borland, Cygwin, Mingw32 EGCS/GCC, VC++ - -The following platforms worked for the previous releases (5.6.0 and 5.7.0), -but we did not manage to test these in time for the 5.7.1 release. -There is a very good chance that these will work fine with the 5.7.1. - - DomainOS - Hurd - LynxOS - MinGW - MPE/iX - NetBSD - PowerMAX - SCO SV - SunOS - SVR4 - Unixware - Windows 3.1 - Windows 95 - Windows 98 - Windows Me - -The following platform worked for the 5.005_03 major release but not -for 5.6.0. Standardization on UTF-8 as the internal string -representation in 5.6.0 and 5.6.1 introduced incompatibilities in this -EBCDIC platform. While Perl 5.7.1 will build on this platform some -regression tests may fail and the C pragma typically -introduces text handling errors. - - OS/390 1) - - 1) previously known as MVS, about to become z/OS. - -Strongly related to the OS/390 platform by also being EBCDIC-based -mainframe platforms are the following platforms: - - POSIX-BC (BS2000) - VM/ESA - -These are also expected to work, albeit with no UTF-8 support, under 5.6.1 -for the same reasons as OS/390. Contact the mailing list perl-mvs@perl.org -for more details. - -The following platforms have been known to build Perl from source in -the past (5.005_03 and earlier), but we haven't been able to verify -their status for the current release, either because the -hardware/software platforms are rare or because we don't have an -active champion on these platforms--or both. They used to work, -though, so go ahead and try compiling them, and let perlbug@perl.org -of any trouble. - - 3b1 - A/UX - BeOS - BSD/OS - ConvexOS - CX/UX - DC/OSx - DDE SMES - DOS EMX - Dynix - EP/IX - ESIX - FPS - GENIX - Greenhills - ISC - MachTen 68k - MiNT - MPC - NEWS-OS - NextSTEP - OpenSTEP - Opus - Plan 9 - PowerUX - RISC/os - SCO ODT/OSR - Stellar - SVR2 - TI1500 - TitanOS - Ultrix - Unisys Dynix - Unixware - UTS - -Support for the following platform is planned for a future Perl release: - - Netware - -The following platforms have their own source code distributions and -binaries available via http://www.perl.com/CPAN/ports/index.html: - - Perl release - - Netware 5.003_07 - OS/400 5.005_02 - Tandem Guardian 5.004 - -The following platforms have only binaries available via -http://www.perl.com/CPAN/ports/index.html : - - Perl release - - Acorn RISCOS 5.005_02 - AOS 5.002 - LynxOS 5.004_02 - -Although we do suggest that you always build your own Perl from -the source code, both for maximal configurability and for security, -in case you are in a hurry you can check -http://www.perl.com/CPAN/ports/index.html for binary distributions. - -=head1 SEE ALSO - -L, L, L, L, L, -L, L, L, L, L, -L, L, L, L, L, -L, L, L, L, L, -L, L, L, L, -L, L, L, L, and L. - -=head1 AUTHORS / CONTRIBUTORS - -Abigail , -Charles Bailey , -Graham Barr , -Tom Christiansen , -Nicholas Clark , -Thomas Dorner , -Andy Dougherty , -Dominic Dunlop , -Neale Ferguson , -David J. Fiander , -Paul Green , -M.J.T. Guy , -Jarkko Hietaniemi , -Luther Huffman , -Nick Ing-Simmons , -Andreas J. KEnig , -Markus Laker , -Andrew M. Langmead , -Larry Moore , -Paul Moore , -Chris Nandor , -Matthias Neeracher , -Gary Ng <71564.1743@CompuServe.COM>, -Tom Phoenix , -AndrE Pirard , -Peter Prymmer , -Hugo van der Sanden , -Gurusamy Sarathy , -Paul J. Schinder , -Michael G Schwern , -Dan Sugalski , -Nathan Torkington . - -=head1 VERSION - -Version 1.50, last modified 10 Jul 2001 diff --git a/lib/perl5/5.6.1/pods/perlre.pod b/lib/perl5/5.6.1/pods/perlre.pod deleted file mode 100644 index ce2b9bd9..00000000 --- a/lib/perl5/5.6.1/pods/perlre.pod +++ /dev/null @@ -1,1285 +0,0 @@ -=head1 NAME - -perlre - Perl regular expressions - -=head1 DESCRIPTION - -This page describes the syntax of regular expressions in Perl. For a -description of how to I regular expressions in matching -operations, plus various examples of the same, see discussions -of C, C, C and C in L. - -Matching operations can have various modifiers. Modifiers -that relate to the interpretation of the regular expression inside -are listed below. Modifiers that alter the way a regular expression -is used by Perl are detailed in L and -L. - -=over 4 - -=item i - -Do case-insensitive pattern matching. - -If C is in effect, the case map is taken from the current -locale. See L. - -=item m - -Treat string as multiple lines. That is, change "^" and "$" from matching -the start or end of the string to matching the start or end of any -line anywhere within the string. - -=item s - -Treat string as single line. That is, change "." to match any character -whatsoever, even a newline, which normally it would not match. - -The C and C modifiers both override the C<$*> setting. That -is, no matter what C<$*> contains, C
    without C will force -"^" to match only at the beginning of the string and "$" to match -only at the end (or just before a newline at the end) of the string. -Together, as /ms, they let the "." match any character whatsoever, -while still allowing "^" and "$" to match, respectively, just after -and just before newlines within the string. - -=item x - -Extend your pattern's legibility by permitting whitespace and comments. - -=back - -These are usually written as "the C modifier", even though the delimiter -in question might not really be a slash. Any of these -modifiers may also be embedded within the regular expression itself using -the C<(?...)> construct. See below. - -The C modifier itself needs a little more explanation. It tells -the regular expression parser to ignore whitespace that is neither -backslashed nor within a character class. You can use this to break up -your regular expression into (slightly) more readable parts. The C<#> -character is also treated as a metacharacter introducing a comment, -just as in ordinary Perl code. This also means that if you want real -whitespace or C<#> characters in the pattern (outside a character -class, where they are unaffected by C), that you'll either have to -escape them or encode them using octal or hex escapes. Taken together, -these features go a long way towards making Perl's regular expressions -more readable. Note that you have to be careful not to include the -pattern delimiter in the comment--perl has no way of knowing you did -not intend to close the pattern early. See the C-comment deletion code -in L. - -=head2 Regular Expressions - -The patterns used in Perl pattern matching derive from supplied in -the Version 8 regex routines. (The routines are derived -(distantly) from Henry Spencer's freely redistributable reimplementation -of the V8 routines.) See L for -details. - -In particular the following metacharacters have their standard I-ish -meanings: - - \ Quote the next metacharacter - ^ Match the beginning of the line - . Match any character (except newline) - $ Match the end of the line (or before newline at the end) - | Alternation - () Grouping - [] Character class - -By default, the "^" character is guaranteed to match only the -beginning of the string, the "$" character only the end (or before the -newline at the end), and Perl does certain optimizations with the -assumption that the string contains only one line. Embedded newlines -will not be matched by "^" or "$". You may, however, wish to treat a -string as a multi-line buffer, such that the "^" will match after any -newline within the string, and "$" will match before any newline. At the -cost of a little more overhead, you can do this by using the /m modifier -on the pattern match operator. (Older programs did this by setting C<$*>, -but this practice is now deprecated.) - -To simplify multi-line substitutions, the "." character never matches a -newline unless you use the C
    modifier, which in effect tells Perl to pretend -the string is a single line--even if it isn't. The C
    modifier also -overrides the setting of C<$*>, in case you have some (badly behaved) older -code that sets it in another module. - -The following standard quantifiers are recognized: - - * Match 0 or more times - + Match 1 or more times - ? Match 1 or 0 times - {n} Match exactly n times - {n,} Match at least n times - {n,m} Match at least n but not more than m times - -(If a curly bracket occurs in any other context, it is treated -as a regular character.) The "*" modifier is equivalent to C<{0,}>, the "+" -modifier to C<{1,}>, and the "?" modifier to C<{0,1}>. n and m are limited -to integral values less than a preset limit defined when perl is built. -This is usually 32766 on the most common platforms. The actual limit can -be seen in the error message generated by code such as this: - - $_ **= $_ , / {$_} / for 2 .. 42; - -By default, a quantified subpattern is "greedy", that is, it will match as -many times as possible (given a particular starting location) while still -allowing the rest of the pattern to match. If you want it to match the -minimum number of times possible, follow the quantifier with a "?". Note -that the meanings don't change, just the "greediness": - - *? Match 0 or more times - +? Match 1 or more times - ?? Match 0 or 1 time - {n}? Match exactly n times - {n,}? Match at least n times - {n,m}? Match at least n but not more than m times - -Because patterns are processed as double quoted strings, the following -also work: - - \t tab (HT, TAB) - \n newline (LF, NL) - \r return (CR) - \f form feed (FF) - \a alarm (bell) (BEL) - \e escape (think troff) (ESC) - \033 octal char (think of a PDP-11) - \x1B hex char - \x{263a} wide hex char (Unicode SMILEY) - \c[ control char - \N{name} named char - \l lowercase next char (think vi) - \u uppercase next char (think vi) - \L lowercase till \E (think vi) - \U uppercase till \E (think vi) - \E end case modification (think vi) - \Q quote (disable) pattern metacharacters till \E - -If C is in effect, the case map used by C<\l>, C<\L>, C<\u> -and C<\U> is taken from the current locale. See L. For -documentation of C<\N{name}>, see L. - -You cannot include a literal C<$> or C<@> within a C<\Q> sequence. -An unescaped C<$> or C<@> interpolates the corresponding variable, -while escaping will cause the literal string C<\$> to be matched. -You'll need to write something like C. - -In addition, Perl defines the following: - - \w Match a "word" character (alphanumeric plus "_") - \W Match a non-"word" character - \s Match a whitespace character - \S Match a non-whitespace character - \d Match a digit character - \D Match a non-digit character - \pP Match P, named property. Use \p{Prop} for longer names. - \PP Match non-P - \X Match eXtended Unicode "combining character sequence", - equivalent to C<(?:\PM\pM*)> - \C Match a single C char (octet) even under utf8. - -A C<\w> matches a single alphanumeric character or C<_>, not a whole word. -Use C<\w+> to match a string of Perl-identifier characters (which isn't -the same as matching an English word). If C is in effect, the -list of alphabetic characters generated by C<\w> is taken from the -current locale. See L. You may use C<\w>, C<\W>, C<\s>, C<\S>, -C<\d>, and C<\D> within character classes, but if you try to use them -as endpoints of a range, that's not a range, the "-" is understood literally. -See L for details about C<\pP>, C<\PP>, and C<\X>. - -The POSIX character class syntax - - [:class:] - -is also available. The available classes and their backslash -equivalents (if available) are as follows: - - alpha - alnum - ascii - blank [1] - cntrl - digit \d - graph - lower - print - punct - space \s [2] - upper - word \w [3] - xdigit - - [1] A GNU extension equivalent to C<[ \t]>, `all horizontal whitespace'. - [2] Not I to C<\s> since the C<[[:space:]]> includes - also the (very rare) `vertical tabulator', "\ck", chr(11). - [3] A Perl extension. - -For example use C<[:upper:]> to match all the uppercase characters. -Note that the C<[]> are part of the C<[::]> construct, not part of the -whole character class. For example: - - [01[:alpha:]%] - -matches zero, one, any alphabetic character, and the percentage sign. - -If the C pragma is used, the following equivalences to Unicode -\p{} constructs and equivalent backslash character classes (if available), -will hold: - - alpha IsAlpha - alnum IsAlnum - ascii IsASCII - blank IsSpace - cntrl IsCntrl - digit IsDigit \d - graph IsGraph - lower IsLower - print IsPrint - punct IsPunct - space IsSpace - IsSpacePerl \s - upper IsUpper - word IsWord - xdigit IsXDigit - -For example C<[:lower:]> and C<\p{IsLower}> are equivalent. - -If the C pragma is not used but the C pragma is, the -classes correlate with the usual isalpha(3) interface (except for -`word' and `blank'). - -The assumedly non-obviously named classes are: - -=over 4 - -=item cntrl - -Any control character. Usually characters that don't produce output as -such but instead control the terminal somehow: for example newline and -backspace are control characters. All characters with ord() less than -32 are most often classified as control characters (assuming ASCII, -the ISO Latin character sets, and Unicode). - -=item graph - -Any alphanumeric or punctuation (special) character. - -=item print - -Any alphanumeric or punctuation (special) character or space. - -=item punct - -Any punctuation (special) character. - -=item xdigit - -Any hexadecimal digit. Though this may feel silly ([0-9A-Fa-f] would -work just fine) it is included for completeness. - -=back - -You can negate the [::] character classes by prefixing the class name -with a '^'. This is a Perl extension. For example: - - POSIX trad. Perl utf8 Perl - - [:^digit:] \D \P{IsDigit} - [:^space:] \S \P{IsSpace} - [:^word:] \W \P{IsWord} - -The POSIX character classes [.cc.] and [=cc=] are recognized but -B supported and trying to use them will cause an error. - -Perl defines the following zero-width assertions: - - \b Match a word boundary - \B Match a non-(word boundary) - \A Match only at beginning of string - \Z Match only at end of string, or before newline at the end - \z Match only at end of string - \G Match only at pos() (e.g. at the end-of-match position - of prior m//g) - -A word boundary (C<\b>) is a spot between two characters -that has a C<\w> on one side of it and a C<\W> on the other side -of it (in either order), counting the imaginary characters off the -beginning and end of the string as matching a C<\W>. (Within -character classes C<\b> represents backspace rather than a word -boundary, just as it normally does in any double-quoted string.) -The C<\A> and C<\Z> are just like "^" and "$", except that they -won't match multiple times when the C modifier is used, while -"^" and "$" will match at every internal line boundary. To match -the actual end of the string and not ignore an optional trailing -newline, use C<\z>. - -The C<\G> assertion can be used to chain global matches (using -C), as described in L. -It is also useful when writing C-like scanners, when you have -several patterns that you want to match against consequent substrings -of your string, see the previous reference. The actual location -where C<\G> will match can also be influenced by using C as -an lvalue. See L. - -The bracketing construct C<( ... )> creates capture buffers. To -refer to the digit'th buffer use \ within the -match. Outside the match use "$" instead of "\". (The -\ notation works in certain circumstances outside -the match. See the warning below about \1 vs $1 for details.) -Referring back to another part of the match is called a -I. - -There is no limit to the number of captured substrings that you may -use. However Perl also uses \10, \11, etc. as aliases for \010, -\011, etc. (Recall that 0 means octal, so \011 is the character at -number 9 in your coded character set; which would be the 10th character, -a horizontal tab under ASCII.) Perl resolves this -ambiguity by interpreting \10 as a backreference only if at least 10 -left parentheses have opened before it. Likewise \11 is a -backreference only if at least 11 left parentheses have opened -before it. And so on. \1 through \9 are always interpreted as -backreferences. - -Examples: - - s/^([^ ]*) *([^ ]*)/$2 $1/; # swap first two words - - if (/(.)\1/) { # find first doubled char - print "'$1' is the first doubled character\n"; - } - - if (/Time: (..):(..):(..)/) { # parse out values - $hours = $1; - $minutes = $2; - $seconds = $3; - } - -Several special variables also refer back to portions of the previous -match. C<$+> returns whatever the last bracket match matched. -C<$&> returns the entire matched string. (At one point C<$0> did -also, but now it returns the name of the program.) C<$`> returns -everything before the matched string. And C<$'> returns everything -after the matched string. - -The numbered variables ($1, $2, $3, etc.) and the related punctuation -set (C<$+>, C<$&>, C<$`>, and C<$'>) are all dynamically scoped -until the end of the enclosing block or until the next successful -match, whichever comes first. (See L.) - -B: Once Perl sees that you need one of C<$&>, C<$`>, or -C<$'> anywhere in the program, it has to provide them for every -pattern match. This may substantially slow your program. Perl -uses the same mechanism to produce $1, $2, etc, so you also pay a -price for each pattern that contains capturing parentheses. (To -avoid this cost while retaining the grouping behaviour, use the -extended regular expression C<(?: ... )> instead.) But if you never -use C<$&>, C<$`> or C<$'>, then patterns I capturing -parentheses will not be penalized. So avoid C<$&>, C<$'>, and C<$`> -if you can, but if you can't (and some algorithms really appreciate -them), once you've used them once, use them at will, because you've -already paid the price. As of 5.005, C<$&> is not so costly as the -other two. - -Backslashed metacharacters in Perl are alphanumeric, such as C<\b>, -C<\w>, C<\n>. Unlike some other regular expression languages, there -are no backslashed symbols that aren't alphanumeric. So anything -that looks like \\, \(, \), \<, \>, \{, or \} is always -interpreted as a literal character, not a metacharacter. This was -once used in a common idiom to disable or quote the special meanings -of regular expression metacharacters in a string that you want to -use for a pattern. Simply quote all non-"word" characters: - - $pattern =~ s/(\W)/\\$1/g; - -(If C is set, then this depends on the current locale.) -Today it is more common to use the quotemeta() function or the C<\Q> -metaquoting escape sequence to disable all metacharacters' special -meanings like this: - - /$unquoted\Q$quoted\E$unquoted/ - -Beware that if you put literal backslashes (those not inside -interpolated variables) between C<\Q> and C<\E>, double-quotish -backslash interpolation may lead to confusing results. If you -I to use literal backslashes within C<\Q...\E>, -consult L. - -=head2 Extended Patterns - -Perl also defines a consistent extension syntax for features not -found in standard tools like B and B. The syntax is a -pair of parentheses with a question mark as the first thing within -the parentheses. The character after the question mark indicates -the extension. - -The stability of these extensions varies widely. Some have been -part of the core language for many years. Others are experimental -and may change without warning or be completely removed. Check -the documentation on an individual feature to verify its current -status. - -A question mark was chosen for this and for the minimal-matching -construct because 1) question marks are rare in older regular -expressions, and 2) whenever you see one, you should stop and -"question" exactly what is going on. That's psychology... - -=over 10 - -=item C<(?#text)> - -A comment. The text is ignored. If the C modifier enables -whitespace formatting, a simple C<#> will suffice. Note that Perl closes -the comment as soon as it sees a C<)>, so there is no way to put a literal -C<)> in the comment. - -=item C<(?imsx-imsx)> - -One or more embedded pattern-match modifiers. This is particularly -useful for dynamic patterns, such as those read in from a configuration -file, read in as an argument, are specified in a table somewhere, -etc. Consider the case that some of which want to be case sensitive -and some do not. The case insensitive ones need to include merely -C<(?i)> at the front of the pattern. For example: - - $pattern = "foobar"; - if ( /$pattern/i ) { } - - # more flexible: - - $pattern = "(?i)foobar"; - if ( /$pattern/ ) { } - -Letters after a C<-> turn those modifiers off. These modifiers are -localized inside an enclosing group (if any). For example, - - ( (?i) blah ) \s+ \1 - -will match a repeated (I!) word C in any -case, assuming C modifier, and no C modifier outside this -group. - -=item C<(?:pattern)> - -=item C<(?imsx-imsx:pattern)> - -This is for clustering, not capturing; it groups subexpressions like -"()", but doesn't make backreferences as "()" does. So - - @fields = split(/\b(?:a|b|c)\b/) - -is like - - @fields = split(/\b(a|b|c)\b/) - -but doesn't spit out extra fields. It's also cheaper not to capture -characters if you don't need to. - -Any letters between C and C<:> act as flags modifiers as with -C<(?imsx-imsx)>. For example, - - /(?s-i:more.*than).*million/i - -is equivalent to the more verbose - - /(?:(?s-i)more.*than).*million/i - -=item C<(?=pattern)> - -A zero-width positive look-ahead assertion. For example, C -matches a word followed by a tab, without including the tab in C<$&>. - -=item C<(?!pattern)> - -A zero-width negative look-ahead assertion. For example C -matches any occurrence of "foo" that isn't followed by "bar". Note -however that look-ahead and look-behind are NOT the same thing. You cannot -use this for look-behind. - -If you are looking for a "bar" that isn't preceded by a "foo", C -will not do what you want. That's because the C<(?!foo)> is just saying that -the next thing cannot be "foo"--and it's not, it's a "bar", so "foobar" will -match. You would have to do something like C for that. We -say "like" because there's the case of your "bar" not having three characters -before it. You could cover that this way: C. -Sometimes it's still easier just to say: - - if (/bar/ && $` !~ /foo$/) - -For look-behind see below. - -=item C<(?<=pattern)> - -A zero-width positive look-behind assertion. For example, C -matches a word that follows a tab, without including the tab in C<$&>. -Works only for fixed-width look-behind. - -=item C<(? - -A zero-width negative look-behind assertion. For example C -matches any occurrence of "foo" that does not follow "bar". Works -only for fixed-width look-behind. - -=item C<(?{ code })> - -B: This extended regular expression feature is considered -highly experimental, and may be changed or deleted without notice. - -This zero-width assertion evaluate any embedded Perl code. It -always succeeds, and its C is not interpolated. Currently, -the rules to determine where the C ends are somewhat convoluted. - -The C is properly scoped in the following sense: If the assertion -is backtracked (compare L<"Backtracking">), all changes introduced after -Cization are undone, so that - - $_ = 'a' x 8; - m< - (?{ $cnt = 0 }) # Initialize $cnt. - ( - a - (?{ - local $cnt = $cnt + 1; # Update $cnt, backtracking-safe. - }) - )* - aaaa - (?{ $res = $cnt }) # On success copy to non-localized - # location. - >x; - -will set C<$res = 4>. Note that after the match, $cnt returns to the globally -introduced value, because the scopes that restrict C operators -are unwound. - -This assertion may be used as a C<(?(condition)yes-pattern|no-pattern)> -switch. If I used in this way, the result of evaluation of -C is put into the special variable C<$^R>. This happens -immediately, so C<$^R> can be used from other C<(?{ code })> assertions -inside the same regular expression. - -The assignment to C<$^R> above is properly localized, so the old -value of C<$^R> is restored if the assertion is backtracked; compare -L<"Backtracking">. - -For reasons of security, this construct is forbidden if the regular -expression involves run-time interpolation of variables, unless the -perilous C pragma has been used (see L), or the -variables contain results of C operator (see -L). - -This restriction is because of the wide-spread and remarkably convenient -custom of using run-time determined strings as patterns. For example: - - $re = <>; - chomp $re; - $string =~ /$re/; - -Before Perl knew how to execute interpolated code within a pattern, -this operation was completely safe from a security point of view, -although it could raise an exception from an illegal pattern. If -you turn on the C, though, it is no longer secure, -so you should only do so if you are also using taint checking. -Better yet, use the carefully constrained evaluation within a Safe -module. See L for details about both these mechanisms. - -=item C<(??{ code })> - -B: This extended regular expression feature is considered -highly experimental, and may be changed or deleted without notice. -A simplified version of the syntax may be introduced for commonly -used idioms. - -This is a "postponed" regular subexpression. The C is evaluated -at run time, at the moment this subexpression may match. The result -of evaluation is considered as a regular expression and matched as -if it were inserted instead of this construct. - -The C is not interpolated. As before, the rules to determine -where the C ends are currently somewhat convoluted. - -The following pattern matches a parenthesized group: - - $re = qr{ - \( - (?: - (?> [^()]+ ) # Non-parens without backtracking - | - (??{ $re }) # Group with matching parens - )* - \) - }x; - -=item C<< (?>pattern) >> - -B: This extended regular expression feature is considered -highly experimental, and may be changed or deleted without notice. - -An "independent" subexpression, one which matches the substring -that a I C would match if anchored at the given -position, and it matches I. This -construct is useful for optimizations of what would otherwise be -"eternal" matches, because it will not backtrack (see L<"Backtracking">). -It may also be useful in places where the "grab all you can, and do not -give anything back" semantic is desirable. - -For example: C<< ^(?>a*)ab >> will never match, since C<< (?>a*) >> -(anchored at the beginning of string, as above) will match I -characters C at the beginning of string, leaving no C for -C to match. In contrast, C will match the same as C, -since the match of the subgroup C is influenced by the following -group C (see L<"Backtracking">). In particular, C inside -C will match fewer characters than a standalone C, since -this makes the tail match. - -An effect similar to C<< (?>pattern) >> may be achieved by writing -C<(?=(pattern))\1>. This matches the same substring as a standalone -C, and the following C<\1> eats the matched string; it therefore -makes a zero-length assertion into an analogue of C<< (?>...) >>. -(The difference between these two constructs is that the second one -uses a capturing group, thus shifting ordinals of backreferences -in the rest of a regular expression.) - -Consider this pattern: - - m{ \( - ( - [^()]+ # x+ - | - \( [^()]* \) - )+ - \) - }x - -That will efficiently match a nonempty group with matching parentheses -two levels deep or less. However, if there is no such group, it -will take virtually forever on a long string. That's because there -are so many different ways to split a long string into several -substrings. This is what C<(.+)+> is doing, and C<(.+)+> is similar -to a subpattern of the above pattern. Consider how the pattern -above detects no-match on C<((()aaaaaaaaaaaaaaaaaa> in several -seconds, but that each extra letter doubles this time. This -exponential performance will make it appear that your program has -hung. However, a tiny change to this pattern - - m{ \( - ( - (?> [^()]+ ) # change x+ above to (?> x+ ) - | - \( [^()]* \) - )+ - \) - }x - -which uses C<< (?>...) >> matches exactly when the one above does (verifying -this yourself would be a productive exercise), but finishes in a fourth -the time when used on a similar string with 1000000 Cs. Be aware, -however, that this pattern currently triggers a warning message under -the C pragma or B<-w> switch saying it -C<"matches the null string many times">): - -On simple groups, such as the pattern C<< (?> [^()]+ ) >>, a comparable -effect may be achieved by negative look-ahead, as in C<[^()]+ (?! [^()] )>. -This was only 4 times slower on a string with 1000000 Cs. - -The "grab all you can, and do not give anything back" semantic is desirable -in many situations where on the first sight a simple C<()*> looks like -the correct solution. Suppose we parse text with comments being delimited -by C<#> followed by some optional (horizontal) whitespace. Contrary to -its appearance, C<#[ \t]*> I the correct subexpression to match -the comment delimiter, because it may "give up" some whitespace if -the remainder of the pattern can be made to match that way. The correct -answer is either one of these: - - (?>#[ \t]*) - #[ \t]*(?![ \t]) - -For example, to grab non-empty comments into $1, one should use either -one of these: - - / (?> \# [ \t]* ) ( .+ ) /x; - / \# [ \t]* ( [^ \t] .* ) /x; - -Which one you pick depends on which of these expressions better reflects -the above specification of comments. - -=item C<(?(condition)yes-pattern|no-pattern)> - -=item C<(?(condition)yes-pattern)> - -B: This extended regular expression feature is considered -highly experimental, and may be changed or deleted without notice. - -Conditional expression. C<(condition)> should be either an integer in -parentheses (which is valid if the corresponding pair of parentheses -matched), or look-ahead/look-behind/evaluate zero-width assertion. - -For example: - - m{ ( \( )? - [^()]+ - (?(1) \) ) - }x - -matches a chunk of non-parentheses, possibly included in parentheses -themselves. - -=back - -=head2 Backtracking - -NOTE: This section presents an abstract approximation of regular -expression behavior. For a more rigorous (and complicated) view of -the rules involved in selecting a match among possible alternatives, -see L. - -A fundamental feature of regular expression matching involves the -notion called I, which is currently used (when needed) -by all regular expression quantifiers, namely C<*>, C<*?>, C<+>, -C<+?>, C<{n,m}>, and C<{n,m}?>. Backtracking is often optimized -internally, but the general principle outlined here is valid. - -For a regular expression to match, the I regular expression must -match, not just part of it. So if the beginning of a pattern containing a -quantifier succeeds in a way that causes later parts in the pattern to -fail, the matching engine backs up and recalculates the beginning -part--that's why it's called backtracking. - -Here is an example of backtracking: Let's say you want to find the -word following "foo" in the string "Food is on the foo table.": - - $_ = "Food is on the foo table."; - if ( /\b(foo)\s+(\w+)/i ) { - print "$2 follows $1.\n"; - } - -When the match runs, the first part of the regular expression (C<\b(foo)>) -finds a possible match right at the beginning of the string, and loads up -$1 with "Foo". However, as soon as the matching engine sees that there's -no whitespace following the "Foo" that it had saved in $1, it realizes its -mistake and starts over again one character after where it had the -tentative match. This time it goes all the way until the next occurrence -of "foo". The complete regular expression matches this time, and you get -the expected output of "table follows foo." - -Sometimes minimal matching can help a lot. Imagine you'd like to match -everything between "foo" and "bar". Initially, you write something -like this: - - $_ = "The food is under the bar in the barn."; - if ( /foo(.*)bar/ ) { - print "got <$1>\n"; - } - -Which perhaps unexpectedly yields: - - got - -That's because C<.*> was greedy, so you get everything between the -I "foo" and the I "bar". Here it's more effective -to use minimal matching to make sure you get the text between a "foo" -and the first "bar" thereafter. - - if ( /foo(.*?)bar/ ) { print "got <$1>\n" } - got - -Here's another example: let's say you'd like to match a number at the end -of a string, and you also want to keep the preceding part the match. -So you write this: - - $_ = "I have 2 numbers: 53147"; - if ( /(.*)(\d*)/ ) { # Wrong! - print "Beginning is <$1>, number is <$2>.\n"; - } - -That won't work at all, because C<.*> was greedy and gobbled up the -whole string. As C<\d*> can match on an empty string the complete -regular expression matched successfully. - - Beginning is , number is <>. - -Here are some variants, most of which don't work: - - $_ = "I have 2 numbers: 53147"; - @pats = qw{ - (.*)(\d*) - (.*)(\d+) - (.*?)(\d*) - (.*?)(\d+) - (.*)(\d+)$ - (.*?)(\d+)$ - (.*)\b(\d+)$ - (.*\D)(\d+)$ - }; - - for $pat (@pats) { - printf "%-12s ", $pat; - if ( /$pat/ ) { - print "<$1> <$2>\n"; - } else { - print "FAIL\n"; - } - } - -That will print out: - - (.*)(\d*) <> - (.*)(\d+) <7> - (.*?)(\d*) <> <> - (.*?)(\d+) <2> - (.*)(\d+)$ <7> - (.*?)(\d+)$ <53147> - (.*)\b(\d+)$ <53147> - (.*\D)(\d+)$ <53147> - -As you see, this can be a bit tricky. It's important to realize that a -regular expression is merely a set of assertions that gives a definition -of success. There may be 0, 1, or several different ways that the -definition might succeed against a particular string. And if there are -multiple ways it might succeed, you need to understand backtracking to -know which variety of success you will achieve. - -When using look-ahead assertions and negations, this can all get even -tricker. Imagine you'd like to find a sequence of non-digits not -followed by "123". You might try to write that as - - $_ = "ABC123"; - if ( /^\D*(?!123)/ ) { # Wrong! - print "Yup, no 123 in $_\n"; - } - -But that isn't going to match; at least, not the way you're hoping. It -claims that there is no 123 in the string. Here's a clearer picture of -why it that pattern matches, contrary to popular expectations: - - $x = 'ABC123' ; - $y = 'ABC445' ; - - print "1: got $1\n" if $x =~ /^(ABC)(?!123)/ ; - print "2: got $1\n" if $y =~ /^(ABC)(?!123)/ ; - - print "3: got $1\n" if $x =~ /^(\D*)(?!123)/ ; - print "4: got $1\n" if $y =~ /^(\D*)(?!123)/ ; - -This prints - - 2: got ABC - 3: got AB - 4: got ABC - -You might have expected test 3 to fail because it seems to a more -general purpose version of test 1. The important difference between -them is that test 3 contains a quantifier (C<\D*>) and so can use -backtracking, whereas test 1 will not. What's happening is -that you've asked "Is it true that at the start of $x, following 0 or more -non-digits, you have something that's not 123?" If the pattern matcher had -let C<\D*> expand to "ABC", this would have caused the whole pattern to -fail. - -The search engine will initially match C<\D*> with "ABC". Then it will -try to match C<(?!123> with "123", which fails. But because -a quantifier (C<\D*>) has been used in the regular expression, the -search engine can backtrack and retry the match differently -in the hope of matching the complete regular expression. - -The pattern really, I wants to succeed, so it uses the -standard pattern back-off-and-retry and lets C<\D*> expand to just "AB" this -time. Now there's indeed something following "AB" that is not -"123". It's "C123", which suffices. - -We can deal with this by using both an assertion and a negation. -We'll say that the first part in $1 must be followed both by a digit -and by something that's not "123". Remember that the look-aheads -are zero-width expressions--they only look, but don't consume any -of the string in their match. So rewriting this way produces what -you'd expect; that is, case 5 will fail, but case 6 succeeds: - - print "5: got $1\n" if $x =~ /^(\D*)(?=\d)(?!123)/ ; - print "6: got $1\n" if $y =~ /^(\D*)(?=\d)(?!123)/ ; - - 6: got ABC - -In other words, the two zero-width assertions next to each other work as though -they're ANDed together, just as you'd use any built-in assertions: C -matches only if you're at the beginning of the line AND the end of the -line simultaneously. The deeper underlying truth is that juxtaposition in -regular expressions always means AND, except when you write an explicit OR -using the vertical bar. C means match "a" AND (then) match "b", -although the attempted matches are made at different positions because "a" -is not a zero-width assertion, but a one-width assertion. - -B: particularly complicated regular expressions can take -exponential time to solve because of the immense number of possible -ways they can use backtracking to try match. For example, without -internal optimizations done by the regular expression engine, this will -take a painfully long time to run: - - 'aaaaaaaaaaaa' =~ /((a{0,5}){0,5})*[c]/ - -And if you used C<*>'s in the internal groups instead of limiting them -to 0 through 5 matches, then it would take forever--or until you ran -out of stack space. Moreover, these internal optimizations are not -always applicable. For example, if you put C<{0,5}> instead of C<*> -on the external group, no current optimization is applicable, and the -match takes a long time to finish. - -A powerful tool for optimizing such beasts is what is known as an -"independent group", -which does not backtrack (see Lpattern) >>>). Note also that -zero-length look-ahead/look-behind assertions will not backtrack to make -the tail match, since they are in "logical" context: only -whether they match is considered relevant. For an example -where side-effects of look-ahead I have influenced the -following match, see Lpattern) >>>. - -=head2 Version 8 Regular Expressions - -In case you're not familiar with the "regular" Version 8 regex -routines, here are the pattern-matching rules not described above. - -Any single character matches itself, unless it is a I -with a special meaning described here or above. You can cause -characters that normally function as metacharacters to be interpreted -literally by prefixing them with a "\" (e.g., "\." matches a ".", not any -character; "\\" matches a "\"). A series of characters matches that -series of characters in the target string, so the pattern C -would match "blurfl" in the target string. - -You can specify a character class, by enclosing a list of characters -in C<[]>, which will match any one character from the list. If the -first character after the "[" is "^", the class matches any character not -in the list. Within a list, the "-" character specifies a -range, so that C represents all characters between "a" and "z", -inclusive. If you want either "-" or "]" itself to be a member of a -class, put it at the start of the list (possibly after a "^"), or -escape it with a backslash. "-" is also taken literally when it is -at the end of the list, just before the closing "]". (The -following all specify the same class of three characters: C<[-az]>, -C<[az-]>, and C<[a\-z]>. All are different from C<[a-z]>, which -specifies a class containing twenty-six characters, even on EBCDIC -based coded character sets.) Also, if you try to use the character -classes C<\w>, C<\W>, C<\s>, C<\S>, C<\d>, or C<\D> as endpoints of -a range, that's not a range, the "-" is understood literally. - -Note also that the whole range idea is rather unportable between -character sets--and even within character sets they may cause results -you probably didn't expect. A sound principle is to use only ranges -that begin from and end at either alphabets of equal case ([a-e], -[A-E]), or digits ([0-9]). Anything else is unsafe. If in doubt, -spell out the character sets in full. - -Characters may be specified using a metacharacter syntax much like that -used in C: "\n" matches a newline, "\t" a tab, "\r" a carriage return, -"\f" a form feed, etc. More generally, \I, where I is a string -of octal digits, matches the character whose coded character set value -is I. Similarly, \xI, where I are hexadecimal digits, -matches the character whose numeric value is I. The expression \cI -matches the character control-I. Finally, the "." metacharacter -matches any character except "\n" (unless you use C). - -You can specify a series of alternatives for a pattern using "|" to -separate them, so that C will match any of "fee", "fie", -or "foe" in the target string (as would C). The -first alternative includes everything from the last pattern delimiter -("(", "[", or the beginning of the pattern) up to the first "|", and -the last alternative contains everything from the last "|" to the next -pattern delimiter. That's why it's common practice to include -alternatives in parentheses: to minimize confusion about where they -start and end. - -Alternatives are tried from left to right, so the first -alternative found for which the entire expression matches, is the one that -is chosen. This means that alternatives are not necessarily greedy. For -example: when matching C against "barefoot", only the "foo" -part will match, as that is the first alternative tried, and it successfully -matches the target string. (This might not seem important, but it is -important when you are capturing matched text using parentheses.) - -Also remember that "|" is interpreted as a literal within square brackets, -so if you write C<[fee|fie|foe]> you're really only matching C<[feio|]>. - -Within a pattern, you may designate subpatterns for later reference -by enclosing them in parentheses, and you may refer back to the -Ith subpattern later in the pattern using the metacharacter -\I. Subpatterns are numbered based on the left to right order -of their opening parenthesis. A backreference matches whatever -actually matched the subpattern in the string being examined, not -the rules for that subpattern. Therefore, C<(0|0x)\d*\s\1\d*> will -match "0x1234 0x4321", but not "0x1234 01234", because subpattern -1 matched "0x", even though the rule C<0|0x> could potentially match -the leading 0 in the second number. - -=head2 Warning on \1 vs $1 - -Some people get too used to writing things like: - - $pattern =~ s/(\W)/\\\1/g; - -This is grandfathered for the RHS of a substitute to avoid shocking the -B addicts, but it's a dirty habit to get into. That's because in -PerlThink, the righthand side of a C is a double-quoted string. C<\1> in -the usual double-quoted string means a control-A. The customary Unix -meaning of C<\1> is kludged in for C. However, if you get into the habit -of doing that, you get yourself into trouble if you then add an C -modifier. - - s/(\d+)/ \1 + 1 /eg; # causes warning under -w - -Or if you try to do - - s/(\d+)/\1000/; - -You can't disambiguate that by saying C<\{1}000>, whereas you can fix it with -C<${1}000>. The operation of interpolation should not be confused -with the operation of matching a backreference. Certainly they mean two -different things on the I side of the C. - -=head2 Repeated patterns matching zero-length substring - -B: Difficult material (and prose) ahead. This section needs a rewrite. - -Regular expressions provide a terse and powerful programming language. As -with most other power tools, power comes together with the ability -to wreak havoc. - -A common abuse of this power stems from the ability to make infinite -loops using regular expressions, with something as innocuous as: - - 'foo' =~ m{ ( o? )* }x; - -The C can match at the beginning of C<'foo'>, and since the position -in the string is not moved by the match, C would match again and again -because of the C<*> modifier. Another common way to create a similar cycle -is with the looping modifier C: - - @matches = ( 'foo' =~ m{ o? }xg ); - -or - - print "match: <$&>\n" while 'foo' =~ m{ o? }xg; - -or the loop implied by split(). - -However, long experience has shown that many programming tasks may -be significantly simplified by using repeated subexpressions that -may match zero-length substrings. Here's a simple example being: - - @chars = split //, $string; # // is not magic in split - ($whitewashed = $string) =~ s/()/ /g; # parens avoid magic s// / - -Thus Perl allows such constructs, by I. The rules for this are different for lower-level -loops given by the greedy modifiers C<*+{}>, and for higher-level -ones like the C modifier or split() operator. - -The lower-level loops are I (that is, the loop is -broken) when Perl detects that a repeated expression matched a -zero-length substring. Thus - - m{ (?: NON_ZERO_LENGTH | ZERO_LENGTH )* }x; - -is made equivalent to - - m{ (?: NON_ZERO_LENGTH )* - | - (?: ZERO_LENGTH )? - }x; - -The higher level-loops preserve an additional state between iterations: -whether the last match was zero-length. To break the loop, the following -match after a zero-length match is prohibited to have a length of zero. -This prohibition interacts with backtracking (see L<"Backtracking">), -and so the I match is chosen if the I match is of -zero length. - -For example: - - $_ = 'bar'; - s/\w??/<$&>/g; - -results in C<< <><><><> >>. At each position of the string the best -match given by non-greedy C is the zero-length match, and the I match is what is matched by C<\w>. Thus zero-length matches -alternate with one-character-long matches. - -Similarly, for repeated C the second-best match is the match at the -position one notch further in the string. - -The additional state of being I is associated with -the matched string, and is reset by each assignment to pos(). -Zero-length matches at the end of the previous match are ignored -during C. - -=head2 Combining pieces together - -Each of the elementary pieces of regular expressions which were described -before (such as C or C<\Z>) could match at most one substring -at the given position of the input string. However, in a typical regular -expression these elementary pieces are combined into more complicated -patterns using combining operators C, C, C etc -(in these examples C and C are regular subexpressions). - -Such combinations can include alternatives, leading to a problem of choice: -if we match a regular expression C against C<"abc">, will it match -substring C<"a"> or C<"ab">? One way to describe which substring is -actually matched is the concept of backtracking (see L<"Backtracking">). -However, this description is too low-level and makes you think -in terms of a particular implementation. - -Another description starts with notions of "better"/"worse". All the -substrings which may be matched by the given regular expression can be -sorted from the "best" match to the "worst" match, and it is the "best" -match which is chosen. This substitutes the question of "what is chosen?" -by the question of "which matches are better, and which are worse?". - -Again, for elementary pieces there is no such question, since at most -one match at a given position is possible. This section describes the -notion of better/worse for combining operators. In the description -below C and C are regular subexpressions. - -=over 4 - -=item C - -Consider two possible matches, C and C, C and C are -substrings which can be matched by C, C and C are substrings -which can be matched by C. - -If C is better match for C than C, C is a better -match than C. - -If C and C coincide: C is a better match than C if -C is better match for C than C. - -=item C - -When C can match, it is a better match than when only C can match. - -Ordering of two matches for C is the same as for C. Similar for -two matches for C. - -=item C - -Matches as C (repeated as many times as necessary). - -=item C - -Matches as C. - -=item C - -Matches as C. - -=item C, C, C - -Same as C, C, C respectively. - -=item C, C, C - -Same as C, C, C respectively. - -=item C<< (?>S) >> - -Matches the best match for C and only that. - -=item C<(?=S)>, C<(?<=S)> - -Only the best match for C is considered. (This is important only if -C has capturing parentheses, and backreferences are used somewhere -else in the whole regular expression.) - -=item C<(?!S)>, C<(? - -For this grouping operator there is no need to describe the ordering, since -only whether or not C can match is important. - -=item C<(??{ EXPR })> - -The ordering is the same as for the regular expression which is -the result of EXPR. - -=item C<(?(condition)yes-pattern|no-pattern)> - -Recall that which of C or C actually matches is -already determined. The ordering of the matches is the same as for the -chosen subexpression. - -=back - -The above recipes describe the ordering of matches I. -One more rule is needed to understand how a match is determined for the -whole regular expression: a match at an earlier position is always better -than a match at a later position. - -=head2 Creating custom RE engines - -Overloaded constants (see L) provide a simple way to extend -the functionality of the RE engine. - -Suppose that we want to enable a new RE escape-sequence C<\Y|> which -matches at boundary between white-space characters and non-whitespace -characters. Note that C<(?=\S)(? matches exactly -at these positions, so we want to have each C<\Y|> in the place of the -more complicated version. We can create a module C to do -this: - - package customre; - use overload; - - sub import { - shift; - die "No argument to customre::import allowed" if @_; - overload::constant 'qr' => \&convert; - } - - sub invalid { die "/$_[0]/: invalid escape '\\$_[1]'"} - - my %rules = ( '\\' => '\\', - 'Y|' => qr/(?=\S)(? enables the new escape in constant regular -expressions, i.e., those without any runtime variable interpolations. -As documented in L, this conversion will work only over -literal parts of regular expressions. For C<\Y|$re\Y|> the variable -part of this regular expression needs to be converted explicitly -(but only if the special meaning of C<\Y|> should be enabled inside $re): - - use customre; - $re = <>; - chomp $re; - $re = customre::convert $re; - /\Y|$re\Y|/; - -=head1 BUGS - -This document varies from difficult to understand to completely -and utterly opaque. The wandering prose riddled with jargon is -hard to fathom in several places. - -This document needs a rewrite that separates the tutorial content -from the reference content. - -=head1 SEE ALSO - -L. - -L. - -L. - -L. - -L. - -L. - -I by Jeffrey Friedl, published -by O'Reilly and Associates. diff --git a/lib/perl5/5.6.1/pods/perlref.pod b/lib/perl5/5.6.1/pods/perlref.pod deleted file mode 100644 index 2727e95a..00000000 --- a/lib/perl5/5.6.1/pods/perlref.pod +++ /dev/null @@ -1,703 +0,0 @@ -=head1 NAME - -perlref - Perl references and nested data structures - -=head1 NOTE - -This is complete documentation about all aspects of references. -For a shorter, tutorial introduction to just the essential features, -see L. - -=head1 DESCRIPTION - -Before release 5 of Perl it was difficult to represent complex data -structures, because all references had to be symbolic--and even then -it was difficult to refer to a variable instead of a symbol table entry. -Perl now not only makes it easier to use symbolic references to variables, -but also lets you have "hard" references to any piece of data or code. -Any scalar may hold a hard reference. Because arrays and hashes contain -scalars, you can now easily build arrays of arrays, arrays of hashes, -hashes of arrays, arrays of hashes of functions, and so on. - -Hard references are smart--they keep track of reference counts for you, -automatically freeing the thing referred to when its reference count goes -to zero. (Reference counts for values in self-referential or -cyclic data structures may not go to zero without a little help; see -L for a detailed explanation.) -If that thing happens to be an object, the object is destructed. See -L for more about objects. (In a sense, everything in Perl is an -object, but we usually reserve the word for references to objects that -have been officially "blessed" into a class package.) - -Symbolic references are names of variables or other objects, just as a -symbolic link in a Unix filesystem contains merely the name of a file. -The C<*glob> notation is something of a of symbolic reference. (Symbolic -references are sometimes called "soft references", but please don't call -them that; references are confusing enough without useless synonyms.) - -In contrast, hard references are more like hard links in a Unix file -system: They are used to access an underlying object without concern for -what its (other) name is. When the word "reference" is used without an -adjective, as in the following paragraph, it is usually talking about a -hard reference. - -References are easy to use in Perl. There is just one overriding -principle: Perl does no implicit referencing or dereferencing. When a -scalar is holding a reference, it always behaves as a simple scalar. It -doesn't magically start being an array or hash or subroutine; you have to -tell it explicitly to do so, by dereferencing it. - -=head2 Making References - -References can be created in several ways. - -=over 4 - -=item 1. - -By using the backslash operator on a variable, subroutine, or value. -(This works much like the & (address-of) operator in C.) -This typically creates I reference to a variable, because -there's already a reference to the variable in the symbol table. But -the symbol table reference might go away, and you'll still have the -reference that the backslash returned. Here are some examples: - - $scalarref = \$foo; - $arrayref = \@ARGV; - $hashref = \%ENV; - $coderef = \&handler; - $globref = \*foo; - -It isn't possible to create a true reference to an IO handle (filehandle -or dirhandle) using the backslash operator. The most you can get is a -reference to a typeglob, which is actually a complete symbol table entry. -But see the explanation of the C<*foo{THING}> syntax below. However, -you can still use type globs and globrefs as though they were IO handles. - -=item 2. - -A reference to an anonymous array can be created using square -brackets: - - $arrayref = [1, 2, ['a', 'b', 'c']]; - -Here we've created a reference to an anonymous array of three elements -whose final element is itself a reference to another anonymous array of three -elements. (The multidimensional syntax described later can be used to -access this. For example, after the above, C<< $arrayref->[2][1] >> would have -the value "b".) - -Taking a reference to an enumerated list is not the same -as using square brackets--instead it's the same as creating -a list of references! - - @list = (\$a, \@b, \%c); - @list = \($a, @b, %c); # same thing! - -As a special case, C<\(@foo)> returns a list of references to the contents -of C<@foo>, not a reference to C<@foo> itself. Likewise for C<%foo>, -except that the key references are to copies (since the keys are just -strings rather than full-fledged scalars). - -=item 3. - -A reference to an anonymous hash can be created using curly -brackets: - - $hashref = { - 'Adam' => 'Eve', - 'Clyde' => 'Bonnie', - }; - -Anonymous hash and array composers like these can be intermixed freely to -produce as complicated a structure as you want. The multidimensional -syntax described below works for these too. The values above are -literals, but variables and expressions would work just as well, because -assignment operators in Perl (even within local() or my()) are executable -statements, not compile-time declarations. - -Because curly brackets (braces) are used for several other things -including BLOCKs, you may occasionally have to disambiguate braces at the -beginning of a statement by putting a C<+> or a C in front so -that Perl realizes the opening brace isn't starting a BLOCK. The economy and -mnemonic value of using curlies is deemed worth this occasional extra -hassle. - -For example, if you wanted a function to make a new hash and return a -reference to it, you have these options: - - sub hashem { { @_ } } # silently wrong - sub hashem { +{ @_ } } # ok - sub hashem { return { @_ } } # ok - -On the other hand, if you want the other meaning, you can do this: - - sub showem { { @_ } } # ambiguous (currently ok, but may change) - sub showem { {; @_ } } # ok - sub showem { { return @_ } } # ok - -The leading C<+{> and C<{;> always serve to disambiguate -the expression to mean either the HASH reference, or the BLOCK. - -=item 4. - -A reference to an anonymous subroutine can be created by using -C without a subname: - - $coderef = sub { print "Boink!\n" }; - -Note the semicolon. Except for the code -inside not being immediately executed, a C is not so much a -declaration as it is an operator, like C or C. (However, no -matter how many times you execute that particular line (unless you're in an -C), $coderef will still have a reference to the I -anonymous subroutine.) - -Anonymous subroutines act as closures with respect to my() variables, -that is, variables lexically visible within the current scope. Closure -is a notion out of the Lisp world that says if you define an anonymous -function in a particular lexical context, it pretends to run in that -context even when it's called outside the context. - -In human terms, it's a funny way of passing arguments to a subroutine when -you define it as well as when you call it. It's useful for setting up -little bits of code to run later, such as callbacks. You can even -do object-oriented stuff with it, though Perl already provides a different -mechanism to do that--see L. - -You might also think of closure as a way to write a subroutine -template without using eval(). Here's a small example of how -closures work: - - sub newprint { - my $x = shift; - return sub { my $y = shift; print "$x, $y!\n"; }; - } - $h = newprint("Howdy"); - $g = newprint("Greetings"); - - # Time passes... - - &$h("world"); - &$g("earthlings"); - -This prints - - Howdy, world! - Greetings, earthlings! - -Note particularly that $x continues to refer to the value passed -into newprint() I "my $x" having gone out of scope by the -time the anonymous subroutine runs. That's what a closure is all -about. - -This applies only to lexical variables, by the way. Dynamic variables -continue to work as they have always worked. Closure is not something -that most Perl programmers need trouble themselves about to begin with. - -=item 5. - -References are often returned by special subroutines called constructors. -Perl objects are just references to a special type of object that happens to know -which package it's associated with. Constructors are just special -subroutines that know how to create that association. They do so by -starting with an ordinary reference, and it remains an ordinary reference -even while it's also being an object. Constructors are often -named new() and called indirectly: - - $objref = new Doggie (Tail => 'short', Ears => 'long'); - -But don't have to be: - - $objref = Doggie->new(Tail => 'short', Ears => 'long'); - - use Term::Cap; - $terminal = Term::Cap->Tgetent( { OSPEED => 9600 }); - - use Tk; - $main = MainWindow->new(); - $menubar = $main->Frame(-relief => "raised", - -borderwidth => 2) - -=item 6. - -References of the appropriate type can spring into existence if you -dereference them in a context that assumes they exist. Because we haven't -talked about dereferencing yet, we can't show you any examples yet. - -=item 7. - -A reference can be created by using a special syntax, lovingly known as -the *foo{THING} syntax. *foo{THING} returns a reference to the THING -slot in *foo (which is the symbol table entry which holds everything -known as foo). - - $scalarref = *foo{SCALAR}; - $arrayref = *ARGV{ARRAY}; - $hashref = *ENV{HASH}; - $coderef = *handler{CODE}; - $ioref = *STDIN{IO}; - $globref = *foo{GLOB}; - -All of these are self-explanatory except for C<*foo{IO}>. It returns -the IO handle, used for file handles (L), sockets -(L and L), and directory -handles (L). For compatibility with previous -versions of Perl, C<*foo{FILEHANDLE}> is a synonym for C<*foo{IO}>. - -C<*foo{THING}> returns undef if that particular THING hasn't been used yet, -except in the case of scalars. C<*foo{SCALAR}> returns a reference to an -anonymous scalar if $foo hasn't been used yet. This might change in a -future release. - -C<*foo{IO}> is an alternative to the C<*HANDLE> mechanism given in -L for passing filehandles -into or out of subroutines, or storing into larger data structures. -Its disadvantage is that it won't create a new filehandle for you. -Its advantage is that you have less risk of clobbering more than -you want to with a typeglob assignment. (It still conflates file -and directory handles, though.) However, if you assign the incoming -value to a scalar instead of a typeglob as we do in the examples -below, there's no risk of that happening. - - splutter(*STDOUT); # pass the whole glob - splutter(*STDOUT{IO}); # pass both file and dir handles - - sub splutter { - my $fh = shift; - print $fh "her um well a hmmm\n"; - } - - $rec = get_rec(*STDIN); # pass the whole glob - $rec = get_rec(*STDIN{IO}); # pass both file and dir handles - - sub get_rec { - my $fh = shift; - return scalar <$fh>; - } - -=back - -=head2 Using References - -That's it for creating references. By now you're probably dying to -know how to use references to get back to your long-lost data. There -are several basic methods. - -=over 4 - -=item 1. - -Anywhere you'd put an identifier (or chain of identifiers) as part -of a variable or subroutine name, you can replace the identifier with -a simple scalar variable containing a reference of the correct type: - - $bar = $$scalarref; - push(@$arrayref, $filename); - $$arrayref[0] = "January"; - $$hashref{"KEY"} = "VALUE"; - &$coderef(1,2,3); - print $globref "output\n"; - -It's important to understand that we are specifically I dereferencing -C<$arrayref[0]> or C<$hashref{"KEY"}> there. The dereference of the -scalar variable happens I it does any key lookups. Anything more -complicated than a simple scalar variable must use methods 2 or 3 below. -However, a "simple scalar" includes an identifier that itself uses method -1 recursively. Therefore, the following prints "howdy". - - $refrefref = \\\"howdy"; - print $$$$refrefref; - -=item 2. - -Anywhere you'd put an identifier (or chain of identifiers) as part of a -variable or subroutine name, you can replace the identifier with a -BLOCK returning a reference of the correct type. In other words, the -previous examples could be written like this: - - $bar = ${$scalarref}; - push(@{$arrayref}, $filename); - ${$arrayref}[0] = "January"; - ${$hashref}{"KEY"} = "VALUE"; - &{$coderef}(1,2,3); - $globref->print("output\n"); # iff IO::Handle is loaded - -Admittedly, it's a little silly to use the curlies in this case, but -the BLOCK can contain any arbitrary expression, in particular, -subscripted expressions: - - &{ $dispatch{$index} }(1,2,3); # call correct routine - -Because of being able to omit the curlies for the simple case of C<$$x>, -people often make the mistake of viewing the dereferencing symbols as -proper operators, and wonder about their precedence. If they were, -though, you could use parentheses instead of braces. That's not the case. -Consider the difference below; case 0 is a short-hand version of case 1, -I case 2: - - $$hashref{"KEY"} = "VALUE"; # CASE 0 - ${$hashref}{"KEY"} = "VALUE"; # CASE 1 - ${$hashref{"KEY"}} = "VALUE"; # CASE 2 - ${$hashref->{"KEY"}} = "VALUE"; # CASE 3 - -Case 2 is also deceptive in that you're accessing a variable -called %hashref, not dereferencing through $hashref to the hash -it's presumably referencing. That would be case 3. - -=item 3. - -Subroutine calls and lookups of individual array elements arise often -enough that it gets cumbersome to use method 2. As a form of -syntactic sugar, the examples for method 2 may be written: - - $arrayref->[0] = "January"; # Array element - $hashref->{"KEY"} = "VALUE"; # Hash element - $coderef->(1,2,3); # Subroutine call - -The left side of the arrow can be any expression returning a reference, -including a previous dereference. Note that C<$array[$x]> is I the -same thing as C<< $array->[$x] >> here: - - $array[$x]->{"foo"}->[0] = "January"; - -This is one of the cases we mentioned earlier in which references could -spring into existence when in an lvalue context. Before this -statement, C<$array[$x]> may have been undefined. If so, it's -automatically defined with a hash reference so that we can look up -C<{"foo"}> in it. Likewise C<< $array[$x]->{"foo"} >> will automatically get -defined with an array reference so that we can look up C<[0]> in it. -This process is called I. - -One more thing here. The arrow is optional I brackets -subscripts, so you can shrink the above down to - - $array[$x]{"foo"}[0] = "January"; - -Which, in the degenerate case of using only ordinary arrays, gives you -multidimensional arrays just like C's: - - $score[$x][$y][$z] += 42; - -Well, okay, not entirely like C's arrays, actually. C doesn't know how -to grow its arrays on demand. Perl does. - -=item 4. - -If a reference happens to be a reference to an object, then there are -probably methods to access the things referred to, and you should probably -stick to those methods unless you're in the class package that defines the -object's methods. In other words, be nice, and don't violate the object's -encapsulation without a very good reason. Perl does not enforce -encapsulation. We are not totalitarians here. We do expect some basic -civility though. - -=back - -Using a string or number as a reference produces a symbolic reference, -as explained above. Using a reference as a number produces an -integer representing its storage location in memory. The only -useful thing to be done with this is to compare two references -numerically to see whether they refer to the same location. - - if ($ref1 == $ref2) { # cheap numeric compare of references - print "refs 1 and 2 refer to the same thing\n"; - } - -Using a reference as a string produces both its referent's type, -including any package blessing as described in L, as well -as the numeric address expressed in hex. The ref() operator returns -just the type of thing the reference is pointing to, without the -address. See L for details and examples of its use. - -The bless() operator may be used to associate the object a reference -points to with a package functioning as an object class. See L. - -A typeglob may be dereferenced the same way a reference can, because -the dereference syntax always indicates the type of reference desired. -So C<${*foo}> and C<${\$foo}> both indicate the same scalar variable. - -Here's a trick for interpolating a subroutine call into a string: - - print "My sub returned @{[mysub(1,2,3)]} that time.\n"; - -The way it works is that when the C<@{...}> is seen in the double-quoted -string, it's evaluated as a block. The block creates a reference to an -anonymous array containing the results of the call to C. So -the whole block returns a reference to an array, which is then -dereferenced by C<@{...}> and stuck into the double-quoted string. This -chicanery is also useful for arbitrary expressions: - - print "That yields @{[$n + 5]} widgets\n"; - -=head2 Symbolic references - -We said that references spring into existence as necessary if they are -undefined, but we didn't say what happens if a value used as a -reference is already defined, but I a hard reference. If you -use it as a reference, it'll be treated as a symbolic -reference. That is, the value of the scalar is taken to be the I -of a variable, rather than a direct link to a (possibly) anonymous -value. - -People frequently expect it to work like this. So it does. - - $name = "foo"; - $$name = 1; # Sets $foo - ${$name} = 2; # Sets $foo - ${$name x 2} = 3; # Sets $foofoo - $name->[0] = 4; # Sets $foo[0] - @$name = (); # Clears @foo - &$name(); # Calls &foo() (as in Perl 4) - $pack = "THAT"; - ${"${pack}::$name"} = 5; # Sets $THAT::foo without eval - -This is powerful, and slightly dangerous, in that it's possible -to intend (with the utmost sincerity) to use a hard reference, and -accidentally use a symbolic reference instead. To protect against -that, you can say - - use strict 'refs'; - -and then only hard references will be allowed for the rest of the enclosing -block. An inner block may countermand that with - - no strict 'refs'; - -Only package variables (globals, even if localized) are visible to -symbolic references. Lexical variables (declared with my()) aren't in -a symbol table, and thus are invisible to this mechanism. For example: - - local $value = 10; - $ref = "value"; - { - my $value = 20; - print $$ref; - } - -This will still print 10, not 20. Remember that local() affects package -variables, which are all "global" to the package. - -=head2 Not-so-symbolic references - -A new feature contributing to readability in perl version 5.001 is that the -brackets around a symbolic reference behave more like quotes, just as they -always have within a string. That is, - - $push = "pop on "; - print "${push}over"; - -has always meant to print "pop on over", even though push is -a reserved word. This has been generalized to work the same outside -of quotes, so that - - print ${push} . "over"; - -and even - - print ${ push } . "over"; - -will have the same effect. (This would have been a syntax error in -Perl 5.000, though Perl 4 allowed it in the spaceless form.) This -construct is I considered to be a symbolic reference when you're -using strict refs: - - use strict 'refs'; - ${ bareword }; # Okay, means $bareword. - ${ "bareword" }; # Error, symbolic reference. - -Similarly, because of all the subscripting that is done using single -words, we've applied the same rule to any bareword that is used for -subscripting a hash. So now, instead of writing - - $array{ "aaa" }{ "bbb" }{ "ccc" } - -you can write just - - $array{ aaa }{ bbb }{ ccc } - -and not worry about whether the subscripts are reserved words. In the -rare event that you do wish to do something like - - $array{ shift } - -you can force interpretation as a reserved word by adding anything that -makes it more than a bareword: - - $array{ shift() } - $array{ +shift } - $array{ shift @_ } - -The C pragma or the B<-w> switch will warn you if it -interprets a reserved word as a string. -But it will no longer warn you about using lowercase words, because the -string is effectively quoted. - -=head2 Pseudo-hashes: Using an array as a hash - -B: This section describes an experimental feature. Details may -change without notice in future versions. - -Beginning with release 5.005 of Perl, you may use an array reference -in some contexts that would normally require a hash reference. This -allows you to access array elements using symbolic names, as if they -were fields in a structure. - -For this to work, the array must contain extra information. The first -element of the array has to be a hash reference that maps field names -to array indices. Here is an example: - - $struct = [{foo => 1, bar => 2}, "FOO", "BAR"]; - - $struct->{foo}; # same as $struct->[1], i.e. "FOO" - $struct->{bar}; # same as $struct->[2], i.e. "BAR" - - keys %$struct; # will return ("foo", "bar") in some order - values %$struct; # will return ("FOO", "BAR") in same some order - - while (my($k,$v) = each %$struct) { - print "$k => $v\n"; - } - -Perl will raise an exception if you try to access nonexistent fields. -To avoid inconsistencies, always use the fields::phash() function -provided by the C pragma. - - use fields; - $pseudohash = fields::phash(foo => "FOO", bar => "BAR"); - -For better performance, Perl can also do the translation from field -names to array indices at compile time for typed object references. -See L. - -There are two ways to check for the existence of a key in a -pseudo-hash. The first is to use exists(). This checks to see if the -given field has ever been set. It acts this way to match the behavior -of a regular hash. For instance: - - use fields; - $phash = fields::phash([qw(foo bar pants)], ['FOO']); - $phash->{pants} = undef; - - print exists $phash->{foo}; # true, 'foo' was set in the declaration - print exists $phash->{bar}; # false, 'bar' has not been used. - print exists $phash->{pants}; # true, your 'pants' have been touched - -The second is to use exists() on the hash reference sitting in the -first array element. This checks to see if the given key is a valid -field in the pseudo-hash. - - print exists $phash->[0]{bar}; # true, 'bar' is a valid field - print exists $phash->[0]{shoes};# false, 'shoes' can't be used - -delete() on a pseudo-hash element only deletes the value corresponding -to the key, not the key itself. To delete the key, you'll have to -explicitly delete it from the first hash element. - - print delete $phash->{foo}; # prints $phash->[1], "FOO" - print exists $phash->{foo}; # false - print exists $phash->[0]{foo}; # true, key still exists - print delete $phash->[0]{foo}; # now key is gone - print $phash->{foo}; # runtime exception - -=head2 Function Templates - -As explained above, a closure is an anonymous function with access to the -lexical variables visible when that function was compiled. It retains -access to those variables even though it doesn't get run until later, -such as in a signal handler or a Tk callback. - -Using a closure as a function template allows us to generate many functions -that act similarly. Suppose you wanted functions named after the colors -that generated HTML font changes for the various colors: - - print "Be ", red("careful"), "with that ", green("light"); - -The red() and green() functions would be similar. To create these, -we'll assign a closure to a typeglob of the name of the function we're -trying to build. - - @colors = qw(red blue green yellow orange purple violet); - for my $name (@colors) { - no strict 'refs'; # allow symbol table manipulation - *$name = *{uc $name} = sub { "@_" }; - } - -Now all those different functions appear to exist independently. You can -call red(), RED(), blue(), BLUE(), green(), etc. This technique saves on -both compile time and memory use, and is less error-prone as well, since -syntax checks happen at compile time. It's critical that any variables in -the anonymous subroutine be lexicals in order to create a proper closure. -That's the reasons for the C on the loop iteration variable. - -This is one of the only places where giving a prototype to a closure makes -much sense. If you wanted to impose scalar context on the arguments of -these functions (probably not a wise idea for this particular example), -you could have written it this way instead: - - *$name = sub ($) { "$_[0]" }; - -However, since prototype checking happens at compile time, the assignment -above happens too late to be of much use. You could address this by -putting the whole loop of assignments within a BEGIN block, forcing it -to occur during compilation. - -Access to lexicals that change over type--like those in the C loop -above--only works with closures, not general subroutines. In the general -case, then, named subroutines do not nest properly, although anonymous -ones do. If you are accustomed to using nested subroutines in other -programming languages with their own private variables, you'll have to -work at it a bit in Perl. The intuitive coding of this type of thing -incurs mysterious warnings about ``will not stay shared''. For example, -this won't work: - - sub outer { - my $x = $_[0] + 35; - sub inner { return $x * 19 } # WRONG - return $x + inner(); - } - -A work-around is the following: - - sub outer { - my $x = $_[0] + 35; - local *inner = sub { return $x * 19 }; - return $x + inner(); - } - -Now inner() can only be called from within outer(), because of the -temporary assignments of the closure (anonymous subroutine). But when -it does, it has normal access to the lexical variable $x from the scope -of outer(). - -This has the interesting effect of creating a function local to another -function, something not normally supported in Perl. - -=head1 WARNING - -You may not (usefully) use a reference as the key to a hash. It will be -converted into a string: - - $x{ \$a } = $a; - -If you try to dereference the key, it won't do a hard dereference, and -you won't accomplish what you're attempting. You might want to do something -more like - - $r = \@a; - $x{ $r } = $r; - -And then at least you can use the values(), which will be -real refs, instead of the keys(), which won't. - -The standard Tie::RefHash module provides a convenient workaround to this. - -=head1 SEE ALSO - -Besides the obvious documents, source code can be instructive. -Some pathological examples of the use of references can be found -in the F regression test in the Perl source directory. - -See also L and L for how to use references to create -complex data structures, and L, L, and L -for how to use them to create objects. diff --git a/lib/perl5/5.6.1/pods/perlreftut.pod b/lib/perl5/5.6.1/pods/perlreftut.pod deleted file mode 100644 index 073d358d..00000000 --- a/lib/perl5/5.6.1/pods/perlreftut.pod +++ /dev/null @@ -1,416 +0,0 @@ - -=head1 NAME - -perlreftut - Mark's very short tutorial about references - -=head1 DESCRIPTION - -One of the most important new features in Perl 5 was the capability to -manage complicated data structures like multidimensional arrays and -nested hashes. To enable these, Perl 5 introduced a feature called -`references', and using references is the key to managing complicated, -structured data in Perl. Unfortunately, there's a lot of funny syntax -to learn, and the main manual page can be hard to follow. The manual -is quite complete, and sometimes people find that a problem, because -it can be hard to tell what is important and what isn't. - -Fortunately, you only need to know 10% of what's in the main page to get -90% of the benefit. This page will show you that 10%. - -=head1 Who Needs Complicated Data Structures? - -One problem that came up all the time in Perl 4 was how to represent a -hash whose values were lists. Perl 4 had hashes, of course, but the -values had to be scalars; they couldn't be lists. - -Why would you want a hash of lists? Let's take a simple example: You -have a file of city and country names, like this: - - Chicago, USA - Frankfurt, Germany - Berlin, Germany - Washington, USA - Helsinki, Finland - New York, USA - -and you want to produce an output like this, with each country mentioned -once, and then an alphabetical list of the cities in that country: - - Finland: Helsinki. - Germany: Berlin, Frankfurt. - USA: Chicago, New York, Washington. - -The natural way to do this is to have a hash whose keys are country -names. Associated with each country name key is a list of the cities in -that country. Each time you read a line of input, split it into a country -and a city, look up the list of cities already known to be in that -country, and append the new city to the list. When you're done reading -the input, iterate over the hash as usual, sorting each list of cities -before you print it out. - -If hash values can't be lists, you lose. In Perl 4, hash values can't -be lists; they can only be strings. You lose. You'd probably have to -combine all the cities into a single string somehow, and then when -time came to write the output, you'd have to break the string into a -list, sort the list, and turn it back into a string. This is messy -and error-prone. And it's frustrating, because Perl already has -perfectly good lists that would solve the problem if only you could -use them. - -=head1 The Solution - -By the time Perl 5 rolled around, we were already stuck with this -design: Hash values must be scalars. The solution to this is -references. - -A reference is a scalar value that I an entire array or an -entire hash (or to just about anything else). Names are one kind of -reference that you're already familiar with. Think of the President: -a messy, inconvenient bag of blood and bones. But to talk about him, -or to represent him in a computer program, all you need is the easy, -convenient scalar string "Bill Clinton". - -References in Perl are like names for arrays and hashes. They're -Perl's private, internal names, so you can be sure they're -unambiguous. Unlike "Bill Clinton", a reference only refers to one -thing, and you always know what it refers to. If you have a reference -to an array, you can recover the entire array from it. If you have a -reference to a hash, you can recover the entire hash. But the -reference is still an easy, compact scalar value. - -You can't have a hash whose values are arrays; hash values can only be -scalars. We're stuck with that. But a single reference can refer to -an entire array, and references are scalars, so you can have a hash of -references to arrays, and it'll act a lot like a hash of arrays, and -it'll be just as useful as a hash of arrays. - -We'll come back to this city-country problem later, after we've seen -some syntax for managing references. - - -=head1 Syntax - -There are just two ways to make a reference, and just two ways to use -it once you have it. - -=head2 Making References - -B - -If you put a C<\> in front of a variable, you get a -reference to that variable. - - $aref = \@array; # $aref now holds a reference to @array - $href = \%hash; # $href now holds a reference to %hash - -Once the reference is stored in a variable like $aref or $href, you -can copy it or store it just the same as any other scalar value: - - $xy = $aref; # $xy now holds a reference to @array - $p[3] = $href; # $p[3] now holds a reference to %hash - $z = $p[3]; # $z now holds a reference to %hash - - -These examples show how to make references to variables with names. -Sometimes you want to make an array or a hash that doesn't have a -name. This is analogous to the way you like to be able to use the -string C<"\n"> or the number 80 without having to store it in a named -variable first. - -B - -C<[ ITEMS ]> makes a new, anonymous array, and returns a reference to -that array. C<{ ITEMS }> makes a new, anonymous hash. and returns a -reference to that hash. - - $aref = [ 1, "foo", undef, 13 ]; - # $aref now holds a reference to an array - - $href = { APR => 4, AUG => 8 }; - # $href now holds a reference to a hash - - -The references you get from rule 2 are the same kind of -references that you get from rule 1: - - # This: - $aref = [ 1, 2, 3 ]; - - # Does the same as this: - @array = (1, 2, 3); - $aref = \@array; - - -The first line is an abbreviation for the following two lines, except -that it doesn't create the superfluous array variable C<@array>. - - -=head2 Using References - -What can you do with a reference once you have it? It's a scalar -value, and we've seen that you can store it as a scalar and get it back -again just like any scalar. There are just two more ways to use it: - -B - -If C<$aref> contains a reference to an array, then you -can put C<{$aref}> anywhere you would normally put the name of an -array. For example, C<@{$aref}> instead of C<@array>. - -Here are some examples of that: - -Arrays: - - - @a @{$aref} An array - reverse @a reverse @{$aref} Reverse the array - $a[3] ${$aref}[3] An element of the array - $a[3] = 17; ${$aref}[3] = 17 Assigning an element - - -On each line are two expressions that do the same thing. The -left-hand versions operate on the array C<@a>, and the right-hand -versions operate on the array that is referred to by C<$aref>, but -once they find the array they're operating on, they do the same things -to the arrays. - -Using a hash reference is I the same: - - %h %{$href} A hash - keys %h keys %{$href} Get the keys from the hash - $h{'red'} ${$href}{'red'} An element of the hash - $h{'red'} = 17 ${$href}{'red'} = 17 Assigning an element - - -B - -C<${$aref}[3]> is too hard to read, so you can write C<< $aref->[3] >> -instead. - -C<${$href}{red}> is too hard to read, so you can write -C<< $href->{red} >> instead. - -Most often, when you have an array or a hash, you want to get or set a -single element from it. C<${$aref}[3]> and C<${$href}{'red'}> have -too much punctuation, and Perl lets you abbreviate. - -If C<$aref> holds a reference to an array, then C<< $aref->[3] >> is -the fourth element of the array. Don't confuse this with C<$aref[3]>, -which is the fourth element of a totally different array, one -deceptively named C<@aref>. C<$aref> and C<@aref> are unrelated the -same way that C<$item> and C<@item> are. - -Similarly, C<< $href->{'red'} >> is part of the hash referred to by -the scalar variable C<$href>, perhaps even one with no name. -C<$href{'red'}> is part of the deceptively named C<%href> hash. It's -easy to forget to leave out the C<< -> >>, and if you do, you'll get -bizarre results when your program gets array and hash elements out of -totally unexpected hashes and arrays that weren't the ones you wanted -to use. - - -=head1 An Example - -Let's see a quick example of how all this is useful. - -First, remember that C<[1, 2, 3]> makes an anonymous array containing -C<(1, 2, 3)>, and gives you a reference to that array. - -Now think about - - @a = ( [1, 2, 3], - [4, 5, 6], - [7, 8, 9] - ); - -@a is an array with three elements, and each one is a reference to -another array. - -C<$a[1]> is one of these references. It refers to an array, the array -containing C<(4, 5, 6)>, and because it is a reference to an array, -B says that we can write C<< $a[1]->[2] >> to get the -third element from that array. C<< $a[1]->[2] >> is the 6. -Similarly, C<< $a[0]->[1] >> is the 2. What we have here is like a -two-dimensional array; you can write C<< $a[ROW]->[COLUMN] >> to get -or set the element in any row and any column of the array. - -The notation still looks a little cumbersome, so there's one more -abbreviation: - -=head1 Arrow Rule - -In between two B, the arrow is optional. - -Instead of C<< $a[1]->[2] >>, we can write C<$a[1][2]>; it means the -same thing. Instead of C<< $a[0]->[1] >>, we can write C<$a[0][1]>; -it means the same thing. - -Now it really looks like two-dimensional arrays! - -You can see why the arrows are important. Without them, we would have -had to write C<${$a[1]}[2]> instead of C<$a[1][2]>. For -three-dimensional arrays, they let us write C<$x[2][3][5]> instead of -the unreadable C<${${$x[2]}[3]}[5]>. - - -=head1 Solution - -Here's the answer to the problem I posed earlier, of reformatting a -file of city and country names. - - 1 while (<>) { - 2 chomp; - 3 my ($city, $country) = split /, /; - 4 push @{$table{$country}}, $city; - 5 } - 6 - 7 foreach $country (sort keys %table) { - 8 print "$country: "; - 9 my @cities = @{$table{$country}}; - 10 print join ', ', sort @cities; - 11 print ".\n"; - 12 } - - -The program has two pieces: Lines 1--5 read the input and build a -data structure, and lines 7--12 analyze the data and print out the -report. - -In the first part, line 4 is the important one. We're going to have a -hash, C<%table>, whose keys are country names, and whose values are -(references to) arrays of city names. After acquiring a city and -country name, the program looks up C<$table{$country}>, which holds (a -reference to) the list of cities seen in that country so far. Line 4 is -totally analogous to - - push @array, $city; - -except that the name C has been replaced by the reference -C<{$table{$country}}>. The C adds a city name to the end of the -referred-to array. - -In the second part, line 9 is the important one. Again, -C<$table{$country}> is (a reference to) the list of cities in the country, so -we can recover the original list, and copy it into the array C<@cities>, -by using C<@{$table{$country}}>. Line 9 is totally analogous to - - @cities = @array; - -except that the name C has been replaced by the reference -C<{$table{$country}}>. The C<@> tells Perl to get the entire array. - -The rest of the program is just familiar uses of C, C, C, -C, and doesn't involve references at all. - -There's one fine point I skipped. Suppose the program has just read -the first line in its input that happens to mention Greece. -Control is at line 4, C<$country> is C<'Greece'>, and C<$city> is -C<'Athens'>. Since this is the first city in Greece, -C<$table{$country}> is undefined---in fact there isn't an C<'Greece'> key -in C<%table> at all. What does line 4 do here? - - 4 push @{$table{$country}}, $city; - - -This is Perl, so it does the exact right thing. It sees that you want -to push C onto an array that doesn't exist, so it helpfully -makes a new, empty, anonymous array for you, installs it in the table, -and then pushes C onto it. This is called `autovivification'. - - -=head1 The Rest - -I promised to give you 90% of the benefit with 10% of the details, and -that means I left out 90% of the details. Now that you have an -overview of the important parts, it should be easier to read the -L manual page, which discusses 100% of the details. - -Some of the highlights of L: - -=over 4 - -=item * - -You can make references to anything, including scalars, functions, and -other references. - -=item * - -In B, you can omit the curly brackets whenever the thing -inside them is an atomic scalar variable like C<$aref>. For example, -C<@$aref> is the same as C<@{$aref}>, and C<$$aref[1]> is the same as -C<${$aref}[1]>. If you're just starting out, you may want to adopt -the habit of always including the curly brackets. - -=item * - -To see if a variable contains a reference, use the `ref' function. -It returns true if its argument is a reference. Actually it's a -little better than that: It returns HASH for hash references and -ARRAY for array references. - -=item * - -If you try to use a reference like a string, you get strings like - - ARRAY(0x80f5dec) or HASH(0x826afc0) - -If you ever see a string that looks like this, you'll know you -printed out a reference by mistake. - -A side effect of this representation is that you can use C to see -if two references refer to the same thing. (But you should usually use -C<==> instead because it's much faster.) - -=item * - -You can use a string as if it were a reference. If you use the string -C<"foo"> as an array reference, it's taken to be a reference to the -array C<@foo>. This is called a I or I. - -=back - -You might prefer to go on to L instead of L; it -discusses lists of lists and multidimensional arrays in detail. After -that, you should move on to L; it's a Data Structure Cookbook -that shows recipes for using and printing out arrays of hashes, hashes -of arrays, and other kinds of data. - -=head1 Summary - -Everyone needs compound data structures, and in Perl the way you get -them is with references. There are four important rules for managing -references: Two for making references and two for using them. Once -you know these rules you can do most of the important things you need -to do with references. - -=head1 Credits - -Author: Mark-Jason Dominus, Plover Systems (C) - -This article originally appeared in I -(http://tpj.com) volume 3, #2. Reprinted with permission. - -The original title was I. - -=head2 Distribution Conditions - -Copyright 1998 The Perl Journal. - -When included as part of the Standard Version of Perl, or as part of -its complete documentation whether printed or otherwise, this work may -be distributed only under the terms of Perl's Artistic License. Any -distribution of this file or derivatives thereof outside of that -package require that special arrangements be made with copyright -holder. - -Irrespective of its distribution, all code examples in these files are -hereby placed into the public domain. You are permitted and -encouraged to use this code in your own programs for fun or for profit -as you see fit. A simple comment in the code giving credit would be -courteous but is not required. - - - - -=cut diff --git a/lib/perl5/5.6.1/pods/perlrequick.pod b/lib/perl5/5.6.1/pods/perlrequick.pod deleted file mode 100644 index 5b72a351..00000000 --- a/lib/perl5/5.6.1/pods/perlrequick.pod +++ /dev/null @@ -1,503 +0,0 @@ -=head1 NAME - -perlrequick - Perl regular expressions quick start - -=head1 DESCRIPTION - -This page covers the very basics of understanding, creating and -using regular expressions ('regexes') in Perl. - - -=head1 The Guide - -=head2 Simple word matching - -The simplest regex is simply a word, or more generally, a string of -characters. A regex consisting of a word matches any string that -contains that word: - - "Hello World" =~ /World/; # matches - -In this statement, C is a regex and the C enclosing -C tells perl to search a string for a match. The operator -C<=~> associates the string with the regex match and produces a true -value if the regex matched, or false if the regex did not match. In -our case, C matches the second word in C<"Hello World">, so the -expression is true. This idea has several variations. - -Expressions like this are useful in conditionals: - - print "It matches\n" if "Hello World" =~ /World/; - -The sense of the match can be reversed by using C operator: - - print "It doesn't match\n" if "Hello World" !~ /World/; - -The literal string in the regex can be replaced by a variable: - - $greeting = "World"; - print "It matches\n" if "Hello World" =~ /$greeting/; - -If you're matching against C<$_>, the C<$_ =~> part can be omitted: - - $_ = "Hello World"; - print "It matches\n" if /World/; - -Finally, the C default delimiters for a match can be changed to -arbitrary delimiters by putting an C<'m'> out front: - - "Hello World" =~ m!World!; # matches, delimited by '!' - "Hello World" =~ m{World}; # matches, note the matching '{}' - "/usr/bin/perl" =~ m"/perl"; # matches after '/usr/bin', - # '/' becomes an ordinary char - -Regexes must match a part of the string I in order for the -statement to be true: - - "Hello World" =~ /world/; # doesn't match, case sensitive - "Hello World" =~ /o W/; # matches, ' ' is an ordinary char - "Hello World" =~ /World /; # doesn't match, no ' ' at end - -perl will always match at the earliest possible point in the string: - - "Hello World" =~ /o/; # matches 'o' in 'Hello' - "That hat is red" =~ /hat/; # matches 'hat' in 'That' - -Not all characters can be used 'as is' in a match. Some characters, -called B, are reserved for use in regex notation. -The metacharacters are - - {}[]()^$.|*+?\ - -A metacharacter can be matched by putting a backslash before it: - - "2+2=4" =~ /2+2/; # doesn't match, + is a metacharacter - "2+2=4" =~ /2\+2/; # matches, \+ is treated like an ordinary + - 'C:\WIN32' =~ /C:\\WIN/; # matches - "/usr/bin/perl" =~ /\/usr\/local\/bin\/perl/; # matches - -In the last regex, the forward slash C<'/'> is also backslashed, -because it is used to delimit the regex. - -Non-printable ASCII characters are represented by B. -Common examples are C<\t> for a tab, C<\n> for a newline, and C<\r> -for a carriage return. Arbitrary bytes are represented by octal -escape sequences, e.g., C<\033>, or hexadecimal escape sequences, -e.g., C<\x1B>: - - "1000\t2000" =~ m(0\t2) # matches - "cat" =~ /\143\x61\x74/ # matches, but a weird way to spell cat - -Regexes are treated mostly as double quoted strings, so variable -substitution works: - - $foo = 'house'; - 'cathouse' =~ /cat$foo/; # matches - 'housecat' =~ /${foo}cat/; # matches - -With all of the regexes above, if the regex matched anywhere in the -string, it was considered a match. To specify I it should -match, we would use the B metacharacters C<^> and C<$>. The -anchor C<^> means match at the beginning of the string and the anchor -C<$> means match at the end of the string, or before a newline at the -end of the string. Some examples: - - "housekeeper" =~ /keeper/; # matches - "housekeeper" =~ /^keeper/; # doesn't match - "housekeeper" =~ /keeper$/; # matches - "housekeeper\n" =~ /keeper$/; # matches - "housekeeper" =~ /^housekeeper$/; # matches - -=head2 Using character classes - -A B allows a set of possible characters, rather than -just a single character, to match at a particular point in a regex. -Character classes are denoted by brackets C<[...]>, with the set of -characters to be possibly matched inside. Here are some examples: - - /cat/; # matches 'cat' - /[bcr]at/; # matches 'bat', 'cat', or 'rat' - "abc" =~ /[cab]/; # matches 'a' - -In the last statement, even though C<'c'> is the first character in -the class, the earliest point at which the regex can match is C<'a'>. - - /[yY][eE][sS]/; # match 'yes' in a case-insensitive way - # 'yes', 'Yes', 'YES', etc. - /yes/i; # also match 'yes' in a case-insensitive way - -The last example shows a match with an C<'i'> B, which makes -the match case-insensitive. - -Character classes also have ordinary and special characters, but the -sets of ordinary and special characters inside a character class are -different than those outside a character class. The special -characters for a character class are C<-]\^$> and are matched using an -escape: - - /[\]c]def/; # matches ']def' or 'cdef' - $x = 'bcr'; - /[$x]at/; # matches 'bat, 'cat', or 'rat' - /[\$x]at/; # matches '$at' or 'xat' - /[\\$x]at/; # matches '\at', 'bat, 'cat', or 'rat' - -The special character C<'-'> acts as a range operator within character -classes, so that the unwieldy C<[0123456789]> and C<[abc...xyz]> -become the svelte C<[0-9]> and C<[a-z]>: - - /item[0-9]/; # matches 'item0' or ... or 'item9' - /[0-9a-fA-F]/; # matches a hexadecimal digit - -If C<'-'> is the first or last character in a character class, it is -treated as an ordinary character. - -The special character C<^> in the first position of a character class -denotes a B, which matches any character but -those in the brackets. Both C<[...]> and C<[^...]> must match a -character, or the match fails. Then - - /[^a]at/; # doesn't match 'aat' or 'at', but matches - # all other 'bat', 'cat, '0at', '%at', etc. - /[^0-9]/; # matches a non-numeric character - /[a^]at/; # matches 'aat' or '^at'; here '^' is ordinary - -Perl has several abbreviations for common character classes: - -=over 4 - -=item * - -\d is a digit and represents [0-9] - -=item * - -\s is a whitespace character and represents [\ \t\r\n\f] - -=item * - -\w is a word character (alphanumeric or _) and represents [0-9a-zA-Z_] - -=item * - -\D is a negated \d; it represents any character but a digit [^0-9] - -=item * - -\S is a negated \s; it represents any non-whitespace character [^\s] - -=item * - -\W is a negated \w; it represents any non-word character [^\w] - -=item * - -The period '.' matches any character but "\n" - -=back - -The C<\d\s\w\D\S\W> abbreviations can be used both inside and outside -of character classes. Here are some in use: - - /\d\d:\d\d:\d\d/; # matches a hh:mm:ss time format - /[\d\s]/; # matches any digit or whitespace character - /\w\W\w/; # matches a word char, followed by a - # non-word char, followed by a word char - /..rt/; # matches any two chars, followed by 'rt' - /end\./; # matches 'end.' - /end[.]/; # same thing, matches 'end.' - -The S > C<\b> matches a boundary between a word -character and a non-word character C<\w\W> or C<\W\w>: - - $x = "Housecat catenates house and cat"; - $x =~ /\bcat/; # matches cat in 'catenates' - $x =~ /cat\b/; # matches cat in 'housecat' - $x =~ /\bcat\b/; # matches 'cat' at end of string - -In the last example, the end of the string is considered a word -boundary. - -=head2 Matching this or that - -We can match match different character strings with the B -metacharacter C<'|'>. To match C or C, we form the regex -C. As before, perl will try to match the regex at the -earliest possible point in the string. At each character position, -perl will first try to match the the first alternative, C. If -C doesn't match, perl will then try the next alternative, C. -If C doesn't match either, then the match fails and perl moves to -the next position in the string. Some examples: - - "cats and dogs" =~ /cat|dog|bird/; # matches "cat" - "cats and dogs" =~ /dog|cat|bird/; # matches "cat" - -Even though C is the first alternative in the second regex, -C is able to match earlier in the string. - - "cats" =~ /c|ca|cat|cats/; # matches "c" - "cats" =~ /cats|cat|ca|c/; # matches "cats" - -At a given character position, the first alternative that allows the -regex match to succeed wil be the one that matches. Here, all the -alternatives match at the first string position, so th first matches. - -=head2 Grouping things and hierarchical matching - -The B metacharacters C<()> allow a part of a regex to be -treated as a single unit. Parts of a regex are grouped by enclosing -them in parentheses. The regex C means match -C followed by either C or C. Some more examples -are - - /(a|b)b/; # matches 'ab' or 'bb' - /(^a|b)c/; # matches 'ac' at start of string or 'bc' anywhere - - /house(cat|)/; # matches either 'housecat' or 'house' - /house(cat(s|)|)/; # matches either 'housecats' or 'housecat' or - # 'house'. Note groups can be nested. - - "20" =~ /(19|20|)\d\d/; # matches the null alternative '()\d\d', - # because '20\d\d' can't match - -=head2 Extracting matches - -The grouping metacharacters C<()> also allow the extraction of the -parts of a string that matched. For each grouping, the part that -matched inside goes into the special variables C<$1>, C<$2>, etc. -They can be used just as ordinary variables: - - # extract hours, minutes, seconds - $time =~ /(\d\d):(\d\d):(\d\d)/; # match hh:mm:ss format - $hours = $1; - $minutes = $2; - $seconds = $3; - -In list context, a match C with groupings will return the -list of matched values C<($1,$2,...)>. So we could rewrite it as - - ($hours, $minutes, $second) = ($time =~ /(\d\d):(\d\d):(\d\d)/); - -If the groupings in a regex are nested, C<$1> gets the group with the -leftmost opening parenthesis, C<$2> the next opening parenthesis, -etc. For example, here is a complex regex and the matching variables -indicated below it: - - /(ab(cd|ef)((gi)|j))/; - 1 2 34 - -Associated with the matching variables C<$1>, C<$2>, ... are -the B C<\1>, C<\2>, ... Backreferences are -matching variables that can be used I a regex: - - /(\w\w\w)\s\1/; # find sequences like 'the the' in string - -C<$1>, C<$2>, ... should only be used outside of a regex, and C<\1>, -C<\2>, ... only inside a regex. - -=head2 Matching repetitions - -The B metacharacters C, C<*>, C<+>, and C<{}> allow us -to determine the number of repeats of a portion of a regex we -consider to be a match. Quantifiers are put immediately after the -character, character class, or grouping that we want to specify. They -have the following meanings: - -=over 4 - -=item * - -C = match 'a' 1 or 0 times - -=item * - -C = match 'a' 0 or more times, i.e., any number of times - -=item * - -C = match 'a' 1 or more times, i.e., at least once - -=item * - -C = match at least C times, but not more than C -times. - -=item * - -C = match at least C or more times - -=item * - -C = match exactly C times - -=back - -Here are some examples: - - /[a-z]+\s+\d*/; # match a lowercase word, at least some space, and - # any number of digits - /(\w+)\s+\1/; # match doubled words of arbitrary length - $year =~ /\d{2,4}/; # make sure year is at least 2 but not more - # than 4 digits - $year =~ /\d{4}|\d{2}/; # better match; throw out 3 digit dates - -These quantifiers will try to match as much of the string as possible, -while still allowing the regex to match. So we have - - $x = 'the cat in the hat'; - $x =~ /^(.*)(at)(.*)$/; # matches, - # $1 = 'the cat in the h' - # $2 = 'at' - # $3 = '' (0 matches) - -The first quantifier C<.*> grabs as much of the string as possible -while still having the regex match. The second quantifier C<.*> has -no string left to it, so it matches 0 times. - -=head2 More matching - -There are a few more things you might want to know about matching -operators. In the code - - $pattern = 'Seuss'; - while (<>) { - print if /$pattern/; - } - -perl has to re-evaluate C<$pattern> each time through the loop. If -C<$pattern> won't be changing, use the C modifier, to only -perform variable substitutions once. If you don't want any -substitutions at all, use the special delimiter C: - - $pattern = 'Seuss'; - m'$pattern'; # matches '$pattern', not 'Seuss' - -The global modifier C allows the matching operator to match -within a string as many times as possible. In scalar context, -successive matches against a string will have C jump from match -to match, keeping track of position in the string as it goes along. -You can get or set the position with the C function. -For example, - - $x = "cat dog house"; # 3 words - while ($x =~ /(\w+)/g) { - print "Word is $1, ends at position ", pos $x, "\n"; - } - -prints - - Word is cat, ends at position 3 - Word is dog, ends at position 7 - Word is house, ends at position 13 - -A failed match or changing the target string resets the position. If -you don't want the position reset after failure to match, add the -C, as in C. - -In list context, C returns a list of matched groupings, or if -there are no groupings, a list of matches to the whole regex. So - - @words = ($x =~ /(\w+)/g); # matches, - # $word[0] = 'cat' - # $word[1] = 'dog' - # $word[2] = 'house' - -=head2 Search and replace - -Search and replace is performed using C. -The C is a Perl double quoted string that replaces in the -string whatever is matched with the C. The operator C<=~> is -also used here to associate a string with C. If matching -against C<$_>, the S > can be dropped. If there is a match, -C returns the number of substitutions made, otherwise it returns -false. Here are a few examples: - - $x = "Time to feed the cat!"; - $x =~ s/cat/hacker/; # $x contains "Time to feed the hacker!" - $y = "'quoted words'"; - $y =~ s/^'(.*)'$/$1/; # strip single quotes, - # $y contains "quoted words" - -With the C operator, the matched variables C<$1>, C<$2>, etc. -are immediately available for use in the replacement expression. With -the global modifier, C will search and replace all occurrences -of the regex in the string: - - $x = "I batted 4 for 4"; - $x =~ s/4/four/; # $x contains "I batted four for 4" - $x = "I batted 4 for 4"; - $x =~ s/4/four/g; # $x contains "I batted four for four" - -The evaluation modifier C wraps an C around the -replacement string and the evaluated result is substituted for the -matched substring. Some examples: - - # reverse all the words in a string - $x = "the cat in the hat"; - $x =~ s/(\w+)/reverse $1/ge; # $x contains "eht tac ni eht tah" - - # convert percentage to decimal - $x = "A 39% hit rate"; - $x =~ s!(\d+)%!$1/100!e; # $x contains "A 0.39 hit rate" - -The last example shows that C can use other delimiters, such as -C and C, and even C. If single quotes are used -C, then the regex and replacement are treated as single quoted -strings. - -=head2 The split operator - -C splits C into a list of substrings -and returns that list. The regex determines the character sequence -that C is split with respect to. For example, to split a -string into words, use - - $x = "Calvin and Hobbes"; - @word = split /\s+/, $x; # $word[0] = 'Calvin' - # $word[1] = 'and' - # $word[2] = 'Hobbes' - -To extract a comma-delimited list of numbers, use - - $x = "1.618,2.718, 3.142"; - @const = split /,\s*/, $x; # $const[0] = '1.618' - # $const[1] = '2.718' - # $const[2] = '3.142' - -If the empty regex C is used, the string is split into individual -characters. If the regex has groupings, then list produced contains -the matched substrings from the groupings as well: - - $x = "/usr/bin"; - @parts = split m!(/)!, $x; # $parts[0] = '' - # $parts[1] = '/' - # $parts[2] = 'usr' - # $parts[3] = '/' - # $parts[4] = 'bin' - -Since the first character of $x matched the regex, C prepended -an empty initial element to the list. - -=head1 BUGS - -None. - -=head1 SEE ALSO - -This is just a quick start guide. For a more in-depth tutorial on -regexes, see L and for the reference page, see L. - -=head1 AUTHOR AND COPYRIGHT - -Copyright (c) 2000 Mark Kvale -All rights reserved. - -This document may be distributed under the same terms as Perl itself. - -=head2 Acknowledgments - -The author would like to thank Mark-Jason Dominus, Tom Christiansen, -Ilya Zakharevich, Brad Hughes, and Mike Giroux for all their helpful -comments. - -=cut - diff --git a/lib/perl5/5.6.1/pods/perlretut.pod b/lib/perl5/5.6.1/pods/perlretut.pod deleted file mode 100644 index fa6479c0..00000000 --- a/lib/perl5/5.6.1/pods/perlretut.pod +++ /dev/null @@ -1,2504 +0,0 @@ -=head1 NAME - -perlretut - Perl regular expressions tutorial - -=head1 DESCRIPTION - -This page provides a basic tutorial on understanding, creating and -using regular expressions in Perl. It serves as a complement to the -reference page on regular expressions L. Regular expressions -are an integral part of the C, C, C and C -operators and so this tutorial also overlaps with -L and L. - -Perl is widely renowned for excellence in text processing, and regular -expressions are one of the big factors behind this fame. Perl regular -expressions display an efficiency and flexibility unknown in most -other computer languages. Mastering even the basics of regular -expressions will allow you to manipulate text with surprising ease. - -What is a regular expression? A regular expression is simply a string -that describes a pattern. Patterns are in common use these days; -examples are the patterns typed into a search engine to find web pages -and the patterns used to list files in a directory, e.g., C -or C. In Perl, the patterns described by regular expressions -are used to search strings, extract desired parts of strings, and to -do search and replace operations. - -Regular expressions have the undeserved reputation of being abstract -and difficult to understand. Regular expressions are constructed using -simple concepts like conditionals and loops and are no more difficult -to understand than the corresponding C conditionals and C -loops in the Perl language itself. In fact, the main challenge in -learning regular expressions is just getting used to the terse -notation used to express these concepts. - -This tutorial flattens the learning curve by discussing regular -expression concepts, along with their notation, one at a time and with -many examples. The first part of the tutorial will progress from the -simplest word searches to the basic regular expression concepts. If -you master the first part, you will have all the tools needed to solve -about 98% of your needs. The second part of the tutorial is for those -comfortable with the basics and hungry for more power tools. It -discusses the more advanced regular expression operators and -introduces the latest cutting edge innovations in 5.6.0. - -A note: to save time, 'regular expression' is often abbreviated as -regexp or regex. Regexp is a more natural abbreviation than regex, but -is harder to pronounce. The Perl pod documentation is evenly split on -regexp vs regex; in Perl, there is more than one way to abbreviate it. -We'll use regexp in this tutorial. - -=head1 Part 1: The basics - -=head2 Simple word matching - -The simplest regexp is simply a word, or more generally, a string of -characters. A regexp consisting of a word matches any string that -contains that word: - - "Hello World" =~ /World/; # matches - -What is this perl statement all about? C<"Hello World"> is a simple -double quoted string. C is the regular expression and the -C enclosing C tells perl to search a string for a match. -The operator C<=~> associates the string with the regexp match and -produces a true value if the regexp matched, or false if the regexp -did not match. In our case, C matches the second word in -C<"Hello World">, so the expression is true. Expressions like this -are useful in conditionals: - - if ("Hello World" =~ /World/) { - print "It matches\n"; - } - else { - print "It doesn't match\n"; - } - -There are useful variations on this theme. The sense of the match can -be reversed by using C operator: - - if ("Hello World" !~ /World/) { - print "It doesn't match\n"; - } - else { - print "It matches\n"; - } - -The literal string in the regexp can be replaced by a variable: - - $greeting = "World"; - if ("Hello World" =~ /$greeting/) { - print "It matches\n"; - } - else { - print "It doesn't match\n"; - } - -If you're matching against the special default variable C<$_>, the -C<$_ =~> part can be omitted: - - $_ = "Hello World"; - if (/World/) { - print "It matches\n"; - } - else { - print "It doesn't match\n"; - } - -And finally, the C default delimiters for a match can be changed -to arbitrary delimiters by putting an C<'m'> out front: - - "Hello World" =~ m!World!; # matches, delimited by '!' - "Hello World" =~ m{World}; # matches, note the matching '{}' - "/usr/bin/perl" =~ m"/perl"; # matches after '/usr/bin', - # '/' becomes an ordinary char - -C, C, and C all represent the -same thing. When, e.g., C<""> is used as a delimiter, the forward -slash C<'/'> becomes an ordinary character and can be used in a regexp -without trouble. - -Let's consider how different regexps would match C<"Hello World">: - - "Hello World" =~ /world/; # doesn't match - "Hello World" =~ /o W/; # matches - "Hello World" =~ /oW/; # doesn't match - "Hello World" =~ /World /; # doesn't match - -The first regexp C doesn't match because regexps are -case-sensitive. The second regexp matches because the substring -S > occurs in the string S >. The space -character ' ' is treated like any other character in a regexp and is -needed to match in this case. The lack of a space character is the -reason the third regexp C<'oW'> doesn't match. The fourth regexp -C<'World '> doesn't match because there is a space at the end of the -regexp, but not at the end of the string. The lesson here is that -regexps must match a part of the string I in order for the -statement to be true. - -If a regexp matches in more than one place in the string, perl will -always match at the earliest possible point in the string: - - "Hello World" =~ /o/; # matches 'o' in 'Hello' - "That hat is red" =~ /hat/; # matches 'hat' in 'That' - -With respect to character matching, there are a few more points you -need to know about. First of all, not all characters can be used 'as -is' in a match. Some characters, called B, are reserved -for use in regexp notation. The metacharacters are - - {}[]()^$.|*+?\ - -The significance of each of these will be explained -in the rest of the tutorial, but for now, it is important only to know -that a metacharacter can be matched by putting a backslash before it: - - "2+2=4" =~ /2+2/; # doesn't match, + is a metacharacter - "2+2=4" =~ /2\+2/; # matches, \+ is treated like an ordinary + - "The interval is [0,1)." =~ /[0,1)./ # is a syntax error! - "The interval is [0,1)." =~ /\[0,1\)\./ # matches - "/usr/bin/perl" =~ /\/usr\/local\/bin\/perl/; # matches - -In the last regexp, the forward slash C<'/'> is also backslashed, -because it is used to delimit the regexp. This can lead to LTS -(leaning toothpick syndrome), however, and it is often more readable -to change delimiters. - - -The backslash character C<'\'> is a metacharacter itself and needs to -be backslashed: - - 'C:\WIN32' =~ /C:\\WIN/; # matches - -In addition to the metacharacters, there are some ASCII characters -which don't have printable character equivalents and are instead -represented by B. Common examples are C<\t> for a -tab, C<\n> for a newline, C<\r> for a carriage return and C<\a> for a -bell. If your string is better thought of as a sequence of arbitrary -bytes, the octal escape sequence, e.g., C<\033>, or hexadecimal escape -sequence, e.g., C<\x1B> may be a more natural representation for your -bytes. Here are some examples of escapes: - - "1000\t2000" =~ m(0\t2) # matches - "1000\n2000" =~ /0\n20/ # matches - "1000\t2000" =~ /\000\t2/ # doesn't match, "0" ne "\000" - "cat" =~ /\143\x61\x74/ # matches, but a weird way to spell cat - -If you've been around Perl a while, all this talk of escape sequences -may seem familiar. Similar escape sequences are used in double-quoted -strings and in fact the regexps in Perl are mostly treated as -double-quoted strings. This means that variables can be used in -regexps as well. Just like double-quoted strings, the values of the -variables in the regexp will be substituted in before the regexp is -evaluated for matching purposes. So we have: - - $foo = 'house'; - 'housecat' =~ /$foo/; # matches - 'cathouse' =~ /cat$foo/; # matches - 'housecat' =~ /${foo}cat/; # matches - -So far, so good. With the knowledge above you can already perform -searches with just about any literal string regexp you can dream up. -Here is a I emulation of the Unix grep program: - - % cat > simple_grep - #!/usr/bin/perl - $regexp = shift; - while (<>) { - print if /$regexp/; - } - ^D - - % chmod +x simple_grep - - % simple_grep abba /usr/dict/words - Babbage - cabbage - cabbages - sabbath - Sabbathize - Sabbathizes - sabbatical - scabbard - scabbards - -This program is easy to understand. C<#!/usr/bin/perl> is the standard -way to invoke a perl program from the shell. -S > saves the first command line argument as the -regexp to be used, leaving the rest of the command line arguments to -be treated as files. S) >> > loops over all the lines in -all the files. For each line, S > prints the -line if the regexp matches the line. In this line, both C and -C use the default variable C<$_> implicitly. - -With all of the regexps above, if the regexp matched anywhere in the -string, it was considered a match. Sometimes, however, we'd like to -specify I in the string the regexp should try to match. To do -this, we would use the B metacharacters C<^> and C<$>. The -anchor C<^> means match at the beginning of the string and the anchor -C<$> means match at the end of the string, or before a newline at the -end of the string. Here is how they are used: - - "housekeeper" =~ /keeper/; # matches - "housekeeper" =~ /^keeper/; # doesn't match - "housekeeper" =~ /keeper$/; # matches - "housekeeper\n" =~ /keeper$/; # matches - -The second regexp doesn't match because C<^> constrains C to -match only at the beginning of the string, but C<"housekeeper"> has -keeper starting in the middle. The third regexp does match, since the -C<$> constrains C to match only at the end of the string. - -When both C<^> and C<$> are used at the same time, the regexp has to -match both the beginning and the end of the string, i.e., the regexp -matches the whole string. Consider - - "keeper" =~ /^keep$/; # doesn't match - "keeper" =~ /^keeper$/; # matches - "" =~ /^$/; # ^$ matches an empty string - -The first regexp doesn't match because the string has more to it than -C. Since the second regexp is exactly the string, it -matches. Using both C<^> and C<$> in a regexp forces the complete -string to match, so it gives you complete control over which strings -match and which don't. Suppose you are looking for a fellow named -bert, off in a string by himself: - - "dogbert" =~ /bert/; # matches, but not what you want - - "dilbert" =~ /^bert/; # doesn't match, but .. - "bertram" =~ /^bert/; # matches, so still not good enough - - "bertram" =~ /^bert$/; # doesn't match, good - "dilbert" =~ /^bert$/; # doesn't match, good - "bert" =~ /^bert$/; # matches, perfect - -Of course, in the case of a literal string, one could just as easily -use the string equivalence S > and it would be -more efficient. The C<^...$> regexp really becomes useful when we -add in the more powerful regexp tools below. - -=head2 Using character classes - -Although one can already do quite a lot with the literal string -regexps above, we've only scratched the surface of regular expression -technology. In this and subsequent sections we will introduce regexp -concepts (and associated metacharacter notations) that will allow a -regexp to not just represent a single character sequence, but a I of them. - -One such concept is that of a B. A character class -allows a set of possible characters, rather than just a single -character, to match at a particular point in a regexp. Character -classes are denoted by brackets C<[...]>, with the set of characters -to be possibly matched inside. Here are some examples: - - /cat/; # matches 'cat' - /[bcr]at/; # matches 'bat, 'cat', or 'rat' - /item[0123456789]/; # matches 'item0' or ... or 'item9' - "abc" =~ /[cab]/; # matches 'a' - -In the last statement, even though C<'c'> is the first character in -the class, C<'a'> matches because the first character position in the -string is the earliest point at which the regexp can match. - - /[yY][eE][sS]/; # match 'yes' in a case-insensitive way - # 'yes', 'Yes', 'YES', etc. - -This regexp displays a common task: perform a a case-insensitive -match. Perl provides away of avoiding all those brackets by simply -appending an C<'i'> to the end of the match. Then C -can be rewritten as C. The C<'i'> stands for -case-insensitive and is an example of a B of the matching -operation. We will meet other modifiers later in the tutorial. - -We saw in the section above that there were ordinary characters, which -represented themselves, and special characters, which needed a -backslash C<\> to represent themselves. The same is true in a -character class, but the sets of ordinary and special characters -inside a character class are different than those outside a character -class. The special characters for a character class are C<-]\^$>. C<]> -is special because it denotes the end of a character class. C<$> is -special because it denotes a scalar variable. C<\> is special because -it is used in escape sequences, just like above. Here is how the -special characters C<]$\> are handled: - - /[\]c]def/; # matches ']def' or 'cdef' - $x = 'bcr'; - /[$x]at/; # matches 'bat', 'cat', or 'rat' - /[\$x]at/; # matches '$at' or 'xat' - /[\\$x]at/; # matches '\at', 'bat, 'cat', or 'rat' - -The last two are a little tricky. in C<[\$x]>, the backslash protects -the dollar sign, so the character class has two members C<$> and C. -In C<[\\$x]>, the backslash is protected, so C<$x> is treated as a -variable and substituted in double quote fashion. - -The special character C<'-'> acts as a range operator within character -classes, so that a contiguous set of characters can be written as a -range. With ranges, the unwieldy C<[0123456789]> and C<[abc...xyz]> -become the svelte C<[0-9]> and C<[a-z]>. Some examples are - - /item[0-9]/; # matches 'item0' or ... or 'item9' - /[0-9bx-z]aa/; # matches '0aa', ..., '9aa', - # 'baa', 'xaa', 'yaa', or 'zaa' - /[0-9a-fA-F]/; # matches a hexadecimal digit - /[0-9a-zA-Z_]/; # matches a "word" character, - # like those in a perl variable name - -If C<'-'> is the first or last character in a character class, it is -treated as an ordinary character; C<[-ab]>, C<[ab-]> and C<[a\-b]> are -all equivalent. - -The special character C<^> in the first position of a character class -denotes a B, which matches any character but -those in the brackets. Both C<[...]> and C<[^...]> must match a -character, or the match fails. Then - - /[^a]at/; # doesn't match 'aat' or 'at', but matches - # all other 'bat', 'cat, '0at', '%at', etc. - /[^0-9]/; # matches a non-numeric character - /[a^]at/; # matches 'aat' or '^at'; here '^' is ordinary - -Now, even C<[0-9]> can be a bother the write multiple times, so in the -interest of saving keystrokes and making regexps more readable, Perl -has several abbreviations for common character classes: - -=over 4 - -=item * - -\d is a digit and represents [0-9] - -=item * - -\s is a whitespace character and represents [\ \t\r\n\f] - -=item * - -\w is a word character (alphanumeric or _) and represents [0-9a-zA-Z_] - -=item * - -\D is a negated \d; it represents any character but a digit [^0-9] - -=item * - -\S is a negated \s; it represents any non-whitespace character [^\s] - -=item * - -\W is a negated \w; it represents any non-word character [^\w] - -=item * - -The period '.' matches any character but "\n" - -=back - -The C<\d\s\w\D\S\W> abbreviations can be used both inside and outside -of character classes. Here are some in use: - - /\d\d:\d\d:\d\d/; # matches a hh:mm:ss time format - /[\d\s]/; # matches any digit or whitespace character - /\w\W\w/; # matches a word char, followed by a - # non-word char, followed by a word char - /..rt/; # matches any two chars, followed by 'rt' - /end\./; # matches 'end.' - /end[.]/; # same thing, matches 'end.' - -Because a period is a metacharacter, it needs to be escaped to match -as an ordinary period. Because, for example, C<\d> and C<\w> are sets -of characters, it is incorrect to think of C<[^\d\w]> as C<[\D\W]>; in -fact C<[^\d\w]> is the same as C<[^\w]>, which is the same as -C<[\W]>. Think DeMorgan's laws. - -An anchor useful in basic regexps is the S > -C<\b>. This matches a boundary between a word character and a non-word -character C<\w\W> or C<\W\w>: - - $x = "Housecat catenates house and cat"; - $x =~ /cat/; # matches cat in 'housecat' - $x =~ /\bcat/; # matches cat in 'catenates' - $x =~ /cat\b/; # matches cat in 'housecat' - $x =~ /\bcat\b/; # matches 'cat' at end of string - -Note in the last example, the end of the string is considered a word -boundary. - -You might wonder why C<'.'> matches everything but C<"\n"> - why not -every character? The reason is that often one is matching against -lines and would like to ignore the newline characters. For instance, -while the string C<"\n"> represents one line, we would like to think -of as empty. Then - - "" =~ /^$/; # matches - "\n" =~ /^$/; # matches, "\n" is ignored - - "" =~ /./; # doesn't match; it needs a char - "" =~ /^.$/; # doesn't match; it needs a char - "\n" =~ /^.$/; # doesn't match; it needs a char other than "\n" - "a" =~ /^.$/; # matches - "a\n" =~ /^.$/; # matches, ignores the "\n" - -This behavior is convenient, because we usually want to ignore -newlines when we count and match characters in a line. Sometimes, -however, we want to keep track of newlines. We might even want C<^> -and C<$> to anchor at the beginning and end of lines within the -string, rather than just the beginning and end of the string. Perl -allows us to choose between ignoring and paying attention to newlines -by using the C and C modifiers. C and C stand for -single line and multi-line and they determine whether a string is to -be treated as one continuous string, or as a set of lines. The two -modifiers affect two aspects of how the regexp is interpreted: 1) how -the C<'.'> character class is defined, and 2) where the anchors C<^> -and C<$> are able to match. Here are the four possible combinations: - -=over 4 - -=item * - -no modifiers (//): Default behavior. C<'.'> matches any character -except C<"\n">. C<^> matches only at the beginning of the string and -C<$> matches only at the end or before a newline at the end. - -=item * - -s modifier (//s): Treat string as a single long line. C<'.'> matches -any character, even C<"\n">. C<^> matches only at the beginning of -the string and C<$> matches only at the end or before a newline at the -end. - -=item * - -m modifier (//m): Treat string as a set of multiple lines. C<'.'> -matches any character except C<"\n">. C<^> and C<$> are able to match -at the start or end of I line within the string. - -=item * - -both s and m modifiers (//sm): Treat string as a single long line, but -detect multiple lines. C<'.'> matches any character, even -C<"\n">. C<^> and C<$>, however, are able to match at the start or end -of I line within the string. - -=back - -Here are examples of C and C in action: - - $x = "There once was a girl\nWho programmed in Perl\n"; - - $x =~ /^Who/; # doesn't match, "Who" not at start of string - $x =~ /^Who/s; # doesn't match, "Who" not at start of string - $x =~ /^Who/m; # matches, "Who" at start of second line - $x =~ /^Who/sm; # matches, "Who" at start of second line - - $x =~ /girl.Who/; # doesn't match, "." doesn't match "\n" - $x =~ /girl.Who/s; # matches, "." matches "\n" - $x =~ /girl.Who/m; # doesn't match, "." doesn't match "\n" - $x =~ /girl.Who/sm; # matches, "." matches "\n" - -Most of the time, the default behavior is what is want, but C and -C are occasionally very useful. If C is being used, the start -of the string can still be matched with C<\A> and the end of string -can still be matched with the anchors C<\Z> (matches both the end and -the newline before, like C<$>), and C<\z> (matches only the end): - - $x =~ /^Who/m; # matches, "Who" at start of second line - $x =~ /\AWho/m; # doesn't match, "Who" is not at start of string - - $x =~ /girl$/m; # matches, "girl" at end of first line - $x =~ /girl\Z/m; # doesn't match, "girl" is not at end of string - - $x =~ /Perl\Z/m; # matches, "Perl" is at newline before end - $x =~ /Perl\z/m; # doesn't match, "Perl" is not at end of string - -We now know how to create choices among classes of characters in a -regexp. What about choices among words or character strings? Such -choices are described in the next section. - -=head2 Matching this or that - -Sometimes we would like to our regexp to be able to match different -possible words or character strings. This is accomplished by using -the B metacharacter C<|>. To match C or C, we -form the regexp C. As before, perl will try to match the -regexp at the earliest possible point in the string. At each -character position, perl will first try to match the first -alternative, C. If C doesn't match, perl will then try the -next alternative, C. If C doesn't match either, then the -match fails and perl moves to the next position in the string. Some -examples: - - "cats and dogs" =~ /cat|dog|bird/; # matches "cat" - "cats and dogs" =~ /dog|cat|bird/; # matches "cat" - -Even though C is the first alternative in the second regexp, -C is able to match earlier in the string. - - "cats" =~ /c|ca|cat|cats/; # matches "c" - "cats" =~ /cats|cat|ca|c/; # matches "cats" - -Here, all the alternatives match at the first string position, so the -first alternative is the one that matches. If some of the -alternatives are truncations of the others, put the longest ones first -to give them a chance to match. - - "cab" =~ /a|b|c/ # matches "c" - # /a|b|c/ == /[abc]/ - -The last example points out that character classes are like -alternations of characters. At a given character position, the first -alternative that allows the regexp match to succeed wil be the one -that matches. - -=head2 Grouping things and hierarchical matching - -Alternation allows a regexp to choose among alternatives, but by -itself it unsatisfying. The reason is that each alternative is a whole -regexp, but sometime we want alternatives for just part of a -regexp. For instance, suppose we want to search for housecats or -housekeepers. The regexp C fits the bill, but is -inefficient because we had to type C twice. It would be nice to -have parts of the regexp be constant, like C, and and some -parts have alternatives, like C. - -The B metacharacters C<()> solve this problem. Grouping -allows parts of a regexp to be treated as a single unit. Parts of a -regexp are grouped by enclosing them in parentheses. Thus we could solve -the C by forming the regexp as -C. The regexp C means match -C followed by either C or C. Some more examples -are - - /(a|b)b/; # matches 'ab' or 'bb' - /(ac|b)b/; # matches 'acb' or 'bb' - /(^a|b)c/; # matches 'ac' at start of string or 'bc' anywhere - /(a|[bc])d/; # matches 'ad', 'bd', or 'cd' - - /house(cat|)/; # matches either 'housecat' or 'house' - /house(cat(s|)|)/; # matches either 'housecats' or 'housecat' or - # 'house'. Note groups can be nested. - - /(19|20|)\d\d/; # match years 19xx, 20xx, or the Y2K problem, xx - "20" =~ /(19|20|)\d\d/; # matches the null alternative '()\d\d', - # because '20\d\d' can't match - -Alternations behave the same way in groups as out of them: at a given -string position, the leftmost alternative that allows the regexp to -match is taken. So in the last example at tth first string position, -C<"20"> matches the second alternative, but there is nothing left over -to match the next two digits C<\d\d>. So perl moves on to the next -alternative, which is the null alternative and that works, since -C<"20"> is two digits. - -The process of trying one alternative, seeing if it matches, and -moving on to the next alternative if it doesn't, is called -B. The term 'backtracking' comes from the idea that -matching a regexp is like a walk in the woods. Successfully matching -a regexp is like arriving at a destination. There are many possible -trailheads, one for each string position, and each one is tried in -order, left to right. From each trailhead there may be many paths, -some of which get you there, and some which are dead ends. When you -walk along a trail and hit a dead end, you have to backtrack along the -trail to an earlier point to try another trail. If you hit your -destination, you stop immediately and forget about trying all the -other trails. You are persistent, and only if you have tried all the -trails from all the trailheads and not arrived at your destination, do -you declare failure. To be concrete, here is a step-by-step analysis -of what perl does when it tries to match the regexp - - "abcde" =~ /(abd|abc)(df|d|de)/; - -=over 4 - -=item 0 - -Start with the first letter in the string 'a'. - -=item 1 - -Try the first alternative in the first group 'abd'. - -=item 2 - -Match 'a' followed by 'b'. So far so good. - -=item 3 - -'d' in the regexp doesn't match 'c' in the string - a dead -end. So backtrack two characters and pick the second alternative in -the first group 'abc'. - -=item 4 - -Match 'a' followed by 'b' followed by 'c'. We are on a roll -and have satisfied the first group. Set $1 to 'abc'. - -=item 5 - -Move on to the second group and pick the first alternative -'df'. - -=item 6 - -Match the 'd'. - -=item 7 - -'f' in the regexp doesn't match 'e' in the string, so a dead -end. Backtrack one character and pick the second alternative in the -second group 'd'. - -=item 8 - -'d' matches. The second grouping is satisfied, so set $2 to -'d'. - -=item 9 - -We are at the end of the regexp, so we are done! We have -matched 'abcd' out of the string "abcde". - -=back - -There are a couple of things to note about this analysis. First, the -third alternative in the second group 'de' also allows a match, but we -stopped before we got to it - at a given character position, leftmost -wins. Second, we were able to get a match at the first character -position of the string 'a'. If there were no matches at the first -position, perl would move to the second character position 'b' and -attempt the match all over again. Only when all possible paths at all -possible character positions have been exhausted does perl give give -up and declare S > to be false. - -Even with all this work, regexp matching happens remarkably fast. To -speed things up, during compilation stage, perl compiles the regexp -into a compact sequence of opcodes that can often fit inside a -processor cache. When the code is executed, these opcodes can then run -at full throttle and search very quickly. - -=head2 Extracting matches - -The grouping metacharacters C<()> also serve another completely -different function: they allow the extraction of the parts of a string -that matched. This is very useful to find out what matched and for -text processing in general. For each grouping, the part that matched -inside goes into the special variables C<$1>, C<$2>, etc. They can be -used just as ordinary variables: - - # extract hours, minutes, seconds - $time =~ /(\d\d):(\d\d):(\d\d)/; # match hh:mm:ss format - $hours = $1; - $minutes = $2; - $seconds = $3; - -Now, we know that in scalar context, -S > returns a true or false -value. In list context, however, it returns the list of matched values -C<($1,$2,$3)>. So we could write the code more compactly as - - # extract hours, minutes, seconds - ($hours, $minutes, $second) = ($time =~ /(\d\d):(\d\d):(\d\d)/); - -If the groupings in a regexp are nested, C<$1> gets the group with the -leftmost opening parenthesis, C<$2> the next opening parenthesis, -etc. For example, here is a complex regexp and the matching variables -indicated below it: - - /(ab(cd|ef)((gi)|j))/; - 1 2 34 - -so that if the regexp matched, e.g., C<$2> would contain 'cd' or 'ef'. -For convenience, perl sets C<$+> to the highest numbered C<$1>, C<$2>, -... that got assigned. - -Closely associated with the matching variables C<$1>, C<$2>, ... are -the B C<\1>, C<\2>, ... . Backreferences are simply -matching variables that can be used I a regexp. This is a -really nice feature - what matches later in a regexp can depend on -what matched earlier in the regexp. Suppose we wanted to look -for doubled words in text, like 'the the'. The following regexp finds -all 3-letter doubles with a space in between: - - /(\w\w\w)\s\1/; - -The grouping assigns a value to \1, so that the same 3 letter sequence -is used for both parts. Here are some words with repeated parts: - - % simple_grep '^(\w\w\w\w|\w\w\w|\w\w|\w)\1$' /usr/dict/words - beriberi - booboo - coco - mama - murmur - papa - -The regexp has a single grouping which considers 4-letter -combinations, then 3-letter combinations, etc. and uses C<\1> to look for -a repeat. Although C<$1> and C<\1> represent the same thing, care should be -taken to use matched variables C<$1>, C<$2>, ... only outside a regexp -and backreferences C<\1>, C<\2>, ... only inside a regexp; not doing -so may lead to surprising and/or undefined results. - -In addition to what was matched, Perl 5.6.0 also provides the -positions of what was matched with the C<@-> and C<@+> -arrays. C<$-[0]> is the position of the start of the entire match and -C<$+[0]> is the position of the end. Similarly, C<$-[n]> is the -position of the start of the C<$n> match and C<$+[n]> is the position -of the end. If C<$n> is undefined, so are C<$-[n]> and C<$+[n]>. Then -this code - - $x = "Mmm...donut, thought Homer"; - $x =~ /^(Mmm|Yech)\.\.\.(donut|peas)/; # matches - foreach $expr (1..$#-) { - print "Match $expr: '${$expr}' at position ($-[$expr],$+[$expr])\n"; - } - -prints - - Match 1: 'Mmm' at position (0,3) - Match 2: 'donut' at position (6,11) - -Even if there are no groupings in a regexp, it is still possible to -find out what exactly matched in a string. If you use them, perl -will set C<$`> to the part of the string before the match, will set C<$&> -to the part of the string that matched, and will set C<$'> to the part -of the string after the match. An example: - - $x = "the cat caught the mouse"; - $x =~ /cat/; # $` = 'the ', $& = 'cat', $' = ' caught the mouse' - $x =~ /the/; # $` = '', $& = 'the', $' = ' cat caught the mouse' - -In the second match, S > because the regexp matched at the -first character position in the string and stopped, it never saw the -second 'the'. It is important to note that using C<$`> and C<$'> -slows down regexp matching quite a bit, and C< $& > slows it down to a -lesser extent, because if they are used in one regexp in a program, -they are generated for regexps in the program. So if raw -performance is a goal of your application, they should be avoided. -If you need them, use C<@-> and C<@+> instead: - - $` is the same as substr( $x, 0, $-[0] ) - $& is the same as substr( $x, $-[0], $+[0]-$-[0] ) - $' is the same as substr( $x, $+[0] ) - -=head2 Matching repetitions - -The examples in the previous section display an annoying weakness. We -were only matching 3-letter words, or syllables of 4 letters or -less. We'd like to be able to match words or syllables of any length, -without writing out tedious alternatives like -C<\w\w\w\w|\w\w\w|\w\w|\w>. - -This is exactly the problem the B metacharacters C, -C<*>, C<+>, and C<{}> were created for. They allow us to determine the -number of repeats of a portion of a regexp we consider to be a -match. Quantifiers are put immediately after the character, character -class, or grouping that we want to specify. They have the following -meanings: - -=over 4 - -=item * - -C = match 'a' 1 or 0 times - -=item * - -C = match 'a' 0 or more times, i.e., any number of times - -=item * - -C = match 'a' 1 or more times, i.e., at least once - -=item * - -C = match at least C times, but not more than C -times. - -=item * - -C = match at least C or more times - -=item * - -C = match exactly C times - -=back - -Here are some examples: - - /[a-z]+\s+\d*/; # match a lowercase word, at least some space, and - # any number of digits - /(\w+)\s+\1/; # match doubled words of arbitrary length - /y(es)?/i; # matches 'y', 'Y', or a case-insensitive 'yes' - $year =~ /\d{2,4}/; # make sure year is at least 2 but not more - # than 4 digits - $year =~ /\d{4}|\d{2}/; # better match; throw out 3 digit dates - $year =~ /\d{2}(\d{2})?/; # same thing written differently. However, - # this produces $1 and the other does not. - - % simple_grep '^(\w+)\1$' /usr/dict/words # isn't this easier? - beriberi - booboo - coco - mama - murmur - papa - -For all of these quantifiers, perl will try to match as much of the -string as possible, while still allowing the regexp to succeed. Thus -with C, perl will first try to match the regexp with the C -present; if that fails, perl will try to match the regexp without the -C present. For the quantifier C<*>, we get the following: - - $x = "the cat in the hat"; - $x =~ /^(.*)(cat)(.*)$/; # matches, - # $1 = 'the ' - # $2 = 'cat' - # $3 = ' in the hat' - -Which is what we might expect, the match finds the only C in the -string and locks onto it. Consider, however, this regexp: - - $x =~ /^(.*)(at)(.*)$/; # matches, - # $1 = 'the cat in the h' - # $2 = 'at' - # $3 = '' (0 matches) - -One might initially guess that perl would find the C in C and -stop there, but that wouldn't give the longest possible string to the -first quantifier C<.*>. Instead, the first quantifier C<.*> grabs as -much of the string as possible while still having the regexp match. In -this example, that means having the C sequence with the final C -in the string. The other important principle illustrated here is that -when there are two or more elements in a regexp, the I -quantifier, if there is one, gets to grab as much the string as -possible, leaving the rest of the regexp to fight over scraps. Thus in -our example, the first quantifier C<.*> grabs most of the string, while -the second quantifier C<.*> gets the empty string. Quantifiers that -grab as much of the string as possible are called B or -B quantifiers. - -When a regexp can match a string in several different ways, we can use -the principles above to predict which way the regexp will match: - -=over 4 - -=item * - -Principle 0: Taken as a whole, any regexp will be matched at the -earliest possible position in the string. - -=item * - -Principle 1: In an alternation C, the leftmost alternative -that allows a match for the whole regexp will be the one used. - -=item * - -Principle 2: The maximal matching quantifiers C, C<*>, C<+> and -C<{n,m}> will in general match as much of the string as possible while -still allowing the whole regexp to match. - -=item * - -Principle 3: If there are two or more elements in a regexp, the -leftmost greedy quantifier, if any, will match as much of the string -as possible while still allowing the whole regexp to match. The next -leftmost greedy quantifier, if any, will try to match as much of the -string remaining available to it as possible, while still allowing the -whole regexp to match. And so on, until all the regexp elements are -satisfied. - -=back - -As we have seen above, Principle 0 overrides the others - the regexp -will be matched as early as possible, with the other principles -determining how the regexp matches at that earliest character -position. - -Here is an example of these principles in action: - - $x = "The programming republic of Perl"; - $x =~ /^(.+)(e|r)(.*)$/; # matches, - # $1 = 'The programming republic of Pe' - # $2 = 'r' - # $3 = 'l' - -This regexp matches at the earliest string position, C<'T'>. One -might think that C, being leftmost in the alternation, would be -matched, but C produces the longest string in the first quantifier. - - $x =~ /(m{1,2})(.*)$/; # matches, - # $1 = 'mm' - # $2 = 'ing republic of Perl' - -Here, The earliest possible match is at the first C<'m'> in -C. C is the first quantifier, so it gets to match -a maximal C. - - $x =~ /.*(m{1,2})(.*)$/; # matches, - # $1 = 'm' - # $2 = 'ing republic of Perl' - -Here, the regexp matches at the start of the string. The first -quantifier C<.*> grabs as much as possible, leaving just a single -C<'m'> for the second quantifier C. - - $x =~ /(.?)(m{1,2})(.*)$/; # matches, - # $1 = 'a' - # $2 = 'mm' - # $3 = 'ing republic of Perl' - -Here, C<.?> eats its maximal one character at the earliest possible -position in the string, C<'a'> in C, leaving C -the opportunity to match both C's. Finally, - - "aXXXb" =~ /(X*)/; # matches with $1 = '' - -because it can match zero copies of C<'X'> at the beginning of the -string. If you definitely want to match at least one C<'X'>, use -C, not C. - -Sometimes greed is not good. At times, we would like quantifiers to -match a I piece of string, rather than a maximal piece. For -this purpose, Larry Wall created the S > or -B quantifiers C,C<*?>, C<+?>, and C<{}?>. These are -the usual quantifiers with a C appended to them. They have the -following meanings: - -=over 4 - -=item * - -C = match 'a' 0 or 1 times. Try 0 first, then 1. - -=item * - -C = match 'a' 0 or more times, i.e., any number of times, -but as few times as possible - -=item * - -C = match 'a' 1 or more times, i.e., at least once, but -as few times as possible - -=item * - -C = match at least C times, not more than C -times, as few times as possible - -=item * - -C = match at least C times, but as few times as -possible - -=item * - -C = match exactly C times. Because we match exactly -C times, C is equivalent to C and is just there for -notational consistency. - -=back - -Let's look at the example above, but with minimal quantifiers: - - $x = "The programming republic of Perl"; - $x =~ /^(.+?)(e|r)(.*)$/; # matches, - # $1 = 'Th' - # $2 = 'e' - # $3 = ' programming republic of Perl' - -The minimal string that will allow both the start of the string C<^> -and the alternation to match is C, with the alternation C -matching C. The second quantifier C<.*> is free to gobble up the -rest of the string. - - $x =~ /(m{1,2}?)(.*?)$/; # matches, - # $1 = 'm' - # $2 = 'ming republic of Perl' - -The first string position that this regexp can match is at the first -C<'m'> in C. At this position, the minimal C -matches just one C<'m'>. Although the second quantifier C<.*?> would -prefer to match no characters, it is constrained by the end-of-string -anchor C<$> to match the rest of the string. - - $x =~ /(.*?)(m{1,2}?)(.*)$/; # matches, - # $1 = 'The progra' - # $2 = 'm' - # $3 = 'ming republic of Perl' - -In this regexp, you might expect the first minimal quantifier C<.*?> -to match the empty string, because it is not constrained by a C<^> -anchor to match the beginning of the word. Principle 0 applies here, -however. Because it is possible for the whole regexp to match at the -start of the string, it I match at the start of the string. Thus -the first quantifier has to match everything up to the first C. The -second minimal quantifier matches just one C and the third -quantifier matches the rest of the string. - - $x =~ /(.??)(m{1,2})(.*)$/; # matches, - # $1 = 'a' - # $2 = 'mm' - # $3 = 'ing republic of Perl' - -Just as in the previous regexp, the first quantifier C<.??> can match -earliest at position C<'a'>, so it does. The second quantifier is -greedy, so it matches C, and the third matches the rest of the -string. - -We can modify principle 3 above to take into account non-greedy -quantifiers: - -=over 4 - -=item * - -Principle 3: If there are two or more elements in a regexp, the -leftmost greedy (non-greedy) quantifier, if any, will match as much -(little) of the string as possible while still allowing the whole -regexp to match. The next leftmost greedy (non-greedy) quantifier, if -any, will try to match as much (little) of the string remaining -available to it as possible, while still allowing the whole regexp to -match. And so on, until all the regexp elements are satisfied. - -=back - -Just like alternation, quantifiers are also susceptible to -backtracking. Here is a step-by-step analysis of the example - - $x = "the cat in the hat"; - $x =~ /^(.*)(at)(.*)$/; # matches, - # $1 = 'the cat in the h' - # $2 = 'at' - # $3 = '' (0 matches) - -=over 4 - -=item 0 - -Start with the first letter in the string 't'. - -=item 1 - -The first quantifier '.*' starts out by matching the whole -string 'the cat in the hat'. - -=item 2 - -'a' in the regexp element 'at' doesn't match the end of the -string. Backtrack one character. - -=item 3 - -'a' in the regexp element 'at' still doesn't match the last -letter of the string 't', so backtrack one more character. - -=item 4 - -Now we can match the 'a' and the 't'. - -=item 5 - -Move on to the third element '.*'. Since we are at the end of -the string and '.*' can match 0 times, assign it the empty string. - -=item 6 - -We are done! - -=back - -Most of the time, all this moving forward and backtracking happens -quickly and searching is fast. There are some pathological regexps, -however, whose execution time exponentially grows with the size of the -string. A typical structure that blows up in your face is of the form - - /(a|b+)*/; - -The problem is the nested indeterminate quantifiers. There are many -different ways of partitioning a string of length n between the C<+> -and C<*>: one repetition with C of length n, two repetitions with -the first C length k and the second with length n-k, m repetitions -whose bits add up to length n, etc. In fact there are an exponential -number of ways to partition a string as a function of length. A -regexp may get lucky and match early in the process, but if there is -no match, perl will try I possibility before giving up. So be -careful with nested C<*>'s, C<{n,m}>'s, and C<+>'s. The book -I by Jeffrey Friedl gives a wonderful -discussion of this and other efficiency issues. - -=head2 Building a regexp - -At this point, we have all the basic regexp concepts covered, so let's -give a more involved example of a regular expression. We will build a -regexp that matches numbers. - -The first task in building a regexp is to decide what we want to match -and what we want to exclude. In our case, we want to match both -integers and floating point numbers and we want to reject any string -that isn't a number. - -The next task is to break the problem down into smaller problems that -are easily converted into a regexp. - -The simplest case is integers. These consist of a sequence of digits, -with an optional sign in front. The digits we can represent with -C<\d+> and the sign can be matched with C<[+-]>. Thus the integer -regexp is - - /[+-]?\d+/; # matches integers - -A floating point number potentially has a sign, an integral part, a -decimal point, a fractional part, and an exponent. One or more of these -parts is optional, so we need to check out the different -possibilities. Floating point numbers which are in proper form include -123., 0.345, .34, -1e6, and 25.4E-72. As with integers, the sign out -front is completely optional and can be matched by C<[+-]?>. We can -see that if there is no exponent, floating point numbers must have a -decimal point, otherwise they are integers. We might be tempted to -model these with C<\d*\.\d*>, but this would also match just a single -decimal point, which is not a number. So the three cases of floating -point number sans exponent are - - /[+-]?\d+\./; # 1., 321., etc. - /[+-]?\.\d+/; # .1, .234, etc. - /[+-]?\d+\.\d+/; # 1.0, 30.56, etc. - -These can be combined into a single regexp with a three-way alternation: - - /[+-]?(\d+\.\d+|\d+\.|\.\d+)/; # floating point, no exponent - -In this alternation, it is important to put C<'\d+\.\d+'> before -C<'\d+\.'>. If C<'\d+\.'> were first, the regexp would happily match that -and ignore the fractional part of the number. - -Now consider floating point numbers with exponents. The key -observation here is that I integers and numbers with decimal -points are allowed in front of an exponent. Then exponents, like the -overall sign, are independent of whether we are matching numbers with -or without decimal points, and can be 'decoupled' from the -mantissa. The overall form of the regexp now becomes clear: - - /^(optional sign)(integer | f.p. mantissa)(optional exponent)$/; - -The exponent is an C or C, followed by an integer. So the -exponent regexp is - - /[eE][+-]?\d+/; # exponent - -Putting all the parts together, we get a regexp that matches numbers: - - /^[+-]?(\d+\.\d+|\d+\.|\.\d+|\d+)([eE][+-]?\d+)?$/; # Ta da! - -Long regexps like this may impress your friends, but can be hard to -decipher. In complex situations like this, the C modifier for a -match is invaluable. It allows one to put nearly arbitrary whitespace -and comments into a regexp without affecting their meaning. Using it, -we can rewrite our 'extended' regexp in the more pleasing form - - /^ - [+-]? # first, match an optional sign - ( # then match integers or f.p. mantissas: - \d+\.\d+ # mantissa of the form a.b - |\d+\. # mantissa of the form a. - |\.\d+ # mantissa of the form .b - |\d+ # integer of the form a - ) - ([eE][+-]?\d+)? # finally, optionally match an exponent - $/x; - -If whitespace is mostly irrelevant, how does one include space -characters in an extended regexp? The answer is to backslash it -S > or put it in a character class S >. The same thing -goes for pound signs, use C<\#> or C<[#]>. For instance, Perl allows -a space between the sign and the mantissa/integer, and we could add -this to our regexp as follows: - - /^ - [+-]?\ * # first, match an optional sign *and space* - ( # then match integers or f.p. mantissas: - \d+\.\d+ # mantissa of the form a.b - |\d+\. # mantissa of the form a. - |\.\d+ # mantissa of the form .b - |\d+ # integer of the form a - ) - ([eE][+-]?\d+)? # finally, optionally match an exponent - $/x; - -In this form, it is easier to see a way to simplify the -alternation. Alternatives 1, 2, and 4 all start with C<\d+>, so it -could be factored out: - - /^ - [+-]?\ * # first, match an optional sign - ( # then match integers or f.p. mantissas: - \d+ # start out with a ... - ( - \.\d* # mantissa of the form a.b or a. - )? # ? takes care of integers of the form a - |\.\d+ # mantissa of the form .b - ) - ([eE][+-]?\d+)? # finally, optionally match an exponent - $/x; - -or written in the compact form, - - /^[+-]?\ *(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?$/; - -This is our final regexp. To recap, we built a regexp by - -=over 4 - -=item * - -specifying the task in detail, - -=item * - -breaking down the problem into smaller parts, - -=item * - -translating the small parts into regexps, - -=item * - -combining the regexps, - -=item * - -and optimizing the final combined regexp. - -=back - -These are also the typical steps involved in writing a computer -program. This makes perfect sense, because regular expressions are -essentially programs written a little computer language that specifies -patterns. - -=head2 Using regular expressions in Perl - -The last topic of Part 1 briefly covers how regexps are used in Perl -programs. Where do they fit into Perl syntax? - -We have already introduced the matching operator in its default -C and arbitrary delimiter C forms. We have used -the binding operator C<=~> and its negation C to test for string -matches. Associated with the matching operator, we have discussed the -single line C, multi-line C, case-insensitive C and -extended C modifiers. - -There are a few more things you might want to know about matching -operators. First, we pointed out earlier that variables in regexps are -substituted before the regexp is evaluated: - - $pattern = 'Seuss'; - while (<>) { - print if /$pattern/; - } - -This will print any lines containing the word C. It is not as -efficient as it could be, however, because perl has to re-evaluate -C<$pattern> each time through the loop. If C<$pattern> won't be -changing over the lifetime of the script, we can add the C -modifier, which directs perl to only perform variable substitutions -once: - - #!/usr/bin/perl - # Improved simple_grep - $regexp = shift; - while (<>) { - print if /$regexp/o; # a good deal faster - } - -If you change C<$pattern> after the first substitution happens, perl -will ignore it. If you don't want any substitutions at all, use the -special delimiter C: - - $pattern = 'Seuss'; - while (<>) { - print if m'$pattern'; # matches '$pattern', not 'Seuss' - } - -C acts like single quotes on a regexp; all other C delimiters -act like double quotes. If the regexp evaluates to the empty string, -the regexp in the I is used instead. So we have - - "dog" =~ /d/; # 'd' matches - "dogbert =~ //; # this matches the 'd' regexp used before - -The final two modifiers C and C concern multiple matches. -The modifier C stands for global matching and allows the the -matching operator to match within a string as many times as possible. -In scalar context, successive invocations against a string will have -`C jump from match to match, keeping track of position in the -string as it goes along. You can get or set the position with the -C function. - -The use of C is shown in the following example. Suppose we have -a string that consists of words separated by spaces. If we know how -many words there are in advance, we could extract the words using -groupings: - - $x = "cat dog house"; # 3 words - $x =~ /^\s*(\w+)\s+(\w+)\s+(\w+)\s*$/; # matches, - # $1 = 'cat' - # $2 = 'dog' - # $3 = 'house' - -But what if we had an indeterminate number of words? This is the sort -of task C was made for. To extract all words, form the simple -regexp C<(\w+)> and loop over all matches with C: - - while ($x =~ /(\w+)/g) { - print "Word is $1, ends at position ", pos $x, "\n"; - } - -prints - - Word is cat, ends at position 3 - Word is dog, ends at position 7 - Word is house, ends at position 13 - -A failed match or changing the target string resets the position. If -you don't want the position reset after failure to match, add the -C, as in C. The current position in the string is -associated with the string, not the regexp. This means that different -strings have different positions and their respective positions can be -set or read independently. - -In list context, C returns a list of matched groupings, or if -there are no groupings, a list of matches to the whole regexp. So if -we wanted just the words, we could use - - @words = ($x =~ /(\w+)/g); # matches, - # $word[0] = 'cat' - # $word[1] = 'dog' - # $word[2] = 'house' - -Closely associated with the C modifier is the C<\G> anchor. The -C<\G> anchor matches at the point where the previous C match left -off. C<\G> allows us to easily do context-sensitive matching: - - $metric = 1; # use metric units - ... - $x = ; # read in measurement - $x =~ /^([+-]?\d+)\s*/g; # get magnitude - $weight = $1; - if ($metric) { # error checking - print "Units error!" unless $x =~ /\Gkg\./g; - } - else { - print "Units error!" unless $x =~ /\Glbs\./g; - } - $x =~ /\G\s+(widget|sprocket)/g; # continue processing - -The combination of C and C<\G> allows us to process the string a -bit at a time and use arbitrary Perl logic to decide what to do next. - -C<\G> is also invaluable in processing fixed length records with -regexps. Suppose we have a snippet of coding region DNA, encoded as -base pair letters C and we want to find all the stop -codons C. In a coding region, codons are 3-letter sequences, so -we can think of the DNA snippet as a sequence of 3-letter records. The -naive regexp - - # expanded, this is "ATC GTT GAA TGC AAA TGA CAT GAC" - $dna = "ATCGTTGAATGCAAATGACATGAC"; - $dna =~ /TGA/; - -doesn't work; it may match an C, but there is no guarantee that -the match is aligned with codon boundaries, e.g., the substring -S > gives a match. A better solution is - - while ($dna =~ /(\w\w\w)*?TGA/g) { # note the minimal *? - print "Got a TGA stop codon at position ", pos $dna, "\n"; - } - -which prints - - Got a TGA stop codon at position 18 - Got a TGA stop codon at position 23 - -Position 18 is good, but position 23 is bogus. What happened? - -The answer is that our regexp works well until we get past the last -real match. Then the regexp will fail to match a synchronized C -and start stepping ahead one character position at a time, not what we -want. The solution is to use C<\G> to anchor the match to the codon -alignment: - - while ($dna =~ /\G(\w\w\w)*?TGA/g) { - print "Got a TGA stop codon at position ", pos $dna, "\n"; - } - -This prints - - Got a TGA stop codon at position 18 - -which is the correct answer. This example illustrates that it is -important not only to match what is desired, but to reject what is not -desired. - -B - -Regular expressions also play a big role in B -operations in Perl. Search and replace is accomplished with the -C operator. The general form is -C, with everything we know about -regexps and modifiers applying in this case as well. The -C is a Perl double quoted string that replaces in the -string whatever is matched with the C. The operator C<=~> is -also used here to associate a string with C. If matching -against C<$_>, the S > can be dropped. If there is a match, -C returns the number of substitutions made, otherwise it returns -false. Here are a few examples: - - $x = "Time to feed the cat!"; - $x =~ s/cat/hacker/; # $x contains "Time to feed the hacker!" - if ($x =~ s/^(Time.*hacker)!$/$1 now!/) { - $more_insistent = 1; - } - $y = "'quoted words'"; - $y =~ s/^'(.*)'$/$1/; # strip single quotes, - # $y contains "quoted words" - -In the last example, the whole string was matched, but only the part -inside the single quotes was grouped. With the C operator, the -matched variables C<$1>, C<$2>, etc. are immediately available for use -in the replacement expression, so we use C<$1> to replace the quoted -string with just what was quoted. With the global modifier, C -will search and replace all occurrences of the regexp in the string: - - $x = "I batted 4 for 4"; - $x =~ s/4/four/; # doesn't do it all: - # $x contains "I batted four for 4" - $x = "I batted 4 for 4"; - $x =~ s/4/four/g; # does it all: - # $x contains "I batted four for four" - -If you prefer 'regex' over 'regexp' in this tutorial, you could use -the following program to replace it: - - % cat > simple_replace - #!/usr/bin/perl - $regexp = shift; - $replacement = shift; - while (<>) { - s/$regexp/$replacement/go; - print; - } - ^D - - % simple_replace regexp regex perlretut.pod - -In C we used the C modifier to replace all -occurrences of the regexp on each line and the C modifier to -compile the regexp only once. As with C, both the -C and the C use C<$_> implicitly. - -A modifier available specifically to search and replace is the -C evaluation modifier. C wraps an C around -the replacement string and the evaluated result is substituted for the -matched substring. C is useful if you need to do a bit of -computation in the process of replacing text. This example counts -character frequencies in a line: - - $x = "Bill the cat"; - $x =~ s/(.)/$chars{$1}++;$1/eg; # final $1 replaces char with itself - print "frequency of '$_' is $chars{$_}\n" - foreach (sort {$chars{$b} <=> $chars{$a}} keys %chars); - -This prints - - frequency of ' ' is 2 - frequency of 't' is 2 - frequency of 'l' is 2 - frequency of 'B' is 1 - frequency of 'c' is 1 - frequency of 'e' is 1 - frequency of 'h' is 1 - frequency of 'i' is 1 - frequency of 'a' is 1 - -As with the match C operator, C can use other delimiters, -such as C and C, and even C. If single quotes are -used C, then the regexp and replacement are treated as single -quoted strings and there are no substitutions. C in list context -returns the same thing as in scalar context, i.e., the number of -matches. - -B - -The B > function can also optionally use a matching operator -C to split a string. C splits -C into a list of substrings and returns that list. The regexp -is used to match the character sequence that the C is split -with respect to. The C, if present, constrains splitting into -no more than C number of strings. For example, to split a -string into words, use - - $x = "Calvin and Hobbes"; - @words = split /\s+/, $x; # $word[0] = 'Calvin' - # $word[1] = 'and' - # $word[2] = 'Hobbes' - -If the empty regexp C is used, the regexp always matches and -the string is split into individual characters. If the regexp has -groupings, then list produced contains the matched substrings from the -groupings as well. For instance, - - $x = "/usr/bin/perl"; - @dirs = split m!/!, $x; # $dirs[0] = '' - # $dirs[1] = 'usr' - # $dirs[2] = 'bin' - # $dirs[3] = 'perl' - @parts = split m!(/)!, $x; # $parts[0] = '' - # $parts[1] = '/' - # $parts[2] = 'usr' - # $parts[3] = '/' - # $parts[4] = 'bin' - # $parts[5] = '/' - # $parts[6] = 'perl' - -Since the first character of $x matched the regexp, C prepended -an empty initial element to the list. - -If you have read this far, congratulations! You now have all the basic -tools needed to use regular expressions to solve a wide range of text -processing problems. If this is your first time through the tutorial, -why not stop here and play around with regexps a while... S -concerns the more esoteric aspects of regular expressions and those -concepts certainly aren't needed right at the start. - -=head1 Part 2: Power tools - -OK, you know the basics of regexps and you want to know more. If -matching regular expressions is analogous to a walk in the woods, then -the tools discussed in Part 1 are analogous to topo maps and a -compass, basic tools we use all the time. Most of the tools in part 2 -are are analogous to flare guns and satellite phones. They aren't used -too often on a hike, but when we are stuck, they can be invaluable. - -What follows are the more advanced, less used, or sometimes esoteric -capabilities of perl regexps. In Part 2, we will assume you are -comfortable with the basics and concentrate on the new features. - -=head2 More on characters, strings, and character classes - -There are a number of escape sequences and character classes that we -haven't covered yet. - -There are several escape sequences that convert characters or strings -between upper and lower case. C<\l> and C<\u> convert the next -character to lower or upper case, respectively: - - $x = "perl"; - $string =~ /\u$x/; # matches 'Perl' in $string - $x = "M(rs?|s)\\."; # note the double backslash - $string =~ /\l$x/; # matches 'mr.', 'mrs.', and 'ms.', - -C<\L> and C<\U> converts a whole substring, delimited by C<\L> or -C<\U> and C<\E>, to lower or upper case: - - $x = "This word is in lower case:\L SHOUT\E"; - $x =~ /shout/; # matches - $x = "I STILL KEYPUNCH CARDS FOR MY 360" - $x =~ /\Ukeypunch/; # matches punch card string - -If there is no C<\E>, case is converted until the end of the -string. The regexps C<\L\u$word> or C<\u\L$word> convert the first -character of C<$word> to uppercase and the rest of the characters to -lowercase. - -Control characters can be escaped with C<\c>, so that a control-Z -character would be matched with C<\cZ>. The escape sequence -C<\Q>...C<\E> quotes, or protects most non-alphabetic characters. For -instance, - - $x = "\QThat !^*&%~& cat!"; - $x =~ /\Q!^*&%~&\E/; # check for rough language - -It does not protect C<$> or C<@>, so that variables can still be -substituted. - -With the advent of 5.6.0, perl regexps can handle more than just the -standard ASCII character set. Perl now supports B, a standard -for encoding the character sets from many of the world's written -languages. Unicode does this by allowing characters to be more than -one byte wide. Perl uses the UTF-8 encoding, in which ASCII characters -are still encoded as one byte, but characters greater than C -may be stored as two or more bytes. - -What does this mean for regexps? Well, regexp users don't need to know -much about perl's internal representation of strings. But they do need -to know 1) how to represent Unicode characters in a regexp and 2) when -a matching operation will treat the string to be searched as a -sequence of bytes (the old way) or as a sequence of Unicode characters -(the new way). The answer to 1) is that Unicode characters greater -than C may be represented using the C<\x{hex}> notation, -with C a hexadecimal integer: - - use utf8; # We will be doing Unicode processing - /\x{263a}/; # match a Unicode smiley face :) - -Unicode characters in the range of 128-255 use two hexadecimal digits -with braces: C<\x{ab}>. Note that this is different than C<\xab>, -which is just a hexadecimal byte with no Unicode -significance. - -Figuring out the hexadecimal sequence of a Unicode character you want -or deciphering someone else's hexadecimal Unicode regexp is about as -much fun as programming in machine code. So another way to specify -Unicode characters is to use the S > escape -sequence C<\N{name}>. C is a name for the Unicode character, as -specified in the Unicode standard. For instance, if we wanted to -represent or match the astrological sign for the planet Mercury, we -could use - - use utf8; # We will be doing Unicode processing - use charnames ":full"; # use named chars with Unicode full names - $x = "abc\N{MERCURY}def"; - $x =~ /\N{MERCURY}/; # matches - -One can also use short names or restrict names to a certain alphabet: - - use utf8; # We will be doing Unicode processing - - use charnames ':full'; - print "\N{GREEK SMALL LETTER SIGMA} is called sigma.\n"; - - use charnames ":short"; - print "\N{greek:Sigma} is an upper-case sigma.\n"; - - use charnames qw(greek); - print "\N{sigma} is Greek sigma\n"; - -A list of full names is found in the file Names.txt in the -lib/perl5/5.6.0/unicode directory. - -The answer to requirement 2), as of 5.6.0, is that if a regexp -contains Unicode characters, the string is searched as a sequence of -Unicode characters. Otherwise, the string is searched as a sequence of -bytes. If the string is being searched as a sequence of Unicode -characters, but matching a single byte is required, we can use the C<\C> -escape sequence. C<\C> is a character class akin to C<.> except that -it matches I byte 0-255. So - - use utf8; # We will be doing Unicode processing - use charnames ":full"; # use named chars with Unicode full names - $x = "a"; - $x =~ /\C/; # matches 'a', eats one byte - $x = ""; - $x =~ /\C/; # doesn't match, no bytes to match - $x = "\N{MERCURY}"; # two-byte Unicode character - $x =~ /\C/; # matches, but dangerous! - -The last regexp matches, but is dangerous because the string -I position is no longer synchronized to the string I -position. This generates the warning 'Malformed UTF-8 -character'. C<\C> is best used for matching the binary data in strings -with binary data intermixed with Unicode characters. - -Let us now discuss the rest of the character classes. Just as with -Unicode characters, there are named Unicode character classes -represented by the C<\p{name}> escape sequence. Closely associated is -the C<\P{name}> character class, which is the negation of the -C<\p{name}> class. For example, to match lower and uppercase -characters, - - use utf8; # We will be doing Unicode processing - use charnames ":full"; # use named chars with Unicode full names - $x = "BOB"; - $x =~ /^\p{IsUpper}/; # matches, uppercase char class - $x =~ /^\P{IsUpper}/; # doesn't match, char class sans uppercase - $x =~ /^\p{IsLower}/; # doesn't match, lowercase char class - $x =~ /^\P{IsLower}/; # matches, char class sans lowercase - -Here is the association between some Perl named classes and the -traditional Unicode classes: - - Perl class name Unicode class name or regular expression - - IsAlpha /^[LM]/ - IsAlnum /^[LMN]/ - IsASCII $code <= 127 - IsCntrl /^C/ - IsBlank $code =~ /^(0020|0009)$/ || /^Z[^lp]/ - IsDigit Nd - IsGraph /^([LMNPS]|Co)/ - IsLower Ll - IsPrint /^([LMNPS]|Co|Zs)/ - IsPunct /^P/ - IsSpace /^Z/ || ($code =~ /^(0009|000A|000B|000C|000D)$/ - IsSpacePerl /^Z/ || ($code =~ /^(0009|000A|000C|000D)$/ - IsUpper /^L[ut]/ - IsWord /^[LMN]/ || $code eq "005F" - IsXDigit $code =~ /^00(3[0-9]|[46][1-6])$/ - -You can also use the official Unicode class names with the C<\p> and -C<\P>, like C<\p{L}> for Unicode 'letters', or C<\p{Lu}> for uppercase -letters, or C<\P{Nd}> for non-digits. If a C is just one -letter, the braces can be dropped. For instance, C<\pM> is the -character class of Unicode 'marks'. - -C<\X> is an abbreviation for a character class sequence that includes -the Unicode 'combining character sequences'. A 'combining character -sequence' is a base character followed by any number of combining -characters. An example of a combining character is an accent. Using -the Unicode full names, e.g., S > is a combining -character sequence with base character C and combining character -S >, which translates in Danish to A with the circle -atop it, as in the word Angstrom. C<\X> is equivalent to C<\PM\pM*}>, -i.e., a non-mark followed by one or more marks. - -As if all those classes weren't enough, Perl also defines POSIX style -character classes. These have the form C<[:name:]>, with C the -name of the POSIX class. The POSIX classes are C, C, -C, C, C, C, C, C, C, -C, C, and C, and two extensions, C (a Perl -extension to match C<\w>), and C (a GNU extension). If C -is being used, then these classes are defined the same as their -corresponding perl Unicode classes: C<[:upper:]> is the same as -C<\p{IsUpper}>, etc. The POSIX character classes, however, don't -require using C. The C<[:digit:]>, C<[:word:]>, and -C<[:space:]> correspond to the familiar C<\d>, C<\w>, and C<\s> -character classes. To negate a POSIX class, put a C<^> in front of -the name, so that, e.g., C<[:^digit:]> corresponds to C<\D> and under -C, C<\P{IsDigit}>. The Unicode and POSIX character classes can -be used just like C<\d>, both inside and outside of character classes: - - /\s+[abc[:digit:]xyz]\s*/; # match a,b,c,x,y,z, or a digit - /^=item\s[:digit:]/; # match '=item', - # followed by a space and a digit - use utf8; - use charnames ":full"; - /\s+[abc\p{IsDigit}xyz]\s+/; # match a,b,c,x,y,z, or a digit - /^=item\s\p{IsDigit}/; # match '=item', - # followed by a space and a digit - -Whew! That is all the rest of the characters and character classes. - -=head2 Compiling and saving regular expressions - -In Part 1 we discussed the C modifier, which compiles a regexp -just once. This suggests that a compiled regexp is some data structure -that can be stored once and used again and again. The regexp quote -C does exactly that: C compiles the C as a -regexp and transforms the result into a form that can be assigned to a -variable: - - $reg = qr/foo+bar?/; # reg contains a compiled regexp - -Then C<$reg> can be used as a regexp: - - $x = "fooooba"; - $x =~ $reg; # matches, just like /foo+bar?/ - $x =~ /$reg/; # same thing, alternate form - -C<$reg> can also be interpolated into a larger regexp: - - $x =~ /(abc)?$reg/; # still matches - -As with the matching operator, the regexp quote can use different -delimiters, e.g., C, C and C. The single quote -delimiters C prevent any interpolation from taking place. - -Pre-compiled regexps are useful for creating dynamic matches that -don't need to be recompiled each time they are encountered. Using -pre-compiled regexps, C program can be expanded into a -program that matches multiple patterns: - - % cat > multi_grep - #!/usr/bin/perl - # multi_grep - match any of regexps - # usage: multi_grep regexp1 regexp2 ... file1 file2 ... - - $number = shift; - $regexp[$_] = shift foreach (0..$number-1); - @compiled = map qr/$_/, @regexp; - while ($line = <>) { - foreach $pattern (@compiled) { - if ($line =~ /$pattern/) { - print $line; - last; # we matched, so move onto the next line - } - } - } - ^D - - % multi_grep 2 last for multi_grep - $regexp[$_] = shift foreach (0..$number-1); - foreach $pattern (@compiled) { - last; - -Storing pre-compiled regexps in an array C<@compiled> allows us to -simply loop through the regexps without any recompilation, thus gaining -flexibility without sacrificing speed. - -=head2 Embedding comments and modifiers in a regular expression - -Starting with this section, we will be discussing Perl's set of -B. These are extensions to the traditional regular -expression syntax that provide powerful new tools for pattern -matching. We have already seen extensions in the form of the minimal -matching constructs C, C<*?>, C<+?>, C<{n,m}?>, and C<{n,}?>. The -rest of the extensions below have the form C<(?char...)>, where the -C is a character that determines the type of extension. - -The first extension is an embedded comment C<(?#text)>. This embeds a -comment into the regular expression without affecting its meaning. The -comment should not have any closing parentheses in the text. An -example is - - /(?# Match an integer:)[+-]?\d+/; - -This style of commenting has been largely superseded by the raw, -freeform commenting that is allowed with the C modifier. - -The modifiers C, C, C, and C can also embedded in -a regexp using C<(?i)>, C<(?m)>, C<(?s)>, and C<(?x)>. For instance, - - /(?i)yes/; # match 'yes' case insensitively - /yes/i; # same thing - /(?x)( # freeform version of an integer regexp - [+-]? # match an optional sign - \d+ # match a sequence of digits - ) - /x; - -Embedded modifiers can have two important advantages over the usual -modifiers. Embedded modifiers allow a custom set of modifiers to -I regexp pattern. This is great for matching an array of regexps -that must have different modifiers: - - $pattern[0] = '(?i)doctor'; - $pattern[1] = 'Johnson'; - ... - while (<>) { - foreach $patt (@pattern) { - print if /$patt/; - } - } - -The second advantage is that embedded modifiers only affect the regexp -inside the group the embedded modifier is contained in. So grouping -can be used to localize the modifier's effects: - - /Answer: ((?i)yes)/; # matches 'Answer: yes', 'Answer: YES', etc. - -Embedded modifiers can also turn off any modifiers already present -by using, e.g., C<(?-i)>. Modifiers can also be combined into -a single expression, e.g., C<(?s-i)> turns on single line mode and -turns off case insensitivity. - -=head2 Non-capturing groupings - -We noted in Part 1 that groupings C<()> had two distinct functions: 1) -group regexp elements together as a single unit, and 2) extract, or -capture, substrings that matched the regexp in the -grouping. Non-capturing groupings, denoted by C<(?:regexp)>, allow the -regexp to be treated as a single unit, but don't extract substrings or -set matching variables C<$1>, etc. Both capturing and non-capturing -groupings are allowed to co-exist in the same regexp. Because there is -no extraction, non-capturing groupings are faster than capturing -groupings. Non-capturing groupings are also handy for choosing exactly -which parts of a regexp are to be extracted to matching variables: - - # match a number, $1-$4 are set, but we only want $1 - /([+-]?\ *(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?)/; - - # match a number faster , only $1 is set - /([+-]?\ *(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?)/; - - # match a number, get $1 = whole number, $2 = exponent - /([+-]?\ *(?:\d+(?:\.\d*)?|\.\d+)(?:[eE]([+-]?\d+))?)/; - -Non-capturing groupings are also useful for removing nuisance -elements gathered from a split operation: - - $x = '12a34b5'; - @num = split /(a|b)/, $x; # @num = ('12','a','34','b','5') - @num = split /(?:a|b)/, $x; # @num = ('12','34','5') - -Non-capturing groupings may also have embedded modifiers: -C<(?i-m:regexp)> is a non-capturing grouping that matches C -case insensitively and turns off multi-line mode. - -=head2 Looking ahead and looking behind - -This section concerns the lookahead and lookbehind assertions. First, -a little background. - -In Perl regular expressions, most regexp elements 'eat up' a certain -amount of string when they match. For instance, the regexp element -C<[abc}]> eats up one character of the string when it matches, in the -sense that perl moves to the next character position in the string -after the match. There are some elements, however, that don't eat up -characters (advance the character position) if they match. The examples -we have seen so far are the anchors. The anchor C<^> matches the -beginning of the line, but doesn't eat any characters. Similarly, the -word boundary anchor C<\b> matches, e.g., if the character to the left -is a word character and the character to the right is a non-word -character, but it doesn't eat up any characters itself. Anchors are -examples of 'zero-width assertions'. Zero-width, because they consume -no characters, and assertions, because they test some property of the -string. In the context of our walk in the woods analogy to regexp -matching, most regexp elements move us along a trail, but anchors have -us stop a moment and check our surroundings. If the local environment -checks out, we can proceed forward. But if the local environment -doesn't satisfy us, we must backtrack. - -Checking the environment entails either looking ahead on the trail, -looking behind, or both. C<^> looks behind, to see that there are no -characters before. C<$> looks ahead, to see that there are no -characters after. C<\b> looks both ahead and behind, to see if the -characters on either side differ in their 'word'-ness. - -The lookahead and lookbehind assertions are generalizations of the -anchor concept. Lookahead and lookbehind are zero-width assertions -that let us specify which characters we want to test for. The -lookahead assertion is denoted by C<(?=regexp)> and the lookbehind -assertion is denoted by C<< (?<=fixed-regexp) >>. Some examples are - - $x = "I catch the housecat 'Tom-cat' with catnip"; - $x =~ /cat(?=\s+)/; # matches 'cat' in 'housecat' - @catwords = ($x =~ /(?<=\s)cat\w+/g); # matches, - # $catwords[0] = 'catch' - # $catwords[1] = 'catnip' - $x =~ /\bcat\b/; # matches 'cat' in 'Tom-cat' - $x =~ /(?<=\s)cat(?=\s)/; # doesn't match; no isolated 'cat' in - # middle of $x - -Note that the parentheses in C<(?=regexp)> and C<< (?<=regexp) >> are -non-capturing, since these are zero-width assertions. Thus in the -second regexp, the substrings captured are those of the whole regexp -itself. Lookahead C<(?=regexp)> can match arbitrary regexps, but -lookbehind C<< (?<=fixed-regexp) >> only works for regexps of fixed -width, i.e., a fixed number of characters long. Thus -C<< (?<=(ab|bc)) >> is fine, but C<< (?<=(ab)*) >> is not. The -negated versions of the lookahead and lookbehind assertions are -denoted by C<(?!regexp)> and C<< (?> respectively. -They evaluate true if the regexps do I match: - - $x = "foobar"; - $x =~ /foo(?!bar)/; # doesn't match, 'bar' follows 'foo' - $x =~ /foo(?!baz)/; # matches, 'baz' doesn't follow 'foo' - $x =~ /(? > are regular expressions, in the -context of a larger regular expression, that function independently of -the larger regular expression. That is, they consume as much or as -little of the string as they wish without regard for the ability of -the larger regexp to match. Independent subexpressions are represented -by C<< (?>regexp) >>. We can illustrate their behavior by first -considering an ordinary regexp: - - $x = "ab"; - $x =~ /a*ab/; # matches - -This obviously matches, but in the process of matching, the -subexpression C first grabbed the C. Doing so, however, -wouldn't allow the whole regexp to match, so after backtracking, C -eventually gave back the C and matched the empty string. Here, what -C matched was I on what the rest of the regexp matched. - -Contrast that with an independent subexpression: - - $x =~ /(?>a*)ab/; # doesn't match! - -The independent subexpression C<< (?>a*) >> doesn't care about the rest -of the regexp, so it sees an C and grabs it. Then the rest of the -regexp C cannot match. Because C<< (?>a*) >> is independent, there -is no backtracking and and the independent subexpression does not give -up its C. Thus the match of the regexp as a whole fails. A similar -behavior occurs with completely independent regexps: - - $x = "ab"; - $x =~ /a*/g; # matches, eats an 'a' - $x =~ /\Gab/g; # doesn't match, no 'a' available - -Here C and C<\G> create a 'tag team' handoff of the string from -one regexp to the other. Regexps with an independent subexpression are -much like this, with a handoff of the string to the independent -subexpression, and a handoff of the string back to the enclosing -regexp. - -The ability of an independent subexpression to prevent backtracking -can be quite useful. Suppose we want to match a non-empty string -enclosed in parentheses up to two levels deep. Then the following -regexp matches: - - $x = "abc(de(fg)h"; # unbalanced parentheses - $x =~ /\( ( [^()]+ | \([^()]*\) )+ \)/x; - -The regexp matches an open parenthesis, one or more copies of an -alternation, and a close parenthesis. The alternation is two-way, with -the first alternative C<[^()]+> matching a substring with no -parentheses and the second alternative C<\([^()]*\)> matching a -substring delimited by parentheses. The problem with this regexp is -that it is pathological: it has nested indeterminate quantifiers - of the form C<(a+|b)+>. We discussed in Part 1 how nested quantifiers -like this could take an exponentially long time to execute if there -was no match possible. To prevent the exponential blowup, we need to -prevent useless backtracking at some point. This can be done by -enclosing the inner quantifier as an independent subexpression: - - $x =~ /\( ( (?>[^()]+) | \([^()]*\) )+ \)/x; - -Here, C<< (?>[^()]+) >> breaks the degeneracy of string partitioning -by gobbling up as much of the string as possible and keeping it. Then -match failures fail much more quickly. - -=head2 Conditional expressions - -A S > is a form of if-then-else statement -that allows one to choose which patterns are to be matched, based on -some condition. There are two types of conditional expression: -C<(?(condition)yes-regexp)> and -C<(?(condition)yes-regexp|no-regexp)>. C<(?(condition)yes-regexp)> is -like an S > statement in Perl. If the C is true, -the C will be matched. If the C is false, the -C will be skipped and perl will move onto the next regexp -element. The second form is like an S > statement -in Perl. If the C is true, the C will be -matched, otherwise the C will be matched. - -The C can have two forms. The first form is simply an -integer in parentheses C<(integer)>. It is true if the corresponding -backreference C<\integer> matched earlier in the regexp. The second -form is a bare zero width assertion C<(?...)>, either a -lookahead, a lookbehind, or a code assertion (discussed in the next -section). - -The integer form of the C allows us to choose, with more -flexibility, what to match based on what matched earlier in the -regexp. This searches for words of the form C<"$x$x"> or -C<"$x$y$y$x">: - - % simple_grep '^(\w+)(\w+)?(?(2)\2\1|\1)$' /usr/dict/words - beriberi - coco - couscous - deed - ... - toot - toto - tutu - -The lookbehind C allows, along with backreferences, -an earlier part of the match to influence a later part of the -match. For instance, - - /[ATGC]+(?(?<=AA)G|C)$/; - -matches a DNA sequence such that it either ends in C, or some -other base pair combination and C. Note that the form is -C<< (?(?<=AA)G|C) >> and not C<< (?((?<=AA))G|C) >>; for the -lookahead, lookbehind or code assertions, the parentheses around the -conditional are not needed. - -=head2 A bit of magic: executing Perl code in a regular expression - -Normally, regexps are a part of Perl expressions. -S > expressions turn that around by allowing -arbitrary Perl code to be a part of of a regexp. A code evaluation -expression is denoted C<(?{code})>, with C a string of Perl -statements. - -Code expressions are zero-width assertions, and the value they return -depends on their environment. There are two possibilities: either the -code expression is used as a conditional in a conditional expression -C<(?(condition)...)>, or it is not. If the code expression is a -conditional, the code is evaluated and the result (i.e., the result of -the last statement) is used to determine truth or falsehood. If the -code expression is not used as a conditional, the assertion always -evaluates true and the result is put into the special variable -C<$^R>. The variable C<$^R> can then be used in code expressions later -in the regexp. Here are some silly examples: - - $x = "abcdef"; - $x =~ /abc(?{print "Hi Mom!";})def/; # matches, - # prints 'Hi Mom!' - $x =~ /aaa(?{print "Hi Mom!";})def/; # doesn't match, - # no 'Hi Mom!' - -Pay careful attention to the next example: - - $x =~ /abc(?{print "Hi Mom!";})ddd/; # doesn't match, - # no 'Hi Mom!' - # but why not? - -At first glance, you'd think that it shouldn't print, because obviously -the C isn't going to match the target string. But look at this -example: - - $x =~ /abc(?{print "Hi Mom!";})[d]dd/; # doesn't match, - # but _does_ print - -Hmm. What happened here? If you've been following along, you know that -the above pattern should be effectively the same as the last one -- -enclosing the d in a character class isn't going to change what it -matches. So why does the first not print while the second one does? - -The answer lies in the optimizations the REx engine makes. In the first -case, all the engine sees are plain old characters (aside from the -C construct). It's smart enough to realize that the string 'ddd' -doesn't occur in our target string before actually running the pattern -through. But in the second case, we've tricked it into thinking that our -pattern is more complicated than it is. It takes a look, sees our -character class, and decides that it will have to actually run the -pattern to determine whether or not it matches, and in the process of -running it hits the print statement before it discovers that we don't -have a match. - -To take a closer look at how the engine does optimizations, see the -section L<"Pragmas and debugging"> below. - -More fun with C: - - $x =~ /(?{print "Hi Mom!";})/; # matches, - # prints 'Hi Mom!' - $x =~ /(?{$c = 1;})(?{print "$c";})/; # matches, - # prints '1' - $x =~ /(?{$c = 1;})(?{print "$^R";})/; # matches, - # prints '1' - -The bit of magic mentioned in the section title occurs when the regexp -backtracks in the process of searching for a match. If the regexp -backtracks over a code expression and if the variables used within are -localized using C, the changes in the variables produced by the -code expression are undone! Thus, if we wanted to count how many times -a character got matched inside a group, we could use, e.g., - - $x = "aaaa"; - $count = 0; # initialize 'a' count - $c = "bob"; # test if $c gets clobbered - $x =~ /(?{local $c = 0;}) # initialize count - ( a # match 'a' - (?{local $c = $c + 1;}) # increment count - )* # do this any number of times, - aa # but match 'aa' at the end - (?{$count = $c;}) # copy local $c var into $count - /x; - print "'a' count is $count, \$c variable is '$c'\n"; - -This prints - - 'a' count is 2, $c variable is 'bob' - -If we replace the S > with -S >, the variable changes are I undone -during backtracking, and we get - - 'a' count is 4, $c variable is 'bob' - -Note that only localized variable changes are undone. Other side -effects of code expression execution are permanent. Thus - - $x = "aaaa"; - $x =~ /(a(?{print "Yow\n";}))*aa/; - -produces - - Yow - Yow - Yow - Yow - -The result C<$^R> is automatically localized, so that it will behave -properly in the presence of backtracking. - -This example uses a code expression in a conditional to match the -article 'the' in either English or German: - - $lang = 'DE'; # use German - ... - $text = "das"; - print "matched\n" - if $text =~ /(?(?{ - $lang eq 'EN'; # is the language English? - }) - the | # if so, then match 'the' - (die|das|der) # else, match 'die|das|der' - ) - /xi; - -Note that the syntax here is C<(?(?{...})yes-regexp|no-regexp)>, not -C<(?((?{...}))yes-regexp|no-regexp)>. In other words, in the case of a -code expression, we don't need the extra parentheses around the -conditional. - -If you try to use code expressions with interpolating variables, perl -may surprise you: - - $bar = 5; - $pat = '(?{ 1 })'; - /foo(?{ $bar })bar/; # compiles ok, $bar not interpolated - /foo(?{ 1 })$bar/; # compile error! - /foo${pat}bar/; # compile error! - - $pat = qr/(?{ $foo = 1 })/; # precompile code regexp - /foo${pat}bar/; # compiles ok - -If a regexp has (1) code expressions and interpolating variables,or -(2) a variable that interpolates a code expression, perl treats the -regexp as an error. If the code expression is precompiled into a -variable, however, interpolating is ok. The question is, why is this -an error? - -The reason is that variable interpolation and code expressions -together pose a security risk. The combination is dangerous because -many programmers who write search engines often take user input and -plug it directly into a regexp: - - $regexp = <>; # read user-supplied regexp - $chomp $regexp; # get rid of possible newline - $text =~ /$regexp/; # search $text for the $regexp - -If the C<$regexp> variable contains a code expression, the user could -then execute arbitrary Perl code. For instance, some joker could -search for S > to erase your files. In this -sense, the combination of interpolation and code expressions B -your regexp. So by default, using both interpolation and code -expressions in the same regexp is not allowed. If you're not -concerned about malicious users, it is possible to bypass this -security check by invoking S >: - - use re 'eval'; # throw caution out the door - $bar = 5; - $pat = '(?{ 1 })'; - /foo(?{ 1 })$bar/; # compiles ok - /foo${pat}bar/; # compiles ok - -Another form of code expression is the S >. -The pattern code expression is like a regular code expression, except -that the result of the code evaluation is treated as a regular -expression and matched immediately. A simple example is - - $length = 5; - $char = 'a'; - $x = 'aaaaabb'; - $x =~ /(??{$char x $length})/x; # matches, there are 5 of 'a' - - -This final example contains both ordinary and pattern code -expressions. It detects if a binary string C<1101010010001...> has a -Fibonacci spacing 0,1,1,2,3,5,... of the C<1>'s: - - $s0 = 0; $s1 = 1; # initial conditions - $x = "1101010010001000001"; - print "It is a Fibonacci sequence\n" - if $x =~ /^1 # match an initial '1' - ( - (??{'0' x $s0}) # match $s0 of '0' - 1 # and then a '1' - (?{ - $largest = $s0; # largest seq so far - $s2 = $s1 + $s0; # compute next term - $s0 = $s1; # in Fibonacci sequence - $s1 = $s2; - }) - )+ # repeat as needed - $ # that is all there is - /x; - print "Largest sequence matched was $largest\n"; - -This prints - - It is a Fibonacci sequence - Largest sequence matched was 5 - -Ha! Try that with your garden variety regexp package... - -Note that the variables C<$s0> and C<$s1> are not substituted when the -regexp is compiled, as happens for ordinary variables outside a code -expression. Rather, the code expressions are evaluated when perl -encounters them during the search for a match. - -The regexp without the C modifier is - - /^1((??{'0'x$s0})1(?{$largest=$s0;$s2=$s1+$s0$s0=$s1;$s1=$s2;}))+$/; - -and is a great start on an Obfuscated Perl entry :-) When working with -code and conditional expressions, the extended form of regexps is -almost necessary in creating and debugging regexps. - -=head2 Pragmas and debugging - -Speaking of debugging, there are several pragmas available to control -and debug regexps in Perl. We have already encountered one pragma in -the previous section, S >, that allows variable -interpolation and code expressions to coexist in a regexp. The other -pragmas are - - use re 'taint'; - $tainted = <>; - @parts = ($tainted =~ /(\w+)\s+(\w+)/; # @parts is now tainted - -The C pragma causes any substrings from a match with a tainted -variable to be tainted as well. This is not normally the case, as -regexps are often used to extract the safe bits from a tainted -variable. Use C when you are not extracting safe bits, but are -performing some other processing. Both C and C pragmas -are lexically scoped, which means they are in effect only until -the end of the block enclosing the pragmas. - - use re 'debug'; - /^(.*)$/s; # output debugging info - - use re 'debugcolor'; - /^(.*)$/s; # output debugging info in living color - -The global C and C pragmas allow one to get -detailed debugging info about regexp compilation and -execution. C is the same as debug, except the debugging -information is displayed in color on terminals that can display -termcap color sequences. Here is example output: - - % perl -e 'use re "debug"; "abc" =~ /a*b+c/;' - Compiling REx `a*b+c' - size 9 first at 1 - 1: STAR(4) - 2: EXACT (0) - 4: PLUS(7) - 5: EXACT (0) - 7: EXACT (9) - 9: END(0) - floating `bc' at 0..2147483647 (checking floating) minlen 2 - Guessing start of match, REx `a*b+c' against `abc'... - Found floating substr `bc' at offset 1... - Guessed: match at offset 0 - Matching REx `a*b+c' against `abc' - Setting an EVAL scope, savestack=3 - 0 <> | 1: STAR - EXACT can match 1 times out of 32767... - Setting an EVAL scope, savestack=3 - 1 | 4: PLUS - EXACT can match 1 times out of 32767... - Setting an EVAL scope, savestack=3 - 2 | 7: EXACT - 3 <> | 9: END - Match successful! - Freeing REx: `a*b+c' - -If you have gotten this far into the tutorial, you can probably guess -what the different parts of the debugging output tell you. The first -part - - Compiling REx `a*b+c' - size 9 first at 1 - 1: STAR(4) - 2: EXACT (0) - 4: PLUS(7) - 5: EXACT (0) - 7: EXACT (9) - 9: END(0) - -describes the compilation stage. C means that there is a -starred object, in this case C<'a'>, and if it matches, goto line 4, -i.e., C. The middle lines describe some heuristics and -optimizations performed before a match: - - floating `bc' at 0..2147483647 (checking floating) minlen 2 - Guessing start of match, REx `a*b+c' against `abc'... - Found floating substr `bc' at offset 1... - Guessed: match at offset 0 - -Then the match is executed and the remaining lines describe the -process: - - Matching REx `a*b+c' against `abc' - Setting an EVAL scope, savestack=3 - 0 <> | 1: STAR - EXACT can match 1 times out of 32767... - Setting an EVAL scope, savestack=3 - 1 | 4: PLUS - EXACT can match 1 times out of 32767... - Setting an EVAL scope, savestack=3 - 2 | 7: EXACT - 3 <> | 9: END - Match successful! - Freeing REx: `a*b+c' - -Each step is of the form S >> >, with C<< >> the -part of the string matched and C<< >> the part not yet -matched. The S> > says that perl is at line number 1 -n the compilation list above. See -L for much more detail. - -An alternative method of debugging regexps is to embed C -statements within the regexp. This provides a blow-by-blow account of -the backtracking in an alternation: - - "that this" =~ m@(?{print "Start at position ", pos, "\n";}) - t(?{print "t1\n";}) - h(?{print "h1\n";}) - i(?{print "i1\n";}) - s(?{print "s1\n";}) - | - t(?{print "t2\n";}) - h(?{print "h2\n";}) - a(?{print "a2\n";}) - t(?{print "t2\n";}) - (?{print "Done at position ", pos, "\n";}) - @x; - -prints - - Start at position 0 - t1 - h1 - t2 - h2 - a2 - t2 - Done at position 4 - -=head1 BUGS - -Code expressions, conditional expressions, and independent expressions -are B. Don't use them in production code. Yet. - -=head1 SEE ALSO - -This is just a tutorial. For the full story on perl regular -expressions, see the L regular expressions reference page. - -For more information on the matching C and substitution C -operators, see L. For -information on the C operation, see L. - -For an excellent all-around resource on the care and feeding of -regular expressions, see the book I by -Jeffrey Friedl (published by O'Reilly, ISBN 1556592-257-3). - -=head1 AUTHOR AND COPYRIGHT - -Copyright (c) 2000 Mark Kvale -All rights reserved. - -This document may be distributed under the same terms as Perl itself. - -=head2 Acknowledgments - -The inspiration for the stop codon DNA example came from the ZIP -code example in chapter 7 of I. - -The author would like to thank Jeff Pinyan, Andrew Johnson, Peter -Haworth, Ronald J Kimball, and Joe Smith for all their helpful -comments. - -=cut - diff --git a/lib/perl5/5.6.1/pods/perlrun.pod b/lib/perl5/5.6.1/pods/perlrun.pod deleted file mode 100644 index 30e82fc1..00000000 --- a/lib/perl5/5.6.1/pods/perlrun.pod +++ /dev/null @@ -1,859 +0,0 @@ -=head1 NAME - -perlrun - how to execute the Perl interpreter - -=head1 SYNOPSIS - -B S<[ B<-CsTuUWX> ]> - S<[ B<-hv> ] [ B<-V>[:I] ]> - S<[ B<-cw> ] [ B<-d>[:I] ] [ B<-D>[I] ]> - S<[ B<-pna> ] [ B<-F>I ] [ B<-l>[I] ] [ B<-0>[I] ]> - S<[ B<-I>I ] [ B<-m>[B<->]I ] [ B<-M>[B<->]I<'module...'> ]> - S<[ B<-P> ]> - S<[ B<-S> ]> - S<[ B<-x>[I] ]> - S<[ B<-i>[I] ]> - S<[ B<-e> I<'command'> ] [ B<--> ] [ I ] [ I ]...> - -=head1 DESCRIPTION - -The normal way to run a Perl program is by making it directly -executable, or else by passing the name of the source file as an -argument on the command line. (An interactive Perl environment -is also possible--see L for details on how to do that.) -Upon startup, Perl looks for your program in one of the following -places: - -=over 4 - -=item 1. - -Specified line by line via B<-e> switches on the command line. - -=item 2. - -Contained in the file specified by the first filename on the command line. -(Note that systems supporting the #! notation invoke interpreters this -way. See L.) - -=item 3. - -Passed in implicitly via standard input. This works only if there are -no filename arguments--to pass arguments to a STDIN-read program you -must explicitly specify a "-" for the program name. - -=back - -With methods 2 and 3, Perl starts parsing the input file from the -beginning, unless you've specified a B<-x> switch, in which case it -scans for the first line starting with #! and containing the word -"perl", and starts there instead. This is useful for running a program -embedded in a larger message. (In this case you would indicate the end -of the program using the C<__END__> token.) - -The #! line is always examined for switches as the line is being -parsed. Thus, if you're on a machine that allows only one argument -with the #! line, or worse, doesn't even recognize the #! line, you -still can get consistent switch behavior regardless of how Perl was -invoked, even if B<-x> was used to find the beginning of the program. - -Because historically some operating systems silently chopped off -kernel interpretation of the #! line after 32 characters, some -switches may be passed in on the command line, and some may not; -you could even get a "-" without its letter, if you're not careful. -You probably want to make sure that all your switches fall either -before or after that 32-character boundary. Most switches don't -actually care if they're processed redundantly, but getting a "-" -instead of a complete switch could cause Perl to try to execute -standard input instead of your program. And a partial B<-I> switch -could also cause odd results. - -Some switches do care if they are processed twice, for instance -combinations of B<-l> and B<-0>. Either put all the switches after -the 32-character boundary (if applicable), or replace the use of -B<-0>I by C. - -Parsing of the #! switches starts wherever "perl" is mentioned in the line. -The sequences "-*" and "- " are specifically ignored so that you could, -if you were so inclined, say - - #!/bin/sh -- # -*- perl -*- -p - eval 'exec perl -wS $0 ${1+"$@"}' - if $running_under_some_shell; - -to let Perl see the B<-p> switch. - -A similar trick involves the B program, if you have it. - - #!/usr/bin/env perl - -The examples above use a relative path to the perl interpreter, -getting whatever version is first in the user's path. If you want -a specific version of Perl, say, perl5.005_57, you should place -that directly in the #! line's path. - -If the #! line does not contain the word "perl", the program named after -the #! is executed instead of the Perl interpreter. This is slightly -bizarre, but it helps people on machines that don't do #!, because they -can tell a program that their SHELL is F, and Perl will then -dispatch the program to the correct interpreter for them. - -After locating your program, Perl compiles the entire program to an -internal form. If there are any compilation errors, execution of the -program is not attempted. (This is unlike the typical shell script, -which might run part-way through before finding a syntax error.) - -If the program is syntactically correct, it is executed. If the program -runs off the end without hitting an exit() or die() operator, an implicit -C is provided to indicate successful completion. - -=head2 #! and quoting on non-Unix systems - -Unix's #! technique can be simulated on other systems: - -=over 4 - -=item OS/2 - -Put - - extproc perl -S -your_switches - -as the first line in C<*.cmd> file (B<-S> due to a bug in cmd.exe's -`extproc' handling). - -=item MS-DOS - -Create a batch file to run your program, and codify it in -C (see the F file in the source -distribution for more information). - -=item Win95/NT - -The Win95/NT installation, when using the ActiveState installer for Perl, -will modify the Registry to associate the F<.pl> extension with the perl -interpreter. If you install Perl by other means (including building from -the sources), you may have to modify the Registry yourself. Note that -this means you can no longer tell the difference between an executable -Perl program and a Perl library file. - -=item Macintosh - -A Macintosh perl program will have the appropriate Creator and -Type, so that double-clicking them will invoke the perl application. - -=item VMS - -Put - - $ perl -mysw 'f$env("procedure")' 'p1' 'p2' 'p3' 'p4' 'p5' 'p6' 'p7' 'p8' ! - $ exit++ + ++$status != 0 and $exit = $status = undef; - -at the top of your program, where B<-mysw> are any command line switches you -want to pass to Perl. You can now invoke the program directly, by saying -C, or as a DCL procedure, by saying C<@program> (or implicitly -via F by just using the name of the program). - -This incantation is a bit much to remember, but Perl will display it for -you if you say C. - -=back - -Command-interpreters on non-Unix systems have rather different ideas -on quoting than Unix shells. You'll need to learn the special -characters in your command-interpreter (C<*>, C<\> and C<"> are -common) and how to protect whitespace and these characters to run -one-liners (see B<-e> below). - -On some systems, you may have to change single-quotes to double ones, -which you must I do on Unix or Plan9 systems. You might also -have to change a single % to a %%. - -For example: - - # Unix - perl -e 'print "Hello world\n"' - - # MS-DOS, etc. - perl -e "print \"Hello world\n\"" - - # Macintosh - print "Hello world\n" - (then Run "Myscript" or Shift-Command-R) - - # VMS - perl -e "print ""Hello world\n""" - -The problem is that none of this is reliable: it depends on the -command and it is entirely possible neither works. If B<4DOS> were -the command shell, this would probably work better: - - perl -e "print "Hello world\n"" - -B in Windows NT slipped a lot of standard Unix functionality in -when nobody was looking, but just try to find documentation for its -quoting rules. - -Under the Macintosh, it depends which environment you are using. The MacPerl -shell, or MPW, is much like Unix shells in its support for several -quoting variants, except that it makes free use of the Macintosh's non-ASCII -characters as control characters. - -There is no general solution to all of this. It's just a mess. - -=head2 Location of Perl - -It may seem obvious to say, but Perl is useful only when users can -easily find it. When possible, it's good for both F -and F to be symlinks to the actual binary. If -that can't be done, system administrators are strongly encouraged -to put (symlinks to) perl and its accompanying utilities into a -directory typically found along a user's PATH, or in some other -obvious and convenient place. - -In this documentation, C<#!/usr/bin/perl> on the first line of the program -will stand in for whatever method works on your system. You are -advised to use a specific path if you care about a specific version. - - #!/usr/local/bin/perl5.00554 - -or if you just want to be running at least version, place a statement -like this at the top of your program: - - use 5.005_54; - -=head2 Command Switches - -As with all standard commands, a single-character switch may be -clustered with the following switch, if any. - - #!/usr/bin/perl -spi.orig # same as -s -p -i.orig - -Switches include: - -=over 5 - -=item B<-0>[I] - -specifies the input record separator (C<$/>) as an octal number. If there are -no digits, the null character is the separator. Other switches may -precede or follow the digits. For example, if you have a version of -B which can print filenames terminated by the null character, you -can say this: - - find . -name '*.orig' -print0 | perl -n0e unlink - -The special value 00 will cause Perl to slurp files in paragraph mode. -The value 0777 will cause Perl to slurp files whole because there is no -legal character with that value. - -=item B<-a> - -turns on autosplit mode when used with a B<-n> or B<-p>. An implicit -split command to the @F array is done as the first thing inside the -implicit while loop produced by the B<-n> or B<-p>. - - perl -ane 'print pop(@F), "\n";' - -is equivalent to - - while (<>) { - @F = split(' '); - print pop(@F), "\n"; - } - -An alternate delimiter may be specified using B<-F>. - -=item B<-C> - -enables Perl to use the native wide character APIs on the target system. -The magic variable C<${^WIDE_SYSTEM_CALLS}> reflects the state of -this switch. See L. - -This feature is currently only implemented on the Win32 platform. - -=item B<-c> - -causes Perl to check the syntax of the program and then exit without -executing it. Actually, it I execute C, C, and -C blocks, because these are considered as occurring outside the -execution of your program. C and C blocks, however, will -be skipped. - -=item B<-d> - -runs the program under the Perl debugger. See L. - -=item B<-d:>I - -runs the program under the control of a debugging, profiling, or -tracing module installed as Devel::foo. E.g., B<-d:DProf> executes -the program using the Devel::DProf profiler. As with the B<-M> -flag, options may be passed to the Devel::foo package where they -will be received and interpreted by the Devel::foo::import routine. -The comma-separated list of options must follow a C<=> character. -See L. - -=item B<-D>I - -=item B<-D>I - -sets debugging flags. To watch how it executes your program, use -B<-Dtls>. (This works only if debugging is compiled into your -Perl.) Another nice value is B<-Dx>, which lists your compiled -syntax tree. And B<-Dr> displays compiled regular expressions. As an -alternative, specify a number instead of list of letters (e.g., B<-D14> is -equivalent to B<-Dtls>): - - 1 p Tokenizing and parsing - 2 s Stack snapshots - 4 l Context (loop) stack processing - 8 t Trace execution - 16 o Method and overloading resolution - 32 c String/numeric conversions - 64 P Print preprocessor command for -P, source file input state - 128 m Memory allocation - 256 f Format processing - 512 r Regular expression parsing and execution - 1024 x Syntax tree dump - 2048 u Tainting checks - 4096 L Memory leaks (needs -DLEAKTEST when compiling Perl) - 8192 H Hash dump -- usurps values() - 16384 X Scratchpad allocation - 32768 D Cleaning up - 65536 S Thread synchronization - 131072 T Tokenising - -All these flags require B<-DDEBUGGING> when you compile the Perl -executable. See the F file in the Perl source distribution -for how to do this. This flag is automatically set if you include B<-g> -option when C asks you about optimizer/debugger flags. - -If you're just trying to get a print out of each line of Perl code -as it executes, the way that C provides for shell scripts, -you can't use Perl's B<-D> switch. Instead do this - - # Bourne shell syntax - $ PERLDB_OPTS="NonStop=1 AutoTrace=1 frame=2" perl -dS program - - # csh syntax - % (setenv PERLDB_OPTS "NonStop=1 AutoTrace=1 frame=2"; perl -dS program) - -See L for details and variations. - -=item B<-e> I - -may be used to enter one line of program. If B<-e> is given, Perl -will not look for a filename in the argument list. Multiple B<-e> -commands may be given to build up a multi-line script. Make sure -to use semicolons where you would in a normal program. - -=item B<-F>I - -specifies the pattern to split on if B<-a> is also in effect. The -pattern may be surrounded by C, C<"">, or C<''>, otherwise it will be -put in single quotes. - -=item B<-h> - -prints a summary of the options. - -=item B<-i>[I] - -specifies that files processed by the CE> construct are to be -edited in-place. It does this by renaming the input file, opening the -output file by the original name, and selecting that output file as the -default for print() statements. The extension, if supplied, is used to -modify the name of the old file to make a backup copy, following these -rules: - -If no extension is supplied, no backup is made and the current file is -overwritten. - -If the extension doesn't contain a C<*>, then it is appended to the -end of the current filename as a suffix. If the extension does -contain one or more C<*> characters, then each C<*> is replaced -with the current filename. In Perl terms, you could think of this -as: - - ($backup = $extension) =~ s/\*/$file_name/g; - -This allows you to add a prefix to the backup file, instead of (or in -addition to) a suffix: - - $ perl -pi 'orig_*' -e 's/bar/baz/' fileA # backup to 'orig_fileA' - -Or even to place backup copies of the original files into another -directory (provided the directory already exists): - - $ perl -pi 'old/*.orig' -e 's/bar/baz/' fileA # backup to 'old/fileA.orig' - -These sets of one-liners are equivalent: - - $ perl -pi -e 's/bar/baz/' fileA # overwrite current file - $ perl -pi '*' -e 's/bar/baz/' fileA # overwrite current file - - $ perl -pi '.orig' -e 's/bar/baz/' fileA # backup to 'fileA.orig' - $ perl -pi '*.orig' -e 's/bar/baz/' fileA # backup to 'fileA.orig' - -From the shell, saying - - $ perl -p -i.orig -e "s/foo/bar/; ... " - -is the same as using the program: - - #!/usr/bin/perl -pi.orig - s/foo/bar/; - -which is equivalent to - - #!/usr/bin/perl - $extension = '.orig'; - LINE: while (<>) { - if ($ARGV ne $oldargv) { - if ($extension !~ /\*/) { - $backup = $ARGV . $extension; - } - else { - ($backup = $extension) =~ s/\*/$ARGV/g; - } - rename($ARGV, $backup); - open(ARGVOUT, ">$ARGV"); - select(ARGVOUT); - $oldargv = $ARGV; - } - s/foo/bar/; - } - continue { - print; # this prints to original filename - } - select(STDOUT); - -except that the B<-i> form doesn't need to compare $ARGV to $oldargv to -know when the filename has changed. It does, however, use ARGVOUT for -the selected filehandle. Note that STDOUT is restored as the default -output filehandle after the loop. - -As shown above, Perl creates the backup file whether or not any output -is actually changed. So this is just a fancy way to copy files: - - $ perl -p -i '/some/file/path/*' -e 1 file1 file2 file3... -or - $ perl -p -i '.orig' -e 1 file1 file2 file3... - -You can use C without parentheses to locate the end of each input -file, in case you want to append to each file, or reset line numbering -(see example in L). - -If, for a given file, Perl is unable to create the backup file as -specified in the extension then it will skip that file and continue on -with the next one (if it exists). - -For a discussion of issues surrounding file permissions and B<-i>, -see L. - -You cannot use B<-i> to create directories or to strip extensions from -files. - -Perl does not expand C<~> in filenames, which is good, since some -folks use it for their backup files: - - $ perl -pi~ -e 's/foo/bar/' file1 file2 file3... - -Finally, the B<-i> switch does not impede execution when no -files are given on the command line. In this case, no backup is made -(the original file cannot, of course, be determined) and processing -proceeds from STDIN to STDOUT as might be expected. - -=item B<-I>I - -Directories specified by B<-I> are prepended to the search path for -modules (C<@INC>), and also tells the C preprocessor where to search for -include files. The C preprocessor is invoked with B<-P>; by default it -searches /usr/include and /usr/lib/perl. - -=item B<-l>[I] - -enables automatic line-ending processing. It has two separate -effects. First, it automatically chomps C<$/> (the input record -separator) when used with B<-n> or B<-p>. Second, it assigns C<$\> -(the output record separator) to have the value of I so -that any print statements will have that separator added back on. -If I is omitted, sets C<$\> to the current value of -C<$/>. For instance, to trim lines to 80 columns: - - perl -lpe 'substr($_, 80) = ""' - -Note that the assignment C<$\ = $/> is done when the switch is processed, -so the input record separator can be different than the output record -separator if the B<-l> switch is followed by a B<-0> switch: - - gnufind / -print0 | perl -ln0e 'print "found $_" if -p' - -This sets C<$\> to newline and then sets C<$/> to the null character. - -=item B<-m>[B<->]I - -=item B<-M>[B<->]I - -=item B<-M>[B<->]I<'module ...'> - -=item B<-[mM]>[B<->]I - -B<-m>I executes C I C<();> before executing your -program. - -B<-M>I executes C I C<;> before executing your -program. You can use quotes to add extra code after the module name, -e.g., C<'-Mmodule qw(foo bar)'>. - -If the first character after the B<-M> or B<-m> is a dash (C<->) -then the 'use' is replaced with 'no'. - -A little builtin syntactic sugar means you can also say -B<-mmodule=foo,bar> or B<-Mmodule=foo,bar> as a shortcut for -C<'-Mmodule qw(foo bar)'>. This avoids the need to use quotes when -importing symbols. The actual code generated by B<-Mmodule=foo,bar> is -C. Note that the C<=> form -removes the distinction between B<-m> and B<-M>. - -=item B<-n> - -causes Perl to assume the following loop around your program, which -makes it iterate over filename arguments somewhat like B or -B: - - LINE: - while (<>) { - ... # your program goes here - } - -Note that the lines are not printed by default. See B<-p> to have -lines printed. If a file named by an argument cannot be opened for -some reason, Perl warns you about it and moves on to the next file. - -Here is an efficient way to delete all files older than a week: - - find . -mtime +7 -print | perl -nle unlink - -This is faster than using the B<-exec> switch of B because you don't -have to start a process on every filename found. It does suffer from -the bug of mishandling newlines in pathnames, which you can fix if -you - -C and C blocks may be used to capture control before or after -the implicit program loop, just as in B. - -=item B<-p> - -causes Perl to assume the following loop around your program, which -makes it iterate over filename arguments somewhat like B: - - - LINE: - while (<>) { - ... # your program goes here - } continue { - print or die "-p destination: $!\n"; - } - -If a file named by an argument cannot be opened for some reason, Perl -warns you about it, and moves on to the next file. Note that the -lines are printed automatically. An error occurring during printing is -treated as fatal. To suppress printing use the B<-n> switch. A B<-p> -overrides a B<-n> switch. - -C and C blocks may be used to capture control before or after -the implicit loop, just as in B. - -=item B<-P> - -causes your program to be run through the C preprocessor before -compilation by Perl. Because both comments and B directives begin -with the # character, you should avoid starting comments with any words -recognized by the C preprocessor such as C<"if">, C<"else">, or C<"define">. -Also, in some platforms the C preprocessor knows too much: it knows -about the C++ -style until-end-of-line comments starting with C<"//">. -This will cause problems with common Perl constructs like - - s/foo//; - -because after -P this will became illegal code - - s/foo - -The workaround is to use some other quoting separator than C<"/">, -like for example C<"!">: - - s!foo!!; - -=item B<-s> - -enables rudimentary switch parsing for switches on the command -line after the program name but before any filename arguments (or before -an argument of B<-->). This means you can have switches with two leading -dashes (B<--help>). Any switch found there is removed from @ARGV and sets the -corresponding variable in the Perl program. The following program -prints "1" if the program is invoked with a B<-xyz> switch, and "abc" -if it is invoked with B<-xyz=abc>. - - #!/usr/bin/perl -s - if ($xyz) { print "$xyz\n" } - -Do note that B<--help> creates the variable ${-help}, which is not compliant -with C. - -=item B<-S> - -makes Perl use the PATH environment variable to search for the -program (unless the name of the program contains directory separators). - -On some platforms, this also makes Perl append suffixes to the -filename while searching for it. For example, on Win32 platforms, -the ".bat" and ".cmd" suffixes are appended if a lookup for the -original name fails, and if the name does not already end in one -of those suffixes. If your Perl was compiled with DEBUGGING turned -on, using the -Dp switch to Perl shows how the search progresses. - -Typically this is used to emulate #! startup on platforms that -don't support #!. This example works on many platforms that -have a shell compatible with Bourne shell: - - #!/usr/bin/perl - eval 'exec /usr/bin/perl -wS $0 ${1+"$@"}' - if $running_under_some_shell; - -The system ignores the first line and feeds the program to F, -which proceeds to try to execute the Perl program as a shell script. -The shell executes the second line as a normal shell command, and thus -starts up the Perl interpreter. On some systems $0 doesn't always -contain the full pathname, so the B<-S> tells Perl to search for the -program if necessary. After Perl locates the program, it parses the -lines and ignores them because the variable $running_under_some_shell -is never true. If the program will be interpreted by csh, you will need -to replace C<${1+"$@"}> with C<$*>, even though that doesn't understand -embedded spaces (and such) in the argument list. To start up sh rather -than csh, some systems may have to replace the #! line with a line -containing just a colon, which will be politely ignored by Perl. Other -systems can't control that, and need a totally devious construct that -will work under any of B, B, or Perl, such as the following: - - eval '(exit $?0)' && eval 'exec perl -wS $0 ${1+"$@"}' - & eval 'exec /usr/bin/perl -wS $0 $argv:q' - if $running_under_some_shell; - -If the filename supplied contains directory separators (i.e., is an -absolute or relative pathname), and if that file is not found, -platforms that append file extensions will do so and try to look -for the file with those extensions added, one by one. - -On DOS-like platforms, if the program does not contain directory -separators, it will first be searched for in the current directory -before being searched for on the PATH. On Unix platforms, the -program will be searched for strictly on the PATH. - -=item B<-T> - -forces "taint" checks to be turned on so you can test them. Ordinarily -these checks are done only when running setuid or setgid. It's a -good idea to turn them on explicitly for programs that run on behalf -of someone else whom you might not necessarily trust, such as CGI -programs or any internet servers you might write in Perl. See -L for details. For security reasons, this option must be -seen by Perl quite early; usually this means it must appear early -on the command line or in the #! line for systems which support -that construct. - -=item B<-u> - -This obsolete switch causes Perl to dump core after compiling your -program. You can then in theory take this core dump and turn it -into an executable file by using the B program (not supplied). -This speeds startup at the expense of some disk space (which you -can minimize by stripping the executable). (Still, a "hello world" -executable comes out to about 200K on my machine.) If you want to -execute a portion of your program before dumping, use the dump() -operator instead. Note: availability of B is platform -specific and may not be available for a specific port of Perl. - -This switch has been superseded in favor of the new Perl code -generator backends to the compiler. See L and L -for details. - -=item B<-U> - -allows Perl to do unsafe operations. Currently the only "unsafe" -operations are the unlinking of directories while running as superuser, -and running setuid programs with fatal taint checks turned into -warnings. Note that the B<-w> switch (or the C<$^W> variable) must -be used along with this option to actually I the -taint-check warnings. - -=item B<-v> - -prints the version and patchlevel of your perl executable. - -=item B<-V> - -prints summary of the major perl configuration values and the current -values of @INC. - -=item B<-V:>I - -Prints to STDOUT the value of the named configuration variable. -For example, - - $ perl -V:man.dir - -will provide strong clues about what your MANPATH variable should -be set to in order to access the Perl documentation. - -=item B<-w> - -prints warnings about dubious constructs, such as variable names -that are mentioned only once and scalar variables that are used -before being set, redefined subroutines, references to undefined -filehandles or filehandles opened read-only that you are attempting -to write on, values used as a number that doesn't look like numbers, -using an array as though it were a scalar, if your subroutines -recurse more than 100 deep, and innumerable other things. - -This switch really just enables the internal C<^$W> variable. You -can disable or promote into fatal errors specific warnings using -C<__WARN__> hooks, as described in L and L. -See also L and L. A new, fine-grained warning -facility is also available if you want to manipulate entire classes -of warnings; see L or L. - -=item B<-W> - -Enables all warnings regardless of C or C<$^W>. -See L. - -=item B<-X> - -Disables all warnings regardless of C or C<$^W>. -See L. - -=item B<-x> I - -tells Perl that the program is embedded in a larger chunk of unrelated -ASCII text, such as in a mail message. Leading garbage will be -discarded until the first line that starts with #! and contains the -string "perl". Any meaningful switches on that line will be applied. -If a directory name is specified, Perl will switch to that directory -before running the program. The B<-x> switch controls only the -disposal of leading garbage. The program must be terminated with -C<__END__> if there is trailing garbage to be ignored (the program -can process any or all of the trailing garbage via the DATA filehandle -if desired). - -=back - -=head1 ENVIRONMENT - -=over 12 - -=item HOME - -Used if chdir has no argument. - -=item LOGDIR - -Used if chdir has no argument and HOME is not set. - -=item PATH - -Used in executing subprocesses, and in finding the program if B<-S> is -used. - -=item PERL5LIB - -A colon-separated list of directories in which to look for Perl library -files before looking in the standard library and the current -directory. Any architecture-specific directories under the specified -locations are automatically included if they exist. If PERL5LIB is not -defined, PERLLIB is used. - -When running taint checks (either because the program was running setuid -or setgid, or the B<-T> switch was used), neither variable is used. -The program should instead say: - - use lib "/my/directory"; - -=item PERL5OPT - -Command-line options (switches). Switches in this variable are taken -as if they were on every Perl command line. Only the B<-[DIMUdmw]> -switches are allowed. When running taint checks (because the program -was running setuid or setgid, or the B<-T> switch was used), this -variable is ignored. If PERL5OPT begins with B<-T>, tainting will be -enabled, and any subsequent options ignored. - -=item PERLLIB - -A colon-separated list of directories in which to look for Perl library -files before looking in the standard library and the current directory. -If PERL5LIB is defined, PERLLIB is not used. - -=item PERL5DB - -The command used to load the debugger code. The default is: - - BEGIN { require 'perl5db.pl' } - -=item PERL5SHELL (specific to the Win32 port) - -May be set to an alternative shell that perl must use internally for -executing "backtick" commands or system(). Default is C -on WindowsNT and C on Windows95. The value is considered -to be space-separated. Precede any character that needs to be protected -(like a space or backslash) with a backslash. - -Note that Perl doesn't use COMSPEC for this purpose because -COMSPEC has a high degree of variability among users, leading to -portability concerns. Besides, perl can use a shell that may not be -fit for interactive use, and setting COMSPEC to such a shell may -interfere with the proper functioning of other programs (which usually -look in COMSPEC to find a shell fit for interactive use). - -=item PERL_DEBUG_MSTATS - -Relevant only if perl is compiled with the malloc included with the perl -distribution (that is, if C is 'define'). -If set, this causes memory statistics to be dumped after execution. If set -to an integer greater than one, also causes memory statistics to be dumped -after compilation. - -=item PERL_DESTRUCT_LEVEL - -Relevant only if your perl executable was built with B<-DDEBUGGING>, -this controls the behavior of global destruction of objects and other -references. - -=item PERL_ROOT (specific to the VMS port) - -A translation concealed rooted logical name that contains perl and the -logical device for the @INC path on VMS only. Other logical names that -affect perl on VMS include PERLSHR, PERL_ENV_TABLES, and -SYS$TIMEZONE_DIFFERENTIAL but are optional and discussed further in -L and in F in the Perl source distribution. - -=item SYS$LOGIN (specific to the VMS port) - -Used if chdir has no argument and HOME and LOGDIR are not set. - -=back - -Perl also has environment variables that control how Perl handles data -specific to particular natural languages. See L. - -Apart from these, Perl uses no other environment variables, except -to make them available to the program being executed, and to child -processes. However, programs running setuid would do well to execute -the following lines before doing anything else, just to keep people -honest: - - $ENV{PATH} = '/bin:/usr/bin'; # or whatever you need - $ENV{SHELL} = '/bin/sh' if exists $ENV{SHELL}; - delete @ENV{qw(IFS CDPATH ENV BASH_ENV)}; diff --git a/lib/perl5/5.6.1/pods/perlsec.pod b/lib/perl5/5.6.1/pods/perlsec.pod deleted file mode 100644 index 3870c2ef..00000000 --- a/lib/perl5/5.6.1/pods/perlsec.pod +++ /dev/null @@ -1,365 +0,0 @@ -=head1 NAME - -perlsec - Perl security - -=head1 DESCRIPTION - -Perl is designed to make it easy to program securely even when running -with extra privileges, like setuid or setgid programs. Unlike most -command line shells, which are based on multiple substitution passes on -each line of the script, Perl uses a more conventional evaluation scheme -with fewer hidden snags. Additionally, because the language has more -builtin functionality, it can rely less upon external (and possibly -untrustworthy) programs to accomplish its purposes. - -Perl automatically enables a set of special security checks, called I, when it detects its program running with differing real and effective -user or group IDs. The setuid bit in Unix permissions is mode 04000, the -setgid bit mode 02000; either or both may be set. You can also enable taint -mode explicitly by using the B<-T> command line flag. This flag is -I suggested for server programs and any program run on behalf of -someone else, such as a CGI script. Once taint mode is on, it's on for -the remainder of your script. - -While in this mode, Perl takes special precautions called I to prevent both obvious and subtle traps. Some of these checks -are reasonably simple, such as verifying that path directories aren't -writable by others; careful programmers have always used checks like -these. Other checks, however, are best supported by the language itself, -and it is these checks especially that contribute to making a set-id Perl -program more secure than the corresponding C program. - -You may not use data derived from outside your program to affect -something else outside your program--at least, not by accident. All -command line arguments, environment variables, locale information (see -L), results of certain system calls (readdir(), -readlink(), the variable of shmread(), the messages returned by -msgrcv(), the password, gcos and shell fields returned by the -getpwxxx() calls), and all file input are marked as "tainted". -Tainted data may not be used directly or indirectly in any command -that invokes a sub-shell, nor in any command that modifies files, -directories, or processes, B: - -=over 4 - -=item * - -If you pass a list of arguments to either C or C, -the elements of that list are B checked for taintedness. - -=item * - -Arguments to C and C are B checked for taintedness. - -=back - -Any variable set to a value -derived from tainted data will itself be tainted, even if it is -logically impossible for the tainted data to alter the variable. -Because taintedness is associated with each scalar value, some -elements of an array can be tainted and others not. - -For example: - - $arg = shift; # $arg is tainted - $hid = $arg, 'bar'; # $hid is also tainted - $line = <>; # Tainted - $line = ; # Also tainted - open FOO, "/home/me/bar" or die $!; - $line = ; # Still tainted - $path = $ENV{'PATH'}; # Tainted, but see below - $data = 'abc'; # Not tainted - - system "echo $arg"; # Insecure - system "/bin/echo", $arg; # Secure (doesn't use sh) - system "echo $hid"; # Insecure - system "echo $data"; # Insecure until PATH set - - $path = $ENV{'PATH'}; # $path now tainted - - $ENV{'PATH'} = '/bin:/usr/bin'; - delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'}; - - $path = $ENV{'PATH'}; # $path now NOT tainted - system "echo $data"; # Is secure now! - - open(FOO, "< $arg"); # OK - read-only file - open(FOO, "> $arg"); # Not OK - trying to write - - open(FOO,"echo $arg|"); # Not OK, but... - open(FOO,"-|") - or exec 'echo', $arg; # OK - - $shout = `echo $arg`; # Insecure, $shout now tainted - - unlink $data, $arg; # Insecure - umask $arg; # Insecure - - exec "echo $arg"; # Insecure - exec "echo", $arg; # Secure (doesn't use the shell) - exec "sh", '-c', $arg; # Considered secure, alas! - - @files = <*.c>; # insecure (uses readdir() or similar) - @files = glob('*.c'); # insecure (uses readdir() or similar) - -If you try to do something insecure, you will get a fatal error saying -something like "Insecure dependency" or "Insecure $ENV{PATH}". Note that you -can still write an insecure B or B, but only by explicitly -doing something like the "considered secure" example above. - -=head2 Laundering and Detecting Tainted Data - -To test whether a variable contains tainted data, and whose use would thus -trigger an "Insecure dependency" message, check your nearby CPAN mirror -for the F module, which should become available around November -1997. Or you may be able to use the following I function. - - sub is_tainted { - return ! eval { - join('',@_), kill 0; - 1; - }; - } - -This function makes use of the fact that the presence of tainted data -anywhere within an expression renders the entire expression tainted. It -would be inefficient for every operator to test every argument for -taintedness. Instead, the slightly more efficient and conservative -approach is used that if any tainted value has been accessed within the -same expression, the whole expression is considered tainted. - -But testing for taintedness gets you only so far. Sometimes you have just -to clear your data's taintedness. The only way to bypass the tainting -mechanism is by referencing subpatterns from a regular expression match. -Perl presumes that if you reference a substring using $1, $2, etc., that -you knew what you were doing when you wrote the pattern. That means using -a bit of thought--don't just blindly untaint anything, or you defeat the -entire mechanism. It's better to verify that the variable has only good -characters (for certain values of "good") rather than checking whether it -has any bad characters. That's because it's far too easy to miss bad -characters that you never thought of. - -Here's a test to make sure that the data contains nothing but "word" -characters (alphabetics, numerics, and underscores), a hyphen, an at sign, -or a dot. - - if ($data =~ /^([-\@\w.]+)$/) { - $data = $1; # $data now untainted - } else { - die "Bad data in $data"; # log this somewhere - } - -This is fairly secure because C doesn't normally match shell -metacharacters, nor are dot, dash, or at going to mean something special -to the shell. Use of C would have been insecure in theory because -it lets everything through, but Perl doesn't check for that. The lesson -is that when untainting, you must be exceedingly careful with your patterns. -Laundering data using regular expression is the I mechanism for -untainting dirty data, unless you use the strategy detailed below to fork -a child of lesser privilege. - -The example does not untaint $data if C is in effect, -because the characters matched by C<\w> are determined by the locale. -Perl considers that locale definitions are untrustworthy because they -contain data from outside the program. If you are writing a -locale-aware program, and want to launder data with a regular expression -containing C<\w>, put C ahead of the expression in the same -block. See L for further discussion and examples. - -=head2 Switches On the "#!" Line - -When you make a script executable, in order to make it usable as a -command, the system will pass switches to perl from the script's #! -line. Perl checks that any command line switches given to a setuid -(or setgid) script actually match the ones set on the #! line. Some -Unix and Unix-like environments impose a one-switch limit on the #! -line, so you may need to use something like C<-wU> instead of C<-w -U> -under such systems. (This issue should arise only in Unix or -Unix-like environments that support #! and setuid or setgid scripts.) - -=head2 Cleaning Up Your Path - -For "Insecure C<$ENV{PATH}>" messages, you need to set C<$ENV{'PATH'}> to a -known value, and each directory in the path must be non-writable by others -than its owner and group. You may be surprised to get this message even -if the pathname to your executable is fully qualified. This is I -generated because you didn't supply a full path to the program; instead, -it's generated because you never set your PATH environment variable, or -you didn't set it to something that was safe. Because Perl can't -guarantee that the executable in question isn't itself going to turn -around and execute some other program that is dependent on your PATH, it -makes sure you set the PATH. - -The PATH isn't the only environment variable which can cause problems. -Because some shells may use the variables IFS, CDPATH, ENV, and -BASH_ENV, Perl checks that those are either empty or untainted when -starting subprocesses. You may wish to add something like this to your -setid and taint-checking scripts. - - delete @ENV{qw(IFS CDPATH ENV BASH_ENV)}; # Make %ENV safer - -It's also possible to get into trouble with other operations that don't -care whether they use tainted values. Make judicious use of the file -tests in dealing with any user-supplied filenames. When possible, do -opens and such B properly dropping any special user (or group!) -privileges. Perl doesn't prevent you from opening tainted filenames for reading, -so be careful what you print out. The tainting mechanism is intended to -prevent stupid mistakes, not to remove the need for thought. - -Perl does not call the shell to expand wild cards when you pass B -and B explicit parameter lists instead of strings with possible shell -wildcards in them. Unfortunately, the B, B, and -backtick functions provide no such alternate calling convention, so more -subterfuge will be required. - -Perl provides a reasonably safe way to open a file or pipe from a setuid -or setgid program: just create a child process with reduced privilege who -does the dirty work for you. First, fork a child using the special -B syntax that connects the parent and child by a pipe. Now the -child resets its ID set and any other per-process attributes, like -environment variables, umasks, current working directories, back to the -originals or known safe values. Then the child process, which no longer -has any special permissions, does the B or other system call. -Finally, the child passes the data it managed to access back to the -parent. Because the file or pipe was opened in the child while running -under less privilege than the parent, it's not apt to be tricked into -doing something it shouldn't. - -Here's a way to do backticks reasonably safely. Notice how the B is -not called with a string that the shell could expand. This is by far the -best way to call something that might be subjected to shell escapes: just -never call the shell at all. - - use English; - die "Can't fork: $!" unless defined($pid = open(KID, "-|")); - if ($pid) { # parent - while () { - # do something - } - close KID; - } else { - my @temp = ($EUID, $EGID); - my $orig_uid = $UID; - my $orig_gid = $GID; - $EUID = $UID; - $EGID = $GID; - # Drop privileges - $UID = $orig_uid; - $GID = $orig_gid; - # Make sure privs are really gone - ($EUID, $EGID) = @temp; - die "Can't drop privileges" - unless $UID == $EUID && $GID eq $EGID; - $ENV{PATH} = "/bin:/usr/bin"; # Minimal PATH. - # Consider sanitizing the environment even more. - exec 'myprog', 'arg1', 'arg2' - or die "can't exec myprog: $!"; - } - -A similar strategy would work for wildcard expansion via C, although -you can use C instead. - -Taint checking is most useful when although you trust yourself not to have -written a program to give away the farm, you don't necessarily trust those -who end up using it not to try to trick it into doing something bad. This -is the kind of security checking that's useful for set-id programs and -programs launched on someone else's behalf, like CGI programs. - -This is quite different, however, from not even trusting the writer of the -code not to try to do something evil. That's the kind of trust needed -when someone hands you a program you've never seen before and says, "Here, -run this." For that kind of safety, check out the Safe module, -included standard in the Perl distribution. This module allows the -programmer to set up special compartments in which all system operations -are trapped and namespace access is carefully controlled. - -=head2 Security Bugs - -Beyond the obvious problems that stem from giving special privileges to -systems as flexible as scripts, on many versions of Unix, set-id scripts -are inherently insecure right from the start. The problem is a race -condition in the kernel. Between the time the kernel opens the file to -see which interpreter to run and when the (now-set-id) interpreter turns -around and reopens the file to interpret it, the file in question may have -changed, especially if you have symbolic links on your system. - -Fortunately, sometimes this kernel "feature" can be disabled. -Unfortunately, there are two ways to disable it. The system can simply -outlaw scripts with any set-id bit set, which doesn't help much. -Alternately, it can simply ignore the set-id bits on scripts. If the -latter is true, Perl can emulate the setuid and setgid mechanism when it -notices the otherwise useless setuid/gid bits on Perl scripts. It does -this via a special executable called B that is automatically -invoked for you if it's needed. - -However, if the kernel set-id script feature isn't disabled, Perl will -complain loudly that your set-id script is insecure. You'll need to -either disable the kernel set-id script feature, or put a C wrapper around -the script. A C wrapper is just a compiled program that does nothing -except call your Perl program. Compiled programs are not subject to the -kernel bug that plagues set-id scripts. Here's a simple wrapper, written -in C: - - #define REAL_PATH "/path/to/script" - main(ac, av) - char **av; - { - execv(REAL_PATH, av); - } - -Compile this wrapper into a binary executable and then make I rather -than your script setuid or setgid. - -In recent years, vendors have begun to supply systems free of this -inherent security bug. On such systems, when the kernel passes the name -of the set-id script to open to the interpreter, rather than using a -pathname subject to meddling, it instead passes I. This is a -special file already opened on the script, so that there can be no race -condition for evil scripts to exploit. On these systems, Perl should be -compiled with C<-DSETUID_SCRIPTS_ARE_SECURE_NOW>. The B -program that builds Perl tries to figure this out for itself, so you -should never have to specify this yourself. Most modern releases of -SysVr4 and BSD 4.4 use this approach to avoid the kernel race condition. - -Prior to release 5.6.1 of Perl, bugs in the code of B could -introduce a security hole. - -=head2 Protecting Your Programs - -There are a number of ways to hide the source to your Perl programs, -with varying levels of "security". - -First of all, however, you I take away read permission, because -the source code has to be readable in order to be compiled and -interpreted. (That doesn't mean that a CGI script's source is -readable by people on the web, though.) So you have to leave the -permissions at the socially friendly 0755 level. This lets -people on your local system only see your source. - -Some people mistakenly regard this as a security problem. If your program does -insecure things, and relies on people not knowing how to exploit those -insecurities, it is not secure. It is often possible for someone to -determine the insecure things and exploit them without viewing the -source. Security through obscurity, the name for hiding your bugs -instead of fixing them, is little security indeed. - -You can try using encryption via source filters (Filter::* from CPAN). -But crackers might be able to decrypt it. You can try using the -byte code compiler and interpreter described below, but crackers might -be able to de-compile it. You can try using the native-code compiler -described below, but crackers might be able to disassemble it. These -pose varying degrees of difficulty to people wanting to get at your -code, but none can definitively conceal it (this is true of every -language, not just Perl). - -If you're concerned about people profiting from your code, then the -bottom line is that nothing but a restrictive licence will give you -legal security. License your software and pepper it with threatening -statements like "This is unpublished proprietary software of XYZ Corp. -Your access to it does not give you permission to use it blah blah -blah." You should see a lawyer to be sure your licence's wording will -stand up in court. - -=head1 SEE ALSO - -L for its description of cleaning up environment variables. diff --git a/lib/perl5/5.6.1/pods/perlsolaris.pod b/lib/perl5/5.6.1/pods/perlsolaris.pod deleted file mode 100644 index 86b7d9b4..00000000 --- a/lib/perl5/5.6.1/pods/perlsolaris.pod +++ /dev/null @@ -1,526 +0,0 @@ -If you read this file _as_is_, just ignore the funny characters you -see. It is written in the POD format (see pod/perlpod.pod) which is -specifically designed to be readable as is. - -=head1 NAME - -README.solaris - Perl version 5 on Solaris systems - -=head1 DESCRIPTION - -This document describes various features of Sun's Solaris operating system -that will affect how Perl version 5 (hereafter just perl) is -compiled and/or runs. Some issues relating to the older SunOS 4.x are -also discussed, though they may be out of date. - -For the most part, everything should just work. - -Starting with Solaris 8, perl5.00503 (or higher) is supplied with the -operating system, so you might not even need to build a newer version -of perl at all. The Sun-supplied version is installed in /usr/perl5 -with /usr/bin/perl pointing to /usr/perl5/bin/perl. Do not disturb -that installation unless you really know what you are doing. If you -remove the perl supplied with the OS, there is a good chance you will -render some bits of your system inoperable. If you wish to install a -newer version of perl, install it under a different prefix from -/usr/perl5. Common prefixes to use are /usr/local and /opt/perl. - -You may wish to put your version of perl in the PATH of all users by -changing the link /usr/bin/perl. This is OK, as all Perl scripts -shipped with Solaris use /usr/perl5/bin/perl. - -=head2 Solaris Version Numbers. - -For consistency with common usage, perl's Configure script performs -some minor manipulations on the operating system name and version -number as reported by uname. Here's a partial translation table: - - Sun: perl's Configure: - uname uname -r Name osname osvers - SunOS 4.1.3 Solaris 1.1 sunos 4.1.3 - SunOS 5.6 Solaris 2.6 solaris 2.6 - SunOS 5.8 Solaris 8 solaris 2.8 - -The complete table can be found in the Sun Managers' FAQ -L under -"9.1) Which Sun models run which versions of SunOS?". - -=head1 RESOURCES - -There are many, many source for Solaris information. A few of the -important ones for perl: - -=over 4 - -=item Solaris FAQ - -The Solaris FAQ is available at -L. - -The Sun Managers' FAQ is available at -L - -=item Precompiled Binaries - -Precompiled binaries, links to many sites, and much, much more is -available at L. - -=item Solaris Documentation - -All Solaris documentation is available on-line at L. - -=back - -=head1 SETTING UP - -=head2 File Extraction Problems. - -Be sure to use a tar program compiled under Solaris (not SunOS 4.x) -to extract the perl-5.x.x.tar.gz file. Do not use GNU tar compiled -for SunOS4 on Solaris. (GNU tar compiled for Solaris should be fine.) -When you run SunOS4 binaries on Solaris, the run-time system magically -alters pathnames matching m#lib/locale# so that when tar tries to create -lib/locale.pm, a file named lib/oldlocale.pm gets created instead. -If you found this advice it too late and used a SunOS4-compiled tar -anyway, you must find the incorrectly renamed file and move it back -to lib/locale.pm. - -=head2 Compiler and Related Tools. - -You must use an ANSI C compiler to build perl. Perl can be compiled -with either Sun's add-on C compiler or with gcc. The C compiler that -shipped with SunOS4 will not do. - -=head3 Include /usr/ccs/bin/ in your PATH. - -Several tools needed to build perl are located in /usr/ccs/bin/: ar, -as, ld, and make. Make sure that /usr/ccs/bin/ is in your PATH. - -You need to make sure the following packages are installed -(this info is extracted from the Solaris FAQ): - -for tools (sccs, lex, yacc, make, nm, truss, ld, as): SUNWbtool, -SUNWsprot, SUNWtoo - -for libraries & headers: SUNWhea, SUNWarc, SUNWlibm, SUNWlibms, SUNWdfbh, -SUNWcg6h, SUNWxwinc, SUNWolinc - -for 64 bit development: SUNWarcx, SUNWbtoox, SUNWdplx, SUNWscpux, -SUNWsprox, SUNWtoox, SUNWlmsx, SUNWlmx, SUNWlibCx - -If you are in doubt which package contains a file you are missing, -try to find an installation that has that file. Then do a - - grep /my/missing/file /var/sadm/install/contents - -This will display a line like this: - -/usr/include/sys/errno.h f none 0644 root bin 7471 37605 956241356 SUNWhea - -The last item listed (SUNWhea in this example) is the package you need. - -=head3 Avoid /usr/ucb/cc. - -You don't need to have /usr/ucb/ in your PATH to build perl. If you -want /usr/ucb/ in your PATH anyway, make sure that /usr/ucb/ is NOT -in your PATH before the directory containing the right C compiler. - -=head3 Sun's C Compiler - -If you use Sun's C compiler, make sure the correct directory -(usually /opt/SUNWspro/bin/) is in your PATH (before /usr/ucb/). - -=head3 GCC - -If you use gcc, make sure your installation is recent and -complete. As a point of reference, perl-5.6.0 built fine with -gcc-2.8.1 on both Solaris 2.6 and Solaris 8. You'll be able to -Configure perl with - - sh Configure -Dcc=gcc - -If you have updated your Solaris version, you may also have to update -your GCC. For example, if you are running Solaris 2.6 and your gcc is -installed under /usr/local, check in /usr/local/lib/gcc-lib and make -sure you have the appropriate directory, sparc-sun-solaris2.6/ or -i386-pc-solaris2.6/. If gcc's directory is for a different version of -Solaris than you are running, then you will need to rebuild gcc for -your new version of Solaris. - -You can get a precompiled version of gcc from -L. Make sure you pick up the package for -your Solaris release. - -=head3 GNU as and GNU ld - -The versions of as and ld supplied with Solaris work fine for building -perl. There is normally no need to install the GNU versions. - -If you decide to ignore this advice and use the GNU versions anyway, -then be sure that they are relatively recent. Versions newer than 2.7 -are apparently new enough. Older versions may have trouble with -dynamic loading. - -If your gcc is configured to use GNU as and ld but you want to use the -Solaris ones instead to build perl, then you'll need to add --B/usr/ccs/bin/ to the gcc command line. One convenient way to do -that is with - - sh Configure -Dcc='gcc -B/usr/ccs/bin/' - -Note that the trailing slash is required. This will result in some -harmless warnings as Configure is run: - - gcc: file path prefix `/usr/ccs/bin/' never used - -These messages may safely be ignored. -(Note that for a SunOS4 system, you must use -B/bin/ instead.) - -Alternatively, you can use the GCC_EXEC_PREFIX environment variable to -ensure that Sun's as and ld are used. Consult your gcc documentation -for further information on the -B option and the GCC_EXEC_PREFIX variable. - -=head3 GNU make - -Sun's make works fine for building perl. -If you wish to use GNU make anyway, be sure that the set-group-id bit is not -set. If it is, then arrange your PATH so that /usr/ccs/bin/make is -before GNU make or else have the system administrator disable the -set-group-id bit on GNU make. - -=head3 Avoid libucb. - -Solaris provides some BSD-compatibility functions in /usr/ucblib/libucb.a. -Perl will not build and run correctly if linked against -lucb since it -contains routines that are incompatible with the standard Solaris libc. -Normally this is not a problem since the solaris hints file prevents -Configure from even looking in /usr/ucblib for libraries, and also -explicitly omits -lucb. - -=head2 Environment - -=head3 PATH - -Make sure your PATH includes the compiler (/opt/SUNWspro/bin/ if you're -using Sun's compiler) as well as /usr/ccs/bin/ to pick up the other -development tools (such as make, ar, as, and ld). Make sure your path -either doesn't include /usr/ucb or that it includes it after the -compiler and compiler tools and other standard Solaris directories. -You definitely don't want /usr/ucb/cc. - -=head3 LD_LIBRARY_PATH - -If you have the LD_LIBRARY_PATH environment variable set, be sure that -it does NOT include /lib or /usr/lib. If you will be building -extensions that call third-party shared libraries (e.g. Berkeley DB) -then make sure that your LD_LIBRARY_PATH environment variable includes -the directory with that library (e.g. /usr/local/lib). - -If you get an error message - - dlopen: stub interception failed - -it is probably because your LD_LIBRARY_PATH environment variable -includes a directory which is a symlink to /usr/lib (such as /lib). -The reason this causes a problem is quite subtle. The file -libdl.so.1.0 actually *only* contains functions which generate 'stub -interception failed' errors! The runtime linker intercepts links to -"/usr/lib/libdl.so.1.0" and links in internal implementations of those -functions instead. [Thanks to Tim Bunce for this explanation.] - -=head1 RUN CONFIGURE. - -See the INSTALL file for general information regarding Configure. -Only Solaris-specific issues are discussed here. Usually, the -defaults should be fine. - -=head2 64-bit Issues. - -See the INSTALL file for general information regarding 64-bit compiles. -In general, the defaults should be fine for most people. - -By default, perl-5.6.0 (or later) is compiled as a 32-bit application -with largefile and long-long support. - -=head3 General 32-bit vs. 64-bit issues. - -Solaris 7 and above will run in either 32 bit or 64 bit mode on SPARC -CPUs, via a reboot. You can build 64 bit apps whilst running 32 bit -mode and vice-versa. 32 bit apps will run under Solaris running in -either 32 or 64 bit mode. 64 bit apps require Solaris to be running -64 bit mode. - -Existing 32 bit apps are properly known as LP32, i.e. Longs and -Pointers are 32 bit. 64-bit apps are more properly known as LP64. -The discriminating feature of a LP64 bit app is its ability to utilise a -64-bit address space. It is perfectly possible to have a LP32 bit app -that supports both 64-bit integers (long long) and largefiles (> 2GB), -and this is the default for perl-5.6.0. - -For a more complete explanation of 64-bit issues, see the Solaris 64-bit -Developer's Guide at http://docs.sun.com:80/ab2/coll.45.13/SOL64TRANS/ - -You can detect the OS mode using "isainfo -v", e.g. - - fubar$ isainfo -v # Ultra 30 in 64 bit mode - 64-bit sparcv9 applications - 32-bit sparc applications - -By default, perl will be compiled as a 32-bit application. Unless you -want to allocate more than ~ 4GB of memory inside Perl, you probably -don't need Perl to be a 64-bit app. - -=head3 Large File Suppprt - -For Solaris 2.6 and onwards, there are two different ways for 32-bit -applications to manipulate large files (files whose size is > 2GByte). -(A 64-bit application automatically has largefile support built in -by default.) - -First is the "transitional compilation environment", described in -lfcompile64(5). According to the man page, - - The transitional compilation environment exports all the - explicit 64-bit functions (xxx64()) and types in addition to - all the regular functions (xxx()) and types. Both xxx() and - xxx64() functions are available to the program source. A - 32-bit application must use the xxx64() functions in order - to access large files. See the lf64(5) manual page for a - complete listing of the 64-bit transitional interfaces. - -The transitional compilation environment is obtained with the -following compiler and linker flags: - - getconf LFS64_CFLAGS -D_LARGEFILE64_SOURCE - getconf LFS64_LDFLAG # nothing special needed - getconf LFS64_LIBS # nothing special needed - -Second is the "large file compilation environment", described in -lfcompile(5). According to the man page, - - Each interface named xxx() that needs to access 64-bit entities - to access large files maps to a xxx64() call in the - resulting binary. All relevant data types are defined to be - of correct size (for example, off_t has a typedef definition - for a 64-bit entity). - - An application compiled in this environment is able to use - the xxx() source interfaces to access both large and small - files, rather than having to explicitly utilize the transitional - xxx64() interface calls to access large files. - -Two exceptions are fseek() and ftell(). 32-bit applications should -use fseeko(3C) and ftello(3C). These will get automatically mapped -to fseeko64() and ftello64(). - -The large file compilation environment is obtained with - - getconf LFS_CFLAGS -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 - getconf LFS_LDFLAGS # nothing special needed - getconf LFS_LIBS # nothing special needed - -By default, perl uses the large file compilation environment and -relies on Solaris to do the underlying mapping of interfaces. - -=head3 Building an LP64 Perl - -To compile a 64-bit application on an UltraSparc with a recent Sun Compiler, -you need to use the flag "-xarch=v9". getconf(1) will tell you this, e.g. - - fubar$ getconf -a | grep v9 - XBS5_LP64_OFF64_CFLAGS: -xarch=v9 - XBS5_LP64_OFF64_LDFLAGS: -xarch=v9 - XBS5_LP64_OFF64_LINTFLAGS: -xarch=v9 - XBS5_LPBIG_OFFBIG_CFLAGS: -xarch=v9 - XBS5_LPBIG_OFFBIG_LDFLAGS: -xarch=v9 - XBS5_LPBIG_OFFBIG_LINTFLAGS: -xarch=v9 - _XBS5_LP64_OFF64_CFLAGS: -xarch=v9 - _XBS5_LP64_OFF64_LDFLAGS: -xarch=v9 - _XBS5_LP64_OFF64_LINTFLAGS: -xarch=v9 - _XBS5_LPBIG_OFFBIG_CFLAGS: -xarch=v9 - _XBS5_LPBIG_OFFBIG_LDFLAGS: -xarch=v9 - _XBS5_LPBIG_OFFBIG_LINTFLAGS: -xarch=v9 - -This flag is supported in Sun WorkShop Compilers 5.0 and onwards -(now marketed under the name Forte) when used on Solaris 7 or later on -UltraSparc systems. - -If you are using gcc, you would need to use -mcpu=v9 -m64 instead. This -option is not yet supported as of gcc 2.95.2; from install/SPECIFIC -in that release: - -GCC version 2.95 is not able to compile code correctly for sparc64 -targets. Users of the Linux kernel, at least, can use the sparc32 -program to start up a new shell invocation with an environment that -causes configure to recognize (via uname -a) the system as sparc-*-* -instead. - -All this should be handled automatically by the hints file, if -requested. - -If you do want to be able to allocate more than 4GB memory inside -perl, then you should use the Solaris malloc, since the perl -malloc breaks when dealing with more than 2GB of memory. You can do -this with - - sh Configure -Uusemymalloc - -Note that this will break binary compatibility with any version that -was not compiled with -Uusemymalloc. - -=head3 Long Doubles. - -As of 5.6.0, long doubles are not working. - -=head2 Threads. - -It is possible to build a threaded version of perl on Solaris. The entire -perl thread implementation is still experimental, however, so beware. -Perl uses the sched_yield(3RT) function. In versions of Solaris up -to 2.6, that function is in -lposix4. Starting with Solaris 7, it is -in -lrt. The hints file should handle adding this automatically. - -=head2 Malloc Issues. - -You should not use perl's malloc if you are building with gcc. There -are reports of core dumps, especially in the PDL module. The problem -appears to go away under -DDEBUGGING, so it has been difficult to -track down. Sun's compiler appears to be ok with or without perl's -malloc. [XXX further investigation is needed here.] - -You should also not use perl's malloc if you are building perl as -an LP64 application, since perl's malloc has trouble allocating more -than 2GB of memory. - -You can avoid perl's malloc by Configuring with - - sh Configure -Uusemymalloc - -See the note about binary compatibility above. This option will be -enabled by default beginning with 5.7.1. - -=head1 MAKE PROBLEMS. - -=over 4 - -=item Dynamic Loading Problems With GNU as and GNU ld - -If you have problems with dynamic loading using gcc on SunOS or -Solaris, and you are using GNU as and GNU ld, see the section -L<"GNU as and GNU ld"> above. - -=item ld.so.1: ./perl: fatal: relocation error: - -If you get this message on SunOS or Solaris, and you're using gcc, -it's probably the GNU as or GNU ld problem in the previous item -L<"GNU as and GNU ld">. - -=item dlopen: stub interception failed - -The primary cause of the 'dlopen: stub interception failed' message is -that the LD_LIBRARY_PATH environment variable includes a directory -which is a symlink to /usr/lib (such as /lib). See -L<"LD_LIBRARY_PATH"> above. - -=item #error "No DATAMODEL_NATIVE specified" - -This is a common error when trying to build perl on Solaris 2.6 with a -gcc installation from Solaris 2.5 or 2.5.1. The Solaris header files -changed, so you need to update your gcc installation. You can either -rerun the fixincludes script from gcc or take the opportunity to -update your gcc installation. - -=item sh: ar: not found - -This is a message from your shell telling you that the command 'ar' -was not found. You need to check your PATH environment variable to -make sure that it includes the directory with the 'ar' command. This -is a common problem on Solaris, where 'ar' is in the /usr/ccs/bin/ -directory. - -=back - -=head1 MAKE TEST - -=head2 op/stat.t test 4 - -op/stat.t test 4 may fail if you are on a tmpfs of some sort. -Building in /tmp sometimes shows this behavior. The -test suite detects if you are building in /tmp, but it may not be able -to catch all tmpfs situations. - -=head1 PREBUILT BINARIES. - -You can pick up prebuilt binaries for Solaris from -L, ActiveState L, -and L under the Binaries list at the top of the page. -There are probably other sources as well. Please note that these sites -are under the control of their respective owners, not the perl developers. - -=head1 RUNTIME ISSUES. - -=head2 Limits on Numbers of Open Files. - -The stdio(3C) manpage notes that only 255 files may be opened using -fopen(), and only file descriptors 0 through 255 can be used in a -stream. Since perl calls open() and then fdopen(3C) with the -resulting file descriptor, perl is limited to 255 simultaneous open -files. - -=head1 SOLARIS-SPECIFIC MODULES. - -See the modules under the Solaris:: namespace on CPAN, -L. - -=head1 SOLARIS-SPECIFIC PROBLEMS WITH MODULES. - -=head2 Proc::ProcessTable - -Proc::ProcessTable does not compile on Solaris with perl5.6.0 and higher -if you have LARGEFILES defined. Since largefile support is the -default in 5.6.0 and later, you have to take special steps to use this -module. - -The problem is that various structures visible via procfs use off_t, -and if you compile with largefile support these change from 32 bits to -64 bits. Thus what you get back from procfs doesn't match up with -the structures in perl, resulting in garbage. See proc(4) for further -discussion. - -A fix for Proc::ProcessTable is to edit Makefile to -explicitly remove the largefile flags from the ones MakeMaker picks up -from Config.pm. This will result in Proc::ProcessTable being built -under the correct environment. Everything should then be OK as long as -Proc::ProcessTable doesn't try to share off_t's with the rest of perl, -or if it does they should be explicitly specified as off64_t. - -=head2 BSD::Resource - -BSD::Resource versions earlier than 1.09 do not compile on Solaris -with perl 5.6.0 and higher, for the same reasons as Proc::ProcessTable. -BSD::Resource versions starting from 1.09 have a workaround for the problem. - -=head2 Net::SSLeay - -Net::SSLeay requires a /dev/urandom to be present. This device is not -part of Solaris. You can either get the package SUNWski (packaged with -several Sun software products, for example the Sun WebServer, which is -part of the Solaris Server Intranet Extension, or the Sun Directory -Services, part of Solaris for ISPs) or download the ANDIrand package -from L. If you use SUNWski, make a -symbolic link /dev/urandom pointing to /dev/random. - -It may be possible to use the Entropy Gathering Daemon (written in -Perl!), available from L. - -=head1 AUTHOR - -The original was written by Andy Dougherty F -drawing heavily on advice from Alan Burlison, Nick Ing-Simmons, Tim Bunce, -and many other Solaris users over the years. - -Please report any errors, updates, or suggestions to F. - -=head1 LAST MODIFIED - -$Id: README.solaris,v 1.4 2000/11/11 20:29:58 doughera Exp $ diff --git a/lib/perl5/5.6.1/pods/perlstyle.pod b/lib/perl5/5.6.1/pods/perlstyle.pod deleted file mode 100644 index bfe5b767..00000000 --- a/lib/perl5/5.6.1/pods/perlstyle.pod +++ /dev/null @@ -1,277 +0,0 @@ -=head1 NAME - -perlstyle - Perl style guide - -=head1 DESCRIPTION - -Each programmer will, of course, have his or her own preferences in -regards to formatting, but there are some general guidelines that will -make your programs easier to read, understand, and maintain. - -The most important thing is to run your programs under the B<-w> -flag at all times. You may turn it off explicitly for particular -portions of code via the C pragma or the C<$^W> variable -if you must. You should -also always run under C or know the reason why not. -The C and even C pragmas may also prove -useful. - -Regarding aesthetics of code lay out, about the only thing Larry -cares strongly about is that the closing curly bracket of -a multi-line BLOCK should line up with the keyword that started the construct. -Beyond that, he has other preferences that aren't so strong: - -=over 4 - -=item * - -4-column indent. - -=item * - -Opening curly on same line as keyword, if possible, otherwise line up. - -=item * - -Space before the opening curly of a multi-line BLOCK. - -=item * - -One-line BLOCK may be put on one line, including curlies. - -=item * - -No space before the semicolon. - -=item * - -Semicolon omitted in "short" one-line BLOCK. - -=item * - -Space around most operators. - -=item * - -Space around a "complex" subscript (inside brackets). - -=item * - -Blank lines between chunks that do different things. - -=item * - -Uncuddled elses. - -=item * - -No space between function name and its opening parenthesis. - -=item * - -Space after each comma. - -=item * - -Long lines broken after an operator (except "and" and "or"). - -=item * - -Space after last parenthesis matching on current line. - -=item * - -Line up corresponding items vertically. - -=item * - -Omit redundant punctuation as long as clarity doesn't suffer. - -=back - -Larry has his reasons for each of these things, but he doesn't claim that -everyone else's mind works the same as his does. - -Here are some other more substantive style issues to think about: - -=over 4 - -=item * - -Just because you I do something a particular way doesn't mean that -you I do it that way. Perl is designed to give you several -ways to do anything, so consider picking the most readable one. For -instance - - open(FOO,$foo) || die "Can't open $foo: $!"; - -is better than - - die "Can't open $foo: $!" unless open(FOO,$foo); - -because the second way hides the main point of the statement in a -modifier. On the other hand - - print "Starting analysis\n" if $verbose; - -is better than - - $verbose && print "Starting analysis\n"; - -because the main point isn't whether the user typed B<-v> or not. - -Similarly, just because an operator lets you assume default arguments -doesn't mean that you have to make use of the defaults. The defaults -are there for lazy systems programmers writing one-shot programs. If -you want your program to be readable, consider supplying the argument. - -Along the same lines, just because you I omit parentheses in many -places doesn't mean that you ought to: - - return print reverse sort num values %array; - return print(reverse(sort num (values(%array)))); - -When in doubt, parenthesize. At the very least it will let some poor -schmuck bounce on the % key in B. - -Even if you aren't in doubt, consider the mental welfare of the person -who has to maintain the code after you, and who will probably put -parentheses in the wrong place. - -=item * - -Don't go through silly contortions to exit a loop at the top or the -bottom, when Perl provides the C operator so you can exit in -the middle. Just "outdent" it a little to make it more visible: - - LINE: - for (;;) { - statements; - last LINE if $foo; - next LINE if /^#/; - statements; - } - -=item * - -Don't be afraid to use loop labels--they're there to enhance -readability as well as to allow multilevel loop breaks. See the -previous example. - -=item * - -Avoid using grep() (or map()) or `backticks` in a void context, that is, -when you just throw away their return values. Those functions all -have return values, so use them. Otherwise use a foreach() loop or -the system() function instead. - -=item * - -For portability, when using features that may not be implemented on -every machine, test the construct in an eval to see if it fails. If -you know what version or patchlevel a particular feature was -implemented, you can test C<$]> (C<$PERL_VERSION> in C) to see if it -will be there. The C module will also let you interrogate values -determined by the B program when Perl was installed. - -=item * - -Choose mnemonic identifiers. If you can't remember what mnemonic means, -you've got a problem. - -=item * - -While short identifiers like $gotit are probably ok, use underscores to -separate words. It is generally easier to read $var_names_like_this than -$VarNamesLikeThis, especially for non-native speakers of English. It's -also a simple rule that works consistently with VAR_NAMES_LIKE_THIS. - -Package names are sometimes an exception to this rule. Perl informally -reserves lowercase module names for "pragma" modules like C and -C. Other modules should begin with a capital letter and use mixed -case, but probably without underscores due to limitations in primitive -file systems' representations of module names as files that must fit into a -few sparse bytes. - -=item * - -You may find it helpful to use letter case to indicate the scope -or nature of a variable. For example: - - $ALL_CAPS_HERE constants only (beware clashes with perl vars!) - $Some_Caps_Here package-wide global/static - $no_caps_here function scope my() or local() variables - -Function and method names seem to work best as all lowercase. -E.g., $obj-Eas_string(). - -You can use a leading underscore to indicate that a variable or -function should not be used outside the package that defined it. - -=item * - -If you have a really hairy regular expression, use the C modifier and -put in some whitespace to make it look a little less like line noise. -Don't use slash as a delimiter when your regexp has slashes or backslashes. - -=item * - -Use the new "and" and "or" operators to avoid having to parenthesize -list operators so much, and to reduce the incidence of punctuation -operators like C<&&> and C<||>. Call your subroutines as if they were -functions or list operators to avoid excessive ampersands and parentheses. - -=item * - -Use here documents instead of repeated print() statements. - -=item * - -Line up corresponding things vertically, especially if it'd be too long -to fit on one line anyway. - - $IDX = $ST_MTIME; - $IDX = $ST_ATIME if $opt_u; - $IDX = $ST_CTIME if $opt_c; - $IDX = $ST_SIZE if $opt_s; - - mkdir $tmpdir, 0700 or die "can't mkdir $tmpdir: $!"; - chdir($tmpdir) or die "can't chdir $tmpdir: $!"; - mkdir 'tmp', 0777 or die "can't mkdir $tmpdir/tmp: $!"; - -=item * - -Always check the return codes of system calls. Good error messages should -go to STDERR, include which program caused the problem, what the failed -system call and arguments were, and (VERY IMPORTANT) should contain the -standard system error message for what went wrong. Here's a simple but -sufficient example: - - opendir(D, $dir) or die "can't opendir $dir: $!"; - -=item * - -Line up your transliterations when it makes sense: - - tr [abc] - [xyz]; - -=item * - -Think about reusability. Why waste brainpower on a one-shot when you -might want to do something like it again? Consider generalizing your -code. Consider writing a module or object class. Consider making your -code run cleanly with C and C (or B<-w>) in effect -Consider giving away -your code. Consider changing your whole world view. Consider... oh, -never mind. - -=item * - -Be consistent. - -=item * - -Be nice. - -=back diff --git a/lib/perl5/5.6.1/pods/perlsub.pod b/lib/perl5/5.6.1/pods/perlsub.pod deleted file mode 100644 index b440cd1d..00000000 --- a/lib/perl5/5.6.1/pods/perlsub.pod +++ /dev/null @@ -1,1278 +0,0 @@ -=head1 NAME - -perlsub - Perl subroutines - -=head1 SYNOPSIS - -To declare subroutines: - - sub NAME; # A "forward" declaration. - sub NAME(PROTO); # ditto, but with prototypes - sub NAME : ATTRS; # with attributes - sub NAME(PROTO) : ATTRS; # with attributes and prototypes - - sub NAME BLOCK # A declaration and a definition. - sub NAME(PROTO) BLOCK # ditto, but with prototypes - sub NAME : ATTRS BLOCK # with attributes - sub NAME(PROTO) : ATTRS BLOCK # with prototypes and attributes - -To define an anonymous subroutine at runtime: - - $subref = sub BLOCK; # no proto - $subref = sub (PROTO) BLOCK; # with proto - $subref = sub : ATTRS BLOCK; # with attributes - $subref = sub (PROTO) : ATTRS BLOCK; # with proto and attributes - -To import subroutines: - - use MODULE qw(NAME1 NAME2 NAME3); - -To call subroutines: - - NAME(LIST); # & is optional with parentheses. - NAME LIST; # Parentheses optional if predeclared/imported. - &NAME(LIST); # Circumvent prototypes. - &NAME; # Makes current @_ visible to called subroutine. - -=head1 DESCRIPTION - -Like many languages, Perl provides for user-defined subroutines. -These may be located anywhere in the main program, loaded in from -other files via the C, C, or C keywords, or -generated on the fly using C or anonymous subroutines. -You can even call a function indirectly using a variable containing -its name or a CODE reference. - -The Perl model for function call and return values is simple: all -functions are passed as parameters one single flat list of scalars, and -all functions likewise return to their caller one single flat list of -scalars. Any arrays or hashes in these call and return lists will -collapse, losing their identities--but you may always use -pass-by-reference instead to avoid this. Both call and return lists may -contain as many or as few scalar elements as you'd like. (Often a -function without an explicit return statement is called a subroutine, but -there's really no difference from Perl's perspective.) - -Any arguments passed in show up in the array C<@_>. Therefore, if -you called a function with two arguments, those would be stored in -C<$_[0]> and C<$_[1]>. The array C<@_> is a local array, but its -elements are aliases for the actual scalar parameters. In particular, -if an element C<$_[0]> is updated, the corresponding argument is -updated (or an error occurs if it is not updatable). If an argument -is an array or hash element which did not exist when the function -was called, that element is created only when (and if) it is modified -or a reference to it is taken. (Some earlier versions of Perl -created the element whether or not the element was assigned to.) -Assigning to the whole array C<@_> removes that aliasing, and does -not update any arguments. - -The return value of a subroutine is the value of the last expression -evaluated. More explicitly, a C statement may be used to exit the -subroutine, optionally specifying the returned value, which will be -evaluated in the appropriate context (list, scalar, or void) depending -on the context of the subroutine call. If you specify no return value, -the subroutine returns an empty list in list context, the undefined -value in scalar context, or nothing in void context. If you return -one or more aggregates (arrays and hashes), these will be flattened -together into one large indistinguishable list. - -Perl does not have named formal parameters. In practice all you -do is assign to a C list of these. Variables that aren't -declared to be private are global variables. For gory details -on creating private variables, see L<"Private Variables via my()"> -and L<"Temporary Values via local()">. To create protected -environments for a set of functions in a separate package (and -probably a separate file), see L. - -Example: - - sub max { - my $max = shift(@_); - foreach $foo (@_) { - $max = $foo if $max < $foo; - } - return $max; - } - $bestday = max($mon,$tue,$wed,$thu,$fri); - -Example: - - # get a line, combining continuation lines - # that start with whitespace - - sub get_line { - $thisline = $lookahead; # global variables! - LINE: while (defined($lookahead = )) { - if ($lookahead =~ /^[ \t]/) { - $thisline .= $lookahead; - } - else { - last LINE; - } - } - return $thisline; - } - - $lookahead = ; # get first line - while (defined($line = get_line())) { - ... - } - -Assigning to a list of private variables to name your arguments: - - sub maybeset { - my($key, $value) = @_; - $Foo{$key} = $value unless $Foo{$key}; - } - -Because the assignment copies the values, this also has the effect -of turning call-by-reference into call-by-value. Otherwise a -function is free to do in-place modifications of C<@_> and change -its caller's values. - - upcase_in($v1, $v2); # this changes $v1 and $v2 - sub upcase_in { - for (@_) { tr/a-z/A-Z/ } - } - -You aren't allowed to modify constants in this way, of course. If an -argument were actually literal and you tried to change it, you'd take a -(presumably fatal) exception. For example, this won't work: - - upcase_in("frederick"); - -It would be much safer if the C function -were written to return a copy of its parameters instead -of changing them in place: - - ($v3, $v4) = upcase($v1, $v2); # this doesn't change $v1 and $v2 - sub upcase { - return unless defined wantarray; # void context, do nothing - my @parms = @_; - for (@parms) { tr/a-z/A-Z/ } - return wantarray ? @parms : $parms[0]; - } - -Notice how this (unprototyped) function doesn't care whether it was -passed real scalars or arrays. Perl sees all arguments as one big, -long, flat parameter list in C<@_>. This is one area where -Perl's simple argument-passing style shines. The C -function would work perfectly well without changing the C -definition even if we fed it things like this: - - @newlist = upcase(@list1, @list2); - @newlist = upcase( split /:/, $var ); - -Do not, however, be tempted to do this: - - (@a, @b) = upcase(@list1, @list2); - -Like the flattened incoming parameter list, the return list is also -flattened on return. So all you have managed to do here is stored -everything in C<@a> and made C<@b> an empty list. See -L for alternatives. - -A subroutine may be called using an explicit C<&> prefix. The -C<&> is optional in modern Perl, as are parentheses if the -subroutine has been predeclared. The C<&> is I optional -when just naming the subroutine, such as when it's used as -an argument to defined() or undef(). Nor is it optional when you -want to do an indirect subroutine call with a subroutine name or -reference using the C<&$subref()> or C<&{$subref}()> constructs, -although the C<< $subref->() >> notation solves that problem. -See L for more about all that. - -Subroutines may be called recursively. If a subroutine is called -using the C<&> form, the argument list is optional, and if omitted, -no C<@_> array is set up for the subroutine: the C<@_> array at the -time of the call is visible to subroutine instead. This is an -efficiency mechanism that new users may wish to avoid. - - &foo(1,2,3); # pass three arguments - foo(1,2,3); # the same - - foo(); # pass a null list - &foo(); # the same - - &foo; # foo() get current args, like foo(@_) !! - foo; # like foo() IFF sub foo predeclared, else "foo" - -Not only does the C<&> form make the argument list optional, it also -disables any prototype checking on arguments you do provide. This -is partly for historical reasons, and partly for having a convenient way -to cheat if you know what you're doing. See L below. - -Functions whose names are in all upper case are reserved to the Perl -core, as are modules whose names are in all lower case. A -function in all capitals is a loosely-held convention meaning it -will be called indirectly by the run-time system itself, usually -due to a triggered event. Functions that do special, pre-defined -things include C, C, C, C, C, and -C--plus all functions mentioned in L. - -=head2 Private Variables via my() - -Synopsis: - - my $foo; # declare $foo lexically local - my (@wid, %get); # declare list of variables local - my $foo = "flurp"; # declare $foo lexical, and init it - my @oof = @bar; # declare @oof lexical, and init it - my $x : Foo = $y; # similar, with an attribute applied - -B: The use of attribute lists on C declarations is -experimental. This feature should not be relied upon. It may -change or disappear in future releases of Perl. See L. - -The C operator declares the listed variables to be lexically -confined to the enclosing block, conditional (C), -loop (C), subroutine, C, -or C'd file. If more than one value is listed, the -list must be placed in parentheses. All listed elements must be -legal lvalues. Only alphanumeric identifiers may be lexically -scoped--magical built-ins like C<$/> must currently be Cize -with C instead. - -Unlike dynamic variables created by the C operator, lexical -variables declared with C are totally hidden from the outside -world, including any called subroutines. This is true if it's the -same subroutine called from itself or elsewhere--every call gets -its own copy. - -This doesn't mean that a C variable declared in a statically -enclosing lexical scope would be invisible. Only dynamic scopes -are cut off. For example, the C function below has access -to the lexical $x variable because both the C and the C -occurred at the same scope, presumably file scope. - - my $x = 10; - sub bumpx { $x++ } - -An C, however, can see lexical variables of the scope it is -being evaluated in, so long as the names aren't hidden by declarations within -the C itself. See L. - -The parameter list to my() may be assigned to if desired, which allows you -to initialize your variables. (If no initializer is given for a -particular variable, it is created with the undefined value.) Commonly -this is used to name input parameters to a subroutine. Examples: - - $arg = "fred"; # "global" variable - $n = cube_root(27); - print "$arg thinks the root is $n\n"; - fred thinks the root is 3 - - sub cube_root { - my $arg = shift; # name doesn't matter - $arg **= 1/3; - return $arg; - } - -The C is simply a modifier on something you might assign to. So when -you do assign to variables in its argument list, C doesn't -change whether those variables are viewed as a scalar or an array. So - - my ($foo) = ; # WRONG? - my @FOO = ; - -both supply a list context to the right-hand side, while - - my $foo = ; - -supplies a scalar context. But the following declares only one variable: - - my $foo, $bar = 1; # WRONG - -That has the same effect as - - my $foo; - $bar = 1; - -The declared variable is not introduced (is not visible) until after -the current statement. Thus, - - my $x = $x; - -can be used to initialize a new $x with the value of the old $x, and -the expression - - my $x = 123 and $x == 123 - -is false unless the old $x happened to have the value C<123>. - -Lexical scopes of control structures are not bounded precisely by the -braces that delimit their controlled blocks; control expressions are -part of that scope, too. Thus in the loop - - while (my $line = <>) { - $line = lc $line; - } continue { - print $line; - } - -the scope of $line extends from its declaration throughout the rest of -the loop construct (including the C clause), but not beyond -it. Similarly, in the conditional - - if ((my $answer = ) =~ /^yes$/i) { - user_agrees(); - } elsif ($answer =~ /^no$/i) { - user_disagrees(); - } else { - chomp $answer; - die "'$answer' is neither 'yes' nor 'no'"; - } - -the scope of $answer extends from its declaration through the rest -of that conditional, including any C and C clauses, -but not beyond it. - -None of the foregoing text applies to C or C -modifiers appended to simple statements. Such modifiers are not -control structures and have no effect on scoping. - -The C loop defaults to scoping its index variable dynamically -in the manner of C. However, if the index variable is -prefixed with the keyword C, or if there is already a lexical -by that name in scope, then a new lexical is created instead. Thus -in the loop - - for my $i (1, 2, 3) { - some_function(); - } - -the scope of $i extends to the end of the loop, but not beyond it, -rendering the value of $i inaccessible within C. - -Some users may wish to encourage the use of lexically scoped variables. -As an aid to catching implicit uses to package variables, -which are always global, if you say - - use strict 'vars'; - -then any variable mentioned from there to the end of the enclosing -block must either refer to a lexical variable, be predeclared via -C or C, or else must be fully qualified with the package name. -A compilation error results otherwise. An inner block may countermand -this with C. - -A C has both a compile-time and a run-time effect. At compile -time, the compiler takes notice of it. The principal usefulness -of this is to quiet C, but it is also essential -for generation of closures as detailed in L. Actual -initialization is delayed until run time, though, so it gets executed -at the appropriate time, such as each time through a loop, for -example. - -Variables declared with C are not part of any package and are therefore -never fully qualified with the package name. In particular, you're not -allowed to try to make a package variable (or other global) lexical: - - my $pack::var; # ERROR! Illegal syntax - my $_; # also illegal (currently) - -In fact, a dynamic variable (also known as package or global variables) -are still accessible using the fully qualified C<::> notation even while a -lexical of the same name is also visible: - - package main; - local $x = 10; - my $x = 20; - print "$x and $::x\n"; - -That will print out C<20> and C<10>. - -You may declare C variables at the outermost scope of a file -to hide any such identifiers from the world outside that file. This -is similar in spirit to C's static variables when they are used at -the file level. To do this with a subroutine requires the use of -a closure (an anonymous function that accesses enclosing lexicals). -If you want to create a private subroutine that cannot be called -from outside that block, it can declare a lexical variable containing -an anonymous sub reference: - - my $secret_version = '1.001-beta'; - my $secret_sub = sub { print $secret_version }; - &$secret_sub(); - -As long as the reference is never returned by any function within the -module, no outside module can see the subroutine, because its name is not in -any package's symbol table. Remember that it's not I called -C<$some_pack::secret_version> or anything; it's just $secret_version, -unqualified and unqualifiable. - -This does not work with object methods, however; all object methods -have to be in the symbol table of some package to be found. See -L for something of a work-around to -this. - -=head2 Persistent Private Variables - -Just because a lexical variable is lexically (also called statically) -scoped to its enclosing block, C, or C FILE, this doesn't mean that -within a function it works like a C static. It normally works more -like a C auto, but with implicit garbage collection. - -Unlike local variables in C or C++, Perl's lexical variables don't -necessarily get recycled just because their scope has exited. -If something more permanent is still aware of the lexical, it will -stick around. So long as something else references a lexical, that -lexical won't be freed--which is as it should be. You wouldn't want -memory being free until you were done using it, or kept around once you -were done. Automatic garbage collection takes care of this for you. - -This means that you can pass back or save away references to lexical -variables, whereas to return a pointer to a C auto is a grave error. -It also gives us a way to simulate C's function statics. Here's a -mechanism for giving a function private variables with both lexical -scoping and a static lifetime. If you do want to create something like -C's static variables, just enclose the whole function in an extra block, -and put the static variable outside the function but in the block. - - { - my $secret_val = 0; - sub gimme_another { - return ++$secret_val; - } - } - # $secret_val now becomes unreachable by the outside - # world, but retains its value between calls to gimme_another - -If this function is being sourced in from a separate file -via C or C, then this is probably just fine. If it's -all in the main program, you'll need to arrange for the C -to be executed early, either by putting the whole block above -your main program, or more likely, placing merely a C -sub around it to make sure it gets executed before your program -starts to run: - - sub BEGIN { - my $secret_val = 0; - sub gimme_another { - return ++$secret_val; - } - } - -See L about the -special triggered functions, C, C, C and C. - -If declared at the outermost scope (the file scope), then lexicals -work somewhat like C's file statics. They are available to all -functions in that same file declared below them, but are inaccessible -from outside that file. This strategy is sometimes used in modules -to create private variables that the whole module can see. - -=head2 Temporary Values via local() - -B: In general, you should be using C instead of C, because -it's faster and safer. Exceptions to this include the global punctuation -variables, filehandles and formats, and direct manipulation of the Perl -symbol table itself. Format variables often use C though, as do -other variables whose current value must be visible to called -subroutines. - -Synopsis: - - local $foo; # declare $foo dynamically local - local (@wid, %get); # declare list of variables local - local $foo = "flurp"; # declare $foo dynamic, and init it - local @oof = @bar; # declare @oof dynamic, and init it - - local *FH; # localize $FH, @FH, %FH, &FH ... - local *merlyn = *randal; # now $merlyn is really $randal, plus - # @merlyn is really @randal, etc - local *merlyn = 'randal'; # SAME THING: promote 'randal' to *randal - local *merlyn = \$randal; # just alias $merlyn, not @merlyn etc - -A C modifies its listed variables to be "local" to the -enclosing block, C, or C--and to I. A C just gives temporary -values to global (meaning package) variables. It does I create -a local variable. This is known as dynamic scoping. Lexical scoping -is done with C, which works more like C's auto declarations. - -If more than one variable is given to C, they must be placed in -parentheses. All listed elements must be legal lvalues. This operator works -by saving the current values of those variables in its argument list on a -hidden stack and restoring them upon exiting the block, subroutine, or -eval. This means that called subroutines can also reference the local -variable, but not the global one. The argument list may be assigned to if -desired, which allows you to initialize your local variables. (If no -initializer is given for a particular variable, it is created with an -undefined value.) Commonly this is used to name the parameters to a -subroutine. Examples: - - for $i ( 0 .. 9 ) { - $digits{$i} = $i; - } - # assume this function uses global %digits hash - parse_num(); - - # now temporarily add to %digits hash - if ($base12) { - # (NOTE: not claiming this is efficient!) - local %digits = (%digits, 't' => 10, 'e' => 11); - parse_num(); # parse_num gets this new %digits! - } - # old %digits restored here - -Because C is a run-time operator, it gets executed each time -through a loop. In releases of Perl previous to 5.0, this used more stack -storage each time until the loop was exited. Perl now reclaims the space -each time through, but it's still more efficient to declare your variables -outside the loop. - -A C is simply a modifier on an lvalue expression. When you assign to -a Cized variable, the C doesn't change whether its list is viewed -as a scalar or an array. So - - local($foo) = ; - local @FOO = ; - -both supply a list context to the right-hand side, while - - local $foo = ; - -supplies a scalar context. - -A note about C and composite types is in order. Something -like C works by temporarily placing a brand new hash in -the symbol table. The old hash is left alone, but is hidden "behind" -the new one. - -This means the old variable is completely invisible via the symbol -table (i.e. the hash entry in the C<*foo> typeglob) for the duration -of the dynamic scope within which the C was seen. This -has the effect of allowing one to temporarily occlude any magic on -composite types. For instance, this will briefly alter a tied -hash to some other implementation: - - tie %ahash, 'APackage'; - [...] - { - local %ahash; - tie %ahash, 'BPackage'; - [..called code will see %ahash tied to 'BPackage'..] - { - local %ahash; - [..%ahash is a normal (untied) hash here..] - } - } - [..%ahash back to its initial tied self again..] - -As another example, a custom implementation of C<%ENV> might look -like this: - - { - local %ENV; - tie %ENV, 'MyOwnEnv'; - [..do your own fancy %ENV manipulation here..] - } - [..normal %ENV behavior here..] - -It's also worth taking a moment to explain what happens when you -Cize a member of a composite type (i.e. an array or hash element). -In this case, the element is Cized I. This means that -when the scope of the C ends, the saved value will be -restored to the hash element whose key was named in the C, or -the array element whose index was named in the C. If that -element was deleted while the C was in effect (e.g. by a -C from a hash or a C of an array), it will spring -back into existence, possibly extending an array and filling in the -skipped elements with C. For instance, if you say - - %hash = ( 'This' => 'is', 'a' => 'test' ); - @ary = ( 0..5 ); - { - local($ary[5]) = 6; - local($hash{'a'}) = 'drill'; - while (my $e = pop(@ary)) { - print "$e . . .\n"; - last unless $e > 3; - } - if (@ary) { - $hash{'only a'} = 'test'; - delete $hash{'a'}; - } - } - print join(' ', map { "$_ $hash{$_}" } sort keys %hash),".\n"; - print "The array has ",scalar(@ary)," elements: ", - join(', ', map { defined $_ ? $_ : 'undef' } @ary),"\n"; - -Perl will print - - 6 . . . - 4 . . . - 3 . . . - This is a test only a test. - The array has 6 elements: 0, 1, 2, undef, undef, 5 - -The behavior of local() on non-existent members of composite -types is subject to change in future. - -=head2 Lvalue subroutines - -B: Lvalue subroutines are still experimental and the implementation -may change in future versions of Perl. - -It is possible to return a modifiable value from a subroutine. -To do this, you have to declare the subroutine to return an lvalue. - - my $val; - sub canmod : lvalue { - $val; - } - sub nomod { - $val; - } - - canmod() = 5; # assigns to $val - nomod() = 5; # ERROR - -The scalar/list context for the subroutine and for the right-hand -side of assignment is determined as if the subroutine call is replaced -by a scalar. For example, consider: - - data(2,3) = get_data(3,4); - -Both subroutines here are called in a scalar context, while in: - - (data(2,3)) = get_data(3,4); - -and in: - - (data(2),data(3)) = get_data(3,4); - -all the subroutines are called in a list context. - -=head2 Passing Symbol Table Entries (typeglobs) - -B: The mechanism described in this section was originally -the only way to simulate pass-by-reference in older versions of -Perl. While it still works fine in modern versions, the new reference -mechanism is generally easier to work with. See below. - -Sometimes you don't want to pass the value of an array to a subroutine -but rather the name of it, so that the subroutine can modify the global -copy of it rather than working with a local copy. In perl you can -refer to all objects of a particular name by prefixing the name -with a star: C<*foo>. This is often known as a "typeglob", because the -star on the front can be thought of as a wildcard match for all the -funny prefix characters on variables and subroutines and such. - -When evaluated, the typeglob produces a scalar value that represents -all the objects of that name, including any filehandle, format, or -subroutine. When assigned to, it causes the name mentioned to refer to -whatever C<*> value was assigned to it. Example: - - sub doubleary { - local(*someary) = @_; - foreach $elem (@someary) { - $elem *= 2; - } - } - doubleary(*foo); - doubleary(*bar); - -Scalars are already passed by reference, so you can modify -scalar arguments without using this mechanism by referring explicitly -to C<$_[0]> etc. You can modify all the elements of an array by passing -all the elements as scalars, but you have to use the C<*> mechanism (or -the equivalent reference mechanism) to C, C, or change the size of -an array. It will certainly be faster to pass the typeglob (or reference). - -Even if you don't want to modify an array, this mechanism is useful for -passing multiple arrays in a single LIST, because normally the LIST -mechanism will merge all the array values so that you can't extract out -the individual arrays. For more on typeglobs, see -L. - -=head2 When to Still Use local() - -Despite the existence of C, there are still three places where the -C operator still shines. In fact, in these three places, you -I use C instead of C. - -=over 4 - -=item 1. - -You need to give a global variable a temporary value, especially $_. - -The global variables, like C<@ARGV> or the punctuation variables, must be -Cized with C. This block reads in F, and splits -it up into chunks separated by lines of equal signs, which are placed -in C<@Fields>. - - { - local @ARGV = ("/etc/motd"); - local $/ = undef; - local $_ = <>; - @Fields = split /^\s*=+\s*$/; - } - -It particular, it's important to Cize $_ in any routine that assigns -to it. Look out for implicit assignments in C conditionals. - -=item 2. - -You need to create a local file or directory handle or a local function. - -A function that needs a filehandle of its own must use -C on a complete typeglob. This can be used to create new symbol -table entries: - - sub ioqueue { - local (*READER, *WRITER); # not my! - pipe (READER, WRITER); or die "pipe: $!"; - return (*READER, *WRITER); - } - ($head, $tail) = ioqueue(); - -See the Symbol module for a way to create anonymous symbol table -entries. - -Because assignment of a reference to a typeglob creates an alias, this -can be used to create what is effectively a local function, or at least, -a local alias. - - { - local *grow = \&shrink; # only until this block exists - grow(); # really calls shrink() - move(); # if move() grow()s, it shrink()s too - } - grow(); # get the real grow() again - -See L for more about manipulating -functions by name in this way. - -=item 3. - -You want to temporarily change just one element of an array or hash. - -You can Cize just one element of an aggregate. Usually this -is done on dynamics: - - { - local $SIG{INT} = 'IGNORE'; - funct(); # uninterruptible - } - # interruptibility automatically restored here - -But it also works on lexically declared aggregates. Prior to 5.005, -this operation could on occasion misbehave. - -=back - -=head2 Pass by Reference - -If you want to pass more than one array or hash into a function--or -return them from it--and have them maintain their integrity, then -you're going to have to use an explicit pass-by-reference. Before you -do that, you need to understand references as detailed in L. -This section may not make much sense to you otherwise. - -Here are a few simple examples. First, let's pass in several arrays -to a function and have it C all of then, returning a new list -of all their former last elements: - - @tailings = popmany ( \@a, \@b, \@c, \@d ); - - sub popmany { - my $aref; - my @retlist = (); - foreach $aref ( @_ ) { - push @retlist, pop @$aref; - } - return @retlist; - } - -Here's how you might write a function that returns a -list of keys occurring in all the hashes passed to it: - - @common = inter( \%foo, \%bar, \%joe ); - sub inter { - my ($k, $href, %seen); # locals - foreach $href (@_) { - while ( $k = each %$href ) { - $seen{$k}++; - } - } - return grep { $seen{$_} == @_ } keys %seen; - } - -So far, we're using just the normal list return mechanism. -What happens if you want to pass or return a hash? Well, -if you're using only one of them, or you don't mind them -concatenating, then the normal calling convention is ok, although -a little expensive. - -Where people get into trouble is here: - - (@a, @b) = func(@c, @d); -or - (%a, %b) = func(%c, %d); - -That syntax simply won't work. It sets just C<@a> or C<%a> and -clears the C<@b> or C<%b>. Plus the function didn't get passed -into two separate arrays or hashes: it got one long list in C<@_>, -as always. - -If you can arrange for everyone to deal with this through references, it's -cleaner code, although not so nice to look at. Here's a function that -takes two array references as arguments, returning the two array elements -in order of how many elements they have in them: - - ($aref, $bref) = func(\@c, \@d); - print "@$aref has more than @$bref\n"; - sub func { - my ($cref, $dref) = @_; - if (@$cref > @$dref) { - return ($cref, $dref); - } else { - return ($dref, $cref); - } - } - -It turns out that you can actually do this also: - - (*a, *b) = func(\@c, \@d); - print "@a has more than @b\n"; - sub func { - local (*c, *d) = @_; - if (@c > @d) { - return (\@c, \@d); - } else { - return (\@d, \@c); - } - } - -Here we're using the typeglobs to do symbol table aliasing. It's -a tad subtle, though, and also won't work if you're using C -variables, because only globals (even in disguise as Cs) -are in the symbol table. - -If you're passing around filehandles, you could usually just use the bare -typeglob, like C<*STDOUT>, but typeglobs references work, too. -For example: - - splutter(\*STDOUT); - sub splutter { - my $fh = shift; - print $fh "her um well a hmmm\n"; - } - - $rec = get_rec(\*STDIN); - sub get_rec { - my $fh = shift; - return scalar <$fh>; - } - -If you're planning on generating new filehandles, you could do this. -Notice to pass back just the bare *FH, not its reference. - - sub openit { - my $path = shift; - local *FH; - return open (FH, $path) ? *FH : undef; - } - -=head2 Prototypes - -Perl supports a very limited kind of compile-time argument checking -using function prototyping. If you declare - - sub mypush (\@@) - -then C takes arguments exactly like C does. The -function declaration must be visible at compile time. The prototype -affects only interpretation of new-style calls to the function, -where new-style is defined as not using the C<&> character. In -other words, if you call it like a built-in function, then it behaves -like a built-in function. If you call it like an old-fashioned -subroutine, then it behaves like an old-fashioned subroutine. It -naturally falls out from this rule that prototypes have no influence -on subroutine references like C<\&foo> or on indirect subroutine -calls like C<&{$subref}> or C<< $subref->() >>. - -Method calls are not influenced by prototypes either, because the -function to be called is indeterminate at compile time, since -the exact code called depends on inheritance. - -Because the intent of this feature is primarily to let you define -subroutines that work like built-in functions, here are prototypes -for some other functions that parse almost exactly like the -corresponding built-in. - - Declared as Called as - - sub mylink ($$) mylink $old, $new - sub myvec ($$$) myvec $var, $offset, 1 - sub myindex ($$;$) myindex &getstring, "substr" - sub mysyswrite ($$$;$) mysyswrite $buf, 0, length($buf) - $off, $off - sub myreverse (@) myreverse $a, $b, $c - sub myjoin ($@) myjoin ":", $a, $b, $c - sub mypop (\@) mypop @array - sub mysplice (\@$$@) mysplice @array, @array, 0, @pushme - sub mykeys (\%) mykeys %{$hashref} - sub myopen (*;$) myopen HANDLE, $name - sub mypipe (**) mypipe READHANDLE, WRITEHANDLE - sub mygrep (&@) mygrep { /foo/ } $a, $b, $c - sub myrand ($) myrand 42 - sub mytime () mytime - -Any backslashed prototype character represents an actual argument -that absolutely must start with that character. The value passed -as part of C<@_> will be a reference to the actual argument given -in the subroutine call, obtained by applying C<\> to that argument. - -Unbackslashed prototype characters have special meanings. Any -unbackslashed C<@> or C<%> eats all remaining arguments, and forces -list context. An argument represented by C<$> forces scalar context. An -C<&> requires an anonymous subroutine, which, if passed as the first -argument, does not require the C keyword or a subsequent comma. - -A C<*> allows the subroutine to accept a bareword, constant, scalar expression, -typeglob, or a reference to a typeglob in that slot. The value will be -available to the subroutine either as a simple scalar, or (in the latter -two cases) as a reference to the typeglob. If you wish to always convert -such arguments to a typeglob reference, use Symbol::qualify_to_ref() as -follows: - - use Symbol 'qualify_to_ref'; - - sub foo (*) { - my $fh = qualify_to_ref(shift, caller); - ... - } - -A semicolon separates mandatory arguments from optional arguments. -It is redundant before C<@> or C<%>, which gobble up everything else. - -Note how the last three examples in the table above are treated -specially by the parser. C is parsed as a true list -operator, C is parsed as a true unary operator with unary -precedence the same as C, and C is truly without -arguments, just like C. That is, if you say - - mytime +2; - -you'll get C, not C, which is how it would be parsed -without a prototype. - -The interesting thing about C<&> is that you can generate new syntax with it, -provided it's in the initial position: - - sub try (&@) { - my($try,$catch) = @_; - eval { &$try }; - if ($@) { - local $_ = $@; - &$catch; - } - } - sub catch (&) { $_[0] } - - try { - die "phooey"; - } catch { - /phooey/ and print "unphooey\n"; - }; - -That prints C<"unphooey">. (Yes, there are still unresolved -issues having to do with visibility of C<@_>. I'm ignoring that -question for the moment. (But note that if we make C<@_> lexically -scoped, those anonymous subroutines can act like closures... (Gee, -is this sounding a little Lispish? (Never mind.)))) - -And here's a reimplementation of the Perl C operator: - - sub mygrep (&@) { - my $code = shift; - my @result; - foreach $_ (@_) { - push(@result, $_) if &$code; - } - @result; - } - -Some folks would prefer full alphanumeric prototypes. Alphanumerics have -been intentionally left out of prototypes for the express purpose of -someday in the future adding named, formal parameters. The current -mechanism's main goal is to let module writers provide better diagnostics -for module users. Larry feels the notation quite understandable to Perl -programmers, and that it will not intrude greatly upon the meat of the -module, nor make it harder to read. The line noise is visually -encapsulated into a small pill that's easy to swallow. - -It's probably best to prototype new functions, not retrofit prototyping -into older ones. That's because you must be especially careful about -silent impositions of differing list versus scalar contexts. For example, -if you decide that a function should take just one parameter, like this: - - sub func ($) { - my $n = shift; - print "you gave me $n\n"; - } - -and someone has been calling it with an array or expression -returning a list: - - func(@foo); - func( split /:/ ); - -Then you've just supplied an automatic C in front of their -argument, which can be more than a bit surprising. The old C<@foo> -which used to hold one thing doesn't get passed in. Instead, -C now gets passed in a C<1>; that is, the number of elements -in C<@foo>. And the C gets called in scalar context so it -starts scribbling on your C<@_> parameter list. Ouch! - -This is all very powerful, of course, and should be used only in moderation -to make the world a better place. - -=head2 Constant Functions - -Functions with a prototype of C<()> are potential candidates for -inlining. If the result after optimization and constant folding -is either a constant or a lexically-scoped scalar which has no other -references, then it will be used in place of function calls made -without C<&>. Calls made using C<&> are never inlined. (See -F for an easy way to declare most constants.) - -The following functions would all be inlined: - - sub pi () { 3.14159 } # Not exact, but close. - sub PI () { 4 * atan2 1, 1 } # As good as it gets, - # and it's inlined, too! - sub ST_DEV () { 0 } - sub ST_INO () { 1 } - - sub FLAG_FOO () { 1 << 8 } - sub FLAG_BAR () { 1 << 9 } - sub FLAG_MASK () { FLAG_FOO | FLAG_BAR } - - sub OPT_BAZ () { not (0x1B58 & FLAG_MASK) } - sub BAZ_VAL () { - if (OPT_BAZ) { - return 23; - } - else { - return 42; - } - } - - sub N () { int(BAZ_VAL) / 3 } - BEGIN { - my $prod = 1; - for (1..N) { $prod *= $_ } - sub N_FACTORIAL () { $prod } - } - -If you redefine a subroutine that was eligible for inlining, you'll get -a mandatory warning. (You can use this warning to tell whether or not a -particular subroutine is considered constant.) The warning is -considered severe enough not to be optional because previously compiled -invocations of the function will still be using the old value of the -function. If you need to be able to redefine the subroutine, you need to -ensure that it isn't inlined, either by dropping the C<()> prototype -(which changes calling semantics, so beware) or by thwarting the -inlining mechanism in some other way, such as - - sub not_inlined () { - 23 if $]; - } - -=head2 Overriding Built-in Functions - -Many built-in functions may be overridden, though this should be tried -only occasionally and for good reason. Typically this might be -done by a package attempting to emulate missing built-in functionality -on a non-Unix system. - -Overriding may be done only by importing the name from a -module--ordinary predeclaration isn't good enough. However, the -C pragma lets you, in effect, predeclare subs -via the import syntax, and these names may then override built-in ones: - - use subs 'chdir', 'chroot', 'chmod', 'chown'; - chdir $somewhere; - sub chdir { ... } - -To unambiguously refer to the built-in form, precede the -built-in name with the special package qualifier C. For example, -saying C always refers to the built-in C, even -if the current package has imported some other subroutine called -C<&open()> from elsewhere. Even though it looks like a regular -function call, it isn't: you can't take a reference to it, such as -the incorrect C<\&CORE::open> might appear to produce. - -Library modules should not in general export built-in names like C -or C as part of their default C<@EXPORT> list, because these may -sneak into someone else's namespace and change the semantics unexpectedly. -Instead, if the module adds that name to C<@EXPORT_OK>, then it's -possible for a user to import the name explicitly, but not implicitly. -That is, they could say - - use Module 'open'; - -and it would import the C override. But if they said - - use Module; - -they would get the default imports without overrides. - -The foregoing mechanism for overriding built-in is restricted, quite -deliberately, to the package that requests the import. There is a second -method that is sometimes applicable when you wish to override a built-in -everywhere, without regard to namespace boundaries. This is achieved by -importing a sub into the special namespace C. Here is an -example that quite brazenly replaces the C operator with something -that understands regular expressions. - - package REGlob; - require Exporter; - @ISA = 'Exporter'; - @EXPORT_OK = 'glob'; - - sub import { - my $pkg = shift; - return unless @_; - my $sym = shift; - my $where = ($sym =~ s/^GLOBAL_// ? 'CORE::GLOBAL' : caller(0)); - $pkg->export($where, $sym, @_); - } - - sub glob { - my $pat = shift; - my @got; - local *D; - if (opendir D, '.') { - @got = grep /$pat/, readdir D; - closedir D; - } - return @got; - } - 1; - -And here's how it could be (ab)used: - - #use REGlob 'GLOBAL_glob'; # override glob() in ALL namespaces - package Foo; - use REGlob 'glob'; # override glob() in Foo:: only - print for <^[a-z_]+\.pm\$>; # show all pragmatic modules - -The initial comment shows a contrived, even dangerous example. -By overriding C globally, you would be forcing the new (and -subversive) behavior for the C operator for I namespace, -without the complete cognizance or cooperation of the modules that own -those namespaces. Naturally, this should be done with extreme caution--if -it must be done at all. - -The C example above does not implement all the support needed to -cleanly override perl's C operator. The built-in C has -different behaviors depending on whether it appears in a scalar or list -context, but our C doesn't. Indeed, many perl built-in have such -context sensitive behaviors, and these must be adequately supported by -a properly written override. For a fully functional example of overriding -C, study the implementation of C in the standard -library. - -=head2 Autoloading - -If you call a subroutine that is undefined, you would ordinarily -get an immediate, fatal error complaining that the subroutine doesn't -exist. (Likewise for subroutines being used as methods, when the -method doesn't exist in any base class of the class's package.) -However, if an C subroutine is defined in the package or -packages used to locate the original subroutine, then that -C subroutine is called with the arguments that would have -been passed to the original subroutine. The fully qualified name -of the original subroutine magically appears in the global $AUTOLOAD -variable of the same package as the C routine. The name -is not passed as an ordinary argument because, er, well, just -because, that's why... - -Many C routines load in a definition for the requested -subroutine using eval(), then execute that subroutine using a special -form of goto() that erases the stack frame of the C routine -without a trace. (See the source to the standard module documented -in L, for example.) But an C routine can -also just emulate the routine and never define it. For example, -let's pretend that a function that wasn't defined should just invoke -C with those arguments. All you'd do is: - - sub AUTOLOAD { - my $program = $AUTOLOAD; - $program =~ s/.*:://; - system($program, @_); - } - date(); - who('am', 'i'); - ls('-l'); - -In fact, if you predeclare functions you want to call that way, you don't -even need parentheses: - - use subs qw(date who ls); - date; - who "am", "i"; - ls -l; - -A more complete example of this is the standard Shell module, which -can treat undefined subroutine calls as calls to external programs. - -Mechanisms are available to help modules writers split their modules -into autoloadable files. See the standard AutoLoader module -described in L and in L, the standard -SelfLoader modules in L, and the document on adding C -functions to Perl code in L. - -=head2 Subroutine Attributes - -A subroutine declaration or definition may have a list of attributes -associated with it. If such an attribute list is present, it is -broken up at space or colon boundaries and treated as though a -C had been seen. See L for details -about what attributes are currently supported. -Unlike the limitation with the obsolescent C, the -C syntax works to associate the attributes with -a pre-declaration, and not just with a subroutine definition. - -The attributes must be valid as simple identifier names (without any -punctuation other than the '_' character). They may have a parameter -list appended, which is only checked for whether its parentheses ('(',')') -nest properly. - -Examples of valid syntax (even though the attributes are unknown): - - sub fnord (&\%) : switch(10,foo(7,3)) : expensive ; - sub plugh () : Ugly('\(") :Bad ; - sub xyzzy : _5x5 { ... } - -Examples of invalid syntax: - - sub fnord : switch(10,foo() ; # ()-string not balanced - sub snoid : Ugly('(') ; # ()-string not balanced - sub xyzzy : 5x5 ; # "5x5" not a valid identifier - sub plugh : Y2::north ; # "Y2::north" not a simple identifier - sub snurt : foo + bar ; # "+" not a colon or space - -The attribute list is passed as a list of constant strings to the code -which associates them with the subroutine. In particular, the second example -of valid syntax above currently looks like this in terms of how it's -parsed and invoked: - - use attributes __PACKAGE__, \&plugh, q[Ugly('\(")], 'Bad'; - -For further details on attribute lists and their manipulation, -see L. - -=head1 SEE ALSO - -See L for more about references and closures. -See L if you'd like to learn about calling C subroutines from Perl. -See L if you'd like to learn about calling Perl subroutines from C. -See L to learn about bundling up your functions in separate files. -See L to learn what library modules come standard on your system. -See L to learn how to make object method calls. diff --git a/lib/perl5/5.6.1/pods/perlsyn.pod b/lib/perl5/5.6.1/pods/perlsyn.pod deleted file mode 100644 index aad4efd2..00000000 --- a/lib/perl5/5.6.1/pods/perlsyn.pod +++ /dev/null @@ -1,639 +0,0 @@ -=head1 NAME - -perlsyn - Perl syntax - -=head1 DESCRIPTION - -A Perl script consists of a sequence of declarations and statements. -The sequence of statements is executed just once, unlike in B -and B scripts, where the sequence of statements is executed -for each input line. While this means that you must explicitly -loop over the lines of your input file (or files), it also means -you have much more control over which files and which lines you look at. -(Actually, I'm lying--it is possible to do an implicit loop with -either the B<-n> or B<-p> switch. It's just not the mandatory -default like it is in B and B.) - -Perl is, for the most part, a free-form language. (The only exception -to this is format declarations, for obvious reasons.) Text from a -C<"#"> character until the end of the line is a comment, and is -ignored. If you attempt to use C C-style comments, it will be -interpreted either as division or pattern matching, depending on the -context, and C++ C comments just look like a null regular -expression, so don't do that. - -=head2 Declarations - -The only things you need to declare in Perl are report formats -and subroutines--and even undefined subroutines can be handled -through AUTOLOAD. A variable holds the undefined value (C) -until it has been assigned a defined value, which is anything -other than C. When used as a number, C is treated -as C<0>; when used as a string, it is treated the empty string, -C<"">; and when used as a reference that isn't being assigned -to, it is treated as an error. If you enable warnings, you'll -be notified of an uninitialized value whenever you treat C -as a string or a number. Well, usually. Boolean ("don't-care") -contexts and operators such as C<++>, C<-->, C<+=>, C<-=>, and -C<.=> are always exempt from such warnings. - -A declaration can be put anywhere a statement can, but has no effect on -the execution of the primary sequence of statements--declarations all -take effect at compile time. Typically all the declarations are put at -the beginning or the end of the script. However, if you're using -lexically-scoped private variables created with C, you'll -have to make sure -your format or subroutine definition is within the same block scope -as the my if you expect to be able to access those private variables. - -Declaring a subroutine allows a subroutine name to be used as if it were a -list operator from that point forward in the program. You can declare a -subroutine without defining it by saying C, thus: - - sub myname; - $me = myname $0 or die "can't get myname"; - -Note that myname() functions as a list operator, not as a unary operator; -so be careful to use C instead of C<||> in this case. However, if -you were to declare the subroutine as C, then -C would function as a unary operator, so either C or -C<||> would work. - -Subroutines declarations can also be loaded up with the C statement -or both loaded and imported into your namespace with a C statement. -See L for details on this. - -A statement sequence may contain declarations of lexically-scoped -variables, but apart from declaring a variable name, the declaration acts -like an ordinary statement, and is elaborated within the sequence of -statements as if it were an ordinary statement. That means it actually -has both compile-time and run-time effects. - -=head2 Simple statements - -The only kind of simple statement is an expression evaluated for its -side effects. Every simple statement must be terminated with a -semicolon, unless it is the final statement in a block, in which case -the semicolon is optional. (A semicolon is still encouraged there if the -block takes up more than one line, because you may eventually add another line.) -Note that there are some operators like C and C that look -like compound statements, but aren't (they're just TERMs in an expression), -and thus need an explicit termination if used as the last item in a statement. - -Any simple statement may optionally be followed by a I modifier, -just before the terminating semicolon (or block ending). The possible -modifiers are: - - if EXPR - unless EXPR - while EXPR - until EXPR - foreach EXPR - -The C and C modifiers have the expected semantics, -presuming you're a speaker of English. The C modifier is an -iterator: For each value in EXPR, it aliases C<$_> to the value and -executes the statement. The C and C modifiers have the -usual "C loop" semantics (conditional evaluated first), except -when applied to a C-BLOCK (or to the deprecated C-SUBROUTINE -statement), in which case the block executes once before the -conditional is evaluated. This is so that you can write loops like: - - do { - $line = ; - ... - } until $line eq ".\n"; - -See L. Note also that the loop control statements described -later will I work in this construct, because modifiers don't take -loop labels. Sorry. You can always put another block inside of it -(for C) or around it (for C) to do that sort of thing. -For C, just double the braces: - - do {{ - next if $x == $y; - # do something here - }} until $x++ > $z; - -For C, you have to be more elaborate: - - LOOP: { - do { - last if $x = $y**2; - # do something here - } while $x++ <= $z; - } - -=head2 Compound statements - -In Perl, a sequence of statements that defines a scope is called a block. -Sometimes a block is delimited by the file containing it (in the case -of a required file, or the program as a whole), and sometimes a block -is delimited by the extent of a string (in the case of an eval). - -But generally, a block is delimited by curly brackets, also known as braces. -We will call this syntactic construct a BLOCK. - -The following compound statements may be used to control flow: - - if (EXPR) BLOCK - if (EXPR) BLOCK else BLOCK - if (EXPR) BLOCK elsif (EXPR) BLOCK ... else BLOCK - LABEL while (EXPR) BLOCK - LABEL while (EXPR) BLOCK continue BLOCK - LABEL for (EXPR; EXPR; EXPR) BLOCK - LABEL foreach VAR (LIST) BLOCK - LABEL foreach VAR (LIST) BLOCK continue BLOCK - LABEL BLOCK continue BLOCK - -Note that, unlike C and Pascal, these are defined in terms of BLOCKs, -not statements. This means that the curly brackets are I--no -dangling statements allowed. If you want to write conditionals without -curly brackets there are several other ways to do it. The following -all do the same thing: - - if (!open(FOO)) { die "Can't open $FOO: $!"; } - die "Can't open $FOO: $!" unless open(FOO); - open(FOO) or die "Can't open $FOO: $!"; # FOO or bust! - open(FOO) ? 'hi mom' : die "Can't open $FOO: $!"; - # a bit exotic, that last one - -The C statement is straightforward. Because BLOCKs are always -bounded by curly brackets, there is never any ambiguity about which -C an C goes with. If you use C in place of C, -the sense of the test is reversed. - -The C statement executes the block as long as the expression is -true (does not evaluate to the null string C<""> or C<0> or C<"0">). -The LABEL is optional, and if present, consists of an identifier followed -by a colon. The LABEL identifies the loop for the loop control -statements C, C, and C. -If the LABEL is omitted, the loop control statement -refers to the innermost enclosing loop. This may include dynamically -looking back your call-stack at run time to find the LABEL. Such -desperate behavior triggers a warning if you use the C -pragma or the B<-w> flag. -Unlike a C statement, a C statement never implicitly -localises any variables. - -If there is a C BLOCK, it is always executed just before the -conditional is about to be evaluated again, just like the third part of a -C loop in C. Thus it can be used to increment a loop variable, even -when the loop has been continued via the C statement (which is -similar to the C C statement). - -=head2 Loop Control - -The C command is like the C statement in C; it starts -the next iteration of the loop: - - LINE: while () { - next LINE if /^#/; # discard comments - ... - } - -The C command is like the C statement in C (as used in -loops); it immediately exits the loop in question. The -C block, if any, is not executed: - - LINE: while () { - last LINE if /^$/; # exit when done with header - ... - } - -The C command restarts the loop block without evaluating the -conditional again. The C block, if any, is I executed. -This command is normally used by programs that want to lie to themselves -about what was just input. - -For example, when processing a file like F. -If your input lines might end in backslashes to indicate continuation, you -want to skip ahead and get the next record. - - while (<>) { - chomp; - if (s/\\$//) { - $_ .= <>; - redo unless eof(); - } - # now process $_ - } - -which is Perl short-hand for the more explicitly written version: - - LINE: while (defined($line = )) { - chomp($line); - if ($line =~ s/\\$//) { - $line .= ; - redo LINE unless eof(); # not eof(ARGV)! - } - # now process $line - } - -Note that if there were a C block on the above code, it would get -executed even on discarded lines. This is often used to reset line counters -or C one-time matches. - - # inspired by :1,$g/fred/s//WILMA/ - while (<>) { - ?(fred)? && s//WILMA $1 WILMA/; - ?(barney)? && s//BETTY $1 BETTY/; - ?(homer)? && s//MARGE $1 MARGE/; - } continue { - print "$ARGV $.: $_"; - close ARGV if eof(); # reset $. - reset if eof(); # reset ?pat? - } - -If the word C is replaced by the word C, the sense of the -test is reversed, but the conditional is still tested before the first -iteration. - -The loop control statements don't work in an C or C, since -they aren't loops. You can double the braces to make them such, though. - - if (/pattern/) {{ - next if /fred/; - next if /barney/; - # so something here - }} - -The form C, available in Perl 4, is no longer -available. Replace any occurrence of C by C. - -=head2 For Loops - -Perl's C-style C loop works like the corresponding C loop; -that means that this: - - for ($i = 1; $i < 10; $i++) { - ... - } - -is the same as this: - - $i = 1; - while ($i < 10) { - ... - } continue { - $i++; - } - -There is one minor difference: if variables are declared with C -in the initialization section of the C, the lexical scope of -those variables is exactly the C loop (the body of the loop -and the control sections). - -Besides the normal array index looping, C can lend itself -to many other interesting applications. Here's one that avoids the -problem you get into if you explicitly test for end-of-file on -an interactive file descriptor causing your program to appear to -hang. - - $on_a_tty = -t STDIN && -t STDOUT; - sub prompt { print "yes? " if $on_a_tty } - for ( prompt(); ; prompt() ) { - # do something - } - -=head2 Foreach Loops - -The C loop iterates over a normal list value and sets the -variable VAR to be each element of the list in turn. If the variable -is preceded with the keyword C, then it is lexically scoped, and -is therefore visible only within the loop. Otherwise, the variable is -implicitly local to the loop and regains its former value upon exiting -the loop. If the variable was previously declared with C, it uses -that variable instead of the global one, but it's still localized to -the loop. - -The C keyword is actually a synonym for the C keyword, so -you can use C for readability or C for brevity. (Or because -the Bourne shell is more familiar to you than I, so writing C -comes more naturally.) If VAR is omitted, C<$_> is set to each value. - -If any element of LIST is an lvalue, you can modify it by modifying -VAR inside the loop. Conversely, if any element of LIST is NOT an -lvalue, any attempt to modify that element will fail. In other words, -the C loop index variable is an implicit alias for each item -in the list that you're looping over. - -If any part of LIST is an array, C will get very confused if -you add or remove elements within the loop body, for example with -C. So don't do that. - -C probably won't do what you expect if VAR is a tied or other -special variable. Don't do that either. - -Examples: - - for (@ary) { s/foo/bar/ } - - for my $elem (@elements) { - $elem *= 2; - } - - for $count (10,9,8,7,6,5,4,3,2,1,'BOOM') { - print $count, "\n"; sleep(1); - } - - for (1..15) { print "Merry Christmas\n"; } - - foreach $item (split(/:[\\\n:]*/, $ENV{TERMCAP})) { - print "Item: $item\n"; - } - -Here's how a C programmer might code up a particular algorithm in Perl: - - for (my $i = 0; $i < @ary1; $i++) { - for (my $j = 0; $j < @ary2; $j++) { - if ($ary1[$i] > $ary2[$j]) { - last; # can't go to outer :-( - } - $ary1[$i] += $ary2[$j]; - } - # this is where that last takes me - } - -Whereas here's how a Perl programmer more comfortable with the idiom might -do it: - - OUTER: for my $wid (@ary1) { - INNER: for my $jet (@ary2) { - next OUTER if $wid > $jet; - $wid += $jet; - } - } - -See how much easier this is? It's cleaner, safer, and faster. It's -cleaner because it's less noisy. It's safer because if code gets added -between the inner and outer loops later on, the new code won't be -accidentally executed. The C explicitly iterates the other loop -rather than merely terminating the inner one. And it's faster because -Perl executes a C statement more rapidly than it would the -equivalent C loop. - -=head2 Basic BLOCKs and Switch Statements - -A BLOCK by itself (labeled or not) is semantically equivalent to a -loop that executes once. Thus you can use any of the loop control -statements in it to leave or restart the block. (Note that this is -I true in C, C, or contrary to popular belief -C blocks, which do I count as loops.) The C -block is optional. - -The BLOCK construct is particularly nice for doing case -structures. - - SWITCH: { - if (/^abc/) { $abc = 1; last SWITCH; } - if (/^def/) { $def = 1; last SWITCH; } - if (/^xyz/) { $xyz = 1; last SWITCH; } - $nothing = 1; - } - -There is no official C statement in Perl, because there are -already several ways to write the equivalent. In addition to the -above, you could write - - SWITCH: { - $abc = 1, last SWITCH if /^abc/; - $def = 1, last SWITCH if /^def/; - $xyz = 1, last SWITCH if /^xyz/; - $nothing = 1; - } - -(That's actually not as strange as it looks once you realize that you can -use loop control "operators" within an expression, That's just the normal -C comma operator.) - -or - - SWITCH: { - /^abc/ && do { $abc = 1; last SWITCH; }; - /^def/ && do { $def = 1; last SWITCH; }; - /^xyz/ && do { $xyz = 1; last SWITCH; }; - $nothing = 1; - } - -or formatted so it stands out more as a "proper" C statement: - - SWITCH: { - /^abc/ && do { - $abc = 1; - last SWITCH; - }; - - /^def/ && do { - $def = 1; - last SWITCH; - }; - - /^xyz/ && do { - $xyz = 1; - last SWITCH; - }; - $nothing = 1; - } - -or - - SWITCH: { - /^abc/ and $abc = 1, last SWITCH; - /^def/ and $def = 1, last SWITCH; - /^xyz/ and $xyz = 1, last SWITCH; - $nothing = 1; - } - -or even, horrors, - - if (/^abc/) - { $abc = 1 } - elsif (/^def/) - { $def = 1 } - elsif (/^xyz/) - { $xyz = 1 } - else - { $nothing = 1 } - -A common idiom for a C statement is to use C's aliasing to make -a temporary assignment to C<$_> for convenient matching: - - SWITCH: for ($where) { - /In Card Names/ && do { push @flags, '-e'; last; }; - /Anywhere/ && do { push @flags, '-h'; last; }; - /In Rulings/ && do { last; }; - die "unknown value for form variable where: `$where'"; - } - -Another interesting approach to a switch statement is arrange -for a C block to return the proper value: - - $amode = do { - if ($flag & O_RDONLY) { "r" } # XXX: isn't this 0? - elsif ($flag & O_WRONLY) { ($flag & O_APPEND) ? "a" : "w" } - elsif ($flag & O_RDWR) { - if ($flag & O_CREAT) { "w+" } - else { ($flag & O_APPEND) ? "a+" : "r+" } - } - }; - -Or - - print do { - ($flags & O_WRONLY) ? "write-only" : - ($flags & O_RDWR) ? "read-write" : - "read-only"; - }; - -Or if you are certainly that all the C<&&> clauses are true, you can use -something like this, which "switches" on the value of the -C environment variable. - - #!/usr/bin/perl - # pick out jargon file page based on browser - $dir = 'http://www.wins.uva.nl/~mes/jargon'; - for ($ENV{HTTP_USER_AGENT}) { - $page = /Mac/ && 'm/Macintrash.html' - || /Win(dows )?NT/ && 'e/evilandrude.html' - || /Win|MSIE|WebTV/ && 'm/MicroslothWindows.html' - || /Linux/ && 'l/Linux.html' - || /HP-UX/ && 'h/HP-SUX.html' - || /SunOS/ && 's/ScumOS.html' - || 'a/AppendixB.html'; - } - print "Location: $dir/$page\015\012\015\012"; - -That kind of switch statement only works when you know the C<&&> clauses -will be true. If you don't, the previous C example should be used. - -You might also consider writing a hash of subroutine references -instead of synthesizing a C statement. - -=head2 Goto - -Although not for the faint of heart, Perl does support a C -statement. There are three forms: C-LABEL, C-EXPR, and -C-&NAME. A loop's LABEL is not actually a valid target for -a C; it's just the name of the loop. - -The C-LABEL form finds the statement labeled with LABEL and resumes -execution there. It may not be used to go into any construct that -requires initialization, such as a subroutine or a C loop. It -also can't be used to go into a construct that is optimized away. It -can be used to go almost anywhere else within the dynamic scope, -including out of subroutines, but it's usually better to use some other -construct such as C or C. The author of Perl has never felt the -need to use this form of C (in Perl, that is--C is another matter). - -The C-EXPR form expects a label name, whose scope will be resolved -dynamically. This allows for computed Cs per FORTRAN, but isn't -necessarily recommended if you're optimizing for maintainability: - - goto(("FOO", "BAR", "GLARCH")[$i]); - -The C-&NAME form is highly magical, and substitutes a call to the -named subroutine for the currently running subroutine. This is used by -C subroutines that wish to load another subroutine and then -pretend that the other subroutine had been called in the first place -(except that any modifications to C<@_> in the current subroutine are -propagated to the other subroutine.) After the C, not even C -will be able to tell that this routine was called first. - -In almost all cases like this, it's usually a far, far better idea to use the -structured control flow mechanisms of C, C, or C instead of -resorting to a C. For certain applications, the catch and throw pair of -C and die() for exception processing can also be a prudent approach. - -=head2 PODs: Embedded Documentation - -Perl has a mechanism for intermixing documentation with source code. -While it's expecting the beginning of a new statement, if the compiler -encounters a line that begins with an equal sign and a word, like this - - =head1 Here There Be Pods! - -Then that text and all remaining text up through and including a line -beginning with C<=cut> will be ignored. The format of the intervening -text is described in L. - -This allows you to intermix your source code -and your documentation text freely, as in - - =item snazzle($) - - The snazzle() function will behave in the most spectacular - form that you can possibly imagine, not even excepting - cybernetic pyrotechnics. - - =cut back to the compiler, nuff of this pod stuff! - - sub snazzle($) { - my $thingie = shift; - ......... - } - -Note that pod translators should look at only paragraphs beginning -with a pod directive (it makes parsing easier), whereas the compiler -actually knows to look for pod escapes even in the middle of a -paragraph. This means that the following secret stuff will be -ignored by both the compiler and the translators. - - $a=3; - =secret stuff - warn "Neither POD nor CODE!?" - =cut back - print "got $a\n"; - -You probably shouldn't rely upon the C being podded out forever. -Not all pod translators are well-behaved in this regard, and perhaps -the compiler will become pickier. - -One may also use pod directives to quickly comment out a section -of code. - -=head2 Plain Old Comments (Not!) - -Much like the C preprocessor, Perl can process line directives. Using -this, one can control Perl's idea of filenames and line numbers in -error or warning messages (especially for strings that are processed -with C). The syntax for this mechanism is the same as for most -C preprocessors: it matches the regular expression -C with C<$1> being the line -number for the next line, and C<$2> being the optional filename -(specified within quotes). - -There is a fairly obvious gotcha included with the line directive: -Debuggers and profilers will only show the last source line to appear -at a particular line number in a given file. Care should be taken not -to cause line number collisions in code you'd like to debug later. - -Here are some examples that you should be able to type into your command -shell: - - % perl - # line 200 "bzzzt" - # the `#' on the previous line must be the first char on line - die 'foo'; - __END__ - foo at bzzzt line 201. - - % perl - # line 200 "bzzzt" - eval qq[\n#line 2001 ""\ndie 'foo']; print $@; - __END__ - foo at - line 2001. - - % perl - eval qq[\n#line 200 "foo bar"\ndie 'foo']; print $@; - __END__ - foo at foo bar line 200. - - % perl - # line 345 "goop" - eval "\n#line " . __LINE__ . ' "' . __FILE__ ."\"\ndie 'foo'"; - print $@; - __END__ - foo at goop line 345. - -=cut diff --git a/lib/perl5/5.6.1/pods/perlthrtut.pod b/lib/perl5/5.6.1/pods/perlthrtut.pod deleted file mode 100644 index 0b7092b3..00000000 --- a/lib/perl5/5.6.1/pods/perlthrtut.pod +++ /dev/null @@ -1,1067 +0,0 @@ -=head1 NAME - -perlthrtut - tutorial on threads in Perl - -=head1 DESCRIPTION - - WARNING: Threading is an experimental feature. Both the interface - and implementation are subject to change drastically. In fact, this - documentation describes the flavor of threads that was in version - 5.005. Perl 5.6.0 and later have the beginnings of support for - interpreter threads, which (when finished) is expected to be - significantly different from what is described here. The information - contained here may therefore soon be obsolete. Use at your own risk! - -One of the most prominent new features of Perl 5.005 is the inclusion -of threads. Threads make a number of things a lot easier, and are a -very useful addition to your bag of programming tricks. - -=head1 What Is A Thread Anyway? - -A thread is a flow of control through a program with a single -execution point. - -Sounds an awful lot like a process, doesn't it? Well, it should. -Threads are one of the pieces of a process. Every process has at least -one thread and, up until now, every process running Perl had only one -thread. With 5.005, though, you can create extra threads. We're going -to show you how, when, and why. - -=head1 Threaded Program Models - -There are three basic ways that you can structure a threaded -program. Which model you choose depends on what you need your program -to do. For many non-trivial threaded programs you'll need to choose -different models for different pieces of your program. - -=head2 Boss/Worker - -The boss/worker model usually has one `boss' thread and one or more -`worker' threads. The boss thread gathers or generates tasks that need -to be done, then parcels those tasks out to the appropriate worker -thread. - -This model is common in GUI and server programs, where a main thread -waits for some event and then passes that event to the appropriate -worker threads for processing. Once the event has been passed on, the -boss thread goes back to waiting for another event. - -The boss thread does relatively little work. While tasks aren't -necessarily performed faster than with any other method, it tends to -have the best user-response times. - -=head2 Work Crew - -In the work crew model, several threads are created that do -essentially the same thing to different pieces of data. It closely -mirrors classical parallel processing and vector processors, where a -large array of processors do the exact same thing to many pieces of -data. - -This model is particularly useful if the system running the program -will distribute multiple threads across different processors. It can -also be useful in ray tracing or rendering engines, where the -individual threads can pass on interim results to give the user visual -feedback. - -=head2 Pipeline - -The pipeline model divides up a task into a series of steps, and -passes the results of one step on to the thread processing the -next. Each thread does one thing to each piece of data and passes the -results to the next thread in line. - -This model makes the most sense if you have multiple processors so two -or more threads will be executing in parallel, though it can often -make sense in other contexts as well. It tends to keep the individual -tasks small and simple, as well as allowing some parts of the pipeline -to block (on I/O or system calls, for example) while other parts keep -going. If you're running different parts of the pipeline on different -processors you may also take advantage of the caches on each -processor. - -This model is also handy for a form of recursive programming where, -rather than having a subroutine call itself, it instead creates -another thread. Prime and Fibonacci generators both map well to this -form of the pipeline model. (A version of a prime number generator is -presented later on.) - -=head1 Native threads - -There are several different ways to implement threads on a system. How -threads are implemented depends both on the vendor and, in some cases, -the version of the operating system. Often the first implementation -will be relatively simple, but later versions of the OS will be more -sophisticated. - -While the information in this section is useful, it's not necessary, -so you can skip it if you don't feel up to it. - -There are three basic categories of threads-user-mode threads, kernel -threads, and multiprocessor kernel threads. - -User-mode threads are threads that live entirely within a program and -its libraries. In this model, the OS knows nothing about threads. As -far as it's concerned, your process is just a process. - -This is the easiest way to implement threads, and the way most OSes -start. The big disadvantage is that, since the OS knows nothing about -threads, if one thread blocks they all do. Typical blocking activities -include most system calls, most I/O, and things like sleep(). - -Kernel threads are the next step in thread evolution. The OS knows -about kernel threads, and makes allowances for them. The main -difference between a kernel thread and a user-mode thread is -blocking. With kernel threads, things that block a single thread don't -block other threads. This is not the case with user-mode threads, -where the kernel blocks at the process level and not the thread level. - -This is a big step forward, and can give a threaded program quite a -performance boost over non-threaded programs. Threads that block -performing I/O, for example, won't block threads that are doing other -things. Each process still has only one thread running at once, -though, regardless of how many CPUs a system might have. - -Since kernel threading can interrupt a thread at any time, they will -uncover some of the implicit locking assumptions you may make in your -program. For example, something as simple as C<$a = $a + 2> can behave -unpredictably with kernel threads if $a is visible to other -threads, as another thread may have changed $a between the time it -was fetched on the right hand side and the time the new value is -stored. - -Multiprocessor Kernel Threads are the final step in thread -support. With multiprocessor kernel threads on a machine with multiple -CPUs, the OS may schedule two or more threads to run simultaneously on -different CPUs. - -This can give a serious performance boost to your threaded program, -since more than one thread will be executing at the same time. As a -tradeoff, though, any of those nagging synchronization issues that -might not have shown with basic kernel threads will appear with a -vengeance. - -In addition to the different levels of OS involvement in threads, -different OSes (and different thread implementations for a particular -OS) allocate CPU cycles to threads in different ways. - -Cooperative multitasking systems have running threads give up control -if one of two things happen. If a thread calls a yield function, it -gives up control. It also gives up control if the thread does -something that would cause it to block, such as perform I/O. In a -cooperative multitasking implementation, one thread can starve all the -others for CPU time if it so chooses. - -Preemptive multitasking systems interrupt threads at regular intervals -while the system decides which thread should run next. In a preemptive -multitasking system, one thread usually won't monopolize the CPU. - -On some systems, there can be cooperative and preemptive threads -running simultaneously. (Threads running with realtime priorities -often behave cooperatively, for example, while threads running at -normal priorities behave preemptively.) - -=head1 What kind of threads are perl threads? - -If you have experience with other thread implementations, you might -find that things aren't quite what you expect. It's very important to -remember when dealing with Perl threads that Perl Threads Are Not X -Threads, for all values of X. They aren't POSIX threads, or -DecThreads, or Java's Green threads, or Win32 threads. There are -similarities, and the broad concepts are the same, but if you start -looking for implementation details you're going to be either -disappointed or confused. Possibly both. - -This is not to say that Perl threads are completely different from -everything that's ever come before--they're not. Perl's threading -model owes a lot to other thread models, especially POSIX. Just as -Perl is not C, though, Perl threads are not POSIX threads. So if you -find yourself looking for mutexes, or thread priorities, it's time to -step back a bit and think about what you want to do and how Perl can -do it. - -=head1 Threadsafe Modules - -The addition of threads has changed Perl's internals -substantially. There are implications for people who write -modules--especially modules with XS code or external libraries. While -most modules won't encounter any problems, modules that aren't -explicitly tagged as thread-safe should be tested before being used in -production code. - -Not all modules that you might use are thread-safe, and you should -always assume a module is unsafe unless the documentation says -otherwise. This includes modules that are distributed as part of the -core. Threads are a beta feature, and even some of the standard -modules aren't thread-safe. - -If you're using a module that's not thread-safe for some reason, you -can protect yourself by using semaphores and lots of programming -discipline to control access to the module. Semaphores are covered -later in the article. Perl Threads Are Different - -=head1 Thread Basics - -The core Thread module provides the basic functions you need to write -threaded programs. In the following sections we'll cover the basics, -showing you what you need to do to create a threaded program. After -that, we'll go over some of the features of the Thread module that -make threaded programming easier. - -=head2 Basic Thread Support - -Thread support is a Perl compile-time option-it's something that's -turned on or off when Perl is built at your site, rather than when -your programs are compiled. If your Perl wasn't compiled with thread -support enabled, then any attempt to use threads will fail. - -Remember that the threading support in 5.005 is in beta release, and -should be treated as such. You should expect that it may not function -entirely properly, and the thread interface may well change some -before it is a fully supported, production release. The beta version -shouldn't be used for mission-critical projects. Having said that, -threaded Perl is pretty nifty, and worth a look. - -Your programs can use the Config module to check whether threads are -enabled. If your program can't run without them, you can say something -like: - - $Config{usethreads} or die "Recompile Perl with threads to run this program."; - -A possibly-threaded program using a possibly-threaded module might -have code like this: - - use Config; - use MyMod; - - if ($Config{usethreads}) { - # We have threads - require MyMod_threaded; - import MyMod_threaded; - } else { - require MyMod_unthreaded; - import MyMod_unthreaded; - } - -Since code that runs both with and without threads is usually pretty -messy, it's best to isolate the thread-specific code in its own -module. In our example above, that's what MyMod_threaded is, and it's -only imported if we're running on a threaded Perl. - -=head2 Creating Threads - -The Thread package provides the tools you need to create new -threads. Like any other module, you need to tell Perl you want to use -it; use Thread imports all the pieces you need to create basic -threads. - -The simplest, straightforward way to create a thread is with new(): - - use Thread; - - $thr = new Thread \&sub1; - - sub sub1 { - print "In the thread\n"; - } - -The new() method takes a reference to a subroutine and creates a new -thread, which starts executing in the referenced subroutine. Control -then passes both to the subroutine and the caller. - -If you need to, your program can pass parameters to the subroutine as -part of the thread startup. Just include the list of parameters as -part of the C call, like this: - - use Thread; - $Param3 = "foo"; - $thr = new Thread \&sub1, "Param 1", "Param 2", $Param3; - $thr = new Thread \&sub1, @ParamList; - $thr = new Thread \&sub1, qw(Param1 Param2 $Param3); - - sub sub1 { - my @InboundParameters = @_; - print "In the thread\n"; - print "got parameters >", join("<>", @InboundParameters), "<\n"; - } - - -The subroutine runs like a normal Perl subroutine, and the call to new -Thread returns whatever the subroutine returns. - -The last example illustrates another feature of threads. You can spawn -off several threads using the same subroutine. Each thread executes -the same subroutine, but in a separate thread with a separate -environment and potentially separate arguments. - -The other way to spawn a new thread is with async(), which is a way to -spin off a chunk of code like eval(), but into its own thread: - - use Thread qw(async); - - $LineCount = 0; - - $thr = async { - while(<>) {$LineCount++} - print "Got $LineCount lines\n"; - }; - - print "Waiting for the linecount to end\n"; - $thr->join; - print "All done\n"; - -You'll notice we did a use Thread qw(async) in that example. async is -not exported by default, so if you want it, you'll either need to -import it before you use it or fully qualify it as -Thread::async. You'll also note that there's a semicolon after the -closing brace. That's because async() treats the following block as an -anonymous subroutine, so the semicolon is necessary. - -Like eval(), the code executes in the same context as it would if it -weren't spun off. Since both the code inside and after the async start -executing, you need to be careful with any shared resources. Locking -and other synchronization techniques are covered later. - -=head2 Giving up control - -There are times when you may find it useful to have a thread -explicitly give up the CPU to another thread. Your threading package -might not support preemptive multitasking for threads, for example, or -you may be doing something compute-intensive and want to make sure -that the user-interface thread gets called frequently. Regardless, -there are times that you might want a thread to give up the processor. - -Perl's threading package provides the yield() function that does -this. yield() is pretty straightforward, and works like this: - - use Thread qw(yield async); - async { - my $foo = 50; - while ($foo--) { print "first async\n" } - yield; - $foo = 50; - while ($foo--) { print "first async\n" } - }; - async { - my $foo = 50; - while ($foo--) { print "second async\n" } - yield; - $foo = 50; - while ($foo--) { print "second async\n" } - }; - -=head2 Waiting For A Thread To Exit - -Since threads are also subroutines, they can return values. To wait -for a thread to exit and extract any scalars it might return, you can -use the join() method. - - use Thread; - $thr = new Thread \&sub1; - - @ReturnData = $thr->join; - print "Thread returned @ReturnData"; - - sub sub1 { return "Fifty-six", "foo", 2; } - -In the example above, the join() method returns as soon as the thread -ends. In addition to waiting for a thread to finish and gathering up -any values that the thread might have returned, join() also performs -any OS cleanup necessary for the thread. That cleanup might be -important, especially for long-running programs that spawn lots of -threads. If you don't want the return values and don't want to wait -for the thread to finish, you should call the detach() method -instead. detach() is covered later in the article. - -=head2 Errors In Threads - -So what happens when an error occurs in a thread? Any errors that -could be caught with eval() are postponed until the thread is -joined. If your program never joins, the errors appear when your -program exits. - -Errors deferred until a join() can be caught with eval(): - - use Thread qw(async); - $thr = async {$b = 3/0}; # Divide by zero error - $foo = eval {$thr->join}; - if ($@) { - print "died with error $@\n"; - } else { - print "Hey, why aren't you dead?\n"; - } - -eval() passes any results from the joined thread back unmodified, so -if you want the return value of the thread, this is your only chance -to get them. - -=head2 Ignoring A Thread - -join() does three things: it waits for a thread to exit, cleans up -after it, and returns any data the thread may have produced. But what -if you're not interested in the thread's return values, and you don't -really care when the thread finishes? All you want is for the thread -to get cleaned up after when it's done. - -In this case, you use the detach() method. Once a thread is detached, -it'll run until it's finished, then Perl will clean up after it -automatically. - - use Thread; - $thr = new Thread \&sub1; # Spawn the thread - - $thr->detach; # Now we officially don't care any more - - sub sub1 { - $a = 0; - while (1) { - $a++; - print "\$a is $a\n"; - sleep 1; - } - } - - -Once a thread is detached, it may not be joined, and any output that -it might have produced (if it was done and waiting for a join) is -lost. - -=head1 Threads And Data - -Now that we've covered the basics of threads, it's time for our next -topic: data. Threading introduces a couple of complications to data -access that non-threaded programs never need to worry about. - -=head2 Shared And Unshared Data - -The single most important thing to remember when using threads is that -all threads potentially have access to all the data anywhere in your -program. While this is true with a nonthreaded Perl program as well, -it's especially important to remember with a threaded program, since -more than one thread can be accessing this data at once. - -Perl's scoping rules don't change because you're using threads. If a -subroutine (or block, in the case of async()) could see a variable if -you weren't running with threads, it can see it if you are. This is -especially important for the subroutines that create, and makes C -variables even more important. Remember--if your variables aren't -lexically scoped (declared with C) you're probably sharing them -between threads. - -=head2 Thread Pitfall: Races - -While threads bring a new set of useful tools, they also bring a -number of pitfalls. One pitfall is the race condition: - - use Thread; - $a = 1; - $thr1 = Thread->new(\&sub1); - $thr2 = Thread->new(\&sub2); - - sleep 10; - print "$a\n"; - - sub sub1 { $foo = $a; $a = $foo + 1; } - sub sub2 { $bar = $a; $a = $bar + 1; } - -What do you think $a will be? The answer, unfortunately, is "it -depends." Both sub1() and sub2() access the global variable $a, once -to read and once to write. Depending on factors ranging from your -thread implementation's scheduling algorithm to the phase of the moon, -$a can be 2 or 3. - -Race conditions are caused by unsynchronized access to shared -data. Without explicit synchronization, there's no way to be sure that -nothing has happened to the shared data between the time you access it -and the time you update it. Even this simple code fragment has the -possibility of error: - - use Thread qw(async); - $a = 2; - async{ $b = $a; $a = $b + 1; }; - async{ $c = $a; $a = $c + 1; }; - -Two threads both access $a. Each thread can potentially be interrupted -at any point, or be executed in any order. At the end, $a could be 3 -or 4, and both $b and $c could be 2 or 3. - -Whenever your program accesses data or resources that can be accessed -by other threads, you must take steps to coordinate access or risk -data corruption and race conditions. - -=head2 Controlling access: lock() - -The lock() function takes a variable (or subroutine, but we'll get to -that later) and puts a lock on it. No other thread may lock the -variable until the locking thread exits the innermost block containing -the lock. Using lock() is straightforward: - - use Thread qw(async); - $a = 4; - $thr1 = async { - $foo = 12; - { - lock ($a); # Block until we get access to $a - $b = $a; - $a = $b * $foo; - } - print "\$foo was $foo\n"; - }; - $thr2 = async { - $bar = 7; - { - lock ($a); # Block until we can get access to $a - $c = $a; - $a = $c * $bar; - } - print "\$bar was $bar\n"; - }; - $thr1->join; - $thr2->join; - print "\$a is $a\n"; - -lock() blocks the thread until the variable being locked is -available. When lock() returns, your thread can be sure that no other -thread can lock that variable until the innermost block containing the -lock exits. - -It's important to note that locks don't prevent access to the variable -in question, only lock attempts. This is in keeping with Perl's -longstanding tradition of courteous programming, and the advisory file -locking that flock() gives you. Locked subroutines behave differently, -however. We'll cover that later in the article. - -You may lock arrays and hashes as well as scalars. Locking an array, -though, will not block subsequent locks on array elements, just lock -attempts on the array itself. - -Finally, locks are recursive, which means it's okay for a thread to -lock a variable more than once. The lock will last until the outermost -lock() on the variable goes out of scope. - -=head2 Thread Pitfall: Deadlocks - -Locks are a handy tool to synchronize access to data. Using them -properly is the key to safe shared data. Unfortunately, locks aren't -without their dangers. Consider the following code: - - use Thread qw(async yield); - $a = 4; - $b = "foo"; - async { - lock($a); - yield; - sleep 20; - lock ($b); - }; - async { - lock($b); - yield; - sleep 20; - lock ($a); - }; - -This program will probably hang until you kill it. The only way it -won't hang is if one of the two async() routines acquires both locks -first. A guaranteed-to-hang version is more complicated, but the -principle is the same. - -The first thread spawned by async() will grab a lock on $a then, a -second or two later, try to grab a lock on $b. Meanwhile, the second -thread grabs a lock on $b, then later tries to grab a lock on $a. The -second lock attempt for both threads will block, each waiting for the -other to release its lock. - -This condition is called a deadlock, and it occurs whenever two or -more threads are trying to get locks on resources that the others -own. Each thread will block, waiting for the other to release a lock -on a resource. That never happens, though, since the thread with the -resource is itself waiting for a lock to be released. - -There are a number of ways to handle this sort of problem. The best -way is to always have all threads acquire locks in the exact same -order. If, for example, you lock variables $a, $b, and $c, always lock -$a before $b, and $b before $c. It's also best to hold on to locks for -as short a period of time to minimize the risks of deadlock. - -=head2 Queues: Passing Data Around - -A queue is a special thread-safe object that lets you put data in one -end and take it out the other without having to worry about -synchronization issues. They're pretty straightforward, and look like -this: - - use Thread qw(async); - use Thread::Queue; - - my $DataQueue = new Thread::Queue; - $thr = async { - while ($DataElement = $DataQueue->dequeue) { - print "Popped $DataElement off the queue\n"; - } - }; - - $DataQueue->enqueue(12); - $DataQueue->enqueue("A", "B", "C"); - $DataQueue->enqueue(\$thr); - sleep 10; - $DataQueue->enqueue(undef); - -You create the queue with new Thread::Queue. Then you can add lists of -scalars onto the end with enqueue(), and pop scalars off the front of -it with dequeue(). A queue has no fixed size, and can grow as needed -to hold everything pushed on to it. - -If a queue is empty, dequeue() blocks until another thread enqueues -something. This makes queues ideal for event loops and other -communications between threads. - -=head1 Threads And Code - -In addition to providing thread-safe access to data via locks and -queues, threaded Perl also provides general-purpose semaphores for -coarser synchronization than locks provide and thread-safe access to -entire subroutines. - -=head2 Semaphores: Synchronizing Data Access - -Semaphores are a kind of generic locking mechanism. Unlike lock, which -gets a lock on a particular scalar, Perl doesn't associate any -particular thing with a semaphore so you can use them to control -access to anything you like. In addition, semaphores can allow more -than one thread to access a resource at once, though by default -semaphores only allow one thread access at a time. - -=over 4 - -=item Basic semaphores - -Semaphores have two methods, down and up. down decrements the resource -count, while up increments it. down calls will block if the -semaphore's current count would decrement below zero. This program -gives a quick demonstration: - - use Thread qw(yield); - use Thread::Semaphore; - my $semaphore = new Thread::Semaphore; - $GlobalVariable = 0; - - $thr1 = new Thread \&sample_sub, 1; - $thr2 = new Thread \&sample_sub, 2; - $thr3 = new Thread \&sample_sub, 3; - - sub sample_sub { - my $SubNumber = shift @_; - my $TryCount = 10; - my $LocalCopy; - sleep 1; - while ($TryCount--) { - $semaphore->down; - $LocalCopy = $GlobalVariable; - print "$TryCount tries left for sub $SubNumber (\$GlobalVariable is $GlobalVariable)\n"; - yield; - sleep 2; - $LocalCopy++; - $GlobalVariable = $LocalCopy; - $semaphore->up; - } - } - -The three invocations of the subroutine all operate in sync. The -semaphore, though, makes sure that only one thread is accessing the -global variable at once. - -=item Advanced Semaphores - -By default, semaphores behave like locks, letting only one thread -down() them at a time. However, there are other uses for semaphores. - -Each semaphore has a counter attached to it. down() decrements the -counter and up() increments the counter. By default, semaphores are -created with the counter set to one, down() decrements by one, and -up() increments by one. If down() attempts to decrement the counter -below zero, it blocks until the counter is large enough. Note that -while a semaphore can be created with a starting count of zero, any -up() or down() always changes the counter by at least -one. $semaphore->down(0) is the same as $semaphore->down(1). - -The question, of course, is why would you do something like this? Why -create a semaphore with a starting count that's not one, or why -decrement/increment it by more than one? The answer is resource -availability. Many resources that you want to manage access for can be -safely used by more than one thread at once. - -For example, let's take a GUI driven program. It has a semaphore that -it uses to synchronize access to the display, so only one thread is -ever drawing at once. Handy, but of course you don't want any thread -to start drawing until things are properly set up. In this case, you -can create a semaphore with a counter set to zero, and up it when -things are ready for drawing. - -Semaphores with counters greater than one are also useful for -establishing quotas. Say, for example, that you have a number of -threads that can do I/O at once. You don't want all the threads -reading or writing at once though, since that can potentially swamp -your I/O channels, or deplete your process' quota of filehandles. You -can use a semaphore initialized to the number of concurrent I/O -requests (or open files) that you want at any one time, and have your -threads quietly block and unblock themselves. - -Larger increments or decrements are handy in those cases where a -thread needs to check out or return a number of resources at once. - -=back - -=head2 Attributes: Restricting Access To Subroutines - -In addition to synchronizing access to data or resources, you might -find it useful to synchronize access to subroutines. You may be -accessing a singular machine resource (perhaps a vector processor), or -find it easier to serialize calls to a particular subroutine than to -have a set of locks and semaphores. - -One of the additions to Perl 5.005 is subroutine attributes. The -Thread package uses these to provide several flavors of -serialization. It's important to remember that these attributes are -used in the compilation phase of your program so you can't change a -subroutine's behavior while your program is actually running. - -=head2 Subroutine Locks - -The basic subroutine lock looks like this: - - sub test_sub :locked { - } - -This ensures that only one thread will be executing this subroutine at -any one time. Once a thread calls this subroutine, any other thread -that calls it will block until the thread in the subroutine exits -it. A more elaborate example looks like this: - - use Thread qw(yield); - - new Thread \&thread_sub, 1; - new Thread \&thread_sub, 2; - new Thread \&thread_sub, 3; - new Thread \&thread_sub, 4; - - sub sync_sub :locked { - my $CallingThread = shift @_; - print "In sync_sub for thread $CallingThread\n"; - yield; - sleep 3; - print "Leaving sync_sub for thread $CallingThread\n"; - } - - sub thread_sub { - my $ThreadID = shift @_; - print "Thread $ThreadID calling sync_sub\n"; - sync_sub($ThreadID); - print "$ThreadID is done with sync_sub\n"; - } - -The C attribute tells perl to lock sync_sub(), and if you run -this, you can see that only one thread is in it at any one time. - -=head2 Methods - -Locking an entire subroutine can sometimes be overkill, especially -when dealing with Perl objects. When calling a method for an object, -for example, you want to serialize calls to a method, so that only one -thread will be in the subroutine for a particular object, but threads -calling that subroutine for a different object aren't blocked. The -method attribute indicates whether the subroutine is really a method. - - use Thread; - - sub tester { - my $thrnum = shift @_; - my $bar = new Foo; - foreach (1..10) { - print "$thrnum calling per_object\n"; - $bar->per_object($thrnum); - print "$thrnum out of per_object\n"; - yield; - print "$thrnum calling one_at_a_time\n"; - $bar->one_at_a_time($thrnum); - print "$thrnum out of one_at_a_time\n"; - yield; - } - } - - foreach my $thrnum (1..10) { - new Thread \&tester, $thrnum; - } - - package Foo; - sub new { - my $class = shift @_; - return bless [@_], $class; - } - - sub per_object :locked :method { - my ($class, $thrnum) = @_; - print "In per_object for thread $thrnum\n"; - yield; - sleep 2; - print "Exiting per_object for thread $thrnum\n"; - } - - sub one_at_a_time :locked { - my ($class, $thrnum) = @_; - print "In one_at_a_time for thread $thrnum\n"; - yield; - sleep 2; - print "Exiting one_at_a_time for thread $thrnum\n"; - } - -As you can see from the output (omitted for brevity; it's 800 lines) -all the threads can be in per_object() simultaneously, but only one -thread is ever in one_at_a_time() at once. - -=head2 Locking A Subroutine - -You can lock a subroutine as you would lock a variable. Subroutine locks -work the same as specifying a C attribute for the subroutine, -and block all access to the subroutine for other threads until the -lock goes out of scope. When the subroutine isn't locked, any number -of threads can be in it at once, and getting a lock on a subroutine -doesn't affect threads already in the subroutine. Getting a lock on a -subroutine looks like this: - - lock(\&sub_to_lock); - -Simple enough. Unlike the C attribute, which is a compile time -option, locking and unlocking a subroutine can be done at runtime at your -discretion. There is some runtime penalty to using lock(\&sub) instead -of the C attribute, so make sure you're choosing the proper -method to do the locking. - -You'd choose lock(\&sub) when writing modules and code to run on both -threaded and unthreaded Perl, especially for code that will run on -5.004 or earlier Perls. In that case, it's useful to have subroutines -that should be serialized lock themselves if they're running threaded, -like so: - - package Foo; - use Config; - $Running_Threaded = 0; - - BEGIN { $Running_Threaded = $Config{'usethreads'} } - - sub sub1 { lock(\&sub1) if $Running_Threaded } - - -This way you can ensure single-threadedness regardless of which -version of Perl you're running. - -=head1 General Thread Utility Routines - -We've covered the workhorse parts of Perl's threading package, and -with these tools you should be well on your way to writing threaded -code and packages. There are a few useful little pieces that didn't -really fit in anyplace else. - -=head2 What Thread Am I In? - -The Thread->self method provides your program with a way to get an -object representing the thread it's currently in. You can use this -object in the same way as the ones returned from the thread creation. - -=head2 Thread IDs - -tid() is a thread object method that returns the thread ID of the -thread the object represents. Thread IDs are integers, with the main -thread in a program being 0. Currently Perl assigns a unique tid to -every thread ever created in your program, assigning the first thread -to be created a tid of 1, and increasing the tid by 1 for each new -thread that's created. - -=head2 Are These Threads The Same? - -The equal() method takes two thread objects and returns true -if the objects represent the same thread, and false if they don't. - -=head2 What Threads Are Running? - -Thread->list returns a list of thread objects, one for each thread -that's currently running. Handy for a number of things, including -cleaning up at the end of your program: - - # Loop through all the threads - foreach $thr (Thread->list) { - # Don't join the main thread or ourselves - if ($thr->tid && !Thread::equal($thr, Thread->self)) { - $thr->join; - } - } - -The example above is just for illustration. It isn't strictly -necessary to join all the threads you create, since Perl detaches all -the threads before it exits. - -=head1 A Complete Example - -Confused yet? It's time for an example program to show some of the -things we've covered. This program finds prime numbers using threads. - - 1 #!/usr/bin/perl -w - 2 # prime-pthread, courtesy of Tom Christiansen - 3 - 4 use strict; - 5 - 6 use Thread; - 7 use Thread::Queue; - 8 - 9 my $stream = new Thread::Queue; - 10 my $kid = new Thread(\&check_num, $stream, 2); - 11 - 12 for my $i ( 3 .. 1000 ) { - 13 $stream->enqueue($i); - 14 } - 15 - 16 $stream->enqueue(undef); - 17 $kid->join(); - 18 - 19 sub check_num { - 20 my ($upstream, $cur_prime) = @_; - 21 my $kid; - 22 my $downstream = new Thread::Queue; - 23 while (my $num = $upstream->dequeue) { - 24 next unless $num % $cur_prime; - 25 if ($kid) { - 26 $downstream->enqueue($num); - 27 } else { - 28 print "Found prime $num\n"; - 29 $kid = new Thread(\&check_num, $downstream, $num); - 30 } - 31 } - 32 $downstream->enqueue(undef) if $kid; - 33 $kid->join() if $kid; - 34 } - -This program uses the pipeline model to generate prime numbers. Each -thread in the pipeline has an input queue that feeds numbers to be -checked, a prime number that it's responsible for, and an output queue -that it funnels numbers that have failed the check into. If the thread -has a number that's failed its check and there's no child thread, then -the thread must have found a new prime number. In that case, a new -child thread is created for that prime and stuck on the end of the -pipeline. - -This probably sounds a bit more confusing than it really is, so lets -go through this program piece by piece and see what it does. (For -those of you who might be trying to remember exactly what a prime -number is, it's a number that's only evenly divisible by itself and 1) - -The bulk of the work is done by the check_num() subroutine, which -takes a reference to its input queue and a prime number that it's -responsible for. After pulling in the input queue and the prime that -the subroutine's checking (line 20), we create a new queue (line 22) -and reserve a scalar for the thread that we're likely to create later -(line 21). - -The while loop from lines 23 to line 31 grabs a scalar off the input -queue and checks against the prime this thread is responsible -for. Line 24 checks to see if there's a remainder when we modulo the -number to be checked against our prime. If there is one, the number -must not be evenly divisible by our prime, so we need to either pass -it on to the next thread if we've created one (line 26) or create a -new thread if we haven't. - -The new thread creation is line 29. We pass on to it a reference to -the queue we've created, and the prime number we've found. - -Finally, once the loop terminates (because we got a 0 or undef in the -queue, which serves as a note to die), we pass on the notice to our -child and wait for it to exit if we've created a child (Lines 32 and -37). - -Meanwhile, back in the main thread, we create a queue (line 9) and the -initial child thread (line 10), and pre-seed it with the first prime: -2. Then we queue all the numbers from 3 to 1000 for checking (lines -12-14), then queue a die notice (line 16) and wait for the first child -thread to terminate (line 17). Because a child won't die until its -child has died, we know that we're done once we return from the join. - -That's how it works. It's pretty simple; as with many Perl programs, -the explanation is much longer than the program. - -=head1 Conclusion - -A complete thread tutorial could fill a book (and has, many times), -but this should get you well on your way. The final authority on how -Perl's threads behave is the documentation bundled with the Perl -distribution, but with what we've covered in this article, you should -be well on your way to becoming a threaded Perl expert. - -=head1 Bibliography - -Here's a short bibliography courtesy of Jürgen Christoffel: - -=head2 Introductory Texts - -Birrell, Andrew D. An Introduction to Programming with -Threads. Digital Equipment Corporation, 1989, DEC-SRC Research Report -#35 online as -http://www.research.digital.com/SRC/staff/birrell/bib.html (highly -recommended) - -Robbins, Kay. A., and Steven Robbins. Practical Unix Programming: A -Guide to Concurrency, Communication, and -Multithreading. Prentice-Hall, 1996. - -Lewis, Bill, and Daniel J. Berg. Multithreaded Programming with -Pthreads. Prentice Hall, 1997, ISBN 0-13-443698-9 (a well-written -introduction to threads). - -Nelson, Greg (editor). Systems Programming with Modula-3. Prentice -Hall, 1991, ISBN 0-13-590464-1. - -Nichols, Bradford, Dick Buttlar, and Jacqueline Proulx Farrell. -Pthreads Programming. O'Reilly & Associates, 1996, ISBN 156592-115-1 -(covers POSIX threads). - -=head2 OS-Related References - -Boykin, Joseph, David Kirschen, Alan Langerman, and Susan -LoVerso. Programming under Mach. Addison-Wesley, 1994, ISBN -0-201-52739-1. - -Tanenbaum, Andrew S. Distributed Operating Systems. Prentice Hall, -1995, ISBN 0-13-219908-4 (great textbook). - -Silberschatz, Abraham, and Peter B. Galvin. Operating System Concepts, -4th ed. Addison-Wesley, 1995, ISBN 0-201-59292-4 - -=head2 Other References - -Arnold, Ken and James Gosling. The Java Programming Language, 2nd -ed. Addison-Wesley, 1998, ISBN 0-201-31006-6. - -Le Sergent, T. and B. Berthomieu. "Incremental MultiThreaded Garbage -Collection on Virtually Shared Memory Architectures" in Memory -Management: Proc. of the International Workshop IWMM 92, St. Malo, -France, September 1992, Yves Bekkers and Jacques Cohen, eds. Springer, -1992, ISBN 3540-55940-X (real-life thread applications). - -=head1 Acknowledgements - -Thanks (in no particular order) to Chaim Frenkel, Steve Fink, Gurusamy -Sarathy, Ilya Zakharevich, Benjamin Sugars, Jürgen Christoffel, Joshua -Pritikin, and Alan Burlison, for their help in reality-checking and -polishing this article. Big thanks to Tom Christiansen for his rewrite -of the prime number generator. - -=head1 AUTHOR - -Dan Sugalski Esugalskd@ous.eduE - -=head1 Copyrights - -This article originally appeared in The Perl Journal #10, and is -copyright 1998 The Perl Journal. It appears courtesy of Jon Orwant and -The Perl Journal. This document may be distributed under the same terms -as Perl itself. - - diff --git a/lib/perl5/5.6.1/pods/perltie.pod b/lib/perl5/5.6.1/pods/perltie.pod deleted file mode 100644 index 1bba005b..00000000 --- a/lib/perl5/5.6.1/pods/perltie.pod +++ /dev/null @@ -1,1084 +0,0 @@ -=head1 NAME - -perltie - how to hide an object class in a simple variable - -=head1 SYNOPSIS - - tie VARIABLE, CLASSNAME, LIST - - $object = tied VARIABLE - - untie VARIABLE - -=head1 DESCRIPTION - -Prior to release 5.0 of Perl, a programmer could use dbmopen() -to connect an on-disk database in the standard Unix dbm(3x) -format magically to a %HASH in their program. However, their Perl was either -built with one particular dbm library or another, but not both, and -you couldn't extend this mechanism to other packages or types of variables. - -Now you can. - -The tie() function binds a variable to a class (package) that will provide -the implementation for access methods for that variable. Once this magic -has been performed, accessing a tied variable automatically triggers -method calls in the proper class. The complexity of the class is -hidden behind magic methods calls. The method names are in ALL CAPS, -which is a convention that Perl uses to indicate that they're called -implicitly rather than explicitly--just like the BEGIN() and END() -functions. - -In the tie() call, C is the name of the variable to be -enchanted. C is the name of a class implementing objects of -the correct type. Any additional arguments in the C are passed to -the appropriate constructor method for that class--meaning TIESCALAR(), -TIEARRAY(), TIEHASH(), or TIEHANDLE(). (Typically these are arguments -such as might be passed to the dbminit() function of C.) The object -returned by the "new" method is also returned by the tie() function, -which would be useful if you wanted to access other methods in -C. (You don't actually have to return a reference to a right -"type" (e.g., HASH or C) so long as it's a properly blessed -object.) You can also retrieve a reference to the underlying object -using the tied() function. - -Unlike dbmopen(), the tie() function will not C or C a module -for you--you need to do that explicitly yourself. - -=head2 Tying Scalars - -A class implementing a tied scalar should define the following methods: -TIESCALAR, FETCH, STORE, and possibly UNTIE and/or DESTROY. - -Let's look at each in turn, using as an example a tie class for -scalars that allows the user to do something like: - - tie $his_speed, 'Nice', getppid(); - tie $my_speed, 'Nice', $$; - -And now whenever either of those variables is accessed, its current -system priority is retrieved and returned. If those variables are set, -then the process's priority is changed! - -We'll use Jarkko Hietaniemi >'s BSD::Resource class (not -included) to access the PRIO_PROCESS, PRIO_MIN, and PRIO_MAX constants -from your system, as well as the getpriority() and setpriority() system -calls. Here's the preamble of the class. - - package Nice; - use Carp; - use BSD::Resource; - use strict; - $Nice::DEBUG = 0 unless defined $Nice::DEBUG; - -=over 4 - -=item TIESCALAR classname, LIST - -This is the constructor for the class. That means it is -expected to return a blessed reference to a new scalar -(probably anonymous) that it's creating. For example: - - sub TIESCALAR { - my $class = shift; - my $pid = shift || $$; # 0 means me - - if ($pid !~ /^\d+$/) { - carp "Nice::Tie::Scalar got non-numeric pid $pid" if $^W; - return undef; - } - - unless (kill 0, $pid) { # EPERM or ERSCH, no doubt - carp "Nice::Tie::Scalar got bad pid $pid: $!" if $^W; - return undef; - } - - return bless \$pid, $class; - } - -This tie class has chosen to return an error rather than raising an -exception if its constructor should fail. While this is how dbmopen() works, -other classes may well not wish to be so forgiving. It checks the global -variable C<$^W> to see whether to emit a bit of noise anyway. - -=item FETCH this - -This method will be triggered every time the tied variable is accessed -(read). It takes no arguments beyond its self reference, which is the -object representing the scalar we're dealing with. Because in this case -we're using just a SCALAR ref for the tied scalar object, a simple $$self -allows the method to get at the real value stored there. In our example -below, that real value is the process ID to which we've tied our variable. - - sub FETCH { - my $self = shift; - confess "wrong type" unless ref $self; - croak "usage error" if @_; - my $nicety; - local($!) = 0; - $nicety = getpriority(PRIO_PROCESS, $$self); - if ($!) { croak "getpriority failed: $!" } - return $nicety; - } - -This time we've decided to blow up (raise an exception) if the renice -fails--there's no place for us to return an error otherwise, and it's -probably the right thing to do. - -=item STORE this, value - -This method will be triggered every time the tied variable is set -(assigned). Beyond its self reference, it also expects one (and only one) -argument--the new value the user is trying to assign. - - sub STORE { - my $self = shift; - confess "wrong type" unless ref $self; - my $new_nicety = shift; - croak "usage error" if @_; - - if ($new_nicety < PRIO_MIN) { - carp sprintf - "WARNING: priority %d less than minimum system priority %d", - $new_nicety, PRIO_MIN if $^W; - $new_nicety = PRIO_MIN; - } - - if ($new_nicety > PRIO_MAX) { - carp sprintf - "WARNING: priority %d greater than maximum system priority %d", - $new_nicety, PRIO_MAX if $^W; - $new_nicety = PRIO_MAX; - } - - unless (defined setpriority(PRIO_PROCESS, $$self, $new_nicety)) { - confess "setpriority failed: $!"; - } - return $new_nicety; - } - -=item UNTIE this - -This method will be triggered when the C occurs. This can be useful -if the class needs to know when no further calls will be made. (Except DESTROY -of course.) See below for more details. - -=item DESTROY this - -This method will be triggered when the tied variable needs to be destructed. -As with other object classes, such a method is seldom necessary, because Perl -deallocates its moribund object's memory for you automatically--this isn't -C++, you know. We'll use a DESTROY method here for debugging purposes only. - - sub DESTROY { - my $self = shift; - confess "wrong type" unless ref $self; - carp "[ Nice::DESTROY pid $$self ]" if $Nice::DEBUG; - } - -=back - -That's about all there is to it. Actually, it's more than all there -is to it, because we've done a few nice things here for the sake -of completeness, robustness, and general aesthetics. Simpler -TIESCALAR classes are certainly possible. - -=head2 Tying Arrays - -A class implementing a tied ordinary array should define the following -methods: TIEARRAY, FETCH, STORE, FETCHSIZE, STORESIZE and perhaps UNTIE and/or DESTROY. - -FETCHSIZE and STORESIZE are used to provide C<$#array> and -equivalent C access. - -The methods POP, PUSH, SHIFT, UNSHIFT, SPLICE, DELETE, and EXISTS are -required if the perl operator with the corresponding (but lowercase) name -is to operate on the tied array. The B class can be used as a -base class to implement the first five of these in terms of the basic -methods above. The default implementations of DELETE and EXISTS in -B simply C. - -In addition EXTEND will be called when perl would have pre-extended -allocation in a real array. - -For this discussion, we'll implement an array whose elements are a fixed -size at creation. If you try to create an element larger than the fixed -size, you'll take an exception. For example: - - use FixedElem_Array; - tie @array, 'FixedElem_Array', 3; - $array[0] = 'cat'; # ok. - $array[1] = 'dogs'; # exception, length('dogs') > 3. - -The preamble code for the class is as follows: - - package FixedElem_Array; - use Carp; - use strict; - -=over 4 - -=item TIEARRAY classname, LIST - -This is the constructor for the class. That means it is expected to -return a blessed reference through which the new array (probably an -anonymous ARRAY ref) will be accessed. - -In our example, just to show you that you don't I have to return an -ARRAY reference, we'll choose a HASH reference to represent our object. -A HASH works out well as a generic record type: the C<{ELEMSIZE}> field will -store the maximum element size allowed, and the C<{ARRAY}> field will hold the -true ARRAY ref. If someone outside the class tries to dereference the -object returned (doubtless thinking it an ARRAY ref), they'll blow up. -This just goes to show you that you should respect an object's privacy. - - sub TIEARRAY { - my $class = shift; - my $elemsize = shift; - if ( @_ || $elemsize =~ /\D/ ) { - croak "usage: tie ARRAY, '" . __PACKAGE__ . "', elem_size"; - } - return bless { - ELEMSIZE => $elemsize, - ARRAY => [], - }, $class; - } - -=item FETCH this, index - -This method will be triggered every time an individual element the tied array -is accessed (read). It takes one argument beyond its self reference: the -index whose value we're trying to fetch. - - sub FETCH { - my $self = shift; - my $index = shift; - return $self->{ARRAY}->[$index]; - } - -If a negative array index is used to read from an array, the index -will be translated to a positive one internally by calling FETCHSIZE -before being passed to FETCH. - -As you may have noticed, the name of the FETCH method (et al.) is the same -for all accesses, even though the constructors differ in names (TIESCALAR -vs TIEARRAY). While in theory you could have the same class servicing -several tied types, in practice this becomes cumbersome, and it's easiest -to keep them at simply one tie type per class. - -=item STORE this, index, value - -This method will be triggered every time an element in the tied array is set -(written). It takes two arguments beyond its self reference: the index at -which we're trying to store something and the value we're trying to put -there. - -In our example, C is really C<$self-E{ELEMSIZE}> number of -spaces so we have a little more work to do here: - - sub STORE { - my $self = shift; - my( $index, $value ) = @_; - if ( length $value > $self->{ELEMSIZE} ) { - croak "length of $value is greater than $self->{ELEMSIZE}"; - } - # fill in the blanks - $self->EXTEND( $index ) if $index > $self->FETCHSIZE(); - # right justify to keep element size for smaller elements - $self->{ARRAY}->[$index] = sprintf "%$self->{ELEMSIZE}s", $value; - } - -Negative indexes are treated the same as with FETCH. - -=item FETCHSIZE this - -Returns the total number of items in the tied array associated with -object I. (Equivalent to C). For example: - - sub FETCHSIZE { - my $self = shift; - return scalar @{$self->{ARRAY}}; - } - -=item STORESIZE this, count - -Sets the total number of items in the tied array associated with -object I to be I. If this makes the array larger then -class's mapping of C should be returned for new positions. -If the array becomes smaller then entries beyond count should be -deleted. - -In our example, 'undef' is really an element containing -C<$self-E{ELEMSIZE}> number of spaces. Observe: - - sub STORESIZE { - my $self = shift; - my $count = shift; - if ( $count > $self->FETCHSIZE() ) { - foreach ( $count - $self->FETCHSIZE() .. $count ) { - $self->STORE( $_, '' ); - } - } elsif ( $count < $self->FETCHSIZE() ) { - foreach ( 0 .. $self->FETCHSIZE() - $count - 2 ) { - $self->POP(); - } - } - } - -=item EXTEND this, count - -Informative call that array is likely to grow to have I entries. -Can be used to optimize allocation. This method need do nothing. - -In our example, we want to make sure there are no blank (C) -entries, so C will make use of C to fill elements -as needed: - - sub EXTEND { - my $self = shift; - my $count = shift; - $self->STORESIZE( $count ); - } - -=item EXISTS this, key - -Verify that the element at index I exists in the tied array I. - -In our example, we will determine that if an element consists of -C<$self-E{ELEMSIZE}> spaces only, it does not exist: - - sub EXISTS { - my $self = shift; - my $index = shift; - return 0 if ! defined $self->{ARRAY}->[$index] || - $self->{ARRAY}->[$index] eq ' ' x $self->{ELEMSIZE}; - return 1; - } - -=item DELETE this, key - -Delete the element at index I from the tied array I. - -In our example, a deleted item is C<$self->{ELEMSIZE}> spaces: - - sub DELETE { - my $self = shift; - my $index = shift; - return $self->STORE( $index, '' ); - } - -=item CLEAR this - -Clear (remove, delete, ...) all values from the tied array associated with -object I. For example: - - sub CLEAR { - my $self = shift; - return $self->{ARRAY} = []; - } - -=item PUSH this, LIST - -Append elements of I to the array. For example: - - sub PUSH { - my $self = shift; - my @list = @_; - my $last = $self->FETCHSIZE(); - $self->STORE( $last + $_, $list[$_] ) foreach 0 .. $#list; - return $self->FETCHSIZE(); - } - -=item POP this - -Remove last element of the array and return it. For example: - - sub POP { - my $self = shift; - return pop @{$self->{ARRAY}}; - } - -=item SHIFT this - -Remove the first element of the array (shifting other elements down) -and return it. For example: - - sub SHIFT { - my $self = shift; - return shift @{$self->{ARRAY}}; - } - -=item UNSHIFT this, LIST - -Insert LIST elements at the beginning of the array, moving existing elements -up to make room. For example: - - sub UNSHIFT { - my $self = shift; - my @list = @_; - my $size = scalar( @list ); - # make room for our list - @{$self->{ARRAY}}[ $size .. $#{$self->{ARRAY}} + $size ] - = @{$self->{ARRAY}}; - $self->STORE( $_, $list[$_] ) foreach 0 .. $#list; - } - -=item SPLICE this, offset, length, LIST - -Perform the equivalent of C on the array. - -I is optional and defaults to zero, negative values count back -from the end of the array. - -I is optional and defaults to rest of the array. - -I may be empty. - -Returns a list of the original I elements at I. - -In our example, we'll use a little shortcut if there is a I: - - sub SPLICE { - my $self = shift; - my $offset = shift || 0; - my $length = shift || $self->FETCHSIZE() - $offset; - my @list = (); - if ( @_ ) { - tie @list, __PACKAGE__, $self->{ELEMSIZE}; - @list = @_; - } - return splice @{$self->{ARRAY}}, $offset, $length, @list; - } - -=item UNTIE this - -Will be called when C happens. (See below.) - -=item DESTROY this - -This method will be triggered when the tied variable needs to be destructed. -As with the scalar tie class, this is almost never needed in a -language that does its own garbage collection, so this time we'll -just leave it out. - -=back - -=head2 Tying Hashes - -Hashes were the first Perl data type to be tied (see dbmopen()). A class -implementing a tied hash should define the following methods: TIEHASH is -the constructor. FETCH and STORE access the key and value pairs. EXISTS -reports whether a key is present in the hash, and DELETE deletes one. -CLEAR empties the hash by deleting all the key and value pairs. FIRSTKEY -and NEXTKEY implement the keys() and each() functions to iterate over all -the keys. UNTIE is called when C happens, and DESTROY is called when -the tied variable is garbage collected. - -If this seems like a lot, then feel free to inherit from merely the -standard Tie::Hash module for most of your methods, redefining only the -interesting ones. See L for details. - -Remember that Perl distinguishes between a key not existing in the hash, -and the key existing in the hash but having a corresponding value of -C. The two possibilities can be tested with the C and -C functions. - -Here's an example of a somewhat interesting tied hash class: it gives you -a hash representing a particular user's dot files. You index into the hash -with the name of the file (minus the dot) and you get back that dot file's -contents. For example: - - use DotFiles; - tie %dot, 'DotFiles'; - if ( $dot{profile} =~ /MANPATH/ || - $dot{login} =~ /MANPATH/ || - $dot{cshrc} =~ /MANPATH/ ) - { - print "you seem to set your MANPATH\n"; - } - -Or here's another sample of using our tied class: - - tie %him, 'DotFiles', 'daemon'; - foreach $f ( keys %him ) { - printf "daemon dot file %s is size %d\n", - $f, length $him{$f}; - } - -In our tied hash DotFiles example, we use a regular -hash for the object containing several important -fields, of which only the C<{LIST}> field will be what the -user thinks of as the real hash. - -=over 5 - -=item USER - -whose dot files this object represents - -=item HOME - -where those dot files live - -=item CLOBBER - -whether we should try to change or remove those dot files - -=item LIST - -the hash of dot file names and content mappings - -=back - -Here's the start of F: - - package DotFiles; - use Carp; - sub whowasi { (caller(1))[3] . '()' } - my $DEBUG = 0; - sub debug { $DEBUG = @_ ? shift : 1 } - -For our example, we want to be able to emit debugging info to help in tracing -during development. We keep also one convenience function around -internally to help print out warnings; whowasi() returns the function name -that calls it. - -Here are the methods for the DotFiles tied hash. - -=over 4 - -=item TIEHASH classname, LIST - -This is the constructor for the class. That means it is expected to -return a blessed reference through which the new object (probably but not -necessarily an anonymous hash) will be accessed. - -Here's the constructor: - - sub TIEHASH { - my $self = shift; - my $user = shift || $>; - my $dotdir = shift || ''; - croak "usage: @{[&whowasi]} [USER [DOTDIR]]" if @_; - $user = getpwuid($user) if $user =~ /^\d+$/; - my $dir = (getpwnam($user))[7] - || croak "@{[&whowasi]}: no user $user"; - $dir .= "/$dotdir" if $dotdir; - - my $node = { - USER => $user, - HOME => $dir, - LIST => {}, - CLOBBER => 0, - }; - - opendir(DIR, $dir) - || croak "@{[&whowasi]}: can't opendir $dir: $!"; - foreach $dot ( grep /^\./ && -f "$dir/$_", readdir(DIR)) { - $dot =~ s/^\.//; - $node->{LIST}{$dot} = undef; - } - closedir DIR; - return bless $node, $self; - } - -It's probably worth mentioning that if you're going to filetest the -return values out of a readdir, you'd better prepend the directory -in question. Otherwise, because we didn't chdir() there, it would -have been testing the wrong file. - -=item FETCH this, key - -This method will be triggered every time an element in the tied hash is -accessed (read). It takes one argument beyond its self reference: the key -whose value we're trying to fetch. - -Here's the fetch for our DotFiles example. - - sub FETCH { - carp &whowasi if $DEBUG; - my $self = shift; - my $dot = shift; - my $dir = $self->{HOME}; - my $file = "$dir/.$dot"; - - unless (exists $self->{LIST}->{$dot} || -f $file) { - carp "@{[&whowasi]}: no $dot file" if $DEBUG; - return undef; - } - - if (defined $self->{LIST}->{$dot}) { - return $self->{LIST}->{$dot}; - } else { - return $self->{LIST}->{$dot} = `cat $dir/.$dot`; - } - } - -It was easy to write by having it call the Unix cat(1) command, but it -would probably be more portable to open the file manually (and somewhat -more efficient). Of course, because dot files are a Unixy concept, we're -not that concerned. - -=item STORE this, key, value - -This method will be triggered every time an element in the tied hash is set -(written). It takes two arguments beyond its self reference: the index at -which we're trying to store something, and the value we're trying to put -there. - -Here in our DotFiles example, we'll be careful not to let -them try to overwrite the file unless they've called the clobber() -method on the original object reference returned by tie(). - - sub STORE { - carp &whowasi if $DEBUG; - my $self = shift; - my $dot = shift; - my $value = shift; - my $file = $self->{HOME} . "/.$dot"; - my $user = $self->{USER}; - - croak "@{[&whowasi]}: $file not clobberable" - unless $self->{CLOBBER}; - - open(F, "> $file") || croak "can't open $file: $!"; - print F $value; - close(F); - } - -If they wanted to clobber something, they might say: - - $ob = tie %daemon_dots, 'daemon'; - $ob->clobber(1); - $daemon_dots{signature} = "A true daemon\n"; - -Another way to lay hands on a reference to the underlying object is to -use the tied() function, so they might alternately have set clobber -using: - - tie %daemon_dots, 'daemon'; - tied(%daemon_dots)->clobber(1); - -The clobber method is simply: - - sub clobber { - my $self = shift; - $self->{CLOBBER} = @_ ? shift : 1; - } - -=item DELETE this, key - -This method is triggered when we remove an element from the hash, -typically by using the delete() function. Again, we'll -be careful to check whether they really want to clobber files. - - sub DELETE { - carp &whowasi if $DEBUG; - - my $self = shift; - my $dot = shift; - my $file = $self->{HOME} . "/.$dot"; - croak "@{[&whowasi]}: won't remove file $file" - unless $self->{CLOBBER}; - delete $self->{LIST}->{$dot}; - my $success = unlink($file); - carp "@{[&whowasi]}: can't unlink $file: $!" unless $success; - $success; - } - -The value returned by DELETE becomes the return value of the call -to delete(). If you want to emulate the normal behavior of delete(), -you should return whatever FETCH would have returned for this key. -In this example, we have chosen instead to return a value which tells -the caller whether the file was successfully deleted. - -=item CLEAR this - -This method is triggered when the whole hash is to be cleared, usually by -assigning the empty list to it. - -In our example, that would remove all the user's dot files! It's such a -dangerous thing that they'll have to set CLOBBER to something higher than -1 to make it happen. - - sub CLEAR { - carp &whowasi if $DEBUG; - my $self = shift; - croak "@{[&whowasi]}: won't remove all dot files for $self->{USER}" - unless $self->{CLOBBER} > 1; - my $dot; - foreach $dot ( keys %{$self->{LIST}}) { - $self->DELETE($dot); - } - } - -=item EXISTS this, key - -This method is triggered when the user uses the exists() function -on a particular hash. In our example, we'll look at the C<{LIST}> -hash element for this: - - sub EXISTS { - carp &whowasi if $DEBUG; - my $self = shift; - my $dot = shift; - return exists $self->{LIST}->{$dot}; - } - -=item FIRSTKEY this - -This method will be triggered when the user is going -to iterate through the hash, such as via a keys() or each() -call. - - sub FIRSTKEY { - carp &whowasi if $DEBUG; - my $self = shift; - my $a = keys %{$self->{LIST}}; # reset each() iterator - each %{$self->{LIST}} - } - -=item NEXTKEY this, lastkey - -This method gets triggered during a keys() or each() iteration. It has a -second argument which is the last key that had been accessed. This is -useful if you're carrying about ordering or calling the iterator from more -than one sequence, or not really storing things in a hash anywhere. - -For our example, we're using a real hash so we'll do just the simple -thing, but we'll have to go through the LIST field indirectly. - - sub NEXTKEY { - carp &whowasi if $DEBUG; - my $self = shift; - return each %{ $self->{LIST} } - } - -=item UNTIE this - -This is called when C occurs. - -=item DESTROY this - -This method is triggered when a tied hash is about to go out of -scope. You don't really need it unless you're trying to add debugging -or have auxiliary state to clean up. Here's a very simple function: - - sub DESTROY { - carp &whowasi if $DEBUG; - } - -=back - -Note that functions such as keys() and values() may return huge lists -when used on large objects, like DBM files. You may prefer to use the -each() function to iterate over such. Example: - - # print out history file offsets - use NDBM_File; - tie(%HIST, 'NDBM_File', '/usr/lib/news/history', 1, 0); - while (($key,$val) = each %HIST) { - print $key, ' = ', unpack('L',$val), "\n"; - } - untie(%HIST); - -=head2 Tying FileHandles - -This is partially implemented now. - -A class implementing a tied filehandle should define the following -methods: TIEHANDLE, at least one of PRINT, PRINTF, WRITE, READLINE, GETC, -READ, and possibly CLOSE, UNTIE and DESTROY. The class can also provide: BINMODE, -OPEN, EOF, FILENO, SEEK, TELL - if the corresponding perl operators are -used on the handle. - -It is especially useful when perl is embedded in some other program, -where output to STDOUT and STDERR may have to be redirected in some -special way. See nvi and the Apache module for examples. - -In our example we're going to create a shouting handle. - - package Shout; - -=over 4 - -=item TIEHANDLE classname, LIST - -This is the constructor for the class. That means it is expected to -return a blessed reference of some sort. The reference can be used to -hold some internal information. - - sub TIEHANDLE { print "\n"; my $i; bless \$i, shift } - -=item WRITE this, LIST - -This method will be called when the handle is written to via the -C function. - - sub WRITE { - $r = shift; - my($buf,$len,$offset) = @_; - print "WRITE called, \$buf=$buf, \$len=$len, \$offset=$offset"; - } - -=item PRINT this, LIST - -This method will be triggered every time the tied handle is printed to -with the C function. -Beyond its self reference it also expects the list that was passed to -the print function. - - sub PRINT { $r = shift; $$r++; print join($,,map(uc($_),@_)),$\ } - -=item PRINTF this, LIST - -This method will be triggered every time the tied handle is printed to -with the C function. -Beyond its self reference it also expects the format and list that was -passed to the printf function. - - sub PRINTF { - shift; - my $fmt = shift; - print sprintf($fmt, @_)."\n"; - } - -=item READ this, LIST - -This method will be called when the handle is read from via the C -or C functions. - - sub READ { - my $self = shift; - my $$bufref = \$_[0]; - my(undef,$len,$offset) = @_; - print "READ called, \$buf=$bufref, \$len=$len, \$offset=$offset"; - # add to $$bufref, set $len to number of characters read - $len; - } - -=item READLINE this - -This method will be called when the handle is read from via . -The method should return undef when there is no more data. - - sub READLINE { $r = shift; "READLINE called $$r times\n"; } - -=item GETC this - -This method will be called when the C function is called. - - sub GETC { print "Don't GETC, Get Perl"; return "a"; } - -=item CLOSE this - -This method will be called when the handle is closed via the C -function. - - sub CLOSE { print "CLOSE called.\n" } - -=item UNTIE this - -As with the other types of ties, this method will be called when C happens. -It may be appropriate to "auto CLOSE" when this occurs. - -=item DESTROY this - -As with the other types of ties, this method will be called when the -tied handle is about to be destroyed. This is useful for debugging and -possibly cleaning up. - - sub DESTROY { print "\n" } - -=back - -Here's how to use our little example: - - tie(*FOO,'Shout'); - print FOO "hello\n"; - $a = 4; $b = 6; - print FOO $a, " plus ", $b, " equals ", $a + $b, "\n"; - print ; - -=head2 UNTIE this - -You can define for all tie types an UNTIE method that will be called -at untie(). - -=head2 The C Gotcha - -If you intend making use of the object returned from either tie() or -tied(), and if the tie's target class defines a destructor, there is a -subtle gotcha you I guard against. - -As setup, consider this (admittedly rather contrived) example of a -tie; all it does is use a file to keep a log of the values assigned to -a scalar. - - package Remember; - - use strict; - use warnings; - use IO::File; - - sub TIESCALAR { - my $class = shift; - my $filename = shift; - my $handle = new IO::File "> $filename" - or die "Cannot open $filename: $!\n"; - - print $handle "The Start\n"; - bless {FH => $handle, Value => 0}, $class; - } - - sub FETCH { - my $self = shift; - return $self->{Value}; - } - - sub STORE { - my $self = shift; - my $value = shift; - my $handle = $self->{FH}; - print $handle "$value\n"; - $self->{Value} = $value; - } - - sub DESTROY { - my $self = shift; - my $handle = $self->{FH}; - print $handle "The End\n"; - close $handle; - } - - 1; - -Here is an example that makes use of this tie: - - use strict; - use Remember; - - my $fred; - tie $fred, 'Remember', 'myfile.txt'; - $fred = 1; - $fred = 4; - $fred = 5; - untie $fred; - system "cat myfile.txt"; - -This is the output when it is executed: - - The Start - 1 - 4 - 5 - The End - -So far so good. Those of you who have been paying attention will have -spotted that the tied object hasn't been used so far. So lets add an -extra method to the Remember class to allow comments to be included in -the file -- say, something like this: - - sub comment { - my $self = shift; - my $text = shift; - my $handle = $self->{FH}; - print $handle $text, "\n"; - } - -And here is the previous example modified to use the C method -(which requires the tied object): - - use strict; - use Remember; - - my ($fred, $x); - $x = tie $fred, 'Remember', 'myfile.txt'; - $fred = 1; - $fred = 4; - comment $x "changing..."; - $fred = 5; - untie $fred; - system "cat myfile.txt"; - -When this code is executed there is no output. Here's why: - -When a variable is tied, it is associated with the object which is the -return value of the TIESCALAR, TIEARRAY, or TIEHASH function. This -object normally has only one reference, namely, the implicit reference -from the tied variable. When untie() is called, that reference is -destroyed. Then, as in the first example above, the object's -destructor (DESTROY) is called, which is normal for objects that have -no more valid references; and thus the file is closed. - -In the second example, however, we have stored another reference to -the tied object in $x. That means that when untie() gets called -there will still be a valid reference to the object in existence, so -the destructor is not called at that time, and thus the file is not -closed. The reason there is no output is because the file buffers -have not been flushed to disk. - -Now that you know what the problem is, what can you do to avoid it? -Prior to the introduction of the optional UNTIE method the only way -was the good old C<-w> flag. Which will spot any instances where you call -untie() and there are still valid references to the tied object. If -the second script above this near the top C -or was run with the C<-w> flag, Perl prints this -warning message: - - untie attempted while 1 inner references still exist - -To get the script to work properly and silence the warning make sure -there are no valid references to the tied object I untie() is -called: - - undef $x; - untie $fred; - -Now that UNTIE exists the class designer can decide which parts of the -class functionality are really associated with C and which with -the object being destroyed. What makes sense for a given class depends -on whether the inner references are being kept so that non-tie-related -methods can be called on the object. But in most cases it probably makes -sense to move the functionality that would have been in DESTROY to the UNTIE -method. - -If the UNTIE method exists then the warning above does not occur. Instead the -UNTIE method is passed the count of "extra" references and can issue its own -warning if appropriate. e.g. to replicate the no UNTIE case this method can -be used: - - sub UNTIE - { - my ($obj,$count) = @_; - carp "untie attempted while $count inner references still exist" if $count; - } - -=head1 SEE ALSO - -See L or L for some interesting tie() implementations. -A good starting point for many tie() implementations is with one of the -modules L, L, L, or L. - -=head1 BUGS - -You cannot easily tie a multilevel data structure (such as a hash of -hashes) to a dbm file. The first problem is that all but GDBM and -Berkeley DB have size limitations, but beyond that, you also have problems -with how references are to be represented on disk. One experimental -module that does attempt to address this need partially is the MLDBM -module. Check your nearest CPAN site as described in L for -source code to MLDBM. - -Tied filehandles are still incomplete. sysopen(), truncate(), -flock(), fcntl(), stat() and -X can't currently be trapped. - -=head1 AUTHOR - -Tom Christiansen - -TIEHANDLE by Sven Verdoolaege > and Doug MacEachern > - -UNTIE by Nick Ing-Simmons > - -Tying Arrays by Casey Tweten > diff --git a/lib/perl5/5.6.1/pods/perltoc.pod b/lib/perl5/5.6.1/pods/perltoc.pod deleted file mode 100644 index 7bae86ed..00000000 --- a/lib/perl5/5.6.1/pods/perltoc.pod +++ /dev/null @@ -1,13046 +0,0 @@ - -=head1 NAME - -perltoc - perl documentation table of contents - -=head1 DESCRIPTION - -This page provides a brief table of contents for the rest of the Perl -documentation set. It is meant to be scanned quickly or grepped -through to locate the proper section you're looking for. - -=head1 BASIC DOCUMENTATION - -=head2 perl - Practical Extraction and Report Language - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item AVAILABILITY - -=item ENVIRONMENT - -=item AUTHOR - -=item FILES - -=item SEE ALSO - -=item DIAGNOSTICS - -=item BUGS - -=item NOTES - -=back - -=head2 perlfaq - frequently asked questions about Perl ($Date: 1999/05/23 -20:38:02 $) - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item perlfaq: Structural overview of the FAQ. - -=item L: General Questions About Perl - -=item L: Obtaining and Learning about Perl - -=item L: Programming Tools - -=item L: Data Manipulation - -=item L: Files and Formats - -=item L: Regexps - -=item L: General Perl Language Issues - -=item L: System Interaction - -=item L: Networking - -=back - -=item About the perlfaq documents - -=over 4 - -=item Where to get the perlfaq - -=item How to contribute to the perlfaq - -=item What will happen if you mail your Perl programming problems to the -authors - -=back - -=item Credits - -=item Author and Copyright Information - -=over 4 - -=item Bundled Distributions - -=item Disclaimer - -=back - -=item Changes - -1/November/2000, 23/May/99, 13/April/99, 7/January/99, 22/June/98, -24/April/97, 23/April/97, 25/March/97, 18/March/97, 17/March/97 Version, -Initial Release: 11/March/97 - -=back - -=head2 perlbook - Perl book information - -=over 4 - -=item DESCRIPTION - -=back - -=head2 perlsyn - Perl syntax - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item Declarations - -=item Simple statements - -=item Compound statements - -=item Loop Control - -=item For Loops - -=item Foreach Loops - -=item Basic BLOCKs and Switch Statements - -=item Goto - -=item PODs: Embedded Documentation - -=item Plain Old Comments (Not!) - -=back - -=back - -=head2 perldata - Perl data types - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item Variable names - -=item Context - -=item Scalar values - -=item Scalar value constructors - -=item List value constructors - -=item Slices - -=item Typeglobs and Filehandles - -=back - -=item SEE ALSO - -=back - -=head2 perlop - Perl operators and precedence - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=over 4 - -=item Terms and List Operators (Leftward) - -=item The Arrow Operator - -=item Auto-increment and Auto-decrement - -=item Exponentiation - -=item Symbolic Unary Operators - -=item Binding Operators - -=item Multiplicative Operators - -=item Additive Operators - -=item Shift Operators - -=item Named Unary Operators - -=item Relational Operators - -=item Equality Operators - -=item Bitwise And - -=item Bitwise Or and Exclusive Or - -=item C-style Logical And - -=item C-style Logical Or - -=item Range Operators - -=item Conditional Operator - -=item Assignment Operators - -=item Comma Operator - -=item List Operators (Rightward) - -=item Logical Not - -=item Logical And - -=item Logical or and Exclusive Or - -=item C Operators Missing From Perl - -unary &, unary *, (TYPE) - -=item Quote and Quote-like Operators - -=item Regexp Quote-Like Operators - -?PATTERN?, m/PATTERN/cgimosx, /PATTERN/cgimosx, q/STRING/, C<'STRING'>, -qq/STRING/, "STRING", qr/STRING/imosx, qx/STRING/, `STRING`, qw/STRING/, -s/PATTERN/REPLACEMENT/egimosx, tr/SEARCHLIST/REPLACEMENTLIST/cds, -y/SEARCHLIST/REPLACEMENTLIST/cds - -=item Gory details of parsing quoted constructs - -Finding the end, Removal of backslashes before delimiters, Interpolation, -C<<<'EOF'>, C, C, C, C, C<''>, C, C<"">, -C<``>, C, C, C<< >>, C, C, C, -C,, Interpolation of regular expressions, Optimization of -regular expressions - -=item I/O Operators - -=item Constant Folding - -=item Bitwise String Operators - -=item Integer Arithmetic - -=item Floating-point Arithmetic - -=item Bigger Numbers - -=back - -=back - -=head2 perlsub - Perl subroutines - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=over 4 - -=item Private Variables via my() - -=item Persistent Private Variables - -=item Temporary Values via local() - -=item Lvalue subroutines - -=item Passing Symbol Table Entries (typeglobs) - -=item When to Still Use local() - -=item Pass by Reference - -=item Prototypes - -=item Constant Functions - -=item Overriding Built-in Functions - -=item Autoloading - -=item Subroutine Attributes - -=back - -=item SEE ALSO - -=back - -=head2 perlfunc - Perl builtin functions - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item Perl Functions by Category - -Functions for SCALARs or strings, Regular expressions and pattern matching, -Numeric functions, Functions for real @ARRAYs, Functions for list data, -Functions for real %HASHes, Input and output functions, Functions for fixed -length data or records, Functions for filehandles, files, or directories, -Keywords related to the control flow of your perl program, Keywords related -to scoping, Miscellaneous functions, Functions for processes and process -groups, Keywords related to perl modules, Keywords related to classes and -object-orientedness, Low-level socket functions, System V interprocess -communication functions, Fetching user and group info, Fetching network -info, Time-related functions, Functions new in perl5, Functions obsoleted -in perl5 - -=item Portability - -=item Alphabetical Listing of Perl Functions - -I<-X> FILEHANDLE, I<-X> EXPR, I<-X>, abs VALUE, abs, accept -NEWSOCKET,GENERICSOCKET, alarm SECONDS, alarm, atan2 Y,X, bind SOCKET,NAME, -binmode FILEHANDLE, DISCIPLINE, binmode FILEHANDLE, bless REF,CLASSNAME, -bless REF, caller EXPR, caller, chdir EXPR, chmod LIST, chomp VARIABLE, -chomp LIST, chomp, chop VARIABLE, chop LIST, chop, chown LIST, chr NUMBER, -chr, chroot FILENAME, chroot, close FILEHANDLE, close, closedir DIRHANDLE, -connect SOCKET,NAME, continue BLOCK, cos EXPR, cos, crypt PLAINTEXT,SALT, -dbmclose HASH, dbmopen HASH,DBNAME,MASK, defined EXPR, defined, delete -EXPR, die LIST, do BLOCK, do SUBROUTINE(LIST), do EXPR, dump LABEL, dump, -each HASH, eof FILEHANDLE, eof (), eof, eval EXPR, eval BLOCK, exec LIST, -exec PROGRAM LIST, exists EXPR, exit EXPR, exp EXPR, exp, fcntl -FILEHANDLE,FUNCTION,SCALAR, fileno FILEHANDLE, flock FILEHANDLE,OPERATION, -fork, format, formline PICTURE,LIST, getc FILEHANDLE, getc, getlogin, -getpeername SOCKET, getpgrp PID, getppid, getpriority WHICH,WHO, getpwnam -NAME, getgrnam NAME, gethostbyname NAME, getnetbyname NAME, getprotobyname -NAME, getpwuid UID, getgrgid GID, getservbyname NAME,PROTO, gethostbyaddr -ADDR,ADDRTYPE, getnetbyaddr ADDR,ADDRTYPE, getprotobynumber NUMBER, -getservbyport PORT,PROTO, getpwent, getgrent, gethostent, getnetent, -getprotoent, getservent, setpwent, setgrent, sethostent STAYOPEN, setnetent -STAYOPEN, setprotoent STAYOPEN, setservent STAYOPEN, endpwent, endgrent, -endhostent, endnetent, endprotoent, endservent, getsockname SOCKET, -getsockopt SOCKET,LEVEL,OPTNAME, glob EXPR, glob, gmtime EXPR, goto LABEL, -goto EXPR, goto &NAME, grep BLOCK LIST, grep EXPR,LIST, hex EXPR, hex, -import, index STR,SUBSTR,POSITION, index STR,SUBSTR, int EXPR, int, ioctl -FILEHANDLE,FUNCTION,SCALAR, join EXPR,LIST, keys HASH, kill SIGNAL, LIST, -last LABEL, last, lc EXPR, lc, lcfirst EXPR, lcfirst, length EXPR, length, -link OLDFILE,NEWFILE, listen SOCKET,QUEUESIZE, local EXPR, localtime EXPR, -lock, log EXPR, log, lstat FILEHANDLE, lstat EXPR, lstat, m//, map BLOCK -LIST, map EXPR,LIST, mkdir FILENAME,MASK, mkdir FILENAME, msgctl -ID,CMD,ARG, msgget KEY,FLAGS, msgrcv ID,VAR,SIZE,TYPE,FLAGS, msgsnd -ID,MSG,FLAGS, my EXPR, my EXPR : ATTRIBUTES, next LABEL, next, no Module -LIST, oct EXPR, oct, open FILEHANDLE,MODE,LIST, open FILEHANDLE,EXPR, open -FILEHANDLE, opendir DIRHANDLE,EXPR, ord EXPR, ord, our EXPR, pack -TEMPLATE,LIST, package NAMESPACE, package, pipe READHANDLE,WRITEHANDLE, pop -ARRAY, pop, pos SCALAR, pos, print FILEHANDLE LIST, print LIST, print, -printf FILEHANDLE FORMAT, LIST, printf FORMAT, LIST, prototype FUNCTION, -push ARRAY,LIST, q/STRING/, qq/STRING/, qr/STRING/, qx/STRING/, qw/STRING/, -quotemeta EXPR, quotemeta, rand EXPR, rand, read -FILEHANDLE,SCALAR,LENGTH,OFFSET, read FILEHANDLE,SCALAR,LENGTH, readdir -DIRHANDLE, readline EXPR, readlink EXPR, readlink, readpipe EXPR, recv -SOCKET,SCALAR,LENGTH,FLAGS, redo LABEL, redo, ref EXPR, ref, rename -OLDNAME,NEWNAME, require VERSION, require EXPR, require, reset EXPR, reset, -return EXPR, return, reverse LIST, rewinddir DIRHANDLE, rindex -STR,SUBSTR,POSITION, rindex STR,SUBSTR, rmdir FILENAME, rmdir, s///, scalar -EXPR, seek FILEHANDLE,POSITION,WHENCE, seekdir DIRHANDLE,POS, select -FILEHANDLE, select, select RBITS,WBITS,EBITS,TIMEOUT, semctl -ID,SEMNUM,CMD,ARG, semget KEY,NSEMS,FLAGS, semop KEY,OPSTRING, send -SOCKET,MSG,FLAGS,TO, send SOCKET,MSG,FLAGS, setpgrp PID,PGRP, setpriority -WHICH,WHO,PRIORITY, setsockopt SOCKET,LEVEL,OPTNAME,OPTVAL, shift ARRAY, -shift, shmctl ID,CMD,ARG, shmget KEY,SIZE,FLAGS, shmread ID,VAR,POS,SIZE, -shmwrite ID,STRING,POS,SIZE, shutdown SOCKET,HOW, sin EXPR, sin, sleep -EXPR, sleep, socket SOCKET,DOMAIN,TYPE,PROTOCOL, socketpair -SOCKET1,SOCKET2,DOMAIN,TYPE,PROTOCOL, sort SUBNAME LIST, sort BLOCK LIST, -sort LIST, splice ARRAY,OFFSET,LENGTH,LIST, splice ARRAY,OFFSET,LENGTH, -splice ARRAY,OFFSET, splice ARRAY, split /PATTERN/,EXPR,LIMIT, split -/PATTERN/,EXPR, split /PATTERN/, split, sprintf FORMAT, LIST, sqrt EXPR, -sqrt, srand EXPR, srand, stat FILEHANDLE, stat EXPR, stat, study SCALAR, -study, sub BLOCK, sub NAME, sub NAME BLOCK, substr -EXPR,OFFSET,LENGTH,REPLACEMENT, substr EXPR,OFFSET,LENGTH, substr -EXPR,OFFSET, symlink OLDFILE,NEWFILE, syscall LIST, sysopen -FILEHANDLE,FILENAME,MODE, sysopen FILEHANDLE,FILENAME,MODE,PERMS, sysread -FILEHANDLE,SCALAR,LENGTH,OFFSET, sysread FILEHANDLE,SCALAR,LENGTH, sysseek -FILEHANDLE,POSITION,WHENCE, system LIST, system PROGRAM LIST, syswrite -FILEHANDLE,SCALAR,LENGTH,OFFSET, syswrite FILEHANDLE,SCALAR,LENGTH, -syswrite FILEHANDLE,SCALAR, tell FILEHANDLE, tell, telldir DIRHANDLE, tie -VARIABLE,CLASSNAME,LIST, tied VARIABLE, time, times, tr///, truncate -FILEHANDLE,LENGTH, truncate EXPR,LENGTH, uc EXPR, uc, ucfirst EXPR, -ucfirst, umask EXPR, umask, undef EXPR, undef, unlink LIST, unlink, unpack -TEMPLATE,EXPR, untie VARIABLE, unshift ARRAY,LIST, use Module VERSION LIST, -use Module VERSION, use Module LIST, use Module, use VERSION, utime LIST, -values HASH, vec EXPR,OFFSET,BITS, wait, waitpid PID,FLAGS, wantarray, warn -LIST, write FILEHANDLE, write EXPR, write, y/// - -=back - -=back - -=head2 perlreftut - Mark's very short tutorial about references - -=over 4 - -=item DESCRIPTION - -=item Who Needs Complicated Data Structures? - -=item The Solution - -=item Syntax - -=over 4 - -=item Making References - -=item Using References - -=back - -=item An Example - -=item Arrow Rule - -=item Solution - -=item The Rest - -=item Summary - -=item Credits - -=over 4 - -=item Distribution Conditions - -=back - -=back - -=head2 perldsc - Perl Data Structures Cookbook - -=over 4 - -=item DESCRIPTION - -arrays of arrays, hashes of arrays, arrays of hashes, hashes of hashes, -more elaborate constructs - -=item REFERENCES - -=item COMMON MISTAKES - -=item CAVEAT ON PRECEDENCE - -=item WHY YOU SHOULD ALWAYS C - -=item DEBUGGING - -=item CODE EXAMPLES - -=item ARRAYS OF ARRAYS - -=over 4 - -=item Declaration of a ARRAY OF ARRAYS - -=item Generation of a ARRAY OF ARRAYS - -=item Access and Printing of a ARRAY OF ARRAYS - -=back - -=item HASHES OF ARRAYS - -=over 4 - -=item Declaration of a HASH OF ARRAYS - -=item Generation of a HASH OF ARRAYS - -=item Access and Printing of a HASH OF ARRAYS - -=back - -=item ARRAYS OF HASHES - -=over 4 - -=item Declaration of a ARRAY OF HASHES - -=item Generation of a ARRAY OF HASHES - -=item Access and Printing of a ARRAY OF HASHES - -=back - -=item HASHES OF HASHES - -=over 4 - -=item Declaration of a HASH OF HASHES - -=item Generation of a HASH OF HASHES - -=item Access and Printing of a HASH OF HASHES - -=back - -=item MORE ELABORATE RECORDS - -=over 4 - -=item Declaration of MORE ELABORATE RECORDS - -=item Declaration of a HASH OF COMPLEX RECORDS - -=item Generation of a HASH OF COMPLEX RECORDS - -=back - -=item Database Ties - -=item SEE ALSO - -=item AUTHOR - -=back - -=head2 perlrequick - Perl regular expressions quick start - -=over 4 - -=item DESCRIPTION - -=item The Guide - -=over 4 - -=item Simple word matching - -=item Using character classes - -=item Matching this or that - -=item Grouping things and hierarchical matching - -=item Extracting matches - -=item Matching repetitions - -=item More matching - -=item Search and replace - -=item The split operator - -=back - -=item BUGS - -=item SEE ALSO - -=item AUTHOR AND COPYRIGHT - -=over 4 - -=item Acknowledgments - -=back - -=back - -=head2 perlpod - plain old documentation - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item Verbatim Paragraph - -=item Command Paragraph - -=item Ordinary Block of Text - -=item The Intent - -=item Embedding Pods in Perl Modules - -=item Common Pod Pitfalls - -=back - -=item SEE ALSO - -=item AUTHOR - -=back - -=head2 perlstyle - Perl style guide - -=over 4 - -=item DESCRIPTION - -=back - -=head2 perltrap - Perl traps for the unwary - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item Awk Traps - -=item C Traps - -=item Sed Traps - -=item Shell Traps - -=item Perl Traps - -=item Perl4 to Perl5 Traps - -Discontinuance, Deprecation, and BugFix traps, Parsing Traps, Numerical -Traps, General data type traps, Context Traps - scalar, list contexts, -Precedence Traps, General Regular Expression Traps using s///, etc, -Subroutine, Signal, Sorting Traps, OS Traps, DBM Traps, Unclassified Traps - -=item Discontinuance, Deprecation, and BugFix traps - -Discontinuance, Deprecation, BugFix, Discontinuance, Discontinuance, -Discontinuance, BugFix, Discontinuance, Discontinuance, BugFix, -Discontinuance, Deprecation, Discontinuance, Discontinuance - -=item Parsing Traps - -Parsing, Parsing, Parsing, Parsing - -=item Numerical Traps - -Numerical, Numerical, Numerical, Bitwise string ops - -=item General data type traps - -(Arrays), (Arrays), (Hashes), (Globs), (Globs), (Scalar String), -(Constants), (Scalars), (Variable Suicide) - -=item Context Traps - scalar, list contexts - -(list context), (scalar context), (scalar context), (list, builtin) - -=item Precedence Traps - -Precedence, Precedence, Precedence, Precedence, Precedence, Precedence, -Precedence - -=item General Regular Expression Traps using s///, etc. - -Regular Expression, Regular Expression, Regular Expression, Regular -Expression, Regular Expression, Regular Expression, Regular Expression, -Regular Expression - -=item Subroutine, Signal, Sorting Traps - -(Signals), (Sort Subroutine), warn() won't let you specify a filehandle - -=item OS Traps - -(SysV), (SysV) - -=item Interpolation Traps - -Interpolation, Interpolation, Interpolation, Interpolation, Interpolation, -Interpolation, Interpolation, Interpolation, Interpolation - -=item DBM Traps - -DBM, DBM - -=item Unclassified Traps - -C/C trap using returned value, C on empty string with -LIMIT specified - -=back - -=back - -=head2 perlrun - how to execute the Perl interpreter - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=over 4 - -=item #! and quoting on non-Unix systems - -OS/2, MS-DOS, Win95/NT, Macintosh, VMS - -=item Location of Perl - -=item Command Switches - -B<-0>[I], B<-a>, B<-C>, B<-c>, B<-d>, B<-d:>I, -B<-D>I, B<-D>I, B<-e> I, B<-F>I, -B<-h>, B<-i>[I], B<-I>I, B<-l>[I], -B<-m>[B<->]I, B<-M>[B<->]I, B<-M>[B<->]I<'module ...'>, -B<-[mM]>[B<->]I, B<-n>, B<-p>, B<-P>, B<-s>, B<-S>, -B<-T>, B<-u>, B<-U>, B<-v>, B<-V>, B<-V:>I, B<-w>, B<-W>, B<-X>, -B<-x> I - -=back - -=item ENVIRONMENT - -HOME, LOGDIR, PATH, PERL5LIB, PERL5OPT, PERLLIB, PERL5DB, PERL5SHELL -(specific to the Win32 port), PERL_DEBUG_MSTATS, PERL_DESTRUCT_LEVEL, -PERL_ROOT (specific to the VMS port), SYS$LOGIN (specific to the VMS port) - -=back - -=head2 perldiag - various Perl diagnostics - -=over 4 - -=item DESCRIPTION - -=back - -=head2 perllexwarn - Perl Lexical Warnings - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item Default Warnings and Optional Warnings - -=item What's wrong with B<-w> and C<$^W> - -=item Controlling Warnings from the Command Line - -B<-w>, B<-W>, B<-X> - -=item Backward Compatibility - -=item Category Hierarchy - -=item Fatal Warnings - -=item Reporting Warnings from a Module - -=back - -=item TODO - -=item SEE ALSO - -=item AUTHOR - -=back - -=head2 perldebtut - Perl debugging tutorial - -=over 4 - -=item DESCRIPTION - -=item use strict - -=item Looking at data and -w and w - -=item help - -=item Stepping through code - -=item Placeholder for a, w, t, T - -=item REGULAR EXPRESSIONS - -=item OUTPUT TIPS - -=item CGI - -=item GUIs - -=item SUMMARY - -=item SEE ALSO - -=item AUTHOR - -=item CONTRIBUTORS - -=back - -=head2 perldebug - Perl debugging - -=over 4 - -=item DESCRIPTION - -=item The Perl Debugger - -=over 4 - -=item Debugger Commands - -h [command], p expr, x expr, V [pkg [vars]], X [vars], T, s [expr], n -[expr], r, , c [line|sub], l, l min+incr, l min-max, l line, l subname, --, w [line], f filename, /pattern/, ?pattern?, L, S [[!]regex], t, t expr, -b [line] [condition], b subname [condition], b postpone subname -[condition], b load filename, b compile subname, d [line], D, a [line] -command, a [line], A, W expr, W, O booloption .., O anyoption? .., O -option=value .., < ?, < [ command ], << command, > ?, > command, >> -command, { ?, { [ command ], {{ command, ! number, ! -number, ! pattern, !! -cmd, H -number, q or ^D, R, |dbcmd, ||dbcmd, command, m expr, man [manpage] - -=item Configurable Options - -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C - -=item Debugger input/output - -Prompt, Multiline commands, Stack backtrace, Line Listing Format, Frame -listing - -=item Debugging compile-time statements - -=item Debugger Customization - -=item Readline Support - -=item Editor Support for Debugging - -=item The Perl Profiler - -=back - -=item Debugging regular expressions - -=item Debugging memory usage - -=item SEE ALSO - -=item BUGS - -=back - -=head2 perlvar - Perl predefined variables - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item Predefined Names - -$ARG, $_, $>, $MATCH, $&, $PREMATCH, $`, $POSTMATCH, $', -$LAST_PAREN_MATCH, $+, @LAST_MATCH_END, @+, $MULTILINE_MATCHING, $*, -input_line_number HANDLE EXPR, $INPUT_LINE_NUMBER, $NR, $, -input_record_separator HANDLE EXPR, $INPUT_RECORD_SEPARATOR, $RS, $/, -autoflush HANDLE EXPR, $OUTPUT_AUTOFLUSH, $|, output_field_separator HANDLE -EXPR, $OUTPUT_FIELD_SEPARATOR, $OFS, $,, output_record_separator HANDLE -EXPR, $OUTPUT_RECORD_SEPARATOR, $ORS, $\, $LIST_SEPARATOR, $", -$SUBSCRIPT_SEPARATOR, $SUBSEP, $;, $OFMT, $#, format_page_number HANDLE -EXPR, $FORMAT_PAGE_NUMBER, $%, format_lines_per_page HANDLE EXPR, -$FORMAT_LINES_PER_PAGE, $=, format_lines_left HANDLE EXPR, -$FORMAT_LINES_LEFT, $-, @LAST_MATCH_START, @-, C<$`> is the same as -C, C<$&> is the same as C, C<$'> is the same as C, C<$1> is the same -as C, C<$2> is the same as -C, C<$3> is the same as C, format_name HANDLE EXPR, $FORMAT_NAME, $~, -format_top_name HANDLE EXPR, $FORMAT_TOP_NAME, $^, -format_line_break_characters HANDLE EXPR, $FORMAT_LINE_BREAK_CHARACTERS, -$:, format_formfeed HANDLE EXPR, $FORMAT_FORMFEED, $^L, $ACCUMULATOR, $^A, -$CHILD_ERROR, $?, $OS_ERROR, $ERRNO, $!, $EXTENDED_OS_ERROR, $^E, -$EVAL_ERROR, $@, $PROCESS_ID, $PID, $$, $REAL_USER_ID, $UID, $<, -$EFFECTIVE_USER_ID, $EUID, $>, $REAL_GROUP_ID, $GID, $(, -$EFFECTIVE_GROUP_ID, $EGID, $), $PROGRAM_NAME, $0, $[, $], $COMPILING, $^C, -$DEBUGGING, $^D, $SYSTEM_FD_MAX, $^F, $^H, %^H, $INPLACE_EDIT, $^I, $^M, -$OSNAME, $^O, $PERLDB, $^P, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, -0x100, 0x200, $LAST_REGEXP_CODE_RESULT, $^R, $EXCEPTIONS_BEING_CAUGHT, $^S, -$BASETIME, $^T, $PERL_VERSION, $^V, $WARNING, $^W, ${^WARNING_BITS}, -${^WIDE_SYSTEM_CALLS}, $EXECUTABLE_NAME, $^X, $ARGV, @ARGV, @INC, @_, %INC, -%ENV, $ENV{expr}, %SIG, $SIG{expr} - -=item Error Indicators - -=item Technical Note on the Syntax of Variable Names - -=back - -=item BUGS - -=back - -=head2 perllol - Manipulating Arrays of Arrays in Perl - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item Declaration and Access of Arrays of Arrays - -=item Growing Your Own - -=item Access and Printing - -=item Slices - -=back - -=item SEE ALSO - -=item AUTHOR - -=back - -=head2 perlopentut - tutorial on opening things in Perl - -=over 4 - -=item DESCRIPTION - -=item Open E la shell - -=over 4 - -=item Simple Opens - -=item Pipe Opens - -=item The Minus File - -=item Mixing Reads and Writes - -=item Filters - -=back - -=item Open E la C - -=over 4 - -=item Permissions E la mode - -=back - -=item Obscure Open Tricks - -=over 4 - -=item Re-Opening Files (dups) - -=item Dispelling the Dweomer - -=item Paths as Opens - -=item Single Argument Open - -=item Playing with STDIN and STDOUT - -=back - -=item Other I/O Issues - -=over 4 - -=item Opening Non-File Files - -=item Binary Files - -=item File Locking - -=back - -=item SEE ALSO - -=item AUTHOR and COPYRIGHT - -=item HISTORY - -=back - -=head2 perlretut - Perl regular expressions tutorial - -=over 4 - -=item DESCRIPTION - -=item Part 1: The basics - -=over 4 - -=item Simple word matching - -=item Using character classes - -=item Matching this or that - -=item Grouping things and hierarchical matching - -=item Extracting matches - -=item Matching repetitions - -=item Building a regexp - -=item Using regular expressions in Perl - -=back - -=item Part 2: Power tools - -=over 4 - -=item More on characters, strings, and character classes - -=item Compiling and saving regular expressions - -=item Embedding comments and modifiers in a regular expression - -=item Non-capturing groupings - -=item Looking ahead and looking behind - -=item Using independent subexpressions to prevent backtracking - -=item Conditional expressions - -=item A bit of magic: executing Perl code in a regular expression - -=item Pragmas and debugging - -=back - -=item BUGS - -=item SEE ALSO - -=item AUTHOR AND COPYRIGHT - -=over 4 - -=item Acknowledgments - -=back - -=back - -=head2 perlre - Perl regular expressions - -=over 4 - -=item DESCRIPTION - -i, m, s, x - -=over 4 - -=item Regular Expressions - -cntrl, graph, print, punct, xdigit - -=item Extended Patterns - -C<(?#text)>, C<(?imsx-imsx)>, C<(?:pattern)>, C<(?imsx-imsx:pattern)>, -C<(?=pattern)>, C<(?!pattern)>, C<(?<=pattern)>, C<(?, C<(?{ -code })>, C<(??{ code })>, C<< (?>pattern) >>, -C<(?(condition)yes-pattern|no-pattern)>, C<(?(condition)yes-pattern)> - -=item Backtracking - -=item Version 8 Regular Expressions - -=item Warning on \1 vs $1 - -=item Repeated patterns matching zero-length substring - -=item Combining pieces together - -C, C, C, C, C, C, -C, C, C, C, C, C<< (?>S) >>, C<(?=S)>, C<(?<=S)>, -C<(?!S)>, C<(?, C<(??{ EXPR })>, -C<(?(condition)yes-pattern|no-pattern)> - -=item Creating custom RE engines - -=back - -=item BUGS - -=item SEE ALSO - -=back - -=head2 perlref - Perl references and nested data structures - -=over 4 - -=item NOTE - -=item DESCRIPTION - -=over 4 - -=item Making References - -=item Using References - -=item Symbolic references - -=item Not-so-symbolic references - -=item Pseudo-hashes: Using an array as a hash - -=item Function Templates - -=back - -=item WARNING - -=item SEE ALSO - -=back - -=head2 perlform - Perl formats - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item Format Variables - -=back - -=item NOTES - -=over 4 - -=item Footers - -=item Accessing Formatting Internals - -=back - -=item WARNINGS - -=back - -=head2 perlboot - Beginner's Object-Oriented Tutorial - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item If we could talk to the animals... - -=item Introducing the method invocation arrow - -=item Invoking a barnyard - -=item The extra parameter of method invocation - -=item Calling a second method to simplify things - -=item Inheriting the windpipes - -=item A few notes about @ISA - -=item Overriding the methods - -=item Starting the search from a different place - -=item The SUPER way of doing things - -=item Where we're at so far... - -=item A horse is a horse, of course of course -- or is it? - -=item Invoking an instance method - -=item Accessing the instance data - -=item How to build a horse - -=item Inheriting the constructor - -=item Making a method work with either classes or instances - -=item Adding parameters to a method - -=item More interesting instances - -=item A horse of a different color - -=item Summary - -=back - -=item SEE ALSO - -=item COPYRIGHT - -=back - -=head2 perltoot - Tom's object-oriented tutorial for perl - -=over 4 - -=item DESCRIPTION - -=item Creating a Class - -=over 4 - -=item Object Representation - -=item Class Interface - -=item Constructors and Instance Methods - -=item Planning for the Future: Better Constructors - -=item Destructors - -=item Other Object Methods - -=back - -=item Class Data - -=over 4 - -=item Accessing Class Data - -=item Debugging Methods - -=item Class Destructors - -=item Documenting the Interface - -=back - -=item Aggregation - -=item Inheritance - -=over 4 - -=item Overridden Methods - -=item Multiple Inheritance - -=item UNIVERSAL: The Root of All Objects - -=back - -=item Alternate Object Representations - -=over 4 - -=item Arrays as Objects - -=item Closures as Objects - -=back - -=item AUTOLOAD: Proxy Methods - -=over 4 - -=item Autoloaded Data Methods - -=item Inherited Autoloaded Data Methods - -=back - -=item Metaclassical Tools - -=over 4 - -=item Class::Struct - -=item Data Members as Variables - -=back - -=item NOTES - -=over 4 - -=item Object Terminology - -=back - -=item SEE ALSO - -=item AUTHOR AND COPYRIGHT - -=item COPYRIGHT - -=over 4 - -=item Acknowledgments - -=back - -=back - -=head2 perltootc - Tom's OO Tutorial for Class Data in Perl - -=over 4 - -=item DESCRIPTION - -=item Class Data in a Can - -=item Class Data as Package Variables - -=over 4 - -=item Putting All Your Eggs in One Basket - -=item Inheritance Concerns - -=item The Eponymous Meta-Object - -=item Indirect References to Class Data - -=item Monadic Classes - -=item Translucent Attributes - -=back - -=item Class Data as Lexical Variables - -=over 4 - -=item Privacy and Responsibility - -=item File-Scoped Lexicals - -=item More Inheritance Concerns - -=item Locking the Door and Throwing Away the Key - -=item Translucency Revisited - -=back - -=item NOTES - -=item SEE ALSO - -=item AUTHOR AND COPYRIGHT - -=item ACKNOWLEDGEMENTS - -=item HISTORY - -=back - -=head2 perlobj - Perl objects - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item An Object is Simply a Reference - -=item A Class is Simply a Package - -=item A Method is Simply a Subroutine - -=item Method Invocation - -=item WARNING - -=item Default UNIVERSAL methods - -isa(CLASS), can(METHOD), VERSION( [NEED] ) - -=item Destructors - -=item Summary - -=item Two-Phased Garbage Collection - -=back - -=item SEE ALSO - -=back - -=head2 perlbot - Bag'o Object Tricks (the BOT) - -=over 4 - -=item DESCRIPTION - -=item OO SCALING TIPS - -=item INSTANCE VARIABLES - -=item SCALAR INSTANCE VARIABLES - -=item INSTANCE VARIABLE INHERITANCE - -=item OBJECT RELATIONSHIPS - -=item OVERRIDING SUPERCLASS METHODS - -=item USING RELATIONSHIP WITH SDBM - -=item THINKING OF CODE REUSE - -=item CLASS CONTEXT AND THE OBJECT - -=item INHERITING A CONSTRUCTOR - -=item DELEGATION - -=back - -=head2 perltie - how to hide an object class in a simple variable - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=over 4 - -=item Tying Scalars - -TIESCALAR classname, LIST, FETCH this, STORE this, value, UNTIE this, -DESTROY this - -=item Tying Arrays - -TIEARRAY classname, LIST, FETCH this, index, STORE this, index, value, -FETCHSIZE this, STORESIZE this, count, EXTEND this, count, EXISTS this, -key, DELETE this, key, CLEAR this, PUSH this, LIST, POP this, SHIFT this, -UNSHIFT this, LIST, SPLICE this, offset, length, LIST, UNTIE this, DESTROY -this - -=item Tying Hashes - -USER, HOME, CLOBBER, LIST, TIEHASH classname, LIST, FETCH this, key, STORE -this, key, value, DELETE this, key, CLEAR this, EXISTS this, key, FIRSTKEY -this, NEXTKEY this, lastkey, UNTIE this, DESTROY this - -=item Tying FileHandles - -TIEHANDLE classname, LIST, WRITE this, LIST, PRINT this, LIST, PRINTF this, -LIST, READ this, LIST, READLINE this, GETC this, CLOSE this, UNTIE this, -DESTROY this - -=item UNTIE this - -=item The C Gotcha - -=back - -=item SEE ALSO - -=item BUGS - -=item AUTHOR - -=back - -=head2 perlipc - Perl interprocess communication (signals, fifos, pipes, -safe subprocesses, sockets, and semaphores) - -=over 4 - -=item DESCRIPTION - -=item Signals - -=item Named Pipes - -=over 4 - -=item WARNING - -=back - -=item Using open() for IPC - -=over 4 - -=item Filehandles - -=item Background Processes - -=item Complete Dissociation of Child from Parent - -=item Safe Pipe Opens - -=item Bidirectional Communication with Another Process - -=item Bidirectional Communication with Yourself - -=back - -=item Sockets: Client/Server Communication - -=over 4 - -=item Internet Line Terminators - -=item Internet TCP Clients and Servers - -=item Unix-Domain TCP Clients and Servers - -=back - -=item TCP Clients with IO::Socket - -=over 4 - -=item A Simple Client - -C, C, C - -=item A Webget Client - -=item Interactive Client with IO::Socket - -=back - -=item TCP Servers with IO::Socket - -Proto, LocalPort, Listen, Reuse - -=item UDP: Message Passing - -=item SysV IPC - -=item NOTES - -=item BUGS - -=item AUTHOR - -=item SEE ALSO - -=back - -=head2 perlfork - Perl's fork() emulation (EXPERIMENTAL, subject to change) - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=over 4 - -=item Behavior of other Perl features in forked pseudo-processes - -$$ or $PROCESS_ID, %ENV, chdir() and all other builtins that accept -filenames, wait() and waitpid(), kill(), exec(), exit(), Open handles to -files, directories and network sockets - -=item Resource limits - -=item Killing the parent process - -=item Lifetime of the parent process and pseudo-processes - -=item CAVEATS AND LIMITATIONS - -BEGIN blocks, Open filehandles, Forking pipe open() not yet implemented, -Global state maintained by XSUBs, Interpreter embedded in larger -application, Thread-safety of extensions - -=back - -=item BUGS - -=item AUTHOR - -=item SEE ALSO - -=back - -=head2 perlnumber - semantics of numbers and numeric operations in Perl - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item Storing numbers - -=item Numeric operators and numeric conversions - -=item Flavors of Perl numeric operations - -Arithmetic operators except, C, Arithmetic operators except, -C, Bitwise operators, C, Bitwise operators, C, Operators which expect an integer, Operators which expect a -string - -=item AUTHOR - -=item SEE ALSO - -=back - -=head2 perlthrtut - tutorial on threads in Perl - -=over 4 - -=item DESCRIPTION - -=item What Is A Thread Anyway? - -=item Threaded Program Models - -=over 4 - -=item Boss/Worker - -=item Work Crew - -=item Pipeline - -=back - -=item Native threads - -=item What kind of threads are perl threads? - -=item Threadsafe Modules - -=item Thread Basics - -=over 4 - -=item Basic Thread Support - -=item Creating Threads - -=item Giving up control - -=item Waiting For A Thread To Exit - -=item Errors In Threads - -=item Ignoring A Thread - -=back - -=item Threads And Data - -=over 4 - -=item Shared And Unshared Data - -=item Thread Pitfall: Races - -=item Controlling access: lock() - -=item Thread Pitfall: Deadlocks - -=item Queues: Passing Data Around - -=back - -=item Threads And Code - -=over 4 - -=item Semaphores: Synchronizing Data Access - -Basic semaphores, Advanced Semaphores - -=item Attributes: Restricting Access To Subroutines - -=item Subroutine Locks - -=item Methods - -=item Locking A Subroutine - -=back - -=item General Thread Utility Routines - -=over 4 - -=item What Thread Am I In? - -=item Thread IDs - -=item Are These Threads The Same? - -=item What Threads Are Running? - -=back - -=item A Complete Example - -=item Conclusion - -=item Bibliography - -=over 4 - -=item Introductory Texts - -=item OS-Related References - -=item Other References - -=back - -=item Acknowledgements - -=item AUTHOR - -=item Copyrights - -=back - -=head2 perlport - Writing portable Perl - -=over 4 - -=item DESCRIPTION - -Not all Perl programs have to be portable, Nearly all of Perl already I -portable - -=item ISSUES - -=over 4 - -=item Newlines - -=item Numbers endianness and Width - -=item Files and Filesystems - -=item System Interaction - -=item Interprocess Communication (IPC) - -=item External Subroutines (XS) - -=item Standard Modules - -=item Time and Date - -=item Character sets and character encoding - -=item Internationalisation - -=item System Resources - -=item Security - -=item Style - -=back - -=item CPAN Testers - -Mailing list: cpan-testers@perl.org, Testing results: -http://testers.cpan.org/ - -=item PLATFORMS - -=over 4 - -=item Unix - -=item DOS and Derivatives - -=item S - -=item VMS - -=item VOS - -=item EBCDIC Platforms - -=item Acorn RISC OS - -=item Other perls - -=back - -=item FUNCTION IMPLEMENTATIONS - -=over 4 - -=item Alphabetical Listing of Perl Functions - --I FILEHANDLE, -I EXPR, -I, alarm SECONDS, alarm, binmode -FILEHANDLE, chmod LIST, chown LIST, chroot FILENAME, chroot, crypt -PLAINTEXT,SALT, dbmclose HASH, dbmopen HASH,DBNAME,MODE, dump LABEL, exec -LIST, fcntl FILEHANDLE,FUNCTION,SCALAR, flock FILEHANDLE,OPERATION, fork, -getlogin, getpgrp PID, getppid, getpriority WHICH,WHO, getpwnam NAME, -getgrnam NAME, getnetbyname NAME, getpwuid UID, getgrgid GID, getnetbyaddr -ADDR,ADDRTYPE, getprotobynumber NUMBER, getservbyport PORT,PROTO, getpwent, -getgrent, gethostent, getnetent, getprotoent, getservent, setpwent, -setgrent, sethostent STAYOPEN, setnetent STAYOPEN, setprotoent STAYOPEN, -setservent STAYOPEN, endpwent, endgrent, endhostent, endnetent, -endprotoent, endservent, getsockopt SOCKET,LEVEL,OPTNAME, glob EXPR, glob, -ioctl FILEHANDLE,FUNCTION,SCALAR, kill SIGNAL, LIST, link OLDFILE,NEWFILE, -lstat FILEHANDLE, lstat EXPR, lstat, msgctl ID,CMD,ARG, msgget KEY,FLAGS, -msgsnd ID,MSG,FLAGS, msgrcv ID,VAR,SIZE,TYPE,FLAGS, open FILEHANDLE,EXPR, -open FILEHANDLE, pipe READHANDLE,WRITEHANDLE, readlink EXPR, readlink, -select RBITS,WBITS,EBITS,TIMEOUT, semctl ID,SEMNUM,CMD,ARG, semget -KEY,NSEMS,FLAGS, semop KEY,OPSTRING, setgrent, setpgrp PID,PGRP, -setpriority WHICH,WHO,PRIORITY, setpwent, setsockopt -SOCKET,LEVEL,OPTNAME,OPTVAL, shmctl ID,CMD,ARG, shmget KEY,SIZE,FLAGS, -shmread ID,VAR,POS,SIZE, shmwrite ID,STRING,POS,SIZE, socketpair -SOCKET1,SOCKET2,DOMAIN,TYPE,PROTOCOL, stat FILEHANDLE, stat EXPR, stat, -symlink OLDFILE,NEWFILE, syscall LIST, sysopen -FILEHANDLE,FILENAME,MODE,PERMS, system LIST, times, truncate -FILEHANDLE,LENGTH, truncate EXPR,LENGTH, umask EXPR, umask, utime LIST, -wait, waitpid PID,FLAGS - -=back - -=item CHANGES - -v1.48, 02 February 2001, v1.47, 22 March 2000, v1.46, 12 February 2000, -v1.45, 20 December 1999, v1.44, 19 July 1999, v1.43, 24 May 1999, v1.42, 22 -May 1999, v1.41, 19 May 1999, v1.40, 11 April 1999, v1.39, 11 February -1999, v1.38, 31 December 1998, v1.37, 19 December 1998, v1.36, 9 September -1998, v1.35, 13 August 1998, v1.33, 06 August 1998, v1.32, 05 August 1998, -v1.30, 03 August 1998, v1.23, 10 July 1998 - -=item Supported Platforms - -=item SEE ALSO - -=item AUTHORS / CONTRIBUTORS - -=item VERSION - -=back - -=head2 perllocale - Perl locale handling (internationalization and -localization) - -=over 4 - -=item DESCRIPTION - -=item PREPARING TO USE LOCALES - -=item USING LOCALES - -=over 4 - -=item The use locale pragma - -=item The setlocale function - -=item Finding locales - -=item LOCALE PROBLEMS - -=item Temporarily fixing locale problems - -=item Permanently fixing locale problems - -=item Permanently fixing your system's locale configuration - -=item Fixing system locale configuration - -=item The localeconv function - -=back - -=item LOCALE CATEGORIES - -=over 4 - -=item Category LC_COLLATE: Collation - -=item Category LC_CTYPE: Character Types - -=item Category LC_NUMERIC: Numeric Formatting - -=item Category LC_MONETARY: Formatting of monetary amounts - -=item LC_TIME - -=item Other categories - -=back - -=item SECURITY - -=item ENVIRONMENT - -PERL_BADLANG, LC_ALL, LANGUAGE, LC_CTYPE, LC_COLLATE, LC_MONETARY, -LC_NUMERIC, LC_TIME, LANG - -=item NOTES - -=over 4 - -=item Backward compatibility - -=item I18N:Collate obsolete - -=item Sort speed and memory use impacts - -=item write() and LC_NUMERIC - -=item Freely available locale definitions - -=item I18n and l10n - -=item An imperfect standard - -=back - -=item BUGS - -=over 4 - -=item Broken systems - -=back - -=item SEE ALSO - -=item HISTORY - -=back - -=head2 perlunicode - Unicode support in Perl (EXPERIMENTAL, subject to -change) - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item Important Caveat - -Input and Output Disciplines, Regular Expressions, C still needed -to enable a few features - -=item Byte and Character semantics - -=item Effects of character semantics - -=item Character encodings for input and output - -=back - -=item CAVEATS - -=item SEE ALSO - -=back - -=head2 perlebcdic - Considerations for running Perl on EBCDIC platforms - -=over 4 - -=item DESCRIPTION - -=item COMMON CHARACTER CODE SETS - -=over 4 - -=item ASCII - -=item ISO 8859 - -=item Latin 1 (ISO 8859-1) - -=item EBCDIC - -=item 13 variant characters - -=item 0037 - -=item 1047 - -=item POSIX-BC - -=back - -=item SINGLE OCTET TABLES - -recipe 0, recipe 1, recipe 2, recipe 3, recipe 4 - -=item IDENTIFYING CHARACTER CODE SETS - -=item CONVERSIONS - -=over 4 - -=item tr/// - -=item iconv - -=item C RTL - -=back - -=item OPERATOR DIFFERENCES - -=item FUNCTION DIFFERENCES - -chr(), ord(), pack(), print(), printf(), sort(), sprintf(), unpack() - -=item REGULAR EXPRESSION DIFFERENCES - -=item SOCKETS - -=item SORTING - -=over 4 - -=item Ignore ASCII vs. EBCDIC sort differences. - -=item MONO CASE then sort data. - -=item Convert, sort data, then re convert. - -=item Perform sorting on one type of machine only. - -=back - -=item TRANFORMATION FORMATS - -=over 4 - -=item URL decoding and encoding - -=item uu encoding and decoding - -=item Quoted-Printable encoding and decoding - -=item Caesarian cyphers - -=back - -=item Hashing order and checksums - -=item I18N AND L10N - -=item MULTI OCTET CHARACTER SETS - -=item OS ISSUES - -=over 4 - -=item OS/400 - -IFS access - -=item OS/390 - -chcp, dataset access, OS/390 iconv, locales - -=item VM/ESA? - -=item POSIX-BC? - -=back - -=item BUGS - -=item SEE ALSO - -=item REFERENCES - -=item AUTHOR - -=back - -=head2 perlsec - Perl security - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item Laundering and Detecting Tainted Data - -=item Switches On the "#!" Line - -=item Cleaning Up Your Path - -=item Security Bugs - -=item Protecting Your Programs - -=back - -=item SEE ALSO - -=back - -=head2 perlmod - Perl modules (packages and symbol tables) - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item Packages - -=item Symbol Tables - -=item Package Constructors and Destructors - -=item Perl Classes - -=item Perl Modules - -=back - -=item SEE ALSO - -=back - -=head2 perlmodlib - constructing new Perl modules and finding existing ones - -=over 4 - -=item DESCRIPTION - -=item THE PERL MODULE LIBRARY - -=over 4 - -=item Pragmatic Modules - -attributes, attrs, autouse, base, blib, bytes, charnames, constant, -diagnostics, fields, filetest, integer, less, lib, locale, open, ops, -overload, re, sigtrap, strict, subs, utf8, vars, warnings, -warnings::register - -=item Standard Modules - -AnyDBM_File, AutoLoader, AutoSplit, B, B::Asmdata, B::Assembler, B::Bblock, -B::Bytecode, B::C, B::CC, B::Concise, B::Debug, B::Deparse, -B::Disassembler, B::Lint, B::Showlex, B::Stackobj, B::Stash, B::Terse, -B::Xref, Benchmark, ByteLoader, CGI, CGI::Apache, CGI::Carp, CGI::Cookie, -CGI::Fast, CGI::Pretty, CGI::Push, CGI::Switch, CGI::Util, CPAN, -CPAN::FirstTime, CPAN::Nox, Carp, Carp::Heavy, Class::Struct, Cwd, DB, -DB_File, Devel::SelfStubber, DirHandle, Dumpvalue, English, Env, Exporter, -Exporter::Heavy, ExtUtils::Command, ExtUtils::Embed, ExtUtils::Install, -ExtUtils::Installed, ExtUtils::Liblist, ExtUtils::MM_Cygwin, -ExtUtils::MM_OS2, ExtUtils::MM_Unix, ExtUtils::MM_VMS, ExtUtils::MM_Win32, -ExtUtils::MakeMaker, ExtUtils::Manifest, ExtUtils::Mkbootstrap, -ExtUtils::Mksymlists, ExtUtils::Packlist, ExtUtils::testlib, Fatal, Fcntl, -File::Basename, File::CheckTree, File::Compare, File::Copy, File::DosGlob, -File::Find, File::Path, File::Spec, File::Spec::Epoc, -File::Spec::Functions, File::Spec::Mac, File::Spec::OS2, File::Spec::Unix, -File::Spec::VMS, File::Spec::Win32, File::Temp, File::stat, FileCache, -FileHandle, FindBin, GDBM_File, Getopt::Long, Getopt::Std, I18N::Collate, -IO, IPC::Open2, IPC::Open3, Math::BigFloat, Math::BigInt, Math::Complex, -Math::Trig, Net::Ping, Net::hostent, Net::netent, Net::protoent, -Net::servent, O, Opcode, POSIX, Pod::Checker, Pod::Find, Pod::Html, -Pod::InputObjects, Pod::LaTeX, Pod::Man, Pod::ParseUtils, Pod::Parser, -Pod::Plainer, Pod::Select, Pod::Text, Pod::Text::Color, -Pod::Text::Overstrike, Pod::Text::Termcap, Pod::Usage, SDBM_File, Safe, -Search::Dict, SelectSaver, SelfLoader, Shell, Socket, Symbol, -Term::ANSIColor, Term::Cap, Term::Complete, Term::ReadLine, Test, -Test::Harness, Text::Abbrev, Text::ParseWords, Text::Soundex, Text::Tabs, -Text::Wrap, Thread, Thread::Queue, Thread::Semaphore, Thread::Signal, -Thread::Specific, Tie::Array, Tie::Handle, Tie::Hash, Tie::RefHash, -Tie::Scalar, Tie::SubstrHash, Time::Local, Time::gmtime, Time::localtime, -Time::tm, UNIVERSAL, User::grent, User::pwent, Win32 - -=item Extension Modules - -=back - -=item CPAN - -=over 4 - -=item Africa - -=item Asia - -=item Central America - -=item Europe - -=item North America - -=item Oceania - -=item South America - -=back - -=item Modules: Creation, Use, and Abuse - -=over 4 - -=item Guidelines for Module Creation - -Adding a Copyright Notice - -=item Guidelines for Converting Perl 4 Library Scripts into Modules - -=item Guidelines for Reusing Application Code - -=back - -=item NOTE - -=back - -=head2 perlmodinstall - Installing CPAN Modules - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item PREAMBLE - -B the file, B the file into a directory, B the -module (sometimes unnecessary), B the module - -=back - -=item PORTABILITY - -=item HEY - -=item AUTHOR - -=item COPYRIGHT - -=back - -=head2 perlnewmod - preparing a new module for distribution - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item Warning - -=item What should I make into a module? - -=item Step-by-step: Preparing the ground - -Look around, Check it's new, Discuss the need, Choose a name, Check again - -=item Step-by-step: Making the module - -Start with F, Use L and L, Use -L, Use L - wisely!, Use L, Write tests, Write the README - -=item Step-by-step: Distributing your module - -Get a CPAN user ID, C, Upload the -tarball, Announce to the modules list, Announce to clpa, Fix bugs! - -=back - -=item AUTHOR - -=item SEE ALSO - -=back - -=head2 perlfaq1 - General Questions About Perl ($Revision: 1.23 $, $Date: -1999/05/23 16:08:30 $) - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item What is Perl? - -=item Who supports Perl? Who develops it? Why is it free? - -=item Which version of Perl should I use? - -=item What are perl4 and perl5? - -=item What is perl6? - -=item How stable is Perl? - -=item Is Perl difficult to learn? - -=item How does Perl compare with other languages like Java, Python, REXX, -Scheme, or Tcl? - -=item Can I do [task] in Perl? - -=item When shouldn't I program in Perl? - -=item What's the difference between "perl" and "Perl"? - -=item Is it a Perl program or a Perl script? - -=item What is a JAPH? - -=item Where can I get a list of Larry Wall witticisms? - -=item How can I convince my sysadmin/supervisor/employees to use version -5/5.005/Perl instead of some other language? - -=back - -=item AUTHOR AND COPYRIGHT - -=back - -=head2 perlfaq2 - Obtaining and Learning about Perl ($Revision: 1.32 $, -$Date: 1999/10/14 18:46:09 $) - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item What machines support Perl? Where do I get it? - -=item How can I get a binary version of Perl? - -=item I don't have a C compiler on my system. How can I compile perl? - -=item I copied the Perl binary from one machine to another, but scripts -don't work. - -=item I grabbed the sources and tried to compile but gdbm/dynamic -loading/malloc/linking/... failed. How do I make it work? - -=item What modules and extensions are available for Perl? What is CPAN? -What does CPAN/src/... mean? - -=item Is there an ISO or ANSI certified version of Perl? - -=item Where can I get information on Perl? - -=item What are the Perl newsgroups on Usenet? Where do I post questions? - -=item Where should I post source code? - -=item Perl Books - -References, Tutorials, Task-Oriented, Special Topics - -=item Perl in Magazines - -=item Perl on the Net: FTP and WWW Access - -=item What mailing lists are there for Perl? - -=item Archives of comp.lang.perl.misc - -=item Where can I buy a commercial version of Perl? - -=item Where do I send bug reports? - -=item What is perl.com? Perl Mongers? pm.org? perl.org? - -=back - -=item AUTHOR AND COPYRIGHT - -=back - -=head2 perlfaq3 - Programming Tools ($Revision: 1.38 $, $Date: 1999/05/23 -16:08:30 $) - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item How do I do (anything)? - -=item How can I use Perl interactively? - -=item Is there a Perl shell? - -=item How do I debug my Perl programs? - -=item How do I profile my Perl programs? - -=item How do I cross-reference my Perl programs? - -=item Is there a pretty-printer (formatter) for Perl? - -=item Is there a ctags for Perl? - -=item Is there an IDE or Windows Perl Editor? - -CodeMagicCD, Komodo, The Object System, PerlBuilder, Perl code magic, -visiPerl+, GNU Emacs, MicroEMACS, XEmacs, Elvis, Vile, Vim, Codewright, -MultiEdit, SlickEdit, Bash, Ksh, Tcsh, Zsh, BBEdit and BBEdit Lite, Alpha - -=item Where can I get Perl macros for vi? - -=item Where can I get perl-mode for emacs? - -=item How can I use curses with Perl? - -=item How can I use X or Tk with Perl? - -=item How can I generate simple menus without using CGI or Tk? - -=item What is undump? - -=item How can I make my Perl program run faster? - -=item How can I make my Perl program take less memory? - -=item Is it unsafe to return a pointer to local data? - -=item How can I free an array or hash so my program shrinks? - -=item How can I make my CGI script more efficient? - -=item How can I hide the source for my Perl program? - -=item How can I compile my Perl program into byte code or C? - -=item How can I compile Perl into Java? - -=item How can I get C<#!perl> to work on [MS-DOS,NT,...]? - -=item Can I write useful Perl programs on the command line? - -=item Why don't Perl one-liners work on my DOS/Mac/VMS system? - -=item Where can I learn about CGI or Web programming in Perl? - -=item Where can I learn about object-oriented Perl programming? - -=item Where can I learn about linking C with Perl? [h2xs, xsubpp] - -=item I've read perlembed, perlguts, etc., but I can't embed perl in -my C program; what am I doing wrong? - -=item When I tried to run my script, I got this message. What does it -mean? - -=item What's MakeMaker? - -=back - -=item AUTHOR AND COPYRIGHT - -=back - -=head2 perlfaq4 - Data Manipulation ($Revision: 1.49 $, $Date: 1999/05/23 -20:37:49 $) - -=over 4 - -=item DESCRIPTION - -=item Data: Numbers - -=over 4 - -=item Why am I getting long decimals (eg, 19.9499999999999) instead of the -numbers I should be getting (eg, 19.95)? - -=item Why isn't my octal data interpreted correctly? - -=item Does Perl have a round() function? What about ceil() and floor()? -Trig functions? - -=item How do I convert bits into ints? - -=item Why doesn't & work the way I want it to? - -=item How do I multiply matrices? - -=item How do I perform an operation on a series of integers? - -=item How can I output Roman numerals? - -=item Why aren't my random numbers random? - -=back - -=item Data: Dates - -=over 4 - -=item How do I find the week-of-the-year/day-of-the-year? - -=item How do I find the current century or millennium? - -=item How can I compare two dates and find the difference? - -=item How can I take a string and turn it into epoch seconds? - -=item How can I find the Julian Day? - -=item How do I find yesterday's date? - -=item Does Perl have a Year 2000 problem? Is Perl Y2K compliant? - -=back - -=item Data: Strings - -=over 4 - -=item How do I validate input? - -=item How do I unescape a string? - -=item How do I remove consecutive pairs of characters? - -=item How do I expand function calls in a string? - -=item How do I find matching/nesting anything? - -=item How do I reverse a string? - -=item How do I expand tabs in a string? - -=item How do I reformat a paragraph? - -=item How can I access/change the first N letters of a string? - -=item How do I change the Nth occurrence of something? - -=item How can I count the number of occurrences of a substring within a -string? - -=item How do I capitalize all the words on one line? - -=item How can I split a [character] delimited string except when inside -[character]? (Comma-separated files) - -=item How do I strip blank space from the beginning/end of a string? - -=item How do I pad a string with blanks or pad a number with zeroes? - -=item How do I extract selected columns from a string? - -=item How do I find the soundex value of a string? - -=item How can I expand variables in text strings? - -=item What's wrong with always quoting "$vars"? - -=item Why don't my <? - -=item Is there a leak/bug in glob()? - -=item How can I open a file with a leading ">" or trailing blanks? - -=item How can I reliably rename a file? - -=item How can I lock a file? - -=item Why can't I just open(FH, ">file.lock")? - -=item I still don't get locking. I just want to increment the number in -the file. How can I do this? - -=item How do I randomly update a binary file? - -=item How do I get a file's timestamp in perl? - -=item How do I set a file's timestamp in perl? - -=item How do I print to more than one file at once? - -=item How can I read in an entire file all at once? - -=item How can I read in a file by paragraphs? - -=item How can I read a single character from a file? From the keyboard? - -=item How can I tell whether there's a character waiting on a filehandle? - -=item How do I do a C in perl? - -=item How do I dup() a filehandle in Perl? - -=item How do I close a file descriptor by number? - -=item Why can't I use "C:\temp\foo" in DOS paths? What doesn't -`C:\temp\foo.exe` work? - -=item Why doesn't glob("*.*") get all the files? - -=item Why does Perl let me delete read-only files? Why does C<-i> clobber -protected files? Isn't this a bug in Perl? - -=item How do I select a random line from a file? - -=item Why do I get weird spaces when I print an array of lines? - -=back - -=item AUTHOR AND COPYRIGHT - -=back - -=head2 perlfaq6 - Regexes ($Revision: 1.27 $, $Date: 1999/05/23 16:08:30 $) - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item How can I hope to use regular expressions without creating illegible -and unmaintainable code? - -Comments Outside the Regex, Comments Inside the Regex, Different Delimiters - -=item I'm having trouble matching over more than one line. What's wrong? - -=item How can I pull out lines between two patterns that are themselves on -different lines? - -=item I put a regular expression into $/ but it didn't work. What's wrong? - -=item How do I substitute case insensitively on the LHS while preserving -case on the RHS? - -=item How can I make C<\w> match national character sets? - -=item How can I match a locale-smart version of C? - -=item How can I quote a variable to use in a regex? - -=item What is C really for? - -=item How do I use a regular expression to strip C style comments from a -file? - -=item Can I use Perl regular expressions to match balanced text? - -=item What does it mean that regexes are greedy? How can I get around it? - -=item How do I process each word on each line? - -=item How can I print out a word-frequency or line-frequency summary? - -=item How can I do approximate matching? - -=item How do I efficiently match many regular expressions at once? - -=item Why don't word-boundary searches with C<\b> work for me? - -=item Why does using $&, $`, or $' slow my program down? - -=item What good is C<\G> in a regular expression? - -=item Are Perl regexes DFAs or NFAs? Are they POSIX compliant? - -=item What's wrong with using grep or map in a void context? - -=item How can I match strings with multibyte characters? - -=item How do I match a pattern that is supplied by the user? - -=back - -=item AUTHOR AND COPYRIGHT - -=back - -=head2 perlfaq7 - Perl Language Issues ($Revision: 1.28 $, $Date: -1999/05/23 20:36:18 $) - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item Can I get a BNF/yacc/RE for the Perl language? - -=item What are all these $@%&* punctuation signs, and how do I know when to -use them? - -=item Do I always/never have to quote my strings or use semicolons and -commas? - -=item How do I skip some return values? - -=item How do I temporarily block warnings? - -=item What's an extension? - -=item Why do Perl operators have different precedence than C operators? - -=item How do I declare/create a structure? - -=item How do I create a module? - -=item How do I create a class? - -=item How can I tell if a variable is tainted? - -=item What's a closure? - -=item What is variable suicide and how can I prevent it? - -=item How can I pass/return a {Function, FileHandle, Array, Hash, Method, -Regex}? - -Passing Variables and Functions, Passing Filehandles, Passing Regexes, -Passing Methods - -=item How do I create a static variable? - -=item What's the difference between dynamic and lexical (static) scoping? -Between local() and my()? - -=item How can I access a dynamic variable while a similarly named lexical -is in scope? - -=item What's the difference between deep and shallow binding? - -=item Why doesn't "my($foo) = ;" work right? - -=item How do I redefine a builtin function, operator, or method? - -=item What's the difference between calling a function as &foo and foo()? - -=item How do I create a switch or case statement? - -=item How can I catch accesses to undefined variables/functions/methods? - -=item Why can't a method included in this same file be found? - -=item How can I find out my current package? - -=item How can I comment out a large block of perl code? - -=item How do I clear a package? - -=item How can I use a variable as a variable name? - -=back - -=item AUTHOR AND COPYRIGHT - -=back - -=head2 perlfaq8 - System Interaction ($Revision: 1.39 $, $Date: 1999/05/23 -18:37:57 $) - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item How do I find out which operating system I'm running under? - -=item How come exec() doesn't return? - -=item How do I do fancy stuff with the keyboard/screen/mouse? - -Keyboard, Screen, Mouse - -=item How do I print something out in color? - -=item How do I read just one key without waiting for a return key? - -=item How do I check whether input is ready on the keyboard? - -=item How do I clear the screen? - -=item How do I get the screen size? - -=item How do I ask the user for a password? - -=item How do I read and write the serial port? - -lockfiles, open mode, end of line, flushing output, non-blocking input - -=item How do I decode encrypted password files? - -=item How do I start a process in the background? - -STDIN, STDOUT, and STDERR are shared, Signals, Zombies - -=item How do I trap control characters/signals? - -=item How do I modify the shadow password file on a Unix system? - -=item How do I set the time and date? - -=item How can I sleep() or alarm() for under a second? - -=item How can I measure time under a second? - -=item How can I do an atexit() or setjmp()/longjmp()? (Exception handling) - -=item Why doesn't my sockets program work under System V (Solaris)? What -does the error message "Protocol not supported" mean? - -=item How can I call my system's unique C functions from Perl? - -=item Where do I get the include files to do ioctl() or syscall()? - -=item Why do setuid perl scripts complain about kernel problems? - -=item How can I open a pipe both to and from a command? - -=item Why can't I get the output of a command with system()? - -=item How can I capture STDERR from an external command? - -=item Why doesn't open() return an error when a pipe open fails? - -=item What's wrong with using backticks in a void context? - -=item How can I call backticks without shell processing? - -=item Why can't my script read from STDIN after I gave it EOF (^D on Unix, -^Z on MS-DOS)? - -=item How can I convert my shell script to perl? - -=item Can I use perl to run a telnet or ftp session? - -=item How can I write expect in Perl? - -=item Is there a way to hide perl's command line from programs such as -"ps"? - -=item I {changed directory, modified my environment} in a perl script. How -come the change disappeared when I exited the script? How do I get my -changes to be visible? - -Unix - -=item How do I close a process's filehandle without waiting for it to -complete? - -=item How do I fork a daemon process? - -=item How do I find out if I'm running interactively or not? - -=item How do I timeout a slow event? - -=item How do I set CPU limits? - -=item How do I avoid zombies on a Unix system? - -=item How do I use an SQL database? - -=item How do I make a system() exit on control-C? - -=item How do I open a file without blocking? - -=item How do I install a module from CPAN? - -=item What's the difference between require and use? - -=item How do I keep my own module/library directory? - -=item How do I add the directory my program lives in to the module/library -search path? - -=item How do I add a directory to my include path at runtime? - -=item What is socket.ph and where do I get it? - -=back - -=item AUTHOR AND COPYRIGHT - -=back - -=head2 perlfaq9 - Networking ($Revision: 1.26 $, $Date: 1999/05/23 16:08:30 -$) - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item My CGI script runs from the command line but not the browser. (500 -Server Error) - -=item How can I get better error messages from a CGI program? - -=item How do I remove HTML from a string? - -=item How do I extract URLs? - -=item How do I download a file from the user's machine? How do I open a -file on another machine? - -=item How do I make a pop-up menu in HTML? - -=item How do I fetch an HTML file? - -=item How do I automate an HTML form submission? - -=item How do I decode or create those %-encodings on the web? - -=item How do I redirect to another page? - -=item How do I put a password on my web pages? - -=item How do I edit my .htpasswd and .htgroup files with Perl? - -=item How do I make sure users can't enter values into a form that cause my -CGI script to do bad things? - -=item How do I parse a mail header? - -=item How do I decode a CGI form? - -=item How do I check a valid mail address? - -=item How do I decode a MIME/BASE64 string? - -=item How do I return the user's mail address? - -=item How do I send mail? - -=item How do I use MIME to make an attachment to a mail message? - -=item How do I read mail? - -=item How do I find out my hostname/domainname/IP address? - -=item How do I fetch a news article or the active newsgroups? - -=item How do I fetch/put an FTP file? - -=item How can I do RPC in Perl? - -=back - -=item AUTHOR AND COPYRIGHT - -=back - -=head2 perlcompile - Introduction to the Perl Compiler-Translator - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item Layout - -B::Bytecode, B::C, B::CC, B::Lint, B::Deparse, B::Xref - -=back - -=item Using The Back Ends - -=over 4 - -=item The Cross Referencing Back End - -i, &, s, r - -=item The Decompiling Back End - -=item The Lint Back End - -=item The Simple C Back End - -=item The Bytecode Back End - -=item The Optimized C Back End - -B, O, B::Asmdata, B::Assembler, B::Bblock, B::Bytecode, B::C, B::CC, -B::Debug, B::Deparse, B::Disassembler, B::Lint, B::Showlex, B::Stackobj, -B::Stash, B::Terse, B::Xref - -=back - -=item KNOWN PROBLEMS - -=item AUTHOR - -=back - -=head2 perlembed - how to embed perl in your C program - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item PREAMBLE - -B, B, B, B, B - -=item ROADMAP - -=item Compiling your C program - -=item Adding a Perl interpreter to your C program - -=item Calling a Perl subroutine from your C program - -=item Evaluating a Perl statement from your C program - -=item Performing Perl pattern matches and substitutions from your C program - -=item Fiddling with the Perl stack from your C program - -=item Maintaining a persistent interpreter - -=item Maintaining multiple interpreter instances - -=item Using Perl modules, which themselves use C libraries, from your C -program - -=back - -=item Embedding Perl under Win32 - -=item MORAL - -=item AUTHOR - -=item COPYRIGHT - -=back - -=head2 perldebguts - Guts of Perl debugging - -=over 4 - -=item DESCRIPTION - -=item Debugger Internals - -=over 4 - -=item Writing Your Own Debugger - -=back - -=item Frame Listing Output Examples - -=item Debugging regular expressions - -=over 4 - -=item Compile-time output - -C I C I, C I C -I, C, C, C -I, C, C, C, C, C, C, -C - -=item Types of nodes - -=item Run-time output - -=back - -=item Debugging Perl memory usage - -=over 4 - -=item Using C<$ENV{PERL_DEBUG_MSTATS}> - -C, Free/Used, C, C, C, C, C - -=item Example of using B<-DL> switch - -C<717>, C<002>, C<054>, C<602>, C<702>, C<704> - -=item B<-DL> details - -C, C, C - -=item Limitations of B<-DL> statistics - -=back - -=item SEE ALSO - -=back - -=head2 perlxstut, perlXStut - Tutorial for writing XSUBs - -=over 4 - -=item DESCRIPTION - -=item SPECIAL NOTES - -=over 4 - -=item make - -=item Version caveat - -=item Dynamic Loading versus Static Loading - -=back - -=item TUTORIAL - -=over 4 - -=item EXAMPLE 1 - -=item EXAMPLE 2 - -=item What has gone on? - -=item Writing good test scripts - -=item EXAMPLE 3 - -=item What's new here? - -=item Input and Output Parameters - -=item The XSUBPP Program - -=item The TYPEMAP file - -=item Warning about Output Arguments - -=item EXAMPLE 4 - -=item What has happened here? - -=item Anatomy of .xs file - -=item Getting the fat out of XSUBs - -=item More about XSUB arguments - -=item The Argument Stack - -=item Extending your Extension - -=item Documenting your Extension - -=item Installing your Extension - -=item EXAMPLE 5 - -=item New Things in this Example - -=item EXAMPLE 6 - -=item New Things in this Example - -=item EXAMPLE 7 (Coming Soon) - -=item EXAMPLE 8 (Coming Soon) - -=item EXAMPLE 9 (Coming Soon) - -=item Troubleshooting these Examples - -=back - -=item See also - -=item Author - -=over 4 - -=item Last Changed - -=back - -=back - -=head2 perlxs - XS language reference manual - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item Introduction - -=item On The Road - -=item The Anatomy of an XSUB - -=item The Argument Stack - -=item The RETVAL Variable - -=item The MODULE Keyword - -=item The PACKAGE Keyword - -=item The PREFIX Keyword - -=item The OUTPUT: Keyword - -=item The NO_OUTPUT Keyword - -=item The CODE: Keyword - -=item The INIT: Keyword - -=item The NO_INIT Keyword - -=item Initializing Function Parameters - -=item Default Parameter Values - -=item The PREINIT: Keyword - -=item The SCOPE: Keyword - -=item The INPUT: Keyword - -=item The IN/OUTLIST/IN_OUTLIST/OUT/IN_OUT Keywords - -=item Variable-length Parameter Lists - -=item The C_ARGS: Keyword - -=item The PPCODE: Keyword - -=item Returning Undef And Empty Lists - -=item The REQUIRE: Keyword - -=item The CLEANUP: Keyword - -=item The POST_CALL: Keyword - -=item The BOOT: Keyword - -=item The VERSIONCHECK: Keyword - -=item The PROTOTYPES: Keyword - -=item The PROTOTYPE: Keyword - -=item The ALIAS: Keyword - -=item The INTERFACE: Keyword - -=item The INTERFACE_MACRO: Keyword - -=item The INCLUDE: Keyword - -=item The CASE: Keyword - -=item The & Unary Operator - -=item Inserting POD, Comments and C Preprocessor Directives - -=item Using XS With C++ - -=item Interface Strategy - -=item Perl Objects And C Structures - -=item The Typemap - -=back - -=item EXAMPLES - -=item XS VERSION - -=item AUTHOR - -=back - -=head2 perlclib - Internal replacements for standard C library functions - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item Conventions - -C, C

    , C, C - -=item File Operations - -=item File Input and Output - -=item File Positioning - -=item Memory Management and String Handling - -=item Character Class Tests - -=item F functions - -=item Miscellaneous functions - -=back - -=item SEE ALSO - -=back - -=head2 perlguts - Introduction to the Perl API - -=over 4 - -=item DESCRIPTION - -=item Variables - -=over 4 - -=item Datatypes - -=item What is an "IV"? - -=item Working with SVs - -=item Offsets - -=item What's Really Stored in an SV? - -=item Working with AVs - -=item Working with HVs - -=item Hash API Extensions - -=item References - -=item Blessed References and Class Objects - -=item Creating New Variables - -=item Reference Counts and Mortality - -=item Stashes and Globs - -=item Double-Typed SVs - -=item Magic Variables - -=item Assigning Magic - -=item Magic Virtual Tables - -=item Finding Magic - -=item Understanding the Magic of Tied Hashes and Arrays - -=item Localizing changes - -C, C, C, C, -C, C, C, C, C, C, C, -C, -C, -C, C, C, C, C, -C, C, -C, C, C - -=back - -=item Subroutines - -=over 4 - -=item XSUBs and the Argument Stack - -=item Calling Perl Routines from within C Programs - -=item Memory Allocation - -=item PerlIO - -=item Putting a C value on Perl stack - -=item Scratchpads - -=item Scratchpads and recursion - -=back - -=item Compiled code - -=over 4 - -=item Code tree - -=item Examining the tree - -=item Compile pass 1: check routines - -=item Compile pass 1a: constant folding - -=item Compile pass 2: context propagation - -=item Compile pass 3: peephole optimization - -=back - -=item Examining internal data structures with the C functions - -=item How multiple interpreters and concurrency are supported - -=over 4 - -=item Background and PERL_IMPLICIT_CONTEXT - -=item So what happened to dTHR? - -=item How do I use all this in extensions? - -=item Should I do anything special if I call perl from multiple threads? - -=item Future Plans and PERL_IMPLICIT_SYS - -=back - -=item Internal Functions - -A, p, d, s, n, r, f, M, o, j, x - -=over 4 - -=item Formatted Printing of IVs, UVs, and NVs - -=item Pointer-To-Integer and Integer-To-Pointer - -=item Source Documentation - -=back - -=item Unicode Support - -=over 4 - -=item What B Unicode, anyway? - -=item How can I recognise a UTF8 string? - -=item How does UTF8 represent Unicode characters? - -=item How does Perl store UTF8 strings? - -=item How do I convert a string to UTF8? - -=item Is there anything else I need to know? - -=back - -=item AUTHORS - -=item SEE ALSO - -=back - -=head2 perlcall - Perl calling conventions from C - -=over 4 - -=item DESCRIPTION - -An Error Handler, An Event Driven Program - -=item THE CALL_ FUNCTIONS - -call_sv, call_pv, call_method, call_argv - -=item FLAG VALUES - -=over 4 - -=item G_VOID - -=item G_SCALAR - -=item G_ARRAY - -=item G_DISCARD - -=item G_NOARGS - -=item G_EVAL - -=item G_KEEPERR - -=item Determining the Context - -=back - -=item KNOWN PROBLEMS - -=item EXAMPLES - -=over 4 - -=item No Parameters, Nothing returned - -=item Passing Parameters - -=item Returning a Scalar - -=item Returning a list of values - -=item Returning a list in a scalar context - -=item Returning Data from Perl via the parameter list - -=item Using G_EVAL - -=item Using G_KEEPERR - -=item Using call_sv - -=item Using call_argv - -=item Using call_method - -=item Using GIMME_V - -=item Using Perl to dispose of temporaries - -=item Strategies for storing Callback Context Information - -1. Ignore the problem - Allow only 1 callback, 2. Create a sequence of -callbacks - hard wired limit, 3. Use a parameter to map to the Perl -callback - -=item Alternate Stack Manipulation - -=item Creating and calling an anonymous subroutine in C - -=back - -=item SEE ALSO - -=item AUTHOR - -=item DATE - -=back - -=head2 perlutil - utilities packaged with the Perl distribution - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item DOCUMENTATION - -L, L and L, -L and L, L, -L, L, L, -L - -=item CONVERTORS - -L, L, L - -=item Development - -L, L, L and L, -L, L, L - -=item SEE ALSO - -=back - -=back - -=head2 perlfilter - Source Filters - -=over 4 - -=item DESCRIPTION - -=item CONCEPTS - -=item USING FILTERS - -=item WRITING A SOURCE FILTER - -=item WRITING A SOURCE FILTER IN C - -B - -=item CREATING A SOURCE FILTER AS A SEPARATE EXECUTABLE - -=item WRITING A SOURCE FILTER IN PERL - -=item USING CONTEXT: THE DEBUG FILTER - -=item CONCLUSION - -=item REQUIREMENTS - -=item AUTHOR - -=item Copyrights - -=back - -=head2 perldbmfilter - Perl DBM Filters - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -B, B, B, -B - -=over 4 - -=item The Filter - -=item An Example -- the NULL termination problem. - -=item Another Example -- Key is a C int. - -=back - -=item SEE ALSO - -=item AUTHOR - -=back - -=head2 perlapi - autogenerated documentation for the perl public API - -=over 4 - -=item DESCRIPTION - -AvFILL, av_clear, av_delete, av_exists, av_extend, av_fetch, av_fill, -av_len, av_make, av_pop, av_push, av_shift, av_store, av_undef, av_unshift, -bytes_from_utf8, bytes_to_utf8, call_argv, call_method, call_pv, call_sv, -CLASS, Copy, croak, CvSTASH, dMARK, dORIGMARK, dSP, dXSARGS, dXSI32, ENTER, -eval_pv, eval_sv, EXTEND, fbm_compile, fbm_instr, FREETMPS, get_av, get_cv, -get_hv, get_sv, GIMME, GIMME_V, GvSV, gv_fetchmeth, gv_fetchmethod, -gv_fetchmethod_autoload, gv_stashpv, gv_stashsv, G_ARRAY, G_DISCARD, -G_EVAL, G_NOARGS, G_SCALAR, G_VOID, HEf_SVKEY, HeHASH, HeKEY, HeKLEN, HePV, -HeSVKEY, HeSVKEY_force, HeSVKEY_set, HeVAL, HvNAME, hv_clear, hv_delete, -hv_delete_ent, hv_exists, hv_exists_ent, hv_fetch, hv_fetch_ent, -hv_iterinit, hv_iterkey, hv_iterkeysv, hv_iternext, hv_iternextsv, -hv_iterval, hv_magic, hv_store, hv_store_ent, hv_undef, isALNUM, isALPHA, -isDIGIT, isLOWER, isSPACE, isUPPER, is_utf8_char, is_utf8_string, items, -ix, LEAVE, looks_like_number, MARK, mg_clear, mg_copy, mg_find, mg_free, -mg_get, mg_length, mg_magical, mg_set, Move, New, newAV, Newc, newCONSTSUB, -newHV, newRV_inc, newRV_noinc, NEWSV, newSViv, newSVnv, newSVpv, newSVpvf, -newSVpvn, newSVrv, newSVsv, newSVuv, newXS, newXSproto, Newz, Nullav, -Nullch, Nullcv, Nullhv, Nullsv, ORIGMARK, perl_alloc, perl_construct, -perl_destruct, perl_free, perl_parse, perl_run, PL_modglobal, PL_na, -PL_sv_no, PL_sv_undef, PL_sv_yes, POPi, POPl, POPn, POPp, POPs, PUSHi, -PUSHMARK, PUSHn, PUSHp, PUSHs, PUSHu, PUTBACK, Renew, Renewc, require_pv, -RETVAL, Safefree, savepv, savepvn, SAVETMPS, SP, SPAGAIN, ST, strEQ, strGE, -strGT, strLE, strLT, strNE, strnEQ, strnNE, StructCopy, SvCUR, SvCUR_set, -SvEND, SvGETMAGIC, SvGROW, SvIOK, SvIOKp, SvIOK_notUV, SvIOK_off, SvIOK_on, -SvIOK_only, SvIOK_only_UV, SvIOK_UV, SvIV, SvIVX, SvLEN, SvNIOK, SvNIOKp, -SvNIOK_off, SvNOK, SvNOKp, SvNOK_off, SvNOK_on, SvNOK_only, SvNV, SvNVX, -SvOK, SvOOK, SvPOK, SvPOKp, SvPOK_off, SvPOK_on, SvPOK_only, -SvPOK_only_UTF8, SvPV, SvPVX, SvPV_force, SvPV_nolen, SvREFCNT, -SvREFCNT_dec, SvREFCNT_inc, SvROK, SvROK_off, SvROK_on, SvRV, SvSETMAGIC, -SvSetSV, SvSetSV_nosteal, SvSTASH, SvTAINT, SvTAINTED, SvTAINTED_off, -SvTAINTED_on, SvTRUE, svtype, SvTYPE, SVt_IV, SVt_NV, SVt_PV, SVt_PVAV, -SVt_PVCV, SVt_PVHV, SVt_PVMG, SvUPGRADE, SvUTF8, SvUTF8_off, SvUTF8_on, -SvUV, SvUVX, sv_2mortal, sv_bless, sv_catpv, sv_catpvf, sv_catpvf_mg, -sv_catpvn, sv_catpvn_mg, sv_catpv_mg, sv_catsv, sv_catsv_mg, sv_chop, -sv_clear, sv_cmp, sv_cmp_locale, sv_dec, sv_derived_from, sv_eq, sv_free, -sv_gets, sv_grow, sv_inc, sv_insert, sv_isa, sv_isobject, sv_len, -sv_len_utf8, sv_magic, sv_mortalcopy, sv_newmortal, sv_pvn_force, -sv_pvutf8n_force, sv_reftype, sv_replace, sv_rvweaken, sv_setiv, -sv_setiv_mg, sv_setnv, sv_setnv_mg, sv_setpv, sv_setpvf, sv_setpvf_mg, -sv_setpviv, sv_setpviv_mg, sv_setpvn, sv_setpvn_mg, sv_setpv_mg, -sv_setref_iv, sv_setref_nv, sv_setref_pv, sv_setref_pvn, sv_setsv, -sv_setsv_mg, sv_setuv, sv_setuv_mg, sv_true, sv_unmagic, sv_unref, -sv_upgrade, sv_usepvn, sv_usepvn_mg, sv_utf8_downgrade, sv_utf8_encode, -sv_utf8_upgrade, sv_vcatpvfn, sv_vsetpvfn, THIS, toLOWER, toUPPER, -utf8_distance, utf8_hop, utf8_length, utf8_to_bytes, utf8_to_uv, -utf8_to_uv_simple, uv_to_utf8, warn, XPUSHi, XPUSHn, XPUSHp, XPUSHs, -XPUSHu, XS, XSRETURN, XSRETURN_EMPTY, XSRETURN_IV, XSRETURN_NO, -XSRETURN_NV, XSRETURN_PV, XSRETURN_UNDEF, XSRETURN_YES, XST_mIV, XST_mNO, -XST_mNV, XST_mPV, XST_mUNDEF, XST_mYES, XS_VERSION, XS_VERSION_BOOTCHECK, -Zero - -=item AUTHORS - -=item SEE ALSO - -=back - -=head2 perlintern - autogenerated documentation of purely B - Perl functions - -=over 4 - -=item DESCRIPTION - -is_gv_magical, LVRET, PL_DBsingle, PL_DBsub, PL_DBtrace, PL_dowarn, -PL_last_in_gv, PL_ofs_sv, PL_rs - -=item AUTHORS - -=item SEE ALSO - -=back - -=head2 perlapio - perl's IO abstraction interface. - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -B, B, B, B, -B, B, -B, B, -B, B, -B, B, B, -B, B, B, -B, B, B, -B, B, B, -B, B, B, -B, B - -=over 4 - -=item Co-existence with stdio - -B, B, -B, B, B, -B, B, B, -B, B, -B, B, B, -B, B - -=back - -=back - -=head2 perltodo - Perl TO-DO List - -=over 4 - -=item DESCRIPTION - -=item Infrastructure - -=over 4 - -=item Mailing list archives - -=item Bug tracking system - -=item Regression Tests - -Coverage, Regression, __DIE__, suidperl, The 25% slowdown from perl4 to -perl5 - -=back - -=item Configure - -=over 4 - -=item Install HTML - -=back - -=item Perl Language - -=over 4 - -=item 64-bit Perl - -=item Prototypes - -Named prototypes, Indirect objects, Method calls, Context, Scoped subs - -=back - -=item Perl Internals - -=over 4 - -=item magic_setisa - -=item Garbage Collection - -=item Reliable signals - -Alternate runops() for signal despatch, Figure out how to die() in delayed -sighandler, Add tests for Thread::Signal, Automatic tests against CPAN - -=item Interpolated regex performance bugs - -=item Memory leaks from failed eval/regcomp - -=item Make XS easier to use - -=item Make embedded Perl easier to use - -=item Namespace cleanup - -=item MULTIPLICITY - -=item MacPerl - -=back - -=item Documentation - -=over 4 - -=item A clear division into tutorial and reference - -=item Remove the artificial distinction between operators and functions - -=item More tutorials - -Regular expressions, I/O, pack/unpack, Debugging - -=item Include a search tool - -=item Include a locate tool - -=item Separate function manpages by default - -=item Users can't find the manpages - -=item Install ALL Documentation - -=item Outstanding issues to be documented - -=item Adapt www.linuxhq.com for Perl - -=item Replace man with a perl program - -=item Unicode tutorial - -=back - -=item Modules - -=over 4 - -=item Update the POSIX extension to conform with the POSIX 1003.1 Edition 2 - -=item Module versions - -=item New modules - -=item Profiler - -=item Tie Modules - -VecArray, SubstrArray, VirtualArray, ShiftSplice - -=item Procedural options - -=item RPC - -=item y2k localtime/gmtime - -=item Export File::Find variables - -=item Ioctl - -=item Debugger attach/detach - -=item Regular Expression debugger - -=item Alternative RE Syntax - -=item Bundled modules - -=item Expect - -=item GUI::Native - -=item Update semibroken auxiliary tools; h2ph, a2p, etc. - -=item pod2html - -=item Podchecker - -=back - -=item Tom's Wishes - -=over 4 - -=item Webperl - -=item Mobile agents - -=item POSIX on non-POSIX - -=item Portable installations - -=back - -=item Win32 Stuff - -=over 4 - -=item Rename new headers to be consistent with the rest - -=item Sort out the spawnvp() mess - -=item Work out DLL versioning - -=item Style-check - -=back - -=item Would be nice to have - -C, Contiguous bitfields in pack/unpack, lexperl, Bundled -perl preprocessor, Use posix calls internally where possible, format -BOTTOM, -i rename file only when successfully changed, All ARGV input -should act like <>, report HANDLE [formats], support in perlmain to rerun -debugger, lvalue functions - -=item Possible pragmas - -=over 4 - -=item 'less' - -=back - -=item Optimizations - -=over 4 - -=item constant function cache - -=item foreach(reverse...) - -=item Cache eval tree - -=item rcatmaybe - -=item Shrink opcode tables - -=item Cache hash value - -=item Optimize away @_ where possible - -=item Optimize sort by { $a <=> $b } - -=item Rewrite regexp parser for better integrated optimization - -=back - -=item Vague possibilities - -ref function in list context, make tr/// return histogram in list context?, -Loop control on do{} et al, Explicit switch statements, compile to real -threaded code, structured types, Modifiable $1 et al - -=item To Do Or Not To Do - -=over 4 - -=item Making my() work on "package" variables - -=item "or" testing defined not truth - -=item "dynamic" lexicals - -=item "class"-based, rather than package-based "lexicals" - -=back - -=item Threading - -=over 4 - -=item Modules - -=item Testing - -=item $AUTOLOAD - -=item exit/die - -=item External threads - -=item Thread::Pool - -=item thread-safety - -=item Per-thread GVs - -=back - -=item Compiler - -=over 4 - -=item Optimization - -=item Byteperl - -=item Precompiled modules - -=item Executables - -=item Typed lexicals - -=item Win32 - -=item END blocks - -=item _AUTOLOAD - -=item comppadlist - -=item Cached compilation - -=back - -=item Recently Finished Tasks - -=over 4 - -=item Figure a way out of $^(capital letter) - -=item Filenames - -=item Foreign lines - -=item Namespace cleanup - -=item ISA.pm - -=item gettimeofday - -=item autocroak? - -=back - -=back - -=head2 perlhack - How to hack at the Perl internals - -=over 4 - -=item DESCRIPTION - -Does concept match the general goals of Perl?, Where is the -implementation?, Backwards compatibility, Could it be a module instead?, Is -the feature generic enough?, Does it potentially introduce new bugs?, Does -it preclude other desirable features?, Is the implementation robust?, Is -the implementation generic enough to be portable?, Is there enough -documentation?, Is there another way to do it?, Does it create too much -work?, Patches speak louder than words - -=over 4 - -=item Keeping in sync - -rsync'ing the source tree, Using rsync over the LAN, Using pushing over the -NFS, rsync'ing the patches - -=item Why rsync the source tree - -It's easier, It's more recent, It's more reliable - -=item Why rsync the patches - -It's easier, It's a good reference, Finding a start point, Finding how to -fix a bug, Finding the source of misbehaviour - -=item Submitting patches - -L, L and L, L, -F, The perl5-porters FAQ - -=item Finding Your Way Around - -Core modules, Documentation, Configure, Interpreter - -=item Elements of the interpreter - -Startup, Parsing, Optimization, Running - -=item Internal Variable Types - -=item Op Trees - -=item Stacks - -Argument stack, Mark stack, Save stack - -=item Millions of Macros - -=item Poking at Perl - -=item Using a source-level debugger - -run [args], break function_name, break source.c:xxx, step, next, continue, -finish, 'enter', print - -=item Dumping Perl Data Structures - -=item Patching - -=back - -=item EXTERNAL TOOLS FOR DEBUGGING PERL - -=over 4 - -=item Rational Software's Purify - -=item Purify on Unix - --Accflags=-DPURIFY, -Doptimize='-g', -Uusemymalloc, -Dusemultiplicity - -=item Purify on NT - -DEFINES, USE_MULTI = define, #PERL_MALLOC = define, CFG = Debug - -=item CONCLUSION - -I - -=back - -=item AUTHOR - -=back - -=head2 perlhist - the Perl history records - -=over 4 - -=item DESCRIPTION - -=item INTRODUCTION - -=item THE KEEPERS OF THE PUMPKIN - -=over 4 - -=item PUMPKIN? - -=back - -=item THE RECORDS - -=over 4 - -=item SELECTED RELEASE SIZES - -=item SELECTED PATCH SIZES - -=back - -=item THE KEEPERS OF THE RECORDS - -=back - -=head2 perldelta - what's new for perl v5.6 - -=over 4 - -=item DESCRIPTION - -=item Summary of changes between 5.6.0 and 5.6.1 - -=over 4 - -=item Security Issues - -=item Core bug fixes - -C, Memory leaks, Numeric conversions, qw(a\\b), caller(), -Bugs in regular expressions, "slurp" mode, Autovivification of symbolic -references to special variables, Lexical warnings, Spurious warnings and -errors, glob(), Tainting, sort(), #line directives, Subroutine prototypes, -map(), Debugger, Locales, PERL5OPT, chop(), Unicode support, 64-bit -support, Compiler, Lvalue subroutines, IO::Socket, File::Find, xsubpp, C, Tests - -=item Core features - -=item Configuration issues - -=item Documentation - -=item Bundled modules - -B::Concise, File::Temp, Pod::LaTeX, Pod::Text::Overstrike, CGI, CPAN, -Class::Struct, DB_File, Devel::Peek, File::Find, Getopt::Long, IO::Poll, -IPC::Open3, Math::BigFloat, Math::Complex, Net::Ping, Opcode, Pod::Parser, -Pod::Text, SDBM_File, Sys::Syslog, Tie::RefHash, Tie::SubstrHash - -=item Platform-specific improvements - -NCR MP-RAS, NonStop-UX - -=item Interpreter cloning, threads, and concurrency - -=item Lexically scoped warning categories - -=item Unicode and UTF-8 support - -=item Support for interpolating named characters - -=item "our" declarations - -=item Support for strings represented as a vector of ordinals - -=item Improved Perl version numbering system - -=item New syntax for declaring subroutine attributes - -=item File and directory handles can be autovivified - -=item open() with more than two arguments - -=item 64-bit support - -=item Large file support - -=item Long doubles - -=item "more bits" - -=item Enhanced support for sort() subroutines - -=item C allowed - -=item File globbing implemented internally - -=item Support for CHECK blocks - -=item POSIX character class syntax [: :] supported - -=item Better pseudo-random number generator - -=item Improved C operator - -=item Better worst-case behavior of hashes - -=item pack() format 'Z' supported - -=item pack() format modifier '!' supported - -=item pack() and unpack() support counted strings - -=item Comments in pack() templates - -=item Weak references - -=item Binary numbers supported - -=item Lvalue subroutines - -=item Some arrows may be omitted in calls through references - -=item Boolean assignment operators are legal lvalues - -=item exists() is supported on subroutine names - -=item exists() and delete() are supported on array elements - -=item Pseudo-hashes work better - -=item Automatic flushing of output buffers - -=item Better diagnostics on meaningless filehandle operations - -=item Where possible, buffered data discarded from duped input filehandle - -=item eof() has the same old magic as <> - -=item binmode() can be used to set :crlf and :raw modes - -=item C<-T> filetest recognizes UTF-8 encoded files as "text" - -=item system(), backticks and pipe open now reflect exec() failure - -=item Improved diagnostics - -=item Diagnostics follow STDERR - -=item More consistent close-on-exec behavior - -=item syswrite() ease-of-use - -=item Better syntax checks on parenthesized unary operators - -=item Bit operators support full native integer width - -=item Improved security features - -=item More functional bareword prototype (*) - -=item C and C may be overridden - -=item $^X variables may now have names longer than one character - -=item New variable $^C reflects C<-c> switch - -=item New variable $^V contains Perl version as a string - -=item Optional Y2K warnings - -=item Arrays now always interpolate into double-quoted strings - -=back - -=item Modules and Pragmata - -=over 4 - -=item Modules - -attributes, B, Benchmark, ByteLoader, constant, charnames, Data::Dumper, -DB, DB_File, Devel::DProf, Devel::Peek, Dumpvalue, DynaLoader, English, -Env, Fcntl, File::Compare, File::Find, File::Glob, File::Spec, -File::Spec::Functions, Getopt::Long, IO, JPL, lib, Math::BigInt, -Math::Complex, Math::Trig, Pod::Parser, Pod::InputObjects, Pod::Checker, -podchecker, Pod::ParseUtils, Pod::Find, Pod::Select, podselect, Pod::Usage, -pod2usage, Pod::Text and Pod::Man, SDBM_File, Sys::Syslog, Sys::Hostname, -Term::ANSIColor, Time::Local, Win32, XSLoader, DBM Filters - -=item Pragmata - -=back - -=item Utility Changes - -=over 4 - -=item dprofpp - -=item find2perl - -=item h2xs - -=item perlcc - -=item perldoc - -=item The Perl Debugger - -=back - -=item Improved Documentation - -perlapi.pod, perlboot.pod, perlcompile.pod, perldbmfilter.pod, -perldebug.pod, perldebguts.pod, perlfork.pod, perlfilter.pod, perlhack.pod, -perlintern.pod, perllexwarn.pod, perlnumber.pod, perlopentut.pod, -perlreftut.pod, perltootc.pod, perltodo.pod, perlunicode.pod - -=item Performance enhancements - -=over 4 - -=item Simple sort() using { $a <=> $b } and the like are optimized - -=item Optimized assignments to lexical variables - -=item Faster subroutine calls - -=item delete(), each(), values() and hash iteration are faster - -=back - -=item Installation and Configuration Improvements - -=over 4 - -=item -Dusethreads means something different - -=item New Configure flags - -=item Threadedness and 64-bitness now more daring - -=item Long Doubles - -=item -Dusemorebits - -=item -Duselargefiles - -=item installusrbinperl - -=item SOCKS support - -=item C<-A> flag - -=item Enhanced Installation Directories - -=item gcc automatically tried if 'cc' does not seem to be working - -=back - -=item Platform specific changes - -=over 4 - -=item Supported platforms - -=item DOS - -=item OS390 (OpenEdition MVS) - -=item VMS - -=item Win32 - -=back - -=item Significant bug fixes - -=over 4 - -=item on empty files - -=item C improvements - -=item All compilation errors are true errors - -=item Implicitly closed filehandles are safer - -=item Behavior of list slices is more consistent - -=item C<(\$)> prototype and C<$foo{a}> - -=item C and AUTOLOAD - -=item C<-bareword> allowed under C - -=item Failures in DESTROY() - -=item Locale bugs fixed - -=item Memory leaks - -=item Spurious subroutine stubs after failed subroutine calls - -=item Taint failures under C<-U> - -=item END blocks and the C<-c> switch - -=item Potential to leak DATA filehandles - -=back - -=item New or Changed Diagnostics - -"%s" variable %s masks earlier declaration in same %s, "my sub" not yet -implemented, "our" variable %s redeclared, '!' allowed only after types %s, -/ cannot take a count, / must be followed by a, A or Z, / must be followed -by a*, A* or Z*, / must follow a numeric type, /%s/: Unrecognized escape -\\%c passed through, /%s/: Unrecognized escape \\%c in character class -passed through, /%s/ should probably be written as "%s", %s() called too -early to check prototype, %s argument is not a HASH or ARRAY element, %s -argument is not a HASH or ARRAY element or slice, %s argument is not a -subroutine name, %s package attribute may clash with future reserved word: -%s, (in cleanup) %s, <> should be quotes, Attempt to join self, Bad evalled -substitution pattern, Bad realloc() ignored, Bareword found in conditional, -Binary number > 0b11111111111111111111111111111111 non-portable, Bit vector -size > 32 non-portable, Buffer overflow in prime_env_iter: %s, Can't check -filesystem of script "%s", Can't declare class for non-scalar %s in "%s", -Can't declare %s in "%s", Can't ignore signal CHLD, forcing to default, -Can't modify non-lvalue subroutine call, Can't read CRTL environ, Can't -remove %s: %s, skipping file, Can't return %s from lvalue subroutine, Can't -weaken a nonreference, Character class [:%s:] unknown, Character class -syntax [%s] belongs inside character classes, Constant is not %s reference, -constant(%s): %s, CORE::%s is not a keyword, defined(@array) is deprecated, -defined(%hash) is deprecated, Did not produce a valid header, (Did you mean -"local" instead of "our"?), Document contains no data, entering effective -%s failed, false [] range "%s" in regexp, Filehandle %s opened only for -output, flock() on closed filehandle %s, Global symbol "%s" requires -explicit package name, Hexadecimal number > 0xffffffff non-portable, -Ill-formed CRTL environ value "%s", Ill-formed message in prime_env_iter: -|%s|, Illegal binary digit %s, Illegal binary digit %s ignored, Illegal -number of bits in vec, Integer overflow in %s number, Invalid %s attribute: -%s, Invalid %s attributes: %s, invalid [] range "%s" in regexp, Invalid -separator character %s in attribute list, Invalid separator character %s in -subroutine attribute list, leaving effective %s failed, Lvalue subs -returning %s not implemented yet, Method %s not permitted, Missing -%sbrace%s on \N{}, Missing command in piped open, Missing name in "my sub", -No %s specified for -%c, No package name allowed for variable %s in "our", -No space allowed after -%c, no UTC offset information; assuming local time -is UTC, Octal number > 037777777777 non-portable, panic: del_backref, -panic: kid popen errno read, panic: magic_killbackrefs, Parentheses missing -around "%s" list, Possible unintended interpolation of %s in string, -Possible Y2K bug: %s, pragma "attrs" is deprecated, use "sub NAME : ATTRS" -instead, Premature end of script headers, Repeat count in pack overflows, -Repeat count in unpack overflows, realloc() of freed memory ignored, -Reference is already weak, setpgrp can't take arguments, Strange *+?{} on -zero-length expression, switching effective %s is not implemented, This -Perl can't reset CRTL environ elements (%s), This Perl can't set CRTL -environ elements (%s=%s), Too late to run %s block, Unknown open() mode -'%s', Unknown process %x sent message to prime_env_iter: %s, Unrecognized -escape \\%c passed through, Unterminated attribute parameter in attribute -list, Unterminated attribute list, Unterminated attribute parameter in -subroutine attribute list, Unterminated subroutine attribute list, Value of -CLI symbol "%s" too long, Version number must be a constant number - -=item New tests - -=item Incompatible Changes - -=over 4 - -=item Perl Source Incompatibilities - -CHECK is a new keyword, Treatment of list slices of undef has changed, -Format of $English::PERL_VERSION is different, Literals of the form -C<1.2.3> parse differently, Possibly changed pseudo-random number -generator, Hashing function for hash keys has changed, C fails on -read only values, Close-on-exec bit may be set on pipe and socket handles, -Writing C<"$$1"> to mean C<"${$}1"> is unsupported, delete(), each(), -values() and C<\(%h)>, vec(EXPR,OFFSET,BITS) enforces powers-of-two BITS, -Text of some diagnostic output has changed, C<%@> has been removed, -Parenthesized not() behaves like a list operator, Semantics of bareword -prototype C<(*)> have changed, Semantics of bit operators may have changed -on 64-bit platforms, More builtins taint their results - -=item C Source Incompatibilities - -C, C, C - -=item Compatible C Source API Changes - -C is now C - -=item Binary Incompatibilities - -=back - -=item Known Problems - -=over 4 - -=item Localizing a tied hash element may leak memory - -=item Known test failures - -64-bit builds, Failure of Thread tests, NEXTSTEP 3.3 POSIX test failure, -Tru64 (aka Digital UNIX, aka DEC OSF/1) lib/sdbm test failure with gcc - -=item EBCDIC platforms not fully supported - -=item UNICOS/mk CC failures during Configure run - -=item Arrow operator and arrays - -=item Experimental features - -Threads, Unicode, 64-bit support, Lvalue subroutines, Weak references, The -pseudo-hash data type, The Compiler suite, Internal implementation of file -globbing, The DB module, The regular expression code constructs: - -=back - -=item Obsolete Diagnostics - -Character class syntax [: :] is reserved for future extensions, Ill-formed -logical name |%s| in prime_env_iter, In string, @%s now must be written as -\@%s, Probable precedence problem on %s, regexp too big, Use of "$$" -to mean "${$}" is deprecated - -=item Reporting Bugs - -=item SEE ALSO - -=item HISTORY - -=back - -=head2 perl5005delta, perldelta - what's new for perl5.005 - -=over 4 - -=item DESCRIPTION - -=item About the new versioning system - -=item Incompatible Changes - -=over 4 - -=item WARNING: This version is not binary compatible with Perl 5.004. - -=item Default installation structure has changed - -=item Perl Source Compatibility - -=item C Source Compatibility - -=item Binary Compatibility - -=item Security fixes may affect compatibility - -=item Relaxed new mandatory warnings introduced in 5.004 - -=item Licensing - -=back - -=item Core Changes - -=over 4 - -=item Threads - -=item Compiler - -=item Regular Expressions - -Many new and improved optimizations, Many bug fixes, New regular expression -constructs, New operator for precompiled regular expressions, Other -improvements, Incompatible changes - -=item Improved malloc() - -=item Quicksort is internally implemented - -=item Reliable signals - -=item Reliable stack pointers - -=item More generous treatment of carriage returns - -=item Memory leaks - -=item Better support for multiple interpreters - -=item Behavior of local() on array and hash elements is now well-defined - -=item C<%!> is transparently tied to the L module - -=item Pseudo-hashes are supported - -=item C is supported - -=item Keywords can be globally overridden - -=item C<$^E> is meaningful on Win32 - -=item C optimized - -=item C can be used as implicitly quoted package name - -=item C tests existence of a package - -=item Better locale support - -=item Experimental support for 64-bit platforms - -=item prototype() returns useful results on builtins - -=item Extended support for exception handling - -=item Re-blessing in DESTROY() supported for chaining DESTROY() methods - -=item All C format conversions are handled internally - -=item New C keyword - -=item New C keyword - -=item New C operator - -=item C is now a reserved word - -=item Tied arrays are now fully supported - -=item Tied handles support is better - -=item 4th argument to substr - -=item Negative LENGTH argument to splice - -=item Magic lvalues are now more magical - -=item <> now reads in records - -=back - -=item Supported Platforms - -=over 4 - -=item New Platforms - -=item Changes in existing support - -=back - -=item Modules and Pragmata - -=over 4 - -=item New Modules - -B, Data::Dumper, Dumpvalue, Errno, File::Spec, ExtUtils::Installed, -ExtUtils::Packlist, Fatal, IPC::SysV, Test, Tie::Array, Tie::Handle, -Thread, attrs, fields, re - -=item Changes in existing modules - -Benchmark, Carp, CGI, Fcntl, Math::Complex, Math::Trig, POSIX, DB_File, -MakeMaker, CPAN, Cwd - -=back - -=item Utility Changes - -=item Documentation Changes - -=item New Diagnostics - -Ambiguous call resolved as CORE::%s(), qualify as such or use &, Bad index -while coercing array into hash, Bareword "%s" refers to nonexistent -package, Can't call method "%s" on an undefined value, Can't check -filesystem of script "%s" for nosuid, Can't coerce array into hash, Can't -goto subroutine from an eval-string, Can't localize pseudo-hash element, -Can't use %%! because Errno.pm is not available, Cannot find an opnumber -for "%s", Character class syntax [. .] is reserved for future extensions, -Character class syntax [: :] is reserved for future extensions, Character -class syntax [= =] is reserved for future extensions, %s: Eval-group in -insecure regular expression, %s: Eval-group not allowed, use re 'eval', %s: -Eval-group not allowed at run time, Explicit blessing to '' (assuming -package main), Illegal hex digit ignored, No such array field, No such -field "%s" in variable %s of type %s, Out of memory during ridiculously -large request, Range iterator outside integer range, Recursive inheritance -detected while looking for method '%s' %s, Reference found where even-sized -list expected, Undefined value assigned to typeglob, Use of reserved word -"%s" is deprecated, perl: warning: Setting locale failed - -=item Obsolete Diagnostics - -Can't mktemp(), Can't write to temp file for B<-e>: %s, Cannot open -temporary file, regexp too big - -=item Configuration Changes - -=item BUGS - -=item SEE ALSO - -=item HISTORY - -=back - -=head2 perl5004delta, perldelta - what's new for perl5.004 - -=over 4 - -=item DESCRIPTION - -=item Supported Environments - -=item Core Changes - -=over 4 - -=item List assignment to %ENV works - -=item Change to "Can't locate Foo.pm in @INC" error - -=item Compilation option: Binary compatibility with 5.003 - -=item $PERL5OPT environment variable - -=item Limitations on B<-M>, B<-m>, and B<-T> options - -=item More precise warnings - -=item Deprecated: Inherited C for non-methods - -=item Previously deprecated %OVERLOAD is no longer usable - -=item Subroutine arguments created only when they're modified - -=item Group vector changeable with C<$)> - -=item Fixed parsing of $$, &$, etc. - -=item Fixed localization of $, $&, etc. - -=item No resetting of $. on implicit close - -=item C may return undef - -=item C determines value of EXPR in scalar context - -=item Changes to tainting checks - -No glob() or <*>, No spawning if tainted $CDPATH, $ENV, $BASH_ENV, No -spawning if tainted $TERM doesn't look like a terminal name - -=item New Opcode module and revised Safe module - -=item Embedding improvements - -=item Internal change: FileHandle class based on IO::* classes - -=item Internal change: PerlIO abstraction interface - -=item New and changed syntax - -$coderef->(PARAMS) - -=item New and changed builtin constants - -__PACKAGE__ - -=item New and changed builtin variables - -$^E, $^H, $^M - -=item New and changed builtin functions - -delete on slices, flock, printf and sprintf, keys as an lvalue, my() in -Control Structures, pack() and unpack(), sysseek(), use VERSION, use Module -VERSION LIST, prototype(FUNCTION), srand, $_ as Default, C does not -reset search position on failure, C ignores whitespace before ?*+{}, -nested C closures work now, formats work right on changing lexicals - -=item New builtin methods - -isa(CLASS), can(METHOD), VERSION( [NEED] ) - -=item TIEHANDLE now supported - -TIEHANDLE classname, LIST, PRINT this, LIST, PRINTF this, LIST, READ this -LIST, READLINE this, GETC this, DESTROY this - -=item Malloc enhancements - --DPERL_EMERGENCY_SBRK, -DPACK_MALLOC, -DTWO_POT_OPTIMIZE - -=item Miscellaneous efficiency enhancements - -=back - -=item Support for More Operating Systems - -=over 4 - -=item Win32 - -=item Plan 9 - -=item QNX - -=item AmigaOS - -=back - -=item Pragmata - -use autouse MODULE => qw(sub1 sub2 sub3), use blib, use blib 'dir', use -constant NAME => VALUE, use locale, use ops, use vmsish - -=item Modules - -=over 4 - -=item Required Updates - -=item Installation directories - -=item Module information summary - -=item Fcntl - -=item IO - -=item Math::Complex - -=item Math::Trig - -=item DB_File - -=item Net::Ping - -=item Object-oriented overrides for builtin operators - -=back - -=item Utility Changes - -=over 4 - -=item pod2html - -Sends converted HTML to standard output - -=item xsubpp - -C XSUBs now default to returning nothing - -=back - -=item C Language API Changes - -C and C, C, Extended API for -manipulating hashes - -=item Documentation Changes - -L, L, L, L, L, -L, L, L - -=item New Diagnostics - -"my" variable %s masks earlier declaration in same scope, %s argument is -not a HASH element or slice, Allocation too large: %lx, Allocation too -large, Applying %s to %s will act on scalar(%s), Attempt to free -nonexistent shared string, Attempt to use reference as lvalue in substr, -Bareword "%s" refers to nonexistent package, Can't redefine active sort -subroutine %s, Can't use bareword ("%s") as %s ref while "strict refs" in -use, Cannot resolve method `%s' overloading `%s' in package `%s', Constant -subroutine %s redefined, Constant subroutine %s undefined, Copy method did -not return a reference, Died, Exiting pseudo-block via %s, Identifier too -long, Illegal character %s (carriage return), Illegal switch in PERL5OPT: -%s, Integer overflow in hex number, Integer overflow in octal number, -internal error: glob failed, Invalid conversion in %s: "%s", Invalid type -in pack: '%s', Invalid type in unpack: '%s', Name "%s::%s" used only once: -possible typo, Null picture in formline, Offset outside string, Out of -memory!, Out of memory during request for %s, panic: frexp, Possible -attempt to put comments in qw() list, Possible attempt to separate words -with commas, Scalar value @%s{%s} better written as $%s{%s}, Stub found -while resolving method `%s' overloading `%s' in %s, Too late for "B<-T>" -option, untie attempted while %d inner references still exist, Unrecognized -character %s, Unsupported function fork, Use of "$$" to mean -"${$}" is deprecated, Value of %s can be "0"; test with defined(), -Variable "%s" may be unavailable, Variable "%s" will not stay shared, -Warning: something's wrong, Ill-formed logical name |%s| in prime_env_iter, -Got an error from DosAllocMem, Malformed PERLLIB_PREFIX, PERL_SH_DIR too -long, Process terminated by SIG%s - -=item BUGS - -=item SEE ALSO - -=item HISTORY - -=back - -=head2 perlaix, README.aix - Perl version 5 on IBM Unix (AIX) systems - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item Compiling Perl 5 on AIX - -=item OS level - -=item Building Dynamic Extensions on AIX - -=item The IBM ANSI C Compiler - -=item Using GNU's gcc for building perl - -=item Using Large Files with Perl - -=item Threaded Perl - -=item 64-bit Perl - -=item GDBM and Threads - -=item NFS filesystems and utime(2) - -=back - -=item AUTHOR - -=item DATE - -=back - -=head2 perlamiga - Perl under Amiga OS - -=over 4 - -=item SYNOPSIS - -=back - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item Prerequisites - -B, B - -=item Starting Perl programs under AmigaOS - -=item Shortcomings of Perl under AmigaOS - -=back - -=item INSTALLATION - -=item Accessing documentation - -=over 4 - -=item Manpages - -=item B - -=item B C files - -=item C docs - -=back - -=item BUILD - -=over 4 - -=item Prerequisites - -=item Getting the perl source - -=item Making - -sh Configure -Dprefix=/ade -Dloclibpth=/ade/lib - -=item Testing - -=item Installing the built perl - -=back - -=item AUTHORS - -=item SEE ALSO - -=back - -=head2 perlbs2000, README.BS2000 - building and installing Perl for BS2000. - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=over 4 - -=item gzip - -=item bison - -=item Unpacking - -=item Compiling - -=item Testing - -=item Install - -=item Using Perl in the Posix-Shell - -=item Using Perl in "native" BS2000 - -=item Floating point anomalies - -=back - -=item AUTHORS - -=item SEE ALSO - -=over 4 - -=item Mailing list - -=back - -=item HISTORY - -=back - -=head2 perlcygwin, README.cygwin - Perl for Cygwin - -=over 4 - -=item SYNOPSIS - -=item PREREQUISITES - -=over 4 - -=item Cygwin = GNU+Cygnus+Windows (Don't leave UNIX without it) - -=item Cygwin Configuration - -C, I, Permissions - -=back - -=item CONFIGURE - -=over 4 - -=item Strip Binaries - -=item Optional Libraries - -C<-lcrypt>, C<-lgdbm> (C), C<-ldb> (C), -C<-lcygipc> (C) - -=item Configure-time Options - -C<-Uusedl>, C<-Uusemymalloc>, C<-Dusemultiplicity>, C<-Duseperlio>, -C<-Duse64bitint>, C<-Duselongdouble>, C<-Dusethreads>, C<-Duselargefiles> - -=item Suspicious Warnings - -I, Win9x and C, Compiler/Preprocessor defines - -=back - -=item MAKE - -=over 4 - -=item Warnings - -=item ld2 - -=back - -=item TEST - -=over 4 - -=item File Permissions - -=item Hard Links - -=item Filetime Granularity - -=item Tainting Checks - -=item /etc/group - -=item Script Portability - -Pathnames, Text/Binary, F<.exe>, chown(), Miscellaneous - -=back - -=item INSTALL - -=item MANIFEST - -Documentation, Build, Configure, Make, Install, Tests, Compiled Perl -Source, Compiled Module Source, Perl Modules/Scripts - -=item BUGS - -=item AUTHORS - -=item HISTORY - -=back - -=head2 perldos - Perl under DOS, W31, W95. - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=over 4 - -=item Prerequisites - -DJGPP, Pthreads - -=item Shortcomings of Perl under DOS - -=item Building - -=item Testing - -=item Installation - -=back - -=item BUILDING AND INSTALLING MODULES - -=over 4 - -=item Prerequisites - -=item Unpacking CPAN Modules - -=item Building Non-XS Modules - -=item Building XS Modules - -=back - -=item AUTHOR - -=item SEE ALSO - -=back - -=head2 perlepoc, README.epoc - Perl for EPOC - -=over 4 - -=item SYNOPSIS - -=item INTRODUCTION - -=item INSTALLING PERL ON EPOC - -=item STARTING PERL ON EPOC - -=item STOPPING PERL ON EPOC - -=item USING PERL ON EPOC - -=over 4 - -=item I/O Redirection - -=item PATH Names - -=item Editors - -=item Features - -=item Restrictions - -=item Compiling Perl 5 on the EPOC cross compiling environment - -=back - -=item SUPPORT STATUS - -=item AUTHOR - -=item LAST UPDATE - -=back - -=head2 perlhpux, README.hpux - Perl version 5 on Hewlett-Packard Unix -(HP-UX) systems - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item Compiling Perl 5 on HP-UX - -=item PA-RISC - -=item PA-RISC 1.0 - -=item PA-RISC 1.1 - -=item PA-RISC 2.0 - -=item Portability Between PA-RISC Versions - -=item Building Dynamic Extensions on HP-UX - -=item The HP ANSI C Compiler - -=item Using Large Files with Perl - -=item Threaded Perl - -=item 64-bit Perl - -=item GDBM and Threads - -=item NFS filesystems and utime(2) - -=item perl -P and // - -=back - -=item AUTHOR - -=item DATE - -=back - -=head2 perlmachten, README.machten - Perl version 5 on Power MachTen -systems - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item Compiling Perl 5 on MachTen - -=item Failures during C - -op/lexassign.t, pragma/warnings.t - -=item Building external modules - -=back - -=item AUTHOR - -=item DATE - -=back - -=head2 perlmacos, README.macos - Perl under Mac OS (Classic) - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item AUTHOR - -=item DATE - -=back - -=head2 perlmpeix, README.mpeix - Perl/iX for HP e3000 MPE - -=head1 SYNOPSIS - -=over 4 - -=item What's New - -=item System Requirements - -=item How to Obtain Perl/iX - -=item Distribution Contents Highlights - -README, public_html/feedback.cgi, 4, 6 - -=item Getting Started with Perl/iX - -=item MPE/iX Implementation Considerations - -=item Change History - -=back - -=head2 perlos2 - Perl under OS/2, DOS, Win0.3*, Win0.95 and WinNT. - -=over 4 - -=item SYNOPSIS - -=back - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item Target - -=item Other OSes - -=item Prerequisites - -EMX, RSX, HPFS, pdksh - -=item Starting Perl programs under OS/2 (and DOS and...) - -=item Starting OS/2 (and DOS) programs under Perl - -=back - -=item Frequently asked questions - -=over 4 - -=item "It does not work" - -=item I cannot run external programs - -=item I cannot embed perl into my program, or use F from my -program. - -Is your program EMX-compiled with C<-Zmt -Zcrtdll>?, Did you use -L? - -=item C<``> and pipe-C do not work under DOS. - -=item Cannot start C - -=back - -=item INSTALLATION - -=over 4 - -=item Automatic binary installation - -C, C, F - -=item Manual binary installation - -Perl VIO and PM executables (dynamically linked), Perl_ VIO executable -(statically linked), Executables for Perl utilities, Main Perl library, -Additional Perl modules, Tools to compile Perl modules, Manpages for Perl -and utilities, Manpages for Perl modules, Source for Perl documentation, -Perl manual in F<.INF> format, Pdksh - -=item B - -=back - -=item Accessing documentation - -=over 4 - -=item OS/2 F<.INF> file - -=item Plain text - -=item Manpages - -=item HTML - -=item GNU C files - -=item F<.PDF> files - -=item C docs - -=back - -=item BUILD - -=over 4 - -=item The short story - -=item Prerequisites - -=item Getting perl source - -=item Application of the patches - -=item Hand-editing - -=item Making - -=item Testing - -A lot of C, Process terminated by SIGTERM/SIGINT, F, -F - -=item Installing the built perl - -=item C-style build - -=back - -=item Build FAQ - -=over 4 - -=item Some C became C<\> in pdksh. - -=item C<'errno'> - unresolved external - -=item Problems with tr or sed - -=item Some problem (forget which ;-) - -=item Library ... not found - -=item Segfault in make - -=item op/sprintf test failure - -=back - -=item Specific (mis)features of OS/2 port - -=over 4 - -=item C, C - -=item C - -=item C on the first line - -=item Additional modules: - -=item Prebuilt methods: - -C, C, C, - C, C, -C, C, -C, C, -C, C, -C, -C, C, -OS2::SysInfo(), OS2::BootDrive(), C, -C, C, -C, C, -OS2::get_control87(), C - -=item Prebuilt variables: - -$OS2::emx_rev, $OS2::emx_env, $OS2::os_ver - -=item Misfeatures - -=item Modifications - -C, C, C, C, C, C, C, -C - -=item Identifying DLLs - -=item Centralized management of resources - -C, C - -=back - -=item Perl flavors - -=over 4 - -=item F - -=item F - -=item F - -=item F - -=item Why strange names? - -=item Why dynamic linking? - -=item Why chimera build? - -=back - -=item ENVIRONMENT - -=over 4 - -=item C - -=item C - -=item C - -=item C - -=item C - -=item C or C - -=back - -=item Evolution - -=over 4 - -=item Priorities - -=item DLL name mangling - -=item Threading - -=item Calls to external programs - -=item Memory allocation - -=item Threads - -C, F - -=back - -=back - -=over 4 - -=item AUTHOR - -=item SEE ALSO - -=back - -=head2 perlos390, README.os390 - building and installing Perl for OS/390. - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=over 4 - -=item Unpacking - -=item Setup and utilities - -=item Configure - -=item Build, test, install - -=item build anomalies - -=item testing anomalies - -=item installation anomalies - -=item Usage Hints - -=item Floating point anomalies - -=item Modules and Extensions - -=back - -=item AUTHORS - -=item SEE ALSO - -=over 4 - -=item Mailing list - -=back - -=item HISTORY - -=back - -=head2 perlsolaris, README.solaris - Perl version 5 on Solaris systems - -=over 4 - -=item DESCRIPTION - -=over 4 - -=item Solaris Version Numbers. - -=back - -=item RESOURCES - -Solaris FAQ, Precompiled Binaries, Solaris Documentation - -=item SETTING UP - -=over 4 - -=item File Extraction Problems. - -=item Compiler and Related Tools. - -=item Environment - -=back - -=item RUN CONFIGURE. - -=over 4 - -=item 64-bit Issues. - -=item Threads. - -=item Malloc Issues. - -=back - -=item MAKE PROBLEMS. - -Dynamic Loading Problems With GNU as and GNU ld, ld.so.1: ./perl: fatal: -relocation error:, dlopen: stub interception failed, #error "No -DATAMODEL_NATIVE specified", sh: ar: not found - -=item MAKE TEST - -=over 4 - -=item op/stat.t test 4 - -=back - -=item PREBUILT BINARIES. - -=item RUNTIME ISSUES. - -=over 4 - -=item Limits on Numbers of Open Files. - -=back - -=item SOLARIS-SPECIFIC MODULES. - -=item SOLARIS-SPECIFIC PROBLEMS WITH MODULES. - -=over 4 - -=item Proc::ProcessTable - -=item BSD::Resource - -=item Net::SSLeay - -=back - -=item AUTHOR - -=item LAST MODIFIED - -=back - -=head2 perlvmesa, README.vmesa - building and installing Perl for VM/ESA. - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=over 4 - -=item Unpacking - -=item Setup and utilities - -=item Configure - -Don't turn on the compiler optimization flag "-O". There's a bug in the -compiler (APAR PQ18812) that generates some bad code the optimizer is on, -As VM/ESA doesn't fully support the fork() API programs relying on this -call will not work. I've replaced fork()/exec() with spawn() and the -standalone exec() with spawn(). This has a side effect when opening unnamed -pipes in a shell script: there is no child process generated under - -=item testing anomalies - -=item Usage Hints - -When using perl on VM/ESA please keep in mind that the EBCDIC and ASCII -character sets are different. Perl builtin functions that may behave -differently under EBCDIC are mentioned in the perlport.pod document. - -=back - -=item AUTHORS - -=item SEE ALSO - -=over 4 - -=item Mailing list - -=back - -=back - -=head2 perlvms - VMS-specific documentation for Perl - -=over 4 - -=item DESCRIPTION - -=item Installation - -=item Organization of Perl Images - -=over 4 - -=item Core Images - -=item Perl Extensions - -=item Installing static extensions - -=item Installing dynamic extensions - -=back - -=item File specifications - -=over 4 - -=item Syntax - -=item Wildcard expansion - -=item Pipes - -=back - -=item PERL5LIB and PERLLIB - -=item Command line - -=over 4 - -=item I/O redirection and backgrounding - -=item Command line switches - --i, -S, -u - -=back - -=item Perl functions - -File tests, backticks, binmode FILEHANDLE, crypt PLAINTEXT, USER, dump, -exec LIST, fork, getpwent, getpwnam, getpwuid, gmtime, kill, qx//, select -(system call), stat EXPR, system LIST, time, times, unlink LIST, utime -LIST, waitpid PID,FLAGS - -=item Perl variables - -%ENV, CRTL_ENV, CLISYM_[LOCAL], Any other string, $!, $^E, $?, $^S, $| - -=item Standard modules with VMS-specific differences - -=over 4 - -=item SDBM_File - -=back - -=item Revision date - -=item AUTHOR - -=back - -=head2 perlvos, README.vos - Perl for Stratus VOS - -=over 4 - -=item SYNOPSIS - -=over 4 - -=item Stratus POSIX Support - -=back - -=item INSTALLING PERL IN VOS - -=over 4 - -=item Compiling Perl 5 on VOS - -=item Installing Perl 5 on VOS - -=back - -=item USING PERL IN VOS - -=over 4 - -=item Unimplemented Features - -=item Restrictions - -=back - -=item SUPPORT STATUS - -=item AUTHOR - -=item LAST UPDATE - -=back - -=head2 perlwin32 - Perl under Win32 - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=over 4 - -=item Setting Up - -Make, Command Shell, Borland C++, Microsoft Visual C++, Mingw32 with GCC - -=item Building - -=item Testing - -=item Installation - -=item Usage Hints - -Environment Variables, File Globbing, Using perl from the command line, -Building Extensions, Command-line Wildcard Expansion, Win32 Specific -Extensions, Running Perl Scripts, Miscellaneous Things - -=back - -=item BUGS AND CAVEATS - -=item AUTHORS - -Gary Ng E71564.1743@CompuServe.COME, Gurusamy Sarathy -Egsar@activestate.comE, Nick Ing-Simmons -Enick@ni-s.u-net.comE - -=item SEE ALSO - -=item HISTORY - -=back - -=head1 PRAGMA DOCUMENTATION - -=head2 attrs - set/get attributes of a subroutine (deprecated) - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -method, locked - -=back - -=head2 re - Perl pragma to alter regular expression behaviour - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=back - -=head2 attributes - get/set subroutine or variable attributes - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=over 4 - -=item Built-in Attributes - -locked, method, lvalue - -=item Available Subroutines - -get, reftype - -=item Package-specific Attribute Handling - -FETCH_I_ATTRIBUTES, MODIFY_I_ATTRIBUTES - -=item Syntax of Attribute Lists - -=back - -=item EXPORTS - -=over 4 - -=item Default exports - -=item Available exports - -=item Export tags defined - -=back - -=item EXAMPLES - -=item SEE ALSO - -=back - -=head2 attrs - set/get attributes of a subroutine (deprecated) - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -method, locked - -=back - -=head2 autouse - postpone load of modules until a function is used - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item WARNING - -=item AUTHOR - -=item SEE ALSO - -=back - -=head2 base - Establish IS-A relationship with base class at compile time - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item HISTORY - -=item SEE ALSO - -=back - -=head2 blib - Use MakeMaker's uninstalled version of a package - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item BUGS - -=item AUTHOR - -=back - -=head2 bytes - Perl pragma to force byte semantics rather than character -semantics - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item SEE ALSO - -=back - -=head2 charnames - define character names for C<\N{named}> string literal -escape. - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item CUSTOM TRANSLATORS - -=item BUGS - -=back - -=head2 constant - Perl pragma to declare constants - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item NOTES - -=item TECHNICAL NOTE - -=item BUGS - -=item AUTHOR - -=item COPYRIGHT - -=back - -=head2 diagnostics - Perl compiler pragma to force verbose warning -diagnostics - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=over 4 - -=item The C Pragma - -=item The I Program - -=back - -=item EXAMPLES - -=item INTERNALS - -=item BUGS - -=item AUTHOR - -=back - -=head2 fields - compile-time class fields - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -new, phash - -=item SEE ALSO - -=back - -=head2 filetest - Perl pragma to control the filetest permission operators - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=over 4 - -=item subpragma access - -=back - -=back - -=head2 integer - Perl pragma to use integer arithmetic instead of floating -point - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=back - -=head2 less - perl pragma to request less of something from the compiler - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=back - -=head2 lib - manipulate @INC at compile time - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=over 4 - -=item Adding directories to @INC - -=item Deleting directories from @INC - -=item Restoring original @INC - -=back - -=item SEE ALSO - -=item AUTHOR - -=back - -=head2 locale - Perl pragma to use and avoid POSIX locales for built-in -operations - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=back - -=head2 open - perl pragma to set default disciplines for input and output - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item UNIMPLEMENTED FUNCTIONALITY - -=item SEE ALSO - -=back - -=head2 ops - Perl pragma to restrict unsafe operations when compiling - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item SEE ALSO - -=back - -=head2 overload - Package for overloading perl operations - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=over 4 - -=item Declaration of overloaded functions - -=item Calling Conventions for Binary Operations - -FALSE, TRUE, C - -=item Calling Conventions for Unary Operations - -=item Calling Conventions for Mutators - -C<++> and C<-->, C and other assignment versions - -=item Overloadable Operations - -I, I, I, -I, I, I, I, I, I - -=item Inheritance and overloading - -Strings as values of C directive, Overloading of an operation -is inherited by derived classes - -=back - -=item SPECIAL SYMBOLS FOR C - -=over 4 - -=item Last Resort - -=item Fallback - -C, TRUE, defined, but FALSE - -=item Copy Constructor - -B - -=back - -=item MAGIC AUTOGENERATION - -I, I, -I, C, I, I, -I, I, I, I, -I - -=item Losing overloading - -=item Run-time Overloading - -=item Public functions - -overload::StrVal(arg), overload::Overloaded(arg), overload::Method(obj,op) - -=item Overloading constants - -integer, float, binary, q, qr - -=item IMPLEMENTATION - -=item Metaphor clash - -=item Cookbook - -=over 4 - -=item Two-face scalars - -=item Two-face references - -=item Symbolic calculator - -=item I symbolic calculator - -=back - -=item AUTHOR - -=item DIAGNOSTICS - -Odd number of arguments for overload::constant, `%s' is not an overloadable -type, `%s' is not a code reference - -=item BUGS - -=back - -=head2 re - Perl pragma to alter regular expression behaviour - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=back - -=head2 sigtrap - Perl pragma to enable simple signal handling - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item OPTIONS - -=over 4 - -=item SIGNAL HANDLERS - -B, B, B I - -=item SIGNAL LISTS - -B, B, B - -=item OTHER - -B, B, I, I - -=back - -=item EXAMPLES - -=back - -=head2 strict - Perl pragma to restrict unsafe constructs - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -C, C, C - -=back - -=head2 subs - Perl pragma to predeclare sub names - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=back - -=head2 utf8 - Perl pragma to enable/disable UTF-8 in source code - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item SEE ALSO - -=back - -=head2 vars - Perl pragma to predeclare global variable names (obsolete) - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=back - -=head2 warnings - Perl pragma to control optional warnings - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -use warnings::register, warnings::enabled(), warnings::enabled($category), -warnings::enabled($object), warnings::warn($message), -warnings::warn($category, $message), warnings::warn($object, $message), -warnings::warnif($message), warnings::warnif($category, $message), -warnings::warnif($object, $message) - -=back - -=head2 warnings::register - warnings import function - -=head1 MODULE DOCUMENTATION - -=head2 AnyDBM_File - provide framework for multiple DBMs - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=over 4 - -=item DBM Comparisons - -[0], [1], [2], [3] - -=back - -=item SEE ALSO - -=back - -=head2 AutoLoader - load subroutines only on demand - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=over 4 - -=item Subroutine Stubs - -=item Using B's AUTOLOAD Subroutine - -=item Overriding B's AUTOLOAD Subroutine - -=item Package Lexicals - -=item Not Using AutoLoader - -=item B vs. B - -=back - -=item CAVEATS - -=item SEE ALSO - -=back - -=head2 AutoSplit - split a package for autoloading - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -$keep, $check, $modtime - -=over 4 - -=item Multiple packages - -=back - -=item DIAGNOSTICS - -=back - -=head2 B - The Perl Compiler - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item OVERVIEW OF CLASSES - -=over 4 - -=item SV-RELATED CLASSES - -=item B::SV METHODS - -REFCNT, FLAGS - -=item B::IV METHODS - -IV, IVX, UVX, int_value, needs64bits, packiv - -=item B::NV METHODS - -NV, NVX - -=item B::RV METHODS - -RV - -=item B::PV METHODS - -PV, PVX - -=item B::PVMG METHODS - -MAGIC, SvSTASH - -=item B::MAGIC METHODS - -MOREMAGIC, PRIVATE, TYPE, FLAGS, OBJ, PTR - -=item B::PVLV METHODS - -TARGOFF, TARGLEN, TYPE, TARG - -=item B::BM METHODS - -USEFUL, PREVIOUS, RARE, TABLE - -=item B::GV METHODS - -is_empty, NAME, SAFENAME, STASH, SV, IO, FORM, AV, HV, EGV, CV, CVGEN, -LINE, FILE, FILEGV, GvREFCNT, FLAGS - -=item B::IO METHODS - -LINES, PAGE, PAGE_LEN, LINES_LEFT, TOP_NAME, TOP_GV, FMT_NAME, FMT_GV, -BOTTOM_NAME, BOTTOM_GV, SUBPROCESS, IoTYPE, IoFLAGS - -=item B::AV METHODS - -FILL, MAX, OFF, ARRAY, AvFLAGS - -=item B::CV METHODS - -STASH, START, ROOT, GV, FILE, DEPTH, PADLIST, OUTSIDE, XSUB, XSUBANY, -CvFLAGS - -=item B::HV METHODS - -FILL, MAX, KEYS, RITER, NAME, PMROOT, ARRAY - -=item OP-RELATED CLASSES - -=item B::OP METHODS - -next, sibling, name, ppaddr, desc, targ, type, seq, flags, private - -=item B::UNOP METHOD - -first - -=item B::BINOP METHOD - -last - -=item B::LOGOP METHOD - -other - -=item B::LISTOP METHOD - -children - -=item B::PMOP METHODS - -pmreplroot, pmreplstart, pmnext, pmregexp, pmflags, pmpermflags, precomp - -=item B::SVOP METHOD - -sv, gv - -=item B::PADOP METHOD - -padix - -=item B::PVOP METHOD - -pv - -=item B::LOOP METHODS - -redoop, nextop, lastop - -=item B::COP METHODS - -label, stash, file, cop_seq, arybase, line - -=back - -=item FUNCTIONS EXPORTED BY C - -main_cv, init_av, main_root, main_start, comppadlist, sv_undef, sv_yes, -sv_no, amagic_generation, walkoptree(OP, METHOD), walkoptree_debug(DEBUG), -walksymtable(SYMREF, METHOD, RECURSE), svref_2object(SV), ppname(OPNUM), -hash(STR), cast_I32(I), minus_c, cstring(STR), class(OBJ), threadsv_names - -=item AUTHOR - -=back - -=head2 B::Asmdata - Autogenerated data about Perl ops, used to generate -bytecode - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item AUTHOR - -=back - -=head2 B::Assembler - Assemble Perl bytecode - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item AUTHORS - -=back - -=head2 B::Bblock - Walk basic blocks - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item AUTHOR - -=back - -=head2 B::Bytecode - Perl compiler's bytecode backend - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item OPTIONS - -B<-ofilename>, B<-afilename>, B<-->, B<-f>, B<-fcompress-nullops>, -B<-fomit-sequence-numbers>, B<-fbypass-nullops>, B<-On>, B<-D>, B<-Do>, -B<-Db>, B<-Da>, B<-DC>, B<-S>, B<-upackage> Stores package in the -output. =back - -=item EXAMPLES - -=item BUGS - -=item AUTHORS - -=back - -=head2 B::C - Perl compiler's C backend - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item OPTIONS - -B<-ofilename>, B<-v>, B<-->, B<-uPackname>, B<-D>, B<-Do>, B<-Dc>, B<-DA>, -B<-DC>, B<-DM>, B<-f>, B<-fcog>, B<-fno-cog>, B<-On>, B<-llimit> - -=item EXAMPLES - -=item BUGS - -=item AUTHOR - -=back - -=head2 B::CC - Perl compiler's optimized C translation backend - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item OPTIONS - -B<-ofilename>, B<-v>, B<-->, B<-uPackname>, B<-mModulename>, B<-D>, B<-Dr>, -B<-DO>, B<-Ds>, B<-Dp>, B<-Dq>, B<-Dl>, B<-Dt>, B<-f>, -B<-ffreetmps-each-bblock>, B<-ffreetmps-each-loop>, B<-fomit-taint>, B<-On> - -=item EXAMPLES - -=item BUGS - -=item DIFFERENCES - -=over 4 - -=item Loops - -=item Context of ".." - -=item Arithmetic - -=item Deprecated features - -=back - -=item AUTHOR - -=back - -=head2 B::Concise - Walk Perl syntax tree, printing concise info about ops - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item OPTIONS - -B<-basic>, B<-exec>, B<-tree>, B<-compact>, B<-loose>, B<-vt>, B<-ascii>, -B<-main>, B<-base>I, B<-bigendian>, B<-littleendian>, B<-concise>, -B<-terse>, B<-linenoise>, B<-debug>, B<-env> - -=item FORMATTING SPECIFICATIONS - -B<(x(>IB<;>IB<)x)>, B<(*(>IB<)*)>, -B<(*(>IB<;>IB<)*)>, B<(?(>IB<#>IIB<)?)>, -B<#>I, B<#>II, B<~>, B<#addr>, B<#arg>, B<#class>, -B<#classym>, B<#coplabel>, B<#exname>, B<#extarg>, B<#firstaddr>, -B<#flags>, B<#flagval>, B<#hyphenseq>, B<#label>, B<#lastaddr>, B<#name>, -B<#NAME>, B<#next>, B<#nextaddr>, B<#noise>, B<#private>, B<#privval>, -B<#seq>, B<#seqnum>, B<#sibaddr>, B<#svaddr>, B<#svclass>, B<#svval>, -B<#targ>, B<#targarg>, B<#targarglife>, B<#typenum> - -=item ABBREVIATIONS - -=over 4 - -=item OP flags abbreviations - -=item OP class abbreviations - -=back - -=item AUTHOR - -=back - -=head2 B::Debug - Walk Perl syntax tree, printing debug info about ops - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item AUTHOR - -=back - -=head2 B::Deparse - Perl compiler backend to produce perl code - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item OPTIONS - -B<-l>, B<-p>, B<-q>, B<-u>I, B<-s>I, B, BI, -B, BIB<.>, B<-x>I - -=item USING B::Deparse AS A MODULE - -=over 4 - -=item Synopsis - -=item Description - -=item new - -=item coderef2text - -=back - -=item BUGS - -=item AUTHOR - -=back - -=head2 B::Disassembler - Disassemble Perl bytecode - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item AUTHOR - -=back - -=head2 B::Lint - Perl lint - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item OPTIONS AND LINT CHECKS - -B, B and B, B, -B, B, B, B, B - -=item NON LINT-CHECK OPTIONS - -B<-u Package> - -=item BUGS - -=item AUTHOR - -=back - -=head2 B::O, O - Generic interface to Perl Compiler backends - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item CONVENTIONS - -=item IMPLEMENTATION - -=item AUTHOR - -=back - -=head2 B::Showlex - Show lexical variables used in functions or files - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item AUTHOR - -=back - -=head2 B::Stackobj - Helper module for CC backend - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item AUTHOR - -=back - -=head2 B::Stash - show what stashes are loaded - -=head2 B::Terse - Walk Perl syntax tree, printing terse info about ops - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item AUTHOR - -=back - -=head2 B::Xref - Generates cross reference reports for Perl programs - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item OPTIONS - -C<-oFILENAME>, C<-r>, C<-D[tO]> - -=item BUGS - -=item AUTHOR - -=back - -=head2 Bblock, B::Bblock - Walk basic blocks - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item AUTHOR - -=back - -=head2 Benchmark - benchmark running times of Perl code - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=over 4 - -=item Methods - -new, debug, iters - -=item Standard Exports - -timeit(COUNT, CODE), timethis ( COUNT, CODE, [ TITLE, [ STYLE ]] ), -timethese ( COUNT, CODEHASHREF, [ STYLE ] ), timediff ( T1, T2 ), timestr ( -TIMEDIFF, [ STYLE, [ FORMAT ] ] ) - -=item Optional Exports - -clearcache ( COUNT ), clearallcache ( ), cmpthese ( COUT, CODEHASHREF, [ -STYLE ] ), cmpthese ( RESULTSHASHREF ), countit(TIME, CODE), disablecache ( -), enablecache ( ), timesum ( T1, T2 ) - -=back - -=item NOTES - -=item EXAMPLES - -=item INHERITANCE - -=item CAVEATS - -=item SEE ALSO - -=item AUTHORS - -=item MODIFICATION HISTORY - -=back - -=head2 ByteLoader - load byte compiled perl code - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item AUTHOR - -=item SEE ALSO - -=back - -=head2 Bytecode, B::Bytecode - Perl compiler's bytecode backend - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item OPTIONS - -B<-ofilename>, B<-afilename>, B<-->, B<-f>, B<-fcompress-nullops>, -B<-fomit-sequence-numbers>, B<-fbypass-nullops>, B<-On>, B<-D>, B<-Do>, -B<-Db>, B<-Da>, B<-DC>, B<-S>, B<-upackage> Stores package in the -output. =back - -=item EXAMPLES - -=item BUGS - -=item AUTHORS - -=back - -=head2 CGI - Simple Common Gateway Interface Class - -=over 4 - -=item SYNOPSIS - -=item ABSTRACT - -=item DESCRIPTION - -=over 4 - -=item PROGRAMMING STYLE - -=item CALLING CGI.PM ROUTINES - -=item CREATING A NEW QUERY OBJECT (OBJECT-ORIENTED STYLE): - -=item CREATING A NEW QUERY OBJECT FROM AN INPUT FILE - -=item FETCHING A LIST OF KEYWORDS FROM THE QUERY: - -=item FETCHING THE NAMES OF ALL THE PARAMETERS PASSED TO YOUR SCRIPT: - -=item FETCHING THE VALUE OR VALUES OF A SINGLE NAMED PARAMETER: - -=item SETTING THE VALUE(S) OF A NAMED PARAMETER: - -=item APPENDING ADDITIONAL VALUES TO A NAMED PARAMETER: - -=item IMPORTING ALL PARAMETERS INTO A NAMESPACE: - -=item DELETING A PARAMETER COMPLETELY: - -=item DELETING ALL PARAMETERS: - -=item DIRECT ACCESS TO THE PARAMETER LIST: - -=item FETCHING THE PARAMETER LIST AS A HASH: - -=item SAVING THE STATE OF THE SCRIPT TO A FILE: - -=item RETRIEVING CGI ERRORS - -=item USING THE FUNCTION-ORIENTED INTERFACE - -B<:cgi>, B<:form>, B<:html2>, B<:html3>, B<:netscape>, B<:html>, -B<:standard>, B<:all> - -=item PRAGMAS - --any, -compile, -nosticky, -no_xhtml, -nph, -newstyle_urls, -oldstyle_urls, --autoload, -no_debug, -debug, -private_tempfiles - -=item SPECIAL FORMS FOR IMPORTING HTML-TAG FUNCTIONS - -1. start_table() (generates a tag), 2. end_table() (generates a -
    tag), 3. start_ul() (generates a

      tag), 4. end_ul() (generates -a
    tag) - -=back - -=item GENERATING DYNAMIC DOCUMENTS - -=over 4 - -=item CREATING A STANDARD HTTP HEADER: - -=item GENERATING A REDIRECTION HEADER - -=item CREATING THE HTML DOCUMENT HEADER - -B, 4, 5, 6.. - -=item ENDING THE HTML DOCUMENT: - -=item CREATING A SELF-REFERENCING URL THAT PRESERVES STATE INFORMATION: - -=item OBTAINING THE SCRIPT'S URL - -B<-absolute>, B<-relative>, B<-full>, B<-path> (B<-path_info>), B<-query> -(B<-query_string>), B<-base> - -=item MIXING POST AND URL PARAMETERS - -=back - -=item CREATING STANDARD HTML ELEMENTS: - -=over 4 - -=item PROVIDING ARGUMENTS TO HTML SHORTCUTS - -=item THE DISTRIBUTIVE PROPERTY OF HTML SHORTCUTS - -=item HTML SHORTCUTS AND LIST INTERPOLATION - -=item NON-STANDARD HTML SHORTCUTS - -=item AUTOESCAPING HTML - -$escaped_string = escapeHTML("unescaped string");, $charset = -charset([$charset]);, $flag = autoEscape([$flag]); - -=item PRETTY-PRINTING HTML - -=back - -=item CREATING FILL-OUT FORMS: - -=over 4 - -=item CREATING AN ISINDEX TAG - -=item STARTING AND ENDING A FORM - -B, B - -=item CREATING A TEXT FIELD - -B - -=item CREATING A BIG TEXT FIELD - -=item CREATING A PASSWORD FIELD - -=item CREATING A FILE UPLOAD FIELD - -B - -=item CREATING A POPUP MENU - -=item CREATING A SCROLLING LIST - -B - -=item CREATING A GROUP OF RELATED CHECKBOXES - -B - -=item CREATING A STANDALONE CHECKBOX - -B - -=item CREATING A RADIO BUTTON GROUP - -B - -=item CREATING A SUBMIT BUTTON - -B - -=item CREATING A RESET BUTTON - -=item CREATING A DEFAULT BUTTON - -=item CREATING A HIDDEN FIELD - -B - -=item CREATING A CLICKABLE IMAGE BUTTON - -B - -=item CREATING A JAVASCRIPT ACTION BUTTON - -=back - -=item HTTP COOKIES - -1. an expiration time, 2. a domain, 3. a path, 4. a "secure" flag, -B<-name>, B<-value>, B<-path>, B<-domain>, B<-expires>, B<-secure> - -=item WORKING WITH FRAMES - -1. Create a document, 2. Specify the destination for the -document in the HTTP header, 3. Specify the destination for the document in -the
    tag - -=item LIMITED SUPPORT FOR CASCADING STYLE SHEETS - -=item DEBUGGING - -=over 4 - -=item DUMPING OUT ALL THE NAME/VALUE PAIRS - -=back - -=item FETCHING ENVIRONMENT VARIABLES - -B, B, B, B, -B, B, B, B, -B, B, B, B, -B, B, B, -B, B, B, B - -=item USING NPH SCRIPTS - -In the B statement, By calling the B method:, By using B<-nph> -parameters - -=item Server Push - -multipart_init(), multipart_start(), multipart_end(), multipart_final() - -=item Avoiding Denial of Service Attacks - -B<$CGI::POST_MAX>, B<$CGI::DISABLE_UPLOADS>, B<1. On a script-by-script -basis>, B<2. Globally for all scripts> - -=item COMPATIBILITY WITH CGI-LIB.PL - -=item AUTHOR INFORMATION - -=item CREDITS - -Matt Heffron (heffron@falstaff.css.beckman.com), James Taylor -(james.taylor@srs.gov), Scott Anguish , Mike Jewell -(mlj3u@virginia.edu), Timothy Shimmin (tes@kbs.citri.edu.au), Joergen Haegg -(jh@axis.se), Laurent Delfosse (delfosse@delfosse.com), Richard Resnick -(applepi1@aol.com), Craig Bishop (csb@barwonwater.vic.gov.au), Tony Curtis -(tc@vcpc.univie.ac.at), Tim Bunce (Tim.Bunce@ig.co.uk), Tom Christiansen -(tchrist@convex.com), Andreas Koenig (k@franz.ww.TU-Berlin.DE), Tim -MacKenzie (Tim.MacKenzie@fulcrum.com.au), Kevin B. Hendricks -(kbhend@dogwood.tyler.wm.edu), Stephen Dahmen (joyfire@inxpress.net), Ed -Jordan (ed@fidalgo.net), David Alan Pisoni (david@cnation.com), Doug -MacEachern (dougm@opengroup.org), Robin Houston (robin@oneworld.org), -...and many many more.. - -=item A COMPLETE EXAMPLE OF A SIMPLE FORM-BASED SCRIPT - -=item BUGS - -=item SEE ALSO - -=back - -=head2 CGI::Apache - Backward compatibility module for CGI.pm - -=over 4 - -=item SYNOPSIS - -=item ABSTRACT - -=item DESCRIPTION - -=item AUTHOR INFORMATION - -=item BUGS - -=item SEE ALSO - -=back - -=head2 CGI::Carp, B - CGI routines for writing to the HTTPD (or -other) error log - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item REDIRECTING ERROR MESSAGES - -=item MAKING PERL ERRORS APPEAR IN THE BROWSER WINDOW - -=over 4 - -=item Changing the default message - -=back - -=item MAKING WARNINGS APPEAR AS HTML COMMENTS - -=item CHANGE LOG - -=item AUTHORS - -=item SEE ALSO - -=back - -=head2 CGI::Cookie - Interface to Netscape Cookies - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item USING CGI::Cookie - -B<1. expiration date>, B<2. domain>, B<3. path>, B<4. secure flag> - -=over 4 - -=item Creating New Cookies - -=item Sending the Cookie to the Browser - -=item Recovering Previous Cookies - -=item Manipulating Cookies - -B, B, B, B, B - -=back - -=item AUTHOR INFORMATION - -=item BUGS - -=item SEE ALSO - -=back - -=head2 CGI::Fast - CGI Interface for Fast CGI - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item OTHER PIECES OF THE PUZZLE - -=item WRITING FASTCGI PERL SCRIPTS - -=item INSTALLING FASTCGI SCRIPTS - -=item USING FASTCGI SCRIPTS AS CGI SCRIPTS - -=item CAVEATS - -=item AUTHOR INFORMATION - -=item BUGS - -=item SEE ALSO - -=back - -=head2 CGI::Pretty - module to produce nicely formatted HTML code - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=over 4 - -=item Tags that won't be formatted - -=item Customizing the Indenting - -=back - -=item BUGS - -=item AUTHOR - -=item SEE ALSO - -=back - -=head2 CGI::Push - Simple Interface to Server Push - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item USING CGI::Push - --next_page, -last_page, -type, -delay, -cookie, -target, -expires, -nph - -=over 4 - -=item Heterogeneous Pages - -=item Changing the Page Delay on the Fly - -=back - -=item INSTALLING CGI::Push SCRIPTS - -=item AUTHOR INFORMATION - -=item BUGS - -=item SEE ALSO - -=back - -=head2 CGI::Switch - Backward compatibility module for defunct CGI::Switch - -=over 4 - -=item SYNOPSIS - -=item ABSTRACT - -=item DESCRIPTION - -=item AUTHOR INFORMATION - -=item BUGS - -=item SEE ALSO - -=back - -=head2 CGI::Util - Internal utilities used by CGI module - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item AUTHOR INFORMATION - -=item SEE ALSO - -=back - -=head2 CPAN - query, download and build perl modules from CPAN sites - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=over 4 - -=item Interactive Mode - -Searching for authors, bundles, distribution files and modules, make, test, -install, clean modules or distributions, get, readme, look module or -distribution, ls author, Signals - -=item CPAN::Shell - -=item autobundle - -=item recompile - -=item The four C Classes: Author, Bundle, Module, Distribution - -=item Programmer's interface - -expand($type,@things), expandany(@things), Programming Examples - -=item Methods in the other Classes - -CPAN::Author::as_glimpse(), CPAN::Author::as_string(), -CPAN::Author::email(), CPAN::Author::fullname(), CPAN::Author::name(), -CPAN::Bundle::as_glimpse(), CPAN::Bundle::as_string(), -CPAN::Bundle::clean(), CPAN::Bundle::contains(), -CPAN::Bundle::force($method,@args), CPAN::Bundle::get(), -CPAN::Bundle::inst_file(), CPAN::Bundle::inst_version(), -CPAN::Bundle::uptodate(), CPAN::Bundle::install(), CPAN::Bundle::make(), -CPAN::Bundle::readme(), CPAN::Bundle::test(), -CPAN::Distribution::as_glimpse(), CPAN::Distribution::as_string(), -CPAN::Distribution::clean(), CPAN::Distribution::containsmods(), -CPAN::Distribution::cvs_import(), CPAN::Distribution::dir(), -CPAN::Distribution::force($method,@args), CPAN::Distribution::get(), -CPAN::Distribution::install(), CPAN::Distribution::isa_perl(), -CPAN::Distribution::look(), CPAN::Distribution::make(), -CPAN::Distribution::prereq_pm(), CPAN::Distribution::readme(), -CPAN::Distribution::test(), CPAN::Distribution::uptodate(), -CPAN::Index::force_reload(), CPAN::Index::reload(), CPAN::InfoObj::dump(), -CPAN::Module::as_glimpse(), CPAN::Module::as_string(), -CPAN::Module::clean(), CPAN::Module::cpan_file(), -CPAN::Module::cpan_version(), CPAN::Module::cvs_import(), -CPAN::Module::description(), CPAN::Module::force($method,@args), -CPAN::Module::get(), CPAN::Module::inst_file(), -CPAN::Module::inst_version(), CPAN::Module::install(), -CPAN::Module::look(), CPAN::Module::make(), -CPAN::Module::manpage_headline(), CPAN::Module::readme(), -CPAN::Module::test(), CPAN::Module::uptodate(), CPAN::Module::userid() - -=item Cache Manager - -=item Bundles - -=item Prerequisites - -=item Finding packages and VERSION - -=item Debugging - -=item Floppy, Zip, Offline Mode - -=back - -=item CONFIGURATION - -Cscalar optionE>, Cscalar optionE -EvalueE>, Clist optionE>, Clist -optionE [shift|pop]>, Clist optionE -[unshift|push|splice] ElistE> - -=over 4 - -=item Note on urllist parameter's format - -=item urllist parameter has CD-ROM support - -=back - -=item SECURITY - -=item EXPORT - -=item POPULATE AN INSTALLATION WITH LOTS OF MODULES - -=item WORKING WITH CPAN.pm BEHIND FIREWALLS - -=over 4 - -=item Three basic types of firewalls - -http firewall, ftp firewall, One way visibility, SOCKS, IP Masquerade - -=item Configuring lynx or ncftp for going through a firewall - -=back - -=item FAQ - -1), 2), 3), 4), 5), 6), 7), 8), 9), 10) - -=item BUGS - -=item AUTHOR - -=item TRANSLATIONS - -=item SEE ALSO - -=back - -=head2 CPAN::FirstTime - Utility for CPAN::Config file Initialization - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=back - -=head2 CPANox, CPAN::Nox - Wrapper around CPAN.pm without using any XS -module - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item SEE ALSO - -=back - -=head2 Carp, carp - warn of errors (from perspective of caller) - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=over 4 - -=item Forcing a Stack Trace - -=back - -=item BUGS - -=back - -=head2 Carp::Heavy - Carp guts - -=over 4 - -=item SYNOPIS - -=item DESCRIPTION - -=back - -=head2 Class::Struct - declare struct-like datatypes as Perl classes - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=over 4 - -=item The C function - -=item Class Creation at Compile Time - -=item Element Types and Accessor Methods - -Scalar (C<'$'> or C<'*$'>), Array (C<'@'> or C<'*@'>), Hash (C<'%'> or -C<'*%'>), Class (C<'Class_Name'> or C<'*Class_Name'>) - -=item Initializing with C - -=back - -=item EXAMPLES - -Example 1, Example 2, Example 3 - -=item Author and Modification History - -=back - -=head2 Config - access Perl configuration information - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -myconfig(), config_sh(), config_vars(@names) - -=item EXAMPLE - -=item WARNING - -=item GLOSSARY - -=over 4 - -=item _ - -C<_a>, C<_exe>, C<_o> - -=item a - -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C - -=item b - -C, C, C, C, C, C, -C, C - -=item c - -C, C, C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, C, -C, C, C - -=item C - -C, C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C - -=item d - -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, -C, C, C, C, -C, C, C, C, -C, C, C, C, -C, C, C, C, C, -C, C, C, C, -C, C, C, C, -C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, -C, C, C, C, C, -C, C, C, C, -C, C, C, -C, C, C, C, C, -C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, -C, C, C, C, C, -C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, -C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, -C, C, C, C, -C, C, C, C, -C, C, -C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, -C, C, C, C, C - -=item e - -C, C, C, C, C, C, -C, C, C - -=item f - -C, C, C, C, C, -C, C, C, C, C, C - -=item g - -C, C, C, C, C, -C, C, C, C, C, C - -=item h - -C, C, C, C - -=item i - -C, C, C, C, C, C, -C, C, C, C, C, C, -C, C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, C, -C, C, C, C, -C, C, C, C, -C, C, C, C, -C, C, C, C, -C, C, C, C, -C, C, C, -C, C, C, C, C, -C - -=item k - -C, C - -=item l - -C, C, C, C, C, -C, C, C, C, C, C, C, -C, C, C, C, -C, C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C - -=item m - -C, C, C, C, C, C, -C, C, C, C, C, -C, C - -=item M - -C, C, C, C, C, C, -C, C, C, C, C, C - -=item n - -C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C - -=item o - -C, C, C, C, -C, C, C, C - -=item p - -C, C, C, C, C, C, -C - -=item P - -C, C, C, C, -C, C, C, C, C, C, -C, C, C, C, C, C, -C, C, C - -=item q - -C, C - -=item r - -C, C, C, C, C, -C, C, C, C - -=item s - -C, C, C, C, C, -C, C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, -C, C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, -C, C, C, C, C - -=item t - -C, C, C, C, C, C, C, -C, C, C, C - -=item u - -C, C, C, C, C, C, -C, C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, -C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, -C, C, C, C, C, C, -C, C - -=item v - -C, C, C, C, -C, C, C, C, -C, C, C, C, C - -=item x - -C, C - -=item z - -C, C - -=back - -=item NOTE - -=back - -=head2 Cwd - get pathname of current working directory - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=back - -=head2 DB - programmatic interface to the Perl debugging API (draft, -subject to -change) - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=over 4 - -=item Global Variables - - $DB::sub, %DB::sub, $DB::single, $DB::signal, $DB::trace, @DB::args, -@DB::dbline, %DB::dbline, $DB::package, $DB::filename, $DB::subname, -$DB::lineno - -=item API Methods - -CLIENT->register(), CLIENT->evalcode(STRING), CLIENT->skippkg('D::hide'), -CLIENT->run(), CLIENT->step(), CLIENT->next(), CLIENT->done() - -=item Client Callback Methods - -CLIENT->init(), CLIENT->prestop([STRING]), CLIENT->stop(), CLIENT->idle(), -CLIENT->poststop([STRING]), CLIENT->evalcode(STRING), CLIENT->cleanup(), -CLIENT->output(LIST) - -=back - -=item BUGS - -=item AUTHOR - -=back - -=head2 DB_File - Perl5 access to Berkeley DB version 1.x - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -B, B, B - -=over 4 - -=item Using DB_File with Berkeley DB version 2 or 3 - -=item Interface to Berkeley DB - -=item Opening a Berkeley DB Database File - -=item Default Parameters - -=item In Memory Databases - -=back - -=item DB_HASH - -=over 4 - -=item A Simple Example - -=back - -=item DB_BTREE - -=over 4 - -=item Changing the BTREE sort order - -=item Handling Duplicate Keys - -=item The get_dup() Method - -=item The find_dup() Method - -=item The del_dup() Method - -=item Matching Partial Keys - -=back - -=item DB_RECNO - -=over 4 - -=item The 'bval' Option - -=item A Simple Example - -=item Extra RECNO Methods - -B<$X-Epush(list) ;>, B<$value = $X-Epop ;>, B<$X-Eshift>, -B<$X-Eunshift(list) ;>, B<$X-Elength> - -=item Another Example - -=back - -=item THE API INTERFACE - -B<$status = $X-Eget($key, $value [, $flags]) ;>, B<$status = -$X-Eput($key, $value [, $flags]) ;>, B<$status = $X-Edel($key [, -$flags]) ;>, B<$status = $X-Efd ;>, B<$status = $X-Eseq($key, -$value, $flags) ;>, B<$status = $X-Esync([$flags]) ;> - -=item DBM FILTERS - -B, B, B, -B - -=over 4 - -=item The Filter - -=item An Example -- the NULL termination problem. - -=item Another Example -- Key is a C int. - -=back - -=item HINTS AND TIPS - -=over 4 - -=item Locking: The Trouble with fd - -=item Safe ways to lock a database - -B, B, B - -=item Sharing Databases With C Applications - -=item The untie() Gotcha - -=back - -=item COMMON QUESTIONS - -=over 4 - -=item Why is there Perl source in my database? - -=item How do I store complex data structures with DB_File? - -=item What does "Invalid Argument" mean? - -=item What does "Bareword 'DB_File' not allowed" mean? - -=back - -=item REFERENCES - -=item HISTORY - -=item BUGS - -=item AVAILABILITY - -=item COPYRIGHT - -=item SEE ALSO - -=item AUTHOR - -=back - -=head2 Data::Dumper - stringified perl data structures, suitable for both -printing and C - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=over 4 - -=item Methods - -I->new(I, I), I<$OBJ>->Dump I -I->Dump(I, I), I<$OBJ>->Seen(I<[HASHREF]>), -I<$OBJ>->Values(I<[ARRAYREF]>), I<$OBJ>->Names(I<[ARRAYREF]>), -I<$OBJ>->Reset - -=item Functions - -Dumper(I) - -=item Configuration Variables or Methods - -$Data::Dumper::Indent I I<$OBJ>->Indent(I<[NEWVAL]>), -$Data::Dumper::Purity I I<$OBJ>->Purity(I<[NEWVAL]>), -$Data::Dumper::Pad I I<$OBJ>->Pad(I<[NEWVAL]>), -$Data::Dumper::Varname I I<$OBJ>->Varname(I<[NEWVAL]>), -$Data::Dumper::Useqq I I<$OBJ>->Useqq(I<[NEWVAL]>), -$Data::Dumper::Terse I I<$OBJ>->Terse(I<[NEWVAL]>), -$Data::Dumper::Freezer I $I->Freezer(I<[NEWVAL]>), -$Data::Dumper::Toaster I $I->Toaster(I<[NEWVAL]>), -$Data::Dumper::Deepcopy I $I->Deepcopy(I<[NEWVAL]>), -$Data::Dumper::Quotekeys I $I->Quotekeys(I<[NEWVAL]>), -$Data::Dumper::Bless I $I->Bless(I<[NEWVAL]>), -$Data::Dumper::Maxdepth I $I->Maxdepth(I<[NEWVAL]>) - -=item Exports - -Dumper - -=back - -=item EXAMPLES - -=item BUGS - -=item AUTHOR - -=item VERSION - -=item SEE ALSO - -=back - -=head2 Devel::DProf - a Perl code profiler - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item PROFILE FORMAT - -=item AUTOLOAD - -=item ENVIRONMENT - -=item BUGS - -=item SEE ALSO - -=back - -=head2 Devel::Peek - A data debugging tool for the XS programmer - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=over 4 - -=item Memory footprint debugging - -=back - -=item EXAMPLES - -=over 4 - -=item A simple scalar string - -=item A simple scalar number - -=item A simple scalar with an extra reference - -=item A reference to a simple scalar - -=item A reference to an array - -=item A reference to a hash - -=item Dumping a large array or hash - -=item A reference to an SV which holds a C pointer - -=item A reference to a subroutine - -=back - -=item EXPORTS - -=item BUGS - -=item AUTHOR - -=item SEE ALSO - -=back - -=head2 Devel::SelfStubber - generate stubs for a SelfLoading module - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=back - -=head2 DirHandle - supply object methods for directory handles - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=back - -=head2 Dumpvalue - provides screen dump of Perl data. - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=over 4 - -=item Creation - -C, C, C, C, C, -C, C, C, C, C, -C, C, unctrl, subdump, bareStringify, quoteHighBit, -stopDbSignal - -=item Methods - -dumpValue, dumpValues, dumpvars, set_quote, set_unctrl, compactDump, -veryCompact, set, get - -=back - -=back - -=head2 DynaLoader - Dynamically load C libraries into Perl code - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -@dl_library_path, @dl_resolve_using, @dl_require_symbols, @dl_librefs, -@dl_modules, dl_error(), $dl_debug, dl_findfile(), dl_expandspec(), -dl_load_file(), dl_unload_file(), dl_loadflags(), dl_find_symbol(), -dl_find_symbol_anywhere(), dl_undef_symbols(), dl_install_xsub(), -bootstrap() - -=item AUTHOR - -=back - -=head2 DynaLoader::XSLoader, XSLoader - Dynamically load C libraries into -Perl code - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item AUTHOR - -=back - -=head2 English - use nice English (or awk) names for ugly punctuation -variables - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item BUGS - -=back - -=head2 Env - perl module that imports environment variables as scalars or -arrays - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item LIMITATIONS - -=item AUTHOR - -=back - -=head2 Errno - System errno constants - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item CAVEATS - -=item AUTHOR - -=item COPYRIGHT - -=back - -=head2 Exporter - Implements default import method for modules - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=over 4 - -=item How to Export - -=item Selecting What To Export - -=item Specialised Import Lists - -=item Exporting without using Export's import method - -=item Module Version Checking - -=item Managing Unknown Symbols - -=item Tag Handling Utility Functions - -=back - -=back - -=head2 Exporter::Heavy - Exporter guts - -=over 4 - -=item SYNOPIS - -=item DESCRIPTION - -=back - -=head2 ExtUtils::Command - utilities to replace common UNIX commands in -Makefiles etc. - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=back - -cat - -eqtime src dst - -rm_f files... - -rm_f files... - -touch files .. - -mv source... destination - -cp source... destination - -chmod mode files.. - -mkpath directory.. - -test_f file - -=over 4 - -=item BUGS - -=item SEE ALSO - -=item AUTHOR - -=back - -=head2 ExtUtils::Embed - Utilities for embedding Perl in C/C++ applications - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item @EXPORT - -=item FUNCTIONS - -xsinit(), Examples, ldopts(), Examples, perl_inc(), ccflags(), ccdlflags(), -ccopts(), xsi_header(), xsi_protos(@modules), xsi_body(@modules) - -=item EXAMPLES - -=item SEE ALSO - -=item AUTHOR - -=back - -=head2 ExtUtils::Install - install files from here to there - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=back - -=head2 ExtUtils::Installed - Inventory management of installed modules - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item USAGE - -=item FUNCTIONS - -new(), modules(), files(), directories(), directory_tree(), validate(), -packlist(), version() - -=item EXAMPLE - -=item AUTHOR - -=back - -=head2 ExtUtils::Liblist - determine libraries to use and how to use them - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -For static extensions, For dynamic extensions, For dynamic extensions - -=over 4 - -=item EXTRALIBS - -=item LDLOADLIBS and LD_RUN_PATH - -=item BSLOADLIBS - -=back - -=item PORTABILITY - -=over 4 - -=item VMS implementation - -=item Win32 implementation - -=back - -=item SEE ALSO - -=back - -=head2 ExtUtils::MM_Cygwin - methods to override UN*X behaviour in -ExtUtils::MakeMaker - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -canonpath, cflags, manifypods, perl_archive - -=back - -perl_archive_after - -=head2 ExtUtils::MM_OS2 - methods to override UN*X behaviour in -ExtUtils::MakeMaker - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=back - -=head2 ExtUtils::MM_Unix - methods used by ExtUtils::MakeMaker - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item METHODS - -=over 4 - -=item Preloaded methods - -canonpath - -=back - -=back - -catdir - -catfile - -curdir - -rootdir - -updir - -=over 4 - -=item SelfLoaded methods - -c_o (o) - -=back - -cflags (o) - -clean (o) - -const_cccmd (o) - -const_config (o) - -const_loadlibs (o) - -constants (o) - -depend (o) - -dir_target (o) - -dist (o) - -dist_basics (o) - -dist_ci (o) - -dist_core (o) - -dist_dir (o) - -dist_test (o) - -dlsyms (o) - -dynamic (o) - -dynamic_bs (o) - -dynamic_lib (o) - -exescan - -extliblist - -file_name_is_absolute - -find_perl - -=over 4 - -=item Methods to actually produce chunks of text for the Makefile - -fixin - -=back - -force (o) - -guess_name - -has_link_code - -htmlifypods (o) - -init_dirscan - -init_main - -init_others - -install (o) - -installbin (o) - -libscan (o) - -linkext (o) - -lsdir - -macro (o) - -makeaperl (o) - -makefile (o) - -manifypods (o) - -maybe_command - -maybe_command_in_dirs - -needs_linking (o) - -nicetext - -parse_version - -parse_abstract - -pasthru (o) - -path - -perl_script - -perldepend (o) - -ppd - -perm_rw (o) - -perm_rwx (o) - -pm_to_blib - -post_constants (o) - -post_initialize (o) - -postamble (o) - -prefixify - -processPL (o) - -realclean (o) - -replace_manpage_separator - -static (o) - -static_lib (o) - -staticmake (o) - -subdir_x (o) - -subdirs (o) - -test (o) - -test_via_harness (o) - -test_via_script (o) - -tool_autosplit (o) - -tools_other (o) - -tool_xsubpp (o) - -top_targets (o) - -writedoc - -xs_c (o) - -xs_cpp (o) - -xs_o (o) - -perl_archive - -perl_archive_after - -export_list - -=over 4 - -=item SEE ALSO - -=back - -=head2 ExtUtils::MM_VMS - methods to override UN*X behaviour in -ExtUtils::MakeMaker - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=over 4 - -=item Methods always loaded - -wraplist - -=back - -=back - -rootdir (override) - -=over 4 - -=item SelfLoaded methods - -guess_name (override) - -=back - -find_perl (override) - -path (override) - -maybe_command (override) - -maybe_command_in_dirs (override) - -perl_script (override) - -file_name_is_absolute (override) - -replace_manpage_separator - -init_others (override) - -constants (override) - -cflags (override) - -const_cccmd (override) - -pm_to_blib (override) - -tool_autosplit (override) - -tool_sxubpp (override) - -xsubpp_version (override) - -tools_other (override) - -dist (override) - -c_o (override) - -xs_c (override) - -xs_o (override) - -top_targets (override) - -dlsyms (override) - -dynamic_lib (override) - -dynamic_bs (override) - -static_lib (override) - -manifypods (override) - -processPL (override) - -installbin (override) - -subdir_x (override) - -clean (override) - -realclean (override) - -dist_basics (override) - -dist_core (override) - -dist_dir (override) - -dist_test (override) - -install (override) - -perldepend (override) - -makefile (override) - -test (override) - -test_via_harness (override) - -test_via_script (override) - -makeaperl (override) - -nicetext (override) - -=head2 ExtUtils::MM_Win32 - methods to override UN*X behaviour in -ExtUtils::MakeMaker - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=back - -catfile - -constants (o) - -static_lib (o) - -dynamic_bs (o) - -dynamic_lib (o) - -canonpath - -perl_script - -pm_to_blib - -test_via_harness (o) - -tool_autosplit (override) - -tools_other (o) - -xs_o (o) - -top_targets (o) - -htmlifypods (o) - -manifypods (o) - -dist_ci (o) - -dist_core (o) - -pasthru (o) - -=head2 ExtUtils::MakeMaker - create an extension Makefile - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=over 4 - -=item How To Write A Makefile.PL - -=item Default Makefile Behaviour - -=item make test - -=item make testdb - -=item make install - -=item PREFIX and LIB attribute - -=item AFS users - -=item Static Linking of a new Perl Binary - -=item Determination of Perl Library and Installation Locations - -=item Which architecture dependent directory? - -=item Using Attributes and Parameters - -ABSTRACT, ABSTRACT_FROM, AUTHOR, BINARY_LOCATION, C, CAPI, CCFLAGS, CONFIG, -CONFIGURE, DEFINE, DIR, DISTNAME, DL_FUNCS, DL_VARS, EXCLUDE_EXT, -EXE_FILES, FIRST_MAKEFILE, FULLPERL, FUNCLIST, H, HTMLLIBPODS, -HTMLSCRIPTPODS, IMPORTS, INC, INCLUDE_EXT, INSTALLARCHLIB, INSTALLBIN, -INSTALLDIRS, INSTALLHTMLPRIVLIBDIR, INSTALLHTMLSCRIPTDIR, -INSTALLHTMLSITELIBDIR, INSTALLMAN1DIR, INSTALLMAN3DIR, INSTALLPRIVLIB, -INSTALLSCRIPT, INSTALLSITEARCH, INSTALLSITELIB, INST_ARCHLIB, INST_BIN, -INST_EXE, INST_HTMLLIBDIR, INST_HTMLSCRIPTDIR, INST_LIB, INST_MAN1DIR, -INST_MAN3DIR, INST_SCRIPT, LDFROM, LIB, LIBPERL_A, LIBS, LINKTYPE, -MAKEAPERL, MAKEFILE, MAN1PODS, MAN3PODS, MAP_TARGET, MYEXTLIB, NAME, -NEEDS_LINKING, NOECHO, NORECURS, NO_VC, OBJECT, OPTIMIZE, PERL, PERLMAINCC, -PERL_ARCHLIB, PERL_LIB, PERL_MALLOC_OK, PERL_SRC, PERM_RW, PERM_RWX, -PL_FILES, PM, PMLIBDIRS, PM_FILTER, POLLUTE, PPM_INSTALL_EXEC, -PPM_INSTALL_SCRIPT, PREFIX, PREREQ_PM, SKIP, TYPEMAPS, VERSION, -VERSION_FROM, XS, XSOPT, XSPROTOARG, XS_VERSION - -=item Additional lowercase attributes - -clean, depend, dist, dynamic_lib, linkext, macro, realclean, test, -tool_autosplit - -=item Overriding MakeMaker Methods - -=item Hintsfile support - -=item Distribution Support - - make distcheck, make skipcheck, make distclean, make manifest, - make distdir, make tardist, make dist, make uutardist, make -shdist, make zipdist, make ci - -=item Disabling an extension - -=back - -=item ENVIRONMENT - -PERL_MM_OPT - -=item SEE ALSO - -=item AUTHORS - -=back - -=head2 ExtUtils::Manifest - utilities to write and check a MANIFEST file - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item MANIFEST.SKIP - -=item EXPORT_OK - -=item GLOBAL VARIABLES - -=item DIAGNOSTICS - -C I, C I, C I<$!>, -C I - -=item SEE ALSO - -=item AUTHOR - -=back - -=head2 ExtUtils::Miniperl, writemain - write the C code for perlmain.c - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item SEE ALSO - -=back - -=head2 ExtUtils::Mkbootstrap - make a bootstrap file for use by DynaLoader - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=back - -=head2 ExtUtils::Mksymlists - write linker options files for dynamic -extension - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -DLBASE, DL_FUNCS, DL_VARS, FILE, FUNCLIST, IMPORTS, NAME - -=item AUTHOR - -=item REVISION - -=back - -=head2 ExtUtils::Packlist - manage .packlist files - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item USAGE - -=item FUNCTIONS - -new(), read(), write(), validate(), packlist_file() - -=item EXAMPLE - -=item AUTHOR - -=back - -=head2 ExtUtils::testlib - add blib/* directories to @INC - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=back - -=head2 Fatal - replace functions with equivalents which succeed or die - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item AUTHOR - -=back - -=head2 Fcntl - load the C Fcntl.h defines - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item NOTE - -=item EXPORTED SYMBOLS - -=back - -=head2 File::Basename, fileparse - split a pathname into pieces - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -fileparse_set_fstype, fileparse - -=item EXAMPLES - -C, C - -=back - -=head2 File::CheckTree, validate - run many filetest checks on a tree - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=back - -=head2 File::Compare - Compare files or filehandles - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item RETURN - -=item AUTHOR - -=back - -=head2 File::Copy - Copy files or filehandles - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=over 4 - -=item Special behaviour if C is defined (OS/2, VMS and Win32) - -rmscopy($from,$to[,$date_flag]) - -=back - -=item RETURN - -=item AUTHOR - -=back - -=head2 File::DosGlob - DOS like globbing and then some - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item EXPORTS (by request only) - -=item BUGS - -=item AUTHOR - -=item HISTORY - -=item SEE ALSO - -=back - -=head2 File::Find, find - traverse a file tree - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -C, C, C, C, C, -C, C, C, C, -C, C - -=item CAVEAT - -=back - -=head2 File::Glob - Perl extension for BSD glob routine - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -C, C, C, C, C, -C, C, C, C, C, -C - -=item DIAGNOSTICS - -C, C - -=item NOTES - -=item AUTHOR - -=back - -=head2 File::Path - create or remove directory trees - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item AUTHORS - -=back - -=head2 File::Spec - portably perform operations on file names - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item SEE ALSO - -=item AUTHORS - -=back - -=head2 File::Spec::Epoc - methods for Epoc file specs - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -devnull - -=back - -tmpdir - -path - -canonpath - -splitpath - -splitdir - -catpath - -abs2rel - -rel2abs - -=over 4 - -=item SEE ALSO - -=back - -=head2 File::Spec::Functions - portably perform operations on file names - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=over 4 - -=item Exports - -=back - -=item SEE ALSO - -=back - -=head2 File::Spec::Mac - File::Spec for MacOS - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item METHODS - -canonpath - -=back - -catdir - -catfile - -curdir - -devnull - -rootdir - -tmpdir - -updir - -file_name_is_absolute - -path - -splitpath - -splitdir - -catpath - -abs2rel - -rel2abs - -=over 4 - -=item SEE ALSO - -=back - -=head2 File::Spec::OS2 - methods for OS/2 file specs - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=back - -=head2 File::Spec::Unix - methods used by File::Spec - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item METHODS - -canonpath - -=back - -catdir - -catfile - -curdir - -devnull - -rootdir - -tmpdir - -updir - -no_upwards - -case_tolerant - -file_name_is_absolute - -path - -join - -splitpath - -splitdir - -catpath - -abs2rel - -rel2abs - -=over 4 - -=item SEE ALSO - -=back - -=head2 File::Spec::VMS - methods for VMS file specs - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -eliminate_macros - -=back - -fixpath - -=over 4 - -=item Methods always loaded - -canonpath (override) - -=back - -catdir - -catfile - -curdir (override) - -devnull (override) - -rootdir (override) - -tmpdir (override) - -updir (override) - -case_tolerant (override) - -path (override) - -file_name_is_absolute (override) - -splitpath (override) - -splitdir (override) - -catpath (override) - -abs2rel (override) - -rel2abs (override) - -=over 4 - -=item SEE ALSO - -=back - -=head2 File::Spec::Win32 - methods for Win32 file specs - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -devnull - -=back - -tmpdir - -catfile - -canonpath - -splitpath - -splitdir - -catpath - -=over 4 - -=item SEE ALSO - -=back - -=head2 File::Temp - return name and handle of a temporary file safely - -=over 4 - -=item PORTABILITY - -=item SYNOPSIS - -=item DESCRIPTION - -=back - -=over 4 - -=item FUNCTIONS - -B - -=back - -B - -=over 4 - -=item MKTEMP FUNCTIONS - -B - -=back - -B - -B - -B - -=over 4 - -=item POSIX FUNCTIONS - -B - -=back - -B - -=over 4 - -=item ADDITIONAL FUNCTIONS - -B - -=back - -=over 4 - -=item UTILITY FUNCTIONS - -B - -=back - -=over 4 - -=item PACKAGE VARIABLES - -B, STANDARD, MEDIUM, HIGH - -=back - -TopSystemUID - -=over 4 - -=item WARNING - -=over 4 - -=item Temporary files and NFS - -=back - -=item HISTORY - -=item SEE ALSO - -=item AUTHOR - -=back - -=head2 File::stat - by-name interface to Perl's built-in stat() functions - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item NOTE - -=item AUTHOR - -=back - -=head2 FileCache - keep more files open than the system permits - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item BUGS - -=back - -=head2 FileHandle - supply object methods for filehandles - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -$fh->print, $fh->printf, $fh->getline, $fh->getlines - -=item SEE ALSO - -=back - -=head2 FindBin - Locate directory of original perl script - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item EXPORTABLE VARIABLES - -=item KNOWN BUGS - -=item AUTHORS - -=item COPYRIGHT - -=back - -=head2 GDBM_File - Perl5 access to the gdbm library. - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item AVAILABILITY - -=item BUGS - -=item SEE ALSO - -=back - -=head2 Getopt::Long - Extended processing of command line options - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item Command Line Options, an Introduction - -=item Getting Started with Getopt::Long - -=over 4 - -=item Simple options - -=item A little bit less simple options - -=item Mixing command line option with other arguments - -=item Options with values - -=item Options with multiple values - -=item Options with hash values - -=item User-defined subroutines to handle options - -=item Options with multiple names - -=item Case and abbreviations - -=item Summary of Option Specifications - -!, +, s, i, f, : I [ I ] - -=back - -=item Advanced Possibilities - -=over 4 - -=item Object oriented interface - -=item Documentation and help texts - -=item Storing options in a hash - -=item Bundling - -=item The lonesome dash - -=item Argument call-back - -=back - -=item Configuring Getopt::Long - -default, posix_default, auto_abbrev, getopt_compat, gnu_compat, gnu_getopt, -require_order, permute, bundling (default: disabled), bundling_override -(default: disabled), ignore_case (default: enabled), ignore_case_always -(default: disabled), pass_through (default: disabled), prefix, -prefix_pattern, debug (default: disabled) - -=item Return values and Errors - -=item Legacy - -=over 4 - -=item Default destinations - -=item Alternative option starters - -=item Configuration variables - -=back - -=item Trouble Shooting - -=over 4 - -=item Warning: Ignoring '!' modifier for short option - -=item GetOptions does not return a false result when an option is not -supplied - -=back - -=item AUTHOR - -=item COPYRIGHT AND DISCLAIMER - -=back - -=head2 Getopt::Std, getopt - Process single-character switches with switch -clustering - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=back - -=head2 I18N::Collate - compare 8-bit scalar data according to the current -locale - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=back - -=head2 IO - load various IO modules - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=back - -=head2 IO::Dir - supply object methods for directory handles - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -new ( [ DIRNAME ] ), open ( DIRNAME ), read (), seek ( POS ), tell (), -rewind (), close (), tie %hash, IO::Dir, DIRNAME [, OPTIONS ] - -=item SEE ALSO - -=item AUTHOR - -=item COPYRIGHT - -=back - -=head2 IO::File - supply object methods for filehandles - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item CONSTRUCTOR - -new ( FILENAME [,MODE [,PERMS]] ), new_tmpfile - -=item METHODS - -open( FILENAME [,MODE [,PERMS]] ) - -=item SEE ALSO - -=item HISTORY - -=back - -=head2 IO::Handle - supply object methods for I/O handles - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item CONSTRUCTOR - -new (), new_from_fd ( FD, MODE ) - -=item METHODS - -$io->fdopen ( FD, MODE ), $io->opened, $io->getline, $io->getlines, -$io->ungetc ( ORD ), $io->write ( BUF, LEN [, OFFSET ] ), $io->error, -$io->clearerr, $io->sync, $io->flush, $io->printflush ( ARGS ), -$io->blocking ( [ BOOL ] ), $io->untaint - -=item NOTE - -=item SEE ALSO - -=item BUGS - -=item HISTORY - -=back - -=head2 IO::Pipe - supply object methods for pipes - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item CONSTRUCTOR - -new ( [READER, WRITER] ) - -=item METHODS - -reader ([ARGS]), writer ([ARGS]), handles () - -=item SEE ALSO - -=item AUTHOR - -=item COPYRIGHT - -=back - -=head2 IO::Poll - Object interface to system poll call - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item METHODS - -mask ( IO [, EVENT_MASK ] ), poll ( [ TIMEOUT ] ), events ( IO ), remove ( -IO ), handles( [ EVENT_MASK ] ) - -=item SEE ALSO - -=item AUTHOR - -=item COPYRIGHT - -=back - -=head2 IO::Seekable - supply seek based methods for I/O objects - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -$io->getpos, $io->setpos, $io->setpos ( POS, WHENCE ), WHENCE=0 (SEEK_SET), -WHENCE=1 (SEEK_CUR), WHENCE=1 (SEEK_END), $io->sysseek( POS, WHENCE ), -$io->tell - -=item HISTORY - -=back - -=head2 IO::Select - OO interface to the select system call - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item CONSTRUCTOR - -new ( [ HANDLES ] ) - -=item METHODS - -add ( HANDLES ), remove ( HANDLES ), exists ( HANDLE ), handles, can_read ( -[ TIMEOUT ] ), can_write ( [ TIMEOUT ] ), has_exception ( [ TIMEOUT ] ), -count (), bits(), select ( READ, WRITE, ERROR [, TIMEOUT ] ) - -=item EXAMPLE - -=item AUTHOR - -=item COPYRIGHT - -=back - -=head2 IO::Socket - Object interface to socket communications - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item CONSTRUCTOR - -new ( [ARGS] ) - -=item METHODS - -accept([PKG]), socketpair(DOMAIN, TYPE, PROTOCOL), timeout([VAL]), -sockopt(OPT [, VAL]), sockdomain, socktype, protocol, connected - -=item SEE ALSO - -=item AUTHOR - -=item COPYRIGHT - -=back - -=head2 IO::Socket::INET - Object interface for AF_INET domain sockets - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item CONSTRUCTOR - -new ( [ARGS] ) - -=over 4 - -=item METHODS - -sockaddr (), sockport (), sockhost (), peeraddr (), peerport (), peerhost -() - -=back - -=item SEE ALSO - -=item AUTHOR - -=item COPYRIGHT - -=back - -=head2 IO::Socket::UNIX - Object interface for AF_UNIX domain sockets - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item CONSTRUCTOR - -new ( [ARGS] ) - -=item METHODS - -hostpath(), peerpath() - -=item SEE ALSO - -=item AUTHOR - -=item COPYRIGHT - -=back - -=head2 IO::lib::IO::Dir, IO::Dir - supply object methods for directory -handles - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -new ( [ DIRNAME ] ), open ( DIRNAME ), read (), seek ( POS ), tell (), -rewind (), close (), tie %hash, IO::Dir, DIRNAME [, OPTIONS ] - -=item SEE ALSO - -=item AUTHOR - -=item COPYRIGHT - -=back - -=head2 IO::lib::IO::File, IO::File - supply object methods for filehandles - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item CONSTRUCTOR - -new ( FILENAME [,MODE [,PERMS]] ), new_tmpfile - -=item METHODS - -open( FILENAME [,MODE [,PERMS]] ) - -=item SEE ALSO - -=item HISTORY - -=back - -=head2 IO::lib::IO::Handle, IO::Handle - supply object methods for I/O -handles - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item CONSTRUCTOR - -new (), new_from_fd ( FD, MODE ) - -=item METHODS - -$io->fdopen ( FD, MODE ), $io->opened, $io->getline, $io->getlines, -$io->ungetc ( ORD ), $io->write ( BUF, LEN [, OFFSET ] ), $io->error, -$io->clearerr, $io->sync, $io->flush, $io->printflush ( ARGS ), -$io->blocking ( [ BOOL ] ), $io->untaint - -=item NOTE - -=item SEE ALSO - -=item BUGS - -=item HISTORY - -=back - -=head2 IO::lib::IO::Pipe, IO::Pipe - supply object methods for pipes - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item CONSTRUCTOR - -new ( [READER, WRITER] ) - -=item METHODS - -reader ([ARGS]), writer ([ARGS]), handles () - -=item SEE ALSO - -=item AUTHOR - -=item COPYRIGHT - -=back - -=head2 IO::lib::IO::Poll, IO::Poll - Object interface to system poll call - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item METHODS - -mask ( IO [, EVENT_MASK ] ), poll ( [ TIMEOUT ] ), events ( IO ), remove ( -IO ), handles( [ EVENT_MASK ] ) - -=item SEE ALSO - -=item AUTHOR - -=item COPYRIGHT - -=back - -=head2 IO::lib::IO::Seekable, IO::Seekable - supply seek based methods for -I/O objects - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -$io->getpos, $io->setpos, $io->setpos ( POS, WHENCE ), WHENCE=0 (SEEK_SET), -WHENCE=1 (SEEK_CUR), WHENCE=1 (SEEK_END), $io->sysseek( POS, WHENCE ), -$io->tell - -=item HISTORY - -=back - -=head2 IO::lib::IO::Select, IO::Select - OO interface to the select system -call - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item CONSTRUCTOR - -new ( [ HANDLES ] ) - -=item METHODS - -add ( HANDLES ), remove ( HANDLES ), exists ( HANDLE ), handles, can_read ( -[ TIMEOUT ] ), can_write ( [ TIMEOUT ] ), has_exception ( [ TIMEOUT ] ), -count (), bits(), select ( READ, WRITE, ERROR [, TIMEOUT ] ) - -=item EXAMPLE - -=item AUTHOR - -=item COPYRIGHT - -=back - -=head2 IO::lib::IO::Socket, IO::Socket - Object interface to socket -communications - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item CONSTRUCTOR - -new ( [ARGS] ) - -=item METHODS - -accept([PKG]), socketpair(DOMAIN, TYPE, PROTOCOL), timeout([VAL]), -sockopt(OPT [, VAL]), sockdomain, socktype, protocol, connected - -=item SEE ALSO - -=item AUTHOR - -=item COPYRIGHT - -=back - -=head2 IO::lib::IO::Socket::INET, IO::Socket::INET - Object interface for -AF_INET domain sockets - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item CONSTRUCTOR - -new ( [ARGS] ) - -=over 4 - -=item METHODS - -sockaddr (), sockport (), sockhost (), peeraddr (), peerport (), peerhost -() - -=back - -=item SEE ALSO - -=item AUTHOR - -=item COPYRIGHT - -=back - -=head2 IO::lib::IO::Socket::UNIX, IO::Socket::UNIX - Object interface for -AF_UNIX domain sockets - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item CONSTRUCTOR - -new ( [ARGS] ) - -=item METHODS - -hostpath(), peerpath() - -=item SEE ALSO - -=item AUTHOR - -=item COPYRIGHT - -=back - -=head2 IPC::Msg - SysV Msg IPC object class - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item METHODS - -new ( KEY , FLAGS ), id, rcv ( BUF, LEN [, TYPE [, FLAGS ]] ), remove, set -( STAT ), set ( NAME => VALUE [, NAME => VALUE ...] ), snd ( TYPE, MSG [, -FLAGS ] ), stat - -=item SEE ALSO - -=item AUTHOR - -=item COPYRIGHT - -=back - -=head2 IPC::Open2, open2 - open a process for both reading and writing - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item WARNING - -=item SEE ALSO - -=back - -=head2 IPC::Open3, open3 - open a process for reading, writing, and error -handling - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item WARNING - -=back - -=head2 IPC::Semaphore - SysV Semaphore IPC object class - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item METHODS - -new ( KEY , NSEMS , FLAGS ), getall, getncnt ( SEM ), getpid ( SEM ), -getval ( SEM ), getzcnt ( SEM ), id, op ( OPLIST ), remove, set ( STAT ), -set ( NAME => VALUE [, NAME => VALUE ...] ), setall ( VALUES ), setval ( N -, VALUE ), stat - -=item SEE ALSO - -=item AUTHOR - -=item COPYRIGHT - -=back - -=head2 IPC::SysV - SysV IPC constants - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -ftok( PATH, ID ) - -=item SEE ALSO - -=item AUTHORS - -=item COPYRIGHT - -=back - -=head2 IPC::SysV::Msg, IPC::Msg - SysV Msg IPC object class - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item METHODS - -new ( KEY , FLAGS ), id, rcv ( BUF, LEN [, TYPE [, FLAGS ]] ), remove, set -( STAT ), set ( NAME => VALUE [, NAME => VALUE ...] ), snd ( TYPE, MSG [, -FLAGS ] ), stat - -=item SEE ALSO - -=item AUTHOR - -=item COPYRIGHT - -=back - -=head2 IPC::SysV::Semaphore, IPC::Semaphore - SysV Semaphore IPC object -class - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item METHODS - -new ( KEY , NSEMS , FLAGS ), getall, getncnt ( SEM ), getpid ( SEM ), -getval ( SEM ), getzcnt ( SEM ), id, op ( OPLIST ), remove, set ( STAT ), -set ( NAME => VALUE [, NAME => VALUE ...] ), setall ( VALUES ), setval ( N -, VALUE ), stat - -=item SEE ALSO - -=item AUTHOR - -=item COPYRIGHT - -=back - -=head2 Math::BigFloat - Arbitrary length float math package - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -number format, Error returns 'NaN', Division is computed to, Rounding is -performed - -=item BUGS - -=item AUTHOR - -=back - -=head2 Math::BigInt - Arbitrary size integer math package - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -Canonical notation, Input, Output - -=item EXAMPLES - -=item Autocreating constants - -=item BUGS - -=item AUTHOR - -=back - -=head2 Math::Complex - complex numbers and associated mathematical -functions - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item OPERATIONS - -=item CREATION - -=item STRINGIFICATION - -=over 4 - -=item CHANGED IN PERL 5.6 - -=back - -=item USAGE - -=item ERRORS DUE TO DIVISION BY ZERO OR LOGARITHM OF ZERO - -=item ERRORS DUE TO INDIGESTIBLE ARGUMENTS - -=item BUGS - -=item AUTHORS - -=back - -=head2 Math::Trig - trigonometric functions - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item TRIGONOMETRIC FUNCTIONS - -B - -=over 4 - -=item ERRORS DUE TO DIVISION BY ZERO - -=item SIMPLE (REAL) ARGUMENTS, COMPLEX RESULTS - -=back - -=item PLANE ANGLE CONVERSIONS - -=item RADIAL COORDINATE CONVERSIONS - -=over 4 - -=item COORDINATE SYSTEMS - -=item 3-D ANGLE CONVERSIONS - -cartesian_to_cylindrical, cartesian_to_spherical, cylindrical_to_cartesian, -cylindrical_to_spherical, spherical_to_cartesian, spherical_to_cylindrical - -=back - -=item GREAT CIRCLE DISTANCES - -=item EXAMPLES - -=item BUGS - -=item AUTHORS - -=back - -=head2 NDBM_File - Tied access to ndbm files - -=over 4 - -=item SYNOPSIS - -C, C, C - -=item DIAGNOSTICS - -=over 4 - -=item C - -=back - -=item BUGS AND WARNINGS - -=back - -=head2 Net::Ping - check a remote host for reachability - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=over 4 - -=item Functions - -Net::Ping->new([$proto [, $def_timeout [, $bytes]]]);, $p->ping($host [, -$timeout]);, $p->close();, pingecho($host [, $timeout]); - -=back - -=item WARNING - -=item NOTES - -=back - -=head2 Net::hostent - by-name interface to Perl's built-in gethost*() -functions - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item EXAMPLES - -=item NOTE - -=item AUTHOR - -=back - -=head2 Net::netent - by-name interface to Perl's built-in getnet*() -functions - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item EXAMPLES - -=item NOTE - -=item AUTHOR - -=back - -=head2 Net::protoent - by-name interface to Perl's built-in getproto*() -functions - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item NOTE - -=item AUTHOR - -=back - -=head2 Net::servent - by-name interface to Perl's built-in getserv*() -functions - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item EXAMPLES - -=item NOTE - -=item AUTHOR - -=back - -=head2 O - Generic interface to Perl Compiler backends - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item CONVENTIONS - -=item IMPLEMENTATION - -=item AUTHOR - -=back - -=head2 ODBM_File - Tied access to odbm files - -=over 4 - -=item SYNOPSIS - -C, C, C - -=item DIAGNOSTICS - -=over 4 - -=item C - -=back - -=item BUGS AND WARNINGS - -=back - -=head2 Opcode - Disable named opcodes when compiling perl code - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item NOTE - -=item WARNING - -=item Operator Names and Operator Lists - -an operator name (opname), an operator tag name (optag), a negated opname -or optag, an operator set (opset) - -=item Opcode Functions - -opcodes, opset (OP, ...), opset_to_ops (OPSET), opset_to_hex (OPSET), -full_opset, empty_opset, invert_opset (OPSET), verify_opset (OPSET, ...), -define_optag (OPTAG, OPSET), opmask_add (OPSET), opmask, opdesc (OP, ...), -opdump (PAT) - -=item Manipulating Opsets - -=item TO DO (maybe) - -=back - -=over 4 - -=item Predefined Opcode Tags - -:base_core, :base_mem, :base_loop, :base_io, :base_orig, :base_math, -:base_thread, :default, :filesys_read, :sys_db, :browse, :filesys_open, -:filesys_write, :subprocess, :ownprocess, :others, :still_to_be_decided, -:dangerous - -=item SEE ALSO - -=item AUTHORS - -=back - -=head2 Opcode::Safe, Safe - Compile and execute code in restricted -compartments - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -a new namespace, an operator mask - -=item WARNING - -=over 4 - -=item RECENT CHANGES - -=item Methods in class Safe - -permit (OP, ...), permit_only (OP, ...), deny (OP, ...), deny_only (OP, -...), trap (OP, ...), untrap (OP, ...), share (NAME, ...), share_from -(PACKAGE, ARRAYREF), varglob (VARNAME), reval (STRING), rdo (FILENAME), -root (NAMESPACE), mask (MASK) - -=item Some Safety Issues - -Memory, CPU, Snooping, Signals, State Changes - -=item AUTHOR - -=back - -=back - -=head2 Opcode::ops, ops - Perl pragma to restrict unsafe operations when -compiling - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item SEE ALSO - -=back - -=head2 POSIX - Perl interface to IEEE Std 1003.1 - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item NOTE - -=item CAVEATS - -=item FUNCTIONS - -_exit, abort, abs, access, acos, alarm, asctime, asin, assert, atan, atan2, -atexit, atof, atoi, atol, bsearch, calloc, ceil, chdir, chmod, chown, -clearerr, clock, close, closedir, cos, cosh, creat, ctermid, ctime, -cuserid, difftime, div, dup, dup2, errno, execl, execle, execlp, execv, -execve, execvp, exit, exp, fabs, fclose, fcntl, fdopen, feof, ferror, -fflush, fgetc, fgetpos, fgets, fileno, floor, fmod, fopen, fork, fpathconf, -fprintf, fputc, fputs, fread, free, freopen, frexp, fscanf, fseek, fsetpos, -fstat, ftell, fwrite, getc, getchar, getcwd, getegid, getenv, geteuid, -getgid, getgrgid, getgrnam, getgroups, getlogin, getpgrp, getpid, getppid, -getpwnam, getpwuid, gets, getuid, gmtime, isalnum, isalpha, isatty, -iscntrl, isdigit, isgraph, islower, isprint, ispunct, isspace, isupper, -isxdigit, kill, labs, ldexp, ldiv, link, localeconv, localtime, log, log10, -longjmp, lseek, malloc, mblen, mbstowcs, mbtowc, memchr, memcmp, memcpy, -memmove, memset, mkdir, mkfifo, mktime, modf, nice, offsetof, open, -opendir, pathconf, pause, perror, pipe, pow, printf, putc, putchar, puts, -qsort, raise, rand, read, readdir, realloc, remove, rename, rewind, -rewinddir, rmdir, scanf, setgid, setjmp, setlocale, setpgid, setsid, -setuid, sigaction, siglongjmp, sigpending, sigprocmask, sigsetjmp, -sigsuspend, sin, sinh, sleep, sprintf, sqrt, srand, sscanf, stat, strcat, -strchr, strcmp, strcoll, strcpy, strcspn, strerror, strftime, strlen, -strncat, strncmp, strncpy, strpbrk, strrchr, strspn, strstr, strtod, -strtok, strtol, strtoul, strxfrm, sysconf, system, tan, tanh, tcdrain, -tcflow, tcflush, tcgetpgrp, tcsendbreak, tcsetpgrp, time, times, tmpfile, -tmpnam, tolower, toupper, ttyname, tzname, tzset, umask, uname, ungetc, -unlink, utime, vfprintf, vprintf, vsprintf, wait, waitpid, wcstombs, -wctomb, write - -=item CLASSES - -=over 4 - -=item POSIX::SigAction - -new - -=item POSIX::SigSet - -new, addset, delset, emptyset, fillset, ismember - -=item POSIX::Termios - -new, getattr, getcc, getcflag, getiflag, getispeed, getlflag, getoflag, -getospeed, setattr, setcc, setcflag, setiflag, setispeed, setlflag, -setoflag, setospeed, Baud rate values, Terminal interface values, c_cc -field values, c_cflag field values, c_iflag field values, c_lflag field -values, c_oflag field values - -=back - -=item PATHNAME CONSTANTS - -Constants - -=item POSIX CONSTANTS - -Constants - -=item SYSTEM CONFIGURATION - -Constants - -=item ERRNO - -Constants - -=item FCNTL - -Constants - -=item FLOAT - -Constants - -=item LIMITS - -Constants - -=item LOCALE - -Constants - -=item MATH - -Constants - -=item SIGNAL - -Constants - -=item STAT - -Constants, Macros - -=item STDLIB - -Constants - -=item STDIO - -Constants - -=item TIME - -Constants - -=item UNISTD - -Constants - -=item WAIT - -Constants, Macros - -=back - -=head2 Pod::Checker, podchecker() - check pod documents for syntax errors - -=over 4 - -=item SYNOPSIS - -=item OPTIONS/ARGUMENTS - -=over 4 - -=item podchecker() - -B<-warnings> =E I - -=back - -=item DESCRIPTION - -=item DIAGNOSTICS - -=over 4 - -=item Errors - -empty =headn, =over on line I without closing =back, =item without -previous =over, =back without previous =over, No argument for =begin, =end -without =begin, Nested =begin's, =for without formatter specification, -unresolved internal link I, Unknown command "I", Unknown -interior-sequence "I", nested commands -IE...IE...E...E, garbled entity I, Entity -number out of range, malformed link LEE, nonempty ZEE, -empty XEE, Spurious text after =pod / =cut, Spurious character(s) -after =back - -=item Warnings - -multiple occurence of link target I, line containing nothing but -whitespace in paragraph, file does not start with =head, previous =item has -no contents, preceding non-item paragraph(s), =item type mismatch (I -vs. I), I unescaped CE> in paragraph, Unknown entity, No -items in =over, No argument for =item, empty section in previous paragraph, -Verbatim paragraph in NAME section - -=item Hyperlinks - -ignoring leading/trailing whitespace in link, (section) in '$page' -deprecated, alternative text/node '%s' contains non-escaped | or / - -=back - -=item RETURN VALUE - -=item EXAMPLES - -=item INTERFACE - -=back - -Cnew( %options )> - -C<$checker-Epoderror( @args )>, C<$checker-Epoderror( {%opts}, -@args )> - -C<$checker-Enum_errors()> - -C<$checker-Ename()> - -C<$checker-Enode()> - -C<$checker-Eidx()> - -C<$checker-Ehyperlink()> - -=over 4 - -=item AUTHOR - -=back - -=head2 Pod::Find - find POD documents in directory trees - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=back - -=over 4 - -=item C - -C<-verbose =E 1>, C<-perl =E 1>, C<-script =E 1>, C<-inc =E -1> - -=back - -=over 4 - -=item C - -=back - -=over 4 - -=item C - -C<-inc =E 1>, C<-dirs =E [ $dir1, $dir2, ... ]>, C<-verbose =E -1> - -=back - -=over 4 - -=item C - -=back - -=over 4 - -=item AUTHOR - -=item SEE ALSO - -=back - -=head2 Pod::Html - module to convert pod files to HTML - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=item ARGUMENTS - -backlink, css, flush, header, help, htmldir, htmlroot, index, infile, -libpods, netscape, outfile, podpath, podroot, quiet, recurse, title, -verbose - -=item EXAMPLE - -=item ENVIRONMENT - -=item AUTHOR - -=item SEE ALSO - -=item COPYRIGHT - -=back - -=head2 Pod::InputObjects - objects representing POD input paragraphs, -commands, etc. - -=over 4 - -=item SYNOPSIS - -=item REQUIRES - -=item EXPORTS - -=item DESCRIPTION - -package B, package B, package -B, package B - -=back - -=over 4 - -=item B - -=back - -=over 4 - -=item B - -=back - -=over 4 - -=item B - -=back - -=over 4 - -=item B - -=back - -=over 4 - -=item B - -=back - -=over 4 - -=item B - -=back - -=over 4 - -=item Pod::Paragraph-EB - -=back - -=over 4 - -=item $pod_para-EB - -=back - -=over 4 - -=item $pod_para-EB - -=back - -=over 4 - -=item $pod_para-EB - -=back - -=over 4 - -=item $pod_para-EB - -=back - -=over 4 - -=item $pod_para-EB - -=back - -=over 4 - -=item $pod_para-EB - -=back - -=over 4 - -=item $pod_para-EB - -=back - -=over 4 - -=item B - -=back - -=over 4 - -=item Pod::InteriorSequence-EB - -=back - -=over 4 - -=item $pod_seq-EB - -=back - -=over 4 - -=item $pod_seq-EB - -=back - -=over 4 - -=item $pod_seq-EB - -=back - -=over 4 - -=item $pod_seq-EB - -=back - -=over 4 - -=item $pod_seq-EB - -=back - -=over 4 - -=item $pod_seq-EB - -=back - -=over 4 - -=item $pod_seq-EB - -=back - -=over 4 - -=item $pod_seq-EB - -=back - -=over 4 - -=item $pod_seq-EB - -=back - -=over 4 - -=item Pod::InteriorSequence::B - -=back - -=over 4 - -=item B - -=back - -=over 4 - -=item Pod::ParseTree-EB - -=back - -=over 4 - -=item $ptree-EB - -=back - -=over 4 - -=item $ptree-EB - -=back - -=over 4 - -=item $ptree-EB - -=back - -=over 4 - -=item $ptree-EB - -=back - -=over 4 - -=item $ptree-EB - -=back - -=over 4 - -=item Pod::ParseTree::B - -=back - -=over 4 - -=item SEE ALSO - -=item AUTHOR - -=back - -=head2 Pod::LaTeX - Convert Pod data to formatted Latex - -=over 4 - -=item SYNOPSIS - -=item DESCRIPTION - -=back - -=over 4 - -=item OBJECT METHODS - -C - -=back - -=over 4 - -=item Data Accessors - -B - -=back - -B - -B - -B