ISPPBuiltins.iss 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. // Inno Setup Preprocessor
  2. //
  3. // Inno Setup (C) 1997-2025 Jordan Russell. All Rights Reserved.
  4. // Portions Copyright (C) 2000-2025 Martijn Laan. All Rights Reserved.
  5. // Portions Copyright (C) 2001-2004 Alex Yackimoff. All Rights Reserved.
  6. //
  7. // See the ISPP help file for more documentation of the functions defined by this file
  8. //
  9. #if defined(ISPP_INVOKED) && !defined(_BUILTINS_ISS_)
  10. //
  11. #if PREPROCVER < 0x01000000
  12. # error Inno Setup Preprocessor version is outdated
  13. #endif
  14. //
  15. #define _BUILTINS_ISS_
  16. //
  17. #ifdef __OPT_E__
  18. # define private EnableOptE
  19. # pragma option -e-
  20. #endif
  21. #ifndef __POPT_P__
  22. # define private DisablePOptP
  23. #else
  24. # pragma parseroption -p-
  25. #endif
  26. #define NewLine "\n"
  27. #define Tab "\t"
  28. #pragma parseroption -p+
  29. #pragma spansymbol "\"
  30. #define True 1
  31. #define False 0
  32. #define Yes True
  33. #define No False
  34. #define MaxInt 0x7FFFFFFFFFFFFFFFL
  35. #define MinInt 0x8000000000000000L
  36. #define NULL
  37. #define void
  38. // TypeOf constants
  39. #define TYPE_ERROR 0
  40. #define TYPE_NULL 1
  41. #define TYPE_INTEGER 2
  42. #define TYPE_STRING 3
  43. #define TYPE_MACRO 4
  44. #define TYPE_FUNC 5
  45. #define TYPE_ARRAY 6
  46. // Helper macro to find out the type of an array element or expression. TypeOf
  47. // standard function only allows identifier as its parameter. Use this macro
  48. // to convert an expression to identifier.
  49. #define TypeOf2(any Expr) TypeOf(Expr)
  50. // ReadReg constants
  51. #define HKEY_CLASSES_ROOT 0x80000000UL
  52. #define HKEY_CURRENT_USER 0x80000001UL
  53. #define HKEY_LOCAL_MACHINE 0x80000002UL
  54. #define HKEY_USERS 0x80000003UL
  55. #define HKEY_CURRENT_CONFIG 0x80000005UL
  56. #define HKEY_CLASSES_ROOT_64 0x82000000UL
  57. #define HKEY_CURRENT_USER_64 0x82000001UL
  58. #define HKEY_LOCAL_MACHINE_64 0x82000002UL
  59. #define HKEY_USERS_64 0x82000003UL
  60. #define HKEY_CURRENT_CONFIG_64 0x82000005UL
  61. #define HKCR HKEY_CLASSES_ROOT
  62. #define HKCU HKEY_CURRENT_USER
  63. #define HKLM HKEY_LOCAL_MACHINE
  64. #define HKU HKEY_USERS
  65. #define HKCC HKEY_CURRENT_CONFIG
  66. #define HKCR64 HKEY_CLASSES_ROOT_64
  67. #define HKCU64 HKEY_CURRENT_USER_64
  68. #define HKLM64 HKEY_LOCAL_MACHINE_64
  69. #define HKU64 HKEY_USERS_64
  70. #define HKCC64 HKEY_CURRENT_CONFIG_64
  71. // Exec constants
  72. #define SW_HIDE 0
  73. #define SW_SHOWNORMAL 1
  74. #define SW_NORMAL 1
  75. #define SW_SHOWMINIMIZED 2
  76. #define SW_SHOWMAXIMIZED 3
  77. #define SW_MAXIMIZE 3
  78. #define SW_SHOWNOACTIVATE 4
  79. #define SW_SHOW 5
  80. #define SW_MINIMIZE 6
  81. #define SW_SHOWMINNOACTIVE 7
  82. #define SW_SHOWNA 8
  83. #define SW_RESTORE 9
  84. #define SW_SHOWDEFAULT 10
  85. #define SW_MAX 10
  86. // Find constants
  87. #define FIND_MATCH 0x00
  88. #define FIND_BEGINS 0x01
  89. #define FIND_ENDS 0x02
  90. #define FIND_CONTAINS 0x03
  91. #define FIND_CASESENSITIVE 0x04
  92. #define FIND_SENSITIVE FIND_CASESENSITIVE
  93. #define FIND_AND 0x00
  94. #define FIND_OR 0x08
  95. #define FIND_NOT 0x10
  96. #define FIND_TRIM 0x20
  97. // FindFirst constants
  98. #define faReadOnly 0x00000001
  99. #define faHidden 0x00000002
  100. #define faSysFile 0x00000004
  101. #define faVolumeID 0x00000008
  102. #define faDirectory 0x00000010
  103. #define faArchive 0x00000020
  104. #define faSymLink 0x00000040
  105. #define faAnyFile 0x0000003F
  106. // GetStringFileInfo standard names
  107. #define COMPANY_NAME "CompanyName"
  108. #define FILE_DESCRIPTION "FileDescription"
  109. #define FILE_VERSION "FileVersion"
  110. #define INTERNAL_NAME "InternalName"
  111. #define LEGAL_COPYRIGHT "LegalCopyright"
  112. #define ORIGINAL_FILENAME "OriginalFilename"
  113. #define PRODUCT_NAME "ProductName"
  114. #define PRODUCT_VERSION "ProductVersion"
  115. // GetStringFileInfo helpers
  116. #define GetFileCompany(str FileName) GetStringFileInfo(FileName, COMPANY_NAME)
  117. #define GetFileDescription(str FileName) GetStringFileInfo(FileName, FILE_DESCRIPTION)
  118. #define GetFileVersionString(str FileName) GetStringFileInfo(FileName, FILE_VERSION)
  119. #define GetFileCopyright(str FileName) GetStringFileInfo(FileName, LEGAL_COPYRIGHT)
  120. #define GetFileOriginalFilename(str FileName) GetStringFileInfo(FileName, ORIGINAL_FILENAME)
  121. #define GetFileProductVersion(str FileName) GetStringFileInfo(FileName, PRODUCT_VERSION)
  122. #define DeleteToFirstPeriod(str *S) \
  123. Local[1] = Copy(S, 1, (Local[0] = Pos(".", S)) - 1), \
  124. S = Copy(S, Local[0] + 1), \
  125. Local[1]
  126. #define GetVersionComponents(str FileName, *Major, *Minor, *Rev, *Build) \
  127. Local[1] = Local[0] = GetVersionNumbersString(FileName), \
  128. Local[1] == "" ? "" : ( \
  129. Major = Int(DeleteToFirstPeriod(Local[1])), \
  130. Minor = Int(DeleteToFirstPeriod(Local[1])), \
  131. Rev = Int(DeleteToFirstPeriod(Local[1])), \
  132. Build = Int(Local[1]), \
  133. Local[0])
  134. #define GetPackedVersion(str FileName, *Version) \
  135. Local[0] = GetVersionComponents(FileName, Local[1], Local[2], Local[3], Local[4]), \
  136. Version = PackVersionComponents(Local[1], Local[2], Local[3], Local[4]), \
  137. Local[0]
  138. #define GetVersionNumbers(str FileName, *MS, *LS) \
  139. Local[0] = GetPackedVersion(FileName, Local[1]), \
  140. UnpackVersionNumbers(Local[1], MS, LS), \
  141. Local[0]
  142. #define PackVersionNumbers(int VersionMS, int VersionLS) \
  143. VersionMS << 32 | (VersionLS & 0xFFFFFFFF)
  144. #define PackVersionComponents(int Major, int Minor, int Rev, int Build) \
  145. Major << 48 | (Minor & 0xFFFF) << 32 | (Rev & 0xFFFF) << 16 | (Build & 0xFFFF)
  146. #define UnpackVersionNumbers(int Version, *VersionMS, *VersionLS) \
  147. VersionMS = Version >> 32, \
  148. VersionLS = Version & 0xFFFFFFFF, \
  149. void
  150. #define UnpackVersionComponents(int Version, *Major, *Minor, *Rev, *Build) \
  151. Major = Version >> 48, \
  152. Minor = (Version >> 32) & 0xFFFF, \
  153. Rev = (Version >> 16) & 0xFFFF, \
  154. Build = Version & 0xFFFF, \
  155. void
  156. #define VersionToStr(int Version) \
  157. Str(Version >> 48 & 0xFFFF) + "." + Str(Version >> 32 & 0xFFFF) + "." + \
  158. Str(Version >> 16 & 0xFFFF) + "." + Str(Version & 0xFFFF)
  159. #define StrToVersion(str Version) \
  160. Local[0] = Version, \
  161. Local[1] = Int(DeleteToFirstPeriod(Local[0])), \
  162. Local[2] = Int(DeleteToFirstPeriod(Local[0])), \
  163. Local[3] = Int(DeleteToFirstPeriod(Local[0])), \
  164. Local[4] = Int(Local[0]), \
  165. PackVersionComponents(Local[1], Local[2], Local[3], Local[4])
  166. #define EncodeVer(int Major, int Minor, int Revision = 0, int Build = -1) \
  167. (Major & 0xFF) << 24 | (Minor & 0xFF) << 16 | (Revision & 0xFF) << 8 | (Build >= 0 ? Build & 0xFF : 0)
  168. #define DecodeVer(int Version, int Digits = 3) \
  169. Str(Version >> 24 & 0xFF) + (Digits > 1 ? "." : "") + \
  170. (Digits > 1 ? \
  171. Str(Version >> 16 & 0xFF) + (Digits > 2 ? "." : "") : "") + \
  172. (Digits > 2 ? \
  173. Str(Version >> 8 & 0xFF) + (Digits > 3 && (Local = Version & 0xFF) ? "." : "") : "") + \
  174. (Digits > 3 && Local ? \
  175. Str(Version & 0xFF) : "")
  176. #define FindSection(str Section = "Files") \
  177. Find(0, "[" + Section + "]", FIND_MATCH | FIND_TRIM) + 1
  178. #if VER >= 0x03000000
  179. # define FindNextSection(int Line) \
  180. Find(Line, "[", FIND_BEGINS | FIND_TRIM, "]", FIND_ENDS | FIND_AND)
  181. # define FindSectionEnd(str Section = "Files") \
  182. FindNextSection(FindSection(Section))
  183. #else
  184. # define FindSectionEnd(str Section = "Files") \
  185. FindSection(Section) + EntryCount(Section)
  186. #endif
  187. #define FindCode() \
  188. Local[1] = FindSection("Code"), \
  189. Local[0] = Find(Local[1] - 1, "program", FIND_BEGINS, ";", FIND_ENDS | FIND_AND), \
  190. (Local[0] < 0 ? Local[1] : Local[0] + 1)
  191. #define ExtractFilePath(str PathName) \
  192. Local[0] = \
  193. !(Local[1] = RPos("\", PathName)) ? \
  194. "" : \
  195. Copy(PathName, 1, Local[1])
  196. #define ExtractFileDir(str PathName) \
  197. RemoveBackslash(ExtractFilePath(PathName))
  198. #define ExtractFileExt(str PathName) \
  199. Local[0] = RPos(".", PathName), \
  200. Copy(PathName, Local[0] + 1)
  201. #define ExtractFileName(str PathName) \
  202. !(Local[0] = RPos("\", PathName)) ? \
  203. PathName : \
  204. Copy(PathName, Local[0] + 1)
  205. #define ChangeFileExt(str FileName, str NewExt) \
  206. !(Local[0] = RPos(".", FileName)) ? \
  207. FileName + "." + NewExt : \
  208. Copy(FileName, 1, Local[0]) + NewExt
  209. #define RemoveFileExt(str FileName) \
  210. !(Local[0] = RPos(".", FileName)) ? \
  211. FileName : \
  212. Copy(FileName, 1, Local[0] - 1)
  213. #define AddBackslash(str S) \
  214. Copy(S, Len(S)) == "\" ? S : S + "\"
  215. #define RemoveBackslashUnlessRoot(str S) \
  216. Local[0] = Len(S), \
  217. Local[0] > 0 ? \
  218. Copy(S, Local[0]) == "\" ? \
  219. (Local[0] == 3 && Copy(S, 2, 1) == ":" ? \
  220. S : \
  221. Copy(S, 1, Local[0] - 1)) : \
  222. S : \
  223. ""
  224. #define RemoveBackslash(str S) \
  225. WarnRenamedVersion("RemoveBackslash", "RemoveBackslashUnlessRoot"), \
  226. RemoveBackslashUnlessRoot(S)
  227. #define Delete(str *S, int Index, int Count = MaxInt) \
  228. S = Copy(S, 1, Index - 1) + Copy(S, Index + Count)
  229. #define Insert(str *S, int Index, str Substr) \
  230. Index > Len(S) + 1 ? \
  231. S : \
  232. S = Copy(S, 1, Index - 1) + SubStr + Copy(S, Index)
  233. #define YesNo(str S) \
  234. (S = LowerCase(S)) == "yes" || S == "true" || S == "1"
  235. #define IsDirSet(str SetupDirective) \
  236. YesNo(SetupSetting(SetupDirective))
  237. #define Power(int X, int P = 2) \
  238. !P ? 1 : X * Power(X, P - 1)
  239. #define Min(int A, int B, int C = MaxInt) \
  240. A < B ? A < C ? Int(A) : Int(C) : Int(B)
  241. #define Max(int A, int B, int C = MinInt) \
  242. A > B ? A > C ? Int(A) : Int(C) : Int(B)
  243. #define SameText(str S1, str S2) \
  244. LowerCase(S1) == LowerCase(S2)
  245. #define SameStr(str S1, str S2) \
  246. S1 == S2
  247. #define WarnRenamedVersion(str OldName, str NewName) \
  248. Warning("Function """ + OldName + """ has been renamed. Use """ + NewName + """ instead.")
  249. #define ParseVersion(str FileName, *Major, *Minor, *Rev, *Build) \
  250. WarnRenamedVersion("ParseVersion", "GetVersionComponents"), \
  251. GetVersionComponents(FileName, Major, Minor, Rev, Build)
  252. #define GetFileVersion(str FileName) \
  253. WarnRenamedVersion("GetFileVersion", "GetVersionNumbersString"), \
  254. GetVersionNumbersString(FileName)
  255. #ifdef DisablePOptP
  256. # pragma parseroption -p-
  257. #endif
  258. #ifdef EnableOptE
  259. # pragma option -e+
  260. #endif
  261. #endif