[patch] patch -i support
Bernhard Fischer
rep.nop at aon.at
Sun Aug 28 19:57:57 UTC 2005
Hi,
The TODO did list to add -i support to patch.
$ size editors/patch.o*
text data bss dec hex filename
1748 0 0 1748 6d4 editors/patch.o
1743 0 0 1743 6cf editors/patch.o.oorig
thank you,
Bernhard
-------------- next part --------------
diff -X excl -rduNp busybox.oorig/editors/patch.c busybox/editors/patch.c
--- busybox.oorig/editors/patch.c 2005-04-01 22:05:56.000000000 +0200
+++ busybox/editors/patch.c 2005-08-28 21:34:13.000000000 +0200
@@ -107,14 +107,24 @@ extern int patch_main(int argc, char **a
{
unsigned int patch_level = -1;
char *patch_line;
- int ret = 0;
+ int ret;
+ FILE *patch_file = NULL;
- /* Handle 'p' option */
- if (argv[1] && (argv[1][0] == '-') && (argv[1][1] == 'p')) {
- patch_level = atoi(&argv[1][2]);
+ {
+ char *p, *i;
+ ret = bb_getopt_ulflags(argc, argv, "p:i:", &p, &i);
+ if (ret & 1)
+ patch_level = bb_xgetularg10_bnd(p, -1, USHRT_MAX);
+ if (ret & 2) {
+ patch_file = bb_xfopen(i, "r");
+ }
+ ret = 0;
}
- patch_line = bb_get_line_from_file(stdin);
+ if (!patch_file)
+ patch_file = stdin;
+
+ patch_line = bb_get_line_from_file(patch_file);
while (patch_line) {
FILE *src_stream;
FILE *dst_stream;
@@ -133,14 +143,14 @@ extern int patch_main(int argc, char **a
*/
while (patch_line && strncmp(patch_line, "--- ", 4) != 0) {
free(patch_line);
- patch_line = bb_get_line_from_file(stdin);
+ patch_line = bb_get_line_from_file(patch_file);
}
/* Extract the filename used before the patch was generated */
original_filename = extract_filename(patch_line, patch_level);
free(patch_line);
- patch_line = bb_get_line_from_file(stdin);
+ patch_line = bb_get_line_from_file(patch_file);
if (strncmp(patch_line, "+++ ", 4) != 0) {
ret = 2;
bb_error_msg("Invalid patch");
@@ -183,7 +193,7 @@ extern int patch_main(int argc, char **a
printf("patching file %s\n", new_filename);
/* Handle each hunk */
- patch_line = bb_get_line_from_file(stdin);
+ patch_line = bb_get_line_from_file(patch_file);
while (patch_line) {
unsigned int count;
unsigned int src_beg_line;
@@ -214,7 +224,7 @@ extern int patch_main(int argc, char **a
}
hunk_offset_start = src_cur_line;
- while ((patch_line = bb_get_line_from_file(stdin)) != NULL) {
+ while ((patch_line = bb_get_line_from_file(patch_file)) != NULL) {
if ((*patch_line == '-') || (*patch_line == ' ')) {
char *src_line = NULL;
if (src_stream) {
diff -X excl -rduNp busybox.oorig/include/usage.h busybox/include/usage.h
--- busybox.oorig/include/usage.h 2005-08-23 19:53:01.000000000 +0200
+++ busybox/include/usage.h 2005-08-28 21:49:25.000000000 +0200
@@ -2064,11 +2064,13 @@
"\t-u\tUnlocks (re-enables) the specified user account"
#define patch_trivial_usage \
- "[-p<num>]"
+ "[-p<num>] [-i<patch.diff>]"
#define patch_full_usage \
- "[-p<num>]"
+ "[-p<num>]\n" \
+ "[-i<diff>]"
#define patch_example_usage \
- "$ patch -p1 <example.diff"
+ "$ patch -p1 <example.diff\n" \
+ "$ patch -p0 -i example.diff"
#define pidof_trivial_usage \
"process-name [OPTION] [process-name ...]"
diff -X excl -rduNp busybox.oorig/TODO busybox/TODO
--- busybox.oorig/TODO 2005-07-03 12:58:36.000000000 +0200
+++ busybox/TODO 2005-08-28 21:49:38.000000000 +0200
@@ -37,8 +37,8 @@ diff
(we only need to support unified diffs though).
---
patch
- should have -i support, and simple fuzz factor support to apply patches
- at an offset shouldn't take up too much space.
+ should have simple fuzz factor support to apply patches at an offset which
+ shouldn't take up too much space.
---
man
It would be nice to have a man command. Not one that handles troff or
More information about the busybox
mailing list