Changeset View
Changeset View
Standalone View
Standalone View
runtime/src/kmp_str.cpp
Show First 20 Lines • Show All 137 Lines • ▼ Show 20 Lines | void __kmp_str_buf_cat(kmp_str_buf_t *buffer, char const *str, int len) { | ||||
KMP_DEBUG_ASSERT(len >= 0); | KMP_DEBUG_ASSERT(len >= 0); | ||||
__kmp_str_buf_reserve(buffer, buffer->used + len + 1); | __kmp_str_buf_reserve(buffer, buffer->used + len + 1); | ||||
KMP_MEMCPY(buffer->str + buffer->used, str, len); | KMP_MEMCPY(buffer->str + buffer->used, str, len); | ||||
buffer->str[buffer->used + len] = 0; | buffer->str[buffer->used + len] = 0; | ||||
buffer->used += len; | buffer->used += len; | ||||
KMP_STR_BUF_INVARIANT(buffer); | KMP_STR_BUF_INVARIANT(buffer); | ||||
} // __kmp_str_buf_cat | } // __kmp_str_buf_cat | ||||
void __kmp_str_buf_vprint(kmp_str_buf_t *buffer, char const *format, | void __kmp_str_buf_catbuf(kmp_str_buf_t *dest, const kmp_str_buf_t *src) { | ||||
KMP_DEBUG_ASSERT(dest); | |||||
KMP_DEBUG_ASSERT(src); | |||||
KMP_STR_BUF_INVARIANT(dest); | |||||
KMP_STR_BUF_INVARIANT(src); | |||||
if (!src->str || !src->used) | |||||
return; | |||||
__kmp_str_buf_reserve(dest, dest->used + src->used + 1); | |||||
KMP_MEMCPY(dest->str + dest->used, src->str, src->used); | |||||
dest->str[dest->used + src->used] = 0; | |||||
dest->used += src->used; | |||||
KMP_STR_BUF_INVARIANT(dest); | |||||
} // __kmp_str_buf_catbuf | |||||
// Return the number of characters written | |||||
int __kmp_str_buf_vprint(kmp_str_buf_t *buffer, char const *format, | |||||
va_list args) { | va_list args) { | ||||
int rc; | |||||
KMP_STR_BUF_INVARIANT(buffer); | KMP_STR_BUF_INVARIANT(buffer); | ||||
for (;;) { | for (;;) { | ||||
int const free = buffer->size - buffer->used; | int const free = buffer->size - buffer->used; | ||||
int rc; | |||||
int size; | int size; | ||||
// Try to format string. | // Try to format string. | ||||
{ | { | ||||
/* On Linux* OS Intel(R) 64, vsnprintf() modifies args argument, so vsnprintf() | /* On Linux* OS Intel(R) 64, vsnprintf() modifies args argument, so vsnprintf() | ||||
crashes if it is called for the second time with the same args. To prevent | crashes if it is called for the second time with the same args. To prevent | ||||
the crash, we have to pass a fresh intact copy of args to vsnprintf() on each | the crash, we have to pass a fresh intact copy of args to vsnprintf() on each | ||||
iteration. | iteration. | ||||
Show All 32 Lines | #endif // KMP_OS_WINDOWS | ||||
// Enlarge buffer. | // Enlarge buffer. | ||||
__kmp_str_buf_reserve(buffer, size); | __kmp_str_buf_reserve(buffer, size); | ||||
// And try again. | // And try again. | ||||
} | } | ||||
KMP_DEBUG_ASSERT(buffer->size > 0); | KMP_DEBUG_ASSERT(buffer->size > 0); | ||||
KMP_STR_BUF_INVARIANT(buffer); | KMP_STR_BUF_INVARIANT(buffer); | ||||
return rc; | |||||
} // __kmp_str_buf_vprint | } // __kmp_str_buf_vprint | ||||
void __kmp_str_buf_print(kmp_str_buf_t *buffer, char const *format, ...) { | // Return the number of characters written | ||||
int __kmp_str_buf_print(kmp_str_buf_t *buffer, char const *format, ...) { | |||||
int rc; | |||||
va_list args; | va_list args; | ||||
va_start(args, format); | va_start(args, format); | ||||
__kmp_str_buf_vprint(buffer, format, args); | rc = __kmp_str_buf_vprint(buffer, format, args); | ||||
va_end(args); | va_end(args); | ||||
return rc; | |||||
} // __kmp_str_buf_print | } // __kmp_str_buf_print | ||||
/* The function prints specified size to buffer. Size is expressed using biggest | /* The function prints specified size to buffer. Size is expressed using biggest | ||||
possible unit, for example 1024 is printed as "1k". */ | possible unit, for example 1024 is printed as "1k". */ | ||||
void __kmp_str_buf_print_size(kmp_str_buf_t *buf, size_t size) { | void __kmp_str_buf_print_size(kmp_str_buf_t *buf, size_t size) { | ||||
char const *names[] = {"", "k", "M", "G", "T", "P", "E", "Z", "Y"}; | char const *names[] = {"", "k", "M", "G", "T", "P", "E", "Z", "Y"}; | ||||
int const units = sizeof(names) / sizeof(char const *); | int const units = sizeof(names) / sizeof(char const *); | ||||
int u = 0; | int u = 0; | ||||
▲ Show 20 Lines • Show All 518 Lines • Show Last 20 Lines |