home *** CD-ROM | disk | FTP | other *** search
/ World of Shareware - Software Farm 2 / wosw_2.zip / wosw_2 / PASCAL / TBTREE16.ZIP / STRINGS.PAS < prev    next >
Pascal/Delphi Source File  |  1989-07-13  |  5KB  |  130 lines

  1. (* TBTree16             Copyright (c)  1988,1989       Dean H. Farwell II    *)
  2.  
  3. unit Strings;
  4.  
  5. (*****************************************************************************)
  6. (*                                                                           *)
  7. (*            A D D I T I O N A L  S T R I N G  R O U T I N E S              *)
  8. (*                                                                           *)
  9. (*****************************************************************************)
  10.  
  11.  
  12. (* Although Turbo has some string handling routines, there are many others
  13.    which would prove useful.  Here are but a few.                            *)
  14.  
  15. (* Version Information
  16.  
  17.    Version 1.1 - No Changes
  18.  
  19.    Version 1.2 - No Changes
  20.  
  21.    Version 1.3 - No Changes
  22.  
  23.    Version 1.4 - Added MAXSTRINGLENGTH constant
  24.  
  25.                - Added StringLengthRange type
  26.  
  27.    Version 1.5 - The TotalString routine was rewritten in assembler (Inline)
  28.                  to significantly increase performance
  29.  
  30.                - Added Asciiz2Str routine
  31.  
  32.    Version 1.6 - No Changes                                                  *)
  33.  
  34. (*\*)
  35. (*////////////////////////// I N T E R F A C E //////////////////////////////*)
  36.  
  37. interface
  38.  
  39. uses
  40.     Numbers;
  41.  
  42. const
  43.     MAXSTRINGLENGTH = 255;                     (* max characters in a string *)
  44.  
  45. type
  46.     StringLengthRange = 0 .. MAXSTRINGLENGTH;  (* range of number of
  47.                                                   characters in a string     *)
  48.  
  49.  
  50. (* Takes a string and adds up the integer value of each individual byte.
  51.    This total can be used to randomize the string for Hashing, etc.          *)
  52.  
  53. function TotalString(var str : String) : Word;
  54.  
  55.  
  56. (*  This routine returns the last n characters of a  string                  *)
  57.  
  58. procedure EndOfString(var str : String;
  59.                      n : Byte;
  60.                      var resultStr : String);
  61.  
  62.  
  63. (* This routine converts a string from ASCIIZ (null delimined) to Turbo Pascal
  64.    format                                                                    *)
  65.  
  66. function Asciiz2Str(var aStr) : string;
  67.  
  68. (*!*)
  69. (*\*)
  70. (*///////////////////// I M P L E M E N T A T I O N /////////////////////////*)
  71.  
  72. implementation
  73.  
  74.  
  75. (* Takes a string and adds up the integer value of each individual byte.
  76.    This total can be used to randomize the string for Hashing, etc.          *)
  77.  
  78. function TotalString(var str : String ) : Word;
  79.  
  80.     begin
  81.     Inline($31/$C0/      (*  xor   ax,ax              ; zero out accumulator *)
  82.            $31/$C9/      (*  xor   cx,cx              ; zero out counter     *)
  83.            $C4/$BE/>STR/ (*  les   di, >str[bp]       ; load pointer to str  *)
  84.            $26/$8A/$0D/  (* es: mov   cl,[di]         ;                      *)
  85.                          (* CountLoop:                                       *)
  86.            $47/          (*  inc   di                 ; next char            *)
  87.            $26/$02/$05/  (* es: add   al,[di]         ; add value of char    *)
  88.            $80/$D4/$00/  (*  adc   ah,0               ; add carry
  89.                                                         if required          *)
  90.            $E2/$F7/      (*  loop  CountLoop          ; get next char        *)
  91.            $89/$46/$FE); (*  mov   [bp-02],ax         ; put total on stack   *)
  92.  
  93.     end;                                      (* end of TotalString routine  *)
  94.  
  95.  
  96. (*  This routine returns the last n characters of a  string                    *)
  97.  
  98. procedure EndOfString(var str : String;
  99.                       n : Byte;
  100.                       var resultStr : String);
  101.  
  102.  
  103.     begin
  104.     resultStr := Copy(str,(Length(str) - n + 1),n);
  105.     end;                                       (* end of EndOfString routine *)
  106.  
  107. (*\*)
  108. (* This routine converts a string from ASCIIZ (null delimined) to Turbo Pascal
  109.    format                                                                    *)
  110.  
  111. function Asciiz2Str(var aStr) : string;
  112.  
  113. var str : String;
  114.     ctr : Word;
  115.     az: Array[1 .. MAXSTRINGLENGTH] of Char absolute aStr;
  116.  
  117.     begin
  118.     ctr := 1;
  119. {$B-}                           (* short circuit boolean evaluation required *)
  120.     while (ctr <= MAXSTRINGLENGTH) and (az[ctr] <> #0) do
  121.         begin
  122.         str[ctr] := az[ctr];
  123.         Inc(ctr);
  124.         end;
  125.     str[0] := Chr(ctr-1);
  126.     Asciiz2Str := str;
  127.     end;                                         (* end of Ascii2Str routine *)
  128.  
  129. end.                                                  (* end of Strings unit *)
  130.