=================================================================== RCS file: /cvs/mandoc/Attic/validate.c,v retrieving revision 1.1 retrieving revision 1.3 diff -u -p -r1.1 -r1.3 --- mandoc/Attic/validate.c 2008/11/29 14:14:21 1.1 +++ mandoc/Attic/validate.c 2008/11/30 12:41:45 1.3 @@ -1,4 +1,4 @@ -/* $Id: validate.c,v 1.1 2008/11/29 14:14:21 kristaps Exp $ */ +/* $Id: validate.c,v 1.3 2008/11/30 12:41:45 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -28,8 +28,10 @@ #include "libmdocml.h" #include "private.h" +#define INDENT 4 + #ifdef __linux__ /* FIXME */ -#define strlcat strncat +#define strlcat strncat #endif struct md_valid { @@ -52,7 +54,7 @@ static int rofftail(void *); static int roffin(void *, int, int *, char **); static int roffdata(void *, char *); static int roffout(void *, int); -static int roffblkin(void *, int); +static int roffblkin(void *, int, int *, char **); static int roffblkout(void *, int); static int roffspecial(void *, int); @@ -66,59 +68,44 @@ mbuf_indent(struct md_valid *p) { size_t i; - assert(0 == p->pos); + assert(p->pos == 0); - for (i = 0; i < MIN(p->indent, 4); i++) + for (i = 0; i < MIN(p->indent, INDENT); i++) if ( ! md_buf_putstring(p->mbuf, " ")) return(0); - p->pos = i * 4; + p->pos += i * INDENT; return(1); } static int -mbuf_atnewline(struct md_valid *p) -{ - - return(p->pos == MIN(4, p->indent)); -} - - -static int mbuf_newline(struct md_valid *p) { - if (mbuf_atnewline(p)) - return(1); if ( ! md_buf_putchar(p->mbuf, '\n')) return(0); p->pos = 0; - return(mbuf_indent(p)); + return(1); } static int mbuf_data(struct md_valid *p, char *buf) { + int space; size_t sz; char *bufp; + space = 1; /* FIXME */ + assert(p->mbuf); assert(0 != p->indent); if (MD_LITERAL & p->flags) return(md_buf_putstring(p->mbuf, buf)); - if (0 == p->pos) - mbuf_indent(p); - - /* - * Indent if we're at the beginning of a line. Don't indent - * more than 16 or so characters. - */ - while (*buf) { while (*buf && isspace(*buf)) buf++; @@ -136,30 +123,36 @@ mbuf_data(struct md_valid *p, char *buf) /* Process word. */ sz = strlen(bufp); - - if (sz + p->pos < 72) { + + if (0 == p->pos) { + if ( ! mbuf_indent(p)) + return(0); if ( ! md_buf_putstring(p->mbuf, bufp)) return(0); - /* FIXME: check punctuation. */ + if (p->indent * INDENT + sz >= 72) { + if ( ! mbuf_newline(p)) + return(0); + continue; + } - if ( ! md_buf_putchar(p->mbuf, ' ')) - return(0); - p->pos += sz + 1; + p->pos += sz; continue; } - if ( ! mbuf_newline(p)) - return(0); + if (sz + p->pos >= 72) { + if ( ! mbuf_newline(p)) + return(0); + if ( ! mbuf_indent(p)) + return(0); + } else if (space) + if ( ! md_buf_putchar(p->mbuf, ' ')) + return(0); if ( ! md_buf_putstring(p->mbuf, bufp)) return(0); - /* FIXME: check punctuation. */ - - if ( ! md_buf_putchar(p->mbuf, ' ')) - return(0); - p->pos += sz + 1; + p->pos += sz + (space ? 1 : 0); } return(1); @@ -229,7 +222,17 @@ md_init_valid(const struct md_args *args, static int roffhead(void *arg) { + struct md_valid *p; + assert(arg); + p = (struct md_valid *)arg; + + if ( ! md_buf_putstring(p->mbuf, "BEGIN")) + return(0); + p->indent++; + if ( ! mbuf_newline(p)) + return(0); + return(1); } @@ -242,10 +245,12 @@ rofftail(void *arg) assert(arg); p = (struct md_valid *)arg; - if (mbuf_atnewline(p)) - return(1); + if (0 != p->pos && ! mbuf_newline(p)) + return(0); - return(md_buf_putchar(p->mbuf, '\n')); + if ( ! md_buf_putstring(p->mbuf, "END\n")) + return(0); + return(1); } @@ -258,31 +263,32 @@ roffspecial(void *arg, int tok) static int -roffblkin(void *arg, int tok) +roffblkin(void *arg, int tok, int *argc, char **argv) { struct md_valid *p; assert(arg); p = (struct md_valid *)arg; - if ( ! mbuf_atnewline(p)) { - if ( ! md_buf_putchar(p->mbuf, '\n')) + if (0 != p->pos) { + if ( ! mbuf_newline(p)) return(0); - p->pos = 0; if ( ! mbuf_indent(p)) return(0); - } + } else if ( ! mbuf_indent(p)) + return(0); + if ( ! md_buf_putchar(p->mbuf, '<')) + return(0); if ( ! md_buf_putstring(p->mbuf, toknames[tok])) return(0); - - if ( ! md_buf_putchar(p->mbuf, '\n')) + if ( ! md_buf_putchar(p->mbuf, '>')) return(0); + if ( ! mbuf_newline(p)) + return(0); - p->pos = 0; p->indent++; - - return(mbuf_indent(p)); + return(1); } @@ -294,20 +300,49 @@ roffblkout(void *arg, int tok) assert(arg); p = (struct md_valid *)arg; - if ( ! md_buf_putchar(p->mbuf, '\n')) + p->indent--; + + if (0 != p->pos) { + if ( ! mbuf_newline(p)) + return(0); + if ( ! mbuf_indent(p)) + return(0); + } else if ( ! mbuf_indent(p)) return(0); - p->pos = 0; - p->indent--; + if ( ! md_buf_putstring(p->mbuf, "mbuf, toknames[tok])) + return(0); + if ( ! md_buf_putstring(p->mbuf, ">")) + return(0); + if ( ! mbuf_newline(p)) + return(0); - return(mbuf_indent(p)); + return(1); } static int roffin(void *arg, int tok, int *argcp, char **argvp) { + struct md_valid *p; + assert(arg); + p = (struct md_valid *)arg; + + if (0 == p->pos && ! mbuf_indent(p)) + return(0); + + if ( ! md_buf_putstring(p->mbuf, " <")) + return(0); + if ( ! md_buf_putstring(p->mbuf, toknames[tok])) + return(0); + if ( ! md_buf_putstring(p->mbuf, ">")) + return(0); + + p->pos += strlen(toknames[tok]) + 3; + return(1); } @@ -315,6 +350,22 @@ roffin(void *arg, int tok, int *argcp, char **argvp) static int roffout(void *arg, int tok) { + struct md_valid *p; + + assert(arg); + p = (struct md_valid *)arg; + + if (0 == p->pos && ! mbuf_indent(p)) + return(0); + + if ( ! md_buf_putstring(p->mbuf, "mbuf, toknames[tok])) + return(0); + if ( ! md_buf_putstring(p->mbuf, ">")) + return(0); + + p->pos += strlen(toknames[tok]) + 2; return(1); }