/*
**    GrabKEY
**
**        © 1996 by Timo C. Nentwig
**        All Rights Reserved !
**
**        Tcn@techbase.in-berlin.de
**
*/

/// #include

#include "gk_GST.h"
#include "gk_Protos.h"

///
/// proto

proto VOID                     LocaleClose       (VOID);
proto STRPTR __saveds __asm    LocaleHookFunc    (REG (a0) struct Hook *Hook, REG (a1) const LONG ID);
proto BOOL                     LocaleOpen        (const STRPTR Name, const STRPTR BuiltIn, const LONG Version);
proto STRPTR                   LocaleString      (ULONG ID);

///

struct    Library   *LocaleBase;
struct    Catalog   *Catalog;
struct    Hook       LocaleHook =
{

	{ NULL },
	(HOOKFUNC) LocaleHookFunc

};

/// LocaleClose ()

	/*
	 *    FUNCTION    Close localestuff opened
	 *                by LocaleOpen().
	 *
	 *    NOTE
	 *
	 *    EXAMPLE     LocaleClose();
	 *
	 */

VOID
LocaleClose (VOID)
{

	if (LocaleBase)
	{

		CloseCatalog (Catalog);
		Catalog = NULL;

		CloseLib (LocaleBase);
		LocaleBase = NULL;

	}

}

///
/// LocaleHookFunc ()

	/*
	 *    FUNCTION    Hook function for LocaleString().
	 *
	 *    NOTE
	 *
	 *    EXAMPLE     struct Hook LocaleHook = { {NULL}, (HOOKFUNC) LocaleHookFunc };
	 *
	 */


STRPTR __saveds __asm
LocaleHookFunc (REG (a0) struct Hook *Hook, REG (a1) const LONG ID)
{

	return (LocaleString (ID));

}

///
/// LocaleOpen ()

	/*
	 *    FUNCTION    Open locale specific stuff.
	 *
	 *    NOTE
	 *
	 *    EXAMPLE     LocaleOpen ("my_prg.catalog", "english", 2);
	 *
	 */

BOOL
LocaleOpen (const STRPTR Name, const STRPTR BuiltIn, const LONG Version)
{

	if (LocaleBase = OpenLibrary ("locale.library", 39))
	{

		if (Catalog = OpenCatalog (NULL, Name, OC_BuiltInLanguage,    BuiltIn,
											   OC_BuiltInCodeSet,     0,
											   OC_Version,            2,
											   TAG_END))
											   {

												   return (TRUE);

											   }
											   else
											   {

												   CloseCatalog (Catalog);
												   Catalog = NULL;

											   }

	}

	return (FALSE);

}

///
/// LocaleString ()

	/*
	 *    FUNCTION    Localize a string.
	 *
	 *    NOTE
	 *
	 *    EXAMPLE     STRPTR s = LocaleString (15);
	 *
	 */

STRPTR
LocaleString (ULONG ID)
{

	const struct    CatCompArrayType   *AppStrings    = &CatCompArray [0];
	const WORD                          NumAppStrings = sizeof (CatCompArray) / sizeof (struct CatCompArrayType);
	STRPTR                        Builtin;

	if (ID < NumAppStrings && AppStrings [ID] . cca_ID == ID)
	{

		Builtin = AppStrings [ID] . cca_Str;

	}
	else
	{

		LONG    Left,
				Mid,
				Right;

			/*
			 *    Binary search,  note: can be applied here
			 *    only because the catalog entries are
			 *    stored in ascending ID order .  But actually,
			 *    this piece of code should never get called .
			 */

		Left  = 0;
		Right = NumAppStrings - 1;

		do
		{

			Mid = (Left + Right) / 2;

			if (ID < AppStrings [Mid] . cca_ID)
			{

				Right   = Mid - 1;

			}
			else
			{

				Left    = Mid + 1;

			}

		}
		while (ID != AppStrings [Mid] . cca_ID && Left <= Right);

		if (ID == AppStrings [Mid] . cca_ID)
		{

			Builtin = AppStrings [Mid] . cca_Str;

		}
		else
		{

			Builtin = "";

		}

	}

	if (Catalog)
	{

		STRPTR    String = GetCatalogStr (Catalog, ID, Builtin);

		if (String [0])
		{

			return (String);

		}

	}

	return (Builtin);

}

///

