struct _Edje_Message_String_Set
{
int count;
char * str[];
};
####
struct _Edje_Message_String_Set
{
int count;
char ** str;
};
##
##
# 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);
##
##
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