annotate miscellany/patch-2.0.12u8/pch.c @ 12:441a2190cfae

Lion fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 21 Apr 2012 13:10:49 +0900
parents bce86c4163a3
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12
441a2190cfae Lion fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1 /* $Header: /Users/kono/src/CVS/mh/miscellany/patch-2.0.12u8/pch.c,v 1.1.1.1 2005/04/18 14:46:05 kono Exp $
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2 *
12
441a2190cfae Lion fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
3 * $Log: pch.c,v $
441a2190cfae Lion fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
4 * Revision 1.1.1.1 2005/04/18 14:46:05 kono
441a2190cfae Lion fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
5 * MH pre UTF8
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
6 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
7 * Revision 2.0.2.0 90/05/01 22:17:51 davison
bce86c4163a3 Initial revision
kono
parents:
diff changeset
8 * patch12u: unidiff support added
bce86c4163a3 Initial revision
kono
parents:
diff changeset
9 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
10 * Revision 2.0.1.7 88/06/03 15:13:28 lwall
bce86c4163a3 Initial revision
kono
parents:
diff changeset
11 * patch10: Can now find patches in shar scripts.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
12 * patch10: Hunks that swapped and then swapped back could core dump.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
13 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
14 * Revision 2.0.1.6 87/06/04 16:18:13 lwall
bce86c4163a3 Initial revision
kono
parents:
diff changeset
15 * pch_swap didn't swap p_bfake and p_efake.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
16 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
17 * Revision 2.0.1.5 87/01/30 22:47:42 lwall
bce86c4163a3 Initial revision
kono
parents:
diff changeset
18 * Improved responses to mangled patches.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
19 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
20 * Revision 2.0.1.4 87/01/05 16:59:53 lwall
bce86c4163a3 Initial revision
kono
parents:
diff changeset
21 * New-style context diffs caused double call to free().
bce86c4163a3 Initial revision
kono
parents:
diff changeset
22 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
23 * Revision 2.0.1.3 86/11/14 10:08:33 lwall
bce86c4163a3 Initial revision
kono
parents:
diff changeset
24 * Fixed problem where a long pattern wouldn't grow the hunk.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
25 * Also restored p_input_line when backtracking so error messages are right.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
26 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
27 * Revision 2.0.1.2 86/11/03 17:49:52 lwall
bce86c4163a3 Initial revision
kono
parents:
diff changeset
28 * New-style delete triggers spurious assertion error.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
29 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
30 * Revision 2.0.1.1 86/10/29 15:52:08 lwall
bce86c4163a3 Initial revision
kono
parents:
diff changeset
31 * Could falsely report new-style context diff.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
32 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
33 * Revision 2.0 86/09/17 15:39:37 lwall
bce86c4163a3 Initial revision
kono
parents:
diff changeset
34 * Baseline for netwide release.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
35 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
36 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
37
bce86c4163a3 Initial revision
kono
parents:
diff changeset
38 #include "EXTERN.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
39 #include "common.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
40 #include "util.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
41 #include "INTERN.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
42 #include "pch.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
43
bce86c4163a3 Initial revision
kono
parents:
diff changeset
44 /* Patch (diff listing) abstract type. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
45
bce86c4163a3 Initial revision
kono
parents:
diff changeset
46 static long p_filesize; /* size of the patch file */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
47 static LINENUM p_first; /* 1st line number */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
48 static LINENUM p_newfirst; /* 1st line number of replacement */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
49 static LINENUM p_ptrn_lines; /* # lines in pattern */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
50 static LINENUM p_repl_lines; /* # lines in replacement text */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
51 static LINENUM p_end = -1; /* last line in hunk */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
52 static LINENUM p_max; /* max allowed value of p_end */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
53 static LINENUM p_context = 3; /* # of context lines */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
54 static LINENUM p_input_line = 0; /* current line # from patch file */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
55 static char **p_line = Null(char**); /* the text of the hunk */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
56 static short *p_len = Null(short*); /* length of each line */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
57 static char *p_char = Nullch; /* +, -, and ! */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
58 static int hunkmax = INITHUNKMAX; /* size of above arrays to begin with */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
59 static int p_indent; /* indent to patch */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
60 static LINENUM p_base; /* where to intuit this time */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
61 static LINENUM p_bline; /* line # of p_base */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
62 static LINENUM p_start; /* where intuit found a patch */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
63 static LINENUM p_sline; /* and the line number for it */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
64 static LINENUM p_hunk_beg; /* line number of current hunk */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
65 static LINENUM p_efake = -1; /* end of faked up lines--don't free */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
66 static LINENUM p_bfake = -1; /* beg of faked up lines */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
67
bce86c4163a3 Initial revision
kono
parents:
diff changeset
68 /* Prepare to look for the next patch in the patch file. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
69
bce86c4163a3 Initial revision
kono
parents:
diff changeset
70 void
bce86c4163a3 Initial revision
kono
parents:
diff changeset
71 re_patch()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
72 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
73 p_first = Nulline;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
74 p_newfirst = Nulline;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
75 p_ptrn_lines = Nulline;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
76 p_repl_lines = Nulline;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
77 p_end = (LINENUM)-1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
78 p_max = Nulline;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
79 p_indent = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
80 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
81
bce86c4163a3 Initial revision
kono
parents:
diff changeset
82 /* Open the patch file at the beginning of time. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
83
bce86c4163a3 Initial revision
kono
parents:
diff changeset
84 void
bce86c4163a3 Initial revision
kono
parents:
diff changeset
85 open_patch_file(filename)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
86 char *filename;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
87 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
88 if (filename == Nullch || !*filename || strEQ(filename, "-")) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
89 pfp = fopen(TMPPATNAME, "w");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
90 if (pfp == Nullfp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
91 pfatal2("can't create %s", TMPPATNAME);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
92 while (fgets(buf, sizeof buf, stdin) != Nullch)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
93 fputs(buf, pfp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
94 Fclose(pfp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
95 filename = TMPPATNAME;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
96 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
97 pfp = fopen(filename, "r");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
98 if (pfp == Nullfp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
99 pfatal2("patch file %s not found", filename);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
100 Fstat(fileno(pfp), &filestat);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
101 p_filesize = filestat.st_size;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
102 next_intuit_at(0L,1L); /* start at the beginning */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
103 set_hunkmax();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
104 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
105
bce86c4163a3 Initial revision
kono
parents:
diff changeset
106 /* Make sure our dynamically realloced tables are malloced to begin with. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
107
bce86c4163a3 Initial revision
kono
parents:
diff changeset
108 void
bce86c4163a3 Initial revision
kono
parents:
diff changeset
109 set_hunkmax()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
110 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
111 #ifndef lint
bce86c4163a3 Initial revision
kono
parents:
diff changeset
112 if (p_line == Null(char**))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
113 p_line = (char**) malloc((MEM)hunkmax * sizeof(char *));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
114 if (p_len == Null(short*))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
115 p_len = (short*) malloc((MEM)hunkmax * sizeof(short));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
116 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
117 if (p_char == Nullch)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
118 p_char = (char*) malloc((MEM)hunkmax * sizeof(char));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
119 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
120
bce86c4163a3 Initial revision
kono
parents:
diff changeset
121 /* Enlarge the arrays containing the current hunk of patch. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
122
bce86c4163a3 Initial revision
kono
parents:
diff changeset
123 void
bce86c4163a3 Initial revision
kono
parents:
diff changeset
124 grow_hunkmax()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
125 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
126 hunkmax *= 2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
127 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
128 * Note that on most systems, only the p_line array ever gets fresh memory
bce86c4163a3 Initial revision
kono
parents:
diff changeset
129 * since p_len can move into p_line's old space, and p_char can move into
bce86c4163a3 Initial revision
kono
parents:
diff changeset
130 * p_len's old space. Not on PDP-11's however. But it doesn't matter.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
131 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
132 assert(p_line != Null(char**) && p_len != Null(short*) && p_char != Nullch);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
133 #ifndef lint
bce86c4163a3 Initial revision
kono
parents:
diff changeset
134 p_line = (char**) realloc((char*)p_line, (MEM)hunkmax * sizeof(char *));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
135 p_len = (short*) realloc((char*)p_len, (MEM)hunkmax * sizeof(short));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
136 p_char = (char*) realloc((char*)p_char, (MEM)hunkmax * sizeof(char));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
137 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
138 if (p_line != Null(char**) && p_len != Null(short*) && p_char != Nullch)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
139 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
140 if (!using_plan_a)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
141 fatal1("out of memory\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
142 out_of_mem = TRUE; /* whatever is null will be allocated again */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
143 /* from within plan_a(), of all places */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
144 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
145
bce86c4163a3 Initial revision
kono
parents:
diff changeset
146 /* True if the remainder of the patch file contains a diff of some sort. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
147
bce86c4163a3 Initial revision
kono
parents:
diff changeset
148 bool
bce86c4163a3 Initial revision
kono
parents:
diff changeset
149 there_is_another_patch()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
150 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
151 if (p_base != 0L && p_base >= p_filesize) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
152 if (verbose)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
153 say1("done\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
154 return FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
155 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
156 if (verbose)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
157 say1("Hmm...");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
158 diff_type = intuit_diff_type();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
159 if (!diff_type) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
160 if (p_base != 0L) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
161 if (verbose)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
162 say1(" Ignoring the trailing garbage.\ndone\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
163 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
164 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
165 say1(" I can't seem to find a patch in there anywhere.\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
166 return FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
167 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
168 if (verbose)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
169 say3(" %sooks like %s to me...\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
170 (p_base == 0L ? "L" : "The next patch l"),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
171 diff_type == UNI_DIFF ? "a unified diff" :
bce86c4163a3 Initial revision
kono
parents:
diff changeset
172 diff_type == CONTEXT_DIFF ? "a context diff" :
bce86c4163a3 Initial revision
kono
parents:
diff changeset
173 diff_type == NEW_CONTEXT_DIFF ? "a new-style context diff" :
bce86c4163a3 Initial revision
kono
parents:
diff changeset
174 diff_type == NORMAL_DIFF ? "a normal diff" :
bce86c4163a3 Initial revision
kono
parents:
diff changeset
175 "an ed script" );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
176 if (p_indent && verbose)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
177 say3("(Patch is indented %d space%s.)\n", p_indent, p_indent==1?"":"s");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
178 skip_to(p_start,p_sline);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
179 while (filearg[0] == Nullch) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
180 if (force || batch) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
181 say1("No file to patch. Skipping...\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
182 filearg[0] = savestr(bestguess);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
183 return TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
184 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
185 ask1("File to patch: ");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
186 if (*buf != '\n') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
187 if (bestguess)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
188 free(bestguess);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
189 bestguess = savestr(buf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
190 filearg[0] = fetchname(buf, 0, FALSE);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
191 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
192 if (filearg[0] == Nullch) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
193 ask1("No file found--skip this patch? [n] ");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
194 if (*buf != 'y') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
195 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
196 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
197 if (verbose)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
198 say1("Skipping patch...\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
199 filearg[0] = fetchname(bestguess, 0, TRUE);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
200 skip_rest_of_patch = TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
201 return TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
202 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
203 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
204 return TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
205 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
206
bce86c4163a3 Initial revision
kono
parents:
diff changeset
207 /* Determine what kind of diff is in the remaining part of the patch file. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
208
bce86c4163a3 Initial revision
kono
parents:
diff changeset
209 int
bce86c4163a3 Initial revision
kono
parents:
diff changeset
210 intuit_diff_type()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
211 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
212 Reg4 long this_line = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
213 Reg5 long previous_line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
214 Reg6 long first_command_line = -1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
215 long fcl_line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
216 Reg7 bool last_line_was_command = FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
217 Reg8 bool this_is_a_command = FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
218 Reg9 bool stars_last_line = FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
219 Reg10 bool stars_this_line = FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
220 Reg3 int indent;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
221 Reg1 char *s;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
222 Reg2 char *t;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
223 char *indtmp = Nullch;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
224 char *oldtmp = Nullch;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
225 char *newtmp = Nullch;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
226 char *indname = Nullch;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
227 char *oldname = Nullch;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
228 char *newname = Nullch;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
229 Reg11 int retval;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
230 bool no_filearg = (filearg[0] == Nullch);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
231
bce86c4163a3 Initial revision
kono
parents:
diff changeset
232 ok_to_create_file = FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
233 Fseek(pfp, p_base, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
234 p_input_line = p_bline - 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
235 for (;;) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
236 previous_line = this_line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
237 last_line_was_command = this_is_a_command;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
238 stars_last_line = stars_this_line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
239 this_line = ftell(pfp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
240 indent = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
241 p_input_line++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
242 if (fgets(buf, sizeof buf, pfp) == Nullch) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
243 if (first_command_line >= 0L) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
244 /* nothing but deletes!? */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
245 p_start = first_command_line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
246 p_sline = fcl_line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
247 retval = ED_DIFF;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
248 goto scan_exit;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
249 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
250 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
251 p_start = this_line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
252 p_sline = p_input_line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
253 retval = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
254 goto scan_exit;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
255 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
256 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
257 for (s = buf; *s == ' ' || *s == '\t' || *s == 'X'; s++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
258 if (*s == '\t')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
259 indent += 8 - (indent % 8);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
260 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
261 indent++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
262 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
263 for (t=s; isdigit(*t) || *t == ','; t++) ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
264 this_is_a_command = (isdigit(*s) &&
bce86c4163a3 Initial revision
kono
parents:
diff changeset
265 (*t == 'd' || *t == 'c' || *t == 'a') );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
266 if (first_command_line < 0L && this_is_a_command) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
267 first_command_line = this_line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
268 fcl_line = p_input_line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
269 p_indent = indent; /* assume this for now */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
270 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
271 if (!stars_last_line && strnEQ(s, "*** ", 4))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
272 oldtmp = savestr(s+4);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
273 else if (strnEQ(s, "--- ", 4))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
274 newtmp = savestr(s+4);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
275 else if (strnEQ(s, "+++ ", 4))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
276 oldtmp = savestr(s+4); /* pretend it is the old name */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
277 else if (strnEQ(s, "Index:", 6))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
278 indtmp = savestr(s+6);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
279 else if (strnEQ(s, "Prereq:", 7)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
280 for (t=s+7; isspace(*t); t++) ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
281 revision = savestr(t);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
282 for (t=revision; *t && !isspace(*t); t++) ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
283 *t = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
284 if (!*revision) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
285 free(revision);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
286 revision = Nullch;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
287 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
288 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
289 if ((!diff_type || diff_type == ED_DIFF) &&
bce86c4163a3 Initial revision
kono
parents:
diff changeset
290 first_command_line >= 0L &&
bce86c4163a3 Initial revision
kono
parents:
diff changeset
291 strEQ(s, ".\n") ) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
292 p_indent = indent;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
293 p_start = first_command_line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
294 p_sline = fcl_line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
295 retval = ED_DIFF;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
296 goto scan_exit;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
297 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
298 if ((!diff_type || diff_type == UNI_DIFF) && strnEQ(s, "@@ -", 4)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
299 if (!atol(s+3))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
300 ok_to_create_file = TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
301 p_indent = indent;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
302 p_start = this_line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
303 p_sline = p_input_line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
304 retval = UNI_DIFF;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
305 goto scan_exit;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
306 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
307 stars_this_line = strnEQ(s, "********", 8);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
308 if ((!diff_type || diff_type == CONTEXT_DIFF) && stars_last_line &&
bce86c4163a3 Initial revision
kono
parents:
diff changeset
309 strnEQ(s, "*** ", 4)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
310 if (!atol(s+4))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
311 ok_to_create_file = TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
312 /* if this is a new context diff the character just before */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
313 /* the newline is a '*'. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
314 while (*s != '\n')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
315 s++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
316 p_indent = indent;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
317 p_start = previous_line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
318 p_sline = p_input_line - 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
319 retval = (*(s-1) == '*' ? NEW_CONTEXT_DIFF : CONTEXT_DIFF);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
320 goto scan_exit;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
321 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
322 if ((!diff_type || diff_type == NORMAL_DIFF) &&
bce86c4163a3 Initial revision
kono
parents:
diff changeset
323 last_line_was_command &&
bce86c4163a3 Initial revision
kono
parents:
diff changeset
324 (strnEQ(s, "< ", 2) || strnEQ(s, "> ", 2)) ) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
325 p_start = previous_line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
326 p_sline = p_input_line - 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
327 p_indent = indent;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
328 retval = NORMAL_DIFF;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
329 goto scan_exit;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
330 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
331 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
332 scan_exit:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
333 if (no_filearg) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
334 if (indtmp != Nullch)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
335 indname = fetchname(indtmp, strippath, ok_to_create_file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
336 if (oldtmp != Nullch)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
337 oldname = fetchname(oldtmp, strippath, ok_to_create_file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
338 if (newtmp != Nullch)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
339 newname = fetchname(newtmp, strippath, ok_to_create_file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
340 if (oldname && newname) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
341 if (strlen(oldname) < strlen(newname))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
342 filearg[0] = savestr(oldname);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
343 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
344 filearg[0] = savestr(newname);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
345 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
346 else if (oldname)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
347 filearg[0] = savestr(oldname);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
348 else if (newname)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
349 filearg[0] = savestr(newname);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
350 else if (indname)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
351 filearg[0] = savestr(indname);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
352 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
353 if (bestguess) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
354 free(bestguess);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
355 bestguess = Nullch;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
356 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
357 if (filearg[0] != Nullch)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
358 bestguess = savestr(filearg[0]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
359 else if (indtmp != Nullch)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
360 bestguess = fetchname(indtmp, strippath, TRUE);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
361 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
362 if (oldtmp != Nullch)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
363 oldname = fetchname(oldtmp, strippath, TRUE);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
364 if (newtmp != Nullch)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
365 newname = fetchname(newtmp, strippath, TRUE);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
366 if (oldname && newname) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
367 if (strlen(oldname) < strlen(newname))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
368 bestguess = savestr(oldname);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
369 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
370 bestguess = savestr(newname);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
371 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
372 else if (oldname)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
373 bestguess = savestr(oldname);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
374 else if (newname)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
375 bestguess = savestr(newname);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
376 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
377 if (indtmp != Nullch)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
378 free(indtmp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
379 if (oldtmp != Nullch)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
380 free(oldtmp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
381 if (newtmp != Nullch)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
382 free(newtmp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
383 if (indname != Nullch)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
384 free(indname);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
385 if (oldname != Nullch)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
386 free(oldname);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
387 if (newname != Nullch)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
388 free(newname);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
389 return retval;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
390 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
391
bce86c4163a3 Initial revision
kono
parents:
diff changeset
392 /* Remember where this patch ends so we know where to start up again. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
393
bce86c4163a3 Initial revision
kono
parents:
diff changeset
394 void
bce86c4163a3 Initial revision
kono
parents:
diff changeset
395 next_intuit_at(file_pos,file_line)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
396 long file_pos;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
397 long file_line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
398 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
399 p_base = file_pos;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
400 p_bline = file_line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
401 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
402
bce86c4163a3 Initial revision
kono
parents:
diff changeset
403 /* Basically a verbose fseek() to the actual diff listing. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
404
bce86c4163a3 Initial revision
kono
parents:
diff changeset
405 void
bce86c4163a3 Initial revision
kono
parents:
diff changeset
406 skip_to(file_pos,file_line)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
407 long file_pos;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
408 long file_line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
409 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
410 char *ret;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
411
bce86c4163a3 Initial revision
kono
parents:
diff changeset
412 assert(p_base <= file_pos);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
413 if (verbose && p_base < file_pos) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
414 Fseek(pfp, p_base, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
415 say1("The text leading up to this was:\n--------------------------\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
416 while (ftell(pfp) < file_pos) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
417 ret = fgets(buf, sizeof buf, pfp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
418 assert(ret != Nullch);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
419 say2("|%s", buf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
420 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
421 say1("--------------------------\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
422 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
423 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
424 Fseek(pfp, file_pos, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
425 p_input_line = file_line - 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
426 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
427
bce86c4163a3 Initial revision
kono
parents:
diff changeset
428 /* Make this a function for better debugging. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
429 static void
bce86c4163a3 Initial revision
kono
parents:
diff changeset
430 malformed ()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
431 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
432 fatal3("malformed patch at line %ld: %s", p_input_line, buf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
433 /* about as informative as "Syntax error" in C */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
434 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
435
bce86c4163a3 Initial revision
kono
parents:
diff changeset
436 /* True if there is more of the current diff listing to process. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
437
bce86c4163a3 Initial revision
kono
parents:
diff changeset
438 bool
bce86c4163a3 Initial revision
kono
parents:
diff changeset
439 another_hunk()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
440 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
441 Reg1 char *s;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
442 Reg8 char *ret;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
443 Reg2 int context = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
444
bce86c4163a3 Initial revision
kono
parents:
diff changeset
445 while (p_end >= 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
446 if (p_end == p_efake)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
447 p_end = p_bfake; /* don't free twice */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
448 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
449 free(p_line[p_end]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
450 p_end--;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
451 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
452 assert(p_end == -1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
453 p_efake = -1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
454
bce86c4163a3 Initial revision
kono
parents:
diff changeset
455 p_max = hunkmax; /* gets reduced when --- found */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
456 if (diff_type == CONTEXT_DIFF || diff_type == NEW_CONTEXT_DIFF) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
457 long line_beginning = ftell(pfp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
458 /* file pos of the current line */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
459 LINENUM repl_beginning = 0; /* index of --- line */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
460 Reg4 LINENUM fillcnt = 0; /* #lines of missing ptrn or repl */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
461 Reg5 LINENUM fillsrc; /* index of first line to copy */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
462 Reg6 LINENUM filldst; /* index of first missing line */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
463 bool ptrn_spaces_eaten = FALSE; /* ptrn was slightly misformed */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
464 Reg9 bool repl_could_be_missing = TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
465 /* no + or ! lines in this hunk */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
466 bool repl_missing = FALSE; /* we are now backtracking */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
467 long repl_backtrack_position = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
468 /* file pos of first repl line */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
469 LINENUM repl_patch_line; /* input line number for same */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
470 Reg7 LINENUM ptrn_copiable = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
471 /* # of copiable lines in ptrn */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
472
bce86c4163a3 Initial revision
kono
parents:
diff changeset
473 ret = pgets(buf, sizeof buf, pfp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
474 p_input_line++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
475 if (ret == Nullch || strnNE(buf, "********", 8)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
476 next_intuit_at(line_beginning,p_input_line);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
477 return FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
478 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
479 p_context = 100;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
480 p_hunk_beg = p_input_line + 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
481 while (p_end < p_max) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
482 line_beginning = ftell(pfp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
483 ret = pgets(buf, sizeof buf, pfp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
484 p_input_line++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
485 if (ret == Nullch) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
486 if (p_max - p_end < 4)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
487 Strcpy(buf, " \n"); /* assume blank lines got chopped */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
488 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
489 if (repl_beginning && repl_could_be_missing) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
490 repl_missing = TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
491 goto hunk_done;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
492 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
493 fatal1("unexpected end of file in patch\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
494 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
495 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
496 p_end++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
497 assert(p_end < hunkmax);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
498 p_char[p_end] = *buf;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
499 #ifdef zilog
bce86c4163a3 Initial revision
kono
parents:
diff changeset
500 p_line[(short)p_end] = Nullch;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
501 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
502 p_line[p_end] = Nullch;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
503 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
504 switch (*buf) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
505 case '*':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
506 if (strnEQ(buf, "********", 8)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
507 if (repl_beginning && repl_could_be_missing) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
508 repl_missing = TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
509 goto hunk_done;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
510 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
511 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
512 fatal2("unexpected end of hunk at line %ld\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
513 p_input_line);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
514 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
515 if (p_end != 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
516 if (repl_beginning && repl_could_be_missing) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
517 repl_missing = TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
518 goto hunk_done;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
519 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
520 fatal3("unexpected *** at line %ld: %s", p_input_line, buf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
521 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
522 context = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
523 p_line[p_end] = savestr(buf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
524 if (out_of_mem) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
525 p_end--;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
526 return FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
527 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
528 for (s=buf; *s && !isdigit(*s); s++) ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
529 if (!*s)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
530 malformed ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
531 if (strnEQ(s,"0,0",3))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
532 strcpy(s,s+2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
533 p_first = (LINENUM) atol(s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
534 while (isdigit(*s)) s++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
535 if (*s == ',') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
536 for (; *s && !isdigit(*s); s++) ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
537 if (!*s)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
538 malformed ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
539 p_ptrn_lines = ((LINENUM)atol(s)) - p_first + 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
540 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
541 else if (p_first)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
542 p_ptrn_lines = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
543 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
544 p_ptrn_lines = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
545 p_first = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
546 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
547 p_max = p_ptrn_lines + 6; /* we need this much at least */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
548 while (p_max >= hunkmax)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
549 grow_hunkmax();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
550 p_max = hunkmax;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
551 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
552 case '-':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
553 if (buf[1] == '-') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
554 if (repl_beginning ||
bce86c4163a3 Initial revision
kono
parents:
diff changeset
555 (p_end != p_ptrn_lines + 1 + (p_char[p_end-1] == '\n')))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
556 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
557 if (p_end == 1) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
558 /* `old' lines were omitted - set up to fill */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
559 /* them in from 'new' context lines. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
560 p_end = p_ptrn_lines + 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
561 fillsrc = p_end + 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
562 filldst = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
563 fillcnt = p_ptrn_lines;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
564 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
565 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
566 if (repl_beginning) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
567 if (repl_could_be_missing){
bce86c4163a3 Initial revision
kono
parents:
diff changeset
568 repl_missing = TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
569 goto hunk_done;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
570 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
571 fatal3(
bce86c4163a3 Initial revision
kono
parents:
diff changeset
572 "duplicate \"---\" at line %ld--check line numbers at line %ld\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
573 p_input_line, p_hunk_beg + repl_beginning);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
574 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
575 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
576 fatal4(
bce86c4163a3 Initial revision
kono
parents:
diff changeset
577 "%s \"---\" at line %ld--check line numbers at line %ld\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
578 (p_end <= p_ptrn_lines
bce86c4163a3 Initial revision
kono
parents:
diff changeset
579 ? "Premature"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
580 : "Overdue" ),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
581 p_input_line, p_hunk_beg);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
582 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
583 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
584 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
585 repl_beginning = p_end;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
586 repl_backtrack_position = ftell(pfp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
587 repl_patch_line = p_input_line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
588 p_line[p_end] = savestr(buf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
589 if (out_of_mem) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
590 p_end--;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
591 return FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
592 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
593 p_char[p_end] = '=';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
594 for (s=buf; *s && !isdigit(*s); s++) ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
595 if (!*s)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
596 malformed ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
597 p_newfirst = (LINENUM) atol(s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
598 while (isdigit(*s)) s++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
599 if (*s == ',') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
600 for (; *s && !isdigit(*s); s++) ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
601 if (!*s)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
602 malformed ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
603 p_repl_lines = ((LINENUM)atol(s)) - p_newfirst + 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
604 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
605 else if (p_newfirst)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
606 p_repl_lines = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
607 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
608 p_repl_lines = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
609 p_newfirst = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
610 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
611 p_max = p_repl_lines + p_end;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
612 if (p_max > MAXHUNKSIZE)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
613 fatal4("hunk too large (%ld lines) at line %ld: %s",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
614 p_max, p_input_line, buf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
615 while (p_max >= hunkmax)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
616 grow_hunkmax();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
617 if (p_repl_lines != ptrn_copiable
bce86c4163a3 Initial revision
kono
parents:
diff changeset
618 && (p_context != 0 || p_repl_lines != 1))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
619 repl_could_be_missing = FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
620 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
621 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
622 goto change_line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
623 case '+': case '!':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
624 repl_could_be_missing = FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
625 change_line:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
626 if (buf[1] == '\n' && canonicalize)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
627 strcpy(buf+1," \n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
628 if (!isspace(buf[1]) && buf[1] != '>' && buf[1] != '<' &&
bce86c4163a3 Initial revision
kono
parents:
diff changeset
629 repl_beginning && repl_could_be_missing) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
630 repl_missing = TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
631 goto hunk_done;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
632 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
633 if (context >= 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
634 if (context < p_context)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
635 p_context = context;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
636 context = -1000;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
637 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
638 p_line[p_end] = savestr(buf+2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
639 if (out_of_mem) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
640 p_end--;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
641 return FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
642 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
643 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
644 case '\t': case '\n': /* assume the 2 spaces got eaten */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
645 if (repl_beginning && repl_could_be_missing &&
bce86c4163a3 Initial revision
kono
parents:
diff changeset
646 (!ptrn_spaces_eaten || diff_type == NEW_CONTEXT_DIFF) ) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
647 repl_missing = TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
648 goto hunk_done;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
649 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
650 p_line[p_end] = savestr(buf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
651 if (out_of_mem) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
652 p_end--;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
653 return FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
654 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
655 if (p_end != p_ptrn_lines + 1) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
656 ptrn_spaces_eaten |= (repl_beginning != 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
657 context++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
658 if (!repl_beginning)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
659 ptrn_copiable++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
660 p_char[p_end] = ' ';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
661 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
662 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
663 case ' ':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
664 if (!isspace(buf[1]) &&
bce86c4163a3 Initial revision
kono
parents:
diff changeset
665 repl_beginning && repl_could_be_missing) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
666 repl_missing = TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
667 goto hunk_done;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
668 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
669 context++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
670 if (!repl_beginning)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
671 ptrn_copiable++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
672 p_line[p_end] = savestr(buf+2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
673 if (out_of_mem) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
674 p_end--;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
675 return FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
676 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
677 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
678 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
679 if (repl_beginning && repl_could_be_missing) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
680 repl_missing = TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
681 goto hunk_done;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
682 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
683 malformed ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
684 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
685 /* set up p_len for strncmp() so we don't have to */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
686 /* assume null termination */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
687 if (p_line[p_end])
bce86c4163a3 Initial revision
kono
parents:
diff changeset
688 p_len[p_end] = strlen(p_line[p_end]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
689 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
690 p_len[p_end] = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
691 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
692
bce86c4163a3 Initial revision
kono
parents:
diff changeset
693 hunk_done:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
694 if (p_end >=0 && !repl_beginning)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
695 fatal2("no --- found in patch at line %ld\n", pch_hunk_beg());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
696
bce86c4163a3 Initial revision
kono
parents:
diff changeset
697 if (repl_missing) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
698
bce86c4163a3 Initial revision
kono
parents:
diff changeset
699 /* reset state back to just after --- */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
700 p_input_line = repl_patch_line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
701 for (p_end--; p_end > repl_beginning; p_end--)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
702 free(p_line[p_end]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
703 Fseek(pfp, repl_backtrack_position, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
704
bce86c4163a3 Initial revision
kono
parents:
diff changeset
705 /* redundant 'new' context lines were omitted - set */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
706 /* up to fill them in from the old file context */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
707 if (!p_context && p_repl_lines == 1) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
708 p_repl_lines = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
709 p_max--;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
710 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
711 fillsrc = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
712 filldst = repl_beginning+1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
713 fillcnt = p_repl_lines;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
714 p_end = p_max;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
715 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
716 else if (!p_context && fillcnt == 1) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
717 /* the first hunk was a null hunk with no context */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
718 /* and we were expecting one line -- fix it up. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
719 while (filldst < p_end) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
720 p_line[filldst] = p_line[filldst+1];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
721 p_char[filldst] = p_char[filldst+1];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
722 p_len[filldst] = p_len[filldst+1];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
723 filldst++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
724 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
725 #if 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
726 repl_beginning--; /* this doesn't need to be fixed */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
727 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
728 p_end--;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
729 p_first++; /* do append rather than insert */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
730 fillcnt = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
731 p_ptrn_lines = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
732 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
733
bce86c4163a3 Initial revision
kono
parents:
diff changeset
734 if (diff_type == CONTEXT_DIFF &&
bce86c4163a3 Initial revision
kono
parents:
diff changeset
735 (fillcnt || (p_first > 1 && ptrn_copiable > 2*p_context)) ) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
736 if (verbose)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
737 say4("%s\n%s\n%s\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
738 "(Fascinating--this is really a new-style context diff but without",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
739 "the telltale extra asterisks on the *** line that usually indicate",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
740 "the new style...)");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
741 diff_type = NEW_CONTEXT_DIFF;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
742 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
743
bce86c4163a3 Initial revision
kono
parents:
diff changeset
744 /* if there were omitted context lines, fill them in now */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
745 if (fillcnt) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
746 p_bfake = filldst; /* remember where not to free() */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
747 p_efake = filldst + fillcnt - 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
748 while (fillcnt-- > 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
749 while (fillsrc <= p_end && p_char[fillsrc] != ' ')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
750 fillsrc++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
751 if (fillsrc > p_end)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
752 fatal2("replacement text or line numbers mangled in hunk at line %ld\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
753 p_hunk_beg);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
754 p_line[filldst] = p_line[fillsrc];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
755 p_char[filldst] = p_char[fillsrc];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
756 p_len[filldst] = p_len[fillsrc];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
757 fillsrc++; filldst++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
758 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
759 while (fillsrc <= p_end && fillsrc != repl_beginning &&
bce86c4163a3 Initial revision
kono
parents:
diff changeset
760 p_char[fillsrc] != ' ')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
761 fillsrc++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
762 #ifdef DEBUGGING
bce86c4163a3 Initial revision
kono
parents:
diff changeset
763 if (debug & 64)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
764 printf("fillsrc %ld, filldst %ld, rb %ld, e+1 %ld\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
765 fillsrc,filldst,repl_beginning,p_end+1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
766 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
767 assert(fillsrc==p_end+1 || fillsrc==repl_beginning);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
768 assert(filldst==p_end+1 || filldst==repl_beginning);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
769 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
770 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
771 else if (diff_type == UNI_DIFF) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
772 long line_beginning = ftell(pfp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
773 /* file pos of the current line */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
774 Reg4 LINENUM fillsrc; /* index of old lines */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
775 Reg5 LINENUM filldst; /* index of new lines */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
776 char ch;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
777
bce86c4163a3 Initial revision
kono
parents:
diff changeset
778 ret = pgets(buf, sizeof buf, pfp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
779 p_input_line++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
780 if (ret == Nullch || strnNE(buf, "@@ -", 4)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
781 next_intuit_at(line_beginning,p_input_line);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
782 return FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
783 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
784 s = buf+4;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
785 if (!*s)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
786 malformed ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
787 p_first = (LINENUM) atol(s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
788 while (isdigit(*s)) s++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
789 if (*s == ',') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
790 p_ptrn_lines = (LINENUM) atol(++s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
791 while (isdigit(*s)) s++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
792 } else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
793 p_ptrn_lines = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
794 if (*s == ' ') s++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
795 if (*s != '+' || !*++s)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
796 malformed ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
797 p_newfirst = (LINENUM) atol(s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
798 while (isdigit(*s)) s++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
799 if (*s == ',') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
800 p_repl_lines = (LINENUM) atol(++s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
801 while (isdigit(*s)) s++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
802 } else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
803 p_repl_lines = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
804 if (*s == ' ') s++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
805 if (*s != '@')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
806 malformed ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
807 if (!p_ptrn_lines)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
808 p_first++; /* do append rather than insert */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
809 p_max = p_ptrn_lines + p_repl_lines + 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
810 while (p_max >= hunkmax)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
811 grow_hunkmax();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
812 fillsrc = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
813 filldst = fillsrc + p_ptrn_lines;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
814 p_end = filldst + p_repl_lines;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
815 Sprintf(buf,"*** %ld,%ld ****\n",p_first,p_first + p_ptrn_lines - 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
816 p_line[0] = savestr(buf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
817 if (out_of_mem) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
818 p_end = -1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
819 return FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
820 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
821 p_char[0] = '*';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
822 Sprintf(buf,"--- %ld,%ld ----\n",p_newfirst,p_newfirst+p_repl_lines-1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
823 p_line[filldst] = savestr(buf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
824 if (out_of_mem) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
825 p_end = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
826 return FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
827 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
828 p_char[filldst++] = '=';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
829 p_context = 100;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
830 context = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
831 p_hunk_beg = p_input_line + 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
832 while (fillsrc <= p_ptrn_lines || filldst <= p_end) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
833 line_beginning = ftell(pfp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
834 ret = pgets(buf, sizeof buf, pfp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
835 p_input_line++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
836 if (ret == Nullch) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
837 if (p_max - filldst < 3)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
838 Strcpy(buf, " \n"); /* assume blank lines got chopped */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
839 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
840 fatal1("unexpected end of file in patch\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
841 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
842 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
843 if (*buf == '\t' || *buf == '\n') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
844 ch = ' '; /* assume the space got eaten */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
845 s = savestr(buf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
846 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
847 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
848 ch = *buf;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
849 s = savestr(buf+1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
850 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
851 if (out_of_mem) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
852 while (--filldst > p_ptrn_lines)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
853 free(p_line[filldst]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
854 p_end = fillsrc-1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
855 return FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
856 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
857 switch (ch) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
858 case '-':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
859 if (fillsrc > p_ptrn_lines) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
860 free(s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
861 p_end = filldst-1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
862 malformed ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
863 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
864 p_char[fillsrc] = ch;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
865 p_line[fillsrc] = s;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
866 p_len[fillsrc++] = strlen(s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
867 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
868 case '=':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
869 ch = ' ';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
870 /* FALL THROUGH */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
871 case ' ':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
872 if (fillsrc > p_ptrn_lines) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
873 free(s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
874 while (--filldst > p_ptrn_lines)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
875 free(p_line[filldst]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
876 p_end = fillsrc-1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
877 malformed ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
878 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
879 context++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
880 p_char[fillsrc] = ch;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
881 p_line[fillsrc] = s;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
882 p_len[fillsrc++] = strlen(s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
883 s = savestr(s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
884 if (out_of_mem) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
885 while (--filldst > p_ptrn_lines)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
886 free(p_line[filldst]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
887 p_end = fillsrc-1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
888 return FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
889 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
890 /* FALL THROUGH */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
891 case '+':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
892 if (filldst > p_end) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
893 free(s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
894 while (--filldst > p_ptrn_lines)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
895 free(p_line[filldst]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
896 p_end = fillsrc-1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
897 malformed ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
898 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
899 p_char[filldst] = ch;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
900 p_line[filldst] = s;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
901 p_len[filldst++] = strlen(s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
902 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
903 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
904 p_end = filldst;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
905 malformed ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
906 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
907 if (ch != ' ' && context > 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
908 if (context < p_context)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
909 p_context = context;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
910 context = -1000;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
911 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
912 }/* while */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
913 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
914 else { /* normal diff--fake it up */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
915 char hunk_type;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
916 Reg3 int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
917 LINENUM min, max;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
918 long line_beginning = ftell(pfp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
919
bce86c4163a3 Initial revision
kono
parents:
diff changeset
920 p_context = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
921 ret = pgets(buf, sizeof buf, pfp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
922 p_input_line++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
923 if (ret == Nullch || !isdigit(*buf)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
924 next_intuit_at(line_beginning,p_input_line);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
925 return FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
926 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
927 p_first = (LINENUM)atol(buf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
928 for (s=buf; isdigit(*s); s++) ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
929 if (*s == ',') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
930 p_ptrn_lines = (LINENUM)atol(++s) - p_first + 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
931 while (isdigit(*s)) s++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
932 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
933 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
934 p_ptrn_lines = (*s != 'a');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
935 hunk_type = *s;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
936 if (hunk_type == 'a')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
937 p_first++; /* do append rather than insert */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
938 min = (LINENUM)atol(++s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
939 for (; isdigit(*s); s++) ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
940 if (*s == ',')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
941 max = (LINENUM)atol(++s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
942 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
943 max = min;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
944 if (hunk_type == 'd')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
945 min++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
946 p_end = p_ptrn_lines + 1 + max - min + 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
947 if (p_end > MAXHUNKSIZE)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
948 fatal4("hunk too large (%ld lines) at line %ld: %s",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
949 p_end, p_input_line, buf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
950 while (p_end >= hunkmax)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
951 grow_hunkmax();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
952 p_newfirst = min;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
953 p_repl_lines = max - min + 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
954 Sprintf(buf, "*** %ld,%ld\n", p_first, p_first + p_ptrn_lines - 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
955 p_line[0] = savestr(buf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
956 if (out_of_mem) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
957 p_end = -1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
958 return FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
959 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
960 p_char[0] = '*';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
961 for (i=1; i<=p_ptrn_lines; i++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
962 ret = pgets(buf, sizeof buf, pfp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
963 p_input_line++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
964 if (ret == Nullch)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
965 fatal2("unexpected end of file in patch at line %ld\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
966 p_input_line);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
967 if (*buf != '<')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
968 fatal2("< expected at line %ld of patch\n", p_input_line);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
969 p_line[i] = savestr(buf+2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
970 if (out_of_mem) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
971 p_end = i-1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
972 return FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
973 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
974 p_len[i] = strlen(p_line[i]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
975 p_char[i] = '-';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
976 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
977 if (hunk_type == 'c') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
978 ret = pgets(buf, sizeof buf, pfp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
979 p_input_line++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
980 if (ret == Nullch)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
981 fatal2("unexpected end of file in patch at line %ld\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
982 p_input_line);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
983 if (*buf != '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
984 fatal2("--- expected at line %ld of patch\n", p_input_line);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
985 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
986 Sprintf(buf, "--- %ld,%ld\n", min, max);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
987 p_line[i] = savestr(buf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
988 if (out_of_mem) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
989 p_end = i-1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
990 return FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
991 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
992 p_char[i] = '=';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
993 for (i++; i<=p_end; i++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
994 ret = pgets(buf, sizeof buf, pfp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
995 p_input_line++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
996 if (ret == Nullch)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
997 fatal2("unexpected end of file in patch at line %ld\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
998 p_input_line);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
999 if (*buf != '>')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1000 fatal2("> expected at line %ld of patch\n", p_input_line);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1001 p_line[i] = savestr(buf+2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1002 if (out_of_mem) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1003 p_end = i-1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1004 return FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1005 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1006 p_len[i] = strlen(p_line[i]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1007 p_char[i] = '+';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1008 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1009 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1010 if (reverse) /* backwards patch? */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1011 if (!pch_swap())
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1012 say1("Not enough memory to swap next hunk!\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1013 #ifdef DEBUGGING
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1014 if (debug & 2) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1015 int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1016 char special;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1017
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1018 for (i=0; i <= p_end; i++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1019 if (i == p_ptrn_lines)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1020 special = '^';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1021 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1022 special = ' ';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1023 fprintf(stderr, "%3d %c %c %s", i, p_char[i], special, p_line[i]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1024 Fflush(stderr);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1025 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1026 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1027 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1028 if (p_end+1 < hunkmax) /* paranoia reigns supreme... */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1029 p_char[p_end+1] = '^'; /* add a stopper for apply_hunk */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1030 return TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1031 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1032
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1033 /* Input a line from the patch file, worrying about indentation. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1034
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1035 char *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1036 pgets(bf,sz,fp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1037 char *bf;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1038 int sz;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1039 FILE *fp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1040 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1041 char *ret = fgets(bf, sz, fp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1042 Reg1 char *s;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1043 Reg2 int indent = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1044
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1045 if (p_indent && ret != Nullch) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1046 for (s=buf;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1047 indent < p_indent && (*s == ' ' || *s == '\t' || *s == 'X'); s++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1048 if (*s == '\t')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1049 indent += 8 - (indent % 7);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1050 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1051 indent++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1052 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1053 if (buf != s)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1054 Strcpy(buf, s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1055 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1056 return ret;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1057 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1058
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1059 /* Reverse the old and new portions of the current hunk. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1060
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1061 bool
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1062 pch_swap()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1063 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1064 char **tp_line; /* the text of the hunk */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1065 short *tp_len; /* length of each line */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1066 char *tp_char; /* +, -, and ! */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1067 Reg1 LINENUM i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1068 Reg2 LINENUM n;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1069 bool blankline = FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1070 Reg3 char *s;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1071
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1072 i = p_first;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1073 p_first = p_newfirst;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1074 p_newfirst = i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1075
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1076 /* make a scratch copy */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1077
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1078 tp_line = p_line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1079 tp_len = p_len;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1080 tp_char = p_char;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1081 p_line = Null(char**); /* force set_hunkmax to allocate again */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1082 p_len = Null(short*);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1083 p_char = Nullch;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1084 set_hunkmax();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1085 if (p_line == Null(char**) || p_len == Null(short*) || p_char == Nullch) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1086 #ifndef lint
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1087 if (p_line == Null(char**))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1088 free((char*)p_line);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1089 p_line = tp_line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1090 if (p_len == Null(short*))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1091 free((char*)p_len);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1092 p_len = tp_len;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1093 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1094 if (p_char == Nullch)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1095 free((char*)p_char);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1096 p_char = tp_char;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1097 return FALSE; /* not enough memory to swap hunk! */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1098 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1099
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1100 /* now turn the new into the old */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1101
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1102 i = p_ptrn_lines + 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1103 if (tp_char[i] == '\n') { /* account for possible blank line */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1104 blankline = TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1105 i++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1106 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1107 if (p_efake >= 0) { /* fix non-freeable ptr range */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1108 if (p_efake <= i)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1109 n = p_end - i + 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1110 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1111 n = -i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1112 p_efake += n;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1113 p_bfake += n;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1114 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1115 for (n=0; i <= p_end; i++,n++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1116 p_line[n] = tp_line[i];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1117 p_char[n] = tp_char[i];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1118 if (p_char[n] == '+')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1119 p_char[n] = '-';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1120 p_len[n] = tp_len[i];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1121 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1122 if (blankline) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1123 i = p_ptrn_lines + 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1124 p_line[n] = tp_line[i];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1125 p_char[n] = tp_char[i];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1126 p_len[n] = tp_len[i];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1127 n++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1128 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1129 assert(p_char[0] == '=');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1130 p_char[0] = '*';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1131 for (s=p_line[0]; *s; s++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1132 if (*s == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1133 *s = '*';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1134
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1135 /* now turn the old into the new */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1136
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1137 assert(tp_char[0] == '*');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1138 tp_char[0] = '=';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1139 for (s=tp_line[0]; *s; s++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1140 if (*s == '*')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1141 *s = '-';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1142 for (i=0; n <= p_end; i++,n++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1143 p_line[n] = tp_line[i];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1144 p_char[n] = tp_char[i];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1145 if (p_char[n] == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1146 p_char[n] = '+';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1147 p_len[n] = tp_len[i];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1148 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1149 assert(i == p_ptrn_lines + 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1150 i = p_ptrn_lines;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1151 p_ptrn_lines = p_repl_lines;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1152 p_repl_lines = i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1153 #ifndef lint
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1154 if (tp_line == Null(char**))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1155 free((char*)tp_line);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1156 if (tp_len == Null(short*))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1157 free((char*)tp_len);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1158 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1159 if (tp_char == Nullch)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1160 free((char*)tp_char);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1161 return TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1162 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1163
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1164 /* Return the specified line position in the old file of the old context. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1165
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1166 LINENUM
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1167 pch_first()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1168 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1169 return p_first;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1170 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1171
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1172 /* Return the number of lines of old context. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1173
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1174 LINENUM
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1175 pch_ptrn_lines()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1176 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1177 return p_ptrn_lines;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1178 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1179
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1180 /* Return the probable line position in the new file of the first line. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1181
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1182 LINENUM
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1183 pch_newfirst()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1184 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1185 return p_newfirst;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1186 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1187
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1188 /* Return the number of lines in the replacement text including context. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1189
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1190 LINENUM
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1191 pch_repl_lines()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1192 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1193 return p_repl_lines;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1194 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1195
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1196 /* Return the number of lines in the whole hunk. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1197
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1198 LINENUM
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1199 pch_end()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1200 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1201 return p_end;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1202 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1203
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1204 /* Return the number of context lines before the first changed line. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1205
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1206 LINENUM
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1207 pch_context()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1208 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1209 return p_context;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1210 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1211
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1212 /* Return the length of a particular patch line. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1213
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1214 short
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1215 pch_line_len(line)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1216 LINENUM line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1217 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1218 return p_len[line];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1219 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1220
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1221 /* Return the control character (+, -, *, !, etc) for a patch line. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1222
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1223 char
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1224 pch_char(line)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1225 LINENUM line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1226 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1227 return p_char[line];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1228 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1229
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1230 /* Return a pointer to a particular patch line. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1231
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1232 char *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1233 pfetch(line)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1234 LINENUM line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1235 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1236 return p_line[line];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1237 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1238
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1239 /* Return where in the patch file this hunk began, for error messages. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1240
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1241 LINENUM
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1242 pch_hunk_beg()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1243 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1244 return p_hunk_beg;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1245 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1246
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1247 /* Apply an ed script by feeding ed itself. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1248
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1249 void
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1250 do_ed_script()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1251 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1252 Reg1 char *t;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1253 Reg2 long beginning_of_this_line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1254 Reg3 bool this_line_is_command = FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1255 Reg4 FILE *pipefp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1256
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1257 if (!skip_rest_of_patch) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1258 Unlink(TMPOUTNAME);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1259 copy_file(filearg[0], TMPOUTNAME);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1260 if (verbose)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1261 Sprintf(buf, "/bin/ed %s", TMPOUTNAME);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1262 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1263 Sprintf(buf, "/bin/ed - %s", TMPOUTNAME);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1264 pipefp = popen(buf, "w");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1265 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1266 for (;;) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1267 beginning_of_this_line = ftell(pfp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1268 if (pgets(buf, sizeof buf, pfp) == Nullch) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1269 next_intuit_at(beginning_of_this_line,p_input_line);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1270 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1271 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1272 p_input_line++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1273 for (t=buf; isdigit(*t) || *t == ','; t++) ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1274 this_line_is_command = (isdigit(*buf) &&
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1275 (*t == 'd' || *t == 'c' || *t == 'a') );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1276 if (this_line_is_command) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1277 if (!skip_rest_of_patch)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1278 fputs(buf, pipefp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1279 if (*t != 'd') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1280 while (pgets(buf, sizeof buf, pfp) != Nullch) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1281 p_input_line++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1282 if (!skip_rest_of_patch)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1283 fputs(buf, pipefp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1284 if (strEQ(buf, ".\n"))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1285 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1286 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1287 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1288 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1289 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1290 next_intuit_at(beginning_of_this_line,p_input_line);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1291 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1292 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1293 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1294 if (skip_rest_of_patch)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1295 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1296 fprintf(pipefp, "w\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1297 fprintf(pipefp, "q\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1298 Fflush(pipefp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1299 Pclose(pipefp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1300 ignore_signals();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1301 if (move_file(TMPOUTNAME, outname) < 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1302 toutkeep = TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1303 chmod(TMPOUTNAME, filemode);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1304 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1305 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1306 chmod(outname, filemode);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1307 set_signals(1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1308 }