OSDN Git Service

* Tested: DeleteLine_toLine ( if delete-line is the end of file.)
[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
41 /*----------------------------------------------------------------------
42 ----------------------------------------------------------------------*/
43 LIBEDITTEXT_LINECTRL_EXTERN
44 int
45         LibEditText_LineCtrl_DeleteLine(
46                 LibEditText_TextInfo    *p_tinfo,
47                 LibEditText_LineInfo    *p_line,
48                 DWord   dw_line )
49 {
50         int             i_result;
51         Byte    *pb_data;
52         LibEditText_LineInfo    *p_lbefore;
53         LibEditText_LineInfo    *p_lnext;
54
55         assert( NULL != p_tinfo );
56         assert( NULL != p_line );
57
58         if( 1 == p_tinfo->dw_maxline )  { return 0x00; }
59
60         // Check & Remove Section ---
61         LibEditText_Section_DeleteLine( p_tinfo, dw_line );
62
63         // Data Clear ---
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;
67
68         // Remove Link LineInfo ---
69         p_lbefore       = LINFO(p_tinfo, p_line->dw_before);
70         p_lnext         = LINFO(p_tinfo, p_line->dw_next);
71
72         if( NULL != p_lbefore )
73                 { p_lbefore->dw_next    = p_line->dw_next; }
74         if( NULL != p_lnext )
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; }
80
81         p_line->dw_before       = INVALID_LINE;
82         p_line->dw_next         = INVALID_LINE;
83
84         // Remove SortChain ---
85         i_result        = LibEditText_LineInfo_RemoveSortChain( p_tinfo, p_line );
86         if( 0x00 != i_result )  { return i_result; }
87
88         // Add EmptyChain ---
89         i_result        = LibEditText_LineInfo_SetEmptyLineChain( p_tinfo, p_line );
90         if( 0x00 != i_result )  { return i_result; }
91
92         p_tinfo->dw_maxline--;
93
94         return 0x00;
95 }
96
97
98 /*----------------------------------------------------------------------
99 ----------------------------------------------------------------------*/
100 LIBEDITTEXT_API_LINECTRL
101 int
102         LibEditText_DeleteLine_toLine(
103                 int             i_tinfoid,
104                 DWord   dw_line )
105 {
106         int                                             i_result        = 0x00;
107         LibEditText_TextInfo    *p_tinfo;
108         LibEditText_LineInfo    *p_line;
109
110         if( 0 > i_tinfoid )             { return -0x01; }
111         p_tinfo = LibEditText_System_GetTextInfo( i_tinfoid );
112         if( NULL == p_tinfo )   { return -0x02; }
113
114         p_line  = LibEditText_Section_SearchLine( p_tinfo, dw_line );
115         assert( NULL != p_line );
116
117         i_result        = LibEditText_LineCtrl_DeleteLine( p_tinfo, p_line, dw_line );
118         
119         return i_result;
120 }
121
122
123 /*----------------------------------------------------------------------
124 ----------------------------------------------------------------------*/
125 LIBEDITTEXT_LINECTRL_EXTERN
126 int
127         LibEditText_LineCtrl_InsertLine(
128                 LibEditText_TextInfo    *p_tinfo,
129                 DWord   dw_line,
130                 Byte    *pb_text,
131                 DWord   dw_length )
132 {
133         int                                             i_result;
134         DWord                                   dw_buflength;
135         DWord                                   dw_strlen;
136         LibEditText_LineInfo    *p_lbefore;
137         LibEditText_LineInfo    *p_line;
138         LibEditText_LineInfo    *p_lnext;
139         
140         assert( NULL != p_tinfo );
141
142         p_lnext = LibEditText_Section_SearchLine( p_tinfo, dw_line );
143         assert( NULL != p_lnext );
144
145         // PreProccess
146         p_lbefore       = LINFO(p_tinfo, p_lnext->dw_before);
147         
148         dw_strlen       = dw_length;
149         if(( 0 == dw_length ) || ( '\n' != *(pb_text + dw_length - 1) ))
150                 { dw_strlen++; }
151
152         // Get LineInfo struct
153         dw_buflength    = dw_strlen + DRD64_LIBEDITTEXT_DEFAULT_RESERVEBUF_INLINE;
154         p_line  = LibEditText_LineInfo_GetEmptyLineInfo( p_tinfo, dw_buflength );
155         if( NULL == p_line )    { return -0x11; }
156         
157         // Link Before & After LineInfo
158         if( NULL != p_lbefore )         {
159                 p_lbefore->dw_next      = p_line->dw_id;
160                 p_line->dw_before       = p_lbefore->dw_id;
161         }
162         else
163                 { p_tinfo->dw_line_start        = p_line->dw_id; }
164
165         p_lnext->dw_before      = p_line->dw_id;
166         p_line->dw_next         = p_lnext->dw_id;
167
168         // Set LineInfo to SortChain
169         i_result    = LibEditText_LineInfo_AddSortChain( p_tinfo, p_line );
170         if( 0x00 != i_result )  { return -0x12; }
171
172         // Set Init. TextData
173         p_line->dw_strlen       = dw_strlen;
174         memcpy( p_tinfo->pb_text + p_line->dw_start, pb_text, dw_length );
175         if( dw_length != dw_strlen )
176                 { *(p_tinfo->pb_text + p_line->dw_start + dw_length) = '\n'; }  
177
178         // Adjust LineSection
179         i_result        = LibEditText_Section_InsertLine( p_tinfo, dw_line );
180         if( 0x00 != i_result )  { return -0x13; }
181
182         p_tinfo->dw_maxline++;
183
184         return 0x00;
185 }
186
187
188 /*----------------------------------------------------------------------
189 ----------------------------------------------------------------------*/
190 LIBEDITTEXT_API_LINECTRL
191 int
192         LibEditText_InsertLine_toLine(
193                 int             i_tinfoid,
194                 DWord   dw_line,
195                 char    *pstr_text,
196                 DWord   dw_length )
197 {
198         int                                             i_result;
199         LibEditText_TextInfo    *p_tinfo;
200
201         if( 0 > i_tinfoid )             { return -0x01; }
202         p_tinfo = LibEditText_System_GetTextInfo( i_tinfoid );
203         if( NULL == p_tinfo )   { return -0x02; }
204
205         if( NULL == pstr_text ) { return -0x03; }
206
207         if( p_tinfo->dw_maxline < (dw_line + 1) )       {
208                 i_result        = LibEditText_LineCtrl_AppendLine(
209                                                 p_tinfo, (Byte *)pstr_text, dw_length, 0x00 );
210         }
211         else    {
212                 i_result        = LibEditText_LineCtrl_InsertLine(
213                                                 p_tinfo, dw_line, (Byte *)pstr_text, dw_length );
214         }
215         
216         return i_result;
217 }
218
219
220 /*----------------------------------------------------------------------
221 ----------------------------------------------------------------------*/
222 LIBEDITTEXT_LINECTRL_EXTERN
223 int
224         LibEditText_LineCtrl_AppendLine(
225                 LibEditText_TextInfo            *p_tinfo,
226                 Byte    *pstr_text,
227                 DWord   dw_length,
228                 Byte    b_mode )
229 {
230         int                                             i_result;
231         DWord                                   dw_buflength;
232         Byte                                            str_lf[2]       = { '\n', '\0'};
233         Byte                                            *pb_tmp;
234         LibEditText_LineInfo            *p_line;
235         LibEditText_LineInfo            *p_before;
236
237         assert( NULL != p_tinfo );
238         p_before        = LINFO(p_tinfo, p_tinfo->dw_line_end);
239
240         if( NULL == p_before )
241                 { goto goto_LibEditText_LineCtrl_AppendLine_prechecked; }
242
243         if( 0 < p_before->dw_strlen )   {
244                 pb_tmp  = p_tinfo->pb_text + ((p_before->dw_start) + (p_before->dw_strlen) - 1);
245                 if( '\n' == *pb_tmp )
246                         { goto goto_LibEditText_LineCtrl_AppendLine_prechecked; }
247         }
248
249         i_result        = LibEditText_LineEdit_InsertString(
250                                                         p_tinfo, p_before, p_before->dw_strlen, str_lf, 1);
251
252 goto_LibEditText_LineCtrl_AppendLine_prechecked:
253
254         dw_buflength    = dw_length + DRD64_LIBEDITTEXT_DEFAULT_RESERVEBUF_INLINE;
255         p_line  = LibEditText_LineInfo_GetEmptyLineInfo( p_tinfo, dw_buflength );
256         if( NULL == p_line )    { return -0x11; }
257
258         /* ReSet p_before for if expand LineInfo memory in GetEmptyLineInfo() func.. */
259         p_before        = LINFO(p_tinfo, p_tinfo->dw_line_end);
260         
261         /* p_line->dw_start      */
262         if( NULL != p_before )
263                 { p_before->dw_next     = p_line->dw_id; }
264         else
265                 { p_tinfo->dw_line_start        = p_line->dw_id; }
266
267         p_line->dw_before       = (NULL==p_before ? INVALID_LINE : p_before->dw_id);
268         p_line->dw_strlen       = dw_length;
269
270         i_result    = LibEditText_LineInfo_AddSortChain( p_tinfo, p_line );
271         if( 0x00 != i_result )  {
272                 return -0x12;
273         }
274
275         memcpy( p_tinfo->pb_text + p_line->dw_start, pstr_text, dw_length );
276
277         p_tinfo->dw_line_end    = p_line->dw_id;
278
279         /* Normal Append Mode is b_mode=0x00. */
280         if( 0x00 == b_mode )    {
281                 i_result        = LibEditText_Section_AddSection( p_tinfo );
282                 if( 0x00 > i_result )           { return i_result; }
283                 else if( 0x00 < i_result )      { i_result      = 0x00; }
284
285                 p_tinfo->dw_maxline++;
286         }
287
288         return 0x00;
289 }
290
291
292 /*----------------------------------------------------------------------
293 ----------------------------------------------------------------------*/
294 LIBEDITTEXT_API_LINECTRL
295 int
296         LibEditText_AppendLine(
297                 int             i_tinfoid,
298                 char    *pstr_text,
299                 DWord   dw_length )
300 {
301         int                                             i_result;
302         LibEditText_TextInfo    *p_tinfo;
303
304         if( 0 > i_tinfoid )             { return -0x01; }
305         p_tinfo = LibEditText_System_GetTextInfo( i_tinfoid );
306         if( NULL == p_tinfo )   { return -0x02; }
307
308         if( NULL == pstr_text ) { return -0x03; }
309         
310         i_result        = LibEditText_LineCtrl_AppendLine( p_tinfo, (Byte *)pstr_text, dw_length, 0x00 );
311         
312         return i_result;
313 }
314
315
316 /* EOF of drd64_.c ----------------------------------- */