X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=ccl%2Fcclptree.c;h=e1086456c0ac574f6be3b85fc6e668fcdd124fba;hb=cf273cb8a7f73124935713928cd5df5b537f8b9c;hp=5ed36c0f6b2fe72ffb3a0ded4afd58e70038004a;hpb=85a2e7affad79fd8bd59b403ba7b5f7867d60523;p=yaz-moved-to-github.git diff --git a/ccl/cclptree.c b/ccl/cclptree.c index 5ed36c0..e108645 100644 --- a/ccl/cclptree.c +++ b/ccl/cclptree.c @@ -44,12 +44,9 @@ /* CCL print rpn tree - infix notation * Europagate, 1995 * - * $Log: cclptree.c,v $ - * Revision 1.5 1997-04-30 08:52:06 quinn - * Null + * $Id: cclptree.c,v 1.14 2003-06-24 23:03:04 adam Exp $ * - * Revision 1.4 1996/10/11 15:00:25 adam - * CCL parser from Europagate Email gateway 1.0. + * Old Europagate Log: * * Revision 1.6 1995/05/16 09:39:26 adam * LICENSE. @@ -72,57 +69,204 @@ */ #include -#include #include +#include -#include +#include -void ccl_pr_tree (struct ccl_rpn_node *rpn, FILE *fd_out) +void fprintSpaces(int indent,FILE * fd_out) { + char buf[100]; + sprintf(buf,"%%%d.s",indent); + fprintf(fd_out,buf," "); +}; + +void ccl_pr_tree_as_qrpn(struct ccl_rpn_node *rpn, FILE *fd_out, int indent) +{ + if(indent>0) fprintSpaces(indent,fd_out); switch (rpn->kind) { case CCL_RPN_TERM: - fprintf (fd_out, "\"%s\"", rpn->u.t.term); if (rpn->u.t.attr_list) { struct ccl_rpn_attr *attr; for (attr = rpn->u.t.attr_list; attr; attr = attr->next) - fprintf (fd_out, " %d=%d", attr->type, attr->value); + { + if (attr->set) + fprintf(fd_out, "@attr %s", attr->set); + else + fprintf(fd_out, "@attr "); + switch(attr->kind) + { + case CCL_RPN_ATTR_NUMERIC: + fprintf (fd_out, "%d=%d ", attr->type, + attr->value.numeric); + break; + case CCL_RPN_ATTR_STRING: + fprintf (fd_out, "%d=%s ", attr->type, + attr->value.str); + } + } } - break; + fprintf (fd_out, "\"%s\"\n", rpn->u.t.term); + break; case CCL_RPN_AND: - fprintf (fd_out, "("); - ccl_pr_tree (rpn->u.p[0], fd_out); - fprintf (fd_out, ") and ("); - ccl_pr_tree (rpn->u.p[1], fd_out); - fprintf (fd_out, ")"); - break; + fprintf (fd_out, "@and \n"); + ccl_pr_tree_as_qrpn (rpn->u.p[0], fd_out,indent+2); + ccl_pr_tree_as_qrpn (rpn->u.p[1], fd_out,indent+2); + break; case CCL_RPN_OR: - fprintf (fd_out, "("); - ccl_pr_tree (rpn->u.p[0], fd_out); - fprintf (fd_out, ") or ("); - ccl_pr_tree (rpn->u.p[1], fd_out); - fprintf (fd_out, ")"); - break; + fprintf (fd_out, "@or \n"); + ccl_pr_tree_as_qrpn (rpn->u.p[0], fd_out,indent+2); + ccl_pr_tree_as_qrpn (rpn->u.p[1], fd_out,indent+2); + break; case CCL_RPN_NOT: - fprintf (fd_out, "("); - ccl_pr_tree (rpn->u.p[0], fd_out); - fprintf (fd_out, ") not ("); - ccl_pr_tree (rpn->u.p[1], fd_out); - fprintf (fd_out, ")"); - break; + fprintf (fd_out, "@not "); + ccl_pr_tree_as_qrpn (rpn->u.p[0], fd_out,indent+2); + ccl_pr_tree_as_qrpn (rpn->u.p[1], fd_out,indent+2); + break; case CCL_RPN_SET: - fprintf (fd_out, "set=%s", rpn->u.setname); - break; + fprintf (fd_out, "set=%s ", rpn->u.setname); + break; case CCL_RPN_PROX: - fprintf (fd_out, "("); - ccl_pr_tree (rpn->u.p[0], fd_out); - fprintf (fd_out, ") prox ("); - ccl_pr_tree (rpn->u.p[1], fd_out); - fprintf (fd_out, ")"); - break; + if (rpn->u.p[2] && rpn->u.p[2]->kind == CCL_RPN_TERM) + { + const char *cp = rpn->u.p[2]->u.t.term; + /* exlusion distance ordered relation which-code unit-code */ + if (*cp == '!') + { + /* word order specified */ + if (isdigit(cp[1])) + fprintf(fd_out, "@prox 0 %s 1 2 known 2", cp+1); + else + fprintf(fd_out, "@prox 0 1 1 2 known 2"); + } + else if (*cp == '%') + { + /* word order not specified */ + if (isdigit(cp[1])) + fprintf(fd_out, "@prox 0 %s 0 2 known 2", cp+1); + else + fprintf(fd_out, "@prox 0 1 0 2 known 2"); + } + } + ccl_pr_tree_as_qrpn (rpn->u.p[0], fd_out,indent+2); + ccl_pr_tree_as_qrpn (rpn->u.p[1], fd_out,indent+2); + break; default: - assert (0); + fprintf(stderr,"Internal Error Unknown ccl_rpn node type %d\n",rpn->kind); } } + + +void ccl_pr_tree (struct ccl_rpn_node *rpn, FILE *fd_out) +{ + ccl_pr_tree_as_qrpn(rpn,fd_out,0); +} + + +static void ccl_pquery_complex (WRBUF w, struct ccl_rpn_node *p) +{ + switch (p->kind) + { + case CCL_RPN_AND: + wrbuf_puts(w, "@and "); + break; + case CCL_RPN_OR: + wrbuf_puts(w, "@or "); + break; + case CCL_RPN_NOT: + wrbuf_puts(w, "@not "); + break; + case CCL_RPN_PROX: + if (p->u.p[2] && p->u.p[2]->kind == CCL_RPN_TERM) + { + const char *cp = p->u.p[2]->u.t.term; + /* exlusion distance ordered relation which-code unit-code */ + if (*cp == '!') + { + /* word order specified */ + if (isdigit(cp[1])) + wrbuf_printf(w, "@prox 0 %s 1 2 k 2 ", cp+1); + else + wrbuf_printf(w, "@prox 0 1 1 2 k 2 "); + } + else if (*cp == '%') + { + /* word order not specified */ + if (isdigit(cp[1])) + wrbuf_printf(w, "@prox 0 %s 0 2 k 2 ", cp+1); + else + wrbuf_printf(w, "@prox 0 1 0 2 k 2 "); + } + } + else + wrbuf_puts(w, "@prox 0 2 0 1 k 2 "); + break; + default: + wrbuf_puts(w, "@ bad op (unknown) "); + } + ccl_pquery(w, p->u.p[0]); + ccl_pquery(w, p->u.p[1]); +} + +void ccl_pquery (WRBUF w, struct ccl_rpn_node *p) +{ + struct ccl_rpn_attr *att; + const char *cp; + + switch (p->kind) + { + case CCL_RPN_AND: + case CCL_RPN_OR: + case CCL_RPN_NOT: + case CCL_RPN_PROX: + ccl_pquery_complex (w, p); + break; + case CCL_RPN_SET: + wrbuf_puts (w, "@set "); + wrbuf_puts (w, p->u.setname); + wrbuf_puts (w, " "); + break; + case CCL_RPN_TERM: + for (att = p->u.t.attr_list; att; att = att->next) + { + char tmpattr[128]; + wrbuf_puts (w, "@attr "); + if (att->set) + { + wrbuf_puts (w, att->set); + wrbuf_puts (w, " "); + } + switch(att->kind) + { + case CCL_RPN_ATTR_NUMERIC: + sprintf(tmpattr, "%d=%d ", att->type, att->value.numeric); + wrbuf_puts (w, tmpattr); + break; + case CCL_RPN_ATTR_STRING: + sprintf(tmpattr, "%d=", att->type); + wrbuf_puts (w, tmpattr); + wrbuf_puts(w, att->value.str); + wrbuf_puts (w, " "); + break; + } + } + for (cp = p->u.t.term; *cp; cp++) + { + if (*cp == ' ' || *cp == '\\') + wrbuf_putc (w, '\\'); + wrbuf_putc (w, *cp); + } + wrbuf_puts (w, " "); + break; + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */