# ユーザ出口プログラムの仕様

ユーザ出口プログラム内では、必ず以下の関数を呼び出す必要があります。

- 初期処理関数

- メイン関数

- 終了処理関数

(1) 初期処理関数

初期処理を行います。

a) 構文

Windowsの場合

    int __stdcall ed_userexit_init( short *dtlerrno )

UNIXの場合

    int ed_userexit_init( short *dtlerrno )

b) パラメータ

short *dtlerrno

  : 初期処理で失敗した際の詳細コードを格納します

= 備考 =

dtlerrno（詳細コード）は、エラーコード093のエラーメッセージ内に出力されます。ユーザが任意の詳細コードを割り当てることで、エラー発生個所を判別できます。

c) 戻り値

0

  : 正常終了

-1

  : 異常終了

= 備考 =

何も行わない場合でも、必ず初期化処理を行うようにしてください。

(2) メイン処理関数

入力データと、その項目名または項目番号から、出力データを作成します。

a) 構文

Windowsの場合

    int __stdcall ed_userexit_main(USER_EXITINFO *user_exitinfo, char **outbuf, int *outsize, short *dtlerrno, void *ptr1, void *ptr2)

UNIXの場合

    int  ed_userexit_main(USER_EXITINFO *user_exitinfo, char **outbuf, int *outsize, short *dtlerrno, void *ptr1, void *ptr2)

b) パラメータ

USER_EXITINFO *user_exitinfo

  : 入力データを構造体に格納した形で保持しています

char **outbuf

  : 出力データを格納します

int *outsize

  : 出力データサイズを格納します

short *dtlerrno

  : メイン処理で失敗した際の詳細コードを格納します

void *ptr1

  : 内部で使用するポインタです

void *ptr2

  : 内部で使用するポインタです

c) 戻り値

0

  : 正常終了

-1

  : 異常終了

注意

- outbufは必ずed_userexit_main関数の中で、データサイズに2バイトを足したサイズをバッファとして確保してください。また、バッファはNULLで初期化をして利用してください。

- 解放はDataMagicが行いますので、ユーザ側では解放しないでください。

- ユーザ出口プログラムから出力される2バイトコードは無変換で出力されます。

  出力ファイルの漢字コード種には変換されないので注意してください。

- 変数に値を出力するためにユーザ出口プログラムを使用する場合、ユーザ出口プログラムでは、入力の漢字コード種で値を出力する必要があります。

= 備考 =

dtlerrno（詳細コード）は、エラーコード094のエラーメッセージ内に出力されます。ユーザが任意の詳細コードを割り当てることで、エラー発生個所を判別できます。

(3) 終了処理関数

ユーザ出口プログラムの処理で使用したバッファの解放などを行います。何も行わない場合でも、必ず終了処理を行うようにしてください。

a) 構文

Windowsの場合

    void __stdcall ed_userexit_end()

UNIXの場合

    void ed_userexit_end()

b) パラメータ

無し

c) 戻り値

無し

(4) USER_EXITINFO構造体

    struct  user_exitinfo{
                 intwhereno;…  抽出条件番号
                 intoutfileno;…  出力番号
                 charoutitemname[255+1];…  出力項目名
                 int  outitemno;…  出力項目番号
                 char  outitemtype;…  定義項目タイプ
                 int  outitemsize;…  定義項目サイズ
                 char  outitemfig;…  定義小数部桁数
                 } USER_EXITINFO;

= 備考 =

該当する情報がない場合、int型とchar型には0が入ります。

(5) 入力ファイルデータ取得関数1（メイン処理で使用できます）

入力データから項目番号に該当するデータを取得します。

a) 構文

Windowsの場合

    int __stdcall ed_getindata_itemno(void *ptr1, void *ptr2, int itemno, char **getbuf, int *getsize)

UNIXの場合

    int ed_getindata_itemno( void *ptr1, void *ptr2, int itemno, char **getbuf, int *getsize)

b) パラメータ

void *ptr1

  : 内部で使用するポインタです

void *ptr2

  : 内部で使用するポインタです

int itemno

  : 取得したい入力データの項目番号を指定します

char **getbuf

  : 取得データが格納されています

int *getsize

  : 取得データサイズが格納されています

c) 戻り値

0

  : 取得成功

-1

  : 取得失敗

= 備考 =

引数ptr1とptr2には、必ずed_userexit_mainの引数として値を受け取ったptr1とptr2を渡してください。

