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 ) {
90 { p_pginfo->p_binfo[LIBGOBLIN_BINFO_FILE_EXEC] = p_binfo; }
91 p_pginfo->i_num_binfo++;
97 /*----------------------------------------------------------------------
98 ----------------------------------------------------------------------*/
100 ProgInfo_ClearProgInfo(
101 LibGoblin_ProgramInfo *p_pginfo )
103 assert( NULL != p_pginfo );
105 memset( p_pginfo, 0x00, sizeof( LibGoblin_ProgramInfo ) );
107 p_pginfo->i_id = -0x01;
113 /*----------------------------------------------------------------------
114 ----------------------------------------------------------------------*/
115 LIBGOBLIN_PROGINFO_EXTERN
116 LibGoblin_ProgramInfo *
117 ProgInfo_AllocProgInfo(
121 int i_id_now = -0x01;
122 LibGoblin_ProgramInfo *p_pginfo = NULL;
123 LibGoblin_ProgramInfo *p_pgbase;
125 if( gi_now_program_info < gi_max_program_info ) {
126 for( i_cnt = 0; i_cnt < gi_max_program_info; i_cnt++ ) {
127 if( -0x01 == PGINFO( i_cnt )->i_id ) {
128 p_pginfo = PGINFO( i_cnt );
130 goto goto_ProgInfo_AllocProgInfo_dataset;
134 goto goto_ProgInfo_AllocProgInfo_post;
137 if( gi_now_program_info == gi_alloc_program_info ) {
138 p_pgbase = (LibGoblin_ProgramInfo *)realloc( gp_program_info,
139 sizeof( LibGoblin_ProgramInfo ) *
140 ( gi_alloc_program_info + LIBGOBLIN_PROGINFO_UNITS ) );
141 if( NULL == p_pgbase ) {
142 goto goto_ProgInfo_AllocProgInfo_post;
145 gp_program_info = p_pgbase;
146 gi_alloc_program_info += LIBGOBLIN_PROGINFO_UNITS;
149 i_id_now = gi_now_program_info;
151 goto_ProgInfo_AllocProgInfo_dataset:
152 if( i_id_now == gi_max_program_info ) { gi_max_program_info++; }
153 p_pginfo = PGINFO( i_id_now );
154 p_pginfo->i_id = i_id_now;
155 gi_now_program_info++;
157 goto_ProgInfo_AllocProgInfo_post:
162 /*----------------------------------------------------------------------
163 ----------------------------------------------------------------------*/
164 LIBGOBLIN_PROGINFO_EXTERN
166 ProgInfo_FreeProgInfo(
167 LibGoblin_ProgramInfo *p_pginfo )
171 assert( NULL != p_pginfo );
173 if( -0x01 == p_pginfo->i_id ) { return 0x00; }
175 i_id = p_pginfo->i_id;
176 ProgInfo_ClearProgInfo( p_pginfo );
178 if( gi_max_program_info == (i_id + 1) )
179 { gi_max_program_info--; }
181 gi_now_program_info--;
182 if( 0 == gi_now_program_info ) { gi_max_program_info = 0; }
188 /*----------------------------------------------------------------------
189 ----------------------------------------------------------------------*/
190 LIBGOBLIN_PROGINFO_EXTERN
196 LibGoblin_ProgramInfo *p_pginfo;
198 if( 0 != gi_max_program_info ) {
202 gp_program_info = (LibGoblin_ProgramInfo *)malloc(
203 sizeof( LibGoblin_ProgramInfo ) * LIBGOBLIN_PROGINFO_UNITS );
204 if( NULL == gp_program_info ) {
208 for( i_cnt = 0; i_cnt < LIBGOBLIN_PROGINFO_UNITS; i_cnt++ ) {
209 p_pginfo = PGINFO( i_cnt );
210 ProgInfo_ClearProgInfo( p_pginfo );
213 gi_alloc_program_info = LIBGOBLIN_PROGINFO_UNITS;
214 gi_max_program_info = 0;
215 gi_now_program_info = 0;
221 /*----------------------------------------------------------------------
222 ----------------------------------------------------------------------*/
223 LIBGOBLIN_PROGINFO_EXTERN
228 LibGoblin_ProgramInfo *p_pginfo;
230 if( 0 < gi_now_program_info ) {
231 for( ; gi_max_program_info > 0; gi_max_program_info-- ) {
232 p_pginfo = PGINFO( gi_max_program_info - 1 );
233 ProgInfo_FreeProgInfo( p_pginfo );
237 free( gp_program_info );
239 gp_program_info = NULL;
240 gi_alloc_program_info = 0;
241 gi_max_program_info = 0;
242 gi_now_program_info = 0;
248 /* EOF of drd64_.c ----------------------------------- */