| /* |
| * j2t.lex : An example of the use (possibly abuse!) |
| * of start states. |
| */ |
| |
| %{ |
| #define MAX_STATES 1024 |
| #define TRUE 1 |
| #define FALSE 0 |
| |
| #define CHAPTER "@chapter" |
| #define SECTION "@section" |
| #define SSECTION "@subsection" |
| #define SSSECTION "@subsubsection" |
| |
| int states[MAX_STATES]; |
| int statep = 0; |
| |
| int need_closing = FALSE; |
| |
| char buffer[YY_BUF_SIZE]; |
| |
| extern char *yytext; |
| |
| /* |
| * set up the head of the *.texinfo file the program |
| * will produce. This is a standard texinfo header. |
| */ |
| |
| void print_header(void) |
| { |
| printf("\\input texinfo @c -*-texinfo-*-\n"); |
| printf("@c %c**start of header\n",'%'); |
| printf("@setfilename jargon.info\n"); |
| printf("@settitle The New Hackers Dictionary\n"); |
| printf("@synindex fn cp\n"); |
| printf("@synindex vr cp\n"); |
| printf("@c %c**end of header\n",'%'); |
| printf("@setchapternewpage odd\n"); |
| printf("@finalout\n"); |
| printf("@c @smallbook\n"); |
| printf("\n"); |
| printf("@c ==========================================================\n\n"); |
| printf("@c This file was produced by j2t. Any mistakes are *not* the\n"); |
| printf("@c fault of the jargon file editors. \n"); |
| printf("@c ==========================================================\n\n"); |
| printf("@titlepage\n"); |
| printf("@title The New Hackers Dictionary\n"); |
| printf("@subtitle Version 2.9.10\n"); |
| printf("@subtitle Generated by j2t\n"); |
| printf("@author Eric S. Raymond, Guy L. Steel, Mark Crispin et al.\n"); |
| printf("@end titlepage\n"); |
| printf("@page\n"); |
| printf("\n@c ==========================================================\n"); |
| printf("\n\n"); |
| printf("@unnumbered Preface\n"); |
| printf("@c *******\n"); |
| } |
| |
| /* |
| * create the tail of the texinfo file produced. |
| */ |
| |
| void print_trailer(void) |
| { |
| printf("\n@c ==========================================================\n"); |
| printf("@contents\n"); /* print the table of contents */ |
| printf("@bye\n\n"); |
| } |
| |
| /* |
| * write an underline under a section |
| * or chapter so we can find it later. |
| */ |
| |
| void write_underline(int len, int space, char ch) |
| { |
| int loop; |
| |
| printf("@c "); |
| |
| for(loop=3; loop<space; loop++){ |
| printf(" "); |
| } |
| |
| while(len--){ |
| printf("%c",ch); |
| } |
| printf("\n\n"); |
| } |
| |
| /* |
| * check for texinfo special characters |
| * and escape them |
| */ |
| |
| char *check_and_convert(char *string) |
| { |
| int buffpos = 0; |
| int len,loop; |
| |
| len = strlen(string); |
| for(loop=0; loop<len; loop++){ |
| if(string[loop] == '@' || string[loop] == '{' || string[loop] == '}'){ |
| buffer[buffpos++] = '@'; |
| buffer[buffpos++] = string[loop]; |
| } else { |
| buffer[buffpos++] = string[loop]; |
| } |
| } |
| buffer[buffpos] = '\0'; |
| return(buffer); |
| } |
| |
| /* |
| * write out a chapter,section, or subsection |
| * header |
| */ |
| |
| void write_block_header(char *type) |
| { |
| int loop; |
| int len; |
| |
| (void)check_and_convert(yytext); |
| len = strlen(buffer); |
| for(loop=0; buffer[loop] != '\n';loop++) |
| ; |
| buffer[loop] = '\0'; |
| printf("%s %s\n",type,buffer); |
| write_underline(strlen(buffer),strlen(type)+1,'*'); |
| } |
| |
| %} |
| |
| /* |
| * the flex description starts here |
| */ |
| |
| %x HEADING EXAMPLE ENUM EXAMPLE2 |
| %x BITEM BITEM_ITEM |
| %s LITEM LITEM2 |
| |
| %% |
| |
| ^#[^#]*"#" /* skip the header & trailer */ |
| /* chapters have asterisks under them |
| * and are terminated by a colon |
| */ |
| ^[^\n:]+\n[*]+\n write_block_header(CHAPTER); |
| |
| ^"= "[A-Z]" ="\n"="* { /* we create a seciton for each category */ |
| if(need_closing == TRUE){ |
| printf("@end table\n\n\n"); |
| } |
| need_closing = TRUE; |
| write_block_header(SECTION); |
| printf("\n\n@table @b\n"); |
| } |
| |
| "Examples:"[^\.]+ ECHO; |
| |
| "*"[^*\n]+"*" { /* @emph{}(emphasized) text */ |
| yytext[yyleng-1] = '\0'; |
| (void)check_and_convert(&yytext[1]); |
| printf("@i{%s}",buffer); |
| } |
| |
| "{{"[^}]+"}}" { /* special emphasis */ |
| yytext[yyleng-2] = '\0'; |
| (void)check_and_convert(&yytext[2]); |
| printf("@b{%s}",buffer); |
| } |
| |
| "{"[^}]+"}" { /* special emphasis */ |
| yytext[yyleng-1] = '\0'; |
| (void)check_and_convert(&yytext[1]); |
| printf("@b{%s}",buffer); |
| } |
| |
| /* escape some special texinfo characters */ |
| <INITIAL,LITEM,LITEM2,BITEM,ENUM,EXAMPLE,EXAMPLE2>"@" printf("@@"); |
| <INITIAL,LITEM,LITEM2,BITEM,ENUM,EXAMPLE,EXAMPLE2>"{" printf("@{"); |
| <INITIAL,LITEM,LITEM2,BITEM,ENUM,EXAMPLE,EXAMPLE2>"}" printf("@}"); |
| |
| /* |
| * reproduce @example code |
| */ |
| |
| ":"\n+[^\n0-9*]+\n" "[^ ] { |
| int loop; |
| int len; |
| int cnt; |
| |
| printf(":\n\n@example \n"); |
| strcpy(buffer,yytext); |
| len = strlen(buffer); |
| cnt = 0; |
| for(loop=len; loop > 0;loop--){ |
| if(buffer[loop] == '\n') |
| cnt++; |
| if(cnt == 2) |
| break; |
| } |
| yyless(loop+1); |
| statep++; |
| states[statep] = EXAMPLE2; |
| BEGIN(EXAMPLE2); |
| } |
| <EXAMPLE,EXAMPLE2>^\n { |
| printf("@end example\n\n"); |
| statep--; |
| BEGIN(states[statep]); |
| } |
| |
| /* |
| * repoduce @enumerate lists |
| */ |
| |
| ":"\n+[ \t]*[0-9]+"." { |
| int loop; |
| int len; |
| |
| printf(":\n\n@enumerate \n"); |
| strcpy(buffer,yytext); |
| len = strlen(buffer); |
| for(loop=len; loop > 0;loop--){ |
| if(buffer[loop] == '\n') |
| break; |
| } |
| yyless(loop); |
| statep++; |
| states[statep] = ENUM; |
| BEGIN(ENUM); |
| } |
| |
| <ENUM>"@" printf("@@"); |
| <ENUM>":"\n+" "[^0-9] { |
| printf(":\n\n@example\n"); |
| statep++; |
| states[statep] = EXAMPLE; |
| BEGIN(EXAMPLE); |
| } |
| |
| |
| <ENUM>\n[ \t]+[0-9]+"." { |
| printf("\n\n@item "); |
| } |
| <ENUM>^[^ ] | |
| <ENUM>\n\n\n[ \t]+[^0-9] { |
| printf("\n\n@end enumerate\n\n"); |
| statep--; |
| BEGIN(states[statep]); |
| } |
| |
| /* |
| * reproduce one kind of @itemize list |
| */ |
| |
| ":"\n+":" { |
| int loop; |
| int len; |
| |
| printf(":\n\n@itemize @bullet \n"); |
| yyless(2); |
| statep++; |
| states[statep] = LITEM2; |
| BEGIN(LITEM2); |
| } |
| <LITEM2>^":".+":" { |
| (void)check_and_convert(&yytext[1]); |
| buffer[strlen(buffer)-1]='\0'; |
| printf("@item @b{%s:}\n",buffer); |
| } |
| |
| <LITEM2>\n\n\n+[^:\n] { |
| printf("\n\n@end itemize\n\n"); |
| ECHO; |
| statep--; |
| BEGIN(states[statep]); |
| } |
| |
| /* |
| * create a list out of the revision history part. |
| * We need the "Version" for this because it |
| * clashes with other rules otherwise. |
| */ |
| |
| :[\n]+"Version"[^:\n*]+":" { |
| int loop; |
| int len; |
| |
| printf(":\n\n@itemize @bullet \n"); |
| strcpy(buffer,yytext); |
| len = strlen(buffer); |
| for(loop=len; loop > 0;loop--){ |
| if(buffer[loop] == '\n') |
| break; |
| } |
| yyless(loop); |
| statep++; |
| states[statep] = LITEM; |
| BEGIN(LITEM); |
| } |
| <LITEM>^.+":" { |
| (void)check_and_convert(yytext); |
| buffer[strlen(buffer)-1]='\0'; |
| printf("@item @b{%s}\n\n",buffer); |
| } |
| |
| <LITEM>^[^:\n]+\n\n[^:\n]+\n { |
| int loop; |
| |
| strcpy(buffer,yytext); |
| for(loop=0; buffer[loop] != '\n'; loop++); |
| buffer[loop] = '\0'; |
| printf("%s\n",buffer); |
| printf("@end itemize\n\n"); |
| printf("%s",&buffer[loop+1]); |
| statep--; |
| BEGIN(states[statep]); |
| } |
| |
| /* |
| * reproduce @itemize @bullet lists |
| */ |
| |
| ":"\n[ ]*"*" { |
| int loop; |
| int len; |
| |
| printf(":\n\n@itemize @bullet \n"); |
| len = strlen(buffer); |
| for(loop=0; loop < len;loop++){ |
| if(buffer[loop] == '\n') |
| break; |
| } |
| yyless((len-loop)+2); |
| statep++; |
| states[statep] = BITEM; |
| BEGIN(BITEM); |
| } |
| |
| <BITEM>^" "*"*" { |
| printf("@item"); |
| statep++; |
| states[statep] = BITEM_ITEM; |
| BEGIN(BITEM_ITEM); |
| } |
| <BITEM>"@" printf("@@"); |
| <BITEM>^\n { |
| printf("@end itemize\n\n"); |
| statep--; |
| BEGIN(states[statep]); |
| } |
| <BITEM_ITEM>[^\:]* { |
| printf(" @b{%s}\n\n",check_and_convert(yytext)); |
| } |
| <BITEM_ITEM>":" { |
| statep--; |
| BEGIN(states[statep]); |
| } |
| |
| /* |
| * recreate @chapter, @section etc. |
| */ |
| |
| ^:[^:]* { |
| (void)check_and_convert(&yytext[1]); |
| statep++; |
| states[statep] = HEADING; |
| BEGIN(HEADING); |
| } |
| <HEADING>:[^\n] { |
| printf("@item @b{%s}\n",buffer); |
| write_underline(strlen(buffer),6,'~'); |
| statep--; |
| BEGIN(states[statep]); |
| } |
| <HEADING>:\n"*"* { |
| if(need_closing == TRUE){ |
| printf("@end table\n\n\n"); |
| need_closing = FALSE; |
| } |
| printf("@chapter %s\n",buffer); |
| write_underline(strlen(buffer),9,'*'); |
| statep--; |
| BEGIN(states[statep]); |
| } |
| <HEADING>:\n"="* { |
| if(need_closing == TRUE){ |
| printf("@end table\n\n\n"); |
| need_closing = FALSE; |
| } |
| printf("@section %s\n",buffer); |
| write_underline(strlen(buffer),9,'='); |
| statep--; |
| BEGIN(states[statep]); |
| } |
| <HEADING>"@" printf("@@"); |
| <HEADING>:\n"-"* { |
| if(need_closing == TRUE){ |
| printf("@end table\n\n\n"); |
| need_closing = FALSE; |
| } |
| printf("@subsection %s\n",buffer); |
| write_underline(strlen(buffer),12,'-'); |
| statep--; |
| BEGIN(states[statep]); |
| } |
| |
| /* |
| * recreate @example text |
| */ |
| |
| ^" " { |
| printf("@example\n"); |
| statep++; |
| states[statep] = EXAMPLE; |
| BEGIN(EXAMPLE); |
| } |
| <EXAMPLE>^" " |
| . ECHO; |
| |
| %% |
| |
| /* |
| * initialise and go. |
| */ |
| |
| int main(int argc, char *argv[]) |
| { |
| states[0] = INITIAL; |
| statep = 0; |
| print_header(); |
| yylex(); |
| print_trailer(); |
| return(0); |
| } |
| |
| |
| |