e576bb | 2002-10-11 | Martin Nilsson | | |
e4591b | 2009-04-25 | Martin Stjernholm | | || $Id$
|
e576bb | 2002-10-11 | Martin Nilsson | | */
|
aedfb1 | 2002-10-09 | Martin Nilsson | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "global.h"
#include "dynamic_buffer.h"
#include "stralloc.h"
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | #include "pike_error.h"
|
9aa6fa | 1997-05-19 | Fredrik Hübinette (Hubbe) | | #include "pike_memory.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
a5a334 | 2006-07-05 | Martin Stjernholm | | PMOD_EXPORT dynamic_buffer pike_global_buffer;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
310dd5 | 2008-07-16 | Martin Stjernholm | | PMOD_EXPORT char *low_make_buf_space(ptrdiff_t space, dynamic_buffer *buf)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
char *ret;
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
5aad93 | 2002-08-15 | Marcus Comstedt | | if(!buf->s.str) Pike_fatal("ARRRRGH! Deadly Trap!\n");
|
6ff3e9 | 1996-04-13 | Fredrik Hübinette (Hubbe) | | #endif
|
1b3a7f | 1997-09-11 | Henrik Grubbström (Grubba) | | if(buf->s.len+space >= buf->bufsize)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
38145a | 1996-02-18 | Fredrik Hübinette (Hubbe) | | if(!buf->bufsize) buf->bufsize=1;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | do{
buf->bufsize*=2;
|
1b3a7f | 1997-09-11 | Henrik Grubbström (Grubba) | | }while(buf->s.len+space >= buf->bufsize);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
1b3a7f | 1997-09-11 | Henrik Grubbström (Grubba) | | buf->s.str=(char *)realloc(buf->s.str, buf->bufsize);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(!buf->s.str)
|
e4591b | 2009-04-25 | Martin Stjernholm | | Pike_fatal("Out of memory.\n");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
1b3a7f | 1997-09-11 | Henrik Grubbström (Grubba) | | ret = buf->s.str + buf->s.len;
buf->s.len += space;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | return ret;
}
|
7e877a | 2003-04-02 | Martin Stjernholm | | PMOD_EXPORT void low_my_putchar(int b,dynamic_buffer *buf)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(!buf->s.str)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Error in internal buffering.\n");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #endif
low_make_buf_space(1,buf)[0]=b;
}
|
d9ab78 | 2000-08-04 | Henrik Grubbström (Grubba) | | PMOD_EXPORT void low_my_binary_strcat(const char *b, size_t l,
dynamic_buffer *buf)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(!buf->s.str)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Error in internal buffering.\n");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #endif
|
d9ab78 | 2000-08-04 | Henrik Grubbström (Grubba) | | MEMCPY(low_make_buf_space(l, buf),b, l);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void debug_initialize_buf(dynamic_buffer *buf)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
e43ca2 | 1996-11-15 | Fredrik Hübinette (Hubbe) | | buf->s.str=(char *)xalloc((buf->bufsize=BUFFER_BEGIN_SIZE));
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | *(buf->s.str)=0;
buf->s.len=0;
}
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void low_reinit_buf(dynamic_buffer *buf)
|
e43ca2 | 1996-11-15 | Fredrik Hübinette (Hubbe) | | {
if(!buf->s.str)
{
initialize_buf(buf);
}else{
*(buf->s.str)=0;
buf->s.len=0;
}
}
|
17ceb4 | 2002-10-21 | Marcus Comstedt | | PMOD_EXPORT void low_init_buf_with_string(dynbuf_string s, dynamic_buffer *buf)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
if(buf->s.str) { free(buf->s.str); buf->s.str=NULL; }
buf->s=s;
|
82ac18 | 1996-11-26 | Fredrik Hübinette (Hubbe) | | if(!buf->s.str) initialize_buf(buf);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
for(buf->bufsize=BUFFER_BEGIN_SIZE;buf->bufsize<buf->s.len;buf->bufsize*=2);
buf->s.str=realloc(buf->s.str,buf->bufsize);
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
82ac18 | 1996-11-26 | Fredrik Hübinette (Hubbe) | | if(!buf->s.str)
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Realloc failed.\n");
|
82ac18 | 1996-11-26 | Fredrik Hübinette (Hubbe) | | #endif
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
9fa0ee | 2003-11-09 | Martin Stjernholm | | PMOD_EXPORT dynbuf_string complex_free_buf(dynamic_buffer *old_buf)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
17ceb4 | 2002-10-21 | Marcus Comstedt | | dynbuf_string tmp;
|
9fa0ee | 2003-11-09 | Martin Stjernholm | | if(!pike_global_buffer.s.str) return pike_global_buffer.s;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | my_putchar(0);
|
9fa0ee | 2003-11-09 | Martin Stjernholm | | pike_global_buffer.s.len--;
tmp=pike_global_buffer.s;
pike_global_buffer = *old_buf;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | return tmp;
}
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void toss_buffer(dynamic_buffer *buf)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
if(buf->s.str) free(buf->s.str);
buf->s.str=0;
}
|
9fa0ee | 2003-11-09 | Martin Stjernholm | | PMOD_EXPORT char *simple_free_buf(dynamic_buffer *old_buf)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
9fa0ee | 2003-11-09 | Martin Stjernholm | | if(!pike_global_buffer.s.str) return 0;
return complex_free_buf(old_buf).str;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct pike_string *debug_low_free_buf(dynamic_buffer *buf)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *q;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(!buf->s.str) return 0;
q=make_shared_binary_string(buf->s.str,buf->s.len);
free(buf->s.str);
buf->s.str=0;
buf->s.len=0;
return q;
}
|
9fa0ee | 2003-11-09 | Martin Stjernholm | | PMOD_EXPORT struct pike_string *debug_free_buf(dynamic_buffer *old_buf)
{
struct pike_string *res = low_free_buf(&pike_global_buffer);
pike_global_buffer = *old_buf;
return res;
}
|
66f363 | 2011-01-15 | Henrik Grubbström (Grubba) | | PMOD_EXPORT void abandon_buf(dynamic_buffer *old_buf)
{
toss_buffer(&pike_global_buffer);
pike_global_buffer = *old_buf;
}
|
9fa0ee | 2003-11-09 | Martin Stjernholm | | PMOD_EXPORT char *make_buf_space(INT32 space)
{
return low_make_buf_space(space,&pike_global_buffer);
}
PMOD_EXPORT void my_putchar(int b)
{
low_my_putchar(b,&pike_global_buffer);
}
PMOD_EXPORT void my_binary_strcat(const char *b, ptrdiff_t l)
{
low_my_binary_strcat(b,l,&pike_global_buffer);
}
PMOD_EXPORT void my_strcat(const char *b)
{
my_binary_strcat(b,strlen(b));
}
PMOD_EXPORT void init_buf(dynamic_buffer *old_buf)
{
*old_buf = pike_global_buffer;
pike_global_buffer.s.str = NULL;
initialize_buf(&pike_global_buffer);
}
PMOD_EXPORT void init_buf_with_string(dynamic_buffer *old_buf, dynbuf_string s)
{
*old_buf = pike_global_buffer;
pike_global_buffer.s.str = NULL;
low_init_buf_with_string(s,&pike_global_buffer);
}
PMOD_EXPORT void save_buffer (dynamic_buffer *save_buf)
{
*save_buf = pike_global_buffer;
pike_global_buffer.s.str = NULL;
}
PMOD_EXPORT void restore_buffer (dynamic_buffer *save_buf)
{
#ifdef PIKE_DEBUG
if (pike_global_buffer.s.str)
Pike_fatal ("Global buffer already in use.\n");
#endif
pike_global_buffer = *save_buf;
}
#if 0
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT char *debug_return_buf(void)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
my_putchar(0);
|
9fa0ee | 2003-11-09 | Martin Stjernholm | | return pike_global_buffer.s.str;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
9fa0ee | 2003-11-09 | Martin Stjernholm | | #endif
|