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_LIBEDITTEXT_FILE
38 #include"drd64_libedittext.h"
40 #define LOCATION(n) DRD64_ERR_LOCATION( \
41 DRD64_ERROR_MODULE_LIBEDITTEXT, DRD64_ERROR_ARCH_NODEPEND, \
42 DRD64_SRC_LIBEDITTEXT_FILE_SRCID, (n))
45 /*----------------------------------------------------------------------
46 ----------------------------------------------------------------------*/
47 #define FUNCID_LibEditText_File_CatPathFilename 0x01
49 LibEditText_File_CatPathFilename(
57 if((NULL == pstr_fullpath) ||( NULL == pstr_path) || (NULL == pstr_filename )) {
58 LibBrownie_Error_SetErrorInfo(
59 DRD64_ERROR( DRD64_ERROR_PTN_FAILED_ARG, 0x01, 0x01 ),
60 LOCATION( FUNCID_LibEditText_File_CatPathFilename ),
61 errno, (QWord)0x00, (QWord)0x00, __LINE__ );
66 sz_path = strnlen( pstr_path, DRD64_MAX_PATH );
67 sz_fname = strnlen( pstr_filename, DRD64_MAX_PATH );
68 if( DRD64_MAX_PATH < (sz_path + sz_fname) ) {
69 LibBrownie_Error_SetErrorInfo(
70 DRD64_ERROR( DRD64_ERROR_PTN_LESSBUFFER, 0x01, 0x02 ),
71 LOCATION( FUNCID_LibEditText_File_CatPathFilename ),
72 errno, (QWord)sz_path, (QWord)sz_fname, __LINE__ );
77 strncpy( pstr_fullpath, pstr_path, DRD64_MAX_PATH );
78 strcat( pstr_fullpath, "/" );
79 strncat( pstr_fullpath, pstr_filename, DRD64_MAX_PATH );
85 /*----------------------------------------------------------------------
86 ----------------------------------------------------------------------*/
87 #define FUNCID_LibEditText_File_ReadTextFile 0x02
89 LibEditText_File_ReadTextFile(
90 LibEditText_TextInfo *p_tinfo,
105 dw_allocsize = dw_maxlength + DRD64_LIBEDITTEXT_DEFAULT_READBUF + 1;
106 pb_buffer = (Byte *)malloc( dw_allocsize );
107 if( NULL == pb_buffer ) {
108 LibBrownie_Error_SetErrorInfo(
109 DRD64_ERROR( DRD64_ERROR_PTN_NOMEMORY, 0x01, 0x01 ),
110 LOCATION( FUNCID_LibEditText_File_ReadTextFile ),
111 errno, (QWord)dw_allocsize, (QWord)0x00, __LINE__ );
115 memset( pb_buffer, 0x00, dw_maxlength + 1 );
117 i_fd = open( pstr_filepath, O_RDWR );
119 LibBrownie_Error_SetErrorInfo(
120 DRD64_ERROR( DRD64_ERROR_PTN_SYSCALL, 0x01, 0x02 ),
121 LOCATION( FUNCID_LibEditText_File_ReadTextFile ),
122 errno, (QWord)i_fd, (QWord)0x00, __LINE__ );
125 goto goto_LibEditText_File_ReadTextFile_post;
127 p_tinfo->i_fd = i_fd;
131 pb_start = pb_buffer;
134 sz_read = read( p_tinfo->i_fd, pb_start, DRD64_LIBEDITTEXT_DEFAULT_READBUF );
136 LibBrownie_Error_SetErrorInfo(
137 DRD64_ERROR( DRD64_ERROR_PTN_SYSCALL, 0x01, 0x03 ),
138 LOCATION( FUNCID_LibEditText_File_ReadTextFile ),
139 errno, (QWord)sz_read, (QWord)0x00, __LINE__ );
142 goto goto_LibEditText_File_ReadTextFile_post;
145 dw_fsize -= (DWord)sz_read;
146 for( ; 0 < sz_read; sz_read--, dw_pos++ ) {
147 if( '\n' == *pb_now ) {
148 i_result = LibEditText_LineCtrl_AppendLine(
149 p_tinfo, pb_buffer, (DWord)(pb_now - pb_buffer + 1), 0x01);
153 memcpy( pb_buffer, (pb_now + 1), sz_read - 1);
154 memset( pb_buffer + sz_read - 1, 0x00, dw_allocsize - sz_read );
157 pb_start = pb_buffer;
163 }while( 0 < dw_fsize );
165 if( dw_nowrow + 1 == p_tinfo->dw_maxline ) {
166 i_result = LibEditText_LineCtrl_AppendLine(
167 p_tinfo, pb_buffer, (DWord)(pb_now - pb_buffer), 0x01);
170 else if( dw_nowrow != p_tinfo->dw_maxline ) {
171 LibBrownie_Error_SetErrorInfo(
172 DRD64_ERROR( DRD64_ERROR_PTN_BUG, 0x01, 0x04 ),
173 LOCATION( FUNCID_LibEditText_File_ReadTextFile ),
174 errno, (QWord)dw_nowrow, (QWord)p_tinfo->dw_maxline, __LINE__ );
179 i_result = LibEditText_Section_ConstractSection( p_tinfo );
180 if( 0x00 != i_result ) {
181 LibBrownie_Error_SetErrorInfo(
182 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x05 ),
183 LOCATION( FUNCID_LibEditText_File_ReadTextFile ),
184 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
189 goto_LibEditText_File_ReadTextFile_post:
196 /*----------------------------------------------------------------------
198 ----------------------------------------------------------------------*/
199 #define FUNCID_LibEditText_OpenTextFile 0x03
202 LibEditText_OpenTextFile(
204 char *pstr_filename )
207 LibFileType_FileType t_ftype;
208 LibEditText_TextInfo *p_tinfo;
209 char str_filepath[DRD64_MAX_PATH + 1];
214 i_result = LibEditText_File_CatPathFilename( str_filepath, pstr_path, pstr_filename );
215 if( 0x00 != i_result ) {
216 LibBrownie_Error_SetErrorInfo(
217 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x01 ),
218 LOCATION( FUNCID_LibEditText_OpenTextFile ),
219 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
224 /* Get FileSize & Judge text-file & Count TextLines */
225 i_result = LibFileType_CheckFileType( &t_ftype, str_filepath );
226 if( 0x00 != i_result ) {
227 LibBrownie_Error_SetErrorInfo(
228 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x02 ),
229 LOCATION( FUNCID_LibEditText_OpenTextFile ),
230 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
234 if( DRD64_LIBFILETYPE_TEXT != t_ftype.b_type ) { return 0x03; }
236 /* Alloc TextInfo Struct. */
237 p_tinfo = LibEditText_System_AllocTextInfo();
238 if( NULL == p_tinfo ) {
239 LibBrownie_Error_SetErrorInfo(
240 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x04 ),
241 LOCATION( FUNCID_LibEditText_OpenTextFile ),
242 errno, (QWord)0x00, (QWord)0x00, __LINE__ );
247 /* Alloc File-Buffer */
248 dw_maxline = (DWord)t_ftype.dw_lines;
249 dw_bufline = (DWord)((double)dw_maxline
250 * (double)DRD64_LIBEDITTEXT_DEFAULT_LINES_SAFETY_FACTOR);
251 dw_bufsize = t_ftype.dw_filesize
252 + (dw_maxline * DRD64_LIBEDITTEXT_DEFAULT_RESERVEBUF_INLINE)
253 + ((dw_bufline - dw_maxline) * DRD64_LIBEDITTEXT_DEFAULT_BUFSIZE_RESERVELINE);
254 i_result = LibEditText_System_InitTextInfo( p_tinfo, t_ftype.w_subtype,
255 dw_maxline, dw_bufline, dw_bufsize );
256 if( 0x00 != i_result ) {
257 LibBrownie_Error_SetErrorInfo(
258 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x05 ),
259 LOCATION( FUNCID_LibEditText_OpenTextFile ),
260 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
265 strncpy( p_tinfo->str_pathname, pstr_path, DRD64_MAX_PATH );
266 strncpy( p_tinfo->str_filename, pstr_filename, DRD64_MAX_PATH );
268 /* Read Textfile & Generate LineInfo */
269 i_result = LibEditText_File_ReadTextFile(
270 p_tinfo, str_filepath, t_ftype.dw_filesize, t_ftype.dw_maxlength );
271 if( 0x00 != i_result ) {
272 LibBrownie_Error_SetErrorInfo(
273 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x06 ),
274 LOCATION( FUNCID_LibEditText_OpenTextFile ),
275 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
280 return p_tinfo->i_id;
284 /*----------------------------------------------------------------------
286 ----------------------------------------------------------------------*/
287 #define FUNCID_LibEditText_CreateTextFile 0x04
290 LibEditText_CreateTextFile(
292 char *pstr_filename )
299 LibFileType_FileType t_ftype;
300 LibEditText_TextInfo *p_tinfo;
301 LibEditText_LineInfo *p_line;
302 char str_filepath[DRD64_MAX_PATH + 1];
304 /* Alloc TextInfo Struct. */
305 p_tinfo = LibEditText_System_AllocTextInfo();
306 if( NULL == p_tinfo ) {
307 LibBrownie_Error_SetErrorInfo(
308 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x01 ),
309 LOCATION( FUNCID_LibEditText_CreateTextFile ),
310 errno, (QWord)0x00, (QWord)0x00, __LINE__ );
315 if(( NULL != pstr_path) && (NULL != pstr_filename)) {
316 i_result = LibEditText_File_CatPathFilename(
317 str_filepath, pstr_path, pstr_filename );
318 if( 0x00 != i_result ) {
319 LibBrownie_Error_SetErrorInfo(
320 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x02 ),
321 LOCATION( FUNCID_LibEditText_CreateTextFile ),
322 errno, (QWord)0x00, (QWord)0x00, __LINE__ );
327 i_result = LibFileType_GetFileType_fromFileName( &t_ftype, str_filepath );
328 if( DRD64_LIBFILETYPE_BINARY == t_ftype.b_type ) {
329 t_ftype.b_type = DRD64_LIBFILETYPE_TEXT;
330 t_ftype.w_subtype = DRD64_LIBFILETYPE_SUB_TEXT;
333 strncpy( p_tinfo->str_pathname, pstr_path, DRD64_MAX_PATH );
334 strncpy( p_tinfo->str_filename, pstr_filename, DRD64_MAX_PATH );
337 t_ftype.b_type = DRD64_LIBFILETYPE_TEXT;
338 t_ftype.w_subtype = DRD64_LIBFILETYPE_SUB_TEXT;
340 if( NULL == pstr_path )
341 { strncpy( p_tinfo->str_pathname, ".", DRD64_MAX_PATH ); }
343 { strncpy( p_tinfo->str_pathname, pstr_path, DRD64_MAX_PATH ); }
345 if( NULL == pstr_filename ) {
346 dw_nonnames = LibEditText_System_GetNoneNameFiles();
347 snprintf( p_tinfo->str_filename, DRD64_MAX_PATH, "noname%03u.txt", dw_nonnames );
350 { strncpy( p_tinfo->str_filename, pstr_filename, DRD64_MAX_PATH ); }
354 /* Alloc File-Buffer */
356 dw_bufline = DRD64_LIBEDITTEXT_DEFAULT_CREATETEXTFILE_LINES;
357 dw_bufsize = (DRD64_LIBEDITTEXT_DEFAULT_RESERVEBUF_INLINE
358 + DRD64_LIBEDITTEXT_DEFAULT_BUFSIZE_RESERVELINE) * dw_bufline;
360 i_result = LibEditText_System_InitTextInfo( p_tinfo, 0x0001,
361 dw_maxline, dw_bufline, dw_bufsize );
362 if( 0x00 != i_result ) {
363 LibBrownie_Error_SetErrorInfo(
364 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x03 ),
365 LOCATION( FUNCID_LibEditText_CreateTextFile ),
366 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
371 /* Generate LineInfo (Only First-Line) ---*/
372 p_line = LibEditText_LineInfo_GetEmptyLineInfo( p_tinfo,
373 DRD64_LIBEDITTEXT_DEFAULT_RESERVEBUF_INLINE
374 + DRD64_LIBEDITTEXT_DEFAULT_BUFSIZE_RESERVELINE );
377 p_tinfo->dw_line_start = p_line->dw_id;
378 p_tinfo->dw_line_end = p_line->dw_id;
380 i_result = LibEditText_LineInfo_AddSortChain( p_tinfo, p_line );
381 if( 0x00 != i_result ) {
382 LibBrownie_Error_SetErrorInfo(
383 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x04 ),
384 LOCATION( FUNCID_LibEditText_CreateTextFile ),
385 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
390 i_result = LibEditText_Section_ConstractSection( p_tinfo );
391 if( 0x00 != i_result ) {
392 LibBrownie_Error_SetErrorInfo(
393 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x05 ),
394 LOCATION( FUNCID_LibEditText_CreateTextFile ),
395 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
400 return p_tinfo->i_id;
404 /*----------------------------------------------------------------------
406 ----------------------------------------------------------------------*/
407 #define FUNCID_LibEditText_SaveTextFile 0x05
410 LibEditText_SaveTextFile(
423 char str_filepath_tmp[DRD64_MAX_PATH];
424 LibEditText_TextInfo *p_tinfo;
425 LibEditText_LineInfo *p_line;
427 if( 0 > i_tinfoid ) {
428 LibBrownie_Error_SetErrorInfo(
429 DRD64_ERROR( DRD64_ERROR_PTN_FAILED_ARG, 0x01, 0x01 ),
430 LOCATION( FUNCID_LibEditText_SaveTextFile ),
431 errno, (QWord)i_tinfoid, (QWord)0x00, __LINE__ );
435 p_tinfo = LibEditText_System_GetTextInfo( i_tinfoid );
436 if( NULL == p_tinfo ) {
437 LibBrownie_Error_SetErrorInfo(
438 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x02 ),
439 LOCATION( FUNCID_LibEditText_SaveTextFile ),
440 errno, (QWord)i_tinfoid, (QWord)0x00, __LINE__ );
445 if(( NULL == pstr_path ) || ( NULL == pstr_filename)) {
446 i_result = LibEditText_File_CatPathFilename(
447 str_filepath_tmp, p_tinfo->str_pathname, p_tinfo->str_filename );
450 i_result = LibEditText_File_CatPathFilename(
451 str_filepath_tmp, pstr_path, pstr_filename );
453 if( 0x00 != i_result ) {
454 LibBrownie_Error_SetErrorInfo(
455 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x03 ),
456 LOCATION( FUNCID_LibEditText_SaveTextFile ),
457 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
462 pstr_filepath = str_filepath_tmp;
464 t_mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
465 i_fd = open( pstr_filepath, O_RDWR | O_CREAT, t_mode );
467 LibBrownie_Error_SetErrorInfo(
468 DRD64_ERROR( DRD64_ERROR_PTN_SYSCALL, 0x01, 0x04 ),
469 LOCATION( FUNCID_LibEditText_SaveTextFile ),
470 errno, (QWord)i_fd, (QWord)0x00, __LINE__ );
475 if( -1 < p_tinfo->i_fd ) {
476 close( p_tinfo->i_fd );
478 p_tinfo->i_fd = i_fd;
479 if(( NULL != pstr_path ) && ( NULL != pstr_filename)) {
480 strncpy( p_tinfo->str_pathname, pstr_path, DRD64_MAX_PATH );
481 strncpy( p_tinfo->str_filename, pstr_filename, DRD64_MAX_PATH );
484 t_offset = lseek( p_tinfo->i_fd, 0, SEEK_SET );
485 if( -0x01 == t_offset ) {
486 LibBrownie_Error_SetErrorInfo(
487 DRD64_ERROR( DRD64_ERROR_PTN_LIBCALL, 0x01, 0x10 ),
488 LOCATION( FUNCID_LibEditText_SaveTextFile ),
489 errno, (QWord)t_offset, (QWord)i_fd, __LINE__ );
494 p_line = p_tinfo->p_lineinfo;
495 for( dw_nowrow = 0; dw_nowrow < p_tinfo->dw_maxline; dw_nowrow++ ) {
496 pb_now = p_tinfo->pb_text + p_line->dw_start;
497 if(( dw_nowrow + 1 < p_tinfo->dw_maxline )
498 && ( '\n' != *(pb_now + p_line->dw_strlen - 1))) {
499 LibBrownie_Error_SetErrorInfo(
500 DRD64_ERROR( DRD64_ERROR_PTN_BUG, 0x01, 0x12 ),
501 LOCATION( FUNCID_LibEditText_SaveTextFile ),
502 errno, (QWord)dw_nowrow, (QWord)p_tinfo->dw_maxline, __LINE__ );
507 sz_write = write( p_tinfo->i_fd, (void *)pb_now, (size_t)p_line->dw_strlen );
508 if( (size_t)p_line->dw_strlen != sz_write ) {
509 LibBrownie_Error_SetErrorInfo(
510 DRD64_ERROR( DRD64_ERROR_PTN_SYSCALL, 0x01, 0x13 ),
511 LOCATION( FUNCID_LibEditText_SaveTextFile ),
512 errno, (QWord)sz_write, (QWord)p_line->dw_strlen, __LINE__ );
517 p_line = LINFO(p_tinfo, p_line->dw_next);
519 if( NULL != p_line ) {
520 LibBrownie_Error_SetErrorInfo(
521 DRD64_ERROR( DRD64_ERROR_PTN_BUG, 0x01, 0x20 ),
522 LOCATION( FUNCID_LibEditText_SaveTextFile ),
523 errno, (QWord)0x00, (QWord)0x00, __LINE__ );
532 /*----------------------------------------------------------------------
534 ----------------------------------------------------------------------*/
535 #define FUNCID_LibEditText_CloseFile 0x06
538 LibEditText_CloseFile(
542 LibEditText_TextInfo *p_tinfo;
544 p_tinfo = LibEditText_System_GetTextInfo( i_tinfoid );
545 if( NULL == p_tinfo ) {
546 LibBrownie_Error_SetErrorInfo(
547 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x01 ),
548 LOCATION( FUNCID_LibEditText_CloseFile ),
549 errno, (QWord)i_tinfoid, (QWord)0x00, __LINE__ );
554 close( p_tinfo->i_fd);
557 i_result = LibEditText_System_ClearTextInfo( p_tinfo );
558 if( 0x00 != i_result ) {
559 LibBrownie_Error_SetErrorInfo(
560 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x02 ),
561 LOCATION( FUNCID_LibEditText_CloseFile ),
562 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
567 i_result = LibEditText_System_FreeTextInfo( p_tinfo );
568 if( 0x00 != i_result ) {
569 LibBrownie_Error_SetErrorInfo(
570 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x03 ),
571 LOCATION( FUNCID_LibEditText_CloseFile ),
572 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
581 /* EOF of drd64_.c ---------------------------------- */