; GET_DCL ; ; THIS SUBROUTINE GETS THE COMMAND LINE THAT RAN A PROGRAM. IT UNWINDS ; THE STACK TO FIND THE LEVEL THAT THE SYSTEM CALL TOOK PLACE FROM SO ; IT MAY BE ANY NUMBER OF LEVELS DOWN. (THIS IS IN CONTRAST TO THE ; EXAMPLE PRESENTED AT THE FALL 1978, DECUS CONVENTION THAT HAD TO BE IN ; THE MAIN ROUTINE IN ORDER TO WORK. ; ; CALLING SEQUENCE (FROM FORTRAN): ; ; CHARACTER*80 STRING ; INTEGER*4 STATUS ; INTEGER*4 NCHAR ; ; CALL GET_DCL(NCHAR,STRING,STATUS) ; ; WHERE: ; ; NCHAR IS THE NUMBER OF CHARACTERS RETURNED ; STRING IS ANY CHARACTER VARIABLE ; STATUS IS A STATUS CODE RETURNED AS FOLLOWES: ; STATUS = 1 SUCCESSFUL OPERATION ; STATUS = 2 DCL COMMAND BUFFER EMPTY ; STATUS = 3 CHARACTER STRING OVERFLOW ; (NCHAR WILL CONTAIN LENGTH STRING ; SHOULD HAVE BEEN) ; ; THIS ROUTINE WAS ORIGIONALLY WRITTEN BY SOME UNKNOWN SOUL IN A SLIGHTLY ; DIFFERENT FORM AND CALLED GET_DCL_FOR. THE ERROR PARAMETER WAS REMOVED ; AND THE EXIT CHANGED SLIGHTLY AND RENAMED BY RICH GRECO OF LEWIS AND CLARK ; COLLEGE OF PORTLAND, OREGON. I AM GRATEFUL TO WHOEVER I PLAGERIZED THIS FROM. ; $CLISERVDEF ; DEFINE CLI SERVICE COMMAND ; GETCMD: $CLIREQDESC CLI$K_GETCMD ; DEFINE REQUEST DESCRIPTOR FOR GET COMMAND ; BLANK = ^X20 ; ASCII BLANK FRAME_FP = ^X0C ; OFFSET TO STORED FP FRAME_AP = ^X08 ; OFFSET TO STORED AP ARG_NCHAR = ^X04 ; OFFSET TO NCHAR PARAMETER ARG_STRING = ^X08 ; OFFSET TO STRING PARAMETER ARG_STATUS = ^X0C ; OFFSET TO STATUS PARAMETER ; .ENTRY GET_DCL,^M ; MOVL FP,R0 ; R0 = STARTING FRAME POINTER MOVL AP,R1 ; R1 = STARTING ARGUMENT POINTER MOVL AP,R2 ; R2 = PREVIOUS ARGUMENT POINTER ; 11$: TSTL FRAME_FP(R0) ; TEST IF FIRST FRAME BEQL 12$ ; YES - EXIT MOVL R1,R2 ; SAVE PREVIOUS AP MOVL FRAME_AP(R0),R1 ; SAVE PREVIOUS AP MOVL FRAME_FP(R0),R0 ; UNWIND TO NEXT FRAME BRB 11$ ; 12$: PUSHAB W^GETCMD ; COMMAND DESCRIPTOR ADDR CALLS #1,@CLI$A_UTILSERV(R2) ; GET DCL COMMAND LINE ; MOVZWL GETCMD+CLI$W_RQSIZE,- ; SET NUMBER CHARS @ARG_NCHAR(AP) BEQL 502$ ; COMMAND BUFFER EMPTY - STATUS 2 ; MOVQ @ARG_STRING(AP),R0 ; GET CHARACTER DESCRIPTOR CVTWL R0,R0 ; CLEAR HIGH WORD CMPW R0,GETCMD+CLI$W_RQSIZE ; TEST ARG_STRING SIZE BLSS 601$ ; CHARACTER STRING OVERFLOW - STATUS 3 ; MOVC5 GETCMD+CLI$W_RQSIZE,- @GETCMD+CLI$A_RQADDR,- ; MOVE DCL STRING TO ARG_STRING #BLANK,R0,(R1) ; MOVL #1,@ARG_STATUS(AP) RET ; 502$: MOVL #2,@ARG_STATUS(AP) RET ; 601$: MOVL #3,@ARG_STATUS(AP) RET .END