mkfpdocproj.pp 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. program mkfpdocproj;
  2. {$mode objfpc}{$H+}
  3. uses
  4. Classes, SysUtils, CustApp, mgrfpdocproj;
  5. type
  6. { TManageFPDocProjectApplication }
  7. TManageFPDocProjectApplication = class(TCustomApplication)
  8. private
  9. FMGR : TFPDocProjectManager;
  10. FPackageName,
  11. FInputFileName,
  12. FOutputFileName,
  13. FCmd : String;
  14. FCmdArgs,
  15. FCmdOptions: TStrings;
  16. procedure AddDescrFiles;
  17. procedure AddDescriptionDirs;
  18. procedure AddInputDirs;
  19. procedure AddInputFiles;
  20. function CmdNeedsPackage: Boolean;
  21. procedure RemoveInputFiles;
  22. procedure RemoveDescrFiles;
  23. procedure AddPackages;
  24. function CheckCmdOption(C: Char; S: String): Boolean;
  25. function GetCmdOption(C: Char; S: String): String;
  26. procedure SetOptions(Enable: Boolean);
  27. protected
  28. procedure ParseOptions;
  29. Procedure Error(Const Msg : String);
  30. procedure Usage(AExitCode: Integer);
  31. procedure DoRun; override;
  32. public
  33. constructor Create(TheOwner: TComponent); override;
  34. Destructor Destroy; override;
  35. end;
  36. Resourcestring
  37. SErrNeedArgument = 'Option at position %d needs an argument: %s';
  38. { TManageFPDocProjectApplication }
  39. procedure TManageFPDocProjectApplication.Usage(AExitCode : Integer);
  40. begin
  41. // to be filled
  42. Halt(AExitCode);
  43. end;
  44. Function CheckOptionStr(O : String;Short : Char;Long : String): Boolean;
  45. begin
  46. Result:=(O='-'+short) or (O='--'+long) or (copy(O,1,Length(Long)+3)=('--'+long+'='));
  47. end;
  48. function TManageFPDocProjectApplication.CmdNeedsPackage : Boolean;
  49. begin
  50. Result:=(FCMd<>'expand-macros') and (FCMD<>'set-options') and (FCmd<>'unset-options');
  51. end;
  52. procedure TManageFPDocProjectApplication.ParseOptions;
  53. Function CheckOption(Index : Integer;Short : char;Long : String): Boolean;
  54. begin
  55. Result:=CheckOptionStr(ParamStr(Index),Short,Long);
  56. end;
  57. Function OptionArg(Var Index : Integer) : String;
  58. Var
  59. P : Integer;
  60. begin
  61. if (Length(ParamStr(Index))>1) and (Paramstr(Index)[2]<>'-') then
  62. begin
  63. If Index<ParamCount then
  64. begin
  65. Inc(Index);
  66. Result:=Paramstr(Index);
  67. end
  68. else
  69. Error(Format(SErrNeedArgument,[Index,ParamStr(Index)]));
  70. end
  71. else If length(ParamStr(Index))>2 then
  72. begin
  73. P:=Pos('=',Paramstr(Index));
  74. If (P=0) then
  75. Error(Format(SErrNeedArgument,[Index,ParamStr(Index)]))
  76. else
  77. begin
  78. Result:=Paramstr(Index);
  79. Delete(Result,1,P);
  80. end;
  81. end;
  82. end;
  83. Var
  84. I : Integer;
  85. S : String;
  86. begin
  87. I:=0;
  88. // We can't use the TCustomApplication option handling,
  89. // because they cannot handle [general opts] [command] [cmd-opts] [args]
  90. While (I<ParamCount) do
  91. begin
  92. Inc(I);
  93. if (FCmd='') then
  94. begin
  95. if Checkoption(I,'i','input') then
  96. FInputFileName:=OptionArg(i)
  97. else if Checkoption(I,'o','output') then
  98. FOutputFileName:=OptionArg(i)
  99. else if CheckOption(I,'p','package') then
  100. FPackageName:=OptionArg(i)
  101. else if CheckOption(I,'h','help') then
  102. Usage(0)
  103. else if (ParamStr(i)<>'') then
  104. begin
  105. S:=ParamStr(i);
  106. if (S[1]='-') then
  107. Error('Unknown option : '+S)
  108. else
  109. FCmd:=lowercase(S)
  110. end
  111. end
  112. else
  113. begin
  114. S:=ParamStr(I);
  115. if (S<>'') then
  116. if (S[1]<>'-') then
  117. FCmdArgs.Add(S)
  118. else
  119. FCmdOptions.Add(S);
  120. end;
  121. end;
  122. if (FOutputFileName='') then
  123. FOutputFileName:=FInputFileName;
  124. If (FOutputFileName='') then
  125. Error('Need an output filename');
  126. if (FPackageName='') and CmdNeedsPackage then
  127. Error('Need a package name');
  128. if (FCmd='') then
  129. Error('Need a command');
  130. end;
  131. procedure TManageFPDocProjectApplication.Error(Const Msg: String);
  132. begin
  133. Writeln('Error : ',Msg);
  134. Usage(1);
  135. end;
  136. Function TManageFPDocProjectApplication.CheckCmdOption(C : Char; S : String) : Boolean;
  137. Var
  138. I : integer;
  139. begin
  140. I:=0;
  141. Result:=False;
  142. While (Not Result) and (I<FCmdOptions.Count) do
  143. begin
  144. Result:=CheckOptionStr(FCmdOptions[i],C,S);
  145. Inc(I);
  146. end;
  147. end;
  148. Function TManageFPDocProjectApplication.GetCmdOption(C : Char; S : String) : String;
  149. Var
  150. I,P : integer;
  151. B : Boolean;
  152. begin
  153. I:=0;
  154. B:=False;
  155. While (Not B) and (I<FCmdOptions.Count) do
  156. begin
  157. B:=CheckOptionStr(FCmdOptions[i],C,S);
  158. if B then
  159. begin
  160. Result:=FCmdOptions[I];
  161. if (Length(Result)>1) and (Result[2]<>'-') then
  162. begin
  163. If I<FCmdOptions.Count-1 then
  164. begin
  165. Inc(I);
  166. Result:=FCmdOptions[I];
  167. end
  168. else
  169. Error(Format(SErrNeedArgument,[I,Result]));
  170. end
  171. else If length(Result)>2 then
  172. begin
  173. P:=Pos('=',Result);
  174. If (P=0) then
  175. Error(Format(SErrNeedArgument,[I,Result]))
  176. else
  177. Delete(Result,1,P);
  178. end;
  179. end;
  180. Inc(I);
  181. end;
  182. end;
  183. procedure TManageFPDocProjectApplication.AddDescriptionDirs;
  184. Var
  185. Recursive: Boolean;
  186. Mask : String;
  187. I : Integer;
  188. begin
  189. Recursive:=CheckCmdOption('r','recursive');
  190. Mask:=GetCmdOption('m','mask');
  191. if FCmdArgs.Count=0 then
  192. FMGr.AddDescrFilesFromDirectory('',Mask,Recursive)
  193. else
  194. For I:=0 to FCmdArgs.Count-1 do
  195. FMGr.AddDescrFilesFromDirectory(FCmdArgs[i],Mask,Recursive);
  196. end;
  197. procedure TManageFPDocProjectApplication.AddInputDirs;
  198. Var
  199. Recursive: Boolean;
  200. Options,Mask : String;
  201. I : Integer;
  202. begin
  203. Recursive:=CheckCmdOption('r','recursive');
  204. Mask:=GetCmdOption('m','mask');
  205. Options:=GetCmdOption('o','options');
  206. if FCmdArgs.Count=0 then
  207. FMGr.AddInputFilesFromDirectory('',Mask,Options,Recursive)
  208. else
  209. For I:=0 to FCmdArgs.Count-1 do
  210. FMGr.AddInputFilesFromDirectory(FCmdArgs[i],Mask,Options,Recursive);
  211. end;
  212. procedure TManageFPDocProjectApplication.AddInputFiles;
  213. Var
  214. Options : String;
  215. I : Integer;
  216. begin
  217. Options:=GetCmdOption('o','options');
  218. For I:=0 to FCmdArgs.Count-1 do
  219. FMGr.AddInputFile(FCmdArgs[i],Options);
  220. end;
  221. procedure TManageFPDocProjectApplication.RemoveInputFiles;
  222. Var
  223. I : Integer;
  224. begin
  225. For I:=0 to FCmdArgs.Count-1 do
  226. FMGr.RemoveInputFile(FCmdArgs[i]);
  227. end;
  228. procedure TManageFPDocProjectApplication.RemoveDescrFiles;
  229. Var
  230. I : Integer;
  231. begin
  232. For I:=0 to FCmdArgs.Count-1 do
  233. FMGr.RemoveDescrFile(FCmdArgs[i]);
  234. end;
  235. procedure TManageFPDocProjectApplication.AddPackages;
  236. var
  237. I : Integer;
  238. begin
  239. For I:=0 to FCmdArgs.Count-1 do
  240. FMgr.AddPackage(FCmdArgs[i]);
  241. end;
  242. procedure TManageFPDocProjectApplication.AddDescrFiles;
  243. Var
  244. I : Integer;
  245. begin
  246. For I:=0 to FCmdArgs.Count-1 do
  247. FMGr.AddDescrFile(FCmdArgs[i]);
  248. end;
  249. procedure TManageFPDocProjectApplication.SetOptions(Enable : Boolean);
  250. Var
  251. I : Integer;
  252. begin
  253. For I:=0 to FCmdArgs.Count-1 do
  254. FMgr.SetOption(FCmdArgs[i],Enable);
  255. end;
  256. procedure TManageFPDocProjectApplication.DoRun;
  257. begin
  258. ParseOptions;
  259. if (FInputFileName='') then
  260. FMGR.AddPackage(FPackageName)
  261. else
  262. begin
  263. if (FCmd='expand-macros') then
  264. begin
  265. FMGR.Macros:=FCmdArgs;
  266. FMGR.ExpandMacros:=true;
  267. FMGR.ReadOptionFile(FInputFileName)
  268. end
  269. else
  270. begin
  271. FMGR.ReadOptionFile(FInputFileName);
  272. if CmdNeedsPackage then
  273. FMGR.SelectPackage(FPackageName);
  274. end
  275. end;
  276. if (FCmd='add-packages') then
  277. AddPackages
  278. else if (FCmd='add-description-dirs') then
  279. AddDescriptionDirs
  280. else if (FCmd='add-input-dirs') then
  281. AddInputDirs
  282. else if (FCmd='add-input-files') then
  283. AddInputFiles
  284. else if (FCmd='add-description-files') then
  285. AddDescrFiles
  286. else if (FCmd='remove-input-files') then
  287. RemoveInputFiles
  288. else if (FCmd='remove-descr-files') then
  289. RemoveDescrFiles
  290. else if (FCmd='set-options') then
  291. SetOptions(True)
  292. else if (FCmd='unset-options') then
  293. SetOptions(False)
  294. else if (FCMd<>'expand-macros') then
  295. Error(Format('Unknown command : "%s"',[FCmd]));
  296. FMgr.WriteOptionFile(FOutputFileName);
  297. Terminate;
  298. end;
  299. constructor TManageFPDocProjectApplication.Create(TheOwner: TComponent);
  300. begin
  301. inherited Create(TheOwner);
  302. StopOnException:=True;
  303. FCmdArgs:=TStringList.Create;
  304. FCmdOptions:=TStringList.Create;
  305. FMGR:=TFPDocProjectManager.Create(Self);
  306. end;
  307. destructor TManageFPDocProjectApplication.Destroy;
  308. begin
  309. FreeAndNil(FMGR);
  310. FreeAndNil(FCmdArgs);
  311. FreeAndNil(FCmdOptions);
  312. inherited Destroy;
  313. end;
  314. var
  315. Application: TManageFPDocProjectApplication;
  316. begin
  317. Application:=TManageFPDocProjectApplication.Create(nil);
  318. Application.Title:='Program to manipulate FPDoc project files';
  319. Application.Run;
  320. Application.Free;
  321. end.