{A NAME AND ADDRESS PROGRAM BY:  CRAIG RUDLIN, M.D.
                                202 OVERLOOK ROAD
                                RICHMOND, VIRGINIA 23229


VERSION 3.0}








PROGRAM NAD; {$P}

CONST
CITY_ONE = 'RICHMOND          ';
STATE_ONE = 'VIRGINIA  ';
CITY_TWO = 'BOSTON            ';
STATE_TWO = 'MASS      ';


TYPE

       MAILING = RECORD
               NAME:ARRAY[1..30] OF CHAR;
               STREET_NUMBER:ARRAY[1..6] OF CHAR;
               STREET: ARRAY[1..20] OF CHAR;
               CITY: ARRAY[1..18] OF CHAR;
               STATE:ARRAY[1..10] OF CHAR;
               ZIP:ARRAY[1..10] OF CHAR;
               ATTENTION:ARRAY[1..30] OF CHAR;
               ACCT_NUMBER:ARRAY[1..4] OF CHAR;
               END;

       ALPHABET =      RECORD
                       START:INTEGER;
                       FINISH:INTEGER;
                       END;
FA=FILE OF ALPHABET;

F = FILE OF MAILING;
$STRING80 = STRING 80;
$STRING0  = STRING 0;
$STRING255 = STRING 255;
$STRING14 = STRING 14;

TR = ARRAY [1..4] OF CHAR;

VAR
FIN: F;
FALP:FA;
COUNTER,I,N:INTEGER;
INFORMATION: MAILING;
NUMBER_OF_RECORDS: INTEGER;

NA,ST_NO,ST,CIT,STA,ZI,ATT: $STRING80;

COR_FLAG,FINISH,CONTINUE,NEWFILE,LISTING: BOOLEAN;
ANSWER:CHAR;
ALPFILE,SORTFILE,FILENAM:$STRING14;

REC_NUMBER,END_OF_FILE:INTEGER;
DESIRED_NAME:ARRAY[1..30] OF CHAR;
DES_NAM:$STRING80;
FOUND:BOOLEAN;

CHANGE_RECORD,DELETE_RECORD,FIND_RECORD,ADD_TO_FILE:BOOLEAN;

PROCEDURE SETLENGTH(VAR X: $STRING0; Y:INTEGER);EXTERNAL;
FUNCTION LENGTH(X:$STRING255):INTEGER;EXTERNAL;


PROCEDURE CLEAR_SCREEN;
BEGIN
WRITE (CHR(27),'*',CHR(0),CHR(0),CHR(0),CHR(0));
END;

PROCEDURE ERASE_LINES(STARTING_LINE,NUMBER_OF_LINES:INTEGER);

VAR
I:INTEGER;
BLANKS:STRING 80;

BEGIN
BLANKS:='                                        ';{40SPACES}
FOR I:= 1 TO NUMBER_OF_LINES DO
       BEGIN
       WRITE(CHR(27),'=',CHR(STARTING_LINE+31),CHR(32),BLANKS,BLANKS);
       STARTING_LINE:=STARTING_LINE + 1;
       END
END;


PROCEDURE MOVE_CURSOR (X,Y:INTEGER);
BEGIN
       WRITE(CHR(27),'=',CHR(Y+31),CHR(X+31));
END;

PROCEDURE PROMPT (X,Y,LENGTH:INTEGER; P:$STRING80;
                 PROTECTED_FIELD_DESIRED:BOOLEAN);

VAR
UNDERLINE:STRING 80;
I:INTEGER;
BEGIN
UNDERLINE:='_';
       FOR I:= 1 TO LENGTH DO APPEND(UNDERLINE,'_');
       IF PROTECTED_FIELD_DESIRED = FALSE THEN
WRITE(CHR(27),'=',CHR(Y+31),CHR(X+31),P,UNDERLINE)
       ELSE
WRITE(CHR(27),'=',CHR(Y+31),CHR(X+31),')',P,
       UNDERLINE,CHR(27),'(');
END;


FUNCTION INPUT_DATA (X,Y,LEN:INTEGER; ALPHANUMERIC:BOOLEAN;
                    MAXIMUM_VALUE,MINIMUM_VALUE:REAL):$STRING80;

VAR
DATA,BLANKS:$STRING80;
I:INTEGER;

PROCEDURE CORRECT(X,Y:INTEGER);
VAR
I,A,B:INTEGER;
BEGIN

       ERASE_LINES(20,2);
       WRITE (CHR(7));
       MOVE_CURSOR (1,20);

       IF (ALPHANUMERIC = TRUE) AND (LENGTH(DATA)>LEN) THEN
               WRITE('TERM TOO LONG');

       MOVE_CURSOR(X,Y);
       WRITE(' ');
       A:=X;
       B:=Y;

       FOR I:= 1 TO LENGTH(DATA) DO
       BEGIN
               MOVE_CURSOR(A,B);
               WRITE(' ');
               A:=A+1;
       END;

       MOVE_CURSOR(X,Y);
       WRITE('_');
       A:=X;
       B:=Y;
       FOR I:= 1 TO (LEN-1) DO
       BEGIN
               MOVE_CURSOR(A,B);
               WRITE('_');
               A:=A+1;
       END;

       MOVE_CURSOR(X,Y);
       READ(DATA);
       ERASE_LINES(20,1);


