- while (1)
- {
- if (filter_ptr + 4096 >= filter_size)
- {
- char *nb;
-
- filter_size = 2*filter_size + 8192;
- nb = (char *) xmalloc (filter_size);
- if (filter_buf)
- {
- memcpy (nb, filter_buf, filter_ptr);
- xfree (filter_buf);
- }
- filter_buf = nb;
- }
- if (make_header && filter_ptr == 0)
- {
- if (p->score >= 0)
- {
- sprintf (filter_buf, "Rank: %d\n", p->score);
- filter_ptr = strlen(filter_buf);
- }
- sprintf (filter_buf + filter_ptr, "Local Number: " ZINT_FORMAT "\n",
- p->localno);
- filter_ptr = strlen(filter_buf);
- if (p->fname)
- {
- sprintf (filter_buf + filter_ptr, "Filename: %s\n", p->fname);
- filter_ptr = strlen(filter_buf);
- }
- strcpy(filter_buf+filter_ptr++, "\n");
- }
- if (!make_body)
- break;
- r = (*p->readf)(p->fh, filter_buf + filter_ptr, 4096);
- if (r <= 0)
- break;
- filter_ptr += r;
- }
- filter_buf[filter_ptr] = '\0';
- if (elementSetName)
- {
- if (!strcmp (elementSetName, "B"))
- no_lines = 4;
- if (!strcmp (elementSetName, "M"))
- no_lines = 20;
- }
- if (no_lines)
- {
- char *p = filter_buf;
- int i = 0;
-
- while (++i <= no_lines && (p = strchr (p, '\n')))
- p++;
- if (p)
- {
- p[1] = '\0';
- filter_ptr = p-filter_buf;
- }
- }
- p->output_format = VAL_SUTRS;
- p->rec_buf = filter_buf;
- p->rec_len = filter_ptr;
+ if (text_mode)
+ wrbuf_printf(wrbuf, "\'");
+ else
+ wrbuf_printf(wrbuf, "</snippet>\n");
+
+ xml_doc_str = odr_strdup(p->odr, wrbuf_buf(wrbuf));
+
+ zebra_snippets_destroy(res);
+ wrbuf_free(wrbuf, 1);
+ return xml_doc_str;
+}
+
+static int filter_retrieve (void *clientData, struct recRetrieveCtrl *p)
+{
+ const char *esn = zebra_xslt_ns;
+ const char *params[20];
+ struct filter_info *tinfo = clientData;
+ xmlDocPtr resDoc;
+ xmlDocPtr doc;
+ struct filter_schema *schema;
+ int window_size = -1;
+
+ if (p->comp)
+ {
+ if (p->comp->which == Z_RecordComp_simple
+ && p->comp->u.simple->which == Z_ElementSetNames_generic)
+ {
+ esn = p->comp->u.simple->u.generic;
+ }
+ else if (p->comp->which == Z_RecordComp_complex
+ && p->comp->u.complex->generic->elementSpec
+ && p->comp->u.complex->generic->elementSpec->which ==
+ Z_ElementSpec_elementSetName)
+ {
+ esn = p->comp->u.complex->generic->elementSpec->u.elementSetName;
+ }
+ }
+ schema = lookup_schema(tinfo, esn);
+ if (!schema)
+ {
+ p->diagnostic =
+ YAZ_BIB1_SPECIFIED_ELEMENT_SET_NAME_NOT_VALID_FOR_SPECIFIED_;
+ return 0;
+ }
+
+ if (schema->include_snippet)
+ window_size = atoi(schema->include_snippet);
+
+ params[0] = 0;
+ set_param_str(params, "schema", esn, p->odr);
+ if (p->fname)
+ set_param_str(params, "filename", p->fname, p->odr);
+ if (p->score >= 0)
+ set_param_int(params, "score", p->score, p->odr);
+ set_param_int(params, "size", p->recordSize, p->odr);
+ set_param_int(params, "id", p->localno, p->odr);
+
+ if (window_size >= 0)
+ set_param_xml(params, "snippet", snippet_doc(p, 1, window_size),
+ p->odr);
+ doc = xmlReadIO(ioread_ret, ioclose_ret, p /* I/O handler */,
+ 0 /* URL */,
+ 0 /* encoding */,
+ XML_PARSE_XINCLUDE);
+ if (!doc)
+ {
+ p->diagnostic = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS;
+ return 0;
+ }
+
+ if (window_size >= 0)
+ {
+ xmlNodePtr node = xmlDocGetRootElement(doc);
+ const char *snippet_str = snippet_doc(p, 0, window_size);
+ xmlDocPtr snippet_doc = xmlParseMemory(snippet_str, strlen(snippet_str));
+ xmlAddChild(node, xmlDocGetRootElement(snippet_doc));
+ }
+ if (!schema->stylesheet_xsp)
+ resDoc = doc;
+ else
+ {
+ resDoc = xsltApplyStylesheet(schema->stylesheet_xsp,
+ doc, params);
+ xmlFreeDoc(doc);
+ }
+ if (!resDoc)
+ {
+ p->diagnostic = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS;
+ }
+ else if (p->input_format == VAL_NONE || p->input_format == VAL_TEXT_XML)
+ {
+ xmlChar *buf_out;
+ int len_out;
+ xmlDocDumpMemory(resDoc, &buf_out, &len_out);
+
+ p->output_format = VAL_TEXT_XML;
+ p->rec_len = len_out;
+ p->rec_buf = odr_malloc(p->odr, p->rec_len);
+ memcpy(p->rec_buf, buf_out, p->rec_len);
+
+ xmlFree(buf_out);
+ }
+ else if (p->output_format == VAL_SUTRS)
+ {
+ xmlChar *buf_out;
+ int len_out;
+ xmlDocDumpMemory(resDoc, &buf_out, &len_out);
+
+ p->output_format = VAL_SUTRS;
+ p->rec_len = len_out;
+ p->rec_buf = odr_malloc(p->odr, p->rec_len);
+ memcpy(p->rec_buf, buf_out, p->rec_len);
+
+ xmlFree(buf_out);
+ }
+ else
+ {
+ p->diagnostic = YAZ_BIB1_RECORD_SYNTAX_UNSUPP;
+ }
+ xmlFreeDoc(resDoc);