POSIX BC2000 port from perl-mvs:
Thomas Dorner [Tue, 29 Sep 1998 13:29:36 +0000 (14:29 +0100)]
Subject: Ported perl 5.005.02 to BS2000 / POSIX
Message-ID: <9CE47B416A24D2118BC40000F84009B20B72C5@start.de>

p4raw-id: //depot/cfgperl@2009

13 files changed:
Configure
README.posix-bc [new file with mode: 0644]
hints/posix-bc.sh [new file with mode: 0644]
perl.c
perly.y
proto.h
t/lib/cgi-html.t
t/op/magic.t
t/op/pack.t
t/op/quotemeta.t
t/op/subst.t
toke.c
unixish.h

index 4023bd3..eb68a06 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -2114,6 +2114,9 @@ EOM
                bsd386) osname=bsd386
                        osvers=`$uname -r`
                        ;;
+                POSIX-BC | posix-bc ) osname=posix-bc
+                        osvers="$3"
+                        ;;
                powerux | power_ux | powermax_os | powermaxos | \
                powerunix | power_unix) osname=powerux
                        osvers="$3"
diff --git a/README.posix-bc b/README.posix-bc
new file mode 100644 (file)
index 0000000..e02510c
--- /dev/null
@@ -0,0 +1,108 @@
+This is a first ported perl for the POSIX subsystem in BS2000 VERSION
+'V121', OSD V3.1, POSIX Shell V03.1A55.  It may work on other
+versions, but that's the one we've tested it on.
+
+You may need the following GNU programs in order to install perl:
+
+gzip:
+
+We used version 1.2.4, which could be installed out of the box with
+one failure during 'make check'.
+
+bison:
+
+The yacc coming with BS2000 POSIX didn't work for us.  So we had to
+use bison.  We had to make a few changes to perl in order to use the
+pure (reentrant) parser of bison.  We used version 1.25, but we had to
+add a few changes due to EBCDIC.
+
+
+UNPACKING:
+==========
+
+To extract an ASCII tar archive on BS2000 POSIX you need an ASCII
+filesystem (we used the mountpoint /usr/local/ascii for this).  Now
+you extract the archive in the ASCII filesystem without I/O-conversion:
+
+cd /usr/local/ascii
+export IO_CONVERSION=NO
+gunzip < /usr/local/src/perl.tar.gz | pax -r
+
+You may ignore the error message for the first element of the archive
+(this doesn't look like a tar archive / skipping to next file...),
+it's only the directory which will be made anyway.
+
+After extracting the archive you copy the whole directory tree to your
+EBCDIC filesystem.  This time you use I/O-conversion:
+
+cd /usr/local/src
+IO_CONVERSION=YES
+cp -r /usr/local/ascii/perl5.005_02 ./
+
+
+COMPILING:
+==========
+
+There is a "hints" file for posix-bc that specifies the correct values
+for most things.  The major problem is (of course) the EBCDIC character
+set.
+
+Configure did everything except the perl parser.
+
+Because of our problems with the native yacc we used GNU bison to
+generate a pure (=reentrant) parser for perly.y:
+
+echo %pure_parser > /tmp/perly.y
+cat perly.y >> /tmp/perly.y
+/usr/local/bin/bison --yacc -d perly.y
+cp y.tab.c perly.c
+cp y.tab.h perly.h
+
+We build perl using GNU make, but it should compile with the native
+make too.
+
+
+TESTING:
+========
+
+We still got a few errors during 'make test'.  Most of them are the
+result of using bison.  Bison prints 'parser error' instead of 'syntax
+error', so we may ignore them.  One error in the test op/regexp (and
+op/regexp_noamp) seems a bit critical, the result was an 'Out of
+memory' (core dump with op/regexp_noamp).  The following list shows
+our errors, your results may differ:
+
+comp/require........FAILED test 3
+op/misc.............FAILED tests 45-46
+op/pack.............FAILED tests 58-60
+op/regexp...........FAILED tests 402-485      (Out of memory!)
+op/regexp_noamp.....FAILED tests 402-485      (core dump)
+op/taint............FAILED test 73
+pragma/overload.....FAILED tests 152-153, 170-171
+pragma/subs.........FAILED tests 1-2
+lib/cgi-html........dubious, FAILED tests 1-17 (ALL)
+lib/complex.........FAILED tests 264, 484
+lib/dumper..........FAILED tests MANY
+lib/errno...........dubious                   (Errno.pm not found?)
+lib/searchdict......FAILED tests 1-2
+Failed 13/186 test scripts, 93.01% okay. 224/6242 subtests failed, 96.41%
+okay.
+
+
+INSTALLING:
+===========
+
+We have no nroff on BS2000 POSIX (yet), so we ignored any errors while
+installing the documentation.
+
+
+USING PERL:
+===========
+
+BS2000 POSIX doesn't support the shebang notation
+('#!/usr/local/bin/perl'), so you have to use the following lines
+instead:
+
+: # use perl
+    eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}'
+        if $running_under_some_shell;
diff --git a/hints/posix-bc.sh b/hints/posix-bc.sh
new file mode 100644 (file)
index 0000000..9c1ead5
--- /dev/null
@@ -0,0 +1,33 @@
+#! /usr/bin/bash -norc
+# hints/posix-bc.sh
+#
+# BS2000 (Posix Subsystem) hints by Thomas Dorner <Thomas.Dorner@start.de>
+#
+#  thanks to the authors of the os390.sh
+#
+
+# To get ANSI C, we need to use c89, and ld doesn't exist
+cc='c89'
+ld='c89'
+
+# C-Flags:
+ccflags='-DPOSIX_BC -DUSE_PURE_BISON -D_XOPEN_SOURCE_EXTENDED'
+
+# Turning on optimization breaks perl (CORE-DUMP):
+optimize='none'
+
+# we don''t use dynamic memorys (yet):
+so='none'
+usedl='no'
+dlext='none'
+
+# On BS2000/Posix, libc.a doesn't really hold anything at all,
+# so running nm on it is pretty useless.
+usenm='no'
+
+# other Options:
+
+usemymalloc='no'
+
+archobjs=ebcdic.o
+
diff --git a/perl.c b/perl.c
index 33a1667..a7804f1 100644 (file)
--- a/perl.c
+++ b/perl.c
@@ -1752,6 +1752,9 @@ moreswitches(char *s)
 #ifdef __OPEN_VM
        printf("VM/ESA port by Neale Ferguson, 1998\n");
 #endif
