mkfpdocproj.pp 8.8 KB

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