Index: trunk/src/cf_file.c
===================================================================
--- trunk/src/cf_file.c	(revision 128)
+++ trunk/src/cf_file.c	(revision 151)
@@ -11,4 +11,5 @@
 
 #include <stdio.h>
+#include <string.h>
 #include <fcntl.h>
 #include <errno.h>
@@ -51,7 +52,18 @@
 #define FILE_MODE		S_IWUSR|S_IRUSR|S_IRGRP|S_IROTH
 
+#define ASSERT_CTX(__ctx)	\
+	if (__ctx == NULL)		\
+		return CF_ERROR_FILE_INVALID_CTX
+
 #define ASSERT_ARGS(x)	\
 	if ((x))			\
 		return CF_ERROR_FILE_INVALID_ARGS
+
+typedef struct __cf_file_ctx__
+{
+	int				fd;
+	char			path[1024];
+	CF_FILE_FLAG	flag;
+} CF_FILE_CONTEXT;
 
 static int
@@ -73,6 +85,7 @@
  * 파일 열기
  *
- * \return 성공 시, 파일 디스크립터; 실패 시, 오류 코드
- *
+ * \return 성공 시, CF_OK; 실패 시, 오류 코드
+ *
+ * \param ctx	파일 컨텍스트
  * \param path	파일 경로
  * \param flag	파일 열기 플래그
@@ -81,17 +94,44 @@
  */
 int
