/********************** ErrConvert.c ******************************
 
Programm zur Konvertierung der Ausgabe des Lattice Compilers in das
spezielle Format zur Fehlerbehandlung von TKEd.

Der Compiler muß mit "lc >T:Err -L <Programm>" gestartet werden.
Dieses Programm kovertiert die Datei nach "Ram:TKErr".
Man erstellt am besten ein Script, welches beide Schritte erledigt, und
bindet dieses in ein User-Menü von TKEd ein.

Programm von:

  Christoph Kirsch
  Holstenhofweg 85
  2000 Hamburg 70
  
*******************************************************************/

#include <exec/types.h>
#include <string.h>
#include <stdio.h>

FILE *inh,*outh;

/******* ReadHeader ließt den Kopf der Ausgabe von Lattice *******/

void ReadHeader()
{
  char z[80];
  
  do
  {
    fgets(z,89,inh);
  } while (strncmp(z,"Compiling",9) != 0);
}

/******* Convert ist die eigentliche Convertierungs-Routine *******/

void Convert()
{
  UBYTE s1[100],s2[100],spalt[6],zeile[6],meldung[80];
  BOOL ende;
  int lang1,spalte,i,j,zehner;
  
  ende = FALSE;
  do
  {
    if (fgets(s1,99,inh) == 0)                /* Zeile lesen */
      ende = TRUE;
    if ((strncmp(s1,"Module",6) == 0)         /* Ende der Fehler ? */
      ||(strncmp(s1,"\x0F",1) == 0)
      ||(strncmp(s1,"Execution",9) == 0)
      ||ende)
      ende = TRUE;                            /* Wenn ja, Job getan */
    else  
      {
        lang1 = strlen(s1);                   /* s1 = Programmzeile */
        if (fgets(s2,99,inh) == 0)
          ende = TRUE;                        /* Meldung lesen */
        if (!ende)
        {  
          spalte = 0;
          while (s1[spalte] > 31) spalte++;     /* Steuerzeichen suchen */
          if (spalte > lang1) spalte = lang1;   /* Unsinn verhindern */
          if (spalte >= 10)
          {
            zehner = spalte/10;                 /* Umwandlung der */
            spalt[1] = (spalte-zehner*10)+48;   /* Spalte in einen String */
            spalt[0] = zehner+48;
            spalt[2] = 0;
          }
          else
          {
            spalt[0] = spalte+48;
            spalt[1] = 0;
          }
          i = 0;
          while (s2[i] != 32) i++;              /* Zeilennummer suchen */
          i++;
          j = 0;
          while (s2[i] != 32)                   /* Ende der Zeilennummer */
          {                                     /* suchen und dabei */
            zeile[j] = s2[i];                   /* gleich kopieren */
            i++;
            j++;
          }
          zeile[j] = 0;
          i++;
          j = 0;                                /* Rest der Zeile ist */
          while (s2[i] != 0)                    /* die Fehlermeldung */
          {
            meldung[j] = s2[i];
            i++;
            j++;
          }
          meldung[j] = 0;
          printf("%s\n",meldung);
          strcat(spalt,"\n");
          strcat(zeile,"\n");
          fputs(zeile,outh);
          fputs(spalt,outh);
          fputs(meldung,outh);
        }  
      }
  } while (!ende);
}

/******* Hauptprogramm *******/

void main()
{
  if ( ! (inh = fopen("T:Err","r")))
    {
      printf("Kann T:Err nicht öffnen\n");
      Exit(5);
    }
  if ( ! (outh= fopen("RAM:TKErr","w")))
    {
      printf("Kann RAM:TKErr nicht öffnen\n");
      fclose(inh);  
      Exit(5);
    }  

  ReadHeader();
  Convert();
    
  fclose(outh);
  fclose(inh);  
}      
