1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru********************************************************************** 354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius* Copyright (C) 1998-2012, International Business Machines 4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Corporation and others. All Rights Reserved. 5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru********************************************************************** 6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* File date.c 8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Modification History: 10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Date Name Description 12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 06/11/99 stephen Creation. 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 06/16/99 stephen Modified to use uprint. 14103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius* 08/11/11 srl added Parse and milli/second in/out 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru******************************************************************************* 16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/ 17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdlib.h> 19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdio.h> 20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <string.h> 21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h" 23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ustring.h" 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/uclean.h" 25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ucnv.h" 27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/udat.h" 28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ucal.h" 29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "uprint.h" 31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint main(int argc, char **argv); 33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 34103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_NO_FORMATTING || UCONFIG_NO_CONVERSION 35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint main(int argc, char **argv) 37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 38103e9ffba2cba345d0078eb8b8db33249f81840aCraig 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]); 39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return 0; 40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#else 42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* Protos */ 45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void usage(void); 46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void version(void); 47103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic void date(UDate when, const UChar *tz, UDateFormatStyle style, const char *format, UErrorCode *status); 48103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic UDate getWhen(const char *millis, const char *seconds, const char *format, UDateFormatStyle style, const char *parse, const UChar *tz, UErrorCode *status); 49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 50103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusUConverter *cnv = NULL; 51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* The version of date */ 53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define DATE_VERSION "1.0" 54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* "GMT" */ 56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const UChar GMT_ID [] = { 0x0047, 0x004d, 0x0054, 0x0000 }; 57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 58103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#define FORMAT_MILLIS "%" 59103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#define FORMAT_SECONDS "%%" 60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint 62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querumain(int argc, 63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru char **argv) 64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int printUsage = 0; 66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int printVersion = 0; 6754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int optInd = 1; 68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru char *arg; 69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const UChar *tz = 0; 70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UDateFormatStyle style = UDAT_DEFAULT; 71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 72103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const char *format = NULL; 73103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius char *parse = NULL; 74103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius char *seconds = NULL; 75103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius char *millis = NULL; 76103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UDate when; 77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* parse the options */ 7954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius for(optInd = 1; optInd < argc; ++optInd) { 8054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius arg = argv[optInd]; 81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* version info */ 83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(strcmp(arg, "-v") == 0 || strcmp(arg, "--version") == 0) { 84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru printVersion = 1; 85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* usage info */ 87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else if(strcmp(arg, "-h") == 0 || strcmp(arg, "--help") == 0) { 88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru printUsage = 1; 89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* display date in gmt */ 91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else if(strcmp(arg, "-u") == 0 || strcmp(arg, "--gmt") == 0) { 92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru tz = GMT_ID; 93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* display date in gmt */ 95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else if(strcmp(arg, "-f") == 0 || strcmp(arg, "--full") == 0) { 96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru style = UDAT_FULL; 97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* display date in long format */ 99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else if(strcmp(arg, "-l") == 0 || strcmp(arg, "--long") == 0) { 100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru style = UDAT_LONG; 101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* display date in medium format */ 103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else if(strcmp(arg, "-m") == 0 || strcmp(arg, "--medium") == 0) { 104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru style = UDAT_MEDIUM; 105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* display date in short format */ 107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else if(strcmp(arg, "-s") == 0 || strcmp(arg, "--short") == 0) { 108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru style = UDAT_SHORT; 109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else if(strcmp(arg, "-F") == 0 || strcmp(arg, "--format") == 0) { 11154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if ( optInd + 1 < argc ) { 11254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius optInd++; 11354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius format = argv[optInd]; 114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 115103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(strcmp(arg, "-r") == 0) { 11654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if ( optInd + 1 < argc ) { 11754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius optInd++; 11854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius seconds = argv[optInd]; 119103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 120103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(strcmp(arg, "-R") == 0) { 12154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if ( optInd + 1 < argc ) { 12254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius optInd++; 12354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius millis = argv[optInd]; 124103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 125103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(strcmp(arg, "-P") == 0) { 12654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if ( optInd + 1 < argc ) { 12754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius optInd++; 12854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius parse = argv[optInd]; 129103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* POSIX.1 says all arguments after -- are not options */ 132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else if(strcmp(arg, "--") == 0) { 133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* skip the -- */ 13454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius ++optInd; 135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* unrecognized option */ 138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else if(strncmp(arg, "-", strlen("-")) == 0) { 139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru printf("icudate: invalid option -- %s\n", arg+1); 140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru printUsage = 1; 141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* done with options, display date */ 143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else { 144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* print usage info */ 149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(printUsage) { 150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru usage(); 151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return 0; 152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* print version info */ 155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(printVersion) { 156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru version(); 157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return 0; 158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 160103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* get the 'when' (or now) */ 161103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius when = getWhen(millis, seconds, format, style, parse, tz, &status); 162103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(parse != NULL) { 163103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius format = FORMAT_MILLIS; /* output in millis */ 164103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 165103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* print the date */ 167103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius date(when, tz, style, format, &status); 168103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 169103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius ucnv_close(cnv); 170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_cleanup(); 172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return (U_FAILURE(status) ? 1 : 0); 173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* Usage information */ 176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void 177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruusage() 178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru puts("Usage: icudate [OPTIONS]"); 180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru puts("Options:"); 181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru puts(" -h, --help Print this message and exit."); 182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru puts(" -v, --version Print the version number of date and exit."); 183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru puts(" -u, --gmt Display the date in Greenwich Mean Time."); 184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru puts(" -f, --full Use full display format."); 185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru puts(" -l, --long Use long display format."); 186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru puts(" -m, --medium Use medium display format."); 187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru puts(" -s, --short Use short display format."); 188103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius puts(" -F <format>, --format <format> Use <format> as the display format."); 189103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius puts(" (Special formats: \"%\" alone is Millis since 1970, \"%%\" alone is Seconds since 1970)"); 190103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius puts(" -r <seconds> Use <seconds> as the time (Epoch 1970) rather than now."); 191103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius puts(" -R <millis> Use <millis> as the time (Epoch 1970) rather than now."); 192103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius puts(" -P <string> Parse <string> as the time, output in millis format."); 193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* Version information */ 196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void 197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruversion() 198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 19985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UErrorCode status = U_ZERO_ERROR; 20085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char *tzVer; 20185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int len = 256; 20285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UChar tzName[256]; 20385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho printf("icudate version %s, created by Stephen F. Booth.\n", 20485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho DATE_VERSION); 205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru puts(U_COPYRIGHT_STRING); 20685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tzVer = ucal_getTZDataVersion(&status); 20785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(U_FAILURE(status)) { 20885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tzVer = u_errorName(status); 20985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 21085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho printf("\n"); 21185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho printf("ICU Version: %s\n", U_ICU_VERSION); 21285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho printf("ICU Data (major+min): %s\n", U_ICUDATA_NAME); 21385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho printf("Default Locale: %s\n", uloc_getDefault()); 21485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho printf("Time Zone Data Version: %s\n", tzVer); 21585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho printf("Default Time Zone: "); 21685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho status = U_ZERO_ERROR; 21785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho u_init(&status); 21885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho len = ucal_getDefaultTimeZone(tzName, len, &status); 21985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(U_FAILURE(status)) { 220103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, " ** Error getting default zone: %s\n", u_errorName(status)); 22185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 22285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprint(tzName, stdout, &status); 22385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho printf("\n\n"); 224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 226103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic int32_t charsToUCharsDefault(UChar *uchars, int32_t ucharsSize, const char*chars, int32_t charsSize, UErrorCode *status) { 227103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t len=-1; 228103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_FAILURE(*status)) return len; 229103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(cnv==NULL) { 230103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius cnv = ucnv_open(NULL, status); 231103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 232103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(cnv&&U_SUCCESS(*status)) { 233103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius len = ucnv_toUChars(cnv, uchars, ucharsSize, chars,charsSize, status); 234103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 235103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return len; 236103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 237103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* Format the date */ 239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void 240103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusdate(UDate when, 241103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const UChar *tz, 242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UDateFormatStyle style, 243103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const char *format, 244103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UErrorCode *status ) 245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar *s = 0; 247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t len = 0; 248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UDateFormat *fmt; 249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar uFormat[100]; 250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 251103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_FAILURE(*status)) return; 252103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 253103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if( format != NULL ) { 254103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(!strcmp(format,FORMAT_MILLIS)) { 25554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius printf("%.0f\n", when); 256103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return; 257103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(!strcmp(format, FORMAT_SECONDS)) { 25854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius printf("%.3f\n", when/1000.0); 259103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return; 260103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 261103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 262103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fmt = udat_open(style, style, 0, tz, -1,NULL,0, status); 264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if ( format != NULL ) { 265103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius charsToUCharsDefault(uFormat,sizeof(uFormat)/sizeof(uFormat[0]),format,-1,status); 266103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius udat_applyPattern(fmt,FALSE,uFormat,-1); 267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 268103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius len = udat_format(fmt, when, 0, len, 0, status); 269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(*status == U_BUFFER_OVERFLOW_ERROR) { 270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *status = U_ZERO_ERROR; 271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru s = (UChar*) malloc(sizeof(UChar) * (len+1)); 272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(s == 0) goto finish; 273103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius udat_format(fmt, when, s, len + 1, 0, status); 274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 275103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_FAILURE(*status)) goto finish; 276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* print the date string */ 278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uprint(s, stdout, status); 279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* print a trailing newline */ 281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru printf("\n"); 282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru finish: 284103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_FAILURE(*status)) { 285103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error in Print: %s\n", u_errorName(*status)); 286103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru udat_close(fmt); 288ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru free(s); 289ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 290103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 291103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic UDate getWhen(const char *millis, const char *seconds, const char *format, 292103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UDateFormatStyle style, const char *parse, const UChar *tz, UErrorCode *status) { 293103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UDateFormat *fmt = NULL; 294103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UChar uFormat[100]; 295103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UChar uParse[256]; 296103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UDate when=0; 297103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t parsepos = 0; 298103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 299103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(millis != NULL) { 300103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius sscanf(millis, "%lf", &when); 301103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return when; 302103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(seconds != NULL) { 303103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius sscanf(seconds, "%lf", &when); 304103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return when*1000.0; 305103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 306103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 307103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(parse!=NULL) { 308103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if( format != NULL ) { 309103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(!strcmp(format,FORMAT_MILLIS)) { 310103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius sscanf(parse, "%lf", &when); 311103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return when; 312103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(!strcmp(format, FORMAT_SECONDS)) { 313103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius sscanf(parse, "%lf", &when); 314103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return when*1000.0; 315103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 316103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 317103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 318103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fmt = udat_open(style, style, 0, tz, -1,NULL,0, status); 319103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if ( format != NULL ) { 320103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius charsToUCharsDefault(uFormat,sizeof(uFormat)/sizeof(uFormat[0]), format,-1,status); 321103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius udat_applyPattern(fmt,FALSE,uFormat,-1); 322103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 323103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 324103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius charsToUCharsDefault(uParse,sizeof(uParse)/sizeof(uParse[0]), parse,-1,status); 325103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius when = udat_parse(fmt, uParse, -1, &parsepos, status); 326103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_FAILURE(*status)) { 327103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "Error in Parse: %s\n", u_errorName(*status)); 32854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(parsepos > 0 && parsepos <= (int32_t)strlen(parse)) { 329103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "ERR>\"%s\" @%d\n" 330103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "ERR> %*s^\n", 331103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius parse,parsepos,parsepos,""); 332103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 333103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 334103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 335103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 336103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius udat_close(fmt); 337103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return when; 338103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 339103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return ucal_getNow(); 340103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 341103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 342103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 343ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif 344