diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2013-05-13 16:46:30 +0000 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2013-05-13 16:46:30 +0000 |
commit | aa0eaa5bc642167db8cfb5778cf9a0091401a4f3 (patch) | |
tree | a5a6cbdc9ca61b6867bd902fc880efd2eaa0f29c /src/lex.l | |
parent | 1638ed6202b77b521214128189dc4aacdb5fe098 (diff) | |
download | gdbm-aa0eaa5bc642167db8cfb5778cf9a0091401a4f3.tar.gz gdbm-aa0eaa5bc642167db8cfb5778cf9a0091401a4f3.tar.bz2 |
Implement shell variables in gdbmtool.
* src/var.c: New file.
* src/datconv.c (datum_format): Remove the "delim"
parameter, use "delim1" and "delim2" shell variables
instead.
* src/gdbmtool.c: Remove "prompt" command. Use "set ps[12]"
instead.
(print_prompt): Move to lex.l
* src/gdbmtool.h (variable_set)
(variable_get, variable_print_all): New protos.
* src/gram.y: Handle the "set" command.
* src/lex.l: Update.
Diffstat (limited to 'src/lex.l')
-rw-r--r-- | src/lex.l | 107 |
1 files changed, 107 insertions, 0 deletions
@@ -112,6 +112,7 @@ O [0-7] #.* /* end-of-file comment */; def { return T_DEF; } +set { return T_SET; } <DEF>off { return T_OFF; } <DEF>pad { return T_PAD; } <DEF>0[xX]{X}{X}* { yylval.num = strtoul (yytext, NULL, 16); @@ -312,3 +313,109 @@ parse_error (struct locus *loc, const char *fmt, ...) vparse_error (loc, fmt, ap); va_end (ap); } + + +struct prompt_exp; + +void +pe_file_name (struct prompt_exp *p) +{ + fwrite (file_name, strlen (file_name), 1, stdout); +} + +void +pe_program_name (struct prompt_exp *p) +{ + fwrite (progname, strlen (progname), 1, stdout); +} + +void +pe_package_name (struct prompt_exp *p) +{ + fwrite (PACKAGE_NAME, sizeof (PACKAGE_NAME) - 1, 1, stdout); +} + +void +pe_program_version (struct prompt_exp *p) +{ + fwrite (PACKAGE_VERSION, sizeof (PACKAGE_VERSION) - 1, 1, stdout); +} + +void +pe_space (struct prompt_exp *p) +{ + fwrite (" ", 1, 1, stdout); +} + +struct prompt_exp +{ + int ch; + void (*fun) (struct prompt_exp *); + char *cache; +}; + +struct prompt_exp prompt_exp[] = { + { 'f', pe_file_name }, + { 'p', pe_program_name }, + { 'P', pe_package_name }, + { 'v', pe_program_version }, + { '_', pe_space }, + { 0 } +}; + +static void +expand_char (int c) +{ + struct prompt_exp *p; + + if (c && c != '%') + { + for (p = prompt_exp; p->ch; p++) + { + if (c == p->ch) + { + if (p->cache) + free (p->cache); + return p->fun (p); + } + } + } + putchar ('%'); + putchar (c); +} + +char const * +psname () +{ + if (YYSTATE == DEF) + return "ps2"; + return "ps1"; +} + +void +print_prompt () +{ + const char *s; + const char *prompt; + + if (variable_get (psname (), VART_STRING, (void *) &prompt)) + abort (); + + for (s = prompt; *s; s++) + { + if (*s == '%') + { + if (!*++s) + { + putchar ('%'); + break; + } + expand_char (*s); + } + else + putchar (*s); + } + + fflush (stdout); +} + |