$"..." support in scripts.

* grub-core/script/execute.c (grub_script_arglist_to_argv): Handle
	GRUB_SCRIPT_ARG_TYPE_GETTEXT.
	* grub-core/script/yylex.l: Likewise.
	* include/grub/script_sh.h (GRUB_SCRIPT_ARG_TYPE_GETTEXT): New enum
	value.
This commit is contained in:
Vladimir 'phcoder' Serbinenko 2012-02-26 19:02:46 +01:00
parent 15eff5d9c2
commit 7e8fac16ad
4 changed files with 41 additions and 4 deletions

View file

@ -1,3 +1,13 @@
2012-02-25 Vladimir Serbinenko <phcoder@gmail.com>
$"..." support in scripts.
* grub-core/script/execute.c (grub_script_arglist_to_argv): Handle
GRUB_SCRIPT_ARG_TYPE_GETTEXT.
* grub-core/script/yylex.l: Likewise.
* include/grub/script_sh.h (GRUB_SCRIPT_ARG_TYPE_GETTEXT): New enum
value.
2012-02-25 Vladimir Serbinenko <phcoder@gmail.com> 2012-02-25 Vladimir Serbinenko <phcoder@gmail.com>
* gentpl.py: Remove obsolete pkglib_DATA handling. * gentpl.py: Remove obsolete pkglib_DATA handling.

View file

@ -328,8 +328,8 @@ grub_script_arglist_to_argv (struct grub_script_arglist *arglist,
struct grub_script_arg *arg = 0; struct grub_script_arg *arg = 0;
struct grub_script_argv result = { 0, 0, 0 }; struct grub_script_argv result = { 0, 0, 0 };
auto int append (char *s, int escape_type); auto int append (const char *s, int escape_type);
int append (char *s, int escape_type) int append (const char *s, int escape_type)
{ {
int r; int r;
char *p = 0; char *p = 0;
@ -395,12 +395,20 @@ grub_script_arglist_to_argv (struct grub_script_arglist *arglist,
break; break;
case GRUB_SCRIPT_ARG_TYPE_TEXT: case GRUB_SCRIPT_ARG_TYPE_TEXT:
if (grub_strlen (arg->str) && if (arg->str[0] &&
grub_script_argv_append (&result, arg->str, grub_script_argv_append (&result, arg->str,
grub_strlen (arg->str))) grub_strlen (arg->str)))
goto fail; goto fail;
break; break;
case GRUB_SCRIPT_ARG_TYPE_GETTEXT:
{
const char *t = _(arg->str);
if (grub_script_argv_append (&result, t, grub_strlen (t)))
goto fail;
}
break;
case GRUB_SCRIPT_ARG_TYPE_DQSTR: case GRUB_SCRIPT_ARG_TYPE_DQSTR:
case GRUB_SCRIPT_ARG_TYPE_SQSTR: case GRUB_SCRIPT_ARG_TYPE_SQSTR:
if (append (arg->str, 1)) if (append (arg->str, 1))

View file

@ -133,15 +133,17 @@ ESC \\(.|\n)
SQCHR [^\'] SQCHR [^\']
DQCHR {ESC}|[^\\\"] DQCHR {ESC}|[^\\\"]
DQSTR \"{DQCHR}*\" DQSTR \"{DQCHR}*\"
I18NSTR \$\"{DQCHR}*\"
SQSTR \'{SQCHR}*\' SQSTR \'{SQCHR}*\'
SPECIAL \?|\#|\*|\@ SPECIAL \?|\#|\*|\@
VARIABLE ${NAME}|$\{{NAME}\}|${DIGITS}|$\{{DIGITS}\}|${SPECIAL}|$\{{SPECIAL}\} VARIABLE ${NAME}|$\{{NAME}\}|${DIGITS}|$\{{DIGITS}\}|${SPECIAL}|$\{{SPECIAL}\}
WORD ({CHAR}|{DQSTR}|{SQSTR}|{ESC}|{VARIABLE})+ WORD ({CHAR}|{DQSTR}|{SQSTR}|{ESC}|{VARIABLE}|{I18NSTR})+
MULTILINE {WORD}?((\"{DQCHR}*)|(\'{SQCHR}*)|(\\\n)) MULTILINE {WORD}?((\"{DQCHR}*)|(\'{SQCHR}*)|(\\\n))
%x SPLIT %x SPLIT
%x DQUOTE %x DQUOTE
%x I18NQUOTE
%x SQUOTE %x SQUOTE
%x VAR %x VAR
@ -217,6 +219,10 @@ MULTILINE {WORD}?((\"{DQCHR}*)|(\'{SQCHR}*)|(\\\n))
yy_push_state (SQUOTE, yyscanner); yy_push_state (SQUOTE, yyscanner);
ARG (GRUB_SCRIPT_ARG_TYPE_TEXT); ARG (GRUB_SCRIPT_ARG_TYPE_TEXT);
} }
"\$\"" {
yy_push_state (I18NQUOTE, yyscanner);
ARG (GRUB_SCRIPT_ARG_TYPE_GETTEXT);
}
\$ { \$ {
yy_push_state (VAR, yyscanner); yy_push_state (VAR, yyscanner);
ARG (GRUB_SCRIPT_ARG_TYPE_TEXT); ARG (GRUB_SCRIPT_ARG_TYPE_TEXT);
@ -282,6 +288,18 @@ MULTILINE {WORD}?((\"{DQCHR}*)|(\'{SQCHR}*)|(\\\n))
(.|\n) { COPY (yytext, yyleng); } (.|\n) { COPY (yytext, yyleng); }
} }
<I18NQUOTE>{
\\\\ { COPY ("\\", 1); }
\\\" { COPY ("\"", 1); }
\\\n { /* ignore */ }
[^\"\\\n]+ { COPY (yytext, yyleng); }
\" {
yy_pop_state (yyscanner);
ARG (GRUB_SCRIPT_ARG_TYPE_GETTEXT);
}
(.|\n) { COPY (yytext, yyleng); }
}
<<EOF>> { <<EOF>> {
yypop_buffer_state (yyscanner); yypop_buffer_state (yyscanner);
yyextra->lexerstate->eof = 1; yyextra->lexerstate->eof = 1;

View file

@ -53,6 +53,7 @@ typedef enum
{ {
GRUB_SCRIPT_ARG_TYPE_VAR, GRUB_SCRIPT_ARG_TYPE_VAR,
GRUB_SCRIPT_ARG_TYPE_TEXT, GRUB_SCRIPT_ARG_TYPE_TEXT,
GRUB_SCRIPT_ARG_TYPE_GETTEXT,
GRUB_SCRIPT_ARG_TYPE_DQVAR, GRUB_SCRIPT_ARG_TYPE_DQVAR,
GRUB_SCRIPT_ARG_TYPE_DQSTR, GRUB_SCRIPT_ARG_TYPE_DQSTR,
GRUB_SCRIPT_ARG_TYPE_SQSTR, GRUB_SCRIPT_ARG_TYPE_SQSTR,