home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Games 1996 October
/
Amiga_Games_Extra_CD_10-96.bin
/
userbox
/
publicdomain
/
grabkey
/
source
/
gk_locale.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-07-09
|
3KB
|
227 lines
/*
** 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);
}
///