Class: TermTime::TermInfo

Inherits:
Object
  • Object
show all
Defined in:
lib/termtime/terminfo.rb

Defined Under Namespace

Classes: Number, String

Instance Method Summary collapse

Constructor Details

#initialize(fname = ENV["TERM"]) ⇒ TermInfo

Returns a new instance of TermInfo.



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/termtime/terminfo.rb', line 35

def initialize fname = ENV["TERM"]
  unless File.file? fname
    fname = "/usr/share/terminfo/#{fname.getbyte(0).to_s(16)}/#{fname}"
  end

  File.open fname, "rb" do |f|
    magic,
      names_size,
      booleans_size,
      short_int_count,
      offset_count,
      string_table_size = f.read((2 * 6)).unpack("ssssss")

    raise unless magic == 0432
    @names = f.read(names_size - 1).force_encoding("UTF-8").freeze
    raise unless f.readbyte == 0
    @flags = f.read(booleans_size - 1)

    f.readbyte
    f.readbyte if f.pos % 2 != 0 # alignment

    @numbers = f.read(short_int_count * 2)
    strings = f.read(offset_count * 2)
    string_table = f.read(string_table_size)
    @strings = decode_strings(strings, string_table)
  end
end

Instance Method Details

#flagsObject



63
64
65
66
67
68
69
70
71
# File 'lib/termtime/terminfo.rb', line 63

def flags
  flags = []
  @flags.bytesize.times do |i|
    if @flags.getbyte(i) > 0
      flags << DB::BOOLEAN_LIST.fetch(i)
    end
  end
  flags
end

#getflag(name) ⇒ Object



91
92
93
# File 'lib/termtime/terminfo.rb', line 91

def getflag name
  @flags.getbyte(DB::BOOLEANS.fetch(name).i) == 1
end

#getnum(name) ⇒ Object



86
87
88
89
# File 'lib/termtime/terminfo.rb', line 86

def getnum name
  offset = DB::NUMBERS.fetch(name).i * 2
  @numbers.getbyte(offset) | (@numbers.getbyte(offset + 1) << 8)
end

#getstr(name) ⇒ Object



95
96
97
# File 'lib/termtime/terminfo.rb', line 95

def getstr name
  str(name).value
end

#namesObject



107
108
109
# File 'lib/termtime/terminfo.rb', line 107

def names
  @names.split("|")
end

#numbersObject



73
74
75
76
77
78
79
80
# File 'lib/termtime/terminfo.rb', line 73

def numbers
  numbers = []
  @numbers.unpack("s*").each_with_index do |v, i|
    next if v == -1
    numbers << Number.new(v, DB::NUMBER_LIST.fetch(i))
  end
  numbers
end

#str(name) ⇒ Object



99
100
101
# File 'lib/termtime/terminfo.rb', line 99

def str name
  @strings.fetch(name)
end

#str?(name) ⇒ Boolean

Returns:

  • (Boolean)


103
104
105
# File 'lib/termtime/terminfo.rb', line 103

def str? name
  @strings.key?(name)
end

#stringsObject



82
83
84
# File 'lib/termtime/terminfo.rb', line 82

def strings
  @strings.values
end