Annotation of mandoc/tokens.c, Revision 1.4
1.4 ! kristaps 1: /* $Id: tokens.c,v 1.3 2008/12/04 19:31:57 kristaps Exp $ */
1.1 kristaps 2: /*
3: * Copyright (c) 2008 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
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 <stdlib.h>
21: #include <string.h>
22:
23: #include "private.h"
24:
25:
1.3 kristaps 26: static int rofftok_dashes(const char *, int *);
27: static int rofftok_special(const char *, int *);
28: static int rofftok_predef(const char *, int *);
29: static int rofftok_defined(const char *, int *);
1.1 kristaps 30:
31:
32: static int
1.3 kristaps 33: rofftok_defined(const char *buf, int *i)
1.1 kristaps 34: {
1.3 kristaps 35: const char *p;
36:
37: if (0 == buf[*i])
1.1 kristaps 38: return(-1);
1.3 kristaps 39: if (0 == buf[*i + 1])
1.1 kristaps 40: return(-1);
41:
1.3 kristaps 42: (*i)++;
43: p = &buf[(*i)++];
44:
45: if (0 == memcmp(p, ">=", 2))
1.1 kristaps 46: return(ROFFTok_Ge);
1.3 kristaps 47: else if (0 == memcmp(p, "<=", 2))
1.1 kristaps 48: return(ROFFTok_Le);
1.3 kristaps 49: else if (0 == memcmp(p, "Rq", 2))
1.1 kristaps 50: return(ROFFTok_Rquote);
1.3 kristaps 51: else if (0 == memcmp(p, "Lq", 2))
1.1 kristaps 52: return(ROFFTok_Lquote);
1.3 kristaps 53: else if (0 == memcmp(p, "ua", 2))
1.1 kristaps 54: return(ROFFTok_Uparrow);
1.3 kristaps 55: else if (0 == memcmp(p, "aa", 2))
1.1 kristaps 56: return(ROFFTok_Acute);
1.3 kristaps 57: else if (0 == memcmp(p, "ga", 2))
1.1 kristaps 58: return(ROFFTok_Grave);
1.3 kristaps 59: else if (0 == memcmp(p, "Pi", 2))
1.1 kristaps 60: return(ROFFTok_Pi);
1.3 kristaps 61: else if (0 == memcmp(p, "Ne", 2))
1.1 kristaps 62: return(ROFFTok_Ne);
1.3 kristaps 63: else if (0 == memcmp(p, "Le", 2))
1.1 kristaps 64: return(ROFFTok_Le);
1.3 kristaps 65: else if (0 == memcmp(p, "Ge", 2))
1.1 kristaps 66: return(ROFFTok_Ge);
1.3 kristaps 67: else if (0 == memcmp(p, "Lt", 2))
1.1 kristaps 68: return(ROFFTok_Lt);
1.3 kristaps 69: else if (0 == memcmp(p, "Gt", 2))
1.1 kristaps 70: return(ROFFTok_Gt);
1.3 kristaps 71: else if (0 == memcmp(p, "Pm", 2))
1.1 kristaps 72: return(ROFFTok_Plusmin);
1.3 kristaps 73: else if (0 == memcmp(p, "If", 2))
1.1 kristaps 74: return(ROFFTok_Infty);
1.3 kristaps 75: else if (0 == memcmp(p, "Na", 2))
1.1 kristaps 76: return(ROFFTok_Nan);
1.3 kristaps 77: else if (0 == memcmp(p, "Ba", 2))
1.1 kristaps 78: return(ROFFTok_Bar);
79:
80: return(-1);
81: }
82:
83:
84: static int
1.3 kristaps 85: rofftok_predef(const char *buf, int *i)
1.1 kristaps 86: {
1.3 kristaps 87: if (0 == buf[*i])
1.1 kristaps 88: return(-1);
1.3 kristaps 89: if ('(' == buf[*i])
90: return(rofftok_defined(buf, i));
1.1 kristaps 91:
1.3 kristaps 92: switch (buf[*i]) {
1.2 kristaps 93: case ('q'):
94: return(ROFFTok_Quote);
95: default:
96: break;
97: }
1.1 kristaps 98:
99: return(-1);
100: }
101:
102:
103: static int
1.3 kristaps 104: rofftok_dashes(const char *buf, int *i)
1.1 kristaps 105: {
106:
1.3 kristaps 107: if (0 == buf[*i])
1.1 kristaps 108: return(-1);
1.3 kristaps 109: else if (buf[(*i)++] != 'e')
1.1 kristaps 110: return(-1);
1.3 kristaps 111: if (0 == buf[*i])
1.1 kristaps 112: return(-1);
113:
1.3 kristaps 114: switch (buf[*i]) {
1.1 kristaps 115: case ('m'):
116: return(ROFFTok_Em);
117: case ('n'):
118: return(ROFFTok_En);
119: default:
120: break;
121: }
122: return(-1);
123: }
124:
125:
126: static int
1.3 kristaps 127: rofftok_special(const char *buf, int *i)
1.1 kristaps 128: {
129:
1.3 kristaps 130: if (0 == buf[*i])
131: return(ROFFTok_Slash);
1.1 kristaps 132:
1.3 kristaps 133: switch (buf[*i]) {
1.1 kristaps 134: case ('a'):
135: return(ROFFTok_Sp_A);
136: case ('b'):
137: return(ROFFTok_Sp_B);
138: case ('f'):
139: return(ROFFTok_Sp_F);
140: case ('n'):
141: return(ROFFTok_Sp_N);
142: case ('r'):
143: return(ROFFTok_Sp_R);
144: case ('t'):
145: return(ROFFTok_Sp_T);
146: case ('v'):
147: return(ROFFTok_Sp_V);
1.3 kristaps 148: case ('0'):
149: return(ROFFTok_Sp_0);
1.1 kristaps 150: default:
151: break;
152: }
153: return(-1);
154: }
155:
156:
157: int
1.3 kristaps 158: rofftok_scan(const char *buf, int *i)
1.1 kristaps 159: {
160:
161: assert(*buf);
1.3 kristaps 162: assert(buf[*i] == '\\');
163:
164: (*i)++;
1.1 kristaps 165:
1.3 kristaps 166: for ( ; buf[*i]; (*i)++) {
167: switch (buf[*i]) {
1.1 kristaps 168: case ('e'):
1.3 kristaps 169: (*i)++;
170: return(rofftok_special(buf, i));
1.1 kristaps 171: case ('('):
1.3 kristaps 172: (*i)++;
173: return(rofftok_dashes(buf, i));
1.1 kristaps 174: case (' '):
175: return(ROFFTok_Space);
176: case ('&'):
177: return(ROFFTok_Null);
178: case ('-'):
179: return(ROFFTok_Hyphen);
180: case ('*'):
1.3 kristaps 181: (*i)++;
182: return(rofftok_predef(buf, i));
1.2 kristaps 183: case ('\\'):
1.3 kristaps 184: return(ROFFTok_Slash);
1.1 kristaps 185: default:
186: break;
187: }
188: }
189:
190: return(-1);
191: }
192:
193:
CVSweb