#include <tools/ccanlint/ccanlint.h>
#include <tools/tools.h>
-#include <ccan/talloc/talloc.h>
#include <ccan/str/str.h>
+#include <ccan/take/take.h>
#include <ccan/foreach/foreach.h>
-#include <ccan/str_talloc/str_talloc.h>
+#include <ccan/tal/grab_file/grab_file.h>
#include "tests_pass.h"
#include <sys/types.h>
#include <sys/stat.h>
static const char *can_run_vg(struct manifest *m)
{
if (!do_valgrind)
- return talloc_asprintf(m, "No valgrind support");
+ return tal_fmt(m, "No valgrind support");
return NULL;
}
static char **extract_matching(const char *prefix, char *lines[])
{
unsigned int i, num_ret = 0;
- char **ret = talloc_array(lines, char *, talloc_array_length(lines));
+ char **ret = tal_arr(lines, char *, tal_count(lines));
- for (i = 0; i < talloc_array_length(lines) - 1; i++) {
+ for (i = 0; i < tal_count(lines) - 1; i++) {
if (strstarts(lines[i], prefix)) {
- ret[num_ret++] = talloc_steal(ret, lines[i]);
+ ret[num_ret++] = tal_strdup(ret, lines[i]);
lines[i] = (char *)"";
}
}
ret[num_ret++] = NULL;
- /* Make sure length is correct! */
- return talloc_realloc(NULL, ret, char *, num_ret);
+ /* Make sure tal_count is correct! */
+ tal_resize(&ret, num_ret);
+ return ret;
}
static char *get_leaks(char *lines[], char **errs)
{
- char *leaks = talloc_strdup(lines, "");
+ char *leaks = tal_strdup(lines, "");
unsigned int i;
- for (i = 0; i < talloc_array_length(lines) - 1; i++) {
+ for (i = 0; i < tal_count(lines) - 1; i++) {
if (strstr(lines[i], " lost ")) {
/* A leak... */
if (strstr(lines[i], " definitely lost ")) {
/* Definite leak, report. */
while (lines[i] && !blank_line(lines[i])) {
- leaks = talloc_append_string(leaks,
- lines[i]);
- leaks = talloc_append_string(leaks,
- "\n");
+ tal_append_fmt(&leaks, "%s\n",
+ lines[i]);
i++;
}
} else
} else {
/* A real error. */
while (lines[i] && !blank_line(lines[i])) {
- *errs = talloc_append_string(*errs, lines[i]);
- *errs = talloc_append_string(*errs, "\n");
+ if (!*errs)
+ *errs = tal_fmt(NULL, "%s\n", lines[i]);
+ else
+ tal_append_fmt(errs, "%s\n", lines[i]);
i++;
}
}
/* Returns leaks, and sets errs[] */
static char *analyze_output(const char *output, char **errs)
{
- char *leaks = talloc_strdup(output, "");
+ char *leaks = tal_strdup(output, "");
unsigned int i;
- char **lines = strsplit(output, output, "\n");
+ char **lines = tal_strsplit(output, output, "\n", STR_EMPTY_OK);
- *errs = talloc_strdup(output, "");
- for (i = 0; i < talloc_array_length(lines) - 1; i++) {
+ *errs = tal_strdup(output, "");
+ for (i = 0; i < tal_count(lines) - 1; i++) {
unsigned int preflen = strspn(lines[i], "=0123456789");
char *prefix, **sublines;
if (preflen == 0)
continue;
- prefix = talloc_strndup(output, lines[i], preflen);
+ prefix = tal_strndup(output, lines[i], preflen);
sublines = extract_matching(prefix, lines);
- leaks = talloc_append_string(leaks, get_leaks(sublines, errs));
+ leaks = tal_strcat(output, take(leaks),
+ take(get_leaks(sublines, errs)));
}
if (!leaks[0]) {
- talloc_free(leaks);
+ tal_free(leaks);
leaks = NULL;
}
if (!(*errs)[0]) {
- talloc_free(*errs);
+ tal_free(*errs);
*errs = NULL;
}
return leaks;
static const char *concat(struct score *score, char *bits[])
{
unsigned int i;
- char *ret = talloc_strdup(score, "");
+ char *ret = tal_strdup(score, "");
for (i = 0; bits[i]; i++) {
if (i)
- ret = talloc_append_string(ret, " ");
- ret = talloc_append_string(ret, bits[i]);
+ ret = tal_strcat(score, take(ret), " ");
+ ret = tal_strcat(score, take(ret), bits[i]);
}
return ret;
}
/* FIXME: Run examples, too! */
static void do_run_tests_vg(struct manifest *m,
- unsigned int *timeleft,
+ unsigned int *timeleft UNNEEDED,
struct score *score)
{
struct ccan_file *i;
continue;
}
- output = talloc_grab_file(i, i->valgrind_log, NULL);
+ output = grab_file(i, i->valgrind_log);
/* No valgrind errors? */
if (!output || output[0] == '\0') {
err = NULL;
}
static void do_leakcheck_vg(struct manifest *m,
- unsigned int *timeleft,
+ unsigned int *timeleft UNNEEDED,
struct score *score)
{
struct ccan_file *i;
return;
first = list_top(&score->per_file_errors, struct file_error, list);
- command = talloc_asprintf(m, "valgrind --leak-check=full --db-attach=yes%s %s",
- concat(score,
- per_file_options(&tests_pass_valgrind,
- first->file)),
- first->file->compiled[COMPILE_NORMAL]);
- if (system(command))
+ command = tal_fmt(m, "valgrind --leak-check=full --db-attach=yes%s %s %s",
+ concat(score, per_file_options(&tests_pass_valgrind,
+ first->file)),
+ valgrind_suppress, first->file->compiled[COMPILE_NORMAL]);
+ if (system(command)) {
doesnt_matter();
+ }
}
struct ccanlint tests_pass_valgrind = {