Merge pull request #75 from SeekingMeaning/0BSD
[pforth] / fth / case.fth
CommitLineData
8e9db35f
PB
1\ @(#) case.fth 98/01/26 1.2
2\ CASE Statement
3\
4\ This definition is based upon Wil Baden's assertion that
5\ >MARK >RESOLVE ?BRANCH etc. are not needed if one has IF ELSE THEN etc.
6\
7\ Author: Phil Burk
1a088514 8\ Copyright 1994 3DO, Phil Burk, Larry Polansky, David Rosenboom
8e9db35f 9\
1f99f95d
S
10\ Permission to use, copy, modify, and/or distribute this
11\ software for any purpose with or without fee is hereby granted.
12\
13\ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
14\ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
15\ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
16\ THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
17\ CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
18\ FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
19\ CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
20\ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
8e9db35f
PB
21\
22\ MOD: PLB 6/24/91 Check for missing ENDOF
23\ MOD: PLB 8/7/91 Add ?OF and RANGEOF
24\ MOD: PLB 11/2/99 Fixed nesting of CASE. Needed to save of-depth on stack as well as case-depth.
25
26anew TASK-CASE
27
28variable CASE-DEPTH
29variable OF-DEPTH
30
31: CASE ( n -- , start case statement ) ( -c- case-depth )
32 ?comp
33 of-depth @ 0 of-depth ! \ 11/2/99
34 case-depth @ 0 case-depth ! ( allow nesting )
35; IMMEDIATE
36
37: ?OF ( n flag -- | n , doit if true ) ( -c- addr )
38 [compile] IF
39 compile drop
40 1 case-depth +!
41 1 of-depth +!
42; IMMEDIATE
43
44: OF ( n t -- | n , doit if match ) ( -c- addr )
45 ?comp
46 compile over compile =
47 [compile] ?OF
48; IMMEDIATE
49
50: (RANGEOF?) ( n lo hi -- | n flag )
51 >r over ( n lo n ) <=
52 IF
53 dup r> ( n n hi ) <=
54 ELSE
55 rdrop false
56 THEN
57;
58
59: RANGEOF ( n lo hi -- | n , doit if within ) ( -c- addr )
60 compile (rangeof?)
61 [compile] ?OF
62; IMMEDIATE
63
64: ENDOF ( -- ) ( addr -c- addr' )
65 [compile] ELSE
66 -1 of-depth +!
67; IMMEDIATE
68
69: ENDCASE ( n -- ) ( old-case-depth addr' addr' ??? -- )
70 of-depth @
71 IF >newline ." Missing ENDOF in CASE!" cr abort
72 THEN
73\
74 compile drop
75 case-depth @ 0
76 ?DO [compile] THEN
77 LOOP
78 case-depth !
79 of-depth !
80; IMMEDIATE
81