cb65012014-10-01Martin Nilsson struct _Buffer
8cccac2014-08-28Per Hedbor { unsigned char *buffer; size_t offset; /* reading */ size_t len, allocated; /* writing */
317fc32014-09-02Per Hedbor  struct object *sub, *source, *this;
9629ad2014-09-01Per Hedbor  struct program *error_mode;
c7607f2014-10-05Henrik Grubbström (Grubba)  struct svalue output;
8cccac2014-08-28Per Hedbor  struct pike_string *str;
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;
8923ca2014-09-03Per Hedbor  char malloced, output_triggered;
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 );
04f8b82017-09-24Arne Goedeke PMOD_EXPORT ptrdiff_t 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 ) { if( io->len == io->offset ) io->offset = io->len = 0; if( !force && io->malloced && !io->locked && io->len+bytes < io->allocated && (!bytes || io->len+bytes > io->len)) return io->buffer+io->len; 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 static ptrdiff_t io_trigger_output( Buffer *io ) { if( UNLIKELY(io->output.u.object) && UNLIKELY(!io->output_triggered) ) return io_actually_trigger_output(io); return 0; }