From bf71ba07b2bb22d458d8f2671c31ec01012941e4 Mon Sep 17 00:00:00 2001 From: Chris Nutter Date: Wed, 8 May 2019 17:34:30 -0700 Subject: [PATCH] v0.3 alpha uploaded. works but not well and all the way --- diff-rcm | Bin 0 -> 22592 bytes diff.c | 203 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ diff.h | 26 +++++++ l | 25 +++++++ r | 31 +++++++++ 5 files changed, 285 insertions(+) create mode 100755 diff-rcm create mode 100644 diff.c create mode 100644 diff.h create mode 100644 l create mode 100644 r diff --git a/diff-rcm b/diff-rcm new file mode 100755 index 0000000000000000000000000000000000000000..0f23846a7e5de7994d81eb7304d0d8635153f7b8 GIT binary patch literal 22592 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 literal 0 HcmV?d00001 diff --git a/diff.c b/diff.c new file mode 100644 index 0000000..389d315 --- /dev/null +++ b/diff.c @@ -0,0 +1,203 @@ +#include "diff.h" + +// ========================================================================== // + +pa* pa_make(char* base[], int size, int start, int stop); +pa* pa_first(char* base[], int size); +pa* pa_next(pa* p); +size_t pa_filesize(pa* p); +size_t pa_size(pa* p); +char** pa_base(pa* p); +char* pa_info(pa* p); +int pa_equal(pa* p, pa* q); +void pa_print(pa* p, void (*fp)(const char*)); +void printboth(const char* left_right); +void printleft(const char* left); +void printright(const char* right); +FILE* openfile(const char* filename, const char* openflags); +//char* yesorno(int condition); + +void prereq(const char* argv[]); +void end(FILE *fin1, FILE *fin2); + +void version(); +void todo(); + +void quiet(const char* argv[]); +void loud(const char* argv[]); +int sideside(const char* argv[]); +int normal(const char* argv[]); + +// ========================================================================== // + +int main(int argc, const char* argv[]) { + + if (argc != 3 && (*argv)[0] == '-') { fprintf(stderr, "Usage: ./diff file1 file2\n"); exit(ARGC_ERROR); } + if (argc < 3) { fprintf(stderr, "Usage: ./diff file1 file2\n"); exit(ARGC_ERROR); } + if (argc == 3) { prereq(argv); normal(argv); return 0; } + + while (*++argv) + switch ((*argv)[1]) { + default: break; + case 'v': version(); return 0; // 100% implemented (unless I want to enhance) + case 't': todo(); return 0; // Only for me. To be deprecated later. + case 'q': prereq(argv); quiet(argv); break; // 100% implemented + case 'y': prereq(argv); sideside(argv); break; // 50% implemented + case 'i': printf("i done\n"); break; + case 'c': printf("c done\n"); break; + case 'u': printf("u done\n"); break; + case 's': prereq(argv); loud(argv); break; + } + + return 0; +} + +// ====================================================== // + +void prereq(const char* argv[]) { + fin1 = openfile(argv[1], "r"); + fin2 = openfile(argv[2], "r"); + + memset(buf, 0, sizeof(buf)); + memset(strings1, 0, sizeof(strings1)); + memset(strings2, 0, sizeof(strings2)); + + while (!feof(fin1) && fgets(buf, BUFLEN, fin1) != NULL) { strings1[count1++] = strdup(buf); } + while (!feof(fin2) && fgets(buf, BUFLEN, fin2) != NULL) { strings2[count2++] = strdup(buf); } + + p = pa_first(strings1, count1); + q = pa_first(strings2, count2); +} +void end(FILE* fin1, FILE* fin2) { + fclose(fin1); + fclose(fin2); +} + +void version() { + printf("\n _ _ __ __ \n"); + printf(" __| (_)/ _|/ _| _ __ ___ _ __ ___ \n"); + printf(" / _` | | |_| |_ _____| '__/ __| '_ ` _ \\ \n"); + printf("| (_| | | _| _|_____| | | (__| | | | | | \n"); + printf(" \\__,_|_|_| |_| |_| \\___|_| |_| |_| \n\n"); + printf("------------------------------------------\n\n"); + printf("v0.4 alpha | Quoth the anti-Raven. Alwaysmore.\n\n"); + printf("Copyright (C) 2019 | All Rights Reserved.\n"); + printf("Any unauthorized use or re-distribution (before May 19, 2019) of this code is STRICTLY prohibited.\n\n"); + printf("Written by: Chris Nutter; William McCarthy; Rasputin\n\n"); +} +void todo() { + printf("\nTODO: check line by line in a pagraph, using '|' for differences"); + printf("\nTODO: this starter code does not yet handle printing all of fin1's pagraphs."); + printf("\nTODO: handle the rest of diff's options"); + printf("\nTODO: fix standard printing with no parameters"); + printf("\nTODO: implement multiple types of parameters\n"); +} + +int normal(const char* argv[]) { + + printf("\nTHIS IS NOT NORMAL FOR NOW. THIS IS PLACEHOLDER. MMKAY.\n"); + printf("THIS IS NOT NORMAL FOR NOW. THIS IS PLACEHOLDER. MMKAY.\n\n\n"); + + pa_print(p, printleft); + pa_print(q, printright); + + printf("\nTHIS IS NOT NORMAL FOR NOW. THIS IS PLACEHOLDER. MMKAY.\n"); + printf("THIS IS NOT NORMAL FOR NOW. THIS IS PLACEHOLDER. MMKAY.\n\n\n"); + + return 0; +} +int sideside(const char* argv[]) { + + if (pa_equal(p, q)) { pa_print(p, printboth); return 0; } + pa_print(q, printright); + while ((q = pa_next(q)) != NULL && !equal) { equal = pa_equal(p, q); pa_print(q, equal ? printboth : printright); } + pa_print((p = pa_next(p)), printleft); + + return 0; +} +void quiet(const char* argv[]) { if (pa_equal(p, q) == 0) { printf("The files are not equal.\n"); } } +void loud(const char* argv[]) { if (pa_equal(p, q) == 1) { printf("The files are equal.\n"); } } + +int hash(const char* s) { + unsigned long code = 0; + while (*s != '\0') { code = code *31 + *s++; } + return code % HASHLEN; +} + +// ====================================================== // + +pa* pa_make(char* base[], int filesize, int start, int stop) { + pa* p = (pa*) malloc(sizeof(pa)); + p->base = base; + p->filesize = filesize; + p->start = start; + p->stop = stop; + + return p; +} +pa* pa_first(char* base[], int size) { + pa* p = pa_make(base, size, 0, -1); + return pa_next(p); +} +pa* pa_next(pa* p) { + if (p->stop == p->filesize) { return NULL; } + + int i; + pa* pnew = pa_make(p->base, p->filesize, p->stop + 1, p->stop + 1); + for (i = pnew->start; i < p->filesize && strcmp(p->base[i], "\n") != 0; ++i) { } + pnew->stop = i; + + return pnew; +} +void pa_print(pa* p, void (*fp)(const char*)) { + if (p == NULL) { return; } + for (int i = p->start; i <= p->stop && i != p->filesize; ++i) { fp(p->base[i]); } +} +void pa_destroy(pa* p) { free(p); } +void printleft(const char* left) { + char buf[BUFLEN]; + + strcpy(buf, left); + int j = 0, len = (int)strlen(buf) - 1; + for (j = 0; j <= 48 - len ; ++j) { buf[len + j] = ' '; } + buf[len + j++] = '<'; + buf[len + j++] = '\0'; + printf("%s\n", buf); +} +void printright(const char* right) { + if (right == NULL) { return; } + printf("%50s %s", ">", right); +} +void printboth(const char* left_right) { + char buf[BUFLEN]; + size_t len = strlen(left_right); + if (len > 0) { strncpy(buf, left_right, len); } + buf[len - 1] = '\0'; + printf("%-50s %s", buf, left_right); +} +size_t pa_filesize(pa* p) { return p == NULL ? 0 : p->filesize; } +size_t pa_size(pa* p) { return p == NULL || p->stop < p->start ? 0 : p->stop - p->start + 1; } +char** pa_base(pa* p) { return p->base; } +//char* yesorno(int condition) { return condition == 0 ? "no" : "YES"; } +char* pa_info(pa* p) { + static char buf[BUFLEN]; // static for a reason + snprintf(buf, sizeof(buf), "base: %p, filesize: %d, start: %d, stop: %d\n", + p->base, p->filesize, p->start, p->stop); + return buf; // buf MUST be static +} +int pa_equal(pa* p, pa* q) { + if (p == NULL || q == NULL) { return 0; } + if (pa_size(p) != pa_size(q)) { return 0; } + int i = p->start, j = q->start, equal = 0; + while ((equal = strcmp(p->base[i], q->base[i])) == 0) { ++i; ++j; } + return equal; +} +FILE* openfile(const char* filename, const char* openflags) { + FILE* f; + if ((f = fopen(filename, openflags)) == NULL) { printf("can't open '%s'\n", filename); exit(1); } + return f; +} + +// ============================ LEFTOVERS ============================ // + +// if ((*argv)[0] == '-') diff --git a/diff.h b/diff.h new file mode 100644 index 0000000..7c373f0 --- /dev/null +++ b/diff.h @@ -0,0 +1,26 @@ +#include +#include +#include + +#define ARGC_ERROR 1 +#define BUFLEN 256 +#define MAXSTRINGS 1024 + +#define HASHLEN 256 + +typedef struct pa pa; +struct pa { + char** base; + int filesize; + int start; + int stop; +}; + +FILE *fin1, *fin2; + +int count1 = 0, count2 = 0, equal = 0; +char buf[BUFLEN]; +char *strings1[MAXSTRINGS], *strings2[MAXSTRINGS]; + +pa* p; +pa* q; diff --git a/l b/l new file mode 100644 index 0000000..bbae935 --- /dev/null +++ b/l @@ -0,0 +1,25 @@ +This part of the +document has stayed the +sme from version to +version. It shouldn't +be shown if it doesn't +change. Otherwise, that +would not be helping to +compress the size of the +changes. + +This paragraph contains +text that is outdated. +It will be deleted in the +near future. + +It is important to spell +check this dokument. On +the other hand, a +misspelled word isn't +the end of the world. +Nothing in the rest of +this paragraph needs to +be changed. Things can +be added after it. + diff --git a/r b/r new file mode 100644 index 0000000..2d7f33d --- /dev/null +++ b/r @@ -0,0 +1,31 @@ +This is an important +notice! It should +therefore be located at +the beginning of this +document! + +This part of the +document has stayed the +sme from version to +version. It shouldn't +be shown if it doesn't +change. Otherwise, that +would not be helping to +compress the size of the +changes. + +It is important to spell +check this document. On +the other hand, a +misspelled word isn't +the end of the world. +Nothing in the rest of +this paragraph needs to +be changed. Things can +be added after it. + +This pragraph contains +important new additions +to this document. + +