Changeset 35 in libcf
- Timestamp:
- 02/05/13 18:18:37 (11 years ago)
- Location:
- trunk
- Files:
-
- 6 added
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/docs/doxyfile
r33 r35 441 441 # function's detailed documentation block. 442 442 443 HIDE_IN_BODY_DOCS = NO443 HIDE_IN_BODY_DOCS = YES 444 444 445 445 # The INTERNAL_DOCS tag determines if documentation … … 679 679 680 680 INPUT = ../include \ 681 #../src681 ../src 682 682 683 683 # This tag can be used to specify the character encoding of the source files … … 740 740 # the \include command). 741 741 742 EXAMPLE_PATH = 742 EXAMPLE_PATH = ../test 743 743 744 744 # If the value of the EXAMPLE_PATH tag contains directories, you can use the -
trunk/include/cf_debug.h
r34 r35 12 12 * (단, 콜스택의 푸시/팝은 컨텍스트를 이용해야만 사용 가능) 13 13 * 14 * @section 샘플코드 15 * @code 16 17 #include "cf_debug.h" 18 19 CF_Debug_Ctx gDebugCtx; 20 21 void callee (void) { 22 CF_Debug_CallStack callstack; 23 24 CF_DEBUG_CALLSTACK_PUSH (gDebugCtx); 25 CF_DEBUG_CALLSTACK_POP (gDebugCtx, &callstack); 26 } 27 28 int main (void) { 29 int fd = 0; 30 gDebugCtx = CF_Debug_CreateCtx (); 31 32 CF_DEBUG_CALLSTACK_PUSH (gDebugCtx); 33 34 CF_DEBUG_TRACE (gDebugCtx, "print trace message with context to stderr\n"); 35 36 fd = CF_File_Create ("debug.txt"); 37 if (fd < 0) { 38 CF_DEBUG_PRINT (stderr, "error ...\n"); 39 // error 40 } 41 CF_Debug_SetOutputFD (gDebugCtx, fd); 42 43 CF_DEBUG_TRACE (gDebugCtx, "print trace message with context to debug.txt\n"); 44 45 CF_DEBUG_CALLSTACK_POP (gDebugCtx, NULL); 46 47 CF_Debug_DestroyCtx (gDebugCtx); 48 49 return 0; 50 } 51 52 * @endcode 14 * @example debug.c 53 15 */ 54 16 #ifndef __CF_DEBUG_H__ … … 186 148 #endif 187 149 188 /**189 * 디버그 컨텍스트를 생성190 *191 * @return 성공 시, CF_Debug_Ctx 형태의 컨텍스트; 실패 시, NULL192 * @see CF_DEBUG_CREATE_CTX193 */194 150 CF_EXPORT CF_Debug_Ctx 195 151 CF_Debug_CreateCtx (void); 196 152 197 /**198 * 디버그 컨텍스트를 해제199 *200 * @return 성공 시, CF_OK; 실패 시, 오류 코드201 *202 * @param ctx 디버그 컨텍스트203 *204 * @see CF_DEBUG_DESTROY_CTX205 */206 153 CF_EXPORT int 207 154 CF_Debug_DestroyCtx (CF_Debug_Ctx ctx); 208 155 209 /**210 * 디버그 컨텍스트에 출력할 파일 디스크립터를 설정211 *212 * @return 성공 시, CF_OK; 실패 시, 오류 코드213 *214 * @param ctx 디버그 컨텍스트215 * @param fd 파일 디스크립터216 *217 * @see CF_File_Open, CF_File_Create218 */219 156 CF_EXPORT int 220 157 CF_Debug_SetOutputFD (CF_Debug_Ctx ctx, 221 158 int fd); 222 159 223 /**224 * 디버그 메시지를 지정된 파일 포인터로 출력225 *226 * @return 성공 시, CF_OK; 실패 시, 오류 코드227 *228 * @param fp 파일 포인터. 표준출력(stdout) 및 표준오류(stderr) 사용 가능229 * @param file 파일 경로230 * @param func 함수 이름231 * @param line 라인 넘버232 * @param fmt 포맷 스트링233 * @param ... 가변 인자234 *235 * @see CF_DEBUG_PRINT236 */237 160 CF_EXPORT int 238 161 CF_Debug_Print (FILE * fp, … … 242 165 const char * fmt, ...); 243 166 244 /**245 * 바이너리 데이터를 디버그 메시지와 함께 지정된 파일 포인터로 출력246 *247 * @return CF_OK 반환248 *249 * @param fp 파일 포인터. 표준출력(stdout) 및 표준오류(stderr) 사용 가능250 * @param file 파일 경로251 * @param func 함수 이름252 * @param line 라인 넘버253 * @param bin 라인 넘버254 * @param len 바이너리 길이255 * @param fmt 포맷 스트링256 * @param ... 가변 인자257 *258 * @see CF_DEBUG_PRINT_BIN259 */260 167 CF_EXPORT int 261 168 CF_Debug_PrintBin (FILE * fp, … … 267 174 const char * fmt, ...); 268 175 269 /**270 * 컨텍스트를 업데이트하고 디버그 메시지를 출력271 *272 * @return CF_OK 반환273 *274 * @param ctx 디버그 컨텍스트275 * @param file 파일 경로276 * @param func 함수 이름277 * @param line 라인 넘버278 * @param fmt 포맷 스트링279 * @param ... 가변 인자280 *281 * @see CF_DEBUG_UPDATE_CTX, CF_Debug_Trace282 */283 176 CF_EXPORT int 284 177 CF_Debug_Trace (CF_Debug_Ctx ctx, … … 288 181 const char * fmt, ...); 289 182 290 /**291 * 컨텍스트를 업데이트하고 바이너리 데이터를 디버그 메시지와 함께 출력292 *293 * @return 성공 시, CF_OK; 실패 시, 오류 코드294 *295 * @param ctx 디버그 컨텍스트296 * @param file 파일 경로297 * @param func 함수 이름298 * @param line 라인 넘버299 * @param bin 바이너리 데이터300 * @param len 바이너리 길이301 * @param fmt 포맷 스트링302 * @param ... 가변 인자303 *304 * @see CF_DEBUG_UPDATE_CTX, CF_DEBUG_TRACE_BIN305 */306 183 CF_EXPORT int 307 184 CF_Debug_TraceBin (CF_Debug_Ctx ctx, … … 313 190 const char * fmt, ...); 314 191 315 /**316 * 컨텍스트에 콜스택 푸시317 *318 * @return 성공 시, CF_OK; 실패 시, 오류 코드319 *320 * @param ctx 디버그 컨텍스트321 * @param file 파일 경로322 * @param func 함수 이름323 * @param line 라인 넘버324 *325 * @see CF_DEBUG_CALLSTACK_PUSH326 */327 192 CF_EXPORT int 328 193 CF_Debug_CallStackPush (CF_Debug_Ctx ctx, … … 331 196 const int line); 332 197 333 /**334 * 컨텍스트에서 콜스택 팝335 *336 * @return 성공 시, CF_OK; 실패 시, 오류 코드337 *338 * @param ctx 디버그 컨텍스트339 * @param callstack 콜스택 정보를 가져올 콜스택 데이터 구조체 포인터340 *341 * @see CF_Debug_CallStackPop, CF_Debug_CallStack342 */343 198 CF_EXPORT int 344 199 CF_Debug_CallStackPop (CF_Debug_Ctx ctx, -
trunk/include/cf_file.h
r34 r35 4 4 * @version 0.1 5 5 * 6 * @section 샘플코드 7 * @code 8 9 #include "cf_file.h" 10 11 int main (void) { 12 int fd = 0; 13 char *name = "file.txt"; 14 char buffer[128] = {0x00,}; 15 16 fd = CF_File_Create (name); 17 if (fd < 0) { 18 // error 19 } 20 if (CF_File_Write (fd, "file test", 9) < 0) { 21 // error 22 } 23 CF_File_Close (fd); 24 25 fd = CF_File_Open (name, CF_FILE_RO); 26 if (fd < 0) { 27 // error 28 } 29 printf ("file size : %d\n", CF_File_GetSize (fd)); 30 if (CF_File_Read (fd, buffer, sizeof (buffer)) < 0) { 31 // error 32 } 33 CF_File_Close (fd); 34 35 return 0; 36 } 37 38 * @endcode 6 * @example file.c 39 7 */ 40 8 #ifndef __CF_FILE_H__ … … 66 34 #endif 67 35 68 /**69 * 파일 열기70 *71 * @return 성공 시, 파일 디스크립터; 실패 시, 오류 코드72 *73 * @param path 파일 경로74 * @param flag 파일 열기 플래그75 *76 * @see CF_FILE_FLAG77 */78 36 CF_EXPORT int 79 37 CF_File_Open (const char * path, 80 38 const CF_FILE_FLAG flag); 81 39 82 /** 83 * 파일 닫기 84 * 85 * @return 성공 시, CF_OK; 실패 시, 오류 코드 86 * 87 * @param fd 파일 디스크립터 88 */ 40 CF_EXPORT int 41 CF_File_Create (const char * path); 42 89 43 CF_EXPORT int 90 44 CF_File_Close (const int fd); 91 45 92 /**93 * 파일 생성94 *95 * @return 성공 시, 파일 디스크립터; 실패 시, 오류 코드96 *97 * @param path 파일 경로98 */99 CF_EXPORT int100 CF_File_Create (const char * path);101 102 /**103 * 파일 읽기104 *105 * @return 성공 시, 읽은 바이트 수; 실패 시, 오류 코드106 *107 * @param fd 파일 디스크립터108 * @param buf 데이터를 저장할 메모리109 * @param len 데이터를 저장할 메모리의 크기110 */111 46 CF_EXPORT int 112 47 CF_File_Read (const int fd, … … 114 49 const size_t len); 115 50 116 /**117 * 파일 쓰기118 *119 * @return 성공 시, CF_OK; 실패 시, 오류 코드120 *121 * @param fd 파일 디스크립터122 * @param buf 데이터가 저장된 메모리123 * @param len 쓸 데이터의 길이124 */125 51 CF_EXPORT int 126 52 CF_File_Write (const int fd, … … 128 54 const size_t len); 129 55 130 /**131 * 파일 크기 얻기132 *133 * @return 성공 시, 파일 크기; 실패 시, 오류 코드134 *135 * @param fd 파일 디스크립터136 */137 56 CF_EXPORT int 138 57 CF_File_GetSize (const int fd); -
trunk/include/cf_log.h
r34 r35 4 4 * @version 0.1 5 5 * 6 * @section 샘플코드 7 * @code 8 9 #include "cf_log.h" 10 11 CF_Log_Ctx gLogCtx; 12 13 void main (const char * message) 14 { 15 int i, j; 16 char logname[16] = {0x00,}; 17 18 CF_DEBUG_CALLSTACK_PUSH (gDebugCtx); 19 20 CF_Log_Initialize (10); 21 22 // with context 23 gLogCtx = CF_Log_CreateCtx (file, CF_LOG_BUFFER_DEFAULT); 24 if (gLogCtx == NULL) 25 CF_DEBUG_PRINT (stderr, "create log ctx error\n"); 26 27 for (i = 0 ; i < 10000 ; i++) 28 CF_Log_Write (gLogCtx, "LOG_TEST", "turn %d\n", i); 29 30 CF_DEBUG_CALLSTACK_POP (gDebugCtx, &gDebugCallstack); 31 32 CF_Log_Write (gLogCtx, message, 33 "here is the end of function [file:%s line:%d func:%s]\n", 34 gDebugCallstack.file, 35 gDebugCallstack.line, 36 gDebugCallstack.function); 37 38 CF_Log_DestroyCtx (gLogCtx); 39 40 // with id number 41 for (i = 0 ; i < 10 ; i++) 42 { 43 sprintf (logname, "logid%d.txt", i); 44 CF_LOG_OPEN (i, logname, CF_LOG_BUFFER_NO); 45 } 46 47 for (i = 0 ; i < 10 ; i++) 48 { 49 for (j = 0 ; j < 10000 ; j++) 50 CF_LOG_WRITE (i, "LOG_ID_TEST", "turn %d\n", j); 51 52 CF_LOG_CLOSE (i); 53 } 54 55 CF_Log_Finalize (); 56 } 57 58 * @endcode 6 * @example log.c 59 7 */ 60 8 #ifndef __CF_LOG_H__ … … 130 78 #endif 131 79 132 /**133 * 로그를 사용하기 위해 초기화134 *135 * @return 성공 시, CF_OK; 실패 시, 오류 코드136 *137 * @param logPool 아이디 넘버 최대 값138 */139 80 CF_EXPORT int 140 81 CF_Log_Initialize (const int logPool); 141 82 142 /**143 * 로그가 모두 사용된 후 자원 해제144 *145 * @return CF_OK 반환146 */147 83 CF_EXPORT int 148 84 CF_Log_Finalize (void); 149 85 150 /**151 * 로그 컨텍스트 생성152 *153 * @return 성공 시, 로그 컨텍스트; 실패 시, NULL154 *155 * @param path 로그 파일 경로156 * @param memsize 로그 버퍼 크기157 *158 * @see CF_LOG_BUFFER_DEFAULT, CF_LOG_BUFFER_NO159 */160 86 CF_EXPORT CF_Log_Ctx 161 87 CF_Log_CreateCtx (const char * path, 162 88 const int memsize); 163 89 164 /**165 * 로그 컨텍스트 해제166 *167 * @return 성공 시, CF_OK; 실패 시, 오류 코드168 *169 * @param ctx 로그 컨텍스트170 */171 90 CF_EXPORT int 172 91 CF_Log_DestroyCtx (CF_Log_Ctx ctx); 173 92 174 /**175 * 로그 컨텍스트에 멀티쓰레드 모드 설정176 *177 * @return 성공 시, CF_OK; 실패 시, 오류 코드178 *179 * @param ctx 로그 컨텍스트180 */181 93 CF_EXPORT int 182 94 CF_Log_SetMultiThread (CF_Log_Ctx ctx); 183 95 184 /**185 * 로그 컨텍스트에 멀티쓰레드 모드 설정 해제186 *187 * @return 성공 시, CF_OK; 실패 시, 오류 코드188 *189 * @param ctx 로그 컨텍스트190 */191 96 CF_EXPORT int 192 97 CF_Log_UnsetMultiThread (CF_Log_Ctx ctx); 193 98 194 /**195 * 로그 컨텍스트에 따라 로그 쓰기196 *197 * @return 성공 시, CF_OK; 실패 시, 오류 코드198 *199 * @param ctx 로그 컨텍스트200 * @param prefix 로그의 프리픽스 문자열201 * @param fmt 포맷 스트링202 * @param ... 가변 인자203 */204 99 CF_EXPORT int 205 100 CF_Log_Write (CF_Log_Ctx ctx, … … 207 102 const char * fmt, ...); 208 103 209 /**210 * 로그 버퍼의 데이터를 즉시 로그 파일에 쓰기211 *212 * @return 성공 시, CF_OK; 실패 시, 오류 코드213 *214 * @param ctx 로그 컨텍스트215 */216 104 CF_EXPORT int 217 105 CF_Log_Flush (CF_Log_Ctx ctx); 218 106 219 /**220 * 로그 컨텍스트에 아이디 넘버 할당<br />221 * 로그 기록 시, 아이디 넘버를 사용하면 해당 로그로 기록할 수 있음222 *223 * @return 성공 시, CF_OK; 실패 시, 오류 코드224 *225 * @param mapid 부여할 아이디 넘버226 * @param ctx 로그 컨텍스트227 *228 * @remark 반드시 먼저 초기화 해야하며, 초기화 시에 주어진 번호보다 작은 아이디 넘버를 사용해야 함229 *230 * @see CF_LOG_OPEN, CF_Log_CreateCtx231 */232 107 CF_EXPORT int 233 108 CF_Log_MapCtxID (const int mapid, 234 109 const CF_Log_Ctx ctx); 235 110 236 /**237 * 아이디 넘버에 해당하는 로그를 닫고 해당하는 컨텍스트를 해제238 *239 * @return 성공 시, CF_OK; 실패 시, 오류 코드240 *241 * @param mapid 로그의 아이디 넘버242 *243 * @remark 아이디 넘버에 해당하는 컨텍스트가 해제되므로 주의244 *245 * @see CF_LOG_CLOSE, CF_Log_DestroyCtx246 */247 111 CF_EXPORT int 248 112 CF_Log_UnmapCtxID (const int mapid); 249 113 250 /**251 * 아이디 넘버에 해당하는 로그 컨텍스트를 얻기252 *253 * @return 성공 시, 로그 컨텍스트; 실패 시, NULL254 *255 * @param mapid 로그의 아이디 넘버256 */257 114 CF_EXPORT CF_Log_Ctx 258 115 CF_Log_GetMappedCtx (const int mapid); -
trunk/include/cf_socket.h
r34 r35 6 6 * @remark TCP 소켓만 지원됨 7 7 * 8 * @section 샘플코드(서버) 9 * @code 10 11 #include "cf_socket.h" 12 13 int main (void) { 14 int srvsock = 0; 15 int clntsock = 0; 16 short port = 12345; 17 int recvd = 0; 18 char buf[1024] = {0x00,}; 19 20 if (CF_Socket_Initialize () < 0) { 21 // error 22 } 23 srvsock = CF_Socket_Server (port, 5); 24 if (srvsock < 0) { 25 // error 26 } 27 clntsock = CF_Socket_Accept (srvsock, NULL); 28 if (clntsock < 0) { 29 // error 30 } 31 if ((recvd = CF_Socket_Recv (clntsock, buf, sizeof (buf))) < 0) { 32 // error 33 } 34 if (CF_Socket_Send (clntsock, buf, recvd) < 0) { 35 // error 36 } 37 CF_Socket_Close (srvsock); 38 CF_Socket_Finalize (); 39 40 return 0; 41 } 42 43 * @endcode 44 * 45 * @section 샘플코드(클라이언트) 46 * @code 47 48 #include "cf_socket.h" 49 50 int main (void) { 51 int sock = 0; 52 int recvd = 0; 53 char buf[1024] = {0x00,}; 54 short port = 12345; 55 56 if (CF_Socket_Initialize () < 0) { 57 // error 58 } 59 sock = CF_Socket_Connect ("localhost", port); 60 if (sock < 0) { 61 // error 62 } 63 if (CF_Socket_Send (sock, buf, sizeof (buf)) < 0) { 64 // error 65 } 66 if ((recvd = CF_Socket_Recv (sock, buf, sizeof (buf))) < 0) { 67 // error 68 } 69 CF_Socket_Close (sock); 70 CF_Socket_Finalize (); 71 72 return 0; 73 } 74 75 * @endcode 8 * @example socket_server.c 9 * @example socket_client.c 76 10 */ 77 11 #ifndef __CF_SOCKET_H__ … … 117 51 #endif 118 52 119 /**120 * 소켓이 초기화 상태 확인121 *122 * @return 초기화 된 경우, CF_TRUE; 그렇지 않은 경우, CF_FALSE123 */124 53 CF_EXPORT CF_BOOL 125 54 CF_Socket_IsInitialized (void); 126 55 127 /**128 * 소켓 초기화129 *130 * @return 성공 시, CF_OK; 실패 시, 오류 코드131 */132 56 CF_EXPORT int 133 57 CF_Socket_Initialize (void); 134 58 135 /**136 * 소켓 해제137 *138 * @return 성공 시, CF_OK; 실패 시, 오류 코드139 */140 59 CF_EXPORT int 141 60 CF_Socket_Finalize (void); 142 61 143 /**144 * 소켓 닫기145 *146 * @return 성공 시, CF_OK; 실패 시, 오류 코드147 *148 * @param sock 소켓149 */150 62 CF_EXPORT int 151 63 CF_Socket_Close (const int sock); 152 64 153 /**154 * 소켓 옵션 설정155 *156 * @return 성공 시 CF_OK; 실패 시, 오류 코드157 *158 * @param sock 소켓159 * @param optname 옵션 이름160 * @param optval 설정할 옵션 값의 메모리161 * @param optlen 설정할 옵션의 길이162 */163 65 CF_EXPORT int 164 66 CF_Socket_SetOption (const int sock, … … 167 69 const size_t optlen); 168 70 169 /**170 * 소켓 옵션 얻기171 *172 * @return 성공 시 CF_OK; 실패 시, 오류 코드173 *174 * @param sock 소켓175 * @param optname 옵션 이름176 * @param optval 옵션 값을 가져올 메모리177 * @param optlen 옵션 길이를 가져올 메모리178 */179 71 CF_EXPORT int 180 72 CF_Socket_GetOption (const int sock, … … 183 75 size_t * optlen); 184 76 185 /**186 * 소켓에 타임아웃 설정187 *188 * @return 성공 시 CF_OK; 실패 시, 오류 코드189 *190 * @param sock 소켓191 * @param timeout 타임아웃(sec)192 */193 77 CF_EXPORT int 194 78 CF_Socket_SetTimeout (const int sock, 195 79 const int timeout); 196 80 197 /**198 * 소켓 연결199 *200 * @return 성공 시, 연결된 소켓; 실패 시, 오류 코드201 *202 * @param ip 연결할 호스트의 주소 (도메인 이름 가능)203 * @param port 연결할 호스트의 포트번호204 */205 81 CF_EXPORT int 206 82 CF_Socket_Connect (const char * ip, 207 83 const unsigned short port); 208 84 209 /**210 * 서버 열기211 *212 * @return 성공 시, 서버 소켓; 실패 시, 오류 코드213 *214 * @param port 서버 포트215 * @param backlog listen 시의 backlog 수216 */217 85 CF_EXPORT int 218 86 CF_Socket_Server (const unsigned short port, 219 87 const int backlog); 220 88 221 /**222 * 소켓 연결223 *224 * @return 성공 시, 연결된 소켓; 실패 시, 오류 코드225 *226 * @param sock 서버 소켓227 * @param address [옵션] 클라이언트 정보를 담을 sockaddr_in 구조체 포인터228 */229 89 CF_EXPORT int 230 90 CF_Socket_Accept (const int sock, 231 91 struct sockaddr_in * address); 232 92 233 /**234 * 데이터 송신235 *236 * @return 성공 시, CF_OK; 실패 시, 오류 코드237 *238 * @param sock 소켓239 * @param buf 송신할 데이터240 * @param len 송신할 데이터의 길이241 */242 93 CF_EXPORT int 243 94 CF_Socket_Send (const int sock, … … 245 96 const int len); 246 97 247 /**248 * 데이터 수신249 *250 * @return 성공 시, 수신한 데이터의 길이; 실패 시, 오류 코드251 *252 * @param sock 소켓253 * @param buf 데이터를 수신할 버퍼254 * @param len 데이터를 수신할 버퍼의 최대 크기255 */256 98 CF_EXPORT int 257 99 CF_Socket_Recv (const int sock, -
trunk/include/cf_thread.h
r34 r35 6 6 * @remark 멀티스레드 및 뮤텍스 지원 7 7 * 8 * @section 샘플코드 9 * @code 10 11 #include "cf_thread.h" 12 13 CF_Mutex globalMutex; 14 15 CF_THREAD_RETURN CF_THREAD_CALL worker (void * arg) { 16 if (CF_Mutex_Create (&globalMutex) < 0) { 17 // error 18 } 19 20 if (CF_Mutex_Lock (&globalMutex) < 0) { // for critical section 21 // error 22 } 23 24 // critical section 25 26 if (CF_Mutex_Unlock (&globalMutex) < 0) { // for critical section 27 // error 28 } 29 30 if (CF_Mutex_Destory (&globalMutex) < 0) { 31 // error 32 } 33 } 34 35 int main (void) { 36 CF_Thread tid; 37 if (CF_Thread_Create (&tid, worker, NULL) < 0) { 38 // error 39 } 40 41 if (CF_Thread_Join (&tid) < 0) { // block 42 // error 43 } 44 45 if (CF_Thread_Release (&tid) < 0) { 46 // error 47 } 48 return 0; 49 } 50 51 * @endcode 8 * @example thread.c 52 9 */ 53 10 #ifndef __CF_THREAD_H__ … … 83 40 #endif 84 41 85 /**86 * 스레드를 생성87 *88 * @return 성공 시, CF_OK; 실패 시, 오류 코드89 *90 * @param threadID 스레드 아이디 주소91 * @param callback 스레드 워커 함수 이름92 * @param arg 스레드 함수로 전달할 인자93 */94 42 CF_EXPORT int 95 43 CF_Thread_Create (CF_Thread * threadID, … … 97 45 void * arg); 98 46 99 /**100 * 스레드 아이디를 해제101 *102 * @return 성공 시, CF_OK; 실패 시, 오류 코드103 *104 * @param threadID 스레드 아이디 주소105 *106 * @remark 스레드 아이디를 해제하는 것이며 워커 스레드가 종료되지 않음107 */108 47 CF_EXPORT int 109 48 CF_Thread_Release (CF_Thread * threadID); 110 49 111 /**112 * 스레드가 종료될 때 까지 대기113 *114 * @return CF_OK 반환115 *116 * @param threadID 스레드 아이디 주소117 */118 50 CF_EXPORT int 119 51 CF_Thread_Join (CF_Thread * threadID); 120 52 121 /**122 * 뮤텍스 생성123 *124 * @return 성공 시, CF_OK; 실패 시, 오류 코드125 *126 * @param mutex 뮤텍스 아이디 주소127 *128 * @see CF_Thread_Create129 */130 53 CF_EXPORT int 131 54 CF_Mutex_Create (CF_Mutex * mutex); 132 55 133 /**134 * 뮤텍스 해제135 *136 * @return 성공 시, CF_OK; 실패 시, 오류 코드137 *138 * @param mutex 뮤텍스 아이디 주소139 */140 56 CF_EXPORT int 141 57 CF_Mutex_Destory (CF_Mutex * mutex); 142 58 143 /**144 * 뮤텍스 잠금145 *146 * @return 성공 시, CF_OK; 실패 시, 오류 코드147 *148 * @param mutex 뮤텍스 아이디 주소149 */150 59 CF_EXPORT int 151 60 CF_Mutex_Lock (CF_Mutex * mutex); 152 61 153 /**154 * 뮤텍스 잠금 해제155 *156 * @return 성공 시, CF_OK; 실패 시, 오류 코드157 *158 * @param mutex 뮤텍스 아이디 주소159 */160 62 CF_EXPORT int 161 63 CF_Mutex_Unlock (CF_Mutex * mutex); -
trunk/src/cf_debug.c
r34 r35 115 115 } 116 116 117 /** 118 * 디버그 컨텍스트를 생성 119 * 120 * @return 성공 시, CF_Debug_Ctx 형태의 컨텍스트; 실패 시, NULL 121 * @see CF_DEBUG_CREATE_CTX 122 */ 117 123 CF_Debug_Ctx 118 124 CF_Debug_CreateCtx (void) … … 125 131 } 126 132 133 /** 134 * 디버그 컨텍스트를 해제 135 * 136 * @return 성공 시, CF_OK; 실패 시, 오류 코드 137 * 138 * @param ctx 디버그 컨텍스트 139 * 140 * @see CF_DEBUG_DESTROY_CTX 141 */ 127 142 int 128 143 CF_Debug_DestroyCtx (CF_Debug_Ctx ctx) … … 148 163 } 149 164 165 /** 166 * 디버그 컨텍스트에 출력할 파일 디스크립터를 설정 167 * 168 * @return 성공 시, CF_OK; 실패 시, 오류 코드 169 * 170 * @param ctx 디버그 컨텍스트 171 * @param fd 파일 디스크립터 172 * 173 * @see CF_File_Open, CF_File_Create 174 */ 150 175 int 151 176 CF_Debug_SetOutputFD (CF_Debug_Ctx ctx, … … 187 212 } 188 213 214 /** 215 * 디버그 메시지를 지정된 파일 포인터로 출력 216 * 217 * @return 성공 시, CF_OK; 실패 시, 오류 코드 218 * 219 * @param fp 파일 포인터. 표준출력(stdout) 및 표준오류(stderr) 사용 가능 220 * @param file 파일 경로 221 * @param func 함수 이름 222 * @param line 라인 넘버 223 * @param fmt 포맷 스트링 224 * @param ... 가변 인자 225 * 226 * @see CF_DEBUG_PRINT 227 */ 189 228 int 190 229 CF_Debug_Print (FILE * fp, … … 203 242 } 204 243 244 /** 245 * 바이너리 데이터를 디버그 메시지와 함께 지정된 파일 포인터로 출력 246 * 247 * @return CF_OK 반환 248 * 249 * @param fp 파일 포인터. 표준출력(stdout) 및 표준오류(stderr) 사용 가능 250 * @param file 파일 경로 251 * @param func 함수 이름 252 * @param line 라인 넘버 253 * @param bin 라인 넘버 254 * @param len 바이너리 길이 255 * @param fmt 포맷 스트링 256 * @param ... 가변 인자 257 * 258 * @see CF_DEBUG_PRINT_BIN 259 */ 205 260 int 206 261 CF_Debug_PrintBin (FILE * fp, … … 223 278 } 224 279 280 /** 281 * 컨텍스트를 업데이트하고 디버그 메시지를 출력 282 * 283 * @return CF_OK 반환 284 * 285 * @param ctx 디버그 컨텍스트 286 * @param file 파일 경로 287 * @param func 함수 이름 288 * @param line 라인 넘버 289 * @param fmt 포맷 스트링 290 * @param ... 가변 인자 291 * 292 * @see CF_DEBUG_UPDATE_CTX, CF_Debug_Trace 293 */ 225 294 int 226 295 CF_Debug_Trace (CF_Debug_Ctx ctx, … … 248 317 } 249 318 319 /** 320 * 컨텍스트를 업데이트하고 바이너리 데이터를 디버그 메시지와 함께 출력 321 * 322 * @return 성공 시, CF_OK; 실패 시, 오류 코드 323 * 324 * @param ctx 디버그 컨텍스트 325 * @param file 파일 경로 326 * @param func 함수 이름 327 * @param line 라인 넘버 328 * @param bin 바이너리 데이터 329 * @param len 바이너리 길이 330 * @param fmt 포맷 스트링 331 * @param ... 가변 인자 332 * 333 * @see CF_DEBUG_UPDATE_CTX, CF_DEBUG_TRACE_BIN 334 */ 250 335 int 251 336 CF_Debug_TraceBin (CF_Debug_Ctx ctx, … … 281 366 } 282 367 368 /** 369 * 컨텍스트에 콜스택 푸시 370 * 371 * @return 성공 시, CF_OK; 실패 시, 오류 코드 372 * 373 * @param ctx 디버그 컨텍스트 374 * @param file 파일 경로 375 * @param func 함수 이름 376 * @param line 라인 넘버 377 * 378 * @see CF_DEBUG_CALLSTACK_PUSH 379 */ 283 380 int 284 381 CF_Debug_CallStackPush (CF_Debug_Ctx ctx, … … 308 405 } 309 406 407 /** 408 * 컨텍스트에서 콜스택 팝 409 * 410 * @return 성공 시, CF_OK; 실패 시, 오류 코드 411 * 412 * @param ctx 디버그 컨텍스트 413 * @param callstack 콜스택 정보를 가져올 콜스택 데이터 구조체 포인터 414 * 415 * @see CF_Debug_CallStackPop, CF_Debug_CallStack 416 */ 310 417 int 311 418 CF_Debug_CallStackPop (CF_Debug_Ctx ctx, -
trunk/src/cf_file.c
r29 r35 27 27 #define FILE_MODE S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH 28 28 29 /** 30 * 파일 열기 31 * 32 * @return 성공 시, 파일 디스크립터; 실패 시, 오류 코드 33 * 34 * @param path 파일 경로 35 * @param flag 파일 열기 플래그 36 * 37 * @see CF_FILE_FLAG 38 */ 29 39 int 30 40 CF_File_Open (const char * path, … … 39 49 } 40 50 51 /** 52 * 파일 생성 53 * 54 * @return 성공 시, 파일 디스크립터; 실패 시, 오류 코드 55 * 56 * @param path 파일 경로 57 */ 41 58 int 42 59 CF_File_Create (const char * path) … … 50 67 } 51 68 69 /** 70 * 파일 닫기 71 * 72 * @return 성공 시, CF_OK; 실패 시, 오류 코드 73 * 74 * @param fd 파일 디스크립터 75 */ 52 76 int 53 77 CF_File_Close (const int fd) … … 66 90 } 67 91 92 /** 93 * 파일 읽기 94 * 95 * @return 성공 시, 읽은 바이트 수; 실패 시, 오류 코드 96 * 97 * @param fd 파일 디스크립터 98 * @param buf 데이터를 저장할 메모리 99 * @param len 데이터를 저장할 메모리의 크기 100 */ 68 101 int 69 102 CF_File_Read (const int fd, … … 79 112 } 80 113 114 /** 115 * 파일 쓰기 116 * 117 * @return 성공 시, CF_OK; 실패 시, 오류 코드 118 * 119 * @param fd 파일 디스크립터 120 * @param buf 데이터가 저장된 메모리 121 * @param len 쓸 데이터의 길이 122 */ 81 123 int 82 124 CF_File_Write (const int fd, … … 92 134 } 93 135 136 /** 137 * 파일 크기 얻기 138 * 139 * @return 성공 시, 파일 크기; 실패 시, 오류 코드 140 * 141 * @param fd 파일 디스크립터 142 */ 94 143 int 95 144 CF_File_GetSize (const int fd) -
trunk/src/cf_log.c
r34 r35 161 161 162 162 static int 163 CF_Log_Local_Push (CF_LOG_CTX * ctx,164 const char * buffer)165 {166 strncat (ctx->buffer + ctx->length,167 buffer,168 ctx->size - ctx->length);169 ctx->length = strlen (ctx->buffer);170 171 return CF_OK;172 }173 174 static int175 163 CF_Log_Local_Flush (CF_LOG_CTX * ctx) 176 164 { … … 184 172 } 185 173 174 /** 175 * 로그 데이터 처리 176 * 177 * @return 성공 시, CF_OK; 실패 시, 오류 코드 178 * 179 * @param ctx 로그 컨텍스트 180 * @param buffer 로그 데이터 181 * @param demandSize 로그 데이터 길이 182 * 183 * @author vfire 184 */ 185 /* static */int 186 CF_Log_Local_Push (CF_LOG_CTX * ctx, 187 const char * buffer, 188 const size_t demandSize) 189 { 190 if( ctx->size > 0 ) /* 버퍼단위 버퍼링.... */ 191 { 192 size_t writeSize; 193 size_t remainSize; 194 195 remainSize = demandSize; 196 while (remainSize) 197 { 198 writeSize = (ctx->size - ctx->length) < remainSize ? (ctx->size - ctx->length) : remainSize; 199 200 memcpy (ctx->buffer + ctx->length, buffer + demandSize - remainSize, writeSize); 201 ctx->length += writeSize; 202 203 if (ctx->length == ctx->size) 204 CF_Log_Local_Flush (ctx); 205 206 remainSize -= writeSize; 207 } 208 } 209 else /* flush되어야 함. */ 210 { 211 if (CF_File_Write (ctx->fd, buffer, demandSize) < 0) 212 return CF_ERROR_LOG_FLUSH; 213 } 214 215 return CF_OK; 216 } 217 218 /** 219 * 로그를 사용하기 위해 초기화 220 * 221 * @return 성공 시, CF_OK; 실패 시, 오류 코드 222 * 223 * @param logPool 아이디 넘버 최대 값 224 */ 186 225 int 187 226 CF_Log_Initialize (const int logPool) … … 201 240 } 202 241 242 /** 243 * 로그가 모두 사용된 후 자원 해제 244 * 245 * @return CF_OK 반환 246 */ 203 247 int 204 248 CF_Log_Finalize (void) … … 219 263 } 220 264 265 /** 266 * 로그 컨텍스트 생성 267 * 268 * @return 성공 시, 로그 컨텍스트; 실패 시, NULL 269 * 270 * @param path 로그 파일 경로 271 * @param memsize 로그 버퍼 크기 272 * 273 * @see CF_LOG_BUFFER_DEFAULT, CF_LOG_BUFFER_NO 274 */ 221 275 CF_Log_Ctx 222 276 CF_Log_CreateCtx (const char * path, … … 269 323 } 270 324 325 /** 326 * 로그 컨텍스트 해제 327 * 328 * @return 성공 시, CF_OK; 실패 시, 오류 코드 329 * 330 * @param ctx 로그 컨텍스트 331 */ 271 332 int 272 333 CF_Log_DestroyCtx (CF_Log_Ctx ctx) … … 300 361 } 301 362 363 /** 364 * 로그 컨텍스트에 멀티쓰레드 모드 설정 365 * 366 * @return 성공 시, CF_OK; 실패 시, 오류 코드 367 * 368 * @param ctx 로그 컨텍스트 369 */ 302 370 int 303 371 CF_Log_SetMultiThread (CF_Log_Ctx ctx) … … 314 382 } 315 383 384 /** 385 * 로그 컨텍스트에 멀티쓰레드 모드 설정 해제 386 * 387 * @return 성공 시, CF_OK; 실패 시, 오류 코드 388 * 389 * @param ctx 로그 컨텍스트 390 */ 316 391 int 317 392 CF_Log_UnsetMultiThread (CF_Log_Ctx ctx) … … 328 403 } 329 404 405 /** 406 * 로그 컨텍스트에 따라 로그 쓰기 407 * 408 * @return 성공 시, CF_OK; 실패 시, 오류 코드 409 * 410 * @param ctx 로그 컨텍스트 411 * @param prefix 로그의 프리픽스 문자열 412 * @param fmt 포맷 스트링 413 * @param ... 가변 인자 414 */ 330 415 int 331 416 CF_Log_Write (CF_Log_Ctx ctx, … … 335 420 CF_LOG_CTX * context = (CF_LOG_CTX *) ctx; 336 421 va_list valist; 337 char buffer[ 4096] = {0x00,};422 char buffer[16 * 1024] = {0x00,}; 338 423 char datetime[CF_LOG_DATETIME_LENGTH + 1] = {0x00,}; 339 size_t length = 0;340 424 341 425 if (CHECK_INVALID_CTX (ctx)) … … 349 433 vsprintf (buffer + strlen (buffer), fmt, valist); 350 434 351 if (context->size == CF_LOG_BUFFER_NO) 352 { 353 context->buffer = buffer; 354 context->length = strlen (buffer); 355 356 CF_Log_Local_Flush (context); 357 358 context->buffer = NULL; 359 /* context->length = 0; // already did this in flush */ 360 } 361 else /* (context->size > 0) */ 362 { 363 length = context->size - context->length; 364 CF_Log_Local_Push (context, buffer); 365 366 if (context->length == context->size) 367 { 368 CF_Log_Local_Flush (context); 369 CF_Log_Local_Push (context, buffer + length); 370 } 371 } 435 CF_Log_Local_Push (context, buffer, strlen (buffer)); 372 436 373 437 va_end (valist); … … 377 441 } 378 442 443 /** 444 * 로그 버퍼의 데이터를 즉시 로그 파일에 쓰기 445 * 446 * @return 성공 시, CF_OK; 실패 시, 오류 코드 447 * 448 * @param ctx 로그 컨텍스트 449 */ 379 450 int 380 451 CF_Log_Flush (CF_Log_Ctx ctx) … … 392 463 } 393 464 465 /** 466 * 로그 컨텍스트에 아이디 넘버 할당<br /> 467 * 로그 기록 시, 아이디 넘버를 사용하면 해당 로그로 기록할 수 있음 468 * 469 * @return 성공 시, CF_OK; 실패 시, 오류 코드 470 * 471 * @param mapid 부여할 아이디 넘버 472 * @param ctx 로그 컨텍스트 473 * 474 * @remark 반드시 먼저 초기화 해야하며, 초기화 시에 주어진 번호보다 작은 아이디 넘버를 사용해야 함 475 * 476 * @see CF_LOG_OPEN, CF_Log_CreateCtx 477 */ 394 478 int 395 479 CF_Log_MapCtxID (const int mapid, … … 427 511 } 428 512 513 /** 514 * 아이디 넘버에 해당하는 로그를 닫고 해당하는 컨텍스트를 해제 515 * 516 * @return 성공 시, CF_OK; 실패 시, 오류 코드 517 * 518 * @param mapid 로그의 아이디 넘버 519 * 520 * @remark 아이디 넘버에 해당하는 컨텍스트가 해제되므로 주의 521 * 522 * @see CF_LOG_CLOSE, CF_Log_DestroyCtx 523 */ 429 524 int 430 525 CF_Log_UnmapCtxID (const int mapid) … … 445 540 } 446 541 542 /** 543 * 아이디 넘버에 해당하는 로그 컨텍스트를 얻기 544 * 545 * @return 성공 시, 로그 컨텍스트; 실패 시, NULL 546 * 547 * @param mapid 로그의 아이디 넘버 548 */ 447 549 CF_Log_Ctx 448 550 CF_Log_GetMappedCtx (const int mapid) -
trunk/src/cf_socket.c
r29 r35 26 26 static CF_BOOL gInitialized = CF_FALSE; 27 27 28 /** 29 * 소켓의 초기화 상태 확인 30 * 31 * @return 초기화 된 경우, CF_TRUE; 그렇지 않은 경우, CF_FALSE 32 */ 28 33 CF_BOOL 29 34 CF_Socket_IsInitialized (void) … … 32 37 } 33 38 39 /** 40 * 소켓 초기화 41 * 42 * @return 성공 시, CF_OK; 실패 시, 오류 코드 43 */ 34 44 int 35 45 CF_Socket_Initialize (void) … … 49 59 } 50 60 61 /** 62 * 소켓 해제 63 * 64 * @return 성공 시, CF_OK; 실패 시, 오류 코드 65 */ 51 66 int 52 67 CF_Socket_Finalize (void) … … 65 80 } 66 81 82 /** 83 * 소켓 닫기 84 * 85 * @return 성공 시, CF_OK; 실패 시, 오류 코드 86 * 87 * @param sock 소켓 88 */ 67 89 int 68 90 CF_Socket_Close (const int sock) … … 80 102 } 81 103 104 /** 105 * 소켓 옵션 설정 106 * 107 * @return 성공 시 CF_OK; 실패 시, 오류 코드 108 * 109 * @param sock 소켓 110 * @param optname 옵션 이름 111 * @param optval 설정할 옵션 값의 메모리 112 * @param optlen 설정할 옵션의 길이 113 */ 82 114 int 83 115 CF_Socket_SetOption (const int sock, … … 105 137 } 106 138 139 /** 140 * 소켓 옵션 얻기 141 * 142 * @return 성공 시 CF_OK; 실패 시, 오류 코드 143 * 144 * @param sock 소켓 145 * @param optname 옵션 이름 146 * @param optval 옵션 값을 가져올 메모리 147 * @param optlen 옵션 길이를 가져올 메모리 148 */ 107 149 int 108 150 CF_Socket_GetOption (const int sock, … … 130 172 } 131 173 174 /** 175 * 소켓에 타임아웃 설정 176 * 177 * @return 성공 시 CF_OK; 실패 시, 오류 코드 178 * 179 * @param sock 소켓 180 * @param timeout 타임아웃(sec) 181 */ 132 182 int 133 183 CF_Socket_SetTimeout (const int sock, … … 160 210 if (result < 0) 161 211 return CF_ERROR_SOCKET_SET_TIMEOUT; 162 /*----------------------------------------------------------------*/ 163 164 return CF_OK; 165 } 166 212 213 return CF_OK; 214 } 215 216 /** 217 * 소켓 연결 218 * 219 * @return 성공 시, 연결된 소켓; 실패 시, 오류 코드 220 * 221 * @param ip 연결할 호스트의 주소 (도메인 이름 가능) 222 * @param port 연결할 호스트의 포트번호 223 */ 167 224 int 168 225 CF_Socket_Connect (const char * ip, … … 215 272 } 216 273 274 /** 275 * 서버 열기 276 * 277 * @return 성공 시, 서버 소켓; 실패 시, 오류 코드 278 * 279 * @param port 서버 포트 280 * @param backlog listen 시의 backlog 수 281 */ 217 282 int 218 283 CF_Socket_Server (const unsigned short port, … … 257 322 } 258 323 324 /** 325 * 소켓 연결 326 * 327 * @return 성공 시, 연결된 소켓; 실패 시, 오류 코드 328 * 329 * @param sock 서버 소켓 330 * @param address [옵션] 클라이언트 정보를 담을 sockaddr_in 구조체 포인터 331 */ 259 332 int 260 333 CF_Socket_Accept (const int sock, … … 277 350 } 278 351 352 /** 353 * 데이터 송신 354 * 355 * @return 성공 시, CF_OK; 실패 시, 오류 코드 356 * 357 * @param sock 소켓 358 * @param buf 송신할 데이터 359 * @param len 송신할 데이터의 길이 360 */ 279 361 int 280 362 CF_Socket_Send (const int sock, … … 293 375 } 294 376 377 /** 378 * 데이터 수신 379 * 380 * @return 성공 시, 수신한 데이터의 길이; 실패 시, 오류 코드 381 * 382 * @param sock 소켓 383 * @param buf 데이터를 수신할 버퍼 384 * @param len 데이터를 수신할 버퍼의 최대 크기 385 */ 295 386 int 296 387 CF_Socket_Recv (const int sock, -
trunk/src/cf_thread.c
r28 r35 40 40 } 41 41 42 /** 43 * 스레드를 생성 44 * 45 * @return 성공 시, CF_OK; 실패 시, 오류 코드 46 * 47 * @param threadID 스레드 아이디 주소 48 * @param callback 스레드 워커 함수 이름 49 * @param arg 스레드 함수로 전달할 인자 50 */ 42 51 int 43 52 CF_Thread_Create (CF_Thread * threadID, … … 64 73 } 65 74 75 /** 76 * 스레드 아이디를 해제 77 * 78 * @return 성공 시, CF_OK; 실패 시, 오류 코드 79 * 80 * @param threadID 스레드 아이디 주소 81 * 82 * @remark 스레드 아이디를 해제하는 것이며 워커 스레드가 종료되지 않음 83 */ 66 84 int 67 85 CF_Thread_Release (CF_Thread * threadID) … … 74 92 } 75 93 94 /** 95 * 스레드가 종료될 때 까지 대기 96 * 97 * @return CF_OK 반환 98 * 99 * @param threadID 스레드 아이디 주소 100 */ 76 101 int 77 102 CF_Thread_Join (CF_Thread * threadID) … … 89 114 } 90 115 116 /** 117 * 뮤텍스 생성 118 * 119 * @return 성공 시, CF_OK; 실패 시, 오류 코드 120 * 121 * @param mutex 뮤텍스 아이디 주소 122 * 123 * @see CF_Thread_Create 124 */ 91 125 int 92 126 CF_Mutex_Create (CF_Mutex * mutex) … … 111 145 } 112 146 147 /** 148 * 뮤텍스 해제 149 * 150 * @return 성공 시, CF_OK; 실패 시, 오류 코드 151 * 152 * @param mutex 뮤텍스 아이디 주소 153 */ 113 154 int 114 155 CF_Mutex_Destory (CF_Mutex * mutex) … … 121 162 } 122 163 164 /** 165 * 뮤텍스 잠금 166 * 167 * @return 성공 시, CF_OK; 실패 시, 오류 코드 168 * 169 * @param mutex 뮤텍스 아이디 주소 170 */ 123 171 int 124 172 CF_Mutex_Lock (CF_Mutex * mutex) … … 135 183 } 136 184 185 /** 186 * 뮤텍스 잠금 해제 187 * 188 * @return 성공 시, CF_OK; 실패 시, 오류 코드 189 * 190 * @param mutex 뮤텍스 아이디 주소 191 */ 137 192 int 138 193 CF_Mutex_Unlock (CF_Mutex * mutex) -
trunk/test/makefile
r19 r35 67 67 # label 68 68 #---------------------------------------------------------- 69 all: $(OBJ_PATH) $(TARGET_PATH) $(LIB_CF)$(TARGET)69 all: dep $(TARGET) 70 70 @echo ========== Complete CHEROXY compilation ========== 71 dep: $(OBJ_PATH) $(TARGET_PATH) $(LIB_CF) 72 71 73 $(TARGET_PATH): dummy 72 74 @if [ ! -d $@ ] ; then mkdir $@ ; fi … … 76 78 cd ../src; make all; 77 79 78 # link 79 $(TARGET_PATH)/%.$(EXT_EXECUTE): $(OBJS) 80 $(LD) $(LDFLAGS) $(LIBS) -o $@ $? 81 82 $(TARGET_PATH)/%.$(EXT_SHARED): $(OBJS) 83 $(LD) $(SHARED_FLAGS) -o $@ $? 84 85 $(TARGET_PATH)/%.$(EXT_STATIC): $(OBJS) 86 $(AR) $(ARFLAGS) -o $@ $? 87 88 # compile 89 $(OBJ_PATH)/%.o: %.$(SOURCE_TYPE) 90 $(CC) $(CFLAGS) $(CDEFS) $(INCLUDES) -o $@ -c $? 80 %: %.c 81 make dep 82 $(LD) $(LDFLAGS) $(LIBS) $(CDEFS) $(CFLAGS) $(INCLUDES) -o $(TARGET_PATH)/$@.$(EXT_EXECUTE) $? 83 LD_LIBRARY_PATH=$(TARGET_PATH) $(TARGET_PATH)/$@.$(EXT_EXECUTE) 91 84 92 85 clean: dummy … … 95 88 96 89 dummy: 97 98 test: all99 LD_LIBRARY_PATH=$(TARGET_PATH) $(TARGET) -
trunk/test/test.c
r27 r35 1 1 /** 2 * test.c 2 * @file test.c 3 * @author myusgun <myusgun@gmail.com> 4 * @version 0.1 3 5 */ 4 6 #include "cf_file.h"
Note:
See TracChangeset
for help on using the changeset viewer.