OSDN Git Service

1fd186e66d95d8ad08db8fd1e88ba14f01287429
[drdeamon64/drdeamon64.git] / libgoblin / drd64_libgoblin_proginfo.c
1 /*DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64
2
3                          D r . D e a m o n  6 4
4                         for INTEL64(R), AMD64(R)
5         
6    Copyright(C) 2007-2009 Koine Yuusuke(koinec). All rights reserved.
7
8 Redistribution and use in source and binary forms, with or without
9 modification, are permitted provided that the following conditions are met:
10
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.
16
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.
28
29 DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64*/
30
31 /* File Info -----------------------------------------------------------
32 File: drd64_.c
33 Function: 
34 Comment: 
35 ----------------------------------------------------------------------*/
36
37 #define DRD64_SRC_LIBGOBLIN_PROGINFO
38 #include"drd64_libgoblin.h"
39
40 #define LOCATION(n) DRD64_ERR_LOCATION( \
41                                                 DRD64_ERROR_MODULE_LIBGOBLIN, DRD64_ERROR_ARCH_NODEPEND, \
42                                                 DRD64_SRCID_LIBGOBLIN_PROGINFO, (n))
43
44
45 /*----------------------------------------------------------------------
46 ----------------------------------------------------------------------*/
47 #define FUNCID_LibGoblin_ProgInfo_GetProgInfo   0x14
48 LIBGOBLIN_PROGINFO_EXTERN
49 LibGoblin_ProgramInfo   *
50         ProgInfo_GetProgInfo(
51                         int             i_pgid )
52 {
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__ );
58                 return NULL;
59         }
60         
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__ );
66                 return NULL;
67         }
68
69         return PGINFO( i_pgid );
70 }
71
72
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,
81                         int                     i_req_bid )
82 {
83         int             i_bid;
84         LibGoblin_BinaryInfo    *p_binfo        = NULL;
85
86         assert( NULL != p_pginfo );
87
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__ );
97                         return NULL;
98                 }
99
100                 if( -1 == i_req_bid )   { p_pginfo->i_binfo_id  = p_binfo->i_id; }
101         }
102         else    {
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__ );
109                 }
110         }
111
112         return p_binfo;
113 }
114
115
116 /*----------------------------------------------------------------------
117 ----------------------------------------------------------------------*/
118 #define FUNCID_LibGoblin_ProgInfo_ClearProgInfo 0x13
119 void
120         ProgInfo_ClearProgInfo(
121                         LibGoblin_ProgramInfo   *p_pginfo )
122 {
123         assert( NULL != p_pginfo );
124
125         memset( p_pginfo, 0x00, sizeof( LibGoblin_ProgramInfo ) );
126
127         p_pginfo->i_id  = -0x01;
128
129         return;
130 }
131
132
133 /*----------------------------------------------------------------------
134 ----------------------------------------------------------------------*/
135 #define FUNCID_LibGoblin_ProgInfo_AllocProgInfo 0x11
136 LIBGOBLIN_PROGINFO_EXTERN
137 LibGoblin_ProgramInfo   *
138         ProgInfo_AllocProgInfo(
139                         void )
140 {
141         int                                     i_cnt;
142         int                                     i_id_now        = -0x01;
143         LibGoblin_ProgramInfo   *p_pginfo       = NULL;
144         LibGoblin_ProgramInfo   *p_pgbase;
145
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 );
150                                 i_id_now        = i_cnt;
151                                 goto    goto_ProgInfo_AllocProgInfo_dataset;
152                         }
153                 }
154
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;
160         }
161
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;
172                 }
173
174                 gp_program_info = p_pgbase;
175                 gi_alloc_program_info   += LIBGOBLIN_PROGINFO_UNITS;
176         }
177
178         i_id_now        = gi_now_program_info;
179
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++;
185
186 goto_ProgInfo_AllocProgInfo_post:
187         return p_pginfo;
188 }
189
190
191 /*----------------------------------------------------------------------
192 ----------------------------------------------------------------------*/
193 #define FUNCID_LibGoblin_ProgInfo_FreeProgInfo  0x12
194 LIBGOBLIN_PROGINFO_EXTERN
195 int
196         ProgInfo_FreeProgInfo(
197                         LibGoblin_ProgramInfo   *p_pginfo )
198 {
199         int             i_id;
200         
201         assert( NULL != p_pginfo );
202
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__ );
208                 return 0x00;
209         }
210
211         i_id    = p_pginfo->i_id;
212         ProgInfo_ClearProgInfo( p_pginfo );
213
214         if( gi_max_program_info == (i_id + 1) )
215                 { gi_max_program_info--; }
216         
217         gi_now_program_info--;
218         if( 0 == gi_now_program_info )  { gi_max_program_info = 0; }
219
220         return 0x00;
221 }
222
223
224 /*----------------------------------------------------------------------
225 ----------------------------------------------------------------------*/
226 #define FUNCID_LibGoblin_ProgInfo_Init  0x01
227 LIBGOBLIN_PROGINFO_EXTERN
228 int
229         ProgInfo_Init(
230                         void )
231 {
232         int             i_cnt;
233         LibGoblin_ProgramInfo   *p_pginfo;
234
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__ );
240                 return -0x01;
241         }
242
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__ );
250                 return -0x02;
251         }
252
253         for( i_cnt = 0; i_cnt < LIBGOBLIN_PROGINFO_UNITS; i_cnt++ )             {
254                 p_pginfo        = PGINFO( i_cnt );
255                 ProgInfo_ClearProgInfo( p_pginfo );
256         }
257
258         gi_alloc_program_info   = LIBGOBLIN_PROGINFO_UNITS;
259         gi_max_program_info             = 0;
260         gi_now_program_info             = 0;
261         
262         return 0x00;
263 }
264
265
266 /*----------------------------------------------------------------------
267 ----------------------------------------------------------------------*/
268 #define FUNCID_LibGoblin_ProgInfo_Term  0x02
269 LIBGOBLIN_PROGINFO_EXTERN
270 int
271         ProgInfo_Term(
272                         void )
273 {
274         LibGoblin_ProgramInfo   *p_pginfo;
275
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 );
280                 }
281         }
282
283         free( gp_program_info );
284         
285         gp_program_info                 = NULL;
286         gi_alloc_program_info   = 0;
287         gi_max_program_info             = 0;
288         gi_now_program_info             = 0;
289
290         return 0x00;
291 }
292
293
294 /* EOF of drd64_.c ----------------------------------- */