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