Skip to content

Commit 99cdbaa

Browse files
authored
Merge pull request #417 from aycabta/implement-tigetflag
Implement Reline::Terminfo.tigetflag
2 parents 195ad78 + 0451ed7 commit 99cdbaa

File tree

2 files changed

+34
-1
lines changed

2 files changed

+34
-1
lines changed

lib/reline/terminfo.rb

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,15 @@ module Reline::Terminfo
7474
#extern 'char *tparm(const char *str, ...)'
7575
@tiparm = Fiddle::Function.new(curses_dl['tparm'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VARIADIC], Fiddle::TYPE_VOIDP)
7676
end
77-
# TODO: add int tigetflag(char *capname) and int tigetnum(char *capname)
77+
begin
78+
#extern 'char *tigetflag(const char *str, ...)'
79+
@tigetflag = Fiddle::Function.new(curses_dl['tigetflag'], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT)
80+
rescue Fiddle::DLError
81+
# OpenBSD lacks tigetflag
82+
#extern 'char *tgetflag(const char *str, ...)'
83+
@tigetflag = Fiddle::Function.new(curses_dl['tgetflag'], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT)
84+
end
85+
# TODO: add int tigetnum(char *capname)
7886

7987
def self.setupterm(term, fildes)
8088
errret_int = String.new("\x00" * 8, encoding: 'ASCII-8BIT')
@@ -122,6 +130,17 @@ def self.tiparm(str, *args)
122130
@tiparm.(str, *new_args).to_s
123131
end
124132

133+
def self.tigetflag(capname)
134+
flag = @tigetflag.(capname).to_i
135+
case flag
136+
when -1
137+
raise TerminfoError, "not boolean capability: #{capname}"
138+
when 0
139+
raise TerminfoError, "can't find capability: #{capname}"
140+
end
141+
flag
142+
end
143+
125144
def self.enabled?
126145
true
127146
end

test/reline/test_terminfo.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,18 @@ def test_tiparm_with_param
2929
rescue Reline::Terminfo::TerminfoError => e
3030
omit e.message
3131
end
32+
33+
def test_tigetflag
34+
assert_instance_of Integer, Reline::Terminfo.tigetflag('xenl')
35+
rescue Reline::Terminfo::TerminfoError => e
36+
omit e.message
37+
end
38+
39+
def test_tigetflag_with_error
40+
assert_raise(Reline::Terminfo::TerminfoError) { Reline::Terminfo.tigetflag('cuu') }
41+
end
42+
43+
def test_tigetflag_with_error_unknwon
44+
assert_raise(Reline::Terminfo::TerminfoError) { Reline::Terminfo.tigetflag('unknown') }
45+
end
3246
end if Reline::Terminfo.enabled?

0 commit comments

Comments
 (0)