mvStack.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. /*******************************************************************************
  2. * Copyright 2003, Marvell Semiconductor Israel LTD. *
  3. * THIS CODE CONTAINS CONFIDENTIAL INFORMATION OF MARVELL. *
  4. * NO RIGHTS ARE GRANTED HEREIN UNDER ANY PATENT, MASK WORK RIGHT OR COPYRIGHT *
  5. * OF MARVELL OR ANY THIRD PARTY. MARVELL RESERVES THE RIGHT AT ITS SOLE *
  6. * DISCRETION TO REQUEST THAT THIS CODE BE IMMEDIATELY RETURNED TO MARVELL. *
  7. * THIS CODE IS PROVIDED "AS IS". MARVELL MAKES NO WARRANTIES, EXPRESSED, *
  8. * IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, COMPLETENESS OR PERFORMANCE. *
  9. * *
  10. * MARVELL COMPRISES MARVELL TECHNOLOGY GROUP LTD. (MTGL) AND ITS SUBSIDIARIES, *
  11. * MARVELL INTERNATIONAL LTD. (MIL), MARVELL TECHNOLOGY, INC. (MTI), MARVELL *
  12. * SEMICONDUCTOR, INC. (MSI), MARVELL ASIA PTE LTD. (MAPL), MARVELL JAPAN K.K. *
  13. * (MJKK), MARVELL SEMICONDUCTOR ISRAEL LTD (MSIL). *
  14. ********************************************************************************
  15. * mvStack.h - Header File for :
  16. *
  17. * FILENAME: $Workfile: mvStack.h $
  18. * REVISION: $Revision: 1.1 $
  19. * LAST UPDATE: $Modtime: $
  20. *
  21. * DESCRIPTION:
  22. * This file defines simple Stack (LIFO) functionality.
  23. *
  24. *******************************************************************************/
  25. #ifndef __mvStack_h__
  26. #define __mvStack_h__
  27. /* includes */
  28. #include "mvTypes.h"
  29. /* defines */
  30. /* typedefs */
  31. /* Data structure describes general purpose Stack */
  32. typedef struct
  33. {
  34. int stackIdx;
  35. int numOfElements;
  36. MV_U32* stackElements;
  37. } MV_STACK;
  38. static INLINE MV_BOOL mvStackIsFull(void* stackHndl)
  39. {
  40. MV_STACK* pStack = (MV_STACK*)stackHndl;
  41. if(pStack->stackIdx == pStack->numOfElements)
  42. return MV_TRUE;
  43. return MV_FALSE;
  44. }
  45. static INLINE MV_BOOL mvStackIsEmpty(void* stackHndl)
  46. {
  47. MV_STACK* pStack = (MV_STACK*)stackHndl;
  48. if(pStack->stackIdx == 0)
  49. return MV_TRUE;
  50. return MV_FALSE;
  51. }
  52. /* Purpose: Push new element to stack
  53. * Inputs:
  54. * - void* stackHndl - Stack handle as returned by "mvStackCreate()" function.
  55. * - MV_U32 value - New element.
  56. *
  57. * Return: MV_STATUS MV_FULL - Failure. Stack is full.
  58. * MV_OK - Success. Element is put to stack.
  59. */
  60. static INLINE void mvStackPush(void* stackHndl, MV_U32 value)
  61. {
  62. MV_STACK* pStack = (MV_STACK*)stackHndl;
  63. #ifdef MV_RT_DEBUG
  64. if(pStack->stackIdx == pStack->numOfElements)
  65. {
  66. mvOsPrintf("mvStackPush: Stack is FULL\n");
  67. return;
  68. }
  69. #endif /* MV_RT_DEBUG */
  70. pStack->stackElements[pStack->stackIdx] = value;
  71. pStack->stackIdx++;
  72. }
  73. /* Purpose: Pop element from the top of stack and copy it to "pValue"
  74. * Inputs:
  75. * - void* stackHndl - Stack handle as returned by "mvStackCreate()" function.
  76. * - MV_U32 value - Element in the top of stack.
  77. *
  78. * Return: MV_STATUS MV_EMPTY - Failure. Stack is empty.
  79. * MV_OK - Success. Element is removed from the stack and
  80. * copied to pValue argument
  81. */
  82. static INLINE MV_U32 mvStackPop(void* stackHndl)
  83. {
  84. MV_STACK* pStack = (MV_STACK*)stackHndl;
  85. #ifdef MV_RT_DEBUG
  86. if(pStack->stackIdx == 0)
  87. {
  88. mvOsPrintf("mvStackPop: Stack is EMPTY\n");
  89. return 0;
  90. }
  91. #endif /* MV_RT_DEBUG */
  92. pStack->stackIdx--;
  93. return pStack->stackElements[pStack->stackIdx];
  94. }
  95. static INLINE int mvStackIndex(void* stackHndl)
  96. {
  97. MV_STACK* pStack = (MV_STACK*)stackHndl;
  98. return pStack->stackIdx;
  99. }
  100. static INLINE int mvStackFreeElements(void* stackHndl)
  101. {
  102. MV_STACK* pStack = (MV_STACK*)stackHndl;
  103. return (pStack->numOfElements - pStack->stackIdx);
  104. }
  105. /* mvStack.h API list */
  106. /* Create new Stack */
  107. void* mvStackCreate(int numOfElements);
  108. /* Delete existing stack */
  109. MV_STATUS mvStackDelete(void* stackHndl);
  110. /* Print status of the stack */
  111. void mvStackStatus(void* stackHndl, MV_BOOL isPrintElements);
  112. #endif /* __mvStack_h__ */