+ case DATA1N_data:
+ wrd->term_buf = n->u.data.data;
+ wrd->term_len = n->u.data.len;
+ xpdone = 0;
+
+ mk_tag_path_full(tag_path_full, sizeof(tag_path_full), n);
+
+ /* If we have a matching termlist... */
+ if (n->root->u.root.absyn &&
+ (tl = xpath_termlist_by_tagpath(tag_path_full, n)))
+ {
+ for (; tl; tl = tl->next)
+ {
+ /* need to copy recword because it may be changed */
+ RecWord wrd_tl;
+ wrd->index_type = *tl->structure;
+ memcpy (&wrd_tl, wrd, sizeof(*wrd));
+ if (tl->source)
+ sp_parse(sp, n, &wrd_tl, tl->source);
+ if (!tl->index_name)
+ {
+ /* this is the ! case, so structure is for the xpath index */
+ wrd_tl.index_name = xpath_index;
+ if (p->flagShowRecords)
+ {
+ int i;
+ printf("%*sXPath index", (level + 1) * 4, "");
+ printf (" XData:\"");
+ for (i = 0; i<wrd_tl.term_len && i < 40; i++)
+ fputc (wrd_tl.term_buf[i], stdout);
+ fputc ('"', stdout);
+ if (wrd_tl.term_len > 40)
+ printf (" ...");
+ fputc ('\n', stdout);
+ }
+ else
+ (*p->tokenAdd)(&wrd_tl);
+ xpdone = 1;
+ } else {
+ /* this is just the old fashioned attribute based index */
+ wrd_tl.index_name = tl->index_name;
+ if (p->flagShowRecords)
+ {
+ int i;
+ printf("%*sIdx: [%s]", (level + 1) * 4, "",
+ tl->structure);
+ printf("%s %s", tl->index_name, tl->source);
+ printf (" XData:\"");
+ for (i = 0; i<wrd_tl.term_len && i < 40; i++)
+ fputc (wrd_tl.term_buf[i], stdout);
+ fputc ('"', stdout);
+ if (wrd_tl.term_len > 40)
+ printf (" ...");
+ fputc ('\n', stdout);
+ }
+ else
+ (*p->tokenAdd)(&wrd_tl);
+ }
+ }
+ }
+ /* xpath indexing is done, if there was no termlist given,
+ or no ! in the termlist, and default indexing is enabled... */
+ if (!p->flagShowRecords && !xpdone && !termlist_only)
+ {
+ wrd->index_name = xpath_index;
+ wrd->index_type = 'w';
+ (*p->tokenAdd)(wrd);
+ }
+ break;
+ case DATA1N_tag:
+ mk_tag_path_full(tag_path_full, sizeof(tag_path_full), n);
+
+ wrd->index_type = '0';
+ wrd->term_buf = tag_path_full;
+ wrd->term_len = strlen(tag_path_full);
+ wrd->index_name = xpath_index;
+ if (p->flagShowRecords)
+ {
+ printf("%*s tag=", (level + 1) * 4, "");
+ for (i = 0; i<wrd->term_len && i < 40; i++)
+ fputc (wrd->term_buf[i], stdout);
+ if (i == 40)
+ printf (" ..");
+ printf("\n");
+ }
+ else
+ {
+ data1_xattr *xp;
+ data1_termlist *tl;
+ int do_xpindex;
+
+ /* Add tag start/end xpath index, only when there is a ! in
+ the apropriate xelm directive, or default xpath indexing
+ is enabled
+ */
+ if (!(do_xpindex = 1 - termlist_only))
+ {
+ if ((tl = xpath_termlist_by_tagpath(tag_path_full, n)))
+ {
+ for (; tl; tl = tl->next)
+ {
+ if (!tl->index_name)
+ do_xpindex = 1;
+ }
+ }
+ }
+ if (do_xpindex) {
+ (*p->tokenAdd)(wrd); /* index element pag (AKA tag path) */
+ }
+
+ if (xpath_is_start == 1) /* only for the starting tag... */
+ {
+#define MAX_ATTR_COUNT 50
+ data1_termlist *tll[MAX_ATTR_COUNT];
+
+ int i = 0;
+
+ /* get termlists for attributes, and find out, if we have to do xpath indexing */
+ for (xp = n->u.tag.attributes; xp; xp = xp->next) {
+ i++;
+ }
+
+ i = 0;
+ for (xp = n->u.tag.attributes; xp; xp = xp->next) {
+ char comb[512];
+ int do_xpindex = 1 - termlist_only;
+ data1_termlist *tl;
+ char attr_tag_path_full[1024];
+
+ /* this could be cached as well */
+ sprintf (attr_tag_path_full, "@%s/%s",
+ xp->name, tag_path_full);
+
+ tll[i] = xpath_termlist_by_tagpath(attr_tag_path_full,n);
+
+ /* if there is a ! in the xelm termlist, or default indexing is on,
+ proceed with xpath idx */
+ if ((tl = tll[i]))
+ {
+ for (; tl; tl = tl->next)
+ {
+ if (!tl->index_name)
+ do_xpindex = 1;
+ }
+ }
+
+ if (do_xpindex) {
+
+ /* attribute (no value) */
+ wrd->index_type = '0';
+ wrd->index_name = ZEBRA_XPATH_ATTR_NAME;
+ wrd->term_buf = xp->name;
+ wrd->term_len = strlen(xp->name);
+
+ wrd->seqno--;
+ (*p->tokenAdd)(wrd);
+
+ if (xp->value &&
+ strlen(xp->name) + strlen(xp->value) < sizeof(comb)-2) {
+
+ /* attribute value exact */
+ strcpy (comb, xp->name);
+ strcat (comb, "=");
+ strcat (comb, xp->value);
+
+ wrd->index_name = ZEBRA_XPATH_ATTR_NAME;
+ wrd->index_type = '0';
+ wrd->term_buf = comb;
+ wrd->term_len = strlen(comb);
+ wrd->seqno--;
+
+ (*p->tokenAdd)(wrd);
+ }
+ }
+ i++;
+ }
+
+ i = 0;
+ for (xp = n->u.tag.attributes; xp; xp = xp->next) {
+ data1_termlist *tl;
+ char attr_tag_path_full[1024];
+ int xpdone = 0;
+
+ sprintf (attr_tag_path_full, "@%s/%s",
+ xp->name, tag_path_full);
+
+ if ((tl = tll[i]))
+ {
+ /* If there is a termlist given (=xelm directive) */
+ for (; tl; tl = tl->next)
+ {
+ if (!tl->index_name)
+ {
+ /* add xpath index for the attribute */
+ index_xpath_attr (attr_tag_path_full, xp->name,
+ xp->value, tl->structure,
+ p, wrd);
+ xpdone = 1;
+ } else {
+ /* index attribute value (only path/@attr) */
+ if (xp->value)
+ {
+ wrd->index_name = tl->index_name;
+ wrd->index_type = *tl->structure;
+ wrd->term_buf = xp->value;
+ wrd->term_len = strlen(xp->value);
+ (*p->tokenAdd)(wrd);
+ }
+ }
+ }
+ }
+ /* if there was no termlist for the given path,
+ or the termlist didn't have a ! element, index
+ the attribute as "w" */
+ if ((!xpdone) && (!termlist_only))
+ {
+ index_xpath_attr (attr_tag_path_full, xp->name,
+ xp->value, "w", p, wrd);
+ }
+ i++;
+ }
+ }
+ }