📄 dtchars.c
字号:
/* dtchars.c
* Copyright (c) 2001-2002 dtelnet-team
*
* Handling dtelnet's charsets
*
*/
#include <string.h>
#include <windows.h>
#include "dtelnet.h"
#include "dtchars.h"
#include "utils.h"
#define MAX_CHARSET_NAMES 4096
#define MAX_CHARSET 4096
#define MAX_CODEPAIRS 4096
static char ExtraCharsets[] = "ExtraCharsets";
static char ANSI[] = "ANSI";
static char OEM[] = "OEM";
static struct {
char *buff;
int count;
char *next;
int index;
HMENU menu;
UINT baseid;
int lastchecked;
} ECData = {
NULL,
0
};
int dtcEC_LoadNames (void)
{
int count;
char *p;
int len;
if (ECData.buff==NULL) {
ECData.buff = xmalloc (MAX_CHARSET_NAMES);
} else {
return ECData.count;
}
count = 0;
GetPrivateProfileString (ExtraCharsets, NULL, "",
ECData.buff, MAX_CHARSET_NAMES, telnetIniFile());
p = ECData.buff;
while (*p) {
len = strlen (p);
p += len + 1;
++ count;
}
++p; /* skip terminating '\0' */
xrealloc (ECData.buff, (int)(p - ECData.buff));
ECData.count = count;
ECData.next = ECData.buff;
ECData.index = 1;
return count;
}
char *dtcEC_GetName (int idx)
{
int next;
char *p;
size_t len;
if (idx<=0) return NULL;
if (idx==1) return ANSI;
if (idx==2) return OEM;
idx -= 2;
if (ECData.buff == NULL || ECData.count < idx) return NULL;
if (idx < ECData.index) {
next = 1;
p = ECData.buff;
} else {
next = ECData.index;
p = ECData.buff;
}
for (; idx > next; ++next) {
len = strlen (p);
p += len + 1;
}
ECData.buff = p;
ECData.index = next;
return p;
}
int dtcEC_GetIndex (const char *name)
{
char *p;
int n,idx;
if (strcmp (name, ANSI)==0) return 1;
else if (strcmp (name, OEM)==0) return 2;
else {
if (ECData.buff == NULL) return 0; /* not found */
p = ECData.buff;
n = ECData.count;
for (idx = 1; idx <= n; ++idx) {
if (stricmp (p, name) == 0) return idx + DTC_STANDARD_CHARSETS;
p += strlen (p) + 1;
}
}
return 0; /* not found */
}
void dtcEC_ReleseNames (void)
{
if (ECData.buff) {
xfree (ECData.buff);
ECData.buff = NULL;
}
}
int dtcEC_NamesToCombo (HWND combo)
{
int count, idx;
count = dtcEC_LoadNames ();
for (idx = 1; idx <= count+DTC_STANDARD_CHARSETS; ++idx) {
SendMessage (combo, CB_ADDSTRING, 0,
(LPARAM)dtcEC_GetName(idx));
}
return count;
}
int dtcEC_InitMenu (HMENU menu, UINT baseid)
{
int count, idx;
ECData.menu = menu;
ECData.baseid = baseid;
ECData.lastchecked = 0;
count = dtcEC_LoadNames ();
for (idx = 1+DTC_STANDARD_CHARSETS; idx <= count + DTC_STANDARD_CHARSETS; ++idx) {
AppendMenu (menu, MF_STRING | MF_ENABLED,
baseid + idx - 1,
dtcEC_GetName(idx));
}
return count;
}
int dtcEC_CheckMenuItem (char *name)
{
int idx;
if (ECData.menu==NULL) return -1;
if (ECData.lastchecked != 0) {
CheckMenuItem (ECData.menu, ECData.baseid + ECData.lastchecked - 1,
MF_BYCOMMAND | MF_UNCHECKED);
ECData.lastchecked = 0;
}
idx = dtcEC_GetIndex (name);
if (idx <= 0) return -1;
CheckMenuItem (ECData.menu, ECData.baseid + idx - 1,
MF_BYCOMMAND | MF_CHECKED);
ECData.lastchecked = idx;
return 0;
}
int dtcEC_Load (const char *key,
CodeTable srv2oem, CodeTable oem2srv,
CodeTable ansi2srv, CodeTable srv2ansi)
{
char buffer [MAX_CHARSET];
char codepairs [MAX_CODEPAIRS];
ctabIdent (srv2oem);
ctabIdent (oem2srv);
ctabIdent (ansi2srv);
ctabIdent (srv2ansi);
if (strcmp (key, ANSI)==0) {
AnsiToOemBuff ((LPSTR)srv2oem, (LPSTR)srv2oem, 256);
OemToAnsiBuff ((LPSTR)oem2srv, (LPSTR)oem2srv, 256);
} else if (strcmp (key, OEM)==0) {
AnsiToOemBuff ((LPSTR)ansi2srv, (LPSTR)ansi2srv, 256);
OemToAnsiBuff ((LPSTR)srv2ansi, (LPSTR)srv2ansi, 256);
} else {
GetPrivateProfileString (ExtraCharsets, key, "",
buffer, sizeof (buffer), telnetIniFile());
unescape (buffer, strlen (buffer), codepairs, sizeof (codepairs));
ctabModif (ansi2srv, codepairs, -1, 1); /* eg: win1250->latin2 */
ctabModif (srv2ansi, codepairs, -1, 0); /* eg: latin2->win1250 */
ctabModif (srv2oem, codepairs, -1, 0);
AnsiToOemBuff ((LPSTR)srv2oem, (LPSTR)srv2oem, 256); /* eg: latin2->cp852 */
OemToAnsiBuff ((LPSTR)oem2srv, (LPSTR)oem2srv, 256);
ctabTranslay (ansi2srv, oem2srv, 256); /* eg: cp852->latin2 */
}
return 0; /* succesfull */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -