OSDN Git Service

* Implemented: Complete Implement & Test LibEditText_FindString() API.
authorKoine Yuusuke(koinec) <koinec@users.sourceforge.jp>
Sun, 9 Aug 2015 10:00:45 +0000 (19:00 +0900)
committerKoine Yuusuke(koinec) <koinec@users.sourceforge.jp>
Sun, 9 Aug 2015 10:00:45 +0000 (19:00 +0900)
include/libedittext.h
libedittext/drd64_libedittext_cursorapi_find.c
libedittext/drd64_libedittext_cursorfind.c
libedittext/drd64_libedittext_types.h
libedittext/test_libedittext_cursorfind.c

index 07e6ffb..c105654 100644 (file)
@@ -183,7 +183,8 @@ LIBEDITTEXT_API_CURSORAPI_MOVE
        #define LIBEDITTEXT_API_CURSORAPI_FIND  extern
 #endif
 LIBEDITTEXT_API_CURSORAPI_FIND
-       int LibEditText_FindString( int i_tinfoid, int i_curid, char *pstr_regex, DWord dw_regexlen );
+       int LibEditText_FindString(
+                       int i_tinfoid, int i_curid, char *pstr_regex, DWord dw_regexlen, DWord *pdw_len );
 
 
 #ifdef DRD64_SRC_LIBEDITTEXT_UNDOEDIT
index 2ae2580..bb3f5e5 100644 (file)
@@ -53,7 +53,8 @@ int
                        int             i_tinfoid,
                        int             i_curid,
                        char    *pstr_regex,
-                       DWord   dw_regexlen )
+                       DWord   dw_regexlen,
+                       DWord   *pdw_len )
 {
        int             i_result;
        LibEditText_TextInfo    *p_tinfo;
@@ -71,6 +72,12 @@ int
 
        i_result        = LibEditText_CursorFind_FindString(
                                                p_tinfo, p_cursor, pstr_regex, dw_regexlen, LIBEDITTEXT_FLAGFIND_NORMAL );
+       if( 0x00 > i_result )   {
+               return i_result;
+       }
+
+       if(( LIBEDITTEXT_RET_FINDNOMATCH != i_result ) && ( NULL != pdw_len ))
+               { *pdw_len      = p_cursor->dw_find_prevpos_len; }
 
        return  i_result;
 }
index 48cd7d5..c882b66 100644 (file)
@@ -129,6 +129,7 @@ int
        int             i_result;
        int             i_flag;
        int             i_round;
+       int             i_brkcnt;
        Byte    *pb_start;
        DWord   dw_pstart;
        DWord   dw_lnow;
@@ -148,16 +149,16 @@ int
        }
 
        // Clear Before Find Data ---
