@@ -620,6 +620,7 @@ set(ALL_TESTS | |||||
session_interface_test | session_interface_test | ||||
secure_post_test | secure_post_test | ||||
mount_point_test | mount_point_test | ||||
todec_test | |||||
) | ) | ||||
if(NOT DISABLE_TCPCACHE) | if(NOT DISABLE_TCPCACHE) | ||||
@@ -701,6 +702,7 @@ install(DIRECTORY cppcms DESTINATION include | |||||
set(CNF "${CMAKE_CURRENT_SOURCE_DIR}/tests") | set(CNF "${CMAKE_CURRENT_SOURCE_DIR}/tests") | ||||
add_test(base64_test base64_test) | add_test(base64_test base64_test) | ||||
add_test(todec_test todec_test) | |||||
add_test(encryptor_test encryptor_test "${CNF}") | add_test(encryptor_test encryptor_test "${CNF}") | ||||
add_test(storage_test storage_test) | add_test(storage_test storage_test) | ||||
add_test(json_test json_test) | add_test(json_test json_test) | ||||
@@ -0,0 +1,112 @@ | |||||
/////////////////////////////////////////////////////////////////////////////// | |||||
// | |||||
// Copyright (C) 2008-2012 Artyom Beilis (Tonkikh) <artyomtnk@yahoo.com> | |||||
// | |||||
// See accompanying file COPYING.TXT file for licensing details. | |||||
// | |||||
/////////////////////////////////////////////////////////////////////////////// | |||||
#ifndef CPPCMS_IMPL_TODEC_H | |||||
#define CPPCMS_IMPL_TODEC_H | |||||
#include <limits> | |||||
#include <ostream> | |||||
namespace cppcms { | |||||
namespace impl { | |||||
namespace details { | |||||
template<bool sig> | |||||
struct decimal_traits; | |||||
template<> | |||||
struct decimal_traits<false> { | |||||
template<typename T> | |||||
static void conv(T v,char *&begin,char *&buf) | |||||
{ | |||||
begin = buf; | |||||
while(v!=0) { | |||||
*buf++ = '0' + v % 10; | |||||
v/=10; | |||||
} | |||||
} | |||||
}; | |||||
template<> | |||||
struct decimal_traits<true> { | |||||
template<typename T> | |||||
static void conv(T v,char *&begin,char *&buf) | |||||
{ | |||||
if(v<0) { | |||||
*buf++ = '-'; | |||||
begin=buf; | |||||
while(v!=0) { | |||||
*buf++ = '0' - (v % 10); | |||||
v/=10; | |||||
} | |||||
} | |||||
else { | |||||
decimal_traits<false>::conv(v,begin,buf); | |||||
} | |||||
} | |||||
}; | |||||
} | |||||
template<typename Integer> | |||||
void todec(Integer v,char *buf) | |||||
{ | |||||
typedef std::numeric_limits<Integer> limits; | |||||
if(v == 0) { | |||||
*buf++ = '0'; | |||||
*buf++ = 0; | |||||
return; | |||||
} | |||||
char *begin=0; | |||||
details::decimal_traits<limits::is_signed>::conv(v,begin,buf); | |||||
*buf-- = 0; | |||||
while(begin < buf) { | |||||
char tmp = *begin; | |||||
*begin = *buf; | |||||
*buf = tmp; | |||||
buf--; | |||||
begin++; | |||||
} | |||||
} | |||||
template<typename I> | |||||
std::string todec_string(I v) | |||||
{ | |||||
char buf[std::numeric_limits<I>::digits10 + 4]; | |||||
todec<I>(v,buf); | |||||
std::string tmp = buf; | |||||
return tmp; | |||||
} | |||||
namespace details { | |||||
template<typename T> | |||||
struct write_int_to_stream { | |||||
write_int_to_stream(T vi = 0) : v(vi) {} | |||||
T v; | |||||
void operator()(std::ostream &out) const | |||||
{ | |||||
char buf[std::numeric_limits<T>::digits10 + 4]; | |||||
todec<T>(v,buf); | |||||
out << buf; | |||||
} | |||||
}; | |||||
template<typename T> | |||||
std::ostream &operator<<(std::ostream &out,write_int_to_stream<T> const &v) | |||||
{ | |||||
v(out); | |||||
return out; | |||||
} | |||||
} // details | |||||
template<typename T> | |||||
details::write_int_to_stream<T> cint(T v) | |||||
{ | |||||
return details::write_int_to_stream<T>(v); | |||||
} | |||||
} | |||||
} | |||||
#endif |
@@ -11,13 +11,6 @@ | |||||
#include <cppcms/cppcms_error.h> | #include <cppcms/cppcms_error.h> | ||||
#include <vector> | #include <vector> | ||||
#include <cppcms/config.h> | |||||
#ifdef CPPCMS_USE_EXTERNAL_BOOST | |||||
# include <boost/format.hpp> | |||||
#else // Internal Boost | |||||
# include <cppcms_boost/format.hpp> | |||||
namespace boost = cppcms_boost; | |||||
#endif | |||||
namespace cppcms { | namespace cppcms { | ||||
@@ -14,17 +14,14 @@ | |||||
#include <cppcms/http_file.h> | #include <cppcms/http_file.h> | ||||
#include <cppcms/session_interface.h> | #include <cppcms/session_interface.h> | ||||
#include <stack> | #include <stack> | ||||
#ifdef CPPCMS_USE_EXTERNAL_BOOST | |||||
# include <boost/format.hpp> | |||||
#else // Internal Boost | |||||
# include <cppcms_boost/format.hpp> | |||||
namespace boost = cppcms_boost; | |||||
#endif | |||||
#include <booster/regex.h> | #include <booster/regex.h> | ||||
#include "todec.h" | |||||
namespace cppcms { | namespace cppcms { | ||||
using impl::cint; | |||||
struct form_context::_data {}; | struct form_context::_data {}; | ||||
form_context::form_context() : | form_context::form_context() : | ||||
@@ -421,7 +418,7 @@ void base_widget::generate(int position,form_context * /*context*/) | |||||
if(is_generation_done_) | if(is_generation_done_) | ||||
return; | return; | ||||
if(name_.empty()) { | if(name_.empty()) { | ||||
name_ = (boost::format("_%1%",std::locale::classic()) % position).str(); | |||||
name_ = "_" + impl::todec_string(position); | |||||
} | } | ||||
is_generation_done_ = 1; | is_generation_done_ = 1; | ||||
} | } | ||||
@@ -671,10 +668,10 @@ void text::render_attributes(form_context &context) | |||||
std::ostream &output = context.out(); | std::ostream &output = context.out(); | ||||
if(size_ >= 0) | if(size_ >= 0) | ||||
output << boost::format("size=\"%1%\" ",std::locale::classic()) % size_; | |||||
output << "size=\"" << cint(size_) <<"\" "; | |||||
std::pair<int,int> lm=limits(); | std::pair<int,int> lm=limits(); | ||||
if(lm.second >= 0 && validate_charset()) { | if(lm.second >= 0 && validate_charset()) { | ||||
output << boost::format("maxlength=\"%1%\" ",std::locale::classic()) % lm.second; | |||||
output << "maxlength=\"" << cint(lm.second) << "\" "; | |||||
} | } | ||||
} | } | ||||
@@ -728,11 +725,11 @@ void textarea::render_input(form_context &context) | |||||
render_attributes(context); | render_attributes(context); | ||||
if(rows_ >= 0) { | if(rows_ >= 0) { | ||||
output<<boost::format("rows=\"%1%\"",std::locale::classic()) % rows_; | |||||
output<<"rows=\""<< cint(rows_) << "\""; | |||||
} | } | ||||
if(cols_ >= 0) { | if(cols_ >= 0) { | ||||
output<<boost::format("cols=\"%1%\"",std::locale::classic()) % cols_; | |||||
output<<"cols=\"" <<cint(cols_) << "\""; | |||||
} | } | ||||
} | } | ||||
else { | else { | ||||
@@ -923,13 +920,13 @@ void select_multiple::add(locale::message const &opt,std::string const &id,bool | |||||
void select_multiple::add(std::string const &opt,bool selected) | void select_multiple::add(std::string const &opt,bool selected) | ||||
{ | { | ||||
std::string id=(boost::format("%1%",std::locale::classic()) % elements_.size()).str(); | |||||
std::string id=impl::todec_string(elements_.size()); | |||||
elements_.push_back(element(id,opt,selected)); | elements_.push_back(element(id,opt,selected)); | ||||
} | } | ||||
void select_multiple::add(locale::message const &opt,bool selected) | void select_multiple::add(locale::message const &opt,bool selected) | ||||
{ | { | ||||
std::string id=(boost::format("%1%",std::locale::classic()) % elements_.size()).str(); | |||||
std::string id=impl::todec_string(elements_.size()); | |||||
elements_.push_back(element(id,opt,selected)); | elements_.push_back(element(id,opt,selected)); | ||||
} | } | ||||
@@ -996,7 +993,7 @@ void select_multiple::render_input(form_context &context) | |||||
else | else | ||||
out<<"<select multiple "; | out<<"<select multiple "; | ||||
if(rows_ > 0) | if(rows_ > 0) | ||||
out << boost::format(" size=\"%1%\" ",std::locale::classic()) % rows_; | |||||
out << " size=\"" << cint(rows_) << "\" "; | |||||
render_attributes(context); | render_attributes(context); | ||||
} | } | ||||
else { | else { | ||||
@@ -1127,13 +1124,13 @@ void select_base::add(locale::message const &str,std::string const &id) | |||||
void select_base::add(std::string const &str) | void select_base::add(std::string const &str) | ||||
{ | { | ||||
std::string id=(boost::format("%1%",std::locale::classic()) % elements_.size()).str(); | |||||
std::string id= impl::todec_string(elements_.size()); | |||||
elements_.push_back(element(id,str)); | elements_.push_back(element(id,str)); | ||||
} | } | ||||
void select_base::add(locale::message const &str) | void select_base::add(locale::message const &str) | ||||
{ | { | ||||
std::string id=(boost::format("%1%",std::locale::classic()) % elements_.size()).str(); | |||||
std::string id= impl::todec_string(elements_.size()); | |||||
elements_.push_back(element(id,str)); | elements_.push_back(element(id,str)); | ||||
} | } | ||||
@@ -24,16 +24,15 @@ | |||||
#include <booster/enable_shared_from_this.h> | #include <booster/enable_shared_from_this.h> | ||||
#include <scgi_header.h> | #include <scgi_header.h> | ||||
#include "todec.h" | |||||
#ifdef CPPCMS_USE_EXTERNAL_BOOST | #ifdef CPPCMS_USE_EXTERNAL_BOOST | ||||
# include <boost/bind.hpp> | # include <boost/bind.hpp> | ||||
# include <boost/format.hpp> | |||||
# if defined(CPPCMS_WIN32) && _WIN32_WINNT <= 0x0501 && !defined(BOOST_ASIO_DISABLE_IOCP) | # if defined(CPPCMS_WIN32) && _WIN32_WINNT <= 0x0501 && !defined(BOOST_ASIO_DISABLE_IOCP) | ||||
# define NO_CANCELIO | # define NO_CANCELIO | ||||
# endif | # endif | ||||
#else // Internal Boost | #else // Internal Boost | ||||
# include <cppcms_boost/bind.hpp> | # include <cppcms_boost/bind.hpp> | ||||
# include <cppcms_boost/format.hpp> | |||||
namespace boost = cppcms_boost; | namespace boost = cppcms_boost; | ||||
# if defined(CPPCMS_WIN32) && _WIN32_WINNT <= 0x0501 && !defined(CPPCMS_BOOST_ASIO_DISABLE_IOCP) | # if defined(CPPCMS_WIN32) && _WIN32_WINNT <= 0x0501 && !defined(CPPCMS_BOOST_ASIO_DISABLE_IOCP) | ||||
# define NO_CANCELIO | # define NO_CANCELIO | ||||
@@ -152,7 +151,8 @@ namespace cppcms { | |||||
env_str.append(p->first.c_str(),p->first.size()+1); | env_str.append(p->first.c_str(),p->first.size()+1); | ||||
env_str.append(p->second.c_str(),p->second.size()+1); | env_str.append(p->second.c_str(),p->second.size()+1); | ||||
} | } | ||||
std::string header=(boost::format("%1%:",std::locale::classic()) % env_str.size()).str(); | |||||
std::string header=todec_string(env_str.size()); | |||||
header+=':'; | |||||
header.reserve(header.size()+env_str.size()+addon_size); | header.reserve(header.size()+env_str.size()+addon_size); | ||||
header+=env_str; | header+=env_str; | ||||
header+=','; | header+=','; | ||||