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