added help
parent
9dbccbf46d
commit
d5cf64518a
70
diff.c
70
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[]) {
|
int main(int argc, const char* argv[]) {
|
||||||
|
|
||||||
init(--argc, ++argv);
|
init(--argc, ++argv);
|
||||||
loadfiles(files[0], files[1]);
|
loadfiles(files[0], files[1]);
|
||||||
|
|
||||||
if (**argv != '-') { normal(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 (showsidebyside) { sideside(files[0], files[1]); }
|
||||||
if (showbrief) { quiet(files[0], files[1]); }
|
if (showbrief) { quiet(files[0], files[1]); }
|
||||||
if (report_identical) { loud(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;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -70,7 +50,10 @@ void init(int argc, const char* argv[]) {
|
||||||
++argv;
|
++argv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ================================= //
|
||||||
|
|
||||||
if (showversion) { version(); exit(0); }
|
if (showversion) { version(); exit(0); }
|
||||||
|
if (showhelp) { help(); exit(0); }
|
||||||
|
|
||||||
if (!showcontext && !showunified &&
|
if (!showcontext && !showunified &&
|
||||||
!showsidebyside && !showleftcolumn) { diffnormal = 1; }
|
!showsidebyside && !showleftcolumn) { diffnormal = 1; }
|
||||||
|
@ -95,6 +78,8 @@ void diff_output_conflict_error(void) {
|
||||||
|
|
||||||
void loadfiles(const char* filename1, const char* filename2) {
|
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(buf, 0, sizeof(buf));
|
||||||
memset(strings1, 0, sizeof(strings1));
|
memset(strings1, 0, sizeof(strings1));
|
||||||
memset(strings2, 0, sizeof(strings2));
|
memset(strings2, 0, sizeof(strings2));
|
||||||
|
@ -108,8 +93,6 @@ void loadfiles(const char* filename1, const char* filename2) {
|
||||||
p = pa_first(strings1, count1);
|
p = pa_first(strings1, count1);
|
||||||
q = pa_first(strings2, count2);
|
q = pa_first(strings2, count2);
|
||||||
|
|
||||||
int foundmatch = 0;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void version() {
|
void version() {
|
||||||
|
@ -132,25 +115,38 @@ void version() {
|
||||||
printf("Any unauthorized use or re-distribution of this code is permitted.\n\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() {
|
void help() {
|
||||||
printf("\nTODO: check line by line in a pagraph, using '|' for differences");
|
printf("\nUsage: diff-rcm [OPTION]... FILES\n");
|
||||||
printf("\nTODO: this starter code does not yet handle printing all of fin1's pagraphs.");
|
printf("Compare FILES line by line.\n\n");
|
||||||
printf("\nTODO: handle the rest of diff's options");
|
printf("Mandatory arguments to long options are mandatory for short options too.\n\n");
|
||||||
printf("\nTODO: fix standard printing with no pameters");
|
printf("\t --normal\t\t output a normal diff (the default)\n");
|
||||||
printf("\nTODO: implement multiple types of pameters\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: <https://www.github.com/cdnutter/diff/>\n\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
int normal(const char* filename1, const char* filename2) {
|
int normal(const char* filename1, const char* filename2) {
|
||||||
|
|
||||||
printf("\nTHIS IS NOT NORMAL FOR NOW. THIS IS PLACEHOLDER. MMKAY.\n");
|
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");
|
printf("THIS IS NOT NORMAL FOR NOW. THIS IS PLACEHOLDER. MMKAY.\n\n\n");
|
||||||
|
|
||||||
pa_print(p, printleft);
|
pa_print(p, printleft);
|
||||||
pa_print(q, printright);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
int sideside(const char* filename1, const char* filename2) {
|
int sideside(const char* filename1, const char* filename2) {
|
||||||
|
@ -162,7 +158,7 @@ int sideside(const char* filename1, const char* filename2) {
|
||||||
|
|
||||||
return 0;
|
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) {
|
void loud(const char* filename1, const char* filename2) {
|
||||||
|
|
||||||
if (pa_equal(p, q) != 0) { printf("The files are equal.\n"); }
|
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");
|
||||||
|
*/
|
||||||
|
|
18
diff.h
18
diff.h
|
@ -12,7 +12,7 @@
|
||||||
#define HASHLEN 200
|
#define HASHLEN 200
|
||||||
#define BUFLEN 256
|
#define BUFLEN 256
|
||||||
|
|
||||||
// ======================================================================= //
|
// ================================================================= //
|
||||||
|
|
||||||
FILE *fin1, *fin2;
|
FILE *fin1, *fin2;
|
||||||
const char* files[2] = { NULL, NULL };
|
const char* files[2] = { NULL, NULL };
|
||||||
|
@ -27,3 +27,19 @@ int showhelp = 0;
|
||||||
int equal = 0, cnt = 0, count = 0;
|
int equal = 0, cnt = 0, count = 0;
|
||||||
|
|
||||||
int count1 = 0, count2 = 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);
|
||||||
|
|
|
@ -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: <https://Github.com/cdnutter/diff/>
|
7
pa.c
7
pa.c
|
@ -29,6 +29,7 @@ pa* pa_next(pa* p) {
|
||||||
|
|
||||||
return pnew;
|
return pnew;
|
||||||
}
|
}
|
||||||
|
|
||||||
void pa_print(pa* p, void (*fp)(const char*)) {
|
void pa_print(pa* p, void (*fp)(const char*)) {
|
||||||
if (p == NULL) { return; }
|
if (p == NULL) { return; }
|
||||||
for (int i = p->start; i <= p->stop && i != p->filesize; ++i) { fp(p->base[i]); }
|
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';
|
buf[len - 1] = '\0';
|
||||||
printf("%-50s %s", buf, left_right);
|
printf("%-50s %s", buf, left_right);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t pa_filesize(pa* p) { return p == NULL ? 0 : p->filesize; }
|
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; }
|
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** 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) {
|
char* pa_info(pa* p) {
|
||||||
static char buf[BUFLEN]; // static for a reason
|
static char buf[BUFLEN]; // static for a reason
|
||||||
snprintf(buf, sizeof(buf), "base: %p, filesize: %d, start: %d, stop: %d\n",
|
snprintf(buf, sizeof(buf), "base: %p, filesize: %d, start: %d, stop: %d\n",
|
||||||
p->base, p->filesize, p->start, p->stop);
|
p->base, p->filesize, p->start, p->stop);
|
||||||
return buf; // buf MUST be static
|
return buf; // buf MUST be static
|
||||||
}
|
}
|
||||||
|
|
||||||
int pa_equal(pa* p, pa* q) {
|
int pa_equal(pa* p, pa* q) {
|
||||||
if (p == NULL || q == NULL) { return 0; }
|
if (p == NULL || q == NULL) { return 0; }
|
||||||
if (pa_size(p) != pa_size(q)) { 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; }
|
while ((equal = strcmp(p->base[i], q->base[i])) == 0) { ++i; ++j; }
|
||||||
return equal;
|
return equal;
|
||||||
}
|
}
|
||||||
|
|
||||||
FILE* openfile(const char* filename, const char* openflags) {
|
FILE* openfile(const char* filename, const char* openflags) {
|
||||||
FILE* f;
|
FILE* f;
|
||||||
if ((f = fopen(filename, openflags)) == NULL) { printf("can't open '%s'\n", filename); exit(1); }
|
if ((f = fopen(filename, openflags)) == NULL) { printf("can't open '%s'\n", filename); exit(1); }
|
||||||
|
|
Loading…
Reference in New Issue