⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 oioic.c

📁 robot open source code
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -