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.24 by root, Wed Jan 4 21:37:55 2006 UTC vs.
Revision 1.26 by root, Thu Jan 5 21:21:49 2006 UTC

51 char *str = SvPVutf8 (sv, len); 51 char *str = SvPVutf8 (sv, len);
52 return rxvt_utf8towcs (str, len); 52 return rxvt_utf8towcs (str, len);
53} 53}
54 54
55static SV * 55static SV *
56wcs2sv (wchar_t *wstr, int len = -1)
57{
58 char *str = rxvt_wcstoutf8 (wstr, len);
59
60 SV *sv = newSVpv (str, 0);
61 SvUTF8_on (sv);
62 free (str);
63
64 return sv;
65}
66
67static SV *
56new_ref (HV *hv, const char *klass) 68new_ref (HV *hv, const char *klass)
57{ 69{
58 return sv_bless (newRV ((SV *)hv), gv_stashpv (klass, 1)); 70 return sv_bless (newRV ((SV *)hv), gv_stashpv (klass, 1));
59} 71}
60 72
457 469
458 case DT_STRING: 470 case DT_STRING:
459 XPUSHs (sv_2mortal (newSVpv (va_arg (ap, char *), 0))); 471 XPUSHs (sv_2mortal (newSVpv (va_arg (ap, char *), 0)));
460 break; 472 break;
461 473
474 case DT_USTRING_LEN:
475 {
476 unicode_t *ustr = va_arg (ap, unicode_t *);
477 int ulen = va_arg (ap, int);
478 wchar_t *wstr = new wchar_t [ulen];
479
480 for (int i = ulen; i--; )
481 wstr [i] = ustr [i];
482
483 XPUSHs (sv_2mortal (wcs2sv (wstr, ulen)));
484
485 delete [] wstr;
486 }
487
462 case DT_END: 488 case DT_END:
463 { 489 {
464 va_end (ap); 490 va_end (ap);
465 491
466 PUTBACK; 492 PUTBACK;
634 660
635 rxvt_push_locale (THIS->locale); 661 rxvt_push_locale (THIS->locale);
636 wchar_t *wstr = rxvt_mbstowcs (data, len); 662 wchar_t *wstr = rxvt_mbstowcs (data, len);
637 rxvt_pop_locale (); 663 rxvt_pop_locale ();
638 664
639 char *str = rxvt_wcstoutf8 (wstr); 665 RETVAL = wcs2sv (wstr);
640 free (wstr); 666 free (wstr);
641
642 RETVAL = newSVpv (str, 0);
643 SvUTF8_on (RETVAL);
644 free (str);
645} 667}
646 OUTPUT: 668 OUTPUT:
647 RETVAL 669 RETVAL
648 670
649# very portable, especially on objects as opposed to pods 671# very portable, especially on objects as opposed to pods
681 RETVAL = *(int *)((char *)THIS + ix); 703 RETVAL = *(int *)((char *)THIS + ix);
682 OUTPUT: 704 OUTPUT:
683 RETVAL 705 RETVAL
684 706
685U32 707U32
686rxvt_term::screen_rstyle (U32 new_rstyle = THIS->screen.s_rstyle) 708rxvt_term::rstyle (U32 new_rstyle = THIS->rstyle)
687 CODE: 709 CODE:
688{ 710{
689 RETVAL = THIS->screen.s_rstyle; 711 RETVAL = THIS->rstyle;
690 THIS->screen.s_rstyle = new_rstyle; 712 THIS->rstyle = new_rstyle;
691} 713}
692 OUTPUT: 714 OUTPUT:
693 RETVAL 715 RETVAL
694 716
695int 717int
726 wchar_t *wstr = new wchar_t [THIS->ncol]; 748 wchar_t *wstr = new wchar_t [THIS->ncol];
727 749
728 for (int col = 0; col <THIS->ncol; col++) 750 for (int col = 0; col <THIS->ncol; col++)
729 wstr [col] = l.t [col]; 751 wstr [col] = l.t [col];
730 752
731 char *str = rxvt_wcstoutf8 (wstr, THIS->ncol);
732 free (wstr);
733
734 SV *sv = newSVpv (str, 0);
735 SvUTF8_on (sv);
736 XPUSHs (sv_2mortal (sv)); 753 XPUSHs (sv_2mortal (wcs2sv (wstr)));
737 free (str); 754
755 delete [] wstr;
738 } 756 }
739 757
740 if (new_text) 758 if (new_text)
741 { 759 {
742 wchar_t *wstr = sv2wcs (new_text); 760 wchar_t *wstr = sv2wcs (new_text);
798 } 816 }
799 } 817 }
800} 818}
801 819
802int 820int
803rxvt_term::ROW_l (int row_number, int new_length = -2) 821rxvt_term::ROW_l (int row_number, int new_length = -1)
804 CODE: 822 CODE:
805{ 823{
806 if (!IN_RANGE_EXC (row_number, -THIS->nsaved, THIS->nrow)) 824 if (!IN_RANGE_EXC (row_number, -THIS->nsaved, THIS->nrow))
807 XSRETURN_EMPTY; 825 XSRETURN_EMPTY;
808 826
809 line_t &l = ROW(row_number); 827 line_t &l = ROW(row_number);
810 RETVAL = l.l < 0 ? THIS->ncol : l.l; 828 RETVAL = l.l;
811 829
812 if (new_length >= -1) 830 if (new_length >= 0)
813 l.l = new_length; 831 l.l = new_length;
814} 832}
815 OUTPUT: 833 OUTPUT:
816 RETVAL 834 RETVAL
817 835
818bool 836bool
819rxvt_term::ROW_is_longer (int row_number) 837rxvt_term::ROW_is_longer (int row_number, int new_is_longer = -1)
820 CODE: 838 CODE:
821{ 839{
822 if (!IN_RANGE_EXC (row_number, -THIS->nsaved, THIS->nrow)) 840 if (!IN_RANGE_EXC (row_number, -THIS->nsaved, THIS->nrow))
823 XSRETURN_EMPTY; 841 XSRETURN_EMPTY;
824 842
825 line_t &l = ROW(row_number); 843 line_t &l = ROW(row_number);
826 RETVAL = l.l < 0; 844 RETVAL = l.is_longer ();
845
846 if (new_is_longer >= 0)
847 l.is_longer (new_is_longer);
827} 848}
828 OUTPUT: 849 OUTPUT:
829 RETVAL 850 RETVAL
830 851
831SV * 852SV *
916void 937void
917rxvt_term::selection (SV *newtext = 0) 938rxvt_term::selection (SV *newtext = 0)
918 PPCODE: 939 PPCODE:
919{ 940{
920 if (GIMME_V != G_VOID) 941 if (GIMME_V != G_VOID)
921 { 942 XPUSHs (sv_2mortal (wcs2sv (THIS->selection.text, THIS->selection.len)));
922 char *sel = rxvt_wcstoutf8 (THIS->selection.text, THIS->selection.len);
923 SV *sv = newSVpv (sel, 0);
924 SvUTF8_on (sv);
925 free (sel);
926 XPUSHs (sv_2mortal (sv));
927 }
928 943
929 if (newtext) 944 if (newtext)
930 { 945 {
931 free (THIS->selection.text); 946 free (THIS->selection.text);
932 947
933 THIS->selection.text = sv2wcs (newtext); 948 THIS->selection.text = sv2wcs (newtext);
934 THIS->selection.len = wcslen (THIS->selection.text); 949 THIS->selection.len = wcslen (THIS->selection.text);
935 } 950 }
951}
952
953void
954rxvt_term::scr_add_lines (SV *string)
955 CODE:
956{
957 wchar_t *wstr = sv2wcs (string);
958 int wlen = wcslen (wstr);
959 unicode_t *ustr = new unicode_t [wlen];
960 int nlines = 0;
961
962 for (int i = wlen; i--; )
963 {
964 ustr [i] = wstr [i];
965 nlines += ustr [i] == '\012';
966 }
967
968 THIS->scr_add_lines (ustr, nlines, wlen);
969
970 free (wstr);
971 delete [] ustr;
936} 972}
937 973
938void 974void
939rxvt_term::tt_write (SV *octets) 975rxvt_term::tt_write (SV *octets)
940 INIT: 976 INIT:

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines