/* AtoI - wandelt AMIGA-Textfiles in IBM-Textfiles um.
   Das Problem: Der IBM benutzt andere ASCII-Codes als der AMIGA. Dies macht
   sich vor allem bei den deutschen Umlauten und dem ß bemerkbar.
   Dieses Programm macht ein AMIGA-Textfile für die Übertragung zum IBM bereit.
   Syntax:
   AtoI <AMIGAfile> <IBMfile>
   <AMIGAfile> : Name des zu konvertierenden Files
   <IBMfile>   : Name des Ausgabefiles, das anschließend per AREAD vom IBM-
		 Emulator gelesen werden kann.

   23.3.1989 Tim Pietzcker Software
   Dieses Programm basiert auf dem Programm ItoA, das dieselbe Aufgabe in
   umgekehrter Richtung verrichtet. Im Wesentlichen mußten nur die Tabelle
   umgedreht und ein paar Texte geändert werden. So ergänzen sich die beiden
   Programme optimal.

   Kopieren, Ergänzen, Verstümmeln etc. erwünscht.
*/

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

#define CONVTBLENGTH 14		/* wenn die Tabelle erweitert wird, einfach
				   neue Anzahl hier eintragen */
#define BUFSIZE      4096l

struct Library    *OpenLibrary();
struct DosBase    *DosBase;
struct FileHandle *source,*dest,*Open();
UBYTE		  *buffer,*sourcename,*destname,*AllocMem();
UBYTE		  ConvTable[] =
		  /* links AMIGA,rechts IBM */
			{ 196,142,	/* Ä */
			  214,153,	/* Ö */
			  220,154,	/* Ü */
			  228,132,	/* ä */
			  246,148,	/* ö */
			  252,129,	/* ü */
			  223,225 };	/* ß */
LONG		  len;

open_files(src,dst)
UBYTE *src,*dst;
{
   source=Open(src,MODE_OLDFILE);
   if (source==NULL) 
   {
      printf("Unable to open source file : %s\n",src);
      get_out();
   }
   dest=Open(dst,MODE_NEWFILE);
   if (dest==NULL)
   {
      printf("Unable to open destination file : %s\n",dst);
      get_out();
   }
}

get_out()
{
   if (DosBase) CloseLibrary(DosBase);
   if (source)  Close(source);
   if (dest)    Close(dest);
   if (buffer)  FreeMem(buffer,BUFSIZE);
   exit(TRUE);
}

convert_block(buf,length) /* wandelt einen Block von BUFSIZE Bytes oder weniger
			     ins richtige Format um */
UBYTE *buf;
LONG length;
{
   UBYTE *ptr;
   LONG i;
   int j;
   for(ptr=buf,i=0;i<length;++i,++ptr)
      if(*ptr & 0x80) /* ASCII-Code > 128 ? */
         for(j=0;j < CONVTBLENGTH; j+=2)	/* Tabelle absuchen */
	    if(*ptr == ConvTable[j]) *ptr=ConvTable[j+1];

   i=Write(dest,buf,length);
   if (i<0)
   {
      printf("Error writing destination file !\n");
      get_out();
   }
}

convert_texts()
{
   long done=FALSE;
   while(done==FALSE)	/* solange, bis EOF erreicht */
   {
      len=Read(source,buffer,BUFSIZE);
      if (len<=0)	/* Error oder fertig ? */
      {
         if (len<0)
         {
            printf("Error reading source file !\n");
	    get_out();
         }
         done=TRUE;
      }   
      else
         convert_block(buffer,len);
   }
}

open_dos()
{
   DosBase=(struct DosBase *)OpenLibrary("dos.library",0l);
   if (DosBase==NULL) exit(FALSE);
   buffer=AllocMem(BUFSIZE,MEMF_CLEAR); 
   if (buffer==NULL)
   {
      printf("Out of Memory !\n");
      get_out();
   }
}

usage(filename)		/* erklärt die korrekte Syntax bei Fehlaufruf */
UBYTE *filename;
{
   printf("USAGE : %s <AMIGAfile> <IBMfile>\n",filename);
   printf("\n<AMIGAfile> : Name (AMIGA-DOS) of the file to be converted\n");
   printf("<IBMfile>   : Name of the destination file name (AMIGA-DOS).\n");
   printf("              This file can then be read by the IBM Emulator.\n");
   exit(FALSE);
}

main(argc,argv)
int argc;
UBYTE *argv[];
{
   /* Testen, ob Aufruf korrekt */
   if (argc<2 || argc>3 || argc==2 && *argv[1]=='?') usage(argv[0]);
   open_dos();
   sourcename = argv[1];
   destname   = argv[2];
   
   open_files(sourcename,destname);
   
   convert_texts();
   get_out();
}

/* End of Source */
