00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include <iomanip>
00016 #include <string.h>
00017
00018 #include <stdlib.h>
00019
00020 #include <ctype.h>
00021 #include <unistd.h>
00022
00023 #ifdef WIN32
00024 static char *home_dir = ".";
00025 #else
00026 # include <pwd.h>
00027 #endif
00028
00029 #include "assa/Logger.h"
00030 #include "assa/CommonUtils.h"
00031
00032 void
00033 ASSA::Utils::
00034 split (const char* src_, std::vector<std::string>& vec_)
00035 {
00036 std::istringstream input (src_);
00037 vec_.erase (vec_.begin (), vec_.end ());
00038
00039 std::string token;
00040 while (input >> token) {
00041 vec_.push_back (token);
00042 }
00043 }
00044
00045 int
00046 ASSA::Utils::
00047 split_pair (const string& text_, char sep_, string& lhs_, string& rhs_)
00048 {
00049 int pos = 0;
00050 if ((pos = text_.find (sep_)) == string::npos) {
00051 return -1;
00052 }
00053 lhs_ = text_.substr (0, pos);
00054 rhs_ = text_.substr (pos+1, text_.size ());
00055 pos = rhs_.size () -1;
00056 if (rhs_[0] == '"' || rhs_[0] == '\'') {
00057 rhs_[0] = ' ';
00058 }
00059 if (rhs_[pos] == '"' || rhs_[pos] == '\'') {
00060 rhs_[pos] = ' ';
00061 }
00062 return 0;
00063 }
00064
00065 int
00066 ASSA::Utils::
00067 ltrim (std::string& text_, const std::string& delim_)
00068 {
00069 std::string::size_type idx;
00070 idx = text_.find_first_of (delim_);
00071 if (idx != std::string::npos) {
00072 text_.replace (0, idx+1, "");
00073 return 0;
00074 }
00075 return -1;
00076 }
00077
00078 int
00079 ASSA::Utils::
00080 rtrim (std::string& text_, const std::string& delim_)
00081 {
00082 std::string::size_type idx;
00083 idx = text_.find_last_of (delim_);
00084 if (idx != std::string::npos) {
00085 text_.replace (idx, text_.size (), "");
00086 return 0;
00087 }
00088 return -1;
00089 }
00090
00091 void
00092 ASSA::Utils::
00093 trim_sides (std::string& text_)
00094 {
00095 std::string::size_type idx;
00096
00097 idx = text_.find_first_not_of (" \t");
00098 if (idx != std::string::npos) {
00099 text_.replace (0, idx, "");
00100 }
00101
00102 idx = text_.find_last_not_of (" \t");
00103 if (idx != std::string::npos) {
00104 text_.replace (idx + 1, text_.size (), "");
00105 }
00106 }
00107
00108 void
00109 ASSA::Utils::
00110 find_and_replace_char (std::string& text_, char src_, char dest_)
00111 {
00112 string::iterator pos = text_.begin ();
00113 while (pos != text_.end ()) {
00114 if ((*pos) == src_) {
00115 (*pos) = dest_;
00116 }
00117 pos++;
00118 }
00119 }
00120
00121 std::string
00122 ASSA::Utils::
00123 strenv (const char* in)
00124 {
00125 char b [1024];
00126 char* ret = b;
00127 char* r = ret;
00128
00129 if (*in == '~') {
00130 if ( *(in+1) == 0 || *(in+1) == '/' ) {
00131 in++;
00132 strcpy (ret, getenv ("HOME") ? getenv ("HOME") : "");
00133 r += strlen (ret);
00134 }
00135 else {
00136 in++;
00137 char lname [256];
00138 char* lp = lname;
00139 const char* sp = strchr (in, '/');
00140 if ( sp ) {
00141 while (in != sp) *lp++ = *in++;
00142 *lp = 0;
00143 }
00144 else {
00145 while (*in) *lp++ = *in++;
00146 *lp = 0;
00147 }
00148 #ifdef WIN32
00149 strcpy (ret, home_dir);
00150 r += strlen (ret);
00151 #else
00152
00153 struct passwd* p = getpwnam (lname);
00154 if ( p ) {
00155 strcpy (ret, p->pw_dir ? p->pw_dir : "");
00156 r += strlen (ret);
00157 }
00158 #endif
00159 }
00160 }
00161
00162 while (*in) {
00163 if (*in == '$') {
00164 char varname [80];
00165 if (*++in == '(') {
00166 ++in;
00167 const char *end = strchr (in,')');
00168 if (!end)
00169 break;
00170 strncpy (varname, in, end-in);
00171 varname [end-in] = '\0';
00172 in = end+1;
00173 }
00174 else if (*in == '{') {
00175 const char *end = strchr (in,'}');
00176 if (!end)
00177 break;
00178 strncpy (varname, in, end-in);
00179 varname [end-in] = '\0';
00180 in = end+1;
00181 }
00182 else {
00183 char* vp = varname;
00184 while (isalnum (*in) || *in == '_' ) {
00185 *vp++ = *in++;
00186 }
00187 *vp = '\0';
00188 }
00189 char* ep = ::getenv (varname);
00190 while (ep && *ep) *r++ = *ep++;
00191 continue;
00192 }
00193 else if (*in == '\\' && *(in+1)) {
00194 in++;
00195 }
00196 *r++ = *in++;
00197 }
00198 *r = '\0';
00199 return ret;
00200 }
00201
00202 std::string
00203 ASSA::Utils::
00204 get_cwd_name (void)
00205 {
00206 std::string ret;
00207 int size = 256;
00208 char* chr_ptr = 0;
00209
00210 while (true) {
00211 chr_ptr = new char [size];
00212 if (::getcwd (chr_ptr, size-1) != NULL) {
00213 ret = chr_ptr;
00214 delete [] chr_ptr;
00215 return ret;
00216 }
00217 if (errno != ERANGE) {
00218 return ret;
00219
00220 }
00221 delete [] chr_ptr;
00222 size += 256;
00223 }
00224 }