• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 **********************************************************************
3 *   Copyright (C) 1998-2008, International Business Machines
4 *   Corporation and others.  All Rights Reserved.
5 **********************************************************************
6 *
7 * File date.c
8 *
9 * Modification History:
10 *
11 *   Date        Name        Description
12 *   06/11/99    stephen     Creation.
13 *   06/16/99    stephen     Modified to use uprint.
14 *******************************************************************************
15 */
16 
17 #include <stdlib.h>
18 #include <stdio.h>
19 #include <string.h>
20 
21 #include "unicode/utypes.h"
22 #include "unicode/ustring.h"
23 #include "unicode/uclean.h"
24 
25 #include "unicode/ucnv.h"
26 #include "unicode/udat.h"
27 #include "unicode/ucal.h"
28 
29 #include "uprint.h"
30 
31 int main(int argc, char **argv);
32 
33 #if UCONFIG_NO_FORMATTING
34 
main(int argc,char ** argv)35 int main(int argc, char **argv)
36 {
37   printf("%s: Sorry, UCONFIG_NO_FORMATTING was turned on (see uconfig.h). No formatting can be done. \n", argv[0]);
38   return 0;
39 }
40 #else
41 
42 
43 /* Protos */
44 static void usage(void);
45 static void version(void);
46 static void date(const UChar *tz, UDateFormatStyle style, char *format, UErrorCode *status);
47 
48 
49 /* The version of date */
50 #define DATE_VERSION "1.0"
51 
52 /* "GMT" */
53 static const UChar GMT_ID [] = { 0x0047, 0x004d, 0x0054, 0x0000 };
54 
55 
56 int
main(int argc,char ** argv)57 main(int argc,
58      char **argv)
59 {
60   int printUsage = 0;
61   int printVersion = 0;
62   int optind = 1;
63   char *arg;
64   const UChar *tz = 0;
65   UDateFormatStyle style = UDAT_DEFAULT;
66   UErrorCode status = U_ZERO_ERROR;
67   char *format = NULL;
68 
69 
70   /* parse the options */
71   for(optind = 1; optind < argc; ++optind) {
72     arg = argv[optind];
73 
74     /* version info */
75     if(strcmp(arg, "-v") == 0 || strcmp(arg, "--version") == 0) {
76       printVersion = 1;
77     }
78     /* usage info */
79     else if(strcmp(arg, "-h") == 0 || strcmp(arg, "--help") == 0) {
80       printUsage = 1;
81     }
82     /* display date in gmt */
83     else if(strcmp(arg, "-u") == 0 || strcmp(arg, "--gmt") == 0) {
84       tz = GMT_ID;
85     }
86     /* display date in gmt */
87     else if(strcmp(arg, "-f") == 0 || strcmp(arg, "--full") == 0) {
88       style = UDAT_FULL;
89     }
90     /* display date in long format */
91     else if(strcmp(arg, "-l") == 0 || strcmp(arg, "--long") == 0) {
92       style = UDAT_LONG;
93     }
94     /* display date in medium format */
95     else if(strcmp(arg, "-m") == 0 || strcmp(arg, "--medium") == 0) {
96       style = UDAT_MEDIUM;
97     }
98     /* display date in short format */
99     else if(strcmp(arg, "-s") == 0 || strcmp(arg, "--short") == 0) {
100       style = UDAT_SHORT;
101     }
102     else if(strcmp(arg, "-F") == 0 || strcmp(arg, "--format") == 0) {
103       if ( optind + 1 < argc ) {
104          optind++;
105          format = argv[optind];
106       }
107     }
108     /* POSIX.1 says all arguments after -- are not options */
109     else if(strcmp(arg, "--") == 0) {
110       /* skip the -- */
111       ++optind;
112       break;
113     }
114     /* unrecognized option */
115     else if(strncmp(arg, "-", strlen("-")) == 0) {
116       printf("icudate: invalid option -- %s\n", arg+1);
117       printUsage = 1;
118     }
119     /* done with options, display date */
120     else {
121       break;
122     }
123   }
124 
125   /* print usage info */
126   if(printUsage) {
127     usage();
128     return 0;
129   }
130 
131   /* print version info */
132   if(printVersion) {
133     version();
134     return 0;
135   }
136 
137   /* print the date */
138   date(tz, style, format, &status);
139 
140   u_cleanup();
141   return (U_FAILURE(status) ? 1 : 0);
142 }
143 
144 /* Usage information */
145 static void
usage()146 usage()
147 {
148   puts("Usage: icudate [OPTIONS]");
149   puts("Options:");
150   puts("  -h, --help        Print this message and exit.");
151   puts("  -v, --version     Print the version number of date and exit.");
152   puts("  -u, --gmt         Display the date in Greenwich Mean Time.");
153   puts("  -f, --full        Use full display format.");
154   puts("  -l, --long        Use long display format.");
155   puts("  -m, --medium      Use medium display format.");
156   puts("  -s, --short       Use short display format.");
157 }
158 
159 /* Version information */
160 static void
version()161 version()
162 {
163   UErrorCode status = U_ZERO_ERROR;
164   const char *tzVer;
165   int len = 256;
166   UChar tzName[256];
167   printf("icudate version %s, created by Stephen F. Booth.\n",
168 	 DATE_VERSION);
169   puts(U_COPYRIGHT_STRING);
170   tzVer = ucal_getTZDataVersion(&status);
171   if(U_FAILURE(status)) {
172       tzVer = u_errorName(status);
173   }
174   printf("\n");
175   printf("ICU Version:               %s\n", U_ICU_VERSION);
176   printf("ICU Data (major+min):      %s\n", U_ICUDATA_NAME);
177   printf("Default Locale:            %s\n", uloc_getDefault());
178   printf("Time Zone Data Version:    %s\n", tzVer);
179   printf("Default Time Zone:         ");
180   status = U_ZERO_ERROR;
181   u_init(&status);
182   len = ucal_getDefaultTimeZone(tzName, len, &status);
183   if(U_FAILURE(status)) {
184     printf(" ** Error getting default zone: %s\n", u_errorName(status));
185   }
186   uprint(tzName, stdout, &status);
187   printf("\n\n");
188 }
189 
190 /* Format the date */
191 static void
date(const UChar * tz,UDateFormatStyle style,char * format,UErrorCode * status)192 date(const UChar *tz,
193      UDateFormatStyle style,
194      char *format,
195      UErrorCode *status)
196 {
197   UChar *s = 0;
198   int32_t len = 0;
199   UDateFormat *fmt;
200   UChar uFormat[100];
201 
202   fmt = udat_open(style, style, 0, tz, -1,NULL,0, status);
203   if ( format != NULL ) {
204      u_charsToUChars(format,uFormat,strlen(format)),
205      udat_applyPattern(fmt,FALSE,uFormat,strlen(format));
206   }
207   len = udat_format(fmt, ucal_getNow(), 0, len, 0, status);
208   if(*status == U_BUFFER_OVERFLOW_ERROR) {
209     *status = U_ZERO_ERROR;
210     s = (UChar*) malloc(sizeof(UChar) * (len+1));
211     if(s == 0) goto finish;
212     udat_format(fmt, ucal_getNow(), s, len + 1, 0, status);
213     if(U_FAILURE(*status)) goto finish;
214   }
215 
216   /* print the date string */
217   uprint(s, stdout, status);
218 
219   /* print a trailing newline */
220   printf("\n");
221 
222  finish:
223   udat_close(fmt);
224   free(s);
225 }
226 #endif
227