*.        MAINTSKEL REV 2.3  07/01/77
*.
*.
*.        QUEUE <ELEMENT> <VERSION> <SGS-NAME> <SGS-NUMBER>
*.
*.        <SGS-NAME> AND <SGS-NUMBER> REFER TO A PARTICULAR
*.        MAP, PROCESS, DESCRIBE, OR TOC SGS, OR
*.        A PARTICULAR PCF OR TCF ENTRY.  THIS PROCEDURE
*.        ESTABLISHES THE PROCESSOR AND NON-DEFAULT OPTIONS (IF ANY)
*.        FOR SOME ELEMENT AND PASSES THE INFORMATION TO MAKESGS.
*.        THIS ASSUMES THAT MAP SGSSES ARE PROCESSED FIRST.
*.        OTHERWISE, ALL KINDS OF BAD THINGS WILL HAPPEN IN TERMS OF
*.        PROCESSING TOO MANY MAPS.
*.
*DEFINE QUEUE
*CLEAR FOUND
*INCREMENT I TO [DOLIST,1] WHILE FOUND IS CLEAR
*PROCESS DOSEARCH [#1] [#2] [DOLIST,1,I,1]
*LOOP
*IF FOUND IS CLEAR
*IF [#3] = MAP
*PROCESS MAKESGS [#1] [#2] MAP MAP [#4]
*ELSE
*.        DIDN'T COME FROM MAP SGS. SEE IF DESCRIBE.
*IF [#3] = DESCRIBE OR [#3] = PROCESS
*IF [#3] = DESCRIBE OR [[#3],[#4]] > 1
*PROCESS MAKESGS [#1] [#2] [[#3],[#4],2,1] [#3] [#4]
*SET FOUND
*END
*END
*IF FOUND IS CLEAR
*.        NOT FROM DESCRIBE. SEE IF IT HAS A DESCRIBE.
*INCREMENT DUMMY TO [DESCRIBE] WHILE FOUND IS CLEAR
*IF COLUMN SEARCH FROM DESCRIBE,DUMMY,1,1 FOR [#1]
*IF [DESCRIBE,CARD,1] > 1
*IF [DESCRIBE,CARD,1,2] = [#2]
*SET FOUND TO CARD
*ELSE
*SET DUMMY TO CARD
*END
*ELSE
*IF [#2] = 'NO'
*SET FOUND TO CARD
*ELSE
*SET DUMMY TO CARD
*END
*END
*ELSE
*SET FOUND TO -1
*END
*LOOP
*IF VALUE OF FOUND > 0
*PROCESS MAKESGS [#1] [#2] [DESCRIBE,FOUND,2,1] DESCRIBE [*FOUND]
*ELSE
*.        NO DESCRIBE. TRY TOC.
*CLEAR FOUND
*INCREMENT DUMMY TO [TOC] WHILE FOUND IS CLEAR
*IF COLUMN SEARCH FROM TOC,DUMMY,1,1 FOR [#1]
*IF [TOC,CARD,3,1] < +5
*IF [TOC,CARD,2,1] = [#2]
*SET FOUND TO CARD
*ELSE
*IF [#2] = 'NO' AND [TOC,CARD,2,1] = ''''
*SET FOUND TO CARD
*ELSE
*SET DUMMY TO CARD
*END
*END
*ELSE
*SET DUMMY TO CARD
*END
*ELSE
*SET FOUND TO -1
*END
*LOOP
*IF VALUE OF FOUND > 0
*SET THING TO [TOC,FOUND,3,1]+TOCNO-2
*IF VALUE OF THING < VALUE OF TOCNO
*SET THING TO [TOC,FOUND,3,2]+TOCNO1
*END
*PROCESS MAKESGS [#1] [#2] [PROCESSOR,THING,1,1] 0 0
*ELSE
*.        WELL, IT'S NOT DESCRIBED ANYWHERE. USE DEFAULT.
*PROCESS MAKESGS [#1] [#2] [LANGUAGE,1,1,1] 0 0
*END
*END
*END
*END
*END
*END
*EJECT
*.
*.        DOSEARCH  <NAME> <VERSION> <DO-SGS>
*.
*.        SEE IF ELEMENT ALREADY APPEARS IN A LIST.
*.
*DEFINE DOSEARCH
*CLEAR EXIT
*INCREMENT DUMMY TO [[#3]] WHILE EXIT IS CLEAR
*IF COLUMN SEARCH FROM [#3],DUMMY,1,1 FOR [#1]
*IF [[#3],CARD,1,2] = [#2]
*SET FOUND
*SET EXIT
*ELSE
*SET DUMMY TO CARD
*END
*ELSE
*SET EXIT
*END
*LOOP
*END
*EJECT
*.
*.        MAKESGS <ELT> <VER> <SUBTYPE> [<SGS-TYPE> <SGS-NUMBER> / 0 0]
*.
*.        WHERE THE LAST TWO ARGUMENTS TELL OF A MAP OR DESCRIBE OR LANGUAGE
*.        SGS GIVING OPTIONS AND NON-STANDARD OUTPUT NAME, PERHAPS.
*.        THIS PROCEDURE CREATES THE DOFIRST, DOPROC, DOLANG, AND DOMAP SGSSES.
*.
*DEFINE MAKESGS
*.        FIND PROPER PROCESSOR SGS AND CORRESPONDING STANDARD PROCESSOR SGS.
*IF COLUMN SEARCH FROM PROCESSOR,1,1,1 FOR [#3]
*SET INDEX TO CARD
*ELSE
#MSG,N MAKESGS ERROR: PROCESSOR [#3] DOES NOT EXIST!  (@ELT ASSUMED)
*SET INDEX TO +ELTNOF
*END
*IF [BACKREF,INDEX,1,1] = +MAPNO AND NOT [#4] = MAP AND [MAP] > 0
*SET INDEX TO +ELTNOF
*END
*SET INDEX2 TO [BACKREF,INDEX,1,1]
*IF VALUE OF INDEX2 = -1
*SET INDEX2 TO +ELTNO
*END
*CLEAR FFRST
*IF NOT [FIRST,1,1,1] = 'NO'
*INCREMENT IFRST TO [FIRST] WHILE FFRST IS CLEAR
*IF [FIRST,IFRST,1,1] = SUBTYPE
*IF [FIRST,IFRST,2,1] = [#3]
*CREATE SGS: DOFIRST [#1],[#2] [*INDEX],[*INDEX2] [#4],[#5]
*SET FFRST
*END
*ELSE
*IF [FIRST,IFRST,1,1] = ELEMENT
*IF [FIRST,IFRST,2,1] = [#1]
*IF [FIRST,IFRST,2] = 1
*IF [#2] = 'NO'
*CREATE SGS: DOFIRST [#1],[#2] [*INDEX],[*INDEX2] [#4],[#5]
*SET FFRST
*END
*ELSE
*IF [FIRST,IFRST,2,2] = [#2]
*CREATE SGS: DOFIRST [#1],[#2] [*INDEX],[*INDEX2] [#4],[#5]
*SET FFRST
*END
*END
*END
*ELSE
#MSG,N MAKESGS ERROR: IMPROPER 'FIRST' SGS.
*END
*END
*LOOP
*END
*IF NOT VALUE OF FFRST > 0
*IF +INDEX2=+PDPNO OR +INDEX2=+ASMPNO OR +INDEX2=+COBPNO OR +INDEX2=+FORPNO ;
   OR +INDEX2=+MASMPNO
*CREATE SGS: DOPROC [#1],[#2] [*INDEX],[*INDEX2] [#4],[#5]
*ELSE
*IF VALUE OF INDEX2 = VALUE OF MAPNO
*CREATE SGS: DOMAP [#1],[#2] [*INDEX],[*INDEX2] [#4],[#5]
*ELSE
*CREATE SGS: DOLANG [#1],[#2] [*INDEX],[*INDEX2] [#4],[#5]
*END
*END
*END
*END
*EJECT
*.
*.        FSCAN TAKES ONE ARGUMENT, P OR T, REPRESENTING PCF OR TCF ENTRIES.
*.        FOR EACH SGS BY THE GIVEN NAME, IT CREATES A 'DOIT' SGS.
*.        IT AVOIDS DUPLICATE DOIT ENTRIES.
*.
*DEFINE FSCAN
*INCREMENT I TO [[#1]]
*IF [[#1],I] = 1
*PROCESS QUEUE [[#1],I,1,1] 'NO' [#1] [*I]
*ELSE
*PROCESS QUEUE [[#1],I,1,1] [[#1],I,2,1] [#1] [*I]
*END
*LOOP
*END
*.
*.
*.        COPYNAME  <FROM> <TO>
*.
*.        TO SET UP DEFAULT VALUE FOR *SOME* OF THE FILES,
*.        THIS COPIES SOME SGS SUCH AS SI TO CREATE ANOTHER.
*.
*DEFINE COPYNAME
*IF [[#1]] > 0 AND [[#2]] = 0
*IF [[#1],1,1]>1
*CREATE SGS: [#2] [[#1],1,1,1],[[#1],1,1,2]
*ELSE
*CREATE SGS: [#2] [[#1],1,1,1]
*END
*END
*END
*.
*.
*.        COMPNAME  <SGS1> <SGS2>
*.
*.        COMPARES WHETHER THE FILE-NAMING SGSSES ARE THE SAME.
*.        SETS VALUE OF 'EQUAL' ACCORDINGLY.
*.
*DEFINE COMPNAME
*CLEAR EQUAL
*IF [[#1],1,1,1] = [[#2],1,1,1] AND [[#1],1,1] = [[#2],1,1]
*IF [[#1],1,1] = 1
*SET EQUAL
*ELSE
*IF [[#1],1,1,2] = [[#2],1,1,2]
*SET EQUAL
*END
*END
*END
*END
*EJECT
*.
*.        FILENAME  <SGS-NAME>
*.
*.        IN EDIT MODE, EDIT THE FILENAME OR QUALIFIER*FILENAME
*.        FROM THE SPECIFIED FILE SGS (SI, RO, A0, ETC.)
*.
*DEFINE FILENAME
[[#1],1,1,1]&
*IF [[#1],1,1] > 1
"[[#1],1,1,2]&
*END
*END
*.
*.
*.        ELTNAME   <SGS-NAME> <SGS-NUMBER>
*.
*.        IN EDIT MODE, EDIT THE ELEMENT OR ELEMENT/VERSION
*.        FROM FIELD 1 OF THE SPECIFIED SGS.
*.
*DEFINE ELTNAME
[[#1],[#2],1,1]&
*IF NOT [[#1],[#2],1,2] = 'NO'
/[[#1],[#2],1,2]&
*END
*END
*EJECT
*.
*.        MAPCOR    <DO-NAME> <DO-NUMBER>
*.
*.        IF PROCESSING A 'MAP' ELEMENT, 'LEVEL' SGS MAY SPECIFY
*.        'EQU' DIRECTIVES TO BE INSERTED IN THE ELEMENT.
*.
*DEFINE MAPCOR
*IF [#1] = DOMAP AND [LEVEL] > 0
*IF [LEVEL,1] > 3
*INCREMENT CORA FROM 3 TO [LEVEL,1] BY 2
*IF [LEVEL,1,CORA,1] = [[#1],[#2],1,1]
*IF [[#1],[#2],1,2] = 'NO'
*SET CORE TO 1
*ELSE
*SET CORE TO 2
*END
*IF [LEVEL,1,CORA] = [*CORE]
*IF [*CORE] = 2 AND [LEVEL,1,CORA,2] = [[#1],[#2],1,2] OR [*CORE] = 1
*SET CORC TO [*CORA]+1
[LEVEL,1,CORC,1]
*INCREMENT CORB TO [LEVEL,1,1]
EQU  [LEVEL,1,2,CORB]/[LEVEL,1,1,CORB]
*LOOP
*END
*END
*END
*LOOP
*END
*END
*END
*EJECT
*.
*.        GET       <DO-NAME>
*.
*.        FIND ALL SGSSES OF TYPE [#1] (DOFIRST, DOPROC, DOLANG, DOMAP)
*.        AND PUT OUT SUITABLE CONTROL CARDS, DELETING THE SGS
*.        AFTERWARDS. IF THERE IS AN ALPHA SGS, PUT THINGS OUT ALPHABETICALLY.
*.
*DEFINE GET
*INCREMENT DUMMY TO [[#1]]
*CLEAR QUITI
*SET D TO 1
*INCREMENT I TO [[#1]] WHILE QUITI IS CLEAR
*IF [ALPHA] > 0
*IF [[#1],I,1,1] < [[#1],D,1,1]
*SET D TO I
*ELSE
*IF [[#1],I,1,1] = [[#1],D,1,1]
*IF NOT [[#1],D,1,2] = 'NO'
*IF [[#1],I,1,2] = 'NO' OR [[#1],I,1,2] < [[#1],D,1,2]
*SET D TO I
*END
*END
*END
*END
*ELSE
*SET QUITI
*END
*LOOP I
*IF [MERGE] = 0
*EDIT ON &
*IF NOT [PROCESSOR,[[#1],D,2,1],1,1] = DOC
*.
*.        EDIT A HEADING FOR NON-DOC ELEMENTS
*.
#HDG,P &
*IF [PROGRAM]
*INCREMENT W TO [PROGRAM,1]
 &
*INCREMENT Z TO [PROGRAM,1,W]
[PROGRAM,1,W,Z]&
*LOOP
*LOOP
*END
*IF [LEVEL]
 LEVEL &
*INCREMENT Z TO [LEVEL,1,1]
[LEVEL,1,1,Z]&
*IF [*Z]=1
R&
*ELSE
*IF [*Z] < [LEVEL,1,1]
-&
*END
*END
*LOOP
*END
                     &
*PROCESS ELTNAME [#1] [*D]
*EDIT OFF
*ELSE
*.
*.        FOR DOC ELEMENTS, TURN OFF HEADING
*.
#HDG,N
*END
*EDIT ON &
#&
*SET DOIT21 TO [[#1],D,2,1]
*SET DOIT22 TO [[#1],D,2,2]
*IF [PROCESSOR,DOIT21] > 3
*.        FILENAME GIVEN
[PROCESSOR,DOIT21,4,1]&
*IF [PROCESSOR,DOIT21,4] > 1
*.        QUALIFIER ALSO
"[PROCESSOR,DOIT21,4,2]&
*END
.&
*END
*IF [PROCESSOR,DOIT21] > 2
*.        EXPLICIT PROCESSOR NAME
[PROCESSOR,DOIT21,3,1]&
*IF [PROCESSOR,DOIT21,3] > 1
*.        VERSION GIVEN.
/[PROCESSOR,DOIT21,3,2]&
*END
*ELSE
*.        NO EXPLICIT PROCESSOR NAME.
[PROCESSOR,DOIT22,1,1]&
*END
*.        END OF PROCESSOR NAME!
*CLEAR COMMA
*CLEAR GOTOPTS
*IF [[#1],D,3,1] = MAP OR [[#1],D,3,1] = DESCRIBE ;
   OR [[#1],D,3,1] = PROCESS
*PROCESS USEROPTS [[#1],D,3,1] [[#1],D,3,2]
*END
*IF GOTOPTS IS CLEAR
*.        NOT FROM MAP OR DESCRIBE. DEFAULT OPTIONS.
*IF [PROCESSOR,DOIT21,1,2]
*IF NOT [PROCESSOR,DOIT21,1,2] = ''''
*PROCESS OPTIONS [PROCESSOR,DOIT21,1,2]
*END
*ELSE
*IF [PROCESSOR,DOIT22,1,2]
*IF NOT [PROCESSOR,DOIT22,1,2] = ''''
*PROCESS OPTIONS [PROCESSOR,DOIT22,1,2]
*END
*END
*END
*END
*IF UOPT IS SET
*PROCESS OPTIONS U
*END
*IF [[#1],D,3,1] = MAP AND NOT [LIST,1,1,1] = NONE
*SET LISTIT
*END
*CLEAR LISTIT
*IF [LIST,1,1,1] = ALL
*SET LISTIT
*ELSE
*IF [LIST,1,1,1] = PCF
*PROCESS LOOKFOR P [#1]
*SET LISTIT TO GOTCF
*ELSE
*IF [LIST,1,1,1] = TCF
*PROCESS LOOKFOR T [#1]
*SET LISTIT TO GOTCF
*ELSE
*IF [LIST,1,1,1] = BOTH
*PROCESS LOOKFOR P [#1]
*SET LISTIT TO GOTCF
*IF LISTIT IS SET
*PROCESS LOOKFOR T [#1]
*SET LISTIT TO GOTCF
*END
*ELSE
*IF [LIST,1,1,1] = EITHER
*PROCESS LOOKFOR P [#1]
*SET LISTIT TO GOTCF
*IF LISTIT IS CLEAR
*PROCESS LOOKFOR T [#1]
*SET LISTIT TO GOTCF
*END
*END
*END
*END
*END
*END
*.        NOW LISTIT TELLS WHETHER TO LIST.
*.        SET TYPE TO PROPER SUBFIELD OF PROCESSOR SGS:
*.        3 = NO LISTING, 4 = SHORT LISTING, 5 = LONG LISTING.
*SET TYPE TO 3                        . ASSUME NO LISTING
*IF LISTIT IS SET
*SET TYPE TO 4                          . IF LISTING, ASSUME SHORT
*IF [LIST,1,1]>1
*IF [LIST,1,1,2]=LONG
*SET TYPE TO 5                          . SET FOR LONG
*ELSE
*IF [LIST,1,1,2]=NOT
*SET TYPE TO 3                          . SET FOR NONE
*END
*END
*END
*END
*IF [PROCESSOR,DOIT21,1,TYPE]
*IF NOT [PROCESSOR,DOIT21,1,TYPE] = ''''
*PROCESS OPTIONS [PROCESSOR,DOIT21,1,TYPE]
*END
*ELSE
*IF [PROCESSOR,DOIT22,1,TYPE]
*IF NOT [PROCESSOR,DOIT22,1,TYPE] = ''''
*PROCESS OPTIONS [PROCESSOR,DOIT22,1,TYPE]
*END
*END
*END
 &
*.        END OF OPTION FIELD!
*IF [PROCESSOR,DOIT21,2] > 1
*PROCESS SPECS [*D] [*DOIT21] [[#1],D,3,1] [#1]
*ELSE
*PROCESS SPECS [*D] [*DOIT22] [[#1],D,3,1] [#1]
*END
*EDIT OFF
*.        END OF PROCESSOR CARD
*ELSE
*.        MERGE SET: PUT OUT *ELTNAME
*EDIT ON &
"&
*PROCESS ELTNAME [#1] [*D]
*EDIT OFF
*END
*CLEAR FOUND
*IF [CORRECT] > 0
*CLEAR EXIT
*INCREMENT AA TO [CORRECT] WHILE EXIT IS CLEAR
*IF COLUMN SEARCH FROM CORRECT,AA,1,1 FOR [[#1],D,1,1]
*IF [CORRECT,CARD,1] > 1
*IF [CORRECT,CARD,1,2] = [[#1],D,1,2]
*SET FOUND
*SET EXIT
*ELSE
*SET AA TO CARD
*END
*ELSE
*IF [[#1],D,1,2] = 'NO'
*SET FOUND
*SET EXIT
*ELSE
*SET AA TO CARD
*END
*END
*ELSE
*SET EXIT
*END
*LOOP
*END
*IF FOUND IS SET
*EDIT ON
#ADD,E  &
*IF [CORRECT,CARD] > 3
[CORRECT,CARD,4,1]&
*IF [CORRECT,CARD,4] > 1
"[CORRECT,CARD,4,2]&
*END
.&
*END
[CORRECT,CARD,3,1]&
*IF [CORRECT,CARD,3] > 1
/[CORRECT,CARD,3,2]
*END
*ELSE
*IF [APPLY,1,1,1] = BOTH
*IF [[#1],D,1,2] = 'NO'
*IF [UPDATE] > 0
*IF NOT [[#1],D,1,1] HAS PERM CORRECTIONS
*CREATE PERM: [[#1],D,1,1]
*END
*CORRECT,PK [[#1],D,1,1]
*PROCESS MAPCOR [#1] [*D]
*END
*ELSE
*CORRECT [[#1],D,1,1]
*PROCESS MAPCOR [#1] [*D]
*END
*END
*ELSE
*IF [UPDATE] > 0
*IF NOT [[#1],D,1,1]/[[#1],D,1,2] HAS PERM CORRECTIONS
*CREATE PERM: [[#1],D,1,1]/[[#1],D,1,2]
*END
*CORRECT,PK [[#1],D,1,1]/[[#1],D,1,2]
*PROCESS MAPCOR [#1] [*D]
*END
*ELSE
*CORRECT [[#1],D,1,1]/[[#1],D,1,2]
*PROCESS MAPCOR [#1] [*D]
*END
*END
*END
*ELSE
*IF [APPLY,1,1,1] = PCF
*IF [[#1],D,1,2] = 'NO'
*CORRECT [[#1],D,1,1] PERM
*PROCESS MAPCOR [#1] [*D]
*END
*ELSE
*CORRECT [[#1],D,1,1]/[[#1],D,1,2] PERM
*PROCESS MAPCOR [#1] [*D]
*END
*END
*ELSE
*IF [APPLY,1,1,1] = TCF
*IF [[#1],D,1,2] = 'NO'
*CORRECT [[#1],D,1,1] TEMP
*PROCESS MAPCOR [#1] [*D]
*END
*ELSE
*CORRECT [[#1],D,1,1]/[[#1],D,1,2] TEMP
*PROCESS MAPCOR [#1] [*D]
*END
*END
*END
*END
*END
*END
*REMOVE SGS [#1],[*D]
*LOOP DUMMY
*END
*EJECT
*.
*.        OPTIONS <STRING>
*.
*.        ADDS SPECIFIED OPTIONS TO CONTROL STATEMENT.  PROVIDES
*.        COMMA IF NEEDED.
*.
*DEFINE OPTIONS
*IF NOT [#1] = 'NO'
*IF COMMA IS CLEAR
,&
*SET COMMA
*END
[#1]&
*END
*END
*.
*.
*.        USEROPTS <SGSNAME> <SGS-NUMBER>
*.
*.        ADDS OPTIONS GIVEN ON SPECIFIED MAP, PROCESS, OR DESCRIBE SGS.
*.
*DEFINE USEROPTS
*IF [[#1],[#2],2] > 1
*PROCESS OPTIONS [[#1],[#2],2,2]
*SET GOTOPTS
*END
*END
*EJECT
*.
*.        LOOKFOR <P OR T> <SGS-TYPE>
*.
*.        RETURNS WITH GOTCF SET IFF THE CURRENT ELEMENT [[#2],D,...]
*.        APPEARS IN THE NAMED CHANGE FILE.
*.
*DEFINE LOOKFOR
*CLEAR GOTCF
*INCREMENT I TO [[#1]] WHILE GOTCF IS CLEAR
*IF COLUMN SEARCH FROM [#1],1,1,1 FOR [[#2],D,1,1]
*IF [[#1],CARD] = 1
*IF [[#2],D,1,2] = 'NO'
*SET GOTCF TO CARD
*END
*ELSE
*IF [[#1],CARD,2,1] = [[#2],D,1,2]
*SET GOTCF TO CARD
*END
*END
*ELSE
*SET GOTCF TO -1
*END
*LOOP
*IF VALUE OF GOTCF < 0
*CLEAR GOTCF
*END
*END
*EJECT
*.
*.        SPECS     <DOIT-NUMBER> <PROCESSOR-NUMBER> <DESCRIBE OR MAP OR 0> <SGS
*.
*.        EDIT OUT THE SPEC FIELDS ON PROCESSOR CARD.
*.
*DEFINE SPECS
*CLEAR COMMA
*INCREMENT I FROM 2 TO [PROCESSOR,[#2],2]
*SET RPTNAM
*IF [PROCESSOR,[#2],2,I] = SO
*SET RPTNAM TO OKSO
*ELSE
*IF [PROCESSOR,[#2],2,I] = PO
*SET RPTNAM TO 1-UOPT
*END
*END
*IF RPTNAM IS SET
*INCREMENT I TO COMMA
,&
*LOOP
*CLEAR COMMA
*PROCESS FILENAME [PROCESSOR,[#2],2,I]
.&
*IF VALUE OF I = 3 AND NOT [#3] = 0
*SET SPECT TO [[#4],[#1],3,2]
*IF [[#3],SPECT] > 2
*CLEAR RPTNAM
[[#3],SPECT,3,1]&
*IF [[#3],SPECT,3] > 1
/[[#3],SPECT,3,2]&
*END
*END
*END
*IF RPTNAM IS SET
*PROCESS ELTNAME [#4] [#1]
*END
*END
*SET COMMA TO COMMA+1
*LOOP
*END
*EJECT
*.
*.        INITIALIZATION
*.
*CREATE SGS: DOLIST DOFIRST DOLANG DOPROC DOMAP
*.
*. THE 'NUMS' SGSSES ARE USED TO CREATE VARIABLES WHICH TELL
*. MAINTSKEL WHERE CERTAIN STANDARD PROCESSOR SUBTYPES ARE
*. LOCATED
*.
*CREATE SGS: NUMS  PDP,PDPNO
*CREATE SGS: NUMS  ASMP,ASMPNO
*CREATE SGS: NUMS  COBP,COBPNO
*CREATE SGS: NUMS  FORP,FORPNO
*CREATE SGS: NUMS  MASMP,MASMPNO
*CREATE SGS: NUMS  ELT,ELTNO
*CREATE SGS: NUMS  MAP,MAPNO
*.
*. THE FOLLOWING 'PROCESSOR' SGS CARDS MUST BE ARRANGED IN ORDER
*. OF ELEMENT SUBTYPE FOR 'SELECT TOC' AND OTHER FEATURES TO
*. OPERATE CORRECTLY.
*.
*CREATE SGS: PROCESSOR PDP,'NO',N,LJ,LJ     PDP,PI,PO      PDP    . 2
*CREATE SGS: PROCESSOR MASMP,'NO',N,SEV,LEV MASMP,PI,PO    MASM   . 2
*CREATE SGS: PROCESSOR ASMP,'NO',N,LJ,LJ    ASMP,PI,PO     PDP    . 2
*SET TOCNO TO [PROCESSOR]
*CREATE SGS: PROCESSOR COBP,C,N,LJ,LJ       COBP,PI,PO     PDP    . 3
*CREATE SGS: PROCESSOR FORP,F,N,LJ,LJ       FORP,PI,PO     PDP    . 4
*CREATE SGS: PROCESSOR SYM,'NO',N,LJ,LJ     SYM,SI,SO      ELT    . 1-00
*SET TOCNO1 TO [PROCESSOR]
*CREATE SGS: PROCESSOR ELT,'NO',N,LJ,LJ     ELT,SI,SO      ELT    . 1-01
*IF [MASM]
*CREATE SGS: PROCESSOR MASM,Q,EQ,SEQV,LEQV  MASM,SI,RO,SO  MASM   . 1-02
*ELSE
*CREATE SGS: PROCESSOR ASM,'NO',E,SJ,LJ     ASM,SI,RO,SO   ASM    . 1-02
*END
*CREATE SGS: PROCESSOR COB,'NO',N,S,L       COB,SI,RO,SO   COB    . 1-03
*CREATE SGS: PROCESSOR FOR,'NO',N,S,L       FOR,SI,RO,SO   FOR    . 1-04
*CREATE SGS: PROCESSOR ALG,'NO',N,S,L       ALG,SI,RO,SO   ALG    . 1-05
*CREATE SGS: PROCESSOR MAP,'NO','NO',SJ,LJ  MAP,SI,AO,SO   MAP    . 1-06
*CREATE SGS: PROCESSOR DOC,'NO',NT,SRD,SRD  DOC,SI,SO      DOC    . 1-07
*CREATE SGS: PROCESSOR SEC,'NO',N,LJ,LJ     SEC,SI,SO      ELT    . 1-10
*CREATE SGS: PROCESSOR SSG,'NO',N,LJ,LJ     SSG,SI,SO      ELT    . 1-11
*CREATE SGS: PROCESSOR APL,'NO',N,LJ,LJ     APL,SI,SO      ELT    . 1-12
*CREATE SGS: PROCESSOR BAS,'NO',N,LJ,LJ     BAS,SI,SO      ELT    . 1-13
*CREATE SGS: PROCESSOR LSP,'NO',N,LJ,LJ     LSP,SI,SO      ELT    . 1-14
*CREATE SGS: PROCESSOR PLS,'NO',N,SE,LE     PLS,SI,RO,SO   PLUS   . 1-15
*CREATE SGS: PROCESSOR PL1,'NO',N,S,L       PL1,SI,RO,SO   PL1    . 1-16
*.
*IF [APPLY] = 0
*CREATE SGS: APPLY BOTH
*END
*IF [SELECT] = 0
*CREATE SGS: SELECT EITHER
*END
*IF [SELECT,1,1,1] = TOC AND [TOC] = 0
#MSG,N    'SELECT TOC' REQUIRES '<FILE>./TOC' IN SPEC 2 OF @SSG CALL.
#!!!
*CREATE SGS: TOC DUMMY DUMMY 1,1
*END
*IF [LIST] = 0
*CREATE SGS: LIST ALL,SHORT
*END
*IF [LANGUAGE] = 0
*CREATE SGS: LANGUAGE ASM
*END
*IF NOT [FIRST]
*CREATE SGS: FIRST SUBTYPE DOC
*END
*.
*EJECT
*.
*.        SET UP BACKREF SGSSES TO FIND STANDARD PROCESSORS.
*INCREMENT I TO [PROCESSOR]
*CLEAR QUITI
*CLEAR SAVE
*IF [PROCESSOR,I] > 1
*SET I1 TO 2
*ELSE
*SET I1 TO 1
*END
*INCREMENT J TO [PROCESSOR] WHILE QUITI IS CLEAR
*IF COLUMN SEARCH FROM PROCESSOR,J,1,1 FOR [PROCESSOR,I,I1,1]
*SET SAVE TO CARD
*SET J TO CARD
*ELSE
*SET QUITI
*END
*LOOP
*IF SAVE IS CLEAR
*SET SAVE TO -1
*ELSE
*IF [PROCESSOR,SAVE] = 1
*SET SAVE TO -1
*END
*END
*CREATE SGS: BACKREF [*SAVE]
*IF [NUMS] AND NOT VALUE OF SAVE = -1
*IF COLUMN SEARCH FROM NUMS,1,1,1 FOR [PROCESSOR,SAVE,2,1]
*SET [NUMS,CARD,1,2] TO SAVE
*REMOVE SGS NUMS,CARD
*END
*END
*LOOP
*IF [NUMS]
#MSG,N INTERNAL ERROR - NUMS = [NUMS]
*END
*IF COLUMN SEARCH FROM PROCESSOR,1,1,1 FOR ELT
*SET ELTNOF TO CARD
*ELSE
#MSG,N INTERNAL ERROR - PROCESSOR ELT SGS NOT FOUND
*END
*EJECT
*.
*IF [MERGE] = 0
*.
*.        SET UP FILES.
*IF [SI] = 0
*CREATE SGS: SI TPF$
*END
*.
*PROCESS COPYNAME SI RI
*PROCESS COPYNAME SI PI
*.
*CLEAR UOPT
*IF [SO] > 0
*IF [SO,1,1,1] = 'U'
*SET UOPT
*END
*END
*IF UOPT IS SET OR [SO] = 0
*CLEAR OKSO
*ELSE
*SET OKSO
*END
*.
*IF [RO] = 0
*PROCESS COPYNAME SO PO
*END
*PROCESS COPYNAME RO PO
*IF [PO] > 0
*IF [PO,1,1,1] = 'TEMP'
*REMOVE SGS PO,1
*END
*END
*IF [PO] = 0
#ASG,T PROCFILE$.
*CREATE SGS: PO PROCFILE$
*END
*.
*IF OKSO IS SET
*PROCESS COPYNAME SO RO
*ELSE
*PROCESS COPYNAME RI RO
*END
*PROCESS COPYNAME RO AO
*EJECT
*.
*.        MOVE ELEMENTS AS NECESSARY.
*CLEAR EQUAL
*PROCESS COMPNAME RI RO
*IF EQUAL IS CLEAR
*EDIT ON
#COPY,RC  &
*PROCESS FILENAME RI
.,&
*PROCESS FILENAME RO
.&
*EDIT OFF
*END
*PROCESS COMPNAME PI PO
*IF EQUAL IS CLEAR AND NOT [PO,1,1,1] = 'U'
*IF [TOC]
*INCREMENT A TO [TOC]
*IF [TOC,A,3,1] = 2
*EDIT ON
#COPY,SC  &
*PROCESS FILENAME PI
.[TOC,A,1,1]/[TOC,1,2,1],&
*PROCESS FILENAME PO
.&
*EDIT OFF
*END
*LOOP
*ELSE
*IF [DESCRIBE]
*INCREMENT A TO [DESCRIBE]
*IF [DESCRIBE,A,2,1]=ASMP OR [DESCRIBE,A,2,1]=FORP OR [DESCRIBE,A,2,1]=COBP ;
 OR [DESCRIBE,A,2,1]=MASMP OR [DESCRIBE,A,2,1]=PDP
*EDIT ON
#COPY,S   &
*PROCESS FILENAME PI
*IF [DESCRIBE,A]>2
*SET B TO 3
*ELSE
*SET B TO 1
*END
.[DESCRIBE,A,B,1]&
*IF [DESCRIBE,A,B]>1
/[DESCRIBE,A,B,2]&
*END
,&
*PROCESS FILENAME PO
.&
*EDIT OFF
*END
*LOOP
*ELSE
#MSG      DON'T KNOW WHAT PROCS TO COPY!
#!!!
*END
*END
*END
*EDIT ON &
#USE ASM$PF,&
*IF [PO,1,1,1] = 'U'
*PROCESS FILENAME PI
*ELSE
*PROCESS FILENAME PO
*END
*EDIT OFF
*EDIT ON &
#USE MASM$PF,&
*IF [PO,1,1,1] = 'U'
*PROCESS FILENAME PI
*ELSE
*PROCESS FILENAME PO
*END
*EDIT OFF
*EDIT ON &
#USE COB$PF,&
*IF [PO,1,1,1] = 'U'
*PROCESS FILENAME PI
*ELSE
*PROCESS FILENAME PO
*END
*EDIT OFF
*EDIT ON &
#USE FOR$PF,&
*IF [PO,1,1,1] = 'U'
*PROCESS FILENAME PI
*ELSE
*PROCESS FILENAME PO
*END
*EDIT OFF
*.        END SETUP FOR NON-MERGE CASE.
*ELSE
*.        SET UP CHANGE-FILE MERGING.
*EDIT ON &
#ELT,IQ &
*IF [MERGE,1] > 1
[MERGE,1,2,1]&
*IF [MERGE,1,2] > 1
"[MERGE,1,2,2]&
*END
.&
*END
[MERGE,1,1,1]&
*IF [MERGE,1,1] > 1
/[MERGE,1,1,2]&
*END
*EDIT OFF
*END
*EJECT
*.
*.
*.
*.        PASS 0
*INCREMENT IMAP TO [MAP]
*IF NOT [MAP,IMAP,1,1] = 'NO'
*IF [MAP,IMAP,1]>1
*PROCESS QUEUE [MAP,IMAP,1,1] [MAP,IMAP,1,2] MAP [*IMAP]
*ELSE
*PROCESS QUEUE [MAP,IMAP,1,1] 'NO' MAP [*IMAP]
*END
*END
*LOOP
*INCREMENT IPRO TO [PROCESS]
*IF [PROCESS,IPRO,1] > 1
*PROCESS QUEUE [PROCESS,IPRO,1,1] [PROCESS,IPRO,1,2] PROCESS [*IPRO]
*ELSE
*PROCESS QUEUE [PROCESS,IPRO,1,1] 'NO' PROCESS [*IPRO]
*END
*LOOP
*IF [SELECT,1,1,1] = TCF OR [SELECT,1,1,1] = EITHER
*PROCESS FSCAN T
*END
*IF [SELECT,1,1,1] = PCF OR [SELECT,1,1,1] = EITHER
*PROCESS FSCAN P
*END
*IF [SELECT,1,1,1] = DESCRIBE
*INCREMENT DESNO TO [DESCRIBE]
*IF [DESCRIBE,DESNO,1] > 1
*PROCESS QUEUE [DESCRIBE,DESNO,1,1] [DESCRIBE,DESNO,1,2] DESCRIBE [*DESNO]
*ELSE
*PROCESS QUEUE [DESCRIBE,DESNO,1,1] 'NO' DESCRIBE [*DESNO]
*END
*LOOP
*END
*IF [SELECT,1,1,1] = TOC
*INCREMENT TOCNO TO [TOC]
*IF [TOC,TOCNO,3,1] < 5
*IF [TOC,TOCNO,2,1] = '' ''
*PROCESS QUEUE [TOC,TOCNO,1,1] 'NO' TOC [*TOCNO]
*ELSE
*PROCESS QUEUE [TOC,TOCNO,1,1] [TOC,TOCNO,2,1] TOC [*TOCNO]
*END
*END
*LOOP
*END
*IF [SELECT,1,1,1] = BOTH
*INCREMENT PNO TO [P]
*CLEAR FOUND
*INCREMENT TNO TO [T] WHILE FOUND IS CLEAR
*IF COLUMN SEARCH FROM T,TNO,1,1 FOR [P,PNO,1,1]
*IF NOT [T,CARD] = [P,PNO]
*SET TNO TO CARD
*ELSE
*IF [T,CARD] = 1
*SET FOUND TO CARD
*ELSE
*IF [T,CARD,2,1] = [P,PNO,2,1]
*SET FOUND TO CARD
*ELSE
*SET TNO TO CARD
*END
*END
*END
*ELSE
*SET FOUND TO -1
*END
*LOOP
*IF VALUE OF FOUND > 0
*IF [P,PNO] > 1
*PROCESS QUEUE [P,PNO,1,1] [P,PNO,2,1] P [*PNO]
*ELSE
*PROCESS QUEUE [P,PNO,1,1] 'NO' P [*PNO]
*END
*END
*LOOP
*END
*.
*.        END OF SELECT ! !
*.
*.
*EJECT
*.
*.        BEGIN PASS 1: PROCS.
*.
*PROCESS GET DOFIRST
*PROCESS GET DOPROC
*PROCESS GET DOLANG
*IF [MERGE] = 0 AND [DOMAP] > 0
*EDIT ON &
#PREP &
*PROCESS FILENAME RO
.
*END
*PROCESS GET DOMAP
*IF [DOPROC] > 0 OR [DOLANG] > 0 OR [DOMAP] > 0 OR [DOFIRST] > 0
#MSG,N INTERNAL ERROR:[DOPROC] DOPROCS, [DOLANG] DOLANG, ;
   [DOMAP] DOMAPS, [DOFIRST] DOFIRSTS
*END
#HDG,N