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
00026
00027 #include "fennel/common/CommonPreamble.h"
00028 #include "fennel/calculator/SqlStringAscii.h"
00029
00030 FENNEL_BEGIN_NAMESPACE
00031
00032 int
00033 SqlStrCat_Ascii(
00034 char* dest,
00035 int destStorageBytes,
00036 int destLenBytes,
00037 char const * const str,
00038 int strLenBytes)
00039 {
00040 if (destLenBytes + strLenBytes > destStorageBytes) {
00041
00042 throw "22001";
00043 }
00044
00045 memcpy(dest + destLenBytes, str, strLenBytes);
00046 return destLenBytes + strLenBytes;
00047 }
00048
00049
00050 int
00051 SqlStrCat_Ascii(
00052 char* dest,
00053 int destStorageBytes,
00054 char const * const str1,
00055 int str1LenBytes,
00056 char const * const str2,
00057 int str2LenBytes)
00058 {
00059 if (str1LenBytes + str2LenBytes > destStorageBytes) {
00060
00061 throw "22001";
00062 }
00063
00064 memcpy(dest, str1, str1LenBytes);
00065 memcpy(dest + str1LenBytes, str2, str2LenBytes);
00066 return str1LenBytes + str2LenBytes;
00067 }
00068
00069 int
00070 SqlStrCmp_Ascii_Fix(
00071 char const * const str1,
00072 int str1LenBytes,
00073 char const * const str2,
00074 int str2LenBytes,
00075 char trimchar)
00076 {
00077 char const * start = str1;
00078 char const * end = str1 + str1LenBytes;
00079
00080 if (end != start) {
00081 end--;
00082 while (end != start && *end == trimchar) {
00083 end--;
00084 }
00085 if (end != start || *end != trimchar) {
00086 end++;
00087 }
00088 }
00089 int str1TrimLenBytes = end - start;
00090
00091 start = str2;
00092 end = str2 + str2LenBytes;
00093
00094 if (end != start) {
00095 end--;
00096 while (end != start && *end == trimchar) {
00097 end--;
00098 }
00099 if (end != start || *end != trimchar) {
00100 end++;
00101 }
00102 }
00103 int str2TrimLenBytes = end - start;
00104
00105 if (str1TrimLenBytes > str2TrimLenBytes) {
00106 return 1;
00107 } else if (str1TrimLenBytes < str2TrimLenBytes) {
00108 return -1;
00109 }
00110
00111 assert(str1TrimLenBytes == str2TrimLenBytes);
00112
00113
00114 unsigned char const *s1 = reinterpret_cast<unsigned char const *>(str1);
00115 unsigned char const *s2 = reinterpret_cast<unsigned char const *>(str2);
00116 int len = str1TrimLenBytes;
00117
00118 while (len-- > 0) {
00119 if (*s1 != *s2) {
00120 return (*s1 > *s2) ? 1 : -1;
00121 }
00122 s1++;
00123 s2++;
00124 }
00125 return 0;
00126 }
00127
00128 int
00129 SqlStrCmp_Ascii_Var(
00130 char const * const str1,
00131 int str1LenBytes,
00132 char const * const str2,
00133 int str2LenBytes)
00134 {
00135
00136 if (str1LenBytes > str2LenBytes) {
00137 return 1;
00138 } else if (str1LenBytes < str2LenBytes) {
00139 return -1;
00140 }
00141
00142 assert(str1LenBytes == str2LenBytes);
00143
00144
00145 unsigned char const *s1 = reinterpret_cast<unsigned char const *>(str1);
00146 unsigned char const *s2 = reinterpret_cast<unsigned char const *>(str2);
00147 int len = str1LenBytes;
00148
00149 while (len-- > 0) {
00150 if (*s1 != *s2) {
00151 return (*s1 > *s2) ? 1 : -1;
00152 }
00153 s1++;
00154 s2++;
00155 }
00156 return 0;
00157 }
00158
00159
00160 int
00161 SqlStrLenBit_Ascii(
00162 char const * const str,
00163 int strLenBytes)
00164 {
00165 return 8 * strLenBytes;
00166 }
00167
00168 int
00169 SqlStrLenChar_Ascii(
00170 char const * const str,
00171 int strLenBytes)
00172 {
00173 return strLenBytes;
00174 }
00175
00176 int
00177 SqlStrLenOct_Ascii(
00178 char const * const str,
00179 int strLenBytes)
00180 {
00181 return strLenBytes;
00182 }
00183
00184
00185 int
00186 SqlStrOverlay_Ascii(
00187 char* dest,
00188 int destStorageBytes,
00189 char const * const str,
00190 int strLenBytes,
00191 char const * const over,
00192 int overLenBytes,
00193 int startChar,
00194 int lengthChar,
00195 int lenSpecified)
00196 {
00197 if (!lenSpecified) {
00198 lengthChar = overLenBytes;
00199 }
00200 if (lengthChar < 0 || startChar < 1) {
00201
00202
00203
00204
00205
00206
00207 throw "22011";
00208 }
00209
00210 int leftLenBytes = startChar - 1;
00211 if (leftLenBytes > strLenBytes) {
00212 leftLenBytes = strLenBytes;
00213 }
00214 char const *rightP = str + leftLenBytes + lengthChar;
00215 int rightLenBytes = strLenBytes - (leftLenBytes + lengthChar);
00216 if (rightLenBytes < 0) {
00217 rightLenBytes = 0;
00218 }
00219 assert(leftLenBytes >= 0);
00220 assert(rightLenBytes >= 0);
00221 assert(rightP >= str);
00222
00223 if (leftLenBytes + rightLenBytes + overLenBytes > destStorageBytes) {
00224
00225 throw "22001";
00226 }
00227
00228 char *dp = dest;
00229
00230 memcpy(dp, str, leftLenBytes);
00231 dp += leftLenBytes;
00232 memcpy(dp, over, overLenBytes);
00233 dp += overLenBytes;
00234 memcpy(dp, rightP, rightLenBytes);
00235 dp += rightLenBytes;
00236
00237 return dp - dest;
00238 }
00239
00240 int
00241 SqlStrPos_Ascii(
00242 char const * const str,
00243 int strLenBytes,
00244 char const * const find,
00245 int findLenBytes)
00246 {
00247
00248 if (!findLenBytes) {
00249 return 1;
00250 }
00251
00252 if (findLenBytes > strLenBytes) {
00253 return 0;
00254 }
00255 assert(findLenBytes > 0);
00256 assert(strLenBytes > 0);
00257 assert(strLenBytes - findLenBytes >= 0);
00258
00259 register char const * s = str;
00260 char const * end = 1 + s + (strLenBytes - findLenBytes);
00261
00262 while (s < end) {
00263
00264 s = reinterpret_cast<char const *>(memchr(s, *find, end - s));
00265 if (!s) {
00266 return 0;
00267 }
00268 if (!memcmp(s, find, findLenBytes)) {
00269
00270 return (s - str) + 1;
00271 } else {
00272 s++;
00273 }
00274 }
00275 return 0;
00276 }
00277
00278
00279 int
00280 SqlStrSubStr_Ascii(
00281 char const ** dest,
00282 int destStorageBytes,
00283 char const * const str,
00284 int strLenBytes,
00285 int subStartChar,
00286 int subLengthChar,
00287 int subLenSpecified)
00288 {
00289 int e;
00290 if (subLenSpecified) {
00291 e = subStartChar + subLengthChar;
00292 } else {
00293 e = strLenBytes + 1;
00294 if (subStartChar > e) {
00295 e = subStartChar;
00296 }
00297 }
00298
00299 if (e < subStartChar) {
00300
00301
00302 throw "22011";
00303 }
00304
00305 if (subStartChar > strLenBytes || e < 1) {
00306 return 0;
00307 }
00308
00309 int s1 = 1;
00310 if (subStartChar > s1) {
00311 s1 = subStartChar;
00312 }
00313
00314 int e1 = strLenBytes + 1;
00315 if (e < e1) {
00316 e1 = e;
00317 }
00318 int l1 = e1 - s1;
00319
00320
00321 if (l1 > destStorageBytes) {
00322
00323 throw "22001";
00324 }
00325 if (l1 < 0) {
00326
00327
00328 throw "22011";
00329 }
00330
00331
00332 *dest = str + s1 - 1;
00333 return l1;
00334 }
00335
00336 int
00337 SqlStrToLower_Ascii(
00338 char* dest,
00339 int destStorageBytes,
00340 char const * src,
00341 int srcLenBytes)
00342 {
00343 register char const * s = src;
00344 register char* d = dest;
00345 char* e = dest + srcLenBytes;
00346
00347 if (srcLenBytes > destStorageBytes) {
00348
00349 throw "22001";
00350 }
00351
00352 while (d < e) {
00353 *(d++) = tolower(*(s++));
00354 }
00355 return srcLenBytes;
00356 }
00357
00358 int
00359 SqlStrToUpper_Ascii(
00360 char* dest,
00361 int destStorageBytes,
00362 char const * src,
00363 int srcLenBytes)
00364 {
00365 register char const * s = src;
00366 register char* d = dest;
00367 char* e = dest + srcLenBytes;
00368
00369 if (srcLenBytes > destStorageBytes) {
00370
00371 throw "22001";
00372 }
00373
00374 while (d < e) {
00375 *(d++) = toupper(*(s++));
00376 }
00377 return srcLenBytes;
00378 }
00379
00380 int
00381 SqlStrTrim_Ascii(
00382 char* dest,
00383 int destStorageBytes,
00384 char const * const str,
00385 int strLenBytes,
00386 int trimLeft,
00387 int trimRight,
00388 char trimchar)
00389 {
00390 char const * start = str;
00391 char const * end = str + strLenBytes;
00392 int newLenBytes;
00393
00394
00395 if (trimLeft) {
00396 while (start != end && *start == trimchar) {
00397 start++;
00398 }
00399 }
00400 if (trimRight && end != start) {
00401 end--;
00402 while (end != start && *end == trimchar) {
00403 end--;
00404 }
00405 if (end != start || *end != trimchar) {
00406 end++;
00407 }
00408 }
00409 newLenBytes = end - start;
00410
00411 if (newLenBytes > destStorageBytes) {
00412
00413 throw "22001";
00414 }
00415 memcpy(dest, start, newLenBytes);
00416 return newLenBytes;
00417 }
00418
00419 int
00420 SqlStrTrim_Ascii(
00421 char const ** result,
00422 char const * const str,
00423 int strLenBytes,
00424 int trimLeft,
00425 int trimRight,
00426 char trimchar)
00427 {
00428 char const * start = str;
00429 char const * end = str + strLenBytes;
00430
00431
00432 if (trimLeft) {
00433 while (start != end && *start == trimchar) {
00434 start++;
00435 }
00436 }
00437 if (trimRight && end != start) {
00438 end--;
00439 while (end != start && *end == trimchar) {
00440 end--;
00441 }
00442 if (end != start || *end != trimchar) {
00443 end++;
00444 }
00445 }
00446
00447 *result = start;
00448 return end - start;
00449 }
00450
00451
00452 FENNEL_END_NAMESPACE
00453
00454