*COMDECK  PFCOM              PERMANENT FILE MACROS. 
 PFCOM    CTEXT  PERMANENT FILE MACROS. 
  
  
***              THE PERMANENT FILE MACROS PROVIDE THE USER WITH
*         PREDEFINED CALLS FOR SYSTEM REQUESTS INVOLVING PERMANENT
*         FILE DIRECTORY ENTRIES, AND FOR GENERATING FILE AND GROUP 
*         DEFINITION BLOCKS REFERENCED BY SUCH REQUESTS.
* 
* 
*         THESE MACROS USE INTERNAL SYMBOLS, MACRO NAMES, AND 
*         MICRO NAMES OF THE FORM *'?PFM#XX* WHERE *XX* IS ANY
*         TWO CHARACTERS.  SUCH NAMES SHOULD THEREFORE BE 
*         AVOIDED BY THE USER.
* 
*         ALL NUMERIC CONSTANTS GREATER THAN 7 IN THESE MACROS HAVE 
*         AN EXPLICIT RADIX, SO THE *BASE* MODE IS IMMATERIAL.
*         HOWEVER, THE *CODE* MODE MUST BE DISPLAY CODE (D) WHEN
*         THE MACROS ARE CALLED.  THIS COMMON DECK CONTAINS NO
*         UNLABELED *ELSE* OR *ENDIF* STATEMENTS, SO IT CAN BE
*         ASSEMBLED CONDITIONALLY.
* 
* 
*         M. W. MORRON.      69/03/01.
*         R. C. SIVERTSON.   70/11/15.
*         R. H. GOODELL.     71/04/29.
 EXTERNAL SPACE  4,20 
***       EXTERNAL MACROS.
* 
* 
*         THESE ARE THE MACROS CALLED BY THE USER.  ALL OF THEM 
*         EXCEPT *FDB* AND *GDB* HAVE THE SAME FORMAT SO IT IS
*         GIVEN ONLY ONCE HERE. 
* 
* 
*         MACNAME  ADDR,OPTIONS 
* 
*         ENTRY  *MACNAME* = NAME OF MACRO. 
*                *ADDR*    = ADDRESS OF FIFTH WORD OF FDB OR GDB. 
*                *OPTIONS* = ANY, ALL, OR NONE OF THE FOLLOWING,
*                                  IN ANY ORDER --
*                      NR    DO NOT ISSUE SYSTEM REQUEST WITH RECALL. 
*                      RC    RETURN STATUS CODE IN (ADDR) BITS 17-09. 
*                      RT    INHIBIT QUEUING, AND RETURN STATUS CODE. 
*         EXIT   REQUEST PROCESSED. 
*         USES   A1, A6, X1, X6.
*         CALLS  SYS=.
 ALTER    SPACE  4
***       ALTER - RESET END OF INFORMATION TO CURRENT POSITION. 
  
  
          PURGMAC ALTER 
  
 ALTER    MACRO  A,X,Y,Z
  '?PFM#FN A,X,Y,Z,PFE,34 
  ENDM
 ATTACH   SPACE  4
***       ATTACH - ATTACH PERMANENT FILE TO CONTROL POINT.
  
  
          PURGMAC ATTACH
  
 ATTACH   MACRO  A,X,Y,Z
  '?PFM#FN A,X,Y,Z,PFA,10 
  ENDM
 GETPF    SPACE  4
***       GETPF  - GETPF  PERMANENT FILE TO CONTROL POINT.
  
  
          PURGMAC GETPF 
  
 GETPF    MACRO  A,X,Y,Z
  '?PFM#FN A,X,Y,Z,GPF,10 
  ENDM
 SAVEPF   SPACE  4
***       SAVEPF  - MAKE A LOCAL FILE PERMANENT.
  
  
          PURGMAC SAVEPF
  
 SAVEPF   MACRO  A,X,Y,Z
  '?PFM#FN A,X,Y,Z,SPF,20 
  ENDM
 ATTACHG  SPACE  4
