Annotation of mandoc/man_macro.c, Revision 1.3
1.3 ! kristaps 1: /* $Id: man_macro.c,v 1.2 2009/03/23 14:31:58 kristaps Exp $ */
1.1 kristaps 2: /*
3: * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@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
7: * above copyright notice and this permission notice appear in all
8: * copies.
9: *
10: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11: * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12: * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13: * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14: * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15: * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16: * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17: * PERFORMANCE OF THIS SOFTWARE.
18: */
19: #include <assert.h>
20: #include <ctype.h>
1.3 ! kristaps 21: #include <err.h> /* XXX */
1.1 kristaps 22: #include <stdlib.h>
23: #include <stdio.h>
24: #include <string.h>
25:
26: #include "libman.h"
27:
1.3 ! kristaps 28: static int man_args(struct man *, int,
! 29: int *, char *, char **);
1.1 kristaps 30:
31:
1.3 ! kristaps 32: int
! 33: man_macro(struct man *man, int tok, int line,
! 34: int ppos, int *pos, char *buf)
1.1 kristaps 35: {
1.3 ! kristaps 36: int w, la;
! 37: char *p;
! 38: struct man_node *n;
1.1 kristaps 39:
1.3 ! kristaps 40: if ( ! man_elem_alloc(man, line, ppos, tok))
1.1 kristaps 41: return(0);
1.3 ! kristaps 42: n = man->last;
! 43: man->next = MAN_NEXT_CHILD;
1.1 kristaps 44:
45: for (;;) {
46: la = *pos;
1.3 ! kristaps 47: w = man_args(man, line, pos, buf, &p);
1.1 kristaps 48:
1.3 ! kristaps 49: if (-1 == w)
1.1 kristaps 50: return(0);
1.3 ! kristaps 51: if (0 == w)
1.1 kristaps 52: break;
53:
1.3 ! kristaps 54: if ( ! man_word_alloc(man, line, la, p))
! 55: return(0);
! 56: man->next = MAN_NEXT_SIBLING;
! 57: }
1.1 kristaps 58:
1.3 ! kristaps 59: /* TODO: validate. */
! 60: /* TODO: validate. */
1.1 kristaps 61:
1.3 ! kristaps 62: man->last = n;
! 63: man->next = MAN_NEXT_SIBLING;
1.1 kristaps 64:
65: return(1);
66: }
67:
1.3 ! kristaps 68:
! 69: /* ARGSUSED */
! 70: int
! 71: man_args(struct man *man, int line,
! 72: int *pos, char *buf, char **v)
! 73: {
! 74:
! 75: if (0 == buf[*pos])
! 76: return(0);
! 77:
! 78: /* First parse non-quoted strings. */
! 79:
! 80: if ('\"' != buf[*pos]) {
! 81: *v = &buf[*pos];
! 82:
! 83: while (buf[*pos]) {
! 84: if (' ' == buf[*pos])
! 85: if ('\\' != buf[*pos - 1])
! 86: break;
! 87: (*pos)++;
! 88: }
! 89:
! 90: if (0 == buf[*pos])
! 91: return(1);
! 92:
! 93: buf[(*pos)++] = 0;
! 94:
! 95: if (0 == buf[*pos])
! 96: return(1);
! 97:
! 98: while (buf[*pos] && ' ' == buf[*pos])
! 99: (*pos)++;
! 100:
! 101: if (buf[*pos])
! 102: return(1);
! 103:
! 104: warnx("tail whitespace");
! 105: return(-1);
! 106: }
! 107:
! 108: /*
! 109: * If we're a quoted string (and quoted strings are allowed),
! 110: * then parse ahead to the next quote. If none's found, it's an
! 111: * error. After, parse to the next word.
! 112: */
! 113:
! 114: *v = &buf[++(*pos)];
! 115:
! 116: while (buf[*pos] && '\"' != buf[*pos])
! 117: (*pos)++;
! 118:
! 119: if (0 == buf[*pos]) {
! 120: warnx("unterminated quotation");
! 121: return(-1);
! 122: }
! 123:
! 124: buf[(*pos)++] = 0;
! 125: if (0 == buf[*pos])
! 126: return(1);
! 127:
! 128: while (buf[*pos] && ' ' == buf[*pos])
! 129: (*pos)++;
! 130:
! 131: if (buf[*pos])
! 132: return(1);
! 133:
! 134: warnx("tail whitespace");
! 135: return(-1);
! 136: }
CVSweb