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