#include <stdlib.h>
#include <string.h>
#include <StorageDefs.h>
#include "Path.h"
Path::Path()
: fBuffer(NULL),
fBufferSize(0),
fLength(0)
{
}
Path::~Path()
{
free(fBuffer);
}
status_t
Path::SetTo(const char* path, const char* leaf)
{
if (!path)
return B_BAD_VALUE;
int32 len = strlen(path);
if (len == 0)
return B_BAD_VALUE;
bool insertSeparator = false;
int32 leafLen = 0;
if (leaf) {
leafLen = strlen(leaf);
if (leafLen > 0)
insertSeparator = (path[len - 1] != '/' && leaf[0] != '/');
}
int32 wholeLen = len + leafLen + (insertSeparator ? 1 : 0);
status_t error = _Resize(wholeLen + 1);
if (error != B_OK)
return error;
memcpy(fBuffer, path, len);
if (insertSeparator)
fBuffer[len++] = '/';
if (leafLen > 0)
memcpy(fBuffer + len, leaf, leafLen);
fBuffer[wholeLen] = '\0';
fLength = wholeLen;
return B_OK;
}
status_t
Path::Append(const char* leaf)
{
if (!leaf)
return B_BAD_VALUE;
if (fLength == 0)
return SetTo(leaf);
int32 leafLen = strlen(leaf);
if (leafLen == 0)
return B_BAD_VALUE;
bool insertSeparator = (fBuffer[fLength - 1] != '/' && leaf[0] != '/');
int32 wholeLen = fLength + leafLen + (insertSeparator ? 1 : 0);
status_t error = _Resize(wholeLen + 1);
if (error != B_OK)
return error;
if (insertSeparator)
fBuffer[fLength++] = '/';
if (leafLen > 0)
memcpy(fBuffer + fLength, leaf, leafLen + 1);
fLength = wholeLen;
return B_OK;
}
const char*
Path::GetPath() const
{
return (fLength == 0 ? NULL : fBuffer);
}
int32
Path::GetLength() const
{
return fLength;
}
status_t
Path::_Resize(int32 minLen)
{
minLen = (minLen + B_PATH_NAME_LENGTH - 1)
/ B_PATH_NAME_LENGTH * B_PATH_NAME_LENGTH;
if (minLen != fBufferSize) {
char* buffer = (char*)realloc(fBuffer, minLen);
if (!buffer)
return B_NO_MEMORY;
fBuffer = buffer;
fBufferSize = minLen;
}
return B_OK;
}