.MCALL .MODULE .MODULE SUBSTR,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 SUBSTR - FORTRAN CALLABLE SUBROUTINE ; ; CALL SUBSTR(IN,OUT,I[,J]) ; ; A SUBSTRING IS TAKEN FROM THE STRING SPECIFIED BY IN BEGINNING ; AT CHARACTER POSITION I. THE RESULT IS PLACED IN OUT. IF OPTIONAL ; ARGUMENT J IS SPECIFIED, THE SUBSTRING WILL CONTAIN AT MOST J ; CHARACTERS. IF J IS NOT GIVEN, THE SUBSTRING WILL INCLUDE ALL CHAR- ; ACTERS TO THE RIGHT OF CHARACTER POSITION I. IN AND OUT MAY BE THE ; SAME ARRAY. IF J=0 THEN OUT IS REPLACED WITH A NULL STRING. THE ; OLD CONTENTS OF OUT ARE LOST WHEN THIS ROUTINE IS CALLED. ; ; MAS .PSECT SYS$I .GLOBL $SYSLB SUBSTR::MOV (R5)+,R3 ;# OF ARGS IN LOW BYTE MOV (R5)+,R1 ;INPUT STRING POINTER MOV (R5)+,R2 ;OUTPUT STRING POINTER MOV @(R5)+,R4 ;STARTING CHAR POSITION BEQ 20$ ;TREAT 0 AS ONE 10$: TSTB (R1)+ ;SKIP CHARS TO STARTING POSITION BEQ 40$ ;REACHED END OF STRING, NO OUTPUT ;>>> sob? DEC R4 ;COUNT SKIPPED CHARS BNE 10$ DEC R1 ;BACK UP CHAR POINTER 20$: CMPB #4,R3 ;LENGTH GIVEN FOR SUBSTRING? BHI 60$ ;NO, DO A FAST SUBSTR CMP #-1,@R5 ;IS ARG PRESENT? BEQ 60$ ;= -> NO MOV @(R5)+,R4 ;GET LENGTH BEQ 40$ ;ZERO LENGTH, RETURN NULL STRING 30$: MOVB (R1)+,(R2)+ ;COPY SUBSTRING BEQ 50$ ;REACHED END OF INPUT, RETURN ;>>> sob? DEC R4 ;COUNT LENGTH BNE 30$ 40$: CLRB (R2)+ ;TERMINATE OUTPUT STRING 50$: RETURN 60$: MOVB (R1)+,(R2)+ ;COPY TO END BNE 60$ RETURN .END