Annotation of mandoc/man_argv.c, Revision 1.4
1.4 ! kristaps 1: /* $Id: man_argv.c,v 1.3 2010/05/17 22:11:42 kristaps Exp $ */
1.1 kristaps 2: /*
1.4 ! kristaps 3: * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@bsd.lv>
1.1 kristaps 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: */
1.2 kristaps 17: #ifdef HAVE_CONFIG_H
18: #include "config.h"
19: #endif
20:
1.1 kristaps 21: #include <sys/types.h>
22:
23: #include <assert.h>
24: #include <stdlib.h>
25: #include <string.h>
26:
1.3 kristaps 27: #include "mandoc.h"
1.1 kristaps 28: #include "libman.h"
29:
30:
31: int
32: man_args(struct man *m, int line, int *pos, char *buf, char **v)
33: {
34:
35: assert(*pos);
36: assert(' ' != buf[*pos]);
37:
38: if (0 == buf[*pos])
39: return(ARGS_EOLN);
40:
41: *v = &buf[*pos];
42:
43: /*
44: * Process a quoted literal. A quote begins with a double-quote
45: * and ends with a double-quote NOT preceded by a double-quote.
46: * Whitespace is NOT involved in literal termination.
47: */
48:
49: if ('\"' == buf[*pos]) {
50: *v = &buf[++(*pos)];
51:
52: for ( ; buf[*pos]; (*pos)++) {
53: if ('\"' != buf[*pos])
54: continue;
55: if ('\"' != buf[*pos + 1])
56: break;
57: (*pos)++;
58: }
59:
60: if (0 == buf[*pos]) {
1.3 kristaps 61: if ( ! man_pmsg(m, line, *pos, MANDOCERR_BADQUOTE))
1.1 kristaps 62: return(ARGS_ERROR);
63: return(ARGS_QWORD);
64: }
65:
66: buf[(*pos)++] = 0;
67:
68: if (0 == buf[*pos])
69: return(ARGS_QWORD);
70:
71: while (' ' == buf[*pos])
72: (*pos)++;
73:
74: if (0 == buf[*pos])
1.3 kristaps 75: if ( ! man_pmsg(m, line, *pos, MANDOCERR_EOLNSPACE))
1.1 kristaps 76: return(ARGS_ERROR);
77:
78: return(ARGS_QWORD);
79: }
80:
81: /*
82: * A non-quoted term progresses until either the end of line or
83: * a non-escaped whitespace.
84: */
85:
86: for ( ; buf[*pos]; (*pos)++)
87: if (' ' == buf[*pos] && '\\' != buf[*pos - 1])
88: break;
89:
90: if (0 == buf[*pos])
91: return(ARGS_WORD);
92:
93: buf[(*pos)++] = 0;
94:
95: while (' ' == buf[*pos])
96: (*pos)++;
97:
98: if (0 == buf[*pos])
1.3 kristaps 99: if ( ! man_pmsg(m, line, *pos, MANDOCERR_EOLNSPACE))
1.1 kristaps 100: return(ARGS_ERROR);
101:
102: return(ARGS_WORD);
103: }
104:
CVSweb