dte test coverage


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