[Back to STRINGS SWAG index] [Back to Main SWAG index] [Original]
{
In SWAG9408, Jose Campione provided TXLATE5, a fast case conversion
procedure. In response to the included request for suggestions and
improvements, please find attached my uppercase translation procedure,
which although very similar, is approx 10-15% faster. This is
primarily achieved by using DEC CX and JNZ @Dest instead of LOOP @Dest
in the conversion loop (much faster on 386/486's).
Feel free to include the source code in the next SWAG release if you
wish to.
====================================================================
}
UNIT XLAT;
{$S-}
INTERFACE
VAR
Upper : ARRAY[Char] OF Char; {Uppercase Translation Table}
{
This case translation table is initialised according to the country
code information specified in the CONFIG.SYS file (DOS 4.0+).
For older DOS versions, the standard character translations are used.
The 'Upper' array may also be accessed directly, eg: Ch := Upper['x'].
This is the fastest possible replacement for the Upcase() function.
}
PROCEDURE MakeUppercase(VAR S : String);
IMPLEMENTATION
PROCEDURE MakeUppercase(VAR S : String); ASSEMBLER;
ASM
LES DI,S
MOV CL,ES:[DI]
AND CX,00FFh
JZ @@Done
MOV BX,Offset Upper
@@Loop:
INC DI
MOV AL,ES:[DI]
XLAT
MOV ES:[DI],AL
DEC CX
JNZ @@Loop
@@Done:
END;
{-Non Interfaced Routines (Initialise translation table)------------}
FUNCTION DosMajorVersion : Byte;
{-Return DOS Major Version Number}
INLINE(
$B4/$30/ {mov ah,$30}
$CD/$21); {int $21}
PROCEDURE SetCountrySpecificUppercase;
{-Convert 'Upper' into its country specific uppercase equivalent}
INLINE(
$BA/>Upper/ {mov dx,Upper}
$B9/>256/ {mov cx,256}
$B8/>$6521/ {mov ax,$6521}
$CD/$21); {int $21}
PROCEDURE InitialiseCaseConversion;
VAR
C : Char;
BEGIN
FOR C := #0 TO #255 DO
Upper[C] := C;
IF DosMajorVersion < 4 THEN
FOR C := #0 TO #255 DO
Upper[C] := System.UpCase(C) {Use Standard Case Conversion}
ELSE
SetCountrySpecificUppercase; {Use International Case Conversion}
END; {InitialiseCaseConversion}
{=Unit Initialisation==============================================}
BEGIN
InitialiseCaseConversion;
END.
[Back to STRINGS SWAG index] [Back to Main SWAG index] [Original]