ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/rxvtperl.xs
(Generate patch)

Comparing rxvt-unicode/src/rxvtperl.xs (file contents):
Revision 1.41 by root, Sun Jan 8 03:07:05 2006 UTC vs.
Revision 1.44 by root, Sun Jan 8 22:58:13 2006 UTC

49#undef ROW 49#undef ROW
50#define ROW(n) THIS->row_buf [LINENO (n)] 50#define ROW(n) THIS->row_buf [LINENO (n)]
51 51
52///////////////////////////////////////////////////////////////////////////// 52/////////////////////////////////////////////////////////////////////////////
53 53
54static SV *
55taint (SV *sv)
56{
57 SvTAINT (sv);
58 return sv;
59}
60
61static SV *
62taint_if (SV *sv, SV *src)
63{
64 if (SvTAINTED (src))
65 SvTAINT (sv);
66
67 return sv;
68}
69
54static wchar_t * 70static wchar_t *
55sv2wcs (SV *sv) 71sv2wcs (SV *sv)
56{ 72{
57 STRLEN len; 73 STRLEN len;
58 char *str = SvPVutf8 (sv, len); 74 char *str = SvPVutf8 (sv, len);
396{ 412{
397 if (!perl) 413 if (!perl)
398 { 414 {
399 char *argv[] = { 415 char *argv[] = {
400 "", 416 "",
417 "-T",
401 "-edo '" LIBDIR "/urxvt.pm' or ($@ and die $@) or exit 1", 418 "-edo '" LIBDIR "/urxvt.pm' or ($@ and die $@) or exit 1",
402 }; 419 };
403 420
404 perl = perl_alloc (); 421 perl = perl_alloc ();
405 perl_construct (perl); 422 perl_construct (perl);
406 423
407 if (perl_parse (perl, xs_init, 2, argv, (char **)NULL) 424 if (perl_parse (perl, xs_init, 3, argv, (char **)NULL)
408 || perl_run (perl)) 425 || perl_run (perl))
409 { 426 {
410 rxvt_warn ("unable to initialize perl-interpreter, continuing without.\n"); 427 rxvt_warn ("unable to initialize perl-interpreter, continuing without.\n");
411 428
412 perl_destruct (perl); 429 perl_destruct (perl);
473 case DT_LONG: 490 case DT_LONG:
474 XPUSHs (sv_2mortal (newSViv (va_arg (ap, long)))); 491 XPUSHs (sv_2mortal (newSViv (va_arg (ap, long))));
475 break; 492 break;
476 493
477 case DT_STR: 494 case DT_STR:
478 XPUSHs (sv_2mortal (newSVpv (va_arg (ap, char *), 0))); 495 XPUSHs (taint (sv_2mortal (newSVpv (va_arg (ap, char *), 0))));
479 break; 496 break;
480 497
481 case DT_STR_LEN: 498 case DT_STR_LEN:
482 { 499 {
483 char *str = va_arg (ap, char *); 500 char *str = va_arg (ap, char *);
484 int len = va_arg (ap, int); 501 int len = va_arg (ap, int);
485 502
486 XPUSHs (sv_2mortal (newSVpvn (str, len))); 503 XPUSHs (taint (sv_2mortal (newSVpvn (str, len))));
487 } 504 }
488 break; 505 break;
489 506
490 case DT_WCS_LEN: 507 case DT_WCS_LEN:
491 { 508 {
492 wchar_t *wstr = va_arg (ap, wchar_t *); 509 wchar_t *wstr = va_arg (ap, wchar_t *);
493 int wlen = va_arg (ap, int); 510 int wlen = va_arg (ap, int);
494 511
495 XPUSHs (sv_2mortal (wcs2sv (wstr, wlen))); 512 XPUSHs (taint (sv_2mortal (wcs2sv (wstr, wlen))));
496 } 513 }
497 break; 514 break;
498 515
499 case DT_XEVENT: 516 case DT_XEVENT:
500 { 517 {
765} 782}
766 OUTPUT: 783 OUTPUT:
767 RETVAL 784 RETVAL
768 785
769void 786void
770rxvt_term::allow_events_async (U32 eventtime = THIS->perl.grabtime) 787rxvt_term::allow_events_async ()
771 CODE: 788 CODE:
772 XAllowEvents (THIS->display->display, AsyncBoth, eventtime); 789 XAllowEvents (THIS->display->display, AsyncBoth, THIS->perl.grabtime);
773 790
774void 791void
775rxvt_term::allow_events_sync (U32 eventtime = THIS->perl.grabtime) 792rxvt_term::allow_events_sync ()
776 CODE: 793 CODE:
777 XAllowEvents (THIS->display->display, SyncBoth, eventtime); 794 XAllowEvents (THIS->display->display, SyncBoth, THIS->perl.grabtime);
778 795
779void 796void
780rxvt_term::allow_events_replay (U32 eventtime = THIS->perl.grabtime) 797rxvt_term::allow_events_replay ()
781 CODE: 798 CODE:
782 XAllowEvents (THIS->display->display, ReplayPointer, eventtime); 799 XAllowEvents (THIS->display->display, ReplayPointer, THIS->perl.grabtime);
783 XAllowEvents (THIS->display->display, ReplayKeyboard, eventtime); 800 XAllowEvents (THIS->display->display, ReplayKeyboard, THIS->perl.grabtime);
784 801
785void 802void
786rxvt_term::ungrab (U32 eventtime = THIS->perl.grabtime) 803rxvt_term::ungrab ()
787 CODE: 804 CODE:
805{
806 if (THIS->perl.grabtime)
807 {
808 XUngrabKeyboard (THIS->display->display, THIS->perl.grabtime);
809 XUngrabPointer (THIS->display->display, THIS->perl.grabtime);
788 THIS->perl.grabtime = 0; 810 THIS->perl.grabtime = 0;
789 XUngrabKeyboard (THIS->display->display, eventtime); 811 }
790 XUngrabPointer (THIS->display->display, eventtime); 812}
791 813
792int 814int
793rxvt_term::strwidth (SV *str) 815rxvt_term::strwidth (SV *str)
794 CODE: 816 CODE:
795{ 817{
814 char *mbstr = rxvt_wcstombs (wstr); 836 char *mbstr = rxvt_wcstombs (wstr);
815 rxvt_pop_locale (); 837 rxvt_pop_locale ();
816 838
817 free (wstr); 839 free (wstr);
818 840
819 RETVAL = newSVpv (mbstr, 0); 841 RETVAL = taint_if (newSVpv (mbstr, 0), str);
820 free (mbstr); 842 free (mbstr);
821} 843}
822 OUTPUT: 844 OUTPUT:
823 RETVAL 845 RETVAL
824 846
831 853
832 rxvt_push_locale (THIS->locale); 854 rxvt_push_locale (THIS->locale);
833 wchar_t *wstr = rxvt_mbstowcs (data, len); 855 wchar_t *wstr = rxvt_mbstowcs (data, len);
834 rxvt_pop_locale (); 856 rxvt_pop_locale ();
835 857
836 RETVAL = wcs2sv (wstr); 858 RETVAL = taint_if (wcs2sv (wstr), octets);
837 free (wstr); 859 free (wstr);
838} 860}
839 OUTPUT: 861 OUTPUT:
840 RETVAL 862 RETVAL
841 863
948 wchar_t *wstr = new wchar_t [THIS->ncol]; 970 wchar_t *wstr = new wchar_t [THIS->ncol];
949 971
950 for (int col = 0; col < THIS->ncol; col++) 972 for (int col = 0; col < THIS->ncol; col++)
951 wstr [col] = l.t [col]; 973 wstr [col] = l.t [col];
952 974
953 XPUSHs (sv_2mortal (wcs2sv (wstr, THIS->ncol))); 975 XPUSHs (taint (sv_2mortal (wcs2sv (wstr, THIS->ncol))));
954 976
955 delete [] wstr; 977 delete [] wstr;
956 } 978 }
957 979
958 if (new_text) 980 if (new_text)
1079 else 1101 else
1080 *r++ = *s; 1102 *r++ = *s;
1081 1103
1082 rxvt_pop_locale (); 1104 rxvt_pop_locale ();
1083 1105
1084 RETVAL = wcs2sv (rstr, r - rstr); 1106 RETVAL = taint_if (wcs2sv (rstr, r - rstr), string);
1085 1107
1086 delete [] rstr; 1108 delete [] rstr;
1087} 1109}
1088 OUTPUT: 1110 OUTPUT:
1089 RETVAL 1111 RETVAL
1115 else if (IS_COMPOSE (*s)) 1137 else if (IS_COMPOSE (*s))
1116 r += rxvt_composite.expand (*s, r); 1138 r += rxvt_composite.expand (*s, r);
1117 else 1139 else
1118 *r++ = *s; 1140 *r++ = *s;
1119 1141
1120 RETVAL = wcs2sv (rstr, r - rstr); 1142 RETVAL = taint_if (wcs2sv (rstr, r - rstr), text);
1121 1143
1122 delete [] rstr; 1144 delete [] rstr;
1123} 1145}
1124 OUTPUT: 1146 OUTPUT:
1125 RETVAL 1147 RETVAL
1147 1169
1148 if (!IN_RANGE_EXC (index, 0, NUM_RESOURCES)) 1170 if (!IN_RANGE_EXC (index, 0, NUM_RESOURCES))
1149 croak ("requested out-of-bound resource %s+%d,", name, index - rs->value); 1171 croak ("requested out-of-bound resource %s+%d,", name, index - rs->value);
1150 1172
1151 if (GIMME_V != G_VOID) 1173 if (GIMME_V != G_VOID)
1152 XPUSHs (THIS->rs [index] ? sv_2mortal (newSVpv (THIS->rs [index], 0)) : &PL_sv_undef); 1174 XPUSHs (THIS->rs [index] ? sv_2mortal (taint (newSVpv (THIS->rs [index], 0))) : &PL_sv_undef);
1153 1175
1154 if (newval) 1176 if (newval)
1155 { 1177 {
1156 if (SvOK (newval)) 1178 if (SvOK (newval))
1157 { 1179 {
1238void 1260void
1239rxvt_term::selection (SV *newtext = 0) 1261rxvt_term::selection (SV *newtext = 0)
1240 PPCODE: 1262 PPCODE:
1241{ 1263{
1242 if (GIMME_V != G_VOID) 1264 if (GIMME_V != G_VOID)
1243 XPUSHs (sv_2mortal (wcs2sv (THIS->selection.text, THIS->selection.len))); 1265 XPUSHs (taint (sv_2mortal (wcs2sv (THIS->selection.text, THIS->selection.len))));
1244 1266
1245 if (newtext) 1267 if (newtext)
1246 { 1268 {
1247 free (THIS->selection.text); 1269 free (THIS->selection.text);
1248 1270

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines