OSDN Git Service

* Implement: LibEditText_Undo_ReadUndoInfo() (non-Tested)
authorKoine Yuusuke(koinec) <koinec@users.sourceforge.jp>
Mon, 13 Jul 2015 13:04:26 +0000 (22:04 +0900)
committerKoine Yuusuke(koinec) <koinec@users.sourceforge.jp>
Mon, 13 Jul 2015 13:04:26 +0000 (22:04 +0900)
libedittext/drd64_libedittext_debug.c
libedittext/drd64_libedittext_undo.c
libedittext/drd64_libedittext_undo.h

index 617b9cd..fa44f36 100644 (file)
@@ -41,6 +41,48 @@ Comment:
 ----------------------------------------------------------------------*/
 LIBEDITTEXT_DEBUG_EXTERN
 int
+       LibEditText_Debug_UndoInfo(
+               LibEditText_TextInfo    *p_tinfo,
+               Byte    b_putflag )
+{
+       Byte    *pb_undo;
+       Byte    *pb_now;
+       Byte    b_cmd;
+       DWord   dw_line;
+       DWord   dw_pos;
+       DWord   dw_prevlength;
+       LibEditText_UndoFlag    *pt_udflag;
+       
+
+       assert( NULL != p_tinfo );
+
+       pb_undo = p_tinfo->pb_undo + p_tinfo->dw_undo_end;
+
+       dw_line = p_tinfo->dw_undo_line;
+       dw_pos  = p_tinfo->dw_undo_pos;
+
+       do      {
+               pb_now                  = pb_undo;
+
+               b_cmd                   = *pb_now++;
+               
+               pt_udflag               = (LibEditText_UndoFlag *)pb_now;
+               pb_now++;
+
+               
+
+               dw_prevlength   = LibEditText_Undo_GetRewindSize( pb_now );
+               pb_undo                 -= dw_prevlength;
+       }while( pb_undo > p_tinfo->pb_undo );
+
+       return 0x00;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+LIBEDITTEXT_DEBUG_EXTERN
+int
        LibEditText_Debug_Cursor(
                LibEditText_TextInfo            *p_tinfo,
                Byte b_putflag )
index 553b087..5f3bec9 100644 (file)
@@ -53,6 +53,130 @@ Comment:
 
 /*----------------------------------------------------------------------
 ----------------------------------------------------------------------*/
+Byte *
+       LibEditText_Undo_ReadDWordData(
+                       DWord   *pdw_value,
+                       Byte    *pb_now,
+                       Byte    b_szflag )
+{
+       Byte                                    b_tmp;
+       Word                                    w_tmp;
+       DWord                                   dw_tmp;
+       
+       if( 0x01 == b_szflag )  {
+               b_tmp           = (Byte)*pb_now;
+               *pdw_value      = (DWord)b_tmp;
+               pb_now          += 1;
+       }
+       else if( 0x02 == b_szflag )     {
+               w_tmp           = (Word)*pb_now;
+               *pdw_value      = (DWord)w_tmp;
+               pb_now          += 2;
+       }
+       else if( 0x04 == b_szflag )     {
+               dw_tmp          = (Word)*pb_now;
+               *pdw_value      = (DWord)dw_tmp;
+               pb_now          += 4;
+       }
+       else
+               { *pdw_value    = 0xffffffff; }
+
+       return pb_now;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+DWord
+       LibEditText_Undo_GetStringSize(
+                       LibEditText_TextInfo    *p_tinfo,
+                       Byte    *pb_now )
+{
+       Byte    *pb_end;
+       DWord   dw_size;
+
+       dw_size = 0;
+       pb_end  = p_tinfo->pb_undo + p_tinfo->dw_undo_last;
+
+       while(( '\0' != *pb_now ) && ( pb_now < pb_end ))       {
+               pb_now++;
+               dw_size++;
+       }
+
+       return dw_size;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+LIBEDITTEXT_UNDO_EXTERN
+int
+       LibEditText_Undo_ReadUndoInfo(
+                       LibEditText_TextInfo    *p_tinfo,
+                       LibEditText_UndoInfo    *pt_udinfo,
+                       Byte                                    *pb_undo )
+{
+       Byte    *pb_now;        
+       DWord   *pdw_value;
+       LibEditText_UndoFlag    *pt_udflag;
+
+       assert( NULL != pt_udinfo );
+       assert( NULL != pb_undo );
+
+       pb_now  = pb_undo;
+
+       pt_udinfo->b_cmd        = *pb_now++;
+
+       pt_udflag                       = (LibEditText_UndoFlag *)pb_now;
+       pt_udinfo->t_udflag     = *pt_udflag;
+       pb_now                          += sizeof( LibEditText_UndoFlag );
+
+       pb_now  = LibEditText_Undo_ReadDWordData(
+                               &(pt_udinfo->dw_prevlength), pb_now, (Byte)(pt_udflag->bf_linksz) );
+       
+       pb_now  = LibEditText_Undo_ReadDWordData(
+                               &(pt_udinfo->dw_line), pb_now, (Byte)(pt_udflag->bf_line) );
+
+       pb_now  = LibEditText_Undo_ReadDWordData(
+                               &(pt_udinfo->dw_pos), pb_now, (Byte)(pt_udflag->bf_pos) );
+
+       pt_udinfo->b_data               = 0x00;
+       pt_udinfo->pb_str               = NULL;
+       pt_udinfo->dw_strlength = 0;
+       pt_udinfo->dw_plusline  = 0;
+       pt_udinfo->dw_pluspos   = 0;
+
+       if( LIBEDITTEXT_UNDOCMD_INSERTSTRING == pt_udinfo->b_cmd )      {
+               pt_udinfo->pb_str               = pb_now;
+               pt_udinfo->dw_strlength = LibEditText_Undo_GetStringSize( p_tinfo, pb_now );
+               pt_udinfo->dw_pluspos   = pt_udinfo->dw_strlength;
+       }
+       else if( LIBEDITTEXT_UNDOCMD_INSERTCHAR == pt_udinfo->b_cmd )   {
+               pt_udinfo->b_data               = *pb_now;
+               pt_udinfo->dw_strlength = 1;
+               pt_udinfo->dw_pluspos   = 1;
+       }
+       else if( LIBEDITTEXT_UNDOCMD_DELETESTRING == pt_udinfo->b_cmd ) {
+               if( 0xff == *pb_now )   {
+                       pdw_value       = (DWord *)(pb_now + 1);
+                       pt_udinfo->dw_strlength = *pdw_value;
+               }
+               else    {
+                       pt_udinfo->dw_strlength = (DWord)(*pb_now);
+               }
+
+       }
+       else if( LIBEDITTEXT_UNDOCMD_SPLITLINE == pt_udinfo->b_cmd )    {
+               pt_udinfo->dw_plusline  = 1;
+               //pt_udinfo->dw_pluspos = 0;
+       }
+       
+       return 0x00;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
 Byte
        LibEditText_Undo_CalcPhraseSizeBit(
                        DWord   dw_data )
@@ -120,9 +244,9 @@ void
 
 /*----------------------------------------------------------------------
 ----------------------------------------------------------------------*/
+LIBEDITTEXT_UNDO_EXTERN
 DWord
        LibEditText_Undo_GetRewindSize(
-                       LibEditText_TextInfo    *p_tinfo,
                        Byte    *pb_now )
 {
        Byte                                    *pb_tmp;
@@ -175,7 +299,7 @@ Byte *
        pt_udflag       = (LibEditText_UndoFlag *)(pb_undo + 1);
        
        while( 0x00 == pt_udflag->bf_chain )    {
-               dw_length       = LibEditText_Undo_GetRewindSize( p_tinfo, pb_undo );
+               dw_length       = LibEditText_Undo_GetRewindSize( pb_undo );
                if( 0 == dw_length )    { break; }
 
                pb_last = pb_undo;
@@ -305,7 +429,7 @@ int
                        pb_now          += sizeof( DWord );
                }
 
-               dw_afterpos             -= dw_strlength;
+               //dw_afterpos           -= dw_strlength;
        }
        else if( LIBEDITTEXT_UNDOCMD_SPLITLINE == b_cmd )       {
                dw_afterline++;
index 1de5a77..5542f42 100644 (file)
@@ -67,6 +67,26 @@ typedef      struct  {
 } LibEditText_UndoFlag;
 
 
+typedef struct {
+       Byte                                    b_cmd;
+       LibEditText_UndoFlag    t_udflag;
+       DWord                                   dw_prevlength;
+       DWord                                   dw_line;
+       DWord                                   dw_pos;
+       DWord                                   dw_strlength;
+       Byte                                    b_data;
+       Byte                                    *pb_str;
+
+       DWord                                   dw_plusline;
+       DWord                                   dw_pluspos;
+} LibEditText_UndoInfo;
+
+
+LIBEDITTEXT_UNDO_EXTERN
+       int LibEditText_Undo_ReadUndoInfo(
+                       LibEditText_TextInfo *p_tinfo, LibEditText_UndoInfo *pt_udinfo, Byte *pb_undo );
+LIBEDITTEXT_UNDO_EXTERN
+       DWord LibEditText_Undo_GetRewindSize( Byte *pb_now );
 LIBEDITTEXT_UNDO_EXTERN
        void LibEditText_Undo_CommitUndo( LibEditText_TextInfo *p_tinfo );
 LIBEDITTEXT_UNDO_EXTERN