📄 formatting.c
字号:
} 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 + -