OSDN Git Service

2018/11/02(Fri) 21:34
[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 /*----------------------------------------------------------------------
41 ----------------------------------------------------------------------*/
42 LIBGOBLIN_PROGINFO_EXTERN
43 LibGoblin_ProgramInfo   *
44         ProgInfo_GetProgInfo(
45                         int             i_pgid )
46 {
47         if(( gi_max_program_info <= i_pgid ) || ( 0 > i_pgid ))
48                 { return NULL; }
49         
50         if( -0x01 == PGINFO( i_pgid )->i_id )
51                 { return NULL; }
52
53         return PGINFO( i_pgid );
54 }
55
56
57 /*----------------------------------------------------------------------
58 ----------------------------------------------------------------------*/
59 LIBGOBLIN_PROGINFO_EXTERN
60 int
61         ProgInfo_GetBinaryInfos(
62                         LibGoblin_ProgramInfo   *p_pginfo )
63 {
64         assert( NULL != p_pginfo );
65         
66         return p_pginfo->i_num_binfo;
67 }
68
69
70 /*----------------------------------------------------------------------
71 ----------------------------------------------------------------------*/
72 LIBGOBLIN_PROGINFO_EXTERN
73 LibGoblin_BinaryInfo *
74         ProgInfo_AddBinaryInfo(
75                         LibGoblin_ProgramInfo   *p_pginfo,
76                         const char      *pstr_binfilename,
77                         int                     i_req_bid )
78 {
79         LibGoblin_BinaryInfo    *p_binfo        = NULL;
80
81         assert( NULL != p_pginfo );
82
83         // Alloc BinaryInfo ---
84         p_binfo = BinaryInfo_AllocBinInfo( p_pginfo, pstr_binfilename, i_req_bid );
85         if( NULL == p_binfo )   {
86                 return NULL;
87         }
88
89         if( -1 == i_req_bid )   {
90                 p_binfo->i_filetype     = LIBGOBLIN_BINFO_FILE_EXEC;
91                 p_pginfo->p_binfo[LIBGOBLIN_BINFO_FILE_EXEC]    = p_binfo;
92         }
93         else    {
94                 p_binfo->i_filetype     = LIBGOBLIN_BINFO_FILE_LIBRARY;
95         }
96         p_pginfo->i_num_binfo++;
97
98         return p_binfo;
99 }
100
101
102 /*----------------------------------------------------------------------
103 ----------------------------------------------------------------------*/
104 void
105         ProgInfo_ClearProgInfo(
106                         LibGoblin_ProgramInfo   *p_pginfo )
107 {
108         assert( NULL != p_pginfo );
109
110         memset( p_pginfo, 0x00, sizeof( LibGoblin_ProgramInfo ) );
111
112         p_pginfo->i_id  = -0x01;
113
114         return;
115 }
116
117
118 /*----------------------------------------------------------------------
119 ----------------------------------------------------------------------*/
120 LIBGOBLIN_PROGINFO_EXTERN
121 LibGoblin_ProgramInfo   *
122         ProgInfo_AllocProgInfo(
123                         void )
124 {
125         int                                     i_cnt;
126         int                                     i_id_now        = -0x01;
127         LibGoblin_ProgramInfo   *p_pginfo       = NULL;
128         LibGoblin_ProgramInfo   *p_pgbase;
129
130         if( gi_now_program_info < gi_max_program_info ) {
131                 for( i_cnt = 0; i_cnt < gi_max_program_info; i_cnt++ )  {
132                         if( -0x01 == PGINFO( i_cnt )->i_id )    {
133                                 p_pginfo        = PGINFO( i_cnt );
134                                 i_id_now        = i_cnt;
135                                 goto    goto_ProgInfo_AllocProgInfo_dataset;
136                         }
137                 }
138
139                 goto    goto_ProgInfo_AllocProgInfo_post;
140         }
141
142         if( gi_now_program_info == gi_alloc_program_info )      {
143                 p_pgbase        = (LibGoblin_ProgramInfo *)realloc( gp_program_info,
144                                                                 sizeof( LibGoblin_ProgramInfo ) * 
145                                                                 ( gi_alloc_program_info + LIBGOBLIN_PROGINFO_UNITS ) );
146                 if( NULL == p_pgbase )  {
147                         goto    goto_ProgInfo_AllocProgInfo_post;
148                 }
149
150                 gp_program_info = p_pgbase;
151                 gi_alloc_program_info   += LIBGOBLIN_PROGINFO_UNITS;
152         }
153
154         i_id_now        = gi_now_program_info;
155
156 goto_ProgInfo_AllocProgInfo_dataset:
157         if( i_id_now == gi_max_program_info )   { gi_max_program_info++; }
158         p_pginfo                = PGINFO( i_id_now );
159         p_pginfo->i_id  = i_id_now;
160         gi_now_program_info++;
161
162 goto_ProgInfo_AllocProgInfo_post:
163         return p_pginfo;
164 }
165
166
167 /*----------------------------------------------------------------------
168 ----------------------------------------------------------------------*/
169 LIBGOBLIN_PROGINFO_EXTERN
170 int
171         ProgInfo_FreeProgInfo(
172                         LibGoblin_ProgramInfo   *p_pginfo )
173 {
174         int             i_id;
175         
176         assert( NULL != p_pginfo );
177
178         if( -0x01 == p_pginfo->i_id )   { return 0x00; }
179
180         i_id    = p_pginfo->i_id;
181         ProgInfo_ClearProgInfo( p_pginfo );
182
183         if( gi_max_program_info == (i_id + 1) )
184                 { gi_max_program_info--; }
185         
186         gi_now_program_info--;
187         if( 0 == gi_now_program_info )  { gi_max_program_info = 0; }
188
189         return 0x00;
190 }
191
192
193 /*----------------------------------------------------------------------
194 ----------------------------------------------------------------------*/
195 LIBGOBLIN_PROGINFO_EXTERN
196 int
197         ProgInfo_Init(
198                         void )
199 {
200         int             i_cnt;
201         LibGoblin_ProgramInfo   *p_pginfo;
202
203         if( 0 != gi_max_program_info )  {
204                 return -0x01;
205         }
206
207         gp_program_info = (LibGoblin_ProgramInfo *)malloc(
208                                                 sizeof( LibGoblin_ProgramInfo ) * LIBGOBLIN_PROGINFO_UNITS );
209         if( NULL == gp_program_info )   {
210                 return -0x02;
211         }
212
213         for( i_cnt = 0; i_cnt < LIBGOBLIN_PROGINFO_UNITS; i_cnt++ )             {
214                 p_pginfo        = PGINFO( i_cnt );
215                 ProgInfo_ClearProgInfo( p_pginfo );
216         }
217
218         gi_alloc_program_info   = LIBGOBLIN_PROGINFO_UNITS;
219         gi_max_program_info             = 0;
220         gi_now_program_info             = 0;
221         
222         return 0x00;
223 }
224
225
226 /*----------------------------------------------------------------------
227 ----------------------------------------------------------------------*/
228 LIBGOBLIN_PROGINFO_EXTERN
229 int
230         ProgInfo_Term(
231                         void )
232 {
233         LibGoblin_ProgramInfo   *p_pginfo;
234
235         if( 0 < gi_now_program_info )   {
236                 for( ; gi_max_program_info > 0; gi_max_program_info-- ) {
237                         p_pginfo        = PGINFO( gi_max_program_info - 1 );
238                         ProgInfo_FreeProgInfo( p_pginfo );
239                 }
240         }
241
242         free( gp_program_info );
243         
244         gp_program_info                 = NULL;
245         gi_alloc_program_info   = 0;
246         gi_max_program_info             = 0;
247         gi_now_program_info             = 0;
248
249         return 0x00;
250 }
251
252
253 /* EOF of drd64_.c ----------------------------------- */