summaryrefslogtreecommitdiff
path: root/mimetypes/ident.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2018-01-03 12:23:44 +0200
committerSergey Poznyakoff <gray@gnu.org>2018-01-03 12:23:52 +0200
commit80ed5e611de0e31eed65ee207f1fd64ad097e6d1 (patch)
tree40979fe5ecadaa3d1351c645ff7988a87218e142 /mimetypes/ident.c
parenta4edd153e4cdf703c98008313743b112274e760f (diff)
downloadfileserv-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.c85
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;
+ }
+ }
+}
+
+

Return to:

Send suggestions and report system problems to the System administrator.