[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