!!
!**********************************************************************
!*
!*  THESE ROUTINES SET UP, LIST AND AMEND A SET OF DEFAULT OPTIONS
!*  FOR THE SCIENTIFIC JOBBER ON EMAS 2900.
!*
!**********************************************************************
!*
!*
SYSTEMROUTINESPEC  CONNECT(STRING  (15) S,  C 
   INTEGER  ACCESS, MAXBYTES, PROTECTION,  C 
   RECORDNAME  R, INTEGERNAME  FLAG)
CONSTSTRING  (11) FILE = "JDEFAULTS"
EXTERNALSTRINGFNSPEC  UINFS(INTEGER  ENTRY)
EXTERNALINTEGERFNSPEC  DPERMISSION( C 
   STRING  (6) OWNER, USER, STRING  (8) DATE,  C 
   STRING  (11) FILE, INTEGER  FSYS, TYPE, ADRPRM)
EXTERNALINTEGERFNSPEC  DCREATE(STRING  (6) USER,  C 
   STRING  (11) FILE, INTEGER  FSYS, NKB, TYPE)
!!
RECORDFORMAT  INFM(INTEGER  CONAD, FILESIZE,  C 
   BYTEINTEGER  DUM1, DUM2, DUM3, DUM4,  C 
   STRING  (6) DUM5, INTEGER  TYPEDUM6,  C 
   INTEGER  DATASTART, DATAEND, DUM7)
RECORDFORMAT  OPTFM(INTEGER  FACLEVEL, MDEFAULT, MMAX, LDEFAULT,  C 
   LMAX, FMAX, BREAK, OPTIONS)
!!