注意

- 取得データのバッファ（**getbuf）はAPI内でアロケートします。APIを使用した後は、そのエリアをed_free() 関数で解放する必要があります。

- 入力の形式がXMLの場合にはこの関数は使用できません。

(6) 入力ファイルデータ取得関数2（メイン処理で使用できます）

入力データから項目名に該当するデータを取得します。

a) 構文

Windowsの場合

    int __stdcall ed_getindata_itemname(void *ptr1, void *ptr2, char *itemname, char **getbuf, int *getsize)

UNIXの場合

    int ed_getindata_itemname(void *ptr1, void *ptr2, char *itemname, char **getbuf, int *getsize)

b) パラメータ

void *ptr1

  : 内部で使用するポインタです

void *ptr2

  : 内部で使用するポインタです

char *itemname

  : 取得したい入力データの項目名を指定します

char **getbuf

  : 取得データが格納されています

int *getsize

  : 取得データサイズが格納されています

c) 戻り値

0

  : 取得成功

-1

  : 取得失敗

= 備考 =

引数ptr1とptr2には、必ずed_userexit_mainの引数として値を受け取ったptr1とptr2を渡してください。

注意

取得データのバッファ（**getbuf）はAPI内でアロケートします。APIを使用した後は、そのエリアをed_free()関数で解放する必要があります。

(7) 変数データ取得関数（メイン処理で使用できます）

変数から変数名に該当するデータを取得します。

a) 構文

Windowsの場合

    int __stdcall ed_getindata_var(void *ptr1, void *ptr2, char *itemname, char **getbuf, int *getsize)

UNIXの場合

    int ed_getindata_var(void *ptr1, void *ptr2, char *itemname, char **getbuf, int *getsize)

b) パラメータ

void *ptr1

  : 内部で使用するポインタです

void *ptr2

  : 内部で使用するポインタです

char *itemname

  : 取得したい変数の変数名を指定します

char **getbuf

  : 取得データが格納されています

int *getsize

  : 取得データサイズが格納されています

c) 戻り値

0

  : 取得成功

-1

  : 取得失敗

= 備考 =

引数ptr1 とptr2 には、必ずed_userexit_main の引数として値を受け取ったptr1とptr2 を渡してください。

注意

取得データのバッファ（**getbuf）はAPI 内でアロケートします。API を使用した後は、そのエリアをed_free() 関数で解放する必要があります。

(8) マッチングファイルデータ取得関数（メイン処理で使用できます）

マッチング番号で指定されたデータから項目番号に該当するデータを取得します。

a) 構文

Windowsの場合

    int __stdcall ed_getindata_itemno_matchno(void *ptr1, void *ptr2, int matchno, int itemno, char **getbuf, int *getsize)

UNIXの場合

    int ed_getindata_itemno_matchno(void *ptr1, void *ptr2, int matchno, int itemno, char **getbuf, int *getsize)

b) パラメータ

void *ptr1

  : 内部で使用するポインタです

void *ptr2

  : 内部で使用するポインタです

int matchno

  : 取得したいマッチング番号を指定します

int itemno

  : 取得したい入力データの項目番号を指定します

char **getbuf

  : 取得データが格納されています

int *getsize

  : 取得データサイズが格納されています

c) 戻り値

0

  : 取得成功

-1

  : 取得失敗

= 備考 =

引数ptr1とptr2には、必ずed_userexit_mainの引数として値を受け取ったptr1とptr2を渡してください。

注意

取得データのバッファ（**getbuf）はAPI内でアロケートします。APIを使用した後は、そのエリアをed_free()関数で解放する必要があります。

(9) メモリ取得関数（メイン処理で使用できます）

指定したデータサイズのメモリを取得します。

a) 構文

Windowsの場合

    void* __stdcall ed_malloc(size_t size)

UNIXの場合

    void* ed_malloc(size_t size)

b) パラメータ

size_t size

  : 取得するデータサイズを指定します

c) 戻り値

NULL以外

  : 取得したポインタ

NULL

  : 取得失敗

(10) メモリ解放関数（メイン処理で使用できます）

引数で指定されたメモリを解放します。

a) 構文

Windowsの場合

    void __stdcall ed_free(void *ptr)

UNIXの場合

    void ed_free(void *ptr)

b) パラメータ

void *ptr

  : 解放するポインタを指定します。

c) 戻り値

なし