38 {
"7z",
"application/x-7z-compressed"},
39 {
"apk",
"application/vnd.android.package-archive"},
40 {
"avif",
"image/avif"},
44 {
"data",
"application/octet-stream"},
45 {
"deb",
"application/vnd.debian.binary-package"},
46 {
"exe",
"application/vnd.microsoft.portable-executable"},
48 {
"gz",
"application/gzip"},
50 {
"html",
"text/html"},
51 {
"ico",
"image/vnd.microsoft.icon"},
52 {
"jpeg",
"image/jpeg"},
53 {
"jpg",
"image/jpeg"},
54 {
"js",
"text/javascript"},
55 {
"json",
"application/json"},
56 {
"map",
"application/json"},
57 {
"md",
"text/markdown"},
58 {
"md5",
"text/plain"},
59 {
"mjs",
"text/javascript"},
60 {
"mp3",
"audio/mpeg"},
66 {
"pdf",
"application/pdf"},
68 {
"rss",
"application/rss+xml"},
69 {
"svg",
"image/svg+xml"},
70 {
"tar",
"application/x-tar"},
72 {
"txt",
"text/plain"},
73 {
"wasm",
"application/wasm"},
75 {
"webm",
"video/webm"},
76 {
"webmanifest",
"application/manifest+json"},
77 {
"webp",
"image/webp"},
78 {
"woff",
"font/woff"},
79 {
"woff2",
"font/woff2"},
80 {
"xml",
"application/xml"},
81 {
"zip",
"application/zip"},
92 size_t i, end, seg = 0, dot = (size_t)-1, elen, lo, hi;
95 for (end = 0; end < len && path[end] !=
'?' && path[end] !=
'#'; end++);
96 for (i = 0; i < end; i++) {
99 else if (path[i] ==
'.')
103 if (dot == (
size_t)-1 || dot < seg || dot == seg || dot + 1 >= end)
105 elen = end - dot - 1;
106 if (elen >=
sizeof(ext))
108 for (i = 0; i < elen; i++) {
109 unsigned char c = (
unsigned char)path[dot + 1 + i];
110 ext[i] = (char)(c >=
'A' && c <=
'Z' ? c -
'A' +
'a' : c);
116 size_t mid = lo + (hi - lo) / 2;
static void type(N_GUI_CTX *gui, const char *s)
Type a whole string into whatever has focus.
int n_http_mime_table_check(void)
check that the built-in table is sorted, as its lookup requires
const char * n_http_mime_type(const char *path, size_t len)
media type for a path or file name, from its extension
static const struct @242055217114105150047231111160250133146166323032 _mime_table[]
Media type of a file from its extension, for a static file server.