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

[debian-devel:11709] Re: kernel-image-2.2.14-compact(was Re:jfbterm)



  吉山@品川です。

From: Taketoshi Sano <kgh12351@xxxxxxxxxxx>
Subject: [debian-devel:11680] Re: kernel-image-2.2.14-compact(was Re:jfbterm)
Date: Sat, 19 Feb 2000 21:01:53 +0900
Message-ID: <20000219130957Q.xlj06203@xxxxxxxxxxxxxxxxxxxx>

>     newtComponent newtTextbox(int left, int top, int width, int height, int flag
> 
> などの "int width" を与えられた文字列の長さに合わせて調整できると
> いいんでしょうね。たしか以前他の言語 (ヨーロッパ系) への翻訳者からも、
> 言語によって単語 (文字列) の長さが違うので、 truncate されないように
> 苦労して言葉を選んでるという話が出ていたような (-boot)。
> 
>  newtTexBot の flag には
		 (snip)
> というのがありますが、これは newt のソースでは textbox.c の
> static void doReflow(const char * text, char ** resultPtr, int width, 
>                      int * badness, int * heightPtr) {
> に関係しているみたいですね。

  若干気になって見てみました。
  内部でアルファベット圏での単純な改行処理を行なっていますね。

---
/*
 * 改行追加処理
 */
static void doReflow(const char * text, char ** resultPtr, int width, 
		     int * badness, int * heightPtr) {
    char * result = NULL;
    const char * chptr, * end;
    int howbad = 0;
    int height = 0;

    /*
     * 結果バッファの取得
     * オリジナルのテキスト長に、(改行コード用に)
     * テキスト長を一行幅で割って、おまけで2足してら。
     */
    if (resultPtr) {
	/* XXX I think this will work */
	result = malloc(strlen(text) + (strlen(text) / width) + 2);
	*result = '\0';
    }
    
    /* 
     * 処理ループ
     */
    while (*text) {

      /*
       * 最初の改行コードを探す
       */
	end = strchr(text, '\n');

	/*
	 * 改行コードがなかった場合は、
	 * 現在位置(text)に文字列長を足した地点を終点(end)とする
	 */
	if (!end)
	    end = text + strlen(text);

	/*
	 * 現在位置(text)が文字列終端でもなく、行末位置よりも前の場合
	 */
	while (*text && text <= end) {
	  /*
	   * 現地点の行長が、指定された行幅より小さい場合
	   * →悩まずそのまま改行
	   */
	    if (end - text < width) {

	      /*
	       * 結果バッファにコピー
	       */
		if (result) {
		    strncat(result, text, end - text);
		    strcat(result, "\n");
		    height++;
		}

		/*
		 * どれぐらいひどいか…?
		 */
		if (end - text < (width / 2))
		    howbad += ((width / 2) - (end - text)) / 2;

		/*
		 * 次の処理ポイントの指定
		 */
		text = end;
		/*
		 * 文字列終端でない限り処理を続行
		 */
		if (*text) text++;
	  /*
	   * 現在行の行長が、指定された行幅より大きい場合
	   * →悩んで改行
	   */
	    } else {
	      /*
	       * 改行ポイントの策定
	       * 現在位置(text)に指定された行幅を足した部分から、
	       * 先頭向きに戻っていって、最初の空白を探す
	       */
		chptr = text + width - 1;
		while (chptr > text && !isspace(*chptr)) chptr--;
		while (chptr > text && isspace(*chptr)) chptr--;
		chptr++;

		/*
		 * 空白が見つからなかった場合
		 * →泣く泣く行幅ちょうどでぶった切り
		 */
		if (chptr-text == 1 && !isspace(*chptr))
		  chptr = text + width - 1;

		/*
		 * どれぐらいひどい(空白ができた)か
		 */
		if (chptr > text)
		    howbad += width - (chptr - text) + 1;

		/*
		 * 結果バッファにコピー
		 */
		if (result) {
		    strncat(result, text, chptr - text);
		    strcat(result, "\n");
		    height++;
		}

		/*
		 * 次の現在位置を決める
		 */
		if (isspace(*chptr))
		    text = chptr + 1;
		else
		  text = chptr;

		/*
		 * いらん空白をスキップ
		 */
		while (isspace(*text)) text++;
	    }
	}
    }

    if (badness) *badness = howbad;
    if (resultPtr) *resultPtr = result;
    if (heightPtr) *heightPtr = height;
}
---

  newt を日本語EUC的にホゲるとどれぐらいの人が幸せになるもんでしょう?

---
吉山あきら (yosshy@debian.or.jp)