diff options
Diffstat (limited to 'src/mime/mime.c')
| -rw-r--r-- | src/mime/mime.c | 59 |
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"); +} + |
