BREW の文字列について知ろう ! - 1 / 2 -
今回は、 BREW の文字列の扱い方について解説します。また、文字列を画面に描画する方法や、フォントについても解説します。
C 言語の文字列操作のおさらい
C 言語では文字列は文字の配列として扱います。 C 言語には文字列を扱うための標準関数がいくつかありましたね。例えば、 2 つの文字列を連結して表示するプログラムは以下のようになります。
char* str1 = "Open "; char* str2 = "Sesami !"; char* str3; int len1 = strlen(str1); int len2 = strlen(str2); str3 = (char*) malloc(len1 + len2 + 1); { strcpy(str3, str1); strcpy(str3 + len1, str2); printf("%s", str3); } free(str3);
BREW の文字列操作
BREW の文字列も C 言語の文字列と同じです。ただし、 BREW では C 言語の標準関数を使ってはいけないことになっています。その代わり、 C 言語の標準関数と同等のことを行う"ヘルパー関数" が用意されています。
BREW のヘルパー関数は、「BREW API リファレンス」の「ヘルパー関数」というセクションに記載されています。参考までに、文字列に関するヘルパー関数をいくつか抜き出して表にしてみました。
関数名 | 対応する C 関数 | 説明 |
---|---|---|
MALLOC | malloc | メモリを確保します。 |
FREE | free | メモリを解放します。 |
SPRINTF | sprintf | 書式化された文字列を作成します。 |
STRCMP | strcmp | 文字列を比較します。 |
STRCPY | strcpy | 文字列をコピーします。 |
STRDUP | strdup | 文字列を複製します。 |
STRLEN | strlen | 文字列の長さを取得します。 |
DBGPRINTF | printf | デバッグ出力を行います。 |
BREW ヘルパー関数にはほかにもいろいろな関数があり、 C 言語標準関数に対応しない関数も用意されています。リファレンスに一通り目を通しておくことをお奨めします。
BREW ヘルパー関数は、 BREW SDK の AEEStdLib.h というヘッダで宣言されていますので、使用する場合はこのファイルをインクルードする必要があります。
上記の BREW ヘルパー関数を使用した文字列操作の例を以下に示します。 C 言語の文字列操作とほとんど同じですね。
char* str1 = "Open "; char* str2 = "Sesami !"; char* str3; int len1 = STRLEN(str1); int len2 = STRLEN(str2); str3 = (char*) MALLOC(len1 + len2 + 1); { STRCPY(str3, str1); STRCPY(str3 + len1, str2); DBGPRINTF("%s", str3); } FREE(str3);
デバッグ出力について
上記のコードでは、 C 言語の printf() 関数に対応するヘルパー関数として、 DBGPRINTF() を使用しています。この関数の使い方は printf() とほとんど同じですが、出力はコンソール(BREW にそんなものはない!)に表示されるのではなく、 BREW エミュレータの "出力ウィンドウ" に表示されます。
BREW エミュレータの "出力ウィンドウ" は、メニューの [表示] - [出力ウィンドウ] を選択することで表示されます。
この関数は、 BREW アプリをデバッグするときに非常に便利です。また、携帯電話実機で動作している BREW アプリからも DBGPRINTF() により表示を行えるので、実機でのデバッグが効率的に行えます。
実機からのデバッグ出力を表示するには "BREW Logger" というツールを使いますが、これに関しては本連載では触れないことにします。
注意していただきたいのは、デバッグ出力は開発者が DBGPRINTF() で出力したもの以外にもいろいろあるということです。上記画面のように、 BREW エミュレータを操作しているだけでも、さまざまな情報が出力されていることがわかります。
BREW の 2 つの文字型
BREW の文字列が C 言語のそれと同じものであることを見てきましたが、実は BREW にはもう一つ、 C 言語の文字列とは異なる文字列があります。 C 言語の char 型は 1 バイトの文字ですが、 BREW には AECHAR 型という 2 バイト文字を格納する型があります。これを "ワイド文字" といいます。
AECHAR 型の文字列を作成するには、 STREXPAND() ヘルパー関数を使用します。 STREXPAND() 関数は、 char 文字列を AECHAR 文字列に変換します。「BREW API リファレンス」には以下のように記述されています。
void STREXPAND ( const byte * pSrc, // char 文字列 int nCount, // char 文字列のバイト数 AECHAR * pDest, // AECHAR 文字列を格納するバッファ int nSize // pDest バッファのバイト数 )
※byte 型は BREW で定義されている型で、 unsigned char に同じです。
BREW プログラミングにおいて AECHAR 型はいたるところに現れてきますので、 STREXPAND を使いこなせるようになっておきましょう。以下にサンプルコードを示します。このサンプルは、本連載第 2 回で作成した HelloWorld アプリを、日本語を表示するように変更したものです。
// // アプレットが開始したときに呼び出される。 // static void HelloWorld_OnAppStart(AEEApplet* app) { char* str = "ヘロー ワールド"; int len = STRLEN(str); AECHAR* wstr; int wstr_bytes; wstr_bytes = (len + 1) * sizeof(AECHAR); wstr = (AECHAR*) MALLOC(wstr_bytes); STREXPAND(str, len, wstr, wstr_bytes); // 画面ビットマップに文字列を表示する IDISPLAY_DrawText(app->m_pIDisplay, AEE_FONT_BOLD, // 太字のフォント wstr, // 表示する文字列 -1, // -1 = 文字列をすべて表示する 0, // 無視される 0, // 無視される NULL, // クリッピングしない IDF_ALIGN_CENTER | IDF_ALIGN_MIDDLE); // 左右中央揃え、上下中央揃え FREE(wstr); // 更新された画面ビットマップを表示する IDISPLAY_Update (app->m_pIDisplay); }
IDISPLAY_DrawText() 関数は、描画するテキストを AECHAR 文字列として受け取るため、 STREXPAND() 関数を使用して char 文字列から AECHAR 文字列を作成しています。
その際、元の char 文字列の長さと同じ長さの AECHAR 文字列バッファを確保しています。描画が終われば AECHAR 文字列は不要になりますので、 FREE() 関数によりバッファを解放しています。
※C 言語だけで char 文字列と AECHAR 文字列を相互変換することは、 BREW プログラミングにたいへんな苦痛をもたらします。 BREW の文字列関数をラップした C++ クラスを用意することで、飛躍的にプログラミングが楽になりますが、本連載では C++ については扱いません。
ワイド文字の操作関数
BREW ヘルパー関数には、ワイド文字を操作するための関数も用意されています。以下の表にいくつか抜き出しました。詳細は「BREW API リファレンス」を参照してください。
関数名 | 対応する C 関数 | 説明 |
---|---|---|
WSPRINTF | sprintf | 書式化された文字列を作成します。 |
WSTRCMP | strcmp | 文字列を比較します。 |
STREXPAND | strcpy | 文字列をコピーします。 |
WSTRCOMPRESS | strdup | 文字列を複製します。 |
WSTRLEN | strlen | 文字列の長さを取得します。 |
STREXPAND | なし | char 文字列をワイド文字列に変換します。 |
WSTRCOMPRESS | なし | ワイド文字列を char 文字列に変換します。 |
STREXPAND() とは逆に、 AECHAR 文字列を char 文字列に変換するには、 WSTRCOMPRESS() 関数を使います。