summaryrefslogtreecommitdiffabout
path: root/src/input-std.c
authorSergey Poznyakoff <gray@gnu.org>2018-05-23 16:18:14 (GMT)
committer Sergey Poznyakoff <gray@gnu.org>2018-05-23 16:18:14 (GMT)
commit7edbff3372dfd387e4f6da45f43ba8ada6dfbe43 (patch) (side-by-side diff)
treed3049ab8c07773c82104e720f92be555ae276179 /src/input-std.c
parent008b71a4d58ad33cf5a41e2aa55b9393e8420531 (diff)
downloadgdbm-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') (more/less context) (ignore whitespace changes)
-rw-r--r--src/input-std.c45
1 files changed, 35 insertions, 10 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)
+static ssize_t
+instream_stdin_read (instream_t istr, char *buf, size_t size)
{
- if (interactive)
- {
- print_prompt_at_bol ();
- if (fgets (buf, size, fp) == NULL)
- return 0;
- return strlen (buf);
- }
- return fread (buf, 1, size, fp);
+ if (istr->in_inter)
+ print_prompt_at_bol ();
+ if (fgets (buf, size, stdin) == NULL)
+ return 0;
+ return strlen (buf);
+}
+
+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

Return to:

Send suggestions and report system problems to the System administrator.