dte test coverage


Directory: ./
File: src/filetype/extensions.c
Date: 2025-05-08 15:05:54
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 {"har", JSON},
98 {"hcl", HCL},
99 {"hh", CPLUSPLUS},
100 {"hpp", CPLUSPLUS},
101 {"hrl", ERLANG},
102 {"hs", HASKELL},
103 {"htm", HTML},
104 {"html", HTML},
105 {"hxx", CPLUSPLUS},
106 {"ini", INI},
107 {"ino", CPLUSPLUS}, // https://arduino.github.io/arduino-cli/1.0/sketch-build-process/#pre-processing
108 {"ins", TEX},
109 {"java", JAVA},
110 {"jl", JULIA},
111 {"jq", JQ},
112 {"js", JAVASCRIPT},
113 {"jslib", JAVASCRIPT},
114 {"json", JSON},
115 {"jsonc", JSONC},
116 {"jsonl", JSON},
117 {"jspre", JAVASCRIPT},
118 {"kdl", KDL},
119 {"kml", XML},
120 {"ksh", SH},
121 {"kt", KOTLIN},
122 {"kts", KOTLIN},
123 {"latex", TEX},
124 {"lsp", LISP},
125 {"ltx", TEX},
126 {"lua", LUA},
127 {"m3u", CONFIG},
128 {"m3u8", CONFIG},
129 {"m4", M4},
130 {"mak", MAKE},
131 {"make", MAKE},
132 {"markdown", MARKDOWN},
133 {"mawk", AWK},
134 {"mcmeta", JSON},
135 {"md", MARKDOWN},
136 {"mdown", MARKDOWN},
137 {"mk", MAKE},
138 {"mkd", MARKDOWN},
139 {"mkdn", MARKDOWN},
140 {"ml", OCAML},
141 {"mli", OCAML},
142 {"moon", MOONSCRIPT},
143 {"mount", INI},
144 {"nawk", AWK},
145 {"nft", NFTABLES},
146 {"nginx", NGINX},
147 {"nginxconf", NGINX},
148 {"nim", NIM},
149 {"ninja", NINJA},
150 {"nix", NIX},
151 {"nomad", HCL},
152 {"odin", ODIN},
153 {"opml", XML},
154 {"page", XML},
155 {"pas", PASCAL},
156 {"patch", DIFF},
157 {"path", INI},
158 {"pc", PKGCONFIG},
159 {"perl", PERL},
160 {"php", PHP},
161 {"pl", PERL},
162 {"plist", XML},
163 {"pls", INI},
164 {"plt", GNUPLOT},
165 {"pm", PERL},
166 {"po", GETTEXT},
167 {"podspec", RUBY},
168 {"pot", GETTEXT},
169 {"pp", RUBY},
170 {"proto", PROTOBUF},
171 {"ps", POSTSCRIPT},
172 {"ps1", POWERSHELL},
173 {"psd1", POWERSHELL},
174 {"psm1", POWERSHELL},
175 {"py", PYTHON},
176 {"py3", PYTHON},
177 {"qrc", XML},
178 {"rake", RUBY},
179 {"rb", RUBY},
180 {"rbi", RUBY},
181 {"rbx", RUBY},
182 {"rdf", XML},
183 {"re", C}, // re2c
184 {"rkt", RACKET},
185 {"rktd", RACKET},
186 {"rktl", RACKET},
187 {"rockspec", LUA},
188 {"roff", ROFF},
189 {"rs", RUST},
190 {"rss", XML},
191 {"rst", RST},
192 {"ru", RUBY},
193 {"sarif", JSON},
194 {"scad", SCAD},
195 {"scala", SCALA},
196 {"scm", SCHEME},
197 {"scss", SCSS},
198 {"scxml", XML},
199 {"sed", SED},
200 {"service", INI},
201 {"sh", SH},
202 {"sld", SCHEME},
203 {"slice", INI},
204 {"slint", SLINT},
205 {"sls", SCHEME},
206 {"socket", INI},
207 {"spec", RPMSPEC},
208 {"sql", SQL},
209 {"ss", SCHEME},
210 {"sty", TEX},
211 {"supp", CONFIG},
212 {"svg", XML},
213 {"swift", SWIFT},
214 {"target", INI},
215 {"tcl", TCL},
216 {"tcsh", CSH},
217 {"tcshrc", CSH},
218 {"terminfo", TERMINFO},
219 {"tex", TEX},
220 {"texi", TEXINFO},
221 {"texinfo", TEXINFO},
222 {"tf", HCL},
223 {"tfvars", HCL},
224 {"thor", RUBY},
225 {"timer", INI},
226 {"tlv", TLVERILOG},
227 {"toml", TOML},
228 {"topojson", JSON},
229 {"tr", ROFF},
230 {"ts", TYPESCRIPT},
231 {"tsv", TSV},
232 {"tsx", TYPESCRIPT},
233 {"typ", TYPST},
234 {"ui", XML},
235 {"vala", VALA},
236 {"vapi", VALA},
237 {"vcard", VCARD},
238 {"vcf", VCARD},
239 {"ver", VERILOG},
240 {"vert", GLSL},
241 {"vh", VHDL},
242 {"vhd", VHDL},
243 {"vhdl", VHDL},
244 {"vim", VIML},
245 {"weechatlog", WEECHATLOG},
246 {"wsgi", PYTHON},
247 {"xbel", XML},
248 {"xhtml", HTML},
249 {"xml", XML},
250 {"xsd", XML},
251 {"xsl", XML},
252 {"xslt", XML},
253 {"xspf", XML},
254 {"yaml", YAML},
255 {"yml", YAML},
256 {"zig", ZIG},
257 {"zsh", SH},
258 };
259
260 154 static FileTypeEnum filetype_from_extension(const StringView ext)
261 {
262
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)) {
263 return NONE;
264 }
265
266
2/2
✓ Branch 0 (3→4) taken 28 times.
✓ Branch 1 (3→14) taken 58 times.
86 if (ext.length == 1) {
267
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]) {
268 case '1': case '2': case '3':
269 case '4': case '5': case '6':
270 case '7': case '8': case '9':
271 return ROFF;
272 16 case 'c': case 'h':
273 16 return C;
274 2 case 'C': case 'H':
275 2 return CPLUSPLUS;
276 2 case 'S': case 's':
277 2 return ASM;
278 1 case 'd': return D;
279 1 case 'l': return LEX;
280 1 case 'm': return OBJC;
281 1 case 'v': return VERILOG;
282 1 case 'y': return YACC;
283 }
284 1 return NONE;
285 }
286
287 58 const struct FileExtensionMap *e = BSEARCH(&ext, extensions, ft_compare);
288
2/2
✓ Branch 0 (15→16) taken 30 times.
✓ Branch 1 (15→17) taken 28 times.
58 return e ? e->filetype : NONE;
289 }
290