summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Jennings <mej@kainx.org>2004-10-26 18:01:55 +0000
committerMichael Jennings <mej@kainx.org>2004-10-26 18:01:55 +0000
commit51a22e649999a7d1f6856ead6d00aa1832af9f85 (patch)
treee6706d38b0bbee99159096fbea9e80872a614037
parent0e2d306ea10a0e00f390ac4c93631c56c41e20a5 (diff)
downloadlibast-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--ChangeLog5
-rw-r--r--include/libast.h18
-rw-r--r--src/options.c14
-rw-r--r--test/perf.c4
-rw-r--r--test/test.c9
5 files changed, 29 insertions, 21 deletions
diff --git a/ChangeLog b/ChangeLog
index e854b2f..2878ffb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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);