Thread overview
D processing a char* allocated by a C module
Jun 20, 2007
Carlos Smith
Jun 20, 2007
Kirk McDonald
Jun 20, 2007
Carlos Smith
Jun 20, 2007
0ffh
Jun 21, 2007
BCS
Jun 21, 2007
0ffh
June 20, 2007
Hi !

I have a C module, compiled with DMC.
Coming from this C module:

extern (C)
{
  int ccleng;     // strlen(cctext)
  int pos;
  char *cctext;   // point into an input buffer
  int yylex();
}

cctext is a pointer to a buffer allocated by yylex().
the buffer is small and can be freed or overwritten
by yylex();

In the D module, i do:

char[] dtext = toString(cclex);

and dtext get corrupted (not always).

I guess toString do not make a new copy of cctext,
just point to it.

How can i duplicate cctext, in D ? (strdup does not exist ?)
Will the D copy be garbage collected ?

Thanks


June 20, 2007
Carlos Smith wrote:
> Hi !
> 
> I have a C module, compiled with DMC.
> Coming from this C module:
> 
> extern (C)
> {
>   int ccleng;     // strlen(cctext)
>   int pos;
>   char *cctext;   // point into an input buffer
>   int yylex();
> }
> 
> cctext is a pointer to a buffer allocated by yylex().
> the buffer is small and can be freed or overwritten
> by yylex();
> 
> In the D module, i do:
> 
> char[] dtext = toString(cclex);
> 
> and dtext get corrupted (not always).
> 
> I guess toString do not make a new copy of cctext,
> just point to it.
> 
> How can i duplicate cctext, in D ? (strdup does not exist ?)

char[] dtext = toString(cclex).dup;

> Will the D copy be garbage collected ?
> 

Yes.

-- 
Kirk McDonald
http://kirkmcdonald.blogspot.com
Pyd: Connecting D and Python
http://pyd.dsource.org
June 20, 2007
"Carlos Smith" <carlos-smith@sympatico.ca> wrote in message news:f5bvrr$2ui6$1@digitalmars.com...
> Hi !
>
> I have a C module, compiled with DMC.
> Coming from this C module:
>
> extern (C)
> {
>  int ccleng;     // strlen(cctext)
>  int pos;
>  char *cctext;   // point into an input buffer
>  int yylex();
> }
>
> cctext is a pointer to a buffer allocated by yylex().
> the buffer is small and can be freed or overwritten
> by yylex();
>
> In the D module, i do:
>
> char[] dtext = toString(cclex);
>
> and dtext get corrupted (not always).
>
> I guess toString do not make a new copy of cctext,
> just point to it.
>
> How can i duplicate cctext, in D ? (strdup does not exist ?)
> Will the D copy be garbage collected ?

Slice and dup!

char[] dtext = cctext[0 .. ccleng].dup;

You can slice pointers to turn them into D arrays, and then you can .dup them to copy the array into a new array.  This duplicated array will not be overwritten by yylex() and will be garbage collected.


June 20, 2007
"Kirk McDonald" <kirklin.mcdonald@gmail.com> wrote in message news:f5c3ko$3vh$1@digitalmars.com...

NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooo........


June 20, 2007
"Jarrett Billingsley" <kb3ctd2@yahoo.com> wrote in message
news:f5c3nr$47l$1@digitalmars.com...
: "Kirk McDonald" <kirklin.mcdonald@gmail.com> wrote in
message
: news:f5c3ko$3vh$1@digitalmars.com...
:
: NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooo........
:

Thanks to both of you !

But, i am sorry to say that i dont understand that NO...

What does it means ?

Are you saying that Kirk is wrong ?
Or is it a form of humour ?

June 20, 2007
Carlos Smith wrote:
> But, i am sorry to say that i dont understand that NO...
> 
> What does it means ?
> 
> Are you saying that Kirk is wrong ?
> Or is it a form of humour ?

I think he was pwned.... :)

Regards, Frank
June 21, 2007
0ffh wrote:
> Carlos Smith wrote:
> 
>> But, i am sorry to say that i dont understand that NO...
>>
>> What does it means ?
>>
>> Are you saying that Kirk is wrong ?
>> Or is it a form of humour ?
> 
> 
> I think he was pwned.... :)
> 
> Regards, Frank

in his favor, Mr. Billingsley version saves a function call and doesn't need to probe for the end-of-string.
June 21, 2007
"Carlos Smith" <carlos-smith@sympatico.ca> wrote in message news:f5c4bj$5bp$1@digitalmars.com...
> But, i am sorry to say that i dont understand that NO...
>
> What does it means ?
>
> Are you saying that Kirk is wrong ?
> Or is it a form of humour ?

We just posted at almost exactly the same time with almost exactly the same answer, that's all :)


June 21, 2007
BCS wrote:
> in his favor, Mr. Billingsley version saves a function call and doesn't need to probe for the end-of-string.

You're right, let's call it a performance-typing tradeoff... :)

Regards, Frank