1 /*DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64
4 for INTEL64(R), AMD64(R)
6 Copyright(C) 2007-2009 Koine Yuusuke(koinec). All rights reserved.
8 Redistribution and use in source and binary forms, with or without
9 modification, are permitted provided that the following conditions are met:
11 1. Redistributions of source code must retain the above copyright notice,
12 this list of conditions and the following disclaimer.
13 2. Redistributions in binary form must reproduce the above copyright
14 notice, this list of conditions and the following disclaimer in the
15 documentation and/or other materials provided with the distribution.
17 THIS SOFTWARE IS PROVIDED BY Koine Yuusuke(koinec) ``AS IS'' AND ANY
18 EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 DISCLAIMED. IN NO EVENT SHALL Koine Yuusuke(koinec) OR CONTRIBUTORS BE
21 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
27 OF THE POSSIBILITY OF SUCH DAMAGE.
29 DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64*/
31 /* File Info -----------------------------------------------------------
35 ----------------------------------------------------------------------*/
37 #define DRD64_SRC_LIBGOBLIN_PROGINFO
38 #include"drd64_libgoblin.h"
40 /*----------------------------------------------------------------------
41 ----------------------------------------------------------------------*/
42 LIBGOBLIN_PROGINFO_EXTERN
43 LibGoblin_ProgramInfo *
47 if(( gi_max_program_info <= i_pgid ) || ( 0 > i_pgid ))
50 if( -0x01 == PGINFO( i_pgid )->i_id )
53 return PGINFO( i_pgid );
57 /*----------------------------------------------------------------------
58 ----------------------------------------------------------------------*/
59 LIBGOBLIN_PROGINFO_EXTERN
61 ProgInfo_GetBinaryInfos(
62 LibGoblin_ProgramInfo *p_pginfo )
64 assert( NULL != p_pginfo );
66 return p_pginfo->i_num_binfo;
70 /*----------------------------------------------------------------------
71 ----------------------------------------------------------------------*/
72 LIBGOBLIN_PROGINFO_EXTERN
73 LibGoblin_BinaryInfo *
74 ProgInfo_AddBinaryInfo(
75 LibGoblin_ProgramInfo *p_pginfo,
76 const char *pstr_binfilename,
79 LibGoblin_BinaryInfo *p_binfo = NULL;
81 assert( NULL != p_pginfo );
83 // Alloc BinaryInfo ---
84 p_binfo = BinaryInfo_AllocBinInfo( p_pginfo, pstr_binfilename, i_req_bid );
85 if( NULL == p_binfo ) {
89 if( -1 == i_req_bid ) {
90 p_binfo->i_filetype = LIBGOBLIN_BINFO_FILE_EXEC;
91 p_pginfo->p_binfo[LIBGOBLIN_BINFO_FILE_EXEC] = p_binfo;
94 p_binfo->i_filetype = LIBGOBLIN_BINFO_FILE_LIBRARY;
96 p_pginfo->i_num_binfo++;
102 /*----------------------------------------------------------------------
103 ----------------------------------------------------------------------*/
105 ProgInfo_ClearProgInfo(
106 LibGoblin_ProgramInfo *p_pginfo )
108 assert( NULL != p_pginfo );
110 memset( p_pginfo, 0x00, sizeof( LibGoblin_ProgramInfo ) );
112 p_pginfo->i_id = -0x01;
118 /*----------------------------------------------------------------------
119 ----------------------------------------------------------------------*/
120 LIBGOBLIN_PROGINFO_EXTERN
121 LibGoblin_ProgramInfo *
122 ProgInfo_AllocProgInfo(
126 int i_id_now = -0x01;
127 LibGoblin_ProgramInfo *p_pginfo = NULL;
128 LibGoblin_ProgramInfo *p_pgbase;
130 if( gi_now_program_info < gi_max_program_info ) {
131 for( i_cnt = 0; i_cnt < gi_max_program_info; i_cnt++ ) {
132 if( -0x01 == PGINFO( i_cnt )->i_id ) {
133 p_pginfo = PGINFO( i_cnt );
135 goto goto_ProgInfo_AllocProgInfo_dataset;
139 goto goto_ProgInfo_AllocProgInfo_post;
142 if( gi_now_program_info == gi_alloc_program_info ) {
143 p_pgbase = (LibGoblin_ProgramInfo *)realloc( gp_program_info,
144 sizeof( LibGoblin_ProgramInfo ) *
145 ( gi_alloc_program_info + LIBGOBLIN_PROGINFO_UNITS ) );
146 if( NULL == p_pgbase ) {
147 goto goto_ProgInfo_AllocProgInfo_post;
150 gp_program_info = p_pgbase;
151 gi_alloc_program_info += LIBGOBLIN_PROGINFO_UNITS;
154 i_id_now = gi_now_program_info;
156 goto_ProgInfo_AllocProgInfo_dataset:
157 if( i_id_now == gi_max_program_info ) { gi_max_program_info++; }
158 p_pginfo = PGINFO( i_id_now );
159 p_pginfo->i_id = i_id_now;
160 gi_now_program_info++;
162 goto_ProgInfo_AllocProgInfo_post:
167 /*----------------------------------------------------------------------
168 ----------------------------------------------------------------------*/
169 LIBGOBLIN_PROGINFO_EXTERN
171 ProgInfo_FreeProgInfo(
172 LibGoblin_ProgramInfo *p_pginfo )
176 assert( NULL != p_pginfo );
178 if( -0x01 == p_pginfo->i_id ) { return 0x00; }
180 i_id = p_pginfo->i_id;
181 ProgInfo_ClearProgInfo( p_pginfo );
183 if( gi_max_program_info == (i_id + 1) )
184 { gi_max_program_info--; }
186 gi_now_program_info--;
187 if( 0 == gi_now_program_info ) { gi_max_program_info = 0; }
193 /*----------------------------------------------------------------------
194 ----------------------------------------------------------------------*/
195 LIBGOBLIN_PROGINFO_EXTERN
201 LibGoblin_ProgramInfo *p_pginfo;
203 if( 0 != gi_max_program_info ) {
207 gp_program_info = (LibGoblin_ProgramInfo *)malloc(
208 sizeof( LibGoblin_ProgramInfo ) * LIBGOBLIN_PROGINFO_UNITS );
209 if( NULL == gp_program_info ) {
213 for( i_cnt = 0; i_cnt < LIBGOBLIN_PROGINFO_UNITS; i_cnt++ ) {
214 p_pginfo = PGINFO( i_cnt );
215 ProgInfo_ClearProgInfo( p_pginfo );
218 gi_alloc_program_info = LIBGOBLIN_PROGINFO_UNITS;
219 gi_max_program_info = 0;
220 gi_now_program_info = 0;
226 /*----------------------------------------------------------------------
227 ----------------------------------------------------------------------*/
228 LIBGOBLIN_PROGINFO_EXTERN
233 LibGoblin_ProgramInfo *p_pginfo;
235 if( 0 < gi_now_program_info ) {
236 for( ; gi_max_program_info > 0; gi_max_program_info-- ) {
237 p_pginfo = PGINFO( gi_max_program_info - 1 );
238 ProgInfo_FreeProgInfo( p_pginfo );
242 free( gp_program_info );
244 gp_program_info = NULL;
245 gi_alloc_program_info = 0;
246 gi_max_program_info = 0;
247 gi_now_program_info = 0;
253 /* EOF of drd64_.c ----------------------------------- */