-/* $Id: cql2pqf.c,v 1.1 2003-10-27 12:21:39 adam Exp $
- Copyright (C) 2002-2003
- Index Data Aps
-
-This file is part of the YAZ toolkit.
-
-See the file LICENSE.
-*/
+/* This file is part of the YAZ toolkit.
+ * Copyright (C) 1995-2013 Index Data
+ * See the file LICENSE for details.
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
#include <stdlib.h>
#include <stdio.h>
-#include <yaz/cql.h>
+#include <yaz/rpn2cql.h>
+#include <yaz/pquery.h>
+#include <yaz/options.h>
+
+static void usage(void)
+{
+ fprintf(stderr, "usage\n cql2pqf [-n <n>] [-r] <properties> [<query>]\n");
+ exit(1);
+}
int main(int argc, char **argv)
{
cql_transform_t ct;
- int r;
- int i, it = 1;
- CQL_parser cp = cql_parser_create();
+ int i, iterations = 1;
+ char *query = 0;
+ char *fname = 0;
+ int reverse = 0;
+ int verbose = 1;
- if (argc < 2)
+ int ret;
+ char *arg;
+
+ while ((ret = options("n:rv", argv, argc, &arg)) != -2)
{
- fprintf (stderr, "usage\n cqltransform <properties> [<query>] [interations]\n");
- exit (1);
+ switch (ret)
+ {
+ case 0:
+ if (!fname)
+ fname = arg;
+ else
+ query = arg;
+ break;
+ case 'n':
+ iterations = atoi(arg);
+ break;
+ case 'r':
+ reverse = 1;
+ break;
+ case 'v':
+ verbose = 1;
+ break;
+ default:
+ usage();
+ }
}
- ct = cql_transform_open_fname(argv[1]);
+ if (!fname)
+ usage();
+ if (!strcmp(fname, "-"))
+ ct = cql_transform_create();
+ else
+ ct = cql_transform_open_fname(fname);
if (!ct)
{
- fprintf (stderr, "failed to read properties %s\n", argv[1]);
- exit (1);
+ fprintf(stderr, "failed to read properties %s\n", fname);
+ exit(1);
}
- if (argc >= 4)
- it = atoi(argv[3]);
- for (i = 0; i<it; i++)
+ if (reverse)
{
- if (argc >= 3)
- r = cql_parser_string(cp, argv[2]);
- else
- r = cql_parser_stdio(cp, stdin);
+ if (!query)
+ usage();
+ else
+ {
+ ODR odr = odr_createmem(ODR_ENCODE);
+ YAZ_PQF_Parser pp = yaz_pqf_create();
+ Z_RPNQuery *rpn = yaz_pqf_parse(pp, odr, query);
+ if (!rpn)
+ {
+ fprintf(stderr, "PQF syntax error\n");
+ }
+ else
+ {
+ int ret = cql_transform_rpn2cql_stream(ct, cql_fputs,
+ stdout, rpn);
- if (r)
- fprintf (stderr, "Syntax error\n");
+ if (ret)
+ {
+ const char *addinfo;
+ int r = cql_transform_error(ct, &addinfo);
+ printf("Transform error %d %s\n", r, addinfo ? addinfo : "");
+ }
+ else
+ printf("\n");
+ }
+ yaz_pqf_destroy(pp);
+ odr_destroy(odr);
+ }
+ }
else
{
- r = cql_transform_FILE(ct, cql_parser_result(cp), stdout);
- printf("\n");
+ CQL_parser cp = cql_parser_create();
+ int r = 0;
+
+ if (query)
+ {
+ if (verbose)
+ printf("Parsing CQL %s\n", query);
+ for (i = 0; i<iterations; i++)
+ r = cql_parser_string(cp, query);
+ }
+ else
+ r = cql_parser_stdio(cp, stdin);
+
if (r)
+ fprintf(stderr, "Syntax error\n");
+ else
{
- const char *addinfo;
- cql_transform_error(ct, &addinfo);
- printf ("Transform error %d %s\n", r, addinfo ? addinfo : "");
+ r = cql_transform_FILE(ct, cql_parser_result(cp), stdout);
+ printf("\n");
+ if (r)
+ {
+ const char *addinfo;
+ r = cql_transform_error(ct, &addinfo);
+ printf("Transform error %d %s\n", r, addinfo ? addinfo : "");
+ }
+ else
+ {
+ FILE *null = fopen("/dev/null", "w");
+ for (i = 1; i<iterations; i++)
+ cql_transform_FILE(ct, cql_parser_result(cp), null);
+ fclose(null);
+ }
}
- }
+ cql_parser_destroy(cp);
}
cql_transform_close(ct);
- cql_parser_destroy(cp);
return 0;
}
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+