From bf93127544e72c113dfcac50bcab84325ad921ea Mon Sep 17 00:00:00 2001 From: Chris Nutter Date: Sat, 11 May 2019 18:36:22 -0700 Subject: [PATCH] updated for checking, not much progress --- diff-rcm | Bin 22592 -> 23088 bytes diff.c | 113 +++++++++++++++------- diff.h | 22 ++++- diff_dep.c | 25 +++++ newfiles/__MACOSX/._diff_02.c | Bin 0 -> 333 bytes newfiles/__MACOSX/._left.txt | Bin 0 -> 266 bytes newfiles/__MACOSX/._para.c | Bin 0 -> 333 bytes newfiles/__MACOSX/._para.h | Bin 0 -> 176 bytes newfiles/__MACOSX/._right.txt | Bin 0 -> 423 bytes newfiles/__MACOSX/._util.c | Bin 0 -> 176 bytes newfiles/__MACOSX/._util.h | Bin 0 -> 176 bytes newfiles/diff_02.c | 175 ++++++++++++++++++++++++++++++++++ newfiles/diff_02.zip | Bin 0 -> 7935 bytes newfiles/left.txt | 25 +++++ newfiles/para.c | 85 +++++++++++++++++ newfiles/para.h | 36 +++++++ newfiles/right.txt | 31 ++++++ newfiles/util.c | 53 ++++++++++ newfiles/util.h | 24 +++++ 19 files changed, 548 insertions(+), 41 deletions(-) create mode 100644 diff_dep.c create mode 100644 newfiles/__MACOSX/._diff_02.c create mode 100644 newfiles/__MACOSX/._left.txt create mode 100644 newfiles/__MACOSX/._para.c create mode 100644 newfiles/__MACOSX/._para.h create mode 100644 newfiles/__MACOSX/._right.txt create mode 100644 newfiles/__MACOSX/._util.c create mode 100644 newfiles/__MACOSX/._util.h create mode 100644 newfiles/diff_02.c create mode 100644 newfiles/diff_02.zip create mode 100644 newfiles/left.txt create mode 100644 newfiles/para.c create mode 100644 newfiles/para.h create mode 100644 newfiles/right.txt create mode 100644 newfiles/util.c create mode 100644 newfiles/util.h diff --git a/diff-rcm b/diff-rcm index 0f23846a7e5de7994d81eb7304d0d8635153f7b8..05284d244eeadc0d15a935ab95aaefb905040e76 100755 GIT binary patch delta 5876 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 a&x*n^YN<5(jGtUFXUs+GWWZgyEc-vW5w)uT delta 4616 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 Qy!_FTM#6)<{BHaI0e)|5RsaA1 diff --git a/diff.c b/diff.c index 389d315..4a69f5a 100644 --- a/diff.c +++ b/diff.c @@ -1,3 +1,7 @@ +#include +#include +#include + #include "diff.h" // ========================================================================== // @@ -17,8 +21,11 @@ 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 init(int argc, const char* argv[]); +void setoption(const char* arg, const char* s, const char* t, int* value); +void diff_output_conflict_error(void); + +void loadfiles(const char* filename1, const char* filename2); void version(); void todo(); @@ -26,51 +33,87 @@ void todo(); void quiet(const char* argv[]); void loud(const char* argv[]); int sideside(const char* argv[]); -int normal(const char* argv[]); +int normal(const char* filename1, const char* filename2); -// ========================================================================== // +// ================================================================= // 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; - } + init(--argc, ++argv); + loadfiles(files[0], files[1]); + if (!showcontext && !showunified && !showsidebyside && !showleftcolumn) { normal(files[0], files[1]); } return 0; } -// ====================================================== // +// =============================================================== // -void prereq(const char* argv[]) { - fin1 = openfile(argv[1], "r"); - fin2 = openfile(argv[2], "r"); +void init(int argc, const char* argv[]) { + int count = 0; + const char* files[2] = { NULL, NULL }; + while (argc-- > 0) { + const char* arg = *argv; + + setoption(arg, "-v", "--version", &showversion); + setoption(arg, "-q", "--brief", &showbrief); + setoption(arg, "-i", "--ignore-case", &ignorecase); + setoption(arg, "-s", "--report-identical-files", &report_identical); + setoption(arg, "--normal", NULL, &diffnormal); + setoption(arg, "-y", "--side-by-side", &showsidebyside); + setoption(arg, "--left-column", NULL, &showleftcolumn); + setoption(arg, "--suppress-common-lines", NULL, &suppresscommon); + setoption(arg, "-c", "--context", &showcontext); + setoption(arg, "-u", "showunified", &showunified); + setoption(arg, "-h", "--help", &showhelp); + + if (arg[0] != '-') { + if (cnt == 2) { + fprintf(stderr, "apologies, this version of diff only handles two files\n"); + fprintf(stderr, "Usage: ./diff [options] file1 file2\n"); + exit(TOOMANYFILES_ERROR); + } else { files[cnt++] = arg; } + } + ++argv; + } + + if (showversion) { version(); exit(0); } + + if (!showcontext && !showunified && + !showsidebyside && !showleftcolumn) { diffnormal = 1; } + + if (((showsidebyside || showleftcolumn) && + (diffnormal || showcontext || showunified)) || + (showcontext && showunified) || (diffnormal && + (showcontext || showunified))) { diff_output_conflict_error(); } +} + +void setoption(const char* arg, const char* s, const char* t, int* value) { + if ((strcmp(arg, s) == 0) || ((t != NULL && strcmp(arg, t) == 0))) { *value = 1; } +} +void diff_output_conflict_error(void) { + + fprintf(stderr, "diff: conflicting output style options\n"); + fprintf(stderr, "diff: Try `diff --help' for more information.)\n"); + exit(CONFLICTING_OUTPUT_OPTIONS); + +} + +void loadfiles(const char* filename1, const char* filename2) { 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); } + FILE *fin1 = openfile(filename1, "r"); + FILE *fin2 = openfile(filename2, "r"); + + while (!feof(fin1) && fgets(buf, BUFLEN, fin1) != NULL) { strings1[count1++] = strdup(buf); } fclose(fin1); + while (!feof(fin2) && fgets(buf, BUFLEN, fin2) != NULL) { strings2[count2++] = strdup(buf); } fclose(fin2); p = pa_first(strings1, count1); q = pa_first(strings2, count2); -} -void end(FILE* fin1, FILE* fin2) { - fclose(fin1); - fclose(fin2); + + int foundmatch = 0; } void version() { @@ -89,11 +132,11 @@ 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"); + printf("\nTODO: fix standard printing with no pameters"); + printf("\nTODO: implement multiple types of pameters\n"); } -int normal(const char* argv[]) { +int normal(const char* filename1, const char* filename2) { 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"); @@ -197,7 +240,3 @@ FILE* openfile(const char* filename, const char* openflags) { 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 index 7c373f0..d274da6 100644 --- a/diff.h +++ b/diff.h @@ -3,10 +3,14 @@ #include #define ARGC_ERROR 1 -#define BUFLEN 256 -#define MAXSTRINGS 1024 +#define TOOMANYFILES_ERROR 2 +#define CONFLICTING_OUTPUT_OPTIONS 3 -#define HASHLEN 256 +#define MAXSTRINGS 1024 +#define MAXPARAS 4096 + +#define HASHLEN 200 +#define BUFLEN 256 typedef struct pa pa; struct pa { @@ -18,9 +22,19 @@ struct pa { FILE *fin1, *fin2; -int count1 = 0, count2 = 0, equal = 0; +const char* files[2] = { NULL, NULL }; + char buf[BUFLEN]; char *strings1[MAXSTRINGS], *strings2[MAXSTRINGS]; +int showversion = 0, showbrief = 0, ignorecase = 0, report_identical = 0, showsidebyside = 0; +int showleftcolumn = 0, showunified = 0, showcontext = 0, suppresscommon = 0, diffnormal = 0; +int showhelp = 0; + +int equal = 0; + +int cnt = 0; +int count1 = 0, count2 = 0; + pa* p; pa* q; diff --git a/diff_dep.c b/diff_dep.c new file mode 100644 index 0000000..513dd29 --- /dev/null +++ b/diff_dep.c @@ -0,0 +1,25 @@ +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) { loadfiles(argv); normal(argv); return 0; } + + init(--argc, ++argv); + loadfiles(files[0], files[1]); + if (!showcontext && !showunified && !showsidebyside && !showleftcolumn) { normal(files[0], files[1]); } + + // 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': loadfiles(argv); quiet(argv); break; // 100% implemented + // case 'y': loadfiles(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': loadfiles(argv); loud(argv); break; + // } + + return 0; +} diff --git a/newfiles/__MACOSX/._diff_02.c b/newfiles/__MACOSX/._diff_02.c new file mode 100644 index 0000000000000000000000000000000000000000..cca5a7d4c924fedeea07182361df9a2f7f3821ef GIT binary patch literal 333 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDJkFfd93X&|4`7f2HU9795aAj-fxo&edI zXxc!ggTw_G7^IT(bM+Dn3UX5QauSP6N{drdQW8s2l>>sIdcFYZNCpOTgu2|+l0=}I zM5}CH7oWtW)SUP-6Z1mzwCt4BoZ^C{^5i1ZLZkegB%^$jRG{X`PS;{UX8k!(s|=z) z@p+{l&8SF7n&zkVQih3tS%F^TsxuK*8*3CExlCGj+0ZarDYrL0blvA!H$|Epg%>hb tyyl3!^ZVVt_T#Oxca!HeE}EfUd_Tam>G8t9r90-#^R>UBR-AHO0RR>|R+In$ literal 0 HcmV?d00001 diff --git a/newfiles/__MACOSX/._left.txt b/newfiles/__MACOSX/._left.txt new file mode 100644 index 0000000000000000000000000000000000000000..21263e98ee1eba9c7f7692f9d5589bc9f5f499df GIT binary patch literal 266 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@eLpb@)@~+G!eitBqRu;46NeWU{FD*%S|mw1gc52 ziqH0S@hnNr4J}SB3Q0^aW?-bjJ HTn0`6!~!OA literal 0 HcmV?d00001 diff --git a/newfiles/__MACOSX/._para.c b/newfiles/__MACOSX/._para.c new file mode 100644 index 0000000000000000000000000000000000000000..cbfd2c150525bf75886875dc7cdec5575db3ab28 GIT binary patch literal 333 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDJkFfd93X&|4`7f2HU9795aAj-fxo&edI zXxc!ggTw_G7^IT(bM+Dn3UX5QauSP6N{drdQW8s2l>>sIdcFYZNCpOTgu2|+l0=}I zM5}CH7oWtW)SUP-6Z1mzwCt4BoZ^C{^5i1ZLZkegB%^$jRG{XcT-RbiX6@YFX$7J` zbs3(U>5(I#dgAnE(QLP@jc!Tlzzm5O+6&qk8TXmU0|3vKQ8NGl literal 0 HcmV?d00001 diff --git a/newfiles/__MACOSX/._para.h b/newfiles/__MACOSX/._para.h new file mode 100644 index 0000000000000000000000000000000000000000..a4594449b1031b7d4e710164368ff0636f5d8119 GIT binary patch literal 176 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aUBqY_#1$j2;dkJ5(HHS(y;)D1)zKw z#Rz090AirHRC0cL=AX$Vqox1Ojhs@R)|o50+1L3ClDJkFff(^X&|3*Iglm-IEI7-L6m`XFp2=# zlhL#>L&XIc7^IT(bM+Dn3UX5QauSP6N{drdQW8s2l>>sIW~cyZEd~Y^gu2|+l0=}I zM6390Ul-4k)ZEbG)S{5Y^kR?>Mn51C$-rQaMLkftPhwJPPJEe(d7*h)c1mhaaY0gf za*=7FQGQO6QNBqkP;=PzD={FGjL(YegXpA!oXp}91A_$|ARf>LMhMLSqoG^|&QG^z zPH{YTZ&~y0Kc}`Bm{vUNPKer``#Ls^yTr9KtGFxZi#F52Me-6RPfi`musNTk>@}rO r@XL9l9})Ay78l=i`4s)STV>tVKmM-{Fo{-fRY`5zW4wFEwkmZ1*l=le literal 0 HcmV?d00001 diff --git a/newfiles/__MACOSX/._util.c b/newfiles/__MACOSX/._util.c new file mode 100644 index 0000000000000000000000000000000000000000..84cc9881e21eb1cf6890e8bac294f2ca4a46851a GIT binary patch literal 176 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aUBqY_#1$j2;dkJ5(HHS(y;)D1)zKw z#Rz090AirHRC0c$Vqox1Ojhs@R)|o50+1L3ClDI}aUBqY_#1$j2;dkJ5(HHS(y;)D1)zKw z#Rz090AirHRC0c&+`MAUalXt~!VY09nTs AIRF3v literal 0 HcmV?d00001 diff --git a/newfiles/diff_02.c b/newfiles/diff_02.c new file mode 100644 index 0000000..30b0d70 --- /dev/null +++ b/newfiles/diff_02.c @@ -0,0 +1,175 @@ +// +// diff_02.c +// diff +// +// Created by William McCarthy on 4/29/19. +// Copyright © 2019 William McCarthy. All rights reserved. +// + +#include +#include +#include + +#define ARGC_ERROR 1 +#define TOOMANYFILES_ERROR 2 +#define CONFLICTING_OUTPUT_OPTIONS 3 + +#define MAXSTRINGS 1024 +#define MAXPARAS 4096 + +#define HASHLEN 200 + +#include "para.h" +#include "util.h" + + +void version(void) { + printf("\n\n\ndiff (CSUF diffutils) 1.0.0\n"); + printf("Copyright (C) 2014 CSUF\n"); + printf("This program comes with NO WARRANTY, to the extent permitted by law.\n"); + printf("You may redistribute copies of this program\n"); + printf("under the terms of the GNU General Public License.\n"); + printf("For more information about these matters, see the file named COPYING.\n"); + printf("Written by William McCarthy, Tony Stark, and Dr. Steven Strange\n"); +} + +void todo_list(void) { + printf("\n\n\nTODO: check line by line in a paragraph, using '|' for differences"); + printf("\nTODO: this starter code does not yet handle printing all of fin1's paragraphs."); + printf("\nTODO: handle the rest of diff's options\n"); +} + +char buf[BUFLEN]; +char *strings1[MAXSTRINGS], *strings2[MAXSTRINGS]; +int showversion = 0, showbrief = 0, ignorecase = 0, report_identical = 0, showsidebyside = 0; +int showleftcolumn = 0, showunified = 0, showcontext = 0, suppresscommon = 0, diffnormal = 0; + +int count1 = 0, count2 = 0; + + +void loadfiles(const char* filename1, const char* filename2) { + memset(buf, 0, sizeof(buf)); + memset(strings1, 0, sizeof(strings1)); + memset(strings2, 0, sizeof(strings2)); + + FILE *fin1 = openfile(filename1, "r"); + FILE *fin2 = openfile(filename2, "r"); + + while (!feof(fin1) && fgets(buf, BUFLEN, fin1) != NULL) { strings1[count1++] = strdup(buf); } fclose(fin1); + while (!feof(fin2) && fgets(buf, BUFLEN, fin2) != NULL) { strings2[count2++] = strdup(buf); } fclose(fin2); +} + +void print_option(const char* name, int value) { printf("%17s: %s\n", name, yesorno(value)); } + +void diff_output_conflict_error(void) { + fprintf(stderr, "diff: conflicting output style options\n"); + fprintf(stderr, "diff: Try `diff --help' for more information.)\n"); + exit(CONFLICTING_OUTPUT_OPTIONS); +} + +void setoption(const char* arg, const char* s, const char* t, int* value) { + if ((strcmp(arg, s) == 0) || ((t != NULL && strcmp(arg, t) == 0))) { + *value = 1; + } +} + +void showoptions(const char* file1, const char* file2) { + printf("diff options...\n"); + print_option("diffnormal", diffnormal); + print_option("show_version", showversion); + print_option("show_brief", showbrief); + print_option("ignorecase", ignorecase); + print_option("report_identical", report_identical); + print_option("show_sidebyside", showsidebyside); + print_option("show_leftcolumn", showleftcolumn); + print_option("suppresscommon", suppresscommon); + print_option("showcontext", showcontext); + print_option("show_unified", showunified); + + printf("file1: %s, file2: %s\n\n\n", file1, file2); + + printline(); +} + +void init_options_files(int argc, const char* argv[]) { + int cnt = 0; + const char* files[2] = { NULL, NULL }; + + while (argc-- > 0) { + const char* arg = *argv; + setoption(arg, "-v", "--version", &showversion); + setoption(arg, "-q", "--brief", &showbrief); + setoption(arg, "-i", "--ignore-case", &ignorecase); + setoption(arg, "-s", "--report-identical-files", &report_identical); + setoption(arg, "--normal", NULL, &diffnormal); + setoption(arg, "-y", "--side-by-side", &showsidebyside); + setoption(arg, "--left-column", NULL, &showleftcolumn); + setoption(arg, "--suppress-common-lines", NULL, &suppresscommon); + setoption(arg, "-c", "--context", &showcontext); + setoption(arg, "-u", "showunified", &showunified); + if (arg[0] != '-') { + if (cnt == 2) { + fprintf(stderr, "apologies, this version of diff only handles two files\n"); + fprintf(stderr, "Usage: ./diff [options] file1 file2\n"); + exit(TOOMANYFILES_ERROR); + } else { files[cnt++] = arg; } + } + ++argv; // DEBUG only; move increment up to top of switch at release + } + + if (!showcontext && !showunified && !showsidebyside && !showleftcolumn) { + diffnormal = 1; + } + + if (showversion) { version(); exit(0); } + + if (((showsidebyside || showleftcolumn) && (diffnormal || showcontext || showunified)) || + (showcontext && showunified) || (diffnormal && (showcontext || showunified))) { + + diff_output_conflict_error(); + } + +// showoptions(files[0], files[1]); + loadfiles(files[0], files[1]); +} + +int main(int argc, const char * argv[]) { + init_options_files(--argc, ++argv); + +// para_printfile(strings1, count1, printleft); +// para_printfile(strings2, count2, printright); + + para* p = para_first(strings1, count1); + para* q = para_first(strings2, count2); + int foundmatch = 0; + + para* qlast = q; + while (p != NULL) { + qlast = q; + foundmatch = 0; + while (q != NULL && (foundmatch = para_equal(p, q)) == 0) { + q = para_next(q); + } + q = qlast; + + if (foundmatch) { + while ((foundmatch = para_equal(p, q)) == 0) { + para_print(q, printright); + q = para_next(q); + qlast = q; + } + para_print(q, printboth); + p = para_next(p); + q = para_next(q); + } else { + para_print(p, printleft); + p = para_next(p); + } + } + while (q != NULL) { + para_print(q, printright); + q = para_next(q); + } + + return 0; +} diff --git a/newfiles/diff_02.zip b/newfiles/diff_02.zip new file mode 100644 index 0000000000000000000000000000000000000000..5d4738597f697a7c3e10ee32e01e7dea316b7117 GIT binary patch literal 7935 zcmch6XHZjX)O8>bLJ^P>M2d8&0Rjlpq)HKx-XWCG1nC`7x(HIFcaUBL1O@562xz4D zUR6+}cX^5Ty$asz{rPe+#b(LKVkpY?<$Yn2h|Ea%2=1aya;;qXwHaB*wehvKf(&8FQ7IrJ#ru|W+<})w(bm@xnv!&CDqS-YQ-xPeZ*vS6MQYHG~>o#|>f}5Yoc7sg5-$!^fXVzJ+^%N?x@ZkXb z0MJt8hq(=vvF0lv>J-+wGHl}(yAhDOln10STs)p>kejkD0NaZTp?}ONUC++bB%3~5 zwH)~-QgJjnrLvt?@tQg}NOX-LQEkD05Vld|iW@OCwF1-Z*ET9zWYaRu1j@?O%3dB` zP~8o?n%RT!kI2RFH4thU^o^vOgQ3O5P*xlu=8ZWR->2A_9)uAf9KW<2FnM5?Fpyvj zh``XFFqU~)xskDH-QH@cN|0Tw+M-`|{|5DG2Jh}NNGtkYW%$ZoVBMMc20Dx2F&;!y zWGHm7F@hn8l)oWJ!SH-8gtuC1Vuq0o9592aSby{kNSR9;ELEQ%eBR3X;Vl!J zef!XpP*CB9lc<-r+@>eqI&LGmd|i7(l9tmuTtVYLZ)o^;ubfZrwN|&+K1t-!ZuRsehuXz43mn5aV0sSP*F?9K5>@yRP0pgVs#7NV-GvTBzj z{&?0ky2Z&sM~m-`>c~XP{p6SyEecb5PD66>fs-muhG?6JM8nHZQZKK+TXBf$iwmS) z>Ur^yem6{`wBb^r_}JvD1Ss?E)U0uSh?)RSppGP{_<%0ope<=T)oDm({+99`EU-zr ze4{210Qd+70F=)%6X!=hlI2{?OzgAFgu@lZCGVMv$?j9jQASD&sl~d&MCWc0`V`eb-REw@&Z-Qh&~;h=4#vrnVSM zDknaX8cWZ$t%B+|xK+_tQjvnGdQ^qUxqTcgR0*^j5?=`}RHTWOjsCLta?y0UAa1eUyx=UYtVaf`cC-ChaH zsR63IgVI~feY`~(K*wWZobrr9(RPb;=W`&E7 zR9>@eGcl)T%wZawxHu7GtXiP@R^wK3g^3k3t~kLOYyqvveTv)l?cl39cVqj|$J7M@ zIY>O&Xjvh%*&J>`BngaEo&?rphpsiDN^P2;#N8xQRc^n5_BG;wpTFf=XZ1mO0z6}s zt4kXB;9kCE40#C<_RvIxH!GJnLW{Inz~{@#Wh%_a>rM*IE@6*sZdGC=b$*#Ld4AJG z@;39=S~+$Rv%*;y)^)?0dZ0TY+L|=;qbrsT`LUPj${s&Q?Bm@UnE<#&NVwVeJ!pG5sRCZ*_6|A_aTf4}Eb&+%<30 zPk%{z*A|NGSjS>gS^cWs@lbK0&3H@q&0=!!P^p{UDMc9Oghqw;m!}|7K~nK5p2ISF zrO3FzZo`A)Q8A$vSH_2BG8JylcIH{755-*`2Kna7NS9Yo>D{X&dVN1TFokb*Gh-PM z9J_rDC9yK@jNNPK0Du?9e@X1OH2rtA{V`3^9HXBoIvT!IV%E__IY2brFER)U)@_4~%WF72inP@1eo0`-5`e)hj z^6dUqQJnsi4VI`X#CukO4*xeB%p#lbp>q=kt$T#{*4xCF7x)FXt17E7k50=+5b+c9 z5JodTX%SV0XWbpP(bXffJ3Zby;YqYd3SbFH!zz%fQL1u?`b}m!`O&>^;vJC!E!MR} zqMxZ#0?F<6vkM+6kL;x33$~10SGdOXUNJK$kUKIFKn*

