Index: /trunk/include/cf_base.h
===================================================================
--- /trunk/include/cf_base.h	(revision 108)
+++ /trunk/include/cf_base.h	(revision 109)
@@ -33,13 +33,9 @@
 
 /** boolean 타입 */
-typedef enum {
+typedef enum
+{
 	CF_FALSE = 0,	/**< 거짓 */
 	CF_TRUE = 1		/**< 참 */
-} E_CF_BOOL,
-/**
- * boolean 타입
- * @see E_CF_BOOL
- */
-	CF_BOOL;
+} CF_BOOL;
 
 /** 성공 시, 반환 값 */
@@ -47,7 +43,4 @@
 /** 오류 코드 */
 #define CF_ERROR						-1
-
-/** 파일 이름 및 경로 길이 */
-#define NAME_LENGTH						128
 
 /** Windows 에서의 함수 EXPORT 구문 정의 */
Index: /trunk/include/cf_error.h
===================================================================
--- /trunk/include/cf_error.h	(revision 108)
+++ /trunk/include/cf_error.h	(revision 109)
@@ -53,5 +53,5 @@
 #define CF_ERROR_THREAD						CF_ERROR_BASE * 4
 /*------------------------------------------------------------*/
-#define CF_ERROR_THREAD_ALLOC				CF_ERROR_THREAD - 1
+#define CF_ERROR_THREAD_CREATE_CTX			CF_ERROR_THREAD - 1
 #define CF_ERROR_THREAD_CREATE				CF_ERROR_THREAD - 2
 #define CF_ERROR_THREAD_INVALID_ARGS		CF_ERROR_THREAD - 3
@@ -76,5 +76,5 @@
 #define CF_ERROR_DEBUG_POP_CALLSTACK		CF_ERROR_DEBUG - 3
 #define CF_ERROR_DEBUG_PEEK_CALLSTACK		CF_ERROR_DEBUG - 4
-#define CF_ERROR_DEBUG_ALLOCATE_CTX			CF_ERROR_DEBUG - 5
+#define CF_ERROR_DEBUG_CREATE_CTX			CF_ERROR_DEBUG - 5
 /* }}} debug */
 
@@ -94,5 +94,5 @@
 #define CF_ERROR_LOG_NOT_INITIALIZE			CF_ERROR_LOG - 11
 #define CF_ERROR_LOG_INVALID_ARGS			CF_ERROR_LOG - 12
-#define CF_ERROR_LOG_ALLOCATE_CTX			CF_ERROR_LOG - 13
+#define CF_ERROR_LOG_CREATE_CTX				CF_ERROR_LOG - 13
 #define CF_ERROR_LOG_CREATE_FILE			CF_ERROR_LOG - 14
 #define CF_ERROR_LOG_ALLOCATE_BUFFER		CF_ERROR_LOG - 15
@@ -107,4 +107,14 @@
 /* }}} codec */
 
+/* data structure - list/queue/stack {{{ */
+#define CF_ERROR_DS							CF_ERROR_BASE * 9
+/*------------------------------------------------------------*/
+#define CF_ERROR_DS_INVALID_CTX				CF_ERROR_DS - 1
+#define CF_ERROR_DS_INVALID_TRAVERSER		CF_ERROR_DS - 2
+#define CF_ERROR_DS_INVALID_ARGS			CF_ERROR_DS - 3
+#define CF_ERROR_DS_CREATE_CTX				CF_ERROR_DS - 4
+#define CF_ERROR_DS_CREATE_NODE				CF_ERROR_DS - 5
+#define CF_ERROR_DS_NO_MORE					CF_ERROR_DS - 6
+/* }}} data structure - list/queue/stack */
 
 #endif // #ifndef __CF_ERROR_H__
Index: /trunk/include/cf_file.h
===================================================================
--- /trunk/include/cf_file.h	(revision 108)
+++ /trunk/include/cf_file.h	(revision 109)
@@ -15,5 +15,6 @@
 
 /** 파일 열기 옵션 플래그 */
-typedef enum {
+typedef enum
+{
 	CF_FILE_READ		= 0x0001,	/**< 읽기 전용 */
 	CF_FILE_WRITE		= 0x0002,	/**< 쓰기 전용 */
@@ -22,5 +23,5 @@
 	CF_FILE_TRUNC		= 0x0010,	/**< 파일이 존재하면 비우기 */
 	CF_FILE_APPEND		= 0x0020	/**< 파일이 존재하면 이어서 쓰기 */
-} E_CF_FILE_FLAG, CF_FILE_FLAG;
+} CF_FILE_FLAG;
 
 #ifdef __cplusplus
@@ -51,4 +52,7 @@
 CF_File_GetSize			(const char * path);
 
+CF_EXPORT CF_BOOL
+CF_File_Exists			(const char * path);
+
 CF_EXPORT int
 CF_File_MakeDirectory	(const char * path);
Index: /trunk/include/cf_list.h
===================================================================
--- /trunk/include/cf_list.h	(revision 109)
+++ /trunk/include/cf_list.h	(revision 109)
@@ -0,0 +1,71 @@
+/**
+ * @file	cf_list.h
+ * @author	myusgun <myusgun@gmail.com>
+ */
+#ifndef __CF_LIST_H__
+#define __CF_LIST_H__
+
+#include "cf_base.h"
+
+/** 리스트 컨텍스트 (Opaque) */
+typedef void *	CF_List_Ctx;
+
+/** 리스트 탐색자 (Opaque) */
+typedef void *	CF_Traverser;
+
+/** 추가 위치 */
+typedef enum
+{
+	CF_DIRECTION_BEFORE,	/**< traverser의 앞 */
+	CF_DIRECTION_AFTER		/**< traverser의 뒤 */
+} CF_DIRECTION;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+CF_EXPORT int
+CF_List_CreateCtx		(CF_List_Ctx * ctx);
+
+CF_EXPORT int
+CF_List_DestroyCtx		(CF_List_Ctx ctx);
+
+CF_EXPORT int
+CF_List_Front			(CF_List_Ctx	ctx,
+						 CF_Traverser	* traverser);
+
+CF_EXPORT int
+CF_List_Rear			(CF_List_Ctx	ctx,
+						 CF_Traverser	* traverser);
+
+CF_EXPORT int
+CF_List_Insert			(CF_List_Ctx		ctx,
+						 const CF_Traverser	traverser,
+						 const CF_DIRECTION	direction,
+						 const void			* element);
+
+CF_EXPORT int
+CF_List_Remove			(CF_List_Ctx	ctx,
+						 CF_Traverser	* traverser);
+
+CF_EXPORT int
+CF_List_RemoveAll		(CF_List_Ctx ctx);
+
+CF_EXPORT int
+CF_List_GetElement		(const CF_Traverser	traverser,
+						 void				** element);
+
+CF_EXPORT int
+CF_List_Prev			(CF_Traverser * traverser);
+
+CF_EXPORT int
+CF_List_Next			(CF_Traverser * traverser);
+
+CF_EXPORT int
+CF_List_GetSize			(CF_List_Ctx ctx);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // #ifndef __CF_LIST_H__
Index: /trunk/include/cf_log.h
===================================================================
--- /trunk/include/cf_log.h	(revision 108)
+++ /trunk/include/cf_log.h	(revision 109)
@@ -15,8 +15,9 @@
 
 /** 로그 옵션 플래그 */
