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)"); }
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, ' '); }
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; }
/* 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); }
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; }
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, ' '); } }
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, "\" "); } }
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); } } }
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; }
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; }
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; }
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; }
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; }
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; }