|
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
|