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

  1. (* TBTree16             Copyright (c)  1988,1989       Dean H. Farwell II    *)
  2.  
  3. unit Compare;
  4.  
  5. (*****************************************************************************)
  6. (*                                                                           *)
  7. (*             D A T A   C O M P A R I S O N   R O U T I N E S               *)
  8. (*                                                                           *)
  9. (*****************************************************************************)
  10.  
  11. (* This unit contains two routines which will compare two values and
  12.    determine whether the first value is LESSTHAN, EQUALTO, or GREATERTHAN the
  13.    second value.  The following predefined Turbo Pascal types are supported:
  14.  
  15.                    Byte
  16.                    ShortInt
  17.                    Integer
  18.                    LongInt
  19.                    Word
  20.                    String (any sizes)
  21.                    Real
  22.                    Single
  23.                    Double
  24.                    Extended
  25.                    Comp
  26.                    ByteArray
  27.  
  28.    Note - To use Single, Double, Extended and Comp (8087 types) you must
  29.    compile the unit using {$N+}.
  30.  
  31.    Additionally, the ByteArray type is also handled.  This type is defined in
  32.    the Numbers unit.
  33.  
  34.    This unit also contains three routines for determining if a substring
  35.    starts a target string, ends a target string, or is contained in a target
  36.    string.  These routines are placed in this unit, because the strings are
  37.    passed in as untyped parameters just like in the first two routines in
  38.    this unit.                                                                *)
  39.  
  40. (*\*)
  41. (* Version Information
  42.  
  43.    Version 1.1 - Added SubstringCompare routine
  44.  
  45.                - Added ContainsSubstring routine
  46.  
  47.                - Added StartsWithSubstring routine
  48.  
  49.                - Added EndsWithSubstring routine
  50.  
  51.    Version 1.2 - No Changes
  52.  
  53.    Version 1.3 - No Changes
  54.  
  55.    Version 1.4 - Moved the ValueType type definition from this unit to the
  56.                  Numbers unit in order to preclude a circular definition
  57.                  error.
  58.  
  59.                - Upgraded CompareValues to handle BYTEARRAYVALUEs
  60.  
  61.                - Fixed error in EndsWithSubstring routine.  Previously, a
  62.                  search for a string such as 'xxx' would not find a match for
  63.                  a string ending with 'xxxx' using this routine.  This has
  64.                  been corrected
  65.  
  66.                - Added the ContainsSubstringAtPosition routine
  67.  
  68.                - Now use an {$IFOPT N+} conditional compilation directive to
  69.                  handle 8087 types
  70.  
  71.    Version 1.5 - Changed code internally to use Inc and Dec where practical
  72.  
  73.    Version 1.6 - No Changes                                                  *)
  74.  
  75.  
  76. (*////////////////////////// I N T E R F A C E //////////////////////////////*)
  77.  
  78. interface
  79.  
  80. uses
  81.     ByteData,
  82.     Numbers;
  83.  
  84. type
  85.     Comparison = (LESSTHAN,EQUALTO,GREATERTHAN);
  86.  
  87.  
  88. (*\*)
  89. (* This routine will compare two values and return the result of the comparison.
  90.    The result is of type Comparison and LESSTHAN, EQUALTO, or GREATERTHAN will
  91.    be returned.  The values compared must be of the same type.  Legal types are
  92.    those enumerated in the type ValueType.  The type of the values is passed in
  93.    as a parameter along with the values.
  94.  
  95.    note : the values must reside in a variable since a var parameter is used.
  96.    This is necessary since the address is needed to facilitate the use of this
  97.    routine with multiple types.                                              *)
  98.  
  99. function CompareValues(var paramValue1;
  100.                        var paramValue2;
  101.                        vType : ValueType) : Comparison;
  102.  
  103.  
  104. (* This routine will compare two values of type STRINGVALUE and look for a
  105.    partial match.  The first parameter (paramValue1) contains a substring which
  106.    will be searched for in paramValue2.  The search is only to see if
  107.    paramValue2 starts with substring paramValue1.  If paramValue2 starts with
  108.    paramValue1 then EQUALTO will be returned.  Otherwise if paramValue1 is
  109.    less that paramValue2 then LESSTHAN will be returned.  If paramValue1 is
  110.    greater that paramValue2 then GREATERTHAN will be returned.               *)
  111.  
  112. function SubstringCompare(var paramValue1;
  113.                           var paramValue2) : Comparison;
  114.  
  115.  
  116. (* This routine will check to see if the substring passed in as paramValue1
  117.    is contained in the string passed in as paramValue2.  It will return TRUE
  118.    if paramValue1 is contained in paramValue2 and FALSE otherwise.           *)
  119.  
  120. function ContainsSubstring(var paramValue1;
  121.                            var paramValue2) : Boolean;
  122.  
  123.  
  124. (* This routine will check to see if the substring passed in as paramValue1
  125.    is contained in the string passed in as paramValue2 at the location in
  126.    paramValue2 specified by position.  In other words, it looks for a partial
  127.    string match at one particular location within the target string.  It will
  128.    return TRUE if paramValue1 is contained in paramValue2 at the specified
  129.    position and FALSE otherwise.                                              *)
  130.  
  131. function ContainsSubstringAtPosition(var paramValue1;
  132.                                      var paramValue2;
  133.                                      position : Byte) : Boolean;
  134.  
  135. (*\*)
  136. (* This routine will check to see if the substring passed in as paramValue1
  137.   starts the string passed in as paramValue2.  It will return TRUE if
  138.   paramValue1 starts paramValue2 and FALSE otherwise.                        *)
  139.  
  140.  
  141. function StartsWithSubstring(var paramValue1;
  142.                              var paramValue2) : Boolean;
  143.  
  144.  
  145. (* This routine will check to see if the substring passed in as paramValue1
  146.   ends the string passed in as paramValue2.  It will return TRUE if
  147.   paramValue1 ends paramValue2 and FALSE otherwise.                          *)
  148.  
  149. function EndsWithSubstring(var paramValue1;
  150.                            var paramValue2) : Boolean;
  151.  
  152. (*!*)
  153. (*\*)
  154. (*///////////////////// I M P L E M E N T A T I O N /////////////////////////*)
  155.  
  156. implementation
  157.  
  158. (* This routine will compare two values and return the result of the comparison.
  159.    The result is of type Comparison and LESSTHAN, EQUALTO, or GREATERTHAN will
  160.    be returned.  The values compared must be of the same type.  Legal types are
  161.    those enumerated in the type ValueType.  The type of the values is passed in
  162.    as a parameter along with the values.
  163.  
  164.    note : the values must reside in a variable since a var parameter is used.
  165.    This is necessary since the address is needed to facilitate the use of this
  166.    routine with multiple types.                                              *)
  167.  
  168. function CompareValues(var paramValue1;
  169.                        var paramValue2;
  170.                        vType : ValueType) : Comparison;
  171.  
  172. var
  173.     byteValue1        : Byte     absolute paramValue1;
  174.     byteValue2        : Byte     absolute paramValue2;
  175.     shortIntValue1    : ShortInt absolute paramValue1;
  176.     shortIntValue2    : ShortInt absolute paramValue2;
  177.     integerValue1     : Integer  absolute paramValue1;
  178.     integerValue2     : Integer  absolute paramValue2;
  179.     longIntValue1     : LongInt  absolute paramValue1;
  180.     longIntValue2     : LongInt  absolute paramValue2;
  181.     wordValue1        : Word     absolute paramValue1;
  182.     wordValue2        : Word     absolute paramValue2;
  183.     stringValue1      : String   absolute paramValue1;
  184.     stringValue2      : String   absolute paramValue2;
  185.     realValue1        : Real     absolute paramValue1;
  186.     realValue2        : Real     absolute paramValue2;
  187.     singleValue1      : Single   absolute paramValue1;
  188.     singleValue2      : Single   absolute paramValue2;
  189.     doubleValue1      : Double   absolute paramValue1;
  190.     doubleValue2      : Double   absolute paramValue2;
  191.     extendedValue1    : Extended absolute paramValue1;
  192.     extendedValue2    : Extended absolute paramValue2;
  193.     compValue1        : Comp     absolute paramValue1;
  194.     compValue2        : Comp     absolute paramValue2;
  195.     byteArrayValue1   : ByteArray absolute paramValue1;
  196.     byteArrayValue2   : ByteArray absolute paramValue2;
  197.  
  198.     cnt : ByteArrayRange;
  199.  
  200.     begin
  201.     case vType of
  202.         BYTEVALUE :
  203.             begin
  204.             if byteValue1 < byteValue2 then CompareValues := LESSTHAN
  205.             else if byteValue1 = byteValue2 then CompareValues := EQUALTO
  206.             else CompareValues := GREATERTHAN;
  207.             end;
  208.         SHORTINTVALUE :
  209.             begin
  210.             if shortIntValue1 < shortIntValue2 then CompareValues := LESSTHAN
  211.             else if shortIntValue1 = shortIntValue2 then CompareValues :=EQUALTO
  212.             else CompareValues := GREATERTHAN;
  213.             end;
  214.         INTEGERVALUE :
  215.             begin
  216.             if integerValue1 < integerValue2 then CompareValues := LESSTHAN
  217.             else if integerValue1 = integerValue2 then CompareValues := EQUALTO
  218.             else CompareValues := GREATERTHAN;
  219.             end;
  220.         LONGINTVALUE :
  221.             begin
  222.             if longIntValue1 < longIntValue2 then CompareValues := LESSTHAN
  223.             else if longIntValue1 = longIntValue2 then CompareValues := EQUALTO
  224.             else CompareValues := GREATERTHAN;
  225.             end;
  226.         WORDVALUE :
  227.             begin
  228.             if wordValue1 < wordValue2 then CompareValues := LESSTHAN
  229.             else if wordValue1 = wordValue2 then CompareValues := EQUALTO
  230.             else CompareValues := GREATERTHAN;
  231.             end;
  232.         STRINGVALUE:
  233.             begin
  234.             if stringValue1 < stringValue2 then CompareValues := LESSTHAN
  235.             else if stringValue1 = stringValue2 then CompareValues := EQUALTO
  236.             else CompareValues := GREATERTHAN;
  237.             end;
  238.         REALVALUE :
  239.             begin
  240.             if realValue1 < realValue2 then CompareValues := LESSTHAN
  241.             else if realValue1 = realValue2 then CompareValues := EQUALTO
  242.             else CompareValues := GREATERTHAN;
  243.             end;
  244. (*   The following types are only for 8087 - and are compiled only if the unit
  245.      is compiled using {$N+}                                                 *)
  246.  
  247. {$IFOPT N+}
  248.         SINGLEVALUE :
  249.             begin
  250.             if singleValue1 < singleValue2 then CompareValues := LESSTHAN
  251.             else if singleValue1 = singleValue2 then CompareValues := EQUALTO
  252.             else CompareValues := GREATERTHAN;
  253.             end;
  254.         DOUBLEVALUE :
  255.             begin
  256.             if doubleValue1 < doubleValue2 then CompareValues := LESSTHAN
  257.             else if doubleValue1 = doubleValue2 then CompareValues := EQUALTO
  258.             else CompareValues := GREATERTHAN;
  259.             end;
  260.         EXTENDEDVALUE :
  261.             begin
  262.             if extendedValue1 < extendedValue2 then CompareValues := LESSTHAN
  263.             else if extendedValue1 = extendedValue2 then CompareValues :=EQUALTO
  264.             else CompareValues := GREATERTHAN;
  265.             end;
  266.         COMPVALUE :
  267.             begin
  268.             if compValue1 < compValue2 then CompareValues := LESSTHAN
  269.             else if compValue1 = compValue2 then CompareValues := EQUALTO
  270.             else CompareValues := GREATERTHAN;
  271.             end;
  272. {$ENDIF}
  273.  
  274.         (* the following type was added in version 1.4 *)
  275.         BYTEARRAYVALUE :
  276.             begin
  277.             cnt := 1;
  278.             while TRUE do
  279.                 begin
  280.                 if byteArrayValue1[0] < cnt then
  281.                     begin
  282.                     if byteArrayValue2[0] < cnt then
  283.                         begin
  284.                         CompareValues := EQUALTO;
  285.                         end
  286.                     else
  287.                         begin
  288.                         CompareValues := LESSTHAN;
  289.                         end;
  290.                     Exit;
  291.                     end;
  292.                 if byteArrayValue2[0] < cnt then
  293.                     begin
  294.                     CompareValues := GREATERTHAN;
  295.                     Exit;
  296.                     end;
  297.                 if byteArrayValue1[cnt] < byteArrayValue2[cnt] then
  298.                     begin
  299.                     CompareValues := LESSTHAN;
  300.                     Exit;
  301.                     end;
  302.                 if byteArrayValue1[cnt] > byteArrayvalue2[cnt] then
  303.                     begin
  304.                     CompareValues := GREATERTHAN;
  305.                     Exit;
  306.                     end;
  307.                 if cnt = MAXBYTE then
  308.                     begin
  309.                     CompareValues := EQUALTO;
  310.                     Exit;
  311.                     end;
  312.                 Inc(cnt);
  313.                 end;
  314.             end;
  315.       end;                                        (* end of case statement *)
  316.     end;                                     (* end of CompareValues routine *)
  317.  
  318. (*\*)
  319. (* This routine will compare two values of type STRINGVALUE and look for a
  320.    partial match.  The first parameter (paramValue1) contains a substring which
  321.    will be searched for in paramValue2.  The search is only to see if
  322.    paramValue2 starts with substring paramValue1.  If paramValue2 starts with
  323.    paramValue1 then EQUALTO will be returned.  Otherwise if paramValue1 is
  324.    less that paramValue2 then LESSTHAN will be returned.  If paramValue1 is
  325.    greater that paramValue2 then GREATERTHAN will be returned.               *)
  326.  
  327. function SubstringCompare(var paramValue1;
  328.                           var paramValue2) : Comparison;
  329.  
  330. var
  331.     stringValue1 : String   absolute paramValue1;
  332.     stringValue2 : String   absolute paramValue2;
  333.  
  334.     begin
  335.     if Pos(stringValue2,stringValue1) = 1 then
  336.         begin
  337.         SubstringCompare := EQUALTO;
  338.         end
  339.     else
  340.         begin
  341.         if stringValue1 < stringValue2 then
  342.             begin
  343.             SubstringCompare := LESSTHAN;
  344.             end
  345.         else
  346.             begin
  347.             SubstringCompare := GREATERTHAN;
  348.             end;
  349.         end;
  350.     end;                                  (* end of SubstringCompare routine *)
  351.  
  352. (*\*)
  353. (* This routine will check to see if the substring passed in as paramValue1
  354.    is contained in the string passed in as paramValue2.  It will return TRUE
  355.    if paramValue1 is contained in paramValue2 and FALSE otherwise.           *)
  356.  
  357. function ContainsSubstring(var paramValue1;
  358.                            var paramValue2) : Boolean;
  359.  
  360. var
  361.     stringValue1 : String   absolute paramValue1;
  362.     stringValue2 : String   absolute paramValue2;
  363.  
  364.     begin
  365.     if Pos(stringValue1,stringValue2) > 0 then
  366.         begin
  367.         ContainsSubstring := TRUE;
  368.         end
  369.     else
  370.         begin
  371.         ContainsSubstring := FALSE;
  372.         end;
  373.     end;                                 (* end of ContainsSubstring routine *)
  374.  
  375.  
  376. (* This routine will check to see if the substring passed in as paramValue1
  377.    is contained in the string passed in as paramValue2 at the location in
  378.    paramValue2 specified by position.  In other words, it looks for a partial
  379.    string match at one particular location within the target string.  It will
  380.    return TRUE if paramValue1 is contained in paramValue2 at the specified
  381.    position and FALSE otherwise.                                              *)
  382.  
  383. function ContainsSubstringAtPosition(var paramValue1;
  384.                                      var paramValue2;
  385.                                      position : Byte) : Boolean;
  386.  
  387. var
  388.     stringValue1 : String   absolute paramValue1;
  389.     stringValue2 : String   absolute paramValue2;
  390.     tempString   : String;
  391.  
  392.     begin
  393.     tempString := Copy(stringValue2,position,Length(stringValue1));
  394.     if stringValue1 = tempString then
  395.         begin
  396.         ContainsSubstringAtPosition := TRUE;
  397.         end
  398.     else
  399.         begin
  400.         ContainsSubstringAtPosition := FALSE;
  401.         end;
  402.     end;                       (* end of ContainsSubstringAtPosition routine *)
  403.  
  404. (*\*)
  405. (* This routine will check to see if the substring passed in as paramValue1
  406.   starts the string passed in as paramValue2.  It will return TRUE if
  407.   paramValue1 starts paramValue2 and FALSE otherwise.                        *)
  408.  
  409. function StartsWithSubstring(var paramValue1;
  410.                              var paramValue2) : Boolean;
  411.  
  412. var
  413.     stringValue1 : String   absolute paramValue1;
  414.     stringValue2 : String   absolute paramValue2;
  415.  
  416.     begin
  417.     if Pos(stringValue1,stringValue2) = 1 then
  418.         begin
  419.         StartsWithSubstring := TRUE;
  420.         end
  421.     else
  422.         begin
  423.         StartsWithSubstring := FALSE;
  424.         end;
  425.     end;                                (* end of StartsWithSubstring routine *)
  426.  
  427.  
  428. (* This routine will check to see if the substring passed in as paramValue1
  429.   ends the string passed in as paramValue2.  It will return TRUE if
  430.   paramValue1 ends paramValue2 and FALSE otherwise.                          *)
  431.  
  432. function EndsWithSubstring(var paramValue1;
  433.                            var paramValue2) : Boolean;
  434.  
  435. var
  436.     stringValue1 : String   absolute paramValue1;
  437.     stringValue2 : String   absolute paramValue2;
  438.     tempString   : String;
  439.  
  440.     begin
  441.     tempString := Copy(stringValue2,
  442.                        (Length(stringValue2) - Length(stringValue1)) + 1,
  443.                        Length(stringValue1));
  444.     if stringValue1 = tempString then
  445.         begin
  446.         EndsWithSubstring := TRUE;
  447.         end
  448.     else
  449.         begin
  450.         EndsWithSubstring := FALSE;
  451.         end;
  452.     end;                                 (* end of EndsWithSubstring routine *)
  453.  
  454. end.                                                  (* end of Compare unit *)
  455.