* BufFix: SwapLineBuffer() and around functions.
#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
#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.*/
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; }
// 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 );
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
/*----------------------------------------------------------------------
-DeleteChar
BackSpace (used by DeleteChar)
----------------------------------------------------------------------*/
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),
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 ---
LibEditText_LineInfo *p_src )
{
Byte *pb_tmpbuf;
+ Byte *pb_oldsrc;
+ Byte *pb_olddest;
DWord dw_tmp_start;
DWord dw_tmp_linelen;
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;
}
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;
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;
/* 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; }
// 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 )
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
#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 */
}
+/* 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
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;
}
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 );
}
+/* 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
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;
}