X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=tools%2Fnamespacize.c;h=100d79428a1a1de6877c298d48c11e3bab5a0245;hp=f5dced5dd7201b184a979c3c48a2ecc7f22c2bf2;hb=a446f1d4d161d66bbb19ba2551cf6429a4865964;hpb=cac3b2dd745bd86b26b176f06a7545bfa67112eb;ds=sidebyside diff --git a/tools/namespacize.c b/tools/namespacize.c index f5dced5d..100d7942 100644 --- a/tools/namespacize.c +++ b/tools/namespacize.c @@ -53,7 +53,8 @@ static char **get_dir(const char *dir) names[size++] = talloc_asprintf(names, "%s/%s", dir, ent->d_name); } - names[size++] = NULL; + /* FIXME: if the loop doesn't run at least once, we'll segfault here */ + names[size] = NULL; closedir(d); return names; } @@ -102,15 +103,6 @@ static void add_replace_tok(struct replace **repl, const char *s) *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 +112,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)) { @@ -186,9 +178,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 == '(') @@ -269,7 +261,7 @@ 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)); + hdr = talloc_asprintf(dir, "%s/%s.h", dir, talloc_basename(dir, dir)); contents = grab_file(dir, hdr, NULL); if (!contents) err(1, "Reading %s", hdr); @@ -325,11 +317,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; } @@ -359,7 +351,7 @@ static const char *rewrite_file(const char *filename, 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); @@ -415,7 +407,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; @@ -454,32 +446,19 @@ static struct replace *read_replacement_file(const char *depdir) return NULL; } - for (line = strsplit(file, file, "\n", NULL); *line; line++) + for (line = strsplit(file, file, "\n"); *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 = talloc_dirname(talloc_autofree_context(), 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, false, NULL); *deps; deps++) { char *depdir; struct adjusted *adj = NULL; struct replace *repl; @@ -500,25 +479,28 @@ static void adjust_dir(const char *dir) static void adjust_dependents(const char *dir) { - char *parent = parent_dir(NULL, dir); - char *base = basename(parent, dir); + char *parent = talloc_dirname(NULL, dir); + char *base = talloc_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 (talloc_basename(*file, *file)[0] == '.') continue; - infoc = talloc_asprintf(*file, "%s/_info.c", *file); - if (access(infoc, R_OK) != 0) + info = talloc_asprintf(*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, false, NULL); + *deps; deps++) { + if (!strstarts(*deps, "ccan/")) + continue; + if (streq(*deps + strlen("ccan/"), base)) isdep = true; } if (isdep)