From ab315c1c1c1a113455c15d91ce609c54f20c818d Mon Sep 17 00:00:00 2001 From: Walter Bright Date: Mon, 29 Jun 2015 22:36:06 -0700 Subject: [PATCH] simplify rt.util.string --- mak/COPY | 1 + mak/MANIFEST | 2 +- mak/SRCS | 2 +- src/core/internal/string.d | 57 +++++++++++++++++++++++++++++ src/object.d | 16 ++++----- src/rt/arrayassign.d | 1 - src/rt/arraycat.d | 1 - src/rt/dmain2.d | 1 - src/rt/trace.d | 2 +- src/rt/typeinfo/ti_Ag.d | 2 +- src/rt/util/array.d | 14 ++++---- src/rt/util/string.d | 74 -------------------------------------- win32.mak | 3 ++ win64.mak | 3 ++ 14 files changed, 83 insertions(+), 96 deletions(-) create mode 100644 src/core/internal/string.d delete mode 100644 src/rt/util/string.d diff --git a/mak/COPY b/mak/COPY index c9d1afdd4e1..3b5267b4231 100644 --- a/mak/COPY +++ b/mak/COPY @@ -16,6 +16,7 @@ COPY=\ \ $(IMPDIR)\core\internal\convert.d \ $(IMPDIR)\core\internal\hash.d \ + $(IMPDIR)\core\internal\string.d \ $(IMPDIR)\core\internal\traits.d \ \ $(IMPDIR)\core\stdc\complex.d \ diff --git a/mak/MANIFEST b/mak/MANIFEST index e303f12c3a1..bf1d5928a05 100644 --- a/mak/MANIFEST +++ b/mak/MANIFEST @@ -34,6 +34,7 @@ MANIFEST=\ \ src\core\internal\convert.d \ src\core\internal\hash.d \ + src\core\internal\string.d \ src\core\internal\traits.d \ \ src\core\stdc\complex.d \ @@ -245,7 +246,6 @@ MANIFEST=\ src\rt\util\array.d \ src\rt\util\hash.d \ src\rt\util\random.d \ - src\rt\util\string.d \ src\rt\util\typeinfo.d \ src\rt\util\utf.d \ src\rt\util\container\array.d \ diff --git a/mak/SRCS b/mak/SRCS index 7a2c8e82c19..3d8b72b5470 100644 --- a/mak/SRCS +++ b/mak/SRCS @@ -17,6 +17,7 @@ SRCS=\ \ src\core\internal\convert.d \ src\core\internal\hash.d \ + src\core\internal\string.d \ src\core\internal\traits.d \ \ src\core\stdc\config.d \ @@ -130,7 +131,6 @@ SRCS=\ src\rt\util\array.d \ src\rt\util\hash.d \ src\rt\util\random.d \ - src\rt\util\string.d \ src\rt\util\typeinfo.d \ src\rt\util\utf.d \ src\rt\util\container\array.d \ diff --git a/src/core/internal/string.d b/src/core/internal/string.d new file mode 100644 index 00000000000..2b582d82f5e --- /dev/null +++ b/src/core/internal/string.d @@ -0,0 +1,57 @@ +/** + * String manipulation and comparison utilities. + * + * Copyright: Copyright Sean Kelly 2005 - 2009. + * License: $(WEB www.boost.org/LICENSE_1_0.txt, Boost License 1.0). + * Authors: Sean Kelly, Walter Bright + * Source: $(DRUNTIMESRC src/rt/util/_string.d) + */ + +module core.internal.string; + +pure: +nothrow: +@nogc: + +alias UnsignedStringBuf = char[20]; + +char[] unsignedToTempString(ulong value, char[] buf, uint radix) @safe +{ + size_t i = buf.length; + do + { + ubyte x = cast(ubyte)(value % radix); + value = value / radix; + buf[--i] = cast(char)((x < 10) ? x + '0' : x - 10 + 'a'); + } while (value); + return buf[i .. $]; +} + +unittest +{ + UnsignedStringBuf buf; + assert(0.unsignedToTempString(buf, 10) == "0"); + assert(1.unsignedToTempString(buf, 10) == "1"); + assert(12.unsignedToTempString(buf, 10) == "12"); + assert(0x12ABCF .unsignedToTempString(buf, 16) == "12abcf"); + assert(long.sizeof.unsignedToTempString(buf, 10) == "8"); + assert(uint.max.unsignedToTempString(buf, 10) == "4294967295"); + assert(ulong.max.unsignedToTempString(buf, 10) == "18446744073709551615"); +} + + +int dstrcmp( in char[] s1, in char[] s2 ) @trusted +{ + import core.stdc.string : memcmp; + + int ret = 0; + auto len = s1.length; + if( s2.length < len ) + len = s2.length; + if( 0 != (ret = memcmp( s1.ptr, s2.ptr, len )) ) + return ret; + return s1.length > s2.length ? 1 : + s1.length == s2.length ? 0 : -1; +} + + diff --git a/src/object.d b/src/object.d index 0a141a490dd..d3be07c1b17 100644 --- a/src/object.d +++ b/src/object.d @@ -232,8 +232,8 @@ class TypeInfo override int opCmp(Object o) { import core.internal.traits : externDFunc; - alias dstrcmp = externDFunc!("rt.util.string.dstrcmp", - int function(in char[] s1, in char[] s2) @trusted pure nothrow); + alias dstrcmp = externDFunc!("core.internal.string.dstrcmp", + int function(in char[] s1, in char[] s2) @trusted pure nothrow @nogc); if (this is o) return 0; @@ -500,11 +500,11 @@ class TypeInfo_StaticArray : TypeInfo override string toString() const { import core.internal.traits : externDFunc; - alias sizeToTempString = externDFunc!("rt.util.string.sizeToTempString", - char[] function(in size_t, char[]) @trusted pure nothrow); + alias sizeToTempString = externDFunc!("core.internal.string.unsignedToTempString", + char[] function(ulong, char[], uint) @safe pure nothrow @nogc); char[20] tmpBuff = void; - return value.toString() ~ "[" ~ sizeToTempString(len, tmpBuff) ~ "]"; + return value.toString() ~ "[" ~ sizeToTempString(len, tmpBuff, 10) ~ "]"; } override bool opEquals(Object o) @@ -1562,14 +1562,14 @@ class Throwable : Object void toString(scope void delegate(in char[]) sink) const { import core.internal.traits : externDFunc; - alias sizeToTempString = externDFunc!("rt.util.string.sizeToTempString", - char[] function(in size_t, char[]) @trusted pure nothrow); + alias sizeToTempString = externDFunc!("core.internal.string.unsignedToTempString", + char[] function(ulong, char[], uint) @safe pure nothrow @nogc); char[20] tmpBuff = void; sink(typeid(this).name); sink("@"); sink(file); - sink("("); sink(sizeToTempString(line, tmpBuff)); sink(")"); + sink("("); sink(sizeToTempString(line, tmpBuff, 10)); sink(")"); if (msg.length) { diff --git a/src/rt/arrayassign.d b/src/rt/arrayassign.d index 7ea72f141fe..68305ef5f3e 100644 --- a/src/rt/arrayassign.d +++ b/src/rt/arrayassign.d @@ -16,7 +16,6 @@ module rt.arrayassign; private { import rt.util.array; - import rt.util.string; import core.stdc.string; import core.stdc.stdlib; debug(PRINTF) import core.stdc.stdio; diff --git a/src/rt/arraycat.d b/src/rt/arraycat.d index 2faad37761c..c5542f22325 100644 --- a/src/rt/arraycat.d +++ b/src/rt/arraycat.d @@ -17,7 +17,6 @@ private { import core.stdc.string; import rt.util.array; - import rt.util.string; debug(PRINTF) import core.stdc.stdio; } diff --git a/src/rt/dmain2.d b/src/rt/dmain2.d index 2dc09c98281..1dda7dac11b 100644 --- a/src/rt/dmain2.d +++ b/src/rt/dmain2.d @@ -15,7 +15,6 @@ private { import rt.memory; import rt.sections; - import rt.util.string; import core.atomic; import core.stdc.stddef; import core.stdc.stdlib; diff --git a/src/rt/trace.d b/src/rt/trace.d index 9f976cdf2bd..6c1aeeb4a23 100644 --- a/src/rt/trace.d +++ b/src/rt/trace.d @@ -18,7 +18,7 @@ private import core.stdc.stdio; import core.stdc.stdlib; import core.stdc.string; - import rt.util.string; + import core.internal.string; version (CRuntime_Microsoft) alias core.stdc.stdlib._strtoui64 strtoull; diff --git a/src/rt/typeinfo/ti_Ag.d b/src/rt/typeinfo/ti_Ag.d index 313838fcef4..851c04356e0 100644 --- a/src/rt/typeinfo/ti_Ag.d +++ b/src/rt/typeinfo/ti_Ag.d @@ -15,7 +15,7 @@ module rt.typeinfo.ti_Ag; private import core.stdc.string; private import rt.util.hash; -private import rt.util.string; +private import core.internal.string; // byte[] diff --git a/src/rt/util/array.d b/src/rt/util/array.d index 25449b3549b..f2990524441 100644 --- a/src/rt/util/array.d +++ b/src/rt/util/array.d @@ -9,7 +9,7 @@ Source: $(DRUNTIMESRC src/rt/util/_array.d) module rt.util.array; -import rt.util.string; +import core.internal.string; @safe /* pure dmd @@@BUG11461@@@ */ nothrow: @@ -36,13 +36,13 @@ private void _enforceSameLength(in char[] action, if(length1 == length2) return; - SizeStringBuff tmpBuff = void; + UnsignedStringBuf tmpBuff = void; string msg = "Array lengths don't match for "; msg ~= action; msg ~= ": "; - msg ~= length1.sizeToTempString(tmpBuff); + msg ~= length1.unsignedToTempString(tmpBuff, 10); msg ~= " != "; - msg ~= length2.sizeToTempString(tmpBuff); + msg ~= length2.unsignedToTempString(tmpBuff, 10); throw new Error(msg); } @@ -54,12 +54,12 @@ private void _enforceNoOverlap(in char[] action, return; const overlappedBytes = bytes - d; - SizeStringBuff tmpBuff = void; + UnsignedStringBuf tmpBuff = void; string msg = "Overlapping arrays in "; msg ~= action; msg ~= ": "; - msg ~= overlappedBytes.sizeToTempString(tmpBuff); + msg ~= overlappedBytes.unsignedToTempString(tmpBuff, 10); msg ~= " byte(s) overlap of "; - msg ~= bytes.sizeToTempString(tmpBuff); + msg ~= bytes.unsignedToTempString(tmpBuff, 10); throw new Error(msg); } diff --git a/src/rt/util/string.d b/src/rt/util/string.d deleted file mode 100644 index 044d79229ff..00000000000 --- a/src/rt/util/string.d +++ /dev/null @@ -1,74 +0,0 @@ -/** - * String manipulation and comparison utilities. - * - * Copyright: Copyright Sean Kelly 2005 - 2009. - * License: $(WEB www.boost.org/LICENSE_1_0.txt, Boost License 1.0). - * Authors: Sean Kelly - */ - -/* Copyright Sean Kelly 2005 - 2009. - * Distributed under the Boost Software License, Version 1.0. - * (See accompanying file LICENSE or copy at - * http://www.boost.org/LICENSE_1_0.txt) - */ -module rt.util.string; - -private import core.stdc.string; - -@trusted: -pure: -nothrow: - -alias UintStringBuff = char[10]; -alias UlongStringBuff = char[20]; - -version(D_LP64) - alias SizeStringBuff = UlongStringBuff; -else - alias SizeStringBuff = UintStringBuff; - -char[] uintToTempString(in uint val, char[] buff) -{ return val._unsignedToTempString(buff); } - -char[] ulongToTempString(in ulong val, char[] buff) -{ return val._unsignedToTempString(buff); } - -char[] sizeToTempString(in size_t val, char[] buff) -{ return val._unsignedToTempString(buff); } - -private char[] _unsignedToTempString(T)(in T val, char[] buff) -if(is(T == uint) || is(T == ulong)) -{ - assert(buff.length >= (is(T == uint) ? 10 : 20), "Buffer is too small for `" ~ T.stringof ~ "`."); - - char* p = buff.ptr + buff.length; - T k = val; - do - *--p = cast(char) (k % 10 + '0'); - while(k /= 10); - - return buff[p - buff.ptr .. $]; -} - -unittest -{ - UlongStringBuff buff; - assert(1.uintToTempString(buff) == "1"); - assert(12.ulongToTempString(buff) == "12"); - assert(long.sizeof.sizeToTempString(buff) == "8"); - assert(uint.max.uintToTempString(buff) == "4294967295"); - assert(ulong.max.ulongToTempString(buff) == "18446744073709551615"); -} - - -int dstrcmp( in char[] s1, in char[] s2 ) -{ - int ret = 0; - auto len = s1.length; - if( s2.length < len ) - len = s2.length; - if( 0 != (ret = memcmp( s1.ptr, s2.ptr, len )) ) - return ret; - return s1.length > s2.length ? 1 : - s1.length == s2.length ? 0 : -1; -} diff --git a/win32.mak b/win32.mak index 1cf453ff622..b19963395aa 100644 --- a/win32.mak +++ b/win32.mak @@ -256,6 +256,9 @@ $(IMPDIR)\core\internal\convert.d : src\core\internal\convert.d $(IMPDIR)\core\internal\hash.d : src\core\internal\hash.d copy $** $@ +$(IMPDIR)\core\internal\string.d : src\core\internal\string.d + copy $** $@ + $(IMPDIR)\core\internal\traits.d : src\core\internal\traits.d copy $** $@ diff --git a/win64.mak b/win64.mak index b8f2cb8201a..e324a161976 100644 --- a/win64.mak +++ b/win64.mak @@ -266,6 +266,9 @@ $(IMPDIR)\core\internal\convert.d : src\core\internal\convert.d $(IMPDIR)\core\internal\hash.d : src\core\internal\hash.d copy $** $@ +$(IMPDIR)\core\internal\string.d : src\core\internal\string.d + copy $** $@ + $(IMPDIR)\core\internal\traits.d : src\core\internal\traits.d copy $** $@