この節では,データ変換処理API(C言語)の使用例を示します。
データ変換処理API(C言語)の使用例には,次の三つの例があります。
#include <stdio.h>
#include "ETtrans.h"
static void print_message(int iCode, char *msg,
ETTRANSERRLIST *ErrList);
int main()
{
int iRet = 0;
ETTRANSADRSLIST AdrsList[3];
ETTRANSERRLIST ErrList;
char *pTC = NULL;
char *pMI = NULL;
/* アドレスリストの設定 */
AdrsList[0].FormatName = "IN";
AdrsList[0].DataKind = ET_DK_FILE;
AdrsList[0].DataAddress = "input.txt";
AdrsList[1].FormatName = "OUT";
AdrsList[1].DataKind = ET_DK_FILE;
AdrsList[1].DataAddress = "output.txt";
AdrsList[2].FormatName = NULL;
/* トランスレータ初期化 */
iRet = ETtrans2Init(NULL);
if (iRet) {
print_message(iRet, "ETtrans2Init", NULL);
goto EXIT;
}
/* スレッド固有情報生成 */
iRet = ETtrans2CreateThreadContext(
&pTC, ET_LG_ON,NULL, ET_FA_UPDATE, ET_OP_FNOFF, "-IERR");
if (iRet) {
print_message(iRet, "ETtrans2CreateThreadContext", NULL);
goto END;
}
/* MDLローディング */
iRet = ETtrans2CreateMdlInfo(&pMI, "SAMPLE.mdl", NULL);
if (iRet) {
print_message(iRet, "ETtrans2CreateMdlInfo", NULL);
goto END;
}
/* 変換実行 */
iRet = ETtrans2Exec(pTC, pMI, AdrsList, &ErrList, NULL);
if (iRet) {
print_message(iRet, "ETtrans2Exec", &ErrList);
goto END;
}
END:
if (pMI) { /* MDLアンロード */
iRet = ETtrans2ReleaseMdlInfo(pMI);
if (iRet) {
print_message(iRet, "ETtrans2ReleaseMdlInfo", NULL);
}
}
if (pTC) { /* スレッド固有情報解放 */
iRet = ETtrans2ReleaseThreadContext(pTC);
if (iRet) {
print_message(iRet, "ETtrans2ReleaseThreadContext", NULL);
}
}
/* 終了処理 */
iRet = ETtrans2End();
if (iRet) {
print_message(iRet, "ETtrans2End", NULL);
}
EXIT:
printf("--> Return Code = 0x%08x¥n", iRet);
return iRet;
}
/*
* エラー情報出力関数
*/
static void print_message(int iCode, char *msg, ETTRANSERRLIST *ErrList)
{
int i;
ETTRANSERRDATA *edata;
printf("### ERROR %s %d ###¥n", msg, iCode);
if (ErrList) {
printf(" Error Size = %d¥n", ErrList->Size);
for (i = 0; i < ErrList->Size; i++) {
edata = &ErrList->ErrData[i];
printf("¥t%02d (0x%08x) num=%d",
edata->MessageNo, edata->ErrorLevel, edata->NumericData);
if (edata->Information) {
printf(" info=%s¥n", edata->Information);
} else {
printf("¥n");
}
}
}
}
#include <stdio.h>
#include <string.h>
#ifdef WIN32
#include <process.h>
#include <windows.h>
#else
#include <pthread.h>
#endif
#include "ETtrans.h"
#define THRD_NUM 3 /* スレッドの数 */
/* スレッドに渡す情報を格納する構造体 */
typedef struct _THD_INF {
char *pMI; /* MDL情報 */
char *pTC; /* スレッド固有情報 */
char InputDataFile[256]; /* 入力データファイル名 */
char OutputDataFile[256]; /* 出力データファイル名 */
int iTid; /* スレッド番号 */
} THD_INF;
#ifdef WIN32
DWORD WINAPI ettrans_thrd(LPVOID);
#else
void *ettrans_thrd(void*);
#endif
/*
* main : メイン関数
*/
int main()
{
int iRet = 0;
int i;
char *pMI = NULL;
char *pTC_Ary[THRD_NUM];
THD_INF thd_inf_Ary[THRD_NUM];
char numwk[12];
#ifdef WIN32
DWORD thrdid[THRD_NUM];
HANDLE hthrd[THRD_NUM];
#else
int ret_thread;
pthread_t hthrd[THRD_NUM];
#endif
for (i = 0 ; i < THRD_NUM; i++) {
pTC_Ary[i] = NULL;
}
/* トランスレータ初期化 */
iRet = ETtrans2Init(NULL);
if (iRet) goto EXIT;
/* MDLローディング */
iRet = ETtrans2CreateMdlInfo(&pMI, "SAMPLE.mdl", NULL);
if (iRet) goto END;
/* スレッド固有情報生成 */
for (i = 0 ; i < THRD_NUM; i++) {
iRet = ETtrans2CreateThreadContext(&pTC_Ary[i], ET_LG_ON, NULL, ET_FA_UPDATE, ET_OP_FNOFF, "-IERR");
if (iRet) goto END;
}
/* スレッド生成 & 変換実行 */
for (i = 0 ; i < THRD_NUM; i++) {
sprintf(numwk, "%d", i + 1);
strcpy(thd_inf_Ary[i].InputDataFile, "input");
strcat(thd_inf_Ary[i].InputDataFile, numwk);
strcat(thd_inf_Ary[i].InputDataFile, ".txt");
strcpy(thd_inf_Ary[i].OutputDataFile, "output");
strcat(thd_inf_Ary[i].OutputDataFile, numwk);
strcat(thd_inf_Ary[i].OutputDataFile, ".txt");
thd_inf_Ary[i].iTid = i + 1;
thd_inf_Ary[i].pMI = pMI;
thd_inf_Ary[i].pTC = pTC_Ary[i];
#ifdef WIN32
hthrd[i] = CreateThread(NULL, 0, ettrans_thrd, (LPVOID)&thd_inf_Ary[i],
0, &thrdid[i]);
#else
ret_thread = pthread_create(&hthrd[i], NULL, ettrans_thrd,
&thd_inf_Ary[i]);
#endif
}
/* スレッド終了待合せ */
#ifdef WIN32
for (i = 0; i < THRD_NUM; i++) {
WaitForSingleObject(hthrd[i], INFINITE);
}
for ( i = 0 ; i < THRD_NUM; i++ ){
CloseHandle(hthrd[i]);
}
#else
for ( i = 0 ; i < THRD_NUM; i++ ){
pthread_join(hthrd[i], NULL);
}
#endif
END:
if (pMI) { /* MDLアンロード */
ETtrans2ReleaseMdlInfo(pMI);
}
for (i = 0 ; i < THRD_NUM; i++) {
if (pTC_Ary[i]) { /* スレッド固有情報解放 */
ETtrans2ReleaseThreadContext(pTC_Ary[i]);
}
}
/* 終了処理 */
ETtrans2End();
EXIT:
printf("*** END - 0x%08x ***¥n", iRet);
return(iRet);
}
/*
* ettrans_thrd : スレッド対応関数
*/
#ifdef WIN32
DWORD WINAPI ettrans_thrd(LPVOID Inf_Arg)
#else
void *ettrans_thrd(void *Inf_Arg)
#endif
{
int iRet = 0;
int iTid = 0;
THD_INF thd_inf;
ETTRANSADRSLIST AdrsList[3];
ETTRANSERRLIST ErrList;
thd_inf = *(THD_INF*)Inf_Arg;
iTid = thd_inf.iTid;
/* 引数の設定 */
AdrsList[0].FormatName = "IN";
AdrsList[0].DataKind = ET_DK_FILE;
AdrsList[0].DataAddress = thd_inf.InputDataFile;
AdrsList[1].FormatName = "OUT";
AdrsList[1].DataKind = ET_DK_FILE;
AdrsList[1].DataAddress = thd_inf.OutputDataFile;
AdrsList[2].FormatName = NULL;
/* 変換実行 */
iRet = ETtrans2Exec(thd_inf.pTC, thd_inf.pMI, AdrsList, &ErrList, NULL);
printf("Thread %08d End - Return Code 0x%08x¥n", iTid, iRet);
#ifdef WIN32
ExitThread(0);
#else
pthread_exit((void *)0);
#endif
return 0;
}
#include <stdio.h>
#include <string.h>
#ifdef WIN32
#include <process.h>
#include <windows.h>
#else
#include <pthread.h>
#endif
#include "ETtrans.h"
#define THRD_NUM 3 /* スレッドの数 */
/* スレッドに渡す情報を格納する構造体 */
typedef struct _THD_INF {
char *pTC; /* スレッド固有情報 */
char InputDataFile[256]; /* 入力データファイル名 */
char OutputDataFile[256]; /* 出力データファイル名 */
int iTid; /* スレッド番号 */
} THD_INF;
#ifdef WIN32
DWORD WINAPI ettrans_thrd(LPVOID);
#else
void *ettrans_thrd(void*);
#endif
/*
* main : メイン関数
*/
int main()
{
int iRet = 0;
int i;
char *pTC_Ary[THRD_NUM];
THD_INF thd_inf_Ary[THRD_NUM];
char numwk[12];
#ifdef WIN32
DWORD thrdid[THRD_NUM];
HANDLE hthrd[THRD_NUM];
#else
int ret_thread;
pthread_t hthrd[THRD_NUM];
#endif
for (i = 0 ; i < THRD_NUM; i++) {
pTC_Ary[i] = NULL;
}
/* トランスレータ初期化 */
iRet = ETtrans2Init(NULL);
if (iRet) goto EXIT;
/* スレッド固有情報生成 */
for (i = 0 ; i < THRD_NUM; i++) {
iRet = ETtrans2CreateThreadContext(&pTC_Ary[i], ET_LG_ON, NULL,
ET_FA_UPDATE, ET_OP_FNOFF, "-IERR");
if (iRet) goto END;
}
/* スレッド生成 & 変換実行 */
for (i = 0 ; i < THRD_NUM; i++) {
sprintf(numwk, "%d", i + 1);
strcpy(thd_inf_Ary[i].InputDataFile, "input");
strcat(thd_inf_Ary[i].InputDataFile, numwk);
strcat(thd_inf_Ary[i].InputDataFile, ".txt");
strcpy(thd_inf_Ary[i].OutputDataFile, "output");
strcat(thd_inf_Ary[i].OutputDataFile, numwk);
strcat(thd_inf_Ary[i].OutputDataFile, ".txt");
thd_inf_Ary[i].iTid = i + 1;
thd_inf_Ary[i].pTC = pTC_Ary[i];
#ifdef WIN32
hthrd[i] = CreateThread(NULL, 0, ettrans_thrd,
(LPVOID)&thd_inf_Ary[i], 0, &thrdid[i]);
#else
ret_thread = pthread_create(&hthrd[i], NULL, ettrans_thrd, &thd_inf_Ary[i]);
#endif
}
/* スレッド終了待合せ */
#ifdef WIN32
for (i = 0; i < THRD_NUM; i++) {
WaitForSingleObject(hthrd[i], INFINITE);
}
for ( i = 0 ; i < THRD_NUM; i++ ){
CloseHandle(hthrd[i]);
}
#else
for ( i = 0 ; i < THRD_NUM; i++ ){
pthread_join(hthrd[i], NULL);
}
#endif
END:
for (i = 0 ; i < THRD_NUM; i++) {
if (pTC_Ary[i]) { /* スレッド固有情報解放 */
ETtrans2ReleaseThreadContext(pTC_Ary[i]);
}
}
/* 終了処理 */
ETtrans2End();
EXIT:
printf("*** END - 0x%08x ***¥n", iRet);
return(iRet);
}
/*
* ettrans_thrd : スレッド対応関数
*/
#ifdef WIN32
DWORD WINAPI ettrans_thrd(LPVOID Inf_Arg)
#else
void *ettrans_thrd(void *Inf_Arg)
#endif
{
int iRet = 0;
int iTid = 0;
char *pMI = NULL;
THD_INF thd_inf;
ETTRANSADRSLIST AdrsList[3];
ETTRANSERRLIST ErrList;
thd_inf = *(THD_INF*)Inf_Arg;
iTid = thd_inf.iTid;
/* 引数の設定 */
AdrsList[0].FormatName = "IN";
AdrsList[0].DataKind = ET_DK_FILE;
AdrsList[0].DataAddress = thd_inf.InputDataFile;
AdrsList[1].FormatName = "OUT";
AdrsList[1].DataKind = ET_DK_FILE;
AdrsList[1].DataAddress = thd_inf.OutputDataFile;
AdrsList[2].FormatName = NULL;
/* MDLローディング */
iRet = ETtrans2CreateMdlInfo(&pMI, "SAMPLE.mdl", NULL);
if (iRet) goto END;
/* 変換実行 */
iRet = ETtrans2Exec(thd_inf.pTC, pMI, AdrsList, &ErrList, NULL);
END:
if (pMI) { /* MDLアンロード */
ETtrans2ReleaseMdlInfo(pMI);
}
printf("Thread %08d End - Return Code 0x%08x¥n", iTid, iRet);
#ifdef WIN32
ExitThread(0);
#else
pthread_exit((void *)0);
#endif
return 0;
}