END;



BEGIN

       BLANKS:='                                        ';{40SPACES}

MOVE_CURSOR(X,Y);
READ(DATA);

WHILE(ALPHANUMERIC = TRUE) AND (LENGTH(DATA) > LEN) DO CORRECT(X,Y);

IF LENGTH(DATA) = 0 THEN
BEGIN
       DATA:=' ';
       FOR I:=1 TO (LEN-1) DO APPEND(DATA,' ');
END;

IF LENGTH(DATA) < LEN THEN
       FOR I:=  LENGTH(DATA) TO LEN DO APPEND(DATA,' ');

INPUT_DATA:=DATA;

END;


{************  PROCEDURE TO DETERMINE NUMBER RECORDS IN FILE ******}

PROCEDURE NUMBER_RECORDS(FILENAM:$STRING14);
BEGIN

RESET(FILENAM,FIN);
WITH INFORMATION DO
BEGIN

READ(FIN:1,INFORMATION);
NUMBER_OF_RECORDS:=(((ORD(ACCT_NUMBER[1])-48)*1000)+
               ((ORD(ACCT_NUMBER[2])-48)*100)+
               ((ORD(ACCT_NUMBER[3])-48)*10)+
               ((ORD(ACCT_NUMBER[4])-48)*1));
END; {OF WITH}

END; {OF PROCEDURE}

{********** DETERMINE THE CURRENT NUMBER OF RECORDS  *******}

PROCEDURE CALC_ACCT_NO(CURRENT_NUMBER_OF_RECORDS:INTEGER);
VAR
ONES,TENS,HUNDREDS,THOUSANDS:CHAR;
O,T,H,TH:INTEGER;

BEGIN
O:=0;
T:=0;
H:=0;
TH:=0;
WITH INFORMATION DO
BEGIN

IF CURRENT_NUMBER_OF_RECORDS < 10 THEN
BEGIN
ONES:=CHR(CURRENT_NUMBER_OF_RECORDS + 48);
ACCT_NUMBER[1]:='0';
ACCT_NUMBER[2]:='0';
ACCT_NUMBER[3]:='0';
ACCT_NUMBER[4]:=ONES;
END; {IF}

IF CURRENT_NUMBER_OF_RECORDS  = 10 THEN ACCT_NUMBER:='0010';
IF CURRENT_NUMBER_OF_RECORDS  = 100 THEN ACCT_NUMBER:='0100';
IF CURRENT_NUMBER_OF_RECORDS = 1000 THEN ACCT_NUMBER:='1000';

IF (CURRENT_NUMBER_OF_RECORDS < 100) AND
  (CURRENT_NUMBER_OF_RECORDS > 10) THEN
BEGIN
WHILE (CURRENT_NUMBER_OF_RECORDS < 100) AND
     (CURRENT_NUMBER_OF_RECORDS > 10) DO          {FOR VALUE 1-99}
BEGIN
CURRENT_NUMBER_OF_RECORDS:=CURRENT_NUMBER_OF_RECORDS-10;
T:=T+1;
IF CURRENT_NUMBER_OF_RECORDS < 10 THEN
BEGIN
ONES:= CHR(CURRENT_NUMBER_OF_RECORDS + 48);
TENS:=CHR(T+48);
ACCT_NUMBER[1]:='0';
ACCT_NUMBER[2]:='0';
ACCT_NUMBER[3]:=TENS;
ACCT_NUMBER[4]:=ONES;
END; {IF}

END; {WHILE}
END; {OF IF}

IF (CURRENT_NUMBER_OF_RECORDS < 10000) AND
  (CURRENT_NUMBER_OF_RECORDS > 100) THEN
BEGIN
IF CURRENT_NUMBER_OF_RECORDS < 1000 THEN THOUSANDS:='0';
BEGIN
WHILE (CURRENT_NUMBER_OF_RECORDS < 10000) AND
     (CURRENT_NUMBER_OF_RECORDS >= 1000) DO
BEGIN
CURRENT_NUMBER_OF_RECORDS:=CURRENT_NUMBER_OF_RECORDS - 1000;
TH:=TH+1;
IF CURRENT_NUMBER_OF_RECORDS < 1000 THEN THOUSANDS:=CHR(TH+48);
END;
IF CURRENT_NUMBER_OF_RECORDS < 100 THEN HUNDREDS:='0';

WHILE (CURRENT_NUMBER_OF_RECORDS < 1000) AND
     (CURRENT_NUMBER_OF_RECORDS >= 100) DO
BEGIN
CURRENT_NUMBER_OF_RECORDS:=CURRENT_NUMBER_OF_RECORDS-100;
H:=H+1;
IF CURRENT_NUMBER_OF_RECORDS < 100 THEN HUNDREDS:=CHR(H+48);
END;
IF CURRENT_NUMBER_OF_RECORDS < 10 THEN TENS:='0';

