OBJNAM TRIM.SBR ; 6 May 83, edited 9-Dec-85 ; Subroutine to strip leading and trailing whitespace from strings ; by Irv Bromberg, Medic/OS Consultants, Toronto, Canada RADIX 10 VMAJOR=3 VMINOR=2 VSUB=0 VEDIT=13 IF EQ,1 Edit history 9-May-83 added tab stipping 30-Apr-85 added INTERN to TRIM for use with XBASIC (simply LNKLIT TRIM after assembling) 30-Nov-85 major re-write: DBF loops, strip all whitespace, more efficient 9-Dec-85 rename to TRIM.SBR to prevent conflict with Alpha's STRIP.SBR Calling syntax: XCALL TRIM,list-of-variables-to-trim strings and unformatted variables are trimmed of leading and trailing whitespace (spaces, control codes), numeric variables are not changed Note how this subroutine differs from commonly available routines that are similar: any number of variables can be passed for stripping trims all whitespace (spaces or any control codes) The control-code trimming capability is useful in advanced terminal input/output, making it easy to get rid of leading or trailing control codes that are not desired. This is especially useful when special terminal input/output causes one or more NULL codes to be placed into the start of a string, preventing the following non-NULL characters in the string from being seen by BASIC -- TRIM.SBR removed such leading NULL(s) and shifts the printable characters down to start at the first byte position. ENDC SEARCH SYS SEARCH SYSSYM String=A2 Scan=A3 Atemp=A6 Char=D1 Pcount=D2 Size=D3 Vtype=D4 Dtemp=D6 SPACE=32 INTERN TRIM TRIM: PHDR -1,0,PH$REE!PH$REU MOVW (Scan)+,Pcount ; get #variables BR NextVar Loop: MOVW (Scan)+,Vtype ; get variable type MOV (Scan)+,String ; and address MOV (Scan)+,Size ; and size BEQ NextVar ; skip var with NULL dimension CMPW Vtype,#2 ; check if string or unformatted BLOS DoIt ; bypass numeric variables NextVar:DBF Pcount,Loop RTN ; Done, return to BASIC DoIt: LEA Atemp,0(String)[~Size] ; point to last byte MOVW Size,Dtemp BR eClrEnd ; enter at end of DBF loop ClrEnd: MOVB -(Atemp),Char ; nothing to clear if already NULL BEQ eClrEnd CMPB Char,#SPACE ; is this whitespace? BHI Begin ; no, now check beginning CLRB (Atemp) ; clear whitespace to null eClrEnd:DBF Dtemp,ClrEnd BR NextVar ; goto next var because string empty Begin: MOV Size,Dtemp ; search for first non-whitespace MOV String,Atemp ; character in the string DECW Dtemp ; pre-decr for DBHI loop 10$: CMPB (Atemp)+,#SPACE ; (empty string impossible here) DBHI Dtemp,10$ ; stop at first printable character DECW Atemp ; backup CMP Atemp,String ; non-whitespace at first position? BEQ NextVar ; yes, nothing to move 20$: MOVB (Atemp)+,(String)+ ; move everything down DBEQ Dtemp,20$ ; stop at NULL MOV Atemp,Dtemp ; calculate distance we shifted down SUB String,Dtemp BR 40$ ; enter at end of DBF loop 30$: CLRB (String)+ ; clear in-between part 40$: DBF Dtemp,30$ BR NextVar ASMMSG "Now execute the command: LNKLIT TRIM to finish up" END .