-typedef enum {
+typedef enum
+{
 	CF_LOG_DEFAULT_BUFFER	= -1,	/**< 기본 버퍼 크기 사용 */
 	CF_LOG_NO_BUFFER		= 0,	/**< 버퍼없이 파일에 바로 쓰기 */
-} E_CF_LOG_OPTION, CF_LOG_OPTION;
+} CF_LOG_OPTION;
 
 #ifdef __cplusplus
Index: /trunk/include/cf_queue.h
===================================================================
--- /trunk/include/cf_queue.h	(revision 109)
+++ /trunk/include/cf_queue.h	(revision 109)
@@ -0,0 +1,45 @@
+/**
+ * @file	cf_queue.h
+ * @author	myusgun <myusgun@gmail.com>
+ *
+ * @remark 큐
+ *
+ * @example queue.c
+ */
+#ifndef __CF_STACK_H__
+#define __CF_QUEUE_H__
+
+#include "cf_base.h"
+
+typedef void *	CF_Queue_Ctx;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+CF_EXPORT int
+CF_Queue_CreateCtx		(CF_Queue_Ctx * ctx);
+
+CF_EXPORT int
+CF_Queue_DestroyCtx		(CF_Queue_Ctx ctx);
+
+CF_EXPORT int
+CF_Queue_Put			(CF_Queue_Ctx	ctx,
+						 const void		* element);
+
+CF_EXPORT int
+CF_Queue_Get			(CF_Queue_Ctx	ctx,
+						 void			** element);
+
+CF_EXPORT int
+CF_Queue_Front			(CF_Queue_Ctx	ctx,
+						 void			** element);
+
+CF_EXPORT int
+CF_Queue_GetSize		(CF_Queue_Ctx ctx);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // #ifndef __CF_QUEUE_H__
Index: /trunk/include/cf_socket.h
===================================================================
--- /trunk/include/cf_socket.h	(revision 108)
+++ /trunk/include/cf_socket.h	(revision 109)
@@ -5,6 +5,5 @@
  * @remark TCP 소켓 지원
  *
- * @example socket_server.c
- * @example socket_client.c
+ * @example socket.c
  */
 #ifndef __CF_SOCKET_H__
@@ -63,24 +62,24 @@
 
 CF_EXPORT int
-CF_Socket_Send				(const int	sock,
-							 const void	* buf,
-							 const int	len);
+CF_Socket_Send				(const int		sock,
+							 const void		* buf,
+							 const size_t	len);
 
 CF_EXPORT int
-CF_Socket_SendTimeout		(const int	sock,
-							 const void	* buf,
-							 const int	len,
-							 const int	timeout);
+CF_Socket_SendTimeout		(const int		sock,
+							 const void		* buf,
+							 const size_t	len,
+							 const int		timeout);
 
 CF_EXPORT int
-CF_Socket_Recv				(const int	sock,
-							 void		* buf,
-							 const int	len);
+CF_Socket_Recv				(const int		sock,
+							 void			* buf,
+							 const size_t	len);
 
 CF_EXPORT int
-CF_Socket_RecvTimeout		(const int	sock,
-							 void		* buf,
-							 const int	len,
-							 const int	timeout);
+CF_Socket_RecvTimeout		(const int		sock,
+							 void			* buf,
+							 const size_t	len,
+							 const int		timeout);
 
 #ifdef __cplusplus
Index: /trunk/include/cf_stack.h
===================================================================
--- /trunk/include/cf_stack.h	(revision 109)
+++ /trunk/include/cf_stack.h	(revision 109)
@@ -0,0 +1,45 @@
+/**
+ * @file	cf_stack.h
+ * @author	myusgun <myusgun@gmail.com>
+ *
+ * @remark 스택
+ *
+ * @example stack.c
+ */
+#ifndef __CF_STACK_H__
+#define __CF_STACK_H__
+
+#include "cf_base.h"
+
+typedef void *	CF_Stack_Ctx;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+CF_EXPORT int
+CF_Stack_CreateCtx		(CF_Stack_Ctx * ctx);
+
+CF_EXPORT int
+CF_Stack_DestroyCtx		(CF_Stack_Ctx ctx);
+
+CF_EXPORT int
+CF_Stack_Push			(CF_Stack_Ctx	ctx,
+						 const void		* element);
+
+CF_EXPORT int
+CF_Stack_Pop			(CF_Stack_Ctx	ctx,
+						 void			** element);
+
+CF_EXPORT int
+CF_Stack_Top			(CF_Stack_Ctx 	ctx,
+						 void			** element);
+
+CF_EXPORT int
+CF_Stack_GetSize		(CF_Stack_Ctx ctx);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // #ifndef __CF_STACK_H__
Index: /trunk/include/cf_thread.h
===================================================================
--- /trunk/include/cf_thread.h	(revision 108)
+++ /trunk/include/cf_thread.h	(revision 109)
@@ -16,8 +16,8 @@
 
 /** 스레드 아이디 */
-typedef void *	CF_Thread;
+typedef void *	CF_Thread_Ctx;
 
 /** 뮤텍스 아이디 */
-typedef void *	CF_Mutex;
+typedef void *	CF_Mutex_Ctx;
 
 #ifdef __cplusplus
@@ -26,25 +26,25 @@
 
 CF_EXPORT int
-CF_Thread_Create	(CF_Thread			* threadID,
-					 CF_Thread_Function	callback,
-					 void				* arg);
+CF_Thread_CreateCtx		(CF_Thread_Ctx		* threadID,
+						 CF_Thread_Function	callback,
+						 void				* arg);
 
 CF_EXPORT int
