<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>