[109] | 1 | /**
|
---|
[128] | 2 | * \file cf_stack.c
|
---|
[117] | 3 | *
|
---|
[128] | 4 | * \author myusgun <myusgun@gmail.com>
|
---|
| 5 | *
|
---|
[119] | 6 | * \brief 스택 구현
|
---|
[109] | 7 | */
|
---|
| 8 | #include "cf_stack.h"
|
---|
| 9 | #include "cf_list.h"
|
---|
[151] | 10 | #include "cf_local.h"
|
---|
[109] | 11 | #include "cf_error.h"
|
---|
| 12 |
|
---|
| 13 | #include <stdio.h>
|
---|
| 14 |
|
---|
[151] | 15 | static int
|
---|
| 16 | CF_Stack_Local_Get (cf_ctx ctx,
|
---|
| 17 | void ** element,
|
---|
| 18 | CF_BOOL removeFlag)
|
---|
| 19 | {
|
---|
| 20 | int result = 0;
|
---|
| 21 | cf_ctx list = (cf_ctx) ctx;
|
---|
| 22 | cf_traverser trav = NULL;
|
---|
| 23 |
|
---|
| 24 | result = CF_List_Front (list, &trav);
|
---|
| 25 | if (result < 0)
|
---|
| 26 | return result;
|
---|
| 27 |
|
---|
| 28 | result = CF_List_Get (trav, element);
|
---|
| 29 | if (result < 0)
|
---|
| 30 | return result;
|
---|
| 31 |
|
---|
| 32 | result = (removeFlag == CF_TRUE)
|
---|
| 33 | ? CF_List_Remove (ctx, &trav)
|
---|
| 34 | : CF_OK;
|
---|
| 35 |
|
---|
| 36 | return result;
|
---|
| 37 | }
|
---|
| 38 |
|
---|
[111] | 39 | /**
|
---|
| 40 | * 스택 컨텍스트 생성
|
---|
| 41 | *
|
---|
[119] | 42 | * \return 성공 시, CF_OK; 실패 시, 오류 코드
|
---|
[111] | 43 | *
|
---|
[119] | 44 | * \param ctx 스택 컨텍스트 포인터
|
---|
[111] | 45 | */
|
---|
[109] | 46 | int
|
---|
[151] | 47 | CF_Stack_Create (cf_ctx * ctx)
|
---|
[109] | 48 | {
|
---|
[151] | 49 | return CF_List_Create ((cf_ctx *) ctx);
|
---|
[109] | 50 | }
|
---|
| 51 |
|
---|
[111] | 52 | /**
|
---|
| 53 | * 스택 컨텍스트 해제
|
---|
| 54 | *
|
---|
[119] | 55 | * \return 성공 시, CF_OK; 실패 시, 오류 코드
|
---|
[111] | 56 | *
|
---|
[119] | 57 | * \param ctx 스택 컨텍스트
|
---|
[111] | 58 | */
|
---|
[109] | 59 | int
|
---|
[151] | 60 | CF_Stack_Destroy (cf_ctx ctx)
|
---|
[109] | 61 | {
|
---|
[151] | 62 | return CF_List_Destroy (ctx);
|
---|
[109] | 63 | }
|
---|
| 64 |
|
---|
[111] | 65 | /**
|
---|
| 66 | * 스택에 삽입
|
---|
| 67 | *
|
---|
[119] | 68 | * \return 성공 시, CF_OK; 실패 시, 오류 코드
|
---|
[111] | 69 | *
|
---|
[119] | 70 | * \param ctx 스택 컨텍스트
|
---|
| 71 | * \param element 데이터 주소
|
---|
[111] | 72 | */
|
---|
[109] | 73 | int
|
---|
[151] | 74 | CF_Stack_Push (cf_ctx ctx,
|
---|
[109] | 75 | const void * element)
|
---|
| 76 | {
|
---|
[151] | 77 | cf_ctx list = (cf_ctx) ctx;
|
---|
[109] | 78 |
|
---|
[151] | 79 | return CF_List_AddFront (list, element);
|
---|
[109] | 80 | }
|
---|
| 81 |
|
---|
[111] | 82 | /**
|
---|
| 83 | * 스택에서 꺼내기
|
---|
| 84 | *
|
---|
[119] | 85 | * \return 성공 시, CF_OK; 실패 시, 오류 코드
|
---|
[111] | 86 | *
|
---|
[119] | 87 | * \param ctx 스택 컨텍스트
|
---|
| 88 | * \param element 데이터 주소
|
---|
[111] | 89 | */
|
---|
[109] | 90 | int
|
---|
[151] | 91 | CF_Stack_Pop (cf_ctx ctx,
|
---|
| 92 | void ** element)
|
---|
[109] | 93 | {
|
---|
[151] | 94 | return CF_Stack_Local_Get (ctx, element, CF_TRUE);
|
---|
[109] | 95 | }
|
---|
| 96 |
|
---|
[111] | 97 | /**
|
---|
| 98 | * 스택 최상위의 데이터 조회
|
---|
| 99 | *
|
---|
[119] | 100 | * \return 성공 시, CF_OK; 실패 시, 오류 코드
|
---|
[111] | 101 | *
|
---|
[119] | 102 | * \param ctx 스택 컨텍스트
|
---|
| 103 | * \param element 데이터 주소
|
---|
[111] | 104 | */
|
---|
[109] | 105 | int
|
---|
[151] | 106 | CF_Stack_Top (cf_ctx ctx,
|
---|
| 107 | void ** element)
|
---|
[109] | 108 | {
|
---|
[151] | 109 | return CF_Stack_Local_Get (ctx, element, CF_FALSE);
|
---|
[109] | 110 | }
|
---|
| 111 |
|
---|
[111] | 112 | /**
|
---|
| 113 | * 스택에 등록된 항목의 수를 가져옴
|
---|
| 114 | *
|
---|
[119] | 115 | * \return 성공 시, 항목 수; 실패 시, 오류 코드
|
---|
[111] | 116 | *
|
---|
[119] | 117 | * \param ctx 스택 컨텍스트
|
---|
[111] | 118 | */
|
---|
[109] | 119 | int
|
---|
[151] | 120 | CF_Stack_GetSize (cf_ctx ctx)
|
---|
[109] | 121 | {
|
---|
[151] | 122 | return CF_List_GetSize ((cf_ctx) ctx);
|
---|
[109] | 123 | }
|
---|