Code

Merged branch 'master' of git://git.tokkee.org/sysdb.
[sysdb.git] / src / tools / sysdb / input.c
index 3366fd9397bd7998a7c4b7f4d70c9493cefd8e3d..e08ad5b40da52d63ce9b16ebda9e0916193b6db0 100644 (file)
@@ -30,6 +30,7 @@
 #endif /* HAVE_CONFIG_H */
 
 #include "tools/sysdb/input.h"
+#include "tools/sysdb/command.h"
 
 #include "utils/strbuf.h"
 
 #      endif
 #endif /* READLINEs */
 
+/*
+ * public variables
+ */
+
+sdb_input_t *sysdb_input = NULL;
+
 /*
  * private helper functions
  */
 
 static size_t
-input_readline(sdb_strbuf_t *buf)
+input_readline(void)
 {
        const char *prompt = "sysdb=> ";
        char *line;
 
        size_t len;
 
-       if (sdb_strbuf_len(buf))
+       if (sysdb_input->query_len)
                prompt = "sysdb-> ";
 
        line = readline(prompt);
@@ -75,51 +82,74 @@ input_readline(sdb_strbuf_t *buf)
        if (! line)
                return 0;
 
-       len = strlen(line);
+       len = strlen(line) + 1;
 
-       sdb_strbuf_append(buf, line);
+       sdb_strbuf_append(sysdb_input->input, line);
+       sdb_strbuf_append(sysdb_input->input, "\n");
        free(line);
        return len;
 } /* input_readline */
 
 /*
- * API
+ * public API
  */
 
+int
+sdb_input_init(sdb_input_t *input)
+{
+       /* register input handler */
+       sysdb_input = input;
+       return 0;
+} /* sdb_input_init */
+
 ssize_t
-sdb_input_readline(sdb_input_t *input, char *buf,
-               int *n_chars, size_t max_chars)
+sdb_input_readline(char *buf, int *n_chars, size_t max_chars)
 {
-       const char *query;
-       size_t buflen, len;
+       const char *data;
+       size_t len;
 
-       buflen = sdb_strbuf_len(input->buf);
-       len = buflen - input->tokenizer_pos;
+       len = sdb_strbuf_len(sysdb_input->input) - sysdb_input->tokenizer_pos;
 
        if (! len) {
-               size_t n = input_readline(input->buf);
+               size_t n = input_readline();
                if (! n) {
                        *n_chars = 0; /* YY_NULL */
                        return 0;
                }
-               buflen += n;
                len += n;
        }
 
-       query = sdb_strbuf_string(input->buf);
-
        len = (len < max_chars) ? len : max_chars;
-       strncpy(buf, sdb_strbuf_string(input->buf) + input->tokenizer_pos, len);
-       input->tokenizer_pos += len;
-       *n_chars = (int)len;
+       data = sdb_strbuf_string(sysdb_input->input);
+       data += sysdb_input->tokenizer_pos;
+       strncpy(buf, data, len);
 
-       /* XXX */
-       if (! strchr(query, (int)';'))
-               return (ssize_t)len;
-       sdb_strbuf_clear(input->buf);
-       input->tokenizer_pos = 0;
+       sysdb_input->tokenizer_pos += len;
+       *n_chars = (int)len;
        return (ssize_t)len;
 } /* sdb_input_readline */
 
+int
+sdb_input_exec_query()
+{
+       char *query = sdb_command_exec(sysdb_input);
+
+       HIST_ENTRY *current_hist;
+       const char *hist_line = NULL;
+
+       if (! query)
+               return -1;
+
+       current_hist = current_history();
+       if (current_hist)
+               hist_line = current_hist->line;
+
+       if (*query != ' ')
+               if ((! hist_line) || strcmp(hist_line, query))
+                       add_history(query);
+       free(query);
+       return 0;
+} /* sdb_input_exec_query */
+
 /* vim: set tw=78 sw=4 ts=4 noexpandtab : */