]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - sys/boot/ficl/softwords/jhlocal.fr
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.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 \ revised 2 June 2000 - { | a -- } now works correctly
16 \
17 \ $FreeBSD$
18
19 hide
20
21 0 constant zero
22
23
24 : ?--   ( c-addr u -- c-addr u flag )
25     2dup s" --" compare 0= ;
26 : ?}    ( c-addr u -- c-addr u flag )
27     2dup s" }"  compare 0= ;
28 : ?|    ( c-addr u -- c-addr u flag )
29     2dup s" |"  compare 0= ;
30
31 \ examine name - if it's a 2local (starts with "2:"),
32 \ nibble the prefix (the "2:") off the name and push true.
33 \ Otherwise push false
34 \ Problem if the local is named "2:" - we fall off the end...
35 : ?2loc ( c-addr u -- c-addr u flag )
36     over dup c@ [char] 2 = 
37         swap 1+  c@ [char] : = and
38     if 
39         2 - swap char+ char+ swap  \ dcs/jws: nibble the '2:'
40         true 
41     else 
42             false 
43     endif 
44 ;
45
46 : ?delim   ( c-addr u -- state | c-addr u 0 )
47     ?|  if  2drop 1 exit endif
48     ?-- if  2drop 2 exit endif
49     ?}  if  2drop 3 exit endif
50     dup 0= 
51         if  2drop 4 exit endif
52     0
53 ;
54
55 set-current
56
57 : {
58     0 dup locals| locstate |
59     
60     \ stack locals until we hit a delimiter
61     begin
62         parse-word      \ ( nLocals c-addr u )
63         ?delim dup to locstate
64     0= while
65         rot 1+          \ ( c-addr u ... c-addr u nLocals )
66     repeat
67
68     \ now unstack the locals
69     0 ?do 
70             ?2loc if (2local) else (local) endif 
71         loop   \ ( )
72
73     \ zero locals until -- or }
74     locstate 1 = if
75         begin
76             parse-word
77             ?delim dup to locstate
78         0= while
79             ?2loc if
80                 postpone zero postpone zero (2local)
81             else
82                 postpone zero (local)
83             endif
84         repeat
85     endif
86
87     0 0 (local)
88
89     \ toss words until }
90     \ (explicitly allow | and -- in the comment)
91     locstate 2 = if
92         begin
93             parse-word
94             ?delim dup  to locstate
95         3 < while
96             locstate 0=  if 2drop endif
97         repeat
98     endif
99
100     locstate 3 <> abort" syntax error in { } local line"
101 ; immediate compile-only
102
103 previous 
104 \ #endif
105