typedef Edje_Message_String_Set EdjeMessageStringSet;
should instead be:
typedef struct _Edje_Message_String_Set EdjeMessageStringSet;
####
message = malloc(sizeof(Edje_Message_String) + count * sizeof(char *));
##
##
message = malloc(sizeof(EdjeMessageStringSet));
or
New(0, message, 1, EdjeMessageStringSet);
or (in modern perl)
Newx(message, 1, EdjeMessageStringSet);
##
##
# struct.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[1];
};
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(char * class, int count, AV * val_arr) {
/*
Can't be accessed directly from
perl unless a typemap is provided
*/
EdjeMessageStringSet *message;
int index;
char *string;
STRLEN len;
Newx(message, 1, EdjeMessageStringSet);
if(message == NULL)
croak("Failed to allocate memory in _new function");
/* do other stuff ... */
printf("returning EdjeMessageStringSet* from _new\n");
return message;
}
void DESTROY(EdjeMessageStringSet * x) {
/*
Can't be accessed directly from
perl unless a typemap is provided.
Must currently be explicitly called as
the EdjeMessageStringSet* object is
currently "unblessed".
*/
Safefree(x);
printf("destroyed _new EdjeMessageStringSet*\n");
}
void foo(char * pv, int in, AV * arref) {
EdjeMessageStringSet *m;
m = _new(pv, in, arref);
DESTROY(m);
}
EOC
struct_size();
foo("hello world", 2, [1, 2]);
##
##
Size of _Edje_Message_String_Set struct: 16
returning EdjeMessageStringSet* from _new
destroyed _new EdjeMessageStringSet*