tools: move config.h reading to its own file
authorRusty Russell <rusty@rustcorp.com.au>
Mon, 19 Mar 2012 05:36:27 +0000 (16:06 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Mon, 19 Mar 2012 05:47:33 +0000 (16:17 +1030)
Move ccan_dir determination out to its own function, rather than implying it
by the first time we get the manifest of a module.

tools/Makefile
tools/ccanlint/Makefile
tools/ccanlint/ccanlint.c
tools/ccanlint/file_analysis.c
tools/read_config_header.c [new file with mode: 0644]
tools/read_config_header.h [new file with mode: 0644]

index c942bdeeb501a933e98aa05374622ccf956b010e..b8871be0845c4b58d7adc5e37c4db9d3d4302e3e 100644 (file)
@@ -8,6 +8,7 @@ DEP_OBJS = ccan/grab_file/grab_file.o \
        ccan/str_talloc/str_talloc.o \
        ccan/talloc/talloc.o \
        ccan/time/time.o \
        ccan/str_talloc/str_talloc.o \
        ccan/talloc/talloc.o \
        ccan/time/time.o \
+       tools/read_config_header.o \
        tools/compile.o \
        tools/depends.o \
        tools/tools.o
        tools/compile.o \
        tools/depends.o \
        tools/tools.o
index cf450f27fd106a94d872e63b66ffd769409f96cb..68246700b2548a03398ee289bfead965a41413b2 100644 (file)
@@ -32,6 +32,7 @@ CORE_OBJS := \
        tools/depends.o \
        tools/doc_extract-core.o \
        tools/manifest.o \
        tools/depends.o \
        tools/doc_extract-core.o \
        tools/manifest.o \
+       tools/read_config_header.o \
        tools/tools.o
 
 OBJS := $(CORE_OBJS) $(TEST_OBJS)
        tools/tools.o
 
 OBJS := $(CORE_OBJS) $(TEST_OBJS)
index 931ed41a44429c91affa837c789cd7294e8287cb..4ec8bb8e8fc1cdcb9e09adccba8c5396883b83a8 100644 (file)
@@ -19,6 +19,7 @@
  */
 #include "ccanlint.h"
 #include "../tools.h"
  */
 #include "ccanlint.h"
 #include "../tools.h"
+#include "../read_config_header.h"
 #include <unistd.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -559,100 +560,6 @@ char **per_file_options(const struct ccanlint *test, struct ccan_file *f)
        return talloc_realloc(NULL, ret, char *, j + 1);
 }
 
        return talloc_realloc(NULL, ret, char *, j + 1);
 }
 
