summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xConfigure3
-rw-r--r--README.posix-bc108
-rw-r--r--hints/posix-bc.sh33
-rw-r--r--perl.c3
-rw-r--r--perly.y9
-rw-r--r--proto.h4
-rwxr-xr-xt/lib/cgi-html.t6
-rwxr-xr-xt/op/magic.t2
-rwxr-xr-xt/op/pack.t8
-rwxr-xr-xt/op/quotemeta.t8
-rwxr-xr-xt/op/subst.t8
-rw-r--r--toke.c47
-rw-r--r--unixish.h8
13 files changed, 224 insertions, 23 deletions
diff --git a/Configure b/Configure
index 4023bd35d7..eb68a06165 100755
--- 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
index 0000000000..e02510c316
--- /dev/null
+++ b/README.posix-bc
@@ -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
index 0000000000..9c1ead52fd
--- /dev/null
+++ b/hints/posix-bc.sh
@@ -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 33a16672ae..a7804f1fd9 100644
--- 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 2c246fc228..78378b62be 100644
--- 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 fe21217b7a..ba00b3ab66 100644
--- 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));
diff --git a/t/lib/cgi-html.t b/t/lib/cgi-html.t
index 9d11946ed0..8c38dd6a18 100755
--- a/t/lib/cgi-html.t
+++ b/t/lib/cgi-html.t
@@ -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;
diff --git a/t/op/magic.t b/t/op/magic.t
index 686424f487..056ded4068 100755
--- a/t/op/magic.t
+++ b/t/op/magic.t
@@ -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;
diff --git a/t/op/pack.t b/t/op/pack.t
index 1953968d3e..6b4e63484b 100755
--- a/t/op/pack.t
+++ b/t/op/pack.t
@@ -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";
diff --git a/t/op/quotemeta.t b/t/op/quotemeta.t
index 0217a67a93..98265a88d9 100755
--- a/t/op/quotemeta.t
+++ b/t/op/quotemeta.t
@@ -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
diff --git a/t/op/subst.t b/t/op/subst.t
index 3b3bc8d800..70219ab521 100755
--- a/t/op/subst.t
+++ b/t/op/subst.t
@@ -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 8664b8f5e2..c4ecaa8e12 100644
--- 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(';');
diff --git a/unixish.h b/unixish.h
index 2f81294286..2a6cbcdb88 100644
--- a/unixish.h
+++ b/unixish.h
@@ -114,12 +114,16 @@
#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