<div>This is an implementation of Apple local variables which is required to execute the Forth scripts in BootX</div><div><br></div><div>Index: forth/bootstrap/bootstrap.fs</div><div>===================================================================</div>
<div>--- forth/bootstrap/bootstrap.fs<span style="white-space:pre-wrap"> </span>(revision 1041)</div><div>+++ forth/bootstrap/bootstrap.fs<span style="white-space:pre-wrap"> </span>(working copy)</div>
<div>@@ -1413,10 +1413,135 @@</div><div> here last @ , latest ! \ write backlink and set latest</div><div> ;</div><div> </div><div>+\ </div><div>+\ Defer required by BootX</div><div>+\ </div><div> </div><div>
+defer spin</div><div>+</div><div>+\ </div><div>+\ Local Variables (Apple specific)</div><div>+\ </div><div>+</div><div>+\ </div><div>+: has-locals ( -- true/false )</div><div>+ skipws</div><div>+ ib >in @ + c@ 7b <></div>
<div>+ if false exit then</div><div>+ ib >in @ + 1+ c@ 20 ></div><div>+ if false exit then</div><div>+</div><div>+ true</div><div>+ ;</div><div>+</div><div>+: comp-str-char ( str len char -- true/false )</div><div>
+ swap 1 <> if 2drop false exit then</div><div>+ swap c@ <> if false exit then</div><div>+ true</div><div>+ ;</div><div>+</div><div>+variable locals_wordlist</div><div>+variable locals_state \ 0 - reading args</div>
<div>+ \ 1 - ;</div><div>+ \ 2 - reading vars</div><div>+: read-locals ( -- addr0 .. addrN addrCount )</div><div>+ has-locals</div><div>+ not if 0 false exit then \ no locals</div>
<div>+</div><div>+ 0 locals_state !</div><div>+ 0 >r</div><div>+</div><div>+ s" get-current" $find drop execute</div><div>+ s" wordlist" $find drop execute</div><div>+ dup locals_wordlist !</div>
<div>+ s" set-current" $find drop execute</div><div>+</div><div>+ parse-word 2drop \ ditch the {</div><div>+</div><div>+ begin</div><div>+ parse-word</div><div>+</div><div>+ 2dup 3b comp-str-char \ check for ;</div>
<div>+ if 1 locals_state ! then</div><div>+</div><div>+ 2dup 7d comp-str-char \ check for }</div><div>+ not</div><div>+ while</div><div>+ locals_state @ 1 <> if \ the ; is not a local variable so ignore it</div>
<div>+ header</div><div>+</div><div>+ locals_state @ 0= if \ only save the address if it is an arg</div><div>+ r></div><div>+ here na1+ >r</div><div>+ 1+ >r</div><div>+ then</div>
<div>+</div><div>+ 3 , 0 ,</div><div>+ reveal</div><div>+ else \ if we hit a ; then move to next state</div><div>+ 2drop</div><div>+ 2 locals_state !</div><div>+ then</div><div>+ repeat</div><div>
+</div><div>+ 2drop</div><div>+</div><div>+ s" set-current" $find drop execute</div><div>+</div><div>+ r> 0</div><div>+ begin</div><div>+ 2dup</div><div>+ ></div><div>+ while</div><div>+ r> -rot</div>
<div>+ 1+</div><div>+ repeat</div><div>+</div><div>+ drop</div><div>+</div><div>+ true</div><div>+ ;</div><div>+</div><div>+: begin-locals ( addr0 .. addrN count hasLocals -- )</div><div>+ not if drop exit then</div>
<div>+</div><div>+ dup 0> if</div><div>+ 0 do</div><div>+ ['] (lit) , , ['] ! ,</div><div>+ loop</div><div>+ else drop then</div><div>+</div><div>+ s" get-order" $find drop execute</div>
<div>+ locals_wordlist @</div><div>+ swap 1+</div><div>+ s" set-order" $find drop execute</div><div>+ ;</div><div>+</div><div>+: end-locals ( -- )</div><div>+ locals_wordlist @ 0= if exit then</div><div>+</div>
<div>+ 0 locals_wordlist !</div><div>+</div><div>+ s" get-order" $find drop execute</div><div>+ swap drop 1-</div><div>+ s" set-order" $find drop execute</div><div>+ ;</div><div>+</div><div>+: -> parse-word $find drop na1+</div>
<div>+ ['] (lit) , , ['] ! ,</div><div>+ ; immediate</div><div>+</div><div>+\ </div><div>+\ 7.3.9.1 Defining words</div><div>+\ </div><div>+</div><div> : :</div><div>- parse-word header</div><div>- 1 , ]</div>
<div>
+ parse-word >r >r</div><div>+ read-locals</div><div>+ r> r> header</div><div>+ 1 ,</div><div>+ begin-locals</div><div>+ ]</div><div> ;</div><div> </div><div> : :noname </div><div>@@ -1426,6 +1551,7 @@</div>
<div> ;</div><div> </div><div> : ;</div><div>+ end-locals</div><div> ['] (semis) , reveal ['] [ execute</div><div> ; immediate</div>