< prev index next >

src/hotspot/share/utilities/formatBuffer.hpp

Print this page

        

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.

@@ -43,10 +43,26 @@
 class FormatBufferResource : public FormatBufferBase {
  public:
   FormatBufferResource(const char * format, ...) ATTRIBUTE_PRINTF(2, 3);
 };
 
+// Use malloc() for buffer
+class FormatBufferDynamic : public FormatBufferBase {
+ protected:
+  int bufsz;
+
+ public:
+  inline FormatBufferDynamic();
+  ~FormatBufferDynamic();
+  inline void append(const char* format, ...) ATTRIBUTE_PRINTF(2, 3);
+  inline void print(const char* format, ...) ATTRIBUTE_PRINTF(2, 3);
+  inline void printv(const char* format, va_list ap) ATTRIBUTE_PRINTF(2, 0);
+
+  char* buffer() { return _buf; }
+  int size() { return bufsz; }
+};
+
 class FormatBufferDummy {};
 
 // Use stack for buffer
 template <size_t bufsz = FormatBufferBase::BufferSize>
 class FormatBuffer : public FormatBufferBase {

@@ -67,10 +83,59 @@
 
  protected:
   inline FormatBuffer();
 };
 
+FormatBufferDynamic::FormatBufferDynamic() : FormatBufferBase(NULL), bufsz(-1) {
+  // do nothing
+}
+
+void FormatBufferDynamic::append(const char* format, ...) {
+  va_list argp;
+
+  va_start(argp, format);
+  int append_len = jio_vsnprintf(NULL, 0, format, argp) + 1;
+  va_end(argp);
+
+  char *append_str = (char *)os::malloc(append_len, mtInternal);
+  va_start(argp, format);
+  jio_vsnprintf(append_str, append_len, format, argp);
+  va_end(argp);
+
+  if (_buf == NULL) {
+    bufsz = append_len;
+    _buf = append_str;
+  } else {
+    bufsz += append_len - 1;
+    _buf = (char *)os::realloc(_buf, bufsz, mtInternal);
+    strcat(_buf, append_str);
+    os::free(append_str);
+  }
+}
+
+void FormatBufferDynamic::print(const char * format, ...) {
+  va_list argp;
+  va_start(argp, format);
+  printv(format, argp);
+  va_end(argp);
+}
+
+void FormatBufferDynamic::printv(const char * format, va_list argp) {
+  if (_buf != NULL) {
+    os::free(_buf);
+    bufsz = -1;
+  }
+
+  va_list argp_local;
+  va_copy(argp_local, argp);
+  bufsz = jio_vsnprintf(NULL, 0, format, argp_local) + 1;
+  va_end(argp_local);
+
+  _buf = (char *)os::malloc(bufsz, mtInternal);
+  jio_vsnprintf(_buf, bufsz, format, argp);
+}
+
 template <size_t bufsz>
 FormatBuffer<bufsz>::FormatBuffer(const char * format, ...) : FormatBufferBase(_buffer) {
   va_list argp;
   va_start(argp, format);
   jio_vsnprintf(_buf, bufsz, format, argp);
< prev index next >