OSDN Git Service

* Tested: API DeleteString()
authorKoine Yuusuke(koinec) <koinec@users.sourceforge.jp>
Sun, 24 May 2015 00:09:04 +0000 (09:09 +0900)
committerKoine Yuusuke(koinec) <koinec@users.sourceforge.jp>
Sun, 24 May 2015 00:09:04 +0000 (09:09 +0900)
* BufFix: SwapLineBuffer() and around functions.

include/libedittext.h
libedittext/drd64_libedittext_config.h
libedittext/drd64_libedittext_linectrl.c
libedittext/drd64_libedittext_linectrl.h
libedittext/drd64_libedittext_lineedit.c
libedittext/drd64_libedittext_lineinfo.c
libedittext/drd64_libedittext_lineinfo.h
libedittext/drd64_libedittext_types.h
libedittext/test_libedittext_linectrl.c
libedittext/test_libedittext_lineedit.c

index 4c32be7..ef96d77 100644 (file)
@@ -85,6 +85,9 @@ LIBEDITTEXT_API_LINECTRL
        #define LIBEDITTEXT_API_LINEEDIT        extern
 #endif
 LIBEDITTEXT_API_LINEEDIT
+       int LibEditText_DeleteString_toLine(
+                       int i_tinfoid, DWord dw_line, DWord dw_pos, DWord dw_len );
+LIBEDITTEXT_API_LINEEDIT
        int LibEditText_InsertChar_toLine(
                        int i_tinfoid, DWord dw_line, DWord dw_pos, Byte b_char );
 LIBEDITTEXT_API_LINEEDIT
index 3ccc3b0..b68f398 100644 (file)
@@ -37,7 +37,7 @@ Comment:
 #ifndef DRD64_HEADER_LIBEDITTEXT_CONFIG
 #define DRD64_HEADER_LIBEDITTEXT_CONFIG
 
-#define DEBUG_TEXTINFO_OUTPUT                                          0x02
+#define DEBUG_TEXTINFO_OUTPUT                                          0x00
        /* Output TextData for Console if this value isn't 0x00 when run test_drcc program.*/
 
 
index ded2c5c..ea8a8d1 100644 (file)
@@ -132,13 +132,14 @@ int
        int             i_result;
        Byte    *pb_dest;
        Byte    *pb_src;
-       DWord   dw_linelen;
        LibEditText_LineInfo    *p_lsrc;
 
        // Check 
        assert( NULL != p_tinfo );
        assert( NULL != p_ldest );
 
+       if(( 1 >= p_tinfo->dw_maxline ) && ( 0 == dw_line ))
+               { return 0x01; }
        if( p_tinfo->dw_line_end == p_ldest->dw_id )
                { return 0x01; }
 
@@ -147,22 +148,22 @@ int
 
        // Merge Memory data
        if((p_ldest->dw_strlen + p_lsrc->dw_strlen + 5) > p_ldest->dw_linelen )         {
-               dw_linelen      = p_ldest->dw_strlen + p_lsrc->dw_strlen
-                                               + DRD64_LIBEDITTEXT_DEFAULT_RESERVEBUF_INLINE;
                i_result        = LibEditText_LineInfo_ExpandLineBuffer(
-                                                               p_tinfo, p_ldest, dw_linelen );
+                                                               p_tinfo, p_ldest, p_lsrc->dw_linelen );
                if( 0x00 != i_result )  { return -0x02; }
        }
 
-       pb_dest = p_tinfo->pb_text + p_ldest->dw_start + p_ldest->dw_strlen - 1;
        pb_src  = p_tinfo->pb_text + p_lsrc->dw_start;
-
-       assert( '\n' == *pb_dest );
+       pb_dest = p_tinfo->pb_text + p_ldest->dw_start + p_ldest->dw_strlen;
+       if( '\n' == *(pb_dest - 1) )    {
+               p_ldest->dw_strlen--;
+               pb_dest--;
+       }
 
        memcpy( pb_dest, pb_src, p_lsrc->dw_strlen );
        *(pb_dest + p_lsrc->dw_strlen) = '\0';
 
