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_SRCFILE
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_SRCFILE, (n))
45 /*----------------------------------------------------------------------
46 ----------------------------------------------------------------------*/
47 #define FUNCID_LibGoblin_SrcFile_GetSrcFile 0x14
48 LIBGOBLIN_SRCFILE_EXTERN
51 LibGoblin_BinaryFile *p_bfile,
54 assert( NULL != p_bfile );
56 if(( p_bfile->srcfile.i_max <= i_srcid ) || ( 0 > i_srcid )) {
57 LibBrownie_Error_SetErrorInfo(
58 DRD64_ERROR( DRD64_ERROR_PTN_FAILED_ARG, 0x01, 0x01 ),
59 LOCATION( FUNCID_LibGoblin_SrcFile_GetSrcFile ), errno,
60 (QWord)i_srcid , (QWord)p_bfile->srcfile.i_max, __LINE__ );
64 if( -0x01 == SRCFILE( p_bfile, i_srcid )->i_id ) {
65 LibBrownie_Error_SetErrorInfo(
66 DRD64_ERROR( DRD64_ERROR_PTN_FAILCALL, 0x01, 0x01 ),
67 LOCATION( FUNCID_LibGoblin_SrcFile_GetSrcFile ),
68 errno, (QWord)i_srcid , (QWord)0x00, __LINE__ );
72 return SRCFILE( p_bfile, i_srcid );
76 /*----------------------------------------------------------------------
78 ----------------------------------------------------------------------*/
79 #define FUNCID_LibGoblin_SrcFile_AllocSrcFile 0x11
80 LIBGOBLIN_SRCFILE_EXTERN
83 LibGoblin_BinaryFile *p_bfile )
87 LibGoblin_SrcFile *p_srcfile = NULL;
88 LibGoblin_SrcFile *p_srcbase;
90 assert( NULL != p_bfile );
92 if( p_bfile->srcfile.i_now < p_bfile->srcfile.i_max ) {
93 // Search Non-Used & Alloced SrcFile struct.
94 for( i_cnt = 0; i_cnt < p_bfile->srcfile.i_max; i_cnt++ ) {
95 if( -0x01 == SRCFILE( p_bfile, i_cnt )->i_id ) {
96 p_srcfile = SRCFILE( p_bfile, i_cnt );
98 goto goto_SrcFile_AllocSrcFile_dataset;
102 // Bug -- Not Exist Non-used SrcFile struct.
103 LibBrownie_Error_SetErrorInfo(
104 DRD64_ERROR( DRD64_ERROR_PTN_BUG, 0x01, 0x01 ),
105 LOCATION( FUNCID_LibGoblin_SrcFile_AllocSrcFile ), errno,
106 (QWord)p_bfile->srcfile.i_now , (QWord)p_bfile->srcfile.i_max, __LINE__ );
107 goto goto_SrcFile_AllocSrcFile_post;
110 if( p_bfile->srcfile.i_now == p_bfile->srcfile.i_alloc ) {
111 p_srcbase = (LibGoblin_SrcFile *)realloc( p_bfile->srcfile.p_srcfile,
112 sizeof( LibGoblin_SrcFile ) *
113 ( p_bfile->srcfile.i_alloc + LIBGOBLIN_SRCFILE_UNITS ) );
114 if( NULL == p_srcbase ) {
115 LibBrownie_Error_SetErrorInfo(
116 DRD64_ERROR( DRD64_ERROR_PTN_NOMEMORY, 0x01, 0x02 ),
117 LOCATION( FUNCID_LibGoblin_SrcFile_AllocSrcFile ), errno,
118 (QWord)p_bfile->srcfile.i_alloc, (QWord)p_bfile->srcfile.i_max, __LINE__ );
119 goto goto_SrcFile_AllocSrcFile_post;
122 p_bfile->srcfile.p_srcfile = p_srcbase;
123 p_bfile->srcfile.i_alloc += LIBGOBLIN_SRCFILE_UNITS;
126 i_id_now = p_bfile->srcfile.i_now;
128 goto_SrcFile_AllocSrcFile_dataset:
129 if( i_id_now == p_bfile->srcfile.i_max ) { p_bfile->srcfile.i_max++; }
130 p_srcfile = SRCFILE( p_bfile, i_id_now );
131 p_srcfile->i_id = i_id_now;
132 p_srcfile->i_bfile_id = p_bfile->i_id;
133 p_bfile->srcfile.i_now++;
135 goto_SrcFile_AllocSrcFile_post:
140 /*----------------------------------------------------------------------
141 ----------------------------------------------------------------------*/
142 #define FUNCID_LibGoblin_SrcFile_SearchSrcFile 0x31
144 SrcFile_SearchSrcFile(
145 LibGoblin_BinaryFile *p_bfile,
152 LibGoblin_SrcFile *p_srcfile;
154 assert( NULL != p_bfile );
155 assert( NULL != pstr_filename );
157 dw_hash = Common_CalcDJBhash( pstr_filename );
159 for( i_cnt = 0; i_cnt < p_bfile->srcfile.i_max; i_cnt++ ) {
160 p_srcfile = SRCFILE( p_bfile, i_cnt );
162 if( -0x01 == p_srcfile->i_id ) { continue; }
164 if( dw_hash != p_srcfile->dw_hash_filename ) { continue; }
166 i_result = strncmp( pstr_filename, p_srcfile->str_filename, DRD64_MAX_PATH );
167 if( 0x00 != i_result ) { continue; }
169 if( NULL == pstr_path )
170 { goto goto_SrcFile_SearchSrcFile_post; }
172 if( '\0' == p_srcfile->str_srcpath[0] )
173 { goto goto_SrcFile_SearchSrcFile_post; }
175 i_result = strncmp( pstr_path, p_srcfile->str_srcpath, DRD64_MAX_PATH );
176 if( 0x00 == i_result )
177 { goto goto_SrcFile_SearchSrcFile_post; }
182 goto_SrcFile_SearchSrcFile_post:
187 /*----------------------------------------------------------------------
188 ----------------------------------------------------------------------*/
189 #define FUNCID_LibGoblin_SrcFile_DispenseSrcFile 0x21
190 LIBGOBLIN_SRCFILE_EXTERN
192 SrcFile_DispenseSrcFile(
193 LibGoblin_BinaryFile *p_bfile,
197 LibGoblin_SrcFile *p_srcfile;
199 assert( NULL != p_bfile );
201 p_srcfile = SrcFile_SearchSrcFile( p_bfile, pstr_filename, pstr_path );
202 if( NULL == p_srcfile ) {
203 p_srcfile = SrcFile_AllocSrcFile( p_bfile );
206 assert( NULL != p_srcfile );
208 strncpy( p_srcfile->str_filename, pstr_filename, DRD64_MAX_PATH );
209 p_srcfile->dw_hash_filename = Common_CalcDJBhash( pstr_filename );
211 if( NULL == pstr_path )
212 { p_srcfile->str_srcpath[0] = '\0'; }
214 { strncpy( p_srcfile->str_srcpath, pstr_path, DRD64_MAX_PATH ); }
220 /*----------------------------------------------------------------------
222 ----------------------------------------------------------------------*/
223 #define FUNCID_LibGoblin_SrcFile_ClearSrcFile 0x13
225 SrcFile_ClearSrcFile(
226 LibGoblin_SrcFile *p_srcfile )
228 assert( NULL != p_srcfile );
230 memset( p_srcfile, 0x00, sizeof( LibGoblin_SrcFile ) );
232 p_srcfile->i_id = -0x01;
233 p_srcfile->i_bfile_id = -0x01;
239 /*----------------------------------------------------------------------
241 ----------------------------------------------------------------------*/
242 #define FUNCID_LibGoblin_SrcFile_FreeSrcFile 0x12
243 LIBGOBLIN_SRCFILE_EXTERN
246 LibGoblin_BinaryFile *p_bfile,
247 LibGoblin_SrcFile *p_srcfile )
251 assert( NULL != p_bfile );
252 assert( NULL != p_srcfile );
254 if( -0x01 == p_srcfile->i_id ) {
255 LibBrownie_Error_SetErrorInfo(
256 DRD64_ERROR( DRD64_ERROR_PTN_FAILCALL, 0x01, 0x01 ),
257 LOCATION( FUNCID_LibGoblin_SrcFile_FreeSrcFile ),
258 errno, (QWord)0x00 , (QWord)0x00, __LINE__ );
262 i_id = p_srcfile->i_id;
263 SrcFile_ClearSrcFile( p_srcfile );
265 if( p_bfile->srcfile.i_max == (i_id + 1) )
266 { p_bfile->srcfile.i_max--; }
268 p_bfile->srcfile.i_now--;
269 if( 0 == p_bfile->srcfile.i_now )
270 { p_bfile->srcfile.i_max = 0; }
276 /*----------------------------------------------------------------------
278 ----------------------------------------------------------------------*/
279 #define FUNCID_LibGoblin_SrcFile_Init 0x01
280 LIBGOBLIN_SRCFILE_EXTERN
283 LibGoblin_BinaryFile *p_bfile )
286 LibGoblin_SrcFile *p_srcmaster;
287 LibGoblin_SrcFile *p_srcfile;
289 assert( NULL != p_bfile );
291 if( 0 != p_bfile->srcfile.i_max ) {
292 LibBrownie_Error_SetErrorInfo(
293 DRD64_ERROR( DRD64_ERROR_PTN_FAILCALL, 0x01, 0x01 ),
294 LOCATION( FUNCID_LibGoblin_SrcFile_Init ),
295 errno, (QWord)p_bfile->srcfile.i_max , (QWord)0x00, __LINE__ );
299 p_srcmaster = (LibGoblin_SrcFile *)malloc(
300 sizeof( LibGoblin_SrcFile ) * LIBGOBLIN_SRCFILE_UNITS );
301 if( NULL == p_srcmaster ) {
302 LibBrownie_Error_SetErrorInfo(
303 DRD64_ERROR( DRD64_ERROR_PTN_NOMEMORY, 0x01, 0x02 ),
304 LOCATION( FUNCID_LibGoblin_SrcFile_Init ),
305 errno, (QWord)0x00 , (QWord)0x00, __LINE__ );
308 p_bfile->srcfile.p_srcfile = p_srcmaster;
310 for( i_cnt = 0; i_cnt < LIBGOBLIN_SRCFILE_UNITS; i_cnt++ ) {
311 p_srcfile = SRCFILE( p_bfile, i_cnt );
312 SrcFile_ClearSrcFile( p_srcfile );
315 p_bfile->srcfile.i_alloc = LIBGOBLIN_SRCFILE_UNITS;
316 p_bfile->srcfile.i_max = 0;
317 p_bfile->srcfile.i_now = 0;
323 /*----------------------------------------------------------------------
325 ----------------------------------------------------------------------*/
326 #define FUNCID_LibGoblin_SrcFile_Term 0x02
327 LIBGOBLIN_SRCFILE_EXTERN
330 LibGoblin_BinaryFile *p_bfile )
332 LibGoblin_SrcFile *p_srcfile;
334 assert( NULL != p_bfile );
336 if( 0 < p_bfile->srcfile.i_now ) {
337 for( ; p_bfile->srcfile.i_max > 0; p_bfile->srcfile.i_max-- ) {
338 p_srcfile = SRCFILE( p_bfile, (p_bfile->srcfile.i_max - 1) );
339 SrcFile_FreeSrcFile( p_bfile, p_srcfile );
343 free( p_bfile->srcfile.p_srcfile );
345 p_bfile->srcfile.p_srcfile = NULL;
346 p_bfile->srcfile.i_alloc = 0;
347 p_bfile->srcfile.i_max = 0;
348 p_bfile->srcfile.i_now = 0;
354 /* EOF of drd64_.c ----------------------------------- */