/*
		MAKEUL datei version(hex!)
*/

UBYTE chartab[]={"abcdef0123456790!_ABCDEFGHIJKLMNOPQRSTUVWXYZ$()=?&*+-#"};

extern ULONG __asm crc32(register __a0 void*,register __d0 int);

ULONG rseed;

int somechar(void)
{
	rseed=FastRand(rseed);
	return(chartab[rseed%(strlen(chartab))]);	
}

int lzw_pack( void*, void*, ULONG, ULONG );

int main(int argc,char **argv)
{
	BPTR f;
	void *mailbuf;
	long maillen;
	ULONG crc,mdver,*conv;
	int c;
	BOOL v20 = FALSE, comp = FALSE;

	if( argc>3 && !stricmp( argv[3], "-2" ) )
		v20 = TRUE;
	if( argc>3 && !stricmp( argv[3], "-C" ) )
		comp = TRUE;
	if( argc>4 && !stricmp( argv[4], "-2" ) )
		v20 = TRUE;
	if( argc>4 && !stricmp( argv[4], "-C" ) )
		comp = TRUE;

	rseed=time(0);
	if(argc<3) return(20);

	f=Open(argv[1],MODE_OLDFILE);
	if(!f) return(15);
	Seek(f,0,OFFSET_END);
	maillen=Seek(f,0,OFFSET_BEGINNING);
	mailbuf=AllocVec(maillen,0);
	if(!mailbuf) { Close(f); return(10); }
	Read(f,mailbuf,maillen);
	Close(f);

	/* Komprimieren? */
	if( comp )
	{
		long *compbuffer = AllocVec( maillen, MEMF_CLEAR );
		int compsize;

		compbuffer[0] = maillen;
		compsize = lzw_pack( mailbuf, &compbuffer[1], maillen, 13 );

		/* Round to four */
		while( compsize & 3 )
			compsize++;
		compsize+=4;

		FreeVec( mailbuf );
		maillen = compsize;
		mailbuf = compbuffer;
	}

	crc=crc32( mailbuf, maillen );

	srand( crc^0xdc00dcf2 );
	conv=mailbuf;
	for(c=0; c<maillen/4; c++) {
		*conv^=rand();
		conv++;
	}

	f=Open("md_coded",MODE_NEWFILE);
	Write(f,mailbuf,maillen);
	Close(f);

	FreeVec(mailbuf);

	stch_l(argv[2],&mdver);

	if( comp )
	{
		Printf("X-MICRODOTUPDATE: %lc%08lX%lc%04lX%lc%lc%lc%lc&\n",
			somechar(),
			crc^0xdc00dcf2,
			somechar(),
			mdver^0x7777,
			v20 ? '_' : '!' ,
			somechar(),
			somechar(),
			somechar());
	}
	else
	{
		Printf("X-MICRODOTUPDATE: %lc%08lX%lc%04lX%lc%lc%lc%lc\n",
			somechar(),
			crc^0xdc00dcf2,
			somechar(),
			mdver^0x7777,
			v20 ? '_' : '!' ,
			somechar(),
			somechar(),
			somechar());
	}

	return(0);	

}
