代替照合シーケンスそれぞれは、ユーザが作成した4つのルーチンのセットが必要です -- gtm_ac_xform_1(またはgtm_ac_xform)、gtm_ac_xback_1(またはgtm_ac_xback)、gtm_ac_version、と gtm_ac_verify -オリジナルと変換された文字列は、GT.Mと gtm_descriptor または gtm32_descriptor のタイプのパラメータを使用しているユーザ作成ルーチンとの間で渡されます。 GT.Mディストリビューションのディレクトリに位置している "インクルード ファイル " gtm_descript.h で gtm_descriptorを定義します( gtm_ac_xform と gtm_ac_xback で使用される):
typedef struct { short len; short type; void *val; } gtm_descriptor;
注意 | |
---|---|
64ビットUNIXプラットフォームで、gtm_descriptor は、プラットフォームのアラインメント要件を満たすためにコンパイラのパディングの結果として 8バイトに増大できるでしょう。 |
gtm_descript.h は gtm32_descriptor (gtm_xc_xform_1 とgtm_xc_xback_2で使用される)を定義します:
typedef struct { unsigned int len; unsigned int type; void *val; } gtm32_descriptor;
len がデータの長さを示し、タイプがDSC_K_DTYPE_T(Mの文字列であることを示す)にセットされ、val が文字列のテキストにポイントします。
各ルーチンへのインタフェースは以下のとおりです。
gtm_ac_xform_1 または gtm_ac_xform のルーチンが、代替照合シーケンスに添字を変換します。>
もしアプリケーションが 32,767バイト(ただし1,048,576未満)よりも長い添字ありの lvn を使用している場合は、代替照合ライブラリは gtm_ac_xform_1 と gtm_ac_xback_1 のルーチンを含んでいる必要があります。そうでなければ、代替照合ライブラリは gtm_ac_xform と gtm_ac_xback を含むべきです。
このルーチンのシンタックスは次のとおりです:
#include "gtm_descript.h" int gtm_ac_xform_1(gtm32_descriptor* in, int level, gtm32_descriptor* out, int* outlen);
gtm_ac_xform のための入力引数:
in:変換すべき文字列を含んでいる gtm32_descriptor
level:整数; これは現在使用されていませんが、将来の機能のために予約されています
out:変換キーで満たされるべき gtm32_descriptor
return value:ロングワードの状態コード
out:gtm32_descriptor によって渡される文字列バッファで変換された添字
outlen:32ビット符号付き整数は、参照によって渡され、変換キーの実際の長さを返します。
gtm_ac_xform ルーチンのシンタックスは次のとおりです。
#include "gtm_descript.h" long gtm_ac_xform(gtm_descriptor *in, int level, gtm_descriptor *out, int *outlen)
gtm_ac_xform のための入力引数:
in:変換すべき文字列を含んでいる gtm_descriptor
level:整数; これは現在使用されていませんが、将来の機能のために予約されています
out:変換キーで満たされるべき gtm_descriptor
gtm_ac_xformのための出力引数:
返される値(return value):long整数がステータスコードを提供している結果を返します;変換の成功(ゼロ)または失敗(非ゼロ)を示します。
out:変換キーを含んでいる gtm_descriptor
outlen:符号なしlong 整数は、参照によって渡され、出力キーの実際の長さを与えます。
例:
#include "gtm_descript.h" #define MYAPP_SUBSC2LONG 12345678 static unsigned char xform_table[256] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99,101,103,105,107,109,111,113,115,117,118,119,120,121, 122, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98,100,102,104,106,108,110,112,114,116,123,124,125,126,127, 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 }; long gtm_ac_xform (in, level, out, outlen) gtm_descriptor *in; /* the input string */ int level; /* the subscript level */ gtm_descriptor *out; /* the output buffer */ int *outlen; /* the length of the output string */ { int n; unsigned char *cp, *cout; /* Ensure space in the output buffer for the string. */ n = in->len; if (n > out->len) return MYAPP_SUBSC2LONG; /* There is space, copy the string, transforming, if necessary */ cp = in->val; /* Address of first byte of input string */ cout = out->val; /* Address of first byte of output buffer */ while (n-- > 0) *cout++ = xform_table[*cp++]; *outlen = in->len; return 0; }
入力と出力の値は <NUL>(16進コード00)文字を含めることができます。
照合の変換ルーチンは、変換キーの末尾にあるオリジナルの添字に続く、<NUL>のような、センチネル(標識:データの終了を示すデータ)を連結することができます。キーの長さが問題でない場合、これにより逆変換ルーチンは、変換されたキーに基づいてその値を計算するのではなく、オリジナルの添字を単に検索することができます。
もしオリジナルの添字全体を追加しない理由がある場合、GT.Mは、オリジナルの添字は逆変換ルーチンによって簡単に取得することができるように、事前定義済みのコードをセンチネルプラスに連結することができますが、しかし、それでもユニークな再フォーマットされたキーを保証します。
このルーチンは、オリジナルの添字に変更されたキーを返します。このルーチンのシンタックスは次のとおりです:
#include "gtm_descript.h" long gtm_ac_xback(gtm_descriptor *in, int level, gtm_descriptor *out, int *outlen)
gtm_ac_xback の引数は、gtm_ac_xformのものと同じです。
gtm_ac_xback_1 のシンタックスは次のとおりです:
#include "gtm_descript.h" long gtm_ac_xback_1 ( gtm32_descriptor *src, int level, gtm32_descriptor *dst, int *dstlen)
gtm_ac_xback_1 の引数は、gtm_ac_xform_1 のものと同じです。
例:
#include "gtm_descript.h" #define MYAPP_SUBSC2LONG 12345678 static unsigned char inverse_table[256] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 97, 66, 98, 67, 99, 68,100, 69,101, 70,102, 71,103, 72, 104, 73,105, 74,106, 75,107, 76,108, 77,109, 78,110, 79,111, 80, 112, 81,113, 82,114, 83,115, 84,116, 85,117, 86,118, 87,119, 88, 120, 89,121, 90,122, 91, 92, 93, 94, 95, 96,123,124,125,126,127, 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 }; long gtm_ac_xback (in, level, out, outlen) gtm_descriptor *in; /* the input string */ int level; /* the subscript level */ gtm_descriptor *out; /* output buffer */ int *outlen; /* the length of the output string */ { int n; unsigned char *cp, *cout; /* Ensure space in the output buffer for the string. */ n = in->len; if (n > out->len) return MYAPP_SUBSC2LONG; /* There is enough space, copy the string, transforming, if necessary */ cp = in->val; /* Address of first byte of input string */ cout = out->val; /* Address of first byte of output buffer */ while (n-- > 0) *cout++ = inverse_table[*cp++]; *outlen = in->len; return 0; }
2つのユーザ定義のバージョン管理ルーチンは、間違ったグローバルで使用されている照合ルーチン、または、既存グローバルの照合ルーチンを変更するために行われている試み、から防御するための安全メカニズムを提供します。これらのいずれかの状況では、不正な照合または添字へのダメージの原因になります。
グローバルが代替照合シーケンスを割り当てられている場合、GT.Mは、グローバルに保存された照合ルーチンのセットのためのバージョン識別子の数字を返すユーザー提供のルーチンを呼び出します。プロセスはグローバル、GT.Mに初めてアクセスしたときには、割り当てられた照合順序を決定、その後は別のユーザ提供のルーチンを呼び出します。 2番目のルーチンは、照合ルーチンの現在のセットのそれらでグローバルに割り当てられている、照合シーケンスとバージョン識別子とを一致します。
タイプとバージョンに一致するコードを記述する時は、バージョン識別子を変更するかどうか、および、ルーチンの旧バージョンを使用して作成されたグローバルのサポートを許可するかどうかを決定できます。
このルーチンは、0から255間の整数の識別子を返します。この整数値は、照合順序が潜在的に進化するにつれ、互換を強制するメカニズムを提供します。GT.Mがデータベースまたはグローバルに代替照合シーケンスを最初に使用する時に、バージョンを取得し、もしバージョンは起動のかなり後でそれを変更されて見つかった場合、エラーを生成します。シンタックスは次のとおりです:
int gtm_ac_version()
例:
int gtm_ac_version() { return 1; }
このルーチンは、グローバルに関連付けられているタイプとバージョンがルーチンのアクティブなセットと互換性があることを検証します。タイプとバージョンの両方は、値によって渡される符号なしの文字です。シンタックスは次のとおりです:
#include "gtm_descript.h" int gtm_ac_verify(unsigned char type, unsigned char ver)
例:
Example: #include "gtm_descript.h" #define MYAPP_WRONGVERSION 20406080 /* User condition */ gtm_ac_verify (type, ver) unsigned char type, ver; { if (type == 3) { if (ver > 2) /* version checking may be more complex */ { return 0; } } return MYAPP_WRONGVERSION; }
%GBLDEFユーティリティを使用して、現在のグローバル・ディレクトリによってマップされたグローバル変数の照合順序を get、set、kill します。%GBLDEF は、データを含むグローバルまたは複数の領域にまたがる添字を持つグローバルのどちらかの照合順序を変更できません。データを含むグローバル変数の照合順序を変更するには、データを抽出し、変数をKILLし、照合順序を変更して、データをリロードします。GDEを使用して、領域にまたがるグローバル変数の照合順序を変更します。
外部エントリ・ポイントを使用する個々のグローバルに対して、照合順序を割り当てるには:
set^%GBLDEF(gname,nct,act)
これは:
最初の引数、gname は、グローバルの名前です。もしグローバル名がリテラルとして現れる場合、二重引用符("")で囲む必要があります。先頭のキャレット(^)を含む、正規のM変数名でなければなりません。
2番目の引数 nct は、数値添字が文字列として扱われるかどうかを決定する整数です。標準Mのように、数値添字が文字列の前に照合される場合はFALSE(0)、数値添字が文字列として扱われる場合はTRUE(1)(たとえば 10 が 9 より前に照合される場合)。
3番目の引数 act は、アクティブな照合順序を指定する整数です - 標準Mの照合では、0から255です。
グローバルにデータが含まれている場合、この関数はFALSE(0)を返し、既存の照合順序の定義を変更しません。
グローバルの添字が複数の領域にまたがる場合、関数はfalse(0)を返します。添字が複数の領域にまたがるグローバルの照合特性を設定するには、グローバル・ディレクトリ(GDEのGBLNAMEオブジェクト)を使用します。
TSTART / TCOMMITフェンスの外でこの機能を実行してください。$TLEVELがゼロ以外の場合、この関数はfalse(0)を返します。
例:
GTM>kill ^G GTM>write $select($$set^%GBLDEF("^G",0,3):"ok",1:"failed") ok GTM>
これはグローバル変数 ^Gを削除し、次に、文字列の前で照合する数値添字で照合シーケンス番号 3 を ^G にセットするには、外部関数として $$set%GBLDEF を使用します。$SELECT の引数として $$set^%GBLDEFを使用すると、セットが成功したかどうかの戻り値が得られます。もし要求された照合シーケンスが未定義の場合、$SELECTは、"FAILED" メッセージを返すでしょう。
グローバルに現在割り当てられた照合特性を検査するには、外部関数のエントリポイントを使用してください:
get^%GBLDEF(gname[,reg])
ここで、gname は、グローバル変数名を指定します。gname が複数の領域にまたがる場合、reg は範囲内の領域を指定します。
この関数は、グローバル名に関連付けられたデータを、次の部分を持つコンマで区切られた文字列として返します:
標準Mとして、数値の添字が文字列の前に照合される場合はFALSE(0)、数値の添字が文字列として扱われる場合はTRUE(1)を指定する整数の真理値。
照合順序を指定する整数
現在実装されている照合シーケンスの、バージョン、または、リビジョンレベルを指定する整数。
注意 | |
---|---|
get^%GBLDEF(gname) は、グローバル・ディレクトリの設定から、MUPIP CREATE時のデータベース・ファイルに対して定義された照合特性と異なる可能性があるグローバル固有の特性を返します。 "0,0,0"の戻り値がグローバルがM照合に明示的に定義されていることを示している間に、$$get^%gbldef(gname[,reg]) からの "0" の戻り値は、グローバルに特別な特性がなく、領域のデフォルト照合を使用することを示します。 DSE DUMP -FILEHEADERコマンドは、照合がM標準照合以外の場合は常に、領域の照合を表示します。 |
例:
GTM>Write $$get^%GBLDEF("^G") 1,3,1
この例では、グローバル ^G に現在割り当てられている照合順序の情報を返します。
グローバルに現在割り当てられた照合特性を削除するには、外部関数のエントリ・ポイントを使用してください:
kill^%GBLDEF(gname)
もしグローバルがデータを含む場合、関数はFALSE(0)を返し、グローバルを変更しません。
グローバルの添字が複数の領域にまたがる場合、関数はfalse(0)を返します。添字が複数の領域にまたがるグローバルの照合特性を設定するには、グローバル・ディレクトリ(GDEのGBLNAMEオブジェクト)を使用します。
TSTART / TCOMMITフェンスの外でこの機能を実行してください。$TLEVELがゼロ以外の場合、この関数はfalse(0)を返します。
この例では、"du Pont", "Friendly", "le Blanc", "Madrid" を照合するキーのセットの方法で、大文字と小文字のアルファベット文字を照合する代替照合シーケンスを作成します:
du Pont
Friendly
le Blanc
Madrid
これは、そのようにオーダーする標準M照合とは対照的です。
Friendly
Madrid
du Pont
le Blanc
重要 | |
---|---|
著作権のない主張は、この例で使用されるコードに関しては行われません。プロダクション(本番)環境でそのままコードは使用しないでください。 |
適切なディレクトリとファイルで、正しく構成された環境変数、正しく構成されたGT.Mのインストールを持っていることを確認してください。
よくつかい込んだGT.Mユーザは、この例で使用されている polish.cをダウンロードしたいでしょうし、そして、命令をコンパイルしてリンクするためにステップ5に直接進みたいでしょう。初めてのユーザは、ステップ1から開始することをお勧めします。
polish.cと呼ばれる新しいファイルを作成し、次のコードを配置します:
#include <stdio.h> #include "gtm_descript.h" #define COLLATION_TABLE_SIZE 256 #define MYAPPS_SUBSC2LONG 12345678 #define SUCCESS 0 #define FAILURE 1 #define VERSION 0 static unsigned char xform_table[COLLATION_TABLE_SIZE] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99,101,103,105,107,109,111,113,115,117,118,119,120,121, 122, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98,100,102,104,106,108,110,112,114,116,123,124,125,126,127, 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 }; static unsigned char inverse_table[COLLATION_TABLE_SIZE] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 97, 66, 98, 67, 99, 68,100, 69,101, 70,102, 71,103, 72, 104, 73,105, 74,106, 75,107, 76,108, 77,109, 78,110, 79,111, 80, 112, 81,113, 82,114, 83,115, 84,116, 85,117, 86,118, 87,119, 88, 120, 89,121, 90,122, 91, 92, 93, 94, 95, 96,123,124,125,126,127, 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 };
xform_table の要素は、トランスフォームの入力順序を表しています。inverse_table 内の要素は、逆の x_form_table ために変換を表しています。
gtm_ac_xform変換ルーチンの次のコードを追加します。
long gtm_ac_xform ( gtm_descriptor *src, int level, gtm_descriptor *dst, int *dstlen) { int n; unsigned char *cp, *cpout; #ifdef DEBUG char input[COLLATION_TABLE_SIZE], output[COLLATION_TABLE_SIZE]; #endif n = src->len; if ( n > dst->len) return MYAPPS_SUBSC2LONG; cp = (unsigned char *)src->val; #ifdef DEBUG memcpy(input, cp, src->len); input[src->len] = '\0'; #endif cpout = (unsigned char *)dst->val; while ( n-- > 0 ) *cpout++ = xform_table[*cp++]; *cpout = '\0'; *dstlen = src->len; #ifdef DEBUG memcpy(output, dst->val, dst->len); output[dst->len] = '\0'; fprintf(stderr, "\nInput = \n"); for (n = 0; n < *dstlen; n++ ) fprintf(stderr," %d ",(int )input[n]); fprintf(stderr, "\nOutput = \n"); for (n = 0; n < *dstlen; n++ ) fprintf(stderr," %d ",(int )output[n]); #endif return SUCCESS; } 3. Add the following code for the gtm_ac_xback reverse transformation routine: long gtm_ac_xback ( gtm_descriptor *src, int level, gtm_descriptor *dst, int *dstlen) { int n; unsigned char *cp, *cpout; #ifdef DEBUG char input[256], output[256]; #endif n = src->len; if ( n > dst->len) return MYAPPS_SUBSC2LONG; cp = (unsigned char *)src->val; cpout = (unsigned char *)dst->val; while ( n-- > 0 ) *cpout++ = inverse_table[*cp++]; *cpout = '\0'; *dstlen = src->len; #ifdef DEBUG memcpy(input, src->val, src->len); input[src->len] = '\'; memcpy(output, dst->val, dst->len); output[dst->len] = '\0'; fprintf(stderr, "Input = %s, Output = %s\n",input, output); #endif return SUCCESS; }
バージョン識別子ルーチン(gtm_ac_version)または検証ルーチン(gtm_ac_verify)のコードを追加します。
int gtm_ac_version () { return VERSION; } int gtm_ac_verify (unsigned char type, unsigned char ver) { return !(ver == VERSION); }
polish.cを保存してコンパイルします。x86 GNU / Linux(64ビットUbuntu 10.10)では、次のようなコマンドを実行します:
gcc -c polish.c -I$gtm_dist
注意 | |
---|---|
-I$gtm_dist オプションには gtmxc_types.h が含まれています。 |
新しい共有ライブラリを作成するか、上記のルーチンを既存のライブラリに追加します。次のコマンドは、x86 GNU / Linux(64ビットUbuntu 10.10)の altcoll.so という共有ライブラリにこれらの代替シーケンスルーチンを追加します。
gcc -o altcoll.so -shared polish.o
altcoll.so の場所を指すように $gtm_collate_1 を設定します。
GTM>プロンプトで、次のコマンドを実行します:
GTM>Write $SELECT($$set^%GBLDEF("^G",0,1):"OK",1:"FAILED") OK
これにより、グローバル変数 ^G が削除され、文字列の前に照合される数値の添字付きの照合順序番号 1 に ^G が設定されます。
次の値を ^G に割り当てます。
GTM>Set ^G("du Pont")=1 GTM>Set ^G("Friendly")=1 GTM>Set ^G("le Blanc")=1 GTM>Set ^G("Madrid")=1
代替の照合順序に従って ^G の添字がどのようになっているかを見てください:
GTM>ZWRite ^G ^G("du Pont")=1 ^G("Friendly")=1 ^G("le Blanc")=1 ^G("Madrid")=1
この例では、アルファベットを逆順に照合する代替の照合順序を作成します。これは、アルファベットを昇順で照合する標準的なM照合とは対照的です。
重要 | |
---|---|
著作権のない主張は、この例で使用されるコードに関しては行われません。プロダクション(本番)環境でそのままコードは使用しないでください。 |
適切なディレクトリとファイルで、正しく構成された環境変数、正しく構成されたGT.Mのインストールを持っていることを確認してください。
http://tinco.pair.com/bhaskar/gtm/doc/books/pg/UNIX_manual/col_reverse_32.c から col_reverse_32.c をダウンロードします。変換ルーチン(gtm_ac_xform_1)、逆変換ルーチン(gtm_ac_xback_1)、およびバージョン管理ルーチン(gtm_ac_version と gtm_ac_verify)のコードが含まれています。
col_reverse_32.c を保存しコンパイルします。x86 GNU / Linux(64ビットUbuntu 10.10)では、次のようなコマンドを実行します:
gcc -c col_reverse_32.c -I$gtm_dist
注意 | |
---|---|
-I$gtm_dist オプションには gtmxc_types.h が含まれています。 |
新しい共有ライブラリを作成するか、既存のライブラリにルーチンを追加します。次のコマンドは、x86 GNU / Linux(64ビットUbuntu 10.10)の altcoll.so という共有ライブラリにこれらの代替シーケンスルーチンを追加します。
gcc -o revcol.so -shared col_reverse_32.o
環境変数 gtm_collate_2 を revcol.so の場所を指すように設定します。ローカル変数の照合順序をこの代替の照合順序に設定するには、環境変数gtm_local_collate を 2 に設定します。
GTMプロンプトで、次のコマンドを実行します:
[参考]GTM>Write $SELECT($$set^%GBLDEF("^G",0,1):"OK",1:"FAILED")
^E に、次の値を割り当てます。
GTM>Set ^E("du Pont")=1 GTM>Set ^E("Friendly")=1 GTM>Set ^E("le Blanc")=1 GTM>Set ^E("Madrid")=1
^E の添字がどのように逆順に並んでいるかに注目してください。
GTM>zwrite ^E ^G("le Blanc")=1 ^G("du Pont")=1 ^G("Madrid")=1 ^G("Friendly")=1