-static char *demangle_string(char *string)
-{
-       unsigned int i;
-       const char mapfrom[] = "abfnrtv";
-       const char mapto[] = "\a\b\f\n\r\t\v";
-
-       if (!strchr(string, '"'))
-               return NULL;
-       string = strchr(string, '"') + 1;
-       if (!strrchr(string, '"'))
-               return NULL;
-       *strrchr(string, '"') = '\0';
-
-       for (i = 0; i < strlen(string); i++) {
-               if (string[i] == '\\') {
-                       char repl;
-                       unsigned len = 0;
-                       const char *p = strchr(mapfrom, string[i+1]);
-                       if (p) {
-                               repl = mapto[p - mapfrom];
-                               len = 1;
-                       } else if (strlen(string+i+1) >= 3) {
-                               if (string[i+1] == 'x') {
-                                       repl = (string[i+2]-'0')*16
-                                               + string[i+3]-'0';
-                                       len = 3;
-                               } else if (cisdigit(string[i+1])) {
-                                       repl = (string[i+2]-'0')*8*8
-                                               + (string[i+3]-'0')*8
-                                               + (string[i+4]-'0');
-                                       len = 3;
-                               }
-                       }
-                       if (len == 0) {
-                               repl = string[i+1];
-                               len = 1;
-                       }
-
-                       string[i] = repl;
-                       memmove(string + i + 1, string + i + len + 1,
-                               strlen(string + i + len + 1) + 1);
-               }
-       }
-
-       return string;
-}
-
-
-static void read_config_header(void)
-{
-       char *fname = talloc_asprintf(NULL, "%s/config.h", ccan_dir);
-       char **lines;
-       unsigned int i;
-
-       config_header = grab_file(NULL, fname, NULL);
-       if (!config_header) {
-               talloc_free(fname);
-               return;
-       }
-
-       lines = strsplit(config_header, config_header, "\n");
-       for (i = 0; i < talloc_array_length(lines) - 1; i++) {
-               char *sym;
-               const char **line = (const char **)&lines[i];
-
-               if (!get_token(line, "#"))
-                       continue;
-               if (!get_token(line, "define"))
-                       continue;
-               sym = get_symbol_token(lines, line);
-               if (streq(sym, "CCAN_COMPILER") && !compiler) {
-                       compiler = demangle_string(lines[i]);
-                       if (!compiler)
-                               errx(1, "%s:%u:could not parse CCAN_COMPILER",
-                                    fname, i+1);
-                       if (verbose > 1)
-                               printf("%s: compiler set to '%s'\n",
-                                      fname, compiler);
-               } else if (streq(sym, "CCAN_CFLAGS") && !cflags) {
-                       cflags = demangle_string(lines[i]);
-                       if (!cflags)
-                               errx(1, "%s:%u:could not parse CCAN_CFLAGS",
-                                    fname, i+1);
-                       if (verbose > 1)
-                               printf("%s: compiler flags set to '%s'\n",
-                                      fname, cflags);
-               }
-       }
-       if (!compiler)
-               compiler = CCAN_COMPILER;
-       if (!cflags)
-               compiler = CCAN_CFLAGS;
-}
-
 static char *opt_set_const_charp(const char *arg, const char **p)
 {
        return opt_set_charp(arg, cast_const2(char **, p));
 static char *opt_set_const_charp(const char *arg, const char **p)
 {
        return opt_set_charp(arg, cast_const2(char **, p));
@@ -785,7 +692,9 @@ int main(int argc, char *argv[])
                        if (!ccan_dir)
                                errx(1, "Cannot find ccan/ base directory in %s",
                                     dir);
                        if (!ccan_dir)
                                errx(1, "Cannot find ccan/ base directory in %s",
                                     dir);
-                       read_config_header();
+                       config_header = read_config_header(ccan_dir,
+                                                          &compiler, &cflags,
+                                                          verbose > 1);
                }
 
                if (dir != base_dir)
                }
 
                if (dir != base_dir)
index d915b7ed8f59b131851621e9078410af93784fc1..8760630a7549e22a4d981c24fe69fab407d37043 100644 (file)
@@ -105,40 +105,6 @@ static bool continues(const char *line)
        return strends(line, "\\");
 }
 
        return strends(line, "\\");
 }
 
