亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? util.h

?? dc++(一個曾經大量使用的p2p)的源代碼,dc++,開源的p2p源代碼
?? H
字號:
/* 
 * Copyright (C) 2001-2003 Jacek Sieka, j_s@telia.com
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

#if !defined(AFX_UTIL_H__1758F242_8D16_4C50_B40D_E59B3DD63913__INCLUDED_)
#define AFX_UTIL_H__1758F242_8D16_4C50_B40D_E59B3DD63913__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

/** Evaluates op(pair<T1, T2>.first, compareTo) */
template<class T1, class T2, class op = equal_to<T1> >
class CompareFirst {
public:
	CompareFirst(const T1& compareTo) : a(compareTo) { };
	bool operator()(const pair<T1, T2>& p) { return op()(p.first, a); };
private:
	const T1& a;
};

/** Evaluates op(pair<T1, T2>.second, compareTo) */
template<class T1, class T2, class op = equal_to<T2> >
class CompareSecond {
public:
	CompareSecond(const T2& compareTo) : a(compareTo) { };
	bool operator()(const pair<T1, T2>& p) { return op()(p.second, a); };
private:
	const T2& a;
};

template<class T>
struct PointerHash {
	size_t operator()(const T* a) const { return ((size_t)a)/sizeof(T); };
};
template<>
struct PointerHash<void> {
	size_t operator()(const void* a) const { return ((size_t)a)>>2; };
};

/** 
 * Compares two values
 * @return -1 if v1 < v2, 0 if v1 == v2 and 1 if v1 > v2
 */
template<typename T1>
int compare(const T1& v1, const T1& v2) { return (v1 < v2) ? -1 : ((v1 == v2) ? 0 : 1); };

class Flags {
	public:
		Flags() : flags(0) { };
		Flags(const Flags& rhs) : flags(rhs.flags) { };
		bool isSet(int aFlag) const { return (flags & aFlag) == aFlag; };
		void setFlag(int aFlag) { flags |= aFlag; };
		void unsetFlag(int aFlag) { flags &= ~aFlag; };

	private:
		int flags;
};

template<typename T>
class AutoArray {
	typedef T* TPtr;
	typedef T& TRef;
public:
	AutoArray(size_t size) : p(new T[size]) { };
	~AutoArray() { delete[] p; };
	operator TPtr() { return p; };

private:
	AutoArray(const AutoArray&) { };
	void operator=(const AutoArray&) { };

	TPtr p;
};

class Util  
{
public:
	static u_int32_t crcTable[];

	static string emptyString;

	static void initialize();

	static void ensureDirectory(const string& aFile)
	{
#ifdef WIN32
		string::size_type start = 0;
		
		while( (start = aFile.find_first_of("\\/", start)) != string::npos) {
			CreateDirectory(aFile.substr(0, start+1).c_str(), NULL);
			start++;
		}
#endif
	}
	
	static string getAppPath() {
#ifdef WIN32
		TCHAR buf[MAX_PATH+1];
		GetModuleFileName(NULL, buf, MAX_PATH);
		int i = (strrchr(buf, '\\') - buf);
		return string(buf, i + 1);
#else // WIN32
		return emptyString;
#endif // WIN32
	}	

	static string getAppName() {
#ifdef WIN32
		TCHAR buf[MAX_PATH+1];
		GetModuleFileName(NULL, buf, MAX_PATH);
		return string(buf);
#else // WIN32
		return emptyString;
#endif // WIN32
	}	

	static string translateError(int aError) {
#ifdef WIN32
		LPVOID lpMsgBuf;
		FormatMessage( 
			FORMAT_MESSAGE_ALLOCATE_BUFFER | 
			FORMAT_MESSAGE_FROM_SYSTEM | 
			FORMAT_MESSAGE_IGNORE_INSERTS,
			NULL,
			aError,
			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
			(LPTSTR) &lpMsgBuf,
			0,
			NULL 
			);
		string tmp = (LPCTSTR)lpMsgBuf;
		// Free the buffer.
		LocalFree( lpMsgBuf );
		string::size_type i;

		while( (i = tmp.find_last_of("\r\n")) != string::npos) {
			tmp.erase(i, 1);
		}
		return tmp;
#else // WIN32
		return emptyString;
#endif // WIN32
	}

