tools: move config.h reading to its own file
[ccan] / tools / ccanlint / ccanlint.c
index 931ed41a44429c91affa837c789cd7294e8287cb..4ec8bb8e8fc1cdcb9e09adccba8c5396883b83a8 100644 (file)
@@ -19,6 +19,7 @@
  */
 #include "ccanlint.h"
 #include "../tools.h"
+#include "../read_config_header.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);
 }
 
-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));
@@ -785,7 +692,9 @@ int main(int argc, char *argv[])
                        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)