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