	static string getFilePath(const string& path) {
		string::size_type i = path.rfind('\\');
		return (i != string::npos) ? path.substr(0, i + 1) : path;
	}
	static string getFileName(const string& path) {
		string::size_type i = path.rfind('\\');
		return (i != string::npos) ? path.substr(i + 1) : path;
	}
	static string getExtension(const string& path) {
		string::size_type i = path.rfind('.');
		return (i != string::npos) ? path.substr(i) : Util::emptyString;
	}
	static string getLastDir(const string& path) {
		string::size_type i = path.rfind('\\');
		if(i == string::npos)
			return Util::emptyString;
		string::size_type j = path.rfind('\\', i-1);
		return (j != string::npos) ? path.substr(j+1, j-i-1) : path;
	}
	
	static void decodeUrl(const string& aUrl, string& aServer, short& aPort, string& aFile);
	static string filterFileName(const string& aFile);
	
	static string formatBytes(const string& aString) {
		return formatBytes(toInt64(aString));
	}

	static string getShortTimeString() {
		char buf[8];
		time_t _tt = time(NULL);
		tm* _tm = localtime(&_tt);
		if(_tm == NULL) {
			strcpy(buf, "xx:xx");
		} else {
			strftime(buf, 8, "%H:%M", _tm);
		}
		return buf;
	}

	static string getTimeString() {
		char buf[64];
		time_t _tt;
		time(&_tt);
		tm* _tm = localtime(&_tt);
		strftime(buf, 64, "%X", _tm);
		return buf;
	}
	
	static string formatBytes(int64_t aBytes) {
		char buf[64];
		if(aBytes < 1024) {
			sprintf(buf, "%d %s", (int)(aBytes&0xffffffff), CSTRING(B));
		} else if(aBytes < 1024*1024) {
			sprintf(buf, "%.02f %s", (double)aBytes/(1024.0), CSTRING(KB));
		} else if(aBytes < 1024*1024*1024) {
			sprintf(buf, "%.02f %s", (double)aBytes/(1024.0*1024.0), CSTRING(MB));
		} else if(aBytes < (int64_t)1024*1024*1024*1024) {
			sprintf(buf, "%.02f %s", (double)aBytes/(1024.0*1024.0*1024.0), CSTRING(GB));
		} else {
			sprintf(buf, "%.02f %s", (double)aBytes/(1024.0*1024.0*1024.0*1024.0), CSTRING(TB));
		}
		
		return buf;
	}

	static string formatSeconds(int64_t aSec) {
		char buf[64];
#ifdef WIN32
		sprintf(buf, "%01I64d:%02d:%02d", aSec / (60*60), (int)((aSec / 60) % 60), (int)(aSec % 60));
#else
		sprintf(buf, "%01lld:%02d:%02d", aSec / (60*60), (int)((aSec / 60) % 60), (int)(aSec % 60));
#endif		
		return buf;
	}

	static string formatParams(const string& msg, StringMap& params);
	static string formatTime(const string &msg, const time_t tm);

	static string toLower(const string& aString) { return toLower(aString.c_str(), aString.length()); };
	static string toLower(const char* aString, int len = -1) {
		string tmp;
		tmp.resize((len == -1) ? strlen(aString) : len);
		for(string::size_type i = 0; aString[i]; i++) {
			tmp[i] = toLower(aString[i]);
		}
		return tmp;
	}
	static char toLower(char c) { return lower[(u_int8_t)c]; };
	static u_int8_t toLower(u_int8_t c) { return lower[c]; };
	static void toLower2(string& aString) {
		for(string::size_type i = 0; i < aString.length(); ++i) {
			aString[i] = toLower(aString[i]);
		}
	}
	static int64_t toInt64(const string& aString) {
#ifdef WIN32
		return _atoi64(aString.c_str());
#else
		return atoll(aString.c_str());
#endif
	}

