1 \ Copyright (c) 2008-2015 Devin Teske <dteske@FreeBSD.org>
4 \ Redistribution and use in source and binary forms, with or without
5 \ modification, are permitted provided that the following conditions
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.
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
28 vocabulary delay-processing
29 only forth also delay-processing definitions
31 2 constant delay_default \ Default delay (in seconds)
32 3 constant etx_key \ End-of-Text character produced by Ctrl+C
33 13 constant enter_key \ Carriage-Return character produce by ENTER
34 27 constant esc_key \ Escape character produced by ESC or Ctrl+[
36 variable delay_tstart \ state variable used for delay timing
37 variable delay_delay \ determined configurable delay duration
38 variable delay_cancelled \ state variable for user cancellation
39 variable delay_showdots \ whether continually print dots while waiting
41 only forth definitions also delay-processing
43 : delay_execute ( -- )
45 \ make sure that we have a command to execute
46 s" delay_command" getenv dup -1 = if
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)
55 \ make sure custom duration is a number
57 delay_default \ use default if otherwise
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
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
74 \ Loop until we have exceeded the desired time duration
76 25 ms \ sleep for 25 milliseconds (40 iterations/sec)
78 \ throw some dots up on the screen if desired
80 ." ." \ dots visually aid in the perception of time
83 \ was a key depressed?
85 key \ obtain ASCII value for keystroke
87 -1 delay_delay ! \ break loop
89 dup etx_key = swap esc_key = OR if
90 -1 delay_delay ! \ break loop
91 -1 delay_cancelled ! \ set cancelled flag
95 \ if the time duration is set to zero, loop forever
96 \ waiting for either ENTER or Ctrl-C/Escape to be pressed
98 \ calculate elapsed time
99 seconds delay_tstart @ - delay_delay @ >
105 \ if we were throwing up dots, throw up a line-break
110 \ did the user press either Ctrl-C or Escape?
112 2drop \ we don't need the command string anymore
114 evaluate \ evaluate/execute the command string
118 only forth definitions