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 >
Wrap
Pascal/Delphi Source File
|
1986-01-06
|
5KB
|
146 lines
{-----------------------------}
{ SHOWNAME }
{ by Jeff Duntemann }
{ }
{ Binary search demo program }
{ }
{ Turbo Pascal V2.0 }
{ Last Update 1/4/85 }
{-----------------------------}
{ Unlike most programs in this book, this program requires two }
{ external files to operate: FRIENDS.NAP and FRIENDS.KEY. The }
{ two files will be included on the source listings diskette. }
{ FRIENDS.NAP is a file of NAPREC containing some number of }
{ name/address/phone records. FRIENDS.KEY is a sorted key }
{ file containing keys extracted from FRIENDS.NAP. You can }
{ write a utility to extract keys from a .NAP file and sort }
{ them using either the SHELLSORT or QUIKSORT procedures given }
{ in Section 14. }
PROGRAM SHOWNAME;
TYPE STRING3 = STRING[3];
STRING6 = STRING[6];
STRING30 = STRING[30];
STRING40 = STRING[40];
STRING80 = STRING[80];
STRING255 = STRING[255];
PARM_ARRAY = ARRAY[1..10] OF STRING40;
NAPREC = RECORD
NAME : STRING30;
ADDRESS : STRING30;
CITY : STRING30;
STATE : STRING3;
ZIP : STRING6
END;
NAPFILE = FILE OF NAPREC;
KEY_REC = RECORD
REF : INTEGER;
KEY : STRING30
END;
KEY_FILE = FILE OF KEY_REC;
VAR I,J,K : INTEGER;
RAM_TAIL : STRING[128] ABSOLUTE CSEG : $80;
PARMS : PARM_ARRAY; { Holds command line parameters }
RECNUM : INTEGER;
WORKREC : NAPREC;
WORKFILE : NAPFILE;
WORKKEY : KEY_FILE;
{$I STRIPWHT.SRC } { Described in Section 15.1 }
{$I PARSTAIL.SRC } { Described in Section 15.2 }
{>>>>KEY_SEARCH<<<<}
FUNCTION KEY_SEARCH(VAR KEYS : KEY_FILE;
VAR KEY_REF : INTEGER;
MATCH_IT : STRING80) : BOOLEAN;
VAR HI,LO,MID : INTEGER;
REC_COUNT : INTEGER;
SEARCH_REC : KEY_REC;
FOUND : BOOLEAN;
COLLIDED : BOOLEAN;
BEGIN
KEY_REF := 0;
REC_COUNT := FILESIZE(KEYS);
HI := REC_COUNT;
LO := 0;
KEY_SEARCH := FALSE; FOUND := FALSE; COLLIDED := FALSE;
MID := (LO + HI) DIV 2; { Calc first midpoint }
IF REC_COUNT > 0 THEN { Don't search if file is empty }
REPEAT
SEEK(KEYS,MID);
READ(KEYS,SEARCH_REC);
{ Was there a collision between MID & LO or MID & HI? }
IF (LO = MID) OR (HI = MID) THEN COLLIDED := TRUE;
IF MATCH_IT = SEARCH_REC.KEY THEN { Found it! }
BEGIN
FOUND := TRUE; { Set found flag... }
KEY_SEARCH := TRUE; { ...and function value... }
KEY_REF := SEARCH_REC.REF { ...and key into data file }
END
ELSE { No luck...divide and try again... }
BEGIN
IF MATCH_IT > SEARCH_REC.KEY THEN LO := MID
ELSE HI := MID; { Halve the field }
MID := (LO + HI) DIV 2; { Recalc the midpoint }
KEY_REF := MID { Save MID in KEY_REF }
END
UNTIL COLLIDED OR FOUND
END;
{ SHOWNAME MAIN }
BEGIN
CLRSCR;
GOTOXY(1,10);
PARSE_TAIL(I,PARMS); { Parse the command tail }
IF I < 1 THEN { Missing parms error }
BEGIN
WRITELN('<<Error!>> You must enter a name on the command line:');
WRITELN(' A>SHOWNAME Duntemann*Jeff ')
END
ELSE
BEGIN
ASSIGN(WORKFILE,'FRIENDS.NAP'); { Open the names data file }
RESET(WORKFILE);
ASSIGN(WORKKEY,'FRIENDS.KEY'); { Open the names key file }
RESET(WORKKEY);
IF KEY_SEARCH(WORKKEY,RECNUM,PARMS[1]) THEN { If key is found...}
BEGIN { We have record # into data file }
SEEK(WORKFILE,RECNUM); { Seek to record # in data file }
READ(WORKFILE,WORKREC); { Read data record from data file }
WITH WORKREC DO { and display the name/address data }
BEGIN
WRITELN('>>NAME : ',NAME);
WRITELN(' ADDRESS : ',ADDRESS);
WRITELN(' CITY : ',CITY);
WRITELN(' STATE : ',ZIP);
END
END
ELSE
WRITELN('>>Sorry, ',PARMS[1],' not found.');
END
END.
OPY EVEN LINES
;
MOV CX,HALFSC ; PREPARE LOOP COUNTER
EVEN: MOV DX,CX ; RE