-CF_Thread_Release	(CF_Thread * threadID);
+CF_Thread_DestroyCtx	(CF_Thread_Ctx * threadID);
 
 CF_EXPORT int
-CF_Thread_Join		(CF_Thread * threadID);
+CF_Thread_Join			(CF_Thread_Ctx * threadID);
 
 CF_EXPORT int
-CF_Mutex_Create		(CF_Mutex * mutex);
+CF_Mutex_CreateCtx		(CF_Mutex_Ctx * mutex);
 
 CF_EXPORT int
-CF_Mutex_Destory	(CF_Mutex * mutex);
+CF_Mutex_DestoryCtx		(CF_Mutex_Ctx * mutex);
 
 CF_EXPORT int
-CF_Mutex_Lock		(CF_Mutex * mutex);
+CF_Mutex_Lock			(CF_Mutex_Ctx * mutex);
 
 CF_EXPORT int
-CF_Mutex_Unlock		(CF_Mutex * mutex);
+CF_Mutex_Unlock			(CF_Mutex_Ctx * mutex);
 
 #ifdef __cplusplus
Index: /trunk/src/cf_debug.c
===================================================================
--- /trunk/src/cf_debug.c	(revision 108)
+++ /trunk/src/cf_debug.c	(revision 109)
@@ -25,16 +25,8 @@
 		return CF_ERROR_DEBUG_INVALID_CTX
 
-/**
- * 디버그 컨텍스트
- * 
- * @remark change from public to private
- */
+/** 디버그 컨텍스트 (Opaque) */
 typedef void *	CF_Debug_Ctx;
 
-/* *
- * 콜스택 데이터
- * 
- * @remark change from public to private
- */
+/** 콜스택 인터페이스 */
 typedef struct cf_debug_callStack {
 	char	file[NAME_LENGTH + 1];		/* *< 파일 이름 */
@@ -43,4 +35,5 @@
 } CF_Debug_CallStack;
 
+/** 콜스택 컨텍스트 */
 typedef struct __cf_debug_callstack__
 {
@@ -52,35 +45,16 @@
 
 	struct __cf_debug_callstack__	* caller;
-} S_CF_DEBUG_CALLSTACK, CF_DEBUG_CALLSTACK;
-
+} CF_DEBUG_CALLSTACK;
+
+/** 디버그 컨텍스트 (CF_Debug_Ctx의 구현) */
 typedef struct __cf_debug_ctx__
 {
-	char		file[NAME_LENGTH + 1];
-	char		func[NAME_LENGTH + 1];
-	int			line;
-
-	CF_Mutex	mutex;
+	int				fd;
+	CF_Mutex_Ctx	mutex;
 
 	CF_DEBUG_CALLSTACK	callstack;
-} S_CF_DEBUG_CTX, CF_DEBUG_CTX;
+} CF_DEBUG_CTX;
 
 CF_Debug_Ctx	gDebugSingleCtx = NULL;
-
-static int
-CF_Debug_Local_UpdateCtx (CF_Debug_Ctx	ctx,
-						  const char	* file,
-						  const char	* func,
-						  const int		line)
-{
-	CF_DEBUG_CTX * context = (CF_DEBUG_CTX *) ctx;
-
-	ASSERT_CTX (ctx);
-
-	strncpy (context->file, file, strlen (file));
-	strncpy (context->func, func, strlen (func));
-	context->line = line;
-
-	return CF_OK;
-}
 
 static int
@@ -232,6 +206,4 @@
 	context->callstack.caller = push;
 
-	CF_Debug_Local_UpdateCtx (ctx, file, func, line);
-
 	return CF_OK;
 }
@@ -294,17 +266,4 @@
 		return CF_ERROR_DEBUG_PEEK_CALLSTACK;
 
-	memset (context->file, 0x00, sizeof (context->file));
-	memset (context->func, 0x00, sizeof (context->func));
-	context->line = 0;
-
-	/* restore current context */
-	if (pop->caller != NULL)
-	{
-		CF_Debug_Local_UpdateCtx (ctx,
-								  pop->caller->file,
-								  pop->caller->func, 
-								  pop->caller->line);
-	}
-
 	context->callstack.caller = pop->caller;
 	free (pop);
@@ -333,5 +292,5 @@
 
 	if (context->mutex)
-		CF_Mutex_Destory (&context->mutex);
+		CF_Mutex_DestoryCtx (&context->mutex);
 
 	free (context);
@@ -357,9 +316,9 @@
 		if (context == NULL)
 		{
-			result = CF_ERROR_DEBUG_ALLOCATE_CTX;
+			result = CF_ERROR_DEBUG_CREATE_CTX;
 			TRY_BREAK;
 		}
 
