From 4157a8a71e2db9968690f430a5775f0790e88297 Mon Sep 17 00:00:00 2001
From: Glenn L McGrath <bug1@ihug.co.nz>
Date: Mon, 10 Mar 2003 04:12:35 +0000
Subject: fix n, add N, P

---
 editors/sed.c | 27 ++++++++++++++++++++++-----
 1 file changed, 22 insertions(+), 5 deletions(-)

(limited to 'editors')

diff --git a/editors/sed.c b/editors/sed.c
index 5b08c8ee1..e1242671e 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++;
 				}
 			}
 
-- 
cgit v1.2.3