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