regx filter works with non-absyn
[idzebra-moved-to-github.git] / recctrl / recgrs.c
index 7413384..5974888 100644 (file)
@@ -3,7 +3,13 @@
  * All rights reserved.
  *
  * $Log: recgrs.c,v $
- * Revision 1.44  2002-04-11 20:09:47  adam
+ * Revision 1.46  2002-04-13 18:16:43  adam
+ * More XPATH work; common sequence numbers for extract keys
+ *
+ * Revision 1.45  2002/04/12 14:40:42  adam
+ * Work on XPATH
+ *
+ * Revision 1.44  2002/04/11 20:09:47  adam
  * work on string tag indexing
  *
  * Revision 1.43  2002/03/21 23:06:36  adam
@@ -324,20 +330,22 @@ static void grs_destroy(void *clientData)
     free (h);
 }
 
-static void index_string_tag (data1_node *n,
-                              struct recExtractCtrl *p,
-                              int level, RecWord *wrd,
-                              int use)
+static void index_xpath (data1_node *n, struct recExtractCtrl *p,
+                         int level, RecWord *wrd, int use)
 {
     int i;
+    char tag_path_full[1024];
+    size_t flen = 0;
+    data1_node *nn;
+
     switch (n->which)
     {
     case DATA1N_data:
         wrd->reg_type = 'w';
         wrd->string = n->u.data.data;
         wrd->length = n->u.data.len;
-        wrd->attrSet = VAL_BIB1;
-        wrd->attrUse = 1016;
+        wrd->attrSet = VAL_IDXPATH,
+        wrd->attrUse = use;
         if (p->flagShowRecords)
         {
             printf("%*s data=", (level + 1) * 4, "");
@@ -351,16 +359,40 @@ static void index_string_tag (data1_node *n,
         }
         break;
     case DATA1N_tag:
-        wrd->reg_type = 'w';
-        wrd->string = n->u.tag.tag;
-        wrd->length = strlen(n->u.tag.tag);
-        wrd->attrSet = VAL_BIB1;
+        for (nn = n; nn; nn = nn->parent)
+        {
+            if (n->which == DATA1N_tag)
+            {
+                size_t tlen = strlen(nn->u.tag.tag);
+                if (tlen + flen > (sizeof(tag_path_full)-2))
+                    return;
+                memcpy (tag_path_full + flen, nn->u.tag.tag, tlen);
+                flen += tlen;
+                tag_path_full[flen++] = '/';
+            }
+            else if (n->which == DATA1N_root)
+            {
+                size_t tlen = strlen(nn->u.root.type);
+                if (tlen + flen > (sizeof(tag_path_full)-2))
+                    return;
+                memcpy (tag_path_full + flen, nn->u.root.type, tlen);
+                flen += tlen;
+                tag_path_full[flen++] = '/';
+                break;
+            }
+        }
+        wrd->reg_type = '0';
+        wrd->string = tag_path_full;
+        wrd->length = flen;
+        wrd->attrSet = VAL_IDXPATH,
         wrd->attrUse = use;
         if (p->flagShowRecords)
         {
             printf("%*s tag=", (level + 1) * 4, "");
-            for (i = 0; i<wrd->length && i < 8; i++)
+            for (i = 0; i<wrd->length && i < 40; i++)
                 fputc (wrd->string[i], stdout);
+            if (i == 40)
+                printf (" ..");
             printf("\n");
         }
         else
@@ -448,10 +480,9 @@ static void index_termlist (data1_node *par, data1_node *n,
     }
 }
 
-static int dumpkeys(data1_node *n, struct recExtractCtrl *p, int level)
+static int dumpkeys(data1_node *n, struct recExtractCtrl *p, int level,
+                    RecWord *wrd)
 {
-    RecWord wrd;
-    (*p->init)(p, &wrd);      /* set defaults */
     for (; n; n = n->next)
     {
        if (p->flagShowRecords) /* display element description to user */
@@ -493,14 +524,14 @@ static int dumpkeys(data1_node *n, struct recExtractCtrl *p, int level)
 
        if (n->which == DATA1N_tag)
        {
-            index_termlist (n, n, p, level, &wrd);
+            index_termlist (n, n, p, level, wrd);
             /* index start tag */
             if (!n->root->u.root.absyn)
-                index_string_tag (n, p, level, &wrd, 1);
+                index_xpath (n, p, level, wrd, 1);
        }
 
        if (n->child)
-           if (dumpkeys(n->child, p, level + 1) < 0)
+           if (dumpkeys(n->child, p, level + 1, wrd) < 0)
                return -1;
 
 
@@ -522,9 +553,9 @@ static int dumpkeys(data1_node *n, struct recExtractCtrl *p, int level)
            }
 
            if (par)
-               index_termlist (par, n, p, level, &wrd);
+               index_termlist (par, n, p, level, wrd);
             if (!n->root->u.root.absyn)
-                index_string_tag (n, p, level, &wrd, 1016);
+                index_xpath (n, p, level, wrd, 1016);
 
        }
 
@@ -532,7 +563,7 @@ static int dumpkeys(data1_node *n, struct recExtractCtrl *p, int level)
        {
             /* index end tag */
             if (!n->root->u.root.absyn)
-                index_string_tag (n, p, level, &wrd, 2);
+                index_xpath (n, p, level, wrd, 2);
        }
 
 
@@ -548,6 +579,7 @@ int grs_extract_tree(struct recExtractCtrl *p, data1_node *n)
 {
     oident oe;
     int oidtmp[OID_SIZE];
+    RecWord wrd;
 
     oe.proto = PROTO_Z3950;
     oe.oclass = CLASS_SCHEMA;
@@ -558,7 +590,8 @@ int grs_extract_tree(struct recExtractCtrl *p, data1_node *n)
         if ((oid_ent_to_oid (&oe, oidtmp)))
             (*p->schemaAdd)(p, oidtmp);
     }
-    return dumpkeys(n, p, 0);
+    (*p->init)(p, &wrd);
+    return dumpkeys(n, p, 0, &wrd);
 }
 
 static int grs_extract_sub(struct grs_handlers *h, struct recExtractCtrl *p,
@@ -568,6 +601,7 @@ static int grs_extract_sub(struct grs_handlers *h, struct recExtractCtrl *p,
     struct grs_read_info gri;
     oident oe;
     int oidtmp[OID_SIZE];
+    RecWord wrd;
 
     gri.readf = p->readf;
     gri.seekf = p->seekf;
@@ -597,7 +631,8 @@ static int grs_extract_sub(struct grs_handlers *h, struct recExtractCtrl *p,
 #if 0
     data1_pr_tree (p->dh, n, stdout);
 #endif
-    if (dumpkeys(n, p, 0) < 0)
+    (*p->init)(p, &wrd);
+    if (dumpkeys(n, p, 0, &wrd) < 0)
     {
        data1_free_tree(p->dh, n);
        return RECCTRL_EXTRACT_ERROR;