OSDN Git Service

* SplitFile: drcc_edittext_line.c from drcc_edittext_system.c
[drdeamon64/drdeamon64.git] / drcc / drcc_edittext_system.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_DRCC_EDITTEXT_SYSTEM
38 #include"drcc.h"
39
40 /*----------------------------------------------------------------------
41 ----------------------------------------------------------------------*/
42 int
43         DrCC_EditText_Debug_SortChain(
44                 Drd64_DrCC_TextInfo             *p_tinfo,
45                 Byte b_putflag )
46 {
47         int             i_cnt;
48         DWord   dw_nowlen;
49         DWord   dw_lencount;
50         Drd64_DrCC_LineInfo             *p_line;
51
52         assert( NULL != p_tinfo );
53
54         if( 0x00 != b_putflag )         {
55                 puts("----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8");
56                 puts(  "[2] LineInfo SortChain ");
57         }
58
59         for( i_cnt = 0; i_cnt < DRD64_DRCC_DEFAULT_LINESORT_ARRAYS; i_cnt++ )   {
60                 p_line          = p_tinfo->p_sort[i_cnt];
61                 if( NULL == p_line )    { continue; }
62
63                 dw_nowlen       = p_line->dw_linelen;
64                 if( 0 == dw_nowlen )    { return -0x01; }
65                 dw_lencount     = 1;
66
67                 while( NULL != p_line )         {
68                         if( dw_nowlen < p_line->dw_linelen )    {
69                                 if( 0x00 != b_putflag )
70                                         { printf("  Line Length=%u : Chains: %u\n", dw_nowlen, dw_lencount ); }
71                                 dw_lencount = 1;
72                                 dw_nowlen       = p_line->dw_linelen;
73                                 if( 0 == dw_nowlen )    { return -0x02; }
74                         }       
75                         else if( dw_nowlen > p_line->dw_linelen )
76                                 { return -0x03; }
77                         else
78                                 { dw_lencount++; }
79                         p_line  = p_line->p_sortnext;
80                 }
81
82                 if( 0x00 != b_putflag )
83                         { printf("  Line Length=%u : Chains: %u\n", dw_nowlen, dw_lencount ); }
84         }
85
86         if( 0x00 != b_putflag )
87                 { puts("----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8"); }
88
89         return 0x00;
90 }
91
92
93 /*----------------------------------------------------------------------
94 ----------------------------------------------------------------------*/
95 DRCC_EDITTEXT_SYSTEM_EXTERN
96 int
97         DrCC_EditText_DebugTextInfo(
98                 int     i_tinfoid,
99                 Byte b_putflag )
100 {
101         DWord           dw_nowrow;
102         int                     i_cnt;
103         int                     i_result;
104         Byte            *pb_now;
105         Drd64_DrCC_TextInfo             *p_tinfo;
106         Drd64_DrCC_LineInfo             *p_before;
107         Drd64_DrCC_LineInfo             *p_line;
108
109         if( 0 > i_tinfoid )             { return -0x01; }
110         p_tinfo = DrCC_EditText_System_GetTextInfo( i_tinfoid );
111         if( NULL == p_tinfo )   { return -0x02; }
112         
113         /* 1st: Check TextInfo Strcut Data --- */
114         if( 0x00 != b_putflag )         {
115                 puts("----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8");
116                 puts(  "[1] TextInfo Struct Data ");
117                 printf("  TextInfo Struct ID: %d\n", p_tinfo->i_fd);
118                 printf("  Path: %s\n", p_tinfo->str_pathname );
119                 printf("  File: %s\n", p_tinfo->str_filename );
120                 printf("  Lines: %u,  Buffer Lines: %u\n", p_tinfo->dw_maxline, p_tinfo->dw_bufline );
121                 printf("  Buffer size: %u, Used Last-Byte:%u\n", p_tinfo->dw_bufsize, p_tinfo->dw_lastsize );
122                 printf("  FileDescriptor: %d, File SubType: %04x\n", p_tinfo->i_fd, p_tinfo->w_subtype );
123                 puts("----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8");
124         }
125
126         /* Check Empty-LineInfo Chain ---*/
127         i_cnt   = 0;
128         p_line  = p_tinfo->p_empty;
129         while( NULL != p_line ) {
130                 p_line          = p_line->p_next;
131                 i_cnt++;
132         }
133         if( (int)(p_tinfo->dw_bufline - p_tinfo->dw_maxline) != i_cnt ) 
134                 { return -0x10; }       
135         if( 0x00 != b_putflag )         {
136                 printf("  Remain Empty LineInfo Structs: %3d\n", i_cnt );
137         }
138
139         i_result        = DrCC_EditText_Debug_SortChain( p_tinfo, b_putflag );
140         if( 0x00 != i_result )          { return -0x03; }
141
142
143         if( 0x00 != b_putflag )         {
144                 puts("");
145                 puts("************** ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9");
146                 puts(  "[3] Text Data ");
147         }
148         p_before        = NULL;
149         p_line          = p_tinfo->p_lineinfo;
150         for( dw_nowrow = 0; dw_nowrow < p_tinfo->dw_maxline; dw_nowrow++ )      {
151                 if( 0x00 != b_putflag )         {
152                         printf("%04u [%3u:%3u] ",
153                                         dw_nowrow, p_line->dw_strlen, p_line->dw_linelen );
154                 }
155                 pb_now  = p_tinfo->pb_text + p_line->dw_start;
156                 if(( dw_nowrow + 1 < p_tinfo->dw_maxline ) && ( '\n' != *(pb_now + p_line->dw_strlen - 1) ))
157                         { return -0x04; }
158
159                 if( 0x00 != b_putflag )         {
160                         fputs( (char *)pb_now, stdout );
161                 }
162
163                 if( p_before != p_line->p_before )      { return -0x05; }
164                 p_before        = p_line;
165                 p_line          = p_line->p_next;
166         }
167         if( NULL != p_line )    { return -0x06; }
168
169         if( 0x00 != b_putflag )         {
170                 puts("************** ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9");
171         }
172
173         return 0x00;
174 }
175
176
177 /*----------------------------------------------------------------------
178 ----------------------------------------------------------------------*/
179 DWord
180         DrCC_EditText_System_GetMaxNum_TextInfo(
181                         void )
182 {
183         return gdw_max_textinfo;
184 }
185
186
187 /*----------------------------------------------------------------------
188 ----------------------------------------------------------------------*/
189 DWord
190         DrCC_EditText_System_GetAllocNum_TextInfo(
191                         void )
192 {
193         return gdw_alloc_textinfo;
194 }
195
196
197 /*----------------------------------------------------------------------
198 ----------------------------------------------------------------------*/
199 DRCC_EDITTEXT_SYSTEM_EXTERN
200 DWord
201         DrCC_EditText_System_GetNoneNameFiles(
202                         void )
203 {
204         return ++gdw_nonenamefiles;
205 }
206
207
208 /*----------------------------------------------------------------------
209 ----------------------------------------------------------------------*/
210 DRCC_EDITTEXT_SYSTEM_EXTERN
211 Drd64_DrCC_TextInfo     *
212         DrCC_EditText_System_GetTextInfo(
213                         int i_tinfoid )
214 {
215         if( ( 0 > i_tinfoid ) || ( gdw_max_textinfo <= i_tinfoid ))
216                 { return NULL; }
217
218         return (gp_textinfo + i_tinfoid);
219 }
220
221
222 /*----------------------------------------------------------------------
223 ----------------------------------------------------------------------*/
224 DRCC_EDITTEXT_SYSTEM_EXTERN
225 int
226         DrCC_EditText_System_InitTextInfo(
227                         Drd64_DrCC_TextInfo     *p_tinfo,
228                         Word    w_subtype,
229                         DWord   dw_maxline,
230                         DWord   dw_bufline,
231                         DWord   dw_bufsize )
232 {
233         Drd64_DrCC_LineInfo             *p_line;
234         Drd64_DrCC_LineInfo             *p_before;
235         Byte    *pb_text;
236         Byte    *pb_attr;
237         DWord   dw_cnt;
238
239         if( NULL == p_tinfo )   { return -0x01; }
240         if(( 0 == dw_bufsize ) || ( 0 == dw_bufline) )  { return -0x02; }
241         
242         /* Alloc Text Buffer Memory --- */
243         pb_text = (Byte *)malloc( dw_bufsize );
244         if( NULL == pb_text )   {
245                 return -0x11;
246         }
247         memset( pb_text, 0x00, dw_bufsize );
248
249         /* Alloc Attribute Buffer Memory --- */
250         pb_attr = (Byte *)malloc( dw_bufsize );
251         if( NULL == pb_attr )   {
252                 return -0x12;
253         }
254         memset( pb_attr, 0x00, dw_bufsize );
255
256         /* Alloc DrCC_LineInfo Struct --- */
257         p_line  = (Drd64_DrCC_LineInfo *)malloc(
258                                                 sizeof( Drd64_DrCC_LineInfo ) * dw_bufline );
259         if( NULL == p_line )    {
260                 return -0x13;
261         }
262         memset( p_line, 0x00, sizeof( Drd64_DrCC_LineInfo) * dw_bufline );
263         
264
265         /* Set Param. to TextInfo Struct --- */
266         p_tinfo->w_subtype              = w_subtype;
267         p_tinfo->pb_text                = pb_text;
268         p_tinfo->pb_attr                = pb_attr;
269         p_tinfo->p_lineinfo             = p_line;
270         p_tinfo->dw_bufsize             = dw_bufsize;
271         p_tinfo->dw_attrsize    = dw_bufsize;
272         p_tinfo->dw_maxline             = dw_maxline;
273         p_tinfo->dw_bufline             = dw_bufline;
274         
275         /* Link Empty-LineInfo Chain --- */
276         p_before                        = (p_tinfo->p_lineinfo + dw_maxline);
277         p_tinfo->p_empty        = p_before;
278         p_line                          = p_before + 1;
279         for( dw_cnt = dw_maxline + 1; dw_cnt < dw_bufline; dw_cnt++ )   {
280                 p_before->p_next        = p_line++;
281                 p_before++;
282         }
283
284         return 0x00;
285 }
286
287
288 /*----------------------------------------------------------------------
289 ----------------------------------------------------------------------*/
290 DWord
291         DrCC_EditText_System_SearchEmptyTextInfo(
292                         void )
293 {
294         DWord                                   dw_cnt  = 0;
295         Drd64_DrCC_TextInfo             *p_tinfo        = NULL;
296
297         for( dw_cnt = gdw_max_textinfo; dw_cnt > 0; dw_cnt-- )  {
298                 p_tinfo = (gp_textinfo + dw_cnt - 1);
299
300                 assert( NULL != p_tinfo );
301                 if( -1 == p_tinfo->i_id )       { break; }
302         }
303
304         return dw_cnt;
305 }
306
307
308 /*----------------------------------------------------------------------
309 Alloc
310 ----------------------------------------------------------------------*/
311 DRCC_EDITTEXT_SYSTEM_EXTERN
312 Drd64_DrCC_TextInfo *
313         DrCC_EditText_System_AllocTextInfo(
314                         void )
315 {
316         int                     i_tmp;
317         DWord           dw_cnt;
318         Drd64_DrCC_TextInfo             *p_textinfo     = NULL;
319         Drd64_DrCC_TextInfo             *p_tmp;
320
321         dw_cnt  = DrCC_EditText_System_SearchEmptyTextInfo();
322
323         if( 0 == dw_cnt )       {
324                 if( gdw_max_textinfo == gdw_alloc_textinfo )    {
325                         p_textinfo      = (Drd64_DrCC_TextInfo *)realloc(
326                                         gp_textinfo, sizeof( Drd64_DrCC_TextInfo )
327                                                 * (gdw_alloc_textinfo + DRD64_DRCC_DEFAULT_ALLOC_TEXTINFO ) );
328                         if( NULL == p_textinfo )        { return NULL; }
329
330                         p_tmp   = p_textinfo + gdw_max_textinfo;
331                         memset( p_tmp, 0x00,
332                                         sizeof( Drd64_DrCC_TextInfo ) * DRD64_DRCC_DEFAULT_ALLOC_TEXTINFO );
333                         for( i_tmp = 0; i_tmp < DRD64_DRCC_DEFAULT_ALLOC_TEXTINFO; i_tmp++, p_tmp++ )
334                                 { p_tmp->i_id   = -1; } 
335
336                         gp_textinfo                     = p_textinfo;
337                         gdw_alloc_textinfo      += DRD64_DRCC_DEFAULT_ALLOC_TEXTINFO;
338                         p_textinfo      = NULL;
339                 }
340                 dw_cnt  = gdw_max_textinfo + 1;
341         }
342
343         if( 0 < dw_cnt )        {
344                 p_textinfo      = (gp_textinfo + dw_cnt - 1);
345                 memset( p_textinfo, 0x00, sizeof( Drd64_DrCC_TextInfo ) );
346
347                 p_textinfo->i_id                = (int)(dw_cnt - 1);
348                 p_textinfo->pb_text             = NULL;
349                 p_textinfo->p_lineinfo  = NULL;
350                 p_textinfo->dw_bufsize  = 0;
351                 p_textinfo->dw_maxline  = 0;
352                 p_textinfo->dw_bufline  = 0;
353         }
354
355         if(     dw_cnt == gdw_max_textinfo + 1 )
356                 { gdw_max_textinfo++; }
357
358         gdw_used_textinfo++;
359
360         return p_textinfo;
361 }
362
363
364 /*----------------------------------------------------------------------
365 ----------------------------------------------------------------------*/
366 DRCC_EDITTEXT_SYSTEM_EXTERN
367 int
368         DrCC_EditText_System_ClearTextInfo(
369                         Drd64_DrCC_TextInfo     *p_tinfo )
370 {
371         if( NULL == p_tinfo )   { return -0x01; }
372
373         assert( NULL != p_tinfo->pb_text );
374         free( p_tinfo->pb_text );
375
376         assert( NULL != p_tinfo->pb_attr );
377         free( p_tinfo->pb_attr );
378
379         assert( NULL != p_tinfo->p_lineinfo );
380         free( p_tinfo->p_lineinfo );
381
382         p_tinfo->pb_text                = NULL;
383         p_tinfo->pb_attr                = NULL;
384         p_tinfo->p_lineinfo             = NULL;
385         p_tinfo->dw_bufsize             = 0;
386         p_tinfo->dw_attrsize    = 0;
387         p_tinfo->dw_maxline             = 0;
388         p_tinfo->dw_bufline             = 0;
389
390         return 0x00;
391 }
392
393
394 /*----------------------------------------------------------------------
395 Alloc
396 ----------------------------------------------------------------------*/
397 DRCC_EDITTEXT_SYSTEM_EXTERN
398 int
399         DrCC_EditText_System_FreeTextInfo(
400                 Drd64_DrCC_TextInfo             *p_tinfo )
401 {
402         int                                             i_oldid;
403         DWord                                   dw_cnt  = 0;
404         Drd64_DrCC_TextInfo             *p_tmp;
405
406         if( NULL == p_tinfo )           { return -0x01; }
407         if( -1 == p_tinfo->i_id )       { return -0x02; }
408
409         /* Clear TextInfo Struct */
410         i_oldid                         = p_tinfo->i_id;
411         p_tinfo->i_id           = -1;
412         p_tinfo->pb_text        = NULL;
413
414         gdw_used_textinfo--;
415
416         if( 0 == gdw_used_textinfo )
417                 { gdw_max_textinfo      = 0; }
418         else if( i_oldid == gdw_max_textinfo - 1 )      {
419
420                 gdw_max_textinfo--;
421
422                 for( dw_cnt = gdw_max_textinfo; dw_cnt > 0; dw_cnt-- )  {
423                         p_tmp   = (gp_textinfo + dw_cnt - 1);
424
425                         assert( NULL != p_tmp );
426                         if( -1 != p_tmp->i_id ) { break; }
427                 }
428                 if( 0 < dw_cnt )
429                         { gdw_max_textinfo      = dw_cnt; }
430         }
431
432         
433         return 0x00;
434 }
435
436
437 /*----------------------------------------------------------------------
438 Init
439 ----------------------------------------------------------------------*/
440 DRCC_EDITTEXT_SYSTEM_EXTERN
441 int
442         DrCC_EditText_System_Init(
443                         void )
444 {
445         int                                             i_cnt;
446         Drd64_DrCC_TextInfo             *p_textinfo;
447         Drd64_DrCC_TextInfo             *p_tmp;
448
449         if( NULL != gp_textinfo )       { return 0x01; }
450
451         p_textinfo      = (Drd64_DrCC_TextInfo *)malloc(
452                                         sizeof( Drd64_DrCC_TextInfo ) * DRD64_DRCC_DEFAULT_ALLOC_TEXTINFO );
453         if( NULL == p_textinfo )        { return 0x02; }
454         memset( p_textinfo, 0x00,
455                         sizeof( Drd64_DrCC_TextInfo ) * DRD64_DRCC_DEFAULT_ALLOC_TEXTINFO );
456
457         gp_textinfo                     = p_textinfo;
458         gdw_max_textinfo        = 0;
459         gdw_alloc_textinfo      = DRD64_DRCC_DEFAULT_ALLOC_TEXTINFO;
460
461         p_tmp   = p_textinfo;
462         for( i_cnt = 0; i_cnt < gdw_alloc_textinfo; i_cnt++, p_tmp++ )
463                 { p_tmp->i_id           = -1; }
464
465         return 0x00;
466 }
467
468
469 /*----------------------------------------------------------------------
470 Term
471 ----------------------------------------------------------------------*/
472 DRCC_EDITTEXT_SYSTEM_EXTERN
473 int
474         DrCC_EditText_System_Term(
475                         void )
476 {
477         DWord   dw_cnt;
478         Drd64_DrCC_TextInfo     *p_textinfo;
479
480         if( NULL == gp_textinfo)        { return 0x01; }
481         
482
483         for( dw_cnt = gdw_max_textinfo; dw_cnt > 0; dw_cnt-- )  {
484                 p_textinfo      = (gp_textinfo + dw_cnt - 1);
485                 assert( NULL != p_textinfo );
486
487                 p_textinfo->i_id        = -1;
488         }
489
490
491         free( gp_textinfo );
492         gp_textinfo     = NULL;
493
494         return 0x00;
495 }
496
497
498 /* EOF of drd64_.c ---------------------------------- */
499