x1000-installer: xf_stream_read_lines bugfixes

- Only treat EOF as newline if the line is non-empty to
  suppress a useless empty line after the end of a file.
- Deal with 0- and 1-byte line buffers safely.
- Remove whitespace stripping and comment handling which
  was left over from refactoring. Move it to xf_map_parse()
  where it belongs.

Change-Id: I9f05f4e18ca6dd011ca4cd231f0b5ea37c784778
This commit is contained in:
Aidan MacDonald 2021-11-28 13:23:38 +00:00
parent 420d545018
commit 4879891da3
2 changed files with 12 additions and 11 deletions

View file

@ -193,6 +193,10 @@ int map_parse_line_cb(int n, char* buf, void* arg)
struct map_parse_args* args = arg; struct map_parse_args* args = arg;
/* skip whitespace */
while(*buf && isspace(*buf))
++buf;
/* ignore comments and blank lines */ /* ignore comments and blank lines */
if(*buf == '#' || *buf == '\0') if(*buf == '#' || *buf == '\0')
return 0; return 0;

View file

@ -159,6 +159,9 @@ int xf_stream_read_lines(struct xf_stream* s, char* buf, size_t bufsz,
size_t pos = 0; size_t pos = 0;
bool at_eof = false; bool at_eof = false;
if(bufsz <= 1)
return XF_E_LINE_TOO_LONG;
while(!at_eof) { while(!at_eof) {
bytes_read = xf_stream_read(s, &buf[pos], bufsz - pos - 1); bytes_read = xf_stream_read(s, &buf[pos], bufsz - pos - 1);
if(bytes_read < 0) if(bytes_read < 0)
@ -183,20 +186,14 @@ int xf_stream_read_lines(struct xf_stream* s, char* buf, size_t bufsz,
else else
break; /* read ahead to look for newline */ break; /* read ahead to look for newline */
} else { } else {
endp = &buf[pos]; /* treat EOF as a newline */ if(startp == &buf[pos])
break; /* nothing left to do */
else
endp = &buf[pos]; /* last line missing a newline -
* treat EOF as newline */
} }
} }
/* skip whitespace */
while(*startp && isspace(*startp))
++startp;
/* ignore blank lines and comment lines */
if(*startp == '#' || *startp == '\0') {
startp = endp + 1;
continue;
}
rc = callback(n++, startp, arg); rc = callback(n++, startp, arg);
if(rc != 0) if(rc != 0)
return rc; return rc;