Different fixes

This commit is contained in:
Alexander S. Aganichev 2001-07-03 04:27:54 +00:00
parent 28e2cff62c
commit d9891a8e6e
21 changed files with 318 additions and 79 deletions

View File

@ -12,6 +12,26 @@ ______________________________________________________________________
Notes for GoldED+ 1.1.5, /snapshot/
______________________________________________________________________
- Fixed EDITHEADERFIRST operation.
+ Added new keyword AreaListGroupOrder to specify groups sorting order
in arealist. The only parameter is string which specifies groups
order (case sensitive!). If some groups are not found in the list
they will be placed below specifyed ones in regular order.
+ Implemented FSP-0013 support. You may notice warnings about obsolete
codepages in your config, please fix them. If you use XLATEXPORT to
obsolte codepage and this is required on some reason you may prevent
error by setting USECHARSET to No.
+ GoldED+ now tries to set up correct values for XLATLOCALSET,
XLATIMPORT and XLATEXPORT basing on your locale settings.
+ Added Serg Borodin's patch for X-Comment-To recognition on SOUP
import.
- Fixed crash on long Message ID in Internet messages.
- Fixed crash on very long name in Internet messages.
! ZapQuotesBelow now acts only on the single quotation block, not on

View File

@ -26,6 +26,7 @@
#include <golded.h>
#include <gmoprot.h>
#include <gcharset.h>
// ------------------------------------------------------------------
@ -629,6 +630,7 @@ CfgGed::CfgGed() {
// strings
strcpy(arealistformat, "AM D CPUN E G ");
*arealistgrouporder = 0;
strcpy(arealistsort, "FYTUE");
strcpy(areascansort, "XZBE");
strcpy(importbegin, "=== Cut ===");
@ -656,14 +658,9 @@ CfgGed::CfgGed() {
__gver_postname__, __gver_platform__);
strcpy(tearline, "@longpid @version");
strcpy(whoto, "All");
*xlatexport = 0;
*xlatimport = 0;
#ifdef __UNIX__
strcpy(xlatlocalset, "LATIN-1");
#else
strcpy(xlatlocalset, "IBMPC");
#endif
strcpy(xlatlocalset, get_charset());
strcpy(xlatimport, get_dos_charset(xlatlocalset));
strcpy(xlatexport, xlatimport);
// variables & switches
adeptxbbsuserno = 0;
addressbookadd = YES;

View File

@ -62,6 +62,7 @@ const word CRC_AREAKEEPLAST = 0x5876;
const word CRC_AREALISTECHOMAX = 0x944D;
const word CRC_AREALISTFORMAT = 0x9080;
const word CRC_AREALISTGROUPID = 0x1F75;
const word CRC_AREALISTGROUPORDER=0xCE99;
const word CRC_AREALISTNOS = 0x5FD7;
const word CRC_AREALISTPAGEBAR = 0x6C37;
const word CRC_AREALISTSCAN = 0xDAF7;

View File

@ -203,6 +203,7 @@ SwitchA:
case CRC_AREAISNEWS : CfgAreaisnews (); break;
case CRC_AREALISTECHOMAX : CfgArealistechomax (); break;
case CRC_AREALISTFORMAT : CfgArealistformat (); break;
case CRC_AREALISTGROUPORDER: CfgArealistgrouporder(); break;
case CRC_AREALISTSCAN : CfgArealistscan (); break;
case CRC_AREALISTSORT : CfgArealistsort (); break;
case CRC_AREALISTTYPE : CfgArealisttype (); break;

View File

@ -331,7 +331,15 @@ void CfgArealistechomax() {
void CfgArealistformat() {
strcpy(CFG->arealistformat, StripQuotes(val));
strxcpy(CFG->arealistformat, StripQuotes(val), sizeof(CFG->arealistformat));
}
// ------------------------------------------------------------------
void CfgArealistgrouporder() {
strxcpy(CFG->arealistgrouporder, StripQuotes(val), sizeof(CFG->arealistgrouporder));
}

View File

@ -513,6 +513,10 @@ void CfgXlatexport() {
CFG->grp.AddItm(GRP_XLATEXPORT, buf, strlen(buf)+1);
else
strcpy(CFG->xlatexport, buf);
if(CFG->usecharset and (strieql(buf, "IBMPC") or strieql(buf, "+7_FIDO"))) {
cout << "* Warning: Charset " << buf << " is obsolte. Consider using CPxxx form." << endl;
cfgerrors++;
}
}
// ------------------------------------------------------------------
@ -532,6 +536,10 @@ void CfgXlatimport() {
void CfgXlatlocalset() {
strupr(strxcpy(CFG->xlatlocalset, val, sizeof(CFG->xlatlocalset)));
if(strieql(CFG->xlatlocalset, "IBMPC") or strieql(CFG->xlatlocalset, "+7_FIDO")) {
cout << "* Warning: Charset " << CFG->xlatlocalset << " is obsolte. Cosider using CPxxx form." << endl;
cfgerrors++;
}
}
// ------------------------------------------------------------------

View File

@ -698,6 +698,8 @@ void ReadXlatTables() {
}
fclose(ifp);
}
else
cout << "* XLAT table " << buf << " could not be opened." << endl;
fwrite(&ChsTable, sizeof(Chs), 1, ofp);
}
@ -775,6 +777,8 @@ void ReadXlatTables() {
fclose(ifp);
}
else
cout << "* XLAT table " << buf << " could not be opened." << endl;
fwrite(&EscTable, sizeof(Esc), 1, ofp);
}

