2.58
xs_mime.h
1/* copyright (c) 2022 - 2024 grunfink et al. / MIT license */
2
3#ifndef _XS_MIME
4
5#define _XS_MIME
6
7const char *xs_mime_by_ext(const char *file);
8
9extern const char *xs_mime_types[];
10
11#ifdef XS_IMPLEMENTATION
12
13/* intentionally brain-dead simple */
14/* CAUTION: sorted */
15
16const char *xs_mime_types[] = {
17 "3gp", "video/3gpp",
18 "aac", "audio/aac",
19 "css", "text/css",
20 "flac", "audio/flac",
21 "flv", "video/flv",
22 "gif", "image/gif",
23 "gmi", "text/gemini",
24 "html", "text/html",
25 "jpeg", "image/jpeg",
26 "jpg", "image/jpeg",
27 "json", "application/json",
28 "m4a", "audio/aac",
29 "m4v", "video/mp4",
30 "md", "text/markdown",
31 "mov", "video/quicktime",
32 "mp3", "audio/mp3",
33 "mp4", "video/mp4",
34 "mpg4", "video/mp4",
35 "oga", "audio/ogg",
36 "ogg", "audio/ogg",
37 "ogv", "video/ogg",
38 "opus", "audio/ogg",
39 "png", "image/png",
40 "svg", "image/svg+xml",
41 "svgz", "image/svg+xml",
42 "txt", "text/plain",
43 "wav", "audio/wav",
44 "webm", "video/webm",
45 "webp", "image/webp",
46 "wma", "audio/wma",
47 "xml", "text/xml",
48 NULL, NULL,
49};
50
51
52const char *xs_mime_by_ext(const char *file)
53/* returns the MIME type by file extension */
54{
55 const char *ext = strrchr(file, '.');
56
57 if (ext) {
58 xs *uext = xs_tolower_i(xs_dup(ext + 1));
59 int b = 0;
60 int t = xs_countof(xs_mime_types) / 2 - 2;
61
62 while (t >= b) {
63 int n = (b + t) / 2;
64 const char *p = xs_mime_types[n * 2];
65
66 int c = strcmp(uext, p);
67
68 if (c < 0)
69 t = n - 1;
70 else
71 if (c > 0)
72 b = n + 1;
73 else
74 return xs_mime_types[(n * 2) + 1];
75 }
76 }
77
78 return "application/octet-stream";
79}
80
81
82#endif /* XS_IMPLEMENTATION */
83
84#endif /* XS_MIME */