- inf = fopen(arg, "rb");
- count = 0;
- if (!inf)
- {
- fprintf (stderr, "%s: cannot open %s:%s\n",
- prog, arg, strerror (errno));
- exit(1);
- }
- if (cfile)
- fprintf (cfile, "char *marc_records[] = {\n");
- if (1)
- {
- yaz_marc_t mt = yaz_marc_create();
- yaz_iconv_t cd = 0;
- int marc_no = 0;
-
- if (from && to)
- {
- cd = yaz_iconv_open(to, from);
- if (!cd)
- {
- fprintf(stderr, "conversion from %s to %s "
- "unsupported\n", from, to);
- exit(2);
- }
- yaz_marc_iconv(mt, cd);
- }
- yaz_marc_xml(mt, xml);
- yaz_marc_debug(mt, verbose);
- for(;; marc_no++)
- {
- int len;
- char *result = 0;
- int rlen;
-
- r = fread (buf, 1, 5, inf);
- if (r < 5)
- {
- if (r && print_offset && verbose)
- printf ("<!-- Extra %d bytes at end of file -->\n", r);
- break;
- }
- while (*buf < '0' || *buf > '9')
- {
- int i;
- long off = ftell(inf) - 5;
- if (verbose || print_offset)
- printf("<!-- Skipping bad byte %d (0x%02X) at offset "
- "%ld (0x%lx) -->\n",
- *buf & 0xff, *buf & 0xff,
- off, off);
- for (i = 0; i<4; i++)
- buf[i] = buf[i+1];
- r = fread(buf+4, 1, 1, inf);
- if (r < 1)
- break;
- }
- if (r < 1)
- {
- if (verbose || print_offset)
- printf ("<!-- End of file with data -->\n");
- break;
- }
- if (print_offset)
- {
- long off = ftell(inf) - 5;
- printf ("<!-- Record %d offset %ld (0x%lx) -->\n",
- num, off, off);
- }
- len = atoi_n(buf, 5);
- if (len < 25 || len > 100000)
- {
- long off = ftell(inf) - 5;
- printf("Bad Length %d read at offset %ld (%lx)\n",
- len, (long) off, (long) off);
- break;
- }
- rlen = len - 5;
- r = fread (buf + 5, 1, rlen, inf);
- if (r < rlen)
- break;
- if (split_fname)
- {
- char fname[256];
- FILE *sf;
- sprintf(fname, "%.200s%07d", split_fname, marc_no);
- sf = fopen(fname, "wb");
- if (!sf)
- {
- fprintf(stderr, "Could not open %s\n", fname);
- split_fname = 0;
- }
- else
- {
- if (fwrite(buf, 1, len, sf) != len)
- {
- fprintf(stderr, "Could write content to %s\n",
- fname);
- split_fname = 0;
- }
- fclose(sf);
- }
- }
- r = yaz_marc_decode_buf (mt, buf, -1, &result, &rlen);
- if (result)
- fwrite (result, rlen, 1, stdout);
-#if HAVE_XML2
- if (r > 0 && libxml_dom_test)
- {
- xmlDocPtr doc = xmlParseMemory(result, rlen);
- if (!doc)
- fprintf(stderr, "xmLParseMemory failed\n");
- else
- {
- int i;
- xmlXPathContextPtr xpathCtx;
- xmlXPathObjectPtr xpathObj;
- static const char *xpathExpr[] = {
- "/record/datafield[@tag='245']/subfield[@code='a']",
- "/record/datafield[@tag='100']/subfield",
- "/record/datafield[@tag='245']/subfield[@code='a']",
- "/record/datafield[@tag='650']/subfield",
- "/record/datafield[@tag='650']",
- 0};
-
- xpathCtx = xmlXPathNewContext(doc);
-
- for (i = 0; xpathExpr[i]; i++) {
- xpathObj = xmlXPathEvalExpression(BAD_CAST xpathExpr[i], xpathCtx);
- if(xpathObj == NULL) {
- fprintf(stderr,"Error: unable to evaluate xpath expression \"%s\"\n", xpathExpr[i]);
- }
- else
- {
- print_xpath_nodes(xpathObj->nodesetval, stdout);
- xmlXPathFreeObject(xpathObj);
- }
- }
- xmlXPathFreeContext(xpathCtx);
- xmlFreeDoc(doc);
- }
- }
-#endif
- if (r > 0 && cfile)
- {
- char *p = buf;
- int i;
- if (count)
- fprintf (cfile, ",");
- fprintf (cfile, "\n");
- for (i = 0; i < r; i++)
- {
- if ((i & 15) == 0)
- fprintf (cfile, " \"");
- fprintf (cfile, "\\x%02X", p[i] & 255);
-
- if (i < r - 1 && (i & 15) == 15)
- fprintf (cfile, "\"\n");
-
- }
- fprintf (cfile, "\"\n");
- }
- num++;
- if (verbose)
- printf("\n");
- }
- count++;
- if (cd)
- yaz_iconv_close(cd);
- yaz_marc_destroy(mt);
- }
- if (cfile)
- fprintf (cfile, "};\n");
- fclose(inf);