#include "/Mailbox.h"
#include "protos.h"

VOID RemList(struct List *);
STRPTR GetFile(STRPTR, LONG *);
struct Line *GetLine(VOID);


VOID __saveds __asm RemBrettDataList(register __a0 struct List *list)
{
	struct Brett *brett;

	brett = GetHead(list);
	while(brett)
	{
		if(brett->point_list);
		{
			RemList(brett->point_list);
			FreeVec(brett->point_list);
		}
		brett = GetSucc(brett);
	}
	RemList(list);
}

BOOL __saveds __asm GetBrettDataList(register __a0 STRPTR file, register __a1 struct List *list, register __d0 BOOL points)
{
	struct Brett	*brett;
	struct Line		*line;
	STRPTR ptr, ptr2, buffer, buf;
	LONG size;

	RemList(list);

	if(!(buffer = GetFile(file, &size)))	return(FALSE);

	buf = buffer;
	brett = AllocVec(sizeof(struct Brett), MEMF_ANY | MEMF_CLEAR);

	while(buf < buffer + size && brett)
	{
		if(ptr = strchr(buf, '\n'))
		{
			*ptr = 0;
			strcpy(brett->name, buf);
			buf = ptr + 1;
		}
		if(ptr = strchr(buf, '\n'))
		{
			*ptr = 0;
			brett->gruppe = atol(buf);
			buf = ptr + 1;
		}
		if(ptr = strchr(buf, '\n'))
		{
			*ptr = 0;
			if(strchr(buf, 'Z'))	brett->flags |= BFLG_ZENSUR;
			if(strchr(buf, 'M'))	brett->flags |= BFLG_MAPS;
			if(strchr(buf, 'A'))	brett->flags |= BFLG_ABMAPS;
			if(strchr(buf, 'U'))	brett->flags |= BFLG_UNLIMITED;

			brett->days = brett->bytes = brett->mails = 0;
			if(ptr2 = strchr(buf, 'D'))
			{
				ptr2++;
				while(isdigit(*ptr2))
				{
					brett->days *= 10;
					brett->days += *ptr2 - 48;
					ptr2++;
				}
			}
			if(ptr2 = strchr(buf, 'B'))
			{
				ptr2++;
				while(isdigit(*ptr2))
				{
					brett->bytes *= 10;
					brett->bytes += *ptr2 - 48;
					ptr2++;
				}
			}
			if(ptr2 = strchr(buf, 'N'))
			{
				ptr2++;
				while(isdigit(*ptr2))
				{
					brett->mails *= 10;
					brett->mails += *ptr2 - 48;
					ptr2++;
				}
			}
			buf = ptr + 1;
		}
		if(ptr = strchr(buf, '\n'))
		{
			*ptr = 0;
			brett->read_level = atol(buf);
			buf = ptr + 1;
		}
		if(ptr = strchr(buf, '\n'))
		{
			*ptr = 0;
			brett->write_level = atol(buf);
			buf = ptr + 1;
		}
		if(ptr = strchr(buf, '\n'))
		{
			*ptr = 0;
			strcpy(brett->comment, buf);
			buf = ptr + 1;
		}
		if(points)
		{
			if(brett->point_list = AllocVec(sizeof(struct List), MEMF_ANY | MEMF_CLEAR))
			{
				NewList(brett->point_list);
				while(*buf != '#' && buf < buffer + size)
				{
					if(ptr = strchr(buf, '\n'))
					{
						*ptr = 0;
						if(line = GetLine())
						{
							strcpy(line->text, buf);
							AddTail(brett->point_list, line);
						}
						buf = ptr + 1;
					}
					else buf = buffer + size;
				}
			}
		}
		else
		{
			while(*buf != '#' && buf < buffer + size)
			{
				if(ptr = strchr(buf, '\n'))	buf = ptr + 1;
				else									buf = buffer + size;
			}
		}
		if(ptr = strchr(buf, '\n'))
		{
			buf = ptr + 1;

			brett->node.ln_Name = brett->name;
			brett->node.ln_Type = NT_MEMORY;

			AddTail(list, brett);
			brett = AllocVec(sizeof(struct Brett), MEMF_ANY | MEMF_CLEAR);
		}
		else	buf = buffer + size;
	}
	FreeVec(buffer);

	if(brett)
	{
		if(brett->point_list)
		{
			RemList(brett->point_list);
			FreeVec(brett->point_list);
		}
		FreeVec(brett);
	}
	else
	{
		RemBrettDataList(list);
		return(FALSE);
	}

	return(TRUE);
}
