[Back to STRINGS SWAG index]  [Back to Main SWAG index]  [Original]

(*
In a message dated Wednesday March 13 1996, Mario Polycarpou of 3:690/354
wrote:
 DR>> function LTrim(S: string): string;
 DR>> var C: Byte;
 DR>> begin
 DR>> for C := 1 to Length(S) do if S[C+1]<>#32 then Break;
 DR>> LTrim := Copy(S,C,255);
 DR>> end;

 MP>  Sorry mate but that's crap. Have a play with this...

 MP> {-+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--}
 MP> FUNCTION TrimL(S:String):String;     {Trim left}
 MP> VAR X:Integer;
 MP> BEGIN
 MP>  X:=1;
 MP>  WHILE S[X]=#32 DO Inc(X);
 MP>  TrimL:=Copy(S,X,Length(S));
 MP> END;
 MP> {-+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--}

OK, by my calculations, TrimL is about 10% faster - try this, it's about twice
as fast as Marios:
*)

function StripLBStr (const S: string): string; assembler;

asm
      mov  dx, ds     { Save DS Register }
      cld
      les  di, [S]    { ES:DI => Source }
      mov  al, es:[DI]{ Load Length of String }
      inc  di
      sub  cx, cx     { Set CX to Zero }
      mov  cl, al     { CX <- No. of Bytes }
      jcxz @1         { if Null String then Terminate }
      mov  ax, ' '    { Store ' ' in AX }
      repz scasb      { Scan String until no Space or string scan complete }
      jz   @3
      inc  cx
      dec  di
      push es
      pop  ds
      mov  si, di
  @3: mov  al, cl
  @1: les  di, @Result{ ES:DI => Destination }
      stosb           { store length byte }
      jcxz @2         { if CX = 0 then done }
      movsb           { Move first char so stay word aligned }
      dec  cx
      jcxz @2
      shr  cx,1       { CX <- CX div 2 }
      rep  movsw      { move rest as words }
      jnc  @2         { if carry then odd number }
      movsb           { so move the odd one }
  @2: mov  ds, dx     { Restore DS Register }
end;

[Back to STRINGS SWAG index]  [Back to Main SWAG index]  [Original]