{
assert( NULL != p_pginfo );
- if(( p_pginfo->i_max_objinfo <= i_oid ) || ( 0 > i_oid ))
+ if(( p_pginfo->objinfo.i_maxid <= i_oid ) || ( 0 > i_oid ))
{ return NULL; }
return OBJINFO(p_pginfo, i_oid);
i_id_now = -1;
// Search Non-used ObjectInfo ---
- if( p_pginfo->i_now_objinfo < p_pginfo->i_max_objinfo ) {
- for( i_cnt = 0; i_cnt < p_pginfo->i_max_objinfo; i_cnt++ ) {
+ if( p_pginfo->objinfo.i_used < p_pginfo->objinfo.i_maxid ) {
+ for( i_cnt = 0; i_cnt < p_pginfo->objinfo.i_maxid; i_cnt++ ) {
if( -1 == OBJINFO(p_pginfo, i_cnt)->i_id ) {
p_objinfo_now = OBJINFO(p_pginfo, i_cnt);
i_id_now = i_cnt;
- p_pginfo->i_now_objinfo++;
+ p_pginfo->objinfo.i_used++;
break;
}
}
}
- else if( p_pginfo->i_now_objinfo == p_pginfo->i_alloc_objinfo ) {
+ else if( p_pginfo->objinfo.i_used == p_pginfo->objinfo.i_alloced ) {
- p_objinfo_base = realloc( p_pginfo->p_objinfo,
+ p_objinfo_base = realloc( p_pginfo->objinfo.p_objinfo,
sizeof( LibGoblin_ObjectInfo ) *
- (p_pginfo->i_alloc_objinfo + LIBGOBLIN_OBJINFO_UNITS) );
+ (p_pginfo->objinfo.i_alloced + LIBGOBLIN_OBJINFO_UNITS) );
if( NULL == p_objinfo_base ) {
return NULL;
}
- for( i_cnt = p_pginfo->i_alloc_objinfo;
- i_cnt < (p_pginfo->i_alloc_objinfo + LIBGOBLIN_OBJINFO_UNITS); i_cnt++ ) {
+ for( i_cnt = p_pginfo->objinfo.i_alloced;
+ i_cnt < (p_pginfo->objinfo.i_alloced + LIBGOBLIN_OBJINFO_UNITS); i_cnt++ ) {
ObjectInfo_ClearObjectInfo( p_objinfo_base + i_cnt );
}
- p_pginfo->p_objinfo = p_objinfo_base;
- p_pginfo->i_alloc_objinfo += LIBGOBLIN_OBJINFO_UNITS;
+ p_pginfo->objinfo.p_objinfo = p_objinfo_base;
+ p_pginfo->objinfo.i_alloced += LIBGOBLIN_OBJINFO_UNITS;
- p_objinfo_now = OBJINFO(p_pginfo, p_pginfo->i_now_objinfo);
- i_id_now = p_pginfo->i_now_objinfo++;
+ p_objinfo_now = OBJINFO(p_pginfo, p_pginfo->objinfo.i_used);
+ i_id_now = p_pginfo->objinfo.i_used++;
- if( i_id_now == p_pginfo->i_max_objinfo )
- { p_pginfo->i_max_objinfo++; }
+ if( i_id_now == p_pginfo->objinfo.i_maxid )
+ { p_pginfo->objinfo.i_maxid++; }
}
else {
- p_objinfo_now = OBJINFO(p_pginfo, p_pginfo->i_now_objinfo);
- i_id_now = p_pginfo->i_now_objinfo++;
-
- if( i_id_now == p_pginfo->i_max_objinfo )
- { p_pginfo->i_max_objinfo++; }
+ p_objinfo_now = OBJINFO(p_pginfo, p_pginfo->objinfo.i_used);
+ i_id_now = p_pginfo->objinfo.i_used++;
+ if( i_id_now == p_pginfo->objinfo.i_maxid )
+ { p_pginfo->objinfo.i_maxid++; }
}
assert( NULL != p_objinfo_now );
/*----------------------------------------------------------------------
----------------------------------------------------------------------*/
+int
+ ObjectInfo_CreateMasterObject(
+ LibGoblin_ProgramInfo *p_pginfo )
+{
+ LibGoblin_ObjectInfo *p_objinfo;
+
+ if( NO_OBJ != p_pginfo->objinfo.i_topid ) { return 0x00; }
+
+ p_objinfo = ObjectInfo_AllocObjectInfo( p_pginfo );
+ if( NULL == p_objinfo ) {
+ return 0x01;
+ }
+
+ p_objinfo->ptr_address = 0x0000000000000000;
+ p_objinfo->qw_size = 0xffffffffffffffff;
+
+ p_pginfo->objinfo.i_topid = p_objinfo->i_id;
+
+ return 0x00;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
LIBGOBLIN_OBJINFO_EXTERN
LibGoblin_ObjectInfo *
ObjectInfo_InsetObject(
LibGoblin_ObjectInfo *p_parent,
Byte b_mode )
{
- LibGoblin_ObjectInfo *p_objinfo;
+ int i_result = 0x00;
+ LibGoblin_ObjectInfo *p_objinfo = NULL;
LibGoblin_ObjectInfo *p_objnow;
LibGoblin_ObjectInfo *p_objprev;
LibGoblin_ObjectInfo *p_objover;
- QWord qw_range;
+ // Inset Master ObjectInfo when don't exist Master ObjectInfo.
+ if( NO_OBJ == p_pginfo->objinfo.i_topid ) {
+ i_result = ObjectInfo_CreateMasterObject( p_pginfo );
+ if( 0x00 != i_result ) {
+ goto goto_ObjectInfo_InsetObject_post;
+ }
+ }
+
+ if( NULL == p_parent )
+ { p_parent = OBJINFO( p_pginfo, p_pginfo->objinfo.i_topid ); }
+ assert( NULL != p_parent );
+
// Alloc ObjectInfo ---
p_objinfo = ObjectInfo_AllocObjectInfo( p_pginfo );
if( NULL == p_objinfo ) {
- goto goto_ObjectInfo_InsetObject_post;
- }
- ObjectInfo_ClearObjectInfo( p_objinfo );
-
- // Ptn1: First ObjectInfo ---
- // ( ProgramInfo->i_top_objinfo == NO_OBJ )
- // & ( p_parent == NULL )
- if( NO_OBJ == p_pginfo->i_top_objinfo ) {
- assert( NULL == p_parent );
- p_pginfo->i_top_objinfo = p_objinfo->i_id;
+ i_result = -0x01;
goto goto_ObjectInfo_InsetObject_post;
}
- p_objnow = OBJINFO( p_pginfo, p_pginfo->i_top_objinfo );
+ // Search ObjectInfo Inset Location. (Address Order)---
+ p_objnow = OBJINFO( p_pginfo, p_pginfo->objinfo.i_topid );
assert( NULL != p_objnow );
- qw_range = 0xffffffffffffffff;
- p_objover = NULL;
+ p_objover = p_objnow;
p_objprev = NULL;
do {
if(( p_objnow->ptr_address <= ptr_address )
&& ( (ptr_address + qw_size) <= (p_objnow->ptr_address + p_objnow->qw_size) )) {
- if( p_objnow->qw_size <= qw_range ) {
- p_objover = p_objnow;
- qw_range = p_objnow->qw_size;
- }
+ if( p_objnow->qw_size <= p_objover->qw_size ) { p_objover = p_objnow; }
}
if( ptr_address == p_objnow->ptr_address ) {
? OBJINFO( p_pginfo, p_objnow->addrlink.i_next_id ) : NULL );
}while( NULL != p_objnow );
- // Link Address Order ---
+ // Set Address Order Link Info.---
p_objinfo->addrlink.i_next_id = ((NULL != p_objnow) ? p_objnow->i_id : NO_OBJ);
p_objinfo->addrlink.i_prev_id = ((NULL != p_objprev) ? p_objprev->i_id : NO_OBJ);
if( NULL != p_objnow ) { p_objnow->addrlink.i_prev_id = p_objinfo->i_id; }
// Link Family Order ---
- if( NULL == p_parent ) {
- if( 0x00 != b_mode ) {
- if( NULL != p_objover ) { p_parent = p_objover; }
- }
+ if( 0x00 != b_mode ) {
+ if( NULL != p_objover ) { p_parent = p_objover; }
}
- if( NULL != p_parent ) {
- if( NO_OBJ == p_parent->grplink.i_child_topid ) {
- p_parent->grplink.i_child_topid = p_objinfo->i_id;
- p_objinfo->grplink.i_parent_id = p_parent->i_id;
+ if( NO_OBJ == p_parent->grplink.i_child_topid ) {
+ p_parent->grplink.i_child_topid = p_objinfo->i_id;
+ p_objinfo->grplink.i_parent_id = p_parent->i_id;
+ goto goto_ObjectInfo_InsetObject_post;
+ }
+
+ p_objnow = ((NO_OBJ != p_parent->grplink.i_child_topid)
+ ? OBJINFO( p_pginfo, p_parent->grplink.i_child_topid ) : NULL );
+ p_objprev = NULL;
+ do {
+ if( ptr_address == p_objnow->ptr_address ) {
+ if( qw_size > p_objnow->qw_size ) { break; }
}
- else {
- p_objnow = ((NO_OBJ != p_parent->grplink.i_child_topid)
- ? OBJINFO( p_pginfo, p_parent->grplink.i_child_topid ) : NULL );
- p_objprev = NULL;
- do {
- if( ptr_address == p_objnow->ptr_address ) {
- if( qw_size > p_objnow->qw_size ) { break; }
- }
- else if( ptr_address < p_objnow->ptr_address ) { break; }
+ else if( ptr_address < p_objnow->ptr_address ) { break; }
- p_objprev = p_objnow;
- p_objnow = ((NO_OBJ != p_objnow->grplink.i_next_id)
+ p_objprev = p_objnow;
+ p_objnow = ((NO_OBJ != p_objnow->grplink.i_next_id)
? OBJINFO( p_pginfo, p_objnow->grplink.i_next_id ) : NULL );
- }while( NULL != p_objnow );
+ }while( NULL != p_objnow );
- p_objinfo->grplink.i_next_id = ((NULL != p_objnow) ? p_objnow->i_id : NO_OBJ);
- p_objinfo->grplink.i_prev_id = ((NULL != p_objprev) ? p_objprev->i_id : NO_OBJ);
+ p_objinfo->grplink.i_next_id = ((NULL != p_objnow) ? p_objnow->i_id : NO_OBJ);
+ p_objinfo->grplink.i_prev_id = ((NULL != p_objprev) ? p_objprev->i_id : NO_OBJ);
- if( NULL != p_objprev ) { p_objprev->grplink.i_next_id = p_objinfo->i_id; }
- if( NULL != p_objnow ) { p_objnow->grplink.i_prev_id = p_objinfo->i_id; }
- }
- }
+ if( NULL != p_objprev ) { p_objprev->grplink.i_next_id = p_objinfo->i_id; }
+ if( NULL != p_objnow ) { p_objnow->grplink.i_prev_id = p_objinfo->i_id; }
goto_ObjectInfo_InsetObject_post:
return p_objinfo;
i_objid = p_objinfo->i_id;
ObjectInfo_ClearObjectInfo( p_objinfo );
- if( p_pginfo->i_max_objinfo == (i_objid + 1) )
- { p_pginfo->i_max_objinfo--; }
- p_pginfo->i_now_objinfo--;
- if( 0 == p_pginfo->i_now_objinfo )
- { p_pginfo->i_max_objinfo = 0; }
+ if( p_pginfo->objinfo.i_maxid == (i_objid + 1) )
+ { p_pginfo->objinfo.i_maxid--; }
+ p_pginfo->objinfo.i_used--;
+ if( 0 == p_pginfo->objinfo.i_used )
+ { p_pginfo->objinfo.i_maxid = 0; }
return 0x00;
}
LibGoblin_ObjectInfo *p_child;
LibGoblin_ObjectInfo *p_objnow;
+ // Check p_objinfo is Master ObjectInfo?
+ if(( 0 == p_objinfo->i_id ) && ( 1 < p_pginfo->objinfo.i_used )) {
+ return -0x01;
+ }
+
// UnLink Group Order Link ---
if( 0x00 != b_mode ) {
while( NO_OBJ != p_objinfo->grplink.i_child_topid ) {
if( NULL != p_prev ) { p_prev->addrlink.i_next_id = p_objinfo->addrlink.i_next_id; }
if( NULL != p_next ) { p_prev->addrlink.i_prev_id = p_objinfo->addrlink.i_prev_id; }
+ if( p_pginfo->objinfo.i_topid == p_objinfo->i_id ) {
+ if( NO_OBJ != p_objinfo->addrlink.i_next_id ) {
+ p_next = OBJINFO(p_pginfo, p_objinfo->addrlink.i_next_id);
+ p_pginfo->objinfo.i_topid = p_next->i_id;
+ }
+ else
+ { p_pginfo->objinfo.i_topid = NO_OBJ; }
+ }
+
// Free ObjectInfo ---
ObjectInfo_FreeObjectInfo( p_pginfo, p_objinfo );
assert( NULL != p_pginfo );
- if( 0 != p_pginfo->i_max_objinfo ) {
+ if( 0 != p_pginfo->objinfo.i_maxid ) {
return NO_OBJ;
}
else
{ i_items = (( i_init_objnums / LIBGOBLIN_OBJINFO_UNITS ) + 2) * LIBGOBLIN_OBJINFO_UNITS; }
- p_pginfo->p_objinfo = malloc( sizeof( LibGoblin_ObjectInfo ) * i_items );
- if( NULL == p_pginfo->p_objinfo ) {
+ p_pginfo->objinfo.p_objinfo = malloc( sizeof( LibGoblin_ObjectInfo ) * i_items );
+ if( NULL == p_pginfo->objinfo.p_objinfo ) {
return -0x02;
}
ObjectInfo_ClearObjectInfo( p_objinfo );
}
- p_pginfo->i_alloc_objinfo = LIBGOBLIN_OBJINFO_UNITS;
- p_pginfo->i_max_objinfo = 0;
- p_pginfo->i_now_objinfo = 0;
+ p_pginfo->objinfo.i_alloced = i_items;
+ p_pginfo->objinfo.i_maxid = 0;
+ p_pginfo->objinfo.i_used = 0;
+ p_pginfo->objinfo.i_topid = NO_OBJ;
return 0x00;
}
assert( NULL != p_pginfo );
- if( 0 < p_pginfo->i_now_objinfo ) {
- for( ; p_pginfo->i_now_objinfo >= 0; p_pginfo->i_now_objinfo-- ) {
- p_objinfo = OBJINFO(p_pginfo, p_pginfo->i_now_objinfo);
+ if( 0 < p_pginfo->objinfo.i_used ) {
+ for( ; p_pginfo->objinfo.i_used >= 0; p_pginfo->objinfo.i_used-- ) {
+ p_objinfo = OBJINFO(p_pginfo, p_pginfo->objinfo.i_used);
ObjectInfo_FreeObjectInfo( p_pginfo, p_objinfo );
}
}
- free( p_pginfo->p_objinfo );
+ free( p_pginfo->objinfo.p_objinfo );
- p_pginfo->p_objinfo = NULL;
- p_pginfo->i_alloc_objinfo = 0;
- p_pginfo->i_max_objinfo = 0;
- p_pginfo->i_now_objinfo = 0;
+ p_pginfo->objinfo.p_objinfo = NULL;
+ p_pginfo->objinfo.i_alloced = 0;
+ p_pginfo->objinfo.i_maxid = 0;
+ p_pginfo->objinfo.i_used = 0;
+ p_pginfo->objinfo.i_topid = NO_OBJ;
return 0x00;
}
/* BinaryInfo_AllocBinInfo() & FreeBinInfo() **************************/
/*--------------------------------------------------------------------*/
+void Test_ObjectInfo_InsetDelete_test00_001(
+ LibGoblin_ProgramInfo *p_pginfo )
+{
+ LibGoblin_ObjectInfo *p_objinfo;
+
+ p_objinfo = ObjectInfo_InsetObject( p_pginfo, 0x00000000, 0x00100000, NULL, 0x00 );
+ CU_ASSERT( NULL != p_objinfo );
+ CU_ASSERT( 1 == p_objinfo->i_id );
+ CU_ASSERT( 0 == p_pginfo->objinfo.i_topid );
+
+ ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo, 0x00 );
+ CU_ASSERT( 0 == p_pginfo->objinfo.i_topid );
+
+ return;
+}
+
+/*--------------------------------------------------------------------*/
+void Test_ObjectInfo_InsetDelete_test00( void )
+{
+ int i_result;
+ LibGoblin_ProgramInfo *p_pginfo;
+
+ // Init ----
+ i_result = ProgInfo_Init();
+ CU_ASSERT( 0x00 == i_result );
+
+ p_pginfo = ProgInfo_AllocProgInfo();
+ CU_ASSERT( NULL != p_pginfo );
+
+ i_result = ObjectInfo_Init( p_pginfo, 0 );
+ CU_ASSERT( 0x00 == i_result );
+
+ // Alloc Test ---
+ Test_ObjectInfo_InsetDelete_test00_001( p_pginfo );
+
+ // Term ---
+ i_result = ObjectInfo_Term( p_pginfo );
+ CU_ASSERT( 0x00 == i_result );
+
+ i_result = ProgInfo_FreeProgInfo( p_pginfo );
+ CU_ASSERT( 0x00 == i_result );
+
+ i_result = ProgInfo_Term();
+ CU_ASSERT( 0x00 == i_result );
+
+ return;
+}
+
+
+/* BinaryInfo_AllocBinInfo() & FreeBinInfo() **************************/
+/*--------------------------------------------------------------------*/
void Test_ObjectInfo_AllocFree_test00_001( void )
{
int i_result;
int i_cnt;
int i_max;
+ int i_used;
LibGoblin_ProgramInfo *p_pginfo;
- LibGoblin_BinaryInfo *p_binfo;
LibGoblin_ObjectInfo *p_objinfo;
// Init ----
p_pginfo = ProgInfo_AllocProgInfo();
CU_ASSERT( NULL != p_pginfo );
+ i_max = (LIBGOBLIN_OBJINFO_UNITS * LIBGOBLIN_OBJINFO_INITALLOCRATE);
+
i_result = ObjectInfo_Init( p_pginfo, 0 );
CU_ASSERT( 0x00 == i_result );
+ CU_ASSERT( i_max == p_pginfo->objinfo.i_alloced );
// Alloc Test ---
- i_max = (LIBGOBLIN_OBJINFO_UNITS * LIBGOBLIN_OBJINFO_INITALLOCRATE) + 1;
for( i_cnt = 0; i_cnt <= i_max; i_cnt++ ) {
p_objinfo = ObjectInfo_AllocObjectInfo( p_pginfo );
CU_ASSERT( NULL != p_objinfo );
- CU_ASSERT( p_objinfo->i_id == i_cnt );
+ CU_ASSERT( i_cnt == p_objinfo->i_id );
+ CU_ASSERT( (i_cnt + 1) == p_pginfo->objinfo.i_maxid );
+ CU_ASSERT( (i_cnt + 1) == p_pginfo->objinfo.i_used );
}
+ CU_ASSERT( (i_max + LIBGOBLIN_OBJINFO_UNITS) == p_pginfo->objinfo.i_alloced );
+ i_used = i_max + 1;
for( i_cnt = (i_max / 2); i_cnt >= 0; i_cnt-- ) {
p_objinfo = ObjectInfo_GetObjectInfo( p_pginfo, i_cnt );
CU_ASSERT( NULL != p_objinfo );
+ CU_ASSERT( i_cnt == p_objinfo->i_id );
i_result = ObjectInfo_FreeObjectInfo( p_pginfo, p_objinfo );
CU_ASSERT( 0x00 == i_result );
+ i_used--;
+ CU_ASSERT( (i_max + 1) == p_pginfo->objinfo.i_maxid );
+ CU_ASSERT( i_used == p_pginfo->objinfo.i_used );
}
+ CU_ASSERT( (i_max + LIBGOBLIN_OBJINFO_UNITS) == p_pginfo->objinfo.i_alloced );
for( i_cnt = 0; i_cnt <= (i_max/2); i_cnt++ ) {
p_objinfo = ObjectInfo_AllocObjectInfo( p_pginfo );
CU_ASSERT( NULL != p_objinfo );
CU_ASSERT( p_objinfo->i_id == i_cnt );
+ CU_ASSERT( (i_max + 1) == p_pginfo->objinfo.i_maxid );
+ i_used++;
+ CU_ASSERT( i_used == p_pginfo->objinfo.i_used );
}
+ CU_ASSERT( (i_max + LIBGOBLIN_OBJINFO_UNITS) == p_pginfo->objinfo.i_alloced );
for( i_cnt = i_max; i_cnt >= 0; i_cnt-- ) {
p_objinfo = ObjectInfo_GetObjectInfo( p_pginfo, i_cnt );
CU_ASSERT( NULL != p_objinfo );
+ CU_ASSERT( i_cnt == p_objinfo->i_id );
i_result = ObjectInfo_FreeObjectInfo( p_pginfo, p_objinfo );
CU_ASSERT( 0x00 == i_result );
+ i_used--;
+ CU_ASSERT( i_used == p_pginfo->objinfo.i_maxid );
+ CU_ASSERT( i_used == p_pginfo->objinfo.i_used );
}
+ CU_ASSERT( (i_max + LIBGOBLIN_OBJINFO_UNITS) == p_pginfo->objinfo.i_alloced );
// Term ---
i_result = ObjectInfo_Term( p_pginfo );
i_result = ProgInfo_Term();
CU_ASSERT( 0x00 == i_result );
-
- return;
-}
-
-
-/*--------------------------------------------------------------------*/
-void Test_ObjectInfo_AllocFree_test00_002( void )
-{
-/*
- int i_result;
- int i_cnt;
- int i_parent_bid;
- char str_fname[50];
- LibGoblin_ProgramInfo *p_pginfo;
- LibGoblin_BinaryInfo *p_binfo;
-
- i_result = ProgInfo_Init();
- CU_ASSERT( 0x00 == i_result );
-
- i_result = BinaryInfo_Init();
- CU_ASSERT( 0x00 == i_result );
-
- p_pginfo = ProgInfo_AllocProgInfo();
- CU_ASSERT( NULL != p_pginfo );
-
- p_binfo = BinaryInfo_AllocBinInfo( p_pginfo, "testprog", -1 );
- CU_ASSERT( NULL != p_binfo );
- CU_ASSERT( 0 == p_binfo->i_id );
- i_parent_bid = p_binfo->i_id;
-
- for( i_cnt = 1; i_cnt < (8 * 8); i_cnt++ ) {
- sprintf( str_fname, "file%02d", i_cnt );
- p_binfo = BinaryInfo_AllocBinInfo( p_pginfo, str_fname, i_parent_bid );
- CU_ASSERT( NULL != p_binfo );
- CU_ASSERT( i_cnt == p_binfo->i_id );
-
- //printf(" debug: %p (%02d)\n", p_binfo, p_binfo->i_id );
- }
-
- for( i_cnt = (8 * 8); i_cnt > 0; i_cnt-- ) {
- p_binfo = BinaryInfo_GetBinInfo( i_cnt - 1 );
- i_result = BinaryInfo_FreeBinInfo( p_binfo );
- CU_ASSERT( 0x00 == i_result );
- }
-
- i_result = ProgInfo_FreeProgInfo( p_pginfo );
- CU_ASSERT( 0x00 == i_result );
-
- i_result = BinaryInfo_Term();
- CU_ASSERT( 0x00 == i_result );
-
- i_result = ProgInfo_Term();
- CU_ASSERT( 0x00 == i_result );
-*/
return;
}
{
int i_result;
LibGoblin_ProgramInfo *p_pginfo;
- LibGoblin_BinaryInfo *p_binfo;
i_result = ProgInfo_Init();
CU_ASSERT( 0x00 == i_result );
Test_ObjectInfo_InitTerm_test00_001 );
CU_add_test( pt_goblin, "ObjectInfo_AllocFree_test00_001",
Test_ObjectInfo_AllocFree_test00_001 );
+ CU_add_test( pt_goblin, "ObjectInfo_InsetDelete_test00",
+ Test_ObjectInfo_InsetDelete_test00 );
return 0x00;
}