Example #1
0
static void yaz_rpnstructure_to_wrbuf(WRBUF b, const Z_RPNStructure *zs)
{
    if (zs->which == Z_RPNStructure_complex)
    {
        Z_Operator *op = zs->u.complex->roperator;
        wrbuf_printf(b, "@%s ", complex_op_name(op) );
        if (op->which== Z_Operator_prox)
        {
            if (!op->u.prox->exclusion)
                wrbuf_putc(b, 'n');
            else if (*op->u.prox->exclusion)
                wrbuf_putc(b, '1');
            else
                wrbuf_putc(b, '0');

            wrbuf_printf(b, " " ODR_INT_PRINTF " %d "
                         ODR_INT_PRINTF " ", *op->u.prox->distance,
                         *op->u.prox->ordered,
                         *op->u.prox->relationType);

            switch(op->u.prox->which)
            {
            case Z_ProximityOperator_known:
                wrbuf_putc(b, 'k');
                break;
            case Z_ProximityOperator_private:
                wrbuf_putc(b, 'p');
                break;
            default:
                wrbuf_printf(b, "%d", op->u.prox->which);
            }
            if (op->u.prox->u.known)
                wrbuf_printf(b, " " ODR_INT_PRINTF " ", *op->u.prox->u.known);
            else
                wrbuf_printf(b, " 0 ");
        }
        yaz_rpnstructure_to_wrbuf(b,zs->u.complex->s1);
        yaz_rpnstructure_to_wrbuf(b,zs->u.complex->s2);
    }
    else if (zs->which == Z_RPNStructure_simple)
    {
        if (zs->u.simple->which == Z_Operand_APT)
            yaz_apt_to_wrbuf(b, zs->u.simple->u.attributesPlusTerm);
        else if (zs->u.simple->which == Z_Operand_resultSetId)
        {
            wrbuf_printf(b, "@set ");
            yaz_encode_pqf_term(b, zs->u.simple->u.resultSetId,
                                strlen(zs->u.simple->u.resultSetId));
        }
        else
            wrbuf_puts(b, "(unknown simple structure)");
    }
    else
        wrbuf_puts(b, "(unknown structure)");
}
Example #2
0
void yaz_encode_pqf_term(WRBUF b, const char *term, int len)
{
    int i;
    for (i = 0; i < len; i++)
        if (strchr(" \"{", term[i]))
            break;
    if (len > 0 && i == len)
    {
        if (term[0] == '@')
            wrbuf_putc(b, '\\');
        for (i = 0; i < len; i++)
        {
            if (term[i] == '\\')
                wrbuf_putc(b, '\\');
            wrbuf_putc(b, term[i]);
        }
    }
    else
    {
        wrbuf_putc(b, '"');
        for (i = 0; i < len; i++)
        {
            if (term[i] == '"' || term[i] == '\\')
                wrbuf_putc(b, '\\');
            wrbuf_putc(b, term[i]);
        }
        wrbuf_putc(b, '"');
    }
    wrbuf_putc(b, ' ');
}
Example #3
0
static int yaz_gets(int (*getbyte)(void *client_data),
                    void (*ungetbyte)(int b, void *client_data),
                    void *client_data,
                    WRBUF w)
{
    size_t sz = 0;
    int ch = getbyte(client_data);

    while (ch != '\0' && ch != '\r' && ch != '\n')
    {
        wrbuf_putc(w, ch);
        sz++;
        ch = getbyte(client_data);
    }
    if (ch == '\r')
    {
        ch = getbyte(client_data);
        if (ch != '\n' && ch != '\0')
            ungetbyte(ch, client_data);
    }
    else if (ch == '\n')
    {
        ch = getbyte(client_data);
        if (ch != '\r' && ch != '\0')
            ungetbyte(ch, client_data);
    }
    if (sz)
    {
        return 1;
    }
    return 0;
}
Example #4
0
/* original tokenizer with our tokenize interface, but we
   add +1 to ensure no '\0' are in our string (except for EOF)
*/
static const char *pp2_charset_token_a_to_z(pp2_charset_token_t prt)
{
    const char *cp = prt->cp;
    int c;

    /* skip white space */
    while (*cp && (c = raw_char(tolower(*(const unsigned char *)cp))) < 0)
        cp++;
    if (*cp == '\0')
    {
        prt->cp = cp;
        prt->last_cp = 0;
        return 0;
    }
    /* now read the term itself */

    prt->last_cp = cp;
    wrbuf_rewind(prt->norm_str);
    while (*cp && (c = raw_char(tolower(*cp))) >= 0)
    {
        wrbuf_putc(prt->norm_str, c);
        cp++;
    }
    prt->cp = cp;
    return wrbuf_cstr(prt->norm_str);
}
Example #5
0
int yaz_tok_move(yaz_tok_parse_t tp)
{
    yaz_tok_cfg_t t = tp->cfg;
    const char *cp;
    int ch = get_byte(tp);

    /* skip white space */
    while (ch && strchr(t->white_space, ch))
        ch = get_byte(tp);
    if (!ch)
        ch = YAZ_TOK_EOF;
    else if (strchr(t->comment, ch))
        ch = YAZ_TOK_EOF;
    else if ((cp = strchr(t->single_tokens, ch)))
        ch = *cp;  /* single token match */
    else if ((cp = strchr(t->quote_tokens_begin, ch)))
    {   /* quoted string */
        int end_ch = t->quote_tokens_end[cp - t->quote_tokens_begin];
        ch = get_byte(tp);
        wrbuf_rewind(tp->wr_string);
        while (ch && ch != end_ch)
            wrbuf_putc(tp->wr_string, ch);
        if (!ch)
            ch = YAZ_TOK_ERROR;
        else
            ch = YAZ_TOK_QSTRING;
    }
    else
    {  /* unquoted string */
        wrbuf_rewind(tp->wr_string);
        while (ch && !strchr(t->white_space, ch)
               && !strchr(t->single_tokens, ch)
               && !strchr(t->comment, ch))
        {
            wrbuf_putc(tp->wr_string, ch);
            ch = get_byte(tp);
        }
        unget_byte(tp, ch);
        ch = YAZ_TOK_STRING;
    }
    tp->look = ch;
    return ch;
}
Example #6
0
File: json.c Project: wschnrid/yaz
static void json_indent(WRBUF result, int indent)
{
    size_t l = wrbuf_len(result);
    if (l == 0 || wrbuf_buf(result)[l-1] == '\n')
    {
        int i;
        for (i = 0; i < indent; i++)
            wrbuf_putc(result, ' ');
    }
}
Example #7
0
void yaz_encode_pqf_term(WRBUF b, const char *term, int len)
{
    int i;
    for (i = 0; i < len; i++)
        if (strchr(" \"{", term[i]))
            break;
    if (i == len && i)
        wrbuf_printf(b, "%.*s ", len, term);
    else
    {
        wrbuf_putc(b, '"');
        for (i = 0; i<len; i++)
        {
            if (term[i] == '"')
                wrbuf_putc(b, '\\');
            wrbuf_putc(b, term[i]);
        }
        wrbuf_printf(b, "\" ");
    }
}
Example #8
0
static void write_metadata(WRBUF w, struct conf_service *service,
                           struct record_metadata **ml, int full, int indent)
{
    int imeta;

