Dear Rob,
Thank you so much for your hint with Inline:C. I will try this at the next opportunity
I don't know why, but I solved my problem with the following:
_new(class,count, val_arr)
char *class
int count
AV *val_arr
PREINIT:
EdjeMessageStringSet *message;
int index;
SV *tmp;
char *string;
STRLEN len;
CODE:
Newx(message,1,EdjeMessageStringSet);
Renewc(message,count+2, char*,EdjeMessageStringSet);
if (message == NULL)
croak("Failed to allocate memory in _new function\n");
message->count = count+1;
for (index = 0; index <= count; index++) {
tmp = *av_fetch(val_arr,index,0);
string = SvPVutf8(tmp,len);
message->str[index] = savepvn(string,len);
}
RETVAL = message;
OUTPUT:
RETVAL
I have to allocate memory for the Edje_Message_String_Set struct and for the array of strings, because it is only at runtime visible, how many strings are in the array. In C this goes through malloc(sizeof(Edje_Message_String_Set) + count * sizeof(char*)). In Perl this works with the Renewc function. The only thing I don't understand is, why I had to reallocate count+1 items of char*. It should be count+1 :-S (because count starts at 1, and the index of the given Perl array starts at 0). (in a C example there is even malloced count-1 * sizeof(char*)...). But whatever, I am happy that it works now...
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.