Source restructure. yaz-marcdump part of installation
[yaz-moved-to-github.git] / src / query.c
diff --git a/src/query.c b/src/query.c
new file mode 100644 (file)
index 0000000..ec0bdcb
--- /dev/null
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 1995-2001, Index Data
+ * See the file LICENSE for details.
+ *
+ * $Id: query.c,v 1.1 2003-10-27 12:21:35 adam Exp $
+ */
+
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+
+#include <yaz/odr.h>
+#include <yaz/proto.h>
+
+static Z_Complex *makecomplex(ODR o, char **buf);
+static Z_Operand *makesimple(ODR o, char **buf);
+Z_RPNStructure *makerpn(ODR o, char **buf);
+
+void skip_spaces(char**p)
+{
+    while (**p && isspace(**p))
+       (*p)++;
+}
+
+static Z_Operand *makesimple(ODR o, char **buf)
+{
+    Z_Operand *r;
+    Z_AttributesPlusTerm *t;
+    char *b;
+
+    r = odr_malloc(o, sizeof(*r));
+    if (**buf == 's' && *((*buf) + 1) == '=')
+    {
+       char *b = odr_malloc(o, 100);
+
+       r->which = Z_Operand_resultSetId;
+       r->u.resultSetId = b;
+       (*buf)++;
+       (*buf)++;
+       while (**buf && !isspace(**buf))
+           *(b++) = *((*buf)++);
+       *b = 0;
+       return r;
+    }
+    else if (**buf != '"')
+       return 0;
+    (*buf)++;
+    r->which = Z_Operand_APT;
+    r->u.attributesPlusTerm = t = odr_malloc(o, sizeof(*t));
+    t->attributes = odr_malloc(o, sizeof(*t));
+    t->attributes->num_attributes = 0;
+    t->attributes->attributes = 0;
+    t->term = odr_malloc(o, sizeof(*t->term));
+    t->term->which = Z_Term_general;
+    t->term->u.general = odr_malloc(o, sizeof(Odr_oct));
+    t->term->u.general->buf = odr_malloc(o, 100);
+    t->term->u.general->size = 100;
+    t->term->u.general->len = 0;
+    b = (char*) t->term->u.general->buf;
+    while (**buf && **buf != '"')
+    {
+       *(b++) = *((*buf)++);
+       t->term->u.general->len++;
+    }
+    if (**buf != '"')
+       return 0;
+    (*buf)++;
+    return r;
+}
+
+static Z_Complex *makecomplex(ODR o, char **buf)
+{
+    Z_Complex *r;
+    char op[100], *b;
+
+    r = odr_malloc(o, sizeof(*r));
+    r->roperator = odr_malloc(o, sizeof(*r->roperator));
+
+    b = op;
+    while (**buf && !isspace(**buf))
+       *(b++) = *((*buf)++);
+    *b = 0;
+    if (!strcmp(op, "and"))
+       r->roperator->which = Z_Operator_and;
+    else if (!strcmp(op, "or"))
+       r->roperator->which = Z_Operator_or;
+    else if (!strcmp(op, "not"))
+       r->roperator->which = Z_Operator_and_not;
+    r->roperator->u.and = "";
+    while (**buf && !isspace(**buf))
+       (*buf)++;
+    if (!(r->s1 = makerpn(o, buf)))
+       return 0;
+    if (!(r->s2 = makerpn(o, buf)))
+       return 0;
+    return r;
+}
+    
+Z_RPNStructure *makerpn(ODR o, char **buf)
+{
+    Z_RPNStructure *r;
+
+    r = odr_malloc(o, sizeof(*r));
+    skip_spaces(buf);
+    if (**buf == '"' || **buf == 's')
+    {
+       r->which = Z_RPNStructure_simple;
+       if (!(r->u.simple = makesimple(o, buf)))
+           return 0;
+       return r;
+    }
+    r->which = Z_RPNStructure_complex;
+    if (!(r->u.complex = makecomplex(o, buf)))
+       return 0;
+    return r;
+}