here u go

master
Chris Nutter 2019-05-17 20:52:52 -07:00
parent e5badeec87
commit 92f2d5dbe5
10 changed files with 201 additions and 180 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

BIN
diff-rcm

Binary file not shown.

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleIdentifier</key>
<string>com.apple.xcode.dsym.diff-rcm</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>dSYM</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>

Binary file not shown.

83
diff.c
View File

@ -12,7 +12,7 @@ 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 != '-' || diffnormal == 1) { standard(files[0], files[1]); }
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]); }
@ -39,7 +39,7 @@ void init(int argc, const char* argv[]) {
setoption(arg, "--suppress-common-lines", NULL, &suppresscommon); setoption(arg, "--suppress-common-lines", NULL, &suppresscommon);
setoption(arg, "-c", "--context", &showcontext); setoption(arg, "-c", "--context", &showcontext);
setoption(arg, "-u", "showunified", &showunified); setoption(arg, "-u", "showunified", &showunified);
setoption(arg, "-h", "--help", &showhelp); setoption(arg, "--help", NULL, &showhelp);
if (arg[0] != '-') { if (arg[0] != '-') {
if (cnt == 2) { if (cnt == 2) {
@ -70,8 +70,8 @@ void setoption(const char* arg, const char* s, const char* t, int* value) {
} }
void diff_output_conflict_error(void) { void diff_output_conflict_error(void) {
fprintf(stderr, "diff: conflicting output style options\n"); fprintf(stderr, "diff-rcm: Conflicting output style options.\n");
fprintf(stderr, "diff: Try `diff --help' for more information.)\n"); fprintf(stderr, "diff-rcm: Try `diff --help' for more information.)\n");
exit(CONFLICTING_OUTPUT_OPTIONS); exit(CONFLICTING_OUTPUT_OPTIONS);
} }
@ -114,7 +114,7 @@ void help() {
printf("\nUsage: diff-rcm [OPTION]... FILES\n"); printf("\nUsage: diff-rcm [OPTION]... FILES\n");
printf("Compare FILES line by line.\n\n"); printf("Compare FILES line by line.\n\n");
printf("Mandatory arguments to long options are mandatory for short options too.\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 --standard\t\t output a standard diff (the default)\n");
printf("\t-q, --brief\t\t report only when files differ\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-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-c, -C NUM, --context[=NUM] output NUM (default 3) lines of copied context\n");
@ -132,54 +132,61 @@ void help() {
printf("diff-rcm homepage: <https://www.github.com/cdnutter/diff/>\n\n"); printf("diff-rcm homepage: <https://www.github.com/cdnutter/diff/>\n\n");
} }
int normal(const char* filename1, const char* filename2) { int standard(const char* filename1, const char* filename2) {
identical(filename1, filename2); identical(filename1, filename2);
printf("\nTHIS IS NOT NORMAL FOR NOW. THIS IS PLACEHOLDER. MMKAY.\n"); printf("\nTHIS IS NOT standard FOR NOW. THIS IS PLACEHOLDER. MMKAY.\n");
printf("THIS IS NOT NORMAL FOR NOW. THIS IS PLACEHOLDER. MMKAY.\n"); printf("THIS IS NOT standard FOR NOW. THIS IS PLACEHOLDER. MMKAY.\n");
printf("THIS IS NOT NORMAL FOR NOW. THIS IS PLACEHOLDER. MMKAY.\n"); printf("THIS IS NOT standard FOR NOW. THIS IS PLACEHOLDER. MMKAY.\n");
printf("THIS IS NOT NORMAL FOR NOW. THIS IS PLACEHOLDER. MMKAY.\n\n"); printf("THIS IS NOT standard FOR NOW. THIS IS PLACEHOLDER. MMKAY.\n\n");
//pa_print(p, printnormal); //pa* qlast = q;
return 0; return 0;
} }
int sideside(const char* filename1, const char* filename2) { int sideside(const char* filename1, const char* filename2) {
pa* qlast = q; pa* qlast = q;
while (p != NULL) {
qlast = q; while(p != NULL) {
foundmatch = 0;
while (q != NULL && (foundmatch = pa_equal(p, q)) == 0) { q = pa_next(q); }
q = qlast;
if (foundmatch) {
while ((foundmatch = pa_equal(p, q)) == 0) {
pa_print(q, printright);
q = pa_next(q);
qlast = q; qlast = q;
} foundmatch = 0;
pa_print(q, printboth);
p = pa_next(p); while (q != NULL && (foundmatch = pa_equal(p, q)) == 0) { q = pa_next(q); }
q = pa_next(q); q = qlast;
} else {
pa_print(p, printleft); if (foundmatch) {
p = pa_next(p); while ((foundmatch = pa_equal(p, q)) == 0) {
pa_print(q, NULL, printright);
q = pa_next(q);
qlast = q;
}
if (showleftcolumn) { pa_print(p, q, printnocommon); }
else if (suppresscommon) { pa_print(p, q, printleftparen); }
else { pa_print(p, q, printboth); }
p = pa_next(p);
q = pa_next(q);
}
else { pa_print(p, NULL, printleft); p = pa_next(p); }
} }
}
while (q != NULL) { while(q != NULL) { pa_print(q, NULL, printright); q = pa_next(q); }
pa_print(q, printright);
q = pa_next(q); 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"); } else { return; } } 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 (*filename1 == *filename2 || (pa_equal(p, q) != 0)) { printf("The files are identical.\n"); } if (*filename1 == *filename2 || (pa_equal(p, q) != 0)) { printf("The files are identical.\n"); }
else { normal(files[0], files[1]); } else { standard(files[0], files[1]); }
} }

2
diff.h
View File

@ -49,7 +49,7 @@ void loadfiles(const char* filename1, const char* filename2);
void version(); void version();
void help(); void help();
int normal(const char* filename1, const char* filename2); int standard(const char* filename1, const char* filename2);
int sideside(const char* filename1, const char* filename2); int sideside(const char* filename1, const char* filename2);
void quiet(const char* filename1, const char* filename2); void quiet(const char* filename1, const char* filename2);
void loud(const char* filename1, const char* filename2); void loud(const char* filename1, const char* filename2);

View File

@ -1,25 +0,0 @@
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.

198
pa.c
View File

@ -7,108 +7,152 @@
// ======================================================================= // // ======================================================================= //
pa* pa_make(char* base[], int filesize, int start, int stop) { pa* pa_make(char* base[], int filesize, int start, int stop) {
pa* p = (pa*) malloc(sizeof(pa));
p->base = base; pa* p = (pa*)malloc(sizeof(pa));
p->filesize = filesize;
p->start = start; p->base = base;
p->stop = stop; p->filesize = filesize;
p->firstline = (p == NULL || start < 0) ? NULL : p->base[start]; p->start = start;
p->secondline = (p == NULL || start < 0 || filesize < 2) ? NULL : p->base[start + 1]; 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;
}
return p; pa* pa_next(pa* p) {
int i;
if (p->stop == p->filesize) { return NULL; }
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;
if (pnew->start >= p->filesize) { free(pnew); pnew = NULL; }
return pnew;
} }
pa* pa_first(char* base[], int size) { pa* pa_first(char* base[], int size) {
pa* p = pa_make(base, size, 0, -1);
return pa_next(p); pa* p = pa_make(base, size, 0, -1);
return pa_next(p);
} }
void pa_destroy(pa* p) { free(p); } void pa_destroy(pa* p) { free(p); }
pa* pa_next(pa* p) {
if (p == NULL || 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;
if (pnew->start >= p->filesize) {
free(pnew);
pnew = NULL;
}
return pnew;
}
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* pa_info(pa* p) { 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", static char buf[BUFLEN];
p->base, p->filesize, p->start, p->stop); 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 return buf;
} }
int pa_equal(pa* p, pa* q) { int pa_equal(pa* p, pa* q) {
if (p == NULL || q == NULL) { return 0; }
if (pa_size(p) != pa_size(q)) { return 0; } if (p == NULL || q == NULL) { return 0; }
if (p->start >= p->filesize || q->start >= q->filesize) { return 0; } if (pa_size(p) != pa_size(q)) { return 0; }
int i = p->start, j = q->start, equal = 0; if(p->start >= p->filesize || q->start >= q->filesize) { return 0; }
while ((equal = strcmp(p->base[i], q->base[i])) == 0) { ++i; ++j; }
return 1; int i = p->start, j = q->start, equal = 0;
while ((equal = strcmp(p->base[i], q->base[i])) == 0) { ++i; ++j; }
return 1;
} }
void pa_print(pa* p, void (*fp)(const char*)) { void sideside_type(const char* left, const char* right, int nocommon, int leftparen, char symbol) {
if (p == NULL) { return; }
for (int i = p->start; i <= p->stop && i != p->filesize; ++i) { fp(p->base[i]); } char buf[BUFLEN];
symbol = ((strcmp(left, right) == 0) ? symbol : '|');
size_t len = strlen(left);
if(len > 0) { strncpy(buf, left, len); }
buf[len - 1] = '\0';
if(symbol != '|' && nocommon == 1) { return; }
printf("%-61s %c ", buf, symbol);
if (symbol == '|') { printf("%s", right); }
else { printf("%s", (leftparen ? "\n" : right)); }
} }
void pa_printfile(char* base[], int count, void (*fp)(const char*)) { void print_first(pa* p, void (*fp)(const char*)) {
pa* p = pa_first(base, count);
while (p != NULL) { if (p == NULL) { return; }
pa_print(p, fp); for (int i = p->start; i <= p->stop && i != p->filesize; ++i) { fp(p->base[i]); }
p = pa_next(p);
}
printline();
} }
char* yesorno(int condition) { return condition == 0 ? "no" : "YES"; } void print_second(pa* p, pa* q, void (*fp)(const char*, const char*)) {
if(p == NULL || q == NULL) { return; }
for(int i = p->start, j = q->start;
i <= p->stop && i != p->filesize &&
j <= q->stop && j != q->filesize; ++i, ++j) {
fp(p->base[i], q->base[j]);
}
}
void pa_print(pa* p, pa* q, void (*fp)(const char*, const char*)) {
if(q == NULL) { print_first(p, (void (*)(const char*)) fp); }
else { print_second(p, q, fp); }
}
void printleftparen(const char* left, const char* right) { sideside_type(left, right, 1, 0, ' '); }
void printnocommon(const char* left, const char* right) { sideside_type(left, right, 0, 1, '('); }
FILE* openfile(const char* filename, const char* openflags) { 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); } FILE* f;
return f; if ((f = fopen(filename, openflags)) == NULL) { printf("can't open '%s'\n", filename); exit(1); }
return f;
} }
void printline(void) { void printleft(const char* left, const char* n) {
for (int i = 0; i < 10; ++i) { printf("=========="); }
printf("\n"); 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, const char* n) {
void printleft(const char* left) {
char buf[BUFLEN]; if (right == NULL) { return; }
printf("%50s %s", ">", right);
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) { void printboth(const char* left_right, const char* n) {
if (right == NULL) { return; }
printf("%50s %s", ">", right); char buf[BUFLEN];
} size_t len = strlen(left_right);
void printboth(const char* left_right) { if (len > 0) { strncpy(buf, left_right, len); }
char buf[BUFLEN];
size_t len = strlen(left_right); buf[len - 1] = '\0';
if (len > 0) { strncpy(buf, left_right, len); } printf("%-50s %s", buf, left_right);
buf[len - 1] = '\0';
printf("%-50s %s", buf, left_right);
} }

22
pa.h
View File

@ -23,18 +23,24 @@ pa* q;
pa* pa_make(char* base[], int size, int start, int stop); pa* pa_make(char* base[], int size, int start, int stop);
pa* pa_first(char* base[], int size); pa* pa_first(char* base[], int size);
pa* pa_next(pa* p); pa* pa_next(pa* p);
void pa_destroy(pa* p);
size_t pa_filesize(pa* p); size_t pa_filesize(pa* p);
size_t pa_size(pa* p); size_t pa_size(pa* p);
char** pa_base(pa* p); char** pa_base(pa* p);
char* pa_info(pa* p); char* pa_info(pa* p);
int pa_equal(pa* p, pa* q); int pa_equal(pa* p, pa* q);
void pa_print(pa* p, void (*fp)(const char*)); void sideside_type(const char* left, const char* right, int nocommon, int leftparen, char symbol);
void printboth(const char* left_right); void print_first(pa* p, void (*fp)(const char*));
void printleft(const char* left); void print_second(pa* p, pa* q, void (*fp)(const char*, const char*));
void printright(const char* right); void pa_print(pa* p, pa* q, void (*fp)(const char*, const char*));
void pa_printfile(char* base[], int count, void (*fp)(const char*)); void printleftparen(const char* left, const char* right);
FILE* openfile(const char* filename, const char* openflags); void printnocommon(const char* left, const char* right);
void pa_printfile(char* base[], int count, void(*fp)(const char*, const char*));
char* yesorno(int condition); char* yesorno(int condition);
void printline(void); FILE* openfile(const char* filename, const char* openflags);
void pa_printline(void);
void printleft(const char* left, const char*);
void printright(const char* right, const char*);
void printboth(const char* left_right, const char* n);
#endif #endif

View File

@ -1,31 +0,0 @@
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.