-       p_ldest->dw_strlen      = p_ldest->dw_strlen - 1 + p_lsrc->dw_strlen;
+       p_ldest->dw_strlen      += p_lsrc->dw_strlen;
 
        // delete line
        i_result        = LibEditText_LineCtrl_DeleteLine( p_tinfo, p_lsrc, dw_line + 1 );
index 0d09546..51fd748 100644 (file)
@@ -53,6 +53,9 @@ LIBEDITTEXT_LINECTRL_EXTERN
        int LibEditText_LineCtrl_DeleteLine(
                        LibEditText_TextInfo *p_tinfo, LibEditText_LineInfo *p_line, DWord dw_line );
 LIBEDITTEXT_LINECTRL_EXTERN
+       int LibEditText_LineCtrl_JoinLine(
+                       LibEditText_TextInfo *p_tinfo, LibEditText_LineInfo *p_ldest, DWord dw_line );
+LIBEDITTEXT_LINECTRL_EXTERN
        int LibEditText_LineCtrl_InsertLine(
                        LibEditText_TextInfo *p_tinfo, DWord dw_line, Byte *pb_text, DWord dw_length );
 LIBEDITTEXT_LINECTRL_EXTERN
index e1f9dfd..62f2255 100644 (file)
@@ -39,7 +39,6 @@ Comment:
 
 
 /*----------------------------------------------------------------------
-DeleteChar
 BackSpace (used by DeleteChar)
 ----------------------------------------------------------------------*/
 
@@ -62,6 +61,12 @@ int
        assert( NULL != p_line );
        assert( p_line->dw_strlen >= (dw_pos + dw_len) );
 
+       if(( 0 == dw_pos ) && ( dw_len == p_line->dw_strlen ))  {
+               // Delete Line ---
+               i_result        = LibEditText_LineCtrl_DeleteLine( p_tinfo, p_line, dw_line );
+               goto    goto_LibEditText_LineEdit_DeleteString_post;
+       }
+
        // Move StringData ---
        pb_data = p_tinfo->pb_text + p_line->dw_start;
        memmove( (pb_data + dw_pos), (pb_data + dw_pos + dw_len),
@@ -69,15 +74,11 @@ int
        memset( (pb_data + p_line->dw_strlen - dw_len), 0x00, dw_len );
        p_line->dw_strlen       -= dw_len;
 
-       if( 0 == p_line->dw_strlen )    {
-               // Delete Line ---
-               i_result        = LibEditText_LineCtrl_DeleteLine( p_tinfo, p_line, dw_line );
-               goto    goto_LibEditText_LineEdit_DeleteString_post;
-       }
+       assert( 0 < p_line->dw_strlen );
 
        if( p_tinfo->dw_line_end == p_line->dw_id )
                { goto  goto_LibEditText_LineEdit_DeleteString_post; }
-       if( '\n' == *(pb_data + p_line->dw_strlen) )
+       if( '\n' == *(pb_data + p_line->dw_strlen - 1) )
                { goto  goto_LibEditText_LineEdit_DeleteString_post; }
 
        // Merge line --- 
index 7d58fa6..335099a 100644 (file)
@@ -92,6 +92,8 @@ void
                LibEditText_LineInfo    *p_src )
 {
        Byte    *pb_tmpbuf;
+       Byte    *pb_oldsrc;
+       Byte    *pb_olddest;
        DWord   dw_tmp_start;
        DWord   dw_tmp_linelen;
 
@@ -99,37 +101,45 @@ void
        assert( NULL != p_dest );
        assert( NULL != p_src );
 
+       // Check Dest(linelen) > Src(linelen) > Dest(strlen) ---
        if( p_dest->dw_linelen < p_src->dw_linelen )    { return; }
+       if( p_dest->dw_strlen >= p_src->dw_linelen )    { return; }
 
+       // Prepare ---
+       pb_oldsrc       = p_tinfo->pb_text + p_src->dw_start;
+       pb_olddest      = p_tinfo->pb_text + p_dest->dw_start;
        pb_tmpbuf       = p_tinfo->pb_text
                        + (p_tinfo->dw_bufsize - DRD64_LIBEDITTEXT_DEFAULT_COPYBUFFER);
 
+       // Copy Src to tmp. ---
        dw_tmp_linelen          = p_src->dw_linelen;
        dw_tmp_start            = p_src->dw_start;
 
-       if( DRD64_LIBEDITTEXT_DEFAULT_COPYBUFFER < dw_tmp_linelen )     {
-               LibEditText_LineInfo_MemCopy(pb_tmpbuf,
-                       (p_tinfo->pb_text + p_src->dw_start), dw_tmp_linelen );
-       }
+       if( DRD64_LIBEDITTEXT_DEFAULT_COPYBUFFER < dw_tmp_linelen )
+               { LibEditText_LineInfo_MemCopy(pb_tmpbuf, pb_oldsrc, dw_tmp_linelen ); }
        else
-               { memcpy( pb_tmpbuf, (p_tinfo->pb_text + p_src->dw_start), dw_tmp_linelen ); }
+               { memcpy( pb_tmpbuf, pb_oldsrc, dw_tmp_linelen ); }
        
-       memcpy( (p_tinfo->pb_text + p_src->dw_start),
-                               (p_tinfo->pb_text + p_dest->dw_start), dw_tmp_linelen );
-
+       // Copy Dest to Src ---
        p_src->dw_start         = p_dest->dw_start;
        p_src->dw_linelen       = p_dest->dw_linelen;
 
+       memcpy( pb_oldsrc, pb_olddest, p_dest->dw_strlen );
+
+       // Copy tmp. to Dest ---
        p_dest->dw_start        = dw_tmp_start;
        p_dest->dw_linelen      = dw_tmp_linelen;
 
-       if( DRD64_LIBEDITTEXT_DEFAULT_COPYBUFFER < dw_tmp_linelen )     {
-               LibEditText_LineInfo_MemCopy(
-                       (p_tinfo->pb_text + p_src->dw_start), pb_tmpbuf, dw_tmp_linelen );
-       }
+       if( DRD64_LIBEDITTEXT_DEFAULT_COPYBUFFER < dw_tmp_linelen )
+               { LibEditText_LineInfo_MemCopy( pb_olddest, pb_tmpbuf, dw_tmp_linelen ); }
        else
                { memcpy( (p_tinfo->pb_text + p_src->dw_start), pb_tmpbuf, dw_tmp_linelen ); }
 
+       memset( (p_tinfo->pb_text + p_src->dw_start + p_src->dw_strlen),
+                               0x00, (p_src->dw_linelen - p_src->dw_strlen) );
+       memset( (p_tinfo->pb_text + p_dest->dw_start + p_dest->dw_strlen),
+                               0x00, (p_dest->dw_linelen - p_dest->dw_strlen) );
+
        return;
 }
 
