00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "global.h"
00026 #ifdef HAVE_HDRSTOP
00027 #pragma hdrstop
00028 #endif
00029
00030 #include "byteinfo.h"
00031
00032 ByteInfo& ByteInfos::operator[](vma_t address)
00033 {
00034 TInfos::const_iterator i = map.find(address/unsigned(PageSize));
00035 if ( i != map.end() )
00036 return (*(*i).second)[address%unsigned(PageSize)];
00037
00038 map[address/unsigned(PageSize)] = freddy77::hp_auto_ptr<TPage>(new TPage());
00039 return (*map[address/unsigned(PageSize)])[address%unsigned(PageSize)];
00040 }
00041
00042 ByteInfo ByteInfos::emptyInfo;
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054 const ByteInfo& ByteInfos::operator[](vma_t address) const
00055 {
00056 TInfos::const_iterator i = map.find(address/unsigned(PageSize));
00057 if ( i != map.end() )
00058 return (*(*i).second)[address%unsigned(PageSize)];
00059
00060
00061 return emptyInfo;
00062 }
00063
00064 uchar ByteInfos::GetIstrLen(vma_t address) const
00065 {
00066 TInfos::const_iterator i = map.find(address/unsigned(PageSize));
00067 if ( i == map.end() ) return 0;
00068 return (*(*i).second)[address%unsigned(PageSize)].len;
00069 }
00070
00071 void ByteInfos::SetLen(vma_t address,unsigned len)
00072 {
00073 while(len>32)
00074 {
00075 ByteInfo &info = (*this)[address];
00076 info.len = 32;
00077 info.SetContinue();
00078 len -= 32;
00079 address += 32;
00080 }
00081 ByteInfo &info = (*this)[address];
00082 info.len = (uchar)len;
00083 }
00084
00085 unsigned ByteInfos::GetLen(vma_t address) const
00086 {
00087 unsigned len;
00088 const ByteInfo *info = &((*this)[address]);
00089 len = info->len;
00090 while(info->Continue())
00091 {
00092 info = &((*this)[address+len]);
00093 len += info->len;
00094 }
00095 return len;
00096 }
00097
00098
00099 bool ByteInfos::IsOccupied(vma_t address) const
00100 {
00101
00102 const int maxIstrSize = 32;
00103 TInfos::const_iterator i = map.find(address/unsigned(PageSize));
00104 unsigned partial = address%unsigned(PageSize);
00105
00106
00107 if (partial>=(maxIstrSize-1))
00108 {
00109 if ( i == map.end())
00110 return false;
00111 TPage &page = *(*i).second;
00112 for(int n=0;n<maxIstrSize;++n,--partial)
00113 if (page[partial].len > n)
00114 return true;
00115 return false;
00116 }
00117
00118
00119 for(int n=0;n<maxIstrSize;++n)
00120 if (GetIstrLen(address-n) > n)
00121 return true;
00122 return false;
00123 }
00124
00125 bool ByteInfos::IsOccupied(vma_t address,int bytes) const
00126 {
00127 _PRG_ASSERT(bytes>0);
00128
00129 const int maxIstrSize = 32u;
00130 address += --bytes;
00131 TInfos::const_iterator i = map.find(address/unsigned(PageSize));
00132 unsigned int partial = address%unsigned(PageSize);
00133
00134
00135 if (partial>=(unsigned int)(maxIstrSize-1+bytes))
00136 {
00137 if ( i == map.end())
00138 return false;
00139 TPage &page = *(*i).second;
00140 int n = -bytes;
00141 for(;n<0;++n,--partial)
00142 if (page[partial].len > 0)
00143 return true;
00144 for(;n<maxIstrSize;++n,--partial)
00145 if (page[partial].len > n)
00146 return true;
00147 return false;
00148 }
00149
00150
00151 int n = -bytes;
00152 address -= bytes;
00153 for(;n<0;++n)
00154 if (GetIstrLen(address-n) > 0)
00155 return true;
00156 for(;n<maxIstrSize;++n)
00157 if (GetIstrLen(address-n) > n)
00158 return true;
00159 return false;
00160 }
00161