WHILE (CURRENT_NUMBER_OF_RECORDS < 100) AND
     (CURRENT_NUMBER_OF_RECORDS >= 10) DO
BEGIN
CURRENT_NUMBER_OF_RECORDS:=CURRENT_NUMBER_OF_RECORDS-10;
T:=T+1;
IF CURRENT_NUMBER_OF_RECORDS < 10 THEN TENS:=CHR(T+48);
END;

ONES:=CHR(CURRENT_NUMBER_OF_RECORDS+48);
END;

ACCT_NUMBER[1]:=THOUSANDS;
ACCT_NUMBER[2]:=HUNDREDS;
ACCT_NUMBER[3]:=TENS;
ACCT_NUMBER[4]:=ONES;

IF CURRENT_NUMBER_OF_RECORDS  = 10 THEN ACCT_NUMBER:='0010';
IF CURRENT_NUMBER_OF_RECORDS  = 100 THEN ACCT_NUMBER:='0100';
IF CURRENT_NUMBER_OF_RECORDS = 1000 THEN ACCT_NUMBER:='1000';

END; {OF IF}
END; {OF WITH INFORMATION DO}
END; {OF PROCEDURE}


{********************  PRINT THE FILE  ********************}

PROCEDURE PRINT_FILE(FILENAM:$STRING14);

TYPE
C = FILE OF CHAR;

VAR
CONTINUE,ANSWER:CHAR;
AC,HARDCOPY: BOOLEAN;
FOUT: C;
COUNTER:INTEGER;

BEGIN
CLEAR_SCREEN;

REPEAT
WRITELN;
WRITE ('DO YOU WANT THE ACCOUNT NUMBER INCLUDED IN THE PRINT OUT? Y/N ');
READ(ANSWER);
UNTIL (ANSWER = 'Y') OR (ANSWER = 'N');
IF ANSWER = 'Y' THEN AC:=TRUE ELSE AC:=FALSE;

REPEAT
WRITELN;
WRITE ('DO YOU WANT A HARDCOPY OF THE FILE? Y/N ');
READ(ANSWER);
UNTIL (ANSWER = 'Y') OR (ANSWER = 'N');

IF ANSWER = 'Y' THEN
       BEGIN
       HARDCOPY:=TRUE;
       REWRITE('LST:',FOUT);
       WRITELN('PREPARE PRINTER TO RECEIVE LISTING.');
       WRITELN('WHEN READY, TYPE A CARRIAGE RETURN.');
       READ(ANSWER);
       CLEAR_SCREEN;
       WRITELN('FILE IS NOW BEING PRINTED.');
       END;

IF ANSWER = 'N' THEN HARDCOPY:= FALSE;



RESET(FILENAM,FIN);
CLEAR_SCREEN;
NUMBER_RECORDS(FILENAM);

WITH INFORMATION DO
BEGIN
COUNTER:=0;

