/*
** Created: Thu/25/Feb/1999
**
** Example program that will display all filetypes known to Idm.library.
**
** Usage: IdmTypes
**
** Compiled with DICE v3.x
**
** This file is copyright © 1999 Andrew Bell.
**
*/

#include <ainc:system.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/Idm.h>

#include <libraries/Idm.h>
#include <IdmTypes_rev.h>

/*******************************************************************/
/* Prototypes */

LONG main( void );
BOOL InitPrg( void );
void EndPrg( void );
void DoPrg( void );

/*******************************************************************/
/* Variables */

extern struct ExecBase *SysBase;
struct Library *IdmBase;

/*******************************************************************/
/* Defines */

#define TITLE VERS " (" DATE ") Copyright © 1999 Andrew Bell.\n"

LONG main( void )
{
	if (SysBase->LibNode.lh_Version < 37) return RETURN_FAIL;

	if (InitPrg())
	{
		DoPrg();
	}
	EndPrg();

	return RETURN_OK;
}

static const UBYTE EVer[] = VERSTAG;

/*******************************************************************/

BOOL InitPrg( void )
{
	if (!(IdmBase = OpenLibrary(IDMNAME, IDMLIBVERSION)))
	{
		ULONG Ver = IDMLIBVERSION;
		VPrintf("I really need " IDMNAME " version %lu\n", &Ver);
		return FALSE;
	}

	return TRUE;
}

/*******************************************************************/

void EndPrg( void )
{
	if (IdmBase) { CloseLibrary(IdmBase); IdmBase = NULL; }
}

/*******************************************************************/

void DoPrg( void )
{
	VPrintf(TITLE, NULL);

	struct IdmLibInfo *LI = IdmObtainLibInfo();

	if (LI)
	{
		VPrintf("\nViewing all types currently known to " IDMNAME " version %u.%u\n\n", &LI->IdmLI_Version);

		struct IdmKnownNode *node;

		ULONG cnt = NULL;

		for (	node = (struct IdmKnownNode *) LI->IdmLI_IDList->IdmKL_ListHead.lh_Head ;
					node->IdmKN_NodeHead.ln_Succ ;
					node = (struct IdmKnownNode *) node->IdmKN_NodeHead.ln_Succ, ++cnt )
		{
			ULONG stream[] = { cnt, (ULONG) node->IdmKN_NodeHead.ln_Name };

			VPrintf(" %04lu : %.100s\n", &stream);

			if (CheckSignal(SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C)
			{
				VPrintf("***Break:\n", NULL); break;
			}
		}

		VPrintf("\nFinished.\n\n", NULL);

		IdmFreeLibInfo(LI); LI = NULL;
	}
}
