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