From: Rusty Russell Date: Sun, 29 Jun 2008 04:42:34 +0000 (+1000) Subject: Split tools unto parts for fixing run_tests to link req'd deps. X-Git-Url: http://git.ozlabs.org/?p=ccan;a=commitdiff_plain;h=437fa285d12183a0f1e7450b3a01cbe5620a3507 Split tools unto parts for fixing run_tests to link req'd deps. --- diff --git a/tools/Makefile b/tools/Makefile index a9ed7fd6..c92bb54b 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -1,8 +1,8 @@ -tools/run_tests: tools/run_tests.o ccan/tap/tap.o ccan/talloc/talloc.o +tools/run_tests: tools/run_tests.o tools/depends.o tools/split.o tools/grab_file.o ccan/tap/tap.o ccan/talloc/talloc.o tools/doc_extract: tools/doc_extract.c ccan/talloc/talloc.o -tools/namespacize: tools/namespacize.c ccan/talloc/talloc.o +tools/namespacize: tools/namespacize.c tools/split.o tools/grab_file.o tools/depends.o ccan/talloc/talloc.o tools-clean: ccanlint-clean rm -f run_tests doc_extract namespacize diff --git a/tools/depends.c b/tools/depends.c new file mode 100644 index 00000000..aaae03a9 --- /dev/null +++ b/tools/depends.c @@ -0,0 +1,51 @@ +#include "talloc/talloc.h" +#include "tools.h" +#include + +static char ** __attribute__((format(printf, 2, 3))) +lines_from_cmd(const void *ctx, char *format, ...) +{ + va_list ap; + char *cmd, *buffer; + FILE *p; + + va_start(ap, format); + cmd = talloc_vasprintf(ctx, format, ap); + va_end(ap); + + p = popen(cmd, "r"); + if (!p) + err(1, "Executing '%s'", cmd); + + buffer = grab_fd(ctx, fileno(p)); + if (!buffer) + err(1, "Reading from '%s'", cmd); + pclose(p); + + return split(ctx, buffer, "\n", NULL); +} + +static char *build_info(const void *ctx, const char *dir) +{ + char *file, *cfile, *cmd; + + cfile = talloc_asprintf(ctx, "%s/%s", dir, "_info.c"); + file = talloc_asprintf(cfile, "%s/%s", dir, "_info"); + cmd = talloc_asprintf(file, "gcc " CFLAGS " -o %s %s", file, cfile); + if (system(cmd) != 0) + errx(1, "Failed to compile %s", file); + + return file; +} + +char **get_deps(const void *ctx, const char *dir) +{ + char **deps, *cmd; + + cmd = talloc_asprintf(ctx, "%s depends", build_info(ctx, dir)); + deps = lines_from_cmd(cmd, cmd); + if (!deps) + err(1, "Could not run '%s'", cmd); + return deps; +} + diff --git a/tools/grab_file.c b/tools/grab_file.c new file mode 100644 index 00000000..283a82b8 --- /dev/null +++ b/tools/grab_file.c @@ -0,0 +1,58 @@ +#include "tools.h" +#include "talloc/talloc.h" +#include +#include +#include +#include +#include +#include + +static int close_no_errno(int fd) +{ + int ret = 0, serrno = errno; + if (close(fd) < 0) + ret = errno; + errno = serrno; + return ret; +} + +void *grab_fd(const void *ctx, int fd) +{ + int ret; + unsigned int max = 16384, size = 0; + char *buffer; + + buffer = talloc_array(ctx, char, max+1); + while ((ret = read(fd, buffer + size, max - size)) > 0) { + size += ret; + if (size == max) + buffer = talloc_realloc(ctx, buffer, char, max*=2 + 1); + } + if (ret < 0) { + talloc_free(buffer); + buffer = NULL; + } else + buffer[size] = '\0'; + + return buffer; +} + +/* This version adds one byte (for nul term) */ +void *grab_file(const void *ctx, const char *filename) +{ + int fd; + char *buffer; + + if (streq(filename, "-")) + fd = dup(STDIN_FILENO); + else + fd = open(filename, O_RDONLY, 0); + + if (fd < 0) + return NULL; + + buffer = grab_fd(ctx, fd); + close_no_errno(fd); + return buffer; +} + diff --git a/tools/namespacize.c b/tools/namespacize.c index e4a3973f..3e656c84 100644 --- a/tools/namespacize.c +++ b/tools/namespacize.c @@ -1,18 +1,17 @@ /* Code to move a ccan module into the ccan_ namespace. */ #include #include -#include #include -#include -#include -#include #include #include #include #include +#include +#include +#include +#include #include "talloc/talloc.h" - -#define CFLAGS "-O3 -Wall -Wundef -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes -Wmissing-declarations -Werror -I. -Iccan_tools/libtap/src/" +#include "tools.h" #define IDENT_CHARS "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \ "abcdefghijklmnopqrstuvwxyz" \ @@ -30,8 +29,6 @@ static int indent = 0; #define verbose_indent() (indent += 2) #define verbose_unindent() (indent -= 2) -#define streq(a,b) (strcmp((a),(b)) == 0) - #define strstarts(str,prefix) (strncmp((str),(prefix),strlen(prefix)) == 0) static inline bool strends(const char *str, const char *postfix) @@ -42,15 +39,6 @@ static inline bool strends(const char *str, const char *postfix) return streq(str + strlen(str) - strlen(postfix), postfix); } -static int close_no_errno(int fd) -{ - int ret = 0, serrno = errno; - if (close(fd) < 0) - ret = errno; - errno = serrno; - return ret; -} - static int unlink_no_errno(const char *filename) { int ret = 0, serrno = errno; @@ -60,71 +48,6 @@ static int unlink_no_errno(const char *filename) return ret; } -static void *grab_fd(const void *ctx, int fd) -{ - int ret; - unsigned int max = 16384, size = 0; - char *buffer; - - buffer = talloc_array(ctx, char, max+1); - while ((ret = read(fd, buffer + size, max - size)) > 0) { - size += ret; - if (size == max) - buffer = talloc_realloc(ctx, buffer, char, max*=2 + 1); - } - if (ret < 0) { - talloc_free(buffer); - buffer = NULL; - } else - buffer[size] = '\0'; - - return buffer; -} - -/* This version adds one byte (for nul term) */ -static void *grab_file(const void *ctx, const char *filename) -{ - int fd; - char *buffer; - - if (streq(filename, "-")) - fd = dup(STDIN_FILENO); - else - fd = open(filename, O_RDONLY, 0); - - if (fd < 0) - return NULL; - - buffer = grab_fd(ctx, fd); - close_no_errno(fd); - return buffer; -} - -/* This is a dumb one which copies. We could mangle instead. */ -static char **split(const void *ctx, const char *text, const char *delims, - unsigned int *nump) -{ - char **lines = NULL; - unsigned int max = 64, num = 0; - - lines = talloc_array(ctx, char *, max+1); - - while (*text != '\0') { - unsigned int len = strcspn(text, delims); - lines[num] = talloc_array(lines, char, len + 1); - memcpy(lines[num], text, len); - lines[num][len] = '\0'; - text += len; - text += strspn(text, delims); - if (++num == max) - lines = talloc_realloc(ctx, lines, char *, max*=2 + 1); - } - lines[num] = NULL; - if (nump) - *nump = num; - return lines; -} - static char **get_dir(const char *dir) { DIR *d; @@ -146,29 +69,6 @@ static char **get_dir(const char *dir) return names; } -static char ** __attribute__((format(printf, 2, 3))) -lines_from_cmd(const void *ctx, char *format, ...) -{ - va_list ap; - char *cmd, *buffer; - FILE *p; - - va_start(ap, format); - cmd = talloc_vasprintf(ctx, format, ap); - va_end(ap); - - p = popen(cmd, "r"); - if (!p) - err(1, "Executing '%s'", cmd); - - buffer = grab_fd(ctx, fileno(p)); - if (!buffer) - err(1, "Reading from '%s'", cmd); - pclose(p); - - return split(ctx, buffer, "\n", NULL); -} - struct replace { struct replace *next; @@ -570,30 +470,6 @@ static struct replace *read_replacement_file(const char *depdir) return repl; } -static char *build_info(const void *ctx, const char *dir) -{ - char *file, *cfile, *cmd; - - cfile = talloc_asprintf(ctx, "%s/%s", dir, "_info.c"); - file = talloc_asprintf(cfile, "%s/%s", dir, "_info"); - cmd = talloc_asprintf(file, "gcc " CFLAGS " -o %s %s", file, cfile); - if (system(cmd) != 0) - errx(1, "Failed to compile %s", file); - - return file; -} - -static char **get_deps(const void *ctx, const char *dir) -{ - char **deps, *cmd; - - cmd = talloc_asprintf(ctx, "%s depends", build_info(ctx, dir)); - deps = lines_from_cmd(cmd, cmd); - if (!deps) - err(1, "Could not run '%s'", cmd); - return deps; -} - static char *parent_dir(const void *ctx, const char *dir) { char *parent, *slash; diff --git a/tools/split.c b/tools/split.c new file mode 100644 index 00000000..f5d016a9 --- /dev/null +++ b/tools/split.c @@ -0,0 +1,29 @@ +#include "tools.h" +#include "talloc/talloc.h" +#include + +/* This is a dumb one which copies. We could mangle instead. */ +char **split(const void *ctx, const char *text, const char *delims, + unsigned int *nump) +{ + char **lines = NULL; + unsigned int max = 64, num = 0; + + lines = talloc_array(ctx, char *, max+1); + + while (*text != '\0') { + unsigned int len = strcspn(text, delims); + lines[num] = talloc_array(lines, char, len + 1); + memcpy(lines[num], text, len); + lines[num][len] = '\0'; + text += len; + text += strspn(text, delims); + if (++num == max) + lines = talloc_realloc(ctx, lines, char *, max*=2 + 1); + } + lines[num] = NULL; + if (nump) + *nump = num; + return lines; +} + diff --git a/tools/tools.h b/tools/tools.h new file mode 100644 index 00000000..841265f9 --- /dev/null +++ b/tools/tools.h @@ -0,0 +1,17 @@ +#ifndef CCAN_TOOLS_H +#define CCAN_TOOLS_H + +#define CFLAGS "-O3 -Wall -Wundef -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes -Wmissing-declarations -Werror -I." + +char **split(const void *ctx, const char *text, const char *delims, + unsigned int *nump); + +char **get_deps(const void *ctx, const char *dir); + +void *grab_fd(const void *ctx, int fd); +void *grab_file(const void *ctx, const char *filename); + +#define streq(a,b) (strcmp((a),(b)) == 0) + +#endif /* CCAN_TOOLS_H */ +