Initial import from FreeBSD RELENG_4:
[dragonfly.git] / sys / boot / ficl / softwords / jhlocal.fr
1 \ #if FICL_WANT_LOCALS
2 \ ** ficl/softwords/jhlocal.fr
3 \ ** stack comment style local syntax...
4 \ { a b c | cleared -- d e }
5 \ variables before the "|" are initialized in reverse order
6 \ from the stack. Those after the "|" are zero initialized.
7 \ Anything between "--" and "}" is treated as comment
8 \ Uses locals...
9 \ locstate: 0 = looking for | or -- or }}
10 \           1 = found |
11 \           2 = found --
12 \           3 = found }
13 \           4 = end of line
14 \
15 \ $FreeBSD: src/sys/boot/ficl/softwords/jhlocal.fr,v 1.1.6.1 2000/07/06 23:51:46 obrien Exp $
16
17 hide
18 0 constant zero
19
20 : ?--   ( c-addr u -- c-addr u flag )
21     2dup s" --" compare 0= ;
22 : ?}    ( c-addr u -- c-addr u flag )
23     2dup s" }"  compare 0= ;
24 : ?|    ( c-addr u -- c-addr u flag )
25     2dup s" |"  compare 0= ;
26
27 \ examine name and push true if it's a 2local
28 \ (starts with '2'), false otherwise. 
29 : ?2loc ( c-addr u -- c-addr n flag )
30     over c@ [char] 2 = if true else false endif ;
31
32 : ?delim   ( c-addr u -- state | c-addr u 0 )
33     ?|  if  2drop 1 exit endif
34     ?-- if  2drop 2 exit endif
35     ?}  if  2drop 3 exit endif
36     dup 0= 
37         if  2drop 4 exit endif
38     0
39 ;
40
41 set-current
42
43 : {
44     0 dup locals| locstate |
45     
46     \ stack locals until we hit a delimiter
47     begin
48         parse-word      \ ( nLocals c-addr u )
49         ?delim dup to locstate
50     0= while
51         rot 1+          \ ( c-addr u ... c-addr u nLocals )
52     repeat
53
54     \ now unstack the locals
55     0 ?do 
56             ?2loc if (2local) else (local) endif 
57         loop   \ ( )
58
59     \ zero locals until -- or }
60     locstate 1 = if
61         begin
62             parse-word
63             ?delim dup to locstate
64         0= while
65                     ?2loc if 
66                             postpone zero postpone zero  (2local)
67                         else
68                 postpone zero  (local)
69                     endif
70         repeat
71     endif
72
73     0 0 (local)
74
75     \ toss words until }
76     locstate 2 = if
77         begin
78             parse-word
79             ?delim dup to locstate
80         0= while
81             2drop
82         repeat
83     endif
84
85     locstate 3 <> abort" syntax error in { } local line"
86 ; immediate compile-only
87
88 previous 
89 \ #endif
90