diff options
Diffstat (limited to 'nuttx/tools')
-rw-r--r-- | nuttx/tools/Config.mk | 9 | ||||
-rw-r--r-- | nuttx/tools/cfgparser.c | 149 | ||||
-rw-r--r-- | nuttx/tools/mkconfig.c | 8 |
3 files changed, 159 insertions, 7 deletions
diff --git a/nuttx/tools/Config.mk b/nuttx/tools/Config.mk index 004a7e5bd..07d88392e 100644 --- a/nuttx/tools/Config.mk +++ b/nuttx/tools/Config.mk @@ -33,6 +33,9 @@ # ############################################################################ -CONFIG_ARCH := $(shell echo $(CONFIG_ARCH)) -CONFIG_ARCH_CHIP := $(shell echo $(CONFIG_ARCH_CHIP)) -CONFIG_ARCH_BOARD := $(shell echo $(CONFIG_ARCH_BOARD)) +# These are configuration variables that are quoted by configuration tool +# but which must be unquoated when used in the build system. + +CONFIG_ARCH := $(patsubst "%",%,$(strip $(CONFIG_ARCH))) +CONFIG_ARCH_CHIP := $(patsubst "%",%,$(strip $(CONFIG_ARCH_CHIP))) +CONFIG_ARCH_BOARD := $(patsubst "%",%,$(strip $(CONFIG_ARCH_BOARD))) diff --git a/nuttx/tools/cfgparser.c b/nuttx/tools/cfgparser.c index 655fac573..e49b29d5e 100644 --- a/nuttx/tools/cfgparser.c +++ b/nuttx/tools/cfgparser.c @@ -52,21 +52,41 @@ char line[LINESIZE+1]; /**************************************************************************** + * Private Data + ****************************************************************************/ + +/* These are configuration variable name that are quoted by configuration tool + * but which must be unquoated when used in C code. + */ + +static const char *dequote_list[] = +{ + "CONFIG_USER_ENTRYPOINT", + NULL +}; + + /**************************************************************************** * Private Functions ****************************************************************************/ + /* Skip over any spaces */ + static char *skip_space(char *ptr) { while (*ptr && isspace((int)*ptr)) ptr++; return ptr; } +/* Find the end of a variable string */ + static char *find_name_end(char *ptr) { while (*ptr && (isalnum((int)*ptr) || *ptr == '_')) ptr++; return ptr; } +/* Find the end of a value string */ + static char *find_value_end(char *ptr) { while (*ptr && !isspace((int)*ptr)) @@ -84,6 +104,8 @@ static char *find_value_end(char *ptr) return ptr; } +/* Read the next line from the configuration file */ + static char *read_line(FILE *stream) { char *ptr; @@ -106,31 +128,127 @@ static char *read_line(FILE *stream) } } +/* Parse the line from the configuration file into a variable name + * string and a value string. + */ + static void parse_line(char *ptr, char **varname, char **varval) { - *varname = ptr; + /* Skip over any leading spaces */ + + ptr = skip_space(ptr); + + /* The first no-space is the beginning of the variable name */ + + *varname = skip_space(ptr); *varval = NULL; - ptr = find_name_end(ptr); - if (*ptr && *ptr != '=') + /* Parse to the end of the variable name */ + + ptr = find_name_end(ptr); + + /* An equal sign is expected next, perhaps after some white space */ + + if (*ptr && *ptr != '=') { + /* Some else follows the variable name. Terminate the variable + * name and skip over any spaces. + */ + *ptr = '\0'; ptr = skip_space(ptr + 1); } + /* Verify that the equal sign is present */ + if (*ptr == '=') { + /* Make sure that the variable name is terminated (this was already + * done if the name was followed by white space. + */ + *ptr = '\0'; + + /* The variable value should follow =, perhaps separated by some + * white space. + */ + ptr = skip_space(ptr + 1); if (*ptr) { + /* Yes.. a variable follows. Save the pointer to the start + * of the variable string. + */ + *varval = ptr; + + /* Find the end of the variable string and make sure that it + * is terminated. + */ + ptr = find_value_end(ptr); *ptr = '\0'; } } } +static char *dequote_value(const char *varname, char *varval) +{ + const char **dqnam; + char *dqval = varval; + int len; + + if (dqval) + { + /* Check if the variable name is in the list of strings to be dequoated */ + + for (dqnam = dequote_list; *dqnam; dqnam++) + { + if (strcmp(*dqnam, varname) == 0) + { + break; + } + } + + /* Did we find the variable name in the list of configuration variables + * to be dequoated? + */ + + if (*dqnam) + { + /* Yes... Check if there is a traiing quote */ + + len = strlen(dqval); + if (dqval[len-1] == '"') + { + /* Yes... replace it with a terminator */ + + dqval[len-1] = '\0'; + len--; + } + + /* Is there a leading quote? */ + + if (dqval[0] == '"') + { + /* Yes.. skip over the leading quote */ + + dqval++; + len--; + } + + /* Handle the case where nothing is left after dequoting */ + + if (len < 0) + { + dqval = NULL; + } + } + } + + return dqval; +} + /**************************************************************************** * Public Functions ****************************************************************************/ @@ -141,22 +259,47 @@ void parse_file(FILE *stream) char *varval; char *ptr; + /* Loop until the entire file has been parsed. */ + do { + /* Read the next line from the file */ + ptr = read_line(stream); if (ptr) { + /* Parse the line into a variable and a value field */ + parse_line(ptr, &varname, &varval); + + /* Was a variable name found? */ + if (varname) { + /* Yes.. dequote the value if necessary */ + + varval = dequote_value(varname, varval); + + /* If no value was provided or if the special value 'n' was provided, + * then undefine the configuration variable. + */ + if (!varval || strcmp(varval, "n") == 0) { printf("#undef %s\n", varname); } + + /* Simply define the configuration variable if it has the special + * value "y" + */ + else if (strcmp(varval, "y") == 0) { printf("#define %s 1\n", varname); } + + /* Otherwise, use the value as provided */ + else { printf("#define %s %s\n", varname, varval); diff --git a/nuttx/tools/mkconfig.c b/nuttx/tools/mkconfig.c index b3749266c..2d2fff5c5 100644 --- a/nuttx/tools/mkconfig.c +++ b/nuttx/tools/mkconfig.c @@ -44,7 +44,7 @@ #include "cfgparser.h" /**************************************************************************** - * Definitions + * Pre-processor Definitions ****************************************************************************/ #define DEFCONFIG ".config" @@ -265,6 +265,12 @@ int main(int argc, char **argv, char **envp) printf("# undef CONFIG_DEBUG_SPI\n"); printf("# undef CONFIG_DEBUG_STACK\n"); printf("#endif\n\n"); + printf("/* User entry point. This is provided as a fall-back to keep compatibility\n"); + printf(" * with existing code, for builds which do not define CONFIG_USER_ENTRYPOINT.\n"); + printf(" */\n\n"); + printf("#ifndef CONFIG_USER_ENTRYPOINT\n"); + printf("# define CONFIG_USER_ENTRYPOINT user_start\n"); + printf("#endif\n\n"); printf("#endif /* __INCLUDE_NUTTX_CONFIG_H */\n"); fclose(stream); return 0; |