1 /*
2 * j2t.lex : An example of the use (possibly abuse!)
3 * of start states.
4 */
5
6 %{
7 #define MAX_STATES 1024
8 #define TRUE 1
9 #define FALSE 0
10
11 #define CHAPTER "@chapter"
12 #define SECTION "@section"
13 #define SSECTION "@subsection"
14 #define SSSECTION "@subsubsection"
15
16 int states[MAX_STATES];
17 int statep = 0;
18
19 int need_closing = FALSE;
20
21 char buffer[YY_BUF_SIZE];
22
23 extern char *yytext;
24
25 /*
26 * set up the head of the *.texinfo file the program
27 * will produce. This is a standard texinfo header.
28 */
29
print_header(void)30 void print_header(void)
31 {
32 printf("\\input texinfo @c -*-texinfo-*-\n");
33 printf("@c %c**start of header\n",'%');
34 printf("@setfilename jargon.info\n");
35 printf("@settitle The New Hackers Dictionary\n");
36 printf("@synindex fn cp\n");
37 printf("@synindex vr cp\n");
38 printf("@c %c**end of header\n",'%');
39 printf("@setchapternewpage odd\n");
40 printf("@finalout\n");
41 printf("@c @smallbook\n");
42 printf("\n");
43 printf("@c ==========================================================\n\n");
44 printf("@c This file was produced by j2t. Any mistakes are *not* the\n");
45 printf("@c fault of the jargon file editors. \n");
46 printf("@c ==========================================================\n\n");
47 printf("@titlepage\n");
48 printf("@title The New Hackers Dictionary\n");
49 printf("@subtitle Version 2.9.10\n");
50 printf("@subtitle Generated by j2t\n");
51 printf("@author Eric S. Raymond, Guy L. Steel, Mark Crispin et al.\n");
52 printf("@end titlepage\n");
53 printf("@page\n");
54 printf("\n@c ==========================================================\n");
55 printf("\n\n");
56 printf("@unnumbered Preface\n");
57 printf("@c *******\n");
58 }
59
60 /*
61 * create the tail of the texinfo file produced.
62 */
63
print_trailer(void)64 void print_trailer(void)
65 {
66 printf("\n@c ==========================================================\n");
67 printf("@contents\n"); /* print the table of contents */
68 printf("@bye\n\n");
69 }
70
71 /*
72 * write an underline under a section
73 * or chapter so we can find it later.
74 */
75
write_underline(int len,int space,char ch)76 void write_underline(int len, int space, char ch)
77 {
78 int loop;
79
80 printf("@c ");
81
82 for(loop=3; loop<space; loop++){
83 printf(" ");
84 }
85
86 while(len--){
87 printf("%c",ch);
88 }
89 printf("\n\n");
90 }
91
92 /*
93 * check for texinfo special characters
94 * and escape them
95 */
96
check_and_convert(char * string)97 char *check_and_convert(char *string)
98 {
99 int buffpos = 0;
100 int len,loop;
101
102 len = strlen(string);
103 for(loop=0; loop<len; loop++){
104 if(string[loop] == '@' || string[loop] == '{' || string[loop] == '}'){
105 buffer[buffpos++] = '@';
106 buffer[buffpos++] = string[loop];
107 } else {
108 buffer[buffpos++] = string[loop];
109 }
110 }
111 buffer[buffpos] = '\0';
112 return(buffer);
113 }
114
115 /*
116 * write out a chapter,section, or subsection
117 * header
118 */
119
write_block_header(char * type)120 void write_block_header(char *type)
121 {
122 int loop;
123 int len;
124
125 (void)check_and_convert(yytext);
126 len = strlen(buffer);
127 for(loop=0; buffer[loop] != '\n';loop++)
128 ;
129 buffer[loop] = '\0';
130 printf("%s %s\n",type,buffer);
131 write_underline(strlen(buffer),strlen(type)+1,'*');
132 }
133
134 %}
135
136 /*
137 * the flex description starts here
138 */
139
140 %x HEADING EXAMPLE ENUM EXAMPLE2
141 %x BITEM BITEM_ITEM
142 %s LITEM LITEM2
143
144 %%
145
146 ^#[^#]*"#" /* skip the header & trailer */
147 /* chapters have asterisks under them
148 * and are terminated by a colon
149 */
150 ^[^\n:]+\n[*]+\n write_block_header(CHAPTER);
151
152 ^"= "[A-Z]" ="\n"="* { /* we create a seciton for each category */
153 if(need_closing == TRUE){
154 printf("@end table\n\n\n");
155 }
156 need_closing = TRUE;
157 write_block_header(SECTION);
158 printf("\n\n@table @b\n");
159 }
160
161 "Examples:"[^\.]+ ECHO;
162
163 "*"[^*\n]+"*" { /* @emph{}(emphasized) text */
164 yytext[yyleng-1] = '\0';
165 (void)check_and_convert(&yytext[1]);
166 printf("@i{%s}",buffer);
167 }
168
169 "{{"[^}]+"}}" { /* special emphasis */
170 yytext[yyleng-2] = '\0';
171 (void)check_and_convert(&yytext[2]);
172 printf("@b{%s}",buffer);
173 }
174
175 "{"[^}]+"}" { /* special emphasis */
176 yytext[yyleng-1] = '\0';
177 (void)check_and_convert(&yytext[1]);
178 printf("@b{%s}",buffer);
179 }
180
181 /* escape some special texinfo characters */
182 <INITIAL,LITEM,LITEM2,BITEM,ENUM,EXAMPLE,EXAMPLE2>"@" printf("@@");
183 <INITIAL,LITEM,LITEM2,BITEM,ENUM,EXAMPLE,EXAMPLE2>"{" printf("@{");
184 <INITIAL,LITEM,LITEM2,BITEM,ENUM,EXAMPLE,EXAMPLE2>"}" printf("@}");
185
186 /*
187 * reproduce @example code
188 */
189
190 ":"\n+[^\n0-9*]+\n" "[^ ] {
191 int loop;
192 int len;
193 int cnt;
194
195 printf(":\n\n@example \n");
196 strcpy(buffer,yytext);
197 len = strlen(buffer);
198 cnt = 0;
199 for(loop=len; loop > 0;loop--){
200 if(buffer[loop] == '\n')
201 cnt++;
202 if(cnt == 2)
203 break;
204 }
205 yyless(loop+1);
206 statep++;
207 states[statep] = EXAMPLE2;
208 BEGIN(EXAMPLE2);
209 }
210 <EXAMPLE,EXAMPLE2>^\n {
211 printf("@end example\n\n");
212 statep--;
213 BEGIN(states[statep]);
214 }
215
216 /*
217 * repoduce @enumerate lists
218 */
219
220 ":"\n+[ \t]*[0-9]+"." {
221 int loop;
222 int len;
223
224 printf(":\n\n@enumerate \n");
225 strcpy(buffer,yytext);
226 len = strlen(buffer);
227 for(loop=len; loop > 0;loop--){
228 if(buffer[loop] == '\n')
229 break;
230 }
231 yyless(loop);
232 statep++;
233 states[statep] = ENUM;
234 BEGIN(ENUM);
235 }
236
237 <ENUM>"@" printf("@@");
238 <ENUM>":"\n+" "[^0-9] {
239 printf(":\n\n@example\n");
240 statep++;
241 states[statep] = EXAMPLE;
242 BEGIN(EXAMPLE);
243 }
244
245
246 <ENUM>\n[ \t]+[0-9]+"." {
247 printf("\n\n@item ");
248 }
249 <ENUM>^[^ ] |
250 <ENUM>\n\n\n[ \t]+[^0-9] {
251 printf("\n\n@end enumerate\n\n");
252 statep--;
253 BEGIN(states[statep]);
254 }
255
256 /*
257 * reproduce one kind of @itemize list
258 */
259
260 ":"\n+":" {
261 int loop;
262 int len;
263
264 printf(":\n\n@itemize @bullet \n");
265 yyless(2);
266 statep++;
267 states[statep] = LITEM2;
268 BEGIN(LITEM2);
269 }
270 <LITEM2>^":".+":" {
271 (void)check_and_convert(&yytext[1]);
272 buffer[strlen(buffer)-1]='\0';
273 printf("@item @b{%s:}\n",buffer);
274 }
275
276 <LITEM2>\n\n\n+[^:\n] {
277 printf("\n\n@end itemize\n\n");
278 ECHO;
279 statep--;
280 BEGIN(states[statep]);
281 }
282
283 /*
284 * create a list out of the revision history part.
285 * We need the "Version" for this because it
286 * clashes with other rules otherwise.
287 */
288
289 :[\n]+"Version"[^:\n*]+":" {
290 int loop;
291 int len;
292
293 printf(":\n\n@itemize @bullet \n");
294 strcpy(buffer,yytext);
295 len = strlen(buffer);
296 for(loop=len; loop > 0;loop--){
297 if(buffer[loop] == '\n')
298 break;
299 }
300 yyless(loop);
301 statep++;
302 states[statep] = LITEM;
303 BEGIN(LITEM);
304 }
305 <LITEM>^.+":" {
306 (void)check_and_convert(yytext);
307 buffer[strlen(buffer)-1]='\0';
308 printf("@item @b{%s}\n\n",buffer);
309 }
310
311 <LITEM>^[^:\n]+\n\n[^:\n]+\n {
312 int loop;
313
314 strcpy(buffer,yytext);
315 for(loop=0; buffer[loop] != '\n'; loop++);
316 buffer[loop] = '\0';
317 printf("%s\n",buffer);
318 printf("@end itemize\n\n");
319 printf("%s",&buffer[loop+1]);
320 statep--;
321 BEGIN(states[statep]);
322 }
323
324 /*
325 * reproduce @itemize @bullet lists
326 */
327
328 ":"\n[ ]*"*" {
329 int loop;
330 int len;
331
332 printf(":\n\n@itemize @bullet \n");
333 len = strlen(buffer);
334 for(loop=0; loop < len;loop++){
335 if(buffer[loop] == '\n')
336 break;
337 }
338 yyless((len-loop)+2);
339 statep++;
340 states[statep] = BITEM;
341 BEGIN(BITEM);
342 }
343
344 <BITEM>^" "*"*" {
345 printf("@item");
346 statep++;
347 states[statep] = BITEM_ITEM;
348 BEGIN(BITEM_ITEM);
349 }
350 <BITEM>"@" printf("@@");
351 <BITEM>^\n {
352 printf("@end itemize\n\n");
353 statep--;
354 BEGIN(states[statep]);
355 }
356 <BITEM_ITEM>[^\:]* {
357 printf(" @b{%s}\n\n",check_and_convert(yytext));
358 }
359 <BITEM_ITEM>":" {
360 statep--;
361 BEGIN(states[statep]);
362 }
363
364 /*
365 * recreate @chapter, @section etc.
366 */
367
368 ^:[^:]* {
369 (void)check_and_convert(&yytext[1]);
370 statep++;
371 states[statep] = HEADING;
372 BEGIN(HEADING);
373 }
374 <HEADING>:[^\n] {
375 printf("@item @b{%s}\n",buffer);
376 write_underline(strlen(buffer),6,'~');
377 statep--;
378 BEGIN(states[statep]);
379 }
380 <HEADING>:\n"*"* {
381 if(need_closing == TRUE){
382 printf("@end table\n\n\n");
383 need_closing = FALSE;
384 }
385 printf("@chapter %s\n",buffer);
386 write_underline(strlen(buffer),9,'*');
387 statep--;
388 BEGIN(states[statep]);
389 }
390 <HEADING>:\n"="* {
391 if(need_closing == TRUE){
392 printf("@end table\n\n\n");
393 need_closing = FALSE;
394 }
395 printf("@section %s\n",buffer);
396 write_underline(strlen(buffer),9,'=');
397 statep--;
398 BEGIN(states[statep]);
399 }
400 <HEADING>"@" printf("@@");
401 <HEADING>:\n"-"* {
402 if(need_closing == TRUE){
403 printf("@end table\n\n\n");
404 need_closing = FALSE;
405 }
406 printf("@subsection %s\n",buffer);
407 write_underline(strlen(buffer),12,'-');
408 statep--;
409 BEGIN(states[statep]);
410 }
411
412 /*
413 * recreate @example text
414 */
415
416 ^" " {
417 printf("@example\n");
418 statep++;
419 states[statep] = EXAMPLE;
420 BEGIN(EXAMPLE);
421 }
422 <EXAMPLE>^" "
423 . ECHO;
424
425 %%
426
427 /*
428 * initialise and go.
429 */
430
431 int main(int argc, char *argv[])
432 {
433 states[0] = INITIAL;
434 statep = 0;
435 print_header();
436 yylex();
437 print_trailer();
438 return(0);
439 }
440
441
442
443