-CF_File_Open (const char			* path,
+CF_File_Open (cf_ctx				* ctx,
+			  const char			* path,
 			  const CF_FILE_FLAG	flag)
 {
+	int fd = 0;
 	int result = 0;
 	int osflag = 0;
 
+	CF_FILE_CONTEXT * context = NULL;
+
+	ASSERT_CTX (ctx);
 	ASSERT_ARGS (path == NULL);
 
-	osflag = CF_File_Local_ConvertFlag (flag) | O_BINARY;
-
-	result = open (path, osflag, FILE_MODE);
-	if (result < 0)
-		return CF_ERROR_FILE_OPEN;
+	TRY
+	{
+		context = NEWCTX (CF_FILE_CONTEXT);
+		if (context == NULL)
+		{
+			result = CF_ERROR_FILE_CREATE_CTX;
+			TRY_BREAK;
+		}
+		context->flag = flag;
+		context->fd = -1;
+
+		osflag = CF_File_Local_ConvertFlag (flag) | O_BINARY;
+
+		fd = open (path, osflag, FILE_MODE);
+		if (fd < 0)
+		{
+			result = CF_ERROR_FILE_OPEN;
+			TRY_BREAK;
+		}
+		context->fd = fd;
+
+		*ctx = context;
+	}
+	CATCH_IF (result < 0)
+	{
+		CF_File_Close ((cf_ctx) context);
+	}
 
 	return result;
@@ -99,38 +139,24 @@
 
 /**
- * 파일 생성
- *
- * \return 성공 시, 파일 디스크립터; 실패 시, 오류 코드
- *
- * \param path 파일 경로
- */
-int
-CF_File_Create (const char * path)
-{
-	int			result = 0;
-	const int	flag = CF_FILE_CREATE|CF_FILE_WRITE|CF_FILE_TRUNC;
-	
-	ASSERT_ARGS (path == NULL);
-
-	result = CF_File_Open (path, flag);
-	if (result < 0)
-		return CF_ERROR_FILE_CREATE;
-
-	return result;
-}
-
-/**
  * 파일 닫기
  *
  * \return 성공 시, CF_OK; 실패 시, 오류 코드
  *
- * \param fd 파일 디스크립터
- */
-int
-CF_File_Close (const int fd)
-{
-	int result = 0;
-
-	ASSERT_ARGS (fd < 0);
+ * \param ctx	파일 컨텍스트
+ */
+int
+CF_File_Close (cf_ctx ctx)
+{
+	int result = 0;
+	int fd = 0;
+
+	CF_FILE_CONTEXT * context = (CF_FILE_CONTEXT *) ctx;
+
+	ASSERT_CTX (context);
+	ASSERT_ARGS (context->fd < 0);
+
+	fd = context->fd;
+
+	free (context);
 
 	result = close (fd);
@@ -146,19 +172,22 @@
  * \return 성공 시, 읽은 바이트 수; 실패 시, 오류 코드
  *
- * \param fd	파일 디스크립터
+ * \param ctx	파일 컨텍스트
  * \param buf	데이터를 저장할 메모리
  * \param len	데이터를 저장할 메모리의 크기
  */
 int
-CF_File_Read (const int		fd,
+CF_File_Read (const cf_ctx	ctx,
 			  void			* buf,
 			  const size_t	len)
 {
 	int result = 0;
-	
-	ASSERT_ARGS (fd < 0);
+
+	CF_FILE_CONTEXT * context = (CF_FILE_CONTEXT *) ctx;
+
+	ASSERT_CTX (context);
+	ASSERT_ARGS (context->fd < 0);
 	ASSERT_ARGS (buf == NULL);
 
-	result = (int) read (fd, buf, len);
+	result = (int) read (context->fd, buf, len);
 	if (result < 0)
 		return CF_ERROR_FILE_READ;
@@ -172,19 +201,22 @@
  * \return 성공 시, CF_OK; 실패 시, 오류 코드
  *
- * \param fd	파일 디스크립터
+ * \param ctx	파일 컨텍스트
  * \param buf	데이터가 저장된 메모리
  * \param len	쓸 데이터의 길이
  */
 int
-CF_File_Write (const int	fd,
+CF_File_Write (const cf_ctx	ctx,
 			   const void	* buf, 
 			   const size_t	len)
 {
 	int result = 0;
-	
-	ASSERT_ARGS (fd < 0);
+
+	CF_FILE_CONTEXT * context = (CF_FILE_CONTEXT *) ctx;
+
+	ASSERT_CTX (context);
+	ASSERT_ARGS (context->fd < 0);
 	ASSERT_ARGS (buf == NULL);
 
-	result = (int) write (fd, buf, len);
+	result = (int) write (context->fd, buf, len);
 	if (result != len)
 	  return CF_ERROR_FILE_WRITE;
@@ -206,7 +238,9 @@
 	int fd = 0;
 
+	CF_FILE_CONTEXT * context = NULL;
+
 	ASSERT_ARGS (path == NULL);
 
-	fd = CF_File_Open (path, CF_FILE_READ);
+	fd = CF_File_Open ((cf_ctx *)&context, path, CF_FILE_READ);
 	if (fd < 0)
 		return CF_ERROR_FILE_OPEN;
@@ -216,5 +250,5 @@
 		return CF_ERROR_FILE_GET_SIZE;
 
-	CF_File_Close (fd);
+	CF_File_Close ((cf_ctx)context);
 
 	return length;
@@ -245,13 +279,22 @@
 {
 	int		result = 0;
-	char	fullPath[1024] = {0x00,};
+	size_t	length = 0;
+	char	* fullpath = NULL;
 	char	stepPath[256] = {0x00,};
 
-	char	* f = fullPath;
-	char	* d = stepPath;
+	char	* f = NULL;
+	char	* d = NULL;
 
 	ASSERT_ARGS (path == NULL);
 
-	snprintf (fullPath, sizeof (fullPath) - 1, "%s%c", path, DELIMITER);
+	length = strlen (path);
+	fullpath = (char *) calloc (length + 2, 1);
+	if (!fullpath)
+		return CF_ERROR_FILE_ALLOCATE_BUFFER;
+
+	f = fullpath;
+	d = stepPath;
+
+	snprintf (fullpath, length + 1, "%s%c", path, DELIMITER);
 
 	for (*d++ = *f++ ; *f ; *d++ = *f++)
@@ -270,2 +313,24 @@
 	return CF_OK;
 }
+
+/**
+ * 컨텍스트가 열고 있는 파일의 경로를 가져옴
+ *
+ * \return 성공 시, CF_OK; 실패 시, 오류 코드
+ *
+ * \param ctx	파일 컨텍스트
+ * \param path	파일 경로를 저장할 충분한 공간의 메모리
+ */
+int
+CF_File_GetPath (const cf_ctx	ctx,
+				 char			* path)
+{
+	CF_FILE_CONTEXT * context = (CF_FILE_CONTEXT *) ctx;
+
+	ASSERT_CTX (context);
+	ASSERT_ARGS (path == NULL);
+
+	snprintf (path, sizeof (context->path), "%s", context->path);
+
+	return CF_OK;
+}
