xs_mime.h 1.7 KB

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