aboutsummaryrefslogtreecommitdiffstats
path: root/parsetag.c
diff options
context:
space:
mode:
Diffstat (limited to 'parsetag.c')
-rw-r--r--parsetag.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/parsetag.c b/parsetag.c
new file mode 100644
index 0000000..9cafd95
--- /dev/null
+++ b/parsetag.c
@@ -0,0 +1,56 @@
+#include "myctype.h"
+#include "indep.h"
+#include "Str.h"
+#include "parsetag.h"
+
+char *
+tag_get_value(struct parsed_tagarg *t, char *arg)
+{
+ for (; t; t = t->next) {
+ if (!strcasecmp(t->arg, arg))
+ return t->value;
+ }
+ return NULL;
+}
+
+int
+tag_exists(struct parsed_tagarg *t, char *arg)
+{
+ for (; t; t = t->next) {
+ if (!strcasecmp(t->arg, arg))
+ return 1;
+ }
+ return 0;
+}
+
+struct parsed_tagarg *
+cgistr2tagarg(char *cgistr)
+{
+ Str tag;
+ Str value;
+ struct parsed_tagarg *t0, *t;
+
+ t = t0 = NULL;
+ do {
+ t = New(struct parsed_tagarg);
+ t->next = t0;
+ t0 = t;
+ tag = Strnew();
+ while (*cgistr && *cgistr != '=' && *cgistr != '&')
+ Strcat_char(tag, *cgistr++);
+ t->arg = form_unquote(tag)->ptr;
+ t->value = NULL;
+ if (*cgistr == '\0')
+ return t;
+ else if (*cgistr == '=') {
+ cgistr++;
+ value = Strnew();
+ while (*cgistr && *cgistr != '&')
+ Strcat_char(value, *cgistr++);
+ t->value = form_unquote(value)->ptr;
+ }
+ else if (*cgistr == '&')
+ cgistr++;
+ } while (*cgistr);
+ return t;
+}