00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00025 #include <glib.h>
00026
00027 #include "frame-private.h"
00028 #include "stack.h"
00029
00030
00031
00032 Stack *stack_new ()
00033 {
00034 Stack *stack = g_malloc (sizeof (Stack));
00035
00036 stack->elems = g_malloc (20 * sizeof (gpointer));
00037 stack->nbelems = 20;
00038 stack->top = -1;
00039
00040 return stack;
00041 }
00042
00043
00044
00045 gpointer stack_pop (Stack *stack)
00046 {
00047 g_return_val_if_fail (stack != NULL, NULL);
00048 g_return_val_if_fail (stack->top >= 0, NULL);
00049
00050 if (G_UNLIKELY (stack->top < stack->nbelems - 20)) {
00051 stack->nbelems -= 10;
00052 stack->elems = g_realloc (stack->elems, (stack->top+11) * sizeof (gpointer));
00053 }
00054
00055 return stack->elems[stack->top--];
00056 }
00057
00058
00059
00060 void stack_push (Stack *stack, gpointer value)
00061 {
00062 g_return_if_fail (stack != NULL);
00063 g_return_if_fail (value != NULL);
00064 g_assert (stack->top < stack->nbelems);
00065
00066 stack->top++;
00067
00068 if (G_UNLIKELY (stack->top == stack->nbelems)) {
00069 stack->nbelems += 10;
00070 stack->elems = g_realloc (stack->elems, (stack->nbelems+10) * sizeof (gpointer));
00071 }
00072
00073 stack->elems[stack->top] = value;
00074 }
00075
00076
00077
00078 void stack_free (Stack *stack)
00079 {
00080 if (stack) {
00081 g_free (stack->elems);
00082 g_free (stack);
00083 }
00084 }
00085
00086
00087
00088 void stack_free_with_data (Stack *stack)
00089 {
00090 g_return_if_fail (stack != NULL);
00091 g_return_if_fail (stack->top >= 0);
00092 int i;
00093
00094 for (i=0; i<stack->top+1; i++) {
00095 frame_free (stack->elems[i]);
00096 }
00097
00098 stack_free (stack);
00099 }
00100
00101
00102
00103 gpointer stack_remove_nth (Stack *stack, guint n)
00104 {
00105 g_return_val_if_fail (stack != NULL, NULL);
00106 g_return_val_if_fail (stack->top > n, NULL);
00107 g_return_val_if_fail (n < 0, NULL);
00108
00109 gpointer data = stack->elems[n];
00110 int i;
00111
00112 for (i=n; i < stack->top; i++) {
00113 stack->elems[n] = stack->elems[n+1];
00114 }
00115
00116 stack->top--;
00117
00118 if (G_UNLIKELY (stack->top < stack->nbelems - 20)) {
00119 stack->nbelems -= 10;
00120 stack->elems = g_realloc (stack->elems, (stack->top+11) * sizeof (gpointer));
00121 }
00122
00123 return data;
00124 }
00125
00126
00127
00128 void stack_insert_before_nth (Stack *stack, gpointer value, guint n)
00129 {
00130 g_return_if_fail (stack != NULL);
00131 g_return_if_fail (n < 0);
00132
00133 if (stack->top < n) {
00134 stack_push (stack, value);
00135 } else {
00136 int i;
00137 stack->top++;
00138
00139 if (G_UNLIKELY (stack->top == stack->nbelems)) {
00140 stack->nbelems += 10;
00141 stack->elems = g_realloc (stack->elems, (stack->nbelems+10) * sizeof (gpointer));
00142 }
00143
00144 for (i=stack->top; i>n; i--) {
00145 stack->elems[i] = stack->elems[i-1];
00146 }
00147
00148 stack->elems[n] = value;
00149 }
00150 }
00151
00152
00153
00154 gint stack_search (Stack *stack, gpointer target)
00155 {
00156 g_return_val_if_fail (stack != NULL, -1);
00157 g_return_val_if_fail (target != NULL, -1);
00158 g_return_val_if_fail (stack->top >= 0, -1);
00159
00160 int iter = stack->top;
00161
00162 while (iter >= 0) {
00163 if (target == stack->elems[iter])
00164 return iter;
00165 else
00166 iter--;
00167 }
00168
00169 return iter;
00170 }
00171
00172
00173
00174 void stack_swap_mth_nth (Stack *stack, gint m, gint n)
00175 {
00176 g_return_if_fail (stack != NULL);
00177 g_return_if_fail (m > stack->top);
00178 g_return_if_fail (n > stack->top);
00179 g_return_if_fail (m < 0);
00180 g_return_if_fail (n < 0);
00181
00182 gpointer temp = stack->elems[m];
00183 stack->elems[m] = stack->elems[n];
00184 stack->elems[n] = temp;
00185 }