94 // trivial copy-through format string |
94 // trivial copy-through format string |
95 result = va_arg(ap, const char*); |
95 result = va_arg(ap, const char*); |
96 result_len = strlen(result); |
96 result_len = strlen(result); |
97 if (add_cr && result_len >= buflen) result_len = buflen-1; // truncate |
97 if (add_cr && result_len >= buflen) result_len = buflen-1; // truncate |
98 } else { |
98 } else { |
99 // Handle truncation: |
99 int written = os::vsnprintf(buffer, buflen, format, ap); |
100 // posix: upon truncation, vsnprintf returns number of bytes which |
100 assert(written >= 0, "vsnprintf encoding error"); |
101 // would have been written (excluding terminating zero) had the buffer |
|
102 // been large enough |
|
103 // windows: upon truncation, vsnprintf returns -1 |
|
104 const int written = vsnprintf(buffer, buflen, format, ap); |
|
105 result = buffer; |
101 result = buffer; |
106 if (written < (int) buflen && written >= 0) { |
102 if ((size_t)written < buflen) { |
107 result_len = written; |
103 result_len = written; |
108 } else { |
104 } else { |
109 DEBUG_ONLY(warning("increase O_BUFLEN in ostream.hpp -- output truncated");) |
105 DEBUG_ONLY(warning("increase O_BUFLEN in ostream.hpp -- output truncated");) |
110 result_len = buflen - 1; |
106 result_len = buflen - 1; |
111 buffer[result_len] = 0; |
|
112 } |
107 } |
113 } |
108 } |
114 if (add_cr) { |
109 if (add_cr) { |
115 if (result != buffer) { |
110 if (result != buffer) { |
116 memcpy(buffer, result, result_len); |
111 memcpy(buffer, result, result_len); |