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