Author: Adam <git@apiote.tk>
reformat
meowsum.c | 221 ++++++++++++++++++++++++++++++--------------------------
diff --git a/meowsum.c b/meowsum.c index adece33854f926bb99c949d586b5833961675d98..7be65dfe3a1e68ae6810d0b5df5809109b24d28a 100644 --- a/meowsum.c +++ b/meowsum.c @@ -181,141 +181,159 @@ return true; } +bool read_sum_line(char **line, size_t *line_size, FILE *file, char *filename) { + ssize_t read_bytes; + + read_bytes = getline(line, line_size, file); + if (read_bytes == -1) { + if (feof(file)) { + *line = NULL; + return true; + } else { + perror("error"); + fprintf(stderr, "while reading line in %s\n", filename); + *line = NULL; + return false; + } + } + if (*line[read_bytes - 1] == '\n') { + *line[read_bytes - 1] = 0; + } + return true; +} + +bool parse_sum_line(char *line, unsigned int line_size, + char **expected_hex_hash, unsigned long *expected_size, + char **path, char *filename, unsigned int *hash_size) { + char *expected_size_string; + char *next; + + *expected_hex_hash = malloc(line_size * sizeof(char)); + if (expected_hex_hash == NULL) { + perror("error"); + fprintf(stderr, "error mallocing expected_hex_hash for %s\n", filename); + return false; + } + expected_size_string = malloc(line_size * sizeof(char)); + if (expected_size_string == NULL) { + perror("error"); + fprintf(stderr, "error mallocing expected_size_string for %s\n", filename); + free(*expected_hex_hash); + return false; + } + *path = malloc(line_size * sizeof(char)); + if (path == NULL) { + perror("error"); + fprintf(stderr, "error mallocing path for %s\n", filename); + free(*expected_hex_hash); + free(expected_size_string); + return false; + } + int n = + // NOLINTNEXTLINE + sscanf(line, "%s %s %s", *expected_hex_hash, expected_size_string, *path); + if (n != 3) { + fprintf(stderr, "ERR line malformed\n"); + free(*expected_hex_hash); + free(expected_size_string); + free(*path); + return false; + } + *hash_size = strlen(*expected_hex_hash) * 8 / 2; + if (!(*hash_size == 32 || *hash_size == 64 || *hash_size == 128)) { + fprintf(stderr, "ERR hash size is wrong\n"); + free(*expected_hex_hash); + free(expected_size_string); + free(*path); + return false; + } + *expected_size = strtoul(expected_size_string, &next, 10); + if (errno == ERANGE) { + fprintf(stderr, "ERR expected size out of range\n"); + free(*expected_hex_hash); + free(expected_size_string); + free(*path); + return false; + } else if (next == expected_size_string) { + fprintf(stderr, "ERR expected size is an invalid number\n"); + free(*expected_hex_hash); + free(expected_size_string); + free(*path); + return false; + } else if (*next != '\n' && *next != '\0') { + fprintf(stderr, "ERR rubbish in expected size\n"); + free(*expected_hex_hash); + free(expected_size_string); + free(*path); + return false; + } + free(expected_size_string); + return true; +} + bool check_files(char *argv[], int start, int argc, bool quiet, bool strict_errors) { char *line = NULL; size_t line_size = 0; FILE *file = NULL; + char *expected_hex_hash = NULL, *path = NULL; unsigned long expected_size = 0, size = 0; - char *expected_hex_hash = NULL, *expected_size_string = NULL, *path = NULL; - ssize_t read_bytes = 0; + unsigned int hash_size = 0; meow_u128 *hash = NULL; char *hex_hash = NULL; - int hash_size = 0; bool result = true; - char *next = NULL; + bool r; for (int i = start; i < argc; ++i) { file = fopen(argv[i], "r"); while (true) { + path = NULL; line = NULL; - path = NULL; - read_bytes = getline(&line, &line_size, file); - if (read_bytes == -1) { - if (feof(file)) { + r = read_sum_line(&line, &line_size, file, argv[i]); + if (line == NULL) { + if (r) { break; } else { - perror("error"); - fprintf(stderr, "while reading line in %s\n", argv[i]); - return false; + continue; } } - if (line[read_bytes - 1] == '\n') { - line[read_bytes - 1] = 0; - } - expected_hex_hash = malloc(line_size * sizeof(char)); - if (expected_hex_hash == NULL) { - perror("error"); - fprintf(stderr, "error mallocing expected_hex_hash for %s\n", argv[i]); - return false; - } - expected_size_string = malloc(line_size * sizeof(char)); - if (expected_size_string == NULL) { - perror("error"); - fprintf(stderr, "error mallocing expected_size_string for %s\n", - argv[i]); - free(expected_hex_hash); - return false; - } - path = malloc(line_size * sizeof(char)); - if (path == NULL) { - perror("error"); - fprintf(stderr, "error mallocing path for %s\n", argv[i]); - free(expected_hex_hash); - free(expected_size_string); - return false; - } - // NOLINTNEXTLINE - int n = sscanf(line, "%s %s %s", expected_hex_hash, expected_size_string, - path); - if (n != 3) { - fprintf(stderr, "line '%s' in %s malformed\n", line, argv[i]); - free(expected_hex_hash); - free(expected_size_string); - free(path); - free(line); - continue; - } - hash_size = strlen(expected_hex_hash) * 8 / 2; - if (!(hash_size == 32 || hash_size == 64 || hash_size == 128)) { - fprintf(stderr, "hash size is wrong in line '%s' in %s\n", line, - argv[i]); - free(expected_hex_hash); - free(expected_size_string); - free(path); - free(line); - continue; - } - expected_size = strtoul(expected_size_string, &next, 10); - if (errno == ERANGE) { - fprintf(stderr, "expected size out of range in line '%s' in %s\n", line, - argv[i]); - free(expected_hex_hash); - free(expected_size_string); - free(path); - free(line); - continue; - } else if (next == expected_size_string) { - fprintf(stderr, - "expected size is an invalid number in line '%s' in %s\n", line, - argv[i]); - free(expected_hex_hash); - free(expected_size_string); - free(path); - free(line); - continue; - } else if (*next != '\n' && *next != '\0') { - fprintf(stderr, "rubbish in expected size in line '%s' in %s\n", line, - argv[i]); - free(expected_hex_hash); - free(expected_size_string); - free(path); - free(line); + r = parse_sum_line(line, line_size, &expected_hex_hash, &expected_size, + &path, argv[i], &hash_size); + if (r == false) { continue; } if (strcmp("-", path) == 0) { if (!quiet) { - printf("[WARN] stdin on the list in %s\n", argv[i]); + printf("WARN stdin; skipping\n"); } } else { if (access(path, F_OK) == -1) { - printf("ERM %s\n", path); + if (!quiet) { + printf("ERM %s\n", path); + } if (strict_errors) { result &= false; } free(expected_hex_hash); - free(expected_size_string); free(path); free(line); continue; } hash = calculate_checksum(path, &size); if (hash == NULL) { - fprintf(stderr, "error while calculating %s\n", path); + fprintf(stderr, "ERR calculating %s\n", path); free(expected_hex_hash); - free(expected_size_string); free(path); free(line); continue; } hex_hash = format_sum(*hash, hash_size); if (hex_hash == NULL) { - fprintf(stderr, "error while formating hex hash for %s\n", path); + fprintf(stderr, "ERR formating hex hash %s\n", path); free(expected_hex_hash); - free(expected_size_string); free(hash); free(path); free(line); @@ -341,7 +359,6 @@ free(hex_hash); free(hash); } free(expected_hex_hash); - free(expected_size_string); free(path); free(line); } @@ -350,9 +367,11 @@ fclose(file); } return result; } + int main(int argc, char *argv[]) { int hash_size = HASH_SIZE, mode = MODE_SUM, first_file_index = -1; - bool quiet = false, strict_error = false; + bool quiet = false, strict_error = false, help = false; + bool result; if (argc == 1) { print_usage(); @@ -372,18 +391,14 @@ print_usage(); return 1; } - if (mode == MODE_SUM) { - bool sum_result = sum_files(argv, first_file_index, argc, hash_size); - if (!sum_result) { - return 1; - } - } else if (mode == MODE_CHECK) { - bool check_result = - check_files(argv, first_file_index, argc, quiet, strict_error); - if (!check_result) { - return 1; - } - } else { + switch (mode) { + case MODE_SUM: + result = sum_files(argv, first_file_index, argc, hash_size); + return result ? 0 : 1; + case MODE_CHECK: + result = check_files(argv, first_file_index, argc, quiet, strict_error); + return result ? 0 : 1; + default: print_usage(); return 1; }