    for (imeta = 0; imeta < service->num_metadata; imeta++)
    {
        struct conf_metadata *cmd = &service->metadata[imeta];
        struct record_metadata *md;
        if (!cmd->brief && !full)
            continue;
        for (md = ml[imeta]; md; md = md->next)
        {
            struct record_metadata_attr *attr = md->attributes;
            int i;
            for (i = 0; i < indent; i++)
                wrbuf_putc(w, ' ');
            wrbuf_printf(w, "<md-%s", cmd->name);

            for (; attr; attr = attr->next)
            {
                wrbuf_printf(w, " %s=\"", attr->name);
                wrbuf_xmlputs(w, attr->value);
                wrbuf_puts(w, "\"");
            }
            wrbuf_puts(w, ">");
            switch (cmd->type)
            {
            case Metadata_type_generic:
                wrbuf_xmlputs(w, md->data.text.disp);
                break;
            case Metadata_type_year:
                wrbuf_printf(w, "%d", md->data.number.min);
                if (md->data.number.min != md->data.number.max)
                    wrbuf_printf(w, "-%d", md->data.number.max);
                break;
            default:
                wrbuf_puts(w, "[can't represent]");
                break;
            }
            wrbuf_printf(w, "</md-%s>\n", cmd->name);
        }
    }
}
Example #9
0
static int convert_solrmarc(void *info, WRBUF record, WRBUF wr_error)
{
    WRBUF w = wrbuf_alloc();
    const char *buf = wrbuf_buf(record);
    size_t i, sz = wrbuf_len(record);
    for (i = 0; i < sz; i++)
    {
        int ch;
        if (buf[i] == '#' && i < sz - 3 && buf[i+3] == ';'
            && atoi_n_check(buf+i+1, 2, &ch))
            i += 3;
        else
            ch = buf[i];
        wrbuf_putc(w, ch);
    }
    wrbuf_rewind(record);
    wrbuf_write(record, wrbuf_buf(w), wrbuf_len(w));
    wrbuf_destroy(w);
    return 0;
}
Example #10
0
File: json-parse.c Project: nla/yaz
static struct json_node *do_parse_from_stdin(void)
{
    FILE *f = stdin;
    WRBUF w = wrbuf_alloc();
    struct json_node *n;
    size_t pos;
    const char *json_str;
    const char *err_msg;
    int c;

