PageRenderTime 26ms CodeModel.GetById 1ms RepoModel.GetById 0ms app.codeStats 0ms

/stand/forth/menusets.4th

https://bitbucket.org/freebsd/freebsd-base
Forth | 624 lines | 506 code | 95 blank | 23 comment | 11 complexity | ffa711c430392faf5ab83be66854a39f MD5 | raw file
  1. \ Copyright (c) 2012 Devin Teske <dteske@FreeBSD.org>
  2. \ All rights reserved.
  3. \
  4. \ Redistribution and use in source and binary forms, with or without
  5. \ modification, are permitted provided that the following conditions
  6. \ are met:
  7. \ 1. Redistributions of source code must retain the above copyright
  8. \ notice, this list of conditions and the following disclaimer.
  9. \ 2. Redistributions in binary form must reproduce the above copyright
  10. \ notice, this list of conditions and the following disclaimer in the
  11. \ documentation and/or other materials provided with the distribution.
  12. \
  13. \ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  14. \ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  15. \ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  16. \ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  17. \ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  18. \ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  19. \ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  20. \ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  21. \ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  22. \ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  23. \ SUCH DAMAGE.
  24. \
  25. \ $FreeBSD$
  26. marker task-menusets.4th
  27. vocabulary menusets-infrastructure
  28. only forth also menusets-infrastructure definitions
  29. variable menuset_use_name
  30. create menuset_affixbuf 255 allot
  31. create menuset_x 1 allot
  32. create menuset_y 1 allot
  33. : menuset-loadvar ( -- )
  34. \ menuset_use_name is true or false
  35. \ $type should be set to one of:
  36. \ menu toggled ansi
  37. \ $var should be set to one of:
  38. \ caption command keycode text ...
  39. \ $affix is either prefix (menuset_use_name is true)
  40. \ or infix (menuset_use_name is false)
  41. s" set cmdbuf='set ${type}_${var}=\$'" evaluate
  42. s" cmdbuf" getenv swap drop ( -- u1 ) \ get string length
  43. menuset_use_name @ true = if
  44. s" set cmdbuf=${cmdbuf}${affix}${type}_${var}"
  45. ( u1 -- u1 c-addr2 u2 )
  46. else
  47. s" set cmdbuf=${cmdbuf}${type}set${affix}_${var}"
  48. ( u1 -- u1 c-addr2 u2 )
  49. then
  50. evaluate ( u1 c-addr2 u2 -- u1 )
  51. s" cmdbuf" getenv ( u1 -- u1 c-addr2 u2 )
  52. rot 2 pick 2 pick over + -rot + tuck -
  53. ( u1 c-addr2 u2 -- c-addr2 u2 c-addr1 u1 )
  54. \ Generate a string representing rvalue inheritance var
  55. getenv dup -1 = if
  56. ( c-addr2 u2 c-addr1 u1 -- c-addr2 u2 -1 )
  57. \ NOT set -- clean up the stack
  58. drop ( c-addr2 u2 -1 -- c-addr2 u2 )
  59. 2drop ( c-addr2 u2 -- )
  60. else
  61. ( c-addr2 u2 c-addr1 u1 -- c-addr2 u2 c-addr1 u1 )
  62. \ SET -- execute cmdbuf (c-addr2/u2) to inherit value
  63. 2drop ( c-addr2 u2 c-addr1 u1 -- c-addr2 u2 )
  64. evaluate ( c-addr2 u2 -- )
  65. then
  66. s" cmdbuf" unsetenv
  67. ;
  68. : menuset-unloadvar ( -- )
  69. \ menuset_use_name is true or false
  70. \ $type should be set to one of:
  71. \ menu toggled ansi
  72. \ $var should be set to one of:
  73. \ caption command keycode text ...
  74. \ $affix is either prefix (menuset_use_name is true)
  75. \ or infix (menuset_use_name is false)
  76. menuset_use_name @ true = if
  77. s" set buf=${affix}${type}_${var}"
  78. else
  79. s" set buf=${type}set${affix}_${var}"
  80. then
  81. evaluate
  82. s" buf" getenv unsetenv
  83. s" buf" unsetenv
  84. ;
  85. : menuset-loadmenuvar ( -- )
  86. s" set type=menu" evaluate
  87. menuset-loadvar
  88. ;
  89. : menuset-unloadmenuvar ( -- )
  90. s" set type=menu" evaluate
  91. menuset-unloadvar
  92. ;
  93. : menuset-loadxvar ( -- )
  94. \ menuset_use_name is true or false
  95. \ $type should be set to one of:
  96. \ menu toggled ansi
  97. \ $var should be set to one of:
  98. \ caption command keycode text ...
  99. \ $x is "1" through "8"
  100. \ $affix is either prefix (menuset_use_name is true)
  101. \ or infix (menuset_use_name is false)
  102. s" set cmdbuf='set ${type}_${var}[${x}]=\$'" evaluate
  103. s" cmdbuf" getenv swap drop ( -- u1 ) \ get string length
  104. menuset_use_name @ true = if
  105. s" set cmdbuf=${cmdbuf}${affix}${type}_${var}[${x}]"
  106. ( u1 -- u1 c-addr2 u2 )
  107. else
  108. s" set cmdbuf=${cmdbuf}${type}set${affix}_${var}[${x}]"
  109. ( u1 -- u1 c-addr2 u2 )
  110. then
  111. evaluate ( u1 c-addr2 u2 -- u1 )
  112. s" cmdbuf" getenv ( u1 -- u1 c-addr2 u2 )
  113. rot 2 pick 2 pick over + -rot + tuck -
  114. ( u1 c-addr2 u2 -- c-addr2 u2 c-addr1 u1 )
  115. \ Generate a string representing rvalue inheritance var
  116. getenv dup -1 = if
  117. ( c-addr2 u2 c-addr1 u1 -- c-addr2 u2 -1 )
  118. \ NOT set -- clean up the stack
  119. drop ( c-addr2 u2 -1 -- c-addr2 u2 )
  120. 2drop ( c-addr2 u2 -- )
  121. else
  122. ( c-addr2 u2 c-addr1 u1 -- c-addr2 u2 c-addr1 u1 )
  123. \ SET -- execute cmdbuf (c-addr2/u2) to inherit value
  124. 2drop ( c-addr2 u2 c-addr1 u1 -- c-addr2 u2 )
  125. evaluate ( c-addr2 u2 -- )
  126. then
  127. s" cmdbuf" unsetenv
  128. ;
  129. : menuset-unloadxvar ( -- )
  130. \ menuset_use_name is true or false
  131. \ $type should be set to one of:
  132. \ menu toggled ansi
  133. \ $var should be set to one of:
  134. \ caption command keycode text ...
  135. \ $x is "1" through "8"
  136. \ $affix is either prefix (menuset_use_name is true)
  137. \ or infix (menuset_use_name is false)
  138. menuset_use_name @ true = if
  139. s" set buf=${affix}${type}_${var}[${x}]"
  140. else
  141. s" set buf=${type}set${affix}_${var}[${x}]"
  142. then
  143. evaluate
  144. s" buf" getenv unsetenv
  145. s" buf" unsetenv
  146. ;
  147. : menuset-loadansixvar ( -- )
  148. s" set type=ansi" evaluate
  149. menuset-loadxvar
  150. ;
  151. : menuset-unloadansixvar ( -- )
  152. s" set type=ansi" evaluate
  153. menuset-unloadxvar
  154. ;
  155. : menuset-loadmenuxvar ( -- )
  156. s" set type=menu" evaluate
  157. menuset-loadxvar
  158. ;
  159. : menuset-unloadmenuxvar ( -- )
  160. s" set type=menu" evaluate
  161. menuset-unloadxvar
  162. ;
  163. : menuset-loadtoggledxvar ( -- )
  164. s" set type=toggled" evaluate
  165. menuset-loadxvar
  166. ;
  167. : menuset-unloadtoggledxvar ( -- )
  168. s" set type=toggled" evaluate
  169. menuset-unloadxvar
  170. ;
  171. : menuset-loadxyvar ( -- )
  172. \ menuset_use_name is true or false
  173. \ $type should be set to one of:
  174. \ menu toggled ansi
  175. \ $var should be set to one of:
  176. \ caption command keycode text ...
  177. \ $x is "1" through "8"
  178. \ $y is "0" through "9"
  179. \ $affix is either prefix (menuset_use_name is true)
  180. \ or infix (menuset_use_name is false)
  181. s" set cmdbuf='set ${type}_${var}[${x}][${y}]=\$'" evaluate
  182. s" cmdbuf" getenv swap drop ( -- u1 ) \ get string length
  183. menuset_use_name @ true = if
  184. s" set cmdbuf=${cmdbuf}${affix}${type}_${var}[${x}][${y}]"
  185. ( u1 -- u1 c-addr2 u2 )
  186. else
  187. s" set cmdbuf=${cmdbuf}${type}set${affix}_${var}[${x}][${y}]"
  188. ( u1 -- u1 c-addr2 u2 )
  189. then
  190. evaluate ( u1 c-addr2 u2 -- u1 )
  191. s" cmdbuf" getenv ( u1 -- u1 c-addr2 u2 )
  192. rot 2 pick 2 pick over + -rot + tuck -
  193. ( u1 c-addr2 u2 -- c-addr2 u2 c-addr1 u1 )
  194. \ Generate a string representing rvalue inheritance var
  195. getenv dup -1 = if
  196. ( c-addr2 u2 c-addr1 u1 -- c-addr2 u2 -1 )
  197. \ NOT set -- clean up the stack
  198. drop ( c-addr2 u2 -1 -- c-addr2 u2 )
  199. 2drop ( c-addr2 u2 -- )
  200. else
  201. ( c-addr2 u2 c-addr1 u1 -- c-addr2 u2 c-addr1 u1 )
  202. \ SET -- execute cmdbuf (c-addr2/u2) to inherit value
  203. 2drop ( c-addr2 u2 c-addr1 u1 -- c-addr2 u2 )
  204. evaluate ( c-addr2 u2 -- )
  205. then
  206. s" cmdbuf" unsetenv
  207. ;
  208. : menuset-unloadxyvar ( -- )
  209. \ menuset_use_name is true or false
  210. \ $type should be set to one of:
  211. \ menu toggled ansi
  212. \ $var should be set to one of:
  213. \ caption command keycode text ...
  214. \ $x is "1" through "8"
  215. \ $y is "0" through "9"
  216. \ $affix is either prefix (menuset_use_name is true)
  217. \ or infix (menuset_use_name is false)
  218. menuset_use_name @ true = if
  219. s" set buf=${affix}${type}_${var}[${x}][${y}]"
  220. else
  221. s" set buf=${type}set${affix}_${var}[${x}][${y}]"
  222. then
  223. evaluate
  224. s" buf" getenv unsetenv
  225. s" buf" unsetenv
  226. ;
  227. : menuset-loadansixyvar ( -- )
  228. s" set type=ansi" evaluate
  229. menuset-loadxyvar
  230. ;
  231. : menuset-unloadansixyvar ( -- )
  232. s" set type=ansi" evaluate
  233. menuset-unloadxyvar
  234. ;
  235. : menuset-loadmenuxyvar ( -- )
  236. s" set type=menu" evaluate
  237. menuset-loadxyvar
  238. ;
  239. : menuset-unloadmenuxyvar ( -- )
  240. s" set type=menu" evaluate
  241. menuset-unloadxyvar
  242. ;
  243. : menuset-setnum-namevar ( N -- C-Addr/U )
  244. s" menuset_nameNNNNN" ( n -- n c-addr1 u1 ) \ variable basename
  245. drop 12 ( n c-addr1 u1 -- n c-addr1 12 ) \ remove "NNNNN"
  246. rot ( n c-addr1 12 -- c-addr1 12 n ) \ move number on top
  247. \ convert to string
  248. s>d <# #s #> ( c-addr1 12 n -- c-addr1 12 c-addr2 u2 )
  249. \ Combine strings
  250. begin ( using u2 in c-addr2/u2 pair as countdown to zero )
  251. over ( c-addr1 u1 c-addr2 u2 -- continued below )
  252. ( c-addr1 u1 c-addr2 u2 c-addr2 ) \ copy src-addr
  253. c@ ( c-addr1 u1 c-addr2 u2 c-addr2 -- continued below )
  254. ( c-addr1 u1 c-addr2 u2 c ) \ get next src-addr byte
  255. 4 pick 4 pick
  256. ( c-addr1 u1 c-addr2 u2 c -- continued below )
  257. ( c-addr1 u1 c-addr2 u2 c c-addr1 u1 )
  258. \ get destination c-addr1/u1 pair
  259. + ( c-addr1 u1 c-addr2 u2 c c-addr1 u1 -- cont. below )
  260. ( c-addr1 u1 c-addr2 u2 c c-addr3 )
  261. \ combine dest-c-addr to get dest-addr for byte
  262. c! ( c-addr1 u1 c-addr2 u2 c c-addr3 -- continued below )
  263. ( c-addr1 u1 c-addr2 u2 )
  264. \ store the current src-addr byte into dest-addr
  265. 2swap 1+ 2swap \ increment u1 in destination c-addr1/u1 pair
  266. swap 1+ swap \ increment c-addr2 in source c-addr2/u2 pair
  267. 1- \ decrement u2 in the source c-addr2/u2 pair
  268. dup 0= \ time to break?
  269. until
  270. 2drop ( c-addr1 u1 c-addr2 u2 -- c-addr1 u1 )
  271. \ drop temporary number-format conversion c-addr2/u2
  272. ;
  273. : menuset-checksetnum ( N -- )
  274. \
  275. \ adjust input to be both positive and no-higher than 65535
  276. \
  277. abs dup 65535 > if drop 65535 then ( n -- n )
  278. \
  279. \ The next few blocks will determine if we should use the default
  280. \ methodology (referencing the original numeric stack-input), or if-
  281. \ instead $menuset_name{N} has been defined wherein we would then
  282. \ use the value thereof as the prefix to every menu variable.
  283. \
  284. false menuset_use_name ! \ assume name is not set
  285. menuset-setnum-namevar
  286. \
  287. \ We now have a string that is the assembled variable name to check
  288. \ for... $menuset_name{N}. Let's check for it.
  289. \
  290. 2dup ( c-addr1 u1 -- c-addr1 u1 c-addr1 u1 ) \ save a copy
  291. getenv dup -1 <> if ( c-addr1 u1 c-addr1 u1 -- c-addr1 u1 c-addr2 u2 )
  292. \ The variable is set. Let's clean up the stack leaving only
  293. \ its value for later use.
  294. true menuset_use_name !
  295. 2swap 2drop ( c-addr1 u1 c-addr2 u2 -- c-addr2 u2 )
  296. \ drop assembled variable name, leave the value
  297. else ( c-addr1 u1 c-addr1 u1 -- c-addr1 u1 -1 ) \ no such variable
  298. \ The variable is not set. Let's clean up the stack leaving the
  299. \ string [portion] representing the original numeric input.
  300. drop ( c-addr1 u1 -1 -- c-addr1 u1 ) \ drop -1 result
  301. 12 - swap 12 + swap ( c-addr1 u1 -- c-addr2 u2 )
  302. \ truncate to original numeric stack-input
  303. then
  304. \
  305. \ Now, depending on whether $menuset_name{N} has been set, we have
  306. \ either the value thereof to be used as a prefix to all menu_*
  307. \ variables or we have a string representing the numeric stack-input
  308. \ to be used as a "set{N}" infix to the same menu_* variables.
  309. \
  310. \ For example, if the stack-input is 1 and menuset_name1 is NOT set
  311. \ the following variables will be referenced:
  312. \ ansiset1_caption[x] -> ansi_caption[x]
  313. \ ansiset1_caption[x][y] -> ansi_caption[x][y]
  314. \ menuset1_acpi -> menu_acpi
  315. \ menuset1_caption[x] -> menu_caption[x]
  316. \ menuset1_caption[x][y] -> menu_caption[x][y]
  317. \ menuset1_command[x] -> menu_command[x]
  318. \ menuset1_init -> ``evaluated''
  319. \ menuset1_init[x] -> menu_init[x]
  320. \ menuset1_kernel -> menu_kernel
  321. \ menuset1_keycode[x] -> menu_keycode[x]
  322. \ menuset1_options -> menu_options
  323. \ menuset1_optionstext -> menu_optionstext
  324. \ menuset1_reboot -> menu_reboot
  325. \ toggledset1_ansi[x] -> toggled_ansi[x]
  326. \ toggledset1_text[x] -> toggled_text[x]
  327. \ otherwise, the following variables are referenced (where {name}
  328. \ represents the value of $menuset_name1 (given 1 as stack-input):
  329. \ {name}ansi_caption[x] -> ansi_caption[x]
  330. \ {name}ansi_caption[x][y] -> ansi_caption[x][y]
  331. \ {name}menu_acpi -> menu_acpi
  332. \ {name}menu_caption[x] -> menu_caption[x]
  333. \ {name}menu_caption[x][y] -> menu_caption[x][y]
  334. \ {name}menu_command[x] -> menu_command[x]
  335. \ {name}menu_init -> ``evaluated''
  336. \ {name}menu_init[x] -> menu_init[x]
  337. \ {name}menu_kernel -> menu_kernel
  338. \ {name}menu_keycode[x] -> menu_keycode[x]
  339. \ {name}menu_options -> menu_options
  340. \ {name}menu_optionstext -> menu_optionstext
  341. \ {name}menu_reboot -> menu_reboot
  342. \ {name}toggled_ansi[x] -> toggled_ansi[x]
  343. \ {name}toggled_text[x] -> toggled_text[x]
  344. \
  345. \ Note that menuset{N}_init and {name}menu_init are the initializers
  346. \ for the entire menu (for wholly dynamic menus) opposed to the per-
  347. \ menuitem initializers (with [x] afterward). The whole-menu init
  348. \ routine is evaluated and not passed down to $menu_init (which
  349. \ would result in double evaluation). By doing this, the initializer
  350. \ can initialize the menuset before we transfer it to active-duty.
  351. \
  352. \
  353. \ Copy our affixation (prefix or infix depending on menuset_use_name)
  354. \ to our buffer so that we can safely use the s-quote (s") buf again.
  355. \
  356. menuset_affixbuf 0 2swap ( c-addr2 u2 -- c-addr1 0 c-addr2 u2 )
  357. begin ( using u2 in c-addr2/u2 pair as countdown to zero )
  358. over ( c-addr1 u1 c-addr2 u2 -- c-addr1 u1 c-addr2 u2 c-addr2 )
  359. c@ ( c-addr1 u1 c-addr2 u2 -- c-addr1 u1 c-addr2 u2 c )
  360. 4 pick 4 pick
  361. ( c-addr1 u1 c-addr2 u2 c -- continued below )
  362. ( c-addr1 u1 c-addr2 u2 c c-addr1 u1 )
  363. + ( c-addr1 u1 c-addr2 u2 c c-addr1 u1 -- continued below )
  364. ( c-addr1 u1 c-addr2 u2 c c-addr3 )
  365. c! ( c-addr1 u1 c-addr2 u2 c c-addr3 -- continued below )
  366. ( c-addr1 u1 c-addr2 u2 )
  367. 2swap 1+ 2swap \ increment affixbuf byte position/count
  368. swap 1+ swap \ increment strbuf pointer (source c-addr2)
  369. 1- \ decrement strbuf byte count (source u2)
  370. dup 0= \ time to break?
  371. until
  372. 2drop ( c-addr1 u1 c-addr2 u2 -- c-addr1 u1 ) \ drop strbuf c-addr2/u2
  373. \
  374. \ Create a variable for referencing our affix data (prefix or infix
  375. \ depending on menuset_use_name as described above). This variable will
  376. \ be temporary and only used to simplify cmdbuf assembly.
  377. \
  378. s" affix" setenv ( c-addr1 u1 -- )
  379. ;
  380. : menuset-cleanup ( -- )
  381. s" type" unsetenv
  382. s" var" unsetenv
  383. s" x" unsetenv
  384. s" y" unsetenv
  385. s" affix" unsetenv
  386. ;
  387. only forth definitions also menusets-infrastructure
  388. : menuset-loadsetnum ( N -- )
  389. menuset-checksetnum ( n -- )
  390. \
  391. \ From here out, we use temporary environment variables to make
  392. \ dealing with variable-length strings easier.
  393. \
  394. \ menuset_use_name is true or false
  395. \ $affix should be used appropriately w/respect to menuset_use_name
  396. \
  397. \ ... menu_init ...
  398. s" set var=init" evaluate
  399. menuset-loadmenuvar
  400. \ If menu_init was set by the above, evaluate it here-and-now
  401. \ so that the remaining variables are influenced by its actions
  402. s" menu_init" 2dup getenv dup -1 <> if
  403. 2swap unsetenv \ don't want later menu-create to re-call this
  404. evaluate
  405. else
  406. drop 2drop ( n c-addr u -1 -- n )
  407. then
  408. [char] 1 ( -- x ) \ Loop range ASCII '1' (49) to '8' (56)
  409. begin
  410. dup menuset_x tuck c! 1 s" x" setenv \ set loop iterator and $x
  411. s" set var=caption" evaluate
  412. \ ... menu_caption[x] ...
  413. menuset-loadmenuxvar
  414. \ ... ansi_caption[x] ...
  415. menuset-loadansixvar
  416. [char] 0 ( x -- x y ) \ Inner Loop ASCII '1' (48) to '9' (57)
  417. begin
  418. dup menuset_y tuck c! 1 s" y" setenv
  419. \ set inner loop iterator and $y
  420. \ ... menu_caption[x][y] ...
  421. menuset-loadmenuxyvar
  422. \ ... ansi_caption[x][y] ...
  423. menuset-loadansixyvar
  424. 1+ dup 57 > ( x y -- y' 0|-1 ) \ increment and test
  425. until
  426. drop ( x y -- x )
  427. \ ... menu_command[x] ...
  428. s" set var=command" evaluate
  429. menuset-loadmenuxvar
  430. \ ... menu_init[x] ...
  431. s" set var=init" evaluate
  432. menuset-loadmenuxvar
  433. \ ... menu_keycode[x] ...
  434. s" set var=keycode" evaluate
  435. menuset-loadmenuxvar
  436. \ ... toggled_text[x] ...
  437. s" set var=text" evaluate
  438. menuset-loadtoggledxvar
  439. \ ... toggled_ansi[x] ...
  440. s" set var=ansi" evaluate
  441. menuset-loadtoggledxvar
  442. 1+ dup 56 > ( x -- x' 0|-1 ) \ increment iterator
  443. \ continue if less than 57
  444. until
  445. drop ( x -- ) \ loop iterator
  446. \ ... menu_reboot ...
  447. s" set var=reboot" evaluate
  448. menuset-loadmenuvar
  449. \ ... menu_acpi ...
  450. s" set var=acpi" evaluate
  451. menuset-loadmenuvar
  452. \ ... menu_kernel ...
  453. s" set var=kernel" evaluate
  454. menuset-loadmenuvar
  455. \ ... menu_options ...
  456. s" set var=options" evaluate
  457. menuset-loadmenuvar
  458. \ ... menu_optionstext ...
  459. s" set var=optionstext" evaluate
  460. menuset-loadmenuvar
  461. menuset-cleanup
  462. ;
  463. : menusets-unset ( -- )
  464. s" menuset_initial" unsetenv
  465. 1 begin
  466. dup menuset-checksetnum ( n n -- n )
  467. dup menuset-setnum-namevar ( n n -- n )
  468. unsetenv
  469. \ If the current menuset does not populate the first menuitem,
  470. \ we stop completely.
  471. menuset_use_name @ true = if
  472. s" set buf=${affix}menu_caption[1]"
  473. else
  474. s" set buf=menuset${affix}_caption[1]"
  475. then
  476. evaluate s" buf" getenv getenv -1 = if
  477. drop ( n -- )
  478. s" buf" unsetenv
  479. menuset-cleanup
  480. exit
  481. else
  482. drop ( n c-addr2 -- n ) \ unused
  483. then
  484. [char] 1 ( n -- n x ) \ Loop range ASCII '1' (49) to '8' (56)
  485. begin
  486. dup menuset_x tuck c! 1 s" x" setenv \ set $x to x
  487. s" set var=caption" evaluate
  488. menuset-unloadmenuxvar
  489. menuset-unloadmenuxvar
  490. menuset-unloadansixvar
  491. [char] 0 ( n x -- n x y ) \ Inner loop '0' to '9'
  492. begin
  493. dup menuset_y tuck c! 1 s" y" setenv
  494. \ sets $y to y
  495. menuset-unloadmenuxyvar
  496. menuset-unloadansixyvar
  497. 1+ dup 57 > ( n x y -- n x y' 0|-1 )
  498. until
  499. drop ( n x y -- n x )
  500. s" set var=command" evaluate menuset-unloadmenuxvar
  501. s" set var=init" evaluate menuset-unloadmenuxvar
  502. s" set var=keycode" evaluate menuset-unloadmenuxvar
  503. s" set var=text" evaluate menuset-unloadtoggledxvar
  504. s" set var=ansi" evaluate menuset-unloadtoggledxvar
  505. 1+ dup 56 > ( x -- x' 0|-1 ) \ increment and test
  506. until
  507. drop ( n x -- n ) \ loop iterator
  508. s" set var=acpi" evaluate menuset-unloadmenuvar
  509. s" set var=init" evaluate menuset-unloadmenuvar
  510. s" set var=kernel" evaluate menuset-unloadmenuvar
  511. s" set var=options" evaluate menuset-unloadmenuvar
  512. s" set var=optionstext" evaluate menuset-unloadmenuvar
  513. s" set var=reboot" evaluate menuset-unloadmenuvar
  514. 1+ dup 65535 > ( n -- n' 0|-1 ) \ increment and test
  515. until
  516. drop ( n' -- ) \ loop iterator
  517. s" buf" unsetenv
  518. menuset-cleanup
  519. ;
  520. only forth definitions
  521. : menuset-loadinitial ( -- )
  522. s" menuset_initial" getenv dup -1 <> if
  523. ?number 0<> if
  524. menuset-loadsetnum
  525. then
  526. else
  527. drop \ cruft
  528. then
  529. ;