| 174 int |
174 int |
| 175 execute_perl(const char *function, int argc, char **args) |
175 execute_perl(const char *function, int argc, char **args) |
| 176 { |
176 { |
| 177 int count = 0, i, ret_value = 1; |
177 int count = 0, i, ret_value = 1; |
| 178 SV *sv_args[argc]; |
178 SV *sv_args[argc]; |
| 179 STRLEN na; |
|
| 180 dSP; |
179 dSP; |
| 181 PERL_SET_CONTEXT(my_perl); |
180 PERL_SET_CONTEXT(my_perl); |
| 182 /* |
181 /* |
| 183 * Set up the perl environment, push arguments onto the |
182 * Set up the perl environment, push arguments onto the |
| 184 * perl stack, then call the given function |
183 * perl stack, then call the given function |
| 205 * return value. |
204 * return value. |
| 206 */ |
205 */ |
| 207 if (SvTRUE(ERRSV)) { |
206 if (SvTRUE(ERRSV)) { |
| 208 purple_debug(PURPLE_DEBUG_ERROR, "perl", |
207 purple_debug(PURPLE_DEBUG_ERROR, "perl", |
| 209 "Perl function %s exited abnormally: %s\n", |
208 "Perl function %s exited abnormally: %s\n", |
| 210 function, SvPV(ERRSV, na)); |
209 function, SvPVutf8_nolen(ERRSV)); |
| 211 (void)POPs; |
210 (void)POPs; |
| 212 } else if (count != 1) { |
211 } else if (count != 1) { |
| 213 /* |
212 /* |
| 214 * This should NEVER happen. G_SCALAR ensures that we WILL |
213 * This should NEVER happen. G_SCALAR ensures that we WILL |
| 215 * have 1 parameter. |
214 * have 1 parameter. |
| 233 * very well. See, it's aggregate... Oh, but if 2 perl scripts |
232 * very well. See, it's aggregate... Oh, but if 2 perl scripts |
| 234 * both modify the data, _that's_ a memleak. This is really kind |
233 * both modify the data, _that's_ a memleak. This is really kind |
| 235 * of hackish. I should fix it. Look how long this comment is. |
234 * of hackish. I should fix it. Look how long this comment is. |
| 236 * Holy crap. |
235 * Holy crap. |
| 237 */ |
236 */ |
| 238 args[i] = g_strdup(SvPV(sv_args[i], na)); |
237 args[i] = g_strdup(SvPVutf8_nolen(sv_args[i])); |
| 239 } |
238 } |
| 240 } |
239 } |
| 241 |
240 |
| 242 PUTBACK; |
241 PUTBACK; |
| 243 FREETMPS; |
242 FREETMPS; |
| 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(PurpleValue *value, SV *sv) |
| 383 { |
382 { |
| 384 STRLEN na; |
|
| 385 |
383 |
| 386 switch (purple_value_get_type(value)) { |
384 switch (purple_value_get_type(value)) { |
| 387 case PURPLE_TYPE_BOOLEAN: return (void *)SvIV(sv); |
385 case PURPLE_TYPE_BOOLEAN: return (void *)SvIV(sv); |
| 388 case PURPLE_TYPE_INT: return (void *)SvIV(sv); |
386 case PURPLE_TYPE_INT: return (void *)SvIV(sv); |
| 389 case PURPLE_TYPE_UINT: return (void *)SvUV(sv); |
387 case PURPLE_TYPE_UINT: return (void *)SvUV(sv); |
| 390 case PURPLE_TYPE_LONG: return (void *)SvIV(sv); |
388 case PURPLE_TYPE_LONG: return (void *)SvIV(sv); |
| 391 case PURPLE_TYPE_ULONG: return (void *)SvUV(sv); |
389 case PURPLE_TYPE_ULONG: return (void *)SvUV(sv); |
| 392 case PURPLE_TYPE_INT64: return (void *)SvIV(sv); |
390 case PURPLE_TYPE_INT64: return (void *)SvIV(sv); |
| 393 case PURPLE_TYPE_UINT64: return (void *)SvUV(sv); |
391 case PURPLE_TYPE_UINT64: return (void *)SvUV(sv); |
| 394 case PURPLE_TYPE_STRING: return g_strdup((void *)SvPV(sv, na)); |
392 case PURPLE_TYPE_STRING: return g_strdup(SvPVutf8_nolen(sv)); |
| 395 case PURPLE_TYPE_POINTER: return (void *)SvIV(sv); |
393 case PURPLE_TYPE_POINTER: return (void *)SvIV(sv); |
| 396 case PURPLE_TYPE_BOXED: return (void *)SvIV(sv); |
394 case PURPLE_TYPE_BOXED: return (void *)SvIV(sv); |
| 397 |
395 |
| 398 default: |
396 default: |
| 399 return NULL; |
397 return NULL; |