Annotation of mandoc/roff_validate.c, Revision 1.1
1.1 ! schwarze 1: /* $OpenBSD: roff_html.c,v 1.1 2017/05/04 22:07:44 schwarze Exp $ */
! 2: /*
! 3: * Copyright (c) 2010, 2017 Ingo Schwarze <schwarze@openbsd.org>
! 4: *
! 5: * Permission to use, copy, modify, and distribute this software for any
! 6: * purpose with or without fee is hereby granted, provided that the above
! 7: * copyright notice and this permission notice appear in all copies.
! 8: *
! 9: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
! 10: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
! 11: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
! 12: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
! 13: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
! 14: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
! 15: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
! 16: */
! 17: #include <sys/types.h>
! 18:
! 19: #include <assert.h>
! 20: #include <stddef.h>
! 21:
! 22: #include "mandoc.h"
! 23: #include "roff.h"
! 24: #include "libmandoc.h"
! 25: #include "roff_int.h"
! 26:
! 27: #define ROFF_VALID_ARGS struct roff_man *man, struct roff_node *n
! 28:
! 29: typedef void (*roff_valid_fp)(ROFF_VALID_ARGS);
! 30:
! 31: static void roff_valid_ft(ROFF_VALID_ARGS);
! 32:
! 33: static const roff_valid_fp roff_valids[ROFF_MAX] = {
! 34: NULL, /* br */
! 35: roff_valid_ft, /* ft */
! 36: };
! 37:
! 38:
! 39: void
! 40: roff_validate(struct roff_man *man)
! 41: {
! 42: struct roff_node *n;
! 43:
! 44: n = man->last;
! 45: assert(n->tok < ROFF_MAX);
! 46: if (roff_valids[n->tok] != NULL)
! 47: (*roff_valids[n->tok])(man, n);
! 48: }
! 49:
! 50: static void
! 51: roff_valid_ft(ROFF_VALID_ARGS)
! 52: {
! 53: char *cp;
! 54:
! 55: if (n->child == NULL) {
! 56: man->next = ROFF_NEXT_CHILD;
! 57: roff_word_alloc(man, n->line, n->pos, "P");
! 58: man->last = n;
! 59: return;
! 60: }
! 61:
! 62: cp = n->child->string;
! 63: switch (*cp) {
! 64: case '1':
! 65: case '2':
! 66: case '3':
! 67: case '4':
! 68: case 'I':
! 69: case 'P':
! 70: case 'R':
! 71: if (cp[1] == '\0')
! 72: return;
! 73: break;
! 74: case 'B':
! 75: if (cp[1] == '\0' || (cp[1] == 'I' && cp[2] == '\0'))
! 76: return;
! 77: break;
! 78: case 'C':
! 79: if (cp[1] == 'W' && cp[2] == '\0')
! 80: return;
! 81: break;
! 82: default:
! 83: break;
! 84: }
! 85:
! 86: mandoc_vmsg(MANDOCERR_FT_BAD, man->parse,
! 87: n->line, n->pos, "ft %s", cp);
! 88: roff_node_delete(man, n);
! 89: }
CVSweb