[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-devel:11182] Re: [debian-users:19705] 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);

-- 
鵜飼文敏