October 02, 2012 Re: Idea: Introduce zero-terminated string specifier | ||||
---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | On 10/1/2012 7:22 PM, Steven Schveighoffer wrote: > However, we can't require an import to use a bizarre > specifier, and you can't link un@safe code to a specifier, so the zstr > concept is far superior in requiring the user to know what he is doing, > and having the compiler enforce that. Yup. > Does it make sense for Phobos to provide such a shortcut in an obscure > header somewhere? Like std.cstring? Or should we just say "roll your own > if you need it"? As a matter of principle, I really don't like gobs of Phobos functions that are literally one liners. Phobos should not become a mile wide but inch deep library of trivia. It should consist of non-trivial, useful, and relatively deep functions. |
October 02, 2012 Re: Idea: Introduce zero-terminated string specifier | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andrej Mitrovic | Andrej Mitrovic wrote:
> On 10/1/12, Piotr Szturmaj <bncrbme@jadamspam.pl> wrote:
>> For example C binding writers may change:
>>
>> extern(C) char* getstr();
>>
>> to
>>
>> extern(C) cstring getstr();
>
> I don't think you can reliably do that because of semantics w.r.t.
> passing parameters on the stack vs in registers based on whether a
> type is a pointer or not. I've had this sort of bug when wrapping C++
> where the C++ compiler was passing a parameter in one way but the D
> compiler expected the parameters to be passed, simply because I tried
> to be clever and fake a return type. See:
> http://forum.dlang.org/thread/mailman.1547.1346632732.31962.d.gnu@puremagic.com#post-mailman.1557.1346690320.31962.d.gnu:40puremagic.com
I think that align(1) structs that wrap a single value should be treated as its type. After all they have the same size and representation. I don't know how this works now, though.
|
October 02, 2012 Re: Idea: Introduce zero-terminated string specifier | ||||
---|---|---|---|---|
| ||||
Posted in reply to Walter Bright | On 10/2/12 4:09 AM, Walter Bright wrote:
> On 10/1/2012 7:22 PM, Steven Schveighoffer wrote:
>> Does it make sense for Phobos to provide such a shortcut in an obscure
>> header somewhere? Like std.cstring? Or should we just say "roll your own
>> if you need it"?
>
> As a matter of principle, I really don't like gobs of Phobos functions
> that are literally one liners. Phobos should not become a mile wide but
> inch deep library of trivia. It should consist of non-trivial, useful,
> and relatively deep functions.
Well there are some possible reasons. Clearly useful functionality that's nontrivial deserves being abstracted in a function. On the other hand, even a short function is valuable if frequent enough and deserving of a name. We have e.g. s.strip even though it's equivalent to s.stripLeft.stripRight.
Andrei
|
October 02, 2012 Re: Idea: Introduce zero-terminated string specifier | ||||
---|---|---|---|---|
| ||||
Posted in reply to Vladimir Panteleev | Le 01/10/2012 22:33, Vladimir Panteleev a écrit :
> On Monday, 1 October 2012 at 12:12:52 UTC, deadalnix wrote:
>> Le 01/10/2012 13:29, Vladimir Panteleev a écrit :
>>> On Monday, 1 October 2012 at 10:56:36 UTC, deadalnix wrote:
>>>> How does to!string know that the string is 0 terminated ?
>>>
>>> By convention (it doesn't).
>>
>> It is unsafe as hell oO
>
> Forcing the programmer to put strlen calls everywhere in his code is not
> any safer.
I make the library safer. If the programmer manipulate unsafe construct (like c strings) it is up to the programmer to ensure safety, not the lib.
|
October 02, 2012 Re: Idea: Introduce zero-terminated string specifier | ||||
---|---|---|---|---|
| ||||
Posted in reply to Walter Bright | Le 02/10/2012 03:13, Walter Bright a écrit :
> On 9/30/2012 11:31 AM, deadalnix wrote:
>> If you know that a string is 0 terminated, you can easily create a slice
>> from it as follow :
>>
>> char* myZeroTerminatedString;
>> char[] myZeroTerminatedString[0 .. strlen(myZeroTerminatedString)];
>>
>> It is clean and avoid to modify the stdlib in an unsafe way.
>
>
> Of course, using strlen() is always going to be unsafe. But having %zs
> is equally unsafe for the same reason.
>
> deadalnix's example shows that adding a new format specifier %zs adds
> little value, but it gets much worse. Since %zs is inherently unsafe, it
> hides such unsafety in a commonly used library function, which will
> infect everything else that transitively calls writefln with unsafety.
>
> This makes %zs an unacceptable feature.
Exactly my point.
|
October 02, 2012 Re: Idea: Introduce zero-terminated string specifier | ||||
---|---|---|---|---|
| ||||
Posted in reply to Walter Bright | On Tue, 02 Oct 2012 04:09:43 -0400, Walter Bright <newshound1@digitalmars.com> wrote:
> On 10/1/2012 7:22 PM, Steven Schveighoffer wrote:
>> Does it make sense for Phobos to provide such a shortcut in an obscure
>> header somewhere? Like std.cstring? Or should we just say "roll your own
>> if you need it"?
>
> As a matter of principle, I really don't like gobs of Phobos functions that are literally one liners. Phobos should not become a mile wide but inch deep library of trivia. It should consist of non-trivial, useful, and relatively deep functions.
This, arguably, is one of the most important aspects of C to support. There are lots of C functions which provide C strings. Yes, we don't want to promote using C strings, but to have one point of conversion so you *can* use safe strings is a good thing. In other words, the sooner you convert your zero-terminated strings to char slices, the better off you are. And if we label it system code, it can't be misused in @safe code.
Why support zero-terminated strings as literals if it wasn't important? You could argue that things like system calls which return zero-terminated strings are as safe to use as string literals which you know have zero terminated values.
The only other alternative is to wrap those C functions with D ones that convert to char[]. I don't find this any more appealing.
-Steve
|
October 02, 2012 Re: Idea: Introduce zero-terminated string specifier | ||||
---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | On Tuesday, 2 October 2012 at 02:22:33 UTC, Steven Schveighoffer wrote:
> @system char[] zstr(char *s) { return s[0..strlen(s)]; }
>
> […]
>
> Does it make sense for Phobos to provide such a shortcut in an obscure header somewhere? Like std.cstring? Or should we just say "roll your own if you need it"?
I didn't look it up, so I could be making quite a fool of myself right now, but doesn't to!string(char*) provide exactly that?
David
|
October 02, 2012 Re: Idea: Introduce zero-terminated string specifier | ||||
---|---|---|---|---|
| ||||
Posted in reply to David Nadlinger | On Tue, 02 Oct 2012 15:17:42 -0400, David Nadlinger <see@klickverbot.at> wrote:
> On Tuesday, 2 October 2012 at 02:22:33 UTC, Steven Schveighoffer wrote:
>> @system char[] zstr(char *s) { return s[0..strlen(s)]; }
>>
>> […]
>>
>> Does it make sense for Phobos to provide such a shortcut in an obscure header somewhere? Like std.cstring? Or should we just say "roll your own if you need it"?
>
> I didn't look it up, so I could be making quite a fool of myself right now, but doesn't to!string(char*) provide exactly that?
string is immutable. Must allocate.
You fool :) just kidding, honest mistake.
-Steve
|
October 02, 2012 Re: Idea: Introduce zero-terminated string specifier | ||||
---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | On Tuesday, 2 October 2012 at 19:31:33 UTC, Steven Schveighoffer wrote:
> On Tue, 02 Oct 2012 15:17:42 -0400, David Nadlinger <see@klickverbot.at> wrote:
>
>> On Tuesday, 2 October 2012 at 02:22:33 UTC, Steven Schveighoffer wrote:
>>> @system char[] zstr(char *s) { return s[0..strlen(s)]; }
>>>
>>> […]
>>>
>>> Does it make sense for Phobos to provide such a shortcut in an obscure header somewhere? Like std.cstring? Or should we just say "roll your own if you need it"?
>>
>> I didn't look it up, so I could be making quite a fool of myself right now, but doesn't to!string(char*) provide exactly that?
>
> string is immutable. Must allocate.
>
> You fool :)
Well, make it to!char(char*) then! ;)
David
|
October 02, 2012 Re: Idea: Introduce zero-terminated string specifier | ||||
---|---|---|---|---|
| ||||
Posted in reply to David Nadlinger | On Tuesday, 2 October 2012 at 19:34:31 UTC, David Nadlinger wrote:
> Well, make it to!char(char*) then! ;)
Oh dear, this doesn't get better: Of course, I've meant to write »to!(char[])(char*)«.
David
|
Copyright © 1999-2021 by the D Language Foundation