diff options
author | Todd C. Miller <millert@cvs.openbsd.org> | 1999-04-29 22:53:00 +0000 |
---|---|---|
committer | Todd C. Miller <millert@cvs.openbsd.org> | 1999-04-29 22:53:00 +0000 |
commit | c25c5c3c87d89b68324dc98b7c8aaabc750c7cec (patch) | |
tree | 2943af9b1f84d88d863a9ba36a234877561bf5f0 /gnu/usr.bin/perl/vms | |
parent | 37583d269f066aa8aa04ea18126b188d12257e6d (diff) |
perl5.005_03 (stock)
Diffstat (limited to 'gnu/usr.bin/perl/vms')
-rw-r--r-- | gnu/usr.bin/perl/vms/ext/DCLsym/DCLsym.xs | 2 | ||||
-rw-r--r-- | gnu/usr.bin/perl/vms/ext/DCLsym/Makefile.PL | 3 | ||||
-rw-r--r-- | gnu/usr.bin/perl/vms/ext/Filespec.pm | 11 | ||||
-rw-r--r-- | gnu/usr.bin/perl/vms/ext/Stdio/Stdio.pm | 437 | ||||
-rw-r--r-- | gnu/usr.bin/perl/vms/ext/Stdio/Stdio.xs | 146 | ||||
-rw-r--r-- | gnu/usr.bin/perl/vms/ext/Stdio/test.pl | 32 | ||||
-rw-r--r-- | gnu/usr.bin/perl/vms/ext/filespec.t | 36 | ||||
-rw-r--r-- | gnu/usr.bin/perl/vms/gen_shrfls.pl | 75 | ||||
-rw-r--r-- | gnu/usr.bin/perl/vms/genconfig.pl | 94 | ||||
-rw-r--r-- | gnu/usr.bin/perl/vms/perlvms.pod | 59 | ||||
-rw-r--r-- | gnu/usr.bin/perl/vms/perly_c.vms | 2503 | ||||
-rw-r--r-- | gnu/usr.bin/perl/vms/sockadapt.h | 3 | ||||
-rw-r--r-- | gnu/usr.bin/perl/vms/test.com | 28 | ||||
-rw-r--r-- | gnu/usr.bin/perl/vms/vms.c | 740 | ||||
-rw-r--r-- | gnu/usr.bin/perl/vms/vms_yfix.pl | 5 | ||||
-rw-r--r-- | gnu/usr.bin/perl/vms/vmsish.h | 142 |
16 files changed, 2741 insertions, 1575 deletions
diff --git a/gnu/usr.bin/perl/vms/ext/DCLsym/DCLsym.xs b/gnu/usr.bin/perl/vms/ext/DCLsym/DCLsym.xs index 3918eb11e57..35cabc525ea 100644 --- a/gnu/usr.bin/perl/vms/ext/DCLsym/DCLsym.xs +++ b/gnu/usr.bin/perl/vms/ext/DCLsym/DCLsym.xs @@ -54,7 +54,7 @@ _getsym(name) _ckvmssts(lib$sfree1_dd(&valdsc)); } else { - ST(0) = &sv_undef; /* error - we're returning undef, if anything */ + ST(0) = &PL_sv_undef; /* error - we're returning undef, if anything */ switch (retsts) { case LIB$_NOSUCHSYM: break; /* nobody home */; diff --git a/gnu/usr.bin/perl/vms/ext/DCLsym/Makefile.PL b/gnu/usr.bin/perl/vms/ext/DCLsym/Makefile.PL index 8e6f5bce40a..84ab2be2b52 100644 --- a/gnu/usr.bin/perl/vms/ext/DCLsym/Makefile.PL +++ b/gnu/usr.bin/perl/vms/ext/DCLsym/Makefile.PL @@ -1,3 +1,4 @@ use ExtUtils::MakeMaker; -WriteMakefile( 'VERSION_FROM' => 'DCLsym.pm' ); +WriteMakefile( 'VERSION_FROM' => 'DCLsym.pm', + 'MAN3PODS' => ' '); diff --git a/gnu/usr.bin/perl/vms/ext/Filespec.pm b/gnu/usr.bin/perl/vms/ext/Filespec.pm index db3283c5713..4a539c27016 100644 --- a/gnu/usr.bin/perl/vms/ext/Filespec.pm +++ b/gnu/usr.bin/perl/vms/ext/Filespec.pm @@ -12,7 +12,7 @@ VMS::Filespec - convert between VMS and Unix file specification syntax =head1 SYNOPSIS use VMS::Filespec; -$fullspec = rmsexpand('[.VMS]file.specification'); +$fullspec = rmsexpand('[.VMS]file.specification'[, 'default:[file.spec]']); $vmsspec = vmsify('/my/Unix/file/specification'); $unixspec = unixify('my:[VMS]file.specification'); $path = pathify('my:[VMS.or.Unix.directory]specification.dir'); @@ -65,9 +65,11 @@ The routines provided are: =head2 rmsexpand Uses the RMS $PARSE and $SEARCH services to expand the input -specification to its fully qualified form. (If the file does -not exist, the input specification is expanded as much as -possible.) If an error occurs, returns C<undef> and sets C<$!> +specification to its fully qualified form, except that a null type +or version is not added unless it was present in either the original +file specification or the default specification passed to C<rmsexpand>. +(If the file does not exist, the input specification is expanded as much +as possible.) If an error occurs, returns C<undef> and sets C<$!> and C<$^E>. =head2 vmsify @@ -264,6 +266,7 @@ sub fileify ($) { my($path) = @_; if (!$path) { return undef } + if ($path eq '/') { return 'sys$disk:[000000]'; } if ($path =~ /(.+)\.([^:>\]]*)$/) { $path = $1; if ($2 !~ /^dir(?:;1)?$/i) { return undef } diff --git a/gnu/usr.bin/perl/vms/ext/Stdio/Stdio.pm b/gnu/usr.bin/perl/vms/ext/Stdio/Stdio.pm index 218c406fa44..04b339725fb 100644 --- a/gnu/usr.bin/perl/vms/ext/Stdio/Stdio.pm +++ b/gnu/usr.bin/perl/vms/ext/Stdio/Stdio.pm @@ -1,8 +1,9 @@ # VMS::Stdio - VMS extensions to Perl's stdio calls # # Author: Charles Bailey bailey@genetics.upenn.edu -# Version: 2.02 -# Revised: 15-Feb-1997 +# Version: 2.1 +# Revised: 24-Mar-1998 +# Docs revised: 13-Oct-1998 Dan Sugalski <sugalskd@ous.edu> package VMS::Stdio; @@ -12,17 +13,18 @@ use Carp '&croak'; use DynaLoader (); use Exporter (); -$VERSION = '2.02'; +$VERSION = '2.1'; @ISA = qw( Exporter DynaLoader IO::File ); @EXPORT = qw( &O_APPEND &O_CREAT &O_EXCL &O_NDELAY &O_NOWAIT &O_RDONLY &O_RDWR &O_TRUNC &O_WRONLY ); -@EXPORT_OK = qw( &flush &getname &remove &rewind &sync &tmpnam - &vmsopen &vmssysopen &waitfh ); +@EXPORT_OK = qw( &flush &getname &remove &rewind &sync &setdef &tmpnam + &vmsopen &vmssysopen &waitfh &writeof ); %EXPORT_TAGS = ( CONSTANTS => [ qw( &O_APPEND &O_CREAT &O_EXCL &O_NDELAY &O_NOWAIT &O_RDONLY &O_RDWR &O_TRUNC &O_WRONLY ) ], - FUNCTIONS => [ qw( &flush &getname &remove &rewind &sync - &tmpnam &vmsopen &vmssysopen &waitfh ) ] ); + FUNCTIONS => [ qw( &flush &getname &remove &rewind &setdef + &sync &tmpnam &vmsopen &vmssysopen + &waitfh &writeof ) ] ); bootstrap VMS::Stdio $VERSION; @@ -32,7 +34,7 @@ sub AUTOLOAD { if ($constname =~ /^O_/) { my($val) = constant($constname); defined $val or croak("Unknown VMS::Stdio constant $constname"); - *$AUTOLOAD = sub { val; } + *$AUTOLOAD = sub { $val; } } else { # We don't know about it; hand off to IO::File require IO::File; @@ -80,22 +82,24 @@ VMS::Stdio - standard I/O functions via VMS extensions =head1 SYNOPSIS -use VMS::Stdio qw( &flush &getname &remove &rewind &sync &tmpnam - &vmsopen &vmssysopen &waitfh ); -$uniquename = tmpnam; -$fh = vmsopen("my.file","rfm=var","alq=100",...) or die $!; -$name = getname($fh); -print $fh "Hello, world!\n"; -flush($fh); -sync($fh); -rewind($fh); -$line = <$fh>; -undef $fh; # closes file -$fh = vmssysopen("another.file", O_RDONLY | O_NDELAY, 0, "ctx=bin"); -sysread($fh,$data,128); -waitfh($fh); -close($fh); -remove("another.file"); + use VMS::Stdio qw( &flush &getname &remove &rewind &setdef &sync &tmpnam + &vmsopen &vmssysopen &waitfh &writeof ); + setdef("new:[default.dir]"); + $uniquename = tmpnam; + $fh = vmsopen("my.file","rfm=var","alq=100",...) or die $!; + $name = getname($fh); + print $fh "Hello, world!\n"; + flush($fh); + sync($fh); + rewind($fh); + $line = <$fh>; + undef $fh; # closes file + $fh = vmssysopen("another.file", O_RDONLY | O_NDELAY, 0, "ctx=bin"); + sysread($fh,$data,128); + waitfh($fh); + close($fh); + remove("another.file"); + writeof($pipefh); =head1 DESCRIPTION @@ -175,6 +179,13 @@ to the beginning of the file. It's really just a convenience method equivalent in effect to C<seek($fh,0,0)>. It returns a true value if successful, and C<undef> if it fails. +=item setdef + +This function sets the default device and directory for the process. +It is identical to the built-in chdir() operator, except that the change +persists after Perl exits. It returns a true value on success, and +C<undef> if it encounters and error. + =item sync This function flushes buffered data for the specified file handle @@ -212,6 +223,373 @@ as a normal Perl file handle only. When the scalar containing a VMS::Stdio file handle is overwritten, C<undef>d, or goes out of scope, the associated file is closed automatically. +=over 4 + +=head2 File characteristic options + +=over 2 + +=item alq=INTEGER + +Sets the allocation quantity for this file + +=item bls=INTEGER + +File blocksize + +=item ctx=STRING + +Sets the context for the file. Takes one of these arguments: + +=over 4 + +=item bin + +Disables LF to CRLF translation + +=item cvt + +Negates previous setting of C<ctx=noctx> + +=item nocvt + +Disables conversion of FORTRAN carriage control + +=item rec + +Force record-mode access + +=item stm + +Force stream mode + +=item xplct + +Causes records to be flushed I<only> when the file is closed, or when an +explicit flush is done + +=back + +=item deq=INTEGER + +Sets the default extension quantity + +=item dna=FILESPEC + +Sets the default filename string. Used to fill in any missing pieces of the +filename passed. + +=item fop=STRING + +File processing option. Takes one or more of the following (in a +comma-separated list if there's more than one) + +=over 4 + +=item ctg + +Contiguous. + +=item cbt + +Contiguous-best-try. + +=item dfw + +Deferred write; only applicable to files opened for shared access. + +=item dlt + +Delete file on close. + +=item tef + +Truncate at end-of-file. + +=item cif + +Create if nonexistent. + +=item sup + +Supersede. + +=item scf + +Submit as command file on close. + +=item spl + +Spool to system printer on close. + +=item tmd + +Temporary delete. + +=item tmp + +Temporary (no file directory). + +=item nef + +Not end-of-file. + +=item rck + +Read check compare operation. + +=item wck + +Write check compare operation. + +=item mxv + +Maximize version number. + +=item rwo + +Rewind file on open. + +=item pos + +Current position. + +=item rwc + +Rewind file on close. + +=item sqo + +File can only be processed in a sequential manner. + +=back + +=item fsz=INTEGER + +Fixed header size + +=item gbc=INTEGER + +Global buffers requested for the file + +=item mbc=INTEGER + +Multiblock count + +=item mbf=INTEGER + +Bultibuffer count + +=item mrs=INTEGER + +Maximum record size + +=item rat=STRING + +File record attributes. Takes one of the following: + +=over 4 + +=item cr + +Carriage-return control. + +=item blk + +Disallow records to span block boundaries. + +=item ftn + +FORTRAN print control. + +=item none + +Explicitly forces no carriage control. + +=item prn + +Print file format. + +=back + +=item rfm=STRING + +File record format. Takes one of the following: + +=over 4 + +=item fix + +Fixed-length record format. + +=item stm + +RMS stream record format. + +=item stmlf + +Stream format with line-feed terminator. + +=item stmcr + +Stream format with carriage-return terminator. + +=item var + +Variable-length record format. + +=item vfc + +Variable-length record with fixed control. + +=item udf + +Undefined format + +=back + +=item rop=STRING + +Record processing operations. Takes one or more of the following in a +comma-separated list: + +=over 4 + +=item asy + +Asynchronous I/O. + +=item cco + +Cancel Ctrl/O (used with Terminal I/O). + +=item cvt + +Capitalizes characters on a read from the terminal. + +=item eof + +Positions the record stream to the end-of-file for the connect operation +only. + +=item nlk + +Do not lock record. + +=item pmt + +Enables use of the prompt specified by pmt=usr-prmpt on input from the +terminal. + +=item pta + +Eliminates any information in the type-ahead buffer on a read from the +terminal. + +=item rea + +Locks record for a read operation for this process, while allowing other +accessors to read the record. + +=item rlk + +Locks record for write. + +=item rne + +Suppresses echoing of input data on the screen as it is entered on the +keyboard. + +=item rnf + +Indicates that Ctrl/U, Ctrl/R, and DELETE are not to be considered control +commands on terminal input, but are to be passed to the application +program. + +=item rrl + +Reads regardless of lock. + +=item syncsts + +Returns success status of RMS$_SYNCH if the requested service completes its +task immediately. + +=item tmo + +Timeout I/O. + +=item tpt + +Allows put/write services using sequential record access mode to occur at +any point in the file, truncating the file at that point. + +=item ulk + +Prohibits RMS from automatically unlocking records. + +=item wat + +Wait until record is available, if currently locked by another stream. + +=item rah + +Read ahead. + +=item wbh + +Write behind. + +=back + +=item rtv=INTEGER + +The number of retrieval pointers that RMS has to maintain (0 to 127255) + +=item shr=STRING + +File sharing options. Choose one of the following: + +=over 4 + +=item del + +Allows users to delete. + +=item get + +Allows users to read. + +=item mse + +Allows mainstream access. + +=item nil + +Prohibits file sharing. + +=item put + +Allows users to write. + +=item upd + +Allows users to update. + +=item upi + +Allows one or more writers. + +=back + +=item tmo=INTEGER + +I/O timeout value + +=back + +=back + =item vmssysopen This function bears the same relationship to the CORE function @@ -231,8 +609,17 @@ operation on the file handle specified as its argument. It is used with handles opened for asynchronous I/O, and performs its task by calling the CRTL routine fwait(). +=item writeof + +This function writes an EOF to a file handle, if the device driver +supports this operation. Its primary use is to send an EOF to a +subprocess through a pipe opened for writing without closing the +pipe. It returns a true value if successful, and C<undef> if +it encounters an error. + =head1 REVISION -This document was last revised on 10-Dec-1996, for Perl 5.004. +This document was last revised on 13-Oct-1998, for Perl 5.004, 5.005, and +5.006. =cut diff --git a/gnu/usr.bin/perl/vms/ext/Stdio/Stdio.xs b/gnu/usr.bin/perl/vms/ext/Stdio/Stdio.xs index b10fec0d485..53b491575dc 100644 --- a/gnu/usr.bin/perl/vms/ext/Stdio/Stdio.xs +++ b/gnu/usr.bin/perl/vms/ext/Stdio/Stdio.xs @@ -1,8 +1,8 @@ /* VMS::Stdio - VMS extensions to stdio routines * - * Version: 2.02 + * Version: 2.1 * Author: Charles Bailey bailey@genetics.upenn.edu - * Revised: 15-Feb-1997 + * Revised: 24-Mar-1998 * */ @@ -10,6 +10,9 @@ #include "perl.h" #include "XSUB.h" #include <file.h> +#include <iodef.h> +#include <rms.h> +#include <starlet.h> static bool constant(name, pval) @@ -84,16 +87,17 @@ newFH(FILE *fp, char type) { HV *stash; IO *io; + dTHR; /* Find stash for VMS::Stdio. We don't do this once at boot * to allow for possibility of threaded Perl with per-thread * symbol tables. This code (through io = ...) is really * equivalent to gv_fetchpv("VMS::Stdio::__FH__",TRUE,SVt_PVIO), * with a little less overhead, and good exercise for me. :-) */ - stashp = (GV **)hv_fetch(defstash,"VMS::",5,TRUE); - if (!stashp || *stashp == (GV *)&sv_undef) return Nullsv; + stashp = (GV **)hv_fetch(PL_defstash,"VMS::",5,TRUE); + if (!stashp || *stashp == (GV *)&PL_sv_undef) return Nullsv; if (!(stash = GvHV(*stashp))) stash = GvHV(*stashp) = newHV(); stashp = (GV **)hv_fetch(GvHV(*stashp),"Stdio::",7,TRUE); - if (!stashp || *stashp == (GV *)&sv_undef) return Nullsv; + if (!stashp || *stashp == (GV *)&PL_sv_undef) return Nullsv; if (!(stash = GvHV(*stashp))) stash = GvHV(*stashp) = newHV(); /* Set up GV to point to IO, and then take reference */ @@ -118,24 +122,22 @@ constant(name) if (constant(name, &i)) ST(0) = sv_2mortal(newSViv(i)); else - ST(0) = &sv_undef; + ST(0) = &PL_sv_undef; void -flush(sv) - SV * sv +flush(fp) + FILE * fp PROTOTYPE: $ CODE: - FILE *fp = Nullfp; - if (SvOK(sv)) fp = IoIFP(sv_2io(sv)); - if (fflush(fp)) { ST(0) = &sv_undef; } - else { clearerr(fp); ST(0) = &sv_yes; } + if (fflush(fp)) { ST(0) = &PL_sv_undef; } + else { clearerr(fp); ST(0) = &PL_sv_yes; } char * getname(fp) FILE * fp PROTOTYPE: $ CODE: - char fname[257]; + char fname[NAM$C_MAXRSS+1]; ST(0) = sv_newmortal(); if (fgetname(fp,fname) != NULL) sv_setpv(ST(0),fname); @@ -144,22 +146,76 @@ rewind(fp) FILE * fp PROTOTYPE: $ CODE: - ST(0) = rewind(fp) ? &sv_undef : &sv_yes; + ST(0) = rewind(fp) ? &PL_sv_undef : &PL_sv_yes; void remove(name) char *name PROTOTYPE: $ CODE: - ST(0) = remove(name) ? &sv_undef : &sv_yes; + ST(0) = remove(name) ? &PL_sv_undef : &PL_sv_yes; + +void +setdef(...) + PROTOTYPE: @ + CODE: + char vmsdef[NAM$C_MAXRSS+1], es[NAM$C_MAXRSS], sep; + unsigned long int retsts; + struct FAB deffab = cc$rms_fab; + struct NAM defnam = cc$rms_nam; + struct dsc$descriptor_s dirdsc = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0}; + STRLEN n_a; + if (items) { + SV *defsv = ST(items-1); /* mimic chdir() */ + ST(0) = &PL_sv_undef; + if (!SvPOK(defsv)) { SETERRNO(EINVAL,LIB$_INVARG); XSRETURN(1); } + if (tovmsspec(SvPV(defsv,n_a),vmsdef) == NULL) { XSRETURN(1); } + deffab.fab$l_fna = vmsdef; deffab.fab$b_fns = strlen(vmsdef); + } + else { + deffab.fab$l_fna = "SYS$LOGIN"; deffab.fab$b_fns = 9; + EXTEND(sp,1); ST(0) = &PL_sv_undef; + } + defnam.nam$l_esa = es; defnam.nam$b_ess = sizeof es; + deffab.fab$l_nam = &defnam; + retsts = sys$parse(&deffab,0,0); + if (retsts & 1) { + if (defnam.nam$v_wildcard) retsts = RMS$_WLD; + else if (defnam.nam$b_name || defnam.nam$b_type > 1 || + defnam.nam$b_ver > 1) retsts = RMS$_DIR; + } + defnam.nam$b_nop |= NAM$M_SYNCHK; defnam.nam$l_rlf = NULL; deffab.fab$b_dns = 0; + if (!(retsts & 1)) { + set_vaxc_errno(retsts); + switch (retsts) { + case RMS$_DNF: + set_errno(ENOENT); break; + case RMS$_SYN: case RMS$_DIR: case RMS$_DEV: + set_errno(EINVAL); break; + case RMS$_PRV: + set_errno(EACCES); break; + default: + set_errno(EVMSERR); break; + } + (void) sys$parse(&deffab,0,0); /* free up context */ + XSRETURN(1); + } + sep = *defnam.nam$l_dir; + *defnam.nam$l_dir = '\0'; + my_setenv("SYS$DISK",defnam.nam$b_node ? defnam.nam$l_node : defnam.nam$l_dev); + *defnam.nam$l_dir = sep; + dirdsc.dsc$a_pointer = defnam.nam$l_dir; dirdsc.dsc$w_length = defnam.nam$b_dir; + if ((retsts = sys$setddir(&dirdsc,0,0)) & 1) ST(0) = &PL_sv_yes; + else { set_errno(EVMSERR); set_vaxc_errno(retsts); } + (void) sys$parse(&deffab,0,0); /* free up context */ void sync(fp) FILE * fp PROTOTYPE: $ CODE: - if (fsync(fileno(fp))) { ST(0) = &sv_undef; } - else { clearerr(fp); ST(0) = &sv_yes; } + if (fsync(fileno(fp))) { ST(0) = &PL_sv_undef; } + else { clearerr(fp); ST(0) = &PL_sv_yes; } char * tmpnam() @@ -177,6 +233,7 @@ vmsopen(spec,...) char *args[8],mode[3] = {'r','\0','\0'}, type = '<'; register int i, myargc; FILE *fp; + STRLEN n_a; if (!spec || !*spec) { SETERRNO(EINVAL,LIB$_INVARG); @@ -195,7 +252,7 @@ vmsopen(spec,...) } else if (*spec == '<') spec++; myargc = items - 1; - for (i = 0; i < myargc; i++) args[i] = SvPV(ST(i+1),na); + for (i = 0; i < myargc; i++) args[i] = SvPV(ST(i+1),n_a); /* This hack brought to you by C's opaque arglist management */ switch (myargc) { case 0: @@ -228,9 +285,9 @@ vmsopen(spec,...) } if (fp != Nullfp) { SV *fh = newFH(fp,(mode[1] ? '+' : (mode[0] == 'r' ? '<' : (mode[0] == 'a' ? 'a' : '>')))); - ST(0) = (fh ? sv_2mortal(fh) : &sv_undef); + ST(0) = (fh ? sv_2mortal(fh) : &PL_sv_undef); } - else { ST(0) = &sv_undef; } + else { ST(0) = &PL_sv_undef; } void vmssysopen(spec,mode,perm,...) @@ -243,13 +300,14 @@ vmssysopen(spec,mode,perm,...) int i, myargc, fd; FILE *fp; SV *fh; + STRLEN n_a; if (!spec || !*spec) { SETERRNO(EINVAL,LIB$_INVARG); XSRETURN_UNDEF; } if (items > 11) croak("too many args"); myargc = items - 3; - for (i = 0; i < myargc; i++) args[i] = SvPV(ST(i+3),na); + for (i = 0; i < myargc; i++) args[i] = SvPV(ST(i+3),n_a); /* More fun with C calls; can't combine with above because args 2,3 of different types in fopen() and open() */ switch (myargc) { @@ -285,13 +343,53 @@ vmssysopen(spec,mode,perm,...) if (fd >= 0 && ((fp = fdopen(fd, &("r\000w\000r+"[2*i]))) != Nullfp)) { SV *fh = newFH(fp,"<>++"[i]); - ST(0) = (fh ? sv_2mortal(fh) : &sv_undef); + ST(0) = (fh ? sv_2mortal(fh) : &PL_sv_undef); } - else { ST(0) = &sv_undef; } + else { ST(0) = &PL_sv_undef; } void waitfh(fp) FILE * fp PROTOTYPE: $ CODE: - ST(0) = fwait(fp) ? &sv_undef : &sv_yes; + ST(0) = fwait(fp) ? &PL_sv_undef : &PL_sv_yes; + +void +writeof(mysv) + SV * mysv + PROTOTYPE: $ + CODE: + char devnam[257], *cp; + unsigned long int chan, iosb[2], retsts, retsts2; + struct dsc$descriptor devdsc = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, devnam}; + IO *io = sv_2io(mysv); + FILE *fp = io ? IoOFP(io) : NULL; + if (fp == NULL || strchr(">was+-|",IoTYPE(io)) == Nullch) { + set_errno(EBADF); set_vaxc_errno(SS$_IVCHAN); + ST(0) = &PL_sv_undef; XSRETURN(1); + } + if (fgetname(fp,devnam) == Nullch) { ST(0) = &PL_sv_undef; XSRETURN(1); } + if ((cp = strrchr(devnam,':')) != NULL) *(cp+1) = '\0'; + devdsc.dsc$w_length = strlen(devnam); + retsts = sys$assign(&devdsc,&chan,0,0); + if (retsts & 1) retsts = sys$qiow(0,chan,IO$_WRITEOF,iosb,0,0,0,0,0,0,0,0); + if (retsts & 1) retsts = iosb[0]; + retsts2 = sys$dassgn(chan); /* Be sure to deassign the channel */ + if (retsts & 1) retsts = retsts2; + if (retsts & 1) { ST(0) = &PL_sv_yes; } + else { + set_vaxc_errno(retsts); + switch (retsts) { + case SS$_EXQUOTA: case SS$_INSFMEM: case SS$_MBFULL: + case SS$_MBTOOSML: case SS$_NOIOCHAN: case SS$_NOLINKS: + case SS$_BUFFEROVF: + set_errno(ENOSPC); break; + case SS$_ILLIOFUNC: case SS$_DEVOFFLINE: case SS$_NOSUCHDEV: + set_errno(EBADF); break; + case SS$_NOPRIV: + set_errno(EACCES); break; + default: /* Includes "shouldn't happen" cases that might map */ + set_errno(EVMSERR); break; /* to other errno values */ + } + ST(0) = &PL_sv_undef; + } diff --git a/gnu/usr.bin/perl/vms/ext/Stdio/test.pl b/gnu/usr.bin/perl/vms/ext/Stdio/test.pl index 0b50d63e3aa..37131deb01e 100644 --- a/gnu/usr.bin/perl/vms/ext/Stdio/test.pl +++ b/gnu/usr.bin/perl/vms/ext/Stdio/test.pl @@ -1,8 +1,8 @@ -# Tests for VMS::Stdio v2.01 +# Tests for VMS::Stdio v2.1 use VMS::Stdio; -import VMS::Stdio qw(&flush &getname &rewind &sync); +import VMS::Stdio qw(&flush &getname &rewind &sync &tmpnam); -print "1..14\n"; +print "1..18\n"; print +(defined(&getname) ? '' : 'not '), "ok 1\n"; $name = "test$$"; @@ -42,3 +42,29 @@ undef $sfh; print +(stat("$name.tmp") ? 'not ' : ''),"ok 13\n"; print +(&VMS::Stdio::tmpnam ? '' : 'not '),"ok 14\n"; + +#if (open(P, qq[| MCR $^X -e "1 while (<STDIN>);print 'Foo';1 while (<STDIN>); print 'Bar'" >$name.tmp])) { +# print P "Baz\nQuux\n"; +# print +(VMS::Stdio::writeof(P) ? '' : 'not '),"ok 15\n"; +# print P "Baz\nQuux\n"; +# print +(close(P) ? '' : ''),"ok 16\n"; +# $fh = VMS::Stdio::vmsopen("$name.tmp"); +# chomp($line = <$fh>); +# close $fh; +# unlink("$name.tmp"); +# print +($line eq 'FooBar' ? '' : 'not '),"ok 17\n"; +#} +#else { +print "ok 15\nok 16\nok 17\n"; +#} + +$sfh = VMS::Stdio::vmsopen(">$name.tmp"); +$setuperl = "\$ MCR $^X\nBEGIN { \@INC = qw(@INC) };\nuse VMS::Stdio qw(&setdef);"; +print $sfh qq[\$ here = F\$Environment("Default")\n]; +print $sfh "$setuperl\nsetdef();\n\$ Show Default\n\$ Set Default 'here'\n"; +print $sfh "$setuperl\nsetdef('..');\n\$ Show Default\n"; +close $sfh; +@defs = map { /(\S+)/ && $1 } `\@$name.tmp`; +unlink("$name.tmp"); +print +($defs[0] eq uc($ENV{'SYS$LOGIN'}) ? '' : "not ($defs[0]) "),"ok 18\n"; +#print +($defs[1] eq VMS::Filespec::rmsexpand('[-]') ? '' : "not ($defs[1]) "),"ok 19\n"; diff --git a/gnu/usr.bin/perl/vms/ext/filespec.t b/gnu/usr.bin/perl/vms/ext/filespec.t index 6201a42dc69..779396be731 100644 --- a/gnu/usr.bin/perl/vms/ext/filespec.t +++ b/gnu/usr.bin/perl/vms/ext/filespec.t @@ -10,7 +10,7 @@ foreach (<DATA>) { next if /^\s*$/; push(@tests,$_); } -print '1..',scalar(@tests)+3,"\n"; +print '1..',scalar(@tests)+6,"\n"; foreach $test (@tests) { ($arg,$func,$expect) = split(/\t+/,$test); @@ -25,14 +25,17 @@ foreach $test (@tests) { } } +$defwarn = <<'EOW'; +# Note: This failure may have occurred because your default device +# was set using a non-concealed logical name. If this is the case, +# you will need to determine by inspection that the two resultant +# file specifications shwn above are in fact equivalent. +EOW + if (rmsexpand('[]') eq "\U$ENV{DEFAULT}") { print 'ok ',++$idx,"\n"; } else { print 'not ok ', ++$idx, ": rmsexpand('[]') = |", rmsexpand('[]'), - "|, \$ENV{DEFAULT} = |\U$ENV{DEFAULT}|\n"; - print "# Note: This failure may have occurred because your default device\n"; - print "# was set using a non-concealed logical name. If this is the case,\n"; - print "# you will need to determine by inspection that the two resultant\n"; - print "# file specifications shwn above are in fact equivalent.\n"; + "|, \$ENV{DEFAULT} = |\U$ENV{DEFAULT}|\n$defwarn"; } if (rmsexpand('from.here') eq "\L$ENV{DEFAULT}from.here") { print 'ok ', ++$idx, "\n"; @@ -40,11 +43,15 @@ if (rmsexpand('from.here') eq "\L$ENV{DEFAULT}from.here") { else { print 'not ok ', ++$idx, ": rmsexpand('from.here') = |", rmsexpand('from.here'), - "|, \$ENV{DEFAULT}from.here = |\L$ENV{DEFAULT}from.here|\n"; - print "# Note: This failure may have occurred because your default device\n"; - print "# was set using a non-concealed logical name. If this is the case,\n"; - print "# you will need to determine by inspection that the two resultant\n"; - print "# file specifications shwn above are in fact equivalent.\n"; + "|, \$ENV{DEFAULT}from.here = |\L$ENV{DEFAULT}from.here|\n$defwarn"; +} +if (rmsexpand('from') eq "\L$ENV{DEFAULT}from") { + print 'ok ', ++$idx, "\n"; +} +else { + print 'not ok ', ++$idx, ": rmsexpand('from') = |", + rmsexpand('from'), + "|, \$ENV{DEFAULT}from = |\L$ENV{DEFAULT}from|\n$defwarn"; } if (rmsexpand('from.here','cant:[get.there];2') eq 'cant:[get.there]from.here;2') { print 'ok ',++$idx,"\n"; } @@ -53,6 +60,11 @@ else { rmsexpand('from.here','cant:[get.there];2'),"|\n"; } +# Make sure we're using redirected mkdir, which strips trailing '/', since +# the CRTL's mkdir can't handle this. +print +(mkdir('testdir/',0777) ? 'ok ' : 'not ok '),++$idx,"\n"; +print +(rmdir('testdir/') ? 'ok ' : 'not ok '),++$idx,"\n"; + __DATA__ # Basic VMS to Unix filespecs @@ -84,6 +96,7 @@ some/where/... vmsify [.some.where...] .. vmsify [-] ../.. vmsify [--] .../ vmsify [...] +/ vmsify sys$disk:[000000] # Fileifying directory specs down:[the.garden.path] fileify down:[the.garden]path.dir;1 @@ -123,6 +136,7 @@ down:[the.garden.path...] unixpath /down/the/garden/path/.../ [.down.the.garden]path.dir unixpath down/the/garden/path/ down/the/garden/path vmspath [.down.the.garden.path] path vmspath [.path] +/ vmspath sys$disk:[000000] # Redundant characters in Unix paths //some/where//over/../the.rainbow vmsify some:[where]the.rainbow diff --git a/gnu/usr.bin/perl/vms/gen_shrfls.pl b/gnu/usr.bin/perl/vms/gen_shrfls.pl index e451e1826b6..43029692b2b 100644 --- a/gnu/usr.bin/perl/vms/gen_shrfls.pl +++ b/gnu/usr.bin/perl/vms/gen_shrfls.pl @@ -39,7 +39,7 @@ require 5.000; $debug = $ENV{'GEN_SHRFLS_DEBUG'}; -print "gen_shrfls.pl Rev. 14-Dec-1996\n" if $debug; +print "gen_shrfls.pl Rev. 14-Dec-1997\n" if $debug; if ($ARGV[0] eq '-f') { open(INP,$ARGV[1]) or die "Can't read input file $ARGV[1]: $!\n"; @@ -64,10 +64,24 @@ $docc = ($cc_cmd !~ /^~~/); print "\$docc = $docc\n" if $debug; if ($docc) { + if (-f 'perl.h') { $dir = '[]'; } + elsif (-f '[-]perl.h') { $dir = '[-]'; } + else { die "$0: Can't find perl.h\n"; } + + # Go see if debugging is enabled in config.h + $config = $dir . "config.h"; + open CONFIG, "< $config"; + while(<CONFIG>) { + $debugging_enabled++ if /define\s+DEBUGGING/; + $hide_mymalloc++ if /define\s+EMBEDMYMALLOC/; + $use_mymalloc++ if /define\s+MYMALLOC/; + } + # put quotes back onto defines - they were removed by DCL on the way in if (($prefix,$defines,$suffix) = ($cc_cmd =~ m#(.*)/Define=(.*?)([/\s].*)#i)) { $defines =~ s/^\((.*)\)$/$1/; + $debugging_enabled ||= $defines =~ /\bDEBUGGING\b/; @defines = split(/,/,$defines); $cc_cmd = "$prefix/Define=(" . join(',',grep($_ = "\"$_\"",@defines)) . ')' . $suffix; @@ -85,10 +99,8 @@ if ($docc) { or 0; # again, make debug output nice print "\$isgcc: $isgcc\n" if $debug; print "\$isvaxc: $isvaxc\n" if $debug; + print "\$debugging_enabled: $debugging_enabled\n" if $debug; - if (-f 'perl.h') { $dir = '[]'; } - elsif (-f '[-]perl.h') { $dir = '[-]'; } - else { die "$0: Can't find perl.h\n"; } } else { ($junk,$junk,$cpp_file,$cc_cmd) = split(/~~/,$cc_cmd,4); @@ -96,8 +108,10 @@ else { or 0; # for nice debug output $isvaxc = (!$isgcc && $cc_cmd !~ /standard=/i) or 0; # again, for nice debug output + $debugging_enabled = $cc_cmd =~ /\bdebugging\b/i; print "\$isgcc: \\$isgcc\\\n" if $debug; print "\$isvaxc: \\$isvaxc\\\n" if $debug; + print "\$debugging_enabled: \\$debugging_enabled\\\n" if $debug; print "Not running cc, preprocesor output in \\$cpp_file\\\n" if $debug; } @@ -150,6 +164,7 @@ sub scan_var { $line =~ s/\[.*//; $line =~ s/=.*//; $line =~ s/\W*;?\s*$//; + $line =~ s/\W*\)\s*\(.*$//; # closing paren for args stripped in previous stmt print "\tfiltered to \\$line\\\n" if $debug > 1; if ($line =~ /(\w+)$/) { print "\tvar name is \\$1\\" . ($const ? ' (const)' : '') . "\n" if $debug > 1; @@ -183,6 +198,14 @@ sub scan_func { } } +# Go add some right up front if we need 'em +if ($use_mymalloc) { + $fcns{'Perl_malloc'}++; + $fcns{'Perl_calloc'}++; + $fcns{'Perl_realloc'}++; + $fcns{'Perl_myfree'}++; +} + $used_expectation_enum = $used_opcode_enum = 0; # avoid warnings if ($docc) { open(CPP,"${cc_cmd}/NoObj/PreProc=Sys\$Output ${dir}perl.h|") @@ -191,38 +214,51 @@ if ($docc) { else { open(CPP,"$cpp_file") or die "$0: Can't read preprocessed file $cpp_file: $!\n"; } +%checkh = map { $_,1 } qw( thread bytecode byterun proto ); +$ckfunc = 0; LINE: while (<CPP>) { while (/^#.*vmsish\.h/i .. /^#.*perl\.h/i) { while (/__VMS_PROTOTYPES__/i .. /__VMS_SEPYTOTORP__/i) { print "vms_proto>> $_" if $debug > 2; if (/^\s*EXT/) { &scan_var($_); } else { &scan_func($_); } - last LINE unless $_ = <CPP>; + last LINE unless defined($_ = <CPP>); } print "vmsish.h>> $_" if $debug > 2; if (/^\s*EXT/) { &scan_var($_); } - last LINE unless $_ = <CPP>; + last LINE unless defined($_ = <CPP>); } while (/^#.*opcode\.h/i .. /^#.*perl\.h/i) { print "opcode.h>> $_" if $debug > 2; if (/^OP \*\s/) { &scan_func($_); } if (/^\s*EXT/) { &scan_var($_); } if (/^\s+OP_/) { &scan_enum($_); } - last LINE unless $_ = <CPP>; + last LINE unless defined($_ = <CPP>); } - while (/^typedef enum/ .. /^\}/) { + while (/^typedef enum/ .. /^\s*\}/) { print "global enum>> $_" if $debug > 2; &scan_enum($_); - last LINE unless $_ = <CPP>; + last LINE unless defined($_ = <CPP>); + } + # Check for transition to new header file + if (/^# \d+ "(\S+)"/) { + my $spec = $1; + # Pull name from library module or header filespec + $spec =~ /^(\w+)$/ or $spec =~ /(\w+)\.h/i; + my $name = lc $1; + $ckfunc = exists $checkh{$name} ? 1 : 0; + $scanname = $name if $ckfunc; + print "Header file transition: ckfunc = $ckfunc for $name.h\n" if $debug > 1; } - while (/^#.*proto\.h/i .. /^#.*perl\.h/i) { - print "proto.h>> $_" if $debug > 2; + if ($ckfunc) { + print "$scanname>> $_" if $debug > 2; if (/\s*^EXT/) { &scan_var($_); } - else { &scan_func($_); } - last LINE unless $_ = <CPP>; + else { &scan_func($_); } + } + else { + print $_ if $debug > 3 && ($debug > 5 || length($_)); + if (/^\s*EXT/) { &scan_var($_); } } - print $_ if $debug > 3 && ($debug > 5 || length($_)); - if (/^\s*EXT/) { &scan_var($_); } } close CPP; @@ -241,6 +277,7 @@ while (<DATA>) { print "Adding $key to \%$array list\n" if $debug > 1; ${$array}{$key}++; } +if ($debugging_enabled and $isgcc) { $vars{'colors'}++ } foreach (split /\s+/, $extnames) { my($pkgname) = $_; $pkgname =~ s/::/__/g; @@ -371,9 +408,8 @@ if ($ENV{PERLSHR_USE_GSMATCH}) { my $major = int($] * 1000) & 0xFF; # range 0..255 my $minor = int(($] * 1000 - $major) * 100 + 0.5) & 0xFF; # range 0..255 print OPTBLD "GSMATCH=LEQUAL,$major,$minor\n"; - foreach (@symfiles) { - print OPTBLD "CLUSTER=\$\$TRANSFER_VECTOR,,,$_.$objsuffix\n"; - } + print OPTBLD 'CLUSTER=$$TRANSFER_VECTOR,,', + map(",$_$objsuffix",@symfiles), "\n"; } elsif (@symfiles) { $incstr .= ',' . join(',',@symfiles); } # Include object modules and RTLs in options file @@ -391,9 +427,6 @@ exec "\$ \@$drvrname" if $isvax; __END__ # Oddball cases, so we can keep the perl.h scan above simple -rcsid=vars # declared in perl.c -regarglen=vars # declared in regcomp.h -regdummy=vars # declared in regcomp.h regkind=vars # declared in regcomp.h simple=vars # declared in regcomp.h varies=vars # declared in regcomp.h diff --git a/gnu/usr.bin/perl/vms/genconfig.pl b/gnu/usr.bin/perl/vms/genconfig.pl index d2e514b1c9e..45f50cad5fe 100644 --- a/gnu/usr.bin/perl/vms/genconfig.pl +++ b/gnu/usr.bin/perl/vms/genconfig.pl @@ -6,7 +6,7 @@ # that went into your perl binary. In addition, values which change from run # to run may be supplied on the command line as key=val pairs. # -# Rev. 3-Dec-1996 Charles Bailey bailey@genetics.upenn.edu +# Rev. 16-Feb-1998 Charles Bailey bailey@newman.upenn.edu # #==== Locations of installed Perl components @@ -26,6 +26,7 @@ if ($ARGV[0] eq '-f') { open(ARGS,$ARGV[1]) or die "Can't read data from $ARGV[1]: $!\n"; @ARGV = (); while (<ARGS>) { + chomp; push(@ARGV,split(/\|/,$_)); } close ARGS; @@ -67,21 +68,20 @@ package='perl5' CONFIG='true' cf_time='$time' cf_by='$cf_by' -ccdlflags='' -cccdlflags='' -mab='' +ccdlflags='undef' +cccdlflags='undef' +mab='undef' libpth='/sys\$share /sys\$library' ld='Link' lddlflags='/Share' -ranlib='' -ar='' +ranlib='undef' +ar='undef' eunicefix=':' hint='none' -hintfile='' -shrplib='define' +hintfile='undef' +useshrplib='define' usemymalloc='n' usevfork='true' -useposix='false' spitshell='write sys\$output ' dlsrc='dl_vms.c' binexp='$installbin' @@ -89,6 +89,8 @@ man1ext='rno' man3ext='rno' arch='VMS_$archsufx' archname='VMS_$archsufx' +bincompat3='undef' +d_bincompat3='undef' osvers='$osvers' prefix='$prefix' builddir='$builddir' @@ -146,24 +148,91 @@ foreach (@ARGV) { # object file suffix if it's not .obj. $ccflags =~ s#/obj(?:ect)?=[^/\s]+##i; } + $debug = $optimize = ''; + while ( ($qual) = $ccflags =~ m|(/(No)?Deb[^/]*)|i ) { + $debug = $qual; + $ccflags =~ s/$qual//; + } + while ( ($qual) = $ccflags =~ m|(/(No)?Opt[^/]*)|i ) { + $optimize = $qual; + $ccflags =~ s/$qual//; + } + $usethreads = ($ccflags =~ m!/DEF[^/]+USE_THREADS!i and + $ccflags !~ m!/UND[^/]+USE_THREADS!i); + print OUT "usethreads='",($usethreads ? 'define' : 'undef'),"'\n";; + $optimize = "$debug$optimize"; print OUT "ccflags='$ccflags'\n"; + print OUT "optimize='$optimize'\n"; $dosock = ($ccflags =~ m!/DEF[^/]+VMS_DO_SOCKETS!i and $ccflags !~ m!/UND[^/]+VMS_DO_SOCKETS!i); print OUT "d_vms_do_sockets=",$dosock ? "'define'\n" : "'undef'\n"; print OUT "d_socket=",$dosock ? "'define'\n" : "'undef'\n"; print OUT "d_sockpair=",$dosock ? "'define'\n" : "'undef'\n"; print OUT "d_gethent=",$dosock ? "'define'\n" : "'undef'\n"; + print OUT "d_sethent=",$dosock ? "'define'\n" : "'undef'\n"; print OUT "d_select=",$dosock ? "'define'\n" : "'undef'\n"; + print OUT "i_netdb=",$dosock ? "'define'\n" : "'undef'\n"; print OUT "i_niin=",$dosock ? "'define'\n" : "'undef'\n"; print OUT "i_neterrno=",$dosock ? "'define'\n" : "'undef'\n"; + print OUT "d_gethbyname=",$dosock ? "'define'\n" : "'undef'\n"; + print OUT "d_gethbyaddr=",$dosock ? "'define'\n" : "'undef'\n"; + print OUT "d_getpbyname=",$dosock ? "'define'\n" : "'undef'\n"; + print OUT "d_getpbynumber=",$dosock ? "'define'\n" : "'undef'\n"; + print OUT "d_getsbyname=",$dosock ? "'define'\n" : "'undef'\n"; + print OUT "d_getsbyport=",$dosock ? "'define'\n" : "'undef'\n"; + print OUT "d_endhent=",$dosock ? "'define'\n" : "'undef'\n"; + print OUT "d_getpent=",$dosock ? "'define'\n" : "'undef'\n"; + print OUT "d_setpent=",$dosock ? "'define'\n" : "'undef'\n"; + print OUT "d_endpent=",$dosock ? "'define'\n" : "'undef'\n"; + print OUT "d_getsent=",$dosock ? "'define'\n" : "'undef'\n"; + print OUT "d_setsent=",$dosock ? "'define'\n" : "'undef'\n"; + print OUT "d_endsent=",$dosock ? "'define'\n" : "'undef'\n"; + print OUT "netdb_name_type=",$dosock ? "'char *'\n" : "'undef'\n"; + print OUT "netdb_host_type=",$dosock ? "'char *'\n" : "'undef'\n"; + print OUT "netdb_hlen_type=",$dosock ? "'int'\n" : "'undef'\n"; + print OUT "d_gethostprotos=",$dosock ? "'define'\n" : "'undef'\n"; + print OUT "d_getnetprotos=",$dosock ? "'define'\n" : "'undef'\n"; + print OUT "d_getservprotos=",$dosock ? "'define'\n" : "'undef'\n"; + print OUT "d_getprotoprotos=",$dosock ? "'define'\n" : "'undef'\n"; + + if ($dosock and $cctype eq 'decc' and $ccflags =~ /DECCRTL_SOCKETS/) { + print OUT "selecttype='fd_set'\n"; + print OUT "d_getnbyaddr='define'\n"; + print OUT "d_getnbyname='define'\n"; + print OUT "d_getnent='define'\n"; + print OUT "d_setnent='define'\n"; + print OUT "d_endnent='define'\n"; + print OUT "netdb_net_type='long'\n"; + } + else { + print OUT "selecttype='int'\n"; + print OUT "d_getnybname='undef'\n"; + print OUT "d_getnybaddr='undef'\n"; + print OUT "d_getnent='undef'\n"; + print OUT "d_setnent='undef'\n"; + print OUT "d_endnent='undef'\n"; + print OUT "netdb_net_type='undef'\n"; + } - if ($cctype eq 'decc') { $rtlhas = 'define'; } - else { $rtlhas = 'undef'; } + if ($cctype eq 'decc') { + $rtlhas = 'define'; + print OUT "useposix='true'\n"; + ($ccver,$vmsver) = `$cc/VERSION` =~ /V(\S+) on .*V(\S+)$/; + # Best guess; the may be wrong on systems which have separately + # installed the new CRTL. + if ($ccver >= 5.2 and $vmsver >= 7) { $rtlnew = 'define'; } + else { $rtlnew = 'undef'; } + } + else { $rtlhas = $rtlnew = 'undef'; print OUT "useposix='false'\n"; } foreach (qw[ d_stdstdio d_stdio_ptr_lval d_stdio_cnt_lval d_stdiobase d_locconv d_setlocale i_locale d_mbstowcs d_mbtowc d_wcstombs d_wctomb d_mblen d_mktime d_strcoll d_strxfrm ]) { print OUT "$_='$rtlhas'\n"; } + foreach (qw[ d_gettimeod d_uname d_truncate d_wait4 d_index + d_pathconf d_fpathconf d_sysconf d_sigsetjmp ]) { + print OUT "$_='$rtlnew'\n"; + } next; } elsif ($key eq 'exe_ext') { @@ -296,6 +365,9 @@ close IN; # as the manifest for the obsolete variable $d_eunice. print OUT "d_eunice='undef'\n"; delete $pp_vars{VMS}; +# XXX temporary -- USE_THREADS is currently on CC command line +delete $pp_vars{'USE_THREADS'}; + foreach (sort keys %pp_vars) { warn "Didn't see $_ in $infile\n"; } diff --git a/gnu/usr.bin/perl/vms/perlvms.pod b/gnu/usr.bin/perl/vms/perlvms.pod index c599e5834cd..89c4bbf6231 100644 --- a/gnu/usr.bin/perl/vms/perlvms.pod +++ b/gnu/usr.bin/perl/vms/perlvms.pod @@ -329,7 +329,12 @@ undefined behavior (rarely, we hope): getgrnam, setgrent, endgrent, ioctl, link, lstat, msgctl, msgget, msgsend, msgrcv, readlink, semctl, semget, semop, setpgrp, setpriority, shmctl, shmget, - shmread, shmwrite, socketpair, symlink, syscall, truncate + shmread, shmwrite, socketpair, symlink, syscall + +The following functions are available on Perls compiled with Dec C 5.2 or +greater and running VMS 7.0 or greater + + truncate The following functions may or may not be implemented, depending on what type of socket support you've built into @@ -658,12 +663,20 @@ list logical names. For instance, if you say Perl will print C<ONCE UPON A TIME THERE WAS>. -The %ENV keys C<home>, C<path>,C<term>, and C<user> -return the CRTL "environment variables" of the same -names, if these logical names are not defined. The -key C<default> returns the current default device +The key C<default> returns the current default device and directory specification, regardless of whether -there is a logical name DEFAULT defined.. +there is a logical name DEFAULT defined. If you try to +read an element of %ENV for which there is no corresponding +logical name, and for which no corresponding CLI symbol +exists (this is to identify "blocking" symbols only; to +manipulate CLI symbols, see L<VMS::DCLSym>) then the key +will be looked up in the CRTL-local environment array, and +the corresponding value, if any returned. This lets you +get at C-specific keys like C<home>, C<path>,C<term>, and +C<user>, as well as other keys which may have been passed +directly into the C-specific array if Perl was called from +another C program using the version of execve() or execle() +present in recent revisions of the DECCRTL. Setting an element of %ENV defines a supervisor-mode logical name in the process logical name table. C<Undef>ing or @@ -675,6 +688,23 @@ logical name translation after the deletion, so an inner-mode logical name or a name in another logical name table will replace the logical name just deleted. It is not possible at present to define a search list logical name via %ENV. +It is also not possible to delete an element from the +C-local environ array. + +Note that if you want to pass on any elements of the +C-local environ array to a subprocess which isn't +started by fork/exec, or isn't running a C program, you +can "promote" them to logical names in the current +process, which will then be inherited by all subprocesses, +by saying + + foreach my $key (qw[C-local keys you want promoted]) { + my $temp = $ENV{$key}; # read from C-local array + $ENV{$key} = $temp; # and define as logical name + } + +(You can't just say C<$ENV{$key} = $ENV{$key}>, since the +Perl optimizer is smart enough to elide the expression.) At present, the first time you iterate over %ENV using C<keys>, or C<values>, you will incur a time penalty as all @@ -749,12 +779,23 @@ it's equivalent to calling fflush() and fsync() from C. =back +=head1 Standard modules with VMS-specific differences + +=head2 SDBM_File + +SDBM_File works peroperly on VMS. It has, however, one minor +difference. The database directory file created has a L<.sdbm_dir> +extension rather than a L<.dir> extension. L<.dir> files are VMS filesystem +directory files, and using them for other purposes could cause unacceptable +problems. + =head1 Revision date -This document was last updated on 28-Feb-1996, for Perl 5, -patchlevel 2. +This document was last updated on 26-Feb-1998, for Perl 5, +patchlevel 5. =head1 AUTHOR -Charles Bailey bailey@genetics.upenn.edu +Charles Bailey bailey@cor.newman.upenn.edu +Last revision by Dan Sugalski sugalskd@ous.edu diff --git a/gnu/usr.bin/perl/vms/perly_c.vms b/gnu/usr.bin/perl/vms/perly_c.vms index ded0cf419c8..f263439e851 100644 --- a/gnu/usr.bin/perl/vms/perly_c.vms +++ b/gnu/usr.bin/perl/vms/perly_c.vms @@ -7,1061 +7,1058 @@ static char yysccsid[] = "@(#)yaccpar 1.8 (Berkeley) 01/20/91"; #include "EXTERN.h" #include "perl.h" +#ifdef PERL_OBJECT static void -dep() +Dep(CPerlObj *pPerl) +{ + pPerl->deprecate("\"do\" to call subroutines"); +} +#define dep() Dep(this) +#else +static void +dep(void) { deprecate("\"do\" to call subroutines"); } +#endif #line 16 "perly.c" #define YYERRCODE 256 dEXT short yylhs[] = { -1, 45, 0, 9, 7, 10, 8, 11, 11, 11, 12, - 12, 12, 12, 24, 24, 24, 24, 24, 24, 15, - 15, 15, 14, 14, 42, 42, 13, 13, 13, 13, - 13, 13, 13, 26, 26, 27, 27, 28, 29, 30, - 31, 32, 44, 44, 1, 1, 1, 1, 3, 38, - 38, 46, 4, 5, 6, 39, 40, 40, 41, 41, - 47, 47, 49, 48, 16, 16, 16, 25, 25, 25, - 36, 36, 36, 36, 36, 36, 36, 50, 36, 37, - 37, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 12, 12, 12, 24, 24, 24, 24, 24, 24, 24, + 15, 15, 15, 14, 14, 42, 42, 13, 13, 13, + 13, 13, 13, 13, 26, 26, 27, 27, 28, 29, + 30, 31, 32, 44, 44, 1, 1, 1, 1, 3, + 38, 38, 46, 4, 5, 6, 39, 40, 40, 41, + 41, 47, 47, 49, 48, 16, 16, 16, 25, 25, + 25, 36, 36, 36, 36, 36, 36, 36, 50, 36, + 37, 37, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 33, 33, 34, - 34, 34, 2, 2, 43, 23, 18, 19, 20, 21, - 22, 35, 35, 35, 35, + 17, 17, 17, 17, 17, 17, 17, 17, 33, 33, + 34, 34, 34, 2, 2, 43, 23, 18, 19, 20, + 21, 22, 35, 35, 35, 35, }; dEXT short yylen[] = { 2, 0, 2, 4, 0, 4, 0, 0, 2, 2, 2, - 1, 2, 3, 1, 1, 3, 3, 3, 3, 0, - 2, 6, 7, 7, 0, 2, 8, 8, 10, 9, - 8, 11, 3, 0, 1, 0, 1, 1, 1, 1, - 1, 1, 0, 1, 1, 1, 1, 1, 4, 1, - 0, 5, 0, 0, 0, 1, 0, 1, 1, 1, - 3, 2, 0, 7, 3, 3, 1, 2, 3, 1, - 3, 5, 6, 3, 5, 2, 4, 0, 5, 1, - 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 5, 3, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 3, 2, 3, 2, 4, - 3, 4, 1, 5, 1, 4, 5, 4, 1, 1, - 1, 5, 6, 5, 6, 5, 4, 5, 1, 1, - 3, 4, 3, 2, 2, 4, 5, 4, 5, 4, - 5, 1, 2, 2, 1, 2, 2, 2, 1, 3, - 1, 3, 4, 4, 6, 1, 1, 0, 1, 0, - 1, 2, 1, 1, 1, 2, 2, 2, 2, 2, - 2, 1, 1, 1, 1, + 1, 2, 3, 1, 1, 3, 3, 3, 3, 3, + 0, 2, 6, 7, 7, 0, 2, 8, 8, 10, + 9, 8, 11, 3, 0, 1, 0, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 4, + 1, 0, 5, 0, 0, 0, 1, 0, 1, 1, + 1, 3, 2, 0, 7, 3, 3, 1, 2, 3, + 1, 3, 5, 6, 3, 5, 2, 4, 0, 5, + 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 5, 3, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 3, 2, 3, 2, + 4, 3, 4, 1, 5, 1, 4, 5, 4, 1, + 1, 1, 5, 6, 5, 6, 5, 4, 5, 1, + 1, 3, 4, 3, 2, 2, 4, 5, 4, 5, + 4, 5, 1, 2, 2, 1, 2, 2, 2, 1, + 3, 1, 3, 4, 4, 6, 1, 1, 0, 1, + 0, 1, 2, 1, 1, 1, 2, 2, 2, 2, + 2, 2, 1, 1, 1, 1, }; dEXT short yydefred[] = { 1, - 0, 7, 0, 44, 55, 53, 0, 53, 8, 45, - 9, 11, 0, 46, 47, 48, 0, 0, 0, 62, - 63, 14, 4, 156, 0, 0, 129, 0, 151, 0, - 54, 54, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 163, 164, 0, + 0, 7, 0, 45, 56, 54, 0, 54, 8, 46, + 9, 11, 0, 47, 48, 49, 0, 0, 0, 63, + 64, 14, 4, 157, 0, 0, 130, 0, 152, 0, + 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 164, 165, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, - 0, 0, 119, 121, 0, 0, 0, 0, 157, 50, - 0, 56, 0, 61, 0, 7, 172, 175, 174, 173, + 0, 0, 120, 122, 0, 0, 0, 0, 158, 51, + 0, 57, 0, 62, 0, 7, 173, 176, 175, 174, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, - 4, 4, 0, 0, 0, 0, 0, 146, 0, 0, - 0, 0, 76, 0, 170, 0, 135, 0, 0, 0, - 0, 0, 166, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 109, 0, 167, 168, 169, 171, 0, - 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 0, 0, 0, 0, 0, 147, 0, 0, + 0, 0, 77, 0, 171, 0, 136, 0, 0, 0, + 0, 0, 167, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 110, 0, 168, 169, 170, 172, 0, + 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 101, 102, 0, 0, 0, 0, 0, - 0, 0, 0, 13, 0, 49, 58, 0, 0, 0, - 74, 0, 0, 78, 0, 0, 0, 0, 0, 0, - 0, 4, 150, 152, 0, 0, 0, 0, 0, 0, - 0, 111, 0, 133, 0, 0, 108, 26, 0, 0, - 19, 0, 0, 0, 65, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 102, 103, 0, 0, 0, 0, + 0, 0, 0, 0, 13, 0, 50, 59, 0, 0, + 0, 75, 0, 0, 79, 0, 0, 0, 0, 0, + 0, 0, 4, 151, 153, 0, 0, 0, 0, 0, + 0, 0, 112, 0, 134, 0, 0, 109, 27, 0, + 0, 19, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 80, 0, 0, 81, 0, 0, 0, 0, 0, - 0, 0, 131, 0, 0, 60, 59, 52, 0, 3, - 0, 154, 0, 0, 112, 0, 41, 0, 42, 0, - 0, 0, 0, 165, 0, 0, 35, 40, 0, 0, - 0, 153, 162, 77, 0, 136, 0, 138, 0, 110, - 0, 0, 0, 0, 0, 140, 0, 0, 0, 118, - 0, 116, 0, 127, 0, 132, 0, 75, 0, 79, - 0, 0, 0, 0, 0, 0, 0, 0, 72, 137, - 139, 126, 0, 124, 0, 0, 141, 117, 0, 122, - 128, 114, 64, 155, 6, 0, 0, 0, 0, 0, - 0, 0, 0, 125, 123, 73, 7, 27, 28, 0, - 0, 23, 24, 0, 31, 0, 0, 0, 21, 0, - 0, 0, 30, 5, 0, 29, 0, 0, 32, 0, - 22, + 0, 0, 0, 81, 0, 0, 82, 0, 0, 0, + 0, 0, 0, 0, 132, 0, 0, 61, 60, 53, + 0, 3, 0, 155, 0, 0, 113, 0, 42, 0, + 43, 0, 0, 0, 0, 166, 0, 0, 36, 41, + 0, 0, 0, 154, 163, 78, 0, 137, 0, 139, + 0, 111, 0, 0, 0, 0, 0, 141, 0, 0, + 0, 119, 0, 117, 0, 128, 0, 133, 0, 76, + 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 73, 138, 140, 127, 0, 125, 0, 0, 142, 118, + 0, 123, 129, 115, 65, 156, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 126, 124, 74, 7, 28, + 29, 0, 0, 24, 25, 0, 32, 0, 0, 0, + 22, 0, 0, 0, 31, 5, 0, 30, 0, 0, + 33, 0, 23, }; dEXT short yydgoto[] = { 1, - 9, 66, 10, 18, 95, 17, 86, 337, 89, 326, - 3, 11, 12, 68, 342, 261, 70, 71, 72, 73, - 74, 75, 76, 267, 78, 268, 257, 259, 262, 270, - 258, 260, 113, 197, 91, 79, 236, 81, 83, 178, - 248, 142, 265, 13, 2, 14, 15, 16, 85, 254, + 9, 66, 10, 18, 95, 17, 86, 339, 89, 328, + 3, 11, 12, 68, 344, 263, 70, 71, 72, 73, + 74, 75, 76, 269, 78, 270, 259, 261, 264, 272, + 260, 262, 113, 198, 91, 79, 238, 81, 83, 179, + 250, 142, 267, 13, 2, 14, 15, 16, 85, 256, }; dEXT short yysindex[] = { 0, - 0, 0, -120, 0, 0, 0, -50, 0, 0, 0, - 0, 0, 661, 0, 0, 0, -240, -238, -29, 0, - 0, 0, 0, 0, -32, -32, 0, -8, 0, 2115, - 0, 0, -4, 31, 32, 35, -35, 2115, 56, 57, - 61, 1037, 981, -32, 1100, 1364, -218, 0, 0, -32, - 2115, 2115, 2115, 2115, 2115, 2115, 1420, 0, 2115, 2115, - 1476, -32, -32, -32, -32, 2115, -205, 0, 201, 306, - -63, -62, 0, 0, -24, 67, 45, 65, 0, 0, - -15, 0, -149, 0, -144, 0, 0, 0, 0, 0, - 2115, 80, 2115, 841, -15, -149, 0, 0, 0, 0, - 0, 0, 85, 306, 86, 1535, 981, 0, 841, 0, - -63, 65, 0, 2115, 0, 88, 0, 841, -28, 4, - -51, 2115, 0, 65, 340, 340, 340, -76, -76, 49, - -31, 340, 340, 0, -82, 0, 0, 0, 0, 841, - -15, 0, 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, - 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, - 2115, 2115, 2115, 0, 0, 48, 2115, 2115, 2115, 2115, - 2115, 2115, 1710, 0, 2115, 0, 0, -43, -116, 241, - 0, 2115, 1193, 0, -15, 2115, 2115, 2115, 2115, 106, - 1769, 0, 0, 0, -23, 20, 104, 2115, 65, 1825, - 1881, 0, 36, 0, 2115, 62, 0, 0, -232, -232, - 0, -232, -232, -134, 0, -46, 1131, 841, 689, 316, - 859, 306, 3778, 1980, 3652, 1299, 480, 396, 340, 340, - 2115, 0, 1944, 2115, 0, 128, -58, 22, -56, 24, - 33, 28, 0, -19, 306, 0, 0, 0, 2115, 0, - 134, 0, 2115, 2115, 0, -232, 0, 142, 0, 148, - -232, 149, 150, 0, 153, 201, 0, 0, 154, 138, - 2115, 0, 0, 0, -7, 0, 2, 0, 16, 0, - 70, 2115, 73, 2115, 30, 0, 18, 101, 2115, 0, - 75, 0, 78, 0, 81, 0, 151, 0, 1247, 0, - 90, 90, 90, 90, 2115, 90, 2115, 167, 0, 0, - 0, 0, 103, 0, 3869, 84, 0, 0, 170, 0, - 0, 0, 0, 0, 0, -205, -205, -207, -207, 176, - -205, 168, 90, 0, 0, 0, 0, 0, 0, 90, - 192, 0, 0, 90, 0, 1769, -205, 402, 0, 2115, - -205, 207, 0, 0, 208, 0, 90, 90, 0, -207, - 0, + 0, 0, -66, 0, 0, 0, -48, 0, 0, 0, + 0, 0, 645, 0, 0, 0, -232, -227, -27, 0, + 0, 0, 0, 0, -23, -23, 0, -6, 0, 2099, + 0, 0, 13, 20, 24, 25, -34, 2099, 27, 28, + 29, 1021, 965, -23, 1084, 1348, -217, 0, 0, -23, + 2099, 2099, 2099, 2099, 2099, 2099, 1404, 0, 2099, 2099, + 1460, -23, -23, -23, -23, 2099, -206, 0, 335, 3814, + -73, -68, 0, 0, -47, 40, 32, 61, 0, 0, + -39, 0, -157, 0, -145, 0, 0, 0, 0, 0, + 2099, 73, 2099, 825, -39, -157, 0, 0, 0, 0, + 0, 0, 75, 3814, 78, 1519, 965, 0, 825, 0, + -73, 61, 0, 2099, 0, 77, 0, 825, -16, -9, + -51, 2099, 0, 61, 87, 87, 87, -86, -86, 33, + -40, 87, 87, 0, -81, 0, 0, 0, 0, 825, + -39, 0, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, + 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, + 2099, 2099, 2099, 2099, 0, 0, 30, 2099, 2099, 2099, + 2099, 2099, 2099, 1694, 0, 2099, 0, 0, -49, -118, + 189, 0, 2099, 353, 0, -39, 2099, 2099, 2099, 2099, + 104, 1753, 0, 0, 0, -24, 8, 85, 2099, 61, + 1809, 1865, 0, 23, 0, 2099, 54, 0, 0, -269, + -269, 0, -269, -269, -269, -151, 0, -43, 1121, 825, + 673, 50, 363, 3814, 1233, 2459, 3640, 2309, 266, -82, + 87, 87, 2099, 0, 1928, 2099, 0, 111, 51, 12, + 76, 14, 90, 39, 0, -22, 3814, 0, 0, 0, + 2099, 0, 121, 0, 2099, 2099, 0, -269, 0, 124, + 0, 125, -269, 126, 130, 0, 112, 335, 0, 0, + 131, 136, 2099, 0, 0, 0, -14, 0, 1, 0, + 4, 0, 133, 2099, 55, 2099, 49, 0, 6, 197, + 2099, 0, 89, 0, 94, 0, 100, 0, 144, 0, + 1175, 0, 92, 92, 92, 92, 2099, 92, 2099, 171, + 0, 0, 0, 0, 202, 0, 3900, 108, 0, 0, + 188, 0, 0, 0, 0, 0, 0, -206, -206, -238, + -238, 199, -206, 211, 92, 0, 0, 0, 0, 0, + 0, 92, 241, 0, 0, 92, 0, 1753, -206, 326, + 0, 2099, -206, 256, 0, 0, 259, 0, 92, 92, + 0, -238, 0, }; dEXT short yyrindex[] = { 0, - 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 131, 0, 0, 0, + 0, 0, 249, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2156, -17, 0, - 0, 2675, 2720, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2228, 426, 0, + 0, 2833, 2876, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 79, 0, -3, 108, - 2774, 2860, 0, 0, 2034, 121, 0, 140, 0, 0, - 0, 0, -33, 0, 0, 0, 0, 0, 0, 0, - 2203, 0, 0, 3504, 0, 145, 0, 0, 0, 0, - 0, 0, 0, 3772, 0, 0, 252, 0, 3551, 541, - 602, 2270, 0, 0, 0, 442, 0, 3587, 2774, 0, - 0, 2203, 0, 2324, 3010, 3049, 3096, 2911, 2972, 2439, - 0, 3147, 3193, 0, 0, 0, 0, 0, 0, 3633, + 0, 0, 0, 0, 0, 0, 59, 0, -10, 2038, + 2952, 2995, 0, 0, 2274, 2140, 0, 200, 0, 0, + 0, 0, -44, 0, 0, 0, 0, 0, 0, 0, + 2421, 0, 0, 105, 0, 198, 0, 0, 0, 0, + 0, 0, 0, 3753, 0, 0, 319, 0, 3505, 525, + 586, 2510, 0, 0, 0, 2185, 0, 3541, 2952, 0, + 0, 2421, 0, 2553, 3112, 3150, 3188, -37, 3069, 2597, + 0, 3231, 3269, 0, 0, 0, 0, 0, 0, 3584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2522, 0, 0, 0, 0, 925, - 0, 252, 0, 0, 0, 263, 0, 0, 0, 0, - 223, 0, 0, 0, 0, 282, 0, 0, 2576, 0, - 0, 0, 0, 0, 0, 2624, 0, 0, -1, 26, - 0, 27, 51, 718, 0, 0, 3752, 1576, 1632, 3368, - 3413, 3799, 0, -38, 3710, 3678, 3060, 3459, 3285, 3332, + 0, 0, 0, 0, 0, 2673, 0, 0, 0, 0, + 909, 0, 319, 0, 0, 0, 320, 0, 0, 0, + 0, 306, 0, 0, 0, 0, 325, 0, 0, 2789, + 0, 0, 0, 0, 0, 0, 2716, 0, 0, -5, + 22, 0, 68, 69, 70, 702, 0, 0, 3741, 1296, + 1560, 3386, 3424, 3796, 0, 3703, 3660, 3622, 1616, 3467, + 3305, 3348, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3809, 0, 0, 0, + 309, 0, 0, 0, 0, 2421, 0, 79, 0, 0, + 0, 0, 330, 0, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3835, 0, 0, 0, 273, 0, - 0, 0, 0, 2203, 0, 59, 0, 0, 0, 0, - 293, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 252, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 296, 0, 0, 0, - 0, 0, 0, 0, 2380, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 79, 79, 186, 186, 0, - 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 300, 79, 925, 0, 0, - 79, 0, 0, 0, 0, 0, 0, 0, 0, 186, - 0, + 319, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 317, 0, + 0, 0, 0, 0, 0, 0, 1982, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 59, 59, 154, + 154, 0, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 340, 59, 909, + 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 154, 0, }; dEXT short yygindex[] = { 0, - 0, 0, 0, 349, 328, 0, -48, 0, 679, 378, - -84, 0, 0, 0, -298, -13, 4075, 2485, 0, 0, - 0, 0, 0, 363, 908, 0, 0, 233, -168, 38, - 72, 196, -77, -175, 999, 0, 0, 0, 0, 290, - 0, -249, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 374, 351, 0, -12, 0, 946, 413, + -83, 0, 0, 0, -311, -13, 4007, 2893, 0, 0, + 0, 0, 0, 372, -8, 0, 0, 246, -131, 43, + 86, 208, -45, -169, 987, 0, 0, 0, 0, 308, + 0, -271, 0, 0, 0, 0, 0, 0, 0, 0, }; -#define YYTABLESIZE 4359 +#define YYTABLESIZE 4293 dEXT short yytable[] = { 69, - 62, 180, 93, 62, 102, 93, 251, 203, 20, 206, - 207, 201, 283, 181, 167, 246, 80, 272, 82, 93, - 93, 296, 269, 149, 93, 57, 149, 169, 171, 84, - 343, 93, 121, 309, 290, 97, 292, 15, 122, 18, - 149, 149, 310, 131, 204, 149, 149, 135, 186, 187, - 188, 189, 190, 191, 93, 15, 311, 18, 317, 168, - 170, 361, 169, 273, 147, 148, 38, 16, 340, 341, - 98, 99, 141, 149, 100, 149, 338, 339, 25, 23, - 291, 345, 293, 62, 38, 16, 295, 233, 316, 57, - 23, 17, 195, 196, 168, 105, 106, 353, 172, 37, - 107, 356, 308, 174, 39, 149, 173, 23, 175, 17, - 177, 25, 179, 319, 25, 25, 25, 37, 25, 182, - 25, 25, 15, 25, 192, 294, 193, 200, 202, 209, - 210, 212, 213, 214, 215, 216, 330, 25, 234, 205, - 249, 62, 25, 271, 274, 4, 5, 6, 70, 7, - 8, 70, 282, 237, 238, 239, 240, 241, 242, 244, - 280, 130, 312, 148, 130, 70, 70, 289, 196, 25, - 231, 297, 256, 210, 298, 210, 300, 266, 130, 130, - 67, 355, 301, 130, 275, 20, 277, 279, 302, 303, - 304, 281, 305, 318, 306, 334, 307, 314, 67, 320, - 70, 25, 321, 25, 25, 322, 19, 333, 335, 323, - 336, 130, 325, 130, 147, 148, 344, 285, 20, 287, - 288, 20, 20, 20, 87, 20, 346, 20, 20, 88, - 20, 350, 67, 93, 93, 93, 93, 166, 147, 148, - 147, 148, 93, 130, 20, 147, 148, 357, 358, 20, - 147, 148, 348, 51, 149, 149, 149, 149, 93, 93, - 101, 93, 93, 149, 2, 147, 148, 57, 313, 149, - 149, 149, 149, 147, 148, 196, 20, 147, 148, 149, - 149, 34, 149, 149, 149, 149, 149, 149, 149, 147, - 148, 149, 160, 256, 149, 149, 149, 43, 147, 148, - 43, 43, 43, 36, 43, 232, 43, 43, 20, 43, - 20, 20, 147, 148, 147, 148, 147, 148, 147, 148, - 147, 148, 161, 43, 147, 148, 147, 148, 43, 147, - 148, 158, 69, 39, 25, 25, 25, 25, 25, 25, - 34, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 36, 43, 21, 25, 25, 96, - 25, 25, 25, 25, 25, 250, 147, 148, 156, 25, - 25, 25, 25, 25, 25, 77, 211, 25, 332, 70, - 70, 70, 70, 352, 263, 185, 25, 43, 25, 25, - 43, 0, 130, 130, 130, 130, 167, 147, 148, 147, - 148, 130, 0, 0, 70, 70, 167, 130, 130, 130, - 130, 67, 67, 67, 67, 0, 0, 130, 130, 0, - 130, 130, 130, 130, 130, 130, 130, 0, 149, 130, - 167, 0, 130, 130, 130, 0, 67, 67, 149, 0, - 0, 20, 20, 20, 20, 20, 20, 0, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 0, 149, 0, 20, 20, 0, 20, 20, 20, - 20, 20, 143, 144, 145, 146, 20, 20, 20, 20, - 20, 20, 156, 0, 20, 156, 167, 0, 0, 0, - 0, 0, 0, 20, 0, 20, 20, 147, 148, 156, - 156, 0, 0, 0, 156, 0, 4, 5, 6, 0, - 7, 8, 0, 0, 0, 0, 0, 0, 149, 0, - 43, 43, 43, 43, 43, 43, 354, 43, 43, 43, - 0, 0, 156, 43, 156, 0, 43, 43, 43, 43, - 0, 0, 0, 43, 43, 0, 43, 43, 43, 43, - 43, 0, 0, 0, 0, 43, 43, 43, 43, 43, - 43, 0, 0, 43, 156, 0, 0, 0, 0, 0, - 167, 0, 43, 172, 43, 43, 172, 172, 172, 0, - 172, 156, 172, 172, 156, 172, 150, 0, 0, 0, - 0, 0, 151, 152, 153, 154, 0, 0, 156, 156, - 0, 0, 149, 156, 172, 155, 157, 158, 159, 160, - 161, 162, 0, 0, 163, 0, 0, 164, 165, 166, - 0, 162, 0, 0, 163, 0, 0, 164, 165, 166, - 0, 156, 0, 156, 173, 0, 0, 173, 173, 173, - 0, 173, 113, 173, 173, 113, 173, 0, 163, 0, - 0, 164, 165, 166, 0, 0, 0, 0, 0, 113, - 113, 0, 0, 156, 113, 173, 172, 4, 5, 6, - 0, 7, 8, 0, 0, 0, 0, 0, 0, 327, - 328, 329, 0, 331, 153, 154, 0, 0, 0, 0, - 0, 67, 0, 52, 113, 0, 62, 64, 50, 0, - 57, 162, 65, 60, 163, 59, 0, 164, 165, 166, - 347, 0, 0, 156, 156, 156, 156, 349, 0, 58, - 108, 351, 156, 117, 63, 0, 0, 173, 156, 156, - 156, 156, 0, 0, 359, 360, 0, 0, 156, 156, - 0, 156, 156, 156, 156, 156, 156, 156, 0, 0, - 156, 61, 0, 156, 156, 156, 0, 0, 66, 176, - 0, 66, 0, 0, 0, 0, 151, 152, 153, 154, - 0, 0, 0, 184, 0, 0, 66, 0, 0, 167, - 0, 0, 0, 23, 161, 162, 53, 0, 163, 0, - 0, 164, 165, 166, 0, 0, 0, 172, 172, 172, - 172, 172, 0, 172, 172, 172, 0, 0, 0, 172, - 66, 149, 156, 156, 156, 156, 0, 0, 0, 208, - 172, 156, 172, 172, 172, 172, 172, 156, 156, 156, - 156, 172, 172, 172, 172, 172, 172, 156, 156, 172, - 156, 156, 156, 156, 156, 156, 156, 0, 172, 156, - 172, 172, 156, 156, 156, 0, 247, 0, 173, 173, - 173, 173, 173, 255, 173, 173, 173, 0, 0, 0, - 173, 0, 0, 113, 113, 113, 113, 0, 0, 0, - 0, 173, 113, 173, 173, 173, 173, 173, 113, 113, - 113, 113, 173, 173, 173, 173, 173, 173, 113, 113, - 173, 113, 113, 113, 113, 113, 113, 113, 0, 173, - 113, 173, 173, 113, 113, 113, 22, 24, 25, 26, - 27, 28, 0, 29, 30, 31, 0, 0, 0, 32, - 0, 167, 33, 34, 35, 36, 0, 0, 0, 37, - 38, 0, 39, 40, 41, 42, 43, 0, 0, 167, - 112, 44, 45, 46, 47, 48, 49, 43, 124, 51, - 43, 43, 43, 149, 43, 0, 43, 43, 54, 43, - 55, 56, 0, 0, 0, 151, 0, 153, 154, 0, - 0, 149, 0, 43, 0, 0, 0, 0, 43, 66, - 66, 66, 66, 161, 162, 0, 0, 163, 112, 0, - 164, 165, 166, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 52, 66, 43, 62, 64, 50, 0, - 57, 199, 65, 60, 92, 59, 0, 0, 0, 112, + 207, 62, 181, 104, 168, 102, 104, 204, 168, 248, + 20, 208, 62, 253, 58, 285, 274, 170, 298, 345, + 104, 104, 172, 202, 80, 104, 311, 148, 149, 82, + 15, 84, 121, 93, 112, 18, 150, 342, 343, 122, + 150, 312, 124, 131, 313, 182, 319, 135, 15, 169, + 363, 275, 97, 18, 171, 104, 340, 341, 26, 98, + 271, 347, 39, 99, 100, 62, 105, 106, 107, 235, + 293, 141, 295, 23, 170, 173, 205, 355, 58, 174, + 39, 358, 112, 23, 187, 188, 189, 190, 191, 192, + 175, 26, 196, 197, 26, 26, 26, 297, 26, 23, + 26, 26, 178, 26, 176, 200, 169, 318, 16, 17, + 20, 180, 183, 112, 193, 203, 201, 26, 194, 38, + 236, 321, 26, 206, 40, 276, 16, 17, 20, 210, + 211, 213, 214, 215, 216, 217, 218, 38, 251, 62, + 168, 310, 15, 292, 284, 149, 149, 282, 149, 26, + 291, 307, 233, 21, 239, 240, 241, 242, 243, 244, + 246, 300, 149, 149, 303, 304, 305, 149, 294, 197, + 306, 308, 150, 258, 211, 332, 211, 168, 268, 316, + 273, 26, 296, 26, 26, 277, 21, 279, 281, 21, + 21, 21, 283, 21, 309, 21, 21, 149, 21, 4, + 5, 6, 325, 7, 8, 299, 154, 155, 19, 150, + 302, 335, 21, 322, 327, 148, 149, 21, 323, 287, + 357, 289, 290, 163, 324, 314, 164, 167, 338, 165, + 166, 167, 337, 87, 104, 104, 104, 104, 88, 346, + 68, 104, 112, 104, 21, 148, 149, 112, 2, 104, + 104, 104, 104, 148, 149, 350, 148, 149, 68, 104, + 104, 101, 104, 104, 104, 104, 104, 104, 104, 348, + 315, 104, 148, 149, 148, 149, 21, 197, 21, 21, + 352, 44, 148, 149, 44, 44, 44, 234, 44, 320, + 44, 44, 68, 44, 336, 258, 359, 148, 149, 360, + 148, 149, 148, 149, 148, 149, 52, 44, 148, 149, + 148, 149, 44, 252, 26, 26, 26, 26, 26, 26, + 58, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 69, 148, 149, 26, 26, 44, + 26, 26, 26, 26, 26, 148, 149, 148, 149, 26, + 26, 26, 26, 26, 26, 163, 168, 26, 164, 161, + 37, 165, 166, 167, 35, 162, 26, 159, 26, 26, + 40, 44, 148, 149, 44, 37, 149, 149, 149, 149, + 35, 21, 96, 149, 77, 149, 148, 149, 150, 212, + 354, 149, 149, 254, 334, 164, 255, 265, 165, 166, + 167, 149, 149, 186, 149, 149, 149, 149, 149, 21, + 21, 21, 21, 21, 21, 157, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 148, + 149, 0, 21, 21, 0, 21, 21, 21, 21, 21, + 0, 0, 0, 168, 21, 21, 21, 21, 21, 21, + 356, 0, 21, 168, 4, 5, 6, 0, 7, 8, + 0, 21, 0, 21, 21, 0, 150, 0, 0, 150, + 0, 68, 68, 68, 68, 150, 0, 0, 68, 0, + 0, 0, 0, 150, 150, 150, 0, 0, 150, 0, + 0, 0, 0, 148, 149, 0, 68, 68, 148, 149, + 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, + 0, 44, 44, 44, 0, 0, 150, 44, 150, 0, + 44, 44, 44, 44, 0, 0, 0, 44, 44, 0, + 44, 44, 44, 44, 44, 0, 0, 0, 0, 44, + 44, 44, 44, 44, 44, 0, 0, 44, 150, 0, + 0, 0, 152, 153, 154, 155, 44, 173, 44, 44, + 173, 173, 173, 0, 173, 157, 173, 173, 157, 173, + 162, 163, 0, 0, 164, 0, 0, 165, 166, 167, + 0, 0, 157, 157, 0, 0, 0, 157, 173, 0, + 0, 4, 5, 6, 0, 7, 8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 143, 144, 145, 146, + 0, 0, 0, 147, 0, 157, 0, 157, 174, 0, + 0, 174, 174, 174, 0, 174, 114, 174, 174, 114, + 174, 148, 149, 151, 0, 0, 0, 0, 0, 152, + 153, 154, 155, 114, 114, 0, 0, 157, 114, 174, + 173, 154, 156, 158, 159, 160, 161, 162, 163, 0, + 0, 164, 0, 0, 165, 166, 167, 0, 163, 0, + 0, 164, 0, 0, 165, 166, 167, 52, 114, 0, + 62, 64, 50, 0, 57, 0, 65, 60, 0, 59, + 0, 0, 0, 0, 0, 0, 0, 150, 150, 150, + 150, 0, 0, 58, 150, 0, 150, 0, 63, 0, + 0, 174, 150, 150, 150, 150, 329, 330, 331, 0, + 333, 0, 150, 150, 0, 150, 150, 150, 150, 150, + 150, 150, 0, 0, 150, 61, 0, 150, 150, 150, + 0, 0, 67, 0, 0, 67, 0, 349, 0, 0, + 0, 0, 0, 0, 351, 0, 0, 0, 353, 0, + 67, 0, 0, 168, 0, 0, 0, 23, 0, 0, + 53, 361, 362, 0, 0, 0, 0, 0, 0, 0, + 0, 173, 173, 173, 173, 173, 0, 173, 173, 173, + 0, 0, 0, 173, 67, 150, 157, 157, 157, 157, + 0, 0, 0, 157, 173, 157, 173, 173, 173, 173, + 173, 157, 157, 157, 157, 173, 173, 173, 173, 173, + 173, 157, 157, 173, 157, 157, 157, 157, 157, 157, + 157, 0, 173, 157, 173, 173, 157, 157, 157, 0, + 0, 0, 174, 174, 174, 174, 174, 0, 174, 174, + 174, 0, 0, 0, 174, 0, 0, 114, 114, 114, + 114, 0, 0, 0, 114, 174, 114, 174, 174, 174, + 174, 174, 114, 114, 114, 114, 174, 174, 174, 174, + 174, 174, 114, 114, 174, 114, 114, 114, 114, 114, + 114, 114, 0, 174, 114, 174, 174, 114, 114, 114, + 22, 24, 25, 26, 27, 28, 0, 29, 30, 31, + 0, 0, 0, 32, 0, 168, 33, 34, 35, 36, + 0, 0, 0, 37, 38, 0, 39, 40, 41, 42, + 43, 0, 0, 0, 0, 44, 45, 46, 47, 48, + 49, 44, 0, 51, 44, 44, 44, 150, 44, 0, + 44, 44, 54, 44, 55, 56, 0, 0, 67, 152, + 0, 154, 155, 0, 0, 0, 0, 44, 0, 0, + 0, 0, 44, 67, 67, 67, 67, 162, 163, 0, + 67, 164, 0, 0, 165, 166, 167, 108, 0, 0, + 117, 0, 0, 0, 0, 0, 0, 52, 67, 44, + 62, 64, 50, 0, 57, 0, 65, 60, 0, 59, + 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 177, 0, 63, 114, + 115, 44, 0, 0, 44, 0, 123, 0, 0, 0, + 185, 0, 0, 0, 0, 0, 0, 0, 136, 137, + 138, 139, 0, 52, 0, 61, 62, 64, 50, 0, + 57, 0, 65, 60, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 114, 115, 0, 63, 0, 0, 43, 123, 0, - 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 136, 137, 138, 139, 0, 0, 0, 0, 0, 52, - 0, 61, 62, 64, 50, 0, 57, 0, 65, 60, - 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 63, 0, 209, 23, 0, 0, + 53, 0, 0, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 63, 0, 0, 23, 0, 198, 53, 0, 0, 0, + 0, 61, 0, 154, 155, 0, 52, 0, 0, 62, + 64, 50, 0, 57, 249, 65, 60, 0, 59, 162, + 163, 257, 0, 164, 0, 0, 165, 166, 167, 0, + 0, 0, 0, 23, 0, 0, 53, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 61, 0, 153, - 154, 0, 52, 0, 0, 62, 64, 50, 0, 57, - 0, 65, 60, 0, 59, 161, 162, 153, 0, 163, - 0, 0, 164, 165, 166, 0, 112, 0, 0, 23, - 0, 112, 53, 63, 162, 0, 0, 163, 0, 0, - 164, 165, 166, 0, 0, 0, 0, 0, 0, 0, - 43, 43, 43, 43, 43, 43, 0, 43, 43, 43, - 61, 0, 0, 43, 0, 0, 43, 43, 43, 43, - 0, 0, 0, 43, 43, 0, 43, 43, 43, 43, - 43, 0, 0, 0, 0, 43, 43, 43, 43, 43, - 43, 167, 23, 43, 0, 53, 0, 0, 0, 0, - 0, 0, 43, 252, 43, 43, 253, 110, 25, 26, - 27, 28, 88, 29, 30, 31, 0, 0, 0, 32, - 0, 0, 0, 149, 0, 156, 0, 0, 0, 0, + 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, + 0, 44, 44, 44, 61, 0, 0, 44, 0, 0, + 44, 44, 44, 44, 0, 0, 0, 44, 44, 0, + 44, 44, 44, 44, 44, 0, 0, 0, 0, 44, + 44, 44, 44, 44, 44, 0, 23, 44, 0, 53, + 0, 168, 0, 0, 0, 326, 44, 0, 44, 44, + 0, 110, 25, 26, 27, 28, 88, 29, 30, 31, + 0, 0, 0, 32, 0, 0, 0, 157, 0, 0, + 0, 0, 0, 150, 38, 0, 39, 40, 41, 42, + 43, 0, 0, 0, 0, 44, 45, 46, 47, 48, + 49, 0, 0, 51, 0, 168, 0, 0, 0, 0, + 0, 0, 54, 0, 55, 56, 0, 24, 25, 26, + 27, 28, 0, 29, 30, 31, 0, 0, 0, 32, + 286, 0, 0, 0, 0, 157, 0, 150, 0, 0, 38, 0, 39, 40, 41, 42, 43, 0, 0, 0, 0, 44, 45, 46, 47, 48, 49, 0, 0, 51, - 0, 0, 0, 167, 0, 0, 0, 324, 54, 0, - 55, 56, 0, 24, 25, 26, 27, 28, 0, 29, - 30, 31, 0, 0, 0, 32, 0, 0, 0, 156, - 0, 0, 0, 0, 0, 149, 38, 0, 39, 40, - 41, 42, 43, 0, 0, 0, 0, 44, 45, 46, - 47, 48, 49, 0, 0, 51, 0, 167, 0, 0, - 0, 0, 0, 0, 54, 0, 55, 56, 0, 0, - 0, 0, 0, 0, 0, 0, 116, 25, 26, 27, - 28, 0, 29, 30, 31, 0, 0, 0, 32, 149, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, - 0, 39, 40, 41, 42, 43, 0, 0, 0, 167, - 44, 45, 46, 47, 48, 49, 52, 0, 51, 62, - 64, 50, 0, 57, 0, 65, 60, 54, 59, 55, - 56, 0, 0, 0, 0, 0, 0, 151, 152, 153, - 154, 149, 120, 0, 0, 0, 0, 63, 0, 0, - 0, 157, 158, 159, 160, 161, 162, 0, 0, 163, - 0, 0, 164, 165, 166, 0, 0, 0, 0, 0, + 0, 0, 0, 168, 0, 0, 0, 0, 54, 0, + 55, 56, 0, 0, 0, 0, 88, 0, 0, 88, + 116, 25, 26, 27, 28, 0, 29, 30, 31, 0, + 0, 0, 32, 88, 88, 150, 0, 0, 88, 0, + 0, 0, 0, 38, 0, 39, 40, 41, 42, 43, + 0, 0, 0, 0, 44, 45, 46, 47, 48, 49, + 52, 0, 51, 62, 64, 50, 0, 57, 88, 65, + 60, 54, 59, 55, 56, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 120, 152, 153, 154, + 155, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 158, 159, 160, 161, 162, 163, 0, 0, 164, + 0, 0, 165, 166, 167, 0, 52, 0, 61, 62, + 64, 50, 0, 57, 130, 65, 60, 0, 59, 0, + 0, 0, 0, 0, 0, 151, 0, 0, 0, 0, + 0, 152, 153, 154, 155, 0, 0, 63, 0, 0, + 0, 0, 0, 53, 156, 158, 159, 160, 161, 162, + 163, 0, 0, 164, 0, 0, 165, 166, 167, 0, 0, 0, 52, 0, 61, 62, 64, 50, 0, 57, - 130, 65, 60, 0, 59, 0, 0, 0, 0, 0, - 0, 0, 0, 150, 0, 0, 0, 0, 0, 151, - 152, 153, 154, 63, 0, 0, 0, 0, 0, 53, - 0, 0, 155, 157, 158, 159, 160, 161, 162, 0, - 0, 163, 0, 0, 164, 165, 166, 0, 52, 0, - 61, 62, 64, 50, 0, 57, 0, 65, 60, 0, - 59, 0, 0, 0, 0, 0, 0, 150, 0, 0, - 0, 0, 0, 151, 152, 153, 154, 0, 0, 63, - 0, 0, 0, 0, 0, 53, 155, 157, 158, 159, - 160, 161, 162, 0, 0, 163, 0, 0, 164, 165, - 166, 0, 0, 0, 0, 0, 61, 52, 134, 0, - 62, 64, 50, 0, 57, 194, 65, 60, 0, 59, - 0, 0, 0, 0, 0, 151, 152, 153, 154, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, - 0, 53, 160, 161, 162, 0, 0, 163, 0, 0, - 164, 165, 166, 0, 0, 0, 87, 0, 0, 87, - 24, 25, 26, 27, 28, 61, 29, 30, 31, 0, - 0, 0, 32, 87, 87, 0, 0, 0, 87, 0, + 0, 65, 60, 0, 59, 0, 0, 0, 0, 0, + 0, 0, 0, 151, 0, 0, 0, 0, 0, 152, + 153, 154, 155, 63, 0, 0, 0, 0, 0, 53, + 0, 0, 156, 158, 159, 160, 161, 162, 163, 0, + 0, 164, 0, 0, 165, 166, 167, 0, 0, 0, + 61, 52, 134, 0, 62, 64, 50, 0, 57, 195, + 65, 60, 0, 59, 0, 0, 0, 88, 88, 88, + 88, 0, 0, 0, 88, 0, 88, 0, 0, 0, + 0, 0, 63, 88, 0, 53, 0, 0, 0, 0, + 0, 0, 88, 88, 0, 88, 88, 88, 88, 88, + 89, 0, 0, 89, 24, 25, 26, 27, 28, 61, + 29, 30, 31, 0, 0, 0, 32, 89, 89, 0, + 0, 0, 89, 0, 0, 0, 0, 38, 0, 39, + 40, 41, 42, 43, 0, 0, 0, 0, 44, 45, + 46, 47, 48, 49, 53, 0, 51, 0, 0, 0, + 0, 0, 89, 0, 0, 54, 90, 55, 56, 90, + 24, 25, 26, 27, 28, 0, 29, 30, 31, 0, + 0, 0, 32, 90, 90, 0, 0, 0, 90, 0, 0, 0, 0, 38, 0, 39, 40, 41, 42, 43, 0, 0, 0, 0, 44, 45, 46, 47, 48, 49, - 53, 0, 51, 0, 0, 0, 0, 0, 87, 0, - 0, 54, 88, 55, 56, 88, 24, 25, 26, 27, - 28, 0, 29, 30, 31, 0, 0, 0, 32, 88, - 88, 0, 0, 0, 88, 0, 0, 0, 0, 38, + 0, 0, 51, 0, 0, 0, 0, 0, 90, 0, + 0, 54, 0, 55, 56, 0, 24, 25, 26, 27, + 28, 0, 29, 30, 31, 0, 52, 0, 32, 62, + 64, 50, 0, 57, 245, 65, 60, 0, 59, 38, 0, 39, 40, 41, 42, 43, 0, 0, 0, 0, - 44, 45, 46, 47, 48, 49, 0, 0, 51, 0, - 0, 0, 0, 0, 88, 0, 0, 54, 0, 55, - 56, 0, 24, 25, 26, 27, 28, 0, 29, 30, - 31, 0, 52, 0, 32, 62, 64, 50, 0, 57, - 243, 65, 60, 0, 59, 38, 0, 39, 40, 41, - 42, 43, 0, 0, 0, 0, 44, 45, 46, 47, - 48, 49, 0, 63, 51, 0, 0, 0, 0, 0, - 0, 0, 0, 54, 0, 55, 56, 0, 0, 0, - 0, 24, 25, 26, 27, 28, 0, 29, 30, 31, - 61, 52, 0, 32, 62, 64, 50, 0, 57, 0, - 65, 60, 0, 59, 38, 0, 39, 40, 41, 42, - 43, 0, 0, 0, 0, 44, 45, 46, 47, 48, - 49, 0, 63, 51, 0, 53, 0, 0, 0, 0, - 0, 0, 54, 0, 55, 56, 0, 87, 87, 87, - 87, 0, 0, 0, 0, 0, 87, 52, 0, 61, - 62, 64, 50, 87, 57, 276, 65, 60, 0, 59, - 0, 0, 87, 87, 0, 87, 87, 87, 87, 87, - 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, - 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, - 0, 0, 0, 88, 88, 88, 88, 0, 0, 0, - 0, 0, 88, 52, 0, 61, 62, 64, 50, 0, - 57, 278, 65, 60, 0, 59, 0, 0, 88, 88, - 0, 88, 88, 88, 88, 88, 0, 0, 0, 0, - 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, - 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 24, 25, 26, 27, - 28, 61, 29, 30, 31, 0, 52, 0, 32, 62, - 64, 50, 0, 57, 286, 65, 60, 0, 59, 38, - 0, 39, 40, 41, 42, 43, 0, 0, 0, 0, - 44, 45, 46, 47, 48, 49, 53, 63, 51, 0, + 44, 45, 46, 47, 48, 49, 0, 63, 51, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 55, - 56, 0, 0, 0, 22, 24, 25, 26, 27, 28, - 0, 29, 30, 31, 61, 0, 0, 32, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, + 56, 0, 0, 0, 0, 24, 25, 26, 27, 28, + 0, 29, 30, 31, 61, 52, 0, 32, 62, 64, + 50, 0, 57, 0, 65, 60, 0, 59, 38, 0, 39, 40, 41, 42, 43, 0, 0, 0, 0, 44, - 45, 46, 47, 48, 49, 0, 0, 51, 0, 53, - 167, 0, 0, 0, 115, 0, 54, 115, 55, 56, - 0, 24, 25, 26, 27, 28, 0, 29, 30, 31, - 0, 115, 115, 32, 0, 0, 115, 0, 0, 0, - 0, 0, 149, 0, 38, 0, 39, 40, 41, 42, - 43, 0, 0, 0, 0, 44, 45, 46, 47, 48, - 49, 0, 0, 51, 115, 0, 115, 0, 0, 0, - 0, 0, 54, 0, 55, 56, 0, 24, 25, 26, - 27, 28, 0, 29, 30, 31, 0, 52, 0, 32, - 62, 64, 50, 0, 57, 0, 65, 60, 0, 59, - 38, 0, 39, 40, 41, 42, 43, 0, 0, 0, - 0, 44, 45, 46, 47, 48, 49, 0, 63, 51, - 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, - 55, 56, 0, 0, 0, 0, 142, 0, 0, 142, + 45, 46, 47, 48, 49, 0, 63, 51, 0, 53, + 0, 0, 0, 0, 0, 0, 54, 0, 55, 56, + 0, 89, 89, 89, 89, 0, 0, 0, 89, 0, + 89, 52, 0, 61, 62, 64, 50, 0, 57, 278, + 65, 60, 0, 59, 0, 0, 89, 89, 0, 89, + 89, 89, 89, 89, 0, 0, 0, 0, 0, 0, + 0, 0, 63, 0, 0, 0, 0, 0, 53, 0, + 0, 0, 0, 0, 0, 0, 0, 90, 90, 90, + 90, 0, 0, 0, 90, 0, 90, 52, 0, 61, + 62, 64, 50, 0, 57, 280, 65, 60, 0, 59, + 0, 0, 90, 90, 0, 90, 90, 90, 90, 90, + 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, + 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 25, 26, 27, 28, 61, 29, 30, 31, 0, - 0, 0, 32, 142, 142, 0, 0, 0, 142, 0, - 0, 0, 0, 38, 0, 39, 40, 41, 42, 43, + 52, 0, 32, 62, 64, 50, 0, 57, 288, 65, + 60, 0, 59, 38, 0, 39, 40, 41, 42, 43, 0, 0, 0, 0, 44, 45, 46, 47, 48, 49, - 53, 0, 51, 158, 0, 0, 158, 0, 142, 0, - 0, 54, 0, 55, 56, 0, 0, 0, 0, 0, - 158, 158, 0, 0, 0, 158, 151, 152, 153, 154, - 0, 0, 0, 0, 0, 0, 0, 0, 142, 0, - 0, 158, 159, 160, 161, 162, 0, 0, 163, 0, - 0, 164, 165, 166, 0, 158, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 115, 115, 115, 115, 0, - 159, 0, 0, 0, 115, 0, 0, 0, 0, 0, - 115, 115, 115, 115, 0, 158, 0, 159, 159, 0, - 115, 115, 159, 115, 115, 115, 115, 115, 115, 115, - 0, 0, 115, 0, 0, 115, 115, 115, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 159, 0, 159, 0, 144, 0, 0, 0, 0, 0, + 53, 63, 51, 0, 0, 0, 0, 0, 0, 0, + 0, 54, 0, 55, 56, 0, 0, 0, 22, 24, + 25, 26, 27, 28, 0, 29, 30, 31, 61, 0, + 0, 32, 95, 0, 0, 95, 0, 0, 0, 0, + 0, 0, 38, 0, 39, 40, 41, 42, 43, 95, + 95, 0, 0, 44, 45, 46, 47, 48, 49, 0, + 0, 51, 0, 53, 0, 0, 0, 0, 0, 0, + 54, 0, 55, 56, 0, 24, 25, 26, 27, 28, + 0, 29, 30, 31, 95, 0, 0, 32, 71, 0, + 0, 71, 0, 0, 0, 0, 0, 0, 38, 0, + 39, 40, 41, 42, 43, 71, 71, 0, 0, 44, + 45, 46, 47, 48, 49, 0, 0, 51, 0, 0, + 0, 0, 0, 0, 0, 0, 54, 0, 55, 56, 0, 24, 25, 26, 27, 28, 0, 29, 30, 31, - 0, 144, 144, 32, 0, 0, 144, 0, 0, 0, - 0, 0, 159, 0, 38, 0, 39, 40, 41, 42, + 71, 52, 0, 32, 62, 64, 50, 0, 57, 0, + 65, 60, 0, 59, 38, 0, 39, 40, 41, 42, 43, 0, 0, 0, 0, 44, 45, 46, 47, 48, - 49, 0, 0, 51, 144, 0, 144, 0, 0, 0, - 94, 0, 54, 94, 55, 56, 0, 142, 142, 142, - 142, 0, 0, 0, 0, 0, 142, 94, 94, 0, - 0, 0, 142, 142, 142, 142, 144, 0, 0, 0, - 0, 0, 142, 142, 0, 142, 142, 142, 142, 142, - 142, 142, 0, 0, 142, 0, 0, 142, 142, 142, - 0, 0, 94, 0, 158, 158, 158, 158, 0, 107, - 0, 0, 107, 158, 0, 0, 0, 0, 0, 158, - 158, 158, 158, 0, 0, 0, 107, 107, 0, 158, - 158, 107, 158, 158, 158, 158, 158, 158, 158, 90, - 90, 158, 0, 0, 158, 158, 158, 0, 0, 0, - 0, 103, 0, 0, 0, 0, 0, 111, 90, 119, - 0, 107, 0, 0, 90, 0, 0, 0, 0, 0, - 0, 159, 159, 159, 159, 0, 90, 90, 90, 90, - 159, 0, 0, 0, 0, 0, 159, 159, 159, 159, - 0, 107, 68, 0, 0, 68, 159, 159, 0, 159, - 159, 159, 159, 159, 159, 159, 0, 0, 159, 68, - 68, 159, 159, 159, 68, 0, 0, 0, 0, 0, - 0, 111, 0, 0, 0, 144, 144, 144, 144, 0, - 0, 0, 0, 0, 144, 0, 0, 0, 0, 0, - 144, 144, 144, 144, 68, 0, 71, 0, 0, 0, - 144, 144, 0, 144, 144, 144, 144, 144, 144, 144, - 0, 0, 144, 71, 71, 144, 144, 144, 71, 0, - 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, - 235, 94, 94, 94, 94, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 106, 0, 71, 106, 71, 0, - 0, 0, 0, 0, 264, 0, 94, 94, 0, 94, - 0, 106, 106, 0, 0, 0, 106, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 71, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 107, 107, 107, 107, 0, 145, 106, 0, 145, 107, - 0, 0, 0, 0, 0, 107, 107, 107, 107, 0, - 0, 0, 145, 145, 0, 107, 107, 145, 107, 107, - 107, 107, 107, 107, 107, 0, 106, 107, 0, 0, - 107, 107, 107, 0, 0, 0, 0, 0, 0, 0, - 158, 0, 0, 158, 0, 0, 0, 145, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 158, 158, 0, - 0, 0, 158, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 68, 68, 68, 68, 0, 0, 0, - 0, 0, 68, 0, 0, 0, 0, 0, 68, 68, - 68, 68, 158, 0, 113, 0, 0, 113, 68, 68, - 0, 68, 68, 68, 68, 68, 68, 68, 0, 0, - 68, 113, 113, 68, 68, 68, 113, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 71, 71, 71, - 71, 0, 0, 0, 0, 0, 71, 0, 0, 0, - 0, 0, 71, 71, 71, 71, 113, 0, 0, 0, - 0, 0, 71, 71, 0, 71, 71, 71, 71, 71, - 71, 71, 0, 0, 71, 0, 0, 71, 71, 71, - 0, 0, 0, 0, 0, 106, 106, 106, 106, 0, - 120, 0, 0, 120, 106, 0, 0, 0, 0, 0, - 106, 106, 106, 106, 0, 0, 0, 120, 120, 0, - 106, 106, 120, 106, 106, 106, 106, 106, 106, 106, - 0, 0, 106, 0, 0, 106, 106, 106, 0, 0, - 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, - 0, 103, 120, 0, 103, 145, 0, 0, 0, 0, - 0, 145, 145, 145, 145, 0, 0, 0, 103, 103, - 0, 145, 145, 103, 145, 145, 145, 145, 145, 145, - 145, 0, 0, 145, 0, 0, 145, 145, 145, 0, - 0, 158, 158, 158, 158, 0, 0, 0, 0, 0, - 158, 0, 0, 103, 0, 0, 158, 158, 158, 158, - 0, 0, 104, 0, 0, 104, 158, 158, 0, 158, - 158, 158, 158, 158, 158, 158, 0, 0, 158, 104, - 104, 158, 158, 158, 104, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 113, 113, 113, 113, 0, - 98, 0, 0, 98, 113, 0, 0, 0, 0, 0, - 113, 113, 113, 113, 104, 0, 0, 98, 98, 0, - 113, 113, 98, 113, 113, 113, 113, 113, 113, 113, - 0, 0, 113, 0, 0, 113, 113, 113, 0, 99, - 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, - 89, 0, 98, 89, 0, 0, 99, 99, 0, 0, - 0, 99, 0, 0, 0, 0, 0, 89, 89, 0, - 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, - 0, 120, 120, 120, 120, 0, 100, 0, 0, 100, - 120, 99, 0, 0, 0, 0, 120, 120, 120, 120, - 0, 0, 89, 100, 100, 0, 120, 120, 100, 120, - 120, 120, 120, 120, 120, 120, 0, 0, 120, 0, - 0, 120, 120, 120, 0, 0, 0, 0, 0, 0, - 0, 0, 103, 103, 103, 103, 0, 96, 100, 0, - 96, 103, 0, 0, 0, 0, 0, 103, 103, 103, - 103, 0, 0, 0, 96, 96, 0, 103, 103, 96, - 103, 103, 103, 103, 103, 103, 103, 0, 0, 103, + 49, 0, 63, 51, 0, 0, 0, 0, 0, 0, + 0, 0, 54, 0, 55, 56, 0, 0, 0, 0, + 131, 0, 0, 131, 24, 25, 26, 27, 28, 61, + 29, 30, 31, 0, 0, 0, 32, 131, 131, 0, + 0, 0, 131, 0, 0, 0, 0, 38, 0, 39, + 40, 41, 42, 43, 0, 0, 0, 0, 44, 45, + 46, 47, 48, 49, 53, 157, 51, 0, 157, 0, + 131, 0, 131, 0, 0, 54, 0, 55, 56, 0, + 0, 0, 157, 157, 0, 0, 0, 157, 0, 0, + 0, 0, 0, 95, 95, 95, 95, 0, 0, 0, + 95, 0, 131, 0, 0, 0, 0, 0, 143, 0, + 0, 143, 0, 0, 0, 157, 0, 157, 95, 95, + 0, 95, 0, 0, 0, 143, 143, 0, 0, 0, + 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 157, 0, 71, + 71, 71, 71, 0, 116, 0, 71, 116, 0, 0, + 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 116, 116, 0, 71, 71, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 97, 0, 0, 97, 0, 0, 96, - 0, 0, 0, 104, 104, 104, 104, 0, 0, 0, - 97, 97, 104, 0, 0, 97, 0, 0, 104, 104, - 104, 104, 0, 0, 0, 0, 0, 0, 104, 104, - 0, 104, 104, 104, 104, 104, 104, 104, 0, 0, - 104, 98, 98, 98, 98, 97, 0, 0, 0, 0, - 98, 0, 0, 0, 0, 0, 98, 98, 98, 98, - 0, 0, 0, 0, 0, 0, 98, 98, 0, 98, - 98, 98, 98, 98, 98, 98, 0, 0, 0, 0, - 99, 99, 99, 99, 0, 95, 0, 0, 95, 99, - 0, 89, 89, 89, 89, 99, 99, 99, 99, 0, - 89, 0, 95, 95, 0, 99, 99, 95, 99, 99, - 99, 99, 99, 99, 99, 0, 89, 89, 0, 89, - 89, 89, 89, 89, 0, 0, 0, 100, 100, 100, - 100, 0, 83, 0, 0, 83, 100, 95, 0, 0, - 0, 0, 100, 100, 100, 100, 0, 0, 0, 83, - 83, 0, 100, 100, 83, 100, 100, 100, 100, 100, - 100, 100, 0, 0, 0, 0, 0, 0, 84, 0, - 0, 84, 0, 0, 0, 0, 0, 0, 96, 96, - 96, 96, 0, 0, 83, 84, 84, 96, 0, 0, - 84, 0, 0, 96, 96, 96, 96, 0, 0, 0, - 0, 0, 0, 96, 96, 0, 96, 96, 96, 96, - 96, 96, 96, 85, 0, 0, 85, 0, 0, 0, - 84, 0, 0, 0, 97, 97, 97, 97, 0, 0, - 85, 85, 0, 97, 0, 85, 0, 0, 0, 97, - 97, 97, 97, 0, 0, 0, 0, 0, 0, 97, - 97, 0, 97, 97, 97, 97, 97, 97, 97, 86, - 0, 0, 86, 0, 0, 85, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 86, 86, 0, 0, - 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, + 143, 0, 0, 0, 0, 24, 25, 26, 27, 28, + 0, 29, 30, 31, 116, 0, 116, 32, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, + 39, 40, 41, 42, 43, 0, 0, 0, 0, 44, + 45, 46, 47, 48, 49, 0, 0, 51, 0, 168, + 0, 0, 0, 0, 0, 0, 54, 0, 55, 56, + 0, 131, 131, 131, 131, 0, 0, 0, 131, 0, + 131, 0, 0, 0, 0, 0, 131, 131, 131, 131, + 0, 150, 0, 0, 0, 0, 131, 131, 0, 131, + 131, 131, 131, 131, 131, 131, 0, 0, 131, 0, + 0, 131, 131, 131, 0, 0, 157, 157, 157, 157, + 0, 159, 0, 157, 159, 157, 0, 0, 0, 0, + 0, 157, 157, 157, 157, 0, 0, 0, 159, 159, + 0, 157, 157, 159, 157, 157, 157, 157, 157, 157, + 157, 0, 0, 157, 0, 0, 157, 157, 157, 143, + 143, 143, 143, 0, 0, 0, 143, 0, 143, 0, + 0, 0, 0, 159, 143, 143, 143, 143, 0, 0, + 0, 0, 0, 0, 143, 143, 0, 143, 143, 143, + 143, 143, 143, 143, 0, 0, 143, 0, 0, 143, + 143, 143, 0, 159, 0, 116, 116, 116, 116, 168, + 160, 0, 116, 0, 116, 0, 0, 0, 0, 0, + 116, 116, 116, 116, 0, 0, 0, 160, 160, 0, + 116, 116, 160, 116, 116, 116, 116, 116, 116, 116, + 0, 150, 116, 0, 0, 116, 116, 116, 0, 0, + 0, 0, 0, 145, 0, 152, 153, 154, 155, 0, + 160, 0, 160, 0, 0, 0, 0, 0, 0, 0, + 145, 145, 161, 162, 163, 145, 0, 164, 0, 0, + 165, 166, 167, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 160, 0, 0, 0, 0, 108, 0, 0, + 108, 0, 0, 145, 0, 145, 0, 0, 0, 0, + 0, 0, 0, 0, 108, 108, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 148, 0, 0, 148, 0, 0, - 0, 86, 0, 0, 0, 0, 95, 95, 95, 95, - 0, 148, 148, 0, 0, 95, 148, 0, 0, 0, - 0, 95, 95, 95, 95, 0, 0, 0, 0, 0, - 0, 95, 95, 0, 95, 95, 95, 95, 95, 95, - 95, 147, 0, 0, 147, 0, 148, 0, 0, 0, - 0, 0, 0, 83, 83, 83, 83, 0, 147, 147, - 0, 0, 83, 147, 0, 0, 0, 0, 83, 83, - 83, 83, 0, 0, 0, 0, 0, 134, 83, 83, - 134, 83, 83, 83, 83, 83, 83, 83, 0, 84, - 84, 84, 84, 147, 134, 134, 0, 0, 84, 134, - 0, 0, 0, 0, 84, 84, 84, 84, 0, 0, - 0, 0, 0, 0, 84, 84, 0, 84, 84, 84, - 84, 84, 84, 105, 0, 0, 105, 0, 0, 134, - 0, 0, 0, 0, 85, 85, 85, 85, 0, 0, - 105, 105, 0, 85, 0, 105, 0, 0, 0, 85, - 85, 0, 85, 0, 0, 0, 0, 0, 0, 85, - 85, 0, 85, 85, 85, 85, 85, 85, 90, 0, - 0, 90, 0, 0, 0, 105, 0, 0, 0, 0, - 86, 86, 86, 86, 0, 90, 90, 0, 0, 86, - 90, 0, 167, 0, 0, 86, 86, 0, 0, 0, - 92, 0, 0, 92, 0, 86, 86, 0, 86, 86, - 86, 86, 86, 86, 0, 0, 0, 92, 92, 0, - 90, 0, 92, 0, 149, 148, 148, 148, 148, 0, - 0, 0, 0, 0, 148, 0, 0, 0, 0, 0, - 148, 148, 91, 0, 0, 91, 0, 0, 0, 0, - 148, 148, 92, 148, 148, 148, 148, 148, 0, 91, - 91, 0, 143, 0, 91, 143, 0, 0, 0, 0, - 0, 0, 147, 147, 147, 147, 0, 0, 0, 143, - 143, 147, 0, 0, 0, 284, 0, 147, 147, 82, - 156, 0, 82, 0, 91, 0, 0, 147, 147, 0, - 147, 147, 147, 147, 147, 0, 82, 82, 134, 134, - 134, 134, 0, 0, 143, 0, 0, 134, 167, 0, - 0, 0, 0, 134, 134, 69, 0, 0, 69, 0, - 0, 0, 0, 134, 134, 0, 134, 134, 134, 134, - 134, 82, 69, 69, 0, 0, 0, 0, 0, 0, - 149, 0, 0, 0, 105, 105, 105, 105, 0, 0, - 0, 0, 0, 105, 0, 0, 0, 0, 0, 105, - 105, 0, 0, 0, 0, 0, 0, 69, 0, 105, - 105, 156, 105, 105, 105, 105, 105, 0, 151, 152, - 153, 154, 0, 0, 0, 0, 0, 0, 0, 90, - 90, 90, 90, 0, 159, 160, 161, 162, 90, 167, - 163, 0, 0, 164, 165, 166, 0, 0, 0, 0, - 0, 0, 0, 0, 90, 90, 0, 90, 90, 90, - 90, 92, 92, 92, 92, 0, 0, 0, 0, 0, - 92, 149, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 92, 92, 0, 92, - 92, 92, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 145, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, + 0, 0, 159, 159, 159, 159, 0, 0, 0, 159, + 0, 159, 0, 0, 0, 0, 0, 159, 159, 159, + 159, 0, 0, 69, 0, 0, 69, 159, 159, 108, + 159, 159, 159, 159, 159, 159, 159, 0, 0, 159, + 69, 69, 159, 159, 159, 69, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 152, 153, 154, 155, 0, + 0, 0, 0, 0, 0, 0, 107, 0, 0, 107, + 159, 160, 161, 162, 163, 69, 0, 164, 0, 0, + 165, 166, 167, 107, 107, 0, 0, 0, 107, 0, + 0, 160, 160, 160, 160, 0, 0, 0, 160, 0, + 160, 0, 0, 0, 0, 69, 160, 160, 160, 160, + 0, 0, 0, 0, 0, 0, 160, 160, 107, 160, + 160, 160, 160, 160, 160, 160, 0, 0, 160, 0, + 0, 160, 160, 160, 145, 145, 145, 145, 0, 72, + 0, 145, 0, 145, 0, 0, 0, 0, 107, 145, + 145, 145, 145, 0, 0, 0, 72, 72, 0, 145, + 145, 72, 145, 145, 145, 145, 145, 145, 145, 0, + 0, 145, 0, 0, 145, 145, 145, 0, 108, 108, + 108, 108, 0, 146, 0, 108, 146, 108, 0, 72, + 0, 72, 0, 108, 108, 108, 108, 0, 0, 0, + 146, 146, 0, 108, 108, 146, 108, 108, 108, 108, + 108, 108, 108, 0, 0, 108, 0, 0, 108, 108, + 108, 72, 0, 0, 0, 0, 159, 90, 90, 159, + 0, 0, 0, 0, 0, 146, 0, 0, 0, 103, + 0, 0, 0, 159, 159, 111, 90, 119, 159, 0, + 0, 0, 90, 0, 69, 69, 69, 69, 0, 0, + 0, 69, 0, 69, 90, 90, 90, 90, 0, 69, + 69, 69, 69, 0, 0, 0, 0, 0, 159, 69, + 69, 0, 69, 69, 69, 69, 69, 69, 69, 0, + 0, 69, 0, 0, 69, 69, 69, 107, 107, 107, + 107, 0, 114, 0, 107, 114, 107, 0, 0, 111, + 0, 0, 107, 107, 107, 107, 0, 0, 0, 114, + 114, 0, 107, 107, 114, 107, 107, 107, 107, 107, + 107, 107, 0, 0, 107, 0, 0, 107, 107, 107, + 0, 0, 0, 0, 0, 121, 0, 0, 121, 0, + 0, 0, 0, 0, 114, 0, 0, 0, 0, 0, + 0, 0, 121, 121, 0, 0, 0, 121, 0, 237, + 72, 72, 72, 72, 0, 0, 0, 72, 0, 72, + 0, 0, 0, 0, 0, 72, 72, 72, 72, 0, + 0, 0, 0, 266, 0, 72, 72, 121, 72, 72, + 72, 72, 72, 72, 72, 0, 0, 72, 0, 0, + 72, 72, 72, 0, 146, 146, 146, 146, 0, 105, + 0, 146, 105, 146, 0, 0, 0, 0, 0, 146, + 146, 146, 146, 0, 0, 0, 105, 105, 0, 146, + 146, 105, 146, 146, 146, 146, 146, 146, 146, 0, + 0, 146, 0, 0, 146, 146, 146, 159, 159, 159, + 159, 0, 99, 0, 159, 99, 159, 0, 0, 0, + 0, 105, 159, 159, 159, 159, 0, 0, 0, 99, + 99, 0, 159, 159, 99, 159, 159, 159, 159, 159, + 159, 159, 0, 0, 159, 0, 0, 159, 159, 159, + 100, 0, 0, 100, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 99, 0, 0, 100, 100, 0, + 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 114, 114, 114, 114, 0, 101, 0, + 114, 101, 114, 0, 0, 0, 0, 0, 114, 114, + 114, 114, 100, 0, 0, 101, 101, 0, 114, 114, + 101, 114, 114, 114, 114, 114, 114, 114, 0, 0, + 114, 0, 0, 114, 114, 114, 121, 121, 121, 121, + 0, 97, 0, 121, 97, 121, 0, 0, 0, 0, + 101, 121, 121, 121, 121, 0, 0, 0, 97, 97, + 0, 121, 121, 97, 121, 121, 121, 121, 121, 121, + 121, 0, 0, 121, 0, 0, 121, 121, 121, 98, + 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 97, 0, 0, 98, 98, 0, 0, + 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, + 105, 105, 105, 105, 0, 96, 0, 105, 96, 105, + 0, 0, 0, 0, 0, 105, 105, 105, 105, 0, + 0, 98, 96, 96, 0, 105, 105, 96, 105, 105, + 105, 105, 105, 105, 105, 0, 0, 105, 0, 0, + 0, 0, 0, 99, 99, 99, 99, 0, 84, 0, + 99, 84, 99, 0, 0, 0, 0, 96, 99, 99, + 99, 99, 0, 0, 0, 84, 84, 0, 99, 99, + 84, 99, 99, 99, 99, 99, 99, 99, 0, 0, + 0, 100, 100, 100, 100, 0, 85, 0, 100, 85, + 100, 0, 0, 0, 0, 0, 100, 100, 100, 100, + 84, 0, 0, 85, 85, 0, 100, 100, 85, 100, + 100, 100, 100, 100, 100, 100, 0, 0, 0, 101, + 101, 101, 101, 0, 86, 0, 101, 86, 101, 0, + 0, 0, 0, 0, 101, 101, 101, 101, 85, 0, + 0, 86, 86, 0, 101, 101, 86, 101, 101, 101, + 101, 101, 101, 101, 0, 0, 0, 0, 0, 0, + 0, 0, 97, 97, 97, 97, 0, 87, 0, 97, + 87, 97, 0, 0, 0, 0, 86, 97, 97, 97, + 97, 0, 0, 0, 87, 87, 0, 97, 97, 87, + 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, + 98, 98, 98, 98, 0, 148, 0, 98, 148, 98, + 0, 0, 0, 0, 0, 98, 98, 98, 98, 87, + 0, 0, 148, 148, 0, 98, 98, 148, 98, 98, + 98, 98, 98, 98, 98, 0, 96, 96, 96, 96, + 0, 135, 0, 96, 135, 96, 0, 0, 0, 0, + 0, 96, 96, 96, 96, 0, 0, 148, 135, 135, + 0, 96, 96, 135, 96, 96, 96, 96, 96, 96, + 96, 0, 0, 0, 0, 0, 0, 0, 0, 84, + 84, 84, 84, 0, 106, 0, 84, 106, 84, 0, + 0, 0, 0, 135, 84, 84, 84, 84, 0, 0, + 0, 106, 106, 0, 84, 84, 106, 84, 84, 84, + 84, 84, 84, 84, 0, 0, 0, 85, 85, 85, + 85, 0, 91, 0, 85, 91, 85, 0, 0, 0, + 0, 0, 85, 85, 85, 85, 106, 0, 0, 91, + 91, 0, 85, 85, 91, 85, 85, 85, 85, 85, + 85, 0, 0, 0, 0, 86, 86, 86, 86, 0, + 93, 0, 86, 93, 86, 0, 0, 0, 0, 0, + 86, 86, 0, 86, 91, 0, 0, 93, 93, 0, + 86, 86, 93, 86, 86, 86, 86, 86, 86, 0, + 168, 0, 0, 0, 0, 0, 0, 0, 87, 87, + 87, 87, 0, 94, 0, 87, 94, 87, 0, 0, + 0, 0, 93, 87, 87, 0, 0, 0, 0, 0, + 94, 94, 150, 87, 87, 94, 87, 87, 87, 87, + 87, 87, 0, 0, 0, 0, 148, 148, 148, 148, + 0, 92, 0, 148, 92, 148, 0, 0, 0, 0, + 0, 148, 148, 144, 0, 94, 144, 0, 92, 92, + 0, 148, 148, 92, 148, 148, 148, 148, 148, 0, + 144, 144, 135, 135, 135, 135, 0, 0, 0, 135, + 0, 135, 0, 0, 0, 0, 0, 135, 135, 0, + 0, 0, 0, 92, 0, 0, 83, 135, 135, 83, + 135, 135, 135, 135, 135, 144, 0, 0, 0, 70, + 0, 0, 70, 83, 83, 106, 106, 106, 106, 0, + 0, 0, 106, 0, 106, 0, 70, 70, 0, 0, + 106, 106, 0, 0, 0, 0, 157, 0, 0, 0, + 106, 106, 0, 106, 106, 106, 106, 106, 83, 0, 0, 0, 0, 91, 91, 91, 91, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 143, 143, 143, 143, 0, 91, 91, - 0, 91, 0, 0, 0, 0, 0, 0, 150, 0, - 0, 0, 0, 0, 151, 152, 153, 154, 143, 143, - 82, 82, 82, 82, 0, 0, 0, 155, 157, 158, - 159, 160, 161, 162, 0, 0, 163, 0, 0, 164, - 165, 166, 0, 0, 0, 82, 82, 0, 0, 0, - 0, 0, 0, 0, 94, 0, 69, 69, 69, 69, - 0, 0, 104, 0, 0, 0, 109, 0, 0, 118, - 0, 0, 0, 0, 0, 0, 125, 126, 127, 128, - 129, 69, 69, 132, 133, 0, 0, 0, 0, 0, - 140, 0, 0, 0, 0, 0, 0, 0, 0, 150, - 0, 0, 0, 0, 0, 151, 152, 153, 154, 0, - 0, 0, 0, 0, 0, 0, 0, 183, 0, 157, - 158, 159, 160, 161, 162, 0, 0, 163, 0, 0, - 164, 165, 166, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 245, + 91, 70, 91, 0, 168, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 91, 91, + 0, 91, 91, 91, 91, 0, 152, 153, 154, 155, + 0, 93, 93, 93, 93, 0, 150, 0, 93, 0, + 93, 0, 160, 161, 162, 163, 0, 0, 164, 0, + 0, 165, 166, 167, 0, 0, 93, 93, 0, 93, + 93, 93, 157, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 94, 94, 94, 94, 0, 0, + 0, 94, 0, 94, 0, 0, 0, 0, 0, 0, + 168, 0, 0, 0, 0, 0, 0, 0, 0, 94, + 94, 0, 94, 94, 0, 0, 0, 0, 0, 0, + 0, 0, 92, 92, 92, 92, 0, 0, 0, 92, + 0, 0, 150, 0, 144, 144, 144, 144, 0, 0, + 0, 144, 0, 0, 0, 0, 94, 92, 92, 0, + 92, 0, 0, 0, 104, 0, 0, 0, 109, 144, + 144, 118, 0, 0, 0, 0, 0, 0, 125, 126, + 127, 128, 129, 0, 0, 132, 133, 83, 83, 83, + 83, 0, 140, 0, 83, 0, 0, 0, 0, 0, + 70, 70, 70, 70, 0, 0, 0, 70, 0, 0, + 0, 0, 83, 83, 151, 0, 0, 0, 0, 184, + 152, 153, 154, 155, 0, 70, 70, 0, 0, 0, + 0, 0, 0, 156, 158, 159, 160, 161, 162, 163, + 0, 0, 164, 0, 0, 165, 166, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 151, 0, 247, 0, 0, 0, 152, 153, 154, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 158, 159, 160, 161, 162, 163, 0, 0, 164, 0, + 0, 165, 166, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 299, 0, 0, + 0, 301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 315, + 0, 0, 317, }; dEXT short yycheck[] = { 13, - 36, 86, 41, 36, 40, 44, 182, 59, 59, 41, - 93, 40, 59, 91, 91, 59, 257, 41, 257, 58, - 59, 41, 191, 41, 63, 59, 44, 91, 91, 59, - 329, 40, 46, 41, 93, 40, 93, 41, 257, 41, - 58, 59, 41, 57, 122, 63, 123, 61, 97, 98, - 99, 100, 101, 102, 93, 59, 41, 59, 41, 123, - 123, 360, 91, 44, 297, 298, 41, 41, 276, 277, - 40, 40, 278, 91, 40, 93, 326, 327, 0, 123, - 59, 331, 59, 36, 59, 59, 59, 40, 59, 123, - 123, 41, 106, 107, 123, 40, 40, 347, 123, 41, - 40, 351, 271, 59, 41, 123, 40, 123, 44, 59, - 260, 33, 257, 289, 36, 37, 38, 59, 40, 40, - 42, 43, 59, 45, 40, 93, 41, 40, 125, 143, - 144, 145, 146, 147, 148, 149, 305, 59, 91, 91, - 257, 36, 64, 192, 41, 266, 267, 268, 41, 270, - 271, 44, 91, 167, 168, 169, 170, 171, 172, 173, - 125, 41, 93, 298, 44, 58, 59, 40, 182, 91, - 123, 249, 186, 187, 41, 189, 254, 191, 58, 59, - 41, 350, 41, 63, 198, 0, 200, 201, 41, 41, - 41, 205, 40, 93, 41, 93, 59, 125, 59, 125, - 93, 123, 125, 125, 126, 125, 257, 41, 125, 59, - 41, 91, 123, 93, 297, 298, 41, 231, 33, 233, - 234, 36, 37, 38, 257, 40, 59, 42, 43, 262, - 45, 40, 93, 272, 273, 274, 275, 314, 297, 298, - 297, 298, 281, 123, 59, 297, 298, 41, 41, 64, - 297, 298, 337, 123, 272, 273, 274, 275, 297, 298, - 296, 300, 301, 281, 0, 297, 298, 123, 282, 287, - 288, 289, 290, 297, 298, 289, 91, 297, 298, 297, - 298, 59, 300, 301, 302, 303, 304, 305, 306, 297, - 298, 309, 41, 307, 312, 313, 314, 33, 297, 298, - 36, 37, 38, 41, 40, 258, 42, 43, 123, 45, - 125, 126, 297, 298, 297, 298, 297, 298, 297, 298, - 297, 298, 41, 59, 297, 298, 297, 298, 64, 297, - 298, 59, 346, 41, 256, 257, 258, 259, 260, 261, - 41, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, 274, 275, 59, 91, 8, 279, 280, 32, - 282, 283, 284, 285, 286, 125, 297, 298, 63, 291, - 292, 293, 294, 295, 296, 13, 144, 299, 307, 272, - 273, 274, 275, 346, 189, 96, 308, 123, 310, 311, - 126, -1, 272, 273, 274, 275, 91, 297, 298, 297, - 298, 281, -1, -1, 297, 298, 91, 287, 288, 289, - 290, 272, 273, 274, 275, -1, -1, 297, 298, -1, - 300, 301, 302, 303, 304, 305, 306, -1, 123, 309, - 91, -1, 312, 313, 314, -1, 297, 298, 123, -1, - -1, 256, 257, 258, 259, 260, 261, -1, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, -1, 123, -1, 279, 280, -1, 282, 283, 284, - 285, 286, 272, 273, 274, 275, 291, 292, 293, 294, - 295, 296, 41, -1, 299, 44, 91, -1, -1, -1, - -1, -1, -1, 308, -1, 310, 311, 297, 298, 58, - 59, -1, -1, -1, 63, -1, 266, 267, 268, -1, - 270, 271, -1, -1, -1, -1, -1, -1, 123, -1, - 256, 257, 258, 259, 260, 261, 125, 263, 264, 265, - -1, -1, 91, 269, 93, -1, 272, 273, 274, 275, + 41, 36, 86, 41, 91, 40, 44, 59, 91, 59, + 59, 93, 36, 183, 59, 59, 41, 91, 41, 331, + 58, 59, 91, 40, 257, 63, 41, 297, 298, 257, + 41, 59, 46, 40, 43, 41, 123, 276, 277, 257, + 123, 41, 51, 57, 41, 91, 41, 61, 59, 123, + 362, 44, 40, 59, 123, 93, 328, 329, 0, 40, + 192, 333, 41, 40, 40, 36, 40, 40, 40, 40, + 59, 278, 59, 123, 91, 123, 122, 349, 123, 40, + 59, 353, 91, 123, 97, 98, 99, 100, 101, 102, + 59, 33, 106, 107, 36, 37, 38, 59, 40, 123, + 42, 43, 260, 45, 44, 114, 123, 59, 41, 41, + 41, 257, 40, 122, 40, 125, 40, 59, 41, 41, + 91, 291, 64, 91, 41, 41, 59, 59, 59, 143, + 144, 145, 146, 147, 148, 149, 150, 59, 257, 36, + 91, 273, 59, 93, 91, 41, 298, 125, 44, 91, + 40, 40, 123, 0, 168, 169, 170, 171, 172, 173, + 174, 41, 58, 59, 41, 41, 41, 63, 93, 183, + 41, 41, 123, 187, 188, 307, 190, 91, 192, 125, + 193, 123, 93, 125, 126, 199, 33, 201, 202, 36, + 37, 38, 206, 40, 59, 42, 43, 93, 45, 266, + 267, 268, 59, 270, 271, 251, 289, 290, 257, 123, + 256, 41, 59, 125, 123, 297, 298, 64, 125, 233, + 352, 235, 236, 306, 125, 93, 309, 314, 41, 312, + 313, 314, 125, 257, 272, 273, 274, 275, 262, 41, + 41, 279, 251, 281, 91, 297, 298, 256, 0, 287, + 288, 289, 290, 297, 298, 339, 297, 298, 59, 297, + 298, 296, 300, 301, 302, 303, 304, 305, 306, 59, + 284, 309, 297, 298, 297, 298, 123, 291, 125, 126, + 40, 33, 297, 298, 36, 37, 38, 258, 40, 93, + 42, 43, 93, 45, 93, 309, 41, 297, 298, 41, + 297, 298, 297, 298, 297, 298, 123, 59, 297, 298, + 297, 298, 64, 125, 256, 257, 258, 259, 260, 261, + 123, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 348, 297, 298, 279, 280, 91, + 282, 283, 284, 285, 286, 297, 298, 297, 298, 291, + 292, 293, 294, 295, 296, 306, 91, 299, 309, 41, + 41, 312, 313, 314, 59, 41, 308, 59, 310, 311, + 41, 123, 297, 298, 126, 59, 272, 273, 274, 275, + 41, 8, 32, 279, 13, 281, 297, 298, 123, 144, + 348, 287, 288, 41, 309, 309, 44, 190, 312, 313, + 314, 297, 298, 96, 300, 301, 302, 303, 304, 256, + 257, 258, 259, 260, 261, 63, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 297, + 298, -1, 279, 280, -1, 282, 283, 284, 285, 286, + -1, -1, -1, 91, 291, 292, 293, 294, 295, 296, + 125, -1, 299, 91, 266, 267, 268, -1, 270, 271, + -1, 308, -1, 310, 311, -1, 41, -1, -1, 44, + -1, 272, 273, 274, 275, 123, -1, -1, 279, -1, + -1, -1, -1, 58, 59, 123, -1, -1, 63, -1, + -1, -1, -1, 297, 298, -1, 297, 298, 297, 298, + -1, -1, -1, -1, 256, 257, 258, 259, 260, 261, + -1, 263, 264, 265, -1, -1, 91, 269, 93, -1, + 272, 273, 274, 275, -1, -1, -1, 279, 280, -1, + 282, 283, 284, 285, 286, -1, -1, -1, -1, 291, + 292, 293, 294, 295, 296, -1, -1, 299, 123, -1, + -1, -1, 287, 288, 289, 290, 308, 33, 310, 311, + 36, 37, 38, -1, 40, 41, 42, 43, 44, 45, + 305, 306, -1, -1, 309, -1, -1, 312, 313, 314, + -1, -1, 58, 59, -1, -1, -1, 63, 64, -1, + -1, 266, 267, 268, -1, 270, 271, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 272, 273, 274, 275, + -1, -1, -1, 279, -1, 91, -1, 93, 33, -1, + -1, 36, 37, 38, -1, 40, 41, 42, 43, 44, + 45, 297, 298, 281, -1, -1, -1, -1, -1, 287, + 288, 289, 290, 58, 59, -1, -1, 123, 63, 64, + 126, 289, 300, 301, 302, 303, 304, 305, 306, -1, + -1, 309, -1, -1, 312, 313, 314, -1, 306, -1, + -1, 309, -1, -1, 312, 313, 314, 33, 93, -1, + 36, 37, 38, -1, 40, -1, 42, 43, -1, 45, + -1, -1, -1, -1, -1, -1, -1, 272, 273, 274, + 275, -1, -1, 59, 279, -1, 281, -1, 64, -1, + -1, 126, 287, 288, 289, 290, 304, 305, 306, -1, + 308, -1, 297, 298, -1, 300, 301, 302, 303, 304, + 305, 306, -1, -1, 309, 91, -1, 312, 313, 314, + -1, -1, 41, -1, -1, 44, -1, 335, -1, -1, + -1, -1, -1, -1, 342, -1, -1, -1, 346, -1, + 59, -1, -1, 91, -1, -1, -1, 123, -1, -1, + 126, 359, 360, -1, -1, -1, -1, -1, -1, -1, + -1, 257, 258, 259, 260, 261, -1, 263, 264, 265, + -1, -1, -1, 269, 93, 123, 272, 273, 274, 275, + -1, -1, -1, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, -1, 308, 309, 310, 311, 312, 313, 314, -1, + -1, -1, 257, 258, 259, 260, 261, -1, 263, 264, + 265, -1, -1, -1, 269, -1, -1, 272, 273, 274, + 275, -1, -1, -1, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, -1, 308, 309, 310, 311, 312, 313, 314, + 256, 257, 258, 259, 260, 261, -1, 263, 264, 265, + -1, -1, -1, 269, -1, 91, 272, 273, 274, 275, -1, -1, -1, 279, 280, -1, 282, 283, 284, 285, 286, -1, -1, -1, -1, 291, 292, 293, 294, 295, - 296, -1, -1, 299, 123, -1, -1, -1, -1, -1, - 91, -1, 308, 33, 310, 311, 36, 37, 38, -1, - 40, 41, 42, 43, 44, 45, 281, -1, -1, -1, - -1, -1, 287, 288, 289, 290, -1, -1, 58, 59, - -1, -1, 123, 63, 64, 300, 301, 302, 303, 304, - 305, 306, -1, -1, 309, -1, -1, 312, 313, 314, - -1, 306, -1, -1, 309, -1, -1, 312, 313, 314, - -1, 91, -1, 93, 33, -1, -1, 36, 37, 38, - -1, 40, 41, 42, 43, 44, 45, -1, 309, -1, - -1, 312, 313, 314, -1, -1, -1, -1, -1, 58, - 59, -1, -1, 123, 63, 64, 126, 266, 267, 268, - -1, 270, 271, -1, -1, -1, -1, -1, -1, 302, - 303, 304, -1, 306, 289, 290, -1, -1, -1, -1, - -1, 13, -1, 33, 93, -1, 36, 37, 38, -1, - 40, 306, 42, 43, 309, 45, -1, 312, 313, 314, - 333, -1, -1, 272, 273, 274, 275, 340, -1, 59, - 42, 344, 281, 45, 64, -1, -1, 126, 287, 288, - 289, 290, -1, -1, 357, 358, -1, -1, 297, 298, - -1, 300, 301, 302, 303, 304, 305, 306, -1, -1, - 309, 91, -1, 312, 313, 314, -1, -1, 41, 81, - -1, 44, -1, -1, -1, -1, 287, 288, 289, 290, - -1, -1, -1, 95, -1, -1, 59, -1, -1, 91, - -1, -1, -1, 123, 305, 306, 126, -1, 309, -1, - -1, 312, 313, 314, -1, -1, -1, 257, 258, 259, - 260, 261, -1, 263, 264, 265, -1, -1, -1, 269, - 93, 123, 272, 273, 274, 275, -1, -1, -1, 141, - 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306, -1, 308, 309, - 310, 311, 312, 313, 314, -1, 178, -1, 257, 258, - 259, 260, 261, 185, 263, 264, 265, -1, -1, -1, - 269, -1, -1, 272, 273, 274, 275, -1, -1, -1, - -1, 280, 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, -1, 308, - 309, 310, 311, 312, 313, 314, 256, 257, 258, 259, - 260, 261, -1, 263, 264, 265, -1, -1, -1, 269, - -1, 91, 272, 273, 274, 275, -1, -1, -1, 279, - 280, -1, 282, 283, 284, 285, 286, -1, -1, 91, - 43, 291, 292, 293, 294, 295, 296, 33, 51, 299, - 36, 37, 38, 123, 40, -1, 42, 43, 308, 45, - 310, 311, -1, -1, -1, 287, -1, 289, 290, -1, - -1, 123, -1, 59, -1, -1, -1, -1, 64, 272, - 273, 274, 275, 305, 306, -1, -1, 309, 91, -1, - 312, 313, 314, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 33, 297, 91, 36, 37, 38, -1, - 40, 114, 42, 43, 26, 45, -1, -1, -1, 122, + 296, 33, -1, 299, 36, 37, 38, 123, 40, -1, + 42, 43, 308, 45, 310, 311, -1, -1, 13, 287, + -1, 289, 290, -1, -1, -1, -1, 59, -1, -1, + -1, -1, 64, 272, 273, 274, 275, 305, 306, -1, + 279, 309, -1, -1, 312, 313, 314, 42, -1, -1, + 45, -1, -1, -1, -1, -1, -1, 33, 297, 91, + 36, 37, 38, -1, 40, -1, 42, 43, -1, 45, + -1, -1, 26, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 81, -1, 64, 43, + 44, 123, -1, -1, 126, -1, 50, -1, -1, -1, + 95, -1, -1, -1, -1, -1, -1, -1, 62, 63, + 64, 65, -1, 33, -1, 91, 36, 37, 38, -1, + 40, -1, 42, 43, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 43, 44, -1, 64, -1, -1, 123, 50, -1, - 126, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 62, 63, 64, 65, -1, -1, -1, -1, -1, 33, - -1, 91, 36, 37, 38, -1, 40, -1, 42, 43, - -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 64, -1, 141, 123, -1, -1, + 126, -1, -1, 107, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 64, -1, -1, 123, -1, 107, 126, -1, -1, -1, + -1, 91, -1, 289, 290, -1, 33, -1, -1, 36, + 37, 38, -1, 40, 179, 42, 43, -1, 45, 305, + 306, 186, -1, 309, -1, -1, 312, 313, 314, -1, + -1, -1, -1, 123, -1, -1, 126, 64, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 91, -1, 289, - 290, -1, 33, -1, -1, 36, 37, 38, -1, 40, - -1, 42, 43, -1, 45, 305, 306, 289, -1, 309, - -1, -1, 312, 313, 314, -1, 249, -1, -1, 123, - -1, 254, 126, 64, 306, -1, -1, 309, -1, -1, - 312, 313, 314, -1, -1, -1, -1, -1, -1, -1, - 256, 257, 258, 259, 260, 261, -1, 263, 264, 265, - 91, -1, -1, 269, -1, -1, 272, 273, 274, 275, - -1, -1, -1, 279, 280, -1, 282, 283, 284, 285, + -1, -1, -1, -1, 256, 257, 258, 259, 260, 261, + -1, 263, 264, 265, 91, -1, -1, 269, -1, -1, + 272, 273, 274, 275, -1, -1, -1, 279, 280, -1, + 282, 283, 284, 285, 286, -1, -1, -1, -1, 291, + 292, 293, 294, 295, 296, -1, 123, 299, -1, 126, + -1, 91, -1, -1, -1, 41, 308, -1, 310, 311, + -1, 257, 258, 259, 260, 261, 262, 263, 264, 265, + -1, -1, -1, 269, -1, -1, -1, 63, -1, -1, + -1, -1, -1, 123, 280, -1, 282, 283, 284, 285, 286, -1, -1, -1, -1, 291, 292, 293, 294, 295, - 296, 91, 123, 299, -1, 126, -1, -1, -1, -1, - -1, -1, 308, 41, 310, 311, 44, 257, 258, 259, - 260, 261, 262, 263, 264, 265, -1, -1, -1, 269, - -1, -1, -1, 123, -1, 63, -1, -1, -1, -1, + 296, -1, -1, 299, -1, 91, -1, -1, -1, -1, + -1, -1, 308, -1, 310, 311, -1, 257, 258, 259, + 260, 261, -1, 263, 264, 265, -1, -1, -1, 269, + 58, -1, -1, -1, -1, 63, -1, 123, -1, -1, 280, -1, 282, 283, 284, 285, 286, -1, -1, -1, -1, 291, 292, 293, 294, 295, 296, -1, -1, 299, - -1, -1, -1, 91, -1, -1, -1, 41, 308, -1, - 310, 311, -1, 257, 258, 259, 260, 261, -1, 263, - 264, 265, -1, -1, -1, 269, -1, -1, -1, 63, - -1, -1, -1, -1, -1, 123, 280, -1, 282, 283, - 284, 285, 286, -1, -1, -1, -1, 291, 292, 293, - 294, 295, 296, -1, -1, 299, -1, 91, -1, -1, - -1, -1, -1, -1, 308, -1, 310, 311, -1, -1, - -1, -1, -1, -1, -1, -1, 257, 258, 259, 260, - 261, -1, 263, 264, 265, -1, -1, -1, 269, 123, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 280, - -1, 282, 283, 284, 285, 286, -1, -1, -1, 91, - 291, 292, 293, 294, 295, 296, 33, -1, 299, 36, - 37, 38, -1, 40, -1, 42, 43, 308, 45, 310, - 311, -1, -1, -1, -1, -1, -1, 287, 288, 289, - 290, 123, 59, -1, -1, -1, -1, 64, -1, -1, + -1, -1, -1, 91, -1, -1, -1, -1, 308, -1, + 310, 311, -1, -1, -1, -1, 41, -1, -1, 44, + 257, 258, 259, 260, 261, -1, 263, 264, 265, -1, + -1, -1, 269, 58, 59, 123, -1, -1, 63, -1, + -1, -1, -1, 280, -1, 282, 283, 284, 285, 286, + -1, -1, -1, -1, 291, 292, 293, 294, 295, 296, + 33, -1, 299, 36, 37, 38, -1, 40, 93, 42, + 43, 308, 45, 310, 311, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 59, 287, 288, 289, + 290, 64, -1, -1, -1, -1, -1, -1, -1, -1, -1, 301, 302, 303, 304, 305, 306, -1, -1, 309, - -1, -1, 312, 313, 314, -1, -1, -1, -1, -1, + -1, -1, 312, 313, 314, -1, 33, -1, 91, 36, + 37, 38, -1, 40, 41, 42, 43, -1, 45, -1, + -1, -1, -1, -1, -1, 281, -1, -1, -1, -1, + -1, 287, 288, 289, 290, -1, -1, 64, -1, -1, + -1, -1, -1, 126, 300, 301, 302, 303, 304, 305, + 306, -1, -1, 309, -1, -1, 312, 313, 314, -1, -1, -1, 33, -1, 91, 36, 37, 38, -1, 40, - 41, 42, 43, -1, 45, -1, -1, -1, -1, -1, + -1, 42, 43, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, 281, -1, -1, -1, -1, -1, 287, 288, 289, 290, 64, -1, -1, -1, -1, -1, 126, -1, -1, 300, 301, 302, 303, 304, 305, 306, -1, - -1, 309, -1, -1, 312, 313, 314, -1, 33, -1, - 91, 36, 37, 38, -1, 40, -1, 42, 43, -1, - 45, -1, -1, -1, -1, -1, -1, 281, -1, -1, - -1, -1, -1, 287, 288, 289, 290, -1, -1, 64, - -1, -1, -1, -1, -1, 126, 300, 301, 302, 303, - 304, 305, 306, -1, -1, 309, -1, -1, 312, 313, - 314, -1, -1, -1, -1, -1, 91, 33, 93, -1, - 36, 37, 38, -1, 40, 41, 42, 43, -1, 45, - -1, -1, -1, -1, -1, 287, 288, 289, 290, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 64, -1, - -1, 126, 304, 305, 306, -1, -1, 309, -1, -1, - 312, 313, 314, -1, -1, -1, 41, -1, -1, 44, - 257, 258, 259, 260, 261, 91, 263, 264, 265, -1, + -1, 309, -1, -1, 312, 313, 314, -1, -1, -1, + 91, 33, 93, -1, 36, 37, 38, -1, 40, 41, + 42, 43, -1, 45, -1, -1, -1, 272, 273, 274, + 275, -1, -1, -1, 279, -1, 281, -1, -1, -1, + -1, -1, 64, 288, -1, 126, -1, -1, -1, -1, + -1, -1, 297, 298, -1, 300, 301, 302, 303, 304, + 41, -1, -1, 44, 257, 258, 259, 260, 261, 91, + 263, 264, 265, -1, -1, -1, 269, 58, 59, -1, + -1, -1, 63, -1, -1, -1, -1, 280, -1, 282, + 283, 284, 285, 286, -1, -1, -1, -1, 291, 292, + 293, 294, 295, 296, 126, -1, 299, -1, -1, -1, + -1, -1, 93, -1, -1, 308, 41, 310, 311, 44, + 257, 258, 259, 260, 261, -1, 263, 264, 265, -1, -1, -1, 269, 58, 59, -1, -1, -1, 63, -1, -1, -1, -1, 280, -1, 282, 283, 284, 285, 286, -1, -1, -1, -1, 291, 292, 293, 294, 295, 296, - 126, -1, 299, -1, -1, -1, -1, -1, 93, -1, - -1, 308, 41, 310, 311, 44, 257, 258, 259, 260, - 261, -1, 263, 264, 265, -1, -1, -1, 269, 58, - 59, -1, -1, -1, 63, -1, -1, -1, -1, 280, - -1, 282, 283, 284, 285, 286, -1, -1, -1, -1, - 291, 292, 293, 294, 295, 296, -1, -1, 299, -1, - -1, -1, -1, -1, 93, -1, -1, 308, -1, 310, - 311, -1, 257, 258, 259, 260, 261, -1, 263, 264, - 265, -1, 33, -1, 269, 36, 37, 38, -1, 40, - 41, 42, 43, -1, 45, 280, -1, 282, 283, 284, - 285, 286, -1, -1, -1, -1, 291, 292, 293, 294, - 295, 296, -1, 64, 299, -1, -1, -1, -1, -1, - -1, -1, -1, 308, -1, 310, 311, -1, -1, -1, - -1, 257, 258, 259, 260, 261, -1, 263, 264, 265, - 91, 33, -1, 269, 36, 37, 38, -1, 40, -1, - 42, 43, -1, 45, 280, -1, 282, 283, 284, 285, - 286, -1, -1, -1, -1, 291, 292, 293, 294, 295, - 296, -1, 64, 299, -1, 126, -1, -1, -1, -1, - -1, -1, 308, -1, 310, 311, -1, 272, 273, 274, - 275, -1, -1, -1, -1, -1, 281, 33, -1, 91, - 36, 37, 38, 288, 40, 41, 42, 43, -1, 45, - -1, -1, 297, 298, -1, 300, 301, 302, 303, 304, - -1, -1, -1, -1, -1, -1, -1, -1, 64, -1, - -1, -1, -1, -1, 126, -1, -1, -1, -1, -1, - -1, -1, -1, 272, 273, 274, 275, -1, -1, -1, - -1, -1, 281, 33, -1, 91, 36, 37, 38, -1, - 40, 41, 42, 43, -1, 45, -1, -1, 297, 298, - -1, 300, 301, 302, 303, 304, -1, -1, -1, -1, - -1, -1, -1, -1, 64, -1, -1, -1, -1, -1, - 126, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 257, 258, 259, 260, - 261, 91, 263, 264, 265, -1, 33, -1, 269, 36, + -1, -1, 299, -1, -1, -1, -1, -1, 93, -1, + -1, 308, -1, 310, 311, -1, 257, 258, 259, 260, + 261, -1, 263, 264, 265, -1, 33, -1, 269, 36, 37, 38, -1, 40, 41, 42, 43, -1, 45, 280, -1, 282, 283, 284, 285, 286, -1, -1, -1, -1, - 291, 292, 293, 294, 295, 296, 126, 64, 299, -1, + 291, 292, 293, 294, 295, 296, -1, 64, 299, -1, -1, -1, -1, -1, -1, -1, -1, 308, -1, 310, - 311, -1, -1, -1, 256, 257, 258, 259, 260, 261, - -1, 263, 264, 265, 91, -1, -1, 269, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 280, -1, + 311, -1, -1, -1, -1, 257, 258, 259, 260, 261, + -1, 263, 264, 265, 91, 33, -1, 269, 36, 37, + 38, -1, 40, -1, 42, 43, -1, 45, 280, -1, 282, 283, 284, 285, 286, -1, -1, -1, -1, 291, - 292, 293, 294, 295, 296, -1, -1, 299, -1, 126, - 91, -1, -1, -1, 41, -1, 308, 44, 310, 311, - -1, 257, 258, 259, 260, 261, -1, 263, 264, 265, - -1, 58, 59, 269, -1, -1, 63, -1, -1, -1, - -1, -1, 123, -1, 280, -1, 282, 283, 284, 285, - 286, -1, -1, -1, -1, 291, 292, 293, 294, 295, - 296, -1, -1, 299, 91, -1, 93, -1, -1, -1, - -1, -1, 308, -1, 310, 311, -1, 257, 258, 259, - 260, 261, -1, 263, 264, 265, -1, 33, -1, 269, - 36, 37, 38, -1, 40, -1, 42, 43, -1, 45, - 280, -1, 282, 283, 284, 285, 286, -1, -1, -1, - -1, 291, 292, 293, 294, 295, 296, -1, 64, 299, - -1, -1, -1, -1, -1, -1, -1, -1, 308, -1, - 310, 311, -1, -1, -1, -1, 41, -1, -1, 44, + 292, 293, 294, 295, 296, -1, 64, 299, -1, 126, + -1, -1, -1, -1, -1, -1, 308, -1, 310, 311, + -1, 272, 273, 274, 275, -1, -1, -1, 279, -1, + 281, 33, -1, 91, 36, 37, 38, -1, 40, 41, + 42, 43, -1, 45, -1, -1, 297, 298, -1, 300, + 301, 302, 303, 304, -1, -1, -1, -1, -1, -1, + -1, -1, 64, -1, -1, -1, -1, -1, 126, -1, + -1, -1, -1, -1, -1, -1, -1, 272, 273, 274, + 275, -1, -1, -1, 279, -1, 281, 33, -1, 91, + 36, 37, 38, -1, 40, 41, 42, 43, -1, 45, + -1, -1, 297, 298, -1, 300, 301, 302, 303, 304, + -1, -1, -1, -1, -1, -1, -1, -1, 64, -1, + -1, -1, -1, -1, 126, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 257, 258, 259, 260, 261, 91, 263, 264, 265, -1, - -1, -1, 269, 58, 59, -1, -1, -1, 63, -1, - -1, -1, -1, 280, -1, 282, 283, 284, 285, 286, + 33, -1, 269, 36, 37, 38, -1, 40, 41, 42, + 43, -1, 45, 280, -1, 282, 283, 284, 285, 286, -1, -1, -1, -1, 291, 292, 293, 294, 295, 296, - 126, -1, 299, 41, -1, -1, 44, -1, 93, -1, - -1, 308, -1, 310, 311, -1, -1, -1, -1, -1, - 58, 59, -1, -1, -1, 63, 287, 288, 289, 290, - -1, -1, -1, -1, -1, -1, -1, -1, 123, -1, - -1, 302, 303, 304, 305, 306, -1, -1, 309, -1, - -1, 312, 313, 314, -1, 93, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 272, 273, 274, 275, -1, - 41, -1, -1, -1, 281, -1, -1, -1, -1, -1, - 287, 288, 289, 290, -1, 123, -1, 58, 59, -1, - 297, 298, 63, 300, 301, 302, 303, 304, 305, 306, - -1, -1, 309, -1, -1, 312, 313, 314, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 91, -1, 93, -1, 41, -1, -1, -1, -1, -1, + 126, 64, 299, -1, -1, -1, -1, -1, -1, -1, + -1, 308, -1, 310, 311, -1, -1, -1, 256, 257, + 258, 259, 260, 261, -1, 263, 264, 265, 91, -1, + -1, 269, 41, -1, -1, 44, -1, -1, -1, -1, + -1, -1, 280, -1, 282, 283, 284, 285, 286, 58, + 59, -1, -1, 291, 292, 293, 294, 295, 296, -1, + -1, 299, -1, 126, -1, -1, -1, -1, -1, -1, + 308, -1, 310, 311, -1, 257, 258, 259, 260, 261, + -1, 263, 264, 265, 93, -1, -1, 269, 41, -1, + -1, 44, -1, -1, -1, -1, -1, -1, 280, -1, + 282, 283, 284, 285, 286, 58, 59, -1, -1, 291, + 292, 293, 294, 295, 296, -1, -1, 299, -1, -1, + -1, -1, -1, -1, -1, -1, 308, -1, 310, 311, -1, 257, 258, 259, 260, 261, -1, 263, 264, 265, - -1, 58, 59, 269, -1, -1, 63, -1, -1, -1, - -1, -1, 123, -1, 280, -1, 282, 283, 284, 285, + 93, 33, -1, 269, 36, 37, 38, -1, 40, -1, + 42, 43, -1, 45, 280, -1, 282, 283, 284, 285, 286, -1, -1, -1, -1, 291, 292, 293, 294, 295, - 296, -1, -1, 299, 91, -1, 93, -1, -1, -1, - 41, -1, 308, 44, 310, 311, -1, 272, 273, 274, - 275, -1, -1, -1, -1, -1, 281, 58, 59, -1, - -1, -1, 287, 288, 289, 290, 123, -1, -1, -1, - -1, -1, 297, 298, -1, 300, 301, 302, 303, 304, - 305, 306, -1, -1, 309, -1, -1, 312, 313, 314, - -1, -1, 93, -1, 272, 273, 274, 275, -1, 41, - -1, -1, 44, 281, -1, -1, -1, -1, -1, 287, - 288, 289, 290, -1, -1, -1, 58, 59, -1, 297, - 298, 63, 300, 301, 302, 303, 304, 305, 306, 25, - 26, 309, -1, -1, 312, 313, 314, -1, -1, -1, - -1, 37, -1, -1, -1, -1, -1, 43, 44, 45, - -1, 93, -1, -1, 50, -1, -1, -1, -1, -1, - -1, 272, 273, 274, 275, -1, 62, 63, 64, 65, - 281, -1, -1, -1, -1, -1, 287, 288, 289, 290, - -1, 123, 41, -1, -1, 44, 297, 298, -1, 300, - 301, 302, 303, 304, 305, 306, -1, -1, 309, 58, - 59, 312, 313, 314, 63, -1, -1, -1, -1, -1, - -1, 107, -1, -1, -1, 272, 273, 274, 275, -1, - -1, -1, -1, -1, 281, -1, -1, -1, -1, -1, - 287, 288, 289, 290, 93, -1, 41, -1, -1, -1, - 297, 298, -1, 300, 301, 302, 303, 304, 305, 306, - -1, -1, 309, 58, 59, 312, 313, 314, 63, -1, - -1, -1, -1, -1, 123, -1, -1, -1, -1, -1, - 166, 272, 273, 274, 275, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 41, -1, 91, 44, 93, -1, - -1, -1, -1, -1, 190, -1, 297, 298, -1, 300, - -1, 58, 59, -1, -1, -1, 63, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 123, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 272, 273, 274, 275, -1, 41, 93, -1, 44, 281, - -1, -1, -1, -1, -1, 287, 288, 289, 290, -1, - -1, -1, 58, 59, -1, 297, 298, 63, 300, 301, - 302, 303, 304, 305, 306, -1, 123, 309, -1, -1, - 312, 313, 314, -1, -1, -1, -1, -1, -1, -1, - 41, -1, -1, 44, -1, -1, -1, 93, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 58, 59, -1, - -1, -1, 63, -1, -1, -1, -1, -1, -1, -1, + 296, -1, 64, 299, -1, -1, -1, -1, -1, -1, + -1, -1, 308, -1, 310, 311, -1, -1, -1, -1, + 41, -1, -1, 44, 257, 258, 259, 260, 261, 91, + 263, 264, 265, -1, -1, -1, 269, 58, 59, -1, + -1, -1, 63, -1, -1, -1, -1, 280, -1, 282, + 283, 284, 285, 286, -1, -1, -1, -1, 291, 292, + 293, 294, 295, 296, 126, 41, 299, -1, 44, -1, + 91, -1, 93, -1, -1, 308, -1, 310, 311, -1, + -1, -1, 58, 59, -1, -1, -1, 63, -1, -1, -1, -1, -1, 272, 273, 274, 275, -1, -1, -1, - -1, -1, 281, -1, -1, -1, -1, -1, 287, 288, - 289, 290, 93, -1, 41, -1, -1, 44, 297, 298, - -1, 300, 301, 302, 303, 304, 305, 306, -1, -1, - 309, 58, 59, 312, 313, 314, 63, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 272, 273, 274, - 275, -1, -1, -1, -1, -1, 281, -1, -1, -1, - -1, -1, 287, 288, 289, 290, 93, -1, -1, -1, - -1, -1, 297, 298, -1, 300, 301, 302, 303, 304, - 305, 306, -1, -1, 309, -1, -1, 312, 313, 314, - -1, -1, -1, -1, -1, 272, 273, 274, 275, -1, - 41, -1, -1, 44, 281, -1, -1, -1, -1, -1, - 287, 288, 289, 290, -1, -1, -1, 58, 59, -1, - 297, 298, 63, 300, 301, 302, 303, 304, 305, 306, - -1, -1, 309, -1, -1, 312, 313, 314, -1, -1, - -1, -1, -1, -1, -1, -1, 272, 273, 274, 275, - -1, 41, 93, -1, 44, 281, -1, -1, -1, -1, + 279, -1, 123, -1, -1, -1, -1, -1, 41, -1, + -1, 44, -1, -1, -1, 91, -1, 93, 297, 298, + -1, 300, -1, -1, -1, 58, 59, -1, -1, -1, + 63, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 123, -1, 272, + 273, 274, 275, -1, 41, -1, 279, 44, -1, -1, + 93, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 58, 59, -1, 297, 298, 63, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 123, -1, -1, -1, -1, 257, 258, 259, 260, 261, + -1, 263, 264, 265, 91, -1, 93, 269, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 280, -1, + 282, 283, 284, 285, 286, -1, -1, -1, -1, 291, + 292, 293, 294, 295, 296, -1, -1, 299, -1, 91, + -1, -1, -1, -1, -1, -1, 308, -1, 310, 311, + -1, 272, 273, 274, 275, -1, -1, -1, 279, -1, + 281, -1, -1, -1, -1, -1, 287, 288, 289, 290, + -1, 123, -1, -1, -1, -1, 297, 298, -1, 300, + 301, 302, 303, 304, 305, 306, -1, -1, 309, -1, + -1, 312, 313, 314, -1, -1, 272, 273, 274, 275, + -1, 41, -1, 279, 44, 281, -1, -1, -1, -1, -1, 287, 288, 289, 290, -1, -1, -1, 58, 59, -1, 297, 298, 63, 300, 301, 302, 303, 304, 305, - 306, -1, -1, 309, -1, -1, 312, 313, 314, -1, - -1, 272, 273, 274, 275, -1, -1, -1, -1, -1, - 281, -1, -1, 93, -1, -1, 287, 288, 289, 290, - -1, -1, 41, -1, -1, 44, 297, 298, -1, 300, - 301, 302, 303, 304, 305, 306, -1, -1, 309, 58, - 59, 312, 313, 314, 63, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 272, 273, 274, 275, -1, - 41, -1, -1, 44, 281, -1, -1, -1, -1, -1, - 287, 288, 289, 290, 93, -1, -1, 58, 59, -1, + 306, -1, -1, 309, -1, -1, 312, 313, 314, 272, + 273, 274, 275, -1, -1, -1, 279, -1, 281, -1, + -1, -1, -1, 93, 287, 288, 289, 290, -1, -1, + -1, -1, -1, -1, 297, 298, -1, 300, 301, 302, + 303, 304, 305, 306, -1, -1, 309, -1, -1, 312, + 313, 314, -1, 123, -1, 272, 273, 274, 275, 91, + 41, -1, 279, -1, 281, -1, -1, -1, -1, -1, + 287, 288, 289, 290, -1, -1, -1, 58, 59, -1, 297, 298, 63, 300, 301, 302, 303, 304, 305, 306, - -1, -1, 309, -1, -1, 312, 313, 314, -1, 41, - -1, -1, 44, -1, -1, -1, -1, -1, -1, -1, - 41, -1, 93, 44, -1, -1, 58, 59, -1, -1, - -1, 63, -1, -1, -1, -1, -1, 58, 59, -1, - -1, -1, 63, -1, -1, -1, -1, -1, -1, -1, - -1, 272, 273, 274, 275, -1, 41, -1, -1, 44, - 281, 93, -1, -1, -1, -1, 287, 288, 289, 290, - -1, -1, 93, 58, 59, -1, 297, 298, 63, 300, - 301, 302, 303, 304, 305, 306, -1, -1, 309, -1, - -1, 312, 313, 314, -1, -1, -1, -1, -1, -1, - -1, -1, 272, 273, 274, 275, -1, 41, 93, -1, - 44, 281, -1, -1, -1, -1, -1, 287, 288, 289, - 290, -1, -1, -1, 58, 59, -1, 297, 298, 63, - 300, 301, 302, 303, 304, 305, 306, -1, -1, 309, + -1, 123, 309, -1, -1, 312, 313, 314, -1, -1, + -1, -1, -1, 41, -1, 287, 288, 289, 290, -1, + 91, -1, 93, -1, -1, -1, -1, -1, -1, -1, + 58, 59, 304, 305, 306, 63, -1, 309, -1, -1, + 312, 313, 314, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 123, -1, -1, -1, -1, 41, -1, -1, + 44, -1, -1, 91, -1, 93, -1, -1, -1, -1, + -1, -1, -1, -1, 58, 59, -1, -1, -1, 63, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 41, -1, -1, 44, -1, -1, 93, - -1, -1, -1, 272, 273, 274, 275, -1, -1, -1, - 58, 59, 281, -1, -1, 63, -1, -1, 287, 288, - 289, 290, -1, -1, -1, -1, -1, -1, 297, 298, - -1, 300, 301, 302, 303, 304, 305, 306, -1, -1, - 309, 272, 273, 274, 275, 93, -1, -1, -1, -1, - 281, -1, -1, -1, -1, -1, 287, 288, 289, 290, - -1, -1, -1, -1, -1, -1, 297, 298, -1, 300, - 301, 302, 303, 304, 305, 306, -1, -1, -1, -1, - 272, 273, 274, 275, -1, 41, -1, -1, 44, 281, - -1, 272, 273, 274, 275, 287, 288, 289, 290, -1, - 281, -1, 58, 59, -1, 297, 298, 63, 300, 301, - 302, 303, 304, 305, 306, -1, 297, 298, -1, 300, - 301, 302, 303, 304, -1, -1, -1, 272, 273, 274, - 275, -1, 41, -1, -1, 44, 281, 93, -1, -1, + -1, -1, -1, -1, -1, 123, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 93, + -1, -1, 272, 273, 274, 275, -1, -1, -1, 279, + -1, 281, -1, -1, -1, -1, -1, 287, 288, 289, + 290, -1, -1, 41, -1, -1, 44, 297, 298, 123, + 300, 301, 302, 303, 304, 305, 306, -1, -1, 309, + 58, 59, 312, 313, 314, 63, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 287, 288, 289, 290, -1, + -1, -1, -1, -1, -1, -1, 41, -1, -1, 44, + 302, 303, 304, 305, 306, 93, -1, 309, -1, -1, + 312, 313, 314, 58, 59, -1, -1, -1, 63, -1, + -1, 272, 273, 274, 275, -1, -1, -1, 279, -1, + 281, -1, -1, -1, -1, 123, 287, 288, 289, 290, + -1, -1, -1, -1, -1, -1, 297, 298, 93, 300, + 301, 302, 303, 304, 305, 306, -1, -1, 309, -1, + -1, 312, 313, 314, 272, 273, 274, 275, -1, 41, + -1, 279, -1, 281, -1, -1, -1, -1, 123, 287, + 288, 289, 290, -1, -1, -1, 58, 59, -1, 297, + 298, 63, 300, 301, 302, 303, 304, 305, 306, -1, + -1, 309, -1, -1, 312, 313, 314, -1, 272, 273, + 274, 275, -1, 41, -1, 279, 44, 281, -1, 91, + -1, 93, -1, 287, 288, 289, 290, -1, -1, -1, + 58, 59, -1, 297, 298, 63, 300, 301, 302, 303, + 304, 305, 306, -1, -1, 309, -1, -1, 312, 313, + 314, 123, -1, -1, -1, -1, 41, 25, 26, 44, + -1, -1, -1, -1, -1, 93, -1, -1, -1, 37, + -1, -1, -1, 58, 59, 43, 44, 45, 63, -1, + -1, -1, 50, -1, 272, 273, 274, 275, -1, -1, + -1, 279, -1, 281, 62, 63, 64, 65, -1, 287, + 288, 289, 290, -1, -1, -1, -1, -1, 93, 297, + 298, -1, 300, 301, 302, 303, 304, 305, 306, -1, + -1, 309, -1, -1, 312, 313, 314, 272, 273, 274, + 275, -1, 41, -1, 279, 44, 281, -1, -1, 107, -1, -1, 287, 288, 289, 290, -1, -1, -1, 58, 59, -1, 297, 298, 63, 300, 301, 302, 303, 304, - 305, 306, -1, -1, -1, -1, -1, -1, 41, -1, - -1, 44, -1, -1, -1, -1, -1, -1, 272, 273, - 274, 275, -1, -1, 93, 58, 59, 281, -1, -1, - 63, -1, -1, 287, 288, 289, 290, -1, -1, -1, - -1, -1, -1, 297, 298, -1, 300, 301, 302, 303, - 304, 305, 306, 41, -1, -1, 44, -1, -1, -1, - 93, -1, -1, -1, 272, 273, 274, 275, -1, -1, - 58, 59, -1, 281, -1, 63, -1, -1, -1, 287, - 288, 289, 290, -1, -1, -1, -1, -1, -1, 297, - 298, -1, 300, 301, 302, 303, 304, 305, 306, 41, - -1, -1, 44, -1, -1, 93, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 58, 59, -1, -1, + 305, 306, -1, -1, 309, -1, -1, 312, 313, 314, + -1, -1, -1, -1, -1, 41, -1, -1, 44, -1, + -1, -1, -1, -1, 93, -1, -1, -1, -1, -1, + -1, -1, 58, 59, -1, -1, -1, 63, -1, 167, + 272, 273, 274, 275, -1, -1, -1, 279, -1, 281, + -1, -1, -1, -1, -1, 287, 288, 289, 290, -1, + -1, -1, -1, 191, -1, 297, 298, 93, 300, 301, + 302, 303, 304, 305, 306, -1, -1, 309, -1, -1, + 312, 313, 314, -1, 272, 273, 274, 275, -1, 41, + -1, 279, 44, 281, -1, -1, -1, -1, -1, 287, + 288, 289, 290, -1, -1, -1, 58, 59, -1, 297, + 298, 63, 300, 301, 302, 303, 304, 305, 306, -1, + -1, 309, -1, -1, 312, 313, 314, 272, 273, 274, + 275, -1, 41, -1, 279, 44, 281, -1, -1, -1, + -1, 93, 287, 288, 289, 290, -1, -1, -1, 58, + 59, -1, 297, 298, 63, 300, 301, 302, 303, 304, + 305, 306, -1, -1, 309, -1, -1, 312, 313, 314, + 41, -1, -1, 44, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 93, -1, -1, 58, 59, -1, + -1, -1, 63, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 272, 273, 274, 275, -1, 41, -1, + 279, 44, 281, -1, -1, -1, -1, -1, 287, 288, + 289, 290, 93, -1, -1, 58, 59, -1, 297, 298, + 63, 300, 301, 302, 303, 304, 305, 306, -1, -1, + 309, -1, -1, 312, 313, 314, 272, 273, 274, 275, + -1, 41, -1, 279, 44, 281, -1, -1, -1, -1, + 93, 287, 288, 289, 290, -1, -1, -1, 58, 59, + -1, 297, 298, 63, 300, 301, 302, 303, 304, 305, + 306, -1, -1, 309, -1, -1, 312, 313, 314, 41, + -1, -1, 44, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 93, -1, -1, 58, 59, -1, -1, -1, 63, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 41, -1, -1, 44, -1, -1, - -1, 93, -1, -1, -1, -1, 272, 273, 274, 275, - -1, 58, 59, -1, -1, 281, 63, -1, -1, -1, - -1, 287, 288, 289, 290, -1, -1, -1, -1, -1, - -1, 297, 298, -1, 300, 301, 302, 303, 304, 305, - 306, 41, -1, -1, 44, -1, 93, -1, -1, -1, - -1, -1, -1, 272, 273, 274, 275, -1, 58, 59, - -1, -1, 281, 63, -1, -1, -1, -1, 287, 288, - 289, 290, -1, -1, -1, -1, -1, 41, 297, 298, - 44, 300, 301, 302, 303, 304, 305, 306, -1, 272, - 273, 274, 275, 93, 58, 59, -1, -1, 281, 63, - -1, -1, -1, -1, 287, 288, 289, 290, -1, -1, - -1, -1, -1, -1, 297, 298, -1, 300, 301, 302, - 303, 304, 305, 41, -1, -1, 44, -1, -1, 93, - -1, -1, -1, -1, 272, 273, 274, 275, -1, -1, - 58, 59, -1, 281, -1, 63, -1, -1, -1, 287, - 288, -1, 290, -1, -1, -1, -1, -1, -1, 297, - 298, -1, 300, 301, 302, 303, 304, 305, 41, -1, - -1, 44, -1, -1, -1, 93, -1, -1, -1, -1, - 272, 273, 274, 275, -1, 58, 59, -1, -1, 281, - 63, -1, 91, -1, -1, 287, 288, -1, -1, -1, - 41, -1, -1, 44, -1, 297, 298, -1, 300, 301, - 302, 303, 304, 305, -1, -1, -1, 58, 59, -1, - 93, -1, 63, -1, 123, 272, 273, 274, 275, -1, - -1, -1, -1, -1, 281, -1, -1, -1, -1, -1, - 287, 288, 41, -1, -1, 44, -1, -1, -1, -1, - 297, 298, 93, 300, 301, 302, 303, 304, -1, 58, - 59, -1, 41, -1, 63, 44, -1, -1, -1, -1, - -1, -1, 272, 273, 274, 275, -1, -1, -1, 58, - 59, 281, -1, -1, -1, 58, -1, 287, 288, 41, - 63, -1, 44, -1, 93, -1, -1, 297, 298, -1, - 300, 301, 302, 303, 304, -1, 58, 59, 272, 273, - 274, 275, -1, -1, 93, -1, -1, 281, 91, -1, - -1, -1, -1, 287, 288, 41, -1, -1, 44, -1, - -1, -1, -1, 297, 298, -1, 300, 301, 302, 303, - 304, 93, 58, 59, -1, -1, -1, -1, -1, -1, - 123, -1, -1, -1, 272, 273, 274, 275, -1, -1, - -1, -1, -1, 281, -1, -1, -1, -1, -1, 287, - 288, -1, -1, -1, -1, -1, -1, 93, -1, 297, - 298, 63, 300, 301, 302, 303, 304, -1, 287, 288, - 289, 290, -1, -1, -1, -1, -1, -1, -1, 272, - 273, 274, 275, -1, 303, 304, 305, 306, 281, 91, - 309, -1, -1, 312, 313, 314, -1, -1, -1, -1, - -1, -1, -1, -1, 297, 298, -1, 300, 301, 302, - 303, 272, 273, 274, 275, -1, -1, -1, -1, -1, - 281, 123, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 297, 298, -1, 300, - 301, 302, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 272, 273, 274, 275, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 272, 273, 274, 275, -1, 297, 298, - -1, 300, -1, -1, -1, -1, -1, -1, 281, -1, - -1, -1, -1, -1, 287, 288, 289, 290, 297, 298, - 272, 273, 274, 275, -1, -1, -1, 300, 301, 302, - 303, 304, 305, 306, -1, -1, 309, -1, -1, 312, - 313, 314, -1, -1, -1, 297, 298, -1, -1, -1, - -1, -1, -1, -1, 30, -1, 272, 273, 274, 275, - -1, -1, 38, -1, -1, -1, 42, -1, -1, 45, - -1, -1, -1, -1, -1, -1, 52, 53, 54, 55, - 56, 297, 298, 59, 60, -1, -1, -1, -1, -1, - 66, -1, -1, -1, -1, -1, -1, -1, -1, 281, + 272, 273, 274, 275, -1, 41, -1, 279, 44, 281, -1, -1, -1, -1, -1, 287, 288, 289, 290, -1, - -1, -1, -1, -1, -1, -1, -1, 93, -1, 301, + -1, 93, 58, 59, -1, 297, 298, 63, 300, 301, 302, 303, 304, 305, 306, -1, -1, 309, -1, -1, - 312, 313, 314, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 175, + -1, -1, -1, 272, 273, 274, 275, -1, 41, -1, + 279, 44, 281, -1, -1, -1, -1, 93, 287, 288, + 289, 290, -1, -1, -1, 58, 59, -1, 297, 298, + 63, 300, 301, 302, 303, 304, 305, 306, -1, -1, + -1, 272, 273, 274, 275, -1, 41, -1, 279, 44, + 281, -1, -1, -1, -1, -1, 287, 288, 289, 290, + 93, -1, -1, 58, 59, -1, 297, 298, 63, 300, + 301, 302, 303, 304, 305, 306, -1, -1, -1, 272, + 273, 274, 275, -1, 41, -1, 279, 44, 281, -1, + -1, -1, -1, -1, 287, 288, 289, 290, 93, -1, + -1, 58, 59, -1, 297, 298, 63, 300, 301, 302, + 303, 304, 305, 306, -1, -1, -1, -1, -1, -1, + -1, -1, 272, 273, 274, 275, -1, 41, -1, 279, + 44, 281, -1, -1, -1, -1, 93, 287, 288, 289, + 290, -1, -1, -1, 58, 59, -1, 297, 298, 63, + 300, 301, 302, 303, 304, 305, 306, -1, -1, -1, + 272, 273, 274, 275, -1, 41, -1, 279, 44, 281, + -1, -1, -1, -1, -1, 287, 288, 289, 290, 93, + -1, -1, 58, 59, -1, 297, 298, 63, 300, 301, + 302, 303, 304, 305, 306, -1, 272, 273, 274, 275, + -1, 41, -1, 279, 44, 281, -1, -1, -1, -1, + -1, 287, 288, 289, 290, -1, -1, 93, 58, 59, + -1, 297, 298, 63, 300, 301, 302, 303, 304, 305, + 306, -1, -1, -1, -1, -1, -1, -1, -1, 272, + 273, 274, 275, -1, 41, -1, 279, 44, 281, -1, + -1, -1, -1, 93, 287, 288, 289, 290, -1, -1, + -1, 58, 59, -1, 297, 298, 63, 300, 301, 302, + 303, 304, 305, 306, -1, -1, -1, 272, 273, 274, + 275, -1, 41, -1, 279, 44, 281, -1, -1, -1, + -1, -1, 287, 288, 289, 290, 93, -1, -1, 58, + 59, -1, 297, 298, 63, 300, 301, 302, 303, 304, + 305, -1, -1, -1, -1, 272, 273, 274, 275, -1, + 41, -1, 279, 44, 281, -1, -1, -1, -1, -1, + 287, 288, -1, 290, 93, -1, -1, 58, 59, -1, + 297, 298, 63, 300, 301, 302, 303, 304, 305, -1, + 91, -1, -1, -1, -1, -1, -1, -1, 272, 273, + 274, 275, -1, 41, -1, 279, 44, 281, -1, -1, + -1, -1, 93, 287, 288, -1, -1, -1, -1, -1, + 58, 59, 123, 297, 298, 63, 300, 301, 302, 303, + 304, 305, -1, -1, -1, -1, 272, 273, 274, 275, + -1, 41, -1, 279, 44, 281, -1, -1, -1, -1, + -1, 287, 288, 41, -1, 93, 44, -1, 58, 59, + -1, 297, 298, 63, 300, 301, 302, 303, 304, -1, + 58, 59, 272, 273, 274, 275, -1, -1, -1, 279, + -1, 281, -1, -1, -1, -1, -1, 287, 288, -1, + -1, -1, -1, 93, -1, -1, 41, 297, 298, 44, + 300, 301, 302, 303, 304, 93, -1, -1, -1, 41, + -1, -1, 44, 58, 59, 272, 273, 274, 275, -1, + -1, -1, 279, -1, 281, -1, 58, 59, -1, -1, + 287, 288, -1, -1, -1, -1, 63, -1, -1, -1, + 297, 298, -1, 300, 301, 302, 303, 304, 93, -1, + -1, -1, -1, 272, 273, 274, 275, -1, -1, -1, + 279, 93, 281, -1, 91, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 297, 298, + -1, 300, 301, 302, 303, -1, 287, 288, 289, 290, + -1, 272, 273, 274, 275, -1, 123, -1, 279, -1, + 281, -1, 303, 304, 305, 306, -1, -1, 309, -1, + -1, 312, 313, 314, -1, -1, 297, 298, -1, 300, + 301, 302, 63, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 272, 273, 274, 275, -1, -1, + -1, 279, -1, 281, -1, -1, -1, -1, -1, -1, + 91, -1, -1, -1, -1, -1, -1, -1, -1, 297, + 298, -1, 300, 301, -1, -1, -1, -1, -1, -1, + -1, -1, 272, 273, 274, 275, -1, -1, -1, 279, + -1, -1, 123, -1, 272, 273, 274, 275, -1, -1, + -1, 279, -1, -1, -1, -1, 30, 297, 298, -1, + 300, -1, -1, -1, 38, -1, -1, -1, 42, 297, + 298, 45, -1, -1, -1, -1, -1, -1, 52, 53, + 54, 55, 56, -1, -1, 59, 60, 272, 273, 274, + 275, -1, 66, -1, 279, -1, -1, -1, -1, -1, + 272, 273, 274, 275, -1, -1, -1, 279, -1, -1, + -1, -1, 297, 298, 281, -1, -1, -1, -1, 93, + 287, 288, 289, 290, -1, 297, 298, -1, -1, -1, + -1, -1, -1, 300, 301, 302, 303, 304, 305, 306, + -1, -1, 309, -1, -1, 312, 313, 314, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 281, -1, 176, -1, -1, -1, 287, 288, 289, 290, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 301, 302, 303, 304, 305, 306, -1, -1, 309, -1, + -1, 312, 313, 314, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 253, -1, -1, + -1, 255, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 284, + -1, -1, 286, }; #define YYFINAL 1 #ifndef YYDEBUG @@ -1107,6 +1104,7 @@ dEXT char * yyrule[] = { "sideff : expr UNLESS expr", "sideff : expr WHILE expr", "sideff : expr UNTIL iexpr", +"sideff : expr FOR expr", "else :", "else : ELSE mblock", "else : ELSIF '(' mexpr ')' mblock else", @@ -1285,9 +1283,9 @@ dEXT int yyerrflag; dEXT int yychar; dEXT YYSTYPE yyval; dEXT YYSTYPE yylval; -#line 631 "perly.y" +#line 635 "perly.y" /* PROGRAM */ -#line 1360 "perly.c" +#line 1349 "perly.c" #define YYABORT goto yyabort #define YYACCEPT goto yyaccept #define YYERROR goto yyerrlab @@ -1304,8 +1302,7 @@ struct ysv { }; void -yydestruct(ptr) -void* ptr; +yydestruct(void *ptr) { struct ysv* ysave = (struct ysv*)ptr; if (ysave->yyss) Safefree(ysave->yyss); @@ -1320,7 +1317,7 @@ void* ptr; } int -yyparse() +yyparse(void) { register int yym, yyn, yystate; register short *yyssp; @@ -1331,12 +1328,15 @@ yyparse() int retval = 0; #if YYDEBUG register char *yys; +#ifndef __cplusplus # ifndef getenv extern char *getenv(); # endif #endif +#endif - struct ysv *ysave = (struct ysv*)safemalloc(sizeof(struct ysv)); + struct ysv *ysave; + New(73, ysave, 1, struct ysv); SAVEDESTRUCTOR(yydestruct, ysave); ysave->oldyydebug = yydebug; ysave->oldyynerrs = yynerrs; @@ -1352,6 +1352,7 @@ yyparse() if (yyn >= '0' && yyn <= '9') yydebug = yyn - '0'; } + else SETERRNO(0,SS$_NORMAL); #endif yynerrs = 0; @@ -1361,8 +1362,10 @@ yyparse() /* ** Initialize private stacks (yyparse may be called from an action) */ - ysave->yyss = yyss = (short*)safemalloc(yystacksize*sizeof(short)); - ysave->yyvs = yyvs = (YYSTYPE*)safemalloc(yystacksize*sizeof(YYSTYPE)); + New(73, yyss, yystacksize, short); + New(73, yyvs, yystacksize, YYSTYPE); + ysave->yyss = yyss; + ysave->yyvs = yyvs; if (!yyvs || !yyss) goto yyoverflow; @@ -1517,9 +1520,9 @@ case 1: #line 86 "perly.y" { #if defined(YYDEBUG) && defined(DEBUGGING) - yydebug = (debug & 1); + yydebug = (PL_debug & 1); #endif - expect = XSTATE; + PL_expect = XSTATE; } break; case 2: @@ -1528,8 +1531,8 @@ case 2: break; case 3: #line 97 "perly.y" -{ if (copline > (line_t)yyvsp[-3].ival) - copline = yyvsp[-3].ival; +{ if (PL_copline > (line_t)yyvsp[-3].ival) + PL_copline = yyvsp[-3].ival; yyval.opval = block_end(yyvsp[-2].ival, yyvsp[-1].opval); } break; case 4: @@ -1538,8 +1541,8 @@ case 4: break; case 5: #line 107 "perly.y" -{ if (copline > (line_t)yyvsp[-3].ival) - copline = yyvsp[-3].ival; +{ if (PL_copline > (line_t)yyvsp[-3].ival) + PL_copline = yyvsp[-3].ival; yyval.opval = block_end(yyvsp[-2].ival, yyvsp[-1].opval); } break; case 6: @@ -1558,8 +1561,8 @@ case 9: #line 121 "perly.y" { yyval.opval = append_list(OP_LINESEQ, (LISTOP*)yyvsp[-1].opval, (LISTOP*)yyvsp[0].opval); - pad_reset_pending = TRUE; - if (yyvsp[-1].opval && yyvsp[0].opval) hints |= HINT_BLOCK_SCOPE; } + PL_pad_reset_pending = TRUE; + if (yyvsp[-1].opval && yyvsp[0].opval) PL_hints |= HINT_BLOCK_SCOPE; } break; case 10: #line 128 "perly.y" @@ -1572,14 +1575,14 @@ case 12: } else { yyval.opval = Nullop; - copline = NOLINE; + PL_copline = NOLINE; } - expect = XSTATE; } + PL_expect = XSTATE; } break; case 13: #line 140 "perly.y" { yyval.opval = newSTATEOP(0, yyvsp[-2].pval, yyvsp[-1].opval); - expect = XSTATE; } + PL_expect = XSTATE; } break; case 14: #line 145 "perly.y" @@ -1606,510 +1609,516 @@ case 19: { yyval.opval = newLOOPOP(OPf_PARENS, 1, yyvsp[0].opval, yyvsp[-2].opval);} break; case 20: -#line 159 "perly.y" -{ yyval.opval = Nullop; } +#line 157 "perly.y" +{ yyval.opval = newFOROP(0, Nullch, yyvsp[-1].ival, + Nullop, yyvsp[0].opval, yyvsp[-2].opval, Nullop); } break; case 21: -#line 161 "perly.y" -{ yyval.opval = scope(yyvsp[0].opval); } +#line 162 "perly.y" +{ yyval.opval = Nullop; } break; case 22: -#line 163 "perly.y" -{ copline = yyvsp[-5].ival; +#line 164 "perly.y" +{ yyval.opval = scope(yyvsp[0].opval); } +break; +case 23: +#line 166 "perly.y" +{ PL_copline = yyvsp[-5].ival; yyval.opval = newSTATEOP(0, Nullch, newCONDOP(0, yyvsp[-3].opval, scope(yyvsp[-1].opval), yyvsp[0].opval)); - hints |= HINT_BLOCK_SCOPE; } + PL_hints |= HINT_BLOCK_SCOPE; } break; -case 23: -#line 170 "perly.y" -{ copline = yyvsp[-6].ival; +case 24: +#line 173 "perly.y" +{ PL_copline = yyvsp[-6].ival; yyval.opval = block_end(yyvsp[-4].ival, newCONDOP(0, yyvsp[-3].opval, scope(yyvsp[-1].opval), yyvsp[0].opval)); } break; -case 24: -#line 174 "perly.y" -{ copline = yyvsp[-6].ival; +case 25: +#line 177 "perly.y" +{ PL_copline = yyvsp[-6].ival; yyval.opval = block_end(yyvsp[-4].ival, newCONDOP(0, yyvsp[-3].opval, scope(yyvsp[-1].opval), yyvsp[0].opval)); } break; -case 25: -#line 180 "perly.y" +case 26: +#line 183 "perly.y" { yyval.opval = Nullop; } break; -case 26: -#line 182 "perly.y" +case 27: +#line 185 "perly.y" { yyval.opval = scope(yyvsp[0].opval); } break; -case 27: -#line 186 "perly.y" -{ copline = yyvsp[-6].ival; +case 28: +#line 189 "perly.y" +{ PL_copline = yyvsp[-6].ival; yyval.opval = block_end(yyvsp[-4].ival, newSTATEOP(0, yyvsp[-7].pval, newWHILEOP(0, 1, (LOOP*)Nullop, yyvsp[-6].ival, yyvsp[-3].opval, yyvsp[-1].opval, yyvsp[0].opval))); } break; -case 28: -#line 192 "perly.y" -{ copline = yyvsp[-6].ival; +case 29: +#line 195 "perly.y" +{ PL_copline = yyvsp[-6].ival; yyval.opval = block_end(yyvsp[-4].ival, newSTATEOP(0, yyvsp[-7].pval, newWHILEOP(0, 1, (LOOP*)Nullop, yyvsp[-6].ival, yyvsp[-3].opval, yyvsp[-1].opval, yyvsp[0].opval))); } break; -case 29: -#line 198 "perly.y" +case 30: +#line 201 "perly.y" { yyval.opval = block_end(yyvsp[-6].ival, newFOROP(0, yyvsp[-9].pval, yyvsp[-8].ival, yyvsp[-5].opval, yyvsp[-3].opval, yyvsp[-1].opval, yyvsp[0].opval)); } break; -case 30: -#line 201 "perly.y" +case 31: +#line 204 "perly.y" { yyval.opval = block_end(yyvsp[-4].ival, newFOROP(0, yyvsp[-8].pval, yyvsp[-7].ival, mod(yyvsp[-6].opval, OP_ENTERLOOP), yyvsp[-3].opval, yyvsp[-1].opval, yyvsp[0].opval)); } break; -case 31: -#line 205 "perly.y" +case 32: +#line 208 "perly.y" { yyval.opval = block_end(yyvsp[-4].ival, newFOROP(0, yyvsp[-7].pval, yyvsp[-6].ival, Nullop, yyvsp[-3].opval, yyvsp[-1].opval, yyvsp[0].opval)); } break; -case 32: -#line 209 "perly.y" +case 33: +#line 212 "perly.y" { OP *forop = append_elem(OP_LINESEQ, scalar(yyvsp[-6].opval), newWHILEOP(0, 1, (LOOP*)Nullop, yyvsp[-9].ival, scalar(yyvsp[-4].opval), yyvsp[0].opval, scalar(yyvsp[-2].opval))); - copline = yyvsp[-9].ival; + PL_copline = yyvsp[-9].ival; yyval.opval = block_end(yyvsp[-7].ival, newSTATEOP(0, yyvsp[-10].pval, forop)); } break; -case 33: -#line 217 "perly.y" +case 34: +#line 220 "perly.y" { yyval.opval = newSTATEOP(0, yyvsp[-2].pval, newWHILEOP(0, 1, (LOOP*)Nullop, NOLINE, Nullop, yyvsp[-1].opval, yyvsp[0].opval)); } break; -case 34: -#line 223 "perly.y" +case 35: +#line 226 "perly.y" { yyval.opval = Nullop; } break; -case 36: -#line 228 "perly.y" +case 37: +#line 231 "perly.y" { (void)scan_num("1"); yyval.opval = yylval.opval; } break; -case 38: -#line 233 "perly.y" -{ yyval.opval = invert(scalar(yyvsp[0].opval)); } -break; case 39: -#line 237 "perly.y" -{ yyval.opval = yyvsp[0].opval; intro_my(); } +#line 236 "perly.y" +{ yyval.opval = invert(scalar(yyvsp[0].opval)); } break; case 40: -#line 241 "perly.y" +#line 240 "perly.y" { yyval.opval = yyvsp[0].opval; intro_my(); } break; case 41: -#line 245 "perly.y" +#line 244 "perly.y" { yyval.opval = yyvsp[0].opval; intro_my(); } break; case 42: -#line 249 "perly.y" +#line 248 "perly.y" { yyval.opval = yyvsp[0].opval; intro_my(); } break; case 43: -#line 253 "perly.y" -{ yyval.pval = Nullch; } +#line 252 "perly.y" +{ yyval.opval = yyvsp[0].opval; intro_my(); } break; -case 45: -#line 258 "perly.y" -{ yyval.ival = 0; } +case 44: +#line 256 "perly.y" +{ yyval.pval = Nullch; } break; case 46: -#line 260 "perly.y" +#line 261 "perly.y" { yyval.ival = 0; } break; case 47: -#line 262 "perly.y" +#line 263 "perly.y" { yyval.ival = 0; } break; case 48: -#line 264 "perly.y" +#line 265 "perly.y" { yyval.ival = 0; } break; case 49: -#line 268 "perly.y" -{ newFORM(yyvsp[-2].ival, yyvsp[-1].opval, yyvsp[0].opval); } +#line 267 "perly.y" +{ yyval.ival = 0; } break; case 50: #line 271 "perly.y" -{ yyval.opval = yyvsp[0].opval; } +{ newFORM(yyvsp[-2].ival, yyvsp[-1].opval, yyvsp[0].opval); } break; case 51: -#line 272 "perly.y" -{ yyval.opval = Nullop; } +#line 274 "perly.y" +{ yyval.opval = yyvsp[0].opval; } break; case 52: -#line 276 "perly.y" -{ newSUB(yyvsp[-3].ival, yyvsp[-2].opval, yyvsp[-1].opval, yyvsp[0].opval); } +#line 275 "perly.y" +{ yyval.opval = Nullop; } break; case 53: -#line 280 "perly.y" -{ yyval.ival = start_subparse(FALSE, 0); } +#line 279 "perly.y" +{ newSUB(yyvsp[-3].ival, yyvsp[-2].opval, yyvsp[-1].opval, yyvsp[0].opval); } break; case 54: -#line 284 "perly.y" -{ yyval.ival = start_subparse(FALSE, CVf_ANON); } +#line 283 "perly.y" +{ yyval.ival = start_subparse(FALSE, 0); } break; case 55: -#line 288 "perly.y" -{ yyval.ival = start_subparse(TRUE, 0); } +#line 287 "perly.y" +{ yyval.ival = start_subparse(FALSE, CVf_ANON); } break; case 56: #line 291 "perly.y" -{ char *name = SvPVx(((SVOP*)yyvsp[0].opval)->op_sv, na); - if (strEQ(name, "BEGIN") || strEQ(name, "END")) - CvUNIQUE_on(compcv); - yyval.opval = yyvsp[0].opval; } +{ yyval.ival = start_subparse(TRUE, 0); } break; case 57: -#line 298 "perly.y" -{ yyval.opval = Nullop; } +#line 294 "perly.y" +{ STRLEN n_a; char *name = SvPV(((SVOP*)yyvsp[0].opval)->op_sv, n_a); + if (strEQ(name, "BEGIN") || strEQ(name, "END") + || strEQ(name, "INIT")) + CvSPECIAL_on(PL_compcv); + yyval.opval = yyvsp[0].opval; } break; -case 59: +case 58: #line 302 "perly.y" -{ yyval.opval = yyvsp[0].opval; } +{ yyval.opval = Nullop; } break; case 60: -#line 303 "perly.y" -{ yyval.opval = Nullop; expect = XSTATE; } +#line 306 "perly.y" +{ yyval.opval = yyvsp[0].opval; } break; case 61: #line 307 "perly.y" -{ package(yyvsp[-1].opval); } +{ yyval.opval = Nullop; PL_expect = XSTATE; } break; case 62: -#line 309 "perly.y" -{ package(Nullop); } +#line 311 "perly.y" +{ package(yyvsp[-1].opval); } break; case 63: #line 313 "perly.y" -{ CvUNIQUE_on(compcv); /* It's a BEGIN {} */ } +{ package(Nullop); } break; case 64: -#line 315 "perly.y" -{ utilize(yyvsp[-6].ival, yyvsp[-5].ival, yyvsp[-3].opval, yyvsp[-2].opval, yyvsp[-1].opval); } +#line 317 "perly.y" +{ CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ } break; case 65: #line 319 "perly.y" -{ yyval.opval = newLOGOP(OP_AND, 0, yyvsp[-2].opval, yyvsp[0].opval); } +{ utilize(yyvsp[-6].ival, yyvsp[-5].ival, yyvsp[-3].opval, yyvsp[-2].opval, yyvsp[-1].opval); } break; case 66: -#line 321 "perly.y" +#line 323 "perly.y" +{ yyval.opval = newLOGOP(OP_AND, 0, yyvsp[-2].opval, yyvsp[0].opval); } +break; +case 67: +#line 325 "perly.y" { yyval.opval = newLOGOP(yyvsp[-1].ival, 0, yyvsp[-2].opval, yyvsp[0].opval); } break; -case 68: -#line 326 "perly.y" +case 69: +#line 330 "perly.y" { yyval.opval = yyvsp[-1].opval; } break; -case 69: -#line 328 "perly.y" +case 70: +#line 332 "perly.y" { yyval.opval = append_elem(OP_LIST, yyvsp[-2].opval, yyvsp[0].opval); } break; -case 71: -#line 333 "perly.y" +case 72: +#line 337 "perly.y" { yyval.opval = convert(yyvsp[-2].ival, OPf_STACKED, prepend_elem(OP_LIST, newGVREF(yyvsp[-2].ival,yyvsp[-1].opval), yyvsp[0].opval) ); } break; -case 72: -#line 336 "perly.y" +case 73: +#line 340 "perly.y" { yyval.opval = convert(yyvsp[-4].ival, OPf_STACKED, prepend_elem(OP_LIST, newGVREF(yyvsp[-4].ival,yyvsp[-2].opval), yyvsp[-1].opval) ); } break; -case 73: -#line 339 "perly.y" +case 74: +#line 343 "perly.y" { yyval.opval = convert(OP_ENTERSUB, OPf_STACKED, append_elem(OP_LIST, prepend_elem(OP_LIST, scalar(yyvsp[-5].opval), yyvsp[-1].opval), newUNOP(OP_METHOD, 0, yyvsp[-3].opval))); } break; -case 74: -#line 344 "perly.y" +case 75: +#line 348 "perly.y" { yyval.opval = convert(OP_ENTERSUB, OPf_STACKED, append_elem(OP_LIST, prepend_elem(OP_LIST, yyvsp[-1].opval, yyvsp[0].opval), newUNOP(OP_METHOD, 0, yyvsp[-2].opval))); } break; -case 75: -#line 349 "perly.y" +case 76: +#line 353 "perly.y" { yyval.opval = convert(OP_ENTERSUB, OPf_STACKED, append_elem(OP_LIST, prepend_elem(OP_LIST, yyvsp[-3].opval, yyvsp[-1].opval), newUNOP(OP_METHOD, 0, yyvsp[-4].opval))); } break; -case 76: -#line 354 "perly.y" +case 77: +#line 358 "perly.y" { yyval.opval = convert(yyvsp[-1].ival, 0, yyvsp[0].opval); } break; -case 77: -#line 356 "perly.y" +case 78: +#line 360 "perly.y" { yyval.opval = convert(yyvsp[-3].ival, 0, yyvsp[-1].opval); } break; -case 78: -#line 358 "perly.y" +case 79: +#line 362 "perly.y" { yyvsp[0].opval = newANONSUB(yyvsp[-1].ival, 0, yyvsp[0].opval); } break; -case 79: -#line 360 "perly.y" +case 80: +#line 364 "perly.y" { yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED, append_elem(OP_LIST, prepend_elem(OP_LIST, yyvsp[-2].opval, yyvsp[0].opval), yyvsp[-4].opval)); } break; -case 82: -#line 370 "perly.y" +case 83: +#line 374 "perly.y" { yyval.opval = newASSIGNOP(OPf_STACKED, yyvsp[-2].opval, yyvsp[-1].ival, yyvsp[0].opval); } break; -case 83: -#line 372 "perly.y" +case 84: +#line 376 "perly.y" { yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); } break; -case 84: -#line 374 "perly.y" +case 85: +#line 378 "perly.y" { if (yyvsp[-1].ival != OP_REPEAT) scalar(yyvsp[-2].opval); yyval.opval = newBINOP(yyvsp[-1].ival, 0, yyvsp[-2].opval, scalar(yyvsp[0].opval)); } break; -case 85: -#line 378 "perly.y" -{ yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); } -break; case 86: -#line 380 "perly.y" +#line 382 "perly.y" { yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); } break; case 87: -#line 382 "perly.y" +#line 384 "perly.y" { yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); } break; case 88: -#line 384 "perly.y" +#line 386 "perly.y" { yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); } break; case 89: -#line 386 "perly.y" +#line 388 "perly.y" { yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); } break; case 90: -#line 388 "perly.y" +#line 390 "perly.y" { yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); } break; case 91: -#line 390 "perly.y" -{ yyval.opval = newRANGE(yyvsp[-1].ival, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval));} +#line 392 "perly.y" +{ yyval.opval = newBINOP(yyvsp[-1].ival, 0, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval)); } break; case 92: -#line 392 "perly.y" -{ yyval.opval = newLOGOP(OP_AND, 0, yyvsp[-2].opval, yyvsp[0].opval); } +#line 394 "perly.y" +{ yyval.opval = newRANGE(yyvsp[-1].ival, scalar(yyvsp[-2].opval), scalar(yyvsp[0].opval));} break; case 93: -#line 394 "perly.y" -{ yyval.opval = newLOGOP(OP_OR, 0, yyvsp[-2].opval, yyvsp[0].opval); } +#line 396 "perly.y" +{ yyval.opval = newLOGOP(OP_AND, 0, yyvsp[-2].opval, yyvsp[0].opval); } break; case 94: -#line 396 "perly.y" -{ yyval.opval = newCONDOP(0, yyvsp[-4].opval, yyvsp[-2].opval, yyvsp[0].opval); } +#line 398 "perly.y" +{ yyval.opval = newLOGOP(OP_OR, 0, yyvsp[-2].opval, yyvsp[0].opval); } break; case 95: -#line 398 "perly.y" -{ yyval.opval = bind_match(yyvsp[-1].ival, yyvsp[-2].opval, yyvsp[0].opval); } +#line 400 "perly.y" +{ yyval.opval = newCONDOP(0, yyvsp[-4].opval, yyvsp[-2].opval, yyvsp[0].opval); } break; case 96: -#line 401 "perly.y" -{ yyval.opval = newUNOP(OP_NEGATE, 0, scalar(yyvsp[0].opval)); } +#line 402 "perly.y" +{ yyval.opval = bind_match(yyvsp[-1].ival, yyvsp[-2].opval, yyvsp[0].opval); } break; case 97: -#line 403 "perly.y" -{ yyval.opval = yyvsp[0].opval; } +#line 405 "perly.y" +{ yyval.opval = newUNOP(OP_NEGATE, 0, scalar(yyvsp[0].opval)); } break; case 98: -#line 405 "perly.y" -{ yyval.opval = newUNOP(OP_NOT, 0, scalar(yyvsp[0].opval)); } +#line 407 "perly.y" +{ yyval.opval = yyvsp[0].opval; } break; case 99: -#line 407 "perly.y" -{ yyval.opval = newUNOP(OP_COMPLEMENT, 0, scalar(yyvsp[0].opval));} +#line 409 "perly.y" +{ yyval.opval = newUNOP(OP_NOT, 0, scalar(yyvsp[0].opval)); } break; case 100: -#line 409 "perly.y" -{ yyval.opval = newUNOP(OP_REFGEN, 0, mod(yyvsp[0].opval,OP_REFGEN)); } +#line 411 "perly.y" +{ yyval.opval = newUNOP(OP_COMPLEMENT, 0, scalar(yyvsp[0].opval));} break; case 101: -#line 411 "perly.y" +#line 413 "perly.y" +{ yyval.opval = newUNOP(OP_REFGEN, 0, mod(yyvsp[0].opval,OP_REFGEN)); } +break; +case 102: +#line 415 "perly.y" { yyval.opval = newUNOP(OP_POSTINC, 0, mod(scalar(yyvsp[-1].opval), OP_POSTINC)); } break; -case 102: -#line 414 "perly.y" +case 103: +#line 418 "perly.y" { yyval.opval = newUNOP(OP_POSTDEC, 0, mod(scalar(yyvsp[-1].opval), OP_POSTDEC)); } break; -case 103: -#line 417 "perly.y" +case 104: +#line 421 "perly.y" { yyval.opval = newUNOP(OP_PREINC, 0, mod(scalar(yyvsp[0].opval), OP_PREINC)); } break; -case 104: -#line 420 "perly.y" +case 105: +#line 424 "perly.y" { yyval.opval = newUNOP(OP_PREDEC, 0, mod(scalar(yyvsp[0].opval), OP_PREDEC)); } break; -case 105: -#line 423 "perly.y" -{ yyval.opval = localize(yyvsp[0].opval,yyvsp[-1].ival); } -break; case 106: -#line 425 "perly.y" -{ yyval.opval = sawparens(yyvsp[-1].opval); } -break; -case 107: #line 427 "perly.y" -{ yyval.opval = sawparens(newNULLLIST()); } +{ yyval.opval = localize(yyvsp[0].opval,yyvsp[-1].ival); } break; -case 108: +case 107: #line 429 "perly.y" -{ yyval.opval = newANONLIST(yyvsp[-1].opval); } +{ yyval.opval = sawparens(yyvsp[-1].opval); } break; -case 109: +case 108: #line 431 "perly.y" -{ yyval.opval = newANONLIST(Nullop); } +{ yyval.opval = sawparens(newNULLLIST()); } break; -case 110: +case 109: #line 433 "perly.y" -{ yyval.opval = newANONHASH(yyvsp[-2].opval); } +{ yyval.opval = newANONLIST(yyvsp[-1].opval); } break; -case 111: +case 110: #line 435 "perly.y" -{ yyval.opval = newANONHASH(Nullop); } +{ yyval.opval = newANONLIST(Nullop); } break; -case 112: +case 111: #line 437 "perly.y" -{ yyval.opval = newANONSUB(yyvsp[-2].ival, yyvsp[-1].opval, yyvsp[0].opval); } +{ yyval.opval = newANONHASH(yyvsp[-2].opval); } break; -case 113: +case 112: #line 439 "perly.y" -{ yyval.opval = yyvsp[0].opval; } +{ yyval.opval = newANONHASH(Nullop); } break; -case 114: +case 113: #line 441 "perly.y" -{ yyval.opval = newBINOP(OP_GELEM, 0, newGVREF(0,yyvsp[-4].opval), yyvsp[-2].opval); } +{ yyval.opval = newANONSUB(yyvsp[-2].ival, yyvsp[-1].opval, yyvsp[0].opval); } break; -case 115: +case 114: #line 443 "perly.y" { yyval.opval = yyvsp[0].opval; } break; -case 116: +case 115: #line 445 "perly.y" -{ yyval.opval = newBINOP(OP_AELEM, 0, oopsAV(yyvsp[-3].opval), scalar(yyvsp[-1].opval)); } +{ yyval.opval = newBINOP(OP_GELEM, 0, yyvsp[-4].opval, scalar(yyvsp[-2].opval)); } break; -case 117: +case 116: #line 447 "perly.y" -{ yyval.opval = newBINOP(OP_AELEM, 0, - ref(newAVREF(yyvsp[-4].opval),OP_RV2AV), - scalar(yyvsp[-1].opval));} +{ yyval.opval = yyvsp[0].opval; } +break; +case 117: +#line 449 "perly.y" +{ yyval.opval = newBINOP(OP_AELEM, 0, oopsAV(yyvsp[-3].opval), scalar(yyvsp[-1].opval)); } break; case 118: #line 451 "perly.y" -{ assertref(yyvsp[-3].opval); yyval.opval = newBINOP(OP_AELEM, 0, - ref(newAVREF(yyvsp[-3].opval),OP_RV2AV), +{ yyval.opval = newBINOP(OP_AELEM, 0, + ref(newAVREF(yyvsp[-4].opval),OP_RV2AV), scalar(yyvsp[-1].opval));} break; case 119: #line 455 "perly.y" -{ yyval.opval = yyvsp[0].opval; } +{ assertref(yyvsp[-3].opval); yyval.opval = newBINOP(OP_AELEM, 0, + ref(newAVREF(yyvsp[-3].opval),OP_RV2AV), + scalar(yyvsp[-1].opval));} break; case 120: -#line 457 "perly.y" +#line 459 "perly.y" { yyval.opval = yyvsp[0].opval; } break; case 121: -#line 459 "perly.y" -{ yyval.opval = newUNOP(OP_AV2ARYLEN, 0, ref(yyvsp[0].opval, OP_AV2ARYLEN));} +#line 461 "perly.y" +{ yyval.opval = yyvsp[0].opval; } break; case 122: -#line 461 "perly.y" -{ yyval.opval = newBINOP(OP_HELEM, 0, oopsHV(yyvsp[-4].opval), jmaybe(yyvsp[-2].opval)); - expect = XOPERATOR; } +#line 463 "perly.y" +{ yyval.opval = newUNOP(OP_AV2ARYLEN, 0, ref(yyvsp[0].opval, OP_AV2ARYLEN));} break; case 123: -#line 464 "perly.y" +#line 465 "perly.y" +{ yyval.opval = newBINOP(OP_HELEM, 0, oopsHV(yyvsp[-4].opval), jmaybe(yyvsp[-2].opval)); + PL_expect = XOPERATOR; } +break; +case 124: +#line 468 "perly.y" { yyval.opval = newBINOP(OP_HELEM, 0, ref(newHVREF(yyvsp[-5].opval),OP_RV2HV), jmaybe(yyvsp[-2].opval)); - expect = XOPERATOR; } + PL_expect = XOPERATOR; } break; -case 124: -#line 469 "perly.y" +case 125: +#line 473 "perly.y" { assertref(yyvsp[-4].opval); yyval.opval = newBINOP(OP_HELEM, 0, ref(newHVREF(yyvsp[-4].opval),OP_RV2HV), jmaybe(yyvsp[-2].opval)); - expect = XOPERATOR; } + PL_expect = XOPERATOR; } break; -case 125: -#line 474 "perly.y" +case 126: +#line 478 "perly.y" { yyval.opval = newSLICEOP(0, yyvsp[-1].opval, yyvsp[-4].opval); } break; -case 126: -#line 476 "perly.y" +case 127: +#line 480 "perly.y" { yyval.opval = newSLICEOP(0, yyvsp[-1].opval, Nullop); } break; -case 127: -#line 478 "perly.y" +case 128: +#line 482 "perly.y" { yyval.opval = prepend_elem(OP_ASLICE, newOP(OP_PUSHMARK, 0), newLISTOP(OP_ASLICE, 0, list(yyvsp[-1].opval), ref(yyvsp[-3].opval, OP_ASLICE))); } break; -case 128: -#line 484 "perly.y" +case 129: +#line 488 "perly.y" { yyval.opval = prepend_elem(OP_HSLICE, newOP(OP_PUSHMARK, 0), newLISTOP(OP_HSLICE, 0, list(yyvsp[-2].opval), ref(oopsHV(yyvsp[-4].opval), OP_HSLICE))); - expect = XOPERATOR; } + PL_expect = XOPERATOR; } break; -case 129: -#line 491 "perly.y" +case 130: +#line 495 "perly.y" { yyval.opval = yyvsp[0].opval; } break; -case 130: -#line 493 "perly.y" +case 131: +#line 497 "perly.y" { yyval.opval = newUNOP(OP_ENTERSUB, 0, scalar(yyvsp[0].opval)); } break; -case 131: -#line 495 "perly.y" +case 132: +#line 499 "perly.y" { yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar(yyvsp[-2].opval)); } break; -case 132: -#line 497 "perly.y" +case 133: +#line 501 "perly.y" { yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED, append_elem(OP_LIST, yyvsp[-1].opval, scalar(yyvsp[-3].opval))); } break; -case 133: -#line 500 "perly.y" +case 134: +#line 504 "perly.y" { yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED, append_elem(OP_LIST, yyvsp[0].opval, scalar(yyvsp[-1].opval))); } break; -case 134: -#line 503 "perly.y" +case 135: +#line 507 "perly.y" { yyval.opval = newUNOP(OP_DOFILE, 0, scalar(yyvsp[0].opval)); } break; -case 135: -#line 505 "perly.y" +case 136: +#line 509 "perly.y" { yyval.opval = newUNOP(OP_NULL, OPf_SPECIAL, scope(yyvsp[0].opval)); } break; -case 136: -#line 507 "perly.y" +case 137: +#line 511 "perly.y" { yyval.opval = newUNOP(OP_ENTERSUB, OPf_SPECIAL|OPf_STACKED, prepend_elem(OP_LIST, @@ -2118,8 +2127,8 @@ case 136: scalar(yyvsp[-2].opval) )),Nullop)); dep();} break; -case 137: -#line 515 "perly.y" +case 138: +#line 519 "perly.y" { yyval.opval = newUNOP(OP_ENTERSUB, OPf_SPECIAL|OPf_STACKED, append_elem(OP_LIST, @@ -2129,162 +2138,162 @@ case 137: scalar(yyvsp[-3].opval) )))); dep();} break; -case 138: -#line 524 "perly.y" +case 139: +#line 528 "perly.y" { yyval.opval = newUNOP(OP_ENTERSUB, OPf_SPECIAL|OPf_STACKED, prepend_elem(OP_LIST, scalar(newCVREF(0,scalar(yyvsp[-2].opval))), Nullop)); dep();} break; -case 139: -#line 528 "perly.y" +case 140: +#line 532 "perly.y" { yyval.opval = newUNOP(OP_ENTERSUB, OPf_SPECIAL|OPf_STACKED, prepend_elem(OP_LIST, yyvsp[-1].opval, scalar(newCVREF(0,scalar(yyvsp[-3].opval))))); dep();} break; -case 140: -#line 533 "perly.y" +case 141: +#line 537 "perly.y" { yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED, newCVREF(0, scalar(yyvsp[-3].opval))); } break; -case 141: -#line 536 "perly.y" +case 142: +#line 540 "perly.y" { yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED, append_elem(OP_LIST, yyvsp[-1].opval, newCVREF(0, scalar(yyvsp[-4].opval)))); } break; -case 142: -#line 540 "perly.y" -{ yyval.opval = newOP(yyvsp[0].ival, OPf_SPECIAL); - hints |= HINT_BLOCK_SCOPE; } -break; case 143: -#line 543 "perly.y" -{ yyval.opval = newLOOPEX(yyvsp[-1].ival,yyvsp[0].opval); } +#line 544 "perly.y" +{ yyval.opval = newOP(yyvsp[0].ival, OPf_SPECIAL); + PL_hints |= HINT_BLOCK_SCOPE; } break; case 144: -#line 545 "perly.y" -{ yyval.opval = newUNOP(OP_NOT, 0, scalar(yyvsp[0].opval)); } +#line 547 "perly.y" +{ yyval.opval = newLOOPEX(yyvsp[-1].ival,yyvsp[0].opval); } break; case 145: -#line 547 "perly.y" -{ yyval.opval = newOP(yyvsp[0].ival, 0); } +#line 549 "perly.y" +{ yyval.opval = newUNOP(OP_NOT, 0, scalar(yyvsp[0].opval)); } break; case 146: -#line 549 "perly.y" -{ yyval.opval = newUNOP(yyvsp[-1].ival, 0, yyvsp[0].opval); } +#line 551 "perly.y" +{ yyval.opval = newOP(yyvsp[0].ival, 0); } break; case 147: -#line 551 "perly.y" +#line 553 "perly.y" { yyval.opval = newUNOP(yyvsp[-1].ival, 0, yyvsp[0].opval); } break; case 148: -#line 553 "perly.y" +#line 555 "perly.y" +{ yyval.opval = newUNOP(yyvsp[-1].ival, 0, yyvsp[0].opval); } +break; +case 149: +#line 557 "perly.y" { yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED, append_elem(OP_LIST, yyvsp[0].opval, scalar(yyvsp[-1].opval))); } break; -case 149: -#line 556 "perly.y" +case 150: +#line 560 "perly.y" { yyval.opval = newOP(yyvsp[0].ival, 0); } break; -case 150: -#line 558 "perly.y" +case 151: +#line 562 "perly.y" { yyval.opval = newOP(yyvsp[-2].ival, 0); } break; -case 151: -#line 560 "perly.y" +case 152: +#line 564 "perly.y" { yyval.opval = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar(yyvsp[0].opval)); } break; -case 152: -#line 563 "perly.y" +case 153: +#line 567 "perly.y" { yyval.opval = newOP(yyvsp[-2].ival, OPf_SPECIAL); } break; -case 153: -#line 565 "perly.y" +case 154: +#line 569 "perly.y" { yyval.opval = newUNOP(yyvsp[-3].ival, 0, yyvsp[-1].opval); } break; -case 154: -#line 567 "perly.y" +case 155: +#line 571 "perly.y" { yyval.opval = pmruntime(yyvsp[-3].opval, yyvsp[-1].opval, Nullop); } break; -case 155: -#line 569 "perly.y" +case 156: +#line 573 "perly.y" { yyval.opval = pmruntime(yyvsp[-5].opval, yyvsp[-3].opval, yyvsp[-1].opval); } break; -case 158: -#line 575 "perly.y" -{ yyval.opval = Nullop; } -break; case 159: -#line 577 "perly.y" -{ yyval.opval = yyvsp[0].opval; } +#line 579 "perly.y" +{ yyval.opval = Nullop; } break; case 160: #line 581 "perly.y" -{ yyval.opval = Nullop; } +{ yyval.opval = yyvsp[0].opval; } break; case 161: -#line 583 "perly.y" -{ yyval.opval = yyvsp[0].opval; } +#line 585 "perly.y" +{ yyval.opval = Nullop; } break; case 162: -#line 585 "perly.y" -{ yyval.opval = yyvsp[-1].opval; } +#line 587 "perly.y" +{ yyval.opval = yyvsp[0].opval; } break; case 163: -#line 588 "perly.y" -{ yyval.ival = 0; } +#line 589 "perly.y" +{ yyval.opval = yyvsp[-1].opval; } break; case 164: -#line 589 "perly.y" -{ yyval.ival = 1; } +#line 592 "perly.y" +{ yyval.ival = 0; } break; case 165: #line 593 "perly.y" -{ in_my = 0; yyval.opval = my(yyvsp[0].opval); } +{ yyval.ival = 1; } break; case 166: #line 597 "perly.y" -{ yyval.opval = newCVREF(yyvsp[-1].ival,yyvsp[0].opval); } +{ PL_in_my = 0; yyval.opval = my(yyvsp[0].opval); } break; case 167: #line 601 "perly.y" -{ yyval.opval = newSVREF(yyvsp[0].opval); } +{ yyval.opval = newCVREF(yyvsp[-1].ival,yyvsp[0].opval); } break; case 168: #line 605 "perly.y" -{ yyval.opval = newAVREF(yyvsp[0].opval); } +{ yyval.opval = newSVREF(yyvsp[0].opval); } break; case 169: #line 609 "perly.y" -{ yyval.opval = newHVREF(yyvsp[0].opval); } +{ yyval.opval = newAVREF(yyvsp[0].opval); } break; case 170: #line 613 "perly.y" -{ yyval.opval = newAVREF(yyvsp[0].opval); } +{ yyval.opval = newHVREF(yyvsp[0].opval); } break; case 171: #line 617 "perly.y" -{ yyval.opval = newGVREF(0,yyvsp[0].opval); } +{ yyval.opval = newAVREF(yyvsp[0].opval); } break; case 172: #line 621 "perly.y" -{ yyval.opval = scalar(yyvsp[0].opval); } +{ yyval.opval = newGVREF(0,yyvsp[0].opval); } break; case 173: -#line 623 "perly.y" -{ yyval.opval = scalar(yyvsp[0].opval); } +#line 625 "perly.y" +{ yyval.opval = scalar(yyvsp[0].opval); } break; case 174: -#line 625 "perly.y" -{ yyval.opval = scope(yyvsp[0].opval); } +#line 627 "perly.y" +{ yyval.opval = scalar(yyvsp[0].opval); } break; case 175: -#line 628 "perly.y" +#line 629 "perly.y" +{ yyval.opval = scope(yyvsp[0].opval); } +break; +case 176: +#line 632 "perly.y" { yyval.opval = yyvsp[0].opval; } break; -#line 2271 "perly.c" +#line 2266 "perly.c" } yyssp -= yym; yystate = *yyssp; diff --git a/gnu/usr.bin/perl/vms/sockadapt.h b/gnu/usr.bin/perl/vms/sockadapt.h index 7f9150a5795..3e5daf37659 100644 --- a/gnu/usr.bin/perl/vms/sockadapt.h +++ b/gnu/usr.bin/perl/vms/sockadapt.h @@ -145,7 +145,6 @@ void endnetent(); #include <socket.h> #include <in.h> #include <inet.h> -#include <netdb.h> /* SocketShr doesn't support these routines, but the DECC RTL contains * stubs with these names, designed to be used with the UCX socket @@ -156,6 +155,8 @@ void endnetent(); #define getnetent no_getnetent #define setnetent no_setnetent #define endnetent no_endnetent + +#include <netdb.h> #endif /* We don't have these two in the system headers. */ diff --git a/gnu/usr.bin/perl/vms/test.com b/gnu/usr.bin/perl/vms/test.com index 114cb24a405..0e507dd2740 100644 --- a/gnu/usr.bin/perl/vms/test.com +++ b/gnu/usr.bin/perl/vms/test.com @@ -21,8 +21,17 @@ $ EndIf $ EndIf $ Set Message /Facility/Severity/Identification/Text $ -$ exe = ".Exe" -$ If p1.nes."" Then exe = p1 +$ exe = ".Exe" +$ If p1.nes."" Then exe = p1 +$ If F$Extract(0,1,exe) .nes. "." +$ Then +$ Write Sys$Error "" +$ Write Sys$Error "The first parameter passed to Test.Com must be the file type used for the" +$ Write Sys$Error "images produced when you built Perl (i.e. "".Exe"", unless you edited" +$ Write Sys$Error "Descrip.MMS or used the AXE=1 macro in the MM[SK] command line." +$ Write Sys$Error "" +$ Exit 44 +$ EndIf $! Pick up a copy of perl to use for the tests $ Delete/Log/NoConfirm Perl.;* $ Copy/Log/NoConfirm [-]Perl'exe' []Perl. @@ -74,6 +83,7 @@ $ Delete/Log/NoConfirm Echo.Obj;* $ echo = "$" + F$Parse("Echo.Exe") $ $! And do it +$ Show Process/Accounting $ testdir = "Directory/NoHead/NoTrail/Column=1" $ Define/User Perlshr Sys$Disk:[-]PerlShr'exe' $ MCR Sys$Disk:[]Perl. "-I[-.lib]" - "''p2'" "''p3'" "''p4'" "''p5'" "''p6'" @@ -90,11 +100,10 @@ $ Deck/Dollar=$$END-OF-TEST$$ use Config; @compexcl=('cpp.t'); -@ioexcl=('argv.t','dup.t','fs.t','inplace.t','pipe.t'); -@libexcl=('anydbm.t','db-btree.t','db-hash.t','db-recno.t', +@ioexcl=('argv.t','dup.t','fs.t','pipe.t'); +@libexcl=('db-btree.t','db-hash.t','db-recno.t', 'gdbm.t','io_dup.t', 'io_pipe.t', 'io_sel.t', 'io_sock.t', - 'ndbm.t','odbm.t','open2.t','open3.t','posix.t', - 'sdbm.t'); + 'ndbm.t','odbm.t','open2.t','open3.t', 'ph.t', 'posix.t'); # Note: POSIX is not part of basic build, but can be built # separately if you're using DECC @@ -103,7 +112,7 @@ use Config; # insists on stat()ing a file descriptor before it'll use it. push(@libexcl,'io_xs.t') if $Config{'vms_cc_type'} ne 'decc'; -@opexcl=('exec.t','fork.t','glob.t','groups.t','magic.t','misc.t','stat.t'); +@opexcl=('die_exit.t','exec.t','fork.t','glob.t','groups.t','magic.t','misc.t','stat.t'); @exclist=(@compexcl,@ioexcl,@libexcl,@opexcl); foreach $file (@exclist) { $skip{$file}++; } @@ -111,7 +120,7 @@ $| = 1; @ARGV = grep($_,@ARGV); # remove empty elements due to "''p1'" syntax -if ($ARGV[0] eq '-v') { +if (lc($ARGV[0]) eq '-v') { $verbose = 1; shift; } @@ -153,7 +162,7 @@ while ($test = shift) { } else { $switch = ''; } - open(results,"\$ MCR Sys\$Disk:[]Perl. $switch $test |") || (print "can't run.\n"); + open(results,"\$ MCR Sys\$Disk:[]Perl. \"-I[-.lib]\" $switch $test |") || (print "can't run.\n"); $ok = 0; $next = 0; while (<results>) { @@ -218,6 +227,7 @@ print sprintf("u=%g s=%g cu=%g cs=%g files=%d tests=%d\n", $user,$sys,$cuser,$csys,$files,$totmax); $$END-OF-TEST$$ $ wrapup: +$ Show Process/Accounting $ If F$Search("Echo.Exe").nes."" Then Delete/Log/NoConfirm Echo.Exe;* $ Set Default &olddef $ Set Message 'oldmsg' diff --git a/gnu/usr.bin/perl/vms/vms.c b/gnu/usr.bin/perl/vms/vms.c index f22579066d0..37f9587dc75 100644 --- a/gnu/usr.bin/perl/vms/vms.c +++ b/gnu/usr.bin/perl/vms/vms.c @@ -2,8 +2,8 @@ * * VMS-specific routines for perl5 * - * Last revised: 11-Apr-1997 by Charles Bailey bailey@genetics.upenn.edu - * Version: 5.3.97c + * Last revised: 27-Feb-1998 by Charles Bailey bailey@newman.upenn.edu + * Version: 5.4.61 */ #include <acedef.h> @@ -11,6 +11,7 @@ #include <armdef.h> #include <atrdef.h> #include <chpdef.h> +#include <clidef.h> #include <climsgdef.h> #include <descrip.h> #include <dvidef.h> @@ -19,6 +20,7 @@ #include <fscndef.h> #include <iodef.h> #include <jpidef.h> +#include <kgbdef.h> #include <libdef.h> #include <lib$routines.h> #include <lnmdef.h> @@ -113,37 +115,48 @@ my_trnlnm(char *lnm, char *eqv, unsigned long int idx) * domain (mostly - my_getenv() need not return a translation from * the process logical name table) * - * Note: Uses static buffer -- not thread-safe! + * Note: Uses Perl temp to store result so char * can be returned to + * caller; this pointer will be invalidated at next Perl statement + * transition. */ /*{{{ char *my_getenv(char *lnm)*/ char * my_getenv(char *lnm) { static char __my_getenv_eqv[LNM$C_NAMLENGTH+1]; - char uplnm[LNM$C_NAMLENGTH+1], *cp1, *cp2; + char uplnm[LNM$C_NAMLENGTH+1], *cp1, *cp2, *eqv; unsigned long int idx = 0; int trnsuccess; - + SV *tmpsv; + + if (PL_curinterp) { /* Perl interpreter running -- may be threaded */ + /* Set up a temporary buffer for the return value; Perl will + * clean it up at the next statement transition */ + tmpsv = sv_2mortal(newSVpv("",LNM$C_NAMLENGTH+1)); + if (!tmpsv) return NULL; + eqv = SvPVX(tmpsv); + } + else eqv = __my_getenv_eqv; /* Assume no interpreter ==> single thread */ for (cp1 = lnm, cp2= uplnm; *cp1; cp1++, cp2++) *cp2 = _toupper(*cp1); *cp2 = '\0'; if (cp1 - lnm == 7 && !strncmp(uplnm,"DEFAULT",7)) { - getcwd(__my_getenv_eqv,sizeof __my_getenv_eqv); - return __my_getenv_eqv; + getcwd(eqv,LNM$C_NAMLENGTH); + return eqv; } else { if ((cp2 = strchr(uplnm,';')) != NULL) { *cp2 = '\0'; idx = strtoul(cp2+1,NULL,0); } - trnsuccess = my_trnlnm(uplnm,__my_getenv_eqv,idx); + trnsuccess = my_trnlnm(uplnm,eqv,idx); /* If we had a translation index, we're only interested in lnms */ if (!trnsuccess && cp2 != NULL) return Nullch; - if (trnsuccess) return __my_getenv_eqv; + if (trnsuccess) return eqv; else { unsigned long int retsts; struct dsc$descriptor_s symdsc = {0,DSC$K_DTYPE_T,DSC$K_CLASS_S,0}, - valdsc = {sizeof __my_getenv_eqv,DSC$K_DTYPE_T, - DSC$K_CLASS_S, __my_getenv_eqv}; + valdsc = {LNM$C_NAMLENGTH,DSC$K_DTYPE_T, + DSC$K_CLASS_S, eqv}; symdsc.dsc$w_length = cp1 - lnm; symdsc.dsc$a_pointer = uplnm; retsts = lib$get_symbol(&symdsc,&valdsc,&(valdsc.dsc$w_length),0); @@ -162,7 +175,9 @@ my_getenv(char *lnm) } /* end of my_getenv() */ /*}}}*/ -static FILE *safe_popen(char *, char *); +static void create_mbx(unsigned short int *, struct dsc$descriptor_s *); + +static void riseandshine(unsigned long int dummy) { sys$wake(0,0); } /*{{{ void prime_env_iter() */ void @@ -171,37 +186,81 @@ prime_env_iter(void) * find, in preparation for iterating over it. */ { - static int primed = 0; /* XXX Not thread-safe!!! */ - HV *envhv = GvHVn(envgv); - FILE *sholog; - char eqv[LNM$C_NAMLENGTH+1],*start,*end; + dTHR; + static int primed = 0; + HV *envhv = GvHVn(PL_envgv); + PerlIO *sholog; + char eqv[LNM$C_NAMLENGTH+1],mbxnam[LNM$C_NAMLENGTH+1],*start,*end; + unsigned short int chan; +#ifndef CLI$M_TRUSTED +# define CLI$M_TRUSTED 0x40 /* Missing from VAXC headers */ +#endif + unsigned long int flags = CLI$M_NOWAIT | CLI$M_NOCLISYM | CLI$M_NOKEYPAD | CLI$M_TRUSTED; + unsigned long int i, retsts, substs = 0, wakect = 0; STRLEN eqvlen; SV *oldrs, *linesv, *eqvsv; + $DESCRIPTOR(cmddsc,"Show Logical *"); $DESCRIPTOR(nldsc,"_NLA0:"); + $DESCRIPTOR(clidsc,"DCL"); $DESCRIPTOR(tabdsc,"DCLTABLES"); + $DESCRIPTOR(mbxdsc,mbxnam); +#ifdef USE_THREADS + static perl_mutex primenv_mutex; + MUTEX_INIT(&primenv_mutex); +#endif if (primed) return; + MUTEX_LOCK(&primenv_mutex); + if (primed) { MUTEX_UNLOCK(&primenv_mutex); return; } /* Perform a dummy fetch as an lval to insure that the hash table is - * set up. Otherwise, the hv_store() will turn into a nullop */ + * set up. Otherwise, the hv_store() will turn into a nullop. */ (void) hv_fetch(envhv,"DEFAULT",7,TRUE); - /* Also, set up the four "special" keys that the CRTL defines, - * whether or not underlying logical names exist. */ - (void) hv_fetch(envhv,"HOME",4,TRUE); - (void) hv_fetch(envhv,"TERM",4,TRUE); - (void) hv_fetch(envhv,"PATH",4,TRUE); - (void) hv_fetch(envhv,"USER",4,TRUE); + /* Also, set up any "special" keys that the CRTL defines, + * either by itself or becasue we were called from a C program + * using exec[lv]e() */ + for (i = 0; environ[i]; i++) { + if (!(start = strchr(environ[i],'='))) { + warn("Ill-formed CRTL environ value \"%s\"\n",environ[i]); + } + else { + start++; + (void) hv_store(envhv,environ[i],start - environ[i] - 1,newSVpv(start,0),0); + } + } /* Now, go get the logical names */ - if ((sholog = safe_popen("$ Show Logical *","r")) == Nullfp) - _ckvmssts(vaxc$errno); - /* We use Perl's sv_gets to read from the pipe, since safe_popen is + create_mbx(&chan,&mbxdsc); + if ((sholog = PerlIO_open(mbxnam,"r")) != Nullfp) { + if ((retsts = sys$dassgn(chan)) & 1) { + /* Be certain that subprocess is using the CLI and command tables we + * expect, and don't pass symbols through so that we insure that + * "Show Logical" can't be subverted. + */ + do { + retsts = lib$spawn(&cmddsc,&nldsc,&mbxdsc,&flags,0,0,&substs, + 0,&riseandshine,0,0,&clidsc,&tabdsc); + flags &= ~CLI$M_TRUSTED; /* Just in case we hit a really old version */ + } while (retsts == LIB$_INVARG && (flags | CLI$M_TRUSTED)); + } + } + if (sholog == Nullfp || !(retsts & 1)) { + if (sholog != Nullfp) PerlIO_close(sholog); + MUTEX_UNLOCK(&primenv_mutex); + _ckvmssts(sholog == Nullfp ? vaxc$errno : retsts); + } + /* We use Perl's sv_gets to read from the pipe, since PerlIO_open is * tied to Perl's I/O layer, so it may not return a simple FILE * */ - oldrs = rs; - rs = newSVpv("\n",1); + oldrs = PL_rs; + PL_rs = newSVpv("\n",1); linesv = newSVpv("",0); while (1) { if ((start = sv_gets(linesv,sholog,0)) == Nullch) { - my_pclose(sholog); - SvREFCNT_dec(linesv); SvREFCNT_dec(rs); rs = oldrs; + PerlIO_close(sholog); + SvREFCNT_dec(linesv); SvREFCNT_dec(PL_rs); PL_rs = oldrs; primed = 1; + /* Wait for subprocess to clean up (we know subproc won't return 0) */ + while (substs == 0) { sys$hiber(); wakect++;} + if (wakect > 1) sys$wake(0,0); /* Stole someone else's wake */ + _ckvmssts(substs); + MUTEX_UNLOCK(&primenv_mutex); return; } while (*start != '"' && *start != '=' && *start) start++; @@ -211,11 +270,11 @@ prime_env_iter(void) else end = Nullch; if ((eqvlen = my_trnlnm(start,eqv,0)) == 0) { if (vaxc$errno == SS$_NOLOGNAM || vaxc$errno == SS$_IVLOGNAM) { - if (dowarn) + if (PL_dowarn) warn("Ill-formed logical name |%s| in prime_env_iter",start); continue; } - else _ckvmssts(vaxc$errno); + else { MUTEX_UNLOCK(&primenv_mutex); _ckvmssts(vaxc$errno); } } else { eqvsv = newSVpv(eqv,eqvlen); @@ -335,7 +394,7 @@ do_rmdir(char *name) { char dirfile[NAM$C_MAXRSS+1]; int retval; - struct mystat st; + Stat_t st; if (do_fileify_dirspec(name,dirfile,0) == NULL) return -1; if (flex_stat(dirfile,&st) || !S_ISDIR(st.st_mode)) retval = -1; @@ -557,7 +616,7 @@ popen_completion_ast(struct pipe_details *thispipe) } } -static FILE * +static PerlIO * safe_popen(char *cmd, char *mode) { static int handler_set_up = FALSE; @@ -614,7 +673,7 @@ safe_popen(char *cmd, char *mode) info->next=open_pipes; /* prepend to list */ open_pipes=info; - forkprocess = info->pid; + PL_forkprocess = info->pid; return info->fp; } /* end of safe_popen */ @@ -653,7 +712,7 @@ I32 my_pclose(FILE *fp) unsigned long int chan, iosb[2], retsts, retsts2; struct dsc$descriptor devdsc = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, devnam}; - if (fgetname(info->fp,devnam)) { + if (fgetname(info->fp,devnam,1)) { /* It oughta be a mailbox, so fgetname should give just the device * name, but just in case . . . */ if ((cp = strrchr(devnam,':')) != NULL) *(cp+1) = '\0'; @@ -705,11 +764,11 @@ my_waitpid(Pid_t pid, int *statusp, int flags) unsigned long int ownercode = JPI$_OWNER, ownerpid, mypid; unsigned long int interval[2],sts; - if (dowarn) { + if (PL_dowarn) { _ckvmssts(lib$getjpi(&ownercode,&pid,0,&ownerpid,0,0)); _ckvmssts(lib$getjpi(&ownercode,0,0,&mypid,0,0)); if (ownerpid != mypid) - warn("pid %d not a child",pid); + warn("pid %x not a child",pid); } _ckvmssts(sys$bintim(&intdsc,interval)); @@ -820,12 +879,14 @@ do_rmsexpand(char *filespec, char *outbuf, int ts, char *defspec, unsigned opts) retsts = sys$parse(&myfab,0,0); if (!(retsts & 1)) { + mynam.nam$b_nop |= NAM$M_SYNCHK; if (retsts == RMS$_DNF || retsts == RMS$_DIR || retsts == RMS$_DEV || retsts == RMS$_DEV) { - mynam.nam$b_nop |= NAM$M_SYNCHK; retsts = sys$parse(&myfab,0,0); if (retsts & 1) goto expanded; } + mynam.nam$l_rlf = NULL; myfab.fab$b_dns = 0; + (void) sys$parse(&myfab,0,0); /* Free search context */ if (out) Safefree(out); set_vaxc_errno(retsts); if (retsts == RMS$_PRV) set_errno(EACCES); @@ -836,6 +897,8 @@ do_rmsexpand(char *filespec, char *outbuf, int ts, char *defspec, unsigned opts) } retsts = sys$search(&myfab,0,0); if (!(retsts & 1) && retsts != RMS$_FNF) { + mynam.nam$b_nop |= NAM$M_SYNCHK; mynam.nam$l_rlf = NULL; + myfab.fab$b_dns = 0; (void) sys$parse(&myfab,0,0); /* Free search context */ if (out) Safefree(out); set_vaxc_errno(retsts); if (retsts == RMS$_PRV) set_errno(EACCES); @@ -853,6 +916,10 @@ do_rmsexpand(char *filespec, char *outbuf, int ts, char *defspec, unsigned opts) if (!(mynam.nam$l_fnb & NAM$M_EXP_VER) && (!defspec || !*defspec || !strchr(myfab.fab$l_dna,';'))) speclen = mynam.nam$l_ver - out; + if (!(mynam.nam$l_fnb & NAM$M_EXP_TYPE) && + (!defspec || !*defspec || defspec[myfab.fab$b_dns-1] != '.' || + defspec[myfab.fab$b_dns-2] == '.')) + speclen = mynam.nam$l_type - out; /* If we just had a directory spec on input, $PARSE "helpfully" * adds an empty name and type for us */ if (mynam.nam$l_name == mynam.nam$l_type && @@ -874,6 +941,9 @@ do_rmsexpand(char *filespec, char *outbuf, int ts, char *defspec, unsigned opts) if (do_tounixspec(outbuf,tmpfspec,0) == NULL) return NULL; strcpy(outbuf,tmpfspec); } + mynam.nam$b_nop |= NAM$M_SYNCHK; mynam.nam$l_rlf = NULL; + mynam.nam$l_rsa = NULL; mynam.nam$b_rss = 0; + myfab.fab$b_dns = 0; (void) sys$parse(&myfab,0,0); /* Free search context */ return outbuf; } /*}}}*/ @@ -911,7 +981,7 @@ char *rmsexpand_ts(char *spec, char *buf, char *def, unsigned opt) ** tounixspec() - convert any file spec into a Unix-style file spec. ** tovmsspec() - convert any file spec into a VMS-style spec. ** -** Copyright 1996 by Charles Bailey <bailey@genetics.upenn.edu> +** Copyright 1996 by Charles Bailey <bailey@newman.upenn.edu> ** Permission is given to distribute this code as part of the Perl ** standard distribution under the terms of the GNU General Public ** License or the Perl Artistic License. Copies of each may be @@ -924,17 +994,20 @@ static char *do_fileify_dirspec(char *dir,char *buf,int ts) static char __fileify_retbuf[NAM$C_MAXRSS+1]; unsigned long int dirlen, retlen, addmfd = 0, hasfilename = 0; char *retspec, *cp1, *cp2, *lastdir; - char trndir[NAM$C_MAXRSS+1], vmsdir[NAM$C_MAXRSS+1]; + char trndir[NAM$C_MAXRSS+2], vmsdir[NAM$C_MAXRSS+1]; if (!dir || !*dir) { set_errno(EINVAL); set_vaxc_errno(SS$_BADPARAM); return NULL; } dirlen = strlen(dir); - if (dir[dirlen-1] == '/') --dirlen; - if (!dirlen) { - set_errno(ENOTDIR); - set_vaxc_errno(RMS$_DIR); - return NULL; + while (dir[dirlen-1] == '/') --dirlen; + if (!dirlen) { /* We had Unixish '/' -- substitute top of current tree */ + strcpy(trndir,"/sys$disk/000000"); + dir = trndir; + dirlen = 16; + } + if (dirlen > NAM$C_MAXRSS) { + set_errno(ENAMETOOLONG); set_vaxc_errno(RMS$_SYN); return NULL; } if (!strpbrk(dir+1,"/]>:")) { strcpy(trndir,*dir == '/' ? dir + 1: dir); @@ -995,11 +1068,28 @@ static char *do_fileify_dirspec(char *dir,char *buf,int ts) if (*(cp1+2) == '.') cp1++; if (*(cp1+2) == '/' || *(cp1+2) == '\0') { if (do_tovmsspec(dir,vmsdir,0) == NULL) return NULL; + if (strchr(vmsdir,'/') != NULL) { + /* If do_tovmsspec() returned it, it must have VMS syntax + * delimiters in it, so it's a mixed VMS/Unix spec. We take + * the time to check this here only so we avoid a recursion + * loop; otherwise, gigo. + */ + set_errno(EINVAL); set_vaxc_errno(RMS$_SYN); return NULL; + } if (do_fileify_dirspec(vmsdir,trndir,0) == NULL) return NULL; return do_tounixspec(trndir,buf,ts); } cp1++; } while ((cp1 = strstr(cp1,"/.")) != NULL); + lastdir = strrchr(dir,'/'); + } + else if (!strcmp(&dir[dirlen-7],"/000000")) { + /* Ditto for specs that end in an MFD -- let the VMS code + * figure out whether it's a real device or a rooted logical. */ + dir[dirlen] = '/'; dir[dirlen+1] = '\0'; + if (do_tovmsspec(dir,vmsdir,0) == NULL) return NULL; + if (do_fileify_dirspec(vmsdir,trndir,0) == NULL) return NULL; + return do_tounixspec(trndir,buf,ts); } else { if ( !(lastdir = cp1 = strrchr(dir,'/')) && @@ -1544,6 +1634,11 @@ static char *do_tovmsspec(char *path, char *buf, int ts) { STRLEN trnend; while (*(cp2+1) == '/') cp2++; /* Skip multiple /s */ + if (!*(cp2+1)) { + if (!buf & ts) Renew(rslt,18,char); + strcpy(rslt,"sys$disk:[000000]"); + return rslt; + } while (*(++cp2) != '/' && *cp2) *(cp1++) = *cp2; *cp1 = '\0'; islnm = my_trnlnm(rslt,trndev,0); @@ -1720,7 +1815,7 @@ char *tounixpath_ts(char *path, char *buf) { return do_tounixpath(path,buf,1); } * gain. * * * * 27-Aug-1994 Modified for inclusion in perl5 * - * by Charles Bailey bailey@genetics.upenn.edu * + * by Charles Bailey bailey@newman.upenn.edu * ***************************************************************************** */ @@ -2223,27 +2318,83 @@ unsigned long int flags = 17, one = 1, retsts; /* OS-specific initialization at image activation (not thread startup) */ +/* Older VAXC header files lack these constants */ +#ifndef JPI$_RIGHTS_SIZE +# define JPI$_RIGHTS_SIZE 817 +#endif +#ifndef KGB$M_SUBSYSTEM +# define KGB$M_SUBSYSTEM 0x8 +#endif + /*{{{void vms_image_init(int *, char ***)*/ void vms_image_init(int *argcp, char ***argvp) { - unsigned long int *mask, iosb[2], i; - unsigned short int dummy; - union prvdef iprv; - struct itmlst_3 jpilist[2] = { {sizeof iprv, JPI$_IMAGPRIV, &iprv, &dummy}, - { 0, 0, 0, 0} }; + unsigned long int *mask, iosb[2], i, rlst[128], rsz, add_taint = FALSE; + unsigned long int iprv[(sizeof(union prvdef) + sizeof(unsigned long int) - 1) / sizeof(unsigned long int)]; + unsigned short int dummy, rlen; + struct itmlst_3 jpilist[4] = { {sizeof iprv, JPI$_IMAGPRIV, iprv, &dummy}, + {sizeof rlst, JPI$_RIGHTSLIST, rlst, &rlen}, + { sizeof rsz, JPI$_RIGHTS_SIZE, &rsz, &dummy}, + { 0, 0, 0, 0} }; _ckvmssts(sys$getjpiw(0,NULL,NULL,jpilist,iosb,NULL,NULL)); _ckvmssts(iosb[0]); - mask = (unsigned long int *) &iprv; /* Quick change of view */; - for (i = 0; i < (sizeof iprv + sizeof(unsigned long int) - 1) / sizeof(unsigned long int); i++) { - if (mask[i]) { /* Running image installed with privs? */ - _ckvmssts(sys$setprv(0,&iprv,0,NULL)); /* Turn 'em off. */ - tainting = TRUE; + for (i = 0; i < sizeof iprv / sizeof(unsigned long int); i++) { + if (iprv[i]) { /* Running image installed with privs? */ + _ckvmssts(sys$setprv(0,iprv,0,NULL)); /* Turn 'em off. */ + add_taint = TRUE; break; } } + /* Rights identifiers might trigger tainting as well. */ + if (!add_taint && (rlen || rsz)) { + while (rlen < rsz) { + /* We didn't get all the identifiers on the first pass. Allocate a + * buffer much larger than $GETJPI wants (rsz is size in bytes that + * were needed to hold all identifiers at time of last call; we'll + * allocate that many unsigned long ints), and go back and get 'em. + */ + if (jpilist[1].bufadr != rlst) Safefree(jpilist[1].bufadr); + jpilist[1].bufadr = New(1320,mask,rsz,unsigned long int); + jpilist[1].buflen = rsz * sizeof(unsigned long int); + _ckvmssts(sys$getjpiw(0,NULL,NULL,&jpilist[1],iosb,NULL,NULL)); + _ckvmssts(iosb[0]); + } + mask = jpilist[1].bufadr; + /* Check attribute flags for each identifier (2nd longword); protected + * subsystem identifiers trigger tainting. + */ + for (i = 1; i < (rlen + sizeof(unsigned long int) - 1) / sizeof(unsigned long int); i += 2) { + if (mask[i] & KGB$M_SUBSYSTEM) { + add_taint = TRUE; + break; + } + } + if (mask != rlst) Safefree(mask); + } + /* We need to use this hack to tell Perl it should run with tainting, + * since its tainting flag may be part of the PL_curinterp struct, which + * hasn't been allocated when vms_image_init() is called. + */ + if (add_taint) { + char ***newap; + New(1320,newap,*argcp+2,char **); + newap[0] = argvp[0]; + *newap[1] = "-T"; + Copy(argvp[1],newap[2],*argcp-1,char **); + /* We orphan the old argv, since we don't know where it's come from, + * so we don't know how to free it. + */ + *argcp++; argvp = newap; + } getredirection(argcp,argvp); +#if defined(USE_THREADS) && defined(__DECC) + { +# include <reentrancy.h> + (void) decc$set_reentrancy(C$C_MULTITHREAD); + } +#endif return; } /*}}}*/ @@ -2340,7 +2491,7 @@ trim_unixpath(char *fspec, char *wildspec, int opts) for (front = end ; front >= base; front--) if (*front == '/' && !dirs--) { front++; break; } } - for (cp1=template,cp2=lcres; *cp1 && cp2 <= lcend + sizeof lcend; + for (cp1=template,cp2=lcres; *cp1 && cp2 <= lcres + sizeof lcres; cp1++,cp2++) *cp2 = _tolower(*cp1); /* Make lc copy for match */ if (cp1 != '\0') return 0; /* Path too long. */ lcend = cp2; @@ -2413,7 +2564,7 @@ trim_unixpath(char *fspec, char *wildspec, int opts) * VMS readdir() routines. * Written by Rich $alz, <rsalz@bbn.com> in August, 1990. * - * 21-Jul-1994 Charles Bailey bailey@genetics.upenn.edu + * 21-Jul-1994 Charles Bailey bailey@newman.upenn.edu * Minor modifications to original routines. */ @@ -2429,13 +2580,22 @@ opendir(char *name) { DIR *dd; char dir[NAM$C_MAXRSS+1]; - - /* Get memory for the handle, and the pattern. */ - New(1306,dd,1,DIR); + Stat_t sb; + if (do_tovmspath(name,dir,0) == NULL) { - Safefree((char *)dd); - return(NULL); + return NULL; } + if (flex_stat(dir,&sb) == -1) return NULL; + if (!S_ISDIR(sb.st_mode)) { + set_errno(ENOTDIR); set_vaxc_errno(RMS$_DIR); + return NULL; + } + if (!cando_by_name(S_IRUSR,0,dir)) { + set_errno(EACCES); set_vaxc_errno(RMS$_PRV); + return NULL; + } + /* Get memory for the handle, and the pattern. */ + New(1306,dd,1,DIR); New(1307,dd->pattern,strlen(dir)+sizeof "*.*" + 1,char); /* Fill in the fields; mainly playing with the descriptor. */ @@ -2669,9 +2829,9 @@ static struct dsc$descriptor_s VMScmd = {0,DSC$K_DTYPE_T,DSC$K_CLASS_S,Nullch}; static void vms_execfree() { - if (Cmd) { - Safefree(Cmd); - Cmd = Nullch; + if (PL_Cmd) { + Safefree(PL_Cmd); + PL_Cmd = Nullch; } if (VMScmd.dsc$a_pointer) { Safefree(VMScmd.dsc$a_pointer); @@ -2683,10 +2843,12 @@ vms_execfree() { static char * setup_argstr(SV *really, SV **mark, SV **sp) { + dTHR; char *junk, *tmps = Nullch; register size_t cmdlen = 0; size_t rlen; register SV **idx; + STRLEN n_a; idx = mark; if (really) { @@ -2703,20 +2865,20 @@ setup_argstr(SV *really, SV **mark, SV **sp) cmdlen += rlen ? rlen + 1 : 0; } } - New(401,Cmd,cmdlen+1,char); + New(401,PL_Cmd,cmdlen+1,char); if (tmps && *tmps) { - strcpy(Cmd,tmps); + strcpy(PL_Cmd,tmps); mark++; } - else *Cmd = '\0'; + else *PL_Cmd = '\0'; while (++mark <= sp) { if (*mark) { - strcat(Cmd," "); - strcat(Cmd,SvPVx(*mark,na)); + strcat(PL_Cmd," "); + strcat(PL_Cmd,SvPVx(*mark,n_a)); } } - return Cmd; + return PL_Cmd; } /* end of setup_argstr() */ @@ -2748,9 +2910,9 @@ setup_cmddsc(char *cmd, int check_img) else isdcl = 1; if (isdcl) { /* It's a DCL command, just do it. */ VMScmd.dsc$w_length = strlen(cmd); - if (cmd == Cmd) { - VMScmd.dsc$a_pointer = Cmd; - Cmd = Nullch; /* Don't try to free twice in vms_execfree() */ + if (cmd == PL_Cmd) { + VMScmd.dsc$a_pointer = PL_Cmd; + PL_Cmd = Nullch; /* Don't try to free twice in vms_execfree() */ } else VMScmd.dsc$a_pointer = savepvn(cmd,VMScmd.dsc$w_length); } @@ -2773,6 +2935,7 @@ setup_cmddsc(char *cmd, int check_img) s = resspec; while (*s && !isspace(*s)) s++; *s = '\0'; + if (!cando_by_name(S_IXUSR,0,resspec)) return RMS$_PRV; New(402,VMScmd.dsc$a_pointer,7 + s - resspec + (rest ? strlen(rest) : 0),char); strcpy(VMScmd.dsc$a_pointer,"$ MCR "); strcat(VMScmd.dsc$a_pointer,resspec); @@ -2790,6 +2953,7 @@ setup_cmddsc(char *cmd, int check_img) bool vms_do_aexec(SV *really,SV **mark,SV **sp) { + dTHR; if (sp > mark) { if (vfork_called) { /* this follows a vfork - act Unixish */ vfork_called--; @@ -2830,9 +2994,24 @@ vms_do_exec(char *cmd) if ((retsts = setup_cmddsc(cmd,1)) & 1) retsts = lib$do_command(&VMScmd); - set_errno(EVMSERR); + switch (retsts) { + case RMS$_FNF: + set_errno(ENOENT); break; + case RMS$_DNF: case RMS$_DIR: case RMS$_DEV: + set_errno(ENOTDIR); break; + case RMS$_PRV: + set_errno(EACCES); break; + case RMS$_SYN: + set_errno(EINVAL); break; + case CLI$_BUFOVF: + set_errno(E2BIG); break; + case LIB$_INVARG: case LIB$_INVSTRDES: case SS$_ACCVIO: /* shouldn't happen */ + _ckvmssts(retsts); /* fall through */ + default: /* SS$_DUPLNAM, SS$_CLI, resource exhaustion, etc. */ + set_errno(EVMSERR); + } set_vaxc_errno(retsts); - if (dowarn) + if (PL_dowarn) warn("Can't exec \"%s\": %s", VMScmd.dsc$a_pointer, Strerror(errno)); vms_execfree(); } @@ -2844,11 +3023,12 @@ vms_do_exec(char *cmd) unsigned long int do_spawn(char *); -/* {{{ unsigned long int do_aspawn(SV *really,SV **mark,SV **sp) */ +/* {{{ unsigned long int do_aspawn(void *really,void **mark,void **sp) */ unsigned long int -do_aspawn(SV *really,SV **mark,SV **sp) +do_aspawn(void *really,void **mark,void **sp) { - if (sp > mark) return do_spawn(setup_argstr(really,mark,sp)); + dTHR; + if (sp > mark) return do_spawn(setup_argstr((SV *)really,(SV **)mark,(SV **)sp)); return SS$_ABORT; } /* end of do_aspawn() */ @@ -2858,22 +3038,37 @@ do_aspawn(SV *really,SV **mark,SV **sp) unsigned long int do_spawn(char *cmd) { - unsigned long int substs, hadcmd = 1; + unsigned long int sts, substs, hadcmd = 1; TAINT_ENV(); TAINT_PROPER("spawn"); if (!cmd || !*cmd) { hadcmd = 0; - _ckvmssts(lib$spawn(0,0,0,0,0,0,&substs,0,0,0,0,0,0)); + sts = lib$spawn(0,0,0,0,0,0,&substs,0,0,0,0,0,0); } - else if ((substs = setup_cmddsc(cmd,0)) & 1) { - _ckvmssts(lib$spawn(&VMScmd,0,0,0,0,0,&substs,0,0,0,0,0,0)); + else if ((sts = setup_cmddsc(cmd,0)) & 1) { + sts = lib$spawn(&VMScmd,0,0,0,0,0,&substs,0,0,0,0,0,0); } - if (!(substs&1)) { - set_errno(EVMSERR); - set_vaxc_errno(substs); - if (dowarn) + if (!(sts & 1)) { + switch (sts) { + case RMS$_FNF: + set_errno(ENOENT); break; + case RMS$_DNF: case RMS$_DIR: case RMS$_DEV: + set_errno(ENOTDIR); break; + case RMS$_PRV: + set_errno(EACCES); break; + case RMS$_SYN: + set_errno(EINVAL); break; + case CLI$_BUFOVF: + set_errno(E2BIG); break; + case LIB$_INVARG: case LIB$_INVSTRDES: case SS$_ACCVIO: /* shouldn't happen */ + _ckvmssts(sts); /* fall through */ + default: /* SS$_DUPLNAM, SS$_CLI, resource exhaustion, etc. */ + set_errno(EVMSERR); + } + set_vaxc_errno(sts); + if (PL_dowarn) warn("Can't spawn \"%s\": %s", hadcmd ? VMScmd.dsc$a_pointer : "", Strerror(errno)); } @@ -2915,7 +3110,7 @@ my_flush(FILE *fp) int res; if ((res = fflush(fp)) == 0) { #ifdef VMS_DO_SOCKETS - struct mystat s; + Stat_t s; if (Fstat(fileno(fp), &s) == 0 && !S_ISSOCK(s.st_mode)) #endif res = fsync(fileno(fp)); @@ -3125,7 +3320,7 @@ struct passwd *my_getpwuid(Uid_t uid) else { uic.uic$l_uic= uid; if (!uic.uic$v_group) - uic.uic$v_group= getgid(); + uic.uic$v_group= PerlProc_getgid(); if (valid_uic(uic)) status = sys$idtoasc(uic.uic$l_uic, &lname, &name_desc, 0, 0, 0); else status = SS$_IVIDENT; @@ -3177,7 +3372,105 @@ void my_endpwent() } /*}}}*/ -#if __VMS_VER < 70000000 || __DECC_VER < 50200000 +#ifdef HOMEGROWN_POSIX_SIGNALS + /* Signal handling routines, pulled into the core from POSIX.xs. + * + * We need these for threads, so they've been rolled into the core, + * rather than left in POSIX.xs. + * + * (DRS, Oct 23, 1997) + */ + + /* sigset_t is atomic under VMS, so these routines are easy */ +/*{{{int my_sigemptyset(sigset_t *) */ +int my_sigemptyset(sigset_t *set) { + if (!set) { SETERRNO(EFAULT,SS$_ACCVIO); return -1; } + *set = 0; return 0; +} +/*}}}*/ + + +/*{{{int my_sigfillset(sigset_t *)*/ +int my_sigfillset(sigset_t *set) { + int i; + if (!set) { SETERRNO(EFAULT,SS$_ACCVIO); return -1; } + for (i = 0; i < NSIG; i++) *set |= (1 << i); + return 0; +} +/*}}}*/ + + +/*{{{int my_sigaddset(sigset_t *set, int sig)*/ +int my_sigaddset(sigset_t *set, int sig) { + if (!set) { SETERRNO(EFAULT,SS$_ACCVIO); return -1; } + if (sig > NSIG) { SETERRNO(EINVAL,LIB$_INVARG); return -1; } + *set |= (1 << (sig - 1)); + return 0; +} +/*}}}*/ + + +/*{{{int my_sigdelset(sigset_t *set, int sig)*/ +int my_sigdelset(sigset_t *set, int sig) { + if (!set) { SETERRNO(EFAULT,SS$_ACCVIO); return -1; } + if (sig > NSIG) { SETERRNO(EINVAL,LIB$_INVARG); return -1; } + *set &= ~(1 << (sig - 1)); + return 0; +} +/*}}}*/ + + +/*{{{int my_sigismember(sigset_t *set, int sig)*/ +int my_sigismember(sigset_t *set, int sig) { + if (!set) { SETERRNO(EFAULT,SS$_ACCVIO); return -1; } + if (sig > NSIG) { SETERRNO(EINVAL,LIB$_INVARG); return -1; } + *set & (1 << (sig - 1)); +} +/*}}}*/ + + +/*{{{int my_sigprocmask(int how, sigset_t *set, sigset_t *oset)*/ +int my_sigprocmask(int how, sigset_t *set, sigset_t *oset) { + sigset_t tempmask; + + /* If set and oset are both null, then things are badly wrong. Bail out. */ + if ((oset == NULL) && (set == NULL)) { + set_errno(EFAULT); set_vaxc_errno(SS$_ACCVIO); + return -1; + } + + /* If set's null, then we're just handling a fetch. */ + if (set == NULL) { + tempmask = sigblock(0); + } + else { + switch (how) { + case SIG_SETMASK: + tempmask = sigsetmask(*set); + break; + case SIG_BLOCK: + tempmask = sigblock(*set); + break; + case SIG_UNBLOCK: + tempmask = sigblock(0); + sigsetmask(*oset & ~tempmask); + break; + default: + set_errno(EINVAL); set_vaxc_errno(LIB$_INVARG); + return -1; + } + } + + /* Did they pass us an oset? If so, stick our holding mask into it */ + if (oset) + *oset = tempmask; + + return 0; +} +/*}}}*/ +#endif /* HOMEGROWN_POSIX_SIGNALS */ + + /* Used for UTC calculation in my_gmtime(), my_localtime(), my_time(), * my_utime(), and flex_stat(), all of which operate on UTC unless * VMSISH_TIMES is true. @@ -3197,21 +3490,59 @@ static long int utc_offset_secs; #undef localtime #undef time +#if defined(__VMS_VER) && __VMS_VER >= 70000000 && __DECC_VER >= 50200000 +# define RTL_USES_UTC 1 +#endif + +static time_t toutc_dst(time_t loc) { + struct tm *rsltmp; + + if ((rsltmp = localtime(&loc)) == NULL) return -1; + loc -= utc_offset_secs; + if (rsltmp->tm_isdst) loc -= 3600; + return loc; +} +#define _toutc(secs) ((secs) == -1 ? -1 : \ + ((gmtime_emulation_type || my_time(NULL)), \ + (gmtime_emulation_type == 1 ? toutc_dst(secs) : \ + ((secs) - utc_offset_secs)))) + +static time_t toloc_dst(time_t utc) { + struct tm *rsltmp; + + utc += utc_offset_secs; + if ((rsltmp = localtime(&utc)) == NULL) return -1; + if (rsltmp->tm_isdst) utc += 3600; + return utc; +} +#define _toloc(secs) ((secs) == -1 ? -1 : \ + ((gmtime_emulation_type || my_time(NULL)), \ + (gmtime_emulation_type == 1 ? toloc_dst(secs) : \ + ((secs) + utc_offset_secs)))) + + /* my_time(), my_localtime(), my_gmtime() - * By default traffic in UTC time values, suing CRTL gmtime() or + * By default traffic in UTC time values, using CRTL gmtime() or * SYS$TIMEZONE_DIFFERENTIAL to determine offset from local time zone. + * Note: We need to use these functions even when the CRTL has working + * UTC support, since they also handle C<use vmsish qw(times);> + * * Contributed by Chuck Lane <lane@duphy4.physics.drexel.edu> - * Modified by Charles Bailey <bailey@genetics.upenn.edu> + * Modified by Charles Bailey <bailey@newman.upenn.edu> */ /*{{{time_t my_time(time_t *timep)*/ time_t my_time(time_t *timep) { + dTHR; time_t when; + struct tm *tm_p; if (gmtime_emulation_type == 0) { - struct tm *tm_p; - time_t base = 15 * 86400; /* 15jan71; to avoid month ends */ + int dstnow; + time_t base = 15 * 86400; /* 15jan71; to avoid month/year ends between */ + /* results of calls to gmtime() and localtime() */ + /* for same &base */ gmtime_emulation_type++; if ((tm_p = gmtime(&base)) == NULL) { /* CRTL gmtime() is a fake */ @@ -3238,11 +3569,13 @@ time_t my_time(time_t *timep) } when = time(NULL); - if ( -# ifdef VMSISH_TIME - !VMSISH_TIME && -# endif - when != -1) when -= utc_offset_secs; +# ifdef VMSISH_TIME +# ifdef RTL_USES_UTC + if (VMSISH_TIME) when = _toloc(when); +# else + if (!VMSISH_TIME) when = _toutc(when); +# endif +# endif if (timep != NULL) *timep = when; return when; @@ -3254,23 +3587,29 @@ time_t my_time(time_t *timep) struct tm * my_gmtime(const time_t *timep) { + dTHR; char *p; time_t when; + struct tm *rsltmp; if (timep == NULL) { set_errno(EINVAL); set_vaxc_errno(LIB$_INVARG); return NULL; } if (*timep == 0) gmtime_emulation_type = 0; /* possibly reset TZ */ - if (gmtime_emulation_type == 0) (void) my_time(NULL); /* Init UTC */ when = *timep; # ifdef VMSISH_TIME - if (VMSISH_TIME) when -= utc_offset_secs; /* Input was local time */ -# endif + if (VMSISH_TIME) when = _toutc(when); /* Input was local time */ +# endif +# ifdef RTL_USES_UTC /* this implies that the CRTL has a working gmtime() */ + return gmtime(&when); +# else /* CRTL localtime() wants local time as input, so does no tz correction */ - return localtime(&when); - + rsltmp = localtime(&when); + if (rsltmp) rsltmp->tm_isdst = 0; /* We already took DST into account */ + return rsltmp; +#endif } /* end of my_gmtime() */ /*}}}*/ @@ -3279,7 +3618,9 @@ my_gmtime(const time_t *timep) struct tm * my_localtime(const time_t *timep) { + dTHR; time_t when; + struct tm *rsltmp; if (timep == NULL) { set_errno(EINVAL); set_vaxc_errno(LIB$_INVARG); @@ -3289,11 +3630,21 @@ my_localtime(const time_t *timep) if (gmtime_emulation_type == 0) (void) my_time(NULL); /* Init UTC */ when = *timep; +# ifdef RTL_USES_UTC # ifdef VMSISH_TIME - if (!VMSISH_TIME) when += utc_offset_secs; /* Input was UTC */ + if (VMSISH_TIME) when = _toutc(when); # endif - /* CRTL localtime() wants local time as input, so does no tz correction */ + /* CRTL localtime() wants UTC as input, does tz correction itself */ return localtime(&when); +# else +# ifdef VMSISH_TIME + if (!VMSISH_TIME) when = _toloc(when); /* Input was UTC */ +# endif +# endif + /* CRTL localtime() wants local time as input, so does no tz correction */ + rsltmp = localtime(&when); + if (rsltmp && gmtime_emulation_type != 1) rsltmp->tm_isdst = -1; + return rsltmp; } /* end of my_localtime() */ /*}}}*/ @@ -3303,7 +3654,6 @@ my_localtime(const time_t *timep) #define localtime(t) my_localtime(t) #define time(t) my_time(t) -#endif /* VMS VER < 7.0 || Dec C < 5.2 /* my_utime - update modification time of a file * calling sequence is identical to POSIX utime(), but under @@ -3325,6 +3675,7 @@ static const long int utime_baseadjust[2] = { 0x4beb4000, 0x7c9567 }; /*{{{int my_utime(char *path, struct utimbuf *utimes)*/ int my_utime(char *file, struct utimbuf *utimes) { + dTHR; register int i; long int bintime[2], len = 2, lowbit, unixtime, secscale = 10000000; /* seconds --> 100 ns intervals */ @@ -3367,11 +3718,9 @@ int my_utime(char *file, struct utimbuf *utimes) */ lowbit = (utimes->modtime & 1) ? secscale : 0; unixtime = (long int) utimes->modtime; -#if defined(VMSISH_TIME) && (__VMS_VER < 70000000 || __DECC_VER < 50200000) - if (!VMSISH_TIME) { /* Input was UTC; convert to local for sys svc */ - if (!gmtime_emulation_type) (void) time(NULL); /* Initialize UTC */ - unixtime += utc_offset_secs; - } +# ifdef VMSISH_TIME + /* If input was UTC; convert to local for sys svc */ + if (!VMSISH_TIME) unixtime = _toloc(unixtime); # endif unixtime >> 1; secscale << 1; retsts = lib$emul(&secscale, &unixtime, &lowbit, bintime); @@ -3569,17 +3918,16 @@ is_null_device(name) return (*name++ == ':') && (*name != ':'); } -/* Do the permissions allow some operation? Assumes statcache already set. */ +/* Do the permissions allow some operation? Assumes PL_statcache already set. */ /* Do this via $Check_Access on VMS, since the CRTL stat() returns only a - * subset of the applicable information. (We have to stick with struct - * stat instead of struct mystat in the prototype since we have to match - * the one in proto.h.) + * subset of the applicable information. */ /*{{{I32 cando(I32 bit, I32 effective, struct stat *statbufp)*/ I32 -cando(I32 bit, I32 effective, struct stat *statbufp) +cando(I32 bit, I32 effective, Stat_t *statbufp) { - if (statbufp == &statcache) return cando_by_name(bit,effective,namecache); + dTHR; + if (statbufp == &PL_statcache) return cando_by_name(bit,effective,namecache); else { char fname[NAM$C_MAXRSS+1]; unsigned long int retsts; @@ -3588,12 +3936,12 @@ cando(I32 bit, I32 effective, struct stat *statbufp) /* If the struct mystat is stale, we're OOL; stat() overwrites the device name on successive calls */ - devdsc.dsc$a_pointer = ((struct mystat *)statbufp)->st_devnam; - devdsc.dsc$w_length = strlen(((struct mystat *)statbufp)->st_devnam); + devdsc.dsc$a_pointer = ((Stat_t *)statbufp)->st_devnam; + devdsc.dsc$w_length = strlen(((Stat_t *)statbufp)->st_devnam); namdsc.dsc$a_pointer = fname; namdsc.dsc$w_length = sizeof fname - 1; - retsts = lib$fid_to_name(&devdsc,&(((struct mystat *)statbufp)->st_ino), + retsts = lib$fid_to_name(&devdsc,&(((Stat_t *)statbufp)->st_ino), &namdsc,&namdsc.dsc$w_length,0,0); if (retsts & 1) { fname[namdsc.dsc$w_length] = '\0'; @@ -3676,7 +4024,7 @@ cando_by_name(I32 bit, I32 effective, char *fname) retsts = sys$check_access(&objtyp,&namdsc,&usrdsc,armlst); if (retsts == SS$_NOPRIV || retsts == SS$_NOSUCHOBJECT || - retsts == SS$_INVFILFOROP || retsts == RMS$_FNF || + retsts == SS$_INVFILFOROP || retsts == RMS$_FNF || retsts == RMS$_SYN || retsts == RMS$_DIR || retsts == RMS$_DEV) { set_vaxc_errno(retsts); if (retsts == SS$_NOPRIV) set_errno(EACCES); @@ -3697,6 +4045,9 @@ cando_by_name(I32 bit, I32 effective, char *fname) if ((privused & CHP$M_READALL) && !curprv.prv$v_readall) return FALSE; return TRUE; } + if (retsts == SS$_ACCONFLICT) { + return TRUE; + } _ckvmssts(retsts); return FALSE; /* Should never get here */ @@ -3705,25 +4056,33 @@ cando_by_name(I32 bit, I32 effective, char *fname) /*}}}*/ -/*{{{ int flex_fstat(int fd, struct mystat *statbuf)*/ +/*{{{ int flex_fstat(int fd, Stat_t *statbuf)*/ int -flex_fstat(int fd, struct mystat *statbufp) +flex_fstat(int fd, Stat_t *statbufp) { + dTHR; if (!fstat(fd,(stat_t *) statbufp)) { - if (statbufp == (struct mystat *) &statcache) *namecache == '\0'; + if (statbufp == (Stat_t *) &PL_statcache) *namecache == '\0'; statbufp->st_dev = encode_dev(statbufp->st_devnam); +# ifdef RTL_USES_UTC +# ifdef VMSISH_TIME + if (VMSISH_TIME) { + statbufp->st_mtime = _toloc(statbufp->st_mtime); + statbufp->st_atime = _toloc(statbufp->st_atime); + statbufp->st_ctime = _toloc(statbufp->st_ctime); + } +# endif +# else # ifdef VMSISH_TIME if (!VMSISH_TIME) { /* Return UTC instead of local time */ # else if (1) { # endif -#if __VMS_VER < 70000000 || __DECC_VER < 50200000 - if (!gmtime_emulation_type) (void)time(NULL); - statbufp->st_mtime -= utc_offset_secs; - statbufp->st_atime -= utc_offset_secs; - statbufp->st_ctime -= utc_offset_secs; -#endif + statbufp->st_mtime = _toutc(statbufp->st_mtime); + statbufp->st_atime = _toutc(statbufp->st_atime); + statbufp->st_ctime = _toutc(statbufp->st_ctime); } +#endif return 0; } return -1; @@ -3731,14 +4090,15 @@ flex_fstat(int fd, struct mystat *statbufp) } /* end of flex_fstat() */ /*}}}*/ -/*{{{ int flex_stat(char *fspec, struct mystat *statbufp)*/ +/*{{{ int flex_stat(char *fspec, Stat_t *statbufp)*/ int -flex_stat(char *fspec, struct mystat *statbufp) +flex_stat(char *fspec, Stat_t *statbufp) { + dTHR; char fileified[NAM$C_MAXRSS+1]; int retval = -1; - if (statbufp == (struct mystat *) &statcache) + if (statbufp == (Stat_t *) &PL_statcache) do_tovmsspec(fspec,namecache,0); if (is_null_device(fspec)) { /* Fake a stat() for the null device */ memset(statbufp,0,sizeof *statbufp); @@ -3752,7 +4112,7 @@ flex_stat(char *fspec, struct mystat *statbufp) } /* Try for a directory name first. If fspec contains a filename without - * a type (e.g. sea:[dark.dark]water), and both sea:[wine.dark]water.dir + * a type (e.g. sea:[wine.dark]water), and both sea:[wine.dark]water.dir * and sea:[wine.dark]water. exist, we prefer the directory here. * Similarly, sea:[wine.dark] returns the result for sea:[wine]dark.dir, * not sea:[wine.dark]., if the latter exists. If the intended target is @@ -3761,24 +4121,31 @@ flex_stat(char *fspec, struct mystat *statbufp) */ if (do_fileify_dirspec(fspec,fileified,0) != NULL) { retval = stat(fileified,(stat_t *) statbufp); - if (!retval && statbufp == (struct mystat *) &statcache) + if (!retval && statbufp == (Stat_t *) &PL_statcache) strcpy(namecache,fileified); } if (retval) retval = stat(fspec,(stat_t *) statbufp); if (!retval) { statbufp->st_dev = encode_dev(statbufp->st_devnam); +# ifdef RTL_USES_UTC +# ifdef VMSISH_TIME + if (VMSISH_TIME) { + statbufp->st_mtime = _toloc(statbufp->st_mtime); + statbufp->st_atime = _toloc(statbufp->st_atime); + statbufp->st_ctime = _toloc(statbufp->st_ctime); + } +# endif +# else # ifdef VMSISH_TIME if (!VMSISH_TIME) { /* Return UTC instead of local time */ # else if (1) { # endif -#if __VMS_VER < 70000000 || __DECC_VER < 50200000 - if (!gmtime_emulation_type) (void)time(NULL); - statbufp->st_mtime -= utc_offset_secs; - statbufp->st_atime -= utc_offset_secs; - statbufp->st_ctime -= utc_offset_secs; -#endif + statbufp->st_mtime = _toutc(statbufp->st_mtime); + statbufp->st_atime = _toutc(statbufp->st_atime); + statbufp->st_ctime = _toutc(statbufp->st_ctime); } +# endif } return retval; @@ -3790,25 +4157,40 @@ flex_stat(char *fspec, struct mystat *statbufp) FILE * my_binmode(FILE *fp, char iotype) { - char filespec[NAM$C_MAXRSS], *acmode; + char filespec[NAM$C_MAXRSS], *acmode, *s, *colon, *dirend = Nullch; + int ret = 0, saverrno = errno, savevmserrno = vaxc$errno; fpos_t pos; - if (!fgetname(fp,filespec)) return NULL; - if (iotype != '-' && fgetpos(fp,&pos) == -1) return NULL; + if (!fgetname(fp,filespec,1)) return NULL; + for (s = filespec; *s; s++) { + if (*s == ':') colon = s; + else if (*s == ']' || *s == '>') dirend = s; + } + /* Looks like a tmpfile, which will go away if reopened */ + if (s == dirend + 3) return fp; + /* If we've got a non-file-structured device, clip off the trailing + * junk, and don't lose sleep if we can't get a stream position. */ + if (dirend == Nullch) *(colon+1) = '\0'; + if (iotype != '-'&& (ret = fgetpos(fp, &pos)) == -1 && dirend) return NULL; switch (iotype) { case '<': case 'r': acmode = "rb"; break; - case '>': case 'w': + case '>': case 'w': case '|': /* use 'a' instead of 'w' to avoid creating new file; fsetpos below will take care of restoring file position */ case 'a': acmode = "ab"; break; - case '+': case '|': case 's': acmode = "rb+"; break; + case '+': case 's': acmode = "rb+"; break; case '-': acmode = fileno(fp) ? "ab" : "rb"; break; + /* iotype'll be null for the SYS$INPUT:/SYS$OUTPUT:/SYS$ERROR: files */ + /* since we didn't really open them and can't really */ + /* reopen them */ + case 0: return NULL; break; default: - warn("Unrecognized iotype %c in my_binmode",iotype); + warn("Unrecognized iotype %x for %s in my_binmode",iotype, filespec); acmode = "rb+"; } if (freopen(filespec,acmode,fp) == NULL) return NULL; - if (iotype != '-' && fsetpos(fp,&pos) == -1) return NULL; + if (iotype != '-' && ret != -1 && fsetpos(fp,&pos) == -1) return NULL; + if (ret == -1) { set_errno(saverrno); set_vaxc_errno(savevmserrno); } return fp; } /* end of my_binmode() */ /*}}}*/ @@ -3842,7 +4224,7 @@ my_getlogin() * * Returns 1 on success; returns 0 and sets errno and vaxc$errno on failure. * - * Copyright 1996 by Charles Bailey <bailey@genetics.upenn.edu>. + * Copyright 1996 by Charles Bailey <bailey@newman.upenn.edu>. * Incorporates, with permission, some code from EZCOPY by Tim Adye * <T.J.Adye@rl.ac.uk>. Permission is given to distribute this code * as part of the Perl standard distribution under the terms of the @@ -4026,12 +4408,13 @@ rmsexpand_fromperl(CV *cv) { dXSARGS; char *fspec, *defspec = NULL, *rslt; + STRLEN n_a; if (!items || items > 2) croak("Usage: VMS::Filespec::rmsexpand(spec[,defspec])"); - fspec = SvPV(ST(0),na); + fspec = SvPV(ST(0),n_a); if (!fspec || !*fspec) XSRETURN_UNDEF; - if (items == 2) defspec = SvPV(ST(1),na); + if (items == 2) defspec = SvPV(ST(1),n_a); rslt = do_rmsexpand(fspec,NULL,1,defspec,0); ST(0) = sv_newmortal(); @@ -4044,9 +4427,10 @@ vmsify_fromperl(CV *cv) { dXSARGS; char *vmsified; + STRLEN n_a; if (items != 1) croak("Usage: VMS::Filespec::vmsify(spec)"); - vmsified = do_tovmsspec(SvPV(ST(0),na),NULL,1); + vmsified = do_tovmsspec(SvPV(ST(0),n_a),NULL,1); ST(0) = sv_newmortal(); if (vmsified != NULL) sv_usepvn(ST(0),vmsified,strlen(vmsified)); XSRETURN(1); @@ -4057,9 +4441,10 @@ unixify_fromperl(CV *cv) { dXSARGS; char *unixified; + STRLEN n_a; if (items != 1) croak("Usage: VMS::Filespec::unixify(spec)"); - unixified = do_tounixspec(SvPV(ST(0),na),NULL,1); + unixified = do_tounixspec(SvPV(ST(0),n_a),NULL,1); ST(0) = sv_newmortal(); if (unixified != NULL) sv_usepvn(ST(0),unixified,strlen(unixified)); XSRETURN(1); @@ -4070,9 +4455,10 @@ fileify_fromperl(CV *cv) { dXSARGS; char *fileified; + STRLEN n_a; if (items != 1) croak("Usage: VMS::Filespec::fileify(spec)"); - fileified = do_fileify_dirspec(SvPV(ST(0),na),NULL,1); + fileified = do_fileify_dirspec(SvPV(ST(0),n_a),NULL,1); ST(0) = sv_newmortal(); if (fileified != NULL) sv_usepvn(ST(0),fileified,strlen(fileified)); XSRETURN(1); @@ -4083,9 +4469,10 @@ pathify_fromperl(CV *cv) { dXSARGS; char *pathified; + STRLEN n_a; if (items != 1) croak("Usage: VMS::Filespec::pathify(spec)"); - pathified = do_pathify_dirspec(SvPV(ST(0),na),NULL,1); + pathified = do_pathify_dirspec(SvPV(ST(0),n_a),NULL,1); ST(0) = sv_newmortal(); if (pathified != NULL) sv_usepvn(ST(0),pathified,strlen(pathified)); XSRETURN(1); @@ -4096,9 +4483,10 @@ vmspath_fromperl(CV *cv) { dXSARGS; char *vmspath; + STRLEN n_a; if (items != 1) croak("Usage: VMS::Filespec::vmspath(spec)"); - vmspath = do_tovmspath(SvPV(ST(0),na),NULL,1); + vmspath = do_tovmspath(SvPV(ST(0),n_a),NULL,1); ST(0) = sv_newmortal(); if (vmspath != NULL) sv_usepvn(ST(0),vmspath,strlen(vmspath)); XSRETURN(1); @@ -4109,9 +4497,10 @@ unixpath_fromperl(CV *cv) { dXSARGS; char *unixpath; + STRLEN n_a; if (items != 1) croak("Usage: VMS::Filespec::unixpath(spec)"); - unixpath = do_tounixpath(SvPV(ST(0),na),NULL,1); + unixpath = do_tounixpath(SvPV(ST(0),n_a),NULL,1); ST(0) = sv_newmortal(); if (unixpath != NULL) sv_usepvn(ST(0),unixpath,strlen(unixpath)); XSRETURN(1); @@ -4124,22 +4513,23 @@ candelete_fromperl(CV *cv) char fspec[NAM$C_MAXRSS+1], *fsp; SV *mysv; IO *io; + STRLEN n_a; if (items != 1) croak("Usage: VMS::Filespec::candelete(spec)"); mysv = SvROK(ST(0)) ? SvRV(ST(0)) : ST(0); if (SvTYPE(mysv) == SVt_PVGV) { - if (!(io = GvIOp(mysv)) || !fgetname(IoIFP(io),fspec)) { + if (!(io = GvIOp(mysv)) || !fgetname(IoIFP(io),fspec,1)) { set_errno(EINVAL); set_vaxc_errno(LIB$_INVARG); - ST(0) = &sv_no; + ST(0) = &PL_sv_no; XSRETURN(1); } fsp = fspec; } else { - if (mysv != ST(0) || !(fsp = SvPV(mysv,na)) || !*fsp) { + if (mysv != ST(0) || !(fsp = SvPV(mysv,n_a)) || !*fsp) { set_errno(EINVAL); set_vaxc_errno(LIB$_INVARG); - ST(0) = &sv_no; + ST(0) = &PL_sv_no; XSRETURN(1); } } @@ -4159,39 +4549,40 @@ rmscopy_fromperl(CV *cv) unsigned long int sts; SV *mysv; IO *io; + STRLEN n_a; if (items < 2 || items > 3) croak("Usage: File::Copy::rmscopy(from,to[,date_flag])"); mysv = SvROK(ST(0)) ? SvRV(ST(0)) : ST(0); if (SvTYPE(mysv) == SVt_PVGV) { - if (!(io = GvIOp(mysv)) || !fgetname(IoIFP(io),inspec)) { + if (!(io = GvIOp(mysv)) || !fgetname(IoIFP(io),inspec,1)) { set_errno(EINVAL); set_vaxc_errno(LIB$_INVARG); - ST(0) = &sv_no; + ST(0) = &PL_sv_no; XSRETURN(1); } inp = inspec; } else { - if (mysv != ST(0) || !(inp = SvPV(mysv,na)) || !*inp) { + if (mysv != ST(0) || !(inp = SvPV(mysv,n_a)) || !*inp) { set_errno(EINVAL); set_vaxc_errno(LIB$_INVARG); - ST(0) = &sv_no; + ST(0) = &PL_sv_no; XSRETURN(1); } } mysv = SvROK(ST(1)) ? SvRV(ST(1)) : ST(1); if (SvTYPE(mysv) == SVt_PVGV) { - if (!(io = GvIOp(mysv)) || !fgetname(IoIFP(io),outspec)) { + if (!(io = GvIOp(mysv)) || !fgetname(IoIFP(io),outspec,1)) { set_errno(EINVAL); set_vaxc_errno(LIB$_INVARG); - ST(0) = &sv_no; + ST(0) = &PL_sv_no; XSRETURN(1); } outp = outspec; } else { - if (mysv != ST(1) || !(outp = SvPV(mysv,na)) || !*outp) { + if (mysv != ST(1) || !(outp = SvPV(mysv,n_a)) || !*outp) { set_errno(EINVAL); set_vaxc_errno(LIB$_INVARG); - ST(0) = &sv_no; + ST(0) = &PL_sv_no; XSRETURN(1); } } @@ -4215,6 +4606,11 @@ init_os_extras() newXSproto("VMS::Filespec::unixpath",unixpath_fromperl,file,"$"); newXSproto("VMS::Filespec::candelete",candelete_fromperl,file,"$"); newXS("File::Copy::rmscopy",rmscopy_fromperl,file); + +#ifdef PRIME_ENV_AT_STARTUP + prime_env_iter(); +#endif + return; } diff --git a/gnu/usr.bin/perl/vms/vms_yfix.pl b/gnu/usr.bin/perl/vms/vms_yfix.pl index f57ea1d5150..08a8dbffb17 100644 --- a/gnu/usr.bin/perl/vms/vms_yfix.pl +++ b/gnu/usr.bin/perl/vms/vms_yfix.pl @@ -27,6 +27,11 @@ while (<C>) { # accomodate old VAXC's macro susbstitution pecularities $_ = "# ifndef getenv\n$_# endif\n"; } + elsif ( /getenv\("YYDEBUG"\)/ ) { + # Reset the "error" status if an optional lookup fails + while (not /^\s+\}/) { print COUT; $_ = <C>; } + $_ .= "\telse SETERRNO(0,SS\$_NORMAL);\n"; + } else { # add the dEXT tag to definitions of global vars, so we'll insert # a globaldef when perly.c is compiled diff --git a/gnu/usr.bin/perl/vms/vmsish.h b/gnu/usr.bin/perl/vms/vmsish.h index 2da1639baa4..228a0549960 100644 --- a/gnu/usr.bin/perl/vms/vmsish.h +++ b/gnu/usr.bin/perl/vms/vmsish.h @@ -16,12 +16,11 @@ #include <stsdef.h> /* bitmasks for exit status testing */ /* Suppress compiler warnings from DECC for VMS-specific extensions: - * GLOBALEXT, NOSHAREEXT, READONLYEXT: global[dr]ef declarations * ADDRCONSTEXT,NEEDCONSTEXT: initialization of data with non-constant values * (e.g. pointer fields of descriptors) */ #ifdef __DECC -# pragma message disable (GLOBALEXT,NOSHAREEXT,READONLYEXT,ADDRCONSTEXT,NEEDCONSTEXT) +# pragma message disable (ADDRCONSTEXT,NEEDCONSTEXT) #endif /* DEC's C compilers and gcc use incompatible definitions of _to(upp|low)er() */ @@ -56,6 +55,11 @@ # include <unistd.h> /* DECC has this; VAXC and gcc don't */ #endif +/* VAXC doesn't have a unary plus operator, so we need to get there indirectly */ +#if defined(VAXC) && !defined(__DECC) +# define NO_UNARY_PLUS +#endif + #ifdef NO_PERL_TYPEDEFS /* a2p; we don't want Perl's special routines */ # define DONT_MASK_RTL_CALLS #endif @@ -70,13 +74,14 @@ /* DECC introduces this routine in the RTL as of VMS 7.0; for now, * we'll use ours, since it gives us the full VMS exit status. */ -#ifdef __PID_T -# define Pid_t pid_t -#else -# define Pid_t unsigned int -#endif #define waitpid my_waitpid +/* Don't redeclare standard RTL routines in Perl's header files; + * VMS history or extensions makes some of the formal protoypes + * differ from the common Unix forms. + */ +#define DONT_DECLARE_STD 1 + /* Our own contribution to PerlShr's global symbols . . . */ #ifdef EMBED # define my_trnlnm Perl_my_trnlnm @@ -111,11 +116,15 @@ # define seekdir Perl_seekdir # define closedir Perl_closedir # define vmsreaddirversions Perl_vmsreaddirversions -#if __VMS_VER < 70000000 || __DECC_VER < 50200000 # define my_gmtime Perl_my_gmtime # define my_localtime Perl_my_localtime # define my_time Perl_my_time -#endif +# define my_sigemptyset Perl_my_sigemptyset +# define my_sigfillset Perl_my_sigfillset +# define my_sigaddset Perl_my_sigaddset +# define my_sigdelset Perl_my_sigdelset +# define my_sigismember Perl_my_sigismember +# define my_sigprocmask Perl_my_sigprocmask # define cando_by_name Perl_cando_by_name # define flex_fstat Perl_flex_fstat # define flex_stat Perl_flex_stat @@ -157,12 +166,6 @@ */ #define BIG_TIME -/* USE_STAT_RDEV: - * This symbol is defined if this system has a stat structure declaring - * st_rdev - */ -#define USE_STAT_RDEV /**/ - /* ACME_MESS: * This symbol, if defined, indicates that error messages should be * should be generated in a format that allows the use of the Acme @@ -200,9 +203,9 @@ #define HINT_M_VMSISH_STATUS 0x01000000 /* system, $? return VMS status */ #define HINT_M_VMSISH_EXIT 0x02000000 /* exit(1) ==> SS$_NORMAL */ #define HINT_M_VMSISH_TIME 0x04000000 /* times are local, not UTC */ -#define NATIVE_HINTS (hints >> HINT_V_VMSISH) /* used in op.c */ +#define NATIVE_HINTS (PL_hints >> HINT_V_VMSISH) /* used in op.c */ -#define TEST_VMSISH(h) (curcop->op_private & ((h) >> HINT_V_VMSISH)) +#define TEST_VMSISH(h) (PL_curcop->op_private & ((h) >> HINT_V_VMSISH)) #define VMSISH_STATUS TEST_VMSISH(HINT_M_VMSISH_STATUS) #define VMSISH_EXIT TEST_VMSISH(HINT_M_VMSISH_EXIT) #define VMSISH_TIME TEST_VMSISH(HINT_M_VMSISH_TIME) @@ -227,8 +230,8 @@ #endif #define BIT_BUCKET "_NLA0:" -#define PERL_SYS_INIT(c,v) vms_image_init((c),(v)) -#define PERL_SYS_TERM() +#define PERL_SYS_INIT(c,v) vms_image_init((c),(v)); MALLOC_INIT +#define PERL_SYS_TERM() MALLOC_TERM #define dXSUB_SYS #define HAS_KILL #define HAS_WAIT @@ -254,16 +257,16 @@ #define HAS_UTIME /**/ /* HAS_GROUP - * This symbol, if defined, indicates that the getgrnam(), - * getgrgid(), and getgrent() routines are available to - * get group entries. + * This symbol, if defined, indicates that the getgrnam() and + * getgrgid() routines are available to get group entries. + * The getgrent() has a separate definition, HAS_GETGRENT. */ #undef HAS_GROUP /**/ /* HAS_PASSWD - * This symbol, if defined, indicates that the getpwnam(), - * getpwuid(), and getpwent() routines are available to - * get password entries. + * This symbol, if defined, indicates that the getpwnam() and + * getpwuid() routines are available to get password entries. + * The getpwent() has a separate definition, HAS_GETPWENT. */ #define HAS_PASSWD /**/ @@ -278,6 +281,30 @@ */ #define USEMYBINMODE +/* Stat_t: + * This symbol holds the type used to declare buffers for information + * returned by stat(). It's usually just struct stat. It may be necessary + * to include <sys/stat.h> and <sys/types.h> to get any typedef'ed + * information. + */ +/* VMS: + * We need this typedef to point to the new type even if DONT_MASK_RTL_CALLS + * is in effect, since Perl's thread.h embeds one of these structs in its + * thread data struct, and our struct mystat is a different size from the + * regular struct stat (cf. note above about having to pad struct to work + * around bug in compiler.) + * It's OK to pass one of these to the RTL's stat(), though, since the + * fields it fills are the same in each struct. + */ +#define Stat_t struct mystat + +/* USE_STAT_RDEV: +* This symbol is defined if this system has a stat structure declaring +* st_rdev +* VMS: Field exists in POSIXish version of struct stat(), but is not used. +*/ +#undef USE_STAT_RDEV /**/ + /* * fwrite1() should be a routine with the same calling sequence as fwrite(), * but which outputs all of the bytes requested as a single stream (unlike @@ -326,16 +353,46 @@ struct utimbuf { # define tbuffer_t struct tms #endif -/* Prior to VMS 7.0, the CRTL gmtime() routine was a stub which always - * returned NULL. Substitute our own routine, which uses the logical - * SYS$TIMEZONE_DIFFERENTIAL, whcih the native UTC support routines - * in VMS 6.0 or later use. We also add shims for time() and localtime() - * so we can run on UTC by default. +/* Substitute our own routines for gmtime(), localtime(), and time(), + * which allow us to implement the vmsish 'time' pragma, and work + * around absence of system-level UTC support on old versions of VMS. */ -#if __VMS_VER < 70000000 || __DECC_VER < 50200000 #define gmtime(t) my_gmtime(t) #define localtime(t) my_localtime(t) #define time(t) my_time(t) + +/* If we're using an older version of VMS whose Unix signal emulation + * isn't very POSIXish, then roll our own. + */ +#if __VMS_VER < 70000000 || __DECC_VER < 50200000 +# define HOMEGROWN_POSIX_SIGNALS +#endif +#ifdef HOMEGROWN_POSIX_SIGNALS +# define sigemptyset(t) my_sigemptyset(t) +# define sigfillset(t) my_sigfillset(t) +# define sigaddset(t, u) my_sigaddset(t, u) +# define sigdelset(t, u) my_sigdelset(t, u) +# define sigismember(t, u) my_sigismember(t, u) +# define sigprocmask(t, u, v) my_sigprocmask(t, u, v) +# ifndef _SIGSET_T + typedef int sigset_t; +# endif + /* The tools for sigprocmask() are there, just not the routine itself */ +# ifndef SIG_UNBLOCK +# define SIG_UNBLOCK 1 +# endif +# ifndef SIG_BLOCK +# define SIG_BLOCK 2 +# endif +# ifndef SIG_SETMASK +# define SIG_SETMASK 3 +# endif +# define sigaction sigvec +# define sa_flags sv_onstack +# define sa_handler sv_handler +# define sa_mask sv_mask +# define sigsuspend(set) sigpause(*set) +# define sigpending(a) (not_here("sigpending"),0) #endif /* VMS doesn't use a real sys_nerr, but we need this when scanning for error @@ -451,6 +508,13 @@ struct mystat char st_fab_rat; /* record attributes */ char st_fab_fsz; /* fixed header size */ unsigned st_dev; /* encoded device name */ + /* Pad struct out to integral number of longwords, since DECC 5.6/VAX + * has a bug in dealing with offsets in structs in which are embedded + * other structs whose size is an odd number of bytes. (An even + * number of bytes is enough to make it happy, but we go for natural + * alignment anyhow.) + */ + char st_fill1[sizeof(void *) - (3*sizeof(unsigned short) + 3*sizeof(char))%sizeof(void *)]; }; typedef unsigned mydev_t; typedef unsigned myino_t; @@ -536,19 +600,25 @@ long telldir _((DIR *)); void seekdir _((DIR *, long)); void closedir _((DIR *)); void vmsreaddirversions _((DIR *, int)); -#ifdef my_gmtime struct tm * my_gmtime _((const time_t *)); struct tm * my_localtime _((const time_t *)); time_t my_time _((time_t *)); -#endif /* We're assuming these three come as a package */ +#ifdef HOMEGROWN_POSIX_SIGNALS +int my_sigemptyset _((sigset_t *)); +int my_sigfillset _((sigset_t *)); +int my_sigaddset _((sigset_t *, int)); +int my_sigdelset _((sigset_t *, int)); +int my_sigismember _((sigset_t *, int)); +int my_sigprocmask _((int, sigset_t *, sigset_t *)); +#endif I32 cando_by_name _((I32, I32, char *)); -int flex_fstat _((int, struct mystat *)); -int flex_stat _((char *, struct mystat *)); +int flex_fstat _((int, Stat_t *)); +int flex_stat _((char *, Stat_t *)); int trim_unixpath _((char *, char*, int)); int my_vfork _(()); bool vms_do_aexec _((SV *, SV **, SV **)); bool vms_do_exec _((char *)); -unsigned long int do_aspawn _((SV *, SV **, SV **)); +unsigned long int do_aspawn _((void *, void **, void **)); unsigned long int do_spawn _((char *)); int my_fwrite _((void *, size_t, size_t, FILE *)); int my_flush _((FILE *)); |