	static int toInt(const string& aString) {
		return atoi(aString.c_str());
	}

	static double toDouble(const string& aString) {
		return atof(aString.c_str());
	}

	static float toFloat(const string& aString) {
		return (float)atof(aString.c_str());
	}

	static string toString(const int64_t& val) {
		char buf[32];
#ifdef WIN32
		return _i64toa(val, buf, 10);
#else
		sprintf(buf, "%lld", val);
		return buf;
#endif
	}

	static string toString(const u_int32_t& val) {
		char buf[16];
		sprintf(buf, "%u", val);
		return buf;
	}
	static string toString(const int& val) {
		char buf[16];
		sprintf(buf, "%d", val);
		return buf;
	}
	static string toString(const long& val) {
		char buf[16];
		sprintf(buf, "%ld", val);
		return buf;
	}
	static string toString(const double& val) {
		char buf[16];
		sprintf(buf, "%.2f", val);
		return buf;
	}

	static string getLocalIp();
	/**
	 * Case insensitive substring search.
	 * @return First position found or string::npos
	 */
	static string::size_type findSubString(const string& aString, const string& aSubString, string::size_type start = 0) {
		if(aString.length() < start)
			return (string::size_type)string::npos;

		if(aString.length() < aSubString.length())
			return (string::size_type)string::npos;

		if(aSubString.empty())
			return 0;

		u_int8_t* tx = (u_int8_t*)aString.c_str();
		u_int8_t* px = (u_int8_t*)aSubString.c_str();

		u_int8_t p = Util::toLower(px[0]);

		u_int8_t* end = tx + aString.length() - aSubString.length() + 1;

		tx += start;

		while(tx < end) {
			if(p == Util::toLower(tx[0])) {
				int i = 1;

				for(; px[i] && Util::toLower(px[i]) == Util::toLower(tx[i]); ++i)
					;	// Empty

				if(px[i] == 0)
					return tx - (u_int8_t*)aString.c_str();
			}

			tx++;
		}
		return (string::size_type)string::npos;
	}

	/* Table-driven versions of strnicmp and stricmp */
	static int stricmp(const char* a, const char* b) {
		// return ::stricmp(a, b);
		while(*a && (cmpi[(u_int8_t)*a][(u_int8_t)*b] == 0)) {
			a++; b++;
		}
		return cmpi[(u_int8_t)*a][(u_int8_t)*b];
	}
	static int strnicmp(const char* a, const char* b, int n) {
		// return ::strnicmp(a, b, n);
		while(n && *a && (cmpi[(u_int8_t)*a][(u_int8_t)*b] == 0)) {
			n--; a++; b++;
		}
		return (n == 0) ? 0 : cmpi[(u_int8_t)*a][(u_int8_t)*b];
	}
	static int stricmp(const string& a, const string& b) { return stricmp(a.c_str(), b.c_str()); };
	static int strnicmp(const string& a, const string& b, int n) { return strnicmp(a.c_str(), b.c_str(), n); };
	
	static string validateNick(string tmp) {	
		string::size_type i;
		while( (i = tmp.find_first_of("|$ ")) != string::npos) {
			tmp[i]='_';
		}
		return tmp;
	}

	static string validateMessage(string tmp, bool reverse);

	static string getOsVersion();

	static bool getAway() { return away; };
	static void setAway(bool aAway) {
		away = aAway;
		if (away)
			awayTime = time(NULL);
	};
	static string getAwayMessage();

	static void setAwayMessage(const string& aMsg) { awayMsg = aMsg; };

	static u_int32_t rand();
	static u_int32_t rand(u_int32_t high) { return rand() % high; };
	static u_int32_t rand(u_int32_t low, u_int32_t high) { return rand(high-low) + low; };
	static double randd() { return ((double)rand()) / ((double)0xffffffff); };

private:
	static bool away;
	static string awayMsg;
	static time_t awayTime;
	static char upper[];
	static char lower[];
	static int8_t cmp[256][256];
	static int8_t cmpi[256][256];
};

