libc_interface.c

来自「Linux下的多协议即时通讯程序源代码」· C语言 代码 · 共 1,100 行 · 第 1/2 页

C
1,100
字号
		"EST", "EST"	},	{		"Azores Standard Time", "Azores Daylight Time",		"AZOT", "AZOST"	},	{		"Canada Central Standard Time", "Canada Central Daylight Time",		"CST", "MDT"	},	{		"Cape Verde Standard Time", "Cape Verde Daylight Time",		"CVT", "CVST"	},	{		"Caucasus Standard Time", "Caucasus Daylight Time",		"AZT", "AZST"	},	{		"Cen. Australia Standard Time", "Cen. Australia Daylight Time",		"CST", "CST"	},	{		"Central America Standard Time", "Central America Daylight Time",		"CST", "CDT"	},	{		"Central Asia Standard Time", "Central Asia Daylight Time",		"BDT", "BDT"	},	{		"Central Europe Standard Time", "Central Europe Daylight Time",		"CET", "CEST"	},	{		"Central European Standard Time", "Central European Daylight Time",		"CET", "CEST"	},	{		"Central Pacific Standard Time", "Central Pacific Daylight Time",		"NCT", "NCST"	},	{		"Central Standard Time", "Central Daylight Time",		"CST", "CDT"	},	{		"China Standard Time", "China Daylight Time",		"HKT", "HKST"	},	{		"Dateline Standard Time", "Dateline Daylight Time",		"GMT+12", "GMT+12"	},	{		"E. Africa Standard Time", "E. Africa Daylight Time",		"EAT", "EAT"	},	{		"E. Australia Standard Time", "E. Australia Daylight Time",		"EST", "EST"	},	{		"E. Europe Standard Time", "E. Europe Daylight Time",		"EET", "EEST"	},	{		"E. South America Standard Time", "E. South America Daylight Time",		"BRT", "BRST"	},	{		"Eastern Standard Time", "Eastern Daylight Time",		"EST", "EDT"	},	{		"Egypt Standard Time", "Egypt Daylight Time",		"EET", "EEST"	},	{		"Ekaterinburg Standard Time", "Ekaterinburg Daylight Time",		"YEKT", "YEKST"	},	{		"Fiji Standard Time", "Fiji Daylight Time",		"FJT", "FJST"	},	{		"FLE Standard Time", "FLE Daylight Time",		"EET", "EEST"	},	{		"GMT Standard Time", "GMT Daylight Time",		"GMT", "IST"	},	{		"Greenland Standard Time", "Greenland Daylight Time",		"WGT", "WGST"	},	{		"Greenwich Standard Time", "Greenwich Daylight Time",		"WET", "WEST"	},	{		"GTB Standard Time", "GTB Daylight Time",		"EET", "EEST"	},	{		"Hawaiian Standard Time", "Hawaiian Daylight Time",		"HST", "HPT"	},	{		"India Standard Time", "India Daylight Time",		"IST", "IST"	},	{		"Iran Standard Time", "Iran Daylight Time",		"IRST", "IRDT"	},	{		"Jerusalem Standard Time", "Jerusalem Daylight Time",		"IST", "IDT"	},	{		"Korea Standard Time", "Korea Daylight Time",		"KST", "KDT"	},	{		"Mexico Standard Time", "Mexico Daylight Time",		"CST", "CDT"	},	{		"Mexico Standard Time", "Mexico Daylight Time",		"BOT", "BOST"	},	{		"Mid-Atlantic Standard Time", "Mid-Atlantic Daylight Time",		"GST", "GST"	},	{		"Mountain Standard Time", "Mountain Daylight Time",		"MST", "MDT"	},	{		"Myanmar Standard Time", "Myanmar Daylight Time",		"MMT", "MMT"	},	{		"N. Central Asia Standard Time", "N. Central Asia Daylight Time",		"ALMT", "ALMST"	},	{		"Nepal Standard Time", "Nepal Daylight Time",		"NPT", "NPT"	},	{		"New Zealand Standard Time", "New Zealand Daylight Time",		"NZST", "NZDT"	},	{		"Newfoundland Standard Time", "Newfoundland Daylight Time",		"NST", "NDT"	},	{		"North Asia East Standard Time", "North Asia East Daylight Time",		"IRKT", "IRKST"	},	{		"North Asia Standard Time", "North Asia Daylight Time",		"KRAT", "KRAST"	},	{		"Pacific SA Standard Time", "Pacific SA Daylight Time",		"CLT", "CLST"	},	{		"Pacific Standard Time", "Pacific Daylight Time",		"PST", "PDT"	},	{		"Romance Standard Time", "Romance Daylight Time",		"CET", "CEST"	},	{		"Russian Standard Time", "Russian Daylight Time",		"MSK", "MSD"	},	{		"SA Eastern Standard Time", "SA Eastern Daylight Time",		"ART", "ARST"	},	{		"SA Pacific Standard Time", "SA Pacific Daylight Time",		"COT", "COST"	},	{		"SA Western Standard Time", "SA Western Daylight Time",		"VET", "VET"	},	{		"Samoa Standard Time", "Samoa Daylight Time",		"SST", "NDT"	},	{		"SE Asia Standard Time", "SE Asia Daylight Time",		"ICT", "ICT"	},	{		"Malay Peninsula Standard Time", "Malay Peninsula Daylight Time",		"MYT", "MALST"	},	{		"South Africa Standard Time", "South Africa Daylight Time",		"CAT", "CAT"	},	{		"Sri Lanka Standard Time", "Sri Lanka Daylight Time",		"LKT", "IST"	},	{		"Taipei Standard Time", "Taipei Daylight Time",		"CST", "CDT"	},	{		"Tasmania Standard Time", "Tasmania Daylight Time",		"EST", "EST"	},	{		"Tokyo Standard Time", "Tokyo Daylight Time",		"JST", "JDT"	},	{		"Tonga Standard Time", "Tonga Daylight Time",		"TOT", "TOST"	},	{		"US Eastern Standard Time", "US Eastern Daylight Time",		"EST", "EDT"	},	{		"US Mountain Standard Time", "US Mountain Daylight Time",		"MST", "MDT"	},	{		"Vladivostok Standard Time", "Vladivostok Daylight Time",		"VLAT", "VLAST"	},	{		"W. Australia Standard Time", "W. Australia Daylight Time",		"WST", "WST"	},	/* Not mapped in PostgreSQL.	 *	 * I mapped this based on the following information... -- rlaager	 * $ cd /usr/share/zoneinfo/Africa	 * $ for i in * ; do echo `TZ=Africa/$i date +"%z %Z"` $i ; done | grep +0100	 * +0100 CET Algiers	 * +0100 WAT Bangui	 * +0100 WAT Brazzaville	 * +0100 CET Ceuta	 * +0100 WAT Douala	 * +0100 WAT Kinshasa	 * +0100 WAT Lagos	 * +0100 WAT Libreville	 * +0100 WAT Luanda	 * +0100 WAT Malabo	 * +0100 WAT Ndjamena	 * +0100 WAT Niamey	 * +0100 WAT Porto-Novo	 * +0100 CET Tunis	 **/	{		"W. Central Africa Standard Time", "W. Central Africa Daylight Time",		"WAT", "WAT"	},	{		"W. Europe Standard Time", "W. Europe Daylight Time",		"CET", "CEST"	},	{		"West Asia Standard Time", "West Asia Daylight Time",		"PKT", "PKST"	},	{		"West Pacific Standard Time", "West Pacific Daylight Time",		"ChST", "ChST"	},	{		"Yakutsk Standard Time", "Yakutsk Daylight Time",		"YAKT", "YAKST"	},	{		NULL, NULL,		NULL, NULL	}};const char *wpurple_get_timezone_abbreviation(const struct tm *tm){	int i;	char tzname[128];	char localtzname[256];	HKEY rootKey;	int idx;	if (!tm)	{		purple_debug_warning("wpurple", "could not determine current date/time: localtime failed\n");		return "";	}	if (strftime(tzname, sizeof(tzname) - 1, "%Z", tm) == 0)	{		purple_debug_error("wpurple", "timezone name is too long for the buffer\n");		return "";	}	for (i = 0; win32_tzmap[i].wstd != NULL; i++)	{		if (strcmp(tzname, win32_tzmap[i].wstd) == 0)		{#if 0			purple_debug_info("wpurple", "TZ \"%s\" matches Windows timezone \"%s\"\n",			                win32_tzmap[i].ustd, tzname);#endif			/* Cache the Result */			if (i > 0) {				if (win32_tzmap[0].wstd[0] != '\0')					g_free(win32_tzmap[0].wstd);				win32_tzmap[0].wstd = g_strdup(tzname);				win32_tzmap[0].ustd = win32_tzmap[i].ustd;			}			return win32_tzmap[i].ustd;		}		if (strcmp(tzname, win32_tzmap[i].wdst) == 0)		{#if 0			purple_debug_info("wpurple", "TZ \"%s\" matches Windows timezone \"%s\"\n",			                win32_tzmap[i].udst, tzname);#endif			/* Cache the Result */			if (i > 0) {				if (win32_tzmap[0].wdst[0] != '\0')					g_free(win32_tzmap[0].wdst);				win32_tzmap[0].wdst = g_strdup(tzname);				win32_tzmap[0].udst = win32_tzmap[i].udst;			}			return win32_tzmap[i].udst;		}	}	/*	 * Localized Windows versions return localized names for the timezone.	 * Scan the registry to find the English name, and then try matching	 * against our table again.	 */	memset(localtzname, 0, sizeof(localtzname));	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,			   "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones",					 0,					 KEY_READ,					 &rootKey) != ERROR_SUCCESS)	{		purple_debug_warning("wpurple", "could not open registry key to identify Windows timezone: %i\n", (int) GetLastError());		return "";	}	for (idx = 0;; idx++)	{		char keyname[256];		char zonename[256];		DWORD namesize;		FILETIME lastwrite;		HKEY key;		LONG r;		memset(keyname, 0, sizeof(keyname));		namesize = sizeof(keyname);		if ((r = RegEnumKeyEx(rootKey,							  idx,							  keyname,							  &namesize,							  NULL,							  NULL,							  NULL,							  &lastwrite)) != ERROR_SUCCESS)		{			if (r == ERROR_NO_MORE_ITEMS)				break;			purple_debug_warning("wpurple", "could not enumerate registry subkeys to identify Windows timezone: %i\n", (int) r);			break;		}		if ((r = RegOpenKeyEx(rootKey, keyname, 0, KEY_READ, &key)) != ERROR_SUCCESS)		{			purple_debug_warning("wpurple", "could not open registry subkey to identify Windows timezone: %i\n", (int) r);			break;		}		memset(zonename, 0, sizeof(zonename));		namesize = sizeof(zonename);		if ((r = RegQueryValueEx(key, "Std", NULL, NULL, zonename, &namesize)) != ERROR_SUCCESS)		{			purple_debug_warning("wpurple", "could not query value for 'std' to identify Windows timezone: %i\n", (int) r);			RegCloseKey(key);			break;		}		if (strcmp(tzname, zonename) == 0)		{			/* Matched zone */			strcpy(localtzname, keyname);			RegCloseKey(key);			break;		}		memset(zonename, 0, sizeof(zonename));		namesize = sizeof(zonename);		if ((r = RegQueryValueEx(key, "Dlt", NULL, NULL, zonename, &namesize)) != ERROR_SUCCESS)		{			purple_debug_warning("wpurple", "could not query value for 'dlt' to identify Windows timezone: %i\n", (int) r);			RegCloseKey(key);			break;		}		if (strcmp(tzname, zonename) == 0)		{			/* Matched DST zone */			strcpy(localtzname, keyname);			RegCloseKey(key);			break;		}		RegCloseKey(key);	}	RegCloseKey(rootKey);	if (localtzname[0])	{		/* Found a localized name, so scan for that one too */		for (i = 0; win32_tzmap[i].wstd != NULL; i++)		{			if (strcmp(localtzname, win32_tzmap[i].wstd) == 0)			{#if 0				purple_debug_info("wpurple", "TZ \"%s\" matches localized Windows timezone \"%s\" (\"%s\")\n",				                win32_tzmap[i].ustd, tzname, localtzname);#endif				/* Cache the Result */				if (win32_tzmap[0].wstd[0] != '\0')					g_free(win32_tzmap[0].wstd);				win32_tzmap[0].wstd = g_strdup(tzname);				win32_tzmap[0].ustd = win32_tzmap[i].ustd;				return win32_tzmap[i].ustd;			}			if (strcmp(localtzname, win32_tzmap[i].wdst) == 0)			{#if 0				purple_debug_info("wpurple", "TZ \"%s\" matches localized Windows timezone \"%s\" (\"%s\")\n",				                win32_tzmap[i].udst, tzname, localtzname);#endif				/* Cache the Result */				if (win32_tzmap[0].wdst[0] != '\0')					g_free(win32_tzmap[0].wdst);				win32_tzmap[0].wdst = g_strdup(tzname);				win32_tzmap[0].udst = win32_tzmap[i].udst;				return win32_tzmap[i].udst;			}		}	}	purple_debug_warning("wpurple", "could not find a match for Windows timezone \"%s\"\n", tzname);	return "";}#if !GLIB_CHECK_VERSION(2,8,0)/** * g_access: * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows) * @mode: as in access() * * A wrapper for the POSIX access() function. This function is used to * test a pathname for one or several of read, write or execute * permissions, or just existence. On Windows, the underlying access() * function in the C library only checks the READONLY attribute, and * does not look at the ACL at all. Software that needs to handle file * permissions on Windows more exactly should use the Win32 API. * * See the C library manual for more details about access(). * * Returns: zero if the pathname refers to an existing file system * object that has all the tested permissions, or -1 otherwise or on * error. * * Since: 2.8 */intwpurple_g_access (const gchar *filename,	  int          mode){  if (G_WIN32_HAVE_WIDECHAR_API ())    {      wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);      int retval;      int save_errno;      if (wfilename == NULL)	{	  errno = EINVAL;	  return -1;	}      retval = _waccess (wfilename, mode);      save_errno = errno;      g_free (wfilename);      errno = save_errno;      return retval;    }  else    {      gchar *cp_filename = g_locale_from_utf8 (filename, -1, NULL, NULL, NULL);      int retval;      int save_errno;      if (cp_filename == NULL)	{	  errno = EINVAL;	  return -1;	}      retval = access (cp_filename, mode);      save_errno = errno;      g_free (cp_filename);      errno = save_errno;      return retval;    }}#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?