Page MenuHomeFreeBSD

D431.id.diff
No OneTemporary

D431.id.diff

Index: usr.bin/sed/defs.h
===================================================================
--- usr.bin/sed/defs.h
+++ usr.bin/sed/defs.h
@@ -143,6 +143,7 @@
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;
Index: usr.bin/sed/main.c
===================================================================
--- usr.bin/sed/main.c
+++ usr.bin/sed/main.c
@@ -439,8 +439,14 @@
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 if (!lastline()) {
+ sp->append_newline = 1;
+ } else {
+ sp->append_newline = 0;
+ }
cspace(sp, p, len, spflag);
linenum++;
@@ -481,15 +487,49 @@
fl_nextp = &fp->next;
}
+static int
+next_files_have_lines()
+{
+ struct s_flist *file;
+ FILE *file_fd;
+ int ch;
+
+ file = files;
+ while ((file = file->next) != NULL) {
+ if ((file_fd = fopen(file->fname, "r")) == NULL)
+ continue;
+
+ if ((ch = getc(file_fd)) != EOF) {
+ /*
+ * This next file has content, therefore current
+ * file doesn't contains the last line.
+ */
+ ungetc(ch, file_fd);
+ fclose(file_fd);
+ return (1);
+ }
+
+ fclose(file_fd);
+ }
+
+ return (0);
+}
+
int
lastline(void)
{
int ch;
- if (files->next != NULL && (inplace == NULL || ispan))
- return (0);
- if ((ch = getc(infile)) == EOF)
- return (1);
+ if (feof(infile)) {
+ return !(
+ (inplace == NULL || ispan) &&
+ next_files_have_lines());
+ }
+ if ((ch = getc(infile)) == EOF) {
+ return !(
+ (inplace == NULL || ispan) &&
+ next_files_have_lines());
+ }
ungetc(ch, infile);
return (0);
}
Index: usr.bin/sed/process.c
===================================================================
--- usr.bin/sed/process.c
+++ usr.bin/sed/process.c
@@ -63,6 +63,7 @@
#define pd PS.deleted
#define ps PS.space
#define psl PS.len
+#define psanl PS.append_newline
#define hs HS.space
#define hsl HS.len
@@ -85,7 +86,10 @@
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 (psanl) fputc('\n', outfile); \
+} while (0)
void
process(void)
@@ -94,6 +98,7 @@
SPACE tspace;
size_t oldpsl = 0;
char *p;
+ int oldpsanl;
p = NULL;
@@ -190,11 +195,15 @@
break;
if ((p = memchr(ps, '\n', psl)) != NULL) {
oldpsl = psl;
+ oldpsanl = psanl;
psl = p - ps;
+ psanl = 1;
}
OUT();
- if (p != NULL)
+ if (p != NULL) {
psl = oldpsl;
+ psanl = oldpsanl;
+ }
break;
case 'q':
if (!nflag && !pd)
@@ -244,6 +253,7 @@
cspace(&HS, "", 0, REPLACE);
tspace = PS;
PS = HS;
+ psanl = tspace.append_newline;
HS = tspace;
break;
case 'y':
@@ -444,6 +454,7 @@
*/
tspace = PS;
PS = SS;
+ psanl = tspace.append_newline;
SS = tspace;
SS.space = SS.back;
@@ -513,6 +524,7 @@
/* Swap the translation space and the pattern space. */
tmp = PS;
PS = YS;
+ psanl = tmp.append_newline;
YS = tmp;
YS.space = YS.back;
}
Index: usr.bin/sed/tests/regress.y.out
===================================================================
--- usr.bin/sed/tests/regress.y.out
+++ usr.bin/sed/tests/regress.y.out
@@ -1 +1 @@
-fOO
+fOO
\ No newline at end of file

File Metadata

Mime Type
text/plain
Expires
Mon, Oct 28, 3:32 PM (15 h, 15 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
14369100
Default Alt Text
D431.id.diff (3 KB)

Event Timeline