+static enum mandoclevel
+passthrough(const char *file, int fd, int synopsis_only)
+{
+ const char synb[] = "S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS";
+ const char synr[] = "SYNOPSIS";
+
+ FILE *stream;
+ const char *syscall;
+ char *line;
+ size_t len, off;
+ ssize_t nw;
+ int print;
+
+ if ((stream = fdopen(fd, "r")) == NULL) {
+ close(fd);
+ syscall = "fdopen";
+ goto fail;
+ }
+
+ print = 0;
+ while ((line = fgetln(stream, &len)) != NULL) {
+ if (synopsis_only) {
+ if (print) {
+ if ( ! isspace((unsigned char)*line))
+ goto done;
+ while (len &&
+ isspace((unsigned char)*line)) {
+ line++;
+ len--;
+ }
+ } else {
+ if ((len == sizeof(synb) &&
+ ! strncmp(line, synb, len - 1)) ||
+ (len == sizeof(synr) &&
+ ! strncmp(line, synr, len - 1)))
+ 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 (ferror(stream)) {
+ fclose(stream);
+ syscall = "fgetln";
+ goto fail;
+ }
+
+done:
+ fclose(stream);
+ return(MANDOCLEVEL_OK);
+
+fail:
+ fprintf(stderr, "%s: %s: SYSERR: %s: %s",
+ progname, file, syscall, strerror(errno));
+ return(MANDOCLEVEL_SYSERR);
+}
+
+static int
+koptions(int *options, char *arg)
+{
+
+ if ( ! strcmp(arg, "utf-8")) {
+ *options |= MPARSE_UTF8;
+ *options &= ~MPARSE_LATIN1;
+ } else if ( ! strcmp(arg, "iso-8859-1")) {
+ *options |= MPARSE_LATIN1;
+ *options &= ~MPARSE_UTF8;
+ } else if ( ! strcmp(arg, "us-ascii")) {
+ *options &= ~(MPARSE_UTF8 | MPARSE_LATIN1);
+ } else {
+ fprintf(stderr, "%s: -K%s: Bad argument\n",
+ progname, arg);
+ return(0);
+ }
+ return(1);
+}
+