📄 oioic.c
字号:
ctyFree = pq->Cty - pq->Qty;
qtyEnq = (ctyFree > Qty) ? Qty : ctyFree;
if( 0 == qtyEnq )
return FR_O_VAINLY;
newRear = pq->Dtrm + (pq->Rear + qtyEnq - pq->Dtrm ) % pq->Cty;
if(newRear > pq->Rear) /* 如果入列成功,pq->Rear不须循环?*/
{
memcpy(pq->Rear+1, IData, qtyEnq);
}else /* 如果入列成功,pq->Rear须循环。*/
{
BYTKTY qty1, qty2;
qty1 = pq->Dtrm + pq->Cty - pq->Rear - 1;
if(qty1 > 0)
memcpy(pq->Rear+1, IData, qty1);
qty2 = qtyEnq - qty1;
memcpy(pq->Dtrm, IData + qty1, qty2);
}
pq->Rear = newRear;
pq->Qty += qtyEnq;
if(pq->Dtrm-1 == pq->Front)
pq->Front = pq->Dtrm;
if(ctyFree < Qty)
{
pq->Lost = Qty - ctyFree; /* 丢失了 Qty - ctyFree 个Byte !*/
return FR_N_LOST;
}
return FR_P;
}
/**
*
* 名称:Dequeue
* 描述:从指定队列出列Byte。
* 参数:OData --- [OUT] 出列数据的存储位置;
* Cty --- [IN] OData所指存储空间的容量;
* pQty --- [OUT] 指向实际出列的Byte数量。
*/
FRESULT Dequeue(QUEUE* pq, BYTE* OData, BYTKTY Cty, BYTKTY* pQty)
{
BYTE* newFront; /* 出列成功后pq->Front应该所处的位置。*/
BYTKTY qtyDeq; /* 实际出列数据量。*/
if(NULL == pq || NULL == OData || 0 == Cty || NULL == pQty)
{
return FR_N_INVALIDARG;
}
*pQty = 0; /* 先将出列数置0。*/
if( pq->Qty != 0 )
{
qtyDeq = (Cty > pq->Qty) ? pq->Qty : Cty;
newFront = pq->Dtrm + (pq->Front + qtyDeq - pq->Dtrm) % pq->Cty;
if(newFront > pq->Front) /* 出列后,pq->Front不须循环? */
{
memcpy(OData, pq->Front, qtyDeq);
}else /* 出列后,pq->Front须循环。*/
{
BYTKTY qty1, qty2;
qty1 = pq->Dtrm + pq->Cty - pq->Front;
qty2 = qtyDeq - qty1;
memcpy(OData, pq->Front, qty1);
memcpy(OData + qty1, pq->Dtrm, qty2);
}
pq->Qty -= qtyDeq;
if(0 == pq->Qty)
pq->Front = pq->Rear = pq->Dtrm -1;
else
pq->Front = newFront;
}else
{
return FR_O_VAINLY;
}
*pQty = qtyDeq;
if(pq->Lost > 0)
{
pq->Lost = 0;
return FR_N_LOST;
}
return FR_P;
}
/*=================+ GetBN & GetEMofBN +=================*/
/**
*
* 名称:GetBN
* 描述:获取指定的BN地址。
* 参数:pND --- [IN] ND指针;
* msn --- [IN] BN的M;
* 返回:BN的指针。
*/
OBJECT* GetBN(OBJECT* pND, MLDSN msn)
{
NUMBN i;
for(i=0; i<pND->NBN; i++)
{
if( msn == (*(pND->ppo_ABN+i))->MSN )
return *(pND->ppo_ABN+i);
}
return NULL; /* 没有这个BN。*/
}
/**
*
* 名称:GetEMofBN
* 描述:获取指定的BN的EM地址。
* 参数:pND --- [IN] ND指针;
* msn --- [IN] BN的M;
* 返回:EM的指针。
*/
EM* GetEMofBN(OBJECT* pND, MLDSN msn)
{
NUMBN i;
for(i=0; i<pND->NBN; i++)
{
if( msn == (*(pND->ppo_ABN+i))->MSN )
return (*(pND->ppo_ABN+i))->pEM;
}
return NULL;
}
/*===================+ GetIQ & GetOQ +===================*/
/**
*
* 名称:GetIQ
* 描述:获取节点的IQ指针。
* 参数:pND --- [IN] 节点指针。
* 返回:IQ的指针。
*/
QUEUE* GetIQ(OBJECT* pND)
{
NUMBN i;
for(i=0; i<pND->NBN; i++)
{
if( MSN_OIOIC == (*(pND->ppo_ABN+i))->MSN )
return &((EM_OIOIC*)((*(pND->ppo_ABN+i))->pEM))->IQ;
}
return NULL;
}
/**
*
* 名称:GetOQ
* 描述:获取节点的OQ指针。
* 参数:pND --- [IN] 节点指针。
* 返回:OQ的指针。
*/
QUEUE* GetOQ(OBJECT* pND)
{
NUMBN i;
for(i=0; i<pND->NBN; i++)
{
if( MSN_OIOIC == (*(pND->ppo_ABN+i))->MSN )
return &((EM_OIOIC*)((*(pND->ppo_ABN+i))->pEM))->OQ;
}
return NULL;
}
/*==================+ 非内联VO函数 +===================*/
/* 注:内联VO函数和非内联VO函数的功能是完全相同的。*/
#if INLINE_VOFUNCTION == 0
/**
*
* 名称:VO_Open
* 描述:接口Open的VO函数。
* 参数:pObject --- [IN] 指向对象;
* pCaller --- [IN] 来访者。
*/
IRESULT VO_Open(OBJECT* pObject, const VR* pCaller)
{
IRESULT ir = IR_O;
if( 0 == pCaller->cr || 0 == pCaller->mr )
return IR_N_INVALIDARG;
if( FR_P == CallerCome(pObject, pCaller) )
{
ir = pObject->Open(pObject, pCaller);
CallerLeave(pObject, pCaller);
}else { ir = IR_N; }
return ir;
}
/**
*
* 名称:VO_Input
* 描述:接口Input的VO函数。
* 参数:pObject --- [IN] 指向对象;
* IStrm --- [IN] 输入流;
* Qty --- [IN] 输入的Byte数量;
* pCaller --- [IN] 来访者。
*/
IRESULT VO_Input(OBJECT* pObject, BYTE* IStrm, BYTKTY Qty, const VR* pCaller)
{
IRESULT ir = IR_O;
if( NULL == IStrm || 0 == Qty || 0 == pCaller->cr || 0 == pCaller->mr )
return IR_N_INVALIDARG;
if( FR_P == CallerCome(pObject, pCaller) )
{
ir = pObject->Input(pObject, IStrm, Qty, pCaller);
CallerLeave(pObject, pCaller);
}else { ir = IR_N; }
return ir;
}
/**
*
* 名称:VO_Output
* 描述:接口Output的VO函数。
* 参数:pObject --- [IN] 指向对象;
* OStrm --- [OUT] 输出流的流向;
* Cty --- [IN] OStrm所指存储空间的容量;
* pQty --- [OUT] 指向实际输出的Byte数量;
* pCaller --- [IN] 来访者。
*/
IRESULT VO_Output(OBJECT* pObject, BYTE* OStrm, BYTKTY Cty, BYTKTY* pQty, const VR* pCaller)
{
IRESULT ir = IR_O;
if( NULL == OStrm || 0 == Cty || NULL == pQty || 0 == pCaller->cr || 0 == pCaller->mr )
return IR_N_INVALIDARG;
*pQty = 0;
if( FR_P == CallerCome(pObject, pCaller) )
{
ir = pObject->Output(pObject, OStrm, Cty, pQty, pCaller);
CallerLeave(pObject, pCaller);
}else { ir = IR_N; }
return ir;
}
/**
*
* 名称:VO_IOput
* 描述:接口IOput的VO函数。
* 参数:IStrm --- [IN] 输入流;
* Qty --- [IN] 输入的Byte数量;
* OStrm --- [OUT] 输出流的流向;
* Cty --- [IN] OStrm所指存储空间的容量;
* pQty --- [OUT] 指向实际输出的Byte数量;
* pCaller --- [IN] 来访者。
*/
IRESULT VO_IOput(OBJECT* pObject, BYTE* IStrm, BYTKTY Qty, BYTE* OStrm, BYTKTY Cty, BYTKTY* pQty, const VR* pCaller)
{
IRESULT ir = IR_O;
if( NULL == IStrm || 0 == Qty || NULL == OStrm || 0 == Cty || NULL == pQty || 0 == pCaller->cr || 0 == pCaller->mr )
return IR_N_INVALIDARG;
*pQty = 0;
if( FR_P == CallerCome(pObject, pCaller) )
{
ir = pObject->IOput(pObject, IStrm, Qty, OStrm, Cty, pQty, pCaller);
CallerLeave(pObject, pCaller);
}else { ir = IR_N; }
return ir;
}
/**
*
* 名称:VO_Interact0
* 描述:接口Interact0的VO函数。
* 参数:pObject --- [IN] 指向对象;
* Act --- [IN] 交互行为;
* pCaller --- [IN] 来访者。
*/
IRESULT VO_Interact0(OBJECT* pObject, ACTION Act, const VR* pCaller)
{
IRESULT ir = IR_O;
if( (MSKAC & Act) != AC0 || 0 == pCaller->cr || 0 == pCaller->mr )
return IR_N_INVALIDARG;
if( FR_P == CallerCome(pObject, pCaller) )
{
ir = pObject->Interact0(pObject, Act, pCaller);
CallerLeave(pObject, pCaller);
}else { ir = IR_N; }
return ir;
}
/**
*
* 名称:VO_Interact1
* 描述:接口Interact1的VO函数。
* 参数:pObject --- [IN] 指向对象;
* Act --- [IN] 交互行为;
* OStrm --- [OUT] 输出流的流向;
* Cty --- [IN] OStrm所指存储空间的容量;
* pQty --- [OUT] 指向实际输出的Byte数量;
* pCaller --- [IN] 来访者。
*/
IRESULT VO_Interact1(OBJECT* pObject, ACTION Act, BYTE* OStrm, BYTKTY Cty, BYTKTY* pQty, const VR* pCaller)
{
IRESULT ir = IR_O;
if( (MSKAC & Act) != AC1 || NULL == OStrm || 0 == Cty || NULL == pQty || 0 == pCaller->cr || 0 == pCaller->mr )
return IR_N_INVALIDARG;
*pQty = 0;
if( FR_P == CallerCome(pObject, pCaller) )
{
ir = pObject->Interact1(pObject, Act, OStrm, Cty, pQty, pCaller);
CallerLeave(pObject, pCaller);
}else { ir = IR_N; }
return ir;
}
/**
*
* 名称:VO_Interact2
* 描述:接口Interact2的VO函数。
* 参数:pObject --- [IN] 指向对象;
* Act --- [IN] 交互行为;
* IStrm --- [IN] 输入流;
* Qty --- [IN] 输入的Byte数量;
* pCaller --- [IN] 来访者。
*/
IRESULT VO_Interact2(OBJECT* pObject, ACTION Act, BYTE* IStrm, BYTKTY Qty, const VR* pCaller)
{
IRESULT ir = IR_O;
if( (MSKAC & Act) != AC2 || NULL == IStrm || 0 == Qty || 0 == pCaller->cr || 0 == pCaller->mr )
return IR_N_INVALIDARG;
if( FR_P == CallerCome(pObject, pCaller) )
{
ir = pObject->Interact2(pObject, Act, IStrm, Qty, pCaller);
CallerLeave(pObject, pCaller);
}else { ir = IR_N; }
return ir;
}
/**
*
* 名称:VO_Interact3
* 描述:接口Interact3的VO函数。
* 参数:pObject --- [IN] 指向对象;
* Act --- [IN] 交互行为;
* IStrm --- [IN] 输入流;
* Qty --- [IN] 输入的Byte数量;
* OStrm --- [OUT] 输出流的流向;
* Cty --- [IN] OStrm所指存储空间的容量;
* pQty --- [OUT] 指向实际输出的Byte数量;
* pCaller --- [IN] 来访者。
*/
IRESULT VO_Interact3(OBJECT* pObject, ACTION Act, BYTE* IStrm, BYTKTY Qty, BYTE* OStrm, BYTKTY Cty, BYTKTY* pQty, const VR* pCaller)
{
IRESULT ir = IR_O;
if( (MSKAC & Act) != AC3 || NULL == IStrm || 0 == Qty || NULL == OStrm || 0 == Cty || NULL == pQty || 0 == pCaller->cr || 0 == pCaller->mr )
return IR_N_INVALIDARG;
*pQty = 0;
if( FR_P == CallerCome(pObject, pCaller) )
{
ir = pObject->Interact3(pObject, Act, IStrm, Qty, OStrm, Cty, pQty, pCaller);
CallerLeave(pObject, pCaller);
}else { ir = IR_N; }
return ir;
}
/**
*
* 名称:VO_Close
* 描述:接口Close的VO函数。
* 参数:pObject --- [IN] 指向对象;
* pCaller --- [IN] 来访者。
*/
IRESULT VO_Close(OBJECT* pObject, const VR* pCaller)
{
IRESULT ir = IR_O;
if( 0 == pCaller->cr || 0 == pCaller->mr )
return IR_N_INVALIDARG;
if( FR_P == CallerCome(pObject, pCaller) )
{
ir = pObject->Close(pObject, pCaller);
CallerLeave(pObject, pCaller);
}else { ir = IR_N; }
return ir;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -