Blame src/xmalloc.cc

Packit 8f70b4
/*
Packit 8f70b4
 * lftp - file transfer program
Packit 8f70b4
 *
Packit 8f70b4
 * Copyright (c) 1996-2012 by Alexander V. Lukyanov (lav@yars.free.net)
Packit 8f70b4
 *
Packit 8f70b4
 * This program is free software; you can redistribute it and/or modify
Packit 8f70b4
 * it under the terms of the GNU General Public License as published by
Packit 8f70b4
 * the Free Software Foundation; either version 3 of the License, or
Packit 8f70b4
 * (at your option) any later version.
Packit 8f70b4
 *
Packit 8f70b4
 * This program is distributed in the hope that it will be useful,
Packit 8f70b4
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 8f70b4
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 8f70b4
 * GNU General Public License for more details.
Packit 8f70b4
 *
Packit 8f70b4
 * You should have received a copy of the GNU General Public License
Packit 8f70b4
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit 8f70b4
 */
Packit 8f70b4
Packit 8f70b4
#include <config.h>
Packit 8f70b4
#include "trio.h"
Packit 8f70b4
#include "xmalloc.h"
Packit 8f70b4
Packit 8f70b4
static int memory_count=0;
Packit 8f70b4
Packit 8f70b4
static void memory_error_and_abort(const char *fname,size_t size)
Packit 8f70b4
{
Packit 8f70b4
   fprintf(stderr,"%s: out of virtual memory when trying to get %lu bytes\n",
Packit 8f70b4
	 fname,(long)size);
Packit 8f70b4
   exit(2);
Packit 8f70b4
}
Packit 8f70b4
Packit 8f70b4
void *xmalloc (size_t bytes)
Packit 8f70b4
{
Packit 8f70b4
   if(bytes==0)
Packit 8f70b4
      return 0;
Packit 8f70b4
   void *temp=(void*)malloc(bytes);
Packit 8f70b4
   if(temp==0)
Packit 8f70b4
      memory_error_and_abort("xmalloc",bytes);
Packit 8f70b4
   memory_count++;
Packit 8f70b4
#ifdef MEM_DEBUG
Packit 8f70b4
   printf("xmalloc %p %lu (count=%d)\n",temp,(long)bytes,memory_count);
Packit 8f70b4
#endif
Packit 8f70b4
   return(temp);
Packit 8f70b4
}
Packit 8f70b4
Packit 8f70b4
void *xrealloc(void *pointer,size_t bytes)
Packit 8f70b4
{
Packit 8f70b4
   void *temp;
Packit 8f70b4
   if(pointer==0 && bytes==0)
Packit 8f70b4
      return 0;
Packit 8f70b4
   if(bytes==0)
Packit 8f70b4
   {
Packit 8f70b4
      memory_count--;
Packit 8f70b4
      free(pointer);
Packit 8f70b4
      temp=0;
Packit 8f70b4
      goto leave;
Packit 8f70b4
   }
Packit 8f70b4
   if(pointer==0)
Packit 8f70b4
   {
Packit 8f70b4
      temp=(void*)malloc(bytes);
Packit 8f70b4
      memory_count++;
Packit 8f70b4
   }
Packit 8f70b4
   else
Packit 8f70b4
      temp=(void*)realloc(pointer,bytes);
Packit 8f70b4
   if(temp==0)
Packit 8f70b4
      memory_error_and_abort ("xrealloc",bytes);
Packit 8f70b4
leave:
Packit 8f70b4
#ifdef MEM_DEBUG
Packit 8f70b4
   printf("xrealloc %p %p %lu (count=%d)\n",pointer,temp,(long)bytes,memory_count);
Packit 8f70b4
#endif
Packit 8f70b4
   return(temp);
Packit 8f70b4
}
Packit 8f70b4
Packit 8f70b4
void xfree(void *p)
Packit 8f70b4
{
Packit 8f70b4
   if(!p)
Packit 8f70b4
      return;
Packit 8f70b4
#ifdef MEM_DEBUG
Packit 8f70b4
   printf("xfree %p (count=%d)\n",p,memory_count);
Packit 8f70b4
#endif
Packit 8f70b4
   memory_count--;
Packit 8f70b4
   free(p);
Packit 8f70b4
}
Packit 8f70b4
Packit 8f70b4
char *xstrdup(const char *s,int spare)
Packit 8f70b4
{
Packit 8f70b4
   if(!s)
Packit 8f70b4
      return (char*)xmalloc(spare);
Packit 8f70b4
#ifdef MEM_DEBUG
Packit 8f70b4
   printf("xstrdup \"%s\"\n",s);
Packit 8f70b4
#endif
Packit 8f70b4
   size_t len=strlen(s)+1;
Packit 8f70b4
   char *mem=(char*)xmalloc(len+spare);
Packit 8f70b4
   memcpy(mem,s,len);
Packit 8f70b4
   return mem;
Packit 8f70b4
}
Packit 8f70b4
Packit 8f70b4
char *xstrset(char *&mem,const char *s,size_t len)
Packit 8f70b4
{
Packit 8f70b4
   if(!s)
Packit 8f70b4
   {
Packit 8f70b4
      xfree(mem);
Packit 8f70b4
      return mem=0;
Packit 8f70b4
   }
Packit 8f70b4
#ifdef MEM_DEBUG
Packit 8f70b4
   printf("xstrset \"%.*s\"\n",len,s);
Packit 8f70b4
#endif
Packit 8f70b4
   if(s==mem)
Packit 8f70b4
   {
Packit 8f70b4
      mem[len]=0;
Packit 8f70b4
      return mem;
Packit 8f70b4
   }
Packit 8f70b4
   size_t old_len=(mem?strlen(mem)+1:0);
Packit 8f70b4
   if(mem && s>mem && s
Packit 8f70b4
   {
Packit 8f70b4
      memmove(mem,s,len);
Packit 8f70b4
      mem[len]=0;
Packit 8f70b4
      return mem;
Packit 8f70b4
   }
Packit 8f70b4
   if(old_len
Packit 8f70b4
      mem=(char*)xrealloc(mem,len+1);
Packit 8f70b4
   memcpy(mem,s,len);
Packit 8f70b4
   mem[len]=0;
Packit 8f70b4
   return mem;
Packit 8f70b4
}
Packit 8f70b4
char *xstrset(char *&mem,const char *s)
Packit 8f70b4
{
Packit 8f70b4
   if(!s)
Packit 8f70b4
   {
Packit 8f70b4
      xfree(mem);
Packit 8f70b4
      return mem=0;
Packit 8f70b4
   }
Packit 8f70b4
#ifdef MEM_DEBUG
Packit 8f70b4
   printf("xstrset \"%s\"\n",s);
Packit 8f70b4
#endif
Packit 8f70b4
   if(s==mem)
Packit 8f70b4
      return mem;
Packit 8f70b4
   size_t old_len=(mem?strlen(mem)+1:0);
Packit 8f70b4
   size_t len=strlen(s)+1;
Packit 8f70b4
   if(mem && s>mem && s
Packit 8f70b4
      return (char*)memmove(mem,s,len);
Packit 8f70b4
   if(old_len
Packit 8f70b4
      mem=(char*)xrealloc(mem,len);
Packit 8f70b4
   memcpy(mem,s,len);
Packit 8f70b4
   return mem;
Packit 8f70b4
}
Packit 8f70b4
void xmalloc_register_block(void *b)
Packit 8f70b4
{
Packit 8f70b4
   if(!b)
Packit 8f70b4
      return;
Packit 8f70b4
   memory_count++;
Packit 8f70b4
#ifdef MEM_DEBUG
Packit 8f70b4
   printf("xmalloc %p (count=%d)\n",b,memory_count);
Packit 8f70b4
#endif
Packit 8f70b4
}
Packit 8f70b4
Packit 8f70b4
#ifdef MEM_DEBUG
Packit 8f70b4
void *__builtin_new(size_t s)
Packit 8f70b4
{
Packit 8f70b4
   return xmalloc(s);
Packit 8f70b4
}
Packit 8f70b4
void __builtin_delete(void *p)
Packit 8f70b4
{
Packit 8f70b4
   xfree(p);
Packit 8f70b4
}
Packit 8f70b4
#endif