X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Foptions.c;h=6abfb6ffb2cb1d7b99dcf93bbf6057da73593d4c;hp=47dd4337e57382bef58cf8a6663d0e23aa76d129;hb=f24766f1e9fc5404fc0b512af8607d7f7054f4be;hpb=8d691989077a0addcbd840d769dce6700f3d9622 diff --git a/src/options.c b/src/options.c index 47dd433..6abfb6f 100644 --- a/src/options.c +++ b/src/options.c @@ -1,8 +1,6 @@ -/* - * Copyright (C) 1995-2007, Index Data ApS +/* This file is part of the YAZ toolkit. + * Copyright (C) Index Data * See the file LICENSE for details. - * - * $Id: options.c,v 1.5 2007-01-03 08:42:15 adam Exp $ */ /** * \file options.c @@ -13,51 +11,84 @@ #endif #include - +#include #include static int arg_no = 1; -static int arg_off = 0; +static size_t arg_off = 0; +static int eof_options = 0; -int options (const char *desc, char **argv, int argc, char **arg) +int options(const char *desc, char **argv, int argc, char **arg) { - int ch, i = 0; - + const char *opt_buf = 0; + size_t i = 0; + int ch = 0; + if (arg_no >= argc) - return -2; + return YAZ_OPTIONS_EOF; if (arg_off == 0) { while (argv[arg_no][0] == '\0') { arg_no++; if (arg_no >= argc) - return -2; + return YAZ_OPTIONS_EOF; } - if (argv[arg_no][0] != '-' || argv[arg_no][1] == '\0') + if (argv[arg_no][0] != '-' || argv[arg_no][1] == '\0' || eof_options) { *arg = argv[arg_no++]; return 0; } - arg_off++; + arg_off++; /* skip - */ + } + /* we're in option mode */ + if (argv[arg_no][1] == '-') + { /* long opt */ + if (argv[arg_no][2] == '\0') /* -- : end of options */ + { + eof_options = 1; + arg_off = 0; + ++arg_no; + if (arg_no >= argc) + return YAZ_OPTIONS_EOF; + *arg = argv[arg_no++]; + return 0; + } + opt_buf = argv[arg_no]+2; + arg_off = strlen(argv[arg_no]); + } + else + { /* single char opt */ + ch = argv[arg_no][arg_off++]; } - ch = argv[arg_no][arg_off++]; while (desc[i]) { int desc_char = desc[i++]; int type = 0; + while (desc[i] == '{') + { + size_t i0 = ++i; + while (desc[i] && desc[i] != '}') + i++; + if (opt_buf && (i - i0) == strlen(opt_buf) && + memcmp(opt_buf, desc+i0, i - i0) == 0) + ch = desc_char; + if (desc[i]) + i++; + } if (desc[i] == ':') - { /* string argument */ + { /* option with string argument */ type = desc[i++]; } if (desc_char == ch) - { /* option with argument */ - if (type) + { + if (type) /* option with argument */ { if (argv[arg_no][arg_off]) { *arg = argv[arg_no]+arg_off; arg_no++; - arg_off = 0; + arg_off = 0; } else { @@ -71,25 +102,24 @@ int options (const char *desc, char **argv, int argc, char **arg) } else /* option with no argument */ { - if (argv[arg_no][arg_off]) - arg_off++; - else + if (!argv[arg_no][arg_off]) { arg_off = 0; arg_no++; } } return ch; - } + } } *arg = argv[arg_no]+arg_off-1; arg_no = arg_no + 1; arg_off = 0; - return -1; + return YAZ_OPTIONS_ERROR; } /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab