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