afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas SoomeS" FICL_WANT_LOCALS" ENVIRONMENT? drop [if]
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ ** ficl/softwords/jhlocal.fr
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ ** stack comment style local syntax...
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ { a b c | cleared -- d e }
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ variables before the "|" are initialized in reverse order
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ from the stack. Those after the "|" are zero initialized.
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ Anything between "--" and "}" is treated as comment
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ Uses locals...
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ locstate: 0 = looking for | or -- or }}
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ 1 = found |
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ 2 = found --
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ 3 = found }
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ 4 = end of line
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ revised 2 June 2000 - { | a -- } now works correctly
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome.( loading Johns-Hopkins locals ) cr
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomehide
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ What does this do? It's equivalent to "postpone 0", but faster.
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ "ficlInstruction0" is the FICL instruction for "push a 0 on the data stack".
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ --lch
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome: compiled-zero ficlInstruction0 , ;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas SoomeS" FICL_WANT_FLOAT" ENVIRONMENT? drop [if]
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ And this is the instruction for a floating-point 0 (0.0e).
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome: compiled-float-zero ficlInstructionF0 , ;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome[endif]
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome: ?-- ( c-addr u -- c-addr u flag )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome 2dup s" --" compare 0= ;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome: ?} ( c-addr u -- c-addr u flag )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome 2dup s" }" compare 0= ;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome: ?| ( c-addr u -- c-addr u flag )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome 2dup s" |" compare 0= ;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome1 constant local-is-double
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome2 constant local-is-float
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ parse-local-prefix-flags
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ Parses single-letter prefix flags from the name of a local, and returns
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ a bitfield of all flags (local-is-float | local-is-double) appropriate
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ for the local. Adjusts the "c-addr u" of the name to remove any prefix.
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ Handled single-letter prefix flags:
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ 1 single-cell
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ 2 double-cell
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ d double-cell
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ f floating-point (use floating stack)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ i integer (use data stack)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ s single-cell
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ Specify as many as you like; later flags have precidence.
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ Thus, "f2:foo" and "2is2f:foo" are both double-cell floats.
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ If you don't specify anything after the colon, like "f2:",
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ there is no legal prefix, so "2f:" becomes the name of the
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ (single-cell data stack) local.
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ For convention, the "f" is preferred first.
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome: parse-local-prefix-flags ( c-addr u -- c-addr u flags )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome 0 0 0 locals| stop-loop colon-offset flags u c-addr |
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome \ if the first character is a colon, remove the colon and return 0.
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome c-addr c@ [char] : =
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome over over 0 exit
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome u 0 do
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome c-addr i + c@
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome case
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome [char] 1 of flags local-is-double invert and to flags endof
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome [char] 2 of flags local-is-double or to flags endof
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome [char] d of flags local-is-double or to flags endof
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome [char] f of flags local-is-float or to flags endof
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome [char] i of flags local-is-float invert and to flags endof
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome [char] s of flags local-is-double invert and to flags endof
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome [char] : of i 1+ to colon-offset 1 to stop-loop endof
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome 1 to stop-loop
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome endcase
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome stop-loop if leave endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome loop
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome colon-offset 0=
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome colon-offset u =
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome or
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ ." Returning variable name -- " c-addr u type ." -- No flags." cr
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome c-addr u 0 exit
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome c-addr colon-offset +
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome u colon-offset -
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome\ ." Returning variable name -- " 2dup type ." -- Flags: " flags . cr
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome flags
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome: ?delim ( c-addr u -- state | c-addr u 0 )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ?| if 2drop 1 exit endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ?-- if 2drop 2 exit endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ?} if 2drop 3 exit endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome dup 0=
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome if 2drop 4 exit endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome 0
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome;
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomeset-current
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas SoomeS" FICL_WANT_FLOAT" ENVIRONMENT? drop [if]
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome: {
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome 0 0 0 locals| flags local-state nLocals |
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome \ stack locals until we hit a delimiter
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome begin
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome parse-word ?delim dup to local-state
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome 0= while
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome nLocals 1+ to nLocals
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome repeat
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome \ now unstack the locals
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome nLocals 0 ?do
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome parse-local-prefix-flags to flags
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome flags local-is-double and if
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome flags local-is-float and if (f2local) else (2local) endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome else
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome flags local-is-float and if (flocal) else (local) endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome loop \ ( )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome \ zero locals until -- or }
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome local-state 1 = if
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome begin
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome parse-word
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ?delim dup to local-state
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome 0= while
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome parse-local-prefix-flags to flags
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome flags local-is-double and if
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome flags local-is-float and if
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome compiled-float-zero compiled-float-zero (f2local)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome else
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome compiled-zero compiled-zero (2local)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome else
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome flags local-is-float and if
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome compiled-float-zero (flocal)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome else
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome compiled-zero (local)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome repeat
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome 0 0 (local)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome \ toss words until }
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome \ (explicitly allow | and -- in the comment)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome local-state 2 = if
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome begin
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome parse-word
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ?delim dup to local-state
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome 3 < while
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome local-state 0= if 2drop endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome repeat
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome local-state 3 <> abort" syntax error in { } local line"
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome; immediate compile-only
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome[else]
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome: {
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome 0 0 0 locals| flags local-state nLocals |
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome \ stack locals until we hit a delimiter
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome begin
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome parse-word ?delim dup to local-state
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome 0= while
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome nLocals 1+ to nLocals
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome repeat
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome \ now unstack the locals
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome nLocals 0 ?do
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome parse-local-prefix-flags to flags
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome flags local-is-double and if
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome (2local)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome else
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome (local)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome loop \ ( )
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome \ zero locals until -- or }
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome local-state 1 = if
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome begin
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome parse-word
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ?delim dup to local-state
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome 0= while
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome parse-local-prefix-flags to flags
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome flags local-is-double and if
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome compiled-zero compiled-zero (2local)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome else
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome compiled-zero (local)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome repeat
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome 0 0 (local)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome \ toss words until }
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome \ (explicitly allow | and -- in the comment)
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome local-state 2 = if
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome begin
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome parse-word
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome ?delim dup to local-state
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome 3 < while
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome local-state 0= if 2drop endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome repeat
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome endif
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome local-state 3 <> abort" syntax error in { } local line"
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome; immediate compile-only
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome[endif]
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soomeprevious
afc2ba1deb75b323afde536f2dd18bcafdaa308dToomas Soome[endif]