New Z39.50 OID utilities: yaz_oidval_to_z3950oid, yaz_str_to_z3950oid
[yaz-moved-to-github.git] / zutil / yaz-ccl.c
index 440972f..4c86dfe 100644 (file)
@@ -1,10 +1,26 @@
 /*
- * Copyright (c) 1996-2000, Index Data.
+ * Copyright (c) 1996-2001, Index Data.
  * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: yaz-ccl.c,v $
- * Revision 1.9  2000-11-27 14:16:55  adam
+ * Revision 1.14  2001-09-24 21:51:56  adam
+ * New Z39.50 OID utilities: yaz_oidval_to_z3950oid, yaz_str_to_z3950oid
+ * and yaz_z3950oid_to_str.
+ *
+ * Revision 1.13  2001/05/09 23:31:35  adam
+ * String attribute values for PQF. Proper C-backslash escaping for PQF.
+ *
+ * Revision 1.12  2001/03/07 13:24:40  adam
+ * Member and_not in Z_Operator is kept for backwards compatibility.
+ * Added support for definition of CCL operators in field spec file.
+ *
+ * Revision 1.11  2001/02/21 13:46:54  adam
+ * C++ fixes.
+ *
+ * Revision 1.10  2001/02/20 11:23:50  adam
+ * Updated ccl_pquery to consider local attribute set too.
+ *
+ * Revision 1.9  2000/11/27 14:16:55  adam
  * Fixed bug in ccl_rpn_simple regarding resultSetId's.
  *
  * Revision 1.8  2000/11/16 13:03:13  adam
@@ -100,14 +116,8 @@ static Z_AttributesPlusTerm *ccl_rpn_term (ODR o, struct ccl_rpn_node *p)
 
                if (value != VAL_NONE)
                {
-                   int oid[OID_SIZE];
-                   struct oident ident;
-
-                   ident.oclass = CLASS_ATTSET;
-                   ident.proto = PROTO_Z3950;
-                   ident.value = value;
                    elements[i]->attributeSet =
-                       odr_oiddup (o, oid_ent_to_oid (&ident, oid));
+                       yaz_oidval_to_z3950oid(o, CLASS_ATTSET, value);
                }
            }
            elements[i]->which = Z_AttributeValue_numeric;
@@ -169,15 +179,15 @@ static Z_Complex *ccl_rpn_complex (ODR o, struct ccl_rpn_node *p)
     {
     case CCL_RPN_AND:
         zo->which = Z_Operator_and;
-        zo->u.and = odr_nullval();
+        zo->u.and_not = odr_nullval();
         break;
     case CCL_RPN_OR:
         zo->which = Z_Operator_or;
-        zo->u.and = odr_nullval();
+        zo->u.and_not = odr_nullval();
         break;
     case CCL_RPN_NOT:
         zo->which = Z_Operator_and_not;
-        zo->u.and = odr_nullval();
+        zo->u.and_not = odr_nullval();
         break;
     case CCL_RPN_PROX:
        zo->which = Z_Operator_prox;
@@ -199,7 +209,7 @@ static Z_Complex *ccl_rpn_complex (ODR o, struct ccl_rpn_node *p)
        *zo->u.prox->relationType = Z_ProximityOperator_Prox_lessThan;
        zo->u.prox->which = Z_ProximityOperator_known;
        zo->u.prox->u.known = 
-           odr_malloc (o, sizeof(*zo->u.prox->u.known));
+           (Z_ProxUnit *) odr_malloc (o, sizeof(*zo->u.prox->u.known));
        *zo->u.prox->u.known = Z_ProxUnit_word;
 #else
        *zo->u.prox->relationType = Z_Prox_lessThan;
@@ -244,15 +254,8 @@ static Z_RPNStructure *ccl_rpn_structure (ODR o, struct ccl_rpn_node *p)
 
 Z_RPNQuery *ccl_rpn_query (ODR o, struct ccl_rpn_node *p)
 {
-    Z_RPNQuery *zq;
-    oident bib1;
-    int oid[OID_SIZE];
-    bib1.proto = PROTO_Z3950;
-    bib1.oclass = CLASS_ATTSET;
-    bib1.value = VAL_BIB1;
-
-    zq = (Z_RPNQuery *)odr_malloc (o, sizeof(*zq));
-    zq->attributeSetId = odr_oiddup (o, oid_ent_to_oid (&bib1, oid));
+    Z_RPNQuery *zq = (Z_RPNQuery *)odr_malloc (o, sizeof(*zq));
+    zq->attributeSetId = yaz_oidval_to_z3950oid (o, CLASS_ATTSET, VAL_BIB1);
     zq->RPNStructure = ccl_rpn_structure (o, p);
     return zq;
 }
@@ -290,6 +293,7 @@ static void ccl_pquery_complex (WRBUF w, struct ccl_rpn_node *p)
 void ccl_pquery (WRBUF w, struct ccl_rpn_node *p)
 {
     struct ccl_rpn_attr *att;
+    const char *cp;
 
     switch (p->kind)
     {
@@ -308,12 +312,22 @@ void ccl_pquery (WRBUF w, struct ccl_rpn_node *p)
        for (att = p->u.t.attr_list; att; att = att->next)
        {
            char tmpattr[128];
-           sprintf(tmpattr, "@attr %d=%d ", att->type, att->value);
+           wrbuf_puts (w, "@attr ");
+           if (att->set)
+           {
+               wrbuf_puts (w, att->set);
+               wrbuf_puts (w, " ");
+           }
+           sprintf(tmpattr, "%d=%d ", att->type, att->value);
            wrbuf_puts (w, tmpattr);
        }
-       wrbuf_puts (w, "{");
-       wrbuf_puts (w, p->u.t.term);
-       wrbuf_puts (w, "} ");
+       for (cp = p->u.t.term; *cp; cp++)
+       {
+           if (*cp == ' ' || *cp == '\\')
+               wrbuf_putc (w, '\\');
+           wrbuf_putc (w, *cp);
+       }
+       wrbuf_puts (w, " ");
        break;
     }
 }