# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1271256242 -10800 # Node ID ef2ebc87518f4b3a85ef3709900a9754dea433f8 # Parent 18da5738c9b67edfd0de16398cbb8893d088abcf Revision: 201012 Kit: 201015 diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/cppstdlib/eabi/libstdcpp_rvct2_2u.def --- a/genericopenlibs/cppstdlib/eabi/libstdcpp_rvct2_2u.def Thu Apr 01 00:15:09 2010 +0300 +++ b/genericopenlibs/cppstdlib/eabi/libstdcpp_rvct2_2u.def Wed Apr 14 17:44:02 2010 +0300 @@ -591,8 +591,8 @@ _ZTIN9stlp_priv9_MessagesE @ 590 NONAME _ZTINSt6locale5facetE @ 591 NONAME _ZTINSt8ios_base7failureE @ 592 NONAME - _ZTISd @ 593 NONAME - _ZTISo @ 594 NONAME + _ZTISd @ 593 NONAME ABSENT + _ZTISo @ 594 NONAME ABSENT _ZTISt10istrstream @ 595 NONAME _ZTISt10moneypunctIcLb0EE @ 596 NONAME _ZTISt10moneypunctIcLb1EE @ 597 NONAME @@ -607,20 +607,20 @@ _ZTISt12length_error @ 606 NONAME _ZTISt12out_of_range @ 607 NONAME _ZTISt12strstreambuf @ 608 NONAME - _ZTISt13basic_filebufIcSt11char_traitsIcEE @ 609 NONAME - _ZTISt13basic_filebufIwSt11char_traitsIwEE @ 610 NONAME - _ZTISt13basic_ostreamIwSt11char_traitsIwEE @ 611 NONAME + _ZTISt13basic_filebufIcSt11char_traitsIcEE @ 609 NONAME ABSENT + _ZTISt13basic_filebufIwSt11char_traitsIwEE @ 610 NONAME ABSENT + _ZTISt13basic_ostreamIwSt11char_traitsIwEE @ 611 NONAME ABSENT _ZTISt13runtime_error @ 612 NONAME - _ZTISt14basic_iostreamIwSt11char_traitsIwEE @ 613 NONAME + _ZTISt14basic_iostreamIwSt11char_traitsIwEE @ 613 NONAME ABSENT _ZTISt14codecvt_bynameIcc11_mb_state_tE @ 614 NONAME _ZTISt14codecvt_bynameIwc11_mb_state_tE @ 615 NONAME _ZTISt14collate_bynameIcE @ 616 NONAME _ZTISt14collate_bynameIwE @ 617 NONAME _ZTISt14overflow_error @ 618 NONAME - _ZTISt15basic_streambufIcSt11char_traitsIcEE @ 619 NONAME - _ZTISt15basic_streambufIwSt11char_traitsIwEE @ 620 NONAME - _ZTISt15basic_stringbufIcSt11char_traitsIcESaIcEE @ 621 NONAME - _ZTISt15basic_stringbufIwSt11char_traitsIwESaIwEE @ 622 NONAME + _ZTISt15basic_streambufIcSt11char_traitsIcEE @ 619 NONAME ABSENT + _ZTISt15basic_streambufIwSt11char_traitsIwEE @ 620 NONAME ABSENT + _ZTISt15basic_stringbufIcSt11char_traitsIcESaIcEE @ 621 NONAME ABSENT + _ZTISt15basic_stringbufIwSt11char_traitsIwESaIwEE @ 622 NONAME ABSENT _ZTISt15messages_bynameIcE @ 623 NONAME _ZTISt15messages_bynameIwE @ 624 NONAME _ZTISt15numpunct_bynameIcE @ 625 NONAME @@ -632,12 +632,12 @@ _ZTISt17moneypunct_bynameIcLb1EE @ 631 NONAME _ZTISt17moneypunct_bynameIwLb0EE @ 632 NONAME _ZTISt17moneypunct_bynameIwLb1EE @ 633 NONAME - _ZTISt18basic_stringstreamIcSt11char_traitsIcESaIcEE @ 634 NONAME - _ZTISt18basic_stringstreamIwSt11char_traitsIwESaIwEE @ 635 NONAME - _ZTISt19basic_istringstreamIcSt11char_traitsIcESaIcEE @ 636 NONAME - _ZTISt19basic_istringstreamIwSt11char_traitsIwESaIwEE @ 637 NONAME - _ZTISt19basic_ostringstreamIcSt11char_traitsIcESaIcEE @ 638 NONAME - _ZTISt19basic_ostringstreamIwSt11char_traitsIwESaIwEE @ 639 NONAME + _ZTISt18basic_stringstreamIcSt11char_traitsIcESaIcEE @ 634 NONAME ABSENT + _ZTISt18basic_stringstreamIwSt11char_traitsIwESaIwEE @ 635 NONAME ABSENT + _ZTISt19basic_istringstreamIcSt11char_traitsIcESaIcEE @ 636 NONAME ABSENT + _ZTISt19basic_istringstreamIwSt11char_traitsIwESaIwEE @ 637 NONAME ABSENT + _ZTISt19basic_ostringstreamIcSt11char_traitsIcESaIcEE @ 638 NONAME ABSENT + _ZTISt19basic_ostringstreamIwSt11char_traitsIwESaIwEE @ 639 NONAME ABSENT _ZTISt5ctypeIcE @ 640 NONAME _ZTISt5ctypeIwE @ 641 NONAME _ZTISt7codecvtIcc11_mb_state_tE @ 642 NONAME @@ -690,8 +690,8 @@ _ZTVN9stlp_priv9_MessagesE @ 689 NONAME _ZTVNSt6locale5facetE @ 690 NONAME _ZTVNSt8ios_base7failureE @ 691 NONAME - _ZTVSd @ 692 NONAME - _ZTVSo @ 693 NONAME + _ZTVSd @ 692 NONAME ABSENT + _ZTVSo @ 693 NONAME ABSENT _ZTVSt10istrstream @ 694 NONAME _ZTVSt10moneypunctIcLb0EE @ 695 NONAME _ZTVSt10moneypunctIcLb1EE @ 696 NONAME @@ -706,20 +706,20 @@ _ZTVSt12length_error @ 705 NONAME _ZTVSt12out_of_range @ 706 NONAME _ZTVSt12strstreambuf @ 707 NONAME - _ZTVSt13basic_filebufIcSt11char_traitsIcEE @ 708 NONAME - _ZTVSt13basic_filebufIwSt11char_traitsIwEE @ 709 NONAME - _ZTVSt13basic_ostreamIwSt11char_traitsIwEE @ 710 NONAME + _ZTVSt13basic_filebufIcSt11char_traitsIcEE @ 708 NONAME ABSENT + _ZTVSt13basic_filebufIwSt11char_traitsIwEE @ 709 NONAME ABSENT + _ZTVSt13basic_ostreamIwSt11char_traitsIwEE @ 710 NONAME ABSENT _ZTVSt13runtime_error @ 711 NONAME - _ZTVSt14basic_iostreamIwSt11char_traitsIwEE @ 712 NONAME + _ZTVSt14basic_iostreamIwSt11char_traitsIwEE @ 712 NONAME ABSENT _ZTVSt14codecvt_bynameIcc11_mb_state_tE @ 713 NONAME _ZTVSt14codecvt_bynameIwc11_mb_state_tE @ 714 NONAME _ZTVSt14collate_bynameIcE @ 715 NONAME _ZTVSt14collate_bynameIwE @ 716 NONAME _ZTVSt14overflow_error @ 717 NONAME - _ZTVSt15basic_streambufIcSt11char_traitsIcEE @ 718 NONAME - _ZTVSt15basic_streambufIwSt11char_traitsIwEE @ 719 NONAME - _ZTVSt15basic_stringbufIcSt11char_traitsIcESaIcEE @ 720 NONAME - _ZTVSt15basic_stringbufIwSt11char_traitsIwESaIwEE @ 721 NONAME + _ZTVSt15basic_streambufIcSt11char_traitsIcEE @ 718 NONAME ABSENT + _ZTVSt15basic_streambufIwSt11char_traitsIwEE @ 719 NONAME ABSENT + _ZTVSt15basic_stringbufIcSt11char_traitsIcESaIcEE @ 720 NONAME ABSENT + _ZTVSt15basic_stringbufIwSt11char_traitsIwESaIwEE @ 721 NONAME ABSENT _ZTVSt15messages_bynameIcE @ 722 NONAME _ZTVSt15messages_bynameIwE @ 723 NONAME _ZTVSt15numpunct_bynameIcE @ 724 NONAME @@ -731,12 +731,12 @@ _ZTVSt17moneypunct_bynameIcLb1EE @ 730 NONAME _ZTVSt17moneypunct_bynameIwLb0EE @ 731 NONAME _ZTVSt17moneypunct_bynameIwLb1EE @ 732 NONAME - _ZTVSt18basic_stringstreamIcSt11char_traitsIcESaIcEE @ 733 NONAME - _ZTVSt18basic_stringstreamIwSt11char_traitsIwESaIwEE @ 734 NONAME - _ZTVSt19basic_istringstreamIcSt11char_traitsIcESaIcEE @ 735 NONAME - _ZTVSt19basic_istringstreamIwSt11char_traitsIwESaIwEE @ 736 NONAME - _ZTVSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE @ 737 NONAME - _ZTVSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE @ 738 NONAME + _ZTVSt18basic_stringstreamIcSt11char_traitsIcESaIcEE @ 733 NONAME ABSENT + _ZTVSt18basic_stringstreamIwSt11char_traitsIwESaIwEE @ 734 NONAME ABSENT + _ZTVSt19basic_istringstreamIcSt11char_traitsIcESaIcEE @ 735 NONAME ABSENT + _ZTVSt19basic_istringstreamIwSt11char_traitsIwESaIwEE @ 736 NONAME ABSENT + _ZTVSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE @ 737 NONAME ABSENT + _ZTVSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE @ 738 NONAME ABSENT _ZTVSt5ctypeIcE @ 739 NONAME _ZTVSt5ctypeIwE @ 740 NONAME _ZTVSt7codecvtIcc11_mb_state_tE @ 741 NONAME diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/cppstdlib/eabi/libstdcppv5u.def --- a/genericopenlibs/cppstdlib/eabi/libstdcppv5u.def Thu Apr 01 00:15:09 2010 +0300 +++ b/genericopenlibs/cppstdlib/eabi/libstdcppv5u.def Wed Apr 14 17:44:02 2010 +0300 @@ -591,8 +591,8 @@ _ZTIN9stlp_priv9_MessagesE @ 590 NONAME _ZTINSt6locale5facetE @ 591 NONAME _ZTINSt8ios_base7failureE @ 592 NONAME - _ZTISd @ 593 NONAME - _ZTISo @ 594 NONAME + _ZTISd @ 593 NONAME ABSENT + _ZTISo @ 594 NONAME ABSENT _ZTISt10istrstream @ 595 NONAME _ZTISt10moneypunctIcLb0EE @ 596 NONAME _ZTISt10moneypunctIcLb1EE @ 597 NONAME @@ -607,20 +607,20 @@ _ZTISt12length_error @ 606 NONAME _ZTISt12out_of_range @ 607 NONAME _ZTISt12strstreambuf @ 608 NONAME - _ZTISt13basic_filebufIcSt11char_traitsIcEE @ 609 NONAME - _ZTISt13basic_filebufIwSt11char_traitsIwEE @ 610 NONAME - _ZTISt13basic_ostreamIwSt11char_traitsIwEE @ 611 NONAME + _ZTISt13basic_filebufIcSt11char_traitsIcEE @ 609 NONAME ABSENT + _ZTISt13basic_filebufIwSt11char_traitsIwEE @ 610 NONAME ABSENT + _ZTISt13basic_ostreamIwSt11char_traitsIwEE @ 611 NONAME ABSENT _ZTISt13runtime_error @ 612 NONAME - _ZTISt14basic_iostreamIwSt11char_traitsIwEE @ 613 NONAME + _ZTISt14basic_iostreamIwSt11char_traitsIwEE @ 613 NONAME ABSENT _ZTISt14codecvt_bynameIcc11_mb_state_tE @ 614 NONAME _ZTISt14codecvt_bynameIwc11_mb_state_tE @ 615 NONAME _ZTISt14collate_bynameIcE @ 616 NONAME _ZTISt14collate_bynameIwE @ 617 NONAME _ZTISt14overflow_error @ 618 NONAME - _ZTISt15basic_streambufIcSt11char_traitsIcEE @ 619 NONAME - _ZTISt15basic_streambufIwSt11char_traitsIwEE @ 620 NONAME - _ZTISt15basic_stringbufIcSt11char_traitsIcESaIcEE @ 621 NONAME - _ZTISt15basic_stringbufIwSt11char_traitsIwESaIwEE @ 622 NONAME + _ZTISt15basic_streambufIcSt11char_traitsIcEE @ 619 NONAME ABSENT + _ZTISt15basic_streambufIwSt11char_traitsIwEE @ 620 NONAME ABSENT + _ZTISt15basic_stringbufIcSt11char_traitsIcESaIcEE @ 621 NONAME ABSENT + _ZTISt15basic_stringbufIwSt11char_traitsIwESaIwEE @ 622 NONAME ABSENT _ZTISt15messages_bynameIcE @ 623 NONAME _ZTISt15messages_bynameIwE @ 624 NONAME _ZTISt15numpunct_bynameIcE @ 625 NONAME @@ -632,12 +632,12 @@ _ZTISt17moneypunct_bynameIcLb1EE @ 631 NONAME _ZTISt17moneypunct_bynameIwLb0EE @ 632 NONAME _ZTISt17moneypunct_bynameIwLb1EE @ 633 NONAME - _ZTISt18basic_stringstreamIcSt11char_traitsIcESaIcEE @ 634 NONAME - _ZTISt18basic_stringstreamIwSt11char_traitsIwESaIwEE @ 635 NONAME - _ZTISt19basic_istringstreamIcSt11char_traitsIcESaIcEE @ 636 NONAME - _ZTISt19basic_istringstreamIwSt11char_traitsIwESaIwEE @ 637 NONAME - _ZTISt19basic_ostringstreamIcSt11char_traitsIcESaIcEE @ 638 NONAME - _ZTISt19basic_ostringstreamIwSt11char_traitsIwESaIwEE @ 639 NONAME + _ZTISt18basic_stringstreamIcSt11char_traitsIcESaIcEE @ 634 NONAME ABSENT + _ZTISt18basic_stringstreamIwSt11char_traitsIwESaIwEE @ 635 NONAME ABSENT + _ZTISt19basic_istringstreamIcSt11char_traitsIcESaIcEE @ 636 NONAME ABSENT + _ZTISt19basic_istringstreamIwSt11char_traitsIwESaIwEE @ 637 NONAME ABSENT + _ZTISt19basic_ostringstreamIcSt11char_traitsIcESaIcEE @ 638 NONAME ABSENT + _ZTISt19basic_ostringstreamIwSt11char_traitsIwESaIwEE @ 639 NONAME ABSENT _ZTISt5ctypeIcE @ 640 NONAME _ZTISt5ctypeIwE @ 641 NONAME _ZTISt7codecvtIcc11_mb_state_tE @ 642 NONAME @@ -662,26 +662,26 @@ _ZTISt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE @ 661 NONAME _ZTISt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE @ 662 NONAME _ZTISt9strstream @ 663 NONAME - _ZTTSd @ 664 NONAME - _ZTTSi @ 665 NONAME - _ZTTSo @ 666 NONAME + _ZTTSd @ 664 NONAME ABSENT + _ZTTSi @ 665 NONAME ABSENT + _ZTTSo @ 666 NONAME ABSENT _ZTTSt10istrstream @ 667 NONAME _ZTTSt10ostrstream @ 668 NONAME _ZTTSt13basic_fstreamIcSt11char_traitsIcEE @ 669 NONAME ABSENT _ZTTSt13basic_fstreamIwSt11char_traitsIwEE @ 670 NONAME ABSENT - _ZTTSt13basic_istreamIwSt11char_traitsIwEE @ 671 NONAME - _ZTTSt13basic_ostreamIwSt11char_traitsIwEE @ 672 NONAME + _ZTTSt13basic_istreamIwSt11char_traitsIwEE @ 671 NONAME ABSENT + _ZTTSt13basic_ostreamIwSt11char_traitsIwEE @ 672 NONAME ABSENT _ZTTSt14basic_ifstreamIcSt11char_traitsIcEE @ 673 NONAME ABSENT _ZTTSt14basic_ifstreamIwSt11char_traitsIwEE @ 674 NONAME ABSENT - _ZTTSt14basic_iostreamIwSt11char_traitsIwEE @ 675 NONAME + _ZTTSt14basic_iostreamIwSt11char_traitsIwEE @ 675 NONAME ABSENT _ZTTSt14basic_ofstreamIcSt11char_traitsIcEE @ 676 NONAME ABSENT _ZTTSt14basic_ofstreamIwSt11char_traitsIwEE @ 677 NONAME ABSENT - _ZTTSt18basic_stringstreamIcSt11char_traitsIcESaIcEE @ 678 NONAME - _ZTTSt18basic_stringstreamIwSt11char_traitsIwESaIwEE @ 679 NONAME - _ZTTSt19basic_istringstreamIcSt11char_traitsIcESaIcEE @ 680 NONAME - _ZTTSt19basic_istringstreamIwSt11char_traitsIwESaIwEE @ 681 NONAME - _ZTTSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE @ 682 NONAME - _ZTTSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE @ 683 NONAME + _ZTTSt18basic_stringstreamIcSt11char_traitsIcESaIcEE @ 678 NONAME ABSENT + _ZTTSt18basic_stringstreamIwSt11char_traitsIwESaIwEE @ 679 NONAME ABSENT + _ZTTSt19basic_istringstreamIcSt11char_traitsIcESaIcEE @ 680 NONAME ABSENT + _ZTTSt19basic_istringstreamIwSt11char_traitsIwESaIwEE @ 681 NONAME ABSENT + _ZTTSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE @ 682 NONAME ABSENT + _ZTTSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE @ 683 NONAME ABSENT _ZTTSt9strstream @ 684 NONAME _ZTVN9stlp_priv14_Messages_implE @ 685 NONAME _ZTVN9stlp_priv16stdio_istreambufE @ 686 NONAME @@ -690,8 +690,8 @@ _ZTVN9stlp_priv9_MessagesE @ 689 NONAME _ZTVNSt6locale5facetE @ 690 NONAME _ZTVNSt8ios_base7failureE @ 691 NONAME - _ZTVSd @ 692 NONAME - _ZTVSo @ 693 NONAME + _ZTVSd @ 692 NONAME ABSENT + _ZTVSo @ 693 NONAME ABSENT _ZTVSt10istrstream @ 694 NONAME _ZTVSt10moneypunctIcLb0EE @ 695 NONAME _ZTVSt10moneypunctIcLb1EE @ 696 NONAME @@ -706,20 +706,20 @@ _ZTVSt12length_error @ 705 NONAME _ZTVSt12out_of_range @ 706 NONAME _ZTVSt12strstreambuf @ 707 NONAME - _ZTVSt13basic_filebufIcSt11char_traitsIcEE @ 708 NONAME - _ZTVSt13basic_filebufIwSt11char_traitsIwEE @ 709 NONAME - _ZTVSt13basic_ostreamIwSt11char_traitsIwEE @ 710 NONAME + _ZTVSt13basic_filebufIcSt11char_traitsIcEE @ 708 NONAME ABSENT + _ZTVSt13basic_filebufIwSt11char_traitsIwEE @ 709 NONAME ABSENT + _ZTVSt13basic_ostreamIwSt11char_traitsIwEE @ 710 NONAME ABSENT _ZTVSt13runtime_error @ 711 NONAME - _ZTVSt14basic_iostreamIwSt11char_traitsIwEE @ 712 NONAME + _ZTVSt14basic_iostreamIwSt11char_traitsIwEE @ 712 NONAME ABSENT _ZTVSt14codecvt_bynameIcc11_mb_state_tE @ 713 NONAME _ZTVSt14codecvt_bynameIwc11_mb_state_tE @ 714 NONAME _ZTVSt14collate_bynameIcE @ 715 NONAME _ZTVSt14collate_bynameIwE @ 716 NONAME _ZTVSt14overflow_error @ 717 NONAME - _ZTVSt15basic_streambufIcSt11char_traitsIcEE @ 718 NONAME - _ZTVSt15basic_streambufIwSt11char_traitsIwEE @ 719 NONAME - _ZTVSt15basic_stringbufIcSt11char_traitsIcESaIcEE @ 720 NONAME - _ZTVSt15basic_stringbufIwSt11char_traitsIwESaIwEE @ 721 NONAME + _ZTVSt15basic_streambufIcSt11char_traitsIcEE @ 718 NONAME ABSENT + _ZTVSt15basic_streambufIwSt11char_traitsIwEE @ 719 NONAME ABSENT + _ZTVSt15basic_stringbufIcSt11char_traitsIcESaIcEE @ 720 NONAME ABSENT + _ZTVSt15basic_stringbufIwSt11char_traitsIwESaIwEE @ 721 NONAME ABSENT _ZTVSt15messages_bynameIcE @ 722 NONAME _ZTVSt15messages_bynameIwE @ 723 NONAME _ZTVSt15numpunct_bynameIcE @ 724 NONAME @@ -731,12 +731,12 @@ _ZTVSt17moneypunct_bynameIcLb1EE @ 730 NONAME _ZTVSt17moneypunct_bynameIwLb0EE @ 731 NONAME _ZTVSt17moneypunct_bynameIwLb1EE @ 732 NONAME - _ZTVSt18basic_stringstreamIcSt11char_traitsIcESaIcEE @ 733 NONAME - _ZTVSt18basic_stringstreamIwSt11char_traitsIwESaIwEE @ 734 NONAME - _ZTVSt19basic_istringstreamIcSt11char_traitsIcESaIcEE @ 735 NONAME - _ZTVSt19basic_istringstreamIwSt11char_traitsIwESaIwEE @ 736 NONAME - _ZTVSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE @ 737 NONAME - _ZTVSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE @ 738 NONAME + _ZTVSt18basic_stringstreamIcSt11char_traitsIcESaIcEE @ 733 NONAME ABSENT + _ZTVSt18basic_stringstreamIwSt11char_traitsIwESaIwEE @ 734 NONAME ABSENT + _ZTVSt19basic_istringstreamIcSt11char_traitsIcESaIcEE @ 735 NONAME ABSENT + _ZTVSt19basic_istringstreamIwSt11char_traitsIwESaIwEE @ 736 NONAME ABSENT + _ZTVSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE @ 737 NONAME ABSENT + _ZTVSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE @ 738 NONAME ABSENT _ZTVSt5ctypeIcE @ 739 NONAME _ZTVSt5ctypeIwE @ 740 NONAME _ZTVSt7codecvtIcc11_mb_state_tE @ 741 NONAME diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/cppstdlib/stl/stlport/stl/_fstream.c --- a/genericopenlibs/cppstdlib/stl/stlport/stl/_fstream.c Thu Apr 01 00:15:09 2010 +0300 +++ b/genericopenlibs/cppstdlib/stl/stlport/stl/_fstream.c Wed Apr 14 17:44:02 2010 +0300 @@ -63,18 +63,6 @@ this->_M_setup_codecvt(locale(), false); } -template -basic_filebuf<_CharT, _Traits>::~basic_filebuf() { - this->close(); - _M_deallocate_buffers(); -} - - -template -_STLP_TYPENAME_ON_RETURN_TYPE basic_filebuf<_CharT, _Traits>::int_type -basic_filebuf<_CharT, _Traits>::underflow() { - return _Underflow<_CharT, _Traits>::_M_doit(this); -} template basic_filebuf<_CharT, _Traits>* @@ -123,284 +111,6 @@ } -//---------------------------------------------------------------------- -// basic_filebuf<> overridden protected virtual member functions - -template -streamsize basic_filebuf<_CharT, _Traits>::showmanyc() { - // Is there any possibility that reads can succeed? - if (!this->is_open() || _M_in_output_mode || _M_in_error_mode) - return -1; - else if (_M_in_putback_mode) - return this->egptr() - this->gptr(); - else if (_M_constant_width) { - streamoff __pos = _M_base._M_seek(0, ios_base::cur); - streamoff __size = _M_base._M_file_size(); - return __pos >= 0 && __size > __pos ? __size - __pos : 0; - } - else - return 0; -} - - -// Make a putback position available, if necessary, by switching to a -// special internal buffer used only for putback. The buffer is -// [_M_pback_buf, _M_pback_buf + _S_pback_buf_size), but the base -// class only sees a piece of it at a time. (We want to make sure -// that we don't try to read a character that hasn't been initialized.) -// The end of the putback buffer is always _M_pback_buf + _S_pback_buf_size, -// but the beginning is usually not _M_pback_buf. -template -__BF_int_type__ -basic_filebuf<_CharT, _Traits>::pbackfail(int_type __c) { - const int_type __eof = traits_type::eof(); - - // If we aren't already in input mode, pushback is impossible. - if (!_M_in_input_mode) - return __eof; - - // We can use the ordinary get buffer if there's enough space, and - // if it's a buffer that we're allowed to write to. - if (this->gptr() != this->eback() && - (traits_type::eq_int_type(__c, __eof) || - traits_type::eq(traits_type::to_char_type(__c), this->gptr()[-1]) || - !_M_mmap_base)) { - this->gbump(-1); - if (traits_type::eq_int_type(__c, __eof) || - traits_type::eq(traits_type::to_char_type(__c), *this->gptr())) - return traits_type::to_int_type(*this->gptr()); - } - else if (!traits_type::eq_int_type(__c, __eof)) { - // Are we in the putback buffer already? - _CharT* __pback_end = _M_pback_buf + __STATIC_CAST(int,_S_pback_buf_size); - if (_M_in_putback_mode) { - // Do we have more room in the putback buffer? - if (this->eback() != _M_pback_buf) - this->setg(this->egptr() - 1, this->egptr() - 1, __pback_end); - else - return __eof; // No more room in the buffer, so fail. - } - else { // We're not yet in the putback buffer. - _M_saved_eback = this->eback(); - _M_saved_gptr = this->gptr(); - _M_saved_egptr = this->egptr(); - this->setg(__pback_end - 1, __pback_end - 1, __pback_end); - _M_in_putback_mode = true; - } - } - else - return __eof; - - // We have made a putback position available. Assign to it, and return. - *this->gptr() = traits_type::to_char_type(__c); - return __c; -} - -// This member function flushes the put area, and also outputs the -// character __c (unless __c is eof). Invariant: we always leave room -// in the internal buffer for one character more than the base class knows -// about. We see the internal buffer as [_M_int_buf, _M_int_buf_EOS), but -// the base class only sees [_M_int_buf, _M_int_buf_EOS - 1). -template -__BF_int_type__ -basic_filebuf<_CharT, _Traits>::overflow(int_type __c) { - // Switch to output mode, if necessary. - if (!_M_in_output_mode) - if (!_M_switch_to_output_mode()) - return traits_type::eof(); - - _CharT* __ibegin = this->_M_int_buf; - _CharT* __iend = this->pptr(); - this->setp(_M_int_buf, _M_int_buf_EOS - 1); - - // Put __c at the end of the internal buffer. - if (!traits_type::eq_int_type(__c, traits_type::eof())) - *__iend++ = _Traits::to_char_type(__c); - - // For variable-width encodings, output may take more than one pass. - while (__ibegin != __iend) { - const _CharT* __inext = __ibegin; - char* __enext = _M_ext_buf; - typename _Codecvt::result __status - = _M_codecvt->out(_M_state, __ibegin, __iend, __inext, - _M_ext_buf, _M_ext_buf_EOS, __enext); - if (__status == _Codecvt::noconv) { - return _Noconv_output<_Traits>::_M_doit(this, __ibegin, __iend) - ? traits_type::not_eof(__c) - : _M_output_error(); - } - - // For a constant-width encoding we know that the external buffer - // is large enough, so failure to consume the entire internal buffer - // or to produce the correct number of external characters, is an error. - // For a variable-width encoding, however, we require only that we - // consume at least one internal character - else if (__status != _Codecvt::error && - (((__inext == __iend) && - (__enext - _M_ext_buf == _M_width * (__iend - __ibegin))) || - (!_M_constant_width && __inext != __ibegin))) { - // We successfully converted part or all of the internal buffer. - ptrdiff_t __n = __enext - _M_ext_buf; - if (_M_write(_M_ext_buf, __n)) - __ibegin += __inext - __ibegin; - else - return _M_output_error(); - } - else - return _M_output_error(); - } - - return traits_type::not_eof(__c); -} - -// This member function must be called before any I/O has been -// performed on the stream, otherwise it has no effect. -// -// __buf == 0 && __n == 0 means to make this stream unbuffered. -// __buf != 0 && __n > 0 means to use __buf as the stream's internal -// buffer, rather than the buffer that would otherwise be allocated -// automatically. __buf must be a pointer to an array of _CharT whose -// size is at least __n. -template -basic_streambuf<_CharT, _Traits>* -basic_filebuf<_CharT, _Traits>::setbuf(_CharT* __buf, streamsize __n) { - if (!_M_in_input_mode &&! _M_in_output_mode && !_M_in_error_mode && - _M_int_buf == 0) { - if (__buf == 0 && __n == 0) - _M_allocate_buffers(0, 1); - else if (__buf != 0 && __n > 0) - _M_allocate_buffers(__buf, __n); - } - return this; -} - -template -__BF_pos_type__ -basic_filebuf<_CharT, _Traits>::seekoff(off_type __off, - ios_base::seekdir __whence, - ios_base::openmode /* dummy */) { - if (this->is_open() && - (__off == 0 || (_M_constant_width && this->_M_base._M_in_binary_mode()))) { - - if (!_M_seek_init(__off != 0 || __whence != ios_base::cur)) - return pos_type(-1); - - // Seek to beginning or end, regardless of whether we're in input mode. - if (__whence == ios_base::beg || __whence == ios_base::end) - return _M_seek_return(_M_base._M_seek(_M_width * __off, __whence), - _State_type()); - - // Seek relative to current position. Complicated if we're in input mode. - else if (__whence == ios_base::cur) { - if (!_M_in_input_mode) - return _M_seek_return(_M_base._M_seek(_M_width * __off, __whence), - _State_type()); - else if (_M_mmap_base != 0) { - // __off is relative to gptr(). We need to do a bit of arithmetic - // to get an offset relative to the external file pointer. - streamoff __adjust = _M_mmap_len - (this->gptr() - (_CharT*) _M_mmap_base); - - // if __off == 0, we do not need to exit input mode and to shift file pointer - return __off == 0 ? pos_type(_M_base._M_seek(0, ios_base::cur) - __adjust) - : _M_seek_return(_M_base._M_seek(__off - __adjust, ios_base::cur), _State_type()); - } - else if (_M_constant_width) { // Get or set the position. - streamoff __iadj = _M_width * (this->gptr() - this->eback()); - - // Compensate for offset relative to gptr versus offset relative - // to external pointer. For a text-oriented stream, where the - // compensation is more than just pointer arithmetic, we may get - // but not set the current position. - - if (__iadj <= _M_ext_buf_end - _M_ext_buf) { - streamoff __eadj = _M_base._M_get_offset(_M_ext_buf + __STATIC_CAST(ptrdiff_t, __iadj), _M_ext_buf_end); - - return __off == 0 ? pos_type(_M_base._M_seek(0, ios_base::cur) - __eadj) - : _M_seek_return(_M_base._M_seek(__off - __eadj, ios_base::cur), _State_type()); - } - } else { // Get the position. Encoding is var width. - // Get position in internal buffer. - ptrdiff_t __ipos = this->gptr() - this->eback(); - - // Get corresponding position in external buffer. - _State_type __state = _M_state; - int __epos = _M_codecvt->length(__state, _M_ext_buf, _M_ext_buf_end, - __ipos); - - if (__epos >= 0) { - // Sanity check (expensive): make sure __epos is the right answer. - _State_type __tmp_state = _M_state; - _Filebuf_Tmp_Buf<_CharT> __buf(__ipos); - _CharT* __ibegin = __buf._M_ptr; - _CharT* __inext = __ibegin; - - const char* __dummy; - typename _Codecvt::result __status - = _M_codecvt->in(__tmp_state, - _M_ext_buf, _M_ext_buf + __epos, __dummy, - __ibegin, __ibegin + __ipos, __inext); - if (__status != _Codecvt::error && - (__status == _Codecvt::noconv || - (__inext == __ibegin + __ipos && - equal(this->eback(), this->gptr(), __ibegin, _STLP_PRIV _Eq_traits())))) { - // Get the current position (at the end of the external buffer), - // then adjust it. Again, it might be a text-oriented stream. - streamoff __cur = _M_base._M_seek(0, ios_base::cur); - streamoff __adj = - _M_base._M_get_offset(_M_ext_buf, _M_ext_buf + __epos) - - _M_base._M_get_offset(_M_ext_buf, _M_ext_buf_end); - if (__cur != -1 && __cur + __adj >= 0) - return __off == 0 ? pos_type(__cur + __adj) - : _M_seek_return(__cur + __adj, __state); - //return _M_seek_return(__cur + __adj, __state); - } - // We failed the sanity check here. - } - } - } - // Unrecognized value for __whence here. - } - - return pos_type(-1); -} - - -template -__BF_pos_type__ -basic_filebuf<_CharT, _Traits>::seekpos(pos_type __pos, - ios_base::openmode /* dummy */) { - if (this->is_open()) { - if (!_M_seek_init(true)) - return pos_type(-1); - - streamoff __off = off_type(__pos); - if (__off != -1 && _M_base._M_seek(__off, ios_base::beg) != -1) { - _M_state = __pos.state(); - return _M_seek_return(__off, __pos.state()); - } - } - - return pos_type(-1); -} - - -template -int basic_filebuf<_CharT, _Traits>::sync() { - if (_M_in_output_mode) - return traits_type::eq_int_type(this->overflow(traits_type::eof()), - traits_type::eof()) ? -1 : 0; - return 0; -} - - -// Change the filebuf's locale. This member function has no effect -// unless it is called before any I/O is performed on the stream. -template -void basic_filebuf<_CharT, _Traits>::imbue(const locale& __loc) { - if (!_M_in_input_mode && !_M_in_output_mode && !_M_in_error_mode) { - this->_M_setup_codecvt(__loc); - } -} //---------------------------------------------------------------------- // basic_filebuf<> helper functions. diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/cppstdlib/stl/stlport/stl/_fstream.h --- a/genericopenlibs/cppstdlib/stl/stlport/stl/_fstream.h Thu Apr 01 00:15:09 2010 +0300 +++ b/genericopenlibs/cppstdlib/stl/stlport/stl/_fstream.h Wed Apr 14 17:44:02 2010 +0300 @@ -185,6 +185,15 @@ _STLP_TEMPLATE_NULL class _Underflow< char, char_traits >; +// public: +// helper class. +template +struct _Filebuf_Tmp_Buf { + _CharT* _M_ptr; + _Filebuf_Tmp_Buf(ptrdiff_t __n) : _M_ptr(0) { _M_ptr = new _CharT[__n]; } + ~_Filebuf_Tmp_Buf() { delete[] _M_ptr; } +}; + template class basic_filebuf : public basic_streambuf<_CharT, _Traits> { public: // Types. @@ -200,7 +209,11 @@ public: // Constructors, destructor. basic_filebuf(); - ~basic_filebuf(); + ~basic_filebuf() + { + this->close(); + _M_deallocate_buffers(); + } public: // Opening and closing files. bool is_open() const { return _M_base.__is_open(); } @@ -236,22 +249,267 @@ _Self* close(); -protected: // Virtual functions from basic_streambuf. - virtual streamsize showmanyc(); - virtual int_type underflow(); +protected: // Virtual functions from basic_streambuf. + + virtual streamsize showmanyc() { + + // Is there any possibility that reads can succeed? + if (!this->is_open() || _M_in_output_mode || _M_in_error_mode) + return -1; + else if (_M_in_putback_mode) + return this->egptr() - this->gptr(); + else if (_M_constant_width) { + streamoff __pos = _M_base._M_seek(0, ios_base::cur); + streamoff __size = _M_base._M_file_size(); + return __pos >= 0 && __size > __pos ? __size - __pos : 0; + } + else + return 0; + + } + virtual int_type underflow() { + + return _Underflow<_CharT, _Traits>::_M_doit(this); + + } + + virtual int_type pbackfail(int_type __c= traits_type::eof()) { + + const int_type __eof = traits_type::eof(); + + // If we aren't already in input mode, pushback is impossible. + if (!_M_in_input_mode) + return __eof; - virtual int_type pbackfail(int_type = traits_type::eof()); - virtual int_type overflow(int_type = traits_type::eof()); + // We can use the ordinary get buffer if there's enough space, and + // if it's a buffer that we're allowed to write to. + if (this->gptr() != this->eback() && + (traits_type::eq_int_type(__c, __eof) || + traits_type::eq(traits_type::to_char_type(__c), this->gptr()[-1]) || + !_M_mmap_base)) { + this->gbump(-1); + if (traits_type::eq_int_type(__c, __eof) || + traits_type::eq(traits_type::to_char_type(__c), *this->gptr())) + return traits_type::to_int_type(*this->gptr()); + } + else if (!traits_type::eq_int_type(__c, __eof)) { + // Are we in the putback buffer already? + _CharT* __pback_end = _M_pback_buf + __STATIC_CAST(int,_S_pback_buf_size); + if (_M_in_putback_mode) { + // Do we have more room in the putback buffer? + if (this->eback() != _M_pback_buf) + this->setg(this->egptr() - 1, this->egptr() - 1, __pback_end); + else + return __eof; // No more room in the buffer, so fail. + } + else { // We're not yet in the putback buffer. + _M_saved_eback = this->eback(); + _M_saved_gptr = this->gptr(); + _M_saved_egptr = this->egptr(); + this->setg(__pback_end - 1, __pback_end - 1, __pback_end); + _M_in_putback_mode = true; + } + } + else + return __eof; + + // We have made a putback position available. Assign to it, and return. + *this->gptr() = traits_type::to_char_type(__c); + return __c; + + } + + virtual int_type overflow(int_type __c) { + + // Switch to output mode, if necessary. + if (!_M_in_output_mode) + if (!_M_switch_to_output_mode()) + return traits_type::eof(); + + _CharT* __ibegin = this->_M_int_buf; + _CharT* __iend = this->pptr(); + this->setp(_M_int_buf, _M_int_buf_EOS - 1); + + // Put __c at the end of the internal buffer. + if (!traits_type::eq_int_type(__c, traits_type::eof())) + *__iend++ = _Traits::to_char_type(__c); + + // For variable-width encodings, output may take more than one pass. + while (__ibegin != __iend) { + const _CharT* __inext = __ibegin; + char* __enext = _M_ext_buf; + typename _Codecvt::result __status + = _M_codecvt->out(_M_state, __ibegin, __iend, __inext, + _M_ext_buf, _M_ext_buf_EOS, __enext); + if (__status == _Codecvt::noconv) { + return _Noconv_output<_Traits>::_M_doit(this, __ibegin, __iend) + ? traits_type::not_eof(__c) + : _M_output_error(); + } + + // For a constant-width encoding we know that the external buffer + // is large enough, so failure to consume the entire internal buffer + // or to produce the correct number of external characters, is an error. + // For a variable-width encoding, however, we require only that we + // consume at least one internal character + else if (__status != _Codecvt::error && + (((__inext == __iend) && + (__enext - _M_ext_buf == _M_width * (__iend - __ibegin))) || + (!_M_constant_width && __inext != __ibegin))) { + // We successfully converted part or all of the internal buffer. + ptrdiff_t __n = __enext - _M_ext_buf; + if (_M_write(_M_ext_buf, __n)) + __ibegin += __inext - __ibegin; + else + return _M_output_error(); + } + else + return _M_output_error(); + } + + return traits_type::not_eof(__c); + + } + + virtual basic_streambuf<_CharT, _Traits>* setbuf(_CharT* __buf, streamsize __n) { - virtual basic_streambuf<_CharT, _Traits>* setbuf(char_type*, streamsize); - virtual pos_type seekoff(off_type, ios_base::seekdir, - ios_base::openmode = ios_base::in | ios_base::out); - virtual pos_type seekpos(pos_type, - ios_base::openmode = ios_base::in | ios_base::out); + if (!_M_in_input_mode &&! _M_in_output_mode && !_M_in_error_mode && + _M_int_buf == 0) { + if (__buf == 0 && __n == 0) + _M_allocate_buffers(0, 1); + else if (__buf != 0 && __n > 0) + _M_allocate_buffers(__buf, __n); + } + return this; + + } + + virtual pos_type seekoff(off_type __off, + ios_base::seekdir __whence, + ios_base::openmode /* dummy */) { + + if (this->is_open() && + (__off == 0 || (_M_constant_width && this->_M_base._M_in_binary_mode()))) { + + if (!_M_seek_init(__off != 0 || __whence != ios_base::cur)) + return pos_type(-1); + + // Seek to beginning or end, regardless of whether we're in input mode. + if (__whence == ios_base::beg || __whence == ios_base::end) + return _M_seek_return(_M_base._M_seek(_M_width * __off, __whence), + _State_type()); + + // Seek relative to current position. Complicated if we're in input mode. + else if (__whence == ios_base::cur) { + if (!_M_in_input_mode) + return _M_seek_return(_M_base._M_seek(_M_width * __off, __whence), + _State_type()); + else if (_M_mmap_base != 0) { + // __off is relative to gptr(). We need to do a bit of arithmetic + // to get an offset relative to the external file pointer. + streamoff __adjust = _M_mmap_len - (this->gptr() - (_CharT*) _M_mmap_base); + + // if __off == 0, we do not need to exit input mode and to shift file pointer + return __off == 0 ? pos_type(_M_base._M_seek(0, ios_base::cur) - __adjust) + : _M_seek_return(_M_base._M_seek(__off - __adjust, ios_base::cur), _State_type()); + } + else if (_M_constant_width) { // Get or set the position. + streamoff __iadj = _M_width * (this->gptr() - this->eback()); + + // Compensate for offset relative to gptr versus offset relative + // to external pointer. For a text-oriented stream, where the + // compensation is more than just pointer arithmetic, we may get + // but not set the current position. + + if (__iadj <= _M_ext_buf_end - _M_ext_buf) { + streamoff __eadj = _M_base._M_get_offset(_M_ext_buf + __STATIC_CAST(ptrdiff_t, __iadj), _M_ext_buf_end); + + return __off == 0 ? pos_type(_M_base._M_seek(0, ios_base::cur) - __eadj) + : _M_seek_return(_M_base._M_seek(__off - __eadj, ios_base::cur), _State_type()); + } + } else { // Get the position. Encoding is var width. + // Get position in internal buffer. + ptrdiff_t __ipos = this->gptr() - this->eback(); + + // Get corresponding position in external buffer. + _State_type __state = _M_state; + int __epos = _M_codecvt->length(__state, _M_ext_buf, _M_ext_buf_end, + __ipos); - virtual int sync(); - virtual void imbue(const locale&); + if (__epos >= 0) { + // Sanity check (expensive): make sure __epos is the right answer. + _State_type __tmp_state = _M_state; + _Filebuf_Tmp_Buf<_CharT> __buf(__ipos); + _CharT* __ibegin = __buf._M_ptr; + _CharT* __inext = __ibegin; + + const char* __dummy; + typename _Codecvt::result __status + = _M_codecvt->in(__tmp_state, + _M_ext_buf, _M_ext_buf + __epos, __dummy, + __ibegin, __ibegin + __ipos, __inext); + if (__status != _Codecvt::error && + (__status == _Codecvt::noconv || + (__inext == __ibegin + __ipos && + equal(this->eback(), this->gptr(), __ibegin, _STLP_PRIV _Eq_traits())))) { + // Get the current position (at the end of the external buffer), + // then adjust it. Again, it might be a text-oriented stream. + streamoff __cur = _M_base._M_seek(0, ios_base::cur); + streamoff __adj = + _M_base._M_get_offset(_M_ext_buf, _M_ext_buf + __epos) - + _M_base._M_get_offset(_M_ext_buf, _M_ext_buf_end); + if (__cur != -1 && __cur + __adj >= 0) + return __off == 0 ? pos_type(__cur + __adj) + : _M_seek_return(__cur + __adj, __state); + //return _M_seek_return(__cur + __adj, __state); + } + // We failed the sanity check here. + } + } + } + // Unrecognized value for __whence here. + } + + return pos_type(-1); + } + + virtual pos_type seekpos(pos_type __pos, + ios_base::openmode /* dummy */) { + + if (this->is_open()) { + if (!_M_seek_init(true)) + return pos_type(-1); + + streamoff __off = off_type(__pos); + if (__off != -1 && _M_base._M_seek(__off, ios_base::beg) != -1) { + _M_state = __pos.state(); + return _M_seek_return(__off, __pos.state()); + } + } + + return pos_type(-1); + + } + + virtual int sync() { + + if (_M_in_output_mode) + return traits_type::eq_int_type(this->overflow(traits_type::eof()), + traits_type::eof()) ? -1 : 0; + return 0; + + } + + virtual void imbue(const locale& __loc) { + + if (!_M_in_input_mode && !_M_in_output_mode && !_M_in_error_mode) { + this->_M_setup_codecvt(__loc); + } + + } + + private: // Helper functions. // Precondition: we are currently in putback input mode. Effect: @@ -379,16 +637,6 @@ # endif #endif /* _STLP_USE_TEMPLATE_EXPORT */ -// public: -// helper class. -template -struct _Filebuf_Tmp_Buf { - _CharT* _M_ptr; - _Filebuf_Tmp_Buf(ptrdiff_t __n) : _M_ptr(0) { _M_ptr = new _CharT[__n]; } - ~_Filebuf_Tmp_Buf() { delete[] _M_ptr; } -}; - - // // This class had to be designed very carefully to work // with Visual C++. diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/cppstdlib/stl/stlport/stl/_istream.c --- a/genericopenlibs/cppstdlib/stl/stlport/stl/_istream.c Thu Apr 01 00:15:09 2010 +0300 +++ b/genericopenlibs/cppstdlib/stl/stlport/stl/_istream.c Wed Apr 14 17:44:02 2010 +0300 @@ -1403,6 +1403,7 @@ // basic_iostream<> class // ---------------------------------------------------------------- + template basic_iostream<_CharT, _Traits> ::basic_iostream(basic_streambuf<_CharT, _Traits>* __buf) @@ -1412,9 +1413,6 @@ this->init(__buf); } -template -basic_iostream<_CharT, _Traits>::~basic_iostream() -{} _STLP_END_NAMESPACE diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/cppstdlib/stl/stlport/stl/_istream.h --- a/genericopenlibs/cppstdlib/stl/stlport/stl/_istream.h Thu Apr 01 00:15:09 2010 +0300 +++ b/genericopenlibs/cppstdlib/stl/stlport/stl/_istream.h Wed Apr 14 17:44:02 2010 +0300 @@ -334,7 +334,7 @@ typedef basic_ios<_CharT, _Traits> _Basic_ios; explicit basic_iostream(basic_streambuf<_CharT, _Traits>* __buf); - virtual ~basic_iostream(); + virtual ~basic_iostream(){} }; # if defined (_STLP_USE_TEMPLATE_EXPORT) diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/cppstdlib/stl/stlport/stl/_ostream.c --- a/genericopenlibs/cppstdlib/stl/stlport/stl/_ostream.c Thu Apr 01 00:15:09 2010 +0300 +++ b/genericopenlibs/cppstdlib/stl/stlport/stl/_ostream.c Wed Apr 14 17:44:02 2010 +0300 @@ -33,15 +33,14 @@ // Constructor, destructor + template basic_ostream<_CharT, _Traits>::basic_ostream(basic_streambuf<_CharT, _Traits>* __buf) : basic_ios<_CharT, _Traits>() { this->init(__buf); } -template -basic_ostream<_CharT, _Traits>::~basic_ostream() -{} + // Output directly from a streambuf. template diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/cppstdlib/stl/stlport/stl/_ostream.h --- a/genericopenlibs/cppstdlib/stl/stlport/stl/_ostream.h Thu Apr 01 00:15:09 2010 +0300 +++ b/genericopenlibs/cppstdlib/stl/stlport/stl/_ostream.h Wed Apr 14 17:44:02 2010 +0300 @@ -68,8 +68,13 @@ typedef basic_ios<_CharT, _Traits> _Basic_ios; public: // Constructor and destructor. + explicit basic_ostream(basic_streambuf<_CharT, _Traits>* __buf); - ~basic_ostream(); + + + + ~basic_ostream() {} + public: // Hooks for manipulators. typedef basic_ios<_CharT, _Traits>& (_STLP_CALL *__ios_fn)(basic_ios<_CharT, _Traits>&); diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/cppstdlib/stl/stlport/stl/_sstream.c --- a/genericopenlibs/cppstdlib/stl/stlport/stl/_sstream.c Thu Apr 01 00:15:09 2010 +0300 +++ b/genericopenlibs/cppstdlib/stl/stlport/stl/_sstream.c Wed Apr 14 17:44:02 2010 +0300 @@ -54,9 +54,7 @@ _M_set_ptrs(); } -template -basic_stringbuf<_CharT, _Traits, _Alloc>::~basic_stringbuf() -{} + // Set the underlying string to a new value. template @@ -89,355 +87,8 @@ } } -// Precondition: gptr() >= egptr(). Returns a character, if one is available. -template -__BSB_int_type__ -basic_stringbuf<_CharT, _Traits, _Alloc>::underflow() { - return this->gptr() != this->egptr() - ? _Traits::to_int_type(*this->gptr()) - : _Traits::eof(); -} - -// Precondition: gptr() >= egptr(). -template -__BSB_int_type__ -basic_stringbuf<_CharT, _Traits, _Alloc>::uflow() { - if (this->gptr() != this->egptr()) { - int_type __c = _Traits::to_int_type(*this->gptr()); - this->gbump(1); - return __c; - } - else - return _Traits::eof(); -} - -template -__BSB_int_type__ -basic_stringbuf<_CharT, _Traits, _Alloc>::pbackfail(int_type __c) { - if (this->gptr() != this->eback()) { - if (!_Traits::eq_int_type(__c, _Traits::eof())) { - if (_Traits::eq(_Traits::to_char_type(__c), this->gptr()[-1])) { - this->gbump(-1); - return __c; - } - else if (_M_mode & ios_base::out) { - this->gbump(-1); - *this->gptr() = _Traits::to_char_type(__c); - return __c; - } - else - return _Traits::eof(); - } - else { - this->gbump(-1); - return _Traits::not_eof(__c); - } - } - else - return _Traits::eof(); -} - -template -__BSB_int_type__ -basic_stringbuf<_CharT, _Traits, _Alloc>::overflow(int_type __c) { - // fbp : reverse order of "ifs" to pass Dietmar's test. - // Apparently, standard allows overflow with eof even for read-only streams. - if (!_Traits::eq_int_type(__c, _Traits::eof())) { - if (_M_mode & ios_base::out) { - if (!(_M_mode & ios_base::in)) { - // It's a write-only streambuf, so we can use special append buffer. - if (this->pptr() == this->epptr()) - this->_M_append_buffer(); - - if (this->pptr() != this->epptr()) { - *this->pptr() = _Traits::to_char_type(__c); - this->pbump(1); - return __c; - } - else - return _Traits::eof(); - } - else { - // We're not using a special append buffer, just the string itself. - if (this->pptr() == this->epptr()) { - ptrdiff_t __offset = this->gptr() - this->eback(); - _M_str.push_back(_Traits::to_char_type(__c)); - - _CharT* __data_ptr = __CONST_CAST(_CharT*,_M_str.data()); - size_t __data_size = _M_str.size(); - - this->setg(__data_ptr, __data_ptr + __offset, __data_ptr+__data_size); - this->setp(__data_ptr, __data_ptr + __data_size); - this->pbump((int)__data_size); - return __c; - } - else { - *this->pptr() = _Traits::to_char_type(__c); - this->pbump(1); - return __c; - } - } - } - else // Overflow always fails if it's read-only - return _Traits::eof(); - } - else // __c is EOF, so we don't have to do anything - return _Traits::not_eof(__c); -} - -template -streamsize -basic_stringbuf<_CharT, _Traits, _Alloc>::xsputn(const char_type* __s, - streamsize __n) { - streamsize __nwritten = 0; - - if ((_M_mode & ios_base::out) && __n > 0) { - // If the put pointer is somewhere in the middle of the string, - // then overwrite instead of append. - if (this->pbase() == _M_str.data() ) { - ptrdiff_t __avail = _M_str.data() + _M_str.size() - this->pptr(); - if (__avail > __n) { - _Traits::copy(this->pptr(), __s, __STATIC_CAST(size_t, __n)); - this->pbump((int)__n); - return __n; - } - else { - _Traits::copy(this->pptr(), __s, __avail); - __nwritten += __avail; - __n -= __avail; - __s += __avail; - this->setp(_M_Buf, _M_Buf + __STATIC_CAST(int,_S_BufSiz)); - } - } - - // At this point we know we're appending. - if (_M_mode & ios_base::in) { - ptrdiff_t __get_offset = this->gptr() - this->eback(); - _M_str.append(__s, __s + __STATIC_CAST(ptrdiff_t, __n)); - - _CharT* __data_ptr = __CONST_CAST(_CharT*, _M_str.data()); - size_t __data_size = _M_str.size(); - - this->setg(__data_ptr, __data_ptr + __get_offset, __data_ptr + __data_size); - this->setp(__data_ptr, __data_ptr + __data_size); - this->pbump((int)__data_size); - } - else { - _M_append_buffer(); - _M_str.append(__s, __s + __STATIC_CAST(ptrdiff_t, __n)); - } - - __nwritten += __n; - } - - return __nwritten; -} - -template -streamsize -basic_stringbuf<_CharT, _Traits, _Alloc>::_M_xsputnc(char_type __c, - streamsize __n) { - streamsize __nwritten = 0; - - if ((_M_mode & ios_base::out) && __n > 0) { - // If the put pointer is somewhere in the middle of the string, - // then overwrite instead of append. - if (this->pbase() == _M_str.data()) { - ptrdiff_t __avail = _M_str.data() + _M_str.size() - this->pptr(); - if (__avail > __n) { - _Traits::assign(this->pptr(), __STATIC_CAST(size_t, __n), __c); - this->pbump(__STATIC_CAST(int, __n)); - return __n; - } - else { - _Traits::assign(this->pptr(), __avail, __c); - __nwritten += __avail; - __n -= __avail; - this->setp(_M_Buf, _M_Buf + __STATIC_CAST(int,_S_BufSiz)); - } - } - - // At this point we know we're appending. - size_t __app_size = sizeof(streamsize) > sizeof(size_t) ? __STATIC_CAST(size_t, (min)(__n, __STATIC_CAST(streamsize, _M_str.max_size()))) - : __STATIC_CAST(size_t, __n); - if (this->_M_mode & ios_base::in) { - ptrdiff_t __get_offset = this->gptr() - this->eback(); - _M_str.append(__app_size, __c); - _CharT* __data_ptr = __CONST_CAST(_CharT*,_M_str.data()); - size_t __data_size = _M_str.size(); - this->setg(__data_ptr, __data_ptr + __get_offset, __data_ptr + __data_size); - this->setp(__data_ptr, __data_ptr + __data_size); - this->pbump((int)__data_size); - } - else { - _M_append_buffer(); - _M_str.append(__app_size, __c); - } - - __nwritten += __app_size; - } - - return __nwritten; -} - -// According to the C++ standard the effects of setbuf are implementation -// defined, except that setbuf(0, 0) has no effect. In this implementation, -// setbuf(, n), for n > 0, calls reserve(n) on the underlying -// string. -template -basic_streambuf<_CharT, _Traits>* -basic_stringbuf<_CharT, _Traits, _Alloc>::setbuf(_CharT*, streamsize __n) { - if (__n > 0) { - bool __do_get_area = false; - bool __do_put_area = false; - ptrdiff_t __offg = 0; - ptrdiff_t __offp = 0; - - if (this->pbase() == _M_str.data()) { - __do_put_area = true; - __offp = this->pptr() - this->pbase(); - } - - if (this->eback() == _M_str.data()) { - __do_get_area = true; - __offg = this->gptr() - this->eback(); - } - - if ((_M_mode & ios_base::out) && !(_M_mode & ios_base::in)) - _M_append_buffer(); - - _M_str.reserve(sizeof(streamsize) > sizeof(size_t) ? __STATIC_CAST(size_t, (min)(__n, __STATIC_CAST(streamsize, _M_str.max_size()))) - : __STATIC_CAST(size_t, __n)); - - _CharT* __data_ptr = __CONST_CAST(_CharT*, _M_str.data()); - size_t __data_size = _M_str.size(); - - if (__do_get_area) { - this->setg(__data_ptr, __data_ptr + __offg, __data_ptr + __data_size); - } - - if (__do_put_area) { - this->setp(__data_ptr, __data_ptr + __data_size); - this->pbump((int)__offp); - } - } - - return this; -} - -template -__BSB_pos_type__ -basic_stringbuf<_CharT, _Traits, _Alloc> - ::seekoff(off_type __off, - ios_base::seekdir __dir, - ios_base::openmode __mode) { - __mode &= _M_mode; - - bool __imode = (__mode & ios_base::in) != 0; - bool __omode = (__mode & ios_base::out) != 0; - - if ( !(__imode || __omode) ) - return pos_type(off_type(-1)); - - if ( (__imode && (this->gptr() == 0)) || (__omode && (this->pptr() == 0)) ) - return pos_type(off_type(-1)); - -#ifndef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT - if ((_M_mode & ios_base::out) && !(_M_mode & ios_base::in)) - _M_append_buffer(); -#endif - - streamoff __newoff; - switch(__dir) { - case ios_base::beg: - __newoff = 0; - break; - case ios_base::end: - __newoff = _M_str.size(); - break; - case ios_base::cur: - __newoff = __imode ? this->gptr() - this->eback() : this->pptr() - this->pbase(); -#ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT - if ( __off == 0 ) { - return pos_type(__newoff); - } -#endif - break; - default: - return pos_type(off_type(-1)); - } - - __off += __newoff; -#ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT - _CharT* __data_ptr = __CONST_CAST(_CharT*, _M_str.data()); - size_t __data_size = _M_str.size(); -#endif - - if (__imode) { - ptrdiff_t __n = this->egptr() - this->eback(); - - if (__off < 0 || __off > __n) - return pos_type(off_type(-1)); - this->setg(this->eback(), this->eback() + __STATIC_CAST(ptrdiff_t, __off), - this->eback() + __STATIC_CAST(ptrdiff_t, __n)); - } - - if (__omode) { - ptrdiff_t __n = this->epptr() - this->pbase(); - - if (__off < 0 || __off > __n) - return pos_type(off_type(-1)); -#ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT - this->setp(__data_ptr, __data_ptr+__data_size); -#else - this->setp(this->pbase(), this->pbase() + __n); -#endif - this->pbump((int)__off); - } - - return pos_type(__off); -} - -template -__BSB_pos_type__ -basic_stringbuf<_CharT, _Traits, _Alloc> - ::seekpos(pos_type __pos, ios_base::openmode __mode) { - __mode &= _M_mode; - - bool __imode = (__mode & ios_base::in) != 0; - bool __omode = (__mode & ios_base::out) != 0; - - if ( !(__imode || __omode) ) - return pos_type(off_type(-1)); - - if ( (__imode && (this->gptr() == 0)) || (__omode && (this->pptr() == 0)) ) - return pos_type(off_type(-1)); - - const off_type __n = __pos - pos_type(off_type(0)); - if ((_M_mode & ios_base::out) && !(_M_mode & ios_base::in)) - _M_append_buffer(); - - if (__imode) { - if (__n < 0 || __n > this->egptr() - this->eback()) - return pos_type(off_type(-1)); - this->setg(this->eback(), this->eback() + __STATIC_CAST(ptrdiff_t, __n), this->egptr()); - } - - if (__omode) { - if (__n < 0 || size_t(__n) > _M_str.size()) - return pos_type(off_type(-1)); - - _CharT* __data_ptr = __CONST_CAST(_CharT*,_M_str.data()); - size_t __data_size = _M_str.size(); - - this->setp(__data_ptr, __data_ptr+__data_size); - this->pbump((int)__n); - } - - return __pos; -} // This is declared as a const member function because it is // called by basic_stringbuf<>::str(). Precondition: this is a @@ -491,9 +142,7 @@ this->init(&_M_buf); } -template -basic_istringstream<_CharT, _Traits, _Alloc>::~basic_istringstream() -{} + //---------------------------------------------------------------------- // Non-inline ostringstream member functions. @@ -514,9 +163,7 @@ this->init(&_M_buf); } -template -basic_ostringstream<_CharT, _Traits, _Alloc>::~basic_ostringstream() -{} + //---------------------------------------------------------------------- // Non-inline stringstream member functions. @@ -535,9 +182,10 @@ this->init(&_M_buf); } -template -basic_stringstream<_CharT, _Traits, _Alloc>::~basic_stringstream() -{} + + + + _STLP_END_NAMESPACE diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/cppstdlib/stl/stlport/stl/_sstream.h --- a/genericopenlibs/cppstdlib/stl/stlport/stl/_sstream.h Thu Apr 01 00:15:09 2010 +0300 +++ b/genericopenlibs/cppstdlib/stl/stlport/stl/_sstream.h Wed Apr 14 17:44:02 2010 +0300 @@ -69,30 +69,343 @@ = ios_base::in | ios_base::out); explicit basic_stringbuf(const _String& __s, ios_base::openmode __mode = ios_base::in | ios_base::out); - virtual ~basic_stringbuf(); + virtual ~basic_stringbuf(){} public: // Get or set the string. _String str() const { _M_append_buffer(); return _M_str; } void str(const _String& __s); protected: // Overridden virtual member functions. - virtual int_type underflow(); - virtual int_type uflow(); - virtual int_type pbackfail(int_type __c); - virtual int_type overflow(int_type __c); + + // Precondition: gptr() >= egptr(). Returns a character, if one is available. + virtual int_type underflow() { + return this->gptr() != this->egptr() + ? _Traits::to_int_type(*this->gptr()) + : _Traits::eof(); + } + + virtual int_type uflow() { + if (this->gptr() != this->egptr()) { + int_type __c = _Traits::to_int_type(*this->gptr()); + this->gbump(1); + return __c; + } + else + return _Traits::eof(); + } + + virtual int_type pbackfail(int_type __c) { + if (this->gptr() != this->eback()) { + if (!_Traits::eq_int_type(__c, _Traits::eof())) { + if (_Traits::eq(_Traits::to_char_type(__c), this->gptr()[-1])) { + this->gbump(-1); + return __c; + } + else if (_M_mode & ios_base::out) { + this->gbump(-1); + *this->gptr() = _Traits::to_char_type(__c); + return __c; + } + else + return _Traits::eof(); + } + else { + this->gbump(-1); + return _Traits::not_eof(__c); + } + } + else + return _Traits::eof(); + } + + virtual int_type overflow(int_type __c) { + // fbp : reverse order of "ifs" to pass Dietmar's test. + // Apparently, standard allows overflow with eof even for read-only streams. + if (!_Traits::eq_int_type(__c, _Traits::eof())) { + if (_M_mode & ios_base::out) { + if (!(_M_mode & ios_base::in)) { + // It's a write-only streambuf, so we can use special append buffer. + if (this->pptr() == this->epptr()) + this->_M_append_buffer(); + + if (this->pptr() != this->epptr()) { + *this->pptr() = _Traits::to_char_type(__c); + this->pbump(1); + return __c; + } + else + return _Traits::eof(); + } + else { + // We're not using a special append buffer, just the string itself. + if (this->pptr() == this->epptr()) { + ptrdiff_t __offset = this->gptr() - this->eback(); + _M_str.push_back(_Traits::to_char_type(__c)); + + _CharT* __data_ptr = __CONST_CAST(_CharT*,_M_str.data()); + size_t __data_size = _M_str.size(); + + this->setg(__data_ptr, __data_ptr + __offset, __data_ptr+__data_size); + this->setp(__data_ptr, __data_ptr + __data_size); + this->pbump((int)__data_size); + return __c; + } + else { + *this->pptr() = _Traits::to_char_type(__c); + this->pbump(1); + return __c; + } + } + } + else // Overflow always fails if it's read-only + return _Traits::eof(); + } + else // __c is EOF, so we don't have to do anything + return _Traits::not_eof(__c); + } + int_type pbackfail() {return pbackfail(_Traits::eof());} int_type overflow() {return overflow(_Traits::eof());} - virtual streamsize xsputn(const char_type* __s, streamsize __n); - virtual streamsize _M_xsputnc(char_type __c, streamsize __n); + + virtual streamsize xsputn(const char_type* __s, streamsize __n) { + streamsize __nwritten = 0; + + if ((_M_mode & ios_base::out) && __n > 0) { + // If the put pointer is somewhere in the middle of the string, + // then overwrite instead of append. + if (this->pbase() == _M_str.data() ) { + ptrdiff_t __avail = _M_str.data() + _M_str.size() - this->pptr(); + if (__avail > __n) { + _Traits::copy(this->pptr(), __s, __STATIC_CAST(size_t, __n)); + this->pbump((int)__n); + return __n; + } + else { + _Traits::copy(this->pptr(), __s, __avail); + __nwritten += __avail; + __n -= __avail; + __s += __avail; + this->setp(_M_Buf, _M_Buf + __STATIC_CAST(int,_S_BufSiz)); + } + } + + // At this point we know we're appending. + if (_M_mode & ios_base::in) { + ptrdiff_t __get_offset = this->gptr() - this->eback(); + _M_str.append(__s, __s + __STATIC_CAST(ptrdiff_t, __n)); + + _CharT* __data_ptr = __CONST_CAST(_CharT*, _M_str.data()); + size_t __data_size = _M_str.size(); + + this->setg(__data_ptr, __data_ptr + __get_offset, __data_ptr + __data_size); + this->setp(__data_ptr, __data_ptr + __data_size); + this->pbump((int)__data_size); + } + else { + _M_append_buffer(); + _M_str.append(__s, __s + __STATIC_CAST(ptrdiff_t, __n)); + } + + __nwritten += __n; + } + + return __nwritten; + } + + virtual streamsize _M_xsputnc(char_type __c, streamsize __n) { + streamsize __nwritten = 0; - virtual _Base* setbuf(_CharT* __buf, streamsize __n); + if ((_M_mode & ios_base::out) && __n > 0) { + // If the put pointer is somewhere in the middle of the string, + // then overwrite instead of append. + if (this->pbase() == _M_str.data()) { + ptrdiff_t __avail = _M_str.data() + _M_str.size() - this->pptr(); + if (__avail > __n) { + _Traits::assign(this->pptr(), __STATIC_CAST(size_t, __n), __c); + this->pbump(__STATIC_CAST(int, __n)); + return __n; + } + else { + _Traits::assign(this->pptr(), __avail, __c); + __nwritten += __avail; + __n -= __avail; + this->setp(_M_Buf, _M_Buf + __STATIC_CAST(int,_S_BufSiz)); + } + } + + + // At this point we know we're appending. + size_t __app_size = sizeof(streamsize) > sizeof(size_t) ? __STATIC_CAST(size_t, (min)(__n, __STATIC_CAST(streamsize, _M_str.max_size()))) + : __STATIC_CAST(size_t, __n); + if (this->_M_mode & ios_base::in) { + ptrdiff_t __get_offset = this->gptr() - this->eback(); + _M_str.append(__app_size, __c); + + _CharT* __data_ptr = __CONST_CAST(_CharT*,_M_str.data()); + size_t __data_size = _M_str.size(); + + this->setg(__data_ptr, __data_ptr + __get_offset, __data_ptr + __data_size); + this->setp(__data_ptr, __data_ptr + __data_size); + this->pbump((int)__data_size); + } + else { + _M_append_buffer(); + _M_str.append(__app_size, __c); + } + + __nwritten += __app_size; + } + + return __nwritten; + } + + virtual _Base* setbuf(_CharT*, streamsize __n) { + if (__n > 0) { + bool __do_get_area = false; + bool __do_put_area = false; + ptrdiff_t __offg = 0; + ptrdiff_t __offp = 0; + + if (this->pbase() == _M_str.data()) { + __do_put_area = true; + __offp = this->pptr() - this->pbase(); + } + + if (this->eback() == _M_str.data()) { + __do_get_area = true; + __offg = this->gptr() - this->eback(); + } + + if ((_M_mode & ios_base::out) && !(_M_mode & ios_base::in)) + _M_append_buffer(); + + _M_str.reserve(sizeof(streamsize) > sizeof(size_t) ? __STATIC_CAST(size_t, (min)(__n, __STATIC_CAST(streamsize, _M_str.max_size()))) + : __STATIC_CAST(size_t, __n)); + + _CharT* __data_ptr = __CONST_CAST(_CharT*, _M_str.data()); + size_t __data_size = _M_str.size(); + + if (__do_get_area) { + this->setg(__data_ptr, __data_ptr + __offg, __data_ptr + __data_size); + } + + if (__do_put_area) { + this->setp(__data_ptr, __data_ptr + __data_size); + this->pbump((int)__offp); + } + } + + return this; + } virtual pos_type seekoff(off_type __off, ios_base::seekdir __dir, - ios_base::openmode __mode - = ios_base::in | ios_base::out); - virtual pos_type seekpos(pos_type __pos, ios_base::openmode __mode - = ios_base::in | ios_base::out); + ios_base::openmode __mode + = ios_base::in | ios_base::out) { + __mode &= _M_mode; + + bool __imode = (__mode & ios_base::in) != 0; + bool __omode = (__mode & ios_base::out) != 0; + + if ( !(__imode || __omode) ) + return pos_type(off_type(-1)); + + if ( (__imode && (this->gptr() == 0)) || (__omode && (this->pptr() == 0)) ) + return pos_type(off_type(-1)); + + #ifndef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT + if ((_M_mode & ios_base::out) && !(_M_mode & ios_base::in)) + _M_append_buffer(); + #endif + + streamoff __newoff; + switch(__dir) { + case ios_base::beg: + __newoff = 0; + break; + case ios_base::end: + __newoff = _M_str.size(); + break; + case ios_base::cur: + __newoff = __imode ? this->gptr() - this->eback() : this->pptr() - this->pbase(); + #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT + if ( __off == 0 ) { + return pos_type(__newoff); + } + #endif + break; + default: + return pos_type(off_type(-1)); + } + + __off += __newoff; + #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT + _CharT* __data_ptr = __CONST_CAST(_CharT*, _M_str.data()); + size_t __data_size = _M_str.size(); + #endif + + if (__imode) { + ptrdiff_t __n = this->egptr() - this->eback(); + + if (__off < 0 || __off > __n) + return pos_type(off_type(-1)); + this->setg(this->eback(), this->eback() + __STATIC_CAST(ptrdiff_t, __off), + this->eback() + __STATIC_CAST(ptrdiff_t, __n)); + } + if (__omode) { + ptrdiff_t __n = this->epptr() - this->pbase(); + + if (__off < 0 || __off > __n) + return pos_type(off_type(-1)); + #ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT + this->setp(__data_ptr, __data_ptr+__data_size); + #else + this->setp(this->pbase(), this->pbase() + __n); + #endif + this->pbump((int)__off); + } + + return pos_type(__off); + } + + virtual pos_type seekpos(pos_type __pos, ios_base::openmode __mode + = ios_base::in | ios_base::out) { + __mode &= _M_mode; + + bool __imode = (__mode & ios_base::in) != 0; + bool __omode = (__mode & ios_base::out) != 0; + + if ( !(__imode || __omode) ) + return pos_type(off_type(-1)); + + if ( (__imode && (this->gptr() == 0)) || (__omode && (this->pptr() == 0)) ) + return pos_type(off_type(-1)); + + const off_type __n = __pos - pos_type(off_type(0)); + if ((_M_mode & ios_base::out) && !(_M_mode & ios_base::in)) + _M_append_buffer(); + + if (__imode) { + if (__n < 0 || __n > this->egptr() - this->eback()) + return pos_type(off_type(-1)); + this->setg(this->eback(), this->eback() + __STATIC_CAST(ptrdiff_t, __n), this->egptr()); + } + + if (__omode) { + if (__n < 0 || size_t(__n) > _M_str.size()) + return pos_type(off_type(-1)); + + _CharT* __data_ptr = __CONST_CAST(_CharT*,_M_str.data()); + size_t __data_size = _M_str.size(); + + this->setp(__data_ptr, __data_ptr+__data_size); + this->pbump((int)__n); + } + + return __pos; + } + + private: // Helper functions. // Append the internal buffer to the string if necessary. void _M_append_buffer() const; @@ -134,7 +447,7 @@ basic_istringstream(ios_base::openmode __mode = ios_base::in); basic_istringstream(const _String& __str, ios_base::openmode __mode = ios_base::in); - ~basic_istringstream(); + ~basic_istringstream(){} public: // Member functions @@ -177,7 +490,7 @@ basic_ostringstream(ios_base::openmode __mode = ios_base::out); basic_ostringstream(const _String& __str, ios_base::openmode __mode = ios_base::out); - ~basic_ostringstream(); + ~basic_ostringstream(){} public: // Member functions. @@ -223,7 +536,7 @@ basic_stringstream(openmode __mod = ios_base::in | ios_base::out); basic_stringstream(const _String& __str, openmode __mod = ios_base::in | ios_base::out); - ~basic_stringstream(); + ~basic_stringstream(){} public: // Member functions. diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/cppstdlib/stl/stlport/stl/_streambuf.c --- a/genericopenlibs/cppstdlib/stl/stlport/stl/_streambuf.c Thu Apr 01 00:15:09 2010 +0300 +++ b/genericopenlibs/cppstdlib/stl/stlport/stl/_streambuf.c Wed Apr 14 17:44:02 2010 +0300 @@ -36,9 +36,7 @@ } #endif -template -basic_streambuf<_CharT, _Traits>::~basic_streambuf() -{} + template locale @@ -49,88 +47,7 @@ return __tmp; } -template -streamsize -basic_streambuf<_CharT, _Traits>::xsgetn(_CharT* __s, streamsize __n) { - streamsize __result = 0; - const int_type __eof = _Traits::eof(); - while (__result < __n) { - if (_M_gnext < _M_gend) { - size_t __chunk = (min) (__STATIC_CAST(size_t,_M_gend - _M_gnext), - __STATIC_CAST(size_t,__n - __result)); - _Traits::copy(__s, _M_gnext, __chunk); - __result += __chunk; - __s += __chunk; - _M_gnext += __chunk; - } - else { - int_type __c = this->sbumpc(); - if (!_Traits::eq_int_type(__c, __eof)) { - *__s = _Traits::to_char_type(__c); - ++__result; - ++__s; - } - else - break; - } - } - - return __result; -} - -template -streamsize -basic_streambuf<_CharT, _Traits>::xsputn(const _CharT* __s, streamsize __n) -{ - streamsize __result = 0; - const int_type __eof = _Traits::eof(); - - while (__result < __n) { - if (_M_pnext < _M_pend) { - size_t __chunk = (min) (__STATIC_CAST(size_t,_M_pend - _M_pnext), - __STATIC_CAST(size_t,__n - __result)); - _Traits::copy(_M_pnext, __s, __chunk); - __result += __chunk; - __s += __chunk; - _M_pnext += __chunk; - } - - else if (!_Traits::eq_int_type(this->overflow(_Traits::to_int_type(*__s)), - __eof)) { - ++__result; - ++__s; - } - else - break; - } - return __result; -} - -template -streamsize -basic_streambuf<_CharT, _Traits>::_M_xsputnc(_CharT __c, streamsize __n) -{ - streamsize __result = 0; - const int_type __eof = _Traits::eof(); - - while (__result < __n) { - if (_M_pnext < _M_pend) { - size_t __chunk = (min) (__STATIC_CAST(size_t,_M_pend - _M_pnext), - __STATIC_CAST(size_t,__n - __result)); - _Traits::assign(_M_pnext, __chunk, __c); - __result += __chunk; - _M_pnext += __chunk; - } - - else if (!_Traits::eq_int_type(this->overflow(_Traits::to_int_type(__c)), - __eof)) - ++__result; - else - break; - } - return __result; -} template _STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::int_type @@ -145,59 +62,7 @@ } } -template -_STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::int_type -basic_streambuf<_CharT, _Traits>::pbackfail(int_type) { - return _Traits::eof(); -} -template -_STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::int_type -basic_streambuf<_CharT, _Traits>::overflow(int_type) { - return _Traits::eof(); -} - -template -_STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::int_type -basic_streambuf<_CharT, _Traits>::uflow() { - return ( _Traits::eq_int_type(this->underflow(),_Traits::eof()) ? - _Traits::eof() : - _Traits::to_int_type(*_M_gnext++)); -} - -template -_STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::int_type -basic_streambuf<_CharT, _Traits>::underflow() -{ return _Traits::eof(); } - -template -streamsize -basic_streambuf<_CharT, _Traits>::showmanyc() -{ return 0; } - -template -void -basic_streambuf<_CharT, _Traits>::imbue(const locale&) {} - -template -int -basic_streambuf<_CharT, _Traits>::sync() { return 0; } - -template -_STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::pos_type -basic_streambuf<_CharT, _Traits>::seekpos(pos_type, ios_base::openmode) -{ return pos_type(-1); } - -template -_STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::pos_type -basic_streambuf<_CharT, _Traits>::seekoff(off_type, ios_base::seekdir, - ios_base::openmode) -{ return pos_type(-1); } - -template -basic_streambuf<_CharT, _Traits>* -basic_streambuf<_CharT, _Traits>:: setbuf(char_type*, streamsize) -{ return this; } _STLP_END_NAMESPACE diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/cppstdlib/stl/stlport/stl/_streambuf.h --- a/genericopenlibs/cppstdlib/stl/stlport/stl/_streambuf.h Thu Apr 01 00:15:09 2010 +0300 +++ b/genericopenlibs/cppstdlib/stl/stlport/stl/_streambuf.h Wed Apr 14 17:44:02 2010 +0300 @@ -72,7 +72,7 @@ // _STLP_mutex _M_lock; public: // Destructor. - virtual ~basic_streambuf(); + virtual ~basic_streambuf(){} protected: // The default constructor. basic_streambuf() @@ -122,24 +122,34 @@ _M_pend = __pend; } -protected: // Virtual buffer management functions. - - virtual basic_streambuf<_CharT, _Traits>* setbuf(char_type*, streamsize); - +protected: // Virtual buffer management functions. + + + + virtual basic_streambuf<_CharT, _Traits>* setbuf(char_type*, streamsize) { + return this; + } + // Alters the stream position, using an integer offset. In this // class seekoff does nothing; subclasses are expected to override it. + virtual pos_type seekoff(off_type, ios_base::seekdir, - ios_base::openmode = ios_base::in | ios_base::out); - + ios_base::openmode = ios_base::in | ios_base::out) { + return pos_type(-1); + } + // Alters the stream position, using a previously obtained streampos. In // this class seekpos does nothing; subclasses are expected to override it. virtual pos_type - seekpos(pos_type, ios_base::openmode = ios_base::in | ios_base::out); - + seekpos(pos_type, ios_base::openmode = ios_base::in | ios_base::out) { + return pos_type(-1); + } + // Synchronizes (i.e. flushes) the buffer. All subclasses are expected to // override this virtual member function. - virtual int sync(); - + virtual int sync() { + return 0; + } public: // Buffer management. basic_streambuf<_CharT, _Traits>* pubsetbuf(char_type* __s, streamsize __n) @@ -155,46 +165,133 @@ int pubsync() { return this->sync(); } -protected: // Virtual get area functions, as defined in - // 17.5.2.4.3 and 17.5.2.4.4 of the standard. +protected: // Virtual get area functions, as defined in + // 17.5.2.4.3 and 17.5.2.4.4 of the standard. // Returns a lower bound on the number of characters that we can read, // with underflow, before reaching end of file. (-1 is a special value: // it means that underflow will fail.) Most subclasses should probably // override this virtual member function. - virtual streamsize showmanyc(); - + + virtual streamsize showmanyc() { + return 0; + } + // Reads up to __n characters. Return value is the number of // characters read. - virtual streamsize xsgetn(char_type* __s, streamsize __n); + virtual streamsize xsgetn(char_type* __s, streamsize __n) { + streamsize __result = 0; + const int_type __eof = _Traits::eof(); + while (__result < __n) { + if (_M_gnext < _M_gend) { + size_t __chunk = (min) (__STATIC_CAST(size_t,_M_gend - _M_gnext), + __STATIC_CAST(size_t,__n - __result)); + _Traits::copy(__s, _M_gnext, __chunk); + __result += __chunk; + __s += __chunk; + _M_gnext += __chunk; + } + else { + int_type __c = this->sbumpc(); + if (!_Traits::eq_int_type(__c, __eof)) { + *__s = _Traits::to_char_type(__c); + ++__result; + ++__s; + } + else + break; + } + } + + return __result; + } + // Called when there is no read position, i.e. when gptr() is null // or when gptr() >= egptr(). Subclasses are expected to override // this virtual member function. - virtual int_type underflow(); - + virtual int_type underflow() { + return _Traits::eof(); + } + // Similar to underflow(), but used for unbuffered input. Most // subclasses should probably override this virtual member function. - virtual int_type uflow(); - + virtual int_type uflow() { + return ( _Traits::eq_int_type(this->underflow(),_Traits::eof()) ? + _Traits::eof() : + _Traits::to_int_type(*_M_gnext++)); + } + // Called when there is no putback position, i.e. when gptr() is null // or when gptr() == eback(). All subclasses are expected to override // this virtual member function. - virtual int_type pbackfail(int_type = traits_type::eof()); + virtual int_type pbackfail(int_type = traits_type::eof()) { + return _Traits::eof(); + } + + +protected: // Virtual put area functions, as defined in + // 27.5.2.4.5 of the standard. + + // Writes up to __n characters. Return value is the number of characters + // written. -protected: // Virtual put area functions, as defined in - // 27.5.2.4.5 of the standard. + virtual streamsize xsputn(const char_type* __s, streamsize __n) { + streamsize __result = 0; + const int_type __eof = _Traits::eof(); + + while (__result < __n) { + if (_M_pnext < _M_pend) { + size_t __chunk = (min) (__STATIC_CAST(size_t,_M_pend - _M_pnext), + __STATIC_CAST(size_t,__n - __result)); + _Traits::copy(_M_pnext, __s, __chunk); + __result += __chunk; + __s += __chunk; + _M_pnext += __chunk; + } - // Writes up to __n characters. Return value is the number of characters - // written. - virtual streamsize xsputn(const char_type* __s, streamsize __n); - - // Extension: writes up to __n copies of __c. Return value is the number + else if (!_Traits::eq_int_type(this->overflow(_Traits::to_int_type(*__s)), + __eof)) { + ++__result; + ++__s; + } + else + break; + } + return __result; + } + + // Extension: writes up to __n copies of __c. Return value is the number // of characters written. - virtual streamsize _M_xsputnc(char_type __c, streamsize __n); + + virtual streamsize _M_xsputnc(char_type __c, streamsize __n) { + streamsize __result = 0; + const int_type __eof = _Traits::eof(); + + while (__result < __n) { + if (_M_pnext < _M_pend) { + size_t __chunk = (min) (__STATIC_CAST(size_t,_M_pend - _M_pnext), + __STATIC_CAST(size_t,__n - __result)); + _Traits::assign(_M_pnext, __chunk, __c); + __result += __chunk; + _M_pnext += __chunk; + } - // Called when there is no write position. All subclasses are expected to + else if (!_Traits::eq_int_type(this->overflow(_Traits::to_int_type(__c)), + __eof)) + ++__result; + else + break; + } + return __result; + } + + // Called when there is no write position. All subclasses are expected to // override this virtual member function. - virtual int_type overflow(int_type = traits_type::eof()); + + virtual int_type overflow(int_type = traits_type::eof()) { + return _Traits::eof(); + } + public: // Public members for writing characters. // Write a single character. @@ -259,7 +356,8 @@ // sets the streambuf's locale to __loc. Note that imbue should // not (and cannot, since it has no access to streambuf's private // members) set the streambuf's locale itself. - virtual void imbue(const locale&); + + virtual void imbue(const locale&) {} public: // Locale-related functions. locale pubimbue(const locale&); @@ -281,6 +379,7 @@ #endif }; + #if defined (_STLP_USE_TEMPLATE_EXPORT) _STLP_EXPORT_TEMPLATE_CLASS basic_streambuf >; # if !defined (_STLP_NO_WCHAR_T) diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/cppstdlib/stl/test/eh/test_bit_vector.cpp --- a/genericopenlibs/cppstdlib/stl/test/eh/test_bit_vector.cpp Thu Apr 01 00:15:09 2010 +0300 +++ b/genericopenlibs/cppstdlib/stl/test/eh/test_bit_vector.cpp Wed Apr 14 17:44:02 2010 +0300 @@ -68,7 +68,7 @@ ====================================================================================*/ void test_bit_vector() { -#define __WORD_BIT (int(CHAR_BIT*sizeof(unsigned int))) +#define __WORD_BIT_LOCAL (int(CHAR_BIT*sizeof(unsigned int))) // Make some bit vectors to work with. BitVector emptyVector; @@ -79,7 +79,7 @@ size_t BitVectorSize = random_number( random_base ); // Half the time, choose a size that will guarantee immediate reallocation if ( random_number(2) ) - BitVectorSize = BitVectorSize / __WORD_BIT * __WORD_BIT; + BitVectorSize = BitVectorSize / __WORD_BIT_LOCAL * __WORD_BIT_LOCAL; EH_ASSERT( testVector.size() == 0 ); testVector.reserve(BitVectorSize); diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/cppstdlib/stl/test/group/bld.inf --- a/genericopenlibs/cppstdlib/stl/test/group/bld.inf Thu Apr 01 00:15:09 2010 +0300 +++ b/genericopenlibs/cppstdlib/stl/test/group/bld.inf Wed Apr 14 17:44:02 2010 +0300 @@ -21,6 +21,7 @@ prj_testmmpfiles stlport_test stlport_unit_test +stlport_extraExports PRJ_TESTEXPORTS libstdcpp_tests.iby /epoc32/rom/include/libstdcpp_tests.iby oe_autotest.iby /epoc32/rom/include/oe_autotest.iby \ No newline at end of file diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/cppstdlib/stl/test/group/libstdcpp_tests.iby --- a/genericopenlibs/cppstdlib/stl/test/group/libstdcpp_tests.iby Thu Apr 01 00:15:09 2010 +0300 +++ b/genericopenlibs/cppstdlib/stl/test/group/libstdcpp_tests.iby Wed Apr 14 17:44:02 2010 +0300 @@ -16,6 +16,7 @@ file=ABI_DIR\BUILD_DIR\stlport_test.exe sys\bin\stlport_test.exe file=ABI_DIR\BUILD_DIR\stlport_unit_test.exe sys\bin\stlport_unit_test.exe +file=ABI_DIR\BUILD_DIR\stlport_extraExports.dll sys\bin\stlport_extraExports.dll file=ABI_DIR\BUILD_DIR\stdioserver.exe sys\bin\stdioserver.exe file=ABI_DIR\BUILD_DIR\uncaught_exception_test.exe sys\bin\uncaught_exception_test.exe file=ABI_DIR\BUILD_DIR\terminate_handler_test.exe sys\bin\terminate_handler_test.exe diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/cppstdlib/stl/test/group/stlport_extraexports.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/genericopenlibs/cppstdlib/stl/test/group/stlport_extraexports.mmp Wed Apr 14 17:44:02 2010 +0300 @@ -0,0 +1,45 @@ +// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// Name : stlport_extraExports.mmp +// Part of : + + +TARGET stlport_extraExports.dll +TARGETTYPE dll + +OPTION CW -wchar_t on +MACRO _WCHAR_T_DECLARED + +OS_LAYER_SYSTEMINCLUDE_SYMBIAN +OS_LAYER_LIBC_SYSTEMINCLUDE +OS_LAYER_STLPORTV5_SYSTEMINCLUDE + +sourcepath ../unit/ +SOURCE extraExports.cpp + +EPOCALLOWDLLDATA + +nostrictdef + +STDCPP + +LIBRARY euser.lib +LIBRARY libc.lib +LIBRARY libstdcppv5.lib + +#ifdef ENABLE_ABIV2_MODE +DEBUGGABLE_UDEBONLY +#endif + +SMPSAFE \ No newline at end of file diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/cppstdlib/stl/test/unit/extraexports.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/genericopenlibs/cppstdlib/stl/test/unit/extraexports.cpp Wed Apr 14 17:44:02 2010 +0300 @@ -0,0 +1,26 @@ +// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// Name : extraExports.cpp +// Part of : + +// This test is to verify the behaviour of RVCT compiler on Key-functions (i.e., the first +// non-pure, non-inlined virtual function of that class) in a templated function. +// This test-dll is created just to verify, hence will not freeze this test-dll's exports. + +#include + +EXPORT_C void test() +{ + std::stringstream test; +} diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/openenvcore/backend/group/StdioServer.mmp --- a/genericopenlibs/openenvcore/backend/group/StdioServer.mmp Thu Apr 01 00:15:09 2010 +0300 +++ b/genericopenlibs/openenvcore/backend/group/StdioServer.mmp Wed Apr 14 17:44:02 2010 +0300 @@ -26,6 +26,7 @@ TARGETTYPE exe UID 0x1000008D 0x10283075 +VERSION 10.1 SOURCEPATH ../src/StdioRedir/Server diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/openenvcore/backend/group/backend.mmp --- a/genericopenlibs/openenvcore/backend/group/backend.mmp Thu Apr 01 00:15:09 2010 +0300 +++ b/genericopenlibs/openenvcore/backend/group/backend.mmp Wed Apr 14 17:44:02 2010 +0300 @@ -26,7 +26,7 @@ LANG SC CAPABILITY ALL -TCB VENDORID 0x70000001 -VERSION 1.0 +VERSION 1.1 // Macro defs #include "../../libc/group/libcflags.mmpi" #ifdef GCCXML diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/openenvcore/backend/group/signalserver.mmp --- a/genericopenlibs/openenvcore/backend/group/signalserver.mmp Thu Apr 01 00:15:09 2010 +0300 +++ b/genericopenlibs/openenvcore/backend/group/signalserver.mmp Wed Apr 14 17:44:02 2010 +0300 @@ -25,6 +25,7 @@ TARGETTYPE exe UID 0x1000008D 0x2001F3C8 +VERSION 10.1 SOURCEPATH ../src/signalserver/server diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/openenvcore/backend/ipcserver/ipcsrv/group/ipcserver.mmp --- a/genericopenlibs/openenvcore/backend/ipcserver/ipcsrv/group/ipcserver.mmp Thu Apr 01 00:15:09 2010 +0300 +++ b/genericopenlibs/openenvcore/backend/ipcserver/ipcsrv/group/ipcserver.mmp Wed Apr 14 17:44:02 2010 +0300 @@ -32,7 +32,7 @@ // Default vendor id VENDORID 0x101FB657 -VERSION 1.0 +VERSION 1.1 SOURCEPATH ../src diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/openenvcore/backend/src/corebackend/fdesc.cpp --- a/genericopenlibs/openenvcore/backend/src/corebackend/fdesc.cpp Thu Apr 01 00:15:09 2010 +0300 +++ b/genericopenlibs/openenvcore/backend/src/corebackend/fdesc.cpp Wed Apr 14 17:44:02 2010 +0300 @@ -118,8 +118,11 @@ { RFs& rfs = Backend()->FileSession(); TUint attribval; - TPtrC16 filename1 = (const TText16*)name; - int ret1 = rfs.Att(filename1, attribval); + TFullName fullName; + err = GetFullFile(fullName, (const TText16*)name, rfs); + if(err != KErrNone) + return NULL; + int ret1 = rfs.Att(fullName, attribval); if (ret1 == 0 && ((attribval & (KEntryAttHidden | KEntryAttSystem))== (KEntryAttHidden | KEntryAttSystem))) { TSpecialFileType fileType = _SystemSpecialFileBasedFilePath(name, err, rfs); @@ -134,12 +137,7 @@ } else //normal file or directory { - TFullName fullName; - err = GetFullFile(fullName, (const TText16*)name, rfs); - if(err != KErrNone) - return NULL; - - //Try opening as a file + //Try opening as a file CFileDesc* file = new CFileDesc; if(file != NULL) { diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/openenvcore/ewsd/group/ewsd.mmp --- a/genericopenlibs/openenvcore/ewsd/group/ewsd.mmp Thu Apr 01 00:15:09 2010 +0300 +++ b/genericopenlibs/openenvcore/ewsd/group/ewsd.mmp Wed Apr 14 17:44:02 2010 +0300 @@ -33,6 +33,7 @@ LANG SC CAPABILITY ALL -TCB VENDORID 0x70000001 +VERSION 10.1 #ifdef WINSCW OPTION CW -stdinc diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/openenvcore/group/bld.inf --- a/genericopenlibs/openenvcore/group/bld.inf Thu Apr 01 00:15:09 2010 +0300 +++ b/genericopenlibs/openenvcore/group/bld.inf Wed Apr 14 17:44:02 2010 +0300 @@ -39,6 +39,7 @@ PRJ_EXPORTS openenv.iby /epoc32/rom/include/openenv.iby openc_stdlibs_stub.sis /epoc32/data/z/system/install/openc_stdlibs_stub.sis +openc_signalserver_stub.sis /epoc32/data/z/system/install/openc_signalserver_stub.sis ../include/pipsversion.h SYMBIAN_OS_LAYER_PUBLIC_EXPORT_PATH(stdapis/pipsversion.h) // End of File diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/openenvcore/group/openc_signalserver_stub.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/genericopenlibs/openenvcore/group/openc_signalserver_stub.pkg Wed Apr 14 17:44:02 2010 +0300 @@ -0,0 +1,25 @@ +; +; Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +; All rights reserved. +; This component and the accompanying materials are made available +; under the terms of "Eclipse Public License v1.0" +; which accompanies this distribution, and is available +; at the URL "http://www.eclipse.org/legal/epl-v10.html". +; +; Initial Contributors: +; Nokia Corporation - initial contribution. +; +; Contributors: +; +; Description: package file for standard libraries +; +; +&EN + +#{"Signal Server"}, (0x2002372A), 1, 7, 4 +%{"Nokia"} +:"Nokia" + +[0x1028315F],0, 0, 0 ,{"S60Product5thEdition "} + +""-"z:\sys\bin\signalserver.exe", FF diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/openenvcore/group/openc_signalserver_stub.sis Binary file genericopenlibs/openenvcore/group/openc_signalserver_stub.sis has changed diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/openenvcore/group/openc_stdlibs_stub.pkg Binary file genericopenlibs/openenvcore/group/openc_stdlibs_stub.pkg has changed diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/openenvcore/group/openc_stdlibs_stub.sis Binary file genericopenlibs/openenvcore/group/openc_stdlibs_stub.sis has changed diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/openenvcore/group/openenv.iby --- a/genericopenlibs/openenvcore/group/openenv.iby Thu Apr 01 00:15:09 2010 +0300 +++ b/genericopenlibs/openenvcore/group/openenv.iby Wed Apr 14 17:44:02 2010 +0300 @@ -33,6 +33,7 @@ data = EPOCROOT##epoc32\winscw\c\resource\pips\locales.txt \resource\pips\locales.txt data = EPOCROOT##epoc32\winscw\c\resource\pips\services \resource\pips\services data = EPOCROOT##epoc32\data\z\system\install\openc_stdlibs_stub.sis \system\install\openc_stdlibs_stub.sis +data = EPOCROOT##epoc32\data\z\system\install\openc_signalserver_stub.sis \system\install\openc_signalserver_stub.sis #include /* StdC++ library*/ #ifdef SYMBIAN_OE_POSIX_SIGNALS diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/openenvcore/include/pipsversion.h --- a/genericopenlibs/openenvcore/include/pipsversion.h Thu Apr 01 00:15:09 2010 +0300 +++ b/genericopenlibs/openenvcore/include/pipsversion.h Wed Apr 14 17:44:02 2010 +0300 @@ -23,10 +23,10 @@ #ifndef _PIPSVERSION_H #define _PIPSVERSION_H -#define PIPS_VERSION 170 +#define PIPS_VERSION 174 #define PIPS_MAJOR_VERSION 1 #define PIPS_MINOR_VERSION 7 -#define PIPS_BUILD_VERSION 0 +#define PIPS_BUILD_VERSION 4 #endif //_PIPSVERSION_H diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/openenvcore/libc/group/libc.mmp --- a/genericopenlibs/openenvcore/libc/group/libc.mmp Thu Apr 01 00:15:09 2010 +0300 +++ b/genericopenlibs/openenvcore/libc/group/libc.mmp Wed Apr 14 17:44:02 2010 +0300 @@ -41,7 +41,7 @@ #ifdef ARMCC_3_1 OPTION ARMCC --diag_remark 3017 #endif -VERSION 1.0 +VERSION 1.1 #ifndef WINSCW EPOCALLOWDLLDATA diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/openenvcore/libdl/group/libdl.mmp --- a/genericopenlibs/openenvcore/libdl/group/libdl.mmp Thu Apr 01 00:15:09 2010 +0300 +++ b/genericopenlibs/openenvcore/libdl/group/libdl.mmp Wed Apr 14 17:44:02 2010 +0300 @@ -24,7 +24,7 @@ CAPABILITY ALL -TCB VENDORID 0x70000001 -VERSION 1.0 +VERSION 1.1 #ifndef WINSCW EPOCALLOWDLLDATA diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/openenvcore/liblogger/group/liblogger.mmp --- a/genericopenlibs/openenvcore/liblogger/group/liblogger.mmp Thu Apr 01 00:15:09 2010 +0300 +++ b/genericopenlibs/openenvcore/liblogger/group/liblogger.mmp Wed Apr 14 17:44:02 2010 +0300 @@ -22,7 +22,7 @@ CAPABILITY ALL -TCB VENDORID 0x70000001 -VERSION 1.0 +VERSION 1.1 //MACRO SYMBIAN_FILE_LOGGER diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/openenvcore/libm/group/libm.mmp --- a/genericopenlibs/openenvcore/libm/group/libm.mmp Thu Apr 01 00:15:09 2010 +0300 +++ b/genericopenlibs/openenvcore/libm/group/libm.mmp Wed Apr 14 17:44:02 2010 +0300 @@ -27,7 +27,7 @@ LANG SC CAPABILITY All -Tcb VENDORID 0x70000001 -VERSION 1.0 +VERSION 1.1 OPTION ARMCC --diag_remark 3017 // include all mmpi files diff -r 18da5738c9b6 -r ef2ebc87518f genericopenlibs/openenvcore/libpthread/group/libpthread.mmp --- a/genericopenlibs/openenvcore/libpthread/group/libpthread.mmp Thu Apr 01 00:15:09 2010 +0300 +++ b/genericopenlibs/openenvcore/libpthread/group/libpthread.mmp Wed Apr 14 17:44:02 2010 +0300 @@ -27,7 +27,7 @@ CAPABILITY All -Tcb VENDORID 0x70000001 -VERSION 1.0 +VERSION 1.1 #ifndef WINSCW EPOCALLOWDLLDATA diff -r 18da5738c9b6 -r ef2ebc87518f glib/glibbackend/group/glibbackend.mmp --- a/glib/glibbackend/group/glibbackend.mmp Thu Apr 01 00:15:09 2010 +0300 +++ b/glib/glibbackend/group/glibbackend.mmp Wed Apr 14 17:44:02 2010 +0300 @@ -28,7 +28,7 @@ VENDORID 0x101FB657 #endif -VERSION 1.0 +VERSION 1.1 #ifndef WINSCW EpocAllowDllData diff -r 18da5738c9b6 -r ef2ebc87518f glib/libglib/group/glib.mmp --- a/glib/libglib/group/glib.mmp Thu Apr 01 00:15:09 2010 +0300 +++ b/glib/libglib/group/glib.mmp Wed Apr 14 17:44:02 2010 +0300 @@ -29,7 +29,7 @@ #endif -VERSION 2.103 +VERSION 2.104 #ifndef WINSCW EpocAllowDllData diff -r 18da5738c9b6 -r ef2ebc87518f glib/libgmodule/group/gmodule.mmp --- a/glib/libgmodule/group/gmodule.mmp Thu Apr 01 00:15:09 2010 +0300 +++ b/glib/libgmodule/group/gmodule.mmp Wed Apr 14 17:44:02 2010 +0300 @@ -30,7 +30,7 @@ VENDORID 0x101FB657 #endif -VERSION 2.103 +VERSION 2.104 #ifndef WINSCW EpocAllowDllData diff -r 18da5738c9b6 -r ef2ebc87518f glib/libgobject/group/gobject.mmp --- a/glib/libgobject/group/gobject.mmp Thu Apr 01 00:15:09 2010 +0300 +++ b/glib/libgobject/group/gobject.mmp Wed Apr 14 17:44:02 2010 +0300 @@ -29,7 +29,7 @@ VENDORID 0x101FB657 #endif -VERSION 2.103 +VERSION 2.104 #ifndef WINSCW EpocAllowDllData diff -r 18da5738c9b6 -r ef2ebc87518f glib/libgthread/group/gthread.mmp --- a/glib/libgthread/group/gthread.mmp Thu Apr 01 00:15:09 2010 +0300 +++ b/glib/libgthread/group/gthread.mmp Wed Apr 14 17:44:02 2010 +0300 @@ -30,7 +30,7 @@ VENDORID 0x101FB657 #endif -VERSION 2.103 +VERSION 2.104 #ifndef WINSCW EpocAllowDllData diff -r 18da5738c9b6 -r ef2ebc87518f lowlevellibsandfws/genericusabilitylib/documentation/dox/mainpage.dox --- a/lowlevellibsandfws/genericusabilitylib/documentation/dox/mainpage.dox Thu Apr 01 00:15:09 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,885 +0,0 @@ -/** -@mainpage - -@par Overview - -@par - -This document describes new core APIs for semi-automatic resource -management designed to begin to increase the baseline usability of -Symbian OS for developers. We would welcome feedback, improvement -suggestions, and defect reports. Note that there is a Q&A section at -the bottom of this page that explains some of the background rationale -behind the design choices we have made to get to this point. - -Please send any questions or review feedback you have to: core.idioms@symbian.com - -The new APIs include the following: - -- A new type category: the L-class - - Allows leaving constructors and can rely on automatic destructor execution for - cleanup (explained in more detail below) -- New general purpose, self-managing string classes that can be used much - like T-classes - - LString16 - - For manipulating strings of 16 bit characters - - Usually used via the ::LString typedef - - LString8 - - For manipulating strings of 8 bit characters - - ::LData - - Type alias for LString8 allowing the intent to use it as a raw (non-character) data buffer to be expressed - - The LString classes are based on the descriptor APIs and are fully interoperable with descriptors - - The LString classes can grow on demand and do not always need to be - initialized with a fixed reserve maximum length -- New "smart pointer" style utility classes for managing resources referenced from local variables, - which may be used instead of the existing cleanup stack API - - LCleanedupPtr - - Alternative to PushL(CBase*)/Pop()/PopAndDestroy() code sequences - - LCleanedupHandle - - Alternative to CleanupClosePushL()/Pop()/PopAndDestroy() code sequences - - See also the more rarely used LCleanedupRef, LCleanedupArray, and LCleanedupGuard -- New "smart pointer" style utility classes for managing resources referenced from data members, - which reduce the need for manually-written destructors - - LManagedPtr - - Alternative to calling delete manually in a destructor for the managed data member - - LManagedHandle - - Alternative to calling Close() manually in a destructor for the managed data member - - See also the more rarely used LManagedRef, LManagedArray, and LManagedGuard -- Enablers for the (optional, typically private) use of single-phase construction - - #CONSTRUCTORS_MAY_LEAVE - - A class declaration flagging that the class's constructors may leave - - Normally used in combination with the LManagedXxx classes to ensure reliable cleanup in case of a constructor leaving - - Normally hidden behind a conventional Symbian NewL() abstraction -- New utilities for making correct, error checking code easier to read - - New #OR_LEAVE postfix macro - - Alternative to wrapping User::LeaveIfError() around an expression - -The motivation for the new APIs is to make it easier to write correct, -less brittle code in the first instance, but perhaps more so to make -the resulting code easier to read and easier to modify safely later. - -Some guiding principles: - -- Resource management should be handled either fully automatically or declaratively - at point of definition as far as possible - - Helps to eliminate mismatches between code that pushes and code that pops - - Helps to eliminate mismatches between code that constructs and code that destructs - - Removes the need to duplicate cleanup code (or modify your code's structure) to correctly handle functions with multiple return points - - Makes changing code safer and easier by reducing dependencies between different areas of the code -- It should be easier and lighter weight to write and maintain leave-safe code - - So that more people are prepared to make the investment to do it right -- The primary function of code should not be swamped by auxiliary error checking and resource management - - The key logic should be front and centre, and read as straightforwardly as possible -- It should be easier to write fully general code - - Unsafe and/or overly conservative maximum size limitations should not be - encouraged by making that style of code easier to write -- Terminology should be as conventional as possible - - We call a string a string - -To help illustrate the new APIs, here is a sampling of idiomatic code -implemented first in terms of the current Symbian APIs, and alongside -in terms of the new APIs. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Current APIsNew APIs
-@code -{ -TBuf query; // fixed worst-case max -query.Format(KQueryFormat, param); -ExecuteQueryL(query); -} -@endcode - -@code -{ -LString query; // can grow its heap buffer on demand -query.FormatL(KQueryFormat, param); -ExecuteQueryL(query); -} // query buffer released on normal scope exit or leave -@endcode -
-@code -{ -HBufC* queryc = HBufC::NewLC(KTooBigForStackMaxQuery); -TPtr query(queryc->Des()); -BuildQueryL(query); -ExecuteQueryL(query); -CleanupStack::PopAndDestroy(); -} -@endcode - -@code -{ -LString query; -BuildQueryL(query); -ExecuteQueryL(query); -} -@endcode -
-@code -{ -RBuf query; -query.CleanupClosePushL(); -query.CreateL(TooBigForStackMaxQuery); -BuildQueryL(query); -ExecuteQueryL(query); -CleanupStack::PopAndDestroy(); -} -@endcode - -@code -{ -LString query; -BuildQueryL(query); -ExecuteQueryL(query); -} -@endcode -
- -@code -{ -CQuery* query = CQuery::NewL(); -CleanupStack::PushL(query); -query->BuildQueryL(); -query->ExecuteQueryL(); -CleanupStack::PopAndDestroy(); -} -@endcode - - - -@code -{ -LCleanedupPtr query(CQuery::NewL()); -query->BuildQueryL(); -query->ExecuteQueryL(); -} // query deleted on normal scope exit or leave -@endcode - -
- -@code -{ -CQuery* query = CQuery::NewL(); -CleanupStack::PushL(query); -query->BuildQueryL(); -CleanupStack::Pop(); -return query; -} -@endcode - - - -@code -{ -LCleanedupPtr query(CQuery::NewL()); -query->BuildQueryL(); -return query.Unmanage(); -// query was protected until Unmanage() was called -} -@endcode - -
- -@code -{ -RQuery query; -CleanupClosePushL(query); -query.BuildQueryL(); -query.ExecuteQueryL(); -CleanupStack::PopAndDestroy(); -} -@endcode - - - -@code -{ -LCleanedupHandle query; -query->BuildQueryL(); -query->ExecuteQueryL(); -} // query is closed on normal scope exit or leave -@endcode - -
- -@par Concepts - -These APIs introduce a new category of Symbian type: the -L-class. L-classes have characteristics close to standard C++ value -and handle classes, including the following: - -- Constructors, operators, and implicit operations may leave -- They are self-managing and do not require auxiliary memory management logic - -L-classes may be used like T-classes except that they can own -resources, they typically rely on guaranteed execution of their -destructors, and they cannot necessarily be naively bitwise -copied. Any code that manipulates L-class instances must be -leave-safe. The only exception to this rule is if the particular -operations being used are explicitly documented not to leave (e.g. the -default LString constructor and all the LManagedXXX constructors). - -The L prefix denotes that these classes may be Liberal when it comes -to Leaving, while being Leave-safe themselves. - -The implementation of many L classes relies on the leave=throw mapping -current in Symbian OS since v9.1 because this guarantees destructor -execution for objects allocated on the stack. - -@par Notes on Usage - -For ease of experimentation during review, all the new APIs are -packaged for use as a statically-linked bundle: - -- #include in your code -- STATICLIBRARY euserhl.lib in your mmp - -Some important dos and don'ts (most of which leavescan will reliably flag): - -- The LCleanedupXXX classes are for managing locals only, and may not be used to manage data members. This is because the LCleanedupXXX classes are implemented in terms of the legacy cleanup stack. -- The LCleanedupXXX classes must not be used in the same function as the legacy cleanup stack APIs. They can interact unintuitively and this is best avoided. It is all or nothing at function granularity. -- Use L-suffix method variants with LCleanedupXXX, never LC-suffix variants that manipulate the cleanup stack. This is for the same reason as the previous point. -- The LManagedXXX classes should only be used for data members. If they are used for locals, they can interact unintuitively with cleanup stack based cleanup (from other functions on the call stack) with respect to cleanup ordering. -- Whenever you write code that manipulates LString or other L-prefix classes, always conservatively leave-safe your code. This is now easier with the LCleanedupXXX utilities. - -On the resource management utility classes: - -- A managed object's member functions may be called directly on the managing container, but -> notation must be used to access them -- Implicit coercions from managing containers to managed types are not defined; instead the dereference operator * must be used e.g. to obtain a reference suitable for passing as a parameter to another function -- Pop()-like semantics (as opposed to PopAndDestroy()) is achieved by calling Unmanage() on the managing container before it goes out of scope; Unmanage() returns the managed object which can then be returned from your function, or passed to a different function which takes over ownership. Unlike Pop(), however, Unmanage() simply sets a flag to disable cleanup and may be called at any time without worrying about stack discipline -- It is still typically necessary to declare, define, and export a destructor, even if its implementation (currently) contains no hand-written code - - The destructor must be available wherever delete may be called on an instance of the class - - The compiler will automatically generate destruction logic behind the scenes for LString and LManagedXxx data members, even if you don't write any code yourself - - The destructor may of course change over time anyway - -On the LString classes: - -- Existing library functions that accept a modifiable TDes cannot take advantage of LString's on-demand growth behaviour; the necessary capacity must first be explicitly reserved in the LString before calling such functions (this can be done either with a constructor parameter or by calling SetMaxLengthL()) -- Any descriptor method that could panic due to lack of capacity is replaced with a leaving variant that grows the heap e.g. instead of Append(), LString defines AppendL(). The non-leaving TDes versions are hidden to avoid accidental use, although they can still be accessed via a TDes typed (as opposed to LString typed) ref or pointer -- Programmers new to Symbian OS could first be introduced to descriptors and string handling via just const TDesC& (for input parameter contracts), TDes (for output parameter contracts), and LString for implementation. LStrings can be initialized by value from any descriptor return type, and by automatically taking ownership in the HBufC* return case. - -On single-phase construction: - -- This option is enabled by LString and the LManagedXxx classes - - However you implement construction behind the scenes, NewL is an important abstraction - - Think hard before using single-phase construction in a framework class designed for derivation in client code -- LString and the LManagedXxx classes may be used safely in conventional Symbian two-phase construction as well as standard C++ style single-phase construction - - LManagedXxx construction never leaves, and is safe to perform at any stage - - Default construction of an empty LString never leaves, but other initializations must be deferred to ConstructL -- An understanding of standard C++ construction semantics is required before attempting to use single-phase construction - - If a constructor throws mid-way through, its matching destructor is not invoked to clean up - - Instead all data members fully-constructed to the point of the leave are automatically destructed - - Therefore, in effect, all class cleanup must typically be achieved via data member destruction - - The presence of a non-empty destructor is a warning sign if you are using single-phase construction - -An annotated example using the new APIs follows (the -euserhl_walkthrough example goes into much more detail than we do -here). - -@code -#include -#include -#include // Includes all the new APIs - -class CFinder : public CBase - { -public: - // We have opted to use single-phase construction here, and some of - // our constructor's initialization actions may leave. In order to - // guarantee full cleanup in all cases, we have to declare this fact. - CONSTRUCTORS_MAY_LEAVE - static CFinder* NewL(const TDesC& aPattern); - ~CFinder(); - void GetNextMatchL(TDes& aMatch); - -protected: - CFinder(const TDesC& aPattern); - -protected: - LString iPattern; - LManagedHandle iFs; // We always use LManagedXxx for data members - // ... - }; - -CFinder* CFinder::NewL(const TDesC& aPattern) - { - return new(ELeave) CFinder(aPattern); - } - -CFinder::CFinder(const TDesC& aPattern) - // This initializer may leave, since the LString will allocate a - // heap buffer large enough to contain a copy of aPattern's data - : iPattern(aPattern) - { - // If connection fails and we leave here, iPattern's destructor - // will be called automatically, and the string's resources will - // be released - iFs->Connect() OR_LEAVE; - } - -CFinder::~CFinder() - { - // Automatic destruction of each of the data members does all of the - // work for us: iPattern's heap buffer if freed, while Close() is - // called on the managed RFs in iFs. - - // Even though this destructor is textually empty, it should - // still be exported; the compiler is generating destruction logic - // for us in this case - } - -void CFinder::GetNextMatchL(TDes& aMatch) - { - // ... - LString possible; - // ... - LCleanedupHandle file; // We always use CleanedupXXX for locals - TInt status = file->Open(*iFs, possible, EFileRead); // Note use of -> and * here - // ... - aMatch = possible; - // ... - } -@endcode - -For comparison, the original code in terms of existing APIs: - -@code -#include -#include - -class CFinder : public CBase - { -public: - static CFinder* NewL(const TDesC& aPattern); - ~CFinder(); - void GetNextMatchL(TDes& aMatch); - -protected: - CFinder(); - void ConstructL(const TDesC& aPattern); - -protected: - HBufC* iPattern; - RFs iFs; - // ... - }; - -CFinder* CFinder::NewL(const TDesC& aPattern) - { - CFinder* self = new(ELeave) CFinder; - CleanupStack::PushL(self); - self->ConstructL(aPattern); - CleanupStack::Pop(); - return self; - } - -CFinder::CFinder() - { - } - -void CFinder::ConstructL(const TDesC& aPattern) - { - iPattern = aPattern.AllocL(); - User::LeaveIfError(iFs.Connect()); - } - -CFinder::~CFinder() - { - iFs.Close(); - delete iPattern; - } - -void CFinder::GetNextMatchL(TDes& aMatch) - { - // ... - RFile file; - CleanupClosePushL(file); - TInt status = file.Open(iFs, possible, EFileRead); - // ... - aMatch = possible; - // ... - CleanupStack::PopAndDestroy(); - } -@endcode - -@par Q&A - -\b General.1 Why start at the bottom? Shouldn't improving the usability of Symbian -OS and its APIs be a top-down initiative? - -There is a product-wide usability initiative within Symbian which aims -to address all of APIs, documentation, and tools. On the API side, -there are tracks that try to improve the design process for good API -usability going forward, and tracks like this one that try to improve -the usability of existing functionality. This is just the first -deliverable of the latter effort, but other work is ongoing. - -\b General.2 Will Core Idioms changes like these be backed up by tools support? - -Yes, support for tools like Leavescan and Coverity, as well as more -basic debugger presentation support for the new descriptor types and -resource management classes, is being planned into the roll-out -project. - -\b General.3 Will Core Idioms changes like these be backed up by matching -documentation, examples, and coding standards updates? - -Yes, we understand this to be essential and this is our goal. - -\b General.4 Symbian will support STL as part of Open Environment, and -Symbian's STL implementation includes std::string and -std::auto_ptr. Why not just use them? - -We investigated this option to the point of creating a native Symbian -C++ interoperable STL subset for experimentation. This was ultimately -rejected for the following reasons: - -- Hybrid-style code (with mixed Symbian-style and standard-style naming) is - harder to read and to work with than code in a single consistent style -- Beyond basic naming conventions, supporting two very different APIs - for manipulating strings (the descriptor methods alongside the - std::string methods) similarly does not help usability -- Interoperability between std::string and TDesC/TDes accepting APIs - implemented via implicit coercion is more limited than the direct placement - of new string classes within the existing descriptor hierarchy can - achieve -- Because we need a number of Symbian-specific resource management - utilities (cleanup-stack aware, R-class aware, and so on), auto_ptr - on its own does not provide much leverage -- It would require maintaining two subtly variant STL builds: the Open - Environment version with standard C++ new and exception - behaviour, and a Symbian C++ version with new(ELeave) and leaving - behaviour - -Instead we opted to give Symbian C++ a "programming philosophy -upgrade"; more aligned with standard C++ but still in the style of -Symbian C++ and its existing APIs. The result is something that can be -more easily and more incrementally adopted by existing Symbian C++ -projects and teams. Note that this decision to focus first on building -out the usability of native Symbian C++ does not preclude the -possibility of an official hybridized Symbian embedding of STL being -developed at a later date - -Finally, we could have used Symbian-ized names like XAutoPtrYyy as the -basis for the resource management utility classes. However, this was -deliberately avoided because the semantics of our classes are -different from auto_ptr e.g. they can't support copy construction or -transfer of ownership through parameter passing and return, and -different variants are required for use with locals than with data -members. We did not want to give the Symbian classes names that could -result in developers making natural but incorrect assumptions about -their behaviour based experience with similarly-named classes -elsewhere. - -\b General.5 These new template classes seem more conceptually -complex than what they're replacing. How can this improve -usability? - -Template classes can be complex to implement, but they're not -particularly difficult to understand or use in the way they're -employed here. Symbian programmers are already familiar with the -basics from RArray and RPointerArray. And to anyone coming from -standard C++ and STL it's second nature, as in fact is this general -style of parameterised declaration to desktop Java and C# programmers -used to generics. - -In the end, it's just a concise, declarative annotation that takes -leaky code and helps turn it into robust code. - -Leaky: - -@code -{ -CFoo* foo = CFoo::NewL(); -foo->ExecuteL(); // the CFoo leaks if this leaves -if (foo->IsAsync()) - { - // ... - return; // the CFoo leaks if we return - } -// ... -} // the CFoo leaks if we exit scope normally -@endcode - -Safe (new style): - -@code -{ -LCleanedupPtr foo(CFoo::NewL()); -foo->ExecuteL(); // the CFoo is automatically deleted if we leave -if (foo->IsAsync()) - { - // ... - return; // the CFoo is automatically deleted if we return - } -// ... -} // the CFoo is automatically deleted if we exit scope normally -@endcode - -Safe (classic style): - -@code -{ -CFoo* foo = CFoo::NewL(); -CleanupStack::PushL(foo); -foo->ExecuteL(); // the CFoo is automatically deleted if we leave -if (foo->IsAsync()) - { - // ... - CleanupStack::PopAndDestroy(foo); // the CFoo is deleted manually - return; - } -// ... -CleanupStack::PopAndDestroy(foo); // the CFoo is deleted manually -} -@endcode - -\b General.6 Don't some of these APIs simply trade depth for width? There are less lines of code but the statements are longer and more complex - -Placing as much information at point of declaration as possible guards -against separate lines of code becoming inconsistent with one-another, -particularly over time in the face of later code changes. Where -cleanup code is duplicated, for example in the case of a function with -multiple exit points, or where the cleanup point is separated by tens -of lines of code from the creation point, these risks increase -further. - -Another way to look at this is that it is far easier in a real, -non-trivial piece of code to take an unprotected local (a raw pointer -to an object) and to apply cleanup protection to it (for example if a -call to a leaving function has been added) once at its point of -creation, than it is to study what might be a quite complex flow of -control in order to determine where all the matching calls to -CleanupStack::PopAndDestroy() need to go. - -In some cases, faced with the CleanupStack, you might actually choose -to rework an existing function to have a single exit point to simplify -the process of leave-protecting its code. The risks inherent in that -are not necessary using the mode of protection offered by these new -APIs. - -\b General.7 These APIs seem to come with a lot of new rules, -particularly when it comes to interoperating with existing -functionality. If it turns out people need to understand both the new -and old idioms in order to mix them safely, where's the benefit? -Doesn't it actually make things worse? - -The interoperability constraints are far from ideal, but we believe -they are manageable and that the benefits outweigh the issues, -particularly so for developers working on new code that uses these new -APIs and idioms consistently. - -Wherever possible sanity checking will be offered in code analysis -tools like Leavescan and/or in UDEB runtime checking via assertions. - -\b Cleanedup.1 The LCleanedupXxx/LManagedXxx distinction is confusing. Why can't we -just use the same classes everywhere? - -We would much prefer to be able to use the same classes to protect -objects referenced from local variables as we do to project objects -referenced from data members. In an ideal world, the LManagedXxx -classes would be used in both scenarios (just like auto_ptr is -elsewhere); LCleanedupXxx would not be necessary. - -In fact, the LManagedXxx classes can be used to protect locals if you -wish: - -@code -{ -LManagedPtr query(CQuery::NewL()); -query->BuildQueryL(); -query->ExecuteQueryL(); -} // query deleted on normal scope exit or leave -@endcode - -This works fine in isolation. Unfortunately, cleanup order becomes -counter-intuitive if calls to functions that use LManagedXxx are mixed -with functions that use the cleanup stack with the same call stack. - -Here is an example. Call order is top-to-bottom. - -@code -void CFramework::StartMainLoopL() - { - CFramework* fw = CFramework::NewL(); - CleanupStack::PushL(fw); // #1 - // ... - CleanupStack::PushL(event); // #2 - fw->DispatchL(*event); - CleanupStack::PopAndDestroy(event); - // ... - CleanupStack::PopAndDestroy(fw); - } - -void CFramework::DispatchL(CEvent& aEvent) - { - this->UserCallback()(*this, aEvent); - } - -void MyUserCallback(CFramework& aFw, CEvent& aEvent) - { - LManagedPtr myEvent(CMyEventWrapper::NewL(aEvent)); // #3 - // ... - aFw->LookupL(arg); - // ... - } - -void CFramework::LookupL(const TDesC& aArg) - { - // - CleanupStack::PushL(tmp); // #4 - // ... - User::LeaveIfError(status); - // ... - CleanupStack::PopAndDestroy(tmp); - } -@endcode - -If the User::LeaveIfError() expression triggers an unhandled leave in -the above, the cleanup order would be: #4, #2, #1, #3. If out-of-order -execution of CMyEventWrapper's destructor can never cause problems, -then there is not an issue. However, if CMyEventWrapper's destructor -were to e.g. decrement a reference count on the (deleted) CEvent, this -would lead to a panic. - -The cleanup order is this way because of the way User::Leave() -processing works. It locates all pushed CleanupStack items up to the -point of the handling TRAP and executes their cleanups. Then, finally, -it uses C++ throw to unwind the C stack to the point of the TRAP. It -is during C stack unwinding that the destructors for objects stored in -locals get run, and LManagedPtr (like auto_ptr) relies exclusively on -destructor execution to trigger cleanup. - -On the other hand, if MyUserCallback uses LCleanedupPtr instead of -LManagedPtr, then its associated cleanup is triggered as part of -CleanupStack processing and in the more intuitive sequence: #4, #3, -#2, #1. Note that although it also has a destructor, LCleanedupPtr's -cleanup action is only ever run once; execution of the cleanup action -via the destructor is disabled if the cleanup action has already been -run as part of CleanupStack processing. - -This is why the LCleanedupXxx classes exist. Because the situations -where use of LManagedXxx for locals (or more precisely the resulting -out-of-order cleanup) may cause problems are subtle to characterise, -we guide conservatively that LCleanedupXxx should always be used to -protect locals. - -\b Cleanedup.2 If you are forced to call an LC method, how should you deal with it? - -APIs should always offer pure L variants (after all, what if you want -to store the result directly in a data member?) and this scenario -should be rare. If it does arise, however, you have a few options. - -Note that code checking tools like Leavescan can flag dangerous -combinations of LC method calls and the LCleanedupXxx classes within -the same function. - -Option 1 (preferred): - -@code -// Define your own popping L wrapper function -CFoo* NewCFooL(TFooArg aArg) - { - CFoo* foo = CFoo::NewLC(aArg); - CleanupStack::Pop(); - return foo; - } - -// Then call that instead... -{ -LCleanedupPtr foo(NewCFooL(arg)); -// ... -} - -@endcode - -Option 2: - -@code -{ -LCleanedupPtr foo; // pushes our "smart" cleanup item on the stack -foo = CFoo::NewLC(arg); // leaves a classic cleanup item on the stack -CleanupStack::Pop(); // gets rid of the classic cleanup item right away -// ... -} -@endcode - -Never do this: - -@code -{ -LCleanedupPtr foo(CFoo::NewLC(arg)); -// Execution order of the above statement leaves our "smart" cleanup item -// on top of the cleanup stack and we can't get at the LC-introduced cleanup -// item beneath it to pop it -// ... -} -@endcode - -\b Cleanedup.3 How do you create your own custom cleanup operation a la TCleanupItem? - -The direct analog to pushing a TCleanupItem is ::LCleanedupGuard; see -its documentation for an example of how to register a function pointer -with argument data to get invoked on cleanup. - -See also #DEFINE_CLEANUP_FUNCTION and #DEFINE_CLEANUP_STRATEGY for -creating custom cleanup operations for use with particular classes. - -\b Managed.1 For LManagedXxx, is destruction order based on order of -declaration? - -Yes, fields are destroyed (and so the cleanup operation run in the -case of LManagedXxx fields) in reverse order of declaration as -specified by the C++ standard. - -\b Managed.2 Does tying cleanup order to data member order make it -harder to maintain binary compatibility? If I want to change -construction/destruction order I'm forced to change my header and -reorder my data members? - -Reordering private fields would not constitute a BC break because the -class would not change size. In situations where your data members are -anything other than private, including being directly revealed by -inline methods, you always have to take great care, and will continue -to have to do so. - -As a general guideline, if you are concerned about BC never make data -members (LManagedXxx or otherwise) anything other than private. Always -expose them via non-inline accessor methods, both to clients and to -derived classes. - -\b Managed.3 What happens when you mix managed and unmanaged -pointers in the same class? Should it be avoided? - -Your manually-written destructor code for a class will get run before -the managed fields of that class get cleaned up, as per the C++ -standard. As long as this is understood, there is no particular reason -to avoid mixing if it makes sense to your problem. - -Note, though, that if you are using single-phase construction and the -constructor leaves, your destructor will not be run; only the -instance's fully-constructed data members at the point of the leave -will be destroyed. - -In some cases using ::LManagedGuard may be preferable to adding code -to the destructor. - -\b SinglePhase.1 Do you have to use single-phase construction with -these APIs? - -No. The primary benefit of using the LManagedXxx classes to look after -your data members is to avoid having to write and maintain destructor -code manually. It's fine to initialize your LManagedXxx fields by -assignment in ConstructL if you're using two-phase construction; the -automatic cleanup benefit is the same. - -The LManagedXxx classes also happen to enable the use of single-phase -construction, but you need to consider carefully when and whether to -use it. - -\b SinglePhase.2 The single-phase constructor solution with -CONSTRUCTORS_MAY_LEAVE is a bit of a mess, and not really helping to -simplify code? - -Yes. Unfortunately the need for #CONSTRUCTORS_MAY_LEAVE is forced by -Symbian's legacy handling new(ELeave). - -\b SinglePhase.3 Why and where would I ever use single-phase -construction? - -For classes not intended for derivation there is no issue, and it's -quite reasonable to use the more concise single-phase construction -idiom, typically still hidden behind a NewL. - -For abstract framework classes intended for derivation outside the -defining module, the single-phase/two-phase distinction would need to -be clearly documented and so would force awareness of at least some of -the issues described here, even in scenarios where the deriving client -was not intending to use the new idioms. This is probably not -desirable. - -\b OrLeave.1 Can you still use User::LeaveIfError() now that -OR_LEAVE is available? What if you want to locally-handle some error -cases but not others. - -Yes, #OR_LEAVE is simply a convenience macro that allows you to -deemphasize auxiliary error checking code in most cases. You can still -bind an error code manually, check it, and then use -User::LeaveIfError(). - -\b Strings.1 Why derive LString from RBuf and then hide parts of -the inherited RBuf/TDes API? - -We want maximum interoperability with existing code and APIs for -LString in order to maximise its usefulness. In order to achieve that -we derive from RBuf, allowing an LString instance to be passed -directly as a const TDesC, a TDes, or an RBuf. - -The trade-off is that parts of the RBuf API don't fit well with -LString. To be conservative, we have hidden anything inherited from -RBuf or TDes that we have found to be confusing to direct users of -LString (you can add things later to a new API, but you can less -easily take them away). The most obvious of these is the mass hiding -of of the non-leaving descriptor methods for which LString provides -leaving, auto-growing alternatives: e.g. for direct users of LString, -we hide Append() so that it can't be used accidentally instead of -AppendL(). - -Note that when passed as a TDes or RBuf, and viewed through a variable -of that type, this localised hiding within LString does not have any -effect; existing code handed an LString will be able to manipulate it -as it expects to. - -\b Strings.2 Does LString support TDesC/TDes features like char* -interop? - -LString is an RBuf, a TDes, and a TDesC, and retains all the -functionality of those classes. - -LString8 retains the same level of char* interop as existing -descriptor classes through support for initialization from TUint8* -zero-terminated C strings, the ZeroTerminateL() utility method, Ptr(), -and so on. - -\b Strings.3 Does LString auto-compress as well as auto-grow? - -They don't. It can be hard to avoid pathologies when second-guessing -when client code if finished with buffer capacity. - -*/ diff -r 18da5738c9b6 -r ef2ebc87518f lowlevellibsandfws/pluginfw/Framework/frame/RegistryData.cpp --- a/lowlevellibsandfws/pluginfw/Framework/frame/RegistryData.cpp Thu Apr 01 00:15:09 2010 +0300 +++ b/lowlevellibsandfws/pluginfw/Framework/frame/RegistryData.cpp Wed Apr 14 17:44:02 2010 +0300 @@ -2158,6 +2158,11 @@ TInterfaceIndex* index=reinterpret_cast(aObject); index->Reset(); } +void CRegistryData::RemoveImplFromImplIndexCleanUp(TAny* aPtr) + { + TCleanupImplIndexEntry *aCleanup = (TCleanupImplIndexEntry*)aPtr; + aCleanup->iRegistryData->RemoveImplByAddrFromImplIndex(aCleanup->iImplEntry); + } /** This method retrieves the data for security checks from the iInterfaceImplIndex @@ -2287,7 +2292,7 @@ TImplContainer& implContainer = implContainerArray[aImplPosInContainerArray]; CImplementationData* oldImpl = implContainer.iCurrentImpl; implContainer.iUnusedImpls.AppendL(oldImpl); - RemoveImplFromImplIndex(oldImpl); // ignore return code + RemoveImplByAddrFromImplIndex(oldImpl); // ignore return code implContainer.iCurrentImpl = aNewImpl; // We are replacing existing impl with aNewImpl. If existing @@ -2324,7 +2329,10 @@ if(aIfPosInInterfaceImplIndex==KErrNotFound) { - iInterfaceImplIndex.InsertInOrderL(aNewIfIndexEl, TLinearOrder(TInterfaceStruct::CompareInfUid)); + TCleanupImplIndexEntry aCleanup(this, aNewImpl); + CleanupStack::PushL(TCleanupItem(RemoveImplFromImplIndexCleanUp,&aCleanup)); + iInterfaceImplIndex.InsertInOrderL(aNewIfIndexEl, TLinearOrder(TInterfaceStruct::CompareInfUid)); + CleanupStack::Pop(); } } @@ -2347,11 +2355,13 @@ index.iInterfaceUid = interface->iInterfaceUid; TInt indexPos = iInterfaceImplIndex.FindInOrder(index,TLinearOrder(TInterfaceStruct::CompareInfUid)); - + TImplContainerArray* impDataArray = NULL; + TInt implCount=0; + if(indexPos!=KErrNotFound) { - TImplContainerArray* impDataArray = &(iInterfaceImplIndex[indexPos].iImpData); - TInt implCount=interface->iImplementations->Count(); + impDataArray = &(iInterfaceImplIndex[indexPos].iImpData); + implCount=interface->iImplementations->Count(); for(TInt i=0; iiImplementations)[i]; @@ -2374,7 +2384,7 @@ if(implContainer.iCurrentImpl->iParent->iParent == aDllData) { // do not care about the return code. - RemoveImplFromImplIndex(implContainer.iCurrentImpl); + RemoveImplByAddrFromImplIndex(implContainer.iCurrentImpl); TInt implContainerUnusedImplCount=implContainer.iUnusedImpls.Count(); // no unused impl's therefore no rollback and remove entry @@ -2417,6 +2427,13 @@ } } } + //To make sure it is removed from the implIndex no matter what and that the return code is ignored. + //The previous removal is still required so that a subsequent InsertImplIntoImplIndex is possible + //for an implementation. e.g. an implementaion is on different drives and only one of htem was removed. + // The other one should now make it to the iImplIndex through InsertImplIntoImplIndex. If it wasn't + // removed, before the insert operation, it will fail since both the implementations hav the same + // impl UID. + RemoveImplByAddrFromImplIndex((*interface->iImplementations)[i]); } if(impDataArray->Count() == 0) { @@ -2460,22 +2477,26 @@ } } -/** This method removes the specified entry from iImplIndex. + +/** This method does a search by address and removes the specified entry from iImplIndex. -@param aPtr is the entry to remove +@param aPtr is the entry to remove @return True if aPtr is removed from iImplIndex. False if aPtr is not - in iImplIndex, i.e. nothing is removed. + in iImplIndex, i.e. nothing is removed. */ -TBool CRegistryData::RemoveImplFromImplIndex(CImplementationData* aPtr) const - { - TInt i = iImplIndex.FindInOrder(aPtr, TLinearOrder(CImplementationData::CompareImplUid)); - if (i != KErrNotFound) - { - // The array does not own the pointer. Do not delete! - iImplIndex.Remove(i); - } - return (i != KErrNotFound); - } +TBool CRegistryData::RemoveImplByAddrFromImplIndex(CImplementationData* aPtr) const + { + TInt aIdx = iImplIndex.Find(aPtr); + if (aIdx != KErrNotFound) + { + // This linear pointer search ensures a safe removal of the impl from iImplIndex so that it is free from a dead object. + + // The array does not own the pointer. Do not delete! + iImplIndex.Remove(aIdx); + return ETrue; + } + return EFalse; + } /** This method inserts the entry aNewImpl into iImplIndex. diff -r 18da5738c9b6 -r ef2ebc87518f lowlevellibsandfws/pluginfw/Framework/frame/RegistryData.h --- a/lowlevellibsandfws/pluginfw/Framework/frame/RegistryData.h Thu Apr 01 00:15:09 2010 +0300 +++ b/lowlevellibsandfws/pluginfw/Framework/frame/RegistryData.h Wed Apr 14 17:44:02 2010 +0300 @@ -252,8 +252,12 @@ TBool aLegitimateImpl); static void ResetTInterfaceIndex(TAny* aObject); - /** Remove the pointer from iImplIndex */ - TBool RemoveImplFromImplIndex(CImplementationData* aPtr) const; + /** Remove the pointer from iImplIndex based on the impl address*/ + TBool RemoveImplByAddrFromImplIndex(CImplementationData* aPtr) const; + + /** Used to restore the impIndex sanity in case of a leave */ + static void RemoveImplFromImplIndexCleanUp(TAny* aPtr); + /** Insert aNewImpl into iImplIndex. */ TInt InsertImplIntoImplIndex(CImplementationData* aNewImpl) const; /** Store change in drive state - addition or removal*/ @@ -490,4 +494,14 @@ iUnusedImpls.Reset(); } + + class TCleanupImplIndexEntry + { + public: + TCleanupImplIndexEntry(CRegistryData* aRegData, CRegistryData::CImplementationData* aImpl) + : iRegistryData(aRegData), iImplEntry(aImpl) + {} + CRegistryData* iRegistryData; + CRegistryData::CImplementationData* iImplEntry; + }; #endif //__REGISTRYDATA_H__ diff -r 18da5738c9b6 -r ef2ebc87518f ssl/libcrypto/group/libcrypto.mmp --- a/ssl/libcrypto/group/libcrypto.mmp Thu Apr 01 00:15:09 2010 +0300 +++ b/ssl/libcrypto/group/libcrypto.mmp Wed Apr 14 17:44:02 2010 +0300 @@ -51,7 +51,7 @@ CAPABILITY All -Tcb VENDORID 0x101FB657 -VERSION 0.9 +VERSION 0.10 TARGETTYPE dll diff -r 18da5738c9b6 -r ef2ebc87518f ssl/libssl/group/libssl.mmp --- a/ssl/libssl/group/libssl.mmp Thu Apr 01 00:15:09 2010 +0300 +++ b/ssl/libssl/group/libssl.mmp Wed Apr 14 17:44:02 2010 +0300 @@ -47,7 +47,7 @@ CAPABILITY All -Tcb VENDORID 0x101FB657 -VERSION 0.9 +VERSION 0.10 //START WINS //WIN32_LIBRARY kernel32.lib diff -r 18da5738c9b6 -r ef2ebc87518f stdcpp/group/libstdcpp.mmp --- a/stdcpp/group/libstdcpp.mmp Thu Apr 01 00:15:09 2010 +0300 +++ b/stdcpp/group/libstdcpp.mmp Wed Apr 14 17:44:02 2010 +0300 @@ -31,7 +31,7 @@ #ifndef WINSCW EPOCALLOWDLLDATA #endif //WINSCW -VERSION 1.0 +VERSION 1.1 OS_LAYER_SYSTEMINCLUDE OS_LAYER_LIBC_SYSTEMINCLUDE diff -r 18da5738c9b6 -r ef2ebc87518f stdlibs/libcrypt/group/libcrypt.mmp --- a/stdlibs/libcrypt/group/libcrypt.mmp Thu Apr 01 00:15:09 2010 +0300 +++ b/stdlibs/libcrypt/group/libcrypt.mmp Wed Apr 14 17:44:02 2010 +0300 @@ -23,7 +23,7 @@ CAPABILITY ALL -TCB VENDORID 0x101FB657 -VERSION 1.0 +VERSION 1.1 MACRO SYMBIAN diff -r 18da5738c9b6 -r ef2ebc87518f stdlibs/libz/group/libz.mmp --- a/stdlibs/libz/group/libz.mmp Thu Apr 01 00:15:09 2010 +0300 +++ b/stdlibs/libz/group/libz.mmp Wed Apr 14 17:44:02 2010 +0300 @@ -32,7 +32,7 @@ CAPABILITY ALL -TCB VENDORID VID_DEFAULT - +VERSION 10.1 USERINCLUDE ../inc USERINCLUDE ../zlib diff -r 18da5738c9b6 -r ef2ebc87518f stdlibs/libz/group/libz_build91.mmp --- a/stdlibs/libz/group/libz_build91.mmp Thu Apr 01 00:15:09 2010 +0300 +++ b/stdlibs/libz/group/libz_build91.mmp Wed Apr 14 17:44:02 2010 +0300 @@ -32,6 +32,7 @@ CAPABILITY ALL -TCB VENDORID VID_DEFAULT +VERSION 10.1 USERINCLUDE ../inc USERINCLUDE ../zlib diff -r 18da5738c9b6 -r ef2ebc87518f stdlibs/libz/group/libzcore.mmp --- a/stdlibs/libz/group/libzcore.mmp Thu Apr 01 00:15:09 2010 +0300 +++ b/stdlibs/libz/group/libzcore.mmp Wed Apr 14 17:44:02 2010 +0300 @@ -34,6 +34,7 @@ CAPABILITY ALL -TCB VENDORID VID_DEFAULT +VERSION 10.1 USERINCLUDE ../inc USERINCLUDE ../zlib diff -r 18da5738c9b6 -r ef2ebc87518f stdlibs/libz/group/libzcore_build91.mmp --- a/stdlibs/libz/group/libzcore_build91.mmp Thu Apr 01 00:15:09 2010 +0300 +++ b/stdlibs/libz/group/libzcore_build91.mmp Wed Apr 14 17:44:02 2010 +0300 @@ -35,6 +35,7 @@ CAPABILITY ALL -TCB VENDORID VID_DEFAULT +VERSION 10.1 USERINCLUDE ../inc USERINCLUDE ../zlib