diff plugins/perl/perl-common.c @ 6566:f6c2a7b5afa7

[gaim-migrate @ 7088] PERL SIGNAL HANDLING WORKS!!!! Ahem. I shall now continue professionally developing other aspects of this instant messenger application. WOOHOO committer: Tailor Script <tailor@pidgin.im>
author Christian Hammond <chipx86@chipx86.com>
date Thu, 21 Aug 2003 23:41:52 +0000
parents 7c42b8ca3222
children 69e0a3e29aa1
line wrap: on
line diff
--- a/plugins/perl/perl-common.c	Thu Aug 21 23:26:13 2003 +0000
+++ b/plugins/perl/perl-common.c	Thu Aug 21 23:41:52 2003 +0000
@@ -1,4 +1,5 @@
 #include "debug.h"
+#include "value.h"
 
 #include "perl-common.h"
 
@@ -35,6 +36,20 @@
 }
 
 SV *
+newSVGChar(const char *str)
+{
+	SV *sv;
+
+	if (str == NULL)
+		return &PL_sv_undef;
+
+	sv = newSVpv(str, 0);
+	SvUTF8_on(sv);
+
+	return sv;
+}
+
+SV *
 gaim_perl_bless_object(void *object, const char *stash_name)
 {
 	HV *stash;
@@ -51,13 +66,6 @@
 	hv_store(hv, "_gaim", 5, create_sv_ptr(object), 0);
 
 	return sv_bless(newRV_noinc((SV *)hv), stash);
-
-//	return sv_bless(create_sv_ptr(object), gv_stashpv(stash, 1));
-//	return create_sv_ptr(object);
-
-//	dXSARGS;
-
-//	return sv_setref_pv(ST(0), "Gaim::Account", create_sv_ptr(object));
 }
 
 gboolean
@@ -216,4 +224,199 @@
 	return ret_value;
 }
 
