comparison plugins/perl/perl-common.c @ 6898:806f6e950e76

[gaim-migrate @ 7445] This should allow parameters with outgoing types (int *, char **, etc) in signals to work without appearing as garbage in perl. You still can't set them, though.. That's next. Untested! committer: Tailor Script <tailor@pidgin.im>
author Christian Hammond <chipx86@chipx86.com>
date Sat, 20 Sep 2003 22:27:31 +0000
parents 69e0a3e29aa1
children 13f78c350cd3
comparison
equal deleted inserted replaced
6897:69e0a3e29aa1 6898:806f6e950e76
381 } 381 }
382 382
383 SV * 383 SV *
384 gaim_perl_sv_from_vargs(const GaimValue *value, va_list args) 384 gaim_perl_sv_from_vargs(const GaimValue *value, va_list args)
385 { 385 {
386 switch (gaim_value_get_type(value)) 386 if (gaim_value_is_outgoing(value))
387 { 387 {
388 case GAIM_TYPE_SUBTYPE: 388 switch (gaim_value_get_type(value))
389 return gaim_perl_sv_from_subtype(value, va_arg(args, void *)); 389 {
390 390 case GAIM_TYPE_SUBTYPE:
391 case GAIM_TYPE_BOOLEAN: 391 return gaim_perl_sv_from_subtype(value, *va_arg(args, void **));
392 return newSViv(va_arg(args, gboolean)); 392
393 393 case GAIM_TYPE_BOOLEAN:
394 case GAIM_TYPE_INT: 394 return newSViv(*va_arg(args, gboolean *));
395 return newSViv(va_arg(args, int)); 395
396 396 case GAIM_TYPE_INT:
397 case GAIM_TYPE_UINT: 397 return newSViv(*va_arg(args, int *));
398 return newSVuv(va_arg(args, unsigned int)); 398
399 399 case GAIM_TYPE_UINT:
400 case GAIM_TYPE_LONG: 400 return newSVuv(*va_arg(args, unsigned int *));
401 return newSViv(va_arg(args, long)); 401
402 402 case GAIM_TYPE_LONG:
403 case GAIM_TYPE_ULONG: 403 return newSViv(*va_arg(args, long *));
404 return newSVuv(va_arg(args, unsigned long)); 404
405 405 case GAIM_TYPE_ULONG:
406 case GAIM_TYPE_INT64: 406 return newSVuv(*va_arg(args, unsigned long *));
407 return newSViv(va_arg(args, gint64)); 407
408 408 case GAIM_TYPE_INT64:
409 case GAIM_TYPE_UINT64: 409 return newSViv(*va_arg(args, gint64 *));
410 return newSVuv(va_arg(args, guint64)); 410
411 411 case GAIM_TYPE_UINT64:
412 case GAIM_TYPE_STRING: 412 return newSVuv(*va_arg(args, guint64 *));
413 return newSVGChar(va_arg(args, char *)); 413
414 414 case GAIM_TYPE_STRING:
415 case GAIM_TYPE_POINTER: 415 return newSVGChar(*va_arg(args, char **));
416 return newSViv((IV)va_arg(args, void *)); 416
417 417 case GAIM_TYPE_POINTER:
418 case GAIM_TYPE_BOXED: 418 return newSViv((IV)*va_arg(args, void **));
419 /* Uh.. I dunno. Try this? */ 419
420 return sv_2mortal(gaim_perl_bless_object( 420 case GAIM_TYPE_BOXED:
421 va_arg(args, void *), 421 /* Uh.. I dunno. Try this? */
422 gaim_value_get_specific_type(value))); 422 return sv_2mortal(gaim_perl_bless_object(
423 423 va_arg(args, void **),
424 default: 424 gaim_value_get_specific_type(value)));
425 /* If this happens, things are going to get screwed up... */ 425
426 return NULL; 426 default:
427 } 427 /* If this happens, things are going to get screwed up... */
428 } 428 return NULL;
429 }
430 }
431 else
432 {
433 switch (gaim_value_get_type(value))
434 {
435 case GAIM_TYPE_SUBTYPE:
436 return gaim_perl_sv_from_subtype(value, va_arg(args, void *));
437
438 case GAIM_TYPE_BOOLEAN:
439 return newSViv(va_arg(args, gboolean));
440
441 case GAIM_TYPE_INT:
442 return newSViv(va_arg(args, int));
443
444 case GAIM_TYPE_UINT:
445 return newSVuv(va_arg(args, unsigned int));
446
447 case GAIM_TYPE_LONG:
448 return newSViv(va_arg(args, long));
449
450 case GAIM_TYPE_ULONG:
451 return newSVuv(va_arg(args, unsigned long));
452
453 case GAIM_TYPE_INT64:
454 return newSViv(va_arg(args, gint64));
455
456 case GAIM_TYPE_UINT64:
457 return newSVuv(va_arg(args, guint64));
458
459 case GAIM_TYPE_STRING:
460 return newSVGChar(va_arg(args, char *));
461
462 case GAIM_TYPE_POINTER:
463 return newSViv((IV)va_arg(args, void *));
464
465 case GAIM_TYPE_BOXED:
466 /* Uh.. I dunno. Try this? */
467 return sv_2mortal(gaim_perl_bless_object(
468 va_arg(args, void *),
469 gaim_value_get_specific_type(value)));
470
471 default:
472 /* If this happens, things are going to get screwed up... */
473 return NULL;
474 }
475 }
476 }