39 #include "blocxx/BLOCXX_config.h"
59 #if defined(BLOCXX_HAVE_ISTREAM) && defined(BLOCXX_HAVE_OSTREAM)
69 #define SNPRINTF _snprintf
71 #define SNPRINTF snprintf
74 namespace BLOCXX_NAMESPACE
85 strncmpi(
const char* s1,
const char* s2,
size_t n)
119 char* buf =
new char[arg.
m_len+1];
120 strcpy(buf, arg.
m_buf);
135 #if defined(BLOCXX_AIX)
158 #if defined(BLOCXX_WIN32)
159 #define snprintf _snprintf // stupid windoze...
166 int len = snprintf(tmpbuf,
sizeof(tmpbuf),
"%d", val);
168 ::snprintf(bfr.
get(), len+1,
"%d", val);
176 int len = ::snprintf(tmpbuf,
sizeof(tmpbuf),
"%u", val);
178 ::snprintf(bfr.
get(), len+1,
"%u", val);
181 #if defined(BLOCXX_INT32_IS_INT) && defined(BLOCXX_INT64_IS_LONG_LONG)
187 int len = snprintf(tmpbuf,
sizeof(tmpbuf),
"%ld", val);
189 ::snprintf(bfr.get(), len+1,
"%ld", val);
190 m_buf =
new ByteBuf(bfr, len);
197 int len = ::snprintf(tmpbuf,
sizeof(tmpbuf),
"%lu", val);
198 AutoPtrVec<char> bfr(
new char[len+1]);
199 ::snprintf(bfr.get(), len+1,
"%lu", val);
200 m_buf =
new ByteBuf(bfr, len);
203 #if defined(BLOCXX_WIN32)
218 #if defined(BLOCXX_INT64_IS_LONG)
220 ::snprintf(tmpbuf,
sizeof(tmpbuf),
"%lu", val);
222 #elif defined(BLOCXX_INT64_IS_LONG_LONG)
237 #if defined(BLOCXX_REAL32_IS_FLOAT)
238 ::SNPRINTF(tmpbuf,
sizeof(tmpbuf),
"%.*g", FLT_MANT_DIG * 3 / 10 + 1, static_cast<double>(val));
239 #elif defined(BLOCXX_REAL32_IS_DOUBLE)
240 ::SNPRINTF(tmpbuf,
sizeof(tmpbuf),
"%.*g", DBL_MANT_DIG * 3 / 10 + 1, val);
243 #error "The formula for computing the number of digits of precision for a floating point needs to be implmented. It's ceiling(bits * log(FLT_RADIX) / log(10))"
253 #if defined(BLOCXX_REAL64_IS_DOUBLE)
254 ::SNPRINTF(tmpbuf,
sizeof(tmpbuf),
"%.*g", DBL_MANT_DIG * 3 / 10 + 1, val);
255 #elif defined(BLOCXX_REAL64_IS_LONG_DOUBLE)
256 ::SNPRINTF(tmpbuf,
sizeof(tmpbuf),
"%.*Lg", LDBL_MANT_DIG * 3 / 10 + 1, val);
259 #error "The formula for computing the number of digits of precision for a floating point needs to be implmented. It's ceiling(bits * log(FLT_RADIX) / log(10))"
288 ::memcpy(bfr.
get(), str, len);
302 size_t sz = ra.
size();
306 for (
size_t i = 0;
i < sz;
i++)
308 buf += ra[
i].toString();
347 size_t len =
length() + 1;
348 char* str =
static_cast<char*
>(malloc(len));
349 ::strcpy(str,
c_str());
366 #define vsnprintf _vsnprintf // stupid windoze
380 n = vsnprintf(p.
get(),
size, fmt, ap);
382 if (n > -1 && n < size)
385 return static_cast<int>(
length());
397 #undef vsnprintf // stupid windoze
409 const char* lhs =
"";
414 return ::strcmp(lhs, arg);
426 const char* lhs =
"";
446 size_t len =
length() + ::strlen(arg);
453 ::strcat(bfr.
get(), arg);
463 size_t newlen =
length() + 1;
471 *(bfr.
get()+newlen) = 0;
499 int ndx =
static_cast<int>(
length() - ::strlen(arg));
507 : (::strcmp(
m_buf->
data()+ndx, arg) == 0);
539 for (
size_t i = 0;
i < len;
i++)
544 hash = (hash << 4) + (temp * 13);
545 UInt32 g = hash & 0xf0000000;
587 p = ::strstr(
m_buf->
data()+fromIndex, arg);
596 cc =
static_cast<size_t>(p -
m_buf->
data());
605 if (fromIndex ==
npos)
615 for (
size_t i = fromIndex;
i !=
npos;
i--)
632 if (fromIndex ==
npos || fromIndex >=
length())
634 if (static_cast<int>(fromIndex =
length()-1) < 0)
640 int arglen = (arg) ? ::strlen(arg) : 0;
641 if (static_cast<int>(fromIndex -= arglen - 1) < 0)
649 while (fromIndex !=
npos)
653 if (::strncmp(
m_buf->
data()+fromIndex, arg, arglen) == 0)
680 size_t arglen = ::strlen(arg);
691 cc = (::strncmp(
m_buf->
data(), arg, arglen) == 0);
715 else if (len ==
npos)
717 count = l - beginIndex;
719 if (count + beginIndex > l)
721 count = l - beginIndex;
725 return String(static_cast<const char*>(
m_buf->
data()+beginIndex), count);
736 while (isspace(*p) && *p !=
'\0')
751 while (isspace(*s1) && *s1 !=
'\0')
771 while (isspace(*s1) && s1 >=
m_buf->
data())
779 if (s1 < m_buf->data())
797 while (isspace(*s1) && *s1 !=
'\0')
808 const char* s2 = p2 - 1;
818 size_t len = (s2 - s1) + 1;
889 UInt32 len =
static_cast<UInt32
>(
length());
974 template <
typename T,
typename FP>
978 if (m_buf && m_buf->length() > 0)
982 T rv = fp(m_buf->data(), &endptr);
983 if (*endptr !=
'\0' || errno == ERANGE || rv == HUGE_VAL || rv == -HUGE_VAL)
999 #if defined(BLOCXX_REAL32_IS_FLOAT) && defined(BLOCXX_HAVE_STRTOF)
1000 return convertToRealType<Real32>(
m_buf,
"Real32", &strtof);
1001 #elif defined(BLOCXX_REAL32_IS_DOUBLE) || (defined(BLOCXX_REAL32_IS_FLOAT) && !defined(BLOCXX_HAVE_STRTOF))
1002 return convertToRealType<Real32>(
m_buf,
"Real32", &strtod);
1009 #if defined(BLOCXX_REAL64_IS_DOUBLE)
1010 return convertToRealType<Real64>(
m_buf,
"Real64", &strtod);
1011 #elif defined(BLOCXX_REAL64_IS_LONG_DOUBLE)
1012 return convertToRealType<Real64>(
m_buf,
"Real64", &strtold);
1033 template <
typename T,
typename FP,
typename FPRT>
1039 if (m_buf && m_buf->length() > 0)
1043 FPRT v = fp(m_buf->data(), &endptr, base);
1044 T rv =
static_cast<T
>(v);
1045 if (*endptr !=
'\0' || errno == ERANGE || FPRT(rv) != v)
1061 template <
typename T>
1065 return doConvertToIntType<T, strtoulfp_t, unsigned long int>(
m_buf, msg, &strtoul, base);
1067 template <
typename T>
1071 return doConvertToIntType<T, strtolfp_t, long int>(
m_buf, msg, &strtol, base);
1073 template <
typename T>
1077 return doConvertToIntType<T, strtoullfp_t, unsigned long long int>(
m_buf, msg, &
String::strtoull, base);
1079 template <
typename T>
1089 return convertToUIntType<UInt8>(
m_buf,
"UInt8", base);
1095 return convertToIntType<Int8>(
m_buf,
"Int8", base);
1101 return convertToUIntType<UInt16>(
m_buf,
"UInt16", base);
1107 return convertToIntType<Int16>(
m_buf,
"Int16", base);
1113 return convertToUIntType<UInt32>(
m_buf,
"UInt32", base);
1119 return convertToIntType<Int32>(
m_buf,
"Int32", base);
1125 return convertToUInt64Type<UInt64>(
m_buf,
"UInt64", base);
1131 return convertToInt64Type<Int64>(
m_buf,
"Int64", base);
1137 return convertToUIntType<unsigned int>(
m_buf,
"unsigned int", base);
1143 return convertToIntType<int>(
m_buf,
"int", base);
1165 bool last_was_delim =
false;
1184 last_was_delim =
true;
1188 last_was_delim =
false;
1202 #ifdef BLOCXX_HAVE_STRTOLL
1206 return ::strtoll(nptr, endptr, base);
1210 #if BLOCXX_SIZEOF_LONG_LONG_INT == 8
1211 #define LLONG_MAX 9223372036854775807LL
1213 #define LLONG_MAX 2147483647LL
1215 #define LLONG_MIN (-LLONG_MAX - 1LL)
1221 long long acc, cutoff;
1223 int neg, any, cutlim;
1230 c = (
unsigned char) *s++;
1231 }
while (isspace(c));
1245 if ((base == 0 || base == 16)
1247 && (*s ==
'x' || *s ==
'X'))
1255 base = c ==
'0' ? 8 : 10;
1273 cutlim =
static_cast<int>(cutoff % base);
1284 for (acc = 0, any = 0;; c = (
unsigned char) *s++)
1290 else if (isalpha(c))
1292 c -= isupper(c) ?
'A' - 10 :
'a' - 10;
1308 if (acc < cutoff || acc == cutoff && c > cutlim)
1323 if (acc > cutoff || acc == cutoff && c > cutlim)
1339 *endptr = (
char *) (any ? s - 1 : nptr);
1343 #endif // #ifdef BLOCXX_HAVE_STRTOLL
1346 #ifdef BLOCXX_HAVE_STRTOULL
1347 unsigned long long int
1350 return ::strtoull(nptr, endptr, base);
1354 #if BLOCXX_SIZEOF_LONG_LONG_INT == 8
1355 #define ULLONG_MAX 18446744073709551615ULL
1357 #define ULLONG_MAX 4294967295ULL
1360 unsigned long long int
1364 unsigned long long acc, cutoff, cutlim;
1370 c = (
unsigned char) *s++;
1371 }
while (isspace(c));
1385 if ((base == 0 || base == 16)
1387 && (*s ==
'x' || *s ==
'X'))
1395 base = c ==
'0' ? 8 : 10;
1397 cutoff =
ULLONG_MAX / (
unsigned long long)base;
1398 cutlim =
ULLONG_MAX % (
unsigned long long)base;
1399 for (acc = 0, any = 0;; c = (
unsigned char) *s++)
1405 else if (isalpha(c))
1407 c -= isupper(c) ?
'A' - 10 :
'a' - 10;
1413 if (c >= (
unsigned int)base)
1421 if (acc > cutoff || acc == cutoff && c > cutlim)
1430 acc *= (
unsigned long)base;
1437 #pragma warning (push)
1438 #pragma warning (disable: 4146)
1444 #pragma warning (pop)
1450 *endptr = (
char *) (any ? s - 1 : nptr);
1454 #endif // #ifdef BLOCXX_HAVE_STRTOULL
1516 const char* tmpChar = theStr;
1517 for (; *tmpChar && *tmpChar != c; tmpChar++)
1521 return ((*tmpChar) == c ? tmpChar : 0);