85?BE#57!en2ktJ|w$q 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 literal 0 HcmV?d00001 diff --git a/newfiles/left.txt b/newfiles/left.txt new file mode 100644 index 0000000..bbae935 --- /dev/null +++ b/newfiles/left.txt @@ -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/newfiles/para.c b/newfiles/para.c new file mode 100644 index 0000000..dd07454 --- /dev/null +++ b/newfiles/para.c @@ -0,0 +1,85 @@ +// +// para.c +// diff +// +// Created by William McCarthy on 5/9/19. +// Copyright © 2019 William McCarthy. All rights reserved. +// + +#include +#include +#include "para.h" +#include "util.h" + +#define BUFLEN 256 + + +para* para_make(char* base[], int filesize, int start, int stop) { + para* p = (para*) malloc(sizeof(para)); + p->base = base; + p->filesize = filesize; + p->start = start; + p->stop = stop; + p->firstline = (p == NULL || start < 0) ? NULL : p->base[start]; + p->secondline = (p == NULL || start < 0 || filesize < 2) ? NULL : p->base[start + 1]; + + return p; +} + +para* para_first(char* base[], int size) { + para* p = para_make(base, size, 0, -1); + return para_next(p); +} + +void para_destroy(para* p) { free(p); } + +para* para_next(para* p) { + if (p == NULL || p->stop == p->filesize) { return NULL; } + + int i; + para* pnew = para_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; + + if (pnew->start >= p->filesize) { + free(pnew); + pnew = NULL; + } + return pnew; +} +size_t para_filesize(para* p) { return p == NULL ? 0 : p->filesize; } + +size_t para_size(para* p) { return p == NULL || p->stop < p->start ? 0 : p->stop - p->start + 1; } + +char** para_base(para* p) { return p->base; } + +char* para_info(para* 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 para_equal(para* p, para* q) { + if (p == NULL || q == NULL) { return 0; } + if (para_size(p) != para_size(q)) { return 0; } + if (p->start >= p->filesize || q->start >= q->filesize) { return 0; } + int i = p->start, j = q->start, equal = 0; + while ((equal = strcmp(p->base[i], q->base[i])) == 0) { ++i; ++j; } + return 1; +} + +void para_print(para* 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 para_printfile(char* base[], int count, void (*fp)(const char*)) { + para* p = para_first(base, count); + while (p != NULL) { + para_print(p, fp); + p = para_next(p); + } + printline(); +} + diff --git a/newfiles/para.h b/newfiles/para.h new file mode 100644 index 0000000..e54444c --- /dev/null +++ b/newfiles/para.h @@ -0,0 +1,36 @@ +// +// para.h +// diff +// +// Created by William McCarthy on 5/9/19. +// Copyright © 2019 William McCarthy. All rights reserved. +// + +#ifndef para_h +#define para_h + +#include + +typedef struct para para; +struct para { + char** base; + int filesize; + int start; + int stop; + char* firstline; // DEBUG only + char* secondline; +}; + +para* para_make(char* base[], int size, int start, int stop); +para* para_first(char* base[], int size); +para* para_next(para* p); +size_t para_filesize(para* p); +size_t para_size(para* p); +char** para_base(para* p); +char* para_info(para* p); +int para_equal(para* p, para* q); +void para_print(para* p, void (*fp)(const char*)); +void para_printfile(char* base[], int count, void (*fp)(const char*)); + + +#endif /* para_h */ diff --git a/newfiles/right.txt b/newfiles/right.txt new file mode 100644 index 0000000..2d7f33d --- /dev/null +++ b/newfiles/right.txt @@ -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. + + diff --git a/newfiles/util.c b/newfiles/util.c new file mode 100644 index 0000000..2c4b9f1 --- /dev/null +++ b/newfiles/util.c @@ -0,0 +1,53 @@ +// +// util.c +// diff +// +// Created by William McCarthy on 5/9/19. +// Copyright © 2019 William McCarthy. All rights reserved. +// + +#include +#include +#include "util.h" + +#define BUFLEN 256 + + +char* yesorno(int condition) { return condition == 0 ? "no" : "YES"; } + +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; +} + +void printline(void) { + for (int i = 0; i < 10; ++i) { printf("=========="); } + printf("\n"); +} + + +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); +} + diff --git a/newfiles/util.h b/newfiles/util.h new file mode 100644 index 0000000..6ff3302 --- /dev/null +++ b/newfiles/util.h @@ -0,0 +1,24 @@ +// +// util.h +// diff +// +// Created by William McCarthy on 5/9/19. +// Copyright © 2019 William McCarthy. All rights reserved. +// + +#ifndef util_h +#define util_h + +#include +#define BUFLEN 256 + +char* yesorno(int condition); +FILE* openfile(const char* filename, const char* openflags); + +void printleft(const char* left); +void printright(const char* right); +void printboth(const char* left_right); + +void printline(void); + +#endif /* util_h */