88
89 const char* result;
90 if (add_cr) buflen--;
91 if (!strchr(format, '%')) {
92 // constant format string
93 result = format;
94 result_len = strlen(result);
95 if (add_cr && result_len >= buflen) result_len = buflen-1; // truncate
96 } else if (format[0] == '%' && format[1] == 's' && format[2] == '\0') {
97 // trivial copy-through format string
98 result = va_arg(ap, const char*);
99 result_len = strlen(result);
100 if (add_cr && result_len >= buflen) result_len = buflen-1; // truncate
101 } else {
102 int written = os::vsnprintf(buffer, buflen, format, ap);
103 assert(written >= 0, "vsnprintf encoding error");
104 result = buffer;
105 if ((size_t)written < buflen) {
106 result_len = written;
107 } else {
108 DEBUG_ONLY(warning("increase O_BUFLEN in ostream.hpp -- output truncated");)
109 result_len = buflen - 1;
110 }
111 }
112 if (add_cr) {
113 if (result != buffer) {
114 memcpy(buffer, result, result_len);
115 result = buffer;
116 }
117 buffer[result_len++] = '\n';
118 buffer[result_len] = 0;
119 }
120 return result;
121 }
122
123 void outputStream::do_vsnprintf_and_write_with_automatic_buffer(const char* format, va_list ap, bool add_cr) {
124 char buffer[O_BUFLEN];
125 size_t len;
126 const char* str = do_vsnprintf(buffer, sizeof(buffer), format, ap, add_cr, len);
127 write(str, len);
128 }
|
88
89 const char* result;
90 if (add_cr) buflen--;
91 if (!strchr(format, '%')) {
92 // constant format string
93 result = format;
94 result_len = strlen(result);
95 if (add_cr && result_len >= buflen) result_len = buflen-1; // truncate
96 } else if (format[0] == '%' && format[1] == 's' && format[2] == '\0') {
97 // trivial copy-through format string
98 result = va_arg(ap, const char*);
99 result_len = strlen(result);
100 if (add_cr && result_len >= buflen) result_len = buflen-1; // truncate
101 } else {
102 int written = os::vsnprintf(buffer, buflen, format, ap);
103 assert(written >= 0, "vsnprintf encoding error");
104 result = buffer;
105 if ((size_t)written < buflen) {
106 result_len = written;
107 } else {
108 DEBUG_ONLY(warning("increase O_BUFLEN in ostream.hpp: at least %d is required -- output truncated", written + 1);)
109 result_len = buflen - 1;
110 }
111 }
112 if (add_cr) {
113 if (result != buffer) {
114 memcpy(buffer, result, result_len);
115 result = buffer;
116 }
117 buffer[result_len++] = '\n';
118 buffer[result_len] = 0;
119 }
120 return result;
121 }
122
123 void outputStream::do_vsnprintf_and_write_with_automatic_buffer(const char* format, va_list ap, bool add_cr) {
124 char buffer[O_BUFLEN];
125 size_t len;
126 const char* str = do_vsnprintf(buffer, sizeof(buffer), format, ap, add_cr, len);
127 write(str, len);
128 }
|