+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>
* gentpl.py: Remove obsolete pkglib_DATA handling.
struct grub_script_arg *arg = 0;
struct grub_script_argv result = { 0, 0, 0 };
- auto int append (char *s, int escape_type);
- int append (char *s, int escape_type)
+ auto int append (const char *s, int escape_type);
+ int append (const char *s, int escape_type)
{
int r;
char *p = 0;
break;
case GRUB_SCRIPT_ARG_TYPE_TEXT:
- if (grub_strlen (arg->str) &&
+ if (arg->str[0] &&
grub_script_argv_append (&result, arg->str,
grub_strlen (arg->str)))
goto fail;
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_SQSTR:
if (append (arg->str, 1))
SQCHR [^\']
DQCHR {ESC}|[^\\\"]
DQSTR \"{DQCHR}*\"
+I18NSTR \$\"{DQCHR}*\"
SQSTR \'{SQCHR}*\'
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))
%x SPLIT
%x DQUOTE
+%x I18NQUOTE
%x SQUOTE
%x VAR
yy_push_state (SQUOTE, yyscanner);
ARG (GRUB_SCRIPT_ARG_TYPE_TEXT);
}
+ "\$\"" {
+ yy_push_state (I18NQUOTE, yyscanner);
+ ARG (GRUB_SCRIPT_ARG_TYPE_GETTEXT);
+ }
\$ {
yy_push_state (VAR, yyscanner);
ARG (GRUB_SCRIPT_ARG_TYPE_TEXT);
(.|\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>> {
yypop_buffer_state (yyscanner);
yyextra->lexerstate->eof = 1;
{
GRUB_SCRIPT_ARG_TYPE_VAR,
GRUB_SCRIPT_ARG_TYPE_TEXT,
+ GRUB_SCRIPT_ARG_TYPE_GETTEXT,
GRUB_SCRIPT_ARG_TYPE_DQVAR,
GRUB_SCRIPT_ARG_TYPE_DQSTR,
GRUB_SCRIPT_ARG_TYPE_SQSTR,