Blame winpr/libwinpr/utils/stream.c

Packit Service fa4841
/*
Packit Service fa4841
 * WinPR: Windows Portable Runtime
Packit Service fa4841
 * Stream Utils
Packit Service fa4841
 *
Packit Service fa4841
 * Copyright 2011 Vic Lee
Packit Service fa4841
 * Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
Packit Service fa4841
 *
Packit Service fa4841
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit Service fa4841
 * you may not use this file except in compliance with the License.
Packit Service fa4841
 * You may obtain a copy of the License at
Packit Service fa4841
 *
Packit Service fa4841
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit Service fa4841
 *
Packit Service fa4841
 * Unless required by applicable law or agreed to in writing, software
Packit Service fa4841
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit Service fa4841
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit Service fa4841
 * See the License for the specific language governing permissions and
Packit Service fa4841
 * limitations under the License.
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
#ifdef HAVE_CONFIG_H
Packit Service fa4841
#include "config.h"
Packit Service fa4841
#endif
Packit Service fa4841
Packit Service fa4841
#include <assert.h>
Packit Service fa4841
#include <winpr/crt.h>
Packit Service fa4841
#include <winpr/stream.h>
Packit Service fa4841
Packit Service fa4841
BOOL Stream_EnsureCapacity(wStream* s, size_t size)
Packit Service fa4841
{
Packit Service fa4841
	if (s->capacity < size)
Packit Service fa4841
	{
Packit Service fa4841
		size_t position;
Packit Service fa4841
		size_t old_capacity;
Packit Service fa4841
		size_t new_capacity;
Packit Service fa4841
		BYTE* new_buf;
Packit Service fa4841
Packit Service fa4841
		old_capacity = s->capacity;
Packit Service fa4841
		new_capacity = old_capacity;
Packit Service fa4841
Packit Service fa4841
		do
Packit Service fa4841
		{
Packit Service fa4841
			new_capacity *= 2;
Packit Service bb5c11
		}
Packit Service bb5c11
		while (new_capacity < size);
Packit Service bb5c11
Packit Service fa4841
Packit Service fa4841
		position = Stream_GetPosition(s);
Packit Service fa4841
Packit Service fa4841
		if (!s->isOwner)
Packit Service fa4841
		{
Packit Service bb5c11
			new_buf = (BYTE *)malloc(new_capacity);
Packit Service fa4841
			CopyMemory(new_buf, s->buffer, s->capacity);
Packit Service fa4841
			s->isOwner = TRUE;
Packit Service fa4841
		}
Packit Service fa4841
		else
Packit Service fa4841
		{
Packit Service bb5c11
			new_buf = (BYTE*) realloc(s->buffer, new_capacity);
Packit Service fa4841
		}
Packit Service fa4841
Packit Service fa4841
		if (!new_buf)
Packit Service fa4841
			return FALSE;
Packit Service fa4841
		s->buffer = new_buf;
Packit Service fa4841
		s->capacity = new_capacity;
Packit Service fa4841
		s->length = new_capacity;
Packit Service fa4841
		ZeroMemory(&s->buffer[old_capacity], s->capacity - old_capacity);
Packit Service fa4841
Packit Service fa4841
		Stream_SetPosition(s, position);
Packit Service fa4841
	}
Packit Service fa4841
	return TRUE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
BOOL Stream_EnsureRemainingCapacity(wStream* s, size_t size)
Packit Service fa4841
{
Packit Service fa4841
	if (Stream_GetPosition(s) + size > Stream_Capacity(s))
Packit Service fa4841
		return Stream_EnsureCapacity(s, Stream_Capacity(s) + size);
Packit Service fa4841
	return TRUE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
wStream* Stream_New(BYTE* buffer, size_t size)
Packit Service fa4841
{
Packit Service fa4841
	wStream* s;
Packit Service fa4841
Packit Service fa4841
	if (!buffer && !size)
Packit Service fa4841
		return NULL;
Packit Service fa4841
Packit Service fa4841
	s = malloc(sizeof(wStream));
Packit Service fa4841
	if (!s)
Packit Service fa4841
		return NULL;
Packit Service fa4841
Packit Service fa4841
	if (buffer)
Packit Service fa4841
		s->buffer = buffer;
Packit Service fa4841
	else
Packit Service bb5c11
		s->buffer = (BYTE*) malloc(size);
Packit Service fa4841
Packit Service fa4841
	if (!s->buffer)
Packit Service fa4841
	{
Packit Service fa4841
		free(s);
Packit Service fa4841
		return NULL;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	s->pointer = s->buffer;
Packit Service fa4841
	s->capacity = size;
Packit Service fa4841
	s->length = size;
Packit Service fa4841
Packit Service fa4841
	s->pool = NULL;
Packit Service fa4841
	s->count = 0;
Packit Service fa4841
	s->isAllocatedStream = TRUE;
Packit Service fa4841
	s->isOwner = TRUE;
Packit Service fa4841
	return s;
Packit Service fa4841
}
Packit Service fa4841
Packit Service bb5c11
void Stream_StaticInit(wStream *s, BYTE *buffer, size_t size)
Packit Service fa4841
{
Packit Service fa4841
	assert(s);
Packit Service fa4841
	assert(buffer);
Packit Service fa4841
Packit Service fa4841
	s->buffer = s->pointer = buffer;
Packit Service fa4841
	s->capacity = s->length = size;
Packit Service fa4841
	s->pool = NULL;
Packit Service fa4841
	s->count = 0;
Packit Service fa4841
	s->isAllocatedStream = FALSE;
Packit Service fa4841
	s->isOwner = FALSE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
void Stream_Free(wStream* s, BOOL bFreeBuffer)
Packit Service fa4841
{
Packit Service fa4841
	if (s)
Packit Service fa4841
	{
Packit Service fa4841
		if (bFreeBuffer && s->isOwner)
Packit Service fa4841
			free(s->buffer);
Packit Service fa4841
Packit Service fa4841
		if (s->isAllocatedStream)
Packit Service fa4841
			free(s);
Packit Service fa4841
	}
Packit Service fa4841
}