***       ATTACHG - ATTACH PERMANENT FILE GROUP.
  
  
          PURGMAC ATTACHG 
  
 ATTACHG  MACRO  A,X,Y,Z
  '?PFM#FN A,X,Y,Z,PFA,14 
  ENDM
 CATALOG  SPACE  4
***       CATALOG - MAKE A LOCAL FILE PERMANENT.
  
  
          PURGMAC CATALOG 
  
 CATALOG  MACRO  A,X,Y,Z
  '?PFM#FN A,X,Y,Z,PFC,20 
  ENDM
 EXTEND   SPACE  4
***       EXTEND - PERMANIZE DATA WRITTEN AT END OF INFORMATION.
  
  
          PURGMAC EXTEND
  
 EXTEND   MACRO  A,X,Y,Z
  '?PFM#FN A,X,Y,Z,PFE,30 
  ENDM
 FDB      SPACE  4,40 
***       FDB - GENERATE FILE DEFINITION BLOCK. 
* 
* 
* ADDR    FDB    LFN,PFN,OPTIONS
* 
*         ENTRY  *ADDR* = LOCATION SYMBOL FOR FIFTH WORD OF FDB.
*                *LFN*  = LOCAL FILE NAME (UP TO 7 CHARACTERS). 
*                *PFN*  = PERMANENT FILE NAME (UP TO 40 CHARACTERS).
*                *OPTIONS* = LIST OF PARAMETERS OF THE FORM *KW=VALUE*, 
*                            SEPARATED BY COMMAS, IN ANY ORDER.  ALLOWED
*                            KEYWORDS *KW* ARE AS FOLLOWS --
*                               AC     ACCOUNT. 
*                               CN     CONTROL PASSWORD.
*                               CY     CYCLE NUMBER.
*                               EC     ECS BUFFER SIZE. 
*                               EX     EXTEND PASSWORD. 
*                               FO     FILE ORGANIZATION. 
*                               ID     OWNER NAME.
*                               LC     USE LOWEST CYCLE.
*                               MD     MODIFY PASSWORD. 
*                               MR     MULTI-READ ACCESS. 
*                               PF     FERMANENT PILE.
*                               PP     PRIVACY PROCEDURE PARAMETER (FOR 
*                                          PERVERSELY PARANOID PERSONS).
*                               PS     POSITION AS SET BY *SETP* REQUEST
*                               PW     PASSWORD LIST (UP TO 5). 
*                               RD     READ PASSWORD. 
*                               RN     AUTOMATIC RENAME (IGNORED).
*                               RP     RETENTION PERIOD (DAYS). 
*                               RW     MULTI-READ WITH 1 REWRITE ACCESS.
*                               SD     SUB-DIRECTORY (IGNORED). 
*                               SN     SETNAME
*                               ST     STRUCTURE (FOR 76 COMPATIBILITY).
*                               UV     UNIVERSAL PASSWORD 
*                               XR     NON-READ PASSWORD. 
*         EXIT   FILE DEFINITION BLOCK GENERATED. 
*         CALLS  NONE.
  
  
          PURGMAC FDB 
  
          MACRO  FDB,ADDR,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14
,,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30 
  '?PFM#DB 0,ADDR,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16
,,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30 
  ENDM
 GDB      SPACE  4,11 
***       GDB - GENERATE GROUP DEFINITION BLOCK.
* 
* 
* ADDR    GDB    LFN,PFN,OPTIONS
* 
*         ENTRY  SAME AS *FDB* MACRO. 
*         EXIT   GROUP DEFINITION BLOCK GENERATED.
*         CALLS  NONE.
  
  
          PURGMAC GDB 
  
          MACRO  GDB,ADDR,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14
,,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30 
  '?PFM#DB 7777B,ADDR,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15
,,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30 
  ENDM
 GROUP    SPACE  4
