[Back to STRINGS SWAG index] [Back to Main SWAG index] [Original]
Optimized for speed:
=== ===
function UpperCase(S: string): string;
var 
  I: Integer;
begin
  for I := 1 to Ord(S[0]) do if S[I] in ['a'..'z'] then Dec(S[i], 32);
  Uppercase := S;
end;
function LowerCase(S: string): string;
var
  I: Integer;
begin 
  for I := 1 to Ord(S[0]) do if S[I] in ['A'..'Z'] then Inc(S[i], 32);
  Uppercase := S;
end;
=== ===
Optimized for memory (use constant declarations to cut down on stack
usage--but then you can't modify S) :
=== ===
function UpperCase(const S: string): string;
var
  I: Integer;
begin
  Uppercase := S;
  for I := 1 to Ord(S[0]) do if S[I] in ['a'..'z'] then
    UpperCase[I] := Chr(Ord(S[I])-32);
end;
function LowerCase(const S: string): string;
var
  I: Integer;
begin
  LowerCase := S;
  for I := 1 to Ord(S[0]) do if S[I] in ['A'..'Z'] then
    LowerCase[I] := Chr(Ord(S[I])+32);
end;
=== ===
With ASM, the fastest case routines I have seen so far {w.out using a 
look-up table that is}
function UpperCase(const S: string): string; assembler;
asm
  push ds
  lds si, s
  les di, @result
  lodsb
  stosb
  xor ch, ch
  mov cl, al
  jcxz @empty
@upperloop:
  lodsb
  cmp al, 'a'
  jb @cont
  cmp al, 'z'
  ja @cont
  sub al, ' '
@cont:
  stosb
  loop @upperloop
@empty:
  pop ds
end;
function LowerCase(const S: string): string; assembler;
asm
  push ds
  lds si, s
  les di, @result
  lodsb
  stosb
  xor ch, ch
  mov cl, al
  jcxz @empty
@lowerloop:
  lodsb
  cmp al, 'A'
  jb @cont
  cmp al, 'Z'
  ja @cont
  add al, ' '
@cont:
  stosb
  loop @lowerloop
@empty:
  pop ds
end;
[Back to STRINGS SWAG index] [Back to Main SWAG index] [Original]