LogicLib.nsi 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599
  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..exitdo..loop
  424. StrCpy $R1 0
  425. StrCpy $R2 ""
  426. ${Do}
  427. StrCpy $R2 $R2$R1
  428. IntOp $R1 $R1 + 1
  429. ${If} $R1 > 10
  430. ${ExitDo}
  431. ${EndIf}
  432. ${Loop}
  433. ${If} $R2 == "012345678910"
  434. DetailPrint "PASSED Do..ExitDo..Loop test"
  435. ${Else}
  436. DetailPrint "FAILED Do..ExitDo..Loop test"
  437. ${EndIf}
  438. ; do..exitdo..loopuntil
  439. StrCpy $R1 0
  440. StrCpy $R2 ""
  441. ${Do}
  442. StrCpy $R2 $R2$R1
  443. IntOp $R1 $R1 + 1
  444. ${LoopUntil} $R1 >= 5
  445. ${If} $R2 == "01234"
  446. DetailPrint "PASSED Do..ExitDo..LoopUntil test"
  447. ${Else}
  448. DetailPrint "FAILED Do..ExitDo..LoopUntil test"
  449. ${EndIf}
  450. ; dountil..exitdo..loop
  451. StrCpy $R1 0
  452. StrCpy $R2 ""
  453. ${DoUntil} $R1 >= 5
  454. StrCpy $R2 $R2$R1
  455. IntOp $R1 $R1 + 1
  456. ${Loop}
  457. ${If} $R2 == "01234"
  458. DetailPrint "PASSED DoUntil..ExitDo..Loop test"
  459. ${Else}
  460. DetailPrint "FAILED DoUntil..ExitDo..Loop test"
  461. ${EndIf}
  462. ; nested do test
  463. StrCpy $R1 0
  464. StrCpy $R2 0
  465. StrCpy $R3 ""
  466. ${Do}
  467. StrCpy $R3 $R3$R1$R2
  468. IntOp $R1 $R1 + 1
  469. ${If} $R1 > 5
  470. ${ExitDo}
  471. ${EndIf}
  472. StrCpy $R2 0
  473. ${Do}
  474. StrCpy $R3 $R3$R1$R2
  475. IntOp $R2 $R2 + 1
  476. ${If} $R2 >= 5
  477. ${ExitDo}
  478. ${EndIf}
  479. ${Loop}
  480. ${Loop}
  481. ${If} $R3 == "00101112131415202122232425303132333435404142434445505152535455"
  482. DetailPrint "PASSED nested Do test"
  483. ${Else}
  484. DetailPrint "FAILED nested Do test"
  485. ${EndIf}
  486. ; while..exitwhile..endwhile (exact replica of dowhile..enddo}
  487. StrCpy $R1 0
  488. StrCpy $R2 ""
  489. ${While} $R1 < 5
  490. StrCpy $R2 $R2$R1
  491. IntOp $R1 $R1 + 1
  492. ${EndWhile}
  493. ${If} $R2 == "01234"
  494. DetailPrint "PASSED While..ExitWhile..EndWhile test"
  495. ${Else}
  496. DetailPrint "FAILED While..ExitWhile..EndWhile test"
  497. ${EndIf}
  498. ; Unsigned integer tests
  499. StrCpy $R2 ""
  500. ${If} -1 < 1
  501. StrCpy $R2 $R2A
  502. ${EndIf}
  503. ${If} -1 U< 1
  504. StrCpy $R2 $R2B
  505. ${EndIf}
  506. ${If} 0xFFFFFFFF > 1
  507. StrCpy $R2 $R2C
  508. ${EndIf}
  509. ${If} 0xFFFFFFFF U> 1
  510. StrCpy $R2 $R2D
  511. ${EndIf}
  512. ${If} $R2 == "AD"
  513. DetailPrint "PASSED unsigned integer test"
  514. ${Else}
  515. DetailPrint "FAILED unsigned integer test"
  516. ${EndIf}
  517. ; 64-bit integer tests (uses System.dll)
  518. StrCpy $R2 ""
  519. ${If} 0x100000000 L= 4294967296
  520. StrCpy $R2 $R2A
  521. ${EndIf}
  522. ${If} 0x100000000 L< 0x200000000
  523. StrCpy $R2 $R2B
  524. ${EndIf}
  525. ${If} 0x500000000 L>= 0x500000000
  526. StrCpy $R2 $R2C
  527. ${EndIf}
  528. ${If} $R2 == "ABC"
  529. DetailPrint "PASSED 64-bit integer test"
  530. ${Else}
  531. DetailPrint "FAILED 64-bit integer test"
  532. ${EndIf}
  533. ; Extra string tests (uses System.dll)
  534. StrCpy $R2 ""
  535. ${If} "A" S< "B"
  536. StrCpy $R2 $R2A
  537. ${EndIf}
  538. ${If} "b" S> "A"
  539. StrCpy $R2 $R2B
  540. ${EndIf}
  541. ${If} "a" S<= "B"
  542. StrCpy $R2 $R2C
  543. ${EndIf}
  544. ${If} "B" S< "B"
  545. StrCpy $R2 $R2D
  546. ${EndIf}
  547. ${If} "A" S== "A"
  548. StrCpy $R2 $R2E
  549. ${EndIf}
  550. ${If} "A" S== "a"
  551. StrCpy $R2 $R2F
  552. ${EndIf}
  553. ${If} "A" S!= "a"
  554. StrCpy $R2 $R2G
  555. ${EndIf}
  556. ${If} $R2 == "ABCEG"
  557. DetailPrint "PASSED extra string test"
  558. ${Else}
  559. DetailPrint "FAILED extra string test"
  560. ${EndIf}
  561. SectionEnd
  562. Function ComponentsLeave
  563. ; Section flags tests (requires sections.nsh be included)
  564. ${Unless} ${SectionIsSelected} ${TESTS}
  565. MessageBox MB_OK "Please select the component"
  566. Abort
  567. ${EndIf}
  568. FunctionEnd
  569. !verbose 3