// This sourcefile is created by Peter Jodda / peter@jodda.de
// It is under the Peter Jodda license:
// Everyboy may use it on his own risk. This header must stay in the file!
// If you expand this file, please contact me, that I can integrate the
// enhancemants in the original file.
//
// textkonvert.c 
// text-file generator

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

#define MAX_TEXT 10000
#define MAX_ZEILE 500
#define INDEX_SIZE 4



class einText
{
   public:
      int nummer;
      char name[255];
      char string[255];
      class einText* nachfolger;
      
};

class alteUmsetzung
{
   public:
      int nummer;
      char name[255];
      class alteUmsetzung *nachfolger;
};


char benutzt[MAX_TEXT];

//---------------------------------------------------------


einText *textWurzel,*textEnde;
int naechsteNummer;
alteUmsetzung *alteWurzel;

//---------------------------------------------------------

static void haengeNummerInListe(int nummer,char *text)
{
   einText *neuerText;

#ifdef DEBUG_AUSGABE   
   fprintf(stderr,"haenge in liste %d %s\n",nummer,text);   
#endif   
   // textelement erzeugen
   neuerText    = new einText;  

   neuerText->name[0]    = 0; 
   neuerText->nummer     = nummer;
   neuerText->nachfolger = NULL;
   strcpy(neuerText->string,text);
   
  
   // in liste einhaengen
   if(textWurzel==NULL)
   {
      // erste element
      textWurzel = textEnde = neuerText;
   }
   else 
   {
      // ans ende haengen
      textEnde->nachfolger = neuerText;      
      textEnde = neuerText;
   }

}

//---------------------------------------------------------

static void haengeSymbolInListe(char *symbol,char *text)
{
   einText *neuerText;

#ifdef DEBUG_AUSGABE   
   fprintf(stderr,"haenge in liste %d %s\n",nummer,text);   
#endif   
   // textelement erzeugen
   neuerText    = new einText;  

   neuerText->nummer     = -1;
   neuerText->nachfolger = NULL;
   strcpy(neuerText->name,symbol);
   strcpy(neuerText->string,text);
   
   
   // in liste einhaengen
   if(textWurzel==NULL)
   {
      // erste element
      textWurzel = textEnde = neuerText;
   }
   else 
   {
      // ans ende haengen
      textEnde->nachfolger = neuerText;      
      textEnde = neuerText;
   }

}

//---------------------------------------------------------

static void prozessNummerZeile(char *leseBuffer)
{
   int nummer;
   char *inBuffer,*inText;
   char text[MAX_ZEILE];
   
   inBuffer=leseBuffer;
   nummer =0;
   while(*inBuffer>='0' && *inBuffer<='9')
   {
      nummer=nummer*10 + (int)(*inBuffer - '0');
      inBuffer++;
   }
 
   benutzt[nummer]=1;
   
   
   while(*inBuffer !='\'' && *inBuffer !='\0')
      inBuffer++;
   if(*inBuffer =='\0')
      return;
   inBuffer ++;
   
   inText = text;
   while(*inBuffer !='\'' && *inBuffer !='\0')
   {
      *inText++ = *inBuffer++;
   }
   *inText ='\0';
   haengeNummerInListe(nummer,text);
}

//---------------------------------------------------------

static void prozessSymbolZeile(char *leseBuffer)
{
   char *inBuffer,*inText,*inSymbol;
   char text[MAX_ZEILE];
   char symbol[MAX_ZEILE];
   
   inBuffer=leseBuffer;
   inSymbol = symbol;
   while(*inBuffer!=' ' && *inBuffer>'!')
   {
      *inSymbol++ = *inBuffer++;
   }
   *inSymbol = '\0';
   
   while(*inBuffer !='\'' && *inBuffer !='\0')
      inBuffer++;
   if(*inBuffer =='\0')
      return;
   inBuffer ++;
   
   inText = text;
   while(*inBuffer !='\'' && *inBuffer !='\0')
   {
      *inText++ = *inBuffer++;
   }
   *inText ='\0';
   haengeSymbolInListe(symbol,text);
}

//---------------------------------------------------------