-/* Get token if it's equal to token. */
-bool get_token(const char **line, const char *token)
-{
-       unsigned int toklen;
-
-       *line += strspn(*line, " \t");
-       if (cisalnum(token[0]) || token[0] == '_')
-               toklen = strspn(*line, IDENT_CHARS);
-       else {
-               /* FIXME: real tokenizer handles ++ and other multi-chars.  */
-               toklen = strlen(token);
-       }
-
-       if (toklen == strlen(token) && !strncmp(*line, token, toklen)) {
-               *line += toklen;
-               return true;
-       }
-       return false;
-}
-
-char *get_symbol_token(void *ctx, const char **line)
-{
-       unsigned int toklen;
-       char *ret;
-
-       *line += strspn(*line, " \t");
-       toklen = strspn(*line, IDENT_CHARS);
-       if (!toklen)
-               return NULL;
-       ret = talloc_strndup(ctx, *line, toklen);
-       *line += toklen;
-       return ret;
-}
-
 static bool parse_hash_if(struct pp_conditions *cond, const char **line)
 {
        bool brackets, defined;
 static bool parse_hash_if(struct pp_conditions *cond, const char **line)
 {
        bool brackets, defined;
diff --git a/tools/read_config_header.c b/tools/read_config_header.c
new file mode 100644 (file)
index 0000000..b168a2f
--- /dev/null
@@ -0,0 +1,143 @@
+#include <ccan/grab_file/grab_file.h>
+#include <ccan/str/str.h>
+#include <ccan/str_talloc/str_talloc.h>
+#include <ccan/talloc/talloc.h>
+#include "read_config_header.h"
+#include "tools.h"
+#include <string.h>
+#include <err.h>
+
+/* Get an identifier token. */
+char *get_symbol_token(void *ctx, const char **line)
+{
+       unsigned int toklen;
+       char *ret;
+
+       *line += strspn(*line, " \t");
+       toklen = strspn(*line, IDENT_CHARS);
+       if (!toklen)
+               return NULL;
+       ret = talloc_strndup(ctx, *line, toklen);
+       *line += toklen;
+       return ret;
+}
+
+/* Get token if it's equal to token. */
+bool get_token(const char **line, const char *token)
+{
+       unsigned int toklen;
+
+       *line += strspn(*line, " \t");
+       if (cisalnum(token[0]) || token[0] == '_')
+               toklen = strspn(*line, IDENT_CHARS);
+       else {
+               /* FIXME: real tokenizer handles ++ and other multi-chars.  */
+               toklen = strlen(token);
+       }
+
+       if (toklen == strlen(token) && !strncmp(*line, token, toklen)) {
+               *line += toklen;
+               return true;
+       }
+       return false;
+}
+
+static char *demangle_string(char *string)
+{
+       unsigned int i;
+       const char mapfrom[] = "abfnrtv";
+       const char mapto[] = "\a\b\f\n\r\t\v";
+
+       if (!strchr(string, '"'))
+               return NULL;
+       string = strchr(string, '"') + 1;
+       if (!strrchr(string, '"'))
+               return NULL;
+       *strrchr(string, '"') = '\0';
+
+       for (i = 0; i < strlen(string); i++) {
+               if (string[i] == '\\') {
+                       char repl;
+                       unsigned len = 0;
+                       const char *p = strchr(mapfrom, string[i+1]);
+                       if (p) {
+                               repl = mapto[p - mapfrom];
+                               len = 1;
+                       } else if (strlen(string+i+1) >= 3) {
+                               if (string[i+1] == 'x') {
+                                       repl = (string[i+2]-'0')*16
+                                               + string[i+3]-'0';
+                                       len = 3;
+                               } else if (cisdigit(string[i+1])) {
+                                       repl = (string[i+2]-'0')*8*8
+                                               + (string[i+3]-'0')*8
+                                               + (string[i+4]-'0');
+                                       len = 3;
+                               }
+                       }
+                       if (len == 0) {
+                               repl = string[i+1];
+                               len = 1;
+                       }
+
+                       string[i] = repl;
+                       memmove(string + i + 1, string + i + len + 1,
+                               strlen(string + i + len + 1) + 1);
+               }
+       }
+
+       return string;
+}
+
+char *read_config_header(const char *ccan_dir,
+                        const char **compiler, const char **cflags,
+                        bool verbose)
+{
+       char *fname = talloc_asprintf(NULL, "%s/config.h", ccan_dir);
+       char **lines;
+       unsigned int i;
+       char *config_header;
+
+       config_header = grab_file(NULL, fname, NULL);
+       talloc_free(fname);
+
+       if (!config_header)
+               goto out;
+
+       lines = strsplit(config_header, config_header, "\n");
+       for (i = 0; i < talloc_array_length(lines) - 1; i++) {
+               char *sym;
+               const char **line = (const char **)&lines[i];
+
+               if (!get_token(line, "#"))
+                       continue;
+               if (!get_token(line, "define"))
+                       continue;
+               sym = get_symbol_token(lines, line);
+               if (streq(sym, "CCAN_COMPILER") && !compiler) {
+                       *compiler = demangle_string(lines[i]);
+                       if (!*compiler)
+                               errx(1, "%s:%u:could not parse CCAN_COMPILER",
+                                    fname, i+1);
+                       if (verbose)
+                               printf("%s: compiler set to '%s'\n",
+                                      fname, *compiler);
+               } else if (streq(sym, "CCAN_CFLAGS") && !cflags) {
+                       *cflags = demangle_string(lines[i]);
+                       if (!*cflags)
+                               errx(1, "%s:%u:could not parse CCAN_CFLAGS",
+                                    fname, i+1);
+                       if (verbose)
+                               printf("%s: compiler flags set to '%s'\n",
+                                      fname, *cflags);
+               }
+       }
+
+out:
+       if (!*compiler)
+               *compiler = CCAN_COMPILER;
+       if (!*cflags)
+               *cflags = CCAN_CFLAGS;
+
+       return config_header;
+}
diff --git a/tools/read_config_header.h b/tools/read_config_header.h
new file mode 100644 (file)
index 0000000..62eb152
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef CCAN_TOOLS_READ_CONFIG_HEADER_H
+#define CCAN_TOOLS_READ_CONFIG_HEADER_H
+#include <stdbool.h>
+
+/* Get token if it's equal to token. */
+bool get_token(const char **line, const char *token);
+
+/* Get an identifier token. */
+char *get_symbol_token(void *ctx, const char **line);
+
+/* Read config header from config_dir/config.h: set compiler/cflags. */
+char *read_config_header(const char *config_dir,
+                        const char **compiler, const char **cflags,
+                        bool verbose);
+
+#endif /* CCAN_TOOLS_READ_CONFIG_HEADER_H */