home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / TURBOPAS / TP-UTIL.ARK / KSEARCH.SRC < prev    next >
Text File  |  1986-01-06  |  2KB  |  47 lines

  1. {>>>>KEY_SEARCH<<<<}
  2.  
  3. FUNCTION KEY_SEARCH(VAR KEYS     : KEY_FILE;
  4.                     VAR KEY_REF  : INTEGER;
  5.                         MATCH_IT : STRING80) : BOOLEAN;
  6.  
  7. VAR HI,LO,MID   : INTEGER;
  8.     REC_COUNT   : INTEGER;
  9.     SEARCH_REC  : KEY_REC;
  10.     FOUND       : BOOLEAN;
  11.     COLLIDED    : BOOLEAN;
  12.  
  13. BEGIN
  14.   KEY_REF := 0;
  15.   REC_COUNT := FILESIZE(KEYS);
  16.   HI := REC_COUNT;
  17.   LO := 0;
  18.   KEY_SEARCH := FALSE; FOUND := FALSE; COLLIDED := FALSE;
  19.  
  20.   MID := (LO + HI) DIV 2;    { Calc first midpoint }
  21.  
  22.   IF REC_COUNT > 0 THEN      { Don't search if file is empty }
  23.     REPEAT
  24.       SEEK(KEYS,MID);
  25.       READ(KEYS,SEARCH_REC);
  26.  
  27.            { Was there a collision between MID & LO or MID & HI? }
  28.       IF (LO = MID) OR (HI = MID) THEN COLLIDED := TRUE;
  29.       IF MATCH_IT = SEARCH_REC.KEY THEN  { Found it! }
  30.         BEGIN
  31.           FOUND := TRUE;             { Set found flag... }
  32.           KEY_SEARCH := TRUE;        { ...and function value... }
  33.           KEY_REF := SEARCH_REC.REF  { ...and key into data file }
  34.         END
  35.       ELSE                  { No luck...divide and try again... }
  36.         BEGIN
  37.           IF MATCH_IT > SEARCH_REC.KEY THEN LO := MID
  38.             ELSE HI := MID;             { Halve the field }
  39.           MID := (LO + HI) DIV 2;       { Recalc the midpoint }
  40.           KEY_REF := MID                { Save MID in KEY_REF }
  41.         END
  42.     UNTIL COLLIDED OR FOUND
  43.   END;
  44.              }
  45. {--------------------------------------------------------------}
  46.  
  47. PROCEDURE GetDat