pkgglobals.pp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. {$mode objfpc}
  2. {$h+}
  3. unit pkgglobals;
  4. interface
  5. uses
  6. SysUtils,
  7. Classes;
  8. Const
  9. {$ifdef unix}
  10. ExeExt = '';
  11. {$else unix}
  12. ExeExt = '.exe';
  13. {$endif unix}
  14. Type
  15. TVerbosity = (vError,vInfo,vCommands,vDebug);
  16. TVerbosities = Set of TVerbosity;
  17. EPackagerError = class(Exception);
  18. // Logging
  19. Function StringToVerbosity (S : String) : TVerbosity;
  20. Function VerbosityToString (V : TVerbosity): String;
  21. Procedure Log(Level: TVerbosity;Msg : String);
  22. Procedure Log(Level: TVerbosity;Fmt : String; const Args : array of const);
  23. Procedure Error(Msg : String);
  24. Procedure Error(Fmt : String; const Args : array of const);
  25. // Utils
  26. function maybequoted(const s:string):string;
  27. Function FixPath(const S : String) : string;
  28. var
  29. Verbosity : TVerbosities;
  30. Implementation
  31. uses
  32. typinfo,
  33. contnrs,
  34. uriparser,
  35. pkgmessages;
  36. function StringToVerbosity(S: String): TVerbosity;
  37. Var
  38. I : integer;
  39. begin
  40. I:=GetEnumValue(TypeInfo(TVerbosity),'v'+S);
  41. If (I<>-1) then
  42. Result:=TVerbosity(I)
  43. else
  44. Raise EPackagerError.CreateFmt(SErrInvalidVerbosity,[S]);
  45. end;
  46. Function VerbosityToString (V : TVerbosity): String;
  47. begin
  48. Result:=GetEnumName(TypeInfo(TVerbosity),Integer(V));
  49. Delete(Result,1,1);// Delete 'v'
  50. end;
  51. procedure Log(Level:TVerbosity;Msg: String);
  52. begin
  53. if Level in Verbosity then
  54. Writeln(stdErr,Msg);
  55. end;
  56. Procedure Log(Level:TVerbosity; Fmt:String; const Args:array of const);
  57. begin
  58. Log(Level,Format(Fmt,Args));
  59. end;
  60. procedure Error(Msg: String);
  61. begin
  62. Raise EPackagerError.Create(Msg);
  63. end;
  64. procedure Error(Fmt: String; const Args: array of const);
  65. begin
  66. Raise EPackagerError.CreateFmt(Fmt,Args);
  67. end;
  68. function maybequoted(const s:string):string;
  69. const
  70. {$IFDEF MSWINDOWS}
  71. FORBIDDEN_CHARS = ['!', '@', '#', '$', '%', '^', '&', '*', '(', ')',
  72. '{', '}', '''', '`', '~'];
  73. {$ELSE}
  74. FORBIDDEN_CHARS = ['!', '@', '#', '$', '%', '^', '&', '*', '(', ')',
  75. '{', '}', '''', ':', '\', '`', '~'];
  76. {$ENDIF}
  77. var
  78. s1 : string;
  79. i : integer;
  80. quoted : boolean;
  81. begin
  82. quoted:=false;
  83. s1:='"';
  84. for i:=1 to length(s) do
  85. begin
  86. case s[i] of
  87. '"' :
  88. begin
  89. quoted:=true;
  90. s1:=s1+'\"';
  91. end;
  92. ' ',
  93. #128..#255 :
  94. begin
  95. quoted:=true;
  96. s1:=s1+s[i];
  97. end;
  98. else begin
  99. if s[i] in FORBIDDEN_CHARS then
  100. quoted:=True;
  101. s1:=s1+s[i];
  102. end;
  103. end;
  104. end;
  105. if quoted then
  106. maybequoted:=s1+'"'
  107. else
  108. maybequoted:=s;
  109. end;
  110. Function FixPath(const S : String) : string;
  111. begin
  112. If (S<>'') then
  113. Result:=IncludeTrailingPathDelimiter(S)
  114. else
  115. Result:='';
  116. end;
  117. end.