1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert************************************************************************* 364339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert* Copyright (C) 2016 and later: Unicode, Inc. and others. 464339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert* License & terms of use: http://www.unicode.org/copyright.html#License 564339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert************************************************************************* 664339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert*********************************************************************** 754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius* Copyright (C) 1998-2012, International Business Machines 8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Corporation and others. All Rights Reserved. 9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru********************************************************************** 10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* File date.c 12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Modification History: 14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Date Name Description 16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 06/11/99 stephen Creation. 17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 06/16/99 stephen Modified to use uprint. 18103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius* 08/11/11 srl added Parse and milli/second in/out 19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru******************************************************************************* 20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/ 21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdlib.h> 23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdio.h> 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <string.h> 25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h" 27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ustring.h" 28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/uclean.h" 29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ucnv.h" 31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/udat.h" 32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ucal.h" 33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "uprint.h" 35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint main(int argc, char **argv); 37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 38103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_NO_FORMATTING || UCONFIG_NO_CONVERSION 39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint main(int argc, char **argv) 41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 42103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius printf("%s: Sorry, UCONFIG_NO_FORMATTING or UCONFIG_NO_CONVERSION was turned on (see uconfig.h). No formatting can be done. \n", argv[0]); 43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return 0; 44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#else 46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* Protos */ 49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void usage(void); 50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void version(void); 51103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic void date(UDate when, const UChar *tz, UDateFormatStyle style, const char *format, UErrorCode *status); 52103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic UDate getWhen(const char *millis, const char *seconds, const char *format, UDateFormatStyle style, const char *parse, const UChar *tz, UErrorCode *status); 53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 54103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusUConverter *cnv = NULL; 55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* The version of date */ 57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define DATE_VERSION "1.0" 58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* "GMT" */ 60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const UChar GMT_ID [] = { 0x0047, 0x004d, 0x0054, 0x0000 }; 61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 62103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#define FORMAT_MILLIS "%" 63103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#define FORMAT_SECONDS "%%" 64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint 66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querumain(int argc, 67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru char **argv) 68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int printUsage = 0; 70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int printVersion = 0; 7154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int optInd = 1; 72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru char *arg; 73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const UChar *tz = 0; 74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UDateFormatStyle style = UDAT_DEFAULT; 75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 76103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const char *format = NULL; 77103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius char *parse = NULL; 78103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius char *seconds = NULL; 79103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius char *millis = NULL; 80103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UDate when; 81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* parse the options */ 8354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius for(optInd = 1; optInd < argc; ++optInd) { 8454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius arg = argv[optInd]; 85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* version info */ 87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(strcmp(arg, "-v") == 0 || strcmp(arg, "--version") == 0) { 88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru printVersion = 1; 89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* usage info */ 91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else if(strcmp(arg, "-h") == 0 || strcmp(arg, "--help") == 0) { 92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru printUsage = 1; 93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* display date in gmt */ 95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else if(strcmp(arg, "-u") == 0 || strcmp(arg, "--gmt") == 0) { 96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru tz = GMT_ID; 97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* display date in gmt */ 99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else if(strcmp(arg, "-f") == 0 || strcmp(arg, "--full") == 0) { 100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru style = UDAT_FULL; 101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* display date in long format */ 103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else if(strcmp(arg, "-l") == 0 || strcmp(arg, "--long") == 0) { 104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru style = UDAT_LONG; 105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* display date in medium format */ 107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else if(strcmp(arg, "-m") == 0 || strcmp(arg, "--medium") == 0) { 108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru style = UDAT_MEDIUM; 109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* display date in short format */ 111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else if(strcmp(arg, "-s") == 0 || strcmp(arg, "--short") == 0) { 112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru style = UDAT_SHORT; 113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else if(strcmp(arg, "-F") == 0 || strcmp(arg, "--format") == 0) { 11554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if ( optInd + 1 < argc ) { 11654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius optInd++; 11754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius format = argv[optInd]; 118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 119103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(strcmp(arg, "-r") == 0) { 12054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if ( optInd + 1 < argc ) { 12154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius optInd++; 12254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius seconds = argv[optInd]; 123103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 124103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(strcmp(arg, "-R") == 0) { 12554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if ( optInd + 1 < argc ) { 12654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius optInd++; 12754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius millis = argv[optInd]; 128103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 129103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(strcmp(arg, "-P") == 0) { 13054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if ( optInd + 1 < argc ) { 13154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius optInd++; 13254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius parse = argv[optInd]; 133103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* POSIX.1 says all arguments after -- are not options */ 136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else if(strcmp(arg, "--") == 0) { 137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* skip the -- */ 13854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius ++optInd; 139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* unrecognized option */ 142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else if(strncmp(arg, "-", strlen("-")) == 0) { 143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru printf("icudate: invalid option -- %s\n", arg+1); 144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru printUsage = 1; 145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* done with options, display date */ 147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else { 148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* print usage info */ 153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(printUsage) { 154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru usage(); 155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return 0; 156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* print version info */ 159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(printVersion) { 160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru version(); 161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return 0; 162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 164103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* get the 'when' (or now) */ 165103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius when = getWhen(millis, seconds, format, style, parse, tz, &status); 166103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(parse != NULL) { 167103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius format = FORMAT_MILLIS; /* output in millis */ 168103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 169103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* print the date */ 171103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius date(when, tz, style, format, &status); 172103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 173103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius ucnv_close(cnv); 174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_cleanup(); 176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return (U_FAILURE(status) ? 1 : 0); 177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* Usage information */ 180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void 181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruusage() 182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru puts("Usage: icudate [OPTIONS]"); 184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru puts("Options:"); 185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru puts(" -h, --help Print this message and exit."); 186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru puts(" -v, --version Print the version number of date and exit."); 187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru puts(" -u, --gmt Display the date in Greenwich Mean Time."); 188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru puts(" -f, --full Use full display format."); 189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru puts(" -l, --long Use long display format."); 190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru puts(" -m, --medium Use medium display format."); 191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru puts(" -s, --short Use short display format."); 192103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius puts(" -F <format>, --format <format> Use <format> as the display format."); 193103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius puts(" (Special formats: \"%\" alone is Millis since 1970, \"%%\" alone is Seconds since 1970)"); 194103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius puts(" -r <seconds> Use <seconds> as the time (Epoch 1970) rather than now."); 195103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius puts(" -R <millis> Use <millis> as the time (Epoch 1970) rather than now."); 196103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius puts(" -P <string> Parse <string> as the time, output in millis format."); 197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* Version information */ 200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void 201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruversion() 202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 20385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UErrorCode status = U_ZERO_ERROR; 20485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char *tzVer; 20585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int len = 256; 20685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UChar tzName[256]; 20785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho printf("icudate version %s, created by Stephen F. Booth.\n", 20885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho DATE_VERSION); 209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru puts(U_COPYRIGHT_STRING); 21085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tzVer = ucal_getTZDataVersion(&status); 21185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(U_FAILURE(status)) { 21285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tzVer = u_errorName(status); 21385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 21485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho printf("\n"); 21585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho printf("ICU Version: %s\n", U_ICU_VERSION); 21685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho printf("ICU Data (major+min): %s\n", U_ICUDATA_NAME); 21785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho printf("Default Locale: %s\n", uloc_getDefault()); 21885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho printf("Time Zone Data Version: %s\n", tzVer); 21985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho printf("Default Time Zone: "); 22085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho status = U_ZERO_ERROR; 22185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho u_init(&status); 22285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho len = ucal_getDefaultTimeZone(tzName, len, &status); 22385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(U_FAILURE(status)) { 224103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, " ** Error getting default zone: %s\n", u_errorName(status)); 22585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 22685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprint(tzName, stdout, &status); 22785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho printf("\n\n"); 228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 230103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic int32_t charsToUCharsDefault(UChar *uchars, int32_t ucharsSize, const char*chars, int32_t charsSize, UErrorCode *status) { 231103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t len=-1; 232103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_FAILURE(*status)) return len; 233103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(cnv==NULL) { 234103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius cnv = ucnv_open(NULL, status); 235103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 236103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(cnv&&U_SUCCESS(*status)) { 237103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius len = ucnv_toUChars(cnv, uchars, ucharsSize, chars,charsSize, status); 238103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 239103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return len; 240103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 241103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* Format the date */ 243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void 244103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusdate(UDate when, 245103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const UChar *tz, 246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UDateFormatStyle style, 247103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const char *format, 248103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UErrorCode *status ) 249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar *s = 0; 251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t len = 0; 252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UDateFormat *fmt; 253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar uFormat[100]; 254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 255103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_FAILURE(*status)) return; 256103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 257103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if( format != NULL ) { 258103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(!strcmp(format,FORMAT_MILLIS)) { 25954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius printf("%.0f\n", when); 260103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return; 261103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(!strcmp(format, FORMAT_SECONDS)) { 26254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius printf("%.3f\n", when/1000.0); 263103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return; 264103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 265103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 266103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fmt = udat_open(style, style, 0, tz, -1,NULL,0, status); 268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if ( format != NULL ) { 269103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius charsToUCharsDefault(uFormat,sizeof(uFormat)/sizeof(uFormat[0]),format,-1,status); 270103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius udat_applyPattern(fmt,FALSE,uFormat,-1); 271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 272103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius len = udat_format(fmt, when, 0, len, 0, status); 273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(*status == U_BUFFER_OVERFLOW_ERROR) { 274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *status = U_ZERO_ERROR; 275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru s = (UChar*) malloc(sizeof(UChar) * (len+1)); 276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(s == 0) goto finish; 277103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius udat_format(fmt, when, s, len + 1, 0, status); 278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 279103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_FAILURE(*status)) goto finish; 280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* print the date string */ 282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uprint(s, stdout, status); 283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* print a trailing newline */ 285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru printf("\n"); 286ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru finish: 288103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_FAILURE(*status)) { 289103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error in Print: %s\n", u_errorName(*status)); 290103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 291ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru udat_close(fmt); 292ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru free(s); 293ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 294103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 295103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic UDate getWhen(const char *millis, const char *seconds, const char *format, 296103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UDateFormatStyle style, const char *parse, const UChar *tz, UErrorCode *status) { 297103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UDateFormat *fmt = NULL; 298103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UChar uFormat[100]; 299103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UChar uParse[256]; 300103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UDate when=0; 301103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t parsepos = 0; 302103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 303103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(millis != NULL) { 304103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius sscanf(millis, "%lf", &when); 305103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return when; 306103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(seconds != NULL) { 307103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius sscanf(seconds, "%lf", &when); 308103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return when*1000.0; 309103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 310103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 311103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(parse!=NULL) { 312103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if( format != NULL ) { 313103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(!strcmp(format,FORMAT_MILLIS)) { 314103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius sscanf(parse, "%lf", &when); 315103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return when; 316103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(!strcmp(format, FORMAT_SECONDS)) { 317103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius sscanf(parse, "%lf", &when); 318103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return when*1000.0; 319103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 320103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 321103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 322103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fmt = udat_open(style, style, 0, tz, -1,NULL,0, status); 323103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if ( format != NULL ) { 324103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius charsToUCharsDefault(uFormat,sizeof(uFormat)/sizeof(uFormat[0]), format,-1,status); 325103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius udat_applyPattern(fmt,FALSE,uFormat,-1); 326103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 327103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 328103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius charsToUCharsDefault(uParse,sizeof(uParse)/sizeof(uParse[0]), parse,-1,status); 329103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius when = udat_parse(fmt, uParse, -1, &parsepos, status); 330103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_FAILURE(*status)) { 331103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error in Parse: %s\n", u_errorName(*status)); 33254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(parsepos > 0 && parsepos <= (int32_t)strlen(parse)) { 333103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "ERR>\"%s\" @%d\n" 334103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "ERR> %*s^\n", 335103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius parse,parsepos,parsepos,""); 336103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 337103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 338103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 339103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 340103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius udat_close(fmt); 341103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return when; 342103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 343103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return ucal_getNow(); 344103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 345103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 346103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 347ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif 348