OSDN Git Service

74b2d1801225c9d7498cb55de05a7c1a3f9194f6
[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_pginfo->p_binfo[LIBGOBLIN_BINFO_FILE_EXEC]  = p_binfo; }
91         p_pginfo->i_num_binfo++;
92
93         return p_binfo;
94 }
95
96
97 /*----------------------------------------------------------------------
98 ----------------------------------------------------------------------*/
99 void
100         ProgInfo_ClearProgInfo(
101                         LibGoblin_ProgramInfo   *p_pginfo )
102 {
103         assert( NULL != p_pginfo );
104
105         memset( p_pginfo, 0x00, sizeof( LibGoblin_ProgramInfo ) );
106
107         p_pginfo->i_id  = -0x01;
108
109         return;
110 }
111
112
113 /*----------------------------------------------------------------------
114 ----------------------------------------------------------------------*/
115 LIBGOBLIN_PROGINFO_EXTERN
116 LibGoblin_ProgramInfo   *
117         ProgInfo_AllocProgInfo(
118                         void )
119 {
120         int                                     i_cnt;
121         int                                     i_id_now        = -0x01;
122         LibGoblin_ProgramInfo   *p_pginfo       = NULL;
123         LibGoblin_ProgramInfo   *p_pgbase;
124
125         if( gi_now_program_info < gi_max_program_info ) {
126                 for( i_cnt = 0; i_cnt < gi_max_program_info; i_cnt++ )  {
127                         if( -0x01 == PGINFO( i_cnt )->i_id )    {
128                                 p_pginfo        = PGINFO( i_cnt );
129                                 i_id_now        = i_cnt;
130                                 goto    goto_ProgInfo_AllocProgInfo_dataset;
131                         }
132                 }
133
134                 goto    goto_ProgInfo_AllocProgInfo_post;
135         }
136
137         if( gi_now_program_info == gi_alloc_program_info )      {
138                 p_pgbase        = (LibGoblin_ProgramInfo *)realloc( gp_program_info,
139                                                                 sizeof( LibGoblin_ProgramInfo ) * 
140                                                                 ( gi_alloc_program_info + LIBGOBLIN_PROGINFO_UNITS ) );
141                 if( NULL == p_pgbase )  {
142                         goto    goto_ProgInfo_AllocProgInfo_post;
143                 }
144
145                 gp_program_info = p_pgbase;
146                 gi_alloc_program_info   += LIBGOBLIN_PROGINFO_UNITS;
147         }
148
149         i_id_now        = gi_now_program_info;
150
151 goto_ProgInfo_AllocProgInfo_dataset:
152         if( i_id_now == gi_max_program_info )   { gi_max_program_info++; }
153         p_pginfo                = PGINFO( i_id_now );
154         p_pginfo->i_id  = i_id_now;
155         gi_now_program_info++;
156
157 goto_ProgInfo_AllocProgInfo_post:
158         return p_pginfo;
159 }
160
161
162 /*----------------------------------------------------------------------
163 ----------------------------------------------------------------------*/
164 LIBGOBLIN_PROGINFO_EXTERN
165 int
166         ProgInfo_FreeProgInfo(
167                         LibGoblin_ProgramInfo   *p_pginfo )
168 {
169         int             i_id;
170         
171         assert( NULL != p_pginfo );
172
173         if( -0x01 == p_pginfo->i_id )   { return 0x00; }
174
175         i_id    = p_pginfo->i_id;
176         ProgInfo_ClearProgInfo( p_pginfo );
177
178         if( gi_max_program_info == (i_id + 1) )
179                 { gi_max_program_info--; }
180         
181         gi_now_program_info--;
182         if( 0 == gi_now_program_info )  { gi_max_program_info = 0; }
183
184         return 0x00;
185 }
186
187
188 /*----------------------------------------------------------------------
189 ----------------------------------------------------------------------*/
190 LIBGOBLIN_PROGINFO_EXTERN
191 int
192         ProgInfo_Init(
193                         void )
194 {
195         int             i_cnt;
196         LibGoblin_ProgramInfo   *p_pginfo;
197
198         if( 0 != gi_max_program_info )  {
199                 return -0x01;
200         }
201
202         gp_program_info = (LibGoblin_ProgramInfo *)malloc(
203                                                 sizeof( LibGoblin_ProgramInfo ) * LIBGOBLIN_PROGINFO_UNITS );
204         if( NULL == gp_program_info )   {
205                 return -0x02;
206         }
207
208         for( i_cnt = 0; i_cnt < LIBGOBLIN_PROGINFO_UNITS; i_cnt++ )             {
209                 p_pginfo        = PGINFO( i_cnt );
210                 ProgInfo_ClearProgInfo( p_pginfo );
211         }
212
213         gi_alloc_program_info   = LIBGOBLIN_PROGINFO_UNITS;
214         gi_max_program_info             = 0;
215         gi_now_program_info             = 0;
216         
217         return 0x00;
218 }
219
220
221 /*----------------------------------------------------------------------
222 ----------------------------------------------------------------------*/
223 LIBGOBLIN_PROGINFO_EXTERN
224 int
225         ProgInfo_Term(
226                         void )
227 {
228         LibGoblin_ProgramInfo   *p_pginfo;
229
230         if( 0 < gi_now_program_info )   {
231                 for( ; gi_max_program_info > 0; gi_max_program_info-- ) {
232                         p_pginfo        = PGINFO( gi_max_program_info - 1 );
233                         ProgInfo_FreeProgInfo( p_pginfo );
234                 }
235         }
236
237         free( gp_program_info );
238         
239         gp_program_info                 = NULL;
240         gi_alloc_program_info   = 0;
241         gi_max_program_info             = 0;
242         gi_now_program_info             = 0;
243
244         return 0x00;
245 }
246
247
248 /* EOF of drd64_.c ----------------------------------- */