summaryrefslogtreecommitdiffstats
path: root/main.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2015-11-07 17:58:55 +0000
committerIngo Schwarze <schwarze@openbsd.org>2015-11-07 17:58:55 +0000
commitf024d444d299de331f8a9c932e479fedfbba6c5e (patch)
tree475615c6cfec51ea70542f32984d50357bc9459c /main.c
parent0441e71e8746df106efe8cf9b9ecb18f0d0824a4 (diff)
downloadmandoc-f024d444d299de331f8a9c932e479fedfbba6c5e.tar.gz
Modernization, no functional change intended:
Use the POSIX function getline(3) rather than the slightly dangerous BSD function fgetln(3). Remove the related compatibility code.
Diffstat (limited to 'main.c')
-rw-r--r--main.c42
1 files changed, 19 insertions, 23 deletions
diff --git a/main.c b/main.c
index d4303f61..f3c691d1 100644
--- a/main.c
+++ b/main.c
@@ -774,12 +774,12 @@ passthrough(const char *file, int fd, int synopsis_only)
FILE *stream;
const char *syscall;
- char *line;
- size_t len, off;
- ssize_t nw;
+ char *line, *cp;
+ size_t linesz;
int print;
- fflush(stdout);
+ line = NULL;
+ linesz = 0;
if ((stream = fdopen(fd, "r")) == NULL) {
close(fd);
@@ -788,45 +788,41 @@ passthrough(const char *file, int fd, int synopsis_only)
}
print = 0;
- while ((line = fgetln(stream, &len)) != NULL) {
+ while (getline(&line, &linesz, stream) != -1) {
+ cp = line;
if (synopsis_only) {
if (print) {
- if ( ! isspace((unsigned char)*line))
+ if ( ! isspace((unsigned char)*cp))
goto done;
- while (len &&
- isspace((unsigned char)*line)) {
- line++;
- len--;
- }
+ while (isspace((unsigned char)*cp))
+ cp++;
} else {
- if ((len == sizeof(synb) &&
- ! strncmp(line, synb, len - 1)) ||
- (len == sizeof(synr) &&
- ! strncmp(line, synr, len - 1)))
+ if (strcmp(cp, synb) == 0 ||
+ strcmp(cp, synr) == 0)
print = 1;
continue;
}
}
- for (off = 0; off < len; off += nw)
- if ((nw = write(STDOUT_FILENO, line + off,
- len - off)) == -1 || nw == 0) {
- fclose(stream);
- syscall = "write";
- goto fail;
- }
+ if (fputs(cp, stdout)) {
+ fclose(stream);
+ syscall = "fputs";
+ goto fail;
+ }
}
if (ferror(stream)) {
fclose(stream);
- syscall = "fgetln";
+ syscall = "getline";
goto fail;
}
done:
+ free(line);
fclose(stream);
return;
fail:
+ free(line);
warn("%s: SYSERR: %s", file, syscall);
if (rc < MANDOCLEVEL_SYSERR)
rc = MANDOCLEVEL_SYSERR;