---input---
Red [
    Title:  "Red console"
    Author: ["Nenad Rakocevic" "Kaj de Vos"]
    File:   %console.red
    Tabs:   4
    Rights: "Copyright (C) 2012-2013 Nenad Rakocevic. All rights reserved."
    License: {
        Distributed under the Boost Software License, Version 1.0.
        See https://github.com/dockimbel/Red/blob/master/BSL-License.txt
    }
    Purpose:    "Just some code for testing Pygments colorizer"
    Language:   http://www.red-lang.org/
]

#system-global [
    #either OS = 'Windows [
        #import [
            "kernel32.dll" stdcall [
                AttachConsole:   "AttachConsole" [
                    processID       [integer!]
                    return:         [integer!]
                ]
                SetConsoleTitle: "SetConsoleTitleA" [
                    title           [c-string!]
                    return:         [integer!]
                ]
                ReadConsole:     "ReadConsoleA" [
                    consoleInput    [integer!]
                    buffer          [byte-ptr!]
                    charsToRead     [integer!]
                    numberOfChars   [int-ptr!]
                    inputControl    [int-ptr!]
                    return:         [integer!]
                ]
            ]
        ]
        line-buffer-size: 16 * 1024
        line-buffer: allocate line-buffer-size
    ][
        #switch OS [
            MacOSX [
                #define ReadLine-library "libreadline.dylib"
            ]
            #default [
                #define ReadLine-library "libreadline.so.6"
                #define History-library  "libhistory.so.6"
            ]
        ]
        #import [
            ReadLine-library cdecl [
                read-line: "readline" [  ; Read a line from the console.
                    prompt          [c-string!]
                    return:         [c-string!]
                ]
                rl-bind-key: "rl_bind_key" [
                    key             [integer!]
                    command         [integer!]
                    return:         [integer!]
                ]
                rl-insert:   "rl_insert" [
                    count           [integer!]
                    key             [integer!]
                    return:         [integer!]
                ]
            ]
            #if OS <> 'MacOSX [
                History-library cdecl [
                    add-history: "add_history" [  ; Add line to the history.
                        line        [c-string!]
                    ]
                ]
            ]
        ]

        rl-insert-wrapper: func [
            [cdecl]
            count   [integer!]
            key     [integer!]
            return: [integer!]
        ][
            rl-insert count key
        ]
        
    ]
]

Windows?: system/platform = 'Windows

read-argument: routine [
    /local
        args [str-array!]
        str  [red-string!]
][
    if system/args-count <> 2 [
        SET_RETURN(none-value)
        exit
    ]
    args: system/args-list + 1                          ;-- skip binary filename
    str: simple-io/read-txt args/item
    SET_RETURN(str)
]

init-console: routine [
    str [string!]
    /local
        ret
][
    #either OS = 'Windows [
        ;ret: AttachConsole -1
        ;if zero? ret [print-line "ReadConsole failed!" halt]
        
        ret: SetConsoleTitle as c-string! string/rs-head str
        if zero? ret [print-line "SetConsoleTitle failed!" halt]
    ][
        rl-bind-key as-integer tab as-integer :rl-insert-wrapper
    ]
]

input: routine [
    prompt [string!]
    /local
        len ret str buffer line
][
    #either OS = 'Windows [
        len: 0
        print as c-string! string/rs-head prompt
        ret: ReadConsole stdin line-buffer line-buffer-size :len null
        if zero? ret [print-line "ReadConsole failed!" halt]
        len: len + 1
        line-buffer/len: null-byte
        str: string/load as c-string! line-buffer len
    ][
        line: read-line as c-string! string/rs-head prompt
        if line = null [halt]  ; EOF

         #if OS <> 'MacOSX [add-history line]

        str: string/load line  1 + length? line
;       free as byte-ptr! line
    ]
    SET_RETURN(str)
]

count-delimiters: function [
    buffer  [string!]
    return: [block!]
][
    list: copy [0 0]
    c: none
    
    foreach c buffer [
        case [
            escaped? [
                escaped?: no
            ]
            in-comment? [
                switch c [
                    #"^/" [in-comment?: no]
                ]
            ]
            'else [
                switch c [
                    #"^^" [escaped?: yes]
                    #";"  [if zero? list/2 [in-comment?: yes]]
                    #"["  [list/1: list/1 + 1]
                    #"]"  [list/1: list/1 - 1]
                    #"{"  [list/2: list/2 + 1]
                    #"}"  [list/2: list/2 - 1]
                ]
            ]
        ]
    ]
    list
]

