/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "hadoop/StringUtils.hh" #include "hadoop/SerialUtils.hh" #include #include #include #include #include using std::string; using std::vector; namespace HadoopUtils { string toString(int32_t x) { char str[100]; sprintf(str, "%d", x); return str; } int toInt(const string& val) { int result; char trash; int num = sscanf(val.c_str(), "%d%c", &result, &trash); HADOOP_ASSERT(num == 1, "Problem converting " + val + " to integer."); return result; } float toFloat(const string& val) { float result; char trash; int num = sscanf(val.c_str(), "%f%c", &result, &trash); HADOOP_ASSERT(num == 1, "Problem converting " + val + " to float."); return result; } bool toBool(const string& val) { if (val == "true") { return true; } else if (val == "false") { return false; } else { HADOOP_ASSERT(false, "Problem converting " + val + " to boolean."); } } /** * Get the current time in the number of milliseconds since 1970. */ uint64_t getCurrentMillis() { struct timeval tv; struct timezone tz; int sys = gettimeofday(&tv, &tz); HADOOP_ASSERT(sys != -1, strerror(errno)); return tv.tv_sec * 1000 + tv.tv_usec / 1000; } vector splitString(const std::string& str, const char* separator) { vector result; string::size_type prev_pos=0; string::size_type pos=0; while ((pos = str.find_first_of(separator, prev_pos)) != string::npos) { if (prev_pos < pos) { result.push_back(str.substr(prev_pos, pos-prev_pos)); } prev_pos = pos + 1; } if (prev_pos < str.size()) { result.push_back(str.substr(prev_pos)); } return result; } string quoteString(const string& str, const char* deliminators) { string result(str); for(int i=result.length() -1; i >= 0; --i) { char ch = result[i]; if (!isprint(ch) || ch == '\\' || strchr(deliminators, ch)) { switch (ch) { case '\\': result.replace(i, 1, "\\\\"); break; case '\t': result.replace(i, 1, "\\t"); break; case '\n': result.replace(i, 1, "\\n"); break; case ' ': result.replace(i, 1, "\\s"); break; default: char buff[4]; sprintf(buff, "\\%02x", static_cast(result[i])); result.replace(i, 1, buff); } } } return result; } string unquoteString(const string& str) { string result(str); string::size_type current = result.find('\\'); while (current != string::npos) { if (current + 1 < result.size()) { char new_ch; int num_chars; if (isxdigit(result[current+1])) { num_chars = 2; HADOOP_ASSERT(current + num_chars < result.size(), "escape pattern \\ is missing second digit in '" + str + "'"); char sub_str[3]; sub_str[0] = result[current+1]; sub_str[1] = result[current+2]; sub_str[2] = '\0'; char* end_ptr = NULL; long int int_val = strtol(sub_str, &end_ptr, 16); HADOOP_ASSERT(*end_ptr == '\0' && int_val >= 0, "escape pattern \\ is broken in '" + str + "'"); new_ch = static_cast(int_val); } else { num_chars = 1; switch(result[current+1]) { case '\\': new_ch = '\\'; break; case 't': new_ch = '\t'; break; case 'n': new_ch = '\n'; break; case 's': new_ch = ' '; break; default: string msg("unknow n escape character '"); msg += result[current+1]; HADOOP_ASSERT(false, msg + "' found in '" + str + "'"); } } result.replace(current, 1 + num_chars, 1, new_ch); current = result.find('\\', current+1); } else { HADOOP_ASSERT(false, "trailing \\ in '" + str + "'"); } } return result; } }