Mercurial > pidgin.yaz
comparison src/perl.c @ 2511:a83b4a5ffcd6
[gaim-migrate @ 2524]
malsyned's patch for args in perl.
committer: Tailor Script <tailor@pidgin.im>
author | Eric Warmenhoven <eric@warmenhoven.org> |
---|---|
date | Mon, 15 Oct 2001 19:52:44 +0000 |
parents | e87e4a9e6566 |
children | bf7ec3874810 |
comparison
equal
deleted
inserted
replaced
2510:1950afffd107 | 2511:a83b4a5ffcd6 |
---|---|
129 } | 129 } |
130 | 130 |
131 static SV *execute_perl(char *function, char *args) | 131 static SV *execute_perl(char *function, char *args) |
132 { | 132 { |
133 static char *perl_cmd = NULL; | 133 static char *perl_cmd = NULL; |
134 SV *i; | |
134 | 135 |
135 if (perl_cmd) | 136 if (perl_cmd) |
136 g_free(perl_cmd); | 137 g_free(perl_cmd); |
137 perl_cmd = g_malloc(strlen(function) + (strlen(args) * 2) + 2 + 10); | 138 perl_cmd = g_malloc(strlen(function) + strlen(args) + 4); |
138 sprintf(perl_cmd, "&%s('%s')", function, escape_quotes(args)); | 139 sprintf(perl_cmd, "&%s(%s)", function, args); |
139 #ifndef HAVE_PERL_EVAL_PV | 140 #ifndef HAVE_PERL_EVAL_PV |
140 return (perl_eval_pv(perl_cmd, TRUE)); | 141 i = (perl_eval_pv(perl_cmd, TRUE)); |
141 #else | 142 #else |
142 return (Perl_eval_pv(perl_cmd, TRUE)); | 143 i = (Perl_eval_pv(perl_cmd, TRUE)); |
143 #endif | 144 #endif |
145 return i; | |
144 } | 146 } |
145 | 147 |
146 int perl_load_file(char *script_name) | 148 int perl_load_file(char *script_name) |
147 { | 149 { |
150 char *name = g_strdup_printf("'%s'", escape_quotes(script_name)); | |
148 SV *return_val; | 151 SV *return_val; |
149 if (my_perl == NULL) | 152 if (my_perl == NULL) |
150 perl_init(); | 153 perl_init(); |
151 return_val = execute_perl("load_file", script_name); | 154 return_val = execute_perl("load_file", name); |
155 g_free(name); | |
152 return SvNV (return_val); | 156 return SvNV (return_val); |
153 } | 157 } |
154 | 158 |
155 static int is_pl_file(char *filename) | 159 static int is_pl_file(char *filename) |
156 { | 160 { |
641 if (b) | 645 if (b) |
642 serv_chat_send(gc, id, what); | 646 serv_chat_send(gc, id, what); |
643 XSRETURN(0); | 647 XSRETURN(0); |
644 } | 648 } |
645 | 649 |
646 int perl_event(char *event, char *args) | 650 int perl_event(enum gaim_event event, void *arg1, void *arg2, void *arg3, void *arg4) |
647 { | 651 { |
652 char *buf = NULL; | |
648 GList *handler; | 653 GList *handler; |
649 struct _perl_event_handlers *data; | 654 struct _perl_event_handlers *data; |
650 SV *handler_return; | 655 SV *handler_return; |
651 | 656 |
657 switch (event) { | |
658 case event_signon: | |
659 case event_signoff: | |
660 buf = g_strdup_printf("'%lu'", (unsigned long)arg1); | |
661 break; | |
662 case event_away: | |
663 buf = g_strdup_printf("'%lu','%s'", (unsigned long)arg1, | |
664 ((struct gaim_connection *)arg1)->away ? | |
665 escape_quotes(((struct gaim_connection *)arg1)->away) : ""); | |
666 break; | |
667 case event_im_recv: | |
668 { | |
669 char *tmp = *(char **)arg2 ? g_strdup(escape_quotes(*(char **)arg2)) : g_malloc0(1); | |
670 buf = g_strdup_printf("'%lu','%s','%s'", (unsigned long)arg1, tmp, | |
671 *(char **)arg3 ? escape_quotes(*(char **)arg3) : ""); | |
672 g_free(tmp); | |
673 } | |
674 break; | |
675 case event_im_send: | |
676 { | |
677 char *tmp = arg2 ? g_strdup(escape_quotes(arg2)) : g_malloc0(1); | |
678 buf = g_strdup_printf("'%lu','%s','%s'", (unsigned long)arg1, tmp, | |
679 *(char **)arg3 ? escape_quotes(*(char **)arg3) : ""); | |
680 g_free(tmp); | |
681 } | |
682 break; | |
683 case event_buddy_signon: | |
684 case event_buddy_signoff: | |
685 case event_set_info: | |
686 case event_buddy_away: | |
687 case event_buddy_back: | |
688 case event_buddy_idle: | |
689 case event_buddy_unidle: | |
690 buf = g_strdup_printf("'%lu','%s'", (unsigned long)arg1, escape_quotes(arg2)); | |
691 break; | |
692 case event_chat_invited: | |
693 { | |
694 char *tmp2, *tmp3, *tmp4; | |
695 tmp2 = g_strdup(escape_quotes(arg2)); | |
696 tmp3 = g_strdup(escape_quotes(arg3)); | |
697 tmp4 = arg4 ? g_strdup(escape_quotes(arg4)) : g_malloc0(1); | |
698 buf = g_strdup_printf("'%lu','%s','%s','%s'", (unsigned long)arg1, tmp2, tmp3, tmp4); | |
699 g_free(tmp2); | |
700 g_free(tmp3); | |
701 g_free(tmp4); | |
702 } | |
703 break; | |
704 case event_chat_join: | |
705 case event_chat_buddy_join: | |
706 case event_chat_buddy_leave: | |
707 buf = g_strdup_printf("'%lu','%d','%s'", (unsigned long)arg1, (int)arg2, | |
708 escape_quotes(arg3)); | |
709 break; | |
710 case event_chat_leave: | |
711 buf = g_strdup_printf("'%lu','%d'", (unsigned long)arg1, (int)arg2); | |
712 break; | |
713 case event_chat_recv: | |
714 { | |
715 char *t3, *t4; | |
716 t3 = g_strdup(escape_quotes(arg3)); | |
717 t4 = arg4 ? g_strdup(escape_quotes(arg4)) : g_malloc0(1); | |
718 buf = g_strdup_printf("'%lu','%d','%s','%s'", (unsigned long)arg1, (int)arg2, t3, t4); | |
719 g_free(t3); | |
720 g_free(t4); | |
721 } | |
722 break; | |
723 case event_chat_send_invite: | |
724 { | |
725 char *t3, *t4; | |
726 t3 = g_strdup(escape_quotes(arg3)); | |
727 t4 = *(char **)arg4 ? g_strdup(escape_quotes(*(char **)arg4)) : g_malloc0(1); | |
728 buf = g_strdup_printf("'%lu','%d','%s','%s'", (unsigned long)arg1, (int)arg2, t3, t4); | |
729 g_free(t3); | |
730 g_free(t4); | |
731 } | |
732 break; | |
733 case event_chat_send: | |
734 buf = g_strdup_printf("'%lu','%d','%s'", (unsigned long)arg1, (int)arg2, | |
735 *(char **)arg3 ? escape_quotes(*(char **)arg3) : ""); | |
736 break; | |
737 case event_warned: | |
738 buf = g_strdup_printf("'%lu','%s','%d'", (unsigned long)arg1, | |
739 arg2 ? escape_quotes(arg2) : "", (int)arg3); | |
740 break; | |
741 case event_quit: | |
742 buf = g_malloc0(1); | |
743 break; | |
744 case event_new_conversation: | |
745 buf = g_strdup_printf("'%s'", escape_quotes(arg1)); | |
746 break; | |
747 case event_im_displayed_sent: | |
748 { | |
749 char *tmp2, *tmp3; | |
750 tmp2 = g_strdup(escape_quotes(arg2)); | |
751 tmp3 = *(char **)arg3 ? g_strdup(escape_quotes(*(char **)arg3)) : g_malloc0(1); | |
752 buf = g_strdup_printf("'%lu','%s','%s'", (unsigned long)arg1, tmp2, tmp3); | |
753 g_free(tmp2); | |
754 g_free(tmp3); | |
755 } | |
756 break; | |
757 case event_im_displayed_rcvd: | |
758 { | |
759 char *tmp2, *tmp3; | |
760 tmp2 = g_strdup(escape_quotes(arg2)); | |
761 tmp3 = arg3 ? g_strdup(escape_quotes(arg3)) : g_malloc0(1); | |
762 buf = g_strdup_printf("%lu \"%s\" %s", (unsigned long)arg1, tmp2, tmp3); | |
763 g_free(tmp2); | |
764 g_free(tmp3); | |
765 } | |
766 break; | |
767 default: | |
768 return 0; | |
769 } | |
770 | |
652 for (handler = perl_event_handlers; handler != NULL; handler = handler->next) { | 771 for (handler = perl_event_handlers; handler != NULL; handler = handler->next) { |
653 data = handler->data; | 772 data = handler->data; |
654 if (!strcmp(event, data->event_type)) { | 773 if (!strcmp(event_name(event), data->event_type)) { |
655 handler_return = execute_perl(data->handler_name, args); | 774 handler_return = execute_perl(data->handler_name, buf); |
656 if (SvIV(handler_return)) | 775 if (SvIV(handler_return)) { |
776 if (buf) | |
777 g_free(buf); | |
657 return SvIV(handler_return); | 778 return SvIV(handler_return); |
658 } | 779 } |
659 } | 780 } |
781 } | |
782 | |
783 if (buf) | |
784 g_free(buf); | |
660 | 785 |
661 return 0; | 786 return 0; |
662 } | 787 } |
663 | 788 |
664 XS (XS_GAIM_add_event_handler) | 789 XS (XS_GAIM_add_event_handler) |