annotate miscellany/patch-2.0.12u8/patch.c @ 1:848621fd0092 kono mh-6_8_4_JP3_05

MH pre UTF8
author kono
date Mon, 18 Apr 2005 23:46:02 +0900
parents bce86c4163a3
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1 char rcsid[] =
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2 "$Header$";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
3
bce86c4163a3 Initial revision
kono
parents:
diff changeset
4 /* patch - a program to apply diffs to original files
bce86c4163a3 Initial revision
kono
parents:
diff changeset
5 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
6 * Copyright 1986, Larry Wall
bce86c4163a3 Initial revision
kono
parents:
diff changeset
7 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
8 * This program may be copied as long as you don't try to make any
bce86c4163a3 Initial revision
kono
parents:
diff changeset
9 * money off of it, or pretend that you wrote it.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
10 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
11 * $Log$
1
848621fd0092 MH pre UTF8
kono
parents: 0
diff changeset
12 * Revision 1.1.1.1 2005/04/18 14:46:05 kono
848621fd0092 MH pre UTF8
kono
parents: 0
diff changeset
13 * MH pre UTF8
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
14 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
15 * Revision 2.0.2.0 90/05/01 22:17:50 davison
bce86c4163a3 Initial revision
kono
parents:
diff changeset
16 * patch12u: unidiff support added
bce86c4163a3 Initial revision
kono
parents:
diff changeset
17 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
18 * Revision 2.0.1.6 88/06/22 20:46:39 lwall
bce86c4163a3 Initial revision
kono
parents:
diff changeset
19 * patch12: rindex() wasn't declared
bce86c4163a3 Initial revision
kono
parents:
diff changeset
20 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
21 * Revision 2.0.1.5 88/06/03 15:09:37 lwall
bce86c4163a3 Initial revision
kono
parents:
diff changeset
22 * patch10: exit code improved.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
23 * patch10: better support for non-flexfilenames.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
24 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
25 * Revision 2.0.1.4 87/02/16 14:00:04 lwall
bce86c4163a3 Initial revision
kono
parents:
diff changeset
26 * Short replacement caused spurious "Out of sync" message.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
27 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
28 * Revision 2.0.1.3 87/01/30 22:45:50 lwall
bce86c4163a3 Initial revision
kono
parents:
diff changeset
29 * Improved diagnostic on sync error.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
30 * Moved do_ed_script() to pch.c.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
31 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
32 * Revision 2.0.1.2 86/11/21 09:39:15 lwall
bce86c4163a3 Initial revision
kono
parents:
diff changeset
33 * Fuzz factor caused offset of installed lines.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
34 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
35 * Revision 2.0.1.1 86/10/29 13:10:22 lwall
bce86c4163a3 Initial revision
kono
parents:
diff changeset
36 * Backwards search could terminate prematurely.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
37 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
38 * Revision 2.0 86/09/17 15:37:32 lwall
bce86c4163a3 Initial revision
kono
parents:
diff changeset
39 * Baseline for netwide release.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
40 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
41 * Revision 1.5 86/08/01 20:53:24 lwall
bce86c4163a3 Initial revision
kono
parents:
diff changeset
42 * Changed some %d's to %ld's.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
43 * Linted.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
44 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
45 * Revision 1.4 86/08/01 19:17:29 lwall
bce86c4163a3 Initial revision
kono
parents:
diff changeset
46 * Fixes for machines that can't vararg.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
47 * Added fuzz factor.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
48 * Generalized -p.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
49 * General cleanup.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
50 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
51 * 85/08/15 van%ucbmonet@berkeley
bce86c4163a3 Initial revision
kono
parents:
diff changeset
52 * Changes for 4.3bsd diff -c.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
53 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
54 * Revision 1.3 85/03/26 15:07:43 lwall
bce86c4163a3 Initial revision
kono
parents:
diff changeset
55 * Frozen.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
56 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
57 * Revision 1.2.1.9 85/03/12 17:03:35 lwall
bce86c4163a3 Initial revision
kono
parents:
diff changeset
58 * Changed pfp->_file to fileno(pfp).
bce86c4163a3 Initial revision
kono
parents:
diff changeset
59 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
60 * Revision 1.2.1.8 85/03/12 16:30:43 lwall
bce86c4163a3 Initial revision
kono
parents:
diff changeset
61 * Check i_ptr and i_womp to make sure they aren't null before freeing.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
62 * Also allow ed output to be suppressed.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
63 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
64 * Revision 1.2.1.7 85/03/12 15:56:13 lwall
bce86c4163a3 Initial revision
kono
parents:
diff changeset
65 * Added -p option from jromine@uci-750a.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
66 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
67 * Revision 1.2.1.6 85/03/12 12:12:51 lwall
bce86c4163a3 Initial revision
kono
parents:
diff changeset
68 * Now checks for normalness of file to patch.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
69 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
70 * Revision 1.2.1.5 85/03/12 11:52:12 lwall
bce86c4163a3 Initial revision
kono
parents:
diff changeset
71 * Added -D (#ifdef) option from joe@fluke.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
72 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
73 * Revision 1.2.1.4 84/12/06 11:14:15 lwall
bce86c4163a3 Initial revision
kono
parents:
diff changeset
74 * Made smarter about SCCS subdirectories.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
75 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
76 * Revision 1.2.1.3 84/12/05 11:18:43 lwall
bce86c4163a3 Initial revision
kono
parents:
diff changeset
77 * Added -l switch to do loose string comparison.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
78 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
79 * Revision 1.2.1.2 84/12/04 09:47:13 lwall
bce86c4163a3 Initial revision
kono
parents:
diff changeset
80 * Failed hunk count not reset on multiple patch file.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
81 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
82 * Revision 1.2.1.1 84/12/04 09:42:37 lwall
bce86c4163a3 Initial revision
kono
parents:
diff changeset
83 * Branch for sdcrdcf changes.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
84 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
85 * Revision 1.2 84/11/29 13:29:51 lwall
bce86c4163a3 Initial revision
kono
parents:
diff changeset
86 * Linted. Identifiers uniqified. Fixed i_ptr malloc() bug. Fixed
bce86c4163a3 Initial revision
kono
parents:
diff changeset
87 * multiple calls to mktemp(). Will now work on machines that can only
bce86c4163a3 Initial revision
kono
parents:
diff changeset
88 * read 32767 chars. Added -R option for diffs with new and old swapped.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
89 * Various cosmetic changes.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
90 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
91 * Revision 1.1 84/11/09 17:03:58 lwall
bce86c4163a3 Initial revision
kono
parents:
diff changeset
92 * Initial revision
bce86c4163a3 Initial revision
kono
parents:
diff changeset
93 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
94 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
95
bce86c4163a3 Initial revision
kono
parents:
diff changeset
96 #include "INTERN.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
97 #include "common.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
98 #include "EXTERN.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
99 #include "version.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
100 #include "util.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
101 #include "pch.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
102 #include "inp.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
103 #include "backupfile.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
104
bce86c4163a3 Initial revision
kono
parents:
diff changeset
105 /* procedures */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
106
bce86c4163a3 Initial revision
kono
parents:
diff changeset
107 void reinitialize_almost_everything();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
108 void get_some_switches();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
109 LINENUM locate_hunk();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
110 void abort_hunk();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
111 void apply_hunk();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
112 void init_output();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
113 void init_reject();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
114 void copy_till();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
115 void spew_output();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
116 void dump_line();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
117 bool patch_match();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
118 bool similar();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
119 void re_input();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
120 void my_exit();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
121
bce86c4163a3 Initial revision
kono
parents:
diff changeset
122 /* TRUE if -E was specified on command line. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
123 static int remove_empty_files = FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
124
bce86c4163a3 Initial revision
kono
parents:
diff changeset
125 /* TRUE if -R was specified on command line. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
126 static int reverse_flag_specified = FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
127
bce86c4163a3 Initial revision
kono
parents:
diff changeset
128 /* Apply a set of diffs as appropriate. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
129
bce86c4163a3 Initial revision
kono
parents:
diff changeset
130 int
bce86c4163a3 Initial revision
kono
parents:
diff changeset
131 main(argc,argv)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
132 int argc;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
133 char **argv;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
134 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
135 LINENUM where;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
136 LINENUM newwhere;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
137 LINENUM fuzz;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
138 LINENUM mymaxfuzz;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
139 int hunk = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
140 int failed = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
141 int failtotal = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
142 int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
143
bce86c4163a3 Initial revision
kono
parents:
diff changeset
144 setbuf(stderr, serrbuf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
145 for (i = 0; i<MAXFILEC; i++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
146 filearg[i] = Nullch;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
147
bce86c4163a3 Initial revision
kono
parents:
diff changeset
148 myuid = getuid();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
149
bce86c4163a3 Initial revision
kono
parents:
diff changeset
150 /* Cons up the names of the temporary files. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
151 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
152 /* Directory for temporary files. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
153 char *tmpdir;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
154 int tmpname_len;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
155
bce86c4163a3 Initial revision
kono
parents:
diff changeset
156 tmpdir = getenv ("TMPDIR");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
157 if (tmpdir == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
158 tmpdir = "/tmp";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
159 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
160 tmpname_len = strlen (tmpdir) + 20;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
161
bce86c4163a3 Initial revision
kono
parents:
diff changeset
162 TMPOUTNAME = (char *) malloc (tmpname_len);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
163 strcpy (TMPOUTNAME, tmpdir);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
164 strcat (TMPOUTNAME, "/patchoXXXXXX");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
165 Mktemp(TMPOUTNAME);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
166
bce86c4163a3 Initial revision
kono
parents:
diff changeset
167 TMPINNAME = (char *) malloc (tmpname_len);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
168 strcpy (TMPINNAME, tmpdir);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
169 strcat (TMPINNAME, "/patchiXXXXXX");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
170 Mktemp(TMPINNAME);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
171
bce86c4163a3 Initial revision
kono
parents:
diff changeset
172 TMPREJNAME = (char *) malloc (tmpname_len);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
173 strcpy (TMPREJNAME, tmpdir);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
174 strcat (TMPREJNAME, "/patchrXXXXXX");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
175 Mktemp(TMPREJNAME);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
176
bce86c4163a3 Initial revision
kono
parents:
diff changeset
177 TMPPATNAME = (char *) malloc (tmpname_len);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
178 strcpy (TMPPATNAME, tmpdir);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
179 strcat (TMPPATNAME, "/patchpXXXXXX");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
180 Mktemp(TMPPATNAME);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
181 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
182
bce86c4163a3 Initial revision
kono
parents:
diff changeset
183 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
184 char *v;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
185
bce86c4163a3 Initial revision
kono
parents:
diff changeset
186 v = getenv ("SIMPLE_BACKUP_SUFFIX");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
187 if (v)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
188 simple_backup_suffix = v;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
189 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
190 simple_backup_suffix = ORIGEXT;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
191 #ifndef NODIR
bce86c4163a3 Initial revision
kono
parents:
diff changeset
192 v = getenv ("VERSION_CONTROL");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
193 backup_type = get_version (v); /* OK to pass NULL. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
194 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
195 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
196
bce86c4163a3 Initial revision
kono
parents:
diff changeset
197 /* parse switches */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
198 Argc = argc;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
199 Argv = argv;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
200 get_some_switches();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
201
bce86c4163a3 Initial revision
kono
parents:
diff changeset
202 /* make sure we clean up /tmp in case of disaster */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
203 set_signals(0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
204
bce86c4163a3 Initial revision
kono
parents:
diff changeset
205 for (
bce86c4163a3 Initial revision
kono
parents:
diff changeset
206 open_patch_file(filearg[1]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
207 there_is_another_patch();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
208 reinitialize_almost_everything()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
209 ) { /* for each patch in patch file */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
210
bce86c4163a3 Initial revision
kono
parents:
diff changeset
211 if (outname == Nullch)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
212 outname = savestr(filearg[0]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
213
bce86c4163a3 Initial revision
kono
parents:
diff changeset
214 /* for ed script just up and do it and exit */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
215 if (diff_type == ED_DIFF) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
216 do_ed_script();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
217 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
218 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
219
bce86c4163a3 Initial revision
kono
parents:
diff changeset
220 /* initialize the patched file */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
221 if (!skip_rest_of_patch)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
222 init_output(TMPOUTNAME);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
223
bce86c4163a3 Initial revision
kono
parents:
diff changeset
224 /* initialize reject file */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
225 init_reject(TMPREJNAME);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
226
bce86c4163a3 Initial revision
kono
parents:
diff changeset
227 /* find out where all the lines are */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
228 if (!skip_rest_of_patch)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
229 scan_input(filearg[0]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
230
bce86c4163a3 Initial revision
kono
parents:
diff changeset
231 /* from here on, open no standard i/o files, because malloc */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
232 /* might misfire and we can't catch it easily */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
233
bce86c4163a3 Initial revision
kono
parents:
diff changeset
234 /* apply each hunk of patch */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
235 hunk = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
236 failed = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
237 out_of_mem = FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
238 while (another_hunk()) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
239 hunk++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
240 fuzz = Nulline;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
241 mymaxfuzz = pch_context();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
242 if (maxfuzz < mymaxfuzz)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
243 mymaxfuzz = maxfuzz;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
244 if (!skip_rest_of_patch) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
245 do {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
246 where = locate_hunk(fuzz);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
247 if (hunk == 1 && where == Nulline && !force) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
248 /* dwim for reversed patch? */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
249 if (!pch_swap()) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
250 if (fuzz == Nulline)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
251 say1(
bce86c4163a3 Initial revision
kono
parents:
diff changeset
252 "Not enough memory to try swapped hunk! Assuming unswapped.\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
253 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
254 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
255 reverse = !reverse;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
256 where = locate_hunk(fuzz); /* try again */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
257 if (where == Nulline) { /* didn't find it swapped */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
258 if (!pch_swap()) /* put it back to normal */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
259 fatal1("lost hunk on alloc error!\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
260 reverse = !reverse;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
261 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
262 else if (noreverse) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
263 if (!pch_swap()) /* put it back to normal */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
264 fatal1("lost hunk on alloc error!\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
265 reverse = !reverse;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
266 say1(
bce86c4163a3 Initial revision
kono
parents:
diff changeset
267 "Ignoring previously applied (or reversed) patch.\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
268 skip_rest_of_patch = TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
269 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
270 else if (batch) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
271 if (verbose)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
272 say3(
bce86c4163a3 Initial revision
kono
parents:
diff changeset
273 "%seversed (or previously applied) patch detected! %s -R.",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
274 reverse ? "R" : "Unr",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
275 reverse ? "Assuming" : "Ignoring");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
276 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
277 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
278 ask3(
bce86c4163a3 Initial revision
kono
parents:
diff changeset
279 "%seversed (or previously applied) patch detected! %s -R? [y] ",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
280 reverse ? "R" : "Unr",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
281 reverse ? "Assume" : "Ignore");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
282 if (*buf == 'n') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
283 ask1("Apply anyway? [n] ");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
284 if (*buf != 'y')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
285 skip_rest_of_patch = TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
286 where = Nulline;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
287 reverse = !reverse;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
288 if (!pch_swap()) /* put it back to normal */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
289 fatal1("lost hunk on alloc error!\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
290 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
291 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
292 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
293 } while (!skip_rest_of_patch && where == Nulline &&
bce86c4163a3 Initial revision
kono
parents:
diff changeset
294 ++fuzz <= mymaxfuzz);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
295
bce86c4163a3 Initial revision
kono
parents:
diff changeset
296 if (skip_rest_of_patch) { /* just got decided */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
297 Fclose(ofp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
298 ofp = Nullfp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
299 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
300 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
301
bce86c4163a3 Initial revision
kono
parents:
diff changeset
302 newwhere = pch_newfirst() + last_offset;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
303 if (skip_rest_of_patch) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
304 abort_hunk();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
305 failed++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
306 if (verbose)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
307 say3("Hunk #%d ignored at %ld.\n", hunk, newwhere);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
308 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
309 else if (where == Nulline) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
310 abort_hunk();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
311 failed++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
312 if (verbose)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
313 say3("Hunk #%d failed at %ld.\n", hunk, newwhere);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
314 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
315 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
316 apply_hunk(where);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
317 if (verbose) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
318 say3("Hunk #%d succeeded at %ld", hunk, newwhere);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
319 if (fuzz)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
320 say2(" with fuzz %ld", fuzz);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
321 if (last_offset)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
322 say3(" (offset %ld line%s)",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
323 last_offset, last_offset==1L?"":"s");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
324 say1(".\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
325 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
326 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
327 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
328
bce86c4163a3 Initial revision
kono
parents:
diff changeset
329 if (out_of_mem && using_plan_a) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
330 Argc = Argc_last;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
331 Argv = Argv_last;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
332 say1("\n\nRan out of memory using Plan A--trying again...\n\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
333 if (ofp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
334 Fclose(ofp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
335 ofp = Nullfp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
336 if (rejfp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
337 Fclose(rejfp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
338 rejfp = Nullfp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
339 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
340 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
341
bce86c4163a3 Initial revision
kono
parents:
diff changeset
342 assert(hunk);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
343
bce86c4163a3 Initial revision
kono
parents:
diff changeset
344 /* finish spewing out the new file */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
345 if (!skip_rest_of_patch)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
346 spew_output();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
347
bce86c4163a3 Initial revision
kono
parents:
diff changeset
348 /* and put the output where desired */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
349 ignore_signals();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
350 if (!skip_rest_of_patch) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
351 struct stat statbuf;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
352 char *realout = outname;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
353
bce86c4163a3 Initial revision
kono
parents:
diff changeset
354 if (move_file(TMPOUTNAME, outname) < 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
355 toutkeep = TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
356 realout = TMPOUTNAME;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
357 chmod(TMPOUTNAME, filemode);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
358 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
359 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
360 chmod(outname, filemode);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
361
bce86c4163a3 Initial revision
kono
parents:
diff changeset
362 if (remove_empty_files && stat(realout, &statbuf) == 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
363 && statbuf.st_size == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
364 if (verbose)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
365 say2("Removing %s (empty after patching).\n", realout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
366 while (unlink(realout) >= 0) ; /* while is for Eunice. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
367 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
368 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
369 Fclose(rejfp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
370 rejfp = Nullfp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
371 if (failed) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
372 failtotal += failed;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
373 if (!*rejname) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
374 Strcpy(rejname, outname);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
375 #ifndef FLEXFILENAMES
bce86c4163a3 Initial revision
kono
parents:
diff changeset
376 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
377 char *s = rindex(rejname,'/');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
378
bce86c4163a3 Initial revision
kono
parents:
diff changeset
379 if (!s)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
380 s = rejname;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
381 if (strlen(s) > 13)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
382 if (s[12] == '.') /* try to preserve difference */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
383 s[12] = s[13]; /* between .h, .c, .y, etc. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
384 s[13] = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
385 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
386 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
387 Strcat(rejname, REJEXT);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
388 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
389 if (skip_rest_of_patch) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
390 say4("%d out of %d hunks ignored--saving rejects to %s\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
391 failed, hunk, rejname);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
392 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
393 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
394 say4("%d out of %d hunks failed--saving rejects to %s\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
395 failed, hunk, rejname);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
396 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
397 if (move_file(TMPREJNAME, rejname) < 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
398 trejkeep = TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
399 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
400 set_signals(1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
401 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
402 my_exit(failtotal);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
403 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
404
bce86c4163a3 Initial revision
kono
parents:
diff changeset
405 /* Prepare to find the next patch to do in the patch file. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
406
bce86c4163a3 Initial revision
kono
parents:
diff changeset
407 void
bce86c4163a3 Initial revision
kono
parents:
diff changeset
408 reinitialize_almost_everything()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
409 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
410 re_patch();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
411 re_input();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
412
bce86c4163a3 Initial revision
kono
parents:
diff changeset
413 input_lines = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
414 last_frozen_line = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
415
bce86c4163a3 Initial revision
kono
parents:
diff changeset
416 filec = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
417 if (filearg[0] != Nullch && !out_of_mem) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
418 free(filearg[0]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
419 filearg[0] = Nullch;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
420 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
421
bce86c4163a3 Initial revision
kono
parents:
diff changeset
422 if (outname != Nullch) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
423 free(outname);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
424 outname = Nullch;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
425 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
426
bce86c4163a3 Initial revision
kono
parents:
diff changeset
427 last_offset = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
428
bce86c4163a3 Initial revision
kono
parents:
diff changeset
429 diff_type = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
430
bce86c4163a3 Initial revision
kono
parents:
diff changeset
431 if (revision != Nullch) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
432 free(revision);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
433 revision = Nullch;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
434 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
435
bce86c4163a3 Initial revision
kono
parents:
diff changeset
436 reverse = reverse_flag_specified;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
437 skip_rest_of_patch = FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
438
bce86c4163a3 Initial revision
kono
parents:
diff changeset
439 get_some_switches();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
440
bce86c4163a3 Initial revision
kono
parents:
diff changeset
441 if (filec >= 2)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
442 fatal1("you may not change to a different patch file\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
443 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
444
bce86c4163a3 Initial revision
kono
parents:
diff changeset
445 static char *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
446 nextarg()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
447 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
448 if (!--Argc)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
449 fatal2("missing argument after `%s'\n", *Argv);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
450 return *++Argv;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
451 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
452
bce86c4163a3 Initial revision
kono
parents:
diff changeset
453 /* Process switches and filenames up to next '+' or end of list. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
454
bce86c4163a3 Initial revision
kono
parents:
diff changeset
455 void
bce86c4163a3 Initial revision
kono
parents:
diff changeset
456 get_some_switches()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
457 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
458 Reg1 char *s;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
459
bce86c4163a3 Initial revision
kono
parents:
diff changeset
460 rejname[0] = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
461 Argc_last = Argc;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
462 Argv_last = Argv;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
463 if (!Argc)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
464 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
465 for (Argc--,Argv++; Argc; Argc--,Argv++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
466 s = Argv[0];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
467 if (strEQ(s, "+")) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
468 return; /* + will be skipped by for loop */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
469 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
470 if (*s != '-' || !s[1]) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
471 if (filec == MAXFILEC)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
472 fatal1("too many file arguments\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
473 filearg[filec++] = savestr(s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
474 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
475 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
476 switch (*++s) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
477 case 'b':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
478 simple_backup_suffix = savestr(nextarg());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
479 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
480 case 'B':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
481 origprae = savestr(nextarg());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
482 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
483 case 'c':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
484 diff_type = CONTEXT_DIFF;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
485 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
486 case 'd':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
487 if (!*++s)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
488 s = nextarg();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
489 if (chdir(s) < 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
490 pfatal2("can't cd to %s", s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
491 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
492 case 'D':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
493 do_defines = TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
494 if (!*++s)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
495 s = nextarg();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
496 if (!isalpha(*s) && '_' != *s)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
497 fatal1("argument to -D is not an identifier\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
498 Sprintf(if_defined, "#ifdef %s\n", s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
499 Sprintf(not_defined, "#ifndef %s\n", s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
500 Sprintf(end_defined, "#endif /* %s */\n", s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
501 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
502 case 'e':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
503 diff_type = ED_DIFF;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
504 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
505 case 'E':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
506 remove_empty_files = TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
507 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
508 case 'f':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
509 force = TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
510 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
511 case 'F':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
512 if (*++s == '=')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
513 s++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
514 maxfuzz = atoi(s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
515 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
516 case 'l':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
517 canonicalize = TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
518 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
519 case 'n':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
520 diff_type = NORMAL_DIFF;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
521 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
522 case 'N':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
523 noreverse = TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
524 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
525 case 'o':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
526 outname = savestr(nextarg());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
527 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
528 case 'p':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
529 if (*++s == '=')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
530 s++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
531 strippath = atoi(s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
532 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
533 case 'r':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
534 Strcpy(rejname, nextarg());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
535 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
536 case 'R':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
537 reverse = TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
538 reverse_flag_specified = TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
539 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
540 case 's':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
541 verbose = FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
542 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
543 case 'S':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
544 skip_rest_of_patch = TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
545 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
546 case 't':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
547 batch = TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
548 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
549 case 'u':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
550 diff_type = UNI_DIFF;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
551 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
552 case 'v':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
553 version();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
554 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
555 case 'V':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
556 #ifndef NODIR
bce86c4163a3 Initial revision
kono
parents:
diff changeset
557 backup_type = get_version (nextarg ());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
558 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
559 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
560 #ifdef DEBUGGING
bce86c4163a3 Initial revision
kono
parents:
diff changeset
561 case 'x':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
562 debug = atoi(s+1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
563 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
564 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
565 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
566 fprintf(stderr, "patch: unrecognized option `%s'\n", Argv[0]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
567 fprintf(stderr, "\
bce86c4163a3 Initial revision
kono
parents:
diff changeset
568 Usage: patch [options] [origfile [patchfile]] [+ [options] [origfile]]...\n\
bce86c4163a3 Initial revision
kono
parents:
diff changeset
569 Options:\n\
bce86c4163a3 Initial revision
kono
parents:
diff changeset
570 [-ceEflnNRsStuv] [-b backup-ext] [-B backup-prefix] [-d directory]\n\
bce86c4163a3 Initial revision
kono
parents:
diff changeset
571 [-D symbol] [-Fmax-fuzz] [-o out-file] [-p[strip-count]]\n\
bce86c4163a3 Initial revision
kono
parents:
diff changeset
572 [-r rej-name] [-V {numbered,existing,simple}]\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
573 my_exit(1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
574 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
575 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
576 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
577 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
578
bce86c4163a3 Initial revision
kono
parents:
diff changeset
579 /* Attempt to find the right place to apply this hunk of patch. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
580
bce86c4163a3 Initial revision
kono
parents:
diff changeset
581 LINENUM
bce86c4163a3 Initial revision
kono
parents:
diff changeset
582 locate_hunk(fuzz)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
583 LINENUM fuzz;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
584 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
585 Reg1 LINENUM first_guess = pch_first() + last_offset;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
586 Reg2 LINENUM offset;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
587 LINENUM pat_lines = pch_ptrn_lines();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
588 Reg3 LINENUM max_pos_offset = input_lines - first_guess
bce86c4163a3 Initial revision
kono
parents:
diff changeset
589 - pat_lines + 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
590 Reg4 LINENUM max_neg_offset = first_guess - last_frozen_line - 1
bce86c4163a3 Initial revision
kono
parents:
diff changeset
591 + pch_context();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
592
bce86c4163a3 Initial revision
kono
parents:
diff changeset
593 if (!pat_lines) /* null range matches always */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
594 return first_guess;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
595 if (max_neg_offset >= first_guess) /* do not try lines < 0 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
596 max_neg_offset = first_guess - 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
597 if (first_guess <= input_lines && patch_match(first_guess, Nulline, fuzz))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
598 return first_guess;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
599 for (offset = 1; ; offset++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
600 Reg5 bool check_after = (offset <= max_pos_offset);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
601 Reg6 bool check_before = (offset <= max_neg_offset);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
602
bce86c4163a3 Initial revision
kono
parents:
diff changeset
603 if (check_after && patch_match(first_guess, offset, fuzz)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
604 #ifdef DEBUGGING
bce86c4163a3 Initial revision
kono
parents:
diff changeset
605 if (debug & 1)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
606 say3("Offset changing from %ld to %ld\n", last_offset, offset);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
607 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
608 last_offset = offset;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
609 return first_guess+offset;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
610 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
611 else if (check_before && patch_match(first_guess, -offset, fuzz)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
612 #ifdef DEBUGGING
bce86c4163a3 Initial revision
kono
parents:
diff changeset
613 if (debug & 1)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
614 say3("Offset changing from %ld to %ld\n", last_offset, -offset);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
615 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
616 last_offset = -offset;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
617 return first_guess-offset;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
618 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
619 else if (!check_before && !check_after)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
620 return Nulline;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
621 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
622 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
623
bce86c4163a3 Initial revision
kono
parents:
diff changeset
624 /* We did not find the pattern, dump out the hunk so they can handle it. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
625
bce86c4163a3 Initial revision
kono
parents:
diff changeset
626 void
bce86c4163a3 Initial revision
kono
parents:
diff changeset
627 abort_hunk()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
628 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
629 Reg1 LINENUM i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
630 Reg2 LINENUM pat_end = pch_end();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
631 /* add in last_offset to guess the same as the previous successful hunk */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
632 LINENUM oldfirst = pch_first() + last_offset;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
633 LINENUM newfirst = pch_newfirst() + last_offset;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
634 LINENUM oldlast = oldfirst + pch_ptrn_lines() - 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
635 LINENUM newlast = newfirst + pch_repl_lines() - 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
636 char *stars = (diff_type >= NEW_CONTEXT_DIFF ? " ****" : "");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
637 char *minuses = (diff_type >= NEW_CONTEXT_DIFF ? " ----" : " -----");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
638
bce86c4163a3 Initial revision
kono
parents:
diff changeset
639 fprintf(rejfp, "***************\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
640 for (i=0; i<=pat_end; i++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
641 switch (pch_char(i)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
642 case '*':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
643 if (oldlast < oldfirst)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
644 fprintf(rejfp, "*** 0%s\n", stars);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
645 else if (oldlast == oldfirst)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
646 fprintf(rejfp, "*** %ld%s\n", oldfirst, stars);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
647 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
648 fprintf(rejfp, "*** %ld,%ld%s\n", oldfirst, oldlast, stars);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
649 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
650 case '=':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
651 if (newlast < newfirst)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
652 fprintf(rejfp, "--- 0%s\n", minuses);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
653 else if (newlast == newfirst)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
654 fprintf(rejfp, "--- %ld%s\n", newfirst, minuses);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
655 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
656 fprintf(rejfp, "--- %ld,%ld%s\n", newfirst, newlast, minuses);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
657 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
658 case '\n':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
659 fprintf(rejfp, "%s", pfetch(i));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
660 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
661 case ' ': case '-': case '+': case '!':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
662 fprintf(rejfp, "%c %s", pch_char(i), pfetch(i));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
663 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
664 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
665 fatal1("fatal internal error in abort_hunk\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
666 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
667 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
668 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
669
bce86c4163a3 Initial revision
kono
parents:
diff changeset
670 /* We found where to apply it (we hope), so do it. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
671
bce86c4163a3 Initial revision
kono
parents:
diff changeset
672 void
bce86c4163a3 Initial revision
kono
parents:
diff changeset
673 apply_hunk(where)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
674 LINENUM where;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
675 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
676 Reg1 LINENUM old = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
677 Reg2 LINENUM lastline = pch_ptrn_lines();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
678 Reg3 LINENUM new = lastline+1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
679 #define OUTSIDE 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
680 #define IN_IFNDEF 1
bce86c4163a3 Initial revision
kono
parents:
diff changeset
681 #define IN_IFDEF 2
bce86c4163a3 Initial revision
kono
parents:
diff changeset
682 #define IN_ELSE 3
bce86c4163a3 Initial revision
kono
parents:
diff changeset
683 Reg4 int def_state = OUTSIDE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
684 Reg5 bool R_do_defines = do_defines;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
685 Reg6 LINENUM pat_end = pch_end();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
686
bce86c4163a3 Initial revision
kono
parents:
diff changeset
687 where--;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
688 while (pch_char(new) == '=' || pch_char(new) == '\n')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
689 new++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
690
bce86c4163a3 Initial revision
kono
parents:
diff changeset
691 while (old <= lastline) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
692 if (pch_char(old) == '-') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
693 copy_till(where + old - 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
694 if (R_do_defines) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
695 if (def_state == OUTSIDE) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
696 fputs(not_defined, ofp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
697 def_state = IN_IFNDEF;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
698 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
699 else if (def_state == IN_IFDEF) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
700 fputs(else_defined, ofp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
701 def_state = IN_ELSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
702 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
703 fputs(pfetch(old), ofp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
704 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
705 last_frozen_line++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
706 old++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
707 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
708 else if (new > pat_end) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
709 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
710 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
711 else if (pch_char(new) == '+') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
712 copy_till(where + old - 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
713 if (R_do_defines) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
714 if (def_state == IN_IFNDEF) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
715 fputs(else_defined, ofp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
716 def_state = IN_ELSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
717 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
718 else if (def_state == OUTSIDE) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
719 fputs(if_defined, ofp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
720 def_state = IN_IFDEF;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
721 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
722 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
723 fputs(pfetch(new), ofp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
724 new++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
725 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
726 else if (pch_char(new) != pch_char(old)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
727 say3("Out-of-sync patch, lines %ld,%ld--mangled text or line numbers, maybe?\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
728 pch_hunk_beg() + old,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
729 pch_hunk_beg() + new);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
730 #ifdef DEBUGGING
bce86c4163a3 Initial revision
kono
parents:
diff changeset
731 say3("oldchar = '%c', newchar = '%c'\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
732 pch_char(old), pch_char(new));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
733 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
734 my_exit(1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
735 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
736 else if (pch_char(new) == '!') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
737 copy_till(where + old - 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
738 if (R_do_defines) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
739 fputs(not_defined, ofp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
740 def_state = IN_IFNDEF;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
741 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
742 while (pch_char(old) == '!') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
743 if (R_do_defines) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
744 fputs(pfetch(old), ofp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
745 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
746 last_frozen_line++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
747 old++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
748 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
749 if (R_do_defines) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
750 fputs(else_defined, ofp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
751 def_state = IN_ELSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
752 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
753 while (pch_char(new) == '!') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
754 fputs(pfetch(new), ofp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
755 new++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
756 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
757 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
758 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
759 assert(pch_char(new) == ' ');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
760 old++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
761 new++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
762 if (R_do_defines && def_state != OUTSIDE) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
763 fputs(end_defined, ofp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
764 def_state = OUTSIDE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
765 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
766 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
767 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
768 if (new <= pat_end && pch_char(new) == '+') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
769 copy_till(where + old - 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
770 if (R_do_defines) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
771 if (def_state == OUTSIDE) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
772 fputs(if_defined, ofp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
773 def_state = IN_IFDEF;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
774 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
775 else if (def_state == IN_IFNDEF) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
776 fputs(else_defined, ofp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
777 def_state = IN_ELSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
778 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
779 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
780 while (new <= pat_end && pch_char(new) == '+') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
781 fputs(pfetch(new), ofp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
782 new++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
783 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
784 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
785 if (R_do_defines && def_state != OUTSIDE) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
786 fputs(end_defined, ofp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
787 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
788 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
789
bce86c4163a3 Initial revision
kono
parents:
diff changeset
790 /* Open the new file. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
791
bce86c4163a3 Initial revision
kono
parents:
diff changeset
792 void
bce86c4163a3 Initial revision
kono
parents:
diff changeset
793 init_output(name)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
794 char *name;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
795 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
796 ofp = fopen(name, "w");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
797 if (ofp == Nullfp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
798 pfatal2("can't create %s", name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
799 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
800
bce86c4163a3 Initial revision
kono
parents:
diff changeset
801 /* Open a file to put hunks we can't locate. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
802
bce86c4163a3 Initial revision
kono
parents:
diff changeset
803 void
bce86c4163a3 Initial revision
kono
parents:
diff changeset
804 init_reject(name)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
805 char *name;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
806 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
807 rejfp = fopen(name, "w");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
808 if (rejfp == Nullfp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
809 pfatal2("can't create %s", name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
810 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
811
bce86c4163a3 Initial revision
kono
parents:
diff changeset
812 /* Copy input file to output, up to wherever hunk is to be applied. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
813
bce86c4163a3 Initial revision
kono
parents:
diff changeset
814 void
bce86c4163a3 Initial revision
kono
parents:
diff changeset
815 copy_till(lastline)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
816 Reg1 LINENUM lastline;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
817 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
818 Reg2 LINENUM R_last_frozen_line = last_frozen_line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
819
bce86c4163a3 Initial revision
kono
parents:
diff changeset
820 if (R_last_frozen_line > lastline)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
821 fatal1("misordered hunks! output would be garbled\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
822 while (R_last_frozen_line < lastline) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
823 dump_line(++R_last_frozen_line);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
824 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
825 last_frozen_line = R_last_frozen_line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
826 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
827
bce86c4163a3 Initial revision
kono
parents:
diff changeset
828 /* Finish copying the input file to the output file. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
829
bce86c4163a3 Initial revision
kono
parents:
diff changeset
830 void
bce86c4163a3 Initial revision
kono
parents:
diff changeset
831 spew_output()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
832 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
833 #ifdef DEBUGGING
bce86c4163a3 Initial revision
kono
parents:
diff changeset
834 if (debug & 256)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
835 say3("il=%ld lfl=%ld\n",input_lines,last_frozen_line);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
836 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
837 if (input_lines)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
838 copy_till(input_lines); /* dump remainder of file */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
839 Fclose(ofp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
840 ofp = Nullfp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
841 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
842
bce86c4163a3 Initial revision
kono
parents:
diff changeset
843 /* Copy one line from input to output. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
844
bce86c4163a3 Initial revision
kono
parents:
diff changeset
845 void
bce86c4163a3 Initial revision
kono
parents:
diff changeset
846 dump_line(line)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
847 LINENUM line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
848 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
849 Reg1 char *s;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
850 Reg2 char R_newline = '\n';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
851
bce86c4163a3 Initial revision
kono
parents:
diff changeset
852 /* Note: string is not null terminated. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
853 for (s=ifetch(line, 0); putc(*s, ofp) != R_newline; s++) ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
854 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
855
bce86c4163a3 Initial revision
kono
parents:
diff changeset
856 /* Does the patch pattern match at line base+offset? */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
857
bce86c4163a3 Initial revision
kono
parents:
diff changeset
858 bool
bce86c4163a3 Initial revision
kono
parents:
diff changeset
859 patch_match(base, offset, fuzz)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
860 LINENUM base;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
861 LINENUM offset;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
862 LINENUM fuzz;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
863 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
864 Reg1 LINENUM pline = 1 + fuzz;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
865 Reg2 LINENUM iline;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
866 Reg3 LINENUM pat_lines = pch_ptrn_lines() - fuzz;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
867
bce86c4163a3 Initial revision
kono
parents:
diff changeset
868 for (iline=base+offset+fuzz; pline <= pat_lines; pline++,iline++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
869 if (canonicalize) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
870 if (!similar(ifetch(iline, (offset >= 0)),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
871 pfetch(pline),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
872 pch_line_len(pline) ))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
873 return FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
874 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
875 else if (strnNE(ifetch(iline, (offset >= 0)),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
876 pfetch(pline),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
877 pch_line_len(pline) ))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
878 return FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
879 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
880 return TRUE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
881 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
882
bce86c4163a3 Initial revision
kono
parents:
diff changeset
883 /* Do two lines match with canonicalized white space? */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
884
bce86c4163a3 Initial revision
kono
parents:
diff changeset
885 bool
bce86c4163a3 Initial revision
kono
parents:
diff changeset
886 similar(a,b,len)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
887 Reg1 char *a;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
888 Reg2 char *b;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
889 Reg3 int len;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
890 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
891 while (len) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
892 if (isspace(*b)) { /* whitespace (or \n) to match? */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
893 if (!isspace(*a)) /* no corresponding whitespace? */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
894 return FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
895 while (len && isspace(*b) && *b != '\n')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
896 b++,len--; /* skip pattern whitespace */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
897 while (isspace(*a) && *a != '\n')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
898 a++; /* skip target whitespace */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
899 if (*a == '\n' || *b == '\n')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
900 return (*a == *b); /* should end in sync */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
901 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
902 else if (*a++ != *b++) /* match non-whitespace chars */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
903 return FALSE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
904 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
905 len--; /* probably not necessary */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
906 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
907 return TRUE; /* actually, this is not reached */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
908 /* since there is always a \n */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
909 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
910
bce86c4163a3 Initial revision
kono
parents:
diff changeset
911 /* Exit with cleanup. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
912
bce86c4163a3 Initial revision
kono
parents:
diff changeset
913 void
bce86c4163a3 Initial revision
kono
parents:
diff changeset
914 my_exit(status)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
915 int status;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
916 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
917 Unlink(TMPINNAME);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
918 if (!toutkeep) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
919 Unlink(TMPOUTNAME);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
920 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
921 if (!trejkeep) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
922 Unlink(TMPREJNAME);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
923 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
924 Unlink(TMPPATNAME);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
925 exit(status);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
926 }