OSDN Git Service

* WorkBackup: 2015/08/08(Sat) AM 10:19 ( Partial Tested ExecRedo API functions.)
[drdeamon64/drdeamon64.git] / libedittext / drd64_libedittext_linectrl.c
1 /*DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64
2
3                          D r . D e a m o n  6 4
4                         for INTEL64(R), AMD64(R)
5         
6    Copyright(C) 2007-2009 Koine Yuusuke(koinec). All rights reserved.
7
8 Redistribution and use in source and binary forms, with or without
9 modification, are permitted provided that the following conditions are met:
10
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.
16
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.
28
29 DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64*/
30
31 /* File Info -----------------------------------------------------------
32 File: drd64_.c
33 Function: 
34 Comment: 
35 ----------------------------------------------------------------------*/
36
37 #define DRD64_SRC_LIBEDITTEXT_LINECTRL
38 #include"drd64_libedittext.h"
39
40 #define LOCATION(n)     DRD64_ERR_LOCATION( \
41                                                 DRD64_ERROR_MODULE_LIBEDITTEXT, DRD64_ERROR_ARCH_NODEPEND, \
42                                                 DRD64_SRC_LIBEDITTEXT_LINECTRL_SRCID, (n))
43
44
45 /*----------------------------------------------------------------------
46 ----------------------------------------------------------------------*/
47 #define FUNCID_LibEditText_LineCtrl_DeleteLine  0x01
48 LIBEDITTEXT_LINECTRL_EXTERN
49 int
50         LibEditText_LineCtrl_DeleteLine(
51                 LibEditText_TextInfo    *p_tinfo,
52                 LibEditText_LineInfo    *p_line,
53                 DWord   dw_line,
54                 Byte    b_undoflag )
55 {
56         int             i_result;
57         Byte    *pb_data;
58         DWord   dw_pos;
59         DWord   dw_before;
60         LibEditText_LineInfo    *p_lbefore;
61         LibEditText_LineInfo    *p_lnext;
62
63         assert( NULL != p_tinfo );
64         assert( NULL != p_line );
65         assert( p_tinfo->dw_maxline > dw_line );
66
67         if( 1 == p_tinfo->dw_maxline )  {
68                 i_result        = LibEditText_LineEdit_ClearLine( p_tinfo, p_line, dw_line );
69                 if( 0x00 != i_result )  {
70                         LibBrownie_Error_SetErrorInfo(
71                                         DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x01 ),
72                                         LOCATION( FUNCID_LibEditText_LineCtrl_DeleteLine ),
73                                         errno, (QWord)i_result, (QWord)0x00, __LINE__ ); 
74                 }
75
76                 return i_result;
77         }
78
79         LibEditText_CursorCtrl_PreProc_DeleteLine( p_tinfo, dw_line );
80
81         // Check & Remove Section ---
82         LibEditText_Section_DeleteLine( p_tinfo, dw_line );
83
84         // Data Clear ---
85         i_result        = LibEditText_LineEdit_ClearLine( p_tinfo, p_line, dw_line );
86         if( 0x00 != i_result )  {
87                 LibBrownie_Error_SetErrorInfo(
88                                 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x02 ),
89                                 LOCATION( FUNCID_LibEditText_LineCtrl_DeleteLine ),
90                                 errno, (QWord)i_result, (QWord)0x00, __LINE__ ); 
91
92                 return i_result;
93         }
94
95         p_line->dw_strlen       = 0;
96
97         // Remove Link LineInfo ---
98         dw_before       = p_line->dw_before;
99         p_lbefore       = LINFO(p_tinfo, p_line->dw_before);
100         p_lnext         = LINFO(p_tinfo, p_line->dw_next);
101
102         if( NULL != p_lbefore )
103                 { p_lbefore->dw_next    = p_line->dw_next; }
104         if( NULL != p_lnext )
105                 { p_lnext->dw_before    = p_line->dw_before; }
106         if( p_tinfo->dw_line_start == p_line->dw_id )
107                 { p_tinfo->dw_line_start        = p_line->dw_next; }
108         if( p_tinfo->dw_line_end == p_line->dw_id )
109                 { p_tinfo->dw_line_end  = p_line->dw_before; }
110
111         p_line->dw_before       = INVALID_LINE;
112         p_line->dw_next         = INVALID_LINE;
113
114         // Remove SortChain ---
115         i_result        = LibEditText_LineInfo_RemoveSortChain( p_tinfo, p_line );
116         if( 0x00 != i_result )  {
117                 LibBrownie_Error_SetErrorInfo(
118                                 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x03 ),
119                                 LOCATION( FUNCID_LibEditText_LineCtrl_DeleteLine ),
120                                 errno, (QWord)i_result, (QWord)0x00, __LINE__ ); 
121
122                 return i_result;
123         }
124
125         // Add EmptyChain ---
126         i_result        = LibEditText_LineInfo_SetEmptyLineChain( p_tinfo, p_line );
127         if( 0x00 != i_result )  {
128                 LibBrownie_Error_SetErrorInfo(
129                                 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x04 ),
130                                 LOCATION( FUNCID_LibEditText_LineCtrl_DeleteLine ),
131                                 errno, (QWord)i_result, (QWord)0x00, __LINE__ ); 
132
133                 return i_result;
134         }
135
136         p_tinfo->dw_maxline--;
137
138         // If the char. of the before delete-line is 'n', delete 'n' char.
139         p_lbefore       = LINFO(p_tinfo, dw_before);
140         if( NULL != p_lbefore ) {
141                 if(( p_tinfo->dw_line_end == p_lbefore->dw_id ) && ( 0 < p_lbefore->dw_strlen ))        {
142                         pb_data = p_tinfo->pb_text + p_lbefore->dw_start + p_lbefore->dw_strlen - 1;
143                         if( '\n' == *pb_data )  {
144                                 p_lbefore->dw_strlen--;
145                                 *pb_data        = '\0';
146                         }
147                 }
148         }
149
150         LibEditText_CursorCtrl_DeleteLine( p_tinfo, dw_line );
151         
152         // Set Undo Info ---
153         if( 0x00 == b_undoflag )        {
154                 p_lbefore       = LINFO(p_tinfo, p_line->dw_before);
155                 if( NULL != p_lbefore ) { dw_pos        = p_lbefore->dw_strlen - 1; }
156                 else                                    { dw_pos        = p_tinfo->dw_undo_pos; }
157
158                 i_result        = LibEditText_UndoInfo_SetUndoInfo(
159                                                         p_tinfo, dw_line, dw_pos,
160                                                         LIBEDITTEXT_UNDOCMD_DELETELINE, 0x00, NULL, 0 );
161                 if( 0x00 != i_result )  {
162                         LibBrownie_Error_SetErrorInfo(
163                                         DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x05 ),
164                                         LOCATION( FUNCID_LibEditText_LineCtrl_DeleteLine ),
165                                         errno, (QWord)i_result, (QWord)0x00, __LINE__ ); 
166         
167                         return i_result;
168                 }
169         }
170
171         return 0x00;
172 }
173
174
175 /*----------------------------------------------------------------------
176 ----------------------------------------------------------------------*/
177 #define FUNCID_LibEditText_LineCtrl_JoinLine    0x02
178 LIBEDITTEXT_LINECTRL_EXTERN
179 int
180         LibEditText_LineCtrl_JoinLine(
181                 LibEditText_TextInfo    *p_tinfo,
182                 LibEditText_LineInfo    *p_ldest,
183                 DWord   dw_line )
184 {
185         int             i_result;
186         Byte    *pb_src;
187         DWord   dw_pos;
188         DWord   dw_srclen;
189         LibEditText_LineInfo    *p_lsrc;
190
191         // Check 
192         assert( NULL != p_tinfo );
193         assert( NULL != p_ldest );
194
195         if(( 1 >= p_tinfo->dw_maxline ) && ( 0 == dw_line ))    {
196                 LibBrownie_Error_SetErrorInfo(
197                                 DRD64_WARNING( DRD64_ERROR_PTN_FAILED_ARG, 0x00, 0x01 ),
198                                 LOCATION( FUNCID_LibEditText_LineCtrl_JoinLine ),
199                                 errno, (QWord)p_tinfo->dw_maxline, (QWord)dw_line, __LINE__ ); 
200
201                 return 0x01;
202         }
203         if( p_tinfo->dw_line_end == p_ldest->dw_id )    {
204                 LibBrownie_Error_SetErrorInfo(
205                                 DRD64_WARNING( DRD64_ERROR_PTN_FAILED_ARG, 0x00, 0x02 ),
206                                 LOCATION( FUNCID_LibEditText_LineCtrl_JoinLine ),
207                                 errno, (QWord)p_tinfo->dw_line_end, (QWord)p_ldest->dw_id, __LINE__ ); 
208
209                 return 0x02;
210         }
211
212         p_lsrc  = LINFO(p_tinfo, p_ldest->dw_next);
213         assert( NULL != p_lsrc );
214
215         pb_src          = p_tinfo->pb_text + p_lsrc->dw_start;
216         dw_pos          = p_ldest->dw_strlen - 1;
217
218         dw_srclen       = ((p_tinfo->dw_line_end != p_lsrc->dw_id)
219                                                         ? p_lsrc->dw_strlen - 1 : p_lsrc->dw_strlen );
220         if( 0 < dw_srclen )     {
221                 i_result        = LibEditText_LineEdit_CopyString(
222                                                         p_tinfo, p_ldest, dw_line, dw_pos, (Byte *)pb_src, dw_srclen );
223                 if( 0x00 != i_result )  {
224                         LibBrownie_Error_SetErrorInfo(
225                                         DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x03 ),
226                                         LOCATION( FUNCID_LibEditText_LineCtrl_JoinLine ),
227                                         errno, (QWord)i_result, (QWord)0x00, __LINE__ ); 
228         
229                         return -0x04;
230                 }
231         }
232
233
234         // delete line
235         i_result        = LibEditText_LineCtrl_DeleteLine( p_tinfo, p_lsrc, (dw_line + 1), 0x00 );
236         if( 0x00 != i_result )  {
237                 LibBrownie_Error_SetErrorInfo(
238                                 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x04 ),
239                                 LOCATION( FUNCID_LibEditText_LineCtrl_JoinLine ),
240                                 errno, (QWord)i_result, (QWord)0x00, __LINE__ ); 
241
242                 return -0x04;
243         }
244         
245         return 0x00;
246 }
247
248
249 /*----------------------------------------------------------------------
250 ----------------------------------------------------------------------*/
251 #define FUNCID_LibEditText_LineCtrl_PushLine    0x03
252 LIBEDITTEXT_LINECTRL_EXTERN
253 DWord
254         LibEditText_LineCtrl_PushLine(
255                 LibEditText_TextInfo    *p_tinfo,
256                 DWord   dw_lnextid,
257                 DWord   dw_line,
258                 DWord   dw_length,
259                 Byte    b_undoflag )
260 {
261         int                                             i_result;
262         Byte                                    *pb_data;
263         DWord                                   dw_buflength;
264         LibEditText_LineInfo    *p_lnext;
265         LibEditText_LineInfo    *p_lbefore;
266         LibEditText_LineInfo    *p_line;
267         
268         assert( NULL != p_tinfo );
269
270         p_lnext = LINFO(p_tinfo, dw_lnextid);
271         assert( NULL != p_lnext );
272
273         p_lbefore       = LINFO(p_tinfo, p_lnext->dw_before);
274
275         if( NULL == p_lbefore )
276                 { goto  goto_LibEditText_LineCtrl_PushLine_prechecked; }
277
278         if( 0 < p_lbefore->dw_strlen )  {       
279                 pb_data = p_tinfo->pb_text + p_lbefore->dw_start + p_lbefore->dw_strlen - 1;
280                 if( '\n' == *pb_data )
281                         { goto  goto_LibEditText_LineCtrl_PushLine_prechecked; }
282         }
283
284         // Insert LF in before push-line ---
285         i_result        = LibEditText_LineEdit_InsertString(
286                                                 p_tinfo, p_lbefore, (dw_line - 1),
287                                                 (p_lbefore->dw_strlen - 1), (Byte *)"\n", 1, 0x01 );
288         if( 0x00 != i_result )  {
289                 LibBrownie_Error_SetErrorInfo(
290                                 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x01 ),
291                                 LOCATION( FUNCID_LibEditText_LineCtrl_PushLine ),
292                                 errno, (QWord)i_result, (QWord)0x00, __LINE__ ); 
293
294                 return INVALID_LINE;
295         }
296
297 goto_LibEditText_LineCtrl_PushLine_prechecked:
298         // PreProccess
299         if( 0 == dw_length )
300                 { dw_buflength  = DRD64_LIBEDITTEXT_DEFAULT_RESERVEBUF_INLINE * 4; }
301         else
302                 { dw_buflength  = dw_length + DRD64_LIBEDITTEXT_DEFAULT_RESERVEBUF_INLINE; }
303
304         // Get LineInfo struct
305         p_line  = LibEditText_LineInfo_GetEmptyLineInfo( p_tinfo, dw_buflength );
306         if( NULL == p_line )    {
307                 LibBrownie_Error_SetErrorInfo(
308                                 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x11 ),
309                                 LOCATION( FUNCID_LibEditText_LineCtrl_PushLine ),
310                                 errno, (QWord)dw_buflength, (QWord)0x00, __LINE__ ); 
311
312                 return INVALID_LINE;
313         }
314
315         p_lnext         = LINFO(p_tinfo, dw_lnextid);
316         p_lbefore       = LINFO(p_tinfo, p_lnext->dw_before);
317         
318         // Link Before & After LineInfo
319         if( NULL != p_lbefore ) {
320                 p_lbefore->dw_next      = p_line->dw_id;
321                 p_line->dw_before       = p_lbefore->dw_id;
322         }
323         else    {
324                 p_line->dw_before       = INVALID_LINE;
325                 p_tinfo->dw_line_start  = p_line->dw_id;
326         }
327
328         p_line->dw_next         = p_lnext->dw_id;
329         p_lnext->dw_before      = p_line->dw_id;
330
331         // Set LineInfo to SortChain
332         i_result    = LibEditText_LineInfo_AddSortChain( p_tinfo, p_line );
333         if( 0x00 != i_result )  {
334                 LibBrownie_Error_SetErrorInfo(
335                                 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x12 ),
336                                 LOCATION( FUNCID_LibEditText_LineCtrl_PushLine ),
337                                 errno, (QWord)dw_buflength, (QWord)0x00, __LINE__ ); 
338
339                 return INVALID_LINE;
340         }
341
342         // Set Init. TextData
343         p_line->dw_strlen       = 1;
344         *(p_tinfo->pb_text + p_line->dw_start + 0) = '\n';
345         *(p_tinfo->pb_text + p_line->dw_start + 1) = '\0';
346
347         // Adjust LineSection
348         i_result        = LibEditText_Section_InsertLine( p_tinfo, dw_line );
349         if( 0x00 != i_result )  {
350                 LibBrownie_Error_SetErrorInfo(
351                                 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x13 ),
352                                 LOCATION( FUNCID_LibEditText_LineCtrl_PushLine ),
353                                 errno, (QWord)dw_buflength, (QWord)0x00, __LINE__ ); 
354
355                 return INVALID_LINE;
356         }
357
358         p_tinfo->dw_maxline++;
359
360         LibEditText_CursorCtrl_InsertLine( p_tinfo, dw_line );
361
362         // Set Undo Info ---
363         if( 0x00 == b_undoflag )        {
364                 i_result        = LibEditText_UndoInfo_SetUndoInfo(
365                                                                 p_tinfo, dw_line, p_tinfo->dw_undo_pos, 
366                                                                 LIBEDITTEXT_UNDOCMD_INSERTLINE, 0x00, NULL, 0 );
367                 if( 0x00 != i_result )  {
368                         LibBrownie_Error_SetErrorInfo(
369                                         DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x14 ),
370                                         LOCATION( FUNCID_LibEditText_LineCtrl_PushLine ),
371                                         errno, (QWord)i_result, (QWord)0x00, __LINE__ ); 
372         
373                         return INVALID_LINE;
374                 }
375         }
376
377         return p_line->dw_id;
378 }
379
380
381 /*----------------------------------------------------------------------
382 ----------------------------------------------------------------------*/
383 #define FUNCID_LibEditText_LineCtrl_AddLine     0x04
384 LIBEDITTEXT_LINECTRL_EXTERN
385 DWord
386         LibEditText_LineCtrl_AddLine(
387                 LibEditText_TextInfo    *p_tinfo,
388                 DWord   dw_lbeforeid,
389                 DWord   dw_line,
390                 DWord   dw_length,
391                 Byte    b_mode,
392                 Byte    b_undoflag )
393 {
394         int                                             i_result;
395         Byte                                    *pb_data;
396         DWord                                   dw_buflength;
397         LibEditText_LineInfo    *p_lnext;
398         LibEditText_LineInfo    *p_lbefore;
399         LibEditText_LineInfo    *p_line;
400         
401         assert( NULL != p_tinfo );
402
403         p_lbefore       = LINFO(p_tinfo, dw_lbeforeid);
404         if( NULL == p_lbefore )
405                         { goto  goto_LibEditText_LineCtrl_AddLine_prechecked; }
406
407         if( 0 < p_lbefore->dw_strlen )  {       
408                 pb_data = p_tinfo->pb_text + p_lbefore->dw_start + p_lbefore->dw_strlen - 1;
409                 if( '\n' == *pb_data )
410                         { goto  goto_LibEditText_LineCtrl_AddLine_prechecked; }
411         }
412
413         // Insert LF in before Add-Line ---
414         i_result        = LibEditText_LineEdit_InsertString(
415                                                         p_tinfo, p_lbefore, dw_line, p_lbefore->dw_strlen,
416                                                         (Byte *)"\n", 1, 0x01 );
417         if( 0x00 != i_result )  {
418                 LibBrownie_Error_SetErrorInfo(
419                                 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x01 ),
420                                 LOCATION( FUNCID_LibEditText_LineCtrl_AddLine ),
421                                 errno, (QWord)i_result, (QWord)0x00, __LINE__ ); 
422
423                 return INVALID_LINE;
424         }
425
426 goto_LibEditText_LineCtrl_AddLine_prechecked:
427         // PreProccess
428         if( 0 == dw_length )
429                 { dw_buflength  = DRD64_LIBEDITTEXT_DEFAULT_RESERVEBUF_INLINE * 4; }
430         else
431                 { dw_buflength  = dw_length + DRD64_LIBEDITTEXT_DEFAULT_RESERVEBUF_INLINE; }
432
433         // Get LineInfo struct
434         p_line  = LibEditText_LineInfo_GetEmptyLineInfo( p_tinfo, dw_buflength );
435         if( NULL == p_line )    {
436                 LibBrownie_Error_SetErrorInfo(
437                                 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x11 ),
438                                 LOCATION( FUNCID_LibEditText_LineCtrl_AddLine ),
439                                 errno, (QWord)dw_buflength, (QWord)0x00, __LINE__ ); 
440
441                 return INVALID_LINE;
442         }
443
444         p_lbefore       = LINFO(p_tinfo, dw_lbeforeid);
445         
446         // Link Before & After LineInfo
447         if( NULL != p_lbefore ) {
448                 p_lnext                         = LINFO(p_tinfo, p_lbefore->dw_next);
449                 p_lbefore->dw_next      = p_line->dw_id;
450         }
451         else    {
452                 p_lnext         = NULL;
453                 p_tinfo->dw_line_start = p_line->dw_id;
454         }
455
456         p_line->dw_before       = ((NULL == p_lbefore) ? INVALID_LINE : p_lbefore->dw_id );
457
458         if( NULL != p_lnext )   {
459                 p_lnext->dw_before      = p_line->dw_id;
460                 p_line->dw_next         = p_lnext->dw_id;
461         }
462         else    {
463                 p_line->dw_next                 = INVALID_LINE;
464                 p_tinfo->dw_line_end    = p_line->dw_id;
465         }
466
467         // Set LineInfo to SortChain
468         i_result    = LibEditText_LineInfo_AddSortChain( p_tinfo, p_line );
469         if( 0x00 != i_result )  {
470                 LibBrownie_Error_SetErrorInfo(
471                                 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x12 ),
472                                 LOCATION( FUNCID_LibEditText_LineCtrl_AddLine ),
473                                 errno, (QWord)dw_buflength, (QWord)0x00, __LINE__ ); 
474
475                 return INVALID_LINE;
476         }
477
478         // Adjust LineSection
479         if( 0x00 == b_mode )    {
480                 // Set Init. TextData
481                 if( p_tinfo->dw_line_end != p_line->dw_id )             {
482                         p_line->dw_strlen       = 1;
483                         *(p_tinfo->pb_text + p_line->dw_start + 0) = '\n';
484                         *(p_tinfo->pb_text + p_line->dw_start + 1) = '\0';
485                 }
486
487                 i_result        = LibEditText_Section_InsertLine( p_tinfo, dw_line + 1 );
488                 if( 0x00 != i_result )  {
489                         LibBrownie_Error_SetErrorInfo(
490                                         DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x13 ),
491                                         LOCATION( FUNCID_LibEditText_LineCtrl_AddLine ),
492                                         errno, (QWord)dw_buflength, (QWord)0x00, __LINE__ ); 
493         
494                         return INVALID_LINE;
495                 }
496         
497                 p_tinfo->dw_maxline++;
498         
499                 LibEditText_CursorCtrl_InsertLine( p_tinfo, dw_line + 1 );
500         }
501
502         // Set Undo Info ---
503         if(( 0x00 == b_mode ) && ( 0x00 == b_undoflag ))        {
504                 i_result        = LibEditText_UndoInfo_SetUndoInfo(
505                                                         p_tinfo, dw_line + 1, p_tinfo->dw_undo_pos, 
506                                                         LIBEDITTEXT_UNDOCMD_INSERTLINE, 0x00, NULL, 0 );
507                 if( 0x00 != i_result )  {
508                         LibBrownie_Error_SetErrorInfo(
509                                         DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x14 ),
510                                         LOCATION( FUNCID_LibEditText_LineCtrl_AddLine ),
511                                         errno, (QWord)i_result, (QWord)0x00, __LINE__ ); 
512         
513                         return INVALID_LINE;
514                 }
515         }
516
517         return p_line->dw_id;
518 }
519
520
521 /*----------------------------------------------------------------------
522 ----------------------------------------------------------------------*/
523 #define FUNCID_LibEditText_LineCtrl_InsertLine  0x05
524 LIBEDITTEXT_LINECTRL_EXTERN
525 int
526         LibEditText_LineCtrl_InsertLine(
527                 LibEditText_TextInfo    *p_tinfo,
528                 DWord   dw_lnext,
529                 Byte    *pb_text,
530                 DWord   dw_length )
531 {
532         int                                             i_result;
533         DWord                                   dw_insline;
534         LibEditText_LineInfo    *p_lnext;
535         
536         assert( NULL != p_tinfo );
537
538         p_lnext = LibEditText_Section_SearchLine( p_tinfo, dw_lnext );
539         assert( NULL != p_lnext );
540
541         dw_insline      = LibEditText_LineCtrl_PushLine(
542                                                         p_tinfo, p_lnext->dw_id, dw_lnext, dw_length, 0x00 );
543         if( INVALID_LINE == dw_insline )        {
544                 LibBrownie_Error_SetErrorInfo(
545                                 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x11 ),
546                                 LOCATION( FUNCID_LibEditText_LineCtrl_InsertLine ),
547                                 errno, (QWord)p_lnext->dw_id, (QWord)dw_lnext, __LINE__ ); 
548
549                 return -0x11;
550         }
551
552         i_result        = LibEditText_LineEdit_InsertString(
553                                                         p_tinfo, LINFO(p_tinfo, dw_insline), dw_lnext, 0,
554                                                         pb_text, dw_length, 0x00 );
555         if( 0x00 != i_result )  {
556                 LibBrownie_Error_SetErrorInfo(
557                                 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x12 ),
558                                 LOCATION( FUNCID_LibEditText_LineCtrl_InsertLine ),
559                                 errno, (QWord)i_result, (QWord)dw_insline, __LINE__ ); 
560
561                 return -0x12;
562         }
563
564         return 0x00;
565 }
566
567
568 /*----------------------------------------------------------------------
569 ----------------------------------------------------------------------*/
570 #define FUNCID_LibEditText_LineCtrl_SplitLine   0x06
571 LIBEDITTEXT_LINECTRL_EXTERN
572 int
573         LibEditText_LineCtrl_SplitLine(
574                 LibEditText_TextInfo    *p_tinfo,
575                 DWord   dw_lineid,
576                 DWord   dw_line,
577                 DWord   dw_pos )
578 {
579         int                                             i_result;
580         Byte                                    *pb_str;
581         DWord                                   dw_lnextid;
582         DWord                                   dw_length;
583         LibEditText_LineInfo    *p_line;
584         LibEditText_LineInfo    *p_lnext;
585         
586         assert( NULL != p_tinfo );
587         
588         p_line  = LINFO(p_tinfo, dw_lineid);
589         assert( NULL != p_line );
590
591         assert( p_line->dw_strlen >= dw_pos );
592
593         dw_length       = p_line->dw_strlen - dw_pos;
594         pb_str                  = p_tinfo->pb_text + p_line->dw_start + dw_pos;
595
596         if( p_line->dw_strlen == dw_pos + 1 )   {
597                 if( '\n' == *pb_str )   { dw_length     = 0; }
598         }
599
600         // Add New Line ---
601         dw_lnextid      = LibEditText_LineCtrl_AddLine(
602                                                         p_tinfo, p_line->dw_id, dw_line, dw_length, 0x00, 0x00 );
603         if( INVALID_LINE == dw_lnextid )        {
604                 LibBrownie_Error_SetErrorInfo(
605                                 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x11 ),
606                                 LOCATION( FUNCID_LibEditText_LineCtrl_SplitLine ),
607                                 errno, (QWord)p_line->dw_id, (QWord)dw_line, __LINE__ ); 
608
609                 return -0x11;
610         }
611
612         if( 0 < dw_length )             {
613                 // Add After Indicate-Position String to NextLine ---
614                 p_lnext         = LINFO(p_tinfo, dw_lnextid);
615                 i_result        = LibEditText_LineEdit_InsertString(
616                                                         p_tinfo, p_lnext, (dw_line + 1), 0, pb_str, dw_length, 0x00 );
617                 if( 0x00 != i_result )  {
618                         LibBrownie_Error_SetErrorInfo(
619                                         DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x12 ),
620                                         LOCATION( FUNCID_LibEditText_LineCtrl_SplitLine ),
621                                         errno, (QWord)p_lnext->dw_id, (QWord)dw_length, __LINE__ ); 
622
623                         return -0x12;
624                 }
625
626                 // Delete After Indicate-Position String ---
627                 p_line  = LINFO(p_tinfo, dw_lineid);
628                 assert( NULL != p_line );
629
630                 assert( p_line->dw_strlen > dw_pos );
631                 dw_length       = p_line->dw_strlen - dw_pos - 1;
632                 
633                 i_result        = LibEditText_LineEdit_DeleteString(
634                                                         p_tinfo, p_line, dw_line, dw_pos, dw_length, 0x00 );
635                 if( 0x00 != i_result )  {
636                         LibBrownie_Error_SetErrorInfo(
637                                         DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x13 ),
638                                         LOCATION( FUNCID_LibEditText_LineCtrl_SplitLine ),
639                                         errno, (QWord)p_line->dw_id, (QWord)dw_length, __LINE__ ); 
640
641                         return -0x13;
642                 }
643         }
644         
645         return 0x00;
646 }
647
648
649 /*----------------------------------------------------------------------
650 ----------------------------------------------------------------------*/
651 #define FUNCID_LibEditText_LineCtrl_AppendLine  0x07
652 LIBEDITTEXT_LINECTRL_EXTERN
653 int
654         LibEditText_LineCtrl_AppendLine(
655                 LibEditText_TextInfo            *p_tinfo,
656                 Byte    *pstr_text,
657                 DWord   dw_length,
658                 Byte    b_mode )
659 {
660         int                                             i_result;
661         DWord                                   dw_lappendid;
662
663         assert( NULL != p_tinfo );
664
665         dw_lappendid    = LibEditText_LineCtrl_AddLine(
666                                                                 p_tinfo, p_tinfo->dw_line_end, p_tinfo->dw_maxline - 1,
667                                                                 dw_length, b_mode, 0x00 );
668         if( INVALID_LINE == dw_lappendid )      {
669                 LibBrownie_Error_SetErrorInfo(
670                                 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x11 ),
671                                 LOCATION( FUNCID_LibEditText_LineCtrl_AppendLine ),
672                                 errno, (QWord)p_tinfo->dw_line_end, (QWord)p_tinfo->dw_maxline, __LINE__ ); 
673
674                 return -0x11;
675         }
676
677         i_result        = LibEditText_LineEdit_InsertString(
678                                                         p_tinfo, LINFO(p_tinfo, dw_lappendid), (p_tinfo->dw_maxline - 1),
679                                                         0, (Byte *)pstr_text, dw_length, b_mode );
680         if( 0x00 != i_result )  {
681                 LibBrownie_Error_SetErrorInfo(
682                                 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x12 ),
683                                 LOCATION( FUNCID_LibEditText_LineCtrl_AppendLine ),
684                                 errno, (QWord)i_result, (QWord)dw_length, __LINE__ ); 
685
686                 return -0x12;
687         }
688
689         if( 0x00 != b_mode )
690                 { LibEditText_UndoInfo_CancelUndoInfo( p_tinfo ); }
691
692         return 0x00;
693 }
694
695
696 /* EOF of drd64_.c ----------------------------------- */