- c = md_run(out, in);
-
- free(in->buf);
- free(out->buf);
-
- return(c);
-}
-
-
-static ssize_t
-md_buf_fill(struct md_rbuf *in)
-{
- ssize_t ssz;
-
- assert(in);
- assert(in->buf);
- assert(in->bufsz > 0);
- assert(in->name);
-
- if (-1 == (ssz = read(in->fd, in->buf, in->bufsz)))
- warn("%s", in->name);
-
- return(ssz);
-}
-
-
-static int
-md_run(struct md_mbuf *out, struct md_rbuf *in)
-{
- ssize_t sz, i;
- char line[BUFFER_LINE];
- size_t pos;
-
- assert(in);
- assert(out);
-
- out->pos = 0;
- in->line = 1;
-
- /* LINTED */
- for (pos = 0; ; ) {
- if (-1 == (sz = md_buf_fill(in)))
- return(1);
- else if (0 == sz)
- break;
-
- for (i = 0; i < sz; i++) {
- if ('\n' == in->buf[i]) {
- if (md_line(out, in, line, pos))
- return(1);
- in->line++;
- pos = 0;
- continue;
- }
-
- if (pos < BUFFER_LINE) {
- /* LINTED */
- line[pos++] = in->buf[i];
- continue;
- }
-
- warnx("%s: line %zu too long",
- in->name, in->line);
- return(1);
- }
- }
-
- if (0 != pos && md_line(out, in, line, pos))
- return(1);
-
- return(md_buf_flush(out) ? 0 : 1);
-}
-
-
-static int
-md_buf_flush(struct md_mbuf *buf)
-{
- ssize_t sz;
-
- assert(buf);
- assert(buf->buf);
- assert(buf->name);
-
- if (0 == buf->pos)
- return(1);
-
- sz = write(buf->fd, buf->buf, buf->pos);
-
- if (-1 == sz) {
- warn("%s", buf->name);
- return(0);
- } else if ((size_t)sz != buf->pos) {
- warnx("%s: short write", buf->name);
- return(0);
- }
-
- buf->pos = 0;
- return(1);
-}
-
-
-static int
-md_buf_putchar(struct md_mbuf *buf, char c)
-{
- return(md_buf_puts(buf, &c, 1));
-}
-
-
-static int
-md_buf_puts(struct md_mbuf *buf, const char *p, size_t sz)
-{
- size_t ssz;
-
- assert(p);
- assert(buf);
- assert(buf->buf);
-
- while (buf->pos + sz > buf->bufsz) {
- ssz = buf->bufsz - buf->pos;
- (void)memcpy(buf->buf + buf->pos, p, ssz);
- p += ssz;
- sz -= ssz;
- buf->pos += ssz;
-
- if ( ! md_buf_flush(buf))
- return(0);
- }
-
- (void)memcpy(buf->buf + buf->pos, p, sz);
- buf->pos += sz;
- return(1);
-}
-
-
-static int
-md_line(struct md_mbuf *out, const struct md_rbuf *in,
- const char *buf, size_t sz)
-{
-
- /* FIXME: this is just a placeholder function. */
-
- assert(buf);
- assert(out);
- assert(in);
-
- if ( ! md_buf_puts(out, buf, sz))
- return(1);
- if ( ! md_buf_putchar(out, '\n'))
- return(1);
-
- return(0);