On Sun, Apr 11, 2010 at 7:09 PM, Colin Watson <cjwat...@ubuntu.com> wrote: > On Sat, Apr 10, 2010 at 10:10:15PM +0100, Carles Pina i Estany wrote: >> Last weekend, the Asturian team found a bug in Grub. Thanks for the >> debugging. The string that appears in grub.cfg for "Loading the initram" >> in Asturian is "Cargando'l discu RAM inicial...". So grub.cfg looks >> like: >> echo Cargando'l discu RAM inicial... >> >> This is syntactically invalid because the character "'". >> >> Easy work around: generate the line like: >> echo "Cargando'l discu RAM inicial..." >> >> New problem: in some language, this string could have a double quote >> inside. >> >> New solution: escape the double quotes strings when they are used in >> gettext and always use these strings with double quotes. >> >> See the attached patch. >> >> I'm not convinced of the patch, does anybody has a cleaner idea/patch? > > This doesn't cover everything - you've just moved the goalposts a bit. > Here's the relevant bit of the lexer: > > <SQUOTE>{ > \' { > yy_pop_state (yyscanner); > ARG (GRUB_SCRIPT_ARG_TYPE_SQSTR); > } > [^\']+ { COPY (yytext, yyleng); } > } > > <DQUOTE>{ > \" { > yy_pop_state (yyscanner); > ARG (GRUB_SCRIPT_ARG_TYPE_DQSTR); > } > \$ { > yy_push_state (VAR, yyscanner); > ARG (GRUB_SCRIPT_ARG_TYPE_DQSTR); > } > \\\\ { COPY ("\\", 1); } > \\\" { COPY ("\"", 1); } > \\\n { /* ignore */ } > [^\"$\\\n]+ { COPY (yytext, yyleng); } > (.|\n) { COPY (yytext, yyleng); } > } > > In other words, only ' is special (as a terminator) when reading a > single-quoted string, and the sequences " $ \\ \" \n are special inside > a double-quoted string. (Incidentally, I think there's another bug > here; if $ is special, \$ should be special as well.) > > Given this, wouldn't you be better off using single-quotes instead? > You'd then end up with: > > echo 'Cargando'\''l discu RAM inicial...' > > ... where the construction used to escape ' is "close quotes, literal ', > reopen quotes". (Tested in grub-emu.) > >> +gettext_escape_double_quotes () >> +{ >> + echo -n $(gettext $@) | sed 's/\"/\\\"/' >> +} > > This is underquoted, and in any case the 'echo -n' is redundant since > gettext itself already writes to standard output and $() substitution > strips trailing newlines. $@ requires special treatment, and that sed > s/// command needs /g. With my suggestion, I'd recommend: > > gettext_quoted () { > gettext "$@" | sed "s/'/'\\\\''/g" > }
I haven't tried it myself, but you just said the newline is stripped by $() and then took out the $(), seems like the newline would be present again. > > ... and then make sure it's enclosed in '' rather than "" wherever it's > used (or modify the sed to put single-quotes at the start and end, if > that works out neater). > > -- > Colin Watson [cjwat...@ubuntu.com] > > > _______________________________________________ > Grub-devel mailing list > Grub-devel@gnu.org > http://lists.gnu.org/mailman/listinfo/grub-devel > _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel