LIBGOBLIN_API_SYSTEM
int LibGoblin_Term( void );
+#ifdef DRD64_SRC_LIBGOBLIN_PROGINFO
+ #define LIBGOBLIN_API_PROGINFO
+#else
+ #define LIBGOBLIN_API_PROGINFO extern
+#endif
+LIBGOBLIN_API_PROGINFO
+ int LibGoblin_AllocProgInfo( void );
+LIBGOBLIN_API_PROGINFO
+ int LibGoblin_FreeProgInfo( int i_pgid );
+
#ifdef DRD64_SRC_LIBGOBLIN_BINFO
#define LIBGOBLIN_API_BINFO
#else
TEST_HEADER = test_libgoblin.h
TEST_OBJS = test_libgoblin.o \
test_libgoblin_system.o \
+ test_libgoblin_proginfo.o \
test_libgoblin_binfo.o \
test_libgoblin_readbin.o \
test_libgoblin_symwork.o
$(CC) -c -o test_libgoblin_binfo.o \
$(FLAGS_DEBUG) $(FLAGS_COMPILE) $(TEST_FLAGS_COMPILE) \
test_libgoblin_binfo.c
+test_libgoblin_proginfo.o: test_libgoblin_proginfo.c $(HEADER) $(TEST_HEADER)
+ $(CC) -c -o test_libgoblin_proginfo.o \
+ $(FLAGS_DEBUG) $(FLAGS_COMPILE) $(TEST_FLAGS_COMPILE) \
+ test_libgoblin_proginfo.c
test_libgoblin_readbin.o: test_libgoblin_readbin.c $(HEADER) $(TEST_HEADER)
$(CC) -c -o test_libgoblin_readbin.o \
$(FLAGS_DEBUG) $(FLAGS_COMPILE) $(TEST_FLAGS_COMPILE) \
/*----------------------------------------------------------------------
----------------------------------------------------------------------*/
LIBGOBLIN_PROGINFO_EXTERN
+LibGoblin_ProgramInfo *
+ LibGoblin_ProgInfo_GetProgInfo(
+ int i_pgid )
+{
+ if(( gi_max_program_info <= i_pgid ) || ( 0 > i_pgid ))
+ { return NULL; }
+
+ if( -0x01 == PGINFO( i_pgid )->i_id )
+ { return NULL; }
+
+ return PGINFO( i_pgid );
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+void
+ LibGoblin_ProgInfo_ClearProgInfo(
+ LibGoblin_ProgramInfo *p_pginfo )
+{
+ assert( NULL != p_pginfo );
+
+ memset( p_pginfo, 0x00, sizeof( LibGoblin_ProgramInfo ) );
+
+ p_pginfo->i_id = -0x01;
+
+ return;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+LIBGOBLIN_PROGINFO_EXTERN
+LibGoblin_ProgramInfo *
+ LibGoblin_ProgInfo_AllocProgInfo(
+ void )
+{
+ int i_cnt;
+ int i_id_now = -0x01;
+ LibGoblin_ProgramInfo *p_pginfo = NULL;
+ LibGoblin_ProgramInfo *p_pgbase;
+
+ if( gi_now_program_info < gi_max_program_info ) {
+ for( i_cnt = 0; i_cnt < gi_max_program_info; i_cnt++ ) {
+ if( -0x01 == PGINFO( i_cnt )->i_id ) {
+ p_pginfo = PGINFO( i_cnt );
+ i_id_now = i_cnt;
+ gi_now_program_info++;
+ goto goto_LibGoblin_ProgInfo_AllocProgInfo_post;
+ }
+ }
+ }
+
+ if( gi_now_program_info == gi_alloc_program_info ) {
+ p_pgbase = (LibGoblin_ProgramInfo *)realloc( gp_program_info,
+ sizeof( LibGoblin_ProgramInfo ) *
+ ( gi_alloc_program_info + LIBGOBLIN_PROGINFO_UNITS ) );
+ if( NULL == p_pgbase ) {
+ goto goto_LibGoblin_ProgInfo_AllocProgInfo_post;
+ }
+
+ gp_program_info = p_pgbase;
+ gi_alloc_program_info += LIBGOBLIN_PROGINFO_UNITS;
+
+ }
+
+ p_pginfo = PGINFO( gi_now_program_info );
+ i_id_now = gi_now_program_info++;
+
+ if( i_id_now == gi_max_program_info ) { gi_max_program_info++; }
+
+goto_LibGoblin_ProgInfo_AllocProgInfo_post:
+ return p_pginfo;
+}
+
+
+/***********************************************************************
+***********************************************************************/
+LIBGOBLIN_API_PROGINFO
+int
+ LibGoblin_AllocProgInfo(
+ void )
+{
+ LibGoblin_ProgramInfo *p_pginfo = NULL;
+
+ p_pginfo = LibGoblin_ProgInfo_AllocProgInfo();
+ if( NULL == p_pginfo ) {
+ return -0x01;
+ }
+
+ return p_pginfo->i_id;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+LIBGOBLIN_PROGINFO_EXTERN
+int
+ LibGoblin_ProgInfo_FreeProgInfo(
+ LibGoblin_ProgramInfo *p_pginfo )
+{
+ int i_id;
+
+ assert( NULL != p_pginfo );
+
+ i_id = p_pginfo->i_id;
+ LibGoblin_ProgInfo_ClearProgInfo( p_pginfo );
+
+ if( gi_max_program_info == (i_id + 1) )
+ { gi_max_program_info--; }
+
+ gi_now_program_info--;
+ if( 0 == gi_now_program_info ) { gi_max_program_info = 0; }
+
+ return 0x00;
+}
+
+
+/***********************************************************************
+***********************************************************************/
+LIBGOBLIN_API_PROGINFO
+int
+ LibGoblin_FreeProgInfo(
+ int i_pgid )
+{
+ int i_result;
+ LibGoblin_ProgramInfo *p_pginfo;
+
+ p_pginfo = LibGoblin_ProgInfo_GetProgInfo( i_pgid );
+ if( NULL == p_pginfo ) {
+ return -0x01;
+ }
+
+ i_result = LibGoblin_ProgInfo_FreeProgInfo( p_pginfo );
+ if( 0x00 != i_result ) {
+ return -0x02;
+ }
+
+ return 0x00;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+LIBGOBLIN_PROGINFO_EXTERN
int
LibGoblin_ProgInfo_Init(
void )
for( i_cnt = 0; i_cnt < LIBGOBLIN_PROGINFO_UNITS; i_cnt++ ) {
p_pginfo = PGINFO( i_cnt );
- // Clear pginfo
+ LibGoblin_ProgInfo_ClearProgInfo( p_pginfo );
}
gi_alloc_program_info = LIBGOBLIN_PROGINFO_UNITS;
#define LIBGOBLIN_PROGINFO_INTERNALFUNC
#endif
-#define LIBGOBLIN_PROGINFO_UNITS 8
+#define LIBGOBLIN_PROGINFO_UNITS 8
+#define LIBGOBLIN_PROGINFO_MAX_BINFO 128
#ifdef DRD64_SRC_LIBGOBLIN_PROGINFO
LibGoblin_ProgramInfo *gp_program_info = NULL;
#define PGINFO(n) ((LibGoblin_ProgramInfo *)(gp_program_info + (n)))
-
+LIBGOBLIN_PROGINFO_EXTERN
+ LibGoblin_ProgramInfo *LibGoblin_ProgInfo_GetProgInfo( int i_pgid );
+LIBGOBLIN_PROGINFO_EXTERN
+ LibGoblin_ProgramInfo *LibGoblin_ProgInfo_AllocProgInfo( void );
+LIBGOBLIN_PROGINFO_EXTERN
+ int LibGoblin_ProgInfo_FreeProgInfo( LibGoblin_ProgramInfo *p_pginfo );
LIBGOBLIN_PROGINFO_EXTERN
int LibGoblin_ProgInfo_Init( void );
LIBGOBLIN_PROGINFO_EXTERN
int LibGoblin_ProgInfo_Term( void );
+#ifdef LIBGOBLIN_PROGINFO_INTERNALFUNC
+void LibGoblin_ProgInfo_ClearProgInfo( LibGoblin_ProgramInfo *p_pginfo );
+
+#endif
#endif /* DRD64_HEADER_XXX */
#include"drd64_libgoblin.h"
+#define LiBGOBLIN_PROGINFO_MAX_BINFO 128
#define LIBGOBLIN_BINFO_TYPE_NONE 0x00
#define LIBGOBLIN_BINFO_TYPE_ELF 0x01
/*=====================================================================*/
typedef struct {
+
+ int i_id;
+
int i_num_binfo;
- int i_alloc_binfo;
- LibGoblin_BinaryInfo *p_binfo;
+ LibGoblin_BinaryInfo *p_binfo[LiBGOBLIN_PROGINFO_MAX_BINFO];
} LibGoblin_ProgramInfo;
Test_LibGoblin_System();
Test_LibGoblin_BinInfo();
+ Test_LibGoblin_ProgInfo();
Test_LibGoblin_ReadBinary();
Test_LibGoblin_SymWork();
#endif
DRD64_TEST_LIBGOBLIN_BINFO_EXTERN int Test_LibGoblin_BinInfo( void );
+#ifdef DRD64_SRC_TEST_LIBGOBLIN_PROGINFO
+ #define DRD64_TEST_LIBGOBLIN_PROGINFO_EXTERN
+#else
+ #define DRD64_TEST_LIBGOBLIN_PROGINFO_EXTERN extern
+#endif
+DRD64_TEST_LIBGOBLIN_PROGINFO_EXTERN int Test_LibGoblin_ProgInfo( void );
+
#ifdef DRD64_SRC_TEST_LIBGOBLIN_READBINARY
#define DRD64_TEST_LIBGOBLIN_READBINARY_EXTERN
#else
--- /dev/null
+/*DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64
+
+ D r . D e a m o n 6 4
+ for INTEL64(R), AMD64(R)
+
+ Copyright(C) 2007-2009 Koine Yuusuke(koinec). All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY Koine Yuusuke(koinec) ``AS IS'' AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL Koine Yuusuke(koinec) OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+OF THE POSSIBILITY OF SUCH DAMAGE.
+
+DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64*/
+
+/* File Info -----------------------------------------------------------
+File: drd64_.c
+Function:
+Comment:
+----------------------------------------------------------------------*/
+
+#define DRD64_SRC_TEST_LIBGOBLIN_PROGINFO
+#include"drd64_libgoblin.h"
+#include"test_libgoblin.h"
+
+
+/* LibGoblin_ProgInfo_AllocProgInfo() & FreeProgInfo() *******************/
+/*--------------------------------------------------------------------*/
+void Test_LibGoblin_ProgInfo_AllocFree_test00_001( void )
+{
+ int i_bid;
+ int i_result;
+
+ i_result = LibGoblin_ProgInfo_Init();
+ CU_ASSERT( 0x00 == i_result );
+
+ i_bid = LibGoblin_AllocProgInfo();
+ CU_ASSERT( 0x00 == i_bid );
+
+ i_result = LibGoblin_FreeProgInfo( i_bid );
+ CU_ASSERT( 0x00 == i_result );
+
+ i_result = LibGoblin_ProgInfo_Term();
+ CU_ASSERT( 0x00 == i_result );
+
+ return;
+}
+
+
+/*--------------------------------------------------------------------*/
+void Test_LibGoblin_ProgInfo_AllocFree_test00_002( void )
+{
+ int i_cnt;
+ int i_bid;
+ int i_result;
+
+ i_result = LibGoblin_ProgInfo_Init();
+ CU_ASSERT( 0x00 == i_result );
+
+ for( i_cnt = 0; i_cnt < 33; i_cnt++ ) {
+ i_bid = LibGoblin_AllocProgInfo();
+ CU_ASSERT( i_cnt == i_bid );
+ }
+
+ for( i_cnt = 0; i_cnt < 8; i_cnt++ ) {
+ i_result = LibGoblin_FreeProgInfo( i_cnt );
+ CU_ASSERT( 0x00 == i_result );
+ }
+
+ for( i_cnt = 0; i_cnt < 8; i_cnt++ ) {
+ i_bid = LibGoblin_AllocProgInfo();
+ CU_ASSERT( i_cnt == i_bid );
+ }
+
+ for( i_cnt = 0; i_cnt < 33; i_cnt++ ) {
+ i_result = LibGoblin_FreeProgInfo( i_cnt );
+ CU_ASSERT( 0x00 == i_result );
+ }
+
+ i_result = LibGoblin_FreeProgInfo( i_cnt );
+ CU_ASSERT( 0x00 != i_result );
+
+ i_result = LibGoblin_FreeProgInfo( 0 );
+ CU_ASSERT( 0x00 != i_result );
+
+ i_result = LibGoblin_ProgInfo_Term();
+ CU_ASSERT( 0x00 == i_result );
+
+ return;
+}
+
+
+/* LibGoblin_ProgInfo_Init() & Term() **********************************/
+/*--------------------------------------------------------------------*/
+void Test_LibGoblin_ProgInfo_InitTerm_test00_001( void )
+{
+ int i_result;
+
+ i_result = LibGoblin_ProgInfo_Init();
+ CU_ASSERT( 0x00 == i_result );
+
+ i_result = LibGoblin_ProgInfo_Term();
+ CU_ASSERT( 0x00 == i_result );
+
+ return;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+DRD64_TEST_LIBGOBLIN_PROGINFO_EXTERN
+int
+ Test_LibGoblin_ProgInfo(
+ void )
+{
+ CU_pSuite pt_goblin;
+
+ pt_goblin = CU_add_suite( "LibGoblin_ProgramInfo", NULL, NULL );
+
+ CU_add_test( pt_goblin, "LibGoblin_ProgInfo_InitTerm_test00_001",
+ Test_LibGoblin_ProgInfo_InitTerm_test00_001 );
+ CU_add_test( pt_goblin, "LibGoblin_ProgInfo_AllocFree_test00_001",
+ Test_LibGoblin_ProgInfo_AllocFree_test00_001 );
+ CU_add_test( pt_goblin, "LibGoblin_ProgInfo_AllocFree_test00_002",
+ Test_LibGoblin_ProgInfo_AllocFree_test00_002 );
+
+
+ return 0x00;
+}
+
+
+/* EOF of drd64_.c ----------------------------------- */