📄 formatting.c
字号:
str_toupper(inout); } return strlen(p_inout); case DCH_Mon: INVALID_FOR_INTERVAL; if (!tm->tm_mon) return -1; if (S_TM(suf)) strcpy(inout, localize_month(tm->tm_mon - 1)); else strcpy(inout, months[tm->tm_mon - 1]); return strlen(p_inout); case DCH_mon: INVALID_FOR_INTERVAL; if (!tm->tm_mon) return -1; if (S_TM(suf)) { strcpy(workbuff, localize_month(tm->tm_mon - 1)); strcpy(inout, localized_str_tolower(workbuff)); } else { 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 strspace_len(inout) + 2 + SKIP_THth(suf); } } break; case DCH_DAY: INVALID_FOR_INTERVAL; if (S_TM(suf)) { strcpy(workbuff, localize_day_full(tm->tm_wday)); sprintf(inout, "%*s", 0, localized_str_toupper(workbuff)); } else { 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; if (S_TM(suf)) sprintf(inout, "%*s", 0, localize_day_full(tm->tm_wday)); else sprintf(inout, "%*s", S_FM(suf) ? 0 : -9, days[tm->tm_wday]); return strlen(p_inout); case DCH_day: INVALID_FOR_INTERVAL; if (S_TM(suf)) { strcpy(workbuff, localize_day_full(tm->tm_wday)); sprintf(inout, "%*s", 0, localized_str_tolower(workbuff)); } else { 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; if (S_TM(suf)) { strcpy(workbuff, localize_day(tm->tm_wday)); strcpy(inout, localized_str_toupper(workbuff)); } else { strcpy(inout, days_short[tm->tm_wday]); str_toupper(inout); } return strlen(p_inout); case DCH_Dy: INVALID_FOR_INTERVAL; if (S_TM(suf)) strcpy(inout, localize_day(tm->tm_wday)); else strcpy(inout, days_short[tm->tm_wday]); return strlen(p_inout); case DCH_dy: INVALID_FOR_INTERVAL; if (S_TM(suf)) { strcpy(workbuff, localize_day(tm->tm_wday)); strcpy(inout, localized_str_tolower(workbuff)); } else { strcpy(inout, days_short[tm->tm_wday]); *inout = pg_tolower((unsigned char) *inout); } return strlen(p_inout); case DCH_DDD: case DCH_IDDD: if (is_to_char) { sprintf(inout, "%0*d", S_FM(suf) ? 0 : 3, (arg == DCH_DDD) ? tm->tm_yday : date2isoyearday(tm->tm_year, tm->tm_mon, 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->ddd); return strdigits_len(inout) + SKIP_THth(suf); } else { sscanf(inout, "%03d", &tmfc->ddd); return strspace_len(inout) + 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 strspace_len(inout) + 2 + SKIP_THth(suf); } } break; case DCH_D: case DCH_ID: INVALID_FOR_INTERVAL; if (is_to_char) { if (arg == DCH_D) sprintf(inout, "%d", tm->tm_wday + 1); else sprintf(inout, "%d", (tm->tm_wday == 0) ? 7 : tm->tm_wday); if (S_THth(suf)) str_numth(p_inout, inout, S_TH_TYPE(suf)); return strlen(p_inout); } else { sscanf(inout, "%1d", &tmfc->d); if (arg == DCH_D) tmfc->d--; return strspace_len(inout) + 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)) { sscanf(inout, "%d", &tmfc->ww); return strdigits_len(inout) + SKIP_THth(suf); } else { sscanf(inout, "%02d", &tmfc->ww); return strspace_len(inout) + 2 + SKIP_THth(suf); } } break; case DCH_IW: if (is_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)); return strlen(p_inout); } else { if (S_FM(suf) || is_next_separator(node)) { sscanf(inout, "%d", &tmfc->iw); return strdigits_len(inout) + SKIP_THth(suf); } else { sscanf(inout, "%02d", &tmfc->iw); return strspace_len(inout) + 2 + SKIP_THth(suf); } } break; case DCH_Q: if (is_to_char) { if (!tm->tm_mon) return -1; sprintf(inout, "%d", (tm->tm_mon - 1) / 3 + 1); if (S_THth(suf)) str_numth(p_inout, inout, S_TH_TYPE(suf)); return strlen(p_inout); } else { sscanf(inout, "%1d", &tmfc->q); return strspace_len(inout) + 1 + SKIP_THth(suf); } break; case DCH_CC: if (is_to_char) { if (is_interval) /* straight calculation */ i = tm->tm_year / 100; else /* century 21 starts in 2001 */ i = (tm->tm_year - 1) / 100 + 1; if (i <= 99 && i >= -99) sprintf(inout, "%0*d", S_FM(suf) ? 0 : 2, i); else sprintf(inout, "%d", i); 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->cc); return strdigits_len(inout) + SKIP_THth(suf); } else { sscanf(inout, "%02d", &tmfc->cc); return strspace_len(inout) + 2 + SKIP_THth(suf); } } break; case DCH_Y_YYY: if (is_to_char) { i = ADJUST_YEAR(tm->tm_year, is_interval) / 1000; sprintf(inout, "%d,%03d", i, ADJUST_YEAR(tm->tm_year, is_interval) - (i * 1000)); if (S_THth(suf)) str_numth(p_inout, inout, S_TH_TYPE(suf)); return strlen(p_inout); } else { int cc; sscanf(inout, "%d,%03d", &cc, &tmfc->year); tmfc->year += (cc * 1000); tmfc->yysz = 4; return strdigits_len(inout) + 4 + SKIP_THth(suf); } break; case DCH_YYYY: case DCH_IYYY: if (is_to_char) { if (tm->tm_year <= 9999 && tm->tm_year >= -9998) sprintf(inout, "%0*d", S_FM(suf) ? 0 : 4, arg == DCH_YYYY ? ADJUST_YEAR(tm->tm_year, is_interval) : ADJUST_YEAR(date2isoyear( tm->tm_year, tm->tm_mon, tm->tm_mday), is_interval)); else sprintf(inout, "%d", arg == DCH_YYYY ? ADJUST_YEAR(tm->tm_year, is_interval) : ADJUST_YEAR(date2isoyear( tm->tm_year, tm->tm_mon, tm->tm_mday), is_interval)); if (S_THth(suf)) str_numth(p_inout, inout, S_TH_TYPE(suf)); return strlen(p_inout); } else { int *field; field = (arg == DCH_YYYY) ? &tmfc->year : &tmfc->iyear; if (S_FM(suf) || is_next_separator(node)) { sscanf(inout, "%d", field); tmfc->yysz = 4; return strdigits_len(inout) + SKIP_THth(suf); } else { sscanf(inout, "%04d", field); tmfc->yysz = 4; return strspace_len(inout) + 4 + SKIP_THth(suf); } } break; case DCH_YYY: case DCH_IYY: if (is_to_char) { snprintf(buff, sizeof(buff), "%03d", arg == DCH_YYY ? ADJUST_YEAR(tm->tm_year, is_interval) : ADJUST_YEAR(date2isoyear(tm->tm_year, tm->tm_mon, tm->tm_mday), is_interval)); i = strlen(buff); strcpy(inout, buff + (i - 3)); if (S_THth(suf)) str_numth(p_inout, inout, S_TH_TYPE(suf)); return strlen(p_inout); } else { int *field; field = (arg == DCH_YYY) ? &tmfc->year : &tmfc->iyear; sscanf(inout, "%03d", field); /* * 3-digit year: '100' ... '999' = 1100 ... 1999 '000' ... * '099' = 2000 ... 2099 */ if (*field >= 100) *field += 1000; else *field += 2000; tmfc->yysz = 3; return strspace_len(inout) + 3 + SKIP_THth(suf); } break; case DCH_YY: case DCH_IY: if (is_to_char) { snprintf(buff, sizeof(buff), "%02d", arg == DCH_YY ? ADJUST_YEAR(tm->tm_year, is_interval) : ADJUST_YEAR(date2isoyear(tm->tm_year, tm->tm_mon, tm->tm_mday), is_interval)); i = strlen(buff); strcpy(inout, buff + (i - 2)); if (S_THth(suf)) str_numth(p_inout, inout, S_TH_TYPE(suf)); return strlen(p_inout); } else { int *field; field = (arg == DCH_YY) ? &tmfc->year : &tmfc->iyear; sscanf(inout, "%02d", field); /* * 2-digit year: '00' ... '69' = 2000 ... 2069 '70' ... '99' * = 1970 ... 1999 */ if (*field < 70) *field += 2000; else *field += 1900; tmfc->yysz = 2; return strspace_len(inout) + 2 + SKIP_THth(suf); } break; case DCH_Y: case DCH_I: if (is_to_char) { snprintf(buff, sizeof(buff), "%1d", arg == DCH_Y ? ADJUST_YEAR(tm->tm_year, is_interval) : ADJUST_YEAR(date2isoyear(tm->tm_year, tm->tm_mon, tm->tm_mday), is_interval)); i = strlen(buff); strcpy(inout, buff + (i - 1)); if (S_THth(suf)) str_numth(p_inout, inout, S_TH_TYPE(suf)); return strlen(p_inout); } else { int *field; field = (arg == DCH_Y) ? &tmfc->year : &tmfc->iyear; sscanf(inout, "%1d", field); /* * 1-digit year: always +2000 */ *field += 2000; tmfc->yysz = 1; return strspace_len(inout) + 1 + SKIP_THth(suf); } break; case DCH_RM: if (is_to_char) { if (!tm->tm_mon) return -1; sprintf(inout, "%*s", S_FM(suf) ? 0 : -4, rm_months_upper[12 - tm->tm_mon]); return strlen(p_inout); } else { tmfc->mm = 12 - seq_search(inout, rm_months_upper, ALL_UPPER, FULL_SIZ, &len); CHECK_SEQ_SEARCH(len, "RM"); return len; } break; case DCH_rm: if (is_to_char) { if (!tm->tm_mon) return -1; sprintf(inout, "%*s", S_FM(suf) ? 0 : -4, rm_months_lower[12 - tm->tm_mon]); return strlen(p_inout); } else { tmfc->mm = 12 - seq_search(inout, rm_months_lower, ALL_LOWER, FULL_SIZ, &len); CHECK_SEQ_SEARCH(len, "rm"); return len; } break; case DCH_W: if (is_to_char) { sprintf(inout, "%d", (tm->tm_mday - 1) / 7 + 1); if (S_THth(suf)) str_numth(p_inout, inout, S_TH_TYPE(suf)); return strlen(p_inout); } else { sscanf(inout, "%1d", &tmfc->w); return strspace_len(inout) + 1 + SKIP_THth(suf); } break; case DCH_J: if (is_to_char) { sprintf(inout, "%d", date2j(tm->tm_year, tm->tm_mon, tm->tm_mday)); if (S_THth(suf)) str_numth(p_inout, inout, S_TH_TYPE(suf)); return strlen(p_inout); } else { sscanf(inout, "%d", &tmfc->j); return strdigits_len(inout) + SKIP_THth(suf); } break; } return -1;}static DCHCacheEntry *DCH_cache_getnew(char *str){ DCHCacheEntry *ent = NULL; /* counter overload check - paranoia? */ if (DCHCounter + DCH_CACHE_FIELDS >= MAX_INT32) { DCHCounter = 0; for (ent = DCHCache; ent <= (DCHCache + DCH_CACHE_FIELDS); ent++) ent->age = (++DCHCounter); } /* * Cache is full - needs remove any older entry */ if (n_DCHCache > DCH_CACHE_FIELDS) { DCHCacheEntry *old = DCHCache + 0;#ifdef DEBUG_TO_FROM_CHAR elog(DEBUG_elog_output, "cache is full (%d)", n_DCHCache);#endif for (ent = DCHCache; ent <= (DCHCache + DCH_CACHE_FIELDS); ent++) { if (ent->age < old->age) old = ent; }#ifdef DEBUG_TO_FROM_CHAR elog(DEBUG_elog_output, "OLD: '%s' AGE: %d", old->str, old->age);#endif StrNCpy(old->str, str, DCH_CACHE_SIZE + 1); /* old->format fill parser */ old->age = (++DCHCounter); return old; } else {#ifdef DEBUG_TO_FROM_CHAR elog(DEBUG_elog_output, "NEW (%d)", n_DCHCache);#endif ent = DCHCache + n_DCHCache; StrNCpy(ent->str, str, DCH_CACHE_SIZE + 1); /* ent->format fill parser */ ent->age = (++DCHCounter); ++n_DCHCache; return ent; } return NULL; /* never */}static DCHCacheEntry *DCH_cache_search(char *str){ int i = 0; DCHCacheEntry *ent; /* counter overload check - paranoia? */ if (DCHCounter + DCH_CACHE_FIELDS >=
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -