зеркало из https://github.com/mozilla/pjs.git
196 строки
5.1 KiB
C
Executable File
196 строки
5.1 KiB
C
Executable File
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* The contents of this file are subject to the Netscape Public License
|
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
* http://www.mozilla.org/NPL/
|
|
*
|
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
* for the specific language governing rights and limitations under the
|
|
* NPL.
|
|
*
|
|
* The Initial Developer of this code under the NPL is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
* Reserved.
|
|
*/
|
|
#include "prlog.h"
|
|
#include "prtypes.h"
|
|
#include "libi18n.h"
|
|
#include "csid.h"
|
|
|
|
#define MAXUTABLENAME 16
|
|
typedef struct tblrsrcinfo {
|
|
char name[MAXUTABLENAME];
|
|
uint16 refcount;
|
|
HGLOBAL hTbl;
|
|
} tblrsrcinfo;
|
|
|
|
typedef struct utablename {
|
|
uint16 csid;
|
|
tblrsrcinfo frominfo;
|
|
tblrsrcinfo toinfo;
|
|
|
|
} utablename;
|
|
|
|
PR_PUBLIC_API(void*) UNICODE_LOADUCS2TABLE(uint16 csid, int from);
|
|
PR_PUBLIC_API(void) UNICODE_UNLOADUCS2TABLE(uint16 csid, void *utblPtr, int from);
|
|
|
|
tblrsrcinfo* unicode_FindUTableName(uint16 csid, int from);
|
|
|
|
HINSTANCE _unicode_hInstance;
|
|
|
|
#ifdef _WIN32
|
|
BOOL WINAPI DllMain (HINSTANCE hDLL, DWORD dwReason, LPVOID lpReserved)
|
|
{
|
|
switch (dwReason)
|
|
{
|
|
case DLL_PROCESS_ATTACH:
|
|
_unicode_hInstance = hDLL;
|
|
break;
|
|
|
|
case DLL_THREAD_ATTACH:
|
|
break;
|
|
|
|
case DLL_THREAD_DETACH:
|
|
break;
|
|
|
|
case DLL_PROCESS_DETACH:
|
|
_unicode_hInstance = NULL;
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
#else /* ! _WIN32 */
|
|
|
|
int CALLBACK LibMain( HINSTANCE hInst, WORD wDataSeg,
|
|
WORD cbHeapSize, LPSTR lpszCmdLine )
|
|
{
|
|
_unicode_hInstance = hInst;
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CALLBACK _export _loadds WEP(BOOL fSystemExit)
|
|
{
|
|
_unicode_hInstance = NULL;
|
|
return TRUE;
|
|
}
|
|
#endif /* ! _WIN32 */
|
|
|
|
|
|
utablename utablenametbl[] =
|
|
{
|
|
/* Special Note, for Windows, we use cp1252 for CS_LATIN1 */
|
|
{CS_ASCII, {"CP1252.UF", 0, NULL}, {"CP1252.UT", 0, NULL}},
|
|
{CS_LATIN1, {"CP1252.UF", 0, NULL}, {"CP1252.UT", 0, NULL}},
|
|
{CS_SJIS, {"SJIS.UF", 0, NULL}, {"SJIS.UT", 0, NULL}},
|
|
{CS_BIG5, {"BIG5.UF", 0, NULL}, {"BIG5.UT", 0, NULL}},
|
|
{CS_GB_8BIT, {"GB2312.UF", 0, NULL}, {"GB2312.UT", 0, NULL}},
|
|
{CS_KSC_8BIT, {"U20KSC.UF", 0, NULL}, {"U20KSC.UT", 0, NULL}},
|
|
{CS_CP_1251, {"CP1251.UF", 0, NULL}, {"CP1251.UT", 0, NULL}},
|
|
{CS_ARMSCII8, {"ARMSCII.UF", 0, NULL}, {"ARMSCII.UT", 0, NULL}},
|
|
{CS_CP_1250, {"CP1250.UF", 0, NULL}, {"CP1250.UT", 0, NULL}},
|
|
{CS_CP_1253, {"CP1253.UF", 0, NULL}, {"CP1253.UT", 0, NULL}},
|
|
{CS_8859_9, {"CP1254.UF", 0, NULL}, {"CP1254.UT", 0, NULL}},
|
|
{CS_SYMBOL, {"MACSYMBO.UF", 0, NULL}, {"MACSYMBO.UT", 0, NULL}},
|
|
{CS_DINGBATS, {"MACDINGB.UF", 0, NULL}, {"MACDINGB.UT", 0, NULL}},
|
|
{CS_DEFAULT, {"", 0, NULL}, {"", 0, NULL}}
|
|
};
|
|
static tblrsrcinfo* unicode_FindUTableName(uint16 csid, int from)
|
|
{
|
|
int i;
|
|
for(i=0; utablenametbl[i].csid != CS_DEFAULT; i++)
|
|
{
|
|
if(utablenametbl[i].csid == csid)
|
|
return from ? &(utablenametbl[i].frominfo)
|
|
: &(utablenametbl[i].toinfo);
|
|
}
|
|
#ifdef _DEBUG
|
|
OutputDebugString("unicode_FindUTableName: Cannot find table information");
|
|
#endif /* _DEBUG */
|
|
|
|
return NULL;
|
|
}
|
|
PR_PUBLIC_API(void *) UNICODE_LOADUCS2TABLE(uint16 csid, int from)
|
|
{
|
|
HRSRC hrsrc;
|
|
HGLOBAL hRes;
|
|
void *table;
|
|
tblrsrcinfo* tbl = unicode_FindUTableName(csid, from);
|
|
/* Cannot find this csid */
|
|
if(tbl == NULL)
|
|
return (NULL);
|
|
/* Find a loaded table */
|
|
if(tbl->refcount > 0)
|
|
{
|
|
tbl->refcount++;
|
|
return ((void*)LockResource(tbl->hTbl));
|
|
}
|
|
/* Find a unloaded table */
|
|
hrsrc = FindResource(_unicode_hInstance, tbl->name, RT_RCDATA);
|
|
if(!hrsrc)
|
|
{
|
|
/* cannot find that RCDATA resource */
|
|
#ifdef _DEBUG
|
|
OutputDebugString("UNICODE_LoadUCS2Table cannot find table resource");
|
|
#endif
|
|
return (NULL);
|
|
}
|
|
hRes = LoadResource(_unicode_hInstance,hrsrc);
|
|
if(!hRes)
|
|
{
|
|
/* cannot find that RCDATA resource */
|
|
#ifdef _DEBUG
|
|
OutputDebugString("UNICODE_LoadUCS2Table cannot load table resource");
|
|
#endif
|
|
return (NULL);
|
|
}
|
|
table = (void*) LockResource(hRes);
|
|
if(!table)
|
|
{
|
|
/* cannot find that RCDATA resource */
|
|
#ifdef _DEBUG
|
|
OutputDebugString("UNICODE_LoadUCS2Table cannot lock table resource");
|
|
#endif
|
|
return (NULL);
|
|
}
|
|
tbl->refcount++;
|
|
tbl->hTbl = hRes;
|
|
return(table);
|
|
}
|
|
PR_PUBLIC_API(void) UNICODE_UNLOADUCS2TABLE(uint16 csid, void *utblPtr, int from)
|
|
{
|
|
tblrsrcinfo* tbl = unicode_FindUTableName(csid, from);
|
|
/* Cannot find this csid */
|
|
if(tbl == NULL)
|
|
{
|
|
#ifdef _DEBUG
|
|
OutputDebugString("unicode_UnloadUCS2Table don't know how to deal with this csid");
|
|
#endif
|
|
return;
|
|
}
|
|
/* Find a loaded table */
|
|
if(tbl->refcount == 0)
|
|
{
|
|
#ifdef _DEBUG
|
|
OutputDebugString("unicode_UnloadUCS2Table try to unload an unloaded table");
|
|
#endif
|
|
tbl->hTbl = NULL;
|
|
return;
|
|
}
|
|
#ifndef _WIN32
|
|
/* UnlockResource to decrease the internal reference count */
|
|
UnlockResource(tbl->hTbl);
|
|
#endif
|
|
tbl->refcount--;
|
|
if(tbl->refcount <= 0)
|
|
{
|
|
FreeResource(tbl->hTbl);
|
|
tbl->hTbl = NULL;
|
|
tbl->refcount = 0;
|
|
}
|
|
}
|