On Fri, Nov 07, 2008 at 03:28:40PM -0700, chromatic wrote:
> On Friday 22 June 2007 02:07:32 Nicholas Clark wrote:
>
> > > We have a lot of string_from_cstring() calls with constant second
> > > parameters and third parameters of 0 that could use updating. There's no
> > > sense in calling strlen() all the time.
>
> > I think that you need something like this
> >
> > /* concatenating with "" ensures that only literal strings are accepted as
> > argument */ #define STR_WITH_LEN(s) (s ""), (sizeof(s)-1)
> >
> > /* STR_WITH_LEN() shortcuts */
> > #define newSVpvs(str) Perl_newSVpvn(aTHX_ STR_WITH_LEN(str))
>
> I'm not sure that's what I was asking.
>
> string_from_cstring()'s third parameter can be either the length of the
> string
> or zero. If it's zero, the function will call strlen() to get the string's
> length.
>
> If we're passing in a string literal, it seems silly to pass in a length of
> 0,
> as we're recalculating a constant on every call. I don't see that this macro
> fixes that.
long(er) hand, one would write
string_from_cstring(INTERP, STR_WITH_LEN("Bool"));
but that's a bit obfuscated, because the macro really is a text substitution
that returns 2 values separated by a comma. And quite deliberately not wrapped
in ().
So the next step is to make another macro that behaves like a conventional
function:
#define string_from_cstring_constant(I, S) \
string_from_cstring(I, STR_WITH_LEN(S))
or something like that, so that the messiness is all in one header. At which
point
string_from_cstring_constant(INTERP, "Bool");
looks like a regular function call, but is optimally efficient.
(Although names that long will start to scare the VMS porters, as it's getting
close to 32 characters)
> I do agree that updating strings and string lengths can be tedious, but I'm
> not aware of any C89-compliant solution to keep the two synchronized.
If I've explained it clearly, then I think that it meets your requirements.
No strlen() call, but the correct length. And a syntax error from the compiler
if someone mistakenly passes in anything other than a string constant.
Nicholas Clark