-		result = CF_Mutex_Create (&context->mutex);
+		result = CF_Mutex_CreateCtx (&context->mutex);
 		if (result < 0)
 		{
Index: /trunk/src/cf_file.c
===================================================================
--- /trunk/src/cf_file.c	(revision 108)
+++ /trunk/src/cf_file.c	(revision 109)
@@ -219,4 +219,17 @@
 
 /**
+ * 파일 및 디렉터리 존재 여부 검사
+ *
+ * @return 존재 시, CF_TRUE; 아니면, CF_FALSE
+ *
+ * @param path 파일 및 디렉터리 경로
+ */
+CF_BOOL
+CF_File_Exists (const char * path)
+{
+	return (access (path, F_OK) == 0) ? CF_TRUE : CF_FALSE;
+}
+
+/**
  * 디렉터리 생성
  *
@@ -244,5 +257,5 @@
 			continue;
 
-		if (access (stepPath, F_OK) == 0)
+		if (CF_File_Exists (stepPath))
 			continue;
 
Index: /trunk/src/cf_list.c
===================================================================
--- /trunk/src/cf_list.c	(revision 109)
+++ /trunk/src/cf_list.c	(revision 109)
@@ -0,0 +1,355 @@
+/**
+ * @file	cf_list.c
+ * @author	myusgun <myusgun@gmail.com>
+ */
+#include "cf_list.h"
+#include "cf_local.h"
+#include "cf_error.h"
+
+#include <stdlib.h>
+
+#define ASSERT_CTX(__ctx)	\
+	if (__ctx == NULL)		\
+		return CF_ERROR_DS_INVALID_CTX
+
+#define ASSERT_TRAVERSER(__trav)	\
+	if (__trav == NULL)				\
+		return CF_ERROR_DS_INVALID_TRAVERSER
+
+#define ASSERT_ARGS(x)	\
+	if ((x))			\
+		return CF_ERROR_DS_INVALID_ARGS
+
+/** 리스트 노드 (CF_Traverser의 구현) */
+typedef struct __cf_node__
+{
+	void				* element;
+	struct __cf_node__	* prev;
+	struct __cf_node__	* next;
+} CF_NODE;
+
+/** 리스트 컨텍스트 (CF_List_Ctx의 구현) */
+typedef struct __cf_list__
+{
+	int			size;
+	CF_NODE		* front;
+	CF_NODE		* rear;
+} CF_LIST_CTX;
+
+/**
+ * 리스트 컨텍스트 생성
+ *
+ * @return 성공 시, CF_OK; 실패 시, 오류 코드
+ *
+ * @param ctx 리스트 컨텍스트 포인터
+ */
+int
+CF_List_CreateCtx (CF_List_Ctx * ctx)
+{
+	CF_LIST_CTX * context = NULL;
+
+	ASSERT_ARGS (ctx == NULL);
+
+	context = (CF_LIST_CTX *) calloc (sizeof (CF_LIST_CTX), 1);
+	if (context == NULL)
+		return CF_ERROR_DS_CREATE_CTX;
+
+	*ctx = (CF_List_Ctx) context;
+
+	return CF_OK;
+}
+
+/**
+ * 리스트 컨텍스트 해제
+ *
+ * @return 성공 시, CF_OK; 실패 시, 오류 코드
+ *
+ * @param ctx 리스트 컨텍스트
+ */
+int
+CF_List_DestroyCtx (CF_List_Ctx ctx)
+{
+	CF_LIST_CTX * context = (CF_LIST_CTX *) ctx;
+
+	ASSERT_CTX (ctx);
+
+	CF_List_RemoveAll (ctx);
+
+	free (context);
+
+	return CF_OK;
+}
+
+/**
+ * 리스트 탐색자(Traverser)를 Front 위치로 설정
+ *
+ * @return 성공 시, CF_OK; 실패 시, 오류 코드
+ *
+ * @param ctx		리스트 컨텍스트
+ * @param traverser	리스트 탐색자 주소
+ */
+int
+CF_List_Front (CF_List_Ctx	ctx,
+			   CF_Traverser	* traverser)
+{
+	CF_LIST_CTX * context = (CF_LIST_CTX *) ctx;
+
+	ASSERT_CTX (ctx);
+	ASSERT_TRAVERSER (traverser);
+
+	*traverser = (CF_Traverser *) context->front;
+
+	return CF_OK;
+}
+
+/**
+ * 리스트 탐색자(Traverser)를 Rear 위치로 설정
+ *
+ * @return 성공 시, CF_OK; 실패 시, 오류 코드
+ *
+ * @param ctx		리스트 컨텍스트
+ * @param traverser	리스트 탐색자 주소
+ */
+int
+CF_List_Rear (CF_List_Ctx	ctx,
+			  CF_Traverser	* traverser)
+{
+	CF_LIST_CTX * context = (CF_LIST_CTX *) ctx;
+
+	ASSERT_CTX (ctx);
+	ASSERT_TRAVERSER (traverser);
+
+	*traverser = (CF_Traverser *) context->rear;
+
+	return CF_OK;
+}
+
+/**
+ * 리스트에 새 데이터 삽입
+ *
+ * @return 성공 시, CF_OK; 실패 시, 오류 코드
+ *
+ * @param ctx		리스트 컨텍스트
+ * @param traverser	리스트 탐색자
+ * @param direction	탐색자의 전/후를 지정
+ * @param element	삽입할 데이터 주소
+ */
+int
+CF_List_Insert (CF_List_Ctx			ctx,
+				const CF_Traverser	traverser,
+				const CF_DIRECTION	direction,
+				const void			* element)
+{
+	CF_LIST_CTX	* context = (CF_LIST_CTX *) ctx;
+	CF_NODE		* node = NULL;
+	CF_NODE		* newnode = NULL;
+
+	ASSERT_CTX (ctx);
+
+	newnode = (CF_NODE *) calloc (sizeof (CF_NODE), 1);
+	if (newnode == NULL)
+		return CF_ERROR_DS_CREATE_NODE;
+
+	newnode->element = (void *) element;
+
+	TRY
+	{
+		if (CF_List_GetSize (ctx) == 0)
+		{
+			context->front = context->rear = newnode;
+			TRY_BREAK;
+		}
+
+		if (direction == CF_DIRECTION_BEFORE)
+		{
+			node = traverser ? (CF_NODE *) traverser : context->front;
+
+			newnode->next = node;
+			if (node)
+			{
+				newnode->prev = node->prev;
+				node->prev  = newnode;
+				if (newnode->prev)
+					newnode->prev->next = newnode;
+			}
+
+			if (node == context->front)
+				context->front = newnode;
+		}
+		else /* if (direction == CF_DIRECTION_AFTER) */
+		{
+			node = traverser ? (CF_NODE *) traverser : context->rear;
+
+			newnode->prev = node;
+			if (node)
+			{
+				newnode->next = node->next;
+				node->next = newnode;
+				if (newnode->next)
+					newnode->next->prev = newnode;
+			}
+
+			if (node == context->rear)
+				context->rear = newnode;
+		}
+	} NO_CATCH;
+
+	context->size++;
+
+	return CF_OK;
+}
+
+/**
+ * 리스트에서 탐색자 위치의 항목을 삭제
+ *
+ * @return 성공 시, CF_OK; 실패 시, 오류 코드
+ *
+ * @param ctx		리스트 컨텍스트
+ * @param traverser	리스트 탐색자 주소
+ */
+int
+CF_List_Remove (CF_List_Ctx		ctx,
+				CF_Traverser	* traverser)
+{
+	CF_LIST_CTX	* context = (CF_LIST_CTX *) ctx;
+	CF_NODE		* node = NULL;
+
+	ASSERT_CTX (ctx);
+	ASSERT_TRAVERSER (traverser);
+	ASSERT_ARGS (*traverser == NULL);
+
+	node = (CF_NODE *) *traverser;
+
+	if (node->prev)
+	{
+		node->prev->next = node->next;
+		if (node == context->rear)
+			context->rear = node->prev;
+	}
+
+	if (node->next)
+	{
+		node->next->prev = node->prev;
+		if (node == context->front)
+			context->front = node->next;
+	}
+
+	free (node);
+
+	*traverser = NULL;
+
+	context->size--;
+
+	if (CF_List_GetSize (ctx) == 0)
+		context->front = context->rear = NULL;
+
+	return CF_OK;
+}
+
+/**
+ * 리스트에서 모든 항목을 삭제
+ *
+ * @return 성공 시, CF_OK; 실패 시, 오류 코드
+ *
+ * @param ctx 리스트 컨텍스트
+ */
+int
+CF_List_RemoveAll (CF_List_Ctx ctx)
+{
+	CF_Traverser traverser = NULL;
+
+	ASSERT_CTX (ctx);
+
+	while (CF_List_GetSize (ctx) > 0)
+	{
+		CF_List_Front (ctx, &traverser);
+		CF_List_Remove (ctx, &traverser);
+	}
+
+	return CF_OK;
+}
+
+/**
+ * 탐색자 위치의 데이터를 가져옴
+ *
+ * @return 성공 시, CF_OK; 실패 시, 오류 코드
+ *
+ * @param traverser 리스트 탐색자
+ * @param element	데이터 주소
+ */
+int
+CF_List_GetElement (const CF_Traverser	traverser,
+					void				** element)
+{
+	CF_NODE * node = (CF_NODE *) traverser;
+
+	ASSERT_TRAVERSER (traverser);
+	ASSERT_ARGS (element == NULL);
+
+	*element = node->element;
+
+	return CF_OK;
+}
+
+/**
+ * 탐색자 위치를 이전으로 이동
+ *
+ * @return 성공 시, CF_OK; 실패 시, 오류 코드
+ *
+ * @param traverser 리스트 탐색자 주소
+ */
+int
+CF_List_Prev (CF_Traverser * traverser)
+{
+	CF_NODE * node = (CF_NODE *) *traverser;
+
+	ASSERT_TRAVERSER (traverser);
+	ASSERT_ARGS (*traverser == NULL);
+
+	node = node->prev;
+	*traverser = (CF_Traverser *) node;
+	if (node == NULL)
+		return CF_ERROR_DS_NO_MORE;
+
+	return CF_OK;
+}
+
+/**
+ * 탐색자 위치를 다음으로 이동
+ *
+ * @return 성공 시, CF_OK; 실패 시, 오류 코드
+ *
+ * @param traverser 리스트 탐색자 주소
+ */
+int
+CF_List_Next (CF_Traverser * traverser)
+{
+	CF_NODE * node = (CF_NODE *) *traverser;
+
+	ASSERT_TRAVERSER (traverser);
+	ASSERT_ARGS (*traverser == NULL);
+
+	node = node->next;
+	*traverser = (CF_Traverser *) node;
+	if (node == NULL)
+		return CF_ERROR_DS_NO_MORE;
+
+	return CF_OK;
+}
+
+/**
+ * 리스트에 등록된 항목의 수를 가져옴
+ *
+ * @return 성공 시, 항목 수; 실패 시, 오류 코드
+ *
+ * @param ctx 리스트 컨텍스트
+ */
+int
+CF_List_GetSize (CF_List_Ctx ctx)
+{
+	CF_LIST_CTX * context = (CF_LIST_CTX *) ctx;
+
+	ASSERT_CTX (ctx);
+
+	return context->size;
+}
Index: /trunk/src/cf_local.h
===================================================================
--- /trunk/src/cf_local.h	(revision 108)
+++ /trunk/src/cf_local.h	(revision 109)
@@ -6,4 +6,8 @@
 #define __CF_LOCAL_H__
 
+/** 파일 이름 및 경로 길이 */
+#define NAME_LENGTH						128
+
+/** 예외 처리 */
 #define TRY						do
 #define TRY_BREAK				break
@@ -13,4 +17,5 @@
 #define CATCH_ELSE				else
 
+/** non-compatible function */
 #if defined(_WIN32) || defined(_WIN64)
 # define snprintf		_snprintf
Index: /trunk/src/cf_log.c
===================================================================
--- /trunk/src/cf_log.c	(revision 108)
+++ /trunk/src/cf_log.c	(revision 109)
@@ -57,9 +57,5 @@
 #define LOG_DATETIME_LENGTH				sizeof ("0000-00-00 00:00:00.000") - 1
 
-/**
- * 로그 컨텍스트
- * 
- * @remark change from public to private
- */
+/** 로그 컨텍스트 (Opaque) */
 typedef void *	CF_Log_Ctx;
 
@@ -75,19 +71,20 @@
 	int sec;
 	int usec;
-} S_CF_LOG_DATETIME, CF_LOG_DATETIME;
-
+} CF_LOG_DATETIME;
+
+/** 로그 컨텍스트 (CF_Log_Ctx의 구현) */
 typedef struct __cf_log_ctx__ {
-	char		path[NAME_LENGTH + 1];
-	int			fd;
-	char		* buffer;
-	size_t		size;	/* entire size of buffer */
-	size_t		length; /* data length in current */
-	CF_Mutex	mutex;
-} S_CF_LOG_CTX, CF_LOG_CTX;
+	char			path[NAME_LENGTH + 1];
+	int				fd;
+	char			* buffer;
+	size_t			size;	/* entire size of buffer */
+	size_t			length; /* data length in current */
+	CF_Mutex_Ctx	mutex;
+} CF_LOG_CTX;
 
 typedef struct __cf_log_array__ {
 	CF_Log_Ctx	* ctxPool;
 	int			ctxSize;
-} S_CF_LOG_ARRAY, CF_LOG_ARRAY;
+} CF_LOG_ARRAY;
 
 static CF_LOG_ARRAY	gLogArray;
