?? ho.c
字號:
/**
*
* 文 件 名:ho.c
*
* 描 述:
*
* 創 建 者:
*
* 創建日期:
*
* 備 注:
*
*
* * 維護歷史 *
*
* <日期> <修改者>
* <修改內容...>
*
**/
#include <stdlib.h>
#include <memory.h>
#include "ho.h"
/*====================+ Definition +=====================*/
/*
*
* 名稱:DOID
* 描述:記錄已銷毀對象的OID。
* 備注:DOID,Destroyed Object's ID。
*/
typedef struct TAG_DOID
{
MLDSN msn;
OBJID oid;
}DOID;
/*
*
* 名稱:TARRDOID
* 描述:DOID數組結構體。
*/
typedef struct TAG_ARRDOID
{
SI32 neo; /* 存在的對象個數,即沒有銷毀的對象個數。eo - existent object */
DOID* pad; /* 指向元素類型為DOID的數組,這個數組動態分配。ad - the array of DOID */
SI32 lad; /* pad所指數組的空間長度,以元素為單位。lad - the length of array of DOID */
SI32 nwe; /* pad所指數組中已填寫過的元素個數。nwe - the number of written element */
OBJID oid; /* 傳給CRT函數的OID。*/
}TARRDOID;
/*
*
* 名稱:STP_GLAD
* 描述:宏,DOID數組空間增長步長,以數組元素為單位。
* 備注:STP - step,LAD - the length of array of DOID,GLAD - the growth of LAD。
*/
#define STP_GLAD 10
/*====================+ Variable(s) +====================*/
static TARRDOID gs_tad = {0, NULL, 0, 0, OID_};
/*=================+ __CreateObject__ +==================*/
/**
*
* 名稱:__CreateObject__
* 描述:創建對象。
* 參數:Msn --- [IN] 模序號,指定創建哪個模的對象;
* IQCty --- [IN] 輸入隊列緩沖;
* OQCty --- [IN] 輸出隊列緩沖;
* NumCR --- [IN] 來訪者數量;
* ppObj --- [OUT] 輸出創建的對象;
* pExotic --- [IN] 在外面為IC分配的空間,適用于創建靜態對象(如函數內的局部對象)。
* 返回:成功返回P結果,失敗返回N結果。
* 備注:1. NumCR必須大于0;
* 2. ppObj和pExotic不能都為NULL或非NULL;
* 3. 如果pExotic不是NULL,表示IC空間已在外面分配好了。
*/
FRESULT __CreateObject__(MLDSN Msn, BYTKTY IQCty, BYTKTY OQCty, SI32 NumCR, OBJECT** ppObj, BYTE* pExotic)
{
/* extern FRESULT CRT_xxx(OBJID* pOID, BYTKTY IQCty, BYTKTY OQCty, SI32 NumCR, OBJECT** ppObj, BYTE* pExotic); */
extern FRESULT CRT_car(OBJID* pOID, BYTKTY IQCty, BYTKTY OQCty, SI32 NumCR, OBJECT** ppObj, BYTE* pExotic);
FRESULT fr;
OBJID oidbak;
EM_OIOIC* pem;
SI32 idd; /* DOID的指標。idd - the index of DOID */
if((NumCR < 1) || (NULL == ppObj && NULL == pExotic) || (ppObj != NULL && pExotic != NULL))
return FR_N_INVALIDARG;
oidbak = gs_tad.oid;
for(idd = 0; idd < gs_tad.nwe; idd++)
{
if((Msn == (gs_tad.pad+idd)->msn) && ((gs_tad.pad+idd)->oid != 0))
{
gs_tad.oid = (gs_tad.pad+idd)->oid;
break;
}
}
switch(Msn)
{
/*case MSN_XXX:
* fr = CRT_xxx(&gs_tad.oid, IQCty, OQCty, NumCR, ppObj, pExotic);
* break;*/
case MSN_CAR:
fr = CRT_car(&gs_tad.oid, IQCty, OQCty, NumCR, ppObj, pExotic);
break;
default:
fr = FR_N;
break;
}
if(!NFR(fr))
{
if(idd < gs_tad.nwe)
{
gs_tad.oid = oidbak;
(gs_tad.pad+idd)->oid = 0;
}else if((MSKSO & gs_tad.oid) < (MSKSO & oidbak))
{
gs_tad.oid = oidbak;
pem = (EM_OIOIC*)GetEMofBN(*ppObj, MSN_OIOIC);
if(pem->IQ.Dtrm != NULL)
free(pem->IQ.Dtrm);
if(pem->OQ.Dtrm != NULL)
free(pem->OQ.Dtrm);
if(NULL == pExotic)
{
free(*ppObj);
*ppObj = NULL;
}
return FR_N_LACKOID;
}
gs_tad.neo++;
}else
{
gs_tad.oid = oidbak;
}
return fr;
}
/*=================+ __DestroyObject__ +=================*/
/*
*
* 名稱:__DestroyObject__
* 描述:銷毀對象。
* 參數:pObj --- [IN] 指向對象。
* 返回:TRUE - 成功,FALSE - 失敗。
* 備注:靜態對象(如函數內的局部對象)也須用此函數銷毀。
*/
BOOL __DestroyObject__(OBJECT* pObj)
{
DOID* ptr;
SI32 idd; /* DOID的指標。idd - the index of DOID */
EM_OIOIC* pem;
if(NULL == pObj)
return FALSE;
pem = (EM_OIOIC*)GetEMofBN(pObj, MSN_OIOIC);
if(NULL == gs_tad.pad)
{
if(gs_tad.neo-1 > 0)
{
gs_tad.pad = (DOID*)calloc(STP_GLAD, sizeof(DOID));
if(NULL == gs_tad.pad)
return FALSE;
gs_tad.pad->msn = pObj->MSN;
gs_tad.pad->oid = pObj->OID;
gs_tad.lad = STP_GLAD;
gs_tad.nwe = 1;
}else if(0 == gs_tad.neo-1)
{
gs_tad.oid = OID_;
}else
{
return FALSE;
}
}else
{
for(idd = 0; idd < gs_tad.nwe; idd++)
{
if((pObj->MSN == (gs_tad.pad+idd)->msn) && (0 == (gs_tad.pad+idd)->oid))
{
(gs_tad.pad+idd)->oid = pObj->OID;
break;
}
}
if(idd == gs_tad.nwe)
{
if(idd == gs_tad.lad)
{
ptr = (DOID*)calloc(gs_tad.lad + STP_GLAD, sizeof(DOID));
if(NULL == ptr)
return FALSE;
memcpy(ptr, gs_tad.pad, gs_tad.nwe*sizeof(DOID));
free(gs_tad.pad);
gs_tad.pad = ptr;
gs_tad.lad += STP_GLAD;
}
(gs_tad.pad+gs_tad.nwe)->msn = pObj->MSN;
(gs_tad.pad+gs_tad.nwe)->oid = pObj->OID;
gs_tad.nwe++;
}
}
if(pem->IQ.Dtrm != NULL)
free(pem->IQ.Dtrm);
if(pem->OQ.Dtrm != NULL)
free(pem->OQ.Dtrm);
gs_tad.neo--;
if(gs_tad.pad != NULL && 0 == gs_tad.neo)
{
free(gs_tad.pad);
gs_tad.pad = NULL;
gs_tad.lad = 0;
gs_tad.nwe = 0;
gs_tad.oid = OID_;
}
return TRUE;
}
/*=============+ Global object pointer(s) +==============*/
OBJECT* g_pCar = NULL;
/* ... */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -