1024 constant MOTD_BUFFER_SIZE create motdbuffer MOTD_BUFFER_SIZE allot variable motd-length : (update) ( str -- ) MOTD_BUFFER_SIZE min dup motd-length ! motdbuffer swap move ; : motd-clear ( -- ) motdbuffer MOTD_BUFFER_SIZE bl fill 0 motd-length ! ; : motd-append ( str -- ) MOTD_BUFFER_SIZE motd-length @ - min motdbuffer motd-length @ + swap dup motd-length +! move ; : motd@ ( -- str ) motdbuffer motd-length @ ; : motd-propagate ( -- ) 0 EVENT_MOTD_CHANGED events.enqueue ; : .motd ( -- ) motd@ cr type ; : (strallot) ( str -- ) here swap dup allot move ; : (append-banner) ( start-addr size-u -- start-addr size-u ) BEGIN 10 parse 2dup s" end-motd-banner" search nip nip IF 2drop EXIT THEN dup 0<> IF dup -rot (strallot) + 10 c, 1+ ELSE 2drop REFILL invert IF EXIT THEN THEN AGAIN ; : motd-banner ( "name" -- ) create here 0 , 0 (append-banner) swap ! ; : end-motd-banner ( -- ) true abort" run motd-banner first." ; : motd-banner@ ( addr -- str ) dup cell + swap @ ; : motd-compose ( message-str banner-str -- ) motd-clear ( banner-str ) motd-append s\" \n" motd-append ( message-str ) motd-append s\" \n" motd-append ; motd-banner motd-forth1 ________ ___ _______ _________ ____ ____ |_ __ | .' `.|_ __ \ | _ _ ||_ || _| | |_ \_|/ .-. \ | |__) ||_/ | | \_| | |__| | | _| | | | | | __ / | | | __ | _| |_ \ `-' /_| | \ \_ _| |_ _| | | |_ |_____| `.___.'|____| |___||_____| |____||____| end-motd-banner motd-banner motd-forth2 _______ _____ ______ _______ _ _ |______ | | |_____/ | |_____| | |_____| | \_ | | | end-motd-banner motd-banner motd-forth3 _/_/_/_/ _/_/ _/_/_/ _/_/_/_/_/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/_/_/ _/ _/ _/_/_/ _/ _/_/_/_/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/_/ _/ _/ _/ _/ _/ end-motd-banner : motd-current-banner ( -- str ) motd-forth3 motd-banner@ ; s" Lorem ipsum magnam quae aperiam maiores dolor quis ut." motd-current-banner motd-compose