#include <tools/tools.h>
#include <ccan/talloc/talloc.h>
#include <ccan/str/str.h>
+#include <ccan/cast/cast.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
/* Creates and adds an example file. */
static char *add_example(struct manifest *m, struct ccan_file *source,
- bool keep,
struct doc_section *example)
{
- char *name;
+ char *name, *linemarker;
unsigned int i;
int fd;
struct ccan_file *f;
while (strchr(name, ' '))
*strchr(name, ' ') = '_';
- name = maybe_temp_file(m, ".c", keep, name);
+ name = temp_file(m, ".c", name);
f = new_ccan_file(m, talloc_dirname(m, name), talloc_basename(m, name));
talloc_steal(f, name);
list_add_tail(&m->examples, &f->list);
return talloc_asprintf(m, "Creating temporary file %s: %s",
f->fullname, strerror(errno));
+ /* Add #line to demark where we are from, so errors are correct! */
+ linemarker = talloc_asprintf(f, "#line %i \"%s\"\n",
+ example->srcline+2, source->fullname);
+ write(fd, linemarker, strlen(linemarker));
+
for (i = 0; i < example->num_lines; i++) {
if (write(fd, example->lines[i], strlen(example->lines[i]))
!= strlen(example->lines[i])
|| write(fd, "\n", 1) != 1) {
close(fd);
- return "Failure writing to temporary file";
+ return cast_const(char *,
+ "Failure writing to temporary file");
}
}
close(fd);
/* FIXME: We should have one example per function in header. */
static void extract_examples(struct manifest *m,
- bool keep,
unsigned int *timeleft,
struct score *score)
{
score->total = 2;
list_for_each(get_ccan_file_docs(m->info_file), d, list) {
if (streq(d->type, "example")) {
- score->error = add_example(m, m->info_file, keep, d);
+ score->error = add_example(m, m->info_file, d);
if (score->error)
return;
have_info_example = true;
mainh = f;
list_for_each(get_ccan_file_docs(f), d, list) {
if (streq(d->type, "example")) {
- score->error = add_example(m, f, keep, d);
+ score->error = add_example(m, f, d);
if (score->error)
return;
have_header_example = true;
}
}
+ /* We don't fail ccanlint for this. */
+ score->pass = true;
if (have_info_example && have_header_example) {
score->score = score->total;
- score->pass = true;
return;
}
score_file_error(score, mainh, 0, "No Example: section");
score->score = have_info_example + have_header_example;
- /* We pass if we find any example. */
- score->pass = score->score != 0;
}
struct ccanlint examples_exist = {