diff options
-rwxr-xr-x | Configure | 3 | ||||
-rw-r--r-- | README.posix-bc | 108 | ||||
-rw-r--r-- | hints/posix-bc.sh | 33 | ||||
-rw-r--r-- | perl.c | 3 | ||||
-rw-r--r-- | perly.y | 9 | ||||
-rw-r--r-- | proto.h | 4 | ||||
-rwxr-xr-x | t/lib/cgi-html.t | 6 | ||||
-rwxr-xr-x | t/op/magic.t | 2 | ||||
-rwxr-xr-x | t/op/pack.t | 8 | ||||
-rwxr-xr-x | t/op/quotemeta.t | 8 | ||||
-rwxr-xr-x | t/op/subst.t | 8 | ||||
-rw-r--r-- | toke.c | 47 | ||||
-rw-r--r-- | unixish.h | 8 |
13 files changed, 224 insertions, 23 deletions
@@ -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 + @@ -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 @@ -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> '{' ')' @@ -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. @@ -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(';'); @@ -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 |