/** Case insensitive hash function for strings */
struct noCaseStringHash {
	size_t operator()(const string& s) const {
		size_t x = 0;
		const char* y = s.data();
		string::size_type j = s.size();
		for(string::size_type i = 0; i < j; ++i) {
			x = x*31 + (size_t)Util::toLower(y[i]);
		}
		return x;
	}
};

/** Case insensitive string comparison */
struct noCaseStringEq {
	bool operator()(const string& a, const string& b) const {
		return Util::stricmp(a.c_str(), b.c_str()) == 0;
	}
};

/** Case insensitive string ordering */
struct noCaseStringLess {
	bool operator()(const string& a, const string& b) const {
		return Util::stricmp(a.c_str(), b.c_str()) == -1;
	}
};


#endif // !defined(AFX_UTIL_H__1758F242_8D16_4C50_B40D_E59B3DD63913__INCLUDED_)

/**
 * @file
 * $Id: Util.h,v 1.58 2003/06/20 10:49:27 arnetheduck Exp $
 */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜精品福利在线| 亚洲男同性视频| 国产在线精品一区二区夜色| 日韩小视频在线观看专区| 秋霞av亚洲一区二区三| 日韩欧美在线影院| 国产精品18久久久久久久久| 亚洲国产精品国自产拍av| 成人午夜激情视频| 亚洲激情av在线| 3751色影院一区二区三区| 精品一区二区在线观看| 欧美国产精品中文字幕| 色噜噜狠狠成人中文综合| 婷婷国产v国产偷v亚洲高清| 日韩欧美国产午夜精品| 大陆成人av片| 亚洲综合久久av| 亚洲精品一区二区三区99| 成人午夜私人影院| 亚洲一二三四区不卡| 精品av综合导航| 91伊人久久大香线蕉| 亚洲成a人v欧美综合天堂下载| 精品国产乱码久久久久久牛牛| 成人午夜激情在线| 日本伊人精品一区二区三区观看方式| 精品对白一区国产伦| 91免费在线视频观看| 日本人妖一区二区| 国产精品网站在线观看| 欧美妇女性影城| 波多野结衣一区二区三区| 日一区二区三区| 中文字幕久久午夜不卡| 在线91免费看| 99久久婷婷国产综合精品 | 色婷婷国产精品| 美女在线视频一区| 亚洲精品欧美激情| 国产亲近乱来精品视频| 9191成人精品久久| 一本高清dvd不卡在线观看| 精品午夜久久福利影院| 亚洲国产毛片aaaaa无费看| 国产婷婷色一区二区三区四区| 在线观看一区不卡| 处破女av一区二区| 精彩视频一区二区| 日韩黄色片在线观看| 亚洲视频免费在线观看| 国产欧美一区在线| 精品入口麻豆88视频| 欧美高清激情brazzers| 日本丶国产丶欧美色综合| 丁香婷婷综合色啪| 国产一区二区免费看| 久久狠狠亚洲综合| 日韩精品三区四区| 亚洲国产成人高清精品| 亚洲综合一二三区| 亚洲激情五月婷婷| 亚洲女人小视频在线观看| 国产精品护士白丝一区av| 久久久久久久电影| 久久色.com| 26uuu久久天堂性欧美| 日韩精品一区二区三区老鸭窝| 91精品欧美久久久久久动漫| 欧美最新大片在线看| 一本色道久久综合亚洲aⅴ蜜桃| 成人app在线观看| 欧美日韩国产片| 日本道在线观看一区二区| 91论坛在线播放| 色丁香久综合在线久综合在线观看| 波多野结衣精品在线| 波多野结衣一区二区三区| 波多野结衣91| 91免费精品国自产拍在线不卡| 成人ar影院免费观看视频| 成人av午夜电影| av不卡免费电影| 色又黄又爽网站www久久| 91色乱码一区二区三区| 91国产免费观看| 欧美狂野另类xxxxoooo| 一区二区三区欧美| 一级中文字幕一区二区| 一区二区三区不卡在线观看 | 精品国产露脸精彩对白| 精品久久久久香蕉网| 久久精品免视看| 国产精品色婷婷| 亚洲精品大片www| 日本美女视频一区二区| 国产一区在线看| av一区二区久久| 欧美日韩精品专区| 日韩欧美二区三区| 欧美国产精品专区| 伊人色综合久久天天| 日本午夜一本久久久综合| 激情欧美一区二区| av成人免费在线观看| 欧美三级在线播放| 欧美精品一区视频| 亚洲色图视频网站| 奇米精品一区二区三区四区| 国产麻豆一精品一av一免费| 99r精品视频| 欧美一区二区成人| 91浏览器在线视频| 欧美一区二区三区免费大片 | 成人av免费在线播放| 欧美猛男超大videosgay| 精品成人免费观看| 一区二区三区四区五区视频在线观看 | 丝袜美腿亚洲综合| 国产电影精品久久禁18| 欧美日韩一区二区在线观看视频| 日韩三级视频在线观看| 亚洲日本成人在线观看| 久久99精品国产91久久来源| 91丨porny丨最新| 精品99一区二区| 亚洲欧美日韩中文字幕一区二区三区| 日本欧美在线看| 色婷婷一区二区三区四区| 精品国产sm最大网站免费看| 亚洲黄色av一区| 国产成人av一区二区三区在线| 欧美日韩精品专区| 亚洲日本护士毛茸茸| 国产精品888| 日韩一区二区精品葵司在线| 亚洲精品成人天堂一二三| 风间由美一区二区av101| 欧美一区二区在线免费观看| 一区二区三区资源| 成人免费va视频| 精品卡一卡二卡三卡四在线| 亚洲一区二区在线视频| 成人免费的视频| 久久久电影一区二区三区| 免费在线观看视频一区| 精品视频一区二区三区免费| 最好看的中文字幕久久| 成人久久久精品乱码一区二区三区 | 日日夜夜精品免费视频| 色综合天天综合色综合av | 在线播放91灌醉迷j高跟美女| 椎名由奈av一区二区三区| 国产成人综合网站| 久久蜜桃av一区精品变态类天堂| 日本视频免费一区| 欧美喷潮久久久xxxxx| 夜夜嗨av一区二区三区四季av| 高清国产一区二区三区| 国产亚洲一区字幕| 国产在线精品国自产拍免费| 日韩片之四级片| 久久精品国产亚洲一区二区三区 | 奇米一区二区三区av| 欧美日韩国产色站一区二区三区| 亚洲一区二区三区精品在线| 色综合一个色综合亚洲| 亚洲欧美电影一区二区| 色视频成人在线观看免| 一区二区三区日韩欧美| 91高清视频在线| 亚洲综合无码一区二区| 日本道免费精品一区二区三区| 亚洲乱码国产乱码精品精98午夜| 91片在线免费观看| 亚洲欧美日韩在线| 欧美午夜理伦三级在线观看| 亚洲一区二区高清| 欧美理论在线播放| 蜜臀av性久久久久蜜臀av麻豆| 日韩三级在线观看| 国产盗摄女厕一区二区三区| 欧美极品另类videosde| 成人激情小说乱人伦| 亚洲欧美电影一区二区| 欧美精品v国产精品v日韩精品| 免费美女久久99| 欧美国产日韩a欧美在线观看| 99视频有精品| 亚洲成av人片www| 精品精品国产高清a毛片牛牛| 国产盗摄精品一区二区三区在线| 亚洲欧洲日产国码二区| 欧美日韩一区高清| 国产一区二三区| 亚洲情趣在线观看| 日韩午夜精品视频| 岛国av在线一区| 婷婷久久综合九色综合伊人色| 精品国产乱码久久久久久1区2区|