diff options
author | Timotej Kapus <tk1713@ic.ac.uk> | 2020-02-25 11:05:37 +0000 |
---|---|---|
committer | Cristian Cadar <c.cadar@imperial.ac.uk> | 2020-09-17 18:17:25 +0100 |
commit | 2eb75ac973f7dace65c4d7179540a658b0113d4c (patch) | |
tree | e65e5880f80d127e6c74000758b1adee9b7f5ad7 /tools/gen-bout/gen-bout.cpp | |
parent | 52dfb5246697dc68f007e058f817b23310cae708 (diff) | |
download | klee-2eb75ac973f7dace65c4d7179540a658b0113d4c.tar.gz |
[gen-bout] Support multiple symbolic files
Diffstat (limited to 'tools/gen-bout/gen-bout.cpp')
-rw-r--r-- | tools/gen-bout/gen-bout.cpp | 89 |
1 files changed, 60 insertions, 29 deletions
diff --git a/tools/gen-bout/gen-bout.cpp b/tools/gen-bout/gen-bout.cpp index 0d7360bc..f8fa5d4e 100644 --- a/tools/gen-bout/gen-bout.cpp +++ b/tools/gen-bout/gen-bout.cpp @@ -139,44 +139,75 @@ int main(int argc, char *argv[]) { } if (file_counter > 0) { - FILE *fp; - struct stat64 file_stat; - char *content_filename = content_filenames_list[file_counter - 1]; - - if ((fp = fopen(content_filename, "r")) == NULL || - stat64(content_filename, &file_stat) < 0) { - fprintf(stderr, "Failure opening %s\n", content_filename); - print_usage_and_exit(argv[0]); - } - - long nbytes = file_stat.st_size; char filename[7] = "A-data"; char statname[12] = "A-data-stat"; - - unsigned char *file_content, *fptr; - if ((file_content = (unsigned char *)malloc(nbytes)) == NULL) { - fputs("Memory allocation failure\n", stderr); - exit(1); + char sym_file_name = 'A'; + FILE *fp[file_counter]; + unsigned char *file_content[file_counter]; + struct stat64 file_stat[file_counter]; + long max_file_size = 0; + + for (unsigned current_file = 0; current_file < file_counter; + current_file++) { + char *content_filename = content_filenames_list[current_file]; + + if ((fp[current_file] = fopen(content_filename, "r")) == NULL || + stat64(content_filename, file_stat + current_file) < 0) { + perror("Failed to open"); + fprintf(stderr, "Failure opening %s %p\n", content_filename, + fp[current_file]); + print_usage_and_exit(argv[0]); + } + + long nbytes = file_stat[current_file].st_size; + max_file_size = max_file_size > nbytes ? max_file_size : nbytes; + + if ((file_content[current_file] = (unsigned char *)malloc(nbytes)) == + NULL) { + fputs("Memory allocation failure\n", stderr); + exit(1); + } + + int read_char; + unsigned char *fptr; + fptr = file_content[current_file]; + while ((read_char = fgetc(fp[current_file])) != EOF) { + *fptr = (unsigned char)read_char; + fptr++; + } } - - int read_char; - fptr = file_content; - while ((read_char = fgetc(fp)) != EOF) { - *fptr = (unsigned char)read_char; - fptr++; + // We opened all the files, read their content and got the max size of all + // files. Now we extend the smaller files to the max size and add them to + // ktest files. + for (unsigned current_file = 0; current_file < file_counter; + current_file++) { + long nbytes = file_stat[current_file].st_size; + if (nbytes < max_file_size) { + file_content[current_file] = + (unsigned char *)realloc(file_content[current_file], max_file_size); + // Rewrite the tail with EOF and all zeroes + file_content[current_file][nbytes] = EOF; + for (int i = nbytes; i < max_file_size; i++) { + file_content[current_file][i] = '\0'; + } + } + // Push obj to ktest file + filename[0] = sym_file_name; + statname[0] = sym_file_name; + push_obj(&b, filename, max_file_size, file_content[current_file]); + push_obj(&b, statname, sizeof(struct stat64), + (unsigned char *)&file_stat[current_file]); + free(file_content[current_file]); + file_content[current_file] = NULL; + sym_file_name++; } - push_obj(&b, filename, nbytes, file_content); - push_obj(&b, statname, sizeof(struct stat64), (unsigned char *)&file_stat); - - free(file_content); - char *buf1 = (char *)malloc(1024); char *buf2 = (char *)malloc(1024); char *buf3 = (char *)malloc(1024); snprintf(buf1, 1024, "-sym-files"); - snprintf(buf2, 1024, "1"); - snprintf(buf3, 1024, "%ld", nbytes); + snprintf(buf2, 1024, "%d", file_counter); + snprintf(buf3, 1024, "%ld", max_file_size); argv_copy[argv_copy_idx++] = buf1; argv_copy[argv_copy_idx++] = buf2; argv_copy[argv_copy_idx++] = buf3; |