/* This file is part of the origami distrubution. (Amiga Port)
 *
 * Source code written by Thomas Hadig in November 1991
 * Version : 1.6.42 alpha, June 1992
 * (C) 1992 by Thomas Hadig
 * may be distributed unchanged ! (see copyright notes)
 */
/* just a small awk hack !! */

/*{{{  #includes*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/*}}}  */
/*{{{  variables*/
FILE *fp=NULL;
char fs = '\000';
/*}}}  */

/*{{{  my_exit*/
void my_exit (int i)

 {
  if (fp) fclose (fp);
  exit (i);
 }
/*}}}  */

/*{{{  do_begin*/
void do_begin (void)

 {
  char p[256];

  if (!fgets (p,256,fp)) my_exit (4);
  while (strncmp (p,"}",1))
   {
    if (!strncmp (p,"  FS=\"",6))
     {
      fs = p[6];
     }
    else if ((strchr (p,'#'))&&(strchr (p,'#')<p+4)) {}
    else if (!strncmp (p,"  print \"",9))
     {
      (strchr (p+10,'\"'))[0]=0;
      printf ("  printf (\"%s\");\n",p+9);
     }
    else
     {
      if (p[strlen(p)-1]!=';')
        { p[strlen(p)]=0; p[strlen(p)-1]=';'; }
      printf ("%s\n",p);
     }
    if (!fgets (p,256,fp)) my_exit (4);
   }
 }
/*}}}  */
/*{{{  make_process*/
void make_process (void)

 {
  char p[256],*pp;
  int i,j;

  if (!fgets (p,256,fp)) my_exit (7);
  while (strncmp (p,"}",1))
   {
    if (*p!='#')
     {
      pp =p;
      j=0;
      while (pp = strchr (pp,'$')) {pp[0]='s'; pp++; i=pp[0]-48; if(i>j) j=i; }
      if (j>0) printf (
        "  if (max<%d) { fprintf (stderr,\"$number too high : %d !\"); exit();}\n",
        j,j);
      if (p[strlen(p)-1]!=';')
        { p[strlen(p)]=0; p[strlen(p)-1]=';'; }
      printf ("%s\n",p);
     }
    if (!fgets (p,256,fp)) my_exit (7);
   }
 }
/*}}}  */
/*{{{  do_end*/
void do_end (void)

 {
  char p[256];

  if (!fgets (p,256,fp)) my_exit (8);
  while (strncmp (p,"}",1))
   {
    if (p[strlen(p)-1]!=';')
      { p[strlen(p)]=0; p[strlen(p)-1]=';'; }
    printf ("%s\n",p);
    if (!fgets (p,256,fp)) my_exit (8);
   }
 }
/*}}}  */

/*{{{  main*/
int main (int argc, char **argv)

 {
  char p[256];

  /*{{{  argument check*/
  if (argc!=2)
   {
    fprintf (stderr,
       "Usage : %s filename\n %s will generate a c-file doing the\n%s",
        argv[0],argv[0],"thing awk should do !\n");
    exit (0);
   }
  /*}}}  */
  if (!(fp = fopen (argv[1],"r"))) my_exit (1);
  /*{{{  initialise*/
  printf ("#include <stdio.h>\n#include <string.h>\n");
  printf ("char *s[10],*s1,*s2,*s3,*s4,*s5,*s6,*s7,*s8,*s9,p[256];\n");
  printf ("FILE *fp;\nint max,x;\n\n");
  printf ("int get_line (void);\n\n");
  printf ("void main (int argc, char **argv)\n\n {\n");
  printf ("  if (argc!=2)\n   {\n");
  printf ("    printf (\"usage : %%s filename \\n\",argv[0]);\n");
  printf ("    exit (0);\n    }\n");
  printf ("  if (!(fp=fopen (argv[1],\"r\"))) exit (1);\n {\n");
  /*}}}  */
  if (!fgets (p,256,fp)) my_exit (2);
  if (!strncmp (p,"BEGIN {",7))
   /*{{{  BEGIN {*/
   {
    do_begin();
    if (!fgets (p,256,fp)) my_exit (3);
   }
   /*}}}  */
  printf ("  while (max=get_line()) {\n");
  if (!strncmp (p,"{",1))
   /*{{{  do every file line*/
   {
    make_process();
    if (!fgets (p,256,fp)) p[0]=0;
   }
   /*}}}  */
  printf (" }\n");
  if (!strncmp (p,"END {",5))
   /*{{{  END*/
   {
    do_end();
   }
   /*}}}  */
  else if (p[0]!=0)
   {
    fprintf (stderr, "unknown command in line : %s",p);
    my_exit (5);
   }
  if (fs=='\000')
   {
    /*{{{  end of file (get_line,main)*/
    printf (" }\n  fclose (fp);\n }\n\n");
    printf ("int get_line (void)\n {\n  char *pp;\n  int l=1;\n  int no_asc=0;\n\n");
    printf ("  if (!fgets (p,256,fp)) return 0;\n");
    printf ("  s[1]=pp=p;\n");
    printf ("  while (pp[0])\n");
    printf ("   {\n");
    printf ("    while (((!isspace(pp[0]))||no_asc)&&(pp[0])&&(pp[0]!=\'@\')) pp++;\n");
    printf ("    if (pp[0]==\'@\') no_asc=1;\n");
    printf ("    if (isspace(pp[0]))\n");
    printf ("     {\n");
    printf ("      pp[0]=0; pp++;\n");
    printf ("      while (isspace(pp[0])&&(pp[0])) pp++;\n");
    printf ("     }\n");
    printf ("    else {pp[0]=0; pp++;}\n");
    printf ("    while (isspace(s[l][strlen(s[l])-1])) s[l][strlen(s[l])-1]=0; /* skipping spaces at end of argument*/\n");
    printf ("    s[++l]=pp;\n");
    printf ("   }\n");
    printf ("  s[l][strlen(s[l])-1]=0; /* skipping CR */\n");
    printf ("  s1=s[1];s2=s[2];s3=s[3];s4=s[4];s5=s[5];s6=s[6];s7=s[7];\n");
    printf ("  s8=s[8];s9=s[9];\n");
    printf ("  return l;\n }\n\n");
    /*}}}  */
   }
  else
   {
    /*{{{  end of file (get_line,main)*/
    printf (" }\n  fclose (fp);\n }\n\n");
    printf ("int get_line (void)\n {\n  char p[256],*pp;\n  int l=1;\n\n");
    printf ("  if (!fgets (p,256,fp)) return 0;\n");
    printf ("  s[1]=pp=p;\n");
    printf ("  if (p[0]) while (pp = strchr(pp,'%c'))\n",fs);
    printf ("   { pp[0]=0;\n");
    printf ("     while (isspace(s[l][strlen(s[l])-1])) s[l][strlen(s[l])-1]=0; /* skipping spaces at end of argument*/\n");
    printf ("     s[++l]=++pp;\n");
    printf ("   }\n");
    printf ("  s[l][strlen(s[l])-1]=0; /* skipping CR */\n");
    printf ("  s1=s[1];s2=s[2];s3=s[3];s4=s[4];s5=s[5];s6=s[6];s7=s[7];\n");
    printf ("  s8=s[8];s9=s[9];\n");
    printf ("  return l;\n }\n\n");
    /*}}}  */
   }
  return 0;
 }
/*}}}  */
