.TITLE lib_parse - file-spec parsing routine .IDENT /1-001/ ; File : LIBTEMPLA.MAR ;************************************************************************* ; FACILITY: LIB, General Utility Library ; ; ABSTRACT: Returns RMS expanded file-spec (or portions therof) ; by using $PARSE system service. ; ; ENVIRONMENT: Runs at any access mode, AST reentrant. ; ; AUTHOR: Douglas Miller ; CREATED: 18-MAR-1985 ;......................................................................... ; MODIFIED ; ;************************************************************************* ; .PSECT _LIB_DATA PIC, USR, CON, REL, LCL, NOSHR, NOEXE, RD, WRT, LONG ; $NAMDEF ; nam__node = 0 ; nam__dev = 1 ; nam__dir = 2 ; nam__name = 3 ; nam__type = 4 ; nam__ver = 5 ; ; min_params = 2 ; _filespec= 1 _expanded = 2 _default = 3 _related = 4 _expanded_length = 5 _fields = 6 ; es: .BLKB nam$c_maxrss .ALIGN LONG fab: $FAB NAM=nam .ALIGN LONG nam: $NAM ESA=es, ESS=nam$c_maxrss, NOP=SYNCHK ; parse for syntax only .ALIGN LONG rlfnam: $NAM NOP=SYNCHK ; .PSECT _LIB_CODE PIC,USR,CON,REL,LCL,SHR,EXE,RD,NOWRT,LONG ; .ENTRY lib_parse ^M ; CMPL (AP), #_expanded BGEQ 99$ BRW invarg 99$: ; filespec: MOVL 4*_filespec(AP), R0 JSB G^LIB$ANALYZE_SDESC_R2 BLBS R0, 10$ BRW error 10$: MOVB R1, FAB+FAB$B_FNS MOVL R2, FAB+FAB$L_FNA ; default: CMPL (AP), #_default BLSS 99$ MOVL 4*_default(AP), R0 BEQL 99$ JSB G^LIB$ANALYZE_SDESC_R2 BLBS R0, 10$ BRW error 10$: MOVB R1, FAB+FAB$B_DNS MOVL R2, FAB+FAB$L_DNA 99$: ; related: CMPL (AP), #_related BLSS 99$ MOVL 4*_related(AP), R0 BEQL 99$ JSB G^LIB$ANALYZE_SDESC_R2 BLBS R0, 10$ BRW error 10$: MOVB R1, RLFNAM+NAM$B_RSS MOVL R2, RLFNAM+NAM$L_RSA MOVAL rlfnam, nam+NAM$L_RLF 99$: ; parse: $PARSE FAB=fab BLBS R0, 10$ BRW error 10$: MOVL R0, R10 ; ; fields: MOVL #_fields, R6 ; longword offset to next field code MOVAB es, R3 ; CMPL R6, (AP) BGTR 10$ MOVL (AP)[R6], R0 BNEQ loop 10$: BRW full_expanded ; no fields specified, so get everything ; loop: CASEB (R0), #nam__node, #nam__ver 1$: .WORD node-1$, dev-1$, dir-1$, name-1$, type-1$, ver-1$ BRW invarg ; node: MOVZBW nam+NAM$B_NODE, R0 MOVC3 R0, @nam+NAM$L_NODE, (R3) BRB next dev: MOVZBW nam+NAM$B_DEV, R0 MOVC3 R0, @nam+NAM$L_DEV, (R3) BRB next dir: MOVZBW nam+NAM$B_DIR, R0 MOVC3 R0, @nam+NAM$L_DIR, (R3) BRB next name: MOVZBW nam+NAM$B_NAME, R0 MOVC3 R0, @nam+NAM$L_NAME, (R3) BRB next type: MOVZBW nam+NAM$B_TYPE, R0 MOVC3 R0, @nam+NAM$L_TYPE, (R3) BRB next ver: MOVZBW nam+NAM$B_VER, R0 MOVC3 R0, @nam+NAM$L_VER, (R3) BRB next ; next: AOBLEQ (AP), R6, 10$ BRB 99$ 10$: MOVL (AP)[R6], R0 BRW loop 99$: ; ; expanded: SUBL3 #es, R3, R9 ; length of expanded filespec BRB move_to_expanded ; some fields filled in full_expanded: MOVZBW nam+NAM$B_ESL, R9 MOVC3 R9, @nam+NAM$L_ESA, es move_to_expanded: MOVL 4*_expanded(AP), R0 BEQL invarg MOVW R9, R1 MOVAB es, R2 JSB G^STR$COPY_R_R8 ; expanded_length: CMPL (AP), #_expanded_length BLSS ret MOVL 4*_expanded_length(AP), R0 BEQL ret MOVZBW nam+NAM$B_ESL, (R0) ; ret: MOVL R10, R0 RET ; invarg: MOVL #LIB$_INVARG, R0 error: RET ; .END