< prev index next >

src/hotspot/share/utilities/ostream.cpp

Print this page
rev 56268 : 8231024: Improve the debug info when the output is truncated
Reviewed-by:


  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 }


< prev index next >