/*
 * c.PascalDT
 * ~~~~~~~~~~
 * Desktop interface to Acorn's ISO Pascal (Release 2)
 * see ReadMe file for notes on how it works
 *
 * by Carol Haynes
 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "os.h"

int w_count=0, e_count=0, s_count=0;

int throwback=0; /* Flag to note if -throwback is command line option */
int logopt   =0; /* Flag to note if -LO is a command line option      */
int firsttime=1; /* flag for checking whether to initialise throwback */
int errorcode=0; /* Provide exit code from PascalDT
                  * values are 0 - no error, 1 - errors, 2 - severe errors
                  */
void throwback_senderror(char *filename,int line_number,
                         char *message,int how_severe)
{
  if (throwback==0) return; /* ie. only react if throwback is requested */

  if (firsttime==1)
   { os_swi0(0x42587);
     (void *) os_swi6(0x42588,0,0,(int) filename,0,0,0);
     firsttime=0;
   }
  (void *) os_swi6(0x42588,1,0,(int) filename,line_number,
                                how_severe,(int) message);
  if (errorcode<how_severe) errorcode=how_severe;
}

int main(int argc,char **argv)
{
  int  lnum, i;
  char cmdline[4096], m0[4096], m1[4096], m2[4096]; /* Various buffers */
  FILE *f;

  strcpy(cmdline,"Pascal"); /* Invoke the real compiler */
  for (i=1 ; i<argc ; i++)  /* Build command line */
    {
      if (strcmp(argv[i],"-throwback")==0) throwback=1;
      else 
       {
         if (strcmp(argv[i],"-LO")==0) logopt=1;
         else {
               strcat(cmdline," ");
               strcat(cmdline,argv[i]);
              }
       }
    }

   strcat(cmdline," { > <Wimp$ScrapDir>.PascalDTMP }"); /* direct to scrap file */

   printf("ISO Pascal Desktop & Throwback Interface\n\n%s\n\n",cmdline);

   system(cmdline);                  /* run compiler                    */

   f = fopen("<Wimp$ScrapDir>.PascalDTMP","r");

   while (!feof(f))
     {
      fgets(m2,4096,f);
      printf("%s",m2); /* display text in window */
 
      switch (m2[1]) 
        { 
         case '*' : 
          switch (m2[2]) 
           { case 'E' :if (m1[6]!=' ') sscanf(m1,"%d",&lnum);
                       else sscanf(m0,"%d",&lnum);
                       throwback_senderror(argv[1],lnum,m2+8,1);
                       e_count++;
                       break;
             case 'F' :if (m1[6]!=' ') sscanf(m1,"%d",&lnum);
                       else sscanf(m0,"%d",&lnum);
                       throwback_senderror(argv[1],lnum,m2+14,2);
                       s_count++;
                       break;
             default  :break;
           }
           break;
         case 'W' : if (m1[6]!=' ') sscanf(m1,"%d",&lnum);
                    else sscanf(m0,"%d",&lnum);
                    throwback_senderror(argv[1],lnum,m2+9,0);
                    w_count++;
                    break;
         default  : break;
        }
        strcpy(m0,m1);
        strcpy(m1,m2);
     }
   fclose(f);

   remove("<Wimp$ScrapDir>.PascalDTMP");

  if (firsttime==0) os_swi0(0x42589); /* Shutdown throwback if started */

  if (logopt==1)
   {
     printf("\nCompilation Log:\n~~~~~~~~~~~~~~~~\n");
     printf("%3d Warning(s)\n%3d Error(s)\n%3d Fatal Error(s)\n",
              w_count,e_count,s_count);
   }

  if ( (f=fopen(argv[argc-1],"r"))!=NULL )
    {
      fclose(f);
      strcpy(cmdline,"Stamp ");
      strcat(cmdline,argv[argc-1]);
      system(cmdline);
    }
  return errorcode;
}
