# ユーザ出口プログラムの作成例

ユーザ出口プログラムの作成例を以下に示します。この作成例では、１レコード16バイトのイメージデータである入力ファイルをASCII文字列に変換し出力データとしています。

(1) Windowsの場合

a) userexit.cの内容

    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    /* USER_EXITINFO 構造体 */
    typedef struct user_exitinfo {
      int            whereno;               /* 抽出条件番号 */
      int            outfileno;             /* 出力ファイル番号 */
      char           outitemname[255+1];    /* 出力項目名 */
      int            outitemno;             /* 出力項目番号 */
      char           outitemtype;           /* 定義項目タイプ */
      int            outitemsize;           /* 定義項目サイズ */
      char           outitemflg;            /* 定義小数部桁数 */
    }USER_EXITINFO;

    /* 項目番号に該当するデータを取得する関数 */
    typedef int (__stdcall *PROC_ed_getindata_itemno)
             (void *ptr1, void *ptr2, int  itemno, char **getbuf, int  *getsize);

    /* メモリを取得する関数 */
    typedef void *(__stdcall *PROC_ed_malloc) (size_t size);

    /* メモリを解放する関数 */
    typedef void (__stdcall *PROC_ed_free)(void *ptr);

    /* DLL エントリーポイント */
    BOOL APIENTRY DllMain( HANDLE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved )
    {
     switch (ul_reason_for_call){
             case DLL_PROCESS_ATTACH:
             case DLL_THREAD_ATTACH:
             case DLL_THREAD_DETACH:
             case DLL_PROCESS_DETACH:
                  break;
    }
        return TRUE;
    }

    /* 初期化関数 */
    int __stdcall ed_userexit_init( short *dtlerrno )
    {
      return 0;
    }

    /* メイン関数 */
    int __stdcall ed_userexit_main( USER_EXITINFO *user_exitinfo,
                                            char     **outbuf,
                                            int      *outsize,
                                            short    *dtlerrno,
                                            void     *ptr1,
                                            void     *ptr2 )
    {
    /* データ取得用 */
    char    *getbuf;
    /* データサイズ格納用 */
    int    getsize = 0;
    /* モジュールハンドル格納用 */
    HMODULE hModule;
    /* 項目番号からデータを取得する関数 */
    PROC_ed_getindata_itemno ed_getindata_itemno;
    /* メモリ取得関数 */
    PROC_ed_malloc ed_malloc;
    /* メモリ解放関数 */
    PROC_ed_free             ed_free;

    /* 入力データ取得関数のロード */
    hModule = GetModuleHandle(NULL);
    ed_getindata_itemno =
     (PROC_ed_getindata_itemno)GetProcAddress(hModule, "ed_getindata_itemno");
    if( ed_getindata_itemno == NULL ){
            *dtlerrno = 1;
            return -1;
    }

    /* メモリ取得関数のロード */
    ed_malloc = (PROC_ed_malloc)GetProcAddress(hModule, "ed_malloc");
    if( ed_malloc == NULL ){
            *dtlerrno = 2;
            return -1;
    }

    /* メモリ解放関数のロード */
    ed_free = (PROC_ed_free)GetProcAddress(hModule, "ed_free");
    if( ed_free == NULL ){
            *dtlerrno = 3;
            return -1;
    }

    /* 項目番号1 のデータを取得 */
    if( ed_getindata_itemno( ptr1, ptr2, 1, &getbuf, &getsize ) != 0 ){
            *dtlerrno = 4;
            return -1;
    }

    /* 出力用バッファをアロケート */
        *outbuf = (char *)ed_malloc( 64 );
    if( *outbuf == (char *)NULL ){
            *dtlerrno = 5;
            return -1;
    }
    sprintf((char *)*outbuf,
           "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
           (unsigned char)getbuf[0],(unsigned char)getbuf[1],
           (unsigned char)getbuf[2],(unsigned char)getbuf[3],
           (unsigned char)getbuf[4],(unsigned char)getbuf[5],
           (unsigned char)getbuf[6],(unsigned char)getbuf[7],
           (unsigned char)getbuf[8],(unsigned char)getbuf[9],
           (unsigned char)getbuf[10],(unsigned char)getbuf[11],
           (unsigned char)getbuf[12],(unsigned char)getbuf[13],
           (unsigned char)getbuf[14],(unsigned char)getbuf[15]);
    *outsize=32;

    /* 取得データ領域の解放 */
    ed_free( getbuf );

    return 0;
    }

    /* 終了関数 */
    void __stdcall ed_userexit_end( void )
    {
    return;
    }

b) userexit.defの内容

    LIBRARY "userexit"

    EXPORTS
    ed_userexit_init @1
    ed_userexit_main @2
    ed_userexit_end  @3

(2) UNIXの場合

a) userexit.cの内容

    #include <stdio.h>
    #include <stdlib.h>

    /* USER_EXITINFO 構造体 */
    typedef struct user_exitinfo {
      int            whereno;               /* 抽出条件番号 */
      int            outfileno;             /* 出力ファイル番号 */
      char           outitemname[255+1];    /* 出力項目名 */
      int            outitemno;             /* 出力項目番号 */
      char           outitemtype;           /* 定義項目タイプ */
      int            outitemsize;           /* 定義項目サイズ */
      char           outitemflg;            /* 定義小数部桁数 */
    } USER_EXITINFO;

    /* 項目番号に該当するデータを取得する関数 */
    int  *ed_getindata_itemno ( void *ptr1, void *ptr2, int  itemno,
                                 char **getbuf, int  *getsize);
    void *ed_malloc (size_t size);
    void ed_free (void *ptr);

    /* 初期化関数 */
    int ed_userexit_init( short *dtlerrno )
    {
      return 0;
    }

    /* メイン関数 */
    int ed_userexit_main( USER_EXITINFO *user_exitinfo,
                                     char    **outbuf,
                                     int     *outsize,
                                     short   *dtlerrno,
                                     void    *ptr1,
                                     void    *ptr2 )
    {
     char    *getbuf;        /* データ取得用 */
     int    getsize = 0;     /* データサイズ格納用 */

    /* 項目番号1 のデータを取得 */
     if( ed_getindata_itemno( ptr1, ptr2, 1, &getbuf, &getsize ) != 0 ){
                *dtlerrno = 1;
                return -1;
     }

    /* 出力用バッファをアロケート */
    *outbuf = (char *)ed_malloc( 64 );
     if( *outbuf == (char *)NULL ){
            *dtlerrno = 2;
            return -1;
     }
     sprintf((char *)*outbuf,
              "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
              (unsigned char)getbuf[0],(unsigned char)getbuf[1],
              (unsigned char)getbuf[2],(unsigned char)getbuf[3],
              (unsigned char)getbuf[4],(unsigned char)getbuf[5],
              (unsigned char)getbuf[6],(unsigned char)getbuf[7],
              (unsigned char)getbuf[8],(unsigned char)getbuf[9],
              (unsigned char)getbuf[10],(unsigned char)getbuf[11],
              (unsigned char)getbuf[12],(unsigned char)getbuf[13],
              (unsigned char)getbuf[14],(unsigned char)getbuf[15]);
    *outsize=32;

    /* 取得データを解放 */
     ed_free( getbuf );

     return 0;
    }

    /* 終了関数 */
    void ed_userexit_end( void )
    {
     return;
    }