MODULE 'exec/memory'

ENUM ER_NONE,ER_OUTOFMEM,ER_BADARGS,ER_NOSOURCE,ER_NODEST,ER_WRITE

DEF source=NIL,dest=NIL,rdargs=NIL,myargs:PTR TO LONG,mem=NIL:PTR TO CHAR

PROC shutdown()
  IF source THEN Close(source)
  IF dest THEN Close(dest)
  IF rdargs THEN FreeArgs(rdargs)
  IF mem THEN FreeMem(mem,16384)
ENDPROC

PROC main() HANDLE
  DEF message:PTR TO LONG,key=0,ptr:PTR TO CHAR,bytes,loop,h
  IF (mem:=AllocMem(16384,MEMF_ANY OR MEMF_CLEAR))=NIL THEN Raise(ER_OUTOFMEM)
  myargs:=[0,0,0,0]
  IF (rdargs:=ReadArgs('SOURCE/A,TO/K/A,KEY/K/A,DECRYPT/S',
    myargs,NIL))=NIL THEN Raise(ER_BADARGS)
  ptr:=myargs[2]
  h:=0
  WHILE Char(ptr)<>0
    key:=key+(Char(ptr)*h)
    h:=h+256
    IF h>512 THEN h:=0
    ptr++
  ENDWHILE
  Rnd(-key)
  IF (source:=Open(myargs[0],OLDFILE))=NIL THEN Raise(ER_NOSOURCE)
  IF (dest:=Open(myargs[1],NEWFILE))=NIL THEN Raise(ER_NODEST)
  WHILE bytes:=Read(source,mem,16384)
    IF myargs[3]
      FOR loop:=0 TO bytes-1 DO PutChar(mem+loop,Char(mem+loop)-Rnd(256) AND 255)
    ELSE
      FOR loop:=0 TO bytes-1 DO PutChar(mem+loop,Char(mem+loop)+Rnd(256) AND 255)
    ENDIF
    IF Write(dest,mem,bytes)<>bytes THEN Raise(ER_WRITE)
  ENDWHILE
  Raise(ER_NONE)
EXCEPT
  shutdown()
  IF exception>0
    message:=['out of memory','bad arguments','could not open source file',
              'could not open destination file','error while writing file']
    WriteF('\s\n',message[exception-1])
  ENDIF
ENDPROC
