TCPD libs only used in libyaz's LIBADD
[yaz-moved-to-github.git] / util / cql2pqf.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 #include <stdlib.h>
7 #include <stdio.h>
8
9 #include <yaz/rpn2cql.h>
10 #include <yaz/pquery.h>
11 #include <yaz/options.h>
12
13 static void usage(void)
14 {
15     fprintf(stderr, "usage\n cql2pqf [-n <n>] [-r] <properties> [<query>]\n");
16     exit(1);
17 }
18
19 int main(int argc, char **argv)
20 {
21     cql_transform_t ct;
22     int i, iterations = 1;
23     char *query = 0;
24     char *fname = 0;
25     int reverse = 0;
26
27     int ret;
28     char *arg;
29
30     while ((ret = options("n:r", argv, argc, &arg)) != -2)
31     {
32         switch (ret)
33         {
34         case 0:
35             if (!fname)
36                 fname = arg;
37             else
38                 query = arg;
39             break;
40         case 'r':
41             reverse = 1;
42             break;
43         case 'n':
44             iterations = atoi(arg);
45             break;
46         default:
47             usage();
48         }
49     }
50     if (!fname)
51         usage();
52     if (!strcmp(fname, "-"))
53         ct = cql_transform_create();
54     else
55         ct = cql_transform_open_fname(fname);
56     if (!ct)
57     {
58         fprintf(stderr, "failed to read properties %s\n", fname);
59         exit(1);
60     }
61
62     if (reverse)
63     {
64         if (!query)
65             usage();
66         else
67         {
68             ODR odr = odr_createmem(ODR_ENCODE);
69             YAZ_PQF_Parser pp = yaz_pqf_create();
70             Z_RPNQuery *rpn = yaz_pqf_parse(pp, odr, query);
71             if (!rpn)
72             {
73                 fprintf(stderr, "PQF syntax error\n");
74             }
75             else 
76             {
77                 int ret = cql_transform_rpn2cql_stream(ct, cql_fputs,
78                                                        stdout, rpn);
79                 
80                 if (ret)
81                 {
82                     const char *addinfo;
83                     int r = cql_transform_error(ct, &addinfo);
84                     printf("Transform error %d %s\n", r, addinfo ? addinfo : "");
85                 }
86                 else
87                     printf("\n");
88             }
89             yaz_pqf_destroy(pp);
90             odr_destroy(odr);
91         }
92     }
93     else
94     {
95         CQL_parser cp = cql_parser_create();
96         int r = 0;
97         
98         if (query)
99         {
100             for (i = 0; i<iterations; i++)
101                 r = cql_parser_string(cp, query);
102         }
103         else
104             r = cql_parser_stdio(cp, stdin);
105         
106         if (r)
107             fprintf(stderr, "Syntax error\n");
108         else
109         {
110             r = cql_transform_FILE(ct, cql_parser_result(cp), stdout);
111             printf("\n");
112             if (r)
113             {
114                 const char *addinfo;
115                 r = cql_transform_error(ct, &addinfo);
116                 printf("Transform error %d %s\n", r, addinfo ? addinfo : "");
117             }
118             else
119             {
120                 FILE *null = fopen("/dev/null", "w");
121                 for (i = 1; i<iterations; i++)
122                     cql_transform_FILE(ct, cql_parser_result(cp), null);
123                 fclose(null);
124             }
125         }
126         cql_parser_destroy(cp);
127     }
128     cql_transform_close(ct);
129     return 0;
130 }
131 /*
132  * Local variables:
133  * c-basic-offset: 4
134  * c-file-style: "Stroustrup"
135  * indent-tabs-mode: nil
136  * End:
137  * vim: shiftwidth=4 tabstop=8 expandtab
138  */
139