diff options
Diffstat (limited to 'editors/sed.c')
-rw-r--r-- | editors/sed.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/editors/sed.c b/editors/sed.c index 7af8f867a..6cf54afe9 100644 --- a/editors/sed.c +++ b/editors/sed.c | |||
@@ -61,6 +61,10 @@ | |||
61 | #include "libbb.h" | 61 | #include "libbb.h" |
62 | #include "xregex.h" | 62 | #include "xregex.h" |
63 | 63 | ||
64 | enum { | ||
65 | OPT_in_place = 1 << 0, | ||
66 | }; | ||
67 | |||
64 | /* Each sed command turns into one of these structures. */ | 68 | /* Each sed command turns into one of these structures. */ |
65 | typedef struct sed_cmd_s { | 69 | typedef struct sed_cmd_s { |
66 | /* Ordered by alignment requirements: currently 36 bytes on x86 */ | 70 | /* Ordered by alignment requirements: currently 36 bytes on x86 */ |
@@ -938,8 +942,11 @@ static void process_files(void) | |||
938 | 942 | ||
939 | if (matched) { | 943 | if (matched) { |
940 | /* once matched, "n,xxx" range is dead, disabling it */ | 944 | /* once matched, "n,xxx" range is dead, disabling it */ |
941 | if (sed_cmd->beg_line > 0) | 945 | if (sed_cmd->beg_line > 0 |
946 | && !(option_mask32 & OPT_in_place) /* but not for -i */ | ||
947 | ) { | ||
942 | sed_cmd->beg_line = -2; | 948 | sed_cmd->beg_line = -2; |
949 | } | ||
943 | sed_cmd->in_match = !( | 950 | sed_cmd->in_match = !( |
944 | /* has the ending line come, or is this a single address command? */ | 951 | /* has the ending line come, or is this a single address command? */ |
945 | (sed_cmd->end_line ? | 952 | (sed_cmd->end_line ? |
@@ -985,6 +992,8 @@ static void process_files(void) | |||
985 | } | 992 | } |
986 | 993 | ||
987 | /* actual sedding */ | 994 | /* actual sedding */ |
995 | //bb_error_msg("pattern_space:'%s' next_line:'%s' cmd:%c", | ||
996 | //pattern_space, next_line, sed_cmd->cmd); | ||
988 | switch (sed_cmd->cmd) { | 997 | switch (sed_cmd->cmd) { |
989 | 998 | ||
990 | /* Print line number */ | 999 | /* Print line number */ |
@@ -1111,10 +1120,16 @@ static void process_files(void) | |||
1111 | { | 1120 | { |
1112 | int len; | 1121 | int len; |
1113 | /* If no next line, jump to end of script and exit. */ | 1122 | /* If no next line, jump to end of script and exit. */ |
1123 | /* http://www.gnu.org/software/sed/manual/sed.html: | ||
1124 | * "Most versions of sed exit without printing anything | ||
1125 | * when the N command is issued on the last line of | ||
1126 | * a file. GNU sed prints pattern space before exiting | ||
1127 | * unless of course the -n command switch has been | ||
1128 | * specified. This choice is by design." | ||
1129 | */ | ||
1114 | if (next_line == NULL) { | 1130 | if (next_line == NULL) { |
1115 | free(next_line); | 1131 | //goto discard_line; |
1116 | next_line = NULL; | 1132 | goto discard_commands; /* GNU behavior */ |
1117 | goto discard_line; | ||
1118 | } | 1133 | } |
1119 | /* Append next_line, read new next_line. */ | 1134 | /* Append next_line, read new next_line. */ |
1120 | len = strlen(pattern_space); | 1135 | len = strlen(pattern_space); |
@@ -1270,9 +1285,6 @@ static void add_cmd_block(char *cmdstr) | |||
1270 | int sed_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 1285 | int sed_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
1271 | int sed_main(int argc UNUSED_PARAM, char **argv) | 1286 | int sed_main(int argc UNUSED_PARAM, char **argv) |
1272 | { | 1287 | { |
1273 | enum { | ||
1274 | OPT_in_place = 1 << 0, | ||
1275 | }; | ||
1276 | unsigned opt; | 1288 | unsigned opt; |
1277 | llist_t *opt_e, *opt_f; | 1289 | llist_t *opt_e, *opt_f; |
1278 | int status = EXIT_SUCCESS; | 1290 | int status = EXIT_SUCCESS; |
@@ -1292,6 +1304,7 @@ int sed_main(int argc UNUSED_PARAM, char **argv) | |||
1292 | opt_e = opt_f = NULL; | 1304 | opt_e = opt_f = NULL; |
1293 | opt_complementary = "e::f::" /* can occur multiple times */ | 1305 | opt_complementary = "e::f::" /* can occur multiple times */ |
1294 | "nn"; /* count -n */ | 1306 | "nn"; /* count -n */ |
1307 | /* -i must be first, to match OPT_in_place definition */ | ||
1295 | opt = getopt32(argv, "irne:f:", &opt_e, &opt_f, | 1308 | opt = getopt32(argv, "irne:f:", &opt_e, &opt_f, |
1296 | &G.be_quiet); /* counter for -n */ | 1309 | &G.be_quiet); /* counter for -n */ |
1297 | //argc -= optind; | 1310 | //argc -= optind; |