summaryrefslogtreecommitdiff
path: root/src/mime
diff options
context:
space:
mode:
Diffstat (limited to 'src/mime')
-rw-r--r--src/mime/mime.c59
-rw-r--r--src/mime/mime.h21
2 files changed, 80 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");
+}
+
diff --git a/src/mime/mime.h b/src/mime/mime.h
new file mode 100644
index 0000000..dada0a3
--- /dev/null
+++ b/src/mime/mime.h
@@ -0,0 +1,21 @@
+#ifndef MIME_H
+#define MIME_H
+
+#include "str/str.h"
+#include "list/list.h"
+
+
+typedef struct mime_type {
+ str desc;
+ str ext;
+} mime_type;
+
+
+void add_mime_type(mime_type mt);
+void read_mime_types(str file);
+str get_mime_type(str ext);
+void free_mime_types(void);
+
+void print_mime_types(void);
+
+#endif