cb65012014-10-01Martin Nilsson struct _Buffer
8cccac2014-08-28Per Hedbor { unsigned char *buffer; size_t offset; /* reading */ size_t len, allocated; /* writing */
52f2302021-03-13Stephen R. van den Berg  struct object *this;
9629ad2014-09-01Per Hedbor  struct program *error_mode;
fbc3bf2014-09-08Per Hedbor 
52f2302021-03-13Stephen R. van den Berg  union { struct pike_string *str; /* PIKE_T_STRING */ struct object *obj; /* PIKE_T_OBJECT */ struct _Buffer *parent; /* PIKE_T_MIXED */ } source; int sourcetype; /* type for the source union */ struct svalue output;
fbc3bf2014-09-08Per Hedbor 
9171842015-07-13Per Hedbor  INT_TYPE num_malloc, num_move; /* debug mainly, for testsuite*/
fbc3bf2014-09-08Per Hedbor  INT32 locked, locked_move;
9171842015-07-13Per Hedbor  float max_waste;
8cccac2014-08-28Per Hedbor };
fbc3bf2014-09-08Per Hedbor  struct rewind_to {
cb65012014-10-01Martin Nilsson  struct _Buffer *io;
fbc3bf2014-09-08Per Hedbor  size_t rewind_to; #ifdef PIKE_DEBUG int old_locked_move; #endif };
cb65012014-10-01Martin Nilsson typedef struct _Buffer Buffer;
8cccac2014-08-28Per Hedbor  extern void init_stdio_buffer(void); extern void exit_stdio_buffer(void);
307d112015-11-21Arne Goedeke  PMOD_EXPORT void io_ensure_malloced( Buffer *io, size_t bytes ); PMOD_EXPORT unsigned char *io_add_space_do_something( Buffer *io, size_t bytes, int force ); PMOD_EXPORT Buffer *io_buffer_from_object(struct object *o); PMOD_EXPORT void io_trim( Buffer *io );
ecc59b2019-02-02Tobias S. Josefowitz PMOD_EXPORT void io_actually_trigger_output( Buffer *io );
307d112015-11-21Arne Goedeke  PIKE_UNUSED_ATTRIBUTE static size_t io_len( Buffer *io ) { return io->len-io->offset; } PIKE_UNUSED_ATTRIBUTE static unsigned char *io_read_pointer(Buffer *io) { return io->buffer + io->offset; } PIKE_UNUSED_ATTRIBUTE static unsigned char *io_add_space( Buffer *io, size_t bytes, int force ) {
804c712021-03-15Stephen R. van den Berg  if (LIKELY(!io->locked)) { if (UNLIKELY(io->len == io->offset) && LIKELY(!io->locked_move)) io->offset = io->len = 0; if (LIKELY(!force && io->len+bytes < io->allocated && io->len+bytes >= io->len)) return io->buffer+io->len; }
307d112015-11-21Arne Goedeke  return io_add_space_do_something( io, bytes, force ); } PIKE_UNUSED_ATTRIBUTE
3466262017-06-29Arne Goedeke static INT_TYPE io_consume( Buffer *io, ptrdiff_t num )
307d112015-11-21Arne Goedeke { io->offset += num; return io_len(io); }
04f8b82017-09-24Arne Goedeke PIKE_UNUSED_ATTRIBUTE
ecc59b2019-02-02Tobias S. Josefowitz static void io_trigger_output( Buffer *io )
04f8b82017-09-24Arne Goedeke {
ecc59b2019-02-02Tobias S. Josefowitz  if( UNLIKELY(io->output.u.object) ) io_actually_trigger_output(io);
04f8b82017-09-24Arne Goedeke }