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