***       GROUP - CREATE PERMANENT FILE GROUP.
  
  
          PURGMAC GROUP 
  
 GROUP    MACRO  A,X,Y,Z
  '?PFM#FN A,X,Y,Z,PFG,70 
  ENDM
 PERM     SPACE  4
***       PERM - GET STATUS (PERMISSIONS AND PERMANENCE) OF A FILE. 
  
  
          PURGMAC PERM
  
 PERM     MACRO  A,X,Y,Z
  '?PFM#FN A,X,Y,Z,PRM,60 
  ENDM
 PURGE    SPACE  4
***       PURGE - DELETE PERMANENT FILE DIRECTORY ENTRY.
  
  
          PURGMAC PURGE 
  
 PURGE    MACRO  A,X,Y,Z
  '?PFM#FN A,X,Y,Z,PFP,40 
  ENDM
 PURGEG   SPACE  4
***       PURGEG - PURGE PERMANENT FILE GROUP.
  
  
          PURGMAC PURGEG
  
 PURGEG   MACRO  A,X,Y,Z
  '?PFM#FN A,X,Y,Z,PFP,44 
  ENDM
 RENAME   SPACE  4
***       RENAME - CHANGE CONTENTS OF PERMANENT FILE DIRECTORY ENTRY. 
  
  
          PURGMAC RENAME
  
 RENAME   MACRO  A,X,Y,Z
  '?PFM#FN A,X,Y,Z,PFR,50 
  ENDM
 SETP     SPACE  4
***       SETP - STORE CURRENT POSITION OF PERMANENT FILE.
  
  
          PURGMAC SETP
  
 SETP     MACRO  A,X,Y,Z
  '?PFM#FN A,X,Y,Z,PFS,04 
  ENDM
 INTERNAL SPACE  4,8
**        INTERNAL MACROS.
* 
* 
*         THE FOLLOWING MACROS ARE CALLED BY OTHER PERMANENT FILE 
*         MACROS.  THEY ARE NOT INTENDED TO BE CALLED DIRECTLY
*         BY THE USER.
 '?PFM#DB SPACE  4,12 
**        '?PFM#DB - GENERATE FILE/GROUP DEFINITION BLOCK.
* 
* 
*         '?PFM#DB  TYPE,ADDR,LFN,PFN,OPTIONS 
* 
*         ENTRY  *TYPE* = 0 FOR *FDB* OR 7777B FOR *GDB*. 
*                *ADDR* = LOCATION SYMBOL FOR FIFTH WORD OF FDB/GDB.
*                *LFN*  = LOCAL FILE NAME.
*                *PFN*  = PERMANENT FILE NAME.
*                *OPTIONS* = AS IN *FDB* MACRO. 
*         EXIT   FILE/GROUP DEFINITION BLOCK GENERATED. 
*         CALLS  NONE.
  
  
          PURGMAC '?PFM#DB
  
 '?PFM#DB MACRO  TYPE,ADDR,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P1
,4,P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30
*                            INITIALIZE FOR FILE NAME PROCESSING
'?PFM#PL MICRO 1,,$P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P1
,6,P17,P18,P19,P20,P21,P22,P23,P24,P25,P26,P27,P28,P29,P30
'?PFM#LF MICRO
'?PFM#PF MICRO
*                            EXTRACT LFN IF PRESENT 
'?PFM#CM MICRO 1,,,"'?PFM#PL",
'?PFM#CM MICCNT '?PFM#CM
'?PFM#EQ MICRO 1,,="'?PFM#PL"=
'?PFM#EQ MICCNT '?PFM#EQ
1 IFLT '?PFM#CM,'?PFM#EQ
  IFGT '?PFM#CM,7,1 
  ERR  ** LFN EXCEEDS 7 CHARS "'?PFM#CM" ** 
