From: Jarkko Hietaniemi Date: Thu, 2 Aug 2001 13:25:43 +0000 (+0000) Subject: Integrate the PerlCE (WinCE Perl) port; X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=e1caacb4fdb62cb28dc825ca0115faf95e569339;p=p5sagit%2Fp5-mst-13.2.git Integrate the PerlCE (WinCE Perl) port; kindly supplied by Rainer Keuchel . p4raw-id: //depot/perl@11549 --- diff --git a/MANIFEST b/MANIFEST index 0cfc4ee..95ad978 100644 --- a/MANIFEST +++ b/MANIFEST @@ -1,3 +1,4 @@ + apollo/netinet/in.h Apollo DomainOS port: C header file frontend Artistic The "Artistic License" AUTHORS Contact info for contributors @@ -1815,6 +1816,7 @@ README.amiga Notes about AmigaOS port README.apollo Notes about Apollo DomainOS port README.beos Notes about BeOS port README.bs2000 Notes about BS2000 POSIX port +README.ce Notes about WinCE port README.cygwin Notes about Cygwin port README.dgux Notes about DG/UX port README.dos Notes about DOS/DJGPP port @@ -2250,6 +2252,48 @@ win32/win32iop.h Win32 port win32/win32sck.c Win32 port win32/win32thread.c Win32 functions for threads win32/win32thread.h Win32 port mapping to threads +wince/bin/exetype.pl WinCE port +wince/bin/perlglob.pl WinCE port +wince/bin/pl2bat.pl WinCE port +wince/bin/runperl.pl WinCE port +wince/bin/search.pl WinCE port +wince/config.ce WinCE port +wince/config.h WinCE port +wince/config_H.ce WinCE port +wince/config_h.PL WinCE port +wince/config_sh.PL WinCE port +wince/dl_win32.xs WinCE port +wince/FindExt.pm WinCE port +wince/include/arpa/inet.h WinCE port +wince/include/cectype.h WinCE port +wince/include/errno.h WinCE port +wince/include/netdb.h WinCE port +wince/include/sys/socket.h WinCE port +wince/include/sys/stat.h WinCE port +wince/include/sys/types.h WinCE port +wince/include/sys/utime.h WinCE port +wince/include/time.h WinCE port +wince/Makefile.ce WinCE port +wince/perl.ico WinCE port +wince/perl.rc WinCE port +wince/perldll.def WinCE port +wince/perllib.c WinCE port +wince/perlmain.c WinCE port +wince/README.compile WinCE port +wince/README.perlce WinCE port +wince/registry.bat WinCE port +wince/runperl.c WinCE port +wince/splittree.pl WinCE port +wince/win32.h WinCE port +wince/win32iop.h WinCE port +wince/win32thread.c WinCE port +wince/win32thread.h WinCE port +wince/wince.c WinCE port +wince/wince.h WinCE port +wince/wincesck.c WinCE port +wince/xbuildall.ksh WinCE port +wince/xdistclean.ksh WinCE port +wince/xmakediffs.ksh WinCE port writemain.SH Generate perlmain.c from miniperlmain.c+extensions x2p/a2p.c Output of a2p.y run through byacc x2p/a2p.h Global declarations diff --git a/README.ce b/README.ce new file mode 100644 index 0000000..a216f33 --- /dev/null +++ b/README.ce @@ -0,0 +1,59 @@ +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 + +Perl for WinCE + +=head1 Description + +This file gives the instructions for building Perl5.6 and above for +WinCE. Please read and understand the terms under which this +software is distributed. + +=head1 Build + +This section describes the steps to be performed to build PerlCE. + +=head2 Tools & SDK + +For compiling, you need Microsoft Embedded Visual Tools, my +celib-sources, my console-sources and a perl for win32. + +Needed source files can be downloaded via: +www.rainer-keuchel.de/wince/dirlist.html + +Some portions of the makefile need a shell for win32, rm, cp, mv, +xmkdir (mkdir with a -p option). It also uses my cecopy program for +copying files to the ce device. + +=head2 Make + +Miniperl is not built. A pre-existent win32 perl is used. + +The paths for tools and additional libraries have to be changed in +wince/makefile.ce. + +Different ce targets can be specified with the TARGET macro. + +Before you start, you need to build celib.dll and w32console. +See instructions in these packages for building. + +In the wince directory, type "nmake -f makefile.ce". This should +build perl.exe and and perl.dll. For building extension dlls, +type "nmake -f makefile.ce dlls" + +When building ext dlls, you get lots of macro redefinition +errors. Just ignore them. + +For further information, look in the text files in the wince +sub-directory. + +=head1 Acknowledgements + +The port for Win32 was used as a reference. + +=head1 Author + +Rainer Keuchel (keuchel@netwave.de) diff --git a/perl.c b/perl.c index d6d261e..c5d3313 100644 --- a/perl.c +++ b/perl.c @@ -2396,6 +2396,11 @@ Perl_moreswitches(pTHX_ char *s) PerlIO_printf(PerlIO_stdout(), "EPOC port by Olaf Flebbe, 1999-2000\n"); #endif +#ifdef UNDER_CE + printf("WINCE port by Rainer Keuchel, 2001\n"); + printf("Built on " __DATE__ " " __TIME__ "\n\n"); + wce_hitreturn(); +#endif #ifdef BINARY_BUILD_NOTICE BINARY_BUILD_NOTICE; #endif diff --git a/perl.h b/perl.h index 938e730..3c7304f 100644 --- a/perl.h +++ b/perl.h @@ -2212,11 +2212,13 @@ struct ptr_tbl { #endif #ifndef __cplusplus +#ifndef UNDER_CE Uid_t getuid (void); Uid_t geteuid (void); Gid_t getgid (void); Gid_t getegid (void); #endif +#endif #ifndef Perl_debug_log # define Perl_debug_log PerlIO_stderr() @@ -3888,4 +3890,8 @@ extern void moncontrol(int); so that Configure picks them up. */ +#ifdef UNDER_CE +#include "wince.h" +#endif + #endif /* Include guard */ diff --git a/perlio.c b/perlio.c index 093cc8a..e1730c8 100644 --- a/perlio.c +++ b/perlio.c @@ -771,7 +771,7 @@ PerlIO_default_layers(pTHX) PerlIO_funcs *osLayer = &PerlIO_unix; PerlIO_def_layerlist = PerlIO_list_alloc(); PerlIO_define_layer(aTHX_ &PerlIO_unix); -#ifdef WIN32 +#if defined(WIN32) && !defined(UNDER_CE) PerlIO_define_layer(aTHX_ &PerlIO_win32); #if 0 osLayer = &PerlIO_win32; diff --git a/wince/FindExt.pm b/wince/FindExt.pm new file mode 100644 index 0000000..8312503 --- /dev/null +++ b/wince/FindExt.pm @@ -0,0 +1,63 @@ +package FindExt; +use strict; +use File::Find; +use File::Basename; +use Cwd; + +my $no = join('|',qw(DynaLoader GDBM_File ODBM_File NDBM_File DB_File + Syslog SysV Langinfo)); +$no = qr/^(?:$no)$/i; + +my %ext; +my $ext; +sub scan_ext +{ + my $here = getcwd(); + my $dir = shift; + chdir($dir) || die "Cannot cd to $dir\n"; + ($ext = getcwd()) =~ s,/,\\,g; + find(\&find_ext,'.'); + chdir($here) || die "Cannot cd to $here\n"; + my @ext = extensions(); +} + +sub dynamic_extensions +{ + return grep $ext{$_} eq 'dynamic',keys %ext; +} + +sub noxs_extensions +{ + return grep $ext{$_} eq 'nonxs',keys %ext; +} + +sub extensions +{ + return keys %ext; +} + +sub find_ext +{ + if (/^(.*)\.pm$/i || /^(.*)_pm\.PL$/i || /^(.*)\.xs$/i) + { + my $name = $1; + return if $name =~ $no; + my $dir = $File::Find::dir; + $dir =~ s,./,,; + return if exists $ext{$dir}; + return unless -f "$ext/$dir/Makefile.PL"; + if ($dir =~ /$name$/i) + { + if (-f "$ext/$dir/$name.xs") + { + $ext{$dir} = 'dynamic'; + } + else + { + $ext{$dir} = 'nonxs'; + } + } + } +} + +1; diff --git a/wince/Makefile.ce b/wince/Makefile.ce new file mode 100644 index 0000000..6b3449f --- /dev/null +++ b/wince/Makefile.ce @@ -0,0 +1,1083 @@ +# perl makefile for wince +# +# Time-stamp: <01/08/01 21:11:35 keuchel@w2k> + +SRCDIR = .. +PV = 57 +INST_VER = 5.7.2 +PERLCEDIR = H:\src\wince\perl\wince +WCEROOT = N:\Windows CE Tools +#WCEROOT = D:\Windows CE Tools +NTPERL = N:\Programme\perl\bin\perl.exe +#NTPERL = D:\Programme\ActiveState\perl-5.6\bin\Perl.exe +CEPATH = N:\Programme\Microsoft eMbedded Tools\EVC\WCE211\BIN +#CEPATH = D:\Programme\Microsoft eMbedded Tools\EVC\WCE211\BIN +CELIBDLLDIR = h:\src\wince\celib-palm +CECONSOLEDIR = h:\src\wince\w32console +# Only for WIN2000 +YES = /y +COPY = copy $(YES) +XCOPY = xcopy $(YES) /f /r /i /d +RCOPY = xcopy $(YES) /f /r /i /e /d +NOOP = @echo +# keep this untouched! +NULL = + +CFG=DEBUG +#CFG=RELEASE + +!if "$(MACHINE)" == "" +MACHINE=wince-arm-hpc-wce300 +#MACHINE=wince-arm-hpc-wce211 +#MACHINE=wince-sh3-hpc-wce211 +#MACHINE=wince-mips-hpc-wce211 +#MACHINE=wince-sh3-hpc-wce200 +#MACHINE=wince-mips-hpc-wce200 +#MACHINE=wince-arm-pocket-wce300 +#MACHINE=wince-mips-pocket-wce300 +#MACHINE=wince-sh3-pocket-wce300 +#MACHINE=wince-x86em-pocket-wce300 +#MACHINE=wince-mips-palm-wce211 +#MACHINE=wince-sh3-palm-wce211 +#MACHINE=wince-x86em-palm-wce211 +!endif + +###################################################################### +# machines + +!if "$(MACHINE)" == "wince-sh3-hpc-wce211" +CC = shcl.exe +ARCH = SH3 +CPU = SH3 +TARGETCPU = SH3 +CEVersion = 211 +OSVERSION = WCE211 +PLATFORM = MS HPC Pro +MCFLAGS = -MDd -DSH3 -D_SH3_ -DSHx -DPROCESSOR_SH3 -DPALM_SIZE \ + -I $(CELIBDLLDIR)\inc +SUBSYS = -subsystem:windowsce,2.11 +CELIBPATH = $(CELIBDLLDIR)\$(MACHINE)-release +LDLIBPATH = -libpath:$(CELIBPATH) +STARTOBJS = $(CECONSOLEDIR)/$(MACHINE)/wmain.obj \ + $(CECONSOLEDIR)/$(MACHINE)/w32console.obj +!endif + +!if "$(MACHINE)" == "wince-mips-hpc-wce211" +CC = clmips.exe +ARCH = MIPS +CPU = MIPS +TARGETCPU = MIPS +CEVersion = 211 +OSVERSION = WCE211 +PLATFORM = MS HPC Pro +MCFLAGS = -D _MT -D _DLL \ + -D MIPS -D mips -D _MIPS_ -D _mips_ -DPROCESSOR_MIPS \ + -D PALM_SIZE \ + -I $(CELIBDLLDIR)\inc +SUBSYS = -subsystem:windowsce,2.11 +CELIBPATH = $(CELIBDLLDIR)\$(MACHINE)-release +LDLIBPATH = -libpath:$(CELIBPATH) +STARTOBJS = $(CECONSOLEDIR)/$(MACHINE)/wmain.obj \ + $(CECONSOLEDIR)/$(MACHINE)/w32console.obj +!endif + +!if "$(MACHINE)" == "wince-mips-hpc-wce200" +CC = clmips.exe +ARCH = MIPS +CPU = MIPS +TARGETCPU = MIPS +CEVersion = 200 +OSVERSION = WCE200 +PLATFORM = MS HPC +# MUST USE -MD to get the right FPE stuff... +MCFLAGS = -D _MT -D _DLL -MD \ + -D MIPS -D mips -D _MIPS_ -D _mips_ -DPROCESSOR_MIPS \ + -D PALM_SIZE \ + -I $(CELIBDLLDIR)\inc +SUBSYS = -subsystem:windowsce,2.00 +CELIBPATH = $(CELIBDLLDIR)\$(MACHINE)-release +LDLIBPATH = -libpath:$(CELIBPATH) +STARTOBJS = $(CECONSOLEDIR)/$(MACHINE)/wmain.obj \ + $(CECONSOLEDIR)/$(MACHINE)/w32console.obj +!endif + +!if "$(MACHINE)" == "wince-sh3-hpc-wce200" +CC = shcl.exe +ARCH = SH3 +CPU = SH3 +TARGETCPU = SH3 +CEVersion = 200 +OSVERSION = WCE200 +PLATFORM = MS HPC +# MUST USE -MD to get the right FPE stuff... +MCFLAGS = -D _MT -D _DLL -MD \ + -D SH3 -D sh3 -D _SH3_ -D _sh3_ -D SHx -DPROCESSOR_SH3 \ + -D PALM_SIZE \ + -I $(CELIBDLLDIR)\inc +SUBSYS = -subsystem:windowsce,2.00 +CELIBPATH = $(CELIBDLLDIR)\$(MACHINE)-release +LDLIBPATH = -libpath:$(CELIBPATH) +STARTOBJS = $(CECONSOLEDIR)/$(MACHINE)/wmain.obj \ + $(CECONSOLEDIR)/$(MACHINE)/w32console.obj +!endif + +!if "$(MACHINE)" == "wince-arm-hpc-wce211" +CC = clarm.exe +ARCH = ARM +CPU = ARM +TARGETCPU = ARM +CEVersion = 211 +OSVERSION = WCE211 +PLATFORM = MS HPC Pro +MCFLAGS = -D _MT -D _DLL -D ARM -D arm -D _arm_ -D _ARM_ \ + -DPROCESSOR_ARM -DPALM_SIZE \ + -I $(CELIBDLLDIR)\inc +SUBSYS = -subsystem:windowsce,2.11 +CELIBPATH = $(CELIBDLLDIR)\$(MACHINE)-release +LDLIBPATH = -libpath:$(CELIBPATH) +STARTOBJS = $(CECONSOLEDIR)/$(MACHINE)/wmain.obj \ + $(CECONSOLEDIR)/$(MACHINE)/w32console.obj +!endif + +!if "$(MACHINE)" == "wince-arm-hpc-wce300" +CC = clarm.exe +ARCH = ARM +CPU = ARM +TARGETCPU = ARM +CEVersion = 300 +OSVERSION = WCE300 +PLATFORM = HPC2000 +MCFLAGS = -D _MT -D _DLL -D ARM -D arm -D _arm_ -D _ARM_ \ + -DPROCESSOR_ARM -DPALM_SIZE \ + -I $(CELIBDLLDIR)\inc +SUBSYS = -subsystem:windowsce,3.00 +CELIBPATH = $(CELIBDLLDIR)\$(MACHINE)-release +LDLIBPATH = -libpath:$(CELIBPATH) +STARTOBJS = $(CECONSOLEDIR)/$(MACHINE)/wmain.obj \ + $(CECONSOLEDIR)/$(MACHINE)/w32console.obj +!endif + +!if "$(MACHINE)" == "wince-mips-palm-wce211" +CC = clmips.exe +ARCH = MIPS +CPU = MIPS +TARGETCPU = MIPS +CEVersion = 211 +OSVERSION = WCE211 +PLATFORM = MS Palm Size PC +MCFLAGS = -DMIPS -D_MIPS_ -DPROCESSOR_MIPS -D PALM_SIZE -D _DLL -D _MT \ + -I $(CELIBDLLDIR)\inc +SUBSYS = -subsystem:windowsce,2.11 +CELIBPATH = $(CELIBDLLDIR)\$(MACHINE)-release +LDLIBPATH = -libpath:$(CELIBPATH) +STARTOBJS = $(CECONSOLEDIR)/$(MACHINE)/wmain.obj \ + $(CECONSOLEDIR)/$(MACHINE)/w32console.obj +!endif + +!if "$(MACHINE)" == "wince-sh3-palm-wce211" +CC = shcl.exe +ARCH = SH3 +CPU = SH3 +TARGETCPU = SH3 +CEVersion = 211 +OSVERSION = WCE211 +PLATFORM = MS Palm Size PC +MCFLAGS = -D _MT -D _DLL -DSH3 -D_SH3_ -DSHx -DPROCESSOR_SH3 -DPALM_SIZE \ + -I $(CELIBDLLDIR)\inc +SUBSYS = -subsystem:windowsce,2.11 +CELIBPATH = $(CELIBDLLDIR)\$(MACHINE)-release +LDLIBPATH = -libpath:$(CELIBPATH) +STARTOBJS = $(CECONSOLEDIR)/$(MACHINE)/wmain.obj \ + $(CECONSOLEDIR)/$(MACHINE)/w32console.obj +!endif + +!if "$(MACHINE)" == "wince-x86em-palm-wce211" +CC = cl.exe +ARCH = X86EM +CPU = X86 +TARGETCPU = X86 +CEVersion = 211 +OSVERSION = WCE211 +PLATFORM = MS Palm Size PC +MCFLAGS = -MDd -DX86 -D_X86_ -DPROCESSOR_X86 \ + -D_WIN32_WCE_EMULATION -DPALM_SIZE \ + -I $(CELIBDLLDIR)\inc +MACH = -machine:x86 +SUBSYS = -subsystem:windows +CELIBPATH = $(CELIBDLLDIR)\$(MACHINE)-release +LDLIBPATH = -libpath:$(CELIBPATH) +STARTOBJS = $(CECONSOLEDIR)/$(MACHINE)/wmain.obj \ + $(CECONSOLEDIR)/$(MACHINE)/w32console.obj +!endif + +!if "$(MACHINE)" == "wince-x86em-pocket-wce300" +CC = cl.exe +ARCH = X86EM +CPU = X86 +TARGETCPU = X86 +CEVersion = 300 +OSVERSION = WCE300 +PLATFORM = MS Pocket PC +MCFLAGS = -DX86 -D_X86_ -DPROCESSOR_X86 -D _MT -D _DLL \ + -D_WIN32_WCE_EMULATION -DPALM_SIZE -DPOCKET_SIZE \ + -I $(CELIBDLLDIR)\inc +MACH = -machine:x86 +SUBSYS = -subsystem:windows +CELIBPATH = $(CELIBDLLDIR)\$(MACHINE)-release +LDLIBPATH = -libpath:$(CELIBPATH) +STARTOBJS = $(CECONSOLEDIR)/$(MACHINE)/wmain.obj \ + $(CECONSOLEDIR)/$(MACHINE)/w32console.obj +!endif + +!if "$(MACHINE)" == "wince-mips-pocket-wce300" +CC = clmips.exe +ARCH = MIPS +CPU = MIPS +TARGETCPU = MIPS +CEVersion = 300 +OSVERSION = WCE300 +PLATFORM = MS Pocket PC +MCFLAGS = -D MIPS -D mips -D _MIPS_ -D _mips_ -DPROCESSOR_MIPS \ + -D _MT -D _DLL -DPALM_SIZE -DPOCKET_SIZE \ + -I $(CELIBDLLDIR)\inc +MACH = -machine:mips +SUBSYS = -subsystem:windowsce,3.00 +CELIBPATH = $(CELIBDLLDIR)\$(MACHINE)-release +LDLIBPATH = -libpath:$(CELIBPATH) +STARTOBJS = $(CECONSOLEDIR)/$(MACHINE)/wmain.obj \ + $(CECONSOLEDIR)/$(MACHINE)/w32console.obj +!endif + +!if "$(MACHINE)" == "wince-sh3-pocket-wce300" +CC = shcl.exe +ARCH = SH3 +CPU = SH3 +TARGETCPU = SH3 +CEVersion = 300 +OSVERSION = WCE300 +PLATFORM = MS Pocket PC +MCFLAGS = -D _MT -D _DLL -DSH3 -D_SH3_ -DSHx -DPROCESSOR_SH3 \ + -DPALM_SIZE -DPOCKET_SIZE \ + -I $(CELIBDLLDIR)\inc +MACH = -machine:mips +SUBSYS = -subsystem:windowsce,3.00 +CELIBPATH = $(CELIBDLLDIR)\$(MACHINE)-release +LDLIBPATH = -libpath:$(CELIBPATH) +STARTOBJS = $(CECONSOLEDIR)/$(MACHINE)/wmain.obj \ + $(CECONSOLEDIR)/$(MACHINE)/w32console.obj +!endif + +!if "$(MACHINE)" == "wince-arm-pocket-wce300" +CC = clarm.exe +ARCH = ARM +CPU = ARM +TARGETCPU = ARM +CEVersion = 300 +OSVERSION = WCE300 +PLATFORM = MS Pocket PC +MCFLAGS = -D ARM -D arm -D _ARM_ -D _arm_ -DPROCESSOR_ARM \ + -D _MT -D _DLL -DPALM_SIZE -DPOCKET_SIZE \ + -I $(CELIBDLLDIR)\inc +MACH = -machine:arm +SUBSYS = -subsystem:windowsce,3.00 +CELIBPATH = $(CELIBDLLDIR)\$(MACHINE)-release +LDLIBPATH = -libpath:$(CELIBPATH) +STARTOBJS = $(CECONSOLEDIR)/$(MACHINE)/wmain.obj \ + $(CECONSOLEDIR)/$(MACHINE)/w32console.obj +!endif + +###################################################################### +# common section + +CEDEFS = -D_WINDOWS -D_WIN32_WCE=$(CEVersion) -DUNDER_CE=$(CEVersion) \ + $(MCFLAGS) +#CEDEFS = $(CEDEFS) -DDEBUGGING_OPS + +CECFLAGS = $(CEDEFS) + +!if "$(CFG)" == "DEBUG" +CECFLAGS = $(CECFLAGS) -Zi -Od +!endif + +!if "$(CFG)" == "RELEASE" +# -O2 and -Ot give internal compiler error in perl.c and lexer. +# Also the dll cannot be loaded by perl.exe... +CECFLAGS = $(CECFLAGS) +!endif + +RCDEFS = /l 0x407 /r /d "UNICODE" /d UNDER_CE=$(CEVersion) \ + /d _WIN32_WCE=$(CEVersion) + +PATH=$(CEPATH);$(PATH) + +INCLUDE=$(WCEROOT)\$(OSVERSION)\$(PLATFORM)\include +LIB=$(WCEROOT)\$(OSVERSION)\$(PLATFORM)\lib\$(ARCH) + +###################################################################### + +!message +!message Compiling for $(MACHINE) +!message LIB=$(LIB) +!message INCLUDE=$(INCLUDE) +!message PATH=$(CEPATH) +!message + +###################################################################### +# +# Additional compiler flags can be specified here. +# + +BUILDOPT = $(BUILDOPT) $(CECFLAGS) + +##################### CHANGE THESE ONLY IF YOU MUST ##################### + +!IF "$(CRYPT_SRC)$(CRYPT_LIB)" == "" +D_CRYPT = undef +!ELSE +D_CRYPT = define +CRYPT_FLAG = -DHAVE_DES_FCRYPT +!ENDIF + +!IF "$(USE_OBJECT)" == "define" +PERL_MALLOC = undef +USE_5005THREADS = undef +USE_MULTI = undef +USE_IMP_SYS = define +!ENDIF + +!IF "$(PERL_MALLOC)" == "" +PERL_MALLOC = undef +!ENDIF + +!IF "$(USE_5005THREADS)" == "" +USE_5005THREADS = undef +!ENDIF + +!IF "$(USE_5005THREADS)" == "define" +USE_ITHREADS = undef +!ENDIF + +!IF "$(USE_IMP_SYS)" == "define" +PERL_MALLOC = undef +!ENDIF + +!IF "$(USE_MULTI)" == "" +USE_MULTI = undef +!ENDIF + +!IF "$(USE_OBJECT)" == "" +USE_OBJECT = undef +!ENDIF + +!IF "$(USE_ITHREADS)" == "" +USE_ITHREADS = undef +!ENDIF + +!IF "$(USE_IMP_SYS)" == "" +USE_IMP_SYS = undef +!ENDIF + +!IF "$(USE_PERLCRT)" == "" +USE_PERLCRT = undef +!ENDIF + +!IF "$(USE_IMP_SYS)$(USE_MULTI)$(USE_5005THREADS)$(USE_OBJECT)" == "defineundefundefundef" +USE_MULTI = define +!ENDIF + +!IF "$(USE_ITHREADS)$(USE_MULTI)$(USE_OBJECT)" == "defineundefundef" +USE_MULTI = define +USE_5005THREADS = undef +!ENDIF + +!IF "$(USE_MULTI)$(USE_5005THREADS)$(USE_OBJECT)" != "undefundefundef" +BUILDOPT = $(BUILDOPT) -DPERL_IMPLICIT_CONTEXT +!ENDIF + +!IF "$(USE_IMP_SYS)" != "undef" +BUILDOPT = $(BUILDOPT) -DPERL_IMPLICIT_SYS +!ENDIF + +# new option - automatically defined in perl.h... +#BUILDOPT = $(BUILDOPT) -DUSE_ENVIRON_ARRAY + +PROCESSOR_ARCHITECTURE = $(TARGETCPU) +ARCHNAME = $(PLATFORM)-$(OSVERSION)-$(PROCESSOR_ARCHITECTURE) +# unused yet +ARCHDIR = ..\lib\$(ARCHNAME) +COREDIR = ..\lib\CORE +AUTODIR = ..\lib\auto +LIBDIR = ..\lib +EXTDIR = ..\ext +PODDIR = ..\pod +EXTUTILSDIR = $(LIBDIR)\ExtUtils + +LINK32 = link +LIB32 = $(LINK32) -lib +RSC = rc + +INCLUDES = -I.\include -I. -I.. +DEFINES = -DWIN32 -D_CONSOLE -DNO_STRICT $(CRYPT_FLAG) $(CECFLAGS) +LOCDEFS = -DPERLDLL -DPERL_CORE +CXX_FLAG = -TP -GX + +PERLEXE_RES = perl.res +PERLDLL_RES = + +!IF "$(USE_OBJECT)" == "define" +OPTIMIZE = $(OPTIMIZE) $(CXX_FLAG) +BUILDOPT = $(BUILDOPT) -DPERL_OBJECT +!ENDIF + +!if "$(CFG)" == "RELEASE" +CELIB = celib.lib +!endif + +!if "$(CFG)" == "DEBUG" +CELIB = celib.lib +!endif + +CELIBS = -nodefaultlib \ + winsock.lib $(CELIB) coredll.lib + +!if $(CEVersion) > 200 +CELIBS = $(CELIBS) corelibc.lib +!else +CELIBS = $(CELIBS) msvcrt.lib +!endif + +LIBBASEFILES = $(CRYPT_LIB) $(CELIBS) + +LIBFILES = $(LIBBASEFILES) $(LIBC) + +CFLAGS = -nologo -Gf -W3 $(INCLUDES) $(DEFINES) $(LOCDEFS) \ + $(PCHFLAGS) $(OPTIMIZE) + +LINK_FLAGS = -nologo -machine:$(PROCESSOR_ARCHITECTURE) + +!if "$(CFG)" == "DEBUG" +LINK_FLAGS = $(LINK_FLAGS) -debug:full -pdb:none +!endif + +OBJOUT_FLAG = -Fo +EXEOUT_FLAG = -Fe + +CFLAGS_O = $(CFLAGS) $(BUILDOPT) + +o = .obj + +# +# Rules +# + +.SUFFIXES : .c $(o) .dll .lib .exe .rc .res + +.c$(o): + $(CC) -c -I$( ..\config.sh + +$(MINIMOD) : ..\minimod.pl + cd .. && $(NTPERL) minimod.pl > lib\ExtUtils\Miniperl.pm + +perlmain.c : runperl.c + $(COPY) runperl.c perlmain.c + +$(DYNALOADER).c: $(EXTDIR)\DynaLoader\dl_win32.xs $(CONFIGPM) + if not exist $(AUTODIR) mkdir $(AUTODIR) + cd $(EXTDIR)\$(*B) + $(NTPERL) -I..\..\lib $(*B)_pm.PL + $(NTPERL) -I..\..\lib XSLoader_pm.PL + cd ..\..\wince + $(XCOPY) $(EXTDIR)\$(*B)\$(*B).pm $(LIBDIR)\$(NULL) + $(XCOPY) $(EXTDIR)\$(*B)\XSLoader.pm $(LIBDIR)\$(NULL) + cd $(EXTDIR)\$(*B) + $(XSUBPP) dl_win32.xs > $(*B).c + cd ..\..\wince + +$(EXTDIR)\DynaLoader\dl_win32.xs: dl_win32.xs + $(COPY) dl_win32.xs $(EXTDIR)\DynaLoader\dl_win32.xs + +$(DUMPER_DLL): $(PERLEXE) $(DUMPER).xs + cd $(EXTDIR)\Data\$(*B) + $(NTPERL) -I..\..\..\lib Makefile.PL INSTALLDIRS=perl + $(MAKE) + cd ..\..\..\wince + +$(DPROF_DLL): $(PERLEXE) $(DPROF).xs + cd $(EXTDIR)\Devel\$(*B) + $(NTPERL) -I..\..\..\lib Makefile.PL INSTALLDIRS=perl + $(MAKE) + cd ..\..\..\wince + +$(GLOB_DLL): $(PERLEXE) $(GLOB).xs + cd $(EXTDIR)\File\$(*B) + $(NTPERL) -I..\..\..\lib Makefile.PL INSTALLDIRS=perl + $(MAKE) + cd ..\..\..\wince + +$(PEEK_DLL): $(PERLEXE) $(PEEK).xs + cd $(EXTDIR)\Devel\$(*B) + $(NTPERL) -I..\..\..\lib Makefile.PL INSTALLDIRS=perl + $(MAKE) + cd ..\..\..\wince + +$(RE_DLL): $(PERLEXE) $(RE).xs + cd $(EXTDIR)\$(*B) + $(NTPERL) -I..\..\lib Makefile.PL INSTALLDIRS=perl + $(MAKE) + cd ..\..\wince + +$(B_DLL): $(PERLEXE) $(B).xs + cd $(EXTDIR)\$(*B) + $(NTPERL) -I..\..\lib Makefile.PL INSTALLDIRS=perl + $(MAKE) + cd ..\..\wince + +$(THREAD_DLL): $(PERLEXE) $(THREAD).xs + cd $(EXTDIR)\$(*B) + $(NTPERL) -I..\..\lib Makefile.PL INSTALLDIRS=perl + $(MAKE) + cd ..\..\wince + +$(ATTRS_DLL): $(PERLEXE) $(ATTRS).xs + cd $(EXTDIR)\$(*B) + $(NTPERL) -I..\..\lib Makefile.PL INSTALLDIRS=perl + $(MAKE) + cd ..\..\wince + +$(POSIX_DLL): $(PERLEXE) $(POSIX).xs + cd $(EXTDIR)\$(*B) + $(NTPERL) -I..\..\lib Makefile.PL INSTALLDIRS=perl + $(MAKE) + cd ..\..\wince + +$(IO_DLL): $(PERLEXE) $(IO).xs + cd $(EXTDIR)\$(*B) + $(NTPERL) -I..\..\lib Makefile.PL INSTALLDIRS=perl + $(MAKE) + cd ..\..\wince + +$(SDBM_FILE_DLL) : $(PERLEXE) $(SDBM_FILE).xs + cd $(EXTDIR)\$(*B) + $(NTPERL) -I..\..\lib Makefile.PL INSTALLDIRS=perl + $(MAKE) + cd ..\..\wince + +$(FCNTL_DLL): $(PERLEXE) $(FCNTL).xs + cd $(EXTDIR)\$(*B) + $(NTPERL) -I..\..\lib Makefile.PL INSTALLDIRS=perl + $(MAKE) + cd ..\..\wince + +$(OPCODE_DLL): $(PERLEXE) $(OPCODE).xs + cd $(EXTDIR)\$(*B) + $(NTPERL) -I..\..\lib Makefile.PL INSTALLDIRS=perl + $(MAKE) + cd ..\..\wince + +$(SOCKET_DLL): $(PERLEXE) $(SOCKET).xs + cd $(EXTDIR)\$(*B) + $(NTPERL) -I..\..\lib Makefile.PL INSTALLDIRS=perl + $(MAKE) + cd ..\..\wince + +$(HOSTNAME_DLL): $(PERLEXE) $(HOSTNAME).xs + cd $(EXTDIR)\Sys\$(*B) + $(NTPERL) -I..\..\..\lib Makefile.PL INSTALLDIRS=perl + $(MAKE) + cd ..\..\..\wince + +$(BYTELOADER_DLL): $(PERLEXE) $(BYTELOADER).xs + cd $(EXTDIR)\$(*B) + $(NTPERL) -I..\..\lib Makefile.PL INSTALLDIRS=perl + $(MAKE) + cd ..\..\wince + +$(ERRNO_PM): $(PERLEXE) $(ERRNO)_pm.PL + cd $(EXTDIR)\$(*B) + $(NTPERL) -I..\..\lib Makefile.PL INSTALLDIRS=perl + $(MAKE) + cd ..\..\wince + +$(PERLEXE_RES): perl.rc + rc $(RCDEFS) perl.rc + +clean: + -rm -f $(MACHINE)/dll/* + -rm -f $(MACHINE)/*.obj + -rm -f $(MACHINE)/*.exe + -rm -f $(MACHINE)/*.dll + -rm -f $(MACHINE)/*.lib + -rm -f ../config.sh ../lib/Config.pm + -rm -f config.h perl.res + +!if "$(MACHINE)" == "wince-sh3-hpc" +install_perlexe: $(PERLEXE) + cedel /speicherkarte2/bin/perl.exe + cecopy pc:../perl.exe ce:/speicherkarte2/bin + +install_perldll: $(PERLDLL) + cedel /speicherkarte2/bin/perl$(PV).dll + cecopy pc:../perl$(PV).dll ce:/speicherkarte2/bin + +install_perl: install_perlexe install_perldll + +test_perl: + cecopy pc:test.pl ce:/speicherkarte2/bin + ceexec /speicherkarte2/bin/perl.exe /speicherkarte2/bin/test.pl +# ceexec /speicherkarte2/bin/perl.exe -V + +install_lib: ../lib/Config.pm + cecopy pc:../lib/Config.pm ce:/speicherkarte2/usr/lib/perl5 +!endif + +!if "$(MACHINE)" == "wince-arm-hpc" +install_perlexe: $(PERLEXE) + -cedel /speicherkarte/bin/perl.exe + cecopy pc:$(MACHINE)/perl.exe ce:/speicherkarte/bin + +install_perldll: $(PERLDLL) + -cedel /speicherkarte/bin/perl$(PV).dll + cecopy pc:$(MACHINE)/perl$(PV).dll ce:/speicherkarte/bin + +install_perl: install_perlexe install_perldll + +test_perl: + cecopy pc:test.pl ce:/speicherkarte/bin + ceexec /speicherkarte/bin/perl.exe /speicherkarte/bin/test.pl +# ceexec /speicherkarte2/bin/perl.exe -V + +install_lib: ../lib/Config.pm + cecopy pc:../lib/Config.pm ce:/speicherkarte/usr/lib/perl5 +!endif + +!if "$(MACHINE)" == "wince-mips-hpc" +install_perlexe: $(PERLEXE) + cecopy pc:../perl.exe ce:/netzwerk/compaq/bin + +install_perldll: $(PERLDLL) + cecopy pc:../perl$(PV).dll ce:/netzwerk/compaq/bin + +install_perl: install_perlexe install_perldll + +test_perl: + cecopy pc:test.pl ce:/netzwerk/compaq/bin + ceexec /netzwerk/compaq/bin/perl.exe /netzwerk/compaq/bin/test.pl +# ceexec /netzwerk/compaq/bin/perl.exe -V + +install_lib: ../lib/Config.pm + cecopy pc:../lib/Config.pm ce:/netzwerk/compaq/usr/lib/perl5 +!endif + +!if "$(MACHINE)" == "wince-x86em-pocket" +install_lib: + ftpcopy ../lib/Config.pm ftp!ftp@localhost:/perl/lib + ftpcopy ../lib/Exporter.pm ftp!ftp@localhost:/perl/lib + ftpcopy ../lib/Exporter/Heavy.pm ftp!ftp@localhost:/perl/lib/Exporter + +install_perlexe: $(PERLEXE) + cecopy pc:../perl.exe ce:/netzwerk/compaq/bin + +install_perldll: $(PERLDLL) + cecopy pc:../perl$(PV).dll ce:/netzwerk/compaq/bin + +install_perl: install_perlexe install_perldll + +test_perl: + echo Not yet +!endif + + +XDLLOBJS = \ +$(DLLDIR)\av.obj \ +$(DLLDIR)\deb.obj \ +$(DLLDIR)\doio.obj \ +$(DLLDIR)\doop.obj \ +$(DLLDIR)\dump.obj \ +$(DLLDIR)\globals.obj \ +$(DLLDIR)\gv.obj \ +$(DLLDIR)\hv.obj \ +$(DLLDIR)\locale.obj \ +$(DLLDIR)\mg.obj \ +$(DLLDIR)\numeric.obj \ +$(DLLDIR)\op.obj \ +$(DLLDIR)\perl.obj \ +$(DLLDIR)\perlapi.obj \ +$(DLLDIR)\perlio.obj \ +$(DLLDIR)\perly.obj \ +$(DLLDIR)\pp.obj \ +$(DLLDIR)\pp_ctl.obj \ +$(DLLDIR)\pp_hot.obj \ +$(DLLDIR)\pp_pack.obj \ +$(DLLDIR)\pp_sys.obj \ +$(DLLDIR)\regcomp.obj \ +$(DLLDIR)\regexec.obj \ +$(DLLDIR)\run.obj \ +$(DLLDIR)\scope.obj \ +$(DLLDIR)\sv.obj \ +$(DLLDIR)\taint.obj \ +$(DLLDIR)\toke.obj \ +$(DLLDIR)\universal.obj \ +$(DLLDIR)\utf8.obj \ +$(DLLDIR)\util.obj \ +$(DLLDIR)\win32thread.obj \ +$(DLLDIR)\wince.obj \ +$(DLLDIR)\wincesck.obj \ +$(DLLDIR)\xsutils.obj \ +$(DLLDIR)\perllib.obj \ +$(DLLDIR)\DynaLoader.obj + +{$(SRCDIR)}.c{$(DLLDIR)}.obj: + $(CC) -c $(CFLAGS) -DPERL_EXTERNAL_GLOB -Fo$(DLLDIR)\ $< + +{$(SRCDIR)/wince}.c{$(DLLDIR)}.obj: + $(CC) -c $(CFLAGS) -DPERL_EXTERNAL_GLOB -Fo$(DLLDIR)\ $< + +$(PERLDLL) : $(DLLDIR) perldll.def $(XDLLOBJS) $(PERLDLL_RES) + $(LINK32) -dll -def:perldll.def -out:$@ \ + $(SUBSYS) $(LDLIBPATH) \ + $(LINK_FLAGS) $(LIBFILES) \ + $(XDLLOBJS) $(PERLDLL_RES) + +$(DLLDIR) : + if not exist "$(DLLDIR)" mkdir "$(DLLDIR)" + +$(DLLDIR)\DynaLoader.obj: $(EXTDIR)\DynaLoader\DynaLoader.c + $(CC) -c $(CFLAGS) -DPERL_EXTERNAL_GLOB -Fo$(DLLDIR)\ \ + $(EXTDIR)\DynaLoader\DynaLoader.c + +XPERLEXEOBJS = \ +$(MACHINE)\perlmain.obj + +$(PERLEXE) : $(PERLDLL) $(CONFIGPM) $(XPERLEXEOBJS) $(PERLEXE_RES) $(STARTOBJS) + $(LINK32) $(SUBSYS) $(LDLIBPATH) \ + -entry:wWinMainCRTStartup \ + -out:$(MACHINE)\perl.exe \ + -stack:0x100000 $(LINK_FLAGS) $(STARTOBJS) $(XPERLEXEOBJS) \ + $(PERLIMPLIB) $(PERLEXE_RES) $(LIBFILES) + +$(MACHINE)\perlmain.obj : perlmain.c + $(CC) $(CFLAGS_O) -UPERLDLL -Fo$(MACHINE)\ -c perlmain.c + +iodll: $(IO_DLL) +socketdll: $(SOCKET_DLL) +dumperdll: $(DUMPER_DLL) + +dlls: socketdll iodll dumperdll + -xmkdir -p $(MACHINE)/lib/auto/IO + cp ../lib/auto/IO/IO.bs $(MACHINE)/lib/auto/IO + cp ../lib/auto/IO/IO.dll $(MACHINE)/lib/auto/IO + -xmkdir $(MACHINE)/lib/auto/Socket + cp ../lib/auto/Socket/Socket.bs $(MACHINE)/lib/auto/Socket + cp ../lib/auto/Socket/Socket.dll $(MACHINE)/lib/auto/Socket + -xmkdir -p $(MACHINE)/lib/auto/Data/Dumper + cp ../lib/auto/Data/Dumper/Dumper.bs $(MACHINE)/lib/auto/Data/Dumper + cp ../lib/auto/Data/Dumper/Dumper.dll $(MACHINE)/lib/auto/Data/Dumper + +makedist: all dlls + $(COPY) $(CELIBPATH)\celib.dll $(MACHINE) + cp perl.txt $(MACHINE) + cp registry.bat $(MACHINE) + cp ../lib/Config.pm $(MACHINE)/lib + cd $(MACHINE) + rm -f perl-$(MACHINE).tar.gz + sh -c "tar cf perl-$(MACHINE).tar *.exe *.dll *.txt *.bat lib" + gzip -9 perl-$(MACHINE).tar + mv perl-$(MACHINE).tar.gz h:/freenet/new + cd .. + +!if "$(MACHINE)" == "wince-arm-hpc-wce300" +install: all + cecopy pc:$(MACHINE)/perl.exe ce:/speicherkarte/bin + cecopy pc:$(MACHINE)/perl$(PV).dll ce:/speicherkarte/bin +install_dlls: dlls + cecopy pc:../lib/auto/IO/io.dll ce:/speicherkarte/usr/lib/perl5/auto/IO/io.dll +!endif + +!if "$(MACHINE)" == "wince-arm-hpc-wce211" +install: all + cecopy pc:$(MACHINE)/perl.exe ce:/speicherkarte/bin + cecopy pc:$(MACHINE)/perl$(PV).dll ce:/speicherkarte/bin +!endif + +!if "$(MACHINE)" == "wince-mips-hpc-wce211" +install: + cecopy pc:$(MACHINE)/perl.exe ce:/bin + cecopy pc:$(MACHINE)/perl$(PV).dll ce:/bin +!endif + +!if "$(MACHINE)" == "wince-mips-hpc-wce200" +install: + cecopy pc:$(MACHINE)/perl.exe ce:/bin + cecopy pc:$(MACHINE)/perl$(PV).dll ce:/bin +!endif + +!if "$(MACHINE)" == "wince-sh3-hpc-wce211" +install: + cecopy pc:$(MACHINE)/perl.exe ce:/speicherkarte2/bin + cecopy pc:$(MACHINE)/perl$(PV).dll ce:/speicherkarte2/bin +!endif diff --git a/wince/README.compile b/wince/README.compile new file mode 100644 index 0000000..0ab6b46 --- /dev/null +++ b/wince/README.compile @@ -0,0 +1,16 @@ +Change config.ce. The makefile will automatically generate new +config.h. + +To generate a new Config.pm, delete config.h or +touch config.ce. + +The socket stuff has been rewritten so fds from ceio are used. This +makes it easy to use them as perl file handles. + +Socket and IO dlls compiled. Seem to work. + +The sequence for building a new target is: + +make clean # clean up +make all # build for target + diff --git a/wince/README.perlce b/wince/README.perlce new file mode 100644 index 0000000..7496a4e --- /dev/null +++ b/wince/README.perlce @@ -0,0 +1,168 @@ +NAME + PerlCE - perl for Windows CE + +DESCRIPTION + PerlCE is a simple port of perl to Windows CE. The program + is currently linked with a simple console window, so it also + works on non-hpc devices. + + The simple stdio implementation creates the files stdin.txt, + stdout.txt and stderr.txt, so you might examine them if your + console has only a liminted number of cols. + + When exitcode is non-zero, a message box appears, otherwise the + console closes, so you might have to catch an exit with + status 0 in your program to see any output. + + stdout/stderr now go into the files /perl-stdout.txt and + /perl-stderr.txt. + +LIMITATIONS + No fork(), pipe(), popen() etc. + +ENVIRONMENT + All environment vars must be stored in HKLM\Environment as + strings. They are read at process startup. + + PERL5LIB - Usual perl lib path (semi-list). + PATH - Semi-list for executables. + TMP - Tempdir. + UNIXROOTPATH - Root for accessing some special files, + i.e. /dev/null, /etc/services. + ROWS/COLS - Rows/cols for console. + HOME - Home directory. + CONSOLEFONTSIZE - Size for console font. + + You can set these with cereg.exe, a (remote) registry editor + or via the PerlIDE. + +REGISTRY + To start perl by clicking on a perl source file, you have + to make the according entries in HKCR (see wince-reg.bat). + cereg.exe (which must be executed on a desktop pc with + ActiveSync) is reported not to work on some devices. + You have to create the registry entries by hand using a + registry editor. + +FILES + $(UNIXROOTPATH)/dev/null - nul simulation, needed for perl -V + $(UNIXROOTPATH)/etc/services - services file + + /perl-stdin.txt + /perl-stdout.txt + /perl-stderr.txt + +PERLFILES + Only a limited set of perl files is provided in the + distribution archiv. You have to copy the original PERL5LIB + files from a perl for win32 installation and put the + distributed files into the right directories. + + Do not copy any Win32/X86 dlls from your PC to the device... + + The following files are a reasonable minimum if you want to do + some socket stuff: + + ./auto + ./auto/DynaLoader + ./auto/DynaLoader/autosplit.ix + ./auto/DynaLoader/dl_expandspec.al + ./auto/DynaLoader/dl_findfile.al + ./auto/DynaLoader/dl_find_symbol_anywhere.al + ./auto/IO + ./auto/IO/IO.bs + ./auto/IO/IO.dll + ./auto/Socket + ./auto/Socket/Socket.bs + ./auto/Socket/Socket.dll + ./Carp + ./Carp/Heavy.pm + ./Carp.pm + ./Config.pm + ./DynaLoader.pm + ./Exporter + ./Exporter/Heavy.pm + ./Exporter.pm + ./IO + ./IO/File.pm + ./IO/Handle.pm + ./IO/Socket.pm + ./IO.pm + ./SelectSaver.pm + ./Socket.pm + ./strict.pm + ./Symbol.pm + ./warnings + ./warnings/register.pm + ./warnings.pm + ./XSLoader.pm + +XS + The following Win32-Methods are built-in: + + newXS("Win32::GetCwd", w32_GetCwd, file); + newXS("Win32::SetCwd", w32_SetCwd, file); + newXS("Win32::GetTickCount", w32_GetTickCount, file); + newXS("Win32::GetOSVersion", w32_GetOSVersion, file); + newXS("Win32::IsWinNT", w32_IsWinNT, file); + newXS("Win32::IsWin95", w32_IsWin95, file); + newXS("Win32::IsWinCE", w32_IsWinCE, file); + newXS("Win32::CopyFile", w32_CopyFile, file); + newXS("Win32::Sleep", w32_Sleep, file); + newXS("Win32::MessageBox", w32_MessageBox, file); + newXS("Win32::GetPowerStatus", w32_GetPowerStatus, file); + newXS("Win32::GetOemInfo", w32_GetOemInfo, file); + newXS("Win32::ShellEx", w32_ShellEx, file); + +DLLS + In the newest version, my celib.dll is needed. Some XS dlls + might be needed. Currently, Socket and IO are provided. + +BUGS + Opening files for read-write is currently not supported if + they use stdio (normal perl file handles). + + If you find bugs or if it does not work at all on your + device, send mail to the address below. Please report + the details of your device (processor, ceversion, + devicetype (hpc/palm/pocket)) and the date of the downloaded + files. + + I currently have only a Compaq/MIPS HPC, a Jornada/SH3 HPC and + a Jornada/ARM HPC, so I can only test on these devices and + under the Emulators. + +INSTALLATION + This is only a suggestion... + + * Unpack the tar archive on your desktop. + * Create directories /bin, /lib/perl5, /home, /dev and /etc, + possibly on a CF card with the path to the card + prepended (i.e. /memcard/bin etc). + * Copy perl.exe, perl56.dll and celib.dll from your desktop to + /bin. The dlls can also be copied to your /windows + directory, but if you use a CF card, you might want to store + them there. + * Copy the other DLLs to the corresponding auto directory. + * Copy any needed perl module-files to /lib/perl5. + * Create the registry entries. + * If you need tcp service-name resolution, create + the file "services" in /etc and put int the entries you need. + + * Under WINCE200, all dlls must be copied to the windows + directory. + +MISC + If you think a certain XS module should be ported, send + me mail and explain why. + + If you write useful scripts for perlce, please send me + a copy. + +TERMINAL + There are simple terminal control sequences now. See the + readme file that comes with the console program. + +AUTHOR + Rainer Keuchel 2001 + diff --git a/wince/bin/exetype.pl b/wince/bin/exetype.pl new file mode 100644 index 0000000..27e3b94 --- /dev/null +++ b/wince/bin/exetype.pl @@ -0,0 +1,108 @@ +#!perl -w +use strict; + +# All the IMAGE_* structures are defined in the WINNT.H file +# of the Microsoft Platform SDK. + +my %subsys = (NATIVE => 1, + WINDOWS => 2, + CONSOLE => 3, + POSIX => 7, + WINDOWSCE => 9); + +unless (0 < @ARGV && @ARGV < 3) { + printf "Usage: $0 exefile [%s]\n", join '|', sort keys %subsys; + exit; +} + +$ARGV[1] = uc $ARGV[1] if $ARGV[1]; +unless (@ARGV == 1 || defined $subsys{$ARGV[1]}) { + (my $subsys = join(', ', sort keys %subsys)) =~ s/, (\w+)$/ or $1/; + print "Invalid subsystem $ARGV[1], please use $subsys\n"; + exit; +} + +my ($record,$magic,$signature,$offset,$size); +open EXE, "+< $ARGV[0]" or die "Cannot open $ARGV[0]: $!\n"; +binmode EXE; + +# read IMAGE_DOS_HEADER structure +read EXE, $record, 64; +($magic,$offset) = unpack "Sx58L", $record; + +die "$ARGV[0] is not an MSDOS executable file.\n" + unless $magic == 0x5a4d; # "MZ" + +# read signature, IMAGE_FILE_HEADER and first WORD of IMAGE_OPTIONAL_HEADER +seek EXE, $offset, 0; +read EXE, $record, 4+20+2; +($signature,$size,$magic) = unpack "Lx16Sx2S", $record; + +die "PE header not found" unless $signature == 0x4550; # "PE\0\0" + +die "Optional header is neither in NT32 nor in NT64 format" + unless ($size == 224 && $magic == 0x10b) || # IMAGE_NT_OPTIONAL_HDR32_MAGIC + ($size == 240 && $magic == 0x20b); # IMAGE_NT_OPTIONAL_HDR64_MAGIC + +# Offset 68 in the IMAGE_OPTIONAL_HEADER(32|64) is the 16 bit subsystem code +seek EXE, $offset+4+20+68, 0; +if (@ARGV == 1) { + read EXE, $record, 2; + my ($subsys) = unpack "S", $record; + $subsys = {reverse %subsys}->{$subsys} || "UNKNOWN($subsys)"; + print "$ARGV[0] uses the $subsys subsystem.\n"; +} +else { + print EXE pack "S", $subsys{$ARGV[1]}; +} +close EXE; +__END__ + +=head1 NAME + +exetype - Change executable subsystem type between "Console" and "Windows" + +=head1 SYNOPSIS + + C:\perl\bin> copy perl.exe guiperl.exe + C:\perl\bin> exetype guiperl.exe windows + +=head1 DESCRIPTION + +This program edits an executable file to indicate which subsystem the +operating system must invoke for execution. + +You can specify any of the following subsystems: + +=over + +=item CONSOLE + +The CONSOLE subsystem handles a Win32 character-mode application that +use a console supplied by the operating system. + +=item WINDOWS + +The WINDOWS subsystem handles an application that does not require a +console and creates its own windows, if required. + +=item NATIVE + +The NATIVE subsystem handles a Windows NT device driver. + +=item WINDOWSCE + +The WINDOWSCE subsystem handles Windows CE consumer electronics +applications. + +=item POSIX + +The POSIX subsystem handles a POSIX application in Windows NT. + +=back + +=head1 AUTHOR + +Jan Dubois + +=cut diff --git a/wince/bin/perlglob.pl b/wince/bin/perlglob.pl new file mode 100644 index 0000000..17843c8 --- /dev/null +++ b/wince/bin/perlglob.pl @@ -0,0 +1,53 @@ +#!perl -w +use File::DosGlob; +$| = 1; +while (@ARGV) { + my $arg = shift; + my @m = File::DosGlob::doglob(1,$arg); + print (@m ? join("\0", sort @m) : $arg); + print "\0" if @ARGV; +} +__END__ + +=head1 NAME + +perlglob.bat - a more capable perlglob.exe replacement + +=head1 SYNOPSIS + + @perlfiles = glob "..\\pe?l/*.p?"; + print <..\\pe?l/*.p?>; + + # more efficient version + > perl -MFile::DosGlob=glob -e "print <../pe?l/*.p?>" + +=head1 DESCRIPTION + +This file is a portable replacement for perlglob.exe. It +is largely compatible with perlglob.exe (the Microsoft setargv.obj +version) in all but one respect--it understands wildcards in +directory components. + +It prints null-separated filenames to standard output. + +For details of the globbing features implemented, see +L. + +While one may replace perlglob.exe with this, usage by overriding +CORE::glob with File::DosGlob::glob should be much more efficient, +because it avoids launching a separate process, and is therefore +strongly recommended. See L for details of overriding +builtins. + +=head1 AUTHOR + +Gurusamy Sarathy + +=head1 SEE ALSO + +perl + +File::DosGlob + +=cut + diff --git a/wince/bin/pl2bat.pl b/wince/bin/pl2bat.pl new file mode 100644 index 0000000..cdbac6f --- /dev/null +++ b/wince/bin/pl2bat.pl @@ -0,0 +1,412 @@ + eval 'exec perl -x -S "$0" ${1+"$@"}' + if 0; # In case running under some shell + +require 5; +use Getopt::Std; +use Config; + +$0 =~ s|.*[/\\]||; + +my $usage = <nul + goto endofperl + \@rem '; +EOT +} +$head =~ s/^\t//gm; +my $headlines = 2 + ($head =~ tr/\n/\n/); +my $tail = "\n__END__\n:endofperl\n"; + +@ARGV = ('-') unless @ARGV; + +foreach ( @ARGV ) { + process($_); +} + +sub process { + my( $file )= @_; + my $myhead = $head; + my $linedone = 0; + my $taildone = 0; + my $linenum = 0; + my $skiplines = 0; + my $line; + my $start= $Config{startperl}; + $start= "#!perl" unless $start =~ /^#!.*perl/; + open( FILE, $file ) or die "$0: Can't open $file: $!"; + @file = ; + foreach $line ( @file ) { + $linenum++; + if ( $line =~ /^:endofperl\b/ ) { + if( ! exists $OPT{'u'} ) { + warn "$0: $file has already been converted to a batch file!\n"; + return; + } + $taildone++; + } + if ( not $linedone and $line =~ /^#!.*perl/ ) { + if( exists $OPT{'u'} ) { + $skiplines = $linenum - 1; + $line .= "#line ".(1+$headlines)."\n"; + } else { + $line .= "#line ".($linenum+$headlines)."\n"; + } + $linedone++; + } + if ( $line =~ /^#\s*line\b/ and $linenum == 2 + $skiplines ) { + $line = ""; + } + } + close( FILE ); + $file =~ s/$OPT{'s'}$//oi; + $file .= '.bat' unless $file =~ /\.bat$/i or $file =~ /^-$/; + open( FILE, ">$file" ) or die "Can't open $file: $!"; + print FILE $myhead; + print FILE $start, ( $OPT{'w'} ? " -w" : "" ), + "\n#line ", ($headlines+1), "\n" unless $linedone; + print FILE @file[$skiplines..$#file]; + print FILE $tail unless $taildone; + close( FILE ); +} +__END__ + +=head1 NAME + +pl2bat - wrap perl code into a batch file + +=head1 SYNOPSIS + +B B<-h> + +B [B<-w>] S<[B<-a> I]> S<[B<-s> I]> [files] + +B [B<-w>] S<[B<-n> I]> S<[B<-o> I]> S<[B<-s> I]> [files] + +=head1 DESCRIPTION + +This utility converts a perl script into a batch file that can be +executed on DOS-like operating systems. This is intended to allow +you to use a Perl script like regular programs and batch files where +you just enter the name of the script [probably minus the extension] +plus any command-line arguments and the script is found in your B +and run. + +=head2 ADVANTAGES + +There are several alternatives to this method of running a Perl script. +They each have disadvantages that help you understand the motivation +for using B. + +=over + +=item 1 + + C:> perl x:/path/to/script.pl [args] + +=item 2 + + C:> perl -S script.pl [args] + +=item 3 + + C:> perl -S script [args] + +=item 4 + + C:> ftype Perl=perl.exe "%1" %* + C:> assoc .pl=Perl + then + C:> script.pl [args] + +=item 5 + + C:> ftype Perl=perl.exe "%1" %* + C:> assoc .pl=Perl + C:> set PathExt=%PathExt%;.PL + then + C:> script [args] + +=back + +B<1> and B<2> are the most basic invocation methods that should work on +any system [DOS-like or not]. They require extra typing and require +that the script user know that the script is written in Perl. This +is a pain when you have lots of scripts, some written in Perl and some +not. It can be quite difficult to keep track of which scripts need to +be run through Perl and which do not. Even worse, scripts often get +rewritten from simple batch files into more powerful Perl scripts in +which case these methods would require all existing users of the scripts +be updated. + +B<3> works on modern Win32 versions of Perl. It allows the user to +omit the ".pl" or ".bat" file extension, which is a minor improvement. + +B<4> and B<5> work on some Win32 operating systems with some command +shells. One major disadvantage with both is that you can't use them +in pipelines nor with file redirection. For example, none of the +following will work properly if you used method B<4> or B<5>: + + C:> script.pl script.pl >outfile + C:> echo y | script.pl + C:> script.pl | more + +This is due to a Win32 bug which Perl has no control over. This bug +is the major motivation for B [which was originally written +for DOS] being used on Win32 systems. + +Note also that B<5> works on a smaller range of combinations of Win32 +systems and command shells while B<4> requires that the user know +that the script is a Perl script [because the ".pl" extension must +be entered]. This makes it hard to standardize on either of these +methods. + +=head2 DISADVANTAGES + +There are several potential traps you should be aware of when you +use B. + +The generated batch file is initially processed as a batch file each +time it is run. This means that, to use it from within another batch +file you should preceed it with C or else the calling batch +file will not run any commands after the script: + + call script [args] + +Except under Windows NT, if you specify more than 9 arguments to +the generated batch file then the 10th and subsequent arguments +are silently ignored. + +Except when using F under Windows NT, if F is not +in your B, then trying to run the script will give you a generic +"Command not found"-type of error message that will probably make you +think that the script itself is not in your B. When using +F under Windows NT, the generic error message is followed by +"You do not have Perl in your PATH", to make this clearer. + +On most DOS-like operating systems, the only way to exit a batch file +is to "fall off the end" of the file. B implements this by +doing C and adding C<__END__> and C<:endofperl> as +the last two lines of the generated batch file. This means: + +=over + +=item No line of your script should start with a colon. + +In particular, for this version of B, C<:endofperl>, +C<:WinNT>, and C<:script_failed_so_exit_with_non_zero_val> should not +be used. + +=item Care must be taken when using C<__END__> and the C file handle. + +One approach is: + + . #!perl + . while( ) { + . last if /^__END__$/; + . [...] + . } + . __END__ + . lines of data + . to be processed + . __END__ + . :endofperl + +The dots in the first column are only there to prevent F to interpret +the C<:endofperl> line in this documentation. Otherwise F itself +wouldn't work. See the previous item. :-) + +=item The batch file always "succeeds" + +The following commands illustrate the problem: + + C:> echo exit(99); >fail.pl + C:> pl2bat fail.pl + C:> perl -e "print system('perl fail.pl')" + 99 + C:> perl -e "print system('fail.bat')" + 0 + +So F always reports that it completed successfully. Actually, +under Windows NT, we have: + + C:> perl -e "print system('fail.bat')" + 1 + +So, for Windows NT, F fails when the Perl script fails, but +the return code is always C<1>, not the return code from the Perl script. + +=back + +=head2 FUNCTION + +By default, the ".pl" suffix will be stripped before adding a ".bat" suffix +to the supplied file names. This can be controlled with the C<-s> option. + +The default behavior is to have the batch file compare the C +environment variable against C<"Windows_NT">. If they match, it +uses the C<%*> construct to refer to all the command line arguments +that were given to it, so you'll need to make sure that works on your +variant of the command shell. It is known to work in the F shell +under Windows NT. 4DOS/NT users will want to put a C +line in their initialization file, or execute C in +the shell startup file. + +On Windows95 and other platforms a nine-argument limit is imposed +on command-line arguments given to the generated batch file, since +they may not support C<%*> in batch files. + +These can be overridden using the C<-n> and C<-o> options or the +deprecated C<-a> option. + +=head1 OPTIONS + +=over 8 + +=item B<-n> I + +Arguments to invoke perl with in generated batch file when run from +Windows NT (or Windows 98, probably). Defaults to S<'-x -S "%0" %*'>. + +=item B<-o> I + +Arguments to invoke perl with in generated batch file except when +run from Windows NT (ie. when run from DOS, Windows 3.1, or Windows 95). +Defaults to S<'-x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9'>. + +=item B<-a> I + +Arguments to invoke perl with in generated batch file. Specifying +B<-a> prevents the batch file from checking the C environment +variable to determine which operating system it is being run from. + +=item B<-s> I + +Strip a suffix string from file name before appending a ".bat" +suffix. The suffix is not case-sensitive. It can be a regex if +it begins with `/' (the trailing '/' is optional and a trailing +C<$> is always assumed). Defaults to C. + +=item B<-w> + +If no line matching C is found in the script, then such +a line is inserted just after the new preamble. The exact line +depends on C<$Config{startperl}> [see L]. With the B<-w> +option, C<" -w"> is added after the value of C<$Config{startperl}>. +If a line matching C already exists in the script, +then it is not changed and the B<-w> option is ignored. + +=item B<-u> + +If the script appears to have already been processed by B, +then the script is skipped and not processed unless B<-u> was +specified. If B<-u> is specified, the existing preamble is replaced. + +=item B<-h> + +Show command line usage. + +=back + +=head1 EXAMPLES + + C:\> pl2bat foo.pl bar.PM + [..creates foo.bat, bar.PM.bat..] + + C:\> pl2bat -s "/\.pl|\.pm/" foo.pl bar.PM + [..creates foo.bat, bar.bat..] + + C:\> pl2bat < somefile > another.bat + + C:\> pl2bat > another.bat + print scalar reverse "rekcah lrep rehtona tsuj\n"; + ^Z + [..another.bat is now a certified japh application..] + + C:\> ren *.bat *.pl + C:\> pl2bat -u *.pl + [..updates the wrapping of some previously wrapped scripts..] + + C:\> pl2bat -u -s .bat *.bat + [..same as previous example except more dangerous..] + +=head1 BUGS + +C<$0> will contain the full name, including the ".bat" suffix +when the generated batch file runs. If you don't like this, +see runperl.bat for an alternative way to invoke perl scripts. + +Default behavior is to invoke Perl with the B<-S> flag, so Perl will +search the B to find the script. This may have undesirable +effects. + +On really old versions of Win32 Perl, you can't run the script +via + + C:> script.bat [args] + +and must use + + C:> script [args] + +A loop should be used to build up the argument list when not on +Windows NT so more than 9 arguments can be processed. + +See also L. + +=head1 SEE ALSO + +perl, perlwin32, runperl.bat + +=cut + diff --git a/wince/bin/runperl.pl b/wince/bin/runperl.pl new file mode 100644 index 0000000..95b33f9 --- /dev/null +++ b/wince/bin/runperl.pl @@ -0,0 +1,67 @@ +#!perl -w +$0 =~ s|\.bat||i; +unless (-f $0) { + $0 =~ s|.*[/\\]||; + for (".", split ';', $ENV{PATH}) { + $_ = "." if $_ eq ""; + $0 = "$_/$0" , goto doit if -f "$_/$0"; + } + die "`$0' not found.\n"; +} +doit: exec "perl", "-x", $0, @ARGV; +die "Failed to exec `$0': $!"; +__END__ + +=head1 NAME + +runperl.bat - "universal" batch file to run perl scripts + +=head1 SYNOPSIS + + C:\> copy runperl.bat foo.bat + C:\> foo + [..runs the perl script `foo'..] + + C:\> foo.bat + [..runs the perl script `foo'..] + + +=head1 DESCRIPTION + +This file can be copied to any file name ending in the ".bat" suffix. +When executed on a DOS-like operating system, it will invoke the perl +script of the same name, but without the ".bat" suffix. It will +look for the script in the same directory as itself, and then in +the current directory, and then search the directories in your PATH. + +It relies on the C operator, so you will need to make sure +that works in your perl. + +This method of invoking perl scripts has some advantages over +batch-file wrappers like C: it avoids duplication +of all the code; it ensures C<$0> contains the same name as the +executing file, without any egregious ".bat" suffix; it allows +you to separate your perl scripts from the wrapper used to +run them; since the wrapper is generic, you can use symbolic +links to simply link to C, if you are serving your +files on a filesystem that supports that. + +On the other hand, if the batch file is invoked with the ".bat" +suffix, it does an extra C. This may be a performance +issue. You can avoid this by running it without specifying +the ".bat" suffix. + +Perl is invoked with the -x flag, so the script must contain +a C<#!perl> line. Any flags found on that line will be honored. + +=head1 BUGS + +Perl is invoked with the -S flag, so it will search the PATH to find +the script. This may have undesirable effects. + +=head1 SEE ALSO + +perl, perlwin32, pl2bat.bat + +=cut + diff --git a/wince/bin/search.pl b/wince/bin/search.pl new file mode 100644 index 0000000..ad74001 --- /dev/null +++ b/wince/bin/search.pl @@ -0,0 +1,1866 @@ +#!/usr/local/bin/perl -w +'di'; +'ig00'; +############################################################################## +## +## search +## +## Jeffrey Friedl (jfriedl@omron.co.jp), Dec 1994. +## Copyright 19.... ah hell, just take it. +## +## BLURB: +## A combo of find and grep -- more or less do a 'grep' on a whole +## directory tree. Fast, with lots of options. Much more powerful than +## the simple "find ... | xargs grep ....". Has a full man page. +## Powerfully customizable. +## +## This file is big, but mostly comments and man page. +## +## See man page for usage info. +## Return value: 2=error, 1=nothing found, 0=something found. +## + +$version = "950918.5"; +## +## "950918.5"; +## Changed all 'sysread' to 'read' because Linux perl's don't seem +## to like sysread() +## +## "941227.4"; +## Added -n, -u +## +## "941222.3" +## Added -nice (due to Lionel Cons ) +## Removed any leading "./" from name. +## Added default flags for ~/.search, including TTY, -nice, -list, etc. +## Program name now has path removed when printed in diagnostics. +## Added simple tilde-expansion to -dir arg. +## Added -dskip, etc. Fixed -iregex bug. +## Changed -dir to be additive, adding -ddir. +## Now screen out devices, pipes, and sockets. +## More tidying and lots of expanding of the man page +## +## +## "941217.2"; +## initial release. + +$stripped=0; + +&init; +$rc_file = join('/', $ENV{'HOME'}, ".search"); + +&check_args; + +## Make sure we've got a regex. +## Don't need one if -find or -showrc was specified. +$!=2, die "expecting regex arguments.\n" + if $FIND_ONLY == 0 && $showrc == 0 && @ARGV == 0; + +&prepare_to_search($rc_file); + +&import_program if !defined &dodir; ## BIG key to speed. + +## do search while there are directories to be done. +&dodir(shift(@todo)) while @todo; + +&clear_message if $VERBOSE && $STDERR_IS_TTY; +exit($retval); +############################################################################### + +sub init +{ + ## initialize variables that might be reset by command-line args + $DOREP=0; ## set true by -dorep (redo multi-hardlink files) + $DOREP=1 if $^O eq 'MSWin32'; + $DO_SORT=0; ## set by -sort (sort files in a dir before checking) + $FIND_ONLY=0; ## set by -find (don't search files) + $LIST_ONLY=0; ## set true by -l (list filenames only) + $NEWER=0; ## set by -newer, "-mtime -###" + $NICE=0; ## set by -nice (print human-readable output) + $NOLINKS=0; ## set true by -nolinks (don't follow symlinks) + $OLDER=0; ## set by -older, "-mtime ###" + $PREPEND_FILENAME=1; ## set false by -h (don't prefix lines with filename) + $REPORT_LINENUM=0; ## set true by -n (show line numbers) + $VERBOSE=0; ## set to a value by -v, -vv, etc. (verbose messages) + $WHY=0; ## set true by -why, -vvv+ (report why skipped) + $XDEV=0; ## set true by -xdev (stay on one filesystem) + $all=0; ## set true by -all (don't skip many kinds of files) + $iflag = ''; ## set to 'i' by -i (ignore case); + $norc=0; ## set by -norc (don't load rc file) + $showrc=0; ## set by -showrc (show what happens with rc file) + $underlineOK=0; ## set true by -u (watch for underline stuff) + $words=0; ## set true by -w (match whole-words only) + $DELAY=0; ## inter-file delay (seconds) + $retval=1; ## will set to 0 if we find anything. + + ## various elements of stat() that we might access + $STAT_DEV = 1; + $STAT_INODE = 2; + $STAT_MTIME = 9; + + $VV_PRINT_COUNT = 50; ## with -vv, print every VV_PRINT_COUNT files, or... + $VV_SIZE = 1024*1024; ## ...every VV_SIZE bytes searched + $vv_print = $vv_size = 0; ## running totals. + + ## set default options, in case the rc file wants them + $opt{'TTY'}= 1 if -t STDOUT; + + ## want to know this for debugging message stuff + $STDERR_IS_TTY = -t STDERR ? 1 : 0; + $STDERR_SCREWS_STDOUT = ($STDERR_IS_TTY && -t STDOUT) ? 1 : 0; + + $0 =~ s,.*/,,; ## clean up $0 for any diagnostics we'll be printing. +} + +## +## Check arguments. +## +sub check_args +{ + while (@ARGV && $ARGV[0] =~ m/^-/) + { + $arg = shift(@ARGV); + + if ($arg eq '-version' || ($VERBOSE && $arg eq '-help')) { + print qq/Jeffrey's file search, version "$version".\n/; + exit(0) unless $arg eq '-help'; + } + if ($arg eq '-help') { + print < # days ago (-# for < # days old) + -newer FILE consider files modified more recently than FILE (also -older) + -name GLOB consider files whose name matches pattern (also -regex). + -skip GLOB opposite of -name: identifies files to not consider. + -path GLOB like -name, but for files whose whole path is described. + -dpath/-dregex/-dskip versions for selecting or pruning directories. + -all don't skip any files marked to be skipped by the startup file. + -x (see manual, and/or try -showrc). + -why report why a file isn't checked (also implied by -vvvv). +OPTIONS TELLING WHAT TO DO WITH FILES THAT WILL BE CONSIDERED: + -f | -find just list files (PerlRegex ignored). Default is to grep them. + -ff | -ffind Does a faster -find (implies -find -all -dorep) +OPTIONS CONTROLLING HOW THE SEARCH IS DONE (AND WHAT IS PRINTED): + -l | -list only list files with matches, not the lines themselves. + -nice | -nnice print more "human readable" output. + -n prefix each output line with its line number in the file. + -h don't prefix output lines with file name. + -u also look "inside" manpage-style underlined text + -i do case-insensitive searching. + -w match words only (as defined by perl's \\b). +OTHER OPTIONS: + -v, -vv, -vvv various levels of message verbosity. + -e end of options (in case a regex looks like an option). + -showrc show what the rc file sets, then exit. + -norc don't load the rc file. + -dorep check files with multiple hard links multiple times. +INLINE_LITERAL_TEXT + print "Use -v -help for more verbose help.\n" unless $VERBOSE; + print "This script file is also a man page.\n" unless $stripped; + print < $time; + } + next; + } + + if ($arg =~ m/-mtime/) { + $! = 2, die "$0: expecting numerical arg to -$arg\n" unless @ARGV; + local($days) = shift(@ARGV); + $! = 2, die qq/$0: inappropriate arg ($days) to $arg\n/ if $days==0; + $days *= 3600 * 24; + if ($days < 0) { + local($time) = $^T + $days; + $NEWER = $time if $NEWER < $time; + } else { + local($time) = $^T - $days; + $OLDER = $time if $OLDER == 0 || $OLDER > $time; + } + next; + } + + ## special user options + if ($arg =~ m/^-x(.+)/) { + foreach (split(/[\s,]+/, $1)) { $user_opt{$_} = $opt{$_}= 1; } + next; + } + + $! = 2, die "$0: unknown arg [$arg]\n"; + } +} + +## +## Given a filename glob, return a regex. +## If the glob has no globbing chars (no * ? or [..]), then +## prepend an effective '*' to it. +## +sub glob_to_regex +{ + local($glob) = @_; + local(@parts) = $glob =~ m/\\.|[*?]|\[]?[^]]*]|[^[\\*?]+/g; + local($trueglob)=0; + foreach (@parts) { + if ($_ eq '*' || $_ eq '?') { + $_ = ".$_"; + $trueglob=1; ## * and ? are a real glob + } elsif (substr($_, 0, 1) eq '[') { + $trueglob=1; ## [..] is a real glob + } else { + s/^\\//; ## remove any leading backslash; + s/\W/\\$&/g; ## now quote anything dangerous; + } + } + unshift(@parts, '.*') unless $trueglob; + join('', '^', @parts, '$'); +} + +sub prepare_to_search +{ + local($rc_file) = @_; + + $HEADER_BYTES=0; ## Might be set nonzero in &read_rc; + $last_message_length = 0; ## For &message and &clear_message. + + &read_rc($rc_file, $showrc) unless $norc; + exit(0) if $showrc; + + $NEXT_DIR_ENTRY = $DO_SORT ? 'shift @files' : 'readdir(DIR)'; + $WHY = 1 if $VERBOSE > 3; ## Arg -vvvv or above implies -why. + @todo = ('.') if @todo == 0; ## Where we'll start looking + + ## see if any user options were specified that weren't accounted for + foreach $opt (keys %user_opt) { + next if defined $seen_opt{$opt}; + warn "warning: -x$opt never considered.\n"; + } + + die "$0: multiple time constraints exclude all possible files.\n" + if ($NEWER && $OLDER) && ($NEWER > $OLDER); + + ## + ## Process any -skip/-iskip args that had been given + ## + local(@skip_test); + foreach $glob (keys %skip) { + $i = defined($iskip{$glob}) ? 'i': ''; + push(@skip_test, '$name =~ m/'. &glob_to_regex($glob). "/$i"); + } + if (@skip_test) { + $SKIP_TEST = join('||',@skip_test); + $DO_SKIP_TEST = 1; + } else { + $DO_SKIP_TEST = $SKIP_TEST = 0; + } + + ## + ## Process any -dskip/-idskip args that had been given + ## + local(@dskip_test); + foreach $glob (keys %dskip) { + $i = defined($idskip{$glob}) ? 'i': ''; + push(@dskip_test, '$name =~ m/'. &glob_to_regex($glob). "/$i"); + } + if (@dskip_test) { + $DSKIP_TEST = join('||',@dskip_test); + $DO_DSKIP_TEST = 1; + } else { + $DO_DSKIP_TEST = $DSKIP_TEST = 0; + } + + + ## + ## Process any -name, -path, -regex, etc. args that had been given. + ## + undef @name_test; + undef @dname_test; + foreach $key (keys %name) { + local($type, $pat) = split(/,/, $key, 2); + local($i) = defined($iname{$key}) ? 'i' : ''; + if ($type =~ /regex/) { + $pat =~ s/!/\\!/g; + $test = "\$name =~ m!^$pat\$!$i"; + } else { + local($var) = $type eq 'name' ? '$name' : '$file'; + $test = "$var =~ m/". &glob_to_regex($pat). "/$i"; + } + if ($type =~ m/^-i?d/) { + push(@dname_test, $test); + } else { + push(@name_test, $test); + } + } + if (@name_test) { + $GLOB_TESTS = join('||', @name_test); + + $DO_GLOB_TESTS = 1; + } else { + $GLOB_TESTS = $DO_GLOB_TESTS = 0; + } + if (@dname_test) { + $DGLOB_TESTS = join('||', @dname_test); + $DO_DGLOB_TESTS = 1; + } else { + $DGLOB_TESTS = $DO_DGLOB_TESTS = 0; + } + + + ## + ## Process any 'magic' things from the startup file. + ## + if (@magic_tests && $HEADER_BYTES) { + ## the $magic' one is for when &dodir is not inlined + $tests = join('||',@magic_tests); + $MAGIC_TESTS = " { package magic; \$val = ($tests) }"; + $DO_MAGIC_TESTS = 1; + } else { + $MAGIC_TESTS = 1; + $DO_MAGIC_TESTS = 0; + } + + ## + ## Prepare regular expressions. + ## + { + local(@regex_tests); + + if ($LIST_ONLY) { + $mflag = ''; + ## need to have $* set, but perl5 just won''t shut up about it. + if ($] >= 5) { + $mflag = 'm'; + } else { + eval ' $* = 1 '; + } + } + + ## + ## Until I figure out a better way to deal with it, + ## We have to worry about a regex like [^xyz] when doing $LIST_ONLY. + ## Such a regex *will* match \n, and if I'm pulling in multiple + ## lines, it can allow lines to match that would otherwise not match. + ## + ## Therefore, if there is a '[^' in a regex, we can NOT take a chance + ## an use the fast listonly. + ## + $CAN_USE_FAST_LISTONLY = $LIST_ONLY; + + local(@extra); + local($underline_glue) = ($] >= 5) ? '(:?_\cH)?' : '(_\cH)?'; + while (@ARGV) { + $regex = shift(@ARGV); + ## + ## If watching for underlined things too, add another regex. + ## + if ($underlineOK) { + if ($regex =~ m/[?*+{}()\\.|^\$[]/) { + warn "$0: warning, can't underline-safe ``$regex''.\n"; + } else { + $regex = join($underline_glue, split(//, $regex)); + } + } + + ## If nothing special in the regex, just use index... + ## is quite a bit faster. + if (($iflag eq '') && ($words == 0) && + $regex !~ m/[?*+{}()\\.|^\$[]/) + { + push(@regex_tests, "(index(\$_, q+$regex+)>=0)"); + + } else { + $regex =~ s#[\$\@\/]\w#\\$&#; + if ($words) { + if ($regex =~ m/\|/) { + ## could be dangerous -- see if we can wrap in parens. + if ($regex =~ m/\\\d/) { + warn "warning: -w and a | in a regex is dangerous.\n" + } else { + $regex = join($regex, '(', ')'); + } + } + $regex = join($regex, '\b', '\b'); + } + $CAN_USE_FAST_LISTONLY = 0 if substr($regex, "[^") >= 0; + push(@regex_tests, "m/$regex/$iflag$mflag"); + } + + ## If we're done, but still have @extra to do, get set for that. + if (@ARGV == 0 && @extra) { + @ARGV = @extra; ## now deal with the extra stuff. + $underlineOK = 0; ## but no more of this. + undef @extra; ## or this. + } + } + if (@regex_tests) { + $REGEX_TEST = join('||', @regex_tests); + ## print STDERR $REGEX_TEST, "\n"; exit; + } else { + ## must be doing -find -- just give something syntactically correct. + $REGEX_TEST = 1; + } + } + + ## + ## Make sure we can read the first item(s). + ## + foreach $start (@todo) { + $! = 2, die qq/$0: can't stat "$start"\n/ + unless ($dev,$inode) = (stat($start))[$STAT_DEV,$STAT_INODE]; + + if (defined $dir_done{"$dev,$inode"}) { + ## ignore the repeat. + warn(qq/ignoring "$start" (same as "$dir_done{"$dev,$inode"}").\n/) + if $VERBOSE; + next; + } + + ## if -xdev was given, remember the device. + $xdev{$dev} = 1 if $XDEV; + + ## Note that we won't want to do it again + $dir_done{"$dev,$inode"} = $start; + } +} + + +## +## See the comment above the __END__ above the 'sub dodir' below. +## +sub import_program +{ + sub bad { + print STDERR "$0: internal error (@_)\n"; + exit 2; + } + + ## Read from data, up to next __END__. This will be &dodir. + local($/) = "\n__END__"; + $prog = ; + close(DATA); + + $prog =~ s/\beval\b//g; ## remove any 'eval' + + ## Inline uppercase $-variables by their current values. + if ($] >= 5) { + $prog =~ s/\$([A-Z][A-Z0-9_]{2,}\b)/ + &bad($1) if !defined ${$main::{$1}}; ${$main::{$1}};/eg; + } else { + $prog =~ s/\$([A-Z][A-Z0-9_]{2,}\b)/local(*VAR) = $_main{$1}; + &bad($1) if !defined $VAR; $VAR;/eg; + } + + eval $prog; ## now do it. This will define &dodir; + $!=2, die "$0 internal error: $@\n" if $@; +} + +########################################################################### + +## +## Read the .search file: +## Blank lines and lines that are only #-comments ignored. +## Newlines may be escaped to create long lines +## Other lines are directives. +## +## A directive may begin with an optional tag in the form <...> +## Things inside the <...> are evaluated as with: +## <(this || that) && must> +## will be true if +## -xmust -xthis or -xmust -xthat +## were specified on the command line (order doesn't matter, though) +## A directive is not done if there is a tag and it's false. +## Any characters but whitespace and &|()>,! may appear after an -x +## (although "-xdev" is special). -xmust,this is the same as -xmust -xthis. +## Something like -x~ would make <~> true, and false. +## +## Directives are in the form: +## option: STRING +## magic : NUMBYTES : EXPR +## +## With option: +## The STRING is parsed like a Bourne shell command line, and the +## options are used as if given on the command line. +## No comments are allowed on 'option' lines. +## Examples: +## # skip objects and libraries +## option: -skip '.o .a' +## # skip emacs *~ and *# files, unless -x~ given: +## option: -skip '~ #' +## +## With magic: +## EXPR can be pretty much any perl (comments allowed!). +## If it evaluates to true for any particular file, it is skipped. +## The only info you'll have about a file is the variable $H, which +## will have at least the first NUMBYTES of the file (less if the file +## is shorter than that, of course, and maybe more). You'll also have +## any variables you set in previous 'magic' lines. +## Examples: +## magic: 6 : ($x6 = substr($H, 0, 6)) eq 'GIF87a' +## magic: 6 : $x6 eq 'GIF89a' +## +## magic: 6 : (($x6 = substr($H, 0, 6)) eq 'GIF87a' ## old gif \ +## || $x6 eq 'GIF89a' ## new gif +## (the above two sets are the same) +## ## Check the first 32 bytes for "binarish" looking bytes. +## ## Don't blindly dump on any high-bit set, as non-ASCII text +## ## often has them set. \x80 and \xff seem to be special, though. +## ## Require two in a row to not get things like perl's $^T. +## ## This is known to get *.Z, *.gz, pkzip, *.elc and about any +## ## executable you'll find. +## magic: 32 : $H =~ m/[\x00-\x06\x10-\x1a\x1c-\x1f\x80\xff]{2}/ +## +sub read_rc +{ + local($file, $show) = @_; + local($line_num, $ln, $tag) = 0; + local($use_default, @default) = 0; + + { package magic; $ = 0; } ## turn off warnings for when we run EXPR's + + unless (open(RC, "$file")) { + $use_default=1; + $file = ""; + ## no RC file -- use this default. + @default = split(/\n/,<<'--------INLINE_LITERAL_TEXT'); + magic: 32 : $H =~ m/[\x00-\x06\x10-\x1a\x1c-\x1f\x80\xff]{2}/ + option: -skip '.a .COM .elc .EXE .gz .o .pbm .xbm .dvi' + option: -iskip '.tarz .zip .z .lzh .jpg .jpeg .gif .uu' + option: -skip '~ #' +--------INLINE_LITERAL_TEXT + } + + ## + ## Make an eval error pretty. + ## + sub clean_eval_error { + local($_) = @_; + s/ in file \(eval\) at line \d+,//g; ## perl4-style error + s/ at \(eval \d+\) line \d+,//g; ## perl5-style error + $_ = $` if m/\n/; ## remove all but first line + "$_\n"; + } + + print "reading RC file: $file\n" if $show; + + while (defined($_ = ($use_default ? shift(@default) : ))) { + $ln = ++$line_num; ## note starting line num. + $_ .= , $line_num++ while s/\\\n?$/\n/; ## allow continuations + next if /^\s*(#.*)?$/; ## skip blank or comment-only lines. + $do = ''; + + ## look for an initial <...> tag. + if (s/^\s*<([^>]*)>//) { + ## This simple s// will make the tag ready to eval. + ($tag = $msg = $1) =~ + s/[^\s&|(!)]+/ + $seen_opt{$&}=1; ## note seen option + "defined(\$opt{q>$&>})" ## (q>> is safe quoting here) + /eg; + + ## see if the tag is true or not, abort this line if not. + $dothis = (eval $tag); + $!=2, die "$file $ln <$msg>: $_".&clean_eval_error($@) if $@; + + if ($show) { + $msg =~ s/[^\s&|(!)]+/-x$&/; + $msg =~ s/\s*!\s*/ no /g; + $msg =~ s/\s*&&\s*/ and /g; + $msg =~ s/\s*\|\|\s*/ or /g; + $msg =~ s/^\s+//; $msg =~ s/\s+$//; + $do = $dothis ? "(doing because $msg)" : + "(do if $msg)"; + } elsif (!$dothis) { + next; + } + } + + if (m/^\s*option\s*:\s*/) { + next if $all && !$show; ## -all turns off these checks; + local($_) = $'; + s/\n$//; + local($orig) = $_; + print " $do option: $_\n" if $show; + local($0) = "$0 ($file)"; ## for any error message. + local(@ARGV); + local($this); + ## + ## Parse $_ as a Bourne shell line -- fill @ARGV + ## + while (length) { + if (s/^\s+//) { + push(@ARGV, $this) if defined $this; + undef $this; + next; + } + $this = '' if !defined $this; + $this .= $1 while s/^'([^']*)'// || + s/^"([^"]*)"// || + s/^([^'"\s\\]+)//|| + s/^(\\[\D\d])//; + die "$file $ln: error parsing $orig at $_\n" if m/^\S/; + } + push(@ARGV, $this) if defined $this; + &check_args; + die qq/$file $ln: unused arg "@ARGV".\n/ if @ARGV; + next; + } + + if (m/^\s*magic\s*:\s*(\d+)\s*:\s*/) { + next if $all && !$show; ## -all turns off these checks; + local($bytes, $check) = ($1, $'); + + if ($show) { + $check =~ s/\n?$/\n/; + print " $do contents: $check"; + } + ## Check to make sure the thing at least compiles. + eval "package magic; (\$H = '1'x \$main'bytes) && (\n$check\n)\n"; + $! = 2, die "$file $ln: ".&clean_eval_error($@) if $@; + + $HEADER_BYTES = $bytes if $bytes > $HEADER_BYTES; + push(@magic_tests, "(\n$check\n)"); + next; + } + $! = 2, die "$file $ln: unknown command\n"; + } + close(RC); +} + +sub message +{ + if (!$STDERR_IS_TTY) { + print STDERR $_[0], "\n"; + } else { + local($text) = @_; + $thislength = length($text); + if ($thislength >= $last_message_length) { + print STDERR $text, "\r"; + } else { + print STDERR $text, ' 'x ($last_message_length-$thislength),"\r"; + } + $last_message_length = $thislength; + } +} + +sub clear_message +{ + print STDERR ' ' x $last_message_length, "\r" if $last_message_length; + $vv_print = $vv_size = $last_message_length = 0; +} + +## +## Output a copy of this program with comments, extra whitespace, and +## the trailing man page removed. On an ultra slow machine, such a copy +## might load faster (but I can't tell any difference on my machine). +## +sub strip { + seek(DATA, 0, 0) || die "$0: can't reset internal pointer.\n"; + while() { + print, next if /INLINE_LITERAL_TEXT/.../INLINE_LITERAL_TEXT/; + ## must mention INLINE_LITERAL_TEXT on this line! + s/\#\#.*|^\s+|\s+$//; ## remove cruft + last if $_ eq '.00;'; + next if ($_ eq '') || ($_ eq "'di'") || ($_ eq "'ig00'"); + s/\$stripped=0;/\$stripped=1;/; + s/\s\s+/ /; ## squish multiple whitespaces down to one. + print $_, "\n"; + } + exit(0); +} + +## +## Just to shut up -w. Never executed. +## +sub dummy { + + 1 || &dummy || &dir_done || &bad || &message || $NEXT_DIR_ENTRY || + $DELAY || $VV_SIZE || $VV_PRINT_COUNT || $STDERR_SCREWS_STDOUT || + @files || @files || $magic'H || $magic'H || $xdev{''} || &clear_message; + +} + +## +## If the following __END__ is in place, what follows will be +## inlined when the program first starts up. Any $ variable name +## all in upper case, specifically, any string matching +## \$([A-Z][A-Z0-9_]{2,}\b +## will have the true value for that variable inlined. Also, any 'eval' is +## removed +## +## The idea is that when the whole thing is then eval'ed to define &dodir, +## the perl optimizer will make all the decisions that are based upon +## command-line options (such as $VERBOSE), since they'll be inlined as +## constants +## +## Also, and here's the big win, the tests for matching the regex, and a +## few others, are all inlined. Should be blinding speed here. +## +## See the read from above for where all this takes place. +## But all-in-all, you *want* the __END__ here. Comment it out only for +## debugging.... +## + +__END__ + +## +## Given a directory, check all "appropriate" files in it. +## Shove any subdirectories into the global @todo, so they'll be done +## later. +## +## Be careful about adding any upper-case variables, as they are subject +## to being inlined. See comments above the __END__ above. +## +sub dodir +{ + local($dir) = @_; + $dir =~ s,/+$,,; ## remove any trailing slash. + unless (opendir(DIR, "$dir/.")) { + &clear_message if $VERBOSE && $STDERR_SCREWS_STDOUT; + warn qq($0: can't opendir "$dir/".\n); + return; + } + + if ($VERBOSE) { + &message($dir); + $vv_print = $vv_size = 0; + } + + @files = sort readdir(DIR) if $DO_SORT; + + while (defined($name = eval $NEXT_DIR_ENTRY)) + { + next if $name eq '.' || $name eq '..'; ## never follow these. + + ## create full relative pathname. + $file = $dir eq '.' ? $name : "$dir/$name"; + + ## if link and skipping them, do so. + if ($NOLINKS && -l $file) { + warn qq/skip (symlink): $file\n/ if $WHY; + next; + } + + ## skip things unless files or directories + unless (-f $file || -d _) { + if ($WHY) { + $why = (-S _ && "socket") || + (-p _ && "pipe") || + (-b _ && "block special")|| + (-c _ && "char special") || "somekinda special"; + warn qq/skip ($why): $file\n/; + } + next; + } + + ## skip things we can't read + unless (-r _) { + if ($WHY) { + $why = (-l $file) ? "follow" : "read"; + warn qq/skip (can't $why): $file\n/; + } + next; + } + + ## skip things that are empty + unless (-s _ || -d _) { + warn qq/skip (empty): $file\n/ if $WHY; + next; + } + + ## Note file device & inode. If -xdev, skip if appropriate. + ($dev, $inode) = (stat(_))[$STAT_DEV, $STAT_INODE]; + if ($XDEV && defined $xdev{$dev}) { + warn qq/skip (other device): $file\n/ if $WHY; + next; + } + $id = "$dev,$inode"; + + ## special work for a directory + if (-d _) { + ## Do checks for directory file endings. + if ($DO_DSKIP_TEST && (eval $DSKIP_TEST)) { + warn qq/skip (-dskip): $file\n/ if $WHY; + next; + } + ## do checks for -name/-regex/-path tests + if ($DO_DGLOB_TESTS && !(eval $DGLOB_TESTS)) { + warn qq/skip (dirname): $file\n/ if $WHY; + next; + } + + ## _never_ redo a directory + if (defined $dir_done{$id} and $^O ne 'MSWin32') { + warn qq/skip (did as "$dir_done{$id}"): $file\n/ if $WHY; + next; + } + $dir_done{$id} = $file; ## mark it done. + unshift(@todo, $file); ## add to the list to do. + next; + } + if ($WHY == 0 && $VERBOSE > 1) { + if ($VERBOSE>2||$vv_print++>$VV_PRINT_COUNT||($vv_size+=-s _)>$VV_SIZE){ + &message($file); + $vv_print = $vv_size = 0; + } + } + + ## do time-related tests + if ($NEWER || $OLDER) { + $_ = (stat(_))[$STAT_MTIME]; + if ($NEWER && $_ < $NEWER) { + warn qq/skip (too old): $file\n/ if $WHY; + next; + } + if ($OLDER && $_ > $OLDER) { + warn qq/skip (too new): $file\n/ if $WHY; + next; + } + } + + ## do checks for file endings + if ($DO_SKIP_TEST && (eval $SKIP_TEST)) { + warn qq/skip (-skip): $file\n/ if $WHY; + next; + } + + ## do checks for -name/-regex/-path tests + if ($DO_GLOB_TESTS && !(eval $GLOB_TESTS)) { + warn qq/skip (filename): $file\n/ if $WHY; + next; + } + + + ## If we're not repeating files, + ## skip this one if we've done it, or note we're doing it. + unless ($DOREP) { + if (defined $file_done{$id}) { + warn qq/skip (did as "$file_done{$id}"): $file\n/ if $WHY; + next; + } + $file_done{$id} = $file; + } + + if ($DO_MAGIC_TESTS) { + if (!open(FILE_IN, $file)) { + &clear_message if $VERBOSE && $STDERR_SCREWS_STDOUT; + warn qq/$0: can't open: $file\n/; + next; + } + unless (read(FILE_IN, $magic'H, $HEADER_BYTES)) { + &clear_message if $VERBOSE && $STDERR_SCREWS_STDOUT; + warn qq/$0: can't read from "$file"\n"/; + close(FILE_IN); + next; + } + + eval $MAGIC_TESTS; + if ($magic'val) { + close(FILE_IN); + warn qq/skip (magic): $file\n/ if $WHY; + next; + } + seek(FILE_IN, 0, 0); ## reset for later + } + + if ($WHY != 0 && $VERBOSE > 1) { + if ($VERBOSE>2||$vv_print++>$VV_PRINT_COUNT||($vv_size+=-s _)>$VV_SIZE){ + &message($file); + $vv_print = $vv_size = 0; + } + } + + if ($DELAY) { + sleep($DELAY); + } + + if ($FIND_ONLY) { + &clear_message if $VERBOSE && $STDERR_SCREWS_STDOUT; + print $file, "\n"; + $retval=0; ## we've found something + close(FILE_IN) if $DO_MAGIC_TESTS; + next; + } else { + ## if we weren't doing magic tests, file won't be open yet... + if (!$DO_MAGIC_TESTS && !open(FILE_IN, $file)) { + &clear_message if $VERBOSE && $STDERR_SCREWS_STDOUT; + warn qq/$0: can't open: $file\n/; + next; + } + if ($LIST_ONLY && $CAN_USE_FAST_LISTONLY) { + ## + ## This is rather complex, but buys us a LOT when we're just + ## listing files and not the individual internal lines. + ## + local($size) = 4096; ## block-size in which to do reads + local($nl); ## will point to $_'s ending newline. + local($read); ## will be how many bytes read. + local($_) = ''; ## Starts out empty + local($hold); ## (see below) + + while (($read = read(FILE_IN,$_,$size,length($_)))||length($_)) + { + undef @parts; + ## if read a full block, but no newline, need to read more. + while ($read == $size && ($nl = rindex($_, "\n")) < 0) { + push(@parts, $_); ## save that part + $read = read(FILE_IN, $_, $size); ## keep trying + } + + ## + ## If we had to save parts, must now combine them together. + ## adjusting $nl to reflect the now-larger $_. This should + ## be a lot more efficient than using any kind of .= in the + ## loop above. + ## + if (@parts) { + local($lastlen) = length($_); #only need if $nl >= 0 + $_ = join('', @parts, $_); + $nl = length($_) - ($lastlen - $nl) if $nl >= 0; + } + + ## + ## If we're at the end of the file, then we can use $_ as + ## is. Otherwise, we need to remove the final partial-line + ## and save it so that it'll be at the beginning of the + ## next read (where the rest of the line will be layed in + ## right after it). $hold will be what we should save + ## until next time. + ## + if ($read != $size || $nl < 0) { + $hold = ''; + } else { + $hold = substr($_, $nl + 1); + substr($_, $nl + 1) = ''; + } + + ## + ## Now have a bunch of full lines in $_. Use it. + ## + if (eval $REGEX_TEST) { + &clear_message if $VERBOSE && $STDERR_SCREWS_STDOUT; + print $file, "\n"; + $retval=0; ## we've found something + + last; + } + + ## Prepare for next read.... + $_ = $hold; + } + + } else { ## else not using faster block scanning..... + + $lines_printed = 0 if $NICE; + while () { + study; + next unless (eval $REGEX_TEST); + + ## + ## We found a matching line. + ## + $retval=0; + &clear_message if $VERBOSE && $STDERR_SCREWS_STDOUT; + if ($LIST_ONLY) { + print $file, "\n"; + last; + } else { + ## prepare to print line. + if ($NICE && $lines_printed++ == 0) { + print '-' x 70, "\n" if $NICE > 1; + print $file, ":\n"; + } + + ## + ## Print all the prelim stuff. This looks less efficient + ## than it needs to be, but that's so that when the eval + ## is compiled (and the tests are optimized away), the + ## result will be less actual PRINTs than the more natural + ## way of doing these tests.... + ## + if ($NICE) { + if ($REPORT_LINENUM) { + print " line $.: "; + } else { + print " "; + } + } elsif ($REPORT_LINENUM && $PREPEND_FILENAME) { + print "$file,:$.: "; + } elsif ($PREPEND_FILENAME) { + print "$file: "; + } elsif ($REPORT_LINENUM) { + print "$.: "; + } + print $_; + print "\n" unless m/\n$/; + } + } + print "\n" if ($NICE > 1) && $lines_printed; + } + close(FILE_IN); + } + } + closedir(DIR); +} + +__END__ +.00; ## finish .ig + +'di \" finish diversion--previous line must be blank +.nr nl 0-1 \" fake up transition to first page again +.nr % 0 \" start at page 1 +.\"__________________NORMAL_MAN_PAGE_BELOW_________________ +.ll+10n +.TH search 1 "Dec 17, 1994" +.SH SEARCH +search \- search files (a'la grep) in a whole directory tree. +.SH SYNOPSIS +search [ grep-like and find-like options] [regex ....] +.SH DESCRIPTION +.I Search +is more or less a combo of 'find' and 'grep' (although the regular +expression flavor is that of the perl being used, which is closer to +egrep's than grep's). + +.I Search +does generally the same kind of thing that +.nf + find | xargs egrep +.fi +does, but is +.I much +more powerful and efficient (and intuitive, I think). + +This manual describes +.I search +as of version "941227.4". You can always find the latest version at +.nf + http://www.wg.omron.co.jp/~jfriedl/perl/index.html +.fi + +.SH "QUICK EXAMPLE" +Basic use is simple: +.nf + % search jeff +.fi +will search files in the current directory, and all sub directories, for +files that have "jeff" in them. The lines will be listed with the +containing file's name prepended. +.PP +If you list more than one regex, such as with +.nf + % search jeff Larry Randal+ 'Stoc?k' 'C.*son' +.fi +then a line containing any of the regexes will be listed. +This makes it effectively the same as +.nf + % search 'jeff|Larry|Randal+|Stoc?k|C.*son' +.fi +However, listing them separately is much more efficient (and is easier +to type). +.PP +Note that in the case of these examples, the +.B \-w +(list whole-words only) option would be useful. +.PP +Normally, various kinds of files are automatically removed from consideration. +If it has has a certain ending (such as ".tar", ".Z", ".o", .etc), or if +the beginning of the file looks like a binary, it'll be excluded. +You can control exactly how this works -- see below. One quick way to +override this is to use the +.B \-all +option, which means to consider all the files that would normally be +automatically excluded. +Or, if you're curious, you can use +.B \-why +to have notes about what files are skipped (and why) printed to stderr. + +.SH "BASIC OVERVIEW" +Normally, the search starts in the current directory, considering files in +all subdirectories. + +You can use the +.I ~/.search +file to control ways to automatically exclude files. +If you don't have this file, a default one will kick in, which automatically +add +.nf + -skip .o .Z .gif +.fi +(among others) to exclude those kinds of files (which you probably want to +skip when searching for text, as is normal). +Files that look to be be binary will also be excluded. + +Files ending with "#" and "~" will also be excluded unless the +.B -x~ +option is given. + +You can use +.B -showrc +to show what kinds of files will normally be skipped. +See the section on the startup file +for more info. + +You can use the +.B -all +option to indicate you want to consider all files that would otherwise be +skipped by the startup file. + +Based upon various other flags (see "WHICH FILES TO CONSIDER" below), +more files might be removed from consideration. For example +.nf + -mtime 3 +.fi +will exclude files that aren't at least three days old (change the 3 to -3 +to exclude files that are more than three days old), while +.nf + -skip .* +.fi +would exclude any file beginning with a dot (of course, '.' and '..' are +special and always excluded). + +If you'd like to see what files are being excluded, and why, you can get the +list via the +.B \-why +option. + +If a file makes it past all the checks, it is then "considered". +This usually means it is greped for the regular expressions you gave +on the command line. + +If any of the regexes match a line, the line is printed. +However, if +.B -list +is given, just the filename is printed. Or, if +.B -nice +is given, a somewhat more (human-)readable output is generated. + +If you're searching a huge tree and want to keep informed about how +the search is progressing, +.B -v +will print (to stderr) the current directory being searched. +Using +.B -vv +will also print the current file "every so often", which could be useful +if a directory is huge. Using +.B -vvv +will print the update with every file. + +Below is the full listing of options. + +.SH "OPTIONS TELLING *WHERE* TO SEARCH" +.TP +.BI -dir " DIR" +Start searching at the named directory instead of the current directory. +If multiple +.B -dir +arguments are given, multiple trees will be searched. +.TP +.BI -ddir " DIR" +Like +.B -dir +except it flushes any previous +.B -dir +directories (i.e. "-dir A -dir B -dir C" will search A, B, and C, while +"-dir A -ddir B -dir C" will search only B and C. This might be of use +in the startup file (see that section below). +.TP +.B -xdev +Stay on the same filesystem as the starting directory/directories. +.TP +.B -sort +Sort the items in a directory before processing them. +Normally they are processed in whatever order they happen to be read from +the directory. +.TP +.B -nolinks +Don't follow symbolic links. Normally they're followed. + +.SH "OPTIONS CONTROLLING WHICH FILES TO CONSIDER AND EXCLUDE" +.TP +.BI -mtime " NUM" +Only consider files that were last changed more than +.I NUM +days ago +(less than +.I NUM +days if +.I NUM +has '-' prepended, i.e. "-mtime -2.5" means to consider files that +have been changed in the last two and a half days). +.TP +.B -older FILE +Only consider files that have not changed since +.I FILE +was last changed. +If there is any upper case in the "-older", "or equal" is added to the sense +of the test. Therefore, "search -older ./file regex" will never consider +"./file", while "search -Older ./file regex" will. + +If a file is a symbolic link, the time used is that of the file and not the +link. +.TP +.BI -newer " FILE" +Opposite of +.BR -older . +.TP +.BI -name " GLOB" +Only consider files that match the shell filename pattern +.IR GLOB . +The check is only done on a file's name (use +.B -path +to check the whole path, and use +.B -dname +to check directory names). + +Multiple specifications can be given by separating them with spaces, a'la +.nf + -name '*.c *.h' +.fi +to consider C source and header files. +If +.I GLOB +doesn't contain any special pattern characters, a '*' is prepended. +This last example could have been given as +.nf + -name '.c .h' +.fi +It could also be given as +.nf + -name .c -name .h +.fi +or +.nf + -name '*.c' -name '*.h' +.fi +or +.nf + -name '*.[ch]' +.fi +(among others) +but in this last case, you have to be sure to supply the leading '*'. +.TP +.BI -path " GLOB" +Like +.B -name +except the entire path is checked against the pattern. +.TP +.B -regex " REGEX" +Considers files whose names (not paths) match the given perl regex +exactly. +.TP +.BI -iname " GLOB" +Case-insensitive version of +.BR -name . +.TP +.BI -ipath " GLOB" +Case-insensitive version of +.BR -path . +.TP +.BI -iregex " REGEX" +Case-insensitive version of +.BR -regex . + +.TP +.BI -dpath " GLOB" +Only search down directories whose path matches the given pattern (this +doesn't apply to the initial directory given by +.BI -dir , +of course). +Something like +.nf + -dir /usr/man -dpath /usr/man/man* +.fi +would completely skip +"/usr/man/cat1", "/usr/man/cat2", etc. +.TP +.BI -dskip " GLOB" +Skips directories whose name (not path) matches the given pattern. +Something like +.nf + -dir /usr/man -dskip cat* +.fi +would completely skip any directory in the tree whose name begins with "cat" +(including "/usr/man/cat1", "/usr/man/cat2", etc.). +.TP +.BI -dregex " REGEX" +Like +.BI -dpath , +but the pattern is a full perl regex. Note that this quite different +from +.B -regex +which considers only file names (not paths). This option considers +full directory paths (not just names). It's much more useful this way. +Sorry if it's confusing. +.TP +.BI -dpath " GLOB" +This option exists, but is probably not very useful. It probably wants to +be like the '-below' or something I mention in the "TODO" section. +.TP +.BI -idpath " GLOB" +Case-insensitive version of +.BR -dpath . +.TP +.BI -idskip " GLOB" +Case-insensitive version of +.BR -dskip . +.TP +.BI -idregex " REGEX" +Case-insensitive version of +.BR -dregex . +.TP +.B -all +Ignore any 'magic' or 'option' lines in the startup file. +The effect is that all files that would otherwise be automatically +excluded are considered. +.TP +.BI -x SPECIAL +Arguments starting with +.B -x +(except +.BR -xdev , +explained elsewhere) do special interaction with the +.I ~/.search +startup file. Something like +.nf + -xflag1 -xflag2 +.fi +will turn on "flag1" and "flag2" in the startup file (and is +the same as "-xflag1,flag2"). You can use this to write your own +rules for what kinds of files are to be considered. + +For example, the internal-default startup file contains the line +.nf + option: -skip '~ #' +.fi +This means that if the +.B -x~ +flag is +.I not +seen, the option +.nf + -skip '~ #' +.fi +should be done. +The effect is that emacs temp and backup files are not normally +considered, but you can included them with the -x~ flag. + +You can write your own rules to customize +.I search +in powerful ways. See the STARTUP FILE section below. +.TP +.B -why +Print a message (to stderr) when and why a file is not considered. + +.SH "OPTIONS TELLING WHAT TO DO WITH FILES THAT WILL BE CONSIDERED" +.TP +.B -find +(you can use +.B -f +as well). +This option changes the basic action of +.IR search . + +Normally, if a file is considered, it is searched +for the regular expressions as described earlier. However, if this option +is given, the filename is printed and no searching takes place. This turns +.I search +into a 'find' of some sorts. + +In this case, no regular expressions are needed on the command line +(any that are there are silently ignored). + +This is not intended to be a replacement for the 'find' program, +but to aid +you in understanding just what files are getting past the exclusion checks. +If you really want to use it as a sort of replacement for the 'find' program, +you might want to use +.B -all +so that it doesn't waste time checking to see if the file is binary, etc +(unless you really want that, of course). + +If you use +.BR -find , +none of the "GREP-LIKE OPTIONS" (below) matter. + +As a replacement for 'find', +.I search +is probably a bit slower (or in the case of GNU find, a lot slower -- +GNU find is +.I unbelievably +fast). +However, "search -ffind" +might be more useful than 'find' when options such as +.B -skip +are used (at least until 'find' gets such functionality). +.TP +.B -ffind +(or +.BR -ff ) +A faster more 'find'-like find. Does +.nf + -find -all -dorep +.fi +.SH "GREP-LIKE OPTIONS" +These options control how a searched file is accessed, +and how things are printed. +.TP +.B -i +Ignore letter case when matching. +.TP +.B -w +Consider only whole-word matches ("whole word" as defined by perl's "\\b" +regex). +.TP +.B -u +If the regex(es) is/are simple, try to modify them so that they'll work +in manpage-like underlined text (i.e. like _^Ht_^Hh_^Hi_^Hs). +This is very rudimentary at the moment. +.TP +.B -list +(you can use +.B -l +too). +Don't print matching lines, but the names of files that contain matching +lines. This will likely be *much* faster, as special optimizations are +made -- particularly with large files. +.TP +.B -n +Pepfix each line by its line number. +.TP +.B -nice +Not a grep-like option, but similar to +.BR -list , +so included here. +.B -nice +will have the output be a bit more human-readable, with matching lines printed +slightly indented after the filename, a'la +.nf + + % search foo + somedir/somefile: line with foo in it + somedir/somefile: some food for thought + anotherdir/x: don't be a buffoon! + % + +.fi +will become +.nf + + % search -nice foo + somedir/somefile: + line with foo in it + some food for thought + anotherdir/x: + don't be a buffoon! + % + +.fi +This option due to Lionel Cons. +.TP +.B -nnice +Be a bit nicer than +.BR -nice . +Prefix each file's output by a rule line, and follow with an extra blank line. +.TP +.B -h +Don't prepend each output line with the name of the file +(meaningless when +.B -find +or +.B -l +are given). + +.SH "OTHER OPTIONS" +.TP +.B -help +Print the usage information. +.TP +.B -version +Print the version information and quit. +.TP +.B -v +Set the level of message verbosity. +.B -v +will print a note whenever a new directory is entered. +.B -vv +will also print a note "every so often". This can be useful to see +what's happening when searching huge directories. +.B -vvv +will print a new with every file. +.B -vvvv +is +-vvv +plus +.BR -why . +.TP +.B -e +This ends the options, and can be useful if the regex begins with '-'. +.TP +.B -showrc +Shows what is being considered in the startup file, then exits. +.TP +.B -dorep +Normally, an identical file won't be checked twice (even with multiple +hard or symbolic links). If you're just trying to do a fast +.BR -find , +the bookkeeping to remember which files have been seen is not desirable, +so you can eliminate the bookkeeping with this flag. + +.SH "STARTUP FILE" +When +.I search +starts up, it processes the directives in +.IR ~/.search . +If no such file exists, a default +internal version is used. + +The internal version looks like: +.nf + + magic: 32 : $H =~ m/[\ex00-\ex06\ex10-\ex1a\ex1c-\ex1f\ex80\exff]{2}/ + option: -skip '.a .COM .elc .EXE .gz .o .pbm .xbm .dvi' + option: -iskip '.tarz .zip .z .lzh .jpg .jpeg .gif .uu' + option: -skip '~ #' + +.fi +If you wish to create your own "~/.search", +you might consider copying the above, and then working from there. + +There are two kinds of directives in a startup file: "magic" and "option". +.RS 0n +.TP +OPTION +Option lines will automatically do the command-line options given. +For example, the line +.nf + option: -v +.fi +in you startup file will turn on -v every time, without needing to type it +on the command line. + +The text on the line after the "option:" directive is processed +like the Bourne shell, so make sure to pay attention to quoting. +.nf + option: -skip .exe .com +.fi +will give an error (".com" by itself isn't a valid option), while +.nf + option: -skip ".exe .com" +.fi +will properly include it as part of -skip's argument. + +.TP +MAGIC +Magic lines are used to determine if a file should be considered a binary +or not (the term "magic" refers to checking a file's magic number). These +are described in more detail below. +.RE + +Blank lines and comments (lines beginning with '#') are allowed. + +If a line begins with <...>, then it's a check to see if the +directive on the line should be done or not. The stuff inside the <...> +can contain perl's && (and), || (or), ! (not), and parens for grouping, +along with "flags" that might be indicated by the user with +.BI -x flag +options. + +For example, using "-xfoo" will cause "foo" to be true inside the <...> +blocks. Therefore, a line beginning with "" would be done only when +"-xfoo" had been specified, while a line beginning with "" would be +done only when "-xfoo" is not specified (of course, a line without any <...> +is done in either case). + +A realistic example might be +.nf + -vv +.fi +This will cause -vv messages to be the default, but allow "-xv" to override. + +There are a few flags that are set automatically: +.RS +.TP +.B TTY +true if the output is to the screen (as opposed to being redirected to a file). +You can force this (as with all the other automatic flags) with -xTTY. +.TP +.B -v +True if -v was specified. If -vv was specified, both +.B -v +and +.B -vv +flags are true (and so on). +.TP +.B -nice +True if -nice was specified. Same thing about -nnice as for -vv. +.PP +.TP +.B -list +true if -list (or -l) was given. +.TP +.B -dir +true if -dir was given. +.RE + +Using this info, you might change the last example to +.nf + + option: -vv + +.fi +The added "&& !-v" means "and if the '-v' option not given". +This will allow you to use "-v" alone on the command line, and not +have this directive add the more verbose "-vv" automatically. + +.RS 0 +Some other examples: +.TP + option: -dir ~/ +Effectively make the default directory your home directory (instead of the +current directory). Using -dir or -xhere will undo this. +.TP + option: -name .tex -dir ~/pub +Create '-xtex' to search only "*.tex" files in your ~/pub directory tree. +Actually, this could be made a bit better. If you combine '-xtex' and '-dir' +on the command line, this directive will add ~/pub to the list, when you +probably want to use the -dir directory only. You could do +.nf + + option: -name .tex + option: -dir ~/pub +.fi + +to will allow '-xtex' to work as before, but allow a command-line "-dir" +to take precedence with respect to ~/pub. +.TP + option: -nnice -sort -i -vvv +Combine a few user-friendly options into one '-xfluff' option. +.TP + option: -ddir /usr/man -v -w +When the '-xman' option is given, search "/usr/man" for whole-words +(of whatever regex or regexes are given on the command line), with -v. +.RE + +The lines in the startup file are executed from top to bottom, so something +like +.nf + + option: -xflag1 -xflag2 + option: ...whatever... + option: ...whatever... + +.fi +will allow '-xboth' to be the same as '-xflag1 -xflag2' (or '-xflag1,flag2' +for that matter). However, if you put the "" line below the others, +they will not be true when encountered, so the result would be different +(and probably undesired). + +The "magic" directives are used to determine if a file looks to be binary +or not. The form of a magic line is +.nf + magic: \fISIZE\fP : \fIPERLCODE\fP +.fi +where +.I SIZE +is the number of bytes of the file you need to check, and +.I PERLCODE +is the code to do the check. Within +.IR PERLCODE , +the variable $H will hold at least the first +.I SIZE +bytes of the file (unless the file is shorter than that, of course). +It might hold more bytes. The perl should evaluate to true if the file +should be considered a binary. + +An example might be +.nf + magic: 6 : substr($H, 0, 6) eq 'GIF87a' +.fi +to test for a GIF ("-iskip .gif" is better, but this might be useful +if you have images in files without the ".gif" extension). + +Since the startup file is checked from top to bottom, you can be a bit +efficient: +.nf + magic: 6 : ($x6 = substr($H, 0, 6)) eq 'GIF87a' + magic: 6 : $x6 eq 'GIF89a' +.fi +You could also write the same thing as +.nf + magic: 6 : (($x6 = substr($H, 0, 6)) eq 'GIF87a') || ## an old gif, or.. \e + $x6 eq 'GIF89a' ## .. a new one. +.fi +since newlines may be escaped. + +The default internal startup file includes +.nf + magic: 32 : $H =~ m/[\ex00-\ex06\ex10-\ex1a\ex1c-\ex1f\ex80\exff]{2}/ +.fi +which checks for certain non-printable characters, and catches a large +number of binary files, including most system's executables, linkable +objects, compressed, tarred, and otherwise folded, spindled, and mutilated +files. + +Another example might be +.nf + ## an archive library + magic: 17 : substr($H, 0, 17) eq "!\en__.SYMDEF" +.fi + +.SH "RETURN VALUE" +.I Search +returns zero if lines (or files, if appropriate) were found, +or if no work was requested (such as with +.BR -help ). +Returns 1 if no lines (or files) were found. +Returns 2 on error. + +.SH TODO +Things I'd like to add some day: +.nf + + show surrounding lines (context). + + highlight matched portions of lines. + + add '-and', which can go between regexes to override + the default logical or of the regexes. + + add something like + -below GLOB + which will examine a tree and only consider files that + lie in a directory deeper than one named by the pattern. + + add 'warning' and 'error' directives. + + add 'help' directive. +.fi +.SH BUGS +If -xdev and multiple -dir arguments are given, any file in any of the +target filesystems are allowed. It would be better to allow each filesystem +for each separate tree. + +Multiple -dir args might also cause some confusing effects. Doing +.nf + -dir some/dir -dir other +.fi +will search "some/dir" completely, then search "other" completely. This +is good. However, something like +.nf + -dir some/dir -dir some/dir/more/specific +.fi +will search "some/dir" completely *except for* "some/dir/more/specific", +after which it will return and be searched. Not really a bug, but just sort +of odd. + +File times (for -newer, etc.) of symbolic links are for the file, not the +link. This could cause some misunderstandings. + +Probably more. Please let me know. +.SH AUTHOR +Jeffrey Friedl, Omron Corp (jfriedl@omron.co.jp) +.br +http://www.wg.omron.co.jp/cgi-bin/j-e/jfriedl.html + +.SH "LATEST SOURCE" +See http://www.wg.omron.co.jp/~jfriedl/perl/index.html diff --git a/wince/config.ce b/wince/config.ce new file mode 100644 index 0000000..5fd9d62 --- /dev/null +++ b/wince/config.ce @@ -0,0 +1,787 @@ +## Configured by: ~cf_email~ +## Target system: WINCE +Author='Rainer Keuchel + * or defines the symbol DBL_DIG, which is the number + * of significant digits in a double precision number. If this + * symbol is not defined, a guess of 15 is usually pretty good. + */ +#define HAS_DBL_DIG /**/ + +/* HAS_DIFFTIME: + * This symbol, if defined, indicates that the difftime routine is + * available. + */ +#define HAS_DIFFTIME /**/ + +/* HAS_DLERROR: + * This symbol, if defined, indicates that the dlerror routine is + * available to return a string describing the last error that + * occurred from a call to dlopen(), dlclose() or dlsym(). + */ +#define HAS_DLERROR /**/ + +/* HAS_DUP2: + * This symbol, if defined, indicates that the dup2 routine is + * available to duplicate file descriptors. + */ +#define HAS_DUP2 /**/ + +/* HAS_FCHMOD: + * This symbol, if defined, indicates that the fchmod routine is available + * to change mode of opened files. If unavailable, use chmod(). + */ +/*#define HAS_FCHMOD /**/ + +/* HAS_FCHOWN: + * This symbol, if defined, indicates that the fchown routine is available + * to change ownership of opened files. If unavailable, use chown(). + */ +/*#define HAS_FCHOWN /**/ + +/* HAS_FCNTL: + * This symbol, if defined, indicates to the C program that + * the fcntl() function exists. + */ +/*#define HAS_FCNTL /**/ + +/* HAS_FGETPOS: + * This symbol, if defined, indicates that the fgetpos routine is + * available to get the file position indicator, similar to ftell(). + */ +#define HAS_FGETPOS /**/ + +/* HAS_FLOCK: + * This symbol, if defined, indicates that the flock routine is + * available to do file locking. + */ +/*#define HAS_FLOCK /**/ + +/* HAS_FORK: + * This symbol, if defined, indicates that the fork routine is + * available. + */ +/*#define HAS_FORK /**/ + +/* HAS_FSETPOS: + * This symbol, if defined, indicates that the fsetpos routine is + * available to set the file position indicator, similar to fseek(). + */ +#define HAS_FSETPOS /**/ + +/* HAS_GETTIMEOFDAY: + * This symbol, if defined, indicates that the gettimeofday() system + * call is available for a sub-second accuracy clock. Usually, the file + * needs to be included (see I_SYS_RESOURCE). + * The type "Timeval" should be used to refer to "struct timeval". + */ +/*#define HAS_GETTIMEOFDAY /**/ +#ifdef HAS_GETTIMEOFDAY +#define Timeval struct timeval /* Structure used by gettimeofday() */ +#endif + +/* HAS_GETGROUPS: + * This symbol, if defined, indicates that the getgroups() routine is + * available to get the list of process groups. If unavailable, multiple + * groups are probably not supported. + */ +/*#define HAS_GETGROUPS /**/ + +/* HAS_GETLOGIN: + * This symbol, if defined, indicates that the getlogin routine is + * available to get the login name. + */ +#define HAS_GETLOGIN /**/ + +/* HAS_GETPGID: + * This symbol, if defined, indicates to the C program that + * the getpgid(pid) function is available to get the + * process group id. + */ +/*#define HAS_GETPGID /**/ + +/* HAS_GETPGRP2: + * This symbol, if defined, indicates that the getpgrp2() (as in DG/UX) + * routine is available to get the current process group. + */ +/*#define HAS_GETPGRP2 /**/ + +/* HAS_GETPPID: + * This symbol, if defined, indicates that the getppid routine is + * available to get the parent process ID. + */ +/*#define HAS_GETPPID /**/ + +/* HAS_GETPRIORITY: + * This symbol, if defined, indicates that the getpriority routine is + * available to get a process's priority. + */ +/*#define HAS_GETPRIORITY /**/ + +/* HAS_INET_ATON: + * This symbol, if defined, indicates to the C program that the + * inet_aton() function is available to parse IP address "dotted-quad" + * strings. + */ +/*#define HAS_INET_ATON /**/ + +/* HAS_KILLPG: + * This symbol, if defined, indicates that the killpg routine is available + * to kill process groups. If unavailable, you probably should use kill + * with a negative process number. + */ +/*#define HAS_KILLPG /**/ + +/* HAS_LINK: + * This symbol, if defined, indicates that the link routine is + * available to create hard links. + */ +#define HAS_LINK /**/ + +/* HAS_LOCALECONV: + * This symbol, if defined, indicates that the localeconv routine is + * available for numeric and monetary formatting conventions. + */ +#define HAS_LOCALECONV /**/ + +/* HAS_LOCKF: + * This symbol, if defined, indicates that the lockf routine is + * available to do file locking. + */ +/*#define HAS_LOCKF /**/ + +/* HAS_LSTAT: + * This symbol, if defined, indicates that the lstat routine is + * available to do file stats on symbolic links. + */ +/*#define HAS_LSTAT /**/ + +/* HAS_MBLEN: + * This symbol, if defined, indicates that the mblen routine is available + * to find the number of bytes in a multibye character. + */ +#define HAS_MBLEN /**/ + +/* HAS_MBSTOWCS: + * This symbol, if defined, indicates that the mbstowcs routine is + * available to covert a multibyte string into a wide character string. + */ +#define HAS_MBSTOWCS /**/ + +/* HAS_MBTOWC: + * This symbol, if defined, indicates that the mbtowc routine is available + * to covert a multibyte to a wide character. + */ +#define HAS_MBTOWC /**/ + +/* HAS_MEMCMP: + * This symbol, if defined, indicates that the memcmp routine is available + * to compare blocks of memory. + */ +#define HAS_MEMCMP /**/ + +/* HAS_MEMCPY: + * This symbol, if defined, indicates that the memcpy routine is available + * to copy blocks of memory. + */ +#define HAS_MEMCPY /**/ + +/* HAS_MEMMOVE: + * This symbol, if defined, indicates that the memmove routine is available + * to copy potentially overlapping blocks of memory. This should be used + * only when HAS_SAFE_BCOPY is not defined. If neither is there, roll your + * own version. + */ +#define HAS_MEMMOVE /**/ + +/* HAS_MEMSET: + * This symbol, if defined, indicates that the memset routine is available + * to set blocks of memory. + */ +#define HAS_MEMSET /**/ + +/* HAS_MKDIR: + * This symbol, if defined, indicates that the mkdir routine is available + * to create directories. Otherwise you should fork off a new process to + * exec /bin/mkdir. + */ +#define HAS_MKDIR /**/ + +/* HAS_MKFIFO: + * This symbol, if defined, indicates that the mkfifo routine is + * available to create FIFOs. Otherwise, mknod should be able to + * do it for you. However, if mkfifo is there, mknod might require + * super-user privileges which mkfifo will not. + */ +/*#define HAS_MKFIFO /**/ + +/* HAS_MKTIME: + * This symbol, if defined, indicates that the mktime routine is + * available. + */ +#define HAS_MKTIME /**/ + +/* HAS_MSYNC: + * This symbol, if defined, indicates that the msync system call is + * available to synchronize a mapped file. + */ +/*#define HAS_MSYNC /**/ + +/* HAS_MUNMAP: + * This symbol, if defined, indicates that the munmap system call is + * available to unmap a region, usually mapped by mmap(). + */ +/*#define HAS_MUNMAP /**/ + +/* HAS_NICE: + * This symbol, if defined, indicates that the nice routine is + * available. + */ +/*#define HAS_NICE /**/ + +/* HAS_PATHCONF: + * This symbol, if defined, indicates that pathconf() is available + * to determine file-system related limits and options associated + * with a given filename. + */ +/* HAS_FPATHCONF: + * This symbol, if defined, indicates that pathconf() is available + * to determine file-system related limits and options associated + * with a given open file descriptor. + */ +/*#define HAS_PATHCONF /**/ +/*#define HAS_FPATHCONF /**/ + +/* HAS_PAUSE: + * This symbol, if defined, indicates that the pause routine is + * available to suspend a process until a signal is received. + */ +#define HAS_PAUSE /**/ + +/* HAS_PIPE: + * This symbol, if defined, indicates that the pipe routine is + * available to create an inter-process channel. + */ +/*#define HAS_PIPE /**/ + +/* HAS_POLL: + * This symbol, if defined, indicates that the poll routine is + * available to poll active file descriptors. You may safely + * include when this symbol is defined. + */ +/*#define HAS_POLL /**/ + +/* HAS_READDIR: + * This symbol, if defined, indicates that the readdir routine is + * available to read directory entries. You may have to include + * . See I_DIRENT. + */ +#define HAS_READDIR /**/ + +/* HAS_SEEKDIR: + * This symbol, if defined, indicates that the seekdir routine is + * available. You may have to include . See I_DIRENT. + */ +#define HAS_SEEKDIR /**/ + +/* HAS_TELLDIR: + * This symbol, if defined, indicates that the telldir routine is + * available. You may have to include . See I_DIRENT. + */ +#define HAS_TELLDIR /**/ + +/* HAS_REWINDDIR: + * This symbol, if defined, indicates that the rewinddir routine is + * available. You may have to include . See I_DIRENT. + */ +#define HAS_REWINDDIR /**/ + +/* HAS_READLINK: + * This symbol, if defined, indicates that the readlink routine is + * available to read the value of a symbolic link. + */ +/*#define HAS_READLINK /**/ + +/* HAS_RENAME: + * This symbol, if defined, indicates that the rename routine is available + * to rename files. Otherwise you should do the unlink(), link(), unlink() + * trick. + */ +#define HAS_RENAME /**/ + +/* HAS_RMDIR: + * This symbol, if defined, indicates that the rmdir routine is + * available to remove directories. Otherwise you should fork off a + * new process to exec /bin/rmdir. + */ +#define HAS_RMDIR /**/ + +/* HAS_SELECT: + * This symbol, if defined, indicates that the select routine is + * available to select active file descriptors. If the timeout field + * is used, may need to be included. + */ +#define HAS_SELECT /**/ + +/* HAS_SETEGID: + * This symbol, if defined, indicates that the setegid routine is available + * to change the effective gid of the current program. + */ +/*#define HAS_SETEGID /**/ + +/* HAS_SETEUID: + * This symbol, if defined, indicates that the seteuid routine is available + * to change the effective uid of the current program. + */ +/*#define HAS_SETEUID /**/ + +/* HAS_SETLINEBUF: + * This symbol, if defined, indicates that the setlinebuf routine is + * available to change stderr or stdout from block-buffered or unbuffered + * to a line-buffered mode. + */ +/*#define HAS_SETLINEBUF /**/ + +/* HAS_SETLOCALE: + * This symbol, if defined, indicates that the setlocale routine is + * available to handle locale-specific ctype implementations. + */ +/*#define HAS_SETLOCALE /**/ + +/* HAS_SETPGID: + * This symbol, if defined, indicates that the setpgid(pid, gpid) + * routine is available to set process group ID. + */ +/*#define HAS_SETPGID /**/ + +/* HAS_SETPGRP2: + * This symbol, if defined, indicates that the setpgrp2() (as in DG/UX) + * routine is available to set the current process group. + */ +/*#define HAS_SETPGRP2 /**/ + +/* HAS_SETPRIORITY: + * This symbol, if defined, indicates that the setpriority routine is + * available to set a process's priority. + */ +/*#define HAS_SETPRIORITY /**/ + +/* HAS_SETREGID: + * This symbol, if defined, indicates that the setregid routine is + * available to change the real and effective gid of the current + * process. + */ +/* HAS_SETRESGID: + * This symbol, if defined, indicates that the setresgid routine is + * available to change the real, effective and saved gid of the current + * process. + */ +/*#define HAS_SETREGID /**/ +/*#define HAS_SETRESGID /**/ + +/* HAS_SETREUID: + * This symbol, if defined, indicates that the setreuid routine is + * available to change the real and effective uid of the current + * process. + */ +/* HAS_SETRESUID: + * This symbol, if defined, indicates that the setresuid routine is + * available to change the real, effective and saved uid of the current + * process. + */ +/*#define HAS_SETREUID /**/ +/*#define HAS_SETRESUID /**/ + +/* HAS_SETRGID: + * This symbol, if defined, indicates that the setrgid routine is available + * to change the real gid of the current program. + */ +/*#define HAS_SETRGID /**/ + +/* HAS_SETRUID: + * This symbol, if defined, indicates that the setruid routine is available + * to change the real uid of the current program. + */ +/*#define HAS_SETRUID /**/ + +/* HAS_SETSID: + * This symbol, if defined, indicates that the setsid routine is + * available to set the process group ID. + */ +/*#define HAS_SETSID /**/ + +/* Shmat_t: + * This symbol holds the return type of the shmat() system call. + * Usually set to 'void *' or 'char *'. + */ +/* HAS_SHMAT_PROTOTYPE: + * This symbol, if defined, indicates that the sys/shm.h includes + * a prototype for shmat(). Otherwise, it is up to the program to + * guess one. Shmat_t shmat _((int, Shmat_t, int)) is a good guess, + * but not always right so it should be emitted by the program only + * when HAS_SHMAT_PROTOTYPE is not defined to avoid conflicting defs. + */ +#define Shmat_t void * /**/ +/*#define HAS_SHMAT_PROTOTYPE /**/ + +/* HAS_STRCHR: + * This symbol is defined to indicate that the strchr()/strrchr() + * functions are available for string searching. If not, try the + * index()/rindex() pair. + */ +/* HAS_INDEX: + * This symbol is defined to indicate that the index()/rindex() + * functions are available for string searching. + */ +#define HAS_STRCHR /**/ +/*#define HAS_INDEX /**/ + +/* HAS_STRCOLL: + * This symbol, if defined, indicates that the strcoll routine is + * available to compare strings using collating information. + */ +/*#define HAS_STRCOLL /**/ + +/* USE_STRUCT_COPY: + * This symbol, if defined, indicates that this C compiler knows how + * to copy structures. If undefined, you'll need to use a block copy + * routine of some sort instead. + */ +#define USE_STRUCT_COPY /**/ + +/* HAS_STRTOD: + * This symbol, if defined, indicates that the strtod routine is + * available to provide better numeric string conversion than atof(). + */ +#define HAS_STRTOD /**/ + +/* HAS_STRTOL: + * This symbol, if defined, indicates that the strtol routine is available + * to provide better numeric string conversion than atoi() and friends. + */ +#define HAS_STRTOL /**/ + +/* HAS_STRXFRM: + * This symbol, if defined, indicates that the strxfrm() routine is + * available to transform strings. + */ +/*#define HAS_STRXFRM /**/ + +/* HAS_SYMLINK: + * This symbol, if defined, indicates that the symlink routine is available + * to create symbolic links. + */ +/*#define HAS_SYMLINK /**/ + +/* HAS_SYSCALL: + * This symbol, if defined, indicates that the syscall routine is + * available to call arbitrary system calls. If undefined, that's tough. + */ +/*#define HAS_SYSCALL /**/ + +/* HAS_SYSCONF: + * This symbol, if defined, indicates that sysconf() is available + * to determine system related limits and options. + */ +/*#define HAS_SYSCONF /**/ + +/* HAS_SYSTEM: + * This symbol, if defined, indicates that the system routine is + * available to issue a shell command. + */ +#define HAS_SYSTEM /**/ + +/* HAS_TCGETPGRP: + * This symbol, if defined, indicates that the tcgetpgrp routine is + * available to get foreground process group ID. + */ +/*#define HAS_TCGETPGRP /**/ + +/* HAS_TCSETPGRP: + * This symbol, if defined, indicates that the tcsetpgrp routine is + * available to set foreground process group ID. + */ +/*#define HAS_TCSETPGRP /**/ + +/* HAS_TRUNCATE: + * This symbol, if defined, indicates that the truncate routine is + * available to truncate files. + */ +/*#define HAS_TRUNCATE /**/ + +/* HAS_TZNAME: + * This symbol, if defined, indicates that the tzname[] array is + * available to access timezone names. + */ +#define HAS_TZNAME /**/ + +/* HAS_UMASK: + * This symbol, if defined, indicates that the umask routine is + * available to set and get the value of the file creation mask. + */ +#define HAS_UMASK /**/ + +/* HAS_USLEEP: + * This symbol, if defined, indicates that the usleep routine is + * available to let the process sleep on a sub-second accuracy. + */ +/*#define HAS_USLEEP /**/ + +/* HASVOLATILE: + * This symbol, if defined, indicates that this C compiler knows about + * the volatile declaration. + */ +#define HASVOLATILE /**/ +#ifndef HASVOLATILE +#define volatile +#endif + +/* HAS_WAIT4: + * This symbol, if defined, indicates that wait4() exists. + */ +/*#define HAS_WAIT4 /**/ + +/* HAS_WAITPID: + * This symbol, if defined, indicates that the waitpid routine is + * available to wait for child process. + */ +#define HAS_WAITPID /**/ + +/* HAS_WCSTOMBS: + * This symbol, if defined, indicates that the wcstombs routine is + * available to convert wide character strings to multibyte strings. + */ +#define HAS_WCSTOMBS /**/ + +/* HAS_WCTOMB: + * This symbol, if defined, indicates that the wctomb routine is available + * to covert a wide character to a multibyte. + */ +#define HAS_WCTOMB /**/ + +/* I_ARPA_INET: + * This symbol, if defined, indicates to the C program that it should + * include to get inet_addr and friends declarations. + */ +#define I_ARPA_INET /**/ + +/* I_DBM: + * This symbol, if defined, indicates that exists and should + * be included. + */ +/* I_RPCSVC_DBM: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_DBM /**/ +#define I_RPCSVC_DBM /**/ + +/* I_DIRENT: + * This symbol, if defined, indicates to the C program that it should + * include . Using this symbol also triggers the definition + * of the Direntry_t define which ends up being 'struct dirent' or + * 'struct direct' depending on the availability of . + */ +/* DIRNAMLEN: + * This symbol, if defined, indicates to the C program that the length + * of directory entry names is provided by a d_namlen field. Otherwise + * you need to do strlen() on the d_name field. + */ +/* Direntry_t: + * This symbol is set to 'struct direct' or 'struct dirent' depending on + * whether dirent is available or not. You should use this pseudo type to + * portably declare your directory entries. + */ +#define I_DIRENT /**/ +#define DIRNAMLEN /**/ +#define Direntry_t struct direct + +/* I_DLFCN: + * This symbol, if defined, indicates that exists and should + * be included. + */ +#define I_DLFCN /**/ + +/* I_FCNTL: + * This manifest constant tells the C program to include . + */ +#define I_FCNTL /**/ + +/* I_FLOAT: + * This symbol, if defined, indicates to the C program that it should + * include to get definition of symbols like DBL_MAX or + * DBL_MIN, i.e. machine dependent floating point values. + */ +#define I_FLOAT /**/ + +/* I_LIMITS: + * This symbol, if defined, indicates to the C program that it should + * include to get definition of symbols like WORD_BIT or + * LONG_MAX, i.e. machine dependant limitations. + */ +#define I_LIMITS /**/ + +/* I_LOCALE: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/*#define I_LOCALE /**/ + +/* I_MATH: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +#define I_MATH /**/ + +/* I_MEMORY: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/*#define I_MEMORY /**/ + +/* I_NDBM: + * This symbol, if defined, indicates that exists and should + * be included. + */ +/*#define I_NDBM /**/ + +/* I_NET_ERRNO: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_NET_ERRNO /**/ + +/* I_NETINET_IN: + * This symbol, if defined, indicates to the C program that it should + * include . Otherwise, you may try . + */ +/*#define I_NETINET_IN /**/ + +/* I_SFIO: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/*#define I_SFIO /**/ + +/* I_STDDEF: + * This symbol, if defined, indicates that exists and should + * be included. + */ +#define I_STDDEF /**/ + +/* I_STDLIB: + * This symbol, if defined, indicates that exists and should + * be included. + */ +#define I_STDLIB /**/ + +/* I_STRING: + * This symbol, if defined, indicates to the C program that it should + * include (USG systems) instead of (BSD systems). + */ +#define I_STRING /**/ + +/* I_SYS_DIR: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/*#define I_SYS_DIR /**/ + +/* I_SYS_FILE: + * This symbol, if defined, indicates to the C program that it should + * include to get definition of R_OK and friends. + */ +/*#define I_SYS_FILE /**/ + +/* I_SYS_IOCTL: + * This symbol, if defined, indicates that exists and should + * be included. Otherwise, include or . + */ +/* I_SYS_SOCKIO: + * This symbol, if defined, indicates the should be included + * to get socket ioctl options, like SIOCATMARK. + */ +/*#define I_SYS_IOCTL /**/ +/*#define I_SYS_SOCKIO /**/ + +/* I_SYS_NDIR: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/*#define I_SYS_NDIR /**/ + +/* I_SYS_PARAM: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/*#define I_SYS_PARAM /**/ + +/* I_SYS_RESOURCE: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/*#define I_SYS_RESOURCE /**/ + +/* I_SYS_SELECT: + * This symbol, if defined, indicates to the C program that it should + * include in order to get definition of struct timeval. + */ +/*#define I_SYS_SELECT /**/ + +/* I_SYS_STAT: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +#define I_SYS_STAT /**/ + +/* I_SYS_TIMES: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/*#define I_SYS_TIMES /**/ + +/* I_SYS_TYPES: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/*#define I_SYS_TYPES /**/ + +/* I_SYS_UN: + * This symbol, if defined, indicates to the C program that it should + * include to get UNIX domain socket definitions. + */ +/*#define I_SYS_UN /**/ + +/* I_SYS_WAIT: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/*#define I_SYS_WAIT /**/ + +/* I_TERMIO: + * This symbol, if defined, indicates that the program should include + * rather than . There are also differences in + * the ioctl() calls that depend on the value of this symbol. + */ +/* I_TERMIOS: + * This symbol, if defined, indicates that the program should include + * the POSIX termios.h rather than sgtty.h or termio.h. + * There are also differences in the ioctl() calls that depend on the + * value of this symbol. + */ +/* I_SGTTY: + * This symbol, if defined, indicates that the program should include + * rather than . There are also differences in + * the ioctl() calls that depend on the value of this symbol. + */ +/*#define I_TERMIO /**/ +/*#define I_TERMIOS /**/ +/*#define I_SGTTY /**/ + +/* I_UNISTD: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/*#define I_UNISTD /**/ + +/* I_UTIME: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +#define I_UTIME /**/ + +/* I_VALUES: + * This symbol, if defined, indicates to the C program that it should + * include to get definition of symbols like MINFLOAT or + * MAXLONG, i.e. machine dependant limitations. Probably, you + * should use instead, if it is available. + */ +/*#define I_VALUES /**/ + +/* I_VFORK: + * This symbol, if defined, indicates to the C program that it should + * include vfork.h. + */ +/*#define I_VFORK /**/ + +/* CAN_PROTOTYPE: + * If defined, this macro indicates that the C compiler can handle + * function prototypes. + */ +/* _: + * This macro is used to declare function parameters for folks who want + * to make declarations with prototypes using a different style than + * the above macros. Use double parentheses. For example: + * + * int main _((int argc, char *argv[])); + */ +#define CAN_PROTOTYPE /**/ +#ifdef CAN_PROTOTYPE +#define _(args) args +#else +#define _(args) () +#endif + +/* SH_PATH: + * This symbol contains the full pathname to the shell used on this + * on this system to execute Bourne shell scripts. Usually, this will be + * /bin/sh, though it's possible that some systems will have /bin/ksh, + * /bin/pdksh, /bin/ash, /bin/bash, or even something such as + * D:/bin/sh.exe. + */ +#define SH_PATH "cmd /x /c" /**/ + +/* INTSIZE: + * This symbol contains the value of sizeof(int) so that the C + * preprocessor can make decisions based on it. + */ +/* LONGSIZE: + * This symbol contains the value of sizeof(long) so that the C + * preprocessor can make decisions based on it. + */ +/* SHORTSIZE: + * This symbol contains the value of sizeof(short) so that the C + * preprocessor can make decisions based on it. + */ +#define INTSIZE 4 /**/ +#define LONGSIZE 4 /**/ +#define SHORTSIZE 2 /**/ + +/* MULTIARCH: + * This symbol, if defined, signifies that the build + * process will produce some binary files that are going to be + * used in a cross-platform environment. This is the case for + * example with the NeXT "fat" binaries that contain executables + * for several CPUs. + */ +/*#define MULTIARCH /**/ + +/* HAS_QUAD: + * This symbol, if defined, tells that there's a 64-bit integer type, + * Quad_t, and its unsigned counterpar, Uquad_t. QUADKIND will be one + * of QUAD_IS_INT, QUAD_IS_LONG, QUAD_IS_LONG_LONG, or QUAD_IS_INT64_T. + */ +/*#define HAS_QUAD /**/ +#ifdef HAS_QUAD +# define Quad_t __int64 /**/ +# define Uquad_t unsigned __int64 /**/ +# define QUADKIND 5 /**/ +# define QUAD_IS_INT 1 +# define QUAD_IS_LONG 2 +# define QUAD_IS_LONG_LONG 3 +# define QUAD_IS_INT64_T 4 +#endif + +/* HAS_ACCESSX: + * This symbol, if defined, indicates that the accessx routine is + * available to do extended access checks. + */ +/*#define HAS_ACCESSX /**/ + +/* HAS_EACCESS: + * This symbol, if defined, indicates that the eaccess routine is + * available to do extended access checks. + */ +/*#define HAS_EACCESS /**/ + +/* I_SYS_ACCESS: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/*#define I_SYS_ACCESS /**/ + +/* I_SYS_SECURITY: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/*#define I_SYS_SECURITY /**/ + +/* OSNAME: + * This symbol contains the name of the operating system, as determined + * by Configure. You shouldn't rely on it too much; the specific + * feature tests from Configure are generally more reliable. + */ +/* OSVERS: + * This symbol contains the version of the operating system, as determined + * by Configure. You shouldn't rely on it too much; the specific + * feature tests from Configure are generally more reliable. + */ +#define OSNAME "MSWin32" /**/ +#define OSVERS "4.0" /**/ + +/* MEM_ALIGNBYTES: + * This symbol contains the number of bytes required to align a + * double, or a long double when applicable. Usual values are 2, + * 4 and 8. The default is eight, for safety. + */ +#if defined(USE_CROSS_COMPILE) || defined(MULTIARCH) +# define MEM_ALIGNBYTES 8 +#else +#define MEM_ALIGNBYTES 8 +#endif + +/* ARCHLIB: + * This variable, if defined, holds the name of the directory in + * which the user wants to put architecture-dependent public + * library files for perl5. It is most often a local directory + * such as /usr/local/lib. Programs using this variable must be + * prepared to deal with filename expansion. If ARCHLIB is the + * same as PRIVLIB, it is not defined, since presumably the + * program already searches PRIVLIB. + */ +/* ARCHLIB_EXP: + * This symbol contains the ~name expanded version of ARCHLIB, to be used + * in programs that are not prepared to deal with ~ expansion at run-time. + */ +#define ARCHLIB "5.7.2\\lib" /**/ +/*#define ARCHLIB_EXP "" /**/ + +/* ARCHNAME: + * This symbol holds a string representing the architecture name. + * It may be used to construct an architecture-dependant pathname + * where library files may be held under a private library, for + * instance. + */ +#define ARCHNAME "HPC2000-WCE300-ARM" /**/ + +/* HAS_ATOLF: + * This symbol, if defined, indicates that the atolf routine is + * available to convert strings into long doubles. + */ +/*#define HAS_ATOLF /**/ + +/* HAS_ATOLL: + * This symbol, if defined, indicates that the atoll routine is + * available to convert strings into long longs. + */ +/*#define HAS_ATOLL /**/ + +/* BIN: + * This symbol holds the path of the bin directory where the package will + * be installed. Program must be prepared to deal with ~name substitution. + */ +/* BIN_EXP: + * This symbol is the filename expanded version of the BIN symbol, for + * programs that do not want to deal with that at run-time. + */ +#define BIN "5.7.2\\bin" /**/ +#define BIN_EXP "5.7.2\\bin" /**/ + +/* PERL_BINCOMPAT_5005: + * This symbol, if defined, indicates that this version of Perl should be + * binary-compatible with Perl 5.005. This is impossible for builds + * that use features like threads and multiplicity it is always undef + * for those versions. + */ +/*#define PERL_BINCOMPAT_5005 /**/ + +/* BYTEORDER: + * This symbol holds the hexadecimal constant defined in byteorder, + * i.e. 0x1234 or 0x4321, etc... + * If the compiler supports cross-compiling or multiple-architecture + * binaries (eg. on NeXT systems), use compiler-defined macros to + * determine the byte order. + * On NeXT 3.2 (and greater), you can build "Fat" Multiple Architecture + * Binaries (MAB) on either big endian or little endian machines. + * The endian-ness is available at compile-time. This only matters + * for perl, where the config.h can be generated and installed on + * one system, and used by a different architecture to build an + * extension. Older versions of NeXT that might not have + * defined either *_ENDIAN__ were all on Motorola 680x0 series, + * so the default case (for NeXT) is big endian to catch them. + * This might matter for NeXT 3.0. + */ +#if defined(USE_CROSS_COMPILE) || defined(MULTIARCH) +# ifdef __LITTLE_ENDIAN__ +# if LONGSIZE == 4 +# define BYTEORDER 0x1234 +# else +# if LONGSIZE == 8 +# define BYTEORDER 0x12345678 +# endif +# endif +# else +# ifdef __BIG_ENDIAN__ +# if LONGSIZE == 4 +# define BYTEORDER 0x4321 +# else +# if LONGSIZE == 8 +# define BYTEORDER 0x87654321 +# endif +# endif +# endif +# endif +# if !defined(BYTEORDER) && (defined(NeXT) || defined(__NeXT__)) +# define BYTEORDER 0x4321 +# endif +#else +#define BYTEORDER 0x1234 /* large digits for MSB */ +#endif /* NeXT */ + +/* CAT2: + * This macro catenates 2 tokens together. + */ +/* STRINGIFY: + * This macro surrounds its token with double quotes. + */ +#if 42 == 1 +#define CAT2(a,b) a/**/b +#define STRINGIFY(a) "a" + /* If you can get stringification with catify, tell me how! */ +#endif +#if 42 == 42 +#define PeRl_CaTiFy(a, b) a ## b +#define PeRl_StGiFy(a) #a +/* the additional level of indirection enables these macros to be + * used as arguments to other macros. See K&R 2nd ed., page 231. */ +#define CAT2(a,b) PeRl_CaTiFy(a,b) +#define StGiFy(a) PeRl_StGiFy(a) +#define STRINGIFY(a) PeRl_StGiFy(a) +#endif +#if 42 != 1 && 42 != 42 +# include "Bletch: How does this C preprocessor catenate tokens?" +#endif + +/* CPPSTDIN: + * This symbol contains the first part of the string which will invoke + * the C preprocessor on the standard input and produce to standard + * output. Typical value of "cc -E" or "/lib/cpp", but it can also + * call a wrapper. See CPPRUN. + */ +/* CPPMINUS: + * This symbol contains the second part of the string which will invoke + * the C preprocessor on the standard input and produce to standard + * output. This symbol will have the value "-" if CPPSTDIN needs a minus + * to specify standard input, otherwise the value is "". + */ +/* CPPRUN: + * This symbol contains the string which will invoke a C preprocessor on + * the standard input and produce to standard output. It needs to end + * with CPPLAST, after all other preprocessor flags have been specified. + * The main difference with CPPSTDIN is that this program will never be a + * pointer to a shell wrapper, i.e. it will be empty if no preprocessor is + * available directly to the user. Note that it may well be different from + * the preprocessor used to compile the C program. + */ +/* CPPLAST: + * This symbol is intended to be used along with CPPRUN in the same manner + * symbol CPPMINUS is used with CPPSTDIN. It contains either "-" or "". + */ +#define CPPSTDIN "cl -nologo -E" +#define CPPMINUS "" +#define CPPRUN "cl -nologo -E" +#define CPPLAST "" + +/* HAS__FWALK: + * This symbol, if defined, indicates that the _fwalk system call is + * available to apply a function to all the file handles. + */ +/*#define HAS__FWALK /**/ + +/* HAS_ACCESS: + * This manifest constant lets the C program know that the access() + * system call is available to check for accessibility using real UID/GID. + * (always present on UNIX.) + */ +#define HAS_ACCESS /**/ + +/* CASTI32: + * This symbol is defined if the C compiler can cast negative + * or large floating point numbers to 32-bit ints. + */ +/*#define CASTI32 /**/ + +/* CASTNEGFLOAT: + * This symbol is defined if the C compiler can cast negative + * numbers to unsigned longs, ints and shorts. + */ +/* CASTFLAGS: + * This symbol contains flags that say what difficulties the compiler + * has casting odd floating values to unsigned long: + * 0 = ok + * 1 = couldn't cast < 0 + * 2 = couldn't cast >= 0x80000000 + * 4 = couldn't cast in argument expression list + */ +#define CASTNEGFLOAT /**/ +#define CASTFLAGS 0 /**/ + +/* VOID_CLOSEDIR: + * This symbol, if defined, indicates that the closedir() routine + * does not return a value. + */ +/*#define VOID_CLOSEDIR /**/ + +/* HAS_STRUCT_CMSGHDR: + * This symbol, if defined, indicates that the struct cmsghdr + * is supported. + */ +/*#define HAS_STRUCT_CMSGHDR /**/ + +/* HAS_CSH: + * This symbol, if defined, indicates that the C-shell exists. + */ +/* CSH: + * This symbol, if defined, contains the full pathname of csh. + */ +/*#define HAS_CSH /**/ +#ifdef HAS_CSH +#define CSH "" /**/ +#endif + +/* DLSYM_NEEDS_UNDERSCORE: + * This symbol, if defined, indicates that we need to prepend an + * underscore to the symbol name before calling dlsym(). This only + * makes sense if you *have* dlsym, which we will presume is the + * case if you're using dl_dlopen.xs. + */ +/*#define DLSYM_NEEDS_UNDERSCORE /**/ + +/* HAS_DRAND48_PROTO: + * This symbol, if defined, indicates that the system provides + * a prototype for the drand48() function. Otherwise, it is up + * to the program to supply one. A good guess is + * extern double drand48 _((void)); + */ +/*#define HAS_DRAND48_PROTO /**/ + +/* HAS_ENDGRENT: + * This symbol, if defined, indicates that the getgrent routine is + * available for finalizing sequential access of the group database. + */ +/*#define HAS_ENDGRENT /**/ + +/* HAS_ENDHOSTENT: + * This symbol, if defined, indicates that the endhostent() routine is + * available to close whatever was being used for host queries. + */ +/*#define HAS_ENDHOSTENT /**/ + +/* HAS_ENDNETENT: + * This symbol, if defined, indicates that the endnetent() routine is + * available to close whatever was being used for network queries. + */ +/*#define HAS_ENDNETENT /**/ + +/* HAS_ENDPROTOENT: + * This symbol, if defined, indicates that the endprotoent() routine is + * available to close whatever was being used for protocol queries. + */ +/*#define HAS_ENDPROTOENT /**/ + +/* HAS_ENDPWENT: + * This symbol, if defined, indicates that the getgrent routine is + * available for finalizing sequential access of the passwd database. + */ +/*#define HAS_ENDPWENT /**/ + +/* HAS_ENDSERVENT: + * This symbol, if defined, indicates that the endservent() routine is + * available to close whatever was being used for service queries. + */ +/*#define HAS_ENDSERVENT /**/ + +/* HAS_FCHDIR: + * This symbol, if defined, indicates that the fchdir routine is + * available to change directory using a file descriptor. + */ +/*#define HAS_FCHDIR /**/ + +/* FCNTL_CAN_LOCK: + * This symbol, if defined, indicates that fcntl() can be used + * for file locking. Normally on Unix systems this is defined. + * It may be undefined on VMS. + */ +/*#define FCNTL_CAN_LOCK /**/ + +/* HAS_FD_SET: + * This symbol, when defined, indicates presence of the fd_set typedef + * in + */ +#define HAS_FD_SET /**/ + +/* FLEXFILENAMES: + * This symbol, if defined, indicates that the system supports filenames + * longer than 14 characters. + */ +#define FLEXFILENAMES /**/ + +/* HAS_FPOS64_T: + * This symbol will be defined if the C compiler supports fpos64_t. + */ +/*#define HAS_FPOS64_T /**/ + +/* HAS_FREXPL: + * This symbol, if defined, indicates that the frexpl routine is + * available to break a long double floating-point number into + * a normalized fraction and an integral power of 2. + */ +/*#define HAS_FREXPL /**/ + +/* HAS_STRUCT_FS_DATA: + * This symbol, if defined, indicates that the struct fs_data + * to do statfs() is supported. + */ +/*#define HAS_STRUCT_FS_DATA /**/ + +/* HAS_FSEEKO: + * This symbol, if defined, indicates that the fseeko routine is + * available to fseek beyond 32 bits (useful for ILP32 hosts). + */ +/*#define HAS_FSEEKO /**/ + +/* HAS_FSTATFS: + * This symbol, if defined, indicates that the fstatfs routine is + * available to stat filesystems by file descriptors. + */ +/*#define HAS_FSTATFS /**/ + +/* HAS_FSYNC: + * This symbol, if defined, indicates that the fsync routine is + * available to write a file's modified data and attributes to + * permanent storage. + */ +/*#define HAS_FSYNC /**/ + +/* HAS_FTELLO: + * This symbol, if defined, indicates that the ftello routine is + * available to ftell beyond 32 bits (useful for ILP32 hosts). + */ +/*#define HAS_FTELLO /**/ + +/* Gconvert: + * This preprocessor macro is defined to convert a floating point + * number to a string without a trailing decimal point. This + * emulates the behavior of sprintf("%g"), but is sometimes much more + * efficient. If gconvert() is not available, but gcvt() drops the + * trailing decimal point, then gcvt() is used. If all else fails, + * a macro using sprintf("%g") is used. Arguments for the Gconvert + * macro are: value, number of digits, whether trailing zeros should + * be retained, and the output buffer. + * Possible values are: + * d_Gconvert='gconvert((x),(n),(t),(b))' + * d_Gconvert='gcvt((x),(n),(b))' + * d_Gconvert='sprintf((b),"%.*g",(n),(x))' + * The last two assume trailing zeros should not be kept. + */ +#define Gconvert(x,n,t,b) sprintf((b),"%.*g",(n),(x)) + +/* HAS_GETCWD: + * This symbol, if defined, indicates that the getcwd routine is + * available to get the current working directory. + */ +/*#define HAS_GETCWD /**/ + +/* HAS_GETESPWNAM: + * This symbol, if defined, indicates that the getespwnam system call is + * available to retrieve enchanced (shadow) password entries by name. + */ +/*#define HAS_GETESPWNAM /**/ + +/* HAS_GETFSSTAT: + * This symbol, if defined, indicates that the getfsstat routine is + * available to stat filesystems in bulk. + */ +/*#define HAS_GETFSSTAT /**/ + +/* HAS_GETGRENT: + * This symbol, if defined, indicates that the getgrent routine is + * available for sequential access of the group database. + */ +/*#define HAS_GETGRENT /**/ + +/* HAS_GETHOSTBYADDR: + * This symbol, if defined, indicates that the gethostbyaddr() routine is + * available to look up hosts by their IP addresses. + */ +#define HAS_GETHOSTBYADDR /**/ + +/* HAS_GETHOSTBYNAME: + * This symbol, if defined, indicates that the gethostbyname() routine is + * available to look up host names in some data base or other. + */ +#define HAS_GETHOSTBYNAME /**/ + +/* HAS_GETHOSTENT: + * This symbol, if defined, indicates that the gethostent() routine is + * available to look up host names in some data base or another. + */ +/*#define HAS_GETHOSTENT /**/ + +/* HAS_GETHOSTNAME: + * This symbol, if defined, indicates that the C program may use the + * gethostname() routine to derive the host name. See also HAS_UNAME + * and PHOSTNAME. + */ +/* HAS_UNAME: + * This symbol, if defined, indicates that the C program may use the + * uname() routine to derive the host name. See also HAS_GETHOSTNAME + * and PHOSTNAME. + */ +/* PHOSTNAME: + * This symbol, if defined, indicates the command to feed to the + * popen() routine to derive the host name. See also HAS_GETHOSTNAME + * and HAS_UNAME. Note that the command uses a fully qualified path, + * so that it is safe even if used by a process with super-user + * privileges. + */ +/* HAS_PHOSTNAME: + * This symbol, if defined, indicates that the C program may use the + * contents of PHOSTNAME as a command to feed to the popen() routine + * to derive the host name. + */ +#define HAS_GETHOSTNAME /**/ +#define HAS_UNAME /**/ +/*#define HAS_PHOSTNAME /**/ +#ifdef HAS_PHOSTNAME +#define PHOSTNAME "" /* How to get the host name */ +#endif + +/* HAS_GETHOST_PROTOS: + * This symbol, if defined, indicates that includes + * prototypes for gethostent(), gethostbyname(), and + * gethostbyaddr(). Otherwise, it is up to the program to guess + * them. See netdbtype.U for probing for various Netdb_xxx_t types. + */ +#define HAS_GETHOST_PROTOS /**/ + +/* HAS_GETITIMER: + * This symbol, if defined, indicates that the getitimer routine is + * available to return interval timers. + */ +/*#define HAS_GETITIMER /**/ + +/* HAS_GETMNT: + * This symbol, if defined, indicates that the getmnt routine is + * available to get filesystem mount info by filename. + */ +/*#define HAS_GETMNT /**/ + +/* HAS_GETMNTENT: + * This symbol, if defined, indicates that the getmntent routine is + * available to iterate through mounted file systems to get their info. + */ +/*#define HAS_GETMNTENT /**/ + +/* HAS_GETNETBYADDR: + * This symbol, if defined, indicates that the getnetbyaddr() routine is + * available to look up networks by their IP addresses. + */ +/*#define HAS_GETNETBYADDR /**/ + +/* HAS_GETNETBYNAME: + * This symbol, if defined, indicates that the getnetbyname() routine is + * available to look up networks by their names. + */ +/*#define HAS_GETNETBYNAME /**/ + +/* HAS_GETNETENT: + * This symbol, if defined, indicates that the getnetent() routine is + * available to look up network names in some data base or another. + */ +/*#define HAS_GETNETENT /**/ + +/* HAS_GETNET_PROTOS: + * This symbol, if defined, indicates that includes + * prototypes for getnetent(), getnetbyname(), and + * getnetbyaddr(). Otherwise, it is up to the program to guess + * them. See netdbtype.U for probing for various Netdb_xxx_t types. + */ +/*#define HAS_GETNET_PROTOS /**/ + +/* HAS_GETPAGESIZE: + * This symbol, if defined, indicates that the getpagesize system call + * is available to get system page size, which is the granularity of + * many memory management calls. + */ +/*#define HAS_GETPAGESIZE /**/ + +/* HAS_GETPROTOENT: + * This symbol, if defined, indicates that the getprotoent() routine is + * available to look up protocols in some data base or another. + */ +/*#define HAS_GETPROTOENT /**/ + +/* HAS_GETPGRP: + * This symbol, if defined, indicates that the getpgrp routine is + * available to get the current process group. + */ +/* USE_BSD_GETPGRP: + * This symbol, if defined, indicates that getpgrp needs one + * arguments whereas USG one needs none. + */ +/*#define HAS_GETPGRP /**/ +/*#define USE_BSD_GETPGRP /**/ + +/* HAS_GETPROTOBYNAME: + * This symbol, if defined, indicates that the getprotobyname() + * routine is available to look up protocols by their name. + */ +/* HAS_GETPROTOBYNUMBER: + * This symbol, if defined, indicates that the getprotobynumber() + * routine is available to look up protocols by their number. + */ +#define HAS_GETPROTOBYNAME /**/ +#define HAS_GETPROTOBYNUMBER /**/ + +/* HAS_GETPROTO_PROTOS: + * This symbol, if defined, indicates that includes + * prototypes for getprotoent(), getprotobyname(), and + * getprotobyaddr(). Otherwise, it is up to the program to guess + * them. See netdbtype.U for probing for various Netdb_xxx_t types. + */ +#define HAS_GETPROTO_PROTOS /**/ + +/* HAS_GETPRPWNAM: + * This symbol, if defined, indicates that the getprpwnam system call is + * available to retrieve protected (shadow) password entries by name. + */ +/*#define HAS_GETPRPWNAM /**/ + +/* HAS_GETPWENT: + * This symbol, if defined, indicates that the getpwent routine is + * available for sequential access of the passwd database. + * If this is not available, the older getpw() function may be available. + */ +/*#define HAS_GETPWENT /**/ + +/* HAS_GETSERVENT: + * This symbol, if defined, indicates that the getservent() routine is + * available to look up network services in some data base or another. + */ +/*#define HAS_GETSERVENT /**/ + +/* HAS_GETSERV_PROTOS: + * This symbol, if defined, indicates that includes + * prototypes for getservent(), getservbyname(), and + * getservbyaddr(). Otherwise, it is up to the program to guess + * them. See netdbtype.U for probing for various Netdb_xxx_t types. + */ +#define HAS_GETSERV_PROTOS /**/ + +/* HAS_GETSPNAM: + * This symbol, if defined, indicates that the getspnam system call is + * available to retrieve SysV shadow password entries by name. + */ +/*#define HAS_GETSPNAM /**/ + +/* HAS_GETSERVBYNAME: + * This symbol, if defined, indicates that the getservbyname() + * routine is available to look up services by their name. + */ +/* HAS_GETSERVBYPORT: + * This symbol, if defined, indicates that the getservbyport() + * routine is available to look up services by their port. + */ +#define HAS_GETSERVBYNAME /**/ +#define HAS_GETSERVBYPORT /**/ + +/* HAS_GNULIBC: + * This symbol, if defined, indicates to the C program that + * the GNU C library is being used. + */ +/*#define HAS_GNULIBC /**/ +#if defined(HAS_GNULIBC) && !defined(_GNU_SOURCE) +# define _GNU_SOURCE +#endif +/* HAS_HASMNTOPT: + * This symbol, if defined, indicates that the hasmntopt routine is + * available to query the mount options of file systems. + */ +/*#define HAS_HASMNTOPT /**/ + +/* HAS_HTONL: + * This symbol, if defined, indicates that the htonl() routine (and + * friends htons() ntohl() ntohs()) are available to do network + * order byte swapping. + */ +/* HAS_HTONS: + * This symbol, if defined, indicates that the htons() routine (and + * friends htonl() ntohl() ntohs()) are available to do network + * order byte swapping. + */ +/* HAS_NTOHL: + * This symbol, if defined, indicates that the ntohl() routine (and + * friends htonl() htons() ntohs()) are available to do network + * order byte swapping. + */ +/* HAS_NTOHS: + * This symbol, if defined, indicates that the ntohs() routine (and + * friends htonl() htons() ntohl()) are available to do network + * order byte swapping. + */ +#define HAS_HTONL /**/ +#define HAS_HTONS /**/ +#define HAS_NTOHL /**/ +#define HAS_NTOHS /**/ + +/* HAS_ICONV: + * This symbol, if defined, indicates that the iconv routine is + * available to do character set conversions. + */ +/*#define HAS_ICONV /**/ + +/* HAS_INT64_T: + * This symbol will defined if the C compiler supports int64_t. + * Usually the needs to be included, but sometimes + * is enough. + */ +/*#define HAS_INT64_T /**/ + +/* HAS_ISASCII: + * This manifest constant lets the C program know that isascii + * is available. + */ +#define HAS_ISASCII /**/ + +/* HAS_ISNAN: + * This symbol, if defined, indicates that the isnan routine is + * available to check whether a double is a NaN. + */ +/*#define HAS_ISNAN /**/ + +/* HAS_ISNANL: + * This symbol, if defined, indicates that the isnanl routine is + * available to check whether a long double is a NaN. + */ +/*#define HAS_ISNANL /**/ + +/* HAS_LCHOWN: + * This symbol, if defined, indicates that the lchown routine is + * available to operate on a symbolic link (instead of following the + * link). + */ +/*#define HAS_LCHOWN /**/ + +/* HAS_LDBL_DIG: + * This symbol, if defined, indicates that this system's + * or defines the symbol LDBL_DIG, which is the number + * of significant digits in a long double precision number. Unlike + * for DBL_DIG, there's no good guess for LDBL_DIG if it is undefined. + */ +#define HAS_LDBL_DIG /**/ + +/* HAS_LONG_DOUBLE: + * This symbol will be defined if the C compiler supports long + * doubles. + */ +/* LONG_DOUBLESIZE: + * This symbol contains the size of a long double, so that the + * C preprocessor can make decisions based on it. It is only + * defined if the system supports long doubles. + */ +/*#define HAS_LONG_DOUBLE /**/ +#ifdef HAS_LONG_DOUBLE +#define LONG_DOUBLESIZE 10 /**/ +#endif + +/* HAS_LONG_LONG: + * This symbol will be defined if the C compiler supports long long. + */ +/* LONGLONGSIZE: + * This symbol contains the size of a long long, so that the + * C preprocessor can make decisions based on it. It is only + * defined if the system supports long long. + */ +/*#define HAS_LONG_LONG /**/ +#ifdef HAS_LONG_LONG +#define LONGLONGSIZE 8 /**/ +#endif + +/* HAS_LSEEK_PROTO: + * This symbol, if defined, indicates that the system provides + * a prototype for the lseek() function. Otherwise, it is up + * to the program to supply one. A good guess is + * extern off_t lseek(int, off_t, int); + */ +#define HAS_LSEEK_PROTO /**/ + +/* HAS_MADVISE: + * This symbol, if defined, indicates that the madvise system call is + * available to map a file into memory. + */ +/*#define HAS_MADVISE /**/ + +/* HAS_MEMCHR: + * This symbol, if defined, indicates that the memchr routine is available + * to locate characters within a C string. + */ +#define HAS_MEMCHR /**/ + +/* HAS_MKDTEMP: + * This symbol, if defined, indicates that the mkdtemp routine is + * available to exclusively create a uniquely named temporary directory. + */ +/*#define HAS_MKDTEMP /**/ + +/* HAS_MKSTEMP: + * This symbol, if defined, indicates that the mkstemp routine is + * available to exclusively create and open a uniquely named + * temporary file. + */ +/*#define HAS_MKSTEMP /**/ + +/* HAS_MKSTEMPS: + * This symbol, if defined, indicates that the mkstemps routine is + * available to excluslvely create and open a uniquely named + * (with a suffix) temporary file. + */ +/*#define HAS_MKSTEMPS /**/ + +/* HAS_MMAP: + * This symbol, if defined, indicates that the mmap system call is + * available to map a file into memory. + */ +/* Mmap_t: + * This symbol holds the return type of the mmap() system call + * (and simultaneously the type of the first argument). + * Usually set to 'void *' or 'cadd_t'. + */ +/*#define HAS_MMAP /**/ +#define Mmap_t void * /**/ + +/* HAS_MODFL: + * This symbol, if defined, indicates that the modfl routine is + * available to split a long double x into a fractional part f and + * an integer part i such that |f| < 1.0 and (f + i) = x. + */ +/* HAS_MODFL_POW32_BUG: + * This symbol, if defined, indicates that the modfl routine is + * broken for long doubles >= pow(2, 32). + * For example from 4294967303.150000 one would get 4294967302.000000 + * and 1.150000. The bug has been seen in certain versions of glibc, + * release 2.2.2 is known to be okay. + */ +/*#define HAS_MODFL /**/ +/*#define HAS_MODFL_POW32_BUG /**/ + +/* HAS_MPROTECT: + * This symbol, if defined, indicates that the mprotect system call is + * available to modify the access protection of a memory mapped file. + */ +/*#define HAS_MPROTECT /**/ + +/* HAS_MSG: + * This symbol, if defined, indicates that the entire msg*(2) library is + * supported (IPC mechanism based on message queues). + */ +/*#define HAS_MSG /**/ + +/* HAS_STRUCT_MSGHDR: + * This symbol, if defined, indicates that the struct msghdr + * is supported. + */ +/*#define HAS_STRUCT_MSGHDR /**/ + +/* HAS_OFF64_T: + * This symbol will be defined if the C compiler supports off64_t. + */ +/*#define HAS_OFF64_T /**/ + +/* HAS_OPEN3: + * This manifest constant lets the C program know that the three + * argument form of open(2) is available. + */ +/*#define HAS_OPEN3 /**/ + +/* OLD_PTHREAD_CREATE_JOINABLE: + * This symbol, if defined, indicates how to create pthread + * in joinable (aka undetached) state. NOTE: not defined + * if pthread.h already has defined PTHREAD_CREATE_JOINABLE + * (the new version of the constant). + * If defined, known values are PTHREAD_CREATE_UNDETACHED + * and __UNDETACHED. + */ +/*#define OLD_PTHREAD_CREATE_JOINABLE /**/ + +/* HAS_PTHREAD_YIELD: + * This symbol, if defined, indicates that the pthread_yield + * routine is available to yield the execution of the current + * thread. sched_yield is preferable to pthread_yield. + */ +/* SCHED_YIELD: + * This symbol defines the way to yield the execution of + * the current thread. Known ways are sched_yield, + * pthread_yield, and pthread_yield with NULL. + */ +/* HAS_SCHED_YIELD: + * This symbol, if defined, indicates that the sched_yield + * routine is available to yield the execution of the current + * thread. sched_yield is preferable to pthread_yield. + */ +/*#define HAS_PTHREAD_YIELD /**/ +#define SCHED_YIELD /**/ +/*#define HAS_SCHED_YIELD /**/ + +/* HAS_READV: + * This symbol, if defined, indicates that the readv routine is + * available to do gather reads. You will also need + * and there I_SYSUIO. + */ +/*#define HAS_READV /**/ + +/* HAS_RECVMSG: + * This symbol, if defined, indicates that the recvmsg routine is + * available to send structured socket messages. + */ +/*#define HAS_RECVMSG /**/ + +/* HAS_SAFE_BCOPY: + * This symbol, if defined, indicates that the bcopy routine is available + * to copy potentially overlapping memory blocks. Normally, you should + * probably use memmove() or memcpy(). If neither is defined, roll your + * own version. + */ +/*#define HAS_SAFE_BCOPY /**/ + +/* HAS_SAFE_MEMCPY: + * This symbol, if defined, indicates that the memcpy routine is available + * to copy potentially overlapping memory blocks. If you need to + * copy overlapping memory blocks, you should check HAS_MEMMOVE and + * use memmove() instead, if available. + */ +/*#define HAS_SAFE_MEMCPY /**/ + +/* HAS_SANE_MEMCMP: + * This symbol, if defined, indicates that the memcmp routine is available + * and can be used to compare relative magnitudes of chars with their high + * bits set. If it is not defined, roll your own version. + */ +#define HAS_SANE_MEMCMP /**/ + +/* HAS_SBRK_PROTO: + * This symbol, if defined, indicates that the system provides + * a prototype for the sbrk() function. Otherwise, it is up + * to the program to supply one. Good guesses are + * extern void* sbrk _((int)); + * extern void* sbrk _((size_t)); + */ +/*#define HAS_SBRK_PROTO /**/ + +/* HAS_SEM: + * This symbol, if defined, indicates that the entire sem*(2) library is + * supported. + */ +/*#define HAS_SEM /**/ + +/* HAS_SENDMSG: + * This symbol, if defined, indicates that the sendmsg routine is + * available to send structured socket messages. + */ +/*#define HAS_SENDMSG /**/ + +/* HAS_SETGRENT: + * This symbol, if defined, indicates that the setgrent routine is + * available for initializing sequential access of the group database. + */ +/*#define HAS_SETGRENT /**/ + +/* HAS_SETGROUPS: + * This symbol, if defined, indicates that the setgroups() routine is + * available to set the list of process groups. If unavailable, multiple + * groups are probably not supported. + */ +/*#define HAS_SETGROUPS /**/ + +/* HAS_SETHOSTENT: + * This symbol, if defined, indicates that the sethostent() routine is + * available. + */ +/*#define HAS_SETHOSTENT /**/ + +/* HAS_SETITIMER: + * This symbol, if defined, indicates that the setitimer routine is + * available to set interval timers. + */ +/*#define HAS_SETITIMER /**/ + +/* HAS_SETNETENT: + * This symbol, if defined, indicates that the setnetent() routine is + * available. + */ +/*#define HAS_SETNETENT /**/ + +/* HAS_SETPROTOENT: + * This symbol, if defined, indicates that the setprotoent() routine is + * available. + */ +/*#define HAS_SETPROTOENT /**/ + +/* HAS_SETPGRP: + * This symbol, if defined, indicates that the setpgrp routine is + * available to set the current process group. + */ +/* USE_BSD_SETPGRP: + * This symbol, if defined, indicates that setpgrp needs two + * arguments whereas USG one needs none. See also HAS_SETPGID + * for a POSIX interface. + */ +/*#define HAS_SETPGRP /**/ +/*#define USE_BSD_SETPGRP /**/ + +/* HAS_SETPROCTITLE: + * This symbol, if defined, indicates that the setproctitle routine is + * available to set process title. + */ +/*#define HAS_SETPROCTITLE /**/ + +/* HAS_SETPWENT: + * This symbol, if defined, indicates that the setpwent routine is + * available for initializing sequential access of the passwd database. + */ +/*#define HAS_SETPWENT /**/ + +/* HAS_SETSERVENT: + * This symbol, if defined, indicates that the setservent() routine is + * available. + */ +/*#define HAS_SETSERVENT /**/ + +/* HAS_SETVBUF: + * This symbol, if defined, indicates that the setvbuf routine is + * available to change buffering on an open stdio stream. + * to a line-buffered mode. + */ +/*#define HAS_SETVBUF /**/ + +/* USE_SFIO: + * This symbol, if defined, indicates that sfio should + * be used. + */ +/*#define USE_SFIO /**/ + +/* HAS_SHM: + * This symbol, if defined, indicates that the entire shm*(2) library is + * supported. + */ +/*#define HAS_SHM /**/ + +/* HAS_SIGACTION: + * This symbol, if defined, indicates that Vr4's sigaction() routine + * is available. + */ +/*#define HAS_SIGACTION /**/ + +/* HAS_SIGSETJMP: + * This variable indicates to the C program that the sigsetjmp() + * routine is available to save the calling process's registers + * and stack environment for later use by siglongjmp(), and + * to optionally save the process's signal mask. See + * Sigjmp_buf, Sigsetjmp, and Siglongjmp. + */ +/* Sigjmp_buf: + * This is the buffer type to be used with Sigsetjmp and Siglongjmp. + */ +/* Sigsetjmp: + * This macro is used in the same way as sigsetjmp(), but will invoke + * traditional setjmp() if sigsetjmp isn't available. + * See HAS_SIGSETJMP. + */ +/* Siglongjmp: + * This macro is used in the same way as siglongjmp(), but will invoke + * traditional longjmp() if siglongjmp isn't available. + * See HAS_SIGSETJMP. + */ +/*#define HAS_SIGSETJMP /**/ +#ifdef HAS_SIGSETJMP +#define Sigjmp_buf sigjmp_buf +#define Sigsetjmp(buf,save_mask) sigsetjmp((buf),(save_mask)) +#define Siglongjmp(buf,retval) siglongjmp((buf),(retval)) +#else +#define Sigjmp_buf jmp_buf +#define Sigsetjmp(buf,save_mask) setjmp((buf)) +#define Siglongjmp(buf,retval) longjmp((buf),(retval)) +#endif + +/* HAS_SOCKET: + * This symbol, if defined, indicates that the BSD socket interface is + * supported. + */ +/* HAS_SOCKETPAIR: + * This symbol, if defined, indicates that the BSD socketpair() call is + * supported. + */ +/* HAS_MSG_CTRUNC: + * This symbol, if defined, indicates that the MSG_CTRUNC is supported. + * Checking just with #ifdef might not be enough because this symbol + * has been known to be an enum. + */ +/* HAS_MSG_DONTROUTE: + * This symbol, if defined, indicates that the MSG_DONTROUTE is supported. + * Checking just with #ifdef might not be enough because this symbol + * has been known to be an enum. + */ +/* HAS_MSG_OOB: + * This symbol, if defined, indicates that the MSG_OOB is supported. + * Checking just with #ifdef might not be enough because this symbol + * has been known to be an enum. + */ +/* HAS_MSG_PEEK: + * This symbol, if defined, indicates that the MSG_PEEK is supported. + * Checking just with #ifdef might not be enough because this symbol + * has been known to be an enum. + */ +/* HAS_MSG_PROXY: + * This symbol, if defined, indicates that the MSG_PROXY is supported. + * Checking just with #ifdef might not be enough because this symbol + * has been known to be an enum. + */ +/* HAS_SCM_RIGHTS: + * This symbol, if defined, indicates that the SCM_RIGHTS is supported. + * Checking just with #ifdef might not be enough because this symbol + * has been known to be an enum. + */ +#define HAS_SOCKET /**/ +/*#define HAS_SOCKETPAIR /**/ +/*#define HAS_MSG_CTRUNC /**/ +/*#define HAS_MSG_DONTROUTE /**/ +/*#define HAS_MSG_OOB /**/ +/*#define HAS_MSG_PEEK /**/ +/*#define HAS_MSG_PROXY /**/ +/*#define HAS_SCM_RIGHTS /**/ + +/* HAS_SOCKS5_INIT: + * This symbol, if defined, indicates that the socks5_init routine is + * available to initialize SOCKS 5. + */ +/*#define HAS_SOCKS5_INIT /**/ + +/* HAS_SQRTL: + * This symbol, if defined, indicates that the sqrtl routine is + * available to do long double square roots. + */ +/*#define HAS_SQRTL /**/ + +/* USE_STAT_BLOCKS: + * This symbol is defined if this system has a stat structure declaring + * st_blksize and st_blocks. + */ +#ifndef USE_STAT_BLOCKS +/*#define USE_STAT_BLOCKS /**/ +#endif + +/* HAS_STRUCT_STATFS_F_FLAGS: + * This symbol, if defined, indicates that the struct statfs + * does have the f_flags member containing the mount flags of + * the filesystem containing the file. + * This kind of struct statfs is coming from (BSD 4.3), + * not from (SYSV). Older BSDs (like Ultrix) do not + * have statfs() and struct statfs, they have ustat() and getmnt() + * with struct ustat and struct fs_data. + */ +/*#define HAS_STRUCT_STATFS_F_FLAGS /**/ + +/* HAS_STRUCT_STATFS: + * This symbol, if defined, indicates that the struct statfs + * to do statfs() is supported. + */ +/*#define HAS_STRUCT_STATFS /**/ + +/* HAS_FSTATVFS: + * This symbol, if defined, indicates that the fstatvfs routine is + * available to stat filesystems by file descriptors. + */ +/*#define HAS_FSTATVFS /**/ + +/* USE_STDIO_PTR: + * This symbol is defined if the _ptr and _cnt fields (or similar) + * of the stdio FILE structure can be used to access the stdio buffer + * for a file handle. If this is defined, then the FILE_ptr(fp) + * and FILE_cnt(fp) macros will also be defined and should be used + * to access these fields. + */ +/* FILE_ptr: + * This macro is used to access the _ptr field (or equivalent) of the + * FILE structure pointed to by its argument. This macro will always be + * defined if USE_STDIO_PTR is defined. + */ +/* STDIO_PTR_LVALUE: + * This symbol is defined if the FILE_ptr macro can be used as an + * lvalue. + */ +/* FILE_cnt: + * This macro is used to access the _cnt field (or equivalent) of the + * FILE structure pointed to by its argument. This macro will always be + * defined if USE_STDIO_PTR is defined. + */ +/* STDIO_CNT_LVALUE: + * This symbol is defined if the FILE_cnt macro can be used as an + * lvalue. + */ +/* STDIO_PTR_LVAL_SETS_CNT: + * This symbol is defined if using the FILE_ptr macro as an lvalue + * to increase the pointer by n has the side effect of decreasing the + * value of File_cnt(fp) by n. + */ +/* STDIO_PTR_LVAL_NOCHANGE_CNT: + * This symbol is defined if using the FILE_ptr macro as an lvalue + * to increase the pointer by n leaves File_cnt(fp) unchanged. + */ +/*#define USE_STDIO_PTR /**/ +#ifdef USE_STDIO_PTR +#define FILE_ptr(fp) +/*#define STDIO_PTR_LVALUE /**/ +#define FILE_cnt(fp) +/*#define STDIO_CNT_LVALUE /**/ +/*#define STDIO_PTR_LVAL_SETS_CNT /**/ +/*#define STDIO_PTR_LVAL_NOCHANGE_CNT /**/ +#endif + +/* USE_STDIO_BASE: + * This symbol is defined if the _base field (or similar) of the + * stdio FILE structure can be used to access the stdio buffer for + * a file handle. If this is defined, then the FILE_base(fp) macro + * will also be defined and should be used to access this field. + * Also, the FILE_bufsiz(fp) macro will be defined and should be used + * to determine the number of bytes in the buffer. USE_STDIO_BASE + * will never be defined unless USE_STDIO_PTR is. + */ +/* FILE_base: + * This macro is used to access the _base field (or equivalent) of the + * FILE structure pointed to by its argument. This macro will always be + * defined if USE_STDIO_BASE is defined. + */ +/* FILE_bufsiz: + * This macro is used to determine the number of bytes in the I/O + * buffer pointed to by _base field (or equivalent) of the FILE + * structure pointed to its argument. This macro will always be defined + * if USE_STDIO_BASE is defined. + */ +/*#define USE_STDIO_BASE /**/ +#ifdef USE_STDIO_BASE +#define FILE_base(fp) +#define FILE_bufsiz(fp) +#endif + +/* HAS_STRERROR: + * This symbol, if defined, indicates that the strerror routine is + * available to translate error numbers to strings. See the writeup + * of Strerror() in this file before you try to define your own. + */ +/* HAS_SYS_ERRLIST: + * This symbol, if defined, indicates that the sys_errlist array is + * available to translate error numbers to strings. The extern int + * sys_nerr gives the size of that table. + */ +/* Strerror: + * This preprocessor symbol is defined as a macro if strerror() is + * not available to translate error numbers to strings but sys_errlist[] + * array is there. + */ +#define HAS_STRERROR /**/ +#define HAS_SYS_ERRLIST /**/ +#define Strerror(e) strerror(e) + +/* HAS_STRTOLD: + * This symbol, if defined, indicates that the strtold routine is + * available to convert strings to long doubles. + */ +/*#define HAS_STRTOLD /**/ + +/* HAS_STRTOLL: + * This symbol, if defined, indicates that the strtoll routine is + * available to convert strings to long longs. + */ +/*#define HAS_STRTOLL /**/ + +/* HAS_STRTOQ: + * This symbol, if defined, indicates that the strtoq routine is + * available to convert strings to long longs (quads). + */ +/*#define HAS_STRTOQ /**/ + +/* HAS_STRTOUL: + * This symbol, if defined, indicates that the strtoul routine is + * available to provide conversion of strings to unsigned long. + */ +#define HAS_STRTOUL /**/ + +/* HAS_STRTOULL: + * This symbol, if defined, indicates that the strtoull routine is + * available to convert strings to unsigned long longs. + */ +/*#define HAS_STRTOULL /**/ + +/* HAS_STRTOUQ: + * This symbol, if defined, indicates that the strtouq routine is + * available to convert strings to unsigned long longs (quads). + */ +/*#define HAS_STRTOUQ /**/ + +/* HAS_TELLDIR_PROTO: + * This symbol, if defined, indicates that the system provides + * a prototype for the telldir() function. Otherwise, it is up + * to the program to supply one. A good guess is + * extern long telldir _((DIR*)); + */ +#define HAS_TELLDIR_PROTO /**/ + +/* Time_t: + * This symbol holds the type returned by time(). It can be long, + * or time_t on BSD sites (in which case should be + * included). + */ +#define Time_t time_t /* Time type */ + +/* HAS_TIMES: + * This symbol, if defined, indicates that the times() routine exists. + * Note that this became obsolete on some systems (SUNOS), which now + * use getrusage(). It may be necessary to include . + */ +#define HAS_TIMES /**/ + +/* HAS_UALARM: + * This symbol, if defined, indicates that the ualarm routine is + * available to do alarms with microsecond granularity. + */ +/*#define HAS_UALARM /**/ + +/* HAS_UNION_SEMUN: + * This symbol, if defined, indicates that the union semun is + * defined by including . If not, the user code + * probably needs to define it as: + * union semun { + * int val; + * struct semid_ds *buf; + * unsigned short *array; + * } + */ +/* USE_SEMCTL_SEMUN: + * This symbol, if defined, indicates that union semun is + * used for semctl IPC_STAT. + */ +/* USE_SEMCTL_SEMID_DS: + * This symbol, if defined, indicates that struct semid_ds * is + * used for semctl IPC_STAT. + */ +#define HAS_UNION_SEMUN /**/ +/*#define USE_SEMCTL_SEMUN /**/ +/*#define USE_SEMCTL_SEMID_DS /**/ + +/* HAS_USTAT: + * This symbol, if defined, indicates that the ustat system call is + * available to query file system statistics by dev_t. + */ +/*#define HAS_USTAT /**/ + +/* HAS_VFORK: + * This symbol, if defined, indicates that vfork() exists. + */ +/*#define HAS_VFORK /**/ + +/* Signal_t: + * This symbol's value is either "void" or "int", corresponding to the + * appropriate return type of a signal handler. Thus, you can declare + * a signal handler using "Signal_t (*handler)()", and define the + * handler using "Signal_t handler(sig)". + */ +#define Signal_t void /* Signal handler's return type */ + +/* HAS_VPRINTF: + * This symbol, if defined, indicates that the vprintf routine is available + * to printf with a pointer to an argument list. If unavailable, you + * may need to write your own, probably in terms of _doprnt(). + */ +/* USE_CHAR_VSPRINTF: + * This symbol is defined if this system has vsprintf() returning type + * (char*). The trend seems to be to declare it as "int vsprintf()". It + * is up to the package author to declare vsprintf correctly based on the + * symbol. + */ +#define HAS_VPRINTF /**/ +/*#define USE_CHAR_VSPRINTF /**/ + +/* HAS_WRITEV: + * This symbol, if defined, indicates that the writev routine is + * available to do scatter writes. + */ +/*#define HAS_WRITEV /**/ + +/* USE_DYNAMIC_LOADING: + * This symbol, if defined, indicates that dynamic loading of + * some sort is available. + */ +#define USE_DYNAMIC_LOADING /**/ + +/* DOUBLESIZE: + * This symbol contains the size of a double, so that the C preprocessor + * can make decisions based on it. + */ +#define DOUBLESIZE 8 /**/ + +/* EBCDIC: + * This symbol, if defined, indicates that this system uses + * EBCDIC encoding. + */ +/*#define EBCDIC /**/ + +/* FFLUSH_NULL: + * This symbol, if defined, tells that fflush(NULL) does flush + * all pending stdio output. + */ +/* FFLUSH_ALL: + * This symbol, if defined, tells that to flush + * all pending stdio output one must loop through all + * the stdio file handles stored in an array and fflush them. + * Note that if fflushNULL is defined, fflushall will not + * even be probed for and will be left undefined. + */ +#define FFLUSH_NULL /**/ +/*#define FFLUSH_ALL /**/ + +/* Fpos_t: + * This symbol holds the type used to declare file positions in libc. + * It can be fpos_t, long, uint, etc... It may be necessary to include + * to get any typedef'ed information. + */ +#define Fpos_t fpos_t /* File position type */ + +/* Gid_t_f: + * This symbol defines the format string used for printing a Gid_t. + */ +#define Gid_t_f "ld" /**/ + +/* Gid_t_sign: + * This symbol holds the signedess of a Gid_t. + * 1 for unsigned, -1 for signed. + */ +#define Gid_t_sign -1 /* GID sign */ + +/* Gid_t_size: + * This symbol holds the size of a Gid_t in bytes. + */ +#define Gid_t_size 4 /* GID size */ + +/* Gid_t: + * This symbol holds the return type of getgid() and the type of + * argument to setrgid() and related functions. Typically, + * it is the type of group ids in the kernel. It can be int, ushort, + * gid_t, etc... It may be necessary to include to get + * any typedef'ed information. + */ +#define Gid_t gid_t /* Type for getgid(), etc... */ + +/* Groups_t: + * This symbol holds the type used for the second argument to + * getgroups() and setgroups(). Usually, this is the same as + * gidtype (gid_t) , but sometimes it isn't. + * It can be int, ushort, gid_t, etc... + * It may be necessary to include to get any + * typedef'ed information. This is only required if you have + * getgroups() or setgroups().. + */ +#if defined(HAS_GETGROUPS) || defined(HAS_SETGROUPS) +#define Groups_t gid_t /* Type for 2nd arg to [sg]etgroups() */ +#endif + +/* DB_Prefix_t: + * This symbol contains the type of the prefix structure element + * in the header file. In older versions of DB, it was + * int, while in newer ones it is u_int32_t. + */ +/* DB_Hash_t: + * This symbol contains the type of the prefix structure element + * in the header file. In older versions of DB, it was + * int, while in newer ones it is size_t. + */ +/* DB_VERSION_MAJOR_CFG: + * This symbol, if defined, defines the major version number of + * Berkeley DB found in the header when Perl was configured. + */ +/* DB_VERSION_MINOR_CFG: + * This symbol, if defined, defines the minor version number of + * Berkeley DB found in the header when Perl was configured. + * For DB version 1 this is always 0. + */ +/* DB_VERSION_PATCH_CFG: + * This symbol, if defined, defines the patch version number of + * Berkeley DB found in the header when Perl was configured. + * For DB version 1 this is always 0. + */ +#define DB_Hash_t int /**/ +#define DB_Prefix_t int /**/ +#define DB_VERSION_MAJOR_CFG undef /**/ +#define DB_VERSION_MINOR_CFG undef /**/ +#define DB_VERSION_PATCH_CFG undef /**/ + +/* I_GRP: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/* GRPASSWD: + * This symbol, if defined, indicates to the C program that struct group + * in contains gr_passwd. + */ +/*#define I_GRP /**/ +/*#define GRPASSWD /**/ + +/* I_ICONV: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_ICONV /**/ + +/* I_IEEEFP: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_IEEEFP /**/ + +/* I_INTTYPES: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/*#define I_INTTYPES /**/ + +/* I_LIBUTIL: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_LIBUTIL /**/ + +/* I_MACH_CTHREADS: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/*#define I_MACH_CTHREADS /**/ + +/* I_MNTENT: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_MNTENT /**/ + +/* I_NETDB: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_NETDB /**/ + +/* I_NETINET_TCP: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/*#define I_NETINET_TCP /**/ + +/* I_POLL: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_POLL /**/ + +/* I_PROT: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_PROT /**/ + +/* I_PTHREAD: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/*#define I_PTHREAD /**/ + +/* I_PWD: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/* PWQUOTA: + * This symbol, if defined, indicates to the C program that struct passwd + * contains pw_quota. + */ +/* PWAGE: + * This symbol, if defined, indicates to the C program that struct passwd + * contains pw_age. + */ +/* PWCHANGE: + * This symbol, if defined, indicates to the C program that struct passwd + * contains pw_change. + */ +/* PWCLASS: + * This symbol, if defined, indicates to the C program that struct passwd + * contains pw_class. + */ +/* PWEXPIRE: + * This symbol, if defined, indicates to the C program that struct passwd + * contains pw_expire. + */ +/* PWCOMMENT: + * This symbol, if defined, indicates to the C program that struct passwd + * contains pw_comment. + */ +/* PWGECOS: + * This symbol, if defined, indicates to the C program that struct passwd + * contains pw_gecos. + */ +/* PWPASSWD: + * This symbol, if defined, indicates to the C program that struct passwd + * contains pw_passwd. + */ +/*#define I_PWD /**/ +/*#define PWQUOTA /**/ +/*#define PWAGE /**/ +/*#define PWCHANGE /**/ +/*#define PWCLASS /**/ +/*#define PWEXPIRE /**/ +/*#define PWCOMMENT /**/ +/*#define PWGECOS /**/ +/*#define PWPASSWD /**/ + +/* I_SHADOW: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_SHADOW /**/ + +/* I_SOCKS: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_SOCKS /**/ + +/* I_SUNMATH: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_SUNMATH /**/ + +/* I_SYSLOG: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_SYSLOG /**/ + +/* I_SYSMODE: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_SYSMODE /**/ + +/* I_SYS_MOUNT: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_SYS_MOUNT /**/ + +/* I_SYS_STATFS: + * This symbol, if defined, indicates that exists. + */ +/*#define I_SYS_STATFS /**/ + +/* I_SYS_STATVFS: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_SYS_STATVFS /**/ + +/* I_SYSUIO: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_SYSUIO /**/ + +/* I_SYSUTSNAME: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_SYSUTSNAME /**/ + +/* I_SYS_VFS: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_SYS_VFS /**/ + +/* I_TIME: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/* I_SYS_TIME: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/* I_SYS_TIME_KERNEL: + * This symbol, if defined, indicates to the C program that it should + * include with KERNEL defined. + */ +/*#define I_TIME /**/ +/*#define I_SYS_TIME /**/ +/*#define I_SYS_TIME_KERNEL /**/ + +/* I_USTAT: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_USTAT /**/ + +/* PERL_INC_VERSION_LIST: + * This variable specifies the list of subdirectories in over + * which perl.c:incpush() and lib/lib.pm will automatically + * search when adding directories to @INC, in a format suitable + * for a C initialization string. See the inc_version_list entry + * in Porting/Glossary for more details. + */ +#define PERL_INC_VERSION_LIST 0 /**/ + +/* INSTALL_USR_BIN_PERL: + * This symbol, if defined, indicates that Perl is to be installed + * also as /usr/bin/perl. + */ +/*#define INSTALL_USR_BIN_PERL /**/ + +/* PERL_PRIfldbl: + * This symbol, if defined, contains the string used by stdio to + * format long doubles (format 'f') for output. + */ +/* PERL_PRIgldbl: + * This symbol, if defined, contains the string used by stdio to + * format long doubles (format 'g') for output. + */ +/* PERL_PRIeldbl: + * This symbol, if defined, contains the string used by stdio to + * format long doubles (format 'e') for output. + */ +/* PERL_SCNfldbl: + * This symbol, if defined, contains the string used by stdio to + * format long doubles (format 'f') for input. + */ +/*#define PERL_PRIfldbl "f" /**/ +/*#define PERL_PRIgldbl "g" /**/ +/*#define PERL_PRIeldbl "e" /**/ +/*#define PERL_SCNfldbl undef /**/ + +/* Off_t: + * This symbol holds the type used to declare offsets in the kernel. + * It can be int, long, off_t, etc... It may be necessary to include + * to get any typedef'ed information. + */ +/* LSEEKSIZE: + * This symbol holds the number of bytes used by the Off_t. + */ +/* Off_t_size: + * This symbol holds the number of bytes used by the Off_t. + */ +#define Off_t long /* type */ +#define LSEEKSIZE 4 /* size */ +#define Off_t_size 4 /* size */ + +/* Free_t: + * This variable contains the return type of free(). It is usually + * void, but occasionally int. + */ +/* Malloc_t: + * This symbol is the type of pointer returned by malloc and realloc. + */ +#define Malloc_t void * /**/ +#define Free_t void /**/ + +/* MYMALLOC: + * This symbol, if defined, indicates that we're using our own malloc. + */ +/*#define MYMALLOC /**/ + +/* Mode_t: + * This symbol holds the type used to declare file modes + * for systems calls. It is usually mode_t, but may be + * int or unsigned short. It may be necessary to include + * to get any typedef'ed information. + */ +#define Mode_t mode_t /* file mode parameter for system calls */ + +/* VAL_O_NONBLOCK: + * This symbol is to be used during open() or fcntl(F_SETFL) to turn on + * non-blocking I/O for the file descriptor. Note that there is no way + * back, i.e. you cannot turn it blocking again this way. If you wish to + * alternatively switch between blocking and non-blocking, use the + * ioctl(FIOSNBIO) call instead, but that is not supported by all devices. + */ +/* VAL_EAGAIN: + * This symbol holds the errno error code set by read() when no data was + * present on the non-blocking file descriptor. + */ +/* RD_NODATA: + * This symbol holds the return code from read() when no data is present + * on the non-blocking file descriptor. Be careful! If EOF_NONBLOCK is + * not defined, then you can't distinguish between no data and EOF by + * issuing a read(). You'll have to find another way to tell for sure! + */ +/* EOF_NONBLOCK: + * This symbol, if defined, indicates to the C program that a read() on + * a non-blocking file descriptor will return 0 on EOF, and not the value + * held in RD_NODATA (-1 usually, in that case!). + */ +#define VAL_O_NONBLOCK O_NONBLOCK +#define VAL_EAGAIN EAGAIN +#define RD_NODATA -1 +#define EOF_NONBLOCK + +/* NEED_VA_COPY: + * This symbol, if defined, indicates that the system stores + * the variable argument list datatype, va_list, in a format + * that cannot be copied by simple assignment, so that some + * other means must be used when copying is required. + * As such systems vary in their provision (or non-provision) + * of copying mechanisms, handy.h defines a platform- + * independent macro, Perl_va_copy(src, dst), to do the job. + */ +/*#define NEED_VA_COPY /**/ + +/* Netdb_host_t: + * This symbol holds the type used for the 1st argument + * to gethostbyaddr(). + */ +/* Netdb_hlen_t: + * This symbol holds the type used for the 2nd argument + * to gethostbyaddr(). + */ +/* Netdb_name_t: + * This symbol holds the type used for the argument to + * gethostbyname(). + */ +/* Netdb_net_t: + * This symbol holds the type used for the 1st argument to + * getnetbyaddr(). + */ +#define Netdb_host_t char * /**/ +#define Netdb_hlen_t int /**/ +#define Netdb_name_t char * /**/ +#define Netdb_net_t long /**/ + +/* PERL_OTHERLIBDIRS: + * This variable contains a colon-separated set of paths for the perl + * binary to search for additional library files or modules. + * These directories will be tacked to the end of @INC. + * Perl will automatically search below each path for version- + * and architecture-specific directories. See PERL_INC_VERSION_LIST + * for more details. + */ +/*#define PERL_OTHERLIBDIRS "undef" /**/ + +/* IVTYPE: + * This symbol defines the C type used for Perl's IV. + */ +/* UVTYPE: + * This symbol defines the C type used for Perl's UV. + */ +/* I8TYPE: + * This symbol defines the C type used for Perl's I8. + */ +/* U8TYPE: + * This symbol defines the C type used for Perl's U8. + */ +/* I16TYPE: + * This symbol defines the C type used for Perl's I16. + */ +/* U16TYPE: + * This symbol defines the C type used for Perl's U16. + */ +/* I32TYPE: + * This symbol defines the C type used for Perl's I32. + */ +/* U32TYPE: + * This symbol defines the C type used for Perl's U32. + */ +/* I64TYPE: + * This symbol defines the C type used for Perl's I64. + */ +/* U64TYPE: + * This symbol defines the C type used for Perl's U64. + */ +/* NVTYPE: + * This symbol defines the C type used for Perl's NV. + */ +/* IVSIZE: + * This symbol contains the sizeof(IV). + */ +/* UVSIZE: + * This symbol contains the sizeof(UV). + */ +/* I8SIZE: + * This symbol contains the sizeof(I8). + */ +/* U8SIZE: + * This symbol contains the sizeof(U8). + */ +/* I16SIZE: + * This symbol contains the sizeof(I16). + */ +/* U16SIZE: + * This symbol contains the sizeof(U16). + */ +/* I32SIZE: + * This symbol contains the sizeof(I32). + */ +/* U32SIZE: + * This symbol contains the sizeof(U32). + */ +/* I64SIZE: + * This symbol contains the sizeof(I64). + */ +/* U64SIZE: + * This symbol contains the sizeof(U64). + */ +/* NVSIZE: + * This symbol contains the sizeof(NV). + */ +/* NV_PRESERVES_UV: + * This symbol, if defined, indicates that a variable of type NVTYPE + * can preserve all the bits of a variable of type UVTYPE. + */ +/* NV_PRESERVES_UV_BITS: + * This symbol contains the number of bits a variable of type NVTYPE + * can preserve of a variable of type UVTYPE. + */ +#define IVTYPE long /**/ +#define UVTYPE unsigned long /**/ +#define I8TYPE char /**/ +#define U8TYPE unsigned char /**/ +#define I16TYPE short /**/ +#define U16TYPE unsigned short /**/ +#define I32TYPE long /**/ +#define U32TYPE unsigned long /**/ +#ifdef HAS_QUAD +#define I64TYPE __int64 /**/ +#define U64TYPE unsigned __int64 /**/ +#endif +#define NVTYPE double /**/ +#define IVSIZE 4 /**/ +#define UVSIZE 4 /**/ +#define I8SIZE 1 /**/ +#define U8SIZE 1 /**/ +#define I16SIZE 2 /**/ +#define U16SIZE 2 /**/ +#define I32SIZE 4 /**/ +#define U32SIZE 4 /**/ +#ifdef HAS_QUAD +#define I64SIZE 8 /**/ +#define U64SIZE 8 /**/ +#endif +#define NVSIZE 8 /**/ +#define NV_PRESERVES_UV +#define NV_PRESERVES_UV_BITS undef + +/* IVdf: + * This symbol defines the format string used for printing a Perl IV + * as a signed decimal integer. + */ +/* UVuf: + * This symbol defines the format string used for printing a Perl UV + * as an unsigned decimal integer. + */ +/* UVof: + * This symbol defines the format string used for printing a Perl UV + * as an unsigned octal integer. + */ +/* UVxf: + * This symbol defines the format string used for printing a Perl UV + * as an unsigned hexadecimal integer in lowercase abcdef. + */ +/* UVXf: + * This symbol defines the format string used for printing a Perl UV + * as an unsigned hexadecimal integer in uppercase ABCDEF. + */ +/* NVef: + * This symbol defines the format string used for printing a Perl NV + * using %e-ish floating point format. + */ +/* NVff: + * This symbol defines the format string used for printing a Perl NV + * using %f-ish floating point format. + */ +/* NVgf: + * This symbol defines the format string used for printing a Perl NV + * using %g-ish floating point format. + */ +#define IVdf "ld" /**/ +#define UVuf "lu" /**/ +#define UVof "lo" /**/ +#define UVxf "lx" /**/ +#define UVXf undef /**/ +#define NVef "e" /**/ +#define NVff "f" /**/ +#define NVgf "g" /**/ + +/* Pid_t: + * This symbol holds the type used to declare process ids in the kernel. + * It can be int, uint, pid_t, etc... It may be necessary to include + * to get any typedef'ed information. + */ +#define Pid_t int /* PID type */ + +/* PRIVLIB: + * This symbol contains the name of the private library for this package. + * The library is private in the sense that it needn't be in anyone's + * execution path, but it should be accessible by the world. The program + * should be prepared to do ~ expansion. + */ +/* PRIVLIB_EXP: + * This symbol contains the ~name expanded version of PRIVLIB, to be used + * in programs that are not prepared to deal with ~ expansion at run-time. + */ +#define PRIVLIB "5.7.2\\lib" /**/ +#define PRIVLIB_EXP (win32_get_privlib("5.7.2")) /**/ + +/* PTRSIZE: + * This symbol contains the size of a pointer, so that the C preprocessor + * can make decisions based on it. It will be sizeof(void *) if + * the compiler supports (void *); otherwise it will be + * sizeof(char *). + */ +#define PTRSIZE 4 /**/ + +/* Drand01: + * This macro is to be used to generate uniformly distributed + * random numbers over the range [0., 1.[. You may have to supply + * an 'extern double drand48();' in your program since SunOS 4.1.3 + * doesn't provide you with anything relevant in its headers. + * See HAS_DRAND48_PROTO. + */ +/* Rand_seed_t: + * This symbol defines the type of the argument of the + * random seed function. + */ +/* seedDrand01: + * This symbol defines the macro to be used in seeding the + * random number generator (see Drand01). + */ +/* RANDBITS: + * This symbol indicates how many bits are produced by the + * function used to generate normalized random numbers. + * Values include 15, 16, 31, and 48. + */ +#define Drand01() (rand()/(double)((unsigned)1< to get any typedef'ed information. + */ +#define Size_t size_t /* length paramater for string functions */ + +/* Sock_size_t: + * This symbol holds the type used for the size argument of + * various socket calls (just the base type, not the pointer-to). + */ +#define Sock_size_t int /**/ + +/* SSize_t: + * This symbol holds the type used by functions that return + * a count of bytes or an error condition. It must be a signed type. + * It is usually ssize_t, but may be long or int, etc. + * It may be necessary to include or + * to get any typedef'ed information. + * We will pick a type such that sizeof(SSize_t) == sizeof(Size_t). + */ +#define SSize_t int /* signed count of bytes */ + +/* STARTPERL: + * This variable contains the string to put in front of a perl + * script to make sure (one hopes) that it runs with perl and not + * some shell. + */ +#define STARTPERL "#!perl" /**/ + +/* STDCHAR: + * This symbol is defined to be the type of char used in stdio.h. + * It has the values "unsigned char" or "char". + */ +#define STDCHAR char /**/ + +/* HAS_STDIO_STREAM_ARRAY: + * This symbol, if defined, tells that there is an array + * holding the stdio streams. + */ +/* STDIO_STREAM_ARRAY: + * This symbol tells the name of the array holding the stdio streams. + * Usual values include _iob, __iob, and __sF. + */ +/*#define HAS_STDIO_STREAM_ARRAY /**/ +#define STDIO_STREAM_ARRAY + +/* Uid_t_f: + * This symbol defines the format string used for printing a Uid_t. + */ +#define Uid_t_f "ld" /**/ + +/* Uid_t_sign: + * This symbol holds the signedess of a Uid_t. + * 1 for unsigned, -1 for signed. + */ +#define Uid_t_sign -1 /* UID sign */ + +/* Uid_t_size: + * This symbol holds the size of a Uid_t in bytes. + */ +#define Uid_t_size 4 /* UID size */ + +/* Uid_t: + * This symbol holds the type used to declare user ids in the kernel. + * It can be int, ushort, uid_t, etc... It may be necessary to include + * to get any typedef'ed information. + */ +#define Uid_t uid_t /* UID type */ + +/* USE_64_BIT_INT: + * This symbol, if defined, indicates that 64-bit integers should + * be used when available. If not defined, the native integers + * will be employed (be they 32 or 64 bits). The minimal possible + * 64-bitness is used, just enough to get 64-bit integers into Perl. + * This may mean using for example "long longs", while your memory + * may still be limited to 2 gigabytes. + */ +/* USE_64_BIT_ALL: + * This symbol, if defined, indicates that 64-bit integers should + * be used when available. If not defined, the native integers + * will be used (be they 32 or 64 bits). The maximal possible + * 64-bitness is employed: LP64 or ILP64, meaning that you will + * be able to use more than 2 gigabytes of memory. This mode is + * even more binary incompatible than USE_64_BIT_INT. You may not + * be able to run the resulting executable in a 32-bit CPU at all or + * you may need at least to reboot your OS to 64-bit mode. + */ +#ifndef USE_64_BIT_INT +/*#define USE_64_BIT_INT /**/ +#endif + +#ifndef USE_64_BIT_ALL +/*#define USE_64_BIT_ALL /**/ +#endif + +/* USE_LARGE_FILES: + * This symbol, if defined, indicates that large file support + * should be used when available. + */ +#ifndef USE_LARGE_FILES +/*#define USE_LARGE_FILES /**/ +#endif + +/* USE_LONG_DOUBLE: + * This symbol, if defined, indicates that long doubles should + * be used when available. + */ +#ifndef USE_LONG_DOUBLE +/*#define USE_LONG_DOUBLE /**/ +#endif + +/* USE_MORE_BITS: + * This symbol, if defined, indicates that 64-bit interfaces and + * long doubles should be used when available. + */ +#ifndef USE_MORE_BITS +/*#define USE_MORE_BITS /**/ +#endif + +/* MULTIPLICITY: + * This symbol, if defined, indicates that Perl should + * be built to use multiplicity. + */ +#ifndef MULTIPLICITY +/*#define MULTIPLICITY /**/ +#endif + +/* USE_PERLIO: + * This symbol, if defined, indicates that the PerlIO abstraction should + * be used throughout. If not defined, stdio should be + * used in a fully backward compatible manner. + */ +#ifndef USE_PERLIO +#define USE_PERLIO /**/ +#endif + +/* USE_SOCKS: + * This symbol, if defined, indicates that Perl should + * be built to use socks. + */ +#ifndef USE_SOCKS +/*#define USE_SOCKS /**/ +#endif + +/* USE_ITHREADS: + * This symbol, if defined, indicates that Perl should be built to + * use the interpreter-based threading implementation. + */ +/* USE_5005THREADS: + * This symbol, if defined, indicates that Perl should be built to + * use the 5.005-based threading implementation. + */ +/* OLD_PTHREADS_API: + * This symbol, if defined, indicates that Perl should + * be built to use the old draft POSIX threads API. + */ +/* USE_REENTRANT_API: + * This symbol, if defined, indicates that Perl should + * try to use the various _r versions of library functions. + * This is extremely experimental. + */ +/*#define USE_5005THREADS /**/ +/*#define USE_ITHREADS /**/ +#if defined(USE_5005THREADS) && !defined(USE_ITHREADS) +#define USE_THREADS /* until src is revised*/ +#endif +/*#define OLD_PTHREADS_API /**/ +/*#define USE_REENTRANT_API /**/ + +/* PERL_VENDORARCH: + * If defined, this symbol contains the name of a private library. + * The library is private in the sense that it needn't be in anyone's + * execution path, but it should be accessible by the world. + * It may have a ~ on the front. + * The standard distribution will put nothing in this directory. + * Vendors who distribute perl may wish to place their own + * architecture-dependent modules and extensions in this directory with + * MakeMaker Makefile.PL INSTALLDIRS=vendor + * or equivalent. See INSTALL for details. + */ +/* PERL_VENDORARCH_EXP: + * This symbol contains the ~name expanded version of PERL_VENDORARCH, to be used + * in programs that are not prepared to deal with ~ expansion at run-time. + */ +/*#define PERL_VENDORARCH "" /**/ +/*#define PERL_VENDORARCH_EXP "" /**/ + +/* PERL_VENDORLIB_EXP: + * This symbol contains the ~name expanded version of VENDORLIB, to be used + * in programs that are not prepared to deal with ~ expansion at run-time. + */ +/* PERL_VENDORLIB_STEM: + * This define is PERL_VENDORLIB_EXP with any trailing version-specific component + * removed. The elements in inc_version_list (inc_version_list.U) can + * be tacked onto this variable to generate a list of directories to search. + */ +/*#define PERL_VENDORLIB_EXP "" /**/ +/*#define PERL_VENDORLIB_STEM "" /**/ + +/* VOIDFLAGS: + * This symbol indicates how much support of the void type is given by this + * compiler. What various bits mean: + * + * 1 = supports declaration of void + * 2 = supports arrays of pointers to functions returning void + * 4 = supports comparisons between pointers to void functions and + * addresses of void functions + * 8 = suports declaration of generic void pointers + * + * The package designer should define VOIDUSED to indicate the requirements + * of the package. This can be done either by #defining VOIDUSED before + * including config.h, or by defining defvoidused in Myinit.U. If the + * latter approach is taken, only those flags will be tested. If the + * level of void support necessary is not present, defines void to int. + */ +#ifndef VOIDUSED +#define VOIDUSED 15 +#endif +#define VOIDFLAGS 15 +#if (VOIDFLAGS & VOIDUSED) != VOIDUSED +#define void int /* is void to be avoided? */ +#define M_VOID /* Xenix strikes again */ +#endif + +/* PERL_XS_APIVERSION: + * This variable contains the version of the oldest perl binary + * compatible with the present perl. perl.c:incpush() and + * lib/lib.pm will automatically search in \\site5.7.2\\lib for older + * directories across major versions back to xs_apiversion. + * This is only useful if you have a perl library directory tree + * structured like the default one. + * See INSTALL for how this works. + * The versioned site_perl directory was introduced in 5.005, + * so that is the lowest possible value. + * Since this can depend on compile time options (such as + * bincompat) it is set by Configure. Other non-default sources + * of potential incompatibility, such as multiplicity, threads, + * debugging, 64bits, sfio, etc., are not checked for currently, + * though in principle we could go snooping around in old + * Config.pm files. + */ +/* PERL_PM_APIVERSION: + * This variable contains the version of the oldest perl + * compatible with the present perl. (That is, pure perl modules + * written for pm_apiversion will still work for the current + * version). perl.c:incpush() and lib/lib.pm will automatically + * search in \\site5.7.2\\lib for older directories across major versions + * back to pm_apiversion. This is only useful if you have a perl + * library directory tree structured like the default one. The + * versioned site_perl library was introduced in 5.005, so that's + * the default setting for this variable. It's hard to imagine + * it changing before Perl6. It is included here for symmetry + * with xs_apiveprsion -- the searching algorithms will + * (presumably) be similar. + * See the INSTALL file for how this works. + */ +#define PERL_XS_APIVERSION "5.6.0" +#define PERL_PM_APIVERSION "5.005" + +/* SETUID_SCRIPTS_ARE_SECURE_NOW: + * This symbol, if defined, indicates that the bug that prevents + * setuid scripts from being secure is not present in this kernel. + */ +/* DOSUID: + * This symbol, if defined, indicates that the C program should + * check the script that it is executing for setuid/setgid bits, and + * attempt to emulate setuid/setgid on systems that have disabled + * setuid #! scripts because the kernel can't do it securely. + * It is up to the package designer to make sure that this emulation + * is done securely. Among other things, it should do an fstat on + * the script it just opened to make sure it really is a setuid/setgid + * script, it should make sure the arguments passed correspond exactly + * to the argument on the #! line, and it should not trust any + * subprocesses to which it must pass the filename rather than the + * file descriptor of the script to be executed. + */ +/*#define SETUID_SCRIPTS_ARE_SECURE_NOW /**/ +/*#define DOSUID /**/ + +/* I_STDARG: + * This symbol, if defined, indicates that exists and should + * be included. + */ +/* I_VARARGS: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +#define I_STDARG /**/ +/*#define I_VARARGS /**/ + +/* USE_CROSS_COMPILE: + * This symbol, if defined, indicates that Perl is being cross-compiled. + */ +/* PERL_TARGETARCH: + * This symbol, if defined, indicates the target architecture + * Perl has been cross-compiled to. Undefined if not a cross-compile. + */ +#ifndef USE_CROSS_COMPILE +/*#define USE_CROSS_COMPILE /**/ +#define PERL_TARGETARCH "undef" /**/ +#endif + +/* HAS_DBMINIT_PROTO: + * This symbol, if defined, indicates that the system provides + * a prototype for the dbminit() function. Otherwise, it is up + * to the program to supply one. A good guess is + * extern int dbminit(char *); + */ +/*#define HAS_DBMINIT_PROTO /**/ + +/* HAS_FLOCK_PROTO: + * This symbol, if defined, indicates that the system provides + * a prototype for the flock() function. Otherwise, it is up + * to the program to supply one. A good guess is + * extern int flock(int, int); + */ +/*#define HAS_FLOCK_PROTO /**/ + +/* HAS_NL_LANGINFO: + * This symbol, if defined, indicates that the nl_langinfo routine is + * available to return local data. You will also need + * and therefore I_LANGINFO. + */ +/*#define HAS_NL_LANGINFO /**/ + +/* HAS_SIGPROCMASK: + * This symbol, if defined, indicates that the sigprocmask + * system call is available to examine or change the signal mask + * of the calling process. + */ +/*#define HAS_SIGPROCMASK /**/ + +/* HAS_SOCKATMARK: + * This symbol, if defined, indicates that the sockatmark routine is + * available to test whether a socket is at the out-of-band mark. + */ +/*#define HAS_SOCKATMARK /**/ + +/* HAS_SOCKATMARK_PROTO: + * This symbol, if defined, indicates that the system provides + * a prototype for the sockatmark() function. Otherwise, it is up + * to the program to supply one. A good guess is + * extern int sockatmark _((int)); + */ +/*#define HAS_SOCKATMARK_PROTO /**/ + +/* HAS_SETRESGID_PROTO: + * This symbol, if defined, indicates that the system provides + * a prototype for the setresgid() function. Otherwise, it is up + * to the program to supply one. Good guesses are + * extern int setresgid(uid_t ruid, uid_t euid, uid_t suid); + */ +/*#define HAS_SETRESGID_PROTO /**/ + +/* HAS_SETRESUID_PROTO: + * This symbol, if defined, indicates that the system provides + * a prototype for the setresuid() function. Otherwise, it is up + * to the program to supply one. Good guesses are + * extern int setresuid(uid_t ruid, uid_t euid, uid_t suid); + */ +/*#define HAS_SETRESUID_PROTO /**/ + +/* HAS_STRFTIME: + * This symbol, if defined, indicates that the strftime routine is + * available to do time formatting. + */ +/*#define HAS_STRFTIME /**/ + +/* HAS_SYSCALL_PROTO: + * This symbol, if defined, indicates that the system provides + * a prototype for the syscall() function. Otherwise, it is up + * to the program to supply one. Good guesses are + * extern int syscall(int, ...); + * extern int syscall(long, ...); + */ +/*#define HAS_SYSCALL_PROTO /**/ + +/* U32_ALIGNMENT_REQUIRED: + * This symbol, if defined, indicates that you must access + * character data through U32-aligned pointers. + */ +/*#define U32_ALIGNMENT_REQUIRED /**/ + +/* HAS_USLEEP_PROTO: + * This symbol, if defined, indicates that the system provides + * a prototype for the usleep() function. Otherwise, it is up + * to the program to supply one. A good guess is + * extern int usleep(useconds_t); + */ +/*#define HAS_USLEEP_PROTO /**/ + +/* I_LANGINFO: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_LANGINFO /**/ + +/* HAS_PTHREAD_ATFORK: + * This symbol, if defined, indicates that the pthread_atfork routine + * is available setup fork handlers. + */ +/*#define HAS_PTHREAD_ATFORK /**/ + +#endif diff --git a/wince/config_H.ce b/wince/config_H.ce new file mode 100644 index 0000000..35643b9 --- /dev/null +++ b/wince/config_H.ce @@ -0,0 +1,3136 @@ +/* + * This file was produced by running the config_h.SH script, which + * gets its values from config.sh, which is generally produced by + * running Configure. + * + * Feel free to modify any of this as the need arises. Note, however, + * that running config_h.SH again will wipe out any changes you've made. + * For a more permanent change edit config.sh and rerun config_h.SH. + * + * $Id: Config_h.U,v 3.0.1.5 1997/02/28 14:57:43 ram Exp $ + */ + +/* + * Package name : perl5 + * Source directory : + * Configuration time: Tue Mar 21 01:26:24 2000 + * Configured by : gsar + * Target system : + */ + +#ifndef _config_h_ +#define _config_h_ + +/* LOC_SED: + * This symbol holds the complete pathname to the sed program. + */ +#define LOC_SED "" /**/ + +/* HAS_ALARM: + * This symbol, if defined, indicates that the alarm routine is + * available. + */ +/*#define HAS_ALARM /**/ + +/* HASATTRIBUTE: + * This symbol indicates the C compiler can check for function attributes, + * such as printf formats. This is normally only supported by GNU cc. + */ +/*#define HASATTRIBUTE /**/ +#ifndef HASATTRIBUTE +#define __attribute__(_arg_) +#endif + +/* HAS_BCMP: + * This symbol is defined if the bcmp() routine is available to + * compare blocks of memory. + */ +/*#define HAS_BCMP /**/ + +/* HAS_BCOPY: + * This symbol is defined if the bcopy() routine is available to + * copy blocks of memory. + */ +/*#define HAS_BCOPY /**/ + +/* HAS_BZERO: + * This symbol is defined if the bzero() routine is available to + * set a memory block to 0. + */ +/*#define HAS_BZERO /**/ + +/* HAS_CHOWN: + * This symbol, if defined, indicates that the chown routine is + * available. + */ +/*#define HAS_CHOWN /**/ + +/* HAS_CHROOT: + * This symbol, if defined, indicates that the chroot routine is + * available. + */ +/*#define HAS_CHROOT /**/ + +/* HAS_CHSIZE: + * This symbol, if defined, indicates that the chsize routine is available + * to truncate files. You might need a -lx to get this routine. + */ +#define HAS_CHSIZE /**/ + +/* HASCONST: + * This symbol, if defined, indicates that this C compiler knows about + * the const type. There is no need to actually test for that symbol + * within your programs. The mere use of the "const" keyword will + * trigger the necessary tests. + */ +#define HASCONST /**/ +#ifndef HASCONST +#define const +#endif + +/* HAS_CRYPT: + * This symbol, if defined, indicates that the crypt routine is available + * to encrypt passwords and the like. + */ +/*#define HAS_CRYPT /**/ + +/* HAS_CUSERID: + * This symbol, if defined, indicates that the cuserid routine is + * available to get character login names. + */ +/*#define HAS_CUSERID /**/ + +/* HAS_DBL_DIG: + * This symbol, if defined, indicates that this system's + * or defines the symbol DBL_DIG, which is the number + * of significant digits in a double precision number. If this + * symbol is not defined, a guess of 15 is usually pretty good. + */ +#define HAS_DBL_DIG /**/ + +/* HAS_DIFFTIME: + * This symbol, if defined, indicates that the difftime routine is + * available. + */ +#define HAS_DIFFTIME /**/ + +/* HAS_DLERROR: + * This symbol, if defined, indicates that the dlerror routine is + * available to return a string describing the last error that + * occurred from a call to dlopen(), dlclose() or dlsym(). + */ +#define HAS_DLERROR /**/ + +/* SETUID_SCRIPTS_ARE_SECURE_NOW: + * This symbol, if defined, indicates that the bug that prevents + * setuid scripts from being secure is not present in this kernel. + */ +/* DOSUID: + * This symbol, if defined, indicates that the C program should + * check the script that it is executing for setuid/setgid bits, and + * attempt to emulate setuid/setgid on systems that have disabled + * setuid #! scripts because the kernel can't do it securely. + * It is up to the package designer to make sure that this emulation + * is done securely. Among other things, it should do an fstat on + * the script it just opened to make sure it really is a setuid/setgid + * script, it should make sure the arguments passed correspond exactly + * to the argument on the #! line, and it should not trust any + * subprocesses to which it must pass the filename rather than the + * file descriptor of the script to be executed. + */ +/*#define SETUID_SCRIPTS_ARE_SECURE_NOW /**/ +/*#define DOSUID /**/ + +/* HAS_DUP2: + * This symbol, if defined, indicates that the dup2 routine is + * available to duplicate file descriptors. + */ +#define HAS_DUP2 /**/ + +/* HAS_FCHMOD: + * This symbol, if defined, indicates that the fchmod routine is available + * to change mode of opened files. If unavailable, use chmod(). + */ +/*#define HAS_FCHMOD /**/ + +/* HAS_FCHOWN: + * This symbol, if defined, indicates that the fchown routine is available + * to change ownership of opened files. If unavailable, use chown(). + */ +/*#define HAS_FCHOWN /**/ + +/* HAS_FCNTL: + * This symbol, if defined, indicates to the C program that + * the fcntl() function exists. + */ +/*#define HAS_FCNTL /**/ + +/* HAS_FGETPOS: + * This symbol, if defined, indicates that the fgetpos routine is + * available to get the file position indicator, similar to ftell(). + */ +#define HAS_FGETPOS /**/ + +/* HAS_FLOCK: + * This symbol, if defined, indicates that the flock routine is + * available to do file locking. + */ +#define HAS_FLOCK /**/ + +/* HAS_FORK: + * This symbol, if defined, indicates that the fork routine is + * available. + */ +/*#define HAS_FORK /**/ + +/* HAS_FSETPOS: + * This symbol, if defined, indicates that the fsetpos routine is + * available to set the file position indicator, similar to fseek(). + */ +#define HAS_FSETPOS /**/ + +/* HAS_GETTIMEOFDAY: + * This symbol, if defined, indicates that the gettimeofday() system + * call is available for a sub-second accuracy clock. Usually, the file + * needs to be included (see I_SYS_RESOURCE). + * The type "Timeval" should be used to refer to "struct timeval". + */ +/*#define HAS_GETTIMEOFDAY /**/ +#ifdef HAS_GETTIMEOFDAY +#define Timeval struct timeval /* Structure used by gettimeofday() */ +#endif + +/* HAS_GETGROUPS: + * This symbol, if defined, indicates that the getgroups() routine is + * available to get the list of process groups. If unavailable, multiple + * groups are probably not supported. + */ +/*#define HAS_GETGROUPS /**/ + +/* HAS_GETLOGIN: + * This symbol, if defined, indicates that the getlogin routine is + * available to get the login name. + */ +#define HAS_GETLOGIN /**/ + +/* HAS_GETPGID: + * This symbol, if defined, indicates to the C program that + * the getpgid(pid) function is available to get the + * process group id. + */ +/*#define HAS_GETPGID /**/ + +/* HAS_GETPGRP: + * This symbol, if defined, indicates that the getpgrp routine is + * available to get the current process group. + */ +/* USE_BSD_GETPGRP: + * This symbol, if defined, indicates that getpgrp needs one + * arguments whereas USG one needs none. + */ +/*#define HAS_GETPGRP /**/ +/*#define USE_BSD_GETPGRP /**/ + +/* HAS_GETPGRP2: + * This symbol, if defined, indicates that the getpgrp2() (as in DG/UX) + * routine is available to get the current process group. + */ +/*#define HAS_GETPGRP2 /**/ + +/* HAS_GETPPID: + * This symbol, if defined, indicates that the getppid routine is + * available to get the parent process ID. + */ +/*#define HAS_GETPPID /**/ + +/* HAS_GETPRIORITY: + * This symbol, if defined, indicates that the getpriority routine is + * available to get a process's priority. + */ +/*#define HAS_GETPRIORITY /**/ + +/* HAS_INET_ATON: + * This symbol, if defined, indicates to the C program that the + * inet_aton() function is available to parse IP address "dotted-quad" + * strings. + */ +/*#define HAS_INET_ATON /**/ + +/* HAS_KILLPG: + * This symbol, if defined, indicates that the killpg routine is available + * to kill process groups. If unavailable, you probably should use kill + * with a negative process number. + */ +/*#define HAS_KILLPG /**/ + +/* HAS_LINK: + * This symbol, if defined, indicates that the link routine is + * available to create hard links. + */ + +// #define HAS_LINK /**/ + +/* HAS_LOCALECONV: + * This symbol, if defined, indicates that the localeconv routine is + * available for numeric and monetary formatting conventions. + */ + +// #define HAS_LOCALECONV /**/ + +/* HAS_LOCKF: + * This symbol, if defined, indicates that the lockf routine is + * available to do file locking. + */ +/*#define HAS_LOCKF /**/ + +/* HAS_LSTAT: + * This symbol, if defined, indicates that the lstat routine is + * available to do file stats on symbolic links. + */ +/*#define HAS_LSTAT /**/ + +/* HAS_MBLEN: + * This symbol, if defined, indicates that the mblen routine is available + * to find the number of bytes in a multibye character. + */ +#define HAS_MBLEN /**/ + +/* HAS_MBSTOWCS: + * This symbol, if defined, indicates that the mbstowcs routine is + * available to covert a multibyte string into a wide character string. + */ +#define HAS_MBSTOWCS /**/ + +/* HAS_MBTOWC: + * This symbol, if defined, indicates that the mbtowc routine is available + * to covert a multibyte to a wide character. + */ +#define HAS_MBTOWC /**/ + +/* HAS_MEMCMP: + * This symbol, if defined, indicates that the memcmp routine is available + * to compare blocks of memory. + */ +#define HAS_MEMCMP /**/ + +/* HAS_MEMCPY: + * This symbol, if defined, indicates that the memcpy routine is available + * to copy blocks of memory. + */ +#define HAS_MEMCPY /**/ + +/* HAS_MEMMOVE: + * This symbol, if defined, indicates that the memmove routine is available + * to copy potentially overlapping blocks of memory. This should be used + * only when HAS_SAFE_BCOPY is not defined. If neither is there, roll your + * own version. + */ +#define HAS_MEMMOVE /**/ + +/* HAS_MEMSET: + * This symbol, if defined, indicates that the memset routine is available + * to set blocks of memory. + */ +#define HAS_MEMSET /**/ + +/* HAS_MKDIR: + * This symbol, if defined, indicates that the mkdir routine is available + * to create directories. Otherwise you should fork off a new process to + * exec /bin/mkdir. + */ +#define HAS_MKDIR /**/ + +/* HAS_MKFIFO: + * This symbol, if defined, indicates that the mkfifo routine is + * available to create FIFOs. Otherwise, mknod should be able to + * do it for you. However, if mkfifo is there, mknod might require + * super-user privileges which mkfifo will not. + */ +/*#define HAS_MKFIFO /**/ + +/* HAS_MKTIME: + * This symbol, if defined, indicates that the mktime routine is + * available. + */ +#define HAS_MKTIME /**/ + +/* HAS_MSYNC: + * This symbol, if defined, indicates that the msync system call is + * available to synchronize a mapped file. + */ +/*#define HAS_MSYNC /**/ + +/* HAS_MUNMAP: + * This symbol, if defined, indicates that the munmap system call is + * available to unmap a region, usually mapped by mmap(). + */ +/*#define HAS_MUNMAP /**/ + +/* HAS_NICE: + * This symbol, if defined, indicates that the nice routine is + * available. + */ +/*#define HAS_NICE /**/ + +/* HAS_PATHCONF: + * This symbol, if defined, indicates that pathconf() is available + * to determine file-system related limits and options associated + * with a given filename. + */ +/* HAS_FPATHCONF: + * This symbol, if defined, indicates that pathconf() is available + * to determine file-system related limits and options associated + * with a given open file descriptor. + */ +/*#define HAS_PATHCONF /**/ +/*#define HAS_FPATHCONF /**/ + +/* HAS_PAUSE: + * This symbol, if defined, indicates that the pause routine is + * available to suspend a process until a signal is received. + */ +#define HAS_PAUSE /**/ + +/* HAS_PIPE: + * This symbol, if defined, indicates that the pipe routine is + * available to create an inter-process channel. + */ +#define HAS_PIPE /**/ + +/* HAS_POLL: + * This symbol, if defined, indicates that the poll routine is + * available to poll active file descriptors. You may safely + * include when this symbol is defined. + */ +/*#define HAS_POLL /**/ + +/* HAS_READDIR: + * This symbol, if defined, indicates that the readdir routine is + * available to read directory entries. You may have to include + * . See I_DIRENT. + */ +#define HAS_READDIR /**/ + +/* HAS_SEEKDIR: + * This symbol, if defined, indicates that the seekdir routine is + * available. You may have to include . See I_DIRENT. + */ +#define HAS_SEEKDIR /**/ + +/* HAS_TELLDIR: + * This symbol, if defined, indicates that the telldir routine is + * available. You may have to include . See I_DIRENT. + */ +#define HAS_TELLDIR /**/ + +/* HAS_REWINDDIR: + * This symbol, if defined, indicates that the rewinddir routine is + * available. You may have to include . See I_DIRENT. + */ +#define HAS_REWINDDIR /**/ + +/* HAS_READLINK: + * This symbol, if defined, indicates that the readlink routine is + * available to read the value of a symbolic link. + */ +/*#define HAS_READLINK /**/ + +/* HAS_RENAME: + * This symbol, if defined, indicates that the rename routine is available + * to rename files. Otherwise you should do the unlink(), link(), unlink() + * trick. + */ +#define HAS_RENAME /**/ + +/* HAS_RMDIR: + * This symbol, if defined, indicates that the rmdir routine is + * available to remove directories. Otherwise you should fork off a + * new process to exec /bin/rmdir. + */ +#define HAS_RMDIR /**/ + +/* HAS_SELECT: + * This symbol, if defined, indicates that the select routine is + * available to select active file descriptors. If the timeout field + * is used, may need to be included. + */ +#define HAS_SELECT /**/ + +/* HAS_SETEGID: + * This symbol, if defined, indicates that the setegid routine is available + * to change the effective gid of the current program. + */ +/*#define HAS_SETEGID /**/ + +/* HAS_SETEUID: + * This symbol, if defined, indicates that the seteuid routine is available + * to change the effective uid of the current program. + */ +/*#define HAS_SETEUID /**/ + +/* HAS_SETLINEBUF: + * This symbol, if defined, indicates that the setlinebuf routine is + * available to change stderr or stdout from block-buffered or unbuffered + * to a line-buffered mode. + */ +/*#define HAS_SETLINEBUF /**/ + +/* HAS_SETLOCALE: + * This symbol, if defined, indicates that the setlocale routine is + * available to handle locale-specific ctype implementations. + */ + +// #define HAS_SETLOCALE /**/ + +/* HAS_SETPGID: + * This symbol, if defined, indicates that the setpgid(pid, gpid) + * routine is available to set process group ID. + */ +/*#define HAS_SETPGID /**/ + +/* HAS_SETPGRP: + * This symbol, if defined, indicates that the setpgrp routine is + * available to set the current process group. + */ +/* USE_BSD_SETPGRP: + * This symbol, if defined, indicates that setpgrp needs two + * arguments whereas USG one needs none. See also HAS_SETPGID + * for a POSIX interface. + */ +/*#define HAS_SETPGRP /**/ +/*#define USE_BSD_SETPGRP /**/ + +/* HAS_SETPGRP2: + * This symbol, if defined, indicates that the setpgrp2() (as in DG/UX) + * routine is available to set the current process group. + */ +/*#define HAS_SETPGRP2 /**/ + +/* HAS_SETPRIORITY: + * This symbol, if defined, indicates that the setpriority routine is + * available to set a process's priority. + */ +/*#define HAS_SETPRIORITY /**/ + +/* HAS_SETREGID: + * This symbol, if defined, indicates that the setregid routine is + * available to change the real and effective gid of the current + * process. + */ +/* HAS_SETRESGID: + * This symbol, if defined, indicates that the setresgid routine is + * available to change the real, effective and saved gid of the current + * process. + */ +/*#define HAS_SETREGID /**/ +/*#define HAS_SETRESGID /**/ + +/* HAS_SETREUID: + * This symbol, if defined, indicates that the setreuid routine is + * available to change the real and effective uid of the current + * process. + */ +/* HAS_SETRESUID: + * This symbol, if defined, indicates that the setresuid routine is + * available to change the real, effective and saved uid of the current + * process. + */ +/*#define HAS_SETREUID /**/ +/*#define HAS_SETRESUID /**/ + +/* HAS_SETRGID: + * This symbol, if defined, indicates that the setrgid routine is available + * to change the real gid of the current program. + */ +/*#define HAS_SETRGID /**/ + +/* HAS_SETRUID: + * This symbol, if defined, indicates that the setruid routine is available + * to change the real uid of the current program. + */ +/*#define HAS_SETRUID /**/ + +/* HAS_SETSID: + * This symbol, if defined, indicates that the setsid routine is + * available to set the process group ID. + */ +/*#define HAS_SETSID /**/ + +/* Shmat_t: + * This symbol holds the return type of the shmat() system call. + * Usually set to 'void *' or 'char *'. + */ +/* HAS_SHMAT_PROTOTYPE: + * This symbol, if defined, indicates that the sys/shm.h includes + * a prototype for shmat(). Otherwise, it is up to the program to + * guess one. Shmat_t shmat _((int, Shmat_t, int)) is a good guess, + * but not always right so it should be emitted by the program only + * when HAS_SHMAT_PROTOTYPE is not defined to avoid conflicting defs. + */ +#define Shmat_t void * /**/ +/*#define HAS_SHMAT_PROTOTYPE /**/ + +/* HAS_STRCHR: + * This symbol is defined to indicate that the strchr()/strrchr() + * functions are available for string searching. If not, try the + * index()/rindex() pair. + */ +/* HAS_INDEX: + * This symbol is defined to indicate that the index()/rindex() + * functions are available for string searching. + */ +#define HAS_STRCHR /**/ +/*#define HAS_INDEX /**/ + +/* HAS_STRCOLL: + * This symbol, if defined, indicates that the strcoll routine is + * available to compare strings using collating information. + */ + +//#define HAS_STRCOLL /**/ + +/* USE_STRUCT_COPY: + * This symbol, if defined, indicates that this C compiler knows how + * to copy structures. If undefined, you'll need to use a block copy + * routine of some sort instead. + */ +#define USE_STRUCT_COPY /**/ + +/* HAS_STRTOD: + * This symbol, if defined, indicates that the strtod routine is + * available to provide better numeric string conversion than atof(). + */ +#define HAS_STRTOD /**/ + +/* HAS_STRTOL: + * This symbol, if defined, indicates that the strtol routine is available + * to provide better numeric string conversion than atoi() and friends. + */ +#define HAS_STRTOL /**/ + +/* HAS_STRTOUL: + * This symbol, if defined, indicates that the strtoul routine is + * available to provide conversion of strings to unsigned long. + */ +#define HAS_STRTOUL /**/ + +/* HAS_STRXFRM: + * This symbol, if defined, indicates that the strxfrm() routine is + * available to transform strings. + */ + +//#define HAS_STRXFRM /**/ + +/* HAS_SYMLINK: + * This symbol, if defined, indicates that the symlink routine is available + * to create symbolic links. + */ +/*#define HAS_SYMLINK /**/ + +/* HAS_SYSCALL: + * This symbol, if defined, indicates that the syscall routine is + * available to call arbitrary system calls. If undefined, that's tough. + */ +/*#define HAS_SYSCALL /**/ + +/* HAS_SYSCONF: + * This symbol, if defined, indicates that sysconf() is available + * to determine system related limits and options. + */ +/*#define HAS_SYSCONF /**/ + +/* HAS_SYSTEM: + * This symbol, if defined, indicates that the system routine is + * available to issue a shell command. + */ +#define HAS_SYSTEM /**/ + +/* HAS_TCGETPGRP: + * This symbol, if defined, indicates that the tcgetpgrp routine is + * available to get foreground process group ID. + */ +/*#define HAS_TCGETPGRP /**/ + +/* HAS_TCSETPGRP: + * This symbol, if defined, indicates that the tcsetpgrp routine is + * available to set foreground process group ID. + */ +/*#define HAS_TCSETPGRP /**/ + +/* HAS_TRUNCATE: + * This symbol, if defined, indicates that the truncate routine is + * available to truncate files. + */ +/*#define HAS_TRUNCATE /**/ + +/* HAS_TZNAME: + * This symbol, if defined, indicates that the tzname[] array is + * available to access timezone names. + */ +#define HAS_TZNAME /**/ + +/* HAS_UMASK: + * This symbol, if defined, indicates that the umask routine is + * available to set and get the value of the file creation mask. + */ +#define HAS_UMASK /**/ + +/* HASVOLATILE: + * This symbol, if defined, indicates that this C compiler knows about + * the volatile declaration. + */ +#define HASVOLATILE /**/ +#ifndef HASVOLATILE +#define volatile +#endif + +/* HAS_WAIT4: + * This symbol, if defined, indicates that wait4() exists. + */ +/*#define HAS_WAIT4 /**/ + +/* HAS_WAITPID: + * This symbol, if defined, indicates that the waitpid routine is + * available to wait for child process. + */ + +// #define HAS_WAITPID /**/ + +/* HAS_WCSTOMBS: + * This symbol, if defined, indicates that the wcstombs routine is + * available to convert wide character strings to multibyte strings. + */ +#define HAS_WCSTOMBS /**/ + +/* HAS_WCTOMB: + * This symbol, if defined, indicates that the wctomb routine is available + * to covert a wide character to a multibyte. + */ +#define HAS_WCTOMB /**/ + +/* I_ARPA_INET: + * This symbol, if defined, indicates to the C program that it should + * include to get inet_addr and friends declarations. + */ +#define I_ARPA_INET /**/ + +/* I_DBM: + * This symbol, if defined, indicates that exists and should + * be included. + */ +/* I_RPCSVC_DBM: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_DBM /**/ +#define I_RPCSVC_DBM /**/ + +/* I_DIRENT: + * This symbol, if defined, indicates to the C program that it should + * include . Using this symbol also triggers the definition + * of the Direntry_t define which ends up being 'struct dirent' or + * 'struct direct' depending on the availability of . + */ +/* DIRNAMLEN: + * This symbol, if defined, indicates to the C program that the length + * of directory entry names is provided by a d_namlen field. Otherwise + * you need to do strlen() on the d_name field. + */ +/* Direntry_t: + * This symbol is set to 'struct direct' or 'struct dirent' depending on + * whether dirent is available or not. You should use this pseudo type to + * portably declare your directory entries. + */ +#define I_DIRENT /**/ +#define DIRNAMLEN /**/ +#define Direntry_t struct direct + +/* I_DLFCN: + * This symbol, if defined, indicates that exists and should + * be included. + */ +#define I_DLFCN /**/ + +/* I_FCNTL: + * This manifest constant tells the C program to include . + */ + +// #define I_FCNTL /**/ + +/* I_FLOAT: + * This symbol, if defined, indicates to the C program that it should + * include to get definition of symbols like DBL_MAX or + * DBL_MIN, i.e. machine dependent floating point values. + */ +#define I_FLOAT /**/ + +/* I_LIMITS: + * This symbol, if defined, indicates to the C program that it should + * include to get definition of symbols like WORD_BIT or + * LONG_MAX, i.e. machine dependant limitations. + */ +#define I_LIMITS /**/ + +/* I_LOCALE: + * This symbol, if defined, indicates to the C program that it should + * include . + */ + +// #define I_LOCALE /**/ + +/* I_MATH: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +#define I_MATH /**/ + +/* I_MEMORY: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/*#define I_MEMORY /**/ + +/* I_NDBM: + * This symbol, if defined, indicates that exists and should + * be included. + */ +/*#define I_NDBM /**/ + +/* I_NET_ERRNO: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_NET_ERRNO /**/ + +/* I_NETINET_IN: + * This symbol, if defined, indicates to the C program that it should + * include . Otherwise, you may try . + */ +/*#define I_NETINET_IN /**/ + +/* I_SFIO: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/*#define I_SFIO /**/ + +/* I_STDDEF: + * This symbol, if defined, indicates that exists and should + * be included. + */ +#define I_STDDEF /**/ + +/* I_STDLIB: + * This symbol, if defined, indicates that exists and should + * be included. + */ +#define I_STDLIB /**/ + +/* I_STRING: + * This symbol, if defined, indicates to the C program that it should + * include (USG systems) instead of (BSD systems). + */ +#define I_STRING /**/ + +/* I_SYS_DIR: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/*#define I_SYS_DIR /**/ + +/* I_SYS_FILE: + * This symbol, if defined, indicates to the C program that it should + * include to get definition of R_OK and friends. + */ +/*#define I_SYS_FILE /**/ + +/* I_SYS_IOCTL: + * This symbol, if defined, indicates that exists and should + * be included. Otherwise, include or . + */ +/*#define I_SYS_IOCTL /**/ + +/* I_SYS_NDIR: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/*#define I_SYS_NDIR /**/ + +/* I_SYS_PARAM: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/*#define I_SYS_PARAM /**/ + +/* I_SYS_RESOURCE: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/*#define I_SYS_RESOURCE /**/ + +/* I_SYS_SELECT: + * This symbol, if defined, indicates to the C program that it should + * include in order to get definition of struct timeval. + */ +/*#define I_SYS_SELECT /**/ + +/* I_SYS_STAT: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +#define I_SYS_STAT /**/ + +/* I_SYS_TIMES: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/*#define I_SYS_TIMES /**/ + +/* I_SYS_TYPES: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +#define I_SYS_TYPES /**/ + +/* I_SYS_UN: + * This symbol, if defined, indicates to the C program that it should + * include to get UNIX domain socket definitions. + */ +/*#define I_SYS_UN /**/ + +/* I_SYS_WAIT: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/*#define I_SYS_WAIT /**/ + +/* I_TERMIO: + * This symbol, if defined, indicates that the program should include + * rather than . There are also differences in + * the ioctl() calls that depend on the value of this symbol. + */ +/* I_TERMIOS: + * This symbol, if defined, indicates that the program should include + * the POSIX termios.h rather than sgtty.h or termio.h. + * There are also differences in the ioctl() calls that depend on the + * value of this symbol. + */ +/* I_SGTTY: + * This symbol, if defined, indicates that the program should include + * rather than . There are also differences in + * the ioctl() calls that depend on the value of this symbol. + */ +/*#define I_TERMIO /**/ +/*#define I_TERMIOS /**/ +/*#define I_SGTTY /**/ + +/* I_UNISTD: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/*#define I_UNISTD /**/ + +/* I_UTIME: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +#define I_UTIME /**/ + +/* I_VALUES: + * This symbol, if defined, indicates to the C program that it should + * include to get definition of symbols like MINFLOAT or + * MAXLONG, i.e. machine dependant limitations. Probably, you + * should use instead, if it is available. + */ +/*#define I_VALUES /**/ + +/* I_STDARG: + * This symbol, if defined, indicates that exists and should + * be included. + */ +/* I_VARARGS: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +#define I_STDARG /**/ +/*#define I_VARARGS /**/ + +/* I_VFORK: + * This symbol, if defined, indicates to the C program that it should + * include vfork.h. + */ +/*#define I_VFORK /**/ + +/* CAN_PROTOTYPE: + * If defined, this macro indicates that the C compiler can handle + * function prototypes. + */ +/* _: + * This macro is used to declare function parameters for folks who want + * to make declarations with prototypes using a different style than + * the above macros. Use double parentheses. For example: + * + * int main _((int argc, char *argv[])); + */ +#define CAN_PROTOTYPE /**/ +#ifdef CAN_PROTOTYPE +#define _(args) args +#else +#define _(args) () +#endif + +/* SH_PATH: + * This symbol contains the full pathname to the shell used on this + * on this system to execute Bourne shell scripts. Usually, this will be + * /bin/sh, though it's possible that some systems will have /bin/ksh, + * /bin/pdksh, /bin/ash, /bin/bash, or even something such as + * D:/bin/sh.exe. + */ +#define SH_PATH "cmd /x /c" /**/ + +/* STDCHAR: + * This symbol is defined to be the type of char used in stdio.h. + * It has the values "unsigned char" or "char". + */ +#define STDCHAR char /**/ + +/* CROSSCOMPILE: + * This symbol, if defined, signifies that we our + * build process is a cross-compilation. + */ +/*#define CROSSCOMPILE /**/ + +/* INTSIZE: + * This symbol contains the value of sizeof(int) so that the C + * preprocessor can make decisions based on it. + */ +/* LONGSIZE: + * This symbol contains the value of sizeof(long) so that the C + * preprocessor can make decisions based on it. + */ +/* SHORTSIZE: + * This symbol contains the value of sizeof(short) so that the C + * preprocessor can make decisions based on it. + */ +#define INTSIZE 4 /**/ +#define LONGSIZE 4 /**/ +#define SHORTSIZE 2 /**/ + +/* MULTIARCH: + * This symbol, if defined, signifies that the build + * process will produce some binary files that are going to be + * used in a cross-platform environment. This is the case for + * example with the NeXT "fat" binaries that contain executables + * for several CPUs. + */ +/*#define MULTIARCH /**/ + +/* HAS_QUAD: + * This symbol, if defined, tells that there's a 64-bit integer type, + * Quad_t, and its unsigned counterpar, Uquad_t. QUADKIND will be one + * of QUAD_IS_INT, QUAD_IS_LONG, QUAD_IS_LONG_LONG, or QUAD_IS_INT64_T. + */ +/*#define HAS_QUAD /**/ +#ifdef HAS_QUAD +# define Quad_t __int64 /**/ +# define Uquad_t unsigned __int64 /**/ +# define QUADKIND 5 /**/ +# define QUAD_IS_INT 1 +# define QUAD_IS_LONG 2 +# define QUAD_IS_LONG_LONG 3 +# define QUAD_IS_INT64_T 4 +#endif + +/* HAS_ACCESSX: + * This symbol, if defined, indicates that the accessx routine is + * available to do extended access checks. + */ +/*#define HAS_ACCESSX /**/ + +/* HAS_EACCESS: + * This symbol, if defined, indicates that the eaccess routine is + * available to do extended access checks. + */ +/*#define HAS_EACCESS /**/ + +/* I_SYS_ACCESS: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/*#define I_SYS_ACCESS /**/ + +/* I_SYS_SECURITY: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/*#define I_SYS_SECURITY /**/ + +/* OSNAME: + * This symbol contains the name of the operating system, as determined + * by Configure. You shouldn't rely on it too much; the specific + * feature tests from Configure are generally more reliable. + */ +#define OSNAME "MSWin32" /**/ + +/* MEM_ALIGNBYTES: + * This symbol contains the number of bytes required to align a + * double, or a long double when applicable. Usual values are 2, + * 4 and 8. The default is eight, for safety. + */ +#if defined(CROSSCOMPILE) || defined(MULTIARCH) +# define MEM_ALIGNBYTES 8 +#else +#define MEM_ALIGNBYTES 8 +#endif + +/* ARCHLIB: + * This variable, if defined, holds the name of the directory in + * which the user wants to put architecture-dependent public + * library files for perl5. It is most often a local directory + * such as /usr/local/lib. Programs using this variable must be + * prepared to deal with filename expansion. If ARCHLIB is the + * same as PRIVLIB, it is not defined, since presumably the + * program already searches PRIVLIB. + */ +/* ARCHLIB_EXP: + * This symbol contains the ~name expanded version of ARCHLIB, to be used + * in programs that are not prepared to deal with ~ expansion at run-time. + */ +#define ARCHLIB "c:\\perl\\5.6.0\\lib\\MSWin32-x86" /**/ +/*#define ARCHLIB_EXP "" /**/ + +/* ARCHNAME: + * This symbol holds a string representing the architecture name. + * It may be used to construct an architecture-dependant pathname + * where library files may be held under a private library, for + * instance. + */ +#define ARCHNAME "MSWin32-x86" /**/ + +/* HAS_ATOLF: + * This symbol, if defined, indicates that the atolf routine is + * available to convert strings into long doubles. + */ +/*#define HAS_ATOLF /**/ + +/* HAS_ATOLL: + * This symbol, if defined, indicates that the atoll routine is + * available to convert strings into long longs. + */ +/*#define HAS_ATOLL /**/ + +/* BIN: + * This symbol holds the path of the bin directory where the package will + * be installed. Program must be prepared to deal with ~name substitution. + */ +/* BIN_EXP: + * This symbol is the filename expanded version of the BIN symbol, for + * programs that do not want to deal with that at run-time. + */ +#define BIN "c:\\perl\\5.6.0\\bin\\MSWin32-x86" /**/ +#define BIN_EXP "c:\\perl\\5.6.0\\bin\\MSWin32-x86" /**/ + +/* PERL_BINCOMPAT_5005: + * This symbol, if defined, indicates that this version of Perl should be + * binary-compatible with Perl 5.005. This is impossible for builds + * that use features like threads and multiplicity it is always undef + * for those versions. + */ +/*#define PERL_BINCOMPAT_5005 /**/ + +/* BYTEORDER: + * This symbol holds the hexadecimal constant defined in byteorder, + * i.e. 0x1234 or 0x4321, etc... + * If the compiler supports cross-compiling or multiple-architecture + * binaries (eg. on NeXT systems), use compiler-defined macros to + * determine the byte order. + * On NeXT 3.2 (and greater), you can build "Fat" Multiple Architecture + * Binaries (MAB) on either big endian or little endian machines. + * The endian-ness is available at compile-time. This only matters + * for perl, where the config.h can be generated and installed on + * one system, and used by a different architecture to build an + * extension. Older versions of NeXT that might not have + * defined either *_ENDIAN__ were all on Motorola 680x0 series, + * so the default case (for NeXT) is big endian to catch them. + * This might matter for NeXT 3.0. + */ +#if defined(CROSSCOMPILE) || defined(MULTIARCH) +# ifdef __LITTLE_ENDIAN__ +# if LONGSIZE == 4 +# define BYTEORDER 0x1234 +# else +# if LONGSIZE == 8 +# define BYTEORDER 0x12345678 +# endif +# endif +# else +# ifdef __BIG_ENDIAN__ +# if LONGSIZE == 4 +# define BYTEORDER 0x4321 +# else +# if LONGSIZE == 8 +# define BYTEORDER 0x87654321 +# endif +# endif +# endif +# endif +# if !defined(BYTEORDER) && (defined(NeXT) || defined(__NeXT__)) +# define BYTEORDER 0x4321 +# endif +#else +#define BYTEORDER 0x1234 /* large digits for MSB */ +#endif /* NeXT */ + +/* CAT2: + * This macro catenates 2 tokens together. + */ +/* STRINGIFY: + * This macro surrounds its token with double quotes. + */ +#if 42 == 1 +# define CAT2(a,b) a/**/b +# define STRINGIFY(a) "a" + /* If you can get stringification with catify, tell me how! */ +#endif +#if 42 == 42 +# define PeRl_CaTiFy(a, b) a ## b +# define PeRl_StGiFy(a) #a +/* the additional level of indirection enables these macros to be + * used as arguments to other macros. See K&R 2nd ed., page 231. */ +# define CAT2(a,b) PeRl_CaTiFy(a,b) +# define StGiFy(a) PeRl_StGiFy(a) +# define STRINGIFY(a) PeRl_StGiFy(a) +#endif +#if 42 != 1 && 42 != 42 +#include "Bletch: How does this C preprocessor catenate tokens?" +#endif + +/* CPPSTDIN: + * This symbol contains the first part of the string which will invoke + * the C preprocessor on the standard input and produce to standard + * output. Typical value of "cc -E" or "/lib/cpp", but it can also + * call a wrapper. See CPPRUN. + */ +/* CPPMINUS: + * This symbol contains the second part of the string which will invoke + * the C preprocessor on the standard input and produce to standard + * output. This symbol will have the value "-" if CPPSTDIN needs a minus + * to specify standard input, otherwise the value is "". + */ +/* CPPRUN: + * This symbol contains the string which will invoke a C preprocessor on + * the standard input and produce to standard output. It needs to end + * with CPPLAST, after all other preprocessor flags have been specified. + * The main difference with CPPSTDIN is that this program will never be a + * pointer to a shell wrapper, i.e. it will be empty if no preprocessor is + * available directly to the user. Note that it may well be different from + * the preprocessor used to compile the C program. + */ +/* CPPLAST: + * This symbol is intended to be used along with CPPRUN in the same manner + * symbol CPPMINUS is used with CPPSTDIN. It contains either "-" or "". + */ +#define CPPSTDIN "cl -nologo -E" +#define CPPMINUS "" +#define CPPRUN "cl -nologo -E" +#define CPPLAST "" + +/* HAS_ACCESS: + * This manifest constant lets the C program know that the access() + * system call is available to check for accessibility using real UID/GID. + * (always present on UNIX.) + */ +#define HAS_ACCESS /**/ + +/* CASTI32: + * This symbol is defined if the C compiler can cast negative + * or large floating point numbers to 32-bit ints. + */ +/*#define CASTI32 /**/ + +/* CASTNEGFLOAT: + * This symbol is defined if the C compiler can cast negative + * numbers to unsigned longs, ints and shorts. + */ +/* CASTFLAGS: + * This symbol contains flags that say what difficulties the compiler + * has casting odd floating values to unsigned long: + * 0 = ok + * 1 = couldn't cast < 0 + * 2 = couldn't cast >= 0x80000000 + * 4 = couldn't cast in argument expression list + */ +#define CASTNEGFLOAT /**/ +#define CASTFLAGS 0 /**/ + +/* VOID_CLOSEDIR: + * This symbol, if defined, indicates that the closedir() routine + * does not return a value. + */ +/*#define VOID_CLOSEDIR /**/ + +/* HAS_CSH: + * This symbol, if defined, indicates that the C-shell exists. + */ +/* CSH: + * This symbol, if defined, contains the full pathname of csh. + */ +/*#define HAS_CSH /**/ +#ifdef HAS_CSH +#define CSH "" /**/ +#endif + +/* DLSYM_NEEDS_UNDERSCORE: + * This symbol, if defined, indicates that we need to prepend an + * underscore to the symbol name before calling dlsym(). This only + * makes sense if you *have* dlsym, which we will presume is the + * case if you're using dl_dlopen.xs. + */ +/*#define DLSYM_NEEDS_UNDERSCORE /**/ + +/* HAS_DRAND48_PROTO: + * This symbol, if defined, indicates that the system provides + * a prototype for the drand48() function. Otherwise, it is up + * to the program to supply one. A good guess is + * extern double drand48 _((void)); + */ +/*#define HAS_DRAND48_PROTO /**/ + +/* HAS_ENDGRENT: + * This symbol, if defined, indicates that the getgrent routine is + * available for finalizing sequential access of the group database. + */ +/*#define HAS_ENDGRENT /**/ + +/* HAS_ENDHOSTENT: + * This symbol, if defined, indicates that the endhostent() routine is + * available to close whatever was being used for host queries. + */ +/*#define HAS_ENDHOSTENT /**/ + +/* HAS_ENDNETENT: + * This symbol, if defined, indicates that the endnetent() routine is + * available to close whatever was being used for network queries. + */ +/*#define HAS_ENDNETENT /**/ + +/* HAS_ENDPROTOENT: + * This symbol, if defined, indicates that the endprotoent() routine is + * available to close whatever was being used for protocol queries. + */ +/*#define HAS_ENDPROTOENT /**/ + +/* HAS_ENDPWENT: + * This symbol, if defined, indicates that the getgrent routine is + * available for finalizing sequential access of the passwd database. + */ +/*#define HAS_ENDPWENT /**/ + +/* HAS_ENDSERVENT: + * This symbol, if defined, indicates that the endservent() routine is + * available to close whatever was being used for service queries. + */ +/*#define HAS_ENDSERVENT /**/ + +/* HAS_ENDSPENT: + * This symbol, if defined, indicates that the endspent system call is + * available to finalize the scan of SysV shadow password entries. + */ +/*#define HAS_ENDSPENT /**/ + +/* HAS_FD_SET: + * This symbol, when defined, indicates presence of the fd_set typedef + * in + */ +#define HAS_FD_SET /**/ + +/* HAS_FPOS64_T: + * This symbol will be defined if the C compiler supports fpos64_t. + */ +/*#define HAS_FPOS64_T /**/ + +/* HAS_STRUCT_FS_DATA: + * This symbol, if defined, indicates that the struct fs_data + * to do statfs() is supported. + */ +/*#define HAS_STRUCT_FS_DATA /**/ + +/* HAS_FSEEKO: + * This symbol, if defined, indicates that the fseeko routine is + * available to fseek beyond 32 bits (useful for ILP32 hosts). + */ +/*#define HAS_FSEEKO /**/ + +/* HAS_FSTATFS: + * This symbol, if defined, indicates that the fstatfs routine is + * available to stat filesystems by file descriptors. + */ +/*#define HAS_FSTATFS /**/ + +/* HAS_FTELLO: + * This symbol, if defined, indicates that the ftello routine is + * available to ftell beyond 32 bits (useful for ILP32 hosts). + */ +/*#define HAS_FTELLO /**/ + +/* Gconvert: + * This preprocessor macro is defined to convert a floating point + * number to a string without a trailing decimal point. This + * emulates the behavior of sprintf("%g"), but is sometimes much more + * efficient. If gconvert() is not available, but gcvt() drops the + * trailing decimal point, then gcvt() is used. If all else fails, + * a macro using sprintf("%g") is used. Arguments for the Gconvert + * macro are: value, number of digits, whether trailing zeros should + * be retained, and the output buffer. + * Possible values are: + * d_Gconvert='gconvert((x),(n),(t),(b))' + * d_Gconvert='gcvt((x),(n),(b))' + * d_Gconvert='sprintf((b),"%.*g",(n),(x))' + * The last two assume trailing zeros should not be kept. + */ +#define Gconvert(x,n,t,b) sprintf((b),"%.*g",(n),(x)) + +/* HAS_GETCWD: + * This symbol, if defined, indicates that the getcwd routine is + * available to get the current working directory. + */ +/*#define HAS_GETCWD /**/ + +/* HAS_GETFSSTAT: + * This symbol, if defined, indicates that the getfsstat routine is + * available to stat filesystems in bulk. + */ +/*#define HAS_GETFSSTAT /**/ + +/* HAS_GETGRENT: + * This symbol, if defined, indicates that the getgrent routine is + * available for sequential access of the group database. + */ +/*#define HAS_GETGRENT /**/ + +/* HAS_GETHOSTBYADDR: + * This symbol, if defined, indicates that the gethostbyaddr() routine is + * available to look up hosts by their IP addresses. + */ +#define HAS_GETHOSTBYADDR /**/ + +/* HAS_GETHOSTBYNAME: + * This symbol, if defined, indicates that the gethostbyname() routine is + * available to look up host names in some data base or other. + */ +#define HAS_GETHOSTBYNAME /**/ + +/* HAS_GETHOSTENT: + * This symbol, if defined, indicates that the gethostent() routine is + * available to look up host names in some data base or another. + */ +/*#define HAS_GETHOSTENT /**/ + +/* HAS_GETHOSTNAME: + * This symbol, if defined, indicates that the C program may use the + * gethostname() routine to derive the host name. See also HAS_UNAME + * and PHOSTNAME. + */ +/* HAS_UNAME: + * This symbol, if defined, indicates that the C program may use the + * uname() routine to derive the host name. See also HAS_GETHOSTNAME + * and PHOSTNAME. + */ +/* PHOSTNAME: + * This symbol, if defined, indicates the command to feed to the + * popen() routine to derive the host name. See also HAS_GETHOSTNAME + * and HAS_UNAME. Note that the command uses a fully qualified path, + * so that it is safe even if used by a process with super-user + * privileges. + */ +/* HAS_PHOSTNAME: + * This symbol, if defined, indicates that the C program may use the + * contents of PHOSTNAME as a command to feed to the popen() routine + * to derive the host name. + */ +#define HAS_GETHOSTNAME /**/ +#define HAS_UNAME /**/ +/*#define HAS_PHOSTNAME /**/ +#ifdef HAS_PHOSTNAME +#define PHOSTNAME "" /* How to get the host name */ +#endif + +/* HAS_GETHOST_PROTOS: + * This symbol, if defined, indicates that includes + * prototypes for gethostent(), gethostbyname(), and + * gethostbyaddr(). Otherwise, it is up to the program to guess + * them. See netdbtype.U for probing for various Netdb_xxx_t types. + */ +#define HAS_GETHOST_PROTOS /**/ + +/* HAS_GETMNT: + * This symbol, if defined, indicates that the getmnt routine is + * available to get filesystem mount info by filename. + */ +/*#define HAS_GETMNT /**/ + +/* HAS_GETMNTENT: + * This symbol, if defined, indicates that the getmntent routine is + * available to iterate through mounted file systems to get their info. + */ +/*#define HAS_GETMNTENT /**/ + +/* HAS_GETNETBYADDR: + * This symbol, if defined, indicates that the getnetbyaddr() routine is + * available to look up networks by their IP addresses. + */ +/*#define HAS_GETNETBYADDR /**/ + +/* HAS_GETNETBYNAME: + * This symbol, if defined, indicates that the getnetbyname() routine is + * available to look up networks by their names. + */ +/*#define HAS_GETNETBYNAME /**/ + +/* HAS_GETNETENT: + * This symbol, if defined, indicates that the getnetent() routine is + * available to look up network names in some data base or another. + */ +/*#define HAS_GETNETENT /**/ + +/* HAS_GETNET_PROTOS: + * This symbol, if defined, indicates that includes + * prototypes for getnetent(), getnetbyname(), and + * getnetbyaddr(). Otherwise, it is up to the program to guess + * them. See netdbtype.U for probing for various Netdb_xxx_t types. + */ +/*#define HAS_GETNET_PROTOS /**/ + +/* HAS_GETPROTOENT: + * This symbol, if defined, indicates that the getprotoent() routine is + * available to look up protocols in some data base or another. + */ +/*#define HAS_GETPROTOENT /**/ + +/* HAS_GETPROTOBYNAME: + * This symbol, if defined, indicates that the getprotobyname() + * routine is available to look up protocols by their name. + */ +/* HAS_GETPROTOBYNUMBER: + * This symbol, if defined, indicates that the getprotobynumber() + * routine is available to look up protocols by their number. + */ +#define HAS_GETPROTOBYNAME /**/ +#define HAS_GETPROTOBYNUMBER /**/ + +/* HAS_GETPROTO_PROTOS: + * This symbol, if defined, indicates that includes + * prototypes for getprotoent(), getprotobyname(), and + * getprotobyaddr(). Otherwise, it is up to the program to guess + * them. See netdbtype.U for probing for various Netdb_xxx_t types. + */ +#define HAS_GETPROTO_PROTOS /**/ + +/* HAS_GETPWENT: + * This symbol, if defined, indicates that the getpwent routine is + * available for sequential access of the passwd database. + * If this is not available, the older getpw() function may be available. + */ +/*#define HAS_GETPWENT /**/ + +/* HAS_GETSERVENT: + * This symbol, if defined, indicates that the getservent() routine is + * available to look up network services in some data base or another. + */ +/*#define HAS_GETSERVENT /**/ + +/* HAS_GETSERV_PROTOS: + * This symbol, if defined, indicates that includes + * prototypes for getservent(), getservbyname(), and + * getservbyaddr(). Otherwise, it is up to the program to guess + * them. See netdbtype.U for probing for various Netdb_xxx_t types. + */ +#define HAS_GETSERV_PROTOS /**/ + +/* HAS_GETSPENT: + * This symbol, if defined, indicates that the getspent system call is + * available to retrieve SysV shadow password entries sequentially. + */ +/*#define HAS_GETSPENT /**/ + +/* HAS_GETSPNAM: + * This symbol, if defined, indicates that the getspnam system call is + * available to retrieve SysV shadow password entries by name. + */ +/*#define HAS_GETSPNAM /**/ + +/* HAS_GETSERVBYNAME: + * This symbol, if defined, indicates that the getservbyname() + * routine is available to look up services by their name. + */ +/* HAS_GETSERVBYPORT: + * This symbol, if defined, indicates that the getservbyport() + * routine is available to look up services by their port. + */ +#define HAS_GETSERVBYNAME /**/ +#define HAS_GETSERVBYPORT /**/ + +/* HAS_GNULIBC: + * This symbol, if defined, indicates to the C program that + * the GNU C library is being used. + */ +/*#define HAS_GNULIBC /**/ +#if defined(HAS_GNULIBC) && !defined(_GNU_SOURCE) +# define _GNU_SOURCE +#endif +/* HAS_HASMNTOPT: + * This symbol, if defined, indicates that the hasmntopt routine is + * available to query the mount options of file systems. + */ +/*#define HAS_HASMNTOPT /**/ + +/* HAS_HTONL: + * This symbol, if defined, indicates that the htonl() routine (and + * friends htons() ntohl() ntohs()) are available to do network + * order byte swapping. + */ +/* HAS_HTONS: + * This symbol, if defined, indicates that the htons() routine (and + * friends htonl() ntohl() ntohs()) are available to do network + * order byte swapping. + */ +/* HAS_NTOHL: + * This symbol, if defined, indicates that the ntohl() routine (and + * friends htonl() htons() ntohs()) are available to do network + * order byte swapping. + */ +/* HAS_NTOHS: + * This symbol, if defined, indicates that the ntohs() routine (and + * friends htonl() htons() ntohl()) are available to do network + * order byte swapping. + */ +#define HAS_HTONL /**/ +#define HAS_HTONS /**/ +#define HAS_NTOHL /**/ +#define HAS_NTOHS /**/ + +/* HAS_ICONV: + * This symbol, if defined, indicates that the iconv routine is + * available to do character set conversions. + */ +/*#define HAS_ICONV /**/ + +/* HAS_INT64_T: + * This symbol will defined if the C compiler supports int64_t. + * Usually the needs to be included, but sometimes + * is enough. + */ +/*#define HAS_INT64_T /**/ + +/* HAS_ISASCII: + * This manifest constant lets the C program know that isascii + * is available. + */ +#define HAS_ISASCII /**/ + +/* HAS_LDBL_DIG: + * This symbol, if defined, indicates that this system's + * or defines the symbol LDBL_DIG, which is the number + * of significant digits in a long double precision number. Unlike + * for DBL_DIG, there's no good guess for LDBL_DIG if it is undefined. + */ +#define HAS_LDBL_DIG /**/ + +/* HAS_LONG_DOUBLE: + * This symbol will be defined if the C compiler supports long + * doubles. + */ +/* LONG_DOUBLESIZE: + * This symbol contains the size of a long double, so that the + * C preprocessor can make decisions based on it. It is only + * defined if the system supports long doubles. + */ + +// long double is 8 on WINCE + +#define HAS_LONG_DOUBLE /**/ +#ifdef HAS_LONG_DOUBLE +#define LONG_DOUBLESIZE 8 /**/ +#endif + +/* HAS_LONG_LONG: + * This symbol will be defined if the C compiler supports long long. + */ +/* LONGLONGSIZE: + * This symbol contains the size of a long long, so that the + * C preprocessor can make decisions based on it. It is only + * defined if the system supports long long. + */ +/*#define HAS_LONG_LONG /**/ +#ifdef HAS_LONG_LONG +#define LONGLONGSIZE 8 /**/ +#endif + +/* HAS_LSEEK_PROTO: + * This symbol, if defined, indicates that the system provides + * a prototype for the lseek() function. Otherwise, it is up + * to the program to supply one. A good guess is + * extern off_t lseek(int, off_t, int); + */ +#define HAS_LSEEK_PROTO /**/ + +/* HAS_MADVISE: + * This symbol, if defined, indicates that the madvise system call is + * available to map a file into memory. + */ +/*#define HAS_MADVISE /**/ + +/* HAS_MEMCHR: + * This symbol, if defined, indicates that the memchr routine is available + * to locate characters within a C string. + */ +#define HAS_MEMCHR /**/ + +/* HAS_MKDTEMP: + * This symbol, if defined, indicates that the mkdtemp routine is + * available to exclusively create a uniquely named temporary directory. + */ +/*#define HAS_MKDTEMP /**/ + +/* HAS_MKSTEMP: + * This symbol, if defined, indicates that the mkstemp routine is + * available to exclusively create and open a uniquely named + * temporary file. + */ +/*#define HAS_MKSTEMP /**/ + +/* HAS_MKSTEMPS: + * This symbol, if defined, indicates that the mkstemps routine is + * available to excluslvely create and open a uniquely named + * (with a suffix) temporary file. + */ +/*#define HAS_MKSTEMPS /**/ + +/* HAS_MMAP: + * This symbol, if defined, indicates that the mmap system call is + * available to map a file into memory. + */ +/* Mmap_t: + * This symbol holds the return type of the mmap() system call + * (and simultaneously the type of the first argument). + * Usually set to 'void *' or 'cadd_t'. + */ +/*#define HAS_MMAP /**/ +#define Mmap_t void * /**/ + +/* HAS_MPROTECT: + * This symbol, if defined, indicates that the mprotect system call is + * available to modify the access protection of a memory mapped file. + */ +/*#define HAS_MPROTECT /**/ + +/* HAS_MSG: + * This symbol, if defined, indicates that the entire msg*(2) library is + * supported (IPC mechanism based on message queues). + */ +/*#define HAS_MSG /**/ + +/* HAS_OFF64_T: + * This symbol will be defined if the C compiler supports off64_t. + */ +/*#define HAS_OFF64_T /**/ + +/* HAS_OPEN3: + * This manifest constant lets the C program know that the three + * argument form of open(2) is available. + */ +/*#define HAS_OPEN3 /**/ + +/* OLD_PTHREAD_CREATE_JOINABLE: + * This symbol, if defined, indicates how to create pthread + * in joinable (aka undetached) state. NOTE: not defined + * if pthread.h already has defined PTHREAD_CREATE_JOINABLE + * (the new version of the constant). + * If defined, known values are PTHREAD_CREATE_UNDETACHED + * and __UNDETACHED. + */ +/*#define OLD_PTHREAD_CREATE_JOINABLE /**/ + +/* HAS_PTHREAD_YIELD: + * This symbol, if defined, indicates that the pthread_yield + * routine is available to yield the execution of the current + * thread. sched_yield is preferable to pthread_yield. + */ +/* SCHED_YIELD: + * This symbol defines the way to yield the execution of + * the current thread. Known ways are sched_yield, + * pthread_yield, and pthread_yield with NULL. + */ +/* HAS_SCHED_YIELD: + * This symbol, if defined, indicates that the sched_yield + * routine is available to yield the execution of the current + * thread. sched_yield is preferable to pthread_yield. + */ +/*#define HAS_PTHREAD_YIELD /**/ +#define SCHED_YIELD /**/ +/*#define HAS_SCHED_YIELD /**/ + +/* HAS_SAFE_BCOPY: + * This symbol, if defined, indicates that the bcopy routine is available + * to copy potentially overlapping memory blocks. Otherwise you should + * probably use memmove() or memcpy(). If neither is defined, roll your + * own version. + */ +/*#define HAS_SAFE_BCOPY /**/ + +/* HAS_SAFE_MEMCPY: + * This symbol, if defined, indicates that the memcpy routine is available + * to copy potentially overlapping memory blocks. Otherwise you should + * probably use memmove() or memcpy(). If neither is defined, roll your + * own version. + */ +/*#define HAS_SAFE_MEMCPY /**/ + +/* HAS_SANE_MEMCMP: + * This symbol, if defined, indicates that the memcmp routine is available + * and can be used to compare relative magnitudes of chars with their high + * bits set. If it is not defined, roll your own version. + */ +#define HAS_SANE_MEMCMP /**/ + +/* HAS_SEM: + * This symbol, if defined, indicates that the entire sem*(2) library is + * supported. + */ +/*#define HAS_SEM /**/ + +/* HAS_SETGRENT: + * This symbol, if defined, indicates that the setgrent routine is + * available for initializing sequential access of the group database. + */ +/*#define HAS_SETGRENT /**/ + +/* HAS_SETGROUPS: + * This symbol, if defined, indicates that the setgroups() routine is + * available to set the list of process groups. If unavailable, multiple + * groups are probably not supported. + */ +/*#define HAS_SETGROUPS /**/ + +/* HAS_SETHOSTENT: + * This symbol, if defined, indicates that the sethostent() routine is + * available. + */ +/*#define HAS_SETHOSTENT /**/ + +/* HAS_SETNETENT: + * This symbol, if defined, indicates that the setnetent() routine is + * available. + */ +/*#define HAS_SETNETENT /**/ + +/* HAS_SETPROTOENT: + * This symbol, if defined, indicates that the setprotoent() routine is + * available. + */ +/*#define HAS_SETPROTOENT /**/ + +/* HAS_SETPWENT: + * This symbol, if defined, indicates that the setpwent routine is + * available for initializing sequential access of the passwd database. + */ +/*#define HAS_SETPWENT /**/ + +/* HAS_SETSERVENT: + * This symbol, if defined, indicates that the setservent() routine is + * available. + */ +/*#define HAS_SETSERVENT /**/ + +/* HAS_SETSPENT: + * This symbol, if defined, indicates that the setspent system call is + * available to initialize the scan of SysV shadow password entries. + */ +/*#define HAS_SETSPENT /**/ + +/* HAS_SETVBUF: + * This symbol, if defined, indicates that the setvbuf routine is + * available to change buffering on an open stdio stream. + * to a line-buffered mode. + */ +#define HAS_SETVBUF /**/ + +/* USE_SFIO: + * This symbol, if defined, indicates that sfio should + * be used. + */ +/*#define USE_SFIO /**/ + +/* HAS_SHM: + * This symbol, if defined, indicates that the entire shm*(2) library is + * supported. + */ +/*#define HAS_SHM /**/ + +/* HAS_SIGACTION: + * This symbol, if defined, indicates that Vr4's sigaction() routine + * is available. + */ +/*#define HAS_SIGACTION /**/ + +/* HAS_SIGSETJMP: + * This variable indicates to the C program that the sigsetjmp() + * routine is available to save the calling process's registers + * and stack environment for later use by siglongjmp(), and + * to optionally save the process's signal mask. See + * Sigjmp_buf, Sigsetjmp, and Siglongjmp. + */ +/* Sigjmp_buf: + * This is the buffer type to be used with Sigsetjmp and Siglongjmp. + */ +/* Sigsetjmp: + * This macro is used in the same way as sigsetjmp(), but will invoke + * traditional setjmp() if sigsetjmp isn't available. + * See HAS_SIGSETJMP. + */ +/* Siglongjmp: + * This macro is used in the same way as siglongjmp(), but will invoke + * traditional longjmp() if siglongjmp isn't available. + * See HAS_SIGSETJMP. + */ +/*#define HAS_SIGSETJMP /**/ +#ifdef HAS_SIGSETJMP +#define Sigjmp_buf sigjmp_buf +#define Sigsetjmp(buf,save_mask) sigsetjmp((buf),(save_mask)) +#define Siglongjmp(buf,retval) siglongjmp((buf),(retval)) +#else +#define Sigjmp_buf jmp_buf +#define Sigsetjmp(buf,save_mask) setjmp((buf)) +#define Siglongjmp(buf,retval) longjmp((buf),(retval)) +#endif + +/* HAS_SOCKET: + * This symbol, if defined, indicates that the BSD socket interface is + * supported. + */ +/* HAS_SOCKETPAIR: + * This symbol, if defined, indicates that the BSD socketpair() call is + * supported. + */ +/* HAS_MSG_CTRUNC: + * This symbol, if defined, indicates that the MSG_CTRUNC is supported. + * Checking just with #ifdef might not be enough because this symbol + * has been known to be an enum. + */ +/* HAS_MSG_DONTROUTE: + * This symbol, if defined, indicates that the MSG_DONTROUTE is supported. + * Checking just with #ifdef might not be enough because this symbol + * has been known to be an enum. + */ +/* HAS_MSG_OOB: + * This symbol, if defined, indicates that the MSG_OOB is supported. + * Checking just with #ifdef might not be enough because this symbol + * has been known to be an enum. + */ +/* HAS_MSG_PEEK: + * This symbol, if defined, indicates that the MSG_PEEK is supported. + * Checking just with #ifdef might not be enough because this symbol + * has been known to be an enum. + */ +/* HAS_MSG_PROXY: + * This symbol, if defined, indicates that the MSG_PROXY is supported. + * Checking just with #ifdef might not be enough because this symbol + * has been known to be an enum. + */ +/* HAS_SCM_RIGHTS: + * This symbol, if defined, indicates that the SCM_RIGHTS is supported. + * Checking just with #ifdef might not be enough because this symbol + * has been known to be an enum. + */ +#define HAS_SOCKET /**/ +/*#define HAS_SOCKETPAIR /**/ +/*#define HAS_MSG_CTRUNC /**/ +/*#define HAS_MSG_DONTROUTE /**/ +/*#define HAS_MSG_OOB /**/ +/*#define HAS_MSG_PEEK /**/ +/*#define HAS_MSG_PROXY /**/ +/*#define HAS_SCM_RIGHTS /**/ + +/* HAS_SQRTL: + * This symbol, if defined, indicates that the sqrtl routine is + * available to do long double square roots. + */ +/*#define HAS_SQRTL /**/ + +/* USE_STAT_BLOCKS: + * This symbol is defined if this system has a stat structure declaring + * st_blksize and st_blocks. + */ +#ifndef USE_STAT_BLOCKS +/*#define USE_STAT_BLOCKS /**/ +#endif + +/* HAS_STRUCT_STATFS_F_FLAGS: + * This symbol, if defined, indicates that the struct statfs + * does have the f_flags member containing the mount flags of + * the filesystem containing the file. + * This kind of struct statfs is coming from (BSD 4.3), + * not from (SYSV). Older BSDs (like Ultrix) do not + * have statfs() and struct statfs, they have ustat() and getmnt() + * with struct ustat and struct fs_data. + */ +/*#define HAS_STRUCT_STATFS_F_FLAGS /**/ + +/* HAS_STRUCT_STATFS: + * This symbol, if defined, indicates that the struct statfs + * to do statfs() is supported. + */ +/*#define HAS_STRUCT_STATFS /**/ + +/* HAS_FSTATVFS: + * This symbol, if defined, indicates that the fstatvfs routine is + * available to stat filesystems by file descriptors. + */ +/*#define HAS_FSTATVFS /**/ + +/* USE_STDIO_PTR: + * This symbol is defined if the _ptr and _cnt fields (or similar) + * of the stdio FILE structure can be used to access the stdio buffer + * for a file handle. If this is defined, then the FILE_ptr(fp) + * and FILE_cnt(fp) macros will also be defined and should be used + * to access these fields. + */ +/* FILE_ptr: + * This macro is used to access the _ptr field (or equivalent) of the + * FILE structure pointed to by its argument. This macro will always be + * defined if USE_STDIO_PTR is defined. + */ +/* STDIO_PTR_LVALUE: + * This symbol is defined if the FILE_ptr macro can be used as an + * lvalue. + */ +/* FILE_cnt: + * This macro is used to access the _cnt field (or equivalent) of the + * FILE structure pointed to by its argument. This macro will always be + * defined if USE_STDIO_PTR is defined. + */ +/* STDIO_CNT_LVALUE: + * This symbol is defined if the FILE_cnt macro can be used as an + * lvalue. + */ +#define USE_STDIO_PTR /**/ +#ifdef USE_STDIO_PTR +#define FILE_ptr(fp) ((fp)->_ptr) +#define STDIO_PTR_LVALUE /**/ +#define FILE_cnt(fp) ((fp)->_cnt) +#define STDIO_CNT_LVALUE /**/ +#endif + +/* USE_STDIO_BASE: + * This symbol is defined if the _base field (or similar) of the + * stdio FILE structure can be used to access the stdio buffer for + * a file handle. If this is defined, then the FILE_base(fp) macro + * will also be defined and should be used to access this field. + * Also, the FILE_bufsiz(fp) macro will be defined and should be used + * to determine the number of bytes in the buffer. USE_STDIO_BASE + * will never be defined unless USE_STDIO_PTR is. + */ +/* FILE_base: + * This macro is used to access the _base field (or equivalent) of the + * FILE structure pointed to by its argument. This macro will always be + * defined if USE_STDIO_BASE is defined. + */ +/* FILE_bufsiz: + * This macro is used to determine the number of bytes in the I/O + * buffer pointed to by _base field (or equivalent) of the FILE + * structure pointed to its argument. This macro will always be defined + * if USE_STDIO_BASE is defined. + */ +#define USE_STDIO_BASE /**/ +#ifdef USE_STDIO_BASE +#define FILE_base(fp) ((fp)->_base) +#define FILE_bufsiz(fp) ((fp)->_cnt + (fp)->_ptr - (fp)->_base) +#endif + +/* HAS_STRERROR: + * This symbol, if defined, indicates that the strerror routine is + * available to translate error numbers to strings. See the writeup + * of Strerror() in this file before you try to define your own. + */ +/* HAS_SYS_ERRLIST: + * This symbol, if defined, indicates that the sys_errlist array is + * available to translate error numbers to strings. The extern int + * sys_nerr gives the size of that table. + */ +/* Strerror: + * This preprocessor symbol is defined as a macro if strerror() is + * not available to translate error numbers to strings but sys_errlist[] + * array is there. + */ +#define HAS_STRERROR /**/ +#define HAS_SYS_ERRLIST /**/ +#define Strerror(e) strerror(e) + +/* HAS_STRTOLD: + * This symbol, if defined, indicates that the strtold routine is + * available to convert strings to long doubles. + */ +/*#define HAS_STRTOLD /**/ + +/* HAS_STRTOLL: + * This symbol, if defined, indicates that the strtoll routine is + * available to convert strings to long longs. + */ +/*#define HAS_STRTOLL /**/ + +/* HAS_STRTOULL: + * This symbol, if defined, indicates that the strtoull routine is + * available to convert strings to unsigned long longs. + */ +/*#define HAS_STRTOULL /**/ + +/* HAS_STRTOUQ: + * This symbol, if defined, indicates that the strtouq routine is + * available to convert strings to unsigned long longs (quads). + */ +/*#define HAS_STRTOUQ /**/ + +/* HAS_TELLDIR_PROTO: + * This symbol, if defined, indicates that the system provides + * a prototype for the telldir() function. Otherwise, it is up + * to the program to supply one. A good guess is + * extern long telldir _((DIR*)); + */ +#define HAS_TELLDIR_PROTO /**/ + +/* Time_t: + * This symbol holds the type returned by time(). It can be long, + * or time_t on BSD sites (in which case should be + * included). + */ +#define Time_t time_t /* Time type */ + +/* HAS_TIMES: + * This symbol, if defined, indicates that the times() routine exists. + * Note that this became obsolete on some systems (SUNOS), which now + * use getrusage(). It may be necessary to include . + */ +#define HAS_TIMES /**/ + +/* HAS_UNION_SEMUN: + * This symbol, if defined, indicates that the union semun is + * defined by including . If not, the user code + * probably needs to define it as: + * union semun { + * int val; + * struct semid_ds *buf; + * unsigned short *array; + * } + */ +/* USE_SEMCTL_SEMUN: + * This symbol, if defined, indicates that union semun is + * used for semctl IPC_STAT. + */ +/* USE_SEMCTL_SEMID_DS: + * This symbol, if defined, indicates that struct semid_ds * is + * used for semctl IPC_STAT. + */ +#define HAS_UNION_SEMUN /**/ +/*#define USE_SEMCTL_SEMUN /**/ +/*#define USE_SEMCTL_SEMID_DS /**/ + +/* HAS_USTAT: + * This symbol, if defined, indicates that the ustat system call is + * available to query file system statistics by dev_t. + */ +/*#define HAS_USTAT /**/ + +/* HAS_VFORK: + * This symbol, if defined, indicates that vfork() exists. + */ +/*#define HAS_VFORK /**/ + +/* Signal_t: + * This symbol's value is either "void" or "int", corresponding to the + * appropriate return type of a signal handler. Thus, you can declare + * a signal handler using "Signal_t (*handler)()", and define the + * handler using "Signal_t handler(sig)". + */ +#define Signal_t void /* Signal handler's return type */ + +/* HAS_VPRINTF: + * This symbol, if defined, indicates that the vprintf routine is available + * to printf with a pointer to an argument list. If unavailable, you + * may need to write your own, probably in terms of _doprnt(). + */ +/* USE_CHAR_VSPRINTF: + * This symbol is defined if this system has vsprintf() returning type + * (char*). The trend seems to be to declare it as "int vsprintf()". It + * is up to the package author to declare vsprintf correctly based on the + * symbol. + */ +#define HAS_VPRINTF /**/ +/*#define USE_CHAR_VSPRINTF /**/ + +/* USE_DYNAMIC_LOADING: + * This symbol, if defined, indicates that dynamic loading of + * some sort is available. + */ +#define USE_DYNAMIC_LOADING /**/ + +/* DOUBLESIZE: + * This symbol contains the size of a double, so that the C preprocessor + * can make decisions based on it. + */ +#define DOUBLESIZE 8 /**/ + +/* EBCDIC: + * This symbol, if defined, indicates that this system uses + * EBCDIC encoding. + */ +/*#define EBCDIC /**/ + +/* FFLUSH_NULL: + * This symbol, if defined, tells that fflush(NULL) does flush + * all pending stdio output. + */ +/* FFLUSH_ALL: + * This symbol, if defined, tells that to flush + * all pending stdio output one must loop through all + * the stdio file handles stored in an array and fflush them. + * Note that if fflushNULL is defined, fflushall will not + * even be probed for and will be left undefined. + */ +#define FFLUSH_NULL /**/ +/*#define FFLUSH_ALL /**/ + +/* Fpos_t: + * This symbol holds the type used to declare file positions in libc. + * It can be fpos_t, long, uint, etc... It may be necessary to include + * to get any typedef'ed information. + */ +#define Fpos_t fpos_t /* File position type */ + +/* Gid_t_f: + * This symbol defines the format string used for printing a Gid_t. + */ +#define Gid_t_f "ld" /**/ + +/* Gid_t_sign: + * This symbol holds the signedess of a Gid_t. + * 1 for unsigned, -1 for signed. + */ +#define Gid_t_sign -1 /* GID sign */ + +/* Gid_t_size: + * This symbol holds the size of a Gid_t in bytes. + */ +#define Gid_t_size 4 /* GID size */ + +/* Gid_t: + * This symbol holds the return type of getgid() and the type of + * argument to setrgid() and related functions. Typically, + * it is the type of group ids in the kernel. It can be int, ushort, + * gid_t, etc... It may be necessary to include to get + * any typedef'ed information. + */ +#define Gid_t gid_t /* Type for getgid(), etc... */ + +/* Groups_t: + * This symbol holds the type used for the second argument to + * getgroups() and setgroups(). Usually, this is the same as + * gidtype (gid_t) , but sometimes it isn't. + * It can be int, ushort, gid_t, etc... + * It may be necessary to include to get any + * typedef'ed information. This is only required if you have + * getgroups() or setgroups().. + */ +#if defined(HAS_GETGROUPS) || defined(HAS_SETGROUPS) +#define Groups_t gid_t /* Type for 2nd arg to [sg]etgroups() */ +#endif + +/* DB_Prefix_t: + * This symbol contains the type of the prefix structure element + * in the header file. In older versions of DB, it was + * int, while in newer ones it is u_int32_t. + */ +/* DB_Hash_t: + * This symbol contains the type of the prefix structure element + * in the header file. In older versions of DB, it was + * int, while in newer ones it is size_t. + */ +#define DB_Hash_t int /**/ +#define DB_Prefix_t int /**/ + +/* I_GRP: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/* GRPASSWD: + * This symbol, if defined, indicates to the C program that struct group + * in contains gr_passwd. + */ +/*#define I_GRP /**/ +/*#define GRPASSWD /**/ + +/* I_ICONV: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_ICONV /**/ + +/* I_IEEEFP: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_IEEEFP /**/ + +/* I_INTTYPES: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/*#define I_INTTYPES /**/ + +/* I_MACH_CTHREADS: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/*#define I_MACH_CTHREADS /**/ + +/* I_MNTENT: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_MNTENT /**/ + +/* I_NETDB: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_NETDB /**/ + +/* I_NETINET_TCP: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/*#define I_NETINET_TCP /**/ + +/* I_POLL: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_POLL /**/ + +/* I_PTHREAD: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/*#define I_PTHREAD /**/ + +/* I_PWD: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/* PWQUOTA: + * This symbol, if defined, indicates to the C program that struct passwd + * contains pw_quota. + */ +/* PWAGE: + * This symbol, if defined, indicates to the C program that struct passwd + * contains pw_age. + */ +/* PWCHANGE: + * This symbol, if defined, indicates to the C program that struct passwd + * contains pw_change. + */ +/* PWCLASS: + * This symbol, if defined, indicates to the C program that struct passwd + * contains pw_class. + */ +/* PWEXPIRE: + * This symbol, if defined, indicates to the C program that struct passwd + * contains pw_expire. + */ +/* PWCOMMENT: + * This symbol, if defined, indicates to the C program that struct passwd + * contains pw_comment. + */ +/* PWGECOS: + * This symbol, if defined, indicates to the C program that struct passwd + * contains pw_gecos. + */ +/* PWPASSWD: + * This symbol, if defined, indicates to the C program that struct passwd + * contains pw_passwd. + */ +/*#define I_PWD /**/ +/*#define PWQUOTA /**/ +/*#define PWAGE /**/ +/*#define PWCHANGE /**/ +/*#define PWCLASS /**/ +/*#define PWEXPIRE /**/ +/*#define PWCOMMENT /**/ +/*#define PWGECOS /**/ +/*#define PWPASSWD /**/ + +/* I_SHADOW: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_SHADOW /**/ + +/* I_SOCKS: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_SOCKS /**/ + +/* I_SUNMATH: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_SUNMATH /**/ + +/* I_SYSLOG: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_SYSLOG /**/ + +/* I_SYSMODE: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_SYSMODE /**/ + +/* I_SYS_MOUNT: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_SYS_MOUNT /**/ + +/* I_SYS_STATFS: + * This symbol, if defined, indicates that exists. + */ +/*#define I_SYS_STATFS /**/ + +/* I_SYS_STATVFS: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_SYS_STATVFS /**/ + +/* I_SYSUIO: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_SYSUIO /**/ + +/* I_SYSUTSNAME: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_SYSUTSNAME /**/ + +/* I_SYS_VFS: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_SYS_VFS /**/ + +/* I_TIME: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/* I_SYS_TIME: + * This symbol, if defined, indicates to the C program that it should + * include . + */ +/* I_SYS_TIME_KERNEL: + * This symbol, if defined, indicates to the C program that it should + * include with KERNEL defined. + */ +#define I_TIME /**/ +/*#define I_SYS_TIME /**/ +/*#define I_SYS_TIME_KERNEL /**/ + +/* I_USTAT: + * This symbol, if defined, indicates that exists and + * should be included. + */ +/*#define I_USTAT /**/ + +/* PERL_INC_VERSION_LIST: + * This variable specifies the list of subdirectories in over + * which perl.c:incpush() and lib/lib.pm will automatically + * search when adding directories to @INC, in a format suitable + * for a C initialization string. See the inc_version_list entry + * in Porting/Glossary for more details. + */ +#define PERL_INC_VERSION_LIST 0 /**/ + +/* INSTALL_USR_BIN_PERL: + * This symbol, if defined, indicates that Perl is to be installed + * also as /usr/bin/perl. + */ +/*#define INSTALL_USR_BIN_PERL /**/ + +/* PERL_PRIfldbl: + * This symbol, if defined, contains the string used by stdio to + * format long doubles (format 'f') for output. + */ +/* PERL_PRIgldbl: + * This symbol, if defined, contains the string used by stdio to + * format long doubles (format 'g') for output. + */ +/*#define PERL_PRIfldbl "f" /**/ +/*#define PERL_PRIgldbl "g" /**/ + +/* Off_t: + * This symbol holds the type used to declare offsets in the kernel. + * It can be int, long, off_t, etc... It may be necessary to include + * to get any typedef'ed information. + */ +/* LSEEKSIZE: + * This symbol holds the number of bytes used by the Off_t. + */ +/* Off_t_size: + * This symbol holds the number of bytes used by the Off_t. + */ +#define Off_t off_t /* type */ +#define LSEEKSIZE 4 /* size */ +#define Off_t_size 4 /* size */ + +/* Free_t: + * This variable contains the return type of free(). It is usually + * void, but occasionally int. + */ +/* Malloc_t: + * This symbol is the type of pointer returned by malloc and realloc. + */ +#define Malloc_t void * /**/ +#define Free_t void /**/ + +/* MYMALLOC: + * This symbol, if defined, indicates that we're using our own malloc. + */ +/*#define MYMALLOC /**/ + +/* Mode_t: + * This symbol holds the type used to declare file modes + * for systems calls. It is usually mode_t, but may be + * int or unsigned short. It may be necessary to include + * to get any typedef'ed information. + */ +#define Mode_t mode_t /* file mode parameter for system calls */ + +/* VAL_O_NONBLOCK: + * This symbol is to be used during open() or fcntl(F_SETFL) to turn on + * non-blocking I/O for the file descriptor. Note that there is no way + * back, i.e. you cannot turn it blocking again this way. If you wish to + * alternatively switch between blocking and non-blocking, use the + * ioctl(FIOSNBIO) call instead, but that is not supported by all devices. + */ +/* VAL_EAGAIN: + * This symbol holds the errno error code set by read() when no data was + * present on the non-blocking file descriptor. + */ +/* RD_NODATA: + * This symbol holds the return code from read() when no data is present + * on the non-blocking file descriptor. Be careful! If EOF_NONBLOCK is + * not defined, then you can't distinguish between no data and EOF by + * issuing a read(). You'll have to find another way to tell for sure! + */ +/* EOF_NONBLOCK: + * This symbol, if defined, indicates to the C program that a read() on + * a non-blocking file descriptor will return 0 on EOF, and not the value + * held in RD_NODATA (-1 usually, in that case!). + */ +#define VAL_O_NONBLOCK O_NONBLOCK +#define VAL_EAGAIN EAGAIN +#define RD_NODATA -1 +#define EOF_NONBLOCK + +/* Netdb_host_t: + * This symbol holds the type used for the 1st argument + * to gethostbyaddr(). + */ +/* Netdb_hlen_t: + * This symbol holds the type used for the 2nd argument + * to gethostbyaddr(). + */ +/* Netdb_name_t: + * This symbol holds the type used for the argument to + * gethostbyname(). + */ +/* Netdb_net_t: + * This symbol holds the type used for the 1st argument to + * getnetbyaddr(). + */ +#define Netdb_host_t char * /**/ +#define Netdb_hlen_t int /**/ +#define Netdb_name_t char * /**/ +#define Netdb_net_t long /**/ + +/* IVTYPE: + * This symbol defines the C type used for Perl's IV. + */ +/* UVTYPE: + * This symbol defines the C type used for Perl's UV. + */ +/* I8TYPE: + * This symbol defines the C type used for Perl's I8. + */ +/* U8TYPE: + * This symbol defines the C type used for Perl's U8. + */ +/* I16TYPE: + * This symbol defines the C type used for Perl's I16. + */ +/* U16TYPE: + * This symbol defines the C type used for Perl's U16. + */ +/* I32TYPE: + * This symbol defines the C type used for Perl's I32. + */ +/* U32TYPE: + * This symbol defines the C type used for Perl's U32. + */ +/* I64TYPE: + * This symbol defines the C type used for Perl's I64. + */ +/* U64TYPE: + * This symbol defines the C type used for Perl's U64. + */ +/* NVTYPE: + * This symbol defines the C type used for Perl's NV. + */ +/* IVSIZE: + * This symbol contains the sizeof(IV). + */ +/* UVSIZE: + * This symbol contains the sizeof(UV). + */ +/* I8SIZE: + * This symbol contains the sizeof(I8). + */ +/* U8SIZE: + * This symbol contains the sizeof(U8). + */ +/* I16SIZE: + * This symbol contains the sizeof(I16). + */ +/* U16SIZE: + * This symbol contains the sizeof(U16). + */ +/* I32SIZE: + * This symbol contains the sizeof(I32). + */ +/* U32SIZE: + * This symbol contains the sizeof(U32). + */ +/* I64SIZE: + * This symbol contains the sizeof(I64). + */ +/* U64SIZE: + * This symbol contains the sizeof(U64). + */ +/* NV_PRESERVES_UV: + * This symbol, if defined, indicates that a variable of type NVTYPE + * can preserve all the bit of a variable of type UVSIZE. + */ +#define IVTYPE long /**/ +#define UVTYPE unsigned long /**/ +#define I8TYPE char /**/ +#define U8TYPE unsigned char /**/ +#define I16TYPE short /**/ +#define U16TYPE unsigned short /**/ +#define I32TYPE long /**/ +#define U32TYPE unsigned long /**/ +#ifdef HAS_QUAD +#define I64TYPE __int64 /**/ +#define U64TYPE unsigned __int64 /**/ +#endif +#define NVTYPE double /**/ +#define IVSIZE 4 /**/ +#define UVSIZE 4 /**/ +#define I8SIZE 1 /**/ +#define U8SIZE 1 /**/ +#define I16SIZE 2 /**/ +#define U16SIZE 2 /**/ +#define I32SIZE 4 /**/ +#define U32SIZE 4 /**/ +#ifdef HAS_QUAD +#define I64SIZE 8 /**/ +#define U64SIZE 8 /**/ +#endif +#define NV_PRESERVES_UV + +/* IVdf: + * This symbol defines the format string used for printing a Perl IV + * as a signed decimal integer. + */ +/* UVuf: + * This symbol defines the format string used for printing a Perl UV + * as an unsigned decimal integer. + */ +/* UVof: + * This symbol defines the format string used for printing a Perl UV + * as an unsigned octal integer. + */ +/* UVxf: + * This symbol defines the format string used for printing a Perl UV + * as an unsigned hexadecimal integer. + */ +#define IVdf "ld" /**/ +#define UVuf "lu" /**/ +#define UVof "lo" /**/ +#define UVxf "lx" /**/ + +/* Pid_t: + * This symbol holds the type used to declare process ids in the kernel. + * It can be int, uint, pid_t, etc... It may be necessary to include + * to get any typedef'ed information. + */ +#define Pid_t int /* PID type */ + +/* PRIVLIB: + * This symbol contains the name of the private library for this package. + * The library is private in the sense that it needn't be in anyone's + * execution path, but it should be accessible by the world. The program + * should be prepared to do ~ expansion. + */ +/* PRIVLIB_EXP: + * This symbol contains the ~name expanded version of PRIVLIB, to be used + * in programs that are not prepared to deal with ~ expansion at run-time. + */ +#define PRIVLIB "c:\\perl\\5.6.0\\lib" /**/ +#define PRIVLIB_EXP (win32_get_privlib("5.6.0")) /**/ + +/* PTRSIZE: + * This symbol contains the size of a pointer, so that the C preprocessor + * can make decisions based on it. It will be sizeof(void *) if + * the compiler supports (void *); otherwise it will be + * sizeof(char *). + */ +#define PTRSIZE 4 /**/ + +/* Drand01: + * This macro is to be used to generate uniformly distributed + * random numbers over the range [0., 1.[. You may have to supply + * an 'extern double drand48();' in your program since SunOS 4.1.3 + * doesn't provide you with anything relevant in it's headers. + * See HAS_DRAND48_PROTO. + */ +/* Rand_seed_t: + * This symbol defines the type of the argument of the + * random seed function. + */ +/* seedDrand01: + * This symbol defines the macro to be used in seeding the + * random number generator (see Drand01). + */ +/* RANDBITS: + * This symbol indicates how many bits are produced by the + * function used to generate normalized random numbers. + * Values include 15, 16, 31, and 48. + */ +#define Drand01() (rand()/(double)((unsigned)1< to get any typedef'ed information. + */ +#define Size_t size_t /* length paramater for string functions */ + +/* Sock_size_t: + * This symbol holds the type used for the size argument of + * various socket calls (just the base type, not the pointer-to). + */ +#define Sock_size_t int /**/ + +/* SSize_t: + * This symbol holds the type used by functions that return + * a count of bytes or an error condition. It must be a signed type. + * It is usually ssize_t, but may be long or int, etc. + * It may be necessary to include or + * to get any typedef'ed information. + * We will pick a type such that sizeof(SSize_t) == sizeof(Size_t). + */ +#define SSize_t int /* signed count of bytes */ + +/* STARTPERL: + * This variable contains the string to put in front of a perl + * script to make sure (one hopes) that it runs with perl and not + * some shell. + */ +#define STARTPERL "#!perl" /**/ + +/* HAS_STDIO_STREAM_ARRAY: + * This symbol, if defined, tells that there is an array + * holding the stdio streams. + */ +/* STDIO_STREAM_ARRAY: + * This symbol tells the name of the array holding the stdio streams. + * Usual values include _iob, __iob, and __sF. + */ +/*#define HAS_STDIO_STREAM_ARRAY /**/ +#define STDIO_STREAM_ARRAY + +/* Uid_t_f: + * This symbol defines the format string used for printing a Uid_t. + */ +#define Uid_t_f "ld" /**/ + +/* Uid_t_sign: + * This symbol holds the signedess of a Uid_t. + * 1 for unsigned, -1 for signed. + */ +#define Uid_t_sign -1 /* UID sign */ + +/* Uid_t_size: + * This symbol holds the size of a Uid_t in bytes. + */ +#define Uid_t_size 4 /* UID size */ + +/* Uid_t: + * This symbol holds the type used to declare user ids in the kernel. + * It can be int, ushort, uid_t, etc... It may be necessary to include + * to get any typedef'ed information. + */ +#define Uid_t uid_t /* UID type */ + +/* USE_64_BIT_INT: + * This symbol, if defined, indicates that 64-bit integers should + * be used when available. If not defined, the native integers + * will be employed (be they 32 or 64 bits). The minimal possible + * 64-bitness is used, just enough to get 64-bit integers into Perl. + * This may mean using for example "long longs", while your memory + * may still be limited to 2 gigabytes. + */ +/* USE_64_BIT_ALL: + * This symbol, if defined, indicates that 64-bit integers should + * be used when available. If not defined, the native integers + * will be used (be they 32 or 64 bits). The maximal possible + * 64-bitness is employed: LP64 or ILP64, meaning that you will + * be able to use more than 2 gigabytes of memory. This mode is + * even more binary incompatible than USE_64_BIT_INT. You may not + * be able to run the resulting executable in a 32-bit CPU at all or + * you may need at least to reboot your OS to 64-bit mode. + */ +#ifndef USE_64_BIT_INT +/*#define USE_64_BIT_INT /**/ +#endif + +#ifndef USE_64_BIT_ALL +/*#define USE_64_BIT_ALL /**/ +#endif + +/* USE_LARGE_FILES: + * This symbol, if defined, indicates that large file support + * should be used when available. + */ +#ifndef USE_LARGE_FILES +/*#define USE_LARGE_FILES /**/ +#endif + +/* USE_LONG_DOUBLE: + * This symbol, if defined, indicates that long doubles should + * be used when available. + */ +#ifndef USE_LONG_DOUBLE +/*#define USE_LONG_DOUBLE /**/ +#endif + +/* USE_MORE_BITS: + * This symbol, if defined, indicates that 64-bit interfaces and + * long doubles should be used when available. + */ +#ifndef USE_MORE_BITS +/*#define USE_MORE_BITS /**/ +#endif + +/* MULTIPLICITY: + * This symbol, if defined, indicates that Perl should + * be built to use multiplicity. + */ +#ifndef MULTIPLICITY +/*#define MULTIPLICITY /**/ +#endif + +/* USE_PERLIO: + * This symbol, if defined, indicates that the PerlIO abstraction should + * be used throughout. If not defined, stdio should be + * used in a fully backward compatible manner. + */ +#ifndef USE_PERLIO +/*#define USE_PERLIO /**/ +#endif + +/* USE_SOCKS: + * This symbol, if defined, indicates that Perl should + * be built to use socks. + */ +#ifndef USE_SOCKS +/*#define USE_SOCKS /**/ +#endif + +/* USE_ITHREADS: + * This symbol, if defined, indicates that Perl should be built to + * use the interpreter-based threading implementation. + */ +/* USE_5005THREADS: + * This symbol, if defined, indicates that Perl should be built to + * use the 5.005-based threading implementation. + */ +/* OLD_PTHREADS_API: + * This symbol, if defined, indicates that Perl should + * be built to use the old draft POSIX threads API. + */ +/*#define USE_5005THREADS /**/ +/*#define USE_ITHREADS /**/ +#if defined(USE_5005THREADS) && !defined(USE_ITHREADS) +#define USE_THREADS /* until src is revised*/ +#endif +/*#define OLD_PTHREADS_API /**/ + +/* PERL_VENDORARCH: + * If defined, this symbol contains the name of a private library. + * The library is private in the sense that it needn't be in anyone's + * execution path, but it should be accessible by the world. + * It may have a ~ on the front. + * The standard distribution will put nothing in this directory. + * Vendors who distribute perl may wish to place their own + * architecture-dependent modules and extensions in this directory with + * MakeMaker Makefile.PL INSTALLDIRS=vendor + * or equivalent. See INSTALL for details. + */ +/* PERL_VENDORARCH_EXP: + * This symbol contains the ~name expanded version of PERL_VENDORARCH, to be used + * in programs that are not prepared to deal with ~ expansion at run-time. + */ +/*#define PERL_VENDORARCH "" /**/ +/*#define PERL_VENDORARCH_EXP "" /**/ + +/* PERL_VENDORLIB_EXP: + * This symbol contains the ~name expanded version of VENDORLIB, to be used + * in programs that are not prepared to deal with ~ expansion at run-time. + */ +/* PERL_VENDORLIB_STEM: + * This define is PERL_VENDORLIB_EXP with any trailing version-specific component + * removed. The elements in inc_version_list (inc_version_list.U) can + * be tacked onto this variable to generate a list of directories to search. + */ +/*#define PERL_VENDORLIB_EXP "" /**/ +/*#define PERL_VENDORLIB_STEM "" /**/ + +/* VOIDFLAGS: + * This symbol indicates how much support of the void type is given by this + * compiler. What various bits mean: + * + * 1 = supports declaration of void + * 2 = supports arrays of pointers to functions returning void + * 4 = supports comparisons between pointers to void functions and + * addresses of void functions + * 8 = suports declaration of generic void pointers + * + * The package designer should define VOIDUSED to indicate the requirements + * of the package. This can be done either by #defining VOIDUSED before + * including config.h, or by defining defvoidused in Myinit.U. If the + * latter approach is taken, only those flags will be tested. If the + * level of void support necessary is not present, defines void to int. + */ +#ifndef VOIDUSED +#define VOIDUSED 15 +#endif +#define VOIDFLAGS 15 +#if (VOIDFLAGS & VOIDUSED) != VOIDUSED +#define void int /* is void to be avoided? */ +#define M_VOID /* Xenix strikes again */ +#endif + +/* PERL_XS_APIVERSION: + * This variable contains the version of the oldest perl binary + * compatible with the present perl. perl.c:incpush() and + * lib/lib.pm will automatically search in c:\\perl\\site\\5.6.0\\lib\\MSWin32-x86 for older + * directories across major versions back to xs_apiversion. + * This is only useful if you have a perl library directory tree + * structured like the default one. + * See INSTALL for how this works. + * The versioned site_perl directory was introduced in 5.005, + * so that is the lowest possible value. + * Since this can depend on compile time options (such as + * bincompat) it is set by Configure. Other non-default sources + * of potential incompatibility, such as multiplicity, threads, + * debugging, 64bits, sfio, etc., are not checked for currently, + * though in principle we could go snooping around in old + * Config.pm files. + */ +/* PERL_PM_APIVERSION: + * This variable contains the version of the oldest perl + * compatible with the present perl. (That is, pure perl modules + * written for pm_apiversion will still work for the current + * version). perl.c:incpush() and lib/lib.pm will automatically + * search in c:\\perl\\site\\5.6.0\\lib for older directories across major versions + * back to pm_apiversion. This is only useful if you have a perl + * library directory tree structured like the default one. The + * versioned site_perl library was introduced in 5.005, so that's + * the default setting for this variable. It's hard to imagine + * it changing before Perl6. It is included here for symmetry + * with xs_apiveprsion -- the searching algorithms will + * (presumably) be similar. + * See the INSTALL file for how this works. + */ +#define PERL_XS_APIVERSION "5.6.0" +#define PERL_PM_APIVERSION "5.005" + +/* HAS_LCHOWN: + * This symbol, if defined, indicates that the lchown routine is + * available to operate on a symbolic link (instead of following the + * link). + */ +/*#define HAS_LCHOWN /**/ + +/* FLEXFILENAMES: + * This symbol, if defined, indicates that the system supports filenames + * longer than 14 characters. + */ +#define FLEXFILENAMES /**/ + +/* IVdf: + * This symbol defines the format string used for printing a Perl IV + * as a signed decimal integer. + */ +/* UVuf: + * This symbol defines the format string used for printing a Perl UV + * as an unsigned decimal integer. + */ +/* UVof: + * This symbol defines the format string used for printing a Perl UV + * as an unsigned octal integer. + */ +/* UVxf: + * This symbol defines the format string used for printing a Perl UV + * as an unsigned hexadecimal integer in lowercase abcdef. + */ +/* UVXf: + * This symbol defines the format string used for printing a Perl UV + * as an unsigned hexadecimal integer in uppercase ABCDEF. + */ +/* NVef: + * This symbol defines the format string used for printing a Perl NV + * using %e-ish floating point format. + */ +/* NVff: + * This symbol defines the format string used for printing a Perl NV + * using %f-ish floating point format. + */ +/* NVgf: + * This symbol defines the format string used for printing a Perl NV + * using %g-ish floating point format. + */ +#define IVdf "ld" /**/ +#define UVuf "lu" /**/ +#define UVof "lo" /**/ +#define UVxf "lx" /**/ +#define UVXf "lX" /**/ +#define NVef "e" /**/ +#define NVff "f" /**/ +#define NVgf "g" /**/ + +#endif diff --git a/wince/config_h.PL b/wince/config_h.PL new file mode 100644 index 0000000..b5f5e38 --- /dev/null +++ b/wince/config_h.PL @@ -0,0 +1,115 @@ +# +use Config; +use File::Compare qw(compare); +use File::Copy qw(copy); +my $OBJ = 1 if $Config{'ccflags'} =~ /PERL_OBJECT/i; +my $name = $0; +$name =~ s#^(.*)\.PL$#../$1.SH#; +my %opt; +while (@ARGV && $ARGV[0] =~ /^([\w_]+)=(.*)$/) + { + $opt{$1}=$2; + shift(@ARGV); + } + +$opt{CONFIG_H} ||= 'config.h'; + +my $patchlevel = $opt{INST_VER}; +$patchlevel =~ s|^[\\/]||; +$patchlevel =~ s|~VERSION~|$Config{version}|g; +$patchlevel ||= $Config{version}; +$patchlevel = qq["$patchlevel"]; + +open(SH,"<$name") || die "Cannot open $name:$!"; +while () + { + last if /^sed/; + } +($term,$file,$pat) = /^sed\s+<<(\S+)\s+>(\S+)\s+(.*)$/; + +$file =~ s/^\$(\w+)$/$opt{$1}/g; + +my $str = "sub munge\n{\n"; + +while ($pat =~ s/-e\s+'([^']*)'\s*//) + { + my $e = $1; + $e =~ s/\\([\(\)])/$1/g; + $e =~ s/\\(\d)/\$$1/g; + $str .= "$e;\n"; + } +$str .= "}\n"; + +eval $str; + +die "$str:$@" if $@; + +open(H,">$file.new") || die "Cannot open $file.new:$!"; +#binmode H; # no CRs (which cause a spurious rebuild) +while () + { + last if /^$term$/o; + s/\$([\w_]+)/Config($1)/eg; + s/`([^\`]*)`/BackTick($1)/eg; + munge(); + s/\\\$/\$/g; + s#/[ *\*]*\*/#/**/#; + if (/^\s*#define\s+(PRIVLIB|SITELIB|VENDORLIB)_EXP/) + { + $_ = "#define ". $1 . "_EXP (win32_get_". lc($1) . "($patchlevel))\t/**/\n"; + } + # incpush() handles archlibs, so disable them + elsif (/^\s*#define\s+(ARCHLIB|SITEARCH|VENDORARCH)_EXP/) + { + $_ = "/*#define ". $1 . "_EXP \"\"\t/**/\n"; + } + print H; + } +close(H); +close(SH); + + +chmod(0666,"config.h"); +copy("$file.new","config.h") || die "Cannot copy:$!"; +chmod(0444,"config.h"); + +if (!$OBJ && compare("$file.new",$file)) + { + warn "$file has changed\n"; + chmod(0666,$file); + unlink($file); + rename("$file.new",$file); + #chmod(0444,$file); + exit(1); + } +else + { + unlink ("$file.new"); + exit(0); + } + +sub Config +{ + my $var = shift; + my $val = $Config{$var}; + $val = 'undef' unless defined $val; + $val =~ s/\\/\\\\/g; + return $val; +} + +sub BackTick +{ + my $cmd = shift; + if ($cmd =~ /^echo\s+(.*?)\s*\|\s+sed\s+'(.*)'\s*$/) + { + local ($data,$pat) = ($1,$2); + $data =~ s/\s+/ /g; + eval "\$data =~ $pat"; + return $data; + } + else + { + die "Cannot handle \`$cmd\`"; + } + return $cmd; +} diff --git a/wince/config_sh.PL b/wince/config_sh.PL new file mode 100644 index 0000000..35bb6e2 --- /dev/null +++ b/wince/config_sh.PL @@ -0,0 +1,103 @@ +use FindExt; +# take a semicolon separated path list and turn it into a quoted +# list of paths that Text::Parsewords will grok +sub mungepath { + my $p = shift; + # remove leading/trailing semis/spaces + $p =~ s/^[ ;]+//; + $p =~ s/[ ;]+$//; + $p =~ s/'/"/g; + my @p = map { $_ = "\"$_\"" if /\s/ and !/^".*"$/; $_ } split /;/, $p; + return join(' ', @p); +} + +# generate an array of option strings from command-line args +# or an option file +# -- added by BKS, 10-17-1999 to fix command-line overflow problems +sub loadopts { + if ($ARGV[0] =~ /--cfgsh-option-file/) { + shift @ARGV; + my $optfile = shift @ARGV; + local (*F); + open OPTF, $optfile or die "Can't open $optfile: $!\n"; + my @opts; + chomp(my $line = ); + my @vars = split(/\t+~\t+/, $line); + for (@vars) { + push(@opts, $_) unless (/^\s*$/); + } + close OPTF; + return \@opts; + } + else { + return \@ARGV; + } +} + +FindExt::scan_ext("../ext"); + +my %opt; + +my $optref = loadopts(); +while (@{$optref} && $optref->[0] =~ /^([\w_]+)=(.*)$/) { + $opt{$1}=$2; + shift(@{$optref}); +} + +my @dynamic = FindExt::dynamic_extensions(); +my @noxs = FindExt::noxs_extensions(); +my @known = sort(@dynamic,split(/\s+/,$opt{'staticext'}),@noxs); +$opt{'known_extensions'} = join(' ',@known); + +if (!$opt{'use5005threads'} || $opt{'use5005threads'} eq 'undef') + { + @dynamic = grep(!/Thread/,@dynamic); + @known = grep(!/Thread/,@dynamic); + } + +$opt{'dynamic_ext'} = join(' ',@dynamic); +$opt{'nonxs_ext'} = join(' ',@noxs); + +$opt{'extensions'} = join(' ',@known); + +my $pl_h = '../patchlevel.h'; + +if (-e $pl_h) { + open PL, "<$pl_h" or die "Can't open $pl_h: $!"; + while () { + if (/^#\s*define\s+(PERL_\w+)\s+([\d.]+)/) { + $opt{$1} = $2; + } + } + close PL; +} +else { + die "Can't find $pl_h: $!"; +} +$opt{VERSION} = "$opt{PERL_REVISION}.$opt{PERL_VERSION}.$opt{PERL_SUBVERSION}"; +$opt{INST_VER} =~ s|~VERSION~|$opt{VERSION}|g; + +$opt{'cf_by'} = $ENV{USERNAME} unless $opt{'cf_by'}; +$opt{'cf_email'} = $opt{'cf_by'} . '@' . (gethostbyname('localhost'))[0] + unless $opt{'cf_email'}; +$opt{'usemymalloc'} = 'y' if $opt{'d_mymalloc'} eq 'define'; + +$opt{libpth} = mungepath($opt{libpth}) if exists $opt{libpth}; +$opt{incpath} = mungepath($opt{incpath}) if exists $opt{incpath}; + +while (<>) { + s/~([\w_]+)~/$opt{$1}/g; + if (/^([\w_]+)=(.*)$/) { + my($k,$v) = ($1,$2); + # this depends on cf_time being empty in the template (or we'll + # get a loop) + if ($k eq 'cf_time') { + $_ = "$k='" . localtime(time) . "'\n" if $v =~ /^\s*'\s*'/; + } + elsif (exists $opt{$k}) { + $_ = "$k='$opt{$k}'\n"; + } + } + print; +} + diff --git a/wince/dl_win32.xs b/wince/dl_win32.xs new file mode 100644 index 0000000..15962a6 --- /dev/null +++ b/wince/dl_win32.xs @@ -0,0 +1,168 @@ +/* dl_win32.xs + * + * Platform: Win32 (Windows NT/Windows 95) + * Author: Wei-Yuen Tan (wyt@hip.com) + * Created: A warm day in June, 1995 + * + * Modified: + * August 23rd 1995 - rewritten after losing everything when I + * wiped off my NT partition (eek!) + */ + +/* Porting notes: + +I merely took Paul's dl_dlopen.xs, took out extraneous stuff and +replaced the appropriate SunOS calls with the corresponding Win32 +calls. + +*/ + +#define WIN32_LEAN_AND_MEAN +#ifdef __GNUC__ +#define Win32_Winsock +#endif +#include +#include + +#define PERL_NO_GET_CONTEXT + +#include "EXTERN.h" +#include "perl.h" +#include "win32.h" + +#ifdef PERL_OBJECT +#define NO_XSLOCKS +#endif /* PERL_OBJECT */ + +#include "XSUB.h" + +static SV *error_sv; + +static char * +OS_Error_String(pTHXo) +{ + DWORD err = GetLastError(); + STRLEN len; + if (!error_sv) + error_sv = newSVpvn("",0); + PerlProc_GetOSError(error_sv,err); + return SvPV(error_sv,len); +} + +#include "dlutils.c" /* SaveError() etc */ + +static void +dl_private_init(pTHXo) +{ + (void)dl_generic_private_init(aTHXo); +} + +/* + This function assumes the list staticlinkmodules + will be formed from package names with '::' replaced + with '/'. Thus Win32::OLE is in the list as Win32/OLE +*/ +static int +dl_static_linked(char *filename) +{ + char **p; + char* ptr; + static char subStr[] = "/auto/"; + char szBuffer[MAX_PATH]; + + /* change all the '\\' to '/' */ + strcpy(szBuffer, filename); + for(ptr = szBuffer; ptr = strchr(ptr, '\\'); ++ptr) + *ptr = '/'; + + /* delete the file name */ + ptr = strrchr(szBuffer, '/'); + if(ptr != NULL) + *ptr = '\0'; + + /* remove leading lib path */ + ptr = strstr(szBuffer, subStr); + if(ptr != NULL) + ptr += sizeof(subStr)-1; + else + ptr = szBuffer; + + for (p = staticlinkmodules; *p;p++) { + if (strstr(ptr, *p)) return 1; + }; + return 0; +} + +MODULE = DynaLoader PACKAGE = DynaLoader + +BOOT: + (void)dl_private_init(aTHXo); + +void * +dl_load_file(filename,flags=0) + char * filename + int flags + PREINIT: + CODE: + { + DLDEBUG(1,PerlIO_printf(Perl_debug_log,"dl_load_file(%s):\n", filename)); + if (dl_static_linked(filename) == 0) { + RETVAL = PerlProc_DynaLoad(filename); + } + else + RETVAL = (void*) XCEGetModuleHandleA(NULL); + DLDEBUG(2,PerlIO_printf(Perl_debug_log," libref=%x\n", RETVAL)); + ST(0) = sv_newmortal() ; + if (RETVAL == NULL) + SaveError(aTHXo_ "load_file:%s", + OS_Error_String(aTHXo)) ; + else + sv_setiv( ST(0), (IV)RETVAL); + } + +void * +dl_find_symbol(libhandle, symbolname) + void * libhandle + char * symbolname + CODE: + DLDEBUG(2,PerlIO_printf(Perl_debug_log,"dl_find_symbol(handle=%x, symbol=%s)\n", + libhandle, symbolname)); + RETVAL = (void*) XCEGetProcAddressA((HINSTANCE) libhandle, symbolname); + DLDEBUG(2,PerlIO_printf(Perl_debug_log," symbolref = %x\n", RETVAL)); + ST(0) = sv_newmortal() ; + if (RETVAL == NULL) + SaveError(aTHXo_ "find_symbol:%s", + OS_Error_String(aTHXo)) ; + else + sv_setiv( ST(0), (IV)RETVAL); + + +void +dl_undef_symbols() + PPCODE: + + + +# These functions should not need changing on any platform: + +void +dl_install_xsub(perl_name, symref, filename="$Package") + char * perl_name + void * symref + char * filename + CODE: + DLDEBUG(2,PerlIO_printf(Perl_debug_log,"dl_install_xsub(name=%s, symref=%x)\n", + perl_name, symref)); + ST(0) = sv_2mortal(newRV((SV*)newXS(perl_name, + (void(*)(pTHXo_ CV *))symref, + filename))); + + +char * +dl_error() + CODE: + RETVAL = LastError ; + OUTPUT: + RETVAL + +# end. diff --git a/wince/include/arpa/inet.h b/wince/include/arpa/inet.h new file mode 100644 index 0000000..0303df0 --- /dev/null +++ b/wince/include/arpa/inet.h @@ -0,0 +1,4 @@ +/* + * this is a dummy header file for Socket.xs + */ + diff --git a/wince/include/cectype.h b/wince/include/cectype.h new file mode 100644 index 0000000..3531ba2 --- /dev/null +++ b/wince/include/cectype.h @@ -0,0 +1,19 @@ +#ifndef CECTYPE_H +#define CECTYPE_H 1 + +#if UNDER_CE < 300 +#define isdigit(C) iswdigit(C) +#define isalpha(C) iswalpha(C) +#define islower(C) iswlower(C) +#define isupper(C) iswupper(C) +#define isspace(C) iswspace(C) +#define isalnum(C) iswalnum(C) +#define iscntrl(C) iswcntrl(C) +#define isprint(C) iswprint(C) +#define ispunct(C) iswpunct(C) +#define isxdigit(C) iswxdigit(C) +#define isascii(C) iswascii(C) +#define isgraph(C) iswgraph(C) +#endif + +#endif diff --git a/wince/include/errno.h b/wince/include/errno.h new file mode 100644 index 0000000..29c4775 --- /dev/null +++ b/wince/include/errno.h @@ -0,0 +1,49 @@ +#ifndef ERRNO_H +#define ERRNO_H 1 + +#ifdef wince_private +#include +#ifdef _MT +#define errno _getptd()->_terrno +#else +extern int errno; +#endif +#endif + +#define EPERM 1 +#define ENOENT 2 +#define ESRCH 3 +#define EINTR 4 +#define EIO 5 +#define ENXIO 6 +#define E2BIG 7 +#define ENOEXEC 8 +#define EBADF 9 +#define ECHILD 10 +#define EAGAIN 11 +#define ENOMEM 12 +#define EACCES 13 +#define EFAULT 14 +#define EOSERR 15 // rk +#define EBUSY 16 +#define EEXIST 17 +#define EXDEV 18 +#define ENODEV 19 +#define ENOTDIR 20 +#define EISDIR 21 +#define EINVAL 22 +#define ENFILE 23 +#define EMFILE 24 +#define ENOTTY 25 +#define EFBIG 27 +#define ENOSPC 28 +#define ESPIPE 29 +#define EROFS 30 +#define EMLINK 31 +#define EPIPE 32 +#define EDOM 33 +#define ERANGE 34 +#define EDEADLK 36 +#define ENOSYS 37 + +#endif diff --git a/wince/include/netdb.h b/wince/include/netdb.h new file mode 100644 index 0000000..b0c5ea1 --- /dev/null +++ b/wince/include/netdb.h @@ -0,0 +1,12 @@ +// netdb.h + +// djl +// Provide UNIX compatibility + + +#ifndef _INC_NETDB +#define _INC_NETDB + +#include + +#endif //_INC_NETDB diff --git a/wince/include/sys/socket.h b/wince/include/sys/socket.h new file mode 100644 index 0000000..2d6f7b8 --- /dev/null +++ b/wince/include/sys/socket.h @@ -0,0 +1,217 @@ +// sys/socket.h + +// djl +// Provide UNIX compatibility + +#ifndef _INC_SYS_SOCKET +#define _INC_SYS_SOCKET + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _WINDOWS_ +#ifdef __GNUC__ +#define WIN32_LEAN_AND_MEAN +#ifdef __GNUC__ +#define Win32_Winsock +#endif +#include +#else +#define _WINDOWS_ + +#ifndef FAR +#define FAR +#endif + +#define PASCAL __stdcall +#define WINAPI __stdcall + +#undef WORD +typedef int BOOL; +typedef unsigned short WORD; +typedef void* HANDLE; +typedef void* HWND; +typedef int (FAR WINAPI *FARPROC)(); + +typedef unsigned long DWORD; +typedef void *PVOID; + +#define IN +#define OUT + +#ifndef UNDER_CE +typedef struct _OVERLAPPED { + DWORD Internal; + DWORD InternalHigh; + DWORD Offset; + DWORD OffsetHigh; + HANDLE hEvent; +} OVERLAPPED, *LPOVERLAPPED; +#endif + +#endif +#endif //_WINDOWS_ +// #ifndef __GNUC__ +#include +// #endif + +#define ENOTSOCK WSAENOTSOCK +#undef HOST_NOT_FOUND + +#ifdef USE_SOCKETS_AS_HANDLES + +#ifndef PERL_FD_SETSIZE +#define PERL_FD_SETSIZE 64 +#endif + +#define PERL_BITS_PER_BYTE 8 +#define PERL_NFDBITS (sizeof(Perl_fd_mask)*PERL_BITS_PER_BYTE) + +typedef int Perl_fd_mask; + +typedef struct Perl_fd_set { + Perl_fd_mask bits[(PERL_FD_SETSIZE+PERL_NFDBITS-1)/PERL_NFDBITS]; +} Perl_fd_set; + +#define PERL_FD_CLR(n,p) \ + ((p)->bits[(n)/PERL_NFDBITS] &= ~((unsigned)1 << ((n)%PERL_NFDBITS))) + +#define PERL_FD_SET(n,p) \ + ((p)->bits[(n)/PERL_NFDBITS] |= ((unsigned)1 << ((n)%PERL_NFDBITS))) + +#define PERL_FD_ZERO(p) memset((char *)(p),0,sizeof(*(p))) + +#define PERL_FD_ISSET(n,p) \ + ((p)->bits[(n)/PERL_NFDBITS] & ((unsigned)1 << ((n)%PERL_NFDBITS))) + +#else /* USE_SOCKETS_AS_HANDLES */ + +#define Perl_fd_set fd_set +#define PERL_FD_SET(n,p) FD_SET(n,p) +#define PERL_FD_CLR(n,p) FD_CLR(n,p) +#define PERL_FD_ISSET(n,p) FD_ISSET(n,p) +#define PERL_FD_ZERO(p) FD_ZERO(p) + +#endif /* USE_SOCKETS_AS_HANDLES */ + +SOCKET win32_accept (SOCKET s, struct sockaddr *addr, int *addrlen); +int win32_bind (SOCKET s, const struct sockaddr *addr, int namelen); +int win32_closesocket (SOCKET s); +int win32_connect (SOCKET s, const struct sockaddr *name, int namelen); +int win32_ioctlsocket (SOCKET s, long cmd, u_long *argp); +int win32_getpeername (SOCKET s, struct sockaddr *name, int * namelen); +int win32_getsockname (SOCKET s, struct sockaddr *name, int * namelen); +int win32_getsockopt (SOCKET s, int level, int optname, char * optval, int *optlen); +u_long win32_htonl (u_long hostlong); +u_short win32_htons (u_short hostshort); +unsigned long win32_inet_addr (const char * cp); +char * win32_inet_ntoa (struct in_addr in); +int win32_listen (SOCKET s, int backlog); +u_long win32_ntohl (u_long netlong); +u_short win32_ntohs (u_short netshort); +int win32_recv (SOCKET s, char * buf, int len, int flags); +int win32_recvfrom (SOCKET s, char * buf, int len, int flags, + struct sockaddr *from, int * fromlen); +int win32_select (int nfds, Perl_fd_set *rfds, Perl_fd_set *wfds, Perl_fd_set *xfds, + const struct timeval *timeout); +int win32_send (SOCKET s, const char * buf, int len, int flags); +int win32_sendto (SOCKET s, const char * buf, int len, int flags, + const struct sockaddr *to, int tolen); +int win32_setsockopt (SOCKET s, int level, int optname, + const char * optval, int optlen); +SOCKET win32_socket (int af, int type, int protocol); +int win32_shutdown (SOCKET s, int how); + +/* Database function prototypes */ + +struct hostent * win32_gethostbyaddr(const char * addr, int len, int type); +struct hostent * win32_gethostbyname(const char * name); +int win32_gethostname (char * name, int namelen); +struct servent * win32_getservbyport(int port, const char * proto); +struct servent * win32_getservbyname(const char * name, const char * proto); +struct protoent * win32_getprotobynumber(int proto); +struct protoent * win32_getprotobyname(const char * name); +struct protoent *win32_getprotoent(void); +struct servent *win32_getservent(void); +void win32_sethostent(int stayopen); +void win32_setnetent(int stayopen); +struct netent * win32_getnetent(void); +struct netent * win32_getnetbyname(char *name); +struct netent * win32_getnetbyaddr(long net, int type); +void win32_setprotoent(int stayopen); +void win32_setservent(int stayopen); +void win32_endhostent(void); +void win32_endnetent(void); +void win32_endprotoent(void); +void win32_endservent(void); + +#ifndef WIN32SCK_IS_STDSCK +// +// direct to our version +// +#define htonl win32_htonl +#define htons win32_htons +#define ntohl win32_ntohl +#define ntohs win32_ntohs +#define inet_addr win32_inet_addr +#define inet_ntoa win32_inet_ntoa + +#define socket win32_socket +#define bind win32_bind +#define listen win32_listen +#define accept win32_accept +#define connect win32_connect +#define send win32_send +#define sendto win32_sendto +#define recv win32_recv +#define recvfrom win32_recvfrom +#define shutdown win32_shutdown +#define closesocket win32_closesocket +#define ioctlsocket win32_ioctlsocket +#define setsockopt win32_setsockopt +#define getsockopt win32_getsockopt +#define getpeername win32_getpeername +#define getsockname win32_getsockname +#define gethostname win32_gethostname +#define gethostbyname win32_gethostbyname +#define gethostbyaddr win32_gethostbyaddr +#define getprotobyname win32_getprotobyname +#define getprotobynumber win32_getprotobynumber +#define getservbyname win32_getservbyname +#define getservbyport win32_getservbyport +#define select win32_select +#define endhostent win32_endhostent +#define endnetent win32_endnetent +#define endprotoent win32_endprotoent +#define endservent win32_endservent +#define getnetent win32_getnetent +#define getnetbyname win32_getnetbyname +#define getnetbyaddr win32_getnetbyaddr +#define getprotoent win32_getprotoent +#define getservent win32_getservent +#define sethostent win32_sethostent +#define setnetent win32_setnetent +#define setprotoent win32_setprotoent +#define setservent win32_setservent + +#ifdef USE_SOCKETS_AS_HANDLES +#undef fd_set +#undef FD_SET +#undef FD_CLR +#undef FD_ISSET +#undef FD_ZERO +#define fd_set Perl_fd_set +#define FD_SET(n,p) PERL_FD_SET(n,p) +#define FD_CLR(n,p) PERL_FD_CLR(n,p) +#define FD_ISSET(n,p) PERL_FD_ISSET(n,p) +#define FD_ZERO(p) PERL_FD_ZERO(p) +#endif /* USE_SOCKETS_AS_HANDLES */ + +#endif /* WIN32SCK_IS_STDSCK */ + +#ifdef __cplusplus +} +#endif + +#endif // _INC_SYS_SOCKET diff --git a/wince/include/sys/stat.h b/wince/include/sys/stat.h new file mode 100644 index 0000000..b4dcc9f --- /dev/null +++ b/wince/include/sys/stat.h @@ -0,0 +1,55 @@ +#ifndef SYS_STAT_H +#define SYS_STAT_H 1 + +#include + +// stat.h +#define _S_IFMT 0170000 /* file type mask */ +#define _S_IFDIR 0040000 /* directory */ +#define _S_IFCHR 0020000 /* character special */ +#define _S_IFIFO 0010000 /* pipe */ +#define _S_IFREG 0100000 /* regular */ +#define _S_IREAD 0000400 /* read permission, owner */ +#define _S_IWRITE 0000200 /* write permission, owner */ +#define _S_IEXEC 0000100 /* execute/search permission, owner */ + +#define _S_IFMT 0170000 /* file type mask */ +#define _S_IFDIR 0040000 /* directory */ +#define _S_IFCHR 0020000 /* character special */ +#define _S_IFIFO 0010000 /* pipe */ +#define _S_IFREG 0100000 /* regular */ +#define _S_IREAD 0000400 /* read permission, owner */ +#define _S_IWRITE 0000200 /* write permission, owner */ +#define _S_IEXEC 0000100 /* execute/search permission, owner */ + +#define S_IFMT _S_IFMT +#define S_IFREG _S_IFREG +#define S_IFCHR _S_IFCHR +#define S_IFDIR _S_IFDIR +#define S_IREAD _S_IREAD +#define S_IWRITE _S_IWRITE +#define S_IEXEC _S_IEXEC + +#ifndef S_ISDIR +#define S_ISDIR(X) (((X) & S_IFMT) == S_IFDIR) +#endif +#ifndef S_ISREG +#define S_ISREG(X) (((X) & S_IFMT) == S_IFREG) +#endif + +struct stat +{ + dev_t st_dev; + ino_t st_ino; + unsigned short st_mode; + short st_nlink; + short st_uid; + short st_gid; + dev_t st_rdev; + off_t st_size; + time_t st_atime; + time_t st_mtime; + time_t st_ctime; +}; + +#endif diff --git a/wince/include/sys/types.h b/wince/include/sys/types.h new file mode 100644 index 0000000..9741ca5 --- /dev/null +++ b/wince/include/sys/types.h @@ -0,0 +1,23 @@ +#ifndef SYS_TYPES_H +#define SYS_TYPES_H 1 + +#ifndef _TIME_T_DEFINED_ +typedef unsigned long time_t; +#define _TIME_T_DEFINED_ +#endif + +typedef unsigned long dev_t; +typedef unsigned long ino_t; +typedef unsigned short gid_t; +typedef unsigned short uid_t; +typedef long clock_t; +typedef long ptrdiff_t; +typedef long off_t; + +typedef unsigned char u_char; +typedef unsigned short u_short; + +typedef unsigned char * caddr_t; +typedef unsigned int size_t; + +#endif diff --git a/wince/include/sys/utime.h b/wince/include/sys/utime.h new file mode 100644 index 0000000..c98ddcf --- /dev/null +++ b/wince/include/sys/utime.h @@ -0,0 +1,18 @@ +#ifndef SYS_UTIME_H +#define SYS_UTIME_H 1 + +#include "time.h" + +struct utimbuf +{ + time_t actime; + time_t modtime; +}; + +struct _utimbuf +{ + time_t actime; + time_t modtime; +}; + +#endif diff --git a/wince/include/time.h b/wince/include/time.h new file mode 100644 index 0000000..78acd32 --- /dev/null +++ b/wince/include/time.h @@ -0,0 +1,58 @@ +#ifndef TIME_H +#define TIME_H 1 + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern long _timezone; +extern int _daylight; +extern long _dstbias; +extern char *_tzname[]; +extern const char __dnames[]; +extern const char __mnames[]; +extern int _days[]; +extern int _lpdays[]; + +#define _DAY_SEC (24L * 60L * 60L) /* secs in a day */ +#define _YEAR_SEC (365L * _DAY_SEC) /* secs in a year */ +#define _FOUR_YEAR_SEC (1461L * _DAY_SEC) /* secs in a 4 year interval */ +#define _DEC_SEC 315532800L /* secs in 1970-1979 */ +#define _BASE_YEAR 70L /* 1970 is the base year */ +#define _BASE_DOW 4 /* 01-01-70 was a Thursday */ +#define _LEAP_YEAR_ADJUST 17L /* Leap years 1900 - 1970 */ +#define _MAX_YEAR 138L /* 2038 is the max year */ + +struct tm { + int tm_sec; /* seconds after the minute - [0,59] */ + int tm_min; /* minutes after the hour - [0,59] */ + int tm_hour; /* hours since midnight - [0,23] */ + int tm_mday; /* day of the month - [1,31] */ + int tm_mon; /* months since January - [0,11] */ + int tm_year; /* years since 1900 */ + int tm_wday; /* days since Sunday - [0,6] */ + int tm_yday; /* days since January 1 - [0,365] */ + int tm_isdst; /* daylight savings time flag */ +}; + +XCE_EXPORT struct tm * xcegmtime(const time_t *timp); +XCE_EXPORT struct tm *xcelocaltime (const time_t *ptime); +XCE_EXPORT char *xceasctime (const struct tm *tb); +XCE_EXPORT int xceutime (const char *fname, struct _utimbuf *times); +XCE_EXPORT int xcefutime (int fh, struct _utimbuf *times); +XCE_EXPORT void xceftime (struct _timeb *tp); +XCE_EXPORT void xcegettimeofday (struct timeval *tv, struct timezone *tz); +XCE_EXPORT char *xcectime(const time_t *timp); +XCE_EXPORT void xceftime (struct _timeb *tp); +XCE_EXPORT time_t xcemktime (struct tm *tb); +XCE_EXPORT time_t xcetime (time_t *timeptr); +XCE_EXPORT void _xcetzset(void); + +#ifdef __cplusplus +}; +#endif + +#endif diff --git a/wince/perl.ico b/wince/perl.ico new file mode 100644 index 0000000..c9ab7d8 Binary files /dev/null and b/wince/perl.ico differ diff --git a/wince/perl.rc b/wince/perl.rc new file mode 100644 index 0000000..47dfa38 --- /dev/null +++ b/wince/perl.rc @@ -0,0 +1,36 @@ +#include + +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) + +1 ICON DISCARDABLE "perl.ico" + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 5,6,0,0 + PRODUCTVERSION 5,6,0,0 + FILEFLAGSMASK 0x3FL + FILEFLAGS 0x0L + FILEOS 0x4L + FILETYPE 0x1L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904B0" + BEGIN + VALUE "CompanyName", "Paranoyaxc Inc\0" + VALUE "FileDescription", "Perl for WindowsCE\0" + VALUE "FileVersion", "1, 0, 0, 0\0" + VALUE "InternalName", "PerlCE\0" + VALUE "LegalCopyright", "Copyright (C) Larry Wall\0" + VALUE "OriginalFilename", "perl.exe" + VALUE "ProductName", "Perl\0" + VALUE "ProductVersion", "5, 7, 2, 0\0" + VALUE "OLESelfRegister", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END diff --git a/wince/perldll.def b/wince/perldll.def new file mode 100644 index 0000000..c5ec156 --- /dev/null +++ b/wince/perldll.def @@ -0,0 +1,1064 @@ +LIBRARY Perl57 + +EXPORTS + PL_AMG_names + PL_Argv + PL_Cmd + PL_DBgv + PL_DBline + PL_DBsignal + PL_DBsingle + PL_DBsub + PL_DBtrace + PL_No + PL_Sv + PL_Xpv + PL_Yes + PL_amagic_generation + PL_an + PL_argvgv + PL_argvout_stack + PL_argvoutgv + PL_av_fetch_sv + PL_basetime + PL_beginav + PL_bitcount + PL_bodytarget + PL_bostr + PL_bufend + PL_bufptr + PL_check + PL_checkav + PL_chopset + PL_colors + PL_colorset + PL_compcv + PL_compiling + PL_comppad + PL_comppad_name + PL_comppad_name_fill + PL_comppad_name_floor + PL_cop_seqmax + PL_copline + PL_curcop + PL_curcopdb + PL_curinterp + PL_curpad + PL_curpm + PL_curstack + PL_curstackinfo + PL_curstash + PL_curstname + PL_dbargs + PL_debstash + PL_debug + PL_defgv + PL_defoutgv + PL_defstash + PL_delaymagic + PL_diehook + PL_dirty + PL_do_undump + PL_doextract + PL_doswitches + PL_dowarn + PL_dumpindent + PL_e_script + PL_efloatbuf + PL_efloatsize + PL_egid + PL_endav + PL_envgv + PL_errgv + PL_error_count + PL_errors + PL_euid + PL_eval_root + PL_eval_start + PL_evalseq + PL_exit_flags + PL_exitlist + PL_exitlistlen + PL_expect + PL_extralen + PL_fdpid + PL_filemode + PL_firstgv + PL_fold + PL_fold_locale + PL_forkprocess + PL_formfeed + PL_formtarget + PL_freq + PL_gensym + PL_gid + PL_glob_index + PL_globalstash + PL_he_root + PL_hexdigit + PL_hintgv + PL_hints + PL_hv_fetch_ent_mh + PL_hv_fetch_sv + PL_in_clean_all + PL_in_clean_objs + PL_in_eval + PL_in_my + PL_in_my_stash + PL_incgv + PL_initav + PL_inplace + PL_last_in_gv + PL_last_lop + PL_last_lop_op + PL_last_swash_hv + PL_last_swash_key + PL_last_swash_klen + PL_last_swash_slen + PL_last_swash_tmps + PL_last_uni + PL_lastfd + PL_lastscream + PL_laststatval + PL_laststype + PL_lex_brackets + PL_lex_brackstack + PL_lex_casemods + PL_lex_casestack + PL_lex_defer + PL_lex_dojoin + PL_lex_expect + PL_lex_formbrack + PL_lex_inpat + PL_lex_inwhat + PL_lex_op + PL_lex_repl + PL_lex_starts + PL_lex_state + PL_lex_stuff + PL_lineary + PL_linestr + PL_localizing + PL_localpatches + PL_main_cv + PL_main_root + PL_main_start + PL_mainstack + PL_markstack + PL_markstack_max + PL_markstack_ptr + PL_max_intro_pending + PL_maxo + PL_maxscream + PL_maxsysfd + PL_mess_sv + PL_min_intro_pending + PL_minus_F + PL_minus_a + PL_minus_c + PL_minus_l + PL_minus_n + PL_minus_p + PL_modglobal + PL_multi_close + PL_multi_end + PL_multi_open + PL_multi_start + PL_multiline + PL_na + PL_nexttoke + PL_nexttype + PL_nextval + PL_nice_chunk + PL_nice_chunk_size + PL_no_aelem + PL_no_dir_func + PL_no_func + PL_no_helem + PL_no_mem + PL_no_modify + PL_no_myglob + PL_no_security + PL_no_sock_func + PL_no_symref + PL_no_usym + PL_no_wrongref + PL_nomemok + PL_nrs + PL_ofmt + PL_oldbufptr + PL_oldname + PL_oldoldbufptr + PL_op + PL_op_desc + PL_op_mask + PL_op_name + PL_op_seqmax + PL_opargs + PL_origalen + PL_origargc + PL_origargv + PL_origenviron + PL_origfilename + PL_osname + PL_pad_reset_pending + PL_padix + PL_padix_floor + PL_patchlevel + PL_patleave + PL_perl_destruct_level + PL_perldb + PL_pidstatus + PL_ppaddr + PL_preambleav + PL_preambled + PL_preprocess + PL_profiledata + PL_psig_name + PL_psig_ptr + PL_reg_call_cc + PL_reg_curpm + PL_reg_eval_set + PL_reg_flags + PL_reg_ganch + PL_reg_leftiter + PL_reg_magic + PL_reg_maxiter + PL_reg_oldcurpm + PL_reg_oldpos + PL_reg_oldsaved + PL_reg_oldsavedlen + PL_reg_poscache + PL_reg_poscache_size + PL_reg_re + PL_reg_start_tmp + PL_reg_start_tmpl + PL_reg_starttry + PL_reg_sv + PL_reg_whilem_seen + PL_regbol + PL_regcc + PL_regcode + PL_regcomp_parse + PL_regcomp_rx + PL_regcompp + PL_regdata + PL_regdummy + PL_regendp + PL_regeol + PL_regexecp + PL_regflags + PL_regfree + PL_regindent + PL_reginput + PL_regint_start + PL_regint_string + PL_reginterp_cnt + PL_regkind + PL_reglastparen + PL_regnarrate + PL_regnaughty + PL_regnpar + PL_regprecomp + PL_regprogram + PL_regsawback + PL_regseen + PL_regsize + PL_regstartp + PL_regtill + PL_regxend + PL_replgv + PL_restartop + PL_retstack + PL_retstack_ix + PL_retstack_max + PL_rs + PL_rsfp + PL_rsfp_filters + PL_runops + PL_savestack + PL_savestack_ix + PL_savestack_max + PL_sawampersand + PL_scopestack + PL_scopestack_ix + PL_scopestack_max + PL_screamfirst + PL_screamnext + PL_secondgv + PL_seen_evals + PL_seen_zerolen + PL_sh_path + PL_sig_name + PL_sig_num + PL_sighandlerp + PL_simple + PL_sortcop + PL_sortstash + PL_splitstr + PL_srand_called + PL_stack_base + PL_stack_max + PL_stack_sp + PL_start_env + PL_statbuf + PL_statcache + PL_statgv + PL_statname + PL_statusvalue + PL_stderrgv + PL_stdingv + PL_strtab + PL_sub_generation + PL_subline + PL_subname + PL_sv_arenaroot + PL_sv_count + PL_sv_no + PL_sv_objcount + PL_sv_root + PL_sv_undef + PL_sv_yes + PL_sys_intern + PL_tainted + PL_tainting + PL_tmps_floor + PL_tmps_ix + PL_tmps_max + PL_tmps_stack + PL_tokenbuf + PL_top_env + PL_toptarget + PL_uid + PL_unsafe + PL_utf8_alnum + PL_utf8_alnumc + PL_utf8_alpha + PL_utf8_ascii + PL_utf8_cntrl + PL_utf8_digit + PL_utf8_graph + PL_utf8_lower + PL_utf8_mark + PL_utf8_print + PL_utf8_punct + PL_utf8_space + PL_utf8_tolower + PL_utf8_totitle + PL_utf8_toupper + PL_utf8_upper + PL_utf8_xdigit + PL_utf8skip + PL_uudmap + PL_uuemap + PL_varies + PL_vtbl_amagic + PL_vtbl_amagicelem + PL_vtbl_arylen + PL_vtbl_bm + PL_vtbl_dbline + PL_vtbl_defelem + PL_vtbl_env + PL_vtbl_envelem + PL_vtbl_fm + PL_vtbl_glob + PL_vtbl_isa + PL_vtbl_isaelem + PL_vtbl_mglob + PL_vtbl_nkeys + PL_vtbl_pack + PL_vtbl_packelem + PL_vtbl_pos + PL_vtbl_regdata + PL_vtbl_regdatum + PL_vtbl_regexp + PL_vtbl_sig + PL_vtbl_sigelem + PL_vtbl_substr + PL_vtbl_sv + PL_vtbl_taint + PL_vtbl_uvar + PL_vtbl_vec + PL_warn_nl + PL_warn_nosemi + PL_warn_reserved + PL_warn_uninit + PL_warnhook + PL_widesyscalls + PL_xiv_arenaroot + PL_xiv_root + PL_xnv_root + PL_xpv_root + PL_xpvav_root + PL_xpvbm_root + PL_xpvcv_root + PL_xpvhv_root + PL_xpviv_root + PL_xpvlv_root + PL_xpvmg_root + PL_xpvnv_root + PL_xrv_root + PL_yychar + PL_yydebug + PL_yyerrflag + PL_yylval + PL_yynerrs + PL_yyval + PerlIO_canset_cnt + PerlIO_clearerr + PerlIO_close + PerlIO_eof + PerlIO_error + PerlIO_exportFILE + PerlIO_fast_gets + PerlIO_fdopen + PerlIO_fileno + PerlIO_findFILE + PerlIO_flush + PerlIO_get_base + PerlIO_get_bufsiz + PerlIO_get_cnt + PerlIO_get_ptr + PerlIO_getc + PerlIO_getname + PerlIO_getpos + PerlIO_has_base + PerlIO_has_cntptr + PerlIO_importFILE + PerlIO_init + PerlIO_open + PerlIO_printf + PerlIO_putc + PerlIO_puts + PerlIO_read + PerlIO_releaseFILE + PerlIO_reopen + PerlIO_rewind + PerlIO_seek + PerlIO_set_cnt + PerlIO_set_ptrcnt + PerlIO_setlinebuf + PerlIO_setpos + PerlIO_sprintf + PerlIO_stderr + PerlIO_stdin + PerlIO_stdout + PerlIO_stdoutf + PerlIO_tell + PerlIO_tmpfile + PerlIO_ungetc + PerlIO_vprintf + PerlIO_vsprintf + PerlIO_write + Perl_Gv_AMupdate + Perl_amagic_call + Perl_av_clear + Perl_av_delete + Perl_av_exists + Perl_av_extend + Perl_av_fake + Perl_av_fetch + Perl_av_fill + Perl_av_len + Perl_av_make + Perl_av_pop + Perl_av_push + Perl_av_reify + Perl_av_shift + Perl_av_store + Perl_av_undef + Perl_av_unshift + Perl_avhv_delete_ent + Perl_avhv_exists_ent + Perl_avhv_fetch_ent + Perl_avhv_iternext + Perl_avhv_iterval + Perl_avhv_keys + Perl_avhv_store_ent + Perl_block_gimme + Perl_call_argv + Perl_call_atexit + Perl_call_list + Perl_call_method + Perl_call_pv + Perl_call_sv + Perl_cast_i32 + Perl_cast_iv + Perl_cast_ulong + Perl_cast_uv + Perl_croak + Perl_cv_const_sv + Perl_cv_undef + Perl_cx_dump + Perl_delimcpy + Perl_die + Perl_do_binmode + Perl_do_close + Perl_do_gv_dump + Perl_do_gvgv_dump + Perl_do_hv_dump + Perl_do_magic_dump + Perl_do_op_dump + Perl_do_open + Perl_do_open9 + Perl_do_pmop_dump + Perl_do_sv_dump + Perl_dounwind + Perl_dowantarray + Perl_dump_all + Perl_dump_eval + Perl_dump_form + Perl_dump_indent + Perl_dump_packsubs + Perl_dump_sub + Perl_dump_vindent + Perl_eval_pv + Perl_eval_sv + Perl_fbm_compile + Perl_fbm_instr + Perl_filter_add + Perl_filter_del + Perl_filter_read + Perl_form + Perl_fprintf_nocontext + Perl_free_tmps + Perl_get_av + Perl_get_context + Perl_get_cv + Perl_get_hv + Perl_get_op_descs + Perl_get_op_names + Perl_get_ppaddr + Perl_get_sv + Perl_get_vtbl + Perl_gp_free + Perl_gp_ref + Perl_gv_AVadd + Perl_gv_HVadd + Perl_gv_IOadd + Perl_gv_autoload4 + Perl_gv_check + Perl_gv_dump + Perl_gv_efullname + Perl_gv_efullname3 + Perl_gv_fetchfile + Perl_gv_fetchmeth + Perl_gv_fetchmethod + Perl_gv_fetchmethod_autoload + Perl_gv_fetchpv + Perl_gv_fullname + Perl_gv_fullname3 + Perl_gv_init + Perl_gv_stashpv + Perl_gv_stashpvn + Perl_gv_stashsv + Perl_hv_clear + Perl_hv_delayfree_ent + Perl_hv_delete + Perl_hv_delete_ent + Perl_hv_exists + Perl_hv_exists_ent + Perl_hv_fetch + Perl_hv_fetch_ent + Perl_hv_free_ent + Perl_hv_iterinit + Perl_hv_iterkey + Perl_hv_iterkeysv + Perl_hv_iternext + Perl_hv_iternextsv + Perl_hv_iterval + Perl_hv_ksplit + Perl_hv_magic + Perl_hv_store + Perl_hv_store_ent + Perl_hv_undef + Perl_ibcmp + Perl_ibcmp_locale + Perl_init_i18nl10n + Perl_init_i18nl14n + Perl_init_os_extras + Perl_init_stacks + Perl_instr + Perl_is_uni_alnum + Perl_is_uni_alnum_lc + Perl_is_uni_alnumc + Perl_is_uni_alnumc_lc + Perl_is_uni_alpha + Perl_is_uni_alpha_lc + Perl_is_uni_ascii + Perl_is_uni_ascii_lc + Perl_is_uni_cntrl + Perl_is_uni_cntrl_lc + Perl_is_uni_digit + Perl_is_uni_digit_lc + Perl_is_uni_graph + Perl_is_uni_graph_lc + Perl_is_uni_idfirst + Perl_is_uni_idfirst_lc + Perl_is_uni_lower + Perl_is_uni_lower_lc + Perl_is_uni_print + Perl_is_uni_print_lc + Perl_is_uni_punct + Perl_is_uni_punct_lc + Perl_is_uni_space + Perl_is_uni_space_lc + Perl_is_uni_upper + Perl_is_uni_upper_lc + Perl_is_uni_xdigit + Perl_is_uni_xdigit_lc + Perl_is_utf8_alnum + Perl_is_utf8_alnumc + Perl_is_utf8_alpha + Perl_is_utf8_ascii + Perl_is_utf8_char + Perl_is_utf8_cntrl + Perl_is_utf8_digit + Perl_is_utf8_graph + Perl_is_utf8_idfirst + Perl_is_utf8_lower + Perl_is_utf8_mark + Perl_is_utf8_print + Perl_is_utf8_punct + Perl_is_utf8_space + Perl_is_utf8_upper + Perl_is_utf8_xdigit + Perl_leave_scope + Perl_load_module + Perl_looks_like_number + Perl_magic_dump + Perl_markstack_grow + Perl_mess + Perl_mg_clear + Perl_mg_copy + Perl_mg_find + Perl_mg_free + Perl_mg_get + Perl_mg_length + Perl_mg_magical + Perl_mg_set + Perl_mg_size + Perl_moreswitches + Perl_my_atof + Perl_my_exit + Perl_my_failure_exit + Perl_my_fflush_all + Perl_my_lstat + Perl_my_setenv + Perl_my_stat + Perl_newANONATTRSUB + Perl_newANONHASH + Perl_newANONLIST + Perl_newANONSUB + Perl_newASSIGNOP + Perl_newATTRSUB + Perl_newAV + Perl_newAVREF + Perl_newBINOP + Perl_newCONDOP + Perl_newCONSTSUB + Perl_newCVREF + Perl_newFORM + Perl_newFOROP + Perl_newGVOP + Perl_newGVREF + Perl_newGVgen + Perl_newHV + Perl_newHVREF + Perl_newHVhv + Perl_newIO + Perl_newLISTOP + Perl_newLOGOP + Perl_newLOOPEX + Perl_newLOOPOP + Perl_newMYSUB + Perl_newNULLLIST + Perl_newOP + Perl_newPADOP + Perl_newPMOP + Perl_newPROG + Perl_newPVOP + Perl_newRANGE + Perl_newRV + Perl_newRV_noinc + Perl_newSLICEOP + Perl_newSTATEOP + Perl_newSUB + Perl_newSV + Perl_newSVOP + Perl_newSVREF + Perl_newSViv + Perl_newSVnv + Perl_newSVpv + Perl_newSVpvf + Perl_newSVpvn + Perl_newSVrv + Perl_newSVsv + Perl_newSVuv + Perl_newUNOP + Perl_newWHILEOP + Perl_newXS + Perl_new_collate + Perl_new_ctype + Perl_new_numeric + Perl_new_stackinfo + Perl_ninstr + Perl_op_dump + Perl_op_free + Perl_pad_sv + Perl_pmflag + Perl_pmop_dump + Perl_pop_scope + Perl_pregcomp + Perl_pregexec + Perl_pregfree + Perl_push_scope + Perl_re_intuit_start + Perl_re_intuit_string + Perl_regdump + Perl_regexec_flags + Perl_reginitcolors + Perl_regnext + Perl_repeatcpy + Perl_require_pv + Perl_rninstr + Perl_runops_standard + Perl_safesyscalloc + Perl_safesysfree + Perl_safesysmalloc + Perl_safesysrealloc + Perl_save_I16 + Perl_save_I32 + Perl_save_I8 + Perl_save_aelem + Perl_save_alloc + Perl_save_aptr + Perl_save_ary + Perl_save_clearsv + Perl_save_delete + Perl_save_destructor + Perl_save_destructor_x + Perl_save_freepv + Perl_save_freesv + Perl_save_generic_svref + Perl_save_gp + Perl_save_hash + Perl_save_helem + Perl_save_hints + Perl_save_hptr + Perl_save_int + Perl_save_item + Perl_save_iv + Perl_save_list + Perl_save_long + Perl_save_nogv + Perl_save_pptr + Perl_save_re_context + Perl_save_scalar + Perl_save_sptr + Perl_save_svref + Perl_save_threadsv + Perl_save_vptr + Perl_savepv + Perl_savepvn + Perl_savestack_grow + Perl_scan_bin + Perl_scan_hex + Perl_scan_num + Perl_scan_oct + Perl_screaminstr + Perl_set_context + Perl_set_numeric_local + Perl_set_numeric_radix + Perl_set_numeric_standard + Perl_sharepvn + Perl_stack_grow + Perl_start_subparse + Perl_str_to_version + Perl_sv_2bool + Perl_sv_2cv + Perl_sv_2io + Perl_sv_2iv + Perl_sv_2mortal + Perl_sv_2nv + Perl_sv_2pv + Perl_sv_2pv_nolen + Perl_sv_2pvbyte + Perl_sv_2pvbyte_nolen + Perl_sv_2pvutf8 + Perl_sv_2pvutf8_nolen + Perl_sv_2uv + Perl_sv_backoff + Perl_sv_bless + Perl_sv_catpv + Perl_sv_catpv_mg + Perl_sv_catpvf + Perl_sv_catpvf_mg + Perl_sv_catpvn + Perl_sv_catpvn_mg + Perl_sv_catsv + Perl_sv_catsv_mg + Perl_sv_chop + Perl_sv_clear + Perl_sv_cmp + Perl_sv_cmp_locale + Perl_sv_compile_2op + Perl_sv_dec + Perl_sv_derived_from + Perl_sv_dump + Perl_sv_eq + Perl_sv_force_normal + Perl_sv_free + Perl_sv_gets + Perl_sv_grow + Perl_sv_inc + Perl_sv_insert + Perl_sv_isa + Perl_sv_isobject + Perl_sv_iv + Perl_sv_len + Perl_sv_len_utf8 + Perl_sv_magic + Perl_sv_mortalcopy + Perl_sv_newmortal + Perl_sv_newref + Perl_sv_nv + Perl_sv_pos_b2u + Perl_sv_pos_u2b + Perl_sv_pv + Perl_sv_pvbyte + Perl_sv_pvbyten + Perl_sv_pvbyten_force + Perl_sv_pvn + Perl_sv_pvn_force + Perl_sv_pvutf8 + Perl_sv_pvutf8n + Perl_sv_pvutf8n_force + Perl_sv_reftype + Perl_sv_replace + Perl_sv_report_used + Perl_sv_reset + Perl_sv_rvweaken + Perl_sv_setiv + Perl_sv_setiv_mg + Perl_sv_setnv + Perl_sv_setnv_mg + Perl_sv_setpv + Perl_sv_setpv_mg + Perl_sv_setpvf + Perl_sv_setpvf_mg + Perl_sv_setpviv + Perl_sv_setpviv_mg + Perl_sv_setpvn + Perl_sv_setpvn_mg + Perl_sv_setref_iv + Perl_sv_setref_nv + Perl_sv_setref_pv + Perl_sv_setref_pvn + Perl_sv_setsv + Perl_sv_setsv_mg + Perl_sv_setuv + Perl_sv_setuv_mg + Perl_sv_taint + Perl_sv_tainted + Perl_sv_true + Perl_sv_unmagic + Perl_sv_unref + Perl_sv_untaint + Perl_sv_upgrade + Perl_sv_usepvn + Perl_sv_usepvn_mg + Perl_sv_utf8_decode + Perl_sv_utf8_downgrade + Perl_sv_utf8_encode + Perl_sv_utf8_upgrade + Perl_sv_uv + Perl_sv_vcatpvf + Perl_sv_vcatpvf_mg + Perl_sv_vcatpvfn + Perl_sv_vsetpvf + Perl_sv_vsetpvf_mg + Perl_sv_vsetpvfn + Perl_swash_fetch + Perl_swash_init + Perl_taint_env + Perl_taint_proper + Perl_tmps_grow + Perl_to_uni_lower + Perl_to_uni_lower_lc + Perl_to_uni_title + Perl_to_uni_title_lc + Perl_to_uni_upper + Perl_to_uni_upper_lc + Perl_to_utf8_lower + Perl_to_utf8_title + Perl_to_utf8_upper + Perl_unsharepvn + Perl_utf16_to_utf8 + Perl_utf16_to_utf8_reversed + Perl_utf8_distance + Perl_utf8_hop + Perl_utf8_to_uvchr + Perl_uvchr_to_utf8 + Perl_vcroak + Perl_vdeb + Perl_vform + Perl_vload_module + Perl_vmess + Perl_vnewSVpvf + Perl_vwarn + Perl_vwarner + Perl_warn + Perl_warner + Perl_win32_init + RunPerl + boot_DynaLoader + perl_alloc + perl_construct + perl_destruct + perl_free + perl_parse + perl_run + win32_abort + win32_accept + win32_access + win32_alarm + win32_bind + win32_calloc + win32_chdir + win32_chmod + win32_clearerr + win32_close + win32_closedir + win32_closesocket + win32_connect + win32_crypt + win32_dup + win32_dup2 + win32_dynaload + win32_endhostent + win32_endnetent + win32_endprotoent + win32_endservent + win32_environ + win32_eof + win32_errno + win32_execv + win32_execvp + win32_fclose + win32_fcloseall + win32_fdopen + win32_feof + win32_ferror + win32_fflush + win32_fgetc + win32_fgetpos + win32_fgets + win32_fileno + win32_flock + win32_flushall + win32_fopen + win32_fprintf + win32_fputc + win32_fputs + win32_fread + win32_free + win32_freopen + win32_fseek + win32_fsetpos + win32_fstat + win32_ftell + win32_fwrite + win32_getc + win32_getchar + win32_getenv + win32_gethostbyaddr + win32_gethostbyname + win32_gethostname + win32_getnetbyaddr + win32_getnetbyname + win32_getnetent + win32_getpeername + win32_getpid + win32_getprotobyname + win32_getprotobynumber + win32_getprotoent + win32_gets + win32_getservbyname + win32_getservbyport + win32_getservent + win32_getsockname + win32_getsockopt + win32_htonl + win32_htons + win32_inet_addr + win32_inet_ntoa + win32_ioctl + win32_ioctlsocket + win32_kill + win32_link + win32_listen + win32_longpath + win32_lseek + win32_malloc + win32_mkdir + win32_ntohl + win32_ntohs + win32_open + win32_opendir + win32_os_id + win32_perror + win32_pipe + win32_printf + win32_putc + win32_putchar + win32_putenv + win32_puts + win32_read + win32_readdir + win32_realloc + win32_recv + win32_recvfrom + win32_rename + win32_rewind + win32_rewinddir + win32_rmdir + win32_seekdir + win32_select + win32_send + win32_sendto + win32_setbuf + win32_sethostent + win32_setmode + win32_setnetent + win32_setprotoent + win32_setservent + win32_setsockopt + win32_setvbuf + win32_shutdown + win32_sleep + win32_socket + win32_stat + win32_stderr + win32_stdin + win32_stdout + win32_str_os_error + win32_strerror + win32_tell + win32_telldir + win32_times + win32_tmpfile + win32_uname + win32_ungetc + win32_unlink + win32_utime + win32_vfprintf + win32_vprintf + win32_waitpid + win32_write + Perl_pp_pack + Perl_pp_unpack + Perl_sv_2pv_flags + Perl_sv_catpvn_flags + Perl_sv_catsv_flags + Perl_sv_setsv_flags diff --git a/wince/perllib.c b/wince/perllib.c new file mode 100644 index 0000000..931a362 --- /dev/null +++ b/wince/perllib.c @@ -0,0 +1,386 @@ +// Time-stamp: <01/08/01 20:58:55 keuchel@w2k> + +#include "EXTERN.h" +#include "perl.h" + +#ifdef PERL_OBJECT +#define NO_XSLOCKS +#endif + +#include "XSUB.h" + +#ifdef PERL_IMPLICIT_SYS +#include "win32iop.h" +#include +#endif /* PERL_IMPLICIT_SYS */ + + +/* Register any extra external extensions */ +char *staticlinkmodules[] = { + "DynaLoader", + NULL, +}; + +EXTERN_C void boot_DynaLoader (pTHXo_ CV* cv); + +static void +xs_init(pTHXo) +{ + char *file = __FILE__; + dXSUB_SYS; + newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file); +} + +#ifdef PERL_IMPLICIT_SYS + +#include "perlhost.h" + +EXTERN_C void +perl_get_host_info(struct IPerlMemInfo* perlMemInfo, + struct IPerlMemInfo* perlMemSharedInfo, + struct IPerlMemInfo* perlMemParseInfo, + struct IPerlEnvInfo* perlEnvInfo, + struct IPerlStdIOInfo* perlStdIOInfo, + struct IPerlLIOInfo* perlLIOInfo, + struct IPerlDirInfo* perlDirInfo, + struct IPerlSockInfo* perlSockInfo, + struct IPerlProcInfo* perlProcInfo) +{ + if (perlMemInfo) { + Copy(&perlMem, &perlMemInfo->perlMemList, perlMemInfo->nCount, void*); + perlMemInfo->nCount = (sizeof(struct IPerlMem)/sizeof(void*)); + } + if (perlMemSharedInfo) { + Copy(&perlMem, &perlMemSharedInfo->perlMemList, perlMemSharedInfo->nCount, void*); + perlMemSharedInfo->nCount = (sizeof(struct IPerlMem)/sizeof(void*)); + } + if (perlMemParseInfo) { + Copy(&perlMem, &perlMemParseInfo->perlMemList, perlMemParseInfo->nCount, void*); + perlMemParseInfo->nCount = (sizeof(struct IPerlMem)/sizeof(void*)); + } + if (perlEnvInfo) { + Copy(&perlEnv, &perlEnvInfo->perlEnvList, perlEnvInfo->nCount, void*); + perlEnvInfo->nCount = (sizeof(struct IPerlEnv)/sizeof(void*)); + } + if (perlStdIOInfo) { + Copy(&perlStdIO, &perlStdIOInfo->perlStdIOList, perlStdIOInfo->nCount, void*); + perlStdIOInfo->nCount = (sizeof(struct IPerlStdIO)/sizeof(void*)); + } + if (perlLIOInfo) { + Copy(&perlLIO, &perlLIOInfo->perlLIOList, perlLIOInfo->nCount, void*); + perlLIOInfo->nCount = (sizeof(struct IPerlLIO)/sizeof(void*)); + } + if (perlDirInfo) { + Copy(&perlDir, &perlDirInfo->perlDirList, perlDirInfo->nCount, void*); + perlDirInfo->nCount = (sizeof(struct IPerlDir)/sizeof(void*)); + } + if (perlSockInfo) { + Copy(&perlSock, &perlSockInfo->perlSockList, perlSockInfo->nCount, void*); + perlSockInfo->nCount = (sizeof(struct IPerlSock)/sizeof(void*)); + } + if (perlProcInfo) { + Copy(&perlProc, &perlProcInfo->perlProcList, perlProcInfo->nCount, void*); + perlProcInfo->nCount = (sizeof(struct IPerlProc)/sizeof(void*)); + } +} + +EXTERN_C PerlInterpreter* +perl_alloc_override(struct IPerlMem** ppMem, struct IPerlMem** ppMemShared, + struct IPerlMem** ppMemParse, struct IPerlEnv** ppEnv, + struct IPerlStdIO** ppStdIO, struct IPerlLIO** ppLIO, + struct IPerlDir** ppDir, struct IPerlSock** ppSock, + struct IPerlProc** ppProc) +{ + PerlInterpreter *my_perl = NULL; + CPerlHost* pHost = new CPerlHost(ppMem, ppMemShared, ppMemParse, ppEnv, + ppStdIO, ppLIO, ppDir, ppSock, ppProc); + + if (pHost) { + my_perl = perl_alloc_using(pHost->m_pHostperlMem, + pHost->m_pHostperlMemShared, + pHost->m_pHostperlMemParse, + pHost->m_pHostperlEnv, + pHost->m_pHostperlStdIO, + pHost->m_pHostperlLIO, + pHost->m_pHostperlDir, + pHost->m_pHostperlSock, + pHost->m_pHostperlProc); + if (my_perl) { +#ifdef PERL_OBJECT + CPerlObj* pPerl = (CPerlObj*)my_perl; +#endif + w32_internal_host = pHost; + } + } + return my_perl; +} + +EXTERN_C PerlInterpreter* +perl_alloc(void) +{ + PerlInterpreter* my_perl = NULL; + CPerlHost* pHost = new CPerlHost(); + if (pHost) { + my_perl = perl_alloc_using(pHost->m_pHostperlMem, + pHost->m_pHostperlMemShared, + pHost->m_pHostperlMemParse, + pHost->m_pHostperlEnv, + pHost->m_pHostperlStdIO, + pHost->m_pHostperlLIO, + pHost->m_pHostperlDir, + pHost->m_pHostperlSock, + pHost->m_pHostperlProc); + if (my_perl) { +#ifdef PERL_OBJECT + CPerlObj* pPerl = (CPerlObj*)my_perl; +#endif + w32_internal_host = pHost; + } + } + return my_perl; +} + +EXTERN_C void +win32_delete_internal_host(void *h) +{ + CPerlHost *host = (CPerlHost*)h; + delete host; +} + +#ifdef PERL_OBJECT + +EXTERN_C void +perl_construct(PerlInterpreter* my_perl) +{ + CPerlObj* pPerl = (CPerlObj*)my_perl; + try + { + Perl_construct(); + } + catch(...) + { + win32_fprintf(stderr, "%s\n", + "Error: Unable to construct data structures"); + perl_free(my_perl); + } +} + +EXTERN_C void +perl_destruct(PerlInterpreter* my_perl) +{ + CPerlObj* pPerl = (CPerlObj*)my_perl; +#ifdef DEBUGGING + Perl_destruct(); +#else + try + { + Perl_destruct(); + } + catch(...) + { + } +#endif +} + +EXTERN_C void +perl_free(PerlInterpreter* my_perl) +{ + CPerlObj* pPerl = (CPerlObj*)my_perl; + void *host = w32_internal_host; +#ifdef DEBUGGING + Perl_free(); +#else + try + { + Perl_free(); + } + catch(...) + { + } +#endif + win32_delete_internal_host(host); + PERL_SET_THX(NULL); +} + +EXTERN_C int +perl_run(PerlInterpreter* my_perl) +{ + CPerlObj* pPerl = (CPerlObj*)my_perl; + int retVal; +#ifdef DEBUGGING + retVal = Perl_run(); +#else + try + { + retVal = Perl_run(); + } + catch(...) + { + win32_fprintf(stderr, "Error: Runtime exception\n"); + retVal = -1; + } +#endif + return retVal; +} + +EXTERN_C int +perl_parse(PerlInterpreter* my_perl, void (*xsinit)(CPerlObj*), int argc, char** argv, char** env) +{ + int retVal; + CPerlObj* pPerl = (CPerlObj*)my_perl; +#ifdef DEBUGGING + retVal = Perl_parse(xsinit, argc, argv, env); +#else + try + { + retVal = Perl_parse(xsinit, argc, argv, env); + } + catch(...) + { + win32_fprintf(stderr, "Error: Parse exception\n"); + retVal = -1; + } +#endif + *win32_errno() = 0; + return retVal; +} + +#undef PL_perl_destruct_level +#define PL_perl_destruct_level int dummy + +#endif /* PERL_OBJECT */ +#endif /* PERL_IMPLICIT_SYS */ + +EXTERN_C HANDLE w32_perldll_handle; + +EXTERN_C DllExport int +RunPerl(int argc, char **argv, char **env) +{ + int exitstatus; + PerlInterpreter *my_perl, *new_perl = NULL; + +#ifndef __BORLANDC__ + /* XXX this _may_ be a problem on some compilers (e.g. Borland) that + * want to free() argv after main() returns. As luck would have it, + * Borland's CRT does the right thing to argv[0] already. */ + char szModuleName[MAX_PATH]; + char *ptr; + + XCEGetModuleFileNameA(NULL, szModuleName, sizeof(szModuleName)); + (void)win32_longpath(szModuleName); + argv[0] = szModuleName; +#endif + +#ifdef PERL_GLOBAL_STRUCT +#define PERLVAR(var,type) /**/ +#define PERLVARA(var,type) /**/ +#define PERLVARI(var,type,init) PL_Vars.var = init; +#define PERLVARIC(var,type,init) PL_Vars.var = init; +#include "perlvars.h" +#undef PERLVAR +#undef PERLVARA +#undef PERLVARI +#undef PERLVARIC +#endif + + PERL_SYS_INIT(&argc,&argv); + + if (!(my_perl = perl_alloc())) + return (1); + perl_construct(my_perl); + PL_perl_destruct_level = 0; + + exitstatus = perl_parse(my_perl, xs_init, argc, argv, env); + if (!exitstatus) { +#if defined(TOP_CLONE) && defined(USE_ITHREADS) /* XXXXXX testing */ +# ifdef PERL_OBJECT + CPerlHost *h = new CPerlHost(); + new_perl = perl_clone_using(my_perl, 1, + h->m_pHostperlMem, + h->m_pHostperlMemShared, + h->m_pHostperlMemParse, + h->m_pHostperlEnv, + h->m_pHostperlStdIO, + h->m_pHostperlLIO, + h->m_pHostperlDir, + h->m_pHostperlSock, + h->m_pHostperlProc + ); + CPerlObj *pPerl = (CPerlObj*)new_perl; +# else + new_perl = perl_clone(my_perl, 1); +# endif + exitstatus = perl_run(new_perl); + PERL_SET_THX(my_perl); +#else + exitstatus = perl_run(my_perl); +#endif + } + + perl_destruct(my_perl); + perl_free(my_perl); +#ifdef USE_ITHREADS + if (new_perl) { + PERL_SET_THX(new_perl); + perl_destruct(new_perl); + perl_free(new_perl); + } +#endif + + PERL_SYS_TERM(); + + return (exitstatus); +} + +EXTERN_C void +set_w32_module_name(void); + +#ifdef __MINGW32__ +EXTERN_C /* GCC in C++ mode mangles the name, otherwise */ +#endif +BOOL APIENTRY +DllMain(HANDLE hModule, /* DLL module handle */ + DWORD fdwReason, /* reason called */ + LPVOID lpvReserved) /* reserved */ +{ + switch (fdwReason) { + /* The DLL is attaching to a process due to process + * initialization or a call to LoadLibrary. + */ + case DLL_PROCESS_ATTACH: +/* #define DEFAULT_BINMODE */ +#ifdef DEFAULT_BINMODE + setmode( fileno( stdin ), O_BINARY ); + setmode( fileno( stdout ), O_BINARY ); + setmode( fileno( stderr ), O_BINARY ); + _fmode = O_BINARY; +#endif + +#ifndef UNDER_CE + DisableThreadLibraryCalls((HMODULE)hModule); +#endif + + w32_perldll_handle = hModule; + set_w32_module_name(); + break; + + /* The DLL is detaching from a process due to + * process termination or call to FreeLibrary. + */ + case DLL_PROCESS_DETACH: + break; + + /* The attached process creates a new thread. */ + case DLL_THREAD_ATTACH: + break; + + /* The thread of the attached process terminates. */ + case DLL_THREAD_DETACH: + break; + + default: + break; + } + return TRUE; +} + diff --git a/wince/perlmain.c b/wince/perlmain.c new file mode 100644 index 0000000..86e6c95 --- /dev/null +++ b/wince/perlmain.c @@ -0,0 +1,36 @@ +// Time-stamp: <01/08/01 20:58:19 keuchel@w2k> + +#include "EXTERN.h" +#include "perl.h" + +#ifdef __GNUC__ + +/* Mingw32 defaults to globing command line + * This is inconsistent with other Win32 ports and + * seems to cause trouble with passing -DXSVERSION=\"1.6\" + * So we turn it off like this: + */ +int _CRT_glob = 0; + +#endif + +// Called from w32console/wmain.c + +int +main(int argc, char **argv, char **env) +{ + int res; + + if(argc == 1) + XCEShowMessageA("Starting perl with no args is currently\r\n" + "not useful on Windows CE"); + + res = RunPerl(argc, argv, env); + + if(res != 0) + XCEShowMessageA("Exitcode: %d", res); + + return res; +} + + diff --git a/wince/registry.bat b/wince/registry.bat new file mode 100755 index 0000000..f9c8193 --- /dev/null +++ b/wince/registry.bat @@ -0,0 +1,28 @@ +@echo off + +::- This script must be executed on the PC with an ActiveSync +::- connection. If it does not work, create the entries with +::- a remote registry editor or get a registry editor for your +::- devices. +::- +::- You need my cereg.exe program. + +::- My paths... +set perlexe=\speicherkarte2\bin\perl.exe +set perllib=\speicherkarte2\usr\lib\perl5 + +::- PERL5LIB +cereg -k "HKLM\Environment" -n "PERL5LIB" -v "%perllib%" + +::- For ShellExecute +cereg -k "HKCR\.pl" -n "" -v "perlfile" +cereg -k "HKCR\perlfile" -n "" -v "Perl Script" +cereg -k "HKCR\perlfile\DefaultIcon" -n "" -v "%perlexe%,-1" + +::- You might need to fix the quotes if your paths contain spaces! +cereg -k "HKCR\perlfile\Shell\open\command" -n "" -v "%perlexe% %%1" + +cereg -k "HKLM\Environment" -n "ROWS" -v "10" +cereg -k "HKLM\Environment" -n "COLS" -v "75" +cereg -k "HKLM\Environment" -n "PATH" -v "/Speicherkarte2/bin" +cereg -k "HKLM\Environment" -n "UNIXROOTDIR" -v "/Speicherkarte2" diff --git a/wince/runperl.c b/wince/runperl.c new file mode 100644 index 0000000..85fd831 --- /dev/null +++ b/wince/runperl.c @@ -0,0 +1,21 @@ +#include "EXTERN.h" +#include "perl.h" + +#ifdef __GNUC__ + +/* Mingw32 defaults to globing command line + * This is inconsistent with other Win32 ports and + * seems to cause trouble with passing -DXSVERSION=\"1.6\" + * So we turn it off like this: + */ +int _CRT_glob = 0; + +#endif + +int +main(int argc, char **argv, char **env) +{ + return RunPerl(argc, argv, env); +} + + diff --git a/wince/splittree.pl b/wince/splittree.pl new file mode 100644 index 0000000..3c76daa --- /dev/null +++ b/wince/splittree.pl @@ -0,0 +1,24 @@ +use DirHandle; +use AutoSplit; + +sub splitthis { +my ($top,$base,$dest) = @_; +my $d = new DirHandle $base; +if (defined $d) { + while (defined($_ = $d->read)) { + next if $_ eq "."; + next if $_ eq ".."; + my $entry = "$base\\$_"; + my $entrywithouttop = $entry; + $entrywithouttop =~ s/^$top//; + if (-d $entry) {splitthis ($top,$entry,$dest);} + else { + next unless ($entry=~/pm$/i); + #print "Will run autosplit on $entry to $dest\n"; + autosplit($entry,$dest,0,1,1); + }; + }; + }; +} + +splitthis $ARGV[0],$ARGV[0],$ARGV[1]; diff --git a/wince/win32.h b/wince/win32.h new file mode 100644 index 0000000..5ffe5dc --- /dev/null +++ b/wince/win32.h @@ -0,0 +1,482 @@ +// Time-stamp: <01/08/01 20:59:54 keuchel@w2k> + +/* WIN32.H + * + * (c) 1995 Microsoft Corporation. All rights reserved. + * Developed by hip communications inc., http://info.hip.com/info/ + * + * You may distribute under the terms of either the GNU General Public + * License or the Artistic License, as specified in the README file. + */ + +#ifndef _INC_WIN32_PERL5 +#define _INC_WIN32_PERL5 + +#ifndef _WIN32_WINNT +# define _WIN32_WINNT 0x0400 /* needed for TryEnterCriticalSection() etc. */ +#endif + +#if defined(PERL_OBJECT) || defined(PERL_IMPLICIT_SYS) || defined(PERL_CAPI) +# define DYNAMIC_ENV_FETCH +# define ENV_HV_NAME "___ENV_HV_NAME___" +# define HAS_GETENV_LEN +# define prime_env_iter() +# define WIN32IO_IS_STDIO /* don't pull in custom stdio layer */ +# define WIN32SCK_IS_STDSCK /* don't pull in custom wsock layer */ +# ifdef PERL_GLOBAL_STRUCT +# error PERL_GLOBAL_STRUCT cannot be defined with PERL_IMPLICIT_SYS +# endif +# define win32_get_privlib PerlEnv_lib_path +# define win32_get_sitelib PerlEnv_sitelib_path +# define win32_get_vendorlib PerlEnv_vendorlib_path +#endif + +#ifdef __GNUC__ +# ifndef __int64 /* some versions seem to #define it already */ +# define __int64 long long +# endif +# define Win32_Winsock +#endif + +/* Define DllExport akin to perl's EXT, + * If we are in the DLL or mimicing the DLL for Win95 work round + * then Export the symbol, + * otherwise import it. + */ + +/* now even GCC supports __declspec() */ + +#if defined(PERL_OBJECT) +#define DllExport +#else +#if defined(PERLDLL) || defined(WIN95FIX) +#define DllExport +/*#define DllExport __declspec(dllexport)*/ /* noises with VC5+sp3 */ +#else +#define DllExport __declspec(dllimport) +#endif +#endif + +#define WIN32_LEAN_AND_MEAN +#include + +#ifdef WIN32_LEAN_AND_MEAN /* C file is NOT a Perl5 original. */ +#define CONTEXT PERL_CONTEXT /* Avoid conflict of CONTEXT defs. */ +#endif /*WIN32_LEAN_AND_MEAN */ + +#ifndef TLS_OUT_OF_INDEXES +#define TLS_OUT_OF_INDEXES (DWORD)0xFFFFFFFF +#endif + +#include +#ifndef UNDER_CE +#include +#include +#include +#include +#endif +#include +#include +#ifndef EXT +#include "EXTERN.h" +#endif + +struct tms { + long tms_utime; + long tms_stime; + long tms_cutime; + long tms_cstime; +}; + +#ifndef SYS_NMLN +#define SYS_NMLN 257 +#endif + +struct utsname { + char sysname[SYS_NMLN]; + char nodename[SYS_NMLN]; + char release[SYS_NMLN]; + char version[SYS_NMLN]; + char machine[SYS_NMLN]; +}; + +#ifndef START_EXTERN_C +#undef EXTERN_C +#ifdef __cplusplus +# define START_EXTERN_C extern "C" { +# define END_EXTERN_C } +# define EXTERN_C extern "C" +#else +# define START_EXTERN_C +# define END_EXTERN_C +# define EXTERN_C +#endif +#endif + +#define STANDARD_C 1 +#define DOSISH 1 /* no escaping our roots */ +#define OP_BINARY O_BINARY /* mistake in in pp_sys.c? */ + +/* Define USE_SOCKETS_AS_HANDLES to enable emulation of windows sockets as + * real filehandles. XXX Should always be defined (the other version is untested) */ + +//#define USE_SOCKETS_AS_HANDLES + +/* read() and write() aren't transparent for socket handles */ +#define PERL_SOCK_SYSREAD_IS_RECV +#define PERL_SOCK_SYSWRITE_IS_SEND + +#define PERL_NO_FORCE_LINK /* no need for PL_force_link_funcs */ + +/* if USE_WIN32_RTL_ENV is not defined, Perl uses direct Win32 calls + * to read the environment, bypassing the runtime's (usually broken) + * facilities for accessing the same. See note in util.c/my_setenv(). */ +/*#define USE_WIN32_RTL_ENV */ + +/* Define USE_FIXED_OSFHANDLE to fix MSVCRT's _open_osfhandle() on W95. + It now uses some black magic to work seamlessly with the DLL CRT and + works with MSVC++ 4.0+ or GCC/Mingw32 + -- BKS 1-24-2000 */ +#if (defined(_M_IX86) && _MSC_VER >= 1000) || defined(__MINGW32__) +#define USE_FIXED_OSFHANDLE +#endif + +#define ENV_IS_CASELESS + +#ifndef VER_PLATFORM_WIN32_WINDOWS /* VC-2.0 headers don't have this */ +#define VER_PLATFORM_WIN32_WINDOWS 1 +#endif + +#ifndef FILE_SHARE_DELETE /* VC-4.0 headers don't have this */ +#define FILE_SHARE_DELETE 0x00000004 +#endif + +/* access() mode bits */ +#ifndef R_OK +# define R_OK 4 +# define W_OK 2 +# define X_OK 1 +# define F_OK 0 +#endif + +#define PERL_GET_CONTEXT_DEFINED + +/* Compiler-specific stuff. */ + +#ifdef __BORLANDC__ /* Borland C++ */ + +#define _access access +#define _chdir chdir +#define _getpid getpid +#define wcsicmp _wcsicmp +#include + +#ifndef DllMain +#define DllMain DllEntryPoint +#endif + +#pragma warn -ccc /* "condition is always true/false" */ +#pragma warn -rch /* "unreachable code" */ +#pragma warn -sig /* "conversion may lose significant digits" */ +#pragma warn -pia /* "possibly incorrect assignment" */ +#pragma warn -par /* "parameter 'foo' is never used" */ +#pragma warn -aus /* "'foo' is assigned a value that is never used" */ +#pragma warn -use /* "'foo' is declared but never used" */ +#pragma warn -csu /* "comparing signed and unsigned values" */ +#pragma warn -pro /* "call to function with no prototype" */ +#pragma warn -stu /* "undefined structure 'foo'" */ + +/* Borland is picky about a bare member function name used as its ptr */ +#ifdef PERL_OBJECT +# define MEMBER_TO_FPTR(name) &(name) +#endif + +/* Borland C thinks that a pointer to a member variable is 12 bytes in size. */ +#define PERL_MEMBER_PTR_SIZE 12 + +#endif + +#ifdef _MSC_VER /* Microsoft Visual C++ */ + +#ifndef _MODE_T_DEFINED_ +typedef unsigned long mode_t; +#define _MODE_T_DEFINED_ +#endif + +#pragma warning(disable: 4018 4035 4101 4102 4244 4245 4761) + +/* Visual C thinks that a pointer to a member variable is 16 bytes in size. */ +#define PERL_MEMBER_PTR_SIZE 16 + +#endif /* _MSC_VER */ + +#ifdef __MINGW32__ /* Minimal Gnu-Win32 */ + +typedef long uid_t; +typedef long gid_t; +#ifndef _environ +#define _environ environ +#endif +#define flushall _flushall +#define fcloseall _fcloseall + +#ifdef PERL_OBJECT +# define MEMBER_TO_FPTR(name) &(name) +#endif + +#ifndef _O_NOINHERIT +# define _O_NOINHERIT 0x0080 +# ifndef _NO_OLDNAMES +# define O_NOINHERIT _O_NOINHERIT +# endif +#endif + +#endif /* __MINGW32__ */ + +/* both GCC/Mingw32 and MSVC++ 4.0 are missing this, so we put it here */ +#ifndef CP_UTF8 +# define CP_UTF8 65001 +#endif + +/* compatibility stuff for other compilers goes here */ + + +#if !defined(PERL_OBJECT) && defined(PERL_CAPI) && defined(PERL_MEMBER_PTR_SIZE) +# define STRUCT_MGVTBL_DEFINITION \ +struct mgvtbl { \ + union { \ + int (CPERLscope(*svt_get))(pTHX_ SV *sv, MAGIC* mg); \ + char handle_VC_problem1[PERL_MEMBER_PTR_SIZE]; \ + }; \ + union { \ + int (CPERLscope(*svt_set))(pTHX_ SV *sv, MAGIC* mg); \ + char handle_VC_problem2[PERL_MEMBER_PTR_SIZE]; \ + }; \ + union { \ + U32 (CPERLscope(*svt_len))(pTHX_ SV *sv, MAGIC* mg); \ + char handle_VC_problem3[PERL_MEMBER_PTR_SIZE]; \ + }; \ + union { \ + int (CPERLscope(*svt_clear))(pTHX_ SV *sv, MAGIC* mg); \ + char handle_VC_problem4[PERL_MEMBER_PTR_SIZE]; \ + }; \ + union { \ + int (CPERLscope(*svt_free))(pTHX_ SV *sv, MAGIC* mg); \ + char handle_VC_problem5[PERL_MEMBER_PTR_SIZE]; \ + }; \ +} + +# define BASEOP_DEFINITION \ + OP* op_next; \ + OP* op_sibling; \ + OP* (CPERLscope(*op_ppaddr))(pTHX); \ + char handle_VC_problem[PERL_MEMBER_PTR_SIZE-sizeof(OP*)]; \ + PADOFFSET op_targ; \ + OPCODE op_type; \ + U16 op_seq; \ + U8 op_flags; \ + U8 op_private; + +#endif /* !PERL_OBJECT && PERL_CAPI && PERL_MEMBER_PTR_SIZE */ + + +START_EXTERN_C + +#undef Stat +#define Stat win32_stat + +#undef init_os_extras +#define init_os_extras Perl_init_os_extras + +DllExport void Perl_win32_init(int *argcp, char ***argvp); +DllExport void Perl_init_os_extras(); +DllExport void win32_str_os_error(void *sv, DWORD err); +DllExport int RunPerl(int argc, char **argv, char **env); + +typedef struct { + HANDLE childStdIn; + HANDLE childStdOut; + HANDLE childStdErr; + /* + * the following correspond to the fields of the same name + * in the STARTUPINFO structure. Embedders can use these to + * control the spawning process' look. + * Example - to hide the window of the spawned process: + * dwFlags = STARTF_USESHOWWINDOW; + * wShowWindow = SW_HIDE; + */ + DWORD dwFlags; + DWORD dwX; + DWORD dwY; + DWORD dwXSize; + DWORD dwYSize; + DWORD dwXCountChars; + DWORD dwYCountChars; + DWORD dwFillAttribute; + WORD wShowWindow; +} child_IO_table; + +DllExport void win32_get_child_IO(child_IO_table* ptr); + +#ifndef USE_SOCKETS_AS_HANDLES +extern FILE * my_fdopen(int, char *); +#endif + +extern int my_fclose(FILE *); +extern int do_aspawn(void *really, void **mark, void **sp); +extern int do_spawn(char *cmd); +extern int do_spawn_nowait(char *cmd); +extern char * win32_get_privlib(const char *pl); +extern char * win32_get_sitelib(const char *pl); +extern char * win32_get_vendorlib(const char *pl); +extern int IsWin95(void); +extern int IsWinNT(void); +extern void win32_argv2utf8(int argc, char** argv); + +#ifdef PERL_IMPLICIT_SYS +extern void win32_delete_internal_host(void *h); +#endif + +extern char * staticlinkmodules[]; + +END_EXTERN_C + +/* + * handle socket stuff, assuming socket is always available + */ + +#include +#include + +#ifdef MYMALLOC +#define EMBEDMYMALLOC /**/ +/* #define USE_PERL_SBRK /**/ +/* #define PERL_SBRK_VIA_MALLOC /**/ +#endif + +#if defined(PERLDLL) && !defined(PERL_CORE) +#define PERL_CORE +#endif + +#ifdef PERL_TEXTMODE_SCRIPTS +# define PERL_SCRIPT_MODE "r" +#else +# define PERL_SCRIPT_MODE "rb" +#endif + +/* + * Now Win32 specific per-thread data stuff + */ + +struct thread_intern { + /* XXX can probably use one buffer instead of several */ + char Wstrerror_buffer[512]; + struct servent Wservent; + char Wgetlogin_buffer[128]; +# ifdef USE_SOCKETS_AS_HANDLES + int Winit_socktype; +# endif +# ifdef HAVE_DES_FCRYPT + char Wcrypt_buffer[30]; +# endif +# ifdef USE_RTL_THREAD_API + void * retv; /* slot for thread return value */ +# endif +}; + +#ifdef USE_THREADS +# ifndef USE_DECLSPEC_THREAD +# define HAVE_THREAD_INTERN +# endif /* !USE_DECLSPEC_THREAD */ +#endif /* USE_THREADS */ + +#define HAVE_INTERP_INTERN +typedef struct { + long num; + DWORD pids[MAXIMUM_WAIT_OBJECTS]; + HANDLE handles[MAXIMUM_WAIT_OBJECTS]; +} child_tab; + +struct interp_intern { + char * perlshell_tokens; + char ** perlshell_vec; + long perlshell_items; + struct av * fdpid; + child_tab * children; +#ifdef USE_ITHREADS + DWORD pseudo_id; + child_tab * pseudo_children; +#endif + void * internal_host; +#ifndef USE_THREADS + struct thread_intern thr_intern; +#endif +}; + + +#define w32_perlshell_tokens (PL_sys_intern.perlshell_tokens) +#define w32_perlshell_vec (PL_sys_intern.perlshell_vec) +#define w32_perlshell_items (PL_sys_intern.perlshell_items) +#define w32_fdpid (PL_sys_intern.fdpid) +#define w32_children (PL_sys_intern.children) +#define w32_num_children (w32_children->num) +#define w32_child_pids (w32_children->pids) +#define w32_child_handles (w32_children->handles) +#define w32_pseudo_id (PL_sys_intern.pseudo_id) +#define w32_pseudo_children (PL_sys_intern.pseudo_children) +#define w32_num_pseudo_children (w32_pseudo_children->num) +#define w32_pseudo_child_pids (w32_pseudo_children->pids) +#define w32_pseudo_child_handles (w32_pseudo_children->handles) +#define w32_internal_host (PL_sys_intern.internal_host) +#ifdef USE_THREADS +# define w32_strerror_buffer (thr->i.Wstrerror_buffer) +# define w32_getlogin_buffer (thr->i.Wgetlogin_buffer) +# define w32_crypt_buffer (thr->i.Wcrypt_buffer) +# define w32_servent (thr->i.Wservent) +# define w32_init_socktype (thr->i.Winit_socktype) +#else +# define w32_strerror_buffer (PL_sys_intern.thr_intern.Wstrerror_buffer) +# define w32_getlogin_buffer (PL_sys_intern.thr_intern.Wgetlogin_buffer) +# define w32_crypt_buffer (PL_sys_intern.thr_intern.Wcrypt_buffer) +# define w32_servent (PL_sys_intern.thr_intern.Wservent) +# define w32_init_socktype (PL_sys_intern.thr_intern.Winit_socktype) +#endif /* USE_THREADS */ + +/* UNICODE<>ANSI translation helpers */ +/* Use CP_ACP when mode is ANSI */ +/* Use CP_UTF8 when mode is UTF8 */ + +#define A2WHELPER_LEN(lpa, alen, lpw, nBytes)\ + (lpw[0] = 0, MultiByteToWideChar((IN_BYTE) ? CP_ACP : CP_UTF8, 0, \ + lpa, alen, lpw, (nBytes/sizeof(WCHAR)))) +#define A2WHELPER(lpa, lpw, nBytes) A2WHELPER_LEN(lpa, -1, lpw, nBytes) + +#define W2AHELPER_LEN(lpw, wlen, lpa, nChars)\ + (lpa[0] = '\0', WideCharToMultiByte((IN_BYTE) ? CP_ACP : CP_UTF8, 0, \ + lpw, wlen, (LPSTR)lpa, nChars,NULL,NULL)) +#define W2AHELPER(lpw, lpa, nChars) W2AHELPER_LEN(lpw, -1, lpa, nChars) + +#define USING_WIDE() (PL_widesyscalls && PerlEnv_os_id() == VER_PLATFORM_WIN32_NT) + +#ifdef USE_ITHREADS +# define PERL_WAIT_FOR_CHILDREN \ + STMT_START { \ + if (w32_pseudo_children && w32_num_pseudo_children) { \ + long children = w32_num_pseudo_children; \ + WaitForMultipleObjects(children, \ + w32_pseudo_child_handles, \ + TRUE, INFINITE); \ + while (children) \ + CloseHandle(w32_pseudo_child_handles[--children]); \ + } \ + } STMT_END +#endif + +/* + * This provides a layer of functions and macros to ensure extensions will + * get to use the same RTL functions as the core. + */ +#include "win32iop.h" + +#endif /* _INC_WIN32_PERL5 */ + diff --git a/wince/win32iop.h b/wince/win32iop.h new file mode 100644 index 0000000..3744168 --- /dev/null +++ b/wince/win32iop.h @@ -0,0 +1,339 @@ +// Time-stamp: <01/08/01 21:00:16 keuchel@w2k> + +#ifndef WIN32IOP_H +#define WIN32IOP_H + +#ifndef START_EXTERN_C +#ifdef __cplusplus +# define START_EXTERN_C extern "C" { +# define END_EXTERN_C } +# define EXTERN_C extern "C" +#else +# define START_EXTERN_C +# define END_EXTERN_C +# define EXTERN_C +#endif +#endif + +#ifndef UNDER_CE +#if defined(_MSC_VER) || defined(__MINGW32__) +# include +#else +# include +#endif +#endif + +/* + * defines for flock emulation + */ +#define LOCK_SH 1 +#define LOCK_EX 2 +#define LOCK_NB 4 +#define LOCK_UN 8 + +/* + * Make this as close to original stdio as possible. + */ + +/* + * function prototypes for our own win32io layer + */ +START_EXTERN_C + +DllExport int * win32_errno(void); +DllExport char *** win32_environ(void); +DllExport FILE* win32_stdin(void); +DllExport FILE* win32_stdout(void); +DllExport FILE* win32_stderr(void); +DllExport int win32_ferror(FILE *fp); +DllExport int win32_feof(FILE *fp); +DllExport char* win32_strerror(int e); + +DllExport int win32_fprintf(FILE *pf, const char *format, ...); +DllExport int win32_printf(const char *format, ...); +DllExport int win32_vfprintf(FILE *pf, const char *format, va_list arg); +DllExport int win32_vprintf(const char *format, va_list arg); +DllExport size_t win32_fread(void *buf, size_t size, size_t count, FILE *pf); +DllExport size_t win32_fwrite(const void *buf, size_t size, size_t count, FILE *pf); +DllExport FILE* win32_fopen(const char *path, const char *mode); +DllExport FILE* win32_fdopen(int fh, const char *mode); +DllExport FILE* win32_freopen(const char *path, const char *mode, FILE *pf); +DllExport int win32_fclose(FILE *pf); +DllExport int win32_fputs(const char *s,FILE *pf); +DllExport int win32_fputc(int c,FILE *pf); +DllExport int win32_ungetc(int c,FILE *pf); +DllExport int win32_getc(FILE *pf); +DllExport int win32_fileno(FILE *pf); +DllExport void win32_clearerr(FILE *pf); +DllExport int win32_fflush(FILE *pf); +DllExport long win32_ftell(FILE *pf); +DllExport int win32_fseek(FILE *pf,long offset,int origin); +DllExport int win32_fgetpos(FILE *pf,fpos_t *p); +DllExport int win32_fsetpos(FILE *pf,const fpos_t *p); +DllExport void win32_rewind(FILE *pf); +DllExport FILE* win32_tmpfile(void); +DllExport void win32_abort(void); +DllExport int win32_fstat(int fd,struct stat *sbufptr); +DllExport int win32_stat(const char *name,struct stat *sbufptr); +DllExport int win32_pipe( int *phandles, unsigned int psize, int textmode ); +DllExport FILE* win32_popen( const char *command, const char *mode ); +DllExport int win32_pclose( FILE *pf); +DllExport int win32_rename( const char *oname, const char *newname); +DllExport int win32_setmode( int fd, int mode); +DllExport long win32_lseek( int fd, long offset, int origin); +DllExport long win32_tell( int fd); +DllExport int win32_dup( int fd); +DllExport int win32_dup2(int h1, int h2); +DllExport int win32_open(const char *path, int oflag,...); +DllExport int win32_close(int fd); +DllExport int win32_eof(int fd); +DllExport int win32_read(int fd, void *buf, unsigned int cnt); +DllExport int win32_write(int fd, const void *buf, unsigned int cnt); +DllExport int win32_spawnvp(int mode, const char *cmdname, + const char *const *argv); +DllExport int win32_mkdir(const char *dir, int mode); +DllExport int win32_rmdir(const char *dir); +DllExport int win32_chdir(const char *dir); +DllExport int win32_flock(int fd, int oper); +DllExport int win32_execv(const char *cmdname, const char *const *argv); +DllExport int win32_execvp(const char *cmdname, const char *const *argv); +DllExport void win32_perror(const char *str); +DllExport void win32_setbuf(FILE *pf, char *buf); +DllExport int win32_setvbuf(FILE *pf, char *buf, int type, size_t size); +DllExport int win32_flushall(void); +DllExport int win32_fcloseall(void); +DllExport char* win32_fgets(char *s, int n, FILE *pf); +DllExport char* win32_gets(char *s); +DllExport int win32_fgetc(FILE *pf); +DllExport int win32_putc(int c, FILE *pf); +DllExport int win32_puts(const char *s); +DllExport int win32_getchar(void); +DllExport int win32_putchar(int c); +DllExport void* win32_malloc(size_t size); +DllExport void* win32_calloc(size_t numitems, size_t size); +DllExport void* win32_realloc(void *block, size_t size); +DllExport void win32_free(void *block); + +DllExport int win32_open_osfhandle(long handle, int flags); +DllExport long win32_get_osfhandle(int fd); + +DllExport DIR* win32_opendir(char *filename); +DllExport struct direct* win32_readdir(DIR *dirp); +DllExport long win32_telldir(DIR *dirp); +DllExport void win32_seekdir(DIR *dirp, long loc); +DllExport void win32_rewinddir(DIR *dirp); +DllExport int win32_closedir(DIR *dirp); + +#ifndef USE_WIN32_RTL_ENV +DllExport char* win32_getenv(const char *name); +DllExport int win32_putenv(const char *name); +#endif + +DllExport unsigned win32_sleep(unsigned int); +DllExport int win32_times(struct tms *timebuf); +DllExport unsigned win32_alarm(unsigned int sec); +DllExport int win32_stat(const char *path, struct stat *buf); +DllExport char* win32_longpath(char *path); +DllExport int win32_ioctl(int i, unsigned int u, char *data); +DllExport int win32_link(const char *oldname, const char *newname); +DllExport int win32_unlink(const char *f); +DllExport int win32_utime(const char *f, struct utimbuf *t); +DllExport int win32_uname(struct utsname *n); +DllExport int win32_wait(int *status); +DllExport int win32_waitpid(int pid, int *status, int flags); +DllExport int win32_kill(int pid, int sig); +DllExport unsigned long win32_os_id(void); +DllExport void* win32_dynaload(const char*filename); +DllExport int win32_access(const char *path, int mode); +DllExport int win32_chmod(const char *path, int mode); +DllExport int win32_getpid(void); + +DllExport char * win32_crypt(const char *txt, const char *salt); + +END_EXTERN_C + +/* + * the following six(6) is #define in stdio.h + */ +#ifndef WIN32IO_IS_STDIO +#undef errno +#undef environ +#undef stderr +#undef stdin +#undef stdout +#undef ferror +#undef feof +#undef fclose +#undef pipe +#undef pause +#undef sleep +#undef times +#undef alarm +#undef ioctl +#undef unlink +#undef utime +#undef uname +#undef wait + +#ifdef __BORLANDC__ +#undef ungetc +#undef getc +#undef putc +#undef getchar +#undef putchar +#undef fileno +#endif + +#define stderr win32_stderr() +#define stdout win32_stdout() +#define stdin win32_stdin() +#define feof(f) win32_feof(f) +#define ferror(f) win32_ferror(f) +#define errno (*win32_errno()) +#define environ (*win32_environ()) +#define strerror win32_strerror + +/* + * redirect to our own version + */ +#undef fprintf +#define fprintf win32_fprintf +#undef vfprintf +#define vfprintf win32_vfprintf +#undef printf +#define printf win32_printf +#undef vprintf +#define vprintf win32_vprintf +#undef fread +#define fread(buf,size,count,f) win32_fread(buf,size,count,f) +#undef fwrite +#define fwrite(buf,size,count,f) win32_fwrite(buf,size,count,f) +#undef fopen +#define fopen win32_fopen +#undef fdopen +#define fdopen win32_fdopen +#undef freopen +#define freopen win32_freopen +#define fclose(f) win32_fclose(f) +#undef fputs +#define fputs(s,f) win32_fputs(s,f) +#undef fputc +#define fputc(c,f) win32_fputc(c,f) +#undef ungetc +#define ungetc(c,f) win32_ungetc(c,f) +#undef getc +#define getc(f) win32_getc(f) +#undef fileno +#define fileno(f) win32_fileno(f) +#undef clearerr +#define clearerr(f) win32_clearerr(f) +#undef fflush +#define fflush(f) win32_fflush(f) +#undef ftell +#define ftell(f) win32_ftell(f) +#undef fseek +#define fseek(f,o,w) win32_fseek(f,o,w) +#undef fgetpos +#define fgetpos(f,p) win32_fgetpos(f,p) +#undef fsetpos +#define fsetpos(f,p) win32_fsetpos(f,p) +#undef rewind +#define rewind(f) win32_rewind(f) +#define tmpfile() win32_tmpfile() +#define abort() win32_abort() +#define fstat(fd,bufptr) win32_fstat(fd,bufptr) +#define stat(pth,bufptr) win32_stat(pth,bufptr) +#define longpath(pth) win32_longpath(pth) +#define rename(old,new) win32_rename(old,new) +#define setmode(fd,mode) win32_setmode(fd,mode) +#define lseek(fd,offset,orig) win32_lseek(fd,offset,orig) +#define tell(fd) win32_tell(fd) +#define dup(fd) win32_dup(fd) +#define dup2(fd1,fd2) win32_dup2(fd1,fd2) +#define open win32_open +#define close(fd) win32_close(fd) +#define eof(fd) win32_eof(fd) +#define read(fd,b,s) win32_read(fd,b,s) +#define write(fd,b,s) win32_write(fd,b,s) +#define _open_osfhandle win32_open_osfhandle +#define _get_osfhandle win32_get_osfhandle +#define spawnvp win32_spawnvp +#define mkdir win32_mkdir +#define rmdir win32_rmdir +#define chdir win32_chdir +#define flock(fd,o) win32_flock(fd,o) +#define execv win32_execv +#define execvp win32_execvp +#define perror win32_perror +#define setbuf win32_setbuf +#undef setvbuf +#define setvbuf win32_setvbuf +#undef flushall +#define flushall win32_flushall +#undef fcloseall +#define fcloseall win32_fcloseall +#undef fgets +#define fgets win32_fgets +#undef gets +#define gets win32_gets +#undef fgetc +#define fgetc win32_fgetc +#undef putc +#define putc win32_putc +#undef puts +#define puts win32_puts +#undef getchar +#define getchar win32_getchar +#undef putchar +#define putchar win32_putchar +#define access(p,m) win32_access(p,m) +#define chmod(p,m) win32_chmod(p,m) + + +#if !defined(MYMALLOC) || !defined(PERL_CORE) +#undef malloc +#undef calloc +#undef realloc +#undef free +#define malloc win32_malloc +#define calloc win32_calloc +#define realloc win32_realloc +#define free win32_free +#endif + +#define pipe(fd) win32_pipe((fd), 512, O_BINARY) +#define pause() win32_sleep((32767L << 16) + 32767) +#define sleep win32_sleep +#define times win32_times +#define alarm win32_alarm +#define ioctl win32_ioctl +#define link win32_link +#define unlink win32_unlink +#define utime win32_utime +#define uname win32_uname +#define wait win32_wait +#define waitpid win32_waitpid +#define kill win32_kill + +#define opendir win32_opendir +#define readdir win32_readdir +#define telldir win32_telldir +#define seekdir win32_seekdir +#define rewinddir win32_rewinddir +#define closedir win32_closedir +#define os_id win32_os_id +#define getpid win32_getpid + +#undef crypt +#define crypt(t,s) win32_crypt(t,s) + +#ifndef USE_WIN32_RTL_ENV +#undef getenv +#define getenv win32_getenv +#undef putenv +#define putenv win32_putenv +#endif + +#endif /* WIN32IO_IS_STDIO */ +#endif /* WIN32IOP_H */ + diff --git a/wince/win32thread.c b/wince/win32thread.c new file mode 100644 index 0000000..3935447 --- /dev/null +++ b/wince/win32thread.c @@ -0,0 +1,121 @@ +// Time-stamp: <01/08/01 21:00:29 keuchel@w2k> + +#include "EXTERN.h" +#include "perl.h" + +#if defined(PERL_OBJECT) +#define NO_XSLOCKS +extern CPerlObj* pPerl; +#include "XSUB.h" +#endif + +#ifdef USE_DECLSPEC_THREAD +__declspec(thread) void *PL_current_context = NULL; +#endif + +void +Perl_set_context(void *t) +{ +#if defined(USE_THREADS) || defined(USE_ITHREADS) +# ifdef USE_DECLSPEC_THREAD + Perl_current_context = t; +# else + DWORD err = GetLastError(); + TlsSetValue(PL_thr_key,t); + SetLastError(err); +# endif +#endif +} + +void * +Perl_get_context(void) +{ +#if defined(USE_THREADS) || defined(USE_ITHREADS) +# ifdef USE_DECLSPEC_THREAD + return Perl_current_context; +# else + DWORD err = GetLastError(); + void *result = TlsGetValue(PL_thr_key); + SetLastError(err); + return result; +# endif +#else + return NULL; +#endif +} + +#ifdef USE_THREADS +void +Perl_init_thread_intern(struct perl_thread *athr) +{ +#ifndef USE_DECLSPEC_THREAD + + /* + * Initialize port-specific per-thread data in thr->i + * as only things we have there are just static areas for + * return values we don't _need_ to do anything but + * this is good practice: + */ + memset(&athr->i,0,sizeof(athr->i)); + +#endif +} + +void +Perl_set_thread_self(struct perl_thread *thr) +{ + /* Set thr->self. GetCurrentThread() retrurns a pseudo handle, need + this to convert it into a handle another thread can use. + */ + DuplicateHandle(GetCurrentProcess(), + GetCurrentThread(), + GetCurrentProcess(), + &thr->self, + 0, + FALSE, + DUPLICATE_SAME_ACCESS); +} + +int +Perl_thread_create(struct perl_thread *thr, thread_func_t *fn) +{ + DWORD junk; + unsigned long th; + + DEBUG_S(PerlIO_printf(Perl_debug_log, + "%p: create OS thread\n", thr)); +#ifdef USE_RTL_THREAD_API + /* See comment about USE_RTL_THREAD_API in win32thread.h */ +#if defined(__BORLANDC__) + th = _beginthreadNT(fn, /* start address */ + 0, /* stack size */ + (void *)thr, /* parameters */ + (void *)NULL, /* security attrib */ + 0, /* creation flags */ + (unsigned long *)&junk); /* tid */ + if (th == (unsigned long)-1) + th = 0; +#elif defined(_MSC_VER_) + th = _beginthreadex((void *)NULL, /* security attrib */ + 0, /* stack size */ + fn, /* start address */ + (void*)thr, /* parameters */ + 0, /* creation flags */ + (unsigned *)&junk); /* tid */ +#else /* compilers using CRTDLL.DLL only have _beginthread() */ + th = _beginthread(fn, /* start address */ + 0, /* stack size */ + (void*)thr); /* parameters */ + if (th == (unsigned long)-1) + th = 0; +#endif + thr->self = (HANDLE)th; +#else /* !USE_RTL_THREAD_API */ + thr->self = CreateThread(NULL, 0, fn, (void*)thr, 0, &junk); +#endif /* !USE_RTL_THREAD_API */ + DEBUG_S(PerlIO_printf(Perl_debug_log, + "%p: OS thread = %p, id=%ld\n", thr, thr->self, junk)); + return thr->self ? 0 : -1; +} +#endif + diff --git a/wince/win32thread.h b/wince/win32thread.h new file mode 100644 index 0000000..c930bfa --- /dev/null +++ b/wince/win32thread.h @@ -0,0 +1,202 @@ +// Time-stamp: <01/08/01 21:00:36 keuchel@w2k> + +#ifndef _WIN32THREAD_H +#define _WIN32THREAD_H + +#include "win32.h" + +typedef struct win32_cond { LONG waiters; HANDLE sem; } perl_cond; +typedef DWORD perl_key; +typedef HANDLE perl_os_thread; + +#ifndef DONT_USE_CRITICAL_SECTION + +/* Critical Sections used instead of mutexes: lightweight, + * but can't be communicated to child processes, and can't get + * HANDLE to it for use elsewhere. + */ +typedef CRITICAL_SECTION perl_mutex; +#define MUTEX_INIT(m) InitializeCriticalSection(m) +#define MUTEX_LOCK(m) EnterCriticalSection(m) +#define MUTEX_UNLOCK(m) LeaveCriticalSection(m) +#define MUTEX_DESTROY(m) DeleteCriticalSection(m) + +#else + +typedef HANDLE perl_mutex; +# define MUTEX_INIT(m) \ + STMT_START { \ + if ((*(m) = CreateMutex(NULL,FALSE,NULL)) == NULL) \ + Perl_croak_nocontext("panic: MUTEX_INIT"); \ + } STMT_END + +# define MUTEX_LOCK(m) \ + STMT_START { \ + if (WaitForSingleObject(*(m),INFINITE) == WAIT_FAILED) \ + Perl_croak_nocontext("panic: MUTEX_LOCK"); \ + } STMT_END + +# define MUTEX_UNLOCK(m) \ + STMT_START { \ + if (ReleaseMutex(*(m)) == 0) \ + Perl_croak_nocontext("panic: MUTEX_UNLOCK"); \ + } STMT_END + +# define MUTEX_DESTROY(m) \ + STMT_START { \ + if (CloseHandle(*(m)) == 0) \ + Perl_croak_nocontext("panic: MUTEX_DESTROY"); \ + } STMT_END + +#endif + +/* These macros assume that the mutex associated with the condition + * will always be held before COND_{SIGNAL,BROADCAST,WAIT,DESTROY}, + * so there's no separate mutex protecting access to (c)->waiters + */ +#define COND_INIT(c) \ + STMT_START { \ + (c)->waiters = 0; \ + (c)->sem = CreateSemaphore(NULL,0,LONG_MAX,NULL); \ + if ((c)->sem == NULL) \ + Perl_croak_nocontext("panic: COND_INIT (%ld)",GetLastError()); \ + } STMT_END + +#define COND_SIGNAL(c) \ + STMT_START { \ + if ((c)->waiters > 0 && \ + ReleaseSemaphore((c)->sem,1,NULL) == 0) \ + Perl_croak_nocontext("panic: COND_SIGNAL (%ld)",GetLastError()); \ + } STMT_END + +#define COND_BROADCAST(c) \ + STMT_START { \ + if ((c)->waiters > 0 && \ + ReleaseSemaphore((c)->sem,(c)->waiters,NULL) == 0) \ + Perl_croak_nocontext("panic: COND_BROADCAST (%ld)",GetLastError());\ + } STMT_END + +#define COND_WAIT(c, m) \ + STMT_START { \ + (c)->waiters++; \ + MUTEX_UNLOCK(m); \ + /* Note that there's no race here, since a \ + * COND_BROADCAST() on another thread will have seen the\ + * right number of waiters (i.e. including this one) */ \ + if (WaitForSingleObject((c)->sem,INFINITE)==WAIT_FAILED)\ + Perl_croak_nocontext("panic: COND_WAIT (%ld)",GetLastError()); \ + /* XXX there may be an inconsequential race here */ \ + MUTEX_LOCK(m); \ + (c)->waiters--; \ + } STMT_END + +#define COND_DESTROY(c) \ + STMT_START { \ + (c)->waiters = 0; \ + if (CloseHandle((c)->sem) == 0) \ + Perl_croak_nocontext("panic: COND_DESTROY (%ld)",GetLastError()); \ + } STMT_END + +#define DETACH(t) \ + STMT_START { \ + if (CloseHandle((t)->self) == 0) { \ + MUTEX_UNLOCK(&(t)->mutex); \ + Perl_croak_nocontext("panic: DETACH"); \ + } \ + } STMT_END + + +#define THREAD_CREATE(t, f) Perl_thread_create(t, f) +#define THREAD_POST_CREATE(t) NOOP + +/* XXX Docs mention that the RTL versions of thread creation routines + * should be used, but that advice only seems applicable when the RTL + * is not in a DLL. RTL DLLs in both Borland and VC seem to do all of + * the init/deinit required upon DLL_THREAD_ATTACH/DETACH. So we seem + * to be completely safe using straight Win32 API calls, rather than + * the much braindamaged RTL calls. + * + * _beginthread() in the RTLs call CloseHandle() just after the thread + * function returns, which means: 1) we have a race on our hands + * 2) it is impossible to implement join() semantics. + * + * IOW, do *NOT* turn on USE_RTL_THREAD_API! It is here + * for experimental purposes only. GSAR 98-01-02 + */ +#ifdef USE_RTL_THREAD_API +# include +# if defined(__BORLANDC__) + /* Borland RTL doesn't allow a return value from thread function! */ +# define THREAD_RET_TYPE void _USERENTRY +# define THREAD_RET_CAST(p) ((void)(thr->i.retv = (void *)(p))) +# elif defined (_MSC_VER) +# define THREAD_RET_TYPE unsigned __stdcall +# define THREAD_RET_CAST(p) ((unsigned)(p)) +# else + /* CRTDLL.DLL doesn't allow a return value from thread function! */ +# define THREAD_RET_TYPE void __cdecl +# define THREAD_RET_CAST(p) ((void)(thr->i.retv = (void *)(p))) +# endif +#else /* !USE_RTL_THREAD_API */ +# define THREAD_RET_TYPE DWORD WINAPI +# define THREAD_RET_CAST(p) ((DWORD)(p)) +#endif /* !USE_RTL_THREAD_API */ + +typedef THREAD_RET_TYPE thread_func_t(void *); + + +START_EXTERN_C + +#if defined(PERLDLL) && defined(USE_DECLSPEC_THREAD) && (!defined(__BORLANDC__) || defined(_DLL)) +extern __declspec(thread) void *PL_current_context; +#define PERL_SET_CONTEXT(t) (PL_current_context = t) +#define PERL_GET_CONTEXT PL_current_context +#else +#define PERL_GET_CONTEXT Perl_get_context() +#define PERL_SET_CONTEXT(t) Perl_set_context(t) +#endif + +#if defined(USE_THREADS) +struct perl_thread; +int Perl_thread_create (struct perl_thread *thr, thread_func_t *fn); +void Perl_set_thread_self (struct perl_thread *thr); +void Perl_init_thread_intern (struct perl_thread *t); + +#define SET_THREAD_SELF(thr) Perl_set_thread_self(thr) + +#endif /* USE_THREADS */ + +END_EXTERN_C + +#define INIT_THREADS NOOP +#define ALLOC_THREAD_KEY \ + STMT_START { \ + if ((PL_thr_key = TlsAlloc()) == TLS_OUT_OF_INDEXES) { \ + fprintf(stderr,"panic: TlsAlloc"); \ + exit(1); \ + } \ + } STMT_END + +#if defined(USE_RTL_THREAD_API) && !defined(_MSC_VER) +#define JOIN(t, avp) \ + STMT_START { \ + if ((WaitForSingleObject((t)->self,INFINITE) == WAIT_FAILED) \ + || (GetExitCodeThread((t)->self,(LPDWORD)(avp)) == 0) \ + || (CloseHandle((t)->self) == 0)) \ + Perl_croak_nocontext("panic: JOIN"); \ + *avp = (AV *)((t)->i.retv); \ + } STMT_END +#else /* !USE_RTL_THREAD_API || _MSC_VER */ +#define JOIN(t, avp) \ + STMT_START { \ + if ((WaitForSingleObject((t)->self,INFINITE) == WAIT_FAILED) \ + || (GetExitCodeThread((t)->self,(LPDWORD)(avp)) == 0) \ + || (CloseHandle((t)->self) == 0)) \ + Perl_croak_nocontext("panic: JOIN"); \ + } STMT_END +#endif /* !USE_RTL_THREAD_API || _MSC_VER */ + +#define YIELD Sleep(0) + +#endif /* _WIN32THREAD_H */ + diff --git a/wince/wince.c b/wince/wince.c new file mode 100644 index 0000000..c2cda81 --- /dev/null +++ b/wince/wince.c @@ -0,0 +1,1616 @@ +/* WINCE.C - stuff for Windows CE + * + * Time-stamp: <01/08/01 19:29:57 keuchel@w2k> + * + * You may distribute under the terms of either the GNU General Public + * License or the Artistic License, as specified in the README file. + */ + +#define WIN32_LEAN_AND_MEAN +#define WIN32IO_IS_STDIO +#include + +#define PERLIO_NOT_STDIO 0 + +#if !defined(PERLIO_IS_STDIO) && !defined(USE_SFIO) +#define PerlIO FILE +#endif + +#define wince_private +#include "errno.h" + +#include "EXTERN.h" +#include "perl.h" + +#define NO_XSLOCKS +#define PERL_NO_GET_CONTEXT +#include "XSUB.h" + +#include "win32iop.h" +#include +#include +#include +#include + +#define perl +#include "celib_defs.h" +#include "cewin32.h" +#include "cecrt.h" +#include "cewin32_defs.h" +#include "cecrt_defs.h" + +#ifdef PALM_SIZE +#include "stdio-palmsize.h" +#endif + +#define EXECF_EXEC 1 +#define EXECF_SPAWN 2 +#define EXECF_SPAWN_NOWAIT 3 + +#if defined(PERL_IMPLICIT_SYS) +# undef win32_get_privlib +# define win32_get_privlib g_win32_get_privlib +# undef win32_get_sitelib +# define win32_get_sitelib g_win32_get_sitelib +# undef win32_get_vendorlib +# define win32_get_vendorlib g_win32_get_vendorlib +# undef do_spawn +# define do_spawn g_do_spawn +# undef getlogin +# define getlogin g_getlogin +#endif + +#if defined(PERL_OBJECT) +# undef do_aspawn +# define do_aspawn g_do_aspawn +# undef Perl_do_exec +# define Perl_do_exec g_do_exec +#endif + +static long filetime_to_clock(PFILETIME ft); +static BOOL filetime_from_time(PFILETIME ft, time_t t); +static char * get_emd_part(SV **leading, char *trailing, ...); +static char * win32_get_xlib(const char *pl, const char *xlib, + const char *libname); + +START_EXTERN_C +HANDLE w32_perldll_handle = INVALID_HANDLE_VALUE; +char w32_module_name[MAX_PATH+1]; +END_EXTERN_C + +static DWORD w32_platform = (DWORD)-1; + +int +IsWin95(void) +{ + return (win32_os_id() == VER_PLATFORM_WIN32_WINDOWS); +} + +int +IsWinNT(void) +{ + return (win32_os_id() == VER_PLATFORM_WIN32_NT); +} + +int +IsWinCE(void) +{ + return (win32_os_id() == VER_PLATFORM_WIN32_CE); +} + +EXTERN_C void +set_w32_module_name(void) +{ + char* ptr; + XCEGetModuleFileNameA((HMODULE)((w32_perldll_handle == INVALID_HANDLE_VALUE) + ? XCEGetModuleHandleA(NULL) + : w32_perldll_handle), + w32_module_name, sizeof(w32_module_name)); + + /* normalize to forward slashes */ + ptr = w32_module_name; + while (*ptr) { + if (*ptr == '\\') + *ptr = '/'; + ++ptr; + } +} + +/* *svp (if non-NULL) is expected to be POK (valid allocated SvPVX(*svp)) */ +static char* +get_regstr_from(HKEY hkey, const char *valuename, SV **svp) +{ + /* Retrieve a REG_SZ or REG_EXPAND_SZ from the registry */ + HKEY handle; + DWORD type; + const char *subkey = "Software\\Perl"; + char *str = Nullch; + long retval; + + retval = XCERegOpenKeyExA(hkey, subkey, 0, KEY_READ, &handle); + if (retval == ERROR_SUCCESS) { + DWORD datalen; + retval = XCERegQueryValueExA(handle, valuename, 0, &type, NULL, &datalen); + if (retval == ERROR_SUCCESS && type == REG_SZ) { + dTHXo; + if (!*svp) + *svp = sv_2mortal(newSVpvn("",0)); + SvGROW(*svp, datalen); + retval = XCERegQueryValueExA(handle, valuename, 0, NULL, + (PBYTE)SvPVX(*svp), &datalen); + if (retval == ERROR_SUCCESS) { + str = SvPVX(*svp); + SvCUR_set(*svp,datalen-1); + } + } + RegCloseKey(handle); + } + return str; +} + +/* *svp (if non-NULL) is expected to be POK (valid allocated SvPVX(*svp)) */ +static char* +get_regstr(const char *valuename, SV **svp) +{ + char *str = get_regstr_from(HKEY_CURRENT_USER, valuename, svp); + if (!str) + str = get_regstr_from(HKEY_LOCAL_MACHINE, valuename, svp); + return str; +} + +/* *prev_pathp (if non-NULL) is expected to be POK (valid allocated SvPVX(sv)) */ +static char * +get_emd_part(SV **prev_pathp, char *trailing_path, ...) +{ + char base[10]; + va_list ap; + char mod_name[MAX_PATH+1]; + char *ptr; + char *optr; + char *strip; + int oldsize, newsize; + STRLEN baselen; + + va_start(ap, trailing_path); + strip = va_arg(ap, char *); + + sprintf(base, "%d.%d", (int)PERL_REVISION, (int)PERL_VERSION); + baselen = strlen(base); + + if (!*w32_module_name) { + set_w32_module_name(); + } + strcpy(mod_name, w32_module_name); + ptr = strrchr(mod_name, '/'); + while (ptr && strip) { + /* look for directories to skip back */ + optr = ptr; + *ptr = '\0'; + ptr = strrchr(mod_name, '/'); + /* avoid stripping component if there is no slash, + * or it doesn't match ... */ + if (!ptr || stricmp(ptr+1, strip) != 0) { + /* ... but not if component matches m|5\.$patchlevel.*| */ + if (!ptr || !(*strip == '5' && *(ptr+1) == '5' + && strncmp(strip, base, baselen) == 0 + && strncmp(ptr+1, base, baselen) == 0)) + { + *optr = '/'; + ptr = optr; + } + } + strip = va_arg(ap, char *); + } + if (!ptr) { + ptr = mod_name; + *ptr++ = '.'; + *ptr = '/'; + } + va_end(ap); + strcpy(++ptr, trailing_path); + + /* only add directory if it exists */ + if (XCEGetFileAttributesA(mod_name) != (DWORD) -1) { + /* directory exists */ + dTHXo; + if (!*prev_pathp) + *prev_pathp = sv_2mortal(newSVpvn("",0)); + sv_catpvn(*prev_pathp, ";", 1); + sv_catpv(*prev_pathp, mod_name); + return SvPVX(*prev_pathp); + } + + return Nullch; +} + +char * +win32_get_privlib(const char *pl) +{ + dTHXo; + char *stdlib = "lib"; + char buffer[MAX_PATH+1]; + SV *sv = Nullsv; + + /* $stdlib = $HKCU{"lib-$]"} || $HKLM{"lib-$]"} || $HKCU{"lib"} || $HKLM{"lib"} || ""; */ + sprintf(buffer, "%s-%s", stdlib, pl); + if (!get_regstr(buffer, &sv)) + (void)get_regstr(stdlib, &sv); + + /* $stdlib .= ";$EMD/../../lib" */ + return get_emd_part(&sv, stdlib, ARCHNAME, "bin", Nullch); +} + +static char * +win32_get_xlib(const char *pl, const char *xlib, const char *libname) +{ + dTHXo; + char regstr[40]; + char pathstr[MAX_PATH+1]; + DWORD datalen; + int len, newsize; + SV *sv1 = Nullsv; + SV *sv2 = Nullsv; + + /* $HKCU{"$xlib-$]"} || $HKLM{"$xlib-$]"} . ---; */ + sprintf(regstr, "%s-%s", xlib, pl); + (void)get_regstr(regstr, &sv1); + + /* $xlib .= + * ";$EMD/" . ((-d $EMD/../../../$]) ? "../../.." : "../.."). "/$libname/$]/lib"; */ + sprintf(pathstr, "%s/%s/lib", libname, pl); + (void)get_emd_part(&sv1, pathstr, ARCHNAME, "bin", pl, Nullch); + + /* $HKCU{$xlib} || $HKLM{$xlib} . ---; */ + (void)get_regstr(xlib, &sv2); + + /* $xlib .= + * ";$EMD/" . ((-d $EMD/../../../$]) ? "../../.." : "../.."). "/$libname/lib"; */ + sprintf(pathstr, "%s/lib", libname); + (void)get_emd_part(&sv2, pathstr, ARCHNAME, "bin", pl, Nullch); + + if (!sv1 && !sv2) + return Nullch; + if (!sv1) + return SvPVX(sv2); + if (!sv2) + return SvPVX(sv1); + + sv_catpvn(sv1, ";", 1); + sv_catsv(sv1, sv2); + + return SvPVX(sv1); +} + +char * +win32_get_sitelib(const char *pl) +{ + return win32_get_xlib(pl, "sitelib", "site"); +} + +#ifndef PERL_VENDORLIB_NAME +# define PERL_VENDORLIB_NAME "vendor" +#endif + +char * +win32_get_vendorlib(const char *pl) +{ + return win32_get_xlib(pl, "vendorlib", PERL_VENDORLIB_NAME); +} + +#if !defined(PERL_IMPLICIT_SYS) +/* since the current process environment is being updated in util.c + * the library functions will get the correct environment + */ +PerlIO * +Perl_my_popen(pTHX_ char *cmd, char *mode) +{ + printf("popen(%s)\n", cmd); + + Perl_croak(aTHX_ PL_no_func, "popen"); + return NULL; +} + +long +Perl_my_pclose(pTHX_ PerlIO *fp) +{ + Perl_croak(aTHX_ PL_no_func, "pclose"); + return -1; +} +#endif + +DllExport unsigned long +win32_os_id(void) +{ + static OSVERSIONINFOA osver; + + if (osver.dwPlatformId != w32_platform) { + memset(&osver, 0, sizeof(OSVERSIONINFOA)); + osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA); + XCEGetVersionExA(&osver); + w32_platform = osver.dwPlatformId; + } + return (unsigned long)w32_platform; +} + +DllExport int +win32_getpid(void) +{ + return xcegetpid(); +} + +bool +Perl_do_exec(pTHX_ char *cmd) +{ + Perl_croak_nocontext("exec() unimplemented on this platform"); + return FALSE; +} + +DllExport int +win32_pipe(int *pfd, unsigned int size, int mode) +{ + Perl_croak(aTHX_ PL_no_func, "pipe"); + return -1; +} + +DllExport int +win32_times(struct tms *timebuf) +{ + Perl_croak(aTHX_ PL_no_func, "times"); + return -1; +} + +DllExport char *** +win32_environ(void) +{ + return (&(environ)); +} + +DllExport DIR * +win32_opendir(char *filename) +{ + return opendir(filename); +} + +DllExport struct direct * +win32_readdir(DIR *dirp) +{ + return readdir(dirp); +} + +DllExport long +win32_telldir(DIR *dirp) +{ + Perl_croak(aTHX_ PL_no_func, "telldir"); + return -1; +} + +DllExport void +win32_seekdir(DIR *dirp, long loc) +{ + Perl_croak(aTHX_ PL_no_func, "seekdir"); +} + +DllExport void +win32_rewinddir(DIR *dirp) +{ + Perl_croak(aTHX_ PL_no_func, "rewinddir"); +} + +DllExport int +win32_closedir(DIR *dirp) +{ + closedir(dirp); + return 0; +} + +DllExport int +win32_kill(int pid, int sig) +{ + Perl_croak(aTHX_ PL_no_func, "kill"); + return -1; +} + +DllExport unsigned int +win32_sleep(unsigned int t) +{ + return xcesleep(t); +} + +DllExport int +win32_stat(const char *path, struct stat *sbuf) +{ + return xcestat(path, sbuf); +} + +DllExport char * +win32_longpath(char *path) +{ + return path; +} + +#ifndef USE_WIN32_RTL_ENV + +DllExport char * +win32_getenv(const char *name) +{ + return xcegetenv(name); +} + +DllExport int +win32_putenv(const char *name) +{ + return xceputenv(name); +} + +#endif + +static long +filetime_to_clock(PFILETIME ft) +{ + __int64 qw = ft->dwHighDateTime; + qw <<= 32; + qw |= ft->dwLowDateTime; + qw /= 10000; /* File time ticks at 0.1uS, clock at 1mS */ + return (long) qw; +} + +/* fix utime() so it works on directories in NT */ +static BOOL +filetime_from_time(PFILETIME pFileTime, time_t Time) +{ + struct tm *pTM = localtime(&Time); + SYSTEMTIME SystemTime; + FILETIME LocalTime; + + if (pTM == NULL) + return FALSE; + + SystemTime.wYear = pTM->tm_year + 1900; + SystemTime.wMonth = pTM->tm_mon + 1; + SystemTime.wDay = pTM->tm_mday; + SystemTime.wHour = pTM->tm_hour; + SystemTime.wMinute = pTM->tm_min; + SystemTime.wSecond = pTM->tm_sec; + SystemTime.wMilliseconds = 0; + + return SystemTimeToFileTime(&SystemTime, &LocalTime) && + LocalFileTimeToFileTime(&LocalTime, pFileTime); +} + +DllExport int +win32_unlink(const char *filename) +{ + return xceunlink(filename); +} + +DllExport int +win32_utime(const char *filename, struct utimbuf *times) +{ + return xceutime(filename, (struct _utimbuf *) times); +} + +DllExport int +win32_uname(struct utsname *name) +{ + struct hostent *hep; + STRLEN nodemax = sizeof(name->nodename)-1; + OSVERSIONINFOA osver; + + memset(&osver, 0, sizeof(OSVERSIONINFOA)); + osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA); + if (XCEGetVersionExA(&osver)) { + /* sysname */ + switch (osver.dwPlatformId) { + case VER_PLATFORM_WIN32_CE: + strcpy(name->sysname, "Windows CE"); + break; + case VER_PLATFORM_WIN32_WINDOWS: + strcpy(name->sysname, "Windows"); + break; + case VER_PLATFORM_WIN32_NT: + strcpy(name->sysname, "Windows NT"); + break; + case VER_PLATFORM_WIN32s: + strcpy(name->sysname, "Win32s"); + break; + default: + strcpy(name->sysname, "Win32 Unknown"); + break; + } + + /* release */ + sprintf(name->release, "%d.%d", + osver.dwMajorVersion, osver.dwMinorVersion); + + /* version */ + sprintf(name->version, "Build %d", + osver.dwPlatformId == VER_PLATFORM_WIN32_NT + ? osver.dwBuildNumber : (osver.dwBuildNumber & 0xffff)); + if (osver.szCSDVersion[0]) { + char *buf = name->version + strlen(name->version); + sprintf(buf, " (%s)", osver.szCSDVersion); + } + } + else { + *name->sysname = '\0'; + *name->version = '\0'; + *name->release = '\0'; + } + + /* nodename */ + hep = win32_gethostbyname("localhost"); + if (hep) { + STRLEN len = strlen(hep->h_name); + if (len <= nodemax) { + strcpy(name->nodename, hep->h_name); + } + else { + strncpy(name->nodename, hep->h_name, nodemax); + name->nodename[nodemax] = '\0'; + } + } + else { + DWORD sz = nodemax; + if (!XCEGetComputerNameA(name->nodename, &sz)) + *name->nodename = '\0'; + } + + /* machine (architecture) */ + { + SYSTEM_INFO info; + char *arch; + GetSystemInfo(&info); + +#if defined(__BORLANDC__) || defined(__MINGW32__) + switch (info.u.s.wProcessorArchitecture) { +#else + switch (info.wProcessorArchitecture) { +#endif + case PROCESSOR_ARCHITECTURE_INTEL: + arch = "x86"; break; + case PROCESSOR_ARCHITECTURE_MIPS: + arch = "mips"; break; + case PROCESSOR_ARCHITECTURE_ALPHA: + arch = "alpha"; break; + case PROCESSOR_ARCHITECTURE_PPC: + arch = "ppc"; break; + case PROCESSOR_ARCHITECTURE_ARM: + arch = "arm"; break; + case PROCESSOR_HITACHI_SH3: + arch = "sh3"; break; + case PROCESSOR_SHx_SH3: + arch = "sh3"; break; + + default: + arch = "unknown"; break; + } + strcpy(name->machine, arch); + } + return 0; +} + +#ifndef PERL_OBJECT + +static UINT timerid = 0; + +static VOID CALLBACK TimerProc(HWND win, UINT msg, UINT id, DWORD time) +{ + dTHXo; + KillTimer(NULL,timerid); + timerid=0; + sighandler(14); +} +#endif /* !PERL_OBJECT */ + +DllExport unsigned int +win32_alarm(unsigned int sec) +{ +#ifndef PERL_OBJECT + /* + * the 'obvious' implentation is SetTimer() with a callback + * which does whatever receiving SIGALRM would do + * we cannot use SIGALRM even via raise() as it is not + * one of the supported codes in + * + * Snag is unless something is looking at the message queue + * nothing happens :-( + */ + dTHXo; + if (sec) + { + timerid = SetTimer(NULL,timerid,sec*1000,(TIMERPROC)TimerProc); + if (!timerid) + Perl_croak_nocontext("Cannot set timer"); + } + else + { + if (timerid) + { + KillTimer(NULL,timerid); + timerid=0; + } + } +#endif /* !PERL_OBJECT */ + return 0; +} + +#ifdef HAVE_DES_FCRYPT +extern char * des_fcrypt(const char *txt, const char *salt, char *cbuf); +#endif + +DllExport char * +win32_crypt(const char *txt, const char *salt) +{ + dTHXo; +#ifdef HAVE_DES_FCRYPT + dTHR; + return des_fcrypt(txt, salt, w32_crypt_buffer); +#else + Perl_croak(aTHX_ "The crypt() function is unimplemented due to excessive paranoia."); + return Nullch; +#endif +} + +/* C doesn't like repeat struct definitions */ + +#if defined(USE_FIXED_OSFHANDLE) || defined(PERL_MSVCRT_READFIX) + +#ifndef _CRTIMP +#define _CRTIMP __declspec(dllimport) +#endif + +/* + * Control structure for lowio file handles + */ +typedef struct { + long osfhnd; /* underlying OS file HANDLE */ + char osfile; /* attributes of file (e.g., open in text mode?) */ + char pipech; /* one char buffer for handles opened on pipes */ + int lockinitflag; + CRITICAL_SECTION lock; +} ioinfo; + + +/* + * Array of arrays of control structures for lowio files. + */ +EXTERN_C _CRTIMP ioinfo* __pioinfo[]; + +/* + * Definition of IOINFO_L2E, the log base 2 of the number of elements in each + * array of ioinfo structs. + */ +#define IOINFO_L2E 5 + +/* + * Definition of IOINFO_ARRAY_ELTS, the number of elements in ioinfo array + */ +#define IOINFO_ARRAY_ELTS (1 << IOINFO_L2E) + +/* + * Access macros for getting at an ioinfo struct and its fields from a + * file handle + */ +#define _pioinfo(i) (__pioinfo[(i) >> IOINFO_L2E] + ((i) & (IOINFO_ARRAY_ELTS - 1))) +#define _osfhnd(i) (_pioinfo(i)->osfhnd) +#define _osfile(i) (_pioinfo(i)->osfile) +#define _pipech(i) (_pioinfo(i)->pipech) + +#endif + +/* + * redirected io subsystem for all XS modules + * + */ + +DllExport int * +win32_errno(void) +{ + return (&errno); +} + +/* the rest are the remapped stdio routines */ +DllExport FILE * +win32_stderr(void) +{ + return (stderr); +} + +DllExport FILE * +win32_stdin(void) +{ + return (stdin); +} + +DllExport FILE * +win32_stdout() +{ + return (stdout); +} + +DllExport int +win32_ferror(FILE *fp) +{ + return (ferror(fp)); +} + + +DllExport int +win32_feof(FILE *fp) +{ + return (feof(fp)); +} + +/* + * Since the errors returned by the socket error function + * WSAGetLastError() are not known by the library routine strerror + * we have to roll our own. + */ + +DllExport char * +win32_strerror(int e) +{ + return xcestrerror(e); +} + +DllExport void +win32_str_os_error(void *sv, DWORD dwErr) +{ + dTHXo; + + sv_setpvn((SV*)sv, "Error", 5); +} + + +DllExport int +win32_fprintf(FILE *fp, const char *format, ...) +{ + va_list marker; + va_start(marker, format); /* Initialize variable arguments. */ + + return (vfprintf(fp, format, marker)); +} + +DllExport int +win32_printf(const char *format, ...) +{ + va_list marker; + va_start(marker, format); /* Initialize variable arguments. */ + + return (vprintf(format, marker)); +} + +DllExport int +win32_vfprintf(FILE *fp, const char *format, va_list args) +{ + return (vfprintf(fp, format, args)); +} + +DllExport int +win32_vprintf(const char *format, va_list args) +{ + return (vprintf(format, args)); +} + +DllExport size_t +win32_fread(void *buf, size_t size, size_t count, FILE *fp) +{ + return fread(buf, size, count, fp); +} + +DllExport size_t +win32_fwrite(const void *buf, size_t size, size_t count, FILE *fp) +{ + return fwrite(buf, size, count, fp); +} + +DllExport FILE * +win32_fopen(const char *filename, const char *mode) +{ + return xcefopen(filename, mode); +} + +DllExport FILE * +win32_fdopen(int handle, const char *mode) +{ + return palm_fdopen(handle, mode); +} + +DllExport FILE * +win32_freopen(const char *path, const char *mode, FILE *stream) +{ + return xcefreopen(path, mode, stream); +} + +DllExport int +win32_fclose(FILE *pf) +{ + return xcefclose(pf); +} + +DllExport int +win32_fputs(const char *s,FILE *pf) +{ + return fputs(s, pf); +} + +DllExport int +win32_fputc(int c,FILE *pf) +{ + return fputc(c,pf); +} + +DllExport int +win32_ungetc(int c,FILE *pf) +{ + return ungetc(c,pf); +} + +DllExport int +win32_getc(FILE *pf) +{ + return getc(pf); +} + +DllExport int +win32_fileno(FILE *pf) +{ + return palm_fileno(pf); +} + +DllExport void +win32_clearerr(FILE *pf) +{ + clearerr(pf); + return; +} + +DllExport int +win32_fflush(FILE *pf) +{ + return fflush(pf); +} + +DllExport long +win32_ftell(FILE *pf) +{ + return ftell(pf); +} + +DllExport int +win32_fseek(FILE *pf,long offset,int origin) +{ + return fseek(pf, offset, origin); +} + +// fpos_t seems to be int64 on hpc pro! Really stupid. +// But maybe someday there will be such large disks in a hpc... +DllExport int +win32_fgetpos(FILE *pf, fpos_t *p) +{ + return fgetpos(pf, p); +} + +DllExport int +win32_fsetpos(FILE *pf, const fpos_t *p) +{ + return fsetpos(pf, p); +} + +DllExport void +win32_rewind(FILE *pf) +{ + fseek(pf, 0, SEEK_SET); + return; +} + +DllExport FILE* +win32_tmpfile(void) +{ + Perl_croak(aTHX_ PL_no_func, "tmpfile"); + + return NULL; +} + +DllExport void +win32_abort(void) +{ + xceabort(); + + return; +} + +DllExport int +win32_fstat(int fd, struct stat *sbufptr) +{ + return xcefstat(fd, sbufptr); +} + +DllExport int +win32_link(const char *oldname, const char *newname) +{ + Perl_croak(aTHX_ PL_no_func, "link"); + + return -1; +} + +DllExport int +win32_rename(const char *oname, const char *newname) +{ + return xcerename(oname, newname); +} + +DllExport int +win32_setmode(int fd, int mode) +{ + if(mode != O_BINARY) + { + Perl_croak(aTHX_ PL_no_func, "setmode"); + return -1; + } + return 0; +} + +DllExport long +win32_lseek(int fd, long offset, int origin) +{ + return xcelseek(fd, offset, origin); +} + +DllExport long +win32_tell(int fd) +{ + return xcelseek(fd, 0, SEEK_CUR); +} + +DllExport int +win32_open(const char *path, int flag, ...) +{ + int pmode; + va_list ap; + + va_start(ap, flag); + pmode = va_arg(ap, int); + va_end(ap); + + return xceopen(path, flag, pmode); +} + +DllExport int +win32_close(int fd) +{ + return xceclose(fd); +} + +DllExport int +win32_eof(int fd) +{ + Perl_croak(aTHX_ PL_no_func, "eof"); + return -1; +} + +DllExport int +win32_dup(int fd) +{ + Perl_croak(aTHX_ PL_no_func, "dup"); + return -1; +} + +DllExport int +win32_dup2(int fd1,int fd2) +{ + Perl_croak(aTHX_ PL_no_func, "dup2"); + return -1; +} + +DllExport int +win32_read(int fd, void *buf, unsigned int cnt) +{ + return xceread(fd, buf, cnt); +} + +DllExport int +win32_write(int fd, const void *buf, unsigned int cnt) +{ + return xcewrite(fd, (void *) buf, cnt); +} + +DllExport int +win32_mkdir(const char *dir, int mode) +{ + return xcemkdir(dir); +} + +DllExport int +win32_rmdir(const char *dir) +{ + return xcermdir(dir); +} + +DllExport int +win32_chdir(const char *dir) +{ + return xcechdir(dir); +} + +DllExport int +win32_access(const char *path, int mode) +{ + return xceaccess(path, mode); +} + +DllExport int +win32_chmod(const char *path, int mode) +{ + return xcechmod(path, mode); +} + +DllExport void +win32_perror(const char *str) +{ + xceperror(str); +} + +DllExport void +win32_setbuf(FILE *pf, char *buf) +{ + Perl_croak(aTHX_ PL_no_func, "setbuf"); +} + +DllExport int +win32_setvbuf(FILE *pf, char *buf, int type, size_t size) +{ + return setvbuf(pf, buf, type, size); +} + +DllExport int +win32_flushall(void) +{ + return flushall(); +} + +DllExport int +win32_fcloseall(void) +{ + return fcloseall(); +} + +DllExport char* +win32_fgets(char *s, int n, FILE *pf) +{ + return fgets(s, n, pf); +} + +DllExport char* +win32_gets(char *s) +{ + return gets(s); +} + +DllExport int +win32_fgetc(FILE *pf) +{ + return fgetc(pf); +} + +DllExport int +win32_putc(int c, FILE *pf) +{ + return putc(c,pf); +} + +DllExport int +win32_puts(const char *s) +{ + return puts(s); +} + +DllExport int +win32_getchar(void) +{ + return getchar(); +} + +DllExport int +win32_putchar(int c) +{ + return putchar(c); +} + +#ifdef MYMALLOC + +#ifndef USE_PERL_SBRK + +static char *committed = NULL; +static char *base = NULL; +static char *reserved = NULL; +static char *brk = NULL; +static DWORD pagesize = 0; +static DWORD allocsize = 0; + +void * +sbrk(int need) +{ + void *result; + if (!pagesize) + {SYSTEM_INFO info; + GetSystemInfo(&info); + /* Pretend page size is larger so we don't perpetually + * call the OS to commit just one page ... + */ + pagesize = info.dwPageSize << 3; + allocsize = info.dwAllocationGranularity; + } + /* This scheme fails eventually if request for contiguous + * block is denied so reserve big blocks - this is only + * address space not memory ... + */ + if (brk+need >= reserved) + { + DWORD size = 64*1024*1024; + char *addr; + if (committed && reserved && committed < reserved) + { + /* Commit last of previous chunk cannot span allocations */ + addr = (char *) VirtualAlloc(committed,reserved-committed,MEM_COMMIT,PAGE_READWRITE); + if (addr) + committed = reserved; + } + /* Reserve some (more) space + * Note this is a little sneaky, 1st call passes NULL as reserved + * so lets system choose where we start, subsequent calls pass + * the old end address so ask for a contiguous block + */ + addr = (char *) VirtualAlloc(reserved,size,MEM_RESERVE,PAGE_NOACCESS); + if (addr) + { + reserved = addr+size; + if (!base) + base = addr; + if (!committed) + committed = base; + if (!brk) + brk = committed; + } + else + { + return (void *) -1; + } + } + result = brk; + brk += need; + if (brk > committed) + { + DWORD size = ((brk-committed + pagesize -1)/pagesize) * pagesize; + char *addr = (char *) VirtualAlloc(committed,size,MEM_COMMIT,PAGE_READWRITE); + if (addr) + { + committed += size; + } + else + return (void *) -1; + } + return result; +} + +#endif +#endif + +DllExport void* +win32_malloc(size_t size) +{ + return malloc(size); +} + +DllExport void* +win32_calloc(size_t numitems, size_t size) +{ + return calloc(numitems,size); +} + +DllExport void* +win32_realloc(void *block, size_t size) +{ + return realloc(block,size); +} + +DllExport void +win32_free(void *block) +{ + free(block); +} + +DllExport int +win32_execv(const char *cmdname, const char *const *argv) +{ + Perl_croak(aTHX_ PL_no_func, "execv"); + return -1; +} + +DllExport int +win32_execvp(const char *cmdname, const char *const *argv) +{ + Perl_croak(aTHX_ PL_no_func, "execvp"); + return -1; +} + +DllExport void* +win32_dynaload(const char* filename) +{ + dTHXo; + HMODULE hModule; + + hModule = XCELoadLibraryA(filename); + + return hModule; +} + +// this is needed by Cwd.pm... + +static +XS(w32_GetCwd) +{ + dXSARGS; + char buf[MAX_PATH]; + SV *sv = sv_newmortal(); + + xcegetcwd(buf, sizeof(buf)); + + sv_setpv(sv, xcestrdup(buf)); + EXTEND(SP,1); + SvPOK_on(sv); + ST(0) = sv; + XSRETURN(1); +} + +static +XS(w32_SetCwd) +{ + dXSARGS; + + if (items != 1) + Perl_croak(aTHX_ "usage: Win32::SetCwd($cwd)"); + + if (!xcechdir(SvPV_nolen(ST(0)))) + XSRETURN_YES; + + XSRETURN_NO; +} + +static +XS(w32_GetTickCount) +{ + dXSARGS; + DWORD msec = GetTickCount(); + EXTEND(SP,1); + if ((IV)msec > 0) + XSRETURN_IV(msec); + XSRETURN_NV(msec); +} + +static +XS(w32_GetOSVersion) +{ + dXSARGS; + OSVERSIONINFOA osver; + + osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA); + if (!XCEGetVersionExA(&osver)) { + XSRETURN_EMPTY; + } + XPUSHs(newSVpvn(osver.szCSDVersion, strlen(osver.szCSDVersion))); + XPUSHs(newSViv(osver.dwMajorVersion)); + XPUSHs(newSViv(osver.dwMinorVersion)); + XPUSHs(newSViv(osver.dwBuildNumber)); + // WINCE = 3 + XPUSHs(newSViv(osver.dwPlatformId)); + PUTBACK; +} + +static +XS(w32_IsWinNT) +{ + dXSARGS; + EXTEND(SP,1); + XSRETURN_IV(IsWinNT()); +} + +static +XS(w32_IsWin95) +{ + dXSARGS; + EXTEND(SP,1); + XSRETURN_IV(IsWin95()); +} + +static +XS(w32_IsWinCE) +{ + dXSARGS; + EXTEND(SP,1); + XSRETURN_IV(IsWinCE()); +} + +static +XS(w32_GetOemInfo) +{ + dXSARGS; + wchar_t wbuf[126]; + char buf[126]; + + if(SystemParametersInfoW(SPI_GETOEMINFO, sizeof(wbuf), wbuf, FALSE)) + WideCharToMultiByte(CP_ACP, 0, wbuf, -1, buf, sizeof(buf), 0, 0); + else + sprintf(buf, "SystemParametersInfo failed: %d", GetLastError()); + + EXTEND(SP,1); + XSRETURN_PV(buf); +} + +static +XS(w32_Sleep) +{ + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "usage: Win32::Sleep($milliseconds)"); + Sleep(SvIV(ST(0))); + XSRETURN_YES; +} + +static +XS(w32_CopyFile) +{ + dXSARGS; + BOOL bResult; + if (items != 3) + Perl_croak(aTHX_ "usage: Win32::CopyFile($from, $to, $overwrite)"); + + { + char szSourceFile[MAX_PATH+1]; + strcpy(szSourceFile, PerlDir_mapA(SvPV_nolen(ST(0)))); + bResult = XCECopyFileA(szSourceFile, SvPV_nolen(ST(1)), + !SvTRUE(ST(2))); + } + + if (bResult) + XSRETURN_YES; + + XSRETURN_NO; +} + +static +XS(w32_MessageBox) +{ + dXSARGS; + + char *txt; + unsigned int res; + unsigned int flags = MB_OK; + + txt = SvPV_nolen(ST(0)); + + if (items < 1 || items > 2) + Perl_croak(aTHX_ "usage: Win32::MessageBox($txt, [$flags])"); + + if(items == 2) + flags = SvIV(ST(1)); + + res = XCEMessageBoxA(NULL, txt, "Perl", flags); + + XSRETURN_IV(res); +} + +static +XS(w32_GetPowerStatus) +{ + dXSARGS; + + SYSTEM_POWER_STATUS_EX sps; + + if(GetSystemPowerStatusEx(&sps, TRUE) == FALSE) + { + XSRETURN_EMPTY; + } + + XPUSHs(newSViv(sps.ACLineStatus)); + XPUSHs(newSViv(sps.BatteryFlag)); + XPUSHs(newSViv(sps.BatteryLifePercent)); + XPUSHs(newSViv(sps.BatteryLifeTime)); + XPUSHs(newSViv(sps.BatteryFullLifeTime)); + XPUSHs(newSViv(sps.BackupBatteryFlag)); + XPUSHs(newSViv(sps.BackupBatteryLifePercent)); + XPUSHs(newSViv(sps.BackupBatteryLifeTime)); + XPUSHs(newSViv(sps.BackupBatteryFullLifeTime)); + + PUTBACK; +} + +#if UNDER_CE > 200 +static +XS(w32_ShellEx) +{ + dXSARGS; + + char buf[126]; + SHELLEXECUTEINFO si; + char *file, *verb; + wchar_t wfile[MAX_PATH]; + wchar_t wverb[20]; + + if (items != 2) + Perl_croak(aTHX_ "usage: Win32::ShellEx($file, $verb)"); + + file = SvPV_nolen(ST(0)); + verb = SvPV_nolen(ST(1)); + + memset(&si, 0, sizeof(si)); + si.cbSize = sizeof(si); + si.fMask = SEE_MASK_FLAG_NO_UI; + + MultiByteToWideChar(CP_ACP, 0, verb, -1, + wverb, sizeof(wverb)/2); + si.lpVerb = (TCHAR *)wverb; + + MultiByteToWideChar(CP_ACP, 0, file, -1, + wfile, sizeof(wfile)/2); + si.lpFile = (TCHAR *)wfile; + + if(ShellExecuteEx(&si) == FALSE) + { + XSRETURN_NO; + } + XSRETURN_YES; +} +#endif + +void +Perl_init_os_extras(void) +{ + dTHXo; + char *file = __FILE__; + dXSUB_SYS; + + w32_perlshell_tokens = Nullch; + w32_perlshell_items = -1; + w32_fdpid = newAV(); /* XX needs to be in Perl_win32_init()? */ + New(1313, w32_children, 1, child_tab); + w32_num_children = 0; + + newXS("Win32::GetCwd", w32_GetCwd, file); + newXS("Win32::SetCwd", w32_SetCwd, file); + newXS("Win32::GetTickCount", w32_GetTickCount, file); + newXS("Win32::GetOSVersion", w32_GetOSVersion, file); +#if UNDER_CE > 200 + newXS("Win32::ShellEx", w32_ShellEx, file); +#endif + newXS("Win32::IsWinNT", w32_IsWinNT, file); + newXS("Win32::IsWin95", w32_IsWin95, file); + newXS("Win32::IsWinCE", w32_IsWinCE, file); + newXS("Win32::CopyFile", w32_CopyFile, file); + newXS("Win32::Sleep", w32_Sleep, file); + newXS("Win32::MessageBox", w32_MessageBox, file); + newXS("Win32::GetPowerStatus", w32_GetPowerStatus, file); + newXS("Win32::GetOemInfo", w32_GetOemInfo, file); +} + +void +myexit(void) +{ + char buf[126]; + + puts("Hit return"); + fgets(buf, sizeof(buf), stdin); +} + +void +Perl_win32_init(int *argcp, char ***argvp) +{ +#ifdef UNDER_CE + char *p; + + if((p = xcegetenv("PERLDEBUG")) && (p[0] == 'y' || p[0] == 'Y')) + atexit(myexit); +#endif + + MALLOC_INIT; +} + +DllExport int +win32_flock(int fd, int oper) +{ + Perl_croak(aTHX_ PL_no_func, "flock"); + return -1; +} + +DllExport int +win32_waitpid(int pid, int *status, int flags) +{ + Perl_croak(aTHX_ PL_no_func, "waitpid"); + return -1; +} + +DllExport int +win32_wait(int *status) +{ + Perl_croak(aTHX_ PL_no_func, "wait"); + return -1; +} + +int +do_spawn(char *cmd) +{ + return xcesystem(cmd); +} + +int +do_aspawn(void *vreally, void **vmark, void **vsp) +{ + Perl_croak(aTHX_ PL_no_func, "aspawn"); + return -1; +} + +int +wce_reopen_stdout(char *fname) +{ + if(xcefreopen(fname, "w", stdout) == NULL) + return -1; + + return 0; +} + +void +wce_hitreturn() +{ + char buf[126]; + + printf("Hit RETURN"); + fflush(stdout); + fgets(buf, sizeof(buf), stdin); + return; +} + +////////////////////////////////////////////////////////////////////// + +#ifdef PERL_OBJECT +# undef this +# define this pPerl +#endif + +void +win32_argv2utf8(int argc, char** argv) +{ + // do nothing... +} + +void +Perl_sys_intern_init(pTHX) +{ + w32_perlshell_tokens = Nullch; + w32_perlshell_vec = (char**)NULL; + w32_perlshell_items = 0; + w32_fdpid = newAV(); + New(1313, w32_children, 1, child_tab); + w32_num_children = 0; +# ifdef USE_ITHREADS + w32_pseudo_id = 0; + New(1313, w32_pseudo_children, 1, child_tab); + w32_num_pseudo_children = 0; +# endif + +#ifndef UNDER_CE + w32_init_socktype = 0; +#endif +} + +void +Perl_sys_intern_clear(pTHX) +{ + Safefree(w32_perlshell_tokens); + Safefree(w32_perlshell_vec); + /* NOTE: w32_fdpid is freed by sv_clean_all() */ + Safefree(w32_children); +# ifdef USE_ITHREADS + Safefree(w32_pseudo_children); +# endif +} + diff --git a/wince/wince.h b/wince/wince.h new file mode 100644 index 0000000..1b3ee26 --- /dev/null +++ b/wince/wince.h @@ -0,0 +1,133 @@ +// wince.h +// +// Time-stamp: <01/08/01 20:48:08 keuchel@w2k> + +// This file includes extracts from the celib-headers, because +// the celib-headers produces macro conflicts with defines in +// win32iop.h etc + +#ifndef WINCE_H +#define WINCE_H 1 + +#include "celib_defs.h" + +// include local copies of celib headers... +#include "errno.h" +#include "sys/stat.h" +#include "time.h" +#include "cectype.h" + +#define _IOFBF 0x0000 +#define _IOLBF 0x0040 +#define _IONBF 0x0004 + +#if UNDER_CE <= 200 +XCE_EXPORT double xceatof(const char *); +XCE_EXPORT int xcetoupper(int c); +XCE_EXPORT int xcetolower(int c); +#define atof xceatof +#define toupper xcetoupper +#define tolower xcetolower +#else +double atof(const char *); +#endif + +XCE_EXPORT void XCEShowMessageA(const char *fmt, ...); + +#define time xcetime +#define gmtime xcegmtime +#define localtime xcelocaltime +#define asctime xceasctime +//#define utime xceutime +#define futime xcefutime +#define ftime xceftime +#define ctime xcectime +#define gettimeofday xcegettimeofday + +XCE_EXPORT int xcesetuid(uid_t id); +XCE_EXPORT int xceseteuid(uid_t id); +XCE_EXPORT int xcegetuid(); +XCE_EXPORT int xcegeteuid(); + +XCE_EXPORT int xcesetgid(int id); +XCE_EXPORT int xcesetegid(int id); +XCE_EXPORT int xcegetgid(); +XCE_EXPORT int xcegetegid(); + +#define setuid xcesetuid +#define getuid xcegetuid +#define geteuid xcegeteuid +#define seteuid xceseteuid + +#define setgid xcesetgid +#define getgid xcegetgid +#define getegid xcegetegid +#define setegid xcesetegid + +XCE_EXPORT int xcechown(const char *filename, int owner, int group); +#define chown xcechown + +XCE_EXPORT char *xcestrrchr(const char * string, int ch); +#define strrchr xcestrrchr + +XCE_EXPORT void (*xcesignal(int, void (*)(int)))(int); +XCE_EXPORT int xceraise(int); +#define signal xcesignal +#define raise xceraise + +XCE_EXPORT int xcecreat(const char *filename, int pmode); +XCE_EXPORT int xceopen(const char *fname, int mode, ...); +XCE_EXPORT int xceread(int fd, void *buf, int size); +XCE_EXPORT int xcewrite(int fd, void *buf, int size); +XCE_EXPORT int xceclose(int fd); +XCE_EXPORT off_t xcelseek(int fd, int off, int whence); + +XCE_EXPORT char *xcestrupr(char *string); +XCE_EXPORT char *xcestrlwr(char *string); +#define strupr xcestrupr +#define strlwr xcestrlwr + +XCE_EXPORT double xcestrtod(const char *s, char **errorptr); +XCE_EXPORT long xcestrtol(const char *s, char **errorptr, int base); +XCE_EXPORT unsigned long xcestrtoul(const char *s, char **errorptr, int base); +#define strtod xcestrtod +#define strtol xcestrtol +#define strtoul xcestrtoul + +XCE_EXPORT int xcestrnicmp(const char *first, const char *last, size_t count); +#define strnicmp xcestrnicmp + +XCE_EXPORT int xceumask(int mask); +#define umask xceumask + +XCE_EXPORT int xceisatty(int fd); +#define isatty xceisatty + +XCE_EXPORT int xcechsize(int fd, unsigned long size); +#define chsize xcechsize + +XCE_EXPORT char *xcegetlogin(); +#define getlogin xcegetlogin + +XCE_EXPORT DWORD XCEAPI XCEGetModuleFileNameA(HMODULE hModule, LPTSTR lpName, DWORD nSize); +XCE_EXPORT HMODULE XCEAPI XCEGetModuleHandleA(const char *lpName); +XCE_EXPORT FARPROC XCEAPI XCEGetProcAddressA(HMODULE hMod, const char *name); + +////////////////////////////////////////////////////////////////////// + +#define getgid xcegetgid +#define getegid xcegetegid +#define geteuid xcegeteuid +#define setgid xcesetgid + +#define strupr xcestrupr +#define time xcetime + +XCE_EXPORT LPVOID XCEGetEnvironmentStrings(VOID); +XCE_EXPORT BOOL XCEFreeEnvironmentStrings(LPCSTR buf); +#define GetEnvironmentStrings XCEGetEnvironmentStrings +#define FreeEnvironmentStrings XCEFreeEnvironmentStrings + +void wce_hitreturn(); + +#endif diff --git a/wince/wincesck.c b/wince/wincesck.c new file mode 100644 index 0000000..3756ea7 --- /dev/null +++ b/wince/wincesck.c @@ -0,0 +1,513 @@ +// Time-stamp: <01/08/01 21:01:12 keuchel@w2k> + +/* wincesck.c + * + * (c) 1995 Microsoft Corporation. All rights reserved. + * Developed by hip communications inc., http://info.hip.com/info/ + * Portions (c) 1993 Intergraph Corporation. All rights reserved. + * + * You may distribute under the terms of either the GNU General Public + * License or the Artistic License, as specified in the README file. + */ + +// The socket calls use fd functions from celib... + +#define WIN32IO_IS_STDIO +#define WIN32SCK_IS_STDSCK +#define WIN32_LEAN_AND_MEAN + +#ifdef __GNUC__ +#define Win32_Winsock +#endif + +#include + +#define wince_private +#include "errno.h" + +#include "EXTERN.h" +#include "perl.h" + +#if defined(PERL_OBJECT) +#define NO_XSLOCKS +#include "XSUB.h" +#endif + +#include "Win32iop.h" +#include + +#ifndef UNDER_CE +#include +#include +#include +#include +#endif + +#ifdef UNDER_CE + +XCE_EXPORT struct servent *xcegetservbyname(const char *sname, const char *sproto); +XCE_EXPORT struct servent * xcegetservbyport(int aport, const char *sproto); +XCE_EXPORT struct protoent *xcegetprotobyname(const char *name); +XCE_EXPORT struct protoent *xcegetprotobynumber(int number); + +#define getservbyname xcegetservbyname +#define getservbyport xcegetservbyport +#define getprotobyname xcegetprotobyname +#define getprotobynumber xcegetprotobynumber + +// uses fdtab... +#include "cesocket2.h" + +#endif + +#define TO_SOCKET(X) (X) + +#ifdef USE_THREADS +#define StartSockets() \ + STMT_START { \ + if (!wsock_started) \ + start_sockets(); \ + set_socktype(); \ + } STMT_END +#else +#define StartSockets() \ + STMT_START { \ + if (!wsock_started) { \ + start_sockets(); \ + set_socktype(); \ + } \ + } STMT_END +#endif + +#define EndSockets() \ + STMT_START { \ + if (wsock_started) \ + WSACleanup(); \ + } STMT_END + +#define SOCKET_TEST(x, y) \ + STMT_START { \ + StartSockets(); \ + if((x) == (y)) \ + errno = WSAGetLastError(); \ + } STMT_END + +#define SOCKET_TEST_ERROR(x) SOCKET_TEST(x, SOCKET_ERROR) + +static struct servent* win32_savecopyservent(struct servent*d, + struct servent*s, + const char *proto); + +static int wsock_started = 0; + +void +start_sockets(void) +{ + dTHXo; + unsigned short version; + WSADATA retdata; + int ret; + + /* + * initalize the winsock interface and insure that it is + * cleaned up at exit. + */ + version = 0x101; + if(ret = WSAStartup(version, &retdata)) + Perl_croak_nocontext("Unable to locate winsock library!\n"); + if(retdata.wVersion != version) + Perl_croak_nocontext("Could not find version 1.1 of winsock dll\n"); + + /* atexit((void (*)(void)) EndSockets); */ + wsock_started = 1; +} + +void +set_socktype(void) +{ +} + +u_long +win32_htonl(u_long hostlong) +{ + StartSockets(); + return htonl(hostlong); +} + +u_short +win32_htons(u_short hostshort) +{ + StartSockets(); + return htons(hostshort); +} + +u_long +win32_ntohl(u_long netlong) +{ + StartSockets(); + return ntohl(netlong); +} + +u_short +win32_ntohs(u_short netshort) +{ + StartSockets(); + return ntohs(netshort); +} + +SOCKET +win32_socket(int af, int type, int protocol) +{ + StartSockets(); + return xcesocket(af, type, protocol); +} + +SOCKET +win32_accept(SOCKET s, struct sockaddr *addr, int *addrlen) +{ + StartSockets(); + return xceaccept(s, addr, addrlen); +} + +int +win32_bind(SOCKET s, const struct sockaddr *addr, int addrlen) +{ + StartSockets(); + return xcebind(s, addr, addrlen); +} + +int +win32_connect(SOCKET s, const struct sockaddr *addr, int addrlen) +{ + StartSockets(); + return xceconnect(s, addr, addrlen); +} + + +int +win32_getpeername(SOCKET s, struct sockaddr *addr, int *addrlen) +{ + StartSockets(); + return xcegetpeername(s, addr, addrlen); +} + +int +win32_getsockname(SOCKET s, struct sockaddr *addr, int *addrlen) +{ + StartSockets(); + return xcegetsockname(s, addr, addrlen); +} + +int +win32_getsockopt(SOCKET s, int level, int optname, char *optval, int *optlen) +{ + StartSockets(); + return xcegetsockopt(s, level, optname, optval, optlen); +} + +int +win32_ioctlsocket(SOCKET s, long cmd, u_long *argp) +{ + StartSockets(); + return xceioctlsocket(s, cmd, argp); +} + +int +win32_listen(SOCKET s, int backlog) +{ + StartSockets(); + return xcelisten(s, backlog); +} + +int +win32_recv(SOCKET s, char *buf, int len, int flags) +{ + StartSockets(); + return xcerecv(s, buf, len, flags); +} + +int +win32_recvfrom(SOCKET s, char *buf, int len, int flags, + struct sockaddr *from, int *fromlen) +{ + StartSockets(); + return xcerecvfrom(s, buf, len, flags, from, fromlen); +} + +int +win32_select(int nfds, Perl_fd_set* rd, Perl_fd_set* wr, + Perl_fd_set* ex, const struct timeval* timeout) +{ + StartSockets(); + // select not yet fixed + errno = ENOSYS; + return -1; +} + +int +win32_send(SOCKET s, const char *buf, int len, int flags) +{ + StartSockets(); + return xcesend(s, buf, len, flags); +} + +int +win32_sendto(SOCKET s, const char *buf, int len, int flags, + const struct sockaddr *to, int tolen) +{ + StartSockets(); + return xcesendto(s, buf, len, flags, to, tolen); +} + +int +win32_setsockopt(SOCKET s, int level, int optname, + const char *optval, int optlen) +{ + StartSockets(); + return xcesetsockopt(s, level, optname, optval, optlen); +} + +int +win32_shutdown(SOCKET s, int how) +{ + StartSockets(); + return xceshutdown(s, how); +} + +int +win32_closesocket(SOCKET s) +{ + StartSockets(); + return xceclosesocket(s); +} + +struct hostent * +win32_gethostbyaddr(const char *addr, int len, int type) +{ + struct hostent *r; + + SOCKET_TEST(r = gethostbyaddr(addr, len, type), NULL); + return r; +} + +struct hostent * +win32_gethostbyname(const char *name) +{ + struct hostent *r; + + SOCKET_TEST(r = gethostbyname(name), NULL); + return r; +} + +int +win32_gethostname(char *name, int len) +{ + int r; + + SOCKET_TEST_ERROR(r = gethostname(name, len)); + return r; +} + +struct protoent * +win32_getprotobyname(const char *name) +{ + struct protoent *r; + + SOCKET_TEST(r = getprotobyname(name), NULL); + return r; +} + +struct protoent * +win32_getprotobynumber(int num) +{ + struct protoent *r; + + SOCKET_TEST(r = getprotobynumber(num), NULL); + return r; +} + +struct servent * +win32_getservbyname(const char *name, const char *proto) +{ + dTHXo; + struct servent *r; + + SOCKET_TEST(r = getservbyname(name, proto), NULL); + if (r) { + r = win32_savecopyservent(&w32_servent, r, proto); + } + return r; +} + +struct servent * +win32_getservbyport(int port, const char *proto) +{ + dTHXo; + struct servent *r; + + SOCKET_TEST(r = getservbyport(port, proto), NULL); + if (r) { + r = win32_savecopyservent(&w32_servent, r, proto); + } + return r; +} + +int +win32_ioctl(int i, unsigned int u, char *data) +{ + dTHXo; + u_long argp = (u_long)data; + int retval; + + if (!wsock_started) { + Perl_croak_nocontext("ioctl implemented only on sockets"); + /* NOTREACHED */ + } + + retval = ioctlsocket(TO_SOCKET(i), (long)u, &argp); + if (retval == SOCKET_ERROR) { + if (WSAGetLastError() == WSAENOTSOCK) { + Perl_croak_nocontext("ioctl implemented only on sockets"); + /* NOTREACHED */ + } + errno = WSAGetLastError(); + } + return retval; +} + +char FAR * +win32_inet_ntoa(struct in_addr in) +{ + StartSockets(); + return inet_ntoa(in); +} + +unsigned long +win32_inet_addr(const char FAR *cp) +{ + StartSockets(); + return inet_addr(cp); +} + +/* + * Networking stubs + */ + +void +win32_endhostent() +{ + dTHXo; + Perl_croak_nocontext("endhostent not implemented!\n"); +} + +void +win32_endnetent() +{ + dTHXo; + Perl_croak_nocontext("endnetent not implemented!\n"); +} + +void +win32_endprotoent() +{ + dTHXo; + Perl_croak_nocontext("endprotoent not implemented!\n"); +} + +void +win32_endservent() +{ + dTHXo; + Perl_croak_nocontext("endservent not implemented!\n"); +} + + +struct netent * +win32_getnetent(void) +{ + dTHXo; + Perl_croak_nocontext("getnetent not implemented!\n"); + return (struct netent *) NULL; +} + +struct netent * +win32_getnetbyname(char *name) +{ + dTHXo; + Perl_croak_nocontext("getnetbyname not implemented!\n"); + return (struct netent *)NULL; +} + +struct netent * +win32_getnetbyaddr(long net, int type) +{ + dTHXo; + Perl_croak_nocontext("getnetbyaddr not implemented!\n"); + return (struct netent *)NULL; +} + +struct protoent * +win32_getprotoent(void) +{ + dTHXo; + Perl_croak_nocontext("getprotoent not implemented!\n"); + return (struct protoent *) NULL; +} + +struct servent * +win32_getservent(void) +{ + dTHXo; + Perl_croak_nocontext("getservent not implemented!\n"); + return (struct servent *) NULL; +} + +void +win32_sethostent(int stayopen) +{ + dTHXo; + Perl_croak_nocontext("sethostent not implemented!\n"); +} + + +void +win32_setnetent(int stayopen) +{ + dTHXo; + Perl_croak_nocontext("setnetent not implemented!\n"); +} + + +void +win32_setprotoent(int stayopen) +{ + dTHXo; + Perl_croak_nocontext("setprotoent not implemented!\n"); +} + + +void +win32_setservent(int stayopen) +{ + dTHXo; + Perl_croak_nocontext("setservent not implemented!\n"); +} + +static struct servent* +win32_savecopyservent(struct servent*d, struct servent*s, const char *proto) +{ + d->s_name = s->s_name; + d->s_aliases = s->s_aliases; + d->s_port = s->s_port; +#ifndef __BORLANDC__ /* Buggy on Win95 and WinNT-with-Borland-WSOCK */ + if (!IsWin95() && s->s_proto && strlen(s->s_proto)) + d->s_proto = s->s_proto; + else +#endif + if (proto && strlen(proto)) + d->s_proto = (char *)proto; + else + d->s_proto = "tcp"; + + return d; +} diff --git a/wince/xbuildall.ksh b/wince/xbuildall.ksh new file mode 100644 index 0000000..40f8cdb --- /dev/null +++ b/wince/xbuildall.ksh @@ -0,0 +1,29 @@ +# Time-stamp: <01/08/01 21:03:25 keuchel@w2k> +# +# rebuild all perl targets + +machines=" +wince-arm-hpc-wce300 +wince-arm-hpc-wce211 +wince-sh3-hpc-wce211 +wince-mips-hpc-wce211 +wince-mips-hpc-wce200 +wince-sh3-hpc-wce200 +wince-arm-pocket-wce300 +wince-mips-pocket-wce300 +wince-sh3-pocket-wce300 +wince-x86em-pocket-wce300 +wince-sh3-palm-wce211 +wince-mips-palm-wce211 +wince-x86em-palm-wce211 +" + +for mach in $machines; do + mflags="-f makefile.ce MACHINE=$mach" + echo "Calling nmake for $mach..." + nmake $mflags clean + nmake $mflags all + nmake $mflags all dlls || exit 1 + nmake $mflags makedist +done + diff --git a/wince/xdistclean.ksh b/wince/xdistclean.ksh new file mode 100644 index 0000000..27d7c98 --- /dev/null +++ b/wince/xdistclean.ksh @@ -0,0 +1,4 @@ +tdirs=`xfind . -type d -name 'wince-*'` +test "$tdirs" = "" || rm -rf $dirs +rm -f *.res *.pdb *~ + diff --git a/wince/xmakediffs.ksh b/wince/xmakediffs.ksh new file mode 100644 index 0000000..a9fd6fc --- /dev/null +++ b/wince/xmakediffs.ksh @@ -0,0 +1,8 @@ +cd h:/src + +files="perl.c perlio.c perl.h" + +for f in $files; do + diff -c vc/perl/$f wince/perl/$f +done +