@@ -257,5 +254,5 @@
 	ASSERT_CTX (ctx);
 
-	if (CF_Mutex_Create (&context->mutex) < 0)
+	if (CF_Mutex_CreateCtx (&context->mutex) < 0)
 		return CF_ERROR_LOG_SET_MULTITHREAD;
 
@@ -279,5 +276,5 @@
 	ASSERT_CTX (ctx);
 
-	if (CF_Mutex_Destory (&context->mutex) < 0)
+	if (CF_Mutex_DestoryCtx (&context->mutex) < 0)
 		return CF_ERROR_LOG_UNSET_MULTITHREAD;
 
@@ -371,5 +368,5 @@
 	CF_File_Close (context->fd);
 
-	CF_Mutex_Destory (&context->mutex);
+	CF_Mutex_DestoryCtx (&context->mutex);
 	context->mutex = NULL;
 
@@ -409,5 +406,5 @@
 		if (context == NULL)
 		{
-			result = CF_ERROR_LOG_ALLOCATE_CTX;
+			result = CF_ERROR_LOG_CREATE_CTX;
 			TRY_BREAK;
 		}
Index: /trunk/src/cf_queue.c
===================================================================
--- /trunk/src/cf_queue.c	(revision 109)
+++ /trunk/src/cf_queue.c	(revision 109)
@@ -0,0 +1,76 @@
+/**
+ * @file	cf_queue.c
+ * @author	myusgun <myusgun@gmail.com>
+ */
+#include "cf_queue.h"
+#include "cf_list.h"
+#include "cf_error.h"
+
+#include <stdio.h>
+
+int
+CF_Queue_CreateCtx (CF_Queue_Ctx * ctx)
+{
+	return CF_List_CreateCtx ((CF_List_Ctx *) ctx);
+}
+
+int
+CF_Queue_DestroyCtx (CF_Queue_Ctx ctx)
+{
+	return CF_List_DestroyCtx (ctx);
+}
+
+int
+CF_Queue_Put (CF_Queue_Ctx	ctx,
+			  const void	* element)
+{
+	int				result = 0;
+	CF_List_Ctx		list = (CF_List_Ctx) ctx;
+	CF_Traverser	traverser = NULL;
+
+	result = CF_List_Rear (list, &traverser);
+	if (result < 0)
+		return result;
+
+	return CF_List_Insert (list, traverser, CF_DIRECTION_AFTER, element);
+}
+
+int
+CF_Queue_Get (CF_Queue_Ctx	ctx,
+			  void			** element)
+{
+	int			result = 0;
+	CF_List_Ctx	list = (CF_List_Ctx) ctx;
+	CF_Traverser	traverser = NULL;
+
+	result = CF_Queue_Front (ctx, element);
+	if (result < 0)
+		return result;
+
+	result = CF_List_Front (list, &traverser);
+	if (result < 0)
+		return result;
+
+	return CF_List_Remove (ctx, &traverser);
+}
+
+int
+CF_Queue_Front (CF_Queue_Ctx 	ctx,
+				void			** element)
+{
+	int				result = 0;
+	CF_List_Ctx		list = (CF_List_Ctx) ctx;
+	CF_Traverser	traverser = NULL;
+
+	result = CF_List_Front (list, &traverser);
+	if (result < 0)
+		return result;
+
+	return CF_List_GetElement (traverser, element);
+}
+
+int
+CF_Queue_GetSize (CF_Queue_Ctx ctx)
+{
+	return CF_List_GetSize ((CF_List_Ctx) ctx);
+}
Index: /trunk/src/cf_socket.c
===================================================================
--- /trunk/src/cf_socket.c	(revision 108)
+++ /trunk/src/cf_socket.c	(revision 109)
@@ -510,7 +510,7 @@
  */
 int