@@ -172,7 +182,8 @@ LibEditText_LineInfo        *
                DWord   dw_sort[],
                int             *pi_element,
                DWord   dw_linelen,
-               LibEditText_LineInfo    **pp_lbefore )
+               LibEditText_LineInfo    **pp_lbefore,
+               DWord   dw_maxstrlen )
 {
        int             i_cnt;
        LibEditText_LineInfo    *p_lnow;
@@ -183,13 +194,19 @@ LibEditText_LineInfo      *
                p_lnow          = LINFO( p_tinfo, dw_sort[i_cnt] );
 
                while( NULL != p_lnow ) {
-                       if( dw_linelen <= p_lnow->dw_linelen )
-                               { goto goto_LibEditText_LineInfo_SearchChain_post; }
+                       if( dw_linelen <= p_lnow->dw_linelen )  {
+                               if( dw_maxstrlen >= p_lnow->dw_strlen )
+                                       { goto goto_LibEditText_LineInfo_SearchChain_post; }
+                       }
                        p_lbefore       = p_lnow;
                        p_lnow          = LINFO(p_tinfo, p_lbefore->dw_sortnext);
                }
        }
 
+       p_lbefore       = NULL;
+       p_lnow          = NULL;
+       i_cnt           = -1;
+
 goto_LibEditText_LineInfo_SearchChain_post:
        if( NULL != pp_lbefore )        { *pp_lbefore   = p_lbefore; }
        *pi_element     = i_cnt;
