=================================================================== RCS file: /cvs/mandoc/mdoc_validate.c,v retrieving revision 1.109 retrieving revision 1.112 diff -u -p -r1.109 -r1.112 --- mandoc/mdoc_validate.c 2010/07/04 21:59:30 1.109 +++ mandoc/mdoc_validate.c 2010/07/20 14:56:42 1.112 @@ -1,6 +1,6 @@ -/* $Id: mdoc_validate.c,v 1.109 2010/07/04 21:59:30 kristaps Exp $ */ +/* $Id: mdoc_validate.c,v 1.112 2010/07/20 14:56:42 kristaps Exp $ */ /* - * Copyright (c) 2008, 2009 Kristaps Dzonsons + * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -32,7 +32,6 @@ #include "libmandoc.h" /* FIXME: .Bl -diag can't have non-text children in HEAD. */ -/* TODO: ignoring Pp (it's superfluous in some invocations). */ #define PRE_ARGS struct mdoc *mdoc, struct mdoc_node *n #define POST_ARGS struct mdoc *mdoc @@ -454,26 +453,29 @@ check_argv(struct mdoc *m, struct mdoc_node *n, struct static int -check_text(struct mdoc *mdoc, int line, int pos, char *p) +check_text(struct mdoc *m, int ln, int pos, char *p) { int c; + size_t sz; - /* - * FIXME: we absolutely cannot let \b get through or it will - * destroy some assumptions in terms of format. - */ - for ( ; *p; p++, pos++) { + sz = strcspn(p, "\t\\"); + p += (int)sz; + + if ('\0' == *p) + break; + + pos += (int)sz; + if ('\t' == *p) { - if ( ! (MDOC_LITERAL & mdoc->flags)) - if ( ! mdoc_pmsg(mdoc, line, pos, MANDOCERR_BADCHAR)) - return(0); - } else if ( ! isprint((u_char)*p) && ASCII_HYPH != *p) - if ( ! mdoc_pmsg(mdoc, line, pos, MANDOCERR_BADCHAR)) - return(0); + if (MDOC_LITERAL & m->flags) + continue; + if (mdoc_pmsg(m, ln, pos, MANDOCERR_BADTAB)) + continue; + return(0); + } - if ('\\' != *p) - continue; + /* Check the special character. */ c = mandoc_special(p); if (c) { @@ -482,8 +484,8 @@ check_text(struct mdoc *mdoc, int line, int pos, char continue; } - c = mdoc_pmsg(mdoc, line, pos, MANDOCERR_BADESCAPE); - if ( ! (MDOC_IGN_ESCAPE & mdoc->pflags) && ! c) + c = mdoc_pmsg(m, ln, pos, MANDOCERR_BADESCAPE); + if ( ! (MDOC_IGN_ESCAPE & m->pflags) && ! c) return(c); } @@ -491,8 +493,6 @@ check_text(struct mdoc *mdoc, int line, int pos, char } - - static int check_parent(PRE_ARGS, enum mdoct tok, enum mdoc_type t) { @@ -508,7 +508,6 @@ check_parent(PRE_ARGS, enum mdoct tok, enum mdoc_type mdoc_macronames[tok]); return(0); } - static int