formatting.c
来自「PostgreSQL7.4.6 for Linux」· C语言 代码 · 共 2,989 行 · 第 1/5 页
C
2,989 行
{ sscanf(inout, "%02d", &tmfc->hh); return 1 + SKIP_THth(suf); } } break; case DCH_HH24: if (flag == 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)); if (S_FM(suf) || S_THth(suf)) return strlen(p_inout) - 1; else return 1; } else if (flag == FROM_CHAR) { if (S_FM(suf) || is_next_separator(node)) { sscanf(inout, "%d", &tmfc->hh); return strdigits_len(inout) - 1 + SKIP_THth(suf); } else { sscanf(inout, "%02d", &tmfc->hh); return 1 + SKIP_THth(suf); } } break; case DCH_MI: if (flag == 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)); if (S_FM(suf) || S_THth(suf)) return strlen(p_inout) - 1; else return 1; } else if (flag == FROM_CHAR) { if (S_FM(suf) || is_next_separator(node)) { sscanf(inout, "%d", &tmfc->mi); return strdigits_len(inout) - 1 + SKIP_THth(suf); } else { sscanf(inout, "%02d", &tmfc->mi); return 1 + SKIP_THth(suf); } } break; case DCH_SS: if (flag == 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)); if (S_FM(suf) || S_THth(suf)) return strlen(p_inout) - 1; else return 1; } else if (flag == FROM_CHAR) { if (S_FM(suf) || is_next_separator(node)) { sscanf(inout, "%d", &tmfc->ss); return strdigits_len(inout) - 1 + SKIP_THth(suf); } else { sscanf(inout, "%02d", &tmfc->ss); return 1 + SKIP_THth(suf); } } break; case DCH_MS: /* millisecond */ if (flag == 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)); if (S_THth(suf)) return strlen(p_inout) - 1; else return 2; } else if (flag == FROM_CHAR) { 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 - 1 + SKIP_THth(suf); } break; case DCH_US: /* microsecond */ if (flag == 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)); if (S_THth(suf)) return strlen(p_inout) - 1; else return 5; } else if (flag == FROM_CHAR) { 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 - 1 + SKIP_THth(suf); } break; case DCH_SSSS: if (flag == TO_CHAR) { sprintf(inout, "%d", tm->tm_hour * 3600 + tm->tm_min * 60 + tm->tm_sec); if (S_THth(suf)) str_numth(p_inout, inout, S_TH_TYPE(suf)); return strlen(p_inout) - 1; } else if (flag == FROM_CHAR) { if (S_FM(suf) || is_next_separator(node)) { sscanf(inout, "%d", &tmfc->ssss); return strdigits_len(inout) - 1 + SKIP_THth(suf); } else { sscanf(inout, "%05d", &tmfc->ssss); return 4 + SKIP_THth(suf); } } break; case DCH_tz: case DCH_TZ: if (flag == 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 - 1; } else if (flag == FROM_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, int flag, FormatNode *node, void *data){ char buff[DCH_CACHE_SIZE], *p_inout; int i, len; struct tm *tm = NULL; TmFromChar *tmfc = NULL; TmToChar *tmtc = NULL; if (flag == TO_CHAR) { tmtc = (TmToChar *) data; tm = tmtcTm(tmtc); } else tmfc = (TmFromChar *) data; p_inout = inout; /* * 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 (flag == FROM_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 - 1; else return 8; } 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 2; } 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 - 1; else return 8; } 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 2; } } switch (arg) { case DCH_A_D: case DCH_B_C: if (flag == TO_CHAR) { strcpy(inout, (tm->tm_year < 0 ? B_C_STR : A_D_STR)); return 3; } else if (flag == FROM_CHAR) { if (strncmp(inout, B_C_STR, 4) == 0) tmfc->bc = TRUE; return 3; } break; case DCH_AD: case DCH_BC: if (flag == TO_CHAR) { strcpy(inout, (tm->tm_year < 0 ? BC_STR : AD_STR)); return 1; } else if (flag == FROM_CHAR) { if (strncmp(inout, BC_STR, 2) == 0) tmfc->bc = TRUE; return 1; } break; case DCH_a_d: case DCH_b_c: if (flag == TO_CHAR) { strcpy(inout, (tm->tm_year < 0 ? b_c_STR : a_d_STR)); return 3; } else if (flag == FROM_CHAR) { if (strncmp(inout, b_c_STR, 4) == 0) tmfc->bc = TRUE; return 3; } break; case DCH_ad: case DCH_bc: if (flag == TO_CHAR) { strcpy(inout, (tm->tm_year < 0 ? bc_STR : ad_STR)); return 1; } else if (flag == FROM_CHAR) { if (strncmp(inout, bc_STR, 2) == 0) tmfc->bc = TRUE; return 1; } break; case DCH_MONTH: strcpy(inout, months_full[tm->tm_mon - 1]); sprintf(inout, "%*s", S_FM(suf) ? 0 : -9, str_toupper(inout)); if (S_FM(suf)) return strlen(p_inout) - 1; else return 8; case DCH_Month: sprintf(inout, "%*s", S_FM(suf) ? 0 : -9, months_full[tm->tm_mon - 1]); if (S_FM(suf)) return strlen(p_inout) - 1; else return 8; case DCH_month: sprintf(inout, "%*s", S_FM(suf) ? 0 : -9, months_full[tm->tm_mon - 1]); *inout = tolower((unsigned char) *inout); if (S_FM(suf)) return strlen(p_inout) - 1; else return 8; case DCH_MON: strcpy(inout, months[tm->tm_mon - 1]); inout = str_toupper(inout); return 2; case DCH_Mon: strcpy(inout, months[tm->tm_mon - 1]); return 2; case DCH_mon: strcpy(inout, months[tm->tm_mon - 1]); *inout = tolower((unsigned char) *inout); return 2; case DCH_MM: if (flag == 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)); if (S_FM(suf) || S_THth(suf)) return strlen(p_inout) - 1; else return 1; } else if (flag == FROM_CHAR) { if (S_FM(suf) || is_next_separator(node)) { sscanf(inout, "%d", &tmfc->mm); return strdigits_len(inout) - 1 + SKIP_THth(suf); } else { sscanf(inout, "%02d", &tmfc->mm); return 1 + SKIP_THth(suf); } } break; case DCH_DAY: strcpy(inout, days[tm->tm_wday]); sprintf(inout, "%*s", S_FM(suf) ? 0 : -9, str_toupper(inout)); if (S_FM(suf)) return strlen(p_inout) - 1; else return 8; case DCH_Day: sprintf(inout, "%*s", S_FM(suf) ? 0 : -9, days[tm->tm_wday]); if (S_FM(suf)) return strlen(p_inout) - 1; else return 8; case DCH_day: sprintf(inout, "%*s", S_FM(suf) ? 0 : -9, days[tm->tm_wday]); *inout = tolower((unsigned char) *inout); if (S_FM(suf)) return strlen(p_inout) - 1; else return 8; case DCH_DY: strcpy(inout, days[tm->tm_wday]); inout = str_toupper(inout); return 2; case DCH_Dy: strcpy(inout, days[tm->tm_wday]); return 2; case DCH_dy: strcpy(inout, days[tm->tm_wday]); *inout = tolower((unsigned char) *inout); return 2; case DCH_DDD: if (flag == 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)); if (S_FM(suf) || S_THth(suf)) return strlen(p_inout) - 1; else return 2; } else if (flag == FROM_CHAR) { if (S_FM(suf) || is_next_separator(node)) { sscanf(inout, "%d", &tmfc->ddd); return strdigits_len(inout) - 1 + SKIP_THth(suf); } else { sscanf(inout, "%03d", &tmfc->ddd); return 2 + SKIP_THth(suf); } } break; case DCH_DD: if (flag == 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)); if (S_FM(suf) || S_THth(suf)) return strlen(p_inout) - 1; else return 1; } else if (flag == FROM_CHAR) { if (S_FM(suf) || is_next_separator(node)) { sscanf(inout, "%d", &tmfc->dd); return strdigits_len(inout) - 1 + SKIP_THth(suf); } else { sscanf(inout, "%02d", &tmfc->dd); return 1 + SKIP_THth(suf); } } break; case DCH_D: if (flag == TO_CHAR) { sprintf(inout, "%d", tm->tm_wday + 1); if (S_THth(suf)) { str_numth(p_inout, inout, S_TH_TYPE(suf)); return 2; } return 0; } else if (flag == FROM_CHAR) { sscanf(inout, "%1d", &tmfc->d); return 0 + SKIP_THth(suf); } break; case DCH_WW: if (flag == 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)); if (S_FM(suf) || S_THth(suf)) return strlen(p_inout) - 1; else return 1; } else if (flag == FROM_CHAR) { if (S_FM(suf) || is_next_separator(node)) { sscanf(inout, "%d", &tmfc->ww); return strdigits_len(inout) - 1 + SKIP_THth(suf); } else { sscanf(inout, "%02d", &tmfc->ww); return 1 + SKIP_THth(suf); } } break; case DCH_IW: if (flag == TO_CHAR) { sprintf(inout, "%0*d", S_FM(suf) ? 0 : 2, date2isoweek(tm->tm_year, tm->tm_mon, tm->tm_mday)); if (S_THth(suf)) str_numth(p_inout, inout, S_TH_TYPE(suf)); if (S_FM(suf) || S_THth(suf)) return strlen(p_inout) - 1; else return 1; } else if (flag == FROM_CHAR) { if (S_FM(suf) || is_next_separator(node)) { sscanf(inout, "%d", &tmfc->iw); return strdigits_len(inout) - 1 + SKIP_THth(suf); } else { sscanf(inout, "%02d", &tmfc->iw); return 1 + SKIP_THth(suf); } } break; case DCH_Q: if (flag == TO_CHAR) { sprintf(inout, "%d", (tm->tm_mon - 1) / 3 + 1); if (S_THth(suf)) { str_numth(p_inout, inout, S_TH_TYPE(suf)); return 2;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?