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

    {***********************************************************************}
    UNIT Strings;           {  String Conversion Routines,                  }
                            {  Last Updated Dec 07/93                       }
                            {  Copyright (C) 1993, Greg Estabrooks          }
                            {  NOTE: Requires TP 6.0+ to compile.           }
    INTERFACE
    (************************************************************************)
    CONST
         HexList :ARRAY[0..15] OF CHAR ='0123456789ABCDEF';

    FUNCTION BHex( V :BYTE ) :STRING;
    FUNCTION WHex( V :WORD ) :STRING;
    FUNCTION LHex( Long :LONGINT ) :STRING;
    PROCEDURE UpperCase( VAR UpStr :STRING );
    PROCEDURE LowerCase( VAR LoStr :STRING );

    IMPLEMENTATION
    (************************************************************************)
    FUNCTION HiWord( Long :LONGINT ) :WORD; ASSEMBLER;
                          { Routine to return high word of a LongInt.       }
    ASM
      Mov AX,Long.WORD[2]              { Move High word into AX.            }
    END;

    FUNCTION LoWord( Long :LONGINT ) :WORD; ASSEMBLER;
                          { Routine to return low word of a LongInt.        }
    ASM
      Mov AX,Long.WORD[0]              { Move low word into AX.             }
    END;

    FUNCTION BHex( V :BYTE ) :STRING;
                           { Routine to convert a byte to a Hex string.     }
    BEGIN
      BHex := HexList[V Shr 4] + HexList[V Mod 16];
    END;

    FUNCTION WHex( V :WORD ) :STRING;
                           { Routine to convert a word to a Hex string.     }
    BEGIN
      WHex := Bhex(Hi(V)) + BHex(Lo(V));
    END;

    FUNCTION LHex( Long :LONGINT ) :STRING;
                           { Routine to convert a longint to a Hex string.  }
    BEGIN
      LHex := WHex(HiWord(Long))+WHex(LoWord(Long));
    END;

    PROCEDURE UpperCase( VAR UpStr :STRING ); ASSEMBLER;
                         {  Routine to convert string to uppercase          }
    ASM
      Push ES                       {  Save Registers to be used            }
      Push DI
      Push CX
      LES DI,UpStr                  {  Point ES:DI to string to be converted}
      Sub CX,CX                     {  Clear CX                             }
      Mov CL,ES:[DI]                {  Load Length of string for looping    }
      Cmp CX,0                      {  Check for a clear string             }
      JE @Exit                      {  If it was then exit                  }
    @ReadStr:
      Inc DI                        {  Point to next Character              }
      Cmp BYTE PTR ES:[DI],'z'      {  If Character above 'z' jump to end of}
      Ja @LoopEnd                   {  loop.                                }
      Cmp BYTE PTR ES:[DI],'a'      {  if below 'a' jump to end of loop.    }
      Jb @LoopEnd
      Sub BYTE PTR ES:[DI],32       {  If not make it upper case            }
    @LoopEnd:
      Loop @ReadStr                 {  Loop Until done                      }
    @Exit:
      Pop CX                        {  Restore registers                    }
      Pop DI
      Pop ES
    END;{UpperCase}

    PROCEDURE LowerCase( VAR LoStr :STRING ); ASSEMBLER;
                         {  Routine to convert a string to lower case       }
    ASM
      Push ES                       {  Save Registers to be used            }
      Push DI
      Push CX
      LES DI,LoStr                  {  Point ES:DI to string to be converted}
      Sub CX,CX                     {  Clear CX                             }
      Mov CL,ES:[DI]                {  Load Length of string for looping    }
      Cmp CX,0                      {  Check for a clear string             }
      JE @Exit                      {  If it was then exit                  }
    @ReadStr:
      Inc DI                        {  Point to next Character              }
      Cmp BYTE PTR ES:[DI],'Z'      {  If Character above 'Z' jump to end of}
      Ja @LoopEnd                   {  loop.                                }
      Cmp BYTE PTR ES:[DI],'A'      {  if below 'A' jump to end of loop.    }
      Jb @LoopEnd
      Add BYTE PTR ES:[DI],32       {  If not make it Lower case            }
    @LoopEnd:
      Loop @ReadStr                 {  Loop Until done                      }
    @Exit:
      Pop CX                        {  Restore registers                    }
      Pop DI
      Pop ES
    END;{LowerCase}

    BEGIN
    END.
    {***********************************************************************}

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