X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=util%2Fcql2pqf.c;h=203cdae736e6859af39c5ed8533d54d10d10eca0;hp=516391f8b786d3ee8109fc6fc8b4ca2b5c6c3a4f;hb=fbd98e3ba1435882c6fa121e5dee6648ed295b60;hpb=9691e3376fe3f178ac95e707610b83b36e8635c5 diff --git a/util/cql2pqf.c b/util/cql2pqf.c index 516391f..203cdae 100644 --- a/util/cql2pqf.c +++ b/util/cql2pqf.c @@ -1,60 +1,159 @@ -/* $Id: cql2pqf.c,v 1.2 2003-12-18 16:45:19 mike 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 +#endif #include #include -#include +#include +#include +#include + +static void usage(void) +{ + fprintf(stderr, "usage\n cql2pqf [-n ] [-r] [-S] " + "[]\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 = 0; + int do_strict = 0; + + int ret; + char *arg; - if (argc < 2) + while ((ret = options("n:rSv", argv, argc, &arg)) != -2) { - fprintf (stderr, "usage\n cqltransform [] [iterations]\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 'S': + do_strict = 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= 3) - r = cql_parser_string(cp, argv[2]); - else - r = cql_parser_stdio(cp, stdin); + char buf[1024]; + + if (!query) + { + if (fgets(buf, sizeof buf, stdin)) + query = buf; + } + if (query) + { + 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; + + cql_parser_strict(cp, do_strict); + if (query) + { + if (verbose) + printf("Parsing CQL %s\n", query); + for (i = 0; i