summaryrefslogtreecommitdiffstats
path: root/librdfa/iri.c
diff options
context:
space:
mode:
Diffstat (limited to 'librdfa/iri.c')
-rw-r--r--librdfa/iri.c73
1 files changed, 73 insertions, 0 deletions
diff --git a/librdfa/iri.c b/librdfa/iri.c
new file mode 100644
index 0000000..8f72d78
--- /dev/null
+++ b/librdfa/iri.c
@@ -0,0 +1,73 @@
+/**
+ * Copyright 2008 Digital Bazaar, Inc.
+ *
+ * This file is part of librdfa.
+ *
+ * librdfa is Free Software, and can be licensed under any of the
+ * following three licenses:
+ *
+ * 1. GNU Lesser General Public License (LGPL) V2.1 or any
+ * newer version
+ * 2. GNU General Public License (GPL) V2 or any newer version
+ * 3. Apache License, V2.0 or any newer version
+ *
+ * You may not use this file except in compliance with at least one of
+ * the above three licenses.
+ *
+ * See LICENSE-* at the top of this software distribution for more
+ * information regarding the details of each license.
+ *
+ * The iri module is used to process IRIs.
+ */
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "rdfa.h"
+#include "rdfa_utils.h"
+
+/**
+ * Strips the iquery and ifragment part from an IRI. This leaves just the
+ * scheme and the ihier-part, as defined in RFC 3987. This function will
+ * copy the input string and return a new string that must be free()'d.
+ *
+ * @param iri the IRI that should be stripped of anything after the iquery
+ * and fragment, if they exist.
+ */
+char* rdfa_iri_get_base(const char* iri)
+{
+ char* rval = NULL;
+ const char* eindex = 0;
+
+ /* search to see if there is iquery separator */
+ eindex = strchr(iri, '?');
+ if(eindex == NULL)
+ {
+ /* if there is no iquery separator, check to see if there is an
+ * ifragment separator */
+ eindex = strchr(iri, '#');
+ }
+
+ /* check to see if the output string needs to be different from the
+ * input string */
+ if(eindex == NULL)
+ {
+ /* there was no iquery or ifragment in the input string, so there is
+ * no need to reformat the string */
+ rval = rdfa_strdup(iri);
+ }
+ else
+ {
+ /* the output string should be concatenated */
+ unsigned int length = (unsigned int)(eindex - iri);
+ rval = (char*)malloc(length + 1);
+ rval = strncpy(rval, iri, length);
+ rval[length] = '\0';
+ }
+
+ return rval;
+}