+#ifdef POSIX_BC
+       printf("BS2000 (POSIX) port by Start Amadeus GmbH, 1998\n");
+#endif
 #ifdef BINARY_BUILD_NOTICE
        BINARY_BUILD_NOTICE;
 #endif
diff --git a/perly.y b/perly.y
index 2c246fc..78378b6 100644 (file)
--- a/perly.y
+++ b/perly.y
@@ -27,7 +27,8 @@ dep(void)
 %start prog
 
 %{
-#if !defined(OEMVS) && !defined(__OPEN_VM)
+/* I sense a Big Blue pattern here... */
+#if !defined(OEMVS) && !defined(__OPEN_VM) && !defined(POSIX_BC)
 %}
 
 %union {
@@ -38,7 +39,11 @@ dep(void)
 }
 
 %{
-#endif /* !OEMVS && !__OPEN_VM*/
+#endif /* !OEMVS && !__OPEN_VM && !POSIX_BC */
+
+#ifdef USE_PURE_BISON
+#define YYLEX_PARAM (&yychar)
+#endif
 %}
 
 %token <ival> '{' ')'
diff --git a/proto.h b/proto.h
index fe21217..ba00b3a 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -670,7 +670,11 @@ VIRTUAL void       warner _((U32 err, const char* pat,...));
 VIRTUAL void   watch _((char** addr));
 VIRTUAL I32    whichsig _((char* sig));
 VIRTUAL int    yyerror _((char* s));
+#ifdef USE_PURE_BISON
+VIRTUAL int    yylex _((YYSTYPE* lvalp, int* lcharp));
+#else
 VIRTUAL int    yylex _((void));
+#endif
 VIRTUAL int    yyparse _((void));
 VIRTUAL int    yywarn _((char* s));
 
index 9d11946..8c38dd6 100755 (executable)
@@ -6,11 +6,13 @@
 BEGIN {
     chdir 't' if -d 't';
     @INC = '../lib' if -d '../lib';
+    require Config; import Config;
 }
 
 BEGIN {$| = 1; print "1..17\n"; }
