1\ Copyright (c) 2008-2015 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
26marker task-delay.4th
27
28vocabulary delay-processing
29only forth also delay-processing definitions
30
312  constant delay_default \ Default delay (in seconds)
323  constant etx_key       \ End-of-Text character produced by Ctrl+C
3313 constant enter_key     \ Carriage-Return character produce by ENTER
3427 constant esc_key       \ Escape character produced by ESC or Ctrl+[
35
36variable delay_tstart     \ state variable used for delay timing
37variable delay_delay      \ determined configurable delay duration
38variable delay_cancelled  \ state variable for user cancellation
39variable delay_showdots   \ whether continually print dots while waiting
40
41only forth definitions also delay-processing
42
43: delay_execute ( -- )
44
45	\ make sure that we have a command to execute
46	s" delay_command" getenv dup -1 = if
47		drop exit 
48	then
49
50	\ read custom time-duration (if set)
51	s" loader_delay" getenv dup -1 = if
52		drop          \ no custom duration (remove dup'd bunk -1)
53		delay_default \ use default setting (replacing bunk -1)
54	else
55		\ make sure custom duration is a number
56		?number 0= if
57			delay_default \ use default if otherwise
58		then
59	then
60
61	\ initialize state variables
62	delay_delay !          \ stored value is on the stack from above
63	seconds delay_tstart ! \ store the time we started
64	0 delay_cancelled !    \ boolean flag indicating user-cancelled event
65
66	false delay_showdots ! \ reset to zero and read from environment
67	s" delay_showdots" getenv dup -1 <> if
68		2drop \ don't need the value, just existence
69		true delay_showdots !
70	else
71		drop
72	then
73
74	\ Loop until we have exceeded the desired time duration
75	begin
76		25 ms \ sleep for 25 milliseconds (40 iterations/sec)
77
78		\ throw some dots up on the screen if desired
79		delay_showdots @ if
80			." ." \ dots visually aid in the perception of time
81		then
82
83		\ was a key depressed?
84		key? if
85			key \ obtain ASCII value for keystroke
86			dup enter_key = if
87				-1 delay_delay ! \ break loop
88			then
89			dup etx_key = swap esc_key = OR if
90				-1 delay_delay !     \ break loop
91				-1 delay_cancelled ! \ set cancelled flag
92			then
93		then
94
95		\ if the time duration is set to zero, loop forever
96		\ waiting for either ENTER or Ctrl-C/Escape to be pressed
97		delay_delay @ 0> if
98			\ calculate elapsed time
99			seconds delay_tstart @ - delay_delay @ >
100		else
101			-1 \ break loop
102		then
103	until
104
105	\ if we were throwing up dots, throw up a line-break
106	delay_showdots @ if
107		cr
108	then
109
110	\ did the user press either Ctrl-C or Escape?
111	delay_cancelled @ if
112		2drop \ we don't need the command string anymore
113	else
114		evaluate \ evaluate/execute the command string
115 	then
116;
117
118only forth definitions
119