00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef BaseUCStack_H
00020 #define BaseUCStack_H
00021
00022 class IDataSource;
00023 class ODataSource;
00024
00025
00026 class BaseUCStack
00027 {
00028 protected:
00029 uint8* buf;
00030 uint8* buf_ptr;
00031 uint32 size;
00032 public:
00033
00034 BaseUCStack(uint32 len, uint8 *b) : buf(b), size(len)
00035 {
00036
00037 buf_ptr = buf + size;
00038 }
00039 virtual ~BaseUCStack() { }
00040
00041 inline uint32 getSize() const {
00042 return size;
00043 }
00044
00045 inline uint32 stacksize() const {
00046 return size - (buf_ptr - buf);
00047 }
00048
00049 inline void addSP(const sint32 offset) {
00050 buf_ptr += offset;
00051 }
00052
00053 inline unsigned int getSP() const {
00054 return static_cast<unsigned int>(buf_ptr - buf);
00055 }
00056
00057 inline void setSP(unsigned int pos) {
00058 buf_ptr = buf + pos;
00059 }
00060
00061
00062
00063
00064
00065 inline void push1(uint8 val) {
00066 buf_ptr--;
00067 buf_ptr[0] = val;
00068 }
00069
00070 inline void push2(uint16 val) {
00071 buf_ptr-=2;
00072 buf_ptr[0] = static_cast<uint8>( val & 0xFF);
00073 buf_ptr[1] = static_cast<uint8>((val>>8) & 0xFF);
00074 }
00075 inline void push4(uint32 val) {
00076 buf_ptr-=4;
00077 buf_ptr[0] = static_cast<uint8>( val & 0xFF);
00078 buf_ptr[1] = static_cast<uint8>((val>>8) & 0xFF);
00079 buf_ptr[2] = static_cast<uint8>((val>>16) & 0xFF);
00080 buf_ptr[3] = static_cast<uint8>((val>>24) & 0xFF);
00081 }
00082
00083 inline void push0(const uint32 size) {
00084 buf_ptr -= size;
00085 std::memset (buf_ptr, 0, size);
00086 }
00087
00088 inline void push(const uint8 *in, const uint32 size) {
00089 buf_ptr -= size;
00090 std::memcpy (buf_ptr, in, size);
00091 }
00092
00093
00094
00095
00096
00097 inline uint16 pop2() {
00098 uint8 b0, b1;
00099 b0 = *buf_ptr++;
00100 b1 = *buf_ptr++;
00101 return (b0 | (b1 << 8));
00102 }
00103 inline uint32 pop4() {
00104 uint8 b0, b1, b2, b3;
00105 b0 = *buf_ptr++;
00106 b1 = *buf_ptr++;
00107 b2 = *buf_ptr++;
00108 b3 = *buf_ptr++;
00109 return (b0 | (b1<<8) | (b2<<16) | (b3<<24));
00110 }
00111 inline void pop(uint8 *out, const uint32 size) {
00112 std::memcpy(out, buf_ptr, size);
00113 buf_ptr += size;
00114 }
00115
00116
00117
00118
00119
00120 inline uint8 access1(const uint32 offset) const {
00121 return buf[offset];
00122 }
00123 inline uint16 access2(const uint32 offset) const {
00124 return (buf[offset] | (buf[offset+1] << 8));
00125 }
00126 inline uint32 access4(const uint32 offset) const {
00127 return buf[offset] | (buf[offset+1]<<8) |
00128 (buf[offset+2]<<16) | (buf[offset+3]<<24);
00129 }
00130 inline uint8* access(const uint32 offset) {
00131 return buf+offset;
00132 }
00133 inline uint8* access() {
00134 return buf_ptr;
00135 }
00136
00137
00138
00139
00140
00141 inline void assign1(const uint32 offset, const uint8 val) {
00142 const_cast<uint8*>(buf)[offset] = static_cast<uint8>( val & 0xFF);
00143 }
00144 inline void assign2(const uint32 offset, const uint16 val) {
00145 const_cast<uint8*>(buf)[offset] = static_cast<uint8>( val & 0xFF);
00146 const_cast<uint8*>(buf)[offset+1] = static_cast<uint8>((val>>8) & 0xFF);
00147 }
00148 inline void assign4(const uint32 offset, const uint32 val) {
00149 const_cast<uint8*>(buf)[offset] = static_cast<uint8>( val & 0xFF);
00150 const_cast<uint8*>(buf)[offset+1] = static_cast<uint8>((val>>8) & 0xFF);
00151 const_cast<uint8*>(buf)[offset+2] = static_cast<uint8>((val>>16) & 0xFF);
00152 const_cast<uint8*>(buf)[offset+3] = static_cast<uint8>((val>>24) & 0xFF);
00153 }
00154 inline void assign(const uint32 offset, const uint8 *in, const uint32 len)
00155 {
00156 std::memcpy (const_cast<uint8*>(buf)+offset, in, len);
00157 }
00158 };
00159
00160 class DynamicUCStack : public BaseUCStack
00161 {
00162 public:
00163 DynamicUCStack(uint32 len=0x1000) : BaseUCStack(len, new uint8[len]) { }
00164 virtual ~DynamicUCStack() { delete [] buf; }
00165
00166 #ifdef USE_DYNAMIC_UCSTACK
00167 #define UCStack DynamicUCStack
00168 void save(ODataSource* ods);
00169 bool load(IDataSource* ids, uint32 version);
00170 #endif
00171 };
00172
00173 #ifndef USE_DYNAMIC_UCSTACK
00174 class UCStack : public BaseUCStack
00175 {
00176 uint8 buf_array[0x1000];
00177 public:
00178 UCStack() : BaseUCStack(0x1000, buf_array) { }
00179 virtual ~UCStack() { }
00180
00181 void save(ODataSource* ods);
00182 bool load(IDataSource* ids, uint32 version);
00183 };
00184 #endif
00185
00186 #endif