| 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)); |