#include <dos/dos.h>
#include <exec/types.h>
#include <mine/toolkit.h>
#include <proto/asyncio.h>
#include <proto/dos.h>
#include <proto/exec.h>

long __asm ibm2iso(register __a0 ubyte *, register __a1 ubyte *, register __d0 long);

struct MyArgs 
{ 
  char *ibm;
  char *iso;
  long *size;
};

static const char ver[]     = "$VER: IBM2ISO 1.1 ("__DATE__")";
static const char template[]= "FILE/A,FILE/A,B=BUFSIZE/N/K";

long main(void)
{
struct Library    *AsyncIOBase = 0;
struct DosLibrary *DOSBase     = 0;
struct RDArgs     *rdargs      = 0;
struct MyArgs      args        = { 0,0,0 };
struct AsyncFile  *ibm_fh      = 0,
                  *iso_fh      = 0;
ubyte             *ibm_buf     = 0,
                  *iso_buf     = 0;
long               error       = 0,
                   ibm_read,
                   iso_write,
                   buf_size;

  if ((DOSBase     = OpenLibrary("dos.library",37)) AND
      (AsyncIOBase = OpenLibrary("asyncio.library",0))) {
    if (rdargs=ReadArgs(template,(LONG *)&args,NULL)) {
      buf_size = (args.size) ? ((*args.size > 256) ? *args.size : 256) : 8192;
  
      if ((ibm_buf = AllocVec(buf_size,0)) AND
          (iso_buf = AllocVec(buf_size,0)) AND
          (ibm_fh  = OpenAsync(args.ibm,MODE_READ ,buf_size)) AND
          (iso_fh  = OpenAsync(args.iso,MODE_WRITE,buf_size))) {
  
        while ( ibm_read = ReadAsync(ibm_fh,ibm_buf,buf_size) )
        {
          if (ibm_read != -1) {
            iso_write = ibm2iso(ibm_buf,iso_buf,ibm_read);
            if (WriteAsync(iso_fh,iso_buf,iso_write) == -1) {
              error = IoErr();
              break;
            }
          } else {
            error = IoErr();
            break;
          }
        }
  
      } else {
        error = IoErr();
      }
    } else {
      error = IoErr();
    }
  } else {
    error = 10;
  }
  if (DOSBase) {
    if (error      ) PrintFault(error,"IBM2ISO");
    if (rdargs     ) FreeArgs(rdargs);
    if (ibm_buf    ) FreeVec(ibm_buf);
    if (iso_buf    ) FreeVec(iso_buf);
    if (ibm_fh     ) CloseAsync(ibm_fh);
    if (iso_fh     ) CloseAsync(iso_fh);
    if (DOSBase    ) CloseLibrary(DOSBase);
  }
  if (AsyncIOBase) CloseLibrary(AsyncIOBase);
  return(error);
}
