OSDN Git Service

* CreateFile: test_libgoblin_proginfo.c (for Testing drd64_libgoblin_proginfo.[ch] )
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Mon, 11 Jan 2016 05:10:03 +0000 (14:10 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Mon, 11 Jan 2016 05:10:03 +0000 (14:10 +0900)
include/libgoblin.h
libgoblin/Makefile
libgoblin/drd64_libgoblin_proginfo.c
libgoblin/drd64_libgoblin_proginfo.h
libgoblin/drd64_libgoblin_type.h
libgoblin/test_libgoblin.c
libgoblin/test_libgoblin.h
libgoblin/test_libgoblin_proginfo.c [new file with mode: 0644]

index ba213ee..6eb79f6 100644 (file)
@@ -58,6 +58,16 @@ LIBGOBLIN_API_SYSTEM
 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
index d3a30f9..9198c71 100644 (file)
@@ -99,6 +99,7 @@ TEST_TARGET = test_libgoblin
 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
@@ -199,6 +200,10 @@ test_libgoblin_binfo.o: test_libgoblin_binfo.c $(HEADER) $(TEST_HEADER)
        $(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) \
index cf2b5a5..8654d6f 100644 (file)
@@ -40,6 +40,151 @@ Comment:
 /*----------------------------------------------------------------------
 ----------------------------------------------------------------------*/
 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 )
@@ -59,7 +204,7 @@ int
 
        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;
index 4a307f2..ffcf242 100644 (file)
@@ -49,7 +49,8 @@ Comment:
        #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;
@@ -60,13 +61,22 @@ int                                         gi_now_program_info             = 0;
 
 #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 */
 
index b994ddb..0f6d494 100644 (file)
@@ -39,6 +39,7 @@ Comment:
 
 #include"drd64_libgoblin.h"
 
+#define        LiBGOBLIN_PROGINFO_MAX_BINFO    128
 
 #define        LIBGOBLIN_BINFO_TYPE_NONE               0x00
 #define        LIBGOBLIN_BINFO_TYPE_ELF                0x01
@@ -146,9 +147,11 @@ typedef struct     {
 
 /*=====================================================================*/
 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;
 
index c79acf0..a7d63ee 100644 (file)
@@ -51,6 +51,7 @@ int
 
        Test_LibGoblin_System();
        Test_LibGoblin_BinInfo();
+       Test_LibGoblin_ProgInfo();
        Test_LibGoblin_ReadBinary();
        Test_LibGoblin_SymWork();
 
index 87a6247..a2aed2d 100644 (file)
@@ -55,6 +55,13 @@ DRD64_TEST_LIBGOBLIN_SYSTEM_EXTERN int Test_LibGoblin_System( void );
 #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
diff --git a/libgoblin/test_libgoblin_proginfo.c b/libgoblin/test_libgoblin_proginfo.c
new file mode 100644 (file)
index 0000000..623d0f5
--- /dev/null
@@ -0,0 +1,147 @@
+/*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 ----------------------------------- */