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 / SHOWNAME.PAS < prev    next >
Pascal/Delphi Source File  |  1986-01-06  |  5KB  |  146 lines

  1. {-----------------------------}
  2. {           SHOWNAME          }
  3. {     by Jeff Duntemann       }
  4. {                             }
  5. { Binary search demo program  }
  6. {                             }
  7. {      Turbo Pascal V2.0      }
  8. {      Last Update 1/4/85     }
  9. {-----------------------------}
  10.  
  11. { Unlike most programs in this book, this program requires two }
  12. { external files to operate: FRIENDS.NAP and FRIENDS.KEY.  The }
  13. { two files will be included on the source listings diskette.  }
  14. { FRIENDS.NAP is a file of NAPREC containing some number of    }
  15. { name/address/phone records.  FRIENDS.KEY is a sorted key     }
  16. { file containing keys extracted from FRIENDS.NAP.  You can    }
  17. { write a utility to extract keys from a .NAP file and sort    }
  18. { them using either the SHELLSORT or QUIKSORT procedures given }
  19. { in Section 14. }
  20.  
  21.  
  22. PROGRAM SHOWNAME;
  23.  
  24.  
  25. TYPE STRING3     = STRING[3];
  26.      STRING6     = STRING[6];
  27.      STRING30    = STRING[30];
  28.      STRING40    = STRING[40];
  29.      STRING80    = STRING[80];
  30.      STRING255   = STRING[255];
  31.      PARM_ARRAY  = ARRAY[1..10] OF STRING40;
  32.  
  33.      NAPREC = RECORD
  34.                 NAME    : STRING30;
  35.                 ADDRESS : STRING30;
  36.                 CITY    : STRING30;
  37.                 STATE   : STRING3;
  38.                 ZIP     : STRING6
  39.               END;
  40.  
  41.      NAPFILE = FILE OF NAPREC;
  42.  
  43.      KEY_REC = RECORD
  44.                  REF : INTEGER;
  45.                  KEY : STRING30
  46.                END;
  47.  
  48.      KEY_FILE = FILE OF KEY_REC;
  49.  
  50.  
  51. VAR I,J,K     : INTEGER;
  52.     RAM_TAIL  : STRING[128] ABSOLUTE CSEG : $80;
  53.     PARMS     : PARM_ARRAY;  { Holds command line parameters }
  54.     RECNUM    : INTEGER;
  55.     WORKREC   : NAPREC;
  56.     WORKFILE  : NAPFILE;
  57.     WORKKEY   : KEY_FILE;
  58.  
  59.  
  60. {$I STRIPWHT.SRC }   { Described in Section 15.1 }
  61.  
  62. {$I PARSTAIL.SRC }   { Described in Section 15.2 }
  63.  
  64.  
  65. {>>>>KEY_SEARCH<<<<}
  66.  
  67. FUNCTION KEY_SEARCH(VAR KEYS     : KEY_FILE;
  68.                     VAR KEY_REF  : INTEGER;
  69.                         MATCH_IT : STRING80) : BOOLEAN;
  70.  
  71. VAR HI,LO,MID   : INTEGER;
  72.     REC_COUNT   : INTEGER;
  73.     SEARCH_REC  : KEY_REC;
  74.     FOUND       : BOOLEAN;
  75.     COLLIDED    : BOOLEAN;
  76.  
  77. BEGIN
  78.   KEY_REF := 0;
  79.   REC_COUNT := FILESIZE(KEYS);
  80.   HI := REC_COUNT;
  81.   LO := 0;
  82.   KEY_SEARCH := FALSE; FOUND := FALSE; COLLIDED := FALSE;
  83.  
  84.   MID := (LO + HI) DIV 2;    { Calc first midpoint }
  85.  
  86.   IF REC_COUNT > 0 THEN      { Don't search if file is empty }
  87.     REPEAT
  88.       SEEK(KEYS,MID);
  89.       READ(KEYS,SEARCH_REC);
  90.  
  91.            { Was there a collision between MID & LO or MID & HI? }
  92.       IF (LO = MID) OR (HI = MID) THEN COLLIDED := TRUE;
  93.       IF MATCH_IT = SEARCH_REC.KEY THEN  { Found it! }
  94.         BEGIN
  95.           FOUND := TRUE;             { Set found flag... }
  96.           KEY_SEARCH := TRUE;        { ...and function value... }
  97.           KEY_REF := SEARCH_REC.REF  { ...and key into data file }
  98.         END
  99.       ELSE                  { No luck...divide and try again... }
  100.         BEGIN
  101.           IF MATCH_IT > SEARCH_REC.KEY THEN LO := MID
  102.             ELSE HI := MID;             { Halve the field }
  103.           MID := (LO + HI) DIV 2;       { Recalc the midpoint }
  104.           KEY_REF := MID                { Save MID in KEY_REF }
  105.         END
  106.     UNTIL COLLIDED OR FOUND
  107.   END;
  108.  
  109.  
  110. { SHOWNAME MAIN }
  111.  
  112. BEGIN
  113.   CLRSCR;
  114.   GOTOXY(1,10);
  115.   PARSE_TAIL(I,PARMS);     { Parse the command tail }
  116.   IF I < 1 THEN            { Missing parms error }
  117.     BEGIN
  118.       WRITELN('<<Error!>> You must enter a name on the command line:');
  119.       WRITELN('           A>SHOWNAME Duntemann*Jeff ')
  120.     END
  121.   ELSE
  122.     BEGIN
  123.       ASSIGN(WORKFILE,'FRIENDS.NAP');  { Open the names data file }
  124.       RESET(WORKFILE);
  125.       ASSIGN(WORKKEY,'FRIENDS.KEY');   { Open the names key file }
  126.       RESET(WORKKEY);
  127.       IF KEY_SEARCH(WORKKEY,RECNUM,PARMS[1]) THEN  { If key is found...}
  128.         BEGIN                          { We have record # into data file }
  129.           SEEK(WORKFILE,RECNUM);       { Seek to record # in data file }
  130.           READ(WORKFILE,WORKREC);      { Read data record from data file }
  131.           WITH WORKREC DO              { and display the name/address data }
  132.             BEGIN
  133.               WRITELN('>>NAME    : ',NAME);
  134.               WRITELN('  ADDRESS : ',ADDRESS);
  135.               WRITELN('  CITY    : ',CITY);
  136.               WRITELN('  STATE   : ',ZIP);
  137.             END
  138.         END
  139.       ELSE
  140.         WRITELN('>>Sorry, ',PARMS[1],' not found.');
  141.     END
  142. END.
  143. OPY EVEN LINES
  144. ;
  145.     MOV     CX,HALFSC        ; PREPARE LOOP COUNTER
  146. EVEN:    MOV    DX,CX            ; RE