X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=tools%2Fnamespacize.c;h=f1a9374e8fee1e363a549db84d324a81ecf132bc;hp=f5dced5dd7201b184a979c3c48a2ecc7f22c2bf2;hb=09d5cd70d7e8105a003ed9583eadb077de014f3b;hpb=cac3b2dd745bd86b26b176f06a7545bfa67112eb diff --git a/tools/namespacize.c b/tools/namespacize.c index f5dced5d..f1a9374e 100644 --- a/tools/namespacize.c +++ b/tools/namespacize.c @@ -1,5 +1,4 @@ /* Code to move a ccan module into the ccan_ namespace. */ -#include #include #include #include @@ -11,9 +10,10 @@ #include #include #include "ccan/str/str.h" -#include "ccan/str_talloc/str_talloc.h" -#include "ccan/grab_file/grab_file.h" -#include "ccan/talloc/talloc.h" +#include "ccan/take/take.h" +#include "ccan/rbuf/rbuf.h" +#include "ccan/tal/path/path.h" +#include "ccan/err/err.h" #include "tools.h" static bool verbose = false; @@ -41,19 +41,18 @@ static char **get_dir(const char *dir) { DIR *d; struct dirent *ent; - char **names = NULL; - unsigned int size = 0; + char **names = tal_arr(NULL, char *, 0), *n; d = opendir(dir); if (!d) return NULL; while ((ent = readdir(d)) != NULL) { - names = talloc_realloc(dir, names, char *, size + 2); - names[size++] - = talloc_asprintf(names, "%s/%s", dir, ent->d_name); + n = tal_fmt(names, "%s/%s", dir, ent->d_name); + tal_expand(&names, &n, 1); } - names[size++] = NULL; + n = NULL; + tal_expand(&names, &n, 1); closedir(d); return names; } @@ -85,9 +84,9 @@ static void add_replace(struct replace **repl, const char *str) if (streq(i->string, str)) return; - new = talloc(*repl, struct replace); + new = tal(*repl, struct replace); new->next = *repl; - new->string = talloc_strdup(new, str); + new->string = tal_strdup(new, str); *repl = new; } @@ -96,21 +95,12 @@ static void add_replace_tok(struct replace **repl, const char *s) struct replace *new; unsigned int len = strspn(s, IDENT_CHARS); - new = talloc(*repl, struct replace); + new = tal(*repl, struct replace); new->next = *repl; - new->string = talloc_strndup(new, s, len); + new->string = tal_strndup(new, s, len); *repl = new; } -static char *basename(const void *ctx, const char *dir) -{ - char *p = strrchr(dir, '/'); - - if (!p) - return (char *)dir; - return talloc_strdup(ctx, p+1); -} - static void look_for_macros(char *contents, struct replace **repl) { char *p; @@ -120,7 +110,7 @@ static void look_for_macros(char *contents, struct replace **repl) for (p = contents; *p; p++) { if (*p == '\n') state = LINESTART; - else if (!isspace(*p)) { + else if (!cisspace(*p)) { if (state == LINESTART && *p == '#') state = HASH; else if (state==HASH && !strncmp(p, "define", 6)) { @@ -132,7 +122,7 @@ static void look_for_macros(char *contents, struct replace **repl) len = strspn(p, IDENT_CHARS); if (len) { char *s; - s = talloc_strndup(contents, p, len); + s = tal_strndup(contents, p, len); /* Don't wrap idempotent wrappers */ if (!strstarts(s, "CCAN_")) { verbose("Found %s\n", s); @@ -172,7 +162,7 @@ static char *get_statement(const void *ctx, char **p) { unsigned brackets = 0; bool seen_brackets = false; - char *answer = talloc_strdup(ctx, ""); + char *answer = tal_strdup(ctx, ""); for (;;) { if ((*p)[0] == '/' && (*p)[1] == '/') @@ -186,9 +176,9 @@ static char *get_statement(const void *ctx, char **p) return answer; } /* Compress whitespace into a single ' ' */ - if (isspace(c)) { + if (cisspace(c)) { c = ' '; - while (isspace((*p)[1])) + while (cisspace((*p)[1])) (*p)++; } else if (c == '{' || c == '(' || c == '[') { if (c == '(') @@ -198,10 +188,7 @@ static char *get_statement(const void *ctx, char **p) brackets--; if (answer[0] != '\0' || c != ' ') { - answer = talloc_realloc(NULL, answer, char, - strlen(answer) + 2); - answer[strlen(answer)+1] = '\0'; - answer[strlen(answer)] = c; + tal_append_fmt(&answer, "%c", c); } if (c == '}' && seen_brackets && brackets == 0) { (*p)++; @@ -269,8 +256,9 @@ static void analyze_headers(const char *dir, struct replace **repl) char *hdr, *contents; /* Get hold of header, assume that's it. */ - hdr = talloc_asprintf(dir, "%s/%s.h", dir, basename(dir, dir)); - contents = grab_file(dir, hdr, NULL); + hdr = tal_fmt(dir, "%s/%s.h", dir, path_basename(dir, dir)); + + contents = tal_grab_file(dir, hdr, NULL); if (!contents) err(1, "Reading %s", hdr); @@ -287,7 +275,7 @@ static void analyze_headers(const char *dir, struct replace **repl) static void write_replacement_file(const char *dir, struct replace **repl) { - char *replname = talloc_asprintf(dir, "%s/.namespacize", dir); + char *replname = tal_fmt(dir, "%s/.namespacize", dir); int fd; struct replace *r; @@ -313,10 +301,9 @@ static void write_replacement_file(const char *dir, struct replace **repl) close(fd); } -static int unlink_destroy(char *name) +static void unlink_destroy(char *name) { unlink(name); - return 0; } static char *find_word(char *f, const char *str) @@ -325,11 +312,11 @@ static char *find_word(char *f, const char *str) while ((p = strstr(p, str)) != NULL) { /* Check it's not in the middle of a word. */ - if (p > f && (isalnum(p[-1]) || p[-1] == '_')) { + if (p > f && (cisalnum(p[-1]) || p[-1] == '_')) { p++; continue; } - if (isalnum(p[strlen(str)]) || p[strlen(str)] == '_') { + if (cisalnum(p[strlen(str)]) || p[strlen(str)] == '_') { p++; continue; } @@ -346,7 +333,7 @@ static const char *rewrite_file(const char *filename, int fd; verbose("Rewriting %s\n", filename); - file = grab_file(filename, filename, NULL); + file = tal_grab_file(filename, filename, NULL); if (!file) err(1, "Reading file %s", filename); @@ -355,11 +342,11 @@ static const char *rewrite_file(const char *filename, while ((p = find_word(file, repl->string)) != NULL) { unsigned int off; - char *new = talloc_array(file, char, strlen(file)+6); + char *new = tal_arr(file, char, strlen(file)+6); off = p - file; memcpy(new, file, off); - if (isupper(repl->string[0])) + if (cisupper(repl->string[0])) memcpy(new + off, "CCAN_", 5); else memcpy(new + off, "ccan_", 5); @@ -369,13 +356,12 @@ static const char *rewrite_file(const char *filename, } /* If we exit for some reason, we want this erased. */ - newname = talloc_asprintf(talloc_autofree_context(), "%s.tmp", - filename); + newname = tal_fmt(autofree(), "%s.tmp", filename); fd = open(newname, O_WRONLY|O_CREAT|O_EXCL, 0644); if (fd < 0) err(1, "Creating %s", newname); - talloc_set_destructor(newname, unlink_destroy); + tal_add_destructor(newname, unlink_destroy); if (write(fd, file, strlen(file)) != strlen(file)) { if (errno == 0) errx(1, "Short write to %s: disk full?", newname); @@ -402,7 +388,7 @@ static void setup_adjust_files(const char *dir, if (strends(*files, "/test")) setup_adjust_files(*files, repl, adj); else if (strends(*files, ".c") || strends(*files, ".h")) { - struct adjusted *a = talloc(dir, struct adjusted); + struct adjusted *a = tal(dir, struct adjusted); a->next = *adj; a->file = *files; a->tmpfile = rewrite_file(a->file, repl); @@ -415,7 +401,7 @@ static void setup_adjust_files(const char *dir, static void rename_files(const struct adjusted *adj) { while (adj) { - if (rename(adj->tmpfile, adj->file) != 0) + if (!move_file(adj->tmpfile, adj->file)) warn("Could not rename over '%s', we're in trouble", adj->file); adj = adj->next; @@ -429,7 +415,7 @@ static void convert_dir(const char *dir) struct adjusted *adj = NULL; /* Remove any ugly trailing slashes. */ - name = talloc_strdup(NULL, dir); + name = tal_strdup(NULL, dir); while (strends(name, "/")) name[strlen(name)-1] = '\0'; @@ -437,54 +423,43 @@ static void convert_dir(const char *dir) write_replacement_file(name, &replace); setup_adjust_files(name, replace, &adj); rename_files(adj); - talloc_free(name); - talloc_free(replace); + tal_free(name); + tal_free(replace); } static struct replace *read_replacement_file(const char *depdir) { struct replace *repl = NULL; - char *replname = talloc_asprintf(depdir, "%s/.namespacize", depdir); + char *replname = tal_fmt(depdir, "%s/.namespacize", depdir); char *file, **line; - file = grab_file(replname, replname, NULL); + file = tal_grab_file(replname, replname, NULL); if (!file) { if (errno != ENOENT) err(1, "Opening %s", replname); return NULL; } - for (line = strsplit(file, file, "\n", NULL); *line; line++) + for (line = tal_strsplit(file, file, "\n", STR_EMPTY_OK); *line; line++) add_replace(&repl, *line); return repl; } -static char *parent_dir(const void *ctx, const char *dir) -{ - char *parent, *slash; - - parent = talloc_strdup(ctx, dir); - slash = strrchr(parent, '/'); - if (slash) - *slash = '\0'; - else - parent = talloc_strdup(ctx, "."); - return parent; -} - static void adjust_dir(const char *dir) { - char *parent = parent_dir(talloc_autofree_context(), dir); + char *parent = path_dirname(autofree(), dir); char **deps; verbose("Adjusting %s\n", dir); verbose_indent(); - for (deps = get_deps(parent, dir, false); *deps; deps++) { + for (deps = get_deps(parent, dir, "depends", false, compile_info); + *deps; + deps++) { char *depdir; struct adjusted *adj = NULL; struct replace *repl; - depdir = talloc_asprintf(parent, "%s/%s", parent, *deps); + depdir = tal_fmt(parent, "%s/%s", parent, *deps); repl = read_replacement_file(depdir); if (repl) { verbose("%s has been namespacized\n", depdir); @@ -492,33 +467,37 @@ static void adjust_dir(const char *dir) rename_files(adj); } else verbose("%s has not been namespacized\n", depdir); - talloc_free(depdir); + tal_free(depdir); } verbose_unindent(); - talloc_free(parent); + tal_free(parent); } static void adjust_dependents(const char *dir) { - char *parent = parent_dir(NULL, dir); - char *base = basename(parent, dir); + char *parent = path_dirname(NULL, dir); + char *base = path_basename(parent, dir); char **file; verbose("Looking for dependents in %s\n", parent); verbose_indent(); for (file = get_dir(parent); *file; file++) { - char *infoc, **deps; + char *info, **deps; bool isdep = false; - if (basename(*file, *file)[0] == '.') + if (path_basename(*file, *file)[0] == '.') continue; - infoc = talloc_asprintf(*file, "%s/_info.c", *file); - if (access(infoc, R_OK) != 0) + info = tal_fmt(*file, "%s/_info", *file); + if (access(info, R_OK) != 0) continue; - for (deps = get_deps(*file, *file, false); *deps; deps++) { - if (streq(*deps, base)) + for (deps = get_deps(*file, *file, "depends", false, + compile_info); + *deps; deps++) { + if (!strstarts(*deps, "ccan/")) + continue; + if (streq(*deps + strlen("ccan/"), base)) isdep = true; } if (isdep)