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