DC0:INDSU3.MAC=DC0:INDSU3.001 -101,109,/; RRW005/ CMPB R2,#TF ; LOGICAL SYMBOL? BEQ 57$ ; Y - JUMP ; N - MUST BE STRING THEN CALL LOCSUB ; LOCATE ANY SUBPARAMETERS OR SUBSTRINGS BCS 13$ ; BR IF SYNTAX ERROR CMPB (R0)+,#'' ; NEXT CHAR A SINGLE QUOTE? BNE 13$ ; BR IF NOT TST (SP)+ ; DISCARD SAVED R0 TST R3 ; NULL PARAMETER? BEQ 5$ ; BR IF SO -148 CMPB (R0)+,#'' ; N - IS NEXT CHAR. SINGLE QUOTE? BNE 13$ ; N - ERROR, JUMP TST (SP)+ ; SKIP SAVED R0 -240,259 CALL LOCSUB ; LOCATE ANY SUBPARAMETERS OR SUBSTRINGS BCS 200$ ; BR IF SYNTAX ERROR MOV R3,R1 ; PUT LENGTH FOUND IN R1 -281 .PAGE ; ; FIND SUBPARAMETERS AND SUBSTRINGS OF STRING PARAMETERS ; ; ON ENTRY ; R0 POINTS TO NEXT CHARACTER AFTER SYMBOL NAME ; ; ON EXIT ; R0 UPDATED ; R3 HAS SUBSTRING LENGTH ; R5 HAS SUBSTRING ADDRESS ; LOCSUB:; MOV R1,-(SP) ; SAVE R1 MOV R2,-(SP) ; AND R2 MOV R4,-(SP) ; AND R4 MOV R5,-(SP) ; PUT SYMBOL ENTRY ADDRESS ON STACK ADD #SEVAL,(SP) ; ADD OFFSET TO VALUE MOVB SELEN(R5),R3 ; ALSO LENGTH MOV R3,-(SP) ; * CLR -(SP) ; CLEAR SUBSTRING OFFSET ; CMPB (R0),#'< ; SUBPARAMETER NOTATION? BNE 35$ ; BR IF NOT 20$: INC R0 ; SKIP OVER OPEN PAREN CALL EVNX ; GET SUBPARAMETER NUMBER MOV R1,PRMT3 ; SAVE DESIRED SUBPARAMETER NUMBER ; MOV #1,R1 ; TELL TPARS TO CONSIDER BLANKS MOV #KEYTAB,R2 ; POINT TO KEYWORD TABLE MOV 2(SP),R3 ; GET STRING LENGTH MOV 4(SP),R4 ; AND ADDRESS MOV #SUBPRM,R5 ; POINT TO INITIAL STATE CALL .TPARS ; FIND THE SUBPARAMETER ; MOV PRMT5,2(SP) ; SET ADDRESS OF PARAMETER END+1 MOV #PRMSCR,4(SP) ; AND ADDRESS TO REFLECT SUBPARAMETER FOUND ; ; BCS 220$ ; BR IF SYNTAX ERROR SUB 4(SP),2(SP) ; CALCULATE NEW PARAMETER LENGTH ; CMPB (R0),#', ; ANOTHER LEVEL OF SUBPARAMETER EXPECTED? BEQ 20$ ; LOOP BACK IF ANOTHER SUBPARAMETER EXPECTED CMPB (R0)+,#'> ; NEXT CHAR SHOULD BE CLOSE BNE 200$ ; BR IF NOT ; ; SUBSTRINGS ; 35$:; CMPB (R0),#'[ ; SUBSTRING INDICATOR? BNE 40$ ; BR IF NOT INC R0 ; SKIP OVER IT ; CALL EVNX ; GET STARTING CHAR NUMBER DEC R1 ; MAKE NUMBER AN OFFSET FROM 0 MOV R1,(SP) ; REPLACE DEFAULTED VALUE ON STACK CMPB (R0)+,#': ; COLON SHOULD BE NEXT BNE 200$ ; BR IF NOT CALL EVNX ; GET ENDING POSITION ; CMPB (R0)+,#'] ; CHECK SYNTAX BNE 200$ ; BR IF ERROR ; CMP R1,2(SP) ; IS LAST CHAR WANTED BEYOUND END OF STRING? BGT 40$ ; BR IF SO MOV R1,2(SP) ; ELSE SET STRING LENGTH TO LAST CHAR WANTED 40$: MOV (SP)+,R5 ; GET SUBSTRING OFFSET MOV (SP)+,R3 ; AND LAST CHAR WANTED SUB R5,R3 ; CALC LENGTH BHIS 60$ ; BR IF OK CLR R3 ; ELSE RETURN ZERO LENGTH 60$: ADD (SP)+,R5 ; ADD STRING BASE ADDRESS CLC ; CLEAR ERROR FLAG BR 210$ ; RETURN 200$: SEC ; SET ERROR FLAG 210$: MOV (SP)+,R4 ; RESTORE R4 MOV (SP)+,R2 ; AND R2 MOV (SP)+,R1 ; AND R1 RETURN 220$: CMP (SP)+,(SP)+ ; CLEAN UP TST (SP)+ ; STACK BR 200$ ; TAKE ERROR RETURN /