---input--- ## core string functions ## length(s::String) = error("you must implement length(",typeof(s),")") next(s::String, i::Int) = error("you must implement next(",typeof(s),",Int)") next(s::DirectIndexString, i::Int) = (s[i],i+1) next(s::String, i::Integer) = next(s,int(i)) ## generic supplied functions ## start(s::String) = 1 done(s::String,i) = (i > length(s)) isempty(s::String) = done(s,start(s)) ref(s::String, i::Int) = next(s,i)[1] ref(s::String, i::Integer) = s[int(i)] ref(s::String, x::Real) = s[iround(x)] ref{T<:Integer}(s::String, r::Range1{T}) = s[int(first(r)):int(last(r))] symbol(s::String) = symbol(cstring(s)) string(s::String) = s print(s::String) = for c=s; print(c); end print(x...) = for i=x; print(i); end println(args...) = print(args..., '\n') show(s::String) = print_quoted(s) (*)(s::String...) = strcat(s...) (^)(s::String, r::Integer) = repeat(s,r) size(s::String) = (length(s),) size(s::String, d::Integer) = d==1 ? length(s) : error("in size: dimension ",d," out of range") strlen(s::DirectIndexString) = length(s) function strlen(s::String) i = start(s) if done(s,i) return 0 end n = 1 while true c, j = next(s,i) if done(s,j) return n end n += 1 i = j end end isvalid(s::DirectIndexString, i::Integer) = (start(s) <= i <= length(s)) function isvalid(s::String, i::Integer) try next(s,i) true catch false end end prevind(s::DirectIndexString, i::Integer) = i-1 thisind(s::DirectIndexString, i::Integer) = i nextind(s::DirectIndexString, i::Integer) = i+1 prevind(s::String, i::Integer) = thisind(s,thisind(s,i)-1) function thisind(s::String, i::Integer) for j = i:-1:1 if isvalid(s,j) return j end end return 0 # out of range end function nextind(s::String, i::Integer) for j = i+1:length(s) if isvalid(s,j) return j end end length(s)+1 # out of range end ind2chr(s::DirectIndexString, i::Integer) = i chr2ind(s::DirectIndexString, i::Integer) = i function ind2chr(s::String, i::Integer) s[i] # throws error if invalid j = 1 k = start(s) while true c, l = next(s,k) if i <= k return j end j += 1 k = l end end function chr2ind(s::String, i::Integer) if i < 1 return i end j = 1 k = start(s) while true c, l = next(s,k) if i == j return k end j += 1 k = l end end function strchr(s::String, c::Char, i::Integer) i = nextind(s,i) while !done(s,i) d, j = next(s,i) if c == d return i end i = j end return 0 end strchr(s::String, c::Char) = strchr(s, c, start(s)) contains(s::String, c::Char) = (strchr(s,c)!=0) function chars(s::String) cx = Array(Char,strlen(s)) i = 0 for c in s cx[i += 1] = c end return cx end function cmp(a::String, b::String) i = start(a) j = start(b) while !done(a,i) && !done(b,i) c, i = next(a,i) d, j = next(b,j) if c != d return c < d ? -1 : +1 end end done(a,i) && !done(b,j) ? -1 : !done(a,i) && done(b,j) ? +1 : 0 end isequal(a::String, b::String) = cmp(a,b) == 0 isless(a::String, b::String) = cmp(a,b) < 0 # faster comparisons for byte strings cmp(a::ByteString, b::ByteString) = lexcmp(a.data, b.data) isequal(a::ByteString, b::ByteString) = length(a)==length(b) && cmp(a,b)==0 ## character column width function ## charwidth(c::Char) = max(0,int(ccall(:wcwidth, Int32, (Char,), c))) strwidth(s::String) = (w=0; for c in s; w += charwidth(c); end; w) strwidth(s::ByteString) = ccall(:u8_strwidth, Int, (Ptr{Uint8},), s.data) # TODO: implement and use u8_strnwidth that takes a length argument ## generic string uses only length and next ## type GenericString <: String string::String end length(s::GenericString) = length(s.string) next(s::GenericString, i::Int) = next(s.string, i) ## plain old character arrays ## type CharString <: String chars::Array{Char,1} CharString(a::Array{Char,1}) = new(a) CharString(c::Char...) = new([ c[i] | i=1:length(c) ]) end CharString(x...) = CharString(map(char,x)...) next(s::CharString, i::Int) = (s.chars[i], i+1) length(s::CharString) = length(s.chars) strlen(s::CharString) = length(s) string(c::Char) = CharString(c) string(c::Char, x::Char...) = CharString(c, x...) ## substrings reference original strings ## type SubString <: String string::String offset::Int length::Int SubString(s::String, i::Int, j::Int) = new(s, i-1, j-i+1) SubString(s::SubString, i::Int, j::Int) = new(s.string, i-1+s.offset, j-i+1) end SubString(s::String, i::Integer, j::Integer) = SubString(s, int(i), int(j)) function next(s::SubString, i::Int) if i < 1 || i > s.length error("string index out of bounds") end c, i = next(s.string, i+s.offset) c, i-s.offset end length(s::SubString) = s.length # TODO: strlen(s::SubString) = ?? # default implementation will work but it's slow # can this be delegated efficiently somehow? # that may require additional string interfaces function ref(s::String, r::Range1{Int}) if first(r) < 1 || length(s) < last(r) error("in substring slice: index out of range") end SubString(s, first(r), last(r)) end ## efficient representation of repeated strings ## type RepString <: String string::String repeat::Integer end length(s::RepString) = length(s.string)*s.repeat strlen(s::RepString) = strlen(s.string)*s.repeat function next(s::RepString, i::Int) if i < 1 || i > length(s) error("string index out of bounds") end j = mod1(i,length(s.string)) c, k = next(s.string, j) c, k-j+i end function repeat(s::String, r::Integer) r < 0 ? error("can't repeat a string ",r," times") : r == 0 ? "" : r == 1 ? s : RepString(s,r) end ## reversed strings without data movement ## type RevString <: String string::String end length(s::RevString) = length(s.string) strlen(s::RevString) = strlen(s.string) start(s::RevString) = (n=length(s); n-thisind(s.string,n)+1) function next(s::RevString, i::Int) n = length(s); j = n-i+1 (s.string[j], n-thisind(s.string,j-1)+1) end reverse(s::String) = RevString(s) reverse(s::RevString) = s.string ## ropes for efficient concatenation, etc. ## # Idea: instead of this standard binary tree structure, # how about we keep an array of substrings, with an # offset array. We can do binary search on the offset # array so we get O(log(n)) indexing time still, but we # can compute the offsets lazily and avoid all the # futzing around while the string is being constructed. type RopeString <: String head::String tail::String depth::Int32 length::Int RopeString(h::RopeString, t::RopeString) = depth(h.tail) + depth(t) < depth(h.head) ? RopeString(h.head, RopeString(h.tail, t)) : new(h, t, max(h.depth,t.depth)+1, length(h)+length(t)) RopeString(h::RopeString, t::String) = depth(h.tail) < depth(h.head) ? RopeString(h.head, RopeString(h.tail, t)) : new(h, t, h.depth+1, length(h)+length(t)) RopeString(h::String, t::RopeString) = depth(t.head) < depth(t.tail) ? RopeString(RopeString(h, t.head), t.tail) : new(h, t, t.depth+1, length(h)+length(t)) RopeString(h::String, t::String) = new(h, t, 1, length(h)+length(t)) end depth(s::String) = 0 depth(s::RopeString) = s.depth function next(s::RopeString, i::Int) if i <= length(s.head) return next(s.head, i) else c, j = next(s.tail, i-length(s.head)) return c, j+length(s.head) end end length(s::RopeString) = s.length strlen(s::RopeString) = strlen(s.head) + strlen(s.tail) strcat() = "" strcat(s::String) = s strcat(x...) = strcat(map(string,x)...) strcat(s::String, t::String...) = (t = strcat(t...); isempty(s) ? t : isempty(t) ? s : RopeString(s, t)) print(s::RopeString) = print(s.head, s.tail) ## transformed strings ## type TransformedString <: String transform::Function string::String end length(s::TransformedString) = length(s.string) strlen(s::TransformedString) = strlen(s.string) function next(s::TransformedString, i::Int) c, j = next(s.string,i) c = s.transform(c, i) return c, j end ## uppercase and lowercase transformations ## uppercase(c::Char) = ccall(:towupper, Char, (Char,), c) lowercase(c::Char) = ccall(:towlower, Char, (Char,), c) uppercase(s::String) = TransformedString((c,i)->uppercase(c), s) lowercase(s::String) = TransformedString((c,i)->lowercase(c), s) ucfirst(s::String) = TransformedString((c,i)->i==1 ? uppercase(c) : c, s) lcfirst(s::String) = TransformedString((c,i)->i==1 ? lowercase(c) : c, s) const uc = uppercase const lc = lowercase ## string map ## function map(f::Function, s::String) out = memio(length(s)) for c in s write(out, f(c)::Char) end takebuf_string(out) end ## conversion of general objects to strings ## string(x) = print_to_string(show, x) cstring(x...) = print_to_string(print, x...) function cstring(p::Ptr{Uint8}) p == C_NULL ? error("cannot convert NULL to string") : ccall(:jl_cstr_to_string, Any, (Ptr{Uint8},), p)::ByteString end ## string promotion rules ## promote_rule(::Type{UTF8String} , ::Type{ASCIIString}) = UTF8String promote_rule(::Type{UTF8String} , ::Type{CharString} ) = UTF8String promote_rule(::Type{ASCIIString}, ::Type{CharString} ) = UTF8String ## printing literal quoted string data ## # TODO: this is really the inverse of print_unbackslashed function print_quoted_literal(s::String) print('"') for c = s; c == '"' ? print("\\\"") : print(c); end print('"') end ## string escaping & unescaping ## escape_nul(s::String, i::Int) = !done(s,i) && '0' <= next(s,i)[1] <= '7' ? L"\x00" : L"\0" is_hex_digit(c::Char) = '0'<=c<='9' || 'a'<=c<='f' || 'A'<=c<='F' need_full_hex(s::String, i::Int) = !done(s,i) && is_hex_digit(next(s,i)[1]) function print_escaped(s::String, esc::String) i = start(s) while !done(s,i) c, j = next(s,i) c == '\0' ? print(escape_nul(s,j)) : c == '\e' ? print(L"\e") : c == '\\' ? print("\\\\") : contains(esc,c) ? print('\\', c) : iswprint(c) ? print(c) : 7 <= c <= 13 ? print('\\', "abtnvfr"[c-6]) : c <= '\x7f' ? print(L"\x", hex(c, 2)) : c <= '\uffff' ? print(L"\u", hex(c, need_full_hex(s,j) ? 4 : 2)) : print(L"\U", hex(c, need_full_hex(s,j) ? 8 : 4)) i = j end end escape_string(s::String) = print_to_string(length(s), print_escaped, s, "\"") print_quoted(s::String) = (print('"'); print_escaped(s, "\"\$"); print('"')) #" # work around syntax highlighting problem quote_string(s::String) = print_to_string(length(s)+2, print_quoted, s) # bare minimum unescaping function unescapes only given characters function print_unescaped_chars(s::String, esc::String) if !contains(esc,'\\') esc = strcat("\\", esc) end i = start(s) while !done(s,i) c, i = next(s,i) if c == '\\' && !done(s,i) && contains(esc,s[i]) c, i = next(s,i) end print(c) end end unescape_chars(s::String, esc::String) = print_to_string(length(s), print_unescaped_chars, s, esc) # general unescaping of traditional C and Unicode escape sequences function print_unescaped(s::String) i = start(s) while !done(s,i) c, i = next(s,i) if !done(s,i) && c == '\\' c, i = next(s,i) if c == 'x' || c == 'u' || c == 'U' n = k = 0 m = c == 'x' ? 2 : c == 'u' ? 4 : 8 while (k+=1) <= m && !done(s,i) c, j = next(s,i) n = '0' <= c <= '9' ? n<<4 + c-'0' : 'a' <= c <= 'f' ? n<<4 + c-'a'+10 : 'A' <= c <= 'F' ? n<<4 + c-'A'+10 : break i = j end if k == 1 error("\\x used with no following hex digits") end if m == 2 # \x escape sequence write(uint8(n)) else print(char(n)) end elseif '0' <= c <= '7' k = 1 n = c-'0' while (k+=1) <= 3 && !done(s,i) c, j = next(s,i) n = '0' <= c <= '7' ? n<<3 + c-'0' : break i = j end if n > 255 error("octal escape sequence out of range") end write(uint8(n)) else print(c == 'a' ? '\a' : c == 'b' ? '\b' : c == 't' ? '\t' : c == 'n' ? '\n' : c == 'v' ? '\v' : c == 'f' ? '\f' : c == 'r' ? '\r' : c == 'e' ? '\e' : c) end else print(c) end end end unescape_string(s::String) = print_to_string(length(s), print_unescaped, s) ## checking UTF-8 & ACSII validity ## byte_string_classify(s::ByteString) = ccall(:u8_isvalid, Int32, (Ptr{Uint8}, Int), s.data, length(s)) # 0: neither valid ASCII nor UTF-8 # 1: valid ASCII # 2: valid UTF-8 is_valid_ascii(s::ByteString) = byte_string_classify(s) == 1 is_valid_utf8 (s::ByteString) = byte_string_classify(s) != 0 check_ascii(s::ByteString) = is_valid_ascii(s) ? s : error("invalid ASCII sequence") check_utf8 (s::ByteString) = is_valid_utf8(s) ? s : error("invalid UTF-8 sequence") ## string interpolation parsing ## function _jl_interp_parse(s::String, unescape::Function, printer::Function) sx = {} i = j = start(s) while !done(s,j) c, k = next(s,j) if c == '$' if !isempty(s[i:j-1]) push(sx, unescape(s[i:j-1])) end ex, j = parseatom(s,k) push(sx, ex) i = j elseif c == '\\' && !done(s,k) if s[k] == '$' if !isempty(s[i:j-1]) push(sx, unescape(s[i:j-1])) end i = k end c, j = next(s,k) else j = k end end if !isempty(s[i:]) push(sx, unescape(s[i:j-1])) end length(sx) == 1 && isa(sx[1],ByteString) ? sx[1] : expr(:call, :print_to_string, printer, sx...) end _jl_interp_parse(s::String, u::Function) = _jl_interp_parse(s, u, print) _jl_interp_parse(s::String) = _jl_interp_parse(s, x->check_utf8(unescape_string(x))) function _jl_interp_parse_bytes(s::String) writer(x...) = for w=x; write(w); end _jl_interp_parse(s, unescape_string, writer) end ## core string macros ## macro str(s); _jl_interp_parse(s); end macro S_str(s); _jl_interp_parse(s); end macro I_str(s); _jl_interp_parse(s, x->unescape_chars(x,"\"")); end macro E_str(s); check_utf8(unescape_string(s)); end macro B_str(s); _jl_interp_parse_bytes(s); end macro b_str(s); ex = _jl_interp_parse_bytes(s); :(($ex).data); end ## shell-like command parsing ## function _jl_shell_parse(s::String, interp::Bool) in_single_quotes = false in_double_quotes = false args = {} arg = {} i = start(s) j = i function update_arg(x) if !isa(x,String) || !isempty(x) push(arg, x) end end function append_arg() if isempty(arg); arg = {"",}; end push(args, arg) arg = {} end while !done(s,j) c, k = next(s,j) if !in_single_quotes && !in_double_quotes && iswspace(c) update_arg(s[i:j-1]) append_arg() j = k while !done(s,j) c, k = next(s,j) if !iswspace(c) i = j break end j = k end elseif interp && !in_single_quotes && c == '$' update_arg(s[i:j-1]); i = k; j = k if done(s,k) error("\$ right before end of command") end if iswspace(s[k]) error("space not allowed right after \$") end ex, j = parseatom(s,j) update_arg(ex); i = j else if !in_double_quotes && c == '\'' in_single_quotes = !in_single_quotes update_arg(s[i:j-1]); i = k elseif !in_single_quotes && c == '"' in_double_quotes = !in_double_quotes update_arg(s[i:j-1]); i = k elseif c == '\\' if in_double_quotes if done(s,k) error("unterminated double quote") end if s[k] == '"' || s[k] == '$' update_arg(s[i:j-1]); i = k c, k = next(s,k) end elseif !in_single_quotes if done(s,k) error("dangling backslash") end update_arg(s[i:j-1]); i = k c, k = next(s,k) end end j = k end end if in_single_quotes; error("unterminated single quote"); end if in_double_quotes; error("unterminated double quote"); end update_arg(s[i:]) append_arg() if !interp return args end # construct an expression exprs = {} for arg in args push(exprs, expr(:tuple, arg)) end expr(:tuple,exprs) end _jl_shell_parse(s::String) = _jl_shell_parse(s,true) function shell_split(s::String) parsed = _jl_shell_parse(s,false) args = String[] for arg in parsed push(args, strcat(arg...)) end args end function print_shell_word(word::String) if isempty(word) print("''") end has_single = false has_special = false for c in word if iswspace(c) || c=='\\' || c=='\'' || c=='"' || c=='$' has_special = true if c == '\'' has_single = true end end end if !has_special print(word) elseif !has_single print('\'', word, '\'') else print('"') for c in word if c == '"' || c == '$' print('\\') end print(c) end print('"') end end function print_shell_escaped(cmd::String, args::String...) print_shell_word(cmd) for arg in args print(' ') print_shell_word(arg) end end shell_escape(cmd::String, args::String...) = print_to_string(print_shell_escaped, cmd, args...) ## interface to parser ## function parse(s::String, pos, greedy) # returns (expr, end_pos). expr is () in case of parse error. ex, pos = ccall(:jl_parse_string, Any, (Ptr{Uint8}, Int32, Int32), cstring(s), pos-1, greedy ? 1:0) if isa(ex,Expr) && is(ex.head,:error) throw(ParseError(ex.args[1])) end if ex == (); throw(ParseError("end of input")); end ex, pos+1 # C is zero-based, Julia is 1-based end parse(s::String) = parse(s, 1, true) parse(s::String, pos) = parse(s, pos, true) parseatom(s::String) = parse(s, 1, false) parseatom(s::String, pos) = parse(s, pos, false) ## miscellaneous string functions ## function lpad(s::String, n::Integer, p::String) m = n - strlen(s) if m <= 0; return s; end l = strlen(p) if l==1 return p^m * s end q = div(m,l) r = m - q*l cstring(p^q*p[1:chr2ind(p,r)]*s) end function rpad(s::String, n::Integer, p::String) m = n - strlen(s) if m <= 0; return s; end l = strlen(p) if l==1 return s * p^m end q = div(m,l) r = m - q*l cstring(s*p^q*p[1:chr2ind(p,r)]) end lpad(s, n::Integer, p) = lpad(string(s), n, string(p)) rpad(s, n::Integer, p) = rpad(string(s), n, string(p)) lpad(s, n::Integer) = lpad(string(s), n, " ") rpad(s, n::Integer) = rpad(string(s), n, " ") function split(s::String, delims, include_empty::Bool) i = 1 strs = String[] len = length(s) while true tokstart = tokend = i while !done(s,i) (c,i) = next(s,i) if contains(delims, c) break end tokend = i end tok = s[tokstart:(tokend-1)] if include_empty || !isempty(tok) push(strs, tok) end if !((i <= len) || (i==len+1 && tokend!=i)) break end end strs end split(s::String) = split(s, (' ','\t','\n','\v','\f','\r'), false) split(s::String, x) = split(s, x, true) split(s::String, x::Char, incl::Bool) = split(s, (x,), incl) function print_joined(strings, delim, last) i = start(strings) if done(strings,i) return end str, i = next(strings,i) print(str) while !done(strings,i) str, i = next(strings,i) print(done(strings,i) ? last : delim) print(str) end end function print_joined(strings, delim) i = start(strings) while !done(strings,i) str, i = next(strings,i) print(str) if !done(strings,i) print(delim) end end end print_joined(strings) = print_joined(strings, "") join(args...) = print_to_string(print_joined, args...) chop(s::String) = s[1:thisind(s,length(s))-1] chomp(s::String) = (i=thisind(s,length(s)); s[i]=='\n' ? s[1:i-1] : s) chomp(s::ByteString) = s.data[end]==0x0a ? s[1:end-1] : s function lstrip(s::String) i = start(s) while !done(s,i) c, j = next(s,i) if !iswspace(c) return s[i:end] end i = j end "" end function rstrip(s::String) r = reverse(s) i = start(r) while !done(r,i) c, j = next(r,i) if !iswspace(c) return s[1:end-i+1] end i = j end "" end strip(s::String) = lstrip(rstrip(s)) ## string to integer functions ## function parse_int{T<:Integer}(::Type{T}, s::String, base::Integer) if !(2 <= base <= 36); error("invalid base: ",base); end i = start(s) if done(s,i) error("premature end of integer (in ",show_to_string(s),")") end c,i = next(s,i) sgn = one(T) if T <: Signed && c == '-' sgn = -sgn if done(s,i) error("premature end of integer (in ",show_to_string(s),")") end c,i = next(s,i) end base = convert(T,base) n::T = 0 while true d = '0' <= c <= '9' ? c-'0' : 'A' <= c <= 'Z' ? c-'A'+10 : 'a' <= c <= 'z' ? c-'a'+10 : typemax(Int) if d >= base error(show_to_string(c)," is not a valid digit (in ",show_to_string(s),")") end # TODO: overflow detection? n = n*base + d if done(s,i) break end c,i = next(s,i) end return flipsign(n,sgn) end parse_int(s::String, base::Integer) = parse_int(Int,s,base) parse_int(T::Type, s::String) = parse_int(T,s,10) parse_int(s::String) = parse_int(Int,s,10) parse_bin(T::Type, s::String) = parse_int(T,s,2) parse_oct(T::Type, s::String) = parse_int(T,s,8) parse_hex(T::Type, s::String) = parse_int(T,s,16) parse_bin(s::String) = parse_int(Int,s,2) parse_oct(s::String) = parse_int(Int,s,8) parse_hex(s::String) = parse_int(Int,s,16) integer (s::String) = int(s) unsigned(s::String) = uint(s) int (s::String) = parse_int(Int,s) uint (s::String) = parse_int(Uint,s) int8 (s::String) = parse_int(Int8,s) uint8 (s::String) = parse_int(Uint8,s) int16 (s::String) = parse_int(Int16,s) uint16 (s::String) = parse_int(Uint16,s) int32 (s::String) = parse_int(Int32,s) uint32 (s::String) = parse_int(Uint32,s) int64 (s::String) = parse_int(Int64,s) uint64 (s::String) = parse_int(Uint64,s) ## integer to string functions ## const _jl_dig_syms = "0123456789abcdefghijklmnopqrstuvwxyz".data function int2str(n::Union(Int64,Uint64), b::Integer, l::Int) if b < 2 || b > 36; error("int2str: invalid base ", b); end neg = n < 0 n = unsigned(abs(n)) b = convert(typeof(n), b) ndig = ndigits(n, b) sz = max(convert(Int, ndig), l) + neg data = Array(Uint8, sz) i = sz if ispow2(b) digmask = b-1 shift = trailing_zeros(b) while i > neg ch = n & digmask data[i] = _jl_dig_syms[int(ch)+1] n >>= shift i -= 1 end else while i > neg ch = n % b data[i] = _jl_dig_syms[int(ch)+1] n = div(n,b) i -= 1 end end if neg data[1] = '-' end ASCIIString(data) end int2str(n::Integer, b::Integer) = int2str(n, b, 0) int2str(n::Integer, b::Integer, l::Int) = int2str(int64(n), b, l) string(x::Signed) = dec(int64(x)) cstring(x::Signed) = dec(int64(x)) ## string to float functions ## function float64_isvalid(s::String, out::Array{Float64,1}) s = cstring(s) return (ccall(:jl_strtod, Int32, (Ptr{Uint8},Ptr{Float64}), s, out)==0) end function float32_isvalid(s::String, out::Array{Float32,1}) s = cstring(s) return (ccall(:jl_strtof, Int32, (Ptr{Uint8},Ptr{Float32}), s, out)==0) end begin local tmp::Array{Float64,1} = Array(Float64,1) local tmpf::Array{Float32,1} = Array(Float32,1) global float64, float32 function float64(s::String) if !float64_isvalid(s, tmp) throw(ArgumentError("float64(String): invalid number format")) end return tmp[1] end function float32(s::String) if !float32_isvalid(s, tmpf) throw(ArgumentError("float32(String): invalid number format")) end return tmpf[1] end end float(x::String) = float64(x) parse_float(x::String) = float64(x) parse_float(::Type{Float64}, x::String) = float64(x) parse_float(::Type{Float32}, x::String) = float32(x) # copying a byte string (generally not needed due to "immutability") strcpy{T<:ByteString}(s::T) = T(copy(s.data)) # lexicographically compare byte arrays (used by Latin-1 and UTF-8) function lexcmp(a::Array{Uint8,1}, b::Array{Uint8,1}) c = ccall(:memcmp, Int32, (Ptr{Uint8}, Ptr{Uint8}, Uint), a, b, min(length(a),length(b))) c < 0 ? -1 : c > 0 ? +1 : cmp(length(a),length(b)) end # find the index of the first occurrence of a byte value in a byte array function memchr(a::Array{Uint8,1}, b::Integer) p = pointer(a) q = ccall(:memchr, Ptr{Uint8}, (Ptr{Uint8}, Int32, Uint), p, b, length(a)) q == C_NULL ? 0 : q - p + 1 end # concatenate byte arrays into a single array memcat() = Array(Uint8,0) memcat(a::Array{Uint8,1}) = copy(a) function memcat(arrays::Array{Uint8,1}...) n = 0 for a in arrays n += length(a) end arr = Array(Uint8, n) ptr = pointer(arr) offset = 0 for a in arrays ccall(:memcpy, Ptr{Uint8}, (Ptr{Uint8}, Ptr{Uint8}, Uint), ptr+offset, a, length(a)) offset += length(a) end return arr end # concatenate the data fields of byte strings memcat(s::ByteString) = memcat(s.data) memcat(sx::ByteString...) = memcat(map(s->s.data, sx)...) ---tokens--- '## core string functions ##' Comment '\n' Text '\n' Text 'length' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'error' Name '(' Punctuation '"' Literal.String 'y' Literal.String 'o' Literal.String 'u' Literal.String ' ' Literal.String 'm' Literal.String 'u' Literal.String 's' Literal.String 't' Literal.String ' ' Literal.String 'i' Literal.String 'm' Literal.String 'p' Literal.String 'l' Literal.String 'e' Literal.String 'm' Literal.String 'e' Literal.String 'n' Literal.String 't' Literal.String ' ' Literal.String 'l' Literal.String 'e' Literal.String 'n' Literal.String 'g' Literal.String 't' Literal.String 'h' Literal.String '(' Literal.String '"' Literal.String ',' Punctuation 'typeof' Name '(' Punctuation 's' Name ')' Punctuation ',' Punctuation '"' Literal.String ')' Literal.String '"' Literal.String ')' Punctuation '\n' Text 'next' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'i' Name '::' Operator 'Int' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'error' Name '(' Punctuation '"' Literal.String 'y' Literal.String 'o' Literal.String 'u' Literal.String ' ' Literal.String 'm' Literal.String 'u' Literal.String 's' Literal.String 't' Literal.String ' ' Literal.String 'i' Literal.String 'm' Literal.String 'p' Literal.String 'l' Literal.String 'e' Literal.String 'm' Literal.String 'e' Literal.String 'n' Literal.String 't' Literal.String ' ' Literal.String 'n' Literal.String 'e' Literal.String 'x' Literal.String 't' Literal.String '(' Literal.String '"' Literal.String ',' Punctuation 'typeof' Name '(' Punctuation 's' Name ')' Punctuation ',' Punctuation '"' Literal.String ',' Literal.String 'I' Literal.String 'n' Literal.String 't' Literal.String ')' Literal.String '"' Literal.String ')' Punctuation '\n' Text 'next' Name '(' Punctuation 's' Name '::' Operator 'DirectIndexString' Keyword.Type ',' Punctuation ' ' Text 'i' Name '::' Operator 'Int' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text '(' Punctuation 's' Name '[' Punctuation 'i' Name ']' Punctuation ',' Punctuation 'i' Name '+' Operator '1' Literal.Number.Integer ')' Punctuation '\n' Text 'next' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'i' Name '::' Operator 'Integer' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 's' Name ',' Punctuation 'int' Name '(' Punctuation 'i' Name ')' Punctuation ')' Punctuation '\n' Text '\n' Text '## generic supplied functions ##' Comment '\n' Text '\n' Text 'start' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text '1' Literal.Number.Integer '\n' Text 'done' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation 'i' Name ')' Punctuation ' ' Text '=' Operator ' ' Text '(' Punctuation 'i' Name ' ' Text '>' Operator ' ' Text 'length' Name '(' Punctuation 's' Name ')' Punctuation ')' Punctuation '\n' Text 'isempty' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'done' Name '(' Punctuation 's' Name ',' Punctuation 'start' Name '(' Punctuation 's' Name ')' Punctuation ')' Punctuation '\n' Text 'ref' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'i' Name '::' Operator 'Int' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation '[' Punctuation '1' Literal.Number.Integer ']' Punctuation '\n' Text 'ref' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'i' Name '::' Operator 'Integer' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 's' Name '[' Punctuation 'int' Name '(' Punctuation 'i' Name ')' Punctuation ']' Punctuation '\n' Text 'ref' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'x' Name '::' Operator 'Real' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 's' Name '[' Punctuation 'iround' Name '(' Punctuation 'x' Name ')' Punctuation ']' Punctuation '\n' Text 'ref' Name '{' Punctuation 'T' Name '<:' Operator 'Integer' Keyword.Type '}' Punctuation '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'r' Name '::' Operator 'Range1' Name '{' Punctuation 'T' Name '}' Punctuation ')' Punctuation ' ' Text '=' Operator ' ' Text 's' Name '[' Punctuation 'int' Name '(' Punctuation 'first' Name '(' Punctuation 'r' Name ')' Punctuation ')' Punctuation ':' Operator 'int' Name '(' Punctuation 'last' Name '(' Punctuation 'r' Name ')' Punctuation ')' Punctuation ']' Punctuation '\n' Text '\n' Text 'symbol' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'symbol' Name '(' Punctuation 'cstring' Name '(' Punctuation 's' Name ')' Punctuation ')' Punctuation '\n' Text 'string' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 's' Name '\n' Text '\n' Text 'print' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'for' Keyword ' ' Text 'c' Name '=' Operator 's' Name ';' Punctuation ' ' Text 'print' Name '(' Punctuation 'c' Name ')' Punctuation ';' Punctuation ' ' Text 'end' Keyword '\n' Text 'print' Name '(' Punctuation 'x' Name '.' Operator '.' Operator '.' Operator ')' Punctuation ' ' Text '=' Operator ' ' Text 'for' Keyword ' ' Text 'i' Name '=' Operator 'x' Name ';' Punctuation ' ' Text 'print' Name '(' Punctuation 'i' Name ')' Punctuation ';' Punctuation ' ' Text 'end' Keyword '\n' Text 'println' Name '(' Punctuation 'args' Name '.' Operator '.' Operator '.' Operator ')' Punctuation ' ' Text '=' Operator ' ' Text 'print' Name '(' Punctuation 'args' Name '.' Operator '.' Operator '.' Operator ',' Punctuation ' ' Text "'\\n'" Literal.String.Char ')' Punctuation '\n' Text '\n' Text 'show' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'print_quoted' Name '(' Punctuation 's' Name ')' Punctuation '\n' Text '\n' Text '(' Punctuation '*' Operator ')' Punctuation '(' Punctuation 's' Name '::' Operator 'String' Name '.' Operator '.' Operator '.' Operator ')' Punctuation ' ' Text '=' Operator ' ' Text 'strcat' Name '(' Punctuation 's' Name '.' Operator '.' Operator '.' Operator ')' Punctuation '\n' Text '(' Punctuation '^' Operator ')' Punctuation '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'r' Name '::' Operator 'Integer' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'repeat' Name '(' Punctuation 's' Name ',' Punctuation 'r' Name ')' Punctuation '\n' Text '\n' Text 'size' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text '(' Punctuation 'length' Name '(' Punctuation 's' Name ')' Punctuation ',' Punctuation ')' Punctuation '\n' Text 'size' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'd' Name '::' Operator 'Integer' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'd' Name '==' Operator '1' Literal.Number.Integer ' ' Text '?' Operator ' ' Text 'length' Name '(' Punctuation 's' Name ')' Punctuation ' ' Text ':' Operator '\n' Text ' ' Text 'error' Name '(' Punctuation '"' Literal.String 'i' Literal.String 'n' Literal.String ' ' Literal.String 's' Literal.String 'i' Literal.String 'z' Literal.String 'e' Literal.String ':' Literal.String ' ' Literal.String 'd' Literal.String 'i' Literal.String 'm' Literal.String 'e' Literal.String 'n' Literal.String 's' Literal.String 'i' Literal.String 'o' Literal.String 'n' Literal.String ' ' Literal.String '"' Literal.String ',' Punctuation 'd' Name ',' Punctuation '"' Literal.String ' ' Literal.String 'o' Literal.String 'u' Literal.String 't' Literal.String ' ' Literal.String 'o' Literal.String 'f' Literal.String ' ' Literal.String 'r' Literal.String 'a' Literal.String 'n' Literal.String 'g' Literal.String 'e' Literal.String '"' Literal.String ')' Punctuation '\n' Text '\n' Text 'strlen' Name '(' Punctuation 's' Name '::' Operator 'DirectIndexString' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'length' Name '(' Punctuation 's' Name ')' Punctuation '\n' Text 'function' Keyword ' ' Text 'strlen' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation '\n' Text ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'start' Name '(' Punctuation 's' Name ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text 'done' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'return' Keyword ' ' Text '0' Literal.Number.Integer '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'n' Name ' ' Text '=' Operator ' ' Text '1' Literal.Number.Integer '\n' Text ' ' Text 'while' Keyword ' ' Text 'true' Keyword.Constant '\n' Text ' ' Text 'c' Name ',' Punctuation ' ' Text 'j' Name ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text 'done' Name '(' Punctuation 's' Name ',' Punctuation 'j' Name ')' Punctuation '\n' Text ' ' Text 'return' Keyword ' ' Text 'n' Name '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'n' Name ' ' Text '+=' Operator ' ' Text '1' Literal.Number.Integer '\n' Text ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'j' Name '\n' Text ' ' Text 'end' Keyword '\n' Text 'end' Keyword '\n' Text '\n' Text 'isvalid' Name '(' Punctuation 's' Name '::' Operator 'DirectIndexString' Keyword.Type ',' Punctuation ' ' Text 'i' Name '::' Operator 'Integer' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text '(' Punctuation 'start' Name '(' Punctuation 's' Name ')' Punctuation ' ' Text '<=' Operator ' ' Text 'i' Name ' ' Text '<=' Operator ' ' Text 'length' Name '(' Punctuation 's' Name ')' Punctuation ')' Punctuation '\n' Text 'function' Keyword ' ' Text 'isvalid' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'i' Name '::' Operator 'Integer' Keyword.Type ')' Punctuation '\n' Text ' ' Text 'try' Keyword '\n' Text ' ' Text 'next' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'true' Keyword.Constant '\n' Text ' ' Text 'catch' Keyword '\n' Text ' ' Text 'false' Keyword.Constant '\n' Text ' ' Text 'end' Keyword '\n' Text 'end' Keyword '\n' Text '\n' Text 'prevind' Name '(' Punctuation 's' Name '::' Operator 'DirectIndexString' Keyword.Type ',' Punctuation ' ' Text 'i' Name '::' Operator 'Integer' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'i' Name '-' Operator '1' Literal.Number.Integer '\n' Text 'thisind' Name '(' Punctuation 's' Name '::' Operator 'DirectIndexString' Keyword.Type ',' Punctuation ' ' Text 'i' Name '::' Operator 'Integer' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'i' Name '\n' Text 'nextind' Name '(' Punctuation 's' Name '::' Operator 'DirectIndexString' Keyword.Type ',' Punctuation ' ' Text 'i' Name '::' Operator 'Integer' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'i' Name '+' Operator '1' Literal.Number.Integer '\n' Text '\n' Text 'prevind' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'i' Name '::' Operator 'Integer' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'thisind' Name '(' Punctuation 's' Name ',' Punctuation 'thisind' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation '-' Operator '1' Literal.Number.Integer ')' Punctuation '\n' Text '\n' Text 'function' Keyword ' ' Text 'thisind' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'i' Name '::' Operator 'Integer' Keyword.Type ')' Punctuation '\n' Text ' ' Text 'for' Keyword ' ' Text 'j' Name ' ' Text '=' Operator ' ' Text 'i' Name ':' Operator '-' Operator '1' Literal.Number.Integer ':' Operator '1' Literal.Number.Integer '\n' Text ' ' Text 'if' Keyword ' ' Text 'isvalid' Name '(' Punctuation 's' Name ',' Punctuation 'j' Name ')' Punctuation '\n' Text ' ' Text 'return' Keyword ' ' Text 'j' Name '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'return' Keyword ' ' Text '0' Literal.Number.Integer ' ' Text '# out of range' Comment '\n' Text 'end' Keyword '\n' Text '\n' Text 'function' Keyword ' ' Text 'nextind' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'i' Name '::' Operator 'Integer' Keyword.Type ')' Punctuation '\n' Text ' ' Text 'for' Keyword ' ' Text 'j' Name ' ' Text '=' Operator ' ' Text 'i' Name '+' Operator '1' Literal.Number.Integer ':' Operator 'length' Name '(' Punctuation 's' Name ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text 'isvalid' Name '(' Punctuation 's' Name ',' Punctuation 'j' Name ')' Punctuation '\n' Text ' ' Text 'return' Keyword ' ' Text 'j' Name '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'length' Name '(' Punctuation 's' Name ')' Punctuation '+' Operator '1' Literal.Number.Integer ' ' Text '# out of range' Comment '\n' Text 'end' Keyword '\n' Text '\n' Text 'ind2chr' Name '(' Punctuation 's' Name '::' Operator 'DirectIndexString' Keyword.Type ',' Punctuation ' ' Text 'i' Name '::' Operator 'Integer' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'i' Name '\n' Text 'chr2ind' Name '(' Punctuation 's' Name '::' Operator 'DirectIndexString' Keyword.Type ',' Punctuation ' ' Text 'i' Name '::' Operator 'Integer' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'i' Name '\n' Text '\n' Text 'function' Keyword ' ' Text 'ind2chr' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'i' Name '::' Operator 'Integer' Keyword.Type ')' Punctuation '\n' Text ' ' Text 's' Name '[' Punctuation 'i' Name ']' Punctuation ' ' Text '# throws error if invalid' Comment '\n' Text ' ' Text 'j' Name ' ' Text '=' Operator ' ' Text '1' Literal.Number.Integer '\n' Text ' ' Text 'k' Name ' ' Text '=' Operator ' ' Text 'start' Name '(' Punctuation 's' Name ')' Punctuation '\n' Text ' ' Text 'while' Keyword ' ' Text 'true' Keyword.Constant '\n' Text ' ' Text 'c' Name ',' Punctuation ' ' Text 'l' Name ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 's' Name ',' Punctuation 'k' Name ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text 'i' Name ' ' Text '<=' Operator ' ' Text 'k' Name '\n' Text ' ' Text 'return' Keyword ' ' Text 'j' Name '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'j' Name ' ' Text '+=' Operator ' ' Text '1' Literal.Number.Integer '\n' Text ' ' Text 'k' Name ' ' Text '=' Operator ' ' Text 'l' Name '\n' Text ' ' Text 'end' Keyword '\n' Text 'end' Keyword '\n' Text '\n' Text 'function' Keyword ' ' Text 'chr2ind' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'i' Name '::' Operator 'Integer' Keyword.Type ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text 'i' Name ' ' Text '<' Operator ' ' Text '1' Literal.Number.Integer '\n' Text ' ' Text 'return' Keyword ' ' Text 'i' Name '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'j' Name ' ' Text '=' Operator ' ' Text '1' Literal.Number.Integer '\n' Text ' ' Text 'k' Name ' ' Text '=' Operator ' ' Text 'start' Name '(' Punctuation 's' Name ')' Punctuation '\n' Text ' ' Text 'while' Keyword ' ' Text 'true' Keyword.Constant '\n' Text ' ' Text 'c' Name ',' Punctuation ' ' Text 'l' Name ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 's' Name ',' Punctuation 'k' Name ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text 'i' Name ' ' Text '==' Operator ' ' Text 'j' Name '\n' Text ' ' Text 'return' Keyword ' ' Text 'k' Name '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'j' Name ' ' Text '+=' Operator ' ' Text '1' Literal.Number.Integer '\n' Text ' ' Text 'k' Name ' ' Text '=' Operator ' ' Text 'l' Name '\n' Text ' ' Text 'end' Keyword '\n' Text 'end' Keyword '\n' Text '\n' Text 'function' Keyword ' ' Text 'strchr' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'c' Name '::' Operator 'Char' Keyword.Type ',' Punctuation ' ' Text 'i' Name '::' Operator 'Integer' Keyword.Type ')' Punctuation '\n' Text ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'nextind' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'while' Keyword ' ' Text '!' Operator 'done' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'd' Name ',' Punctuation ' ' Text 'j' Name ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text 'c' Name ' ' Text '==' Operator ' ' Text 'd' Name '\n' Text ' ' Text 'return' Keyword ' ' Text 'i' Name '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'j' Name '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'return' Keyword ' ' Text '0' Literal.Number.Integer '\n' Text 'end' Keyword '\n' Text 'strchr' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'c' Name '::' Operator 'Char' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'strchr' Name '(' Punctuation 's' Name ',' Punctuation ' ' Text 'c' Name ',' Punctuation ' ' Text 'start' Name '(' Punctuation 's' Name ')' Punctuation ')' Punctuation '\n' Text 'contains' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'c' Name '::' Operator 'Char' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text '(' Punctuation 'strchr' Name '(' Punctuation 's' Name ',' Punctuation 'c' Name ')' Punctuation '!=' Operator '0' Literal.Number.Integer ')' Punctuation '\n' Text '\n' Text 'function' Keyword ' ' Text 'chars' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation '\n' Text ' ' Text 'cx' Name ' ' Text '=' Operator ' ' Text 'Array' Keyword.Type '(' Punctuation 'Char' Keyword.Type ',' Punctuation 'strlen' Name '(' Punctuation 's' Name ')' Punctuation ')' Punctuation '\n' Text ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text '0' Literal.Number.Integer '\n' Text ' ' Text 'for' Keyword ' ' Text 'c' Name ' ' Text 'in' Keyword.Pseudo ' ' Text 's' Name '\n' Text ' ' Text 'cx' Name '[' Punctuation 'i' Name ' ' Text '+=' Operator ' ' Text '1' Literal.Number.Integer ']' Punctuation ' ' Text '=' Operator ' ' Text 'c' Name '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'return' Keyword ' ' Text 'cx' Name '\n' Text 'end' Keyword '\n' Text '\n' Text 'function' Keyword ' ' Text 'cmp' Name '(' Punctuation 'a' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'b' Name '::' Operator 'String' Name ')' Punctuation '\n' Text ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'start' Name '(' Punctuation 'a' Name ')' Punctuation '\n' Text ' ' Text 'j' Name ' ' Text '=' Operator ' ' Text 'start' Name '(' Punctuation 'b' Name ')' Punctuation '\n' Text ' ' Text 'while' Keyword ' ' Text '!' Operator 'done' Name '(' Punctuation 'a' Name ',' Punctuation 'i' Name ')' Punctuation ' ' Text '&&' Operator ' ' Text '!' Operator 'done' Name '(' Punctuation 'b' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'c' Name ',' Punctuation ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 'a' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'd' Name ',' Punctuation ' ' Text 'j' Name ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 'b' Name ',' Punctuation 'j' Name ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text 'c' Name ' ' Text '!=' Operator ' ' Text 'd' Name '\n' Text ' ' Text 'return' Keyword ' ' Text 'c' Name ' ' Text '<' Operator ' ' Text 'd' Name ' ' Text '?' Operator ' ' Text '-' Operator '1' Literal.Number.Integer ' ' Text ':' Operator ' ' Text '+' Operator '1' Literal.Number.Integer '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'done' Name '(' Punctuation 'a' Name ',' Punctuation 'i' Name ')' Punctuation ' ' Text '&&' Operator ' ' Text '!' Operator 'done' Name '(' Punctuation 'b' Name ',' Punctuation 'j' Name ')' Punctuation ' ' Text '?' Operator ' ' Text '-' Operator '1' Literal.Number.Integer ' ' Text ':' Operator '\n' Text ' ' Text '!' Operator 'done' Name '(' Punctuation 'a' Name ',' Punctuation 'i' Name ')' Punctuation ' ' Text '&&' Operator ' ' Text 'done' Name '(' Punctuation 'b' Name ',' Punctuation 'j' Name ')' Punctuation ' ' Text '?' Operator ' ' Text '+' Operator '1' Literal.Number.Integer ' ' Text ':' Operator ' ' Text '0' Literal.Number.Integer '\n' Text 'end' Keyword '\n' Text '\n' Text 'isequal' Name '(' Punctuation 'a' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'b' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'cmp' Name '(' Punctuation 'a' Name ',' Punctuation 'b' Name ')' Punctuation ' ' Text '==' Operator ' ' Text '0' Literal.Number.Integer '\n' Text 'isless' Name '(' Punctuation 'a' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'b' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'cmp' Name '(' Punctuation 'a' Name ',' Punctuation 'b' Name ')' Punctuation ' ' Text '<' Operator ' ' Text '0' Literal.Number.Integer '\n' Text '\n' Text '# faster comparisons for byte strings' Comment '\n' Text '\n' Text 'cmp' Name '(' Punctuation 'a' Name '::' Operator 'ByteString' Name ',' Punctuation ' ' Text 'b' Name '::' Operator 'ByteString' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'lexcmp' Name '(' Punctuation 'a' Name '.' Operator 'data' Name ',' Punctuation ' ' Text 'b' Name '.' Operator 'data' Name ')' Punctuation '\n' Text 'isequal' Name '(' Punctuation 'a' Name '::' Operator 'ByteString' Name ',' Punctuation ' ' Text 'b' Name '::' Operator 'ByteString' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'length' Name '(' Punctuation 'a' Name ')' Punctuation '==' Operator 'length' Name '(' Punctuation 'b' Name ')' Punctuation ' ' Text '&&' Operator ' ' Text 'cmp' Name '(' Punctuation 'a' Name ',' Punctuation 'b' Name ')' Punctuation '==' Operator '0' Literal.Number.Integer '\n' Text '\n' Text '## character column width function ##' Comment '\n' Text '\n' Text 'charwidth' Name '(' Punctuation 'c' Name '::' Operator 'Char' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'max' Name '(' Punctuation '0' Literal.Number.Integer ',' Punctuation 'int' Name '(' Punctuation 'ccall' Keyword '(' Punctuation ':' Operator 'wcwidth' Name ',' Punctuation ' ' Text 'Int32' Keyword.Type ',' Punctuation ' ' Text '(' Punctuation 'Char' Keyword.Type ',' Punctuation ')' Punctuation ',' Punctuation ' ' Text 'c' Name ')' Punctuation ')' Punctuation ')' Punctuation '\n' Text 'strwidth' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text '(' Punctuation 'w' Name '=' Operator '0' Literal.Number.Integer ';' Punctuation ' ' Text 'for' Keyword ' ' Text 'c' Name ' ' Text 'in' Keyword.Pseudo ' ' Text 's' Name ';' Punctuation ' ' Text 'w' Name ' ' Text '+=' Operator ' ' Text 'charwidth' Name '(' Punctuation 'c' Name ')' Punctuation ';' Punctuation ' ' Text 'end' Keyword ';' Punctuation ' ' Text 'w' Name ')' Punctuation '\n' Text 'strwidth' Name '(' Punctuation 's' Name '::' Operator 'ByteString' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'ccall' Keyword '(' Punctuation ':' Operator 'u8_strwidth' Name ',' Punctuation ' ' Text 'Int' Keyword.Type ',' Punctuation ' ' Text '(' Punctuation 'Ptr' Keyword.Type '{' Punctuation 'Uint8' Name '}' Punctuation ',' Punctuation ')' Punctuation ',' Punctuation ' ' Text 's' Name '.' Operator 'data' Name ')' Punctuation '\n' Text '# TODO: implement and use u8_strnwidth that takes a length argument' Comment '\n' Text '\n' Text '## generic string uses only length and next ##' Comment '\n' Text '\n' Text 'type' Keyword ' ' Text 'GenericString' Name ' ' Text '<:' Operator ' ' Text 'String' Name '\n' Text ' ' Text 'string' Name '::' Operator 'String' Name '\n' Text 'end' Keyword '\n' Text '\n' Text 'length' Name '(' Punctuation 's' Name '::' Operator 'GenericString' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'length' Name '(' Punctuation 's' Name '.' Operator 'string' Name ')' Punctuation '\n' Text 'next' Name '(' Punctuation 's' Name '::' Operator 'GenericString' Name ',' Punctuation ' ' Text 'i' Name '::' Operator 'Int' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 's' Name '.' Operator 'string' Name ',' Punctuation ' ' Text 'i' Name ')' Punctuation '\n' Text '\n' Text '## plain old character arrays ##' Comment '\n' Text '\n' Text 'type' Keyword ' ' Text 'CharString' Name ' ' Text '<:' Operator ' ' Text 'String' Name '\n' Text ' ' Text 'chars' Name '::' Operator 'Array' Keyword.Type '{' Punctuation 'Char' Keyword.Type ',' Punctuation '1' Literal.Number.Integer '}' Punctuation '\n' Text '\n' Text ' ' Text 'CharString' Name '(' Punctuation 'a' Name '::' Operator 'Array' Keyword.Type '{' Punctuation 'Char' Keyword.Type ',' Punctuation '1' Literal.Number.Integer '}' Punctuation ')' Punctuation ' ' Text '=' Operator ' ' Text 'new' Name '(' Punctuation 'a' Name ')' Punctuation '\n' Text ' ' Text 'CharString' Name '(' Punctuation 'c' Name '::' Operator 'Char' Keyword.Type '.' Operator '.' Operator '.' Operator ')' Punctuation ' ' Text '=' Operator ' ' Text 'new' Name '(' Punctuation '[' Punctuation ' ' Text 'c' Name '[' Punctuation 'i' Name ']' Punctuation ' ' Text '|' Operator ' ' Text 'i' Name '=' Operator '1' Literal.Number.Integer ':' Operator 'length' Name '(' Punctuation 'c' Name ')' Punctuation ' ' Text ']' Punctuation ')' Punctuation '\n' Text 'end' Keyword '\n' Text 'CharString' Name '(' Punctuation 'x' Name '.' Operator '.' Operator '.' Operator ')' Punctuation ' ' Text '=' Operator ' ' Text 'CharString' Name '(' Punctuation 'map' Name '(' Punctuation 'char' Name ',' Punctuation 'x' Name ')' Punctuation '.' Operator '.' Operator '.' Operator ')' Punctuation '\n' Text '\n' Text 'next' Name '(' Punctuation 's' Name '::' Operator 'CharString' Name ',' Punctuation ' ' Text 'i' Name '::' Operator 'Int' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text '(' Punctuation 's' Name '.' Operator 'chars' Name '[' Punctuation 'i' Name ']' Punctuation ',' Punctuation ' ' Text 'i' Name '+' Operator '1' Literal.Number.Integer ')' Punctuation '\n' Text 'length' Name '(' Punctuation 's' Name '::' Operator 'CharString' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'length' Name '(' Punctuation 's' Name '.' Operator 'chars' Name ')' Punctuation '\n' Text 'strlen' Name '(' Punctuation 's' Name '::' Operator 'CharString' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'length' Name '(' Punctuation 's' Name ')' Punctuation '\n' Text '\n' Text 'string' Name '(' Punctuation 'c' Name '::' Operator 'Char' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'CharString' Name '(' Punctuation 'c' Name ')' Punctuation '\n' Text 'string' Name '(' Punctuation 'c' Name '::' Operator 'Char' Keyword.Type ',' Punctuation ' ' Text 'x' Name '::' Operator 'Char' Keyword.Type '.' Operator '.' Operator '.' Operator ')' Punctuation ' ' Text '=' Operator ' ' Text 'CharString' Name '(' Punctuation 'c' Name ',' Punctuation ' ' Text 'x' Name '.' Operator '.' Operator '.' Operator ')' Punctuation '\n' Text '\n' Text '## substrings reference original strings ##' Comment '\n' Text '\n' Text 'type' Keyword ' ' Text 'SubString' Keyword.Type ' ' Text '<:' Operator ' ' Text 'String' Name '\n' Text ' ' Text 'string' Name '::' Operator 'String' Name '\n' Text ' ' Text 'offset' Name '::' Operator 'Int' Keyword.Type '\n' Text ' ' Text 'length' Name '::' Operator 'Int' Keyword.Type '\n' Text '\n' Text ' ' Text 'SubString' Keyword.Type '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'i' Name '::' Operator 'Int' Keyword.Type ',' Punctuation ' ' Text 'j' Name '::' Operator 'Int' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'new' Name '(' Punctuation 's' Name ',' Punctuation ' ' Text 'i' Name '-' Operator '1' Literal.Number.Integer ',' Punctuation ' ' Text 'j' Name '-' Operator 'i' Name '+' Operator '1' Literal.Number.Integer ')' Punctuation '\n' Text ' ' Text 'SubString' Keyword.Type '(' Punctuation 's' Name '::' Operator 'SubString' Keyword.Type ',' Punctuation ' ' Text 'i' Name '::' Operator 'Int' Keyword.Type ',' Punctuation ' ' Text 'j' Name '::' Operator 'Int' Keyword.Type ')' Punctuation ' ' Text '=' Operator '\n' Text ' ' Text 'new' Name '(' Punctuation 's' Name '.' Operator 'string' Name ',' Punctuation ' ' Text 'i' Name '-' Operator '1' Literal.Number.Integer '+' Operator 's' Name '.' Operator 'offset' Name ',' Punctuation ' ' Text 'j' Name '-' Operator 'i' Name '+' Operator '1' Literal.Number.Integer ')' Punctuation '\n' Text 'end' Keyword '\n' Text 'SubString' Keyword.Type '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'i' Name '::' Operator 'Integer' Keyword.Type ',' Punctuation ' ' Text 'j' Name '::' Operator 'Integer' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'SubString' Keyword.Type '(' Punctuation 's' Name ',' Punctuation ' ' Text 'int' Name '(' Punctuation 'i' Name ')' Punctuation ',' Punctuation ' ' Text 'int' Name '(' Punctuation 'j' Name ')' Punctuation ')' Punctuation '\n' Text '\n' Text 'function' Keyword ' ' Text 'next' Name '(' Punctuation 's' Name '::' Operator 'SubString' Keyword.Type ',' Punctuation ' ' Text 'i' Name '::' Operator 'Int' Keyword.Type ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text 'i' Name ' ' Text '<' Operator ' ' Text '1' Literal.Number.Integer ' ' Text '||' Operator ' ' Text 'i' Name ' ' Text '>' Operator ' ' Text 's' Name '.' Operator 'length' Name '\n' Text ' ' Text 'error' Name '(' Punctuation '"' Literal.String 's' Literal.String 't' Literal.String 'r' Literal.String 'i' Literal.String 'n' Literal.String 'g' Literal.String ' ' Literal.String 'i' Literal.String 'n' Literal.String 'd' Literal.String 'e' Literal.String 'x' Literal.String ' ' Literal.String 'o' Literal.String 'u' Literal.String 't' Literal.String ' ' Literal.String 'o' Literal.String 'f' Literal.String ' ' Literal.String 'b' Literal.String 'o' Literal.String 'u' Literal.String 'n' Literal.String 'd' Literal.String 's' Literal.String '"' Literal.String ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'c' Name ',' Punctuation ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 's' Name '.' Operator 'string' Name ',' Punctuation ' ' Text 'i' Name '+' Operator 's' Name '.' Operator 'offset' Name ')' Punctuation '\n' Text ' ' Text 'c' Name ',' Punctuation ' ' Text 'i' Name '-' Operator 's' Name '.' Operator 'offset' Name '\n' Text 'end' Keyword '\n' Text '\n' Text 'length' Name '(' Punctuation 's' Name '::' Operator 'SubString' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 's' Name '.' Operator 'length' Name '\n' Text '# TODO: strlen(s::SubString) = ??' Comment '\n' Text "# default implementation will work but it's slow" Comment '\n' Text '# can this be delegated efficiently somehow?' Comment '\n' Text '# that may require additional string interfaces' Comment '\n' Text '\n' Text 'function' Keyword ' ' Text 'ref' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'r' Name '::' Operator 'Range1' Name '{' Punctuation 'Int' Keyword.Type '}' Punctuation ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text 'first' Name '(' Punctuation 'r' Name ')' Punctuation ' ' Text '<' Operator ' ' Text '1' Literal.Number.Integer ' ' Text '||' Operator ' ' Text 'length' Name '(' Punctuation 's' Name ')' Punctuation ' ' Text '<' Operator ' ' Text 'last' Name '(' Punctuation 'r' Name ')' Punctuation '\n' Text ' ' Text 'error' Name '(' Punctuation '"' Literal.String 'i' Literal.String 'n' Literal.String ' ' Literal.String 's' Literal.String 'u' Literal.String 'b' Literal.String 's' Literal.String 't' Literal.String 'r' Literal.String 'i' Literal.String 'n' Literal.String 'g' Literal.String ' ' Literal.String 's' Literal.String 'l' Literal.String 'i' Literal.String 'c' Literal.String 'e' Literal.String ':' Literal.String ' ' Literal.String 'i' Literal.String 'n' Literal.String 'd' Literal.String 'e' Literal.String 'x' Literal.String ' ' Literal.String 'o' Literal.String 'u' Literal.String 't' Literal.String ' ' Literal.String 'o' Literal.String 'f' Literal.String ' ' Literal.String 'r' Literal.String 'a' Literal.String 'n' Literal.String 'g' Literal.String 'e' Literal.String '"' Literal.String ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'SubString' Keyword.Type '(' Punctuation 's' Name ',' Punctuation ' ' Text 'first' Name '(' Punctuation 'r' Name ')' Punctuation ',' Punctuation ' ' Text 'last' Name '(' Punctuation 'r' Name ')' Punctuation ')' Punctuation '\n' Text 'end' Keyword '\n' Text '\n' Text '## efficient representation of repeated strings ##' Comment '\n' Text '\n' Text 'type' Keyword ' ' Text 'RepString' Keyword.Type ' ' Text '<:' Operator ' ' Text 'String' Name '\n' Text ' ' Text 'string' Name '::' Operator 'String' Name '\n' Text ' ' Text 'repeat' Name '::' Operator 'Integer' Keyword.Type '\n' Text 'end' Keyword '\n' Text '\n' Text 'length' Name '(' Punctuation 's' Name '::' Operator 'RepString' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'length' Name '(' Punctuation 's' Name '.' Operator 'string' Name ')' Punctuation '*' Operator 's' Name '.' Operator 'repeat' Name '\n' Text 'strlen' Name '(' Punctuation 's' Name '::' Operator 'RepString' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'strlen' Name '(' Punctuation 's' Name '.' Operator 'string' Name ')' Punctuation '*' Operator 's' Name '.' Operator 'repeat' Name '\n' Text '\n' Text 'function' Keyword ' ' Text 'next' Name '(' Punctuation 's' Name '::' Operator 'RepString' Keyword.Type ',' Punctuation ' ' Text 'i' Name '::' Operator 'Int' Keyword.Type ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text 'i' Name ' ' Text '<' Operator ' ' Text '1' Literal.Number.Integer ' ' Text '||' Operator ' ' Text 'i' Name ' ' Text '>' Operator ' ' Text 'length' Name '(' Punctuation 's' Name ')' Punctuation '\n' Text ' ' Text 'error' Name '(' Punctuation '"' Literal.String 's' Literal.String 't' Literal.String 'r' Literal.String 'i' Literal.String 'n' Literal.String 'g' Literal.String ' ' Literal.String 'i' Literal.String 'n' Literal.String 'd' Literal.String 'e' Literal.String 'x' Literal.String ' ' Literal.String 'o' Literal.String 'u' Literal.String 't' Literal.String ' ' Literal.String 'o' Literal.String 'f' Literal.String ' ' Literal.String 'b' Literal.String 'o' Literal.String 'u' Literal.String 'n' Literal.String 'd' Literal.String 's' Literal.String '"' Literal.String ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'j' Name ' ' Text '=' Operator ' ' Text 'mod1' Name '(' Punctuation 'i' Name ',' Punctuation 'length' Name '(' Punctuation 's' Name '.' Operator 'string' Name ')' Punctuation ')' Punctuation '\n' Text ' ' Text 'c' Name ',' Punctuation ' ' Text 'k' Name ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 's' Name '.' Operator 'string' Name ',' Punctuation ' ' Text 'j' Name ')' Punctuation '\n' Text ' ' Text 'c' Name ',' Punctuation ' ' Text 'k' Name '-' Operator 'j' Name '+' Operator 'i' Name '\n' Text 'end' Keyword '\n' Text '\n' Text 'function' Keyword ' ' Text 'repeat' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'r' Name '::' Operator 'Integer' Keyword.Type ')' Punctuation '\n' Text ' ' Text 'r' Name ' ' Text '<' Operator ' ' Text '0' Literal.Number.Integer ' ' Text '?' Operator ' ' Text 'error' Name '(' Punctuation '"' Literal.String 'c' Literal.String 'a' Literal.String 'n' Literal.String "'" Literal.String 't' Literal.String ' ' Literal.String 'r' Literal.String 'e' Literal.String 'p' Literal.String 'e' Literal.String 'a' Literal.String 't' Literal.String ' ' Literal.String 'a' Literal.String ' ' Literal.String 's' Literal.String 't' Literal.String 'r' Literal.String 'i' Literal.String 'n' Literal.String 'g' Literal.String ' ' Literal.String '"' Literal.String ',' Punctuation 'r' Name ',' Punctuation '"' Literal.String ' ' Literal.String 't' Literal.String 'i' Literal.String 'm' Literal.String 'e' Literal.String 's' Literal.String '"' Literal.String ')' Punctuation ' ' Text ':' Operator '\n' Text ' ' Text 'r' Name ' ' Text '==' Operator ' ' Text '0' Literal.Number.Integer ' ' Text '?' Operator ' ' Text '"' Literal.String '"' Literal.String ' ' Text ':' Operator '\n' Text ' ' Text 'r' Name ' ' Text '==' Operator ' ' Text '1' Literal.Number.Integer ' ' Text '?' Operator ' ' Text 's' Name ' ' Text ':' Operator '\n' Text ' ' Text 'RepString' Keyword.Type '(' Punctuation 's' Name ',' Punctuation 'r' Name ')' Punctuation '\n' Text 'end' Keyword '\n' Text '\n' Text '## reversed strings without data movement ##' Comment '\n' Text '\n' Text 'type' Keyword ' ' Text 'RevString' Keyword.Type ' ' Text '<:' Operator ' ' Text 'String' Name '\n' Text ' ' Text 'string' Name '::' Operator 'String' Name '\n' Text 'end' Keyword '\n' Text '\n' Text 'length' Name '(' Punctuation 's' Name '::' Operator 'RevString' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'length' Name '(' Punctuation 's' Name '.' Operator 'string' Name ')' Punctuation '\n' Text 'strlen' Name '(' Punctuation 's' Name '::' Operator 'RevString' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'strlen' Name '(' Punctuation 's' Name '.' Operator 'string' Name ')' Punctuation '\n' Text '\n' Text 'start' Name '(' Punctuation 's' Name '::' Operator 'RevString' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text '(' Punctuation 'n' Name '=' Operator 'length' Name '(' Punctuation 's' Name ')' Punctuation ';' Punctuation ' ' Text 'n' Name '-' Operator 'thisind' Name '(' Punctuation 's' Name '.' Operator 'string' Name ',' Punctuation 'n' Name ')' Punctuation '+' Operator '1' Literal.Number.Integer ')' Punctuation '\n' Text 'function' Keyword ' ' Text 'next' Name '(' Punctuation 's' Name '::' Operator 'RevString' Keyword.Type ',' Punctuation ' ' Text 'i' Name '::' Operator 'Int' Keyword.Type ')' Punctuation '\n' Text ' ' Text 'n' Name ' ' Text '=' Operator ' ' Text 'length' Name '(' Punctuation 's' Name ')' Punctuation ';' Punctuation ' ' Text 'j' Name ' ' Text '=' Operator ' ' Text 'n' Name '-' Operator 'i' Name '+' Operator '1' Literal.Number.Integer '\n' Text ' ' Text '(' Punctuation 's' Name '.' Operator 'string' Name '[' Punctuation 'j' Name ']' Punctuation ',' Punctuation ' ' Text 'n' Name '-' Operator 'thisind' Name '(' Punctuation 's' Name '.' Operator 'string' Name ',' Punctuation 'j' Name '-' Operator '1' Literal.Number.Integer ')' Punctuation '+' Operator '1' Literal.Number.Integer ')' Punctuation '\n' Text 'end' Keyword '\n' Text '\n' Text 'reverse' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'RevString' Keyword.Type '(' Punctuation 's' Name ')' Punctuation '\n' Text 'reverse' Name '(' Punctuation 's' Name '::' Operator 'RevString' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 's' Name '.' Operator 'string' Name '\n' Text '\n' Text '## ropes for efficient concatenation, etc. ##' Comment '\n' Text '\n' Text '# Idea: instead of this standard binary tree structure,' Comment '\n' Text '# how about we keep an array of substrings, with an' Comment '\n' Text '# offset array. We can do binary search on the offset' Comment '\n' Text '# array so we get O(log(n)) indexing time still, but we' Comment '\n' Text '# can compute the offsets lazily and avoid all the' Comment '\n' Text '# futzing around while the string is being constructed.' Comment '\n' Text '\n' Text 'type' Keyword ' ' Text 'RopeString' Keyword.Type ' ' Text '<:' Operator ' ' Text 'String' Name '\n' Text ' ' Text 'head' Name '::' Operator 'String' Name '\n' Text ' ' Text 'tail' Name '::' Operator 'String' Name '\n' Text ' ' Text 'depth' Name '::' Operator 'Int32' Keyword.Type '\n' Text ' ' Text 'length' Name '::' Operator 'Int' Keyword.Type '\n' Text '\n' Text ' ' Text 'RopeString' Keyword.Type '(' Punctuation 'h' Name '::' Operator 'RopeString' Keyword.Type ',' Punctuation ' ' Text 't' Name '::' Operator 'RopeString' Keyword.Type ')' Punctuation ' ' Text '=' Operator '\n' Text ' ' Text 'depth' Name '(' Punctuation 'h' Name '.' Operator 'tail' Name ')' Punctuation ' ' Text '+' Operator ' ' Text 'depth' Name '(' Punctuation 't' Name ')' Punctuation ' ' Text '<' Operator ' ' Text 'depth' Name '(' Punctuation 'h' Name '.' Operator 'head' Name ')' Punctuation ' ' Text '?' Operator '\n' Text ' ' Text 'RopeString' Keyword.Type '(' Punctuation 'h' Name '.' Operator 'head' Name ',' Punctuation ' ' Text 'RopeString' Keyword.Type '(' Punctuation 'h' Name '.' Operator 'tail' Name ',' Punctuation ' ' Text 't' Name ')' Punctuation ')' Punctuation ' ' Text ':' Operator '\n' Text ' ' Text 'new' Name '(' Punctuation 'h' Name ',' Punctuation ' ' Text 't' Name ',' Punctuation ' ' Text 'max' Name '(' Punctuation 'h' Name '.' Operator 'depth' Name ',' Punctuation 't' Name '.' Operator 'depth' Name ')' Punctuation '+' Operator '1' Literal.Number.Integer ',' Punctuation ' ' Text 'length' Name '(' Punctuation 'h' Name ')' Punctuation '+' Operator 'length' Name '(' Punctuation 't' Name ')' Punctuation ')' Punctuation '\n' Text '\n' Text ' ' Text 'RopeString' Keyword.Type '(' Punctuation 'h' Name '::' Operator 'RopeString' Keyword.Type ',' Punctuation ' ' Text 't' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator '\n' Text ' ' Text 'depth' Name '(' Punctuation 'h' Name '.' Operator 'tail' Name ')' Punctuation ' ' Text '<' Operator ' ' Text 'depth' Name '(' Punctuation 'h' Name '.' Operator 'head' Name ')' Punctuation ' ' Text '?' Operator '\n' Text ' ' Text 'RopeString' Keyword.Type '(' Punctuation 'h' Name '.' Operator 'head' Name ',' Punctuation ' ' Text 'RopeString' Keyword.Type '(' Punctuation 'h' Name '.' Operator 'tail' Name ',' Punctuation ' ' Text 't' Name ')' Punctuation ')' Punctuation ' ' Text ':' Operator '\n' Text ' ' Text 'new' Name '(' Punctuation 'h' Name ',' Punctuation ' ' Text 't' Name ',' Punctuation ' ' Text 'h' Name '.' Operator 'depth' Name '+' Operator '1' Literal.Number.Integer ',' Punctuation ' ' Text 'length' Name '(' Punctuation 'h' Name ')' Punctuation '+' Operator 'length' Name '(' Punctuation 't' Name ')' Punctuation ')' Punctuation '\n' Text '\n' Text ' ' Text 'RopeString' Keyword.Type '(' Punctuation 'h' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 't' Name '::' Operator 'RopeString' Keyword.Type ')' Punctuation ' ' Text '=' Operator '\n' Text ' ' Text 'depth' Name '(' Punctuation 't' Name '.' Operator 'head' Name ')' Punctuation ' ' Text '<' Operator ' ' Text 'depth' Name '(' Punctuation 't' Name '.' Operator 'tail' Name ')' Punctuation ' ' Text '?' Operator '\n' Text ' ' Text 'RopeString' Keyword.Type '(' Punctuation 'RopeString' Keyword.Type '(' Punctuation 'h' Name ',' Punctuation ' ' Text 't' Name '.' Operator 'head' Name ')' Punctuation ',' Punctuation ' ' Text 't' Name '.' Operator 'tail' Name ')' Punctuation ' ' Text ':' Operator '\n' Text ' ' Text 'new' Name '(' Punctuation 'h' Name ',' Punctuation ' ' Text 't' Name ',' Punctuation ' ' Text 't' Name '.' Operator 'depth' Name '+' Operator '1' Literal.Number.Integer ',' Punctuation ' ' Text 'length' Name '(' Punctuation 'h' Name ')' Punctuation '+' Operator 'length' Name '(' Punctuation 't' Name ')' Punctuation ')' Punctuation '\n' Text '\n' Text ' ' Text 'RopeString' Keyword.Type '(' Punctuation 'h' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 't' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator '\n' Text ' ' Text 'new' Name '(' Punctuation 'h' Name ',' Punctuation ' ' Text 't' Name ',' Punctuation ' ' Text '1' Literal.Number.Integer ',' Punctuation ' ' Text 'length' Name '(' Punctuation 'h' Name ')' Punctuation '+' Operator 'length' Name '(' Punctuation 't' Name ')' Punctuation ')' Punctuation '\n' Text 'end' Keyword '\n' Text '\n' Text 'depth' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text '0' Literal.Number.Integer '\n' Text 'depth' Name '(' Punctuation 's' Name '::' Operator 'RopeString' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 's' Name '.' Operator 'depth' Name '\n' Text '\n' Text 'function' Keyword ' ' Text 'next' Name '(' Punctuation 's' Name '::' Operator 'RopeString' Keyword.Type ',' Punctuation ' ' Text 'i' Name '::' Operator 'Int' Keyword.Type ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text 'i' Name ' ' Text '<=' Operator ' ' Text 'length' Name '(' Punctuation 's' Name '.' Operator 'head' Name ')' Punctuation '\n' Text ' ' Text 'return' Keyword ' ' Text 'next' Name '(' Punctuation 's' Name '.' Operator 'head' Name ',' Punctuation ' ' Text 'i' Name ')' Punctuation '\n' Text ' ' Text 'else' Keyword '\n' Text ' ' Text 'c' Name ',' Punctuation ' ' Text 'j' Name ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 's' Name '.' Operator 'tail' Name ',' Punctuation ' ' Text 'i' Name '-' Operator 'length' Name '(' Punctuation 's' Name '.' Operator 'head' Name ')' Punctuation ')' Punctuation '\n' Text ' ' Text 'return' Keyword ' ' Text 'c' Name ',' Punctuation ' ' Text 'j' Name '+' Operator 'length' Name '(' Punctuation 's' Name '.' Operator 'head' Name ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text 'end' Keyword '\n' Text '\n' Text 'length' Name '(' Punctuation 's' Name '::' Operator 'RopeString' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 's' Name '.' Operator 'length' Name '\n' Text 'strlen' Name '(' Punctuation 's' Name '::' Operator 'RopeString' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'strlen' Name '(' Punctuation 's' Name '.' Operator 'head' Name ')' Punctuation ' ' Text '+' Operator ' ' Text 'strlen' Name '(' Punctuation 's' Name '.' Operator 'tail' Name ')' Punctuation '\n' Text '\n' Text 'strcat' Name '(' Punctuation ')' Punctuation ' ' Text '=' Operator ' ' Text '"' Literal.String '"' Literal.String '\n' Text 'strcat' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 's' Name '\n' Text 'strcat' Name '(' Punctuation 'x' Name '.' Operator '.' Operator '.' Operator ')' Punctuation ' ' Text '=' Operator ' ' Text 'strcat' Name '(' Punctuation 'map' Name '(' Punctuation 'string' Name ',' Punctuation 'x' Name ')' Punctuation '.' Operator '.' Operator '.' Operator ')' Punctuation '\n' Text 'strcat' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 't' Name '::' Operator 'String' Name '.' Operator '.' Operator '.' Operator ')' Punctuation ' ' Text '=' Operator '\n' Text ' ' Text '(' Punctuation 't' Name ' ' Text '=' Operator ' ' Text 'strcat' Name '(' Punctuation 't' Name '.' Operator '.' Operator '.' Operator ')' Punctuation ';' Punctuation ' ' Text 'isempty' Name '(' Punctuation 's' Name ')' Punctuation ' ' Text '?' Operator ' ' Text 't' Name ' ' Text ':' Operator ' ' Text 'isempty' Name '(' Punctuation 't' Name ')' Punctuation ' ' Text '?' Operator ' ' Text 's' Name ' ' Text ':' Operator ' ' Text 'RopeString' Keyword.Type '(' Punctuation 's' Name ',' Punctuation ' ' Text 't' Name ')' Punctuation ')' Punctuation '\n' Text '\n' Text 'print' Name '(' Punctuation 's' Name '::' Operator 'RopeString' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'print' Name '(' Punctuation 's' Name '.' Operator 'head' Name ',' Punctuation ' ' Text 's' Name '.' Operator 'tail' Name ')' Punctuation '\n' Text '\n' Text '## transformed strings ##' Comment '\n' Text '\n' Text 'type' Keyword ' ' Text 'TransformedString' Name ' ' Text '<:' Operator ' ' Text 'String' Name '\n' Text ' ' Text 'transform' Name '::' Operator 'Function' Keyword.Type '\n' Text ' ' Text 'string' Name '::' Operator 'String' Name '\n' Text 'end' Keyword '\n' Text '\n' Text 'length' Name '(' Punctuation 's' Name '::' Operator 'TransformedString' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'length' Name '(' Punctuation 's' Name '.' Operator 'string' Name ')' Punctuation '\n' Text 'strlen' Name '(' Punctuation 's' Name '::' Operator 'TransformedString' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'strlen' Name '(' Punctuation 's' Name '.' Operator 'string' Name ')' Punctuation '\n' Text '\n' Text 'function' Keyword ' ' Text 'next' Name '(' Punctuation 's' Name '::' Operator 'TransformedString' Name ',' Punctuation ' ' Text 'i' Name '::' Operator 'Int' Keyword.Type ')' Punctuation '\n' Text ' ' Text 'c' Name ',' Punctuation ' ' Text 'j' Name ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 's' Name '.' Operator 'string' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'c' Name ' ' Text '=' Operator ' ' Text 's' Name '.' Operator 'transform' Name '(' Punctuation 'c' Name ',' Punctuation ' ' Text 'i' Name ')' Punctuation '\n' Text ' ' Text 'return' Keyword ' ' Text 'c' Name ',' Punctuation ' ' Text 'j' Name '\n' Text 'end' Keyword '\n' Text '\n' Text '## uppercase and lowercase transformations ##' Comment '\n' Text '\n' Text 'uppercase' Name '(' Punctuation 'c' Name '::' Operator 'Char' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'ccall' Keyword '(' Punctuation ':' Operator 'towupper' Name ',' Punctuation ' ' Text 'Char' Keyword.Type ',' Punctuation ' ' Text '(' Punctuation 'Char' Keyword.Type ',' Punctuation ')' Punctuation ',' Punctuation ' ' Text 'c' Name ')' Punctuation '\n' Text 'lowercase' Name '(' Punctuation 'c' Name '::' Operator 'Char' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'ccall' Keyword '(' Punctuation ':' Operator 'towlower' Name ',' Punctuation ' ' Text 'Char' Keyword.Type ',' Punctuation ' ' Text '(' Punctuation 'Char' Keyword.Type ',' Punctuation ')' Punctuation ',' Punctuation ' ' Text 'c' Name ')' Punctuation '\n' Text '\n' Text 'uppercase' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'TransformedString' Name '(' Punctuation '(' Punctuation 'c' Name ',' Punctuation 'i' Name ')' Punctuation '-' Operator '>' Operator 'uppercase' Name '(' Punctuation 'c' Name ')' Punctuation ',' Punctuation ' ' Text 's' Name ')' Punctuation '\n' Text 'lowercase' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'TransformedString' Name '(' Punctuation '(' Punctuation 'c' Name ',' Punctuation 'i' Name ')' Punctuation '-' Operator '>' Operator 'lowercase' Name '(' Punctuation 'c' Name ')' Punctuation ',' Punctuation ' ' Text 's' Name ')' Punctuation '\n' Text '\n' Text 'ucfirst' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'TransformedString' Name '(' Punctuation '(' Punctuation 'c' Name ',' Punctuation 'i' Name ')' Punctuation '-' Operator '>' Operator 'i' Name '==' Operator '1' Literal.Number.Integer ' ' Text '?' Operator ' ' Text 'uppercase' Name '(' Punctuation 'c' Name ')' Punctuation ' ' Text ':' Operator ' ' Text 'c' Name ',' Punctuation ' ' Text 's' Name ')' Punctuation '\n' Text 'lcfirst' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'TransformedString' Name '(' Punctuation '(' Punctuation 'c' Name ',' Punctuation 'i' Name ')' Punctuation '-' Operator '>' Operator 'i' Name '==' Operator '1' Literal.Number.Integer ' ' Text '?' Operator ' ' Text 'lowercase' Name '(' Punctuation 'c' Name ')' Punctuation ' ' Text ':' Operator ' ' Text 'c' Name ',' Punctuation ' ' Text 's' Name ')' Punctuation '\n' Text '\n' Text 'const' Keyword.Declaration ' ' Text 'uc' Name ' ' Text '=' Operator ' ' Text 'uppercase' Name '\n' Text 'const' Keyword.Declaration ' ' Text 'lc' Name ' ' Text '=' Operator ' ' Text 'lowercase' Name '\n' Text '\n' Text '## string map ##' Comment '\n' Text '\n' Text 'function' Keyword ' ' Text 'map' Name '(' Punctuation 'f' Name '::' Operator 'Function' Keyword.Type ',' Punctuation ' ' Text 's' Name '::' Operator 'String' Name ')' Punctuation '\n' Text ' ' Text 'out' Name ' ' Text '=' Operator ' ' Text 'memio' Name '(' Punctuation 'length' Name '(' Punctuation 's' Name ')' Punctuation ')' Punctuation '\n' Text ' ' Text 'for' Keyword ' ' Text 'c' Name ' ' Text 'in' Keyword.Pseudo ' ' Text 's' Name '\n' Text ' ' Text 'write' Name '(' Punctuation 'out' Name ',' Punctuation ' ' Text 'f' Name '(' Punctuation 'c' Name ')' Punctuation '::' Operator 'Char' Keyword.Type ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'takebuf_string' Name '(' Punctuation 'out' Name ')' Punctuation '\n' Text 'end' Keyword '\n' Text '\n' Text '## conversion of general objects to strings ##' Comment '\n' Text '\n' Text 'string' Name '(' Punctuation 'x' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'print_to_string' Name '(' Punctuation 'show' Name ',' Punctuation ' ' Text 'x' Name ')' Punctuation '\n' Text 'cstring' Name '(' Punctuation 'x' Name '.' Operator '.' Operator '.' Operator ')' Punctuation ' ' Text '=' Operator ' ' Text 'print_to_string' Name '(' Punctuation 'print' Name ',' Punctuation ' ' Text 'x' Name '.' Operator '.' Operator '.' Operator ')' Punctuation '\n' Text '\n' Text 'function' Keyword ' ' Text 'cstring' Name '(' Punctuation 'p' Name '::' Operator 'Ptr' Keyword.Type '{' Punctuation 'Uint8' Name '}' Punctuation ')' Punctuation '\n' Text ' ' Text 'p' Name ' ' Text '==' Operator ' ' Text 'C_NULL' Name.Builtin ' ' Text '?' Operator ' ' Text 'error' Name '(' Punctuation '"' Literal.String 'c' Literal.String 'a' Literal.String 'n' Literal.String 'n' Literal.String 'o' Literal.String 't' Literal.String ' ' Literal.String 'c' Literal.String 'o' Literal.String 'n' Literal.String 'v' Literal.String 'e' Literal.String 'r' Literal.String 't' Literal.String ' ' Literal.String 'N' Literal.String 'U' Literal.String 'L' Literal.String 'L' Literal.String ' ' Literal.String 't' Literal.String 'o' Literal.String ' ' Literal.String 's' Literal.String 't' Literal.String 'r' Literal.String 'i' Literal.String 'n' Literal.String 'g' Literal.String '"' Literal.String ')' Punctuation ' ' Text ':' Operator '\n' Text ' ' Text 'ccall' Keyword '(' Punctuation ':' Operator 'jl_cstr_to_string' Name ',' Punctuation ' ' Text 'Any' Keyword.Type ',' Punctuation ' ' Text '(' Punctuation 'Ptr' Keyword.Type '{' Punctuation 'Uint8' Name '}' Punctuation ',' Punctuation ')' Punctuation ',' Punctuation ' ' Text 'p' Name ')' Punctuation '::' Operator 'ByteString' Name '\n' Text 'end' Keyword '\n' Text '\n' Text '## string promotion rules ##' Comment '\n' Text '\n' Text 'promote_rule' Name '(' Punctuation '::' Operator 'Type' Keyword.Type '{' Punctuation 'UTF8String' Keyword.Type '}' Punctuation ' ' Text ',' Punctuation ' ' Text '::' Operator 'Type' Keyword.Type '{' Punctuation 'ASCIIString' Keyword.Type '}' Punctuation ')' Punctuation ' ' Text '=' Operator ' ' Text 'UTF8String' Keyword.Type '\n' Text 'promote_rule' Name '(' Punctuation '::' Operator 'Type' Keyword.Type '{' Punctuation 'UTF8String' Keyword.Type '}' Punctuation ' ' Text ',' Punctuation ' ' Text '::' Operator 'Type' Keyword.Type '{' Punctuation 'CharString' Name '}' Punctuation ' ' Text ')' Punctuation ' ' Text '=' Operator ' ' Text 'UTF8String' Keyword.Type '\n' Text 'promote_rule' Name '(' Punctuation '::' Operator 'Type' Keyword.Type '{' Punctuation 'ASCIIString' Keyword.Type '}' Punctuation ',' Punctuation ' ' Text '::' Operator 'Type' Keyword.Type '{' Punctuation 'CharString' Name '}' Punctuation ' ' Text ')' Punctuation ' ' Text '=' Operator ' ' Text 'UTF8String' Keyword.Type '\n' Text '\n' Text '## printing literal quoted string data ##' Comment '\n' Text '\n' Text '# TODO: this is really the inverse of print_unbackslashed' Comment '\n' Text '\n' Text 'function' Keyword ' ' Text 'print_quoted_literal' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation '\n' Text ' ' Text 'print' Name '(' Punctuation '\'"\'' Literal.String.Char ')' Punctuation '\n' Text ' ' Text 'for' Keyword ' ' Text 'c' Name ' ' Text '=' Operator ' ' Text 's' Name ';' Punctuation ' ' Text 'c' Name ' ' Text '==' Operator ' ' Text '\'"\'' Literal.String.Char ' ' Text '?' Operator ' ' Text 'print' Name '(' Punctuation '"' Literal.String '\\\\' Literal.String.Escape '\\"' Literal.String.Escape '"' Literal.String ')' Punctuation ' ' Text ':' Operator ' ' Text 'print' Name '(' Punctuation 'c' Name ')' Punctuation ';' Punctuation ' ' Text 'end' Keyword '\n' Text ' ' Text 'print' Name '(' Punctuation '\'"\'' Literal.String.Char ')' Punctuation '\n' Text 'end' Keyword '\n' Text '\n' Text '## string escaping & unescaping ##' Comment '\n' Text '\n' Text 'escape_nul' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'i' Name '::' Operator 'Int' Keyword.Type ')' Punctuation ' ' Text '=' Operator '\n' Text ' ' Text '!' Operator 'done' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation ' ' Text '&&' Operator ' ' Text "'0'" Literal.String.Char ' ' Text '<=' Operator ' ' Text 'next' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation '[' Punctuation '1' Literal.Number.Integer ']' Punctuation ' ' Text '<=' Operator ' ' Text "'7'" Literal.String.Char ' ' Text '?' Operator ' ' Text 'L' Name '"' Literal.String '\\x00' Literal.String.Escape '"' Literal.String ' ' Text ':' Operator ' ' Text 'L' Name '"' Literal.String '\\0' Literal.String.Escape '"' Literal.String '\n' Text '\n' Text 'is_hex_digit' Name '(' Punctuation 'c' Name '::' Operator 'Char' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text "'0'" Literal.String.Char '<=' Operator 'c' Name '<=' Operator "'9'" Literal.String.Char ' ' Text '||' Operator ' ' Text "'a'" Literal.String.Char '<=' Operator 'c' Name '<=' Operator "'f'" Literal.String.Char ' ' Text '||' Operator ' ' Text "'A'" Literal.String.Char '<=' Operator 'c' Name '<=' Operator "'F'" Literal.String.Char '\n' Text 'need_full_hex' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'i' Name '::' Operator 'Int' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text '!' Operator 'done' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation ' ' Text '&&' Operator ' ' Text 'is_hex_digit' Name '(' Punctuation 'next' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation '[' Punctuation '1' Literal.Number.Integer ']' Punctuation ')' Punctuation '\n' Text '\n' Text 'function' Keyword ' ' Text 'print_escaped' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'esc' Name '::' Operator 'String' Name ')' Punctuation '\n' Text ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'start' Name '(' Punctuation 's' Name ')' Punctuation '\n' Text ' ' Text 'while' Keyword ' ' Text '!' Operator 'done' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'c' Name ',' Punctuation ' ' Text 'j' Name ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'c' Name ' ' Text '==' Operator ' ' Text "'\\0'" Literal.String.Char ' ' Text '?' Operator ' ' Text 'print' Name '(' Punctuation 'escape_nul' Name '(' Punctuation 's' Name ',' Punctuation 'j' Name ')' Punctuation ')' Punctuation ' ' Text ':' Operator '\n' Text ' ' Text 'c' Name ' ' Text '==' Operator ' ' Text "'\\e'" Literal.String.Char ' ' Text '?' Operator ' ' Text 'print' Name '(' Punctuation 'L' Name '"' Literal.String '\\' Literal.String 'e' Literal.String '"' Literal.String ')' Punctuation ' ' Text ':' Operator '\n' Text ' ' Text 'c' Name ' ' Text '==' Operator ' ' Text "'\\\\'" Literal.String.Char ' ' Text '?' Operator ' ' Text 'print' Name '(' Punctuation '"' Literal.String '\\\\' Literal.String.Escape '\\\\' Literal.String.Escape '"' Literal.String ')' Punctuation ' ' Text ':' Operator '\n' Text ' ' Text 'contains' Name '(' Punctuation 'esc' Name ',' Punctuation 'c' Name ')' Punctuation ' ' Text '?' Operator ' ' Text 'print' Name '(' Punctuation "'\\\\'" Literal.String.Char ',' Punctuation ' ' Text 'c' Name ')' Punctuation ' ' Text ':' Operator '\n' Text ' ' Text 'iswprint' Name '(' Punctuation 'c' Name ')' Punctuation ' ' Text '?' Operator ' ' Text 'print' Name '(' Punctuation 'c' Name ')' Punctuation ' ' Text ':' Operator '\n' Text ' ' Text '7' Literal.Number.Integer ' ' Text '<=' Operator ' ' Text 'c' Name ' ' Text '<=' Operator ' ' Text '13' Literal.Number.Integer ' ' Text '?' Operator ' ' Text 'print' Name '(' Punctuation "'\\\\'" Literal.String.Char ',' Punctuation ' ' Text '"' Literal.String 'a' Literal.String 'b' Literal.String 't' Literal.String 'n' Literal.String 'v' Literal.String 'f' Literal.String 'r' Literal.String '"' Literal.String '[' Punctuation 'c' Name '-' Operator '6' Literal.Number.Integer ']' Punctuation ')' Punctuation ' ' Text ':' Operator '\n' Text ' ' Text 'c' Name ' ' Text '<=' Operator ' ' Text "'\\x7f'" Literal.String.Char ' ' Text '?' Operator ' ' Text 'print' Name '(' Punctuation 'L' Name '"' Literal.String '\\' Literal.String 'x' Literal.String '"' Literal.String ',' Punctuation ' ' Text 'hex' Name '(' Punctuation 'c' Name ',' Punctuation ' ' Text '2' Literal.Number.Integer ')' Punctuation ')' Punctuation ' ' Text ':' Operator '\n' Text ' ' Text 'c' Name ' ' Text '<=' Operator ' ' Text "'\\uffff'" Literal.String.Char ' ' Text '?' Operator ' ' Text 'print' Name '(' Punctuation 'L' Name '"' Literal.String '\\' Literal.String 'u' Literal.String '"' Literal.String ',' Punctuation ' ' Text 'hex' Name '(' Punctuation 'c' Name ',' Punctuation ' ' Text 'need_full_hex' Name '(' Punctuation 's' Name ',' Punctuation 'j' Name ')' Punctuation ' ' Text '?' Operator ' ' Text '4' Literal.Number.Integer ' ' Text ':' Operator ' ' Text '2' Literal.Number.Integer ')' Punctuation ')' Punctuation ' ' Text ':' Operator '\n' Text ' ' Text 'print' Name '(' Punctuation 'L' Name '"' Literal.String '\\' Literal.String 'U' Literal.String '"' Literal.String ',' Punctuation ' ' Text 'hex' Name '(' Punctuation 'c' Name ',' Punctuation ' ' Text 'need_full_hex' Name '(' Punctuation 's' Name ',' Punctuation 'j' Name ')' Punctuation ' ' Text '?' Operator ' ' Text '8' Literal.Number.Integer ' ' Text ':' Operator ' ' Text '4' Literal.Number.Integer ')' Punctuation ')' Punctuation '\n' Text ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'j' Name '\n' Text ' ' Text 'end' Keyword '\n' Text 'end' Keyword '\n' Text '\n' Text 'escape_string' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'print_to_string' Name '(' Punctuation 'length' Name '(' Punctuation 's' Name ')' Punctuation ',' Punctuation ' ' Text 'print_escaped' Name ',' Punctuation ' ' Text 's' Name ',' Punctuation ' ' Text '"' Literal.String '\\"' Literal.String.Escape '"' Literal.String ')' Punctuation '\n' Text 'print_quoted' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text '(' Punctuation 'print' Name '(' Punctuation '\'"\'' Literal.String.Char ')' Punctuation ';' Punctuation ' ' Text 'print_escaped' Name '(' Punctuation 's' Name ',' Punctuation ' ' Text '"' Literal.String '\\"' Literal.String.Escape '\\$' Literal.String.Escape '"' Literal.String ')' Punctuation ';' Punctuation ' ' Text 'print' Name '(' Punctuation '\'"\'' Literal.String.Char ')' Punctuation ')' Punctuation '\n' Text '#" # work around syntax highlighting problem' Comment '\n' Text 'quote_string' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'print_to_string' Name '(' Punctuation 'length' Name '(' Punctuation 's' Name ')' Punctuation '+' Operator '2' Literal.Number.Integer ',' Punctuation ' ' Text 'print_quoted' Name ',' Punctuation ' ' Text 's' Name ')' Punctuation '\n' Text '\n' Text '# bare minimum unescaping function unescapes only given characters' Comment '\n' Text '\n' Text 'function' Keyword ' ' Text 'print_unescaped_chars' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'esc' Name '::' Operator 'String' Name ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text '!' Operator 'contains' Name '(' Punctuation 'esc' Name ',' Punctuation "'\\\\'" Literal.String.Char ')' Punctuation '\n' Text ' ' Text 'esc' Name ' ' Text '=' Operator ' ' Text 'strcat' Name '(' Punctuation '"' Literal.String '\\\\' Literal.String.Escape '"' Literal.String ',' Punctuation ' ' Text 'esc' Name ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'start' Name '(' Punctuation 's' Name ')' Punctuation '\n' Text ' ' Text 'while' Keyword ' ' Text '!' Operator 'done' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'c' Name ',' Punctuation ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text 'c' Name ' ' Text '==' Operator ' ' Text "'\\\\'" Literal.String.Char ' ' Text '&&' Operator ' ' Text '!' Operator 'done' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation ' ' Text '&&' Operator ' ' Text 'contains' Name '(' Punctuation 'esc' Name ',' Punctuation 's' Name '[' Punctuation 'i' Name ']' Punctuation ')' Punctuation '\n' Text ' ' Text 'c' Name ',' Punctuation ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'print' Name '(' Punctuation 'c' Name ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text 'end' Keyword '\n' Text '\n' Text 'unescape_chars' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'esc' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator '\n' Text ' ' Text 'print_to_string' Name '(' Punctuation 'length' Name '(' Punctuation 's' Name ')' Punctuation ',' Punctuation ' ' Text 'print_unescaped_chars' Name ',' Punctuation ' ' Text 's' Name ',' Punctuation ' ' Text 'esc' Name ')' Punctuation '\n' Text '\n' Text '# general unescaping of traditional C and Unicode escape sequences' Comment '\n' Text '\n' Text 'function' Keyword ' ' Text 'print_unescaped' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation '\n' Text ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'start' Name '(' Punctuation 's' Name ')' Punctuation '\n' Text ' ' Text 'while' Keyword ' ' Text '!' Operator 'done' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'c' Name ',' Punctuation ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text '!' Operator 'done' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation ' ' Text '&&' Operator ' ' Text 'c' Name ' ' Text '==' Operator ' ' Text "'\\\\'" Literal.String.Char '\n' Text ' ' Text 'c' Name ',' Punctuation ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text 'c' Name ' ' Text '==' Operator ' ' Text "'x'" Literal.String.Char ' ' Text '||' Operator ' ' Text 'c' Name ' ' Text '==' Operator ' ' Text "'u'" Literal.String.Char ' ' Text '||' Operator ' ' Text 'c' Name ' ' Text '==' Operator ' ' Text "'U'" Literal.String.Char '\n' Text ' ' Text 'n' Name ' ' Text '=' Operator ' ' Text 'k' Name ' ' Text '=' Operator ' ' Text '0' Literal.Number.Integer '\n' Text ' ' Text 'm' Name ' ' Text '=' Operator ' ' Text 'c' Name ' ' Text '==' Operator ' ' Text "'x'" Literal.String.Char ' ' Text '?' Operator ' ' Text '2' Literal.Number.Integer ' ' Text ':' Operator '\n' Text ' ' Text 'c' Name ' ' Text '==' Operator ' ' Text "'u'" Literal.String.Char ' ' Text '?' Operator ' ' Text '4' Literal.Number.Integer ' ' Text ':' Operator ' ' Text '8' Literal.Number.Integer '\n' Text ' ' Text 'while' Keyword ' ' Text '(' Punctuation 'k' Name '+=' Operator '1' Literal.Number.Integer ')' Punctuation ' ' Text '<=' Operator ' ' Text 'm' Name ' ' Text '&&' Operator ' ' Text '!' Operator 'done' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'c' Name ',' Punctuation ' ' Text 'j' Name ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'n' Name ' ' Text '=' Operator ' ' Text "'0'" Literal.String.Char ' ' Text '<=' Operator ' ' Text 'c' Name ' ' Text '<=' Operator ' ' Text "'9'" Literal.String.Char ' ' Text '?' Operator ' ' Text 'n' Name '<<' Operator '4' Literal.Number.Integer ' ' Text '+' Operator ' ' Text 'c' Name '-' Operator "'0'" Literal.String.Char ' ' Text ':' Operator '\n' Text ' ' Text "'a'" Literal.String.Char ' ' Text '<=' Operator ' ' Text 'c' Name ' ' Text '<=' Operator ' ' Text "'f'" Literal.String.Char ' ' Text '?' Operator ' ' Text 'n' Name '<<' Operator '4' Literal.Number.Integer ' ' Text '+' Operator ' ' Text 'c' Name '-' Operator "'a'" Literal.String.Char '+' Operator '10' Literal.Number.Integer ' ' Text ':' Operator '\n' Text ' ' Text "'A'" Literal.String.Char ' ' Text '<=' Operator ' ' Text 'c' Name ' ' Text '<=' Operator ' ' Text "'F'" Literal.String.Char ' ' Text '?' Operator ' ' Text 'n' Name '<<' Operator '4' Literal.Number.Integer ' ' Text '+' Operator ' ' Text 'c' Name '-' Operator "'A'" Literal.String.Char '+' Operator '10' Literal.Number.Integer ' ' Text ':' Operator ' ' Text 'break' Keyword '\n' Text ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'j' Name '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'if' Keyword ' ' Text 'k' Name ' ' Text '==' Operator ' ' Text '1' Literal.Number.Integer '\n' Text ' ' Text 'error' Name '(' Punctuation '"' Literal.String '\\\\' Literal.String.Escape 'x' Literal.String ' ' Literal.String 'u' Literal.String 's' Literal.String 'e' Literal.String 'd' Literal.String ' ' Literal.String 'w' Literal.String 'i' Literal.String 't' Literal.String 'h' Literal.String ' ' Literal.String 'n' Literal.String 'o' Literal.String ' ' Literal.String 'f' Literal.String 'o' Literal.String 'l' Literal.String 'l' Literal.String 'o' Literal.String 'w' Literal.String 'i' Literal.String 'n' Literal.String 'g' Literal.String ' ' Literal.String 'h' Literal.String 'e' Literal.String 'x' Literal.String ' ' Literal.String 'd' Literal.String 'i' Literal.String 'g' Literal.String 'i' Literal.String 't' Literal.String 's' Literal.String '"' Literal.String ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'if' Keyword ' ' Text 'm' Name ' ' Text '==' Operator ' ' Text '2' Literal.Number.Integer ' ' Text '# \\x escape sequence' Comment '\n' Text ' ' Text 'write' Name '(' Punctuation 'uint8' Name '(' Punctuation 'n' Name ')' Punctuation ')' Punctuation '\n' Text ' ' Text 'else' Keyword '\n' Text ' ' Text 'print' Name '(' Punctuation 'char' Name '(' Punctuation 'n' Name ')' Punctuation ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'elseif' Keyword ' ' Text "'0'" Literal.String.Char ' ' Text '<=' Operator ' ' Text 'c' Name ' ' Text '<=' Operator ' ' Text "'7'" Literal.String.Char '\n' Text ' ' Text 'k' Name ' ' Text '=' Operator ' ' Text '1' Literal.Number.Integer '\n' Text ' ' Text 'n' Name ' ' Text '=' Operator ' ' Text 'c' Name '-' Operator "'0'" Literal.String.Char '\n' Text ' ' Text 'while' Keyword ' ' Text '(' Punctuation 'k' Name '+=' Operator '1' Literal.Number.Integer ')' Punctuation ' ' Text '<=' Operator ' ' Text '3' Literal.Number.Integer ' ' Text '&&' Operator ' ' Text '!' Operator 'done' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'c' Name ',' Punctuation ' ' Text 'j' Name ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'n' Name ' ' Text '=' Operator ' ' Text "'0'" Literal.String.Char ' ' Text '<=' Operator ' ' Text 'c' Name ' ' Text '<=' Operator ' ' Text "'7'" Literal.String.Char ' ' Text '?' Operator ' ' Text 'n' Name '<<' Operator '3' Literal.Number.Integer ' ' Text '+' Operator ' ' Text 'c' Name '-' Operator "'0'" Literal.String.Char ' ' Text ':' Operator ' ' Text 'break' Keyword '\n' Text ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'j' Name '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'if' Keyword ' ' Text 'n' Name ' ' Text '>' Operator ' ' Text '255' Literal.Number.Integer '\n' Text ' ' Text 'error' Name '(' Punctuation '"' Literal.String 'o' Literal.String 'c' Literal.String 't' Literal.String 'a' Literal.String 'l' Literal.String ' ' Literal.String 'e' Literal.String 's' Literal.String 'c' Literal.String 'a' Literal.String 'p' Literal.String 'e' Literal.String ' ' Literal.String 's' Literal.String 'e' Literal.String 'q' Literal.String 'u' Literal.String 'e' Literal.String 'n' Literal.String 'c' Literal.String 'e' Literal.String ' ' Literal.String 'o' Literal.String 'u' Literal.String 't' Literal.String ' ' Literal.String 'o' Literal.String 'f' Literal.String ' ' Literal.String 'r' Literal.String 'a' Literal.String 'n' Literal.String 'g' Literal.String 'e' Literal.String '"' Literal.String ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'write' Name '(' Punctuation 'uint8' Name '(' Punctuation 'n' Name ')' Punctuation ')' Punctuation '\n' Text ' ' Text 'else' Keyword '\n' Text ' ' Text 'print' Name '(' Punctuation 'c' Name ' ' Text '==' Operator ' ' Text "'a'" Literal.String.Char ' ' Text '?' Operator ' ' Text "'\\a'" Literal.String.Char ' ' Text ':' Operator '\n' Text ' ' Text 'c' Name ' ' Text '==' Operator ' ' Text "'b'" Literal.String.Char ' ' Text '?' Operator ' ' Text "'\\b'" Literal.String.Char ' ' Text ':' Operator '\n' Text ' ' Text 'c' Name ' ' Text '==' Operator ' ' Text "'t'" Literal.String.Char ' ' Text '?' Operator ' ' Text "'\\t'" Literal.String.Char ' ' Text ':' Operator '\n' Text ' ' Text 'c' Name ' ' Text '==' Operator ' ' Text "'n'" Literal.String.Char ' ' Text '?' Operator ' ' Text "'\\n'" Literal.String.Char ' ' Text ':' Operator '\n' Text ' ' Text 'c' Name ' ' Text '==' Operator ' ' Text "'v'" Literal.String.Char ' ' Text '?' Operator ' ' Text "'\\v'" Literal.String.Char ' ' Text ':' Operator '\n' Text ' ' Text 'c' Name ' ' Text '==' Operator ' ' Text "'f'" Literal.String.Char ' ' Text '?' Operator ' ' Text "'\\f'" Literal.String.Char ' ' Text ':' Operator '\n' Text ' ' Text 'c' Name ' ' Text '==' Operator ' ' Text "'r'" Literal.String.Char ' ' Text '?' Operator ' ' Text "'\\r'" Literal.String.Char ' ' Text ':' Operator '\n' Text ' ' Text 'c' Name ' ' Text '==' Operator ' ' Text "'e'" Literal.String.Char ' ' Text '?' Operator ' ' Text "'\\e'" Literal.String.Char ' ' Text ':' Operator ' ' Text 'c' Name ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'else' Keyword '\n' Text ' ' Text 'print' Name '(' Punctuation 'c' Name ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'end' Keyword '\n' Text 'end' Keyword '\n' Text '\n' Text 'unescape_string' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'print_to_string' Name '(' Punctuation 'length' Name '(' Punctuation 's' Name ')' Punctuation ',' Punctuation ' ' Text 'print_unescaped' Name ',' Punctuation ' ' Text 's' Name ')' Punctuation '\n' Text '\n' Text '## checking UTF-8 & ACSII validity ##' Comment '\n' Text '\n' Text 'byte_string_classify' Name '(' Punctuation 's' Name '::' Operator 'ByteString' Name ')' Punctuation ' ' Text '=' Operator '\n' Text ' ' Text 'ccall' Keyword '(' Punctuation ':' Operator 'u8_isvalid' Name ',' Punctuation ' ' Text 'Int32' Keyword.Type ',' Punctuation ' ' Text '(' Punctuation 'Ptr' Keyword.Type '{' Punctuation 'Uint8' Name '}' Punctuation ',' Punctuation ' ' Text 'Int' Keyword.Type ')' Punctuation ',' Punctuation ' ' Text 's' Name '.' Operator 'data' Name ',' Punctuation ' ' Text 'length' Name '(' Punctuation 's' Name ')' Punctuation ')' Punctuation '\n' Text ' ' Text '# 0: neither valid ASCII nor UTF-8' Comment '\n' Text ' ' Text '# 1: valid ASCII' Comment '\n' Text ' ' Text '# 2: valid UTF-8' Comment '\n' Text '\n' Text 'is_valid_ascii' Name '(' Punctuation 's' Name '::' Operator 'ByteString' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'byte_string_classify' Name '(' Punctuation 's' Name ')' Punctuation ' ' Text '==' Operator ' ' Text '1' Literal.Number.Integer '\n' Text 'is_valid_utf8' Name ' ' Text '(' Punctuation 's' Name '::' Operator 'ByteString' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'byte_string_classify' Name '(' Punctuation 's' Name ')' Punctuation ' ' Text '!=' Operator ' ' Text '0' Literal.Number.Integer '\n' Text '\n' Text 'check_ascii' Name '(' Punctuation 's' Name '::' Operator 'ByteString' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'is_valid_ascii' Name '(' Punctuation 's' Name ')' Punctuation ' ' Text '?' Operator ' ' Text 's' Name ' ' Text ':' Operator ' ' Text 'error' Name '(' Punctuation '"' Literal.String 'i' Literal.String 'n' Literal.String 'v' Literal.String 'a' Literal.String 'l' Literal.String 'i' Literal.String 'd' Literal.String ' ' Literal.String 'A' Literal.String 'S' Literal.String 'C' Literal.String 'I' Literal.String 'I' Literal.String ' ' Literal.String 's' Literal.String 'e' Literal.String 'q' Literal.String 'u' Literal.String 'e' Literal.String 'n' Literal.String 'c' Literal.String 'e' Literal.String '"' Literal.String ')' Punctuation '\n' Text 'check_utf8' Name ' ' Text '(' Punctuation 's' Name '::' Operator 'ByteString' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'is_valid_utf8' Name '(' Punctuation 's' Name ')' Punctuation ' ' Text '?' Operator ' ' Text 's' Name ' ' Text ':' Operator ' ' Text 'error' Name '(' Punctuation '"' Literal.String 'i' Literal.String 'n' Literal.String 'v' Literal.String 'a' Literal.String 'l' Literal.String 'i' Literal.String 'd' Literal.String ' ' Literal.String 'U' Literal.String 'T' Literal.String 'F' Literal.String '-' Literal.String '8' Literal.String ' ' Literal.String 's' Literal.String 'e' Literal.String 'q' Literal.String 'u' Literal.String 'e' Literal.String 'n' Literal.String 'c' Literal.String 'e' Literal.String '"' Literal.String ')' Punctuation '\n' Text '\n' Text '## string interpolation parsing ##' Comment '\n' Text '\n' Text 'function' Keyword ' ' Text '_jl_interp_parse' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'unescape' Name '::' Operator 'Function' Keyword.Type ',' Punctuation ' ' Text 'printer' Name '::' Operator 'Function' Keyword.Type ')' Punctuation '\n' Text ' ' Text 'sx' Name ' ' Text '=' Operator ' ' Text '{' Punctuation '}' Punctuation '\n' Text ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'j' Name ' ' Text '=' Operator ' ' Text 'start' Name '(' Punctuation 's' Name ')' Punctuation '\n' Text ' ' Text 'while' Keyword ' ' Text '!' Operator 'done' Name '(' Punctuation 's' Name ',' Punctuation 'j' Name ')' Punctuation '\n' Text ' ' Text 'c' Name ',' Punctuation ' ' Text 'k' Name ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 's' Name ',' Punctuation 'j' Name ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text 'c' Name ' ' Text '==' Operator ' ' Text "'$'" Literal.String.Char '\n' Text ' ' Text 'if' Keyword ' ' Text '!' Operator 'isempty' Name '(' Punctuation 's' Name '[' Punctuation 'i' Name ':' Operator 'j' Name '-' Operator '1' Literal.Number.Integer ']' Punctuation ')' Punctuation '\n' Text ' ' Text 'push' Name '(' Punctuation 'sx' Name ',' Punctuation ' ' Text 'unescape' Name '(' Punctuation 's' Name '[' Punctuation 'i' Name ':' Operator 'j' Name '-' Operator '1' Literal.Number.Integer ']' Punctuation ')' Punctuation ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'ex' Name ',' Punctuation ' ' Text 'j' Name ' ' Text '=' Operator ' ' Text 'parseatom' Name '(' Punctuation 's' Name ',' Punctuation 'k' Name ')' Punctuation '\n' Text ' ' Text 'push' Name '(' Punctuation 'sx' Name ',' Punctuation ' ' Text 'ex' Name ')' Punctuation '\n' Text ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'j' Name '\n' Text ' ' Text 'elseif' Keyword ' ' Text 'c' Name ' ' Text '==' Operator ' ' Text "'\\\\'" Literal.String.Char ' ' Text '&&' Operator ' ' Text '!' Operator 'done' Name '(' Punctuation 's' Name ',' Punctuation 'k' Name ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text 's' Name '[' Punctuation 'k' Name ']' Punctuation ' ' Text '==' Operator ' ' Text "'$'" Literal.String.Char '\n' Text ' ' Text 'if' Keyword ' ' Text '!' Operator 'isempty' Name '(' Punctuation 's' Name '[' Punctuation 'i' Name ':' Operator 'j' Name '-' Operator '1' Literal.Number.Integer ']' Punctuation ')' Punctuation '\n' Text ' ' Text 'push' Name '(' Punctuation 'sx' Name ',' Punctuation ' ' Text 'unescape' Name '(' Punctuation 's' Name '[' Punctuation 'i' Name ':' Operator 'j' Name '-' Operator '1' Literal.Number.Integer ']' Punctuation ')' Punctuation ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'k' Name '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'c' Name ',' Punctuation ' ' Text 'j' Name ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 's' Name ',' Punctuation 'k' Name ')' Punctuation '\n' Text ' ' Text 'else' Keyword '\n' Text ' ' Text 'j' Name ' ' Text '=' Operator ' ' Text 'k' Name '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'if' Keyword ' ' Text '!' Operator 'isempty' Name '(' Punctuation 's' Name '[' Punctuation 'i' Name ':' Operator ']' Punctuation ')' Punctuation '\n' Text ' ' Text 'push' Name '(' Punctuation 'sx' Name ',' Punctuation ' ' Text 'unescape' Name '(' Punctuation 's' Name '[' Punctuation 'i' Name ':' Operator 'j' Name '-' Operator '1' Literal.Number.Integer ']' Punctuation ')' Punctuation ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'length' Name '(' Punctuation 'sx' Name ')' Punctuation ' ' Text '==' Operator ' ' Text '1' Literal.Number.Integer ' ' Text '&&' Operator ' ' Text 'isa' Keyword.Pseudo '(' Punctuation 'sx' Name '[' Punctuation '1' Literal.Number.Integer ']' Punctuation ',' Punctuation 'ByteString' Name ')' Punctuation ' ' Text '?' Operator ' ' Text 'sx' Name '[' Punctuation '1' Literal.Number.Integer ']' Punctuation ' ' Text ':' Operator '\n' Text ' ' Text 'expr' Name '(' Punctuation ':' Operator 'call' Name ',' Punctuation ' ' Text ':' Operator 'print_to_string' Name ',' Punctuation ' ' Text 'printer' Name ',' Punctuation ' ' Text 'sx' Name '.' Operator '.' Operator '.' Operator ')' Punctuation '\n' Text 'end' Keyword '\n' Text '\n' Text '_jl_interp_parse' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'u' Name '::' Operator 'Function' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text '_jl_interp_parse' Name '(' Punctuation 's' Name ',' Punctuation ' ' Text 'u' Name ',' Punctuation ' ' Text 'print' Name ')' Punctuation '\n' Text '_jl_interp_parse' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text '_jl_interp_parse' Name '(' Punctuation 's' Name ',' Punctuation ' ' Text 'x' Name '-' Operator '>' Operator 'check_utf8' Name '(' Punctuation 'unescape_string' Name '(' Punctuation 'x' Name ')' Punctuation ')' Punctuation ')' Punctuation '\n' Text '\n' Text 'function' Keyword ' ' Text '_jl_interp_parse_bytes' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation '\n' Text ' ' Text 'writer' Name '(' Punctuation 'x' Name '.' Operator '.' Operator '.' Operator ')' Punctuation ' ' Text '=' Operator ' ' Text 'for' Keyword ' ' Text 'w' Name '=' Operator 'x' Name ';' Punctuation ' ' Text 'write' Name '(' Punctuation 'w' Name ')' Punctuation ';' Punctuation ' ' Text 'end' Keyword '\n' Text ' ' Text '_jl_interp_parse' Name '(' Punctuation 's' Name ',' Punctuation ' ' Text 'unescape_string' Name ',' Punctuation ' ' Text 'writer' Name ')' Punctuation '\n' Text 'end' Keyword '\n' Text '\n' Text '## core string macros ##' Comment '\n' Text '\n' Text 'macro' Keyword ' ' Text 'str' Name '(' Punctuation 's' Name ')' Punctuation ';' Punctuation ' ' Text '_jl_interp_parse' Name '(' Punctuation 's' Name ')' Punctuation ';' Punctuation ' ' Text 'end' Keyword '\n' Text 'macro' Keyword ' ' Text 'S_str' Name '(' Punctuation 's' Name ')' Punctuation ';' Punctuation ' ' Text '_jl_interp_parse' Name '(' Punctuation 's' Name ')' Punctuation ';' Punctuation ' ' Text 'end' Keyword '\n' Text 'macro' Keyword ' ' Text 'I_str' Name '(' Punctuation 's' Name ')' Punctuation ';' Punctuation ' ' Text '_jl_interp_parse' Name '(' Punctuation 's' Name ',' Punctuation ' ' Text 'x' Name '-' Operator '>' Operator 'unescape_chars' Name '(' Punctuation 'x' Name ',' Punctuation '"' Literal.String '\\"' Literal.String.Escape '"' Literal.String ')' Punctuation ')' Punctuation ';' Punctuation ' ' Text 'end' Keyword '\n' Text 'macro' Keyword ' ' Text 'E_str' Name '(' Punctuation 's' Name ')' Punctuation ';' Punctuation ' ' Text 'check_utf8' Name '(' Punctuation 'unescape_string' Name '(' Punctuation 's' Name ')' Punctuation ')' Punctuation ';' Punctuation ' ' Text 'end' Keyword '\n' Text 'macro' Keyword ' ' Text 'B_str' Name '(' Punctuation 's' Name ')' Punctuation ';' Punctuation ' ' Text '_jl_interp_parse_bytes' Name '(' Punctuation 's' Name ')' Punctuation ';' Punctuation ' ' Text 'end' Keyword '\n' Text 'macro' Keyword ' ' Text 'b_str' Name '(' Punctuation 's' Name ')' Punctuation ';' Punctuation ' ' Text 'ex' Name ' ' Text '=' Operator ' ' Text '_jl_interp_parse_bytes' Name '(' Punctuation 's' Name ')' Punctuation ';' Punctuation ' ' Text ':' Operator '(' Punctuation '(' Punctuation '$' Operator 'ex' Name ')' Punctuation '.' Operator 'data' Name ')' Punctuation ';' Punctuation ' ' Text 'end' Keyword '\n' Text '\n' Text '## shell-like command parsing ##' Comment '\n' Text '\n' Text 'function' Keyword ' ' Text '_jl_shell_parse' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'interp' Name '::' Operator 'Bool' Keyword.Type ')' Punctuation '\n' Text '\n' Text ' ' Text 'in_single_quotes' Name ' ' Text '=' Operator ' ' Text 'false' Keyword.Constant '\n' Text ' ' Text 'in_double_quotes' Name ' ' Text '=' Operator ' ' Text 'false' Keyword.Constant '\n' Text '\n' Text ' ' Text 'args' Name ' ' Text '=' Operator ' ' Text '{' Punctuation '}' Punctuation '\n' Text ' ' Text 'arg' Name ' ' Text '=' Operator ' ' Text '{' Punctuation '}' Punctuation '\n' Text ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'start' Name '(' Punctuation 's' Name ')' Punctuation '\n' Text ' ' Text 'j' Name ' ' Text '=' Operator ' ' Text 'i' Name '\n' Text '\n' Text ' ' Text 'function' Keyword ' ' Text 'update_arg' Name '(' Punctuation 'x' Name ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text '!' Operator 'isa' Keyword.Pseudo '(' Punctuation 'x' Name ',' Punctuation 'String' Name ')' Punctuation ' ' Text '||' Operator ' ' Text '!' Operator 'isempty' Name '(' Punctuation 'x' Name ')' Punctuation '\n' Text ' ' Text 'push' Name '(' Punctuation 'arg' Name ',' Punctuation ' ' Text 'x' Name ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'function' Keyword ' ' Text 'append_arg' Name '(' Punctuation ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text 'isempty' Name '(' Punctuation 'arg' Name ')' Punctuation ';' Punctuation ' ' Text 'arg' Name ' ' Text '=' Operator ' ' Text '{' Punctuation '"' Literal.String '"' Literal.String ',' Punctuation '}' Punctuation ';' Punctuation ' ' Text 'end' Keyword '\n' Text ' ' Text 'push' Name '(' Punctuation 'args' Name ',' Punctuation ' ' Text 'arg' Name ')' Punctuation '\n' Text ' ' Text 'arg' Name ' ' Text '=' Operator ' ' Text '{' Punctuation '}' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text '\n' Text ' ' Text 'while' Keyword ' ' Text '!' Operator 'done' Name '(' Punctuation 's' Name ',' Punctuation 'j' Name ')' Punctuation '\n' Text ' ' Text 'c' Name ',' Punctuation ' ' Text 'k' Name ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 's' Name ',' Punctuation 'j' Name ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text '!' Operator 'in_single_quotes' Name ' ' Text '&&' Operator ' ' Text '!' Operator 'in_double_quotes' Name ' ' Text '&&' Operator ' ' Text 'iswspace' Name '(' Punctuation 'c' Name ')' Punctuation '\n' Text ' ' Text 'update_arg' Name '(' Punctuation 's' Name '[' Punctuation 'i' Name ':' Operator 'j' Name '-' Operator '1' Literal.Number.Integer ']' Punctuation ')' Punctuation '\n' Text ' ' Text 'append_arg' Name '(' Punctuation ')' Punctuation '\n' Text ' ' Text 'j' Name ' ' Text '=' Operator ' ' Text 'k' Name '\n' Text ' ' Text 'while' Keyword ' ' Text '!' Operator 'done' Name '(' Punctuation 's' Name ',' Punctuation 'j' Name ')' Punctuation '\n' Text ' ' Text 'c' Name ',' Punctuation ' ' Text 'k' Name ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 's' Name ',' Punctuation 'j' Name ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text '!' Operator 'iswspace' Name '(' Punctuation 'c' Name ')' Punctuation '\n' Text ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'j' Name '\n' Text ' ' Text 'break' Keyword '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'j' Name ' ' Text '=' Operator ' ' Text 'k' Name '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'elseif' Keyword ' ' Text 'interp' Name ' ' Text '&&' Operator ' ' Text '!' Operator 'in_single_quotes' Name ' ' Text '&&' Operator ' ' Text 'c' Name ' ' Text '==' Operator ' ' Text "'$'" Literal.String.Char '\n' Text ' ' Text 'update_arg' Name '(' Punctuation 's' Name '[' Punctuation 'i' Name ':' Operator 'j' Name '-' Operator '1' Literal.Number.Integer ']' Punctuation ')' Punctuation ';' Punctuation ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'k' Name ';' Punctuation ' ' Text 'j' Name ' ' Text '=' Operator ' ' Text 'k' Name '\n' Text ' ' Text 'if' Keyword ' ' Text 'done' Name '(' Punctuation 's' Name ',' Punctuation 'k' Name ')' Punctuation '\n' Text ' ' Text 'error' Name '(' Punctuation '"' Literal.String '\\$' Literal.String.Escape ' ' Literal.String 'r' Literal.String 'i' Literal.String 'g' Literal.String 'h' Literal.String 't' Literal.String ' ' Literal.String 'b' Literal.String 'e' Literal.String 'f' Literal.String 'o' Literal.String 'r' Literal.String 'e' Literal.String ' ' Literal.String 'e' Literal.String 'n' Literal.String 'd' Literal.String ' ' Literal.String 'o' Literal.String 'f' Literal.String ' ' Literal.String 'c' Literal.String 'o' Literal.String 'm' Literal.String 'm' Literal.String 'a' Literal.String 'n' Literal.String 'd' Literal.String '"' Literal.String ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'if' Keyword ' ' Text 'iswspace' Name '(' Punctuation 's' Name '[' Punctuation 'k' Name ']' Punctuation ')' Punctuation '\n' Text ' ' Text 'error' Name '(' Punctuation '"' Literal.String 's' Literal.String 'p' Literal.String 'a' Literal.String 'c' Literal.String 'e' Literal.String ' ' Literal.String 'n' Literal.String 'o' Literal.String 't' Literal.String ' ' Literal.String 'a' Literal.String 'l' Literal.String 'l' Literal.String 'o' Literal.String 'w' Literal.String 'e' Literal.String 'd' Literal.String ' ' Literal.String 'r' Literal.String 'i' Literal.String 'g' Literal.String 'h' Literal.String 't' Literal.String ' ' Literal.String 'a' Literal.String 'f' Literal.String 't' Literal.String 'e' Literal.String 'r' Literal.String ' ' Literal.String '\\$' Literal.String.Escape '"' Literal.String ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'ex' Name ',' Punctuation ' ' Text 'j' Name ' ' Text '=' Operator ' ' Text 'parseatom' Name '(' Punctuation 's' Name ',' Punctuation 'j' Name ')' Punctuation '\n' Text ' ' Text 'update_arg' Name '(' Punctuation 'ex' Name ')' Punctuation ';' Punctuation ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'j' Name '\n' Text ' ' Text 'else' Keyword '\n' Text ' ' Text 'if' Keyword ' ' Text '!' Operator 'in_double_quotes' Name ' ' Text '&&' Operator ' ' Text 'c' Name ' ' Text '==' Operator ' ' Text "'\\''" Literal.String.Char '\n' Text ' ' Text 'in_single_quotes' Name ' ' Text '=' Operator ' ' Text '!' Operator 'in_single_quotes' Name '\n' Text ' ' Text 'update_arg' Name '(' Punctuation 's' Name '[' Punctuation 'i' Name ':' Operator 'j' Name '-' Operator '1' Literal.Number.Integer ']' Punctuation ')' Punctuation ';' Punctuation ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'k' Name '\n' Text ' ' Text 'elseif' Keyword ' ' Text '!' Operator 'in_single_quotes' Name ' ' Text '&&' Operator ' ' Text 'c' Name ' ' Text '==' Operator ' ' Text '\'"\'' Literal.String.Char '\n' Text ' ' Text 'in_double_quotes' Name ' ' Text '=' Operator ' ' Text '!' Operator 'in_double_quotes' Name '\n' Text ' ' Text 'update_arg' Name '(' Punctuation 's' Name '[' Punctuation 'i' Name ':' Operator 'j' Name '-' Operator '1' Literal.Number.Integer ']' Punctuation ')' Punctuation ';' Punctuation ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'k' Name '\n' Text ' ' Text 'elseif' Keyword ' ' Text 'c' Name ' ' Text '==' Operator ' ' Text "'\\\\'" Literal.String.Char '\n' Text ' ' Text 'if' Keyword ' ' Text 'in_double_quotes' Name '\n' Text ' ' Text 'if' Keyword ' ' Text 'done' Name '(' Punctuation 's' Name ',' Punctuation 'k' Name ')' Punctuation '\n' Text ' ' Text 'error' Name '(' Punctuation '"' Literal.String 'u' Literal.String 'n' Literal.String 't' Literal.String 'e' Literal.String 'r' Literal.String 'm' Literal.String 'i' Literal.String 'n' Literal.String 'a' Literal.String 't' Literal.String 'e' Literal.String 'd' Literal.String ' ' Literal.String 'd' Literal.String 'o' Literal.String 'u' Literal.String 'b' Literal.String 'l' Literal.String 'e' Literal.String ' ' Literal.String 'q' Literal.String 'u' Literal.String 'o' Literal.String 't' Literal.String 'e' Literal.String '"' Literal.String ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'if' Keyword ' ' Text 's' Name '[' Punctuation 'k' Name ']' Punctuation ' ' Text '==' Operator ' ' Text '\'"\'' Literal.String.Char ' ' Text '||' Operator ' ' Text 's' Name '[' Punctuation 'k' Name ']' Punctuation ' ' Text '==' Operator ' ' Text "'$'" Literal.String.Char '\n' Text ' ' Text 'update_arg' Name '(' Punctuation 's' Name '[' Punctuation 'i' Name ':' Operator 'j' Name '-' Operator '1' Literal.Number.Integer ']' Punctuation ')' Punctuation ';' Punctuation ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'k' Name '\n' Text ' ' Text 'c' Name ',' Punctuation ' ' Text 'k' Name ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 's' Name ',' Punctuation 'k' Name ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'elseif' Keyword ' ' Text '!' Operator 'in_single_quotes' Name '\n' Text ' ' Text 'if' Keyword ' ' Text 'done' Name '(' Punctuation 's' Name ',' Punctuation 'k' Name ')' Punctuation '\n' Text ' ' Text 'error' Name '(' Punctuation '"' Literal.String 'd' Literal.String 'a' Literal.String 'n' Literal.String 'g' Literal.String 'l' Literal.String 'i' Literal.String 'n' Literal.String 'g' Literal.String ' ' Literal.String 'b' Literal.String 'a' Literal.String 'c' Literal.String 'k' Literal.String 's' Literal.String 'l' Literal.String 'a' Literal.String 's' Literal.String 'h' Literal.String '"' Literal.String ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'update_arg' Name '(' Punctuation 's' Name '[' Punctuation 'i' Name ':' Operator 'j' Name '-' Operator '1' Literal.Number.Integer ']' Punctuation ')' Punctuation ';' Punctuation ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'k' Name '\n' Text ' ' Text 'c' Name ',' Punctuation ' ' Text 'k' Name ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 's' Name ',' Punctuation 'k' Name ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'j' Name ' ' Text '=' Operator ' ' Text 'k' Name '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'end' Keyword '\n' Text '\n' Text ' ' Text 'if' Keyword ' ' Text 'in_single_quotes' Name ';' Punctuation ' ' Text 'error' Name '(' Punctuation '"' Literal.String 'u' Literal.String 'n' Literal.String 't' Literal.String 'e' Literal.String 'r' Literal.String 'm' Literal.String 'i' Literal.String 'n' Literal.String 'a' Literal.String 't' Literal.String 'e' Literal.String 'd' Literal.String ' ' Literal.String 's' Literal.String 'i' Literal.String 'n' Literal.String 'g' Literal.String 'l' Literal.String 'e' Literal.String ' ' Literal.String 'q' Literal.String 'u' Literal.String 'o' Literal.String 't' Literal.String 'e' Literal.String '"' Literal.String ')' Punctuation ';' Punctuation ' ' Text 'end' Keyword '\n' Text ' ' Text 'if' Keyword ' ' Text 'in_double_quotes' Name ';' Punctuation ' ' Text 'error' Name '(' Punctuation '"' Literal.String 'u' Literal.String 'n' Literal.String 't' Literal.String 'e' Literal.String 'r' Literal.String 'm' Literal.String 'i' Literal.String 'n' Literal.String 'a' Literal.String 't' Literal.String 'e' Literal.String 'd' Literal.String ' ' Literal.String 'd' Literal.String 'o' Literal.String 'u' Literal.String 'b' Literal.String 'l' Literal.String 'e' Literal.String ' ' Literal.String 'q' Literal.String 'u' Literal.String 'o' Literal.String 't' Literal.String 'e' Literal.String '"' Literal.String ')' Punctuation ';' Punctuation ' ' Text 'end' Keyword '\n' Text '\n' Text ' ' Text 'update_arg' Name '(' Punctuation 's' Name '[' Punctuation 'i' Name ':' Operator ']' Punctuation ')' Punctuation '\n' Text ' ' Text 'append_arg' Name '(' Punctuation ')' Punctuation '\n' Text '\n' Text ' ' Text 'if' Keyword ' ' Text '!' Operator 'interp' Name '\n' Text ' ' Text 'return' Keyword ' ' Text 'args' Name '\n' Text ' ' Text 'end' Keyword '\n' Text '\n' Text ' ' Text '# construct an expression' Comment '\n' Text ' ' Text 'exprs' Name ' ' Text '=' Operator ' ' Text '{' Punctuation '}' Punctuation '\n' Text ' ' Text 'for' Keyword ' ' Text 'arg' Name ' ' Text 'in' Keyword.Pseudo ' ' Text 'args' Name '\n' Text ' ' Text 'push' Name '(' Punctuation 'exprs' Name ',' Punctuation ' ' Text 'expr' Name '(' Punctuation ':' Operator 'tuple' Name ',' Punctuation ' ' Text 'arg' Name ')' Punctuation ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'expr' Name '(' Punctuation ':' Operator 'tuple' Name ',' Punctuation 'exprs' Name ')' Punctuation '\n' Text 'end' Keyword '\n' Text '_jl_shell_parse' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text '_jl_shell_parse' Name '(' Punctuation 's' Name ',' Punctuation 'true' Keyword.Constant ')' Punctuation '\n' Text '\n' Text 'function' Keyword ' ' Text 'shell_split' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation '\n' Text ' ' Text 'parsed' Name ' ' Text '=' Operator ' ' Text '_jl_shell_parse' Name '(' Punctuation 's' Name ',' Punctuation 'false' Keyword.Constant ')' Punctuation '\n' Text ' ' Text 'args' Name ' ' Text '=' Operator ' ' Text 'String' Name '[' Punctuation ']' Punctuation '\n' Text ' ' Text 'for' Keyword ' ' Text 'arg' Name ' ' Text 'in' Keyword.Pseudo ' ' Text 'parsed' Name '\n' Text ' ' Text 'push' Name '(' Punctuation 'args' Name ',' Punctuation ' ' Text 'strcat' Name '(' Punctuation 'arg' Name '.' Operator '.' Operator '.' Operator ')' Punctuation ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'args' Name '\n' Text 'end' Keyword '\n' Text '\n' Text 'function' Keyword ' ' Text 'print_shell_word' Name '(' Punctuation 'word' Name '::' Operator 'String' Name ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text 'isempty' Name '(' Punctuation 'word' Name ')' Punctuation '\n' Text ' ' Text 'print' Name '(' Punctuation '"' Literal.String "'" Literal.String "'" Literal.String '"' Literal.String ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'has_single' Name ' ' Text '=' Operator ' ' Text 'false' Keyword.Constant '\n' Text ' ' Text 'has_special' Name ' ' Text '=' Operator ' ' Text 'false' Keyword.Constant '\n' Text ' ' Text 'for' Keyword ' ' Text 'c' Name ' ' Text 'in' Keyword.Pseudo ' ' Text 'word' Name '\n' Text ' ' Text 'if' Keyword ' ' Text 'iswspace' Name '(' Punctuation 'c' Name ')' Punctuation ' ' Text '||' Operator ' ' Text 'c' Name '==' Operator "'\\\\'" Literal.String.Char ' ' Text '||' Operator ' ' Text 'c' Name '==' Operator "'\\''" Literal.String.Char ' ' Text '||' Operator ' ' Text 'c' Name '==' Operator '\'"\'' Literal.String.Char ' ' Text '||' Operator ' ' Text 'c' Name '==' Operator "'$'" Literal.String.Char '\n' Text ' ' Text 'has_special' Name ' ' Text '=' Operator ' ' Text 'true' Keyword.Constant '\n' Text ' ' Text 'if' Keyword ' ' Text 'c' Name ' ' Text '==' Operator ' ' Text "'\\''" Literal.String.Char '\n' Text ' ' Text 'has_single' Name ' ' Text '=' Operator ' ' Text 'true' Keyword.Constant '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'if' Keyword ' ' Text '!' Operator 'has_special' Name '\n' Text ' ' Text 'print' Name '(' Punctuation 'word' Name ')' Punctuation '\n' Text ' ' Text 'elseif' Keyword ' ' Text '!' Operator 'has_single' Name '\n' Text ' ' Text 'print' Name '(' Punctuation "'\\''" Literal.String.Char ',' Punctuation ' ' Text 'word' Name ',' Punctuation ' ' Text "'\\''" Literal.String.Char ')' Punctuation '\n' Text ' ' Text 'else' Keyword '\n' Text ' ' Text 'print' Name '(' Punctuation '\'"\'' Literal.String.Char ')' Punctuation '\n' Text ' ' Text 'for' Keyword ' ' Text 'c' Name ' ' Text 'in' Keyword.Pseudo ' ' Text 'word' Name '\n' Text ' ' Text 'if' Keyword ' ' Text 'c' Name ' ' Text '==' Operator ' ' Text '\'"\'' Literal.String.Char ' ' Text '||' Operator ' ' Text 'c' Name ' ' Text '==' Operator ' ' Text "'$'" Literal.String.Char '\n' Text ' ' Text 'print' Name '(' Punctuation "'\\\\'" Literal.String.Char ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'print' Name '(' Punctuation 'c' Name ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'print' Name '(' Punctuation '\'"\'' Literal.String.Char ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text 'end' Keyword '\n' Text '\n' Text 'function' Keyword ' ' Text 'print_shell_escaped' Name '(' Punctuation 'cmd' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'args' Name '::' Operator 'String' Name '.' Operator '.' Operator '.' Operator ')' Punctuation '\n' Text ' ' Text 'print_shell_word' Name '(' Punctuation 'cmd' Name ')' Punctuation '\n' Text ' ' Text 'for' Keyword ' ' Text 'arg' Name ' ' Text 'in' Keyword.Pseudo ' ' Text 'args' Name '\n' Text ' ' Text 'print' Name '(' Punctuation "' '" Literal.String.Char ')' Punctuation '\n' Text ' ' Text 'print_shell_word' Name '(' Punctuation 'arg' Name ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text 'end' Keyword '\n' Text '\n' Text 'shell_escape' Name '(' Punctuation 'cmd' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'args' Name '::' Operator 'String' Name '.' Operator '.' Operator '.' Operator ')' Punctuation ' ' Text '=' Operator '\n' Text ' ' Text 'print_to_string' Name '(' Punctuation 'print_shell_escaped' Name ',' Punctuation ' ' Text 'cmd' Name ',' Punctuation ' ' Text 'args' Name '.' Operator '.' Operator '.' Operator ')' Punctuation '\n' Text '\n' Text '## interface to parser ##' Comment '\n' Text '\n' Text 'function' Keyword ' ' Text 'parse' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'pos' Name ',' Punctuation ' ' Text 'greedy' Name ')' Punctuation '\n' Text ' ' Text '# returns (expr, end_pos). expr is () in case of parse error.' Comment '\n' Text ' ' Text 'ex' Name ',' Punctuation ' ' Text 'pos' Name ' ' Text '=' Operator ' ' Text 'ccall' Keyword '(' Punctuation ':' Operator 'jl_parse_string' Name ',' Punctuation ' ' Text 'Any' Keyword.Type ',' Punctuation '\n' Text ' ' Text '(' Punctuation 'Ptr' Keyword.Type '{' Punctuation 'Uint8' Name '}' Punctuation ',' Punctuation ' ' Text 'Int32' Keyword.Type ',' Punctuation ' ' Text 'Int32' Keyword.Type ')' Punctuation ',' Punctuation '\n' Text ' ' Text 'cstring' Name '(' Punctuation 's' Name ')' Punctuation ',' Punctuation ' ' Text 'pos' Name '-' Operator '1' Literal.Number.Integer ',' Punctuation ' ' Text 'greedy' Name ' ' Text '?' Operator ' ' Text '1' Literal.Number.Integer ':' Operator '0' Literal.Number.Integer ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text 'isa' Keyword.Pseudo '(' Punctuation 'ex' Name ',' Punctuation 'Expr' Keyword.Type ')' Punctuation ' ' Text '&&' Operator ' ' Text 'is' Name '(' Punctuation 'ex' Name '.' Operator 'head' Name ',' Punctuation ':' Operator 'error' Name ')' Punctuation '\n' Text ' ' Text 'throw' Name '(' Punctuation 'ParseError' Keyword.Type '(' Punctuation 'ex' Name '.' Operator 'args' Name '[' Punctuation '1' Literal.Number.Integer ']' Punctuation ')' Punctuation ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'if' Keyword ' ' Text 'ex' Name ' ' Text '==' Operator ' ' Text '(' Punctuation ')' Punctuation ';' Punctuation ' ' Text 'throw' Name '(' Punctuation 'ParseError' Keyword.Type '(' Punctuation '"' Literal.String 'e' Literal.String 'n' Literal.String 'd' Literal.String ' ' Literal.String 'o' Literal.String 'f' Literal.String ' ' Literal.String 'i' Literal.String 'n' Literal.String 'p' Literal.String 'u' Literal.String 't' Literal.String '"' Literal.String ')' Punctuation ')' Punctuation ';' Punctuation ' ' Text 'end' Keyword '\n' Text ' ' Text 'ex' Name ',' Punctuation ' ' Text 'pos' Name '+' Operator '1' Literal.Number.Integer ' ' Text '# C is zero-based, Julia is 1-based' Comment '\n' Text 'end' Keyword '\n' Text '\n' Text 'parse' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'parse' Name '(' Punctuation 's' Name ',' Punctuation ' ' Text '1' Literal.Number.Integer ',' Punctuation ' ' Text 'true' Keyword.Constant ')' Punctuation '\n' Text 'parse' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'pos' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'parse' Name '(' Punctuation 's' Name ',' Punctuation ' ' Text 'pos' Name ',' Punctuation ' ' Text 'true' Keyword.Constant ')' Punctuation '\n' Text 'parseatom' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'parse' Name '(' Punctuation 's' Name ',' Punctuation ' ' Text '1' Literal.Number.Integer ',' Punctuation ' ' Text 'false' Keyword.Constant ')' Punctuation '\n' Text 'parseatom' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'pos' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'parse' Name '(' Punctuation 's' Name ',' Punctuation ' ' Text 'pos' Name ',' Punctuation ' ' Text 'false' Keyword.Constant ')' Punctuation '\n' Text '\n' Text '## miscellaneous string functions ##' Comment '\n' Text '\n' Text 'function' Keyword ' ' Text 'lpad' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'n' Name '::' Operator 'Integer' Keyword.Type ',' Punctuation ' ' Text 'p' Name '::' Operator 'String' Name ')' Punctuation '\n' Text ' ' Text 'm' Name ' ' Text '=' Operator ' ' Text 'n' Name ' ' Text '-' Operator ' ' Text 'strlen' Name '(' Punctuation 's' Name ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text 'm' Name ' ' Text '<=' Operator ' ' Text '0' Literal.Number.Integer ';' Punctuation ' ' Text 'return' Keyword ' ' Text 's' Name ';' Punctuation ' ' Text 'end' Keyword '\n' Text ' ' Text 'l' Name ' ' Text '=' Operator ' ' Text 'strlen' Name '(' Punctuation 'p' Name ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text 'l' Name '==' Operator '1' Literal.Number.Integer '\n' Text ' ' Text 'return' Keyword ' ' Text 'p' Name '^' Operator 'm' Name ' ' Text '*' Operator ' ' Text 's' Name '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'q' Name ' ' Text '=' Operator ' ' Text 'div' Name '(' Punctuation 'm' Name ',' Punctuation 'l' Name ')' Punctuation '\n' Text ' ' Text 'r' Name ' ' Text '=' Operator ' ' Text 'm' Name ' ' Text '-' Operator ' ' Text 'q' Name '*' Operator 'l' Name '\n' Text ' ' Text 'cstring' Name '(' Punctuation 'p' Name '^' Operator 'q' Name '*' Operator 'p' Name '[' Punctuation '1' Literal.Number.Integer ':' Operator 'chr2ind' Name '(' Punctuation 'p' Name ',' Punctuation 'r' Name ')' Punctuation ']' Punctuation '*' Operator 's' Name ')' Punctuation '\n' Text 'end' Keyword '\n' Text '\n' Text 'function' Keyword ' ' Text 'rpad' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'n' Name '::' Operator 'Integer' Keyword.Type ',' Punctuation ' ' Text 'p' Name '::' Operator 'String' Name ')' Punctuation '\n' Text ' ' Text 'm' Name ' ' Text '=' Operator ' ' Text 'n' Name ' ' Text '-' Operator ' ' Text 'strlen' Name '(' Punctuation 's' Name ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text 'm' Name ' ' Text '<=' Operator ' ' Text '0' Literal.Number.Integer ';' Punctuation ' ' Text 'return' Keyword ' ' Text 's' Name ';' Punctuation ' ' Text 'end' Keyword '\n' Text ' ' Text 'l' Name ' ' Text '=' Operator ' ' Text 'strlen' Name '(' Punctuation 'p' Name ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text 'l' Name '==' Operator '1' Literal.Number.Integer '\n' Text ' ' Text 'return' Keyword ' ' Text 's' Name ' ' Text '*' Operator ' ' Text 'p' Name '^' Operator 'm' Name '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'q' Name ' ' Text '=' Operator ' ' Text 'div' Name '(' Punctuation 'm' Name ',' Punctuation 'l' Name ')' Punctuation '\n' Text ' ' Text 'r' Name ' ' Text '=' Operator ' ' Text 'm' Name ' ' Text '-' Operator ' ' Text 'q' Name '*' Operator 'l' Name '\n' Text ' ' Text 'cstring' Name '(' Punctuation 's' Name '*' Operator 'p' Name '^' Operator 'q' Name '*' Operator 'p' Name '[' Punctuation '1' Literal.Number.Integer ':' Operator 'chr2ind' Name '(' Punctuation 'p' Name ',' Punctuation 'r' Name ')' Punctuation ']' Punctuation ')' Punctuation '\n' Text 'end' Keyword '\n' Text '\n' Text 'lpad' Name '(' Punctuation 's' Name ',' Punctuation ' ' Text 'n' Name '::' Operator 'Integer' Keyword.Type ',' Punctuation ' ' Text 'p' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'lpad' Name '(' Punctuation 'string' Name '(' Punctuation 's' Name ')' Punctuation ',' Punctuation ' ' Text 'n' Name ',' Punctuation ' ' Text 'string' Name '(' Punctuation 'p' Name ')' Punctuation ')' Punctuation '\n' Text 'rpad' Name '(' Punctuation 's' Name ',' Punctuation ' ' Text 'n' Name '::' Operator 'Integer' Keyword.Type ',' Punctuation ' ' Text 'p' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'rpad' Name '(' Punctuation 'string' Name '(' Punctuation 's' Name ')' Punctuation ',' Punctuation ' ' Text 'n' Name ',' Punctuation ' ' Text 'string' Name '(' Punctuation 'p' Name ')' Punctuation ')' Punctuation '\n' Text '\n' Text 'lpad' Name '(' Punctuation 's' Name ',' Punctuation ' ' Text 'n' Name '::' Operator 'Integer' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'lpad' Name '(' Punctuation 'string' Name '(' Punctuation 's' Name ')' Punctuation ',' Punctuation ' ' Text 'n' Name ',' Punctuation ' ' Text '"' Literal.String ' ' Literal.String '"' Literal.String ')' Punctuation '\n' Text 'rpad' Name '(' Punctuation 's' Name ',' Punctuation ' ' Text 'n' Name '::' Operator 'Integer' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'rpad' Name '(' Punctuation 'string' Name '(' Punctuation 's' Name ')' Punctuation ',' Punctuation ' ' Text 'n' Name ',' Punctuation ' ' Text '"' Literal.String ' ' Literal.String '"' Literal.String ')' Punctuation '\n' Text '\n' Text 'function' Keyword ' ' Text 'split' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'delims' Name ',' Punctuation ' ' Text 'include_empty' Name '::' Operator 'Bool' Keyword.Type ')' Punctuation '\n' Text ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text '1' Literal.Number.Integer '\n' Text ' ' Text 'strs' Name ' ' Text '=' Operator ' ' Text 'String' Name '[' Punctuation ']' Punctuation '\n' Text ' ' Text 'len' Name ' ' Text '=' Operator ' ' Text 'length' Name '(' Punctuation 's' Name ')' Punctuation '\n' Text ' ' Text 'while' Keyword ' ' Text 'true' Keyword.Constant '\n' Text ' ' Text 'tokstart' Name ' ' Text '=' Operator ' ' Text 'tokend' Name ' ' Text '=' Operator ' ' Text 'i' Name '\n' Text ' ' Text 'while' Keyword ' ' Text '!' Operator 'done' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text '(' Punctuation 'c' Name ',' Punctuation 'i' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text 'contains' Name '(' Punctuation 'delims' Name ',' Punctuation ' ' Text 'c' Name ')' Punctuation '\n' Text ' ' Text 'break' Keyword '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'tokend' Name ' ' Text '=' Operator ' ' Text 'i' Name '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'tok' Name ' ' Text '=' Operator ' ' Text 's' Name '[' Punctuation 'tokstart' Name ':' Operator '(' Punctuation 'tokend' Name '-' Operator '1' Literal.Number.Integer ')' Punctuation ']' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text 'include_empty' Name ' ' Text '||' Operator ' ' Text '!' Operator 'isempty' Name '(' Punctuation 'tok' Name ')' Punctuation '\n' Text ' ' Text 'push' Name '(' Punctuation 'strs' Name ',' Punctuation ' ' Text 'tok' Name ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'if' Keyword ' ' Text '!' Operator '(' Punctuation '(' Punctuation 'i' Name ' ' Text '<=' Operator ' ' Text 'len' Name ')' Punctuation ' ' Text '||' Operator ' ' Text '(' Punctuation 'i' Name '==' Operator 'len' Name '+' Operator '1' Literal.Number.Integer ' ' Text '&&' Operator ' ' Text 'tokend!' Name '=' Operator 'i' Name ')' Punctuation ')' Punctuation '\n' Text ' ' Text 'break' Keyword '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'strs' Name '\n' Text 'end' Keyword '\n' Text '\n' Text 'split' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'split' Name '(' Punctuation 's' Name ',' Punctuation ' ' Text '(' Punctuation "' '" Literal.String.Char ',' Punctuation "'\\t'" Literal.String.Char ',' Punctuation "'\\n'" Literal.String.Char ',' Punctuation "'\\v'" Literal.String.Char ',' Punctuation "'\\f'" Literal.String.Char ',' Punctuation "'\\r'" Literal.String.Char ')' Punctuation ',' Punctuation ' ' Text 'false' Keyword.Constant ')' Punctuation '\n' Text 'split' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'x' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'split' Name '(' Punctuation 's' Name ',' Punctuation ' ' Text 'x' Name ',' Punctuation ' ' Text 'true' Keyword.Constant ')' Punctuation '\n' Text 'split' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'x' Name '::' Operator 'Char' Keyword.Type ',' Punctuation ' ' Text 'incl' Name '::' Operator 'Bool' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'split' Name '(' Punctuation 's' Name ',' Punctuation ' ' Text '(' Punctuation 'x' Name ',' Punctuation ')' Punctuation ',' Punctuation ' ' Text 'incl' Name ')' Punctuation '\n' Text '\n' Text 'function' Keyword ' ' Text 'print_joined' Name '(' Punctuation 'strings' Name ',' Punctuation ' ' Text 'delim' Name ',' Punctuation ' ' Text 'last' Name ')' Punctuation '\n' Text ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'start' Name '(' Punctuation 'strings' Name ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text 'done' Name '(' Punctuation 'strings' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'return' Keyword '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'str' Name ',' Punctuation ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 'strings' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'print' Name '(' Punctuation 'str' Name ')' Punctuation '\n' Text ' ' Text 'while' Keyword ' ' Text '!' Operator 'done' Name '(' Punctuation 'strings' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'str' Name ',' Punctuation ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 'strings' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'print' Name '(' Punctuation 'done' Name '(' Punctuation 'strings' Name ',' Punctuation 'i' Name ')' Punctuation ' ' Text '?' Operator ' ' Text 'last' Name ' ' Text ':' Operator ' ' Text 'delim' Name ')' Punctuation '\n' Text ' ' Text 'print' Name '(' Punctuation 'str' Name ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text 'end' Keyword '\n' Text '\n' Text 'function' Keyword ' ' Text 'print_joined' Name '(' Punctuation 'strings' Name ',' Punctuation ' ' Text 'delim' Name ')' Punctuation '\n' Text ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'start' Name '(' Punctuation 'strings' Name ')' Punctuation '\n' Text ' ' Text 'while' Keyword ' ' Text '!' Operator 'done' Name '(' Punctuation 'strings' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'str' Name ',' Punctuation ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 'strings' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'print' Name '(' Punctuation 'str' Name ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text '!' Operator 'done' Name '(' Punctuation 'strings' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'print' Name '(' Punctuation 'delim' Name ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'end' Keyword '\n' Text 'end' Keyword '\n' Text 'print_joined' Name '(' Punctuation 'strings' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'print_joined' Name '(' Punctuation 'strings' Name ',' Punctuation ' ' Text '"' Literal.String '"' Literal.String ')' Punctuation '\n' Text '\n' Text 'join' Name '(' Punctuation 'args' Name '.' Operator '.' Operator '.' Operator ')' Punctuation ' ' Text '=' Operator ' ' Text 'print_to_string' Name '(' Punctuation 'print_joined' Name ',' Punctuation ' ' Text 'args' Name '.' Operator '.' Operator '.' Operator ')' Punctuation '\n' Text '\n' Text 'chop' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 's' Name '[' Punctuation '1' Literal.Number.Integer ':' Operator 'thisind' Name '(' Punctuation 's' Name ',' Punctuation 'length' Name '(' Punctuation 's' Name ')' Punctuation ')' Punctuation '-' Operator '1' Literal.Number.Integer ']' Punctuation '\n' Text 'chomp' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text '(' Punctuation 'i' Name '=' Operator 'thisind' Name '(' Punctuation 's' Name ',' Punctuation 'length' Name '(' Punctuation 's' Name ')' Punctuation ')' Punctuation ';' Punctuation ' ' Text 's' Name '[' Punctuation 'i' Name ']' Punctuation '==' Operator "'\\n'" Literal.String.Char ' ' Text '?' Operator ' ' Text 's' Name '[' Punctuation '1' Literal.Number.Integer ':' Operator 'i' Name '-' Operator '1' Literal.Number.Integer ']' Punctuation ' ' Text ':' Operator ' ' Text 's' Name ')' Punctuation '\n' Text 'chomp' Name '(' Punctuation 's' Name '::' Operator 'ByteString' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 's' Name '.' Operator 'data' Name '[' Punctuation 'end' Keyword ']' Punctuation '==' Operator '0x0a' Literal.Number.Hex ' ' Text '?' Operator ' ' Text 's' Name '[' Punctuation '1' Literal.Number.Integer ':' Operator 'end' Keyword '-' Operator '1' Literal.Number.Integer ']' Punctuation ' ' Text ':' Operator ' ' Text 's' Name '\n' Text '\n' Text 'function' Keyword ' ' Text 'lstrip' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation '\n' Text ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'start' Name '(' Punctuation 's' Name ')' Punctuation '\n' Text ' ' Text 'while' Keyword ' ' Text '!' Operator 'done' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'c' Name ',' Punctuation ' ' Text 'j' Name ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text '!' Operator 'iswspace' Name '(' Punctuation 'c' Name ')' Punctuation '\n' Text ' ' Text 'return' Keyword ' ' Text 's' Name '[' Punctuation 'i' Name ':' Operator 'end' Keyword ']' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'j' Name '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text '"' Literal.String '"' Literal.String '\n' Text 'end' Keyword '\n' Text '\n' Text 'function' Keyword ' ' Text 'rstrip' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation '\n' Text ' ' Text 'r' Name ' ' Text '=' Operator ' ' Text 'reverse' Name '(' Punctuation 's' Name ')' Punctuation '\n' Text ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'start' Name '(' Punctuation 'r' Name ')' Punctuation '\n' Text ' ' Text 'while' Keyword ' ' Text '!' Operator 'done' Name '(' Punctuation 'r' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'c' Name ',' Punctuation ' ' Text 'j' Name ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 'r' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text '!' Operator 'iswspace' Name '(' Punctuation 'c' Name ')' Punctuation '\n' Text ' ' Text 'return' Keyword ' ' Text 's' Name '[' Punctuation '1' Literal.Number.Integer ':' Operator 'end' Keyword '-' Operator 'i' Name '+' Operator '1' Literal.Number.Integer ']' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'j' Name '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text '"' Literal.String '"' Literal.String '\n' Text 'end' Keyword '\n' Text '\n' Text 'strip' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'lstrip' Name '(' Punctuation 'rstrip' Name '(' Punctuation 's' Name ')' Punctuation ')' Punctuation '\n' Text '\n' Text '## string to integer functions ##' Comment '\n' Text '\n' Text 'function' Keyword ' ' Text 'parse_int' Name '{' Punctuation 'T' Name '<:' Operator 'Integer' Keyword.Type '}' Punctuation '(' Punctuation '::' Operator 'Type' Keyword.Type '{' Punctuation 'T' Name '}' Punctuation ',' Punctuation ' ' Text 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'base' Name '::' Operator 'Integer' Keyword.Type ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text '!' Operator '(' Punctuation '2' Literal.Number.Integer ' ' Text '<=' Operator ' ' Text 'base' Name ' ' Text '<=' Operator ' ' Text '36' Literal.Number.Integer ')' Punctuation ';' Punctuation ' ' Text 'error' Name '(' Punctuation '"' Literal.String 'i' Literal.String 'n' Literal.String 'v' Literal.String 'a' Literal.String 'l' Literal.String 'i' Literal.String 'd' Literal.String ' ' Literal.String 'b' Literal.String 'a' Literal.String 's' Literal.String 'e' Literal.String ':' Literal.String ' ' Literal.String '"' Literal.String ',' Punctuation 'base' Name ')' Punctuation ';' Punctuation ' ' Text 'end' Keyword '\n' Text ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'start' Name '(' Punctuation 's' Name ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text 'done' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'error' Name '(' Punctuation '"' Literal.String 'p' Literal.String 'r' Literal.String 'e' Literal.String 'm' Literal.String 'a' Literal.String 't' Literal.String 'u' Literal.String 'r' Literal.String 'e' Literal.String ' ' Literal.String 'e' Literal.String 'n' Literal.String 'd' Literal.String ' ' Literal.String 'o' Literal.String 'f' Literal.String ' ' Literal.String 'i' Literal.String 'n' Literal.String 't' Literal.String 'e' Literal.String 'g' Literal.String 'e' Literal.String 'r' Literal.String ' ' Literal.String '(' Literal.String 'i' Literal.String 'n' Literal.String ' ' Literal.String '"' Literal.String ',' Punctuation 'show_to_string' Name '(' Punctuation 's' Name ')' Punctuation ',' Punctuation '"' Literal.String ')' Literal.String '"' Literal.String ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'c' Name ',' Punctuation 'i' Name ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'sgn' Name ' ' Text '=' Operator ' ' Text 'one' Name '(' Punctuation 'T' Name ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text 'T' Name ' ' Text '<:' Operator ' ' Text 'Signed' Keyword.Type ' ' Text '&&' Operator ' ' Text 'c' Name ' ' Text '==' Operator ' ' Text "'-'" Literal.String.Char '\n' Text ' ' Text 'sgn' Name ' ' Text '=' Operator ' ' Text '-' Operator 'sgn' Name '\n' Text ' ' Text 'if' Keyword ' ' Text 'done' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'error' Name '(' Punctuation '"' Literal.String 'p' Literal.String 'r' Literal.String 'e' Literal.String 'm' Literal.String 'a' Literal.String 't' Literal.String 'u' Literal.String 'r' Literal.String 'e' Literal.String ' ' Literal.String 'e' Literal.String 'n' Literal.String 'd' Literal.String ' ' Literal.String 'o' Literal.String 'f' Literal.String ' ' Literal.String 'i' Literal.String 'n' Literal.String 't' Literal.String 'e' Literal.String 'g' Literal.String 'e' Literal.String 'r' Literal.String ' ' Literal.String '(' Literal.String 'i' Literal.String 'n' Literal.String ' ' Literal.String '"' Literal.String ',' Punctuation 'show_to_string' Name '(' Punctuation 's' Name ')' Punctuation ',' Punctuation '"' Literal.String ')' Literal.String '"' Literal.String ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'c' Name ',' Punctuation 'i' Name ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'base' Name ' ' Text '=' Operator ' ' Text 'convert' Name '(' Punctuation 'T' Name ',' Punctuation 'base' Name ')' Punctuation '\n' Text ' ' Text 'n' Name '::' Operator 'T' Name ' ' Text '=' Operator ' ' Text '0' Literal.Number.Integer '\n' Text ' ' Text 'while' Keyword ' ' Text 'true' Keyword.Constant '\n' Text ' ' Text 'd' Name ' ' Text '=' Operator ' ' Text "'0'" Literal.String.Char ' ' Text '<=' Operator ' ' Text 'c' Name ' ' Text '<=' Operator ' ' Text "'9'" Literal.String.Char ' ' Text '?' Operator ' ' Text 'c' Name '-' Operator "'0'" Literal.String.Char ' ' Text ':' Operator '\n' Text ' ' Text "'A'" Literal.String.Char ' ' Text '<=' Operator ' ' Text 'c' Name ' ' Text '<=' Operator ' ' Text "'Z'" Literal.String.Char ' ' Text '?' Operator ' ' Text 'c' Name '-' Operator "'A'" Literal.String.Char '+' Operator '10' Literal.Number.Integer ' ' Text ':' Operator '\n' Text ' ' Text "'a'" Literal.String.Char ' ' Text '<=' Operator ' ' Text 'c' Name ' ' Text '<=' Operator ' ' Text "'z'" Literal.String.Char ' ' Text '?' Operator ' ' Text 'c' Name '-' Operator "'a'" Literal.String.Char '+' Operator '10' Literal.Number.Integer ' ' Text ':' Operator ' ' Text 'typemax' Name '(' Punctuation 'Int' Keyword.Type ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text 'd' Name ' ' Text '>=' Operator ' ' Text 'base' Name '\n' Text ' ' Text 'error' Name '(' Punctuation 'show_to_string' Name '(' Punctuation 'c' Name ')' Punctuation ',' Punctuation '"' Literal.String ' ' Literal.String 'i' Literal.String 's' Literal.String ' ' Literal.String 'n' Literal.String 'o' Literal.String 't' Literal.String ' ' Literal.String 'a' Literal.String ' ' Literal.String 'v' Literal.String 'a' Literal.String 'l' Literal.String 'i' Literal.String 'd' Literal.String ' ' Literal.String 'd' Literal.String 'i' Literal.String 'g' Literal.String 'i' Literal.String 't' Literal.String ' ' Literal.String '(' Literal.String 'i' Literal.String 'n' Literal.String ' ' Literal.String '"' Literal.String ',' Punctuation 'show_to_string' Name '(' Punctuation 's' Name ')' Punctuation ',' Punctuation '"' Literal.String ')' Literal.String '"' Literal.String ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text '# TODO: overflow detection?' Comment '\n' Text ' ' Text 'n' Name ' ' Text '=' Operator ' ' Text 'n' Name '*' Operator 'base' Name ' ' Text '+' Operator ' ' Text 'd' Name '\n' Text ' ' Text 'if' Keyword ' ' Text 'done' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'break' Keyword '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'c' Name ',' Punctuation 'i' Name ' ' Text '=' Operator ' ' Text 'next' Name '(' Punctuation 's' Name ',' Punctuation 'i' Name ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'return' Keyword ' ' Text 'flipsign' Name '(' Punctuation 'n' Name ',' Punctuation 'sgn' Name ')' Punctuation '\n' Text 'end' Keyword '\n' Text '\n' Text 'parse_int' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'base' Name '::' Operator 'Integer' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'parse_int' Name '(' Punctuation 'Int' Keyword.Type ',' Punctuation 's' Name ',' Punctuation 'base' Name ')' Punctuation '\n' Text 'parse_int' Name '(' Punctuation 'T' Name '::' Operator 'Type' Keyword.Type ',' Punctuation ' ' Text 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'parse_int' Name '(' Punctuation 'T' Name ',' Punctuation 's' Name ',' Punctuation '10' Literal.Number.Integer ')' Punctuation '\n' Text 'parse_int' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'parse_int' Name '(' Punctuation 'Int' Keyword.Type ',' Punctuation 's' Name ',' Punctuation '10' Literal.Number.Integer ')' Punctuation '\n' Text '\n' Text 'parse_bin' Name '(' Punctuation 'T' Name '::' Operator 'Type' Keyword.Type ',' Punctuation ' ' Text 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'parse_int' Name '(' Punctuation 'T' Name ',' Punctuation 's' Name ',' Punctuation '2' Literal.Number.Integer ')' Punctuation '\n' Text 'parse_oct' Name '(' Punctuation 'T' Name '::' Operator 'Type' Keyword.Type ',' Punctuation ' ' Text 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'parse_int' Name '(' Punctuation 'T' Name ',' Punctuation 's' Name ',' Punctuation '8' Literal.Number.Integer ')' Punctuation '\n' Text 'parse_hex' Name '(' Punctuation 'T' Name '::' Operator 'Type' Keyword.Type ',' Punctuation ' ' Text 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'parse_int' Name '(' Punctuation 'T' Name ',' Punctuation 's' Name ',' Punctuation '16' Literal.Number.Integer ')' Punctuation '\n' Text '\n' Text 'parse_bin' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'parse_int' Name '(' Punctuation 'Int' Keyword.Type ',' Punctuation 's' Name ',' Punctuation '2' Literal.Number.Integer ')' Punctuation '\n' Text 'parse_oct' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'parse_int' Name '(' Punctuation 'Int' Keyword.Type ',' Punctuation 's' Name ',' Punctuation '8' Literal.Number.Integer ')' Punctuation '\n' Text 'parse_hex' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'parse_int' Name '(' Punctuation 'Int' Keyword.Type ',' Punctuation 's' Name ',' Punctuation '16' Literal.Number.Integer ')' Punctuation '\n' Text '\n' Text 'integer' Name ' ' Text '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'int' Name '(' Punctuation 's' Name ')' Punctuation '\n' Text 'unsigned' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'uint' Name '(' Punctuation 's' Name ')' Punctuation '\n' Text 'int' Name ' ' Text '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'parse_int' Name '(' Punctuation 'Int' Keyword.Type ',' Punctuation 's' Name ')' Punctuation '\n' Text 'uint' Name ' ' Text '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'parse_int' Name '(' Punctuation 'Uint' Name ',' Punctuation 's' Name ')' Punctuation '\n' Text 'int8' Name ' ' Text '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'parse_int' Name '(' Punctuation 'Int8' Keyword.Type ',' Punctuation 's' Name ')' Punctuation '\n' Text 'uint8' Name ' ' Text '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'parse_int' Name '(' Punctuation 'Uint8' Name ',' Punctuation 's' Name ')' Punctuation '\n' Text 'int16' Name ' ' Text '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'parse_int' Name '(' Punctuation 'Int16' Keyword.Type ',' Punctuation 's' Name ')' Punctuation '\n' Text 'uint16' Name ' ' Text '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'parse_int' Name '(' Punctuation 'Uint16' Name ',' Punctuation 's' Name ')' Punctuation '\n' Text 'int32' Name ' ' Text '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'parse_int' Name '(' Punctuation 'Int32' Keyword.Type ',' Punctuation 's' Name ')' Punctuation '\n' Text 'uint32' Name ' ' Text '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'parse_int' Name '(' Punctuation 'Uint32' Name ',' Punctuation 's' Name ')' Punctuation '\n' Text 'int64' Name ' ' Text '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'parse_int' Name '(' Punctuation 'Int64' Keyword.Type ',' Punctuation 's' Name ')' Punctuation '\n' Text 'uint64' Name ' ' Text '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'parse_int' Name '(' Punctuation 'Uint64' Name ',' Punctuation 's' Name ')' Punctuation '\n' Text '\n' Text '## integer to string functions ##' Comment '\n' Text '\n' Text 'const' Keyword.Declaration ' ' Text '_jl_dig_syms' Name ' ' Text '=' Operator ' ' Text '"' Literal.String '0' Literal.String '1' Literal.String '2' Literal.String '3' Literal.String '4' Literal.String '5' Literal.String '6' Literal.String '7' Literal.String '8' Literal.String '9' Literal.String 'a' Literal.String 'b' Literal.String 'c' Literal.String 'd' Literal.String 'e' Literal.String 'f' Literal.String 'g' Literal.String 'h' Literal.String 'i' Literal.String 'j' Literal.String 'k' Literal.String 'l' Literal.String 'm' Literal.String 'n' Literal.String 'o' Literal.String 'p' Literal.String 'q' Literal.String 'r' Literal.String 's' Literal.String 't' Literal.String 'u' Literal.String 'v' Literal.String 'w' Literal.String 'x' Literal.String 'y' Literal.String 'z' Literal.String '"' Literal.String '.' Operator 'data' Name '\n' Text '\n' Text 'function' Keyword ' ' Text 'int2str' Name '(' Punctuation 'n' Name '::' Operator 'Union' Keyword.Type '(' Punctuation 'Int64' Keyword.Type ',' Punctuation 'Uint64' Name ')' Punctuation ',' Punctuation ' ' Text 'b' Name '::' Operator 'Integer' Keyword.Type ',' Punctuation ' ' Text 'l' Name '::' Operator 'Int' Keyword.Type ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text 'b' Name ' ' Text '<' Operator ' ' Text '2' Literal.Number.Integer ' ' Text '||' Operator ' ' Text 'b' Name ' ' Text '>' Operator ' ' Text '36' Literal.Number.Integer ';' Punctuation ' ' Text 'error' Name '(' Punctuation '"' Literal.String 'i' Literal.String 'n' Literal.String 't' Literal.String '2' Literal.String 's' Literal.String 't' Literal.String 'r' Literal.String ':' Literal.String ' ' Literal.String 'i' Literal.String 'n' Literal.String 'v' Literal.String 'a' Literal.String 'l' Literal.String 'i' Literal.String 'd' Literal.String ' ' Literal.String 'b' Literal.String 'a' Literal.String 's' Literal.String 'e' Literal.String ' ' Literal.String '"' Literal.String ',' Punctuation ' ' Text 'b' Name ')' Punctuation ';' Punctuation ' ' Text 'end' Keyword '\n' Text ' ' Text 'neg' Name ' ' Text '=' Operator ' ' Text 'n' Name ' ' Text '<' Operator ' ' Text '0' Literal.Number.Integer '\n' Text ' ' Text 'n' Name ' ' Text '=' Operator ' ' Text 'unsigned' Name '(' Punctuation 'abs' Name '(' Punctuation 'n' Name ')' Punctuation ')' Punctuation '\n' Text ' ' Text 'b' Name ' ' Text '=' Operator ' ' Text 'convert' Name '(' Punctuation 'typeof' Name '(' Punctuation 'n' Name ')' Punctuation ',' Punctuation ' ' Text 'b' Name ')' Punctuation '\n' Text ' ' Text 'ndig' Name ' ' Text '=' Operator ' ' Text 'ndigits' Name '(' Punctuation 'n' Name ',' Punctuation ' ' Text 'b' Name ')' Punctuation '\n' Text ' ' Text 'sz' Name ' ' Text '=' Operator ' ' Text 'max' Name '(' Punctuation 'convert' Name '(' Punctuation 'Int' Keyword.Type ',' Punctuation ' ' Text 'ndig' Name ')' Punctuation ',' Punctuation ' ' Text 'l' Name ')' Punctuation ' ' Text '+' Operator ' ' Text 'neg' Name '\n' Text ' ' Text 'data' Name ' ' Text '=' Operator ' ' Text 'Array' Keyword.Type '(' Punctuation 'Uint8' Name ',' Punctuation ' ' Text 'sz' Name ')' Punctuation '\n' Text ' ' Text 'i' Name ' ' Text '=' Operator ' ' Text 'sz' Name '\n' Text ' ' Text 'if' Keyword ' ' Text 'ispow2' Name '(' Punctuation 'b' Name ')' Punctuation '\n' Text ' ' Text 'digmask' Name ' ' Text '=' Operator ' ' Text 'b' Name '-' Operator '1' Literal.Number.Integer '\n' Text ' ' Text 'shift' Name ' ' Text '=' Operator ' ' Text 'trailing_zeros' Name '(' Punctuation 'b' Name ')' Punctuation '\n' Text ' ' Text 'while' Keyword ' ' Text 'i' Name ' ' Text '>' Operator ' ' Text 'neg' Name '\n' Text ' ' Text 'ch' Name ' ' Text '=' Operator ' ' Text 'n' Name ' ' Text '&' Operator ' ' Text 'digmask' Name '\n' Text ' ' Text 'data' Name '[' Punctuation 'i' Name ']' Punctuation ' ' Text '=' Operator ' ' Text '_jl_dig_syms' Name '[' Punctuation 'int' Name '(' Punctuation 'ch' Name ')' Punctuation '+' Operator '1' Literal.Number.Integer ']' Punctuation '\n' Text ' ' Text 'n' Name ' ' Text '>>=' Operator ' ' Text 'shift' Name '\n' Text ' ' Text 'i' Name ' ' Text '-=' Operator ' ' Text '1' Literal.Number.Integer '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'else' Keyword '\n' Text ' ' Text 'while' Keyword ' ' Text 'i' Name ' ' Text '>' Operator ' ' Text 'neg' Name '\n' Text ' ' Text 'ch' Name ' ' Text '=' Operator ' ' Text 'n' Name ' ' Text '%' Operator ' ' Text 'b' Name '\n' Text ' ' Text 'data' Name '[' Punctuation 'i' Name ']' Punctuation ' ' Text '=' Operator ' ' Text '_jl_dig_syms' Name '[' Punctuation 'int' Name '(' Punctuation 'ch' Name ')' Punctuation '+' Operator '1' Literal.Number.Integer ']' Punctuation '\n' Text ' ' Text 'n' Name ' ' Text '=' Operator ' ' Text 'div' Name '(' Punctuation 'n' Name ',' Punctuation 'b' Name ')' Punctuation '\n' Text ' ' Text 'i' Name ' ' Text '-=' Operator ' ' Text '1' Literal.Number.Integer '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'if' Keyword ' ' Text 'neg' Name '\n' Text ' ' Text 'data' Name '[' Punctuation '1' Literal.Number.Integer ']' Punctuation ' ' Text '=' Operator ' ' Text "'-'" Literal.String.Char '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'ASCIIString' Keyword.Type '(' Punctuation 'data' Name ')' Punctuation '\n' Text 'end' Keyword '\n' Text 'int2str' Name '(' Punctuation 'n' Name '::' Operator 'Integer' Keyword.Type ',' Punctuation ' ' Text 'b' Name '::' Operator 'Integer' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'int2str' Name '(' Punctuation 'n' Name ',' Punctuation ' ' Text 'b' Name ',' Punctuation ' ' Text '0' Literal.Number.Integer ')' Punctuation '\n' Text 'int2str' Name '(' Punctuation 'n' Name '::' Operator 'Integer' Keyword.Type ',' Punctuation ' ' Text 'b' Name '::' Operator 'Integer' Keyword.Type ',' Punctuation ' ' Text 'l' Name '::' Operator 'Int' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'int2str' Name '(' Punctuation 'int64' Name '(' Punctuation 'n' Name ')' Punctuation ',' Punctuation ' ' Text 'b' Name ',' Punctuation ' ' Text 'l' Name ')' Punctuation '\n' Text '\n' Text 'string' Name '(' Punctuation 'x' Name '::' Operator 'Signed' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'dec' Name '(' Punctuation 'int64' Name '(' Punctuation 'x' Name ')' Punctuation ')' Punctuation '\n' Text 'cstring' Name '(' Punctuation 'x' Name '::' Operator 'Signed' Keyword.Type ')' Punctuation ' ' Text '=' Operator ' ' Text 'dec' Name '(' Punctuation 'int64' Name '(' Punctuation 'x' Name ')' Punctuation ')' Punctuation '\n' Text '\n' Text '## string to float functions ##' Comment '\n' Text '\n' Text 'function' Keyword ' ' Text 'float64_isvalid' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'out' Name '::' Operator 'Array' Keyword.Type '{' Punctuation 'Float64' Keyword.Type ',' Punctuation '1' Literal.Number.Integer '}' Punctuation ')' Punctuation '\n' Text ' ' Text 's' Name ' ' Text '=' Operator ' ' Text 'cstring' Name '(' Punctuation 's' Name ')' Punctuation '\n' Text ' ' Text 'return' Keyword ' ' Text '(' Punctuation 'ccall' Keyword '(' Punctuation ':' Operator 'jl_strtod' Name ',' Punctuation ' ' Text 'Int32' Keyword.Type ',' Punctuation ' ' Text '(' Punctuation 'Ptr' Keyword.Type '{' Punctuation 'Uint8' Name '}' Punctuation ',' Punctuation 'Ptr' Keyword.Type '{' Punctuation 'Float64' Keyword.Type '}' Punctuation ')' Punctuation ',' Punctuation ' ' Text 's' Name ',' Punctuation ' ' Text 'out' Name ')' Punctuation '==' Operator '0' Literal.Number.Integer ')' Punctuation '\n' Text 'end' Keyword '\n' Text '\n' Text 'function' Keyword ' ' Text 'float32_isvalid' Name '(' Punctuation 's' Name '::' Operator 'String' Name ',' Punctuation ' ' Text 'out' Name '::' Operator 'Array' Keyword.Type '{' Punctuation 'Float32' Keyword.Type ',' Punctuation '1' Literal.Number.Integer '}' Punctuation ')' Punctuation '\n' Text ' ' Text 's' Name ' ' Text '=' Operator ' ' Text 'cstring' Name '(' Punctuation 's' Name ')' Punctuation '\n' Text ' ' Text 'return' Keyword ' ' Text '(' Punctuation 'ccall' Keyword '(' Punctuation ':' Operator 'jl_strtof' Name ',' Punctuation ' ' Text 'Int32' Keyword.Type ',' Punctuation ' ' Text '(' Punctuation 'Ptr' Keyword.Type '{' Punctuation 'Uint8' Name '}' Punctuation ',' Punctuation 'Ptr' Keyword.Type '{' Punctuation 'Float32' Keyword.Type '}' Punctuation ')' Punctuation ',' Punctuation ' ' Text 's' Name ',' Punctuation ' ' Text 'out' Name ')' Punctuation '==' Operator '0' Literal.Number.Integer ')' Punctuation '\n' Text 'end' Keyword '\n' Text '\n' Text 'begin' Keyword '\n' Text ' ' Text 'local' Keyword.Declaration ' ' Text 'tmp' Name '::' Operator 'Array' Keyword.Type '{' Punctuation 'Float64' Keyword.Type ',' Punctuation '1' Literal.Number.Integer '}' Punctuation ' ' Text '=' Operator ' ' Text 'Array' Keyword.Type '(' Punctuation 'Float64' Keyword.Type ',' Punctuation '1' Literal.Number.Integer ')' Punctuation '\n' Text ' ' Text 'local' Keyword.Declaration ' ' Text 'tmpf' Name '::' Operator 'Array' Keyword.Type '{' Punctuation 'Float32' Keyword.Type ',' Punctuation '1' Literal.Number.Integer '}' Punctuation ' ' Text '=' Operator ' ' Text 'Array' Keyword.Type '(' Punctuation 'Float32' Keyword.Type ',' Punctuation '1' Literal.Number.Integer ')' Punctuation '\n' Text ' ' Text 'global' Keyword.Declaration ' ' Text 'float64' Name ',' Punctuation ' ' Text 'float32' Name '\n' Text ' ' Text 'function' Keyword ' ' Text 'float64' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text '!' Operator 'float64_isvalid' Name '(' Punctuation 's' Name ',' Punctuation ' ' Text 'tmp' Name ')' Punctuation '\n' Text ' ' Text 'throw' Name '(' Punctuation 'ArgumentError' Keyword.Type '(' Punctuation '"' Literal.String 'f' Literal.String 'l' Literal.String 'o' Literal.String 'a' Literal.String 't' Literal.String '6' Literal.String '4' Literal.String '(' Literal.String 'S' Literal.String 't' Literal.String 'r' Literal.String 'i' Literal.String 'n' Literal.String 'g' Literal.String ')' Literal.String ':' Literal.String ' ' Literal.String 'i' Literal.String 'n' Literal.String 'v' Literal.String 'a' Literal.String 'l' Literal.String 'i' Literal.String 'd' Literal.String ' ' Literal.String 'n' Literal.String 'u' Literal.String 'm' Literal.String 'b' Literal.String 'e' Literal.String 'r' Literal.String ' ' Literal.String 'f' Literal.String 'o' Literal.String 'r' Literal.String 'm' Literal.String 'a' Literal.String 't' Literal.String '"' Literal.String ')' Punctuation ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'return' Keyword ' ' Text 'tmp' Name '[' Punctuation '1' Literal.Number.Integer ']' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text '\n' Text ' ' Text 'function' Keyword ' ' Text 'float32' Name '(' Punctuation 's' Name '::' Operator 'String' Name ')' Punctuation '\n' Text ' ' Text 'if' Keyword ' ' Text '!' Operator 'float32_isvalid' Name '(' Punctuation 's' Name ',' Punctuation ' ' Text 'tmpf' Name ')' Punctuation '\n' Text ' ' Text 'throw' Name '(' Punctuation 'ArgumentError' Keyword.Type '(' Punctuation '"' Literal.String 'f' Literal.String 'l' Literal.String 'o' Literal.String 'a' Literal.String 't' Literal.String '3' Literal.String '2' Literal.String '(' Literal.String 'S' Literal.String 't' Literal.String 'r' Literal.String 'i' Literal.String 'n' Literal.String 'g' Literal.String ')' Literal.String ':' Literal.String ' ' Literal.String 'i' Literal.String 'n' Literal.String 'v' Literal.String 'a' Literal.String 'l' Literal.String 'i' Literal.String 'd' Literal.String ' ' Literal.String 'n' Literal.String 'u' Literal.String 'm' Literal.String 'b' Literal.String 'e' Literal.String 'r' Literal.String ' ' Literal.String 'f' Literal.String 'o' Literal.String 'r' Literal.String 'm' Literal.String 'a' Literal.String 't' Literal.String '"' Literal.String ')' Punctuation ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'return' Keyword ' ' Text 'tmpf' Name '[' Punctuation '1' Literal.Number.Integer ']' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text 'end' Keyword '\n' Text '\n' Text 'float' Name '(' Punctuation 'x' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'float64' Name '(' Punctuation 'x' Name ')' Punctuation '\n' Text 'parse_float' Name '(' Punctuation 'x' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'float64' Name '(' Punctuation 'x' Name ')' Punctuation '\n' Text 'parse_float' Name '(' Punctuation '::' Operator 'Type' Keyword.Type '{' Punctuation 'Float64' Keyword.Type '}' Punctuation ',' Punctuation ' ' Text 'x' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'float64' Name '(' Punctuation 'x' Name ')' Punctuation '\n' Text 'parse_float' Name '(' Punctuation '::' Operator 'Type' Keyword.Type '{' Punctuation 'Float32' Keyword.Type '}' Punctuation ',' Punctuation ' ' Text 'x' Name '::' Operator 'String' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'float32' Name '(' Punctuation 'x' Name ')' Punctuation '\n' Text '\n' Text '# copying a byte string (generally not needed due to "immutability")' Comment '\n' Text '\n' Text 'strcpy' Name '{' Punctuation 'T' Name '<:' Operator 'ByteString' Name '}' Punctuation '(' Punctuation 's' Name '::' Operator 'T' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'T' Name '(' Punctuation 'copy' Name '(' Punctuation 's' Name '.' Operator 'data' Name ')' Punctuation ')' Punctuation '\n' Text '\n' Text '# lexicographically compare byte arrays (used by Latin-1 and UTF-8)' Comment '\n' Text '\n' Text 'function' Keyword ' ' Text 'lexcmp' Name '(' Punctuation 'a' Name '::' Operator 'Array' Keyword.Type '{' Punctuation 'Uint8' Name ',' Punctuation '1' Literal.Number.Integer '}' Punctuation ',' Punctuation ' ' Text 'b' Name '::' Operator 'Array' Keyword.Type '{' Punctuation 'Uint8' Name ',' Punctuation '1' Literal.Number.Integer '}' Punctuation ')' Punctuation '\n' Text ' ' Text 'c' Name ' ' Text '=' Operator ' ' Text 'ccall' Keyword '(' Punctuation ':' Operator 'memcmp' Name ',' Punctuation ' ' Text 'Int32' Keyword.Type ',' Punctuation ' ' Text '(' Punctuation 'Ptr' Keyword.Type '{' Punctuation 'Uint8' Name '}' Punctuation ',' Punctuation ' ' Text 'Ptr' Keyword.Type '{' Punctuation 'Uint8' Name '}' Punctuation ',' Punctuation ' ' Text 'Uint' Name ')' Punctuation ',' Punctuation '\n' Text ' ' Text 'a' Name ',' Punctuation ' ' Text 'b' Name ',' Punctuation ' ' Text 'min' Name '(' Punctuation 'length' Name '(' Punctuation 'a' Name ')' Punctuation ',' Punctuation 'length' Name '(' Punctuation 'b' Name ')' Punctuation ')' Punctuation ')' Punctuation '\n' Text ' ' Text 'c' Name ' ' Text '<' Operator ' ' Text '0' Literal.Number.Integer ' ' Text '?' Operator ' ' Text '-' Operator '1' Literal.Number.Integer ' ' Text ':' Operator ' ' Text 'c' Name ' ' Text '>' Operator ' ' Text '0' Literal.Number.Integer ' ' Text '?' Operator ' ' Text '+' Operator '1' Literal.Number.Integer ' ' Text ':' Operator ' ' Text 'cmp' Name '(' Punctuation 'length' Name '(' Punctuation 'a' Name ')' Punctuation ',' Punctuation 'length' Name '(' Punctuation 'b' Name ')' Punctuation ')' Punctuation '\n' Text 'end' Keyword '\n' Text '\n' Text '# find the index of the first occurrence of a byte value in a byte array' Comment '\n' Text '\n' Text 'function' Keyword ' ' Text 'memchr' Name '(' Punctuation 'a' Name '::' Operator 'Array' Keyword.Type '{' Punctuation 'Uint8' Name ',' Punctuation '1' Literal.Number.Integer '}' Punctuation ',' Punctuation ' ' Text 'b' Name '::' Operator 'Integer' Keyword.Type ')' Punctuation '\n' Text ' ' Text 'p' Name ' ' Text '=' Operator ' ' Text 'pointer' Name '(' Punctuation 'a' Name ')' Punctuation '\n' Text ' ' Text 'q' Name ' ' Text '=' Operator ' ' Text 'ccall' Keyword '(' Punctuation ':' Operator 'memchr' Name ',' Punctuation ' ' Text 'Ptr' Keyword.Type '{' Punctuation 'Uint8' Name '}' Punctuation ',' Punctuation ' ' Text '(' Punctuation 'Ptr' Keyword.Type '{' Punctuation 'Uint8' Name '}' Punctuation ',' Punctuation ' ' Text 'Int32' Keyword.Type ',' Punctuation ' ' Text 'Uint' Name ')' Punctuation ',' Punctuation ' ' Text 'p' Name ',' Punctuation ' ' Text 'b' Name ',' Punctuation ' ' Text 'length' Name '(' Punctuation 'a' Name ')' Punctuation ')' Punctuation '\n' Text ' ' Text 'q' Name ' ' Text '==' Operator ' ' Text 'C_NULL' Name.Builtin ' ' Text '?' Operator ' ' Text '0' Literal.Number.Integer ' ' Text ':' Operator ' ' Text 'q' Name ' ' Text '-' Operator ' ' Text 'p' Name ' ' Text '+' Operator ' ' Text '1' Literal.Number.Integer '\n' Text 'end' Keyword '\n' Text '\n' Text '# concatenate byte arrays into a single array' Comment '\n' Text '\n' Text 'memcat' Name '(' Punctuation ')' Punctuation ' ' Text '=' Operator ' ' Text 'Array' Keyword.Type '(' Punctuation 'Uint8' Name ',' Punctuation '0' Literal.Number.Integer ')' Punctuation '\n' Text 'memcat' Name '(' Punctuation 'a' Name '::' Operator 'Array' Keyword.Type '{' Punctuation 'Uint8' Name ',' Punctuation '1' Literal.Number.Integer '}' Punctuation ')' Punctuation ' ' Text '=' Operator ' ' Text 'copy' Name '(' Punctuation 'a' Name ')' Punctuation '\n' Text '\n' Text 'function' Keyword ' ' Text 'memcat' Name '(' Punctuation 'arrays' Name '::' Operator 'Array' Keyword.Type '{' Punctuation 'Uint8' Name ',' Punctuation '1' Literal.Number.Integer '}' Punctuation '.' Operator '.' Operator '.' Operator ')' Punctuation '\n' Text ' ' Text 'n' Name ' ' Text '=' Operator ' ' Text '0' Literal.Number.Integer '\n' Text ' ' Text 'for' Keyword ' ' Text 'a' Name ' ' Text 'in' Keyword.Pseudo ' ' Text 'arrays' Name '\n' Text ' ' Text 'n' Name ' ' Text '+=' Operator ' ' Text 'length' Name '(' Punctuation 'a' Name ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'arr' Name ' ' Text '=' Operator ' ' Text 'Array' Keyword.Type '(' Punctuation 'Uint8' Name ',' Punctuation ' ' Text 'n' Name ')' Punctuation '\n' Text ' ' Text 'ptr' Name ' ' Text '=' Operator ' ' Text 'pointer' Name '(' Punctuation 'arr' Name ')' Punctuation '\n' Text ' ' Text 'offset' Name ' ' Text '=' Operator ' ' Text '0' Literal.Number.Integer '\n' Text ' ' Text 'for' Keyword ' ' Text 'a' Name ' ' Text 'in' Keyword.Pseudo ' ' Text 'arrays' Name '\n' Text ' ' Text 'ccall' Keyword '(' Punctuation ':' Operator 'memcpy' Name ',' Punctuation ' ' Text 'Ptr' Keyword.Type '{' Punctuation 'Uint8' Name '}' Punctuation ',' Punctuation ' ' Text '(' Punctuation 'Ptr' Keyword.Type '{' Punctuation 'Uint8' Name '}' Punctuation ',' Punctuation ' ' Text 'Ptr' Keyword.Type '{' Punctuation 'Uint8' Name '}' Punctuation ',' Punctuation ' ' Text 'Uint' Name ')' Punctuation ',' Punctuation '\n' Text ' ' Text 'ptr' Name '+' Operator 'offset' Name ',' Punctuation ' ' Text 'a' Name ',' Punctuation ' ' Text 'length' Name '(' Punctuation 'a' Name ')' Punctuation ')' Punctuation '\n' Text ' ' Text 'offset' Name ' ' Text '+=' Operator ' ' Text 'length' Name '(' Punctuation 'a' Name ')' Punctuation '\n' Text ' ' Text 'end' Keyword '\n' Text ' ' Text 'return' Keyword ' ' Text 'arr' Name '\n' Text 'end' Keyword '\n' Text '\n' Text '# concatenate the data fields of byte strings' Comment '\n' Text '\n' Text 'memcat' Name '(' Punctuation 's' Name '::' Operator 'ByteString' Name ')' Punctuation ' ' Text '=' Operator ' ' Text 'memcat' Name '(' Punctuation 's' Name '.' Operator 'data' Name ')' Punctuation '\n' Text 'memcat' Name '(' Punctuation 'sx' Name '::' Operator 'ByteString' Name '.' Operator '.' Operator '.' Operator ')' Punctuation ' ' Text '=' Operator ' ' Text 'memcat' Name '(' Punctuation 'map' Name '(' Punctuation 's' Name '-' Operator '>' Operator 's' Name '.' Operator 'data' Name ',' Punctuation ' ' Text 'sx' Name ')' Punctuation '.' Operator '.' Operator '.' Operator ')' Punctuation '\n' Text