/*
 * Copyright notice from original mutt:
 * Copyright (C) 1996-2000 Michael R. Elkins <me@mutt.org>
 *
 * This file is part of mutt-ng, see http://www.muttng.org/.
 * It's licensed under the GNU General Public License,
 * please see the file GPL in the top level source directory.
 */

#if HAVE_CONFIG_H
# include "config.h"
#endif

#include "mutt.h"
#include "history.h"
#include "lib/mem.h"

/* global vars used for the string-history routines */

struct history {
  char **hist;
  short cur;
  short last;
};

static struct history History[HC_LAST];
static int OldSize = 0;

static void init_history (struct history *h)
{
  int i;

  if (OldSize) {
    if (h->hist) {
      for (i = 0; i < OldSize; i++)
        mem_free (&h->hist[i]);
      mem_free (&h->hist);
    }
  }

  if (HistSize)
    h->hist = mem_calloc (HistSize, sizeof (char *));

  h->cur = 0;
  h->last = 0;
}

void mutt_init_history (void)
{
  history_class_t hclass;

  if (HistSize == OldSize)
    return;

  for (hclass = HC_FIRST; hclass < HC_LAST; hclass++)
    init_history (&History[hclass]);

  OldSize = HistSize;
}

void mutt_history_add (history_class_t hclass, const char *s)
{
  int prev;
  struct history *h = &History[hclass];

  if (!HistSize)
    return;                     /* disabled */

  if (*s) {
    prev = h->last - 1;
    if (prev < 0)
      prev = HistSize - 1;
    if (!h->hist[prev] || str_cmp (h->hist[prev], s) != 0) {
      str_replace (&h->hist[h->last++], s);
      if (h->last > HistSize - 1)
        h->last = 0;
    }
  }
  h->cur = h->last;             /* reset to the last entry */
}

char *mutt_history_next (history_class_t hclass)
{
  int next;
  struct history *h = &History[hclass];

  if (!HistSize)
    return ("");                /* disabled */

  next = h->cur + 1;
  if (next > HistSize - 1)
    next = 0;
  h->cur = h->hist[next] ? next : 0;
  return (h->hist[h->cur] ? h->hist[h->cur] : "");
}

char *mutt_history_prev (history_class_t hclass)
{
  int prev;
  struct history *h = &History[hclass];

  if (!HistSize)
    return ("");                /* disabled */

  prev = h->cur - 1;
  if (prev < 0) {
    prev = HistSize - 1;
    while (prev > 0 && h->hist[prev] == NULL)
      prev--;
  }
  if (h->hist[prev])
    h->cur = prev;
  return (h->hist[h->cur] ? h->hist[h->cur] : "");
}


syntax highlighted by Code2HTML, v. 0.9.1