Blame view

app/app-prime-modbus/lib/common/tlist.c 14.5 KB
8c2952457   김태훈   응용 프로그램 추가
1
2
3
  /**    
      @file     tlist.c
      @date     1997/10/7
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
4
      @author   유영창 frog@falinux.com  FALinux.Co.,Ltd.
8c2952457   김태훈   응용 프로그램 추가
5
      @brief    Ver 1.0.1
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
6
                Delphi 형식의 리스트 객체이다.
8c2952457   김태훈   응용 프로그램 추가
7
8
                
      @modify   
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
9
10
      		  오재경 (2012/2/7, Ver 1.0.2)
                  - tlist_clear() 해제 에러 수정 (아주 중요함)
8c2952457   김태훈   응용 프로그램 추가
11
      
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
12
13
14
      		  오재경 (2009/1/14, Ver 1.0.1)
                  - 인덱스 에러함수 추가
                  - 에러일 경우 return 코드 추가
8c2952457   김태훈   응용 프로그램 추가
15
16
17
18
19
20
21
     
      @todo    
      @bug     
      @remark  
      @warning 
  */
  //
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
22
23
  //  저작권    에프에이리눅스(주)
  //            외부공개 금지
8c2952457   김태훈   응용 프로그램 추가
24
25
  //
  //----------------------------------------------------------------------------
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
26
  #define EMBEDDED_LINUX                                          // 이렇게 처리하지 않으면 EClipse에서 C 영역이 회색 바탕이 됨
