You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by ma...@apache.org on 2014/11/03 02:03:11 UTC
[3/5] git commit: Use CLI for parsing internally.
Use CLI for parsing internally.
Replace manual parsing code with generic code, without changing the
interface quite yet.
Project: http://git-wip-us.apache.org/repos/asf/lucy-charmonizer/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-charmonizer/commit/19d31160
Tree: http://git-wip-us.apache.org/repos/asf/lucy-charmonizer/tree/19d31160
Diff: http://git-wip-us.apache.org/repos/asf/lucy-charmonizer/diff/19d31160
Branch: refs/heads/master
Commit: 19d31160859badf1674dea23d374bacb636e3ad7
Parents: a5d2b9b
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Wed Oct 8 17:42:34 2014 -0700
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Tue Oct 14 17:40:55 2014 -0700
----------------------------------------------------------------------
src/Charmonizer/Probe.c | 159 +++++++++++++++++++++++++------------------
1 file changed, 91 insertions(+), 68 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy-charmonizer/blob/19d31160/src/Charmonizer/Probe.c
----------------------------------------------------------------------
diff --git a/src/Charmonizer/Probe.c b/src/Charmonizer/Probe.c
index 4f5bbd6..93b744c 100644
--- a/src/Charmonizer/Probe.c
+++ b/src/Charmonizer/Probe.c
@@ -26,6 +26,7 @@
#include "Charmonizer/Core/ConfWriterPython.h"
#include "Charmonizer/Core/ConfWriterRuby.h"
#include "Charmonizer/Core/Util.h"
+#include "Charmonizer/Core/CLI.h"
#include "Charmonizer/Core/Compiler.h"
#include "Charmonizer/Core/Make.h"
#include "Charmonizer/Core/OperatingSystem.h"
@@ -35,93 +36,115 @@ chaz_Probe_parse_cli_args(int argc, const char *argv[],
struct chaz_CLIArgs *args) {
int i;
int output_enabled = 0;
+ chaz_CLI *cli
+ = chaz_CLI_new(argv[0], "charmonizer: Probe C compiler environment");
+ chaz_CLI_set_usage(cli, "Usage: charmonizer [OPTIONS] [-- [CFLAGS]]");
+
+ /* Register Charmonizer-specific options. */
+ chaz_CLI_register(cli, "enable-c", "generate charmony.h", CHAZ_CLI_NO_ARG);
+ chaz_CLI_register(cli, "enable-perl", "generate Charmony.pm", CHAZ_CLI_NO_ARG);
+ chaz_CLI_register(cli, "enable-python", "generate charmony.py", CHAZ_CLI_NO_ARG);
+ chaz_CLI_register(cli, "enable-ruby", "generate charmony.rb", CHAZ_CLI_NO_ARG);
+ chaz_CLI_register(cli, "enable-makefile", NULL, CHAZ_CLI_NO_ARG);
+ chaz_CLI_register(cli, "enable-coverage", NULL, CHAZ_CLI_NO_ARG);
+ chaz_CLI_register(cli, "cc", "compiler command", CHAZ_CLI_ARG_REQUIRED);
+ chaz_CLI_register(cli, "cflags", NULL, CHAZ_CLI_ARG_REQUIRED);
+ chaz_CLI_register(cli, "verbosity", NULL, CHAZ_CLI_ARG_REQUIRED);
+
+ /* Parse options, exiting on failure. */
+ if (!chaz_CLI_parse(cli, argc, argv)) {
+ fprintf(stderr, "%s", chaz_CLI_help(cli));
+ exit(1);
+ }
- /* Zero out args struct. */
- memset(args, 0, sizeof(struct chaz_CLIArgs));
-
- /* Parse most args. */
- for (i = 1; i < argc; i++) {
- const char *arg = argv[i];
- if (strcmp(arg, "--") == 0) {
- /* From here on out, everything will be a compiler flag. */
- i++;
- break;
- }
- if (strcmp(arg, "--enable-c") == 0) {
- args->charmony_h = 1;
- output_enabled = 1;
- }
- else if (strcmp(arg, "--enable-perl") == 0) {
- args->charmony_pm = 1;
- output_enabled = 1;
- }
- else if (strcmp(arg, "--enable-python") == 0) {
- args->charmony_py = 1;
- output_enabled = 1;
- }
- else if (strcmp(arg, "--enable-ruby") == 0) {
- args->charmony_rb = 1;
- output_enabled = 1;
- }
- else if (strcmp(arg, "--enable-makefile") == 0) {
- args->write_makefile = 1;
+ /* Accumulate compiler flags. */
+ {
+ char *cflags = chaz_Util_strdup("");
+ size_t cflags_len = 0;
+ for (i = 0; i < argc; i++) {
+ if (strcmp(argv[i], "--") == 0) {
+ i++;
+ break;
+ }
}
- else if (strcmp(arg, "--enable-coverage") == 0) {
- args->code_coverage = 1;
+ for (; i < argc; i++) {
+ const char *arg = argv[i];
+ cflags_len += strlen(arg) + 2;
+ cflags = (char*)realloc(cflags, cflags_len);
+ strcat(cflags, " ");
+ strcat(cflags, arg);
}
- else if (memcmp(arg, "--cc=", 5) == 0) {
- size_t len = strlen(arg);
- size_t l = 5;
- size_t r = len;
- size_t trimmed_len;
-
- if (len > CHAZ_PROBE_MAX_CC_LEN - 5) {
- fprintf(stderr, "Exceeded max length for compiler command");
- exit(1);
- }
-
- /*
- * Some Perl setups have a 'cc' config value with leading
- * whitespace.
- */
- while (isspace(arg[l])) {
- ++l;
- }
- while (r > l && isspace(arg[r-1])) {
- --r;
- }
+ chaz_CLI_set(cli, "cflags", cflags);
+ free(cflags);
+ }
- trimmed_len = r - l;
- memcpy(args->cc, arg + l, trimmed_len);
- args->cc[trimmed_len] = '\0';
+ /* Some Perl setups have a 'cc' config value with leading whitespace. */
+ if (chaz_CLI_defined(cli, "cc")) {
+ const char *arg = chaz_CLI_strval(cli, "cc");
+ char *cc;
+ size_t len = strlen(arg);
+ size_t l = 0;
+ size_t r = len;
+ size_t trimmed_len;
+
+ while (isspace(arg[l])) {
+ ++l;
}
- } /* preserve value of i */
-
- /* Accumulate compiler flags. */
- for (; i < argc; i++) {
- const char *arg = argv[i];
- size_t new_len = strlen(arg) + strlen(args->cflags) + 2;
- if (new_len >= CHAZ_PROBE_MAX_CFLAGS_LEN) {
- fprintf(stderr, "Exceeded max length for compiler flags");
- exit(1);
+ while (r > l && isspace(arg[r-1])) {
+ --r;
}
- strcat(args->cflags, " ");
- strcat(args->cflags, arg);
+
+ trimmed_len = r - l;
+ cc = (char*)malloc(trimmed_len + 1);
+ memcpy(cc, arg + l, trimmed_len);
+ cc[trimmed_len] = '\0';
+ chaz_CLI_unset(cli, "cc");
+ chaz_CLI_set(cli, "cc", cc);
+ free(cc);
}
/* Process CHARM_VERBOSITY environment variable. */
{
const char *verbosity_env = getenv("CHARM_VERBOSITY");
if (verbosity_env && strlen(verbosity_env)) {
- args->verbosity = strtol(verbosity_env, NULL, 10);
+ chaz_CLI_set(cli, "verbosity", verbosity_env);
}
}
+ if (chaz_CLI_defined(cli, "enable-c")
+ || chaz_CLI_defined(cli, "enable-perl")
+ || chaz_CLI_defined(cli, "enable-python")
+ || chaz_CLI_defined(cli, "enable-ruby")
+ ) {
+ output_enabled = 1;
+ }
+
/* Validate. */
- if (!strlen(args->cc) || !output_enabled) {
+ if (!chaz_CLI_defined(cli, "cc")
+ || !strlen(chaz_CLI_strval(cli, "cc"))
+ || !output_enabled
+ ) {
return false;
}
+ /* Zero out args struct. */
+ memset(args, 0, sizeof(struct chaz_CLIArgs));
+
+ /* Copy to CLIArgs struct. TODO: This code will be going away shortly. */
+ args->charmony_h = chaz_CLI_defined(cli, "enable-c");
+ args->charmony_pm = chaz_CLI_defined(cli, "enable-perl");
+ args->charmony_py = chaz_CLI_defined(cli, "enable-python");
+ args->charmony_rb = chaz_CLI_defined(cli, "enable-ruby");
+ args->write_makefile = chaz_CLI_defined(cli, "enable-makefile");
+ args->code_coverage = chaz_CLI_defined(cli, "enable-coverage");
+ if (chaz_CLI_defined(cli, "cc")) {
+ strcpy(args->cc, chaz_CLI_strval(cli, "cc"));
+ }
+ if (chaz_CLI_defined(cli, "verbosity")) {
+ args->verbosity = (int)chaz_CLI_longval(cli, "verbosity");
+ }
+
+ chaz_CLI_destroy(cli);
return true;
}