| 
					
				 | 
			
			
				@@ -295,46 +295,6 @@ FILE* Util::openFile(const std::string& filename, const std::string& mode) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return file; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-void Util::fileCopy(const std::string& dest, const std::string& src) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  File file(src); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  rangedFileCopy(dest, src, 0, file.size()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-void Util::rangedFileCopy(const std::string& dest, const std::string& src, off_t srcOffset, uint64_t length) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  size_t bufSize = 4096; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  unsigned char buf[bufSize]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  DefaultDiskWriter srcdw(src); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  DefaultDiskWriter destdw(dest); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  srcdw.openExistingFile(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  destdw.initAndOpenFile(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  lldiv_t res = lldiv(length, bufSize); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  unsigned int x = res.quot; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  unsigned int r = res.rem; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  off_t initialOffset = srcOffset; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  for(unsigned int i = 0; i < x; ++i) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    size_t readLength = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    while(readLength < bufSize) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      ssize_t ret = srcdw.readData(buf, bufSize-readLength, srcOffset); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      destdw.writeData(buf, ret, srcOffset-initialOffset); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      srcOffset += ret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      readLength += ret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if(r > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    size_t readLength = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    while(readLength < r) {  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      ssize_t ret = srcdw.readData(buf, r-readLength, srcOffset); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      destdw.writeData(buf, ret, srcOffset-initialOffset); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      srcOffset += ret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      readLength += ret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  }      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 bool Util::isPowerOf(int num, int base) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if(base <= 0) { return false; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if(base == 1) { return true; } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -372,14 +332,6 @@ std::string Util::secfmt(time_t sec) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return str; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-size_t Util::expandBuffer(char** pbuf, size_t curLength, size_t newLength) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  char* newbuf = new char[newLength]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  memcpy(newbuf, *pbuf, curLength); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  delete [] *pbuf; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  *pbuf = newbuf; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  return newLength; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 int getNum(const char* buf, int offset, size_t length) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   char* temp = new char[length+1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   memcpy(temp, buf+offset, length); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -389,44 +341,6 @@ int getNum(const char* buf, int offset, size_t length) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return x; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-void unfoldSubRange(const std::string& src, std::deque<int>& range) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if(src.empty()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  std::string::size_type p = src.find_first_of(",-"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if(p == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } else if(p == std::string::npos) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    range.push_back(atoi(src.c_str())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if(src.at(p) == ',') { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      int num = getNum(src.c_str(), 0, p); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      range.push_back(num); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      unfoldSubRange(src.substr(p+1), range); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } else if(src.at(p) == '-') { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      std::string::size_type rightNumBegin = p+1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      std::string::size_type nextDelim = src.find_first_of(",", rightNumBegin); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if(nextDelim == std::string::npos) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	nextDelim = src.size(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      int left = getNum(src.c_str(), 0, p); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      int right = getNum(src.c_str(), rightNumBegin, nextDelim-rightNumBegin); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      for(int i = left; i <= right; ++i) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	range.push_back(i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if(src.size() > nextDelim) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	unfoldSubRange(src.substr(nextDelim+1), range); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-void Util::unfoldRange(const std::string& src, std::deque<int>& range) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  unfoldSubRange(src, range); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  std::sort(range.begin(), range.end()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  range.erase(std::unique(range.begin(), range.end()), range.end()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 int32_t Util::parseInt(const std::string& s, int32_t base) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   std::string trimed = Util::trim(s); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -621,17 +535,6 @@ void Util::setGlobalSignalHandler(int sig, void (*handler)(int), int flags) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #endif // HAVE_SIGACTION 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-void Util::indexRange(size_t& startIndex, size_t& endIndex, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		      off_t offset, size_t srcLength, size_t destLength) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  int64_t _startIndex = offset/destLength; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  int64_t _endIndex = (offset+srcLength-1)/destLength; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  assert(_startIndex <= INT32_MAX); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  assert(_endIndex <= INT32_MAX); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  startIndex = _startIndex; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  endIndex = _endIndex; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 std::string Util::getHomeDir() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const char* p = getenv("HOME"); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -691,23 +594,6 @@ std::string Util::abbrevSize(int64_t size) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-time_t Util::httpGMT(const std::string& httpStdTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  struct tm tm; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  memset(&tm, 0, sizeof(tm)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  char* r = strptime(httpStdTime.c_str(), "%a, %Y-%m-%d %H:%M:%S GMT", &tm); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if(r != httpStdTime.c_str()+httpStdTime.size()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return -1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  time_t thetime = timegm(&tm); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if(thetime == -1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if(tm.tm_year >= 2038-1900) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      thetime = INT32_MAX; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  return thetime; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void Util::sleep(long seconds) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #ifdef HAVE_SLEEP 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   ::sleep(seconds); 
			 |