-CF_Socket_Send (const int	sock,
-				const void	* buf,
-				const int	len)
+CF_Socket_Send (const int		sock,
+				const void		* buf,
+				const size_t	len)
 {
 	return CF_Socket_SendTimeout (sock, buf, len, CF_SOCKET_NO_TIMEOUT);
@@ -532,5 +532,5 @@
 CF_Socket_SendTimeout (const int	sock,
 					   const void	* buf,
-					   const int	len,
+					   const size_t	len,
 					   const int	timeout)
 {
@@ -539,5 +539,5 @@
 	ASSERT_SOCKET (sock);
 
-	result = (int) send (sock, buf, (size_t) len, 0);
+	result = (int) send (sock, buf, len, 0);
 	if (result != len)
 		return CF_ERROR_SOCKET_SEND;
@@ -556,7 +556,7 @@
  */
 int
-CF_Socket_Recv (const int	sock,
-				void		* buf,
-				const int	len)
+CF_Socket_Recv (const int		sock,
+				void			* buf,
+				const size_t	len)
 {
 	return CF_Socket_RecvTimeout (sock, buf, len, CF_SOCKET_NO_TIMEOUT);
@@ -578,5 +578,5 @@
 CF_Socket_RecvTimeout (const int	sock,
 					   void			* buf,
-					   const int	len,
+					   const size_t	len,
 					   const int	timeout)
 {
@@ -589,5 +589,5 @@
 		return result;
 
-	result = (int) recv (sock, buf, (size_t) len, 0);
+	result = (int) recv (sock, buf, len, 0);
 	if (result < 0)
 		return CF_ERROR_SOCKET_RECV;
Index: /trunk/src/cf_stack.c
===================================================================
--- /trunk/src/cf_stack.c	(revision 109)
+++ /trunk/src/cf_stack.c	(revision 109)
@@ -0,0 +1,76 @@
+/**
+ * @file	cf_stack.c
+ * @author	myusgun <myusgun@gmail.com>
+ */
+#include "cf_stack.h"
+#include "cf_list.h"
+#include "cf_error.h"
+
+#include <stdio.h>
+
+int
+CF_Stack_CreateCtx (CF_Stack_Ctx * ctx)
+{
+	return CF_List_CreateCtx ((CF_List_Ctx *) ctx);
+}
+
+int
+CF_Stack_DestroyCtx (CF_Stack_Ctx ctx)
+{
+	return CF_List_DestroyCtx (ctx);
+}
+
+int
+CF_Stack_Push (CF_Stack_Ctx	ctx,
+			   const void	* element)
+{
+	int				result = 0;
+	CF_List_Ctx		list = (CF_List_Ctx) ctx;
+	CF_Traverser	traverser = NULL;
+
+	result = CF_List_Front (list, &traverser);
+	if (result < 0)
+		return result;
+
+	return CF_List_Insert (list, traverser, CF_DIRECTION_BEFORE, element);
+}
+
+int
+CF_Stack_Pop (CF_Stack_Ctx	ctx,
+			  void			** element)
+{
+	int			result = 0;
+	CF_List_Ctx	list = (CF_List_Ctx) ctx;
+	CF_Traverser	traverser = NULL;
+
+	result = CF_Stack_Top (ctx, element);
+	if (result < 0)
+		return result;
+
+	result = CF_List_Front (list, &traverser);
+	if (result < 0)
+		return result;
+
+	return CF_List_Remove (ctx, &traverser);
+}
+
+int
+CF_Stack_Top (CF_Stack_Ctx 	ctx,
+			  void			** element)
+{
+	int				result = 0;
+	CF_List_Ctx		list = (CF_List_Ctx) ctx;
+	CF_Traverser	traverser = NULL;
+
+	result = CF_List_Front (list, &traverser);
+	if (result < 0)
+		return result;
+
+	return CF_List_GetElement (traverser, element);
+}
+
+int
+CF_Stack_GetSize (CF_Stack_Ctx ctx)
+{
+	return CF_List_GetSize ((CF_List_Ctx) ctx);
+}
Index: /trunk/src/cf_thread.c
===================================================================
--- /trunk/src/cf_thread.c	(revision 108)
+++ /trunk/src/cf_thread.c	(revision 109)
@@ -65,7 +65,7 @@
  */
 int
-CF_Thread_Create (CF_Thread				* threadID,
-				  CF_Thread_Function	callback,
-				  void					* arg)
+CF_Thread_CreateCtx (CF_Thread_Ctx		* threadID,
+					 CF_Thread_Function	callback,
+					 void				* arg)
 {
 	int result = 0;
@@ -106,10 +106,10 @@
 	*threadID = (THREAD_TYPE *) calloc (sizeof (THREAD_TYPE), 1);
 	if (*threadID == NULL)
-		return CF_ERROR_THREAD_ALLOC;
+		return CF_ERROR_THREAD_CREATE_CTX;
 
 	result = pthread_create ((THREAD_TYPE *) *threadID, attr, f, arg);
 	if (result)
 	{
-		CF_Thread_Release (threadID);
+		CF_Thread_DestroyCtx (threadID);
 		return CF_ERROR_THREAD_CREATE;
 	}
@@ -129,5 +129,5 @@
  */
 int
-CF_Thread_Release (CF_Thread * threadID)
+CF_Thread_DestroyCtx (CF_Thread_Ctx * threadID)
 {
 	ASSERT_THREAD (*threadID);
@@ -144,5 +144,5 @@
  */
 int
-CF_Thread_Join (CF_Thread * threadID)
+CF_Thread_Join (CF_Thread_Ctx * threadID)
 {
 	ASSERT_THREAD (*threadID);
@@ -168,5 +168,5 @@
  */
 int
-CF_Mutex_Create (CF_Mutex * mutex)
+CF_Mutex_CreateCtx (CF_Mutex_Ctx * mutex)
 {
 	int result = 0;
@@ -197,5 +197,5 @@
  */
 int
-CF_Mutex_Destory (CF_Mutex * mutex)
+CF_Mutex_DestoryCtx (CF_Mutex_Ctx * mutex)
 {
 	ASSERT_MUTEX (*mutex);
@@ -216,5 +216,5 @@
  */
 int
-CF_Mutex_Lock (CF_Mutex * mutex)
+CF_Mutex_Lock (CF_Mutex_Ctx * mutex)
 {
 	ASSERT_MUTEX (*mutex);
@@ -237,5 +237,5 @@
  */
 int
-CF_Mutex_Unlock (CF_Mutex * mutex)
+CF_Mutex_Unlock (CF_Mutex_Ctx * mutex)
 {
 	ASSERT_MUTEX (*mutex);
Index: /trunk/src/makefile
===================================================================
--- /trunk/src/makefile	(revision 108)
+++ /trunk/src/makefile	(revision 109)
@@ -15,4 +15,7 @@
 					cf_log			\
 					cf_codec		\
+					cf_list			\
+					cf_queue		\
+					cf_stack		\
 
 TARGET_NAME		= cf
Index: /trunk/test/list.c
===================================================================
--- /trunk/test/list.c	(revision 109)
+++ /trunk/test/list.c	(revision 109)
@@ -0,0 +1,60 @@
+/**
+ * @file	list.c
+ * @author	myusgun <myusgun@gmail.com>
+ */
+#include "cf_list.h"
+#include "cf_debug.h"
+
+int main (void)
+{
+	long long int	iter = 0;
+	int				result = 0;
+	int				element = 0;
+	CF_List_Ctx		ctx = NULL;
+	CF_Traverser	trav = NULL;
+
+	result = CF_List_CreateCtx (&ctx);
+	if (result < 0)
+		CF_DEBUG_PRINT (stderr, "error %d\n", result);
+
+	for (iter = 0 ; iter < 10 ; iter++)
+	{
+		result = CF_List_Insert (ctx, trav, CF_DIRECTION_BEFORE, (void *)iter);
+		if (result < 0)
+			CF_DEBUG_PRINT (stderr, "error %d\n", result);
+	}
+
+	result = CF_List_Front (ctx, &trav);
+	if (result < 0)
+		CF_DEBUG_PRINT (stderr, "error %d\n", result);
+
+	for (iter = 0 ; iter < 5 ; iter++)
+	{
+		result = CF_List_Next (&trav);
+		if (result < 0)
+			CF_DEBUG_PRINT (stderr, "error %d\n", result);
+	}
+
+	result = CF_List_Insert (ctx, trav, CF_DIRECTION_BEFORE, (void *)100);
+	if (result < 0)
+		CF_DEBUG_PRINT (stderr, "error %d\n", result);
+
+	result = CF_List_Insert (ctx, trav, CF_DIRECTION_AFTER, (void *)200);
+	if (result < 0)
+		CF_DEBUG_PRINT (stderr, "error %d\n", result);
+
+	for (CF_List_Front (ctx, &trav) ; trav != NULL ; CF_List_Next (&trav))
+	{
+		result = CF_List_GetElement (trav, (void **)&element);
+		if (result < 0)
+			CF_DEBUG_PRINT (stderr, "error %d\n", result);
+
+		CF_DEBUG_PRINT (stderr, "%d \n", element);
+	}
+
+	result = CF_List_DestroyCtx (ctx);
+	if (result < 0)
+		CF_DEBUG_PRINT (stderr, "error %d\n", result);
+
+	return 0;
+}
Index: /trunk/test/log.c
===================================================================
--- /trunk/test/log.c	(revision 108)
+++ /trunk/test/log.c	(revision 109)
@@ -9,5 +9,5 @@
 #include <stdio.h>
 
-CF_Mutex globalMutex;
+CF_Mutex_Ctx globalMutex;
 
 #define LOG_MT		1
@@ -41,7 +41,7 @@
 int main (void)
 {
-	int			i, j;
-	char		idname[16] = {0x00,};
-	CF_Thread	tid[10];
+	int				i, j;
+	char			idname[16] = {0x00,};
+	CF_Thread_Ctx	tid[10];
 
 	/* initialize */
@@ -79,5 +79,5 @@
 		CF_DEBUG_PRINT (stderr, "set multi-threading mode error\n");
 
-	if (CF_Mutex_Create (&globalMutex) < 0) {
+	if (CF_Mutex_CreateCtx (&globalMutex) < 0) {
 		// error
 	}
@@ -85,5 +85,5 @@
 	for (i = 0 ; i < 10 ; i++)
 	{
-		if (CF_Thread_Create (&tid[i], test_log_mt, &i) < 0)
+		if (CF_Thread_CreateCtx (&tid[i], test_log_mt, &i) < 0)
 		{
 			CF_DEBUG_PRINT (stderr, "failed to create %dth thread\n", i);
@@ -96,9 +96,9 @@
 		if (CF_Thread_Join (&tid[i]) < 0)
 			CF_DEBUG_PRINT (stderr, "failed to join %dth thread\n", i);
-		if (CF_Thread_Release (&tid[i]) < 0)
+		if (CF_Thread_DestroyCtx (&tid[i]) < 0)
 			CF_DEBUG_PRINT (stderr, "failed to release %dth thread\n", i);
 	}
 
-	if (CF_Mutex_Destory (&globalMutex) < 0) {
+	if (CF_Mutex_DestoryCtx (&globalMutex) < 0) {
 		// error
 	}
Index: /trunk/test/socket.c
===================================================================
--- /trunk/test/socket.c	(revision 108)
+++ /trunk/test/socket.c	(revision 109)
@@ -39,5 +39,5 @@
 		CF_DEBUG_PRINT (stderr, "[SERVER] recv {%s}\n", buf);
 
-		if (CF_Socket_Send (clntsock, buf, recvd) < 0)
+		if (CF_Socket_Send (clntsock, buf, (size_t)recvd) < 0)
 		{
 			return -3;
@@ -100,6 +100,6 @@
 int main ()
 {
-	CF_Thread stid[THREAD_POOL];
-	CF_Thread ctid[THREAD_POOL];
+	CF_Thread_Ctx stid[THREAD_POOL];
+	CF_Thread_Ctx ctid[THREAD_POOL];
 
 	int sock = 0;
@@ -135,5 +135,5 @@
 	for (iter = 0 ; iter < THREAD_POOL ; iter++)
 	{
-		if (CF_Thread_Create (&stid[iter], socket_echo_server, &sock) < 0)
+		if (CF_Thread_CreateCtx (&stid[iter], socket_echo_server, &sock) < 0)
 		{
 			CF_DEBUG_PRINT (stderr, "failed to create %dth thread\n", iter);
@@ -145,5 +145,5 @@
 	for (iter = 0 ; iter < THREAD_POOL ; iter++)
 	{
-		if (CF_Thread_Create (&ctid[iter], socket_echo_client, &sock) < 0)
+		if (CF_Thread_CreateCtx (&ctid[iter], socket_echo_client, &sock) < 0)
 		{
 			CF_DEBUG_PRINT (stderr, "failed to create %dth thread\n", iter);
@@ -156,8 +156,8 @@
 	{
 		CF_Thread_Join (&ctid[iter]);
-		CF_Thread_Release (&ctid[iter]);
+		CF_Thread_DestroyCtx (&ctid[iter]);
 
 		CF_Thread_Join (&stid[iter]);
-		CF_Thread_Release (&stid[iter]);
+		CF_Thread_DestroyCtx (&stid[iter]);
 
 		CF_Log_Write (LOG_SOCKET, "SOCKET", "join server thread-%d\n", iter);
Index: /trunk/test/thread.c
===================================================================
--- /trunk/test/thread.c	(revision 108)
+++ /trunk/test/thread.c	(revision 109)
@@ -7,5 +7,5 @@
 #include <stdio.h>
 
-CF_Mutex globalMutex;
+CF_Mutex_Ctx globalMutex;
 
 int worker (void * arg) {
@@ -24,13 +24,13 @@
 
 int main (void) {
-	CF_Thread tid[10];
+	CF_Thread_Ctx tid[10];
 	int i = 0;
 
-	if (CF_Mutex_Create (&globalMutex) < 0) {
+	if (CF_Mutex_CreateCtx (&globalMutex) < 0) {
 		// error
 	}
 
 	for (i = 0 ; i < 10 ; i++) {
-		if (CF_Thread_Create (&tid[i], worker, NULL) < 0) {
+		if (CF_Thread_CreateCtx (&tid[i], worker, NULL) < 0) {
 			// error
 		}
@@ -44,10 +44,10 @@
 
 	for (i = 0 ; i < 10 ; i++) {
-		if (CF_Thread_Release (&tid[i]) < 0) {
+		if (CF_Thread_DestroyCtx (&tid[i]) < 0) {
 			// error
 		}
 	}
 
-	if (CF_Mutex_Destory (&globalMutex) < 0) {
+	if (CF_Mutex_DestoryCtx (&globalMutex) < 0) {
 		// error
 	}
Index: /trunk/windows/libcf/libcf.vcproj
===================================================================
--- /trunk/windows/libcf/libcf.vcproj	(revision 108)
+++ /trunk/windows/libcf/libcf.vcproj	(revision 109)
@@ -188,4 +188,8 @@
 			</File>
 			<File
+				RelativePath="..\..\src\cf_list.c"
+				>
+			</File>
+			<File
 				RelativePath="..\..\src\cf_local.h"
 				>
@@ -196,5 +200,13 @@
 			</File>
 			<File
+				RelativePath="..\..\src\cf_queue.c"
+				>
+			</File>
+			<File
 				RelativePath="..\..\src\cf_socket.c"
+				>
+			</File>
+			<File
+				RelativePath="..\..\src\cf_stack.c"
 				>
 			</File>
Index: /trunk/windows/test/test.vcproj
===================================================================
--- /trunk/windows/test/test.vcproj	(revision 108)
+++ /trunk/windows/test/test.vcproj	(revision 109)
@@ -186,9 +186,21 @@
 			</File>
 			<File
+				RelativePath="..\..\test\list.c"
+				>
+			</File>
+			<File
 				RelativePath="..\..\test\log.c"
 				>
 			</File>
 			<File
+				RelativePath="..\..\test\queue.c"
+				>
+			</File>
+			<File
 				RelativePath="..\..\test\socket.c"
+				>
+			</File>
+			<File
+				RelativePath="..\..\test\stack.c"
 				>
 			</File>
