123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409 |
- {
- FPDoc - Free Pascal Documentation Tool
- Copyright (C) 2000 - 2003 by
- Areca Systems GmbH / Sebastian Guenther, [email protected]
- 2005-2012 by
- various FPC contributors
- See the file COPYING, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- }
- program FPDoc;
- uses
- {$ifdef LZX_USETHREADS}
- {$ifdef Unix}
- CThreads,
- {$endif}
- {$endif}
- {$ifdef unix}
- cwstring,
- {$endif}
- SysUtils, Classes, Gettext, custapp,
- dGlobals, // Global definitions, constants.
- fpdocclasstree, // Class tree builder
- dwriter, // TFPDocWriter definition.
- dwlinear, // Linear (abstract) writer
- dw_LaTeX, // TLaTex writer
- dw_XML, // XML writer
- dw_dxml, // Delphi XML doc.
- dw_HTML, // HTML writer
- dw_ipflin, // IPF writer (new linear output)
- dw_man, // Man page writer
- dw_linrtf, // linear RTF writer
- dw_txt, // TXT writer
- fpdocproj, mkfpdoc;
- Type
- { TFPDocApplication }
- TFPDocApplication = Class(TCustomApplication)
- private
- FCreator : TFPDocCreator;
- FPackage : TFPDocPackage;
- FDryRun,
- FProjectFile : Boolean;
- FWriteProjectFile : String;
- Protected
- procedure OutputLog(Sender: TObject; const Msg: String);
- procedure ParseCommandLine;
- procedure ParseOption(const S: String);
- Procedure Usage(AnExitCode : Byte);
- Procedure DoRun; override;
- Public
- Constructor Create(AOwner : TComponent); override;
- Destructor Destroy; override;
- Function SelectedPackage : TFPDocPackage;
- end;
- Procedure TFPDocApplication.Usage(AnExitCode : Byte);
- Var
- I,P : Integer;
- S : String;
- L : TStringList;
- C : TFPDocWriterClass;
- Backend : String;
- begin
- Writeln(Format(SCmdLineHelp,[ExtractFileName(Paramstr(0))]));
- Writeln(SUsageOption010);
- Writeln(SUsageOption020);
- Writeln(SUsageOption030);
- Writeln(SUsageOption035);
- Writeln(SUsageOption040);
- Writeln(SUsageOption050);
- Writeln(SUsageOption060);
- Writeln(SUsageOption070);
- Writeln(SUsageOption080);
- Writeln(SUsageOption090);
- Writeln(SUsageOption100);
- Writeln(SUsageOption110);
- Writeln(SUsageOption120);
- Writeln(SUsageOption130);
- Writeln(SUsageOption140);
- Writeln(SUsageOption150);
- Writeln(SUsageOption160);
- Writeln(SUsageOption170);
- Writeln(SUsageOption180);
- Writeln(SUsageOption190);
- Writeln(SUsageOption200);
- Writeln(SUsageOption210);
- Writeln(SUsageOption220);
- Writeln(SUsageOption230);
- Writeln(SUsageOption240);
- Writeln(SUsageOption250);
- Writeln(SUsageOption260);
- Writeln(SUsageOption270);
- Writeln(SUsageOption280);
- Writeln(SUsageOption290);
- Writeln(SUsageOption300);
- Writeln(SUsageOption310);
- Writeln(SUsageOption320);
- L:=TStringList.Create;
- Try
- Backend:=FCreator.OPtions.Backend;
- If (Backend='') then
- begin
- Writeln;
- Writeln(SUsageFormats);
- EnumWriters(L);
- For I:=0 to L.Count-1 do
- begin
- S:=L[i];
- P:=Pos('=',S);
- Writeln(Format(' %s - %s',[Copy(S,1,P-1)+Space(10-p),Copy(S,P+1,Length(S))]));
- end;
- Writeln(SUsageBackendHelp);
- end
- else
- begin
- Writeln;
- Writeln(Format(SUsageFormatSpecific,[Lowercase(backend)]));
- C:=GetWriterClass(Backend);
- C.Usage(L);
- If L.Count>0 then
- For I:=0 to (L.Count-1) div 2 do
- begin
- S:=L[i*2];
- Writeln(Format('%s %s',[S+Space(30-Length(S)),L[(i*2)+1]]));
- end;
- end;
- Finally
- L.Free;
- end;
- Halt(AnExitCode);
- end;
- destructor TFPDocApplication.Destroy;
- begin
- FreeAndNil(FCreator);
- Inherited;
- end;
- function TFPDocApplication.SelectedPackage: TFPDocPackage;
- var
- i:integer;
- begin
- Result:=FPackage;
- if (FPackage=Nil) or (FPackage.Name='') then
- begin
- Writeln(SNeedPackageName);
- if FCreator.Packages.Count>0 then
- begin
- if (FCreator.Packages[0].Name<>'') then
- Writeln(SAvailablePackages);
- for i:=0 to FCreator.Packages.Count-1 do
- begin
- Writeln(FCreator.Packages[i].Name);
- end;
- end;
- Usage(1);
- end;
- end;
- procedure TFPDocApplication.OutputLog(Sender: TObject; const Msg: String);
- begin
- Writeln(StdErr,Msg);
- end;
- procedure TFPDocApplication.ParseCommandLine;
- Function ProjectOpt(Const s : string) : boolean;
- begin
- Result:=(Copy(s,1,3)='-p=') or (Copy(s,1,10)='--project=');
- end;
- Function PackageOpt(Const s : string) : boolean;
- begin
- Result:=((Copy(s,1,3)='-a=') or (Copy(s,1,10)='--package='));
- end;
- var
- i : Integer;
- s : string;
- begin
- // Check project
- for i := 1 to ParamCount do
- begin
- s:=ParamStr(I);
- If ProjectOpt(S) then
- ParseOption(s);
- If (FCreator.Packages.Count=1) then
- FPackage:=FCreator.Packages[0]
- else if (FCreator.Options.DefaultPackageName<>'') then
- Fpackage:=FCreator.Packages.FindPackage(FCreator.Options.DefaultPackageName);
- end;
- If FCreator.Project.Packages.Count=0 then
- begin // Add default package if none defined
- FPackage:=FCreator.Packages.Add as TFPDocPackage;
- end;
- // Check package
- for i := 1 to ParamCount do
- begin
- s:=ParamStr(I);
- If PackageOpt(S) then
- ParseOption(s);
- end;
- for i := 1 to ParamCount do
- begin
- s:=ParamStr(I);
- If Not (ProjectOpt(s) or PackageOpt(S)) then
- ParseOption(s);
- end;
- SelectedPackage; // Will print error if none available.
- end;
- procedure TFPDocApplication.ParseOption(Const S : String);
- procedure AddDirToFileList(List: TStrings; const ADirName, AMask: String);
- Var
- Info : TSearchRec;
- D : String;
- begin
- if (ADirName<>'') and not DirectoryExists(ADirName) then
- OutputLog(Self,'Directory '+ADirName+' does not exist')
- else
- begin
- if (ADirName='.') or (ADirName='') then
- D:=''
- else
- D:=IncludeTrailingPathDelimiter(ADirName);
- If (FindFirst(D+AMask,0,Info)=0) then
- try
- Repeat
- If (Info.Attr and faDirectory)=0 then
- List.Add(D+Info.name);
- Until FindNext(Info)<>0;
- finally
- FindClose(Info);
- end;
- end;
- end;
- procedure AddToFileList(List: TStrings; const FileName: String);
- var
- f: Text;
- s: String;
- begin
- if Copy(FileName, 1, 1) = '@' then
- begin
- AssignFile(f, Copy(FileName, 2, Length(FileName)));
- Reset(f);
- while not EOF(f) do
- begin
- ReadLn(f, s);
- List.Add(s);
- end;
- Close(f);
- end else
- List.Add(FileName);
- end;
- var
- i: Integer;
- Cmd, Arg: String;
- begin
- if (s = '-h') or (s = '--help') then
- Usage(0)
- else if s = '--hide-protected' then
- FCreator.Options.HideProtected := True
- else if s = '--warn-no-node' then
- FCreator.Options.WarnNoNode := True
- else if s = '--show-private' then
- FCreator.Options.ShowPrivate := False
- else if s = '--stop-on-parser-error' then
- FCreator.Options.StopOnParseError := True
- else if s = '--dont-trim' then
- FCreator.Options.DontTrim := True
- else
- begin
- i := Pos('=', s);
- if i > 0 then
- begin
- Cmd := Copy(s, 1, i - 1);
- Arg := Copy(s, i + 1, Length(s));
- end
- else
- begin
- Cmd := s;
- SetLength(Arg, 0);
- end;
- if (Cmd = '--project') or (Cmd='-p') then
- begin
- FProjectFile:=True;
- FCreator.LoadProjectFile(Arg);
- end
- else if (Cmd = '--descr') then
- AddToFileList(SelectedPackage.Descriptions, Arg)
- else if (Cmd = '--descr-dir') then
- AddDirToFileList(SelectedPackage.Descriptions, Arg, '*.xml')
- else if (Cmd = '-f') or (Cmd = '--format') then
- begin
- Arg:=UpperCase(Arg);
- If FindWriterClass(Arg)=-1 then
- WriteLn(StdErr, Format(SCmdLineInvalidFormat, [Arg]))
- else
- FCreator.Options.BackEnd:=Arg;
- end
- else if (Cmd = '-l') or (Cmd = '--lang') then
- FCreator.Options.Language := Arg
- else if (Cmd = '-i') or (Cmd = '--input') then
- AddToFileList(SelectedPackage.Inputs, Arg)
- else if (Cmd = '--input-dir') then
- begin
- AddDirToFileList(SelectedPackage.Inputs, Arg,'*.pp');
- AddDirToFileList(SelectedPackage.Inputs, Arg,'*.pas');
- end
- else if (Cmd = '-o') or (Cmd = '--output') then
- SelectedPackage.Output := Arg
- else if (Cmd = '-v') or (Cmd = '--verbose') then
- FCreator.Verbose:=true
- else if (Cmd = '-n') or (Cmd = '--dry-run') then
- FDryRun:=True
- else if (Cmd = '-t') or (Cmd = '--emit-notes') then
- FCreator.Options.EmitNotes := True
- else if Cmd = '--content' then
- SelectedPackage.ContentFile := Arg
- else if Cmd = '--import' then
- SelectedPackage.Imports.Add(Arg)
- else if Cmd = '--package' then
- begin
- If FProjectFile then
- FPackage:=FCreator.Packages.FindPackage(Arg)
- else
- FPackage.Name:=Arg;
- end
- else if Cmd = '--ostarget' then
- FCreator.Options.OSTarget := Arg
- else if Cmd = '--cputarget' then
- FCreator.Options.CPUTarget := Arg
- else if Cmd = '--mo-dir' then
- FCreator.Options.modir := Arg
- else if Cmd = '--parse-impl' then
- FCreator.Options.InterfaceOnly:=false
- else if Cmd = '--write-project' then
- FWriteProjectFile:=Arg
- else
- begin
- FCreator.Options.BackendOptions.Add(Cmd);
- FCreator.Options.BackendOptions.Add(Arg);
- end;
- end;
- end;
- Procedure TFPDocApplication.DoRun;
- begin
- {$IFDEF Unix}
- gettext.TranslateResourceStrings('/usr/local/share/locale/%s/LC_MESSAGES/fpdoc.mo');
- {$ELSE}
- gettext.TranslateResourceStrings('intl/fpdoc.%s.mo');
- {$ENDIF}
- WriteLn(STitle);
- WriteLn(Format(SVersion, [DefFPCVersion, DefFPCDate]));
- WriteLn(SCopyright1);
- WriteLn(SCopyright2);
- WriteLn;
- ParseCommandLine;
- if (FWriteProjectFile<>'') then
- FCreator.CreateProjectFile(FWriteProjectFile)
- else
- FCreator.CreateDocumentation(FPackage,FDryRun);
- WriteLn(SDone);
- Terminate;
- end;
- constructor TFPDocApplication.Create(AOwner: TComponent);
- begin
- inherited Create(AOwner);
- StopOnException:=true;
- FCreator:=TFPDocCreator.Create(Self);
- FCreator.OnLog:=@OutputLog;
- end;
- begin
- With TFPDocApplication.Create(Nil) do
- try
- Run;
- finally
- Free;
- end;
- end.
|