Once I start, I can't stop ;-)
I still don't know how to deal with:
struct _Edje_Message_String_Set
{
int count;
char * str[];
};
Is it possible to handle that ?
However, for:
struct _Edje_Message_String_Set
{
int count;
char ** str;
};
I have:
# struct_char.pl #
use strict;
use warnings;
use Inline C => Config =>
BUILD_NOISY => 1,
CLEAN_AFTER_BUILD => 0,
USING => 'ParseRegExp',
;
use Inline C => <<'EOC';
struct _Edje_Message_String_Set
{
int count;
char ** str;
};
typedef struct _Edje_Message_String_Set EdjeMessageStringSet;
void struct_size(void) {
printf("Size of _Edje_Message_String_Set struct: %d\n",
sizeof(EdjeMessageStringSet) );
}
EdjeMessageStringSet * _new(AV * val_arr) {
EdjeMessageStringSet *message;
int i;
SV ** elem;
Newx(message, 1, EdjeMessageStringSet);
if(message == NULL)
croak("Failed to allocate memory in _new function");
message->count = av_len(val_arr) + 1;
Newx(message->str, message->count, char*);
for(i = 0; i < message->count; i++) {
elem = av_fetch(val_arr, i, 0);
message->str[i] = SvPV_nolen(*elem);
}
return message;
}
void _iterate(EdjeMessageStringSet * strs) {
int i;
for(i = 0; i < strs->count; i++) {
printf("%s\n", strs->str[i]);
}
}
void DESTROY(EdjeMessageStringSet * x) {
Safefree(x->str);
printf("Safefreed EdjeMessageStringSet object->str\n");
Safefree(x);
printf("Safefreed EdjeMessageStringSet object\n");
}
void foo(AV * arref) {
EdjeMessageStringSet *m;
m = _new(arref);
_iterate(m);
DESTROY(m);
}
EOC
struct_size();
my @in = ("hello foo", "hello bar","hello world", "goodbye", '1', '2',
+ '3');
# The XSub foo() will create a new EdjeMessageStringSet object
# using _new(), then pass that object to _iterate() which
# prints out all of the strings contained in the object.
# Finally, foo() calls DESTROY() which frees the memory that
# was assigned to create the EdjeMessageStringSet object.
foo(\@in);
Which (after compiling) outputs:
Size of _Edje_Message_String_Set struct: 16
hello foo
hello bar
hello world
goodbye
1
2
3
Safefreed EdjeMessageStringSet object->str
Safefreed EdjeMessageStringSet object
Cheers,
Rob
-
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.