diff options
author | Glenn L McGrath | 2003-09-14 16:28:08 +0000 |
---|---|---|
committer | Glenn L McGrath | 2003-09-14 16:28:08 +0000 |
commit | 294d113adb6ff175ad1729e35888c36b0fc824d1 (patch) | |
tree | 46400d26534053f78b5b19e1a4f47871d01e9e2d | |
parent | 8417c8c38bdcab79989ceab50382eb6314505c93 (diff) | |
download | busybox-294d113adb6ff175ad1729e35888c36b0fc824d1.zip busybox-294d113adb6ff175ad1729e35888c36b0fc824d1.tar.gz |
Memory cleanups and fix for `echo "foo" | sed 's/foo/bar/;H;q'`
-rw-r--r-- | editors/sed.c | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/editors/sed.c b/editors/sed.c index f0a3c02..43395b3 100644 --- a/editors/sed.c +++ b/editors/sed.c @@ -865,6 +865,7 @@ static void process_file(FILE * file) case 'd': altered++; deleted = 1; + force_print = 0; break; case 's': @@ -1031,16 +1032,29 @@ static void process_file(FILE * file) break; case 'g': /* Replace pattern space with hold space */ free(pattern_space); - pattern_space = strdup(hold_space); + if (hold_space) { + pattern_space = strdup(hold_space); + } break; case 'G': { /* Append newline and hold space to pattern space */ - int pattern_space_size = 0; + int pattern_space_size = 2; + int hold_space_size = 0; + if (pattern_space) { - pattern_space_size = strlen(pattern_space); + pattern_space_size += strlen(pattern_space); + } + if (hold_space) { + hold_space_size = strlen(hold_space); + } + pattern_space = xrealloc(pattern_space, pattern_space_size + hold_space_size); + if (pattern_space_size == 2) { + strcat(pattern_space, "\n"); + } else { + strcpy(pattern_space, "\n"); + } + if (hold_space) { + strcat(pattern_space, hold_space); } - pattern_space = xrealloc(pattern_space, pattern_space_size + strlen(hold_space) + 2); - strcat(pattern_space, "\n"); - strcat(pattern_space, hold_space); break; } case 'h': /* Replace hold space with pattern space */ |