Skip to content

Commit

Permalink
smoothen out differences between readLink and symlink
Browse files Browse the repository at this point in the history
ElementType -> ElementEncodingType
template constraints -> static if
  • Loading branch information
aG0aep6G committed Apr 26, 2016
1 parent 831ddcc commit 863b251
Showing 1 changed file with 41 additions and 42 deletions.
83 changes: 41 additions & 42 deletions std/file.d
Expand Up @@ -2311,14 +2311,14 @@ unittest
exists).
+/
version(StdDdoc) void symlink(RO, RL)(RO original, RL link)
if ((isInputRange!RO && isSomeChar!(ElementType!RO) ||
if ((isInputRange!RO && isSomeChar!(ElementEncodingType!RO) ||
isConvertibleToString!RO) &&
(isInputRange!RL && isSomeChar!(ElementType!RL) ||
(isInputRange!RL && isSomeChar!(ElementEncodingType!RL) ||
isConvertibleToString!RL));
else version(Posix) void symlink(RO, RL)(RO original, RL link)
if ((isInputRange!RO && isSomeChar!(ElementType!RO) ||
if ((isInputRange!RO && isSomeChar!(ElementEncodingType!RO) ||
isConvertibleToString!RO) &&
(isInputRange!RL && isSomeChar!(ElementType!RL) ||
(isInputRange!RL && isSomeChar!(ElementEncodingType!RL) ||
isConvertibleToString!RL))
{
static if (isConvertibleToString!RO || isConvertibleToString!RL)
Expand Down Expand Up @@ -2399,55 +2399,54 @@ version(Posix) unittest
$(D FileException) on error.
+/
version(StdDdoc) string readLink(R)(R link)
if (isInputRange!R && isSomeChar!(ElementEncodingType!R) &&
!isConvertibleToString!R);
if (isInputRange!R && isSomeChar!(ElementEncodingType!R) ||
isConvertibleToString!R);
else version(Posix) string readLink(R)(R link)
if (isInputRange!R && isSomeChar!(ElementEncodingType!R) &&
!isConvertibleToString!R)
if (isInputRange!R && isSomeChar!(ElementEncodingType!R) ||
isConvertibleToString!R)
{
alias posixReadlink = core.sys.posix.unistd.readlink;
enum bufferLen = 2048;
enum maxCodeUnits = 6;
char[bufferLen] buffer;
const linkz = link.tempCString();
auto size = () @trusted {
return posixReadlink(linkz, buffer.ptr, buffer.length);
} ();
cenforce(size != -1, to!string(link));

if(size <= bufferLen - maxCodeUnits)
return to!string(buffer[0 .. size]);

auto dynamicBuffer = new char[](bufferLen * 3 / 2);

foreach(i; 0 .. 10)
static if (isConvertibleToString!R)
{
size = () @trusted {
return posixReadlink(linkz, dynamicBuffer.ptr, dynamicBuffer.length);
return readLink!(convertToString!R)(link);
}
else
{
alias posixReadlink = core.sys.posix.unistd.readlink;
enum bufferLen = 2048;
enum maxCodeUnits = 6;
char[bufferLen] buffer;
const linkz = link.tempCString();
auto size = () @trusted {
return posixReadlink(linkz, buffer.ptr, buffer.length);
} ();
cenforce(size != -1, to!string(link));

if(size <= dynamicBuffer.length - maxCodeUnits)
if(size <= bufferLen - maxCodeUnits)
return to!string(buffer[0 .. size]);

auto dynamicBuffer = new char[](bufferLen * 3 / 2);

foreach(i; 0 .. 10)
{
dynamicBuffer.length = size;
return () @trusted {
return assumeUnique(dynamicBuffer);
size = () @trusted {
return posixReadlink(linkz, dynamicBuffer.ptr,
dynamicBuffer.length);
} ();
}
cenforce(size != -1, to!string(link));

dynamicBuffer.length = dynamicBuffer.length * 3 / 2;
}
if(size <= dynamicBuffer.length - maxCodeUnits)
{
dynamicBuffer.length = size;
return () @trusted {
return assumeUnique(dynamicBuffer);
} ();
}

throw new FileException(to!string(link), "Path is too long to read.");
}
dynamicBuffer.length = dynamicBuffer.length * 3 / 2;
}

/// ditto
version(StdDdoc) string readLink(R)(R link)
if (isConvertibleToString!R);
else version(Posix) string readLink(R)(R link)
if (isConvertibleToString!R)
{
return readLink!(StringTypeOf!R)(link);
throw new FileException(to!string(link), "Path is too long to read.");
}
}

version(Posix) @safe unittest
Expand Down

0 comments on commit 863b251

Please sign in to comment.