wzsoftロゴ
 
 

 

3. Text-Cリファレンス(テキスト型)


テキスト型を使った文字列処理

Text-CにはHTEXT(テキスト)データ型が標準で提供されています。テキスト型を使用すると文字列データの操作が容易になります。

テキストは、挿入削除ができる文字列バッファとして動作します。バッファの容量が足りなくなると自動的に拡張されます。原理上は4GBまでのデータを扱えます。テキストを使うには、次のように記述します。

    HTEXT text = new();
    add(text,"abc");// 現在位置(=先頭)に"abc"を挿入
    add(text,"def");// 現在位置(=abcの次)に"def"を挿入

HTEXT textは、テキスト型の変数textを宣言します。new()は、テキストデータを作成します。宣言したtext編集に、new()を代入して、以降はtext変数を使って操作します。
new()で作成したテキストは自動的に削除されるので、int型と同様に使用できます。
text変数にテキストファイルの内容の読み込み、text変数の内容のファイルへの書き込み、画面表示と編集が可能です。

C言語の標準ライブラリのstrcpyなどの文字列関数は、Text-Cではテキストを文字列バッファとして使用できます。

    HTEXT text = new();
    strcpy(text,"Hello,world");
    printf("%s\n",text);

テキストをバッファに指定すると、バッファサイズを越えた文字列の追加「バッファオーバラン」の発生がなく、信頼性の高いプログラムを作成できます。
C言語の文字列(char*型)は、C文字列型と記します。

Text-Cでは、C言語の標準ライブラリに代わる各種の処理をおこなうライブラリAPIが、標準で用意されています。
Text-CのAPI一覧は"wz://text.h"(WZフォルダのtext.hファイル)にあります。textapi修飾子が付いている関数がAPIです。

段落とリスト

テキストの改行で区切られた、各々の文字列は段落になります。

1段落 改行
2段落 改行
3段落

Text-Cでは、各段落を1つの文字列と見なします。上の例ではテキストに3つの文字列が入っています。テキストを文字列の配列「リスト」として扱えます。

APIのSTR型の引数として、テキストを渡すことができます。テキストの現在段落の文字列が引数として使用されます。
例えば、strcpy(STR sz1,STR sz2)APIのsz1とsz2にテキストを指定できます。sz1にテキストを指定するとその現在段落がsz2の文字列に置き換わります。
STR型の引数にC文字列型を渡すと、普通のC言語のstrcpyと同じ動作をします。
printfの"%s"にテキストを指定すると、現在段落の内容が表示されます。

テキストの内容をリストボックスとして画面に表示することもできます。
Text-Cには、段落単位の操作のライブラリがあります。

  • 前後の段落にジャンプ
  • i番目の段落にジャンプ
  • 現在位置に段落を挿入
  • 段落の削除
  • 前後の段落の入れ替え

カラムと表

テキストではタブ文字(文字コード0x09)と改行で、表形式のデータを扱えます。

文字列11 タブ 文字列12 タブ 文字列13 改行
文字列21 タブ 文字列22 タブ 文字列23 改行
文字列31 タブ 文字列32 タブ 文字列33 改行

タブで区切られた各文字列を、カラム(CLM)と呼びます。

APIのCLM型の引数にテキストを指定すると、現在位置のカラムの文字列が引数として渡されます。
例えば、clmcpy(HTEXT clm1,CLM clm2)のclm1にはテキスト、clm2にはテキストまたはC文字列を指定できます。clm1の現在カラムの内容がclm2に置き換わります。
clm2にテキストを指定すると、clm2の現在のカラムの内容がclm1にセットされます。
clm2にC文字列型を指定すると、文字列の先頭から「タブ」「改行」「\0」までの文字列がclm1にセットされます。
printfの"%cs"にtextを指定すると、テキストの現在のカラムが表示されます。

テキストの内容を表形式として、各列の幅を揃えた画面表示も可能です。

アウトラインと木構造

