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