LogicLib.nsi 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619
  1. !verbose 2
  2. Name "NSIS LogicLib Example"
  3. OutFile "LogicLib.exe"
  4. ShowInstDetails show
  5. RequestExecutionLevel user
  6. !include "LogicLib.nsh"
  7. ;!undef LOGICLIB_VERBOSITY
  8. ;!define LOGICLIB_VERBOSITY 4 ; For debugging - watch what logiclib does with your code!
  9. Page components "" "" ComponentsLeave
  10. Page instfiles
  11. Section /o "Run tests" TESTS
  12. ; kinds of if other than "value1 comparison value2"
  13. ClearErrors
  14. FindFirst $R1 $R2 "$PROGRAMFILES\*"
  15. ${Unless} ${Errors}
  16. ${Do}
  17. ${Select} $R2
  18. ${Case2} "." ".."
  19. ; Do nothing
  20. ${CaseElse}
  21. DetailPrint "Found $PROGRAMFILES\$R2"
  22. ${EndSelect}
  23. FindNext $R1 $R2
  24. ${LoopUntil} ${Errors}
  25. FindClose $R1
  26. ${EndUnless}
  27. ${If} ${FileExists} "${__FILE__}"
  28. DetailPrint 'Source file "${__FILE__}" still exists'
  29. ${Else}
  30. DetailPrint 'Source file "${__FILE__}" has gone'
  31. ${EndIf}
  32. ; if..endif
  33. StrCpy $R1 1
  34. StrCpy $R2 ""
  35. ${If} $R1 = 1
  36. StrCpy $R2 $R2A
  37. ${EndIf}
  38. ${If} $R1 = 2
  39. StrCpy $R2 $R2B
  40. ${EndIf}
  41. ${If} $R1 < 2
  42. StrCpy $R2 $R2C
  43. ${EndIf}
  44. ${If} $R1 < -2
  45. StrCpy $R2 $R2D
  46. ${EndIf}
  47. ${If} $R1 > 2
  48. StrCpy $R2 $R2E
  49. ${EndIf}
  50. ${If} $R1 > -2
  51. StrCpy $R2 $R2F
  52. ${EndIf}
  53. ${If} $R1 <> 1
  54. StrCpy $R2 $R2G
  55. ${EndIf}
  56. ${If} $R1 <> 2
  57. StrCpy $R2 $R2H
  58. ${EndIf}
  59. ${If} $R1 >= 2
  60. StrCpy $R2 $R2I
  61. ${EndIf}
  62. ${If} $R1 >= -2
  63. StrCpy $R2 $R2J
  64. ${EndIf}
  65. ${If} $R1 <= 2
  66. StrCpy $R2 $R2K
  67. ${EndIf}
  68. ${If} $R1 <= -2
  69. StrCpy $R2 $R2L
  70. ${EndIf}
  71. ${If} $R2 == "ACFHJK"
  72. DetailPrint "PASSED If..EndIf test"
  73. ${Else}
  74. DetailPrint "FAILED If..EndIf test"
  75. ${EndIf}
  76. ; if..elseif..else..endif
  77. StrCpy $R1 A
  78. StrCpy $R2 ""
  79. ${If} $R1 == A
  80. StrCpy $R2 $R2A
  81. ${ElseIf} $R1 == B
  82. StrCpy $R2 $R2B
  83. ${ElseUnless} $R1 != C
  84. StrCpy $R2 $R2C
  85. ${Else}
  86. StrCpy $R2 $R2D
  87. ${EndIf}
  88. ${If} $R1 == D
  89. StrCpy $R2 $R2D
  90. ${ElseIf} $R1 == A
  91. StrCpy $R2 $R2A
  92. ${ElseUnless} $R1 != B
  93. StrCpy $R2 $R2B
  94. ${Else}
  95. StrCpy $R2 $R2C
  96. ${EndIf}
  97. ${If} $R1 == C
  98. StrCpy $R2 $R2C
  99. ${ElseIf} $R1 == D
  100. StrCpy $R2 $R2D
  101. ${ElseUnless} $R1 != A
  102. StrCpy $R2 $R2A
  103. ${Else}
  104. StrCpy $R2 $R2B
  105. ${EndIf}
  106. ${If} $R1 == B
  107. StrCpy $R2 $R2B
  108. ${ElseIf} $R1 == C
  109. StrCpy $R2 $R2C
  110. ${ElseUnless} $R1 != D
  111. StrCpy $R2 $R2D
  112. ${Else}
  113. StrCpy $R2 $R2A
  114. ${EndIf}
  115. ${If} $R2 == "$R1$R1$R1$R1"
  116. DetailPrint "PASSED If..ElseIf..Else..EndIf test"
  117. ${Else}
  118. DetailPrint "FAILED If..ElseIf..Else..EndIf test"
  119. ${EndIf}
  120. ; if..andif..orif..endif
  121. StrCpy $R2 ""
  122. ${If} 1 = 1
  123. ${AndIf} 2 = 2
  124. StrCpy $R2 $R2A
  125. ${Else}
  126. StrCpy $R2 $R2B
  127. ${EndIf}
  128. ${If} 1 = 1
  129. ${AndIf} 2 = 3
  130. StrCpy $R2 $R2B
  131. ${Else}
  132. StrCpy $R2 $R2A
  133. ${EndIf}
  134. ${If} 1 = 2
  135. ${AndIf} 2 = 2
  136. StrCpy $R2 $R2B
  137. ${Else}
  138. StrCpy $R2 $R2A
  139. ${EndIf}
  140. ${If} 1 = 2
  141. ${AndIf} 2 = 3
  142. StrCpy $R2 $R2B
  143. ${Else}
  144. StrCpy $R2 $R2A
  145. ${EndIf}
  146. ${If} 1 = 1
  147. ${OrIf} 2 = 2
  148. StrCpy $R2 $R2A
  149. ${Else}
  150. StrCpy $R2 $R2B
  151. ${EndIf}
  152. ${If} 1 = 1
  153. ${OrIf} 2 = 3
  154. StrCpy $R2 $R2A
  155. ${Else}
  156. StrCpy $R2 $R2B
  157. ${EndIf}
  158. ${If} 1 = 2
  159. ${OrIf} 2 = 2
  160. StrCpy $R2 $R2A
  161. ${Else}
  162. StrCpy $R2 $R2B
  163. ${EndIf}
  164. ${If} 1 = 2
  165. ${OrIf} 2 = 3
  166. StrCpy $R2 $R2B
  167. ${Else}
  168. StrCpy $R2 $R2A
  169. ${EndIf}
  170. ${If} 1 = 1
  171. ${AndIf} 2 = 2
  172. ${OrIf} 3 = 3
  173. StrCpy $R2 $R2A
  174. ${Else}
  175. StrCpy $R2 $R2B
  176. ${EndIf}
  177. ${If} 1 = 1
  178. ${AndIf} 2 = 3
  179. ${OrIf} 3 = 3
  180. StrCpy $R2 $R2A
  181. ${Else}
  182. StrCpy $R2 $R2B
  183. ${EndIf}
  184. ${If} 1 = 2
  185. ${AndIf} 2 = 2
  186. ${OrIf} 3 = 3
  187. StrCpy $R2 $R2A
  188. ${Else}
  189. StrCpy $R2 $R2B
  190. ${EndIf}
  191. ${If} 1 = 2
  192. ${AndIf} 2 = 3
  193. ${OrIf} 3 = 3
  194. StrCpy $R2 $R2A
  195. ${Else}
  196. StrCpy $R2 $R2B
  197. ${EndIf}
  198. ${If} 1 = 1
  199. ${AndIf} 2 = 2
  200. ${OrIf} 3 = 4
  201. StrCpy $R2 $R2A
  202. ${Else}
  203. StrCpy $R2 $R2B
  204. ${EndIf}
  205. ${If} 1 = 1
  206. ${AndIf} 2 = 3
  207. ${OrIf} 3 = 4
  208. StrCpy $R2 $R2B
  209. ${Else}
  210. StrCpy $R2 $R2A
  211. ${EndIf}
  212. ${If} 1 = 2
  213. ${AndIf} 2 = 2
  214. ${OrIf} 3 = 4
  215. StrCpy $R2 $R2B
  216. ${Else}
  217. StrCpy $R2 $R2A
  218. ${EndIf}
  219. ${If} 1 = 2
  220. ${AndIf} 2 = 3
  221. ${OrIf} 3 = 4
  222. StrCpy $R2 $R2B
  223. ${Else}
  224. StrCpy $R2 $R2A
  225. ${EndIf}
  226. ${If} 1 = 1
  227. ${OrIf} 2 = 2
  228. ${AndIf} 3 = 3
  229. StrCpy $R2 $R2A
  230. ${Else}
  231. StrCpy $R2 $R2B
  232. ${EndIf}
  233. ${If} 1 = 1
  234. ${OrIf} 2 = 3
  235. ${AndIf} 3 = 3
  236. StrCpy $R2 $R2A
  237. ${Else}
  238. StrCpy $R2 $R2B
  239. ${EndIf}
  240. ${If} 1 = 2
  241. ${OrIf} 2 = 2
  242. ${AndIf} 3 = 3
  243. StrCpy $R2 $R2A
  244. ${Else}
  245. StrCpy $R2 $R2B
  246. ${EndIf}
  247. ${If} 1 = 2
  248. ${OrIf} 2 = 3
  249. ${AndIf} 3 = 3
  250. StrCpy $R2 $R2B
  251. ${Else}
  252. StrCpy $R2 $R2A
  253. ${EndIf}
  254. ${If} 1 = 1
  255. ${OrIf} 2 = 2
  256. ${AndIf} 3 = 4
  257. StrCpy $R2 $R2B
  258. ${Else}
  259. StrCpy $R2 $R2A
  260. ${EndIf}
  261. ${If} 1 = 1
  262. ${OrIf} 2 = 3
  263. ${AndIf} 3 = 4
  264. StrCpy $R2 $R2B
  265. ${Else}
  266. StrCpy $R2 $R2A
  267. ${EndIf}
  268. ${If} 1 = 2
  269. ${OrIf} 2 = 2
  270. ${AndIf} 3 = 4
  271. StrCpy $R2 $R2B
  272. ${Else}
  273. StrCpy $R2 $R2A
  274. ${EndIf}
  275. ${If} 1 = 2
  276. ${OrIf} 2 = 3
  277. ${AndIf} 3 = 4
  278. StrCpy $R2 $R2B
  279. ${Else}
  280. StrCpy $R2 $R2A
  281. ${EndIf}
  282. ${If} $R2 == "AAAAAAAAAAAAAAAAAAAAAAAA"
  283. DetailPrint "PASSED If..AndIf..OrIf..Else..EndIf test"
  284. ${Else}
  285. DetailPrint "FAILED If..AndIf..OrIf..Else..EndIf test"
  286. ${EndIf}
  287. ; ifthen..|..|
  288. StrCpy $R1 1
  289. StrCpy $R2 ""
  290. ${IfThen} $R1 = 1 ${|} StrCpy $R2 $R2A ${|}
  291. ${IfThen} $R1 = 2 ${|} StrCpy $R2 $R2B ${|}
  292. ${IfNotThen} $R1 = 1 ${|} StrCpy $R2 $R2C ${|}
  293. ${IfNotThen} $R1 = 2 ${|} StrCpy $R2 $R2D ${|}
  294. ${If} $R2 == "AD"
  295. DetailPrint "PASSED IfThen test"
  296. ${Else}
  297. DetailPrint "FAILED IfThen test"
  298. ${EndIf}
  299. ; ifcmd..||..| and if/unless cmd
  300. StrCpy $R2 ""
  301. ${IfCmd} MessageBox MB_YESNO "Please click Yes" IDYES ${||} StrCpy $R2 $R2A ${|}
  302. ${Unless} ${Cmd} `MessageBox MB_YESNO|MB_DEFBUTTON2 "Please click No" IDYES`
  303. StrCpy $R2 $R2B
  304. ${EndUnless}
  305. ${If} $R2 == "AB"
  306. DetailPrint "PASSED IfCmd/If Cmd test"
  307. ${Else}
  308. DetailPrint "FAILED IfCmd/If Cmd test"
  309. ${EndIf}
  310. ; select..case..case2..case3..case4..case5..caseelse..endselect
  311. StrCpy $R1 1
  312. StrCpy $R2 ""
  313. ${Select} $R1
  314. ${Case} "1"
  315. StrCpy $R2 $R2A
  316. ${Case} "2"
  317. StrCpy $R2 $R2B
  318. ${Case2} "3" "4"
  319. StrCpy $R2 $R2C
  320. ${CaseElse}
  321. StrCpy $R2 $R2D
  322. ${EndSelect}
  323. ${Select} $R1
  324. ${Case} "2"
  325. StrCpy $R2 $R2A
  326. ${Case} "3"
  327. StrCpy $R2 $R2B
  328. ${Case2} "4" "5"
  329. StrCpy $R2 $R2C
  330. ${CaseElse}
  331. StrCpy $R2 $R2D
  332. ${EndSelect}
  333. ${Select} $R1
  334. ${Case} "3"
  335. StrCpy $R2 $R2A
  336. ${Case} "4"
  337. StrCpy $R2 $R2B
  338. ${Case2} "5" "1"
  339. StrCpy $R2 $R2C
  340. ${CaseElse}
  341. StrCpy $R2 $R2D
  342. ${EndSelect}
  343. ${Select} $R1
  344. ${Case} "4"
  345. StrCpy $R2 $R2A
  346. ${Case} "5"
  347. StrCpy $R2 $R2B
  348. ${Case2} "1" "2"
  349. StrCpy $R2 $R2C
  350. ${CaseElse}
  351. StrCpy $R2 $R2D
  352. ${EndSelect}
  353. ${If} $R2 == "ADCC"
  354. DetailPrint "PASSED Select..Case*..EndSelect test"
  355. ${Else}
  356. DetailPrint "FAILED Select..Case*..EndSelect test"
  357. ${EndIf}
  358. ; switch..case..caseelse..endswitch
  359. StrCpy $R2 ""
  360. ${For} $R1 1 10
  361. ${Switch} $R1
  362. ${Case} 3
  363. StrCpy $R2 $R2A
  364. ${Case} 4
  365. StrCpy $R2 $R2B
  366. ${Break}
  367. ${Case} 5
  368. StrCpy $R2 $R2C
  369. ${EndSwitch}
  370. ${Switch} $R1
  371. ${Case} 1
  372. StrCpy $R2 $R2D
  373. ${Default}
  374. StrCpy $R2 $R2E
  375. ${Break}
  376. ${Case} 2
  377. StrCpy $R2 $R2F
  378. ${EndSwitch}
  379. ${Switch} $R1
  380. ${Case} 6
  381. ${Case} 7
  382. StrCpy $R2 $R2G
  383. ${If} $R1 = 6
  384. ${Case} 8
  385. StrCpy $R2 $R2H
  386. ${Switch} $R1
  387. ${Case} 6
  388. StrCpy $R2 $R2I
  389. ${Break}
  390. ${Case} 8
  391. StrCpy $R2 $R2J
  392. ${EndSwitch}
  393. ${EndIf}
  394. StrCpy $R2 $R2K
  395. ${Break}
  396. ${Default}
  397. StrCpy $R2 $R2L
  398. ${Case} 9
  399. StrCpy $R2 $R2M
  400. ${EndSwitch}
  401. ${Next}
  402. ${If} $R2 == "DELMFLMABELMBELMCELMEGHIKEGKEHJKEMELM"
  403. DetailPrint "PASSED Switch..Case*..EndSwitch test"
  404. ${Else}
  405. DetailPrint "FAILED Switch..Case*..EndSwitch test"
  406. ${EndIf}
  407. ; for[each]..exitfor..next
  408. StrCpy $R2 ""
  409. ${For} $R1 1 5
  410. StrCpy $R2 $R2$R1
  411. ${Next}
  412. ${ForEach} $R1 10 1 - 1
  413. StrCpy $R2 $R2$R1
  414. ${Next}
  415. ${For} $R1 1 0
  416. StrCpy $R2 $R2$R1
  417. ${Next}
  418. ${If} $R2 == "1234510987654321"
  419. DetailPrint "PASSED For[Each]..Next test"
  420. ${Else}
  421. DetailPrint "FAILED For[Each]..Next test"
  422. ${EndIf}
  423. ; do..loop
  424. StrCpy $R1 0
  425. Call DoLoop
  426. ${If} $R1 == 5
  427. DetailPrint "PASSED Do..Loop test"
  428. ${Else}
  429. DetailPrint "FAILED Do..Loop test"
  430. ${EndIf}
  431. ; do..exitdo..loop
  432. StrCpy $R1 0
  433. StrCpy $R2 ""
  434. ${Do}
  435. StrCpy $R2 $R2$R1
  436. IntOp $R1 $R1 + 1
  437. ${If} $R1 > 10
  438. ${ExitDo}
  439. ${EndIf}
  440. ${Loop}
  441. ${If} $R2 == "012345678910"
  442. DetailPrint "PASSED Do..ExitDo..Loop test"
  443. ${Else}
  444. DetailPrint "FAILED Do..ExitDo..Loop test"
  445. ${EndIf}
  446. ; do..exitdo..loopuntil
  447. StrCpy $R1 0
  448. StrCpy $R2 ""
  449. ${Do}
  450. StrCpy $R2 $R2$R1
  451. IntOp $R1 $R1 + 1
  452. ${LoopUntil} $R1 >= 5
  453. ${If} $R2 == "01234"
  454. DetailPrint "PASSED Do..ExitDo..LoopUntil test"
  455. ${Else}
  456. DetailPrint "FAILED Do..ExitDo..LoopUntil test"
  457. ${EndIf}
  458. ; dountil..exitdo..loop
  459. StrCpy $R1 0
  460. StrCpy $R2 ""
  461. ${DoUntil} $R1 >= 5
  462. StrCpy $R2 $R2$R1
  463. IntOp $R1 $R1 + 1
  464. ${Loop}
  465. ${If} $R2 == "01234"
  466. DetailPrint "PASSED DoUntil..ExitDo..Loop test"
  467. ${Else}
  468. DetailPrint "FAILED DoUntil..ExitDo..Loop test"
  469. ${EndIf}
  470. ; nested do test
  471. StrCpy $R1 0
  472. StrCpy $R2 0
  473. StrCpy $R3 ""
  474. ${Do}
  475. StrCpy $R3 $R3$R1$R2
  476. IntOp $R1 $R1 + 1
  477. ${If} $R1 > 5
  478. ${ExitDo}
  479. ${EndIf}
  480. StrCpy $R2 0
  481. ${Do}
  482. StrCpy $R3 $R3$R1$R2
  483. IntOp $R2 $R2 + 1
  484. ${If} $R2 >= 5
  485. ${ExitDo}
  486. ${EndIf}
  487. ${Loop}
  488. ${Loop}
  489. ${If} $R3 == "00101112131415202122232425303132333435404142434445505152535455"
  490. DetailPrint "PASSED nested Do test"
  491. ${Else}
  492. DetailPrint "FAILED nested Do test"
  493. ${EndIf}
  494. ; while..exitwhile..endwhile (exact replica of dowhile..enddo}
  495. StrCpy $R1 0
  496. StrCpy $R2 ""
  497. ${While} $R1 < 5
  498. StrCpy $R2 $R2$R1
  499. IntOp $R1 $R1 + 1
  500. ${EndWhile}
  501. ${If} $R2 == "01234"
  502. DetailPrint "PASSED While..ExitWhile..EndWhile test"
  503. ${Else}
  504. DetailPrint "FAILED While..ExitWhile..EndWhile test"
  505. ${EndIf}
  506. ; Unsigned integer tests
  507. StrCpy $R2 ""
  508. ${If} -1 < 1
  509. StrCpy $R2 $R2A
  510. ${EndIf}
  511. ${If} -1 U< 1
  512. StrCpy $R2 $R2B
  513. ${EndIf}
  514. ${If} 0xFFFFFFFF > 1
  515. StrCpy $R2 $R2C
  516. ${EndIf}
  517. ${If} 0xFFFFFFFF U> 1
  518. StrCpy $R2 $R2D
  519. ${EndIf}
  520. ${If} $R2 == "AD"
  521. DetailPrint "PASSED unsigned integer test"
  522. ${Else}
  523. DetailPrint "FAILED unsigned integer test"
  524. ${EndIf}
  525. ; 64-bit integer tests (uses System.dll)
  526. StrCpy $R2 ""
  527. ${If} 0x100000000 L= 4294967296
  528. StrCpy $R2 $R2A
  529. ${EndIf}
  530. ${If} 0x100000000 L< 0x200000000
  531. StrCpy $R2 $R2B
  532. ${EndIf}
  533. ${If} 0x500000000 L>= 0x500000000
  534. StrCpy $R2 $R2C
  535. ${EndIf}
  536. ${If} $R2 == "ABC"
  537. DetailPrint "PASSED 64-bit integer test"
  538. ${Else}
  539. DetailPrint "FAILED 64-bit integer test"
  540. ${EndIf}
  541. ; Extra string tests (uses System.dll)
  542. StrCpy $R2 ""
  543. ${If} "A" S< "B"
  544. StrCpy $R2 $R2A
  545. ${EndIf}
  546. ${If} "b" S> "A"
  547. StrCpy $R2 $R2B
  548. ${EndIf}
  549. ${If} "a" S<= "B"
  550. StrCpy $R2 $R2C
  551. ${EndIf}
  552. ${If} "B" S< "B"
  553. StrCpy $R2 $R2D
  554. ${EndIf}
  555. ${If} "A" S== "A"
  556. StrCpy $R2 $R2E
  557. ${EndIf}
  558. ${If} "A" S== "a"
  559. StrCpy $R2 $R2F
  560. ${EndIf}
  561. ${If} "A" S!= "a"
  562. StrCpy $R2 $R2G
  563. ${EndIf}
  564. ${If} $R2 == "ABCEG"
  565. DetailPrint "PASSED extra string test"
  566. ${Else}
  567. DetailPrint "FAILED extra string test"
  568. ${EndIf}
  569. SectionEnd
  570. Function ComponentsLeave
  571. ; Section flags tests (requires sections.nsh be included)
  572. ${Unless} ${SectionIsSelected} ${TESTS}
  573. MessageBox MB_OK "Please select the component"
  574. Abort
  575. ${EndIf}
  576. FunctionEnd
  577. Function DoLoop
  578. ${Do}
  579. IntOp $R1 $R1 + 1
  580. ${If} $R1 == 5
  581. Return
  582. ${EndIf}
  583. ${Loop}
  584. FunctionEnd
  585. !verbose 3