summary refs log tree commit diff stats
path: root/src/common/history.c
diff options
context:
space:
mode:
authorberkeviktor@aol.com <berkeviktor@aol.com>2011-02-24 04:14:30 +0100
committerberkeviktor@aol.com <berkeviktor@aol.com>2011-02-24 04:14:30 +0100
commit4a6ceffb98a0b785494f680d3776c4bfc4052f9e (patch)
tree850703c1c841ccd99f58d0b06084615aaebe782c /src/common/history.c
parentf16af8be941b596dedac3bf4e371ee2d21f4b598 (diff)
add xchat r1489
Diffstat (limited to 'src/common/history.c')
-rw-r--r--src/common/history.c121
1 files changed, 121 insertions, 0 deletions
diff --git a/src/common/history.c b/src/common/history.c
new file mode 100644
index 00000000..1cd6b508
--- /dev/null
+++ b/src/common/history.c
@@ -0,0 +1,121 @@
+/* X-Chat
+ * Copyright (C) 1998 Peter Zelezny.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <string.h>
+#include <stdlib.h>
+#include "history.h"
+
+void
+history_add (struct history *his, char *text)
+{
+	if (his->lines[his->realpos])
+		free (his->lines[his->realpos]);
+	his->lines[his->realpos] = strdup (text);
+	his->realpos++;
+	if (his->realpos == HISTORY_SIZE)
+		his->realpos = 0;
+	his->pos = his->realpos;
+}
+
+void
+history_free (struct history *his)
+{
+	int i;
+	for (i = 0; i < HISTORY_SIZE; i++)
+	{
+		if (his->lines[i])
+		{
+			free (his->lines[i]);
+			his->lines[i] = 0;
+		}
+	}
+}
+
+char *
+history_down (struct history *his)
+{
+	int next;
+
+	if (his->pos == his->realpos)	/* allow down only after up */
+		return 0;
+	if (his->realpos == 0)
+	{
+		if (his->pos == HISTORY_SIZE - 1)
+		{
+			his->pos = 0;
+			return "";
+		}
+	} else
+	{
+		if (his->pos == his->realpos - 1)
+		{
+			his->pos++;
+			return "";
+		}
+	}
+
+	next = 0;
+	if (his->pos < HISTORY_SIZE - 1)
+		next = his->pos + 1;
+
+	if (his->lines[next])
+	{
+		his->pos = next;
+		return his->lines[his->pos];
+	}
+
+	return 0;
+}
+
+char *
+history_up (struct history *his, char *current_text)
+{
+	int next;
+
+	if (his->realpos == HISTORY_SIZE - 1)
+	{
+		if (his->pos == 0)
+			return 0;
+	} else
+	{
+		if (his->pos == his->realpos + 1)
+			return 0;
+	}
+
+	next = HISTORY_SIZE - 1;
+	if (his->pos != 0)
+		next = his->pos - 1;
+
+	if (his->lines[next])
+	{
+		if
+		(
+			current_text[0] && strcmp(current_text, his->lines[next]) &&
+			(!his->lines[his->pos] || strcmp(current_text, his->lines[his->pos])) &&
+			(!his->lines[his->realpos] || strcmp(current_text, his->lines[his->pos]))
+		)
+		{
+			history_add (his, current_text);
+		}
+		
+		his->pos = next;
+		return his->lines[his->pos];
+	}
+
+	return 0;
+}