#include <exec/types.h>
#include <exec/memory.h>
#include <libraries/dos.h>
#include <stdio.h>
#include <fcntl.h>

UBYTE AsciiKonvert[] = {
  0x09, 0x09, /* Tabulator */
  0x0a, 0x0a, /* LineFeed */
  0x0c, 0x0c, /* FormFeed */
  0x0d, ' ',  /* weichen Zeilenumbruch in Leerzeichen konvertieren*/
  0xad, 0x00, /* WP-Trennung nicht ausführen */
  0x8c, 0x0a, /* Seitenumbruch in LF */
  0xa9, '-',  /* - übernehmen */
  0xaa, '-',  /* - übernehmen */
  0x00, 0x00
};

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

UBYTE Buffer[200];

void SkipChars( long c ) {
  if( c < 0xc0 ) {
    /*
     * hierbei handelt es sich um ein Steuerzeichen, also keine
     * Sequenz. Es reicht, das Zeichen zu überspringen.
     */
    return;
  } else {
    /*
     * Es folgt eine Steuersequenz, die mit dem
     * Zeichen c eingeführt wird, aber auch mit dem
     * Zeichen c aufhört.
     */
    long newc;

    if( c == 0xcc || c == 0xe0 ) {
      /*
       * Einrückungen in Tabs umwandeln
       */
     putc(0x09, DateiOut);
    }

    while( 1 ) {
      newc= getc(DateiIn);
      if( newc == c )
        /*
         * OK, die Sequenz wurde komplett gelesen.
         */
        return;
    }

  }
}

/*
 * Überprüft das Zeichen auf die interen Liste zu konvertierender Zeichen
 */
char KonvertCharacter( long c ) {
  long count=0;
  UBYTE check=AsciiKonvert[count];
  char ret=0;

  while( 1 ) {
    if( check == (UBYTE)c ) {
      /*
       * OK, das Zeichen ist zu konvertieren
       */
      ret=1;
      if( AsciiKonvert[count+1] != 0x0 ) {
        if( putc(AsciiKonvert[count+1], DateiOut) == EOF) {
          printf("Schreibfehler\n");
          ret=-1;
        }
      }
      break;
    }
    count+=2;
    check=AsciiKonvert[count];
    if( check == 0x0 )
      break;
  }

  return ret;
}

void Scan_WPFile() {
  long c;
  char ret;

  while( (c = getc(DateiIn)) != EOF ) {

    if( c == 0xe1 ) { /* es folgt ein Sonderzeichen */ 
      c=getc(DateiIn);
      if( putc(c, DateiOut) == EOF) {
        printf("Schreibfehler\n");
        return;
      }

      /*
       * nächstes 0xe1 holen
       */
      c=getc(DateiIn);

    } else if( c >= ' ' && c <= '~' ) {
      /*
       * normales ASCII-Zeichen, also übernehmen
       */
      if( putc(c, DateiOut) == EOF) {
        printf("Schreibfehler\n");
        return;
      }
    } else if( (ret=KonvertCharacter(c)) == 0 ) {
      /*
       * Also muß es sich um ein Steuerzeichen
       * handeln, daß nicht zu konvertieren ist
       */
      SkipChars( c );
    } else if( ret == -1 ) {
      /*
       * Schreibfehler bei KonvertCharacter aufgetreten
       */
      return;
    }
  }
}

BOOL Check_If_WPFile() {
  /*
   * Die ersten 2 Bytes lesen
   */
  long readbytes=fread(&Buffer[0],1,2,DateiIn);

  if( readbytes == 2 ) {
    if( Buffer[0]==0x80 && Buffer[1] == 0x80 ) {
      fseek(DateiIn,0,0);
      return TRUE;
    }
  }
  return FALSE;
}

long main(long argc, char **argv) {
  long error=0;

  if( argc == 3 ) {

    DateiIn=fopen(argv[1],"rb");

    if( DateiIn ) {
      if( Check_If_WPFile() ) {
        DateiOut=fopen(argv[2],"wb");
        if( DateiOut ) {
          Scan_WPFile();
          fclose( DateiOut );
        } else {
          printf("Die Datei %s ließ sich nicht erzeugen!\n",argv[2]);
          error=16;
        }
      } else {
        error=15;
        printf("Die Datei %s ist keine WordPerfect-Datei\n",argv[1]);
      }
      fclose( DateiIn );
    } else {
      error=10;
      printf("Die Datei %s ließ sich nicht zum Lesen öffnen\n",argv[1]);
    }

  } else if( argc ) {
    /*
     * OK, vom CLI gestartet, bloß die Anzahl der Argumente stimmt nicht
     */
    printf("\nGeschrieben von Rainer Zeitler\n"
           "\nDieses Programm filtert den Text aus einer WordPerfect-Datei\n"
           "und erzeugt eine ASCII-Datei!\n"
           "Aufruf: %s <WP-Dateiname> <ASCII-Dateiname>\n\n",argv[0]);
    error=5;
  }

  exit( error );
}
