.MCALL .MODULE .MODULE INSERT,VERSION=03,COMMENT=,IDENT=NO,LIB=YES ; Copyright (c) 1998 by Mentec, Inc., Nashua, NH. ; All rights reserved ; ; This software is furnished under a license for use only on a ; single computer system and may be copied only with the ; inclusion of the above copyright notice. This software, or ; any other copies thereof, may not be provided or otherwise ; made available to any other person except for use on such ; system and to one who agrees to these license terms. Title ; to and ownership of the software shall at all times remain ; in Mentec, Inc. ; ; The information in this document is subject to change without ; notice and should not be construed as a commitment by Digital ; Equipment Corporation, or Mentec, Inc. ; ; Digital and Mentec assume no responsibility for the use or ; reliability of its software on equipment which is not supplied ; by Digital or Mentec, and listed in the Software Product ; Description. .SBTTL INSERT - FORTRAN CALLABLE SUBROUTINE ; ; CALL INSERT(IN,OUT,I[,J]) ; ; A SUBSTRING BEGINNING AT POSITION I OF OUT IS REPLACED BY THE STRING ; CONTAINED IN IN. IF OPTIONAL ARGUMENT J IS GIVEN, THEN AT MOST ; J CHARACTERS OF OUT ARE REPLACED BY J CHARACTERS OF IN. IF J IS NOT ; SPECIFIED, ALL CHARACTERS TO THE RIGHT OF CHARACTER POSITION I IN ; OUT ARE REPLACED BY THE STRING CONTAINED IN IN. IN AND OUT MAY NOT ; BE THE SAME ARRAY UNLESS BOTH I AND J ARE SPECIFIED AND J < I. ; IF I IS GREATER THAN THE LENGTH OF OUT, THEN ; CONCATENATED TO THE END OF OUT. IF J IS SPECIFIED AND IS GREATER THAN ; THE LENGTH OF IN, THEN THE EFFECTIVE VALUE OF J IS TAKEN AS THE ; LENGTH OF IN (NOTE THAT THIS IS NOT EQUIVALENT TO OMITTING J). ; THE FINAL LENGTH OF THE STRING IN OUT WILL ALWAYS BE LESS THAN OR ; EQUAL TO MAX(LEN(OUT),MIN(I,LEN(OUT))+MIN(J,LEN(IN))). ; ; MAS .PSECT SYS$I .GLOBL $SYSLB INSERT::MOV (R5)+,R3 ;# OF ARGS IN LOW BYTE MOV (R5)+,R1 ;PTR TO INPUT STRING MOV (R5)+,R2 ;PTR TO OUTPUT STRING MOV @(R5)+,R4 ;STARTING POSITION BEQ 20$ ;TREAT ZERO AS ONE 10$: DEC R4 ;COUNT CHARS BEQ 20$ ;READY TO GO, R4 IS ZERO TSTB (R2)+ ;BUMP PTR, AT END YET? BNE 10$ DEC R2 ;BACK UP OVER NULL ;NOTE R4 IS NON-ZERO HERE 20$: CMPB #4,R3 ;LENGTH ARGUMENT GIVEN? BHI 70$ ;NO, SIMPLY COPY ENTIRE STRING CMP #-1,@R5 ;IS ARGUMENT PRESENT? BEQ 70$ ;EQ -> NO MOV @(R5)+,R5 ;GET LENGTH BEQ 60$ ;ZERO LENGTH, DONE 30$: MOVB @R2,R0 ;AT END OF OUTPUT STRING? BNE 40$ ;NO MOV SP,R4 ;YES, SET FLAG TO TERMINATE STRING 40$: MOVB (R1)+,(R2)+ ;REPLACE A BYTE IN OUTPUT BEQ 50$ ;DONE ENTIRE INPUT STRING DEC R5 ;LENGTH TO INSERT BNE 30$ ;KEEP LOOPING MOVB @R2,R0 ;PICK UP BYTE (IN CASE) CLRB (R2)+ ;TERMINATE OUTPUT STRING 50$: TST R4 ;TERMINATION DESIRED? BNE 60$ ;YES, GOOD IT'S ALREADY DONE! MOVB R0,-(R2) ;RESTORE TERMINATION CHAR 60$: RTS PC 70$: MOVB (R1)+,(R2)+ ;COPY ENTIRE INPUT STRING BNE 70$ ;UNTIL A NULL BYTE RETURN .END