OSDN Git Service

* WorkBackup: 2015/06/23(Tue) AM 05:51 (Testing & DeBugging LibEditText_LineCtrl_Spli...
[drdeamon64/drdeamon64.git] / libedittext / drd64_libedittext_file.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_LIBEDITTEXT_FILE
38 #include"drd64_libedittext.h"
39
40 #define LOCATION(n)     DRD64_ERR_LOCATION( \
41                                                 DRD64_ERROR_MODULE_LIBEDITTEXT, DRD64_ERROR_ARCH_NODEPEND, \
42                                                 DRD64_SRC_LIBEDITTEXT_FILE_SRCID, (n))
43
44
45 /*----------------------------------------------------------------------
46 ----------------------------------------------------------------------*/
47 #define FUNCID_LibEditText_File_CatPathFilename 0x01
48 int
49         LibEditText_File_CatPathFilename(
50                         char    *pstr_fullpath,
51                         char    *pstr_path,
52                         char    *pstr_filename )
53 {
54         size_t  sz_path;
55         size_t  sz_fname;
56         
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__ ); 
62
63                 return -0x01;
64         }
65
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__ ); 
73
74                 return -0x02;
75         }
76
77         strncpy( pstr_fullpath, pstr_path, DRD64_MAX_PATH );
78         strcat( pstr_fullpath, "/" );
79         strncat( pstr_fullpath, pstr_filename, DRD64_MAX_PATH );
80
81         return 0x00;
82 }
83
84
85 /*----------------------------------------------------------------------
86 ----------------------------------------------------------------------*/
87 #define FUNCID_LibEditText_File_ReadTextFile    0x02
88 int
89         LibEditText_File_ReadTextFile(
90                         LibEditText_TextInfo            *p_tinfo,
91                         char    *pstr_filepath,
92                         DWord   dw_fsize,
93                         DWord   dw_maxlength )
94 {
95         int             i_result        = 0x00;
96         int             i_fd;
97         Byte    *pb_start;
98         Byte    *pb_buffer;
99         Byte    *pb_now;
100         ssize_t sz_read;
101         DWord   dw_nowrow;
102         DWord   dw_allocsize;
103         DWord   dw_pos;
104
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__ ); 
112
113                 return -0x01;
114         }
115         memset( pb_buffer, 0x00, dw_maxlength + 1 );
116
117         i_fd    = open( pstr_filepath, O_RDWR );
118         if( 0x00 > i_fd )       {
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__ ); 
123
124                 i_result        = -0x02;
125                 goto goto_LibEditText_File_ReadTextFile_post;
126         }
127         p_tinfo->i_fd   = i_fd;
128
129         dw_nowrow       = 0;
130         dw_pos          = 0;
131         pb_start        = pb_buffer;
132         pb_now          = pb_start;
133         do      {
134                 sz_read = read( p_tinfo->i_fd, pb_start, DRD64_LIBEDITTEXT_DEFAULT_READBUF );
135                 if( 0 >= sz_read )      {
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__ ); 
140
141                         i_result        = -0x03;
142                         goto goto_LibEditText_File_ReadTextFile_post;
143                 }
144
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);
150                                 dw_nowrow++;
151
152                                 if( 1 < sz_read )       {
153                                         memcpy( pb_buffer, (pb_now + 1), sz_read - 1);
154                                         memset( pb_buffer + sz_read - 1, 0x00, dw_allocsize - sz_read );
155                                 }
156
157                                 pb_start                = pb_buffer;
158                                 pb_now                  = pb_start;
159                         }
160                         else    { pb_now++; }
161                 }
162                 pb_start        = pb_now;
163         }while( 0 < dw_fsize );
164
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);
168                 dw_nowrow++;
169         }
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__ ); 
175
176                 i_result        =  -0x04;
177         }
178
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__ ); 
185
186                 return i_result;
187         }
188
189 goto_LibEditText_File_ReadTextFile_post:
190         free( pb_buffer );
191
192         return i_result;
193 }
194
195
196 /*----------------------------------------------------------------------
197 Open Text File 
198 ----------------------------------------------------------------------*/
199 #define FUNCID_LibEditText_OpenTextFile 0x03
200 LIBEDITTEXT_API_FILE
201 int
202         LibEditText_OpenTextFile(
203                         char    *pstr_path,
204                         char    *pstr_filename )
205 {
206         int             i_result;
207         LibFileType_FileType            t_ftype;
208         LibEditText_TextInfo            *p_tinfo;
209         char    str_filepath[DRD64_MAX_PATH + 1];
210         DWord   dw_maxline;
211         DWord   dw_bufline;
212         DWord   dw_bufsize;
213         
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__ ); 
220
221                 return -0x01;
222         }
223
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__ ); 
231
232                 return -0x02;
233         }
234         if( DRD64_LIBFILETYPE_TEXT != t_ftype.b_type )  { return 0x03; }
235
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__ ); 
243
244                 return -0x04;
245         }
246
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__ ); 
261
262                 return -0x05;
263         }
264
265         strncpy( p_tinfo->str_pathname, pstr_path, DRD64_MAX_PATH );
266         strncpy( p_tinfo->str_filename, pstr_filename, DRD64_MAX_PATH );
267
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__ ); 
276
277                 return -0x06;
278         }
279
280         return p_tinfo->i_id;
281 }
282
283
284 /*----------------------------------------------------------------------
285 Create Text File
286 ----------------------------------------------------------------------*/
287 #define FUNCID_LibEditText_CreateTextFile       0x04
288 LIBEDITTEXT_API_FILE
289 int
290         LibEditText_CreateTextFile(
291                         char    *pstr_path,
292                         char    *pstr_filename )
293 {
294         int             i_result;
295         DWord   dw_maxline;
296         DWord   dw_bufline;
297         DWord   dw_bufsize;
298         DWord   dw_nonnames;
299         LibFileType_FileType    t_ftype;
300         LibEditText_TextInfo    *p_tinfo;
301         LibEditText_LineInfo    *p_line;
302         char    str_filepath[DRD64_MAX_PATH + 1];
303
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__ ); 
311
312                 return -0x01;
313         }
314         
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__ ); 
323
324                         return -0x02;
325                 }
326
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;
331                 }
332
333                 strncpy( p_tinfo->str_pathname, pstr_path, DRD64_MAX_PATH );
334                 strncpy( p_tinfo->str_filename, pstr_filename, DRD64_MAX_PATH );
335         }
336         else    {
337                 t_ftype.b_type          = DRD64_LIBFILETYPE_TEXT;
338                 t_ftype.w_subtype       = DRD64_LIBFILETYPE_SUB_TEXT;
339
340                 if( NULL == pstr_path )
341                         { strncpy( p_tinfo->str_pathname, ".", DRD64_MAX_PATH ); }
342                 else
343                         { strncpy( p_tinfo->str_pathname, pstr_path, DRD64_MAX_PATH ); }
344
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 );
348                 }
349                 else
350                         { strncpy( p_tinfo->str_filename, pstr_filename, DRD64_MAX_PATH ); }
351         }
352                 
353
354         /* Alloc File-Buffer */
355         dw_maxline      = 1;
356         dw_bufline      = DRD64_LIBEDITTEXT_DEFAULT_CREATETEXTFILE_LINES;
357         dw_bufsize      = (DRD64_LIBEDITTEXT_DEFAULT_RESERVEBUF_INLINE
358                                         + DRD64_LIBEDITTEXT_DEFAULT_BUFSIZE_RESERVELINE) * dw_bufline;
359         /* XXX: 0x0001 */
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__ ); 
367
368                 return -0x03;
369         }
370
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 );
375
376         p_tinfo->i_fd           = -1;
377         p_tinfo->dw_line_start  = p_line->dw_id;
378         p_tinfo->dw_line_end    = p_line->dw_id;
379         
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__ ); 
386
387                 return -0x04;
388         }
389
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__ ); 
396
397                 return -0x05;
398         }
399         
400         return p_tinfo->i_id;
401 }
402
403
404 /*----------------------------------------------------------------------
405 Save Text File
406 ----------------------------------------------------------------------*/
407 #define FUNCID_LibEditText_SaveTextFile 0x05
408 LIBEDITTEXT_API_FILE
409 int
410         LibEditText_SaveTextFile(
411                 char    *pstr_path, 
412                 char    *pstr_filename, 
413                 int             i_tinfoid )
414 {
415         int                     i_fd;
416         int                     i_result;
417         DWord           dw_nowrow;
418         Byte            *pb_now;
419         char            *pstr_filepath;
420         off_t           t_offset;
421         ssize_t         sz_write;
422         mode_t          t_mode;
423         char            str_filepath_tmp[DRD64_MAX_PATH];
424         LibEditText_TextInfo            *p_tinfo;
425         LibEditText_LineInfo            *p_line;
426
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__ ); 
432
433                 return -0x01;
434         }
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__ ); 
441
442                 return -0x02;
443         }
444
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 );
448         }
449         else    {
450                 i_result        = LibEditText_File_CatPathFilename(
451                                                 str_filepath_tmp, pstr_path, pstr_filename );
452         }
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__ ); 
458
459                 return -0x03;
460         }
461
462         pstr_filepath   = str_filepath_tmp;
463
464         t_mode  = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; 
465         i_fd    = open( pstr_filepath, O_RDWR | O_CREAT, t_mode );
466         if( 0x00 > i_fd )       {
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__ ); 
471
472                 return -0x04;
473         }
474
475         if( -1 < p_tinfo->i_fd )        {
476                 close( p_tinfo->i_fd );
477         }
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 );
482         }
483
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__ ); 
490
491                 return -0x10;
492         }
493         
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__ ); 
503
504                         return -0x12;
505                 }
506
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__ ); 
513
514                         return -0x13;
515                 } 
516
517                 p_line          = LINFO(p_tinfo, p_line->dw_next);
518         }
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__ ); 
524
525                 return -0x20;
526         }
527
528         return 0x00;
529 }
530
531
532 /*----------------------------------------------------------------------
533 Close Text File
534 ----------------------------------------------------------------------*/
535 #define FUNCID_LibEditText_CloseFile    0x06
536 LIBEDITTEXT_API_FILE
537 int
538         LibEditText_CloseFile(
539                         int     i_tinfoid )
540 {
541         int             i_result;
542         LibEditText_TextInfo            *p_tinfo;
543
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__ ); 
550
551                 return -0x01;
552         }
553
554         close( p_tinfo->i_fd);
555         p_tinfo->i_fd   = -1;
556
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__ ); 
563
564                 return -0x02;
565         }
566
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__ ); 
573
574                 return -0x03;
575         }
576
577         return 0x00;
578 }
579
580
581 /* EOF of drd64_.c ---------------------------------- */
582