"static void *func(void *h, size_t hl, void *n, size_t nl) {\n"
"return memmem(h, hl, n, nl);"
"}\n", },
+ { "HAVE_MEMRCHR", DEFINES_FUNC, NULL, NULL,
+ "#define _GNU_SOURCE\n"
+ "#include <string.h>\n"
+ "static void *func(void *s, int c, size_t n) {\n"
+ "return memrchr(s, c, n);"
+ "}\n", },
{ "HAVE_MMAP", DEFINES_FUNC, NULL, NULL,
"#include <sys/mman.h>\n"
"static void *func(int fd) {\n"
"#include <sys/termios.h>\n" },
{ "HAVE_TYPEOF", INSIDE_MAIN, NULL, NULL,
"__typeof__(argc) i; i = argc; return i == argc ? 0 : 1;" },
+ { "HAVE_UNALIGNED_ACCESS", DEFINES_EVERYTHING|EXECUTE, NULL, NULL,
+ "#include <string.h>\n"
+ "int main(int argc, char *argv[]) {\n"
+ " char pad[sizeof(int *) * 1];\n"
+ " strncpy(pad, argv[0], sizeof(pad));\n"
+ " int *x = (int *)pad, *y = (int *)(pad + 1);\n"
+ " return *x == *y;\n"
+ "}\n" },
{ "HAVE_UTIME", DEFINES_FUNC, NULL, NULL,
"#include <sys/types.h>\n"
"#include <utime.h>\n"
test->done = true;
return test->answer;
}
+ if (deps[len])
+ free(dep);
+
deps += len;
deps += strspn(deps, " ");
}
cmd = connect_args(argv, " -o " OUTPUT_FILE " " INPUT_FILE);
for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++)
run_test(cmd, &tests[i]);
+ free(cmd);
unlink(OUTPUT_FILE);
unlink(INPUT_FILE);
printf("#define _GNU_SOURCE /* Always use GNU extensions. */\n");
printf("#endif\n");
printf("#define CCAN_COMPILER \"%s\"\n", argv[1]);
- printf("#define CCAN_CFLAGS \"%s\"\n\n", connect_args(argv+1, ""));
+ cmd = connect_args(argv+1, "");
+ printf("#define CCAN_CFLAGS \"%s\"\n\n", cmd);
+ free(cmd);
/* This one implies "#include <ccan/..." works, eg. for tdb2.h */
printf("#define HAVE_CCAN 1\n");
for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++)