#include "test.h" #include #include #include static bool is_cover_file_name (const char *name) { #define CHAR(CH) (*p++ == CH) #define DIGIT() (isdigit (*p++)) const char *p = name; // *INDENT-OFF* return CHAR ('c') && CHAR ('o') && CHAR ('v') && CHAR ('e') && CHAR ('r') && DIGIT () && DIGIT () && DIGIT () && DIGIT () && CHAR ('.') && CHAR ('c') && CHAR ('n') && CHAR ('f'); // *INDENT-ON* #undef CHAR #undef DIGIT } static void schedule_cover_file (const char *dir, const char *name) { char path[512]; assert (dir[0]); assert (dir[strlen (dir) - 1] == '/'); assert (strlen (dir) + strlen (name) + 1 < sizeof path); sprintf (path, "%s%s", dir, name); FILE *file = fopen (path, "r"); if (!file) FATAL ("could not read '%s'", path); int status; if (fscanf (file, "c status %d\n", &status) != 1) FATAL ("parse error at line 1 in '%s': expected 'c status '", path); fclose (file); tissat_schedule_application (status, path); } #define MAX_COVER_FILES (1<<16) static char *cover_files[MAX_COVER_FILES]; static size_t size_cover_files; static void push_cover_file (const char *name) { assert (size_cover_files < MAX_COVER_FILES); char *tmp = malloc (strlen (name) + 1); cover_files[size_cover_files++] = strcpy (tmp, name); } static int cmp (const void *p, const void *q) { return strcmp (*(char **) p, *(char **) q); } static void sort_cover_files (void) { qsort (cover_files, size_cover_files, sizeof (char *), cmp); } void tissat_schedule_coverage (void) { if (!tissat_found_test_directory) return; const char *path = "../test/cover/"; DIR *dir = opendir (path); if (!dir) FATAL ("could not open directory '%s' " "(even though '../test/' claimed to exist)", path); struct dirent *entry; const char *name; while ((entry = readdir (dir))) if (is_cover_file_name ((name = entry->d_name))) push_cover_file (name); closedir (dir); sort_cover_files (); for (size_t i = 0; i < size_cover_files; i++) schedule_cover_file (path, cover_files[i]); for (size_t i = 0; i < size_cover_files; i++) free (cover_files[i]); }