diff --git a/docs/notework.txt b/docs/notework.txt index dff6db8..1c535c4 100644 --- a/docs/notework.txt +++ b/docs/notework.txt @@ -12,6 +12,12 @@ ______________________________________________________________________ Notes for GoldED+ 1.1.5, /snapshot/ ______________________________________________________________________ +- Fixed crash on very long name in Internet messages. + +! ZapQuotesBelow now acts only on the single quotation block, not on + the all quotes below. It's more handy, especially in case of + removing attach from the file. + ! A lot of improvements in charset handling added. QP postfix now could be used with any charset, not only with LATIN1. Completely untested! diff --git a/golded3/geedit.cpp b/golded3/geedit.cpp index 75e88f5..a8101d1 100644 --- a/golded3/geedit.cpp +++ b/golded3/geedit.cpp @@ -902,7 +902,10 @@ Line* IEclass::wrapit(Line** __currline, uint* __curr_col, uint* __curr_row, boo } if(__display and (scroll != 0)) { - refresh((*__currline)->next, _cursrow+1); + if((*__currline)->next != NULL) + refresh((*__currline)->next, _cursrow+1); + else + refresh(*__currline, _cursrow); } // Update cursor position @@ -1204,15 +1207,13 @@ void IEclass::Newline() { // Pointer to the split position int _splitpos = col; - char _quotebuf[MAXQUOTELEN]; - *_quotebuf = NUL; - // Buffer for the second part of the split line string _splitbuf; // If the split line was quoted, get the quotestring // But do not get it if the cursor points to a linefeed or is uint _quotelen; + char _quotebuf[MAXQUOTELEN]; GetQuotestr(currline->txt.c_str(), _quotebuf, &_quotelen); // Eliminate the quotestring if @@ -1238,17 +1239,32 @@ void IEclass::Newline() { setlinetype(currline); displine(currline, row); - // Insert a new line below, set the line text to the split-off part - currline = insertlinebelow(currline, _splitbuf.c_str()); + uint _quotelen1 = 0; + char _quotebuf1[MAXQUOTELEN] = ""; + if(currline->next != NULL) { + GetQuotestr(currline->next->txt.c_str(), _quotebuf1, &_quotelen1); + } - // --v-- - // This line would be wrapped - // This line would be - // wrapped + if((_splitbuf.find('\n') != _splitbuf.npos) or (currline->next == NULL) or not strieql(_quotebuf, _quotebuf1)) { + // Insert a new line below, set the line text to the split-off part + currline = insertlinebelow(currline, _splitbuf.c_str()); - Undo->PushItem(EDIT_UNDO_WRAP_TEXT|BATCH_MODE, currline->prev, _quotelen, _splitbuf.length() - _quotelen); + // --v-- + // This line would be wrapped + // This line would be + // wrapped - setlinetype(currline); + Undo->PushItem(EDIT_UNDO_WRAP_TEXT|BATCH_MODE, currline->prev, _quotelen, _splitbuf.length() - _quotelen); + + setlinetype(currline); + } + else { + currline = currline->next; + + currline->txt.insert(_quotelen1, _splitbuf.substr(_quotelen1)); + + Undo->PushItem(EDIT_UNDO_WRAP_TEXT|BATCH_MODE, currline->prev, _quotelen1, _splitbuf.length() - _quotelen1); + } // Move down the cursor col = 0; @@ -1259,7 +1275,8 @@ void IEclass::Newline() { scrolldown(mincol, row, maxcol, maxrow); // Rewrap the split-off line - wrapdel(&currline, &col, &row); + wrapdel(&currline, &col, &row, true); + refresh(currline, row); GFTRK(NULL); } @@ -1504,13 +1521,32 @@ void IEclass::deleteline(bool zapquotesbelow) { GFTRK("Editdeleteline"); + if(zapquotesbelow and not (currline->type & GLINE_QUOT)) { + GFTRK(NULL); + return; + } + + // Stop reflow if the quotestring on the next line is not the same + uint _qlen1; + char _qstr1[MAXQUOTELEN]; + GetQuotestr(currline->txt.c_str(), _qstr1, &_qlen1); + bool done = false; do { // Break if need to zap quotes, but the current line is not quote and is not empty - if(zapquotesbelow and not ((currline->type & GLINE_QUOT) or strblank(currline->txt.c_str()))) - break; + if(zapquotesbelow) { + if(isempty(currline) or (currline->type & (GLINE_KLUDGE|GLINE_TEAR|GLINE_ORIG|GLINE_TAGL))) + break; + + // Stop zap if the quotestring on the line is not the same + uint _qlen2; + char _qstr2[MAXQUOTELEN]; + GetQuotestr(currline->txt.c_str(), _qstr2, &_qlen2); + if(not cmp_quotes(_qstr1, _qstr2)) + break; + } // Pointer to the deleted line Line* _deletedline = currline; @@ -1647,7 +1683,6 @@ void IEclass::ZapQuoteBelow() { if(row) { GoUp(); GoEOL(); - Newline(); } else { UndoItem* i = Undo->last_item; diff --git a/golded3/geline.cpp b/golded3/geline.cpp index cd9bab8..0c12eb6 100644 --- a/golded3/geline.cpp +++ b/golded3/geline.cpp @@ -160,6 +160,7 @@ enum { RFC_MIME_VERSION, RFC_NEWSGROUPS, RFC_NEWS_SOFTWARE, + RFC_NNTP_POSTING_DATE, RFC_NNTP_POSTING_HOST, RFC_NNTP_POSTING_USER, RFC_OLD_DATE, @@ -335,6 +336,7 @@ static const Kludges rfc_list[] = { { "MIME-Version" , RFC_MIME_VERSION , KCRQ_COLON }, { "Newsgroups" , RFC_NEWSGROUPS , KCRQ_COLON }, { "News-Software" , RFC_NEWS_SOFTWARE , KCRQ_COLON }, + { "NNTP-Posting-Date" , RFC_NNTP_POSTING_DATE , KCRQ_COLON }, { "NNTP-Posting-Host" , RFC_NNTP_POSTING_HOST , KCRQ_COLON }, { "NNTP-Posting-User" , RFC_NNTP_POSTING_USER , KCRQ_COLON }, { "Old-Date" , RFC_OLD_DATE , KCRQ_COLON }, @@ -1266,6 +1268,7 @@ int HandleRFCs(GMsg* msg, Line* line, int kludgenum, const char* ptr, int getval case RFC_LINES: case RFC_MAILING_LIST: case RFC_NEWS_SOFTWARE: + case RFC_NNTP_POSTING_DATE: case RFC_NNTP_POSTING_HOST: case RFC_NNTP_POSTING_USER: case RFC_OLD_DATE: @@ -2469,7 +2472,7 @@ void MakeLineIndex(GMsg* msg, int margin, bool header_recode) { char lwsp = *linep->next->txt.c_str(); while((lwsp == ' ') or (lwsp == '\t') or (linep->type & GLINE_WRAP)) { linep = linep->next; - linep->type |= linep->prev->type; + linep->type |= linep->prev->type & (GLINE_KLUD|GLINE_HIDD); linep->color = linep->prev->color; if(linep->next) lwsp = *linep->next->txt.c_str(); @@ -2928,8 +2931,6 @@ Line* AddHexdump(Line*& line, void* data, size_t datalen) { char* ParseInternetAddr(char* __string, char* __name, char* __addr) { *__name = *__addr = NUL; - char* name = __name; - char* addr = __addr; char* commaptr = NULL; if(strchr(__string, ',')) { @@ -2968,12 +2969,8 @@ char* ParseInternetAddr(char* __string, char* __name, char* __addr) { } if(*begchar == '(' /*)*/) begchar++; - if(not strchr(__string, '@') and strchr(begchar, '@')) { - name = __addr; - addr = __name; - } - strbtrim(strxcpy(name, begchar, (uint)(endchar-begchar)+1)); - strbtrim(strxcpy(addr, __string, (uint)(begchar-__string))); + strbtrim(strxcpy(__name, begchar, MinV((uint)(endchar-begchar)+1, sizeof(INam)))); + strbtrim(strxcpy(__addr, __string, MinV((uint)(begchar-__string), sizeof(IAdr)))); } else if(*endchar == '>') { char* endaddr = endchar; @@ -2985,15 +2982,11 @@ char* ParseInternetAddr(char* __string, char* __name, char* __addr) { endchar--; } __string = strskip_wht(__string); - if(not strchr(begaddr, '@') and strchr(__string, '@')) { - name = __addr; - addr = __name; - } - strbtrim(strxcpy(name, __string, (uint)(endchar-__string)+1)); - strbtrim(strxcpy(addr, begaddr, (uint)(endaddr-begaddr)+1)); + strbtrim(strxcpy(__name, __string, MinV((uint)(endchar-__string)+1, sizeof(INam)))); + strbtrim(strxcpy(__addr, begaddr, MinV((uint)(endaddr-begaddr)+1, sizeof(IAdr)))); } else { - strcpy(__addr, __string); + strxcpy(__addr, __string, sizeof(IAdr)); } if(*__addr == '@') { @@ -3007,6 +3000,9 @@ char* ParseInternetAddr(char* __string, char* __name, char* __addr) { StripQuotes(__name); + if(not strchr(__addr, '@')) + *__addr = NUL; + strxmimecpy(__name, __name, 0, strlen(__name)+1, true); return __name; diff --git a/goldlib/gall/gctype.h b/goldlib/gall/gctype.h index 3c88c7f..9e455a5 100644 --- a/goldlib/gall/gctype.h +++ b/goldlib/gall/gctype.h @@ -30,8 +30,6 @@ // ------------------------------------------------------------------ -#include -#include #ifdef __BORLANDC__ #define __USELOCALES__ #elif defined(__EMX__) @@ -47,14 +45,14 @@ extern "C" { #endif extern char tl[256], tu[256]; -inline int _nls_tolower(int c) { return tl[c]; } -inline int _nls_toupper(int c) { return tu[c]; } +__inline__ int _nls_tolower(int c) { return tl[c]; } +__inline__ int _nls_toupper(int c) { return tu[c]; } #ifdef __cplusplus } +#endif #define tolower(a) _nls_tolower((unsigned char)(a)) #define toupper(a) _nls_toupper((unsigned char)(a)) #endif -#endif // ------------------------------------------------------------------ @@ -63,7 +61,7 @@ inline int _nls_toupper(int c) { return tu[c]; } extern "C" { #endif // NLS chars detected by converting to lower or upper case and in case they don't match they treated as characters -inline int isxalnum(char c) { return isascii(c) ? isalnum(c) : (c != tolower(c)) or (c != toupper(c)); } +__inline__ int isxalnum(char c) { return isascii(c) ? isalnum(c) : (c != tolower(c)) || (c != toupper(c)); } #ifdef __cplusplus } #endif diff --git a/goldlib/gall/gutlmisc.cpp b/goldlib/gall/gutlmisc.cpp index 555d74a..40e5df2 100644 --- a/goldlib/gall/gutlmisc.cpp +++ b/goldlib/gall/gutlmisc.cpp @@ -26,9 +26,8 @@ // ------------------------------------------------------------------ #include -#include -#include #include +#include // ------------------------------------------------------------------ diff --git a/goldlib/gall/gutlmisc.h b/goldlib/gall/gutlmisc.h index aac4072..bb8b11f 100644 --- a/goldlib/gall/gutlmisc.h +++ b/goldlib/gall/gutlmisc.h @@ -31,6 +31,7 @@ // ------------------------------------------------------------------ +#include #include #include diff --git a/goldlib/glibc/Makefile b/goldlib/glibc/Makefile index c23a6ae..b10ba34 100644 --- a/goldlib/glibc/Makefile +++ b/goldlib/glibc/Makefile @@ -2,7 +2,7 @@ TOP=../.. TARGET=glibc -INCS=-I$(TOP)/goldlib/glibc +INCS=-I$(TOP)/goldlib/glibc -I$(TOP)/goldlib/gall CFLAGS=-DHAVE_CONFIG_H include $(TOP)/GNUmakef.inc diff --git a/goldlib/glibc/fnmatch.c b/goldlib/glibc/fnmatch.c index 2d6f6af..abbbe67 100644 --- a/goldlib/glibc/fnmatch.c +++ b/goldlib/glibc/fnmatch.c @@ -27,7 +27,7 @@ #include #include -#include +#include #if HAVE_STRING_H # include diff --git a/goldlib/glibc/regex.c b/goldlib/glibc/regex.c index ba01f73..bd8fe3d 100644 --- a/goldlib/glibc/regex.c +++ b/goldlib/glibc/regex.c @@ -210,7 +210,7 @@ init_syntax_once () #include "regex.h" /* isalpha etc. are used for the character classes. */ -#include +#include /* Jim Meyering writes: