From d9891a8e6e3e5cfdddadd07544f895bafe7623f7 Mon Sep 17 00:00:00 2001 From: "Alexander S. Aganichev" Date: Tue, 3 Jul 2001 04:27:54 +0000 Subject: [PATCH] Different fixes --- docs/notework.txt | 20 +++++++ golded3/gccfgg.cpp | 13 ++--- golded3/gccfgg.h | 1 + golded3/gccfgg0.cpp | 1 + golded3/gccfgg1.cpp | 10 +++- golded3/gccfgg8.cpp | 8 +++ golded3/gcmisc.cpp | 4 ++ golded3/gcprot.h | 1 + golded3/gealst.cpp | 28 +++++++++- golded3/gecfgg.h | 1 + golded3/gehdre.cpp | 111 +++++++++++++++++++------------------ golded3/geinit.cpp | 2 +- golded3/geline.cpp | 18 ++++-- golded3/gemnus.cpp | 8 +-- golded3/geprot.h | 2 +- golded3/gesoup.cpp | 9 ++- golded3/geutil.cpp | 2 + golded3/gmarea.cpp | 6 +- goldlib/gall/gall.all | 1 + goldlib/gall/gcharset.cpp | 113 ++++++++++++++++++++++++++++++++++++++ goldlib/gall/gcharset.h | 38 +++++++++++++ 21 files changed, 318 insertions(+), 79 deletions(-) create mode 100644 goldlib/gall/gcharset.cpp create mode 100644 goldlib/gall/gcharset.h diff --git a/docs/notework.txt b/docs/notework.txt index 1c535c4..09b0458 100644 --- a/docs/notework.txt +++ b/docs/notework.txt @@ -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 diff --git a/golded3/gccfgg.cpp b/golded3/gccfgg.cpp index 2f46edb..fda249d 100644 --- a/golded3/gccfgg.cpp +++ b/golded3/gccfgg.cpp @@ -26,6 +26,7 @@ #include #include +#include // ------------------------------------------------------------------ @@ -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; diff --git a/golded3/gccfgg.h b/golded3/gccfgg.h index 713d8f9..e25e2e9 100644 --- a/golded3/gccfgg.h +++ b/golded3/gccfgg.h @@ -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; diff --git a/golded3/gccfgg0.cpp b/golded3/gccfgg0.cpp index 488d7fb..dabd7c3 100644 --- a/golded3/gccfgg0.cpp +++ b/golded3/gccfgg0.cpp @@ -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; diff --git a/golded3/gccfgg1.cpp b/golded3/gccfgg1.cpp index 75a916b..266e783 100644 --- a/golded3/gccfgg1.cpp +++ b/golded3/gccfgg1.cpp @@ -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)); } diff --git a/golded3/gccfgg8.cpp b/golded3/gccfgg8.cpp index 99c54e0..ab2c601 100644 --- a/golded3/gccfgg8.cpp +++ b/golded3/gccfgg8.cpp @@ -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++; + } } // ------------------------------------------------------------------ diff --git a/golded3/gcmisc.cpp b/golded3/gcmisc.cpp index 33bd434..305312e 100644 --- a/golded3/gcmisc.cpp +++ b/golded3/gcmisc.cpp @@ -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); } diff --git a/golded3/gcprot.h b/golded3/gcprot.h index 69f5ba0..2495d9e 100644 --- a/golded3/gcprot.h +++ b/golded3/gcprot.h @@ -63,6 +63,7 @@ void CfgAreakeeplast (); void CfgArealistechomax (); void CfgArealistformat (); void CfgArealistgroupid (); +void CfgArealistgrouporder(); void CfgArealistnos (); void CfgArealistpagebar (); void CfgArealistscan (); diff --git a/golded3/gealst.cpp b/golded3/gealst.cpp index 8a17bc7..740e4c2 100644 --- a/golded3/gealst.cpp +++ b/golded3/gealst.cpp @@ -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; } } diff --git a/golded3/gecfgg.h b/golded3/gecfgg.h index 2dd4886..5e6ebc1 100644 --- a/golded3/gecfgg.h +++ b/golded3/gecfgg.h @@ -157,6 +157,7 @@ public: gstrarray areaisnews; int arealistechomax; char arealistformat[80]; + char arealistgrouporder[256]; char arealistsort[20]; // areasort[10]; int arealisttype; Path areapath; diff --git a/golded3/gehdre.cpp b/golded3/gehdre.cpp index d100afd..08561fd 100644 --- a/golded3/gehdre.cpp +++ b/golded3/gehdre.cpp @@ -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) { diff --git a/golded3/geinit.cpp b/golded3/geinit.cpp index a6e150c..1223d09 100644 --- a/golded3/geinit.cpp +++ b/golded3/geinit.cpp @@ -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) diff --git a/golded3/geline.cpp b/golded3/geline.cpp index 344e442..fe931c2 100644 --- a/golded3/geline.cpp +++ b/golded3/geline.cpp @@ -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); diff --git a/golded3/gemnus.cpp b/golded3/gemnus.cpp index f28fa15..34bd5cf 100644 --- a/golded3/gemnus.cpp +++ b/golded3/gemnus.cpp @@ -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 { diff --git a/golded3/geprot.h b/golded3/geprot.h index 4b3de2d..17db51f 100644 --- a/golded3/geprot.h +++ b/golded3/geprot.h @@ -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); diff --git a/golded3/gesoup.cpp b/golded3/gesoup.cpp index cf85112..1b08445 100644 --- a/golded3/gesoup.cpp +++ b/golded3/gesoup.cpp @@ -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); diff --git a/golded3/geutil.cpp b/golded3/geutil.cpp index 041c10d..d1eb615 100644 --- a/golded3/geutil.cpp +++ b/golded3/geutil.cpp @@ -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) { diff --git a/golded3/gmarea.cpp b/golded3/gmarea.cpp index 0e63f40..9943c15 100644 --- a/golded3/gmarea.cpp +++ b/golded3/gmarea.cpp @@ -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); } diff --git a/goldlib/gall/gall.all b/goldlib/gall/gall.all index 52d5abd..a9aec75 100644 --- a/goldlib/gall/gall.all +++ b/goldlib/gall/gall.all @@ -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 diff --git a/goldlib/gall/gcharset.cpp b/goldlib/gall/gcharset.cpp new file mode 100644 index 0000000..5dbf467 --- /dev/null +++ b/goldlib/gall/gcharset.cpp @@ -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 +#include +#include +#include +#include +#ifdef __WIN32__ +#include +#endif +#ifdef __OS2__ +#define INCL_DOS +#include +#endif +#ifdef __DJGPP__ +#include +#include +#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, ®s); + 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 +} diff --git a/goldlib/gall/gcharset.h b/goldlib/gall/gcharset.h new file mode 100644 index 0000000..f87da77 --- /dev/null +++ b/goldlib/gall/gcharset.h @@ -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