?? strftime.c
字號:
/***
*strftime.c - String Format Time
*
* Copyright (c) 1988-1997, Microsoft Corporation. All rights reserved.
*
*Purpose:
*
*******************************************************************************/
#ifdef _MAC
#define _WLM_NOFORCE_LIBS
#include <windows.h>
#ifdef _WIN32
#undef _WIN32 /* windows.h should NOT set _WIN32 */
#endif /* _WIN32 */
/* The following two TYPEDEFs are NOT defined in <windows.h> for the Mac */
typedef DWORD LCTYPE; /* from windows.h */
typedef int mbstate_t; /* from wchar.h */
#endif /* _MAC */
#include <cruntime.h>
#include <internal.h>
#include <mtdll.h>
#include <time.h>
#include <locale.h>
#include <setlocal.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <xlocinfo.h>
/* Prototypes for local routines */
static void __cdecl _expandtime (char specifier, const struct tm *tmptr,
char **out, size_t *count, struct __lc_time_data *lc_time);
static void __cdecl _store_str (char *in, char **out, size_t *count);
static void __cdecl _store_num (int num, int digits, char **out, size_t *count);
static void __cdecl _store_number (int num, char **out, size_t *count);
static void __cdecl _store_winword (const char *format, const struct tm *tmptr, char **out, size_t *count, struct __lc_time_data *lc_time);
/* LC_TIME data for local "C" */
__declspec(selectany) struct __lc_time_data __lc_time_c = {
{"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"},
{"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
"Friday", "Saturday", },
{"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug",
"Sep", "Oct", "Nov", "Dec"},
{"January", "February", "March", "April", "May", "June",
"July", "August", "September", "October",
"November", "December"},
{"AM", "PM"}
, { "M/d/yy" }
, { "dddd, MMMM dd, yyyy" }
, { "H:mm:ss" }
};
/* Pointer to the current LC_TIME data structure. */
struct __lc_time_data *__lc_time_curr = &__lc_time_c;
/* Flags */
unsigned __alternate_form;
unsigned __no_lead_zeros;
#define TIME_SEP ':'
/* get a copy of the current day names */
char * __cdecl _Getdays (
void
)
{
const struct __lc_time_data *pt = __lc_time_curr;
size_t n, len = 0;
char *p;
for (n = 0; n < 7; ++n)
len += strlen(pt->wday_abbr[n]) + strlen(pt->wday[n]) + 2;
p = (char *)malloc(len + 1);
if (p != 0) {
char *s = p;
for (n = 0; n < 7; ++n) {
*s++ = TIME_SEP;
s += strlen(strcpy(s, pt->wday_abbr[n]));
*s++ = TIME_SEP;
s += strlen(strcpy(s, pt->wday[n]));
}
*s++ = '\0';
}
return (p);
}
/* get a copy of the current month names */
char * __cdecl _Getmonths (
void
)
{
const struct __lc_time_data *pt = __lc_time_curr;
size_t n, len = 0;
char *p;
for (n = 0; n < 12; ++n)
len += strlen(pt->month_abbr[n]) + strlen(pt->month[n]) + 2;
p = (char *)malloc(len + 1);
if (p != 0) {
char *s = p;
for (n = 0; n < 12; ++n) {
*s++ = TIME_SEP;
s += strlen(strcpy(s, pt->month_abbr[n]));
*s++ = TIME_SEP;
s += strlen(strcpy(s, pt->month[n]));
}
*s++ = '\0';
}
return (p);
}
/* get a copy of the current time locale information */
void * __cdecl _Gettnames (
void
)
{
const struct __lc_time_data *pt = __lc_time_curr;
size_t n, len = 0;
void *p;
for (n = 0; n < 7; ++n)
len += strlen(pt->wday_abbr[n]) + strlen(pt->wday[n]) + 2;
for (n = 0; n < 12; ++n)
len += strlen(pt->month_abbr[n]) + strlen(pt->month[n]) + 2;
len += strlen(pt->ampm[0]) + strlen(pt->ampm[1]) + 2;
len += strlen(pt->ww_sdatefmt) + 1;
len += strlen(pt->ww_ldatefmt) + 1;
len += strlen(pt->ww_timefmt) + 1;
p = malloc(sizeof (*pt) + len);
if (p != 0)
{struct __lc_time_data *pn = (struct __lc_time_data *)p;
char *s = (char *)p + sizeof (*pt);
memcpy(p, __lc_time_curr, sizeof (*pt));
for (n = 0; n < 7; ++n)
{pn->wday_abbr[n] = s;
s += strlen(strcpy(s, pt->wday_abbr[n])) + 1;
pn->wday[n] = s;
s += strlen(strcpy(s, pt->wday[n])) + 1; }
for (n = 0; n < 12; ++n)
{pn->month_abbr[n] = s;
s += strlen(strcpy(s, pt->month_abbr[n])) + 1;
pn->month[n] = s;
s += strlen(strcpy(s, pt->month[n])) + 1; }
pn->ampm[0] = s;
s += strlen(strcpy(s, pt->ampm[0])) + 1;
pn->ampm[1] = s;
s += strlen(strcpy(s, pt->ampm[1])) + 1;
pn->ww_sdatefmt = s;
s += strlen(strcpy(s, pt->ww_sdatefmt)) + 1;
pn->ww_ldatefmt = s;
s += strlen(strcpy(s, pt->ww_ldatefmt)) + 1;
pn->ww_timefmt = s; }
return (p);
}
/***
*size_t strftime(string, maxsize, format, timeptr) - Format a time string
*
*Purpose:
* Place characters into the user's output buffer expanding time
* format directives as described in the user's control string.
* Use the supplied 'tm' structure for time data when expanding
* the format directives.
* [ANSI]
*
*Entry:
* char *string = pointer to output string
* size_t maxsize = max length of string
* const char *format = format control string
* const struct tm *timeptr = pointer to tb data structure
*
*Exit:
* !0 = If the total number of resulting characters including the
* terminating null is not more than 'maxsize', then return the
* number of chars placed in the 'string' array (not including the
* null terminator).
*
* 0 = Otherwise, return 0 and the contents of the string are
* indeterminate.
*
*Exceptions:
*
*******************************************************************************/
size_t __cdecl strftime (
char *string,
size_t maxsize,
const char *format,
const struct tm *timeptr
)
{
return (_Strftime(string, maxsize, format, timeptr, 0));
}
/***
*size_t _Strftime(string, maxsize, format,
* timeptr, lc_time) - Format a time string for a given locale
*
*Purpose:
* Place characters into the user's output buffer expanding time
* format directives as described in the user's control string.
* Use the supplied 'tm' structure for time data when expanding
* the format directives. use the locale information at lc_time.
* [ANSI]
*
*Entry:
* char *string = pointer to output string
* size_t maxsize = max length of string
* const char *format = format control string
* const struct tm *timeptr = pointer to tb data structure
* struct __lc_time_data *lc_time = pointer to locale-specific info
* (passed as void * to avoid type mismatch with C++)
*
*Exit:
* !0 = If the total number of resulting characters including the
* terminating null is not more than 'maxsize', then return the
* number of chars placed in the 'string' array (not including the
* null terminator).
*
* 0 = Otherwise, return 0 and the contents of the string are
* indeterminate.
*
*Exceptions:
*
*******************************************************************************/
size_t __cdecl _Strftime (
char *string,
size_t maxsize,
const char *format,
const struct tm *timeptr,
void *lc_time_arg
)
{
struct __lc_time_data *lc_time = lc_time_arg == 0 ? __lc_time_curr
: (struct __lc_time_data *)lc_time_arg;
size_t left; /* space left in output string */
#ifdef _MT
int local_lock_flag;
#endif /* _MT */
/* Copy maxsize into temp. */
left = maxsize;
_lock_locale( local_lock_flag )
/* Copy the input string to the output string expanding the format
designations appropriately. Stop copying when one of the following
is true: (1) we hit a null char in the input stream, or (2) there's
no room left in the output stream. */
while (left > 0)
{
switch(*format)
{
case('\0'):
/* end of format input string */
goto done;
case('%'):
/* Format directive. Take appropriate action based
on format control character. */
format++; /* skip over % char */
/* process flags */
__alternate_form = 0;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -