X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Ftools%2Fsysdb%2Finput.c;h=e08ad5b40da52d63ce9b16ebda9e0916193b6db0;hb=3cc3e3c36239c902263678100180c95c8263f7f8;hp=3366fd9397bd7998a7c4b7f4d70c9493cefd8e3d;hpb=a82bba15a9c033c7d8ebba4269d24f2bdbf34e00;p=sysdb.git diff --git a/src/tools/sysdb/input.c b/src/tools/sysdb/input.c index 3366fd9..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_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 : */