diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2018-05-23 19:18:14 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2018-05-23 19:18:14 +0300 |
commit | 7edbff3372dfd387e4f6da45f43ba8ada6dfbe43 (patch) | |
tree | d3049ab8c07773c82104e720f92be555ae276179 /src/input-std.c | |
parent | 008b71a4d58ad33cf5a41e2aa55b9393e8420531 (diff) | |
download | gdbm-7edbff3372dfd387e4f6da45f43ba8ada6dfbe43.tar.gz gdbm-7edbff3372dfd387e4f6da45f43ba8ada6dfbe43.tar.bz2 |
gdbmtool: accept commands from command line as well as from file
Commands can be supplied to gdbmtool in three ways:
1. From a file, using the --file (-f) option:
gdbmtool -f comfile
2. From the command line, if first argument is the database name:
gdbmtool test.db count \; fetch mykey \; avail
Note the use of semicolon to delimit commands.
3. From the interactive shell, if neither of the above is used.
* src/Makefile.am: Add new sources.
* src/gdbmtool.c: Use new stream functions for input.
* src/gdbmtool.h (setsource): Remove proto.
(instream_t): New data type.
(instream_name, instream_read)
(instream_close, instream_interactive)
(instream_eq): New functions.
(instream_stdin_create)
(instream_argv_create)
(instream_file_create)
(interactive, input_context_push): New protos.
* src/gram.y: Accept ; in place of newline.
* src/input-argv.c: New file.
* src/input-file.c: New file.
* src/input-rl.c: Rewrite to provide instream_t API.
* src/input-std.c: Likewise.
* src/lex.l: Rewrite.
* tests/.gitignore: Update.
* tests/Makefile.am: Add new tests. Incorporate
DejaGNU tests.
* tests/config/default.exp: New file.
* tests/gdbmtool/base.exp: New file.
* tests/gdbmtool00.at: New file.
* tests/gdbmtool01.at: New file.
* tests/gdbmtool02.at: New file.
* tests/testsuite.at: Include new tests.
Diffstat (limited to 'src/input-std.c')
-rw-r--r-- | src/input-std.c | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/src/input-std.c b/src/input-std.c index e4f883d..45ae506 100644 --- a/src/input-std.c +++ b/src/input-std.c @@ -16,17 +16,42 @@ #include "gdbmtool.h" -ssize_t -input_read (FILE *fp, char *buf, size_t size) -{ - if (interactive) +static ssize_t +instream_stdin_read (instream_t istr, char *buf, size_t size) { + if (istr->in_inter) print_prompt_at_bol (); - if (fgets (buf, size, fp) == NULL) + if (fgets (buf, size, stdin) == NULL) return 0; return strlen (buf); } - return fread (buf, 1, size, fp); + +static void +instream_stdin_close (instream_t istr) +{ + free (istr); +} + +static int +instream_stdin_eq (instream_t a, instream_t b) +{ + return 0; +} + +instream_t +instream_stdin_create (void) +{ + struct instream_file *istr; + + istr = emalloc (sizeof *istr); + istr->base.in_name = "stdin"; + istr->base.in_inter = isatty (fileno (stdin)); + istr->base.in_read = instream_stdin_read; + istr->base.in_close = instream_stdin_close; + istr->base.in_eq = instream_stdin_eq; + istr->fp = stdin; + + return istr; } void |