OSDN Git Service

(LibGoblin)
[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_items;
143         int                                     i_id_now        = -0x01;
144         LibGoblin_ProgramInfo   *p_pginfo       = NULL;
145         LibGoblin_ProgramInfo   *p_pgtemp;
146         LibGoblin_ProgramInfo   *p_pgbase;
147
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 );
152                                 i_id_now        = i_cnt;
153                                 goto    goto_ProgInfo_AllocProgInfo_dataset;
154                         }
155                 }
156
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;
162         }
163
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;
174                 }
175
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 );
179                 }
180
181                 gp_program_info = p_pgbase;
182                 gi_alloc_program_info   += LIBGOBLIN_PROGINFO_UNITS;
183         }
184
185         i_id_now        = gi_now_program_info;
186
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++;
192
193 goto_ProgInfo_AllocProgInfo_post:
194         return p_pginfo;
195 }
196
197
198 /*----------------------------------------------------------------------
199 ----------------------------------------------------------------------*/
200 #define FUNCID_LibGoblin_ProgInfo_FreeProgInfo  0x12
201 LIBGOBLIN_PROGINFO_EXTERN
202 int
203         ProgInfo_FreeProgInfo(
204                         LibGoblin_ProgramInfo   *p_pginfo )
205 {
206         int             i_id;
207         
208         assert( NULL != p_pginfo );
209
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__ );
215                 return 0x00;
216         }
217
218         i_id    = p_pginfo->i_id;
219         ProgInfo_ClearProgInfo( p_pginfo );
220
221         if( gi_max_program_info == (i_id + 1) )
222                 { gi_max_program_info--; }
223         
224         gi_now_program_info--;
225         if( 0 == gi_now_program_info )  { gi_max_program_info = 0; }
226
227         return 0x00;
228 }
229
230
231 /*----------------------------------------------------------------------
232 ----------------------------------------------------------------------*/
233 #define FUNCID_LibGoblin_ProgInfo_Init  0x01
234 LIBGOBLIN_PROGINFO_EXTERN
235 int
236         ProgInfo_Init(
237                         void )
238 {
239         int             i_cnt;
240         LibGoblin_ProgramInfo   *p_pginfo;
241
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__ );
247                 return -0x01;
248         }
249
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__ );
257                 return -0x02;
258         }
259
260         for( i_cnt = 0; i_cnt < LIBGOBLIN_PROGINFO_UNITS; i_cnt++ )             {
261                 p_pginfo        = PGINFO( i_cnt );
262                 ProgInfo_ClearProgInfo( p_pginfo );
263         }
264
265         gi_alloc_program_info   = LIBGOBLIN_PROGINFO_UNITS;
266         gi_max_program_info             = 0;
267         gi_now_program_info             = 0;
268         
269         return 0x00;
270 }
271
272
273 /*----------------------------------------------------------------------
274 ----------------------------------------------------------------------*/
275 #define FUNCID_LibGoblin_ProgInfo_Term  0x02
276 LIBGOBLIN_PROGINFO_EXTERN
277 int
278         ProgInfo_Term(
279                         void )
280 {
281         LibGoblin_ProgramInfo   *p_pginfo;
282
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 );
287                 }
288         }
289
290         free( gp_program_info );
291         
292         gp_program_info                 = NULL;
293         gi_alloc_program_info   = 0;
294         gi_max_program_info             = 0;
295         gi_now_program_info             = 0;
296
297         return 0x00;
298 }
299
300
301 /* EOF of drd64_.c ----------------------------------- */