Index: trunk/src/cf_list.c
===================================================================
--- trunk/src/cf_list.c	(revision 149)
+++ trunk/src/cf_list.c	(revision 151)
@@ -24,5 +24,5 @@
 		return CF_ERROR_DS_INVALID_ARGS
 
-/** 리스트 노드 (CF_Traverser의 구현) */
+/** 리스트 노드 (cf_traverser의 구현) */
 typedef struct __cf_node__
 {
@@ -32,5 +32,5 @@
 } CF_NODE;
 
-/** 리스트 컨텍스트 (CF_List_Ctx의 구현) */
+/** 리스트 컨텍스트 (cf_ctx의 구현) */
 typedef struct __cf_list__
 {
@@ -48,15 +48,15 @@
  */
 int
-CF_List_CreateCtx (CF_List_Ctx * ctx)
+CF_List_Create (cf_ctx * ctx)
 {
 	CF_LIST_CONTEXT * context = NULL;
 
-	ASSERT_ARGS (ctx == NULL);
-
-	context = (CF_LIST_CONTEXT *) calloc (sizeof (CF_LIST_CONTEXT), 1);
+	ASSERT_CTX (ctx);
+
+	context = NEWCTX (CF_LIST_CONTEXT);
 	if (context == NULL)
 		return CF_ERROR_DS_CREATE_CTX;
 
-	*ctx = (CF_List_Ctx) context;
+	*ctx = (cf_ctx) context;
 
 	return CF_OK;
@@ -71,5 +71,5 @@
  */
 int
-CF_List_DestroyCtx (CF_List_Ctx ctx)
+CF_List_Destroy (cf_ctx ctx)
 {
 	CF_LIST_CONTEXT * context = (CF_LIST_CONTEXT *) ctx;
@@ -85,5 +85,5 @@
 
 /**
- * 리스트 탐색자(Traverser)를 Front 위치로 설정
+ * 리스트 탐색자(traverser)를 Front 위치로 설정
  *
  * \return 성공 시, CF_OK; 실패 시, 오류 코드
@@ -93,6 +93,6 @@
  */
 int
-CF_List_Front (CF_List_Ctx	ctx,
-			   CF_Traverser	* traverser)
+CF_List_Front (cf_ctx		ctx,
+			   cf_traverser	* traverser)
 {
 	CF_LIST_CONTEXT * context = (CF_LIST_CONTEXT *) ctx;
@@ -101,11 +101,11 @@
 	ASSERT_TRAVERSER (traverser);
 
-	*traverser = (CF_Traverser *) context->front;
-
-	return CF_OK;
-}
-
-/**
- * 리스트 탐색자(Traverser)를 Rear 위치로 설정
+	*traverser = (cf_traverser *) context->front;
+
+	return CF_OK;
+}
+
+/**
+ * 리스트 탐색자(traverser)를 Rear 위치로 설정
  *
  * \return 성공 시, CF_OK; 실패 시, 오류 코드
@@ -115,6 +115,6 @@
  */
 int
-CF_List_Rear (CF_List_Ctx	ctx,
-			  CF_Traverser	* traverser)
+CF_List_Rear (cf_ctx		ctx,
+			  cf_traverser	* traverser)
 {
 	CF_LIST_CONTEXT * context = (CF_LIST_CONTEXT *) ctx;
@@ -123,11 +123,59 @@
 	ASSERT_TRAVERSER (traverser);
 
-	*traverser = (CF_Traverser *) context->rear;
-
-	return CF_OK;
-}
-
-/**
- * 리스트에 새 데이터 삽입
+	*traverser = (cf_traverser *) context->rear;
+
+	return CF_OK;
+}
+
+/**
+ * 리스트 처음에 새 데이터 삽입
+ *
+ * \return 성공 시, CF_OK; 실패 시, 오류 코드
+ *
+ * \param ctx		리스트 컨텍스트
+ * \param element	삽입할 데이터 주소
+ */
+int
+CF_List_AddFront (cf_ctx		ctx,
+				  const void	* element)
+{
+	int				result = 0;
+	cf_traverser	trav = NULL;
+
+	ASSERT_CTX (ctx);
+
+	result = CF_List_Front (ctx, &trav);
+	if (result < 0)
+		return result;
+
+	return CF_List_InsertBefore (ctx, trav, element);
+}
+
+/**
+ * 리스트 끝에 새 데이터 삽입
+ *
+ * \return 성공 시, CF_OK; 실패 시, 오류 코드
+ *
+ * \param ctx		리스트 컨텍스트
+ * \param element	삽입할 데이터 주소
+ */
+int
+CF_List_AddRear (cf_ctx		ctx,
+				 const void	* element)
+{
+	int				result = 0;
+	cf_traverser	trav = NULL;
+
+	ASSERT_CTX (ctx);
+
+	result = CF_List_Rear (ctx, &trav);
+	if (result < 0)
+		return result;
+
+	return CF_List_InsertAfter (ctx, trav, element);
+}
+
+/**
+ * 리스트 탐색자(traverser)의 앞에 새 데이터 삽입
  *
  * \return 성공 시, CF_OK; 실패 시, 오류 코드
@@ -135,25 +183,18 @@
  * \param ctx		리스트 컨텍스트
  * \param traverser	리스트 탐색자
- * \param direction	탐색자의 전/후를 지정
  * \param element	삽입할 데이터 주소
- *
- * \remarks
- * traverser가 NULL일 때,
- * direction이 CF_DIRECTION_BEFORE라면 Front 위치이고
- * direction이 CF_DIRECTION_AFTER라면 Rear 위치에 삽입
- */
-int
-CF_List_Insert (CF_List_Ctx			ctx,
-				const CF_Traverser	traverser,
-				const CF_DIRECTION	direction,
-				const void			* element)
+ */
+int
+CF_List_InsertBefore (cf_ctx				ctx,
+					  const cf_traverser	traverser,
+					  const void			* element)
 {
 	CF_LIST_CONTEXT	* context = (CF_LIST_CONTEXT *) ctx;
-	CF_NODE		* node = NULL;
-	CF_NODE		* newnode = NULL;
-
-	ASSERT_CTX (ctx);
-
-	newnode = (CF_NODE *) calloc (sizeof (CF_NODE), 1);
+	CF_NODE			* node = NULL;
+	CF_NODE			* newnode = NULL;
+
+	ASSERT_CTX (ctx);
+
+	newnode = NEWCTX (CF_NODE);
 	if (newnode == NULL)
 		return CF_ERROR_DS_CREATE_NODE;
@@ -169,36 +210,71 @@
 		}
 
-		if (direction == CF_DIRECTION_BEFORE)
+		node = traverser ? (CF_NODE *) traverser : context->front;
+
+		newnode->next = node;
+		if (node)
 		{
-			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;
+			newnode->prev = node->prev;
+			node->prev  = newnode;
+			if (newnode->prev)
+				newnode->prev->next = newnode;
 		}
-		else /* if (direction == CF_DIRECTION_AFTER) */
+
+		if (node == context->front)
+			context->front = newnode;
+	} NO_CATCH;
+
+	context->size++;
+
+	return CF_OK;
+}
+
+/**
+ * 리스트 탐색자(traverser)의 뒤에 새 데이터 삽입
+ *
+ * \return 성공 시, CF_OK; 실패 시, 오류 코드
+ *
+ * \param ctx		리스트 컨텍스트
+ * \param traverser	리스트 탐색자
+ * \param element	삽입할 데이터 주소
+ */
+int
+CF_List_InsertAfter (cf_ctx				ctx,
+					 const cf_traverser	traverser,
+					 const void			* element)
+{
+	CF_LIST_CONTEXT	* context = (CF_LIST_CONTEXT *) ctx;
+	CF_NODE			* node = NULL;
+	CF_NODE			* newnode = NULL;
+
+	ASSERT_CTX (ctx);
+
+	newnode = NEWCTX (CF_NODE);
+	if (newnode == NULL)
+		return CF_ERROR_DS_CREATE_NODE;
+
+	newnode->element = (void *) element;
+
+	TRY
+	{
+		if (CF_List_GetSize (ctx) == 0)
 		{
-			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;
+			context->front = context->rear = newnode;
+			TRY_BREAK;
 		}
+
+		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;
 
@@ -209,4 +285,47 @@
 
 /**
+ * 리스트 탐색자(traverser)의 자리에 새 데이터 삽입
+ *
+ * \return 성공 시, CF_OK; 실패 시, 오류 코드
+ *
+ * \param traverser	리스트 탐색자
+ * \param element	할당할 데이터 주소
+ */
+int
+CF_List_Set (const cf_traverser	traverser,
+			 const void			* element)
+{
+	CF_NODE * node = (CF_NODE *) traverser;
+
+	ASSERT_TRAVERSER (traverser);
+
+	node->element = (void *) element;
+
+	return CF_OK;
+}
+
+/**
+ * 탐색자 위치의 데이터를 가져옴
+ *
+ * \return 성공 시, CF_OK; 실패 시, 오류 코드
+ *
+ * \param traverser 리스트 탐색자
+ * \param element	데이터 주소
+ */
+int
+CF_List_Get (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;
+}
+
+/**
  * 리스트에서 탐색자 위치의 항목을 삭제
  *
@@ -217,6 +336,6 @@
  */
 int
-CF_List_Remove (CF_List_Ctx		ctx,
-				CF_Traverser	* traverser)
+CF_List_Remove (cf_ctx			ctx,
+				cf_traverser	* traverser)
 {
 	CF_LIST_CONTEXT	* context = (CF_LIST_CONTEXT *) ctx;
@@ -263,7 +382,7 @@
  */
 int
-CF_List_RemoveAll (CF_List_Ctx ctx)
-{
-	CF_Traverser traverser = NULL;
+CF_List_RemoveAll (cf_ctx ctx)
+{
+	cf_traverser traverser = NULL;
 
 	ASSERT_CTX (ctx);
@@ -279,26 +398,4 @@
 
 /**
- * 탐색자 위치의 데이터를 가져옴
- *
- * \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;
-}
-
-/**
  * 탐색자 위치를 이전으로 이동
  *
@@ -308,5 +405,5 @@
  */
 int
-CF_List_Prev (CF_Traverser * traverser)
+CF_List_Prev (cf_traverser * traverser)
 {
 	CF_NODE * node = (CF_NODE *) *traverser;
@@ -316,5 +413,5 @@
 
 	node = node->prev;
-	*traverser = (CF_Traverser *) node;
+	*traverser = (cf_traverser *) node;
 	if (node == NULL)
 		return CF_ERROR_DS_NO_MORE;
@@ -331,5 +428,5 @@
  */
 int
-CF_List_Next (CF_Traverser * traverser)
+CF_List_Next (cf_traverser * traverser)
 {
 	CF_NODE * node = (CF_NODE *) *traverser;
@@ -339,5 +436,5 @@
 
 	node = node->next;
-	*traverser = (CF_Traverser *) node;
+	*traverser = (cf_traverser *) node;
 	if (node == NULL)
 		return CF_ERROR_DS_NO_MORE;
@@ -354,5 +451,5 @@
  */
 int
-CF_List_GetSize (CF_List_Ctx ctx)
+CF_List_GetSize (cf_ctx ctx)
 {
 	CF_LIST_CONTEXT * context = (CF_LIST_CONTEXT *) ctx;