    while ((c = getc(f)) != EOF)
        wrbuf_putc(w, c);
    json_str = wrbuf_cstr(w);
    n = json_parse2(json_str, &err_msg, &pos);
    if (!n)
    {
        fprintf(stderr, "JSON parse error: %s\nLeading text was:\n", err_msg);
        fwrite(json_str, 1, pos, stderr);
        fprintf(stderr, "^\n");
    }
    wrbuf_destroy(w);
    return n;
}
Example #11
0
int yaz_marc_write_iso2709(yaz_marc_t mt, WRBUF wr)
{
    struct yaz_marc_node *n;
    int indicator_length;
    int identifier_length;
    int length_data_entry;
    int length_starting;
    int length_implementation;
    int data_offset = 0;
    const char *leader = 0;
    WRBUF wr_dir, wr_head, wr_data_tmp;
    int base_address;

    for (n = mt->nodes; n; n = n->next)
        if (n->which == YAZ_MARC_LEADER)
            leader = n->u.leader;

    if (!leader)
        return -1;
    if (!atoi_n_check(leader+10, 1, &indicator_length))
        return -1;
    if (!atoi_n_check(leader+11, 1, &identifier_length))
        return -1;
    if (!atoi_n_check(leader+20, 1, &length_data_entry))
        return -1;
    if (!atoi_n_check(leader+21, 1, &length_starting))
        return -1;
    if (!atoi_n_check(leader+22, 1, &length_implementation))
        return -1;

    wr_data_tmp = wrbuf_alloc();
    wr_dir = wrbuf_alloc();
    for (n = mt->nodes; n; n = n->next)
    {
        int data_length = 0;
        struct yaz_marc_subfield *s;

        switch(n->which)
        {
        case YAZ_MARC_DATAFIELD:
            wrbuf_printf(wr_dir, "%.3s", n->u.datafield.tag);
            data_length += indicator_length;
            wrbuf_rewind(wr_data_tmp);
            for (s = n->u.datafield.subfields; s; s = s->next)
            {
                /* write dummy IDFS + content */
                wrbuf_iconv_putchar(wr_data_tmp, mt->iconv_cd, ' ');
                wrbuf_iconv_puts(wr_data_tmp, mt->iconv_cd, s->code_data);
                marc_iconv_reset(mt, wr_data_tmp);
            }
            /* write dummy FS (makes MARC-8 to become ASCII) */
            wrbuf_iconv_putchar(wr_data_tmp, mt->iconv_cd, ' ');
            marc_iconv_reset(mt, wr_data_tmp);
            data_length += wrbuf_len(wr_data_tmp);
            break;
        case YAZ_MARC_CONTROLFIELD:
            wrbuf_printf(wr_dir, "%.3s", n->u.controlfield.tag);

            wrbuf_rewind(wr_data_tmp);
            wrbuf_iconv_puts(wr_data_tmp, mt->iconv_cd,
                             n->u.controlfield.data);
            marc_iconv_reset(mt, wr_data_tmp);
            wrbuf_iconv_putchar(wr_data_tmp, mt->iconv_cd, ' ');/* field sep */
            marc_iconv_reset(mt, wr_data_tmp);
            data_length += wrbuf_len(wr_data_tmp);
            break;
        case YAZ_MARC_COMMENT:
            break;
        case YAZ_MARC_LEADER:
            break;
        }
        if (data_length)
        {
            wrbuf_printf(wr_dir, "%0*d", length_data_entry, data_length);
            wrbuf_printf(wr_dir, "%0*d", length_starting, data_offset);
            data_offset += data_length;
        }
    }
    /* mark end of directory */
    wrbuf_putc(wr_dir, ISO2709_FS);

    /* base address of data (comes after leader+directory) */
    base_address = 24 + wrbuf_len(wr_dir);

    wr_head = wrbuf_alloc();

    /* write record length */
    wrbuf_printf(wr_head, "%05d", base_address + data_offset + 1);
    /* from "original" leader */
    wrbuf_write(wr_head, leader+5, 7);
    /* base address of data */
    wrbuf_printf(wr_head, "%05d", base_address);
    /* from "original" leader */
    wrbuf_write(wr_head, leader+17, 7);

    wrbuf_write(wr, wrbuf_buf(wr_head), 24);
    wrbuf_write(wr, wrbuf_buf(wr_dir), wrbuf_len(wr_dir));
    wrbuf_destroy(wr_head);
    wrbuf_destroy(wr_dir);
    wrbuf_destroy(wr_data_tmp);

    for (n = mt->nodes; n; n = n->next)
    {
        struct yaz_marc_subfield *s;

        switch(n->which)
        {
        case YAZ_MARC_DATAFIELD:
            wrbuf_write(wr, n->u.datafield.indicator, indicator_length);
            for (s = n->u.datafield.subfields; s; s = s->next)
            {
                wrbuf_putc(wr, ISO2709_IDFS);
                wrbuf_iconv_puts(wr, mt->iconv_cd, s->code_data);
                marc_iconv_reset(mt, wr);
            }
            wrbuf_putc(wr, ISO2709_FS);
            break;
        case YAZ_MARC_CONTROLFIELD:
            wrbuf_iconv_puts(wr, mt->iconv_cd, n->u.controlfield.data);
            marc_iconv_reset(mt, wr);
            wrbuf_putc(wr, ISO2709_FS);
            break;
        case YAZ_MARC_COMMENT:
            break;
        case YAZ_MARC_LEADER:
            break;
        }
    }
    wrbuf_printf(wr, "%c", ISO2709_RS);
    return 0;
}
Example #12
0
static int emit_term(solr_transform_t ct, WRBUF w, Z_Term *term, Odr_int trunc)
{
    size_t lterm = 0;
    const char *sterm = 0;
    switch (term->which)
    {
    case Z_Term_general:
        lterm = term->u.general->len;
        sterm = (const char *) term->u.general->buf;
        break;
    case Z_Term_numeric:
        wrbuf_printf(w, ODR_INT_PRINTF, *term->u.numeric);
        break;
    case Z_Term_characterString:
        sterm = term->u.characterString;
        lterm = strlen(sterm);
        break;
    default:
        return YAZ_BIB1_TERM_TYPE_UNSUPP;
    }

    if (sterm)
    {
        size_t i;
        int must_quote = 0;

        for (i = 0 ; i < lterm; i++)
            if (sterm[i] == ' ')
                must_quote = 1;
        if (must_quote)
            wrbuf_puts(w, "\"");
        if (trunc == 2 || trunc == 3)
            wrbuf_puts(w, "*");
        for (i = 0 ; i < lterm; i++)
        {
            if (sterm[i] == '\\' && i < lterm - 1)
            {
                i++;
                if (strchr(SOLR_SPECIAL, sterm[i]))
                    wrbuf_putc(w, '\\');
                wrbuf_putc(w, sterm[i]);
            }
            else if (sterm[i] == '?' && trunc == 104)
            {
                wrbuf_putc(w, '*');
            }
            else if (sterm[i] == '#' && trunc == 104)
            {
                wrbuf_putc(w, '?');
            }
            else if (strchr(SOLR_SPECIAL, sterm[i]))
            {
                wrbuf_putc(w, '\\');
                wrbuf_putc(w, sterm[i]);
            }
            else
                wrbuf_putc(w, sterm[i]);
        }
        if (trunc == 1 || trunc == 3)
            wrbuf_puts(w, "*");
        if (must_quote)
            wrbuf_puts(w, "\"");
    }
    return 0;
}
Example #13
0
File: rpn2solr.c Project: nla/yaz
static int rpn2solr_simple(solr_transform_t ct,
                           void (*pr)(const char *buf, void *client_data),
                           void *client_data,
                           Z_Operand *q, WRBUF w)
{
    int ret = 0;
    if (q->which != Z_Operand_APT)
    {
        ret = -1;
        solr_transform_set_error(ct, YAZ_BIB1_RESULT_SET_UNSUPP_AS_A_SEARCH_TERM, 0);
    }
    else
    {
        Z_AttributesPlusTerm *apt = q->u.attributesPlusTerm;
        Z_Term *term = apt->term;
        const char *sterm = 0;
        size_t lterm = 0;
        Odr_int trunc = get_truncation(apt);

        wrbuf_rewind(w);
        ret = rpn2solr_attr(ct, apt->attributes, w);

        if (trunc == 0 || trunc == 1 || trunc == 100 || trunc == 104)
            ;
        else
        {
            solr_transform_set_error(ct, YAZ_BIB1_UNSUPP_TRUNCATION_ATTRIBUTE, 0);
            return -1;
        }
        switch (term->which)
        {
        case Z_Term_general:
            lterm = term->u.general->len;
            sterm = (const char *) term->u.general->buf;
            break;
        case Z_Term_numeric:
            wrbuf_printf(w, ODR_INT_PRINTF, *term->u.numeric);
            break;
        case Z_Term_characterString:
            sterm = term->u.characterString;
            lterm = strlen(sterm);
            break;
        default:
            ret = -1;
            solr_transform_set_error(ct, YAZ_BIB1_TERM_TYPE_UNSUPP, 0);
        }

        if (sterm)
        {
            size_t i;
            int must_quote = 0;

            for (i = 0 ; i < lterm; i++)
                if (sterm[i] == ' ')
                    must_quote = 1;
            if (must_quote)
                wrbuf_puts(w, "\"");
            for (i = 0 ; i < lterm; i++)
            {
                if (sterm[i] == '\\' && i < lterm - 1)
                {
                    i++;
                    if (strchr(SOLR_SPECIAL, sterm[i]))
                        wrbuf_putc(w, '\\');
                    wrbuf_putc(w, sterm[i]);
                }
                else if (sterm[i] == '?' && trunc == 104)
                {
                    wrbuf_putc(w, '*');
                }
                else if (sterm[i] == '#' && trunc == 104)
                {
                    wrbuf_putc(w, '?');
                }
                else if (strchr(SOLR_SPECIAL, sterm[i]))
                {
                    wrbuf_putc(w, '\\');
                    wrbuf_putc(w, sterm[i]);
                }
                else
                    wrbuf_putc(w, sterm[i]);
            }
            if (trunc == 1)
                wrbuf_puts(w, "*");
            if (must_quote)
                wrbuf_puts(w, "\"");
        }
        if (ret == 0)
            pr(wrbuf_cstr(w), client_data);
    }
    return ret;
}
Example #14
0
File: rpn2cql.c Project: nla/yaz
static int rpn2cql_simple(cql_transform_t ct,
                          void (*pr)(const char *buf, void *client_data),
                          void *client_data,
                          Z_Operand *q, WRBUF w)
{
    int ret = 0;
    if (q->which != Z_Operand_APT)
    {
        ret = -1;
        cql_transform_set_error(ct, YAZ_BIB1_RESULT_SET_UNSUPP_AS_A_SEARCH_TERM, 0);
    }
    else
    {
        Z_AttributesPlusTerm *apt = q->u.attributesPlusTerm;
        Z_Term *term = apt->term;
        const char *sterm = 0;
        size_t lterm = 0;
        Odr_int trunc = lookup_truncation(apt->attributes);
        size_t i;

        wrbuf_rewind(w);
        ret = rpn2cql_attr(ct, apt->attributes, w);

        switch (term->which)
        {
        case Z_Term_general:
            lterm = term->u.general->len;
            sterm = (const char *) term->u.general->buf;
            break;
        case Z_Term_numeric:
            wrbuf_printf(w, ODR_INT_PRINTF, *term->u.numeric);
            break;
        case Z_Term_characterString:
            sterm = term->u.characterString;
            lterm = strlen(sterm);
            break;
        default:
            cql_transform_set_error(ct, YAZ_BIB1_TERM_TYPE_UNSUPP, 0);
            return -1;
        }

        if (trunc <= 3 || trunc == 100 || trunc == 102 || trunc == 104)
        {
            int quote_it = 0;
            for (i = 0 ; i < lterm; i++)
                if (strchr(" ()=></", sterm[i]))
                {
                    quote_it = 1;
                    break;
                }
            if (lterm == 0)
                quote_it = 1;
            if (quote_it)
                wrbuf_puts(w, "\"");
            if (trunc == 2 || trunc == 3)
                wrbuf_puts(w, "*");
            for (i = 0; i < lterm; i++)
            {
                if (sterm[i] == '\\' && i < lterm - 1)
                {
                    i++;
                    if (strchr("*?\"\\", sterm[i]))
                        wrbuf_putc(w, '\\');
                    wrbuf_putc(w, sterm[i]);
                }
                else if (trunc == 102 && sterm[i] == '.' && sterm[i+1] == '*')
                {
                    wrbuf_putc(w, '*');
                    i++;
                }
                else if (trunc == 102 && sterm[i] == '.')
                    wrbuf_putc(w, '?');
                else if (trunc == 104 && sterm[i] == '?')
                    wrbuf_putc(w, '*');
                else if (trunc == 104 && sterm[i] == '#')
                    wrbuf_putc(w, '?');
                else if (strchr("*?\"", sterm[i]))
                {
                    wrbuf_putc(w, '\\');
                    wrbuf_putc(w, sterm[i]);
                }
                else
                    wrbuf_putc(w, sterm[i]);
            }
            if (trunc == 1 || trunc == 3)
                wrbuf_puts(w, "*");
            if (quote_it)
                wrbuf_puts(w, "\"");
        }
        else
        {
            cql_transform_set_error(
                ct, YAZ_BIB1_UNSUPP_TRUNCATION_ATTRIBUTE, 0);
            ret = -1;
        }
        if (ret == 0)
            pr(wrbuf_cstr(w), client_data);
    }
    return ret;
}