.TITLE LENGTH .IDENT /V01/ .SBTTL DESCRIPTION ; ; ; COMPONENT: LENGTH ; ; DATE: 30-MAY-79 ; ; AUTHOR: GR JOHNSON ; BATTELLE NORTHWEST ; P O BOX 999 ; RICHLAND WA 99352 ; ; SOURCE: MACRO-11 ; ; CALLER: FORTRAN IV-PLUS ; ; CALLING SEQUENCE: ; ; ILEN = LENGTH(STRING,[MLEN]) ; ; ILEN = INTEGER VARIABLE TO RECEIVE THE LENGTH OF THE ; ASCII STRING. ; ; STRING = ARRAY CONTAINING AN ASCII STRING. ; ; MLEN = VARIABLE CONTAINING MAXIMUM STRING LENGTH. ; ; IF THE ARGUMENT IS NOT SUPPLIED, LENGTH IS ; DETERMINED BY SCANNING FORWARD THROUGH THE ; STRING FOR THE FIRST ASCII NULL CHARACTER. ; ; IF THE ARGUMENT IS SUPPLIED, LENGTH IS ; DETERMINED BY SCANNING THE STRING BACKWARDS ; FROM MLEN FOR THE FIRST NON-BLANK, PRINTABLE ; ASCII CHARACTER. ; ; ; DESCRIPTION: ; ; "LENGTH" RETURNS THE LENGTH OF AN ASCII STRING. ; ; ; EXAMPLES: ; ; N1 = LENGTH('123456789 123456789 ',30) ; N2 = LENGTH('123456789 123456789 ') ; ; N1=19 ; N2=30 ; ; .SBTTL ENTRY POINT -- FIND STRING LENGTH ; ; .PSECT ; ; LENGTH:: ; ; MOV 2(R5),R1 ; ADDRESS OF STRING TO R1 CMPB #1,(R5) ; SINGLE ARGUMENT? BEQ FOR ; YES, GO SEARCH FORWARD MOV 4(R5),R0 ; ADDRESS OF ILEN TO R0 BLE FOR ; NULL ARGUMENT, GO SEARCH FORWARD ; BACK: MOV (R0),R0 ; ILEN TO R0 BLE RTN ; ILEN.LE.0 -- RETURN ADD R0,R1 ; R1 = ADDRESS OF LAST CHARACTER + 1 2$: DEC R1 ; POINT TO PRIOR CHARACTER CMPB #040,(R1) ; SPACE OR LESS? BGE 4$ ; YES, NEXT CHARACTER CMPB #177,(R1) ; DEL? BNE RTN ; NO, RETURN WITH LENGTH 4$: SOB R0,2$ ; DECREMENT COUNT AND CONTINUE SCAN BR RTN ; RETURN WITH LENGTH = 0 ; FOR: CLR R0 ; CLEAR LENGTH 6$: CMPB #000,(R1)+ ; NULL? BEQ RTN ; YES, RETURN WITH LENGTH INC R0 ; INCREMENT CHARACTER COUNT BR 6$ ; AND CONTINUE TO SCAN ; RTN: RTS PC ; RETURN TO CALLER (R0 = LENGTH) .END ;