X-Git-Url: https://git.saurik.com/apple/icu.git/blobdiff_plain/46f4442e9a5a4f3b98b7c1083586332f6a8a99a4..f3c0d7a59d99c2a94c6b8822291f0e42be3773c9:/icuSources/samples/date/date.c diff --git a/icuSources/samples/date/date.c b/icuSources/samples/date/date.c index 8a7ebe1f..156a3417 100644 --- a/icuSources/samples/date/date.c +++ b/icuSources/samples/date/date.c @@ -1,6 +1,10 @@ /* -********************************************************************** -* Copyright (C) 1998-2007, International Business Machines +************************************************************************* +* © 2016 and later: Unicode, Inc. and others. +* License & terms of use: http://www.unicode.org/copyright.html#License +************************************************************************* +*********************************************************************** +* Copyright (C) 1998-2012, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -11,6 +15,7 @@ * Date Name Description * 06/11/99 stephen Creation. * 06/16/99 stephen Modified to use uprint. +* 08/11/11 srl added Parse and milli/second in/out ******************************************************************************* */ @@ -30,11 +35,11 @@ int main(int argc, char **argv); -#if UCONFIG_NO_FORMATTING +#if UCONFIG_NO_FORMATTING || UCONFIG_NO_CONVERSION int main(int argc, char **argv) { - printf("%s: Sorry, UCONFIG_NO_FORMATTING was turned on (see uconfig.h). No formatting can be done. \n", argv[0]); + printf("%s: Sorry, UCONFIG_NO_FORMATTING or UCONFIG_NO_CONVERSION was turned on (see uconfig.h). No formatting can be done. \n", argv[0]); return 0; } #else @@ -43,8 +48,10 @@ int main(int argc, char **argv) /* Protos */ static void usage(void); static void version(void); -static void date(const UChar *tz, UDateFormatStyle style, char *format, UErrorCode *status); +static void date(UDate when, const UChar *tz, UDateFormatStyle style, const char *format, UErrorCode *status); +static UDate getWhen(const char *millis, const char *seconds, const char *format, UDateFormatStyle style, const char *parse, const UChar *tz, UErrorCode *status); +UConverter *cnv = NULL; /* The version of date */ #define DATE_VERSION "1.0" @@ -52,6 +59,8 @@ static void date(const UChar *tz, UDateFormatStyle style, char *format, UErrorCo /* "GMT" */ static const UChar GMT_ID [] = { 0x0047, 0x004d, 0x0054, 0x0000 }; +#define FORMAT_MILLIS "%" +#define FORMAT_SECONDS "%%" int main(int argc, @@ -59,17 +68,20 @@ main(int argc, { int printUsage = 0; int printVersion = 0; - int optind = 1; + int optInd = 1; char *arg; const UChar *tz = 0; UDateFormatStyle style = UDAT_DEFAULT; UErrorCode status = U_ZERO_ERROR; - char *format = NULL; - + const char *format = NULL; + char *parse = NULL; + char *seconds = NULL; + char *millis = NULL; + UDate when; /* parse the options */ - for(optind = 1; optind < argc; ++optind) { - arg = argv[optind]; + for(optInd = 1; optInd < argc; ++optInd) { + arg = argv[optInd]; /* version info */ if(strcmp(arg, "-v") == 0 || strcmp(arg, "--version") == 0) { @@ -100,15 +112,30 @@ main(int argc, style = UDAT_SHORT; } else if(strcmp(arg, "-F") == 0 || strcmp(arg, "--format") == 0) { - if ( optind + 1 < argc ) { - optind++; - format = argv[optind]; + if ( optInd + 1 < argc ) { + optInd++; + format = argv[optInd]; + } + } else if(strcmp(arg, "-r") == 0) { + if ( optInd + 1 < argc ) { + optInd++; + seconds = argv[optInd]; + } + } else if(strcmp(arg, "-R") == 0) { + if ( optInd + 1 < argc ) { + optInd++; + millis = argv[optInd]; + } + } else if(strcmp(arg, "-P") == 0) { + if ( optInd + 1 < argc ) { + optInd++; + parse = argv[optInd]; } } /* POSIX.1 says all arguments after -- are not options */ else if(strcmp(arg, "--") == 0) { /* skip the -- */ - ++optind; + ++optInd; break; } /* unrecognized option */ @@ -134,8 +161,16 @@ main(int argc, return 0; } + /* get the 'when' (or now) */ + when = getWhen(millis, seconds, format, style, parse, tz, &status); + if(parse != NULL) { + format = FORMAT_MILLIS; /* output in millis */ + } + /* print the date */ - date(tz, style, format, &status); + date(when, tz, style, format, &status); + + ucnv_close(cnv); u_cleanup(); return (U_FAILURE(status) ? 1 : 0); @@ -154,42 +189,94 @@ usage() puts(" -l, --long Use long display format."); puts(" -m, --medium Use medium display format."); puts(" -s, --short Use short display format."); + puts(" -F , --format Use as the display format."); + puts(" (Special formats: \"%\" alone is Millis since 1970, \"%%\" alone is Seconds since 1970)"); + puts(" -r Use as the time (Epoch 1970) rather than now."); + puts(" -R Use as the time (Epoch 1970) rather than now."); + puts(" -P Parse as the time, output in millis format."); } /* Version information */ static void version() { - printf("icudate version %s (ICU version %s), created by Stephen F. Booth.\n", - DATE_VERSION, U_ICU_VERSION); + UErrorCode status = U_ZERO_ERROR; + const char *tzVer; + int len = 256; + UChar tzName[256]; + printf("icudate version %s, created by Stephen F. Booth.\n", + DATE_VERSION); puts(U_COPYRIGHT_STRING); + tzVer = ucal_getTZDataVersion(&status); + if(U_FAILURE(status)) { + tzVer = u_errorName(status); + } + printf("\n"); + printf("ICU Version: %s\n", U_ICU_VERSION); + printf("ICU Data (major+min): %s\n", U_ICUDATA_NAME); + printf("Default Locale: %s\n", uloc_getDefault()); + printf("Time Zone Data Version: %s\n", tzVer); + printf("Default Time Zone: "); + status = U_ZERO_ERROR; + u_init(&status); + len = ucal_getDefaultTimeZone(tzName, len, &status); + if(U_FAILURE(status)) { + fprintf(stderr, " ** Error getting default zone: %s\n", u_errorName(status)); + } + uprint(tzName, stdout, &status); + printf("\n\n"); +} + +static int32_t charsToUCharsDefault(UChar *uchars, int32_t ucharsSize, const char*chars, int32_t charsSize, UErrorCode *status) { + int32_t len=-1; + if(U_FAILURE(*status)) return len; + if(cnv==NULL) { + cnv = ucnv_open(NULL, status); + } + if(cnv&&U_SUCCESS(*status)) { + len = ucnv_toUChars(cnv, uchars, ucharsSize, chars,charsSize, status); + } + return len; } /* Format the date */ static void -date(const UChar *tz, +date(UDate when, + const UChar *tz, UDateFormatStyle style, - char *format, - UErrorCode *status) + const char *format, + UErrorCode *status ) { UChar *s = 0; int32_t len = 0; UDateFormat *fmt; UChar uFormat[100]; + if(U_FAILURE(*status)) return; + + if( format != NULL ) { + if(!strcmp(format,FORMAT_MILLIS)) { + printf("%.0f\n", when); + return; + } else if(!strcmp(format, FORMAT_SECONDS)) { + printf("%.3f\n", when/1000.0); + return; + } + } + fmt = udat_open(style, style, 0, tz, -1,NULL,0, status); if ( format != NULL ) { - u_charsToUChars(format,uFormat,strlen(format)), - udat_applyPattern(fmt,FALSE,uFormat,strlen(format)); + charsToUCharsDefault(uFormat,sizeof(uFormat)/sizeof(uFormat[0]),format,-1,status); + udat_applyPattern(fmt,FALSE,uFormat,-1); } - len = udat_format(fmt, ucal_getNow(), 0, len, 0, status); + len = udat_format(fmt, when, 0, len, 0, status); if(*status == U_BUFFER_OVERFLOW_ERROR) { *status = U_ZERO_ERROR; s = (UChar*) malloc(sizeof(UChar) * (len+1)); if(s == 0) goto finish; - udat_format(fmt, ucal_getNow(), s, len + 1, 0, status); - if(U_FAILURE(*status)) goto finish; + udat_format(fmt, when, s, len + 1, 0, status); } + if(U_FAILURE(*status)) goto finish; /* print the date string */ uprint(s, stdout, status); @@ -198,7 +285,63 @@ date(const UChar *tz, printf("\n"); finish: + if(U_FAILURE(*status)) { + fprintf(stderr, "Error in Print: %s\n", u_errorName(*status)); + } udat_close(fmt); free(s); } + +static UDate getWhen(const char *millis, const char *seconds, const char *format, + UDateFormatStyle style, const char *parse, const UChar *tz, UErrorCode *status) { + UDateFormat *fmt = NULL; + UChar uFormat[100]; + UChar uParse[256]; + UDate when=0; + int32_t parsepos = 0; + + if(millis != NULL) { + sscanf(millis, "%lf", &when); + return when; + } else if(seconds != NULL) { + sscanf(seconds, "%lf", &when); + return when*1000.0; + } + + if(parse!=NULL) { + if( format != NULL ) { + if(!strcmp(format,FORMAT_MILLIS)) { + sscanf(parse, "%lf", &when); + return when; + } else if(!strcmp(format, FORMAT_SECONDS)) { + sscanf(parse, "%lf", &when); + return when*1000.0; + } + } + + fmt = udat_open(style, style, 0, tz, -1,NULL,0, status); + if ( format != NULL ) { + charsToUCharsDefault(uFormat,sizeof(uFormat)/sizeof(uFormat[0]), format,-1,status); + udat_applyPattern(fmt,FALSE,uFormat,-1); + } + + charsToUCharsDefault(uParse,sizeof(uParse)/sizeof(uParse[0]), parse,-1,status); + when = udat_parse(fmt, uParse, -1, &parsepos, status); + if(U_FAILURE(*status)) { + fprintf(stderr, "Error in Parse: %s\n", u_errorName(*status)); + if(parsepos > 0 && parsepos <= (int32_t)strlen(parse)) { + fprintf(stderr, "ERR>\"%s\" @%d\n" + "ERR> %*s^\n", + parse,parsepos,parsepos,""); + + } + } + + udat_close(fmt); + return when; + } else { + return ucal_getNow(); + } +} + #endif