DataMuseum.dk

Presents historical artifacts from the history of:

RC4000/8000/9000

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about RC4000/8000/9000

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦3816ab508⟧ TextFile

    Length: 4608 (0x1200)
    Types: TextFile
    Names: »compare4tx  «

Derivation

└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code
    └─⟦75ff9bef3⟧ 
        └─⟦this⟧ »compare4tx  « 

TextFile

\f



<* compare_text                                            page ...1...

1981 10 08 *>

external
integer procedure compare_text (tx1, tx2, chars);
long    array                   tx1, tx2        ;
integer                                   chars ;

<**********************************************************************>
<*                                                                    *>
<* The procedure compares two text strings stored as 8-bit characters *>
<* in two long arrays tx1 and tx2.                                    *>
<*                                                                    *>
<* Call:                                                              *>
<*                                                                    *>
<*   compare_text (tx1, tx2, chars);                                  *>
<*                                                                    *>
<*   compare_text  (return, integer). The result of the comparison :  *>
<*                  0 : tx1 = tx2                                     *>
<*                  1 : tx1 < tx2                                     *>
<*                 -1 : tx1 > tx2                                     *>
<*                                                                    *>
<*   tx1, tx2      (call  , long arrays). each of the two arrays is   *>
<*                 supposed to contain a string of 8-bit characters   *>
<*                 starting at the first character of the element     *>
<*                 with index 1.                                      *>
<*                                                                    *>
<*   chars         (call and return, integer). The call value denotes *>
<*                 the maximum number of characters to be compared.   *>
<*                 The call value may be <= 0 meaning number of char- *>
<*                 acters in the shortest array.                      *>
<*                 The return value will be the field address of the  *>
<*                 word at wich the comparison stopped.               *>
<*                                                                    *>
<* Function :                                                         *>
<*                                                                    *>
<*   The contents of tx1 and tx2 are compared, word by word (24 bits).*>
<*   The comparison involves at most 'chars' characters, but the com- *>
<*   parison stops as soon as a difference between the strings is en- *>
<*   countered or the last character of a word contains a null char-  *>
<*   acter or when the upper index of one of the arrays is reached.   *>
<*                                                                    *>
<**********************************************************************>

\f



<* compare_text                                            page ...2...

1981 10 08 *>

begin

  integer             chars_exceeding, hw, i1, i2, l1, l2, u1, u2, m1, m2 ;
  integer       field wf                                                 ;
  
  l1 := system (3, u1, tx1); <*array bounds*>
  l2 := system (3, u2, tx2);

  m1 := 6 * (u1-l1+1); <*no of chars in tx1*>
  m2 := 6 * (u2-l2+1); <*   -do-     in tx2*>

  if chars <= 0 or chars > m1 or chars > m2 then
  chars := (if m1 < m2 then m1 else m2); <*outside bounds => shortest*>

  hw := (chars+2)//3 * 2; <*chars characters extending in hw halfwords*>

  wf := 0;

  for wf := wf+2 while     wf < hw
                   and tx1.wf = tx2.wf
                   and tx1.wf extract 8 <> 0 do <*nothing*> ;

  i1 := tx1.wf; <*word to be examined*>
  i2 := tx2.wf;

  if wf = hw then
  begin <*last word remains to be compared, not neccessarily all chars*>
    chars_exceeding := (3 - chars mod 3) mod 3; <*chars to be shifted out*>
    i1 := i1 shift (-8*chars_exceeding);
    i2 := i2 shift (-8*chars_exceeding);
  end;

  compare_text :=
  if extend 0 add i1 = extend 0 add i2 then 0 else
  if extend 0 add i1 > extend 0 add i2 then 1 else -1;
  <*long comparison to avoid integer exception by comparison*>

  chars := wf; <*field address of last word in comparison*>

end procedure compare_text;
end;


▶EOF◀