``````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]