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