home *** CD-ROM | disk | FTP | other *** search
- { RTFGEN }
-
- (********* Source code (C) Copyright 1992, by L. David Baldwin *********)
- (********* All Rights Reserved *********)
-
- {$A+,B-,E-,F-,G-,I+,N-,O-,R-,S-,V-,X-}
- {$M 16384,0,0}
-
- PROGRAM RTFGEN;
- USES Crt{, MySubs};
- CONST
- TwipsPerSpace = 120;
- DefaultFont : STRING[6] = '2';
- DefaultFontSize : STRING[10] = '20';
- ParaChar : CHAR = '`';
- Tokenleng = 28; {Max symbol length}
- Tab = #9;
- MaxRes = 13;
- TYPE
- Symb = (
- OtherChar, Comma, Colon, SemiColon, Lbrack, Rbrack, Dot, Slash,
- LLbrack, RRbrack, OtherPunct, Ident, EolSy, Space, ParaSy, TabSy,
- BuildTagSy, TopicSy, TitleSy, KeyWordSy, BrowseSy,
- TopicStart, TopicEnd, DocStartSy, DocEndSy, CommandSy, BMCSy, BMLSy,
- BMRSy, FontCommand, Number, BlockStartSy, BlockEndSy);
- SymString = STRING[14];
- VAR
- Sy, SaveSy : Symb;
- CONST
- ResWord : ARRAY[1..MaxRes] OF SymString = (
- '\buildtag', '\topic', '\title', '\keyword', '\browse', '\bmc', '\bml',
- '\bmr', '\docstart', '\docend', '\tab', '\blockstart', '\blockend');
- ResSy : ARRAY[1..MaxRes] OF Symb = (
- BuildTagSy, TopicSy, TitleSy, KeyWordSy, BrowseSy, BMCSy, BMLSy,
- BMRSy, DocStartSy, DocEndSy, TabSy, BlockStartSy, BlockEndSy);
- TYPE
- TokenString = STRING[Tokenleng];
- String127 = STRING[127];
- Filestring = STRING[64];
- PairType = ARRAY[0..1] OF CHAR;
- VAR
- BrackCount, LineNo, Chi, ErrCount : INTEGER;
- Pair : WORD;
- Spair : PairType ABSOLUTE Pair;
- LCh : CHAR ABSOLUTE Pair;
- UCh : CHAR;
- St : String127;
- ErrFlag, EofInf, InInclude, InTopic : BOOLEAN;
- SourceName : Filestring;
- Inf, Outf : Text;
- InBuff, OutBuff : ARRAY[1..1000] OF CHAR;
- VALUE : LONGINT;
- LCToken : TokenString;
- OutString, GlobalHeader, TopicHeader : STRING;
- BlockHeader : ARRAY[1..4] OF STRING;
- BIndex : INTEGER;
-
- {-------------Error}
- PROCEDURE Error(II :INTEGER; S :String127);
- VAR X,Y : INTEGER;
- NewS : String127;
- BEGIN
- GotoXY(1,WhereY);
- WriteLn(St);
- Y:=WhereY;
- X:=II-3; IF X<1 THEN X:=1;
- GotoXY(X, Y);
- Write('^');
- Str(LineNo, NewS);
- NewS := NewS + ' Error';
- IF S[0]>#0 THEN NewS:=NewS + ', '+S;
- IF X+Ord(NewS[0])>80 THEN X:=X-Ord(NewS[0]) ELSE X:=X+1;
- GotoXY(X,Y); WriteLn(NewS);
- ErrCount:=Succ(ErrCount);
- IF ErrCount>6 THEN
- BEGIN
- WriteLn('Excessive Number of Errors');
- Halt(1);
- END;
- ErrFlag := TRUE;
- END;
-
- {-------------Positn}
- FUNCTION Positn(Pat, Src : STRING; I : INTEGER) : INTEGER;
- {find the position of a substring in a string starting at the Ith char}
- VAR
- N : INTEGER;
- BEGIN
- IF I < 1 THEN I := 1;
- Delete(Src, 1, I-1);
- N := Pos(Pat, Src);
- IF N = 0 THEN Positn := 0
- ELSE Positn := N+I-1;
- END;
-
- {-------------OutFile}
- PROCEDURE OutFile(S : STRING);
- VAR
- WriteIt : BOOLEAN;
- Leng, I : INTEGER;
- BEGIN
- {a hard to find bug is mismatched braces. Keep count of these so
- can keep track of matching.}
- I := 0;
- REPEAT
- I := Positn('{', S, I+1);
- IF (I > 0) THEN
- IF NOT ((I > 1) AND (S[I-1] = '\')) THEN Inc(BrackCount);
- UNTIL I = 0;
- REPEAT
- I := Positn('}', S, I+1);
- IF (I > 0) THEN
- IF NOT ((I > 1) AND (S[I-1] = '\')) THEN Dec(BrackCount);
- UNTIL I = 0;
-
- {try to avoid hanging spaces on end of lines as editors delete them}
- Leng := Length(OutString)+Length(S);
- WriteIt := (Leng >= 75) AND (OutString[Length(OutString)] <> ' ')
- OR (Leng >= 200);
- IF WriteIt THEN
- BEGIN
- WriteLn(Outf, OutString);
- OutString := S;
- END
- ELSE OutString := OutString+S;
- END;
-
- {-------------Flush}
- PROCEDURE Flush;
- BEGIN
- IF Length(OutString) > 0 THEN
- BEGIN WriteLn(Outf, OutString); OutString := ''; END;
- END;
-
- {-------------GetCh}
- PROCEDURE GetCh;
- {Return next char in Uch and Lch with Uch in upper case. Ignore comments}
- VAR Comment : BOOLEAN;
- PROCEDURE GetchBasic; {read a character and a character pair}
- BEGIN
- IF Chi<=Ord(St[0]) THEN
- BEGIN {NOTE: pair has the same address as lch}
- Pair := MemW[DSeg : Ofs(St[Chi])];
- IF (LCh=Tab) AND NOT InTopic THEN LCh:=' ';
- UCh := UpCase(LCh);
- Chi := Chi+1;
- END
- ELSE
- IF NOT EoF(Inf) THEN
- BEGIN
- ReadLn(Inf,St);
- Inc(LineNo);
- St:=St+^M; {Add EOL}
- Chi:=1;
- GetCh;
- END
- ELSE
- BEGIN
- EofInf:=TRUE;
- IF Comment THEN
- BEGIN
- WriteLn('Open Comment at End of Input File');
- Halt(1);
- END;
- END;
- END;
-
- BEGIN {Getch}
- REPEAT
- IF EofInf THEN
- BEGIN WriteLn('Unexpected End of Input File'); Halt(1) END;
- Comment:=FALSE;
- GetchBasic;
- IF (Spair='(*') THEN
- BEGIN
- Comment:=TRUE;
- REPEAT GetchBasic; UNTIL Spair='*)';
- GetchBasic; {pass by the '*'}
- END;
- UNTIL NOT Comment;
- END;
-
- {-----------IsPair}
- FUNCTION IsPair : BOOLEAN;
- CONST
- Limit = 8;
- PA : ARRAY[1..Limit] OF PairType = (
- '[[', ']]', '\[', '\]', '\\', '\`',
- '\{', '\}'); {!! <- if '`' made optional, change!!}
- VAR
- I : INTEGER;
- Was : PairType;
- BEGIN
- IsPair := FALSE;
- FOR I := 1 TO Limit DO
- IF PA[I] = Spair THEN
- BEGIN
- Was := Spair;
- Sy := OtherPunct;
- IsPair := TRUE;
- GetCh;
- CASE I OF
- 5,7,8 : LCToken := Was;
- 1 : Sy := LLbrack;
- 2 : Sy := RRbrack;
- ELSE LCToken := LCh;
- END;
- GetCh;
- Exit;
- END;
- END;
-
- {-------------GetNumber}
- FUNCTION GetNumber : BOOLEAN; {Pick up a Number}
- VAR
- Done : BOOLEAN;
- Code : INTEGER;
- BEGIN
- CASE UCh OF
- '0'..'9' : LCToken := '';
- ELSE
- BEGIN
- GetNumber := FALSE;
- Exit;
- END;
- END;
- GetNumber := TRUE;
- Sy := Number;
- Done := FALSE;
- IF NOT EofInf THEN
- WHILE NOT Done DO
- CASE UCh OF
- '0'..'9' :
- BEGIN
- LCToken := LCToken+UCh;
- GetCh;
- END;
- ELSE Done := TRUE;
- END;
- Val(LCToken, VALUE, Code);
- END;
-
- {-------------GetCommand}
- FUNCTION GetCommand : BOOLEAN; {Pick up a Command}
- LABEL 2;
- CONST
- MaxFC = 10;
- FontCommands : ARRAY[1..MaxFC] OF STRING[6] =
- ('f', 'fs', 'b', 'i', 'strike', 'ul', 'ulw', 'uld', 'uldb',
- 'plain');
- VAR
- Done : BOOLEAN;
- I : INTEGER;
- AlphaOnly : TokenString;
- BEGIN
- GetCommand := FALSE;
- IF UCh <> '\' THEN Exit;
-
- GetCommand := TRUE;
- Sy := CommandSy;
- LCToken := LCh;
- AlphaOnly := '';
- GetCh;
- Done := FALSE;
- IF NOT EofInf THEN
- BEGIN
- WHILE NOT Done DO
- CASE LCh OF
- 'a'..'z' :
- BEGIN
- IF Length(LCToken)<Tokenleng THEN
- BEGIN
- Inc(LCToken[0]);
- LCToken[Length(LCToken)] := LCh;
- Inc(AlphaOnly[0]);
- AlphaOnly[Length(AlphaOnly)] := LCh;
- END;
- GetCh;
- END;
- ELSE Done := TRUE;
- END;
- IF LCh = '-' THEN
- BEGIN
- IF Length(LCToken)<Tokenleng THEN
- BEGIN
- Inc(LCToken[0]);
- LCToken[Length(LCToken)] := LCh;
- END;
- GetCh;
- END;
- Done := FALSE;
- WHILE NOT Done DO
- CASE LCh OF
- '0'..'9' :
- BEGIN
- IF Length(LCToken)<Tokenleng THEN
- BEGIN
- Inc(LCToken[0]);
- LCToken[Length(LCToken)] := LCh;
- END;
- GetCh;
- END;
- ELSE Done := TRUE;
- END;
- END;
-
- FOR I := 1 TO MaxRes DO
- IF LCToken = ResWord[I] THEN
- BEGIN
- Sy := ResSy[I];
- GOTO 2;
- END;
- IF NOT InTopic THEN
- FOR I := 1 TO MaxFC DO
- IF AlphaOnly = FontCommands[I] THEN
- BEGIN
- Sy := FontCommand;
- GOTO 2;
- END;
- 2 : {account for possible space after command}
- IF Length(LCToken)<Tokenleng THEN
- BEGIN
- Inc(LCToken[0]);
- LCToken[Length(LCToken)] := ' ';
- END;
- IF UCh = ' ' THEN GetCh; {use up a space}
- END;
-
- {-------------GetIdent}
- FUNCTION GetIdent : BOOLEAN; {Pick up a Symbol}
- VAR
- Done : BOOLEAN;
- I : INTEGER;
- BEGIN
- GetIdent := FALSE;
- CASE UCh OF
- 'A'..'Z', '_' : ;
- ELSE
- Exit;
- END;
- GetIdent := TRUE;
- Sy := Ident;
- LCToken := LCh;
- GetCh;
- Done := FALSE;
- IF NOT EofInf THEN
- WHILE NOT Done DO
- CASE UCh OF
- 'A'..'Z', '0'..'9', '_' :
- BEGIN
- IF Length(LCToken)<Tokenleng THEN
- BEGIN
- Inc(LCToken[0]);
- LCToken[Length(LCToken)] := LCh;
- END;
- GetCh;
- END;
- ELSE Done := TRUE;
- END;
- END;
-
- {-------------GetTopicEnd}
- FUNCTION GetTopicEnd : BOOLEAN;
- BEGIN
- GetTopicEnd := FALSE;
- IF UCh <> '-' THEN Exit;
- IF Pos('----', St) <> 1 THEN Exit;
- Chi := Length(St)+1; {ignore remainder of St}
- IF NOT EofInf THEN
- GetCh;
- GetTopicEnd := TRUE;
- IF NOT InTopic THEN Error(Chi, '----- when not within topic');
- Sy := TopicEnd;
- END;
-
- {-------------GetTopicStart}
- FUNCTION GetTopicStart : BOOLEAN;
- BEGIN
- GetTopicStart := FALSE;
- IF UCh <> '=' THEN Exit;
- IF Pos('====', St) <> 1 THEN Exit;
- Chi := Length(St)+1; {ignore remainder of St}
- IF NOT EofInf THEN
- GetCh;
- GetTopicStart := TRUE;
- IF InTopic THEN Error(Chi, '==== when already within topic');
- Sy := TopicStart;
- END;
-
- {-----------Punctuation}
- FUNCTION Punctuation : BOOLEAN;
- {-Check to see if Uch is a punctuation mark; if so, store the
- punctuation type in Sy}
- VAR
- I : INTEGER;
- CONST
- Punct : STRING[10] = ^M^I' :;[].';
- SyArray : ARRAY[1..8] OF Symb = (
- EolSy, TabSy, Space, Colon, SemiColon, Lbrack, Rbrack, Dot);
- BEGIN
- Punctuation := FALSE;
- I := Pos(UCh, Punct);
- CASE I OF
- 1..8 :
- Sy := SyArray[I];
- ELSE IF UCh = ParaChar THEN
- Sy := ParaSy
- ELSE Exit;
- END;
- Punctuation := TRUE;
- CASE Sy OF
- EolSy : LCToken := ' ';
- ParaSy : LCToken := '';
- TabSy : LCToken := '\tab ';
- ELSE LCToken := LCh;
- END;
- GetCh;
- END;
-
- {-----------Next}
- PROCEDURE Next;
- {-Get the next token on the command line}
- BEGIN {Next}
- IF EofInf THEN
- BEGIN
- WriteLn('Unexpected end of input file');
- Close(Outf);
- Close(Inf);
- Halt(1);
- END;
- IF IsPair THEN
- ELSE IF GetCommand THEN
- ELSE IF GetIdent THEN
- ELSE IF GetNumber THEN
- ELSE IF GetTopicEnd THEN
- ELSE IF GetTopicStart THEN
- ELSE IF Punctuation THEN
- ELSE
- BEGIN
- Sy := OtherChar;
- LCToken := LCh;
- IF NOT EofInf THEN GetCh;
- END;
- END; {Next}
-
- {-------------SkipWhiteSpace}
- PROCEDURE SkipWhiteSpace;
- BEGIN
- WHILE (UCh = ' ') OR (UCh = Tab) DO
- GetCh;
- END;
-
- {-------------ParagraphText}
- PROCEDURE ParagraphText;
-
- PROCEDURE DoBitmap;
- VAR
- S : STRING[30];
- Count : INTEGER;
- CONST
- FileChars : SET OF CHAR = ['A'..'Z', 'a'..'z', '0'..'9', '!', '#'..'''',
- '@', '^'..'`', '~'];
- BEGIN
- OutFile('\{');
- CASE Sy OF
- BMCSy : S := 'bmc ';
- BMRSy : S := 'bmr ';
- BMLSy : S := 'bml ';
- END;
- SkipWhiteSpace;
- Count := 0;
- WHILE LCh IN FileChars DO
- BEGIN
- S := S+LCh;
- GetCh;
- Inc(Count);
- END;
- IF (Count > 8) OR (Count = 0) THEN Error(Chi, 'Filename Exp');
- IF LCh = '.' THEN
- BEGIN
- S := S+LCh;
- GetCh;
- Count := 0;
- WHILE LCh IN FileChars DO
- BEGIN
- S := S+LCh;
- GetCh;
- Inc(Count);
- END;
- IF (Count > 3) THEN Error(Chi, 'Filename Exp');
- END;
- Next;
- OutFile(S+'\}');
- END;
-
- PROCEDURE CrossRef;
- VAR
- SyWas : Symb;
- BEGIN
- SyWas := Sy;
- IF Sy = Lbrack THEN
- OutFile('{\uldb ')
- ELSE OutFile('{\ul ');
- SkipWhiteSpace;
- Next;
- CASE Sy OF
- BMCSy, BMLSy, BMRSy :
- BEGIN
- DoBitmap;
- WHILE Sy = Space DO Next;
- END;
- ELSE
- BEGIN
- WHILE (Sy <> Colon) AND (Sy <> EolSy) DO
- BEGIN
- OutFile(LCToken);
- Next;
- END;
- END;
- END;
- OutFile('}');
- IF Sy <> Colon THEN Error(Chi, 'Colon Exp');
- Next; {use up colon}
- WHILE Sy = Space DO Next;
- IF (Sy <> Ident) AND (Sy <> Dot) AND (Sy <> Number) THEN
- Error(Chi, 'Syntax Error in cross reference');
- OutFile('{\v ');
- REPEAT
- OutFile(LCToken);
- Next;
- UNTIL (Sy <> Ident) AND (Sy <> Dot) AND (Sy <> Number);
- OutFile('}');
- WHILE Sy = Space DO Next;
- IF SyWas = Lbrack THEN
- BEGIN
- IF Sy <> Rbrack THEN Error(Chi, '] Exp');
- END
- ELSE IF Sy <> RRbrack THEN Error(Chi, ']] Exp');
- END;
-
- BEGIN
- WHILE (Sy <> ParaSy) AND (Sy <> TopicEnd) AND (Sy <> BlockStartSy)
- AND (Sy <> BlockEndSy) DO
- BEGIN
- CASE Sy OF
- EolSy :
- BEGIN
- OutFile(' ');
- SkipWhiteSpace;
- END;
- Lbrack, LLbrack : CrossRef;
- BMCSy, BMLSy, BMRSy : DoBitmap;
- ELSE OutFile(LCToken);
- END;
- Next;
- END;
- IF Sy = ParaSy THEN
- BEGIN
- REPEAT
- Next; {skip trailing stuff, mainly spaces}
- UNTIL Sy = EolSy;
- Next;
- END;
- END;
-
- {-------------Paragraph}
- PROCEDURE Paragraph;
- VAR
- Count : INTEGER;
- S : STRING[10];
- BEGIN
- REPEAT {repeat ignores blank lines with spaces}
- WHILE Sy = EolSy DO
- BEGIN
- OutFile('\par');
- Next;
- END;
- Count := 0;
- WHILE (Sy = Space) OR (Sy = TabSy) DO
- BEGIN
- IF Sy = TabSy THEN
- Count := ((Count DIV 5) +1) * 5 + 1
- ELSE Inc(Count);
- Next;
- END;
- UNTIL Sy <> EolSy;
- IF (Sy <> TopicEnd) AND (Sy <> BlockStartSy) AND (Sy <> BlockEndSy) THEN
- BEGIN
- IF Count > 0 THEN
- BEGIN
- Str(Count * TwipsPerSpace:-1, S);
- OutFile('\li'+S);
- END;
- {at start of each paragraph, output the paragraph commands entered in
- the headers}
- IF BIndex > 0 THEN
- OutFile('{'+BlockHeader[BIndex])
- ELSE
- OutFile('{'+GlobalHeader+TopicHeader);
- ParagraphText; {do all the text}
- OutFile('}\par\pard');
- Flush;
- END;
- END;
-
- {-------------DoTopic}
- PROCEDURE DoTopic;
- BEGIN
- OutFile('#{\footnote \pard\plain \sl240 \fs20 # ');
- SkipWhiteSpace;
- Next;
- WHILE (Sy = Ident) OR (Sy = Dot) OR (Sy = Number) DO
- BEGIN
- OutFile(LCToken);
- Next;
- END;
- IF Sy <> ParaSy THEN Error(Chi, 'Paragraph mark Exp')
- ELSE Next;
- OutFile('}');
- Flush;
- END;
-
- {-------------DoBrowse}
- PROCEDURE DoBrowse;
- VAR
- Err : BOOLEAN;
- BEGIN
- OutFile('+{\footnote \pard\plain \sl240 \fs20 + ');
- SkipWhiteSpace;
- Next;
- REPEAT {Browse symbol can contain many things up to ':' }
- CASE Sy OF
- OtherChar, Comma, SemiColon, Lbrack, Rbrack, Dot, Slash,
- OtherPunct, Ident, Space, TabSy, Number : Err := FALSE;
- ELSE Err := TRUE;
- END;
- IF Err THEN Error(Chi, 'Syntax error in \Browse');
- OutFile(LCToken);
- Next;
- UNTIL (Sy = Colon) OR (Sy = ParaSy) OR (Sy = EolSy);
- IF Sy = Colon THEN
- BEGIN
- SkipWhiteSpace;
- Next;
- IF Sy <> Number THEN Error(Chi, 'Number Exp in Browse');
- OutFile(':'+LCToken);
- SkipWhiteSpace;
- Next;
- END
- ELSE Error(Chi, 'Colon Exp');
- IF Sy <> ParaSy THEN Error(Chi, 'Paragraph mark Exp');
- OutFile('}');
- Flush;
- Next;
- END;
-
- {-------------DoKeyWord}
- PROCEDURE DoKeyWord;
- VAR
- Err : BOOLEAN;
- Ch : CHAR;
- S : STRING[10];
- BEGIN
- CASE Sy OF
- KeyWordSy : Ch := 'K';
- TitleSy : Ch := '$';
- BuildTagSy : Ch := '*';
- END;
- S := LCToken; {save for possible error msg}
- OutFile(Ch+'{\footnote \pard\plain \sl240 \fs20 '+Ch+' ');
- SkipWhiteSpace;
- Next;
- REPEAT {symbols can contain many things }
- CASE Sy OF
- OtherChar, Comma, Colon, SemiColon, Lbrack, Rbrack, Dot, Slash,
- OtherPunct, Ident, Space, TabSy, Number : Err := FALSE;
- ELSE Err := TRUE;
- END;
- IF Err THEN Error(Chi, 'Syntax error in '+S);
- OutFile(LCToken);
- Next;
- UNTIL (Sy = ParaSy) OR (Sy = EolSy);
- IF Sy <> ParaSy THEN Error(Chi, 'Paragraph mark exp');
- OutFile('}');
- Flush;
- Next;
- END;
-
- {-------------DoPage}
- PROCEDURE DoPage;
- BEGIN
- InTopic := TRUE;
- Next;
- WHILE Sy <> TopicEnd DO
- IF Sy = BlockStartSy THEN
- BEGIN
- IF BIndex >= 4 THEN Error(Chi, 'Too many nested blocks')
- ELSE Inc(BIndex);
- BlockHeader[BIndex] := '';
- Next;
- WHILE (Sy <> ParaSy) AND (Sy <> EolSy) DO
- BEGIN
- IF Sy = CommandSy THEN
- BlockHeader[BIndex] := BlockHeader[BIndex]+LCToken
- ELSE IF Sy <> Space THEN Error(Chi, 'Command Expected');
- Next;
- END;
- IF Sy = ParaSy THEN Next;
- IF Sy = EolSy THEN Next;
- END
- ELSE IF Sy = BlockEndSy THEN
- BEGIN
- IF BIndex < 1 THEN Error(Chi, 'Unmatched \blockend')
- ELSE Dec(BIndex);
- WHILE Sy <> EolSy DO Next; {\BlockEnd should be on its own line}
- Next;
- END
- ELSE
- Paragraph;
- IF NOT EofInf THEN Next;
- OutFile('}\page'); Flush;
- IF BIndex <> 0 THEN
- BEGIN
- Error(Chi, 'Unmatched \blockstart in previous topic');
- BIndex := 0;
- END;
- InTopic := FALSE;
- IF BrackCount <> 0 THEN
- BEGIN
- Error(Chi, '{..} imbalance in last topic');
- BrackCount := 0;
- END;
- END;
-
- {-------------DoDocument}
- PROCEDURE DoDocument;
- BEGIN
- Flush;
- Next;
- IF Sy <> DocEndSy THEN OutFile('{');
- WHILE Sy <> DocEndSy DO
- CASE Sy OF
- TopicSy : DoTopic;
- KeyWordSy, BuildTagSy, TitleSy :
- DoKeyWord;
- BrowseSy : DoBrowse;
- TopicStart :
- BEGIN
- DoPage;
- TopicHeader := ''; {get ready for a new topic header string}
- WHILE (Sy = EolSy) OR (Sy = Space) OR (Sy = TabSy) DO Next;
- IF Sy <> DocEndSy THEN OutFile('{');
- END;
- EolSy : Next;
- CommandSy :
- BEGIN
- TopicHeader := TopicHeader+LCToken; {add in commands}
- Next;
- END;
- FontCommand :
- BEGIN
- OutFile(LCToken);
- Next;
- END;
- ELSE Next; {ignore other junk}
- END;
- Flush;
- OutFile('}');
- END;
-
- {$I COMMAND.INC}
-
- {-------------MAIN}
- BEGIN
- ErrCount := 0; LineNo := 0; BIndex := 0; BrackCount := 0;
- OutString := '';
- GlobalHeader := '';
- TopicHeader := '';
- IF ParamCount >= 1 THEN CommandInput ELSE PromptForInput;
- ReadHeader;
- EofInf := FALSE; InTopic := FALSE; ErrFlag := FALSE;
- InInclude := FALSE;
- OutFile('\f'+DefaultFont+'\fs'+DefaultFontSize);
- St[0] := #0; Chi := 1; {get the reading started}
- GetCh;
- Next;
- WHILE NOT EofInf AND (Sy <> DocStartSy) DO
- BEGIN
- IF Sy = CommandSy THEN
- GlobalHeader := GlobalHeader+LCToken
- ELSE IF Sy = FontCommand THEN
- OutFile(LCToken); {else ignore}
- Next;
- END;
- IF Sy = DocStartSy THEN DoDocument;
- Flush;
-
- Close(Inf);
- Close(Outf);
- IF ErrFlag THEN Halt(1);
- END.
-
-