( Welcome to the FREELY-DISTRIBUTABLE version of $lib/ansi! ) ( Many thanks to Kazira, the author--according to Leeuw, that is--of the original $lib/ansi, for providing public information on the function headers. Otherwise, I would not have been able to code this thing in a backwards-compatible manner. Backwards-compatibility is our friend. :> --Cassie ) ( List of things to do-- - ALLOW USER-SPECIFIABLE BACKGROUND COLOURS. - Modes for archaic DECterms-- talk to DECwolf? - ANSI music. - Higher characters..smiley faces, etc. - Eliminate the "loop until total count minus one..then check the last one" bit in ansify_string. - Experiment with simply SUBSTing out ~&Rs and ~&Cs in the beginning to speed up ansify_string? - Documentation on public functions. ) ( -- ) (This lib to be set Wizard, Setuid, Harduid and Link_Ok) ( -- ) ( -- ) ( Setup instructions are as follows: @program lib-ansi-free.muf q @set lib-ansi-free.muf=W Then, simply take this file and actually COPY IT OVER the file on the server named /fb5.xx/game/muf/.m .....you cannot simply paste it in from TinyFugue. Sorry. Following that, to set up the library, link an action to the program and run #setup.. the suggested/STANDARD name is "ansi" on #0. Then @edit and compile the program! :> For example, if the MUCK is in /muck, $lib/ansi is #72 and you use FB 5.46, the file will be copied over /muck/fb5.46/game/muf/72.m Enjoy!!! --Caspian ) $def EnableClear 0 ( Should we allow ~&C?) $def EscapeSequence "" $def EscapeSequencePlusBracket "[" $define ResetSequence EscapeSequence "[2J" strcat $enddef $define TF_ResetSequence EscapeSequence "[37;40;0m" strcat $enddef $def Version 138 $define line "---------------------------------------" $enddef $define line2 "=======================================" $enddef $define programname "Lib-ANSI-free" $enddef $define description "A freely-distributable ANSI library!" $enddef $define datemade "02/21/98" $enddef $define email "caspian@iag.net" $enddef $define mailbar line line strcat 78 email strlen 7 + - strcut pop "| " strcat email strcat " |" line dup strlen 3 - strcut swap pop strcat strcat .tell $enddef $define header " " .tell line line strcat .tell command @ 1 strcut swap toupper swap strcat " -- " strcat programname strcat " v" strcat version intostr 1 strcut "." swap strcat strcat "A" strcat " (" datemade strcat ")" strcat strcat strcat ": " strcat description strcat 80 strcut strcat .tell line2 line2 strcat .tell $enddef : stringsfx (s s2 -- i) ( Returns 1 if string s2 is a suffix of string s. If s2 is NOT a suffix of s, then it returns 0. Case insensitive. --Caspian L. Foxworth ) "*" swap strcat smatch ; : centertell dup strlen 80 swap - 2 / " " swap strcut pop swap strcat me @ swap \notify ; ( -- ) ( --USER DEFINES--------------------------------------------------------- ) $def EmulProp "_prefs/emulation" ( "ansi" if on, space if off.. ) ( naturally, anything else is off ) ( ----------------------------------------------------------------------- ) ( -- ) ( --ATTRIBUTES----------------------------------------------------------- ) $def At_AllColorsOff "0" $def At_Bold "1" $def At_Blinking "5" $def At_Reverse "7" $def At_Hidden "8" ( --- ) $def User_AllColorsOff "0" $def User_Bold "1" $def User_Reverse "2" $def User_Blinking "5" $def User_RealReverse "7" $def User_Hidden "8" ( ----------------------------------------------------------------------- ) ( --COLORS--------------------------------------------------------------- ) $def User_Black "0" $def User_Red "1" $def User_Green "2" $def User_Yellow "3" $def User_Blue "4" $def User_Magenta "5" $def User_Cyan "6" $def User_LightGrey "7" ( ----------------------------------------------------------------------- ) $define TestPhrase "The ~&053quick~&r ~&043brown~&c~&r ~&063fox~&r ~&073jumped~&c~&r " "~&083over~&r ~&093the~&c~&r ~&036lazy~&r ~&038sleeping~&r " strcat "~&035dog~&r~&049.~&r" strcat $enddef $def MagicMask "[0-9][0-7][0-7]*" $def MagicMask-NumsOnly "[0-9][0-7][0-7]" $def MagicMask-Lite "[0-9]*" $define EndColor ( User_AllColorsOff) User_Bold User_LightGrey strcat User_Black strcat $enddef $def EndColor-Processed-old "" lvar custom-endcolor-string $def EndColor-Processed EndcolorPhrase @ $def ClearColor-Processed "" $def EndColor-Processed-Plus-Escape " $def Bell-Processed "" lvar EndcolorPhrase (lvar UserToReal_S) ( s ) lvar reversed? : UserToReal ( s -- s' ; converts user number triplets to ANSI codes ) 0 reversed? ! 1 \strcut swap dup User_AllColorsOff strcmp not if pop "0" else dup User_Bold strcmp not if pop "0;1" else dup User_Reverse strcmp not if 1 reversed? ! pop "0;1;7" else dup User_RealReverse strcmp not if 1 reversed? ! pop "0;7" else dup User_Blinking strcmp not if pop "0;5" else dup User_Hidden strcmp not if 1 reversed? ! pop "0;8" else pop "0" then then then then then then swap 1 \strcut reversed? @ if swap then ";4" swap strcat strcat ";3" swap strcat strcat "m" strcat ; : ansi-value ( s -- s ; turns stuff like "blue" or "lightgreen" into ) ( colour values like "04" and "12". ) dup "BLACK" stringcmp 0 = if "0" else dup "RED" stringcmp 0 = if "1" else dup "GREEN" stringcmp 0 = if "2" else dup "YELLOW" stringcmp 0 = if "3" else dup "BLUE" stringcmp 0 = if "4" else dup "MAGENTA" stringcmp 0 = if "5" else dup "CYAN" stringcmp 0 = if "6" else dup "LIGHTGREY" stringcmp 0 = over "LIGHTGRAY" stringcmp 0 = or if "7" else dup "DARKGREY" stringcmp 0 = over "DARKGRAY" stringcmp 0 = or if "10" else dup "LIGHTRED" stringcmp 0 = if "11" else dup "LIGHTGREEN" stringcmp 0 = if "12" else dup "LIGHTYELLOW" stringcmp 0 = if "13" else dup "LIGHTBLUE" stringcmp 0 = if "14" else dup "LIGHTMAGENTA" stringcmp 0 = if "15" else dup "LIGHTCYAN" stringcmp 0 = if "16" else dup "DARK" stringcmp 0 = if "17" else "" then then then then then then then then then then then then then then then then swap pop ; lvar clo lvar ColorCodeString : ansi-version ( -- i ; returns version number as 3-digit integer ) Version ; : ansi? ( d -- i ; checks the EmulProp-- _prefs/emulation by default-- and ) ( returns 1 if it's set to "ansi", 0 if not. ) EmulProp getpropstr "ansi" stringcmp 0 = if 1 else 0 then ; : ansidebug? ( d -- i ; checks the debug prop-- and ) ( returns 1 if it's set to "ansi", 0 if not. ) "_prefs/ansidebug?" getpropstr "yes" stringcmp 0 = if 1 else 0 then ; : SetEndColorPhrase ( Sets EndColorPhrase. ) me @ "/_prefs/ansi/default" getpropstr dup if UserToReal EscapeSequencePlusBracket swap strcat else pop "" then dup not if pop "" then EndColorPhrase ! ( DEBUG ) me @ ansidebug? if me @ ">> EndColorPhrase set to " EndColorPhrase @ 1 strcut swap pop "^[" swap strcat strcat \notify then ( DEBUG ) ( Done setting EndColorPhrase. ) ; lvar localECP : ReturnEndColorPhrase ( d -- s ; returns an EndColorPhrase for a dbref ) "/_prefs/ansi/default" getpropstr dup if UserToReal EscapeSequencePlusBracket swap strcat else pop "" then dup not if pop "" then localECP ! ( DEBUG ) me @ ansidebug? if me @ ">> localECP set to " localECP @ 1 strcut swap pop "^[" swap strcat strcat \notify then ( DEBUG ) localECP @ ; lvar PlayerTelling ( d ) lvar NotifyLoopyCounter ( counter used in the loop ) lvar FinalStringie ( a string..final output string ) : ansify_string ( s -- s ; changes ANSI pseudocode to real ANSI code ) ( DEBUG ) SetEndColorPhrase me @ ansidebug? if me @ ">> Ansifying: \"" 3 pick strcat "\"" strcat \notify then ( DEBUG ) ( Dynamically rewrites and preprocesses code for speed ) dup "~&" instr 0 = if EndColor-Processed strcat exit then Bell-Processed "~&B" subst Bell-Processed "~&b" subst EnableClear 1 = if ClearColor-Processed "~&C" subst ClearColor-Processed "~&c" subst else "" "~&C" subst "" "~&c" subst then ( bell ) "~&070" "~&R" subst "~&070" "~&r" subst "~&" "~&070~&" subst (EndColor-Processed) EndColorPhrase @ "~&070" subst ( Dynamically rewrites code for speed ) "~&" explode 1 - NotifyLoopyCounter ! FinalStringie ! begin NotifyLoopyCounter @ (0 >) while 3 \strcut swap UserToReal swap strcat FinalStringie @ EscapeSequencePlusBracket strcat swap strcat FinalStringie ! NotifyLoopyCounter @ 1 - NotifyLoopyCounter ! repeat FinalStringie @ dup striptail EndColor-Processed stringsfx not if endcolor-processed strcat then (EndColor-Processed EndColor-Processed-old subst) ; lvar unstripcounter lvar outputstring : ansi-strip ( s -- s ; strips the string of all ANSI codes. ) "" outputstring ! dup EscapeSequence instr 0 = over "~&" instr 0 > and not if exit then "~&" explode 1 - unstripcounter ! outputstring @ swap strcat outputstring ! begin dup "r" stringpfx over "c" stringpfx 3 pick "b" stringpfx or or if 1 \strcut swap pop else 3 \strcut swap pop then outputstring @ swap strcat outputstring ! unstripcounter @ 1 - unstripcounter ! unstripcounter @ 0 = until outputstring @ ; : ansi-strlen ( s -- i ; returns the string length of s, minus the ) ( length of any ANSI codes it might contain. ) ansi-strip \strlen ; : ansi-notify ( d s -- ; ansi equivalent of 'notify' prim ) over ansi? if dup EscapeSequence instr 0 = over "~&" instr 0 > and if ansify_string then else ansi-strip then \notify ; : ansi_notify ansi-notify ; : ZomAndOwnerHere? ( d -- d i ; returns the original dbref AND an int.. 1 if a zombie and the owner's there.. otherwise 0 ) dup ( "Z" flag? not over ) player? ( or ) if 0 exit then dup location over owner location dbcmp ; lvar magic_stringie lvar magic_stringie_ansified lvar magic_stringie_stripped lvar my-reffie ( The dbref of the character/item yer dealing with ) lvar my-matched ( What program are we calling? ) lvar orig-trigger ( Original trigger ) lvar orig-command ( Original command ) lvar orig-depth ( Original depth ) lvar magicalstringie ( Holds the name of the current prop. ) : listen-evaluator ( d -- d ; evaluates the listen on D..returns the D. ) trigger @ orig-trigger ! ( Puts this away for later. ) command @ orig-command ! ( Puts this away for later. ) depth orig-depth ! ( Puts this away for later. ) magicalstringie @ dup atoi 0 > if atoi dbref ( It's a string int ) else dup dbref? if 1 pop ( It's of type dbref ) else match ( it's a string ) then then my-matched ! my-matched @ ok? if my-matched @ program? if my-matched @ "L" flag? my-matched @ owner me @ dbcmp 1 = or if ( If it's L or I own it.. ) fork 0 = if my-reffie @ trigger ! "(_Listen)" command ! ( DEBUG ) me @ ansidebug? if me @ ">> VAR trigger set to: #" trigger @ intostr strcat \notify me @ ">> VAR command set to: \"" command @ strcat "\"" strcat \notify then ( DEBUG ) my-reffie @ ansi? if magic_stringie_ansified @ my-reffie @ ReturnEndColorPhrase "<<<||ENDCOLORPHRASE||>>>" subst else magic_stringie_stripped @ then ( s ) my-matched @ ( d ) call ( Then call it.. ) pid kill then orig-trigger @ trigger ! ( Resets back to normal. ) orig-command @ command ! ( Resets back to normal. ) depth orig-depth @ > if begin pop depth orig-depth @ = depth 1 - orig-depth @ < or until then ( Depth is now restored to previous level. ) then then then ( Markah ) ; : listen-evaluator-caller dup my-reffie ! my-reffie @ "_listen" getpropstr magicalstringie ! listen-evaluator my-reffie @ "_listen/" nextprop begin dup "_listen/" stringpfx 1 = not if pop exit then magicalstringie ! listen-evaluator my-reffie @ magicalstringie @ nextprop repeat ; lvar except_ME_string lvar the_room lvar magic_counter : ansi-notify-exclude ( d dn ... d1 n s -- ; notify-exclude with ANSI ) "<<<||ENDCOLORPHRASE||>>>" EndColorPhrase ! "|" except_ME_string ! magic_stringie ! magic_counter ! begin magic_counter @ 0 > while intostr except_ME_string @ strcat "|" swap strcat except_ME_string ! magic_counter @ 1 - magic_counter ! repeat the_room ! magic_stringie @ ansify_string magic_stringie_ansified ! magic_stringie @ ansi-strip magic_stringie_stripped ! the_room @ magic_stringie_stripped @ ( stripped ANSI, just to be sure..cuz the room prolly can't handle ANSI ) \notify ( --------------------------------- ) the_room @ contents begin dup ok? while dup intostr "|" swap strcat "|" strcat except_ME_string @ swap instr 0 = if ZomAndOwnerHere? not if dup ansi? if dup magic_stringie_ansified @ over ReturnEndColorPhrase "<<<||ENDCOLORPHRASE||>>>" subst \notify ( DEBUG ) me @ ansidebug? if me @ ">> ANSI-NOTIFYING:" 3 pick unparseobj strcat \notify then ( DEBUG ) else dup magic_stringie_stripped @ \notify ( DEBUG ) me @ ansidebug? if me @ ">> STRIPPED-NOTIFYING:" 3 pick unparseobj strcat \notify then ( DEBUG ) then else ( Else if zombie AND the owner is here.. ) ( PATCH TO ALLOW _LISTENS TO WORK PROPERLY ON ZOMBIES IN THE ROOM WITH THEIR OWNERS ) dup "_listen" getpropstr if ( DEBUG ) me @ ansidebug? if me @ ">> Calling listen-evaluator-caller for " 3 pick unparseobj strcat "..." strcat \notify then ( DEBUG ) listen-evaluator-caller then ( END PATCH ) then else then next repeat pop ; : ansi-notify-except ( d d s -- ; like notify_except, but with ANSI. ) 1 swap ansi-notify-exclude ; : ansi-otell ( s -- ; like .otell ) me @ location me @ rot ansi-notify-except ; : ansi-connotify ( i s -- ; like connotify, but with ANSI support. ) ansify_string \connotify ; ( LOTTD: Try to make this routine do an explode, and work from there? i.e. process one chunk at a time...? ) lvar numtocut lvar strcut_s1 lvar strcut_s2 lvar numcutsofar : ansi-strcut ( s i -- s1 s2 ; like strcut, but ignores ANSI codes. ) numtocut ! dup "~&" instr 0 = if numtocut @ \strcut exit then 0 numcutsofar ! "" strcut_s1 ! numtocut @ 0 = if "" swap exit then numtocut @ over "~&" instr > not if numtocut @ \strcut exit then strcut_s2 ! begin strcut_s2 @ dup "~&" instr 0 = if dup strlen numcutsofar @ + numtocut @ > if ( I see enuff slicables! ) numtocut @ numcutsofar @ - \strcut swap numtocut @ numcutsofar ! strcut_s1 @ swap strcat strcut_s1 ! strcut_s2 ! else numtocut @ numcutsofar ! strcut_s1 @ swap strcat strcut_s1 ! "" strcut_s2 ! then else dup "~&" instr 1 = if dup "~&R" stringpfx over "~&C" stringpfx or if 3 else 5 then \strcut swap strcut_s1 @ swap strcat strcut_s1 ! strcut_s2 ! else dup "~&" instr 1 - dup numcutsofar @ + numtocut @ < if ( If I dun see enuff cuttable chars to satisfy my base desire..mrowr! ) ( Top of stack here contains how many cuttable chars I can get. ) numcutsofar @ over + numcutsofar ! \strcut swap strcut_s1 @ swap strcat strcut_s1 ! strcut_s2 ! else ( Else..if you have a long stretch of cuttable chars.. ) pop numtocut @ numcutsofar @ - \strcut swap numtocut @ numcutsofar ! strcut_s1 @ swap strcat strcut_s1 ! strcut_s2 ! then then then strcut_s2 @ not numcutsofar @ numtocut @ = or until strcut_s1 @ strcut_s2 @ ; : ansi-tell ( s -- ; like .tell, but with ANSI support ) me @ swap ansi-notify ; : off-routine me @ EmulProp "" setprop \version "NeonMuck" instr 0 > \version "GlowMuck" instr 0 > or if me @ "!C" set then me @ ">> ANSI colors now turned off." \notify ; : on-routine me @ me @ EmulProp "ansi" setprop \version "NeonMuck" instr 0 > \version "GlowMuck" instr 0 > or if me @ "C" set then ">> ANSI ~&110c~&120o~&130l~&140o~&150r~&160s~&R colors now turned ~&510ON~&R!" ansi-notify ; : ansi-codecheck "[0-9][0-7][0-7]" smatch ; : help3-routine header ": ansi? ( d -- i ; checks the EmulProp-- _prefs/emulation by default-- and )" .tell " ( returns 1 if it's set to \"ansi\", 0 if not. )" .tell ": ansi-codecheck (checks a string to see if it's a valid 3-number ANSI code)" .tell ": ansi-connotify ( i s -- ; like connotify, but with ANSI support. )" .tell ": ansify_string ( s -- s ; changes ANSI pseudocode to real ANSI code )" .tell " ( this is what actually outputs escaped ANSI code! )" .tell ": ansi-strip ( s -- s ; strips the string of all ANSI codes. )" .tell ": ansi-strlen ( s -- i ; returns the string length of s, minus the )" .tell " ( length of any ANSI codes it might contain. )" .tell ": ansi-notify ( d s -- ; ansi equivalent of 'notify' prim )" .tell ": ansi_notify ( same as ansi-notify )" .tell ": ansi-notify-except ( d d s -- ; like notify_except, but with ANSI. )" .tell ": ansi-notify-exclude ( d dn ... d1 n s -- ; notify-exclude with ANSI )" .tell ": ansi-otell ( s -- ; like .otell, but with ANSI support. )" .tell ": ansi-strcut ( s i -- s1 s2 ; like strcut, but ignores ANSI codes. )" .tell ": ansi-tell ( s -- ; like .tell, but with ANSI support )" .tell ": ansi-value ( s -- s ; turns stuff like \"blue\" or \"lightgreen\" into )" .tell " ( colour values like \"04\" and \"12\". )" .tell ": ansi-version ( -- i ; returns version number as 3-digit integer )" .tell mailbar " " .tell ; : help2-routine header "ANSI codes can be embedded in text for various programs--read the #help " "for any given program to read if it supports ANSI. Codes you can use:" strcat .tell " " .tell "~& -- Sets the ttribute, oreground colour and ackground" me @ swap \notify " colours. See the lists below!" .tell EnableClear 1 = if "~&R -- RESET (same as ~&070.) " 39 strcut pop "~&C -- CLEAR (on some terminals) " strcat 78 strcut pop me @ swap \notify "~&B -- BELL (a.k.a. beep)" me @ swap \notify else "~&R -- RESET (same as ~&070.) " 39 strcut pop "~&B -- BELL (a.k.a. beep)" strcat me @ swap \notify then " " .tell "ATTRIBUTES COLORS (shown w' bold attribute)" .tell "---------- ------" .tell "0 = Normal 0 = ~&007Black" ansi-tell "1 = ~&170BOLD~&R 1 = ~&110Red" ansi-tell "2 = ~&270Old Reverse~&R (SCREWY!) 2 = ~&120Green" ansi-tell "5 = ~&570Blinking~&R 3 = ~&130Yellow" ansi-tell "7 = \"Hidden\" test--> (~&770test~&R) 4 = ~&140Blue" ansi-tell "8 = ~&870Real Reverse~&R (use ME!) 5 = ~&150Magenta" ansi-tell " 6 = ~&160Cyan" ansi-tell " 7 = ~&170White" ansi-tell " EXAMPLE: This word is ~&110RED~&R! --> " me @ ansi? if "This word is ~&110RED~&R!" ansify_string else "This word is RED!" then strcat me @ swap \notify mailbar ; : help-routine header command @ " on " strcat " -- Turns on ANSI colour for this character." strcat .tell command @ " off " strcat " -- Turns off ANSI colour for this character." strcat .tell command @ " #help " strcat " -- Yer looking at it. :)" strcat .tell command @ " #help2" strcat " -- Describes the colour codes." strcat .tell command @ " #help3" strcat " -- Describes public routines in the ANSI lib." strcat .tell " " .tell "Properties:" .tell "_prefs/ansi/default: -- What colour ~&R returns your text to." me @ swap \notify " Defaults to lt. grey on black. Text ALWAYS" me @ swap \notify " returns to the default at ends of lines." me @ swap \notify mailbar " " .tell ; : forcer me @ swap force ; : forcer2 me @ swap prog intostr "#" swap strcat "$lib/ansi" subst prog intostr "#" swap strcat "lib-ansi-free.muf" subst force ; : setup-routine "@set lib-ansi-free.muf=S" forcer2 "@set lib-ansi-free.muf=H" forcer2 "@set lib-ansi-free.muf=L" forcer2 "@reg #prop #0:_reg/lib lib-ansi-free.muf=ansi" forcer2 "@set $lib/ansi=_defs/ansi?:\"$lib/ansi\" match \"ansi?\" call" forcer "@set $lib/ansi=_defs/ansi_connotify:\"$lib/ansi\" match \"ansi-connotify\" call" forcer "@set $lib/ansi=_defs/ansi-connotify:\"$lib/ansi\" match \"ansi-connotify\" call" forcer "@set $lib/ansi=_defs/ansi_notify:\"$lib/ansi\" match \"ansi-notify\" call" forcer "@set $lib/ansi=_defs/ansi-notify:\"$lib/ansi\" match \"ansi-notify\" call" forcer "@set $lib/ansi=_defs/ansi_notify-except:\"$lib/ansi\" match \"ansi-notify-except\" call" forcer "@set $lib/ansi=_defs/ansi-notify-except:\"$lib/ansi\" match \"ansi-notify-except\" call" forcer "@set $lib/ansi=_defs/ansi_notify-exclude:\"$lib/ansi\" match \"ansi-notify-exclude\" call" forcer "@set $lib/ansi=_defs/ansi-notify-exclude:\"$lib/ansi\" match \"ansi-notify-exclude\" call" forcer "@set $lib/ansi=_defs/ansi_otell:\"$lib/ansi\" match \"ansi-otell\" call" forcer "@set $lib/ansi=_defs/ansi-otell:\"$lib/ansi\" match \"ansi-otell\" call" forcer "@set $lib/ansi=_defs/ansi_strcut:\"$lib/ansi\" match \"ansi-strcut\" call" forcer "@set $lib/ansi=_defs/ansi-strcut:\"$lib/ansi\" match \"ansi-strcut\" call" forcer "@set $lib/ansi=_defs/ansi_strip:\"$lib/ansi\" match \"ansi-strip\" call" forcer "@set $lib/ansi=_defs/ansi-strip:\"$lib/ansi\" match \"ansi-strip\" call" forcer "@set $lib/ansi=_defs/ansi_strlen:\"$lib/ansi\" match \"ansi-strlen\" call" forcer "@set $lib/ansi=_defs/ansi-strlen:\"$lib/ansi\" match \"ansi-strlen\" call" forcer "@set $lib/ansi=_defs/ansi_tell:\"$lib/ansi\" match \"ansi-tell\" call" forcer "@set $lib/ansi=_defs/ansi-tell:\"$lib/ansi\" match \"ansi-tell\" call" forcer "@set $lib/ansi=_defs/ansi_value:\"$lib/ansi\" match \"ansi-value\" call" forcer "@set $lib/ansi=_defs/ansi-value:\"$lib/ansi\" match \"ansi-value\" call" forcer "@set $lib/ansi=_defs/ansi_version:\"$lib/ansi\" match \"ansi-version\" call" forcer "@set $lib/ansi=_defs/ansi-version:\"$lib/ansi\" match \"ansi-version\" call" forcer "@set $lib/ansi=_defs/ansi_codecheck:\"$lib/ansi\" match \"ansi-codecheck\" call" forcer "@set $lib/ansi=_defs/ansi-codecheck:\"$lib/ansi\" match \"ansi-codecheck\" call" forcer "@set $lib/ansi=_defs/ansify_string:\"$lib/ansi\" match \"ansify_string\" call" forcer "@set $lib/ansi=_defs/ansify-string:\"$lib/ansi\" match \"ansify_string\" call" forcer ; lvar dumbstring lvar testholder : main clo ! clo @ "off" stringpfx 1 = clo @ "#off" stringpfx 1 = or if off-routine exit then clo @ "on" stringpfx 1 = clo @ "#on" stringpfx 1 = or if on-routine exit then clo @ "#h3" stringpfx 1 = clo @ "#help3" stringpfx 1 = or if help3-routine exit then clo @ "#h2" stringpfx 1 = clo @ "#help2" stringpfx 1 = or if help2-routine exit then clo @ "#h" stringpfx 1 = if help-routine exit then clo @ "#setup" stringpfx 1 = me @ "W" flag? and if setup-routine exit then ">> Try " command @ strcat " #help for help." strcat .tell ; PUBLIC ansi-notify PUBLIC ansi-version PUBLIC ansi-value PUBLIC ansi? PUBLIC ansi-connotify PUBLIC ansi-notify-except PUBLIC ansi-notify-exclude PUBLIC ansi-tell PUBLIC ansi-otell PUBLIC ansi-strip PUBLIC ansi-strlen PUBLIC ansi-strcut PUBLIC ansify_string PUBLIC ansi-codecheck PUBLIC ansi_notify 816 lines displayed.