dumplog's saved_plines[]

Use a simple ring buffer instead of a flat array that needed to have
49 pointers shifted down a slot every time a pline message was issued.

'saved_plines[saved_pline_index]' is the oldest message in the buffer
and the next slot to use when adding a new one.
This commit is contained in:
PatR
2017-02-27 02:54:14 -08:00
parent 92c5a56364
commit f55da584f4
2 changed files with 38 additions and 11 deletions

View File

@@ -675,15 +675,17 @@ char *defquery;
STATIC_OVL void
dump_plines()
{
int i;
int i, j;
char buf[BUFSZ], **strp;
extern char *saved_plines[];
extern unsigned saved_pline_index;
Strcpy(buf, " ");
putstr(0, 0, "");
putstr(0, 0, "Latest messages:");
for (i = 0; i < DUMPLOG_MSG_COUNT; ++i) {
strp = &saved_plines[DUMPLOG_MSG_COUNT - 1 - i];
for (i = 0, j = (int) saved_pline_index; i < DUMPLOG_MSG_COUNT;
++i, j = (j + 1) % DUMPLOG_MSG_COUNT) {
strp = &saved_plines[j];
if (*strp) {
copynchars(&buf[1], *strp, BUFSZ - 1 - 1);
putstr(0, 0, buf);

View File

@@ -15,7 +15,9 @@ static void FDECL(execplinehandler, (const char *));
#endif
#ifdef DUMPLOG
char* saved_plines[DUMPLOG_MSG_COUNT] = {0};
/* also used in end.c */
unsigned saved_pline_index = 0; /* slot in saved_plines[] to use next */
char *saved_plines[DUMPLOG_MSG_COUNT] = { (char *) 0 };
#endif
/*VARARGS1*/
@@ -84,6 +86,7 @@ VA_DECL(const char *, line)
pbuf[BUFSZ - 1 - 1] = line[ln - 1];
pbuf[BUFSZ - 1] = '\0';
line = pbuf;
ln = BUFSZ - 1;
}
if (!iflags.window_inited) {
raw_print(line);
@@ -92,12 +95,34 @@ VA_DECL(const char *, line)
}
#ifdef DUMPLOG
/* We hook here early to have options-agnostic output. */
free(saved_plines[DUMPLOG_MSG_COUNT - 1]);
for (ln = 0; ln < DUMPLOG_MSG_COUNT - 1; ++ln)
saved_plines[DUMPLOG_MSG_COUNT - ln - 1] = saved_plines[DUMPLOG_MSG_COUNT - ln - 2];
saved_plines[0] = malloc(strlen(line) + 1);
(void) strcpy(saved_plines[0], line);
/* We hook here early to have options-agnostic output.
* Unfortunately, that means Norep() isn't honored (general issue) and
* that short lines aren't combined into one longer one (tty behavior).
*/
{
/*
* TODO:
* This essentially duplicates message history, which is
* currently implemented in an interface-specific manner.
* The core should take responsibility for that and have
* this share it.
* Ideally history for prompt lines should be augmented
* with the player's response once that has been specified.
*/
unsigned indx = saved_pline_index; /* next slot to use */
char *oldest = saved_plines[indx]; /* current content of that slot */
if (oldest && (int) strlen(oldest) >= ln) { /* ln==strlen(line) */
/* this buffer will gradually shrink until the 'else' is needed;
there's no pressing need to track allocation size instead */
Strcpy(oldest, line);
} else {
if (oldest)
free((genericptr_t) oldest);
saved_plines[indx] = dupstr(line);
}
saved_pline_index = (indx + 1) % DUMPLOG_MSG_COUNT;
}
#endif
msgtyp = msgtype_type(line, no_repeat);
@@ -117,7 +142,7 @@ VA_DECL(const char *, line)
/* this gets cleared after every pline message */
iflags.last_msg = PLNMSG_UNKNOWN;
strncpy(prevmsg, line, BUFSZ), prevmsg[BUFSZ - 1] = '\0';
(void) strncpy(prevmsg, line, BUFSZ), prevmsg[BUFSZ - 1] = '\0';
if (msgtyp == MSGTYP_STOP)
display_nhwindow(WIN_MESSAGE, TRUE); /* --more-- */