diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2013-05-16 15:32:45 +0000 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2013-05-16 15:32:45 +0000 |
commit | 979486e1b46a894fc9de2abe6eb8985536a5013c (patch) | |
tree | e9e61bcfd9d1945c612a54e080d4fdc2e87cbad5 /src/lex.l | |
parent | e5fccca3abee9093f4d1e50823addca8e6c778a6 (diff) | |
download | gdbm-979486e1b46a894fc9de2abe6eb8985536a5013c.tar.gz gdbm-979486e1b46a894fc9de2abe6eb8985536a5013c.tar.bz2 |
Improve handling of the variables.
* src/gdbmtool.c (opendb): Allow for unset variables.
* src/gram.y: Improve error detection.
* src/lex.l: Handle multiline strings.
(pe_file_name): file_name can be NULL.
* src/var.c (VARF_PROT): New flag. Protects the variable
from being unset.
(vartab): Use VARF_PROT if needed.
(s2b): Fix return values.
(variable_set, variable_unset): Return error if attempting
to unset a variable marked with VARF_PROT.
* doc/gdbm.info: Update.
* doc/gdbmtool.1: Update.
Diffstat (limited to 'src/lex.l')
-rw-r--r-- | src/lex.l | 44 |
1 files changed, 29 insertions, 15 deletions
@@ -196,7 +196,7 @@ setsource (const char *name, int intr) %option nounput -%x STR DEF +%x STR MLSTR DEF WS [ \t][ \t]* IDENT [a-zA-Z_][a-zA-Z_0-9-]* @@ -259,7 +259,7 @@ O [0-7] return command_lookup (p, &yylloc, &yylval.cmd); } <DEF>{IDENT} { if ((yylval.type = datadef_lookup (yytext))) - return T_TYPE; + return T_TYPE; else { yylval.string = estrdup (yytext); @@ -269,23 +269,27 @@ O [0-7] {IDENT} { yylval.string = estrdup (yytext); return T_IDENT; } -<INITIAL,DEF>[^ \t\n\[\]{},=]+ { yylval.string = estrdup (yytext); - return T_WORD; } +<INITIAL,DEF>[^ \"\t\n\[\]{},=]+ { yylval.string = estrdup (yytext); + return T_WORD; } \"[^\\\"\n]*\" { yylval.string = emalloc (yyleng - 1); memcpy (yylval.string, yytext+1, yyleng-2); yylval.string[yyleng-2] = 0; return T_WORD; } +\"[^\\\"\n]*\\$ { string_begin (); + string_add (yytext + 1, yyleng - 2); + BEGIN (MLSTR); } \"[^\\\"\n]*\\. { string_begin (); string_add (yytext + 1, yyleng - 3); string_addc (unescape (yytext[yyleng-1])); BEGIN (STR); } -<STR>[^\\\"\n]*\" { if (yyleng > 1) - string_add (yytext, yyleng - 1); - yylval.string = string_end (); - BEGIN (INITIAL); - return T_WORD; } -<STR>[^\\\"\n]*\\. { string_add (yytext, yyleng - 2); - string_addc (unescape (yytext[yyleng-1])); } +<STR,MLSTR>[^\\\"\n]*\" { if (yyleng > 1) + string_add (yytext, yyleng - 1); + yylval.string = string_end (); + BEGIN (INITIAL); + return T_WORD; } +<STR,MLSTR>[^\\\"\n]*\\$ { string_add (yytext, yyleng - 1); } +<STR,MLSTR>[^\\\"\n]*\\. { string_add (yytext, yyleng - 2); + string_addc (unescape (yytext[yyleng-1])); } <INITIAL,DEF>{WS} ; <DEF>\n { advance_line (); } \n { advance_line (); return '\n'; } @@ -453,7 +457,8 @@ struct prompt_exp; void pe_file_name (struct prompt_exp *p) { - fwrite (file_name, strlen (file_name), 1, stdout); + if (file_name) + fwrite (file_name, strlen (file_name), 1, stdout); } void @@ -520,7 +525,7 @@ expand_char (int c) char const * psname () { - if (YYSTATE == DEF) + if (YYSTATE == DEF || YYSTATE == MLSTR) return "ps2"; return "ps1"; } @@ -531,9 +536,18 @@ print_prompt () const char *s; const char *prompt; - if (variable_get (psname (), VART_STRING, (void *) &prompt)) - abort (); + switch (variable_get (psname (), VART_STRING, (void *) &prompt)) + { + case VAR_OK: + break; + case VAR_ERR_NOTSET: + return; + + default: + abort (); + } + for (s = prompt; *s; s++) { if (*s == '%') |