{$C-}
   const
       Changed : Boolean = False;
      DiskFull : Boolean = False;
   type
       Entry = Record
                         Name : String[34];
                   Ingredient : Array[1..15] of String[20];
                    Direction : Array[1..13] of String[79];
               end;
       Str12 = String[12];
       Str80 = String[80];
   var
        RecipeFile : File of Entry;
            Recipe : Entry;
        TestString : Str80;
       CurrentFile : Str12;
       CurrentType : String[30];
            Choice : Char;
          Continue : Char;
            Option : Integer;
     HighestRecord : Integer;
   function Exist(FileName : Str12) : Boolean;
       var
           Fil : File;
       begin
           Assign(Fil, FileName);
           {$I-} Reset(Fil) {$I+};
           Exist := (IOresult = 0)
       end;
   procedure DrawStatusLine;
       begin
           GotoXY(1,21); Write(' ==============================================================================');
           GotoXY(1,23); Write(' ==============================================================================');
       end;
   procedure WriteStatusLine(Status : Str80);
       var
           Margin : Integer;
       begin
           Margin := ((80-length(Status)) div 2);
           GotoXY(1,22); ClrEol;
           GotoXY(Margin,22); Write(^G,Status + '  ');
       end;
   procedure DrawMask;
       begin
           GotoXY(8,1); Write('NAME :');
           GotoXY(1,2); Write('INGREDIENTS :');
           GotoXY(2,7); Write('DIRECTIONS :');
       end;
   procedure DrawScreen;
       var
          A,B,J  : Integer;
       begin
           With Recipe do
           begin
               GotoXY(14,1);ClrEol;Write(Name);
               A := 14; B := 2;
               For J := 1 to 15 Do
               begin
                   GotoXY(A,B);Write('                    '); GotoXY(A,B);
                   Write(Ingredient[J]); A := A + 22;
                   If A = 80 then
                   begin
                       A := 14; B := B + 1;
                   end;
               end;
               B := 8;
               For J := 1 to 13 Do
               begin
                   GotoXY(1,B); ClrEol; Write(Direction[J]);
                   B := B + 1;
               end;
           end;
       end;
   procedure Accept;
       begin
           Assign(RecipeFile,CurrentFile);
           If not Exist(CurrentFile) then Rewrite(RecipeFile)
           else Reset(RecipeFile);
           With Recipe Do
           begin
               {$I-} Seek(RecipeFile, FileSize(RecipeFile)) {$I+};
               DiskFull := (IOresult = $F0);
               If DiskFull then
               begin
                   WriteStatusLine('DISK FULL !!!  Erase Unnecessary Files.  (ANY KEY) to QUIT.');
                   Read(Continue); Halt;
               end;
               Write(RecipeFile,Recipe);
               Flush(RecipeFile);
               Close(RecipeFile);
           end;
           Changed := False;
       end;
   procedure Change;
       var
           X,Y,I : Integer;
       begin
           With Recipe Do
           begin
               GotoXY(14,1); Read(TestString);
               If TestString <> '' then
               begin
                   Changed := True;
                   Name := TestString;
                   DrawScreen;
               end;
               X := 14; Y := 2;
               For I := 1 to 15 Do
               begin
                   GotoXY(X,Y); Read(TestString);
                   If TestString <> '' then
                   begin
                       Changed := True;
                       Ingredient[I] := TestString;
                       DrawScreen;
                   end;
                   X := X + 22;
                   If X = 80 then
                   begin
                       X := 14; Y := Y + 1;
                   end;
               end;
               Y := 8;
               For I := 1 to 13 Do
               begin
                   GotoXY(1,Y); Read(TestString);
                   If TestString <> '' then
                   begin
                       Changed := True;
                       Direction[I] := TestString;
                       DrawScreen;
                   end;
                   Y := Y + 1;
               end;
           end;
       end;
   procedure FindRecipe(Rec : Integer);
       begin
           Assign(RecipeFile,CurrentFile);
           Reset(RecipeFile);
           With Recipe Do
           begin
               Seek(RecipeFile,Rec);
               Read(RecipeFile,Recipe);
               Close(RecipeFile);
           end;
       end;
   procedure PrintRecipe;
       var
           A,B,J : Integer;
          Blanks : String[25];
       begin
           Blanks := '                         ';
           WriteStatusLine('Printer ON Then Press (RETURN)');
           Read(Continue);
           With Recipe Do
           begin
               Writeln(Lst,'NAME : ',Name); Writeln(Lst);
               Writeln(Lst,'INGREDIENTS :');
               For J := 1 to 15 Do
               begin
                   Write(Lst,Ingredient[J] + Copy(Blanks,1,(25 - length(Ingredient[J]))));
                   If J mod 3 = 0 then
                       Write(Lst,^M^J);
               end;
               Writeln(Lst);
               Writeln(Lst,'DIRECTIONS :');
               For J := 1 to 13 Do
               begin
                   Writeln(Lst,Direction[J]);
               end;
               Writeln(Lst,#12);
           end;
       end;
   procedure DisplayRecipe(Number : Integer);
       begin
           If Number > HighestRecord then
           begin
               WriteStatusLine('That Recipe Does NOT Exist.  (ANY KEY) to Continue.');
               Read(Continue); Exit;
           end;
           With Recipe Do
           begin
               FindRecipe(Number);
               ClrScr;
               DrawMask;
               DrawStatusLine;
               DrawScreen;
               WriteStatusLine('(P)rint      (ANY KEY) for MENU');
               Read(Choice);
               If (Choice = 'P') or (Choice = 'p') then
                   PrintRecipe
               else
                   Exit;
           end;
       end;
   procedure ListNames;
       var
           I,X,Y : Integer;
       begin
           ClrScr; DrawStatusLine;
           GotoXY(((80 - length(CurrentType)) div 2),3);
           Write(CurrentType); X := 1; Y := 5;
           For I := 1 to 30 Do
           begin
               GotoXY(X,Y); Write(I:2,': ');
               If I = 15 then
               begin
                   X := 41; Y := 4;
               end;
               Y := Y + 1;
           end;
           If not Exist(CurrentFile) then
           begin
               WriteStatusLine('That File Does NOT Exist.  (ANY KEY) to Continue.');
               Read(Kbd,Continue); Exit;
           end;
           Assign(RecipeFile,CurrentFile);
           Reset(RecipeFile);
           I := 0; X := 5; Y := 5;
           With Recipe Do
           begin
               Repeat
                   Seek(RecipeFile,I); Read(RecipeFile,Recipe);
                   GotoXY(X,Y); Write(Name);
                   If I = 14 then
                   begin
                       X := 45; Y := 4;
                   end;
                   I := I + 1; Y := Y + 1;
               Until (I = 29) or (EOF(RecipeFile));
               HighestRecord := I-1;
           end;
           Close(RecipeFile);
           Option := 40;
           Repeat
               WriteStatusLine('(1-30) to DISPLAY.    (0) for MENU.');
               Read(Option);
           Until Option in [0..30];
           If Option = 0 then Exit;
           DisplayRecipe(Option - 1);
       end;
   procedure EnterRecipe;
       var
           C,D,K : Integer;
       begin
           ClrScr;
           DrawMask;
           DrawStatusLine;
           WriteStatusLine('Enter NAME of Recipe.');
           With Recipe Do
           begin
               GotoXY(14,1); Write('??????????????????????????????????');
               GotoXY(14,1); Read(Name); GotoXY(14,1); ClrEol;
               Write(Name); C := 14; D := 2;
               WriteStatusLine('Enter INGREDIENTS.');
               For K := 1 to 15 Do
               begin
                   GotoXY(C,D); Write('????????????????????'); GotoXY(C,D);
                   Read(Ingredient[K]); GotoXY(C,D); ClrEol;
                   Write(Ingredient[K]); C := C + 22;
                   If C = 80 then
                   begin
                       C := 14; D := D + 1;
                   end;
               end;
               WriteStatusLine('Enter DIRECTIONS.  Enter RETURN For Blank Lines.');
               D := 8;
               For K := 1 to 13 Do
               begin
                   GotoXY(1,D); Read(Direction[K]);
                   D := D + 1;
               end;
               Repeat
                   WriteStatusLine('(A)ccept   (C)hange   (D)elete');
                   Read(Kbd,Choice);
                   Case Choice of
                       'A','a' : Accept;
                       'C','c' : Change;
                       'D','d' : Exit;
                   end;
               Until (Choice in ['A','a','C','c','D','d']) and (not Changed);
           end;
       end;
begin
Repeat
   Repeat
       Option := 20;
       ClrScr; DrawStatusLine;
       GotoXY(32,2);  Write('* RECIPE FILE *');
       GotoXY(30,3);  Write('===================');
       GotoXY(32,5);  Write(' 1) Beef');
       GotoXY(32,6);  Write(' 2) Pork');
       GotoXY(32,7);  Write(' 3) Lamb');
       GotoXY(32,8);  Write(' 4) Poultry');
       GotoXY(32,9);  Write(' 5) Seafood');
       GotoXY(32,10); Write(' 6) Meat Less');
       GotoXY(32,11); Write(' 7) Vegetables');
       GotoXY(32,12); Write(' 8) Breads');
       GotoXY(32,13); Write(' 9) Salads');
       GotoXY(32,14); Write('10) Appetizers');
       GotoXY(32,15); Write('11) Cakes');
       GotoXY(32,16); Write('12) Cookies');
       GotoXY(32,17); Write('13) Pies');
       GotoXY(32,18); Write('14) Sauces');
       GotoXY(32,19); Write('15) Drinks');
       WriteStatusLine('Choose Option (1-15)     (0) to EXIT to CP/M');
       Read(Option);
   Until Option in [0..15];
       Case Option of
           0 : begin
                   ClrScr; Halt;
               end;
           1 : begin
                   CurrentType := 'BEEF RECIPES'; CurrentFile := 'BEEF.DTA';
               end;
           2 : begin
                   CurrentType := 'PORK RECIPES'; CurrentFile := 'PORK.DTA';
               end;
           3 : begin
                   CurrentType := 'LAMB RECIPES'; CurrentFile := 'LAMB.DTA';
               end;
           4 : begin
                   CurrentType := 'POULTRY RECIPES'; CurrentFile := 'POULTRY.DTA';
               end;
           5 : begin
                   CurrentType := 'SEAFOOD RECIPES'; CurrentFile := 'SEAFOOD.DTA';
               end;
           6 : begin
                   CurrentType := 'MEATLESS RECIPES'; CurrentFile := 'MEATLESS.DTA';
               end;
           7 : begin
                   CurrentType := 'VEGETABLE RECIPES'; CurrentFile := 'VEGIES.DTA';
               end;
           8 : begin
                   CurrentType := 'BREAD RECIPES'; CurrentFile := 'BREAD.DTA';
               end;
           9 : begin
                   CurrentType := 'SALAD RECIPES'; CurrentFile := 'SALAD.DTA';
               end;
          10 : begin
                   CurrentType := 'APPETIZER RECIPES'; CurrentFile := 'APETIZER.DTA';
               end;
          11 : begin
                   CurrentType := 'CAKE RECIPES'; CurrentFile := 'CAKE.DTA';
               end;
          12 : begin
                   CurrentType := 'COOKIE RECIPES'; CurrentFile := 'COOKIE.DTA';
               end;
          13 : begin
                   CurrentType := 'PIE RECIPES'; CurrentFile := 'PIE.DTA';
               end;
          14 : begin
                   CurrentType := 'SAUCE RECIPES'; CurrentFile := 'SAUCE.DTA';
               end;
          15 : begin
                   CurrentType := 'DRINK RECIPES'; CurrentFile := 'DRINK.DTA';
               end;
       end;
       Repeat
           WriteStatusLine('(E)nter New Recipe      (L)ist Recipes In File      e(X)it To CP/M');
           Read(Kbd,Choice);
       Until Choice in ['E','e','L','l','X','x'];
       Case Choice of
           'E','e' : EnterRecipe;
           'L','l' : ListNames;
           'X','x' : begin
                         ClrScr;
                         Halt;
                     end;
       end;
Until (Choice = 'X') or (Choice = 'x');
end.