Merge branch 'master' of git://crater.dragonflybsd.org/dragonfly
[dragonfly.git] / contrib / mdocml / mdoc_strings.c
1 /*      $Id: mdoc_strings.c,v 1.24 2010/07/31 23:52:58 schwarze Exp $ */
2 /*
3  * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
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 <stdio.h>
26 #include <string.h>
27 #include <time.h>
28
29 #include "mandoc.h"
30 #include "libmdoc.h"
31
32 static  const char * const secnames[SEC__MAX] = {
33         NULL,
34         "NAME",
35         "LIBRARY",
36         "SYNOPSIS",
37         "DESCRIPTION",
38         "IMPLEMENTATION NOTES",
39         "RETURN VALUES",
40         "ENVIRONMENT",
41         "FILES",
42         "EXIT STATUS",
43         "EXAMPLES",
44         "DIAGNOSTICS",
45         "COMPATIBILITY",
46         "ERRORS",
47         "SEE ALSO",
48         "STANDARDS",
49         "HISTORY",
50         "AUTHORS",
51         "CAVEATS",
52         "BUGS",
53         "SECURITY CONSIDERATIONS",
54         NULL
55 };
56
57 /* 
58  * FIXME: this is repeated in print_text() (html.c) and term_word()
59  * (term.c).
60  */
61 enum mdelim
62 mdoc_iscdelim(char p)
63 {
64
65         switch (p) {
66         case('('):
67                 /* FALLTHROUGH */
68         case('['):
69                 return(DELIM_OPEN);
70         case('|'):
71                 return(DELIM_MIDDLE);
72         case('.'):
73                 /* FALLTHROUGH */
74         case(','):
75                 /* FALLTHROUGH */
76         case(';'):
77                 /* FALLTHROUGH */
78         case(':'):
79                 /* FALLTHROUGH */
80         case('?'):
81                 /* FALLTHROUGH */
82         case('!'):
83                 /* FALLTHROUGH */
84         case(')'):
85                 /* FALLTHROUGH */
86         case(']'):
87                 return(DELIM_CLOSE);
88         default:
89                 break;
90         }
91
92         return(DELIM_NONE);
93 }
94
95
96 enum mdelim
97 mdoc_isdelim(const char *p)
98 {
99
100         if ('\0' == p[0])
101                 return(DELIM_NONE);
102         if ('\0' == p[1])
103                 return(mdoc_iscdelim(p[0]));
104
105         /*
106          * XXX; account for groff bubu where the \*(Ba reserved string
107          * is treated in exactly the same way as the vertical bar.  This
108          * is the only function that checks for this.
109          */
110         return(strcmp(p, "\\*(Ba") ? DELIM_NONE : DELIM_MIDDLE);
111 }
112
113
114 enum mdoc_sec 
115 mdoc_str2sec(const char *p)
116 {
117         int              i;
118
119         for (i = 0; i < (int)SEC__MAX; i++) 
120                 if (secnames[i] && 0 == strcmp(p, secnames[i]))
121                         return((enum mdoc_sec)i);
122
123         return(SEC_CUSTOM);
124 }
125
126
127 /* FIXME: move this into an editable .in file. */
128 size_t
129 mdoc_macro2len(enum mdoct macro)
130 {
131
132         switch (macro) {
133         case(MDOC_Ad):
134                 return(12);
135         case(MDOC_Ao):
136                 return(12);
137         case(MDOC_An):
138                 return(12);
139         case(MDOC_Aq):
140                 return(12);
141         case(MDOC_Ar):
142                 return(12);
143         case(MDOC_Bo):
144                 return(12);
145         case(MDOC_Bq):
146                 return(12);
147         case(MDOC_Cd):
148                 return(12);
149         case(MDOC_Cm):
150                 return(10);
151         case(MDOC_Do):
152                 return(10);
153         case(MDOC_Dq):
154                 return(12);
155         case(MDOC_Dv):
156                 return(12);
157         case(MDOC_Eo):
158                 return(12);
159         case(MDOC_Em):
160                 return(10);
161         case(MDOC_Er):
162                 return(17);
163         case(MDOC_Ev):
164                 return(15);
165         case(MDOC_Fa):
166                 return(12);
167         case(MDOC_Fl):
168                 return(10);
169         case(MDOC_Fo):
170                 return(16);
171         case(MDOC_Fn):
172                 return(16);
173         case(MDOC_Ic):
174                 return(10);
175         case(MDOC_Li):
176                 return(16);
177         case(MDOC_Ms):
178                 return(6);
179         case(MDOC_Nm):
180                 return(10);
181         case(MDOC_No):
182                 return(12);
183         case(MDOC_Oo):
184                 return(10);
185         case(MDOC_Op):
186                 return(14);
187         case(MDOC_Pa):
188                 return(32);
189         case(MDOC_Pf):
190                 return(12);
191         case(MDOC_Po):
192                 return(12);
193         case(MDOC_Pq):
194                 return(12);
195         case(MDOC_Ql):
196                 return(16);
197         case(MDOC_Qo):
198                 return(12);
199         case(MDOC_So):
200                 return(12);
201         case(MDOC_Sq):
202                 return(12);
203         case(MDOC_Sy):
204                 return(6);
205         case(MDOC_Sx):
206                 return(16);
207         case(MDOC_Tn):
208                 return(10);
209         case(MDOC_Va):
210                 return(12);
211         case(MDOC_Vt):
212                 return(12);
213         case(MDOC_Xr):
214                 return(10);
215         default:
216                 break;
217         };
218         return(0);
219 }