00001
00002
00003
00004
00005 #ifndef _UTILS_H_
00006 #define _UTILS_H_
00007
00008 #include <config.h>
00009
00010 #include <cstdlib>
00011 #include <ctime>
00012 #include <string>
00013 #include <sstream>
00014
00015 #include "lua/lua.hpp"
00016
00017 namespace Limiro
00018 {
00019 namespace utils
00020 {
00021
00022 int randint(int min, int max);
00023
00024 void luaL_openlibs_safe(lua_State *L);
00025
00026 inline int toInt(const char *ptr)
00027 {
00028 int n = std::strtol(ptr, NULL, 10);
00029 return n;
00030 }
00031
00032 inline int toInt(const std::string& str)
00033 {
00034 return toInt(str.c_str());
00035 }
00036
00037 template<class T>
00038 inline std::string toString(const T& value)
00039 {
00040 static std::ostringstream os;
00041 os.str("");
00042 os << value;
00043 return os.str();
00044 }
00045
00046 inline std::string strFromTime(const char *format, const std::tm *tm)
00047 {
00048 char buf[1024];
00049 int len = std::strftime(buf, sizeof(buf), format, tm);
00050
00051 return std::string(buf, len);
00052 }
00053
00054 inline std::string strFromTime(const char *format, const time_t t)
00055 {
00056 return strFromTime(format, std::localtime(&t));
00057 }
00058
00059 inline std::string strFromNow(const char *format)
00060 {
00061 return strFromTime(format, std::time(NULL));
00062 }
00063
00064 inline std::string stripWhitespace(const std::string& str)
00065 {
00066 static const char *ws = " \t\n";
00067
00068 std::string::size_type start = str.find_first_not_of(ws);
00069 if(start == std::string::npos)
00070 {
00071
00072 return std::string();
00073 }
00074 else
00075 {
00076 std::string::size_type end = str.find_first_of(ws, start);
00077 if(end == std::string::npos)
00078 {
00079 return str.substr(start);
00080 }
00081 else
00082 {
00083 return str.substr(start, end-start);
00084 }
00085 }
00086 }
00087
00088 inline std::string userDate(const std::string& str)
00089 {
00090 std::string::size_type p1, p2;
00091 int y, m, d;
00092
00093 p1 = str.find_first_of("-");
00094 p2 = str.find_first_of("-", p1+1);
00095
00096 y = toInt(str.substr(0, p1));
00097 m = toInt(str.substr(p1+1, p2-p1-1));
00098 d = toInt(str.substr(p2+1));
00099
00100 return (toString(d) + ". " + toString(m) + ". " + toString(y));
00101 }
00102
00103 inline std::string answerDate(int year, int month, int day)
00104 {
00105 return (toString(year) + "-" + toString(month) + "-" + toString(day));
00106 }
00107
00108
00109 inline int strtol_safe(const char *ptr, int _default=0, bool full=false)
00110 {
00111 char *endptr;
00112 int n = std::strtol(ptr, &endptr, 10);
00113 if((endptr == ptr) || (full && (*endptr != '\0')))
00114 {
00115 return _default;
00116 }
00117 return n;
00118 }
00119
00120 inline bool endswith(const std::string& str, const std::string& end)
00121 {
00122 if(end.length() > str.length()) return false;
00123 return (str.substr(str.length()-end.length()) == end);
00124 }
00125
00126 inline bool startswith(const std::string& str, const std::string& start)
00127 {
00128 if(start.length() > str.length()) return false;
00129 return (str.substr(0, start.length()) == start);
00130 }
00131
00132 template <class T>
00133 inline T clamp(T min, T value, T max)
00134 {
00135 if(value > max) return max;
00136 if(value < min) return min;
00137 return value;
00138 }
00139
00140 }
00141 }
00142
00143 #endif // _UTILS_H_