-       if( NULL != p_cursor->pt_findreg )      {
-               regfree( p_cursor->pt_findreg );
-               p_cursor->pt_findreg    = NULL;
+       if( '\0' != p_cursor->str_regstr[0] )   {
+               regfree( &(p_cursor->t_findreg) );
+               memset( &(p_cursor->t_findreg), 0x00, sizeof( regex_t ) );
        }
        
        // Compile regex string ---
        i_flag  = REG_EXTENDED;
        if( LIBEDITTEXT_FLAGFIND_IGNOREICASE & b_flagfind ) { i_flag    |= REG_ICASE; }
 
-       i_result        = regcomp( p_cursor->pt_findreg, p_cursor->str_regstr, i_flag );
+       i_result        = regcomp( &(p_cursor->t_findreg), p_cursor->str_regstr, REG_EXTENDED );
        if( 0x00 != i_result )  {
 
                return i_result;
@@ -169,22 +170,25 @@ int
 
        dw_lidbase      = p_line->dw_id;
        dw_lnow         = p_cursor->dw_line;
-       dw_pstart       = LibEditText_CursorFind_GetFindingPostion( p_cursor );
+       //dw_pstart     = LibEditText_CursorFind_GetFindingPostion( p_cursor );
+       dw_pstart       = p_cursor->dw_pos;
        pb_start        = p_tinfo->pb_text + p_line->dw_start + dw_pstart;
        i_round         = 0x00;
+       i_brkcnt        = 0;
 
        if( 0 < dw_pstart )     { i_flag        = REG_NOTBOL; }
        else                            { i_flag        = 0x00; }
 
        do      {
-
-               i_result        = regexec( p_cursor->pt_findreg, (const char *)pb_start,
+               i_result        = regexec( &(p_cursor->t_findreg), (const char *)pb_start,
                                                                1, &t_match, i_flag );
                if( 0x00 == i_result )  { break; }
                else if( REG_NOMATCH != i_result )      {
                        return -0x10;
                }
 
+               if( p_line->dw_id == dw_lidbase )       { i_brkcnt++; }
+
                // Going to Next-Line ---
                i_flag  = 0x00;
                p_line  = LINFO(p_tinfo, p_line->dw_next);
@@ -198,9 +202,9 @@ int
                dw_pstart       = 0;
                pb_start        = p_tinfo->pb_text + p_line->dw_start;
 
-       }while( p_line->dw_id != dw_lidbase );
+       }while( 2 > i_brkcnt );
        
-       if( p_line->dw_id == dw_lidbase )
+       if(( 2 == i_brkcnt ) && ( REG_NOMATCH == i_result ))
                { return LIBEDITTEXT_RET_FINDNOMATCH; } // NO match string in Text. 
 
        dw_pstart       += (DWord)t_match.rm_so;                                        // Find String Pos.
index 4dfc200..4ee4089 100644 (file)
@@ -88,7 +88,7 @@ typedef struct        {
 
        /* Find Data --- */
        char    str_regstr[DRD64_LIBEDITTEXT_DEFAULT_REGSTR_SIZE];
-       regex_t *pt_findreg;
+       regex_t t_findreg;
        DWord   dw_find_prevpos_start;
        DWord   dw_find_prevpos_len;
        DWord   dw_find_prevlineid;
index b470e30..684a37d 100644 (file)
@@ -46,6 +46,10 @@ void Test_LibEditText_API_CursorAPI_FindString_test00_001(void)
        int             i_result;
        int             i_tinfoid;
        int             i_curid;
+       char    *pstr_value;
+       DWord   dw_line;
+       DWord   dw_pos;
+       DWord   dw_len;
 
        i_result        = LibEditText_Init();
        CU_ASSERT( 0x00 == i_result );
@@ -60,6 +64,47 @@ void Test_LibEditText_API_CursorAPI_FindString_test00_001(void)
                                                i_tinfoid, 0x01, "API FindString test00_001" );
        CU_ASSERT( 0x00 == i_result );
 
+       puts("[A] Find Result ---2----+----3----+----4----+----5----+----6----+----7----+----8");
+
+       // Find 01 ---
+       i_result        = LibEditText_FindString( i_tinfoid, i_curid, "AAA", 3, &dw_len );
+       CU_ASSERT( LIBEDITTEXT_RET_FINDMATCH == i_result );
+       
+       i_result        = LibEditText_GetCursorPosition( i_tinfoid, i_curid, &dw_line, &dw_pos );
+       CU_ASSERT( 0x00 == i_result );
+       pstr_value      = LibEditText_GetCursorLineString( i_tinfoid, i_curid, NULL );
+       printf("  Find 01: [%u:%u(%u)] %s", dw_line, dw_pos, dw_len, pstr_value );
+
+       // Find 02 ---
+       i_result        = LibEditText_FindString( i_tinfoid, i_curid, "64", 2, &dw_len );
+       CU_ASSERT( LIBEDITTEXT_RET_FINDMATCH == i_result );
+       
+       i_result        = LibEditText_GetCursorPosition( i_tinfoid, i_curid, &dw_line, &dw_pos );
+       CU_ASSERT( 0x00 == i_result );
+       pstr_value      = LibEditText_GetCursorLineString( i_tinfoid, i_curid, NULL );
+       printf("  Find 02: [%u:%u(%u)] %s", dw_line, dw_pos, dw_len, pstr_value );
+
+       // Find 03 ---
+       i_result        = LibEditText_FindString( i_tinfoid, i_curid, "AAA", 3, &dw_len );
+       CU_ASSERT( LIBEDITTEXT_RET_FINDMATCH_ROUND == i_result );
+       i_result        = LibEditText_GetCursorPosition( i_tinfoid, i_curid, &dw_line, &dw_pos );
+       CU_ASSERT( 0x00 == i_result );
+       pstr_value      = LibEditText_GetCursorLineString( i_tinfoid, i_curid, NULL );
+       printf("  Find 03: [%u:%u(%u)] %s", dw_line, dw_pos, dw_len, pstr_value );
+
+       // Find 04 ---
+       i_result        = LibEditText_FindString( i_tinfoid, i_curid, "CPU[A-Z].", 9, &dw_len );
+       CU_ASSERT( LIBEDITTEXT_RET_FINDMATCH == i_result );
+       i_result        = LibEditText_GetCursorPosition( i_tinfoid, i_curid, &dw_line, &dw_pos );
+       CU_ASSERT( 0x00 == i_result );
+       pstr_value      = LibEditText_GetCursorLineString( i_tinfoid, i_curid, NULL );
+       printf("  Find 04: [%u:%u(%u)] %s", dw_line, dw_pos, dw_len, pstr_value );
+
+       // Find 05 ---
+       i_result        = LibEditText_FindString( i_tinfoid, i_curid, "ko[a-z]n[a-z]c", 14, &dw_len );
+       CU_ASSERT( LIBEDITTEXT_RET_FINDNOMATCH == i_result );
+
+
        i_result        = LibEditText_FreeCursor( i_tinfoid, i_curid );
        CU_ASSERT( 0x00 == i_result );