+#if 0
+gboolean
+gaim_perl_value_from_sv(GaimValue *value, SV *sv)
+{
+	switch (gaim_value_get_type(value))
+	{
+		case GAIM_TYPE_CHAR:
+			if ((tmp = SvGChar(sv)) != NULL)
+				gaim_value_set_char(value, tmp[0]);
+			else
+				return FALSE;
+			break;
 
+		case GAIM_TYPE_UCHAR:
+			if ((tmp = SvPV_nolen(sv)) != NULL)
+				gaim_value_set_uchar(value, tmp[0]);
+			else
+				return FALSE;
+			break;
+
+		case GAIM_TYPE_BOOLEAN:
+			gaim_value_set_boolean(value, SvTRUE(sv));
+			break;
+
+		case GAIM_TYPE_INT:
+			gaim_value_set_int(value, SvIV(sv));
+			break;
+
+		case GAIM_TYPE_UINT:
+			gaim_value_set_uint(value, SvIV(sv));
+			break;
+
+		case GAIM_TYPE_LONG:
+			gaim_value_set_long(value, SvIV(sv));
+			break;
+
+		case GAIM_TYPE_ULONG:
+			gaim_value_set_ulong(value, SvIV(sv));
+			break;
+
+		case GAIM_TYPE_INT64:
+			gaim_value_set_int64(value, SvIV(sv));
+			break;
+
+		case GAIM_TYPE_UINT64:
+			gaim_value_set_uint64(value, SvIV(sv));
+			break;
+
+		case GAIM_TYPE_STRING:
+			gaim_value_set_string(value, SvGChar(sv));
+			break;
+
+		case GAIM_TYPE_POINTER:
+			gaim_value_set_pointer(value, (void *)SvIV(sv));
+			break;
+
+		case GAIM_TYPE_BOXED:
+			if (!strcmp(gaim_value_get_specific_type(value), "SV"))
+				gaim_value_set_boxed(value, (sv == &PL_sv_undef ? NULL : sv));
+			else
+				gaim_value_set_boxed(value, sv);
+			break;
+
+		default:
+			return FALSE;
+	}
+
+	return TRUE;
+}
+
+SV *
+gaim_perl_sv_from_value(const GaimValue *value, va_list list)
+{
+	switch (gaim_value_get_type(value))
+	{
+		case GAIM_TYPE_BOOLEAN:
+			return newSViv(gaim_value_get_boolean(value));
+			break;
+
+		case GAIM_TYPE_INT:
+			return newSViv(gaim_value_get_int(value));
+			break;
+
+		case GAIM_TYPE_UINT:
+			return newSVuv(gaim_value_get_uint(value));
+			break;
+
+		case GAIM_TYPE_LONG:
+			return newSViv(gaim_value_get_long(value));
+			break;
+
+		case GAIM_TYPE_ULONG:
+			return newSVuv(gaim_value_get_ulong(value));
+			break;
+
+		case GAIM_TYPE_INT64:
+			return newSViv(gaim_value_get_int64(value));
+			break;
+
+		case GAIM_TYPE_UINT64:
+			return newSVuv(gaim_value_get_int64(value));
+			break;
+
+		case GAIM_TYPE_STRING:
+			return newSVGChar(gaim_value_get_string(value));
+			break;
+
+		case GAIM_TYPE_POINTER:
+			return newSViv((IV)gaim_value_get_pointer(value));
+			break;
+
+		case GAIM_TYPE_BOXED:
+			if (!strcmp(gaim_value_get_specific_type(value), "SV"))
+			{
+				SV *sv = (SV *)gaim_perl_get_boxed(value);
+
+				return (sv == NULL ? &PL_sv_undef : sv);
+			}
+
+			/* Uh.. I dunno. Try this? */
+			return sv_2mortal(gaim_perl_bless_object(
+					gaim_perl_get_boxed(value),
+					gaim_value_get_specific_type(value)));
+
+		default:
+			return FALSE;
+	}
+
+	return TRUE;
+}
+#endif
+
+static SV *
+gaim_perl_sv_from_subtype(const GaimValue *value, void *arg)
+{
+	const char *stash = NULL;
+
+	switch (gaim_value_get_subtype(value))
+	{
+		case GAIM_SUBTYPE_ACCOUNT:
+			stash = "Gaim::Account";
+			break;
+
+		default:
+			stash = "Gaim"; /* ? */
+	}
+
+	return sv_2mortal(gaim_perl_bless_object(arg, stash));
+}
+
+SV *
+gaim_perl_sv_from_vargs(const GaimValue *value, va_list args)
+{
+	switch (gaim_value_get_type(value))
+	{
+		case GAIM_TYPE_SUBTYPE:
+			return gaim_perl_sv_from_subtype(value, va_arg(args, void *));
+
+		case GAIM_TYPE_BOOLEAN:
+			return newSViv(va_arg(args, gboolean));
+
+		case GAIM_TYPE_INT:
+			return newSViv(va_arg(args, int));
+
+		case GAIM_TYPE_UINT:
+			return newSVuv(va_arg(args, unsigned int));
+
+		case GAIM_TYPE_LONG:
+			return newSViv(va_arg(args, long));
+
+		case GAIM_TYPE_ULONG:
+			return newSVuv(va_arg(args, unsigned long));
+
+		case GAIM_TYPE_INT64:
+			return newSViv(va_arg(args, gint64));
+
+		case GAIM_TYPE_UINT64:
+			return newSVuv(va_arg(args, guint64));
+
+		case GAIM_TYPE_STRING:
+			return newSVGChar(va_arg(args, char *));
+
+		case GAIM_TYPE_POINTER:
+			return newSViv((IV)va_arg(args, void *));
+
+		case GAIM_TYPE_BOXED:
+			/* Uh.. I dunno. Try this? */
+			return sv_2mortal(gaim_perl_bless_object(
+					va_arg(args, void *),
+					gaim_value_get_specific_type(value)));
+
+		default:
+			/* If this happens, things are going to get screwed up... */
+			return NULL;
+	}
+}