Mercurial > pidgin.yaz
comparison 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 |
comparison
equal
deleted
inserted
replaced
6565:cb00e9647033 | 6566:f6c2a7b5afa7 |
---|---|
1 #include "debug.h" | 1 #include "debug.h" |
2 #include "value.h" | |
2 | 3 |
3 #include "perl-common.h" | 4 #include "perl-common.h" |
4 | 5 |
5 extern PerlInterpreter *my_perl; | 6 extern PerlInterpreter *my_perl; |
6 | 7 |
33 | 34 |
34 return sv; | 35 return sv; |
35 } | 36 } |
36 | 37 |
37 SV * | 38 SV * |
39 newSVGChar(const char *str) | |
40 { | |
41 SV *sv; | |
42 | |
43 if (str == NULL) | |
44 return &PL_sv_undef; | |
45 | |
46 sv = newSVpv(str, 0); | |
47 SvUTF8_on(sv); | |
48 | |
49 return sv; | |
50 } | |
51 | |
52 SV * | |
38 gaim_perl_bless_object(void *object, const char *stash_name) | 53 gaim_perl_bless_object(void *object, const char *stash_name) |
39 { | 54 { |
40 HV *stash; | 55 HV *stash; |
41 HV *hv; | 56 HV *hv; |
42 | 57 |
49 | 64 |
50 hv = newHV(); | 65 hv = newHV(); |
51 hv_store(hv, "_gaim", 5, create_sv_ptr(object), 0); | 66 hv_store(hv, "_gaim", 5, create_sv_ptr(object), 0); |
52 | 67 |
53 return sv_bless(newRV_noinc((SV *)hv), stash); | 68 return sv_bless(newRV_noinc((SV *)hv), stash); |
54 | |
55 // return sv_bless(create_sv_ptr(object), gv_stashpv(stash, 1)); | |
56 // return create_sv_ptr(object); | |
57 | |
58 // dXSARGS; | |
59 | |
60 // return sv_setref_pv(ST(0), "Gaim::Account", create_sv_ptr(object)); | |
61 } | 69 } |
62 | 70 |
63 gboolean | 71 gboolean |
64 gaim_perl_is_ref_object(SV *o) | 72 gaim_perl_is_ref_object(SV *o) |
65 { | 73 { |
214 LEAVE; | 222 LEAVE; |
215 | 223 |
216 return ret_value; | 224 return ret_value; |
217 } | 225 } |
218 | 226 |
219 | 227 #if 0 |
228 gboolean | |
229 gaim_perl_value_from_sv(GaimValue *value, SV *sv) | |
230 { | |
231 switch (gaim_value_get_type(value)) | |
232 { | |
233 case GAIM_TYPE_CHAR: | |
234 if ((tmp = SvGChar(sv)) != NULL) | |
235 gaim_value_set_char(value, tmp[0]); | |
236 else | |
237 return FALSE; | |
238 break; | |
239 | |
240 case GAIM_TYPE_UCHAR: | |
241 if ((tmp = SvPV_nolen(sv)) != NULL) | |
242 gaim_value_set_uchar(value, tmp[0]); | |
243 else | |
244 return FALSE; | |
245 break; | |
246 | |
247 case GAIM_TYPE_BOOLEAN: | |
248 gaim_value_set_boolean(value, SvTRUE(sv)); | |
249 break; | |
250 | |
251 case GAIM_TYPE_INT: | |
252 gaim_value_set_int(value, SvIV(sv)); | |
253 break; | |
254 | |
255 case GAIM_TYPE_UINT: | |
256 gaim_value_set_uint(value, SvIV(sv)); | |
257 break; | |
258 | |
259 case GAIM_TYPE_LONG: | |
260 gaim_value_set_long(value, SvIV(sv)); | |
261 break; | |
262 | |
263 case GAIM_TYPE_ULONG: | |
264 gaim_value_set_ulong(value, SvIV(sv)); | |
265 break; | |
266 | |
267 case GAIM_TYPE_INT64: | |
268 gaim_value_set_int64(value, SvIV(sv)); | |
269 break; | |
270 | |
271 case GAIM_TYPE_UINT64: | |
272 gaim_value_set_uint64(value, SvIV(sv)); | |
273 break; | |
274 | |
275 case GAIM_TYPE_STRING: | |
276 gaim_value_set_string(value, SvGChar(sv)); | |
277 break; | |
278 | |
279 case GAIM_TYPE_POINTER: | |
280 gaim_value_set_pointer(value, (void *)SvIV(sv)); | |
281 break; | |
282 | |
283 case GAIM_TYPE_BOXED: | |
284 if (!strcmp(gaim_value_get_specific_type(value), "SV")) | |
285 gaim_value_set_boxed(value, (sv == &PL_sv_undef ? NULL : sv)); | |
286 else | |
287 gaim_value_set_boxed(value, sv); | |
288 break; | |
289 | |
290 default: | |
291 return FALSE; | |
292 } | |
293 | |
294 return TRUE; | |
295 } | |
296 | |
297 SV * | |
298 gaim_perl_sv_from_value(const GaimValue *value, va_list list) | |
299 { | |
300 switch (gaim_value_get_type(value)) | |
301 { | |
302 case GAIM_TYPE_BOOLEAN: | |
303 return newSViv(gaim_value_get_boolean(value)); | |
304 break; | |
305 | |
306 case GAIM_TYPE_INT: | |
307 return newSViv(gaim_value_get_int(value)); | |
308 break; | |
309 | |
310 case GAIM_TYPE_UINT: | |
311 return newSVuv(gaim_value_get_uint(value)); | |
312 break; | |
313 | |
314 case GAIM_TYPE_LONG: | |
315 return newSViv(gaim_value_get_long(value)); | |
316 break; | |
317 | |
318 case GAIM_TYPE_ULONG: | |
319 return newSVuv(gaim_value_get_ulong(value)); | |
320 break; | |
321 | |
322 case GAIM_TYPE_INT64: | |
323 return newSViv(gaim_value_get_int64(value)); | |
324 break; | |
325 | |
326 case GAIM_TYPE_UINT64: | |
327 return newSVuv(gaim_value_get_int64(value)); | |
328 break; | |
329 | |
330 case GAIM_TYPE_STRING: | |
331 return newSVGChar(gaim_value_get_string(value)); | |
332 break; | |
333 | |
334 case GAIM_TYPE_POINTER: | |
335 return newSViv((IV)gaim_value_get_pointer(value)); | |
336 break; | |
337 | |
338 case GAIM_TYPE_BOXED: | |
339 if (!strcmp(gaim_value_get_specific_type(value), "SV")) | |
340 { | |
341 SV *sv = (SV *)gaim_perl_get_boxed(value); | |
342 | |
343 return (sv == NULL ? &PL_sv_undef : sv); | |
344 } | |
345 | |
346 /* Uh.. I dunno. Try this? */ | |
347 return sv_2mortal(gaim_perl_bless_object( | |
348 gaim_perl_get_boxed(value), | |
349 gaim_value_get_specific_type(value))); | |
350 | |
351 default: | |
352 return FALSE; | |
353 } | |
354 | |
355 return TRUE; | |
356 } | |
357 #endif | |
358 | |
359 static SV * | |
360 gaim_perl_sv_from_subtype(const GaimValue *value, void *arg) | |
361 { | |
362 const char *stash = NULL; | |
363 | |
364 switch (gaim_value_get_subtype(value)) | |
365 { | |
366 case GAIM_SUBTYPE_ACCOUNT: | |
367 stash = "Gaim::Account"; | |
368 break; | |
369 | |
370 default: | |
371 stash = "Gaim"; /* ? */ | |
372 } | |
373 | |
374 return sv_2mortal(gaim_perl_bless_object(arg, stash)); | |
375 } | |
376 | |
377 SV * | |
378 gaim_perl_sv_from_vargs(const GaimValue *value, va_list args) | |
379 { | |
380 switch (gaim_value_get_type(value)) | |
381 { | |
382 case GAIM_TYPE_SUBTYPE: | |
383 return gaim_perl_sv_from_subtype(value, va_arg(args, void *)); | |
384 | |
385 case GAIM_TYPE_BOOLEAN: | |
386 return newSViv(va_arg(args, gboolean)); | |
387 | |
388 case GAIM_TYPE_INT: | |
389 return newSViv(va_arg(args, int)); | |
390 | |
391 case GAIM_TYPE_UINT: | |
392 return newSVuv(va_arg(args, unsigned int)); | |
393 | |
394 case GAIM_TYPE_LONG: | |
395 return newSViv(va_arg(args, long)); | |
396 | |
397 case GAIM_TYPE_ULONG: | |
398 return newSVuv(va_arg(args, unsigned long)); | |
399 | |
400 case GAIM_TYPE_INT64: | |
401 return newSViv(va_arg(args, gint64)); | |
402 | |
403 case GAIM_TYPE_UINT64: | |
404 return newSVuv(va_arg(args, guint64)); | |
405 | |
406 case GAIM_TYPE_STRING: | |
407 return newSVGChar(va_arg(args, char *)); | |
408 | |
409 case GAIM_TYPE_POINTER: | |
410 return newSViv((IV)va_arg(args, void *)); | |
411 | |
412 case GAIM_TYPE_BOXED: | |
413 /* Uh.. I dunno. Try this? */ | |
414 return sv_2mortal(gaim_perl_bless_object( | |
415 va_arg(args, void *), | |
416 gaim_value_get_specific_type(value))); | |
417 | |
418 default: | |
419 /* If this happens, things are going to get screwed up... */ | |
420 return NULL; | |
421 } | |
422 } |