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 );
}
|