Improved speed of long messages handling
This commit is contained in:
parent
504ede0afd
commit
de9f258747
@ -87,9 +87,8 @@ void SaveLines(int mode, const char* savefile, GMsg* msg, int margin, bool clip)
|
|||||||
while(line) {
|
while(line) {
|
||||||
uint lineisctrl = line->type & (GLINE_TEAR|GLINE_ORIG|GLINE_KLUDGE);
|
uint lineisctrl = line->type & (GLINE_TEAR|GLINE_ORIG|GLINE_KLUDGE);
|
||||||
if(not ((mode == MODE_SAVENOCTRL) and lineisctrl)) {
|
if(not ((mode == MODE_SAVENOCTRL) and lineisctrl)) {
|
||||||
std::string::iterator p = line->txt.begin();
|
|
||||||
while(p != line->txt.end()) {
|
|
||||||
if(mode == MODE_WRITE) {
|
if(mode == MODE_WRITE) {
|
||||||
|
for(std::string::iterator p = line->txt.begin(); p != line->txt.end(); p++) {
|
||||||
// Replace control codes, except the ANSI escape code
|
// Replace control codes, except the ANSI escape code
|
||||||
if(iscntrl(*p)) {
|
if(iscntrl(*p)) {
|
||||||
// only allow ESC in file write
|
// only allow ESC in file write
|
||||||
@ -98,7 +97,6 @@ void SaveLines(int mode, const char* savefile, GMsg* msg, int margin, bool clip)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
p++;
|
|
||||||
}
|
}
|
||||||
const char *ptr = line->txt.c_str();
|
const char *ptr = line->txt.c_str();
|
||||||
fwrite(ptr, strlen(ptr), 1, prnfp);
|
fwrite(ptr, strlen(ptr), 1, prnfp);
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
extern GMsg* reader_msg;
|
extern GMsg* reader_msg;
|
||||||
extern bool reader_gen_confirm;
|
extern bool reader_gen_confirm;
|
||||||
|
|
||||||
|
const int REALLOC_CACHE_SIZE = 4096;
|
||||||
|
|
||||||
// ------------------------------------------------------------------
|
// ------------------------------------------------------------------
|
||||||
|
|
||||||
@ -307,6 +308,9 @@ int TemplateToText(int mode, GMsg* msg, GMsg* oldmsg, const char* tpl, int origa
|
|||||||
msg->txt = throw_strdup(buf);
|
msg->txt = throw_strdup(buf);
|
||||||
len = size = pos = 0;
|
len = size = pos = 0;
|
||||||
|
|
||||||
|
size_t oldmsg_size = oldmsg->txt ? strlen(oldmsg->txt) : REALLOC_CACHE_SIZE;
|
||||||
|
size_t msg_txt_realloc_cache = 0;
|
||||||
|
|
||||||
while(fgets(buf, sizeof(buf), fp)) {
|
while(fgets(buf, sizeof(buf), fp)) {
|
||||||
ptr = strskip_wht(buf);
|
ptr = strskip_wht(buf);
|
||||||
if(*ptr != ';') {
|
if(*ptr != ';') {
|
||||||
@ -583,7 +587,13 @@ int TemplateToText(int mode, GMsg* msg, GMsg* oldmsg, const char* tpl, int origa
|
|||||||
strcat(buf, "\r");
|
strcat(buf, "\r");
|
||||||
len = strlen(buf);
|
len = strlen(buf);
|
||||||
size += len;
|
size += len;
|
||||||
msg->txt = (char*)throw_realloc(msg->txt, size+10);
|
if(msg_txt_realloc_cache >= len) {
|
||||||
|
msg_txt_realloc_cache -= len;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
msg_txt_realloc_cache += REALLOC_CACHE_SIZE;
|
||||||
|
msg->txt = (char*)throw_realloc(msg->txt, size+10+msg_txt_realloc_cache);
|
||||||
|
}
|
||||||
strcpy(&(msg->txt[pos]), buf);
|
strcpy(&(msg->txt[pos]), buf);
|
||||||
pos += len;
|
pos += len;
|
||||||
}
|
}
|
||||||
@ -611,7 +621,13 @@ int TemplateToText(int mode, GMsg* msg, GMsg* oldmsg, const char* tpl, int origa
|
|||||||
strcat(buf, "\r");
|
strcat(buf, "\r");
|
||||||
len = strlen(buf);
|
len = strlen(buf);
|
||||||
size += len;
|
size += len;
|
||||||
msg->txt = (char*)throw_realloc(msg->txt, size+10);
|
if(msg_txt_realloc_cache >= len) {
|
||||||
|
msg_txt_realloc_cache -= len;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
msg_txt_realloc_cache += REALLOC_CACHE_SIZE;
|
||||||
|
msg->txt = (char*)throw_realloc(msg->txt, size+10+msg_txt_realloc_cache);
|
||||||
|
}
|
||||||
strcpy(&(msg->txt[pos]), buf);
|
strcpy(&(msg->txt[pos]), buf);
|
||||||
pos += len;
|
pos += len;
|
||||||
}
|
}
|
||||||
@ -727,7 +743,13 @@ int TemplateToText(int mode, GMsg* msg, GMsg* oldmsg, const char* tpl, int origa
|
|||||||
strcat(buf, "\r");
|
strcat(buf, "\r");
|
||||||
len = strlen(buf);
|
len = strlen(buf);
|
||||||
size += len;
|
size += len;
|
||||||
msg->txt = (char*)throw_realloc(msg->txt, size+10);
|
if(msg_txt_realloc_cache >= len) {
|
||||||
|
msg_txt_realloc_cache -= len;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
msg_txt_realloc_cache += REALLOC_CACHE_SIZE;
|
||||||
|
msg->txt = (char*)throw_realloc(msg->txt, size+10+msg_txt_realloc_cache);
|
||||||
|
}
|
||||||
strcpy(&(msg->txt[pos]), buf);
|
strcpy(&(msg->txt[pos]), buf);
|
||||||
pos += len;
|
pos += len;
|
||||||
}
|
}
|
||||||
@ -765,7 +787,13 @@ int TemplateToText(int mode, GMsg* msg, GMsg* oldmsg, const char* tpl, int origa
|
|||||||
}
|
}
|
||||||
len = strlen(buf);
|
len = strlen(buf);
|
||||||
size += len;
|
size += len;
|
||||||
msg->txt = (char*)throw_realloc(msg->txt, size+10);
|
if(msg_txt_realloc_cache >= (len+1)) {
|
||||||
|
msg_txt_realloc_cache -= (len+1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
msg_txt_realloc_cache += (size <= oldmsg_size) ? oldmsg_size : REALLOC_CACHE_SIZE;
|
||||||
|
msg->txt = (char*)throw_realloc(msg->txt, size+10+msg_txt_realloc_cache);
|
||||||
|
}
|
||||||
strcpy(&(msg->txt[pos]), buf);
|
strcpy(&(msg->txt[pos]), buf);
|
||||||
pos += len;
|
pos += len;
|
||||||
if(oldmsg->line[n]->type & GLINE_HARD) {
|
if(oldmsg->line[n]->type & GLINE_HARD) {
|
||||||
@ -796,7 +824,13 @@ int TemplateToText(int mode, GMsg* msg, GMsg* oldmsg, const char* tpl, int origa
|
|||||||
TokenXlat(mode, buf, msg, oldmsg, origarea);
|
TokenXlat(mode, buf, msg, oldmsg, origarea);
|
||||||
len = strlen(buf);
|
len = strlen(buf);
|
||||||
size += len;
|
size += len;
|
||||||
msg->txt = (char*)throw_realloc(msg->txt, size+10);
|
if(msg_txt_realloc_cache >= len) {
|
||||||
|
msg_txt_realloc_cache -= len;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
msg_txt_realloc_cache += REALLOC_CACHE_SIZE;
|
||||||
|
msg->txt = (char*)throw_realloc(msg->txt, size+10+msg_txt_realloc_cache);
|
||||||
|
}
|
||||||
strcpy(&(msg->txt[pos]), buf);
|
strcpy(&(msg->txt[pos]), buf);
|
||||||
pos += len;
|
pos += len;
|
||||||
}
|
}
|
||||||
@ -841,7 +875,13 @@ int TemplateToText(int mode, GMsg* msg, GMsg* oldmsg, const char* tpl, int origa
|
|||||||
TokenXlat(mode, buf, msg, oldmsg, origarea);
|
TokenXlat(mode, buf, msg, oldmsg, origarea);
|
||||||
len = strlen(buf);
|
len = strlen(buf);
|
||||||
size += len;
|
size += len;
|
||||||
msg->txt = (char*)throw_realloc(msg->txt, size+10);
|
if(msg_txt_realloc_cache >= len) {
|
||||||
|
msg_txt_realloc_cache -= len;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
msg_txt_realloc_cache += REALLOC_CACHE_SIZE;
|
||||||
|
msg->txt = (char*)throw_realloc(msg->txt, size+10+msg_txt_realloc_cache);
|
||||||
|
}
|
||||||
strcpy(&(msg->txt[pos]), buf);
|
strcpy(&(msg->txt[pos]), buf);
|
||||||
pos += len;
|
pos += len;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user