OSDN Git Service

* Implement: DrCC_EditText_Line_AppendLine()
authorKoine Yuusuke(koinec) <koinec@users.sourceforge.jp>
Mon, 20 Apr 2015 08:34:40 +0000 (17:34 +0900)
committerKoine Yuusuke(koinec) <koinec@users.sourceforge.jp>
Mon, 20 Apr 2015 08:34:40 +0000 (17:34 +0900)
* Implement: Empty LineInfo Chain Pool (DrCC_EditText_Line_SetEmptyLineChain & DrCC_EditText_Line_GetEmptyLineInfo() )

drcc/drcc_edittext_debug.c
drcc/drcc_edittext_file.c
drcc/drcc_edittext_line.c
drcc/drcc_edittext_line.h
drcc/drcc_edittext_system.c
drcc/test_drcc_edittext_file.c

index fe4bf54..ec90129 100644 (file)
@@ -59,7 +59,7 @@ int
                if( NULL == p_line )    { continue; }
 
                dw_nowlen       = p_line->dw_linelen;
-               dw_lencount     = 1;
+               dw_lencount     = 0;
 
                while( NULL != p_line )         {
                        if( dw_nowlen < p_line->dw_linelen )    {
@@ -112,7 +112,7 @@ int
 
                dw_nowlen       = p_line->dw_linelen;
                if( 0 == dw_nowlen )    { return -0x01; }
-               dw_lencount     = 1;
+               dw_lencount     = 0;
 
                while( NULL != p_line )         {
                        if( dw_nowlen < p_line->dw_linelen )    {
@@ -149,7 +149,6 @@ int
                Byte b_putflag )
 {
        DWord           dw_nowrow;
-       int                     i_cnt;
        int                     i_result;
        Byte            *pb_now;
        Drd64_DrCC_TextInfo             *p_tinfo;
index 8cbefc9..33c9b9b 100644 (file)
@@ -74,108 +74,66 @@ int
 {
        int             i_result        = 0x00;
        int             i_fd;
-       Byte    b_buf[DRD64_DRCC_DEFAULT_READBUF];
-       Byte    *pb_tmp_now;
-       Byte    *pb_tmp_start;
-       Byte    *pb_data_now;
+       Byte    *pb_start;
        Byte    *pb_buffer;
        Byte    *pb_now;
        ssize_t sz_read;
        DWord   dw_nowrow;
-       DWord   dw_nowpos;
-       Drd64_DrCC_LineInfo             *p_before;
-       Drd64_DrCC_LineInfo             *p_line;
+       DWord   dw_allocsize;
+       DWord   dw_pos;
 
-       pb_buffer       = (Byte *)malloc( dw_maxlength + 1 );
+       dw_allocsize    = dw_maxlength + DRD64_DRCC_DEFAULT_READBUF + 1;
+       pb_buffer       = (Byte *)malloc( dw_allocsize );
        if( NULL == pb_buffer )         { return -0x01; }
        memset( pb_buffer, 0x00, dw_maxlength + 1 );
 
        i_fd    = open( pstr_filepath, O_RDWR );
        if( 0x00 > i_fd )       {
-               i_result        = -0x01;
+               i_result        = -0x02;
                goto goto_DrCC_EditText_File_ReadTextFile_post;
        }
        p_tinfo->i_fd   = i_fd;
 
-       pb_data_now     = p_tinfo->pb_text;
-       p_line          = p_tinfo->p_lineinfo;
-       p_before        = NULL;
-       dw_nowpos       = 0;
        dw_nowrow       = 0;
-
-       p_line->dw_start        = 0;
-
-       pb_now          = pb_buffer;
+       dw_pos          = 0;
+       pb_start        = pb_buffer;
+       pb_now          = pb_start;
        do      {
-               sz_read = read( p_tinfo->i_fd, &b_buf, DRD64_DRCC_DEFAULT_READBUF );
-               //sz_read       = read( p_tinfo->i_fd, pb_now, DRD64_DRCC_DEFAULT_READBUF );
+               sz_read = read( p_tinfo->i_fd, pb_start, DRD64_DRCC_DEFAULT_READBUF );
                if( 0 >= sz_read )      {
-                       i_result        = -0x01;
+                       i_result        = -0x03;
                        goto goto_DrCC_EditText_File_ReadTextFile_post;
                }
-               pb_tmp_start    = b_buf;
-               pb_tmp_now              = b_buf;
-               //pb_tmp_start  = pb_now;
-               //pb_tmp_now            = pb_now:;
 
                dw_fsize        -= (DWord)sz_read;
-               for( ; 0 < sz_read; sz_read--, pb_tmp_now++ )   {
-                       if( '\n' == *pb_tmp_now )       {
-                               memcpy( pb_data_now, pb_tmp_start, (size_t)(pb_tmp_now - pb_tmp_start + 1) );
-
-                               p_line->dw_strlen               += (DWord)(pb_tmp_now - pb_tmp_start + 1);
-                               p_line->dw_linelen              = p_line->dw_strlen
-                                                                                       + DRD64_DRCC_DEFAULT_RESERVEBUF_INLINE;
-
-                               dw_nowpos                               += p_line->dw_linelen;
-                               pb_data_now                             += p_line->dw_linelen;
-                               p_before                                = p_line;
-
-                               i_result        = DrCC_EditText_Line_AddSortChain( p_tinfo, p_line );   
-                               if( 0x00 != i_result )  {
-                                       i_result        =  -0x02;
-                                       goto goto_DrCC_EditText_File_ReadTextFile_post;
-                               }
-                               p_line++;
+               for( ; 0 < sz_read; sz_read--, dw_pos++ )       {
+                       if( '\n' == *pb_now )   {
+                               i_result        = DrCC_EditText_Line_AppendLine(
+                                                               p_tinfo, pb_buffer, (DWord)(pb_now - pb_buffer + 1));
                                dw_nowrow++;
-                               pb_tmp_start                    = pb_tmp_now + 1;
-                               
-                               p_line->dw_start                = dw_nowpos;
-                               p_before->p_next                = p_line;
-                               p_line->p_before                = p_before;
-                       }       
-               }
 
-               if( 1 < (pb_tmp_now - pb_tmp_start) )   {
-                       memcpy( pb_data_now, pb_tmp_start, (size_t)(pb_tmp_now - pb_tmp_start) );
-                       p_line->dw_strlen       += (DWord)(pb_tmp_now - pb_tmp_start);
-                       dw_nowpos                       += (DWord)(pb_tmp_now - pb_tmp_start);
-                       pb_data_now                     += (DWord)(pb_tmp_now - pb_tmp_start);
+                               if( 1 < sz_read )       {
+                                       memcpy( pb_buffer, (pb_now + 1), sz_read - 1);
+                                       memset( pb_buffer + sz_read - 1, 0x00, dw_allocsize - sz_read );
+                               }
 
+                               pb_start                = pb_buffer;
+                               pb_now                  = pb_start;
+                       }
+                       else    { pb_now++; }
                }
-                               
+               pb_start        = pb_now;
        }while( 0 < dw_fsize );
-       
-       if( NULL == p_line->p_before )  {
-               p_line->dw_strlen               += (DWord)(pb_tmp_now - pb_tmp_start);
-               p_line->dw_linelen              = p_line->dw_strlen
-                                                                               + DRD64_DRCC_DEFAULT_RESERVEBUF_INLINE;
-
-               dw_nowpos                               += p_line->dw_linelen;
-               p_line->p_next                  = NULL;
 
-               i_result        = DrCC_EditText_Line_AddSortChain( p_tinfo, p_line );   
-               if( 0x00 != i_result )  {
-                       i_result        =  -0x02;
-                       goto goto_DrCC_EditText_File_ReadTextFile_post;
-               }
+       if( dw_nowrow + 1 == p_tinfo->dw_maxline )      {
+               i_result        = DrCC_EditText_Line_AppendLine(
+                                                       p_tinfo, pb_buffer, (DWord)(pb_now - pb_buffer));
+               dw_nowrow++;
        }
-       else    {
-               p_before->p_next                = NULL;
+       else if( dw_nowrow != p_tinfo->dw_maxline )     {
+               i_result        =  -0x04;
        }
 
-       p_tinfo->dw_lastsize            = dw_nowpos;
-
 goto_DrCC_EditText_File_ReadTextFile_post:
        free( pb_buffer );
 
@@ -229,7 +187,7 @@ int
        /* Read Textfile & Generate LineInfo */
        i_result        = DrCC_EditText_File_ReadTextFile(
                                        p_tinfo, str_filepath, t_ftype.dw_filesize, t_ftype.dw_maxlength );
-       if( 0x00 != i_result )  { return -0x05; }
+       if( 0x00 != i_result )  { return -0x06; }
 
        return p_tinfo->i_id;
 }
index 95691fc..e6a15c0 100644 (file)
@@ -141,6 +141,7 @@ int
 
 /*----------------------------------------------------------------------
 ----------------------------------------------------------------------*/
+DRCC_EDITTEXT_LINE_EXTERN
 int
        DrCC_EditText_Line_AppendLine(
                Drd64_DrCC_TextInfo             *p_tinfo,
@@ -157,19 +158,24 @@ int
 
        dw_buflength    = dw_length + DRD64_DRCC_DEFAULT_RESERVEBUF_INLINE;
        p_line  = DrCC_EditText_Line_GetEmptyLineInfo( p_tinfo, dw_buflength );
-       if( NULL == p_line )    { return -0x01; }
+       if( NULL == p_line )    { return -0x11; }
        
        /* p_line->dw_start      */
+       if( NULL != p_before )
+               { p_before->p_next      = p_line; }
        p_line->dw_strlen       = dw_length;
-       p_before->p_next        = p_line;
        p_line->p_before        = p_before;
 
        i_result    = DrCC_EditText_Line_AddSortChain( p_tinfo, p_line );
        if( 0x00 != i_result )  {
-               return -0x01;
+               return -0x12;
        }
 
+       memcpy( p_tinfo->pb_text + p_line->dw_start, pstr_text, dw_length );
+
        p_tinfo->p_line_end     = p_line;
+
+       return 0x00;
 }
 
 
index 7e6d23b..1a61770 100644 (file)
@@ -66,6 +66,11 @@ DRCC_EDITTEXT_SYSTEM_EXTERN
                DrCC_EditText_Line_SetEmptyLineChain(
                        Drd64_DrCC_TextInfo *p_tinfo, Drd64_DrCC_LineInfo *p_line );
 DRCC_EDITTEXT_LINE_EXTERN
+int
+       DrCC_EditText_Line_AppendLine(
+                       Drd64_DrCC_TextInfo *p_tinfo, Byte *pstr_text, DWord dw_length );
+
+DRCC_EDITTEXT_LINE_EXTERN
        int
                DrCC_EditText_Line_RemoveSortChain(
                        Drd64_DrCC_TextInfo *p_tinfo,
index ccf4972..9cdf1ee 100644 (file)
@@ -137,8 +137,8 @@ int
        p_tinfo->dw_bufline             = dw_bufline;
        
        /* Link Empty-LineInfo Chain --- */
-       p_line                  = (p_tinfo->p_lineinfo + dw_maxline);
-       for( dw_cnt = dw_maxline; dw_cnt < dw_bufline; dw_cnt++ )       {
+       p_line                  = p_tinfo->p_lineinfo;
+       for( dw_cnt = 0; dw_cnt < dw_bufline; dw_cnt++ )        {
                i_result        = DrCC_EditText_Line_SetEmptyLineChain( p_tinfo, p_line );
                p_line++;
        }
index 0d0ba70..2a5f87b 100644 (file)
@@ -167,7 +167,6 @@ void Test_DrCC_EditText_File_CreateTextFile_test00_001(void)
        CU_ASSERT( 0x00 <= i_tinfoid );
 
        i_result        = DrCC_EditText_Debug_DebugTextInfo( i_tinfoid, DEBUG_TEXTINFO_OUTPUT );
-       printf("err= %d\n", i_result);
        CU_ASSERT( 0x00 == i_result );
 
        i_result        = DrCC_EditText_File_CloseFile( i_tinfoid );