OSDN Git Service

2019/02/11(Mon) 19:58
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Mon, 11 Feb 2019 10:58:06 +0000 (19:58 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Mon, 11 Feb 2019 10:58:06 +0000 (19:58 +0900)
 (LibGoblin)
  * Create drd64_libgoblin_srcfile.[ch] & test_libgoblin_srcfile.c

libgoblin/Makefile
libgoblin/drd64_libgoblin.h
libgoblin/drd64_libgoblin_debug_objinfo.c
libgoblin/drd64_libgoblin_elf_symtab.c
libgoblin/drd64_libgoblin_srcfile.c [new file with mode: 0644]
libgoblin/drd64_libgoblin_srcfile.h [new file with mode: 0644]
libgoblin/drd64_libgoblin_type.h
libgoblin/test_libgoblin.c
libgoblin/test_libgoblin.h
libgoblin/test_libgoblin_srcfile.c [new file with mode: 0644]

index 0729d94..3ae31d8 100644 (file)
@@ -51,6 +51,7 @@ OBJS = drd64_libgoblin_api.o \
                drd64_libgoblin_proginfo.o \
                drd64_libgoblin_binfo.o \
                drd64_libgoblin_binaryfile.o \
+               drd64_libgoblin_srcfile.o \
                drd64_libgoblin_checkbin.o \
                drd64_libgoblin_readbin.o \
                drd64_libgoblin_loadprog.o \
@@ -77,6 +78,7 @@ HEADER = drd64_libgoblin.h \
                drd64_libgoblin_proginfo.h \
                drd64_libgoblin_binfo.h \
                drd64_libgoblin_binaryfile.h \
+               drd64_libgoblin_srcfile.h \
                drd64_libgoblin_checkbin.h \
                drd64_libgoblin_readbin.h \
                drd64_libgoblin_loadprog.h \
@@ -110,6 +112,7 @@ TEST_OBJS = test_libgoblin.o \
                        test_libgoblin_api.o \
                        test_libgoblin_proginfo.o \
                        test_libgoblin_binaryfile.o \
+                       test_libgoblin_srcfile.o \
                        test_libgoblin_loadprog.o \
                        test_libgoblin_binfo.o \
                        test_libgoblin_objinfo.o \
@@ -144,6 +147,9 @@ drd64_libgoblin_binfo.o: drd64_libgoblin_binfo.c $(HEADER)
 drd64_libgoblin_binaryfile.o: drd64_libgoblin_binaryfile.c $(HEADER)
        $(CC) -c -o drd64_libgoblin_binaryfile.o $(FLAGS_DEBUG) \
                                drd64_libgoblin_binaryfile.c
+drd64_libgoblin_srcfile.o: drd64_libgoblin_srcfile.c $(HEADER)
+       $(CC) -c -o drd64_libgoblin_srcfile.o $(FLAGS_DEBUG) \
+                               drd64_libgoblin_srcfile.c
 drd64_libgoblin_checkbin.o: drd64_libgoblin_checkbin.c $(HEADER)
        $(CC) -c -o drd64_libgoblin_checkbin.o $(FLAGS_DEBUG) \
                                drd64_libgoblin_checkbin.c
@@ -237,6 +243,10 @@ test_libgoblin_binaryfile.o: test_libgoblin_binaryfile.c $(HEADER) $(TEST_HEADER
        $(CC) -c -o test_libgoblin_binaryfile.o \
                        $(FLAGS_DEBUG) $(FLAGS_COMPILE) $(TEST_FLAGS_COMPILE) \
                        test_libgoblin_binaryfile.c
+test_libgoblin_srcfile.o: test_libgoblin_srcfile.c $(HEADER) $(TEST_HEADER)
+       $(CC) -c -o test_libgoblin_srcfile.o \
+                       $(FLAGS_DEBUG) $(FLAGS_COMPILE) $(TEST_FLAGS_COMPILE) \
+                       test_libgoblin_srcfile.c
 test_libgoblin_loadprog.o: test_libgoblin_loadprog.c $(HEADER) $(TEST_HEADER)
        $(CC) -c -o test_libgoblin_loadprog.o \
                        $(FLAGS_DEBUG) $(FLAGS_COMPILE) $(TEST_FLAGS_COMPILE) \
@@ -264,7 +274,6 @@ $(TESTPROG):
 
 $(CALLGRAPH):
        env CC=cc cflow -A -P -g -X -n *.c $(HEADER) > $(CALLGRAPH)
-       #env CC=cc cflow -A -P -g -X -n drd64_*.c $(HEADER) > $(CALLGRAPH)
 
 clean:
        rm -f *.o
index 501a68e..61402b1 100644 (file)
@@ -73,6 +73,7 @@ Comment:
 #include"drd64_libgoblin_proginfo.h"
 #include"drd64_libgoblin_binfo.h"
 #include"drd64_libgoblin_binaryfile.h"
+#include"drd64_libgoblin_srcfile.h"
 #include"drd64_libgoblin_checkbin.h"
 #include"drd64_libgoblin_readbin.h"
 #include"drd64_libgoblin_loadprog.h"
index 6ccc10e..a004a3f 100644 (file)
@@ -261,7 +261,7 @@ void
                                        ((PF_MASKOS & dw_flag) ? 'O': ' '),
                                        ((PF_MASKPROC & dw_flag) ? 'P': ' ') );
 
-       printf(" %s\t\t[PROGHDR] Flag[%5s] Type: %s, align= %d\n",
+       printf(" %s\t\t[PROGHDR] Flag[%5s] Type: %s, align= %ld\n",
                                pstr_space, str_flag, str_type, p_obj->info.proghdr.qw_align );
        printf(" %s\n", pstr_space );
 
@@ -399,7 +399,7 @@ int
                        Byte            b_level )
 {
        char                                    str_space[384];
-       LibGoblin_ObjectInfo    *p_objinfo;
+       //LibGoblin_ObjectInfo  *p_objinfo;
 
        str_space[0]    = '\0';
 
index 34d1372..37a3311 100644 (file)
@@ -42,18 +42,16 @@ Comment:
 ----------------------------------------------------------------------*/
 LIBGOBLIN_ELF_SYMTAB_EXTERN
 int
-       Elf_Symtab_ReadSymtabSection(
-                       LibGoblin_ProgramInfo   *p_pginfo )
+       ELF64_Symtab_ReadSection(
+                       LibGoblin_BinaryInfo    *p_binfo )
 {
-/*
+
        Byte            *pb_symtab;
        int                     i_result        = 0x00;
        DWord           dw_symbols;
        DWord           dw_cnt;
-       Elf32_Shdr      *p_shdr32;
-       Elf64_Shdr      *p_shdr64;
-       Elf32_Sym       *p_sym32        = NULL;
-       Elf64_Sym       *p_sym64        = NULL;
+       Elf64_Shdr      *p_shdr;
+       Elf64_Sym       *p_sym  = NULL;
        LibGoblin_SectionInfo   *p_secinfo;
        
        assert( NULL != p_binfo );
@@ -62,58 +60,26 @@ int
        p_secinfo       = LibGoblin_Section_GetSectionInfo_fid(
                                                p_binfo, LIBGOBLIN_SECTION_ID_SYMTAB );
        if( NULL == p_secinfo ) {
-               return -0x01;
+               return 0x00;
        }
 
-       if( IsBinfoType_Elf64( p_binfo ) )      {
-               p_shdr64        = (Elf64_Shdr *)(p_secinfo->pb_sechdr);
-               if( 0 == p_shdr64->sh_entsize ) {
-                       return -0x02;
-               }
-               dw_symbols      = (DWord)p_shdr64->sh_size / (DWord)p_shdr64->sh_entsize;
-               pb_symtab       = p_secinfo->pb_data;
-       }
-       else    {
-               p_shdr32        = (Elf32_Shdr *)(p_secinfo->pb_sechdr);
-               if( 0 == p_shdr32->sh_entsize ) {
-                       return -0x02;
-               }
-               dw_symbols      = (DWord)p_shdr32->sh_size / (DWord)p_shdr32->sh_entsize;
-               pb_symtab       = p_secinfo->pb_data;
+       p_shdr  = (Elf64_Shdr *)(p_secinfo->pb_sechdr);
+       if( 0 == p_shdr->sh_entsize )   {
+               return -0x02;
        }
+       dw_symbols      = (DWord)p_shdr->sh_size / (DWord)p_shdr->sh_entsize;
+       pb_symtab       = p_secinfo->pb_data;
+
+       p_sym   = (Elf64_Sym *)pb_symtab;
+       for( dw_cnt = 0; ((dw_cnt < dw_symbols) && (0x00 == i_result)); dw_cnt++, p_sym++ )     {
 
-       // Create & Alloc SymbolWorkTable
-    i_result   = LibGoblin_SymWork_AllocSymbolWorkTable( p_symwork, dw_symbols );
-       if( 0x00 != i_result )  {
-               return -0x03;
-       }
 
-       // Read SymbolSection to SymbolWorkTable
-       if( IsBinfoType_Elf64( p_binfo ) )      {
-               p_sym64 = (Elf64_Sym *)pb_symtab;
 
-               for( dw_cnt = 0; ((dw_cnt < dw_symbols) && (0x00 == i_result)); dw_cnt++, p_sym64++ )   {
-                       i_result        = LibGoblin_SymWork_AddSymbolWorkInfo(
-                                                               p_binfo, p_symwork, (PtrValue)p_sym64->st_value, (Byte *)p_sym64,
-                                                               LIBGOBLIN_SYMWORKINFO_TYPE_SYMTAB );
-               }
-       }
-       else    {
-               p_sym32= (Elf32_Sym *)pb_symtab;
-
-               for( dw_cnt = 0; ((dw_cnt < dw_symbols) && (0x00 == i_result)); dw_cnt++, p_sym32++ )   {
-                        i_result       = LibGoblin_SymWork_AddSymbolWorkInfo(
-                                                               p_binfo, p_symwork, (PtrValue)p_sym32->st_value, (Byte *)p_sym32,
-                                                               LIBGOBLIN_SYMWORKINFO_TYPE_SYMTAB );
-               }
        }
        if( 0x00 != i_result )  {
                return -0x04;
        }
 
-       // Sort WorkTable
-//     LibGoblin_SymWork_SortSymbolWorkTable( p_symwork );
-*/
        return 0x00;
 }
 
diff --git a/libgoblin/drd64_libgoblin_srcfile.c b/libgoblin/drd64_libgoblin_srcfile.c
new file mode 100644 (file)
index 0000000..a6bf30c
--- /dev/null
@@ -0,0 +1,292 @@
+/*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_LIBGOBLIN_SRCFILE
+#include"drd64_libgoblin.h"
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+LIBGOBLIN_SRCFILE_EXTERN
+LibGoblin_SrcFile      *
+       SrcFile_GetSrcFile(
+                       int             i_srcid )
+{
+       if(( gi_max_src_file <= i_srcid ) || ( 0 > i_srcid ))
+               { return NULL; }
+       
+       if( -0x01 == SRCFILE( i_srcid )->i_id )
+               { return NULL; }
+
+       return SRCFILE( i_srcid );
+}
+
+
+/*----------------------------------------------------------------------
+OK
+----------------------------------------------------------------------*/
+LIBGOBLIN_SRCFILE_EXTERN
+LibGoblin_SrcFile      *
+       SrcFile_AllocSrcFile(
+                       void )
+{
+       int                                     i_cnt;
+       int                                     i_id_now        = -0x01;
+       LibGoblin_SrcFile       *p_srcfile      = NULL;
+       LibGoblin_SrcFile       *p_srcbase;
+
+       if( gi_now_src_file < gi_max_src_file ) {
+               // Search Non-Used & Alloced SrcFile struct.
+               for( i_cnt = 0; i_cnt < gi_max_src_file; i_cnt++ )      {
+                       if( -0x01 == SRCFILE( i_cnt )->i_id )   {
+                               p_srcfile       = SRCFILE( i_cnt );
+                               i_id_now        = i_cnt;
+                               goto    goto_SrcFile_AllocSrcFile_dataset;
+                       }
+               }
+
+               // Bug -- Not Exist Non-used SrcFile struct.
+               goto    goto_SrcFile_AllocSrcFile_post;
+       }
+
+       if( gi_now_src_file == gi_alloc_src_file )      {
+               p_srcbase       = (LibGoblin_SrcFile *)realloc( gp_src_file,
+                                                               sizeof( LibGoblin_SrcFile ) * 
+                                                               ( gi_alloc_src_file + LIBGOBLIN_SRCFILE_UNITS ) );
+               if( NULL == p_srcbase ) {
+                       goto    goto_SrcFile_AllocSrcFile_post;
+               }
+
+               gp_src_file                     = p_srcbase;
+               gi_alloc_src_file       += LIBGOBLIN_SRCFILE_UNITS;
+       }
+
+       i_id_now        = gi_now_src_file;
+
+goto_SrcFile_AllocSrcFile_dataset:
+       if( i_id_now == gi_max_src_file )       { gi_max_src_file++; }
+       p_srcfile               = SRCFILE( i_id_now );
+       p_srcfile->i_id = i_id_now;
+       gi_now_src_file++;
+
+goto_SrcFile_AllocSrcFile_post:
+       return p_srcfile;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+/*
+LIBGOBLIN_SRCFILE_EXTERN
+LibGoblin_SrcFile      *
+       SrcFile_SearchSrcFile(
+                       char    *pstr_filename,
+                       char    *pstr_localpath,
+                       char    *pstr_remotepath )
+{
+       int             i_cnt;
+       int             i_result;
+       LibGoblin_SrcFile       *p_bfile;
+
+       assert( NULL != pstr_filename);
+       assert( NULL != pstr_localpath );
+
+       for( i_cnt = 0; i_cnt < gi_max_src_file; i_cnt++ )      {
+               p_bfile = SRCFILE( i_cnt );
+
+               if( -0x01 == p_bfile->i_id )    { continue; }
+
+               i_result        = strncmp( pstr_filename, p_bfile->str_filename, DRD64_MAX_PATH );
+               if( 0x00 != i_result )  { continue; }
+
+               i_result        = strncmp( pstr_localpath, p_bfile->str_localpath, DRD64_MAX_PATH );
+               if( 0x00 != i_result )  { continue; }
+
+               if( NULL != pstr_remotepath )   {
+                       i_result        = strncmp( pstr_remotepath, p_bfile->str_remotepath, DRD64_MAX_PATH );
+                       if( 0x00 != i_result )  { continue; }
+               }
+
+               goto    goto_SrcFile_SearchSrcFile_post;
+       }
+
+       p_bfile = NULL;
+       
+goto_SrcFile_SearchSrcFile_post:
+       return p_bfile;
+}
+*/
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+/*
+LIBGOBLIN_SRCFILE_EXTERN
+LibGoblin_SrcFile      *
+       SrcFile_DispenseSrcFile(
+                       LibGoblin_SrcInfo       *p_binfo,
+                       char    *pstr_localpath,
+                       char    *pstr_remotepath )
+{
+       LibGoblin_SrcFile       *p_bfile;
+
+       assert( NULL != p_binfo );
+
+       p_bfile = SrcFile_SearchSrcFile(
+                                       p_binfo->str_filename, pstr_localpath, pstr_remotepath );
+       if( NULL != p_bfile )   {
+               p_bfile->i_refcount++;
+       }
+       else    {
+               p_bfile = SrcFile_AllocSrcFile();
+       }
+
+       strncpy( p_bfile->str_filename, p_binfo->str_filename, DRD64_MAX_PATH );
+    strncpy( p_bfile->str_localpath, pstr_localpath, DRD64_MAX_PATH );
+    if( NULL != pstr_remotepath )   {
+        strncpy( p_bfile->str_remotepath, pstr_remotepath, DRD64_MAX_PATH );
+    }
+                               
+       return  p_bfile;
+}
+*/
+
+/*----------------------------------------------------------------------
+OK
+----------------------------------------------------------------------*/
+void
+       SrcFile_ClearSrcFile(
+                       LibGoblin_SrcFile       *p_srcfile )
+{
+       assert( NULL != p_srcfile );
+
+       memset( p_srcfile, 0x00, sizeof( LibGoblin_SrcFile ) );
+
+       p_srcfile->i_id = -0x01;
+
+       return;
+}
+
+
+/*----------------------------------------------------------------------
+OK
+----------------------------------------------------------------------*/
+LIBGOBLIN_SRCFILE_EXTERN
+int
+       SrcFile_FreeSrcFile(
+                       LibGoblin_SrcFile       *p_srcfile )
+{
+       int             i_id;
+       
+       assert( NULL != p_srcfile );
+
+       if( -0x01 == p_srcfile->i_id )  { return 0x00; }
+
+       i_id    = p_srcfile->i_id;
+       SrcFile_ClearSrcFile( p_srcfile );
+
+       if( gi_max_src_file == (i_id + 1) )
+               { gi_max_src_file--; }
+       
+       gi_now_src_file--;
+       if( 0 == gi_now_src_file )      { gi_max_src_file = 0; }
+
+       return 0x00;
+}
+
+
+/*----------------------------------------------------------------------
+OK
+----------------------------------------------------------------------*/
+LIBGOBLIN_SRCFILE_EXTERN
+int
+       SrcFile_Init(
+                       void )
+{
+       int             i_cnt;
+       LibGoblin_SrcFile       *p_srcfile;
+
+       if( 0 != gi_max_src_file )      {
+               return -0x01;
+       }
+
+       gp_src_file     = (LibGoblin_SrcFile *)malloc(
+                                               sizeof( LibGoblin_SrcFile ) * LIBGOBLIN_SRCFILE_UNITS );
+       if( NULL == gp_src_file )       {
+               return -0x02;
+       }
+
+       for( i_cnt = 0; i_cnt < LIBGOBLIN_SRCFILE_UNITS; i_cnt++ )              {
+               p_srcfile       = SRCFILE( i_cnt );
+               SrcFile_ClearSrcFile( p_srcfile );
+       }
+
+       gi_alloc_src_file       = LIBGOBLIN_SRCFILE_UNITS;
+       gi_max_src_file         = 0;
+       gi_now_src_file         = 0;
+       
+       return 0x00;
+}
+
+
+/*----------------------------------------------------------------------
+OK
+----------------------------------------------------------------------*/
+LIBGOBLIN_SRCFILE_EXTERN
+int
+       SrcFile_Term(
+                       void )
+{
+       LibGoblin_SrcFile       *p_srcfile;
+
+       if( 0 < gi_now_src_file )       {
+               for( ; gi_max_src_file > 0; gi_max_src_file-- ) {
+                       p_srcfile       = SRCFILE( gi_max_src_file - 1 );
+                       SrcFile_FreeSrcFile( p_srcfile );
+               }
+       }
+
+       free( gp_src_file );
+       
+       gp_src_file                     = NULL;
+       gi_alloc_src_file       = 0;
+       gi_max_src_file         = 0;
+       gi_now_src_file         = 0;
+
+       return 0x00;
+}
+
+
+/* EOF of drd64_.c ----------------------------------- */
diff --git a/libgoblin/drd64_libgoblin_srcfile.h b/libgoblin/drd64_libgoblin_srcfile.h
new file mode 100644 (file)
index 0000000..057743f
--- /dev/null
@@ -0,0 +1,91 @@
+/*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_.h
+Function: Header 
+Comment: 
+----------------------------------------------------------------------*/
+
+#ifndef DRD64_HEADER_LIBGOBLIN_SRCFILE
+#define DRD64_HEADER_LIBGOBLIN_SRCFILE
+
+#ifdef DRD64_SRC_LIBGOBLIN_SRCFILE
+       #define LIBGOBLIN_SRCFILE_EXTERN
+#else
+       #define LIBGOBLIN_SRCFILE_EXTERN        extern
+#endif
+
+#if defined DRD64_SRC_LIBGOBLIN_SRCFILE
+       #define LIBGOBLIN_SRCFILE_INTERNALFUNC
+#elif defined DRD64_SRC_TEST_LIBGOBLIN_SRCFILE
+       #define LIBGOBLIN_SRCFILE_INTERNALFUNC
+#endif
+
+#define LIBGOBLIN_SRCFILE_UNITS                128
+#define LIBGOBLIN_SRCFILE_MAX_BINFO    128
+
+#ifdef DRD64_SRC_LIBGOBLIN_SRCFILE
+LibGoblin_SrcFile      *gp_src_file            = NULL;
+int                                    gi_alloc_src_file       = 0;
+int                                    gi_max_src_file         = 0;
+int                                    gi_now_src_file         = 0;
+#endif
+
+#define        SRCFILE(n)      ((LibGoblin_SrcFile *)(gp_src_file + (n)))
+
+LIBGOBLIN_SRCFILE_EXTERN
+       LibGoblin_SrcFile *SrcFile_GetSrcFile( int i_srcid );
+LIBGOBLIN_SRCFILE_EXTERN
+       LibGoblin_SrcFile *SrcFile_AllocSrcFile( void );
+/*
+LIBGOBLIN_SRCFILE_EXTERN
+       LibGoblin_SrcFile *SrcFile_SearchSrcFile(
+               char *pstr_filename, char *pstr_localpath, char *pstr_remotepath );
+LIBGOBLIN_SRCFILE_EXTERN
+       LibGoblin_SrcFile *SrcFile_DispenseSrcFile(
+               LibGoblin_BinaryInfo *p_binfo, char *pstr_localpath, char *pstr_remotepath );
+*/
+LIBGOBLIN_SRCFILE_EXTERN
+       int SrcFile_FreeSrcFile( LibGoblin_SrcFile *p_srcfile );
+LIBGOBLIN_SRCFILE_EXTERN
+       int SrcFile_Init( void );
+LIBGOBLIN_SRCFILE_EXTERN
+       int SrcFile_Term( void );
+
+
+#ifdef LIBGOBLIN_SRCFILE_INTERNALFUNC
+void SrcFile_ClearSrcFile( LibGoblin_SrcFile *p_libinfo );
+
+#endif
+
+#endif /* DRD64_HEADER_XXX */
+
+/* EOF of drd64_.h ----------------------------------- */
index ac06f05..5aa6147 100644 (file)
@@ -146,10 +146,11 @@ typedef struct    {
 
 /*=====================================================================*/
 typedef struct {
-       int             i_srcid;
+       int             i_id;
        char    str_filename[DRD64_MAX_PATH];
        char    str_localpath[DRD64_MAX_PATH];
-} LibGoblin_SourceInfo;
+       char    str_remotepath[DRD64_MAX_PATH];
+} LibGoblin_SrcFile;
 
 
 /*=====================================================================*/
index afad1c3..e17b00d 100644 (file)
@@ -53,6 +53,7 @@ int
        Test_LibGoblin_BinInfo();
        Test_LibGoblin_ProgInfo();
        Test_LibGoblin_BinaryFile();
+       Test_LibGoblin_SrcFile();
        Test_LibGoblin_ObjInfo();
        Test_LibGoblin_SymWork();
        Test_LibGoblin_ReadBinary();
index 2974623..75ff5ec 100644 (file)
@@ -77,6 +77,13 @@ DRD64_TEST_LIBGOBLIN_PROGINFO_EXTERN int Test_LibGoblin_ProgInfo( void );
 #endif
 DRD64_TEST_LIBGOBLIN_BINARYFILE_EXTERN int Test_LibGoblin_BinaryFile( void );
 
+#ifdef DRD64_SRC_TEST_LIBGOBLIN_SRCFILE
+       #define DRD64_TEST_LIBGOBLIN_SRCFILE_EXTERN
+#else
+       #define DRD64_TEST_LIBGOBLIN_SRCFILE_EXTERN             extern
+#endif
+DRD64_TEST_LIBGOBLIN_SRCFILE_EXTERN int Test_LibGoblin_SrcFile( void );
+
 #ifdef DRD64_SRC_TEST_LIBGOBLIN_READBINARY
        #define DRD64_TEST_LIBGOBLIN_READBINARY_EXTERN
 #else
diff --git a/libgoblin/test_libgoblin_srcfile.c b/libgoblin/test_libgoblin_srcfile.c
new file mode 100644 (file)
index 0000000..a622093
--- /dev/null
@@ -0,0 +1,155 @@
+/*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_SRCFILE
+#include"drd64_libgoblin.h"
+#include"test_libgoblin.h"
+
+
+/* SrcFile_AllocSrcFile() & FreeSrcFile() *****************/
+/*--------------------------------------------------------------------*/
+void Test_SrcFile_AllocFree_test00_002( void )
+{
+       int             i_cnt;
+       int             i_result;
+       LibGoblin_SrcFile       *p_srcfile;
+
+       i_result        = SrcFile_Init();
+       CU_ASSERT( 0x00 == i_result );
+
+       for( i_cnt = 0; i_cnt < 300; i_cnt++ )  {
+               p_srcfile       = SrcFile_AllocSrcFile();
+               CU_ASSERT( NULL != p_srcfile );
+               CU_ASSERT( i_cnt == p_srcfile->i_id );
+       }
+
+       for( i_cnt = 0; i_cnt < 32; i_cnt ++ )  {
+               p_srcfile       = NULL;
+               p_srcfile       = SrcFile_GetSrcFile( (i_cnt * 8) );
+               CU_ASSERT( NULL != p_srcfile );
+
+               i_result        = SrcFile_FreeSrcFile( p_srcfile );
+               CU_ASSERT( 0x00 == i_result );
+       }
+
+       for( i_cnt = 0; i_cnt < 32; i_cnt++ )   {
+               p_srcfile       = NULL;
+               p_srcfile       = SrcFile_AllocSrcFile();
+               CU_ASSERT( NULL != p_srcfile );
+               CU_ASSERT( (i_cnt * 8) == p_srcfile->i_id );
+       }
+
+       for( i_cnt = 0; i_cnt < 300; i_cnt++ )  {
+               p_srcfile       = NULL;
+               p_srcfile       = SrcFile_GetSrcFile( i_cnt );
+               CU_ASSERT( NULL != p_srcfile );
+
+               i_result        = SrcFile_FreeSrcFile( p_srcfile );
+               CU_ASSERT( 0x00 == i_result );
+       }
+
+       p_srcfile       = SrcFile_GetSrcFile( 0 );
+       CU_ASSERT( NULL == p_srcfile );
+
+       i_result        = SrcFile_Term();
+       CU_ASSERT( 0x00 == i_result );
+
+       return;
+}
+
+
+/* EOF of drd64_.c ----------------------------------- */
+/*--------------------------------------------------------------------*/
+void Test_SrcFile_AllocFree_test00_001( void )
+{
+       int             i_result;
+       LibGoblin_SrcFile       *p_srcfile;
+
+       i_result        = SrcFile_Init();
+       CU_ASSERT( 0x00 == i_result );
+
+       p_srcfile       = SrcFile_AllocSrcFile();
+       CU_ASSERT( NULL != p_srcfile );
+
+       i_result        = SrcFile_FreeSrcFile( p_srcfile );
+       CU_ASSERT( 0x00 == i_result );
+
+       i_result        = SrcFile_Term();
+       CU_ASSERT( 0x00 == i_result );
+
+       return;
+}
+
+
+/* SrcFile_Init() & Term() ****************************************/
+/*--------------------------------------------------------------------*/
+void Test_SrcFile_InitTerm_test00_001( void )
+{
+       int             i_result;
+
+       i_result        = SrcFile_Init();
+       CU_ASSERT( 0x00 == i_result );
+
+       i_result        = SrcFile_Term();
+       CU_ASSERT( 0x00 == i_result );
+
+       return;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+DRD64_TEST_LIBGOBLIN_SRCFILE_EXTERN
+int
+       Test_LibGoblin_SrcFile(
+               void )
+{
+       CU_pSuite       pt_goblin;
+
+       pt_goblin       = CU_add_suite( "LibGoblin_SrcFile", NULL, NULL );
+
+       CU_add_test( pt_goblin, "SrcFile_InitTerm_test00_001",
+                                                                Test_SrcFile_InitTerm_test00_001 );
+       CU_add_test( pt_goblin, "SrcFile_AllocFree_test00_001",
+                                                                Test_SrcFile_AllocFree_test00_001 );
+       CU_add_test( pt_goblin, "SrcFile_AllocFree_test00_001",
+                                                                Test_SrcFile_AllocFree_test00_002 );
+
+       return 0x00;
+}
+
+
+/* EOF of drd64_.c ----------------------------------- */