~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Linux Cross Reference
Tina6/tina-tools/tinatool/tlbase/tlbaseInfr_stack.c

Version: ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /**********
  2  * 
  3  * Copyright (c) 2003, Division of Imaging Science and Biomedical Engineering,
  4  * University of Manchester, UK.  All rights reserved.
  5  * 
  6  * Redistribution and use in source and binary forms, with or without modification, 
  7  * are permitted provided that the following conditions are met:
  8  * 
  9  *   . Redistributions of source code must retain the above copyright notice, 
 10  *     this list of conditions and the following disclaimer.
 11  *    
 12  *   . Redistributions in binary form must reproduce the above copyright notice,
 13  *     this list of conditions and the following disclaimer in the documentation 
 14  *     and/or other materials provided with the distribution.
 15  * 
 16  *   . Neither the name of the University of Manchester nor the names of its
 17  *     contributors may be used to endorse or promote products derived from this 
 18  *     software without specific prior written permission.
 19  * 
 20  * 
 21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
 22  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
 23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
 24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
 25  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
 26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
 27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
 31  * POSSIBILITY OF SUCH DAMAGE.
 32  *
 33  **********
 34  * 
 35  * Program :    TINA
 36  * File    :  $Source: /home/tina/cvs/tina-tools/tinatool/tlbase/tlbaseInfr_stack.c,v $
 37  * Date    :  $Date: 2008/12/02 22:04:19 $
 38  * Version :  $Revision: 1.3 $
 39  * CVS Id  :  $Id: tlbaseInfr_stack.c,v 1.3 2008/12/02 22:04:19 paul Exp $
 40  *
 41  * Author  :  Legacy TINA
 42  *
 43  * Notes :
 44  *
 45  *********
 46 */
 47 
 48 #include "tlbaseInfr_stack.h"
 49 
 50 #if HAVE_CONFIG_H
 51 #include <config.h>
 52 #endif
 53 
 54 #if HAVE_STDARG_H
 55 #  include <stdarg.h>
 56 #  define VA_START(a, f)                va_start(a, f)
 57 #else
 58 #  if HAVE_VARARGS_H
 59 #    include <varargs.h>
 60 #    define VA_START(a, f)  va_start(a)
 61 #  endif
 62 #endif /* HAVE_STDARG_H */
 63 #ifndef VA_START
 64   error no variadic api available
 65 #endif
 66 
 67 #include <stdarg.h>
 68 #include <tina/sys/sysDef.h>
 69 #include <tina/sys/sysPro.h>
 70 
 71 static List *stack = NULL;
 72 
 73 List *get_stack_ptr()
 74 {
 75    return( stack );
 76 }
 77 
 78 void put_stack_ptr( List *stack_ptr )
 79 {
 80    stack = stack_ptr;
 81 }
 82 
 83 
 84 void   *stack_pop(int *type)
 85 {
 86     void   *val;
 87 
 88     if (stack == NULL)
 89     {
 90         *type = 0;
 91         return (NULL);
 92     }
 93     *type = ((Pair *) stack->to)->type1;
 94     val = ((Pair *) stack->to)->to1;
 95     stack = link_rm(stack, rfree);
 96 
 97     return (val);
 98 }
 99 
100 void   *stack_inspect(int *type)
101 {
102     if (stack == NULL)
103     {
104         *type = 0;
105         return (NULL);
106     }
107     *type = ((Pair *) stack->to)->type1;
108     return (((Pair *) stack->to)->to1);
109 }
110 
111 
112 Bool  
113 #if HAVE_STDARG_H
114 stack_check_types(int type, ...)
115 #else
116 stack_check_types(va_alist)
117         va_dcl
118 #endif /* HAVE_STDARG_H */
119 {
120     va_list ap;
121     List   *ptr;
122 
123     ptr = stack;
124     VA_START(ap, type);
125     while (type)
126     {
127         if (ptr == NULL || type != ((Pair *) ptr->to)->type1)
128             return (false);
129         ptr = ptr->next;
130         type = va_arg(ap, int);
131     }
132     va_end(ap);
133     return (true);
134 }
135 
136 void    stack_push(void *val, int type, void (*freefunc) ( /* ??? */ ))
137 {
138     Pair   *stack_el;
139 
140     if (val == NULL)
141         return;
142 
143     stack_el = ts_ralloc(Pair);
144     stack_el->to1 = val;
145     stack_el->type1 = type;
146     stack_el->to2 = (void *) freefunc;
147     stack_el->type2 = 0;
148     stack = ref_addtostart(stack, (void *) stack_el, PAIRS);
149 }
150 
151 /* Flip the top 2 elements on the stack */
152 void    stack_flip(void)
153 {
154     List   *temp;
155 
156     if (stack == NULL || stack->next == NULL)
157         return;
158 
159     temp = stack->next;
160     stack->next = stack->next->next;
161     temp->next = stack;
162     stack = temp;
163     stack->next->last = stack;
164     stack->last = NULL;
165 }
166 
167 static void  stack_el_free(Pair * stack_el)
168 {
169     if (stack_el->to1 != NULL && stack_el->to2 != NULL)
170         ((void (*) ()) stack_el->to2) (stack_el->to1);  /* apply saved freefunc */
171     rfree((void *) stack_el);
172 }
173 
174 void    stack_clear(void)
175 {
176     list_rm(stack, (void (*) ()) stack_el_free);
177     stack = NULL;
178 }
179 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.