home *** CD-ROM | disk | FTP | other *** search
- PROCEDURE Bld_Menu_List;
- VAR Menu_File : TEXT;
- Line : STRING;
- Temp_Menu_Ptr,Last_Menu_Ptr : Menu_Ptr;
- Temp_Opt : Opt_Rec;
- Opened : BOOLEAN;
- Opt_Nbr : BYTE;
-
- FUNCTION Good_Opt_Line (Line : STRING; VAR Temp_Opt : Opt_Rec) : BOOLEAN;
- VAR Nbr_Flds,Next_Delim : BYTE;
- s : STRING;
- BEGIN
- Line := CONCAT(Line,Opt_Delim);
- Nbr_Flds := 0;
- WHILE LENGTH(Line) > 0 DO
- BEGIN
- Next_Delim := Scan(Line,Forwards,EQ,Opt_Delim);
- s := COPY(Line,1,Next_Delim);
- Nbr_Flds := Nbr_Flds + 1;
- IF Next_Delim < LENGTH(Line) THEN
- Next_Delim := Next_Delim + 1;
- DELETE (Line,1,Next_Delim);
- WITH Temp_Opt DO
- CASE Nbr_Flds OF
- 1 : IF Upper_Case(s) = 'DELIM' THEN Opt_Type := Delim ELSE
- IF Upper_Case(s) = 'MENU' THEN Opt_Type := Menu ELSE Opt_Type := Batch;
- 2 : IF LENGTH(s) = 0 THEN Select_Key := CHR(0) ELSE Select_Key := s[1];
- 3 : IF LENGTH(s) > Max_Opt_Len THEN Opt_Name := COPY(s,1,Max_Opt_Len) ELSE Opt_Name := s;
- 4 : IF LENGTH(s) > 55 THEN Prg_Dir := COPY(s,1,55) ELSE Prg_Dir := s;
- 5 : IF LENGTH(s) > 12 THEN Prg_Name := COPY(s,1,12) ELSE Prg_Name := s;
- 6 : IF LENGTH(s) > 55 THEN Parms := COPY(s,1,55) ELSE Parms := s;
- 7 : IF LENGTH(s) > 8 THEN Bat_Name := COPY(s,1,8) ELSE Bat_Name := s;
- 8 : IF LENGTH(s) > 8 THEN Password := COPY(s,1,8) ELSE Password := s;
- 9 : IF LENGTH(s) = 0 THEN Pause := FALSE ELSE Pause := TRUE;
- 10 : IF LENGTH(s) = 0 THEN Prompts := FALSE ELSE Prompts := TRUE;
- ELSE
- Line := ''; { error of some sort }
- END;
- IF (Nbr_Flds = 10) AND (LENGTH(Line) > 0) THEN
- Line := ''; { force a finish }
- END;
- IF (Nbr_Flds = 10) AND (LENGTH(Line) = 0) THEN
- Good_Opt_Line := TRUE
- ELSE
- Good_Opt_Line := FALSE;
- END;
-
- FUNCTION Good_Menu_Line (Line : STRING; VAR Temp_Menu_Ptr : Menu_Ptr) : BOOLEAN;
- VAR Nbr_Flds,Next_Delim : BYTE;
- s : STRING;
- BEGIN
- Line := CONCAT(Line,Menu_Delim);
- Nbr_Flds := 0;
- WHILE LENGTH(Line) > 0 DO
- BEGIN
- Next_Delim := Scan(Line,Forwards,EQ,Menu_Delim);
- s := COPY(Line,1,Next_Delim);
- Nbr_Flds := Nbr_Flds + 1;
- IF Next_Delim < LENGTH(Line) THEN
- Next_Delim := Next_Delim + 1;
- DELETE (Line,1,Next_Delim);
- WITH Temp_Menu_Ptr^ DO
- CASE Nbr_Flds OF
- 1 : IF LENGTH(s) > Max_Opt_Len THEN Menu_Name := COPY(s,1,Max_Opt_Len) ELSE Menu_Name := s;
- 2 : BEGIN VAL(s,Row,IO_Error); IF IO_Error > 0 THEN Row := 2; END;
- 3 : BEGIN VAL(s,Col,IO_Error); IF IO_Error > 0 THEN Col := 2; END;
- ELSE
- Line := ''; { error of some sort }
- END;
- IF (Nbr_Flds = 3) AND (LENGTH(Line) > 0) THEN
- Line := ''; { force a finish }
- END;
- IF (Nbr_Flds = 3) AND (LENGTH(Line) = 0) THEN
- Good_Menu_Line := TRUE
- ELSE
- Good_Menu_Line := FALSE;
- END;
-
- BEGIN { Bld_Menu_List }
- ASSIGN (Menu_File,'MENUFILE.DAT');
- Opened := FALSE;
- REPEAT
- {$I-}
- RESET (Menu_File);
- {$I+}
- IO_Error := IORESULT;
- IF IO_Error = 0 THEN
- Opened := TRUE
- ELSE
- IF IO_Error = 2 THEN { file doesn't exist - create it }
- BEGIN
- {$I-}
- REWRITE (Menu_File);
- {$I+}
- IO_Error := IORESULT;
- IF IO_Error > 0 THEN { have a real problem here... }
- BEGIN
- Sound_Bell;
- WRITELN;
- WRITELN ('+=====================================+');
- WRITELN ('|<<<<<<<<<<<<<<<<ERROR>>>>>>>>>>>>>>>>|');
- WRITELN ('| |');
- WRITELN ('| "Menu Manager" detected the follow- |');
- WRITELN ('| ing UNRECOVERABLE error on the RE- |');
- WRITELN ('| WRITE of the file "MENUFILE.DAT": |');
- WRITELN ('| |');
- WRITELN ('| IORESULT = ',IO_Error:5,' |');
- WRITELN ('| |');
- WRITELN ('+======================================+');
- HALT;
- END;
- {$I-}
- CLOSE (Menu_File);
- {$I+}
- END
- ELSE { have a real probelm here... }
- BEGIN
- Sound_Bell;
- WRITELN;
- WRITELN ('+=====================================+');
- WRITELN ('|<<<<<<<<<<<<<<<<ERROR>>>>>>>>>>>>>>>>|');
- WRITELN ('| |');
- WRITELN ('| "Menu Manager" detected the follow- |');
- WRITELN ('| ing UNRECOVERABLE error on the RE- |');
- WRITELN ('| SET of the file "MENUFILE.DAT": |');
- WRITELN ('| |');
- WRITELN ('| IORESULT = ',IO_Error:5,' |');
- WRITELN ('| |');
- WRITELN ('+======================================+');
- HALT;
- END;
- UNTIL Opened;
-
- Head_Menu_Ptr := NIL;
- Temp_Menu_Ptr := NIL;
- REPEAT
- {$I-}
- READLN (Menu_File,Line); { read in a line }
- {$I+}
- IF Scan(Line,Forwards,EQ,Menu_Delim) < LENGTH(Line) THEN { we've got a new menu }
- BEGIN
- NEW (Temp_Menu_Ptr);
- IF Good_Menu_Line(Line,Temp_Menu_Ptr) THEN
- WITH Temp_Menu_Ptr^ DO
- BEGIN
- FILLCHAR (Opts,SIZEOF(Opts),CHR(0));
- Menu_Status := Unused;
- Exit_Menu_Name := ''; { will modify dynamically }
- Cur_Opt_Row := 0; { will modify dynamically }
- Next_Menu_Ptr := NIL;
- Menu_Scr_Ptr := NIL;
- IF Head_Menu_Ptr = NIL THEN
- BEGIN
- Head_Menu_Ptr := Temp_Menu_Ptr;
- Head_Menu_Ptr^.Exit_Menu_Name := 'DUMMY'; { never used on head menu }
- END
- ELSE
- Last_Menu_Ptr^.Next_Menu_Ptr := Temp_Menu_Ptr;
- Last_Menu_Ptr := Temp_Menu_Ptr;
- Opt_Nbr := 0;
- END;
- END
- ELSE { we've got an option item }
- IF Temp_Menu_Ptr <> NIL THEN
- IF Good_Opt_Line(Line,Temp_Opt) THEN
- BEGIN
- Opt_Nbr := Opt_Nbr + 1;
- IF Opt_Nbr > Max_Nbr_Opts THEN
- Opt_Nbr := Max_Nbr_Opts;
- Last_Menu_Ptr^.Opts[Opt_Nbr] := Temp_Opt;
- END;
- UNTIL EOF(Menu_File);
- {$I-}
- CLOSE (Menu_File);
- {$I+}
- END;
-