Added test for query charset converter.
[yaz-moved-to-github.git] / src / query-charset.c
1 /*
2  * Copyright (C) 1995-2007, Index Data ApS
3  * All rights reserved.
4  *
5  * $Id: query-charset.c,v 1.2 2007-04-10 14:42:31 adam Exp $
6  */
7
8 /** \file query-charset.c
9     \brief converts General Terms in RPN queries
10  */
11
12 #include <stdio.h>
13 #include <assert.h>
14
15 #include <yaz/query-charset.h>
16 #include <yaz/wrbuf.h>
17
18 void yaz_query_charset_convert_buf(char *buf_in, int len_in,
19                                    char **buf_out, int *len_out,
20                                    ODR o, WRBUF wrbuf, yaz_iconv_t cd)
21 {
22     wrbuf_rewind(wrbuf);
23     wrbuf_iconv_write(wrbuf, cd, buf_in, len_in);
24     wrbuf_iconv_reset(wrbuf, cd);
25
26     *len_out = wrbuf_len(wrbuf);
27     if (*len_out == 0)
28     {   // we assume conversion failed
29         *buf_out = buf_in;
30         *len_out = len_in;
31     }
32     else
33     {
34         *buf_out = (char*) odr_malloc(o, *len_out);
35         memcpy(*buf_out, wrbuf_buf(wrbuf), *len_out);
36     }
37 }
38
39 void yaz_query_charset_convert_term(Z_Term *q,
40                                     ODR o, WRBUF wrbuf, yaz_iconv_t cd)
41 {
42     switch(q->which)
43     {
44     case Z_Term_general:
45         yaz_query_charset_convert_buf(
46             (char *) q->u.general->buf, q->u.general->len,
47             (char **) &q->u.general->buf, &q->u.general->len, o, wrbuf, cd);
48         break;
49     }
50 }
51
52 void yaz_query_charset_convert_operand(Z_Operand *q,
53                                        ODR o, WRBUF wrbuf, yaz_iconv_t cd)
54 {
55     switch(q->which)
56     {
57     case Z_Operand_APT:
58         yaz_query_charset_convert_term(q->u.attributesPlusTerm->term,
59                                        o, wrbuf, cd);
60         break;
61     case Z_Operand_resultSetId:
62         break;
63     case Z_Operand_resultAttr:
64         break;
65     }
66 }
67
68 void yaz_query_charset_convert_structure(Z_RPNStructure *q,
69                                          ODR o, WRBUF wrbuf, yaz_iconv_t cd)
70 {
71     switch(q->which)
72     {
73     case Z_RPNStructure_simple:
74         yaz_query_charset_convert_operand(q->u.simple, o, wrbuf, cd);
75         break;
76     case Z_RPNStructure_complex:
77         yaz_query_charset_convert_structure(q->u.complex->s1, o, wrbuf, cd);
78         yaz_query_charset_convert_structure(q->u.complex->s2, o, wrbuf, cd);
79         break;
80     }
81 }
82
83 void yaz_query_charset_convert_rpnquery(Z_RPNQuery *q,
84                                         ODR o, yaz_iconv_t cd)
85 {
86     WRBUF wrbuf = wrbuf_alloc();
87     yaz_query_charset_convert_structure(q->RPNStructure, o, wrbuf, cd);
88     wrbuf_destroy(wrbuf);
89 }
90
91 void yaz_query_charset_convert_apt(Z_AttributesPlusTerm *apt,
92                                    ODR o, yaz_iconv_t cd)
93 {
94     WRBUF wrbuf = wrbuf_alloc();
95     yaz_query_charset_convert_term(apt->term, o, wrbuf, cd);
96     wrbuf_destroy(wrbuf);
97 }
98
99 /*
100  * Local variables:
101  * c-basic-offset: 4
102  * indent-tabs-mode: nil
103  * End:
104  * vim: shiftwidth=4 tabstop=8 expandtab
105  */
106