'?PFM#LF MICRO 1,7,$"'?PFM#CM"$ 
'?PFM#PF MICRO 1,40D,$"'?PFM#CM"$ 
'?PFM#PL MICRO '?PFM#CM+2,,$"'?PFM#PL"$ 
*                            EXTRACT PFN IF PRESENT 
'?PFM#CM MICRO 1,,,"'?PFM#PL",
'?PFM#CM MICCNT '?PFM#CM
'?PFM#EQ MICRO 1,,="'?PFM#PL"=
'?PFM#EQ MICCNT '?PFM#EQ
1 IFLT '?PFM#CM,'?PFM#EQ
  IFGT '?PFM#CM,40D,1 
  ERR  ** PFN EXCEEDS 40 CHARS "'?PFM#CM" **
'?PFM#PF MICRO 1,40D,$"'?PFM#CM"$ 
'?PFM#PL MICRO '?PFM#CM+2,,$"'?PFM#PL"$ 
1 ENDIF 
*                            GENERATE FIRST 6 WORDS OF FDB/GDB
  BSS 0 
'?PFM#CM SET *
  DATA L$"'?PFM#PF"$
  BSSZ '?PFM#CM+4-* 
 ADDR CON 0L"'?PFM#LF"
*                            INITIALIZE FOR KEYWORD PARAMETER PROCESSING
1 IFC NE,$"'?PFM#PL"$$
'?PFM#ST MICRO 1,,$ 
,          $
2 DUP 77
*                            EXTRACT NEXT KEYWORD AND VALUE 
'?PFM#EQ MICRO 1,,="'?PFM#PL"=
'?PFM#EQ MICCNT '?PFM#EQ
'?PFM#CM MICRO '?PFM#EQ+2,,,"'?PFM#PL", 
'?PFM#CM MICCNT '?PFM#CM
'?PFM#PL MICRO '?PFM#EQ+'?PFM#CM+3,,$"'?PFM#PL"$
3 IFNE '?PFM#CM 
  IFGT '?PFM#EQ,2,2 
  ERR  ** KEYWORD EXCEEDS 2 CHARS "'?PFM#EQ" ** 
3 SKIP
*                            LOOKUP KEYWORD 
  ECHO 5,Q1=(PP,RP,CY,TK,CN,MD,EX,RD,MR,SD,XR,ID,RN,AC,EC,PW,FO,PS,PF,LC
,,ST,RW,SN,RB,UV),Q2=(1,2,3,4,5,6,7,10,11,12,13,14,15,16,17,20,25,26,30,
,31,32,33,40,43,53),Q3=(1,0,0,1,1,1,1,1,0,1,1,1,0,1,1,1,1,0,1,0,1,0,1,0,
,1) 
  IFC EQ,$"'?PFM#EQ"$Q1$,4
*                            GET CODE AND CONVERSION INDICATOR
'?PFM#CN SET Q2_B 
'?PFM#EQ SET Q3 
  STOPDUP 
4 SKIP
  ERR  ** ILLEGAL KEYWORD "'?PFM#EQ" ** 
3 SKIP
4 ENDIF 
*                            CHECK FOR DUPLICATE KEYWORD
'?PFM#LF MICRO '?PFM#CN,1,$"'?PFM#ST"$
  IFC EQ,$"'?PFM#LF"$1$,2 
  ERR  ** DUPLICATE KEYWORD "'?PFM#EQ" ** 
3 SKIP
'?PFM#LF MICRO 1,'?PFM#CN-1,$"'?PFM#ST"$
'?PFM#ST MICRO '?PFM#CN+1,,$"'?PFM#ST"$ 
'?PFM#ST MICRO 1,,$"'?PFM#LF"1"'?PFM#ST"$ 
*                            GENERATE PARAMETER WORD
  IFEQ '?PFM#EQ,,2
  VFD 54D/"'?PFM#CM",6/'?PFM#CN 
3 SKIP
  IFGT '?PFM#CM,9D,2
  ERR  ** PARAMETER GREATER THAN 9 CHARS "'?PFM#CM" **
'?PFM#CM MICRO 1,9D,$"'?PFM#CM"$
  IFNE '?PFM#CN,40B,2 
  VFD 54D/0R"'?PFM#CM",6/'?PFM#CN 
  SKIP 1
  VFD 54D/0L"'?PFM#CM",6/'?PFM#CN 
3 IFEQ '?PFM#CN,20B 
*                            PROCESS PASSWORD LIST FOLLOWING *PW* 
4 DUP 77
'?PFM#CM MICRO 1,,,"'?PFM#PL",
'?PFM#CM MICCNT '?PFM#CM
  IFNE '?PFM#CM,,3
'?PFM#EQ MICRO 1,,="'?PFM#PL"=
'?PFM#EQ MICCNT '?PFM#EQ
  IFLT '?PFM#EQ,'?PFM#CM,2
4 STOPDUP 
4 SKIP
'?PFM#PL MICRO '?PFM#CM+2,,$"'?PFM#PL"$ 
  IFGT '?PFM#CM,9D,2
  ERR  ** PARAMETER GREATER THAN 9 CHARS "'?PFM#CM" **
'?PFM#CM MICRO 1,9D,$"'?PFM#CM"$
'?PFM#CN SET '?PFM#CN+1 
  VFD 54D/0R"'?PFM#CM",6/'?PFM#CN 
4 ENDD
4 ENDIF 
  IFGE '?PFM#CN,25B,1 
  ERR  ** KEYWORD HAS TOO MANY PARAMETERS **
3 ENDIF 
*                            LOOP TO END OF KEYWORD PARAMETERS
  IFC EQ,$"'?PFM#PL"$$,1
2 STOPDUP 
2 ENDD
1 ENDIF 
*                            GENERATE LAST WORD OF FDB/GDB
  CON TYPE
  ENDM
 '?PFM#FN SPACE  4,16 
**        '?PFM#FN - PROCESS PERMANENT FILE SYSTEM REQUEST. 
* 
* 
*         '?PFM#FN  ADDR,X,Y,Z,PFX,FC 
* 
*         ENTRY  *ADDR* = ADDRESS OF FIFTH WORD OF FDB/GDB. 
*                *X*, *Y*, *Z* = ANY OF THE FOLLOWING, IN ANY ORDER - 
*                                  NR     NO AUTO RECALL. 
*                                  RC     RETURN STATUS CODE. 
*                                  RT     REAL TIME (NO QUEUING). 
*                *PFX*  = SYSTEM REQUEST NAME.
*                *FC*   = FUNCTION CODE (OCTAL).
*         EXIT   REQUEST PROCESSED. 
*         USES   A1, A6, X1, X6.
*         CALLS  SYS=.
  
  
          PURGMAC '?PFM#FN
  
'?PFM#FN  MACRO  A,K1,K2,K3,PFX,FC
*                            PROCESS OPTIONS. 
'?PFM#EQ SET 0
'?PFM#CM SET 1
  ECHO 4,P=(K1,K2,K3) 
  ECHO 3,Q=(NR,RT,RC),R=(1,2,0),S=(EQ,CM,CM)
  IFC EQ,$P$Q$,2
  IFNE '?PFM#_S,2,1 
'?PFM#_S SET R
*                            STORE FUNCTION CODE INTO FDB/GDB 
  IF -DEF,A,3 
  IF -REG,A,2 
  SA1 =X_A
  SKIP 1
  R= A1,A 
  MX6 42D 
  BX6 X6*X1 
  SX1 FC_B+'?PFM#CM*100B+'?PFM#EQ*400B
  BX6 X6+X1 
  SA6 A1
*                            FORM PERMANENT FILE SYSTEM REQUEST 
  SX6 3R_PFX
  SX1 A1
  LX6 42D 
  BX6 X6+X1 
*                            SET AUTO RECALL BIT UNLESS *NR* SPECIFIED
  IFEQ '?PFM#EQ,,3
  MX1 1 
  LX1 41D 
  BX6 X6+X1 
*                            PROCESS SYSTEM REQUEST 
  RJ =XSYS= 
  ENDM
  
  
 PFCOM    ENDX
