Trim.right()?

BlitzMax Forums/BlitzMax Beginners Area/Trim.right()?

Hello!

Is it possible to tell the trim() function to remove the unprintable characters only from the right side of a string, leaving the rest of it intact?

Example:
#Tab# #Tab# Text ########

becomes:
#Tab# #Tab# Text

and not:
Text

Thanks, Grisu

no, not that I know off
If you want to do so, split the string up, trim the right side and combine it again ...

Or write a function that just searches mid from string.length with step -1 and stops at the first alphanumeric char and then returns left up to that point

No, but you can write your own...

Either in native BlitzMax, or ripping the guts out of what's already there...

blitz_string2.c
#include "blitz.h"

BBString *RightTrim( BBString *str ){
	int b=0,e=str->length;
	if( b==e ) return &bbEmptyString;
	while( str->buf[e-1]<=' ' ) --e;
	if( e-b==str->length ) return str;
	return bbStringFromShorts( str->buf+b,e-b );
}

BBString *LeftTrim( BBString *str ){
	int b=0,e=str->length;
	while( b<e && str->buf[b]<=' ' ) ++b;
	if( b==e ) return &bbEmptyString;
	if( e-b==str->length ) return str;
	return bbStringFromShorts( str->buf+b,e-b );
}


string_test.bmx
SuperStrict

Import BRL.Blitz
Import BRL.StandardIO

Import "blitz_string2.c"

Extern
	Function RightTrim:String(s:String)
	Function LeftTrim:String(s:String)
End Extern


Print "." + RightTrim("   a c b d   ") + "."
Print "." + RightTrim("   a c c d~t~t ") + "."
Print "." + LeftTrim("   a c b d   ") + "."
Print "." + LeftTrim(" ~t~ta c c d~t~t ") + "."


:-p

Thanks for the help guys!

@Brucey:
Compiling:blitz_string2.c
In file included from C:/Program Files/BlitzMax/mod/brl.mod/blitz.mod/blitz.h:5,
from E:/DFA/blitz_string2.c:1:
C:/Program Files/BlitzMax/mod/pub.mod/stdc.mod/stdc.h:5:19: ctype.h: No such file or directory
C:/Program Files/BlitzMax/mod/pub.mod/stdc.mod/stdc.h:6:19: stdio.h: No such file or directory
C:/Program Files/BlitzMax/mod/pub.mod/stdc.mod/stdc.h:7:20: string.h: No such file or directory
C:/Program Files/BlitzMax/mod/pub.mod/stdc.mod/stdc.h:8:20: stdlib.h: No such file or directory
C:/Program Files/BlitzMax/mod/pub.mod/stdc.mod/stdc.h:9:20: stdarg.h: No such file or directory
C:/Program Files/BlitzMax/mod/pub.mod/stdc.mod/stdc.h:10:20: assert.h: No such file or directory
C:/Program Files/BlitzMax/mod/pub.mod/stdc.mod/stdc.h:11:22: sys/stat.h: No such file or directory
C:/Program Files/BlitzMax/mod/pub.mod/stdc.mod/stdc.h:12:18: time.h: No such file or directory
C:/Program Files/BlitzMax/mod/pub.mod/stdc.mod/stdc.h:24:21: direct.h: No such file or directory
Build Error: failed to compile E:/DFA/blitz_string2.c

Am I missing files???

Here's a couple of functions I knocked up, if they're any good to you.


Print ">" + RightTrim( "   abc   " ) + "<"
Print ">" + LeftTrim( "   abc   " ) + "<"

End

Function RightTrim:String( value:String )
	For Local pos:Int = value.length - 1 To 0 Step -1
		If Asc( value[ pos..pos + 1 ] ) > 32
			value = value[ ..pos + 1 ]
			Exit
		EndIf
	Next
	Return value
End Function


Function LeftTrim:String( value:String )
	For Local pos:Int = 0 To value.length - 1
		If Asc( value[ pos..pos + 1 ] ) > 32
			value = value[ pos.. ]
			Exit
		EndIf
	Next
	Return value
End Function



Thanks Bill... works out of the box.

Am I missing files??

Yeah... MinGW, by the looks of it.

You'll find the C functions significantly faster than the equivalent BlitzMax implementation...