1  
       2  /* Copyright (C) 1999-2023 by The D Language Foundation, All Rights Reserved
       3   * written by Walter Bright
       4   * https://www.digitalmars.com
       5   * Distributed under the Boost Software License, Version 1.0.
       6   * https://www.boost.org/LICENSE_1_0.txt
       7   * https://github.com/dlang/dmd/blob/master/src/dmd/common/outbuffer.h
       8   */
       9  
      10  #pragma once
      11  
      12  #include "../root/dsystem.h"
      13  #include "../root/dcompat.h"
      14  #include "../root/rmem.h"
      15  
      16  class RootObject;
      17  
      18  struct OutBuffer
      19  {
      20      // IMPORTANT: PLEASE KEEP STATE AND DESTRUCTOR IN SYNC WITH DEFINITION IN ./outbuffer.d.
      21  private:
      22      DArray<unsigned char> data;
      23      d_size_t offset;
      24      d_bool notlinehead;
      25      void *fileMapping;  // pointer to a file mapping object not used on the C++ side
      26  public:
      27      d_bool doindent;
      28      d_bool spaces;
      29      int level;
      30  
      31      OutBuffer()
      32      {
      33          data = DArray<unsigned char>();
      34          offset = 0;
      35  
      36          doindent = 0;
      37          level = 0;
      38          notlinehead = 0;
      39          fileMapping = 0;
      40      }
      41      ~OutBuffer()
      42      {
      43          mem.xfree(data.ptr);
      44      }
      45      d_size_t length() const { return offset; }
      46      char *extractData();
      47      void destroy();
      48  
      49      void reserve(d_size_t nbytes);
      50      void setsize(d_size_t size);
      51      void reset();
      52      void write(const void *data, d_size_t nbytes);
      53      void writestring(const char *string);
      54      void prependstring(const char *string);
      55      void writenl();                     // write newline
      56      void writeByte(unsigned b);
      57      void writeUTF8(unsigned b);
      58      void prependbyte(unsigned b);
      59      void writewchar(unsigned w);
      60      void writeword(unsigned w);
      61      void writeUTF16(unsigned w);
      62      void write4(unsigned w);
      63      void write(const OutBuffer *buf);
      64      void write(RootObject *obj);
      65      void fill0(d_size_t nbytes);
      66      void vprintf(const char *format, va_list args);
      67      void printf(const char *format, ...);
      68      void bracket(char left, char right);
      69      d_size_t bracket(d_size_t i, const char *left, d_size_t j, const char *right);
      70      void spread(d_size_t offset, d_size_t nbytes);
      71      d_size_t insert(d_size_t offset, const void *data, d_size_t nbytes);
      72      void remove(d_size_t offset, d_size_t nbytes);
      73      // Append terminating null if necessary and get view of internal buffer
      74      char *peekChars();
      75      // Append terminating null if necessary and take ownership of data
      76      char *extractChars();
      77  };