ROUTINE  SJDERROR(STRING  (16) ACTION, INTEGER  FLAG)
   PRINTSTRING("
".ACTION." JDEFAULTS FAILED, FLAG = ")
   WRITE(FLAG,8)
   STOP 
END 
!!
CONSTSTRING  (9) ARRAY  PARMS(0 : 29) =               C 
'QUOTES','NOLIST','NODIAG','STACK',
'NOCHECK','NOARRAY','NOTRACE','SMAP',
'NORUN','INHIBIOF','ZERO','XREF',
'LABELS','LET','CODE','ATTR',
'OPT','INHIBOPEH','####','FREE',
'####','####','EBCDIC','NOLINE',
'####','MAXKEYS','I8','L8',
'R8','MISMATCH'
!*
CONSTSTRING  (10) ARRAY  ALTPARMS(0 : 29) =     C 
           C 
   'PERCENT','LIST','DIAG','NOSTACK',
   'CHECK','ARRAY','TRACE','####',
   'RUN','####','####','NOXREF',
   'NOLABELS','NOLET','NOCODE','NOATTR',
   '####','####','####','FIXED',
   '####','####','ISO','LINE',
   '####','MINKEYS','I4','L4',
   'R4','NOMISMATCH'
!*
!*
ROUTINESPEC  PRINT OPTIONS(INTEGER  N)
!*

INTEGERFN  PARM(STRING  (63) S, INTEGER  OLDPARM)
STRING  (63) T
INTEGER  I, J, K
   I = OLDPARM
L1: IF  S = '' THEN  RESULT  = I
   UNLESS  S -> T.(",").S THEN  START 
      UNLESS  S -> T.("&").S THEN  START 
         T = S
         S = ''
      FINISH 
   FINISH 
   CYCLE  J = 0,1,29
      IF  PARMS(J) = T THEN  START 
         I = I!(1<<J)
         -> L1
      FINISH 
      IF  ALTPARMS(J) = T THEN  START 
         K = (-1)!!(1<<J)
         I = I&K
         -> L1
      FINISH 
   REPEAT 
   PRINTSTRING('***INVALID OPTION '.T.' IGNORED
')
   -> L1
END ;                                   !OF PARM
!*

ROUTINE  PRINT OPTIONS(INTEGER  J)
INTEGER  I, K, L, M
CONSTBYTEINTEGERARRAY  INDEX(0 : 17) =             C 
    1, 4, 5,23, 2,16, 6,12,15,11,14, 0,22,28,26,27, 9,29
CONSTBYTEINTEGERARRAY  MASK(0 : 17) =             C 
    7,14, 7, 7, 7,21, 1, 4, 4, 4,20, 3, 8, 4, 4, 4,20, 4
ROUTINESPEC  P(STRING  (15) S)
   PRINTSTRING('
COMPILATION OPTIONS: ')
   K = 0
   CYCLE  I = 0,1,17
      M = MASK(I)
      L = INDEX(I)
      IF  J&(1<<L) = 0 THEN  START 
         IF  M&2 # 0 OR  M&16 = 0 THEN  P(ALTPARMS(L))
      FINISH  ELSE  START 
         IF  M&1 # 0 OR  M&16 = 0 THEN  P(PARMS(L))
      FINISH 
   REPEAT 
   IF  K = 0 THEN  PRINTSTRING('DEFAULTS')
   NEWLINES(2)
   RETURN 
!*

   ROUTINE  P(STRING  (15) S)
      IF  K # 0 THEN  PRINTSYMBOL(',')
      PRINTSTRING(S)
      K = K+1
   END ;                                ! P
END ;                                   !  PRINT OPTIONS
!!
!!**********************************************************************!!
!!   PRINT OUT CURRENT OPTIONS FOR JOBBER PROCESS('S)
!!
!!********************************************************************

EXTERNALROUTINE  PRINTJOPTIONS(STRING  (63) JOBBERS)
RECORD  IN(INFM)
RECORDNAME  JOPT(OPTFM)
STRING  (6) USER, JOBBER
INTEGER  FLAG, FSYS
!!
   USER = UINFS(1)
   CYCLE 
      UNLESS  JOBBERS -> JOBBER.(",").JOBBERS C 
         THEN  JOBBER = JOBBERS AND  JOBBERS = ""
      FSYS = -1
      FLAG = DPERMISSION(JOBBER,USER,"",FILE,FSYS,1,1)
      IF  FLAG # 0 THEN  SJDERROR("DPERMIT",FLAG)
      CONNECT(JOBBER.".".FILE,0,0,0,IN,FLAG)
      IF  FLAG # 0 THEN  SJDERROR("CONNECT",FLAG)
      JOPT == RECORD(IN_CONAD+32)
      PRINTSTRING("
".JOBBER. C 
         " - OPTIONS CURRENTLY IN FORCE ARE:

FACILITY LEVEL =          ")
      WRITE(JOPT_FACLEVEL,8)
      PRINTSTRING("

CPULIMITS -    DEFAULT =  ")
      WRITE(JOPT_MDEFAULT,8)
      PRINTSTRING(" SECS        MAXIMUM = ")
      WRITE(JOPT_MMAX,7)
      PRINTSTRING(" SECS

OUTPUT LIMIT - DEFAULT =  ")
      WRITE(JOPT_LDEFAULT,8)
      PRINTSTRING(" LINES       MAXIMUM = ")
      WRITE(JOPT_LMAX,7)
      PRINTSTRING(" LINES

MAX. FILE SIZE =          ")
      WRITE(JOPT_FMAX//1024,8)
      PRINTSTRING(" KBYTES

OUTPUT BREAK LIMIT =      ")
      WRITE(JOPT_BREAK,8)
      PRINTSTRING(" LINES

")
      PRINT OPTIONS(JOPT_OPTIONS)
      EXIT  IF  JOBBERS = ""
   REPEAT 
END ;                                   ! OF PRINT J OPTIONS
!!
!!**********************************************************************!!
!!   CREATE JOBBER OPTIONS FILE AND SET UP DEFAULT VALUES.
!!
!!**********************************************************************

EXTERNALROUTINE  CREATE J OPTIONS(STRING  (63) JOBBERS)
RECORD  IN(INFM)
STRING  (6) USER, JOBBER
INTEGER  CONAD, FLAG, FSYS
RECORDNAME  JOPT(OPTFM)
!!
   USER = UINFS(1)
   CYCLE 
      UNLESS  JOBBERS -> JOBBER.(",").JOBBERS C 
         THEN  JOBBER = JOBBERS AND  JOBBERS = ""
      FSYS = -1
      FLAG = DCREATE(JOBBER,FILE,FSYS,4,8);  ! 8=CHERISH
      IF  FLAG # 0 AND  FLAG # 16 C 
         THEN  SJDERROR("DCREATE",FLAG)
                                        ! 16=ALREADY EXISTS
      FLAG = DPERMISSION(JOBBER,USER,"",FILE,FSYS,1,3)
      IF  FLAG # 0 THEN  SJDERROR("DPERMIT",FLAG)
      CONNECT(JOBBER.".".FILE,3,0,0,IN,FLAG)
      IF  FLAG # 0 THEN  SJDERROR("CONNECT",FLAG)
      CONAD = IN_CONAD
      JOPT == RECORD(CONAD+32)
      INTEGER(CONAD) = 64
      INTEGER(CONAD+8) = X'4000'
      JOPT = 0
      JOPT_FACLEVEL = 2
      JOPT_MDEFAULT = 30
      JOPT_MMAX = 300
      JOPT_LDEFAULT = 1000
      JOPT_LMAX = 5000
      JOPT_FMAX = X'40000';            ! 8 SEGS
      JOPT_BREAK = 5000
      JOPT_OPTIONS = X'81000001';       ! STACK LIMIT DEFINED,ISO,QUOTES
      EXIT  IF  JOBBERS = ""
   REPEAT 
END 
!!

ROUTINE  READLINE(STRING  (255) NAME  LINE)
   WHILE  NEXTSYMBOL = NL THEN  SKIPSYMBOL;  ! SKIP BLANK LINES
   LINE = ""
   WHILE  NEXTSYMBOL # NL THEN  CYCLE 
      WHILE  NEXTSYMBOL = ' ' THEN  SKIPSYMBOL
      LENGTH(LINE) = LENGTH(LINE)+1
      BYTEINTEGER(ADDR(LINE)+LENGTH(LINE)) = NEXTSYMBOL
      SKIPSYMBOL
   REPEAT 
   SKIPSYMBOL
END 
!!

INTEGERFN  STOI(STRING  (8) S, INTEGERNAME  N)
INTEGER  I, J
   N = 0
   I = 1
   CYCLE 
      J = BYTEINTEGER(ADDR(S)+I)
      UNLESS  '0' <= J <= '9' THEN  RESULT  = 2
      N = (N*10)+(J-'0')
      EXIT  IF  I >= LENGTH(S)
      I = I+1
   REPEAT 
   RESULT  = 0
END 
!!
!!***********************************************************************!!
!!
!!        AMEND JOBBER OPTIONS
!!
!!**********************************************************************

EXTERNALROUTINE  SET J OPTIONS(STRING  (63) JOBBERS)
RECORDNAME  JOPT(OPTFM)
RECORD  IN(INFM)
STRING  (63) LJOBBERS
STRING  (6) USER, JOBBER
INTEGER  FLAG, I, NJ, N, FSYS, CT
SWITCH  NJS(1 : 7)
STRING  (128) S, REST, OPT
CONSTSTRING  (8) ARRAY  OPTS(1 : 8) =  C 
              C 
"FACLEVEL","MDEFAULT","MMAX","LDEFAULT","LMAX","FMAX","BREAK","OPTIONS"
!!
   USER = UINFS(1)
   CT = 0
   CYCLE 
      CT = CT+1
AGN:  READ LINE(S)
      STOP  IF  S = ".END" OR  S = "STOP" OR  S = "*"
      UNLESS  S -> OPT.("=").REST START 
         PRINTSTRING("
THE FORMAT IS OPTION = VALUE
")
         -> AGN
      FINISH 
      NJ = 0
      CYCLE  I = 1,1,8
         IF  OPT = OPTS(I) THEN  NJ = I AND  EXIT 
      REPEAT 
      IF  NJ = 0 THEN  START 
         PRINTSTRING("
??
OPTIONS ARE FACLEVEL,MDEFAULT,MMAX,LDEFAULT,LMAX,FMAX,BREAK,OPTIONS
")
         -> AGN
      FINISH 
      IF  NJ # 8 THEN  START 
         I = STOI(REST,N)
         IF  I = 2 THEN  PRINTSTRING("
NON-NUMERIC DIGIT IN ". C 
            REST."
") AND  -> AGN
! CHECK VALUE IS WITHIN PERMITTED RANGE
!!
         -> NJS(NJ)
NJS(1):
! FACILITY LEVEL
         -> BADVALUE UNLESS  1 <= N <= 2
         -> GOODVALUE
NJS(2):

NJS(3):
! CPU LIMITS
         -> BADVALUE UNLESS  10 <= N <= 3000
         -> GOODVALUE
NJS(4):

NJS(5):
! OUTPUT LIMITS
         -> BADVALUE UNLESS  50 <= N <= 100000
         -> GOODVALUE
NJS(6):
! MAXIMUM FILE SIZE
         -> BADVALUE UNLESS  10 <= N <= 1024
          N=N*1024
         -> GOODVALUE
NJS(7):
! OUTPUT BREAK
         -> GOODVALUE
BADVALUE:
         PRINTSTRING("
VALUE ")
         WRITE(I,1)
         PRINTSTRING(" FOR ".OPTS(NJ). C 
            " IS OUTSIDE PERMITTED LIMITS ")
         NEWLINE
GOODVALUE:

      FINISH 
      LJOBBERS = JOBBERS
      CYCLE 
         UNLESS  LJOBBERS -> JOBBER.(",").LJOBBERS C 
            THEN  JOBBER = LJOBBERS AND  LJOBBERS = ""
         FSYS = -1
         IF  CT = 1 START 
            FLAG = DPERMISSION(JOBBER,USER,"",FILE,FSYS,1,3)
            IF  FLAG # 0 THEN  SJDERROR("DPERMIT",FLAG)
         FINISH 
         CONNECT(JOBBER.".".FILE,3,0,0,IN,FLAG)
         IF  FLAG # 0 THEN  SJDERROR("CONNECT",FLAG)
         JOPT == RECORD(IN_CONAD+32)
         IF  NJ # 8 THEN  INTEGER(ADDR(JOPT)+((NJ-1)*4)) = N C 
            ELSE  JOPT_OPTIONS = PARM(REST,JOPT_OPTIONS)
         EXIT  IF  LJOBBERS = ""
      REPEAT 
   REPEAT 
END ;                                   ! OF SET J OPTION
ENDOFFILE