void leseTexte(char *dateiname)
{
   FILE *infile;
   char leseBuffer[MAX_ZEILE+1],*gelesen;

   infile = fopen(dateiname,"r");
   if(infile ==NULL)
      return ;

   gelesen = fgets(leseBuffer,MAX_ZEILE,infile);


   while(gelesen != NULL)
   {
      leseBuffer[MAX_ZEILE] = '\0';


      if(leseBuffer[0] >= '0' && leseBuffer[0] <= '9')
      {
         // ziffer am anfang, eine gueltige zeile
         prozessNummerZeile(leseBuffer);
      }
      else if(leseBuffer[0] >='A' && leseBuffer[0] <='Z')
      {
         // ein Buchstabe am anfang
         prozessSymbolZeile(leseBuffer);
      }

      // naechste zeile lesen 
      gelesen = fgets(leseBuffer,MAX_ZEILE,infile);
   }
   
         
   fclose(infile);
}

//---------------------------------------------------------
static void weiseNummernZu()
{
   einText *aktuell;
   
   aktuell=textWurzel;
   while(aktuell != NULL)
   {
      if(aktuell->name[0] != '\0' && aktuell->nummer == -1)
      {
fprintf(stderr,"neu ist %s\n",aktuell->name);      
         // nummer suchen
         while(benutzt[naechsteNummer] != 0)
            naechsteNummer++;
         aktuell->nummer = naechsteNummer;
         benutzt[naechsteNummer ] = 1;
                  
      }
   
      aktuell = aktuell->nachfolger;
   }
}

//---------------------------------------------------------

static void erzeugeAusgabe(char *textName,char *defineName)
{
   FILE *textFile,*defineFile;
   einText *aktuell;
   
   textFile   = fopen(textName,"w");
   defineFile = fopen(defineName,"w");
   if(textFile ==NULL || defineFile == NULL)
   {
      return;
   }

   aktuell = textWurzel;
   while(aktuell != NULL)
   {
      if(aktuell->name[0] != '\0')
      {
         fprintf(defineFile,"#define %s %d\n",aktuell->name,aktuell->nummer);
      }
      
      fprintf(textFile,"%05d '%s'\n",aktuell->nummer,aktuell->string);
      
      aktuell = aktuell->nachfolger;
   }
   
   fclose (textFile);
   fclose(defineFile);
}

//----------------------------------------------------------------

static void leseAlteUmsetzungen(char *defineName)
{ 
   FILE *defineFile;
   char leseBuffer[MAX_ZEILE+1],*gelesen;
   alteUmsetzung * alt;

   defineFile =fopen(defineName,"r");
   if(defineFile ==NULL)
      return;
   gelesen = fgets(leseBuffer,MAX_ZEILE,defineFile);


   while(gelesen != NULL)
   {
      leseBuffer[MAX_ZEILE] = '\0';
      
      while(*gelesen != ' ' && *gelesen !='\0')
         gelesen++;
         
      if(*gelesen =='\0')
         break;
      
      alt = new alteUmsetzung;

      sscanf(gelesen,"%s %d",alt->name,&alt->nummer);
      

      alt->nachfolger =alteWurzel;
      alteWurzel = alt;

      gelesen = fgets(leseBuffer,MAX_ZEILE,defineFile);
   }   
   fclose(defineFile);
}


//----------------------------------------------------------------

static void versucheAlte()
{
   einText *aktuell;
   
   aktuell=textWurzel;
   while(aktuell != NULL)
   {
      if(aktuell->name[0] != '\0')
      {
         alteUmsetzung * alte;
         alte=alteWurzel;
         while(alte != NULL)
         {
            if(strcmp(aktuell->name,alte->name)==0)
            {
               // war schon vorher mal da
               
               if(benutzt[alte->nummer] ==0)
               {
                  benutzt[alte->nummer] = 1;
                  aktuell->nummer = alte->nummer;
               }
               
               break;
            }
            alte = alte->nachfolger;
         }
                  
      }
   
      aktuell = aktuell->nachfolger;
   }
}
//----------------------------------------------------------------

int main(int anzahl, char *zeichen[])
{
   int i;
   if(anzahl <4)
      return -1;

   for(i=0;i<MAX_TEXT;i++)
      benutzt[i] =0;

   // ein paar inititalisierungen
   textWurzel       = NULL;
   textEnde         = NULL;
   naechsteNummer   = 0;
   alteWurzel       = NULL;
      
   leseTexte(zeichen[1]); // texte einlesen

   leseAlteUmsetzungen(zeichen[3]);


   versucheAlte();

   weiseNummernZu();

   erzeugeAusgabe(zeichen[2],zeichen[3]);

   return 0;
}
