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(
143 int i_id_now = -0x01;
144 LibGoblin_ProgramInfo *p_pginfo = NULL;
145 LibGoblin_ProgramInfo *p_pgtemp;
146 LibGoblin_ProgramInfo *p_pgbase;
148 if( gi_now_program_info < gi_max_program_info ) {
149 for( i_cnt = 0; i_cnt < gi_max_program_info; i_cnt++ ) {
150 if( -0x01 == PGINFO( i_cnt )->i_id ) {
151 p_pginfo = PGINFO( i_cnt );
153 goto goto_ProgInfo_AllocProgInfo_dataset;
157 LibBrownie_Error_SetErrorInfo(
158 DRD64_ERROR( DRD64_ERROR_PTN_BUG, 0x01, 0x01 ),
159 LOCATION( FUNCID_LibGoblin_ProgInfo_AllocProgInfo ),
160 errno, (QWord)gi_now_program_info, (QWord)gi_max_program_info, __LINE__ );
161 goto goto_ProgInfo_AllocProgInfo_post;
164 if( gi_now_program_info == gi_alloc_program_info ) {
165 i_items = gi_alloc_program_info + LIBGOBLIN_PROGINFO_UNITS;
166 p_pgbase = (LibGoblin_ProgramInfo *)realloc( gp_program_info,
167 sizeof( LibGoblin_ProgramInfo ) * i_items );
168 if( NULL == p_pgbase ) {
169 LibBrownie_Error_SetErrorInfo(
170 DRD64_ERROR( DRD64_ERROR_PTN_NOMEMORY, 0x01, 0x02 ),
171 LOCATION( FUNCID_LibGoblin_ProgInfo_AllocProgInfo ),
172 errno, (QWord)gi_alloc_program_info, (QWord)0x00, __LINE__ );
173 goto goto_ProgInfo_AllocProgInfo_post;
176 for( i_cnt = (i_items - 1); i_cnt >= gi_alloc_program_info; i_cnt-- ) {
177 p_pgtemp = PGINFO( i_cnt );
178 ProgInfo_ClearProgInfo( p_pgtemp );
181 gp_program_info = p_pgbase;
182 gi_alloc_program_info += LIBGOBLIN_PROGINFO_UNITS;
185 i_id_now = gi_now_program_info;
187 goto_ProgInfo_AllocProgInfo_dataset:
188 if( i_id_now == gi_max_program_info ) { gi_max_program_info++; }
189 p_pginfo = PGINFO( i_id_now );
190 p_pginfo->i_id = i_id_now;
191 gi_now_program_info++;
193 goto_ProgInfo_AllocProgInfo_post:
198 /*----------------------------------------------------------------------
199 ----------------------------------------------------------------------*/
200 #define FUNCID_LibGoblin_ProgInfo_FreeProgInfo 0x12
201 LIBGOBLIN_PROGINFO_EXTERN
203 ProgInfo_FreeProgInfo(
204 LibGoblin_ProgramInfo *p_pginfo )
208 assert( NULL != p_pginfo );
210 if( -0x01 == p_pginfo->i_id ) {
211 LibBrownie_Error_SetErrorInfo(
212 DRD64_WARNING( DRD64_ERROR_PTN_FAILCALL, 0x01, 0x01 ),
213 LOCATION( FUNCID_LibGoblin_ProgInfo_FreeProgInfo ),
214 errno, (QWord)p_pginfo, (QWord)0x00, __LINE__ );
218 i_id = p_pginfo->i_id;
219 ProgInfo_ClearProgInfo( p_pginfo );
221 if( gi_max_program_info == (i_id + 1) )
222 { gi_max_program_info--; }
224 gi_now_program_info--;
225 if( 0 == gi_now_program_info ) { gi_max_program_info = 0; }
231 /*----------------------------------------------------------------------
232 ----------------------------------------------------------------------*/
233 #define FUNCID_LibGoblin_ProgInfo_Init 0x01
234 LIBGOBLIN_PROGINFO_EXTERN
240 LibGoblin_ProgramInfo *p_pginfo;
242 if( 0 != gi_max_program_info ) {
243 LibBrownie_Error_SetErrorInfo(
244 DRD64_ERROR( DRD64_ERROR_PTN_FAILCALL, 0x01, 0x01 ),
245 LOCATION( FUNCID_LibGoblin_ProgInfo_Init ),
246 errno, (QWord)gi_max_program_info, (QWord)0x00, __LINE__ );
250 gp_program_info = (LibGoblin_ProgramInfo *)malloc(
251 sizeof( LibGoblin_ProgramInfo ) * LIBGOBLIN_PROGINFO_UNITS );
252 if( NULL == gp_program_info ) {
253 LibBrownie_Error_SetErrorInfo(
254 DRD64_ERROR( DRD64_ERROR_PTN_NOMEMORY, 0x01, 0x02 ),
255 LOCATION( FUNCID_LibGoblin_ProgInfo_Init ),
256 errno, (QWord)0x00, (QWord)0x00, __LINE__ );
260 for( i_cnt = 0; i_cnt < LIBGOBLIN_PROGINFO_UNITS; i_cnt++ ) {
261 p_pginfo = PGINFO( i_cnt );
262 ProgInfo_ClearProgInfo( p_pginfo );
265 gi_alloc_program_info = LIBGOBLIN_PROGINFO_UNITS;
266 gi_max_program_info = 0;
267 gi_now_program_info = 0;
273 /*----------------------------------------------------------------------
274 ----------------------------------------------------------------------*/
275 #define FUNCID_LibGoblin_ProgInfo_Term 0x02
276 LIBGOBLIN_PROGINFO_EXTERN
281 LibGoblin_ProgramInfo *p_pginfo;
283 if( 0 < gi_now_program_info ) {
284 for( ; gi_max_program_info > 0; gi_max_program_info-- ) {
285 p_pginfo = PGINFO( gi_max_program_info - 1 );
286 ProgInfo_FreeProgInfo( p_pginfo );
290 free( gp_program_info );
292 gp_program_info = NULL;
293 gi_alloc_program_info = 0;
294 gi_max_program_info = 0;
295 gi_now_program_info = 0;
301 /* EOF of drd64_.c ----------------------------------- */