> ; "PRINT's magic finite-state machine for atoms" ; "# states, not counting terminals" > ; "No initial \ needed" > ; "Initial \ needed" > ; "Initial \ needed, done otherwise" ; "Slot in state for end of string" (M$$TYPE-INFO!-INTERNAL) ]>> > > FULL-OBL) (BLOCK)>) (OOBLIST .OBLIST) (GROUP-INDICATOR DEFINE) (IOTUP ) IOB MACRO-NAME FUNC TEMP GOODS THIS-FORM) #DECL ((STR) STRING (POS) (OUTCHAN) > (NAM OBL GROUP-INDICATOR) ATOM (GOODS) LIST (THIS-FORM) FORM) >> )> > )> > FORM> > 1> > > >>> VALUE '<2 .THIS-FORM>>> ATOM>> >) (ELSE FUNCTION> .TEM> ) ( > FUNCTION>> <1 .TEM>> ) ( > <2 .TEM>> WORD> .IOTUP> > <2 .TEM>>) (BUF )) #DECL ((SIZ) FIX) ) (ELSE 4> > <2 .TEM> -1>> > <2 .TEM>> ) (ELSE )>)> >>) (ELSE WORD> .IOTUP> .IOTUP>)> >> >)>" .IOTUP> )>) (ELSE
>> )>)>) (T > .IOTUP> ) (T .IOTUP> )>)> >> >> 0> >)> > .NAM> >>>> > ) FROB (TYOFF ) (INFO >) (PTYPE ) (CHN ) LST) #DECL ((DATA) ANY (BREAK TYP TYSAT TYOFF) FIX (CHAN) CHANNEL (INFO) TYPE-ENTRY (PTYPE) (LST) (CHN) (IOTUP) LIST STRING FIX>) > >> >>> > ) >) (<==? .PTYPE ATOM> ,CTLZ-PRINT> .IOTUP>)> .IOTUP>) (<==? .PTYPE FIX> ) (<==? .PTYPE FLOAT> ) (<==? .PTYPE STRING> <==? .CHR ,BACK-SLASH>> )> > > ) (<==? .PTYPE BYTES> )) #DECL ((BP) BYTES) >> .IOTUP>)>> > ) (<==? .PTYPE CHARACTER> *177*> 0>> .IOTUP> ) (ELSE )>) (<==? .PTYPE ADECL> > .IOTUP> > .IOTUP>) ( <==? .PTYPE SEGMENT>> <==? > 2> >> LVAL> > > >>> )> > .IOTUP>) ( > > >> )) #DECL ((LP) LIST) >> .IOTUP>)>> > .IOTUP>) (ELSE )>) (<==? .PTYPE OFFSET> > .IOTUP> >> ATOM> .IOTUP> ) (ELSE )> >> ATOM> .IOTUP> ) (.FROB )> .IOTUP>) (<==? .PTYPE TYPE-C> .IOTUP>) (<==? .PTYPE TYPE-W> ) (<==? .PTYPE UVECTOR> )) #DECL ((NP) UVECTOR) >> .IOTUP>)>> > ) (<==? .PTYPE VECTOR> )) #DECL ((NP) VECTOR) >> .IOTUP>)>> > ) (<==? .DATA <>> " .IOTUP>) (<==? .PTYPE GVAL> .IOTUP>) (<==? .PTYPE LVAL> .IOTUP>) ( .IOTUP> ) (<==? > > ) >) (ELSE .IOTUP> .IOTUP> > .IOTUP>)>> (IOTUP) ) <- %,M$$TYOFF>>>) (ELSE >>)> >>> ) (ELSE )> .IOTUP> .IOTUP> .IOTUP> .IOTUP>) ()>> ) ) (ELSE )>> ) .IOTUP> >> .IOTUP>)>> ) FIX>> FIX>" .IOTUP>) (<==? .NUM FIX>> FIX>" .IOTUP>) (<==? .NUM -0> ) ( .IOTUP>) (<0? .NUM> ) (ELSE )>> ) > .IOTUP> >> .IOTUP>)>> ) ) (<==? .NUM ,MAXFL> ) (ELSE >>)> > > )>>) (<0? .NUM> ) ( > > )>>)> > > .IOTUP> .SIGD .IOTUP .OFFSET> ) (ELSE .IOTUP>)>) ( >)> ; "This may cause rounding to the next integer, so must do addition BEFORE calling FIX" .NUM>> > .NUM>> )> > .IOTUP> <- .SIGD .EXP> .IOTUP .OFFSET>) (ELSE > >>)> >) (T )> )>)>> ) ) (ELSE >> >>> >) (ELSE )> .DIG>> .IOTUP> >> > 0>> )>>)>> > ,CRLF-STRING!-INTERNAL>> ) (O? ) (OB )) #DECL ((CHAN) CHANNEL (ATM) ATOM (OB) (O?) (IOTUP) ) >> >>> > ) ( )>>> ) CTRANS (TR-TABLE ,I$TRANS-TABLE!-INTERNAL) TN) #DECL ((STR) STRING (TN) FIX (FSM) (CSTATE) BYTES (CTRANS) FIX (TR-TABLE) BYTES) ; "Run FSM to decide if initial backslash needed. If any character that can't be part of number is encountered, exit immediately, don't put backslash in. Other transitions out of states are E, ., 0-9, +/-, *, and end of string. This is basically ripped off from old muddle." 1>>> ,M$$R-MIN-NUM-PART> ; "Not part of number, so done." ) ( 1>>)> > ,M$$FS-NSTATE> ; "Legal state number, go to it" > <>) ( ; "Leading ., so always need backslash" >) (T ; "Thing can't be number, so leave" )>> .STR>> ,M$$FS-NOSLASH>> ; "Put in \ if hit terminal state before end of string or if current-state's end-state calls for it." .IOTUP>)>)> 1>>> <==? .CTRANS ,M$$R-BACKS>> .IOTUP>)> > .STR>> ) 1>> ,BUFLNT> : WRITE-BUFFER > )> .LNT .CHR>> ) (BUF )) #DECL ((IOTUP) (LNT) FIX (BUF) STRING) )> > ,BUFLNT> : WRITE-BUFFER .BUF> )> > >>> ) ) (ELSE ) O) #DECL ((YP) ) ) (ELSE )> >> .IOTUP>)>> .X> .IOTUP> )>> .L>> )) : WRITE-BUFFER > T>