.TITLE SYMTAB .IDENT /V01.1/ ;***************************************************************************** ; ; UNIT NAME: SYMTAB ; ; PURPOSE: PROVIDE SYMBOL TABLE SERVICES ; ; GLOBAL VARIABLES: ; ITEM TYPE USE FULL NAME:DESCRIPTION ; -------------------- ---- --- --------------------- ; Q_HEAD I*4 I/O HEAD OF SYMBOL TABLE LIST ; ; MODULES CALLED: ; NAME PURPOSE ; ------------- -------------------------------------- ; LIB$GET_VM ALLOCATE VIRTUAL MEMORY ; LIB$SCOPY_DXDX6 COPY SYMBOL NAME ; LIB$SFREE1_DD6 FREE DYNAMIC STRING SPACE ; LIB$FREE_VM FREE VIRTUAL MEMORY ; ; MACROS CALLED: ; NAME PURPOSE ; ------------- -------------------------------------- ; SIGNAL SIGNAL ANY ERROR CONDITIONS ; _STDEF DEFINE SYMBOL TABLE OFFSETS ; ; DEVELOPMENT HISTORY: ; AUTHOR DATE COMMENTS ; D. FITZGERALD 4/14/83 ; D. Fitzgerald 10/2/86 Fixed problem in DELSYM that didn't ; show up on a 780 ; ;***************************************************************************** ; ; .PSECT SYMTAB_DATA PIC,OVR,LCL,NOSHR,NOEXE,WRT,QUAD Q_HEAD: .ADDRESS Q_HEAD,Q_HEAD ; ; .PSECT SYMTAB_CODE PIC,CON,LCL,SHR,NOWRT,EXE,LONG ; _STDEF ;DEFINE SYMBOL TABLE EQUATES ; .PAGE .SBTTL ADDSYM -- ADD AN ENTRY TO SYMBOL TABLE ; ; MODULE: ADDSYM -- ADD AN ENTRY TO SYMBOL TABLE ; ; CALLING SEQUENCE: ; ENTRY_ADDR = ADDSYM(NAME) ; NAME = 4 ;INPUT SYMBOL NAME (DESCRIPTOR) ; .ENTRY ADDSYM,^M PUSHAQ @NAME(AP) ;CALL GETSYM TO SEE IF ALREADY HERE CALLS #1,GETSYM TSTL R0 ;IF NOT FOUND BNEQU 50$ ;THEN ; ; ALLOCATE ENTRY ; PUSHL #ST_K_LEN ;BYTE COUNT FOR LIB$GET_VM PUSHL #0 ;ADDRESS FOR LIB$GET_VM PUSHAL (SP) ;BASE ADDRESS PUSHAL 8(SP) ;NUMBER OF BYTES CALLS #2,G^LIB$GET_VM ;GET ST_K_LEN BYTES FOR ENTRY SIGNAL R0 ;SIGNAL ANY ERROR ; ; INITIALIZE ENTRY ; MOVL (SP),R0 ;GET ADDRESS OF QUEUE ENTRY CLRQ (R0)+ ;CLEAR QUEUE POINTERS MOVL R0,R1 ;SAVE ADDRESS OF STRING DESC. CLRW (R0)+ ;SET STRING LEN TO ZERO CLRB (R0)+ ;SET STRING TYPE TO ZERO MOVB #2,(R0)+ ;SET STRING CLASS TO DYNAMIC CLRL (R0)+ ;SET STRING ADDRESS TO ZERO CLRW (R0)+ ;SET ST_W_TYPE TO ZERO CLRW (R0)+ ;SET ST_W_FLAGS TO ZERO CLRL (R0) ;SET ST_L_VALUE TO ZERO ; ; COPY NAME TO ENTRY ; MOVAL @NAME(AP),R0 ;GET INPUT STRING DESCR. JSB G^LIB$SCOPY_DXDX6 ;COPY INTO ALLOCATED STRING SIGNAL R0 ;SIGNAL ANY ERROR ; ; INSERT ENTRY INTO SYMBOL TABLE LIST ; MOVL (SP),R0 ;COPY ENTRY ADDR FOR RETURN INSQUE @(SP),@Q_HEAD+4 50$: ;ENDIF ; ; RETURN ; RET .PAGE .SBTTL ADDCON -- ADD CONSTANT TO SYMBOL TABLE ; ; MODULE: ADDCON -- ADD CONSTANT TO SYMBOL TABLE ; ; CALLING SEQUENCE: ; ENTRY_ADDR = ADDCON ; .ENTRY ADDCON,^M<> ; ; ALLOCATE ENTRY ; PUSHL #ST_K_LEN ;BYTE COUNT FOR LIB$GET_VM PUSHL #0 ;ADDRESS FOR LIB$GET_VM PUSHAL (SP) ;BASE ADDRESS PUSHAL 8(SP) ;NUMBER OF BYTES CALLS #2,G^LIB$GET_VM ;GET ST_K_LEN BYTES FOR ENTRY SIGNAL R0 ;SIGNAL ANY ERROR ; ; INITIALIZE ENTRY ; MOVL (SP),R0 ;GET ADDRESS OF QUEUE ENTRY MOVL R0,R1 ;SAVE ADDRESS FOR RETURN CLRQ (R1)+ ;CLEAR QUEUE POINTERS CLRW (R1)+ ;SET STRING LEN TO ZERO CLRB (R1)+ ;SET STRING TYPE TO ZERO MOVB #2,(R1)+ ;SET STRING CLASS TO DYNAMIC CLRL (R1)+ ;SET STRING ADDRESS TO ZERO CLRW (R1)+ ;SET ST_W_TYPE TO ZERO CLRW (R1)+ ;SET ST_W_FLAGS TO ZERO CLRL (R1) ;SET ST_L_VALUE TO ZERO ; ; INSERT ENTRY INTO SYMBOL TABLE LIST ; INSQUE @(SP),@Q_HEAD+4 ; ; RETURN ; RET .PAGE .SBTTL DELSYM -- DELETE SYMBOL TABLE ENTRY ; ; MODULE: DELSYM -- DELETE SYMBOL TABLE ENTRY ; ; CALLING SEQUENCE: ; CALL DELSYM(ENTRY_ADDR) ; ENTRY_ADDR = 4 ;INPUT ADDRESS OF ENTRY TO BE DELETED ; .ENTRY DELSYM,^M ; ; FREE DYNAMIC STRING ; MOVL @ENTRY_ADDR(AP),R0 ;GET ADDRESS OF QUEUE ENTRY ADDL #ST_Q_NAME,R0 ;POINT TO STRING DESCR. JSB G^LIB$SFREE1_DD6 ;FREE DYNAMIC STRING AREA SIGNAL R0 ;SIGNAL ANY ERROR ; MOVL @ENTRY_ADDR(AP),R0 REMQUE (R0),r0 ;REMOVE ENTRY FROM QUEUE ; ; FREE QUEUE ENTRY ; 30$: PUSHL #ST_K_LEN ;NUMBYTES FOR LIB$FREE_VM PUSHL @ENTRY_ADDR(AP) ;ADDRESS FOR LIB$FREE_VM PUSHAL (SP) PUSHAL 8(SP) ;POINTER TO NUMBYTES CALLS #2,G^LIB$FREE_VM ;FREE QUEUE ENTRY SIGNAL R0 ;SIGNAL ANY ERROR RET .PAGE .SBTTL GETSYM -- LOOKUP NAME IN SYMBOL TABLE ; ; MODULE: GETSYM -- LOOKUP NAME IN SYMBOL TABLE ; ; CALLING SEQUENCE: ; ENTRY_ADDR = GETSYM(NAME) ; NAME = 4 ;INPUT NAME TO BE LOOKED UP (DESCRIPTOR) ; .ENTRY GETSYM,^M ; MOVAQ @ENTRY_ADDR(AP),R4 ;GET NAME DESCR. MOVAQ G^Q_HEAD,R5 ;GET QUEUE HEAD MOVL R5,R6 ; 10$: ;LOOP MOVL (R6),R6 ;UNTIL END OF QUEUE CMPL R6,R5 BEQLU 20$ MOVL R6,R0 ;CHECK CURRENT ENTRY ADDL #ST_Q_NAME,R0 ;POINT TO STRING DESCR. CMPC5 (R4),@4(R4),#0,(R0),@4(R0) ;LOOK FOR MATCH BNEQU 10$ ;UNTIL FOUND ; ;REPEAT MOVL R6,R0 ;PASS BACK POINTER RET 20$: ;COME HERE IF NOT FOUND CLRL R0 ;SEND BACK ZERO POINTER RET .PAGE .SBTTL SCNSYM -- SCAN THE ENTIRE SYMBOL TABLE ; ; MODULE: SCNSYM -- SCAN THE ENTIRE SYMBOL TABLE ; ; CALLING SEQUENCE: ; CALL SCNSYM(ACTION) ; ACTION = 4 ;INPUT ADDRESS OF ACTION ROUTINE TO BE CALLED FOR EACH ; SELECTED ENTRY ; ; ACTION WILL BE CALLED AS: ; CALL ACTION(ENTRY) ; .ENTRY SCNSYM,^M MOVAQ G^Q_HEAD,R2 ;GET QUEUE HEAD MOVL R2,R3 ;GET FIRST ENTRY 10$: ;LOOP MOVL (R3),R3 ;GET NEXT ENTRY CMPL R3,R2 ;UNTIL END OF QUEUE BEQLU 20$ PUSHL R3 ;CALL ACTION(R3) CALLS #1,@ACTION(AP) BRB 10$ ;REPEAT 20$: RET ;RETURN .END