1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
|
#!/bin/bash
# Copyright 2017 The TCell Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use file except in compliance with the License.
# You may obtain a copy of the license at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# When called with no arguments, this shell script builds the Go database,
# which is somewhat minimal for size reasons (it only contains the most
# commonly used entries), and then builds the complete JSON database.
#
# To limit the action to only building one or more terminals, specify them
# on the command line:
#
# ./mkdatabase xterm
#
# The script will also find and update or add any terminal "aliases".
# It does not remove any old entries.
#
# To add to the set of terminals that we compile into the Go database,
# add their names to the models.txt file.
#
# This script is not very efficient, but there isn't really a better way
# without writing code to decode the terminfo binary format directly.
# Its not worth worrying about.
# This script also requires bash, although ksh93 should work as well, because
# we use arrays, which are not specified in POSIX.
export LANG=C
export LC_CTYPE=C
progress()
{
typeset -i num=$1
typeset -i tot=$2
typeset -i x
typeset back
typeset s
if (( tot < 1 ))
then
s=$(printf "[ %d ]" $num)
back="\b\b\b\b\b"
x=$num
while (( x >= 10 ))
do
back="${back}\b"
x=$(( x / 10 ))
done
else
x=$(( num * 100 / tot ))
s=$(printf "<%3d%%>" $x)
back="\b\b\b\b\b\b"
fi
printf "%s${back}" "$s"
}
ord()
{
printf "%02x" "'$1'"
}
goterms=( $(cat models.txt) )
args=( $* )
if (( ${#args[@]} == 0 ))
then
args=( $(toe -a | cut -f1) )
fi
printf "Scanning terminal definitions: "
i=0
aliases=()
models=()
for term in ${args[@]}
do
case "${term}" in
*-truecolor)
line="${term}|24-bit color"
;;
*)
line=$(infocmp $term | head -2 | tail -1)
if [[ -z "$line" ]]
then
echo "Cannot find terminfo for $term"
exit 1
fi
# take off the trailing comma
line=${line%,}
esac
# grab primary name
term=${line%%|*}
all+=( ${term} )
# should this be in our go terminals?
for model in ${goterms[@]}
do
if [[ "${model}" == "${term}" ]]
then
models+=( ${term} )
fi
done
# chop off primary name
line=${line#${term}}
line=${line#|}
# chop off description
line=${line%|*}
while [[ "$line" != "" ]]
do
a=${line%%|*}
aliases+=( ${a}=${term} )
line=${line#$a}
line=${line#|}
done
i=$(( i + 1 ))
progress $i ${#args[@]}
done
echo
# make sure we have mkinfo
printf "Building mkinfo: "
go build mkinfo.go
echo "done."
# Build all the go database files for the "interesting" terminals".
printf "Building Go database: "
i=0
for model in ${models[@]}
do
safe=$(echo $model | tr - _)
file=term_${safe}.go
./mkinfo -go $file $model
go fmt ${file} >/dev/null
i=$(( i + 1 ))
progress $i ${#models[@]}
done
echo
printf "Building JSON database: "
# The JSON files are located for each terminal in a file with the
# terminal name, in the following fashion "database/x/xterm.json
i=0
for model in ${all[@]}
do
letter=$(ord ${model:0:1})
dir=database/${letter}
file=${dir}/${model}.gz
mkdir -p ${dir}
./mkinfo -nofatal -quiet -gzip -json ${file} ${model}
i=$(( i + 1 ))
progress $i ${#all[@]}
done
echo
printf "Building JSON aliases: "
i=0
for model in ${aliases[@]}
do
canon=${model#*=}
model=${model%=*}
letter=$(ord ${model:0:1})
cletter=$(ord ${canon:0:1})
dir=database/${letter}
file=${dir}/${model}
if [[ -f database/${cletter}/${canon}.gz ]]
then
[[ -d ${dir} ]] || mkdir -p ${dir}
# Generally speaking the aliases are better uncompressed
./mkinfo -nofatal -quiet -json ${file} ${model}
fi
i=$(( i + 1 ))
progress $i ${#aliases[@]}
done
echo
|