PageRenderTime 24ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/stand/forth/delay.4th

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