Main Page | Modules | Data Structures | File List | Data Fields | Globals | Related Pages

stack.h

Go to the documentation of this file.
00001 #ifndef DEF_STACK 00002 #define DEF_STACK 00003 00004 /* ---------------------------------------------------------------------------- 00005 @COPYRIGHT : 00006 Copyright 1993,1994,1995 David MacDonald, 00007 McConnell Brain Imaging Centre, 00008 Montreal Neurological Institute, McGill University. 00009 Permission to use, copy, modify, and distribute this 00010 software and its documentation for any purpose and without 00011 fee is hereby granted, provided that the above copyright 00012 notice appear in all copies. The author and McGill University 00013 make no representations about the suitability of this 00014 software for any purpose. It is provided "as is" without 00015 express or implied warranty. 00016 ---------------------------------------------------------------------------- */ 00017 00018 /* ----------------------------- MNI Header ----------------------------------- 00019 @NAME : stack.h 00020 @INPUT : 00021 @OUTPUT : 00022 @RETURNS : 00023 @DESCRIPTION: A set of macros for manipulating stacks of any type. 00024 @METHOD : 00025 @GLOBALS : 00026 @CALLS : 00027 @CREATED : David MacDonald 00028 @MODIFIED : 00029 ---------------------------------------------------------------------------- */ 00030 00031 00032 #include <volume_io.h> 00033 00034 /* ----------------------------- MNI Header ----------------------------------- 00035 @NAME : STACK_STRUCT 00036 @INPUT : 00037 @OUTPUT : 00038 @RETURNS : 00039 @DESCRIPTION: Defines the type for a stack. 00040 @METHOD : 00041 @GLOBALS : 00042 @CALLS : 00043 @CREATED : David MacDonald 00044 @MODIFIED : 00045 ---------------------------------------------------------------------------- */ 00046 00047 #define STACK_STRUCT( type ) \ 00048 struct \ 00049 { \ 00050 int top; \ 00051 int n_stack_alloced; \ 00052 type *stack; \ 00053 } 00054 00055 /* ----------------------------- MNI Header ----------------------------------- 00056 @NAME : INITIALIZE_STACK 00057 @INPUT : s 00058 @OUTPUT : 00059 @RETURNS : 00060 @DESCRIPTION: Initializes a stack to empty. 00061 @METHOD : 00062 @GLOBALS : 00063 @CALLS : 00064 @CREATED : David MacDonald 00065 @MODIFIED : 00066 ---------------------------------------------------------------------------- */ 00067 00068 #define INITIALIZE_STACK( s ) \ 00069 { \ 00070 (s).top = 0; \ 00071 (s).n_stack_alloced = 0; \ 00072 (s).stack = 0; \ 00073 } 00074 00075 /* ----------------------------- MNI Header ----------------------------------- 00076 @NAME : PUSH_STACK 00077 @INPUT : s 00078 : entry 00079 @OUTPUT : status 00080 @RETURNS : 00081 @DESCRIPTION: Pushes an entry onto the stack. 00082 @METHOD : 00083 @GLOBALS : 00084 @CALLS : 00085 @CREATED : David MacDonald 00086 @MODIFIED : 00087 ---------------------------------------------------------------------------- */ 00088 00089 #define PUSH_STACK( s, entry ) \ 00090 { \ 00091 ADD_ELEMENT_TO_ARRAY_WITH_SIZE( (s).stack, (s).n_stack_alloced, \ 00092 (s).top, entry, DEFAULT_CHUNK_SIZE ) \ 00093 } 00094 00095 /* ----------------------------- MNI Header ----------------------------------- 00096 @NAME : N_ENTRIES_IN_STACK 00097 @INPUT : s 00098 @OUTPUT : 00099 @RETURNS : # entries on stack 00100 @DESCRIPTION: Returns the number of entries on the stack. 00101 @METHOD : 00102 @GLOBALS : 00103 @CALLS : 00104 @CREATED : David MacDonald 00105 @MODIFIED : 00106 ---------------------------------------------------------------------------- */ 00107 00108 #define N_ENTRIES_IN_STACK( s ) ((s).top) 00109 00110 /* ----------------------------- MNI Header ----------------------------------- 00111 @NAME : IS_STACK_EMPTY 00112 @INPUT : s 00113 @OUTPUT : 00114 @RETURNS : TRUE if stack is empty 00115 @DESCRIPTION: 00116 @METHOD : 00117 @GLOBALS : 00118 @CALLS : 00119 @CREATED : David MacDonald 00120 @MODIFIED : 00121 ---------------------------------------------------------------------------- */ 00122 00123 #define IS_STACK_EMPTY( s ) ((s).top <= 0) 00124 00125 /* ----------------------------- MNI Header ----------------------------------- 00126 @NAME : TOP_OF_STACK 00127 @INPUT : s 00128 @OUTPUT : 00129 @RETURNS : The top of stack 00130 @DESCRIPTION: Returns the entry at top of stack without popping it. 00131 @METHOD : 00132 @GLOBALS : 00133 @CALLS : 00134 @CREATED : David MacDonald 00135 @MODIFIED : 00136 ---------------------------------------------------------------------------- */ 00137 00138 #define TOP_OF_STACK( s ) ((s).stack[(s).top-1]) 00139 00140 /* ----------------------------- MNI Header ----------------------------------- 00141 @NAME : POP_STACK 00142 @INPUT : s 00143 @OUTPUT : entry 00144 @RETURNS : 00145 @DESCRIPTION: Pops and returns the entry at top of stack. 00146 @METHOD : 00147 @GLOBALS : 00148 @CALLS : 00149 @CREATED : David MacDonald 00150 @MODIFIED : 00151 ---------------------------------------------------------------------------- */ 00152 00153 #define POP_STACK( s, entry ) \ 00154 { \ 00155 if( !IS_STACK_EMPTY(s) ) \ 00156 { \ 00157 --(s).top; \ 00158 entry = (s).stack[(s).top]; \ 00159 } \ 00160 } 00161 00162 /* ----------------------------- MNI Header ----------------------------------- 00163 @NAME : DELETE_STACK 00164 @INPUT : s 00165 @OUTPUT : status 00166 @RETURNS : 00167 @DESCRIPTION: Deletes the stack. 00168 @METHOD : 00169 @GLOBALS : 00170 @CALLS : 00171 @CREATED : David MacDonald 00172 @MODIFIED : 00173 ---------------------------------------------------------------------------- */ 00174 00175 #define DELETE_STACK( s ) \ 00176 { \ 00177 if( (s).n_stack_alloced > 0 ) \ 00178 { \ 00179 FREE( (s).stack ); \ 00180 } \ 00181 } 00182 00183 00184 #endif

Generated on Wed Jul 28 09:10:58 2004 for BICPL by doxygen 1.3.7