summaryrefslogtreecommitdiff
path: root/src/mime/mime.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mime/mime.c')
-rw-r--r--src/mime/mime.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/mime/mime.c b/src/mime/mime.c
new file mode 100644
index 0000000..99250ea
--- /dev/null
+++ b/src/mime/mime.c
@@ -0,0 +1,59 @@
+#include "mime.h"
+
+
+// look into making this a BST or something more efficient
+static mime_type *types;
+
+void add_mime_type(mime_type mt){
+ list_push(types, mt);
+}
+
+void read_mime_types(str file){
+ if(types == NULL){
+ init_nlist(types);
+ }
+ int off = 0;
+ while(off < file.len){
+ while(off < file.len && charisspace(file.ptr[off])) off++;
+ if(file.ptr[off] == '#'){
+ while(off < file.len && !charislinebreak(file.ptr[off])) off++;
+ continue;
+ }
+ mime_type mt;
+ mt.desc = sread_delim_f(file.ptr + off, charisspace, true);
+ off += mt.desc.len;
+ while(off < file.len && charisspace(file.ptr[off])) off++;
+ mt.ext = sread_delim_f(file.ptr + off, charisspace, true);
+ off += mt.ext.len;
+ while(off < file.len && !charislinebreak(file.ptr[off])) off++;
+ if(mt.desc.len == 0 || mt.ext.len == 0){
+ continue;
+ }
+ add_mime_type(mt);
+ }
+}
+
+str get_mime_type(str ext){
+ int size = list_size(types);
+ for(int i = 0; i < size; i++){
+ if(streq(types[i].ext, ext)){
+ return types[i].desc;
+ }
+ }
+ return (str){0};
+}
+
+void free_mime_types(void){
+ list_free(types);
+}
+
+void print_mime_types(void){
+ int size = list_size(types);
+ printf("\t- types: {\n");
+ for(int i = 0; i < size; i++){
+ printf("\t\t%.*s\t%.*s\n",
+ types[i].desc.len, types[i].desc.ptr, types[i].ext.len, types[i].ext.ptr);
+ }
+ printf("\t}\n");
+}
+