Annotation of src/usr.bin/mandoc/mdoc_strings.c, Revision 1.6
1.6 ! schwarze 1: /* $Id: mdoc_strings.c,v 1.5 2009/06/18 01:19:02 schwarze 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
1.2 schwarze 6: * purpose with or without fee is hereby granted, provided that the above
7: * copyright notice and this permission notice appear in all copies.
1.1 kristaps 8: *
1.2 schwarze 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.
1.1 kristaps 16: */
17: #include <sys/types.h>
18:
19: #include <assert.h>
20: #include <ctype.h>
21: #include <stdlib.h>
22: #include <stdio.h>
23: #include <string.h>
24:
25: #include "libmdoc.h"
26:
1.6 ! schwarze 27: /* FIXME: this file is poorly named. */
1.1 kristaps 28:
29: struct mdoc_secname {
1.6 ! schwarze 30: const char *name; /* Name of section. */
! 31: enum mdoc_sec sec; /* Corresponding section. */
1.1 kristaps 32: };
33:
1.6 ! schwarze 34: #define SECNAME_MAX (18)
1.1 kristaps 35:
1.6 ! schwarze 36: static const struct mdoc_secname secnames[SECNAME_MAX] = {
! 37: { "NAME", SEC_NAME },
! 38: { "LIBRARY", SEC_LIBRARY },
! 39: { "SYNOPSIS", SEC_SYNOPSIS },
! 40: { "DESCRIPTION", SEC_DESCRIPTION },
! 41: { "IMPLEMENTATION NOTES", SEC_IMPLEMENTATION },
! 42: { "RETURN VALUES", SEC_RETURN_VALUES },
! 43: { "ENVIRONMENT", SEC_ENVIRONMENT },
! 44: { "FILES", SEC_FILES },
! 45: { "EXAMPLES", SEC_EXAMPLES },
! 46: { "DIAGNOSTICS", SEC_DIAGNOSTICS },
! 47: { "COMPATIBILITY", SEC_COMPATIBILITY },
! 48: { "ERRORS", SEC_ERRORS },
! 49: { "SEE ALSO", SEC_SEE_ALSO },
! 50: { "STANDARDS", SEC_STANDARDS },
! 51: { "HISTORY", SEC_HISTORY },
! 52: { "AUTHORS", SEC_AUTHORS },
! 53: { "CAVEATS", SEC_CAVEATS },
! 54: { "BUGS", SEC_BUGS },
1.1 kristaps 55: };
56:
57:
58: size_t
59: mdoc_isescape(const char *p)
60: {
61: size_t c;
62:
63: if ('\\' != *p++)
64: return(0);
65:
66: switch (*p) {
67: case ('\\'):
68: /* FALLTHROUGH */
69: case ('\''):
70: /* FALLTHROUGH */
71: case ('`'):
72: /* FALLTHROUGH */
73: case ('q'):
74: /* FALLTHROUGH */
75: case ('-'):
76: /* FALLTHROUGH */
1.3 schwarze 77: case ('~'):
78: /* FALLTHROUGH */
79: case ('^'):
80: /* FALLTHROUGH */
1.1 kristaps 81: case ('%'):
82: /* FALLTHROUGH */
83: case ('0'):
84: /* FALLTHROUGH */
85: case (' '):
86: /* FALLTHROUGH */
87: case ('|'):
88: /* FALLTHROUGH */
89: case ('&'):
90: /* FALLTHROUGH */
91: case ('.'):
92: /* FALLTHROUGH */
93: case (':'):
94: /* FALLTHROUGH */
95: case ('e'):
96: return(2);
97: case ('*'):
98: if (0 == *++p || ! isgraph((u_char)*p))
99: return(0);
100: switch (*p) {
101: case ('('):
102: if (0 == *++p || ! isgraph((u_char)*p))
103: return(0);
104: return(4);
105: case ('['):
106: for (c = 3, p++; *p && ']' != *p; p++, c++)
107: if ( ! isgraph((u_char)*p))
108: break;
109: return(*p == ']' ? c : 0);
110: default:
111: break;
112: }
113: return(3);
114: case ('('):
115: if (0 == *++p || ! isgraph((u_char)*p))
116: return(0);
117: if (0 == *++p || ! isgraph((u_char)*p))
118: return(0);
119: return(4);
120: case ('['):
121: break;
122: default:
123: return(0);
124: }
125:
126: for (c = 3, p++; *p && ']' != *p; p++, c++)
127: if ( ! isgraph((u_char)*p))
128: break;
129:
130: return(*p == ']' ? c : 0);
131: }
132:
133:
134: int
135: mdoc_iscdelim(char p)
136: {
137:
138: switch (p) {
1.5 schwarze 139: case('|'):
140: /* FALLTHROUGH */
1.1 kristaps 141: case('.'):
142: /* FALLTHROUGH */
143: case(','):
144: /* FALLTHROUGH */
145: case(';'):
146: /* FALLTHROUGH */
147: case(':'):
148: /* FALLTHROUGH */
149: case('?'):
150: /* FALLTHROUGH */
151: case('!'):
152: /* FALLTHROUGH */
153: case('('):
154: /* FALLTHROUGH */
155: case(')'):
156: /* FALLTHROUGH */
157: case('['):
158: /* FALLTHROUGH */
159: case(']'):
160: /* FALLTHROUGH */
161: case('{'):
162: /* FALLTHROUGH */
163: case('}'):
164: return(1);
165: default:
166: break;
167: }
168:
169: return(0);
170: }
171:
172:
173: int
174: mdoc_isdelim(const char *p)
175: {
176:
177: if (0 == *p)
178: return(0);
179: if (0 != *(p + 1))
180: return(0);
181: return(mdoc_iscdelim(*p));
182: }
183:
184:
185: enum mdoc_sec
186: mdoc_atosec(const char *p)
187: {
1.6 ! schwarze 188: int i;
1.1 kristaps 189:
1.6 ! schwarze 190: for (i = 0; i < SECNAME_MAX; i++)
! 191: if (0 == strcmp(p, secnames[i].name))
! 192: return(secnames[i].sec);
1.1 kristaps 193:
194: return(SEC_CUSTOM);
195: }
196:
197:
198: time_t
199: mdoc_atotime(const char *p)
200: {
201: struct tm tm;
202: char *pp;
203:
204: (void)memset(&tm, 0, sizeof(struct tm));
205:
1.4 schwarze 206: if (0 == strcmp(p, "$" "Mdocdate$"))
1.1 kristaps 207: return(time(NULL));
1.4 schwarze 208: if ((pp = strptime(p, "$" "Mdocdate: %b %d %Y $", &tm)) && 0 == *pp)
1.1 kristaps 209: return(mktime(&tm));
210: /* XXX - this matches "June 1999", which is wrong. */
211: if ((pp = strptime(p, "%b %d %Y", &tm)) && 0 == *pp)
212: return(mktime(&tm));
213: if ((pp = strptime(p, "%b %d, %Y", &tm)) && 0 == *pp)
214: return(mktime(&tm));
215:
216: return(0);
217: }
218:
219:
220: size_t
221: mdoc_macro2len(int macro)
222: {
223:
224: switch (macro) {
225: case(MDOC_Ad):
226: return(12);
227: case(MDOC_Ao):
228: return(12);
229: case(MDOC_An):
230: return(12);
231: case(MDOC_Aq):
232: return(12);
233: case(MDOC_Ar):
234: return(12);
235: case(MDOC_Bo):
236: return(12);
237: case(MDOC_Bq):
238: return(12);
239: case(MDOC_Cd):
240: return(12);
241: case(MDOC_Cm):
242: return(10);
243: case(MDOC_Do):
244: return(10);
245: case(MDOC_Dq):
246: return(12);
247: case(MDOC_Dv):
248: return(12);
249: case(MDOC_Eo):
250: return(12);
251: case(MDOC_Em):
252: return(10);
253: case(MDOC_Er):
254: return(12);
255: case(MDOC_Ev):
256: return(15);
257: case(MDOC_Fa):
258: return(12);
259: case(MDOC_Fl):
260: return(10);
261: case(MDOC_Fo):
262: return(16);
263: case(MDOC_Fn):
264: return(16);
265: case(MDOC_Ic):
266: return(10);
267: case(MDOC_Li):
268: return(16);
269: case(MDOC_Ms):
270: return(6);
271: case(MDOC_Nm):
272: return(10);
273: case(MDOC_No):
274: return(12);
275: case(MDOC_Oo):
276: return(10);
277: case(MDOC_Op):
278: return(14);
279: case(MDOC_Pa):
280: return(32);
281: case(MDOC_Pf):
282: return(12);
283: case(MDOC_Po):
284: return(12);
285: case(MDOC_Pq):
286: return(12);
287: case(MDOC_Ql):
288: return(16);
289: case(MDOC_Qo):
290: return(12);
291: case(MDOC_So):
292: return(12);
293: case(MDOC_Sq):
294: return(12);
295: case(MDOC_Sy):
296: return(6);
297: case(MDOC_Sx):
298: return(16);
299: case(MDOC_Tn):
300: return(10);
301: case(MDOC_Va):
302: return(12);
303: case(MDOC_Vt):
304: return(12);
305: case(MDOC_Xr):
306: return(10);
307: default:
308: break;
309: };
310: return(0);
311: }