Allow empty CQL transform in cql2pqf (and reverse)
[yaz-moved-to-github.git] / util / cql2pqf.c
1 /* This file is part of the YAZ toolkit.
2  * Copyright (C) 1995-2009 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         case 'n':
43             iterations = atoi(arg);
44             break;
45         default:
46             usage();
47         }
48     }
49     if (!fname)
50         usage();
51     if (!strcmp(fname, "-"))
52         ct = cql_transform_create();
53     else
54         ct = cql_transform_open_fname(fname);
55     if (!ct)
56     {
57         fprintf(stderr, "failed to read properties %s\n", fname);
58         exit(1);
59     }
60
61     if (reverse)
62     {
63         if (!query)
64             usage();
65         else
66         {
67             ODR odr = odr_createmem(ODR_ENCODE);
68             YAZ_PQF_Parser pp = yaz_pqf_create();
69             Z_RPNQuery *rpn = yaz_pqf_parse(pp, odr, query);
70             if (!rpn)
71             {
72                 fprintf(stderr, "PQF syntax error\n");
73             }
74             else 
75             {
76                 int ret = cql_transform_rpn2cql_stream(ct, cql_fputs,
77                                                        stdout, rpn);
78                 
79                 if (ret)
80                 {
81                     const char *addinfo;
82                     int r = cql_transform_error(ct, &addinfo);
83                     printf("Transform error %d %s\n", r, addinfo ? addinfo : "");
84                 }
85                 else
86                     printf("\n");
87             }
88             yaz_pqf_destroy(pp);
89             odr_destroy(odr);
90         }
91     }
92     else
93     {
94         CQL_parser cp = cql_parser_create();
95         int r = 0;
96         
97         if (query)
98         {
99             for (i = 0; i<iterations; i++)
100                 r = cql_parser_string(cp, query);
101         }
102         else
103             r = cql_parser_stdio(cp, stdin);
104         
105         if (r)
106             fprintf(stderr, "Syntax error\n");
107         else
108         {
109             r = cql_transform_FILE(ct, cql_parser_result(cp), stdout);
110             printf("\n");
111             if (r)
112             {
113                 const char *addinfo;
114                 r = cql_transform_error(ct, &addinfo);
115                 printf("Transform error %d %s\n", r, addinfo ? addinfo : "");
116             }
117             else
118             {
119                 FILE *null = fopen("/dev/null", "w");
120                 for (i = 1; i<iterations; i++)
121                     cql_transform_FILE(ct, cql_parser_result(cp), null);
122                 fclose(null);
123             }
124         }
125         cql_parser_destroy(cp);
126     }
127     cql_transform_close(ct);
128     return 0;
129 }
130 /*
131  * Local variables:
132  * c-basic-offset: 4
133  * c-file-style: "Stroustrup"
134  * indent-tabs-mode: nil
135  * End:
136  * vim: shiftwidth=4 tabstop=8 expandtab
137  */
138