テキストで木構造を扱えます。
ツリーの各項目「ノード」はテキストの段落で表し、ノードの親子/兄弟関係は段落先頭のネストレベルで表します。

プロパティ

テキストで、名前と内容の組み合わせの「プロパティ」を扱えます。

名前内容
POP3mailserver.mycorp.co.jp
USERmyname
PASSWDxxxx
APOP1

テキストに上記のプロパティをセットするには、次を記述します。

    HTEXT text = new();
    text.clmpop3 = "mailserver.mycorp.co.jp";
    text.clmuser = "myname";
    text.clmpasswd = "xxxx";
    text.apop = 1;

文字列の内容をセットする場合は、名前の前にclmを付けます。

テキストの内容は以下になります。

(空行)
pop3: mailserver.mycorp.co.jp
user: myname
passwd: xxxx
apop: 1

プロパティは、
名前: 空白 内容 改行
のテキスト形式の内容になります。ファイルにそのまま内容を保存して、次回の起動時にロードして使用できます。

プロパティの内容を取得するには、次を記述します。

    if (!clmcmp(text.clmpasswd,"xxxx")) ...
    if (text.apop) ...

文字列の内容を取得するには、名前の前にclmを付けCLM型として扱います。
数値を取得するには、名前をそのまま指定し整数型として扱います。

名前は6文字までの任意の英数字(識別値)を指定できます。大文字と小文字は区別されず、宣言の必要はありません。

プロパティをダイアログボックス表示するAPIで、設定ダイアログを作成できます。

cfgnew(id) APIを使用すると、保存場所の決定や保存処理が自動化されます。引数のidにはプロパティの名称、ID_POPなどのID_+識別値を指定します。

プロパティの内容を文字列で取得すると、テキストバッファのポインタが直接返されます。このポインタを変数に代入して長時間保持すると、プロパティの内容が変更されたときに位置がずれて無効になり、不具合の原因になります。
特に同一のテキストで、文字列プロパティのコピーはできません。
下記のプログラムは無効となります。

    text.clmname = text.clmstr;

テキストの標準のプロパティ

標準のプロパティで、テキストの情報を取得/変更できます。
標準のプロパティはテキストの内容とは別に保管されるので、プロパティを変更してもテキストの内容が変更されることはありません。

_edit(getset)編集フラグ
_nedit(get)変数回数のカウンタ
_ro(get)リードオンリー
_type(set)テキストのタイプをセット(ID_LISTOL,ID_RSS,ID_HTML)
_mbx(getset)MBXフラグ
_msg(getset)メッセージフラグ
clm_fname(get)ロードしたファイル名
v(get)(HVIEW)ビュー

(get)はプロパティの取得、(set)はプロパティのセット、(getset)はプロパティの取得とセットの両方が可能です。

識別値

「識別値」は、6文字までの任意の名前で、プログラム中で頭にID_を付けて大文字で記述します。

    ID_TEXT ID_OPEN ID_A ID_B

識別値の大文字と小文字は区別されず、半角の英字と数字が指定できます。ID_TEXTとID_textは同じ識別値になります。
プロパティの名前やメソッド名にも識別値を指定します。この場合は、ID_は付けずに原則として小文字で記述します。
識別値はそれぞれ32bitの整数値に変換されます。ID_Aは1、ID_Bは2に変換され、switch文の記述も可能です。

    switch(id) {
        case ID_OPEN: ...break;
        case ID_TEXT: ...break;
    }

識別値は従来の#defineによる定数の代わりに、下記の指定に用います。

  • プロパティ名
  • メソッド名
  • メニューコマンド名
  • プロパティダイアログの各プロパティ名
  • アプリケーションID
  • 設定ファイルID
  • プログラムの作者ID
  • その他、任意の名前としてプログラムで用います。

ID__FNAMEなど、先頭が"_"で始まる識別子は予約されていますので、プログラムでは使用できません。

前へ 次へ