X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fquery.c;fp=src%2Fquery.c;h=ec0bdcb5d3272ae91ec89817c1c4846d739e354b;hb=c6e47cbbff56f39f6d81b079ebaeac41d793d4d9;hp=0000000000000000000000000000000000000000;hpb=c71d717ada2a9ef730d527f161eb5ba9aa641a9f;p=yaz-moved-to-github.git diff --git a/src/query.c b/src/query.c new file mode 100644 index 0000000..ec0bdcb --- /dev/null +++ b/src/query.c @@ -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 +#include +#include + +#include +#include + +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; +}