diff --git a/usr.bin/sed/defs.h b/usr.bin/sed/defs.h index d4f434e..fb33676 100644 --- a/usr.bin/sed/defs.h +++ b/usr.bin/sed/defs.h @@ -143,6 +143,7 @@ typedef struct { char *space; /* Current space pointer. */ size_t len; /* Current length. */ int deleted; /* If deleted. */ + int append_newline; /* If originally terminated by \n. */ char *back; /* Backing memory. */ size_t blen; /* Backing memory length. */ } SPACE; diff --git a/usr.bin/sed/main.c b/usr.bin/sed/main.c index 2062c68..62cee8f 100644 --- a/usr.bin/sed/main.c +++ b/usr.bin/sed/main.c @@ -434,8 +434,12 @@ mf_fgets(SPACE *sp, enum e_spflag spflag) len = getline(&p, &plen, infile); if (len == -1) err(1, "%s", fname); - if (len != 0 && p[len - 1] == '\n') + if (len != 0 && p[len - 1] == '\n') { + sp->append_newline = 1; len--; + } else { + sp->append_newline = 0; + } cspace(sp, p, len, spflag); linenum++; diff --git a/usr.bin/sed/process.c b/usr.bin/sed/process.c index 5e2618a..3936e9b 100644 --- a/usr.bin/sed/process.c +++ b/usr.bin/sed/process.c @@ -63,6 +63,7 @@ static SPACE HS, PS, SS, YS; #define pd PS.deleted #define ps PS.space #define psl PS.len +#define panl PS.append_newline #define hs HS.space #define hsl HS.len @@ -85,7 +86,10 @@ static regex_t *defpreg; size_t maxnsub; regmatch_t *match; -#define OUT() do {fwrite(ps, 1, psl, outfile); fputc('\n', outfile);} while (0) +#define OUT() do { \ + fwrite(ps, 1, psl, outfile); \ + if (panl) fputc('\n', outfile); \ +} while (0) void process(void) @@ -94,6 +98,7 @@ process(void) SPACE tspace; size_t oldpsl = 0; char *p; + int oldpanl; p = NULL; @@ -190,11 +195,15 @@ redirect: break; if ((p = memchr(ps, '\n', psl)) != NULL) { oldpsl = psl; + oldpanl = panl; psl = p - ps; + panl = 0; } OUT(); - if (p != NULL) + if (p != NULL) { psl = oldpsl; + panl = oldpanl; + } break; case 'q': if (!nflag && !pd) @@ -244,6 +253,7 @@ redirect: cspace(&HS, "", 0, REPLACE); tspace = PS; PS = HS; + panl = tspace.append_newline; HS = tspace; break; case 'y': @@ -444,6 +454,7 @@ substitute(struct s_command *cp) */ tspace = PS; PS = SS; + panl = tspace.append_newline; SS = tspace; SS.space = SS.back; @@ -513,6 +524,7 @@ do_tr(struct s_tr *y) /* Swap the translation space and the pattern space. */ tmp = PS; PS = YS; + panl = tmp.append_newline; YS = tmp; YS.space = YS.back; } diff --git a/usr.bin/sed/tests/regress.y.out b/usr.bin/sed/tests/regress.y.out index 829a681..22f4f05 100644 --- a/usr.bin/sed/tests/regress.y.out +++ b/usr.bin/sed/tests/regress.y.out @@ -1 +1 @@ -fOO +fOO \ No newline at end of file