00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "src/common/shared.hpp"
00019 #include "src/memory/memset.hpp"
00020 #include "src/common/stack.hpp"
00021 #include "src/common/kmalloc.hpp"
00022
00023 const uint32 DEF_ERROR = 0xffffffff;
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00044 void stack_t::nw(char *buffer, uint32 elems)
00045 {
00046
00047 stack = (uint32*) buffer; max_elems = elems;
00048 stack_ptr = 0;
00049 expandable=0;
00050 }
00051
00052 void stack_t::setExpandable() {
00053 expandable=0xbabef00l;
00054 }
00055
00056
00057
00058
00059
00060
00063 void stack_t::inval()
00064 {
00065
00066 stack = NULL; max_elems = 0;
00067 stack_ptr = 0;
00068 }
00069
00072 void stack_t::verify()
00073 {
00074 uint32 *new_buf;
00075
00076 if (stack == NULL) {
00077 if (expandable != 0xbabef00l) {
00078 sysfail("blad");
00079 }
00080 nw(static_cast<char*>(kmalloc(0x1000, "stack buffer")), 0x400);
00081 }
00082
00083 if ( stack_ptr + 1 > max_elems )
00084 {
00085 if (expandable != 0xbabef00l) {
00086 debug_dump_call_trace();
00087 sysfail("blad;");
00088 }
00089
00090 new_buf = (uint32*) kmalloc((max_elems+0x400)*4,"stackbuf");
00091 memmove(new_buf,stack, max_elems*4);
00092
00093 if (!new_buf)
00094 sysfail("krealloc failed");
00095
00096 kfree(stack);
00097 stack = new_buf;
00098 max_elems+=0x400;
00099 }
00100 }
00101
00102
00103 uint32 stack_t::push(uint32 data)
00104 {
00105
00106 verify();
00107
00108
00109 stack[stack_ptr] = data;
00110
00111 return stack_ptr++;
00112 }
00113
00114
00115 uint32 stack_t::pop()
00116 {
00117
00118 stack_ptr --;
00119
00120 return stack[stack_ptr];
00121 }
00122
00123
00124 uint32 stack_t::pop_value(uint32 val)
00125 {
00126 uint32 i, flag = 0;
00127
00128 for (i=0; i<stack_ptr; i++)
00129 if (stack[i] == val)
00130 {flag=1; break;}
00131
00132 if (!flag)
00133 return DEF_ERROR;
00134
00135 memmove(i*4 + (char*)stack,
00136 4 + i*4 + (char*)stack,
00137 (stack_ptr - i - 1)*4);
00138
00139 stack_ptr--;
00140
00141 return i;
00142 }
00143
00144
00145 uint32 stack_t::push_top(uint32 val)
00146 {
00147 verify();
00148
00149 memmove((char*) stack + 4,stack, stack_ptr * 4);
00150
00151 stack[0] = val;
00152 stack_ptr++;
00153
00154 return 0;
00155 }
00156
00157
00158 uint32 stack_t::find(uint32 val)
00159 {
00160 uint32 i, flag = 0;
00161
00162 for (i=0; i<stack_ptr; i++)
00163 if (stack[i] == val)
00164 {flag=1; break;}
00165
00166 if (!flag)
00167 return DEF_ERROR;
00168
00169 return i;
00170 }
00171
00172
00173 uint32 stack_t::lgth()
00174 {
00175
00176 return stack_ptr;
00177 }
00178
00179
00180
00181
00182
00183
00184