View File

@ -63,6 +63,7 @@ void CfgAreakeeplast ();
void CfgArealistechomax ();
void CfgArealistformat ();
void CfgArealistgroupid ();
void CfgArealistgrouporder();
void CfgArealistnos ();
void CfgArealistpagebar ();
void CfgArealistscan ();

View File

@ -52,6 +52,32 @@ int AreaTypeOrder[17] = {
};
// ------------------------------------------------------------------
// Areagroups compare
int compare_groups(int ga, int gb)
{
char *gap, *gbp;
if((ga > 0xff) || (gb > 0xff))
return compare_two(ga, gb);
gap = strchr(CFG->arealistgrouporder, (char)ga);
gbp = strchr(CFG->arealistgrouporder, (char)gb);
if(gap == NULL) {
if(gbp != NULL)
return -1;
else
return compare_two(ga, gb);
}
else {
if(gbp == NULL)
return 1;
else
return compare_two(gap, gbp);
}
}
// ------------------------------------------------------------------
// Arealist compare
@ -123,7 +149,7 @@ extern "C" int AreaListCmp(const Area** __a, const Area** __b) {
return cmp;
}
else {
if((cmp = compare_two(ga, gb)) != 0)
if((cmp = compare_groups(ga, gb)) != 0)
return cmp;
}
}

View File

@ -157,6 +157,7 @@ public:
gstrarray areaisnews;
int arealistechomax;
char arealistformat[80];
char arealistgrouporder[256];
char arealistsort[20]; // areasort[10];
int arealisttype;
Path areapath;

View File

