diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2018-01-03 12:23:44 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2018-01-03 12:23:52 +0200 |
commit | 80ed5e611de0e31eed65ee207f1fd64ad097e6d1 (patch) | |
tree | 40979fe5ecadaa3d1351c645ff7988a87218e142 /mimetypes/ident.c | |
parent | a4edd153e4cdf703c98008313743b112274e760f (diff) | |
download | fileserv-80ed5e611de0e31eed65ee207f1fd64ad097e6d1.tar.gz fileserv-80ed5e611de0e31eed65ee207f1fd64ad097e6d1.tar.bz2 |
Add mimetypes library.
Ported from GNU Mailutils.
Diffstat (limited to 'mimetypes/ident.c')
-rw-r--r-- | mimetypes/ident.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/mimetypes/ident.c b/mimetypes/ident.c new file mode 100644 index 0000000..6478e76 --- /dev/null +++ b/mimetypes/ident.c @@ -0,0 +1,85 @@ +#include <stdlib.h> +#include <errno.h> +#include <string.h> + +struct ident_ref +{ + char *name; + size_t count; + struct ident_ref *next; +}; + +static struct ident_ref *nametab; + +int +ident_ref (char const *name, char const **refname) +{ + struct ident_ref *ref = NULL; + + if (!refname) + return EINVAL; + + if (!name) + { + *refname = NULL; + return 0; + } + + if (nametab) + { + for (ref = nametab; ref; ref = ref->next) + { + if (strcmp (ref->name, name) == 0) + break; + } + } + + if (!ref) + { + ref = malloc (sizeof (*ref)); + if (!ref) + return -1; + ref->name = strdup (name); + if (!ref->name) + { + free (ref); + return -1; + } + ref->count = 0; + ref->next = nametab; + nametab = ref; + } + + ref->count++; + *refname = ref->name; + + return 0; +} + +void +ident_deref (char const *name) +{ + struct ident_ref *ref, *prev; + + if (!name || !nametab) + return; + + for (ref = nametab, prev = NULL; ref; prev = ref, ref = ref->next) + { + if (strcmp (ref->name, name) == 0) + { + if (--ref->count == 0) + { + if (prev) + prev->next = ref->next; + else + nametab = ref->next; + free (ref->name); + free (ref); + } + break; + } + } +} + + |