Add the DragonFly cvs id and perform general cleanups on cvs/rcs/sccs ids. Most
[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 \ $DragonFly: src/sys/boot/ficl/softwords/jhlocal.fr,v 1.2 2003/06/17 04:28:18 dillon Exp $
17
18 hide
19 0 constant zero
20
21 : ?--   ( c-addr u -- c-addr u flag )
22     2dup s" --" compare 0= ;
23 : ?}    ( c-addr u -- c-addr u flag )
24     2dup s" }"  compare 0= ;
25 : ?|    ( c-addr u -- c-addr u flag )
26     2dup s" |"  compare 0= ;
27
28 \ examine name and push true if it's a 2local
29 \ (starts with '2'), false otherwise. 
30 : ?2loc ( c-addr u -- c-addr n flag )
31     over c@ [char] 2 = if true else false endif ;
32
33 : ?delim   ( c-addr u -- state | c-addr u 0 )
34     ?|  if  2drop 1 exit endif
35     ?-- if  2drop 2 exit endif
36     ?}  if  2drop 3 exit endif
37     dup 0= 
38         if  2drop 4 exit endif
39     0
40 ;
41
42 set-current
43
44 : {
45     0 dup locals| locstate |
46     
47     \ stack locals until we hit a delimiter
48     begin
49         parse-word      \ ( nLocals c-addr u )
50         ?delim dup to locstate
51     0= while
52         rot 1+          \ ( c-addr u ... c-addr u nLocals )
53     repeat
54
55     \ now unstack the locals
56     0 ?do 
57             ?2loc if (2local) else (local) endif 
58         loop   \ ( )
59
60     \ zero locals until -- or }
61     locstate 1 = if
62         begin
63             parse-word
64             ?delim dup to locstate
65         0= while
66                     ?2loc if 
67                             postpone zero postpone zero  (2local)
68                         else
69                 postpone zero  (local)
70                     endif
71         repeat
72     endif
73
74     0 0 (local)
75
76     \ toss words until }
77     locstate 2 = if
78         begin
79             parse-word
80             ?delim dup to locstate
81         0= while
82             2drop
83         repeat
84     endif
85
86     locstate 3 <> abort" syntax error in { } local line"
87 ; immediate compile-only
88
89 previous 
90 \ #endif
91