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 #define LOCATION(n) DRD64_ERR_LOCATION( \
41 DRD64_ERROR_MODULE_LIBGOBLIN, DRD64_ERROR_ARCH_NODEPEND, \
42 DRD64_SRCID_LIBGOBLIN_PROGINFO, (n))
45 /*----------------------------------------------------------------------
46 ----------------------------------------------------------------------*/
47 #define FUNCID_LibGoblin_ProgInfo_GetProgInfo 0x14
48 LIBGOBLIN_PROGINFO_EXTERN
49 LibGoblin_ProgramInfo *
53 if(( gi_max_program_info <= i_pgid ) || ( 0 > i_pgid )) {
54 LibBrownie_Error_SetErrorInfo(
55 DRD64_ERROR( DRD64_ERROR_PTN_FAILED_ARG, 0x01, 0x01 ),
56 LOCATION( FUNCID_LibGoblin_ProgInfo_GetProgInfo ),
57 errno, (QWord)i_pgid, (QWord)0x00, __LINE__ );
61 if( -0x01 == PGINFO( i_pgid )->i_id ) {
62 LibBrownie_Error_SetErrorInfo(
63 DRD64_ERROR( DRD64_ERROR_PTN_FAILCALL, 0x01, 0x02 ),
64 LOCATION( FUNCID_LibGoblin_ProgInfo_GetProgInfo ),
65 errno, (QWord)i_pgid, (QWord)0x00, __LINE__ );
69 return PGINFO( i_pgid );
73 /*----------------------------------------------------------------------
74 ----------------------------------------------------------------------*/
75 #define FUNCID_LibGoblin_ProgInfo_AddBinaryInfo 0x21
76 LIBGOBLIN_PROGINFO_EXTERN
77 LibGoblin_BinaryInfo *
78 ProgInfo_AddBinaryInfo(
79 LibGoblin_ProgramInfo *p_pginfo,
80 const char *pstr_binfilename,
84 LibGoblin_BinaryInfo *p_binfo = NULL;
86 assert( NULL != p_pginfo );
88 i_bid = BinInfo_SearchFilename_inProgInfo( pstr_binfilename, p_pginfo );
89 if( -0x01 == i_bid ) {
90 // Alloc BinaryInfo ---
91 p_binfo = BinaryInfo_AllocBinInfo( p_pginfo, pstr_binfilename, i_req_bid );
92 if( NULL == p_binfo ) {
93 LibBrownie_Error_SetErrorInfo(
94 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x01 ),
95 LOCATION( FUNCID_LibGoblin_ProgInfo_AddBinaryInfo ),
96 errno, (QWord)i_bid, (QWord)i_req_bid, __LINE__ );
100 if( -1 == i_req_bid ) { p_pginfo->i_binfo_id = p_binfo->i_id; }
103 p_binfo = BinaryInfo_GetBinInfo( i_bid );
104 if( NULL == p_binfo ) {
105 LibBrownie_Error_SetErrorInfo(
106 DRD64_ERROR( DRD64_ERROR_PTN_FAILCALL, 0x01, 0x02 ),
107 LOCATION( FUNCID_LibGoblin_ProgInfo_AddBinaryInfo ),
108 errno, (QWord)i_bid, (QWord)0x00, __LINE__ );
116 /*----------------------------------------------------------------------
117 ----------------------------------------------------------------------*/
118 #define FUNCID_LibGoblin_ProgInfo_ClearProgInfo 0x13
120 ProgInfo_ClearProgInfo(
121 LibGoblin_ProgramInfo *p_pginfo )
123 assert( NULL != p_pginfo );
125 memset( p_pginfo, 0x00, sizeof( LibGoblin_ProgramInfo ) );
127 p_pginfo->i_id = -0x01;
133 /*----------------------------------------------------------------------
134 ----------------------------------------------------------------------*/
135 #define FUNCID_LibGoblin_ProgInfo_AllocProgInfo 0x11
136 LIBGOBLIN_PROGINFO_EXTERN
137 LibGoblin_ProgramInfo *
138 ProgInfo_AllocProgInfo(
142 int i_id_now = -0x01;
143 LibGoblin_ProgramInfo *p_pginfo = NULL;
144 LibGoblin_ProgramInfo *p_pgbase;
146 if( gi_now_program_info < gi_max_program_info ) {
147 for( i_cnt = 0; i_cnt < gi_max_program_info; i_cnt++ ) {
148 if( -0x01 == PGINFO( i_cnt )->i_id ) {
149 p_pginfo = PGINFO( i_cnt );
151 goto goto_ProgInfo_AllocProgInfo_dataset;
155 LibBrownie_Error_SetErrorInfo(
156 DRD64_ERROR( DRD64_ERROR_PTN_BUG, 0x01, 0x01 ),
157 LOCATION( FUNCID_LibGoblin_ProgInfo_AllocProgInfo ),
158 errno, (QWord)gi_now_program_info, (QWord)gi_max_program_info, __LINE__ );
159 goto goto_ProgInfo_AllocProgInfo_post;
162 if( gi_now_program_info == gi_alloc_program_info ) {
163 p_pgbase = (LibGoblin_ProgramInfo *)realloc( gp_program_info,
164 sizeof( LibGoblin_ProgramInfo ) *
165 ( gi_alloc_program_info + LIBGOBLIN_PROGINFO_UNITS ) );
166 if( NULL == p_pgbase ) {
167 LibBrownie_Error_SetErrorInfo(
168 DRD64_ERROR( DRD64_ERROR_PTN_NOMEMORY, 0x01, 0x02 ),
169 LOCATION( FUNCID_LibGoblin_ProgInfo_AllocProgInfo ),
170 errno, (QWord)gi_alloc_program_info, (QWord)0x00, __LINE__ );
171 goto goto_ProgInfo_AllocProgInfo_post;
174 gp_program_info = p_pgbase;
175 gi_alloc_program_info += LIBGOBLIN_PROGINFO_UNITS;
178 i_id_now = gi_now_program_info;
180 goto_ProgInfo_AllocProgInfo_dataset:
181 if( i_id_now == gi_max_program_info ) { gi_max_program_info++; }
182 p_pginfo = PGINFO( i_id_now );
183 p_pginfo->i_id = i_id_now;
184 gi_now_program_info++;
186 goto_ProgInfo_AllocProgInfo_post:
191 /*----------------------------------------------------------------------
192 ----------------------------------------------------------------------*/
193 #define FUNCID_LibGoblin_ProgInfo_FreeProgInfo 0x12
194 LIBGOBLIN_PROGINFO_EXTERN
196 ProgInfo_FreeProgInfo(
197 LibGoblin_ProgramInfo *p_pginfo )
201 assert( NULL != p_pginfo );
203 if( -0x01 == p_pginfo->i_id ) {
204 LibBrownie_Error_SetErrorInfo(
205 DRD64_WARNING( DRD64_ERROR_PTN_FAILCALL, 0x01, 0x01 ),
206 LOCATION( FUNCID_LibGoblin_ProgInfo_FreeProgInfo ),
207 errno, (QWord)p_pginfo, (QWord)0x00, __LINE__ );
211 i_id = p_pginfo->i_id;
212 ProgInfo_ClearProgInfo( p_pginfo );
214 if( gi_max_program_info == (i_id + 1) )
215 { gi_max_program_info--; }
217 gi_now_program_info--;
218 if( 0 == gi_now_program_info ) { gi_max_program_info = 0; }
224 /*----------------------------------------------------------------------
225 ----------------------------------------------------------------------*/
226 #define FUNCID_LibGoblin_ProgInfo_Init 0x01
227 LIBGOBLIN_PROGINFO_EXTERN
233 LibGoblin_ProgramInfo *p_pginfo;
235 if( 0 != gi_max_program_info ) {
236 LibBrownie_Error_SetErrorInfo(
237 DRD64_ERROR( DRD64_ERROR_PTN_FAILCALL, 0x01, 0x01 ),
238 LOCATION( FUNCID_LibGoblin_ProgInfo_Init ),
239 errno, (QWord)gi_max_program_info, (QWord)0x00, __LINE__ );
243 gp_program_info = (LibGoblin_ProgramInfo *)malloc(
244 sizeof( LibGoblin_ProgramInfo ) * LIBGOBLIN_PROGINFO_UNITS );
245 if( NULL == gp_program_info ) {
246 LibBrownie_Error_SetErrorInfo(
247 DRD64_ERROR( DRD64_ERROR_PTN_NOMEMORY, 0x01, 0x02 ),
248 LOCATION( FUNCID_LibGoblin_ProgInfo_Init ),
249 errno, (QWord)0x00, (QWord)0x00, __LINE__ );
253 for( i_cnt = 0; i_cnt < LIBGOBLIN_PROGINFO_UNITS; i_cnt++ ) {
254 p_pginfo = PGINFO( i_cnt );
255 ProgInfo_ClearProgInfo( p_pginfo );
258 gi_alloc_program_info = LIBGOBLIN_PROGINFO_UNITS;
259 gi_max_program_info = 0;
260 gi_now_program_info = 0;
266 /*----------------------------------------------------------------------
267 ----------------------------------------------------------------------*/
268 #define FUNCID_LibGoblin_ProgInfo_Term 0x02
269 LIBGOBLIN_PROGINFO_EXTERN
274 LibGoblin_ProgramInfo *p_pginfo;
276 if( 0 < gi_now_program_info ) {
277 for( ; gi_max_program_info > 0; gi_max_program_info-- ) {
278 p_pginfo = PGINFO( gi_max_program_info - 1 );
279 ProgInfo_FreeProgInfo( p_pginfo );
283 free( gp_program_info );
285 gp_program_info = NULL;
286 gi_alloc_program_info = 0;
287 gi_max_program_info = 0;
288 gi_now_program_info = 0;
294 /* EOF of drd64_.c ----------------------------------- */