31#define LOCALEFILE_HEADERCHUNKID 0x48434f4c
32#define LOCALEFILE_INDEXCHUNKID 0x49434f4c
33#define LOCALEFILE_LANGUAGECHUNKID 0x4c434f4c
45#define LOCALEFILE_HEADERCHUNK_LANGUAGE_OFFSET sizeof(LOCALEFILE_HEADERCHUNK)
62#define LOCALEFILE_INDEXCHUNK_STRINGID_OFFSET sizeof(LOCALEFILE_INDEXCHUNK)
76#define LOCALEFILE_LANGUAGECHUNK_STRING_OFFSET sizeof(LOCALEFILE_LANGUAGECHUNK)
106 return( lx !=
NULL );
265 lx->BankIndex = BankIndex;
305 return lx->BankIndex;
346 ASSERT(lx->pBank[lx->BankIndex]);
347 return (
int)(lx->pBank[lx->BankIndex]->LanguageID);
389 if (lx->pBank[lx->BankIndex]) {
390 StringCount = lx->pBank[lx->BankIndex]->StringCount;
444static int readheader(
GSTREAM* g )
453 if(
gread(g, &header, HeaderChunkSize) != HeaderChunkSize ) {
457 Msg( __LINE__, __FILE__,
"readheader - HeaderChunkSize = %d.", HeaderChunkSize );
458 Msg( __LINE__, __FILE__,
"readheader - header.LanguageCount = %d.", header.
LanguageCount );
459 Msg( __LINE__, __FILE__,
"readheader - header.Flags = %d.", header.
Flags );
464 if ( header.
Flags == 1 ) {
471 if( !
gseek( g, IndexChunkPos + 4)) {
475 Msg( __LINE__, __FILE__,
"readheader - seek to = %d.", IndexChunkPos + 4 );
478 if(
gread( g, &IndexChunkSize, 4) != 4 ) {
482 Msg( __LINE__, __FILE__,
"readheader - IndexChunkSize = %d.", IndexChunkSize );
486 if (lx->pIndex[lx->BankIndex]) {
489 gseek( g, IndexChunkPos );
491 Msg( __LINE__, __FILE__,
"readheader - seek to = %d.", IndexChunkPos );
494 if (
gread(g, lx->pIndex[lx->BankIndex], IndexChunkSize ) != IndexChunkSize ) {
497 Msg( __LINE__, __FILE__,
"readheader - IndexChunkSize = %d.", IndexChunkSize );
504 Msg( __LINE__, __FILE__,
"readheader - exiting." );
511 Msg( __LINE__, __FILE__,
"readstrings:: g ok? %d.", ((g!=
NULL)?1:0));
515 int LanguageChunkOffsetPos = 16 +
LanguageID*4;
516 int LanguageChunkPos = 0;
517 int LanguageChunkSize = -1;
522 if( !
gseek( g, (
int)LanguageChunkOffsetPos )) {
525 if(
gread( g, &LanguageChunkPos, 4 ) != 4 ) {
532 if( !
gseek( g, LanguageChunkPos + 4 )) {
535 if(
gread( g, &LanguageChunkSize, 4 ) != 4 ) {
539 Msg( __LINE__, __FILE__,
"readstrings::LanguageChunkOffsetPos = %d.", LanguageChunkOffsetPos );
540 Msg( __LINE__, __FILE__,
"readstrings::LanguageChunkPos = %d.", LanguageChunkPos );
541 Msg( __LINE__, __FILE__,
"readstrings::LanguageChunkSize = %d.", LanguageChunkSize );
545 if (lx->pBank[lx->BankIndex]) {
547 Msg( __LINE__, __FILE__,
"readstrings:: A." );
551 if( !
gseek( g, LanguageChunkPos )) {
554 if(
gread( g, lx->pBank[lx->BankIndex], LanguageChunkSize ) != LanguageChunkSize ) {
573 g =
gopen( PathName );
576 Msg( __LINE__, __FILE__,
"LOCALE_loadtable-- file opened." );
580 Msg( __LINE__, __FILE__,
"LOCALE_loadtable-- readstrings." );
584 Msg( __LINE__, __FILE__,
"LOCALE_loadtable-- ok = %d ).", ok );
643 ASSERT(lx->pBank[lx->BankIndex]);
646 gfree(lx->pBank[lx->BankIndex]);
647 lx->pBank[lx->BankIndex] =
NULL;
650 if (lx->pIndex[lx->BankIndex]) {
651 gfree(lx->pIndex[lx->BankIndex]);
652 lx->pIndex[lx->BankIndex] =
NULL;
703static int compare (
const void* arg1,
const void* arg2 )
705 const unsigned short* s1 = (
const unsigned short*)(arg1);
706 const unsigned short* s2 = (
const unsigned short*)(arg2);
707 return (*s1) - (*s2);
710static int getstringbyindex(
unsigned short key,
const INDEX* pIndex )
713 unsigned short* result;
720 result = (
unsigned short*)bsearch((
unsigned char *)&key, base, pIndex->
StringCount, 4, compare);
722 if (result !=
NULL) {
736 Msg( __LINE__, __FILE__,
"Locale_getstring::( %d ).", StringID );
741 if ( lx->pIndex[ lx->BankIndex ] !=
NULL ) {
742 StringID = getstringbyindex((
unsigned short)StringID, lx->pIndex[lx->BankIndex]);
745 Msg( __LINE__, __FILE__,
"Locale_getstring::( %d ).", StringID );
746 Msg( __LINE__, __FILE__,
"Locale_getstring::( lx->BankIndex = %d ).", lx->BankIndex );
747 Msg( __LINE__, __FILE__,
"Locale_getstring::( lx->pBank[lx->BankIndex]->StringCount = %d ).", lx->pBank[lx->BankIndex]->StringCount );
749 if ((StringID >= 0) && (StringID < (
int)(lx->pBank[lx->BankIndex]->StringCount ))) {
751 Msg( __LINE__, __FILE__,
"Locale_getstring:: A" );
755 p = (
const char*)(lx->pBank[lx->BankIndex]);
757 Msg( __LINE__, __FILE__,
"Locale_getstring:: B" );
761 Msg( __LINE__, __FILE__,
"Locale_getstring:: C" );
765 Msg( __LINE__, __FILE__,
"Locale_getstring:: D" );
772 Msg( __LINE__, __FILE__, L
"%s", 1252, (
wchar_t *)p );
837 if( pHeader->
Flags == 1 ) {
841 StringID = getstringbyindex((
unsigned short)StringID, pIndex);
847 pBank = (
BANK*)((
unsigned char*)(pLocFile) + offset);
850 if ((StringID >= 0) && (StringID < (
int)(pBank->
StringCount))) {
854 p = (
const char*)(pBank);
int GCALL gread(GSTREAM *g, void *buf, int size)
bool GCALL gclose(GSTREAM *g)
bool GCALL gseek(GSTREAM *g, GPOS offset)
GSTREAM *GCALL gopen(const char *pathname)
LOCALEFILE_LANGUAGECHUNK BANK
void LOCALE_setbank(int BankIndex)
#define LOCALEFILE_LANGUAGECHUNK_STRING_OFFSET
const char * LOCALE_getstr(const void *pLocFile, int StringID)
#define LOCALEFILE_LANGUAGECHUNKID
#define LOCALEFILE_HEADERCHUNKID
#define LOCALEFILE_INDEXCHUNK_STRINGID_OFFSET
int LOCALE_isinitialized(void)
int LOCALE_getbankstringcount(void)
void LOCALE_freetable(void)
void LOCALE_restore(void)
LOCALEFILE_INDEXCHUNK INDEX
const char * LOCALE_getstring(int StringID)
int LOCALE_loadtable(const char *PathName, int LanguageID)
LOCALEFILE_HEADERCHUNK HEADER
int LOCALE_getbanklanguageid(void)
#define LOCALEFILE_INDEXCHUNKID
#define LOCALE_BANK_COUNT
BANK * pBank[LOCALE_BANK_COUNT]
INDEX * pIndex[LOCALE_BANK_COUNT]
unsigned int LanguageCount