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