@@ -280,7 +297,8 @@ int
 
        /* Search Other Line Chain ---*/
        p_lnow  = LibEditText_LineInfo_SearchChain(
-                               p_tinfo, p_tinfo->dw_linesort, &i_element, dw_linesize, &p_lbefore );
+                               p_tinfo, p_tinfo->dw_linesort, &i_element, dw_linesize,
+                               &p_lbefore, (p_line->dw_strlen + 1) );
        if( NULL != p_lnow )    {
                i_result        = LibEditText_LineInfo_RemoveSortChain( p_tinfo, p_line );
                if( 0x00 != i_result )  { return -0x02; }
@@ -338,7 +356,7 @@ LibEditText_LineInfo        *
        // Search EmptyChain in Indicate LineLength Chain ---
        p_lbefore       = NULL;
        p_line  = LibEditText_LineInfo_SearchChain(
-                               p_tinfo, p_tinfo->dw_empty, &i_element, dw_linelen, &p_lbefore );
+                               p_tinfo, p_tinfo->dw_empty, &i_element, dw_linelen, &p_lbefore, MAXLINES );
 
        if( NULL != p_line )    {
                if( NULL != p_lbefore )
index a8acac8..00e81fc 100644 (file)
@@ -84,7 +84,7 @@ LIBEDITTEXT_LINEINFO_INTERNALFUNC
 LIBEDITTEXT_LINEINFO_INTERNALFUNC
        LibEditText_LineInfo *LibEditText_LineInfo_SearchChain(
                        LibEditText_TextInfo *p_tinfo, DWord dw_sort[], int *pi_element,
-                       DWord dw_linelen, LibEditText_LineInfo **pp_lbefore );
+                       DWord dw_linelen, LibEditText_LineInfo **pp_lbefore, DWord dw_maxstrlen );
 LIBEDITTEXT_LINEINFO_INTERNALFUNC
        int LibEditText_LineInfo_CalcSortChainElement( DWord dw_linelen );
 LIBEDITTEXT_LINEINFO_INTERNALFUNC
index 298ac16..20edb27 100644 (file)
@@ -38,6 +38,7 @@ Comment:
 #define DRD64_HEADER_LIBEDITTEXT_TYPES
 
 #define        INVALID_LINE    (DWord)0xffffffff
+#define        MAXLINES                (DWord)0x7fffffff
 
 #define        LINFO(m,n)      (INVALID_LINE==(n) ? NULL : (((m)->p_lineinfo)+(n)))
        /* (m): (Drd64_DrCC_TextInfo *) TextInfo Strcut Pointer */
index a1d0749..3b92581 100644 (file)
@@ -161,6 +161,49 @@ void Test_LibEditText_API_InsertLine_test00_002(void)
 }
 
 
+/* LibEditText_JoinLine (API) *****************************************/
+/*--------------------------------------------------------------------*/
+void Test_LibEditText_API_JoinLine_test00_001(void)
+{
+       int     i_result;
+       int             i_tinfoid;
+       int             i_len;
+       int             i_cnt;
+       char    str_testdata[256];
+
+       i_result        = LibEditText_Init();
+       CU_ASSERT( 0x00 == i_result );
+
+       i_tinfoid       = LibEditText_CreateTextFile( "./testdata", NULL );
+       CU_ASSERT( 0x00 == i_result );
+
+       i_result        = LibEditText_AppendLine( i_tinfoid, "END of testdata ---", 19);
+       CU_ASSERT( 0x00 == i_result );
+
+       for( i_cnt = 1024; i_cnt > 0; i_cnt-- ) {
+               i_len   = snprintf( str_testdata, 255, "%04d JoinLine test001 -\n", i_cnt);
+               i_result        = LibEditText_InsertLine_toLine( i_tinfoid, 1, str_testdata, i_len);
+               CU_ASSERT( 0x00 == i_result );
+       }
+
+       i_result        = LibEditText_DeleteLine_toLine( i_tinfoid, 0 );
+       CU_ASSERT( 0x00 == i_result );
+
+       for( i_cnt = 1; i_cnt < 2; i_cnt++ )    {
+               i_result        = LibEditText_JoinLine_toLine( i_tinfoid, i_cnt );
+               CU_ASSERT( 0x00 == i_result );
+       }
+
+       i_result        = LibEditText_Debug_DebugTextInfo( i_tinfoid, DEBUG_TEXTINFO_OUTPUT );
+       CU_ASSERT( 0x00 == i_result );
+
+       i_result        = LibEditText_Term();
+       CU_ASSERT( 0x00 == i_result );
+
+       return;
+}
+
+
 /*----------------------------------------------------------------------
 ----------------------------------------------------------------------*/
 DRD64_TEST_LIBEDITTEXT_LINECTRL_EXTERN
