📄 difflib.c
字号:
if (!u_diff2w_diff(mindiff, u_diff_fn, w_diff_fn)) { UNLINK(w_diff_fn); ERRHNDL(0, "u_diff2w_diff returns 0 in u_diff2c_diff", "", 1); } rtrn = w_diff2c_diff(mindiff, w_diff_fn, c_diff_fn); UNLINK(w_diff_fn); return rtrn;}/* u_diff2c_diff */intu_diff2lwc_diff(int mindiff, int LWC, char *u_diff_fn, char *lwc_diff_fn){ TRACE(fprintf(STDERR, "u_diff2lwc_diff(%i,%s,%s)\n", LWC, u_diff_fn, lwc_diff_fn)); switch (LWC) { case 0: return (u_diff2l_diff(u_diff_fn, lwc_diff_fn)); case 1: return (u_diff2w_diff(mindiff, u_diff_fn, lwc_diff_fn)); case 2: return (u_diff2c_diff(mindiff, u_diff_fn, lwc_diff_fn)); default: ErrXit("u_diff2lwc_diff called with wrong LWC", "", 1); } return 0;}/* u_diff2lwc_diff */intoldnew2l_diff(int mindiff, int context, char *ignore, char *old_fn, char *new_fn, char *l_diff_fn){ char u_diff_fn[BUFLEN]; int rtrn = 0; TRACE(fprintf(STDERR, "oldnew2l_diff(%i,%i,%s,%s,%s,%s)\n", mindiff, context, ignore, old_fn, new_fn, l_diff_fn)); sprintf(u_diff_fn, "%s%c.difflib-%ld-oldnew2l_diff-u_diff", tmpdir(), DIR_SEP, (long) getpid()); if (!oldnew2u_diff(mindiff, context, ignore, old_fn, new_fn, u_diff_fn)) { UNLINK(u_diff_fn); ERRHNDL(0, "oldnew2u_diff returns 0 in oldnew2l_diff", "", 1); } rtrn = u_diff2l_diff(u_diff_fn, l_diff_fn); UNLINK(u_diff_fn); return rtrn;}/* oldnew2l_diff */intoldnew2w_diff(int mindiff, int context, char *ignore, char *old_fn, char *new_fn, char *w_diff_fn){ char l_diff_fn[BUFLEN]; int rtrn = 0; TRACE(fprintf(STDERR, "oldnew2w_diff(%i,%i,%s,%s,%s,%s)\n", mindiff, context, ignore, old_fn, new_fn, w_diff_fn)); sprintf(l_diff_fn, "%s%c.difflib-%ld-oldnew2w_diff-l_diff", tmpdir(), DIR_SEP, (long) getpid()); if (!oldnew2l_diff(mindiff, context, ignore, old_fn, new_fn, l_diff_fn)) { UNLINK(l_diff_fn); ERRHNDL(0, "oldnew2l_diff returns 0 in oldnew2w_diff", "", 1); } rtrn = l_diff2w_diff(mindiff, l_diff_fn, w_diff_fn); UNLINK(l_diff_fn); return rtrn;}/* oldnew2w_diff */intoldnew2c_diff(int mindiff, int context, char *ignore, char *old_fn, char *new_fn, char *c_diff_fn){ char w_diff_fn[BUFLEN]; int rtrn = 0; TRACE(fprintf(STDERR, "oldnew2c_diff(%i,%i,%s,%s,%s,%s)\n", mindiff, context, ignore, old_fn, new_fn, c_diff_fn)); sprintf(w_diff_fn, "%s%c.difflib-%ld-oldnew2c_diff-w_diff", tmpdir(), DIR_SEP, (long) getpid()); if (!oldnew2w_diff(mindiff, context, ignore, old_fn, new_fn, w_diff_fn)) { UNLINK(w_diff_fn); ERRHNDL(0, "oldnew2w_diff returns 0 in oldnew2c_diff", "", 1); } rtrn = w_diff2c_diff(mindiff, w_diff_fn, c_diff_fn); UNLINK(w_diff_fn); return rtrn;}/* oldnew2c_diff */intoldnew2lwc_diff(int mindiff, int LWC, int context, char *ignore, char *old_fn, char *new_fn, char *lwc_diff_fn){ TRACE(fprintf(STDERR, "oldnew2lwc_diff(%i,%i,%i,%s,%s,%s,%s)\n", mindiff, LWC, context, ignore, old_fn, new_fn, lwc_diff_fn)); switch (LWC) { case 0: return oldnew2l_diff(mindiff, context, ignore, old_fn, new_fn, lwc_diff_fn); case 1: return oldnew2w_diff(mindiff, context, ignore, old_fn, new_fn, lwc_diff_fn); case 2: return oldnew2c_diff(mindiff, context, ignore, old_fn, new_fn, lwc_diff_fn); default: ErrXit("oldnew2lwc_diff called with wrong LWC", "", 1); } return 0;}/* oldnew2lwc_diff */intlwc_diff2html(char *old_fn, char *new_fn, char *lwc_diff_fn, char *html_fn, char *caption, char *revision){ FILE *html_fp, *lwc_diff_fp, *clmn_fp[5]; char line[BUFLEN], ln[BUFLEN], fn_clmn[BUFLEN], *clmn_fn[5], c[3], *ok; char *old = NULL, *new = NULL, *old_time, *new_time, olns[24], nlns[24]; int oln, nln, orn, nrn, i, clr[5], newline, newline_, minor = 0, Minor = 0, Major = 0; TRACE(fprintf(STDERR, "lwc_diff2html(%s,%s,%s,%s)\n", lwc_diff_fn, html_fn, caption, revision)); lwc_diff_fp = Rfopen(lwc_diff_fn); if (!(ok = fgets(line, BUFLEN, lwc_diff_fp))) /*{ fclose(lwc_diff_fp); ERRHNDL(0,"empty file in lwc_diff2html:",lwc_diff_fn,1); } */ { html_fp = Wfopen(html_fn);/* fprintf(html_fp,"Content-type: text/html\n\n");*/ fprintf(html_fp, "<HTML>\n<BODY BGCOLOR=#ffffff TEST=#000000 LINK=#00AA00 VLINK=#005500 ALINK=#00ff00>\n"); fprintf(html_fp, "<CENTER>\n<TABLE ALIGN=ABSCENTER BORDER=1 CELLSPACING=0 CELLPADDING=1>\n"); if (*caption) fprintf(html_fp, "<CAPTION><FONT FACE='helvetica, arial'><B>%s</B></FONT></CAPTION>\n", caption); fprintf(html_fp, "<TR>"); if (!new_fn) fprintf(html_fp, "<TH> </TH>"); fprintf(html_fp, "<TH><FONT SIZE=3 COLOR=#0000ff><CODE><A HREF='%s'>%s%s</A></CODE></FONT></TH>", filename(old_fn), filename(old_fn), revision); fprintf(html_fp, "<TH> </TH>"); if (new_fn) fprintf(html_fp, "<TH><FONT SIZE=3 COLOR=#ff0000><CODE><A HREF='%s'>%s</A></CODE></FONT></TH>", new_fn, new_fn); fprintf(html_fp, "</TR>\n"); fprintf(html_fp, "<TR><TH COLSPAN=3 ALIGN=CENTER>No differences.</TH></TR>\n"); fprintf(html_fp, "</TABLE></CENTER>\n"); fprintf(html_fp, "<HR>\n"); fprintf(html_fp, "</BODY>\n</HTML>\n"); fprintf(html_fp, "<!--NoDiffs-->\n"); fflush(html_fp); fclose(html_fp); return 0; } sprintf(fn_clmn, "%s%c.difflib-%ld-lwc_diff2html-clmn-0-0", tmpdir(), DIR_SEP, (long) getpid()); for (i = 0; i < 5; i++) { clmn_fn[i] = strdup(fn_clmn); clmn_fn[i][strlen(clmn_fn[i]) - 3] += i; } html_fp = Wfopen(html_fn);/* fprintf(html_fp,"Content-type: text/html\n\n");*/ fprintf(html_fp, "<HTML>\n<BODY BGCOLOR=#ffffff TEST=#000000 LINK=#00AA00 VLINK=#005500 ALINK=#00ff00>\n"); fprintf(html_fp, "<CENTER>\n<TABLE ALIGN=ABSCENTER BORDER=1 CELLSPACING=0 CELLPADDING=1>\n"); if (*caption) fprintf(html_fp, "<CAPTION><FONT FACE='helvetica, arial'><B>%s</B></FONT></CAPTION>\n", caption); line[strlen(line) - 1] = '\0'; while (ok && strncmp(line, "@@ -", 4)) { if (!strncmp(line, "--- ", 4)) old = strdup(line + 4); else if (!strncmp(line, "+++ ", 4)) new = strdup(line + 4); else fprintf(html_fp, "<TR><TD COLSPAN=7><FONT SIZE=1 COLOR=#000000><CODE>%s</CODE></FONT></TD></TR>\n", HTMLsave(line)); ok = fgets(line, BUFLEN, lwc_diff_fp); line[strlen(line) - 1] = '\0'; } old_time = strchr(old, '\t'); *old_time++ = '\0'; new_time = strchr(new, '\t') + 1; *new_time++ = '\0';#ifdef NATIVE_WIN32 if (!strcmp(strrchr(old, '.'), ".cp")) *strrchr(old, '.') = '\0'; if (!strcmp(strrchr(new, '.'), ".cp")) *strrchr(new, '.') = '\0';#endif fprintf(html_fp, "<TR><TH COLSPAN=3 ALIGN=CENTER><FONT SIZE=3 COLOR=#0000ff><CODE><A HREF='%s'>%s%s</A>\t%s</CODE></FONT></TH>", filename(old), filename(old_fn), revision, old_time); fprintf(html_fp, "<TH> </TH>"); fprintf(html_fp, "<TH COLSPAN=3 ALIGN=CENTER><FONT SIZE=3 COLOR=#ff0000><CODE><A HREF='%s'>%s</A>\t%s</CODE></FONT></TH></TR>\n", new, new_fn, new_time); free(old); free(new); while (ok) { for (i = 0; i < 5; i++) clmn_fp[i] = Wfopen(clmn_fn[i]); sscanf(line, "@@ -%s +%s @@", olns, nlns); oln = atoi(olns); nln = atoi(nlns); if ((oln > 1) && (nln > 1)) { fprintf(html_fp, "<TR><TD ALIGN=CENTER><FONT SIZE=1 COLOR=#000000><CODE>...</CODE></FONT></TD>"); fprintf(html_fp, "<TD ALIGN=CENTER><FONT SIZE=1 COLOR=#000000><CODE>...</CODE></FONT></TD>"); fprintf(html_fp, "<TD ALIGN=CENTER><FONT SIZE=1 COLOR=#000000><CODE>...</CODE></FONT></TD>"); fprintf(html_fp, "<TD> </TD>"); fprintf(html_fp, "<TD ALIGN=CENTER><FONT SIZE=1 COLOR=#000000><CODE>...</CODE></FONT></TD>"); fprintf(html_fp, "<TD ALIGN=CENTER><FONT SIZE=1 COLOR=#000000><CODE>...</CODE></FONT></TD>"); fprintf(html_fp, "<TD ALIGN=CENTER><FONT SIZE=1 COLOR=#000000><CODE>...</CODE></FONT></TD></TR>\n"); } for (i = 0; i < 5; i++) clr[i] = 0; orn = nrn = 0; newline_ = 1; newline = 1; sprintf(c, " "); while ((ok = fgets(line, BUFLEN, lwc_diff_fp)) && strchr(" -+", line[0])) { if (line[1] != '\3') { if (newline_ || newline) Minor |= (minor = (strchr("#=\n\2", line[1]) ? 1 : 0)); line[strlen(line) - 1] = '\0'; if (line[1] == '\2') sprintf(line + 1, " "); if (line[0] == ' ') { if (newline && (nrn < orn)) { SETBLUE(1, minor); SETBLUE(2, minor); while (nrn < orn) { fprintf(clmn_fp[1], "%i\n", oln++); fprintf(clmn_fp[2], "-\n"); fprintf(clmn_fp[3], " \n"); fprintf(clmn_fp[4], " \n"); nrn++; } } SETBLACK(0); SETBLACK(4); } if (line[0] == '-') { c[0] = '-'; SETBLUE(0, minor); } if (line[0] == '+') { c[1] = '+'; SETRED(4, minor); } if (line[1] != '\1') { if (strchr(" -", line[0])) { fprintf(clmn_fp[0], "%s", HTMLsave(line + 1)); Major |= (clr[0] & 1); } if (strchr(" +", line[0])) { fprintf(clmn_fp[4], "%s", HTMLsave(line + 1)); Major |= (clr[4] & 1); } } else { if (line[0] == '-') { fprintf(clmn_fp[0], "\n"); orn++; } if (line[0] == '+') { if (orn > nrn) { SETPINK(1, minor); fprintf(clmn_fp[1], "%i\n", oln++); SETPINK(2, minor); fprintf(clmn_fp[2], "!\n"); SETPINK(3, minor); fprintf(clmn_fp[3], "%i\n", nln++); } else { SETRED(2, minor); SETRED(3, minor); fprintf(clmn_fp[0], " \n"); orn++; fprintf(clmn_fp[1], " \n"); fprintf(clmn_fp[2], "+\n"); fprintf(clmn_fp[3], "%i\n", nln++); } fprintf(clmn_fp[4], "\n"); nrn++; } if (line[0] == ' ') { if (!strncmp(c, " ", 2)) { SETBLACK(1); SETBLACK(3); fprintf(clmn_fp[2], " \n"); } else { SETPINK(1, minor); SETPINK(3, minor); } if (!strncmp(c, "-+", 2)) { SETPINK(2, minor); fprintf(clmn_fp[2], "!\n"); } if (!strncmp(c, "- ", 2)) { SETBLUE(2, minor); fprintf(clmn_fp[2], "-\n"); } if (!strncmp(c, " +", 2)) { SETRED(2, minor); fprintf(clmn_fp[2], "+\n"); } fprintf(clmn_fp[1], "%i\n", oln++); fprintf(clmn_fp[3], "%i\n", nln++); fprintf(clmn_fp[0], "\n"); fprintf(clmn_fp[4], "\n"); } sprintf(c, " "); } newline_ = newline; newline = (line[1] == '\1'); } } if (nrn < orn) { SETBLUE(1, minor); SETBLUE(2, minor); while (nrn < orn) { fprintf(clmn_fp[1], "%i\n", oln++); fprintf(clmn_fp[2], "-\n"); fprintf(clmn_fp[3], " \n"); fprintf(clmn_fp[4], " \n"); nrn++; } } if (orn < nrn) { SETRED(2, minor); SETRED(3, minor); while (orn < nrn) { fprintf(clmn_fp[0], " \n"); orn++; fprintf(clmn_fp[1], " \n"); fprintf(clmn_fp[2], "+\n"); fprintf(clmn_fp[3], "%i\n", nln++); } } for (i = 0; i < 5; i++) { fflush(clmn_fp[i]); fclose(clmn_fp[i]); } fprintf(html_fp, "<TR>"); i = 1; fprintf(html_fp, "<TD VALIGN=TOP ALIGN=CENTER><PRE><FONT SIZE=1 COLOR=#000000>"); clmn_fp[i] = Rfopen(clmn_fn[i]); while (fgets(ln, BUFLEN, clmn_fp[i])) fprintf(html_fp, "%s", ln); fclose(clmn_fp[i]); fprintf(html_fp, "</FONT></PRE></TD>"); i = 0; fprintf(html_fp, "<TD VALIGN=TOP><PRE><FONT SIZE=1 COLOR=#000000>"); clmn_fp[i] = Rfopen(clmn_fn[i]); while (fgets(ln, BUFLEN, clmn_fp[i])) fprintf(html_fp, "%s", ln); fclose(clmn_fp[i]); fprintf(html_fp, "</FONT></PRE></TD>"); i = 1; fprintf(html_fp, "<TD VALIGN=TOP ALIGN=CENTER><PRE><FONT SIZE=1 COLOR=#000000>"); clmn_fp[i] = Rfopen(clmn_fn[i]); while (fgets(ln, BUFLEN, clmn_fp[i])) fprintf(html_fp, "%s", ln); fclose(clmn_fp[i]); fprintf(html_fp, "</FONT></PRE></TD>"); i = 2; fprintf(html_fp, "<TD VALIGN=TOP ALIGN=CENTER><PRE><FONT SIZE=1 COLOR=#000000>"); clmn_fp[i] = Rfopen(clmn_fn[i]); while (fgets(ln, BUFLEN, clmn_fp[i])) fprintf(html_fp, "%s", ln); fclose(clmn_fp[i]); fprintf(html_fp, "</FONT></PRE></TD>"); i = 3; fprintf(html_fp, "<TD VALIGN=TOP ALIGN=CENTER><PRE><FONT SIZE=1 COLOR=#000000>"); clmn_fp[i] = Rfopen(clmn_fn[i]); while (fgets(ln, BUFLEN, clmn_fp[i])) fprintf(html_fp, "%s", ln); fclose(clmn_fp[i]); fprintf(html_fp, "</FONT></PRE></TD>"); i = 4; fprintf(html_fp, "<TD VALIGN=TOP><PRE><FONT SIZE=1 COLOR=#000000>"); clmn_fp[i] = Rfopen(clmn_fn[i]); while (fgets(ln, BUFLEN, clmn_fp[i])) fprintf(html_fp, "%s", ln); fclose(clmn_fp[i]); fprintf(html_fp, "</FONT></PRE></TD>"); i = 3; fprintf(html_fp, "<TD VALIGN=TOP ALIGN=CENTER><PRE><FONT SIZE=1 COLOR=#000000>"); clmn_fp[i] = Rfopen(clmn_fn[i]); while (fgets(ln, BUFLEN, clmn_fp[i])) fprintf(html_fp, "%s", ln); fclose(clmn_fp[i]); fprintf(html_fp, "</FONT></PRE></TD>"); fprintf(html_fp, "</TR>\n"); TRACE(for (i = 0; i < 5; i++) clmn_fn[i][strlen(clmn_fn[i]) - 1]++) ; } fprintf(html_fp, "</TABLE></CENTER>\n"); fprintf(html_fp, "<HR>\n"); fprintf(html_fp, "</BODY>\n</HTML>\n"); fprintf(html_fp, "<!--%sDiffs-->\n", Major ? "Major" : (Minor ? "Minor" : "No")); fflush(html_fp); fclose(html_fp); for (i = 0; i < 5; i++) { UNLINK(clmn_fn[i]); free(clmn_fn[i]); } fclose(lwc_diff_fp); return (Major ? 2 : (Minor ? 1 : 0));}/* lwc_diff2html */intu_diff2html(int mindiff, int LWC, char *u_diff_fn, char *html_fn, char *caption, char *revision){ char lwc_diff_fn[BUFLEN]; int rtrn; TRACE(fprintf(STDERR, "u_diff2html(%i,%s,%s,%s,%s)\n", LWC, u_diff_fn, html_fn, caption, revision)); sprintf(lwc_diff_fn, "%s%c.difflib-%ld-u_diff2html-lwc_diff", tmpdir(), DIR_SEP, (long) getpid()); if (!u_diff2lwc_diff(mindiff, LWC, u_diff_fn, lwc_diff_fn)) /* { UNLINK(lwc_diff_fn); ERRHNDL(0,"u_diff2lwc_diff returns 0 in u_diff2html","",1); } */ system(strconcat("touch ", lwc_diff_fn)); rtrn = lwc_diff2html(u_diff_fn, (char *) 0, lwc_diff_fn, html_fn, caption, revision); UNLINK(lwc_diff_fn); return rtrn;}/* u_diff2html */intoldnew2html(int mindiff, int LWC, int context, char *ignore, char *old_fn, char *new_fn, char *html_fn, char *caption, char *revision){ char lwc_diff_fn[BUFLEN]; int rtrn; TRACE(fprintf(STDERR, "oldnew2html(%i,%i,%i,%s,%s,%s,%s,%s,%s)\n", mindiff, LWC, context, ignore, old_fn, new_fn, html_fn, caption, revision)); sprintf(lwc_diff_fn, "%s%c.difflib-%ld-oldnew2html-lwc_diff", tmpdir(), DIR_SEP, (long) getpid()); if (!oldnew2lwc_diff(mindiff, LWC, context, ignore, old_fn, new_fn, lwc_diff_fn)) /* { UNLINK(lwc_diff_fn); ERRHNDL(0,"oldnew2lwc_diff returns 0 in oldnew2html","",1); } */ system(strconcat("touch ", lwc_diff_fn)); rtrn = lwc_diff2html(old_fn, new_fn, lwc_diff_fn, html_fn, caption, revision); UNLINK(lwc_diff_fn); return rtrn;}/* oldnew2u_diff */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -