/********************************************************************
 *																	*
 *	Cookie information												*
 *																	*
 *	Copyright (C) 1994, Bitgate Software and Clever Bits.			*
 *	All rights reserved.											*
 *																	*
 *	This information was taken from GEMView, with all due respects.	*
 *																	*
 *	These routines are designed to create your own cookies, and to	*
 *	handle the cookie jar information.  Since WinLIB will eventually*
 *	install its own cookie, these routines need to be bug-fixed.	*
 *																	*
 ********************************************************************/

#include <stddef.h>
#include <tos.h>
#include "winlib.h"

#ifndef __COOKIES__
#define __COOKIES__
#endif

COOKIE	*MainCJar;

GLOBAL long *get_cookiejar(void)
{
	register long old_stack, *jar;

	old_stack = (long) Super(0L);
	jar = *((long **) 0x5A0L);
	Super((long *) old_stack);
	return(jar);
}

GLOBAL void create_cookie(COOKIE *cookie, long id, long value)
{
	*((long *) cookie)++ = id;
	*((long *) cookie) = value;
}

GLOBAL int new_cookie(COOKIE *ent)
{
	register long *cookiejar = get_cookiejar();
	register int act_row = 0;

	if (cookiejar) {
		while(*cookiejar) {
			cookiejar += 2;
			act_row++;
		}

		if (act_row < cookiejar[1]) {
			cookiejar[2] = cookiejar[0];
			cookiejar[3] = cookiejar[1];

			*cookiejar++ = *((long *) ent)++;
			*cookiejar = *((long *) ent);
			return(TRUE);
		}
	}
	return(FALSE);
}

GLOBAL int get_cookie(long cookie, long *value)
{
	register long *cookiejar = get_cookiejar();

	if (cookiejar) {
		do {
			if (*cookiejar == cookie) {
				if (value) *value = *++cookiejar;
				return(TRUE);
			}
			cookiejar += 2;
		} while(*++cookiejar);
	}
	return(FALSE);
}

GLOBAL int locate_cookie(long cookie)
{
	register long *cookiejar = get_cookiejar();

	if (cookiejar) {
		do {
			if (*cookiejar == cookie)
				return TRUE;

			cookiejar += 2;
		} while (*++cookiejar);
	}

	return FALSE;
}

GLOBAL void remove_cookie(long cookie_id)
{
	register long *cookiejar = get_cookiejar();

	if (cookiejar) {
		while (*cookiejar && cookiejar[1]!=cookie_id)
			cookiejar += 2;

		if (*cookiejar) {
			do {
				*cookiejar++ = cookiejar[2];
				*cookiejar = cookiejar[2];
			} while(*cookiejar);
		}
	}
}

GLOBAL void move_cookiejar(long *dest, long size)
{
	register long old_stack, *cookiejar, *dest_cop;

	old_stack = (long) Super(0L);
	cookiejar = *((long **) 0x5A0L);

	if (cookiejar) {
		dest_cop = dest;

		do {
			*dest++ = *cookiejar++;
			*dest++ = *cookiejar++;
		} while (*cookiejar);

		*dest++ = *cookiejar;
		*dest = size;

		cookiejar = (long *) 0x5A0L;
		*cookiejar = (long) dest_cop;
	}
	Super((long *) old_stack);
}

GLOBAL long cookie_size()
{
	register long *cookiejar = get_cookiejar();

	if (cookiejar) {
		while(*cookiejar) cookiejar += 2;
		return(*++cookiejar);
	}
	return(0);
}

GLOBAL COOKIE *find_cookie(long id)
{
	long *jar;

	if (((long *)jar = get_cookiejar()) == 0)
		return(0);

	while(*jar) {
		if(*jar == id) return((COOKIE *)jar);
		jar += 2;
	}

	return(0);
}

GLOBAL void InitCookies(void)
{
	(long *) MainCJar = get_cookiejar();
}
