Home | History | Annotate | Download | only in utils
      1 /*
      2  * stack.c
      3  *
      4  * Copyright(c) 1998 - 2009 Texas Instruments. All rights reserved.
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  *
     11  *  * Redistributions of source code must retain the above copyright
     12  *    notice, this list of conditions and the following disclaimer.
     13  *  * Redistributions in binary form must reproduce the above copyright
     14  *    notice, this list of conditions and the following disclaimer in
     15  *    the documentation and/or other materials provided with the
     16  *    distribution.
     17  *  * Neither the name Texas Instruments nor the names of its
     18  *    contributors may be used to endorse or promote products derived
     19  *    from this software without specific prior written permission.
     20  *
     21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     24  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     25  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     26  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     27  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     28  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     29  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     30  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     31  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     32  */
     33 
     34 /** \file stack.c
     35  *  \brief Seport module API
     36  *
     37  *  \see stack.h
     38  */
     39 
     40 /***************************************************************************/
     41 /*                                                                         */
     42 /*    MODULE:   stack.c                                                    */
     43 /*    PURPOSE:  Stack module implementation                                */
     44 /*                                                                         */
     45 /***************************************************************************/
     46 
     47 
     48 #define __FILE_ID__  FILE_ID_133
     49 #include "tidef.h"
     50 #include "osApi.h"
     51 #include "stack.h"
     52 
     53 
     54 /**
     55  * \date 30-May-2006\n
     56  * \brief initialize stack object
     57  *
     58  * Function Scope \e Public.\n
     59  * \param pStack    - pointer to the Stack_t structure\n
     60  * \param hOS       - handle to the OS object\n
     61  * \param uElemSize - size of a one stack element\n
     62  * \param uDep      - stack depth\n
     63  * \param pBuf      - pointer to the stack buffer; if NULL a memory for the stack buffer will be dynamically allocated\n
     64  * \param fCpy      - pointer to function copying the stack element; if NULL a default copy function will be used\n
     65  * \return 0 - on success, -1 - on failure\n
     66  */
     67 unsigned stackInit
     68 (
     69     Stack_t   *pStack,
     70     TI_HANDLE  hOs,
     71     unsigned   uElemSize,
     72     unsigned   uDep,
     73     void      *pBuf,
     74     void     (*fCpy) (TI_HANDLE, void*, void*, unsigned)
     75 )
     76 {
     77     pStack->hOs       = hOs;
     78     pStack->uPtr      = 0;
     79     pStack->uElemSize = uElemSize;
     80     pStack->uDep      = uDep * uElemSize;
     81 
     82     if (pBuf)
     83     {
     84         pStack->pBuf  = pBuf;
     85         pStack->bBuf  = 0;
     86     }
     87 
     88     else
     89     {
     90         pStack->pBuf  = _os_memoryAlloc (hOs, pStack->uDep);
     91         pStack->bBuf  = TI_TRUE;
     92     }
     93 
     94     if (fCpy)
     95         pStack->fCpy  = fCpy;
     96     else
     97         pStack->fCpy  = os_memoryCopy;
     98 
     99     return 0;
    100 }
    101 
    102 
    103 /**
    104  * \date 30-May-2006\n
    105  * \brief destroy stack object
    106  *
    107  * Function Scope \e Public.\n
    108  * \param pStack    - pointer to the Stack_t structure\n
    109  * \return 0 - on success, -1 - on failure\n
    110  */
    111 unsigned stackDestroy (Stack_t *pStack)
    112 {
    113     if (pStack->bBuf)
    114         _os_memoryFree (pStack->hOs, pStack->pBuf, pStack->uDep);
    115 
    116     return 0;
    117 }
    118 
    119 
    120 /**
    121  * \date 30-May-2006\n
    122  * \brief destroy stack object
    123  *
    124  * Function Scope \e Public.\n
    125  * \param pStack    - pointer to the Stack_t structure\n
    126  * \param pVal      - the pointer to the pushed value\n
    127  * \return 0 - on success, -1 - on failure\n
    128  */
    129 unsigned stackPush (Stack_t *pStack, void *pVal)
    130 {
    131     if (pStack->uPtr < pStack->uDep)
    132     {
    133         pStack->fCpy (pStack->hOs, (unsigned char*)pStack->pBuf + pStack->uPtr, pVal, pStack->uElemSize);
    134         pStack->uPtr += pStack->uElemSize;
    135 
    136         return 0;
    137     }
    138 
    139     return -1;
    140 }
    141 
    142 
    143 /**
    144  * \date 30-May-2006\n
    145  * \brief destroy stack object
    146  *
    147  * Function Scope \e Public.\n
    148  * \param pStack    - pointer to the Stack_t structure\n
    149  * \param pVal      - the pointer to the popped value\n
    150  * \return 0 - on success, -1 - on failure\n
    151  */
    152 unsigned stackPop (Stack_t *pStack, void *pVal)
    153 {
    154     if (pStack->uPtr > 0)
    155     {
    156         pStack->uPtr -= pStack->uElemSize;
    157         pStack->fCpy (pStack->hOs, pVal, (unsigned char*)pStack->pBuf + pStack->uPtr, pStack->uElemSize);
    158 
    159         return 0;
    160     }
    161 
    162     return -1;
    163 }
    164