⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 formatting.c

📁 PostgreSQL 8.1.4的源码 适用于Linux下的开源数据库系统
💻 C
📖 第 1 页 / 共 5 页
字号:
			}			else			{				if (strncmp(inout, PM_STR, 2) == 0)					tmfc->pm = TRUE;				else if (strncmp(inout, AM_STR, 2) == 0)					tmfc->am = TRUE;				else					AMPM_ERROR;				return strlen(p_inout);			}			break;		case DCH_a_m:		case DCH_p_m:			if (is_to_char)			{				strcpy(inout, (tm->tm_hour % HOURS_PER_DAY >= HOURS_PER_DAY / 2)					   ? p_m_STR : a_m_STR);				return strlen(p_inout);			}			else			{				if (strncmp(inout, p_m_STR, 4) == 0)					tmfc->pm = TRUE;				else if (strncmp(inout, a_m_STR, 4) == 0)					tmfc->am = TRUE;				else					AMPM_ERROR;				return strlen(p_inout);			}			break;		case DCH_am:		case DCH_pm:			if (is_to_char)			{				strcpy(inout, (tm->tm_hour % HOURS_PER_DAY >= HOURS_PER_DAY / 2)					   ? pm_STR : am_STR);				return strlen(p_inout);			}			else			{				if (strncmp(inout, pm_STR, 2) == 0)					tmfc->pm = TRUE;				else if (strncmp(inout, am_STR, 2) == 0)					tmfc->am = TRUE;				else					AMPM_ERROR;				return strlen(p_inout);			}			break;		case DCH_HH:		case DCH_HH12:			if (is_to_char)			{				sprintf(inout, "%0*d", S_FM(suf) ? 0 : 2,						tm->tm_hour % (HOURS_PER_DAY / 2) == 0 ? 12 :					    tm->tm_hour % (HOURS_PER_DAY / 2));				if (S_THth(suf))					str_numth(p_inout, inout, 0);				return strlen(p_inout);			}			else			{				if (S_FM(suf) || is_next_separator(node))				{					sscanf(inout, "%d", &tmfc->hh);					return strdigits_len(inout) + SKIP_THth(suf);				}				else				{					sscanf(inout, "%02d", &tmfc->hh);					return 2 + SKIP_THth(suf);				}			}			break;		case DCH_HH24:			if (is_to_char)			{				sprintf(inout, "%0*d", S_FM(suf) ? 0 : 2, tm->tm_hour);				if (S_THth(suf))					str_numth(p_inout, inout, S_TH_TYPE(suf));				return strlen(p_inout);			}			else			{				if (S_FM(suf) || is_next_separator(node))				{					sscanf(inout, "%d", &tmfc->hh);					return strdigits_len(inout) + SKIP_THth(suf);				}				else				{					sscanf(inout, "%02d", &tmfc->hh);					return 2 + SKIP_THth(suf);				}			}			break;		case DCH_MI:			if (is_to_char)			{				sprintf(inout, "%0*d", S_FM(suf) ? 0 : 2, tm->tm_min);				if (S_THth(suf))					str_numth(p_inout, inout, S_TH_TYPE(suf));				return strlen(p_inout);			}			else			{				if (S_FM(suf) || is_next_separator(node))				{					sscanf(inout, "%d", &tmfc->mi);					return strdigits_len(inout) + SKIP_THth(suf);				}				else				{					sscanf(inout, "%02d", &tmfc->mi);					return 2 + SKIP_THth(suf);				}			}			break;		case DCH_SS:			if (is_to_char)			{				sprintf(inout, "%0*d", S_FM(suf) ? 0 : 2, tm->tm_sec);				if (S_THth(suf))					str_numth(p_inout, inout, S_TH_TYPE(suf));				return strlen(p_inout);			}			else			{				if (S_FM(suf) || is_next_separator(node))				{					sscanf(inout, "%d", &tmfc->ss);					return strdigits_len(inout) + SKIP_THth(suf);				}				else				{					sscanf(inout, "%02d", &tmfc->ss);					return 2 + SKIP_THth(suf);				}			}			break;		case DCH_MS:			/* millisecond */			if (is_to_char)			{#ifdef HAVE_INT64_TIMESTAMP				sprintf(inout, "%03d", (int) (tmtc->fsec / INT64CONST(1000)));#else				sprintf(inout, "%03d", (int) rint(tmtc->fsec * 1000));#endif				if (S_THth(suf))					str_numth(p_inout, inout, S_TH_TYPE(suf));				return strlen(p_inout);			}			else			{				int			len,							x;				if (is_next_separator(node))				{					sscanf(inout, "%d", &tmfc->ms);					len = x = strdigits_len(inout);				}				else				{					sscanf(inout, "%03d", &tmfc->ms);					x = strdigits_len(inout);					len = x = x > 3 ? 3 : x;				}				/*				 * 25 is 0.25 and 250 is 0.25 too; 025 is 0.025 and not 0.25				 */				tmfc->ms *= x == 1 ? 100 :					x == 2 ? 10 : 1;				/*				 * elog(DEBUG3, "X: %d, MS: %d, LEN: %d", x, tmfc->ms, len);				 */				return len + SKIP_THth(suf);			}			break;		case DCH_US:			/* microsecond */			if (is_to_char)			{#ifdef HAVE_INT64_TIMESTAMP				sprintf(inout, "%06d", (int) tmtc->fsec);#else				sprintf(inout, "%06d", (int) rint(tmtc->fsec * 1000000));#endif				if (S_THth(suf))					str_numth(p_inout, inout, S_TH_TYPE(suf));				return strlen(p_inout);			}			else			{				int			len,							x;				if (is_next_separator(node))				{					sscanf(inout, "%d", &tmfc->us);					len = x = strdigits_len(inout);				}				else				{					sscanf(inout, "%06d", &tmfc->us);					x = strdigits_len(inout);					len = x = x > 6 ? 6 : x;				}				tmfc->us *= x == 1 ? 100000 :					x == 2 ? 10000 :					x == 3 ? 1000 :					x == 4 ? 100 :					x == 5 ? 10 : 1;				/*				 * elog(DEBUG3, "X: %d, US: %d, LEN: %d", x, tmfc->us, len);				 */				return len + SKIP_THth(suf);			}			break;		case DCH_SSSS:			if (is_to_char)			{				sprintf(inout, "%d", tm->tm_hour * SECS_PER_HOUR +						tm->tm_min * SECS_PER_MINUTE +						tm->tm_sec);				if (S_THth(suf))					str_numth(p_inout, inout, S_TH_TYPE(suf));				return strlen(p_inout);			}			else			{				if (S_FM(suf) || is_next_separator(node))				{					sscanf(inout, "%d", &tmfc->ssss);					return strdigits_len(inout) + SKIP_THth(suf);				}				else				{					sscanf(inout, "%05d", &tmfc->ssss);					return 5 + SKIP_THth(suf);				}			}			break;		case DCH_tz:		case DCH_TZ:			INVALID_FOR_INTERVAL;			if (is_to_char && tmtcTzn(tmtc))			{				int			siz = strlen(tmtcTzn(tmtc));				if (arg == DCH_TZ)					strcpy(inout, tmtcTzn(tmtc));				else				{					char	   *p = palloc(siz);					strcpy(p, tmtcTzn(tmtc));					strcpy(inout, str_tolower(p));					pfree(p);				}				return siz;			}			else if (!is_to_char)				ereport(ERROR,						(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),						 errmsg("\"TZ\"/\"tz\" not supported")));	}	return -1;}#define CHECK_SEQ_SEARCH(_l, _s) \do { \	if ((_l) <= 0) {							\		ereport(ERROR,	\				(errcode(ERRCODE_INVALID_DATETIME_FORMAT),	\				 errmsg("invalid value for %s", (_s))));	\	}								\} while (0)/* ---------- * Master of DATE for: *		  TO_CHAR - write (inout) formated string *		  FROM_CHAR - scan (inout) string by course of FormatNode * ---------- */static intdch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,		 FormatNode *node, void *data){	char		buff[DCH_CACHE_SIZE],				workbuff[32],			   *p_inout = inout;	int			i,				len;	struct pg_tm *tm = NULL;	TmFromChar *tmfc = NULL;	TmToChar   *tmtc = NULL;	if (is_to_char)	{		tmtc = (TmToChar *) data;		tm = tmtcTm(tmtc);	}	else		tmfc = (TmFromChar *) data;	/*	 * In the FROM-char is not difference between "January" or "JANUARY" or	 * "january", all is before search convert to "first-upper". This	 * convention is used for MONTH, MON, DAY, DY	 */	if (!is_to_char)	{		if (arg == DCH_MONTH || arg == DCH_Month || arg == DCH_month)		{			tmfc->mm = seq_search(inout, months_full, ONE_UPPER, FULL_SIZ, &len) + 1;			CHECK_SEQ_SEARCH(len, "MONTH/Month/month");			if (S_FM(suf))				return len;			else				return 9;		}		else if (arg == DCH_MON || arg == DCH_Mon || arg == DCH_mon)		{			tmfc->mm = seq_search(inout, months, ONE_UPPER, MAX_MON_LEN, &len) + 1;			CHECK_SEQ_SEARCH(len, "MON/Mon/mon");			return 3;		}		else if (arg == DCH_DAY || arg == DCH_Day || arg == DCH_day)		{			tmfc->d = seq_search(inout, days, ONE_UPPER, FULL_SIZ, &len);			CHECK_SEQ_SEARCH(len, "DAY/Day/day");			if (S_FM(suf))				return len;			else				return 9;		}		else if (arg == DCH_DY || arg == DCH_Dy || arg == DCH_dy)		{			tmfc->d = seq_search(inout, days, ONE_UPPER, MAX_DY_LEN, &len);			CHECK_SEQ_SEARCH(len, "DY/Dy/dy");			return 3;		}	}	switch (arg)	{		case DCH_A_D:		case DCH_B_C:			INVALID_FOR_INTERVAL;			if (is_to_char)			{				strcpy(inout, (tm->tm_year <= 0 ? B_C_STR : A_D_STR));				return strlen(p_inout);			}			else			{				if (strncmp(inout, B_C_STR, 4) == 0)					tmfc->bc = TRUE;				return 4;			}			break;		case DCH_AD:		case DCH_BC:			INVALID_FOR_INTERVAL;			if (is_to_char)			{				strcpy(inout, (tm->tm_year <= 0 ? BC_STR : AD_STR));				return strlen(p_inout);			}			else			{				if (strncmp(inout, BC_STR, 2) == 0)					tmfc->bc = TRUE;				return 2;			}			break;		case DCH_a_d:		case DCH_b_c:			INVALID_FOR_INTERVAL;			if (is_to_char)			{				strcpy(inout, (tm->tm_year <= 0 ? b_c_STR : a_d_STR));				return strlen(p_inout);			}			else			{				if (strncmp(inout, b_c_STR, 4) == 0)					tmfc->bc = TRUE;				return 4;			}			break;		case DCH_ad:		case DCH_bc:			INVALID_FOR_INTERVAL;			if (is_to_char)			{				strcpy(inout, (tm->tm_year <= 0 ? bc_STR : ad_STR));				return strlen(p_inout);			}			else			{				if (strncmp(inout, bc_STR, 2) == 0)					tmfc->bc = TRUE;				return 2;			}			break;		case DCH_MONTH:			INVALID_FOR_INTERVAL;			if (!tm->tm_mon)				return -1;			strcpy(workbuff, months_full[tm->tm_mon - 1]);			sprintf(inout, "%*s", S_FM(suf) ? 0 : -9, str_toupper(workbuff));			return strlen(p_inout);		case DCH_Month:			INVALID_FOR_INTERVAL;			if (!tm->tm_mon)				return -1;			sprintf(inout, "%*s", S_FM(suf) ? 0 : -9, months_full[tm->tm_mon - 1]);			return strlen(p_inout);		case DCH_month:			INVALID_FOR_INTERVAL;			if (!tm->tm_mon)				return -1;			sprintf(inout, "%*s", S_FM(suf) ? 0 : -9, months_full[tm->tm_mon - 1]);			*inout = pg_tolower((unsigned char) *inout);			return strlen(p_inout);		case DCH_MON:			INVALID_FOR_INTERVAL;			if (!tm->tm_mon)				return -1;			strcpy(inout, months[tm->tm_mon - 1]);			str_toupper(inout);			return strlen(p_inout);		case DCH_Mon:			INVALID_FOR_INTERVAL;			if (!tm->tm_mon)				return -1;			strcpy(inout, months[tm->tm_mon - 1]);			return strlen(p_inout);		case DCH_mon:			INVALID_FOR_INTERVAL;			if (!tm->tm_mon)				return -1;			strcpy(inout, months[tm->tm_mon - 1]);			*inout = pg_tolower((unsigned char) *inout);			return strlen(p_inout);		case DCH_MM:			if (is_to_char)			{				sprintf(inout, "%0*d", S_FM(suf) ? 0 : 2, tm->tm_mon);				if (S_THth(suf))					str_numth(p_inout, inout, S_TH_TYPE(suf));				return strlen(p_inout);			}			else			{				if (S_FM(suf) || is_next_separator(node))				{					sscanf(inout, "%d", &tmfc->mm);					return strdigits_len(inout) + SKIP_THth(suf);				}				else				{					sscanf(inout, "%02d", &tmfc->mm);					return 2 + SKIP_THth(suf);				}			}			break;		case DCH_DAY:			INVALID_FOR_INTERVAL;			strcpy(workbuff, days[tm->tm_wday]);			sprintf(inout, "%*s", S_FM(suf) ? 0 : -9, str_toupper(workbuff));			return strlen(p_inout);		case DCH_Day:			INVALID_FOR_INTERVAL;			sprintf(inout, "%*s", S_FM(suf) ? 0 : -9, days[tm->tm_wday]);			return strlen(p_inout);		case DCH_day:			INVALID_FOR_INTERVAL;			sprintf(inout, "%*s", S_FM(suf) ? 0 : -9, days[tm->tm_wday]);			*inout = pg_tolower((unsigned char) *inout);			return strlen(p_inout);		case DCH_DY:			INVALID_FOR_INTERVAL;			strcpy(inout, days[tm->tm_wday]);			str_toupper(inout);			return 3;			/* truncate */		case DCH_Dy:			INVALID_FOR_INTERVAL;			strcpy(inout, days[tm->tm_wday]);			return 3;			/* truncate */		case DCH_dy:			INVALID_FOR_INTERVAL;			strcpy(inout, days[tm->tm_wday]);			*inout = pg_tolower((unsigned char) *inout);			return 3;			/* truncate */		case DCH_DDD:			if (is_to_char)			{				sprintf(inout, "%0*d", S_FM(suf) ? 0 : 3, tm->tm_yday);				if (S_THth(suf))					str_numth(p_inout, inout, S_TH_TYPE(suf));				return strlen(p_inout);			}			else			{				if (S_FM(suf) || is_next_separator(node))				{					sscanf(inout, "%d", &tmfc->ddd);					return strdigits_len(inout) + SKIP_THth(suf);				}				else				{					sscanf(inout, "%03d", &tmfc->ddd);					return 3 + SKIP_THth(suf);				}			}			break;		case DCH_DD:			if (is_to_char)			{				sprintf(inout, "%0*d", S_FM(suf) ? 0 : 2, tm->tm_mday);				if (S_THth(suf))					str_numth(p_inout, inout, S_TH_TYPE(suf));				return strlen(p_inout);			}			else			{				if (S_FM(suf) || is_next_separator(node))				{					sscanf(inout, "%d", &tmfc->dd);					return strdigits_len(inout) + SKIP_THth(suf);				}				else				{					sscanf(inout, "%02d", &tmfc->dd);					return 2 + SKIP_THth(suf);				}			}			break;		case DCH_D:			if (is_to_char)			{				sprintf(inout, "%d", tm->tm_wday + 1);				if (S_THth(suf))					str_numth(p_inout, inout, S_TH_TYPE(suf));				return strlen(p_inout);			}			else			{				sscanf(inout, "%1d", &tmfc->d);				return 1 + SKIP_THth(suf);			}			break;		case DCH_WW:			if (is_to_char)			{				sprintf(inout, "%0*d", S_FM(suf) ? 0 : 2,						(tm->tm_yday - 1) / 7 + 1);				if (S_THth(suf))					str_numth(p_inout, inout, S_TH_TYPE(suf));				return strlen(p_inout);			}			else			{				if (S_FM(suf) || is_next_separator(node))

⌨️ 快捷键说明

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