here u go
parent
e5badeec87
commit
92f2d5dbe5
|
@ -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.
53
diff.c
53
diff.c
|
@ -12,7 +12,7 @@ int main(int argc, const char* argv[]) {
|
|||
init(--argc, ++argv);
|
||||
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 (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, "-c", "--context", &showcontext);
|
||||
setoption(arg, "-u", "showunified", &showunified);
|
||||
setoption(arg, "-h", "--help", &showhelp);
|
||||
setoption(arg, "--help", NULL, &showhelp);
|
||||
|
||||
if (arg[0] != '-') {
|
||||
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) {
|
||||
|
||||
fprintf(stderr, "diff: conflicting output style options\n");
|
||||
fprintf(stderr, "diff: Try `diff --help' for more information.)\n");
|
||||
fprintf(stderr, "diff-rcm: Conflicting output style options.\n");
|
||||
fprintf(stderr, "diff-rcm: Try `diff --help' for more information.)\n");
|
||||
exit(CONFLICTING_OUTPUT_OPTIONS);
|
||||
|
||||
}
|
||||
|
@ -114,7 +114,7 @@ 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 --standard\t\t output a standard 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");
|
||||
|
@ -132,54 +132,61 @@ void help() {
|
|||
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);
|
||||
|
||||
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");
|
||||
printf("\nTHIS IS NOT standard FOR NOW. THIS IS PLACEHOLDER. MMKAY.\n");
|
||||
printf("THIS IS NOT standard FOR NOW. THIS IS PLACEHOLDER. MMKAY.\n");
|
||||
printf("THIS IS NOT standard FOR NOW. THIS IS PLACEHOLDER. MMKAY.\n");
|
||||
printf("THIS IS NOT standard FOR NOW. THIS IS PLACEHOLDER. MMKAY.\n\n");
|
||||
|
||||
//pa_print(p, printnormal);
|
||||
//pa* qlast = q;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sideside(const char* filename1, const char* filename2) {
|
||||
|
||||
pa* qlast = q;
|
||||
while (p != NULL) {
|
||||
|
||||
while(p != NULL) {
|
||||
|
||||
qlast = q;
|
||||
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);
|
||||
pa_print(q, NULL, printright);
|
||||
q = pa_next(q);
|
||||
qlast = q;
|
||||
}
|
||||
pa_print(q, printboth);
|
||||
|
||||
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, printleft);
|
||||
p = pa_next(p);
|
||||
}
|
||||
}
|
||||
while (q != NULL) {
|
||||
pa_print(q, printright);
|
||||
q = pa_next(q);
|
||||
}
|
||||
|
||||
else { pa_print(p, NULL, printleft); p = pa_next(p); }
|
||||
}
|
||||
|
||||
while(q != NULL) { pa_print(q, NULL, printright); q = pa_next(q); }
|
||||
|
||||
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 loud(const char* filename1, const char* filename2) {
|
||||
|
||||
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
2
diff.h
|
@ -49,7 +49,7 @@ void loadfiles(const char* filename1, const char* filename2);
|
|||
void version();
|
||||
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);
|
||||
void quiet(const char* filename1, const char* filename2);
|
||||
void loud(const char* filename1, const char* filename2);
|
||||
|
|
25
left.txt
25
left.txt
|
@ -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.
|
||||
|
122
pa.c
122
pa.c
|
@ -7,7 +7,9 @@
|
|||
// ======================================================================= //
|
||||
|
||||
pa* pa_make(char* base[], int filesize, int start, int stop) {
|
||||
pa* p = (pa*) malloc(sizeof(pa));
|
||||
|
||||
pa* p = (pa*)malloc(sizeof(pa));
|
||||
|
||||
p->base = base;
|
||||
p->filesize = filesize;
|
||||
p->start = start;
|
||||
|
@ -16,99 +18,141 @@ pa* pa_make(char* base[], int filesize, int start, int stop) {
|
|||
p->secondline = (p == NULL || start < 0 || filesize < 2) ? NULL : p->base[start + 1];
|
||||
|
||||
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* p = pa_make(base, size, 0, -1);
|
||||
return pa_next(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_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_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
|
||||
|
||||
static char buf[BUFLEN];
|
||||
snprintf(buf, sizeof(buf), "base: %p, filesize: %d, start: %d, stop: %d\n", p->base, p->filesize, p->start, p->stop);
|
||||
return buf;
|
||||
|
||||
}
|
||||
|
||||
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->start >= p->filesize || q->start >= q->filesize) { 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 pa_print(pa* p, void (*fp)(const char*)) {
|
||||
void sideside_type(const char* left, const char* right, int nocommon, int leftparen, char symbol) {
|
||||
|
||||
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 print_first(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_printfile(char* base[], int count, void (*fp)(const char*)) {
|
||||
pa* p = pa_first(base, count);
|
||||
while (p != NULL) {
|
||||
pa_print(p, fp);
|
||||
p = pa_next(p);
|
||||
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]);
|
||||
}
|
||||
printline();
|
||||
|
||||
}
|
||||
|
||||
char* yesorno(int condition) { return condition == 0 ? "no" : "YES"; }
|
||||
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* 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, const char* 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) {
|
||||
void printright(const char* right, const char* n) {
|
||||
|
||||
if (right == NULL) { return; }
|
||||
printf("%50s %s", ">", right);
|
||||
|
||||
}
|
||||
|
||||
void printboth(const char* left_right) {
|
||||
void printboth(const char* left_right, const char* n) {
|
||||
|
||||
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);
|
||||
|
||||
}
|
||||
|
|
20
pa.h
20
pa.h
|
@ -23,18 +23,24 @@ pa* q;
|
|||
pa* pa_make(char* base[], int size, int start, int stop);
|
||||
pa* pa_first(char* base[], int size);
|
||||
pa* pa_next(pa* p);
|
||||
void pa_destroy(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);
|
||||
void pa_printfile(char* base[], int count, void (*fp)(const char*));
|
||||
FILE* openfile(const char* filename, const char* openflags);
|
||||
void sideside_type(const char* left, const char* right, int nocommon, int leftparen, char symbol);
|
||||
void print_first(pa* p, void (*fp)(const char*));
|
||||
void print_second(pa* p, pa* q, void (*fp)(const char*, const char*));
|
||||
void pa_print(pa* p, pa* q, void (*fp)(const char*, const char*));
|
||||
void printleftparen(const char* left, const char* right);
|
||||
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);
|
||||
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
|
||||
|
|
31
right.txt
31
right.txt
|
@ -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.
|
||||
|
||||
|
Loading…
Reference in New Issue