使用这个模板来创建您自己的语言环境。
/**********************************************************************/ /* */ /* 文件名 */ /* */ /* 说明 */ /* */ /* 功能 */ /* */ /* 入口点 */ /* */ /* 更改活动性 */ /* */ /* 标志 原因 日期 开发者 说明 */ /* ------ ---------- -------- ------------ ---------------------- */ /* */ /**********************************************************************/ /*--------------------------------------------------------------------*/ /* 包含文件 */ /*--------------------------------------------------------------------*/ #include "dtwle.h" #ifdef __MVS__ #pragma export(dtw_initialize) #pragma export(dtw_execute) #pragma export(dtw_getNextRow) #pragma export(dtw_cleanup) #endif #ifdef _AIX_ //*--------------------------------------------------------------------*/ /* 函数 */ /* dtw_getFp */ /* */ /* 目的 */ /* 设置函数的指针,使之指向此语言环境所提供的所有语言环境接口 */ /* 例程。如果结构中的某个例程没有提供,则将该字段设置为 NULL。 */ /* */ /* 格式 */ /* int dtw_getFp(dtw_fp_t *func_pointer) */ /* */ /* 参数 */ /* func_pointer 一个指向结构的指针,该结构中包含此语言环境 */ /* 为所有函数提供的函数指针。 */ /* */ /* 返回 */ /* 成功 ....... 0 */ /* 失败 ....... -1 */ /*--------------------------------------------------------------------*/ int dtw_getFp(dtw_fp_t *func_pointer) { func_pointer->dtw_initialize_fp = dtw_initialize; func_pointer->dtw_execute_fp = dtw_execute; func_pointer->dtw_getNextRow_fp = dtw_getNextRow; func_pointer->dtw_cleanup_fp = dtw_cleanup; return 0; } #endif /*--------------------------------------------------------------------*/ /* */ /* 函数 */ /* dtw_initialize */ /* */ /* 目的 */ /* */ /* 格式 */ /* int dtw_initialize(dtw_lei_t *le_interface) */ /* */ /* 参数 */ /* le_interface 一个指向结构的指针,该结构中包含以下字段: */ /* */ /* function_name */ /* flags */ /* exec_statement */ /* parm_data_array */ /* default_error_message */ /* le_opaque_data */ /* row */ /* */ /* 返回 */ /* 成功 ....... 0 */ /* 失败 ....... 0 */ /*--------------------------------------------------------------------*/ int dtw_initialize(dtw_lei_t *le_interface) { return rc; } /*--------------------------------------------------------------------*/ /* */ /* 函数 */ /* dtw_execute */ /* */ /* 目的 */ /* */ /* 格式 */ /* int dtw_execute(dtw_lei_t *le_interface) */ /* */ /* 参数 */ /* le_interface 一个指向结构的指针,该结构中包含以下字段: */ /* */ /* function_name */ /* flags */ /* exec_statement */ /* parm_data_array */ /* default_error_message */ /* le_opaque_data */ /* row */ /* */ /* 返回 */ /* 成功 ....... 0 */ /* 失败 ....... 0 */ /*--------------------------------------------------------------------*/ int dtw_execute(dtw_lei_t *le_interface) { /*----------------------------------------------------------------*/ /* 确定是否指定了 %exec 语句。 */ /*----------------------------------------------------------------*/ if (le_interface->flags & DTW_STMT_EXEC) { /*------------------------------------------------------------*/ /* 分析 %exec 语句 */ /*------------------------------------------------------------*/ rc = processExecStmt(le_interface->exec_statement); if (rc) { } } else { /*------------------------------------------------------------*/ /* 分析在线数据 */ /*------------------------------------------------------------*/ rc = processInlineData(le_interface->exec_statement); if (rc) { } } /*----------------------------------------------------------------*/ /* 分析输入参数 */ /*----------------------------------------------------------------*/ rc = processInputParms(le_interface->parm_data_array); if (rc) { } /*----------------------------------------------------------------*/ /* 处理请求 */ /*----------------------------------------------------------------*/ rc = processRequest(); if (rc) { } /*----------------------------------------------------------------*/ /* 处理输出数据 */ /*----------------------------------------------------------------*/ rc = processOutputParms(le_interface->parm_data_array); if (rc) { } /*----------------------------------------------------------------*/ /* 处理返回码与缺省的错误消息 */ /*----------------------------------------------------------------*/ if (rc) { setErrorMessage(rc, &(le_interface->default_error_message)); } /*----------------------------------------------------------------*/ /* 清理并退出程序。 */ /*----------------------------------------------------------------*/ return rc; } /*--------------------------------------------------------------------*/ /* */ /* 函数 */ /* dtw_getNextRow */ /* */ /* 目的 */ /* */ /* 格式 */ /* int dtw_getNextRow(dtw_lei_t *le_interface) */ /* */ /* 参数 */ /* le_interface 一个指向结构的指针,该结构中包含以下字段: */ /* */ /* function_name */ /* flags */ /* exec_statement */ /* parm_data_array */ /* default_error_message */ /* le_opaque_data */ /* row */ /* */ /* 返回 */ /* 成功 ....... 0 */ /* 失败 ....... 0 */ /*--------------------------------------------------------------------*/ int dtw_getNextRow(dtw_lei_t *le_interface) { return rc; } /*--------------------------------------------------------------------*/ /* */ /* 函数 */ /* dtw_cleanup */ /* */ /* 目的 */ /* */ /* 格式 */ /* int dtw_cleanup(dtw_lei_t *le_interface) */ /* */ /* 参数 */ /* le_interface 一个指向结构的指针,该结构中包含以下字段: */ /* */ /* function_name */ /* flags */ /* exec_statement */ /* parm_data_array */ /* default_error_message */ /* le_opaque_data */ /* row */ /* */ /* 返回 */ /* 成功 ....... 0 */ /* 失败 ....... 0 */ /*--------------------------------------------------------------------*/ int dtw_cleanup(dtw_lei_t *le_interface) { /*----------------------------------------------------------------*/ /* 确定这是正常终止还是异常终止。 */ /*----------------------------------------------------------------*/ if (le_interface->flags & DTW_END_ABNORMAL) { /*------------------------------------------------------------*/ /* 执行异常终止清理。 */ /*------------------------------------------------------------*/ } else { /*------------------------------------------------------------*/ /* 执行正常终止清理。 */ /*------------------------------------------------------------*/ } return rc; } /*--------------------------------------------------------------------*/ /* */ /* 函数 */ /* processInputParms */ /* */ /* 目的 */ /* */ /* 格式 */ /* unsigned long processInputParms(dtw_parm_data_t *parm__data) */ /* */ /* 参数 */ /* dtw_parm_data_t *parm_data */ /* */ /* 返回 */ /* 成功 ..... 0 */ /* 失败 ..... */ /* */ /*--------------------------------------------------------------------*/ unsigned long processInputParms(dtw_parm_data_t *parm_data) { /*----------------------------------------------------------------*/ /* 在参数数据数组中的所有变量之间循环。 */ /* 数组以一个空条目终止,意为 parm_name 字段设置为 NULL, */ /* parm_value 字段设置为 NULL,parm_descriptor 字段设置为 0。 */ /* 但是,对于参数数据数组结尾唯一的有效检查是检查是否 */ /* parm_descriptor == 0,这是因为在将文字串传送进来的时侯 */ /* parm_name 字段为 NULL,而在将未声明的变量传送进来时 */ /* parm_value 字段被设置为 NULL。 */ /*----------------------------------------------------------------*/ for (; parm_data->parm_descriptor != 0; ++parm_data) { /*------------------------------------------------------------*/ /* 确定每个输入参数的用法。 */ /*------------------------------------------------------------*/ switch(parm_data->parm_descriptor & DTW_USAGE) { case(DTW_IN): /*----------------------------------------------------*/ /* 确定每个输入参数的类型。 */ /*----------------------------------------------------*/ switch (parm_data->parm_descriptor & DTW_TYPE) { case DTW_STRING: break; case DTW_TABLE: break; default: /*--------------------------------------------*/ /* 内部错误 - 未知的数据类型 */ /*--------------------------------------------*/ break; } break; case(DTW_OUT): break; case(DTW_INOUT): break; default: /*----------------------------------------------------*/ /* 内部错误 - 未知的用法 */ /*----------------------------------------------------*/ break; } } return rc; } /*--------------------------------------------------------------------*/ /* */ /* 函数 */ /* processOutputParms() */ /* */ /* 目的 */ /* */ /* 格式 */ /* unsigned long processOutputParms(dtw_parm_data_t *parm_data) */ /* */ /* 参数 */ /* dtw_parm_data_t *parm_data */ /* */ /* 返回 */ /* 成功 ........ 0 */ /* 失败 ........ -1 */ /* */ /*--------------------------------------------------------------------*/ unsigned long processOutputParms(dtw_parm_data_t *parm_data) { /*----------------------------------------------------------------*/ /* 以某种特定于语言环境的方式获取输出数据。 */ /* 这完全取决于和哪个语言环境进行连接以及 LE 选择如何与之连接。 */ /*----------------------------------------------------------------*/ / /*----------------------------------------------------------------*/ /* 在参数数据数组中的所有变量之间循环,查找输出参数。 */ /*----------------------------------------------------------------*/ for (; parm_data->parm_descriptor != 0; ++parm_data) { /*------------------------------------------------------------*/ /* 确定每个参数的用法。 */ /*------------------------------------------------------------*/ if (pd_i->parm_descriptor & DTW_OUT) { /*--------------------------------------------------------*/ /* 确定每个输入参数的类型。 */ /*--------------------------------------------------------*/ switch (pd_i->parm_descriptor & DTW_TYPE) { case DTW_STRING: /*------------------------------------------------*/ /* 给字符串参数一个新的值。如果目前参数值不为 */ /* NULL,则必须使用 LE 接口应用函数来释放存储 */ /* 器(如果它是由 Net.Data 分配的)。 */ /*------------------------------------------------*/ if (parm_data->parm_value != NULL) dtw_free(parm_data->parm_value); parm_data->parm_value = dtw_strdup(newValue); break; case DTW_TABLE: /*------------------------------------------------*/ /* 更改表格参数的大小。使用 LE 接口应用函数来 */ /* 修改表格对象。 */ /*------------------------------------------------*/ /*------------------------------------------------*/ /* 首先获取指向表格对象的指针。 */ /*------------------------------------------------*/ void *myTable = (void *) parm_data->parm_value; /*------------------------------------------------*/ /* 接下去获取表格当前的大小。 */ /*------------------------------------------------*/ cols = dtw_table_Cols(myTable); rows = dtw_table_Rows(myTable); /*------------------------------------------------*/ /* 现在来设置新的大小(假定新的大小值有效)。 */ /*------------------------------------------------*/ /*------------------------------------------------*/ /* 先设置列。 */ /*------------------------------------------------*/ if (cols > newColValue) { dtw_table_DeleteCol(myTable, newColValue + 1, cols - newColValue); } else if (cols < new_col_value) { dtw_table_InsertCol(myTable, cols, newColValue - cols); } /*------------------------------------------------*/ /* 现在设置行。 */ /*------------------------------------------------*/ if (newColValue > 0) { if (rows > newRowValue) { dtw_table_DeleteRow(myTable, newRowValue + 1, rows - newRowValue); } else if (rows < new_row_value) { dtw_table_InsertRow(myTable, rows, newRowValue - rows); } } /*------------------------------------------------*/ /* 现在获取最后一行/列的值。 */ /*------------------------------------------------*/ dtw_table_GetV(myTable, &myValue;, newRowValue, newColValue); /*------------------------------------------------*/ /* 删除最后一行/列的值。 */ /*------------------------------------------------*/ dtw_table_SetV(myTable, NULL, newRowValue, newColValue); /*------------------------------------------------*/ /* 设置最后一行/列的值。 */ /*------------------------------------------------*/ dtw_table_SetV(myTable, dtw_strdup(myNewValue), newRowValue, newColValue); break; default: /*------------------------------------------------*/ /* 内部错误 - 未知的数据类型 */ /*------------------------------------------------*/ break; } } } return 0; } /*--------------------------------------------------------------------*/ /* */ /* 函数 */ /* setErrorMessage() */ /* */ /* 目的 */ /* */ /* 格式 */ /* unsigned long setErrorMessage(int returnCode, */ /* char **defaultErrorMessage) */ /* */ /* 参数 */ /* int returnCode */ /* char **defaultErrorMessage */ /* */ /* 返回 */ /* 成功 ........ 0 */ /* 失败 ........ -1 */ /* */ /*--------------------------------------------------------------------*/ unsigned long setErrorMessage(int returnCode, char **defaultErrorMessage) { /*----------------------------------------------------------------*/ /* 根据返回码设置缺省的错误消息。 */ /*----------------------------------------------------------------*/ switch(returnCode) { case LE_SUCCESS: break; case LE_RC1: *defaultErrorMessage = dtw_strdup(LE_RC1_MESSAGE_TEXT); break; case LE_RC2: *defaultErrorMessage = dtw_strdup(LE_RC2_MESSAGE_TEXT); break; case LE_RC3: *defaultErrorMessage = dtw_strdup(LE_RC3_MESSAGE_TEXT); break; case LE_RC4: *defaultErrorMessage = dtw_strdup(LE_RC4_MESSAGE_TEXT); rc = LE_RC1INTERNAL; break; } return 0; } |