/** * @file cf_stack.c * @author myusgun * * @brief 스택 구현 */ #include "cf_stack.h" #include "cf_list.h" #include "cf_error.h" #include /** * 스택 컨텍스트 생성 * * @return 성공 시, CF_OK; 실패 시, 오류 코드 * * @param ctx 스택 컨텍스트 포인터 */ int CF_Stack_CreateCtx (CF_Stack_Ctx * ctx) { return CF_List_CreateCtx ((CF_List_Ctx *) ctx); } /** * 스택 컨텍스트 해제 * * @return 성공 시, CF_OK; 실패 시, 오류 코드 * * @param ctx 스택 컨텍스트 */ int CF_Stack_DestroyCtx (CF_Stack_Ctx ctx) { return CF_List_DestroyCtx (ctx); } /** * 스택에 삽입 * * @return 성공 시, CF_OK; 실패 시, 오류 코드 * * @param ctx 스택 컨텍스트 * @param element 데이터 주소 */ 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); } /** * 스택에서 꺼내기 * * @return 성공 시, CF_OK; 실패 시, 오류 코드 * * @param ctx 스택 컨텍스트 * @param 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); } /** * 스택 최상위의 데이터 조회 * * @return 성공 시, CF_OK; 실패 시, 오류 코드 * * @param ctx 스택 컨텍스트 * @param element 데이터 주소 */ 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); } /** * 스택에 등록된 항목의 수를 가져옴 * * @return 성공 시, 항목 수; 실패 시, 오류 코드 * * @param ctx 스택 컨텍스트 */ int CF_Stack_GetSize (CF_Stack_Ctx ctx) { return CF_List_GetSize ((CF_List_Ctx) ctx); }