📄 oioic.c
字号:
/**
*
* 文 件 名:oioic.c
*
* 描 述:OIOIC 的 .c 文件。
*
* 创 建 者:赵平智 <pervise.zhao@gmail.com>
*
* 创建日期:20050310
*
* 版 本:1.0.0
*
* 版权(C)2005 赵平智。保留所有权利。
*
* 备 注:
*
*
* * 维护历史 *
*
* <日期> <修改者>
* <修改内容...>
*
**/
#include <stdlib.h>
#include <string.h>
#include "oioic.h"
/*=====================+ Interface +=====================*/
/**
*
* 名称:OIOIC_Open
* 描述:Open接口。
* 参数:pCaller --- [IN] 来访者。
*/
static IRESULT OIOIC_Open(OBJECT* This, const VR* pCaller)
{
This->RefCnt++;
return IR_P;
}
/**
*
* 名称:OIOIC_Input
* 描述:Input接口。
* 参数:IStrm --- [IN] 输入流;
* Qty --- [IN] 输入的Byte数量;
* pCaller --- [IN] 来访者。
*/
static IRESULT OIOIC_Input(OBJECT* This, BYTE* IStrm, BYTKTY Qty, const VR* pCaller)
{
return IR_O_SBOOIX;
}
/**
*
* 名称:OIOIC_Output
* 描述:Output接口。
* 参数:OStrm --- [OUT] 输出流的流向;
* Cty --- [IN] OStrm所指存储空间的容量;
* pQty --- [OUT] 指向实际输出的Byte数量;
* pCaller --- [IN] 来访者。
*/
static IRESULT OIOIC_Output(OBJECT* This, BYTE* OStrm, BYTKTY Cty, BYTKTY* pQty, const VR* pCaller)
{
return IR_O_SBOOIX;
}
/**
*
* 名称:OIOIC_IOput
* 描述:IOput接口。
* 参数:IStrm --- [IN] 输入流;
* Qty --- [IN] 输入的Byte数量;
* OStrm --- [OUT] 输出流的流向;
* Cty --- [IN] OStrm所指存储空间的容量;
* pQty --- [OUT] 指向实际输出的Byte数量;
* pCaller --- [IN] 来访者。
*/
static IRESULT OIOIC_IOput(struct TAG_OBJECT* This, BYTE* IStrm, BYTKTY Qty, BYTE* OStrm, BYTKTY Cty, BYTKTY* pQty, const VR* pCaller)
{
return IR_O_SBOOIX;
}
/**
*
* 名称:OIOIC_Interact0
* 描述:Interact0接口。
* 参数:Act --- [IN] 交互行为;
* pCaller --- [IN] 来访者。
*/
static IRESULT OIOIC_Interact0(OBJECT* This, ACTION Act, const VR* pCaller)
{
EM_OIOIC* pem = (EM_OIOIC*)This->pEM;
switch( Act )
{
case ASK_SHARED: /* 问共享么。*/
if(pem->mds & MOD_SHARED)
return IR_N;
return IR_P;
case SET_SHARED: /* 设置共享。*/
pem->mds &= ~MOD_SHARED;
return IR_P;
case SET_UNSHARED: /* 设置非共享。*/
pem->mds |= MOD_SHARED;
return IR_P;
case SET_BLOCKI: /* 设置阻断输入。*/
pem->mds &= ~MOD_BLOCKI;
return IR_P;
case SET_UNBLOCKI: /* 设置非阻断输入。*/
pem->mds |= MOD_BLOCKI;
return IR_P;
case SET_BLOCKO: /* 设置阻断输出。*/
pem->mds &= ~MOD_BLOCKO;
return IR_P;
case SET_UNBLOCKO: /* 设置非阻断输出。*/
pem->mds |= MOD_BLOCKO;
return IR_P;
case CMD_RESET: /* 重置。*/
pem->IQ.Front = pem->IQ.Rear = pem->IQ.Dtrm - 1;
pem->IQ.Qty = pem->IQ.Lost = 0;
pem->OQ.Front = pem->OQ.Rear = pem->OQ.Dtrm - 1;
pem->OQ.Qty = pem->OQ.Lost = 0;
return IR_P;
default:
break;
}
return IR_O_SBOOIX;
}
/**
*
* 名称:OIOIC_Interact1
* 描述:Interact1接口。
* 参数:Act --- [IN] 交互行为;
* OStrm --- [OUT] 输出流的流向;
* Cty --- [IN] OStrm所指存储空间的容量;
* pQty --- [OUT] 指向实际输出的Byte数量;
* pCaller --- [IN] 来访者。
*/
static IRESULT OIOIC_Interact1(OBJECT* This, ACTION Act, BYTE* OStrm, BYTKTY Cty, BYTKTY* pQty, const VR* pCaller)
{
EM_OIOIC* pem = (EM_OIOIC*)(This->pEM);
switch( Act )
{
case GET_IQCTY: /* 获取IQ容量。*/
if(Cty >= sizeof(BYTKTY))
{
*((BYTKTY*)OStrm) = pem->IQ.Cty;
*pQty = sizeof(BYTKTY);
return IR_P;
}else{ return IR_N; }
case GET_OQCTY: /* 获取OQ容量。*/
if(Cty >= sizeof(BYTKTY))
{
*((BYTKTY*)OStrm) = pem->OQ.Cty;
*pQty = sizeof(BYTKTY);
return IR_P;
}else{ return IR_N; }
default:
break;
}
return IR_O_SBOOIX;
}
/**
*
* 名称:OIOIC_Interact2
* 描述:Interact2接口。
* 参数:Act --- [IN] 交互行为;
* IStrm --- [IN] 输入流;
* Qty --- [IN] 输入的Byte数量;
* pCaller --- [IN] 来访者。
*/
static IRESULT OIOIC_Interact2(OBJECT* This, ACTION Act, BYTE* IStrm, BYTKTY Qty, const VR* pCaller)
{
EM_OIOIC* pem = (EM_OIOIC*)(This->pEM);
switch( Act )
{
case SET_IQCTY: /* 设置IQ容量。*/
if(sizeof(BYTKTY) == Qty)
{
if(pem->IQ.Dtrm != NULL)
free(pem->IQ.Dtrm);
pem->IQ.Dtrm = (BYTE*)calloc(*((BYTKTY*)IStrm), 1);
if( pem->IQ.Dtrm != NULL )
{
pem->IQ.Front = pem->IQ.Rear = pem->IQ.Dtrm - 1;
pem->IQ.Cty = *((BYTKTY*)IStrm);
pem->IQ.Qty = pem->IQ.Lost = 0;
return IR_P;
}else { return IR_N; }
}else{ return IR_N; }
case SET_OQCTY: /* 设置OQ容量。*/
if(sizeof(BYTKTY) == Qty)
{
if(pem->OQ.Dtrm != NULL)
free(pem->OQ.Dtrm);
pem->OQ.Dtrm = (BYTE*)calloc(*((BYTKTY*)IStrm), 1);
if( pem->OQ.Dtrm != NULL )
{
pem->OQ.Front = pem->OQ.Rear = pem->OQ.Dtrm - 1;
pem->OQ.Cty = *((BYTKTY*)IStrm);
pem->OQ.Qty = pem->OQ.Lost = 0;
return IR_P;
}else { return IR_N; }
}else{ return IR_N; }
default:
break;
}
return IR_O_SBOOIX;
}
/**
*
* 名称:OIOIC_Interact3
* 描述:Interact3接口。
* 参数:Act --- [IN] 交互行为;
* IStrm --- [IN] 输入流;
* Qty --- [IN] 输入的Byte数量;
* OStrm --- [OUT] 输出流的流向;
* Cty --- [IN] OStrm所指存储空间的容量;
* pQty --- [OUT] 指向实际输出的Byte数量;
* pCaller --- [IN] 来访者。
*/
static IRESULT OIOIC_Interact3(OBJECT* This, ACTION Act, BYTE* IStrm, BYTKTY Qty, BYTE* OStrm, BYTKTY Cty, BYTKTY* pQty, const VR* pCaller)
{
return IR_O_SBOOIX;
}
/**
*
* 名称:OIOIC_Close
* 描述:Close接口。
* 参数:pCaller --- [IN] 来访者。
*/
static IRESULT OIOIC_Close(OBJECT* This, const VR* pCaller)
{
This->RefCnt--;
return IR_P;
}
/*========================+ TOG +========================*/
/**
*
* 名称:TOG_OIOIC
*/
VOID TOG_OIOIC(OBJECT* pObj)
{
pObj->Open = OIOIC_Open;
pObj->Input = OIOIC_Input;
pObj->Output = OIOIC_Output;
pObj->IOput = OIOIC_IOput;
pObj->Interact0 = OIOIC_Interact0;
pObj->Interact1 = OIOIC_Interact1;
pObj->Interact2 = OIOIC_Interact2;
pObj->Interact3 = OIOIC_Interact3;
pObj->Close = OIOIC_Close;
}
/*=============+ InitAIBofND & InitABNofND +=============*/
/* 注:InitAIBofND,InitABNofND只由CRT函数调用。*/
/**
*
* 名称:InitAIBofND
* 描述:初始化ND的AIB。
* 参数:pND --- [IN] ND指针;
* pMsn --- [IN] IB的MSN数组;
* nib --- [IN] pMsn所指数组的元素个数,即IB的数量。
* 备注:1. 只由CRT函数调用。
* 2. 注意,pMsn所指数组元素的排序决定了IB的访问顺序。
*/
VOID InitAIBofND(OBJECT* pND, MLDSN* pMsn, NUMIB nib)
{
NUMND i;
NUMIB j;
pND->NIB = nib;
while(nib)
{
j = pND->NIB-nib;
for(i=1; i<pND->NND; i++)
{
if( *(pMsn+j) == (pND->po_AND+i)->MSN)
{
*(pND->ppo_AIB+j) = pND->po_AND+i;
break;
}
}
nib--;
}
}
/**
*
* 名称:InitABNofND
* 描述:初始化ND的ABN。
* 参数:pND --- [IN] ND指针;
* pMsn --- [IN] BN的MSN数组;
* nbn --- [IN] pMsn所指数组的元素个数,即BN的数量。
* 备注:只由CRT函数调用。
*/
VOID InitABNofND(OBJECT* pND, MLDSN* pMsn, NUMBN nbn)
{
NUMND i;
NUMBN j;
pND->NBN = nbn;
while(nbn)
{
j = pND->NBN-nbn;
for(i=1; i<pND->NND; i++)
{
if( *(pMsn+j) == (pND->po_AND+i)->MSN)
{
*(pND->ppo_ABN+j) = pND->po_AND+i;
break;
}
}
nbn--;
}
}
/*=============+ CallerCome & CallerLeave +==============*/
/* 注:不允许外面使用 CallerCome 和 CallerLeave。*/
/**
*
* 名称:CallerCome
* 描述:来访者来访,登记来访记录。
* 参数:pND --- [IN] ND地址;
* pCaller --- [IN] 来访者。
* 备注:不允许外面使用。
*/
FRESULT CallerCome(OBJECT* pND, const VR* pCaller)
{
NUMCS i;
VR* pVR;
/* 先检查有没有这个VR。 */
for(i=0; i<pND->NCS; i++)
{
pVR = pND->pvr_ACS+i;
if((pVR->cr == pCaller->cr) && (pVR->mr == pCaller->mr))
return FR_N_HASVR; /* 已经有这个VR了。*/
}
/* 加上这个VR。 */
for(i=0; i<pND->NCS; i++)
{
pVR = pND->pvr_ACS+i;
if( 0 == pVR->cr )
{
*pVR = *pCaller;
return FR_P;
}
}
return FR_N;
}
/**
*
* 名称:CallerLeave
* 描述:来访者离开,清除来访记录。
* 参数:pND --- [IN] ND地址;
* pCaller --- [IN] 来访者。
* 备注:不允许外面使用。
*/
FRESULT CallerLeave(OBJECT* pND, const VR* pCaller)
{
NUMBN i;
NUMCS j;
VR* pVR;
/* 首先ND的BN */
for(i=0; i<pND->NBN; i++)
{
for(j=0; j<(*(pND->ppo_ABN+i))->NCS; j++)
{
pVR = (*(pND->ppo_ABN+i))->pvr_ACS+j;
if((pVR->cr == pCaller->cr) && (pVR->mr == pCaller->mr))
pVR->cr = pVR->mr = 0;
}
}
/* 然后ND自己 */
for(j=0; j<pND->NCS; j++)
{
pVR = pND->pvr_ACS+j;
if((pVR->cr == pCaller->cr) && (pVR->mr == pCaller->mr))
pVR->cr = pVR->mr = 0;
}
return FR_P;
}
/*==================+ Enqueue & Dequeue +================*/
/**
*
* 名称:Enqueue
* 描述:向指定的队列入列指定数量的Byte。
* 参数:IData --- [IN] 入列数据;
* Qty --- [IN] 入列的Byte数量。
*/
FRESULT Enqueue(QUEUE* pq, BYTE* IData, BYTKTY Qty)
{
BYTE* newRear; /* 入列成功后pq->Rear应该所处的位置。*/
BYTKTY ctyFree, qtyEnq;
if( NULL == pq || NULL == IData )
{
return FR_N_INVALIDARG;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -