Algorithm for back trimming trailing zeros in a basic string.
' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
#compile exe "backtrimz.exe"
#compiler pbcc ' only build with PBCC
#option largemem32 ' /LARGEADDRESSAWARE
' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
FUNCTION PBmain as LONG
a$ = chr$("1234567890",0,0,0,0,0,0,0,0)
b$ = backtrimz(a$)
StdOut b$
StdOut format$(len(b$))
waitkey$
End FUNCTION
' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
FUNCTION backtrimz(src$) as STRING
' -------------------------------------
' trim trailing zeros from basic string
' -------------------------------------
#REGISTER NONE
LOCAL lstr as DWORD ' string length
LOCAL pstr as DWORD ' string pointer
lstr = len(src$) ' src$ length
pstr = StrPtr(src$) ' src$ pointer
PREFIX "!"
mov esi, pstr ' load pointer address
cmp BYTE PTR [esi], 0 ' exit on leading zero
je errr
add esi, lstr ' add length to pointer address
lbl:
sub esi, 1 ' decrement address
cmp BYTE PTR [esi], 0 ' test if char is 0
je lbl ' jump back on zero
sub esi, pstr ' subtract pointer from esi to get new length
mov lstr, esi ' copy esi to variable
add lstr, 1 ' correct for last sub
END PREFIX
FUNCTION = left$(src$,lstr) ' return back trimmed BASIC string
Exit FUNCTION
errr:
FUNCTION = "" ' exit with null string on error
End FUNCTION
' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