From d5cf64518a956a9765b6d4da79e3a71fda12b5dd Mon Sep 17 00:00:00 2001 From: Chris Nutter Date: Sat, 11 May 2019 22:56:41 -0700 Subject: [PATCH] added help --- diff-rcm | Bin 23152 -> 35072 bytes diff.c | 72 +++++++++++++++++++++++++++------------------------- diff.h | 18 ++++++++++++- helptxt.txt | 23 +++++++++++++++++ pa.c | 7 ++++- 5 files changed, 84 insertions(+), 36 deletions(-) create mode 100644 helptxt.txt diff --git a/diff-rcm b/diff-rcm index 034913bb44264af1bbafa6c2ab8b9030a634d7ec..b109891ab2ab40b00c49b88e539918579c63abef 100755 GIT binary patch literal 35072 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 Y63UI0T;tET&Pte5A!s(pFYeCyf8D+6bpQYW diff --git a/diff.c b/diff.c index 79db9f3..d4ac62c 100644 --- a/diff.c +++ b/diff.c @@ -7,37 +7,17 @@ // ================================================================ // -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(); - -int normal(const char* filename1, const char* filename2); -int sideside(const char* filename1, const char* filename2); -void quiet(const char* filename1, const char* filename2); -void loud(const char* filename1, const char* filename2); - -// ================================================================ // - int main(int argc, const char* argv[]) { init(--argc, ++argv); loadfiles(files[0], files[1]); if (**argv != '-') { normal(files[0], files[1]); } - if (argc < 3) { printf("Usage: ./diff [options] file1 file2\n"); } - //if (!diffnormal) { normal(files[0], files[1]); printf("\n"); } if (showsidebyside) { sideside(files[0], files[1]); } if (showbrief) { quiet(files[0], files[1]); } if (report_identical) { loud(files[0], files[1]); } - if (!showversion && !showbrief && !ignorecase && !report_identical && - !diffnormal && !showsidebyside && !showleftcolumn && !suppresscommon && - !showcontext && !showunified && !showhelp) { printf("Usage: ./diff [options] file1 file2\n"); } + return 0; } @@ -70,7 +50,10 @@ void init(int argc, const char* argv[]) { ++argv; } + // ================================= // + if (showversion) { version(); exit(0); } + if (showhelp) { help(); exit(0); } if (!showcontext && !showunified && !showsidebyside && !showleftcolumn) { diffnormal = 1; } @@ -95,6 +78,8 @@ void diff_output_conflict_error(void) { void loadfiles(const char* filename1, const char* filename2) { + if (filename2 == NULL) { printf("Usage: ./diff [options] file1 file2\n"); exit(1); } + memset(buf, 0, sizeof(buf)); memset(strings1, 0, sizeof(strings1)); memset(strings2, 0, sizeof(strings2)); @@ -108,8 +93,6 @@ void loadfiles(const char* filename1, const char* filename2) { p = pa_first(strings1, count1); q = pa_first(strings2, count2); - int foundmatch = 0; - } void version() { @@ -130,27 +113,40 @@ void version() { printf("\tv0.5 alpha | Smoking is bad for your health.\n\n"); printf("Copyright (C) 2019 | All Rights Reserved.\n"); printf("Any unauthorized use or re-distribution of this code is permitted.\n\n"); - printf("\tChris Nutter\tWilliam McCarthy Rasputin\n\n\n"); + printf("\tChris Nutter\tWilliam McCarthy Rasputin\n\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 pameters"); - printf("\nTODO: implement multiple types of pameters\n"); +void help() { + printf("\nUsage: diff-rcm [OPTION]... FILES\n"); + printf("Compare FILES line by line.\n\n"); + printf("Mandatory arguments to long options are mandatory for short options too.\n\n"); + printf("\t --normal\t\t output a normal diff (the default)\n"); + printf("\t-q, --brief\t\t report only when files differ\n"); + printf("\t-s, --report-identical-files report when two files are the same\n"); + printf("\t-c, -C NUM, --context[=NUM] output NUM (default 3) lines of copied context\n"); + printf("\t-u, -U NUM, --unified[=NUM] output NUM (default 3) lines of unified context\n"); + printf("\t-y, --side-by-side\t output in two columns\n\n"); + printf("\t-i, --ignore-case\t ignore case differences in file contents\n\n"); + printf("\t --help\t\t display this help and exit\n"); + printf("\t-v, --version\t\t output version information and exit\n\n"); + + printf("FILES are 'FILE1 FILE2'\n"); + printf("If --from-file or --to-file is given, there are no restrictions on FILE(s).\n"); + printf("If a FILE is '-', read standard input.\n"); + printf("Exit status is 0 if inputs are the same, 1 if different, 2 if trouble.\n\n"); + printf("Report bugs to: cdnutter@gmail.com\n"); + printf("diff-rcm homepage: \n\n"); } 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"); + printf("THIS 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* filename1, const char* filename2) { @@ -162,7 +158,7 @@ int sideside(const char* filename1, const char* filename2) { return 0; } -void quiet(const char* filename1, const char* filename2) { if (pa_equal(p, q) == 0) { printf("The files are not the same.\n"); } } +void quiet(const char* filename1, const char* filename2) { if (pa_equal(p, q) == 0) { printf("The files are not the same.\n"); } else { return; } } void loud(const char* filename1, const char* filename2) { if (pa_equal(p, q) != 0) { printf("The files are equal.\n"); } @@ -171,3 +167,11 @@ void loud(const char* filename1, const char* filename2) { } // ================================================================ // + +/* + TODO: check line by line in a pagraph, using '|' for differences"); + TODO: this starter code does not yet handle printing all of fin1's pagraphs."); + TODO: handle the rest of diff's options"); + TODO: fix standard printing with no pameters"); + TODO: implement multiple types of pameters\n"); +*/ diff --git a/diff.h b/diff.h index abd3b2c..8f9ba97 100644 --- a/diff.h +++ b/diff.h @@ -12,7 +12,7 @@ #define HASHLEN 200 #define BUFLEN 256 -// ======================================================================= // +// ================================================================= // FILE *fin1, *fin2; const char* files[2] = { NULL, NULL }; @@ -27,3 +27,19 @@ int showhelp = 0; int equal = 0, cnt = 0, count = 0; int count1 = 0, count2 = 0; + +// ================================================================ // + +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 help(); + +int normal(const char* filename1, const char* filename2); +int sideside(const char* filename1, const char* filename2); +void quiet(const char* filename1, const char* filename2); +void loud(const char* filename1, const char* filename2); diff --git a/helptxt.txt b/helptxt.txt new file mode 100644 index 0000000..9347481 --- /dev/null +++ b/helptxt.txt @@ -0,0 +1,23 @@ +Usage: diff-rcm [OPTION]... FILES +Compare FILES line by line. + +Mandatory arguments to long options are mandatory for short options too. + --normal output a normal diff (the default) + -q, --brief report only when files differ + -s, --report-identical-files report when two files are the same + -c, -C NUM, --context[=NUM] output NUM (default 3) lines of copied context + -u, -U NUM, --unified[=NUM] output NUM (default 3) lines of unified context + -y, --side-by-side output in two columns + + -i, --ignore-case ignore case differences in file contents + + --help display this help and exit + -v, --version output version information and exit + +FILES are 'FILE1 FILE2' +If --from-file or --to-file is given, there are no restrictions on FILE(s). +If a FILE is '-', read standard input. +Exit status is 0 if inputs are the same, 1 if different, 2 if trouble. + +Report bugs to: cdnutter@gmail.com +diff-rcm home page: diff --git a/pa.c b/pa.c index 6bc08f3..79c839c 100644 --- a/pa.c +++ b/pa.c @@ -29,6 +29,7 @@ pa* pa_next(pa* p) { 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]); } @@ -55,16 +56,19 @@ void printboth(const char* left_right) { 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* 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; } @@ -72,6 +76,7 @@ int pa_equal(pa* p, pa* q) { 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); }