8c2952457   김태훈   응용 프로그램 추가
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
  
  #ifdef MS_WIN32
      #undef EMBEDDED_LINUX
  #endif
  
  
  #include <stdio.h>
  #include <stdlib.h>
  #include <sys/time.h>
  
  #include <unistd.h>
  #include <string.h>
  
  #include <tlist.h>
  
  #ifdef EMBEDDED_LINUX
  
  	#include <sys/resource.h>
  
  #endif
  
  
  char desc_tlist[] = "falinux tlist ver 1.0.1";
  
  //------------------------------------------------------------------------------
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
52
53
  /** @brief   에러함수
      @param   that   관리 객체의 포인터
8c2952457   김태훈   응용 프로그램 추가
54
55
56
57
58
59
60
61
  *///----------------------------------------------------------------------------
  void   tlist_error      ( tlist *that )
  {
  	printf( "tlist error %p
  ", that );
  //  exit( 1 ); 
  }
  //------------------------------------------------------------------------------
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
62
63
64
  /** @brief   인덱스 범위에러
      @param   that   관리 객체의 포인터
      @param   index  에러인덱스
8c2952457   김태훈   응용 프로그램 추가
65
66
67
68
69
70
71
72
  *///----------------------------------------------------------------------------
  void   tlist_error_index  ( tlist *that, int index )
  {
  	printf( "tlist error : outof bound  obj=%p count=%d err-index=%d 
  ", that, that->fcount, index );
  //    exit( 1 ); 
  }
  //------------------------------------------------------------------------------
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
73
74
  /** @brief   tlist 객체를 생성한다.
      @return  객체의 포인터
8c2952457   김태훈   응용 프로그램 추가
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
  *///----------------------------------------------------------------------------
  tlist* tlist_create     ( void )
  {
     tlist *that;
     that = ( tlist *) malloc( sizeof( tlist ) );
     if( that )
     {
        that->flist     = NULL;
        that->fcount    = 0;
        that->fcapacity = 0;
     }
     return that;
  }
  
  //------------------------------------------------------------------------------
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
90
91
  /** @brief   tlist 객체를 소멸시킨다.
      @param   *that 관리 객체의 포인터
8c2952457   김태훈   응용 프로그램 추가
92
93
94
95
96
97
98
99
  *///----------------------------------------------------------------------------
  void   tlist_free       ( tlist *that )
  {
      tlist_clear( that );
      free( that );
  }
  
  //------------------------------------------------------------------------------
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
100
101
102
103
  /** @brief   아이템을 추가한다.
      @param   that 관리 객체의 포인터
      @param   item 새로이 추가되는 아이템 포인터
      @return  추가된 아이템의 인덱스
8c2952457   김태훈   응용 프로그램 추가
104
105
106
107
108
109
110
111
112
113
114
115
116
117
  *///----------------------------------------------------------------------------
  int    tlist_add        ( tlist *that, void *item )
  {
       int result;
       result = that->fcount; 
       if( result == that->fcapacity )
       {
         tlist_grow( that );
       }
       that->flist[ result ] = item;
       that->fcount++; 
       return result;
  }
  //------------------------------------------------------------------------------
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
118
119
  /** @brief   모든 아이템을 제거한다.
      @param   that 관리 객체의 포인터
8c2952457   김태훈   응용 프로그램 추가
120
121
122
123
124
125
126
127
128
129
130
131
  *///----------------------------------------------------------------------------
  void   tlist_clear      ( tlist *that )
  {
  	if ( that->flist )
  	{
  		free(that->flist);
  		that->flist = NULL;
  	}
  	that->fcount    = 0;
  	that->fcapacity = 0;
  }
  //------------------------------------------------------------------------------
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
132
133
134
  /** @brief   하나의 아이템을 제거한다.
      @param   that 관리 객체의 포인터
      @param   index 제거될 아이템의 인덱스
8c2952457   김태훈   응용 프로그램 추가
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
  *///----------------------------------------------------------------------------
  void   tlist_delete     ( tlist *that, int index )
  {
      if( ( index < 0 ) || ( index >= that->fcount ) ) 
      {
      	tlist_error_index( that, index );
      	return;
      }
      
      that->fcount--;
      if( index < that->fcount ) memmove( &that->flist[ index ], 
                                          &that->flist[ index + 1], 
                                          ( that->fcount - index ) * sizeof( void * ) );
  }
  //------------------------------------------------------------------------------
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
150
151
152
153
  /** @brief   2개의 아이템 위치를 교환한다.
      @param   that 관리 객체의 포인터
      @param   index1 교환할 인덱스1
      @param   index2 교환할 인덱스2
8c2952457   김태훈   응용 프로그램 추가
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
  *///----------------------------------------------------------------------------
  void   tlist_exchange   ( tlist *that, int index1, int index2 )
  {
      void *item;
  
      if(    ( index1 < 0 ) || ( index1 >= that->fcount ) 
          || ( index2 < 0 ) || ( index2 >= that->fcount ) ) 
      {
     		tlist_error( that );
     		return;
     	}
     	
      item = that->flist[ index1 ];
      that->flist[ index1 ] = that->flist[ index2 ];
      that->flist[ index2 ] = item;  
  }
  //------------------------------------------------------------------------------
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
171
172
173
  /** @brief   아이템 풀의 용량을 확장한다.
      @param   that 관리 객체의 포인터
      @return  객체의 포인터
8c2952457   김태훈   응용 프로그램 추가
174
175
176
177
178
179
180
  *///----------------------------------------------------------------------------
  tlist *tlist_expand     ( tlist *that )
  {
      if( that->fcount == that->fcapacity ) tlist_grow( that );
      return that;
  }
  //------------------------------------------------------------------------------
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
181
182
183
  /** @brief   첫번째 아이템 포인터를 돌려준다.
      @param   that 관리 객체의 포인터
      @return  첫번째 아이템 포인터
8c2952457   김태훈   응용 프로그램 추가
184
185
186
187
188
189
  *///----------------------------------------------------------------------------
  void  *tlist_first      ( tlist *that )
  {
      return tlist_get( that, 0 );
  }
  //------------------------------------------------------------------------------
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
190
191
192
193
  /** @brief   인덱스에 해당하는 아이템 포인터를 돌려준다.
      @param   that 관리 객체의 포인터
      @param   index 아이템 인덱스
      @return  인덱스에 해당하는 아이템 포인터
8c2952457   김태훈   응용 프로그램 추가
194
195
196
197
198
199
200
201
202
203
204
  *///----------------------------------------------------------------------------
  void*  tlist_get        ( tlist *that, int index )
  {
      if( (index<0) || ( index >= that->fcount ) )
      {
      	tlist_error_index( that, index );
      	return NULL;
      }
      return( that->flist[ index ] );
  }
  //------------------------------------------------------------------------------
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
205
206
  /** @brief   아이템이 들어갈 메모리를 증가시킨다.
      @param   that 관리 객체의 포인터
8c2952457   김태훈   응용 프로그램 추가
207
208
209
210
211
212
213
214
215
216
217
218
  *///----------------------------------------------------------------------------
  void   tlist_grow     ( tlist *that )
  {
      int delta;
   
      if      ( that->fcapacity > 8 ) delta = 16;
      else if ( that->fcapacity > 4 ) delta =  8;
      else                            delta =  4;
      
      tlist_setcapacity( that, that->fcapacity + delta ); 
  }
  //------------------------------------------------------------------------------
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
219
220
221
222
  /** @brief   아이템 포인터가 동일한 포인터의 인덱스를 구한다.
      @param   that 관리 객체의 포인터
      @param   index  아이템 포인터
      @return  아이템 포인터가 해당되는 인덱스
8c2952457   김태훈   응용 프로그램 추가
223
224
225
226
227
228
229
230
231
232
  *///----------------------------------------------------------------------------
  int    tlist_indexof    ( tlist *that, void *item )
  {
      int result;
      result = 0;
      while( ( result < that->fcount ) && ( that->flist[ result ] != item ) ) result++;
      if( result == that->fcount ) result = -1;
      return result;
  }
  //------------------------------------------------------------------------------
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
233
234
235
236
  /** @brief   아이템을 특정 위치에 추가한다.
      @param   that 관리 객체의 포인터
      @param   index 추가할 아이템가 들어갈 인덱스
      @param   item  추가할 아이템 포인터
8c2952457   김태훈   응용 프로그램 추가
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
  *///----------------------------------------------------------------------------
  void   tlist_insert     ( tlist *that, int index, void *item )
  {
      if( ( index < 0 ) || ( index > that->fcount ) ) 
      {
      	tlist_error_index( that, index );
      	return;
      }
      	
      if( that->fcount == that->fcapacity ) tlist_grow( that );
      if( index < that->fcount ) memmove( &that->flist[ index + 1], 
                                          &that->flist[ index ], 
                                          ( that->fcount - index ) * sizeof( void * ) );
      that->flist[ index ] = item;
      that->fcount++;
  }
  //------------------------------------------------------------------------------
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
254
255
256
  /** @brief   마지막 아이템 포인터를 구한다.
      @param   that 관리 객체의 포인터
      @return  마지막 아이템 포인터
8c2952457   김태훈   응용 프로그램 추가
257
258
259
260
261
262
  *///----------------------------------------------------------------------------
  void  *tlist_last       ( tlist *that )
  {
      return( tlist_get( that, that->fcount -1 ) );
  }
  //------------------------------------------------------------------------------
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
263
264
265
266
  /** @brief   특정 아이템의 위치(인덱스)를 변경한다.
      @param   that 관리 객체의 포인터
      @param   curindex 변경할 아이템의 인덱스
      @param   newindex 변경될 아이템의 인덱스
8c2952457   김태훈   응용 프로그램 추가
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
  *///----------------------------------------------------------------------------
  void   tlist_move       ( tlist *that, int curindex, int newindex )
  {
  	void *item; 
  	if( curindex != newindex ) 
  	{
  		if( ( newindex < 0 ) || ( newindex >= that->fcount ) )
  		{
  			tlist_error_index( that, newindex );
  			return;
  		}
  			 
  		item = tlist_get( that, curindex );
  		tlist_delete( that, curindex );
  		tlist_insert( that, newindex, item );
  	} 
  }
  //------------------------------------------------------------------------------
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
285
286
287
288
  /** @brief   특정아이템의 포인터를 변경한다.
      @param   that  관리 객체의 포인터
      @param   index 아이템가 변경될 인덱스
      @param   item  새로 변경될 아이템 포인터
8c2952457   김태훈   응용 프로그램 추가
289
290
291
292
293
294
295
296
297
298
299
300
  *///----------------------------------------------------------------------------
  void   tlist_put        ( tlist *that, int index, void *item )
  {
  	if( (index< 0) || (index>=that->fcount) ) 
  	{
  		tlist_error_index( that, index );
  		return;
  	}
  	
  	that->flist[ index ] = item;
  }
  //------------------------------------------------------------------------------
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
301
302
303
304
  /** @brief   인자로 전해준 동일한 아이템 포인터를 찾아 삭제한다.
      @param   that 관리 객체의 포인터
      @param   item 삭제할 아이템의 포인터
      @return  삭제된 아이템의 과거 인덱스
8c2952457   김태훈   응용 프로그램 추가
305
306
307
308
309
310
311
312
313
  *///----------------------------------------------------------------------------
  int    tlist_remove     ( tlist *that, void *item )
  {
      int result;
      result = tlist_indexof( that, item );
      if( result != -1 ) tlist_delete( that, result );
      return result;
  }
  //------------------------------------------------------------------------------
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
314
315
316
317
  /** @brief   메모리 관리를 위해 사용하지 않는 메모리를 반환한다.
      @param   that 관리 객체의 포인터
      @remark  실제 메모리를 반환하지 않는다.
      @todo    메모리를 반환하도록 재작성되어야 한다.
8c2952457   김태훈   응용 프로그램 추가
318
319
320
321
322
323
324
325
  *///----------------------------------------------------------------------------
  void   tlist_pack       ( tlist *that )
  {
     int loop;
     for( loop = that->fcount -1; loop >= 0 ; loop-- )
        if( tlist_get( that, loop ) == NULL ) tlist_delete( that, loop );
  }
  //------------------------------------------------------------------------------
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
326
327
328
  /** @brief   관리할 수 있는 아이템 풀의 용량을 설정하고 메모리를 재 할당한다.
      @param   that 관리 객체의 포인터
      @param   newcapacity 할당해야할 아이템 풀의 용량
8c2952457   김태훈   응용 프로그램 추가
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
  *///----------------------------------------------------------------------------
  void   tlist_setcapacity( tlist *that, int newcapacity )
  {
     	if( ( newcapacity < that->fcount ) || ( newcapacity > MAXLISTSIZE ) ) 
      {
         tlist_error( that );
         return;
      }
      
      if( newcapacity > that->fcapacity )
      {
          that->flist = ( void ** )realloc( that->flist,newcapacity * sizeof( void * ) );
          if( that->flist != NULL ) that->fcapacity = newcapacity;  
      }
  }
  //------------------------------------------------------------------------------
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
345
346
347
  /** @brief   관리할 수 있는 아이템의 개수를 설정하며 아이템의 개수를 설정된 값으로 변경한다.
      @param   that 관리 객체의 포인터
      @param   newcount 변경되는 아이템의 개수
8c2952457   김태훈   응용 프로그램 추가
348
349
350
351
352
353
354
355
356
357
358
359
360
361
  *///----------------------------------------------------------------------------
  void   tlist_setcount   ( tlist *that, int newcount )
  {
      if( (newcount < 0) || (newcount > MAXLISTSIZE ) )
      {
      	tlist_error( that ); 
      	return;
      }
      if( newcount > that->fcapacity ) tlist_setcapacity( that, newcount );
      if( newcount > that->fcount ) 
          memset( that->flist[ that->fcount], 0, ( newcount - that->fcount ) * sizeof( void * ));
      that->fcount = newcount; 
  }
  //------------------------------------------------------------------------------
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
362
363
364
  /** @brief   아이템풀의 크기를 얻는다.
      @param   that 관리 객체의 포인터
      @return  아이템풀의 크기
8c2952457   김태훈   응용 프로그램 추가
365
366
367
368
369
370
  *///----------------------------------------------------------------------------
  int    tlist_getcapacity ( tlist *that )
  {
      return that->fcapacity;
  }
  //------------------------------------------------------------------------------
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
371
372
373
  /** @brief   아이템의 개수를 얻는다.
      @param   that 관리 객체의 포인터
      @return  아이템의 개수
8c2952457   김태훈   응용 프로그램 추가
374
375
376
377
378
379
  *///----------------------------------------------------------------------------
  int    tlist_getcount   ( tlist *that )
  {
      return that->fcount;
  }
  //------------------------------------------------------------------------------
3061c73f6   김태훈   인코딩 변경 EUC-KR -> ...
380
381
382
  /** @brief   아이템을 사용자 비교함수를 통해 정렬한다.
      @param   that 관리 객체의 포인터
      @param   tlistsortcomparefunc 사용자비교 콜백함수이며, int (*func)(const void *, const void *) 형태이다.
8c2952457   김태훈   응용 프로그램 추가
383
384
385
386
387
388
389
390
  *///----------------------------------------------------------------------------
  void   tlist_sort       ( tlist *that,int (*tlistsortcomparefunc)(const void *, const void *) )
  {
      if( ( that->flist != NULL ) && ( that->fcount > 0 ) )
          qsort( that->flist, that->fcount,sizeof( void *), tlistsortcomparefunc );
  }