Blame examples/manual/j2t.lex

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