dte test coverage


Directory: ./
File: src/filetype/extensions.c
Date: 2025-07-10 06:26:10
Exec Total Coverage
Lines: 18 18 100.0%
Functions: 1 1 100.0%
Branches: 16 16 100.0%

Line Branch Exec Source
1 static const struct FileExtensionMap {
2 const char ext[11];
3 const uint8_t filetype; // FileTypeEnum
4 } extensions[] = {
5 {"ada", ADA},
6 {"adb", ADA},
7 {"adoc", ASCIIDOC},
8 {"ads", ADA},
9 {"asciidoc", ASCIIDOC},
10 {"asd", LISP},
11 {"asm", ASM},
12 {"auk", AWK},
13 {"automount", INI},
14 {"avsc", JSON},
15 {"awk", AWK},
16 {"bash", SH},
17 {"bat", BATCH},
18 {"bats", SH}, // https://github.com/bats-core/bats-core
19 {"bbl", TEX},
20 {"bib", BIBTEX},
21 {"btm", BATCH},
22 {"bzl", PYTHON}, // https://bazel.build/rules/language
23 {"c++", CPLUSPLUS},
24 {"cbl", COBOL},
25 {"cc", CPLUSPLUS},
26 {"cjs", JAVASCRIPT},
27 {"cl", LISP},
28 {"clj", CLOJURE},
29 {"cls", TEX},
30 {"cmake", CMAKE},
31 {"cmd", BATCH},
32 {"cnc", GCODE},
33 {"cob", COBOL},
34 {"cobol", COBOL},
35 {"cocci", COCCINELLE},
36 {"coffee", COFFEESCRIPT},
37 {"cpp", CPLUSPLUS},
38 {"cr", RUBY},
39 {"cs", CSHARP},
40 {"csh", CSH},
41 {"cshrc", CSH},
42 {"cson", COFFEESCRIPT},
43 {"css", CSS},
44 {"csv", CSV},
45 {"cxx", CPLUSPLUS},
46 {"d2", D2},
47 {"dart", DART},
48 {"desktop", INI},
49 {"di", D},
50 {"diff", DIFF},
51 {"dircolors", CONFIG},
52 {"doap", XML},
53 {"docbook", XML},
54 {"docker", DOCKER},
55 {"dot", DOT},
56 {"doxy", CONFIG},
57 {"dterc", DTE},
58 {"dts", DEVICETREE},
59 {"dtsi", DEVICETREE},
60 {"dtx", TEX},
61 {"ebuild", SH},
62 {"el", LISP},
63 {"emacs", LISP},
64 {"eml", MAIL},
65 {"eps", POSTSCRIPT},
66 {"erl", ERLANG},
67 {"ex", ELIXIR},
68 {"exs", ELIXIR},
69 {"fish", FISH},
70 {"flatpakref", INI},
71 {"frag", GLSL},
72 {"gawk", AWK},
73 {"gco", GCODE},
74 {"gcode", GCODE},
75 {"gd", GDSCRIPT},
76 {"gemspec", RUBY},
77 {"geojson", JSON},
78 {"gitignore", GITIGNORE},
79 {"glsl", GLSL},
80 {"glslf", GLSL},
81 {"glslv", GLSL},
82 {"gltf", JSON},
83 {"gml", XML},
84 {"gnuplot", GNUPLOT},
85 {"go", GO},
86 {"god", RUBY},
87 {"gp", GNUPLOT},
88 {"gperf", GPERF},
89 {"gpi", GNUPLOT},
90 {"gql", GRAPHQL},
91 {"graphql", GRAPHQL},
92 {"graphqls", GRAPHQL},
93 {"groovy", GROOVY},
94 {"grxml", XML},
95 {"gsed", SED},
96 {"gv", DOT},
97 {"ha", HARE},
98 {"har", JSON},
99 {"hcl", HCL},
100 {"hh", CPLUSPLUS},
101 {"hpp", CPLUSPLUS},
102 {"hrl", ERLANG},
103 {"hs", HASKELL},
104 {"htm", HTML},
105 {"html", HTML},
106 {"hxx", CPLUSPLUS},
107 {"ini", INI},
108 {"ino", CPLUSPLUS}, // https://arduino.github.io/arduino-cli/1.0/sketch-build-process/#pre-processing
109 {"ins", TEX},
110 {"java", JAVA},
111 {"jl", JULIA},
112 {"jq", JQ},
113 {"js", JAVASCRIPT},
114 {"jslib", JAVASCRIPT},
115 {"json", JSON},
116 {"jsonc", JSONC},
117 {"jsonl", JSON},
118 {"jspre", JAVASCRIPT},
119 {"kdl", KDL},
120 {"kml", XML},
121 {"ksh", SH},
122 {"kt", KOTLIN},
123 {"kts", KOTLIN},
124 {"latex", TEX},
125 {"lsp", LISP},
126 {"ltx", TEX},
127 {"lua", LUA},
128 {"m3u", CONFIG},
129 {"m3u8", CONFIG},
130 {"m4", M4},
131 {"mak", MAKE},
132 {"make", MAKE},
133 {"markdown", MARKDOWN},
134 {"mawk", AWK},
135 {"mcmeta", JSON},
136 {"md", MARKDOWN},
137 {"mdown", MARKDOWN},
138 {"mk", MAKE},
139 {"mkd", MARKDOWN},
140 {"mkdn", MARKDOWN},
141 {"ml", OCAML},
142 {"mli", OCAML},
143 {"moon", MOONSCRIPT},
144 {"mount", INI},
145 {"nawk", AWK},
146 {"nft", NFTABLES},
147 {"nginx", NGINX},
148 {"nginxconf", NGINX},
149 {"nim", NIM},
150 {"ninja", NINJA},
151 {"nix", NIX},
152 {"nomad", HCL},
153 {"odin", ODIN},
154 {"opml", XML},
155 {"page", XML},
156 {"pas", PASCAL},
157 {"patch", DIFF},
158 {"path", INI},
159 {"pc", PKGCONFIG},
160 {"perl", PERL},
161 {"php", PHP},
162 {"pl", PERL},
163 {"plist", XML},
164 {"pls", INI},
165 {"plt", GNUPLOT},
166 {"pm", PERL},
167 {"po", GETTEXT},
168 {"podspec", RUBY},
169 {"pot", GETTEXT},
170 {"pp", RUBY},
171 {"proto", PROTOBUF},
172 {"ps", POSTSCRIPT},
173 {"ps1", POWERSHELL},
174 {"psd1", POWERSHELL},
175 {"psm1", POWERSHELL},
176 {"py", PYTHON},
177 {"py3", PYTHON},
178 {"qrc", XML},
179 {"rake", RUBY},
180 {"rb", RUBY},
181 {"rbi", RUBY},
182 {"rbx", RUBY},
183 {"rdf", XML},
184 {"re", C}, // re2c
185 {"rkt", RACKET},
186 {"rktd", RACKET},
187 {"rktl", RACKET},
188 {"rockspec", LUA},
189 {"roff", ROFF},
190 {"rs", RUST},
191 {"rss", XML},
192 {"rst", RST},
193 {"ru", RUBY},
194 {"sarif", JSON},
195 {"scad", SCAD},
196 {"scala", SCALA},
197 {"scm", SCHEME},
198 {"scss", SCSS},
199 {"scxml", XML},
200 {"sed", SED},
201 {"service", INI},
202 {"sh", SH},
203 {"sld", SCHEME},
204 {"slice", INI},
205 {"slint", SLINT},
206 {"sls", SCHEME},
207 {"socket", INI},
208 {"spec", RPMSPEC},
209 {"sql", SQL},
210 {"ss", SCHEME},
211 {"sty", TEX},
212 {"supp", CONFIG},
213 {"svg", XML},
214 {"swift", SWIFT},
215 {"target", INI},
216 {"tcl", TCL},
217 {"tcsh", CSH},
218 {"tcshrc", CSH},
219 {"terminfo", TERMINFO},
220 {"tex", TEX},
221 {"texi", TEXINFO},
222 {"texinfo", TEXINFO},
223 {"tf", HCL},
224 {"tfvars", HCL},
225 {"thor", RUBY},
226 {"timer", INI},
227 {"tlv", TLVERILOG},
228 {"toml", TOML},
229 {"topojson", JSON},
230 {"tr", ROFF},
231 {"ts", TYPESCRIPT},
232 {"tsv", TSV},
233 {"tsx", TYPESCRIPT},
234 {"typ", TYPST},
235 {"ui", XML},
236 {"vala", VALA},
237 {"vapi", VALA},
238 {"vcard", VCARD},
239 {"vcf", VCARD},
240 {"ver", VERILOG},
241 {"vert", GLSL},
242 {"vh", VHDL},
243 {"vhd", VHDL},
244 {"vhdl", VHDL},
245 {"vim", VIML},
246 {"weechatlog", WEECHATLOG},
247 {"wsgi", PYTHON},
248 {"xbel", XML},
249 {"xhtml", HTML},
250 {"xml", XML},
251 {"xsd", XML},
252 {"xsl", XML},
253 {"xslt", XML},
254 {"xspf", XML},
255 {"yaml", YAML},
256 {"yml", YAML},
257 {"zig", ZIG},
258 {"zsh", SH},
259 };
260
261 154 static FileTypeEnum filetype_from_extension(const StringView ext)
262 {
263
2/2
✓ Branch 0 (2→3) taken 86 times.
✓ Branch 1 (2→17) taken 68 times.
154 if (ext.length == 0 || ext.length >= sizeof(extensions[0].ext)) {
264 return NONE;
265 }
266
267
2/2
✓ Branch 0 (3→4) taken 28 times.
✓ Branch 1 (3→14) taken 58 times.
86 if (ext.length == 1) {
268
10/10
✓ Branch 0 (4→5) taken 16 times.
✓ Branch 1 (4→6) taken 2 times.
✓ Branch 2 (4→7) taken 2 times.
✓ Branch 3 (4→8) taken 1 times.
✓ Branch 4 (4→9) taken 1 times.
✓ Branch 5 (4→10) taken 1 times.
✓ Branch 6 (4→11) taken 1 times.
✓ Branch 7 (4→12) taken 1 times.
✓ Branch 8 (4→13) taken 1 times.
✓ Branch 9 (4→17) taken 2 times.
28 switch (ext.data[0]) {
269 case '1': case '2': case '3':
270 case '4': case '5': case '6':
271 case '7': case '8': case '9':
272 return ROFF;
273 16 case 'c': case 'h':
274 16 return C;
275 2 case 'C': case 'H':
276 2 return CPLUSPLUS;
277 2 case 'S': case 's':
278 2 return ASM;
279 1 case 'd': return D;
280 1 case 'l': return LEX;
281 1 case 'm': return OBJC;
282 1 case 'v': return VERILOG;
283 1 case 'y': return YACC;
284 }
285 1 return NONE;
286 }
287
288 58 const struct FileExtensionMap *e = BSEARCH(&ext, extensions, ft_compare);
289
2/2
✓ Branch 0 (15→16) taken 30 times.
✓ Branch 1 (15→17) taken 28 times.
58 return e ? e->filetype : NONE;
290 }
291