使用这个模板来创建您自己的语言环境。
/**********************************************************************/ /* */ /* 文件名 */ /* */ /* 说明 */ /* */ /* 功能 */ /* */ /* 入口点 */ /* */ /* 更改活动性 */ /* */ /* 标志 原因 日期 开发者 说明 */ /* ------ ---------- -------- ------------ ---------------------- */ /* */ /**********************************************************************/ /*--------------------------------------------------------------------*/ /* 包含文件 */ /*--------------------------------------------------------------------*/ #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;
}
|