diff options
Diffstat (limited to 'editors/sed.c')
-rw-r--r-- | editors/sed.c | 27 |
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++; } } |