Esempio n. 1
0
Bool Vector_printf(Vector *v, Allocator allocator, char const *format, ...)
{
	size_t const speculative_result_length = strlen(format) * 2;
	va_list args;
	ptrdiff_t printed;

	if (!Vector_resize(v, speculative_result_length, allocator))
	{
		return False;
	}

	va_start(args, format);
	printed = vsnprintf(Vector_data(v), Vector_size(v), format, args);
	assert(printed >= 0);
	if ((size_t)printed == Vector_size(v))
	{
		if (!Vector_resize(v, (size_t)printed + 1, allocator))
		{
			va_end(args);
			return False;
		}
		printed = vsnprintf(Vector_data(v), Vector_size(v), format, args);
		assert((size_t)printed == Vector_size(v));
	}
	Vector_resize_smaller(v, (size_t)printed + 1);
	va_end(args);
	return True;
}
static void test_vector(void)
{
	MemoryManager memory = create_standard_memory_manager();

	{
		Vector v;
		Vector_init(&v);
		TEST(Vector_empty(&v));
		TEST(Vector_size(&v) == 0);
		Vector_free(&v, memory.deallocator);
	}

	{
		Vector v;
		Vector_init(&v);
		TEST(Vector_reserve(&v, 100, memory.allocator));
		TEST(Vector_reserve(&v, 200, memory.allocator));
		TEST(Vector_reserve(&v, 50, memory.allocator));
		TEST(Vector_reserve(&v, 0, memory.allocator));
		Vector_free(&v, memory.deallocator);
	}

	{
		Vector v;
		Vector_init(&v);
		TEST(Vector_resize(&v, 100, memory.allocator));
		TEST(Vector_resize(&v, 200, memory.allocator));
		TEST(Vector_resize(&v, 50, memory.allocator));
		TEST(Vector_resize(&v, 0, memory.allocator));
		Vector_free(&v, memory.deallocator);
	}

	{
		size_t i;
		size_t const count = 1000;
		Vector v;
		Vector_init(&v);
		for (i = 0; i < count; ++i)
		{
			char c = (char)('0' + (i % 10));
			ASSERT(Vector_push_back(&v, &c, 1, memory.allocator));
		}
		for (i = 0; i < count; ++i)
		{
			char c = (char)('0' + (i % 10));
			ASSERT(Vector_data(&v)[i] == c);
		}
		Vector_free(&v, memory.deallocator);
	}
}
Esempio n. 3
0
Bool Vector_append_binary_file(Vector *v, Allocator v_allocator, FILE *in)
{
	size_t const original_size = Vector_size(v);
	size_t buffer_size = 8192;
	for (;;)
	{
		size_t const offset_to_read_to = Vector_size(v);
		size_t const max_size_t = ~(size_t)0;
		size_t resizing = original_size + buffer_size;
		size_t read_size;
		size_t actually_read;
		if (resizing > max_size_t)
		{
			resizing = max_size_t;
		}
		if (!Vector_resize(v, resizing, v_allocator))
		{
			Vector_resize_smaller(v, original_size);
			return False;
		}
		read_size = resizing - offset_to_read_to;
		actually_read = fread(Vector_data(v) + offset_to_read_to, 1, read_size, in);
		if (actually_read < read_size)
		{
			Vector_resize_smaller(v, offset_to_read_to + actually_read);
			return True;
		}
	}
}
Esempio n. 4
0
void
AntiDOS_update(AntiDOS *dos)
{
  time_t		t = time(0);
  assert(dos!=0);
  
  if (t-dos->min_time > ANTIDOS_TIME_BASE) {
    bool		was_changed = false;
    struct Data		*i;
    
    dos->min_time = t;
    for (i = Vector_begin(&dos->data); i!=Vector_end(&dos->data); ++i) {
      if (t - i->access_time>ANTIDOS_TIME_BASE) {
	i->ip.s_addr  = 0xFFFFFFFF;
	was_changed   = true;
      }
      else
	dos->min_time = MIN(dos->min_time, i->access_time);
    }

    if (was_changed) {
      Vector_sort(&dos->data, Data_sortCompare);
      for (i=Vector_end(&dos->data); i!=Vector_begin(&dos->data);) {
	--i;
	if (i->ip.s_addr!=0xFFFFFFFF) break;

	Vector_popback(&dos->data);
      }

      Vector_resize(&dos->data);
    }
  }
}
Esempio n. 5
0
File: vector.c Progetto: ptt/pttbbs
void
Vector_add(struct Vector *self, const char *name)
{
    assert(!self->constant);
    Vector_resize(self, self->length+1);
    strlcpy(self->base + self->size * self->length, name, self->size);
    self->length++;
}
Esempio n. 6
0
File: vector.c Progetto: ptt/pttbbs
int
Vector_remove(struct Vector *self, const char *name)
{
    int i;
    assert(!self->constant);
    for (i=0; i<self->length; i++)
	if (strcasecmp(self->base + self->size * i, name) == 0) {
	    strlcpy(self->base + self->size * i,
		    self->base + self->size * (self->length-1), self->size);

	    self->length--;
	    Vector_resize(self, self->length);
	    return 1;
	}
    return 0;
}
Esempio n. 7
0
int
Vector_append(Vector v, size_t count, void *values)
{
	int ret;
	ptrdiff_t new_size;

	if (!v || !values)
		return -EINVAL;

	new_size = v->size + count;
	if (new_size > v->capacity)
		if ((ret = Vector_resize(v, new_size)))
			return ret;
	memcpy(Vector_address(v, v->size), values, count * v->unit);
	v->size = new_size;

	return 0;
}
Esempio n. 8
0
// Test your vector here
int main() { 
	Vector* temp = Vector_create(); //create a vector
	
	Vector_append( temp, "a");//1
	Vector_append( temp, "b");//2
	Vector_append( temp, "c");//3
	Vector_append( temp, "d");//4
	Vector_append( temp, NULL);//5
	Vector_append( temp, "f");//6
	Vector_append( temp, "g");//7
	Vector_append( temp, NULL);//8
	Vector_append( temp, "");//9
	Vector_append( temp, "h");//10
	Vector_append( temp, "i");//11
	Vector_append( temp, NULL);//12
	
	Vector_resize( temp, 20 );
	
	if( Vector_size(temp) != 20 || strcmp( Vector_get( temp, 10 ), "i" ) || Vector_get( temp, 15 ) != NULL )
		perror( "something wrong.\n");
	
	//done for append, resize, get, size
	
	Vector_set( temp, 19, "caibi" );
	Vector_insert( temp, 20, "niubi" );
	Vector_insert( temp, 30, "wori" );
	
	if( Vector_size(temp) != 31 || strcmp( Vector_get( temp, 19 ), "caibi" ) || strcmp( Vector_get( temp, 20 ), "niubi" ) ||  Vector_get( temp, 15 ) != NULL || strcmp( Vector_get( temp, 30 ), "wori" ) )
		perror( "something wrong.\n");
	
	Vector_delete( temp, 11 );
	Vector_delete( temp, 27 );
	Vector_delete( temp, 1 );
	Vector_delete( temp, 18 );
	
	if( Vector_size(temp) != 27 || strcmp( Vector_get( temp, 4 ), "f" ) || strcmp( Vector_get( temp, 26 ), "wori") || Vector_get( temp, 18 ) !=NULL || strcmp( Vector_get( temp, 17 ), "caibi") )
		perror( "something wrong.\n");
	
	
	Vector_destroy( temp );

	return 0; 
}
Esempio n. 9
0
int
Vector_set(Vector v, ptrdiff_t index, void *value)
{
	int ret;

	if (!v || !value)
		return -EINVAL;
	if (index < -v->size)
		return -EINVAL;

	if (index >= v->capacity)
		if ((ret = Vector_resize(v, index + 1)))
			return ret;
	memcpy(Vector_address(v, index), value, v->unit);
	if (v->size < index + 1) {
		memset(Vector_address(v, v->size), 0, (index - v->size) * v->unit);
		v->size = index + 1;
	}

	return 0;
}