-BEGIN {$eol = $^O eq 'VMS' ? "\n" : "\cM\cJ";
-       $eol = "\r\n" if $^O eq 'os390' or $^O eq 'vmesa'; }
+BEGIN {$eol = "\n"   if $^O eq 'VMS';
+       $eol = "\r\n" if $Config{ebcdic} eq 'define';
+       $eol = "\cM\cJ" unless defined $eol; }
 END {print "not ok 1\n" unless $loaded;}
 use CGI (':standard','-no_debug');
 $loaded = 1;
index 686424f..056ded4 100755 (executable)
@@ -135,7 +135,7 @@ __END__
 :endofperl
 EOT
     }
-    if ($^O eq 'os390' or $^O eq 'vmesa') {  # no shebang
+    if ($^O eq 'os390' or $^O eq 'posix-bc' or $^O eq 'vmesa') {  # no shebang
        $headmaybe = <<EOH ;
     eval 'exec ./perl -S \$0 \${1+"\$\@"}'
         if 0;
index 1953968..6b4e634 100755 (executable)
@@ -2,6 +2,12 @@
 
 # $RCSfile: pack.t,v $$Revision: 4.1 $$Date: 92/08/07 18:28:11 $
 
+BEGIN {
+    chdir 't' if -d 't';
+    @INC = '../lib' if -d '../lib';
+    require Config; import Config;
+}
+
 print "1..60\n";
 
 $format = "c2 x5 C C x s d i l a6";
@@ -31,7 +37,7 @@ print +($x = unpack("%32B69", "\001\002\004\010\020\040\100\200\017")) == 9
        ? "ok 6\n" : "not ok 6 $x\n";
 
 my $sum = 129; # ASCII
-$sum = 103 if ($^O eq 'os390' or $^O eq 'vmesa'); # EBCDIC.
+$sum = 103 if ($Config{ebcdic} eq 'define');
 
 print +($x = unpack("%32B*", "Now is the time for all good blurfl")) == $sum
        ? "ok 7\n" : "not ok 7 $x\n";
index 0217a67..98265a8 100755 (executable)
@@ -1,8 +1,14 @@
 #!./perl
 
+BEGIN {
+    chdir 't' if -d 't';
+    @INC = '../lib' if -d '../lib';
+    require Config; import Config;
+}
+
 print "1..15\n";
 
-if ($^O eq 'os390' or $^O eq 'vmesa') { # EBCDIC.
+if ($Config{ebcdic} eq 'define') {
     $_=join "", map chr($_), 129..233;
 
     # 105 characters - 52 letters = 53 backslashes
index 3b3bc8d..70219ab 100755 (executable)
@@ -1,6 +1,10 @@
 #!./perl
 
-BEGIN { @INC = ('../lib') }
+BEGIN {
+    chdir 't' if -d 't';
+    @INC = '../lib' if -d '../lib';
+    require Config; import Config;
+}
 
 print "1..71\n";
 
@@ -183,7 +187,7 @@ tr/a-z/A-Z/;
 print $_ eq 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' ? "ok 52\n" : "not ok 52\n";
 
 # same as tr/A-Z/a-z/;
-if ($^O eq 'os390' or $^O eq 'vmesa') {        # EBCDIC.
+if ($Config{ebcdic} eq 'define') {     # EBCDIC.
     no utf8;
     y[\301-\351][\201-\251];
 } else {               # Ye Olde ASCII.  Or something like it.
diff --git a/toke.c b/toke.c
index 8664b8f..c4ecaa8 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -97,6 +97,20 @@ static char ident_too_long[] = "Identifier too long";
 #undef ff_next
 #endif
 
+#ifdef USE_PURE_BISON
+YYSTYPE* yylval_pointer = NULL;
+int* yychar_pointer = NULL;
+#ifdef EMBED
+#undef yylval
+#undef yychar
+#endif
+#define yylval (*yylval_pointer)
+#define yychar (*yychar_pointer)
+#define YYLEXPARAM yylval_pointer,yychar_pointer
+#else
+#define YYLEXPARAM
+#endif
+
 #include "keywords.h"
 
 #ifdef CLINE
@@ -772,7 +786,7 @@ sublex_done(void)
 
     if (PL_lex_casemods) {             /* oops, we've got some unbalanced parens */
        PL_lex_state = LEX_INTERPCASEMOD;
-       return yylex();
+       return yylex(YYLEXPARAM);
     }
 
     /* Is there a right-hand side to take care of? */
@@ -1559,8 +1573,12 @@ filter_gets(register SV *sv, register PerlIO *fp, STRLEN append)
       if we already built the token before, use it.
 */
 
-int
-yylex(void)
+int yylex
+#ifdef USE_PURE_BISON
+(YYSTYPE* lvalp, int* lcharp)
+#else
+(void)
+#endif
 {
     dTHR;
     register char *s;
@@ -1570,6 +1588,11 @@ yylex(void)
     GV *gv = Nullgv;
     GV **gvp = 0;
 
+#ifdef USE_PURE_BISON
+    yylval_pointer = lvalp;
+    yychar_pointer = lcharp;
+#endif
+
     /* check if there's an identifier for us to look at */
     if (PL_pending_ident) {
         /* pit holds the identifier we read and pending_ident is reset */
@@ -1707,7 +1730,7 @@ yylex(void)
            if (PL_bufptr != PL_bufend)
                PL_bufptr += 2;
            PL_lex_state = LEX_INTERPCONCAT;
-           return yylex();
+           return yylex(YYLEXPARAM);
        }
        else {
            s = PL_bufptr + 1;
@@ -1751,7 +1774,7 @@ yylex(void)
                Aop(OP_CONCAT);
            }
            else
-               return yylex();
+               return yylex(YYLEXPARAM);
        }
 
     case LEX_INTERPPUSH:
@@ -1784,7 +1807,7 @@ yylex(void)
            s = PL_bufptr;
            Aop(OP_CONCAT);
        }
-       return yylex();
+       return yylex(YYLEXPARAM);
 
     case LEX_INTERPENDMAYBE:
        if (intuit_more(PL_bufptr)) {
@@ -1833,11 +1856,11 @@ yylex(void)
                Aop(OP_CONCAT);
            else {
                PL_bufptr = s;
-               return yylex();
+               return yylex(YYLEXPARAM);
            }
        }
 
-       return yylex();
+       return yylex(YYLEXPARAM);
     case LEX_FORMLINE:
        PL_lex_state = LEX_NORMAL;
        s = scan_formline(PL_bufptr);
@@ -2125,7 +2148,7 @@ yylex(void)
        if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
            PL_bufptr = s;
            PL_lex_state = LEX_FORMLINE;
-           return yylex();
+           return yylex(YYLEXPARAM);
        }
        goto retry;
     case '\r':
@@ -2149,7 +2172,7 @@ yylex(void)
            if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
                PL_bufptr = s;
                PL_lex_state = LEX_FORMLINE;
-               return yylex();
+               return yylex(YYLEXPARAM);
            }
        }
        else {
@@ -2486,7 +2509,7 @@ yylex(void)
                if (PL_lex_fakebrack) {
                    PL_lex_state = LEX_INTERPEND;
                    PL_bufptr = s;
-                   return yylex();             /* ignore fake brackets */
+                   return yylex(YYLEXPARAM);   /* ignore fake brackets */
                }
                if (*s == '-' && s[1] == '>')
                    PL_lex_state = LEX_INTERPENDMAYBE;
@@ -2497,7 +2520,7 @@ yylex(void)
        if (PL_lex_brackets < PL_lex_fakebrack) {
            PL_bufptr = s;
            PL_lex_fakebrack = 0;
-           return yylex();             /* ignore fake brackets */
+           return yylex(YYLEXPARAM);           /* ignore fake brackets */
        }
        force_next('}');
        TOKEN(';');
index 2f81294..2a6cbcd 100644 (file)
--- a/unixish.h
+++ b/unixish.h
 #define Fflush(fp)         fflush(fp)
 #define Mkdir(path,mode)   mkdir((path),(mode))
 
+/* these should be set in a hint file, not here */
 #ifndef PERL_SYS_INIT
 #ifdef PERL_SCO5
-/* this should be set in a hint file, not here */
 #  define PERL_SYS_INIT(c,v)   fpsetmask(0); MALLOC_INIT
 #else
-#  define PERL_SYS_INIT(c,v)   MALLOC_INIT
+#  ifdef POSIX_BC
+#    define PERL_SYS_INIT(c,v) sigignore(SIGFPE); MALLOC_INIT
+#  else
+#    define PERL_SYS_INIT(c,v) MALLOC_INIT
+#  endif
 #endif
 #endif