-const char *find_field(const char *rec, const char *field)
-{
- char lbuf[5];
- char *line;
-
- lbuf[0] = '\n';
- strcpy(lbuf + 1, field);
-
- if ((line = strstr(rec, lbuf)))
- return ++line;
- else
- return 0;
-}
-
-const char *find_subfield(const char *field, char subfield)
-{
- const char *p = field;
-
- while (*p && *p != '\n')
- {
- while (*p != '\n' && *p != '\t')
- p++;
- if (*p == '\t' && *(++p) == subfield) {
- if (*(++p) == ' ')
- {
- while (isspace(*p))
- p++;
- return p;
- }
- }
- }
- return 0;
-}
-
-// Extract 245 $a $b 100 $a
-char *extract_title(struct session *s, const char *rec)
-{
- const char *field, *subfield;
- char *e, *ef;
- unsigned char *obuf, *p;
-
- wrbuf_rewind(s->wrbuf);
-
- if (!(field = find_field(rec, "245")))
- return 0;
- if (!(subfield = find_subfield(field, 'a')))
- return 0;
- ef = index(subfield, '\n');
- if ((e = index(subfield, '\t')) && e < ef)
- ef = e;
- if (ef)
- {
- wrbuf_write(s->wrbuf, subfield, ef - subfield);
- if ((subfield = find_subfield(field, 'b')))
- {
- ef = index(subfield, '\n');
- if ((e = index(subfield, '\t')) && e < ef)
- ef = e;
- if (ef)
- {
- wrbuf_putc(s->wrbuf, ' ');
- wrbuf_write(s->wrbuf, subfield, ef - subfield);
- }
- }
- }
- if ((field = find_field(rec, "100")))
- {
- if ((subfield = find_subfield(field, 'a')))
- {
- ef = index(subfield, '\n');
- if ((e = index(subfield, '\t')) && e < ef)
- ef = e;
- if (ef)
- {
- wrbuf_puts(s->wrbuf, ", by ");
- wrbuf_write(s->wrbuf, subfield, ef - subfield);
- }
- }
- }
- wrbuf_putc(s->wrbuf, '\0');
- obuf = (unsigned char*) nmem_strdup(s->nmem, wrbuf_buf(s->wrbuf));
- for (p = obuf; *p; p++)
- if (*p == '&' || *p == '<' || *p > 122 || *p < ' ')
- *p = ' ';
- return (char*) obuf;
-}
-
-// Extract 245 $a $b 100 $a
-char *extract_mergekey(struct session *s, const char *rec)