Add misc/uClibc++ and build hooks in nuttx/

git-svn-id: http://svn.code.sf.net/p/nuttx/code/trunk@5283 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2012-10-31 19:13:18 +00:00
parent a74dd08492
commit 66aae459f1
97 changed files with 19452 additions and 12 deletions

View File

@ -0,0 +1,13 @@
TOPDIR=../
include $(TOPDIR)Rules.mak
all:
clean:
distclean:
HEADERS = $(filter-out .svn CVS Makefile,$(wildcard *))
install:
$(INSTALL) -d $(PREFIX)$(UCLIBCXX_RUNTIME_INCLUDEDIR)
$(INSTALL) -m 644 $(HEADERS) $(PREFIX)$(UCLIBCXX_RUNTIME_INCLUDEDIR)

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,640 @@
/* Copyright (C) 2007 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include<memory>
#include<utility>
#include<iterator>
#include<functional>
#include<list>
#ifndef __STD_HEADER_ASSOCIATIVE_BASE
#define __STD_HEADER_ASSOCIATIVE_BASE
#pragma GCC visibility push(default)
namespace std{
/*
* The basic premise here is that most of the code used by map, multimap, set and
* multiset is really common. There are a number of interface additions, and
* considerations about how to address multiple entries with the same key.
* The goal is that the tree/storage code should be here, and managing
* single or multiple counts will be left to subclasses.
* Yes, inheritence for the purpose of code sharing is usually a bad idea.
* However, since our goal is to reduce the total amount of code written
* and the overall binary size, this seems to be the best approach possible.
*/
template<class Key, class ValueType, class Compare = less<Key>, class Allocator = allocator<ValueType> > class __base_associative;
template<class ValueType, class Compare, class Allocator> class _associative_iter;
template<class ValueType, class Compare, class Allocator> class _associative_citer;
template<class Key, class ValueType, class Compare = less<Key>, class Allocator = allocator<ValueType> > class __single_associative;
template<class Key, class ValueType, class Compare = less<Key>, class Allocator = allocator<ValueType> > class __multi_associative;
template<class Key, class ValueType, class Compare, class Allocator> class _UCXXEXPORT __base_associative{
protected:
public:
typedef Key key_type;
typedef ValueType value_type;
typedef Compare key_compare;
typedef Allocator allocator_type;
typedef typename Allocator::reference reference;
typedef typename Allocator::const_reference const_reference;
typedef typename Allocator::size_type size_type;
typedef typename Allocator::difference_type difference_type;
typedef typename Allocator::pointer pointer;
typedef typename Allocator::const_pointer const_pointer;
typedef __base_associative<Key, ValueType, Compare, Allocator> associative_type;
typedef _associative_iter<value_type, Compare, Allocator> iterator;
typedef _associative_citer<value_type, Compare, Allocator> const_iterator;
typedef typename std::reverse_iterator<iterator> reverse_iterator;
typedef typename std::reverse_iterator<const_iterator> const_reverse_iterator;
explicit __base_associative(const Compare& comp, const Allocator& A, const key_type (*v_to_k)(const value_type))
: c(comp), value_to_key(v_to_k) { }
protected:
__base_associative(const associative_type& x)
: c(x.c), backing(x.backing), value_to_key(x.value_to_key) { }
public:
~__base_associative(){
}
bool empty() const{
return backing.empty();
}
size_type size() const{
return backing.size();
}
size_type max_size() const{
return backing.max_size();
}
iterator begin(){
return iterator(backing.begin());
}
const_iterator begin() const{
return const_iterator(backing.begin());
}
iterator end() {
return iterator(backing.end());
}
const_iterator end() const{
return const_iterator(backing.end());
}
reverse_iterator rbegin(){
return reverse_iterator(end());
}
const_reverse_iterator rbegin() const{
return const_reverse_iterator(end());
}
reverse_iterator rend(){
return reverse_iterator(begin());
}
const_reverse_iterator rend() const{
return const_reverse_iterator(begin());
}
iterator lower_bound(const key_type &x);
const_iterator lower_bound(const key_type &x) const;
iterator upper_bound(const key_type &x);
const_iterator upper_bound(const key_type &x) const;
pair<iterator,iterator> equal_range(const key_type& x){
pair<iterator, iterator> retval;
retval.first = lower_bound(x);
retval.second = retval.first;
while(retval.second != end() && !c(x, value_to_key(*retval.second))){
++retval.second;
}
return retval;
}
pair<const_iterator,const_iterator> equal_range(const key_type& x) const{
pair<const_iterator, const_iterator> retval;
retval.first = lower_bound(x);
retval.second = retval.first;
while(retval.second != end() && !c(x, value_to_key(*retval.second))){
++retval.second;
}
return retval;
}
iterator find(const key_type& x){
iterator retval = lower_bound(x);
if(retval == end()){
return retval;
}
if(c(x, value_to_key(*retval))){
return end();
}
return retval;
}
const_iterator find(const key_type& x) const{
const_iterator retval = lower_bound(x);
if(retval == end()){
return retval;
}
if(c(x, value_to_key(*retval))){
return end();
}
return retval;
}
size_type count(const key_type& x) const{
size_type retval(0);
const_iterator first = lower_bound(x);
while(first != end() && !c(x, value_to_key(*first))){
++retval;
++first;
}
return retval;
}
void clear(){
backing.clear();
}
void erase(iterator pos){
backing.erase(pos.base_iterator());
}
size_type erase(const key_type& x){
size_type count(0);
iterator start = lower_bound(x);
iterator end = upper_bound(x);
while(start != end){
start = backing.erase(start.base_iterator());
++count;
}
return count;
}
void erase(iterator first, iterator last){
while(first != last){
backing.erase(first.base_iterator());
++first;
}
}
key_compare key_comp() const{
return c;
}
__base_associative &operator=(const __base_associative & x){
c = x.c;
backing = x.backing;
value_to_key = x.value_to_key;
return *this;
}
bool operator==(const __base_associative & x){
return x.backing == backing;
}
bool operator!=(const __base_associative & x){
return !(x.backing == backing);
}
protected:
void swap(__base_associative & x);
Compare c;
std::list<value_type> backing;
const key_type (*value_to_key)(const value_type);
};
/*
* Tree iterators for the base associative class
*/
template<class ValueType, class Compare, class Allocator> class _associative_citer
: public std::iterator<
bidirectional_iterator_tag,
ValueType,
typename Allocator::difference_type,
ValueType*,
ValueType&
>
{
protected:
typedef std::list<ValueType> listtype;
typename listtype::const_iterator base_iter;
friend class _associative_iter<ValueType, Compare, Allocator>;
public:
_associative_citer() { }
_associative_citer(const _associative_citer & m)
: base_iter(m.base_iter) { }
_associative_citer(const typename listtype::const_iterator & m)
: base_iter(m) { }
~_associative_citer() { }
ValueType operator*() const{
return *base_iter;
}
const ValueType * operator->() const{
return &(*base_iter);
}
_associative_citer & operator=(const _associative_citer & m){
base_iter = m.base_iter;
return *this;
}
bool operator==(const _associative_citer & m) const{
return m.base_iter == base_iter;
}
bool operator!=(const _associative_citer & m) const{
return m.base_iter != base_iter;
}
_associative_citer & operator++(){
++base_iter;
return *this;
}
_associative_citer operator++(int){
//The following approach ensures that we only need to
//provide code for ++ in one place (above)
_associative_citer temp(base_iter);
++base_iter;
return temp;
}
_associative_citer & operator--(){
--base_iter;
return *this;
}
_associative_citer operator--(int){
//The following approach ensures that we only need to
//provide code for -- in one place (above)
_associative_citer temp(base_iter);
--base_iter;
return temp;
}
//This is an implementation-defined function designed to make internals work correctly
typename listtype::const_iterator base_iterator(){
return base_iter;
}
};
template<class ValueType, class Compare, class Allocator> class _associative_iter
: public std::iterator<
bidirectional_iterator_tag,
ValueType,
typename Allocator::difference_type,
ValueType*,
ValueType&
>
{
protected:
typedef std::list<ValueType> listtype;
typename listtype::iterator base_iter;
typedef _associative_citer<ValueType, Compare, Allocator> __associative_citer;
public:
_associative_iter() { }
_associative_iter(const _associative_iter & m)
: base_iter(m.base_iter) { }
_associative_iter(const typename listtype::iterator & m)
: base_iter(m) { }
~_associative_iter() { }
const ValueType & operator*() const{
return *base_iter;
}
ValueType & operator*(){
return *base_iter;
}
ValueType * operator->(){
return &(*base_iter);
}
const ValueType * operator->() const{
return &(*base_iter);
}
_associative_iter & operator=(const _associative_iter & m){
base_iter = m.base_iter;
return *this;
}
bool operator==(const _associative_iter & m) const{
return m.base_iter == base_iter;
}
bool operator==(const __associative_citer & m) const{
return m.base_iter == base_iter;
}
bool operator!=(const _associative_iter & m) const{
return m.base_iter != base_iter;
}
bool operator!=(const __associative_citer & m) const{
return m.base_iter != base_iter;
}
_associative_iter & operator++(){
++base_iter;
return *this;
}
_associative_iter operator++(int){
//The following approach ensures that we only need to
//provide code for ++ in one place (above)
_associative_iter temp(base_iter);
++base_iter;
return temp;
}
_associative_iter & operator--(){
--base_iter;
return *this;
}
_associative_iter operator--(int){
//The following approach ensures that we only need to
//provide code for -- in one place (above)
_associative_iter temp(base_iter);
--base_iter;
return temp;
}
operator __associative_citer() const{
return __associative_citer(base_iter);
}
typename listtype::iterator base_iterator(){
return base_iter;
}
const typename listtype::iterator base_iterator() const{
return base_iter;
}
};
// The lower_bound code is really crappy linear search. However, it is a dead
// simple implementation (easy to audit). It can also be easily replaced.
template <class Key, class ValueType, class Compare, class Allocator>
typename __base_associative<Key, ValueType, Compare, Allocator>::iterator
__base_associative<Key, ValueType, Compare, Allocator>::lower_bound(const key_type &x)
{
iterator retval = begin();
while(retval != end() && c(value_to_key(*retval), x)){
++retval;
}
return retval;
}
template <class Key, class ValueType, class Compare, class Allocator>
typename __base_associative<Key, ValueType, Compare, Allocator>::const_iterator
__base_associative<Key, ValueType, Compare, Allocator>::lower_bound(const key_type &x) const
{
const_iterator retval = begin();
while(retval != end() && c(value_to_key(*retval), x)){
++retval;
}
return retval;
}
// Upper bound search is linear from the point of lower_bound. This is likely the best solution
// in all but the most pathological of cases.
template <class Key, class ValueType, class Compare, class Allocator>
typename __base_associative<Key, ValueType, Compare, Allocator>::iterator
__base_associative<Key, ValueType, Compare, Allocator>::upper_bound(const key_type &x)
{
iterator retval = lower_bound(x);
while(retval != end() && !c(x, value_to_key(*retval))){
++retval;
}
return retval;
}
template <class Key, class ValueType, class Compare, class Allocator>
typename __base_associative<Key, ValueType, Compare, Allocator>::const_iterator
__base_associative<Key, ValueType, Compare, Allocator>::upper_bound(const key_type &x) const
{
const_iterator retval = begin();
while(retval != end() && !c(x, value_to_key(*retval))){
++retval;
}
return retval;
}
template <class Key, class ValueType, class Compare, class Allocator>
void __base_associative<Key, ValueType, Compare, Allocator>::swap(__base_associative<Key, ValueType, Compare, Allocator>& m)
{
Compare n = c;
c = m.c;
m.c = n;
m.backing.swap(backing);
}
template<class Key, class ValueType, class Compare, class Allocator> class _UCXXEXPORT __single_associative :
public __base_associative<Key, ValueType, Compare, Allocator>
{
protected:
typedef __base_associative<Key, ValueType, Compare, Allocator> base;
using base::backing;
using base::c;
public:
typedef typename base::key_type key_type;
typedef typename base::value_type value_type;
typedef typename base::key_compare key_compare;
typedef typename base::allocator_type allocator_type;
typedef typename base::reference reference;
typedef typename base::const_reference const_reference;
typedef typename base::iterator iterator;
typedef typename base::const_iterator const_iterator;
typedef typename base::size_type size_type;
typedef typename base::difference_type difference_type;
typedef typename base::pointer pointer;
typedef typename base::const_pointer const_pointer;
typedef typename base::reverse_iterator reverse_iterator;
typedef typename base::const_reverse_iterator const_reverse_iterator;
using base::begin;
using base::end;
using base::rbegin;
using base::rend;
using base::empty;
using base::size;
using base::max_size;
using base::find;
using base::count;
using base::lower_bound;
using base::upper_bound;
using base::equal_range;
using base::operator=;
using base::operator==;
using base::operator!=;
explicit __single_associative(const Compare& comp, const Allocator& A, const key_type (*v_to_k)(const value_type))
: base(comp, A, v_to_k) { }
template <class InputIterator> __single_associative(
InputIterator first,
InputIterator last,
const Compare& comp,
const Allocator& A,
const key_type (*v_to_k)(const value_type)
) : base(comp, A, v_to_k) {
insert(first, last);
}
pair<iterator, bool> insert(const value_type& x){
pair<iterator, bool> retval;
iterator location = lower_bound(this->value_to_key(x));
retval.second = true;
//Empty list or need to insert at end
if(end() == location){
backing.push_back(x);
retval.first = --(end());
return retval;
}
//Something in the list
if(c(this->value_to_key(x), this->value_to_key(*location))){
location = backing.insert(location.base_iterator(), x);
retval.first = location;
}else{
retval.second = false;
retval.first = location;
}
return retval;
}
iterator insert(iterator position, const value_type& x){
// FIXME - this is cheating and probably should be more efficient since we are
// now log(n) to find for inserts
return insert(x).first;
}
template <class InputIterator> void insert(InputIterator first, InputIterator last){
while(first != last){
insert(*first);
++first;
}
}
};
template<class Key, class ValueType, class Compare, class Allocator> class _UCXXEXPORT __multi_associative :
public __base_associative<Key, ValueType, Compare, Allocator>
{
protected:
typedef __base_associative<Key, ValueType, Compare, Allocator> base;
using base::backing;
using base::c;
public:
typedef typename base::key_type key_type;
typedef typename base::value_type value_type;
typedef typename base::key_compare key_compare;
typedef typename base::allocator_type allocator_type;
typedef typename base::reference reference;
typedef typename base::const_reference const_reference;
typedef typename base::iterator iterator;
typedef typename base::const_iterator const_iterator;
typedef typename base::size_type size_type;
typedef typename base::difference_type difference_type;
typedef typename base::pointer pointer;
typedef typename base::const_pointer const_pointer;
typedef typename base::reverse_iterator reverse_iterator;
typedef typename base::const_reverse_iterator const_reverse_iterator;
using base::begin;
using base::end;
using base::rbegin;
using base::rend;
using base::empty;
using base::size;
using base::max_size;
using base::find;
using base::count;
using base::lower_bound;
using base::upper_bound;
using base::equal_range;
using base::operator=;
using base::operator==;
explicit __multi_associative(const Compare& comp, const Allocator& A, const key_type (*v_to_k)(const value_type))
: base(comp, A, v_to_k) { }
template <class InputIterator> __multi_associative(
InputIterator first,
InputIterator last,
const Compare& comp,
const Allocator& A,
const key_type (*v_to_k)(const value_type)
) : base(comp, A, v_to_k) {
insert(first, last);
}
iterator insert(const value_type& x){
iterator location = lower_bound(this->value_to_key(x));
if(location == begin()){
backing.push_front(x);
location = begin();
}else{
location = backing.insert(location.base_iterator(), x);
}
return location;
}
iterator insert(iterator position, const value_type& x){
// FIXME - this is cheating and probably should be more efficient since we are
// now log(n) to find for inserts
return insert(x);
}
template <class InputIterator> void insert(InputIterator first, InputIterator last){
while(first != last){
insert(*first);
++first;
}
}
};
}
#pragma GCC visibility pop
#endif //__STD_HEADER_ASSOCIATIVE_BASE

View File

@ -0,0 +1,66 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef __BASIC_DEFINITIONS
#define __BASIC_DEFINITIONS 1
#include <system_configuration.h>
#pragma GCC visibility push(default)
//The following is used to support GCC symbol visibility patch
#ifdef GCC_HASCLASSVISIBILITY
#define _UCXXEXPORT __attribute__ ((visibility("default")))
#define _UCXXLOCAL __attribute__ ((visibility("hidden")))
#else
#define _UCXXEXPORT
#define _UCXXLOCAL
#endif
#ifdef __GCC__
#define __UCLIBCXX_NORETURN __attribute__ ((__noreturn__))
#else
#define __UCLIBCXX_NORETURN
#endif
#ifdef __UCLIBCXX_HAS_TLS__
#define __UCLIBCXX_TLS __thread
#else
#define __UCLIBCXX_TLS
#endif
//Testing purposes
#define __STRING_MAX_UNITS 65535
namespace std{
typedef signed long int streamsize;
}
#pragma GCC visibility pop
#endif
#ifdef __DODEBUG__
#define UCLIBCXX_DEBUG 1
#else
#define UCLIBCXX_DEBUG 0
#endif

View File

@ -0,0 +1,423 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <basic_definitions>
#include <cstddef>
#include <climits>
#include <func_exception>
#include <string>
#include <iosfwd>
#ifndef __STD_BITSET_HEADER
#define __STD_BITSET_HEADER 1
#pragma GCC visibility push(default)
namespace std{
template <size_t N> class bitset;
template <size_t N> bitset<N> operator&(const bitset<N>&, const bitset<N>&);
template <size_t N> bitset<N> operator|(const bitset<N>&, const bitset<N>&);
template <size_t N> bitset<N> operator^(const bitset<N>&, const bitset<N>&);
template <class charT, class traits, size_t N> basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, bitset<N>& x);
template <class charT, class traits, size_t N> basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const bitset<N>& x);
//Actual Code
template<size_t N> class _UCXXEXPORT bitset {
private:
//Number of characters allocated to hold the bits
static const size_t WORD_SIZE = CHAR_BIT; //Use int maybe?
static const size_t num_bytes = (N + WORD_SIZE - 1) / WORD_SIZE;
//From the bit number, figure out which byte we are working with
size_t byte_num(size_t bit_num) const{
if(WORD_SIZE == 8){
return (bit_num >> 3);
}
if(WORD_SIZE == 16){
return (bit_num >> 4);
}
if(WORD_SIZE == 32){
return (bit_num >> 5);
}
if(WORD_SIZE == 64){
return (bit_num >> 6);
}
return bit_num / WORD_SIZE;
}
//From the bit number, figure out which bit inside the byte we need
size_t bit_num(const size_t bit_num) const{
return bit_num % WORD_SIZE;
}
//Point to the actual data
char data[num_bytes];
public:
class _UCXXEXPORT reference {
friend class bitset;
reference() : bit_num(0), parent(0) { }
size_t bit_num;
bitset * parent;
public:
~reference() { }
reference& operator=(bool x){ // for b[i] = x;
parent->set(bit_num, x);
return *this;
}
reference& operator=(const reference& x){ // for b[i] = b[j];
parent->set(bit_num, x);
return *this;
}
bool operator~() const{ // flips the bit
return !parent->test(bit_num);
}
operator bool() const{ // for x = b[i];
return parent->test(bit_num);
}
reference& flip(){ // for b[i].flip();
parent->flip(bit_num);
return *this;
}
};
bitset(){
reset();
}
bitset(unsigned long val){
reset();
size_t count = sizeof(val) * CHAR_BIT;
if(count > N){
count = N;
}
for(size_t i = 0; i < count; ++i){
set(i, ((val >> i) & 1));
}
}
bitset(const bitset & val){
for(size_t i = 0; i < num_bytes; ++i){
data[i] = val.data[i];
}
}
template<class charT, class traits, class Allocator> _UCXXEXPORT
explicit bitset(
const basic_string<charT,traits,Allocator>& str,
typename basic_string<charT,traits,Allocator>::size_type pos = 0,
typename basic_string<charT,traits,Allocator>::size_type n =
basic_string<charT>::npos
){
reset();
if(n > str.length()){
n = str.length();
}
size_t width = n;
if (width + pos > str.length()){
width = str.length() - pos;
}
for(size_t i = 0; i < width; ++i){
switch(str[pos + width - i - 1]){
case '0':
break;
case '1':
set(i);
break;
default:
__throw_invalid_argument();
}
}
}
bitset<N>& operator&=(const bitset<N>& rhs){
for(size_t i =0; i < num_bytes; ++i){
data[i] &= rhs.data[i];
}
return *this;
}
bitset<N>& operator|=(const bitset<N>& rhs){
for(size_t i =0; i < num_bytes; ++i){
data[i] |= rhs.data[i];
}
return *this;
}
bitset<N>& operator^=(const bitset<N>& rhs){
for(size_t i=0; i < num_bytes; ++i){
data[i] ^= rhs.data[i];
}
return *this;
}
bitset<N>& operator<<=(size_t pos){
for(size_t i = N-1; i >=pos; --i){
set(i, test(i - pos));
}
for(size_t i = 0; i < pos; ++i){
reset(i);
}
return *this;
}
bitset<N>& operator>>=(size_t pos){
for(size_t i = 0; i < (N - pos); ++i){
set(i, test(i + pos));
}
for(size_t i = pos; i > 0; --i){
reset(N - i);
}
return *this;
}
bitset<N>& set(){
size_t i;
for(i = 0; i < N ; ++i){
data[byte_num(i)] |= (1<<bit_num(i));
}
return *this;
}
bitset<N>& set(size_t pos, int val = true){
if(val == true){
data[byte_num(pos)] |= (1<<bit_num(pos));
}else{
data[byte_num(pos)] &= ~(1<<bit_num(pos));
}
return *this;
}
bitset<N>& reset(){
for(size_t i = 0; i < num_bytes; ++i){
data[i] = 0;
}
return *this;
}
bitset<N>& reset(size_t pos){
data[byte_num(pos)] &= ~(1<<bit_num(pos));
return *this;
}
bitset<N> operator~() const{
bitset<N> retval(*this);
retval.flip();
return retval;
}
bitset<N>& flip(){
for(size_t i = 0; i < num_bytes; ++i){
data[i] = ~data[i];
}
return *this;
}
bitset<N>& flip(size_t pos){
char temp = data[byte_num(pos)] & (1 << bit_num(pos));
if(temp == 0){ //Bit was 0
data[byte_num(pos)] |= (1 << bit_num(pos));
}else{ //Bit was 1
data[byte_num(pos)] &= ~(1<<bit_num(pos));
}
return *this;
}
reference operator[](size_t pos){ // for b[i];
reference retval;
retval.parent = this;
retval.bit_num = pos;
return retval;
}
unsigned long to_ulong() const{
if(N > sizeof(unsigned long) * CHAR_BIT){
__throw_overflow_error();
}
unsigned long retval = 0;
size_t count = N;
for(size_t i = count; i > 0; --i){
if(test(i)){
retval +=1;
}
retval<<=1;
}
if(test(0)){
retval +=1;
}
return retval;
}
template <class charT, class traits, class Allocator>
basic_string<charT, traits, Allocator> to_string() const
{
basic_string<charT, traits, Allocator> retval;
retval.reserve(N);
for(size_t i = N ; i > 0; --i){
if(test(i-1) == true){
retval.append("1");
}else{
retval.append("0");
}
}
return retval;
}
size_t count() const{
size_t retval = 0;
for(size_t i =0; i < N; ++i){
if(test(i)){
++retval;
}
}
return retval;
}
size_t size() const{
return N;
}
bitset<N>& operator=(const bitset<N> & rhs){
if(&rhs == this){
return *this;
}
for(size_t i = 0; i <= byte_num(N); ++i){
data[i] = rhs.data[i];
}
return *this;
}
bool operator==(const bitset<N>& rhs) const{
for(size_t i =0; i< N; ++i){
if(test(i) != rhs.test(i)){
return false;
}
}
return true;
}
bool operator!=(const bitset<N>& rhs) const{
for(size_t i =0; i< N; ++i){
if(test(i) != rhs.test(i)){
return true;
}
}
return false;
}
bool test(size_t pos) const{
return (data[byte_num(pos)] & (1<<bit_num(pos)) ) != 0;
}
bool any() const{
for(size_t i = 0; i< N; ++i){
if(test(i)==true){
return true;
}
}
return false;
}
bool none() const{
if(any() == true){
return false;
}
return true;
}
bitset<N> operator<<(size_t pos) const{
bitset retval(*this);
retval<<=pos;
return retval;
}
bitset<N> operator>>(size_t pos) const{
bitset retval(*this);
retval>>=pos;
return retval;
}
};
//Non-member functions
template <size_t N> _UCXXEXPORT bitset<N> operator&(const bitset<N>& lhs, const bitset<N>& rhs){
bitset<N> retval(lhs);
retval &= rhs;
return retval;
}
template <size_t N> _UCXXEXPORT bitset<N> operator|(const bitset<N>& lhs, const bitset<N>& rhs){
bitset<N> retval(lhs);
retval |= rhs;
return retval;
}
template <size_t N> _UCXXEXPORT bitset<N> operator^(const bitset<N>& lhs, const bitset<N>& rhs){
bitset<N> retval(lhs);
retval ^= rhs;
return retval;
}
template <class charT, class traits, size_t N> _UCXXEXPORT basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, bitset<N>& x)
{
string s;
charT c;
for(size_t i = 0; i < N; ++i){
is.get(c);
if(!is.good()){
break;
}
if(c != '1' && c !='0'){
is.putback(c);
break;
}
s+=c;
}
bitset<N> temp(s);
x = temp;
return is;
}
template <class charT, class traits, size_t N> _UCXXEXPORT basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const bitset<N>& x)
{
for(size_t i = N ; i > 0; --i){
if(x.test(i-1) == true){
os << "1";
}else{
os << "0";
}
}
return os;
}
}
#pragma GCC visibility pop
#endif

View File

@ -0,0 +1,30 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <setjmp.h>
#ifndef __STD_HEADER_CFLOAT
#define __STD_HEADER_CFLOAT 1
#include <float.h>
#endif

View File

@ -0,0 +1,215 @@
//***************************************************************************
// include/cxx/cerrno
//
// Copyright (C) 2009 Gregory Nutt. All rights reserved.
// Author: Gregory Nutt <gnutt@nuttx.org>
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
// 1. Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in
// the documentation and/or other materials provided with the
// distribution.
// 3. Neither the name NuttX nor the names of its contributors may be
// used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
// OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
//***************************************************************************
//#ifndef __INCLUDE_CXX_CHAR1_TRAITS
//#define __INCLUDE_CXX_CHAR1_TRAITS
#include <basic_definitions>
#include <string.h>
#include <exception>
#include <memory>
#ifdef __UCLIBCXX_HAS_WCHAR__
#include <cwchar>
#include <cwctype>
#endif
#ifndef __HEADER_CHAR_TRAITS
#define __HEADER_CHAR_TRAITS 1
namespace std{
/* Inlining all wrapped function calls to shrink the amount of code generated*/
//Typedefs to use for stuff
typedef signed int char_traits_off_type;
//Generic char_traits
template<class charT> struct _UCXXEXPORT char_traits { };
//Specialize for char
template<> struct _UCXXEXPORT char_traits<char> {
typedef char char_type;
typedef short int int_type;
typedef char_traits_off_type off_type;
typedef char_traits_off_type pos_type;
typedef char state_type;
inline static void assign(char_type & c, const char_type & d) { c = d; }
static bool eq(const char_type& c1, const char_type& c2);
static char_type to_char_type(const int_type & i);
inline static int_type to_int_type(const char_type & c){
return (short int)(unsigned char)c;
}
inline static bool eq_int_type(const int_type & a, const int_type & b){
if(a==b){
return true;
}
return false;
}
inline static bool lt(const char_type& c1, const char_type& c2){
if(strncmp(&c1, &c2, 1) < 0){
return true;
}
return false;
}
inline static char_type* move(char_type* s1, const char_type* s2, size_t n){
return (char*) memmove(s1, s2, n);
}
inline static char_type* copy(char_type* s1, const char_type* s2, size_t n){
for(unsigned long int i=0; i< n; ++i){
assign(s1[i], s2[i]);
}
return s1 + n;
}
inline static char_type* assign(char_type* s, size_t n, char_type a){
return (char *)memset(s, a, n);
}
inline static int compare(const char_type* s1, const char_type* s2, size_t n){
return strncmp(s1, s2, n);
}
inline static size_t length(const char_type* s){
return wstrlen(s);
}
static const char_type* find(const char_type* s, int n, const char_type& a);
inline static char_type eos() { return 0; }
inline static int_type eof() { return -1; }
inline static int_type not_eof(const int_type & i) {
if(i == -1){
return 0;
} else {
return i;
}
}
static state_type get_state(pos_type p){
p = p;
state_type a;
return a;
}
};
#ifdef __UCLIBCXX_HAS_WCHAR__
template<> struct _UCXXEXPORT char_traits<wchar_t> {
typedef wchar_t char_type;
typedef wint_t int_type;
typedef char_traits_off_type off_type;
typedef char_traits_off_type pos_type;
typedef mbstate_t state_type;
static void assign(char_type & c, const char_type & d){ c=d; }
static char_type to_char_type(const int_type & i){
return i;
}
static int_type to_int_type(const char_type & c){
return c;
}
inline static bool eq_int_type(const int_type & a, const int_type & b){
if(a==b){
return true;
}
return false;
}
inline static bool eq(const char_type& c1, const char_type& c2){
if(wcsncmp(&c1, &c2, 1) == 0){
return true;
}
return false;
}
inline static bool lt(const char_type& c1, const char_type& c2){
if(wcsncmp(&c1, &c2, 1) < 0){
return true;
}
return false;
}
inline static char_type* move(char_type* s1, const char_type* s2, size_t n){
return (char_type*) memmove(s1, s2, n * sizeof(char_type));
}
inline static char_type* copy(char_type* s1, const char_type* s2, size_t n){
for(unsigned long int i=0; i< n; ++i){
assign(s1[i], s2[i]);
}
return s1 + n;
}
inline static char_type* assign(char_type* s, size_t n, char_type a){
return (char_type *)memset(s, a, n); /*FIXME*/
}
inline static int compare(const char_type* s1, const char_type* s2, size_t n){
return wcsncmp(s1, s2, n);
}
inline static size_t length(const char_type* s){
return wcslen(s);
}
static const char_type* find(const char_type* s, int n, const char_type& a);
inline static char_type eos() { return 0; }
inline static int_type eof() { return WEOF; }
inline static int_type not_eof(const int_type & i) {
if(i == WEOF){
return (int_type)0;
} else {
return i;
}
}
static state_type get_state(pos_type){
state_type a;
return a;
}
};
#endif
}
#endif

View File

@ -0,0 +1,30 @@
/* Copyright (C) 2005 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef __STD_HEADER_CLOCALE
#define __STD_HEADER_CLOCALE 1
#include <locale.h>
namespace std {
using ::lconv;
using ::setlocale;
using ::localeconv;
}
#endif // __STD_HEADER_CLOCALE

View File

@ -0,0 +1,327 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <istream>
#include <ostream>
#ifndef __STD_HEADER_COMPLEX
#define __STD_HEADER_COMPLEX 1
namespace std {
// class complex<float>;
// class complex<double>;
// class complex<long double>;
template<class T> class _UCXXEXPORT complex{
public:
typedef T value_type;
complex(const T& re = T(), const T& im = T()) : r(re), i(im) { }
complex(const complex& c): r(c.r), i(c.i){ }
template<class X> complex(const complex<X>& c): r(c.r), i(c.i){ }
inline T real() const{
return r;
}
inline T imag() const{
return i;
}
complex<T>& operator= (const T& v){
r = v;
i = 0;
return *this;
}
complex<T>& operator+=(const T& v){
r +=v;
return *this;
}
complex<T>& operator-=(const T& v){
r -=v;
return *this;
}
complex<T>& operator*=(const T& v){
r*=v;
i*=v;
return *this;
}
complex<T>& operator/=(const T& v){
r/=v;
i/=v;
return *this;
}
complex& operator=(const complex& v){
if(&v != this){
r = v.r;
i = v.i;
}
return *this;
}
template<class X> complex<T>& operator= (const complex<X>& v){
r = v.r;
i = v.i;
return *this;
}
template<class X> complex<T>& operator+=(const complex<X>& v){
r+=v.r;
i+=v.i;
return *this;
}
template<class X> complex<T>& operator-=(const complex<X>& v){
r-=v.r;
i-=v.i;
return *this;
}
template<class X> complex<T>& operator*=(const complex<X>& v){
T tempr = r*v.r - i*v.i;
T tempi = r*v.i + i*v.r;
r = tempr;
i = tempi;
return *this;
}
template<class X> complex<T>& operator/=(const complex<X>& v){
T tempr = (r*v.r + i*v.i) / (v.r*v.r + v.i*v.i);
T tempi = (i*v.r - r*v.i) / (v.r*v.r + v.i*v.i);
r = tempr;
i = tempi;
return *this;
}
private:
T r;
T i;
};
template<class T> _UCXXEXPORT complex<T> operator+(const complex<T>& ls, const complex<T>& rs){
complex<T> retval(ls);
retval += rs;
return retval;
}
template<class T> _UCXXEXPORT complex<T> operator+(const complex<T>& ls, const T& rs){
complex<T> retval(ls);
ls += rs;
return retval;
}
template<class T> _UCXXEXPORT inline complex<T> operator+(const T& ls, const complex<T>& rs){
return rs + ls;
}
template<class T> _UCXXEXPORT complex<T> operator-(const complex<T>& ls, const complex<T>& rs){
complex<T> retval(ls);
retval -= rs;
return retval;
}
template<class T> _UCXXEXPORT complex<T> operator-(const complex<T>& ls, const T& rs){
complex<T> retval(ls);
retval -= rs;
return retval;
}
template<class T> _UCXXEXPORT complex<T> operator-(const T& ls, const complex<T>& rs){
complex<T> retval(ls);
retval -= rs;
return retval;
}
template<class T> _UCXXEXPORT complex<T> operator*(const complex<T>& ls, const complex<T>& rs){
complex<T> retval(ls);
retval *= rs;
return retval;
}
template<class T> _UCXXEXPORT complex<T> operator*(const complex<T>& ls, const T& rs){
complex<T> retval(ls);
retval *= rs;
return retval;
}
template<class T> _UCXXEXPORT complex<T> operator*(const T& ls, const complex<T>& rs){
complex<T> retval(ls);
retval *=rs;
return retval;
}
template<class T> _UCXXEXPORT complex<T> operator/(const complex<T>& ls, const complex<T>& rs){
complex<T> retval(ls);
retval/=rs;
return retval;
}
template<class T> _UCXXEXPORT complex<T> operator/(const complex<T>& ls, const T& rs){
complex<T> retval(ls);
retval/=rs;
return retval;
}
template<class T> _UCXXEXPORT complex<T> operator/(const T& ls, const complex<T>& rs){
complex<T> retval(ls);
retval/=rs;
return retval;
}
template<class T> _UCXXEXPORT complex<T> operator+(const complex<T>& v){
return v;
}
template<class T> _UCXXEXPORT complex<T> operator-(const complex<T>& v){
return complex<T> (-v.real(), -v.imag());
}
template<class T> _UCXXEXPORT bool operator==(const complex<T>& ls, const complex<T>& rs){
if( ls.real() == rs.real() && ls.imag() == rs.image()){
return true;
}
return false;
}
template<class T> _UCXXEXPORT bool operator==(const complex<T>& ls, const T& rs){
if(ls.real() == rs && ls.imag() == T()){
return true;
}
return false;
}
template<class T> _UCXXEXPORT bool operator==(const T& ls, const complex<T>& rs){
if(ls == rs.real() && rs.imag() == T()){
return true;
}
return false;
}
template<class T> _UCXXEXPORT bool operator!=(const complex<T>& ls, const complex<T>& rs){
if(ls == rs){
return false;
}
return true;
}
template<class T> _UCXXEXPORT bool operator!=(const complex<T>& ls, const T& rs){
if(ls == rs){
return false;
}
return true;
}
template<class T> _UCXXEXPORT bool operator!=(const T& ls, const complex<T>& rs){
if(ls == rs){
return false;
}
return true;
}
template<class T, class charT, class traits> _UCXXEXPORT basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, complex<T>& v)
{
T tempr;
T tempi;
is >> tempr;
is.get();
is >> tempi;
v = complex<T>(tempr, tempi);
return is;
}
template<class T, class charT, class traits> _UCXXEXPORT basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const complex<T>&v)
{
os << v.real() << ", " << v.imag();
return os;
}
template<class T> _UCXXEXPORT T real(const complex<T>& v){
return v.real();
}
template<class T> _UCXXEXPORT T imag(const complex<T>& v){
return v.imag();
}
template<class T> _UCXXEXPORT T norm(const complex<T>& v){
return (v.real() * v.real() + v.imag() * v.imag());
}
template<class T> _UCXXEXPORT complex<T> conj(const complex<T>& v){
return complex<T>(v.real(), -v.imag());
}
#ifdef __UCLIBCXX_SUPPORT_MATH__ //Can we link with libm?
template<class T> _UCXXEXPORT T abs(const complex<T>& v){
return sqrt(v.real() * v.real() + v.imag() * v.imag());
}
template<class T> _UCXXEXPORT T arg(const complex<T>& v){
return atan2(v.imag(), v.real());
}
template<class T> _UCXXEXPORT complex<T> polar(const T& rho, const T& theta){
return complex<T>(rho * cos(theta), rho * sin(theta));
}
template<class T> _UCXXEXPORT complex<T> cos (const complex<T>& v){
return complex<T>(cos(v.real()) * cosh(v.imag()), -sin(v.real()) * sinh(v.imag()));
}
template<class T> _UCXXEXPORT complex<T> cosh (const complex<T>& v){
return complex<T>(cosh(v.real()) * cos(v.imag()), sinh(v.real()) * sin(v.imag()));
}
template<class T> _UCXXEXPORT complex<T> exp (const complex<T>& v){
return polar(exp(v.real()), v.imag());
}
template<class T> _UCXXEXPORT complex<T> log (const complex<T>& v){
return complex<T>(log(abs(v)), arg(v));
}
template<class T> _UCXXEXPORT complex<T> log10(const complex<T>& v){
return (log(v) / log(T(10.0)));
}
template<class T> _UCXXEXPORT complex<T> pow(const complex<T>& v, int p){
T rho = pow(abs(v), p);
T theta = arg(v);
return complex<T>(rho * cos(p * theta), rho * sin(p * theta) );
}
template<class T> _UCXXEXPORT complex<T> pow(const complex<T>& v, const T& p){
return polar( pow(abs(v),p), arg(v)*p );
}
template<class T> _UCXXEXPORT complex<T> pow(const complex<T>& v, const complex<T>& p){
if(v == T()){
//We are using "0" as the value
return T();
}
return exp(p * log(v));
}
template<class T> _UCXXEXPORT complex<T> pow(const T& v, const complex<T>& p){
if(v == T()){
return T();
}
return polar(pow(v,p.real()), y.imag() * log(x) );
}
template<class T> _UCXXEXPORT complex<T> sin (const complex<T>& v){
return complex<T>(sin(v.real()) * cosh(v.imag()), cosh(v.real()) * sin(v.imag()));
}
template<class T> _UCXXEXPORT complex<T> sinh (const complex<T>& v){
return complext<T>(sinh(v.real()) * cos(v.imag()), cosh(v.real()) * sin(v.imag()) );
}
template<class T> _UCXXEXPORT complex<T> sqrt (const complex<T>&);
template<class T> _UCXXEXPORT complex<T> tan (const complex<T>& v){
return sin(v) / cos(v);
}
template<class T> _UCXXEXPORT complex<T> tanh (const complex<T>& v){
return sinh(v) / cosh(v);
}
#endif
}
#endif

View File

@ -0,0 +1,44 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <setjmp.h>
#ifndef __STD_HEADER_CSETJMP
#define __STD_HEADER_CSETJMP 1
//From GCC Header files
#undef longjmp
// Adhere to section 17.4.1.2 clause 5 of ISO 14882:1998
#ifndef setjmp
#define setjmp(env) setjmp (env)
#endif
//Mine again
namespace std{
using ::longjmp;
using ::jmp_buf;
}
#endif

View File

@ -0,0 +1,86 @@
/* Copyright (C) 2006 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation version 2.1
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <wchar.h>
#include <basic_definitions>
#ifndef __HEADER_CWCHAR
#define __HEADER_CWCHAR 1
namespace std{
using ::mbstate_t;
using ::wint_t;
using ::btowc;
using ::fgetwc;
using ::fgetws;
using ::fputwc;
using ::fputws;
using ::fwide;
using ::fwprintf;
using ::fwscanf;
using ::getwc;
using ::getwchar;
using ::mbrlen;
using ::mbrtowc;
using ::mbsinit;
using ::mbsrtowcs;
using ::putwc;
using ::putwchar;
using ::swprintf;
using ::swscanf;
using ::ungetwc;
using ::vfwprintf;
using ::vswprintf;
using ::vwprintf;
using ::wcrtomb;
using ::wcscat;
using ::wcschr;
using ::wcscmp;
using ::wcscoll;
using ::wcscpy;
using ::wcscspn;
using ::wcsftime;
using ::wcslen;
using ::wcsncat;
using ::wcsncmp;
using ::wcsncpy;
using ::wcspbrk;
using ::wcsrchr;
using ::wcsrtombs;
using ::wcsspn;
using ::wcsstr;
using ::wcstod;
using ::wcstok;
using ::wcstol;
using ::wcstoul;
using ::wcsxfrm;
using ::wctob;
using ::wmemchr;
using ::wmemcmp;
using ::wmemcpy;
using ::wmemmove;
using ::wmemset;
using ::wprintf;
using ::wscanf;
}
#endif

View File

@ -0,0 +1,106 @@
// -*- C++ -*- forwarding header.
// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING. If not, write to the Free
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
// USA.
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
// the GNU General Public License. This exception does not however
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
//
// ISO C++ 14882: <cwctype>
//
/** @file cwctype
* This is a Standard C++ Library file. You should @c #include this file
* in your programs, rather than any of the "*.h" implementation files.
*
* This is the C++ version of the Standard C Library header @c wctype.h,
* and its contents are (mostly) the same as that header, but are all
* contained in the namespace @c std.
*/
#ifndef _CPP_CWCTYPE
#define _CPP_CWCTYPE 1
#pragma GCC system_header
//#include <bits/c++config.h>
#ifdef __UCLIBCXX_HAS_WCHAR__
#include <wctype.h>
#endif
// Get rid of those macros defined in <wctype.h> in lieu of real functions.
#undef iswalnum
#undef iswalpha
#undef iswblank
#undef iswcntrl
#undef iswdigit
#undef iswgraph
#undef iswlower
#undef iswprint
#undef iswprint
#undef iswpunct
#undef iswspace
#undef iswupper
#undef iswxdigit
#undef iswctype
#undef towlower
#undef towupper
#undef towctrans
#undef wctrans
#undef wctype
#if __UCLIBCXX_HAS_WCHAR__
namespace std
{
using ::wint_t; // cwchar
using ::wctype_t;
using ::wctrans_t;
using ::iswalnum;
using ::iswalpha;
using ::iswblank;
using ::iswcntrl;
using ::iswdigit;
using ::iswgraph;
using ::iswlower;
using ::iswprint;
using ::iswprint;
using ::iswpunct;
using ::iswspace;
using ::iswupper;
using ::iswxdigit;
using ::iswctype;
using ::towlower;
using ::towupper;
using ::towctrans;
using ::wctrans;
using ::wctype;
}
#endif //__ULIBCXX_HAS_WCHAR__
#endif

View File

@ -0,0 +1,884 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <memory>
#include <iterator>
#include <stdexcept>
#pragma GCC visibility push(default)
#ifndef __STD_HEADER_DEQUE
#define __STD_HEADER_DEQUE
namespace std{
template <class T, class Allocator = allocator<T> > class deque;
template <class T, class Allocator> bool operator==(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
template <class T, class Allocator> bool operator< (const deque<T,Allocator>& x, const deque<T,Allocator>& y);
template <class T, class Allocator> bool operator!=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
template <class T, class Allocator> bool operator> (const deque<T,Allocator>& x, const deque<T,Allocator>& y);
template <class T, class Allocator> bool operator>=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
template <class T, class Allocator> bool operator<=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
template <class T, class Allocator> void swap(deque<T,Allocator>& x, deque<T,Allocator>& y);
template <class T, class Allocator> class _UCXXEXPORT deque {
public:
friend bool operator==<>(const deque<T, Allocator>& x, const deque<T, Allocator>& y);
friend class deque_iter;
friend class deque_citer;
class deque_iter;
class deque_citer;
typedef typename Allocator::reference reference;
typedef typename Allocator::const_reference const_reference;
typedef deque_iter iterator;
typedef deque_citer const_iterator;
typedef typename Allocator::size_type size_type;
typedef typename Allocator::difference_type difference_type;
typedef T value_type;
typedef Allocator allocator_type;
typedef typename Allocator::pointer pointer;
typedef typename Allocator::const_pointer const_pointer;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
explicit deque(const Allocator& al = Allocator());
explicit deque(size_type n, const T& value = T(), const Allocator& al = Allocator());
template <class InputIterator> deque(InputIterator first, InputIterator last, const Allocator& = Allocator());
deque(const deque<T,Allocator>& x);
~deque();
deque<T,Allocator>& operator=(const deque<T,Allocator>& x);
template <class InputIterator> void assign(InputIterator first, InputIterator last);
template <class Size, class U> void assign(Size n, const U& u = U());
allocator_type get_allocator() const;
iterator begin();
const_iterator begin() const;
iterator end();
const_iterator end() const;
reverse_iterator rbegin();
const_reverse_iterator rbegin() const;
reverse_iterator rend();
const_reverse_iterator rend() const;
size_type size() const;
size_type max_size() const;
void resize(size_type sz, T c = T());
bool empty() const;
reference operator[](size_type n);
const_reference operator[](size_type n) const;
reference at(size_type n);
const_reference at(size_type n) const;
reference front();
const_reference front() const;
reference back();
const_reference back() const;
void push_front(const T& x);
void push_back(const T& x);
iterator insert(iterator position, const T& x = T());
void insert(iterator position, size_type n, const T& x);
template <class InputIterator> void insert (iterator position, InputIterator first, InputIterator last);
void pop_front();
void pop_back();
iterator erase(iterator position);
iterator erase(iterator first, iterator last);
void swap(deque<T,Allocator>&);
void clear();
protected:
void reserve(size_type n);
inline size_type array_element(size_type deque_element) const{
if(deque_element < (data_size - first_element)){
return first_element + deque_element;
}
return deque_element - (data_size - first_element);
}
inline size_type first_subtract(size_type sub_size) const{
if(sub_size > first_element){
return (data_size - first_element) - sub_size;
}
return first_element - sub_size;
}
T * data;
size_type data_size; //Physical size of array
size_type elements; //Elements in array
size_type first_element; //Element number of array 0..n
size_type last_element; //Element number of array 0..n
Allocator a;
};
template<class T, class Allocator> class _UCXXEXPORT deque<T, Allocator>::deque_iter
: public std::iterator<
random_access_iterator_tag,
T,
typename Allocator::difference_type,
typename Allocator::pointer,
typename Allocator::reference
>
{
friend class deque<T, Allocator>;
protected:
deque<T, Allocator> * container;
typename Allocator::size_type element;
public:
deque_iter() : container(0), element(0) { }
deque_iter(const deque_iter & d) : container (d.container), element(d.element) { }
deque_iter(deque<T, Allocator> * c, typename Allocator::size_type e)
: container(c), element(e)
{
return;
}
~deque_iter() { }
deque_iter & operator=(const deque_iter & d){
container = d.container;
element = d.element;
return *this;
}
T & operator*(){
return container->data[container->array_element(element)];
}
T * operator->(){
return container->data + container->array_element(element);
}
const T & operator*() const{
return container->data[container->array_element(element)];
}
const T * operator->() const{
return container->data + container->array_element(element);
}
bool operator==(const deque_iter & d) const{
if(container == d.container && element == d.element){
return true;
}
return false;
}
bool operator==(const deque_citer & d) const{
if(container == d.container && element == d.element){
return true;
}
return false;
}
bool operator!=(const deque_iter & d) const{
if(container != d.container || element != d.element){
return true;
}
return false;
}
bool operator!=(const deque_citer & d) const{
if(container != d.container || element != d.element){
return true;
}
return false;
}
bool operator<(const deque_iter & d) const{
if(element < d.element){
return true;
}
return false;
}
bool operator<(const deque_citer & d) const{
if(element < d.element){
return true;
}
return false;
}
bool operator<=(const deque_iter & d) const{
if(element <= d.element){
return true;
}
return false;
}
bool operator<=(const deque_citer & d) const{
if(element <= d.element){
return true;
}
return false;
}
bool operator>(const deque_iter & d) const{
if(element > d.element){
return true;
}
return false;
}
bool operator>(const deque_citer & d) const{
if(element > d.element){
return true;
}
return false;
}
bool operator>=(const deque_iter & d) const{
if(element >= d.element){
return true;
}
return false;
}
bool operator>=(const deque_citer & d) const{
if(element >= d.element){
return true;
}
return false;
}
deque_iter & operator++(){
++element;
return *this;
}
deque_iter operator++(int){
deque_iter temp(container, element);
++element;
return temp;
}
deque_iter operator+(typename Allocator::size_type n){
deque_iter temp(container, element + n);
return temp;
}
deque_iter & operator+=(typename Allocator::size_type n){
element += n;
return *this;
}
deque_iter & operator--(){
--element;
return *this;
}
deque_iter operator--(int){
deque_iter temp(container, element);
--element;
return temp;
}
deque_iter operator-(typename Allocator::size_type n){
deque_iter temp(container, element - n);
return temp;
}
deque_iter & operator-=(typename Allocator::size_type n){
element -= n;
return *this;
}
typename Allocator::size_type operator-(const deque_iter & d){
return element - d.element;
}
};
template<class T, class Allocator> class _UCXXEXPORT deque<T, Allocator>::deque_citer
: public std::iterator<
random_access_iterator_tag,
T,
typename Allocator::difference_type,
typename Allocator::const_pointer,
typename Allocator::const_reference
>
{
friend class deque<T, Allocator>;
protected:
const deque<T, Allocator> * container;
typename Allocator::size_type element;
public:
deque_citer() : container(0), element(0) { }
deque_citer(const deque_citer & d) : container (d.container), element(d.element) { }
deque_citer(const deque_iter & d) : container (d.container), element(d.element) { }
deque_citer(const deque<T, Allocator> * c, typename Allocator::size_type e)
: container(c), element(e)
{
return;
}
~deque_citer() { }
deque_citer & operator=(const deque_iter & d){
container = d.container;
element = d.element;
return *this;
}
const T & operator*() const{
return container->data[container->array_element(element)];
}
const T * operator->() const{
return container->data + container->array_element(element);
}
bool operator==(const deque_citer & d) const{
if(container == d.container && element == d.element){
return true;
}
return false;
}
bool operator==(const deque_iter & d) const{
if(container == d.container && element == d.element){
return true;
}
return false;
}
bool operator!=(const deque_citer & d) const{
if(container != d.container || element != d.element){
return true;
}
return false;
}
bool operator!=(const deque_iter & d) const{
if(container != d.container || element != d.element){
return true;
}
return false;
}
bool operator<(const deque_citer & d) const{
if(element < d.element){
return true;
}
return false;
}
bool operator<(const deque_iter & d) const{
if(element < d.element){
return true;
}
return false;
}
bool operator<=(const deque_citer & d) const{
if(element <= d.element){
return true;
}
return false;
}
bool operator<=(const deque_iter & d) const{
if(element <= d.element){
return true;
}
return false;
}
bool operator>(const deque_citer & d) const{
if(element > d.element){
return true;
}
return false;
}
bool operator>(const deque_iter & d) const{
if(element > d.element){
return true;
}
return false;
}
bool operator>=(const deque_citer & d){
if(element >= d.element){
return true;
}
return false;
}
bool operator>=(const deque_iter & d){
if(element >= d.element){
return true;
}
return false;
}
deque_citer & operator++(){
++element;
return *this;
}
deque_citer operator++(int){
deque_citer temp(container, element);
++element;
return temp;
}
deque_citer operator+(typename Allocator::size_type n){
deque_citer temp(container, element + n);
return temp;
}
deque_citer & operator+=(typename Allocator::size_type n){
element += n;
return *this;
}
deque_citer & operator--(){
--element;
return *this;
}
deque_citer operator--(int){
deque_citer temp(container, element);
--element;
return temp;
}
deque_citer operator-(typename Allocator::size_type n){
deque_citer temp(container, element - n);
return temp;
}
deque_citer & operator-=(typename Allocator::size_type n){
element -= n;
return *this;
}
typename Allocator::size_type operator-(const deque_citer & d){
return element - d.element;
}
};
template<class T, class Allocator> deque<T, Allocator>::deque(const Allocator& al)
: data(0),
data_size(0), elements(0), first_element(0), last_element(0), a(al)
{
data_size = __UCLIBCXX_STL_BUFFER_SIZE__;
data = a.allocate(data_size);
first_element = data_size /2;
last_element = first_element;
}
template<class T, class Allocator> deque<T, Allocator>::deque(
size_type n, const T& value, const Allocator& al)
: data(0),
elements(n), first_element(0), last_element(0), a(al)
{
data_size = elements + __UCLIBCXX_STL_BUFFER_SIZE__;
data = a.allocate(data_size);
first_element = (data_size - elements) / 2;
last_element = first_element;
for(n=first_element ; n < last_element; ++n ){
a.construct(data+n, value);
}
}
template<class T, class Allocator> template <class InputIterator>
deque<T, Allocator>::deque(InputIterator first, InputIterator last, const Allocator& al)
: data(0),
data_size(0), elements(0), first_element(0), last_element(0), a(al)
{
data_size = __UCLIBCXX_STL_BUFFER_SIZE__;
data = a.allocate(data_size);
first_element = data_size / 4; //Note sure how big, but let's add a little space...
last_element = first_element;
while(first != last){
push_back(*first);
++first;
}
}
template<class T, class Allocator> deque<T, Allocator>::deque(const deque<T,Allocator>& x)
: data(0),
elements(0), first_element(0), last_element(0), a(x.a)
{
data_size = x.elements + __UCLIBCXX_STL_BUFFER_SIZE__;
data = a.allocate(data_size);
first_element = (data_size - x.elements) / 2;
last_element = first_element;
for(size_type i=0; i < x.elements; ++i){
push_back(x[i]);
}
}
template<class T, class Allocator> deque<T, Allocator>::~deque(){
clear();
a.deallocate(data, data_size);
}
template<class T, class Allocator> deque<T,Allocator>& deque<T, Allocator>::
operator=(const deque<T,Allocator>& x)
{
if(&x == this){
return *this;
}
resize(x.elements);
for(size_t i = 0; i < elements; ++i){
data[array_element(i)] = x[i];
}
return *this;
}
template<class T, class Allocator> template <class InputIterator> void
deque<T, Allocator>::assign(InputIterator first, InputIterator last)
{
clear();
while(first !=last){
push_back(*first);
++first;
}
}
template<class T, class Allocator> template <class Size, class U> void
deque<T, Allocator>::assign(Size n, const U& u)
{
if(&u == this){
return;
}
clear();
for(size_type i = 0; i < n; ++i){
push_back(u);
}
}
template<class T, class Allocator> typename deque<T, Allocator>::allocator_type
deque<T, Allocator>::get_allocator() const
{
return a;
}
template<class T, class Allocator> typename
deque<T, Allocator>::iterator deque<T, Allocator>::begin()
{
return deque_iter(this, 0);
}
template<class T, class Allocator> typename deque<T, Allocator>::const_iterator
deque<T, Allocator>::begin() const
{
return deque_citer(this, 0);
}
template<class T, class Allocator> typename
deque<T, Allocator>::iterator deque<T, Allocator>::end()
{
return deque_iter(this, elements);
}
template<class T, class Allocator> typename
deque<T, Allocator>::const_iterator deque<T, Allocator>::end() const
{
return deque_citer(this, elements);
}
template<class T, class Allocator> typename
deque<T, Allocator>::reverse_iterator deque<T, Allocator>::rbegin()
{
return reverse_iterator(end());
}
template<class T, class Allocator> typename
deque<T, Allocator>::const_reverse_iterator deque<T, Allocator>::rbegin() const
{
return const_reverse_iterator(end());
}
template<class T, class Allocator> typename
deque<T, Allocator>::reverse_iterator deque<T, Allocator>::rend()
{
return reverse_iterator(begin());
}
template<class T, class Allocator> typename
deque<T, Allocator>::const_reverse_iterator deque<T, Allocator>::rend() const
{
return const_reverse_iterator(begin());
}
template<class T, class Allocator> typename
deque<T, Allocator>::size_type deque<T, Allocator>::size() const
{
return elements;
}
template<class T, class Allocator> typename
deque<T, Allocator>::size_type deque<T, Allocator>::max_size() const
{
return ((size_type)(-1)) / sizeof(T);
}
template<class T, class Allocator> void deque<T, Allocator>::resize(size_type sz, T c){
reserve(sz);
while(sz > size()){
push_back(c);
}
while(sz < size()){
pop_back();
}
}
template<class T, class Allocator> bool deque<T, Allocator>::empty() const{
return (elements == 0);
}
template<class T, class Allocator> typename
deque<T, Allocator>::reference deque<T, Allocator>::operator[](size_type n)
{
return data[array_element(n)];
}
template<class T, class Allocator> typename
deque<T, Allocator>::const_reference deque<T, Allocator>::operator[](size_type n) const
{
return data[array_element(n)];
}
template<class T, class Allocator> typename
deque<T, Allocator>::reference deque<T, Allocator>::at(size_type n)
{
if(n > elements){
__throw_out_of_range("Out of deque range");
}
return data[array_element(n)];
}
template<class T, class Allocator> typename
deque<T, Allocator>::const_reference deque<T, Allocator>::at(size_type n) const
{
if(n > elements){
__throw_out_of_range("Out of deque range");
}
return data[array_element(n)];
}
template<class T, class Allocator> typename
deque<T, Allocator>::reference deque<T, Allocator>::front()
{
return data[first_element];
}
template<class T, class Allocator> typename
deque<T, Allocator>::const_reference deque<T, Allocator>::front() const
{
return data[first_element];
}
template<class T, class Allocator> typename
deque<T, Allocator>::reference deque<T, Allocator>::back()
{
return data[array_element(elements-1)];
}
template<class T, class Allocator> typename
deque<T, Allocator>::const_reference deque<T, Allocator>::back() const
{
return data[array_element(elements-1)];
}
template<class T, class Allocator> void deque<T, Allocator>::push_front(const T& x){
reserve(elements + 1);
first_element = first_subtract(1);
a.construct(data + first_element, x);
++elements;
}
template<class T, class Allocator> void deque<T, Allocator>::push_back(const T& x){
reserve(elements + 1);
a.construct(data + last_element, x);
++elements;
last_element = array_element(elements);
}
template<class T, class Allocator> typename
deque<T, Allocator>::iterator deque<T, Allocator>::insert(iterator position, const T& x)
{
reserve(elements+1);
if(position.element > (elements/2)){
//Push all elements back 1
push_back(x);
for(size_type i = elements-1; i > position.element; --i){
at(i) = at(i-1);
}
}else{
//Push all elements forward 1
push_front(x);
for(size_type i = 0; i < position.element; ++i){
at(i) = at(i+1);
}
}
at(position.element) = x;
return deque_iter(this, position.element);
}
template<class T, class Allocator> void deque<T, Allocator>::
insert(typename deque<T, Allocator>::iterator position, size_type n, const T& x)
{
reserve(elements + n);
for(size_t i =0; i < n; ++i){
position = insert(position, x);
}
}
template<class T, class Allocator> template <class InputIterator>
void deque<T, Allocator>::insert (iterator position, InputIterator first, InputIterator last)
{
while(first != last){
position = insert(position, *first);
++first;
}
}
template<class T, class Allocator> void deque<T, Allocator>::pop_front(){
if(elements == 0){
__throw_out_of_range("deque pop_front");
}
a.destroy(data + first_element);
first_element = array_element(1);
--elements;
}
template<class T, class Allocator> void deque<T, Allocator>::pop_back(){
last_element = array_element(elements - 1);
a.destroy(data + last_element);
--elements;
}
template<class T, class Allocator> typename
deque<T, Allocator>::iterator deque<T, Allocator>::erase(typename deque<T, Allocator>::iterator position)
{
if(position.element > (elements /2)){
for(size_type i = position.element; i < elements - 1; ++i){
at(i) = at(i+1);
}
pop_back();
}else{
for(size_type i = position.element; i > 0; --i){
at(i) = at(i-1);
}
pop_front();
}
return deque_iter(this, position.element);
}
template<class T, class Allocator> typename deque<T, Allocator>::iterator
deque<T, Allocator>::
erase(typename deque<T, Allocator>::iterator first, typename deque<T, Allocator>::iterator last)
{
//Shift backwards
size_type num_move = last.element - first.element;
if( first.element > (elements - last.element) ){
for(size_type i = last.element; i < elements ; ++i){
at(i-num_move) = at(i);
}
for(size_type i = 0; i < num_move ; ++i){
pop_back();
}
}else{
for(size_type i = 0; i < first.element ; ++i){
at(last.element - i - 1) = at(first.element - i - 1);
}
for(size_type i = 0; i < num_move ; ++i){
pop_front();
}
}
return deque_iter(this, first.element);
}
template<class T, class Allocator> void deque<T, Allocator>::swap(deque<T,Allocator>& x)
{
T * temp_data;
typename deque<T,Allocator>::size_type temp_size;
//Swap data pointers
temp_data = x.data;
x.data = data;
data = temp_data;
//Swap array sizes
temp_size = x.data_size;
x.data_size = data_size;
data_size = temp_size;
//Swap num array elements
temp_size = x.elements;
x.elements = elements;
elements = temp_size;
//Swap first_pointer
temp_size = x.first_element;
x.first_element = first_element;
first_element = temp_size;
//Swap last_pointer
temp_size = x.last_element;
x.last_element = last_element;
last_element = temp_size;
}
template<class T, class Allocator> void deque<T, Allocator>::clear()
{
while(elements > 0 ){
pop_back();
}
}
template<class T, class Allocator> void deque<T, Allocator>::reserve(typename deque<T, Allocator>::size_type n)
{
if(data_size >= n){
return;
}
size_type size_temp;
size_type first_temp;
T * data_temp;
size_temp = n + __UCLIBCXX_STL_BUFFER_SIZE__; //Reserve extra 'cause we can
data_temp = a.allocate(size_temp);
first_temp = (size_temp - elements) / 2;
for(size_type i = 0; i < elements; ++i){
a.construct(data_temp + first_temp + i, data[array_element(i)]);
a.destroy(data + array_element(i));
}
//Now shuffle pointers
a.deallocate(data, data_size);
data = data_temp;
data_size = size_temp;
first_element = first_temp;
last_element = first_element + elements;
}
template <class T, class Allocator> _UCXXEXPORT
bool
operator==(const deque<T,Allocator>& x, const deque<T,Allocator>& y)
{
if(x.elements != y.elements){
return false;
}
for(typename deque<T,Allocator>::size_type i = 0; i < x.elements; ++i){
if(x[i] < y[i] || y[i] < x[i]){
return false;
}
}
return true;
}
template <class T, class Allocator> bool operator< (const deque<T,Allocator>& x, const deque<T,Allocator>& y);
template <class T, class Allocator> _UCXXEXPORT
bool
operator!=(const deque<T,Allocator>& x, const deque<T,Allocator>& y)
{
if(x == y){
return false;
}
return true;
}
template <class T, class Allocator> bool operator> (const deque<T,Allocator>& x, const deque<T,Allocator>& y);
template <class T, class Allocator> bool operator>=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
template <class T, class Allocator> bool operator<=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
template <class T, class Allocator> _UCXXEXPORT void swap(deque<T,Allocator>& x, deque<T,Allocator>& y){
x.swap(y);
}
}
#pragma GCC visibility pop
#endif

View File

@ -0,0 +1,120 @@
// Exception Handling support header for -*- C++ -*-
// Copyright (C) 1995, 1996, 1997, 1998, 2000, 2001, 2002
// Free Software Foundation
//
// This file is part of GNU CC.
//
// GNU CC is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2, or (at your option)
// any later version.
//
// GNU CC is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with GNU CC; see the file COPYING. If not, write to
// the Free Software Foundation, 59 Temple Place - Suite 330,
// Boston, MA 02111-1307, USA.
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
// the GNU General Public License. This exception does not however
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
/** @file exception
* This header defines several types and functions relating to the
* handling of exceptions in a C++ program.
*/
#ifndef __EXCEPTION__
#define __EXCEPTION__
#include <basic_definitions>
extern "C++" {
namespace std
{
/**
* @brief Base class for all library exceptions.
*
* This is the base class for all exceptions thrown by the standard
* library, and by certain language expressions. You are free to derive
* your own %exception classes, or use a different hierarchy, or to
* throw non-class data (e.g., fundamental types).
*/
class exception
{
public:
exception() throw() { }
virtual ~exception() throw();
/** Returns a C-style character string describing the general cause
* of the current error. */
virtual const char* what() const throw();
};
/** If an %exception is thrown which is not listed in a function's
* %exception specification, one of these may be thrown. */
class bad_exception : public exception
{
public:
bad_exception() throw() { }
// This declaration is not useless:
// http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118
virtual ~bad_exception() throw();
};
/// If you write a replacement %terminate handler, it must be of this type.
typedef void (*terminate_handler) ();
/// If you write a replacement %unexpected handler, it must be of this type.
typedef void (*unexpected_handler) ();
/// Takes a new handler function as an argument, returns the old function.
terminate_handler set_terminate(terminate_handler) throw();
/** The runtime will call this function if %exception handling must be
* abandoned for any reason. */
void terminate() __UCLIBCXX_NORETURN;
/// Takes a new handler function as an argument, returns the old function.
unexpected_handler set_unexpected(unexpected_handler) throw();
/** The runtime will call this function if an %exception is thrown which
* violates the function's %exception specification. */
void unexpected() __UCLIBCXX_NORETURN;
/** [18.6.4]/1: "Returns true after completing evaluation of a
* throw-expression until either completing initialization of the
* exception-declaration in the matching handler or entering @c unexpected()
* due to the throw; or after entering @c terminate() for any reason
* other than an explicit call to @c terminate(). [Note: This includes
* stack unwinding [15.2]. end note]"
*
* 2: "When @c uncaught_exception() is true, throwing an %exception can
* result in a call of @c terminate() (15.5.1)."
*/
bool uncaught_exception() throw();
} // namespace std
namespace __gnu_cxx
{
/** A replacement for the standard terminate_handler which prints more
information about the terminating exception (if any) on stderr. Call
@code
std::set_terminate (__gnu_cxx::__verbose_terminate_handler)
@endcode
to use. For more info, see
http://gcc.gnu.org/onlinedocs/libstdc++/19_diagnostics/howto.html#4
*/
void __verbose_terminate_handler ();
} // namespace __gnu_cxx
} // extern "C++"
#endif

View File

@ -0,0 +1,676 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef __STD_HEADER_FSTREAM
#define __STD_HEADER_FSTREAM 1
#include<basic_definitions>
#include <cstdio>
#include <cstdlib>
#include <streambuf>
#include <istream>
#include <ostream>
#include <char_traits>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#ifdef __UCLIBCXX_HAS_WCHAR__
#include <cwchar>
#include <cwctype>
#endif //__UCLIBCXX_HAS_WCHAR__
#pragma GCC visibility push(default)
namespace std{
template <class C, class T> class basic_filebuf;
typedef basic_filebuf<char> filebuf;
#ifdef __UCLIBCXX_HAS_WCHAR__
typedef basic_filebuf<wchar_t> wfilebuf;
#endif
template <class charT, class traits> class _UCXXEXPORT basic_filebuf
: public basic_streambuf<charT,traits>
{
#ifdef __UCLIBCXX_SUPPORT_CDIR__
friend ios_base::Init::Init(); //Needed for cout/cin stuff
#endif
public:
// Types (inherited from basic_streambuf:
typedef typename basic_streambuf<charT, traits>::char_type char_type;
typedef typename basic_streambuf<charT, traits>::int_type int_type;
typedef typename basic_streambuf<charT, traits>::pos_type pos_type;
typedef typename basic_streambuf<charT, traits>::off_type off_type;
typedef traits traits_type;
//Constructors/destructor:
_UCXXEXPORT basic_filebuf() : basic_streambuf<charT, traits>(), fp(0), pbuffer(0), gbuffer(0)
{
append=false;
pbuffer = new char_type[__UCLIBCXX_IOSTREAM_BUFSIZE__];
gbuffer = new char_type[__UCLIBCXX_IOSTREAM_BUFSIZE__];
this->setp(pbuffer, pbuffer + __UCLIBCXX_IOSTREAM_BUFSIZE__);
//Position get buffer so that there is no data available
this->setg(gbuffer, gbuffer + __UCLIBCXX_IOSTREAM_BUFSIZE__,
gbuffer + __UCLIBCXX_IOSTREAM_BUFSIZE__);
}
_UCXXEXPORT virtual ~basic_filebuf(){
sync();
close();
delete [] pbuffer;
delete [] gbuffer;
pbuffer = 0;
gbuffer = 0;
}
//Members:
_UCXXEXPORT bool is_open() const{
if(fp == 0){
return false;
}
return true;
}
_UCXXEXPORT basic_filebuf<charT,traits>* open(const char* s, ios_base::openmode mode){
bool move_end = (mode & ios_base::ate) != 0;
if(is_open() !=false){ //Must call close() first
return 0;
}
basic_streambuf<charT,traits>::openedFor = mode;
mode = mode & ~ios_base::ate;
if(mode == ios_base::out || mode == (ios_base::out | ios_base::trunc)){
fp = fopen(s, "w" );
}else if((mode & ios_base::app) && ! (mode & ios_base::trunc)){
if(mode & ios_base::binary){
if(mode & ios_base::in){
fp = fopen(s, "a+b");
}else{
fp = fopen(s, "ab");
}
}else{
if(mode & ios_base::in){
fp = fopen(s, "a+");
}else{
fp = fopen(s, "a");
}
}
}else if(mode == ios_base::in){
fp = fopen(s, "r");
}else if(mode == (ios_base::in | ios_base::out)){
fp = fopen(s, "r+");
}else if(mode == (ios_base::in | ios_base::out | ios_base::trunc)){
fp = fopen(s, "w+");
}else if(mode == (ios_base::binary | ios_base::out)){
fp = fopen(s, "wb");
}else if(mode == (ios_base::in | ios_base::binary)){
fp = fopen(s, "rb");
}else if(mode == (ios_base::in | ios_base::binary | ios_base::out)){
fp = fopen(s, "r+b");
}else if(mode==(ios_base::binary | ios_base::out | ios_base::trunc)){
fp = fopen(s, "w+b");
}else if(mode == (ios_base::in | ios_base::binary | ios_base::out | ios_base::trunc)){
fp = fopen(s, "w+b");
}
if(fp == 0){
return 0;
}
if(ferror(fp)){
fclose(fp);
fp=0;
return 0;
}
int retval = 0;
//Check to make sure the stream is good
if(move_end == true){
retval = fseek(fp, 0, SEEK_END);
}else{
retval = fseek(fp, 0, SEEK_SET);
}
if(retval!=0){ //Seek error
fclose(fp);
fp=0;
return 0;
}
basic_streambuf<charT,traits>::mgnext = basic_streambuf<charT,traits>::mgend;
return this;
}
_UCXXEXPORT basic_filebuf<charT,traits>* close(){
if(fp != 0 && fp != stdin && fp != stdout && fp !=stderr ){
overflow();
sync();
int retval = fclose(fp);
if(retval !=0){ //Error of some sort
return 0;
}
fp=0;
}
return this;
}
protected:
_UCXXEXPORT basic_filebuf(const basic_filebuf<charT,traits> &){ }
_UCXXEXPORT basic_filebuf<charT,traits> & operator=(const basic_filebuf<charT,traits> &){ return *this; }
//Overridden virtual functions:
virtual _UCXXEXPORT int showmanyc(){
return basic_streambuf<charT,traits>::egptr() - basic_streambuf<charT,traits>::gptr();
}
virtual _UCXXEXPORT int_type underflow(){
/* Some variables used internally:
Buffer pointers:
charT * mgbeg;
charT * mgnext;
charT * mgend;
eback() returns mgbeg
gptr() returns mgnext
egptr() returns mgend
gbump(int n) mgnext+=n
*/
if(!is_open()){
return traits::eof();
}
if(basic_streambuf<charT,traits>::eback() == 0){
//No buffer, so...
charT c;
int retval;
retval = fread(&c, sizeof(charT), 1, fp);
if(retval == 0 || feof(fp) || ferror(fp) ){
return traits::eof();
}
return traits::to_int_type(c);
}
if(basic_streambuf<charT,traits>::eback() == basic_streambuf<charT,traits>::gptr()){ //Buffer is full
return traits::to_int_type(*basic_streambuf<charT,traits>::gptr());
}
//Shift entire buffer back to the begining
size_t offset = basic_streambuf<charT,traits>::gptr() - basic_streambuf<charT,traits>::eback();
size_t amountData = basic_streambuf<charT,traits>::egptr() - basic_streambuf<charT,traits>::gptr();
for(charT * i = basic_streambuf<charT,traits>::gptr(); i < basic_streambuf<charT,traits>::egptr(); ++i){
*(i-offset) = *i;
}
size_t retval = 0;
//Save operating flags from file descriptor
int fcntl_flags = fcntl(fileno(fp), F_GETFL);
retval = 0;
//Set to non_blocking mode
fcntl(fileno(fp), F_SETFL, fcntl_flags | O_NONBLOCK);
//Fill rest of buffer
retval = fread(basic_streambuf<charT,traits>::egptr() -
basic_streambuf<charT,traits>::gptr() + basic_streambuf<charT,traits>::eback(),
sizeof(charT),
offset,
fp
);
//Clear problems where we didn't read in enough characters
if(EAGAIN == errno){
clearerr(fp);
}
//Restore file descriptor clase
fcntl(fileno(fp), F_SETFL, fcntl_flags);
//Now we are going to make sure that we read in at least one character. The hard way.
if(retval == 0){
fcntl_flags = fcntl(fileno(fp), F_GETFL);
//Set to blocking mode
fcntl(fileno(fp), F_SETFL, fcntl_flags & ~O_NONBLOCK);
retval = fread(basic_streambuf<charT,traits>::egptr() -
basic_streambuf<charT,traits>::gptr() + basic_streambuf<charT,traits>::eback(),
sizeof(charT),
1,
fp
);
//Restore file descriptor clase
fcntl(fileno(fp), F_SETFL, fcntl_flags);
}
if(retval !=offset){ //Slide buffer forward again
for(size_t i = 0; i < amountData + retval; ++i){
*(basic_streambuf<charT,traits>::egptr() - i - 1) =
*(basic_streambuf<charT,traits>::eback() + amountData + retval - i - 1);
}
}
basic_streambuf<charT,traits>::mgnext -= retval;
if( (retval <= 0 && feof(fp)) || ferror(fp) ){
return traits::eof();
}
return traits::to_int_type(*basic_streambuf<charT,traits>::gptr());
}
virtual _UCXXEXPORT int_type uflow(){
bool dobump = (basic_streambuf<charT,traits>::gptr() != 0);
int_type retval = underflow();
if(dobump){
basic_streambuf<charT,traits>::gbump(1);
}
return retval;
}
virtual _UCXXEXPORT int_type pbackfail(int_type c = traits::eof()){
if(is_open() == false ||
basic_streambuf<charT,traits>::gptr() == basic_streambuf<charT,traits>::eback())
{
return traits::eof();
}
if(traits::eq_int_type(c,traits::eof()) == false){
if(traits::eq(traits::to_char_type(c), basic_streambuf<charT,traits>::gptr()[-1]) == true){
basic_streambuf<charT,traits>::gbump(-1);
}else{
basic_streambuf<charT,traits>::gbump(-1);
basic_streambuf<charT,traits>::gptr()[0] = c;
}
return c;
}else{
basic_streambuf<charT,traits>::gbump(-1);
return traits::not_eof(c);
}
}
virtual _UCXXEXPORT int_type overflow(int_type c = traits::eof()){
if(is_open() == false){
//Can't do much
return traits::eof();
}
if(basic_streambuf<charT,traits>::pbase() == 0){ //Unbuffered - elliminate dupe code below
if(fputc(c, fp) == EOF){
return traits::eof();
}
return c;
}
if(basic_streambuf<charT,traits>::pbase() == 0 && traits::eq_int_type(c,traits::eof()) ){
//Nothing to flush
return traits::not_eof(c);
}
size_t r = basic_streambuf<charT,traits>::pptr() - basic_streambuf<charT,traits>::pbase();
if( r == 0 && traits::eq_int_type(c,traits::eof()) ){
return traits::not_eof(c);
}else if (r == 0 ){
if(fputc(c, fp) == EOF){
return traits::eof();
}
return c;
}
size_t totalChars = r;
char_type *buffer = 0;
if(traits::eq_int_type(c,traits::eof())){
buffer = new char_type[r];
}else{
buffer = new char_type[r+1];
buffer[r] = c;
totalChars++;
}
traits::copy(buffer, basic_streambuf<charT,traits>::pbase(), r);
// memcpy(buffer, basic_streambuf<charT,traits>::pbase(), r);
size_t retval = fwrite(buffer, sizeof(charT), totalChars, fp);
if(retval !=totalChars){
if(retval == 0){
delete [] buffer;
return traits::eof();
}
basic_streambuf<charT,traits>::pbump(-retval);
fprintf(stderr, "***** Did not write the full buffer out. Should be: %d, actually: %d\n",
totalChars, retval);
}else{
basic_streambuf<charT,traits>::pbump(-r);
}
delete [] buffer;
return traits::not_eof(c);
}
virtual _UCXXEXPORT basic_streambuf<charT,traits>* setbuf(char_type* s, streamsize n){
if(s == 0 && n == 0){ //Unbuffered
if(pbuffer !=0){
delete [] pbuffer;
}
if(gbuffer !=0){
delete [] gbuffer;
}
pbuffer = 0;
gbuffer = 0;
}else if(basic_streambuf<charT,traits>::gptr() !=0 &&
basic_streambuf<charT,traits>::gptr()==basic_streambuf<charT,traits>::egptr())
{
delete [] pbuffer;
pbuffer = s;
}
return this;
}
virtual _UCXXEXPORT pos_type seekoff(off_type off, ios_base::seekdir way,
ios_base::openmode = ios_base::in | ios_base::out)
{
if(is_open() == false){
return -1;
}
int whence = SEEK_SET; // if(way == basic_ios<charT>::beg)
off_type position = off;
if(way == basic_ios<charT>::cur){
whence = SEEK_CUR;
position -= (basic_streambuf<charT,traits>::egptr() - basic_streambuf<charT,traits>::gptr());
}else if(way == basic_ios<charT>::end){
whence = SEEK_END;
}
sync();
int retval = fseek(
fp,
sizeof(charT)*(position),
whence
);
//Invalidate read buffer
basic_streambuf<charT,traits>::gbump(
basic_streambuf<charT,traits>::egptr() - basic_streambuf<charT,traits>::gptr()
);
if(-1 != retval){
retval = ftell(fp);
}
return retval;
}
virtual _UCXXEXPORT pos_type seekpos(pos_type sp, ios_base::openmode = ios_base::in | ios_base::out){
if(is_open() == false){
return -1;
}
sync();
int retval = fseek(fp,sizeof(charT)* sp, SEEK_SET);
//Invalidate read buffer
basic_streambuf<charT,traits>::gbump(basic_streambuf<charT,traits>::egptr() - basic_streambuf<charT,traits>::gptr());
if(retval > -1){
return sp;
}
return -1;
}
virtual _UCXXEXPORT int sync(){
if(pbuffer !=0){
if(overflow() == traits::eof()){
return -1;
}
}
if(0 != fp && 0 != fflush(fp)){
return -1;
}
return 0;
}
virtual _UCXXEXPORT void imbue(const locale&){
return;
}
virtual _UCXXEXPORT streamsize xsputn(const char_type* s, streamsize n){
if(is_open() == false){
return 0;
}
//Check to see if buffered
//Check to see if we can buffer the data
streamsize buffer_avail = basic_streambuf<charT,traits>::epptr() - basic_streambuf<charT,traits>::pptr();
if(n > buffer_avail){ //Flush buffer and write directly
overflow(); //Flush the buffer
return fwrite(s, sizeof(charT), n, fp);
}
//Add to buffer to be written later
traits::copy(basic_streambuf<charT,traits>::pptr(), s, n);
basic_streambuf<charT,traits>::pbump(n);
return n;
}
FILE * fp;
char_type * pbuffer;
char_type * gbuffer;
bool append;
};
#ifdef __UCLIBCXX_HAS_WCHAR__
template <> _UCXXEXPORT basic_filebuf<wchar_t, char_traits<wchar_t> >::int_type
basic_filebuf<wchar_t, char_traits<wchar_t> >::overflow(int_type c);
template <> _UCXXEXPORT basic_filebuf<wchar_t, char_traits<wchar_t> >::int_type
basic_filebuf<wchar_t, char_traits<wchar_t> >::underflow();
#endif //__UCLIBCXX_HAS_WCHAR__
#ifdef __UCLIBCXX_EXPAND_FSTREAM_CHAR__
#ifndef __UCLIBCXX_COMPILE_FSTREAM__
#ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
template <> _UCXXEXPORT filebuf::basic_filebuf();
template <> _UCXXEXPORT filebuf::~basic_filebuf();
#endif // __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
template <> _UCXXEXPORT filebuf::int_type filebuf::pbackfail(filebuf::int_type c);
template <> _UCXXEXPORT filebuf * filebuf::open(const char* s, ios_base::openmode mode);
template <> _UCXXEXPORT filebuf * filebuf::close();
template <> _UCXXEXPORT filebuf::int_type filebuf::overflow(filebuf::int_type c);
template <> _UCXXEXPORT filebuf::int_type filebuf::underflow ();
template <> _UCXXEXPORT basic_streambuf<char, char_traits<char> > * filebuf::setbuf(char * s, streamsize n);
template <> _UCXXEXPORT streamsize filebuf::xsputn(const char* s, streamsize n);
#endif
#endif
template <class charT, class traits> class _UCXXEXPORT basic_ifstream
: public basic_istream<charT,traits>
{
public:
typedef charT char_type;
typedef typename traits::int_type int_type;
typedef typename traits::pos_type pos_type;
typedef typename traits::off_type off_type;
_UCXXEXPORT basic_ifstream(): basic_ios<charT, traits>(&sb), basic_istream<charT,traits>(&sb){
//Passing the address of sb
}
explicit _UCXXEXPORT basic_ifstream(const char* s, ios_base::openmode mode = ios_base::in)
: basic_ios<charT, traits>(&sb), basic_istream<charT,traits>(&sb)
{
if(sb.open(s, mode) == 0){
basic_ios<charT,traits>::setstate(ios_base::failbit);
}
}
virtual _UCXXEXPORT ~basic_ifstream(){
}
_UCXXEXPORT basic_filebuf<charT,traits>* rdbuf() const{
return (basic_filebuf<charT,traits>*)&sb;
}
_UCXXEXPORT bool is_open() const{
return sb.is_open();
}
_UCXXEXPORT void open(const char* s, ios_base::openmode mode = ios_base::in){
if(sb.open(s, mode) == 0){
basic_ios<charT,traits>::setstate(ios_base::failbit);
}
}
_UCXXEXPORT void close(){
sb.close();
}
private:
basic_filebuf<charT,traits> sb;
};
template <class charT, class traits> class _UCXXEXPORT basic_ofstream
: public basic_ostream<charT,traits>
{
public:
typedef charT char_type;
typedef typename traits::int_type int_type;
typedef typename traits::pos_type pos_type;
typedef typename traits::off_type off_type;
_UCXXEXPORT basic_ofstream() : basic_ios<charT, traits>(&sb), basic_ostream<charT,traits>(&sb){
}
virtual _UCXXEXPORT ~basic_ofstream();
explicit _UCXXEXPORT basic_ofstream(const char* s, ios_base::openmode mode = ios_base::out | ios_base::trunc) :
basic_ios<charT, traits>(&sb), basic_ostream<charT,traits>(&sb)
{
if(sb.open(s, mode | ios_base::out ) == 0){
basic_ios<charT,traits>::setstate(ios_base::failbit);
}
}
_UCXXEXPORT basic_filebuf<charT,traits>* rdbuf() const{
return (basic_filebuf<charT,traits>*)&sb;
}
_UCXXEXPORT bool is_open() const{
return sb.is_open();
}
_UCXXEXPORT void open(const char* s, ios_base::openmode mode = ios_base::out | ios_base::trunc){
if(sb.open(s, mode) == 0){
basic_ios<charT,traits>::setstate(ios_base::failbit);
}
}
_UCXXEXPORT void close(){
sb.close();
}
private:
basic_filebuf<charT,traits> sb;
};
template <class charT, class traits> _UCXXEXPORT basic_ofstream<charT, traits>::~basic_ofstream(){
basic_ostream<charT, traits>::flush();
}
template <class charT, class traits> class _UCXXEXPORT basic_fstream
: public basic_iostream<charT,traits>
{
public:
typedef charT char_type;
typedef typename traits::int_type ins_type;
typedef typename traits::pos_type pos_type;
typedef typename traits::off_type off_type;
_UCXXEXPORT basic_fstream(): basic_ios<charT, traits>(&sb), basic_iostream<charT,traits>(&sb){ }
explicit _UCXXEXPORT basic_fstream(const char* s, ios_base::openmode mode = ios_base::in|ios_base::out):
basic_ios<charT, traits>(&sb), basic_iostream<charT,traits>(&sb)
{
if(sb.open(s, mode) == 0){
basic_ios<charT,traits>::setstate(ios_base::failbit);
}
}
_UCXXEXPORT basic_filebuf<charT,traits>* rdbuf() const{
return (basic_filebuf<charT,traits>*)&sb;
}
_UCXXEXPORT bool is_open() const{
return sb.is_open();
}
_UCXXEXPORT void open(const char* s, ios_base::openmode mode = ios_base::in|ios_base::out){
if(sb.open(s, mode) == 0){
basic_ios<charT,traits>::setstate(ios_base::failbit);
}
}
_UCXXEXPORT void close(){
sb.close();
}
private:
basic_filebuf<charT,traits> sb;
};
#ifdef __UCLIBCXX_EXPAND_FSTREAM_CHAR__
#ifndef __UCLIBCXX_COMPILE_FSTREAM__
#ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
template <> _UCXXEXPORT basic_ofstream<char, char_traits<char> >::basic_ofstream();
template <> _UCXXEXPORT basic_ofstream<char, char_traits<char> >::basic_ofstream(const char* s, ios_base::openmode mode);
template <> _UCXXEXPORT basic_ofstream<char, char_traits<char> >::~basic_ofstream();
template <> _UCXXEXPORT basic_ifstream<char, char_traits<char> >::basic_ifstream();
template <> _UCXXEXPORT basic_ifstream<char, char_traits<char> >::basic_ifstream(const char* s, ios_base::openmode mode);
template <> _UCXXEXPORT basic_ifstream<char, char_traits<char> >::~basic_ifstream();
#endif // __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
#endif
#endif
}
#pragma GCC visibility pop
#endif

View File

@ -0,0 +1,41 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <basic_definitions>
#include <exception>
#ifndef HEADER_IMPLEMENTATION_FUNC_EXCEPTION
#define HEADER_IMPLEMENTATION_FUNC_EXCEPTION
#pragma GCC visibility push(default)
namespace std{
_UCXXEXPORT void __throw_bad_alloc();
_UCXXEXPORT void __throw_out_of_range(const char * message = 0);
_UCXXEXPORT void __throw_overflow_error(const char * message = 0);
_UCXXEXPORT void __throw_length_error(const char * message = 0);
_UCXXEXPORT void __throw_invalid_argument(const char * message = 0);
}
#pragma GCC visibility pop
#endif

View File

@ -0,0 +1,439 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef __STD_HEADER_FUNCTIONAL
#define __STD_HEADER_FUNCTIONAL 1
#include <basic_definitions>
#pragma GCC visibility push(default)
namespace std{
template <class Arg, class Result> struct unary_function;
template <class Arg1, class Arg2, class Result> struct binary_function;
template <class T> struct plus;
template <class T> struct minus;
template <class T> struct multiplies;
template <class T> struct divides;
template <class T> struct modulus;
template <class T> struct negate;
template <class T> struct equal_to;
template <class T> struct not_equal_to;
template <class T> struct greater;
template <class T> struct less;
template <class T> struct greater_equal;
template <class T> struct less_equal;
template <class T> struct logical_and;
template <class T> struct logical_or;
template <class T> struct logical_not;
template <class Predicate> struct unary_negate;
template <class Predicate> unary_negate<Predicate> not1(const Predicate&);
template <class Predicate> struct binary_negate;
template <class Predicate> binary_negate<Predicate> not2(const Predicate&);
template <class Operation> class binder1st;
template <class Operation, class T> binder1st<Operation> bind1st(const Operation&, const T&);
template <class Operation> class binder2nd;
template <class Operation, class T> binder2nd<Operation> bind2nd(const Operation&, const T&);
template <class Arg, class Result> class pointer_to_unary_function;
template <class Arg, class Result> pointer_to_unary_function<Arg,Result> ptr_fun(Result (*)(Arg));
template <class Arg1, class Arg2, class Result> class pointer_to_binary_function;
template <class Arg1, class Arg2, class Result>
pointer_to_binary_function<Arg1,Arg2,Result> ptr_fun(Result (*)(Arg1,Arg2));
template<class S, class T> class mem_fun_t;
template<class S, class T, class A> class mem_fun1_t;
template<class S, class T> class const_mem_fun_t;
template<class S, class T, class A> class const_mem_fun1_t;
template<class S, class T> mem_fun_t<S,T> mem_fun(S (T::*f)());
template<class S, class T, class A> mem_fun1_t<S,T,A> mem_fun(S (T::*f)(A));
template<class S, class T> class mem_fun_ref_t;
template<class S, class T, class A> class mem_fun1_ref_t;
template<class S, class T> mem_fun_ref_t<S,T> mem_fun_ref(S (T::*f)());
template<class S, class T, class A> mem_fun1_ref_t<S,T,A> mem_fun1_ref(S (T::*f)(A));
//Implementation
template <class Arg, class Result> struct _UCXXEXPORT unary_function{
typedef Arg argument_type;
typedef Result result_type;
};
template <class Arg1, class Arg2, class Result> struct _UCXXEXPORT binary_function{
typedef Arg1 first_argument_type;
typedef Arg2 second_argument_type;
typedef Result result_type;
};
template <class T> struct _UCXXEXPORT plus : binary_function<T,T,T>{
T operator()(const T& x, const T& y) const{
return x + y;
}
};
template <class T> struct _UCXXEXPORT minus : binary_function<T,T,T>{
T operator()(const T& x, const T& y) const{
return x - y;
}
};
template <class T> struct _UCXXEXPORT multiplies : binary_function<T,T,T>{
T operator()(const T& x, const T& y) const{
return x * y;
}
};
template <class T> struct _UCXXEXPORT divides : binary_function<T,T,T>{
T operator()(const T& x, const T& y) const{
return x / y;
}
};
template <class T> struct _UCXXEXPORT modulus : binary_function<T,T,T>{
T operator()(const T& x, const T& y) const{
return x % y;
}
};
template <class T> struct _UCXXEXPORT negate : unary_function<T,T>{
T operator()(const T& x) const{
return -x;
}
};
template <class T> struct _UCXXEXPORT equal_to : binary_function<T,T,bool>{
bool operator()(const T& x, const T& y) const{
return (x == y);
}
};
template <class T> struct _UCXXEXPORT not_equal_to : binary_function<T,T,bool>{
bool operator()(const T& x, const T& y) const{
return (x != y);
}
};
template <class T> struct _UCXXEXPORT greater : binary_function<T,T,bool>{
bool operator()(const T& x, const T& y) const{
return (x > y);
}
};
template <class T> struct _UCXXEXPORT less : binary_function<T,T,bool>{
bool operator()(const T& x, const T& y) const{
return (x < y);
}
};
template <class T> struct _UCXXEXPORT greater_equal : binary_function<T,T,bool>{
bool operator()(const T& x, const T& y) const{
return (x >= y);
}
};
template <class T> struct _UCXXEXPORT less_equal : binary_function<T,T,bool>{
bool operator()(const T& x, const T& y) const{
return (x <= y);
}
};
template <class T> struct _UCXXEXPORT logical_and : binary_function<T,T,bool> {
bool operator()(const T& x, const T& y) const{
return (x && y);
}
};
template <class T> struct _UCXXEXPORT logical_or : binary_function<T,T,bool> {
bool operator()(const T& x, const T& y) const{
return (x || y);
}
};
template <class T> struct _UCXXEXPORT logical_not : unary_function<T,bool> {
bool operator()(const T& x) const{
return !x;
}
};
template <class Predicate> class _UCXXEXPORT unary_negate
: public unary_function<typename Predicate::argument_type,bool>
{
public:
explicit unary_negate(const Predicate& pred) : p(pred) { }
bool operator()(const typename Predicate::argument_type& x) const{
return !p(x);
}
private:
Predicate p;
};
template <class Predicate> _UCXXEXPORT unary_negate<Predicate> not1(const Predicate& pred){
return unary_negate<Predicate>(pred);
}
template <class Predicate> class _UCXXEXPORT binary_negate : public
binary_function<typename Predicate::first_argument_type,
typename Predicate::second_argument_type, bool>
{
public:
explicit binary_negate(const Predicate& pred) : p(pred) { }
bool operator()(const typename Predicate::first_argument_type& x,
const typename Predicate::second_argument_type& y) const
{
return !p(x, y);
}
private:
Predicate p;
};
template <class Predicate> _UCXXEXPORT binary_negate<Predicate> not2(const Predicate& pred){
return binary_negate<Predicate>(pred);
}
template <class Operation> class _UCXXEXPORT binder1st
: public unary_function<typename Operation::second_argument_type,
typename Operation::result_type>
{
protected:
Operation op;
typename Operation::first_argument_type value;
public:
binder1st(const Operation& x, const typename Operation::first_argument_type& y) : op(x), value(y){ }
typename Operation::result_type operator()(const typename Operation::second_argument_type& x) const{
return op(value,x);
}
};
template <class Operation, class T> _UCXXEXPORT binder1st<Operation> bind1st(const Operation& op, const T& x){
return binder1st<Operation>(op, typename Operation::first_argument_type(x));
}
template <class Operation> class _UCXXEXPORT binder2nd
: public unary_function<typename Operation::first_argument_type,
typename Operation::result_type>
{
protected:
Operation op;
typename Operation::second_argument_type value;
public:
binder2nd(const Operation& x, const typename Operation::second_argument_type& y) : op(x), value(y) { }
typename Operation::result_type operator()(const typename Operation::first_argument_type& x) const{
return op(x,value);
}
};
template <class Operation, class T> _UCXXEXPORT
binder2nd<Operation> bind2nd(const Operation& op, const T& x)
{
return binder2nd<Operation>(op, typename Operation::second_argument_type(x));
}
template <class Arg, class Result> class _UCXXEXPORT
pointer_to_unary_function : public unary_function<Arg, Result>
{
protected:
Result (*func)(Arg);
public:
explicit pointer_to_unary_function(Result (*f)(Arg)) : func(f) { }
Result operator()(Arg x) const{
return func(x);
}
};
template <class Arg, class Result> _UCXXEXPORT pointer_to_unary_function<Arg, Result> ptr_fun(Result (*f)(Arg)){
return pointer_to_unary_function<Arg, Result>(f);
}
template <class Arg1, class Arg2, class Result> class _UCXXEXPORT
pointer_to_binary_function : public binary_function<Arg1,Arg2,Result>
{
protected:
Result (*func)(Arg1, Arg2);
public:
explicit pointer_to_binary_function(Result (*f)(Arg1, Arg2)) : func(f) { }
Result operator()(Arg1 x, Arg2 y) const{
return func(x, y);
}
};
template <class Arg1, class Arg2, class Result> _UCXXEXPORT
pointer_to_binary_function<Arg1,Arg2,Result> ptr_fun(Result (*f)(Arg1, Arg2))
{
return pointer_to_binary_function<Arg1,Arg2,Result>(f);
}
template <class S, class T> class _UCXXEXPORT mem_fun_t
: public unary_function<T*, S>
{
public:
explicit mem_fun_t(S (T::*p)()) : m(p) { }
S operator()(T* p) const { return (p->*m)(); }
private:
S (T::*m)();
};
template <class S, class T, class A> class _UCXXEXPORT mem_fun1_t
: public binary_function<T*, A, S>
{
public:
explicit mem_fun1_t(S (T::*p)(A)) : m(p) { }
S operator()(T* p, A x) const { return (p->*m)(x); }
private:
S (T::*m)(A);
};
template <class S, class T> class _UCXXEXPORT const_mem_fun_t
: public unary_function<const T*, S>
{
public:
explicit const_mem_fun_t(S (T::*p)() const) : m(p) { }
S operator()(const T* p) const { return (p->*m)(); }
private:
S (T::*m)() const;
};
template <class S, class T, class A> class _UCXXEXPORT const_mem_fun1_t
: public binary_function<T*, A, S>
{
public:
explicit const_mem_fun1_t(S (T::*p)(A) const) : m(p) { }
S operator()(const T* p, A x) const { return (p->*m)(x); }
private:
S (T::*m)(A) const;
};
template<class S, class T> _UCXXEXPORT mem_fun_t<S,T> mem_fun(S (T::*f)()){
return mem_fun_t<S, T>(f);
}
template<class S, class T> _UCXXEXPORT const_mem_fun_t<S,T> mem_fun(S (T::*f)() const){
return const_mem_fun_t<S, T>(f);
}
template<class S, class T, class A> _UCXXEXPORT mem_fun1_t<S,T,A> mem_fun(S (T::*f)(A)){
return mem_fun1_t<S, T, A>(f);
}
template<class S, class T, class A> _UCXXEXPORT const_mem_fun1_t<S,T,A> mem_fun(S (T::*f)(A) const){
return const_mem_fun1_t<S, T, A>(f);
}
template <class S, class T> class _UCXXEXPORT mem_fun_ref_t
: public unary_function<T, S>
{
public:
explicit mem_fun_ref_t(S (T::*p)()) : mf(p) { }
S operator()(T& p) { return (p.*mf)(); }
private:
S (T::*mf)();
};
template <class S, class T, class A> class _UCXXEXPORT mem_fun1_ref_t
: public binary_function<T, A, S>
{
public:
explicit mem_fun1_ref_t(S (T::*p)(A)) : mf(p) { }
S operator()(T& p, A x) { return (p.*mf)(x); }
private:
S (T::*mf)(A);
};
template<class S, class T> _UCXXEXPORT mem_fun_ref_t<S,T> mem_fun_ref(S (T::*f)()){
return mem_fun_ref_t<S,T>(f);
}
template<class S, class T, class A> _UCXXEXPORT mem_fun1_ref_t<S,T,A> mem_fun1_ref(S (T::*f)(A)){
return mem_fun1_ref_t<S,T,A>(f);
}
}
//These are SGI extensions which are checked for by some conformance checks. They
// are *NOT* part of the C++ standard, however
template <class Op1, class Op2> class _UCXXEXPORT unary_compose :
public std::unary_function<typename Op2::argument_type,
typename Op1::result_type>
{
protected:
Op1 mf1;
Op2 mf2;
public:
unary_compose(const Op1& x, const Op2& y) : mf1(x), mf2(y) { }
typename Op1::result_type operator()(const typename Op2::argument_type& x) const {
return mf1(mf2(x));
}
};
template <class Op1, class Op2> _UCXXEXPORT
inline unary_compose<Op1, Op2>
compose1(const Op1& fn1, const Op2& fn2){
return unary_compose<Op1, Op2>(fn1, fn2);
}
template <class Op1, class Op2, class Op3> class _UCXXEXPORT binary_compose :
public std::unary_function<typename Op2::argument_type, typename Op1::result_type>
{
protected:
Op1 mf1;
Op2 mf2;
Op3 mf3;
public:
binary_compose(const Op1 & x, const Op2 & y, const Op3 & z)
: mf1(x), mf2(y), mf3(z){ }
typename Op1::result_type operator()(const typename Op2::argument_type & x) const {
return mf1(mf2(x), mf3(x));
}
};
template <class Op1, class Op2, class Op3> inline _UCXXEXPORT binary_compose<Op1, Op2, Op3>
compose2(const Op1 & fn1, const Op2 & fn2, const Op3 & fn3){
return binary_compose<Op1, Op2, Op3>(fn1, fn2, fn3);
}
#pragma GCC visibility pop
#endif

View File

@ -0,0 +1,170 @@
/* Copyright (C) 2005 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <exception>
#include <ios>
#ifndef __STD_IOMANIP
#define __STD_IOMANIP 1
#pragma GCC visibility push(default)
namespace std{
// These are the helper classes which we are going to be using to
// hold the required data
class _UCXXEXPORT __resetiosflags{
public:
ios_base::fmtflags m;
_UCXXEXPORT __resetiosflags(ios_base::fmtflags mask) : m(mask){ }
};
class _UCXXEXPORT __setiosflags{
public:
ios_base::fmtflags m;
_UCXXEXPORT __setiosflags(ios_base::fmtflags mask) : m(mask){ }
};
class _UCXXEXPORT __setbase{
public:
int base;
_UCXXEXPORT __setbase(int b) : base(b){ }
};
class _UCXXEXPORT __setfill{
public:
int character;
_UCXXEXPORT __setfill(int c): character(c){ }
};
class _UCXXEXPORT __setprecision{
public:
int digits;
_UCXXEXPORT __setprecision(int n): digits(n) { }
};
class _UCXXEXPORT __setw{
public:
int width;
_UCXXEXPORT __setw(int n): width(n) { }
};
//Actual manipulator functions
inline __resetiosflags resetiosflags(ios_base::fmtflags mask){
return __resetiosflags(mask);
}
inline __setiosflags setiosflags(ios_base::fmtflags mask){
return __setiosflags(mask);
}
inline __setbase setbase(int b){
return __setbase(b);
}
inline __setfill setfill(int c){
return __setfill(c);
}
inline __setprecision setprecision(int n){
return __setprecision(n);
}
inline __setw setw(int n){
return __setw(n);
}
//How to handle interaction with [i|o]stream classes
template<class Ch, class Tr> _UCXXEXPORT basic_ostream<Ch, Tr>&
operator<<(basic_ostream<Ch, Tr>& os, const __resetiosflags s)
{
os.setf(ios_base::fmtflags(0),s.m);
return os;
}
template<class Ch, class Tr> _UCXXEXPORT basic_istream<Ch, Tr>&
operator>>(basic_istream<Ch, Tr>& is, const __resetiosflags s)
{
is.setf(ios_base::fmtflags(0),s.m);
return is;
}
template<class Ch, class Tr> _UCXXEXPORT basic_ostream<Ch, Tr>&
operator<<(basic_ostream<Ch, Tr>& os, const __setiosflags s)
{
os.setf(s.m);
return os;
}
template<class Ch, class Tr> _UCXXEXPORT basic_ostream<Ch, Tr>&
operator<<(basic_ostream<Ch, Tr>& os, const __setbase s)
{
ios_base::fmtflags f(0);
switch(s.base){
case 8:
f = ios_base::oct;
break;
case 10:
f = ios_base::dec;
break;
case 16:
f = ios_base::hex;
break;
default:
break;
}
os.setf(f, ios_base::basefield);
return os;
}
template<class Ch, class Tr> _UCXXEXPORT basic_ostream<Ch, Tr>&
operator<<(basic_ostream<Ch, Tr>& os, const __setfill s)
{
os.fill(s.character);
return os;
}
template<class Ch, class Tr> _UCXXEXPORT basic_ostream<Ch, Tr>&
operator<<(basic_ostream<Ch, Tr>& os, const __setprecision s)
{
os.precision(s.digits);
return os;
}
template<class Ch, class Tr> _UCXXEXPORT basic_ostream<Ch, Tr>&
operator<<(basic_ostream<Ch, Tr>& os, const __setw s)
{
os.width(s.width);
return os;
}
}
#pragma GCC visibility pop
#endif

View File

@ -0,0 +1,500 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <basic_definitions>
#include <cstddef>
#include <locale>
#include <iosfwd>
#ifndef __HEADER_STD_IOS
#define __HEADER_STD_IOS 1
#pragma GCC visibility push(default)
namespace std{
typedef signed long int streamoff;
template <class stateT> class fpos;
class _UCXXEXPORT ios_base {
public:
class failure;
#ifdef __UCLIBCXX_EXCEPTION_SUPPORT__
class failure : public exception {
public:
explicit failure(const std::string&) { }
explicit failure() { }
virtual const char* what() const throw() {
return "std::ios_base failure exception";
}
};
#endif
#ifdef __UCLIBCXX_SUPPORT_CDIR__
class _UCXXLOCAL Init{
public:
_UCXXEXPORT Init();
_UCXXEXPORT ~Init();
private:
static int init_cnt;
};
#endif
public:
typedef unsigned short int fmtflags;
static const fmtflags skipws = 0x0001;
static const fmtflags left = 0x0002;
static const fmtflags right = 0x0004;
static const fmtflags internal = 0x0008;
static const fmtflags boolalpha = 0x0010;
static const fmtflags dec = 0x0020;
static const fmtflags oct = 0x0040;
static const fmtflags hex = 0x0080;
static const fmtflags scientific = 0x0100;
static const fmtflags fixed = 0x0200;
static const fmtflags showbase = 0x0400;
static const fmtflags showpoint = 0x0800;
static const fmtflags showpos = 0x1000;
static const fmtflags uppercase = 0x2000;
static const fmtflags adjustfield = left | right | internal;
static const fmtflags basefield = dec | oct | hex;
static const fmtflags floatfield = fixed | scientific;
static const fmtflags unitbuf = 0x4000;
typedef unsigned char iostate;
static const iostate goodbit = 0x00;
static const iostate badbit = 0x01;
static const iostate eofbit = 0x02;
static const iostate failbit = 0x04;
typedef unsigned char openmode;
static const openmode app = 0x01;
static const openmode ate = 0x02;
static const openmode binary = 0x04;
static const openmode in = 0x08;
static const openmode out = 0x10;
static const openmode trunc = 0x20;
typedef unsigned char seekdir;
static const seekdir beg = 0x01;
static const seekdir cur = 0x02;
static const seekdir end = 0x04;
_UCXXEXPORT fmtflags flags() const{
return mformat;
}
_UCXXEXPORT fmtflags flags(fmtflags fmtfl);
fmtflags setf(fmtflags fmtfl);
fmtflags setf(fmtflags fmtfl, fmtflags mask );
_UCXXEXPORT void unsetf(fmtflags mask){
mformat&= ~mask;
}
_UCXXEXPORT streamsize precision() const{
return mprecision;
}
_UCXXEXPORT streamsize precision(streamsize prec);
_UCXXEXPORT streamsize width() const{
return mwidth;
}
_UCXXEXPORT streamsize width(streamsize wide);
_UCXXEXPORT locale imbue(const locale& loc);
_UCXXEXPORT locale getloc() const{
return mLocale;
}
// FIXME - These need to be implemented
// static int xalloc();
// long& iword(int index);
// void*& pword(int index);
_UCXXEXPORT ~ios_base() { }
enum event { erase_event, imbue_event, copyfmt_event };
typedef void (*event_callback)(event, ios_base&, int index);
// void register_callback(event_call_back fn, int index);
//We are going to wrap stdio so we don't need implementation of the following:
inline static bool sync_with_stdio(bool = true) { return true; }
protected:
_UCXXEXPORT ios_base() : mLocale(), mformat(dec | skipws ), mstate(goodbit),
mmode(), mdir(), mprecision(6), mwidth(0)
#ifdef __UCLIBCXX_SUPPORT_CDIR__
,mInit()
#endif
{
}
locale mLocale;
fmtflags mformat;
iostate mstate;
openmode mmode;
seekdir mdir;
streamsize mprecision;
streamsize mwidth;
#ifdef __UCLIBCXX_SUPPORT_CDIR__
Init mInit;
#endif
};
//ios_base manipulators
inline ios_base& boolalpha (ios_base& str){
str.setf(ios_base::boolalpha);
return str;
}
inline ios_base& noboolalpha(ios_base& str){
str.unsetf(ios_base::boolalpha);
return str;
}
inline ios_base& showbase (ios_base& str){
str.setf(ios_base::showbase);
return str;
}
inline ios_base& noshowbase (ios_base& str){
str.unsetf(ios_base::showbase);
return str;
}
inline ios_base& showpoint (ios_base& str){
str.setf(ios_base::showpoint);
return str;
}
inline ios_base& noshowpoint(ios_base& str){
str.unsetf(ios_base::showpoint);
return str;
}
inline ios_base& showpos (ios_base& str){
str.setf(ios_base::showpos);
return str;
}
inline ios_base& noshowpos (ios_base& str){
str.unsetf(ios_base::showpos);
return str;
}
inline ios_base& skipws (ios_base& str){
str.setf(ios_base::skipws);
return str;
}
inline ios_base& noskipws (ios_base& str){
str.unsetf(ios_base::skipws);
return str;
}
inline ios_base& uppercase (ios_base& str){
str.setf(ios_base::uppercase);
return str;
}
inline ios_base& nouppercase(ios_base& str){
str.unsetf(ios_base::uppercase);
return str;
}
inline ios_base& unitbuf (ios_base& str){
str.setf(ios_base::unitbuf);
return str;
}
inline ios_base& nounitbuf (ios_base& str){
str.unsetf(ios_base::unitbuf);
return str;
}
inline ios_base& internal (ios_base& str){
str.setf(ios_base::internal, ios_base::adjustfield);
return str;
}
inline ios_base& left (ios_base& str){
str.setf(ios_base::left, ios_base::adjustfield);
return str;
}
inline ios_base& right (ios_base& str){
str.setf(ios_base::right, ios_base::adjustfield);
return str;
}
inline ios_base& dec (ios_base& str){
str.setf(ios_base::dec, ios_base::basefield);
return str;
}
inline ios_base& hex (ios_base& str){
str.setf(ios_base::hex, ios_base::basefield);
return str;
}
inline ios_base& oct (ios_base& str){
str.setf(ios_base::oct, ios_base::basefield);
return str;
}
inline ios_base& fixed (ios_base& str){
str.setf(ios_base::fixed, ios_base::floatfield);
return str;
}
inline ios_base& scientific (ios_base& str){
str.setf(ios_base::scientific, ios_base::floatfield);
return str;
}
//basic_ios class definition
template <class charT, class traits > class _UCXXEXPORT basic_ios
: public ios_base
{
public:
// Types:
typedef charT char_type;
typedef typename traits::int_type int_type;
typedef typename traits::pos_type pos_type;
typedef typename traits::off_type off_type;
typedef traits traits_type;
_UCXXEXPORT operator void*() const{
if(fail() ){
return 0;
}
return (void *)(1); //Must return a non-NULL pointer (though it can be *any* pointer)
}
_UCXXEXPORT bool operator!() const{
return fail();
}
_UCXXEXPORT iostate rdstate() const{
return mstate;
}
_UCXXEXPORT void clear(iostate state = goodbit){
if(rdbuf()!=0){
mstate = state;
}else{
mstate = state|ios_base::badbit;
}
}
_UCXXEXPORT void setstate(iostate state) {
clear(rdstate() | state);
#ifdef __UCLIBCXX_EXCEPTION_SUPPORT__
if(rdstate() & throw_mask){
throw failure();
}
#endif
}
_UCXXEXPORT bool good() const{
return (rdstate() == 0);
}
_UCXXEXPORT bool eof() const{
if(rdstate() & eofbit){
return true;
}
return false;
}
_UCXXEXPORT bool fail() const{
if( mstate & (failbit | badbit) ){
return true;
}
return false;
}
_UCXXEXPORT bool bad() const{
if(mstate & badbit){
return true;
}
return false;
}
_UCXXEXPORT iostate exceptions() const{
return throw_mask;
}
_UCXXEXPORT void exceptions(iostate except){
throw_mask = except;
}
explicit _UCXXEXPORT basic_ios(basic_streambuf<charT,traits>* sb) : fill_char(' '), mtied(0), mstreambuf(0){
init(sb);
}
basic_ios() : mtied(0), mstreambuf(0){ }
virtual _UCXXEXPORT ~basic_ios(){
}
_UCXXEXPORT basic_ostream<charT,traits>* tie() const{
return mtied;
}
_UCXXEXPORT basic_ostream<charT,traits>* tie(basic_ostream<charT,traits>* tiestr){
basic_ostream<charT,traits>* retval= mtied;
mtied = tiestr;
return retval;
}
_UCXXEXPORT basic_streambuf<charT,traits>* rdbuf() const{
return mstreambuf;
}
_UCXXEXPORT basic_streambuf<charT,traits>* rdbuf(basic_streambuf<charT,traits>* sb){
basic_streambuf<charT,traits>* retval = mstreambuf;
mstreambuf = sb;
return retval;
}
_UCXXEXPORT basic_ios& copyfmt(const basic_ios& rhs);
_UCXXEXPORT char_type fill() const{
return fill_char;
}
_UCXXEXPORT char_type fill(char_type ch){
char_type temp = fill_char;
fill_char = ch;
return temp;
}
_UCXXEXPORT locale imbue(const locale& loc){
return ios_base::imbue(loc);
}
_UCXXEXPORT char narrow(char_type c, char dfault) const;
_UCXXEXPORT char_type widen(char c) const;
protected:
char_type fill_char;
basic_ostream<charT,traits>* mtied;
basic_streambuf<charT,traits>* mstreambuf;
iostate throw_mask;
_UCXXEXPORT basic_ios(const basic_ios<charT,traits> &){ }
_UCXXEXPORT basic_ios<charT,traits> & operator=(const basic_ios<charT,traits> &){ return *this; }
_UCXXEXPORT void init(basic_streambuf<charT,traits>* sb){
ios_base::mformat = skipws|dec;
mstreambuf = sb;
mstate = goodbit;
throw_mask = goodbit;
}
};
#ifdef __UCLIBCXX_EXPAND_IOS_CHAR__
#ifndef __UCLIBCXX_COMPILE_IOS__
template <> _UCXXEXPORT void basic_ios<char, char_traits<char> >::clear(iostate state);
template <> _UCXXEXPORT void basic_ios<char, char_traits<char> >::setstate(iostate state);
#endif
#endif
template <class charT, class traits>
inline char basic_ios<charT, traits>::narrow(char_type c, char dfault) const
{
return dfault;
}
template <>
inline char basic_ios<char, char_traits<char> >::narrow(char_type c, char) const
{
return c;
}
#ifdef __UCLIBCXX_HAS_WCHAR__
template <>
inline char basic_ios<wchar_t, char_traits<wchar_t> >::narrow(char_type c, char dfault) const
{
char retval = wctob (c);
if(retval == EOF){
retval = dfault;
}
return retval;
}
#endif //__UCLIBCXX_HAS_WCHAR__
template <class charT, class traits>
inline typename basic_ios<charT, traits>::char_type
basic_ios<charT, traits>::widen(char c) const
{
return c;
}
template <>
inline basic_ios<char, char_traits<char> >::char_type
basic_ios<char, char_traits<char> >::widen(char c) const
{
return c;
}
#ifdef __UCLIBCXX_HAS_WCHAR__
template <>
inline basic_ios<wchar_t, char_traits<wchar_t> >::char_type
basic_ios<wchar_t, char_traits<wchar_t> >::widen(char c) const
{
return btowc(c);
}
#endif //__UCLIBCXX_HAS_WCHAR__
template <class stateT> class _UCXXEXPORT fpos{
public:
_UCXXEXPORT fpos(stateT s){
st = s;
}
_UCXXEXPORT stateT state() const{
return st;
}
_UCXXEXPORT void state(stateT s){
st = s;
}
_UCXXEXPORT bool operator==(const fpos &rhs){
return st == rhs.st;
}
_UCXXEXPORT bool operator!=(const fpos &rhs){
return st != rhs.st;
}
_UCXXEXPORT fpos & operator+(const streamoff & o){
st += o;
return *this;
}
_UCXXEXPORT fpos & operator-(const streamoff & o){
st -= o;
return *this;
}
_UCXXEXPORT streamoff operator-(const fpos & rhs){
return st - rhs.st;
}
private:
stateT st;
};
}
#pragma GCC visibility pop
#endif

View File

@ -0,0 +1,114 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <basic_definitions>
#include <char_traits>
#include <memory>
#ifndef __HEADER_STD_IOSFWD
#define __HEADER_STD_IOSFWD 1
#pragma GCC visibility push(default)
namespace std {
class ios_base;
template<> class char_traits<char>;
#ifdef __UCLIBCXX_HAS_WCHAR__
template<> class char_traits<wchar_t>;
#endif
template <class charT, class traits = char_traits<charT> > class basic_ios;
template <class charT, class traits = char_traits<charT> > class basic_streambuf;
template <class charT, class traits = char_traits<charT> > class basic_istream;
template <class charT, class traits = char_traits<charT> > class basic_ostream;
template <class charT, class traits = char_traits<charT> > class basic_iostream;
template <class charT, class traits = char_traits<charT>,
class Allocator = allocator<charT> > class basic_stringbuf;
template <class charT, class traits = char_traits<charT>,
class Allocator = allocator<charT> > class basic_istringstream;
template <class charT, class traits = char_traits<charT>,
class Allocator = allocator<charT> > class basic_ostringstream;
template <class charT, class traits = char_traits<charT>,
class Allocator = allocator<charT> > class basic_stringstream;
template <class charT, class traits = char_traits<charT> > class basic_filebuf;
template <class charT, class traits = char_traits<charT> > class basic_ifstream;
template <class charT, class traits = char_traits<charT> > class basic_ofstream;
template <class charT, class traits = char_traits<charT> > class basic_fstream;
template <class charT, class traits = char_traits<charT> > class basic_istreambuf_iterator;
template <class charT, class traits = char_traits<charT> > class basic_ostreambuf_iterator;
typedef basic_ios<char> ios;
#ifdef __UCLIBCXX_HAS_WCHAR__
typedef basic_ios<wchar_t> wios;
#endif
typedef basic_streambuf<char> streambuf;
typedef basic_istream<char> istream;
typedef basic_ostream<char> ostream;
typedef basic_iostream<char> iostream;
typedef basic_stringbuf<char> stringbuf;
typedef basic_istringstream<char> istringstream;
typedef basic_ostringstream<char> ostringstream;
typedef basic_stringstream<char> stringstream;
typedef basic_filebuf<char> filebuf;
typedef basic_ifstream<char> ifstream;
typedef basic_ofstream<char> ofstream;
typedef basic_fstream<char> fstream;
#ifdef __UCLIBCXX_HAS_WCHAR__
typedef basic_streambuf<wchar_t> wstreambuf;
typedef basic_istream<wchar_t> wistream;
typedef basic_ostream<wchar_t> wostream;
typedef basic_iostream<wchar_t> wiostream;
typedef basic_stringbuf<wchar_t> wstringbuf;
typedef basic_istringstream<wchar_t> wistringstream;
typedef basic_ostringstream<wchar_t> wostringstream;
typedef basic_stringstream<wchar_t> wstringstream;
typedef basic_filebuf<wchar_t> wfilebuf;
typedef basic_ifstream<wchar_t> wifstream;
typedef basic_ofstream<wchar_t> wofstream;
typedef basic_fstream<wchar_t> wfstream;
#endif
template <class state> class fpos;
typedef fpos<char_traits<char>::state_type> streampos;
#ifdef __UCLIBCXX_HAS_WCHAR__
typedef fpos<char_traits<wchar_t>::state_type> wstreampos;
#endif
}
#pragma GCC visibility pop
#endif

View File

@ -0,0 +1,101 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <basic_definitions>
#ifndef __HEADER_STD_IOSTREAM
#define __HEADER_STD_IOSTREAM 1
#include <iosfwd>
#include <ios>
#include <istream>
#include <ostream>
#include <fstream>
#include <string_iostream>
#pragma GCC visibility push(default)
namespace std{
#ifdef __UCLIBCXX_SUPPORT_CIN__
extern istream cin;
#endif
#ifdef __UCLIBCXX_SUPPORT_COUT__
extern ostream cout;
#endif
#ifdef __UCLIBCXX_SUPPORT_CERR__
extern ostream cerr;
#endif
#ifdef __UCLIBCXX_SUPPORT_CLOG__
extern ostream clog;
#endif
#ifdef __UCLIBCXX_SUPPORT_WCIN__
extern wistream wcin;
#endif
#ifdef __UCLIBCXX_SUPPORT_WCOUT__
extern wostream wcout;
#endif
#ifdef __UCLIBCXX_SUPPORT_WCERR__
extern wostream wcerr;
#endif
#ifdef __UCLIBCXX_SUPPORT_WCLOG__
extern wostream wclog;
#endif
template <class charT, class traits> class _UCXXEXPORT basic_iostream :
public basic_istream<charT,traits>, public basic_ostream<charT,traits>
{
public:
// constructor/destructor
explicit _UCXXEXPORT basic_iostream(basic_streambuf<charT,traits>* sb);
virtual _UCXXEXPORT ~basic_iostream(); //Below
};
template <class charT, class traits> _UCXXEXPORT
basic_iostream<charT, traits>:: basic_iostream(basic_streambuf<charT,traits>* sb)
: basic_ios<charT, traits>(sb), basic_istream<charT,traits>(sb), basic_ostream<charT,traits>(sb)
{
return;
}
template <class charT, class traits> _UCXXEXPORT basic_iostream<charT, traits>::~basic_iostream(){
return;
}
#ifdef __UCLIBCXX_EXPAND_OSTREAM_CHAR__
#ifdef __UCLIBCXX_EXPAND_ISTREAM_CHAR__
#ifndef __UCLIBCXX_COMPILE_IOSTREAM__
template <> _UCXXEXPORT basic_iostream<char, char_traits<char> >::
basic_iostream(basic_streambuf<char, char_traits<char> >* sb);
template <> _UCXXEXPORT basic_iostream<char, char_traits<char> >::~basic_iostream();
#endif
#endif
#endif
}
#pragma GCC visibility pop
#endif

View File

@ -0,0 +1,599 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc C++ Library. This library is free
software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the
Free Software Foundation; either version 2, or (at your option)
any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this library; see the file COPYING. If not, write to the Free
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
USA.
*/
#include <ios>
#include <cctype>
#include <streambuf>
#include <istream_helpers>
#include <ostream>
#ifndef __STD_HEADER_ISTREAM
#define __STD_HEADER_ISTREAM 1
#pragma GCC visibility push(default)
namespace std{
typedef basic_istream<char> istream;
#ifdef __UCLIBCXX_HAS_WCHAR__
typedef basic_istream<wchar_t> wistream;
#endif
template <class charT, class traits> basic_istream<charT,traits>& ws(basic_istream<charT,traits>& is);
template <class charT, class traits> class _UCXXEXPORT basic_istream :
virtual public basic_ios<charT,traits>
{
public:
typedef charT char_type;
typedef typename traits::int_type int_type;
typedef typename traits::pos_type pos_type;
typedef typename traits::off_type off_type;
typedef basic_streambuf<charT,traits> streambuf_type;
typedef traits traits_type;
explicit basic_istream(basic_streambuf<charT,traits>* sb)
: basic_ios<charT, traits>(sb), count_last_ufmt_input(0)
{
basic_ios<charT, traits>::init(sb);
}
virtual ~basic_istream() { }
class sentry;
basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>& (*pf)(basic_istream<charT,traits>&));
basic_istream<charT,traits>& operator>>(basic_ios<charT,traits>& (*pf)(basic_ios<charT,traits>&));
basic_istream<charT,traits>& operator>>(ios_base& (*pf)(ios_base&));
basic_istream<charT,traits>& operator>>(bool& n);
basic_istream<charT,traits>& operator>>(short& n);
basic_istream<charT,traits>& operator>>(unsigned short& n);
basic_istream<charT,traits>& operator>>(int& n);
basic_istream<charT,traits>& operator>>(unsigned int& n);
basic_istream<charT,traits>& operator>>(long& n);
basic_istream<charT,traits>& operator>>(unsigned long& n);
basic_istream<charT,traits>& operator>>(void*& p);
basic_istream<charT,traits>& operator>>(basic_streambuf<char_type,traits>* sb);
#ifdef __UCLIBCXX_HAS_FLOATS__
basic_istream<charT,traits>& operator>>(float& f);
basic_istream<charT,traits>& operator>>(double& f);
basic_istream<charT,traits>& operator>>(long double& f);
#endif
_UCXXEXPORT streamsize gcount() const{
return count_last_ufmt_input;
}
_UCXXEXPORT int_type get(); //below
_UCXXEXPORT basic_istream<charT,traits>& get(char_type& c); //Below
_UCXXEXPORT basic_istream<charT,traits>& get(char_type* s, streamsize n){
return get(s, n, basic_ios<charT,traits>::widen('\n'));
}
_UCXXEXPORT basic_istream<charT,traits>& get(char_type* s, streamsize n, char_type delim){
sentry(*this, true);
streamsize i = 0;
int_type c;
for(i=0;i<n-1;++i){
c = basic_ios<charT, traits>::mstreambuf->sgetc();
basic_ios<charT, traits>::mstreambuf->sbumpc();
if(c == traits::eof() ){
if(i==0){
basic_ios<charT,traits>::setstate(ios_base::failbit);
}else{
basic_ios<charT,traits>::setstate(ios_base::eofbit);
}
break;
}
if(c == delim){
if(i==0){
basic_ios<charT,traits>::setstate(ios_base::failbit);
}
basic_ios<charT, traits>::mstreambuf->sputbackc(c);
break;
}
s[i] = c;
}
s[i] = traits::eos();
count_last_ufmt_input = i;
return *this;
}
_UCXXEXPORT basic_istream<charT,traits>& get(basic_streambuf<char_type,traits>& sb){
return get(sb, basic_ios<charT,traits>::widen('\n'));
}
_UCXXEXPORT basic_istream<charT,traits>& get(basic_streambuf<char_type,traits>& sb, char_type delim){
sentry(*this, true);
streamsize i = 0;
int_type c;
while(1){ //We will exit internally based upon error conditions
c = basic_ios<charT, traits>::mstreambuf->sgetc();
if(c == traits::eof()){
if(i==0){
basic_ios<charT,traits>::setstate(ios_base::failbit);
}else{
basic_ios<charT,traits>::setstate(ios_base::eofbit);
}
count_last_ufmt_input = i;
return *this;
}
if(c == delim){
if(i==0){
basic_ios<charT,traits>::setstate(ios_base::failbit);
}
count_last_ufmt_input = i;
return *this;
}
if(sb.sputc(c) != c){ //Error doing output
count_last_ufmt_input = i;
return *this;
}
++i;
basic_ios<charT, traits>::mstreambuf->sbumpc();
}
}
_UCXXEXPORT basic_istream<charT,traits>& getline(char_type* s, streamsize n){
return getline(s, n, basic_ios<charT,traits>::widen('\n'));
}
_UCXXEXPORT basic_istream<charT,traits>& getline(char_type* s, streamsize n, char_type delim){
sentry(*this, true);
streamsize i = 0;
int_type c;
for(i=0;i<n-1;++i){
c = basic_ios<charT, traits>::mstreambuf->sgetc();
if(c == traits::eof() ){
if( basic_ios<charT,traits>::eof() ){
basic_ios<charT,traits>::setstate(ios_base::failbit);
}else{
basic_ios<charT,traits>::setstate(ios_base::eofbit);
}
count_last_ufmt_input = i;
s[i] = traits::eos();
return *this;
}
if(basic_ios<charT, traits>::mstreambuf->sbumpc()==traits::eof() ){
basic_ios<charT,traits>::setstate(ios_base::eofbit);
}
if(c == delim){
count_last_ufmt_input = i+1;
s[i] = traits::eos();
return *this;
}
s[i] = c;
}
s[n-1] = traits::eos();
return *this;
}
_UCXXEXPORT basic_istream<charT,traits>& ignore (streamsize n = 1, int_type delim = traits::eof()){
sentry(*this, true);
streamsize i;
int_type c;
for(i=0;i<n;++i){
c = basic_ios<charT, traits>::mstreambuf->sgetc();
if(c == traits::eof()){
basic_ios<charT,traits>::setstate(ios_base::eofbit);
return *this;
}
basic_ios<charT, traits>::mstreambuf->sbumpc();
if(c == delim){
return *this;
}
}
return *this;
}
_UCXXEXPORT int_type peek(){
if(basic_ios<charT,traits>::good() == false){
return traits::eof();
}else{
int_type c = basic_ios<charT, traits>::mstreambuf->sgetc();
if(c == traits::eof()){
basic_ios<charT,traits>::setstate(ios_base::eofbit);
}
return basic_ios<charT, traits>::mstreambuf->sgetc();
}
}
_UCXXEXPORT basic_istream<charT,traits>& read (char_type* s, streamsize n){
sentry(*this, true);
streamsize i;
int_type c;
for(i=0;i<n;++i){
c = basic_ios<charT, traits>::mstreambuf->sgetc();
if(c == traits::eof()){
basic_ios<charT,traits>::setstate(ios_base::failbit);
basic_ios<charT,traits>::setstate(ios_base::eofbit);
count_last_ufmt_input = i;
return *this;
}
basic_ios<charT, traits>::mstreambuf->sbumpc();
s[i] = c;
}
count_last_ufmt_input = n;
return *this;
}
_UCXXEXPORT streamsize readsome(char_type* s, streamsize n){
sentry(*this, true);
if(!basic_ios<charT,traits>::good()){
count_last_ufmt_input = 0;
basic_ios<charT,traits>::setstate(ios_base::failbit);
return 0;
}
if( basic_ios<charT, traits>::mstreambuf->in_avail() == -1){
count_last_ufmt_input=0;
basic_ios<charT,traits>::setstate(ios_base::eofbit);
return 0;
}
if(n > basic_ios<charT, traits>::mstreambuf->in_avail() ){
n = basic_ios<charT, traits>::mstreambuf->in_avail();
}
streamsize i;
int_type c;
for(i=0;i<n;++i){
c = basic_ios<charT, traits>::mstreambuf->sgetc();
basic_ios<charT, traits>::mstreambuf->sbumpc();
s[i] = c;
}
count_last_ufmt_input = n;
return n;
}
_UCXXEXPORT basic_istream<charT,traits>& putback(char_type c){
sentry(*this, true);
if(!basic_ios<charT,traits>::good()){
basic_ios<charT,traits>::setstate(ios_base::failbit);
return *this;
}
if(basic_ios<charT, traits>::mstreambuf == 0){
basic_ios<charT,traits>::setstate(ios_base::badbit);
return *this;
}
if(basic_ios<charT, traits>::mstreambuf->sputbackc(c) == traits::eof()){
basic_ios<charT,traits>::setstate(ios_base::badbit);
return *this;
}
return *this;
}
_UCXXEXPORT basic_istream<charT,traits>& unget(){
sentry(*this, true);
if(!basic_ios<charT,traits>::good()){
basic_ios<charT,traits>::setstate(ios_base::failbit);
return *this;
}
if(basic_ios<charT, traits>::mstreambuf == 0){
basic_ios<charT,traits>::setstate(ios_base::failbit);
return *this;
}
if(basic_ios<charT, traits>::mstreambuf->sungetc() == traits::eof()){
basic_ios<charT,traits>::setstate(ios_base::failbit);
}
return *this;
}
_UCXXEXPORT int sync(){
sentry(*this, true);
if(basic_ios<charT, traits>::mstreambuf == 0){
return -1;
}
if(basic_ios<charT, traits>::mstreambuf->pubsync() == -1){
basic_ios<charT,traits>::setstate(ios_base::badbit);
return traits::eof();
}
return 0;
}
_UCXXEXPORT pos_type tellg(){
if(basic_ios<charT,traits>::fail() !=false){
return pos_type(-1);
}
return basic_ios<charT, traits>::mstreambuf->pubseekoff(0, ios_base::cur, ios_base::in);
}
_UCXXEXPORT basic_istream<charT,traits>& seekg(pos_type pos){
if(basic_ios<charT,traits>::fail() !=true){
basic_ios<charT, traits>::mstreambuf->pubseekpos(pos);
}
return *this;
}
_UCXXEXPORT basic_istream<charT,traits>& seekg(off_type off, ios_base::seekdir dir){
if(basic_ios<charT,traits>::fail() !=true){
basic_ios<charT, traits>::mstreambuf->pubseekoff(off, dir);
}
return *this;
}
protected:
_UCXXEXPORT basic_istream(const basic_istream<charT,traits> &): basic_ios<charT, traits>() { }
_UCXXEXPORT basic_istream<charT,traits> & operator=(const basic_istream<charT,traits> &){ return *this; }
streamsize count_last_ufmt_input;
};
template <class charT,class traits = char_traits<charT> > class _UCXXEXPORT basic_istream<charT,traits>::sentry {
bool ok;
public:
explicit _UCXXEXPORT sentry(basic_istream<charT,traits>& os, bool noskipws = false){
if(os.good() !=0){ //Prepare for output
}
//Flush any tied buffer
if(os.tie() != 0){
os.tie()->flush();
}
if(!noskipws){
__skipws(os);
}
ok = true;
}
_UCXXEXPORT ~sentry() { }
_UCXXEXPORT operator bool() {
return ok;
}
};
//Template implementations of basic_istream functions which may be partially specialized
//For code reduction
template <class charT, class traits>
_UCXXEXPORT typename basic_istream<charT,traits>::int_type basic_istream<charT,traits>::get(){
sentry(*this, true);
int_type retval = basic_ios<charT, traits>::mstreambuf->sgetc();
if(retval == traits::eof()){
count_last_ufmt_input = 0;
basic_ios<charT,traits>::setstate(ios_base::eofbit);
}else{
count_last_ufmt_input = 1;
basic_ios<charT, traits>::mstreambuf->sbumpc();
}
return retval;
}
template <class charT, class traits>
_UCXXEXPORT basic_istream<charT,traits>& basic_istream<charT,traits>::get(char_type& c){
sentry(*this, true);
int_type retval = basic_ios<charT, traits>::mstreambuf->sgetc();
if(retval == traits::eof()){
count_last_ufmt_input = 0;
basic_ios<charT,traits>::setstate(ios_base::eofbit);
basic_ios<charT,traits>::setstate(ios_base::failbit);
}else{
count_last_ufmt_input = 1;
c = traits::to_char_type(retval);
basic_ios<charT, traits>::mstreambuf->sbumpc();
}
return *this;
}
template <class charT, class traits> _UCXXEXPORT basic_istream<charT,traits>&
basic_istream<charT,traits>::operator>>(bool& n)
{
sentry(*this);
__istream_readin<traits, charT, bool>::readin(*this, n);
return *this;
}
template <class charT, class traits> _UCXXEXPORT basic_istream<charT,traits>&
basic_istream<charT,traits>::operator>>(short& n)
{
sentry(*this);
__istream_readin<traits, charT, short>::readin(*this, n);
return *this;
}
template <class charT, class traits> _UCXXEXPORT basic_istream<charT,traits>&
basic_istream<charT,traits>::operator>>(unsigned short& n)
{
sentry(*this);
__istream_readin<traits, charT, unsigned short>::readin(*this, n);
return *this;
}
template <class charT, class traits> _UCXXEXPORT basic_istream<charT,traits>& basic_istream<charT,traits>::operator>>(int& n){
sentry(*this);
__istream_readin<traits, charT, int>::readin(*this, n);
return *this;
}
template <class charT, class traits> _UCXXEXPORT basic_istream<charT,traits>& basic_istream<charT,traits>::operator>>(unsigned int& n){
sentry(*this);
__istream_readin<traits, charT, unsigned int>::readin(*this, n);
return *this;
}
template <class charT, class traits> _UCXXEXPORT basic_istream<charT,traits>& basic_istream<charT,traits>::operator>>(long int& n){
sentry(*this);
__istream_readin<traits, charT, long int>::readin(*this, n);
return *this;
}
template <class charT, class traits> _UCXXEXPORT basic_istream<charT,traits>&
basic_istream<charT,traits>::operator>>(unsigned long int& n)
{
sentry(*this);
__istream_readin<traits, charT, unsigned long int>::readin(*this, n);
return *this;
}
#ifdef __UCLIBCXX_HAS_FLOATS__
template <class charT, class traits> _UCXXEXPORT basic_istream<charT,traits>&
basic_istream<charT,traits>::operator>>(float& n)
{
sentry(*this);
__istream_readin<traits, charT, float>::readin(*this, n);
return *this;
}
template <class charT, class traits> _UCXXEXPORT basic_istream<charT,traits>&
basic_istream<charT,traits>::operator>>(double& n)
{
sentry(*this);
__istream_readin<traits, charT, double>::readin(*this, n);
return *this;
}
template <class charT, class traits> _UCXXEXPORT basic_istream<charT,traits>&
basic_istream<charT,traits>::operator>>(long double& n)
{
sentry(*this);
__istream_readin<traits, charT, long double>::readin(*this, n);
return *this;
}
#endif
template <class charT, class traits> _UCXXEXPORT basic_istream<charT,traits>&
basic_istream<charT,traits>::operator>>(void *& n)
{
sentry(*this);
__istream_readin<traits, charT, void*>::readin(*this, n);
return *this;
}
template<class charT, class traits> _UCXXEXPORT basic_istream<charT,traits>&
operator>>(basic_istream<charT,traits>& is, charT& c)
{
typename basic_istream<charT,traits>::sentry s(is);
is.get(c);
return is;
}
template<class traits> _UCXXEXPORT basic_istream<char,traits>&
operator>>(basic_istream<char,traits>& is, unsigned char& c)
{
typename basic_istream<char,traits>::sentry s(is);
char b;
is.get(b);
c = b;
return is;
}
template<class traits> _UCXXEXPORT basic_istream<char,traits>&
operator>>(basic_istream<char,traits>& is, signed char& c)
{
typename basic_istream<char,traits>::sentry s(is);
is.get(c);
return is;
}
template<class charT, class traits> _UCXXEXPORT basic_istream<charT,traits>&
operator>>(basic_istream<charT,traits>& is, charT* c)
{
typename basic_istream<charT,traits>::sentry s(is);
int n = is.width();
if(n == 0){
n = __STRING_MAX_UNITS;
}
is.get(c, n);
return is;
}
template<class traits> _UCXXEXPORT basic_istream<char,traits>&
operator>>(basic_istream<char,traits>& is, unsigned char* c)
{
typename basic_istream<char,traits>::sentry s(is);
int n = is.width();
if(n == 0){
n = __STRING_MAX_UNITS;
}
is.get(c, n);
return is;
}
template<class traits> _UCXXEXPORT basic_istream<char,traits>&
operator>>(basic_istream<char,traits>& is, signed char* c)
{
typename basic_istream<char,traits>::sentry s(is);
int n = is.width();
if(n == 0){
n = __STRING_MAX_UNITS;
}
is.get(c, n);
return is;
}
template <class charT, class traits> _UCXXEXPORT basic_istream<charT,traits>&
basic_istream<charT,traits>::operator>>(basic_istream<charT,traits>& (*pf)(basic_istream<charT,traits>&))
{
sentry(*this);
pf(*this);
return *this;
}
template <class charT, class traits> _UCXXEXPORT basic_istream<charT,traits>&
basic_istream<charT,traits>::operator>>(basic_ios<charT,traits>& (*pf)(basic_ios<charT,traits>&))
{
sentry(*this);
pf(*this);
return *this;
}
template <class charT, class traits> _UCXXEXPORT basic_istream<charT,traits>&
ws(basic_istream<charT,traits>& is)
{
__skipws(is);
return is;
}
#ifdef __UCLIBCXX_EXPAND_ISTREAM_CHAR__
#ifndef __UCLIBCXX_COMPILE_ISTREAM__
template <> _UCXXEXPORT istream & basic_istream<char, char_traits<char> >::get(char & c);
template <> _UCXXEXPORT istream::int_type basic_istream<char, char_traits<char> >::get();
template <> _UCXXEXPORT istream & istream::operator>>(bool &n);
template <> _UCXXEXPORT istream & istream::operator>>(short &n);
template <> _UCXXEXPORT istream & istream::operator>>(unsigned short &n);
template <> _UCXXEXPORT istream & istream::operator>>(int &n);
template <> _UCXXEXPORT istream & istream::operator>>(unsigned int &n);
template <> _UCXXEXPORT istream & istream::operator>>(long unsigned &n);
template <> _UCXXEXPORT istream & istream::operator>>(long int &n);
template <> _UCXXEXPORT istream & istream::operator>>(void *& p);
#ifdef __UCLIBCXX_HAS_FLOATS__
template <> _UCXXEXPORT istream & istream::operator>>(float &f);
template <> _UCXXEXPORT istream & istream::operator>>(double &f);
template <> _UCXXEXPORT istream & istream::operator>>(long double &f);
#endif
template <> _UCXXEXPORT istream & operator>>(istream & is, char & c);
template <> _UCXXEXPORT void __skipws(basic_istream<char,char_traits<char> >& is);
#endif
#endif
}
#pragma GCC visibility pop
#endif

View File

@ -0,0 +1,374 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <ios>
#include <cctype>
#include <ctype.h>
#include <string>
#ifndef __STD_HEADER_ISTREAM_HELPERS
#define __STD_HEADER_ISTREAM_HELPERS 1
#pragma GCC visibility push(default)
namespace std{
/* We are making the following template class for serveral reasons. Firstly,
* we want to keep the main istream code neat and tidy. Secondly, we want it
* to be easy to do partial specialization of the istream code so that it can
* be expanded and put into the library. This will allow us to make application
* code smaller at the expense of increased library size. This is a fair
* trade-off when there are multiple applications being compiled. Also, this
* feature will be used optionally via configuration options. It will also
* allow us to keep the code bases in sync, dramatically simplifying the
* maintenance required. We specialized for char because wchar and others
* require different scanf functions
*/
template <class C, class traits> _UCXXEXPORT
basic_string<C, traits> _readToken(basic_istream<C, traits>& stream)
{
basic_string<C, traits> temp;
typename traits::int_type c;
while(true){
c = stream.rdbuf()->sgetc();
if(c != traits::eof() && isspace(c) == false){
stream.rdbuf()->sbumpc();
temp.append(1, traits::to_char_type(c));
}else{
break;
}
}
if (temp.size() == 0)
stream.setstate(ios_base::eofbit|ios_base::failbit);
return temp;
}
template <class C, class traits> _UCXXEXPORT
basic_string<C, traits> _readTokenDecimal(basic_istream<C, traits>& stream)
{
basic_string<C, traits> temp;
typename traits::int_type c;
while(true){
c = stream.rdbuf()->sgetc();
if(c != traits::eof() && isspace(c) == false && (
isdigit(c) ||
c == '.' ||
c == ',' ||
((c == '-' || c == '+') && temp.size() == 0) )
){
stream.rdbuf()->sbumpc();
temp.append(1, traits::to_char_type(c));
}else{
break;
}
}
if (temp.size() == 0)
stream.setstate(ios_base::eofbit|ios_base::failbit);
return temp;
}
#ifdef __UCLIBCXX_EXPAND_ISTREAM_CHAR__
template <> _UCXXEXPORT string _readToken<char, char_traits<char> >(istream & stream);
#endif
template <class traits, class charT, class dataType> class _UCXXEXPORT __istream_readin{
public:
static void readin(basic_istream<charT,traits>& stream, dataType & var);
};
template <class traits> class _UCXXEXPORT __istream_readin<traits, char, bool>{
public:
inline static void readin(basic_istream<char, traits >& stream, bool & var)
{
/* 22.4.2.1.2.4 */
basic_string<char, traits > temp;
temp = _readToken( stream);
if (stream.flags() & ios_base::boolalpha) {
if (temp == "true") // truename()
var = true;
else {
var = false;
if (temp != "false") // falsename()
stream.setstate(ios_base::failbit);
}
} else {
long int i = 0;
int ret;
if (stream.flags() & ios_base::dec) {
ret = sscanf(temp.c_str(), "%ld", &i );
} else {
if (stream.flags() & ios_base::oct) {
ret = sscanf(temp.c_str(), "%lo", (unsigned long int *)(&i));
} else if (stream.flags() & ios_base::hex) {
if (stream.flags() & ios_base::uppercase) {
ret = sscanf(temp.c_str(), "%lX", (unsigned long int *)(&i));
} else {
ret = sscanf(temp.c_str(), "%lx", (unsigned long int *)(&i));
}
} else {
ret = sscanf(temp.c_str(), "%li", &i);
}
}
if (ret != 1 || i >> 1)
stream.setstate(ios_base::failbit);
var = ret == 1 && bool(i);
}
}
};
template <class traits> class _UCXXEXPORT __istream_readin<traits, char, short>{
public:
inline static void readin(basic_istream<char, traits >& stream, short & var)
{
basic_string<char, traits > temp;
if(stream.flags() & ios_base::dec){
temp = _readTokenDecimal( stream);
sscanf(temp.c_str(), "%hd", &var );
}else{
temp = _readToken( stream);
if( stream.flags() & ios_base::oct){
sscanf(temp.c_str(), "%ho", (unsigned short int *)(&var) );
}else if(stream.flags() & ios_base::hex){
if(stream.flags() & ios_base::uppercase){
sscanf(temp.c_str(), "%hX", (unsigned short int *)(&var) );
}else{
sscanf(temp.c_str(), "%hx", (unsigned short int *)(&var) );
}
}else{
sscanf(temp.c_str(), "%hi", &var);
}
}
}
};
template <class traits> class _UCXXEXPORT __istream_readin<traits, char, unsigned short>{
public:
inline static void readin(basic_istream<char, traits >& stream, unsigned short & var)
{
basic_string<char, traits > temp;
if(stream.flags() & ios_base::dec){
temp = _readTokenDecimal( stream);
sscanf(temp.c_str(), "%hu", &var );
}else{
temp = _readToken( stream);
if( stream.flags() & ios_base::oct){
sscanf(temp.c_str(), "%ho", &var);
}else if(stream.flags() & ios_base::hex){
if(stream.flags() & ios_base::uppercase){
sscanf(temp.c_str(), "%hX", &var );
}else{
sscanf(temp.c_str(), "%hx", &var);
}
}else{
sscanf(temp.c_str(), "%hi", (signed short int*)(&var) );
}
}
}
};
template <class traits> class _UCXXEXPORT __istream_readin<traits, char, int>{
public:
inline static void readin(basic_istream<char, traits >& stream, int & var)
{
basic_string<char, traits > temp;
if(stream.flags() & ios_base::dec){
temp = _readTokenDecimal( stream);
sscanf(temp.c_str(), "%d", &var );
}else{
temp = _readToken( stream);
if( stream.flags() & ios_base::oct){
sscanf(temp.c_str(), "%o", (unsigned int *)(&var) );
}else if(stream.flags() & ios_base::hex){
if(stream.flags() & ios_base::uppercase){
sscanf(temp.c_str(), "%X", (unsigned int *)(&var) );
}else{
sscanf(temp.c_str(), "%x", (unsigned int *)(&var) );
}
}else{
sscanf(temp.c_str(), "%i", &var);
}
}
}
};
template <class traits> class _UCXXEXPORT __istream_readin<traits, char, unsigned int>{
public:
inline static void readin(basic_istream<char, traits >& stream, unsigned int & var)
{
basic_string<char, traits > temp;
if(stream.flags() & ios_base::dec){
temp = _readTokenDecimal( stream);
sscanf(temp.c_str(), "%u", &var );
}else{
temp = _readToken( stream);
if( stream.flags() & ios_base::oct){
sscanf(temp.c_str(), "%o", (unsigned int *)(&var) );
}else if(stream.flags() & ios_base::hex){
if(stream.flags() & ios_base::uppercase){
sscanf(temp.c_str(), "%X", (unsigned int *)(&var) );
}else{
sscanf(temp.c_str(), "%x", (unsigned int *)(&var) );
}
}else{
sscanf(temp.c_str(), "%i", (int *)(&var) );
}
}
}
};
template <class traits> class _UCXXEXPORT __istream_readin<traits, char, long int>{
public:
inline static void readin(basic_istream<char, traits >& stream, long int & var)
{
basic_string<char, traits > temp;
if(stream.flags() & ios_base::dec){
temp = _readTokenDecimal( stream);
sscanf(temp.c_str(), "%ld", &var );
}else{
temp = _readToken( stream);
if( stream.flags() & ios_base::oct){
sscanf(temp.c_str(), "%lo", (unsigned long int *)(&var) );
}else if(stream.flags() & ios_base::hex){
if(stream.flags() & ios_base::uppercase){
sscanf(temp.c_str(), "%lX", (unsigned long int *)(&var) );
}else{
sscanf(temp.c_str(), "%lx", (unsigned long int *)(&var) );
}
}else{
sscanf(temp.c_str(), "%li", (long int *)(&var) );
}
}
}
};
template <class traits> class _UCXXEXPORT __istream_readin<traits, char, unsigned long int>{
public:
inline static void readin(basic_istream<char, traits >& stream, unsigned long int & var)
{
basic_string<char, traits > temp;
if(stream.flags() & ios_base::dec){
temp = _readTokenDecimal( stream);
sscanf(temp.c_str(), "%lu", &var );
}else{
temp = _readToken( stream);
if( stream.flags() & ios_base::oct){
sscanf(temp.c_str(), "%lo", &var );
}else if(stream.flags() & ios_base::hex){
if(stream.flags() & ios_base::uppercase){
sscanf(temp.c_str(), "%lX", &var );
}else{
sscanf(temp.c_str(), "%lx", &var);
}
}else{
sscanf(temp.c_str(), "%li", (long int *)(&var) );
}
}
}
};
#ifdef __UCLIBCXX_HAS_FLOATS__
template <class traits> class _UCXXEXPORT __istream_readin<traits, char, float>{
public:
inline static void readin(basic_istream<char, traits >& stream, float & var)
{
basic_string<char, traits > temp;
temp = _readTokenDecimal( stream);
sscanf(temp.c_str(), "%g", &var);
}
};
template <class traits> class _UCXXEXPORT __istream_readin<traits, char, double>{
public:
inline static void readin(basic_istream<char, traits >& stream, double & var)
{
basic_string<char, traits > temp;
temp = _readTokenDecimal( stream);
sscanf(temp.c_str(), "%lg", &var);
}
};
template <class traits> class _UCXXEXPORT __istream_readin<traits, char, long double>{
public:
inline static void readin(basic_istream<char, traits >& stream, long double & var)
{
basic_string<char, traits > temp;
temp = _readTokenDecimal( stream);
sscanf(temp.c_str(), "%Lg", &var);
}
};
#endif // ifdef __UCLIBCXX_HAS_FLOATS__
template <class traits> class _UCXXEXPORT __istream_readin<traits, char, void*>{
public:
inline static void readin(basic_istream<char, traits >& stream, void* & var)
{
basic_string<char, traits > temp;
temp = _readToken( stream);
sscanf(temp.c_str(), "%p", &var);
}
};
template<class charT, class traits> void __skipws(basic_istream<charT,traits>& is){
const typename basic_istream<charT,traits>::int_type eof = traits::eof();
typename basic_istream<charT,traits>::int_type c;
//While the next character normally read doesn't equal eof
//and that character is a space, advance to the next read position
//Thus itterating through all whitespace until we get to the meaty stuff
while (
!traits::eq_int_type((c = is.rdbuf()->sgetc()), eof)
&& isspace(c)
) {
is.rdbuf()->sbumpc();
}
if(traits::eq_int_type(c, eof)){
is.setstate(ios_base::eofbit);
}
}
}
#pragma GCC visibility pop
#endif

View File

@ -0,0 +1,229 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <basic_definitions>
#include <iosfwd>
#include <cstddef>
#include <char_traits>
#include <iterator_base>
#ifndef __STD_HEADER_ITERATOR
#define __STD_HEADER_ITERATOR 1
#pragma GCC visibility push(default)
namespace std{
// subclause _lib.stream.iterators_, stream iterators:
template <class T, class charT = char, class traits = char_traits<charT>, class Distance = ptrdiff_t> class istream_iterator;
template <class T, class charT, class traits, class Distance> bool
operator==(const istream_iterator<T,charT,traits,Distance>& x, const istream_iterator<T,charT,traits,Distance>& y);
template <class T, class charT, class traits, class Distance> bool
operator!=(const istream_iterator<T,charT,traits,Distance>& x, const istream_iterator<T,charT,traits,Distance>& y);
template <class T, class charT = char, class traits = char_traits<charT> > class ostream_iterator;
template<class charT, class traits = char_traits<charT> > class istreambuf_iterator;
template <class charT, class traits> bool
operator==(const istreambuf_iterator<charT,traits>& a, const istreambuf_iterator<charT,traits>& b);
template <class charT, class traits> bool
operator!=(const istreambuf_iterator<charT,traits>& a, const istreambuf_iterator<charT,traits>& b);
template <class charT, class traits = char_traits<charT> > class ostreambuf_iterator;
template < class T, class charT, class traits, class Distance > class _UCXXEXPORT istream_iterator
: public iterator<input_iterator_tag,T,Distance,const T*, const T&>
{
public:
typedef charT char_type;
typedef traits traits_type;
typedef basic_istream<charT,traits> istream_type;
istream_iterator() : in_stream(0), value(0) {}
istream_iterator(istream_type& s) : in_stream(&s), value() {
*in_stream >> value;
}
istream_iterator(const istream_iterator<T,charT,traits,Distance>& x)
: in_stream(x.in_stream), value(x.value)
{ }
~istream_iterator() { }
const T& operator*() const{
return value;
}
const T* operator->() const{
return &value;
}
istream_iterator<T,charT,traits,Distance>& operator++() {
*in_stream >> value;
return *this;
}
istream_iterator<T,charT,traits,Distance> operator++(int){
istream_iterator<T,charT,traits,Distance> tmp = *this;
*in_stream >> value;
return (tmp);
}
bool m_equal(const istream_iterator<T,charT,traits,Distance>& x) const{
return (in_stream == x.in_stream);
}
private:
basic_istream<charT,traits>* in_stream;
T value;
};
template <class T, class charT, class traits, class Distance> _UCXXEXPORT
bool operator==(const istream_iterator<T,charT,traits,Distance>& x,
const istream_iterator<T,charT,traits,Distance>& y)
{
return x.m_equal(y);
}
template <class T, class charT, class traits, class Distance> _UCXXEXPORT
bool operator!=(const istream_iterator<T,charT,traits,Distance>& x,
const istream_iterator<T,charT,traits,Distance>& y)
{
return !(x == y);
}
template <class T, class charT, class traits> class _UCXXEXPORT ostream_iterator
: public iterator<output_iterator_tag,void,void,void,void>
{
public:
typedef charT char_type;
typedef traits traits_type;
typedef basic_ostream<charT,traits> ostream_type;
ostream_iterator(ostream_type& s) : out_stream(&s), delim(0) { }
ostream_iterator(ostream_type& s, const charT* delimiter) : out_stream(&s), delim(delimiter) { }
ostream_iterator(const ostream_iterator<T,charT,traits>& x) : out_stream(x.out_stream), delim(x.delim) { }
~ostream_iterator() { }
ostream_iterator<T,charT,traits>& operator=(const T& value){
*out_stream << value;
if(delim != 0){
*out_stream << delim;
}
return (*this);
}
ostream_iterator<T,charT,traits>& operator*(){ return *this; }
ostream_iterator<T,charT,traits>& operator++() { return *this; }
ostream_iterator<T,charT,traits> operator++(int) { return *this; }
private:
basic_ostream<charT,traits>* out_stream;
const char* delim;
};
template<class charT, class traits > class _UCXXEXPORT istreambuf_iterator :
public iterator<input_iterator_tag, charT, typename traits::off_type, charT*, charT&>
{
public:
typedef charT char_type;
typedef traits traits_type;
typedef typename traits::int_type int_type;
typedef basic_streambuf<charT,traits> streambuf_type;
typedef basic_istream<charT,traits> istream_type;
class _UCXXEXPORT proxy{
charT val;
basic_streambuf<charT, traits> * buf;
proxy(charT v, basic_streambuf<charT, traits> * b) : val(v), buf(b) { }
public:
charT operator*() { return val; }
};
istreambuf_iterator() throw() : sbuf(0) { }
istreambuf_iterator(istream_type& s) throw() : sbuf(s.rdbuf()) { }
istreambuf_iterator(streambuf_type* s) throw() : sbuf(s) { }
istreambuf_iterator(const proxy& p) throw() : sbuf(&p.buf) { }
charT operator*() const{
return sbuf->sgetc();
}
istreambuf_iterator<charT,traits>& operator++(){
sbuf->sbumpc();
return *this;
}
proxy operator++(int){
istreambuf_iterator<charT,traits> tmp = *this;
sbuf->sbumpc();
return(tmp);
}
bool equal(const istreambuf_iterator& b) const{
return sbuf == b.sbuf || is_eof() && b.is_eof();
}
private:
streambuf_type* sbuf;
inline bool is_eof() const{
return sbuf == 0 || sbuf->sgetc() == traits_type::eof();
}
};
template <class charT, class traits> _UCXXEXPORT bool
operator==(const istreambuf_iterator<charT,traits>& a,
const istreambuf_iterator<charT,traits>& b)
{
return a.equal(b);
}
template <class charT, class traits> bool _UCXXEXPORT
operator!=(const istreambuf_iterator<charT,traits>& a,
const istreambuf_iterator<charT,traits>& b)
{
return !a.equal(b);
}
template <class charT, class traits> class _UCXXEXPORT ostreambuf_iterator
: iterator<output_iterator_tag,void,void,void,void>
{
public:
typedef charT char_type;
typedef traits traits_type;
typedef basic_streambuf<charT,traits> streambuf_type;
typedef basic_ostream<charT,traits> ostream_type;
public:
ostreambuf_iterator(ostream_type& s) throw() : sbuf(s.rdbuf()), f(false) { }
ostreambuf_iterator(streambuf_type* s) throw() : sbuf(s), f(false) { }
ostreambuf_iterator& operator=(charT c){
if(failed() == false){
if(sbuf->sputc(c) == traits::eof()){
f = true;
}
}
return *this;
}
ostreambuf_iterator& operator*(){
return *this;
}
ostreambuf_iterator& operator++() { return *this; }
ostreambuf_iterator operator++(int) { return *this; }
bool failed() const throw(){
return f;
}
private:
streambuf_type* sbuf;
bool f;
};
}
#pragma GCC visibility pop
#endif

View File

@ -0,0 +1,305 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <basic_definitions>
#ifndef __STD_HEADER_ITERATOR_BASE
#define __STD_HEADER_ITERATOR_BASE 1
#pragma GCC visibility push(default)
namespace std{
template<class Iterator> struct iterator_traits;
template<class T> struct iterator_traits<T*>;
template<class Category, class T, class Distance = ptrdiff_t, class Pointer = T*, class Reference = T&> struct iterator;
struct _UCXXEXPORT input_iterator_tag {};
struct _UCXXEXPORT output_iterator_tag {};
struct _UCXXEXPORT forward_iterator_tag: public input_iterator_tag {};
struct _UCXXEXPORT bidirectional_iterator_tag: public forward_iterator_tag {};
struct _UCXXEXPORT random_access_iterator_tag: public bidirectional_iterator_tag {};
template <class InputIterator, class Distance> _UCXXEXPORT void advance(InputIterator& i, Distance n){
while(n > 0){
--n;
++i;
}
}
template <class InputIterator> _UCXXEXPORT typename iterator_traits<InputIterator>::difference_type
distance(InputIterator first, InputIterator last)
{
typename iterator_traits<InputIterator>::difference_type d = 0;
while(first++ !=last){
d++;
}
return d;
}
// subclause _lib.predef.iterators_, predefined iterators:
template <class Iterator> class reverse_iterator;
template <class Iterator> bool operator==(const reverse_iterator<Iterator>& x, const reverse_iterator<Iterator>& y);
template <class Iterator> bool operator<(const reverse_iterator<Iterator>& x, const reverse_iterator<Iterator>& y);
template <class Iterator> bool operator!=(const reverse_iterator<Iterator>& x, const reverse_iterator<Iterator>& y);
template <class Iterator> bool operator>(const reverse_iterator<Iterator>& x, const reverse_iterator<Iterator>& y);
template <class Iterator> bool operator>=(const reverse_iterator<Iterator>& x, const reverse_iterator<Iterator>& y);
template <class Iterator> bool operator<=(const reverse_iterator<Iterator>& x, const reverse_iterator<Iterator>& y);
template <class Iterator> typename reverse_iterator<Iterator>::difference_type
operator-( const reverse_iterator<Iterator>& x, const reverse_iterator<Iterator>& y);
template <class Iterator> reverse_iterator<Iterator>
operator+( typename reverse_iterator<Iterator>::difference_type n, const reverse_iterator<Iterator>& x);
template <class Container> class back_insert_iterator;
template <class Container> back_insert_iterator<Container> back_inserter(Container& x);
template <class Container> class front_insert_iterator;
template <class Container> front_insert_iterator<Container> front_inserter(Container& x);
template <class Container> class insert_iterator;
template <class Container, class Iterator>
insert_iterator<Container> inserter(Container& x, Iterator i);
//Actual Template definitions
template<class Iterator> struct _UCXXEXPORT iterator_traits {
typedef typename Iterator::difference_type difference_type;
typedef typename Iterator::value_type value_type;
typedef typename Iterator::pointer pointer;
typedef typename Iterator::reference reference;
typedef typename Iterator::iterator_category iterator_category;
};
//Pointer specialization - required by standard
template<class T> struct _UCXXEXPORT iterator_traits<T*> {
typedef ptrdiff_t difference_type;
typedef T value_type;
typedef T* pointer;
typedef T& reference;
typedef random_access_iterator_tag iterator_category;
};
//Specialization recomended by standard
/* template<class T> struct _UCXXEXPORT iterator_traits<T __far*> {
typedef long difference_type;
typedef T value_type;
typedef T __far* pointer;
typedef T __far& reference;
typedef random_access_iterator_tag iterator_category;
};*/
/* template <class BidirectionalIterator> _UCXXEXPORT void
reverse(BidirectionalIterator first, BidirectionalIterator last)
{
typename iterator_traits<BidirectionalIterator>::difference_type n = distance(first, last);
--n;
while(n > 0){
typename iterator_traits<BidirectionalIterator>::value_type tmp = *first;
*first++ = * --last;
*last = tmp;
n -= 2;
}
};*/
template <class Category, class T, class Distance, class Pointer, class Reference>
struct _UCXXEXPORT iterator
{
typedef T value_type;
typedef Distance difference_type;
typedef Pointer pointer;
typedef Reference reference;
typedef Category iterator_category;
};
template <class Iterator> class _UCXXEXPORT reverse_iterator
: public iterator<typename iterator_traits<Iterator>::iterator_category,
typename iterator_traits<Iterator>::value_type, typename iterator_traits<Iterator>::difference_type,
typename iterator_traits<Iterator>::pointer, typename iterator_traits<Iterator>::reference>
{
protected:
Iterator current;
friend bool operator== <Iterator>(const reverse_iterator<Iterator>& x, const reverse_iterator<Iterator>& y);
friend bool operator< <Iterator>(const reverse_iterator<Iterator>& x, const reverse_iterator<Iterator>& y);
public:
typedef Iterator iterator_type;
reverse_iterator() : current(){};
explicit reverse_iterator(Iterator x) : current(x) { }
template<class U> reverse_iterator(const reverse_iterator<U> &x) : current(x.base()){}
Iterator base() const { return current; } // explicit
typename iterator_traits<Iterator>::reference operator*() const { Iterator tmp = current; return *--tmp; }
typename iterator_traits<Iterator>::pointer operator->() const { return &(operator*()); }
typename iterator_traits<Iterator>::reference operator[](typename iterator_traits<Iterator>::difference_type n) const{
return current[-n-1];
}
reverse_iterator& operator++(){ --current; return *this; }
reverse_iterator operator++(int) {reverse_iterator tmp = *this; --current; return tmp; }
reverse_iterator& operator--() { ++ current; return *this; }
reverse_iterator operator--(int) {reverse_iterator tmp = *this; ++current; return tmp; }
reverse_iterator operator+ (typename iterator_traits<Iterator>::difference_type n) const{
reverse_iterator retval( *this );
retval+=n;
return retval;
}
reverse_iterator& operator+=(typename iterator_traits<Iterator>::difference_type n){
current -= n;
return *this;
}
reverse_iterator operator- (typename iterator_traits<Iterator>::difference_type n) const{
reverse_iterator retval( *this );
retval-=n;
return retval;
}
reverse_iterator& operator-=(typename iterator_traits<Iterator>::difference_type n){
current += n;
return *this;
}
};
template <class Iterator> _UCXXEXPORT bool
operator==(const reverse_iterator<Iterator>& x, const reverse_iterator<Iterator>& y)
{
return x.base() == y.base();
}
template <class Iterator> _UCXXEXPORT bool
operator<(const reverse_iterator<Iterator>& x, const reverse_iterator<Iterator>& y)
{
return x.base() < y.base();
}
template <class Iterator> _UCXXEXPORT bool
operator!=(const reverse_iterator<Iterator>& x, const reverse_iterator<Iterator>& y)
{
return x.base() != y.base();
}
template <class Iterator> _UCXXEXPORT bool
operator>(const reverse_iterator<Iterator>& x, const reverse_iterator<Iterator>& y)
{
return x.base() > y.base();
}
template <class Iterator> _UCXXEXPORT bool
operator>=(const reverse_iterator<Iterator>& x, const reverse_iterator<Iterator>& y)
{
return x.base() >= y.base();
}
template <class Iterator> _UCXXEXPORT bool
operator<=(const reverse_iterator<Iterator>& x, const reverse_iterator<Iterator>& y)
{
return x.base() <= y.base();
}
template <class Iterator> _UCXXEXPORT typename reverse_iterator<Iterator>::difference_type
operator-( const reverse_iterator<Iterator>& x, const reverse_iterator<Iterator>& y)
{
return y.base() - x.base();
}
template <class Iterator> _UCXXEXPORT reverse_iterator<Iterator>
operator+(typename reverse_iterator<Iterator>::difference_type n, const reverse_iterator<Iterator>& x)
{
return reverse_iterator<Iterator> (x.base() - n);
}
template <class Container> class _UCXXEXPORT back_insert_iterator :
public iterator<output_iterator_tag,void,void,void,void>
{
protected:
Container& container;
public:
typedef Container container_type;
explicit back_insert_iterator(Container& x):container(x) {};
back_insert_iterator<Container>& operator=(const typename Container::value_type& value){
container.push_back(value);
return *this;
}
back_insert_iterator<Container>& operator*(){
return *this;
}
back_insert_iterator<Container>& operator++(){
return *this;
}
back_insert_iterator<Container> operator++(int){
return *this;
}
};
template <class Container> _UCXXEXPORT back_insert_iterator<Container>
back_inserter(Container& x)
{
return back_insert_iterator<Container>(x);
}
template <class Container> class _UCXXEXPORT front_insert_iterator
: public iterator<output_iterator_tag,void,void,void,void>
{
protected:
Container& container;
public:
typedef Container container_type;
explicit front_insert_iterator(Container& x): container(x) {}
front_insert_iterator<Container>& operator=(const typename Container::value_type& value){
container.push_front(value);
return *this;
}
front_insert_iterator<Container>& operator*() { return *this; }
front_insert_iterator<Container>& operator++() { return *this; }
front_insert_iterator<Container> operator++(int) { return *this; }
};
template <class Container> _UCXXEXPORT front_insert_iterator<Container>
front_inserter(Container& x)
{
return front_insert_iterator<Container>(x);
}
template <class Container> class _UCXXEXPORT insert_iterator
: public iterator<output_iterator_tag,void,void,void,void>
{
protected:
Container& container;
typename Container::iterator iter;
public:
typedef Container container_type;
insert_iterator(Container& x, typename Container::iterator i) : container(x), iter(i) {}
insert_iterator<Container>& operator=(const typename Container::value_type& value){
iter = container.insert(iter, value);
++iter;
return *this;
}
insert_iterator<Container>& operator*() { return *this; }
insert_iterator<Container>& operator++() { return *this; }
insert_iterator<Container> operator++(int) { return *this; }
};
template <class Container, class Iterator> _UCXXEXPORT insert_iterator<Container>
inserter(Container& x, Iterator i)
{
return insert_iterator<Container>(x,typename Container::iterator(i));
}
}
#pragma GCC visibility pop
#endif

View File

@ -0,0 +1,663 @@
/* Copyright (C) 2006 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <climits>
#ifndef __STD_HEADER_LIMITS
#define __STD_HEADER_LIMITS 1
#warning limits header is nowhere complete or accurate
#pragma GCC visibility push(default)
namespace std{
enum float_round_style{
round_indeterminate =-1,
round_toward_zero = 0,
round_to_nearest = 1,
round_toward_infinity = 2,
round_toward_neg_infinity = 3
};
template <int bitsize> struct __bits_to_base_10{
static const int size = -1;
};
template <> struct __bits_to_base_10<7>{
static const int size = 2;
};
template <> struct __bits_to_base_10<8>{
static const int size = 2;
};
template <> struct __bits_to_base_10<9>{
static const int size = 2;
};
template <> struct __bits_to_base_10<10>{
static const int size = 3;
};
template <> struct __bits_to_base_10<15>{
static const int size = 4;
};
template <> struct __bits_to_base_10<16>{
static const int size = 4;
};
template <> struct __bits_to_base_10<17>{
static const int size = 5;
};
template <> struct __bits_to_base_10<18>{
static const int size = 5;
};
template <> struct __bits_to_base_10<31>{
static const int size = 9;
};
template <> struct __bits_to_base_10<32>{
static const int size = 9;
};
template <> struct __bits_to_base_10<35>{
static const int size = 10;
};
template <> struct __bits_to_base_10<36>{
static const int size = 10;
};
template <> struct __bits_to_base_10<63>{
static const int size = 18;
};
template <> struct __bits_to_base_10<64>{
static const int size = 19;
};
template <> struct __bits_to_base_10<71>{
static const int size = 21;
};
template <> struct __bits_to_base_10<72>{
static const int size = 21;
};
template <> struct __bits_to_base_10<79>{
static const int size = 23;
};
template <> struct __bits_to_base_10<80>{
static const int size = 24;
};
template <> struct __bits_to_base_10<127>{
static const int size = 38;
};
template <> struct __bits_to_base_10<128>{
static const int size = 38;
};
template <class T> class numeric_limits {
public:
// General -- meaningful for all specializations.
static const bool is_specialized = false;
static T min();
static T max();
static const int radix;
static const int digits;
static const int digits10;
static const bool is_signed;
static const bool is_integer;
static const bool is_exact;
static const bool traps;
static const bool is_modulo;
static const bool is_bounded;
// Floating point specific.
static T epsilon();
static T round_error();
static const int min_exponent10;
static const int max_exponent10;
static const int min_exponent;
static const int max_exponent;
static const bool has_infinity;
static const bool has_quiet_NaN;
static const bool has_signaling_NaN;
static const bool is_iec559;
static const bool has_denorm;
static const bool tinyness_before;
static const float_round_style round_style;
static T denorm_min();
static T infinity();
static T quiet_NaN();
static T signaling_NaN();
};
template <> class numeric_limits<bool> {
public:
typedef bool T;
// General -- meaningful for all specializations.
static const bool is_specialized = true;
static T min(){
return false;
}
static T max(){
return true;
}
static const int radix = 2;
static const int digits = 1;
static const int digits10 = 0;
static const bool is_signed = false;
static const bool is_integer = true;
static const bool is_exact = true;
static const bool traps = false;
static const bool is_modulo = false;
static const bool is_bounded = true;
// Floating point specific.
static T epsilon(){
return 0;
}
static T round_error(){
return 0;
}
static const int min_exponent10 = 0;
static const int max_exponent10 = 0;
static const int min_exponent = 0;
static const int max_exponent = 0;
static const bool has_infinity = false;
static const bool has_quiet_NaN = false;
static const bool has_signaling_NaN = false;
static const bool is_iec559 = false;
static const bool has_denorm = false;
static const bool tinyness_before = false;
static const float_round_style round_style = round_indeterminate;
static T denorm_min();
static T infinity();
static T quiet_NaN();
static T signaling_NaN();
};
template <> class numeric_limits<unsigned char> {
public:
typedef unsigned char T;
// General -- meaningful for all specializations.
static const bool is_specialized = true;
static T min(){
return 0;
}
static T max(){
return UCHAR_MAX;
}
static const int radix = 2;
static const int digits = CHAR_BIT;
static const int digits10 = __bits_to_base_10<digits>::size;
static const bool is_signed = false;
static const bool is_integer = true;
static const bool is_exact = true;
static const bool traps = false;
static const bool is_modulo = true;
static const bool is_bounded = true;
// Floating point specific.
static T epsilon(){
return 0;
}
static T round_error(){
return 0;
}
static const int min_exponent10 = 0;
static const int max_exponent10 = 0;
static const int min_exponent = 0;
static const int max_exponent = 0;
static const bool has_infinity = false;
static const bool has_quiet_NaN = false;
static const bool has_signaling_NaN = false;
static const bool is_iec559 = false;
static const bool has_denorm = false;
static const bool tinyness_before = false;
static const float_round_style round_style = round_indeterminate;
static T denorm_min();
static T infinity();
static T quiet_NaN();
static T signaling_NaN();
};
template <> class numeric_limits<signed char> {
public:
typedef signed char T;
// General -- meaningful for all specializations.
static const bool is_specialized = true;
static T min(){
return SCHAR_MIN;
}
static T max(){
return SCHAR_MAX;
}
static const int radix = 2;
static const int digits = CHAR_BIT - 1;
static const int digits10 = __bits_to_base_10<digits>::size;
static const bool is_signed = true;
static const bool is_integer = true;
static const bool is_exact = true;
static const bool traps = false;
static const bool is_modulo = true;
static const bool is_bounded = true;
// Floating point specific.
static T epsilon(){
return 0;
}
static T round_error(){
return 0;
}
static const int min_exponent10 = 0;
static const int max_exponent10 = 0;
static const int min_exponent = 0;
static const int max_exponent = 0;
static const bool has_infinity = false;
static const bool has_quiet_NaN = false;
static const bool has_signaling_NaN = false;
static const bool is_iec559 = false;
static const bool has_denorm = false;
static const bool tinyness_before = false;
static const float_round_style round_style = round_indeterminate;
static T denorm_min();
static T infinity();
static T quiet_NaN();
static T signaling_NaN();
};
template <> class numeric_limits<char> {
public:
typedef char T;
// General -- meaningful for all specializations.
static const bool is_specialized = true;
static T min(){
return CHAR_MIN;
}
static T max(){
return CHAR_MAX;
}
static const int radix = 2;
static const int digits = (CHAR_MIN != 0) ? CHAR_BIT - 1 : CHAR_BIT;
static const int digits10 = __bits_to_base_10<digits>::size;
static const bool is_signed = (CHAR_MIN != 0);
static const bool is_integer = true;
static const bool is_exact = true;
static const bool traps = false;
static const bool is_modulo = true;
static const bool is_bounded = true;
// Floating point specific.
static T epsilon(){
return 0;
}
static T round_error(){
return 0;
}
static const int min_exponent10 = 0;
static const int max_exponent10 = 0;
static const int min_exponent = 0;
static const int max_exponent = 0;
static const bool has_infinity = false;
static const bool has_quiet_NaN = false;
static const bool has_signaling_NaN = false;
static const bool is_iec559 = false;
static const bool has_denorm = false;
static const bool tinyness_before = false;
static const float_round_style round_style = round_indeterminate;
static T denorm_min();
static T infinity();
static T quiet_NaN();
static T signaling_NaN();
};
template <> class numeric_limits<unsigned short> {
public:
typedef unsigned short T;
// General -- meaningful for all specializations.
static const bool is_specialized = true;
static T min(){
return 0;
}
static T max(){
return USHRT_MAX;
}
static const int radix = 2;
static const int digits = CHAR_BIT * sizeof(T);
static const int digits10 = __bits_to_base_10<digits>::size;
static const bool is_signed = false;
static const bool is_integer = true;
static const bool is_exact = true;
static const bool traps = false;
static const bool is_modulo = true;
static const bool is_bounded = true;
// Floating point specific.
static T epsilon(){
return 0;
}
static T round_error(){
return 0;
}
static const int min_exponent10 = 0;
static const int max_exponent10 = 0;
static const int min_exponent = 0;
static const int max_exponent = 0;
static const bool has_infinity = false;
static const bool has_quiet_NaN = false;
static const bool has_signaling_NaN = false;
static const bool is_iec559 = false;
static const bool has_denorm = false;
static const bool tinyness_before = false;
static const float_round_style round_style = round_indeterminate;
static T denorm_min();
static T infinity();
static T quiet_NaN();
static T signaling_NaN();
};
template <> class numeric_limits<signed short> {
public:
typedef signed short T;
// General -- meaningful for all specializations.
static const bool is_specialized = true;
static T min(){
return SHRT_MIN;
}
static T max(){
return SHRT_MAX;
}
static const int radix = 2;
static const int digits = CHAR_BIT * sizeof(T);
static const int digits10 = __bits_to_base_10<digits>::size;
static const bool is_signed = true;
static const bool is_integer = true;
static const bool is_exact = true;
static const bool traps = false;
static const bool is_modulo = true;
static const bool is_bounded = true;
// Floating point specific.
static T epsilon(){
return 0;
}
static T round_error(){
return 0;
}
static const int min_exponent10 = 0;
static const int max_exponent10 = 0;
static const int min_exponent = 0;
static const int max_exponent = 0;
static const bool has_infinity = false;
static const bool has_quiet_NaN = false;
static const bool has_signaling_NaN = false;
static const bool is_iec559 = false;
static const bool has_denorm = false;
static const bool tinyness_before = false;
static const float_round_style round_style = round_indeterminate;
static T denorm_min();
static T infinity();
static T quiet_NaN();
static T signaling_NaN();
};
template <> class numeric_limits<unsigned int> {
public:
typedef unsigned int T;
// General -- meaningful for all specializations.
static const bool is_specialized = true;
static T min(){
return 0;
}
static T max(){
return UINT_MAX;
}
static const int radix = 2;
static const int digits = CHAR_BIT * sizeof(T);
static const int digits10 = __bits_to_base_10<digits>::size;
static const bool is_signed = false;
static const bool is_integer = true;
static const bool is_exact = true;
static const bool traps = false;
static const bool is_modulo = true;
static const bool is_bounded = true;
// Floating point specific.
static T epsilon(){
return 0;
}
static T round_error(){
return 0;
}
static const int min_exponent10 = 0;
static const int max_exponent10 = 0;
static const int min_exponent = 0;
static const int max_exponent = 0;
static const bool has_infinity = false;
static const bool has_quiet_NaN = false;
static const bool has_signaling_NaN = false;
static const bool is_iec559 = false;
static const bool has_denorm = false;
static const bool tinyness_before = false;
static const float_round_style round_style = round_indeterminate;
static T denorm_min();
static T infinity();
static T quiet_NaN();
static T signaling_NaN();
};
template <> class numeric_limits<signed int> {
public:
typedef signed int T;
// General -- meaningful for all specializations.
static const bool is_specialized = true;
static T min(){
return INT_MIN;
}
static T max(){
return INT_MAX;
}
static const int radix = 2;
static const int digits = CHAR_BIT * sizeof(T);
static const int digits10 = __bits_to_base_10<digits>::size;
static const bool is_signed = true;
static const bool is_integer = true;
static const bool is_exact = true;
static const bool traps = false;
static const bool is_modulo = true;
static const bool is_bounded = true;
// Floating point specific.
static T epsilon(){
return 0;
}
static T round_error(){
return 0;
}
static const int min_exponent10 = 0;
static const int max_exponent10 = 0;
static const int min_exponent = 0;
static const int max_exponent = 0;
static const bool has_infinity = false;
static const bool has_quiet_NaN = false;
static const bool has_signaling_NaN = false;
static const bool is_iec559 = false;
static const bool has_denorm = false;
static const bool tinyness_before = false;
static const float_round_style round_style = round_indeterminate;
static T denorm_min();
static T infinity();
static T quiet_NaN();
static T signaling_NaN();
};
template <> class numeric_limits<unsigned long int> {
public:
typedef unsigned long int T;
// General -- meaningful for all specializations.
static const bool is_specialized = true;
static T min(){
return 0;
}
static T max(){
return ULONG_MAX;
}
static const int radix = 2;
static const int digits = CHAR_BIT * sizeof(T);
static const int digits10 = __bits_to_base_10<digits>::size;
static const bool is_signed = false;
static const bool is_integer = true;
static const bool is_exact = true;
static const bool traps = false;
static const bool is_modulo = true;
static const bool is_bounded = true;
// Floating point specific.
static T epsilon(){
return 0;
}
static T round_error(){
return 0;
}
static const int min_exponent10 = 0;
static const int max_exponent10 = 0;
static const int min_exponent = 0;
static const int max_exponent = 0;
static const bool has_infinity = false;
static const bool has_quiet_NaN = false;
static const bool has_signaling_NaN = false;
static const bool is_iec559 = false;
static const bool has_denorm = false;
static const bool tinyness_before = false;
static const float_round_style round_style = round_indeterminate;
static T denorm_min();
static T infinity();
static T quiet_NaN();
static T signaling_NaN();
};
template <> class numeric_limits<signed long int> {
public:
typedef signed long int T;
// General -- meaningful for all specializations.
static const bool is_specialized = true;
static T min(){
return LONG_MIN;
}
static T max(){
return LONG_MAX;
}
static const int radix = 2;
static const int digits = CHAR_BIT * sizeof(T);
static const int digits10 = __bits_to_base_10<digits>::size;
static const bool is_signed = true;
static const bool is_integer = true;
static const bool is_exact = true;
static const bool traps = false;
static const bool is_modulo = true;
static const bool is_bounded = true;
// Floating point specific.
static T epsilon(){
return 0;
}
static T round_error(){
return 0;
}
static const int min_exponent10 = 0;
static const int max_exponent10 = 0;
static const int min_exponent = 0;
static const int max_exponent = 0;
static const bool has_infinity = false;
static const bool has_quiet_NaN = false;
static const bool has_signaling_NaN = false;
static const bool is_iec559 = false;
static const bool has_denorm = false;
static const bool tinyness_before = false;
static const float_round_style round_style = round_indeterminate;
static T denorm_min();
static T infinity();
static T quiet_NaN();
static T signaling_NaN();
};
template <> class numeric_limits<double> {
public:
typedef double numeric_type;
static const bool is_specialized = true;
static numeric_type min () { return __DBL_MIN__; }
static numeric_type max () { return __DBL_MAX__; }
static const int radix = __FLT_RADIX__;
static const int digits = __DBL_MANT_DIG__;
static const int digits10 = __DBL_DIG__;
static const bool is_signed = true;
static const bool is_integer = false;
static const bool is_exact = false;
static const bool traps = false; // this is a guess
static const bool is_modulo = false;
static const bool is_bounded = true;
// Floating point specific.
static numeric_type epsilon () { return __DBL_EPSILON__; }
static numeric_type round_error () { return 0.5; }
static const int min_exponent10 = -1; //How do I properly get this?
static const int max_exponent10 = -1; //How do I properly get this?
static const int min_exponent = -1; //How do I properly get this?
static const int max_exponent = -1; //How do I properly get this?
static const bool has_infinity = false; //I don't know, so until I can find out, I'm saying no
static const bool has_quiet_NaN = false; //I don't know, so until I can find out, I'm saying no
static const bool has_signaling_NaN = false; //I don't know, so until I can find out, I'm saying no
static const bool has_denorm = false; //I don't know, so until I can find out, I'm saying no
static const bool is_iec559 = false; //I don't know, so until I can find out, I'm saying no
static const bool tinyness_before = false; // more questions
static const float_round_style round_style = round_to_nearest; // more questions
static numeric_type denorm_min () { return -1; } //How do I properly get this?
static numeric_type infinity () { return -1; } //How do I properly get this?
static numeric_type quiet_NaN () { return -1; } //How do I properly get this?
static numeric_type signaling_NaN () { return -1; } //How do I properly get this?
};
}
#pragma GCC visibility pop
#endif

View File

@ -0,0 +1,926 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <memory>
#include <iterator>
#include <algorithm>
#ifndef __STD_HEADER_LIST
#define __STD_HEADER_LIST 1
#pragma GCC visibility push(default)
namespace std{
template <class T, class Allocator = allocator<T> > class _UCXXEXPORT list {
public:
typedef typename Allocator::reference reference;
typedef typename Allocator::const_reference const_reference;
typedef typename Allocator::size_type size_type;
typedef typename Allocator::difference_type difference_type;
typedef T value_type;
typedef Allocator allocator_type;
typedef typename Allocator::pointer pointer;
typedef typename Allocator::const_pointer const_pointer;
protected:
class node;
class iter_list;
node * list_start;
node * list_end;
size_type elements;
Allocator a;
public:
typedef iter_list iterator;
typedef iter_list const_iterator;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
explicit list(const Allocator& = Allocator());
explicit list(size_type n, const T& value = T(), const Allocator& = Allocator());
template <class InputIterator> list(InputIterator first, InputIterator last,
const Allocator& al= Allocator());
list(const list<T,Allocator>& x);
~list();
list<T,Allocator>& operator=(const list<T,Allocator>& x){
if(&x == this){
return *this;
}
clear();
iterator i = x.begin();
while(i != x.end()){
push_back(*i);
++i;
}
return *this;
}
template <class InputIterator> void assign(InputIterator first, InputIterator last);
template <class Size, class U> void assign(Size n, const U& u = U());
allocator_type get_allocator() const;
iterator begin();
const_iterator begin() const;
iterator end();
const_iterator end() const;
reverse_iterator rbegin();
const_reverse_iterator rbegin() const;
reverse_iterator rend();
const_reverse_iterator rend() const;
bool empty() const;
size_type size() const;
size_type max_size() const;
void resize(size_type sz, T c = T());
reference front();
const_reference front() const;
reference back();
const_reference back() const;
void push_front(const T& x);
void pop_front();
void push_back(const T& x);
void pop_back();
iterator insert(iterator position, const T& x = T());
void insert(iterator position, size_type n, const T& x);
template <class InputIterator> void insert(iterator position, InputIterator first, InputIterator last);
iterator erase(iterator position);
iterator erase(iterator position, iterator last);
void swap(list<T,Allocator>&);
void clear();
void splice(iterator position, list<T,Allocator>& x);
void splice(iterator position, list<T,Allocator>& x, iterator i);
void splice(iterator position, list<T,Allocator>& x, iterator first, iterator last);
void remove(const T& value);
template <class Predicate> void remove_if(Predicate pred);
void unique();
template <class BinaryPredicate> void unique(BinaryPredicate binary_pred);
void merge(list<T,Allocator>& x);
template <class Compare> void merge(list<T,Allocator>& x, Compare comp);
void sort();
template <class Compare> void sort(Compare comp);
void reverse();
protected:
void swap_nodes(node * x, node * y);
};
//Implementations of List
//List node
template <class T, class Allocator> class _UCXXEXPORT list<T, Allocator>::node{
public:
node * previous;
node * next;
T * val;
node(): previous(0), next(0), val(0){ }
node(const T & t ): previous(0), next(0), val(0) {
val = new T(t);
//FIXME use allocator somehow but only call constructor once
}
node(const T & t, node * p, node * n): previous(p), next(n), val(0) {
val = new T(t);
}
~node(){ }
};
//List iterator
template <class T, class Allocator> class _UCXXEXPORT list<T, Allocator>::iter_list
: public std::iterator<
bidirectional_iterator_tag,
T,
typename Allocator::difference_type,
typename Allocator::pointer,
typename Allocator::reference
>
{
private:
node * current;
public:
iter_list():current(0) { }
iter_list( typename list<T, Allocator>::node * n): current(n) { }
iter_list(const list<T, Allocator>::iter_list & l): current(l.current) { }
~iter_list(){ }
iter_list & operator=(const list<T, Allocator>::iter_list & right ){
current = right.current;
return *this;
}
T & operator*(){
return *(current->val);
}
T * operator->(){
return current->val;
}
const T & operator*() const{
return *current->val;
}
const T * operator->() const{
return current->val;
}
bool operator==(const list<T, Allocator>::iter_list & right) const {
return (current == right.current);
}
bool operator!=(const list<T, Allocator>::iter_list & right) const {
return (current != right.current);
}
iter_list & operator++(){
current = current->next;
return *this;
}
iter_list operator++(int){
iter_list temp(current);
current = current->next;
return temp;
}
iter_list & operator--(){
current = current->previous;
return *this;
}
iter_list operator--(int){
iter_list temp(current);
current = current->previous;
return temp;
}
node * link_struct(){
return current;
}
iter_list & operator+=(unsigned int n){
for(unsigned int i = 0; i < n; ++i){
current = current->next;
}
return *this;
}
iter_list & operator-=(unsigned int n){
for(unsigned int i = 0; i < n; ++i){
current = current->previous;
}
return *this;
}
};
template<class T, class Allocator> list<T, Allocator>::list(const Allocator& al)
:list_start(0), list_end(0), elements(0), a(al)
{
//End node
list_start = new node();
list_end = list_start;
return;
}
template<class T, class Allocator> list<T, Allocator>::list
(typename Allocator::size_type n, const T& value, const Allocator& al)
:list_start(0), list_end(0), elements(0), a(al)
{
//End node
list_start = new node();
list_end = list_start;
for(typename Allocator::size_type i = 0; i < n ; ++i){
push_back(value);
}
}
template<class T, class Allocator> template <class InputIterator>
list<T, Allocator>::list
(InputIterator first, InputIterator last, const Allocator& al)
: list_start(0), list_end(0), elements(0), a(al)
{
list_start = new node();
list_end = list_start;
while(first != last){
push_back(*first);
++first;
}
}
template<class T, class Allocator> list<T, Allocator>::list(const list<T,Allocator>& x)
: list_start(0), list_end(0), elements(0), a(x.a)
{
list_start = new node();
list_end = list_start;
iterator i = x.begin();
while(i != x.end()){
push_back( *i);
++i;
}
}
template<class T, class Allocator> list<T, Allocator>::~list(){
while(elements > 0){
pop_front();
}
delete list_start->val;
#if UCLIBCXX_DEBUG
list_start->val = 0;
#endif
delete list_start;
#if UCLIBCXX_DEBUG
list_start = 0;
list_end = 0;
#endif
}
template<class T, class Allocator> void list<T, Allocator>::swap_nodes(node * x, node * y){
T * v = x->val;
x->val = y->val;
y->val = v;
}
template<class T, class Allocator> typename list<T, Allocator>::iterator
list<T, Allocator>::begin()
{
return iterator(list_start);
}
template<class T, class Allocator> typename list<T, Allocator>::const_iterator
list<T, Allocator>::begin() const
{
return const_iterator(list_start);
}
template<class T, class Allocator> typename list<T, Allocator>::iterator
list<T, Allocator>::end()
{
return iterator(list_end);
}
template<class T, class Allocator> typename list<T, Allocator>::const_iterator
list<T, Allocator>::end() const
{
return const_iterator(list_end);
}
template<class T, class Allocator> typename list<T, Allocator>::reverse_iterator
list<T, Allocator>::rbegin()
{
return reverse_iterator(end());
}
template<class T, class Allocator> typename list<T, Allocator>::const_reverse_iterator
list<T, Allocator>::rbegin() const
{
return const_reverse_iterator(end());
}
template<class T, class Allocator> typename list<T, Allocator>::reverse_iterator
list<T, Allocator>::rend()
{
return reverse_iterator(begin());
}
template<class T, class Allocator> typename list<T, Allocator>::const_reverse_iterator
list<T, Allocator>::rend() const
{
return const_reverse_iterator(begin());
}
template<class T, class Allocator> bool list<T, Allocator>::empty() const{
return (elements == 0);
}
template<class T, class Allocator> typename list<T, Allocator>::size_type list<T, Allocator>::size() const{
return elements;
}
template<class T, class Allocator> typename list<T, Allocator>::size_type list<T, Allocator>::max_size() const{
return ((size_type)(-1)) / (sizeof(T) + sizeof(node));
}
template<class T, class Allocator> void list<T, Allocator>::resize(typename Allocator::size_type sz, T c){
// if(sz > elements){
for(typename Allocator::size_type i = elements; i < sz; ++i){
push_back(c);
}
// }
// if(sz < elements){
for(typename Allocator::size_type i = elements; i > sz; --i){
pop_back();
}
// }
}
template<class T, class Allocator> typename list<T, Allocator>::reference list<T, Allocator>::front(){
return *(list_start->val);
}
template<class T, class Allocator> typename list<T, Allocator>::const_reference list<T, Allocator>::front() const{
return *(list_start->val);
}
template<class T, class Allocator> typename list<T, Allocator>::reference list<T, Allocator>::back(){
return *(list_end->previous->val);
}
template<class T, class Allocator> typename list<T, Allocator>::const_reference list<T, Allocator>::back() const{
return *(list_end->previous->val);
}
template<class T, class Allocator> void list<T, Allocator>::push_front(const T& x){
node * temp = new node(x);
list_start->previous = temp;
temp->previous = 0;
temp->next = list_start;
list_start = temp;
++elements;
}
template<class T, class Allocator> void list<T, Allocator>::pop_front(){
if(elements > 0){
list_start = list_start->next;
delete list_start->previous->val;
#if UCLIBCXX_DEBUG
list_start->previous->val = 0;
list_start->previous->next = 0;
list_start->previous->previous = 0;
#endif
delete list_start->previous;
list_start->previous = 0;
--elements;
}
}
template<class T, class Allocator> void list<T, Allocator>::push_back(const T& x){
if(elements == 0){
//The list is completely empty
list_start = new node(x);
list_end->previous = list_start;
list_start->previous = 0;
list_start->next = list_end;
elements = 1;
}else{
node * temp = new node(x);
temp->previous = list_end->previous;
temp->next = list_end;
list_end->previous->next = temp;
list_end->previous = temp;
++elements;
}
}
template<class T, class Allocator> void list<T, Allocator>::pop_back(){
if(elements > 0){
node * temp = list_end->previous;
if(temp == list_start){
list_end->previous = 0;
list_start = list_end;
}else{
temp->previous->next = temp->next;
list_end->previous = temp->previous;
}
delete temp->val;
#if UCLIBCXX_DEBUG
temp->val = 0;
temp->next = 0;
temp->previous = 0;
#endif
delete temp;
#if UCLIBCXX_DEBUG
temp = 0;
#endif
--elements;
}
}
template<class T, class Allocator> typename list<T, Allocator>::iterator
list<T, Allocator>::insert(iterator position, const T& x)
{
node * temp = new node(x);
temp->previous = position.link_struct()->previous;
temp->next = position.link_struct();
if(temp->previous == 0){
list_start = temp;
}else{
position.link_struct()->previous->next = temp;
}
position.link_struct()->previous = temp;
++elements;
--position;
return position;
}
template<class T, class Allocator> void list<T, Allocator>::insert(iterator position, size_type n, const T& x){
for(typename list<T, Allocator>::size_type i = 0; i < n; ++i){
position = insert(position, x);
}
}
template<class T, class Allocator> template <class InputIterator> void
list<T, Allocator>::insert(iterator position, InputIterator first, InputIterator last)
{
while(first !=last){
insert(position, *first);
++first;
}
}
template<class T, class Allocator> typename list<T, Allocator>::iterator
list<T, Allocator>::erase(iterator position)
{
if(position != end() ){
node * temp = position.link_struct();
if(temp == list_start){
++position;
temp->next->previous = 0;
list_start = temp->next;
}else{
--position;
temp->next->previous = temp->previous;
temp->previous->next = temp->next;
++position;
}
delete temp->val;
#if UCLIBCXX_DEBUG
temp->next = 0;
temp->previous = 0;
temp->val = 0;
#endif
delete temp;
#if UCLIBCXX_DEBUG
temp = 0;
#endif
--elements;
}
return position;
}
template<class T, class Allocator> typename list<T, Allocator>::iterator
list<T, Allocator>::erase(iterator position, iterator last)
{
iterator temp = position;
while(position !=last){
position = erase(position);
}
return position;
}
template<class T, class Allocator> void list<T, Allocator>::swap(list<T,Allocator>& l){
node * temp;
size_type tempel;
temp = list_start;
list_start = l.list_start;
l.list_start = temp;
temp = list_end;
list_end = l.list_end;
l.list_end = temp;
tempel = elements;
elements = l.elements;
l.elements = tempel;
}
template<class T, class Allocator> void list<T, Allocator>::clear(){
while(elements > 0){
pop_front();
}
}
template<class T, class Allocator>
void list<T, Allocator>::splice(iterator position, list<T,Allocator>& x)
{
//Can't add non-existant elements
if(x.elements == 0){
return;
}
elements += x.elements;
x.elements = 0;
//Chaining to the begining
if(position == begin()){
x.list_end->previous->next = list_start;
list_start->previous = x.list_end->previous;
list_start = x.list_start;
x.list_start = x.list_end;
x.list_end->previous = 0;
return;
}
//Link everything we need
x.list_start->previous = position.link_struct()->previous;
position.link_struct()->previous->next = x.list_start;
position.link_struct()->previous = x.list_end->previous;
x.list_end->previous->next = position.link_struct();
//Clean up the other list
x.list_start = x.list_end;
x.list_end->previous=0;
}
template<class T, class Allocator>
void list<T, Allocator>::splice(iterator position, list<T,Allocator>& x, iterator i)
{
//Invalid conditions
if( x.elements == 0 || i == position || position.link_struct() == i.link_struct()->next ){
return;
}
//Do we need to adjust the begining pointer?
if(i == x.begin()){
x.list_start = x.list_start->next;
x.list_start->previous = 0;
}
//Insert at begining special case
if(position == begin()){
i.link_struct()->previous->next = i.link_struct()->next;
i.link_struct()->next->previous = i.link_struct()->previous;
i.link_struct()->previous = 0;
i.link_struct()->next = position.link_struct();
position.link_struct()->previous = i.link_struct();
list_start = i.link_struct();
--x.elements;
++elements;
return;
}
if( i.link_struct()->previous != 0){
i.link_struct()->previous->next = i.link_struct()->next;
i.link_struct()->next->previous = i.link_struct()->previous;
}else{
i.link_struct()->next->previous = 0;
x.list_start = i.link_struct()->next;
}
i.link_struct()->previous = position.link_struct()->previous;
position.link_struct()->previous->next = i.link_struct();
i.link_struct()->next = position.link_struct();
position.link_struct()->previous = i.link_struct();
--x.elements;
++elements;
}
template<class T, class Allocator>
void list<T, Allocator>::splice(iterator position, list<T,Allocator>& x,
iterator first, iterator last)
{
if(x.elements == 0){
return;
}
iterator temp;
while(first != last){
temp = first;
++first;
splice(position, x, temp);
}
}
template<class T, class Allocator> void list<T, Allocator>::remove(const T& value){
iterator temp = begin();
while( temp != end() ){
if(*temp == value){
temp = erase(temp);
}else{
++temp;
}
}
}
template<class T, class Allocator> template <class Predicate> void list<T, Allocator>::remove_if(Predicate pred){
iterator temp = begin();
while( temp != end() ){
if( pred(*temp) ){
temp = erase(temp);
}else{
++temp;
}
}
}
template<class T, class Allocator> void list<T, Allocator>::unique(){
equal_to<typename iterator_traits<iterator>::value_type> p;
unique(p);
}
template<class T, class Allocator> template <class BinaryPredicate>
void list<T, Allocator>::unique(BinaryPredicate binary_pred)
{
iterator temp1 = begin();
iterator temp2;
++temp1;
while( temp1 != end() ){
temp2 = temp1;
--temp2;
if( binary_pred(*temp1, *temp2) ){
erase(temp1);
temp1 = temp2;
}
++temp1;
}
}
template<class T, class Allocator> void list<T, Allocator>::merge(list<T,Allocator>& x){
less<typename iterator_traits<typename list<T, Allocator>::iterator>::value_type> c;
merge(x, c);
}
template<class T, class Allocator> template <class Compare>
void list<T, Allocator>::merge(list<T,Allocator>& x, Compare comp)
{
iterator source = x.begin();
iterator temp;
iterator dest = begin();
while(source != x.end()){
while( dest != end() && comp (*dest, *source) ){
++dest;
}
++elements;
--x.elements;
temp = source;
++temp;
if(dest == begin()){
dest.link_struct()->previous = source.link_struct();
source.link_struct()->next = dest.link_struct();
source.link_struct()->previous = 0;
list_start = source.link_struct();
}else{
source.link_struct()->previous = dest.link_struct()->previous;
dest.link_struct()->previous->next = source.link_struct();
source.link_struct()->next = dest.link_struct();
dest.link_struct()->previous = source.link_struct();
}
source = temp;
}
//Fix up x;
x.list_start = x.list_end;
x.list_start->previous = 0;
}
template<class T, class Allocator> void list<T, Allocator>::sort(){
less<typename iterator_traits<typename list<T, Allocator>::iterator>::value_type> c;
sort(c);
}
template<class T, class Allocator> template <class Compare>
void list<T, Allocator>::sort(Compare comp)
{
typename list<T, Allocator>::iterator i, j, k;
//FIXME - bubble sort
if(elements == 0){
return;
}
i = end();
--i;
while(i != begin()){
j = begin();
k = j;
++k;
while(j != i){
if( comp(*k, *j) ){
swap_nodes(k.link_struct(), j.link_struct());
}
++j;
++k;
}
--i;
}
}
template<class T, class Allocator> void list<T, Allocator>::reverse(){
if(elements == 0){
return;
}
node * current;
node * following;
node * temp;
//Need to move the list_end element to the begining
temp = list_end;
list_end = temp->previous;
list_end->next = 0;
list_start->previous = temp;
temp->previous = 0;
temp->next = list_start;
list_start = temp;
current = list_start;
while( current != list_end ){
following = current->next;
//Swap the values pointed to/at with the current node
temp = current->next;
current->next = current->previous;
current->previous = temp;
current = following;
}
//Swap pointers on the end node
temp = list_end->next;
list_end->next = list_end->previous;
list_end->previous = temp;
//Swap the fixed pointers
temp = list_start;
list_start = list_end;
list_end = temp;
}
template <class T, class Allocator>
bool operator==(const list<T,Allocator>& x, const list<T,Allocator>& y){
if(x.size() != y.size()){
return false;
}
typename list<T,Allocator>::const_iterator i = x.begin();
typename list<T,Allocator>::const_iterator j = y.begin();
while(i != x.end()){
if( *i != *j){
return false;
}
++i;
++j;
}
return true;
}
template <class T, class Allocator>
bool operator< (const list<T,Allocator>& x, const list<T,Allocator>& y){
typename list<T,Allocator>::const_iterator i = x.begin();
typename list<T,Allocator>::const_iterator j = y.begin();
while(i != x.end() && j != y.end()){
if( *i < *j){
return true;
}
if(*j < *i){
return false;
}
++i;
++j;
}
return (i == x.end() && j != y.end());
}
template <class T, class Allocator>
bool operator!=(const list<T,Allocator>& x, const list<T,Allocator>& y){
return !(x == y);
}
template <class T, class Allocator>
bool operator> (const list<T,Allocator>& x, const list<T,Allocator>& y){
typename list<T,Allocator>::const_iterator i = x.begin();
typename list<T,Allocator>::const_iterator j = y.begin();
while(i != x.end() && j != y.end()){
if( *i > *j){
return true;
}
if( *j > *i){
return false;
}
++i;
++j;
}
return (i != x.end() && j == y.end());
}
template <class T, class Allocator>
bool operator>=(const list<T,Allocator>& x, const list<T,Allocator>& y){
typename list<T,Allocator>::const_iterator i = x.begin();
typename list<T,Allocator>::const_iterator j = y.begin();
while(i != x.end() && j != y.end()){
if( *i >= *j){
return true;
}
if(*j >= *i){
return false;
}
++i;
++j;
}
return (i != x.end() && j == y.end());
}
template <class T, class Allocator>
bool operator<=(const list<T,Allocator>& x, const list<T,Allocator>& y){
typename list<T,Allocator>::const_iterator i = x.begin();
typename list<T,Allocator>::const_iterator j = y.begin();
while(i != x.end() && j != y.end()){
if( *i <= *j){
return true;
}
if(*j <= *i){
return false;
}
++i;
++j;
}
return (i == x.end());
}
template <class T, class Allocator>
void swap(list<T,Allocator>& x, list<T,Allocator>& y){
x.swap(y);
}
}
#pragma GCC visibility pop
#endif

View File

@ -0,0 +1,83 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <basic_definitions>
#include <cstddef>
#include <string>
#ifndef __HEADER_STD_LOCALE
#define __HEADER_STD_LOCALE 1
#pragma GCC visibility push(default)
namespace std{
class _UCXXEXPORT locale {
public:
// types:
class facet;
class id;
typedef unsigned char category;
static const category
none = 0,
collate = 0x01, ctype = 0x02,
monetary = 0x04, numeric = 0x08,
time = 0x10, messages = 0x20,
all = collate | ctype | monetary | numeric | time | messages;
// construct/copy/destroy:
locale() throw(){
return;
}
locale(const locale& other) throw(){
(void)other;
return;
}
locale(const char *) throw(){
return;
}
~locale() throw(){
return;
}
const locale& operator=(const locale&) throw(){
return *this;
}
std::string name() const { return "C"; }
};
class _UCXXEXPORT locale::facet {
friend class locale;
explicit facet(size_t = 0){
return;
}
virtual ~facet(){
return;
}
};
class _UCXXEXPORT locale::id {
id(){ }
};
}
#pragma GCC visibility pop
#endif

View File

@ -0,0 +1,264 @@
/* Copyright (C) 2004-2007 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <memory>
#include <utility>
#include <iterator>
#include <associative_base>
#ifndef __STD_HEADER_MAP
#define __STD_HEADER_MAP
#pragma GCC visibility push(default)
namespace std{
template<class Key, class T, class Compare = less<Key>, class Allocator = allocator<T> > class map;
template<class Key, class T, class Compare = less<Key>, class Allocator = allocator<T> > class multimap;
//Compare the keys of the two items
/* template<class Key, class T, class Compare, class Allocator> class _UCXXEXPORT
__base_map<Key, T, Compare, Allocator>::value_compare : public binary_function<
typename map<Key, T, Compare, Allocator>::value_type,
typename map<Key, T, Compare, Allocator>::value_type,
bool>
{
friend class __base_map<Key, T, Compare, Allocator>;
protected:
Compare comp;
value_compare(Compare c) : comp(c) { }
~value_compare() { }
public:
bool operator()(const value_type& x, const value_type& y) const {
return comp(x.first, y.first);
}
};
*/
// value_compare value_comp() const;
/* This is the implementation for the map container. As noted above, it deviates
* from ISO spec by deriving from a base class in order to reduce code redundancy.
* More code could be reduced by convirting to virtual functions (thus allowing
* much of the erase and insert code to be duplicated), but that would deviate from
* the specifications too much to be worth the risk.
*/
//Implementation of map
template<class Key, class T, class Compare, class Allocator> class _UCXXEXPORT map
: public __single_associative<Key, pair<Key, T>, Compare, Allocator>
{
//Default value of allocator does not meet C++ standard specs, but it works for this library
//Deal with it
public:
typedef __single_associative<Key, pair<Key, T>, Compare, Allocator> base;
typedef T mapped_type;
typedef typename base::key_type key_type;
typedef typename base::value_type value_type;
typedef typename base::key_compare key_compare;
typedef typename base::allocator_type allocator_type;
typedef typename base::reference reference;
typedef typename base::const_reference const_reference;
typedef typename base::iterator iterator;
typedef typename base::const_iterator const_iterator;
typedef typename base::size_type size_type;
typedef typename base::difference_type difference_type;
typedef typename base::pointer pointer;
typedef typename base::const_pointer const_pointer;
typedef typename base::reverse_iterator reverse_iterator;
typedef typename base::const_reverse_iterator const_reverse_iterator;
static const key_type v_t_k(const value_type v){
return v.first;
}
// using base::value_compare;
explicit map(const Compare& comp = Compare(), const Allocator& al = Allocator())
: base(comp, al, v_t_k) { }
template <class InputIterator> map(InputIterator first, InputIterator last,
const Compare& comp = Compare(), const Allocator& al = Allocator())
: base(first, last, comp, al, v_t_k) { }
map(const map<Key,T,Compare,Allocator>& x) : base(x) { }
~map() { }
using base::operator=;
using base::operator==;
using base::operator!=;
using base::insert;
using base::erase;
using base::begin;
using base::end;
using base::rbegin;
using base::rend;
using base::empty;
using base::size;
using base::max_size;
using base::find;
using base::count;
using base::lower_bound;
using base::upper_bound;
using base::equal_range;
using base::swap;
reference operator[](const key_type& k){
iterator i = lower_bound(k);
if (i == end() || base::c(k, i->first)) {
i = insert(make_pair(k, T())).first;
}
return i->second;
}
protected:
using base::backing;
};
//Implementation of multimap
template<class Key, class T, class Compare, class Allocator> class _UCXXEXPORT multimap
: public __multi_associative<Key, pair<Key, T>, Compare, Allocator>
{
//Default value of allocator does not meet C++ standard specs, but it works for this library
//Deal with it
public:
typedef __multi_associative<Key, pair<Key, T>, Compare, Allocator> base;
typedef T mapped_type;
typedef typename base::key_type key_type;
typedef typename base::value_type value_type;
typedef typename base::key_compare key_compare;
typedef typename base::allocator_type allocator_type;
typedef typename base::reference reference;
typedef typename base::const_reference const_reference;
typedef typename base::iterator iterator;
typedef typename base::const_iterator const_iterator;
typedef typename base::size_type size_type;
typedef typename base::difference_type difference_type;
typedef typename base::pointer pointer;
typedef typename base::const_pointer const_pointer;
typedef typename base::reverse_iterator reverse_iterator;
typedef typename base::const_reverse_iterator const_reverse_iterator;
static const key_type v_t_k(const value_type v){
return v.first;
}
explicit multimap(const Compare& comp = Compare(), const Allocator& al = Allocator())
: base(comp, al, v_t_k) { }
template <class InputIterator> multimap(InputIterator first, InputIterator last,
const Compare& comp = Compare(), const Allocator& al = Allocator())
: base(first, last, comp, al, v_t_k) { }
multimap(const multimap<Key,T,Compare,Allocator>& x) : base(x) { }
~multimap() { }
using base::operator=;
using base::operator==;
using base::operator!=;
using base::insert;
using base::erase;
using base::begin;
using base::end;
using base::rbegin;
using base::rend;
using base::empty;
using base::size;
using base::max_size;
using base::find;
using base::count;
using base::lower_bound;
using base::upper_bound;
using base::equal_range;
using base::swap;
protected:
using base::c;
};
/* Non-member functions. These are at the end because they are not associated with any
particular class. These will be implemented as I figure out exactly what all of
them are supposed to do, and I have time.
*/
template <class Key, class T, class Compare, class Allocator> _UCXXEXPORT bool operator<
(const map<Key,T,Compare,Allocator>& x, const map<Key,T,Compare,Allocator>& y);
template <class Key, class T, class Compare, class Allocator> _UCXXEXPORT bool operator!=
(const map<Key,T,Compare,Allocator>& x, const map<Key,T,Compare,Allocator>& y);
template <class Key, class T, class Compare, class Allocator> _UCXXEXPORT bool operator>
(const map<Key,T,Compare,Allocator>& x, const map<Key,T,Compare,Allocator>& y);
template <class Key, class T, class Compare, class Allocator> _UCXXEXPORT bool operator>=
(const map<Key,T,Compare,Allocator>& x, const map<Key,T,Compare,Allocator>& y);
template <class Key, class T, class Compare, class Allocator> _UCXXEXPORT bool operator<=
(const map<Key,T,Compare,Allocator>& x, const map<Key,T,Compare,Allocator>& y);
template <class Key, class T, class Compare, class Allocator> _UCXXEXPORT void swap
(map<Key,T,Compare,Allocator>& x, map<Key,T,Compare,Allocator>& y);
template <class Key, class T, class Compare, class Allocator> _UCXXEXPORT bool operator==
(const multimap<Key,T,Compare,Allocator>& x, const multimap<Key,T,Compare,Allocator>& y);
template <class Key, class T, class Compare, class Allocator> _UCXXEXPORT bool operator<
(const multimap<Key,T,Compare,Allocator>& x, const multimap<Key,T,Compare,Allocator>& y);
template <class Key, class T, class Compare, class Allocator> _UCXXEXPORT bool operator!=
(const multimap<Key,T,Compare,Allocator>& x, const multimap<Key,T,Compare,Allocator>& y);
template <class Key, class T, class Compare, class Allocator> _UCXXEXPORT bool operator>
(const multimap<Key,T,Compare,Allocator>& x, const multimap<Key,T,Compare,Allocator>& y);
template <class Key, class T, class Compare, class Allocator> _UCXXEXPORT bool operator>=
(const multimap<Key,T,Compare,Allocator>& x, const multimap<Key,T,Compare,Allocator>& y);
template <class Key, class T, class Compare, class Allocator> _UCXXEXPORT bool operator<=
(const multimap<Key,T,Compare,Allocator>& x, const multimap<Key,T,Compare,Allocator>& y);
template <class Key, class T, class Compare, class Allocator> _UCXXEXPORT void swap
(multimap<Key,T,Compare,Allocator>& x, multimap<Key,T,Compare,Allocator>& y);
}
#pragma GCC visibility pop
#endif

View File

@ -0,0 +1,196 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <new>
#include <cstddef>
#include <cstdlib>
#include <iterator_base>
#include <utility>
#include <cstdio>
#ifndef HEADER_STD_MEMORY
#define HEADER_STD_MEMORY 1
#pragma GCC visibility push(default)
namespace std{
template <class T> class allocator;
// Specialize for void:
template <> class _UCXXEXPORT allocator<void> {
public:
typedef void* pointer;
typedef const void* const_pointer;
typedef void value_type;
template <class U> struct rebind { typedef allocator<U> other; };
};
template <class T> class _UCXXEXPORT allocator{
public:
typedef T value_type;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef T* pointer;
typedef const T* const_pointer;
typedef T& reference;
typedef const T& const_reference;
pointer address(reference r) const { return &r; }
const_pointer address(const_reference r) const { return &r; }
allocator() throw(){}
template <class U> allocator(const allocator<U>& ) throw();
~allocator() throw(){}
//Space for n Ts
pointer allocate(size_type n, typename allocator<void>::const_pointer = 0){
return (T*)(::operator new( n * sizeof(T) ));
}
void deallocate(pointer p, size_type){
::operator delete(p);
}
//Use placement new to engage the constructor
void construct(pointer p, const T& val) { new((void*)p) T(val); }
void destroy(pointer p){ ((T*)p)->~T(); } //Call destructor
size_type max_size() const throw();
template<class U> struct rebind { typedef allocator<U> other; };
};
template <class Out, class T> class _UCXXEXPORT raw_storage_iterator
: public iterator<output_iterator_tag, void, void, void, void>
{
Out p;
public:
explicit raw_storage_iterator(Out pp) : p (pp) { }
raw_storage_iterator & operator*() { return *this; }
raw_storage_iterator & operator=(const T& val) {
T* pp = &*p;
new(pp) T(val);
return *this;
}
raw_storage_iterator & operator++() { ++p; return *this; }
raw_storage_iterator operator++(int) {
raw_storage_iterator t = *this;
++p;
return t;
}
};
template <class T> _UCXXEXPORT pair<T*, ptrdiff_t> get_temporary_buffer(ptrdiff_t n){
pair<T*, ptrdiff_t> retval;
retval.first = static_cast<T*>(malloc(n * sizeof(T)));
if(retval.first == 0){
retval.second = 0;
}else{
retval.second = n;
}
return retval;
}
template <class T> _UCXXEXPORT void return_temporary_buffer(T* p){
free(p);
}
template <class T> class _UCXXEXPORT auto_ptr{
private:
T * object;
template <class Y> struct auto_ptr_ref{
Y * p;
};
public:
typedef T element_type;
explicit auto_ptr(T* p =0) throw() : object(p){ }
auto_ptr(auto_ptr& p) throw() : object(p.release()){ }
auto_ptr(auto_ptr_ref<T> r) throw() : object(r.p){
r.p = 0;
}
template<class Y> auto_ptr(auto_ptr<Y>& p) throw() : object(p.release()){ }
auto_ptr& operator=(auto_ptr& p) throw(){
if(&p == this){
return *this;
}
delete object;
object = p.release();
return *this;
}
template<class Y> auto_ptr& operator=(auto_ptr<Y>& p) throw(){
if(&p == this){
return *this;
}
delete object;
object = p.release();
return *this;
}
~auto_ptr(){
delete object;
}
T& operator*() const throw(){
return *object;
}
T* operator->() const throw(){
return object;
}
T* get() const throw(){
return object;
}
T* release() throw(){
T * temp(object);
object = 0;
return temp;
}
void reset(T * p=0) throw(){
if(p != object){
delete object;
object = p;
}
}
template<class Y> operator auto_ptr_ref<Y>() throw(){
auto_ptr_ref<Y> retval;
retval.p = object;
object = 0;
return retval;
}
template<class Y> operator auto_ptr<Y>() throw(){
auto_ptr<Y> retval(object);
object = 0;
return retval;
}
};
} //namespace std
#pragma GCC visibility pop
#endif

View File

@ -0,0 +1,64 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <basic_definitions>
#include <exception>
#include <cstddef>
#ifndef __STD_NEW_OPERATOR
#define __STD_NEW_OPERATOR 1
#pragma GCC visibility push(default)
namespace std{
class _UCXXEXPORT bad_alloc : public exception {};
struct _UCXXEXPORT nothrow_t {};
extern const nothrow_t nothrow;
typedef void (*new_handler)();
_UCXXEXPORT new_handler set_new_handler(new_handler new_p) throw();
}
_UCXXEXPORT void* operator new(std::size_t numBytes) throw(std::bad_alloc);
_UCXXEXPORT void operator delete(void* ptr) throw();
_UCXXEXPORT void* operator new[](std::size_t numBytes) throw(std::bad_alloc);
_UCXXEXPORT void operator delete[](void * ptr) throw();
#ifndef NO_NOTHROW
_UCXXEXPORT void* operator new(std::size_t numBytes, const std::nothrow_t& ) throw();
_UCXXEXPORT void operator delete(void* ptr, const std::nothrow_t& ) throw();
_UCXXEXPORT void* operator new[](std::size_t numBytes, const std::nothrow_t& ) throw();
_UCXXEXPORT void operator delete[](void* ptr, const std::nothrow_t& ) throw();
#endif
/* Placement operators */
inline void* operator new(std::size_t, void* ptr) throw() {return ptr; }
inline void operator delete(void* , void *) throw() { }
inline void* operator new[](std::size_t, void *p) throw() { return p; }
inline void operator delete[](void* , void *) throw() {}
#pragma GCC visibility pop
#endif

View File

@ -0,0 +1,161 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <basic_definitions>
#include <exception>
#ifndef __STD_NUMERIC_HEADER
#define __STD_NUMERIC_HEADER 1
#pragma GCC visibility push(default)
namespace std{
template <class InputIterator, class T> _UCXXEXPORT
T accumulate(InputIterator first, InputIterator last, T init)
{
while(first != last){
init = init + *first;
++first;
}
return init;
}
template <class InputIterator, class T, class BinaryOperation> _UCXXEXPORT
T accumulate(InputIterator first, InputIterator last, T init, BinaryOperation binary_op)
{
while(first != last){
init = binary_op(init, *first);
++first;
}
return init;
}
template <class InputIterator1, class InputIterator2, class T> _UCXXEXPORT
T inner_product(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, T init)
{
while(first1 != last1){
init = init + *first1 * *first2;
++first1;
++first2;
}
return init;
}
template <class InputIterator1, class InputIterator2, class T,
class BinaryOperation1, class BinaryOperation2> _UCXXEXPORT
T inner_product(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, T init,
BinaryOperation1 binary_op1,
BinaryOperation2 binary_op2)
{
while(first1 != last1){
init = binary_op1(init, binary_op2(*first1, *first2));
++first1;
++first2;
}
return init;
}
template <class InputIterator, class OutputIterator> _UCXXEXPORT
OutputIterator partial_sum(InputIterator first, InputIterator last,
OutputIterator result)
{
OutputIterator temp(result);
*result = *first;
++first;
++result;
while(first != last){
*result = *first + *temp;
temp = result;
++first;
++result;
}
return result;
}
template <class InputIterator, class OutputIterator, class BinaryOperation> _UCXXEXPORT
OutputIterator partial_sum(InputIterator first, InputIterator last,
OutputIterator result, BinaryOperation binary_op)
{
OutputIterator temp(result);
*result = *first;
++first;
++result;
while(first != last){
*result = binary_op(*first, *temp);
temp = result;
++first;
++result;
}
return result;
}
template <class InputIterator, class OutputIterator> _UCXXEXPORT
OutputIterator
adjacent_difference(InputIterator first, InputIterator last,
OutputIterator result)
{
OutputIterator temp(first);
*result = *first;
++first;
++result;
while(first != last){
*result = *first - *temp;
temp = first;
++first;
++result;
}
return result;
}
template <class InputIterator, class OutputIterator, class BinaryOperation> _UCXXEXPORT
OutputIterator
adjacent_difference(InputIterator first, InputIterator last,
OutputIterator result, BinaryOperation binary_op)
{
OutputIterator temp(first);
*result = *first;
++first;
++result;
while(first != last){
*result = binary_op(*first, *temp);
temp = first;
++first;
++result;
}
return result;
}
}
#pragma GCC visibility pop
#endif

View File

@ -0,0 +1,510 @@
/* Copyright (C) 2004-2008 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <basic_definitions>
#ifndef STD_HEADER_OSTREAM
#define STD_HEADER_OSTREAM 1
#include <iosfwd>
#include <streambuf>
#include <cstdio>
#include <ios>
#include <ostream_helpers>
#pragma GCC visibility push(default)
namespace std {
template <class charT, class traits > class basic_ostream;
typedef basic_ostream<char> ostream;
#ifdef __UCLIBCXX_HAS_WCHAR__
typedef basic_ostream<wchar_t> wostream;
#endif
template <class charT, class traits> basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os);
template <class charT, class traits> basic_ostream<charT,traits>& ends(basic_ostream<charT,traits>& os);
template <class charT, class traits> basic_ostream<charT,traits>& flush(basic_ostream<charT,traits>& os);
template <class charT, class traits > class _UCXXEXPORT basic_ostream
: virtual public basic_ios<charT,traits>
{
public:
typedef charT char_type;
typedef typename traits::int_type int_type;
typedef typename traits::pos_type pos_type;
typedef typename traits::off_type off_type;
typedef traits traits_type;
_UCXXEXPORT basic_ostream(basic_streambuf<charT,traits>* sb)
: basic_ios<charT, traits>(sb)
{
basic_ios<charT,traits>::init(sb);
}
virtual _UCXXEXPORT ~basic_ostream();
class sentry;
_UCXXEXPORT basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>& (*pf)(basic_ostream<charT,traits>&)){
return pf(*this);
}
_UCXXEXPORT basic_ostream<charT,traits>& operator<<(basic_ios<charT,traits>& (*pf)(basic_ios<charT,traits>&)){
pf(*this);
return *this;
}
_UCXXEXPORT basic_ostream<charT,traits>& operator<<(ios_base& (*pf)(ios_base&)){
pf(*this);
return *this;
}
basic_ostream<charT,traits>& operator<<(bool n);
basic_ostream<charT,traits>& operator<<(short n);
basic_ostream<charT,traits>& operator<<(unsigned short n);
basic_ostream<charT,traits>& operator<<(int n);
basic_ostream<charT,traits>& operator<<(unsigned int n);
basic_ostream<charT,traits>& operator<<(long n);
basic_ostream<charT,traits>& operator<<(unsigned long n);
basic_ostream<charT,traits>& operator<<(float f);
basic_ostream<charT,traits>& operator<<(double f);
basic_ostream<charT,traits>& operator<<(long double f);
basic_ostream<charT,traits>& operator<<(void* p);
basic_ostream<charT,traits>& operator<<(basic_streambuf<char_type,traits>* sb);
_UCXXEXPORT basic_ostream<charT,traits>& put(char_type c){
if(basic_ostream<charT,traits>::traits_type::eq_int_type(
basic_ios<charT, traits>::mstreambuf->sputc(c),
basic_ostream<charT,traits>::traits_type::eof()))
{
basic_ios<charT,traits>::setstate(ios_base::eofbit);
}
return *this;
}
_UCXXEXPORT basic_ostream<charT,traits>& write(const char_type* s, streamsize n){
if(basic_ostream<charT,traits>::traits_type::eq_int_type(
basic_ios<charT, traits>::mstreambuf->sputn(s, n),
basic_ostream<charT,traits>::traits_type::eof())
){
basic_ios<charT,traits>::setstate(ios_base::eofbit);
}
return *this;
}
_UCXXEXPORT basic_ostream<charT,traits>& flush(){
if(basic_ios<charT, traits>::mstreambuf->pubsync() == -1){
basic_ios<charT,traits>::setstate(ios_base::badbit);
}
return *this;
}
_UCXXEXPORT pos_type tellp(){
if(basic_ios<charT,traits>::fail() != false){
return pos_type(-1);
}
return basic_ios<charT,traits>::rdbuf()->pubseekoff(0, ios_base::cur, ios_base::out);
}
_UCXXEXPORT basic_ostream<charT,traits>& seekp(pos_type pos){
if( basic_ios<charT,traits>::fail() != true ){
basic_ios<charT,traits>::rdbuf()->pubseekpos(pos);
}
return *this;
}
_UCXXEXPORT basic_ostream<charT,traits>& seekp(off_type off, ios_base::seekdir dir){
if( basic_ios<charT,traits>::fail() != true){
basic_ios<charT,traits>::rdbuf()->pubseekoff(off, dir);
}
return *this;
}
_UCXXEXPORT void printout(const char_type* s, streamsize n){
//david
streamsize extra = ios::width() - n;
if ((ios::flags()&ios::adjustfield) == ios::right){
while (extra > 0) {
--extra;
put(ios::fill());
}
}
write(s, n);
if ((ios::flags()&ios::adjustfield) == ios::left) {
while (extra > 0) {
--extra;
put(ios::fill());
}
}
// Width value only applies for the next output operation. Reset to zero.
ios::width(0);
}
protected:
basic_ostream(const basic_ostream<charT,traits> &){ }
basic_ostream<charT,traits> & operator=(const basic_ostream<charT,traits> &){ return *this; }
};
//Implementations of template functions. To allow for partial specialization
template <class charT, class traits> _UCXXEXPORT basic_ostream<charT,traits>::~basic_ostream(){ }
template <class charT, class traits> _UCXXEXPORT basic_ostream<charT,traits>& basic_ostream<charT, traits>::operator<<(bool n){
sentry s(*this);
if( basic_ios<charT,traits>::flags() & ios_base::boolalpha){
if(n){
printout("true", 4);
}else{
printout("false", 5);
}
}else{
if(n){
printout("1", 1);
}else{
printout("0", 1);
}
}
if(basic_ios<charT,traits>::flags() & ios_base::unitbuf){
flush();
}
return *this;
}
template <class charT, class traits> _UCXXEXPORT basic_ostream<charT,traits>&
basic_ostream<charT, traits>::operator<<(unsigned short n){
sentry s(*this);
__ostream_printout<traits, charT, unsigned long int>::printout(*this, n);
return *this;
}
template <class charT, class traits> _UCXXEXPORT basic_ostream<charT,traits>& basic_ostream<charT, traits>::operator<<(short n){
sentry s(*this);
__ostream_printout<traits, charT, long int>::printout(*this, n);
return *this;
}
template <class charT, class traits> _UCXXEXPORT basic_ostream<charT,traits>& basic_ostream<charT, traits>::operator<<(int n){
sentry s(*this);
__ostream_printout<traits, charT, long int>::printout(*this, n);
return *this;
}
template <class charT, class traits> _UCXXEXPORT basic_ostream<charT,traits>& basic_ostream<charT, traits>::operator<<(unsigned int n){
sentry s(*this);
__ostream_printout<traits, charT, unsigned long int>::printout(*this, n);
return *this;
}
template <class charT, class traits> _UCXXEXPORT basic_ostream<charT,traits>& basic_ostream<charT, traits>::operator<<(long n){
sentry s(*this);
__ostream_printout<traits, charT, long >::printout(*this, n);
return *this;
}
template <class charT, class traits> _UCXXEXPORT basic_ostream<charT,traits>&
basic_ostream<charT, traits>::operator<<(unsigned long n)
{
sentry s(*this);
__ostream_printout<traits, charT, unsigned long >::printout(*this, n);
return *this;
}
template <class charT, class traits> _UCXXEXPORT basic_ostream<charT,traits>& basic_ostream<charT, traits>::operator<<(float f){
sentry s(*this);
__ostream_printout<traits, charT, double >::printout(*this, f);
return *this;
}
template <class charT, class traits> _UCXXEXPORT basic_ostream<charT,traits>& basic_ostream<charT, traits>::operator<<(double f){
sentry s(*this);
__ostream_printout<traits, charT, double >::printout(*this, f);
return *this;
}
template <class charT, class traits> _UCXXEXPORT basic_ostream<charT,traits>& basic_ostream<charT, traits>::operator<<(long double f){
sentry s(*this);
__ostream_printout<traits, charT, long double >::printout(*this, f);
return *this;
}
template <class charT, class traits> _UCXXEXPORT basic_ostream<charT,traits>& basic_ostream<charT, traits>::operator<<(void* p){
sentry s(*this);
char buffer[20];
printout(buffer, snprintf(buffer, 20, "%p", p) );
if(basic_ios<charT,traits>::flags() & ios_base::unitbuf){
flush();
}
return *this;
}
template <class charT, class traits> _UCXXEXPORT basic_ostream<charT,traits>&
basic_ostream<charT, traits>::operator<<(basic_streambuf<charT,traits>* sb)
{
sentry s(*this);
if(sb == 0){
basic_ios<charT,traits>::setstate(ios_base::badbit);
return *this;
}
typename traits::int_type c;
while(basic_ios<charT,traits>::good() && (c = sb->sbumpc()) != traits::eof() ){
put(c);
}
if(basic_ios<charT,traits>::flags() & ios_base::unitbuf){
flush();
}
return *this;
}
/*Template Specializations*/
#ifdef __UCLIBCXX_EXPAND_OSTREAM_CHAR__
#ifndef __UCLIBCXX_COMPILE_OSTREAM__
#ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
template <> _UCXXEXPORT ostream::~basic_ostream();
#endif // __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
template <> _UCXXEXPORT ostream & ostream::flush();
template <> _UCXXEXPORT ostream & ostream::operator<<(bool n);
template <> _UCXXEXPORT ostream & ostream::operator<<(short int n);
template <> _UCXXEXPORT ostream & ostream::operator<<(unsigned short int n);
template <> _UCXXEXPORT ostream & ostream::operator<<(int n);
template <> _UCXXEXPORT ostream & ostream::operator<<(unsigned int n);
template <> _UCXXEXPORT ostream & ostream::operator<<(long n);
template <> _UCXXEXPORT ostream & ostream::operator<<(unsigned long n);
template <> _UCXXEXPORT ostream & ostream::operator<<(float f);
template <> _UCXXEXPORT ostream & ostream::operator<<(double f);
template <> _UCXXEXPORT ostream & ostream::operator<<(long double f);
template <> _UCXXEXPORT ostream & ostream::operator<<(void* p);
template <> _UCXXEXPORT ostream & ostream::operator<<(basic_streambuf<char, char_traits<char> >* sb);
#endif
#endif
template <class charT,class traits = char_traits<charT> >
class _UCXXEXPORT basic_ostream<charT,traits>::sentry
{
bool ok;
public:
explicit _UCXXEXPORT sentry(basic_ostream<charT,traits>& os): ok(true){
//david
if(os.good() !=0){ //Prepare for output
}
//Flush any tied buffer
if(os.tie() !=0 ){
os.tie()->flush();
}
}
_UCXXEXPORT ~sentry() { }
_UCXXEXPORT operator bool() {
return ok;
}
};
#ifdef __UCLIBCXX_EXPAND_OSTREAM_CHAR__
#ifndef __UCLIBCXX_COMPILE_OSTREAM__
#ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
template <> _UCXXEXPORT ostream::sentry::sentry(ostream & os);
template <> _UCXXEXPORT ostream::sentry::~sentry();
#endif //__UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
#endif
#endif
//Non - class functions
template<class charT, class traits> _UCXXEXPORT basic_ostream<charT,traits>&
operator<<(basic_ostream<charT,traits>& out, charT c)
{
typename basic_ostream<charT,traits>::sentry s(out);
out.put(c);
return out;
}
template<class charT, class traits> _UCXXEXPORT basic_ostream<charT,traits>&
operator<<(basic_ostream<charT,traits>& out, char c)
{
typename basic_ostream<charT,traits>::sentry s(out);
out.put(c);
return out;
}
template<class traits> _UCXXEXPORT basic_ostream<char,traits>&
operator<<(basic_ostream<char,traits>& out, char c)
{
typename basic_ostream<char,traits>::sentry s(out);
out.put(c);
return out;
}
// signed and unsigned
template<class traits> _UCXXEXPORT basic_ostream<char,traits>&
operator<<(basic_ostream<char,traits>& out, signed char c)
{
typename basic_ostream<char,traits>::sentry s(out);
out.put(c);
return out;
}
template<class traits> _UCXXEXPORT basic_ostream<char,traits>&
operator<<(basic_ostream<char,traits>& out, unsigned char c)
{
typename basic_ostream<char,traits>::sentry s(out);
out.put(c);
return out;
}
template<class charT, class traits> _UCXXEXPORT basic_ostream<charT,traits>&
operator<<(basic_ostream<charT,traits>& out, const charT* c)
{
typename basic_ostream<charT,traits>::sentry s(out);
out.printout(c, traits::length(c) );
return out;
}
template<class charT, class traits> _UCXXEXPORT basic_ostream<charT,traits>&
operator<<(basic_ostream<charT,traits>& out, const char* c)
{
typename basic_ostream<charT,traits>::sentry s(out);
out.printout(c, char_traits<char>::length(c) );
return out;
}
//david
// partial specializations
template<class traits> _UCXXEXPORT basic_ostream<char,traits>&
operator<<(basic_ostream<char,traits>& out, const char* c)
{
//add by david
/* printf("hello\n");
int i;
for(i=0;i<traits::length(c);i++)
printf("%c",*(c+i));
traits::length(c);*/
typename basic_ostream<char,traits>::sentry s(out);
out.printout(c, traits::length(c));
return out;
}
#ifdef __UCLIBCXX_HAS_WCHAR__
template<class traits> _UCXXEXPORT basic_ostream<wchar_t,traits>&
operator<<(basic_ostream<wchar_t,traits>& out, const char* c)
{
typename basic_ostream<wchar_t, traits>::sentry s(out);
size_t numChars = char_traits<char>::length(c);
wchar_t * temp = new wchar_t[numChars];
for(size_t i=0; i < numChars; ++i){
temp[i] = out.widen(c[i]);
}
out.printout(temp, numChars);
return out;
}
#endif
// signed and unsigned
template<class traits> _UCXXEXPORT basic_ostream<char,traits>&
operator<<(basic_ostream<char,traits>& out, const signed char* c)
{
typename basic_ostream<char,traits>::sentry s(out);
out.printout(reinterpret_cast<const char *>(c), traits::length( reinterpret_cast<const char *>(c)));
return out;
}
template<class traits> _UCXXEXPORT basic_ostream<char,traits>&
operator<<(basic_ostream<char,traits>& out, const unsigned char* c)
{
typename basic_ostream<char,traits>::sentry s(out);
out.printout(reinterpret_cast<const char *>(c), traits::length( reinterpret_cast<const char *>(c)));
return out;
}
template <class charT, class traits> _UCXXEXPORT basic_ostream<charT,traits>&
endl(basic_ostream<charT,traits>& os)
{
typename basic_ostream<charT,traits>::sentry s(os);
os.put('\n');
os.flush();
return os;
}
template <class charT, class traits> _UCXXEXPORT basic_ostream<charT,traits>&
ends(basic_ostream<charT,traits>& os)
{
typename basic_ostream<charT,traits>::sentry s(os);
os.put(traits::eos());
return os;
}
template <class charT, class traits> _UCXXEXPORT basic_ostream<charT,traits>& flush(basic_ostream<charT,traits>& os){
typename basic_ostream<charT,traits>::sentry s(os);
os.flush();
return os;
}
#ifdef __UCLIBCXX_EXPAND_OSTREAM_CHAR__
#ifndef __UCLIBCXX_COMPILE_OSTREAM__
template <> _UCXXEXPORT ostream & endl(ostream & os);
template <> _UCXXEXPORT ostream & flush(ostream & os);
template <> _UCXXEXPORT ostream & operator<<(ostream & out, char c);
template <> _UCXXEXPORT ostream & operator<<(ostream & out, const char* c);
template <> _UCXXEXPORT ostream & operator<<(ostream & out, unsigned char c);
template <> _UCXXEXPORT ostream & operator<<(ostream & out, unsigned const char* c);
#endif
#endif
#ifndef __STRICT_ANSI__
//Support for output of long long data types
template<class Ch, class Tr> _UCXXEXPORT basic_ostream<Ch, Tr>&
operator<<(basic_ostream<Ch, Tr>& os, signed long long int i)
{
typename basic_ostream<Ch, Tr>::sentry s(os);
__ostream_printout<Tr, Ch, signed long long int>::printout(os, i);
return os;
}
template<class Ch, class Tr> _UCXXEXPORT basic_ostream<Ch, Tr>&
operator<<(basic_ostream<Ch, Tr>& os, unsigned long long int i)
{
typename basic_ostream<Ch, Tr>::sentry s(os);
__ostream_printout<Tr, Ch, unsigned long long int>::printout(os, i);
return os;
}
#endif //__STRICT_ANSI__
}
#pragma GCC visibility pop
#endif

View File

@ -0,0 +1,491 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <basic_definitions>
#include <cstddef>
#include <ios>
#include <cctype>
#include <string>
#include <stdio.h>
#ifndef __STD_HEADER_OSTREAM_HELPERS
#define __STD_HEADER_OSTREAM_HELPERS 1
#pragma GCC visibility push(default)
namespace std{
/* We are making the following template class for serveral reasons. Firstly,
* we want to keep the main ostream code neat and tidy. Secondly, we want it
* to be easy to do partial specialization of the ostream code so that it can
* be expanded and put into the library. This will allow us to make application
* code smaller at the expense of increased library size. This is a fair
* trade-off when there are multiple applications being compiled. Also, this
* feature will be used optionally via configuration options. It will also
* allow us to keep the code bases in sync, dramatically simplifying the
* maintenance required. We specialized for char because wchar and others
* require different scanf functions
*/
template <class traits, class charT, class dataType> class _UCXXEXPORT __ostream_printout{
public:
static void printout(basic_ostream<charT,traits>& stream, const dataType n);
};
template <class traits> class _UCXXEXPORT __ostream_printout<traits, char, signed long int>{
public:
static void printout(basic_ostream<char, traits >& stream, const signed long int n)
{
char buffer[20];
const char * c_ld = "%ld";
const char * c_lo = "%lo";
const char * c_lX = "%lX";
const char * c_lx = "%lx";
const char * c_hashlo = "%#lo";
const char * c_hashlX = "%#lX";
const char * c_hashlx = "%#lx";
const char * formatString=0;
if( stream.flags() & ios_base::dec){
formatString = c_ld;
}else if( stream.flags() & ios_base::oct){
if( stream.flags() & ios_base::showbase){
formatString = c_hashlo;
}else{
formatString = c_lo;
}
}else if (stream.flags() & ios_base::hex){
if(stream.flags() & ios_base::showbase){
if(stream.flags() & ios_base::uppercase){
formatString = c_hashlX;
}else{
formatString = c_hashlx;
}
}else{
if(stream.flags() & ios_base::uppercase){
formatString = c_lX;
}else{
formatString = c_lx;
}
}
}
stream.printout(buffer, snprintf(buffer, 20, formatString, n) );
if(stream.flags() & ios_base::unitbuf){
stream.flush();
}
}
};
template <class traits> class _UCXXEXPORT __ostream_printout<traits, char, unsigned long int>{
public:
static void printout(basic_ostream<char, traits >& stream, const unsigned long int n)
{
char buffer[20];
const char * c_lo = "%lo";
const char * c_lu = "%lu";
const char * c_lX = "%lX";
const char * c_lx = "%lx";
const char * c_hashlo = "%#lo";
const char * c_hashlX = "%#lX";
const char * c_hashlx = "%#lx";
const char * formatString=0;
if( stream.flags() & ios_base::dec){
formatString = c_lu;
}else if( stream.flags() & ios_base::oct){
if( stream.flags() & ios_base::showbase){
formatString = c_hashlo;
}else{
formatString = c_lo;
}
}else if (stream.flags() & ios_base::hex){
if(stream.flags() & ios_base::showbase){
if(stream.flags() & ios_base::uppercase){
formatString = c_hashlX;
}else{
formatString = c_hashlx;
}
}else{
if(stream.flags() & ios_base::uppercase){
formatString = c_lX;
}else{
formatString = c_lx;
}
}
}
stream.printout(buffer, snprintf(buffer, 20, formatString, n));
if(stream.flags() & ios_base::unitbuf){
stream.flush();
}
}
};
#ifndef __STRICT_ANSI__
template <class traits> class _UCXXEXPORT __ostream_printout<traits, char, signed long long int>{
public:
static void printout(basic_ostream<char, traits >& stream, const signed long long int n)
{
char buffer[28];
const char * lld = "%lld";
const char * llo = "%llo";
const char * llX = "%llX";
const char * llx = "%llx";
const char * hashllo = "%#llo";
const char * hashllX = "%#llX";
const char * hashllx = "%#llx";
const char * formatString=0;
if( stream.flags() & ios_base::dec){
formatString = lld;
}else if( stream.flags() & ios_base::oct){
if( stream.flags() & ios_base::showbase){
formatString = hashllo;
}else{
formatString = llo;
}
}else if (stream.flags() & ios_base::hex){
if(stream.flags() & ios_base::showbase){
if(stream.flags() & ios_base::uppercase){
formatString = hashllX;
}else{
formatString = hashllx;
}
}else{
if(stream.flags() & ios_base::uppercase){
formatString = llX;
}else{
formatString = llx;
}
}
}
stream.printout(buffer, snprintf(buffer, 27, formatString, n) );
if(stream.flags() & ios_base::unitbuf){
stream.flush();
}
}
};
template <class traits> class _UCXXEXPORT __ostream_printout<traits, char, unsigned long long int>{
public:
static void printout(basic_ostream<char, traits >& stream, const unsigned long long int n)
{
char buffer[28];
const char * llo = "%llo";
const char * llu = "%llu";
const char * llX = "%llX";
const char * llx = "%llx";
const char * hashllo = "%#llo";
const char * hashllX = "%#llX";
const char * hashllx = "%#llx";
const char * formatString=0;
if( stream.flags() & ios_base::dec){
formatString = llu;
}else if( stream.flags() & ios_base::oct){
if( stream.flags() & ios_base::showbase){
formatString = hashllo;
}else{
formatString = llo;
}
}else if (stream.flags() & ios_base::hex){
if(stream.flags() & ios_base::showbase){
if(stream.flags() & ios_base::uppercase){
formatString = hashllX;
}else{
formatString = hashllx;
}
}else{
if(stream.flags() & ios_base::uppercase){
formatString = llX;
}else{
formatString = llx;
}
}
}
stream.printout(buffer, snprintf(buffer, 27, formatString, n) );
if(stream.flags() & ios_base::unitbuf){
stream.flush();
}
}
};
#endif //__STRICT_ANSI__
template <class traits> class _UCXXEXPORT __ostream_printout<traits, char, double>{
public:
static void printout(basic_ostream<char, traits >& stream, const double f)
{
char buffer[32];
int length;
if(stream.flags() & ios_base::scientific){
if(stream.flags() & ios_base::uppercase){
length = snprintf(buffer, 32, "%*.*E", static_cast<int>(stream.width()),static_cast<int>(stream.precision()), f);
}else{
length = snprintf(buffer, 32, "%*.*e", static_cast<int>(stream.width()),static_cast<int>(stream.precision()), f);
}
} else if(stream.flags() & ios_base::fixed){
length = snprintf(buffer, 32, "%*.*f",static_cast<int>(stream.width()),static_cast<int>(stream.precision()), f);
} else {
length = snprintf(buffer, 32, "%*.*g",static_cast<int>(stream.width()),static_cast<int>(stream.precision()), f);
}
stream.printout(buffer, length);
if(stream.flags() & ios_base::unitbuf){
stream.flush();
}
}
};
template <class traits> class _UCXXEXPORT __ostream_printout<traits, char, long double>{
public:
static void printout(basic_ostream<char, traits >& stream, const long double f)
{
char buffer[32];
int length;
if(stream.flags() & ios_base::scientific){
if(stream.flags() & ios_base::uppercase){
length = snprintf(buffer, 32, "%*.*LE", static_cast<int>(stream.width()), static_cast<int>(stream.precision()), f);
}else{
length = snprintf(buffer, 32, "%*.*Le", static_cast<int>(stream.width()), static_cast<int>(stream.precision()), f);
}
} else if(stream.flags() & ios_base::fixed){
length = snprintf(buffer, 32, "%*.*Lf", static_cast<int>(stream.width()), static_cast<int>(stream.precision()), f);
} else {
length = snprintf(buffer, 32, "%*.*Lg", static_cast<int>(stream.width()), static_cast<int>(stream.precision()), f);
}
stream.printout(buffer, length);
if(stream.flags() & ios_base::unitbuf){
stream.flush();
}
}
};
#ifdef __UCLIBCXX_HAS_WCHAR__
template <class traits> class _UCXXEXPORT __ostream_printout<traits, wchar_t, signed long int>{
public:
static void printout(basic_ostream<wchar_t, traits >& stream, const signed long int n)
{
wchar_t buffer[20];
if( stream.flags() & ios_base::dec){
stream.printout(buffer, swprintf(buffer, 20, L"%ld", n));
}else if( stream.flags() & ios_base::oct){
if( stream.flags() & ios_base::showbase){
stream.printout(buffer, swprintf(buffer, 20, L"%#lo", n));
}else{
stream.printout(buffer, swprintf(buffer, 20, L"%lo", n) );
}
}else if (stream.flags() & ios_base::hex){
if(stream.flags() & ios_base::showbase){
if(stream.flags() & ios_base::uppercase){
stream.printout(buffer, swprintf(buffer, 20, L"%#lX", n) );
}else{
stream.printout(buffer, swprintf(buffer, 20, L"%#lx", n) );
}
}else{
if(stream.flags() & ios_base::uppercase){
stream.printout(buffer, swprintf(buffer, 20, L"%lX", n) );
}else{
stream.printout(buffer, swprintf(buffer, 20, L"%lx", n) );
}
}
}
if(stream.flags() & ios_base::unitbuf){
stream.flush();
}
}
};
template <class traits> class _UCXXEXPORT __ostream_printout<traits, wchar_t, unsigned long int>{
public:
static void printout(basic_ostream<wchar_t, traits >& stream, const unsigned long int n)
{
wchar_t buffer[20];
if( stream.flags() & ios_base::dec){
stream.printout(buffer, swprintf(buffer, 20, L"%lu", n));
}else if( stream.flags() & ios_base::oct){
if( stream.flags() & ios_base::showbase){
stream.printout(buffer, swprintf(buffer, 20, L"%#lo", n));
}else{
stream.printout(buffer, swprintf(buffer, 20, L"%lo", n) );
}
}else if (stream.flags() & ios_base::hex){
if(stream.flags() & ios_base::showbase){
if(stream.flags() & ios_base::uppercase){
stream.printout(buffer, swprintf(buffer, 20, L"%#lX", n) );
}else{
stream.printout(buffer, swprintf(buffer, 20, L"%#lx", n) );
}
}else{
if(stream.flags() & ios_base::uppercase){
stream.printout(buffer, swprintf(buffer, 20, L"%lX", n) );
}else{
stream.printout(buffer, swprintf(buffer, 20, L"%lx", n) );
}
}
}
if(stream.flags() & ios_base::unitbuf){
stream.flush();
}
}
};
#ifndef __STRICT_ANSI__
template <class traits> class _UCXXEXPORT __ostream_printout<traits, wchar_t, signed long long int>{
public:
static void printout(basic_ostream<wchar_t, traits >& stream, const signed long long int n)
{
wchar_t buffer[28];
if( stream.flags() & ios_base::dec){
stream.printout(buffer, swprintf(buffer, 27, L"%lld", n));
}else if( stream.flags() & ios_base::oct){
if( stream.flags() & ios_base::showbase){
stream.printout(buffer, swprintf(buffer, 27, L"%#llo", n));
}else{
stream.printout(buffer, swprintf(buffer, 27, L"%llo", n) );
}
}else if (stream.flags() & ios_base::hex){
if(stream.flags() & ios_base::showbase){
if(stream.flags() & ios_base::uppercase){
stream.printout(buffer, swprintf(buffer, 27, L"%#llX", n) );
}else{
stream.printout(buffer, swprintf(buffer, 27, L"%#llx", n) );
}
}else{
if(stream.flags() & ios_base::uppercase){
stream.printout(buffer, swprintf(buffer, 27, L"%llX", n) );
}else{
stream.printout(buffer, swprintf(buffer, 27, L"%llx", n) );
}
}
}
if(stream.flags() & ios_base::unitbuf){
stream.flush();
}
}
};
template <class traits> class _UCXXEXPORT __ostream_printout<traits, wchar_t, unsigned long long int>{
public:
static void printout(basic_ostream<wchar_t, traits >& stream, const unsigned long long int n)
{
wchar_t buffer[28];
if( stream.flags() & ios_base::dec){
stream.printout(buffer, swprintf(buffer, 27, L"%llu", n));
}else if( stream.flags() & ios_base::oct){
if( stream.flags() & ios_base::showbase){
stream.printout(buffer, swprintf(buffer, 27, L"%#llo", n));
}else{
stream.printout(buffer, swprintf(buffer, 27, L"%llo", n) );
}
}else if (stream.flags() & ios_base::hex){
if(stream.flags() & ios_base::showbase){
if(stream.flags() & ios_base::uppercase){
stream.printout(buffer, swprintf(buffer, 27, L"%#llX", n) );
}else{
stream.printout(buffer, swprintf(buffer, 27, L"%#llx", n) );
}
}else{
if(stream.flags() & ios_base::uppercase){
stream.printout(buffer, swprintf(buffer, 27, L"%llX", n) );
}else{
stream.printout(buffer, swprintf(buffer, 27, L"%llx", n) );
}
}
}
if(stream.flags() & ios_base::unitbuf){
stream.flush();
}
}
};
#endif //__STRICT_ANSI__
template <class traits> class _UCXXEXPORT __ostream_printout<traits, wchar_t, double>{
public:
static void printout(basic_ostream<wchar_t, traits >& stream, const double f)
{
wchar_t buffer[32];
wchar_t format_string[32];
if(stream.flags() & ios_base::scientific){
if(stream.flags() & ios_base::uppercase){
swprintf(format_string, 32, L"%%%u.%uE", static_cast<int>(stream.width()), static_cast<unsigned int>(stream.precision()));
}else{
swprintf(format_string, 32, L"%%%u.%ue", static_cast<int>(stream.width()), static_cast<unsigned int>(stream.precision()));
}
} else if(stream.flags() & ios_base::fixed){
swprintf(format_string, 32, L"%%%u.%uf", static_cast<int>(stream.width()), static_cast<unsigned int>(stream.precision()));
} else {
swprintf(format_string, 32, L"%%%u.%ug", static_cast<int>(stream.width()), static_cast<unsigned int>(stream.precision()));
}
stream.printout(buffer, swprintf(buffer, 32, format_string, f) );
if(stream.flags() & ios_base::unitbuf){
stream.flush();
}
}
};
template <class traits> class _UCXXEXPORT __ostream_printout<traits, wchar_t, long double>{
public:
static void printout(basic_ostream<wchar_t, traits >& stream, const long double f)
{
wchar_t buffer[32];
wchar_t format_string[32];
if(stream.flags() & ios_base::scientific){
if(stream.flags() & ios_base::uppercase){
swprintf(format_string, 32, L"%%%u.%uLE", static_cast<unsigned int>(stream.width()), static_cast<unsigned int>(stream.precision()));
}else{
swprintf(format_string, 32, L"%%%u.%uLe", static_cast<unsigned int>(stream.width()), static_cast<unsigned int>(stream.precision()));
}
} else if(stream.flags() & ios_base::fixed){
swprintf(format_string, 32, L"%%%u.%uLf", static_cast<unsigned int>(stream.width()), static_cast<unsigned int>(stream.precision()));
} else {
swprintf(format_string, 32, L"%%%u.%uLg", static_cast<unsigned int>(stream.width()), static_cast<unsigned int>(stream.precision()));
}
stream.printout(buffer, swprintf(buffer, 32, format_string, f) );
if(stream.flags() & ios_base::unitbuf){
stream.flush();
}
}
};
#endif //__UCLIBCXX_HAS_WCHAR__
}
#pragma GCC visibility pop
#endif

View File

@ -0,0 +1,126 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <basic_definitions>
#include <deque>
#include <vector>
#include <functional>
#ifndef __HEADER_STD_QUEUE
#define __HEADER_STD_QUEUE 1
#pragma GCC visibility push(default)
namespace std{
template <class T, class Container = deque<T> > class _UCXXEXPORT queue{
protected:
Container c;
public:
typedef typename Container::value_type value_type;
typedef typename Container::size_type size_type;
typedef Container container_type;
explicit queue(const Container& a = Container()) : c(a) { }
bool empty() const { return c.empty(); }
size_type size() const { return c.size(); }
value_type& front() { return c.front(); }
const value_type& front() const { return c.front(); }
value_type& back() { return c.back(); }
const value_type& back() const { return c.back(); }
void push(const value_type& x) { c.push_back(x); }
void pop() { c.pop_front(); }
};
template <class T, class Container> _UCXXEXPORT bool
operator==(const queue<T, Container>& x, const queue<T, Container>& y)
{
return (x.c == y.c);
}
template <class T, class Container> _UCXXEXPORT bool
operator< (const queue<T, Container>& x, const queue<T, Container>& y)
{
return (x.c < y.c);
}
template <class T, class Container> _UCXXEXPORT bool
operator!=(const queue<T, Container>& x, const queue<T, Container>& y)
{
return (x.c != y.c);
}
template <class T, class Container> _UCXXEXPORT bool
operator> (const queue<T, Container>& x, const queue<T, Container>& y)
{
return (x.c > y.c);
}
template <class T, class Container> _UCXXEXPORT bool
operator>=(const queue<T, Container>& x, const queue<T, Container>& y)
{
return (x.c >= y.c);
}
template <class T, class Container> _UCXXEXPORT bool
operator<=(const queue<T, Container>& x, const queue<T, Container>& y)
{
return (x.c <= y.c);
}
template <class T,
class Container = vector<T>,
class Compare = less<typename Container::value_type>
> class _UCXXEXPORT priority_queue {
protected:
Container c;
Compare comp;
public:
typedef typename Container::value_type value_type;
typedef typename Container::size_type size_type;
typedef Container container_type;
explicit priority_queue(const Compare& x = Compare(), const Container& a = Container())
: c(a), comp(x) { make_heap(c.begin(), c.end(), comp) ; }
template <class InputIterator> priority_queue(InputIterator first,
InputIterator last,
const Compare& x = Compare(),
const Container& y= Container())
: c(y), comp(c)
{
c.insert(c.end(), first, last);
make_heap(c.begin(), c.end(), comp);
}
bool empty() const { return c.empty(); }
size_type size() const { return c.size(); }
const value_type& top() const { return c.front(); }
void push(const value_type& x){
c.push_back(x);
push_heap(c.begin(), c.end(), comp);
}
void pop(){
pop_heap(c.begin(), c.end(), comp);
c.pop_back();
}
};
}
#pragma GCC visibility pop
#endif

View File

@ -0,0 +1,406 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include<memory>
#include<utility>
#include<iterator>
#include <deque>
#include<functional>
#include <associative_base>
#ifndef __STD_HEADER_SET
#define __STD_HEADER_SET
#pragma GCC visibility push(default)
namespace std{
template<class Key, class Compare = less<Key>, class Allocator = allocator<Key> > class set;
template<class Key, class Compare = less<Key>, class Allocator = allocator<Key> > class multiset;
/* This is the implementation for the set container. As noted above, it deviates
* from ISO spec by deriving from a base class in order to reduce code redundancy.
* More code could be reduced by convirting to virtual functions (thus allowing
* much of the erase and insert code to be duplicated), but that would deviate from
* the specifications too much to be worth the risk.
*/
//Implementation of set
template<class Key, class Compare, class Allocator> class _UCXXEXPORT set
: public __single_associative<Key, Key, Compare, Allocator>
{
//Default value of allocator does not meet C++ standard specs, but it works for this library
//Deal with it
public:
typedef __single_associative<Key, Key, Compare, Allocator> base;
typedef typename base::key_type key_type;
typedef typename base::value_type value_type;
typedef typename base::key_compare key_compare;
typedef typename base::allocator_type allocator_type;
typedef typename base::reference reference;
typedef typename base::const_reference const_reference;
typedef typename base::iterator iterator;
typedef typename base::const_iterator const_iterator;
typedef typename base::size_type size_type;
typedef typename base::difference_type difference_type;
typedef typename base::pointer pointer;
typedef typename base::const_pointer const_pointer;
typedef typename base::reverse_iterator reverse_iterator;
typedef typename base::const_reverse_iterator const_reverse_iterator;
// using base::value_compare;
static const key_type v_t_k(const value_type v){
return v;
}
explicit set(const Compare& comp = Compare(), const Allocator& al = Allocator())
: base(comp, al, v_t_k) { }
template <class InputIterator> set(InputIterator first, InputIterator last,
const Compare& comp = Compare(), const Allocator& al = Allocator())
: base(first, last, comp, al, v_t_k) { }
set(const set<Key, Compare,Allocator>& x) : base(x) { }
~set() { }
using base::operator=;
using base::operator==;
using base::operator!=;
using base::insert;
using base::erase;
using base::begin;
using base::end;
using base::rbegin;
using base::rend;
using base::empty;
using base::size;
using base::max_size;
using base::find;
using base::count;
using base::lower_bound;
using base::upper_bound;
using base::equal_range;
protected:
};
//Implementation of multiset
template<class Key, class Compare, class Allocator> class _UCXXEXPORT multiset
: public __multi_associative<Key, Key, Compare, Allocator>
{
//Default value of allocator does not meet C++ standard specs, but it works for this library
//Deal with it
public:
typedef __multi_associative<Key, Key, Compare, Allocator> base;
typedef typename base::key_type key_type;
typedef typename base::value_type value_type;
typedef typename base::key_compare key_compare;
typedef typename base::allocator_type allocator_type;
typedef typename base::reference reference;
typedef typename base::const_reference const_reference;
typedef typename base::iterator iterator;
typedef typename base::const_iterator const_iterator;
typedef typename base::size_type size_type;
typedef typename base::difference_type difference_type;
typedef typename base::pointer pointer;
typedef typename base::const_pointer const_pointer;
typedef typename base::reverse_iterator reverse_iterator;
typedef typename base::const_reverse_iterator const_reverse_iterator;
static const key_type v_t_k(const value_type v){
return v;
}
explicit multiset(const Compare& comp = Compare(), const Allocator& al = Allocator())
: base(comp, al, v_t_k) { }
template <class InputIterator> multiset(InputIterator first, InputIterator last,
const Compare& comp = Compare(), const Allocator& al = Allocator())
: base(first, last, comp, al, v_t_k) { }
multiset(const multiset<Key, Compare, Allocator>& x) : base(x) { }
~multiset() { }
using base::operator=;
using base::operator==;
using base::operator!=;
using base::insert;
using base::erase;
using base::begin;
using base::end;
using base::rbegin;
using base::rend;
using base::empty;
using base::size;
using base::max_size;
using base::find;
using base::count;
using base::lower_bound;
using base::upper_bound;
using base::equal_range;
protected:
};
/* Non-member functions. These are at the end because they are not associated with any
particular class. These will be implemented as I figure out exactly what all of
them are supposed to do, and I have time.
*/
template <class Key, class Compare, class Allocator> _UCXXEXPORT bool operator<
(const set<Key,Compare,Allocator>& x, const set<Key,Compare,Allocator>& y)
{
typename set<Key,Compare,Allocator>::const_iterator first1 = x.begin();
typename set<Key,Compare,Allocator>::const_iterator first2 = y.begin();
typename set<Key,Compare,Allocator>::const_iterator last1 = x.end();
typename set<Key,Compare,Allocator>::const_iterator last2 = y.end();
while(first1 != last1 && first2 != last2){
if( *first1 < *first2 ){
return true;
}
if( *first2 < *first1 ){
return false;
}
++first1;
++first2;
}
return first1==last1 && first2 != last2;
}
template <class Key, class Compare, class Allocator> _UCXXEXPORT bool operator>
(const set<Key,Compare,Allocator>& x, const set<Key,Compare,Allocator>& y)
{
typename set<Key,Compare,Allocator>::const_iterator first1 = x.begin();
typename set<Key,Compare,Allocator>::const_iterator first2 = y.begin();
typename set<Key,Compare,Allocator>::const_iterator last1 = x.end();
typename set<Key,Compare,Allocator>::const_iterator last2 = y.end();
while(first1 != last1 && first2 != last2){
if( *first1 > *first2 ){
return true;
}
if( *first2 > *first1 ){
return false;
}
++first1;
++first2;
}
return first1!=last1 && first2 == last2;
}
template <class Key, class Compare, class Allocator> _UCXXEXPORT bool operator>=
(const set<Key,Compare,Allocator>& x, const set<Key,Compare,Allocator>& y)
{
typename set<Key,Compare,Allocator>::const_iterator first1 = x.begin();
typename set<Key,Compare,Allocator>::const_iterator first2 = y.begin();
typename set<Key,Compare,Allocator>::const_iterator last1 = x.end();
typename set<Key,Compare,Allocator>::const_iterator last2 = y.end();
while(first1 != last1 && first2 != last2){
if( *first1 > *first2 ){
return true;
}
if( *first2 > *first1 ){
return false;
}
++first1;
++first2;
}
return first1!=last1;
}
template <class Key, class Compare, class Allocator> _UCXXEXPORT bool operator<=
(const set<Key,Compare,Allocator>& x, const set<Key,Compare,Allocator>& y)
{
typename set<Key,Compare,Allocator>::const_iterator first1 = x.begin();
typename set<Key,Compare,Allocator>::const_iterator first2 = y.begin();
typename set<Key,Compare,Allocator>::const_iterator last1 = x.end();
typename set<Key,Compare,Allocator>::const_iterator last2 = y.end();
while(first1 != last1 && first2 != last2){
if( *first1 < *first2 ){
return true;
}
if( *first2 < *first1 ){
return false;
}
++first1;
++first2;
}
return first2!=last2;
}
template <class Key, class Compare, class Allocator> _UCXXEXPORT void swap
(set<Key,Compare,Allocator>& x, set<Key,Compare,Allocator>& y)
{
x.swap(y);
}
template <class Key, class Compare, class Allocator> _UCXXEXPORT bool operator==
(const multiset<Key,Compare,Allocator>& x, const multiset<Key,Compare,Allocator>& y)
{
if(x.data == y.data){
return true;
}
return false;
}
template <class Key, class Compare, class Allocator> _UCXXEXPORT bool operator<
(const multiset<Key,Compare,Allocator>& x, const multiset<Key,Compare,Allocator>& y)
{
typename multiset<Key,Compare,Allocator>::const_iterator first1 = x.begin();
typename multiset<Key,Compare,Allocator>::const_iterator first2 = y.begin();
typename multiset<Key,Compare,Allocator>::const_iterator last1 = x.end();
typename multiset<Key,Compare,Allocator>::const_iterator last2 = y.end();
while(first1 != last1 && first2 != last2){
if( *first1 < *first2 ){
return true;
}
if( *first2 < *first1 ){
return false;
}
++first1;
++first2;
}
return first1==last1 && first2 != last2;
}
template <class Key, class Compare, class Allocator> _UCXXEXPORT bool operator!=
(const multiset<Key,Compare,Allocator>& x, const multiset<Key,Compare,Allocator>& y)
{
typename multiset<Key,Compare,Allocator>::const_iterator first1 = x.begin();
typename multiset<Key,Compare,Allocator>::const_iterator first2 = y.begin();
typename multiset<Key,Compare,Allocator>::const_iterator last1 = x.end();
typename multiset<Key,Compare,Allocator>::const_iterator last2 = y.end();
while(first1 != last1 && first2 != last2){
if( *first1 != *first2 ){
return true;
}
++first1;
++first2;
}
return first1!=last1 || first2 != last2;
}
template <class Key, class Compare, class Allocator> _UCXXEXPORT bool operator>
(const multiset<Key,Compare,Allocator>& x, const multiset<Key,Compare,Allocator>& y)
{
typename multiset<Key,Compare,Allocator>::const_iterator first1 = x.begin();
typename multiset<Key,Compare,Allocator>::const_iterator first2 = y.begin();
typename multiset<Key,Compare,Allocator>::const_iterator last1 = x.end();
typename multiset<Key,Compare,Allocator>::const_iterator last2 = y.end();
while(first1 != last1 && first2 != last2){
if( *first1 > *first2 ){
return true;
}
if( *first2 > *first1 ){
return false;
}
++first1;
++first2;
}
return first1!=last1 && first2 == last2;
}
template <class Key, class Compare, class Allocator> _UCXXEXPORT bool operator>=
(const multiset<Key,Compare,Allocator>& x, const multiset<Key,Compare,Allocator>& y)
{
typename multiset<Key,Compare,Allocator>::const_iterator first1 = x.begin();
typename multiset<Key,Compare,Allocator>::const_iterator first2 = y.begin();
typename multiset<Key,Compare,Allocator>::const_iterator last1 = x.end();
typename multiset<Key,Compare,Allocator>::const_iterator last2 = y.end();
while(first1 != last1 && first2 != last2){
if( *first1 > *first2 ){
return true;
}
if( *first2 > *first1 ){
return false;
}
++first1;
++first2;
}
return first1!=last1;
}
template <class Key, class Compare, class Allocator> _UCXXEXPORT bool operator<=
(const multiset<Key,Compare,Allocator>& x, const multiset<Key,Compare,Allocator>& y)
{
typename multiset<Key,Compare,Allocator>::const_iterator first1 = x.begin();
typename multiset<Key,Compare,Allocator>::const_iterator first2 = y.begin();
typename multiset<Key,Compare,Allocator>::const_iterator last1 = x.end();
typename multiset<Key,Compare,Allocator>::const_iterator last2 = y.end();
while(first1 != last1 && first2 != last2){
if( *first1 < *first2 ){
return true;
}
if( *first2 < *first1 ){
return false;
}
++first1;
++first2;
}
return first2!=last2;
}
template <class Key, class Compare, class Allocator> _UCXXEXPORT void swap
(multiset<Key,Compare,Allocator>& x, multiset<Key,Compare,Allocator>& y)
{
x.swap(y);
}
}
#pragma GCC visibility pop
#endif

View File

@ -0,0 +1,384 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <basic_definitions>
#ifndef HEADER_STD_SSTREAM
#define HEADER_STD_SSTREAM 1
#include <iosfwd>
#include <ios>
#include <istream>
#include <ostream>
#include <iostream>
#include <string>
#pragma GCC visibility push(default)
namespace std{
template <class charT, class traits, class Allocator>
class _UCXXEXPORT basic_stringbuf : public basic_streambuf<charT,traits>
{
public:
typedef charT char_type;
typedef typename traits::int_type int_type;
typedef typename traits::pos_type pos_type;
typedef typename traits::off_type off_type;
typedef typename Allocator::size_type size_type;
explicit _UCXXEXPORT basic_stringbuf(ios_base::openmode which = ios_base::in | ios_base::out)
: data(), ielement(0), oelement(0)
{
basic_streambuf<charT,traits>::openedFor = which;
}
explicit _UCXXEXPORT basic_stringbuf(const basic_string<charT,traits,Allocator>& str,
ios_base::openmode which = ios_base::in | ios_base::out)
: data(str), ielement(0), oelement(0)
{
if(which & ios_base::ate){
oelement = data.length();
}
basic_streambuf<charT,traits>::openedFor = which;
}
virtual _UCXXEXPORT ~basic_stringbuf() { }
_UCXXEXPORT basic_string<charT,traits,Allocator> str() const{
return data;
}
_UCXXEXPORT void str(const basic_string<charT,traits,Allocator>& s){
data = s;
ielement = 0;
if(basic_streambuf<charT,traits>::openedFor & ios_base::ate){
oelement = data.length();
}else{
oelement = 0;
}
}
protected:
virtual _UCXXEXPORT int sync(){
return 0;
}
virtual _UCXXEXPORT int_type underflow(){
if(ielement >= data.length()){
return traits::eof();
}
return traits::to_int_type(data[ielement]);
}
virtual _UCXXEXPORT int_type uflow(){
int_type retval = underflow();
if(retval != traits::eof()){
++ielement;
}
return retval;
}
virtual _UCXXEXPORT int_type pbackfail(int_type c = traits::eof()){
//Error possibilities
if(ielement == 0){
return traits::eof();
}
if(ielement > data.length()){
ielement = data.length();
return traits::eof();
}
//eof passed in
if(traits::eq_int_type(c,traits::eof())==true){
--ielement;
return traits::not_eof(c);
}
if(traits::eq(traits::to_char_type(c),data[ielement-1]) == true){
--ielement;
return c;
}
if(basic_streambuf<charT,traits>::openedFor & ios_base::out){
--ielement;
data[ielement] = c;
return c;
}
return traits::eof();
}
virtual _UCXXEXPORT int showmanyc(){
return data.length() - ielement;
}
virtual _UCXXEXPORT streamsize xsgetn(char_type* c, streamsize n){
streamsize i = 0;
while(ielement < data.length() && i < n ){
c[i] = data[ielement];
++i;
++ielement;
}
return i;
}
virtual _UCXXEXPORT int_type overflow (int_type c = traits::eof()){
//Nothing to do
if(traits::eq_int_type(c,traits::eof())){
return traits::not_eof(c);
}
//Actually add character, if possible
if(basic_streambuf<charT,traits>::openedFor & ios_base::out){
if(oelement >= data.length()){
data.push_back(c);
}else{
data[oelement] = c;
}
++oelement;
return c;
}
//Not possible
return traits::eof();
}
virtual _UCXXEXPORT basic_streambuf<charT,traits>* setbuf(charT*, streamsize){
//This function does nothing
return this;
}
virtual _UCXXEXPORT streamsize xsputn(const char_type* s, streamsize n){
data.replace(oelement, n, s, n);
oelement += n;
return n;
}
virtual _UCXXEXPORT pos_type seekoff(off_type off, ios_base::seekdir way,
ios_base::openmode which = ios_base::in | ios_base::out)
{
//Test for invalid option
if( (which & ios_base::in) && (which & ios_base::out) && (way == ios_base::cur)){
return -1;
}
//Calculate new location
size_type newpos = 0;
if(way == ios_base::beg){
newpos = off;
}else if(way == ios_base::cur){
if(which & ios_base::out){
newpos = data.length() + off;
}
if(which & ios_base::in){
newpos = ielement + off;
}
}else{
newpos = data.length() + off;
}
//Test for error conditions
if(newpos > data.length()){
return -1;
}
//Shuffle pointers
if(which & ios_base::in){
ielement = newpos;
}
if(which & ios_base::out){
data.resize(newpos);
if(ielement > data.length()){
ielement = data.length();
}
}
return newpos;
}
virtual _UCXXEXPORT pos_type seekpos(pos_type sp,
ios_base::openmode which = ios_base::in | ios_base::out)
{
return seekoff(sp, ios_base::beg, which);
}
basic_string<charT,traits,Allocator> data;
size_type ielement;
size_type oelement;
};
template <class charT, class traits, class Allocator> class _UCXXEXPORT basic_istringstream
: public basic_istream<charT,traits>
{
public:
typedef charT char_type;
typedef typename traits::int_type int_type;
typedef typename traits::pos_type pos_type;
typedef typename traits::off_type off_type;
explicit _UCXXEXPORT basic_istringstream(ios_base::openmode m = ios_base::in)
: basic_ios<charT, traits>(&sb), basic_istream<charT,traits>(&sb), sb(m)
{
}
explicit _UCXXEXPORT basic_istringstream( const basic_string<charT,traits,Allocator>& str,
ios_base::openmode which = ios_base::in)
: basic_ios<charT, traits>(&sb), basic_istream<charT,traits>(&sb), sb(str, which)
{
}
virtual _UCXXEXPORT ~basic_istringstream() { }
_UCXXEXPORT basic_stringbuf<charT,traits,Allocator>* rdbuf() const{
return &sb;
}
_UCXXEXPORT basic_string<charT,traits,Allocator> str() const{
return sb.str();
}
_UCXXEXPORT void str(const basic_string<charT,traits,Allocator>& s){
sb.str(s);
basic_istream<charT,traits>::clear();
}
private:
basic_stringbuf<charT,traits,Allocator> sb;
};
template <class charT, class traits, class Allocator> class _UCXXEXPORT basic_ostringstream
: public basic_ostream<charT,traits>
{
public:
typedef charT char_type;
typedef typename traits::int_type int_type;
typedef typename traits::pos_type pos_type;
typedef typename traits::off_type off_type;
explicit _UCXXEXPORT basic_ostringstream(ios_base::openmode m = ios_base::out)
: basic_ios<charT, traits>(&sb), basic_ostream<charT,traits>(&sb), sb(m)
{
}
explicit _UCXXEXPORT basic_ostringstream(const basic_string<charT,traits,Allocator>& str,
ios_base::openmode which = ios_base::out)
: basic_ios<charT, traits>(&sb), basic_ostream<charT,traits>(&sb), sb(str, which)
{
}
virtual _UCXXEXPORT ~basic_ostringstream() { }
_UCXXEXPORT basic_stringbuf<charT,traits,Allocator>* rdbuf() const{
return &sb;
}
_UCXXEXPORT basic_string<charT,traits,Allocator> str() const{
return sb.str();
}
_UCXXEXPORT void str(const basic_string<charT,traits,Allocator>& s){
sb.str(s);
basic_ostream<charT,traits>::clear();
}
private:
basic_stringbuf<charT,traits,Allocator> sb;
};
template <class charT, class traits, class Allocator> class _UCXXEXPORT basic_stringstream
: public basic_iostream<charT,traits>
{
public:
typedef charT char_type;
typedef typename traits::int_type int_type;
typedef typename traits::pos_type pos_type;
typedef typename traits::off_type off_type;
explicit _UCXXEXPORT basic_stringstream(ios_base::openmode which = ios_base::out|ios_base::in)
: basic_ios<charT, traits>(&sb), basic_iostream<charT,traits>(&sb), sb(which)
{
}
explicit _UCXXEXPORT basic_stringstream(const basic_string<charT,traits,Allocator>& str,
ios_base::openmode which = ios_base::out|ios_base::in)
: basic_ios<charT, traits>(&sb), basic_iostream<charT,traits>(&sb), sb(str, which)
{
}
virtual _UCXXEXPORT ~basic_stringstream(){ }
_UCXXEXPORT basic_stringbuf<charT,traits,Allocator>* rdbuf(){
return &sb;
}
_UCXXEXPORT basic_string<charT,traits,Allocator> str() const{
return sb.str();
}
_UCXXEXPORT void str(const basic_string<charT,traits,Allocator>& s){
sb.str(s);
basic_iostream<charT,traits>::clear();
}
private:
basic_stringbuf<charT, traits> sb;
};
#ifdef __UCLIBCXX_EXPAND_SSTREAM_CHAR__
#ifndef __UCLIBCXX_COMPILE_SSTREAM__
#ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
template <> _UCXXEXPORT basic_stringbuf<char, char_traits<char>, allocator<char> >::
basic_stringbuf(ios_base::openmode which);
template <> _UCXXEXPORT basic_stringbuf<char, char_traits<char>, allocator<char> >::~basic_stringbuf();
#endif // __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
template <> _UCXXEXPORT basic_string<char, char_traits<char>, allocator<char> >
basic_stringbuf<char, char_traits<char>, allocator<char> >::str() const;
template <> _UCXXEXPORT basic_stringbuf<char, char_traits<char>, allocator<char> >::int_type
basic_stringbuf<char, char_traits<char>, allocator<char> >::
pbackfail(basic_stringbuf<char, char_traits<char>, allocator<char> >::int_type c);
template <> _UCXXEXPORT basic_stringbuf<char, char_traits<char>, allocator<char> >::pos_type
basic_stringbuf<char, char_traits<char>, allocator<char> >::
seekoff (basic_stringbuf<char, char_traits<char>, allocator<char> >::off_type off,
ios_base::seekdir way,
ios_base::openmode which
);
template <> _UCXXEXPORT basic_stringbuf<char, char_traits<char>, allocator<char> >::int_type
basic_stringbuf<char, char_traits<char>, allocator<char> >::
overflow (basic_stringbuf<char, char_traits<char>, allocator<char> >::int_type c);
template <> _UCXXEXPORT basic_stringbuf<char, char_traits<char>, allocator<char> >::int_type
basic_stringbuf<char, char_traits<char>, allocator<char> >::underflow ();
template <> _UCXXEXPORT streamsize basic_stringbuf<char, char_traits<char>, allocator<char> >::
xsputn(const char* s, streamsize n);
#ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
template <> _UCXXEXPORT basic_stringstream<char, char_traits<char>, allocator<char> >::
basic_stringstream(ios_base::openmode which);
template <> _UCXXEXPORT basic_stringstream<char, char_traits<char>, allocator<char> >::~basic_stringstream();
template <> _UCXXEXPORT basic_istringstream<char, char_traits<char>, allocator<char> >::~basic_istringstream();
template <> _UCXXEXPORT basic_ostringstream<char, char_traits<char>, allocator<char> >::~basic_ostringstream();
#endif //__UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
#endif
#endif
#pragma GCC visibility pop
}
#endif

View File

@ -0,0 +1,84 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <basic_definitions>
#include <deque>
#ifndef __HEADER_STD_STACK
#define __HEADER_STD_STACK 1
#pragma GCC visibility push(default)
namespace std{
template <class T, class Container = deque<T> > class _UCXXEXPORT stack{
protected:
Container c;
public:
typedef typename Container::value_type value_type;
typedef typename Container::size_type size_type;
typedef Container container_type;
explicit stack(const Container& a = Container()) : c(a) { };
bool empty() const { return c.empty(); }
size_type size() const { return c.size(); }
value_type& top() { return c.back(); }
const value_type& top() const { return c.back(); }
void push(const value_type& x) { c.push_back(x); }
void pop() { c.pop_back(); }
bool operator==(const stack<T, Container> &x) const{
return x.c == c;
}
};
template <class T, class Container> _UCXXEXPORT bool
operator< (const stack<T, Container>& x, const stack<T, Container>& y)
{
return (x.c < y.c);
}
template <class T, class Container> _UCXXEXPORT bool
operator!=(const stack<T, Container>& x, const stack<T, Container>& y)
{
return (x.c != y.c);
}
template <class T, class Container> _UCXXEXPORT bool
operator> (const stack<T, Container>& x, const stack<T, Container>& y)
{
return (x.c > y.c);
}
template <class T, class Container> _UCXXEXPORT bool
operator>=(const stack<T, Container>& x, const stack<T, Container>& y)
{
return (x.c >= y.c);
}
template <class T, class Container> _UCXXEXPORT bool
operator<=(const stack<T, Container>& x, const stack<T, Container>& y)
{
return (x.c <= y.c);
}
}
#pragma GCC visibility pop
#endif

View File

@ -0,0 +1,117 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <basic_definitions>
#include <exception>
#include <string>
#ifndef HEADER_STD_EXCEPTIONS
#define HEADER_STD_EXCEPTIONS 1
//Don't include support if not needed
#ifdef __UCLIBCXX_EXCEPTION_SUPPORT__
#pragma GCC visibility push(default)
namespace std{
//typedef basic_string<char> string;
class _UCXXEXPORT logic_error : public exception {
protected:
string mstring;
public:
logic_error() throw();
logic_error(const string& what_arg);
virtual ~logic_error() throw() {}
virtual const char * what() const throw();
};
class _UCXXEXPORT domain_error : public logic_error {
public:
domain_error() : logic_error() {}
domain_error(const string& what_arg) : logic_error(what_arg) {}
virtual ~domain_error() throw() {}
};
class _UCXXEXPORT invalid_argument : public logic_error {
public:
invalid_argument() : logic_error(){}
invalid_argument(const string& what_arg) : logic_error(what_arg){}
virtual ~invalid_argument() throw() {}
};
class _UCXXEXPORT length_error : public logic_error {
public:
length_error() : logic_error(){}
length_error(const string& what_arg) : logic_error(what_arg){}
virtual ~length_error() throw() {}
};
class _UCXXEXPORT out_of_range : public logic_error{
public:
out_of_range();
out_of_range(const string & what_arg);
virtual ~out_of_range() throw() {}
};
class _UCXXEXPORT runtime_error : public exception{
protected:
string mstring;
public:
runtime_error();
runtime_error(const string& what_arg);
virtual ~runtime_error() throw() {}
virtual const char * what() const throw();
};
class _UCXXEXPORT range_error : public runtime_error{
public:
range_error() : runtime_error(){}
range_error(const string& what_arg) : runtime_error(what_arg) {}
virtual ~range_error() throw(){ }
};
class _UCXXEXPORT overflow_error : public runtime_error{
public:
overflow_error() : runtime_error(){}
overflow_error(const string& what_arg) : runtime_error(what_arg) {}
virtual ~overflow_error() throw(){}
};
class _UCXXEXPORT underflow_error : public runtime_error{
public:
underflow_error() : runtime_error(){}
underflow_error(const string& what_arg) : runtime_error(what_arg) {}
virtual ~underflow_error() throw(){}
};
}
#pragma GCC visibility pop
#endif
#endif

View File

@ -0,0 +1,329 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <basic_definitions>
#include <locale>
#include <string>
#include <iosfwd>
#ifndef HEADER_STD_STREAMBUF
#define HEADER_STD_STREAMBUF 1
#include <ios>
#pragma GCC visibility push(default)
namespace std{
template <class charT, class traits> class _UCXXEXPORT basic_streambuf{
public:
#ifdef __UCLIBCXX_SUPPORT_CDIR__
friend ios_base::Init::Init();
#endif
// Types:
typedef charT char_type;
typedef typename traits::int_type int_type;
typedef typename traits::pos_type pos_type;
typedef typename traits::off_type off_type;
typedef traits traits_type;
virtual ~basic_streambuf();
locale pubimbue(const locale &loc);
locale getloc() const{
return myLocale;
}
basic_streambuf<char_type,traits>* pubsetbuf(char_type* s, streamsize n){
return setbuf(s,n);
}
pos_type pubseekoff(off_type off,
typename ios_base::seekdir way,
ios_base::openmode which = ios_base::in |
ios_base::out
)
{
return seekoff(off,way,which);
}
pos_type pubseekpos(pos_type sp, ios_base::openmode which = ios_base::in | ios_base::out){
return seekpos(sp,which);
}
int pubsync(){
return sync();
}
streamsize in_avail();
int_type snextc();
int_type sbumpc();
int_type sgetc();
streamsize sgetn(char_type* s, streamsize n){
return xsgetn(s,n);
}
int_type sputbackc(char_type c);
int_type sungetc();
int_type sputc(char_type c);
streamsize sputn(const char_type* s, streamsize n){
if(openedFor & ios_base::app){
seekoff(0, ios_base::end, ios_base::out);
}
return xsputn(s, n);
}
protected:
locale myLocale;
//Pointers for the "get" buffers
charT * mgbeg;
charT * mgnext;
charT * mgend;
//Pointers for the "put" buffers
charT * mpbeg;
charT * mpnext;
charT * mpend;
//In the event of null buffers Lets us know what the buffer is opened for
ios_base::openmode openedFor;
basic_streambuf();
basic_streambuf(const basic_streambuf<char, char_traits<char> > &)
: myLocale(),
mgbeg(0), mgnext(0), mgend(0), mpbeg(0), mpnext(0), mpend(0),
openedFor(0)
{ }
basic_streambuf<char, char_traits<char> > & operator=(const basic_streambuf<char, char_traits<char> > &){
return *this;
}
char_type* eback() const{
return mgbeg;
}
char_type* gptr() const{
return mgnext;
}
char_type* egptr() const{
return mgend;
}
void gbump(int n){
mgnext+=n;
}
void setg(char_type* gbeg, char_type* gnext, char_type* gend){
mgbeg = gbeg;
mgnext = gnext;
mgend = gend;
}
char_type* pbase() const{
return mpbeg;
}
char_type* pptr() const{
return mpnext;
}
char_type* epptr() const{
return mpend;
}
void pbump(int n){
mpnext+=n;
}
void setp(char_type* pbeg, char_type* pend){
mpbeg = pbeg;
mpnext = pbeg;
mpend = pend;
}
virtual void imbue(const locale &loc){
myLocale = loc;
}
//Virtual functions which we will not implement
virtual basic_streambuf<char_type,traits>* setbuf(char_type* , streamsize){
return 0;
}
virtual pos_type seekoff(off_type , ios_base::seekdir,
ios_base::openmode = ios_base::in | ios_base::out)
{
return 0;
}
virtual pos_type seekpos(pos_type , ios_base::openmode = ios_base::in | ios_base::out){
return 0;
}
virtual int sync(){
return 0;
}
virtual int showmanyc(){
return 0;
}
virtual streamsize xsgetn(char_type* , streamsize ){
return 0;
}
virtual int_type underflow(){
return traits_type::eof();
}
virtual int_type uflow(){
int_type ret = underflow();
if (!traits_type::eq_int_type(ret, traits_type::eof()))
gbump(1);
return ret;
}
virtual int_type pbackfail(int_type c = traits::eof()){
return c;
}
virtual streamsize xsputn(const char_type* c, streamsize n){
//This function is designed to be replaced by subclasses
for(streamsize i = 0; i< n; ++i){
if(sputc(c[i]) == traits::eof()){
return i;
}
}
return n;
}
virtual int_type overflow (int_type c = traits::eof()){
return c;
}
};
typedef basic_streambuf<char> streambuf;
#ifdef __UCLIBCXX_HAS_WCHAR__
typedef basic_streambuf<wchar_t> wstreambuf;
#endif
//Definitions put below to allow for easy expansion of code
template <class C, class T> basic_streambuf<C, T>::~basic_streambuf(){ }
template <class C, class T> locale basic_streambuf<C, T>::pubimbue(const locale &loc){
locale temp = myLocale;
myLocale = loc;
return temp;
}
template <class C, class T> streamsize basic_streambuf<C, T>::in_avail(){
if(mgend !=0 && mgnext !=0){
return mgend - mgnext;
}
return showmanyc();
}
template <class C, class T> typename basic_streambuf<C, T>::int_type basic_streambuf<C, T>::sbumpc(){
if(mgbeg == 0 || mgnext == mgend){
return uflow();
}
int_type retval = T::to_int_type(*gptr());
gbump(1);
return retval;
}
template <class C, class T> typename basic_streambuf<C, T>::int_type basic_streambuf<C, T>::snextc(){
if(sbumpc() == T::eof() ){
return T::eof() ;
}
return sgetc();
}
template <class C, class T> typename basic_streambuf<C, T>::int_type basic_streambuf<C, T>::sgetc(){
if(mgbeg == 0 || mgnext == mgend){
return underflow();
}
return T::to_int_type(*gptr());
}
template <class C, class T> typename basic_streambuf<C, T>::int_type basic_streambuf<C, T>::sputbackc(char_type c){
if(mgbeg == 0 || mgnext == mgbeg || !T::eq(c, gptr()[-1] )){
return pbackfail(T::to_int_type(c));
}
gbump(-1);
return T::to_int_type(*gptr());
}
template <class C, class T> typename basic_streambuf<C, T>::int_type basic_streambuf<C, T>::sungetc(){
if(mgbeg == 0 || mgnext == mgbeg){
return ios_base::failbit;
}
gbump(-1);
return T::to_int_type(*gptr());
}
template <class C, class T> typename basic_streambuf<C, T>::int_type basic_streambuf<C, T>::sputc(char_type c){
if(openedFor & ios_base::app){
seekoff(0, ios_base::end, ios_base::out);
}
if(mpnext < mpend){
*mpnext = c;
++mpnext;
}else{
return overflow( T::to_int_type(c) );
}
return T::to_int_type(c);
}
template <class C, class T> basic_streambuf<C, T>::basic_streambuf()
: myLocale(),
mgbeg(0), mgnext(0), mgend(0), mpbeg(0), mpnext(0), mpend(0),
openedFor(0)
{ }
#ifdef __UCLIBCXX_EXPAND_STREAMBUF_CHAR__
#ifndef __UCLIBCXX_COMPILE_STREAMBUF__
#ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
template <> _UCXXEXPORT streambuf::basic_streambuf();
template <> _UCXXEXPORT streambuf::~basic_streambuf();
#endif //__UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
template <> _UCXXEXPORT locale streambuf::pubimbue(const locale &loc);
template <> _UCXXEXPORT streamsize streambuf::in_avail();
template <> _UCXXEXPORT streambuf::int_type streambuf::sbumpc();
template <> _UCXXEXPORT streambuf::int_type streambuf::snextc();
template <> _UCXXEXPORT streambuf::int_type streambuf::sgetc();
template <> _UCXXEXPORT streambuf::int_type streambuf::sputbackc(char_type c);
template <> _UCXXEXPORT streambuf::int_type streambuf::sungetc();
template <> _UCXXEXPORT streambuf::int_type streambuf::sputc(char_type c);
#endif
#endif
}
#pragma GCC visibility pop
#endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,146 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <istream>
#include <ostream>
#include <string>
#ifdef __UCLIBCXX_HAS_WCHAR__
#include <cwchar>
#include <cwctype>
#endif
#ifndef __HEADER_STD_STRING_IOSTREAM
#define __HEADER_STD_STRING_IOSTREAM 1
#pragma GCC visibility push(default)
namespace std{
template<class charT, class traits, class Allocator> _UCXXEXPORT basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const basic_string<charT,traits,Allocator>& str)
{
return os.write(str.data(), str.length());
}
template<class charT, class traits, class Allocator> _UCXXEXPORT basic_istream<charT,traits>&
operator>>(basic_istream<charT,traits>& is, basic_string<charT,traits,Allocator>& str)
{
typename basic_istream<charT, traits>::sentry s(is);
if(s == false){
return is;
}
str.clear();
typename basic_istream<charT, traits>::int_type c;
typename Allocator::size_type n = is.width();
bool exitnow = false;
if(n == 0){
n = str.max_size();
}
// //Clear out preliminary spaces first
// c = is.get();
// while(isspace(c)){
// c = is.get();
// }
//
// is.putback(c);
do{
c = is.get();
if(c == traits::eof() || isspace(c) || n == 0){
is.putback(c);
exitnow = true;
}else{
str.append(1, traits::to_char_type(c) );
--n;
}
}while(exitnow == false);
return is;
}
template<class charT, class traits, class Allocator> _UCXXEXPORT basic_istream<charT,traits>&
getline(basic_istream<charT,traits>& is, basic_string<charT,traits,Allocator>& str, charT delim)
{
typename basic_istream<charT,traits>::sentry s(is);
if(s == false){
return is;
}
str.erase();
streamsize i = 0;
typename basic_istream<charT,traits>::int_type c_i;
charT c;
unsigned int n = str.max_size();
for(i=0;i<n;++i){
c_i=is.get();
if(c_i == traits::eof() ){
return is;
}
c = traits::to_char_type(c_i);
if(c == delim){
return is;
}
str.append(1, c);
}
return is;
}
template<class charT, class traits, class Allocator> _UCXXEXPORT basic_istream<charT,traits>&
getline(basic_istream<charT,traits>& is, basic_string<charT,traits,Allocator>& str)
{
return getline(is, str, '\n');
}
#ifdef __UCLIBCXX_EXPAND_STRING_CHAR__
#ifndef __UCLIBCXX_COMPILE_STRING__
#ifdef __UCLIBCXX_EXPAND_ISTREAM_CHAR__
template<> _UCXXEXPORT basic_istream<char, char_traits<char> >& operator>>(
basic_istream<char,char_traits<char> >& is,
basic_string<char, char_traits<char>, allocator<char> >& str);
#endif
#ifdef __UCLIBCXX_EXPAND_OSTREAM_CHAR__
template<> _UCXXEXPORT basic_ostream<char, char_traits<char> >&
operator<<(basic_ostream<char, char_traits<char> >& os,
const basic_string<char,char_traits<char>, std::allocator<char> >& str);
#endif
#endif
#endif
}
#pragma GCC visibility pop
#endif

View File

@ -0,0 +1,165 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <exception>
#include <cstdlib>
#include <typeinfo>
#ifndef HEADER_ULC_SUPPORT
#define HEADER_ULC_SUPPORT 1
using namespace std;
//From C++ ABI spec
typedef enum {
_URC_NO_REASON = 0,
_URC_FOREIGN_EXCEPTION_CAUGHT = 1,
_URC_FATAL_PHASE2_ERROR = 2,
_URC_FATAL_PHASE1_ERROR = 3,
_URC_NORMAL_STOP = 4,
_URC_END_OF_STACK = 5,
_URC_HANDLER_FOUND = 6,
_URC_INSTALL_CONTEXT = 7,
_URC_CONTINUE_UNWIND = 8
} _Unwind_Reason_Code;
typedef void (*_Unwind_Exception_Cleanup_Fn)
(_Unwind_Reason_Code reason, struct _Unwind_Exception *exc);
//The following definitions were grabbed from the gcc implementation
typedef unsigned _Unwind_Ptr __attribute__((__mode__(__pointer__)));
typedef unsigned _Unwind_Word __attribute__((__mode__(__word__)));
typedef signed _Unwind_Sword __attribute__((__mode__(__word__)));
typedef unsigned _Unwind_Exception_Class __attribute__((__mode__(__DI__)));
typedef void (*_Unwind_Exception_Cleanup_Fn) (_Unwind_Reason_Code, struct _Unwind_Exception *);
typedef int _Unwind_Action;
static const _Unwind_Action _UA_SEARCH_PHASE = 1;
static const _Unwind_Action _UA_CLEANUP_PHASE = 2;
static const _Unwind_Action _UA_HANDLER_FRAME = 4;
static const _Unwind_Action _UA_FORCE_UNWIND = 8;
const _Unwind_Exception_Class __uclibcxx_exception_class = ((((((((
_Unwind_Exception_Class) 'u' << 8 | (_Unwind_Exception_Class) 'l') << 8
| (_Unwind_Exception_Class) 'i') << 8 | (_Unwind_Exception_Class) 'b') << 8
| (_Unwind_Exception_Class) 'C')<< 8 | (_Unwind_Exception_Class) '+') << 8
| (_Unwind_Exception_Class) '+') << 8 | (_Unwind_Exception_Class) '\0');
#define _UA_SEARCH_PHASE 1
#define _UA_CLEANUP_PHASE 2
#define _UA_HANDLER_FRAME 4
#define _UA_FORCE_UNWIND 8
#define _UA_END_OF_STACK 16
struct _Unwind_Exception{
_Unwind_Exception_Class exception_class; //Type of exception, eg ulibC++\0
_Unwind_Exception_Cleanup_Fn exception_cleanup; //Destructor if from diff runtime
_Unwind_Word private_1; //Don't touch at all!
_Unwind_Word private_2; //Don't touch at all!
} __attribute__((__aligned__));
//The following structure is system-dependent and defined by the compiler
//Thus it's definition was copied from the gcc 3.4.0 header files
struct _Unwind_Context;
//{
// void *reg[DWARF_FRAME_REGISTERS+1];
// void *cfa;
// void *ra;
// void *lsda;
// struct dwarf_eh_bases bases;
// _Unwind_Word args_size;
//};
_Unwind_Reason_Code _Unwind_RaiseException ( struct _Unwind_Exception *exception_object );
//_Unwind_ForcedUnwind
typedef _Unwind_Reason_Code (*_Unwind_Stop_Fn)
(int version, _Unwind_Action actions, _Unwind_Exception_Class exceptionClass,
struct _Unwind_Exception *exceptionObject,
struct _Unwind_Context *context, void *stop_parameter );
_Unwind_Reason_Code _Unwind_ForcedUnwind (
struct _Unwind_Exception *exception_object, _Unwind_Stop_Fn stop,
void *stop_parameter );
void _Unwind_Resume (struct _Unwind_Exception *exception_object);
void _Unwind_DeleteException (struct _Unwind_Exception *exception_object);
_Unwind_Word _Unwind_GetGR (struct _Unwind_Context *context, int index);
void _Unwind_SetGR (struct _Unwind_Context *context, int index, _Unwind_Word);
_Unwind_Ptr _Unwind_GetIP (struct _Unwind_Context *context);
void _Unwind_SetIP (struct _Unwind_Context *context, _Unwind_Ptr new_value);
_Unwind_Ptr _Unwind_GetLanguageSpecificData (struct _Unwind_Context *context);
_Unwind_Ptr _Unwind_GetRegionStart (struct _Unwind_Context *context);
_Unwind_Reason_Code (*__personality_routine)
(int version, //Should be 1
_Unwind_Action actions, //Actions the routine will perform (bitmask)
_Unwind_Exception_Class exceptionClass, //Type of exception - vendor is high 4 bytes
struct _Unwind_Exception *exceptionObject, //Points to exception header
struct _Unwind_Context *context); //Unwinder state information
/*The following part is the Level II ABI which is required for compatability*/
//This might be the only stuff that *I* need to implement
struct __cxa_exception {
std::type_info *exceptionType; //Type of thrown exception
void (*exceptionDestructor) (void *); //Pointer to the destructor
unexpected_handler unexpectedHandler; //Unexpected handler to use
terminate_handler terminateHandler; //Terminate handle to use
__cxa_exception *nextException; //per thread linked list
int handlerCount; //How many handlers have caught this
int handlerSwitchValue;
const char *actionRecord;
const char *languageSpecificData;
void *catchTemp;
void *adjustedPtr;
_Unwind_Exception unwindHeader;
};
struct __cxa_eh_globals {
__cxa_exception *caughtExceptions;
unsigned int uncaughtExceptions;
};
extern "C" __cxa_eh_globals *__cxa_get_globals(void); //Return ptr to the eh_globals object for current thread
extern "C" __cxa_eh_globals *__cxa_get_globals_fast(void); //Same as above, assumes that above called at least once
extern "C" void *__cxa_allocate_exception(size_t thrown_size); //Allocate space for exception plus header
extern "C" void __cxa_free_exception(void *thrown_exception); //Free space allocated from the above
extern "C" void __cxa_throw (void *thrown_exception, //This is the actual throw call
// std::type_info *tinfo, //Type of object
void * tinfo, //Type of object
void (*dest) (void *) ); //Pointer to destructor destroy object
#endif

View File

@ -0,0 +1,48 @@
/*
* Automatically generated C config: don't edit
*/
/*
* Version Number
*/
#define __UCLIBCXX_MAJOR__ 0
#define __UCLIBCXX_MINOR__ 2
#define __UCLIBCXX_SUBLEVEL__ 4
/*
* Target Features and Options
*/
#define __UCLIBCXX_HAS_FLOATS__ 1
#define __UCLIBCXX_HAS_LONG_DOUBLE__ 1
#define __UCLIBCXX_HAS_TLS__ 1
#define __WARNINGS__ "-Wall"
#define __BUILD_EXTRA_LIBRARIES__ ""
#define __HAVE_DOT_CONFIG__ 1
/*
* String and I/O Stream Support
*/
#undef __UCLIBCXX_HAS_WCHAR__
#define __UCLIBCXX_IOSTREAM_BUFSIZE__ 32
#define __UCLIBCXX_HAS_LFS__ 1
#define __UCLIBCXX_SUPPORT_CDIR__ 1
#define __UCLIBCXX_SUPPORT_CIN__ 1
#define __UCLIBCXX_SUPPORT_COUT__ 1
#define __UCLIBCXX_SUPPORT_CERR__ 1
#undef __UCLIBCXX_SUPPORT_CLOG__
/*
* STL and Code Expansion
*/
#define __UCLIBCXX_STL_BUFFER_SIZE__ 32
#define __UCLIBCXX_CODE_EXPANSION__ 1
#define __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__ 1
#define __UCLIBCXX_EXPAND_STRING_CHAR__ 1
#define __UCLIBCXX_EXPAND_VECTOR_BASIC__ 1
#define __UCLIBCXX_EXPAND_IOS_CHAR__ 1
#define __UCLIBCXX_EXPAND_STREAMBUF_CHAR__ 1
#define __UCLIBCXX_EXPAND_ISTREAM_CHAR__ 1
#define __UCLIBCXX_EXPAND_OSTREAM_CHAR__ 1
#define __UCLIBCXX_EXPAND_FSTREAM_CHAR__ 1
#define __UCLIBCXX_EXPAND_SSTREAM_CHAR__ 1

View File

@ -0,0 +1,92 @@
/* Copyright (C) 2005 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <basic_definitions>
#include <string.h>
#include <exception>
#include <memory>
#include <char_traits>
#ifndef __HEADER_TYPE_TRAITS
#define __HEADER_TYPE_TRAITS 1
#pragma GCC visibility push(default)
namespace std{
struct _UCXXEXPORT __true_type{};
struct _UCXXEXPORT __false_type{};
template <class I> class _UCXXEXPORT __is_integer{
public:
typedef __false_type value;
};
template <> class _UCXXEXPORT __is_integer <unsigned int>{
public:
typedef __true_type value;
};
template <> class _UCXXEXPORT __is_integer <signed int>{
public:
typedef __true_type value;
};
template <> class _UCXXEXPORT __is_integer <short unsigned int>{
public:
typedef __true_type value;
};
template <> class _UCXXEXPORT __is_integer <short signed int>{
public:
typedef __true_type value;
};
template <> class _UCXXEXPORT __is_integer <char>{
public:
typedef __true_type value;
};
template <> class _UCXXEXPORT __is_integer <signed char>{
public:
typedef __true_type value;
};
template <> class _UCXXEXPORT __is_integer <unsigned char>{
public:
typedef __true_type value;
};
template <> class _UCXXEXPORT __is_integer <long unsigned int>{
public:
typedef __true_type value;
};
template <> class _UCXXEXPORT __is_integer <long signed int>{
public:
typedef __true_type value;
};
}
#pragma GCC visibility pop
#endif

View File

@ -0,0 +1,156 @@
// RTTI support for -*- C++ -*-
// Copyright (C) 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002
// Free Software Foundation
//
// This file is part of GNU CC.
//
// GNU CC is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2, or (at your option)
// any later version.
//
// GNU CC is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with GNU CC; see the file COPYING. If not, write to
// the Free Software Foundation, 59 Temple Place - Suite 330,
// Boston, MA 02111-1307, USA.
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
// the GNU General Public License. This exception does not however
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
/** @file typeinfo
* This header provides RTTI support.
*/
#ifndef __TYPEINFO__
#define __TYPEINFO__
#include <exception>
extern "C++" {
namespace __cxxabiv1
{
class __class_type_info;
} // namespace __cxxabiv1
#if !__GXX_WEAK__
// If weak symbols are not supported, typeinfo names are not merged.
#define __GXX_MERGED_TYPEINFO_NAMES 0
#else
// On platforms that support weak symbols, typeinfo names are merged.
#define __GXX_MERGED_TYPEINFO_NAMES 1
#endif
namespace std
{
/**
* @brief Part of RTTI.
*
* The @c type_info class describes type information generated by
* an implementation.
*/
class type_info
{
public:
/** Destructor. Being the first non-inline virtual function, this
* controls in which translation unit the vtable is emitted. The
* compiler makes use of that information to know where to emit
* the runtime-mandated type_info structures in the new-abi. */
virtual ~type_info();
private:
/// Assigning type_info is not supported. Made private.
type_info& operator=(const type_info&);
type_info(const type_info&);
protected:
const char *__name;
protected:
explicit type_info(const char *__n): __name(__n) { }
public:
// the public interface
/** Returns an @e implementation-defined byte string; this is not
* portable between compilers! */
const char* name() const
{ return __name; }
#if !__GXX_MERGED_TYPEINFO_NAMES
bool before(const type_info& __arg) const;
// In old abi, or when weak symbols are not supported, there can
// be multiple instances of a type_info object for one
// type. Uniqueness must use the _name value, not object address.
bool operator==(const type_info& __arg) const;
#else
/** Returns true if @c *this precedes @c __arg in the implementation's
* collation order. */
// In new abi we can rely on type_info's NTBS being unique,
// and therefore address comparisons are sufficient.
bool before(const type_info& __arg) const
{ return __name < __arg.__name; }
bool operator==(const type_info& __arg) const
{ return __name == __arg.__name; }
#endif
bool operator!=(const type_info& __arg) const
{ return !operator==(__arg); }
// the internal interface
public:
// return true if this is a pointer type of some kind
virtual bool __is_pointer_p() const;
// return true if this is a function type
virtual bool __is_function_p() const;
// Try and catch a thrown type. Store an adjusted pointer to the
// caught type in THR_OBJ. If THR_TYPE is not a pointer type, then
// THR_OBJ points to the thrown object. If THR_TYPE is a pointer
// type, then THR_OBJ is the pointer itself. OUTER indicates the
// number of outer pointers, and whether they were const
// qualified.
virtual bool __do_catch(const type_info *__thr_type, void **__thr_obj,
unsigned __outer) const;
// internally used during catch matching
virtual bool __do_upcast(const __cxxabiv1::__class_type_info *__target,
void **__obj_ptr) const;
};
/**
* @brief Thrown during incorrect typecasting.
*
* If you attempt an invalid @c dynamic_cast expression, an instance of
* this class (or something derived from this class) is thrown. */
class bad_cast : public exception
{
public:
bad_cast() throw() { }
// This declaration is not useless:
// http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118
virtual ~bad_cast() throw();
};
/** If you use a NULL pointer in a @c typeid expression, this is thrown. */
class bad_typeid : public exception
{
public:
bad_typeid () throw() { }
// This declaration is not useless:
// http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118
virtual ~bad_typeid() throw();
};
} // namespace std
} // extern "C++"
#endif

View File

@ -0,0 +1,213 @@
// -*- C++ -*- Exception handling and frame unwind runtime interface routines.
// Copyright (C) 2001 Free Software Foundation, Inc.
//
// This file is part of GCC.
//
// GCC is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2, or (at your option)
// any later version.
//
// GCC is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with GCC; see the file COPYING. If not, write to
// the Free Software Foundation, 59 Temple Place - Suite 330,
// Boston, MA 02111-1307, USA.
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
// the GNU General Public License. This exception does not however
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
// This is derived from the C++ ABI for IA-64. Where we diverge
// for cross-architecture compatibility are noted with "@@@".
#ifndef _UNWIND_CXX_H
#define _UNWIND_CXX_H 1
// Level 2: C++ ABI
#include <typeinfo>
#include <exception>
#include <cstddef>
#include "unwind.h"
#pragma GCC visibility push(default)
namespace __cxxabiv1
{
// A primary C++ exception object consists of a header, which is a wrapper
// around an unwind object header with additional C++ specific information,
// followed by the exception object itself.
struct __cxa_exception
{
// Manage the exception object itself.
std::type_info *exceptionType;
void (*exceptionDestructor)(void *);
// The C++ standard has entertaining rules wrt calling set_terminate
// and set_unexpected in the middle of the exception cleanup process.
std::unexpected_handler unexpectedHandler;
std::terminate_handler terminateHandler;
// The caught exception stack threads through here.
__cxa_exception *nextException;
// How many nested handlers have caught this exception. A negated
// value is a signal that this object has been rethrown.
int handlerCount;
// Cache parsed handler data from the personality routine Phase 1
// for Phase 2 and __cxa_call_unexpected.
int handlerSwitchValue;
const unsigned char *actionRecord;
const unsigned char *languageSpecificData;
_Unwind_Ptr catchTemp;
void *adjustedPtr;
// The generic exception header. Must be last.
_Unwind_Exception unwindHeader;
};
// A dependent C++ exception object consists of a header, which is a wrapper
// around an unwind object header with additional C++ specific information,
// followed by the exception object itself.
struct __cxa_dependent_exception
{
// The primary exception
void *primaryException;
// The C++ standard has entertaining rules wrt calling set_terminate
// and set_unexpected in the middle of the exception cleanup process.
std::unexpected_handler unexpectedHandler;
std::terminate_handler terminateHandler;
// The caught exception stack threads through here.
__cxa_exception *nextException;
// How many nested handlers have caught this exception. A negated
// value is a signal that this object has been rethrown.
int handlerCount;
// Cache parsed handler data from the personality routine Phase 1
// for Phase 2 and __cxa_call_unexpected.
int handlerSwitchValue;
const unsigned char *actionRecord;
const unsigned char *languageSpecificData;
_Unwind_Ptr catchTemp;
void *adjustedPtr;
// The generic exception header. Must be last.
_Unwind_Exception unwindHeader;
};
// Each thread in a C++ program has access to a __cxa_eh_globals object.
struct __cxa_eh_globals
{
__cxa_exception *caughtExceptions;
unsigned int uncaughtExceptions;
};
// The __cxa_eh_globals for the current thread can be obtained by using
// either of the following functions. The "fast" version assumes at least
// one prior call of __cxa_get_globals has been made from the current
// thread, so no initialization is necessary.
extern "C" __cxa_eh_globals *__cxa_get_globals () throw();
extern "C" __cxa_eh_globals *__cxa_get_globals_fast () throw();
// Allocate memory for the primary exception plus the thrown object.
extern "C" void *__cxa_allocate_exception(std::size_t thrown_size) throw();
// Allocate memory for dependent exception.
extern "C" __cxa_dependent_exception *__cxa_allocate_dependent_exception() throw();
// Free the space allocated for the primary exception.
extern "C" void __cxa_free_exception(void *thrown_exception) throw();
// Free the space allocated for the dependent exception.
extern "C" void __cxa_free_dependent_exception(__cxa_dependent_exception *dependent_exception) throw();
// Throw the exception.
extern "C" void __cxa_throw (void *thrown_exception,
std::type_info *tinfo,
void (*dest) (void *))
__attribute__((noreturn));
// Used to implement exception handlers.
extern "C" void *__cxa_begin_catch (void *) throw();
extern "C" void __cxa_end_catch ();
extern "C" void __cxa_rethrow () __attribute__((noreturn));
// These facilitate code generation for recurring situations.
extern "C" void __cxa_bad_cast ();
extern "C" void __cxa_bad_typeid ();
// @@@ These are not directly specified by the IA-64 C++ ABI.
// Handles re-checking the exception specification if unexpectedHandler
// throws, and if bad_exception needs to be thrown. Called from the
// compiler.
extern "C" void __cxa_call_unexpected (void *) __attribute__((noreturn));
// Invokes given handler, dying appropriately if the user handler was
// so inconsiderate as to return.
extern void __terminate(std::terminate_handler) __attribute__((noreturn));
extern void __unexpected(std::unexpected_handler) __attribute__((noreturn));
// The current installed user handlers.
extern std::terminate_handler __terminate_handler;
extern std::unexpected_handler __unexpected_handler;
// These are explicitly GNU C++ specific.
// This is the exception class we report -- "GNUCC++\0".
const _Unwind_Exception_Class __gxx_exception_class
= ((((((((_Unwind_Exception_Class) 'G'
<< 8 | (_Unwind_Exception_Class) 'N')
<< 8 | (_Unwind_Exception_Class) 'U')
<< 8 | (_Unwind_Exception_Class) 'C')
<< 8 | (_Unwind_Exception_Class) 'C')
<< 8 | (_Unwind_Exception_Class) '+')
<< 8 | (_Unwind_Exception_Class) '+')
<< 8 | (_Unwind_Exception_Class) '\0');
// GNU C++ personality routine, Version 0.
extern "C" _Unwind_Reason_Code __gxx_personality_v0
(int, _Unwind_Action, _Unwind_Exception_Class,
struct _Unwind_Exception *, struct _Unwind_Context *);
// GNU C++ sjlj personality routine, Version 0.
extern "C" _Unwind_Reason_Code __gxx_personality_sj0
(int, _Unwind_Action, _Unwind_Exception_Class,
struct _Unwind_Exception *, struct _Unwind_Context *);
// Acquire the C++ exception header from the C++ object.
static inline __cxa_exception *
__get_exception_header_from_obj (void *ptr)
{
return reinterpret_cast<__cxa_exception *>(ptr) - 1;
}
// Acquire the C++ exception header from the generic exception header.
static inline __cxa_exception *
__get_exception_header_from_ue (_Unwind_Exception *exc)
{
return reinterpret_cast<__cxa_exception *>(exc + 1) - 1;
}
} /* namespace __cxxabiv1 */
#pragma GCC visibility pop
#endif // _UNWIND_CXX_H

View File

@ -0,0 +1,88 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <basic_definitions>
#ifndef __STD_HEADER_UTILITY
#define __STD_HEADER_UTILITY 1
#pragma GCC visibility push(default)
namespace std{
namespace rel_ops {
template<class T> inline bool operator!=(const T& x, const T& y){
return !(x == y);
}
template<class T> inline bool operator> (const T& x, const T& y){
return ( y < x);
}
template<class T> inline bool operator<=(const T& x, const T& y){
return !( y < x );
}
template<class T> inline bool operator>=(const T& x, const T& y){
return !(x < y);
}
}
template <class T1, class T2> struct _UCXXEXPORT pair {
typedef T1 first_type;
typedef T2 second_type;
T1 first;
T2 second;
pair() : first(), second() { }
pair(const T1& x, const T2& y) : first(x), second(y) { }
template<class U, class V> pair(const pair<U, V> &p) : first(p.first), second(p.second) { }
};
template <class T1, class T2> bool operator==(const pair<T1,T2>& x, const pair<T1,T2>& y){
using namespace rel_ops;
return (x.first == y.first && x.second==y.second);
}
template <class T1, class T2> bool operator< (const pair<T1,T2>& x, const pair<T1,T2>& y){
return x.first < y.first || (!(y.first < x.first) && x.second < y.second);
}
template <class T1, class T2> bool operator!=(const pair<T1,T2>& x, const pair<T1,T2>& y){
return !(x == y);
}
template <class T1, class T2> bool operator> (const pair<T1,T2>& x, const pair<T1,T2>& y){
return y < x;
}
template <class T1, class T2> bool operator>=(const pair<T1,T2>& x, const pair<T1,T2>& y){
return !(x < y);
}
template <class T1, class T2> bool operator<=(const pair<T1,T2>& x, const pair<T1,T2>& y){
return !(y < x);
}
template <class T1, class T2> pair<T1,T2> make_pair(const T1& x, const T2& y){
return pair<T1,T2>(x, y);
}
}
#pragma GCC visibility pop
#endif //__STD_HEADER_UTILITY

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,517 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <basic_definitions>
#include <memory>
#include <iterator>
#include <func_exception>
#include <algorithm>
#include <type_traits>
#ifndef __STD_HEADER_VECTOR
#define __STD_HEADER_VECTOR
#pragma GCC visibility push(default)
namespace std{
template <class T, class Allocator = allocator<T> > class vector;
template <class T, class Allocator> bool operator==(const vector<T,Allocator>& x, const vector<T,Allocator>& y);
template <class T, class Allocator> bool operator< (const vector<T,Allocator>& x, const vector<T,Allocator>& y);
template <class T, class Allocator> bool operator!=(const vector<T,Allocator>& x, const vector<T,Allocator>& y);
template <class T, class Allocator> bool operator> (const vector<T,Allocator>& x, const vector<T,Allocator>& y);
template <class T, class Allocator> bool operator>=(const vector<T,Allocator>& x, const vector<T,Allocator>& y);
template <class T, class Allocator> bool operator<=(const vector<T,Allocator>& x, const vector<T,Allocator>& y);
template <class T, class Allocator> void swap(vector<T,Allocator>& x, vector<T,Allocator>& y);
template <class T, class Allocator> class _UCXXEXPORT vector {
public:
typedef typename Allocator::reference reference;
typedef typename Allocator::const_reference const_reference;
typedef typename Allocator::size_type size_type;
typedef typename Allocator::difference_type difference_type;
typedef typename Allocator::pointer pointer;
typedef typename Allocator::const_pointer const_pointer;
typedef T* iterator;
typedef const T* const_iterator;
typedef T value_type;
typedef Allocator allocator_type;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
explicit _UCXXEXPORT vector(const Allocator& al= Allocator()): data(0), //defaultValue(T()),
data_size(__UCLIBCXX_STL_BUFFER_SIZE__), elements(0), a(al)
{
data = a.allocate(data_size);
}
explicit _UCXXEXPORT vector(size_type n, const T& value = T(), const Allocator& al= Allocator()) :
data(0), data_size(0), elements(0), a(al)
{
data_size = n + __UCLIBCXX_STL_BUFFER_SIZE__;
data = a.allocate(data_size);
resize(n, value);
}
template <class InputIterator> _UCXXEXPORT
vector(InputIterator first, InputIterator last, const Allocator& al = Allocator()):
data(0), data_size(__UCLIBCXX_STL_BUFFER_SIZE__), elements(0), a(al)
{
data = a.allocate(data_size);
assign(first, last);
}
_UCXXEXPORT vector(const vector<T,Allocator>& x){
a = x.a;
elements = x.elements;
data_size = elements + __UCLIBCXX_STL_BUFFER_SIZE__;
data = a.allocate(data_size);
for(size_type i = 0; i < elements; i++){
a.construct(data+i, x.data[i]);
}
}
_UCXXEXPORT ~vector(); //Below
_UCXXEXPORT vector<T,Allocator>& operator=(const vector<T,Allocator>& x){
if(&x == this){
return *this;
}
reserve(x.elements); //Make sure that we have enough actual memory
//Copy as many elements as possible
size_t minElements = elements;
if(minElements > x.elements){
minElements = x.elements;
}
for(size_t i = 0; i < minElements; ++i){
data[i] = x.data[i];
}
//If we need to add new elements
if(elements < x.elements){
for(size_t i = elements; i< x.elements; ++i){
a.construct(data+i, x.data[i]);
++elements;
}
}
if(elements > x.elements){
downsize(x.elements);
}
return *this;
}
template <class InputIterator> _UCXXEXPORT void assign(InputIterator first, InputIterator last){
clear();
insert(begin(), first, last);
}
template <class Size, class U> _UCXXEXPORT void assign(Size n, const U& u = U()){
clear();
resize(n, u);
}
inline allocator_type get_allocator() const{
return a;
}
inline iterator begin(){
return data;
}
inline const_iterator begin() const{
return data;
}
inline iterator end(){
return (data + elements);
}
inline const_iterator end() const{
return (data + elements);
}
inline reverse_iterator rbegin(){
return reverse_iterator(end());
}
inline const_reverse_iterator rbegin() const{
return const_reverse_iterator(end());
}
inline reverse_iterator rend(){
return reverse_iterator(begin());
}
inline const_reverse_iterator rend() const{
return const_reverse_iterator(begin());
}
inline size_type size() const{
return elements;
}
_UCXXEXPORT size_type max_size() const{
return ((size_type)(-1)) / sizeof(T);
}
void downsize(size_type sz);
void resize(size_type sz, const T & c = T());
inline size_type capacity() const{
return data_size;
}
inline bool empty() const{
return (size() == 0);
}
void reserve(size_type n);
inline reference operator[](size_type n){
return data[n];
}
inline const_reference operator[](size_type n) const{
return data[n];
}
_UCXXEXPORT const_reference at(size_type n) const{
if(n >= elements){
__throw_out_of_range("Invalid subscript");
}
return data[n];
}
_UCXXEXPORT reference at(size_type n){
if(n >= elements){
__throw_out_of_range("Invalid subscript");
}
return data[n];
}
inline reference front(){
return data[0];
}
inline const_reference front() const{
return data[0];
}
inline reference back(){
return data[ size() - 1];
}
inline const_reference back() const{
return data[ size() - 1 ];
}
inline void push_back(const T& x){
resize( size() + 1, x);
}
inline void pop_back(){
downsize(size() - 1);
}
_UCXXEXPORT iterator insert(iterator position, const T& x = T()){
size_type index = position - data;
resize(size() + 1, x);
for(size_type i = elements - 1; i > index; --i){
data[i] = data[i-1];
}
data[index] = x;
return (data + index);
}
_UCXXEXPORT void _insert_fill(iterator position, size_type n, const T & x){
size_type index = position - data;
resize(size() + n, x);
for(size_type i = elements -1; (i > (index+n-1)); --i){
data[i] = data[i-n];
}
for(size_type i = 0; i < n; i++){
data[i + index] = x;
}
}
template <class InputIterator> _UCXXEXPORT
void _insert_from_iterator(iterator position, InputIterator first, InputIterator last)
{
T temp;
while(first !=last){
temp = *first;
position = insert(position, temp);
++position;
++first;
}
}
template <class InputIterator>
inline void _dispatch_insert(iterator position, InputIterator first, InputIterator last, __true_type)
{
_insert_fill(position, first, last);
}
template <class InputIterator>
inline void _dispatch_insert(iterator position, InputIterator first, InputIterator last, __false_type)
{
_insert_from_iterator(position, first, last);
}
inline void insert(iterator position, size_type n, const T& x ){
_insert_fill(position, n, x);
}
template <class InputIterator> inline void insert(iterator position, InputIterator first, InputIterator last){
typedef typename __is_integer<InputIterator>::value __some_type;
_dispatch_insert(position, first, last, __some_type());
}
_UCXXEXPORT iterator erase(iterator position){
size_type index = position - data;
for(size_type i = index; i < (elements - 1); ++i){
data[i] = data[i+1];
}
downsize(size() - 1);
return (data + index);
}
_UCXXEXPORT iterator erase(iterator first, iterator last){
size_type index = first - data;
size_type width = last - first;
for(size_type i = index; i < (elements - width) ;++i){
data[i] = data[i+width];
}
downsize(size() - width);
return (data + index);
}
_UCXXEXPORT void swap(vector<T,Allocator>& v){
if(this == &v){ //Avoid dv.swap(v)
return;
}
T* ptr;
size_type temp;
//Swap pointers first
ptr = data;
data = v.data;
v.data = ptr;
//Swap element counts
temp = elements;
elements = v.elements;
v.elements = temp;
//Swap data size
temp = data_size;
data_size = v.data_size;
v.data_size = temp;
}
_UCXXEXPORT void clear(){
downsize(0);
}
protected:
T* data;
size_type data_size;
size_type elements;
Allocator a;
};
//Here go template instantiations
template<class T, class Allocator> _UCXXEXPORT vector<T, Allocator>::~vector(){
for(size_t i = 0; i < elements; ++i){
a.destroy(data + i);
}
a.deallocate(data, data_size);
}
template<class T, class Allocator> _UCXXEXPORT void vector<T, Allocator>::reserve(size_type n){
if(n > data_size){ //We never shrink...
T * temp_ptr = data;
size_type temp_size = data_size;
data_size = n;
data = a.allocate(data_size);
for(size_type i = 0; i<elements; ++i){
a.construct(data+i, temp_ptr[i]);
a.destroy(temp_ptr+i);
}
a.deallocate(temp_ptr, temp_size);
}
}
template<class T, class Allocator> _UCXXEXPORT void vector<T, Allocator>::resize(size_type sz, const T & c){
if(sz > elements){ //Need to actually call constructor
if(sz > data_size){
reserve(sz + __UCLIBCXX_STL_BUFFER_SIZE__);
}
for(size_type i = elements; i<sz ; ++i){
a.construct(data+i, c);
}
elements = sz;
}else{
downsize(sz);
}
}
template<class T, class Allocator> _UCXXEXPORT void vector<T, Allocator>::downsize(size_type sz){
if(sz < elements){ //Actually are downsizing
for(size_t i = sz; i< elements; ++i){
a.destroy(data+i);
}
elements = sz;
}
}
#ifndef __UCLIBCXX_COMPILE_VECTOR__
#ifdef __UCLIBCXX_EXPAND_VECTOR_BASIC__
#ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
template<> _UCXXEXPORT vector<char, allocator<char> >::vector(const allocator<char>& al);
template<> _UCXXEXPORT vector<char, allocator<char> >::vector(size_type n, const char & value, const allocator<char> & al);
template<> _UCXXEXPORT vector<char, allocator<char> >::~vector();
template<> _UCXXEXPORT vector<unsigned char, allocator<unsigned char> >::~vector();
#endif //__UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
template<> _UCXXEXPORT void vector<char, allocator<char> >::reserve(size_type n);
template<> _UCXXEXPORT void vector<unsigned char, allocator<unsigned char> >::reserve(size_type n);
template<> _UCXXEXPORT void vector<short int, allocator<short int> >::reserve(size_type n);
template<> _UCXXEXPORT void vector<unsigned short int, allocator<unsigned short int> >::reserve(size_type n);
template<> _UCXXEXPORT void vector<int, allocator<int> >::reserve(size_type n);
template<> _UCXXEXPORT void vector<unsigned int, allocator<unsigned int> >::reserve(size_type n);
template<> _UCXXEXPORT void vector<long int, allocator<long int> >::reserve(size_type n);
template<> _UCXXEXPORT void vector<unsigned long int, allocator<unsigned long int> >::reserve(size_type n);
template<> _UCXXEXPORT void vector<float, allocator<float> >::reserve(size_type n);
template<> _UCXXEXPORT void vector<double, allocator<double> >::reserve(size_type n);
template<> _UCXXEXPORT void vector<bool, allocator<bool> >::reserve(size_type n);
template<> _UCXXEXPORT void vector<char, allocator<char> >::resize(size_type sz, const char & c);
template<> _UCXXEXPORT void
vector<unsigned char, allocator<unsigned char> >::resize(size_type sz, const unsigned char & c);
template<> _UCXXEXPORT void vector<short int, allocator<short int> >::resize(size_type sz, const short & c);
template<> _UCXXEXPORT void
vector<unsigned short int, allocator<unsigned short int> >::resize(size_type sz, const unsigned short int & c);
template<> _UCXXEXPORT void vector<int, allocator<int> >::resize(size_type sz, const int & c);
template<> _UCXXEXPORT void vector<unsigned int, allocator<unsigned int> >::resize(size_type sz, const unsigned int & c);
template<> _UCXXEXPORT void vector<long int, allocator<long int> >::resize(size_type sz, const long int & c);
template<> _UCXXEXPORT void
vector<unsigned long int, allocator<unsigned long int> >::resize(size_type sz, const unsigned long int & c);
template<> _UCXXEXPORT void vector<float, allocator<float> >::resize(size_type sz, const float & c);
template<> _UCXXEXPORT void vector<double, allocator<double> >::resize(size_type sz, const double & c);
template<> _UCXXEXPORT void vector<bool, allocator<bool> >::resize(size_type sz, const bool & c);
#elif defined __UCLIBCXX_EXPAND_STRING_CHAR__
#ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
template<> _UCXXEXPORT vector<char, allocator<char> >::vector(const allocator<char>& al);
template<> _UCXXEXPORT vector<char, allocator<char> >::vector(size_type n, const char & value, const allocator<char> & al);
template<> _UCXXEXPORT vector<char, allocator<char> >::~vector();
#endif
template<> _UCXXEXPORT void vector<char, allocator<char> >::reserve(size_type n);
template<> _UCXXEXPORT void vector<char, allocator<char> >::resize(size_type sz, const char & c);
#endif
#endif
template <class T, class Allocator> _UCXXEXPORT bool
operator==(const vector<T,Allocator>& x, const vector<T,Allocator>& y)
{
if(x.size() !=y.size() ){
return false;
}
for(size_t i = 0; i < x.size(); ++i){
if(x[i] != y[i]){
return false;
}
}
return true;
}
template <class T, class Allocator> _UCXXEXPORT bool
operator< (const vector<T,Allocator>& x, const vector<T,Allocator>& y)
{
less<typename iterator_traits<typename vector<T,Allocator>::iterator >::value_type> c;
return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end(), c);
}
template <class T, class Allocator> _UCXXEXPORT bool
operator!=(const vector<T,Allocator>& x, const vector<T,Allocator>& y)
{
return !(x == y);
}
template <class T, class Allocator> _UCXXEXPORT bool
operator> (const vector<T,Allocator>& x, const vector<T,Allocator>& y)
{
greater<typename iterator_traits<typename vector<T,Allocator>::iterator >::value_type> c;
return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end(), c);
}
template <class T, class Allocator> _UCXXEXPORT bool
operator>=(const vector<T,Allocator>& x, const vector<T,Allocator>& y)
{
greater_equal<typename iterator_traits<typename vector<T,Allocator>::iterator >::value_type> c;
return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end(), c);
}
template <class T, class Allocator> _UCXXEXPORT bool
operator<=(const vector<T,Allocator>& x, const vector<T,Allocator>& y)
{
less_equal<typename iterator_traits<typename vector<T,Allocator>::iterator >::value_type> c;
return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end(), c);
}
template <class T, class Allocator> _UCXXEXPORT void swap(vector<T,Allocator>& x, vector<T,Allocator>& y){
x.swap(y);
}
}
#pragma GCC visibility pop
#endif

View File

@ -0,0 +1,451 @@
/* Copyright (C) 1991-1993,1995-2006,2007,2009 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#ifndef _FEATURES_H
#define _FEATURES_H 1
/* These are defined by the user (or the compiler)
to specify the desired environment:
__STRICT_ANSI__ ISO Standard C.
_ISOC99_SOURCE Extensions to ISO C89 from ISO C99.
_POSIX_SOURCE IEEE Std 1003.1.
_POSIX_C_SOURCE If ==1, like _POSIX_SOURCE; if >=2 add IEEE Std 1003.2;
if >=199309L, add IEEE Std 1003.1b-1993;
if >=199506L, add IEEE Std 1003.1c-1995;
if >=200112L, all of IEEE 1003.1-2004
if >=200809L, all of IEEE 1003.1-2008
_XOPEN_SOURCE Includes POSIX and XPG things. Set to 500 if
Single Unix conformance is wanted, to 600 for the
sixth revision, to 700 for the seventh revision.
_XOPEN_SOURCE_EXTENDED XPG things and X/Open Unix extensions.
_LARGEFILE_SOURCE Some more functions for correct standard I/O.
_LARGEFILE64_SOURCE Additional functionality from LFS for large files.
_FILE_OFFSET_BITS=N Select default filesystem interface.
_BSD_SOURCE ISO C, POSIX, and 4.3BSD things.
_SVID_SOURCE ISO C, POSIX, and SVID things.
_ATFILE_SOURCE Additional *at interfaces.
_GNU_SOURCE All of the above, plus GNU extensions.
_REENTRANT Select additionally reentrant object.
_THREAD_SAFE Same as _REENTRANT, often used by other systems.
_FORTIFY_SOURCE If set to numeric value > 0 additional security
measures are defined, according to level.
The `-ansi' switch to the GNU C compiler defines __STRICT_ANSI__.
If none of these are defined, the default is to have _SVID_SOURCE,
_BSD_SOURCE, and _POSIX_SOURCE set to one and _POSIX_C_SOURCE set to
200112L. If more than one of these are defined, they accumulate.
For example __STRICT_ANSI__, _POSIX_SOURCE and _POSIX_C_SOURCE
together give you ISO C, 1003.1, and 1003.2, but nothing else.
These are defined by this file and are used by the
header files to decide what to declare or define:
__USE_ISOC99 Define ISO C99 things.
__USE_ISOC95 Define ISO C90 AMD1 (C95) things.
__USE_POSIX Define IEEE Std 1003.1 things.
__USE_POSIX2 Define IEEE Std 1003.2 things.
__USE_POSIX199309 Define IEEE Std 1003.1, and .1b things.
__USE_POSIX199506 Define IEEE Std 1003.1, .1b, .1c and .1i things.
__USE_XOPEN Define XPG things.
__USE_XOPEN_EXTENDED Define X/Open Unix things.
__USE_UNIX98 Define Single Unix V2 things.
__USE_XOPEN2K Define XPG6 things.
__USE_XOPEN2K8 Define XPG7 things.
__USE_LARGEFILE Define correct standard I/O things.
__USE_LARGEFILE64 Define LFS things with separate names.
__USE_FILE_OFFSET64 Define 64bit interface as default.
__USE_BSD Define 4.3BSD things.
__USE_SVID Define SVID things.
__USE_MISC Define things common to BSD and System V Unix.
__USE_ATFILE Define *at interfaces and AT_* constants for them.
__USE_GNU Define GNU extensions.
__USE_REENTRANT Define reentrant/thread-safe *_r functions.
__USE_FORTIFY_LEVEL Additional security measures used, according to level.
__FAVOR_BSD Favor 4.3BSD things in cases of conflict.
The macros `__GNU_LIBRARY__', `__GLIBC__', and `__GLIBC_MINOR__' are
defined by this file unconditionally. `__GNU_LIBRARY__' is provided
only for compatibility. All new code should use the other symbols
to test for features.
All macros listed above as possibly being defined by this file are
explicitly undefined if they are not explicitly defined.
Feature-test macros that are not defined by the user or compiler
but are implied by the other feature-test macros defined (or by the
lack of any definitions) are defined by the file. */
/* Undefine everything, so we get a clean slate. */
#undef __USE_ISOC99
#undef __USE_ISOC95
#undef __USE_POSIX
#undef __USE_POSIX2
#undef __USE_POSIX199309
#undef __USE_POSIX199506
#undef __USE_XOPEN
#undef __USE_XOPEN_EXTENDED
#undef __USE_UNIX98
#undef __USE_XOPEN2K
#undef __USE_XOPEN2K8
#undef __USE_LARGEFILE
#undef __USE_LARGEFILE64
#undef __USE_FILE_OFFSET64
#undef __USE_BSD
#undef __USE_SVID
#undef __USE_MISC
#undef __USE_ATFILE
#undef __USE_GNU
#undef __USE_REENTRANT
#undef __USE_FORTIFY_LEVEL
#undef __FAVOR_BSD
#undef __KERNEL_STRICT_NAMES
/* Suppress kernel-name space pollution unless user expressedly asks
for it. */
#ifndef _LOOSE_KERNEL_NAMES
# define __KERNEL_STRICT_NAMES
#endif
/* Always use ISO C things. */
#define __USE_ANSI 1
/* Convenience macros to test the versions of glibc and gcc.
Use them like this:
#if __GNUC_PREREQ (2,8)
... code requiring gcc 2.8 or later ...
#endif
Note - they won't work for gcc1 or glibc1, since the _MINOR macros
were not defined then. */
#if defined __GNUC__ && defined __GNUC_MINOR__
# define __GNUC_PREREQ(maj, min) \
((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
#else
# define __GNUC_PREREQ(maj, min) 0
#endif
/* If _BSD_SOURCE was defined by the user, favor BSD over POSIX. */
#if defined _BSD_SOURCE && \
!(defined _POSIX_SOURCE || defined _POSIX_C_SOURCE || \
defined _XOPEN_SOURCE || defined _XOPEN_SOURCE_EXTENDED || \
defined _GNU_SOURCE || defined _SVID_SOURCE)
# define __FAVOR_BSD 1
#endif
/* If _GNU_SOURCE was defined by the user, turn on all the other features. */
#ifdef _GNU_SOURCE
# undef _ISOC99_SOURCE
# define _ISOC99_SOURCE 1
# undef _POSIX_SOURCE
# define _POSIX_SOURCE 1
# undef _POSIX_C_SOURCE
# define _POSIX_C_SOURCE 200809L
# undef _XOPEN_SOURCE
# define _XOPEN_SOURCE 700
# undef _XOPEN_SOURCE_EXTENDED
# define _XOPEN_SOURCE_EXTENDED 1
# undef _LARGEFILE64_SOURCE
# define _LARGEFILE64_SOURCE 1
# undef _BSD_SOURCE
# define _BSD_SOURCE 1
# undef _SVID_SOURCE
# define _SVID_SOURCE 1
# undef _ATFILE_SOURCE
# define _ATFILE_SOURCE 1
#endif
/* This macro indicates that the installed library is uClibc. Use
* __UCLIBC_MAJOR__ and __UCLIBC_MINOR__ to test for the features in
* specific releases. */
#define __UCLIBC__ 1
#ifdef __UCLIBC__
/* Load up the current set of uClibc supported features along
* with the current uClibc major and minor version numbers.
* For uClibc release 0.9.26, these numbers would be:
* #define __UCLIBC_MAJOR__ 0
* #define __UCLIBC_MINOR__ 9
* #define __UCLIBC_SUBLEVEL__ 26
*/
# define __need_uClibc_config_h
# include <bits/uClibc_config.h>
# undef __need_uClibc_config_h
/* For uClibc, always optimize for size -- this should disable
* a lot of expensive inlining...
* TODO: this is wrong! __OPTIMIZE_SIZE__ is an indicator of
* gcc -Os compile. We should not mess with compiler inlines.
* We should instead disable __USE_EXTERN_INLINES unconditionally,
* or maybe actually audit and test uclibc to work correctly
* with __USE_EXTERN_INLINES on.
*/
# define __OPTIMIZE_SIZE__ 1
/* disable unsupported features */
# undef __LDBL_COMPAT
# ifndef __UCLIBC_HAS_FORTIFY__
# undef _FORTIFY_SOURCE
# endif
# ifndef __UCLIBC_HAS_THREADS__
# if defined _REENTRANT || defined _THREAD_SAFE
# warning requested reentrant code, but thread support was disabled
# undef _REENTRANT
# undef _THREAD_SAFE
# endif
# endif
# ifndef __UCLIBC_HAS_LFS__
# undef _LARGEFILE64_SOURCE
/* NOTE: This is probably incorrect on a 64-bit arch... */
# if defined _FILE_OFFSET_BITS && _FILE_OFFSET_BITS == 64
# error It appears you have defined _FILE_OFFSET_BITS=64. Unfortunately, \
uClibc was built without large file support enabled.
# endif
# elif defined __BCC__
# error BCC does not support LFS, please disable it
# endif
#endif /* __UCLIBC__ */
/* If nothing (other than _GNU_SOURCE) is defined,
define _BSD_SOURCE and _SVID_SOURCE. */
#if (!defined __STRICT_ANSI__ && !defined _ISOC99_SOURCE && \
!defined _POSIX_SOURCE && !defined _POSIX_C_SOURCE && \
!defined _XOPEN_SOURCE && !defined _XOPEN_SOURCE_EXTENDED && \
!defined _BSD_SOURCE && !defined _SVID_SOURCE)
# define _BSD_SOURCE 1
# define _SVID_SOURCE 1
#endif
/* This is to enable the ISO C99 extension. Also recognize the old macro
which was used prior to the standard acceptance. This macro will
eventually go away and the features enabled by default once the ISO C99
standard is widely adopted. */
#if (defined _ISOC99_SOURCE || defined _ISOC9X_SOURCE \
|| (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L))
# define __USE_ISOC99 1
#endif
/* This is to enable the ISO C90 Amendment 1:1995 extension. */
#if (defined _ISOC99_SOURCE || defined _ISOC9X_SOURCE \
|| (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199409L))
# define __USE_ISOC95 1
#endif
/* If none of the ANSI/POSIX macros are defined, use POSIX.1 and POSIX.2
(and IEEE Std 1003.1b-1993 unless _XOPEN_SOURCE is defined). */
#if ((!defined __STRICT_ANSI__ || (_XOPEN_SOURCE - 0) >= 500) && \
!defined _POSIX_SOURCE && !defined _POSIX_C_SOURCE)
# define _POSIX_SOURCE 1
# if defined _XOPEN_SOURCE && (_XOPEN_SOURCE - 0) < 500
# define _POSIX_C_SOURCE 2
# elif defined _XOPEN_SOURCE && (_XOPEN_SOURCE - 0) < 600
# define _POSIX_C_SOURCE 199506L
# elif defined _XOPEN_SOURCE && (_XOPEN_SOURCE - 0) < 700
# define _POSIX_C_SOURCE 200112L
# else
# define _POSIX_C_SOURCE 200809L
# endif
# define __USE_POSIX_IMPLICITLY 1
#endif
#if defined _POSIX_SOURCE || _POSIX_C_SOURCE >= 1 || defined _XOPEN_SOURCE
# define __USE_POSIX 1
#endif
#if defined _POSIX_C_SOURCE && _POSIX_C_SOURCE >= 2 || defined _XOPEN_SOURCE
# define __USE_POSIX2 1
#endif
#if (_POSIX_C_SOURCE - 0) >= 199309L
# define __USE_POSIX199309 1
#endif
#if (_POSIX_C_SOURCE - 0) >= 199506L
# define __USE_POSIX199506 1
#endif
#if (_POSIX_C_SOURCE - 0) >= 200112L
# define __USE_XOPEN2K 1
# undef __USE_ISOC99
# define __USE_ISOC99 1
#endif
#if (_POSIX_C_SOURCE - 0) >= 200809L
# define __USE_XOPEN2K8 1
# undef _ATFILE_SOURCE
# define _ATFILE_SOURCE 1
#endif
#ifdef _XOPEN_SOURCE
# define __USE_XOPEN 1
# if (_XOPEN_SOURCE - 0) >= 500
# define __USE_XOPEN_EXTENDED 1
# define __USE_UNIX98 1
# undef _LARGEFILE_SOURCE
# define _LARGEFILE_SOURCE 1
# if (_XOPEN_SOURCE - 0) >= 600
# if (_XOPEN_SOURCE - 0) >= 700
# define __USE_XOPEN2K8 1
# endif
# define __USE_XOPEN2K 1
# undef __USE_ISOC99
# define __USE_ISOC99 1
# endif
# else
# ifdef _XOPEN_SOURCE_EXTENDED
# define __USE_XOPEN_EXTENDED 1
# endif
# endif
#endif
#ifdef _LARGEFILE_SOURCE
# define __USE_LARGEFILE 1
#endif
#ifdef _LARGEFILE64_SOURCE
# define __USE_LARGEFILE64 1
#endif
#if defined _FILE_OFFSET_BITS && _FILE_OFFSET_BITS == 64
# define __USE_FILE_OFFSET64 1
#endif
#if defined _BSD_SOURCE || defined _SVID_SOURCE
# define __USE_MISC 1
#endif
#ifdef _BSD_SOURCE
# define __USE_BSD 1
#endif
#ifdef _SVID_SOURCE
# define __USE_SVID 1
#endif
#ifdef _ATFILE_SOURCE
# define __USE_ATFILE 1
#endif
#ifdef _GNU_SOURCE
# define __USE_GNU 1
#endif
#if defined _REENTRANT || defined _THREAD_SAFE
# define __USE_REENTRANT 1
#endif
#if defined _FORTIFY_SOURCE && _FORTIFY_SOURCE > 0 \
&& __GNUC_PREREQ (4, 1) && defined __OPTIMIZE__ && __OPTIMIZE__ > 0
# if _FORTIFY_SOURCE > 1
# define __USE_FORTIFY_LEVEL 2
# else
# define __USE_FORTIFY_LEVEL 1
# endif
#else
# define __USE_FORTIFY_LEVEL 0
#endif
/* We do support the IEC 559 math functionality, real and complex. */
#ifdef __UCLIBC_HAS_FLOATS__
#define __STDC_IEC_559__ 1
#define __STDC_IEC_559_COMPLEX__ 1
#endif
#ifdef __UCLIBC_HAS_WCHAR__
/* wchar_t uses ISO 10646-1 (2nd ed., published 2000-09-15) / Unicode 3.1. */
#define __STDC_ISO_10646__ 200009L
#endif
/* There is an unwholesomely huge amount of code out there that depends on the
* presence of GNU libc header files. We have GNU libc header files. So here
* we commit a horrible sin. At this point, we _lie_ and claim to be GNU libc
* to make things like /usr/include/linux/socket.h and lots of apps work as
* their developers intended. This is IMHO, pardonable, since these defines
* are not really intended to check for the presence of a particular library,
* but rather are used to define an _interface_. */
#if !defined __FORCE_NOGLIBC && (!defined _LIBC || defined __FORCE_GLIBC)
/* This macro indicates that the installed library is the GNU C Library.
For historic reasons the value now is 6 and this will stay from now
on. The use of this variable is deprecated. */
/* uClibc WARNING: leave these aligned to the left, don't put a space after '#', else
* broken apps could fail the check. */
#undef __GNU_LIBRARY__
#define __GNU_LIBRARY__ 6
/* Major and minor version number of the GNU C library package. Use
these macros to test for features in specific releases. */
/* Don't do it, if you want to keep uClibc happy. */
#define __GLIBC__ 2
#define __GLIBC_MINOR__ 2
#endif
#define __GLIBC_PREREQ(maj, min) \
((__GLIBC__ << 16) + __GLIBC_MINOR__ >= ((maj) << 16) + (min))
#ifndef __UCLIBC__
/* Decide whether a compiler supports the long long datatypes. */
#if defined __GNUC__ \
|| (defined __PGI && defined __i386__ ) \
|| (defined __INTEL_COMPILER && (defined __i386__ || defined __ia64__)) \
|| (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L)
# define __GLIBC_HAVE_LONG_LONG 1
#endif
#endif
/* This is here only because every header file already includes this one. */
#ifndef __ASSEMBLER__
# ifndef _SYS_CDEFS_H
# include <sys/cdefs.h>
# endif
/* If we don't have __REDIRECT, prototypes will be missing if
__USE_FILE_OFFSET64 but not __USE_LARGEFILE[64]. */
# if defined __USE_FILE_OFFSET64 && !defined __REDIRECT
# define __USE_LARGEFILE 1
# ifdef __UCLIBC_HAS_LFS__
# define __USE_LARGEFILE64 1
# endif
# endif
#endif /* !ASSEMBLER */
/* Decide whether we can, and are willing to define extern inline
* functions in headers, even if this results in a slightly bigger
* code for user programs built against uclibc.
* Enabled only in -O2 compiles, not -Os.
* uclibc itself is usually built without __USE_EXTERN_INLINES,
* remove "&& !defined __OPTIMIZE_SIZE__" part to do otherwise.
*/
#if __GNUC_PREREQ (2, 7) && defined __OPTIMIZE__ \
&& !defined __OPTIMIZE_SIZE__ && !defined __NO_INLINE__ \
&& (defined __extern_inline || defined __GNUC_GNU_INLINE__ || defined __GNUC_STDC_INLINE__)
# define __USE_EXTERN_INLINES 1
#endif
#ifdef _LIBC
# ifdef __UCLIBC_HAS_LFS__
# undef _FILE_OFFSET_BITS
# undef __USE_FILE_OFFSET64
# endif
# include <libc-internal.h>
#endif
#endif /* features.h */

312
misc/uClibc++/install.sh Executable file
View File

@ -0,0 +1,312 @@
#!/bin/bash
usage="USAGE: $0 <full path to the NuttX directory>"
lgpl="\n
GNU LESSER GENERAL PUBLIC LICENSE\n
\n
Version 3, 29 June 2007\n
\n
Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/>\n
\n
Everyone is permitted to copy and distribute verbatim copies of this \n
license document, but changing it is not allowed.\n
\n
This version of the GNU Lesser General Public License incorporates the\n
terms and conditions of version 3 of the GNU General Public License,\n
supplemented by the additional permissions listed below.\n
\n
0. Additional Definitions.\n
\n
As used herein, “this License” refers to version 3 of the GNU Lesser\n
General Public License, and the “GNU GPL” refers to version 3 of the\n
GNU General Public License.\n
\n
“The Library” refers to a covered work governed by this License, other\n
than an Application or a Combined Work as defined below.\n
\n
An “Application” is any work that makes use of an interface provided\n
by the Library, but which is not otherwise based on the Library. Defining\n
a subclass of a class defined by the Library is deemed a mode of using an\n
interface provided by the Library.\n
\n
A “Combined Work” is a work produced by combining or linking an\n
Application with the Library. The particular version of the Library with\n
which the Combined Work was made is also called the “Linked Version”.\n
\n
The “Minimal Corresponding Source” for a Combined Work means the\n
Corresponding Source for the Combined Work, excluding any source code\n
for portions of the Combined Work that, considered in isolation, are based\n
on the Application, and not on the Linked Version.\n
\n
The “Corresponding Application Code” for a Combined Work means the object\n
code and/or source code for the Application, including any data and utility\n
programs needed for reproducing the Combined Work from the Application,\n
but excluding the System Libraries of the Combined Work.\n
\n
1. Exception to Section 3 of the GNU GPL.\n
\n
You may convey a covered work under sections 3 and 4 of this License\n
without being bound by section 3 of the GNU GPL.\n
\n
2. Conveying Modified Versions.\n
\n
If you modify a copy of the Library, and, in your modifications, a\n
facility refers to a function or data to be supplied by an Application\n
that uses the facility (other than as an argument passed when the facility\n
is invoked), then you may convey a copy of the modified version:\n
\n
a) under this License, provided that you make a good faith effort to\n
ensure that, in the event an Application does not supply the function\n
or data, the facility still operates, and performs whatever part of\n
its purpose remains meaningful, or\n
b) under the GNU GPL, with none of the additional permissions of this\n
License applicable to that copy.\n
\n
3. Object Code Incorporating Material from Library Header Files.\n
\n
The object code form of an Application may incorporate material from a\n
header file that is part of the Library. You may convey such object code\n
under terms of your choice, provided that, if the incorporated material is\n
not limited to numerical parameters, data structure layouts and accessors, or\n
small macros, inline functions and templates (ten or fewer lines in length),\n
you do both of the following:\n
\n
a) Give prominent notice with each copy of the object code that the\n
Library is used in it and that the Library and its use are covered\n
by this License.\n
b) Accompany the object code with a copy of the GNU GPL and this license\n
document.\n
\n
4. Combined Works.\n
\n
You may convey a Combined Work under terms of your choice that, taken\n
together, effectively do not restrict modification of the portions of the\n
Library contained in the Combined Work and reverse engineering for debugging\n
such modifications, if you also do each of the following:\n
\n
a) Give prominent notice with each copy of the Combined Work that the\n
Library is used in it and that the Library and its use are covered by\n
this License.\n
b) Accompany the Combined Work with a copy of the GNU GPL and this\n
license document.\n
c) For a Combined Work that displays copyright notices during execution,\n
include the copyright notice for the Library among these notices,\n
as well as a reference directing the user to the copies of the\n
GNU GPL and this license document.\n
d) Do one of the following:\n
\n
0) Convey the Minimal Corresponding Source under the terms of\n
this License, and the Corresponding Application Code in a form\n
suitable for, and under terms that permit, the user to recombine\n
or relink the Application with a modified version of the Linked\n
Version to produce a modified Combined Work, in the manner\n
specified by section 6 of the GNU GPL for conveying Corresponding\n
Source.\n
1) Use a suitable shared library mechanism for linking with the Library.\n
A suitable mechanism is one that (a) uses at run time a copy of\n
the Library already present on the user's computer system, and\n
(b) will operate properly with a modified version of the Library\n
that is interface-compatible with the Linked Version.\n
\n
e) Provide Installation Information, but only if you would otherwise\n
be required to provide such information under section 6 of the\n
GNU GPL, and only to the extent that such information is necessary\n
to install and execute a modified version of the Combined Work\n
produced by recombining or relinking the Application with a\n
modified version of the Linked Version. (If you use option 4d0, the\n
Installation Information must accompany the Minimal Corresponding\n
Source and Corresponding Application Code. If you use option 4d1,\n
you must provide the Installation Information in the manner\n
specified by section 6 of the GNU GPL for conveying Corresponding\n
Source.)\n
\n
5. Combined Libraries.\n
\n
You may place library facilities that are a work based on the Library\n
side by side in a single library together with other library facilities\n
that are not Applications and are not covered by this License, and convey\n
such a combined library under terms of your choice, if you do both of the\n
following:\n
\n
a) Accompany the combined library with a copy of the same work based\n
on the Library, uncombined with any other library facilities,\n
conveyed under the terms of this License.\n
b) Give prominent notice with the combined library that part of it\n
is a work based on the Library, and explaining where to find the\n
accompanying uncombined form of the same work.\n
\n
6. Revised Versions of the GNU Lesser General Public License.\n
\n
The Free Software Foundation may publish revised and/or new versions of\n
the GNU Lesser General Public License from time to time. Such new\n
versions will be similar in spirit to the present version, but may\n
differ in detail to address new problems or concerns.\n
\n
Each version is given a distinguishing version number. If the Library\n
as you received it specifies that a certain numbered version of the\n
GNU Lesser General Public License “or any later version” applies to\n
it, you have the option of following the terms and conditions either\n
of that published version or of any later version published by the Free\n
Software Foundation. If the Library as you received it does not specify\n
a version number of the GNU Lesser General Public License, you may\n
choose any version of the GNU Lesser General Public License ever\n
published by the Free Software Foundation.\n
\n
If the Library as you received it specifies that a proxy can decide\n
whether future versions of the GNU Lesser General Public License shall\n
apply, that proxy's public statement of acceptance of any version is\n
permanent authorization for you to choose that version for the Library.\n"
# readans prompt default
function readans () {
echo -n "$1 ($2): "
IFS='@' read ans || exit 1
[ -z "$ans" ] && ans=$2
}
# readyn prompt default
function readyn () {
while :; do
readans "$1 [Y/N]" $2
case "$ans" in
[yY] | [yY]es )
ans=y
break ;;
[nN] | [nN]o )
ans=n
break ;;
* )
echo "Please answer Y or N"
;;
esac
done
}
# Get the single, required command line argument
nuttx_path=$1
if [ -z "${nuttx_path}" ]; then
echo "ERROR: Missing path to the NuttX directory"
echo $usage
exit 1
fi
# Lots of sanity checking so that we do not do anything too stupid
if [ ! -d libxx ]; then
echo "ERROR: Directory libxx does not exist in this directory"
echo " Please CD into the misc/uClibc++ directory and try again"
echo $usage
exit 1
fi
if [ ! -d include ]; then
echo "ERROR: Directory include does not exist in this directory"
echo " Please CD into the misc/uClibc++ directory and try again"
echo $usage
exit 1
fi
if [ ! -d "${nuttx_path}" ]; then
echo "ERROR: Directory ${nuttx_path} does not exist"
echo $usage
exit 1
fi
if [ ! -f "${nuttx_path}/Makefile" ]; then
echo "ERROR: Not Makefile in directory ${nuttx_path}"
echo $usage
exit 1
fi
libxx_srcdir=${nuttx_path}/libxx
if [ ! -d "${libxx_srcdir}" ]; then
echo "ERROR: Directory ${libxx_srcdir} does not exist"
echo $usage
exit 1
fi
if [ ! -f "${libxx_srcdir}/Makefile" ]; then
echo "ERROR: No Makefile in directory ${libxx_srcdir}"
echo $usage
exit 1
fi
uclibc_srcdir=${libxx_srcdir}/uClibc++
if [ -d "${uclibc_srcdir}" ]; then
echo "ERROR: Directory ${uclibc_srcdir} already exists"
echo " Please remove the ${uclibc_srcdir} directory and try again"
echo $usage
exit 1
fi
nuttx_incdir=${nuttx_path}/include
if [ ! -d "${nuttx_incdir}" ]; then
echo "ERROR: Directory ${nuttx_incdir} does not exist"
echo $usage
exit 1
fi
nuttxcxx_incdir=${nuttx_incdir}/cxx
if [ ! -d "${nuttxcxx_incdir}" ]; then
echo "ERROR: Directory ${nuttxcxx_incdir} does not exist"
echo $usage
exit 1
fi
# Licensing
echo "You are about to install the uClibc++ library into the NuttX source"
echo "tree. NuttX is licensed under a modified BSD License; uClibc is"
echo "licensed under the GNU LGPL Version 3 license. When you install"
echo "uClibc++ into the NuttX source tree, you must then comply with uClibc's"
echo "stricter GNU LGPL Version 3 license."
echo ""
readyn "Continue" "N"
echo ""
if [ "X${ans}" != "Xy" -a "X${ans}" != "XY" ]; then
echo "Good bye"
exit 0
fi
echo "You must read and agree to the following license"
echo ""
readyn "Continue" "N"
echo ""
if [ "X${ans}" != "Xy" -a "X${ans}" != "XY" ]; then
echo "Good bye"
exit 0
fi
echo -e ${lgpl} | more
echo ""
readyn "I agree to the termso the GNU LGPL Version 3 license" "N"
echo ""
if [ "X${ans}" != "Xy" -a "X${ans}" != "XY" ]; then
echo "Good bye"
exit 0
fi
echo "Installing uClibc++ in the NuttX source tree"
cp -a ./libxx/* ${libxx_srcdir}/. ||
{ echo "Copy from ./libxx/* to ${libxx_srcdir}/. failed"; exit 1; }
cp -a ./include/* ${nuttx_incdir}/. ||
{ echo "Copy from ./include/* ${nuttx_incdir}/. failed"; exit 1; }
echo "Installation suceeded"
echo ""

View File

@ -0,0 +1,52 @@
############################################################################
# misc/uClibc++/libxx/uClibc++/Makefile
#
# Copyright (C) 2012 Gregory Nutt. All rights reserved.
# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in
# the documentation and/or other materials provided with the
# distribution.
# 3. Neither the name NuttX nor the names of its contributors may be
# used to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
###########################################################################
# Add the uClibc++ sources
CXXSRCS += algorithm.cxx associative_base.cxx bitset.cxx char_traits.cxx
CXXSRCS += complex.cxx del_op.cxx del_opnt.cxx del_opv.cxx del_opvnt.cxx
CXXSRCS += deque.cxx eh_alloc.cxx eh_globals.cxx exception.cxx
CXXSRCS += stream.cxx func_exception.cxx iomanip.cxx ios.cxx
CXXSRCS += iostream.cxx istream.cxx iterator.cxx limits.cxx list.cxx
CXXSRCS += locale.cxx map.cxx new_handler.cxx new_op.cxx new_opnt.cxx
CXXSRCS += new_opv.cxx new_opvnt.cxx numeric.cxx ostream.cxx queue.cxx
CXXSRCS += set.cxx sstream.cxx stack.cxx stdexcept.cxx streambuf.cxx
CXXSRCS += string.cxx support.cxx typeinfo.cxx utility.cxx valarray.cxx
CXXSRCS += vector.cxx
# Add the path to the uClibc++ subdirectory
DEPPATH += --dep-path .
VPATH += uClibc++

View File

@ -0,0 +1,30 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <algorithm>
namespace std{
}

View File

@ -0,0 +1,26 @@
/* Copyright (C) 2007 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <associative_base>
namespace std{
}

View File

@ -0,0 +1,26 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <bitset>
namespace std{
}

View File

@ -0,0 +1,69 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#define __UCLIBCXX_COMPILE_CHAR_TRAITS__ 1
#include <basic_definitions>
#include <char_traits>
namespace std{
_UCXXEXPORT const char_traits<char>::char_type* char_traits<char>::find(const char_type* s, int n, const char_type& a){
for(int i=0; i < n; i++){
if(eq(s[i], a)){
return (s+i);
}
}
return 0;
}
_UCXXEXPORT bool char_traits<char>::eq(const char_type& c1, const char_type& c2){
if(strncmp(&c1, &c2, 1) == 0){
return true;
}
return false;
}
_UCXXEXPORT char_traits<char>::char_type char_traits<char>::to_char_type(const int_type & i){
if(i > 0 && i <= 255){
return (char)(unsigned char)i;
}
//Out of range
return 0;
}
#ifdef __UCLIBCXX_HAS_WCHAR__
_UCXXEXPORT const char_traits<wchar_t>::char_type* char_traits<wchar_t>::find(const char_type* s, int n, const char_type& a){
for(int i=0; i < n; i++){
if(eq(s[i], a)){
return (s+i);
}
}
return 0;
}
#endif
}

View File

@ -0,0 +1,28 @@
/* Copyright (C) 2005 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <complex>
namespace std{
template class _UCXXEXPORT complex<float>;
}

View File

@ -0,0 +1,26 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <new>
#include <cstdlib>
#include <func_exception>
_UCXXEXPORT void operator delete(void* ptr) throw(){
free(ptr);
}

View File

@ -0,0 +1,28 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <new>
#include <cstdlib>
#include <func_exception>
#ifndef NO_NOTHROW
_UCXXEXPORT void operator delete(void* ptr, const std::nothrow_t& ) throw() {
free(ptr);
}
#endif

View File

@ -0,0 +1,26 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <new>
#include <cstdlib>
#include <func_exception>
_UCXXEXPORT void operator delete[](void * ptr) throw(){
free(ptr);
}

View File

@ -0,0 +1,28 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <new>
#include <cstdlib>
#include <func_exception>
#ifndef NO_NOTHROW
_UCXXEXPORT void operator delete[](void* ptr, const std::nothrow_t& ) throw(){
free(ptr);
}
#endif

View File

@ -0,0 +1,42 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <deque>
namespace std{
}

View File

@ -0,0 +1,61 @@
/* Copyright (C) 2006 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation, version 2.1
of the License.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <cstdlib>
#include <cstring>
#include <func_exception>
//This is a system-specific header which does all of the error-handling management
#include <unwind-cxx.h>
namespace __cxxabiv1{
extern "C" void * __cxa_allocate_exception(std::size_t thrown_size) throw(){
void *retval;
//The sizeof crap is required by Itanium ABI because we need to provide space for
//accounting information which is implementaion (gcc) specified
retval = malloc (thrown_size + sizeof(__cxa_exception));
if (0 == retval){
std::terminate();
}
memset (retval, 0, sizeof(__cxa_exception));
return (void *)((unsigned char *)retval + sizeof(__cxa_exception));
}
extern "C" void __cxa_free_exception(void *vptr) throw(){
free( (char *)(vptr) - sizeof(__cxa_exception) );
}
extern "C" __cxa_dependent_exception * __cxa_allocate_dependent_exception() throw(){
__cxa_dependent_exception *retval;
//The sizeof crap is required by Itanium ABI because we need to provide space for
//accounting information which is implementaion (gcc) specified
retval = static_cast<__cxa_dependent_exception*>(malloc (sizeof(__cxa_dependent_exception)));
if (0 == retval){
std::terminate();
}
memset (retval, 0, sizeof(__cxa_dependent_exception));
return retval;
}
extern "C" void __cxa_free_dependent_exception(__cxa_dependent_exception *vptr) throw(){
free( (char *)(vptr) );
}
}

View File

@ -0,0 +1,42 @@
/* Copyright (C) 2006 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation, version 2.1
of the License.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <cstdlib>
#include <cstring>
#include <func_exception>
//This is a system-specific header which does all of the error-handling management
#include <unwind-cxx.h>
//The following functionality is derived from reading of the GNU libstdc++ code and making it...simple
namespace __cxxabiv1{
static __UCLIBCXX_TLS __cxa_eh_globals eh_globals;
extern "C" __cxa_eh_globals* __cxa_get_globals() throw(){
return &eh_globals;
}
extern "C" __cxa_eh_globals* __cxa_get_globals_fast() throw(){
return &eh_globals;
}
}

View File

@ -0,0 +1,52 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <exception>
//We can't do this yet because gcc is too stupid to be able to handle
//different implementations of exception class.
#undef __UCLIBCXX_EXCEPTION_SUPPORT__
#ifdef __UCLIBCXX_EXCEPTION_SUPPORT__
namespace std{
_UCXXEXPORT static char * __std_exception_what_value = "exception";
//We are providing our own versions to be sneaky
_UCXXEXPORT exception::~exception() throw(){
//Empty function
}
_UCXXEXPORT const char* exception::what() const throw(){
return __std_exception_what_value;
}
_UCXXEXPORT bad_exception::~bad_exception() throw(){
}
}
#endif

View File

@ -0,0 +1,174 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#define __UCLIBCXX_COMPILE_FSTREAM__ 1
#include <fstream>
namespace std{
#ifdef __UCLIBCXX_EXPAND_FSTREAM_CHAR__
#ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
template _UCXXEXPORT filebuf::basic_filebuf();
template _UCXXEXPORT filebuf::~basic_filebuf();
#endif //__UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
template _UCXXEXPORT filebuf::int_type filebuf::pbackfail(filebuf::int_type c);
template _UCXXEXPORT filebuf * filebuf::open(const char* s, ios_base::openmode mode);
template _UCXXEXPORT filebuf * filebuf::close();
template _UCXXEXPORT filebuf::int_type filebuf::overflow(filebuf::int_type);
template _UCXXEXPORT filebuf::int_type filebuf::underflow ();
template _UCXXEXPORT streamsize filebuf::xsputn(const char* s, streamsize n);
template _UCXXEXPORT basic_streambuf<char, char_traits<char> >*
filebuf::setbuf(char * s, streamsize n);
#ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
template _UCXXEXPORT basic_ofstream<char, char_traits<char> >::basic_ofstream();
template _UCXXEXPORT basic_ofstream<char, char_traits<char> >::basic_ofstream(const char* s, ios_base::openmode mode);
template _UCXXEXPORT basic_ofstream<char, char_traits<char> >::~basic_ofstream();
template _UCXXEXPORT basic_ifstream<char, char_traits<char> >::basic_ifstream();
template _UCXXEXPORT basic_ifstream<char, char_traits<char> >::basic_ifstream(const char* s, ios_base::openmode mode);
template _UCXXEXPORT basic_ifstream<char, char_traits<char> >::~basic_ifstream();
#endif //__UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
#endif
#ifdef __UCLIBCXX_HAS_WCHAR__
template <> _UCXXEXPORT basic_filebuf<wchar_t, char_traits<wchar_t> >::int_type
basic_filebuf<wchar_t, char_traits<wchar_t> >::overflow(int_type c)
{
typedef basic_streambuf<wchar_t, char_traits<wchar_t> > wstreambuf;
typedef char_traits<wchar_t> wtraits;
if(is_open() == false){
//Can't do much
return wtraits::eof();
}
mbstate_t ps = { 0 };
char out_array[8];
size_t out_size;
if( wstreambuf::pbase() != 0 ){
//Write all possible character from the existing array first
size_t chars_written = 0;
while(wstreambuf::pbase() && (wstreambuf::pbase() + chars_written !=wstreambuf::pptr()) ){
out_size = wcrtomb(out_array, wstreambuf::pbase()[chars_written], &ps);
if(out_size == (size_t)(-1) || fwrite(out_array, out_size, 1, fp) == 0){
break;
}
++chars_written;
}
if( wstreambuf::pbase() + chars_written == wstreambuf::pptr() ){
wstreambuf::pbump(-chars_written);
}else{
//Shuffle data back into order
size_t chars_left = wstreambuf::pptr() - wstreambuf::pbase() - chars_written;
for(size_t i = 0; i < chars_left; ++i){
wstreambuf::pbase()[i] = (wstreambuf::pptr() - chars_written)[i];
}
return wtraits::eof();
}
}
if( !wtraits::eq_int_type(c, wtraits::eof()) ){
out_size = wcrtomb(out_array, c, &ps);
if(out_size == (size_t)(-1) || fwrite(out_array, out_size, 1, fp) == 0){
return wtraits::eof();
}
return c;
}
return wtraits::not_eof(c);
}
template <> _UCXXEXPORT basic_filebuf<wchar_t, char_traits<wchar_t> >::int_type
basic_filebuf<wchar_t, char_traits<wchar_t> >::underflow()
{
/*Some variables used internally:
Buffer pointers:
charT * mgbeg;
charT * mgnext;
charT * mgend;
eback() returns mgbeg
gptr() returns mgnext
egptr() returns mgend
gbump(int n) mgnext+=n
*/
typedef char_traits<wchar_t> traits;
typedef basic_streambuf<wchar_t, traits> wstreambuf;
if(wstreambuf::eback() == wstreambuf::gptr() && 0 != wstreambuf::eback()){ //Buffer is full
return traits::to_int_type(*wstreambuf::gptr());
}
size_t in_size;
wchar_t c = 0;
wint_t wi = 0;
in_size = 0;
wi = fgetwc(fp);
if(WEOF == wi){
fprintf(stderr, "WEOF returned by fgetwc\n");
return traits::eof();
}
c = traits::to_char_type(wi);
if(wstreambuf::eback() == 0){
return traits::to_int_type(c);
}
for(wchar_t * i = wstreambuf::gptr(); i < wstreambuf::egptr(); ++i){
*(i-1) = *i;
}
*(wstreambuf::egptr()-1) = c;
wstreambuf::mgnext -= 1;
return traits::to_int_type(*wstreambuf::gptr());
}
#endif // __UCLIBCXX_HAS_WCHAR__
}

View File

@ -0,0 +1,87 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <exception>
#include <func_exception>
#include <stdexcept>
#include <cstdlib>
namespace std{
#ifdef __UCLIBCXX_EXCEPTION_SUPPORT__
_UCXXEXPORT void __throw_bad_alloc(){
throw bad_alloc();
}
_UCXXEXPORT void __throw_out_of_range( const char * message){
if(message == 0){
throw out_of_range();
}
throw out_of_range(message);
}
_UCXXEXPORT void __throw_overflow_error( const char * message){
if(message == 0){
throw overflow_error();
}
throw overflow_error(message);
}
_UCXXEXPORT void __throw_length_error(const char * message){
if(message == 0){
throw length_error();
}
throw length_error(message);
}
_UCXXEXPORT void __throw_invalid_argument(const char * message){
if(message == 0){
throw invalid_argument();
}
throw invalid_argument(message);
}
#else
_UCXXEXPORT void __throw_bad_alloc(){
abort();
}
_UCXXEXPORT void __throw_out_of_range( const char * ){
abort();
}
_UCXXEXPORT void __throw_overflow_error( const char * ){
abort();
}
_UCXXEXPORT void __throw_length_error(const char * ){
abort();
}
_UCXXEXPORT void __throw_invalid_argument(const char *){
abort();
}
#endif
}

View File

@ -0,0 +1,29 @@
/* Copyright (C) 2005 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <iomanip>
namespace std{
}

View File

@ -0,0 +1,189 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#define __UCLIBCXX_COMPILE_IOS__ 1
#include <ios>
#include <ostream>
#include <istream>
#include <cstdio>
#include <fstream>
namespace std{
#ifdef __UCLIBCXX_SUPPORT_CDIR__
_UCXXLOCAL int ios_base::Init::init_cnt = 0; //Needed to ensure the static value is created
//Create buffers first
#ifdef __UCLIBCXX_SUPPORT_COUT__
_UCXXEXPORT filebuf _cout_filebuf;
#endif
#ifdef __UCLIBCXX_SUPPORT_CIN__
_UCXXEXPORT filebuf _cin_filebuf;
#endif
#ifdef __UCLIBCXX_SUPPORT_CERR__
_UCXXEXPORT filebuf _cerr_filebuf;
#endif
#ifdef __UCLIBCXX_SUPPORT_CLOG__
_UCXXEXPORT filebuf _clog_filebuf;
#endif
#ifdef __UCLIBCXX_SUPPORT_WCOUT__
_UCXXEXPORT wfilebuf _wcout_filebuf;
#endif
#ifdef __UCLIBCXX_SUPPORT_WCIN__
_UCXXEXPORT wfilebuf _wcin_filebuf;
#endif
#ifdef __UCLIBCXX_SUPPORT_WCERR__
_UCXXEXPORT wfilebuf _wcerr_filebuf;
#endif
#ifdef __UCLIBCXX_SUPPORT_WCLOG__
_UCXXEXPORT wfilebuf _wclog_filebuf;
#endif
//Then create streams
#ifdef __UCLIBCXX_SUPPORT_COUT__
_UCXXEXPORT ostream cout(&_cout_filebuf);
#endif
#ifdef __UCLIBCXX_SUPPORT_CIN__
_UCXXEXPORT istream cin(&_cin_filebuf);
#endif
#ifdef __UCLIBCXX_SUPPORT_CERR__
_UCXXEXPORT ostream cerr(&_cerr_filebuf);
#endif
#ifdef __UCLIBCXX_SUPPORT_CLOG__
_UCXXEXPORT ostream clog(&_clog_filebuf);
#endif
#ifdef __UCLIBCXX_SUPPORT_WCOUT__
_UCXXEXPORT wostream wcout(&_wcout_filebuf);
#endif
#ifdef __UCLIBCXX_SUPPORT_WCIN__
_UCXXEXPORT wistream wcin(&_wcin_filebuf);
#endif
#ifdef __UCLIBCXX_SUPPORT_WCERR__
_UCXXEXPORT wostream wcerr(&_wcerr_filebuf);
#endif
#ifdef __UCLIBCXX_SUPPORT_WCLOG__
_UCXXEXPORT wostream wclog(&_wclog_filebuf);
#endif
_UCXXEXPORT ios_base::Init::Init(){
if(init_cnt == 0){ //Need to construct cout et al
#ifdef __UCLIBCXX_SUPPORT_COUT__
_cout_filebuf.fp = stdout;
_cout_filebuf.openedFor = ios_base::out;
#endif
#ifdef __UCLIBCXX_SUPPORT_CERR__
_cerr_filebuf.fp = stderr;
_cerr_filebuf.openedFor = ios_base::out;
cerr.mformat |= ios_base::unitbuf;
#endif
#ifdef __UCLIBCXX_SUPPORT_CLOG__
_clog_filebuf.fp = stderr;
_clog_filebuf.openedFor = ios_base::out;
#endif
#ifdef __UCLIBCXX_SUPPORT_CIN__
_cin_filebuf.fp = stdin;
_cin_filebuf.openedFor = ios_base::in;
#ifdef __UCLIBCXX_SUPPORT_COUT__
cin.tie(&cout);
#endif
#endif
#ifdef __UCLIBCXX_SUPPORT_WCOUT__
_wcout_filebuf.fp = stdout;
_wcout_filebuf.openedFor = ios_base::out;
#endif
#ifdef __UCLIBCXX_SUPPORT_WCERR__
_wcerr_filebuf.fp = stderr;
_wcerr_filebuf.openedFor = ios_base::out;
wcerr.mformat |= ios_base::unitbuf;
#endif
#ifdef __UCLIBCXX_SUPPORT_WCLOG__
_wclog_filebuf.fp = stderr;
_wclog_filebuf.openedFor = ios_base::out;
#endif
#ifdef __UCLIBCXX_SUPPORT_WCIN__
_wcin_filebuf.fp = stdin;
_wcin_filebuf.openedFor = ios_base::in;
#ifdef __UCLIBCXX_SUPPORT_WCOUT__
wcin.tie(&wcout);
#endif
#endif
}
init_cnt++;
}
_UCXXEXPORT ios_base::Init::~Init(){
--init_cnt;
if(init_cnt==0){
}
}
#endif
#ifdef __UCLIBCXX_EXPAND_IOS_CHAR__
template _UCXXEXPORT void basic_ios<char, char_traits<char> >::clear(iostate state);
template _UCXXEXPORT void basic_ios<char, char_traits<char> >::setstate(iostate state);
#endif
_UCXXEXPORT ios_base::fmtflags ios_base::flags(fmtflags fmtfl){
fmtflags temp = mformat;
mformat = fmtfl;
return temp;
}
_UCXXEXPORT ios_base::fmtflags ios_base::setf(fmtflags fmtfl){
return flags(flags() | fmtfl);
}
_UCXXEXPORT ios_base::fmtflags ios_base::setf(fmtflags fmtfl, fmtflags mask ){
return flags( (flags()& ~mask) | (fmtfl & mask));
}
_UCXXEXPORT streamsize ios_base::precision(streamsize prec){
streamsize temp = mprecision;
mprecision = prec;
return temp;
}
_UCXXEXPORT streamsize ios_base::width(streamsize wide){
streamsize temp = mwidth;
mwidth = wide;
return temp;
}
_UCXXEXPORT locale ios_base::imbue(const locale& loc){
locale retval = mLocale;
mLocale = loc;
return retval;
}
}

View File

@ -0,0 +1,38 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#define __UCLIBCXX_COMPILE_IOSTREAM__ 1
#include <iostream>
namespace std{
#ifdef __UCLIBCXX_EXPAND_OSTREAM_CHAR__
#ifdef __UCLIBCXX_EXPAND_ISTREAM_CHAR__
template _UCXXEXPORT basic_iostream<char, char_traits<char> >::
basic_iostream(basic_streambuf<char, char_traits<char> >* sb);
template _UCXXEXPORT basic_iostream<char, char_traits<char> >::~basic_iostream();
#endif
#endif
}

View File

@ -0,0 +1,75 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#define __UCLIBCXX_COMPILE_ISTREAM__ 1
#include <istream>
namespace std{
#ifdef __UCLIBCXX_EXPAND_ISTREAM_CHAR__
template <> _UCXXEXPORT string _readToken<char, char_traits<char> >(istream & stream)
{
string temp;
char_traits<char>::int_type c;
while(true){
c = stream.rdbuf()->sgetc();
if(c != char_traits<char>::eof() && isspace(c) == false){
stream.rdbuf()->sbumpc();
temp.append(1, char_traits<char>::to_char_type(c));
}else{
break;
}
}
if (temp.size() == 0)
stream.setstate(ios_base::eofbit|ios_base::failbit);
return temp;
}
template _UCXXEXPORT istream::int_type istream::get();
template _UCXXEXPORT istream & istream::get(char &c);
template _UCXXEXPORT istream & istream::operator>>(bool &n);
template _UCXXEXPORT istream & istream::operator>>(short &n);
template _UCXXEXPORT istream & istream::operator>>(unsigned short &n);
template _UCXXEXPORT istream & istream::operator>>(int &n);
template _UCXXEXPORT istream & istream::operator>>(unsigned int &n);
template _UCXXEXPORT istream & istream::operator>>(long unsigned &n);
template _UCXXEXPORT istream & istream::operator>>(long int &n);
template _UCXXEXPORT istream & istream::operator>>(void *& p);
template _UCXXEXPORT istream & operator>>(istream & is, char & c);
#ifdef __UCLIBCXX_HAS_FLOATS__
template _UCXXEXPORT istream & istream::operator>>(float &f);
template _UCXXEXPORT istream & istream::operator>>(double &f);
template _UCXXEXPORT istream & istream::operator>>(long double &f);
#endif
template _UCXXEXPORT void __skipws(basic_istream<char, char_traits<char> >& is);
#endif
}

View File

@ -0,0 +1,28 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <iterator>
namespace std{
}

View File

@ -0,0 +1,25 @@
/* Copyright (C) 2006 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <limits>
namespace std{
}

View File

@ -0,0 +1,29 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <list>
namespace std{
}

View File

@ -0,0 +1,29 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <locale>
#include <cstring>
#include <string>
#include <stdexcept>
#include <cctype>
namespace std{
}

View File

@ -0,0 +1,33 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <map>
namespace std{
}

View File

@ -0,0 +1,31 @@
/* Copyright (C) 2005 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <new>
const std::nothrow_t std::nothrow = { };
//Name selected to be compatable with g++ code
std::new_handler __new_handler;
_UCXXEXPORT std::new_handler std::set_new_handler(std::new_handler new_p) throw(){
std::new_handler retval = __new_handler;
__new_handler = new_p;
return retval;
}

View File

@ -0,0 +1,35 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <new>
#include <cstdlib>
#include <func_exception>
_UCXXEXPORT void* operator new(std::size_t numBytes) throw(std::bad_alloc){
//C++ stardard 5.3.4.8 requires that a valid pointer be returned for
//a call to new(0). Thus:
if(numBytes == 0){
numBytes = 1;
}
void * p = malloc(numBytes);
if(p == 0){
std::__throw_bad_alloc();
}
return p;
}

View File

@ -0,0 +1,28 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <new>
#include <cstdlib>
#include <func_exception>
#ifndef NO_NOTHROW
_UCXXEXPORT void* operator new(std::size_t numBytes, const std::nothrow_t& ) throw(){
return malloc(numBytes);
}
#endif

View File

@ -0,0 +1,35 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <new>
#include <cstdlib>
#include <func_exception>
_UCXXEXPORT void* operator new[](std::size_t numBytes) throw(std::bad_alloc){
//C++ stardard 5.3.4.8 requires that a valid pointer be returned for
//a call to new(0). Thus:
if(numBytes == 0){
numBytes = 1;
}
void * p = malloc(numBytes);
if(p == 0){
std::__throw_bad_alloc();
}
return p;
}

View File

@ -0,0 +1,28 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <new>
#include <cstdlib>
#include <func_exception>
#ifndef NO_NOTHROW
_UCXXEXPORT void* operator new[](std::size_t numBytes, const std::nothrow_t& ) throw(){
return malloc(numBytes);
}
#endif

View File

@ -0,0 +1,27 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <numeric>
namespace std{
}

View File

@ -0,0 +1,65 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#define __UCLIBCXX_COMPILE_OSTREAM__ 1
#include <ostream>
namespace std{
#ifdef __UCLIBCXX_EXPAND_OSTREAM_CHAR__
#ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
template _UCXXEXPORT ostream::~basic_ostream();
#endif //__UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
template _UCXXEXPORT ostream & ostream::flush();
template _UCXXEXPORT ostream & ostream::operator<<(bool n);
template _UCXXEXPORT ostream & ostream::operator<<(short int n);
template _UCXXEXPORT ostream & ostream::operator<<(unsigned short int n);
template _UCXXEXPORT ostream & ostream::operator<<(int n);
template _UCXXEXPORT ostream & ostream::operator<<(unsigned int n);
template _UCXXEXPORT ostream & ostream::operator<<(long n);
template _UCXXEXPORT ostream & ostream::operator<<(unsigned long n);
template _UCXXEXPORT ostream & ostream::operator<<(float f);
template _UCXXEXPORT ostream & ostream::operator<<(double f);
template _UCXXEXPORT ostream & ostream::operator<<(long double f);
template _UCXXEXPORT ostream & ostream::operator<<(void* p);
template _UCXXEXPORT ostream & ostream::operator<<(basic_streambuf<char, char_traits<char> >* sb);
#ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
template _UCXXEXPORT ostream::sentry::sentry(ostream & os);
template _UCXXEXPORT ostream::sentry::~sentry();
#endif //__UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
template _UCXXEXPORT ostream & endl(ostream & os);
template _UCXXEXPORT ostream & flush(ostream & os);
template _UCXXEXPORT ostream & operator<<(ostream & out, char c);
template _UCXXEXPORT ostream & operator<<(ostream & out, const char* c);
template _UCXXEXPORT ostream & operator<<(ostream & out, unsigned char c);
template _UCXXEXPORT ostream & operator<<(ostream & out, const unsigned char* c);
#endif
}

View File

@ -0,0 +1,27 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <queue>
namespace std{
}

View File

@ -0,0 +1,33 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <set>
namespace std{
}

View File

@ -0,0 +1,59 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#define __UCLIBCXX_COMPILE_SSTREAM__ 1
#include <sstream>
namespace std{
#ifdef __UCLIBCXX_EXPAND_SSTREAM_CHAR__
typedef char_traits<char> tr_ch;
typedef basic_stringbuf<char, tr_ch, allocator<char> > char_stringbuf;
#ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
template _UCXXEXPORT char_stringbuf::basic_stringbuf(ios_base::openmode which);
template _UCXXEXPORT char_stringbuf::~basic_stringbuf();
#endif //__UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
template _UCXXEXPORT basic_string<char, char_traits<char>, allocator<char> > char_stringbuf::str() const;
template _UCXXEXPORT char_stringbuf::int_type char_stringbuf::pbackfail(char_stringbuf::int_type c);
template _UCXXEXPORT char_stringbuf::int_type char_stringbuf::overflow(char_stringbuf::int_type c);
template _UCXXEXPORT char_stringbuf::pos_type
char_stringbuf::seekoff(char_stringbuf::off_type, ios_base::seekdir, ios_base::openmode);
template _UCXXEXPORT char_stringbuf::int_type char_stringbuf::underflow ();
template _UCXXEXPORT streamsize char_stringbuf::xsputn(const char* s, streamsize n);
#ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
template _UCXXEXPORT basic_stringstream<char, tr_ch, allocator<char> >::basic_stringstream(ios_base::openmode which);
template _UCXXEXPORT basic_istringstream<char, tr_ch, allocator<char> >::~basic_istringstream();
template _UCXXEXPORT basic_ostringstream<char, tr_ch, allocator<char> >::~basic_ostringstream();
template _UCXXEXPORT basic_stringstream<char, tr_ch, allocator<char> >::~basic_stringstream();
#endif //__UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
#endif
}

View File

@ -0,0 +1,27 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stack>
namespace std{
}

View File

@ -0,0 +1,63 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <exception>
#include <stdexcept>
#ifdef __UCLIBCXX_EXCEPTION_SUPPORT__
namespace std{
_UCXXEXPORT logic_error::logic_error() throw() : mstring(){
}
_UCXXEXPORT logic_error::logic_error(const string& what_arg) : mstring(what_arg){
}
_UCXXEXPORT const char * logic_error::what() const throw(){
return mstring.c_str();
}
_UCXXEXPORT out_of_range::out_of_range() : logic_error(){
}
_UCXXEXPORT out_of_range::out_of_range(const string & what_arg) : logic_error(what_arg) {
}
_UCXXEXPORT runtime_error::runtime_error() : mstring(){
}
_UCXXEXPORT runtime_error::runtime_error(const string& what_arg) : mstring(what_arg){
}
_UCXXEXPORT const char * runtime_error::what() const throw(){
return mstring.c_str();
}
}
#endif

View File

@ -0,0 +1,49 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#define __UCLIBCXX_COMPILE_STREAMBUF__ 1
#include <streambuf>
namespace std{
#ifdef __UCLIBCXX_EXPAND_STREAMBUF_CHAR__
#ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
template _UCXXEXPORT streambuf::basic_streambuf();
template _UCXXEXPORT streambuf::~basic_streambuf();
#endif
template _UCXXEXPORT locale streambuf::pubimbue(const locale &loc);
template _UCXXEXPORT streamsize streambuf::in_avail();
template _UCXXEXPORT streambuf::int_type streambuf::sbumpc();
template _UCXXEXPORT streambuf::int_type streambuf::snextc();
template _UCXXEXPORT streambuf::int_type streambuf::sgetc();
template _UCXXEXPORT streambuf::int_type streambuf::sputbackc(char_type c);
template _UCXXEXPORT streambuf::int_type streambuf::sungetc();
template _UCXXEXPORT streambuf::int_type streambuf::sputc(char_type c);
#endif
}

View File

@ -0,0 +1,112 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#define __UCLIBCXX_COMPILE_STRING__ 1
#include <basic_definitions>
#include <char_traits>
#include <string>
#include <string_iostream>
#include <string.h>
#include <ostream>
namespace std{
#ifdef __UCLIBCXX_EXPAND_STRING_CHAR__
#ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
template _UCXXEXPORT string::basic_string(const allocator<char> &);
template _UCXXEXPORT string::basic_string(size_type n, char c, const allocator<char> & );
template _UCXXEXPORT string::basic_string(const char* s, const allocator<char>& al);
template _UCXXEXPORT string::basic_string(const basic_string& str, size_type pos, size_type n, const allocator<char>& al);
template _UCXXEXPORT string::~basic_string();
#endif // __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
template _UCXXEXPORT string & string::append(const char * s, size_type n);
template _UCXXEXPORT string::size_type string::find(const string & str, size_type pos) const;
template _UCXXEXPORT string::size_type string::find(const char* s, size_type pos) const;
template _UCXXEXPORT string::size_type string::find (char c, size_type pos) const;
template _UCXXEXPORT string::size_type string::rfind(const string & str, size_type pos) const;
template _UCXXEXPORT string::size_type string::rfind(char c, size_type pos) const;
template _UCXXEXPORT string::size_type string::rfind(const char* s, size_type pos) const;
template _UCXXEXPORT string::size_type string::find_first_of(const string &, size_type) const;
template _UCXXEXPORT string::size_type string::find_first_of(const char *, size_type pos, size_type n) const;
template _UCXXEXPORT string::size_type string::find_first_of(const char*, size_type pos) const;
template _UCXXEXPORT string::size_type string::find_first_of(char c, size_type pos) const;
template _UCXXEXPORT string::size_type string::find_last_of (const string & , size_type pos) const;
template _UCXXEXPORT string::size_type string::find_last_of (const char* s, size_type pos, size_type n) const;
template _UCXXEXPORT string::size_type string::find_last_of (const char* s, size_type pos) const;
template _UCXXEXPORT string::size_type string::find_last_of (char c, size_type pos) const;
template _UCXXEXPORT string::size_type string::find_first_not_of(const string &, size_type) const;
template _UCXXEXPORT string::size_type string::find_first_not_of(const char*, size_type, size_type) const;
template _UCXXEXPORT string::size_type string::find_first_not_of(const char*, size_type) const;
template _UCXXEXPORT string::size_type string::find_first_not_of(char c, size_type) const;
template _UCXXEXPORT int string::compare(const string & str) const;
// template _UCXXEXPORT int string::compare(size_type pos1, size_type n1, const string & str) const;
template _UCXXEXPORT int string::compare(
size_type pos1, size_type n1, const string & str, size_type pos2, size_type n2) const;
template _UCXXEXPORT string string::substr(size_type pos, size_type n) const;
template _UCXXEXPORT string & string::operator=(const string & str);
template _UCXXEXPORT string & string::operator=(const char * s);
template _UCXXEXPORT bool operator==(const string & lhs, const string & rhs);
template _UCXXEXPORT bool operator==(const char * lhs, const string & rhs);
template _UCXXEXPORT bool operator==(const string & lhs, const char * rhs);
template _UCXXEXPORT bool operator!=(const string & lhs, const string & rhs);
template _UCXXEXPORT bool operator!=(const char * lhs, const string & rhs);
template _UCXXEXPORT bool operator!=(const string & lhs, const char * rhs);
template _UCXXEXPORT string operator+(const string & lhs, const char* rhs);
template _UCXXEXPORT string operator+(const char* lhs, const string & rhs);
template _UCXXEXPORT string operator+(const string & lhs, const string & rhs);
template _UCXXEXPORT bool operator> (const string & lhs, const string & rhs);
template _UCXXEXPORT bool operator< (const string & lhs, const string & rhs);
//Functions dependent upon OSTREAM
#ifdef __UCLIBCXX_EXPAND_OSTREAM_CHAR__
template _UCXXEXPORT ostream & operator<<(ostream & os, const string & str);
#endif
//Functions dependent upon ISTREAM
#ifdef __UCLIBCXX_EXPAND_ISTREAM_CHAR__
template _UCXXEXPORT istream & operator>>(istream & is, string & str);
#endif
#endif
}

View File

@ -0,0 +1,53 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <support>
extern "C" void *__cxa_allocate_exception(size_t thrown_size){
void * retval;
// The amount of data needed is the size of the object *PLUS*
// the size of the header. The header is of struct __cxa_exception
// The address needs to be adjusted because the pointer we return
// should not point to the start of the memory, but to the point
// where the object being thrown actually starts
//
retval = malloc(thrown_size + sizeof(__cxa_exception));
// Check to see that we actuall allocated memory
if(retval == 0){
std::terminate();
}
//Need to do a typecast to char* otherwize we are doing math with
//a void* which makes the compiler cranky (Like me)
return ((char *)retval + sizeof(__cxa_exception));
}
extern "C" void __cxa_free_exception(void *thrown_exception){
}
extern "C" void __cxa_throw (void *thrown_exception, void *info,void (*dest) (void *) ){
}

View File

@ -0,0 +1,34 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <typeinfo>
namespace std{
_UCXXEXPORT bad_cast::~bad_cast() throw(){
}
_UCXXEXPORT bad_typeid::~bad_typeid() throw(){
}
}

View File

@ -0,0 +1,30 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <utility>
namespace std{
}

View File

@ -0,0 +1,29 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <valarray>
namespace std{
}

View File

@ -0,0 +1,83 @@
/* Copyright (C) 2004 Garrett A. Kajmowicz
This file is part of the uClibc++ Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#define __UCLIBCXX_COMPILE_VECTOR__ 1
#include <vector>
namespace std{
#ifdef __UCLIBCXX_EXPAND_VECTOR_BASIC__
#ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
template _UCXXEXPORT vector<char, allocator<char> >::vector(const allocator<char>& al);
template _UCXXEXPORT vector<char, allocator<char> >::vector(size_type n, const char & value, const allocator<char> & al);
template _UCXXEXPORT vector<char, allocator<char> >::~vector();
template _UCXXEXPORT vector<unsigned char, allocator<unsigned char> >::~vector();
#endif //__UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
template _UCXXEXPORT void vector<char, allocator<char> >::reserve(size_type n);
template _UCXXEXPORT void vector<unsigned char, allocator<unsigned char> >::reserve(size_type n);
template _UCXXEXPORT void vector<short int, allocator<short int> >::reserve(size_type n);
template _UCXXEXPORT void vector<unsigned short int, allocator<unsigned short int> >::reserve(size_type n);
template _UCXXEXPORT void vector<int, allocator<int> >::reserve(size_type n);
template _UCXXEXPORT void vector<unsigned int, allocator<unsigned int> >::reserve(size_type n);
template _UCXXEXPORT void vector<long int, allocator<long int> >::reserve(size_type n);
template _UCXXEXPORT void vector<unsigned long int, allocator<unsigned long int> >::reserve(size_type n);
template _UCXXEXPORT void vector<float, allocator<float> >::reserve(size_type n);
template _UCXXEXPORT void vector<double, allocator<double> >::reserve(size_type n);
template _UCXXEXPORT void vector<bool, allocator<bool> >::reserve(size_type n);
template _UCXXEXPORT void vector<char, allocator<char> >::resize(size_type sz, const char & c);
template _UCXXEXPORT void vector<unsigned char, allocator<unsigned char> >::resize(size_type sz, const unsigned char & c);
template _UCXXEXPORT void vector<short int, allocator<short int> >::resize(size_type sz, const short & c);
template _UCXXEXPORT void vector<unsigned short int, allocator<unsigned short int> >
::resize(size_type sz, const unsigned short int & c);
template _UCXXEXPORT void vector<int, allocator<int> >::resize(size_type sz, const int & c);
template _UCXXEXPORT void vector<unsigned int, allocator<unsigned int> >::resize(size_type sz, const unsigned int & c);
template _UCXXEXPORT void vector<long int, allocator<long int> >::resize(size_type sz, const long int & c);
template _UCXXEXPORT void vector<unsigned long int, allocator<unsigned long int> >::
resize(size_type sz, const unsigned long int & c);
template _UCXXEXPORT void vector<float, allocator<float> >::resize(size_type sz, const float & c);
template _UCXXEXPORT void vector<double, allocator<double> >::resize(size_type sz, const double & c);
template _UCXXEXPORT void vector<bool, allocator<bool> >::resize(size_type sz, const bool & c);
#elif defined __UCLIBCXX_EXPAND_STRING_CHAR__
#ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
template _UCXXEXPORT vector<char, allocator<char> >::vector(const allocator<char>& al);
template _UCXXEXPORT vector<char, allocator<char> >::vector(size_type n, const char & value, const allocator<char> & al);
template _UCXXEXPORT vector<char, allocator<char> >::~vector();
#endif // __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
template _UCXXEXPORT void vector<char, allocator<char> >::reserve(size_type n);
template _UCXXEXPORT void vector<char, allocator<char> >::resize(size_type sz, const char & c);
#endif
}

View File

@ -35,20 +35,37 @@
-include $(TOPDIR)/Make.defs -include $(TOPDIR)/Make.defs
ASRCS = # Sources
AOBJS = $(ASRCS:.S=$(OBJEXT))
CSRCS =
COBJS = $(CSRCS:.c=$(OBJEXT))
CXXSRCS = libxx_cxapurevirtual.cxx libxx_delete.cxx libxx_deletea.cxx \
libxx_eabi_atexit.cxx libxx_new.cxx libxx_newa.cxx
CXXOBJS = $(CXXSRCS:.cxx=$(OBJEXT))
SRCS = $(ASRCS) $(CSRCS) $(CXXSRCS) ASRCS =
OBJS = $(AOBJS) $(COBJS) $(CXXOBJS) CSRCS =
CXXSRCS = libxx_cxapurevirtual.cxx libxx_delete.cxx libxx_deletea.cxx
CXXSRCS += libxx_eabi_atexit.cxx libxx_new.cxx libxx_newa.cxx
BIN = liblibxx$(LIBEXT) # Paths
all: $(BIN) DEPPATH = --dep-path .
VPATH = .
# Include the uClibc++ Make.defs file (if it is present). If is present,
# the uClibc++/Make.defs file will add its files to the source file list,
# add its DEPPATH info, and will add the appropriate paths to the VPATH
# variable
-include/uClibc++/Make.defs
# Object Files
AOBJS = $(ASRCS:.S=$(OBJEXT))
COBJS = $(CSRCS:.c=$(OBJEXT))
CXXOBJS = $(CXXSRCS:.cxx=$(OBJEXT))
SRCS = $(ASRCS) $(CSRCS) $(CXXSRCS)
OBJS = $(AOBJS) $(COBJS) $(CXXOBJS)
BIN = liblibxx$(LIBEXT)
all: $(BIN)
$(AOBJS): %$(OBJEXT): %.S $(AOBJS): %$(OBJEXT): %.S
$(call ASSEMBLE, $<, $@) $(call ASSEMBLE, $<, $@)
@ -65,7 +82,7 @@ $(BIN): $(OBJS)
done ; ) done ; )
.depend: Makefile $(SRCS) .depend: Makefile $(SRCS)
@$(MKDEP) $(CXX) -- $(CXXFLAGS) -- $(SRCS) >Make.dep @$(MKDEP) $(DEPPATH) $(CXX) -- $(CXXFLAGS) -- $(SRCS) >Make.dep
@touch $@ @touch $@
depend: .depend depend: .depend