diff options
author | Michael Jennings <mej@kainx.org> | 2004-10-26 18:01:55 +0000 |
---|---|---|
committer | Michael Jennings <mej@kainx.org> | 2004-10-26 18:01:55 +0000 |
commit | 51a22e649999a7d1f6856ead6d00aa1832af9f85 (patch) | |
tree | e6706d38b0bbee99159096fbea9e80872a614037 | |
parent | 0e2d306ea10a0e00f390ac4c93631c56c41e20a5 (diff) | |
download | libast-51a22e649999a7d1f6856ead6d00aa1832af9f85.tar.gz |
Tue Oct 26 13:58:45 2004 Michael Jennings (mej)
Pre-parsing is kinda unique, and most applications probably won't need
it. So now pre-parsing of options must be specifically requested.
----------------------------------------------------------------------
SVN revision: 12036
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | include/libast.h | 18 | ||||
-rw-r--r-- | src/options.c | 14 | ||||
-rw-r--r-- | test/perf.c | 4 | ||||
-rw-r--r-- | test/test.c | 9 |
5 files changed, 29 insertions, 21 deletions
@@ -698,3 +698,8 @@ Tue Oct 26 12:18:14 2004 Michael Jennings (mej) Fix spec. ---------------------------------------------------------------------- +Tue Oct 26 13:58:45 2004 Michael Jennings (mej) + +Pre-parsing is kinda unique, and most applications probably won't need +it. So now pre-parsing of options must be specifically requested. +---------------------------------------------------------------------- diff --git a/include/libast.h b/include/libast.h index ace2c05..efa5b3d 100644 --- a/include/libast.h +++ b/include/libast.h @@ -1702,8 +1702,8 @@ extern const char *true_vals[], *false_vals[]; #define SPIFOPT_FLAG_TYPEMASK (0x07ff) /** * Preparsed option. This flag marks an option which is preparsed - * (i.e., parsed on the first pass, which is generally done before - * config files are read). + * (i.e., parsed only on the pre-parse pass, which is generally done + * before config files are read). */ #define SPIFOPT_FLAG_PREPARSE (1UL << 11) /** @@ -1743,13 +1743,15 @@ extern const char *true_vals[], *false_vals[]; * @ingroup DOXGRP_OPT */ -/** Postparse flag. This flag denotes whether or not the initial - * option parsing pass has been done. The first call to the - * spifopt_parse() function will parse only those options which have - * the SPIFOPT_FLAG_TYPEMASK flag set, after which it will set this - * flag. Subsequent calls will parse only non-preparsed options. +/** + * Preparse flag. This flag denotes whether or not the next call to + * the spifopt_parse() function will parse only those options which + * have the SPIFOPT_FLAG_PREPARSE flag set, after which it will clear + * this flag. Callers wishing to have certain options pre-parsed + * should set this flag prior to invoking spifopt_parse(). Use of + * this flag is not required. */ -#define SPIFOPT_SETTING_POSTPARSE (1UL << 0) +#define SPIFOPT_SETTING_PREPARSE (1UL << 0) /*@}*/ /*@{*/ diff --git a/src/options.c b/src/options.c index 6711b87..05173f6 100644 --- a/src/options.c +++ b/src/options.c @@ -61,8 +61,8 @@ static const char __attribute__((unused)) cvs_ident[] = "$Id$"; /** Next loop. Proceed to the next parsing stage (letter or word). */ #define NEXT_LOOP() D_OPTIONS(("NEXT_LOOP()\n")); if (islong || val_ptr) {NEXT_ARG();} else {NEXT_LETTER();} NOP /** Option parse test. Returns true IFF the option should be parsed on this pass. */ -#define SHOULD_PARSE(j) ((SPIFOPT_FLAGS_IS_SET(SPIFOPT_SETTING_POSTPARSE) && !SPIFOPT_OPT_IS_PREPARSE(j)) \ - || (!SPIFOPT_FLAGS_IS_SET(SPIFOPT_SETTING_POSTPARSE) && SPIFOPT_OPT_IS_PREPARSE(j))) +#define SHOULD_PARSE(j) ((SPIFOPT_FLAGS_IS_SET(SPIFOPT_SETTING_PREPARSE) && SPIFOPT_OPT_IS_PREPARSE(j)) \ + || (!SPIFOPT_FLAGS_IS_SET(SPIFOPT_SETTING_PREPARSE) && !SPIFOPT_OPT_IS_PREPARSE(j))) /*@}*/ /** @@ -560,7 +560,7 @@ spifopt_parse(int argc, char *argv[]) NEXT_LETTER(); } } - if (SPIFOPT_FLAGS_IS_SET(SPIFOPT_SETTING_POSTPARSE)) { + if (!SPIFOPT_FLAGS_IS_SET(SPIFOPT_SETTING_PREPARSE)) { argv[i] = NULL; } @@ -663,13 +663,15 @@ spifopt_parse(int argc, char *argv[]) ((spifopt_abstract_handler_t) SPIFOPT_OPT_VALUE(j))(val_ptr); } } - if (SPIFOPT_FLAGS_IS_SET(SPIFOPT_SETTING_POSTPARSE)) { + if (!SPIFOPT_FLAGS_IS_SET(SPIFOPT_SETTING_PREPARSE)) { argv[i] = NULL; } NEXT_LOOP(); } - if (SPIFOPT_FLAGS_IS_SET(SPIFOPT_SETTING_POSTPARSE)) { + if (SPIFOPT_FLAGS_IS_SET(SPIFOPT_SETTING_PREPARSE)) { + SPIFOPT_FLAGS_CLEAR(SPIFOPT_SETTING_PREPARSE); + } else { for (i = 1, j = 1; i < argc; i++) { if (argv[i]) { argv[j] = argv[i]; @@ -679,8 +681,6 @@ spifopt_parse(int argc, char *argv[]) if (j > 1) { argv[j] = NULL; } - } else { - SPIFOPT_FLAGS_SET(SPIFOPT_SETTING_POSTPARSE); } } diff --git a/test/perf.c b/test/perf.c index 959d114..2440f9a 100644 --- a/test/perf.c +++ b/test/perf.c @@ -438,7 +438,7 @@ perf_options(void) SPIFOPT_NUMOPTS_SET(sizeof(opts1) / sizeof(spifopt_t)); SPIFOPT_ALLOWBAD_SET(0); PERF_TEST( - SPIFOPT_FLAGS_CLEAR(SPIFOPT_SETTING_POSTPARSE); + SPIFOPT_FLAGS_SET(SPIFOPT_SETTING_PREPARSE); spifopt_parse(argc1, argv1); spifopt_parse(argc1, argv1); FREE(file_var); @@ -449,7 +449,7 @@ perf_options(void) SPIFOPT_NUMOPTS_SET(sizeof(opts2) / sizeof(spifopt_t)); SPIFOPT_ALLOWBAD_SET(0); PERF_TEST( - SPIFOPT_FLAGS_CLEAR(SPIFOPT_SETTING_POSTPARSE); + SPIFOPT_FLAGS_SET(SPIFOPT_SETTING_PREPARSE); spifopt_parse(argc2, argv2); spifopt_parse(argc2, argv2); FREE(display); diff --git a/test/test.c b/test/test.c index d14866d..67a9b4b 100644 --- a/test/test.c +++ b/test/test.c @@ -518,9 +518,9 @@ test_options(void) long color = 0; spif_uint32_t options = 0; char *argv2[] = { - "test", "some", "stuff", "-rt", "mytheme", "--name", "This is a name", "--exec=ssh foo@bar.com", - "--scrollbar", "--buttonbar", "no", "--login=0", "-mvd", "foo:0", "--color", "4", - "--foo", "blah", "-d", "eatme", NULL + "test", "-rt", "mytheme", "--name", "This is a name", "--exec=ssh foo@bar.com", + "--scrollbar", "--buttonbar", "no", "some", "--login=0", "-mvd", "foo:0", "--color", "4", + "stuff", "--foo", "blah", "-d", "eatme", NULL }; int argc2 = 20; spifopt_t opts2[] = { @@ -542,6 +542,7 @@ test_options(void) SPIFOPT_OPTLIST_SET(opts1); SPIFOPT_NUMOPTS_SET(sizeof(opts1) / sizeof(spifopt_t)); SPIFOPT_ALLOWBAD_SET(0); + SPIFOPT_FLAGS_SET(SPIFOPT_SETTING_PREPARSE); spifopt_parse(argc1, argv1); TEST_FAIL_IF(test_flag_var != 0x10); TEST_FAIL_IF(file_var != NULL); @@ -558,10 +559,10 @@ test_options(void) FREE(file_var); spiftool_free_array(exec_list, -1); - SPIFOPT_FLAGS_CLEAR(SPIFOPT_SETTING_POSTPARSE); SPIFOPT_OPTLIST_SET(opts2); SPIFOPT_NUMOPTS_SET(sizeof(opts2) / sizeof(spifopt_t)); SPIFOPT_ALLOWBAD_SET(0); + SPIFOPT_FLAGS_SET(SPIFOPT_SETTING_PREPARSE); spifopt_parse(argc2, argv2); TEST_FAIL_IF(strcmp(SPIF_CHARPTR_C(display), "foo:0")); TEST_FAIL_IF(name != NULL); |