Skip to content

Commit de31537

Browse files
committed
Make aliases structurally distinct in TermInfo
1 parent 5bcf9b2 commit de31537

File tree

2 files changed

+24
-18
lines changed

2 files changed

+24
-18
lines changed

base/terminfo.jl

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,10 @@ struct TermInfo
6666
numbers::Dict{Symbol, Int}
6767
strings::Dict{Symbol, String}
6868
extensions::Union{Nothing, Set{Symbol}}
69+
aliases::Dict{Symbol, Symbol}
6970
end
7071

71-
TermInfo() = TermInfo([], Dict(), Dict(), Dict(), nothing)
72+
TermInfo() = TermInfo([], Dict(), Dict(), Dict(), nothing, Dict())
7273

7374
function read(data::IO, ::Type{TermInfoRaw})
7475
# Parse according to `term(5)`
@@ -175,19 +176,20 @@ function TermInfo(raw::TermInfoRaw)
175176
flags = Dict{Symbol, Bool}()
176177
numbers = Dict{Symbol, Int}()
177178
strings = Dict{Symbol, String}()
179+
aliases = Dict{Symbol, Symbol}()
178180
extensions = nothing
179181
for (flag, value) in zip(TERM_FLAGS, raw.flags)
180-
flags[flag.capname] = value
181182
flags[flag.name] = value
183+
aliases[flag.capname] = flag.name
182184
end
183185
for (num, value) in zip(TERM_NUMBERS, raw.numbers)
184-
numbers[num.capname] = Int(value)
185186
numbers[num.name] = Int(value)
187+
aliases[num.capname] = num.name
186188
end
187189
for (str, value) in zip(TERM_STRINGS, raw.strings)
188190
if !isnothing(value)
189-
strings[str.capname] = value
190191
strings[str.name] = value
192+
aliases[str.capname] = str.name
191193
end
192194
end
193195
if !isnothing(raw.extended)
@@ -201,26 +203,30 @@ function TermInfo(raw::TermInfoRaw)
201203
elseif value isa String
202204
strings[key] = value
203205
end
206+
if !isnothing(long)
207+
aliases[short] = long
208+
end
204209
end
205210
end
206-
TermInfo(raw.names, flags, numbers, strings, extensions)
211+
TermInfo(raw.names, flags, numbers, strings, extensions, aliases)
207212
end
208213

209-
get(ti::TermInfo, key::Symbol, default::Bool) = get(ti.flags, key, default)
210-
get(ti::TermInfo, key::Symbol, default::Int) = get(ti.numbers, key, default)
211-
get(ti::TermInfo, key::Symbol, default::String) = get(ti.strings, key, default)
214+
get(ti::TermInfo, key::Symbol, default::Bool) = get(ti.flags, get(ti.aliases, key, key), default)
215+
get(ti::TermInfo, key::Symbol, default::Int) = get(ti.numbers, get(ti.aliases, key, key), default)
216+
get(ti::TermInfo, key::Symbol, default::String) = get(ti.strings, get(ti.aliases, key, key), default)
212217

213218
haskey(ti::TermInfo, key::Symbol) =
214-
haskey(ti.flags, key) || haskey(ti.numbers, key) || haskey(ti.strings, key)
219+
haskey(ti.flags, key) || haskey(ti.numbers, key) || haskey(ti.strings, key) || haskey(ti.aliases, key)
215220

216221
function getindex(ti::TermInfo, key::Symbol)
217222
haskey(ti.flags, key) && return ti.flags[key]
218223
haskey(ti.numbers, key) && return ti.numbers[key]
219224
haskey(ti.strings, key) && return ti.strings[key]
225+
haskey(ti.aliases, key) && return getindex(ti, ti.aliases[key])
220226
throw(KeyError(key))
221227
end
222228

223-
keys(ti::TermInfo) = keys(ti.flags) keys(ti.numbers) keys(ti.strings)
229+
keys(ti::TermInfo) = keys(ti.flags) keys(ti.numbers) keys(ti.strings) keys(ti.aliases)
224230

225231
function show(io::IO, ::MIME"text/plain", ti::TermInfo)
226232
print(io, "TermInfo(", ti.names, "; ", length(ti.flags), " flags, ",

test/terminfo.jl

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -887,21 +887,21 @@ let
887887
:xvpa => false)
888888

889889
@testset "terminfo" begin
890-
dumb = Base.TermInfo(read(IOBuffer(dumb_terminfo), Base.TermInfoRaw))
890+
dumb = Terminfo.TermInfo(read(IOBuffer(dumb_terminfo), Terminfo.TermInfoRaw))
891891
@test dumb.names == ["dumb", "80-column dumb tty"]
892-
@test length(dumb.flags) == 4
893-
@test length(dumb.numbers) == 2
894-
@test length(dumb.strings) == 8
892+
@test length(dumb.flags) == 2
893+
@test length(dumb.numbers) == 1
894+
@test length(dumb.strings) == 4
895895
@test isnothing(dumb.extensions)
896896
for (key, value) in dumb_capabilities
897897
@test dumb[key] == value
898898
end
899899

900-
xterm = Base.TermInfo(read(IOBuffer(xterm_terminfo), Base.TermInfoRaw))
900+
xterm = Terminfo.TermInfo(read(IOBuffer(xterm_terminfo), Terminfo.TermInfoRaw))
901901
@test xterm.names == ["xterm", "xterm terminal emulator (X Window System)"]
902-
@test length(xterm.flags) == 78
903-
@test length(xterm.numbers) == 29
904-
@test length(xterm.strings) == 432
902+
@test length(xterm.flags) == 40
903+
@test length(xterm.numbers) == 15
904+
@test length(xterm.strings) == 253
905905
@test sort(xterm.extensions |> collect) == sort(xterm_extensions)
906906
for (key, value) in xterm_capabilities
907907
@test xterm[key] == value

0 commit comments

Comments
 (0)