From b3496843dd0e423954f487db1dec1fb6db83e9d1 Mon Sep 17 00:00:00 2001 From: Ianos Gnatiuc Date: Mon, 15 May 2006 06:20:57 +0000 Subject: [PATCH] Unlimited reply link chain (max was 30 replies) --- docs/notework.rus | 7 +++--- docs/notework.txt | 2 ++ golded3/gemlst.cpp | 10 ++++----- golded3/gemrks.cpp | 23 +++++++++----------- golded3/gepost.cpp | 17 ++++++++++----- golded3/geread.cpp | 14 +++++++----- goldlib/gmb3/gmo_msg.h | 46 +++++++++++++++++++++++++++------------ goldlib/gmb3/gmojamm3.cpp | 9 ++++---- goldlib/gmb3/gmosqsh3.cpp | 5 +++-- 9 files changed, 80 insertions(+), 53 deletions(-) diff --git a/docs/notework.rus b/docs/notework.rus index f5c13f4..7bfdcc3 100644 --- a/docs/notework.rus +++ b/docs/notework.rus @@ -10,8 +10,9 @@ _____________________________________________________________________________ Заметки для GoldED+ 1.1.5, /snapshot/ _____________________________________________________________________________ ++ Неограниченное число линков на письмо в дереве ответов (было 30). - Исправлено "зависание" клавиатуры в Win32. -+ Улучшено распознавание при квотинга. ++ Улучшено распознавание при квотинге. ! Ключевые слова для клавиш рисования линий изменены с EditGo* на EditBlock*. + SCheckerDefLang может использоваться в группах (Random Group). + Win32: теперь идентификатор языка MS Spellcheker представлен в понятной форме @@ -22,8 +23,8 @@ _____________________________________________________________________________ Снапшот от 26 марта 2006: изменения относительно снапшота от 12 марта 2006. -- GoldEd не использует таблицу перекодировок, если уровень меньше, чем уровень - CHRS-клуджа. +- GoldEd не использует таблицу перекодировок, если её уровень меньше, чем + уровень CHRS-клуджа. - Исправлено отображение инициалов при использовании "среднего имени" (M): QuoteString " FML> " - Исправлено "обрезание" даты и времени при отображении заголовков сообщения. diff --git a/docs/notework.txt b/docs/notework.txt index b62171e..dfbcbb3 100644 --- a/docs/notework.txt +++ b/docs/notework.txt @@ -10,6 +10,8 @@ ______________________________________________________________________ Notes for GoldED+ 1.1.5, /snapshot/ ______________________________________________________________________ ++ Unlimited reply link chain (max was 30 replies). + - Fixed keyboard deadlock on win32. + Improved false quote handling. diff --git a/golded3/gemlst.cpp b/golded3/gemlst.cpp index 98895ea..aa02c10 100644 --- a/golded3/gemlst.cpp +++ b/golded3/gemlst.cpp @@ -1046,17 +1046,17 @@ void GThreadlist::recursive_build(uint32_t msgn, uint32_t rn, uint32_t level) { } } - if(found or (list_size == 0)) + if (found or (list_size == 0)) list.push_back(t); recursive_build(msg.link.first(), msg.link.list(0), level+1); - for(int n=0; n < msg.link.list_max()-1; n++) { - if(msg.link.list(n)) { + for(size_t n = 0, max = msg.link.list_max(); n < max; n++) + { + if (msg.link.list(n)) recursive_build(msg.link.list(n), msg.link.list(n+1), level+1); - } else - break; } + AA->LoadHdr(&msg, oldmsgno); } } diff --git a/golded3/gemrks.cpp b/golded3/gemrks.cpp index 73b8ecf..47e6b7c 100644 --- a/golded3/gemrks.cpp +++ b/golded3/gemrks.cpp @@ -220,21 +220,18 @@ void MarkMsgs_Txt(int item, char* markstring) { static void recursive_mark(GMsg* msg, uint32_t msgno, bool markasread) { - int i; - gmsg_links templink; - - if(AA->Msgn.ToReln(msgno) and AA->LoadHdr(msg, msgno, false)) { - - templink = msg->link; + if (AA->Msgn.ToReln(msgno) and AA->LoadHdr(msg, msgno, false)) + { + gmsg_links templink = msg->link; if (!markasread) { - if(templink.first()) + if (templink.first()) AA->Mark.Add(templink.first()); - for(i = 0; i < templink.list_max(); i++) + for (size_t i = 0, max = templink.list_max(); i < max; i++) { - if(templink.list(i)) + if (templink.list(i)) AA->Mark.Add(templink.list(i)); } } @@ -244,13 +241,13 @@ static void recursive_mark(GMsg* msg, uint32_t msgno, bool markasread) AA->UpdateTimesread(msg); } - if(templink.first()) + if (templink.first()) recursive_mark(msg, templink.first(), markasread); - for(i = 0; i < templink.list_max(); i++) { - if(templink.list(i)) { + for (size_t i = 0, max = templink.list_max(); i < max; i++) + { + if (templink.list(i)) recursive_mark(msg, templink.list(i), markasread); - } } } } diff --git a/golded3/gepost.cpp b/golded3/gepost.cpp index dae4605..64cd4c7 100644 --- a/golded3/gepost.cpp +++ b/golded3/gepost.cpp @@ -1151,17 +1151,22 @@ void MakeMsg(int mode, GMsg* omsg, bool ignore_replyto) { if(AA->LoadHdr(reply, reply_msgno, false)) { uint32_t replynext; bool ok2save = false; - if(streql(AA->basetype(), "SQUISH")) { - if(reply->link.first()) { - for(int r=0; rlink.list_max()-1; r++) { - if(reply->link.list(r) == 0) { + + if (streql(AA->basetype(), "SQUISH")) + { + if (reply->link.first()) + { + for (size_t r = 0; !ok2save; r++) + { + if (reply->link.list(r) == 0) + { reply->link.list_set(r, msg->msgno); ok2save = true; - break; } } } - else { + else + { reply->link.first_set(msg->msgno); ok2save = true; } diff --git a/golded3/geread.cpp b/golded3/geread.cpp index ac3fcae..7ecb1e8 100644 --- a/golded3/geread.cpp +++ b/golded3/geread.cpp @@ -1052,16 +1052,18 @@ void Reader() { // ------------------------------------------------------------------ // Determine if the message has replies -uint32_t MsgHasReplies(GMsg* msg) { - - if(msg->link.first()) +uint32_t MsgHasReplies(GMsg* msg) +{ + if (msg->link.first()) return msg->link.first(); - for(int n=0; nlink.list_max(); n++) - if(msg->link.list(n)) + for (size_t n = 0, max = msg->link.list_max(); n < max; n++) + { + if (msg->link.list(n)) return msg->link.list(n); + } - if(msg->link.next()) + if (msg->link.next()) return msg->link.next(); return 0; diff --git a/goldlib/gmb3/gmo_msg.h b/goldlib/gmb3/gmo_msg.h index e291163..4de9577 100644 --- a/goldlib/gmb3/gmo_msg.h +++ b/goldlib/gmb3/gmo_msg.h @@ -39,6 +39,8 @@ #include #include +#include + // ------------------------------------------------------------------ // Internet name typedefs @@ -180,37 +182,53 @@ Line* AddHexdump(Line*& line, void* data, size_t datalen); // ------------------------------------------------------------------ -class gmsg_links { - +class gmsg_links +{ private: - - enum { list_limit = 29 }; - uint32_t reply_to; uint32_t reply_first; - uint32_t reply_list[list_limit]; uint32_t reply_next; + std::vector reply_list; + public: - void reset() { + void reset() + { reply_to = reply_first = reply_next = 0; - for(int n=0; n= size) + { + for (size_t i = size; i <= n; i++) + reply_list.push_back(0); + } + + reply_list[n] = m; + } + uint32_t to() const { return reply_to; } uint32_t first() const { return reply_first; } - uint32_t list(int n) const { return reply_list[n]; } uint32_t next() const { return reply_next; } + uint32_t list(size_t n) const + { + if (n >= reply_list.size()) + return 0; + + return reply_list[n]; + } + }; @@ -276,7 +294,7 @@ public: uint board; // Board number (if applicable) - uint32_t msgno; // Message number + uint32_t msgno; // Message number gmsg_links link; // Message reply links ftn_addr oorig; // Original origination address diff --git a/goldlib/gmb3/gmojamm3.cpp b/goldlib/gmb3/gmojamm3.cpp index 70fb3cf..490e8be 100644 --- a/goldlib/gmb3/gmojamm3.cpp +++ b/goldlib/gmb3/gmojamm3.cpp @@ -313,10 +313,12 @@ int JamArea::load_message(int __mode, gmsg* __msg, JamHdr& __hdr) { throw_free(_subfield); // Get reply numbers in chain - if(wide->lookreplies and __msg->link.first()) { + if (wide->lookreplies and __msg->link.first()) + { int r = 0; uint32_t m = __msg->link.first(); - while(m and (r < __msg->link.list_max())) { + while (m) + { JamHdr _rhdr; memset(&_rhdr, 0, sizeof(JamHdr)); lseekset(data->fhjdx, m-data->hdrinfo.basemsgnum, sizeof(JamIndex)); @@ -324,8 +326,7 @@ int JamArea::load_message(int __mode, gmsg* __msg, JamHdr& __hdr) { lseekset(data->fhjhr, _idx.hdroffset); read(data->fhjhr, &_rhdr, sizeof(JamHdr)); m = _rhdr.replynext; - if(m) - __msg->link.list_set(r++, m); + if (m) __msg->link.list_set(r++, m); } } diff --git a/goldlib/gmb3/gmosqsh3.cpp b/goldlib/gmb3/gmosqsh3.cpp index 6e880b4..bdaf040 100644 --- a/goldlib/gmb3/gmosqsh3.cpp +++ b/goldlib/gmb3/gmosqsh3.cpp @@ -107,8 +107,9 @@ int SquishArea::load_message(int __mode, gmsg* __msg, SqshHdr& __hdr) { // Convert link.list int q = 0; int r = __hdr.replies[0] == __hdr.replies[1] ? 2 : 1; - while(r<=8) { - if(__hdr.replies[r] and __hdr.replies[r-1] != __hdr.replies[r]) + while (r <= 8) + { + if (__hdr.replies[r] and __hdr.replies[r-1] != __hdr.replies[r]) __msg->link.list_set(q++, __hdr.replies[r]); r++; }