From 2a4bba3ce2e00e55e6690fa8ba2607679277eed4 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Sun, 24 Jan 2016 15:52:16 +0100 Subject: [PATCH] sed: make 's///w FILE' actually write to FILE. Closes 8251 function old new delta add_cmd 1167 1210 +43 Signed-off-by: Denys Vlasenko --- editors/sed.c | 11 +++++++---- testsuite/sed.tests | 6 ++++++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/editors/sed.c b/editors/sed.c index a8c35388b..4c7f75521 100644 --- a/editors/sed.c +++ b/editors/sed.c @@ -113,7 +113,7 @@ typedef struct sed_cmd_s { int end_line; /* 'sed 1,3p' 0 == one line only. -1 = last line ($). -2-N = +N */ int end_line_orig; - FILE *sw_file; /* File (sw) command writes to, -1 for none. */ + FILE *sw_file; /* File (sw) command writes to, NULL for none. */ char *string; /* Data string for (saicytb) commands. */ unsigned which_match; /* (s) Which match to replace (0 for all) */ @@ -179,7 +179,7 @@ static void sed_free_and_close_stuff(void) sed_cmd_t *sed_cmd_next = sed_cmd->next; if (sed_cmd->sw_file) - xprint_and_close_file(sed_cmd->sw_file); + fclose(sed_cmd->sw_file); if (sed_cmd->beg_match) { regfree(sed_cmd->beg_match); @@ -426,8 +426,11 @@ static int parse_subst_cmd(sed_cmd_t *sed_cmd, const char *substr) /* Write to file */ case 'w': { - char *temp; - idx += parse_file_cmd(/*sed_cmd,*/ substr+idx, &temp); + char *fname; + idx += parse_file_cmd(/*sed_cmd,*/ substr+idx+1, &fname); + sed_cmd->sw_file = xfopen_for_write(fname); + sed_cmd->sw_last_char = '\n'; + free(fname); break; } /* Ignore case (gnu exension) */ diff --git a/testsuite/sed.tests b/testsuite/sed.tests index 34479e55f..5d2356b64 100755 --- a/testsuite/sed.tests +++ b/testsuite/sed.tests @@ -365,6 +365,12 @@ testing "sed /regex/,+0 -i works" \ "1\n2\n3\n4\n5\n6\n7\n8\n" \ "1\n2\n4\n5\n6\n7\n8\n" \ +testing "sed 's///w FILE'" \ + "sed 's/qwe/ZZZ/wz'; cat z; rm z" \ + "123\nZZZ\nasd\n""ZZZ\n" \ + "" \ + "123\nqwe\nasd\n" + # testing "description" "commands" "result" "infile" "stdin" exit $FAILCOUNT