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)