+ /* *ostrich*
+ New code to support xelm directive
+ for each xelm a dfa is built. xelms are stored in res->xp_elements
+
+ maybe we should use a simple sscanf instead of dfa?
+
+ pop, 2002-12-13
+
+ Now [] predicates are supported. regexps and xpath structure is
+ a bit redundant, however it's comfortable later...
+
+ pop, 2003-01-17
+ */
+
+ else if (!strcmp(cmd, "xelm") || !strcmp(cmd, "melm")) {
+
+ int i;
+ char *p, *xpath_expr, *termlists;
+ const char *regexp;
+ struct DFA *dfa = dfa = dfa_init();
+ data1_termlist **tp;
+ char melm_xpath[128];
+
+ if (argc < 3)
+ {
+ yaz_log(YLOG_WARN, "%s:%d: Bad # of args to xelm", file, lineno);
+ continue;
+ }
+
+ if (!strcmp(cmd, "melm")) {
+ if (melm2xpath(argv[1], melm_xpath) < 0)
+ continue;
+ xpath_expr = melm_xpath;
+ } else {
+ xpath_expr = argv[1];
+ }
+ termlists = argv[2];
+ regexp = mk_xpath_regexp(dh, xpath_expr);
+ i = dfa_parse (dfa, ®exp);
+ if (i || *regexp) {
+ yaz_log(YLOG_WARN, "%s:%d: Bad xpath to xelm", file, lineno);
+ dfa_delete (&dfa);
+ continue;
+ }
+
+ if (!cur_xpelement)
+ {
+ cur_xpelement = (data1_xpelement *)
+ nmem_malloc(data1_nmem_get(dh), sizeof(*cur_xpelement));
+ res->xp_elements = cur_xpelement;
+ } else {
+ cur_xpelement->next = (data1_xpelement *)
+ nmem_malloc(data1_nmem_get(dh), sizeof(*cur_xpelement));
+ cur_xpelement = cur_xpelement->next;
+ }
+ cur_xpelement->next = NULL;
+ cur_xpelement->xpath_expr = nmem_strdup(data1_nmem_get (dh),
+ xpath_expr);
+
+ dfa_mkstate (dfa);
+ cur_xpelement->dfa = dfa;
+
+#ifdef ENHANCED_XELM
+ cur_xpelement->xpath_len =
+ zebra_parse_xpath_str(xpath_expr,
+ cur_xpelement->xpath, XPATH_STEP_COUNT,
+ data1_nmem_get(dh));
+
+ /*
+ dump_xp_steps(cur_xpelement->xpath,cur_xpelement->xpath_len);
+ */
+#endif
+ cur_xpelement->termlists = 0;
+ tp = &cur_xpelement->termlists;
+
+ /* parse termList definitions */
+ p = termlists;
+ if (*p != '-')
+ {
+ assert (res->attset);
+
+ if (parse_termlists (dh, &tp, p, file, lineno,
+ xpath_expr, res, 1))
+ {
+ fclose (f);
+ return 0;
+ }
+ *tp = all; /* append any ALL entries to the list */
+ }
+ }