xref: /freebsd/stand/forth/menusets.4th (revision e8d8bef961a50d4dc22501cde4fb9fb0be1b2532)
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
27marker task-menusets.4th
28
29vocabulary menusets-infrastructure
30only forth also menusets-infrastructure definitions
31
32variable menuset_use_name
33
34create menuset_affixbuf	255 allot
35create menuset_x        1   allot
36create menuset_y        1   allot
37
38: menuset-loadvar ( -- )
39
40	\ menuset_use_name is true or false
41	\ $type should be set to one of:
42	\ 	menu toggled ansi
43	\ $var should be set to one of:
44	\ 	caption command keycode text ...
45	\ $affix is either prefix (menuset_use_name is true)
46	\               or infix (menuset_use_name is false)
47
48	s" set cmdbuf='set ${type}_${var}=\$'" evaluate
49	s" cmdbuf" getenv swap drop ( -- u1 ) \ get string length
50	menuset_use_name @ true = if
51		s" set cmdbuf=${cmdbuf}${affix}${type}_${var}"
52		( u1 -- u1 c-addr2 u2 )
53	else
54		s" set cmdbuf=${cmdbuf}${type}set${affix}_${var}"
55		( u1 -- u1 c-addr2 u2 )
56	then
57	evaluate ( u1 c-addr2 u2 -- u1 )
58	s" cmdbuf" getenv ( u1 -- u1 c-addr2 u2 )
59	rot 2 pick 2 pick over + -rot + tuck -
60		( u1 c-addr2 u2 -- c-addr2 u2 c-addr1 u1 )
61		\ Generate a string representing rvalue inheritance var
62	getenv dup -1 = if
63		( c-addr2 u2 c-addr1 u1 -- c-addr2 u2 -1 )
64		\ NOT set -- clean up the stack
65		drop ( c-addr2 u2 -1 -- c-addr2 u2 )
66		2drop ( c-addr2 u2 -- )
67	else
68		( c-addr2 u2 c-addr1 u1 -- c-addr2 u2 c-addr1 u1 )
69		\ SET -- execute cmdbuf (c-addr2/u2) to inherit value
70		2drop ( c-addr2 u2 c-addr1 u1 -- c-addr2 u2 )
71		evaluate ( c-addr2 u2 -- )
72	then
73
74	s" cmdbuf" unsetenv
75;
76
77: menuset-unloadvar ( -- )
78
79	\ menuset_use_name is true or false
80	\ $type should be set to one of:
81	\ 	menu toggled ansi
82	\ $var should be set to one of:
83	\ 	caption command keycode text ...
84	\ $affix is either prefix (menuset_use_name is true)
85	\               or infix (menuset_use_name is false)
86
87	menuset_use_name @ true = if
88		s" set buf=${affix}${type}_${var}"
89	else
90		s" set buf=${type}set${affix}_${var}"
91	then
92	evaluate
93	s" buf" getenv unsetenv
94	s" buf" unsetenv
95;
96
97: menuset-loadmenuvar ( -- )
98	s" set type=menu" evaluate
99	menuset-loadvar
100;
101
102: menuset-unloadmenuvar ( -- )
103	s" set type=menu" evaluate
104	menuset-unloadvar
105;
106
107: menuset-loadxvar ( -- )
108
109	\ menuset_use_name is true or false
110	\ $type should be set to one of:
111	\ 	menu toggled ansi
112	\ $var should be set to one of:
113	\ 	caption command keycode text ...
114	\ $x is "1" through "8"
115	\ $affix is either prefix (menuset_use_name is true)
116	\               or infix (menuset_use_name is false)
117
118	s" set cmdbuf='set ${type}_${var}[${x}]=\$'" evaluate
119	s" cmdbuf" getenv swap drop ( -- u1 ) \ get string length
120	menuset_use_name @ true = if
121		s" set cmdbuf=${cmdbuf}${affix}${type}_${var}[${x}]"
122		( u1 -- u1 c-addr2 u2 )
123	else
124		s" set cmdbuf=${cmdbuf}${type}set${affix}_${var}[${x}]"
125		( u1 -- u1 c-addr2 u2 )
126	then
127	evaluate ( u1 c-addr2 u2 -- u1 )
128	s" cmdbuf" getenv ( u1 -- u1 c-addr2 u2 )
129	rot 2 pick 2 pick over + -rot + tuck -
130		( u1 c-addr2 u2 -- c-addr2 u2 c-addr1 u1 )
131		\ Generate a string representing rvalue inheritance var
132	getenv dup -1 = if
133		( c-addr2 u2 c-addr1 u1 -- c-addr2 u2 -1 )
134		\ NOT set -- clean up the stack
135		drop ( c-addr2 u2 -1 -- c-addr2 u2 )
136		2drop ( c-addr2 u2 -- )
137	else
138		( c-addr2 u2 c-addr1 u1 -- c-addr2 u2 c-addr1 u1 )
139		\ SET -- execute cmdbuf (c-addr2/u2) to inherit value
140		2drop ( c-addr2 u2 c-addr1 u1 -- c-addr2 u2 )
141		evaluate ( c-addr2 u2 -- )
142	then
143
144	s" cmdbuf" unsetenv
145;
146
147: menuset-unloadxvar ( -- )
148
149	\ menuset_use_name is true or false
150	\ $type should be set to one of:
151	\ 	menu toggled ansi
152	\ $var should be set to one of:
153	\ 	caption command keycode text ...
154	\ $x is "1" through "8"
155	\ $affix is either prefix (menuset_use_name is true)
156	\               or infix (menuset_use_name is false)
157
158	menuset_use_name @ true = if
159		s" set buf=${affix}${type}_${var}[${x}]"
160	else
161		s" set buf=${type}set${affix}_${var}[${x}]"
162	then
163	evaluate
164	s" buf" getenv unsetenv
165	s" buf" unsetenv
166;
167
168: menuset-loadansixvar ( -- )
169	s" set type=ansi" evaluate
170	menuset-loadxvar
171;
172
173: menuset-unloadansixvar ( -- )
174	s" set type=ansi" evaluate
175	menuset-unloadxvar
176;
177
178: menuset-loadmenuxvar ( -- )
179	s" set type=menu" evaluate
180	menuset-loadxvar
181;
182
183: menuset-unloadmenuxvar ( -- )
184	s" set type=menu" evaluate
185	menuset-unloadxvar
186;
187
188: menuset-loadtoggledxvar ( -- )
189	s" set type=toggled" evaluate
190	menuset-loadxvar
191;
192
193: menuset-unloadtoggledxvar ( -- )
194	s" set type=toggled" evaluate
195	menuset-unloadxvar
196;
197
198: menuset-loadxyvar ( -- )
199
200	\ menuset_use_name is true or false
201	\ $type should be set to one of:
202	\ 	menu toggled ansi
203	\ $var should be set to one of:
204	\ 	caption command keycode text ...
205	\ $x is "1" through "8"
206	\ $y is "0" through "9"
207	\ $affix is either prefix (menuset_use_name is true)
208	\               or infix (menuset_use_name is false)
209
210	s" set cmdbuf='set ${type}_${var}[${x}][${y}]=\$'" evaluate
211	s" cmdbuf" getenv swap drop ( -- u1 ) \ get string length
212	menuset_use_name @ true = if
213		s" set cmdbuf=${cmdbuf}${affix}${type}_${var}[${x}][${y}]"
214		( u1 -- u1 c-addr2 u2 )
215	else
216		s" set cmdbuf=${cmdbuf}${type}set${affix}_${var}[${x}][${y}]"
217		( u1 -- u1 c-addr2 u2 )
218	then
219	evaluate ( u1 c-addr2 u2 -- u1 )
220	s" cmdbuf" getenv ( u1 -- u1 c-addr2 u2 )
221	rot 2 pick 2 pick over + -rot + tuck -
222		( u1 c-addr2 u2 -- c-addr2 u2 c-addr1 u1 )
223		\ Generate a string representing rvalue inheritance var
224	getenv dup -1 = if
225		( c-addr2 u2 c-addr1 u1 -- c-addr2 u2 -1 )
226		\ NOT set -- clean up the stack
227		drop ( c-addr2 u2 -1 -- c-addr2 u2 )
228		2drop ( c-addr2 u2 -- )
229	else
230		( c-addr2 u2 c-addr1 u1 -- c-addr2 u2 c-addr1 u1 )
231		\ SET -- execute cmdbuf (c-addr2/u2) to inherit value
232		2drop ( c-addr2 u2 c-addr1 u1 -- c-addr2 u2 )
233		evaluate ( c-addr2 u2 -- )
234	then
235
236	s" cmdbuf" unsetenv
237;
238
239: menuset-unloadxyvar ( -- )
240
241	\ menuset_use_name is true or false
242	\ $type should be set to one of:
243	\ 	menu toggled ansi
244	\ $var should be set to one of:
245	\ 	caption command keycode text ...
246	\ $x is "1" through "8"
247	\ $y is "0" through "9"
248	\ $affix is either prefix (menuset_use_name is true)
249	\               or infix (menuset_use_name is false)
250
251	menuset_use_name @ true = if
252		s" set buf=${affix}${type}_${var}[${x}][${y}]"
253	else
254		s" set buf=${type}set${affix}_${var}[${x}][${y}]"
255	then
256	evaluate
257	s" buf" getenv unsetenv
258	s" buf" unsetenv
259;
260
261: menuset-loadansixyvar ( -- )
262	s" set type=ansi" evaluate
263	menuset-loadxyvar
264;
265
266: menuset-unloadansixyvar ( -- )
267	s" set type=ansi" evaluate
268	menuset-unloadxyvar
269;
270
271: menuset-loadmenuxyvar ( -- )
272	s" set type=menu" evaluate
273	menuset-loadxyvar
274;
275
276: menuset-unloadmenuxyvar ( -- )
277	s" set type=menu" evaluate
278	menuset-unloadxyvar
279;
280
281: menuset-setnum-namevar ( N -- C-Addr/U )
282
283	s" menuset_nameNNNNN" ( n -- n c-addr1 u1 )	\ variable basename
284	drop 12 ( n c-addr1 u1 -- n c-addr1 12 )	\ remove "NNNNN"
285	rot     ( n c-addr1 12 -- c-addr1 12 n )	\ move number on top
286
287	\ convert to string
288	s>d <# #s #> ( c-addr1 12 n -- c-addr1 12 c-addr2 u2 )
289
290	\ Combine strings
291	begin ( using u2 in c-addr2/u2 pair as countdown to zero )
292		over	( c-addr1 u1 c-addr2 u2 -- continued below )
293			( c-addr1 u1 c-addr2 u2 c-addr2 ) \ copy src-addr
294		c@	( c-addr1 u1 c-addr2 u2 c-addr2 -- continued below )
295			( c-addr1 u1 c-addr2 u2 c ) \ get next src-addr byte
296		4 pick 4 pick
297			( c-addr1 u1 c-addr2 u2 c -- continued below )
298			( c-addr1 u1 c-addr2 u2 c c-addr1 u1 )
299			\ get destination c-addr1/u1 pair
300		+	( c-addr1 u1 c-addr2 u2 c c-addr1 u1 -- cont. below )
301			( c-addr1 u1 c-addr2 u2 c c-addr3 )
302			\ combine dest-c-addr to get dest-addr for byte
303		c!	( c-addr1 u1 c-addr2 u2 c c-addr3 -- continued below )
304			( c-addr1 u1 c-addr2 u2 )
305			\ store the current src-addr byte into dest-addr
306
307		2swap 1+ 2swap	\ increment u1 in destination c-addr1/u1 pair
308		swap 1+ swap	\ increment c-addr2 in source c-addr2/u2 pair
309		1-		\ decrement u2 in the source c-addr2/u2 pair
310
311		dup 0= \ time to break?
312	until
313
314	2drop	( c-addr1 u1 c-addr2 u2 -- c-addr1 u1 )
315		\ drop temporary number-format conversion c-addr2/u2
316;
317
318: menuset-checksetnum ( N -- )
319
320	\
321	\ adjust input to be both positive and no-higher than 65535
322	\
323	abs dup 65535 > if drop 65535 then ( n -- n )
324
325	\
326	\ The next few blocks will determine if we should use the default
327	\ methodology (referencing the original numeric stack-input), or if-
328	\ instead $menuset_name{N} has been defined wherein we would then
329	\ use the value thereof as the prefix to every menu variable.
330	\
331
332	false menuset_use_name ! \ assume name is not set
333
334	menuset-setnum-namevar
335	\
336	\ We now have a string that is the assembled variable name to check
337	\ for... $menuset_name{N}. Let's check for it.
338	\
339	2dup ( c-addr1 u1 -- c-addr1 u1 c-addr1 u1 ) \ save a copy
340	getenv dup -1 <> if ( c-addr1 u1 c-addr1 u1 -- c-addr1 u1 c-addr2 u2 )
341		\ The variable is set. Let's clean up the stack leaving only
342		\ its value for later use.
343
344		true menuset_use_name !
345		2swap 2drop	( c-addr1 u1 c-addr2 u2 -- c-addr2 u2 )
346				\ drop assembled variable name, leave the value
347	else ( c-addr1 u1 c-addr1 u1 -- c-addr1 u1 -1 ) \ no such variable
348		\ The variable is not set. Let's clean up the stack leaving the
349		\ string [portion] representing the original numeric input.
350
351		drop ( c-addr1 u1 -1 -- c-addr1 u1 ) \ drop -1 result
352		12 - swap 12 + swap ( c-addr1 u1 -- c-addr2 u2 )
353			\ truncate to original numeric stack-input
354	then
355
356	\
357	\ Now, depending on whether $menuset_name{N} has been set, we have
358	\ either the value thereof to be used as a prefix to all menu_*
359	\ variables or we have a string representing the numeric stack-input
360	\ to be used as a "set{N}" infix to the same menu_* variables.
361	\
362	\ For example, if the stack-input is 1 and menuset_name1 is NOT set
363	\ the following variables will be referenced:
364	\ 	ansiset1_caption[x]		-> ansi_caption[x]
365	\ 	ansiset1_caption[x][y]		-> ansi_caption[x][y]
366	\ 	menuset1_acpi			-> menu_acpi
367	\ 	menuset1_caption[x]		-> menu_caption[x]
368	\ 	menuset1_caption[x][y]		-> menu_caption[x][y]
369	\ 	menuset1_command[x]		-> menu_command[x]
370	\ 	menuset1_init			-> ``evaluated''
371	\ 	menuset1_init[x]		-> menu_init[x]
372	\ 	menuset1_kernel			-> menu_kernel
373	\ 	menuset1_keycode[x]		-> menu_keycode[x]
374	\ 	menuset1_options		-> menu_options
375	\ 	menuset1_optionstext		-> menu_optionstext
376	\ 	menuset1_reboot			-> menu_reboot
377	\ 	toggledset1_ansi[x]		-> toggled_ansi[x]
378	\ 	toggledset1_text[x]		-> toggled_text[x]
379	\ otherwise, the following variables are referenced (where {name}
380	\ represents the value of $menuset_name1 (given 1 as stack-input):
381	\ 	{name}ansi_caption[x]		-> ansi_caption[x]
382	\ 	{name}ansi_caption[x][y]	-> ansi_caption[x][y]
383	\ 	{name}menu_acpi			-> menu_acpi
384	\ 	{name}menu_caption[x]		-> menu_caption[x]
385	\ 	{name}menu_caption[x][y]	-> menu_caption[x][y]
386	\ 	{name}menu_command[x]		-> menu_command[x]
387	\ 	{name}menu_init			-> ``evaluated''
388	\ 	{name}menu_init[x]		-> menu_init[x]
389	\ 	{name}menu_kernel		-> menu_kernel
390	\ 	{name}menu_keycode[x]		-> menu_keycode[x]
391	\ 	{name}menu_options		-> menu_options
392	\ 	{name}menu_optionstext		-> menu_optionstext
393	\ 	{name}menu_reboot		-> menu_reboot
394	\ 	{name}toggled_ansi[x]		-> toggled_ansi[x]
395	\ 	{name}toggled_text[x]		-> toggled_text[x]
396	\
397	\ Note that menuset{N}_init and {name}menu_init are the initializers
398	\ for the entire menu (for wholly dynamic menus) opposed to the per-
399	\ menuitem initializers (with [x] afterward). The whole-menu init
400	\ routine is evaluated and not passed down to $menu_init (which
401	\ would result in double evaluation). By doing this, the initializer
402	\ can initialize the menuset before we transfer it to active-duty.
403	\
404
405	\
406	\ Copy our affixation (prefix or infix depending on menuset_use_name)
407	\ to our buffer so that we can safely use the s-quote (s") buf again.
408	\
409	menuset_affixbuf 0 2swap ( c-addr2 u2 -- c-addr1 0 c-addr2 u2 )
410	begin ( using u2 in c-addr2/u2 pair as countdown to zero )
411		over ( c-addr1 u1 c-addr2 u2 -- c-addr1 u1 c-addr2 u2 c-addr2 )
412		c@   ( c-addr1 u1 c-addr2 u2 -- c-addr1 u1 c-addr2 u2 c )
413		4 pick 4 pick
414		     ( c-addr1 u1 c-addr2 u2 c -- continued below )
415		     ( c-addr1 u1 c-addr2 u2 c c-addr1 u1 )
416		+    ( c-addr1 u1 c-addr2 u2 c c-addr1 u1 -- continued below )
417		     ( c-addr1 u1 c-addr2 u2 c c-addr3 )
418		c!   ( c-addr1 u1 c-addr2 u2 c c-addr3 -- continued below )
419		     ( c-addr1 u1 c-addr2 u2 )
420		2swap 1+ 2swap	\ increment affixbuf byte position/count
421		swap 1+ swap	\ increment strbuf pointer (source c-addr2)
422		1-		\ decrement strbuf byte count (source u2)
423		dup 0=          \ time to break?
424	until
425	2drop ( c-addr1 u1 c-addr2 u2 -- c-addr1 u1 ) \ drop strbuf c-addr2/u2
426
427	\
428	\ Create a variable for referencing our affix data (prefix or infix
429	\ depending on menuset_use_name as described above). This variable will
430	\ be temporary and only used to simplify cmdbuf assembly.
431	\
432	s" affix" setenv ( c-addr1 u1 -- )
433;
434
435: menuset-cleanup ( -- )
436	s" type"  unsetenv
437	s" var"   unsetenv
438	s" x"     unsetenv
439	s" y"     unsetenv
440	s" affix" unsetenv
441;
442
443only forth definitions also menusets-infrastructure
444
445: menuset-loadsetnum ( N -- )
446
447	menuset-checksetnum ( n -- )
448
449	\
450	\ From here out, we use temporary environment variables to make
451	\ dealing with variable-length strings easier.
452	\
453	\ menuset_use_name is true or false
454	\ $affix should be used appropriately w/respect to menuset_use_name
455	\
456
457	\ ... menu_init ...
458	s" set var=init" evaluate
459	menuset-loadmenuvar
460
461	\ If menu_init was set by the above, evaluate it here-and-now
462	\ so that the remaining variables are influenced by its actions
463	s" menu_init" 2dup getenv dup -1 <> if
464		2swap unsetenv \ don't want later menu-create to re-call this
465		evaluate
466	else
467		drop 2drop ( n c-addr u -1 -- n )
468	then
469
470	[char] 1 ( -- x ) \ Loop range ASCII '1' (49) to '8' (56)
471	begin
472		dup menuset_x tuck c! 1 s" x" setenv \ set loop iterator and $x
473
474		s" set var=caption" evaluate
475
476		\ ... menu_caption[x] ...
477		menuset-loadmenuxvar
478
479		\ ... ansi_caption[x] ...
480		menuset-loadansixvar
481
482		[char] 0 ( x -- x y ) \ Inner Loop ASCII '1' (48) to '9' (57)
483		begin
484			dup menuset_y tuck c! 1 s" y" setenv
485				\ set inner loop iterator and $y
486
487			\ ... menu_caption[x][y] ...
488			menuset-loadmenuxyvar
489
490			\ ... ansi_caption[x][y] ...
491			menuset-loadansixyvar
492
493			1+ dup 57 > ( x y -- y' 0|-1 ) \ increment and test
494		until
495		drop ( x y -- x )
496
497		\ ... menu_command[x] ...
498		s" set var=command" evaluate
499		menuset-loadmenuxvar
500
501		\ ... menu_init[x] ...
502		s" set var=init" evaluate
503		menuset-loadmenuxvar
504
505		\ ... menu_keycode[x] ...
506		s" set var=keycode" evaluate
507		menuset-loadmenuxvar
508
509		\ ... toggled_text[x] ...
510		s" set var=text" evaluate
511		menuset-loadtoggledxvar
512
513		\ ... toggled_ansi[x] ...
514		s" set var=ansi" evaluate
515		menuset-loadtoggledxvar
516
517		1+ dup 56 > ( x -- x' 0|-1 ) \ increment iterator
518		                             \ continue if less than 57
519	until
520	drop ( x -- ) \ loop iterator
521
522	\ ... menu_reboot ...
523	s" set var=reboot" evaluate
524	menuset-loadmenuvar
525
526	\ ... menu_acpi ...
527	s" set var=acpi" evaluate
528	menuset-loadmenuvar
529
530	\ ... menu_kernel ...
531	s" set var=kernel" evaluate
532	menuset-loadmenuvar
533
534	\ ... menu_options ...
535	s" set var=options" evaluate
536	menuset-loadmenuvar
537
538	\ ... menu_optionstext ...
539	s" set var=optionstext" evaluate
540	menuset-loadmenuvar
541
542	menuset-cleanup
543;
544
545: menusets-unset ( -- )
546
547	s" menuset_initial" unsetenv
548
549	1 begin
550		dup menuset-checksetnum ( n n -- n )
551
552		dup menuset-setnum-namevar ( n n -- n )
553		unsetenv
554
555		\ If the current menuset does not populate the first menuitem,
556		\ we stop completely.
557
558		menuset_use_name @ true = if
559			s" set buf=${affix}menu_caption[1]"
560		else
561			s" set buf=menuset${affix}_caption[1]"
562		then
563		evaluate s" buf" getenv getenv -1 = if
564			drop ( n -- )
565			s" buf" unsetenv
566			menuset-cleanup
567			exit
568		else
569			drop ( n c-addr2 -- n ) \ unused
570		then
571
572		[char] 1 ( n -- n x ) \ Loop range ASCII '1' (49) to '8' (56)
573		begin
574			dup menuset_x tuck c! 1 s" x" setenv \ set $x to x
575
576			s" set var=caption" evaluate
577			menuset-unloadmenuxvar
578			menuset-unloadmenuxvar
579			menuset-unloadansixvar
580			[char] 0 ( n x -- n x y ) \ Inner loop '0' to '9'
581			begin
582				dup menuset_y tuck c! 1 s" y" setenv
583					\ sets $y to y
584				menuset-unloadmenuxyvar
585				menuset-unloadansixyvar
586				1+ dup 57 > ( n x y -- n x y' 0|-1 )
587			until
588			drop ( n x y -- n x )
589			s" set var=command" evaluate menuset-unloadmenuxvar
590			s" set var=init"    evaluate menuset-unloadmenuxvar
591			s" set var=keycode" evaluate menuset-unloadmenuxvar
592			s" set var=text"    evaluate menuset-unloadtoggledxvar
593			s" set var=ansi"    evaluate menuset-unloadtoggledxvar
594
595			1+ dup 56 > ( x -- x' 0|-1 ) \ increment and test
596		until
597		drop ( n x -- n ) \ loop iterator
598
599		s" set var=acpi"        evaluate menuset-unloadmenuvar
600		s" set var=init"        evaluate menuset-unloadmenuvar
601		s" set var=kernel"      evaluate menuset-unloadmenuvar
602		s" set var=options"     evaluate menuset-unloadmenuvar
603		s" set var=optionstext" evaluate menuset-unloadmenuvar
604		s" set var=reboot"      evaluate menuset-unloadmenuvar
605
606		1+ dup 65535 > ( n -- n' 0|-1 ) \ increment and test
607	until
608	drop ( n' -- ) \ loop iterator
609
610	s" buf" unsetenv
611	menuset-cleanup
612;
613
614only forth definitions
615
616: menuset-loadinitial ( -- )
617	s" menuset_initial" getenv dup -1 <> if
618		?number 0<> if
619			menuset-loadsetnum
620		then
621	else
622		drop \ cruft
623	then
624;
625