libpurple/plugins/perl/perl-common.c

branch
soc.2013.gobjectification
changeset 34779
98c540811600
parent 33892
ef97228bc5f0
child 34784
d0eafa17c727
equal deleted inserted replaced
34778:01d983ce883d 34779:98c540811600
1 #include "debug.h" 1 #include "debug.h"
2 #include "value.h"
3 2
4 #include "perl-common.h" 3 #include "perl-common.h"
5 4
6 extern PerlInterpreter *my_perl; 5 extern PerlInterpreter *my_perl;
7 6
377 return TRUE; 376 return TRUE;
378 } 377 }
379 #endif 378 #endif
380 379
381 void * 380 void *
382 purple_perl_data_from_sv(PurpleValue *value, SV *sv) 381 purple_perl_data_from_sv(GType type, SV *sv)
383 { 382 {
384 383 if (type == G_TYPE_BOOLEAN)
385 switch (purple_value_get_type(value)) { 384 return (void *)SvIV(sv);
386 case PURPLE_TYPE_BOOLEAN: return (void *)SvIV(sv); 385 else if (type == G_TYPE_INT)
387 case PURPLE_TYPE_INT: return (void *)SvIV(sv); 386 return (void *)SvIV(sv);
388 case PURPLE_TYPE_UINT: return (void *)SvUV(sv); 387 else if (type == G_TYPE_UINT)
389 case PURPLE_TYPE_LONG: return (void *)SvIV(sv); 388 return (void *)SvUV(sv);
390 case PURPLE_TYPE_ULONG: return (void *)SvUV(sv); 389 else if (type == G_TYPE_LONG)
391 case PURPLE_TYPE_INT64: return (void *)SvIV(sv); 390 return (void *)SvIV(sv);
392 case PURPLE_TYPE_UINT64: return (void *)SvUV(sv); 391 else if (type == G_TYPE_ULONG)
393 case PURPLE_TYPE_STRING: return g_strdup(SvPVutf8_nolen(sv)); 392 return (void *)SvUV(sv);
394 case PURPLE_TYPE_POINTER: return (void *)SvIV(sv); 393 else if (type == G_TYPE_INT64)
395 case PURPLE_TYPE_BOXED: return (void *)SvIV(sv); 394 return (void *)SvIV(sv);
396 395 else if (type == G_TYPE_UINT64)
397 default: 396 return (void *)SvUV(sv);
398 return NULL; 397 else if (type == G_TYPE_STRING)
399 } 398 return g_strdup(SvPVutf8_nolen(sv));
399 else if (type == G_TYPE_POINTER)
400 return (void *)SvIV(sv);
401 else if (type == G_TYPE_BOXED)
402 return (void *)SvIV(sv);
400 403
401 return NULL; 404 return NULL;
402 } 405 }
403 406
404 static SV * 407 static SV *
405 purple_perl_sv_from_subtype(const PurpleValue *value, void *arg) 408 purple_perl_sv_from_purple_type(const GType type, void *arg)
406 { 409 {
407 const char *stash = "Purple"; /* ? */ 410 const char *stash = "Purple"; /* ? */
408 411
409 switch (purple_value_get_subtype(value)) { 412 switch (purple_value_get_subtype(value)) {
410 case PURPLE_SUBTYPE_ACCOUNT: 413 case PURPLE_SUBTYPE_ACCOUNT:
471 474
472 return sv_2mortal(purple_perl_bless_object(arg, stash)); 475 return sv_2mortal(purple_perl_bless_object(arg, stash));
473 } 476 }
474 477
475 SV * 478 SV *
476 purple_perl_sv_from_vargs(const PurpleValue *value, va_list *args, void ***copy_arg) 479 purple_perl_sv_from_vargs(const GType type, va_list *args, void ***copy_arg)
477 { 480 {
478 if (purple_value_is_outgoing(value)) { 481 if (purple_value_is_outgoing(value)) {
479 switch (purple_value_get_type(value)) { 482 switch (purple_value_get_type(value)) {
480 case PURPLE_TYPE_SUBTYPE: 483 case PURPLE_TYPE_SUBTYPE:
481 if ((*copy_arg = va_arg(*args, void **)) == NULL) 484 if ((*copy_arg = va_arg(*args, void **)) == NULL)
482 return &PL_sv_undef; 485 return &PL_sv_undef;
483 486
484 return purple_perl_sv_from_subtype(value, *(void **)*copy_arg); 487 return purple_perl_sv_from_purple_type(type, *(void **)*copy_arg);
485 488
486 case PURPLE_TYPE_BOOLEAN: 489 case PURPLE_TYPE_BOOLEAN:
487 if ((*copy_arg = (void *)va_arg(*args, gboolean *)) == NULL) 490 if ((*copy_arg = (void *)va_arg(*args, gboolean *)) == NULL)
488 return &PL_sv_undef; 491 return &PL_sv_undef;
489 492
555 switch (purple_value_get_type(value)) { 558 switch (purple_value_get_type(value)) {
556 case PURPLE_TYPE_SUBTYPE: 559 case PURPLE_TYPE_SUBTYPE:
557 if ((*copy_arg = va_arg(*args, void *)) == NULL) 560 if ((*copy_arg = va_arg(*args, void *)) == NULL)
558 return &PL_sv_undef; 561 return &PL_sv_undef;
559 562
560 return purple_perl_sv_from_subtype(value, *copy_arg); 563 return purple_perl_sv_from_purple_type(type, *copy_arg);
561 564
562 case PURPLE_TYPE_BOOLEAN: 565 case PURPLE_TYPE_BOOLEAN:
563 *copy_arg = GINT_TO_POINTER( va_arg(*args, gboolean) ); 566 *copy_arg = GINT_TO_POINTER( va_arg(*args, gboolean) );
564 567
565 return newSViv((gboolean)GPOINTER_TO_INT(*copy_arg)); 568 return newSViv((gboolean)GPOINTER_TO_INT(*copy_arg));

mercurial