X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Ftools%2Fsysdb%2Finput.c;h=e08ad5b40da52d63ce9b16ebda9e0916193b6db0;hb=3cc3e3c36239c902263678100180c95c8263f7f8;hp=d5deb1dd61b9cf6f26a215ae0efba955a233a48d;hpb=a006a526f16e790dbeae6ef96ed61f506310b66f;p=sysdb.git diff --git a/src/tools/sysdb/input.c b/src/tools/sysdb/input.c index d5deb1d..e08ad5b 100644 --- a/src/tools/sysdb/input.c +++ b/src/tools/sysdb/input.c @@ -30,6 +30,7 @@ #endif /* HAVE_CONFIG_H */ #include "tools/sysdb/input.h" +#include "tools/sysdb/command.h" #include "utils/strbuf.h" @@ -55,19 +56,25 @@ # 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); @@ -77,26 +84,34 @@ input_readline(sdb_input_t *input) 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; @@ -105,12 +120,36 @@ sdb_input_readline(sdb_input_t *input, char *buf, } 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 : */