2.52 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 */