- 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);
- */
+
+#if OPTIMIZE_MELM
+ /* get last of existing regulars with same regexp */
+ for (xp_ele = res->xp_elements; xp_ele; xp_ele = xp_ele->next)
+ if (!strcmp(xp_ele->regexp, regexp))
+ last_match = xp_ele;
+#endif
+ if (!last_match)
+ {
+ /* new regular expression . Parse + generate */
+ const char *regexp_ptr = regexp;
+
+ dfa = dfa_init();
+ i = dfa_parse (dfa, ®exp_ptr);
+ if (i || *regexp_ptr) {
+ yaz_log(YLOG_WARN, "%s:%d: Bad xpath to xelm", file, lineno);
+ dfa_delete (&dfa);
+ continue;
+ }
+ }
+ *cur_xpelement = (data1_xpelement *)
+ nmem_malloc(data1_nmem_get(dh), sizeof(**cur_xpelement));
+ (*cur_xpelement)->next = 0;
+ (*cur_xpelement)->match_next = 0;
+ if (last_match)
+ last_match->match_next = *cur_xpelement;
+#if OPTIMIZE_MELM
+ (*cur_xpelement)->regexp = regexp;
+#endif
+ (*cur_xpelement)->xpath_expr = nmem_strdup(data1_nmem_get (dh),
+ xpath_expr);
+
+ if (dfa)
+ 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));