[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)