cb22561995-10-11Fredrik Hübinette (Hubbe) /*\
3e9a462002-01-16Martin Nilsson ||| This file is part of Pike. For copyright information see COPYRIGHT.
59e32d2002-06-01Martin Nilsson ||| Pike is distributed under GPL, LGPL and MPL. See the file COPYING ||| for more information.
1b10db2002-10-08Martin Nilsson ||| $Id: dynamic_buffer.c,v 1.18 2002/10/08 20:22:20 nilsson Exp $
cb22561995-10-11Fredrik Hübinette (Hubbe) \*/
5267b71995-08-09Fredrik Hübinette (Hubbe) #include "global.h" #include "dynamic_buffer.h" #include "stralloc.h"
b2d3e42000-12-01Fredrik Hübinette (Hubbe) #include "pike_error.h"
9aa6fa1997-05-19Fredrik Hübinette (Hubbe) #include "pike_memory.h"
5267b71995-08-09Fredrik Hübinette (Hubbe) 
1b10db2002-10-08Martin Nilsson RCSID("$Id: dynamic_buffer.c,v 1.18 2002/10/08 20:22:20 nilsson Exp $");
24ddc71998-03-28Henrik Grubbström (Grubba) 
5267b71995-08-09Fredrik Hübinette (Hubbe) static dynamic_buffer buff;
d9ab782000-08-04Henrik Grubbström (Grubba) PMOD_EXPORT char *low_make_buf_space(size_t space, dynamic_buffer *buf)
5267b71995-08-09Fredrik Hübinette (Hubbe) { char *ret;
71f3a21998-11-22Fredrik Hübinette (Hubbe) #ifdef PIKE_DEBUG
5aad932002-08-15Marcus Comstedt  if(!buf->s.str) Pike_fatal("ARRRRGH! Deadly Trap!\n");
6ff3e91996-04-13Fredrik Hübinette (Hubbe) #endif
1b3a7f1997-09-11Henrik Grubbström (Grubba)  if(buf->s.len+space >= buf->bufsize)
5267b71995-08-09Fredrik Hübinette (Hubbe)  {
38145a1996-02-18Fredrik Hübinette (Hubbe)  if(!buf->bufsize) buf->bufsize=1;
5267b71995-08-09Fredrik Hübinette (Hubbe)  do{ buf->bufsize*=2;
1b3a7f1997-09-11Henrik Grubbström (Grubba)  }while(buf->s.len+space >= buf->bufsize);
5267b71995-08-09Fredrik Hübinette (Hubbe) 
1b3a7f1997-09-11Henrik Grubbström (Grubba)  buf->s.str=(char *)realloc(buf->s.str, buf->bufsize);
5267b71995-08-09Fredrik Hübinette (Hubbe)  if(!buf->s.str)
b2d3e42000-12-01Fredrik Hübinette (Hubbe)  Pike_error("Out of memory.\n");
5267b71995-08-09Fredrik Hübinette (Hubbe)  }
1b3a7f1997-09-11Henrik Grubbström (Grubba)  ret = buf->s.str + buf->s.len; buf->s.len += space;
5267b71995-08-09Fredrik Hübinette (Hubbe)  return ret; }
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT void low_my_putchar(char b,dynamic_buffer *buf)
5267b71995-08-09Fredrik Hübinette (Hubbe) {
71f3a21998-11-22Fredrik Hübinette (Hubbe) #ifdef PIKE_DEBUG
5267b71995-08-09Fredrik Hübinette (Hubbe)  if(!buf->s.str)
5aad932002-08-15Marcus Comstedt  Pike_fatal("Error in internal buffering.\n");
5267b71995-08-09Fredrik Hübinette (Hubbe) #endif low_make_buf_space(1,buf)[0]=b; }
d9ab782000-08-04Henrik Grubbström (Grubba) PMOD_EXPORT void low_my_binary_strcat(const char *b, size_t l, dynamic_buffer *buf)
5267b71995-08-09Fredrik Hübinette (Hubbe) {
71f3a21998-11-22Fredrik Hübinette (Hubbe) #ifdef PIKE_DEBUG
5267b71995-08-09Fredrik Hübinette (Hubbe)  if(!buf->s.str)
5aad932002-08-15Marcus Comstedt  Pike_fatal("Error in internal buffering.\n");
5267b71995-08-09Fredrik Hübinette (Hubbe) #endif
d9ab782000-08-04Henrik Grubbström (Grubba)  MEMCPY(low_make_buf_space(l, buf),b, l);
5267b71995-08-09Fredrik Hübinette (Hubbe) }
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT void debug_initialize_buf(dynamic_buffer *buf)
5267b71995-08-09Fredrik Hübinette (Hubbe) {
e43ca21996-11-15Fredrik Hübinette (Hubbe)  buf->s.str=(char *)xalloc((buf->bufsize=BUFFER_BEGIN_SIZE));
5267b71995-08-09Fredrik Hübinette (Hubbe)  *(buf->s.str)=0; buf->s.len=0; }
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT void low_reinit_buf(dynamic_buffer *buf)
e43ca21996-11-15Fredrik Hübinette (Hubbe) { if(!buf->s.str) { initialize_buf(buf); }else{ *(buf->s.str)=0; buf->s.len=0; } }
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT void low_init_buf_with_string(string s, dynamic_buffer *buf)
5267b71995-08-09Fredrik Hübinette (Hubbe) { if(buf->s.str) { free(buf->s.str); buf->s.str=NULL; } buf->s=s;
82ac181996-11-26Fredrik Hübinette (Hubbe)  if(!buf->s.str) initialize_buf(buf);
5267b71995-08-09Fredrik Hübinette (Hubbe)  /* if the string is an old buffer, this realloc will set the old the bufsize back */ for(buf->bufsize=BUFFER_BEGIN_SIZE;buf->bufsize<buf->s.len;buf->bufsize*=2); buf->s.str=realloc(buf->s.str,buf->bufsize);
71f3a21998-11-22Fredrik Hübinette (Hubbe) #ifdef PIKE_DEBUG
82ac181996-11-26Fredrik Hübinette (Hubbe)  if(!buf->s.str)
5aad932002-08-15Marcus Comstedt  Pike_fatal("Realloc failed.\n");
82ac181996-11-26Fredrik Hübinette (Hubbe) #endif
5267b71995-08-09Fredrik Hübinette (Hubbe) }
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT string complex_free_buf(void)
5267b71995-08-09Fredrik Hübinette (Hubbe) { string tmp; if(!buff.s.str) return buff.s; my_putchar(0); buff.s.len--; tmp=buff.s; buff.s.str=0; return tmp; }
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT void toss_buffer(dynamic_buffer *buf)
5267b71995-08-09Fredrik Hübinette (Hubbe) { if(buf->s.str) free(buf->s.str); buf->s.str=0; }
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT char *simple_free_buf(void)
5267b71995-08-09Fredrik Hübinette (Hubbe) { if(!buff.s.str) return 0; return complex_free_buf().str; }
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT struct pike_string *debug_low_free_buf(dynamic_buffer *buf)
5267b71995-08-09Fredrik Hübinette (Hubbe) {
06983f1996-09-22Fredrik Hübinette (Hubbe)  struct pike_string *q;
5267b71995-08-09Fredrik 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; }
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT struct pike_string *debug_free_buf(void) { return low_free_buf(&buff); } PMOD_EXPORT char *make_buf_space(INT32 space) { return low_make_buf_space(space,&buff); } PMOD_EXPORT void my_putchar(char b) { low_my_putchar(b,&buff); }
c7241b2000-08-10Henrik Grubbström (Grubba) PMOD_EXPORT void my_binary_strcat(const char *b, ptrdiff_t l) { low_my_binary_strcat(b,l,&buff); }
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT void my_strcat(const char *b) { my_binary_strcat(b,strlen(b)); }
da236a2002-10-06Henrik Grubbström (Grubba) PMOD_EXPORT void initialize_global_buf(void) { initialize_buf(&buff); }
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT void init_buf(void) { low_reinit_buf(&buff); } PMOD_EXPORT void init_buf_with_string(string s) { low_init_buf_with_string(s,&buff); } PMOD_EXPORT char *debug_return_buf(void)
5267b71995-08-09Fredrik Hübinette (Hubbe) { my_putchar(0); return buff.s.str; } /* int my_get_buf_size() { return buff->s.len; } */