@@ -179,6 +222,10 @@ int
                                                                Test_LibEditText_API_InsertLine_test00_001 );
        CU_add_test( pt_edittext, "EditText_API_InsertLine_test00_002",
                                                                Test_LibEditText_API_InsertLine_test00_002 );
+
+       CU_add_test( pt_edittext, "EditText_API_JoinLine_test00_001",
+                                                               Test_LibEditText_API_JoinLine_test00_001 );
+
        return 0x00;
 }
 
index 61b4dc0..baf0515 100644 (file)
@@ -63,7 +63,7 @@ void Test_LibEditText_API_InsertStringChar_toLine_test00_001(void)
        i_result        = LibEditText_AppendLine( i_tinfoid, "Line 3: \n", 9);
        CU_ASSERT( 0x00 == i_result );
 
-       for( i_cnt = 0; i_cnt < 1025; i_cnt++ ) {
+       for( i_cnt = 0; i_cnt < 4097; i_cnt++ ) {
                c_tmp   = 0x30 + (i_cnt % 10);
                i_result        = LibEditText_InsertChar_toLine( i_tinfoid, 1, 7, c_tmp );
                CU_ASSERT( 0x00 == i_result );
@@ -79,6 +79,51 @@ void Test_LibEditText_API_InsertStringChar_toLine_test00_001(void)
 }
 
 
+/* LibEditText_DeleteString_toLine (API) ********************************/
+/*--------------------------------------------------------------------*/
+void Test_LibEditText_API_DeleteStringChar_toLine_test00_001(void)
+{
+       int     i_result;
+       int             i_tinfoid;
+       int             i_cnt;
+       char    c_tmp;
+
+       i_result        = LibEditText_Init();
+       CU_ASSERT( 0x00 == i_result );
+
+       i_tinfoid       = LibEditText_CreateTextFile( "./testdata", NULL );
+       CU_ASSERT( 0x00 == i_result );
+
+       i_result        = LibEditText_InsertString_toLine( i_tinfoid, 0, 0, "Line 1: " );
+       CU_ASSERT( 0x00 == i_result );
+
+       i_result        = LibEditText_AppendLine( i_tinfoid, "Line 2:_\n", 9);
+       CU_ASSERT( 0x00 == i_result );
+
+       i_result        = LibEditText_AppendLine( i_tinfoid, "Line 3:_\n", 9);
+       CU_ASSERT( 0x00 == i_result );
+
+       for( i_cnt = 0; i_cnt < 10; i_cnt++ )   {
+               c_tmp   = 0x30 + (i_cnt % 10);
+               i_result        = LibEditText_InsertChar_toLine( i_tinfoid, 1, 8, c_tmp );
+               CU_ASSERT( 0x00 == i_result );
+       }
+
+       for( i_cnt = 0; i_cnt< 11; i_cnt++ )    {
+               i_result        = LibEditText_DeleteString_toLine( i_tinfoid, 1, 8, 1);
+               CU_ASSERT( 0x00 == i_result );
+       }
+
+       i_result        = LibEditText_Debug_DebugTextInfo( i_tinfoid, DEBUG_TEXTINFO_OUTPUT );
+       CU_ASSERT( 0x00 == i_result );
+
+       i_result        = LibEditText_Term();
+       CU_ASSERT( 0x00 == i_result );
+
+       return;
+}
+
+
 /*----------------------------------------------------------------------
 ----------------------------------------------------------------------*/
 DRD64_TEST_LIBEDITTEXT_LINEEDIT_EXTERN
@@ -93,6 +138,9 @@ int
        CU_add_test( pt_edittext, "EditText_API_InsertStringChar_toLine_test00_001",
                                        Test_LibEditText_API_InsertStringChar_toLine_test00_001 );
 
+       CU_add_test( pt_edittext, "EditText_API_DeleteStringChar_toLine_test00_001",
+                                       Test_LibEditText_API_DeleteStringChar_toLine_test00_001 );
+
        return 0x00;
 }