Blame src/xarray.cc

Packit Service a2489d
/*
Packit Service a2489d
 * lftp - file transfer program
Packit Service a2489d
 *
Packit Service a2489d
 * Copyright (c) 1996-2012 by Alexander V. Lukyanov (lav@yars.free.net)
Packit Service a2489d
 *
Packit Service a2489d
 * This program is free software; you can redistribute it and/or modify
Packit Service a2489d
 * it under the terms of the GNU General Public License as published by
Packit Service a2489d
 * the Free Software Foundation; either version 3 of the License, or
Packit Service a2489d
 * (at your option) any later version.
Packit Service a2489d
 *
Packit Service a2489d
 * This program is distributed in the hope that it will be useful,
Packit Service a2489d
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service a2489d
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service a2489d
 * GNU General Public License for more details.
Packit Service a2489d
 *
Packit Service a2489d
 * You should have received a copy of the GNU General Public License
Packit Service a2489d
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit Service a2489d
 */
Packit Service a2489d
Packit Service a2489d
#include <config.h>
Packit Service a2489d
#include <assert.h>
Packit Service a2489d
#include "xarray.h"
Packit Service a2489d
Packit Service a2489d
void xarray0::get_space_do(size_t s,size_t g)
Packit Service a2489d
{
Packit Service a2489d
   if(!buf)
Packit Service a2489d
      buf=xmalloc(element_size*(size=s+keep_extra));
Packit Service a2489d
   else if(size
Packit Service a2489d
      buf=xrealloc(buf,element_size*(size=(s|(g-1))+keep_extra));
Packit Service a2489d
   else if(size>=g*8 && s+keep_extra<=size/2)
Packit Service a2489d
      buf=xrealloc(buf,element_size*(size/=2));
Packit Service a2489d
}
Packit Service a2489d
Packit Service a2489d
void xarray0::_nset(const void *s,int len)
Packit Service a2489d
{
Packit Service a2489d
   if(!s)
Packit Service a2489d
   {
Packit Service a2489d
      xfree(buf);
Packit Service a2489d
      init();
Packit Service a2489d
      return;
Packit Service a2489d
   }
Packit Service a2489d
   this->len=len;
Packit Service a2489d
   if(s==buf)
Packit Service a2489d
      return;
Packit Service a2489d
   if(s>buf && s<(char*)buf+size*element_size)
Packit Service a2489d
   {
Packit Service a2489d
      memmove(buf,s,len*element_size);
Packit Service a2489d
      return;
Packit Service a2489d
   }
Packit Service a2489d
   get_space(len);
Packit Service a2489d
   memcpy(buf,s,len*element_size);
Packit Service a2489d
}
Packit Service a2489d
Packit Service a2489d
void *xarray0::_insert(int before)
Packit Service a2489d
{
Packit Service a2489d
   assert(before>=0 && before<=len);
Packit Service a2489d
   grow_space(len+1);
Packit Service a2489d
   if(before
Packit Service a2489d
      memmove(get_ptr(before+1),get_ptr(before),element_size*(len-before));
Packit Service a2489d
   len++;
Packit Service a2489d
   return get_ptr(before);
Packit Service a2489d
}
Packit Service a2489d
void xarray0::_remove(int i,int j)
Packit Service a2489d
{
Packit Service a2489d
   assert(i<j && i>=0 && j<=len);
Packit Service a2489d
   if(j
Packit Service a2489d
      memmove(get_ptr(i),get_ptr(j),element_size*(len-j));
Packit Service a2489d
   len-=(j-i);
Packit Service a2489d
}
Packit Service a2489d
Packit Service a2489d
void *xarray0::_borrow()
Packit Service a2489d
{
Packit Service a2489d
   size=len=0;
Packit Service a2489d
   return replace_value(buf,(void*)0);
Packit Service a2489d
}
Packit Service a2489d
void xarray0::move_here(xarray0& o)
Packit Service a2489d
{
Packit Service a2489d
   xfree(buf);
Packit Service a2489d
   size=o.size;
Packit Service a2489d
   len=o.len;
Packit Service a2489d
   buf=o._borrow();
Packit Service a2489d
}
Packit Service a2489d
Packit Service a2489d
bool xarray0::_bsearch(const void *n,qsort_cmp_t cmp,int *pos)
Packit Service a2489d
{
Packit Service a2489d
   int lo=0;
Packit Service a2489d
   int hi=len;
Packit Service a2489d
   while(lo
Packit Service a2489d
      int m=(lo+hi)/2;
Packit Service a2489d
      int r=cmp(n,get_ptr(m));
Packit Service a2489d
      if(r<0)
Packit Service a2489d
	 hi=m;
Packit Service a2489d
      else if(r>0)
Packit Service a2489d
	 lo=m+1;
Packit Service a2489d
      else {
Packit Service a2489d
	 *pos=m;
Packit Service a2489d
	 return true;
Packit Service a2489d
      }
Packit Service a2489d
   }
Packit Service a2489d
   *pos=lo;
Packit Service a2489d
   return false;
Packit Service a2489d
}
Packit Service a2489d
Packit Service a2489d
void *xarray0::_insert_ordered(const void *n,qsort_cmp_t cmp)
Packit Service a2489d
{
Packit Service a2489d
   int pos;
Packit Service a2489d
   (void)_bsearch(n,cmp,&pos;;
Packit Service a2489d
   return _insert(pos);
Packit Service a2489d
}