#include #include #include #include #include #define MAX_STRING 4096 #define MAX_TOKENS 3 char *get_distfiles(char **envp) { char *envvar = "distfiles="; int i = 0; while (envp[i] != NULL && strncmp(envp[i], envvar, strlen(envvar)) != 0) i += 1; // Now we have distfiles= - get just the part we want. require(envp[i] != NULL, "Unable to find distfiles environment variable"); return envp[i] + strlen(envvar); } int main(int argc, char **argv, char **envp) { // Random file things require(argc == 2, "Usage: checksum-transcriber FILENAME"); char *input = argv[1]; FILE *in = fopen(input, "r"); require(in != NULL, "File does not exist"); char *output = calloc(MAX_STRING, sizeof(char)); require(strcpy(output, input) != NULL, "Failed copying string"); require(strcat(output, ".SHA256SUM") != NULL, "Failed concating string"); FILE *out = fopen(output, "w+"); require(out != NULL, "Failed opening output file"); char *orig_line; char *line = calloc(MAX_STRING, sizeof(char)); require(line != NULL, "Failed allocating string"); char **tokens; char *new_line; char *checksum; char *filename; int i; fgets(line, MAX_STRING, in); while (strlen(line) != 0) { // Split each line into tokens orig_line = line; tokens = calloc(MAX_TOKENS, sizeof(char*)); i = 0; while (i < MAX_TOKENS) { tokens[i] = line; new_line = strchr(line, ' '); // Occurs when there are only two tokens if (new_line == NULL) break; line = new_line; line[0] = '\0'; line += 1; i += 1; } line = strchr(line, '\n'); line[0] = '\0'; // Get checksum and filename checksum = tokens[1]; if (tokens[2] != NULL) { filename = tokens[2]; } else { filename = strrchr(tokens[0], '/'); filename += 1; } // Put it all together fputs(checksum, out); fputs(" ", out); fputs(get_distfiles(envp), out); fputc('/', out); fputs(filename, out); fputc('\n', out); // Cleanup i = 0; free(orig_line); free(tokens); line = calloc(MAX_STRING, sizeof(char)); require(line != NULL, "Failed allocating string"); fgets(line, MAX_STRING, in); } // Clean up fclose(in); fclose(out); }