plugins/perl/perl-common.c

changeset 6920
4f4931b005cb
parent 6898
e58d18e13126
child 6921
3d49b89fc920
equal deleted inserted replaced
6919:2fd7ce2393f7 6920:4f4931b005cb
354 354
355 return TRUE; 355 return TRUE;
356 } 356 }
357 #endif 357 #endif
358 358
359 void *
360 gaim_perl_data_from_sv(GaimValue *value, SV *sv)
361 {
362 STRLEN na;
363
364 switch (gaim_value_get_type(value))
365 {
366 case GAIM_TYPE_BOOLEAN: return (void *)SvIV(sv);
367 case GAIM_TYPE_INT: return (void *)SvIV(sv);
368 case GAIM_TYPE_UINT: return (void *)SvUV(sv);
369 case GAIM_TYPE_LONG: return (void *)SvIV(sv);
370 case GAIM_TYPE_ULONG: return (void *)SvUV(sv);
371 case GAIM_TYPE_INT64: return (void *)SvIV(sv);
372 case GAIM_TYPE_UINT64: return (void *)SvUV(sv);
373 case GAIM_TYPE_STRING: return (void *)SvPV(sv, na);
374 case GAIM_TYPE_POINTER: return (void *)SvIV(sv);
375 case GAIM_TYPE_BOXED: return (void *)SvIV(sv);
376
377 default:
378 return NULL;
379 }
380
381 return NULL;
382 }
383
359 static SV * 384 static SV *
360 gaim_perl_sv_from_subtype(const GaimValue *value, void *arg) 385 gaim_perl_sv_from_subtype(const GaimValue *value, void *arg)
361 { 386 {
362 const char *stash = NULL; 387 const char *stash = NULL;
363 388
379 404
380 return sv_2mortal(gaim_perl_bless_object(arg, stash)); 405 return sv_2mortal(gaim_perl_bless_object(arg, stash));
381 } 406 }
382 407
383 SV * 408 SV *
384 gaim_perl_sv_from_vargs(const GaimValue *value, va_list args) 409 gaim_perl_sv_from_vargs(const GaimValue *value, va_list *args,
410 void **copy_arg)
385 { 411 {
386 if (gaim_value_is_outgoing(value)) 412 if (gaim_value_is_outgoing(value))
387 { 413 {
388 switch (gaim_value_get_type(value)) 414 switch (gaim_value_get_type(value))
389 { 415 {
390 case GAIM_TYPE_SUBTYPE: 416 case GAIM_TYPE_SUBTYPE:
391 return gaim_perl_sv_from_subtype(value, *va_arg(args, void **)); 417 if ((*copy_arg = va_arg(*args, void **)) == NULL)
418 return &PL_sv_undef;
419
420 return gaim_perl_sv_from_subtype(value, *(void **)*copy_arg);
392 421
393 case GAIM_TYPE_BOOLEAN: 422 case GAIM_TYPE_BOOLEAN:
394 return newSViv(*va_arg(args, gboolean *)); 423 if ((*copy_arg = va_arg(*args, gboolean *)) == NULL)
424 return &PL_sv_undef;
425
426 return newSViv(*(gboolean *)*copy_arg);
395 427
396 case GAIM_TYPE_INT: 428 case GAIM_TYPE_INT:
397 return newSViv(*va_arg(args, int *)); 429 if ((*copy_arg = va_arg(*args, int *)) == NULL)
430 return &PL_sv_undef;
431
432 return newSViv(*(int *)*copy_arg);
398 433
399 case GAIM_TYPE_UINT: 434 case GAIM_TYPE_UINT:
400 return newSVuv(*va_arg(args, unsigned int *)); 435 if ((*copy_arg = va_arg(*args, unsigned int *)) == NULL)
436 return &PL_sv_undef;
437
438 return newSVuv(*(unsigned int *)*copy_arg);
401 439
402 case GAIM_TYPE_LONG: 440 case GAIM_TYPE_LONG:
403 return newSViv(*va_arg(args, long *)); 441 if ((*copy_arg = va_arg(*args, long *)) == NULL)
442 return &PL_sv_undef;
443
444 return newSViv(*(long *)*copy_arg);
404 445
405 case GAIM_TYPE_ULONG: 446 case GAIM_TYPE_ULONG:
406 return newSVuv(*va_arg(args, unsigned long *)); 447 if ((*copy_arg = va_arg(*args, unsigned long *)) == NULL)
448 return &PL_sv_undef;
449
450 return newSVuv(*(unsigned long *)*copy_arg);
407 451
408 case GAIM_TYPE_INT64: 452 case GAIM_TYPE_INT64:
409 return newSViv(*va_arg(args, gint64 *)); 453 if ((*copy_arg = va_arg(*args, gint64 *)) == NULL)
454 return &PL_sv_undef;
455
456 return newSViv(*(gint64 *)*copy_arg);
410 457
411 case GAIM_TYPE_UINT64: 458 case GAIM_TYPE_UINT64:
412 return newSVuv(*va_arg(args, guint64 *)); 459 if ((*copy_arg = va_arg(*args, guint64 *)) == NULL)
460 return &PL_sv_undef;
461
462 return newSVuv(*(guint64 *)*copy_arg);
413 463
414 case GAIM_TYPE_STRING: 464 case GAIM_TYPE_STRING:
415 return newSVGChar(*va_arg(args, char **)); 465 if ((*copy_arg = va_arg(*args, char **)) == NULL)
466 return &PL_sv_undef;
467
468 return newSVGChar(*(char **)*copy_arg);
416 469
417 case GAIM_TYPE_POINTER: 470 case GAIM_TYPE_POINTER:
418 return newSViv((IV)*va_arg(args, void **)); 471 if ((*copy_arg = va_arg(*args, void **)) == NULL)
472 return &PL_sv_undef;
473
474 return newSViv((IV)*(void **)*copy_arg);
419 475
420 case GAIM_TYPE_BOXED: 476 case GAIM_TYPE_BOXED:
421 /* Uh.. I dunno. Try this? */ 477 /* Uh.. I dunno. Try this? */
478 if ((*copy_arg = va_arg(*args, void **)) == NULL)
479 return &PL_sv_undef;
480
422 return sv_2mortal(gaim_perl_bless_object( 481 return sv_2mortal(gaim_perl_bless_object(
423 va_arg(args, void **), 482 *(void **)*copy_arg,
424 gaim_value_get_specific_type(value))); 483 gaim_value_get_specific_type(value)));
425 484
426 default: 485 default:
427 /* If this happens, things are going to get screwed up... */ 486 /* If this happens, things are going to get screwed up... */
428 return NULL; 487 return NULL;
431 else 490 else
432 { 491 {
433 switch (gaim_value_get_type(value)) 492 switch (gaim_value_get_type(value))
434 { 493 {
435 case GAIM_TYPE_SUBTYPE: 494 case GAIM_TYPE_SUBTYPE:
436 return gaim_perl_sv_from_subtype(value, va_arg(args, void *)); 495 if ((*copy_arg = va_arg(*args, void *)) == NULL)
496 return &PL_sv_undef;
497
498 return gaim_perl_sv_from_subtype(value, *copy_arg);
437 499
438 case GAIM_TYPE_BOOLEAN: 500 case GAIM_TYPE_BOOLEAN:
439 return newSViv(va_arg(args, gboolean)); 501 *copy_arg = (void *)va_arg(*args, gboolean);
502
503 return newSViv((gboolean)*copy_arg);
440 504
441 case GAIM_TYPE_INT: 505 case GAIM_TYPE_INT:
442 return newSViv(va_arg(args, int)); 506 *copy_arg = (void *)va_arg(*args, int);
507
508 return newSViv((int)*copy_arg);
443 509
444 case GAIM_TYPE_UINT: 510 case GAIM_TYPE_UINT:
445 return newSVuv(va_arg(args, unsigned int)); 511 *copy_arg = (void *)va_arg(*args, unsigned int);
512
513 return newSVuv((unsigned int)*copy_arg);
446 514
447 case GAIM_TYPE_LONG: 515 case GAIM_TYPE_LONG:
448 return newSViv(va_arg(args, long)); 516 *copy_arg = (void *)va_arg(*args, long);
517
518 return newSViv((long)*copy_arg);
449 519
450 case GAIM_TYPE_ULONG: 520 case GAIM_TYPE_ULONG:
451 return newSVuv(va_arg(args, unsigned long)); 521 *copy_arg = (void *)va_arg(*args, unsigned long);
522
523 return newSVuv((unsigned long)*copy_arg);
452 524
453 case GAIM_TYPE_INT64: 525 case GAIM_TYPE_INT64:
454 return newSViv(va_arg(args, gint64)); 526 #if 0
527 /* XXX This yells and complains. */
528 *copy_arg = va_arg(*args, gint64);
529
530 return newSViv(*copy_arg);
531 #endif
532 break;
455 533
456 case GAIM_TYPE_UINT64: 534 case GAIM_TYPE_UINT64:
457 return newSVuv(va_arg(args, guint64)); 535 /* XXX This also yells and complains. */
536 #if 0
537 *copy_arg = (void *)va_arg(*args, guint64);
538
539 return newSVuv(*copy_arg);
540 #endif
541 break;
458 542
459 case GAIM_TYPE_STRING: 543 case GAIM_TYPE_STRING:
460 return newSVGChar(va_arg(args, char *)); 544 if ((*copy_arg = (void *)va_arg(*args, char *)) == NULL)
545 return &PL_sv_undef;
546
547 return newSVGChar(*copy_arg);
461 548
462 case GAIM_TYPE_POINTER: 549 case GAIM_TYPE_POINTER:
463 return newSViv((IV)va_arg(args, void *)); 550 if ((*copy_arg = (void *)va_arg(*args, void *)) == NULL)
551 return &PL_sv_undef;
552
553 return newSViv((IV)*copy_arg);
464 554
465 case GAIM_TYPE_BOXED: 555 case GAIM_TYPE_BOXED:
466 /* Uh.. I dunno. Try this? */ 556 /* Uh.. I dunno. Try this? */
467 return sv_2mortal(gaim_perl_bless_object( 557 if ((*copy_arg = (void *)va_arg(*args, void *)) == NULL)
468 va_arg(args, void *), 558 return &PL_sv_undef;
559
560 return sv_2mortal(gaim_perl_bless_object(*copy_arg,
469 gaim_value_get_specific_type(value))); 561 gaim_value_get_specific_type(value)));
470 562
471 default: 563 default:
472 /* If this happens, things are going to get screwed up... */ 564 /* If this happens, things are going to get screwed up... */
473 return NULL; 565 return NULL;
474 } 566 }
475 } 567 }
476 } 568
569 return NULL;
570 }

mercurial