do-console: function [][
    buffer: make string! 10000
    prompt: red-prompt: "red>> "
    mode:  'mono
    
    switch-mode: [
        mode: case [
            cnt/1 > 0 ['block]
            cnt/2 > 0 ['string]
            'else     [
                prompt: red-prompt
                do eval
                'mono
            ]
        ]
        prompt: switch mode [
            block  ["[^-"]
            string ["{^-"]
            mono   [red-prompt]
        ]
    ]
    
    eval: [
        code: load/all buffer
        
        unless tail? code [
            set/any 'result do code
            
            unless unset? :result [
                if 67 = length? result: mold/part :result 67 [  ;-- optimized for width = 72
                    clear back tail result
                    append result "..."
                ]
                print ["==" result]
            ]
        ]
        clear buffer
    ]

    while [true][
        unless tail? line: input prompt [
            append buffer line
            cnt: count-delimiters buffer

            either Windows? [
                remove skip tail buffer -2          ;-- clear extra CR (Windows)
            ][
                append buffer lf                    ;-- Unix
            ]
            
            switch mode [
                block  [if cnt/1 <= 0 [do switch-mode]]
                string [if cnt/2 <= 0 [do switch-mode]]
                mono   [do either any [cnt/1 > 0 cnt/2 > 0][switch-mode][eval]]
            ]
        ]
    ]
]

q: :quit

if script: read-argument [
    script: load script
    either any [
        script/1 <> 'Red
        not block? script/2 
    ][
        print "*** Error: not a Red program!"
    ][
        do skip script 2
    ]
    quit
]

init-console "Red Console"

print {
-=== Red Console alpha version ===-
(only ASCII input supported)
}

do-console

---tokens---
'Red ['       Generic.Strong
'\n    '      Text
'Title:'      Generic.Subheading
'  '          Text
'"'           Literal.String
'Red console' Literal.String
'"'           Literal.String
'\n    '      Text
'Author:'     Generic.Subheading
' '           Text
'['           Generic.Strong
'"'           Literal.String
'Nenad Rakocevic' Literal.String
'"'           Literal.String
' '           Text
'"'           Literal.String
'Kaj de Vos'  Literal.String
'"'           Literal.String
']'           Generic.Strong
'\n    '      Text
'File:'       Generic.Subheading
'   '         Text
'%console.red' Name.Decorator
'\n    '      Text
'Tabs:'       Generic.Subheading
'   '         Text
'4'           Literal.Number
'\n    '      Text
'Rights:'     Generic.Subheading
' '           Text
'"'           Literal.String
'Copyright '  Literal.String
'('           Literal.String
'C'           Literal.String
')'           Literal.String
' 2012-2013 Nenad Rakocevic. All rights reserved.' Literal.String
'"'           Literal.String
'\n    '      Text
'License:'    Generic.Subheading
' '           Text
'{'           Literal.String
'\n        Distributed under the Boost Software License, Version 1.0.\n        See https://github.com/dockimbel/Red/blob/master/BSL-License.txt\n    ' Literal.String
'}'           Literal.String
'\n    '      Text
'Purpose:'    Generic.Subheading
'    '        Text
'"'           Literal.String
'Just some code for testing Pygments colorizer' Literal.String
'"'           Literal.String
'\n    '      Text
'Language:'   Generic.Subheading
'   '         Text
'http://www.red-lang.org/' Name.Decorator
'\n'          Text

']'           Generic.Strong
'\n\n'        Text

'#system-global' Keyword.Namespace
' '           Text
'['           Generic.Strong
'\n    '      Text
'#either'     Keyword.Namespace
' '           Text
'OS'          Name.Variable
' '           Text
'='           Operator
' '           Text
"'Windows"    Name.Variable.Instance
' '           Text
'['           Generic.Strong
'\n        '  Text
'#import'     Keyword.Namespace
' '           Text
'['           Generic.Strong
'\n            ' Text
'"'           Literal.String
'kernel32.dll' Literal.String
'"'           Literal.String
' '           Text
'stdcall'     Keyword.Namespace
' '           Text
'['           Generic.Strong
'\n                ' Text
'AttachConsole:' Generic.Subheading
'   '         Text
'"'           Literal.String
'AttachConsole' Literal.String
'"'           Literal.String
' '           Text
'['           Generic.Strong
'\n                    ' Text
'processID'   Name.Variable
'       '     Text
'['           Generic.Strong
'integer!'    Keyword.Type
']'           Generic.Strong
'\n                    ' Text
'return:'     Generic.Subheading
'         '   Text
'['           Generic.Strong
'integer!'    Keyword.Type
']'           Generic.Strong
'\n                ' Text
']'           Generic.Strong
'\n                ' Text
'SetConsoleTitle:' Generic.Subheading
' '           Text
'"'           Literal.String
'SetConsoleTitleA' Literal.String
'"'           Literal.String
' '           Text
'['           Generic.Strong
'\n                    ' Text
'title'       Name.Variable
'           ' Text
'['           Generic.Strong
'c-string!'   Keyword.Type
']'           Generic.Strong
'\n                    ' Text
'return:'     Generic.Subheading
'         '   Text
'['           Generic.Strong
'integer!'    Keyword.Type
']'           Generic.Strong
'\n                ' Text
']'           Generic.Strong
'\n                ' Text
'ReadConsole:' Generic.Subheading
'     '       Text
'"'           Literal.String
'ReadConsoleA' Literal.String
'"'           Literal.String
' '           Text
'['           Generic.Strong
'\n                    ' Text
'consoleInput' Name.Variable
'    '        Text
'['           Generic.Strong
'integer!'    Keyword.Type
']'           Generic.Strong
'\n                    ' Text
'buffer'      Name.Variable
'          '  Text
'['           Generic.Strong
'byte-ptr!'   Keyword.Type
']'           Generic.Strong
'\n                    ' Text
'charsToRead' Name.Variable
'     '       Text
'['           Generic.Strong
'integer!'    Keyword.Type
']'           Generic.Strong
'\n                    ' Text
'numberOfChars' Name.Variable
'   '         Text
'['           Generic.Strong
'int-ptr!'    Keyword.Type
']'           Generic.Strong
'\n                    ' Text
'inputControl' Name.Variable
'    '        Text
'['           Generic.Strong
'int-ptr!'    Keyword.Type
']'           Generic.Strong
'\n                    ' Text
'return:'     Generic.Subheading
'         '   Text
'['           Generic.Strong
'integer!'    Keyword.Type
']'           Generic.Strong
'\n                ' Text
']'           Generic.Strong
'\n            ' Text
']'           Generic.Strong
'\n        '  Text
']'           Generic.Strong
'\n        '  Text
'line-buffer-size:' Generic.Subheading
' '           Text
'16'          Literal.Number
' '           Text
'*'           Operator
' '           Text
'1024'        Literal.Number
'\n        '  Text
'line-buffer:' Generic.Subheading
' '           Text
'allocate'    Name.Variable
' '           Text
'line-buffer-size' Name.Variable
'\n    '      Text
']'           Generic.Strong
'['           Generic.Strong
'\n        '  Text
'#switch'     Keyword.Namespace
' '           Text
'OS'          Name.Variable
' '           Text
'['           Generic.Strong
'\n            ' Text
'MacOSX'      Name.Variable
' '           Text
'['           Generic.Strong
'\n                ' Text
'#define'     Keyword.Namespace
' '           Text
'ReadLine-library' Name.Variable
' '           Text
'"'           Literal.String
'libreadline.dylib' Literal.String
'"'           Literal.String
'\n            ' Text
']'           Generic.Strong
'\n            ' Text
'#default'    Keyword.Namespace
' '           Text
'['           Generic.Strong
'\n                ' Text
'#define'     Keyword.Namespace
' '           Text
'ReadLine-library' Name.Variable
' '           Text
'"'           Literal.String
'libreadline.so.6' Literal.String
'"'           Literal.String
'\n                ' Text
'#define'     Keyword.Namespace
' '           Text
'History-library' Name.Variable
'  '          Text
'"'           Literal.String
'libhistory.so.6' Literal.String
'"'           Literal.String
'\n            ' Text
']'           Generic.Strong
'\n        '  Text
']'           Generic.Strong
'\n        '  Text
'#import'     Keyword.Namespace
' '           Text
'['           Generic.Strong
'\n            ' Text
'ReadLine-library' Name.Variable
' '           Text
'cdecl'       Keyword.Namespace
' '           Text
'['           Generic.Strong
'\n                ' Text
'read-line:'  Generic.Subheading
' '           Text
'"'           Literal.String
'readline'    Literal.String
'"'           Literal.String
' '           Text
'['           Generic.Strong
'  '          Text
'; Read a line from the console.\n' Comment

'                    ' Text
'prompt'      Name.Variable
'          '  Text
'['           Generic.Strong
'c-string!'   Keyword.Type
']'           Generic.Strong
'\n                    ' Text
'return:'     Generic.Subheading
'         '   Text
'['           Generic.Strong
'c-string!'   Keyword.Type
']'           Generic.Strong
'\n                ' Text
']'           Generic.Strong
'\n                ' Text
'rl-bind-key:' Generic.Subheading
' '           Text
'"'           Literal.String
'rl_bind_key' Literal.String
'"'           Literal.String
' '           Text
'['           Generic.Strong
'\n                    ' Text
'key'         Name.Variable
'             ' Text
'['           Generic.Strong
'integer!'    Keyword.Type
']'           Generic.Strong
'\n                    ' Text
'command'     Name.Variable
'         '   Text
'['           Generic.Strong
'integer!'    Keyword.Type
']'           Generic.Strong
'\n                    ' Text
'return:'     Generic.Subheading
'         '   Text
'['           Generic.Strong
'integer!'    Keyword.Type
']'           Generic.Strong
'\n                ' Text
']'           Generic.Strong
'\n                ' Text
'rl-insert:'  Generic.Subheading
'   '         Text
'"'           Literal.String
'rl_insert'   Literal.String
'"'           Literal.String
' '           Text
'['           Generic.Strong
'\n                    ' Text
'count'       Name.Variable
'           ' Text
'['           Generic.Strong
'integer!'    Keyword.Type
']'           Generic.Strong
'\n                    ' Text
'key'         Name.Variable
'             ' Text
'['           Generic.Strong
'integer!'    Keyword.Type
']'           Generic.Strong
'\n                    ' Text
'return:'     Generic.Subheading
'         '   Text
'['           Generic.Strong
'integer!'    Keyword.Type
']'           Generic.Strong
'\n                ' Text
']'           Generic.Strong
'\n            ' Text
']'           Generic.Strong
'\n            ' Text
'#if'         Keyword.Namespace
' '           Text
'OS'          Name.Variable
' '           Text
'<>'          Operator
' '           Text
"'MacOSX"     Name.Variable.Instance
' '           Text
'['           Generic.Strong
'\n                ' Text
'History-library' Name.Variable
' '           Text
'cdecl'       Keyword.Namespace
' '           Text
'['           Generic.Strong
'\n                    ' Text
'add-history:' Generic.Subheading
' '           Text
'"'           Literal.String
'add_history' Literal.String
'"'           Literal.String
' '           Text
'['           Generic.Strong
'  '          Text
'; Add line to the history.\n' Comment

'                        ' Text
'line'        Name.Variable
'        '    Text
'['           Generic.Strong
'c-string!'   Keyword.Type
']'           Generic.Strong
'\n                    ' Text
']'           Generic.Strong
'\n                ' Text
']'           Generic.Strong
'\n            ' Text
']'           Generic.Strong
'\n        '  Text
']'           Generic.Strong
'\n\n        ' Text
'rl-insert-wrapper:' Generic.Subheading
' '           Text
'func'        Name.Builtin
' '           Text
'['           Generic.Strong
'\n            ' Text
'['           Generic.Strong
'cdecl'       Keyword.Namespace
']'           Generic.Strong
'\n            ' Text
'count'       Name.Variable
'   '         Text
'['           Generic.Strong
'integer!'    Keyword.Type
']'           Generic.Strong
'\n            ' Text
'key'         Name.Variable
'     '       Text
'['           Generic.Strong
'integer!'    Keyword.Type
']'           Generic.Strong
'\n            ' Text
'return:'     Generic.Subheading
' '           Text
'['           Generic.Strong
'integer!'    Keyword.Type
']'           Generic.Strong
'\n        '  Text
']'           Generic.Strong
'['           Generic.Strong
'\n            ' Text
'rl-insert'   Name.Variable
' '           Text
'count'       Name.Variable
' '           Text
'key'         Name.Variable
'\n        '  Text
']'           Generic.Strong
'\n        \n    ' Text
']'           Generic.Strong
'\n'          Text

']'           Generic.Strong
'\n\n'        Text

'Windows?:'   Generic.Subheading
' '           Text
'system'      Name.Exception
'/platform'   Name.Attribute
' '           Text
'='           Operator
' '           Text
"'Windows"    Name.Variable.Instance
'\n\n'        Text

'read-argument:' Generic.Subheading
' '           Text
'routine'     Name.Builtin
' '           Text
'['           Generic.Strong
'\n    '      Text
'/local'      Name.Attribute
'\n        '  Text
'args'        Name.Variable
' '           Text
'['           Generic.Strong
'str-array!'  Keyword.Type
']'           Generic.Strong
'\n        '  Text
'str'         Name.Variable
'  '          Text
'['           Generic.Strong
'red-string!' Keyword.Type
']'           Generic.Strong
'\n'          Text

']'           Generic.Strong
'['           Generic.Strong
'\n    '      Text
'if'          Name.Builtin
' '           Text
'system'      Name.Exception
'/args-count' Name.Attribute
' '           Text
'<>'          Operator
' '           Text
'2'           Literal.Number
' '           Text
'['           Generic.Strong
'\n        '  Text
'SET_RETURN'  Name.Variable
'('           Generic.Strong
'none-value'  Text
')'           Generic.Strong
'\n        '  Text
'exit'        Name.Exception
'\n    '      Text
']'           Generic.Strong
'\n    '      Text
'args:'       Generic.Subheading
' '           Text
'system'      Name.Exception
'/args-list'  Name.Attribute
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number
'                          ' Text
';-- skip binary filename\n' Comment

'    '        Text
'str:'        Generic.Subheading
' '           Text
'simple-io'   Name.Variable
'/read-txt'   Name.Attribute
' '           Text
'args'        Name.Variable
'/item'       Name.Attribute
'\n    '      Text
'SET_RETURN'  Name.Variable
'('           Generic.Strong
'str'         Text
')'           Generic.Strong
'\n'          Text

']'           Generic.Strong
'\n\n'        Text

'init-console:' Generic.Subheading
' '           Text
'routine'     Name.Builtin
' '           Text
'['           Generic.Strong
'\n    '      Text
'str'         Name.Variable
' '           Text
'['           Generic.Strong
'string!'     Keyword.Type
']'           Generic.Strong
'\n    '      Text
'/local'      Name.Attribute
'\n        '  Text
'ret'         Name.Variable
'\n'          Text

']'           Generic.Strong
'['           Generic.Strong
'\n    '      Text
'#either'     Keyword.Namespace
' '           Text
'OS'          Name.Variable
' '           Text
'='           Operator
' '           Text
"'Windows"    Name.Variable.Instance
' '           Text
'['           Generic.Strong
'\n        '  Text
';ret: AttachConsole -1\n' Comment

'        '    Text
';if zero? ret [print-line "ReadConsole failed!" halt]\n' Comment

'        \n        ' Text
'ret:'        Generic.Subheading
' '           Text
'SetConsoleTitle' Name.Variable
' '           Text
'as'          Name.Variable
' '           Text
'c-string!'   Keyword.Type
' '           Text
'string'      Name.Variable
'/rs-head'    Name.Attribute
' '           Text
'str'         Name.Variable
'\n        '  Text
'if'          Name.Builtin
' '           Text
'zero?'       Keyword
' '           Text
'ret'         Name.Variable
' '           Text
'['           Generic.Strong
'print-line'  Name.Variable
' '           Text
'"'           Literal.String
'SetConsoleTitle failed!' Literal.String
'"'           Literal.String
' '           Text
'halt'        Name.Exception
']'           Generic.Strong
'\n    '      Text
']'           Generic.Strong
'['           Generic.Strong
'\n        '  Text
'rl-bind-key' Name.Variable
' '           Text
'as-integer'  Name.Variable
' '           Text
'tab'         Name.Builtin.Pseudo
' '           Text
'as-integer'  Name.Variable
' '           Text
':rl-insert-wrapper' Generic.Subheading
'\n    '      Text
']'           Generic.Strong
'\n'          Text

']'           Generic.Strong
'\n\n'        Text

'input:'      Generic.Subheading
' '           Text
'routine'     Name.Builtin
' '           Text
'['           Generic.Strong
'\n    '      Text
'prompt'      Name.Variable
' '           Text
'['           Generic.Strong
'string!'     Keyword.Type
']'           Generic.Strong
'\n    '      Text
'/local'      Name.Attribute
'\n        '  Text
'len'         Name.Variable
' '           Text
'ret'         Name.Variable
' '           Text
'str'         Name.Variable
' '           Text
'buffer'      Name.Variable
' '           Text
'line'        Name.Variable
'\n'          Text

']'           Generic.Strong
'['           Generic.Strong
'\n    '      Text
'#either'     Keyword.Namespace
' '           Text
'OS'          Name.Variable
' '           Text
'='           Operator
' '           Text
"'Windows"    Name.Variable.Instance
' '           Text
'['           Generic.Strong
'\n        '  Text
'len:'        Generic.Subheading
' '           Text
'0'           Literal.Number
'\n        '  Text
'print'       Name.Builtin
' '           Text
'as'          Name.Variable
' '           Text
'c-string!'   Keyword.Type
' '           Text
'string'      Name.Variable
'/rs-head'    Name.Attribute
' '           Text
'prompt'      Name.Variable
'\n        '  Text
'ret:'        Generic.Subheading
' '           Text
'ReadConsole' Name.Variable
' '           Text
'stdin'       Name.Variable
' '           Text
'line-buffer' Name.Variable
' '           Text
'line-buffer-size' Name.Variable
' '           Text
':len'        Generic.Subheading
' '           Text
'null'        Name.Builtin.Pseudo
'\n        '  Text
'if'          Name.Builtin
' '           Text
'zero?'       Keyword
' '           Text
'ret'         Name.Variable
' '           Text
'['           Generic.Strong
'print-line'  Name.Variable
' '           Text
'"'           Literal.String
'ReadConsole failed!' Literal.String
'"'           Literal.String
' '           Text
'halt'        Name.Exception
']'           Generic.Strong
'\n        '  Text
'len:'        Generic.Subheading
' '           Text
'len'         Name.Variable
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number
'\n        '  Text
'line-buffer' Name.Variable
'/len:'       Name.Attribute
' '           Text
'null-byte'   Name.Builtin.Pseudo
'\n        '  Text
'str:'        Generic.Subheading
' '           Text
'string'      Name.Variable
'/load'       Name.Attribute
' '           Text
'as'          Name.Variable
' '           Text
'c-string!'   Keyword.Type
' '           Text
'line-buffer' Name.Variable
' '           Text
'len'         Name.Variable
'\n    '      Text
']'           Generic.Strong
'['           Generic.Strong
'\n        '  Text
'line:'       Generic.Subheading
' '           Text
'read-line'   Name.Variable
' '           Text
'as'          Name.Variable
' '           Text
'c-string!'   Keyword.Type
' '           Text
'string'      Name.Variable
'/rs-head'    Name.Attribute
' '           Text
'prompt'      Name.Variable
'\n        '  Text
'if'          Name.Builtin
' '           Text
'line'        Name.Variable
' '           Text
'='           Operator
' '           Text
'null'        Name.Builtin.Pseudo
' '           Text
'['           Generic.Strong
'halt'        Name.Exception
']'           Generic.Strong
'  '          Text
'; EOF\n'     Comment

'\n         ' Text
'#if'         Keyword.Namespace
' '           Text
'OS'          Name.Variable
' '           Text
'<>'          Operator
' '           Text
"'MacOSX"     Name.Variable.Instance
' '           Text
'['           Generic.Strong
'add-history' Name.Variable
' '           Text
'line'        Name.Variable
']'           Generic.Strong
'\n\n        ' Text
'str:'        Generic.Subheading
' '           Text
'string'      Name.Variable
'/load'       Name.Attribute
' '           Text
'line'        Name.Variable
'  '          Text
'1'           Literal.Number
' '           Text
'+'           Operator
' '           Text
'length?'     Name.Function
' '           Text
'line'        Name.Variable
'\n'          Text

';       free as byte-ptr! line\n' Comment

'    '        Text
']'           Generic.Strong
'\n    '      Text
'SET_RETURN'  Name.Variable
'('           Generic.Strong
'str'         Text
')'           Generic.Strong
'\n'          Text

']'           Generic.Strong
'\n\n'        Text

'count-delimiters:' Generic.Subheading
' '           Text
'function'    Name.Builtin
' '           Text
'['           Generic.Strong
'\n    '      Text
'buffer'      Name.Variable
'  '          Text
'['           Generic.Strong
'string!'     Keyword.Type
']'           Generic.Strong
'\n    '      Text
'return:'     Generic.Subheading
' '           Text
'['           Generic.Strong
'block!'      Keyword.Type
']'           Generic.Strong
'\n'          Text

']'           Generic.Strong
'['           Generic.Strong
'\n    '      Text
'list:'       Generic.Subheading
' '           Text
'copy'        Name.Function
' '           Text
'['           Generic.Strong
'0'           Literal.Number
' '           Text
'0'           Literal.Number
']'           Generic.Strong
'\n    '      Text
'c:'          Generic.Subheading
' '           Text
'none'        Name.Builtin.Pseudo
'\n    \n    ' Text
'foreach'     Name.Builtin
' '           Text
'c'           Name.Variable
' '           Text
'buffer'      Name.Variable
' '           Text
'['           Generic.Strong
'\n        '  Text
'case'        Name.Builtin
' '           Text
'['           Generic.Strong
'\n            ' Text
'escaped?'    Name.Variable
' '           Text
'['           Generic.Strong
'\n                ' Text
'escaped?:'   Generic.Subheading
' '           Text
'no'          Name.Builtin.Pseudo
'\n            ' Text
']'           Generic.Strong
'\n            ' Text
'in-comment?' Name.Variable
' '           Text
'['           Generic.Strong
'\n                ' Text
'switch'      Name.Builtin
' '           Text
'c'           Name.Variable
' '           Text
'['           Generic.Strong
'\n                    ' Text
'#"'          Literal.String.Char
'^/"'         Literal.String.Char
' '           Text
'['           Generic.Strong
'in-comment?:' Generic.Subheading
' '           Text
'no'          Name.Builtin.Pseudo
']'           Generic.Strong
'\n                ' Text
']'           Generic.Strong
'\n            ' Text
']'           Generic.Strong
'\n            ' Text
"'else"       Name.Variable.Instance
' '           Text
'['           Generic.Strong
'\n                ' Text
'switch'      Name.Builtin
' '           Text
'c'           Name.Variable
' '           Text
'['           Generic.Strong
'\n                    ' Text
'#"'          Literal.String.Char
'^^"'         Literal.String.Char
' '           Text
'['           Generic.Strong
'escaped?:'   Generic.Subheading
' '           Text
'yes'         Name.Builtin.Pseudo
']'           Generic.Strong
'\n                    ' Text
'#"'          Literal.String.Char
';"'          Literal.String.Char
'  '          Text
'['           Generic.Strong
'if'          Name.Builtin
' '           Text
'zero?'       Keyword
' '           Text
'list'        Name.Variable
'/2'          Name.Attribute
' '           Text
'['           Generic.Strong
'in-comment?:' Generic.Subheading
' '           Text
'yes'         Name.Builtin.Pseudo
']'           Generic.Strong
']'           Generic.Strong
'\n                    ' Text
'#"'          Literal.String.Char
'["'          Literal.String.Char
'  '          Text
'['           Generic.Strong
'list'        Name.Variable
'/1:'         Name.Attribute
' '           Text
'list'        Name.Variable
'/1'          Name.Attribute
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number
']'           Generic.Strong
'\n                    ' Text
'#"'          Literal.String.Char
']"'          Literal.String.Char
'  '          Text
'['           Generic.Strong
'list'        Name.Variable
'/1:'         Name.Attribute
' '           Text
'list'        Name.Variable
'/1'          Name.Attribute
' '           Text
'-'           Operator
' '           Text
'1'           Literal.Number
']'           Generic.Strong
'\n                    ' Text
'#"'          Literal.String.Char
'{"'          Literal.String.Char
'  '          Text
'['           Generic.Strong
'list'        Name.Variable
'/2:'         Name.Attribute
' '           Text
'list'        Name.Variable
'/2'          Name.Attribute
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number
']'           Generic.Strong
'\n                    ' Text
'#"'          Literal.String.Char
'}"'          Literal.String.Char
'  '          Text
'['           Generic.Strong
'list'        Name.Variable
'/2:'         Name.Attribute
' '           Text
'list'        Name.Variable
'/2'          Name.Attribute
' '           Text
'-'           Operator
' '           Text
'1'           Literal.Number
']'           Generic.Strong
'\n                ' Text
']'           Generic.Strong
'\n            ' Text
']'           Generic.Strong
'\n        '  Text
']'           Generic.Strong
'\n    '      Text
']'           Generic.Strong
'\n    '      Text
'list'        Name.Variable
'\n'          Text

']'           Generic.Strong
'\n\n'        Text

'do-console:' Generic.Subheading
' '           Text
'function'    Name.Builtin
' '           Text
'['           Generic.Strong
']'           Generic.Strong
'['           Generic.Strong
'\n    '      Text
'buffer:'     Generic.Subheading
' '           Text
'make'        Name.Function
' '           Text
'string!'     Keyword.Type
' '           Text
'10000'       Literal.Number
'\n    '      Text
'prompt:'     Generic.Subheading
' '           Text
'red-prompt:' Generic.Subheading
' '           Text
'"'           Literal.String
'red>> '      Literal.String
'"'           Literal.String
'\n    '      Text
'mode:'       Generic.Subheading
'  '          Text
"'mono"       Name.Variable.Instance
'\n    \n    ' Text
'switch-mode:' Generic.Subheading
' '           Text
'['           Generic.Strong
'\n        '  Text
'mode:'       Generic.Subheading
' '           Text
'case'        Name.Builtin
' '           Text
'['           Generic.Strong
'\n            ' Text
'cnt'         Name.Variable
'/1'          Name.Attribute
' '           Text
'>'           Name.Variable
' '           Text
'0'           Literal.Number
' '           Text
'['           Generic.Strong
"'block"      Name.Variable.Instance
']'           Generic.Strong
'\n            ' Text
'cnt'         Name.Variable
'/2'          Name.Attribute
' '           Text
'>'           Name.Variable
' '           Text
'0'           Literal.Number
' '           Text
'['           Generic.Strong
"'string"     Name.Variable.Instance
']'           Generic.Strong
'\n            ' Text
"'else"       Name.Variable.Instance
'     '       Text
'['           Generic.Strong
'\n                ' Text
'prompt:'     Generic.Subheading
' '           Text
'red-prompt'  Name.Variable
'\n                ' Text
'do'          Name.Exception
' '           Text
'eval'        Name.Variable
'\n                ' Text
"'mono"       Name.Variable.Instance
'\n            ' Text
']'           Generic.Strong
'\n        '  Text
']'           Generic.Strong
'\n        '  Text
'prompt:'     Generic.Subheading
' '           Text
'switch'      Name.Builtin
' '           Text
'mode'        Name.Variable
' '           Text
'['           Generic.Strong
'\n            ' Text
'block'       Name.Variable
'  '          Text
'['           Generic.Strong
'"'           Literal.String
'['           Literal.String
'^-'          Literal.String.Escape
'"'           Literal.String
']'           Generic.Strong
'\n            ' Text
'string'      Name.Variable
' '           Text
'['           Generic.Strong
'"'           Literal.String
'{'           Literal.String
'^-'          Literal.String.Escape
'"'           Literal.String
']'           Generic.Strong
'\n            ' Text
'mono'        Name.Variable
'   '         Text
'['           Generic.Strong
'red-prompt'  Name.Variable
']'           Generic.Strong
'\n        '  Text
']'           Generic.Strong
'\n    '      Text
']'           Generic.Strong
'\n    \n    ' Text
'eval:'       Generic.Subheading
' '           Text
'['           Generic.Strong
'\n        '  Text
'code:'       Generic.Subheading
' '           Text
'load'        Name.Exception
'/all'        Name.Attribute
' '           Text
'buffer'      Name.Variable
'\n        \n        ' Text
'unless'      Name.Builtin
' '           Text
'tail?'       Name.Function
' '           Text
'code'        Name.Variable
' '           Text
'['           Generic.Strong
'\n            ' Text
'set'         Name.Builtin
'/any'        Name.Attribute
' '           Text
"'result"     Name.Variable.Instance
' '           Text
'do'          Name.Exception
' '           Text
'code'        Name.Variable
'\n            \n            ' Text
'unless'      Name.Builtin
' '           Text
'unset?'      Keyword
' '           Text
':result'     Generic.Subheading
' '           Text
'['           Generic.Strong
'\n                ' Text
'if'          Name.Builtin
' '           Text
'67'          Literal.Number
' '           Text
'='           Operator
' '           Text
'length?'     Name.Function
' '           Text
'result:'     Generic.Subheading
' '           Text
'mold'        Name.Function
'/part'       Name.Attribute
' '           Text
':result'     Generic.Subheading
' '           Text
'67'          Literal.Number
' '           Text
'['           Generic.Strong
'  '          Text
';-- optimized for width = 72\n' Comment

'                    ' Text
'clear'       Name.Function
' '           Text
'back'        Name.Function
' '           Text
'tail'        Name.Function
' '           Text
'result'      Name.Variable
'\n                    ' Text
'append'      Name.Function
' '           Text
'result'      Name.Variable
' '           Text
'"'           Literal.String
'...'         Literal.String
'"'           Literal.String
'\n                ' Text
']'           Generic.Strong
'\n                ' Text
'print'       Name.Builtin
' '           Text
'['           Generic.Strong
'"'           Literal.String
'=='          Literal.String
'"'           Literal.String
' '           Text
'result'      Name.Variable
']'           Generic.Strong
'\n            ' Text
']'           Generic.Strong
'\n        '  Text
']'           Generic.Strong
'\n        '  Text
'clear'       Name.Function
' '           Text
'buffer'      Name.Variable
'\n    '      Text
']'           Generic.Strong
'\n\n    '    Text
'while'       Name.Builtin
' '           Text
'['           Generic.Strong
'true'        Name.Builtin.Pseudo
']'           Generic.Strong
'['           Generic.Strong
'\n        '  Text
'unless'      Name.Builtin
' '           Text
'tail?'       Name.Function
' '           Text
'line:'       Generic.Subheading
' '           Text
'input'       Name.Variable
' '           Text
'prompt'      Name.Variable
' '           Text
'['           Generic.Strong
'\n            ' Text
'append'      Name.Function
' '           Text
'buffer'      Name.Variable
' '           Text
'line'        Name.Variable
'\n            ' Text
'cnt:'        Generic.Subheading
' '           Text
'count-delimiters' Name.Variable
' '           Text
'buffer'      Name.Variable
'\n\n            ' Text
'either'      Name.Builtin
' '           Text
'Windows?'    Name.Variable
' '           Text
'['           Generic.Strong
'\n                ' Text
'remove'      Name.Function
' '           Text
'skip'        Name.Function
' '           Text
'tail'        Name.Function
' '           Text
'buffer'      Name.Variable
' '           Text
'-2'          Literal.Number
'          '  Text
';-- clear extra CR (Windows)\n' Comment

'            ' Text
']'           Generic.Strong
'['           Generic.Strong
'\n                ' Text
'append'      Name.Function
' '           Text
'buffer'      Name.Variable
' '           Text
'lf'          Name.Builtin.Pseudo
'                    ' Text
';-- Unix\n'  Comment

'            ' Text
']'           Generic.Strong
'\n            \n            ' Text
'switch'      Name.Builtin
' '           Text
'mode'        Name.Variable
' '           Text
'['           Generic.Strong
'\n                ' Text
'block'       Name.Variable
'  '          Text
'['           Generic.Strong
'if'          Name.Builtin
' '           Text
'cnt'         Name.Variable
'/1'          Name.Attribute
' '           Text
'<='          Operator
' '           Text
'0'           Literal.Number
' '           Text
'['           Generic.Strong
'do'          Name.Exception
' '           Text
'switch-mode' Name.Variable
']'           Generic.Strong
']'           Generic.Strong
'\n                ' Text
'string'      Name.Variable
' '           Text
'['           Generic.Strong
'if'          Name.Builtin
' '           Text
'cnt'         Name.Variable
'/2'          Name.Attribute
' '           Text
'<='          Operator
' '           Text
'0'           Literal.Number
' '           Text
'['           Generic.Strong
'do'          Name.Exception
' '           Text
'switch-mode' Name.Variable
']'           Generic.Strong
']'           Generic.Strong
'\n                ' Text
'mono'        Name.Variable
'   '         Text
'['           Generic.Strong
'do'          Name.Exception
' '           Text
'either'      Name.Builtin
' '           Text
'any'         Name.Builtin
' '           Text
'['           Generic.Strong
'cnt'         Name.Variable
'/1'          Name.Attribute
' '           Text
'>'           Name.Variable
' '           Text
'0'           Literal.Number
' '           Text
'cnt'         Name.Variable
'/2'          Name.Attribute
' '           Text
'>'           Name.Variable
' '           Text
'0'           Literal.Number
']'           Generic.Strong
'['           Generic.Strong
'switch-mode' Name.Variable
']'           Generic.Strong
'['           Generic.Strong
'eval'        Name.Variable
']'           Generic.Strong
']'           Generic.Strong
'\n            ' Text
']'           Generic.Strong
'\n        '  Text
']'           Generic.Strong
'\n    '      Text
']'           Generic.Strong
'\n'          Text

']'           Generic.Strong
'\n\n'        Text

'q:'          Generic.Subheading
' '           Text
':quit'       Generic.Subheading
'\n\n'        Text

'if'          Name.Builtin
' '           Text
'script:'     Generic.Subheading
' '           Text
'read-argument' Name.Variable
' '           Text
'['           Generic.Strong
'\n    '      Text
'script:'     Generic.Subheading
' '           Text
'load'        Name.Exception
' '           Text
'script'      Name.Variable
'\n    '      Text
'either'      Name.Builtin
' '           Text
'any'         Name.Builtin
' '           Text
'['           Generic.Strong
'\n        '  Text
'script'      Name.Variable
'/1'          Name.Attribute
' '           Text
'<>'          Operator
' '           Text
"'Red"        Name.Variable.Instance
'\n        '  Text
'not'         Name.Builtin
' '           Text
'block?'      Keyword
' '           Text
'script'      Name.Variable
'/2'          Name.Attribute
' \n    '     Text
']'           Generic.Strong
'['           Generic.Strong
'\n        '  Text
'print'       Name.Builtin
' '           Text
'"'           Literal.String
'*** Error: not a Red program!' Literal.String
'"'           Literal.String
'\n    '      Text
']'           Generic.Strong
'['           Generic.Strong
'\n        '  Text
'do'          Name.Exception
' '           Text
'skip'        Name.Function
' '           Text
'script'      Name.Variable
' '           Text
'2'           Literal.Number
'\n    '      Text
']'           Generic.Strong
'\n    '      Text
'quit'        Name.Exception
'\n'          Text

']'           Generic.Strong
'\n\n'        Text

'init-console' Name.Variable
' '           Text
'"'           Literal.String
'Red Console' Literal.String
'"'           Literal.String
'\n\n'        Text

'print'       Name.Builtin
' '           Text
'{'           Literal.String
'\n-=== Red Console alpha version ===-\n' Literal.String

'('           Literal.String
'only ASCII input supported' Literal.String
')'           Literal.String
'\n'          Literal.String

'}'           Literal.String
'\n\n'        Text

'do-console'  Name.Variable
'\n'          Text
