.MCALL .MODULE .MODULE SCOPY,VERSION=04,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 SCOPY - FORTRAN CALLABLE SUBROUTINE ; ; CALL SCOPY(IN,OUT[,LEN[,ERR]]) ; ; THIS ROUTINE COPIES A STRING OF CHARACTERS FROM ARRAY IN TO ; ARRAY OUT. COPYING STOPS EITHER WHEN A NULL (ZERO) CHARACTER ; IS MOVED, OR IF LEN IS GIVEN AND LEN CHARACTERS HAVE BEEN ; MOVED. (THE EFFECT OF THE LEN ARGUMENT IS TO TRUNCATE THE ; OUTPUT STRING TO A GIVEN LENGTH IF NECESSARY.) IF THE ERR ; ARGUMENT IS GIVEN AND THE OUTPUT STRING WOULD HAVE BEEN LONGER ; THAN LEN CHARACTERS, THEN ERR IS SET TO .TRUE.; OTHERWISE, IT ; IS UNCHANGED. IF THE ERR ARGUMENT IS GIVEN, THEN THE LEN ; ARGUMENT IS REQUIRED. THE OLD CONTENTS OF THE ARRAY OUT ARE ; LOST WHEN THIS SUBROUTINE IS CALLED. IN AND OUT MAY BE THE ; SAME ARRAY. ; ; SCOPY IS USEFUL WHEN INPUTTING CHARACTER STRINGS: ; READ(5,100) BUFR !BUFR IS 80 BYTE ARRAY ; 100 FORMAT(80A1) !BUT NOT IN STRING FORM ; CALL SCOPY(BUFR,STRING,80) !COPY TO 81 ELEMENT ; ! LOGICAL*1 ARRAY IN STRING FORM ; ; MAS .PSECT SYS$I .GLOBL $SYSLB SCOPY:: MOV (R5)+,R3 ;# OF ARGS IN LOW BYTE MOV (R5)+,R1 ;PTR TO INPUT STRING MOV (R5)+,R2 ;PTR TO OUTPUT STRING CMPB #2,R3 ;LEN ARGUMENT GIVEN? BEQ 40$ ;NO, DO A FAST COPY CMP #-1,@R5 ;ARG PRESENT? BEQ 40$ ;= -> NO MOV @(R5)+,R4 ;GET LEN BEQ 20$ ;0 LENGTH IF EQ 10$: MOVB (R1)+,(R2)+ ;MOVE A BYTE BEQ 30$ ;DONE ;>>> sob? DEC R4 ;COUNT DOWN LENGTH BGT 10$ ;KEEP ON LOOPIN' 20$: MOVB @R1,R0 ;SAVE INPUT CHAR FOR TRUNCATION TEST CLRB (R2)+ ;TERMINATE OUTPUT STRING HERE CMPB #4,R3 ;ERR ARGUMENT GIVEN? BHI 30$ ;NO, DONE CMP #-1,@R5 ;ARG PRESENT? BEQ 30$ ; = -> NO TSTB R0 ;INPUT DONE ANYWAY? BEQ 30$ ;YES, GET OUT MOVB #-1,@(R5)+ ;SET ERR TO .TRUE. 30$: RETURN 40$: MOVB (R1)+,(R2)+ ;COPY STRING BNE 40$ ;UNTIL A NULL RETURN .END