}
}
+#if 0
/*
* This is called by the core save routines.
* Each time we are called, we return one string from the
initd = FALSE; /* reset */
}
}
+#else
+STATIC_OVL ptr_array_t *
+get_message_history()
+{
+ char *mesg;
+ int i;
+ struct WinDesc *cw;
+ size_t max_length;
+ ptr_array_t * a;
+
+ nhassert(WIN_MESSAGE != WIN_ERR);
+ nhassert(wins[WIN_MESSAGE] != NULL);
+
+ /* paranoia (too early or too late panic save attempt?) */
+ if (WIN_MESSAGE == WIN_ERR || !wins[WIN_MESSAGE])
+ return NULL;
+
+ cw = wins[WIN_MESSAGE];
+
+ max_length = cw->rows;
+
+ if (*toplines) max_length++;
+
+ a = ptr_array_new(max_length);
+
+ nhassert(cw->maxrow <= cw->rows);
+ for (i = 0; i < cw->rows; ++i) {
+ mesg = cw->data[(i + cw->maxrow) % cw->rows];
+ if (mesg && *mesg)
+ a->elements[a->length++] = strdup(mesg);
+ }
+ if (*toplines)
+ a->elements[a->length++] = strdup(toplines);
+
+ return a;
+}
+
+STATIC_OVL void
+purge_message_history()
+{
+ int i;
+ struct WinDesc *cw;
+
+ nhassert(WIN_MESSAGE != WIN_ERR);
+ nhassert(wins[WIN_MESSAGE] != NULL);
+
+ cw = wins[WIN_MESSAGE];
+
+ *toplines = '\0';
+
+ for (i = 0; i < cw->rows; ++i) {
+ if (cw->data[i]) {
+ free(cw->data[i]);
+ cw->data[i] = (char *) 0;
+ cw->datlen[i] = 0;
+ }
+ }
+
+ cw->maxcol = cw->maxrow = 0;
+}
+
+/*
+ * This is called by the core save routines.
+ * Each time we are called, we return one string from the
+ * message history starting with the oldest message first.
+ * When none are left, we return a final null string.
+ *
+ * History is collected at the time of the first call.
+ * Any new messages issued after that point will not be
+ * included among the output of the subsequent calls.
+ */
+char *
+tty_getmsghistory(init)
+boolean init;
+{
+ static size_t nxtidx;
+ static ptr_array_t * saved_messages = NULL;
+ char *result = NULL;
+
+ if (init) {
+ nhassert(saved_messages == NULL);
+ saved_messages = get_message_history();
+ nxtidx = 0;
+ wins[WIN_MESSAGE]->flags |= WIN_LOCKHISTORY;
+ }
+
+ if (saved_messages) {
+ if (nxtidx < saved_messages->length)
+ result = saved_messages->elements[nxtidx++];
+
+ if (result == NULL) {
+ ptr_array_free(saved_messages);
+ saved_messages = NULL;
+ wins[WIN_MESSAGE]->flags &= ~WIN_LOCKHISTORY;
+ }
+ }
+ return result;
+}
+
+/*
+ * This is called by the core savefile restore routines.
+ * Each time we are called, we stuff the string into our message
+ * history recall buffer. The core will send the oldest message
+ * first (actually it sends them in the order they exist in the
+ * save file, but that is supposed to be the oldest first).
+ * These messages get pushed behind any which have been issued
+ * since this session with the program has been started, since
+ * they come from a previous session and logically precede
+ * anything (like "Restoring save file...") that's happened now.
+ *
+ * Called with a null pointer to finish up restoration.
+ *
+ * It's also called by the quest pager code when a block message
+ * has a one-line summary specified. We put that line directly
+ * into message history for ^P recall without having displayed it.
+ */
+void
+tty_putmsghistory(msg, restoring_msghist)
+const char *msg;
+boolean restoring_msghist;
+{
+ static boolean initd = FALSE;
+ static ptr_array_t * saved_messages = NULL;
+ size_t i;
+#ifdef DUMPLOG
+ extern unsigned saved_pline_index; /* pline.c */
+#endif
+
+ nhassert(!(wins[WIN_MESSAGE]->flags & WIN_LOCKHISTORY));
+
+ if (restoring_msghist && !initd) {
+ /* we're restoring history from the previous session, but new
+ messages have already been issued this session ("Restoring...",
+ for instance); collect current history (ie, those new messages),
+ and also clear it out so that nothing will be present when the
+ restored ones are being put into place */
+ nhassert(saved_messages == NULL);
+ saved_messages = get_message_history();
+ purge_message_history();
+ initd = TRUE;
+#ifdef DUMPLOG
+ /* this suffices; there's no need to scrub saved_pline[] pointers */
+ saved_pline_index = 0;
+#endif
+ }
+
+ if (msg) {
+ /* Caller is asking us to remember a top line that needed more.
+ Should we call more? This can happen when the player has set
+ iflags.force_invmenu and they attempt to shoot with nothing in
+ the quiver. */
+ if (ttyDisplay && ttyDisplay->toplin == TOPLINE_NEED_MORE)
+ ttyDisplay->toplin = TOPLINE_NON_EMPTY;
+
+ /* move most recent message to history, make this become most recent */
+ remember_topl();
+ Strcpy(toplines, msg);
+#ifdef DUMPLOG
+ dumplogmsg(toplines);
+#endif
+ return;
+ }
+
+ /* tty_putmsghistory() is called with msg==NULL to indidate that
+ * we are finished restoring the message history. If we saved
+ * some message history when we started, its time now to appened
+ * those saved messages.
+ *
+ * We don't otherwise expect to get called with msg==NULL.
+ *
+ */
+ nhassert(restoring_msghist && initd);
+
+ if (initd && restoring_msghist) {
+ if (saved_messages) {
+ nhassert(ttyDisplay == NULL ||
+ ttyDisplay->toplin != TOPLINE_NEED_MORE);
+
+ for (i = 0; i<saved_messages->length; i++) {
+ const char * mesg = saved_messages->elements[i];
+ remember_topl();
+ nhassert(mesg);
+ Strcpy(toplines, mesg);
+#ifdef DUMPLOG
+ dumplogmsg(toplines);
+#endif
+ }
+ ptr_array_free(saved_messages);
+ saved_messages = NULL;
+ }
+ initd = FALSE;
+ }
+
+}
+#endif
#endif /* TTY_GRAPHICS */