summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLarry Wall <lwall@jpl-devvax.jpl.nasa.gov>1990-10-15 23:06:10 +0000
committerLarry Wall <lwall@jpl-devvax.jpl.nasa.gov>1990-10-15 23:06:10 +0000
commitb6ccd89c4e9e943419de0b1846c5d54324a5ed8a (patch)
treecf53739fa44a61cbf5f940f6677797b116ce25cb
parent6eb13c3b624098fc688ac86672bc30e26cbf8fd4 (diff)
downloadperl-b6ccd89c4e9e943419de0b1846c5d54324a5ed8a.tar.gz
perl 3.0 patch #29 (combined patch)
This set of patches pretty much brings you up to the functionality that version 4.0 will have. The Perl Book documents version 4.0. Perhaps these should be called release notes... :-) Enhancements: Many of the changes relate to making the debugger work better. It now runs your scripts at nearly full speed because it no longer calls a subroutine on every statement. The debugger now doesn't get confused about packages, evals and other filenames. More variables (though still not all) are available within the debugger. Related to this is the fact that every statement now knows which package and filename it was compiled in, so package semantics are now much more straightforward. Every variable also knows which package it was compiled in. So many places that used to print out just the variable name now prefix the variable name with the package name. Notably, if you print *foo it now gives *package'foo. Along with these, there is now a "caller" function which returns the context of the current subroutine call. See the man page for more details. Chip Salzenberg sent the patches for System V IPC (msg, sem and shm) so I dropped them in. There was no way to wait for a specific pid, which was silly, since Perl was already keeping track of the information. So I added the waitpid() call, which uses Unix's wait4() or waitpid() if available, and otherwise emulates them (at least as far as letting you wait for a particular pid--it doesn't emulate non-blocking wait). For use in sorting routines, there are now two new operators, cmp and <=>. These do string and numeric comparison, returning -1, 0 or 1 when the first argument is less than, equal to or greater than the second argument. Occasionally one finds that one wants to evaluate an operator in a scalar context, even though it's part of a LIST. For this purpose, there is now a scalar() operator. For instance, the approved fix for the novice error of using <> in assigning to a local is now: local($var) = scalar(<STDIN>); Perl's ordinary I/O is done using standard I/O routines. Every now and then this gets in your way. You may now access the system calls read() and write() via the Perl functions sysread() and syswrite(). They should not be intermixed with ordinary I/O calls unless you know what you're doing. Along with this, both the sysread() and read() functions allow you an optional 4th argument giving an offset into the string you're reading into, so for instance you can easily finish up partial reads. As a bit of syntactic sugar, you can now use the file tests -M, -A and -C to determine the age of a file in (possibly fractional) days as of the time the script started running. This makes it much easier to write midnight cleanup scripts with precision. The index() and rindex() functions now have an optional 3rd argument which tells it where to start looking, so you can now iterate through a string using these functions. The substr() function's 3rd argument is now optional, and if omitted, the function returns everything to the end of the string. The tr/// translation function now understands c, d and s options, just like the tr program. (Well, almost just like. The d option only deletes characters that aren't in the replacement string.) The c complementes the character class to match and the s option squishes out multiple occurrences of any replacement class characters. The reverse function, used in a scalar context, now reverses its scalar argument as a string. Dale Worley posted a patch to add @###.## type fields to formats. I said, "Neat!" and dropped it in, lock, stock and sinker. Kai Uwe Rommel sent a bunch of MSDOS and OS/2 updates, which I (mostly) incorporated. I can't vouch for them, but they look okay. Any data stored after the __END__ marker can be accesses now via the DATA filehandle, which is automatically opened onto the script at that point. (Well, actually, it's just kept open, since it was already open to read the script.) The taintperl program now checks for world writable PATH components, and complains if any are found (if PATH is used). Bug fixes: It used to be that you could get core dumps by such means as @$foo=(); @foo[42]; (1,2,3)[42]; $#foo = 50; foreach $elem (@foo) { $elem = 1; } This is no longer so. (For those who are up on Perl internals, the stack policy no longer allows Nullstr--all undefined values must be passed as &str_undef.) If you say something like local($foo,$bar); or local($initialized,$foo,$bar) = ('one value'); $foo and $bar are now initialized to the undefined value, rather than the defined null string. Array assignment to special arrays is now better supported. For instance, @ENV = () clears the environment, and %foo = () will now clear any dbm file bound to %foo. On the subject of dbm files, the highly visible bugs at patchlevel 28 have been fixed. You can now open dbm files readonly, and you don't have to do a dummy assignment to make the cache allocate itself. The modulus operator wasn't working right on negative values because of a misplaced cast. For instance, -5 % 5 was returning the value 5, which is clearly wrong. Certain operations coredumped if you didn't supply a value: close; eof; Previously, if the subroutine supplied for a sort operation didn't exist, it failed quietly. Now it produces a fatal error. The bitwise complement operator ~ didn't work on vec() strings longer than one byte because of failure to increment a loop variable. The oct and hex functions returned a negative result if the highest bit was set. They now return an unsigned result, which seems a little less confusing. Likewise, the token 0x80000000 also produces an unsigned value now. Some machines didn't like to see 0x87654321 in an #ifdef because they think of the symbols as signed. The tests have been changed to just look at the lower 4 nybbles of the value, which is sufficient to determine endianness, at least as far as the #ifdefs are concerned. The unshift operator did not return the documented value, which was the number of elements in the new array. Instead it returned the last unshifted argument, more or less by accident. -w sometimes printed spurious warnings about ARGV and ENV when referencing the arrays indirectly through shift or exec. This was because the typo test was misplaced before the code that exempts special variables from the typo test. If you said 'require "./foo.pl"', it would look in someplace like /usr/local/lib/perl/./foo.pl instead of the current directory. This works more like people expect now. The require error messages also referred to wrong file, if they worked at all. The h2ph program didn't translate includes right--it should have changed .h to .ph. Patterns with multiple short literal strings sometimes failed. This was a problem with the code that looks for a maximal literal string to feed to the Boyer-Moore searching routine. The code was gluing together literal strings that weren't continuous. The $* variable controls multi-line pattern matching. When it's 0, patterns are supposed to match as if the string contained a single line. Unfortunately, /^pat/ occasionally matched in middle of string under certain conditions. Recently the regular expression routines were upgraded to do {n,m} more efficiently. In doing this, however, I manufactured a couple of bugs: /.{n,m}$/ could match with fewer than n characters remaining on the line, and patterns like /\d{9}/ could match more than 9 characters. The undefined value has an actual physical location in Perl, and pointers to it are passed around. By certain circuitous routes it was possible to clobber the undefined value so that it was no longer undefined--kind of like making /dev/null into a real file. Hopefully this can't happen any more. op.stat could fail if /bin/0 existed, because of a while (<*>) {... This has been changed to a while (defined($_ = <*>)) {... The length of a search pattern was limited by the length of tokenbuf internally. This restriction has been removed. The null character gave the tokener indigestion when used as a delimiter for m// or s///. There was a bunch of other cleanupish things that are too trivial to mention here.
-rwxr-xr-xConfigure67
-rw-r--r--Makefile.SH22
-rw-r--r--README2
-rw-r--r--eg/sysvipc/README9
-rw-r--r--os2/README.OS2167
-rw-r--r--patchlevel.h2
-rw-r--r--x2p/Makefile.SH13
7 files changed, 201 insertions, 81 deletions
diff --git a/Configure b/Configure
index 9d5f0328cb..ca11e1315a 100755
--- a/Configure
+++ b/Configure
@@ -8,14 +8,14 @@
# and edit it to reflect your system. Some packages may include samples
# of config.h for certain machines, so you might look for one of those.)
#
-# $Header: Configure,v 3.0.1.9 90/08/13 21:48:46 lwall Locked $
+# $Header: Configure,v 3.0.1.10 90/10/15 14:37:52 lwall Locked $
#
# Yes, you may rip this off to use in other distribution packages.
# (Note: this Configure script was generated automatically. Rather than
# working with this copy of Configure, you may wish to get metaconfig.)
: sanity checks
-PATH=".:/bin:/usr/bin:/usr/local/bin:/usr/ucb:/usr/local:/usr/lbin:/etc:/usr/new:/usr/new/bin:/usr/nbin:$PATH"
+PATH="$PATH:.:/bin:/usr/bin:/usr/local/bin:/usr/ucb:/usr/local:/usr/lbin:/etc:/usr/new:/usr/new/bin:/usr/nbin"
export PATH || (echo "OOPS, this isn't sh. Desperation time. I will feed myself to sh."; sh $0; kill $$)
if test ! -t 0; then
@@ -154,6 +154,7 @@ d_strctcpy=''
d_strerror=''
d_symlink=''
d_syscall=''
+d_sysvipc=''
d_truncate=''
d_varargs=''
d_vfork=''
@@ -162,6 +163,7 @@ d_volatile=''
d_vprintf=''
d_charvspr=''
d_wait4=''
+d_waitpid=''
gidtype=''
i_dirent=''
d_dirnamlen=''
@@ -169,6 +171,7 @@ i_fcntl=''
i_grp=''
i_niin=''
i_pwd=''
+d_pwcomment=''
d_pwquota=''
d_pwage=''
d_pwchange=''
@@ -232,7 +235,7 @@ define='define'
undef='undef'
: change the next line if compiling for Xenix/286 on Xenix/386
xlibpth='/usr/lib/386 /lib/386'
-libpth='/usr/lib /usr/local/lib /usr/lib/large /lib '$xlibpth' /lib/large /usr/lib/small /lib/small'
+libpth='/usr/ccs/lib /usr/lib /usr/local/lib /usr/lib/large /lib '$xlibpth' /lib/large /usr/lib/small /lib/small'
smallmach='pdp11 i8086 z8000 i80286 iAPX286'
rmlist='kit[1-9]isdone kit[1-9][0-9]isdone'
trap 'echo " "; rm -f $rmlist; exit 1' 1 2 3
@@ -259,11 +262,12 @@ attrlist="$attrlist ns32000 ns16000 iAPX286 mc300 mc500 mc700 sparc"
attrlist="$attrlist nsc32000 sinix xenix venix posix ansi M_XENIX"
attrlist="$attrlist $mc68k __STDC__ UTS M_I8086 M_I186 M_I286 M_I386"
attrlist="$attrlist i186 __m88k__ m88k DGUX __DGUX__"
-pth="/usr/ucb /bin /usr/bin /usr/local /usr/local/bin /usr/lbin /usr/plx /usr/5bin /vol/local/bin /etc /usr/lib /lib /usr/local/lib /sys5.3/bin /sys5.3/usr/bin /bsd4.3/bin /bsd4.3/usr/bin /bsd4.3/usr/ucb"
+pth="/usr/ccs/bin /bin /usr/bin /usr/ucb /usr/local /usr/local/bin /usr/lbin /usr/plx /usr/5bin /vol/local/bin /etc /usr/lib /lib /usr/local/lib /sys5.3/bin /sys5.3/usr/bin /bsd4.3/bin /bsd4.3/usr/bin /bsd4.3/usr/ucb"
d_newshome="/usr/NeWS"
defvoidused=7
libswanted="net_s net nsl_s nsl socket nm ndir ndbm dbm sun m bsd BSD x c_s"
inclwanted='/usr/netinclude /usr/include/sun /usr/include/bsd /usr/include/lan'
+
: some greps do not return status, grrr.
echo "grimblepritz" >grimble
if grep blurfldyick grimble >/dev/null 2>&1 ; then
@@ -1126,7 +1130,7 @@ for thislib in $libswanted; do
*) thatlib="${thislib}_s";;
*) thatlib=NONE;;
esac
- xxx=`loc lib$thislib.a X /usr/lib /usr/local/lib /lib`
+ xxx=`loc lib$thislib.a X /usr/ccs/lib /usr/lib /usr/local/lib /lib`
if test -f $xxx; then
echo "Found -l$thislib."
case "$dflt" in
@@ -1274,25 +1278,25 @@ if $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
cppstdin="$cc -E"
cppminus='';
else
- echo 'Nope, maybe "'$cpp'" will work...'
- $cpp <testcpp.c >testcpp.out 2>&1
+ echo 'Nope...maybe "'"$cc"' -E -" will work...'
+ $cc -E - <testcpp.c >testcpp.out 2>&1
if $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
echo "Yup, it does."
- cppstdin="$cpp"
- cppminus='';
+ cppstdin="$cc -E"
+ cppminus='-';
else
- echo 'No such luck...maybe "'$cpp' -" will work...'
- $cpp - <testcpp.c >testcpp.out 2>&1
+ echo 'No such luck, maybe "'$cpp'" will work...'
+ $cpp <testcpp.c >testcpp.out 2>&1
if $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
echo "It works!"
cppstdin="$cpp"
- cppminus='-';
+ cppminus='';
else
- echo 'Nixed again...maybe "'"$cc"' -E -" will work...'
- $cc -E - <testcpp.c >testcpp.out 2>&1
+ echo 'Nixed again...maybe "'$cpp' -" will work...'
+ $cpp - <testcpp.c >testcpp.out 2>&1
if $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
echo "Hooray, it works! I was beginning to wonder."
- cppstdin="$cc -E"
+ cppstdin="$cpp"
cppminus='-';
else
echo 'Nope...maybe "'"$cc"' -P" will work...'
@@ -1357,7 +1361,7 @@ case "$libc" in
'') libc=unknown;;
esac
case "$libpth" in
-'') libpth='/lib /usr/lib /usr/local/lib';;
+'') libpth='/usr/ccs/lib /lib /usr/lib /usr/local/lib';;
esac
case "$libs" in
*-lc_s*) libc=`loc libc_s.a $libc $libpth`
@@ -1388,7 +1392,9 @@ case "$libs" in
done
;;
esac
-set /usr/lib/libc.so.[0-9]*
+set /usr/ccs/lib/libc.so
+test -f $1 || set /usr/lib/libc.so
+test -f $1 || set /usr/lib/libc.so.[0-9]*
eval set \$$#
if test -f "$1"; then
echo "Your shared C library is in $1."
@@ -1440,7 +1446,7 @@ echo " "
set `echo $libc $libnames | tr ' ' '\012' | sort | uniq`
$echo $n "Extracting names from $* for later perusal...$c"
nm $* 2>/dev/null >libc.tmp
-$sed -n -e 's/^.* [AT] *_[_.]*//p' -e 's/^.* [AT] //p' <libc.tmp >libc.list
+$sed -n -e 's/^.* [ATD] *_[_.]*//p' -e 's/^.* [ATD] //p' <libc.tmp >libc.list
if $contains '^printf$' libc.list >/dev/null 2>&1; then
echo "done"
else
@@ -1453,7 +1459,8 @@ else
$sed -n -e 's/^_//' \
-e 's/^\([a-zA-Z_0-9]*\).*xtern.*text.*/\1/p' <libc.tmp >libc.list
$contains '^printf$' libc.list >/dev/null 2>&1 || \
- $sed -n -e 's/^.*|FUNC |GLOB .*|//p' <libc.tmp >libc.list
+ $sed -n -e 's/^.*|FUNC |GLOB .*|//p' -e 's/^.*|FUNC |WEAK .*|//p' \
+ <libc.tmp >libc.list
if $contains '^printf$' libc.list >/dev/null 2>&1; then
echo "done"
else
@@ -1860,7 +1867,12 @@ echo " "
if $test -r /usr/include/pwd.h ; then
i_pwd="$define"
echo "pwd.h found."
- $cppstdin $cppflags </usr/include/pwd.h >$$.h
+ $cppstdin $cppflags $cppminus </usr/include/pwd.h >$$.h
+ if $contains 'pw_comment' $$.h >/dev/null 2>&1; then
+ d_pwcomment="$define"
+ else
+ d_pwcomment="$undef"
+ fi
if $contains 'pw_quota' $$.h >/dev/null 2>&1; then
d_pwquota="$define"
else
@@ -1889,6 +1901,7 @@ if $test -r /usr/include/pwd.h ; then
rm -f $$.h
else
i_pwd="$undef"
+ d_pwcomment="$undef"
d_pwquota="$undef"
d_pwage="$undef"
d_pwchange="$undef"
@@ -2083,6 +2096,10 @@ case "$flags" in
esac
$rm -f try.c try
+: see if there is System V IPC
+set msgget d_sysvipc
+eval $inlibc
+
: see if truncate exists
set truncate d_truncate
eval $inlibc
@@ -2103,7 +2120,7 @@ eval $inlibc
: see if signal is declared as pointer to function returning int or void
echo " "
-$cppstdin $cppflags < /usr/include/signal.h >$$.tmp
+$cppstdin $cppflags $cppminus < /usr/include/signal.h >$$.tmp
if $contains 'void.*signal' $$.tmp >/dev/null 2>&1 ; then
echo "You have void (*signal())() instead of int."
d_voidsig="$define"
@@ -2139,6 +2156,10 @@ $rm -f try.*
set wait4 d_wait4
eval $inlibc
+: see if there is a waitpid
+set waitpid d_waitpid
+eval $inlibc
+
: check for void type
echo " "
$cat <<EOM
@@ -2494,7 +2515,6 @@ uidtype="$ans"
Log='$Log'
Header='$Header'
-
: determine which malloc to compile in
echo " "
case "$usemymalloc" in
@@ -2709,6 +2729,7 @@ d_strctcpy='$d_strctcpy'
d_strerror='$d_strerror'
d_symlink='$d_symlink'
d_syscall='$d_syscall'
+d_sysvipc='$d_sysvipc'
d_truncate='$d_truncate'
d_varargs='$d_varargs'
d_vfork='$d_vfork'
@@ -2717,6 +2738,7 @@ d_volatile='$d_volatile'
d_vprintf='$d_vprintf'
d_charvspr='$d_charvspr'
d_wait4='$d_wait4'
+d_waitpid='$d_waitpid'
gidtype='$gidtype'
i_dirent='$i_dirent'
d_dirnamlen='$d_dirnamlen'
@@ -2724,6 +2746,7 @@ i_fcntl='$i_fcntl'
i_grp='$i_grp'
i_niin='$i_niin'
i_pwd='$i_pwd'
+d_pwcomment='$d_pwcomment'
d_pwquota='$d_pwquota'
d_pwage='$d_pwage'
d_pwchange='$d_pwchange'
diff --git a/Makefile.SH b/Makefile.SH
index cccdc725b8..39a7f099cd 100644
--- a/Makefile.SH
+++ b/Makefile.SH
@@ -25,9 +25,12 @@ esac
echo "Extracting Makefile (with variable substitutions)"
cat >Makefile <<!GROK!THIS!
-# $Header: Makefile.SH,v 3.0.1.8 90/08/13 21:50:49 lwall Locked $
+# $Header: Makefile.SH,v 3.0.1.9 90/10/15 14:41:34 lwall Locked $
#
# $Log: Makefile.SH,v $
+# Revision 3.0.1.9 90/10/15 14:41:34 lwall
+# patch29: various portability fixes
+#
# Revision 3.0.1.8 90/08/13 21:50:49 lwall
# patch28: not all yaccs are the same
#
@@ -69,13 +72,14 @@ mansrc = $mansrc
manext = $manext
CFLAGS = $ccflags $optimize
LDFLAGS = $ldflags
+CLDFLAGS = $ldflags
SMALL = $small
LARGE = $large $split
mallocsrc = $mallocsrc
mallocobj = $mallocobj
SLN = $sln
-libs = $libs -lm
+libs = $libs
public = perl taintperl $suidperl
@@ -101,7 +105,7 @@ h = $(h1) $(h2)
c1 = array.c cmd.c cons.c consarg.c doarg.c doio.c dolist.c dump.c
c2 = eval.c form.c hash.c $(mallocsrc) perly.c regcomp.c regexec.c
-c3 = stab.c str.c toke.c util.c
+c3 = stab.c str.c toke.c util.c usersub.c
c = $(c1) $(c2) $(c3)
@@ -135,10 +139,10 @@ all: $(public) $(private) $(util) perl.man uperl.o $(scripts)
# used for all scripts that aren't set-id or running under something set-id.
perl: perl.o $(obj) usersub.o
- $(CC) $(LARGE) $(LDFLAGS) $(obj) perl.o usersub.o $(libs) -o perl
+ $(CC) $(LARGE) $(CLDFLAGS) $(obj) perl.o usersub.o $(libs) -o perl
uperl.o: perl.o $(obj)
- ld $(LARGE) $(LDFLAGS) -r $(obj) perl.o $(libs) -o uperl.o
+ -ld $(LARGE) $(LDFLAGS) -r $(obj) perl.o $(libs) -o uperl.o
saber: perl.c
# load $(c) perl.c
@@ -149,7 +153,7 @@ saber: perl.c
# has been invoked correctly.
suidperl: tperl.o sperly.o $(tobj) usersub.o
- $(CC) $(LARGE) $(LDFLAGS) sperly.o $(tobj) tperl.o usersub.o $(libs) \
+ $(CC) $(LARGE) $(CLDFLAGS) sperly.o $(tobj) tperl.o usersub.o $(libs) \
-o suidperl
# This version interprets scripts that are already set-id either via a wrapper
@@ -158,7 +162,7 @@ suidperl: tperl.o sperly.o $(tobj) usersub.o
# and normal perl is the presence of the "taint" checks.
taintperl: tperl.o tperly.o $(tobj) usersub.o
- $(CC) $(LARGE) $(LDFLAGS) tperly.o $(tobj) tperl.o usersub.o $(libs) \
+ $(CC) $(LARGE) $(CLDFLAGS) tperly.o $(tobj) tperl.o usersub.o $(libs) \
-o taintperl
# Replicating all this junk is yucky, but I don't see a portable way to fix it.
@@ -349,9 +353,9 @@ clean:
rm -f *.o all perl taintperl suidperl perl.man
cd x2p; $(MAKE) clean
-realclean:
+realclean: clean
cd x2p; $(MAKE) realclean
- rm -f perl *.orig */*.orig *~ */*~ *.o core $(addedbyconf) perl.man
+ rm -f *.orig */*.orig *~ */*~ core $(addedbyconf) h2ph h2ph.man
rm -f perl.c perly.h t/perl Makefile config.h makedepend makedir
rm -f x2p/Makefile
diff --git a/README b/README
index 98d557300c..c25d7da51b 100644
--- a/README
+++ b/README
@@ -91,7 +91,7 @@ Installation
Some compilers will not compile or optimize the larger files without
some extra switches to use larger jump offsets or allocate larger
internal tables. It's okay to insert rules for specific files into
- Makefile.SH, since a default rule only take effect in the
+ Makefile.SH, since a default rule only takes effect in the
absence of a specific rule.
The 3b2 needs to turn off -O.
diff --git a/eg/sysvipc/README b/eg/sysvipc/README
new file mode 100644
index 0000000000..54094f1d85
--- /dev/null
+++ b/eg/sysvipc/README
@@ -0,0 +1,9 @@
+FYEnjoyment, here are the test scripts I used while implementing SysV
+IPC in Perl. Each of them must be run with the parameter "s" for
+"send" or "r" for "receive"; in each case, the receiver is the server
+and the sender is the client.
+
+--
+Chip Salzenberg at ComDev/TCT <chip@tct.uucp>, <uunet!ateng!tct!chip>
+
+
diff --git a/os2/README.OS2 b/os2/README.OS2
index f79fab948a..99cd9a24c1 100644
--- a/os2/README.OS2
+++ b/os2/README.OS2
@@ -1,8 +1,10 @@
-
Notes on the OS/2 Perl port
Raymond Chen
- (rjc@math.princeton.edu)
+ (rjc@math.princeton.edu)
+
+ Kai Uwe Rommel
+ (rommel@lan.informatik.tu-muenchen.dbp.de)
-1. Background.
@@ -16,28 +18,28 @@ directory.
1. Compiling.
-Perl has been compiled under MS-DOS using the Microsoft C compiler
-version 6.0. Before compiling install dir.h as <sys/dir.h>. You will
-need a Unix-like make program and something like yacc (e.g. bison). I
-just ran yacc on my UNIX box and downloaded the resulting y.tab.[ch]
+Perl has been compiled under MS-DOS using the Microsoft C compiler
+version 6.0. Before compiling install dir.h as <sys/dir.h>. You will
+need a Unix-like make program and something like yacc (e.g. bison). I
+just ran yacc on my UNIX box and downloaded the resulting y.tab.[ch]
files. Compilation takes 45 minutes on a 16MHz 386 machine running
-no jobs other than the compiler, so you will probably need something to
+no jobs other than the compiler, so you will probably need something to
do in the meantime. Like, say, lunch. (Compilation time does not
-include formatting the manual.) If you compile with optimization
+include formatting the manual.) If you compile with optimization
turned off, it takes about half as long.
The executable is 270k (perlsym.exe is 473k; if you compile
-without optimization, the sizes are 329K/531K), and the top level
-directory needs 800K for sources, 550K for object code, and 800K for the
+without optimization, the sizes are 329K/531K), and the top level
+directory needs 800K for sources, 550K for object code, and 800K for the
executables, assuming you want to build both perl.exe and perlsym.exe
with full optimization.
-The makefile will compile glob for you which you will need to place
-somewhere in your path so that perl globbing will work correctly. All
-the tests were run, although some modifications were necessary because
-OS/2 isn't UNIX. The tests that failed failed because of limitations of
-the operating system and aren't the fault of the compiler. a2p and s2p
-were not tested.
+The makefile will compile glob for you which you will need to place
+somewhere in your path so that perl globbing will work correctly. All
+the tests were run, although some modifications were necessary because
+OS/2 isn't UNIX. The tests that failed failed because of limitations of
+the operating system and aren't the fault of the compiler. a2p and s2p
+were not tested.
In the eg directory you will find the syscalls.pl header file,
and a sample program that demonstrates some of the improvements
@@ -46,20 +48,20 @@ system calls.
2. Using OS/2 Perl
-The OS/2 version of perl has much of the functionality of the Unix
-version. Here are some things that don't work: sockets, password
-functions, [gs]et[eug]id, dbm functions, fork.
+The OS/2 version of perl has much of the functionality of the Unix
+version. Here are some things that don't work: sockets, password
+functions, [gs]et[eug]id, dbm functions, fork.
One thing that doesn't work is "split" with no arguments. Somehow,
yylval.arg is empty ... [[ Wait, sorry, I fixed that. --rjc ]]
Care has been taken to implement the rest, although the implementation
-might not be the best possible. Here are short notes on the tricky
-bits:
+might not be the best possible. Here are short notes on the tricky
+bits:
2.1. In-place editing.
-Files currently can be edited in-place provided you are creating a
+Files currently can be edited in-place provided you are creating a
backup. Considerable effort is made to ensure that a reasonable
name for the backup is selected, while still remaining within
the 8.3 contraints of the FAT filesystem. (HPFS users have nothing
@@ -76,14 +78,14 @@ Style 0: Append the suffix exactly as UNIX perl would do it.
swallow it. FAT will rarely accept it.)
Style 1: If the suffix begins with a '.', change the file extension
- to whatever you supplied. If the name matches the original
+ to whatever you supplied. If the name matches the original
name, use the fallback method.
-Style 2: If the suffix is a single character, not a '.', try to add the
+Style 2: If the suffix is a single character, not a '.', try to add the
suffix to the following places, using the first one that works.
- [1] Append to extension.
- [2] Append to filename,
- [3] Replace end of extension,
+ [1] Append to extension.
+ [2] Append to filename,
+ [3] Replace end of extension,
[4] Replace end of filename.
If the name matches the original name, use the fallback method.
@@ -116,7 +118,7 @@ suffix = "~" (style 2)
longname.fil => longname.fi~
longname.fi~ => longnam~.fi~
longnam~.fi~ => longnam~.$$$
-
+
2.2. Directory access.
Are implemented, but in order to support telldir() and seekdir(),
@@ -125,7 +127,7 @@ then handing out pieces of it each time you do a readdir().
2.3. Pipes and redirection.
-Pipes and redirection are supported. Although OS/2 does not
+Pipes and redirection are supported. Although OS/2 does not
terminate programs which try to write to closed pipes, perl will
kill them for you if you do it like this:
@@ -174,24 +176,24 @@ the syscalls I've written so far:
The arguments you pass are handed off to OS/2 without interpretation,
and the return value is returned straight to you. However, you don't
-have to supply arguments for the ones whose descriptions are "must be
+have to supply arguments for the ones whose descriptions are "must be
zero"; perl will supply the mandatory zeros for you.
2.5. Binary file access
-Files are opened in text mode by default. This means that CR LF pairs
-are translated to LF. If binary access is needed the `binarymode'
-function should be used. There is currently no way to reverse the
-effect of the binary function. If that is needed close and reopen the
-file.
+Files are opened in text mode by default. This means that CR LF pairs
+are translated to LF. If binary access is needed the `binarymode'
+function should be used. There is currently no way to reverse the
+effect of the binary function. If that is needed close and reopen the
+file.
2.6. Priority
-The getpriority and setpriority functions are implemented, but since
-OS/2 priorities are different from UNIX priorities, the arguments aren't
-the same. Basically, the arguments you pass are handed directly to
-OS/2. The only exception is the last argument to setpriority. To make
-it easier to make delta priorities, if the priority class is 0xff, it
+The getpriority and setpriority functions are implemented, but since
+OS/2 priorities are different from UNIX priorities, the arguments aren't
+the same. Basically, the arguments you pass are handed directly to
+OS/2. The only exception is the last argument to setpriority. To make
+it easier to make delta priorities, if the priority class is 0xff, it
is changed to 0. That way, you can write
setpriority(0,0,-2)
@@ -204,8 +206,8 @@ to decrease the delta by 2.
2.7. Interpreter startup.
-The effect of the Unix #!/bin/perl interpreter startup can be obtained
-under OS/2 by giving the script a .cmd extension and beginning the script
+The effect of the Unix #!/bin/perl interpreter startup can be obtained
+under OS/2 by giving the script a .cmd extension and beginning the script
with the line
extproc C:\binp\perl.exe -S
@@ -264,7 +266,7 @@ to make popen() do much of the same sort of preprocessing
as do_spawn does (which means, of course, that we probably
should yank out code to be dished off into a subroutine).
-In do_spawn(), use DosExecPgm instead of spawnl in order to get more
+In do_spawn(), use DosExecPgm instead of spawnl in order to get more
precise reasons why the child terminated (RESULTCODES).
@@ -273,3 +275,82 @@ precise reasons why the child terminated (RESULTCODES).
Raymond Chen <rjc@math.princeton.edu>
1817 Oxford St. Apt 6
Berkeley, CA 94709-1828 USA
+
+-----------------------
+I picked up the OS/2 port with patches 19-28. When compiling, I found
+out that os2.c and director.c were missing. I had to rewrite them because
+even the original author of the port (Raymond Chen) did no longer have them.
+
+I had directory routines laying around, this was no big deal.
+I rewrote os2.c, but did not implement the syscall() as described above.
+I had not the time and did not really need it. Feel free ...
+
+Changes to above described port:
+
+- the small program GLOB is now named PERLGLOB for better ordering in
+ my /bin directory
+
+- added help page (well, a graphical user interface would be overkill
+ but a simple help page should be in every program :-)
+
+- several cosmetic changes in standard distribution files because of
+ naming conventions etc., #ifdef'd OS2
+
+- syscall() not supported as noted above
+
+- chdir now recognizes also drive letters and changes also the drive
+
+- new mypopen(), mypclose() functions and simulation routines for DOS mode,
+ they are selected automatically in real mode
+- the new pclose() does not kill the child, my experience is that this is
+ not needed.
+
+- setpriority is now: setpriority(class, pid, val)
+ see description of DosSetPrty() for class and val meanings
+- getpriority is now: getpriority(dummy, pid)
+ see description of DosGetPrty()
+
+- kill is now: kill(pid, sig)
+ where sig can be 0 (kill process)
+ 1-3 (send process flags A-C, see DosFlagProcess())
+ if pid is less than zero, the signal is sent to the whole
+ process tree originating at -pid.
+
+The following files are now new with patch >=29:
+
+readme.os2 this file
+
+dir.h sys/dir.h
+director.c directory routines
+os2.c kernel of OS/2 port (see below)
+popen.c new popen.c
+mktemp.c enhanced mktemp(), uses TMP env. variable, used by popen.c
+
+perl.cs Compiler Shell script for perl itself
+perl.def linker definition file for perl
+perl.bad names of protect-only API calls for BIND
+perlglob.cs Compiler Shell script for perl globbing program
+perlglob.def linker definition file for perlglob
+a2p.cs Compiler Shell script for a2p (see below)
+a2p.def linker definition file for a2p
+makefile Makefile, not tested
+
+perlsh.cmd the converted perlsh
+selfrun.cmd sample selfrunning perl script for OS/2
+selfrun.bat sample selfrunning perl script for DOS mode
+
+Note: I don't use make but my own utility, the Compiler Shell CS.
+It was posted in comp.binaries.os2 or you can ask me for the newest
+version. The .CS files are the "makefiles" for it.
+
+Note: MS C 6.00 is required. C 5.1 is not capable of compiling perl,
+especially not with -DDEBUGGING
+
+
+ August 1990
+
+ Kai Uwe Rommel
+ rommel@lan.informatik.tu-muenchen.dbp.de
+ Breslauer Str. 25
+ D-8756 Kahl/Main
+ West (yes, still!) Germany
diff --git a/patchlevel.h b/patchlevel.h
index afbe4bd0c7..46afcbbb08 100644
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -1 +1 @@
-#define PATCHLEVEL 28
+#define PATCHLEVEL 29
diff --git a/x2p/Makefile.SH b/x2p/Makefile.SH
index 99c4bb60b4..673a639727 100644
--- a/x2p/Makefile.SH
+++ b/x2p/Makefile.SH
@@ -18,9 +18,12 @@ case "$mallocsrc" in
esac
echo "Extracting x2p/Makefile (with variable substitutions)"
cat >Makefile <<!GROK!THIS!
-# $Header: Makefile.SH,v 3.0.1.5 90/08/13 22:41:05 lwall Locked $
+# $Header: Makefile.SH,v 3.0.1.6 90/10/16 11:28:18 lwall Locked $
#
# $Log: Makefile.SH,v $
+# Revision 3.0.1.6 90/10/16 11:28:18 lwall
+# patch29: various portability fixes
+#
# Revision 3.0.1.5 90/08/13 22:41:05 lwall
# patch28: shift/reduce count was off for a2p's Makefile
#
@@ -63,7 +66,7 @@ LARGE = $large $split
mallocsrc = $mallocsrc
mallocobj = $mallocobj
-libs = $libs -lm
+libs = $libs
!GROK!THIS!
cat >>Makefile <<'!NO!SUBS!'
@@ -105,7 +108,7 @@ a2p.c: a2p.y
$(YACC) a2p.y
mv y.tab.c a2p.c
-a2p.o: a2p.c a2py.c a2p.h EXTERN.h util.h INTERN.h handy.h ../config.h
+a2p.o: a2p.c a2py.c a2p.h EXTERN.h util.h INTERN.h handy.h ../config.h str.h hash.h
$(CC) -c $(CFLAGS) $(LARGE) a2p.c
install: a2p s2p
@@ -137,8 +140,8 @@ fi
clean:
rm -f *.o
-realclean:
- rm -f a2p *.orig */*.orig *.o core $(addedbyconf)
+realclean: clean
+ rm -f a2p *.orig */*.orig core $(addedbyconf) a2p.c s2p all
# The following lint has practically everything turned on. Unfortunately,
# you have to wade through a lot of mumbo jumbo that can't be suppressed.