FOR I:= 2 TO NUMBER_OF_RECORDS DO
BEGIN
READ(FIN:I,INFORMATION);
IF NAME <> 'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ' THEN  {DO'NT PRINT DELETED RECORDS}
BEGIN

IF HARDCOPY = FALSE THEN
BEGIN
WRITELN;
WRITELN (NAME);
WRITELN(STREET_NUMBER,'  ',STREET);
WRITELN(CITY,'    ',STATE,'    ',ZIP);
WRITELN;
COUNTER:=COUNTER+5;
IF ATTENTION <> '                              ' THEN
       BEGIN
       WRITELN('ATT:  ',ATTENTION);
       COUNTER:=COUNTER+1;
       END; {OF THIS IF}
IF AC = TRUE THEN
       BEGIN
       WRITELN;
       WRITELN('ACCOUNT NUMBER:  ',ACCT_NUMBER);
       COUNTER:=COUNTER+1;
       END;
IF COUNTER >= 21  THEN
       BEGIN
       PROMPT(1,23,0,'ENTER ANY CHARACTER TO CONTINUE',FALSE);
       READ(CONTINUE);
       ERASE_LINES(23,1);
       COUNTER:=0;
       END;


END; {FOR HARDCOPY = FALSE}

IF HARDCOPY = TRUE THEN
BEGIN
WRITELN(FOUT,NAME);
WRITELN(FOUT,STREET_NUMBER,'   ',STREET);
WRITELN(FOUT,CITY,'     ',STATE,'    ',ZIP);
WRITELN(FOUT,' ');
IF ATTENTION <> '                              ' THEN
       WRITELN(FOUT,'ATT:   ',ATTENTION);
IF AC = TRUE THEN
       BEGIN
       WRITELN(FOUT,' ');
       WRITELN(FOUT,'ACCOUNT NUMBER:  ',ACCT_NUMBER);
       WRITELN(FOUT,'  ');
       END;
IF AC = FALSE THEN WRITELN(FOUT,'  ');
WRITELN(FOUT,'  ');

END; {FOR HARDCOPY  =  TRUE}
END; {OF NAME <> ZZZZZZ..}
END;  {FOR LOOP}
END; {THIS IS FOR WITH STATEMENTS}
IF HARDCOPY = FALSE THEN
BEGIN
ERASE_LINES(22,2);
MOVE_CURSOR(1,22);
WRITE('ENTER A CARRIAGE RETURN TO CONTINUE PROGRAM');
READ(ANSWER);
END;


END; {OF PROCEDURE}


{*****************  CREATING THE FIRST RECORD OF FILE *******}

PROCEDURE CREATE_FIRST_RECORD (ACTNO: TR);
BEGIN
IF (NEWFILE = TRUE) AND (CONTINUE = TRUE) THEN REWRITE(FILENAM,FIN);

WITH INFORMATION  DO
BEGIN
NAME:='                              ';
STREET_NUMBER:='      ';
STREET:='                    ';
CITY:='                  ';
STATE:='          ';
ZIP:='          ';
ATTENTION:='FIRST RECORD OF FILE          ';
IF (NEWFILE = TRUE) AND (CONTINUE = TRUE) THEN ACCT_NUMBER:='0001';
IF (NEWFILE = TRUE) AND (CONTINUE = FALSE) THEN ACCT_NUMBER:=ACTNO;
IF NEWFILE =  FALSE THEN ACCT_NUMBER:= ACTNO;
WRITE(FIN:1,INFORMATION);
END; {WITH LOOP}
END; {OF PROCEDURE}


{**************   ENTER THE  NAME OF THE  FILE *****************}

PROCEDURE ENTER_FILE_NAME;

VAR
ERROR:BOOLEAN;

BEGIN
REPEAT
NEWFILE:=FALSE;
ERROR:=FALSE;
CLEAR_SCREEN;
WRITELN(' ENTER THE FILE  NAME AS: DRIVE: NAME. EXTENSION');
WRITELN;
WRITELN(' WHERE  DRIVE IS  A SINGLE LETTER--EITHER A  OR  B');
WRITELN('        NAME  IS UP TO  8 LETTERS OR SPACES');
WRITELN('        EXTENSION MUST HAVE 3 LETTERS  OR  SPACES');
WRITELN;

READLN(FILENAM);
RESET(FILENAM,FIN);


IF EOF(FIN) THEN
BEGIN
REPEAT
MOVE_CURSOR(1,10);
WRITE('FILE NOT FOUND.  IS THIS A NEW FILE? Y/N');
READ  (ANSWER);
UNTIL (ANSWER = 'Y') OR (ANSWER = 'N');
IF ANSWER = 'N' THEN ERROR:=TRUE;
IF ANSWER = 'Y' THEN NEWFILE:=TRUE ELSE NEWFILE:=FALSE;
IF NEWFILE = TRUE THEN CREATE_FIRST_RECORD('0001');
END; {OF IF EOF}


UNTIL ERROR = FALSE;


IF NEWFILE = TRUE THEN COUNTER:= 2;

IF NEWFILE = FALSE THEN
BEGIN
NUMBER_RECORDS(FILENAM);
COUNTER:=NUMBER_OF_RECORDS + 1;
END;

END; {OF PROCEDURE}

{*********** PROCEDURE TO CORRECT INCORRECT ENTRY ************}

PROCEDURE MISTAKE;
VAR
WRONG:CHAR;

BEGIN
WITH INFORMATION DO
BEGIN
ERASE_LINES(12,9);
PROMPT(1,12,0,'ENTER NUMBER OF INCORRECT INFORMATION',FALSE);
PROMPT(1,14,0,'1-NAME ',FALSE);
PROMPT(1,15,0,'2-# ',FALSE);
PROMPT(1,16,0,'3-STREET ',FALSE);
PROMPT(1,17,0,'4-CITY ',FALSE);
PROMPT(1,18,0,'5-STATE ',FALSE);
PROMPT(1,19,0,'6-ZIP ',FALSE);
PROMPT(1,20,0,'7-ATTENTION ',FALSE);
PROMPT(1,21,0,'8-ALL INFORMATION IS CORRECT AS DISPLAYED ',FALSE);

REPEAT
MOVE_CURSOR(50,16);
READ(WRONG);

CASE WRONG OF
       '1':BEGIN
               PROMPT(1,3,30,'NAME',FALSE);
               NA:=INPUT_DATA(6,3,30,TRUE,0,0);
               FOR I:= 1 TO 30 DO NAME[I]:=NA[I];
           END;

       '2': BEGIN
               PROMPT(1,5,6,'#: ',FALSE);
               ST_NO:=INPUT_DATA(4,5,6,TRUE,0,0);
               FOR I:= 1 TO 6 DO STREET_NUMBER[I]:=ST_NO[I];
               END;

       '3': BEGIN
               PROMPT(10,5,20,'STREET:',FALSE);
               ST:=INPUT_DATA(19,5,20,TRUE,0,0);
               FOR I:= 1 TO 20 DO STREET[I]:=ST[I];
               END;

       '4': BEGIN
               PROMPT(1,7,10,'CITY: ',FALSE);
               CIT:=INPUT_DATA(7,7,18,TRUE,0,0);

               IF (CIT[1] <> '7') AND (CIT[1] <> '8') THEN
               FOR I:= 1 TO 18 DO CITY[I]:=CIT[I];

IF CIT[1] = '7' THEN    {DEFAULT TO FIRST VALUE, E.G. RICHMOND,VA.}
       BEGIN
       CITY:=CITY_ONE;
       STATE:=STATE_ONE;
       PROMPT(7,7,0,CITY_ONE,FALSE);
       PROMPT(35,7,0,STATE_ONE,FALSE);
       END;

IF CIT[1] = '8' THEN            {DEFAULT TO SECOND VALUE}
       BEGIN
       CITY:=CITY_TWO;
       STATE:=STATE_TWO;
       PROMPT(7,7,0,CITY_TWO,FALSE);
       PROMPT(35,7,0,STATE_TWO,FALSE);
       END;
               END;

       '5': BEGIN
               PROMPT(28,7,10,'STATE: ',FALSE);
               STA:=INPUT_DATA(35,7,10,TRUE,0,0);
               FOR I:= 1 TO 10 DO STATE[I]:=STA[I];
               END;

       '6': BEGIN
               PROMPT(48,7,10,'ZIP: ',FALSE);
               ZI:= INPUT_DATA(54,7,10,TRUE,0,0);
               FOR I:= 1 TO 10 DO ZIP[I]:=ZI[I];
               END;

       '7': BEGIN
               PROMPT(1,9,30,'ATTENTION: ',FALSE);
               ATT:=INPUT_DATA(12,9,30,TRUE,0,0);
               FOR I:= 1 TO 30 DO ATTENTION[I]:=ATT[I];
               END;

       END; {OF CASE}

UNTIL WRONG = '8';
END; {OF WITH INFORMATION}
ERASE_LINES(10,12);
END; {OF PROCEDURE}

{*****************  OFFER A LISTING OF THE FILE  **************}

PROCEDURE OFFER_LISTING(FILENAM:$STRING14);

BEGIN
REPEAT
ERASE_LINES(20,1);
PROMPT(1,20,1,'DO YOU WANT A LISTING OF THE FILE? Y/N ',FALSE);
MOVE_CURSOR(50,20);
READ(ANSWER);
UNTIL (ANSWER = 'Y') OR (ANSWER = 'N');

IF ANSWER = 'Y' THEN PRINT_FILE(FILENAM);

END; {OF PROCEDURE}


{******* PROC TO GET INFORMATION & PUT INFORMATION INTO FILE ******}

PROCEDURE ENTER_INFORMATION;


BEGIN
WITH INFORMATION DO
BEGIN

CLEAR_SCREEN;
       PROMPT(1,3,30,'NAME',FALSE);
       PROMPT(1,5,6,'#: ',FALSE);
       PROMPT(10,5,20,'STREET: ',FALSE);
       PROMPT(1,7,18,'CITY: ',FALSE);
       PROMPT(28,7,10,'STATE: ',FALSE);
       PROMPT(48,7,10,'ZIP: ',FALSE);
       PROMPT(1,9,30,'ATTENTION: ',FALSE);

MOVE_CURSOR(1,22);
WRITE('ENTERING  EXIT  FOR THE NAME TERMINATES THIS PROCEDURE');
MOVE_CURSOR(1,23);
WRITE('DEFAULT VALUES FOR CITY AND STATE ARE:');
MOVE_CURSOR(40,23);
WRITE('7 = RICHMOND,VA.       8 = BOSTON,MASS.');

       NA:=INPUT_DATA(6,3,30,TRUE,0,0);
FOR I:= 1 TO 30 DO NAME[I]:=NA[I];

       IF NAME <> 'EXIT                          ' THEN
       BEGIN

       ST_NO:=INPUT_DATA(4,5,6,TRUE,0,0);
       ST:=INPUT_DATA(19,5,20,TRUE,0,0);
       CIT:=INPUT_DATA(7,7,18,TRUE,0,0);

       IF (CIT[1] <> '7') AND (CIT[1] <> '8') THEN
       STA:=INPUT_DATA(35,7,10,TRUE,0,0);

IF CIT[1] = '7' THEN  {DEFAULT TO VALUE ONE, E.G. RICHMOND,VA.}
       BEGIN
       CITY:=CITY_ONE;
       STATE:=STATE_ONE;
       PROMPT(7,7,0,CITY_ONE,FALSE);
       PROMPT(35,7,0,STATE_ONE,FALSE);
       END;

IF CIT[1] = '8' THEN  {DEFAULT TO VALUE TWO}
       BEGIN
       CITY:=CITY_TWO;
       STATE:=STATE_TWO;
       PROMPT(7,7,0,CITY_TWO,FALSE);
       PROMPT(35,7,0,STATE_TWO,FALSE);
       END;


       ZI:=INPUT_DATA(54,7,10,TRUE,0,0);
       ATT:=INPUT_DATA(12,9,30,TRUE,0,0);

FOR I:= 1 TO 30 DO NAME[I]:=NA[I];
FOR I:= 1 TO 6  DO STREET_NUMBER[I]:=ST_NO[I];
FOR I:= 1 TO 20 DO STREET[I]:=ST[I];

IF (CIT[1] <> '7') AND (CIT[1] <> '8') THEN
BEGIN
FOR I:= 1 TO 18 DO CITY[I]:=CIT[I];
FOR I:= 1 TO 10 DO STATE[I]:=STA[I];
END;

FOR I:= 1 TO 10 DO ZIP[I]:=ZI[I];
FOR I:= 1 TO 30 DO ATTENTION[I]:=ATT[I];
CALC_ACCT_NO(COUNTER);



REPEAT
PROMPT(1,20,1,'IS INFORMATION CORRECT AS ENTERED? Y/N',FALSE);
MOVE_CURSOR(50,20);
READ(ANSWER);
UNTIL (ANSWER = 'Y') OR (ANSWER = 'N');
IF ANSWER = 'N' THEN MISTAKE;
END;{OF IF NOT EQUAL TO 'EXIT'}


IF NAME <> 'EXIT                          ' THEN
BEGIN
WRITE(FIN:COUNTER,INFORMATION);
COUNTER:=COUNTER+1;
END; {OF IF NAME NOT EQUAL TO 'EXIT'}
END; {OF WITH}
END; {OF PROCEDURE}


{************************* MENU ******************************}

PROCEDURE MENU;
VAR
ANSWER:INTEGER;

BEGIN
CLEAR_SCREEN;

CHANGE_RECORD:=FALSE;
DELETE_RECORD:=FALSE;
FIND_RECORD:=FALSE;
ADD_TO_FILE:=FALSE;
LISTING:=FALSE;

MOVE_CURSOR(12,2);
WRITELN('  SELECT ONE PROCEDURE, AND ENTER CORRESPONDING NUMBER');
WRITELN;
WRITELN('1- CREATE A NEW, OR ADD TO AN EXISTING, NAME & ADDRESS FILE');
WRITELN('2- CHANGE OR CORRECT A RECORD IN AN EXISTING NAME & ADDRESS FILE');
WRITELN('3- DELETE A RECORD FROM AN EXISTING NAME & ADDRESS FILE');
WRITELN('4- DETERMINE IF A PARTICULAR NAME ALREADY EXISTS IN THE FILE');
WRITELN('5- LIST THE NAME & ADDRESS FILE ON EITHER THE CRT OR PRINTER');
WRITELN;
WRITELN;
REPEAT
WRITE('YOUR SELECTION, PLEASE: ');
READ(ANSWER);
UNTIL (ANSWER < 6) AND (ANSWER > 0);

CASE ANSWER OF

       1: ADD_TO_FILE:= TRUE;
       2: CHANGE_RECORD:=TRUE;
       3: DELETE_RECORD:=TRUE;
       4: FIND_RECORD:=TRUE;
       5: LISTING:=TRUE;
END; {OF CASE}
CLEAR_SCREEN;

END; {OF PROCEDURE MENU}




{******************* ADD TO A NEW OR EXISTING FILE **************}

PROCEDURE ADD(FILENAM:$STRING14);

BEGIN

WITH INFORMATION DO
BEGIN

REPEAT
ENTER_INFORMATION;
UNTIL NAME = 'EXIT                          ';


CONTINUE:=F
ALSE;
CALC_ACCT_NO(COUNTER - 1);
CREATE_FIRST_RECORD(ACCT_NUMBER);

END;            {OF WITH INFORMATION}
END;            {OF PROCEDURE}


{******************** FIND A NAME IN THE FILE *******************}

PROCEDURE FIND(FILENAM:$STRING14; FLAG:INTEGER);

VAR
FINISHED:BOOLEAN;
I,LINE_COUNTER:INTEGER;
LOCALIZERS:ALPHABET;
LINE_FLAG:BOOLEAN;
FIRST_LETTER:INTEGER;


BEGIN
REPEAT
FINISHED:=TRUE;
REC_NUMBER:=1;
FOUND:=FALSE;
END_OF_FILE:=COUNTER -1;  {COUNTER WAS SET = NUMBER_OF_RECORDS + 1
                          IN THE ENTER_FILE_NAME PROCEDURE}

CLEAR_SCREEN;
MOVE_CURSOR(2,2);
IF FLAG = 1 THEN
WRITELN('  PROCEDURE TO DETERMINE IF A NAME IS PRESENT IN FILE ',
          FILENAM)
ELSE IF FLAG = 2 THEN
WRITELN('  PROCEDURE TO FIND AND CHANGE A RECORD')
ELSE IF FLAG = 3 THEN
WRITELN('  PROCEDURE TO FIND AND DELETE A RECORD');

PROMPT(1,4,30,'ENTER THE NAME YOU WISH TO LOCATE',FALSE);
DES_NAM:=INPUT_DATA(35,4,30,TRUE,0,0);
FOR I:= 1 TO 30 DO DESIRED_NAME[I]:=DES_NAM[I];

CLEAR_SCREEN;
PROMPT(2,12,0,'PROGRAM NOW SEARCHING FILE. ONE MOMENT PLEASE.',FALSE);
RESET(FILENAM,FIN);

I:=1;
WHILE FILENAM[I] <> '.' DO
BEGIN
ALPFILE[I]:=FILENAM[I];
I:=I+1;
END;
ALPFILE[I]:='.';
ALPFILE[I+1]:='A';
ALPFILE[I+2]:='L';
ALPFILE[I+3]:='P';
IF (I+4) < 14 THEN
BEGIN
I:=I+4;
FOR N:= I TO 14 DO
ALPFILE[N]:=' ';
END;
RESET(ALPFILE,FALP);

WITH LOCALIZERS DO
BEGIN
FIRST_LETTER:=ORD(DESIRED_NAME[1]) - 64;
READ(FALP:FIRST_LETTER,LOCALIZERS);
WITH INFORMATION DO
BEGIN
I:=START;
REPEAT
READ(FIN:I,INFORMATION);
IF DESIRED_NAME = NAME THEN
BEGIN
FOUND:=TRUE;
REC_NUMBER:=I;
ERASE_LINES(12,1);
PROMPT(1,1,0,'INFORMATION AS FOUND IN FILE: ',FALSE);
PROMPT(1,3,0,'NAME: ',FALSE);
PROMPT(1,5,0,'#: ',FALSE);
PROMPT(10,5,0,'STREET: ',FALSE);
PROMPT(1,7,0,'CITY: ',FALSE);
PROMPT(28,7,0,'STATE: ',FALSE);
PROMPT(48,7,0,'ZIP: ',FALSE);
PROMPT(1,9,0,'ATTENTION: ',FALSE);
MOVE_CURSOR(6,3);
WRITE(NAME);
MOVE_CURSOR(4,5);
WRITE(STREET_NUMBER);
MOVE_CURSOR(19,5);
WRITE(STREET);
MOVE_CURSOR(7,7);
WRITE(CITY);
MOVE_CURSOR(35,7);
WRITE(STATE);
MOVE_CURSOR(54,7);
WRITE(ZIP);
MOVE_CURSOR(12,9);
WRITE(ATTENTION);
END;

I:=I+1;


UNTIL (I > FINISH) OR (FOUND = TRUE);

IF FOUND = FALSE THEN
BEGIN
ERASE_LINES(12,1);
PROMPT(2,12,0,'NAME AS ENTERED NOT FOUND IN FILE.',FALSE);
REPEAT
MOVE_CURSOR(2,14);
WRITE('WOULD YOU LIKE A LIST OF NAMES BEGINNING WITH ',
       DESIRED_NAME[1],' ? Y/N');
READ(ANSWER);
UNTIL (ANSWER = 'Y') OR (ANSWER = 'N');
IF ANSWER = 'Y' THEN
       BEGIN
       CLEAR_SCREEN;
       LINE_COUNTER:=1;
       FOR I:=START TO FINISH DO
       BEGIN
       READ(FIN:I,INFORMATION);
       IF LINE_COUNTER < 15 THEN
       BEGIN
       MOVE_CURSOR(2,LINE_COUNTER);
       WRITE(NAME);
       END;

       IF (LINE_COUNTER >=15) AND (LINE_COUNTER < 30) THEN
       BEGIN
       MOVE_CURSOR(45,LINE_COUNTER-14);
       WRITE(NAME);
       END;

       IF LINE_COUNTER >= 30 THEN
       BEGIN
       PROMPT(2,23,0,'ENTER A CARRIAGE RETURN TO CONTINUE ',FALSE);
       READ(ANSWER);
       CLEAR_SCREEN;
       LINE_COUNTER:=0;
       END;

       LINE_COUNTER:=LINE_COUNTER + 1;
       END; {FOR I  = START TO FINISH OF LISTING}
END; {OF IF ANSWER = Y}
ERASE_LINES(22,2);
PROMPT(2,23,0,'ENTER A CARRIAGE RETURN TO CONTINUE',FALSE);
READ(ANSWER);
CLEAR_SCREEN;
END; {OF FOUND = FALSE}


END;  {OF WITH INFORMATION}
END; {OF LOCALIZERS}

IF FLAG = 1 THEN
BEGIN
ERASE_LINES(22,1);
REPEAT
MOVE_CURSOR(1,22);
WRITE('DO YOU WISH TO FIND ANOTHER RECORD IN FILE ',FILENAM,' Y/N?');
READ(ANSWER);
UNTIL (ANSWER = 'Y') OR (ANSWER = 'N');
IF ANSWER = 'Y' THEN FINISHED:=FALSE ELSE FINISHED:=TRUE;
END; {OF IF FLAG = 1}

UNTIL FINISHED = TRUE;
END;  {OF PROCEDURE}

{******************** DELETE A RECORD **************************}

PROCEDURE DELETE(FILENAM:$STRING14);
VAR
FINISH:BOOLEAN;

BEGIN
REPEAT
WITH INFORMATION DO
BEGIN
FIND(FILENAM,3);
IF FOUND = TRUE THEN
       BEGIN
       RESET(FILENAM,FIN);
       REPEAT
       MOVE_CURSOR(1,22);
       WRITE('IS IT OK TO DELETE THIS RECORD? Y/N');
       READ(ANSWER);
       UNTIL (ANSWER = 'Y') OR (ANSWER = 'N');

       IF ANSWER = 'Y' THEN
       BEGIN
       ERASE_LINES(22,1);
       MOVE_CURSOR(1,22);
       WRITE('RECORD HAS BEEN DELETED.');
NAME:='ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ';
STREET_NUMBER:='      ';
STREET:='                    ';
CITY:='                  ';
STATE:='          ';
ZIP:='          ';
ATTENTION:='                              ';
ACCT_NUMBER:='    ';
WRITE(FIN:REC_NUMBER,INFORMATION);
               END; {OF ANSWER = Y}
       END; {OF FOUND = TRUE}

IF FOUND = FALSE THEN
WRITELN('NO DELETION OCCURRED.');


END;    {OF WITH INFORMATION}
ERASE_LINES(22,1);
REPEAT
MOVE_CURSOR(1,22);
WRITE('DO YOU WISH TO DELETE ANOTHER RECORD FROM FILE ',FILENAM,' Y/N');
READ(ANSWER)
UNTIL (ANSWER = 'Y') OR (ANSWER = 'N');
IF ANSWER = 'Y' THEN FINISH:= FALSE ELSE FINISH:=TRUE;

UNTIL FINISH = TRUE;


END; {OF PROCEDURE}


{****************** PROCEDURE TO CHANGE A RECORD IN FILE ***********}

PROCEDURE CHANGE(FILENAM:$STRING14);
VAR
FINISH:BOOLEAN;

BEGIN
REPEAT
WITH INFORMATION DO
BEGIN
FIND(FILENAM,2);
IF FOUND = TRUE THEN
BEGIN
RESET(FILENAM,FIN);
MISTAKE;
WRITE(FIN:REC_NUMBER,INFORMATION);
MOVE_CURSOR(1,23);
WRITELN('RECORD HAS BEEN MODIFIED AS DESIRED');
END; {OF WITH INFORMATION}
END; {OF IF FOUND = TRUE}

REPEAT
ERASE_LINES(22,1);
MOVE_CURSOR(1,22);
WRITE('DO YOU WISH TO CHANGE ANOTHER RECORD IN FILE ',FILENAM,' Y/N?');
READ(ANSWER);
UNTIL (ANSWER = 'Y') OR (ANSWER = 'N');
IF ANSWER = 'Y' THEN FINISH:=FALSE ELSE FINISH:=TRUE;

UNTIL FINISH = TRUE;

END; {OF PROCEDURE}


{*************** OFFER A CHANCE TO GO BACK TO MENU *************}

PROCEDURE AGAIN;
BEGIN
CLEAR_SCREEN;
REPEAT
PROMPT(2,10,0,'WOULD YOU LIKE TO CHOOSE FROM THE MENU, AGAIN? Y/N ',FALSE);
PROMPT(2,12,0,'ENTERING AN  N  WILL TERMINATE THE PROGRAM.',FALSE);
MOVE_CURSOR(54,10);
READ(ANSWER);
UNTIL (ANSWER = 'Y') OR (ANSWER = 'N');
IF ANSWER = 'Y' THEN FINISH:= FALSE ELSE FINISH:=TRUE;
END; {OF PROCEDURE}


{****************  MAIN PROGRAM BEGINS HERE   ******************}

BEGIN
FINISH:=FALSE;
REPEAT
MENU;

CONTINUE:=TRUE;
ENTER_FILE_NAME;

IF CHANGE_RECORD = TRUE THEN CHANGE(FILENAM);
IF DELETE_RECORD = TRUE THEN DELETE(FILENAM);
IF FIND_RECORD = TRUE THEN FIND(FILENAM,1);
IF ADD_TO_FILE = TRUE THEN ADD(FILENAM);
IF LISTING = TRUE THEN OFFER_LISTING(FILENAM);

IF (ADD_TO_FILE = TRUE) OR  (DELETE_RECORD = TRUE) THEN
BEGIN
CLEAR_SCREEN;
PROMPT(2,10,0,'WHEN THE CP/M PROMPT  A> APPEARS, TYPE:',FALSE);
PROMPT(16,12,0,'ALPHABET',FALSE);
PROMPT(2,14,0,'THIS WILL RUN THE PROGRAM TO ALPHABETIZE THE FILE',FALSE);
PROMPT(2,15,0,'AND ESTABLISH THE FILE OF POINTERS.  THANK YOU.',FALSE);
FINISH:= TRUE;

END;


IF (ADD_TO_FILE = FALSE) AND (DELETE_RECORD = FALSE) THEN AGAIN;
UNTIL FINISH = TRUE;

END.