[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[debian-users:19714] Re: Info aborted by japanese message catalog
At Tue, 21 Dec 1999 19:49:30 +0900,
NABETANI Hidenobu <nabetani@xxxxxxxxxxxxxxxxxxxxxxxxxxx> wrote:
> 鍋谷です。少々 devel ネタです。
ということで -devel へ。
> ja-trans に info (つまり、texinfo パッケージ)のメッセージカタログ
> が含まれていますが、以下のメッセージが表示できず info が強制終了
> してしまいます。簡単には、
info のバグです。というか info は この手の parameter を解釈していません。
texinfo/info/window.c の build_message_buffer()
> % info hogehoge
> アボート
>
> で追試できます。現在 potato で、使用しているパッケージは
>
> ii ja-trans 0.6-2 Japanese gettext message files
> ii info 4.0-1 Standalone GNU Info documentation browser
>
> です。info が死ぬことが確認できたメッセージカタログは
> ----------------------------------------------------------------------
> #: info/session.c:2422
> #, c-format
> msgid "No menu item `%s' in node `%s'."
> msgstr "ノード `%2$s' にメニューアイテム `%1$s' はありません"
>
> #: info/session.c:2452
> #, c-format
> msgid "Unable to find node referenced by `%s' in `%s'."
> msgstr "`%2$s' の `%1$s' から参照されているノードを見つけられません。"
> ----------------------------------------------------------------------
> で、どうやら「%2$s」や「%1$s」が理解されていないようです。
>
> # 試しに、「%2$s」->「%s」、「%1$s」->「%s」と変更した catalog に置
> # き換えてみると info は死にませんでした(当然、表示が逆になってしま
> # いますが)。
>
> 根本的解決にはどこを修正すればよいのでしょうか?
1) texinfo/info/window.c の build_message_buffer() を直す
asprintf(3)とか使えばいいと思うんですが、これって
portability 低そう…
添付したアレゲパッチでとりあえず 直るようですが…
2) %1$s とかを使わないような訳になおす。
--- window.c~ Sat Jun 26 06:57:40 1999
+++ window.c Wed Dec 22 01:10:25 1999
@@ -1326,7 +1326,9 @@
char *fmt_start = format + i;
char *fmt;
int fmt_len, formatted_len;
+ int paramed = 0;
+ format_again:
i++;
while (format[i] && strchr ("-. +0123456789", format[i]))
i++;
@@ -1335,18 +1337,38 @@
if (c == '\0')
abort ();
+ if (c == '$') {
+ /* position parameter parameter */
+ arg_index = atoi(fmt_start + 1) - 1;
+ if (arg_index < 0)
+ arg_index = 0;
+ if (arg_index >= 2)
+ arg_index = 1;
+ paramed = 1;
+ goto format_again;
+ }
+
fmt_len = format + i - fmt_start + 1;
fmt = (char *) xmalloc (fmt_len + 1);
strncpy (fmt, fmt_start, fmt_len);
fmt[fmt_len] = '\0';
+ if (paramed) {
+ /* removed positioned parameter */
+ char *p;
+ for (p = fmt + 1; *p && *p != '$'; p++) {
+ ;
+ }
+ strcpy(fmt + 1, p + 1);
+ }
+
/* If we have "%-98s", maybe 98 calls for a longer string. */
if (fmt_len > 2)
{
int j;
- for (j = 0; j < fmt_len; j++)
- if (isdigit (fmt[j]))
+ for (j = fmt_len - 2; j >= 0; j--)
+ if (isdigit (fmt[j]) || fmt[j] == '$')
break;
formatted_len = atoi (fmt + j);
--
鵜飼文敏