Fennel: /home/pub/open/dev/fennel/calctest/SqlStringBuffer.cpp Source File (original) (raw)

00001 00002 00003 00004 00005 00006 00007 00008 00009 00010 00011 00012 00013 00014 00015 00016 00017 00018 00019 00020 00021 00022 00023 #include "fennel/common/CommonPreamble.h" 00024 #include "fennel/calctest/SqlStringBuffer.h" 00025 00026 using namespace fennel; 00027 using namespace std; 00028 00029 #if !(defined LITTLEENDIAN || defined BIGENDIAN) 00030 #error "endian not defined" 00031 #endif 00032 00033 const uint SqlStringBuffer::mBumperChar = '@'; 00034 00035 00036 const int SqlStringBuffer::mBumperLen = 3; 00037 00038 SqlStringBuffer:: 00039 SqlStringBuffer( 00040 int storage,
00041 int size,
00042 int leftpad,
00043 int rightpad,
00044 uint text,
00045 uint pad,
00046 int leftBumper, 00047 int rightBumper) 00048 : mStorage(storage), 00049 mSize(size), 00050 mLeftPad(leftpad), 00051 mRightPad(rightpad), 00052 mLeftBump(leftBumper), 00053 mRightBump(rightBumper), 00054 mTotal(storage + leftBumper + rightBumper), 00055 mS(mTotal, mBumperChar) 00056 { 00057 assert(leftBumper > 0); 00058 assert(rightBumper > 0); 00059 assert(storage == size + leftpad + rightpad); 00060 00061 mLeftP = const_cast<char *>(mS.c_str()); 00062 mStr = mLeftP + mLeftBump; 00063 mRightP = mStr + mStorage; 00064 00065 string padS(mStorage, pad); 00066 string textS(size, text); 00067 00068 mS.replace(mLeftBump, mStorage, padS, 0, mStorage); 00069 mS.replace(mLeftBump + mLeftPad, mSize, textS, 0, mSize); 00070 } 00071 00072 00073 bool 00074 SqlStringBuffer::verify() 00075 { 00076 string verS(mTotal, mBumperChar); 00077 if (mS.compare(0, mLeftBump, verS, 0, mLeftBump)) { 00078 return false; 00079 } 00080 if (mS.compare( 00081 mLeftBump + mLeftPad + mSize + mRightPad, 00082 mRightBump, verS, 0, mRightBump)) 00083 { 00084 return false; 00085 } 00086 return true; 00087 } 00088 00089 void 00090 SqlStringBuffer::randomize( 00091 uint start, 00092 uint lower, 00093 uint upper) 00094 { 00095 patternfill(start, lower, upper); 00096 string r(mStr, mSize); 00097 random_shuffle(r.begin(), r.end()); 00098 mS.replace(mLeftBump + mLeftPad, mSize, r); 00099 } 00100 00101 void 00102 SqlStringBuffer::patternfill( 00103 uint start, 00104 uint lower, 00105 uint upper) 00106 { 00107 uint c = start; 00108 int toGen = mSize; 00109 00110 string r; 00111 00112 while (toGen) { 00113 r.push_back(static_cast(c)); 00114 toGen--; 00115 if (++c > upper) { 00116 c = lower; 00117 } 00118 } 00119 mS.replace(mLeftBump + mLeftPad, mSize, r); 00120 } 00121 00122 00123 const uint SqlStringBufferUCS2::mBumperChar = '@'; 00124 00125 00126 const int SqlStringBufferUCS2::mBumperLen = 2; 00127 00128 SqlStringBufferUCS2::SqlStringBufferUCS2(SqlStringBuffer const &src) 00129 : mStorage(src.mStorage *2), 00130 mSize(src.mSize * 2), 00131 mLeftPad(src.mLeftPad * 2), 00132 mRightPad(src.mRightPad * 2), 00133
00134 mLeftBump(src.mLeftBump & 1 ? src.mLeftBump + 1 : src.mLeftBump), 00135 mRightBump(src.mRightBump & 1 ? src.mRightBump + 1 : src.mRightBump), 00136 mTotal(src.mStorage * 2 + mLeftBump + mRightBump) 00137 { 00138 mS.assign(mTotal, mBumperChar); 00139 00140 init(); 00141 00142 char *srcP = src.mStr; 00143 char *dstP = mStr; 00144 int i = src.mStorage; 00145 while (i > 0) { 00146 #ifdef LITTLEENDIAN 00147 *(dstP++) = *(srcP++); 00148 *(dstP++) = 0x00; 00149 #else 00150 *(dstP++) = 0x00; 00151 *(dstP++) = *(srcP++); 00152 #endif 00153 i--; 00154 } 00155 } 00156 00157 SqlStringBufferUCS2::SqlStringBufferUCS2( 00158 SqlStringBuffer const &src, 00159 int leftBumper, 00160 int rightBumper) 00161 : mStorage(src.mStorage *2), 00162 mSize(src.mSize * 2), 00163 mLeftPad(src.mLeftPad * 2), 00164 mRightPad(src.mRightPad * 2), 00165 mLeftBump(leftBumper), 00166 mRightBump(rightBumper), 00167 mTotal(src.mStorage * 2 + leftBumper + rightBumper) 00168 { 00169
00170 assert(!(mLeftBump & 1)); 00171 assert(!(mRightBump & 1)); 00172 00173 mS.assign(mTotal, mBumperChar); 00174 00175 init(); 00176 00177 char *srcP = src.mStr; 00178 char *dstP = mStr; 00179 int i = src.mStorage; 00180 while (i > 0) { 00181 #ifdef LITTLEENDIAN 00182 *(dstP++) = *(srcP++); 00183 *(dstP++) = 0x00; 00184 #else 00185 *(dstP++) = 0x00; 00186 *(dstP++) = *(srcP++); 00187 #endif 00188 i--; 00189 } 00190 } 00191 00192 00193 void 00194 SqlStringBufferUCS2::init() 00195 { 00196 assert(mLeftBump > 0); 00197 assert(mRightBump > 0); 00198 assert(mStorage == mSize + mLeftPad + mRightPad); 00199 00200 mLeftP = const_cast<char *>(mS.c_str()); 00201 mStr = mLeftP + mLeftBump; 00202 mStrPostPad = mStr + mLeftPad; 00203 mRightP = mStr + mStorage; 00204 } 00205 00206 00207 bool 00208 SqlStringBufferUCS2::verify() 00209 { 00210 string verS(mTotal, mBumperChar); 00211 if (mS.compare(0, mLeftBump, verS, 0, mLeftBump)) { 00212 return false; 00213 } 00214 if (mS.compare( 00215 mLeftBump + mLeftPad + mSize + mRightPad, 00216 mRightBump, verS, 0, mRightBump)) 00217 { 00218 return false; 00219 } 00220 return true; 00221 } 00222 00223 void 00224 SqlStringBufferUCS2::randomize( 00225 uint start, 00226 uint lower, 00227 uint upper) 00228 { 00229 patternfill(start, lower, upper); 00230 00231 vector r; 00232 uint16_t tmp; 00233 int i = 0; 00234 while (i < mSize) { 00235 #ifdef LITTLEENDIAN 00236 tmp = mStrPostPad[i + 1] << 8 | mStrPostPad[i]; 00237 #else 00238 tmp = mStrPostPad[i] << 8 | mStrPostPad[i + 1]; 00239 #endif 00240 r.push_back(tmp); 00241 i += 2; 00242 } 00243 00244 00245 random_shuffle(r.begin(), r.end()); 00246 i = 0; 00247 vector::iterator iter = r.begin(); 00248 while (i < mSize) { 00249 tmp = *(iter++); 00250 #ifdef LITTLEENDIAN 00251 mStrPostPad[i++] = tmp & 0xff; 00252 mStrPostPad[i++] = (tmp >> 8) & 0xff; 00253 #else 00254 mStrPostPad[i++] = (tmp >> 8) & 0xff; 00255 mStrPostPad[i++] = tmp & 0xff; 00256 #endif 00257 } 00258 } 00259 00260 void 00261 SqlStringBufferUCS2::patternfill( 00262 uint start, 00263 uint lower, 00264 uint upper) 00265 { 00266 uint c = start; 00267 int i = 0; 00268 00269 while (i < mSize) { 00270 #ifdef LITTLEENDIAN 00271 mStrPostPad[i++] = c & 0xff; 00272 mStrPostPad[i++] = (c >> 8) & 0xff; 00273 #else 00274 mStrPostPad[i++] = (c >> 8) & 0xff; 00275 mStrPostPad[i++] = c & 0xff; 00276 #endif 00277 if (++c > upper) { 00278 c = lower; 00279 } 00280 } 00281 } 00282 00283 string 00284 SqlStringBufferUCS2::dump() 00285 { 00286 int i = 0; 00287 string ret; 00288 char buf[100]; 00289 00290 sprintf( 00291 buf, "DUMP: Storage=%d LeftBump=%d Size=%d RightBump=%d LP=%p Str=%p\n", 00292 mStorage, mLeftBump, mSize, mRightBump, 00293 mLeftP, mStr); 00294 ret += buf; 00295 00296 i = 0; 00297 while (i < mTotal) { 00298 sprintf( 00299 buf, 00300 " %d:%x(%c)", 00301 i, 00302 mLeftP[i], 00303 (mLeftP[i] >= ' ' ? mLeftP[i] : '')); 00304 ret += buf; 00305 i++; 00306 } 00307 00308 ret += "\nLeft Bumper:\n"; 00309 i = 0; 00310 while (i < mLeftBump) { 00311 sprintf(buf, "%d: 0x%x (%c)\n", i, mLeftP[i], mLeftP[i]); 00312 ret += buf; 00313 i++; 00314 } 00315 00316 ret += "\nText:\n"; 00317 i = 0; 00318 while (i < mStorage) { 00319 sprintf( 00320 buf, "%d: 0x%x (%c) 0x%x (%c)\n", i, 00321 mStr[i], (mStr[i] >= ' ' ? mStr[i] : ''), 00322 mStr[i + 1], (mStr[i + 1] >= ' ' ? mStr[i + 1] : '_')); 00323 ret += buf; 00324 i += 2; 00325 } 00326 00327 ret += "\nRight Bumper:\n"; 00328 i = 0; 00329 while (i < mRightBump) { 00330 sprintf( 00331 buf, "%d: 0x%x (%c)\n", i, mStr[i + mStorage], mStr[i + mStorage]); 00332 ret += buf; 00333 i++; 00334 } 00335 00336 return ret; 00337 } 00338 00339 bool 00340 SqlStringBufferUCS2::equal(SqlStringBufferUCS2 const &other) 00341 { 00342 if (other.mTotal != mTotal) { 00343 return false; 00344 } 00345 if (memcmp(other.mLeftP, mLeftP, mTotal)) { 00346 return false; 00347 } 00348 return true; 00349 } 00350 00351