summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsabetts <sabetts>2003-05-27 08:22:17 +0000
committersabetts <sabetts>2003-05-27 08:22:17 +0000
commitfa25eb5ee73271cc36fd53c1f660867445f8a3fa (patch)
tree0a91c317ef31fd2a6a6232ebfc58e05d539ef363 /src
parent6cc80f10f7cb3de33626cf178bda532d741cf388 (diff)
downloadratpoison-fa25eb5ee73271cc36fd53c1f660867445f8a3fa.zip
(ratpoison_SOURCES): add editor.c editor.h
history.h and history.c
Diffstat (limited to 'src')
-rw-r--r--src/history.c127
-rw-r--r--src/history.h14
2 files changed, 141 insertions, 0 deletions
diff --git a/src/history.c b/src/history.c
new file mode 100644
index 0000000..20da719
--- /dev/null
+++ b/src/history.c
@@ -0,0 +1,127 @@
+#include <ctype.h>
+#include <errno.h>
+#include <string.h>
+
+#include "ratpoison.h"
+#include "readline/history.h"
+
+static char *
+get_history_filename ()
+{
+ char *homedir = getenv ("HOME");
+ char *filename;
+
+ if (homedir)
+ {
+ filename = xmalloc (strlen (homedir) + strlen ("/" HISTORY_FILE) + 1);
+ sprintf (filename, "%s/" HISTORY_FILE, homedir);
+ }
+ else
+ {
+ filename = xstrdup (HISTORY_FILE);
+ }
+
+ return filename;
+}
+
+void
+history_load ()
+{
+ char *filename = get_history_filename ();
+
+ if (filename && read_history (filename) != 0)
+ PRINT_DEBUG (("ratpoison: could not read %s - %s\n", filename, strerror (errno)));
+
+ using_history();
+
+ free (filename);
+}
+
+void
+history_save ()
+{
+ char *filename = get_history_filename ();
+
+ using_history ();
+
+ if (filename && write_history (filename) != 0)
+ PRINT_ERROR (("ratpoison: could not write %s - %s\n", filename, strerror (errno)));
+
+ free (filename);
+}
+
+void
+history_resize (int size)
+{
+ stifle_history (size);
+}
+
+void
+history_reset ()
+{
+ using_history();
+}
+
+void
+history_add (char *item)
+{
+ HIST_ENTRY *h = history_get (history_length);
+
+ if (item == NULL || *item == '\0' || isspace (*item) || (h != NULL && !strcmp (h->line, item)))
+ return;
+
+ PRINT_DEBUG (("Adding item: %s\n", item));
+ add_history (item);
+ using_history();
+}
+
+char *
+history_previous ()
+{
+ HIST_ENTRY *h = NULL;
+
+ h = previous_history();
+
+ return h ? h->line : NULL;
+}
+
+char *
+history_next ()
+{
+ HIST_ENTRY *h = NULL;
+
+ h = next_history();
+
+ return h ? h->line : NULL;
+}
+
+char *
+history_list_items ()
+{
+ HIST_ENTRY **hlist;
+ struct sbuf *list;
+ char *tmp;
+ int i;
+
+ list = sbuf_new (0);
+ hlist = history_list ();
+
+ if (!hlist) return NULL;
+
+ for (i = 0; hlist[i] != NULL; i++)
+ {
+ sbuf_concat (list, hlist[i]->line);
+ if (i < history_length - 1)
+ sbuf_concat (list, "\n");
+ }
+
+ tmp = sbuf_get (list);
+ free (list);
+
+ return tmp;
+}
+
+int history_expand_line (char *string, char **output)
+{
+ return history_expand (string, output);
+}
diff --git a/src/history.h b/src/history.h
new file mode 100644
index 0000000..f206cba
--- /dev/null
+++ b/src/history.h
@@ -0,0 +1,14 @@
+#ifndef _RATPOISON_HISTORY_H
+#define _RATPOISON_HISTORY_H 1
+
+void history_load ();
+void history_save ();
+void history_resize (int size);
+void history_reset ();
+void history_add (char *item);
+char *history_next ();
+char *history_previous ();
+char *history_list_items ();
+int history_expand_line (char *string, char **output);
+
+#endif /* ! _RATPOISON_HISTORY_H */