📄 pch.c
字号:
boolanother_hunk(){ Reg1 char *s; Reg8 char *ret; Reg2 int context = 0; while (p_end >= 0) { if (p_end == p_efake) p_end = p_bfake; /* don't free twice */#ifndef SMALL else free(p_line[p_end]);#endif p_end--; } assert(p_end == -1); p_efake = -1;#ifdef SMALL if (sfp != Nullfp) Fclose(sfp); sfp = fopen(TMPSTRNAME, "w"); if (sfp == Nullfp) fatal2("patch: can't create %s.\n", TMPSTRNAME);#endif p_max = hunkmax; /* gets reduced when --- found */ if (diff_type == CONTEXT_DIFF || diff_type == NEW_CONTEXT_DIFF) { long line_beginning = ftell(pfp); /* file pos of the current line */ LINENUM repl_beginning = 0; /* index of --- line */ Reg4 LINENUM fillcnt = 0; /* #lines of missing ptrn or repl */ Reg5 LINENUM fillsrc; /* index of first line to copy */ Reg6 LINENUM filldst; /* index of first missing line */ bool ptrn_spaces_eaten = FALSE; /* ptrn was slightly misformed */ Reg9 bool repl_could_be_missing = TRUE; /* no + or ! lines in this hunk */ bool repl_missing = FALSE; /* we are now backtracking */ long repl_backtrack_position = 0; /* file pos of first repl line */ LINENUM repl_patch_line; /* input line number for same */ Reg7 LINENUM ptrn_copiable = 0; /* # of copiable lines in ptrn */ ret = pgets(buf, sizeof buf, pfp); p_input_line++; if (ret == Nullch || strnNE(buf, "********", 8)) { next_intuit_at(line_beginning,p_input_line); return FALSE; } p_context = 100; p_hunk_beg = p_input_line + 1; while (p_end < p_max) { line_beginning = ftell(pfp); ret = pgets(buf, sizeof buf, pfp); p_input_line++; if (ret == Nullch) { if (p_max - p_end < 4) Strcpy(buf, " \n"); /* assume blank lines got chopped */ else { if (repl_beginning && repl_could_be_missing) { repl_missing = TRUE; goto hunk_done; } fatal1("Unexpected end of file in patch.\n"); } } p_end++; assert(p_end < hunkmax); p_char[p_end] = *buf;#ifdef zilog p_line[(short)p_end] = Nullch;#else#ifdef SMALL p_line[p_end] = -1L; p_len[p_end] = 0;#else p_line[p_end] = Nullch;#endif#endif switch (*buf) { case '*': if (strnEQ(buf, "********", 8)) { if (repl_beginning && repl_could_be_missing) { repl_missing = TRUE; goto hunk_done; } else fatal2("Unexpected end of hunk at line %ld.\n", p_input_line); } if (p_end != 0) { if (repl_beginning && repl_could_be_missing) { repl_missing = TRUE; goto hunk_done; } fatal3("Unexpected *** at line %ld: %s", p_input_line, buf); } context = 0;#ifdef SMALL p_line[p_end] = saveStr(buf, p_len+p_end);#else p_line[p_end] = savestr(buf); if (out_of_mem) { p_end--; return FALSE; }#endif for (s=buf; *s && !isdigit(*s); s++) ; if (!*s) goto malformed; if (strnEQ(s,"0,0",3)) strcpy(s,s+2); p_first = (LINENUM) atol(s); while (isdigit(*s)) s++; if (*s == ',') { for (; *s && !isdigit(*s); s++) ; if (!*s) goto malformed; p_ptrn_lines = ((LINENUM)atol(s)) - p_first + 1; } else if (p_first) p_ptrn_lines = 1; else { p_ptrn_lines = 0; p_first = 1; } p_max = p_ptrn_lines + 6; /* we need this much at least */ while (p_max >= hunkmax) grow_hunkmax(); p_max = hunkmax; break; case '-': if (buf[1] == '-') { if (repl_beginning || (p_end != p_ptrn_lines + 1 + (p_char[p_end-1] == '\n'))) { if (p_end == 1) { /* `old' lines were omitted - set up to fill */ /* them in from 'new' context lines. */ p_end = p_ptrn_lines + 1; fillsrc = p_end + 1; filldst = 1; fillcnt = p_ptrn_lines; } else { if (repl_beginning) { if (repl_could_be_missing){ repl_missing = TRUE; goto hunk_done; } fatal3("Duplicate \"---\" at line %ld--check line numbers at line %ld.\n", p_input_line, p_hunk_beg + repl_beginning); } else { fatal4("%s \"---\" at line %ld--check line numbers at line %ld.\n", (p_end <= p_ptrn_lines ? "Premature" : "Overdue" ), p_input_line, p_hunk_beg); } } } repl_beginning = p_end; repl_backtrack_position = ftell(pfp); repl_patch_line = p_input_line;#ifdef SMALL p_line[p_end] = saveStr(buf, p_len+p_end);#else p_line[p_end] = savestr(buf); if (out_of_mem) { p_end--; return FALSE; }#endif p_char[p_end] = '='; for (s=buf; *s && !isdigit(*s); s++) ; if (!*s) goto malformed; p_newfirst = (LINENUM) atol(s); while (isdigit(*s)) s++; if (*s == ',') { for (; *s && !isdigit(*s); s++) ; if (!*s) goto malformed; p_repl_lines = ((LINENUM)atol(s)) - p_newfirst + 1; } else if (p_newfirst) p_repl_lines = 1; else { p_repl_lines = 0; p_newfirst = 1; } p_max = p_repl_lines + p_end; if (p_max > MAXHUNKSIZE) fatal4("Hunk too large (%ld lines) at line %ld: %s", p_max, p_input_line, buf); while (p_max >= hunkmax) grow_hunkmax(); if (p_repl_lines != ptrn_copiable) repl_could_be_missing = FALSE; break; } goto change_line; case '+': case '!': repl_could_be_missing = FALSE; change_line: if (buf[1] == '\n' && canonicalize) strcpy(buf+1," \n"); if (!isspace(buf[1]) && buf[1] != '>' && buf[1] != '<' && repl_beginning && repl_could_be_missing) { repl_missing = TRUE; goto hunk_done; } if (context > 0) { if (context < p_context) p_context = context; context = -1000; }#ifdef SMALL p_line[p_end] = saveStr(buf+2, p_len+p_end);#else p_line[p_end] = savestr(buf+2); if (out_of_mem) { p_end--; return FALSE; }#endif break; case '\t': case '\n': /* assume the 2 spaces got eaten */ if (repl_beginning && repl_could_be_missing && (!ptrn_spaces_eaten || diff_type == NEW_CONTEXT_DIFF) ) { repl_missing = TRUE; goto hunk_done; }#ifdef SMALL p_line[p_end] = saveStr(buf, p_len+p_end);#else p_line[p_end] = savestr(buf); if (out_of_mem) { p_end--; return FALSE; }#endif if (p_end != p_ptrn_lines + 1) { ptrn_spaces_eaten |= (repl_beginning != 0); context++; if (!repl_beginning) ptrn_copiable++; p_char[p_end] = ' '; } break; case ' ': if (!isspace(buf[1]) && repl_beginning && repl_could_be_missing) { repl_missing = TRUE; goto hunk_done; } context++; if (!repl_beginning) ptrn_copiable++;#ifdef SMALL p_line[p_end] = saveStr(buf+2, p_len+p_end);#else p_line[p_end] = savestr(buf+2); if (out_of_mem) { p_end--; return FALSE; }#endif break; default: if (repl_beginning && repl_could_be_missing) { repl_missing = TRUE; goto hunk_done; } goto malformed; } /* set up p_len for strncmp() so we don't have to */ /* assume null termination */#ifndef SMALL if (p_line[p_end]) p_len[p_end] = strlen(p_line[p_end]); else p_len[p_end] = 0;#endif } hunk_done: if (p_end >=0 && !repl_beginning) fatal2("No --- found in patch at line %ld\n", pch_hunk_beg()); if (repl_missing) { /* reset state back to just after --- */ p_input_line = repl_patch_line;#ifndef SMALL for (p_end--; p_end > repl_beginning; p_end--) free(p_line[p_end]);#endif Fseek(pfp, repl_backtrack_position, 0); /* redundant 'new' context lines were omitted - set */ /* up to fill them in from the old file context */ fillsrc = 1; filldst = repl_beginning+1; fillcnt = p_repl_lines; p_end = p_max; } if (diff_type == CONTEXT_DIFF && (fillcnt || (p_first > 1 && ptrn_copiable > 2*p_context)) ) { if (verbose) say4("%s\n%s\n%s\n","(Fascinating--this is really a new-style context diff but without","the telltale extra asterisks on the *** line that usually indicate","the new style...)"); diff_type = NEW_CONTEXT_DIFF; } /* if there were omitted context lines, fill them in now */ if (fillcnt) { p_bfake = filldst; /* remember where not to free() */ p_efake = filldst + fillcnt - 1; while (fillcnt-- > 0) { while (fillsrc <= p_end && p_char[fillsrc] != ' ') fillsrc++; if (fillsrc > p_end) fatal2("Replacement text or line numbers mangled in hunk at line %ld\n", p_hunk_beg); p_line[filldst] = p_line[fillsrc]; p_char[filldst] = p_char[fillsrc]; p_len[filldst] = p_len[fillsrc]; fillsrc++; filldst++; } while (fillsrc <= p_end && fillsrc != repl_beginning && p_char[fillsrc] != ' ') fillsrc++;#ifdef DEBUGGING if (debug & 64) printf("fillsrc %ld, filldst %ld, rb %ld, e+1 %ld\n", fillsrc,filldst,repl_beginning,p_end+1);#endif assert(fillsrc==p_end+1 || fillsrc==repl_beginning); assert(filldst==p_end+1 || filldst==repl_beginning); } } else { /* normal diff--fake it up */ char hunk_type; Reg3 int i; LINENUM min, max; long line_beginning = ftell(pfp); p_context = 0; ret = pgets(buf, sizeof buf, pfp); p_input_line++; if (ret == Nullch || !isdigit(*buf)) { next_intuit_at(line_beginning,p_input_line); return FALSE; } p_first = (LINENUM)atol(buf); for (s=buf; isdigit(*s); s++) ; if (*s == ',') { p_ptrn_lines = (LINENUM)atol(++s) - p_first + 1; while (isdigit(*s)) s++; } else p_ptrn_lines = (*s != 'a'); hunk_type = *s; if (hunk_type == 'a') p_first++; /* do append rather than insert */ min = (LINENUM)atol(++s); for (; isdigit(*s); s++) ; if (*s == ',') max = (LINENUM)atol(++s); else max = min; if (hunk_type == 'd') min++; p_end = p_ptrn_lines + 1 + max - min + 1; if (p_end > MAXHUNKSIZE) fatal4("Hunk too large (%ld lines) at line %ld: %s", p_end, p_input_line, buf); while (p_end >= hunkmax) grow_hunkmax(); p_newfirst = min; p_repl_lines = max - min + 1; Sprintf(buf, "*** %ld,%ld\n", p_first, p_first + p_ptrn_lines - 1);#ifdef SMALL p_line[0] = saveStr(buf, p_len);#else p_line[0] = savestr(buf); if (out_of_mem) { p_end = -1; return FALSE; }#endif p_char[0] = '*'; for (i=1; i<=p_ptrn_lines; i++) { ret = pgets(buf, sizeof buf, pfp); p_input_line++; if (ret == Nullch) fatal2("Unexpected end of file in patch at line %ld.\n", p_input_line); if (*buf != '<') fatal2("< expected at line %ld of patch.\n", p_input_line);#ifdef SMALL p_line[i] = saveStr(buf+2, p_len+i);#else p_line[i] = savestr(buf+2); if (out_of_mem) { p_end = i-1; return FALSE; }#endif#ifndef SMALL p_len[i] = strlen(p_line[i]);#endif p_char[i] = '-'; } if (hunk_type == 'c') { ret = pgets(buf, sizeof buf, pfp); p_input_line++; if (ret == Nullch) fatal2("Unexpected end of file in patch at line %ld.\n", p_input_line); if (*buf != '-') fatal2("--- expected at line %ld of patch.\n", p_input_line); } Sprintf(buf, "--- %ld,%ld\n", min, max);#ifdef SMALL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -