.TITLE STJUST .IDENT /V02/ .ENABLE LC ; ; This subroutine justifies an ASCII string either to the right or to the left ; ; Author: V01 16-Mar-79 Mark Woolfson ; V02 28-Jan-80 Phil Stephensen-Payne ; ; Calling Sequence: ; ; This subroutine is called via the standard FORTRAN calling sequence as:- ; ; CALL STJUST(ASCSTR,STRLEN,JUST [,STATUS]) ; or ; STATUS = STJUST(ASCSTR,STRLEN,JUST) ; ; Where:- ; ASCSTR = Address of ASCII string to be justified ; STRLEN = Lenth of string to be justified ; JUST = Direction of justification (-ve = left, +ve = right) ; STATUS = Optional error return ; ; Errors Returned: ; ; STATUS = 0 if the operation was successful ; = -1 if a parameter error was detected ; ; External References: ; ; This module references the subroutine PRMCHK ; ; ; STJUST:: MOV #4,R0 ;SET UP NUMBER OF PARAMS CALL PRMCHK ;CHECK ON PARAMETERS BCS 70$ ; If CS parameter error - exit at once MOVB @4(R5), R3 ;GET LENGTH OF STRING BIC #177400,R3 ; Clear any sign extension BEQ 60$ ; If eq nothing to do TSTB @6(R5) ;TEST FOR JUSTIFICATION DIRECTION BLT 40$ ;... LEFT ; ; RIGHT JUSTIFICATION REQUIRED ; 10$: MOVB @4(R5),R1 ; Get length of string BIC #177400,R1 ; Remove siggn extension DEC R1 ; BEQ 60$ ; If eq nothin to do MOV R1,R2 ; Save the length ADD 2(R5),R1 ; Hence get address of last byte MOVB (R1), R0 ;READ LAST BYTE CMPB R0, #40 ;COMPARE WITH SPACE BEQ 20$ ;... MATCH FOUND TSTB R0 ;... NO MATCH, SO COMPARE WITH NULL BNE 60$ ; ...NO MATCH, SO QUIT ; 20$: MOVB -(R1), 1(R1) ;MOVE BYTES UP STRING SOB R2, 20$ ;TEST FOR END OF SHIFT MOVB R0, (R1) ;INSERT REMOVED BYTE ONTO FRONT OF STRING SOB R3, 10$ ;TEST FOR END OF STRING (ALL MAY HAVE BEEN JUST) BR 60$ ;QUIT IF FINISHED JUSTIFICATION ; ; LEFT JUSTIFICATION REQUIRED ; 40$: MOVB @4(R5),R2 ; Get length of string BIC #177400,R2 ; Clear sign extension DEC R2 ; less one BEQ 60$ ; If eq exit MOV 2(R5), R1 ;GET ADDR OF STRING MOVB (R1), R0 ;READ FIRST BYTE CMPB R0, #32. ;COMPARE WITH SPACE BEQ 50$ ;...MATCH FOUND TSTB R0 ;...NO MATCH, SO COMPARE WITH NULL BNE 60$ ; ...NO MATCH, SO QUIT ; 50$: MOVB 1(R1), (R1)+ ;MOVE BYTES DOWN STRING SOB R2, 50$ ;TEST FOR END OF SHIFT MOVB R0, (R1) ;INSERT REMOVED BYTE ONTO END OF STRING SOB R3, 40$ ;TEST IF ANY MORE JUSTIFICATION REQUIRED ; 60$: CLR R0 ; Success ; 70$: RETURN ;QUIT .END