308c667a3fb4c85458ea0464fafdbd8773778a02
[yaz-moved-to-github.git] / src / query-charset.c
1 /* This file is part of the YAZ toolkit.
2  * Copyright (C) 1995-2010 Index Data
3  * See the file LICENSE for details.
4  */
5 /** \file query-charset.c
6     \brief converts General Terms in RPN queries
7  */
8 #if HAVE_CONFIG_H
9 #include <config.h>
10 #endif
11
12 #include <stdio.h>
13 #include <assert.h>
14
15 #include <yaz/query-charset.h>
16 #include <yaz/wrbuf.h>
17
18 static int 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     int r = 0;
23     wrbuf_rewind(wrbuf);
24     wrbuf_iconv_write(wrbuf, cd, buf_in, len_in);
25     wrbuf_iconv_reset(wrbuf, cd);
26
27     *len_out = wrbuf_len(wrbuf);
28     if (*len_out == 0)
29     {   /* we assume conversion failed */
30         *buf_out = buf_in;
31         *len_out = len_in;
32         r = -1;
33     }
34     else
35     {
36         /* conversion OK */
37         *buf_out = (char*) odr_malloc(o, *len_out);
38         memcpy(*buf_out, wrbuf_buf(wrbuf), *len_out);
39     }
40     return r;
41 }
42
43 static int yaz_query_charset_convert_term(Z_Term *q,
44                                           ODR o, WRBUF wrbuf, yaz_iconv_t cd)
45 {
46     int r = 0;
47     switch(q->which)
48     {
49     case Z_Term_general:
50         r = yaz_query_charset_convert_buf(
51             (char *) q->u.general->buf, q->u.general->len,
52             (char **) &q->u.general->buf, &q->u.general->len, o, wrbuf, cd);
53         break;
54     }
55     return r;
56 }
57
58 static int yaz_query_charset_convert_operand(Z_Operand *q,
59                                              ODR o, WRBUF wrbuf, yaz_iconv_t cd)
60 {
61     int r = 0;
62     switch(q->which)
63     {
64     case Z_Operand_APT:
65         r = yaz_query_charset_convert_term(q->u.attributesPlusTerm->term,
66                                               o, wrbuf, cd);
67         break;
68     case Z_Operand_resultSetId:
69         break;
70     case Z_Operand_resultAttr:
71         break;
72     }
73     return r;
74 }
75
76 static int yaz_query_charset_convert_structure(Z_RPNStructure *q,
77                                                ODR o, WRBUF wrbuf,
78                                                yaz_iconv_t cd)
79 {
80     int r = 0;
81     switch(q->which)
82     {
83     case Z_RPNStructure_simple:
84         r = yaz_query_charset_convert_operand(q->u.simple, o, wrbuf, cd);
85         break;
86     case Z_RPNStructure_complex:
87         r = yaz_query_charset_convert_structure(q->u.complex->s1, o, wrbuf, cd);
88         if (r == 0)
89             r = yaz_query_charset_convert_structure(
90                 q->u.complex->s2, o, wrbuf, cd);
91         break;
92     }
93     return r;
94 }
95
96 int yaz_query_charset_convert_rpnquery_check(Z_RPNQuery *q,
97                                              ODR o, yaz_iconv_t cd)
98 {
99     int r = 0;
100     WRBUF wrbuf = wrbuf_alloc();
101     r = yaz_query_charset_convert_structure(q->RPNStructure, o, wrbuf, cd);
102     wrbuf_destroy(wrbuf);
103     return r;
104 }
105
106 void yaz_query_charset_convert_rpnquery(Z_RPNQuery *q,
107                                         ODR o, yaz_iconv_t cd)
108 {
109     WRBUF wrbuf = wrbuf_alloc();
110     yaz_query_charset_convert_structure(q->RPNStructure, o, wrbuf, cd);
111     wrbuf_destroy(wrbuf);
112 }
113
114 void yaz_query_charset_convert_apt(Z_AttributesPlusTerm *apt,
115                                    ODR o, yaz_iconv_t cd)
116 {
117     WRBUF wrbuf = wrbuf_alloc();
118     yaz_query_charset_convert_term(apt->term, o, wrbuf, cd);
119     wrbuf_destroy(wrbuf);
120 }
121
122 /*
123  * Local variables:
124  * c-basic-offset: 4
125  * c-file-style: "Stroustrup"
126  * indent-tabs-mode: nil
127  * End:
128  * vim: shiftwidth=4 tabstop=8 expandtab
129  */
130