1 /*DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64
4 for INTEL64(R), AMD64(R)
6 Copyright(C) 2007-2009 Koine Yuusuke(koinec). All rights reserved.
8 Redistribution and use in source and binary forms, with or without
9 modification, are permitted provided that the following conditions are met:
11 1. Redistributions of source code must retain the above copyright notice,
12 this list of conditions and the following disclaimer.
13 2. Redistributions in binary form must reproduce the above copyright
14 notice, this list of conditions and the following disclaimer in the
15 documentation and/or other materials provided with the distribution.
17 THIS SOFTWARE IS PROVIDED BY Koine Yuusuke(koinec) ``AS IS'' AND ANY
18 EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 DISCLAIMED. IN NO EVENT SHALL Koine Yuusuke(koinec) OR CONTRIBUTORS BE
21 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
27 OF THE POSSIBILITY OF SUCH DAMAGE.
29 DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64*/
31 /* File Info -----------------------------------------------------------
35 ----------------------------------------------------------------------*/
37 #define DRD64_SRC_LIBEDITTEXT_UNDOINFO
38 #include"drd64_libedittext.h"
40 #define LOCATION(n) DRD64_ERR_LOCATION( \
41 DRD64_ERROR_MODULE_LIBEDITTEXT, DRD64_ERROR_ARCH_NODEPEND, \
42 DRD64_SRC_LIBEDITTEXT_UNDOINFO_SRCID, (n))
45 /*----------------------------------------------------------------------
46 ----------------------------------------------------------------------*/
48 LibEditText_UndoInfo_ReadDWordData(
56 if( 0x01 == b_szflag ) {
57 *pdw_value = (DWord)*pb_now;
58 pb_now += sizeof( Byte );
60 else if( 0x02 == b_szflag ) {
61 pw_tmp = (Word *)pb_now;
62 *pdw_value = (DWord)*pw_tmp;
63 pb_now += sizeof( Word );
65 else if( 0x04 == b_szflag ) {
66 pdw_tmp = (DWord *)pb_now;
67 *pdw_value = (DWord)*pdw_tmp;
68 pb_now += sizeof( DWord );
77 /*----------------------------------------------------------------------
78 ----------------------------------------------------------------------*/
80 LibEditText_UndoInfo_CalcPhraseSizeBit(
83 if( 256 > dw_data ) { return 0x01; } // 1Byte Data
84 else if( 65536 > dw_data ) { return 0x02; } // 2Byte Data
86 return 0x03; // 4Byte Data
90 /*----------------------------------------------------------------------
91 ----------------------------------------------------------------------*/
93 LibEditText_UndoInfo_SetDWordData(
102 if( 256 > dw_value ) {
103 pb_value = (Byte *)pb_ptr;
104 *pb_value = (Byte)dw_value;
105 pb_ptr += sizeof( Byte );
107 else if( 65536 > dw_value ) {
108 pw_value = (Word *)pb_ptr;
109 *pw_value = (Word)dw_value;
110 pb_ptr += sizeof( Word );
114 pdw_value = (DWord *)pb_ptr;
115 *pdw_value = (Word)dw_value;
116 pb_ptr += sizeof( DWord );
123 /*----------------------------------------------------------------------
124 ----------------------------------------------------------------------*/
126 LibEditText_UndoInfo_ReadDiffValue(
138 if( 0x01 == b_szflag ) {
139 if( 0x80 == *pb_now ) {
140 pb_now += sizeof( Byte );
142 if( 0x00 != b_direct ) {
143 pdw_tmp = (DWord *)pb_now;
144 *pdw_value = *pdw_tmp;
146 pb_now += sizeof( DWord );
148 if( 0x00 == b_direct ) {
149 pdw_tmp = (DWord *)pb_now;
150 *pdw_value = *pdw_tmp;
152 pb_now += sizeof( DWord );
154 goto goto_LibEditText_UndoInfo_ReadDiffValue_post;
157 pc_diff = (Char *)pb_now;
158 i_diff = (INT)(*pc_diff);
159 pb_now += sizeof( Char );
161 else if( 0x02 == b_szflag ) {
162 ps_diff = (Short *)pb_now;
163 i_diff = (INT)(*ps_diff);
164 pb_now += sizeof( Short );
166 else if( 0x03 == b_szflag ) {
167 pi_diff = (INT *)pb_now;
169 pb_now += sizeof( INT );
172 if( 0x00 == b_direct ) { i_diff *= -1; }
176 *pdw_value -= i_diff;
179 *pdw_value += i_diff;
182 goto_LibEditText_UndoInfo_ReadDiffValue_post:
187 /*----------------------------------------------------------------------
188 ----------------------------------------------------------------------*/
190 LibEditText_UndoInfo_SetDiffValue(
203 if( dw_newvalue > dw_oldvalue ) {
204 dw_diff = dw_newvalue - dw_oldvalue;
208 dw_diff = dw_oldvalue - dw_newvalue;
215 else if( 2147483648 <= dw_diff ) {
216 **pb_ptr = 0x80; // -128 is DWord Value Direct Set mode flag.
220 pdw_value = (DWord *)*pb_ptr;
221 *pdw_value = dw_newvalue;
222 *pb_ptr += sizeof( DWord );
225 pdw_value = (DWord *)*pb_ptr;
226 *pdw_value = dw_oldvalue;
227 *pb_ptr += sizeof( DWord );
232 i_diff *= (int)dw_diff;
234 if( 128 > dw_diff ) {
235 pc_diff = (Char *)*pb_ptr;
236 *pc_diff = (Char)i_diff;
237 *pb_ptr += sizeof( Char );
240 else if( 32768 > dw_diff ) {
241 ps_diff = (Short *)*pb_ptr;
242 *ps_diff = (Short)i_diff;
243 *pb_ptr += sizeof( Short );
247 pi_diff = (INT *)*pb_ptr;
248 (*pi_diff) = (INT)i_diff;
249 *pb_ptr += sizeof( INT );
257 /*----------------------------------------------------------------------
258 ----------------------------------------------------------------------*/
260 LibEditText_UndoInfo_GetStringSize(
261 LibEditText_TextInfo *p_tinfo,
268 pb_end = p_tinfo->pb_undo + p_tinfo->dw_undo_last;
270 while(( '\0' != *pb_now ) && ( pb_now < pb_end )) {
279 /*----------------------------------------------------------------------
280 ----------------------------------------------------------------------*/
281 LIBEDITTEXT_UNDOINFO_EXTERN
283 LibEditText_UndoInfo_ReadUndoInfo(
284 LibEditText_TextInfo *p_tinfo,
285 LibEditText_UndoInfo *pt_udinfo,
292 LibEditText_UndoFlag *pt_udflag;
294 assert( NULL != pt_udinfo );
295 assert( NULL != pb_undo );
299 // Read Command Byte ---
300 pt_udinfo->b_cmd = *pb_now++;
302 // Read UndoFlag Byte ---
303 pt_udflag = (LibEditText_UndoFlag *)pb_now;
304 pt_udinfo->t_udflag = *pt_udflag;
305 pb_now += sizeof( LibEditText_UndoFlag );
308 pb_now = LibEditText_UndoInfo_ReadDWordData(
309 &(pt_udinfo->dw_prevlength), pb_now, (Byte)(pt_udflag->bf_linksz) );
311 pt_udinfo->b_data = 0x00;
312 pt_udinfo->pb_str = NULL;
313 pt_udinfo->dw_data = 0;
314 pt_udinfo->dw_plusline = 0;
315 pt_udinfo->dw_pluspos = 0;
317 // Read Command-Depend Variable Data ---
318 if( LIBEDITTEXT_UNDOCMD_INSERTSTRING == pt_udinfo->b_cmd ) {
319 pt_udinfo->pb_str = pb_now;
320 pt_udinfo->dw_data = LibEditText_UndoInfo_GetStringSize( p_tinfo, pb_now );
321 pt_udinfo->dw_pluspos = pt_udinfo->dw_data;
322 pb_now += (pt_udinfo->dw_pluspos + 1);
324 else if( LIBEDITTEXT_UNDOCMD_INSERTCHAR == pt_udinfo->b_cmd ) {
325 pt_udinfo->b_data = *pb_now;
326 pt_udinfo->dw_data = 1;
327 pt_udinfo->dw_pluspos = 1;
330 else if( LIBEDITTEXT_UNDOCMD_DELETESTRING == pt_udinfo->b_cmd ) {
331 pt_udinfo->pb_str = pb_now;
332 pt_udinfo->dw_data = LibEditText_UndoInfo_GetStringSize( p_tinfo, pb_now );
333 pb_now += (pt_udinfo->dw_data + 1);
335 else if( LIBEDITTEXT_UNDOCMD_DELETECHAR == pt_udinfo->b_cmd ) {
336 pt_udinfo->b_data = *pb_now;
337 pt_udinfo->dw_data = 1;
341 if( 0x00 == b_direct ) { dw_line -= pt_udinfo->dw_plusline; }
342 pt_udinfo->dw_line = dw_line;
343 pb_now = LibEditText_UndoInfo_ReadDiffValue(
344 &(pt_udinfo->dw_line), pb_now, (Byte)(pt_udflag->bf_line), b_direct );
346 if( 0x00 == b_direct ) { dw_pos -= pt_udinfo->dw_pluspos; }
347 pt_udinfo->dw_pos = dw_pos;
348 pb_now = LibEditText_UndoInfo_ReadDiffValue(
349 &(pt_udinfo->dw_pos), pb_now, (Byte)(pt_udflag->bf_pos), b_direct );
355 /*----------------------------------------------------------------------
356 ----------------------------------------------------------------------*/
357 LIBEDITTEXT_UNDOINFO_EXTERN
359 LibEditText_UndoInfo_SetRedoFlag(
362 LibEditText_UndoFlag *pt_udflag;
364 assert( NULL != pb_undo );
366 pt_udflag = (LibEditText_UndoFlag *)(pb_undo + 1);
368 pt_udflag->bf_redone = 0x01;
374 /*----------------------------------------------------------------------
375 ----------------------------------------------------------------------*/
376 LIBEDITTEXT_UNDOINFO_EXTERN
378 LibEditText_UndoInfo_CommitUndo(
379 LibEditText_TextInfo *p_tinfo,
383 LibEditText_UndoFlag *pt_udflag;
385 assert( NULL != p_tinfo );
387 pb_undo = p_tinfo->pb_undo + p_tinfo->dw_undo_end + 1;
388 pt_udflag = (LibEditText_UndoFlag *)pb_undo;
390 pt_udflag->bf_chain = 0x01;
391 p_tinfo->b_undo_flagchain = 0x00;
396 /*----------------------------------------------------------------------
397 ----------------------------------------------------------------------*/
399 LibEditText_UndoInfo_RewindUncommitInfo(
400 LibEditText_TextInfo *p_tinfo )
406 LibEditText_UndoFlag *pt_udflag;
408 assert( NULL != p_tinfo );
410 if( 0 == p_tinfo->dw_undo_last ) { return p_tinfo->pb_undo; }
412 pb_undo = p_tinfo->pb_undo + p_tinfo->dw_undo_end;
413 pb_last = p_tinfo->pb_undo + p_tinfo->dw_undo_last;
415 pt_udflag = (LibEditText_UndoFlag *)(pb_undo + 1);
417 while( 0x00 == pt_udflag->bf_chain ) {
418 pb_tmp = LibEditText_UndoInfo_ReadDWordData( &dw_length, pb_undo, pt_udflag->bf_linksz );
419 if( 0 == dw_length ) { break; }
422 pb_undo -= dw_length;
424 pt_udflag = (LibEditText_UndoFlag *)(pb_undo + 1);
427 p_tinfo->dw_undo_end = pb_undo - p_tinfo->pb_undo;
428 p_tinfo->dw_undo_last = pb_last - p_tinfo->pb_undo;
434 /*----------------------------------------------------------------------
435 ----------------------------------------------------------------------*/
436 LIBEDITTEXT_UNDOINFO_EXTERN
438 LibEditText_UndoInfo_CancelUndoInfo(
439 LibEditText_TextInfo *p_tinfo )
445 LibEditText_UndoFlag *pt_udflag;
447 assert( NULL != p_tinfo );
449 if( 0 == p_tinfo->dw_undo_last ) { return 0x01; }
451 pb_undo = p_tinfo->pb_undo + p_tinfo->dw_undo_end;
452 pb_last = p_tinfo->pb_undo + p_tinfo->dw_undo_last;
454 pt_udflag = (LibEditText_UndoFlag *)(pb_undo + 1);
456 pb_tmp = LibEditText_UndoInfo_ReadDWordData( &dw_length, pb_undo, pt_udflag->bf_linksz );
458 if( 0 < dw_length ) {
460 pb_undo -= dw_length;
462 p_tinfo->dw_undo_end = pb_undo - p_tinfo->pb_undo;
463 p_tinfo->dw_undo_last = pb_last - p_tinfo->pb_undo;
466 dw_length = p_tinfo->dw_undo_last;
467 p_tinfo->dw_undo_last = 0;
470 memset( pb_undo, 0x00, dw_length );
476 /*----------------------------------------------------------------------
477 ----------------------------------------------------------------------*/
478 LIBEDITTEXT_UNDOINFO_EXTERN
480 LibEditText_UndoInfo_SetUndoInfo(
481 LibEditText_TextInfo *p_tinfo,
495 LibEditText_UndoFlag *pt_udflag;
497 assert( NULL != p_tinfo );
498 pb_undo = p_tinfo->pb_undo + p_tinfo->dw_undo_last;
500 /* Check & Expand Undo-Buffer --- */
501 dw_undolength = sizeof( LibEditText_UndoFlag ) + (sizeof( DWord ) * 3) + dw_strlength + 1;
502 if( p_tinfo->dw_undo_bufsize <= (p_tinfo->dw_undo_last + dw_undolength) ) {
503 pb_undo = (Byte *)realloc( p_tinfo->pb_undo,
504 (p_tinfo->dw_undo_bufsize + DRD64_LIBEDITTEXT_DEFAULT_UNDOINFO_BUFSIZE) );
505 if( NULL == pb_undo ) {
509 memset( (pb_undo + p_tinfo->dw_undo_bufsize), 0x00,
510 DRD64_LIBEDITTEXT_DEFAULT_UNDOINFO_BUFSIZE );
512 p_tinfo->dw_undo_bufsize += DRD64_LIBEDITTEXT_DEFAULT_UNDOINFO_BUFSIZE;
513 p_tinfo->pb_undo = pb_undo;
515 pb_undo += p_tinfo->dw_undo_last; // Refreash pb_undo ptr.
518 // Init. Recoding Ptr. ---
521 // Record Undo-Command ---
524 // Reserve UndoFlag Byte ---
525 pt_udflag = (LibEditText_UndoFlag *)pb_now;
526 pb_now += sizeof( LibEditText_UndoFlag );
528 pt_udflag->bf_redone = 0x00;
529 pt_udflag->bf_chain = 0x00;
531 // Record Link Prev. UndoInfo ---
532 if( 0 < p_tinfo->dw_undo_last ) {
533 dw_prevlength = p_tinfo->dw_undo_last - p_tinfo->dw_undo_end;
534 pt_udflag->bf_linksz = LibEditText_UndoInfo_CalcPhraseSizeBit( dw_prevlength );
535 pb_now = LibEditText_UndoInfo_SetDWordData( pb_now, dw_prevlength );
538 { pt_udflag->bf_linksz = 0x00; }
540 // Record Command-Data ---
541 dw_afterline = dw_line;
542 dw_afterpos = dw_pos;
544 if( LIBEDITTEXT_UNDOCMD_INSERTSTRING == b_cmd ) {
546 assert( NULL != pb_str );
548 memcpy( pb_now, pb_str, dw_strlength );
549 pb_now += dw_strlength;
551 dw_afterpos += dw_strlength;
555 else if( LIBEDITTEXT_UNDOCMD_INSERTCHAR == b_cmd ) {
556 // 1Byte -- Inserting Character Byte
560 else if( LIBEDITTEXT_UNDOCMD_DELETESTRING == b_cmd ) {
561 // Save Delete-String for Undo-Buffer ---
562 assert( NULL != pb_str );
564 memcpy( pb_now, pb_str, dw_strlength );
565 pb_now += dw_strlength;
569 else if( LIBEDITTEXT_UNDOCMD_DELETECHAR == b_cmd ) {
573 following Command is NO-Data!
574 LIBEDITTEXT_UNDOCMD_DELETELINE
575 LIBEDITTEXT_UNDOCMD_INSERTLINE
578 // Record Prev. Undo-Line ---
579 pt_udflag->bf_line = LibEditText_UndoInfo_SetDiffValue(
580 &pb_now, dw_line, p_tinfo->dw_undo_line );
582 // Record Prev. Undo-Pos. ---
583 pt_udflag->bf_pos = LibEditText_UndoInfo_SetDiffValue(
584 &pb_now, dw_pos, p_tinfo->dw_undo_pos );
586 p_tinfo->dw_undo_line = dw_afterline;
587 p_tinfo->dw_undo_pos = dw_afterpos;
588 p_tinfo->dw_undo_end = p_tinfo->dw_undo_last;
589 p_tinfo->dw_undo_last = pb_now - p_tinfo->pb_undo;;
595 /*----------------------------------------------------------------------
596 ----------------------------------------------------------------------*/
597 LIBEDITTEXT_UNDOINFO_EXTERN
599 LibEditText_UndoInfo_Init(
600 LibEditText_TextInfo *p_tinfo )
604 assert( NULL != p_tinfo );
606 if( NULL != p_tinfo->pb_undo ) {
610 pb_undo = (Byte *)malloc( DRD64_LIBEDITTEXT_DEFAULT_UNDOINFO_BUFSIZE );
611 if( NULL == pb_undo ) {
614 memset( pb_undo, 0x00, DRD64_LIBEDITTEXT_DEFAULT_UNDOINFO_BUFSIZE );
616 p_tinfo->pb_undo = pb_undo;
617 p_tinfo->dw_undo_bufsize = 0;
618 p_tinfo->dw_undo_last = 0;
619 p_tinfo->dw_undo_line = 0;
620 p_tinfo->dw_undo_pos = 0;
626 /*----------------------------------------------------------------------
627 ----------------------------------------------------------------------*/
628 LIBEDITTEXT_UNDOINFO_EXTERN
630 LibEditText_UndoInfo_Term(
631 LibEditText_TextInfo *p_tinfo )
634 assert( NULL != p_tinfo );
636 if( NULL == p_tinfo->pb_undo ) {
640 free( p_tinfo->pb_undo );
642 p_tinfo->pb_undo = NULL;
643 p_tinfo->dw_undo_bufsize = 0;
644 p_tinfo->dw_undo_last = 0;
645 p_tinfo->dw_undo_line = 0;
646 p_tinfo->dw_undo_pos = 0;
652 /* EOF of drd64_.c ----------------------------------- */