home *** CD-ROM | disk | FTP | other *** search
- program MenuCompiler; { menu compiler program }
- {$I-} { turn off I/O checking }
-
- Uses
- STI_STRN;
-
- Const
- MAXSTRLEN = 60;
-
- Type
- Dumm = array[1..2] of byte;
- Head = record
- Name : string[MAXSTRLEN];
- Version : word;
- Mode : byte;
- Save : boolean;
- BackColor : byte;
- InputS : byte;
- NumMenus : word;
- end;
- Sel = record
- Prompt : string[MAXSTRLEN];
- Jump : boolean;
- Value : word;
- end;
- Posy = record
- MenuID : word;
- Position : longint;
- end;
- Ent = record
- MenuID : word;
- MenuTitle : string[MAXSTRLEN];
- MenuType : byte;
- BorderType: byte;
- BodyCol : byte;
- BorderCol : byte;
- TextCol : byte;
- HighLight : byte;
- PromptCol : byte;
- TitleCol : byte;
- Size : array[1..4] of byte;
- SelectNum : word;
- end;
-
- Var
- InputFile : text; { input file }
- OutputFile : file; { output file }
- Buffer : string; { parse buffer }
- Token : string; { current token }
- Header : Head; { menu file header }
- HeadWRFlag : boolean; { has the header been written }
- Buff : Posy; { position buffer }
- Menu : Ent; { currently processed menu }
- Select : Sel; { currently processed selection }
-
- {---------------------------------------------------------------------------}
-
- procedure Error(Message : string);
-
- begin
- writeln;
- writeln('Error : ',Message);
- writeln;
- halt;
- end;
-
- {---------------------------------------------------------------------------}
-
- procedure Usage;
-
- begin
- writeln;
- writeln('Usage : MENUCOMP <inputfile> <menufile>');
- writeln;
- halt;
- end;
-
- {---------------------------------------------------------------------------}
-
- procedure Message;
-
- begin
- writeln;
- writeln(' MENUCOMP');
- writeln(' The STI Menu Compiler');
- writeln(' Copyright (C) 1990,1991,1992 By Sofware Technology International');
- writeln(' All Rights Reserved');
- end;
-
- {---------------------------------------------------------------------------}
-
- procedure SetFiles;
-
- begin
- assign(InputFile,ParamStr(1));
- reset(InputFile);
- if IOResult <> 0 then
- Error('Could not open '+UpCaseStr(ParamStr(1)));
- assign(OutputFile,ParamStr(2));
- rewrite(OutputFile,1);
- if IOResult <> 0 then
- Error('Could not open '+UpCaseStr(ParamStr(2)));
- end;
-
- {---------------------------------------------------------------------------}
-
- function KeySearch(InString : string) : word;
-
- begin
- if InString = '%VERSION' then KeySearch := 0 else
- if InString = '%MENUFILE' then KeySearch := 1 else
- if InString = '%MODE' then KeySearch := 2 else
- if InString = '%SAVE' then KeySearch := 3 else
- if InString = '%BACKGROUND' then KeySearch := 4 else
- if InString = '%INPUT' then KeySearch := 5 else
- if InString = '%MENU' then KeySearch := 6 else
- if InString = '%MENU_TYPE' then KeySearch := 7 else
- if InString = '%BODY_COLOR' then KeySearch := 8 else
- if InString = '%BORDER_COLOR' then KeySearch := 9 else
- if InString = '%TEXT_COLOR' then KeySearch := 10 else
- if InString = '%HIGHLIGHT_COLOR' then KeySearch := 11 else
- if InString = '%PROMPT_COLOR' then KeySearch := 12 else
- if InString = '%TITLE_COLOR' then KeySearch := 13 else
- if InString = '%SIZE' then KeySearch := 14 else
- if InString = '%SELECTIONS' then KeySearch := 15 else
- if InString = '%END_MENU' then KeySearch := 16 else
- if InString = '%END_MENUFILE' then KeySearch := 17 else
- if InString = '%NUMBER_MENUS' then KeySearch := 18 else
- if InString = '%BORDER_TYPE' then KeySearch := 19 else
- if InString = '%SELECTION' then KeySearch := 20 else
-
- if InString = 'BLACK' then KeySearch := 31 else
- if InString = 'BLUE' then KeySearch := 32 else
- if InString = 'GREEN' then KeySearch := 33 else
- if InString = 'CYAN' then KeySearch := 34 else
- if InString = 'RED' then KeySearch := 35 else
- if InString = 'MAGENTA' then KeySearch := 36 else
- if InString = 'YELLOW' then KeySearch := 37 else
- if InString = 'WHITE' then KeySearch := 38 else
- if InString = 'GREYTILED' then KeySearch := 39 else
- if InString = 'BLACKREVERSE' then KeySearch := 40 else
- if InString = 'BLUEREVERSE' then KeySearch := 41 else
- if InString = 'GREENREVERSE' then KeySearch := 42 else
- if InString = 'CYANREVERSE' then KeySearch := 43 else
- if InString = 'REDREVERSE' then KeySearch := 44 else
- if InString = 'MAGENTAREVERSE' then KeySearch := 45 else
- if InString = 'YELLOWREVERSE' then KeySearch := 46 else
- if InString = 'WHITEREVERSE' then KeySearch := 47 else
-
-
- if InString = 'NOBORDER' then KeySearch := 48 else
- if InString = 'SPACEBORDER' then KeySearch := 49 else
- if InString = 'SINGLELINE' then KeySearch := 50 else
- if InString = 'ROUNDCORNERSINGLE' then KeySearch := 51 else
- if InString = 'BIGBLOCK' then KeySearch := 52 else
- if InString = 'THICKTOPTHINSIDES' then KeySearch := 53 else
- if InString = 'THICKDIAGONALCORNER' then KeySearch := 54 else
-
- if InString = 'KEYS' then KeySearch := 90 else
- if InString = 'MOUSE' then KeySearch := 91 else
- if InString = 'BOTH' then KeySearch := 92 else
- Error('Unrecognised token : '+InString);
- end;
-
- {---------------------------------------------------------------------------}
-
- procedure Write_Header;
-
- Var
- Loop : word;
- Dummy : Posy;
-
- begin
- Dummy.MenuID := 0;
- Dummy.Position := 0;
- Seek(OutputFile,0);
- BlockWrite(OutputFile,Header,sizeof(Header));
- for Loop := 1 to Header.NumMenus do
- BlockWrite(OutputFile,Dummy,sizeof(Posy));
- end;
-
- {---------------------------------------------------------------------------}
-
- procedure Write_Menu;
-
- begin
- Seek(OutputFile,sizeof(Header)+ (sizeof(Posy)*(Buff.MenuID-1)));
- BlockWrite(OutputFile,Buff,sizeof(Posy));
- Seek(OutputFile,Buff.Position);
- BlockWrite(OutputFile,Menu,sizeof(Ent));
- end;
-
- {---------------------------------------------------------------------------}
-
- procedure Semantic_Action(KeyValue : word);
-
- Var
- Loop : word;
- Test : integer;
-
- begin
- case KeyValue of
- 0 : begin { %VERSION X X }
- Parse(Buffer,Token,' '#9);
- Val(Token,Dumm(Header.Version)[1],Test);
- Parse(Buffer,Token,' '#9);
- Val(Token,Dumm(Header.Version)[2],Test);
- Buffer := '';
- end;
- 1 : begin { %MENUFILE "STRING" }
- FillChar(Header,32,sizeof(Head));
- Header.Name := '';
- Loop := pos('"',Buffer)+1;
- while Buffer[Loop] <> '"' do
- begin
- Header.Name := Header.Name + Buffer[Loop];
- Inc(Loop);
- end;
- Header.Name := Header.Name + #26' ';
- Buffer := '';
- end;
- 2 : begin { %MODE TEXT/GRAPHICS }
- Parse(Buffer,Token,' '#9);
- Token := UpCaseStr(Token);
- if Token = 'TEXT' then
- Header.Mode := 1
- else if Token = 'GRAPHICS' then
- Header.Mode := 2
- else
- Error('Unknown MODE : '+Token);
- Buffer := '';
- end;
- 3 : begin { %SAVE YES/NO }
- Parse(Buffer,Token,' '#9);
- Token := UpCaseStr(Token);
- if Token = 'YES' then
- Header.Save := TRUE
- else
- Header.Save := FALSE;
- Buffer := '';
- end;
- 4 : begin { %BACKGROUND COLOR }
- Parse(Buffer,Token,' '#9);
- Token := UpCaseStr(Token);
- Header.BackColor := KeySearch(Token)-31;
- Buffer := '';
- end;
- 5 : begin { %INPUT KEYS/MOUSE/BOTH }
- Parse(Buffer,Token,' '#9);
- Token := UpCaseStr(Token);
- Header.InputS := KeySearch(Token)-90;
- Buffer := '';
- end;
- 6 : begin { %MENU XXXXX "TITLE"/NULL }
- FillChar(Buff,32,sizeof(Posy));
- FillChar(Menu,32,sizeof(Ent));
- if not(HeadWRFlag) then
- begin
- Write_Header;
- HeadWRFlag := TRUE;
- end;
- Buff.Position := FilePos(OutputFile);
- Parse(Buffer,Token,' '#9);
- Val(Token,Buff.MenuID,Test);
- Menu.MenuID := Buff.MenuID;
- Menu.MenuTitle := '';
- Loop := Pos('"',Buffer)+1;
- if Loop > 1 then
- begin
- while Buffer[Loop] <> '"' do
- begin
- if Buffer[Loop] = #13 then
- Error('Unterminated String in %MENU');
- Menu.MenuTitle := Menu.MenuTitle + Buffer[Loop];
- Inc(Loop);
- end;
- end;
- Buffer := '';
- end;
- 7 : begin { %MENUTYPE BAR/BOX }
- Parse(Buffer,Token,' '#9);
- Token := UpCaseStr(Token);
- if Token = 'BAR' then
- Menu.MenuType := 1
- else if Token = 'BOX' then
- Menu.MenuType := 2
- else
- Error('Unrecognised menu type : '+Token);
- Buffer := '';
- end;
- 8 : begin { %BODY_COLOR COLOR }
- Parse(Buffer,Token,' '#9);
- Token := UpCaseStr(Token);
- Menu.BodyCol := KeySearch(Token)-31;
- Buffer := '';
- end;
- 9 : begin { %BORDER_COLOR COLOR }
- Parse(Buffer,Token,' '#9);
- Token := UpCaseStr(Token);
- Menu.BorderCol := KeySearch(Token)-31;
- Buffer := '';
- end;
- 10 : begin { %TEXT_COLOR COLOR }
- Parse(Buffer,Token,' '#9);
- Token := UpCaseStr(Token);
- Menu.TextCol := KeySearch(Token)-31;
- Buffer := '';
- end;
- 11 : begin { %HIGHLIGHT_COLOR COLOR }
- Parse(Buffer,Token,' '#9);
- Token := UpCaseStr(Token);
- Menu.HighLight := KeySearch(Token)-31;
- Buffer := '';
- end;
- 12 : begin { %PROMPT_COLOR COLOR }
- Parse(Buffer,Token,' '#9);
- Token := UpCaseStr(Token);
- Menu.PromptCol := KeySearch(Token)-31;
- Buffer := '';
- end;
- 13 : begin { %TITLE_COLOR COLOR }
- Parse(Buffer,Token,' '#9);
- Token := UpCaseStr(Token);
- Menu.TitleCol := KeySearch(Token)-31;
- Buffer := '';
- end;
- 14 : begin { %SIZE X1 Y1 X2 Y2 }
- Parse(Buffer,Token,' '#9);
- Val(Token,Menu.Size[1],Test);
- Parse(Buffer,Token,' '#9);
- Val(Token,Menu.Size[2],Test);
- Parse(Buffer,Token,' '#9);
- Val(Token,Menu.Size[3],Test);
- Parse(Buffer,Token,' '#9);
- Val(Token,Menu.Size[4],Test);
- Buffer := '';
- end;
- 15 : begin { %SELECTIONS XXXX }
- Parse(Buffer,Token,' '#9);
- Val(Token,Menu.SelectNum,Test);
- Buffer := '';
- Write_Menu;
- end;
- 16 : begin { %END_MENU }
- end;
- 17 : begin { %END_MENUFILE }
- Header.Name[length(Header.Name)] :=
- char((FileSize(OutputFile) div 128)+2);
- Seek(OutputFile,0);
- BlockWrite(OutputFile,Header,sizeof(Header));
- close(OutputFile);
- end;
- 18 : begin { %NUMBER_MENUS XXXXX }
- Parse(Buffer,Token,' '#9);
- Val(Token,Header.NumMenus,Test);
- Buffer := '';
- end;
- 19 : begin { %BORDER_TYPE TYPE }
- Parse(Buffer,Token,' '#9);
- Token := UpCaseStr(Token);
- Menu.BorderType := KeySearch(Token)-48;
- Buffer := '';
- end;
- 20 : begin { %SELECTION "PROMPT" RETURN/GOTO XX }
- FillChar(Select,32,sizeof(Sel));
- Loop := Pos('"',Buffer)+1;
- Select.Prompt := '';
- while Buffer[Loop] <> '"' do
- begin
- Select.Prompt := Select.Prompt + Buffer[Loop];
- Inc(Loop);
- end;
- Buffer := Copy(Buffer,Loop+1,255);
- Parse(Buffer,Token,' '#9);
- Token := UpCaseStr(Token);
- if Token = 'RETURN' then
- Select.Jump := FALSE
- else if Token = 'GOTO' then
- Select.Jump := TRUE
- else
- Error('Unrecognised RETURN/GOTO : '+Token);
- Parse(Buffer,Token,' '#9);
- Val(Token,Select.Value,Test);
- Buffer := '';
- BlockWrite(OutputFile,Select,sizeof(Sel));
- end;
- else
- Error('Unknown Command : '+Token);
- end;{case}
- end;
-
- {---------------------------------------------------------------------------}
-
- procedure ParseMenu;
-
- var
- Count : word;
-
- begin
- Count := 0;
- HeadWRFlag := FALSE;
- while not(eof(InputFile)) do
- begin
- Inc(Count);
- readln(InputFile,Buffer);
- write(#13,'Compiled ',Count,' Lines ');
- while Buffer <> '' do
- begin
- Parse(Buffer,Token,' '#9);
- if Token[1] = ';' then
- Buffer := ''
- else
- Semantic_Action(KeySearch(UpCaseStr(Token)));
- end;
- end;
- close(InputFile);
- end;
-
- {---------------------------------------------------------------------------}
-
- begin
- Message;
- if ParamCount < 2 then
- Usage;
- SetFiles;
- ParseMenu;
- end.