summaryrefslogtreecommitdiff
path: root/editors/sed.c
diff options
context:
space:
mode:
Diffstat (limited to 'editors/sed.c')
-rw-r--r--editors/sed.c27
1 files changed, 22 insertions, 5 deletions
diff --git a/editors/sed.c b/editors/sed.c
index 5b08c8e..e124267 100644
--- a/editors/sed.c
+++ b/editors/sed.c
@@ -382,7 +382,7 @@ static char *parse_cmd_str(sed_cmd_t * const sed_cmd, char *cmdstr)
{
/* if it was a single-letter command that takes no arguments (such as 'p'
* or 'd') all we need to do is increment the index past that command */
- if (strchr("npqd=", sed_cmd->cmd)) {
+ if (strchr("nNpPqd=", sed_cmd->cmd)) {
cmdstr++;
}
/* handle (s)ubstitution command */
@@ -680,6 +680,7 @@ static void process_file(FILE *file)
if (line == NULL) {
return;
}
+ chomp(line);
/* go through every line in the file */
do {
@@ -688,7 +689,7 @@ static void process_file(FILE *file)
/* Read one line in advance so we can act on the last line, the '$' address */
next_line = get_line_from_file(file);
- chomp(line);
+ chomp(next_line);
linenum++;
altered = 0;
@@ -722,10 +723,15 @@ static void process_file(FILE *file)
case '=':
printf("%d\n", linenum);
break;
- case 'p':
+ case 'P': { /* Write the current pattern space upto the first newline */
+ char *tmp = strchr(line, '\n');
+ if (tmp) {
+ *tmp = '\0';
+ }
+ }
+ case 'p': /* Write the current pattern space to output */
puts(line);
break;
-
case 'd':
altered++;
deleted = 1;
@@ -808,8 +814,19 @@ static void process_file(FILE *file)
free(line);
return;
case 'n': /* Read next line from input */
- i = ncmds;
+ free(line);
+ line = next_line;
+ next_line = get_line_from_file(file);
+ chomp(next_line);
+ linenum++;
break;
+ case 'N': /* Append the next line to the current line */
+ line = realloc(line, strlen(line) + strlen(next_line) + 2);
+ strcat(line, "\n");
+ strcat(line, next_line);
+ next_line = get_line_from_file(file);
+ chomp(next_line);
+ linenum++;
}
}