/* 
 * ShowCookie.c
 *
 * By Adam Sjoegren, 1993, 1994.
 *
 * This software is free as long as you do not make money on it.
 *
 */

#define VER "1.0"
#define PROGNAME "ShowCookie"

#include <stdlib.h>

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

#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/utility.h>

const static char version[]="$VER: "PROGNAME" "VER" "__AMIGADATE__;

#define TEMPLATE "COOKIEDAT/A,COOKIEPTR/A"
#define OPT_DAT	0
#define OPT_PTR	1
#define OPT_COUNT	2

extern ULONG RangeSeed;

ULONG amain(void)
{
	struct DosLibrary *DOSBase;
	struct Library *UtilityBase;
	struct RDArgs *args;
	LONG opts[OPT_COUNT];
	ULONG result=RETURN_OK;

	char *datfilename, *ptrfilename;
	BPTR datfh, ptrfh;
	int ptrsize, *pointers;
	UWORD cookie, number;
	int cookielen;
	char *cookiebuffer;
	struct DateStamp datestamp;

	if( DOSBase=(struct DosLibrary *)OpenLibrary("dos.library", 37L) )
	{
		if( UtilityBase=OpenLibrary("utility.library", 39L) )
		{
			if( args=ReadArgs(TEMPLATE, opts, NULL) )
			{
				datfilename=(char *)opts[OPT_DAT];
				ptrfilename=(char *)opts[OPT_PTR];

				if( ptrfh=Open(ptrfilename, MODE_OLDFILE) )
				{
					Seek(ptrfh, 0, OFFSET_END); 				/* Goto end */
					ptrsize=Seek(ptrfh,0,OFFSET_CURRENT);	/* Get the size */
					Seek(ptrfh, 0, OFFSET_BEGINNING);		/* Back to front ;) */

					if( pointers=(int *)AllocVec(ptrsize, MEMF_ANY) )
					{
						Read(ptrfh, pointers, ptrsize);
	
						number=(UWORD)(ptrsize/(sizeof(int)));

						DateStamp(&datestamp);
						cookie=(UWORD)((GetUniqueID()*datestamp.ds_Tick)%number);

						if( datfh=Open(datfilename, MODE_OLDFILE) )
						{
							if( -1!=Seek(datfh, pointers[cookie]+1, OFFSET_BEGINNING) )
							{
								cookielen=pointers[cookie+1]-pointers[cookie]-1;
							
								if( cookiebuffer=(char *)AllocVec(cookielen+4, MEMF_ANY|MEMF_CLEAR) )
								{
									Read(datfh, cookiebuffer, cookielen);
	
									PutStr(cookiebuffer);
									PutStr("\n");

									FreeVec(cookiebuffer);
								}
								else
								{
									result=RETURN_FAIL;
								}
							}
							else
							{
								result=RETURN_FAIL;
							}
	
							Close(datfh);			
						}
						else
						{
							result=RETURN_FAIL;
						}
	
						FreeVec(pointers);
					}
					else
					{
						result=RETURN_FAIL;
					}
		
					Close(ptrfh);
				}
				else
				{
					result=RETURN_FAIL;
				}

				FreeArgs(args);
			}
			else
			{
				PutStr("\n"PROGNAME" "VER" - Shows cookies from .ptr files and .dat files.\n\n");
				result=RETURN_WARN;	
			}

			CloseLibrary(UtilityBase);
		}
		else
		{
			PutStr("\bSorry "PROGNAME" "VER" need at least v39 of utility.library\n\n");
			result=RETURN_FAIL;
		}
	}
	else
	{
		result=RETURN_FAIL;	
	}

	SetIoErr(IoErr());
	if( DOSBase ) CloseLibrary((struct Library *)DOSBase);
	return(result);
}
