return list;
}
+/* FIXME: Merge this into one place. */
static char *obj_list(const struct manifest *m, struct ccan_file *f)
{
char *list = talloc_strdup(m, "");
- struct ccan_file *i;
+ struct manifest *subm;
char **lines;
- /* Object files for this module. */
- list_for_each(&m->c_files, i, list)
- list = talloc_asprintf_append(list, " %s", i->compiled);
+ /* This module. */
+ if (m->compiled)
+ list = talloc_asprintf_append(list, " %s", m->compiled);
/* Other ccan modules we depend on. */
- list_for_each(&m->dep_dirs, i, list) {
- if (i->compiled)
- list = talloc_asprintf_append(list, " %s", i->compiled);
+ list_for_each(&m->deps, subm, list) {
+ if (subm->compiled)
+ list = talloc_asprintf_append(list, " %s",
+ subm->compiled);
}
/* Other modules implied by includes. */
}
return talloc_asprintf_append(others, "printf(\"%%p\", %.*s);\n",
- (unsigned)(end - p + 1), p);
+ (unsigned)(end - p), p+1);
}
static void strip_leading_whitespace(char **lines)
return ret;
}
+/* Only handles very simple comments. */
+static char *strip_comment(const void *ctx, const char *orig_line)
+{
+ char *p, *ret = talloc_strdup(ctx, orig_line);
+
+ p = strstr(ret, "/*");
+ if (!p)
+ p = strstr(ret, "//");
+ if (p)
+ *p = '\0';
+ return ret;
+}
+
static char *mangle(struct manifest *m, char **lines)
{
char *ret, *use_funcs = NULL, *why;
/* Primitive, very primitive. */
for (i = 0; lines[i]; i++) {
+ char *line = strip_comment(ret, lines[i]);
+
/* } at start of line ends a function. */
if (in_function) {
- if (lines[i][0] == '}')
+ if (line[0] == '}')
in_function = false;
} else {
/* Character at start of line, with ( and no ;
* == function start. Ignore comments. */
- if (!isspace(lines[i][0])
- && strchr(lines[i], '(')
- && !strchr(lines[i], ';')
- && !strstr(lines[i], "//")) {
+ if (!isspace(line[0])
+ && strchr(line, '(')
+ && !strchr(line, ';')
+ && !strstr(line, "//")) {
in_function = true;
- if (strncmp(lines[i], "int main", 8) == 0)
+ if (strncmp(line, "int main", 8) == 0)
has_main = true;
- if (strncmp(lines[i], "static", 6) == 0) {
+ if (strncmp(line, "static", 6) == 0) {
use_funcs = add_func(use_funcs,
- lines[i]);
+ line);
}
}
}
/* ... means elided code. */
- if (strcmp(lines[i], "...") == 0) {
+ if (strcmp(line, "...") == 0) {
if (!in_function && !has_main
&& looks_internal(lines + i + 1, &why)) {
/* This implies we start a function here. */
warnings = true;
score->error = "Compiling extracted example"
" gave warnings";
- score_file_error(score, file[j], 0, err[j]);
+ error = talloc_asprintf(score,
+ "Example:\n"
+ "%s\n"
+ "Compiler:\n"
+ "%s",
+ get_ccan_file_contents(file[j]),
+ err[j]);
+ score_file_error(score, file[j], 0, error);
goto next;
}
}
.can_run = can_run,
};
-REGISTER_TEST(examples_compile, &has_examples, &build_objs, NULL);
+REGISTER_TEST(examples_compile, &has_examples, &build, NULL);