@ -346,7 +346,7 @@ bool GMsgHeaderEdit::validate() {
// ------------------------------------------------------------------
int EditHeaderinfo(int mode, GMsgHeaderView &view) {
int EditHeaderinfo(int mode, GMsgHeaderView &view, bool doedithdr) {
GMsgHeaderEdit hedit(view);
GMsg *msg = view.msg;
@ -374,64 +374,69 @@ int EditHeaderinfo(int mode, GMsgHeaderView &view) {
}
subject = msg->re;
if(AA->isnet())
hedit.lookup = CFG->switches.get(lookupnet);
else if(AA->isecho())
hedit.lookup = CFG->switches.get(lookupecho);
else
hedit.lookup = CFG->switches.get(lookuplocal);
if(doedithdr) {
int from_name_pos = EDIT->HdrNamePos();
int from_name_len = EDIT->HdrNameLen();
int from_addr_pos = EDIT->HdrNodePos();
int from_addr_len = EDIT->HdrNodeLen();
int to_name_pos = from_name_pos;
int to_name_len = from_name_len;
int to_addr_pos = from_addr_pos;
int to_addr_len = hedit.lookup or AA->isnet() ? from_addr_len : 0;
int subject_pos = 8;
int subject_len = MAXCOL - subject_pos;
int name_cvt = AA->Editmixcase() ? GMsgHeaderEdit::cvt_mixedcase : GMsgHeaderEdit::cvt_none;
int addr_cvt = GMsgHeaderEdit::cvt_none;
int subj_cvt = GMsgHeaderEdit::cvt_none;
if(AA->isnet())
hedit.lookup = CFG->switches.get(lookupnet);
else if(AA->isecho())
hedit.lookup = CFG->switches.get(lookupecho);
else
hedit.lookup = CFG->switches.get(lookuplocal);
hedit.setup(C_HEADW, C_HEADW, C_HEADE, _box_table(W_BHEAD,13), true);
int from_name_pos = EDIT->HdrNamePos();
int from_name_len = EDIT->HdrNameLen();
int from_addr_pos = EDIT->HdrNodePos();
int from_addr_len = EDIT->HdrNodeLen();
int to_name_pos = from_name_pos;
int to_name_len = from_name_len;
int to_addr_pos = from_addr_pos;
int to_addr_len = hedit.lookup or AA->isnet() ? from_addr_len : 0;
int subject_pos = 8;
int subject_len = MAXCOL - subject_pos;
int name_cvt = AA->Editmixcase() ? GMsgHeaderEdit::cvt_mixedcase : GMsgHeaderEdit::cvt_none;
int addr_cvt = GMsgHeaderEdit::cvt_none;
int subj_cvt = GMsgHeaderEdit::cvt_none;
hedit.add_field(GMsgHeaderEdit::id_from_name, 2, from_name_pos, from_name_len, from_name, sizeof(INam), name_cvt);
hedit.add_field(GMsgHeaderEdit::id_from_addr, 2, from_addr_pos, from_addr_len, from_addr, sizeof(IAdr), addr_cvt);
hedit.add_field(GMsgHeaderEdit::id_to_name, 3, to_name_pos, to_name_len, to_name, sizeof(INam), name_cvt);
hedit.add_field(GMsgHeaderEdit::id_to_addr, 3, to_addr_pos, to_addr_len, to_addr, sizeof(IAdr), addr_cvt);
hedit.add_field(GMsgHeaderEdit::id_subject, 4, subject_pos, subject_len, subject, sizeof(ISub), subj_cvt);
hedit.setup(C_HEADW, C_HEADW, C_HEADE, _box_table(W_BHEAD,13), true);
hedit.start_id = GMsgHeaderEdit::id_to_name;
switch(mode) {
case MODE_REPLYCOMMENT:
if(not (msg->dest.net or not AA->isnet()))
hedit.add_field(GMsgHeaderEdit::id_from_name, 2, from_name_pos, from_name_len, from_name, sizeof(INam), name_cvt);
hedit.add_field(GMsgHeaderEdit::id_from_addr, 2, from_addr_pos, from_addr_len, from_addr, sizeof(IAdr), addr_cvt);
hedit.add_field(GMsgHeaderEdit::id_to_name, 3, to_name_pos, to_name_len, to_name, sizeof(INam), name_cvt);
hedit.add_field(GMsgHeaderEdit::id_to_addr, 3, to_addr_pos, to_addr_len, to_addr, sizeof(IAdr), addr_cvt);
hedit.add_field(GMsgHeaderEdit::id_subject, 4, subject_pos, subject_len, subject, sizeof(ISub), subj_cvt);
hedit.start_id = GMsgHeaderEdit::id_to_name;
switch(mode) {
case MODE_REPLYCOMMENT:
if(not (msg->dest.net or not AA->isnet()))
break;
// else drop through ...
case MODE_REPLY:
case MODE_QUOTE:
case MODE_CHANGE:
hedit.start_id = GMsgHeaderEdit::id_subject;
break;
// else drop through ...
case MODE_REPLY:
case MODE_QUOTE:
case MODE_CHANGE:
hedit.start_id = GMsgHeaderEdit::id_subject;
break;
}
ChgAttrs(YES, msg);
vcurshow();
if(not (hedit.lookup or AA->isnet())) {
char date2[25] = "";
strsetsz(date2, view.width - CFG->disphdrdateset.pos);
view.window.prints(3, CFG->disphdrdateset.pos, view.to_color, date2);
}
view.window.prints(5, view.width-strlen(LNG->HeaderEditHelp1)-1, view.title_color, LNG->HeaderEditHelp1);
view.window.prints(5, view.width-strlen(LNG->HeaderEditHelp1)-strlen(LNG->HeaderEditHelp2)-3, view.title_color, LNG->HeaderEditHelp2);
hedit.run(H_Header);
vcurhide();
ChgAttrs(NO, msg);
}
ChgAttrs(YES, msg);
vcurshow();
if(not (hedit.lookup or AA->isnet())) {
char date2[25] = "";
strsetsz(date2, view.width - CFG->disphdrdateset.pos);
view.window.prints(3, CFG->disphdrdateset.pos, view.to_color, date2);
}
view.window.prints(5, view.width-strlen(LNG->HeaderEditHelp1)-1, view.title_color, LNG->HeaderEditHelp1);
view.window.prints(5, view.width-strlen(LNG->HeaderEditHelp1)-strlen(LNG->HeaderEditHelp2)-3, view.title_color, LNG->HeaderEditHelp2);
hedit.run(H_Header);
vcurhide();
ChgAttrs(NO, msg);
else
hedit.dropped = false;
if(not hedit.dropped and not gkbd.quitall) {

View File

@ -498,7 +498,7 @@ void Initialize(int argc, char* argv[]) {
// set locale
setlocale(LC_CTYPE, "");
// and get it's name
char* lc = setlocale(LC_CTYPE, "");
const char* lc = setlocale(LC_CTYPE, "");
if(lc and not (strstr(lc, "German_") or strstr(lc, "Polish_")))
right_alt_same_as_left = true;
#if defined(GUTLOS_FUNCS)

View File

@ -65,6 +65,7 @@ enum {
FSC_CHARSET,
FSC_CHRC,
FSC_CHRS,
FSC_CODEPAGE,
FSC_DOMAIN,
FSC_EID,
FSC_ENC,
@ -92,7 +93,6 @@ enum {
enum {
MASK_XXX = 0x8000,
XXX_ACUPDATE,
XXX_CODEPAGE,
XXX_DESTADDR,
XXX_ENCRYPTION,
XXX_EOT,
@ -235,6 +235,7 @@ static const Kludges fsc_list[] = {
{ "CHARSET" , FSC_CHARSET , KCRQ_CASE },
{ "CHRC" , FSC_CHRC , KCRQ_CASE },
{ "CHRS" , FSC_CHRS , KCRQ_CASE },
{ "CODEPAGE" , FSC_CODEPAGE , KCRQ_CASE },
{ "DOMAIN" , FSC_DOMAIN , KCRQ_CASE },
{ "EID" , FSC_EID , KCRQ_CASE },
{ "ENC" , FSC_ENC , KCRQ_CASE },
@ -265,7 +266,6 @@ static const Kludges fsc_list[] = {
static const Kludges xxx_list[] = {
{ "ACUPDATE" , XXX_ACUPDATE , KCRQ_CASE },
{ "CODEPAGE" , XXX_CODEPAGE , KCRQ_CASE },
{ "DESTADDR" , XXX_DESTADDR , KCRQ_CASE },
{ "ENCRYPTION" , XXX_ENCRYPTION , KCRQ_CASE },
{ "EOT" , XXX_EOT , KCRQ_CASE },
@ -958,6 +958,10 @@ static int HandleKludges(GMsg* msg, Line* line, int kludgenum, const char* ptr,
line->kludge = GKLUD_CHARSET;
return true;
case FSC_CODEPAGE:
line->kludge = GKLUD_CHARSET;
return true;
case FSC_DOMAIN:
//line->kludge = GKLUD_DOMAIN;
if(getvalue)
@ -1072,7 +1076,6 @@ static int HandleKludges(GMsg* msg, Line* line, int kludgenum, const char* ptr,
return true;
case XXX_ACUPDATE:
case XXX_CODEPAGE:
case XXX_ENCRYPTION:
case XXX_EOT:
case XXX_GATECHK:
@ -2018,6 +2021,8 @@ void MakeLineIndex(GMsg* msg, int margin, bool header_recode) {
kludgetype = FSC_I51;
else if(strieql(kludge, "CHRS") or strieql(kludge, "CHARSET"))
kludgetype = FSC_CHARSET;
else if(strieql(kludge, "CODEPAGE"))
kludgetype = FSC_CODEPAGE;
else if(strieql(kludge, "Content-Type"))
kludgetype = RFC_CONTENT_TYPE;
else if(strieql(kludge, "Content-Transfer-Encoding"))
@ -2045,10 +2050,13 @@ void MakeLineIndex(GMsg* msg, int margin, bool header_recode) {
strcpy(msg->charset, chsbuf);
}
}
else if(kludgetype == FSC_CHARSET) {
else if((kludgetype == FSC_CHARSET) || (kludgetype == FSC_CODEPAGE)) {
*chsbuf = NUL;
qpencoded = IsQuotedPrintable(ptr);
strxcpy(chsbuf, qpencoded ? ExtractPlainCharset(ptr) : ptr, sizeof(chsbuf));
if(kludgetype == FSC_CODEPAGE)
strxmerge(chsbuf, sizeof(chsbuf), "CP", ptr, NULL);
else
strxcpy(chsbuf, qpencoded ? ExtractPlainCharset(ptr) : ptr, sizeof(chsbuf));
// Workaround for buggy mailreaders which stores '_' in charset name
strchg(chsbuf,'_',' ');
chslev = LoadCharset(chsbuf, CFG->xlatlocalset);

View File

@ -867,11 +867,9 @@ int GMenuEditHeader::Run(int mode, GMsg* msg) {
update_statusline(LNG->EditHeader);
if(doedithdr) {
_tag = EditHeaderinfo(mode, *HeaderView);
if((_tag == W_ESCPRESS) or gkbd.quitall)
break;
}
_tag = EditHeaderinfo(mode, *HeaderView, doedithdr);
if((_tag == W_ESCPRESS) or gkbd.quitall)
break;
do {

View File

@ -261,7 +261,7 @@ bool set_to_address(GMsg* msg, gsetaddr* toname, gsetaddr* toaddr, gsetaddr* fro
// GEPOST prototypes
void MakeMsg(int mode, GMsg* oldmsg, bool ignore_replyto=false);
int EditHeaderinfo(int mode, GMsgHeaderView &view);
int EditHeaderinfo(int mode, GMsgHeaderView &view, bool doedithdr = true);
void CheckSubject(GMsg* msg, char* subj);

View File

@ -54,12 +54,14 @@ char* CvtMessageIDtoMSGID(const char* mptr, char* msgidbuf, const char* echoid,
else {
*bptr++ = *mptr++;
}
if(bptr-msgidbuf > 200) // Check for overrun
break;
}
*bptr = NUL;
}
else {
int spaces = strchr(mptr, ' ') ? true : false;
bool spaces = strchr(mptr, ' ') ? true : false;
dword crc32 = CRC32_MASK_CCITT;
crc32 = strCrc32(mptr, NO, crc32);
@ -72,6 +74,8 @@ char* CvtMessageIDtoMSGID(const char* mptr, char* msgidbuf, const char* echoid,
if(spaces and (*mptr == '\"'))
*bptr++ = '\"';
*bptr++ = *mptr++;
if(bptr-msgidbuf > (200-9-(spaces?2:0))) // Check for overrun
break;
}
if(spaces)
*bptr++ = '\"';
@ -253,6 +257,9 @@ void ProcessSoupMsg(char* lbuf, GMsg* msg, int& msgs, char* areaname, int tossto
ParseInternetAddr(mptr, toname, toaddr);
strxcpy(msg->to, *toname ? toname : toaddr, sizeof(msg->to));
}
else if(MatchRFC(mptr, "X-Comment-To: ")) {
strxcpy(msg->to, mptr, sizeof(msg->to));
}
else if(MatchRFC(mptr, "Cc: ")) {
char* ccbuf = (char*)throw_malloc(strlen(msg->icc) + strlen(mptr) + 3);
strcpy(stpcpy(stpcpy(ccbuf, msg->icc), *msg->icc ? ", " : ""), mptr);

View File

@ -334,6 +334,8 @@ int is_quote(const char* ptr) {
if(IsQuoteChar(ptr))
return true;
endptr = ptr + 11; // match 10 chars after whitespaces
int spaces = 0;
while((ptr < endptr) and *ptr) {

View File

@ -97,14 +97,14 @@ void FreqWaZOO(const char* files, const Addr& dest, const Attr& attr) {
strcpy(filename, outbound);
if(dest.zone != CFG->aka[0].addr.zone) {
sprintf(tmp, ".%03X", dest.zone);
sprintf(tmp, ".%03x", dest.zone);
strcat(filename, tmp);
if(not is_dir(filename))
mkdir(filename, S_IWUSR);
}
AddBackslash(filename);
sprintf(tmp, "%04X%04X", dest.net, dest.node);
sprintf(tmp, "%04x%04x", dest.net, dest.node);
strcat(filename, tmp);
if(dest.point) {
@ -112,7 +112,7 @@ void FreqWaZOO(const char* files, const Addr& dest, const Attr& attr) {
if(not is_dir(filename))
mkdir(filename, S_IWUSR);
AddBackslash(filename);
sprintf(tmp, "%08X", dest.point);
sprintf(tmp, "%08x", dest.point);
strcat(filename, tmp);
}

View File

@ -135,6 +135,7 @@ gutlmisc cpp all nov bcd bco bcx wcn wco wcx lnx emx djg rsx cyg
gutlmtsk cpp all nov bcd bco bcx wcn wco wcx lnx emx djg rsx cyg
gutltag cpp all nov bcd bco bcx wcn wco wcx lnx emx djg rsx cyg
gutlvers cpp all nov bcd bco bcx wcn wco wcx lnx emx djg rsx cyg
gcharset cpp all nov bcd bco bcx wcn wco wcx lnx emx djg rsx cyg
## OS specific utilities
gutldos cpp all djg

113
goldlib/gall/gcharset.cpp Normal file
View File

@ -0,0 +1,113 @@
// This may look like C code, but it is really -*- C++ -*-
// ------------------------------------------------------------------
// The Goldware Library
// Copyright (C) 1990-1999 Odinn Sorensen
// Copyright (C) 1999-2000 Alexander S. Aganichev
// ------------------------------------------------------------------
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library General Public License for more details.
//
// You should have received a copy of the GNU Library General Public
// License along with this program; if not, write to the Free
// Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
// MA 02111-1307, USA
// ------------------------------------------------------------------
// $Id$
// ------------------------------------------------------------------
// Utility functions.
// ------------------------------------------------------------------
#include <cstdlib>
#include <cstdio>
#include <clocale>
#include <gcmpall.h>
#include <gstrall.h>
#ifdef __WIN32__
#include <windows.h>
#endif
#ifdef __OS2__
#define INCL_DOS
#include <os2.h>
#endif
#ifdef __DJGPP__
#include <dpmi.h>
#include <sys/farptr.h>
#endif
static char charsetbuf[256];
const char *get_charset(void)
{
#if defined(__DJGPP__)
int segment, selector;
__dpmi_regs regs;
strcpy(charsetbuf, "IBMPC");
if ((segment = __dpmi_allocate_dos_memory(3, &selector)) != -1) {
regs.h.ah = 0x65;
regs.h.al = 0x01;
regs.x.bx = 0xffff;
regs.x.dx = 0xffff;
regs.x.cx = 41;
regs.x.es = segment;
regs.x.di = 0;
__dpmi_int(0x21, &regs);
if (!(regs.x.flags & 1) and (regs.x.cx == 41)) {
int CCP = _farpeekw(selector, 5);
sprintf(charsetbuf, "CP%i", CCP);
}
__dpmi_free_dos_memory(selector);
}
#elif defined(__WIN32__)
sprintf(charsetbuf, "CP%i", GetOEMCP());
#elif defined(__OS2__)
ULONG CCP[8];
ULONG cb;
strcpy(charsetbuf, "IBMPC");
if(DosQueryCp(sizeof (CCP), CCP, &cb) == 0)
sprintf(charsetbuf, "CP%i", CCP[0]);
#else
const char *cp;
strcpy(charsetbuf, "LATIN-1");
cp = setlocale(LC_CTYPE, "");
if((cp != NULL) and ((cp = strchr(cp, '.')) != NULL)) {
if(strieql(cp, "KOI8R"))
cp = "KOI8-R";
strxcpy(charsetbuf, cp, sizeof(charsetbuf));
}
#endif
return charsetbuf;
}
const char *get_dos_charset(const char *cpfrom)
{
#if defined(__WIN32__) || defined(__MSDOS__) || defined(__OS2__)
(void)cpfrom; // These platforms use DOS CP on console, so ignore request
return "";
#else
static const struct _cpmap {
char *from, *to;
} cpmap[] = {
{ "LATIN-1", "CP437" },
{ "KOI8-R", "CP866" },
{ NULL, NULL }
};
int i;
for(i = 0; cpmap[i].from != NULL; i++) {
if(strieql(cpfrom, cpmap[i].from))
return cpmap[i].to;
}
return "";
#endif
}

38
goldlib/gall/gcharset.h Normal file
View File

@ -0,0 +1,38 @@
// This may look like C code, but it is really -*- C++ -*-
// ------------------------------------------------------------------
// The Goldware Library
// Copyright (C) 1990-1999 Odinn Sorensen
// ------------------------------------------------------------------
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library General Public License for more details.
//
// You should have received a copy of the GNU Library General Public
// License along with this program; if not, write to the Free
// Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
// MA 02111-1307, USA
// ------------------------------------------------------------------
// $Id$
// ------------------------------------------------------------------
// Charset handling utility.
// ------------------------------------------------------------------
#ifndef __gcharset_h
#define __gcharset_h
// ------------------------------------------------------------------
const char *get_charset(void);
const char *get_dos_charset(const char *);
// ------------------------------------------------------------------
#endif // __gcharset_h