#include #include #include #include #include #define DATA_FILENAME "data.txt" #define ROOT 5 #define BASE 10 #define REVERSE_FILE_ROOT_5 "immortal_base10_power2_branch5_digits%d" #define REVERSE_FILE_ROOT_6 "immortal_base10_power2_branch6_digits%d" // ------------------------------------------------------------------------------------------------------ static inline void mygetline(char* line, size_t size, FILE* myfile) { if (fgets(line, size, myfile) == NULL) { line = ""; return; } size_t ln = strlen(line) - 1; if (line[ln] == '\n') line[ln] = '\0'; ln = strlen(line) - 1; if (line[ln] == '\r') line[ln] = '\0'; return; } int main(void) { #define SIGNATURE "Immortal Number Report File Version 3.00" #define END_SIG "END OF REPORT" /*unsigned*/ char* a; unsigned /* long long */ int a_size = 0; unsigned /* long long */ int top = -1; // u unsigned /* long long */ int digits = -1; // u+1 //bool a_empty; char line[255]; FILE* myfile = fopen(DATA_FILENAME, "r"); if (myfile) { // __try { top = -1; digits = -1; mygetline(line, sizeof line, myfile); if (strcmp(line, SIGNATURE) != 0 /* not equal */) { fprintf(stderr, "Load error: Wrong format signature. Expecting '%s' but is '%s'.\n", SIGNATURE, line); fclose(myfile); return EXIT_FAILURE; } mygetline(line, sizeof line, myfile); // Minor. signature mygetline(line, sizeof line, myfile); // "" mygetline(line, sizeof line, myfile); // "(Starting time)" mygetline(line, sizeof line, myfile); mygetline(line, sizeof line, myfile); // "" mygetline(line, sizeof line, myfile); // "(Save timestamp)" mygetline(line, sizeof line, myfile); // Timestamp mygetline(line, sizeof line, myfile); // "" mygetline(line, sizeof line, myfile); // "(Base)" mygetline(line, sizeof line, myfile); // 10 unsigned int base = atoi(line); if (base != BASE) { fprintf(stderr, "This edition can only work with base = %d.\n", BASE); fclose(myfile); return EXIT_FAILURE; } mygetline(line, sizeof line, myfile); // "" mygetline(line, sizeof line, myfile); // "(Root)" mygetline(line, sizeof line, myfile); // 5 unsigned int root = atoi(line); if (root != ROOT) { fprintf(stderr, "This edition can only work with root = %d.\n", ROOT); fclose(myfile); return EXIT_FAILURE; } mygetline(line, sizeof line, myfile); // "" mygetline(line, sizeof line, myfile); // "(Digits)" mygetline(line, sizeof line, myfile); digits = atoi(line); mygetline(line, sizeof line, myfile); // "" mygetline(line, sizeof line, myfile); // "(r)" mygetline(line, sizeof line, myfile); mygetline(line, sizeof line, myfile); // "" a_size = digits; a = (/*unsigned*/ char*) calloc(a_size, sizeof(/*unsigned*/ char)); if (a == NULL) { fprintf(stderr, "Memory allocation failed!\n"); fclose(myfile); return EXIT_FAILURE; } mygetline(line, sizeof line, myfile); // "(Reversed notation)" do { mygetline(line, sizeof line, myfile); for (unsigned int i = 0; i < strlen(line); ++i) { /*unsigned*/ char toadd = line[i] - '0'; if (digits == top + 1) { fprintf(stderr, "Corrupt: Formal and actual length mismatch!\n"); fclose(myfile); return EXIT_FAILURE; } // Cannot overflow if input file is OK. a[++top] = toadd; //a_empty = false; } } while (strcmp(line, "") != 0 /* not equal */); if (digits != top + 1) { fprintf(stderr, "Corrupt: Formal and actual length mismatch!\n"); fclose(myfile); return EXIT_FAILURE; } mygetline(line, sizeof line, myfile); if (strcmp(line, END_SIG) != 0 /* not equal */) { fprintf(stderr, "Corrupt: End-signature mismatch.\n"); fclose(myfile); return EXIT_FAILURE; } // } __finally { fclose(myfile); // } } else { fprintf(stderr, "Cannot open file!\n"); return EXIT_FAILURE; } char fn[255]; // Base 5 sprintf(fn, REVERSE_FILE_ROOT_5, digits); FILE* outfile; outfile = fopen(fn, "w"); if (!outfile) { fprintf(stderr, "ERROR: Cannot open file %s for writing\n", REVERSE_FILE_ROOT_6); return EXIT_FAILURE; } // __try { for (int i = top; i >= 0; --i) { /*unsigned*/ char xa = a[i]; fprintf(outfile, "%d", xa); } // } __finally { fclose(outfile); // } // Base 6 (converted) sprintf(fn, REVERSE_FILE_ROOT_6, digits); outfile = fopen(fn, "w"); if (!outfile) { fprintf(stderr, "ERROR: Cannot open file %s for writing\n", REVERSE_FILE_ROOT_6); return EXIT_FAILURE; } // __try { for (int i = top; i >= 0; --i) { /*unsigned*/ char xa = a[i]; if (i == 0) xa = 11 - xa; else xa = 9 - xa; fprintf(outfile, "%d", xa); } // } __finally { fclose(outfile); // } free(a); return EXIT_SUCCESS; }