Annotation of mandoc/man_argv.c, Revision 1.2
1.2 ! kristaps 1: /* $Id: man_argv.c,v 1.1 2009/08/13 11:45:29 kristaps Exp $ */
1.1 kristaps 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: */
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:
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:
CVSweb