/*
 * Bitte vom Cli starten.
 */
#include <exec/types.h>
#include <exec/memory.h>
#include <libraries/dos.h>
#include <stdio.h>
#include <fcntl.h>

FILE *DateiOut=NULL;
FILE *DateiIn=NULL;

char EingabeDatei[80];
char AusgabeDatei[80];

/*
 * Struktur für den IFF-Header
 */
struct FTXT {
  char Form[4];
  long Size;
  char ID[4];
};

struct FTXT ftxt;

/*
 * Struktur für den CHRS-Chunk
 */
struct CHRS {
  char ID[4];
  long size;
};

struct CHRS chrs;

/*
 * Schreibt eine Textzeile in die Datei
 */
BOOL WriteMyText(char *string) {
  long writesize,length=strlen(string);

  strcpy(chrs.ID,"CHRS");
  chrs.size=length;

  writesize=fwrite((char *)&chrs,1,sizeof(struct CHRS),DateiOut);
  if( writesize == sizeof(struct CHRS) ) {
    writesize=fwrite(&string[0],1,length,DateiOut);
    if( writesize == length ) {
      if( length/2*2 != length ) {
        /*
         * Ungerade Anzahl Zeichen, also ein
         * PAD-Byte einfügen
         */
        writesize=fwrite(&string[0],1,1,DateiOut);
        if( writesize==1 )
          return TRUE;
        else {
          printf("Der Text konnte nicht geschrieben werden\n");
          return FALSE;
        }
      } else return TRUE;
    } else {
      printf("Der Text konnte nicht geschrieben werden\n");
      return FALSE;
    }
  } else {
    printf("Der Text konnte nicht geschrieben werden\n");
    return FALSE;
  }
}

/*
 * Erzeugt den Dateikopf. Diese Prozedur wird zweimal
 * aufgerufen. Einmal zu Beginn, ein zweitesmal am Schluß,
 * um die Dateigreöße einzutragen.
 */
BOOL WriteFTXTHeader() {
  long writesize;

  /*
   * An den Dateianfang
   */
  fseek(DateiOut,0,0);

  strcpy(ftxt.Form,"FORM");
  strcpy(ftxt.ID,"FTXT");
  writesize=fwrite((char *)&ftxt,1,sizeof(struct FTXT),DateiOut);
  if( writesize == sizeof(struct FTXT) )
    return TRUE;
  else {
    printf("Der Header konnte nicht geschrieben werden\n");
    return FALSE;
  }
}

/*
 * Öffnet die Eingabedatei
 */
FILE *MyOpenToRead(char *datei) {
  FILE *new=fopen(datei,"rb");

  if( new==NULL )
    printf("Die Datei %s konnte nicht geöffnet werden\n",datei);

  return new;
}

/*
 * Erzeugt die neue Datei
 */
FILE *MyOpenToWrite(char *datei) {
  FILE *new=fopen(datei,"wb");

  if( new==NULL )
    printf("Die Datei %s konnte nicht erstellt werden\n",datei);

  return new;
}

char Eingabebuffer[256];

/*
 * Hier wird die ASCII-Datei Zeile für Zeile gelesen
 * und in ein FTXT-Format konvertiert
 */
BOOL GenerateFTXT() {
  char *string;

  while( 1 ) {
    string=fgets(&Eingabebuffer[0],256,DateiIn);
    if( string!=NULL ) {
      if( WriteMyText(&Eingabebuffer[0]) == FALSE )
        return FALSE;
    } else return TRUE;
  }
}

/*
 * Bitte vom CLI/Shell starten
 */
main(long argc, char **argv) {
  long size;

  if( argc ) {
    printf("Name der den Text beinhalteten Datei?\n");
    gets(EingabeDatei);
    DateiIn=MyOpenToRead(EingabeDatei);
    if( DateiIn ) {
      printf("Name der zu erstellenden FTXT-Textdatei?\n");
      gets(AusgabeDatei);
      DateiOut=MyOpenToWrite(AusgabeDatei);
      if( DateiOut ) {

        /*
         * Den IFF-Header schreiben
         */
        if( WriteFTXTHeader() ) {
          if( GenerateFTXT() ) {
            /*
             * Größe der Datei ermitteln
             */
            size=ftell(DateiOut);

            /*
             * Eintragen der Größe in den Header abzüglich
             * den ersten 8 Byte
             */
            ftxt.Size=size-8;

            (void) WriteFTXTHeader();
          }
        }

        fclose( DateiOut );
      }
      fclose( DateiIn );
    }
  }
}

