1/*
2 * Copyright 2013, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef PATH_BUFFER_H
6#define PATH_BUFFER_H
7
8
9#include <string.h>
10
11#include <algorithm>
12
13
14namespace {
15
16struct PathBuffer {
17	PathBuffer()
18		:
19		fBuffer(NULL),
20		fSize(0),
21		fLength(0)
22	{
23	}
24
25	PathBuffer(char* buffer, size_t size, size_t length = 0)
26	{
27		SetTo(buffer, size, length);
28	}
29
30	void SetTo(char* buffer, size_t size, size_t length = 0)
31	{
32		fBuffer = buffer;
33		fSize = size;
34		fLength = length;
35		if (fLength < fSize)
36			fBuffer[fLength] = '\0';
37	}
38
39	bool Append(const char* toAppend, size_t length)
40	{
41		if (length > 0 && fLength + 1 < fSize) {
42			size_t toCopy = std::min(length, fSize - fLength - 1);
43			memcpy(fBuffer + fLength, toAppend, toCopy);
44			fBuffer[fLength + toCopy] = '\0';
45		}
46
47		fLength += length;
48		return fLength < fSize;
49	}
50
51	bool Append(const char* toAppend)
52	{
53		return Append(toAppend, strlen(toAppend));
54	}
55
56	bool Append(char c)
57	{
58		return Append(&c, 1);
59	}
60
61	size_t Length() const
62	{
63		return fLength;
64	}
65
66private:
67	char*	fBuffer;
68	size_t	fSize;
69	size_t	fLength;
70};
71
72}
73
74
75#endif	// PATH_BUFFER_H
76