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_LINECTRL
38 #include"drd64_libedittext.h"
41 /*----------------------------------------------------------------------
42 ----------------------------------------------------------------------*/
43 LIBEDITTEXT_LINECTRL_EXTERN
45 LibEditText_LineCtrl_DeleteLine(
46 LibEditText_TextInfo *p_tinfo,
47 LibEditText_LineInfo *p_line,
52 LibEditText_LineInfo *p_lbefore;
53 LibEditText_LineInfo *p_lnext;
55 assert( NULL != p_tinfo );
56 assert( NULL != p_line );
58 if( 1 == p_tinfo->dw_maxline ) { return 0x00; }
60 // Check & Remove Section ---
61 LibEditText_Section_DeleteLine( p_tinfo, dw_line );
64 pb_data = p_tinfo->pb_text + p_line->dw_start;
65 memset( pb_data, 0x00, p_line->dw_linelen );
66 p_line->dw_strlen = 0;
68 // Remove Link LineInfo ---
69 p_lbefore = LINFO(p_tinfo, p_line->dw_before);
70 p_lnext = LINFO(p_tinfo, p_line->dw_next);
72 if( NULL != p_lbefore )
73 { p_lbefore->dw_next = p_line->dw_next; }
75 { p_lnext->dw_before = p_line->dw_before; }
76 if( p_tinfo->dw_line_start == p_line->dw_id )
77 { p_tinfo->dw_line_start = p_line->dw_next; }
78 if( p_tinfo->dw_line_end == p_line->dw_id )
79 { p_tinfo->dw_line_end = p_line->dw_before; }
81 p_line->dw_before = INVALID_LINE;
82 p_line->dw_next = INVALID_LINE;
84 // Remove SortChain ---
85 i_result = LibEditText_LineInfo_RemoveSortChain( p_tinfo, p_line );
86 if( 0x00 != i_result ) { return i_result; }
89 i_result = LibEditText_LineInfo_SetEmptyLineChain( p_tinfo, p_line );
90 if( 0x00 != i_result ) { return i_result; }
92 p_tinfo->dw_maxline--;
98 /*----------------------------------------------------------------------
99 ----------------------------------------------------------------------*/
100 LIBEDITTEXT_API_LINECTRL
102 LibEditText_DeleteLine_toLine(
107 LibEditText_TextInfo *p_tinfo;
108 LibEditText_LineInfo *p_line;
110 if( 0 > i_tinfoid ) { return -0x01; }
111 p_tinfo = LibEditText_System_GetTextInfo( i_tinfoid );
112 if( NULL == p_tinfo ) { return -0x02; }
114 p_line = LibEditText_Section_SearchLine( p_tinfo, dw_line );
115 assert( NULL != p_line );
117 i_result = LibEditText_LineCtrl_DeleteLine( p_tinfo, p_line, dw_line );
123 /*----------------------------------------------------------------------
124 ----------------------------------------------------------------------*/
125 LIBEDITTEXT_LINECTRL_EXTERN
127 LibEditText_LineCtrl_JoinLine(
128 LibEditText_TextInfo *p_tinfo,
129 LibEditText_LineInfo *p_ldest,
136 LibEditText_LineInfo *p_lsrc;
139 assert( NULL != p_tinfo );
140 assert( NULL != p_ldest );
142 if( p_tinfo->dw_line_end == p_ldest->dw_id )
145 p_lsrc = LINFO(p_tinfo, p_ldest->dw_next);
146 assert( NULL != p_lsrc );
149 if((p_ldest->dw_strlen + p_lsrc->dw_strlen + 5) > p_ldest->dw_linelen ) {
150 dw_linelen = p_ldest->dw_strlen + p_lsrc->dw_strlen
151 + DRD64_LIBEDITTEXT_DEFAULT_RESERVEBUF_INLINE;
152 i_result = LibEditText_LineInfo_ExpandLineBuffer(
153 p_tinfo, p_ldest, dw_linelen );
154 if( 0x00 != i_result ) { return -0x02; }
157 pb_dest = p_tinfo->pb_text + p_ldest->dw_start + p_ldest->dw_strlen - 1;
158 pb_src = p_tinfo->pb_text + p_lsrc->dw_start;
160 assert( '\n' == *pb_dest );
162 memcpy( pb_dest, pb_src, p_lsrc->dw_strlen );
163 *(pb_dest + p_lsrc->dw_strlen) = '\0';
165 p_ldest->dw_strlen = p_ldest->dw_strlen - 1 + p_lsrc->dw_strlen;
168 i_result = LibEditText_LineCtrl_DeleteLine( p_tinfo, p_lsrc, dw_line + 1 );
169 if( 0x00 != i_result ) { return -0x02; }
175 /*----------------------------------------------------------------------
176 ----------------------------------------------------------------------*/
177 LIBEDITTEXT_API_LINECTRL
179 LibEditText_JoinLine_toLine(
184 LibEditText_TextInfo *p_tinfo;
185 LibEditText_LineInfo *p_line;
187 if( 0 > i_tinfoid ) { return -0x01; }
188 p_tinfo = LibEditText_System_GetTextInfo( i_tinfoid );
189 if( NULL == p_tinfo ) { return -0x02; }
191 p_line = LibEditText_Section_SearchLine( p_tinfo, dw_line );
192 assert( NULL != p_line );
194 i_result = LibEditText_LineCtrl_JoinLine( p_tinfo, p_line, dw_line );
200 /*----------------------------------------------------------------------
201 ----------------------------------------------------------------------*/
202 LIBEDITTEXT_LINECTRL_EXTERN
204 LibEditText_LineCtrl_InsertLine(
205 LibEditText_TextInfo *p_tinfo,
213 LibEditText_LineInfo *p_lbefore;
214 LibEditText_LineInfo *p_line;
215 LibEditText_LineInfo *p_lnext;
217 assert( NULL != p_tinfo );
219 p_lnext = LibEditText_Section_SearchLine( p_tinfo, dw_line );
220 assert( NULL != p_lnext );
223 p_lbefore = LINFO(p_tinfo, p_lnext->dw_before);
225 dw_strlen = dw_length;
226 if(( 0 == dw_length ) || ( '\n' != *(pb_text + dw_length - 1) ))
229 // Get LineInfo struct
230 dw_buflength = dw_strlen + DRD64_LIBEDITTEXT_DEFAULT_RESERVEBUF_INLINE;
231 p_line = LibEditText_LineInfo_GetEmptyLineInfo( p_tinfo, dw_buflength );
232 if( NULL == p_line ) { return -0x11; }
234 // Link Before & After LineInfo
235 if( NULL != p_lbefore ) {
236 p_lbefore->dw_next = p_line->dw_id;
237 p_line->dw_before = p_lbefore->dw_id;
240 { p_tinfo->dw_line_start = p_line->dw_id; }
242 p_lnext->dw_before = p_line->dw_id;
243 p_line->dw_next = p_lnext->dw_id;
245 // Set LineInfo to SortChain
246 i_result = LibEditText_LineInfo_AddSortChain( p_tinfo, p_line );
247 if( 0x00 != i_result ) { return -0x12; }
249 // Set Init. TextData
250 p_line->dw_strlen = dw_strlen;
251 memcpy( p_tinfo->pb_text + p_line->dw_start, pb_text, dw_length );
252 if( dw_length != dw_strlen )
253 { *(p_tinfo->pb_text + p_line->dw_start + dw_length) = '\n'; }
255 // Adjust LineSection
256 i_result = LibEditText_Section_InsertLine( p_tinfo, dw_line );
257 if( 0x00 != i_result ) { return -0x13; }
259 p_tinfo->dw_maxline++;
265 /*----------------------------------------------------------------------
266 ----------------------------------------------------------------------*/
267 LIBEDITTEXT_API_LINECTRL
269 LibEditText_InsertLine_toLine(
276 LibEditText_TextInfo *p_tinfo;
278 if( 0 > i_tinfoid ) { return -0x01; }
279 p_tinfo = LibEditText_System_GetTextInfo( i_tinfoid );
280 if( NULL == p_tinfo ) { return -0x02; }
282 if( NULL == pstr_text ) { return -0x03; }
284 if( p_tinfo->dw_maxline < (dw_line + 1) ) {
285 i_result = LibEditText_LineCtrl_AppendLine(
286 p_tinfo, (Byte *)pstr_text, dw_length, 0x00 );
289 i_result = LibEditText_LineCtrl_InsertLine(
290 p_tinfo, dw_line, (Byte *)pstr_text, dw_length );
297 /*----------------------------------------------------------------------
298 ----------------------------------------------------------------------*/
299 LIBEDITTEXT_LINECTRL_EXTERN
301 LibEditText_LineCtrl_AppendLine(
302 LibEditText_TextInfo *p_tinfo,
309 Byte str_lf[2] = { '\n', '\0'};
311 LibEditText_LineInfo *p_line;
312 LibEditText_LineInfo *p_before;
314 assert( NULL != p_tinfo );
315 p_before = LINFO(p_tinfo, p_tinfo->dw_line_end);
317 if( NULL == p_before )
318 { goto goto_LibEditText_LineCtrl_AppendLine_prechecked; }
320 if( 0 < p_before->dw_strlen ) {
321 pb_tmp = p_tinfo->pb_text + ((p_before->dw_start) + (p_before->dw_strlen) - 1);
322 if( '\n' == *pb_tmp )
323 { goto goto_LibEditText_LineCtrl_AppendLine_prechecked; }
326 i_result = LibEditText_LineEdit_InsertString(
327 p_tinfo, p_before, p_before->dw_strlen, str_lf, 1);
329 goto_LibEditText_LineCtrl_AppendLine_prechecked:
331 dw_buflength = dw_length + DRD64_LIBEDITTEXT_DEFAULT_RESERVEBUF_INLINE;
332 p_line = LibEditText_LineInfo_GetEmptyLineInfo( p_tinfo, dw_buflength );
333 if( NULL == p_line ) { return -0x11; }
335 /* ReSet p_before for if expand LineInfo memory in GetEmptyLineInfo() func.. */
336 p_before = LINFO(p_tinfo, p_tinfo->dw_line_end);
338 /* p_line->dw_start */
339 if( NULL != p_before )
340 { p_before->dw_next = p_line->dw_id; }
342 { p_tinfo->dw_line_start = p_line->dw_id; }
344 p_line->dw_before = (NULL==p_before ? INVALID_LINE : p_before->dw_id);
345 p_line->dw_strlen = dw_length;
347 i_result = LibEditText_LineInfo_AddSortChain( p_tinfo, p_line );
348 if( 0x00 != i_result ) {
352 memcpy( p_tinfo->pb_text + p_line->dw_start, pstr_text, dw_length );
354 p_tinfo->dw_line_end = p_line->dw_id;
356 /* Normal Append Mode is b_mode=0x00. */
357 if( 0x00 == b_mode ) {
358 i_result = LibEditText_Section_AddSection( p_tinfo );
359 if( 0x00 > i_result ) { return i_result; }
360 else if( 0x00 < i_result ) { i_result = 0x00; }
362 p_tinfo->dw_maxline++;
369 /*----------------------------------------------------------------------
370 ----------------------------------------------------------------------*/
371 LIBEDITTEXT_API_LINECTRL
373 LibEditText_AppendLine(
379 LibEditText_TextInfo *p_tinfo;
381 if( 0 > i_tinfoid ) { return -0x01; }
382 p_tinfo = LibEditText_System_GetTextInfo( i_tinfoid );
383 if( NULL == p_tinfo ) { return -0x02; }
385 if( NULL == pstr_text ) { return -0x03; }
387 i_result = LibEditText_LineCtrl_AppendLine( p_tinfo, (Byte *)pstr_text, dw_length, 0x00 );
393 /* EOF of drd64_.c ----------------------------------- */