1 /*
2 * Generated by ./misc/optlib2c from optlib/man.ctags, Don't edit this manually.
3 */
4 #include "general.h"
5 #include "parse.h"
6 #include "routines.h"
7 #include "field.h"
8 #include "xtag.h"
9
10
11 typedef enum {
12 K_TITLE,
13 K_SECTION,
14 K_SUBSECTION,
15 } ManKind;
16
17
initializeManParser(const langType language)18 static void initializeManParser (const langType language)
19 {
20 addLanguageOptscriptToHook (language, SCRIPT_HOOK_PRELUDE,
21 "{{ % adjustment:int FILL-END-OF-SCOPE -\n"
22 " %\n"
23 " % Note: The group 1 of a regex matching is assumed.\n"
24 " % An entry on the scope stack is assumed.\n"
25 " /fill-end-of-scope {\n"
26 " _scopetop pop exch\n"
27 " % scope-top:int adjustment:int\n"
28 " 1 /start _matchloc _matchloc2line exch\n"
29 " % scope-top:int line adjustment:int\n"
30 " 2 copy gt {\n"
31 " sub end:\n"
32 " } {\n"
33 " pop pop pop\n"
34 " } ifelse\n"
35 " } def\n"
36 " % adjustment:int /replace HEADING-ACTION -\n"
37 " % /push HEADING-ACTION -\n"
38 " /heading-action {\n"
39 " /replace eq {\n"
40 " %\n"
41 " % Before removing the tag at the top of the scope stack,\n"
42 " % fill the end field of the tag.\n"
43 " %\n"
44 " % input0.man\n"
45 " % ----------------------------------------------------\n"
46 " % .SH SEC1\n"
47 " % ...\n"
48 " %E: This is the end of the SEC1.\n"
49 " % .SH\n"
50 " %C: SEC2\n"
51 " %\n"
52 " % ----------------------------------------------------\n"
53 " %\n"
54 " % C represents the current input line. The parser must\n"
55 " % fill the end field of \"SEC1\", the tag at the top,\n"
56 " % with the line number of E.\n"
57 " %\n"
58 " % E = C - 2\n"
59 " %\n"
60 " % input1.man\n"
61 " % ----------------------------------------------------\n"
62 " % .SH SEC3\n"
63 " % ...\n"
64 " %E: This is the end of the SEC1.\n"
65 " %C: .SH SEC4\n"
66 " %\n"
67 " % ----------------------------------------------------\n"
68 " %\n"
69 " % In this case\n"
70 " %\n"
71 " % E = C - 1\n"
72 " %\n"
73 " % The offset for the adjustment depends on the conctxt.\n"
74 " %\n"
75 " fill-end-of-scope\n"
76 " _scopepop\n"
77 " } if\n"
78 "\n"
79 " _scopetop {\n"
80 " . exch scope:\n"
81 " } if\n"
82 " . _scopepush\n"
83 " } def\n"
84 "}}");
85
86 addLanguageRegexTable (language, "main");
87 addLanguageRegexTable (language, "section");
88 addLanguageRegexTable (language, "sectionheading");
89 addLanguageRegexTable (language, "subsection");
90 addLanguageRegexTable (language, "subsectionheading");
91 addLanguageRegexTable (language, "EOF");
92 addLanguageRegexTable (language, "SKIP");
93 addLanguageRegexTable (language, "REST");
94 addLanguageRegexTable (language, "GUARD");
95
96 addLanguageTagMultiTableRegex (language, "main",
97 "^([^\n.]|\\.[^\nst])[^\n]*\n",
98 "", "", "{icase}", NULL);
99 addLanguageTagMultiTableRegex (language, "main",
100 "^\\.TH[\t ]+\"([^\"]+)\"[^\n]*\n",
101 "\\1", "t", "{icase}{scope=set}", NULL);
102 addLanguageTagMultiTableRegex (language, "main",
103 "^\\.TH[\t ]+([^\t \n]+)[^\n]*\n",
104 "\\1", "t", "{icase}{scope=set}", NULL);
105 addLanguageTagMultiTableRegex (language, "main",
106 "^\\.SH[\t ]+\"([^\"\n]+)\"[^\n]*\n",
107 "\\1", "s", "{icase}{scope=push}{tenter=section}", NULL);
108 addLanguageTagMultiTableRegex (language, "main",
109 "^\\.SH[\t ]+([^\n]+)\n",
110 "\\1", "s", "{icase}{scope=push}{tenter=section}", NULL);
111 addLanguageTagMultiTableRegex (language, "main",
112 "^\\.SH[\t ]*\n",
113 "", "", "{icase}{tenter=sectionheading}"
114 "{{\n"
115 " /push\n"
116 "}}", NULL);
117 addLanguageTagMultiTableRegex (language, "main",
118 "^[^\n]*\n|[^\n]+",
119 "", "", "", NULL);
120 addLanguageTagMultiTableRegex (language, "main",
121 "^",
122 "", "", "{scope=clear}{tquit}", NULL);
123 addLanguageTagMultiTableRegex (language, "section",
124 "^([^\n.]|\\.[^\nst])[^\n]*\n",
125 "", "", "{icase}", NULL);
126 addLanguageTagMultiTableRegex (language, "section",
127 "^\\.SH[\t ]+\"([^\"\n]+)\"[^\n]*\n",
128 "\\1", "s", "{icase}{scope=replace}", NULL);
129 addLanguageTagMultiTableRegex (language, "section",
130 "^\\.SH[\t ]+([^\n]+)\n",
131 "\\1", "s", "{icase}{scope=replace}", NULL);
132 addLanguageTagMultiTableRegex (language, "section",
133 "^(\\.SH)[\t ]*\n",
134 "", "", "{icase}{tjump=sectionheading}"
135 "{{\n"
136 " 2 /replace\n"
137 "}}", NULL);
138 addLanguageTagMultiTableRegex (language, "section",
139 "^\\.SS[\t ]+\"([^\"\n]+)\"[^\n]*\n",
140 "\\1", "S", "{icase}{scope=push}{tenter=subsection}", NULL);
141 addLanguageTagMultiTableRegex (language, "section",
142 "^\\.SS[\t ]+([^\n]+)\n",
143 "\\1", "S", "{icase}{scope=push}{tenter=subsection}", NULL);
144 addLanguageTagMultiTableRegex (language, "section",
145 "^\\.SS[\t ]*\n",
146 "", "", "{icase}{tenter=subsectionheading}"
147 "{{\n"
148 " /push\n"
149 "}}", NULL);
150 addLanguageTagMultiTableRegex (language, "section",
151 "^[^\n]*\n|[^\n]+",
152 "", "", "", NULL);
153 addLanguageTagMultiTableRegex (language, "section",
154 "^",
155 "", "", "{scope=clear}{tquit}", NULL);
156 addLanguageTagMultiTableRegex (language, "sectionheading",
157 "^[ \t]*([^\n]+)\n",
158 "\\1", "s", "{tjump=section}"
159 "{{\n"
160 " heading-action\n"
161 "}}", NULL);
162 addLanguageTagMultiTableRegex (language, "sectionheading",
163 "^[^\n]*\n|[^\n]+",
164 "", "", "", NULL);
165 addLanguageTagMultiTableRegex (language, "sectionheading",
166 "^",
167 "", "", "{scope=clear}{tquit}", NULL);
168 addLanguageTagMultiTableRegex (language, "subsection",
169 "^([^\n.]|\\.[^\nst])[^\n]*\n",
170 "", "", "{icase}", NULL);
171 addLanguageTagMultiTableRegex (language, "subsection",
172 "^\\.SS[\t ]+\"([^\"\n]+)\"[^\n]*\n",
173 "\\1", "S", "{icase}{scope=replace}", NULL);
174 addLanguageTagMultiTableRegex (language, "subsection",
175 "^\\.SS[\t ]+([^\n]+)\n",
176 "\\1", "S", "{icase}{scope=replace}", NULL);
177 addLanguageTagMultiTableRegex (language, "subsection",
178 "^\\.SS[\t ]*\n",
179 "", "", "{icase}{tjump=subsectionheading}"
180 "{{\n"
181 " 2 /replace\n"
182 "}}", NULL);
183 addLanguageTagMultiTableRegex (language, "subsection",
184 "^(\\.SH)",
185 "", "", "{icase}{_advanceTo=0start}{tleave}"
186 "{{\n"
187 " 1 fill-end-of-scope\n"
188 " _scopepop\n"
189 "}}", NULL);
190 addLanguageTagMultiTableRegex (language, "subsection",
191 "^[^\n]*\n|[^\n]+",
192 "", "", "", NULL);
193 addLanguageTagMultiTableRegex (language, "subsection",
194 "^",
195 "", "", "{scope=clear}{tquit}", NULL);
196 addLanguageTagMultiTableRegex (language, "subsectionheading",
197 "^[ \t]*([^\n]+)\n",
198 "\\1", "S", "{tjump=subsection}"
199 "{{\n"
200 " heading-action\n"
201 "}}", NULL);
202 addLanguageTagMultiTableRegex (language, "subsectionheading",
203 "^[^\n]*\n|[^\n]+",
204 "", "", "", NULL);
205 addLanguageTagMultiTableRegex (language, "subsectionheading",
206 "^",
207 "", "", "{scope=clear}{tquit}", NULL);
208 addLanguageTagMultiTableRegex (language, "EOF",
209 "^",
210 "", "", "{scope=clear}{tquit}", NULL);
211 addLanguageTagMultiTableRegex (language, "SKIP",
212 "^[^\n]*\n|[^\n]+",
213 "", "", "", NULL);
214 addLanguageTagMultiTableRegex (language, "REST",
215 "^[^\n]*\n|[^\n]+",
216 "", "", "", NULL);
217 addLanguageTagMultiTableRegex (language, "REST",
218 "^",
219 "", "", "{scope=clear}{tquit}", NULL);
220 addLanguageTagMultiTableRegex (language, "GUARD",
221 "^([^\n.]|\\.[^\nst])[^\n]*\n",
222 "", "", "{icase}", NULL);
223 }
224
ManParser(void)225 extern parserDefinition* ManParser (void)
226 {
227 static const char *const extensions [] = {
228 "1",
229 "2",
230 "3",
231 "4",
232 "5",
233 "6",
234 "7",
235 "8",
236 "9",
237 "3pm",
238 "3stap",
239 "7stap",
240 NULL
241 };
242
243 static const char *const aliases [] = {
244 NULL
245 };
246
247 static const char *const patterns [] = {
248 NULL
249 };
250
251 static kindDefinition ManKindTable [] = {
252 {
253 true, 't', "title", "titles",
254 },
255 {
256 true, 's', "section", "sections",
257 },
258 {
259 true, 'S', "subsection", "sub sections",
260 },
261 };
262
263 parserDefinition* const def = parserNew ("Man");
264
265 def->enabled = true;
266 def->extensions = extensions;
267 def->patterns = patterns;
268 def->aliases = aliases;
269 def->method = METHOD_NOT_CRAFTED|METHOD_REGEX;
270 def->useCork = CORK_QUEUE;
271 def->kindTable = ManKindTable;
272 def->kindCount = ARRAY_SIZE(ManKindTable);
273 def->defaultScopeSeparator = "\"\"";
274 def->initialize = initializeManParser;
275
276 return def;
277 }
278