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