index d5deb1dd61b9cf6f26a215ae0efba955a233a48d..e08ad5b40da52d63ce9b16ebda9e0916193b6db0 100644 (file)
--- a/src/tools/sysdb/input.c
+++ b/src/tools/sysdb/input.c
#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_input_t *input)
+input_readline(void)
{
const char *prompt = "sysdb=> ";
char *line;
size_t len;
- if (input->query_len)
+ if (sysdb_input->query_len)
prompt = "sysdb-> ";
line = readline(prompt);
len = strlen(line) + 1;
- sdb_strbuf_append(input->input, line);
- sdb_strbuf_append(input->input, "\n");
+ 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 *data;
size_t len;
- len = sdb_strbuf_len(input->input) - input->tokenizer_pos;
+ len = sdb_strbuf_len(sysdb_input->input) - sysdb_input->tokenizer_pos;
if (! len) {
- size_t n = input_readline(input);
+ size_t n = input_readline();
if (! n) {
*n_chars = 0; /* YY_NULL */
return 0;
}
len = (len < max_chars) ? len : max_chars;
- strncpy(buf, sdb_strbuf_string(input->input) + 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);
+ 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 : */