Upload Tizen:Base source
[profile/ivi/flex.git] / examples / manual / j2t.lex
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
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
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
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
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
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