123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- {
- !!! Someone please fix DRIVERS.PAS, so it doesn't clears the screen on exit
- when we didn't use any of it's functions, just had it in 'uses'
- Then we can delete GetDosTicks() from WHelp...
- }
- uses Objects,WUtils,WHelp,WTPHWriter;
- const
- SrcExt = '.txt';
- HelpExt = '.fph';
- TokenPrefix = '.';
- CommentPrefix = ';';
- TokenIndex = 'INDEX';
- TokenTopic = 'TOPIC';
- TokenCode = 'CODE';
- FirstTempTopic = 1000000;
- CR = #$0D;
- LF = #$0A;
- type
- THCIndexEntry = record
- Tag : PString;
- TopicName: PString;
- end;
- THCTopic = record
- Name : PString;
- Topic : PTopic;
- end;
- PHCIndexEntryCollection = ^THCIndexEntryCollection;
- THCIndexEntryCollection = object(T
- var SrcName, DestName: string;
- HelpFile : THelpFileWriter;
- procedure Print(const S: string);
- begin
- writeln(S);
- end;
- procedure Abort; forward;
- procedure Help;
- begin
- Print('Syntax : TPHC <helpsource>[.TXT] <helpfile>[.FPH]');
- Abort;
- end;
- procedure Fatal(const S: string);
- begin
- Print('Fatal: '+S);
- Abort;
- end;
- procedure Warning(const S: string);
- begin
- Print('Warning: '+S);
- end;
- procedure ProcessParams;
- begin
- if (ParamCount<1) or (ParamCount>2) then Help;
- SrcName:=ParamStr(1);
- if ExtOf(SrcName)='' then SrcName:=SrcName+SrcExt;
- if ParamCount=1 then
- DestName:=DirAndNameOf(SrcName)+HelpExt
- else
- begin
- DestName:=ParamStr(2);
- if ExtOf(DestName)='' then DestName:=DestName+HelpExt;
- end;
- end;
- procedure Compile(SrcS, DestS: PStream);
- var CurLine: string;
- CurLineNo: longint;
- CurTopic : PTopic;
- HelpFile: PHelpFileWriter;
- InCode: boolean;
- NextTempTopic: longint;
- procedure AddLine(const S: string);
- begin
- if CurTopic<>nil then
- HelpFile^.AddLineToTopic(CurTopic,S);
- end;
- procedure ProcessToken(S: string);
- var P: byte;
- Token: string;
- TopicName: string;
- TopicContext: THelpCtx;
- Text: string;
- begin
- S:=Trim(S);
- P:=Pos(' ',S); if P=0 then P:=length(S)+1;
- Token:=UpcaseStr(copy(S,1,P-1)); Delete(S,1,P); S:=Trim(S);
- if Token=TokenIndex then
- begin
- if InCode then AddLine(hscCode);
- if copy(S,1,1)<>'{' then
- Fatal('"{" expected at line '+IntToStr(CurLineNo));
- if copy(S,length(S),1)<>'}' then
- Fatal('"}" expected at line '+IntToStr(CurLineNo));
- S:=copy(S,2,length(S)-2);
- P:=Pos(':',S); if P=0 then P:=length(S)+1;
- Text:=copy(S,1,!!
- end else
- if Token=TokenTopic then
- begin
- if InCode then AddLine(hscCode);
- P:=Pos(' ',S); if P=0 then P:=length(S)+1;
- TopicName:=UpcaseStr(copy(S,1,P-1)); Delete(S,1,P); S:=Trim(S);
- if TopicName='' then
- Fatal('Topic name missing at line '+IntToStr(CurLineNo));
- if S='' then
- TopicContext:=0
- else
- if copy(S,1,1)<>'=' then
- begin
- Fatal('"=" expected at line '+IntToStr(CurLineNo));
- TopicContext:=0;
- end
- else
- begin
- S:=Trim(copy(S,2,255));
- TopicContext:=StrToInt(S);
- if LastStrToIntResult<>0 then
- Fatal('Error interpreting context number at line '+IntToStr(CurLineNo));
- end;
- if TopicContext=0 then
- begin
- TopicContext:=NextTempTopic;
- Inc(NextTempTopic);
- end;
- CurTopic:=HelpFile^.CreateTopic(TopicContext);
- end else
- if Token=TokenCode then
- begin
- AddLine(hscCode);
- InCode:=not InCode;
- end else
- Warning('Uknown token "'+Token+'" encountered at line '+IntToStr(CurLineNo));
- end;
- procedure ProcessLine(const S: string);
- begin
- AddLine(S);
- end;
- function ReadNextLine: boolean;
- var C: char;
- begin
- Inc(CurLineNo);
- CurLine:='';
- repeat
- SrcS^.Read(C,1);
- if (C in[CR,LF])=false then
- CurLine:=CurLine+C;
- until (C=LF) or (SrcS^.Status<>stOK);
- ReadNextLine:=(SrcS^.Status=stOK);
- end;
- var OK: boolean;
- begin
- New(HelpFile, InitStream(DestS,0));
- CurTopic:=nil; CurLineNo:=0;
- NextTempTopic:=FirstTempTopic;
- InCode:=false;
- repeat
- OK:=ReadNextLine;
- if OK then
- if copy(CurLine,1,length(CommentPrefix))=CommentPrefix then
- { comment }
- else
- if copy(CurLine,1,length(TokenPrefix))=TokenPrefix then
- ProcessToken(copy(CurLine,2,255))
- else
- { normal help-text }
- begin
- ProcessLine(CurLine);
- end;
- until OK=false;
- if HelpFile^.WriteFile=false then
- Fatal('Error writing help file.');
- Dispose(HelpFile, Done);
- end;
- const SrcS : PBufStream = nil;
- DestS : PBufStream = nil;
- procedure Abort;
- begin
- if SrcS<>nil then Dispose(SrcS, Done); SrcS:=nil;
- if DestS<>nil then Dispose(DestS, Done); DestS:=nil;
- end;
- BEGIN
- Print('þ Help Compiler Version 0.9 Copyright (c) 1999 by B‚rczi G bor');
- ProcessParams;
- New(SrcS, Init(SrcName, stOpenRead, 4096));
- if (SrcS=nil) or (SrcS^.Status<>stOK) then
- Fatal('Error opening source file.');
- New(DestS, Init(DestName, stCreate, 4096));
- if (DestS=nil) or (DestS^.Status<>stOK) then
- Fatal('Error creating destination file.');
- Compile(SrcS,DestS);
- END.
|