X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fquery-charset.c;h=a875f808ea3dfea206ae3b6e7ecb30aed1cf9322;hp=2861203c78e57a84954f81928189bde4ac468566;hb=5d493e5a4ce6300660debe3e2ad82c21592039ca;hpb=2788a4851b551e1a3efb320a2878b809f2d8a9d7 diff --git a/src/query-charset.c b/src/query-charset.c index 2861203..a875f80 100644 --- a/src/query-charset.c +++ b/src/query-charset.c @@ -13,10 +13,11 @@ #include #include -void yaz_query_charset_convert_buf(char *buf_in, int len_in, - char **buf_out, int *len_out, - ODR o, WRBUF wrbuf, yaz_iconv_t cd) +static int yaz_query_charset_convert_buf(char *buf_in, int len_in, + char **buf_out, int *len_out, + ODR o, WRBUF wrbuf, yaz_iconv_t cd) { + int r = 0; wrbuf_rewind(wrbuf); wrbuf_iconv_write(wrbuf, cd, buf_in, len_in); wrbuf_iconv_reset(wrbuf, cd); @@ -26,56 +27,78 @@ void yaz_query_charset_convert_buf(char *buf_in, int len_in, { /* we assume conversion failed */ *buf_out = buf_in; *len_out = len_in; + r = -1; } else { + /* conversion OK */ *buf_out = (char*) odr_malloc(o, *len_out); memcpy(*buf_out, wrbuf_buf(wrbuf), *len_out); } + return r; } -void yaz_query_charset_convert_term(Z_Term *q, - ODR o, WRBUF wrbuf, yaz_iconv_t cd) +static int yaz_query_charset_convert_term(Z_Term *q, + ODR o, WRBUF wrbuf, yaz_iconv_t cd) { + int r = 0; switch(q->which) { case Z_Term_general: - yaz_query_charset_convert_buf( + r = yaz_query_charset_convert_buf( (char *) q->u.general->buf, q->u.general->len, (char **) &q->u.general->buf, &q->u.general->len, o, wrbuf, cd); break; } + return r; } -void yaz_query_charset_convert_operand(Z_Operand *q, - ODR o, WRBUF wrbuf, yaz_iconv_t cd) +static int yaz_query_charset_convert_operand(Z_Operand *q, + ODR o, WRBUF wrbuf, yaz_iconv_t cd) { + int r = 0; switch(q->which) { case Z_Operand_APT: - yaz_query_charset_convert_term(q->u.attributesPlusTerm->term, - o, wrbuf, cd); + r = yaz_query_charset_convert_term(q->u.attributesPlusTerm->term, + o, wrbuf, cd); break; case Z_Operand_resultSetId: break; case Z_Operand_resultAttr: break; } + return r; } -void yaz_query_charset_convert_structure(Z_RPNStructure *q, - ODR o, WRBUF wrbuf, yaz_iconv_t cd) +static int yaz_query_charset_convert_structure(Z_RPNStructure *q, + ODR o, WRBUF wrbuf, + yaz_iconv_t cd) { + int r = 0; switch(q->which) { case Z_RPNStructure_simple: - yaz_query_charset_convert_operand(q->u.simple, o, wrbuf, cd); + r = yaz_query_charset_convert_operand(q->u.simple, o, wrbuf, cd); break; case Z_RPNStructure_complex: - yaz_query_charset_convert_structure(q->u.complex->s1, o, wrbuf, cd); - yaz_query_charset_convert_structure(q->u.complex->s2, o, wrbuf, cd); + r = yaz_query_charset_convert_structure(q->u.complex->s1, o, wrbuf, cd); + if (r == 0) + r = yaz_query_charset_convert_structure( + q->u.complex->s2, o, wrbuf, cd); break; } + return r; +} + +int yaz_query_charset_convert_rpnquery_check(Z_RPNQuery *q, + ODR o, yaz_iconv_t cd) +{ + int r = 0; + WRBUF wrbuf = wrbuf_alloc(); + r = yaz_query_charset_convert_structure(q->RPNStructure, o, wrbuf, cd); + wrbuf_destroy(wrbuf); + return r; } void yaz_query_charset_convert_rpnquery(Z_RPNQuery *q, @@ -97,6 +120,7 @@ void yaz_query_charset_convert_apt(Z_AttributesPlusTerm *apt, /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab