Added skeleton for query charset conversion. Bug #977.
[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.1 2007-03-21 19:47:28 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/proto.h>
16 #include <yaz/wrbuf.h>
17 #include <yaz/odr.h>
18 #include <yaz/yaz-iconv.h>
19
20 void yaz_query_charset_convert_buf(char *buf_in, int len_in,
21                                    char **buf_out, int *len_out,
22                                    ODR o, WRBUF wrbuf, yaz_iconv_t cd)
23 {
24     wrbuf_rewind(wrbuf);
25     wrbuf_iconv_write(wrbuf, cd, buf_in, len_in);
26     wrbuf_iconv_reset(wrbuf, cd);
27
28     *len_out = wrbuf_len(wrbuf);
29     if (*len_out == 0)
30     {   // we assume conversion failed
31         *buf_out = buf_in;
32         *len_out = len_in;
33     }
34     else
35     {
36         *buf_out = (char*) odr_malloc(o, *len_out);
37         memcpy(*buf_out, wrbuf_buf(wrbuf), *len_out);
38     }
39 }
40
41 void yaz_query_charset_convert_term(Z_Term *q,
42                                     ODR o, WRBUF wrbuf, yaz_iconv_t cd)
43 {
44     switch(q->which)
45     {
46     case Z_Term_general:
47         yaz_query_charset_convert_buf(
48             (char *) q->u.general->buf, q->u.general->len,
49             (char **) &q->u.general->buf, &q->u.general->len, o, wrbuf, cd);
50         break;
51     }
52 }
53
54 void yaz_query_charset_convert_operand(Z_Operand *q,
55                                        ODR o, WRBUF wrbuf, yaz_iconv_t cd)
56 {
57     switch(q->which)
58     {
59     case Z_Operand_APT:
60         yaz_query_charset_convert_term(q->u.attributesPlusTerm->term,
61                                        o, wrbuf, cd);
62         break;
63     case Z_Operand_resultSetId:
64         break;
65     case Z_Operand_resultAttr:
66         break;
67     }
68 }
69
70 void yaz_query_charset_convert_structure(Z_RPNStructure *q,
71                                          ODR o, WRBUF wrbuf, yaz_iconv_t cd)
72 {
73     switch(q->which)
74     {
75     case Z_RPNStructure_simple:
76         yaz_query_charset_convert_operand(q->u.simple, o, wrbuf, cd);
77         break;
78     case Z_RPNStructure_complex:
79         yaz_query_charset_convert_structure(q->u.complex->s1, o, wrbuf, cd);
80         yaz_query_charset_convert_structure(q->u.complex->s2, o, wrbuf, cd);
81         break;
82     }
83 }
84
85 void yaz_query_charset_convert_rpnquery(Z_RPNQuery *q,
86                                         ODR o, yaz_iconv_t cd)
87 {
88     WRBUF wrbuf = wrbuf_alloc();
89     yaz_query_charset_convert_structure(q->RPNStructure, o, wrbuf, cd);
90     wrbuf_destroy(wrbuf);
91 }
92
93 void yaz_query_charset_convert_apt(Z_AttributesPlusTerm *apt,
94                                    ODR o, yaz_iconv_t cd)
95 {
96     WRBUF wrbuf = wrbuf_alloc();
97     yaz_query_charset_convert_term(apt->term, o, wrbuf, cd);
98     wrbuf_destroy(wrbuf);
99 }
100
101 /*
102  * Local variables:
103  * c-basic-offset: 4
104  * indent-tabs-mode: nil
105  * End:
106  * vim: shiftwidth=4 tabstop=8 expandtab
107  */
108