#include <tools/ccanlint/ccanlint.h>
#include <tools/tools.h>
-#include <ccan/talloc/talloc.h>
+#include <ccan/tal/tal.h>
+#include <ccan/tal/str/str.h>
+#include <ccan/take/take.h>
#include <ccan/cast/cast.h>
#include <ccan/str/str.h>
#include <sys/types.h>
static void add_mod(struct manifest ***deps, struct manifest *m)
{
- unsigned int num = talloc_get_size(*deps) / sizeof(*deps);
- *deps = talloc_realloc(NULL, *deps, struct manifest *, num + 1);
+ unsigned int num = tal_count(*deps);
+ tal_resize(deps, num + 1);
(*deps)[num] = m;
}
-static bool have_mod(struct manifest *deps[], const char *basename)
+static bool have_mod(struct manifest *deps[], const char *modname)
{
unsigned int i;
- for (i = 0; i < talloc_get_size(deps) / sizeof(*deps); i++)
- if (strcmp(deps[i]->basename, basename) == 0)
+ for (i = 0; i < tal_count(deps); i++)
+ if (strcmp(deps[i]->modname, modname) == 0)
return true;
return false;
}
-static void add_dep(struct manifest ***deps, const char *basename)
+static void add_dep(struct manifest ***deps, const char *modname)
{
unsigned int i;
struct manifest *m;
char *errstr;
- if (have_mod(*deps, basename))
+ if (have_mod(*deps, modname))
return;
- m = get_manifest(*deps, talloc_asprintf(*deps, "%s/ccan/%s",
- ccan_dir, basename));
+ m = get_manifest(*deps,
+ tal_fmt(*deps, "%s/ccan/%s", ccan_dir, modname));
errstr = build_submodule(m, cflags, COMPILE_NORMAL);
if (errstr)
errx(1, "%s", errstr);
if (m->info_file) {
char **infodeps;
- infodeps = get_deps(m, m->dir, false, get_or_compile_info);
+ infodeps = get_deps(m, m->dir, "depends", false,
+ get_or_compile_info);
for (i = 0; infodeps[i]; i++) {
if (strstarts(infodeps[i], "ccan/"))
struct ccan_file *f)
{
char **lines;
- struct manifest **deps = talloc_array(f, struct manifest *, 0);
+ struct manifest **deps = tal_arr(f, struct manifest *, 0);
/* This one for a start. */
- add_dep(&deps, m->basename);
+ add_dep(&deps, m->modname);
/* Other modules implied by includes. */
for (lines = get_ccan_file_lines(f); *lines; lines++) {
- unsigned preflen = strspn(*lines, " \t");
- if (strstarts(*lines + preflen, "#include <ccan/")) {
- char *modname;
-
- modname = talloc_strdup(f, *lines + preflen
- + strlen("#include <ccan/"));
- modname[strcspn(modname, "/")] = '\0';
+ char *modname;
+ if (tal_strreg(f, *lines,
+ "^[ \t]*#[ \t]*include[ \t]*[<\"]"
+ "ccan/+(.+)/+[^/]+\\.h", &modname)) {
if (!have_mod(deps, modname))
add_dep(&deps, modname);
}
static char *example_obj_list(const void *ctx, struct manifest **deps)
{
- char *list = talloc_strdup(ctx, "");
+ char *list = tal_strdup(ctx, "");
unsigned int i;
- for (i = 0; i < talloc_array_length(deps); i++) {
+ for (i = 0; i < tal_count(deps); i++) {
if (deps[i]->compiled[COMPILE_NORMAL])
- list = talloc_asprintf_append(list, " %s",
- deps[i]->compiled
- [COMPILE_NORMAL]);
+ tal_append_fmt(&list, " %s",
+ deps[i]->compiled[COMPILE_NORMAL]);
}
return list;
}
static char *example_lib_list(const void *ctx, struct manifest **deps)
{
- char *list = talloc_strdup(ctx, "");
+ char *list = tal_strdup(ctx, "");
char **libs;
unsigned int i, j;
/* FIXME: This doesn't uniquify. */
- for (i = 0; i < talloc_array_length(deps); i++) {
- libs = get_libs(ctx, deps[i]->dir, false, get_or_compile_info);
+ for (i = 0; i < tal_count(deps); i++) {
+ libs = get_libs(ctx, deps[i]->dir, NULL, get_or_compile_info);
for (j = 0; libs[j]; j++)
- list = talloc_asprintf_append(list, "-l%s ", libs[j]);
+ tal_append_fmt(&list, "-l%s ", libs[j]);
}
return list;
}
return true;
}
-static char *start_main(char *ret, const char *why)
+static void start_main(char **ret, const char *why)
{
- return talloc_asprintf_append(ret,
+ tal_append_fmt(ret,
"/* The example %s, so fake function wrapper inserted */\n"
"int main(int argc, char *argv[])\n"
- "{\n", why);
+ "{\n", why);
}
/* We only handle simple function definitions here. */
-static char *add_func(char *others, const char *line)
+static char *add_func(const tal_t *ctx, char *others, const char *line)
{
const char *p, *end = strchr(line, '(') - 1;
+ char *use;
+
while (cisspace(*end)) {
end--;
if (end == line)
return others;
}
- return talloc_asprintf_append(others, "printf(\"%%p\", %.*s);\n",
- (unsigned)(end - p), p+1);
+ use = tal_fmt(ctx, "printf(\"%%p\", %.*s);\n",
+ (unsigned)(end - p), p+1);
+ if (others)
+ use = tal_strcat(ctx, take(others), take(use));
+
+ return use;
}
static void strip_leading_whitespace(char **lines)
for (i = 0; prev[i]; i++);
prev_total = i;
- ret = talloc_array(ctx, char *, 1 +lines_total + prev_total + 1);
- ret[0] = talloc_asprintf(ret, "/* The example %s, thus %s */",
- why, reasoning);
+ ret = tal_arr(ctx, char *, 1 + lines_total + prev_total + 1);
+ ret[0] = tal_fmt(ret, "/* The example %s, thus %s */",
+ why, reasoning);
memcpy(ret+1, lines, count * sizeof(ret[0]));
memcpy(ret+1 + count, prev, prev_total * sizeof(ret[0]));
memcpy(ret+1 + count + prev_total, lines + count,
/* Only handles very simple comments. */
static char *strip_comment(const void *ctx, const char *orig_line)
{
- char *p, *ret = talloc_strdup(ctx, orig_line);
+ char *p, *ret = tal_strdup(ctx, orig_line);
p = strstr(ret, "/*");
if (!p)
bool in_function = false, fake_function = false, has_main = false;
unsigned int i;
- ret = talloc_asprintf(m,
- "/* Include header from module. */\n"
- "#include <ccan/%s/%s.h>\n"
- "/* Prepend a heap of headers. */\n"
- "#include <assert.h>\n"
- "#include <err.h>\n"
- "#include <errno.h>\n"
- "#include <fcntl.h>\n"
- "#include <limits.h>\n"
- "#include <stdbool.h>\n"
- "#include <stdint.h>\n"
- "#include <stdio.h>\n"
- "#include <stdlib.h>\n"
- "#include <string.h>\n"
- "#include <sys/stat.h>\n"
- "#include <sys/types.h>\n"
- "#include <unistd.h>\n",
- m->basename, m->basename);
-
- ret = talloc_asprintf_append(ret, "/* Useful dummy functions. */\n"
+ ret = tal_fmt(m,
+ "/* Include header from module. */\n"
+ "#include <ccan/%s/%s.h>\n"
+ "/* Prepend a heap of headers. */\n"
+ "#include <assert.h>\n"
+ "#include <err.h>\n"
+ "#include <errno.h>\n"
+ "#include <fcntl.h>\n"
+ "#include <limits.h>\n"
+ "#include <stdbool.h>\n"
+ "#include <stdint.h>\n"
+ "#include <stdio.h>\n"
+ "#include <stdlib.h>\n"
+ "#include <string.h>\n"
+ "#include <sys/stat.h>\n"
+ "#include <sys/types.h>\n"
+ "#include <unistd.h>\n",
+ m->modname, m->basename);
+
+ ret = tal_strcat(m, take(ret), "/* Useful dummy functions. */\n"
"extern int somefunc(void);\n"
"int somefunc(void) { return 0; }\n"
"extern char somestring[];\n"
if (looks_internal(lines, &why)) {
/* Wrap it all in main(). */
- ret = start_main(ret, why);
+ start_main(&ret, why);
fake_function = true;
in_function = true;
has_main = true;
} else
- ret = talloc_asprintf_append(ret,
+ tal_append_fmt(&ret,
"/* The example %s, so didn't wrap in main() */\n",
- why);
+ why);
/* Primitive, very primitive. */
for (i = 0; lines[i]; i++) {
if (strncmp(line, "int main", 8) == 0)
has_main = true;
if (strncmp(line, "static", 6) == 0) {
- use_funcs = add_func(use_funcs,
+ use_funcs = add_func(m, use_funcs,
line);
}
}
if (!in_function && !has_main
&& looks_internal(lines + i + 1, &why)) {
/* This implies we start a function here. */
- ret = start_main(ret, why);
+ start_main(&ret, why);
has_main = true;
fake_function = true;
in_function = true;
}
- ret = talloc_asprintf_append(ret,
- "/* ... removed */\n");
+ ret = tal_strcat(m, take(ret), "/* ... removed */\n");
continue;
}
- ret = talloc_asprintf_append(ret, "%s\n", lines[i]);
+ ret = tal_strcat(m, take(ret), lines[i]);
+ ret = tal_strcat(m, take(ret), "\n");
}
if (!has_main) {
- ret = talloc_asprintf_append(ret,
+ ret = tal_strcat(m, take(ret),
"/* Need a main to link successfully. */\n"
"int main(void)\n{\n");
fake_function = true;
}
if (use_funcs) {
- ret = talloc_asprintf_append(ret,
- "/* Get rid of unused warnings"
- " by printing addresses of"
- " static funcs. */\n");
+ ret = tal_strcat(m, take(ret),
+ "/* Get rid of unused warnings"
+ " by printing addresses of"
+ " static funcs. */\n");
if (!fake_function) {
- ret = talloc_asprintf_append(ret,
- "int use_funcs(void);\n"
- "int use_funcs(void) {\n");
+ ret = tal_strcat(m, take(ret),
+ "int use_funcs(void);\n"
+ "int use_funcs(void) {\n");
fake_function = true;
}
- ret = talloc_asprintf_append(ret, " %s\n", use_funcs);
+ tal_append_fmt(&ret, " %s\n", use_funcs);
}
if (fake_function)
- ret = talloc_asprintf_append(ret, "return 0;\n"
- "}\n");
+ ret = tal_strcat(m, take(ret), "return 0;\n}\n");
return ret;
}
struct ccan_file *f;
name = temp_file(example, ".c",
- talloc_asprintf(m, "%s/mangled-%s",
- m->dir, example->name));
+ tal_fmt(m, "%s/mangled-%s", m->dir, example->name));
f = new_ccan_file(example,
- talloc_dirname(example, name),
- talloc_basename(example, name));
- talloc_steal(f, name);
+ tal_dirname(example, name),
+ tal_basename(example, name));
+ tal_steal(f, name);
fd = open(f->fullname, O_WRONLY | O_CREAT | O_EXCL, 0600);
if (fd < 0)
return NULL;
}
close(fd);
- f->contents = talloc_steal(f, contents);
+ f->contents = tal_steal(f, contents);
list_add(&m->mangled_examples, &f->list);
return f;
}
" adding headers both failed";
} else {
if (num == 3) {
- error = talloc_asprintf(score,
+ error = tal_fmt(score,
"Standalone example:\n"
"%s\n"
"Errors: %s\n\n"
get_ccan_file_contents(file[2]),
err[2]);
} else {
- error = talloc_asprintf(score,
+ error = tal_fmt(score,
"Standalone example:\n"
"%s\n"
"Errors: %s\n\n"