diff options
author | Dag-Erling Smørgrav <des@FreeBSD.org> | 2024-02-12 18:26:13 +0000 |
---|---|---|
committer | Dag-Erling Smørgrav <des@FreeBSD.org> | 2024-02-12 18:26:13 +0000 |
commit | 851a9da38f070675c42a6d69c41c47a5d29ee3d0 (patch) | |
tree | 80a89e03225fbf2b419f1b88b2dcea18b8680d57 | |
parent | 114ab149e23e11760a2a41a773a786b97980616a (diff) | |
download | src-851a9da38f070675c42a6d69c41c47a5d29ee3d0.tar.gz src-851a9da38f070675c42a6d69c41c47a5d29ee3d0.zip |
patch: Support long context lines.
MFC after: 1 week
Sponsored by: Klara, Inc.
Reviewed by: allanjude
Differential Revision: https://reviews.freebsd.org/D43850
-rw-r--r-- | usr.bin/patch/patch.c | 2 | ||||
-rw-r--r-- | usr.bin/patch/pch.c | 10 | ||||
-rw-r--r-- | usr.bin/patch/pch.h | 2 | ||||
-rwxr-xr-x | usr.bin/patch/tests/unified_patch_test.sh | 19 |
4 files changed, 26 insertions, 7 deletions
diff --git a/usr.bin/patch/patch.c b/usr.bin/patch/patch.c index 403189bc92b1..838c721841ea 100644 --- a/usr.bin/patch/patch.c +++ b/usr.bin/patch/patch.c @@ -1085,7 +1085,7 @@ patch_match(LINENUM base, LINENUM offset, LINENUM fuzz) LINENUM pat_lines = pch_ptrn_lines() - fuzz; const char *ilineptr; const char *plineptr; - unsigned short plinelen; + size_t plinelen; /* Patch does not match if we don't have any more context to use */ if (pline > pat_lines) diff --git a/usr.bin/patch/pch.c b/usr.bin/patch/pch.c index d528f06235bf..fb53ff86f9ef 100644 --- a/usr.bin/patch/pch.c +++ b/usr.bin/patch/pch.c @@ -55,7 +55,7 @@ static LINENUM p_max; /* max allowed value of p_end */ static LINENUM p_context = 3; /* # of context lines */ static LINENUM p_input_line = 0; /* current line # from patch file */ static char **p_line = NULL;/* the text of the hunk */ -static unsigned short *p_len = NULL; /* length of each line */ +static size_t *p_len = NULL; /* length of each line */ static char *p_char = NULL; /* +, -, and ! */ static int hunkmax = INITHUNKMAX; /* size of above arrays to begin with */ static int p_indent; /* indent to patch */ @@ -137,7 +137,7 @@ set_hunkmax(void) if (p_line == NULL) p_line = malloc(hunkmax * sizeof(char *)); if (p_len == NULL) - p_len = malloc(hunkmax * sizeof(unsigned short)); + p_len = malloc(hunkmax * sizeof(size_t)); if (p_char == NULL) p_char = malloc(hunkmax * sizeof(char)); } @@ -154,7 +154,7 @@ grow_hunkmax(void) fatal("Internal memory allocation error\n"); p_line = reallocf(p_line, new_hunkmax * sizeof(char *)); - p_len = reallocf(p_len, new_hunkmax * sizeof(unsigned short)); + p_len = reallocf(p_len, new_hunkmax * sizeof(size_t)); p_char = reallocf(p_char, new_hunkmax * sizeof(char)); if (p_line != NULL && p_len != NULL && p_char != NULL) { @@ -1251,7 +1251,7 @@ bool pch_swap(void) { char **tp_line; /* the text of the hunk */ - unsigned short *tp_len;/* length of each line */ + size_t *tp_len; /* length of each line */ char *tp_char; /* +, -, and ! */ LINENUM i; LINENUM n; @@ -1408,7 +1408,7 @@ pch_context(void) /* * Return the length of a particular patch line. */ -unsigned short +size_t pch_line_len(LINENUM line) { return p_len[line]; diff --git a/usr.bin/patch/pch.h b/usr.bin/patch/pch.h index 5ce4f72497c7..b6c6363155a5 100644 --- a/usr.bin/patch/pch.h +++ b/usr.bin/patch/pch.h @@ -45,7 +45,7 @@ bool there_is_another_patch(void); bool another_hunk(void); bool pch_swap(void); char *pfetch(LINENUM); -unsigned short pch_line_len(LINENUM); +size_t pch_line_len(LINENUM); LINENUM pch_first(void); LINENUM pch_ptrn_lines(void); LINENUM pch_newfirst(void); diff --git a/usr.bin/patch/tests/unified_patch_test.sh b/usr.bin/patch/tests/unified_patch_test.sh index 43b0d8373cfa..7d4b74182c41 100755 --- a/usr.bin/patch/tests/unified_patch_test.sh +++ b/usr.bin/patch/tests/unified_patch_test.sh @@ -141,6 +141,24 @@ file_removal_body() atf_check -o inline:"y\n" cat foo } +atf_test_case plinelen +plinelen_body() +{ + hello="$(jot -b hello -s, 20000 | tee foo.txt)" + cp foo.txt bar.txt + echo "world" >>bar.txt + cat >foo.diff <<EOF +--- foo.txt.orig ++++ foo.txt +@@ -1,1 +1,2 @@ + $hello ++world +EOF + atf_check -o match:"Hunk #1 succeeded" \ + patch <foo.diff + atf_check -o file:bar.txt cat foo.txt +} + atf_init_test_cases() { atf_add_test_case basic @@ -148,4 +166,5 @@ atf_init_test_cases() atf_add_test_case file_creation atf_add_test_case file_nodupe atf_add_test_case file_removal + atf_add_test_case plinelen } |