StringUtils.cc
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:5k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. #include "hadoop/StringUtils.hh"
  19. #include "hadoop/SerialUtils.hh"
  20. #include <errno.h>
  21. #include <stdint.h>
  22. #include <stdio.h>
  23. #include <strings.h>
  24. #include <sys/time.h>
  25. using std::string;
  26. using std::vector;
  27. namespace HadoopUtils {
  28.   string toString(int32_t x) {
  29.     char str[100];
  30.     sprintf(str, "%d", x);
  31.     return str;
  32.   }
  33.   int toInt(const string& val) {
  34.     int result;
  35.     char trash;
  36.     int num = sscanf(val.c_str(), "%d%c", &result, &trash);
  37.     HADOOP_ASSERT(num == 1,
  38.                   "Problem converting " + val + " to integer.");
  39.     return result;
  40.   }
  41.   float toFloat(const string& val) {
  42.     float result;
  43.     char trash;
  44.     int num = sscanf(val.c_str(), "%f%c", &result, &trash);
  45.     HADOOP_ASSERT(num == 1,
  46.                   "Problem converting " + val + " to float.");
  47.     return result;
  48.   }
  49.   bool toBool(const string& val) {
  50.     if (val == "true") {
  51.       return true;
  52.     } else if (val == "false") {
  53.       return false;
  54.     } else {
  55.       HADOOP_ASSERT(false,
  56.                     "Problem converting " + val + " to boolean.");
  57.     }
  58.   }
  59.   /**
  60.    * Get the current time in the number of milliseconds since 1970.
  61.    */
  62.   uint64_t getCurrentMillis() {
  63.     struct timeval tv;
  64.     struct timezone tz;
  65.     int sys = gettimeofday(&tv, &tz);
  66.     HADOOP_ASSERT(sys != -1, strerror(errno));
  67.     return tv.tv_sec * 1000 + tv.tv_usec / 1000;
  68.   }
  69.   vector<string> splitString(const std::string& str,
  70.      const char* separator) {
  71.     vector<string> result;
  72.     string::size_type prev_pos=0;
  73.     string::size_type pos=0;
  74.     while ((pos = str.find_first_of(separator, prev_pos)) != string::npos) {
  75.       if (prev_pos < pos) {
  76. result.push_back(str.substr(prev_pos, pos-prev_pos));
  77.       }
  78.       prev_pos = pos + 1;
  79.     }
  80.     if (prev_pos < str.size()) {
  81.       result.push_back(str.substr(prev_pos));
  82.     }
  83.     return result;
  84.   }
  85.   string quoteString(const string& str,
  86.                      const char* deliminators) {
  87.     
  88.     string result(str);
  89.     for(int i=result.length() -1; i >= 0; --i) {
  90.       char ch = result[i];
  91.       if (!isprint(ch) ||
  92.           ch == '\' || 
  93.           strchr(deliminators, ch)) {
  94.         switch (ch) {
  95.         case '\':
  96.           result.replace(i, 1, "\\");
  97.           break;
  98.         case 't':
  99.           result.replace(i, 1, "\t");
  100.           break;
  101.         case 'n':
  102.           result.replace(i, 1, "\n");
  103.           break;
  104.         case ' ':
  105.           result.replace(i, 1, "\s");
  106.           break;
  107.         default:
  108.           char buff[4];
  109.           sprintf(buff, "\%02x", static_cast<unsigned char>(result[i]));
  110.           result.replace(i, 1, buff);
  111.         }
  112.       }
  113.     }
  114.     return result;
  115.   }
  116.   string unquoteString(const string& str) {
  117.     string result(str);
  118.     string::size_type current = result.find('\');
  119.     while (current != string::npos) {
  120.       if (current + 1 < result.size()) {
  121.         char new_ch;
  122.         int num_chars;
  123.         if (isxdigit(result[current+1])) {
  124.           num_chars = 2;
  125.           HADOOP_ASSERT(current + num_chars < result.size(),
  126.                      "escape pattern \<hex><hex> is missing second digit in '"
  127.                      + str + "'");
  128.           char sub_str[3];
  129.           sub_str[0] = result[current+1];
  130.           sub_str[1] = result[current+2];
  131.           sub_str[2] = '';
  132.           char* end_ptr = NULL;
  133.           long int int_val = strtol(sub_str, &end_ptr, 16);
  134.           HADOOP_ASSERT(*end_ptr == '' && int_val >= 0,
  135.                      "escape pattern \<hex><hex> is broken in '" + str + "'");
  136.           new_ch = static_cast<char>(int_val);
  137.         } else {
  138.           num_chars = 1;
  139.           switch(result[current+1]) {
  140.           case '\':
  141.             new_ch = '\';
  142.             break;
  143.           case 't':
  144.             new_ch = 't';
  145.             break;
  146.           case 'n':
  147.             new_ch = 'n';
  148.             break;
  149.           case 's':
  150.             new_ch = ' ';
  151.             break;
  152.           default:
  153.             string msg("unknow n escape character '");
  154.             msg += result[current+1];
  155.             HADOOP_ASSERT(false, msg + "' found in '" + str + "'");
  156.           }
  157.         }
  158.         result.replace(current, 1 + num_chars, 1, new_ch);
  159.         current = result.find('\', current+1);
  160.       } else {
  161.         HADOOP_ASSERT(false, "trailing \ in '" + str + "'");
  162.       }
  163.     }
  164.     return result;
  165.   }
  166. }