Esempio n. 1
0
int yaz_marc_decode_wrbuf(yaz_marc_t mt, const char *buf, int bsize, WRBUF wr)
{
    int s, r = yaz_marc_read_iso2709(mt, buf, bsize);
    if (r <= 0)
        return r;
    s = yaz_marc_write_mode(mt, wr); /* returns 0 for OK, -1 otherwise */
    if (s != 0)
        return -1; /* error */
    return r; /* OK, return length > 0 */
}
Esempio n. 2
0
File: marcdump.c Progetto: nla/yaz
static void marcdump_read_line(yaz_marc_t mt, const char *fname)
{
    FILE *inf = fopen(fname, "rb");
    if (!inf)
    {
        fprintf(stderr, "%s: cannot open %s:%s\n",
                prog, fname, strerror(errno));
        exit(1);
    }

    while (yaz_marc_read_line(mt, getbyte_stream,
                              ungetbyte_stream, inf) == 0)
    {
        WRBUF wrbuf = wrbuf_alloc();
        yaz_marc_write_mode(mt, wrbuf);
        fputs(wrbuf_cstr(wrbuf), stdout);
        wrbuf_destroy(wrbuf);
    }
    fclose(inf);
}
Esempio n. 3
0
static int convert_marc(void *info, WRBUF record, WRBUF wr_error)
{
    struct marc_info *mi = info;
    const char *input_charset = mi->input_charset;
    int ret = 0;
    yaz_marc_t mt = yaz_marc_create();

    yaz_marc_xml(mt, mi->output_format_mode);
    if (mi->leader_spec)
        yaz_marc_leader_spec(mt, mi->leader_spec);

    if (mi->input_format_mode == YAZ_MARC_ISO2709)
    {
        int sz = yaz_marc_read_iso2709(mt, wrbuf_buf(record),
                                       wrbuf_len(record));
        if (sz > 0)
        {
            if (yaz_marc_check_marc21_coding(input_charset, wrbuf_buf(record),
                                             wrbuf_len(record)))
                input_charset = "utf-8";
            ret = 0;
        }
        else
            ret = -1;
    }
    else if (mi->input_format_mode == YAZ_MARC_MARCXML ||
             mi->input_format_mode == YAZ_MARC_TURBOMARC)
    {
        xmlDocPtr doc = xmlParseMemory(wrbuf_buf(record),
                                       wrbuf_len(record));
        if (!doc)
        {
            wrbuf_printf(wr_error, "xmlParseMemory failed");
            ret = -1;
        }
        else
        {
            ret = yaz_marc_read_xml(mt, xmlDocGetRootElement(doc));
            if (ret)
                wrbuf_printf(wr_error, "yaz_marc_read_xml failed");
        }
        xmlFreeDoc(doc);
    }
    else
    {
        wrbuf_printf(wr_error, "unsupported input format");
        ret = -1;
    }
    if (ret == 0)
    {
        yaz_iconv_t cd = yaz_iconv_open(mi->output_charset, input_charset);

        if (cd)
            yaz_marc_iconv(mt, cd);

        wrbuf_rewind(record);
        ret = yaz_marc_write_mode(mt, record);
        if (ret)
            wrbuf_printf(wr_error, "yaz_marc_write_mode failed");
        if (cd)
            yaz_iconv_close(cd);
    }
    yaz_marc_destroy(mt);
    return ret;
}
Esempio n. 4
0
File: marcdump.c Progetto: nla/yaz
static void marcdump_read_xml(yaz_marc_t mt, const char *fname)
{
    WRBUF wrbuf = wrbuf_alloc();
#if USE_XMLREADER
    xmlTextReaderPtr reader = xmlReaderForFile(fname, 0 /* encoding */,
                                               0 /* options */);

    if (reader)
    {
        int ret;
        while ((ret = xmlTextReaderRead(reader)) == 1)
        {
            int type = xmlTextReaderNodeType(reader);
            if (type == XML_READER_TYPE_ELEMENT)
            {
                const char *name = (const char *)
                    xmlTextReaderLocalName(reader);
                if (!strcmp(name, "record") || !strcmp(name, "r"))
                {
                    xmlNodePtr ptr = xmlTextReaderExpand(reader);

                    int r = yaz_marc_read_xml(mt, ptr);
                    if (r)
                    {
                        no_errors++;
                        fprintf(stderr, "yaz_marc_read_xml failed\n");
                    }
                    else
                    {
                        int write_rc = yaz_marc_write_mode(mt, wrbuf);
                        if (write_rc)
                        {
                            yaz_log(YLOG_WARN, "yaz_marc_write_mode: "
                                    "write error: %d", write_rc);
                            no_errors++;
                        }
                        fputs(wrbuf_cstr(wrbuf), stdout);
                        wrbuf_rewind(wrbuf);
                    }
                }
            }
        }
    }
#else
    xmlDocPtr doc = xmlParseFile(fname);
    if (doc)
    {
        xmlNodePtr ptr = xmlDocGetRootElement(doc);
        for (; ptr; ptr = ptr->next)
        {
            if (ptr->type == XML_ELEMENT_NODE)
            {
                if (!strcmp((const char *) ptr->name, "collection"))
                {
                    ptr = ptr->children;
                    continue;
                }
                if (!strcmp((const char *) ptr->name, "record") ||
                    !strcmp((const char *) ptr->name, "r"))
                {
                    int r = yaz_marc_read_xml(mt, ptr);
                    if (r)
                    {
                        no_errors++;
                        fprintf(stderr, "yaz_marc_read_xml failed\n");
                    }
                    else
                    {
                        yaz_marc_write_mode(mt, wrbuf);

                        fputs(wrbuf_cstr(wrbuf), stdout);
                        wrbuf_rewind(wrbuf);
                    }
                }
            }
        }
        xmlFreeDoc(doc);
    }
#endif
    fputs(wrbuf_cstr(wrbuf), stdout);
    wrbuf_destroy(wrbuf);
}