/*
**	GadTools layout toolkit
**
**	Copyright © 1993-1996 by Olaf `Olsen' Barthel
**		Freely distributable.
**
**	:ts=4
*/

#ifndef _GTLAYOUT_GLOBAL_H
#include "gtlayout_global.h"
#endif

#if defined(DO_POPUP_KIND) && defined(DO_BOOPSI_KIND)

struct Task *
LTP_CreateNewTask(STRPTR TaskName,LONG TaskPri,VOID (*TaskInit)(),ULONG TaskStackSize,ULONG NumArgs, ...)
{
	struct MemList *MemoryList;
	ULONG TotalSize;

	TaskStackSize = ((TaskStackSize + 3) & ~3) + NumArgs * sizeof(ULONG);

	TotalSize = sizeof(struct Task) + TaskStackSize + 15;

	if(MemoryList = AllocMem(sizeof(struct MemList),MEMF_PUBLIC|MEMF_CLEAR))
	{
		struct Task *Task;

		if(Task = (struct Task *)AllocMem(TotalSize,MEMF_PUBLIC|MEMF_CLEAR))
		{
			MemoryList->ml_NumEntries	= 1;
			MemoryList->ml_ME[0].me_Addr	= Task;
			MemoryList->ml_ME[0].me_Length	= TotalSize;

			Task->tc_Node.ln_Pri	= TaskPri;
			Task->tc_Node.ln_Type	= NT_TASK;
			Task->tc_Node.ln_Name	= TaskName;

			Task->tc_SPLower	= (char *)(((ULONG)Task + sizeof(struct Task) + 15) & ~15);
			Task->tc_SPUpper	= (char *)Task->tc_SPLower + TaskStackSize;
			Task->tc_SPReg		= (APTR)(((ULONG)Task->tc_SPUpper) - NumArgs * sizeof(ULONG));

			if(NumArgs > 0)
			{
				va_list VarArgs;
				ULONG *There;

				There = (ULONG *)Task->tc_SPUpper;

				va_start(VarArgs,NumArgs);
				CopyMem(VarArgs,&There[-NumArgs],NumArgs * sizeof(ULONG))
				va_end(VarArgs);
			}

			NewList(&Task->tc_MemEntry);
			AddTail(&Task->tc_MemEntry,&MemoryList->ml_Node);

			if(AddTask(Task,TaskInit,NULL) != NULL)
				return(Task);

			FreeMem(Task,TotalSize);
		}

		FreeMem(MemoryList,sizeof(struct MemList));
	}

	return(NULL);
}

#endif	// defined(DO_POPUP_KIND) && defined(DO_BOOPSI_KIND)
