icu4r_19 1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +87 -0
- data/MIT-LICENSE +20 -0
- data/README +156 -0
- data/Rakefile +32 -0
- data/calendar.c +636 -0
- data/collator.c +233 -0
- data/converter.c +322 -0
- data/docs/FORMATTING +131 -0
- data/docs/UNICODE_REGEXPS +204 -0
- data/extconf.rb +17 -0
- data/fmt.cpp +156 -0
- data/icu4r.c +18 -0
- data/icu_common.h +45 -0
- data/lib/dummy +0 -0
- data/samples/demo_each.rb +23 -0
- data/samples/demo_locales.rb +16 -0
- data/samples/demo_regexp.rb +11 -0
- data/samples/resbundle/appmsg/root.res +0 -0
- data/samples/resbundle/appmsg/ru.res +0 -0
- data/samples/resbundle/demo_bundle.rb +4 -0
- data/samples/resbundle/mkres.sh +4 -0
- data/samples/resbundle/root.txt +10 -0
- data/samples/resbundle/ru.txt +4 -0
- data/test/test_calendar.rb +123 -0
- data/test/test_collator.rb +33 -0
- data/test/test_converter.rb +72 -0
- data/test/test_ustring.rb +508 -0
- data/tools/doc.sh +2 -0
- data/tools/km.rb +425 -0
- data/ubundle.c +223 -0
- data/ucore_ext.c +168 -0
- data/uregex.c +697 -0
- data/uregex.h +27 -0
- data/ustring.c +3039 -0
- metadata +164 -0
data/ChangeLog
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
25-May-2006
|
2
|
+
* ustring.c: preventing memory leaks when exception is thrown from block in UString#each_* methods
|
3
|
+
|
4
|
+
* fmt.cpp: preventing memory leaks when message can't be formatted (UString#fmt) or date parsed
|
5
|
+
|
6
|
+
20-May-2006
|
7
|
+
* collator.c: a little docs added
|
8
|
+
|
9
|
+
* ustring.c, uregex.c: fixes in split(), UString#[regexp, index] now allows negative indices
|
10
|
+
|
11
|
+
* test/test_ustring.rb: more tests
|
12
|
+
|
13
|
+
27-Apr-2006
|
14
|
+
* collator.c: added UCollator class
|
15
|
+
|
16
|
+
* converter.c: added UConverter class
|
17
|
+
|
18
|
+
24-Apr-2006
|
19
|
+
* UString: added eql? method (fixes usage of UString as Hash key); fixed sentinel bug in normalize
|
20
|
+
|
21
|
+
* test/test_calendar: removing some dependencies from ICU content and user locale in test_default and test_time_zones (by report of Daigo Moriwaki)
|
22
|
+
|
23
|
+
02-Feb-2006
|
24
|
+
* UString: moved parse_date to UCalendar.parse
|
25
|
+
|
26
|
+
* UResourceBundle: aref can accept additional parameter and return actual locale
|
27
|
+
|
28
|
+
* UCalendar: simplified formmating options
|
29
|
+
|
30
|
+
26-Jan-2006
|
31
|
+
* UString: sub, gsub, scan, each_* now set "busy" flag before calling block, thus preventing scanned string to be modfied inside block
|
32
|
+
|
33
|
+
* ustring.c: fixed? bug with sentinels, also Array#to_u, and fixed again
|
34
|
+
|
35
|
+
25-Jan-2006
|
36
|
+
* UString: addde foldcase method
|
37
|
+
|
38
|
+
* UString: added char_span(start,[len, locale]) method.
|
39
|
+
|
40
|
+
* ustring.c: fixed bug with incorrect sentinel set in splice_units
|
41
|
+
|
42
|
+
24-Jan-2006:
|
43
|
+
* split source code to: uregex.c, ubundle.c, ucore_ext.c
|
44
|
+
|
45
|
+
* changed main lib name: icu4r.c
|
46
|
+
|
47
|
+
23-Jan-2006:
|
48
|
+
* UCalendar: added <, ==, >, clone, equal? methods
|
49
|
+
|
50
|
+
* UResourceBundle: throw an exception on clone
|
51
|
+
|
52
|
+
22-Jan-2006
|
53
|
+
* added tests for UCalendar
|
54
|
+
|
55
|
+
* calendar.c: UCalendar services added
|
56
|
+
|
57
|
+
21-Jan-2006
|
58
|
+
* UString#to_s: removed NFC before conversion
|
59
|
+
|
60
|
+
* fmt.cpp: extern problem bugfix(?)
|
61
|
+
|
62
|
+
20-Jan-2006:
|
63
|
+
* UString: strictly sticking with code unit ranges, cleanup
|
64
|
+
|
65
|
+
* Array#to_u: replace invalid chars with U+FFFD
|
66
|
+
|
67
|
+
19-Jan-2006
|
68
|
+
* UString#chars: added NFC before split
|
69
|
+
|
70
|
+
* UString#to_s: added NFC before conversion
|
71
|
+
|
72
|
+
* UString#normalize: added quick checks before normalization
|
73
|
+
|
74
|
+
* UString#split: removed split(//) support
|
75
|
+
|
76
|
+
* UString: fixed bugs with ranges: slice, conv_unit_range, conv_point_range
|
77
|
+
|
78
|
+
* UString: added unescape method
|
79
|
+
|
80
|
+
* UString: cleanup initializations - now uniform icu_ustr_alloc_and_wrap
|
81
|
+
|
82
|
+
* UString#sub!: now calls gsub
|
83
|
+
|
84
|
+
* UResourceBundle: added open_direct
|
85
|
+
|
86
|
+
18-Jan-2006
|
87
|
+
* initial release 0.1.0
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2006 Nikolai Lugovoi
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README
ADDED
@@ -0,0 +1,156 @@
|
|
1
|
+
== ICU4R - ICU Unicode bindings for Ruby
|
2
|
+
|
3
|
+
ICU4R is an attempt to provide better Unicode support for Ruby,
|
4
|
+
where it lacks for a long time.
|
5
|
+
|
6
|
+
Current code is mostly rewritten string.c from Ruby 1.8.3.
|
7
|
+
|
8
|
+
ICU4R is Ruby C-extension binding for ICU library[1]
|
9
|
+
and provides following classes and functionality:
|
10
|
+
|
11
|
+
* UString:
|
12
|
+
- String-like class with internal UTF16 storage;
|
13
|
+
- UCA rules for UString comparisons (<=>, casecmp);
|
14
|
+
- encoding(codepage) conversion;
|
15
|
+
- Unicode normalization;
|
16
|
+
- transliteration, also rule-based;
|
17
|
+
|
18
|
+
Bunch of locale-sensitive functions:
|
19
|
+
- upcase/downcase;
|
20
|
+
- string collation;
|
21
|
+
- string search;
|
22
|
+
- iterators over text line/word/char/sentence breaks;
|
23
|
+
- message formatting (number/currency/string/time);
|
24
|
+
- date and number parsing.
|
25
|
+
|
26
|
+
* URegexp - unicode regular expressions.
|
27
|
+
|
28
|
+
* UResourceBundle - access to resource bundles, including ICU locale data.
|
29
|
+
|
30
|
+
* UCalendar - date manipulation and timezone info.
|
31
|
+
|
32
|
+
* UConverter - codepage conversions API
|
33
|
+
|
34
|
+
* UCollator - locale-sensitive string comparison
|
35
|
+
|
36
|
+
== Install and usage
|
37
|
+
|
38
|
+
> ruby extconf.rb
|
39
|
+
> make && make check
|
40
|
+
> make install
|
41
|
+
|
42
|
+
Now, in your scripts just require 'icu4r'.
|
43
|
+
|
44
|
+
To create RDoc, run
|
45
|
+
> sh tools/doc.sh
|
46
|
+
|
47
|
+
== Requirements
|
48
|
+
|
49
|
+
To build and use ICU4R you will need GCC and ICU v3.4 libraries[2].
|
50
|
+
|
51
|
+
== Differences from Ruby String and Regexp classes
|
52
|
+
|
53
|
+
=== UString vs String
|
54
|
+
|
55
|
+
1. UString substring/index methods use UTF16 codeunit indexes, not code points.
|
56
|
+
|
57
|
+
2. UString supports most methods from String class. Missing methods are:
|
58
|
+
capitalize, capitalize!, swapcase, swapcase!
|
59
|
+
%, center, ljust, rjust
|
60
|
+
chomp, chomp!, chop, chop!
|
61
|
+
count, delete, delete!, squeeze, squeeze!, tr, tr!, tr_s, tr_s!
|
62
|
+
crypt, intern, sum, unpack
|
63
|
+
dump, each_byte, each_line
|
64
|
+
hex, oct, to_i, to_sym
|
65
|
+
reverse, reverse!
|
66
|
+
succ, succ!, next, next!, upto
|
67
|
+
|
68
|
+
3. Instead of String#% method, UString#format is provided. See FORMATTING for short reference.
|
69
|
+
|
70
|
+
4. UStrings can be created via String.to_u(encoding='utf8') or global u(str,[encoding='utf8'])
|
71
|
+
calls. Note that +encoding+ parameter must be value of String class.
|
72
|
+
|
73
|
+
5. There's difference between character grapheme, codepoint and codeunit. See UNICODE reports for
|
74
|
+
gory details, but in short: locale dependent notion of character can be presented using
|
75
|
+
more than one codepoint - base letter and combining (accents) (also possible more than one!), and
|
76
|
+
each codepoint can require more than one codeunit to store (for UTF8 codeunit size is 8bit, though
|
77
|
+
some codepoints require up to 4bytes). So, UString has normalization and locale dependent break
|
78
|
+
iterators.
|
79
|
+
|
80
|
+
6. Currently UString doesn't include Enumerable module.
|
81
|
+
|
82
|
+
7. UString index/[] methods which accept URegexp, throw exception if Regexp passed.
|
83
|
+
|
84
|
+
8. UString#<=>, UString#casecmp use UCA rules.
|
85
|
+
|
86
|
+
=== URegexp
|
87
|
+
|
88
|
+
UString uses ICU regexp library. Pattern syntax is described in [./docs/UNICODE_REGEXPS] and ICU docs.
|
89
|
+
|
90
|
+
There are some differences between processing in Ruby Regexp and URegexp:
|
91
|
+
|
92
|
+
1. When UString#sub, UString#gsub are called with block, special vars ($~, $&, $1, ...) aren't
|
93
|
+
set, as their values are processed through deep ruby core code. Instead, block receives UMatch object,
|
94
|
+
which is essentially immutable array of matching groups:
|
95
|
+
"test".u.gsub(ure("(e)(.)")) do |match|
|
96
|
+
puts match[0] # => 'es' <--> $&
|
97
|
+
puts match[1] # => 'e' <--> $1
|
98
|
+
puts match[2] # => 's' <--> $2
|
99
|
+
end
|
100
|
+
|
101
|
+
2. In URegexp search pattern backreferences are in form \n (\1, \2, ...),
|
102
|
+
in replacement string - in form $1, $2, ...
|
103
|
+
|
104
|
+
NOTE: URegexp considers char to be a digit NOT ONLY ASCII (0x0030-0x0039), but
|
105
|
+
any Unicode char, which has property Decimal digit number (Nd), e.g.:
|
106
|
+
a = [?$, 0x1D7D9].pack("U*").u * 2
|
107
|
+
puts a.inspect_names
|
108
|
+
<U000024>DOLLAR SIGN
|
109
|
+
<U01D7D9>MATHEMATICAL DOUBLE-STRUCK DIGIT ONE
|
110
|
+
<U000024>DOLLAR SIGN
|
111
|
+
<U01D7D9>MATHEMATICAL DOUBLE-STRUCK DIGIT ONE
|
112
|
+
puts "abracadabra".u.gsub(/(b)/.U, a)
|
113
|
+
abbracadabbra
|
114
|
+
|
115
|
+
|
116
|
+
3. One can create URegexp using global Kernel#ure function, Regexp#U, Regexp#to_u, or
|
117
|
+
from UString using URegexp.new, e.g:
|
118
|
+
/pattern/.U =~ "string".u
|
119
|
+
|
120
|
+
4. There are differences about Regexp and URegexp multiline matching options:
|
121
|
+
t = "text\ntest"
|
122
|
+
# ^,$ handling : URegexp multiline <-> Ruby default
|
123
|
+
t.u =~ ure('^\w+$', URegexp::MULTILINE)
|
124
|
+
=> #<UMatch:0xf6f7de04 @ranges=[0..3], @cg=[\u0074\u0065\u0078\u0074]>
|
125
|
+
t =~ /^\w+$/
|
126
|
+
=> 0
|
127
|
+
# . matches \n : URegexp DOTALL <-> /m
|
128
|
+
t.u =~ ure('.+test', URegexp::DOTALL)
|
129
|
+
=> #<UMatch:0xf6fa4d88 ...
|
130
|
+
t.u =~ /.+test/m
|
131
|
+
|
132
|
+
5. UMatch.range(idx) returns range for capturing group idx. This range is in codeunits.
|
133
|
+
|
134
|
+
=== References
|
135
|
+
|
136
|
+
1. ICU Official Homepage http://ibm.com/software/globalization/icu/
|
137
|
+
2. ICU downloads http://ibm.com/software/globalization/icu/downloads.jsp
|
138
|
+
3. ICU Home Page http://icu.sf.net
|
139
|
+
4. Unicode Home Page http://www.unicode.org
|
140
|
+
|
141
|
+
==== BUGS, DOCS, TO DO
|
142
|
+
|
143
|
+
The code is slow and inefficient yet, is still highly experimental,
|
144
|
+
so can have many security and memory leaks, bugs, inconsistent
|
145
|
+
documentation, incomplete test suite. Use it at your own risk.
|
146
|
+
|
147
|
+
Bug reports and feature requests are welcome :)
|
148
|
+
|
149
|
+
=== Copying
|
150
|
+
|
151
|
+
This extension module is copyrighted free software by Nikolai Lugovoi.
|
152
|
+
|
153
|
+
You can redistribute it and/or modify it under the terms of MIT License.
|
154
|
+
|
155
|
+
Nikolai Lugovoi <meadow.nnick@gmail.com>
|
156
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'rake/gempackagetask'
|
2
|
+
spec = Gem::Specification.new do |s|
|
3
|
+
s.authors = [ "Nikolai Lugovoi", "Perry Smith" ]
|
4
|
+
s.description = File.read(File.join(File.dirname(__FILE__), 'README'))
|
5
|
+
s.email = "pedz@easesoftware.com"
|
6
|
+
s.extensions = [ 'extconf.rb' ]
|
7
|
+
s.extra_rdoc_files = [
|
8
|
+
'README',
|
9
|
+
'docs/FORMATTING',
|
10
|
+
'docs/UNICODE_REGEXPS',
|
11
|
+
'MIT-LICENSE',
|
12
|
+
'calendar.c',
|
13
|
+
'collator.c',
|
14
|
+
'converter.c',
|
15
|
+
'icu4r.c',
|
16
|
+
'ubundle.c',
|
17
|
+
'ucore_ext.c',
|
18
|
+
'uregex.c',
|
19
|
+
'ustring.c'
|
20
|
+
]
|
21
|
+
s.files = Dir['**/**']
|
22
|
+
s.has_rdoc = true
|
23
|
+
s.homepage = "https://github.com/pedz/icu4r_19"
|
24
|
+
s.name = "icu4r_19"
|
25
|
+
s.platform = Gem::Platform::RUBY
|
26
|
+
s.rdoc_options = [ '-c', 'utf-8', '-x', 'dummy' ]
|
27
|
+
s.required_ruby_version = '>=1.9'
|
28
|
+
s.requirements = [ 'ICU libraries v 4.6.1' ]
|
29
|
+
s.summary = "Ruby extension for Unicode support using ICU - 1.9.2 compatible"
|
30
|
+
s.version = "1.0"
|
31
|
+
end
|
32
|
+
Rake::GemPackageTask.new(spec).define
|
data/calendar.c
ADDED
@@ -0,0 +1,636 @@
|
|
1
|
+
#include <unicode/ucal.h>
|
2
|
+
#include <unicode/uenum.h>
|
3
|
+
#include <unicode/udat.h>
|
4
|
+
#include "icu_common.h"
|
5
|
+
extern VALUE rb_cUString;
|
6
|
+
extern VALUE icu_ustr_new(UChar * ptr, long len);
|
7
|
+
extern VALUE icu_ustr_new_set(UChar * ptr, long len, long capa);
|
8
|
+
static VALUE s_calendar_fields, s_calendar_formats;
|
9
|
+
extern VALUE rb_cUCalendar;
|
10
|
+
#define UCALENDAR(obj) ((UCalendar *)DATA_PTR(obj))
|
11
|
+
/**
|
12
|
+
* Document-class: UCalendar
|
13
|
+
*
|
14
|
+
* The UCalendar class provides methods for converting between a specific instant in
|
15
|
+
* time and a set of calendar fields such as YEAR, MONTH, DAY_OF_MONTH, HOUR, and so on,
|
16
|
+
* and for manipulating the calendar fields, such as getting the date of the next week.
|
17
|
+
* An instant in time can be represented by a millisecond value that is an offset from the
|
18
|
+
* Epoch, January 1, 1970 00:00:00.000 GMT (Gregorian).
|
19
|
+
*
|
20
|
+
* Also timezone info and methods are provided.
|
21
|
+
*
|
22
|
+
* NOTE: months are zero-based.
|
23
|
+
*/
|
24
|
+
|
25
|
+
/**
|
26
|
+
* call-seq:
|
27
|
+
* UCalendar.time_zones
|
28
|
+
*
|
29
|
+
* Returns array with all time zones (as UString values).
|
30
|
+
*/
|
31
|
+
VALUE icu4r_cal_all_tz (VALUE obj)
|
32
|
+
{
|
33
|
+
UErrorCode status = U_ZERO_ERROR;
|
34
|
+
UEnumeration * zones ;
|
35
|
+
VALUE ret ;
|
36
|
+
UChar * name;
|
37
|
+
int32_t len;
|
38
|
+
zones = ucal_openTimeZones (&status);
|
39
|
+
ICU_RAISE(status);
|
40
|
+
ret = rb_ary_new();
|
41
|
+
while( (name = (UChar*)uenum_unext(zones, &len, &status))) {
|
42
|
+
rb_ary_push(ret, icu_ustr_new(name, len));
|
43
|
+
}
|
44
|
+
uenum_close(zones);
|
45
|
+
return ret;
|
46
|
+
}
|
47
|
+
|
48
|
+
|
49
|
+
/**
|
50
|
+
* call-seq:
|
51
|
+
* UCalendar.tz_for_country(country)
|
52
|
+
*
|
53
|
+
* Returns array with all time zones associated with the given country.
|
54
|
+
* Note: <code>country</code> must be value of type String.
|
55
|
+
* Returned array content is UString's
|
56
|
+
*
|
57
|
+
* UCalendar.tz_for_country("GB") # => [ "Europe/Belfast", "Europe/London", "GB", "GB-Eire"]
|
58
|
+
*
|
59
|
+
*/
|
60
|
+
VALUE icu4r_cal_country_tz (VALUE obj, VALUE ctry)
|
61
|
+
{
|
62
|
+
UErrorCode status = U_ZERO_ERROR;
|
63
|
+
UEnumeration * zones ;
|
64
|
+
VALUE ret ;
|
65
|
+
UChar * name;
|
66
|
+
int32_t len;
|
67
|
+
Check_Type(ctry, T_STRING);
|
68
|
+
zones = ucal_openCountryTimeZones (RSTRING_PTR(ctry), &status) ;
|
69
|
+
ICU_RAISE(status);
|
70
|
+
ret = rb_ary_new();
|
71
|
+
while( (name = (UChar*)uenum_unext(zones, &len, &status))) {
|
72
|
+
rb_ary_push(ret, icu_ustr_new(name, len));
|
73
|
+
}
|
74
|
+
uenum_close(zones);
|
75
|
+
return ret;
|
76
|
+
}
|
77
|
+
|
78
|
+
/**
|
79
|
+
* call-seq:
|
80
|
+
* UCalendar.default_tz => ustring
|
81
|
+
*
|
82
|
+
* Returns the default time zone name as UString.
|
83
|
+
*
|
84
|
+
* UCalendar.default_tz # "EET"
|
85
|
+
*
|
86
|
+
*/
|
87
|
+
VALUE icu4r_cal_get_default_tz(VALUE obj)
|
88
|
+
{
|
89
|
+
UErrorCode status = U_ZERO_ERROR;
|
90
|
+
UChar * buf ;
|
91
|
+
long capa = 0;
|
92
|
+
capa = ucal_getDefaultTimeZone (buf, capa, &status);
|
93
|
+
if( U_BUFFER_OVERFLOW_ERROR == status) {
|
94
|
+
buf = ALLOC_N(UChar, capa+1);
|
95
|
+
status = U_ZERO_ERROR;
|
96
|
+
capa = ucal_getDefaultTimeZone (buf, capa, &status);
|
97
|
+
return icu_ustr_new_set(buf, capa, capa+1);
|
98
|
+
}
|
99
|
+
ICU_RAISE(status);
|
100
|
+
return Qnil;
|
101
|
+
}
|
102
|
+
|
103
|
+
/**
|
104
|
+
* call-seq:
|
105
|
+
* UCalendar.default_tz = ustring
|
106
|
+
*
|
107
|
+
* Set the default time zone.
|
108
|
+
*
|
109
|
+
* UCalendar.default_tz="GMT+00".u
|
110
|
+
* UCalendar.default_tz="Europe/Paris".u
|
111
|
+
*/
|
112
|
+
VALUE icu4r_cal_set_default_tz(VALUE obj, VALUE tz)
|
113
|
+
{
|
114
|
+
UErrorCode status = U_ZERO_ERROR;
|
115
|
+
Check_Class(tz, rb_cUString);
|
116
|
+
ucal_setDefaultTimeZone (ICU_PTR(tz), &status);
|
117
|
+
ICU_RAISE(status);
|
118
|
+
return tz;
|
119
|
+
}
|
120
|
+
/**
|
121
|
+
* call-seq:
|
122
|
+
* UCalendar.dst_savings(zone_id)
|
123
|
+
*
|
124
|
+
* Return the amount of time in milliseconds that the clock is advanced
|
125
|
+
* during daylight savings time for the given time zone, or zero if the time
|
126
|
+
* zone does not observe daylight savings time.
|
127
|
+
*
|
128
|
+
* UCalendar.dst_savings("GMT+00".u) # => 3600000
|
129
|
+
*
|
130
|
+
*/
|
131
|
+
VALUE icu4r_cal_dst_savings(VALUE obj, VALUE zone)
|
132
|
+
{
|
133
|
+
UErrorCode status = U_ZERO_ERROR;
|
134
|
+
int32_t dst;
|
135
|
+
Check_Class(zone, rb_cUString);
|
136
|
+
dst = ucal_getDSTSavings (ICU_PTR(zone), &status);
|
137
|
+
ICU_RAISE(status);
|
138
|
+
return INT2FIX(dst);
|
139
|
+
}
|
140
|
+
|
141
|
+
/**
|
142
|
+
* call-seq:
|
143
|
+
* UCalendar.now
|
144
|
+
*
|
145
|
+
* Get the current date and time. in millis
|
146
|
+
*
|
147
|
+
* UCalendar.now # => 1137934561000.0
|
148
|
+
*
|
149
|
+
*/
|
150
|
+
VALUE icu4r_cal_now(VALUE obj){
|
151
|
+
return rb_float_new(ucal_getNow());
|
152
|
+
}
|
153
|
+
//-----------------
|
154
|
+
|
155
|
+
void icu4r_cal_free(UCalendar * cal){
|
156
|
+
ucal_close(cal);
|
157
|
+
}
|
158
|
+
static VALUE icu4r_cal_alloc(VALUE klass)
|
159
|
+
{
|
160
|
+
return Data_Wrap_Struct(klass, 0, icu4r_cal_free, 0);
|
161
|
+
}
|
162
|
+
/**
|
163
|
+
* call-seq:
|
164
|
+
* UCalendar.new(zone_id = nil, locale = nil, traditional = false)
|
165
|
+
*
|
166
|
+
* Creates new instance of UCalendar, for given time zone id (UString),
|
167
|
+
* locale (Ruby String), and kind , by default gregorian.
|
168
|
+
* New instance has current time.
|
169
|
+
*
|
170
|
+
*/
|
171
|
+
VALUE icu4r_cal_init (int argc, VALUE * argv, VALUE self)
|
172
|
+
{
|
173
|
+
VALUE zone, loc, cal_type;
|
174
|
+
UChar * zone_id = NULL;
|
175
|
+
char * locale = NULL;
|
176
|
+
UCalendarType c_type = UCAL_GREGORIAN;
|
177
|
+
int32_t n, zone_len =0 , locale_len =0;
|
178
|
+
UCalendar * calendar;
|
179
|
+
UErrorCode status = U_ZERO_ERROR;
|
180
|
+
n = rb_scan_args(argc, argv, "03", &zone, &loc, &cal_type);
|
181
|
+
if( n >= 1) {
|
182
|
+
Check_Class(zone, rb_cUString);
|
183
|
+
zone_id = ICU_PTR(zone);
|
184
|
+
zone_len = ICU_LEN(zone);
|
185
|
+
}
|
186
|
+
if( n >= 2) {
|
187
|
+
Check_Type(loc, T_STRING);
|
188
|
+
locale = RSTRING_PTR(loc);
|
189
|
+
locale_len = RSTRING_LEN(loc);
|
190
|
+
}
|
191
|
+
if( n >= 3) {
|
192
|
+
if( Qtrue == cal_type ) {
|
193
|
+
c_type = UCAL_TRADITIONAL;
|
194
|
+
}
|
195
|
+
}
|
196
|
+
calendar = ucal_open(zone_id, zone_len, locale, c_type, &status);
|
197
|
+
ICU_RAISE(status);
|
198
|
+
DATA_PTR(self) = calendar;
|
199
|
+
return self;
|
200
|
+
}
|
201
|
+
|
202
|
+
int icu4r_get_cal_field_int(VALUE field)
|
203
|
+
{
|
204
|
+
VALUE field_const;
|
205
|
+
field_const = rb_hash_aref(s_calendar_fields, field);
|
206
|
+
if(field_const == Qnil)
|
207
|
+
rb_raise(rb_eArgError, "no such field %s", RSTRING_PTR(rb_obj_as_string(field)));
|
208
|
+
return NUM2INT(field_const);
|
209
|
+
}
|
210
|
+
|
211
|
+
/**
|
212
|
+
* call-seq:
|
213
|
+
* calendar.add(field, int_amount)
|
214
|
+
*
|
215
|
+
* Add a specified signed amount to a particular field in a UCalendar.
|
216
|
+
*
|
217
|
+
* c.add(:week_of_year, 2)
|
218
|
+
*/
|
219
|
+
VALUE icu4r_cal_add(VALUE obj, VALUE field, VALUE amount)
|
220
|
+
{
|
221
|
+
UErrorCode status = U_ZERO_ERROR;
|
222
|
+
int date_field;
|
223
|
+
Check_Type(field, T_SYMBOL);
|
224
|
+
Check_Type(amount, T_FIXNUM);
|
225
|
+
date_field = icu4r_get_cal_field_int(field);
|
226
|
+
ucal_add(UCALENDAR(obj), date_field, FIX2INT(amount) , &status);
|
227
|
+
ICU_RAISE(status);
|
228
|
+
return Qnil;
|
229
|
+
}
|
230
|
+
|
231
|
+
/**
|
232
|
+
* call-seq:
|
233
|
+
* calendar.roll(field, int_amount)
|
234
|
+
*
|
235
|
+
* Adds a signed amount to the specified calendar field without changing larger fields.
|
236
|
+
* A negative roll amount means to subtract from field without changing larger fields.
|
237
|
+
* If the specified amount is 0, this method performs nothing.
|
238
|
+
*
|
239
|
+
* Example: Consider a GregorianCalendar originally set to August 31, 1999. Calling roll(:month, 8)
|
240
|
+
* sets the calendar to April 30, 1999. Using a Gregorian Calendar, the :day_of_month field cannot
|
241
|
+
* be 31 in the month April. :day_of_month is set to the closest possible value, 30. The :year field
|
242
|
+
* maintains the value of 1999 because it is a larger field than :month.
|
243
|
+
*/
|
244
|
+
VALUE icu4r_cal_roll(VALUE obj, VALUE field, VALUE amount)
|
245
|
+
{
|
246
|
+
UErrorCode status = U_ZERO_ERROR;
|
247
|
+
int date_field;
|
248
|
+
Check_Type(field, T_SYMBOL);
|
249
|
+
Check_Type(amount, T_FIXNUM);
|
250
|
+
date_field = icu4r_get_cal_field_int(field);
|
251
|
+
ucal_roll(UCALENDAR(obj), date_field, FIX2INT(amount) , &status);
|
252
|
+
ICU_RAISE(status);
|
253
|
+
return Qnil;
|
254
|
+
}
|
255
|
+
/**
|
256
|
+
* call-seq:
|
257
|
+
* calendar[field]
|
258
|
+
*
|
259
|
+
* Get the current value of a field from a UCalendar.
|
260
|
+
*
|
261
|
+
*/
|
262
|
+
VALUE icu4r_cal_aref(VALUE obj, VALUE field)
|
263
|
+
{
|
264
|
+
UErrorCode status = U_ZERO_ERROR;
|
265
|
+
int date_field;
|
266
|
+
int32_t value;
|
267
|
+
Check_Type(field, T_SYMBOL);
|
268
|
+
date_field = icu4r_get_cal_field_int(field);
|
269
|
+
value = ucal_get(UCALENDAR(obj), date_field, &status);
|
270
|
+
ICU_RAISE(status);
|
271
|
+
return INT2FIX(value);
|
272
|
+
}
|
273
|
+
|
274
|
+
/**
|
275
|
+
* call-seq:
|
276
|
+
* calendar[field]=int_value
|
277
|
+
*
|
278
|
+
* Set the value of a field in a UCalendar.
|
279
|
+
*/
|
280
|
+
VALUE icu4r_cal_aset(VALUE obj, VALUE field, VALUE amount)
|
281
|
+
{
|
282
|
+
int date_field, ret;
|
283
|
+
UErrorCode status = U_ZERO_ERROR;
|
284
|
+
Check_Type(field, T_SYMBOL);
|
285
|
+
Check_Type(amount, T_FIXNUM);
|
286
|
+
date_field = icu4r_get_cal_field_int(field);
|
287
|
+
ucal_set(UCALENDAR(obj), date_field, FIX2INT(amount) );
|
288
|
+
ret = ucal_get(UCALENDAR(obj), date_field, &status);
|
289
|
+
|
290
|
+
return INT2FIX(ret);
|
291
|
+
}
|
292
|
+
/**
|
293
|
+
* call-seq:
|
294
|
+
* calendar.millis
|
295
|
+
*
|
296
|
+
* return this calendar value in milliseconds.
|
297
|
+
*/
|
298
|
+
VALUE icu4r_cal_millis(VALUE obj)
|
299
|
+
{
|
300
|
+
UErrorCode status = U_ZERO_ERROR;
|
301
|
+
double millis;
|
302
|
+
millis = ucal_getMillis(UCALENDAR(obj), &status);
|
303
|
+
ICU_RAISE(status);
|
304
|
+
return rb_float_new(millis);
|
305
|
+
}
|
306
|
+
/**
|
307
|
+
* call-seq:
|
308
|
+
* calendar.millis = new_value
|
309
|
+
*
|
310
|
+
* Sets calendar's value in milliseconds.
|
311
|
+
*/
|
312
|
+
VALUE icu4r_cal_set_millis(VALUE obj,VALUE milli)
|
313
|
+
{
|
314
|
+
UErrorCode status = U_ZERO_ERROR;
|
315
|
+
Check_Type(milli, T_FLOAT);
|
316
|
+
ucal_setMillis(UCALENDAR(obj), rb_num2dbl(milli), &status);
|
317
|
+
ICU_RAISE(status);
|
318
|
+
return Qnil;
|
319
|
+
}
|
320
|
+
|
321
|
+
/**
|
322
|
+
* call-seq:
|
323
|
+
* calendar.set_date(year, month, date)
|
324
|
+
*
|
325
|
+
* Set a UCalendar's current date.
|
326
|
+
*/
|
327
|
+
VALUE icu4r_cal_set_date(VALUE obj,VALUE year, VALUE mon, VALUE date)
|
328
|
+
{
|
329
|
+
UErrorCode status = U_ZERO_ERROR;
|
330
|
+
Check_Type(year, T_FIXNUM);
|
331
|
+
Check_Type(mon, T_FIXNUM);
|
332
|
+
Check_Type(date, T_FIXNUM);
|
333
|
+
ucal_setDate(UCALENDAR(obj), FIX2INT(year), FIX2INT(mon), FIX2INT(date), &status);
|
334
|
+
ICU_RAISE(status);
|
335
|
+
return Qnil;
|
336
|
+
}
|
337
|
+
/**
|
338
|
+
* call-seq:
|
339
|
+
* calendar.set_date_time(year, month, date, hour, minute, second)
|
340
|
+
*
|
341
|
+
* Set a UCalendar's current date and time.
|
342
|
+
*/
|
343
|
+
VALUE icu4r_cal_set_date_time(VALUE obj,VALUE year, VALUE mon, VALUE date, VALUE hour, VALUE min, VALUE sec)
|
344
|
+
{
|
345
|
+
UErrorCode status = U_ZERO_ERROR;
|
346
|
+
Check_Type(year, T_FIXNUM);
|
347
|
+
Check_Type(mon, T_FIXNUM);
|
348
|
+
Check_Type(date, T_FIXNUM);
|
349
|
+
Check_Type(hour, T_FIXNUM);
|
350
|
+
Check_Type(min, T_FIXNUM);
|
351
|
+
Check_Type(sec, T_FIXNUM);
|
352
|
+
|
353
|
+
ucal_setDateTime(UCALENDAR(obj),
|
354
|
+
FIX2INT(year), FIX2INT(mon), FIX2INT(date),
|
355
|
+
FIX2INT(hour), FIX2INT(min), FIX2INT(sec),
|
356
|
+
&status);
|
357
|
+
ICU_RAISE(status);
|
358
|
+
return Qnil;
|
359
|
+
}
|
360
|
+
|
361
|
+
/**
|
362
|
+
* call-seq:
|
363
|
+
* calendar.time_zone = zone_id
|
364
|
+
*
|
365
|
+
* Set the TimeZone used by a UCalendar.
|
366
|
+
*/
|
367
|
+
VALUE icu4r_cal_set_tz(VALUE obj, VALUE zone)
|
368
|
+
{
|
369
|
+
UErrorCode status = U_ZERO_ERROR;
|
370
|
+
Check_Class(zone, rb_cUString);
|
371
|
+
ucal_setTimeZone(UCALENDAR(obj), ICU_PTR(zone), ICU_LEN(zone), &status);
|
372
|
+
ICU_RAISE(status);
|
373
|
+
return Qnil;
|
374
|
+
|
375
|
+
}
|
376
|
+
|
377
|
+
/**
|
378
|
+
* call-seq:
|
379
|
+
* calendar.in_daylight_time?
|
380
|
+
*
|
381
|
+
* Determine if a UCalendar is currently in daylight savings time.
|
382
|
+
*
|
383
|
+
* Daylight savings time is not used in all parts of the world
|
384
|
+
*/
|
385
|
+
VALUE icu4r_cal_in_daylight(VALUE obj)
|
386
|
+
{
|
387
|
+
UErrorCode status = U_ZERO_ERROR;
|
388
|
+
int32_t answer;
|
389
|
+
answer = ucal_inDaylightTime(UCALENDAR(obj), &status);
|
390
|
+
ICU_RAISE(status);
|
391
|
+
return answer ? Qtrue : Qfalse;
|
392
|
+
}
|
393
|
+
|
394
|
+
/**
|
395
|
+
* call-seq:
|
396
|
+
* calendar.time_zone(locale = nil)
|
397
|
+
*
|
398
|
+
* Returns the TimeZone name used in this UCalendar. Name is returned in requested locale or default, if not set.
|
399
|
+
*/
|
400
|
+
VALUE icu4r_cal_get_tz (int argc, VALUE * argv, VALUE obj)
|
401
|
+
{
|
402
|
+
UErrorCode status = U_ZERO_ERROR;
|
403
|
+
UChar * buf = NULL;
|
404
|
+
long capa = 0;
|
405
|
+
char *locale = NULL;
|
406
|
+
VALUE loc;
|
407
|
+
if( rb_scan_args(argc, argv, "01", &loc) == 1){
|
408
|
+
Check_Type(loc, T_STRING);
|
409
|
+
locale = RSTRING_PTR(loc);
|
410
|
+
}
|
411
|
+
|
412
|
+
capa = ucal_getTimeZoneDisplayName(UCALENDAR(obj), UCAL_STANDARD, locale, buf, capa, &status);
|
413
|
+
if( U_BUFFER_OVERFLOW_ERROR == status) {
|
414
|
+
buf = ALLOC_N(UChar, capa+1);
|
415
|
+
status = U_ZERO_ERROR;
|
416
|
+
capa = ucal_getTimeZoneDisplayName(UCALENDAR(obj), UCAL_STANDARD, locale, buf, capa, &status);
|
417
|
+
return icu_ustr_new_set(buf, capa, capa+1);
|
418
|
+
}
|
419
|
+
ICU_RAISE(status);
|
420
|
+
return Qnil;
|
421
|
+
|
422
|
+
}
|
423
|
+
int icu4r_get_cal_format_int(VALUE field)
|
424
|
+
{
|
425
|
+
VALUE field_const;
|
426
|
+
field_const = rb_hash_aref(s_calendar_formats, field);
|
427
|
+
if(field_const == Qnil) {
|
428
|
+
rb_warn("no such format %s , using default", RSTRING_PTR(rb_obj_as_string(field)));
|
429
|
+
return UDAT_DEFAULT;
|
430
|
+
}
|
431
|
+
return NUM2INT(field_const);
|
432
|
+
}
|
433
|
+
/** call-seq:
|
434
|
+
* calendar.format(pattern = nil , locale = nil)
|
435
|
+
*
|
436
|
+
* Formats this calendar time using given pattern and locale. Returns UString or nil on failure.
|
437
|
+
* Valid value types for pattern are:
|
438
|
+
* nil - long format for date and time
|
439
|
+
* UString - specification of format, as defined in docs/FORMATTING
|
440
|
+
* Symbol - one of :short, :medium, :long, :full, :none , sets format for both date and time
|
441
|
+
* Hash - {:time => aSymbol, :date => aSymbol} - sets separate formats for date and time, valid symbols see above
|
442
|
+
*/
|
443
|
+
VALUE icu4r_cal_format(int argc, VALUE * argv, VALUE obj)
|
444
|
+
{
|
445
|
+
UErrorCode status = U_ZERO_ERROR;
|
446
|
+
UDateFormat * format;
|
447
|
+
UDate time_to_format;
|
448
|
+
UChar * buf = NULL, * pattern = NULL;
|
449
|
+
long capa = 0, pattern_len = 0;
|
450
|
+
char *locale = NULL;
|
451
|
+
VALUE loc, pat, ret = Qnil;
|
452
|
+
int n , def_d_format = UDAT_FULL, def_t_format = UDAT_FULL;
|
453
|
+
|
454
|
+
n = rb_scan_args(argc, argv, "02", &pat, &loc);
|
455
|
+
if( n == 2) {
|
456
|
+
Check_Type(loc, T_STRING);
|
457
|
+
locale = RSTRING_PTR(loc);
|
458
|
+
}
|
459
|
+
if (n >= 1 && pat != Qnil) {
|
460
|
+
switch(TYPE(pat)) {
|
461
|
+
case T_SYMBOL:
|
462
|
+
def_d_format = def_t_format = icu4r_get_cal_format_int(pat);
|
463
|
+
break;
|
464
|
+
case T_HASH:
|
465
|
+
def_d_format = icu4r_get_cal_format_int(rb_hash_aref(pat, ID2SYM(rb_intern("date"))));
|
466
|
+
def_t_format = icu4r_get_cal_format_int(rb_hash_aref(pat, ID2SYM(rb_intern("time"))));
|
467
|
+
break;
|
468
|
+
default:
|
469
|
+
Check_Class(pat, rb_cUString);
|
470
|
+
pattern = ICU_PTR(pat);
|
471
|
+
pattern_len = ICU_LEN(pat);
|
472
|
+
break;
|
473
|
+
}
|
474
|
+
}
|
475
|
+
|
476
|
+
format = udat_open(def_t_format, def_d_format, locale, NULL, 0, NULL, 0, &status);
|
477
|
+
if( pattern ) {
|
478
|
+
udat_applyPattern(format, 0, pattern, pattern_len);
|
479
|
+
}
|
480
|
+
ICU_RAISE(status);
|
481
|
+
udat_setCalendar(format, UCALENDAR(obj));
|
482
|
+
time_to_format = ucal_getMillis(UCALENDAR(obj), &status);
|
483
|
+
|
484
|
+
capa = udat_format(format, time_to_format, buf, capa, NULL, &status);
|
485
|
+
if( U_BUFFER_OVERFLOW_ERROR == status) {
|
486
|
+
buf = ALLOC_N(UChar, capa+1);
|
487
|
+
status = U_ZERO_ERROR;
|
488
|
+
capa = udat_format(format, time_to_format, buf, capa, NULL, &status);
|
489
|
+
ret = icu_ustr_new_set(buf, capa, capa+1);
|
490
|
+
}
|
491
|
+
udat_close(format);
|
492
|
+
ICU_RAISE(status);
|
493
|
+
return ret;
|
494
|
+
}
|
495
|
+
|
496
|
+
/**
|
497
|
+
* Document-method: clone
|
498
|
+
*
|
499
|
+
* call-seq:
|
500
|
+
* cal.clone => UCalendar
|
501
|
+
*
|
502
|
+
* Create and return a copy of this calendar.
|
503
|
+
*/
|
504
|
+
extern VALUE icu4r_cal_clone(VALUE obj);
|
505
|
+
/**
|
506
|
+
* Document-method: eql?
|
507
|
+
*
|
508
|
+
* call-seq:
|
509
|
+
* cal.eql?(other)
|
510
|
+
*
|
511
|
+
* Compares the equality of two UCalendar objects.
|
512
|
+
*
|
513
|
+
* This comparison is very exacting; two UCalendar objects must be in exactly the
|
514
|
+
* same state to be considered equal.
|
515
|
+
*/
|
516
|
+
extern VALUE icu4r_cal_equal(VALUE obj, VALUE other);
|
517
|
+
|
518
|
+
/**
|
519
|
+
* call-seq:
|
520
|
+
* cal <=> other_cal => -1, 0, +1
|
521
|
+
*
|
522
|
+
* Comparison---Returns -1 if <i>other_cal</i> is before than, 0 if
|
523
|
+
* <i>other_cal</i> is equal to, and +1 if <i>other_cal</i> is after than
|
524
|
+
* <i>str</i>.
|
525
|
+
*
|
526
|
+
* Value of calendar's milliseconds are compared.
|
527
|
+
*/
|
528
|
+
|
529
|
+
VALUE icu4r_cal_cmp (VALUE c1, VALUE c2)
|
530
|
+
{
|
531
|
+
UErrorCode status = U_ZERO_ERROR;
|
532
|
+
double millis1, millis2;
|
533
|
+
Check_Class(c1, rb_cUCalendar);
|
534
|
+
Check_Class(c2, rb_cUCalendar);
|
535
|
+
millis1 = ucal_getMillis(UCALENDAR(c1), &status);
|
536
|
+
millis2 = ucal_getMillis(UCALENDAR(c2), &status);
|
537
|
+
ICU_RAISE(status);
|
538
|
+
if(millis1 < millis2) return INT2FIX(-1);
|
539
|
+
if(millis1 > millis2) return INT2FIX(1);
|
540
|
+
return INT2FIX(0);
|
541
|
+
}
|
542
|
+
/* parsing */
|
543
|
+
extern UCalendar * icu_date_parse(UChar * str, int32_t str_len, char * locale, UChar * val, int32_t len);
|
544
|
+
|
545
|
+
/**
|
546
|
+
* call-seq:
|
547
|
+
* UCalendar.parse( pattern, locale, value)
|
548
|
+
*
|
549
|
+
* Parses given value, using format pattern with respect to +locale+.
|
550
|
+
*
|
551
|
+
* UCalendar.parse("HH:mm:ss E dd/MM/yyyy".u, "en", "20:15:01 Fri 13/01/2006".u) # => Time.local(2006,"jan",13,20,15,1)
|
552
|
+
*
|
553
|
+
*/
|
554
|
+
|
555
|
+
VALUE
|
556
|
+
icu4r_cal_parse( obj, str, locale, val)
|
557
|
+
VALUE obj, str, locale, val;
|
558
|
+
{
|
559
|
+
UCalendar * cal;
|
560
|
+
VALUE ret;
|
561
|
+
Check_Type(locale, T_STRING);
|
562
|
+
Check_Class(val, rb_cUString);
|
563
|
+
cal = icu_date_parse(ICU_PTR(str), ICU_LEN(str), RSTRING_PTR(locale), ICU_PTR(val), ICU_LEN(val));
|
564
|
+
ret = Data_Wrap_Struct(obj, 0, icu4r_cal_free, cal);
|
565
|
+
return ret;
|
566
|
+
}
|
567
|
+
|
568
|
+
void initialize_calendar(void) {
|
569
|
+
|
570
|
+
rb_cUCalendar = rb_define_class("UCalendar", rb_cObject);
|
571
|
+
rb_define_alloc_func(rb_cUCalendar, icu4r_cal_alloc);
|
572
|
+
|
573
|
+
s_calendar_fields = rb_hash_new();
|
574
|
+
/* Valid symbols to use as field reference in UCalendar#[], UCalendar#[]=, UCalendar#add are:
|
575
|
+
:era , :year , :month , :week_of_year , :week_of_month , :date , :day_of_year , :day_of_week, :day_of_week_in_month,
|
576
|
+
:am_pm , :hour , :hour_of_day , :minute , :second , :millisecond , :zone_offset , :dst_offset:
|
577
|
+
*/
|
578
|
+
rb_define_const(rb_cUCalendar, "UCALENDAR_FIELDS", s_calendar_fields);
|
579
|
+
rb_hash_aset(s_calendar_fields, ID2SYM(rb_intern("era")), INT2NUM(UCAL_ERA ));
|
580
|
+
rb_hash_aset(s_calendar_fields, ID2SYM(rb_intern("year")), INT2NUM(UCAL_YEAR ));
|
581
|
+
rb_hash_aset(s_calendar_fields, ID2SYM(rb_intern("month")), INT2NUM(UCAL_MONTH));
|
582
|
+
rb_hash_aset(s_calendar_fields, ID2SYM(rb_intern("week_of_year")), INT2NUM(UCAL_WEEK_OF_YEAR ));
|
583
|
+
rb_hash_aset(s_calendar_fields, ID2SYM(rb_intern("week_of_month")), INT2NUM(UCAL_WEEK_OF_MONTH));
|
584
|
+
rb_hash_aset(s_calendar_fields, ID2SYM(rb_intern("date")), INT2NUM(UCAL_DATE));
|
585
|
+
rb_hash_aset(s_calendar_fields, ID2SYM(rb_intern("day_of_year")), INT2NUM(UCAL_DAY_OF_YEAR));
|
586
|
+
rb_hash_aset(s_calendar_fields, ID2SYM(rb_intern("day_of_week")), INT2NUM(UCAL_DAY_OF_WEEK));
|
587
|
+
rb_hash_aset(s_calendar_fields, ID2SYM(rb_intern("day_of_week_in_month")), INT2NUM(UCAL_DAY_OF_WEEK_IN_MONTH));
|
588
|
+
rb_hash_aset(s_calendar_fields, ID2SYM(rb_intern("am_pm")), INT2NUM(UCAL_AM_PM));
|
589
|
+
rb_hash_aset(s_calendar_fields, ID2SYM(rb_intern("hour")), INT2NUM(UCAL_HOUR));
|
590
|
+
rb_hash_aset(s_calendar_fields, ID2SYM(rb_intern("hour_of_day")), INT2NUM(UCAL_HOUR_OF_DAY));
|
591
|
+
rb_hash_aset(s_calendar_fields, ID2SYM(rb_intern("minute")), INT2NUM(UCAL_MINUTE ));
|
592
|
+
rb_hash_aset(s_calendar_fields, ID2SYM(rb_intern("second")), INT2NUM(UCAL_SECOND));
|
593
|
+
rb_hash_aset(s_calendar_fields, ID2SYM(rb_intern("millisecond")), INT2NUM(UCAL_MILLISECOND ));
|
594
|
+
rb_hash_aset(s_calendar_fields, ID2SYM(rb_intern("zone_offset")), INT2NUM(UCAL_ZONE_OFFSET));
|
595
|
+
rb_hash_aset(s_calendar_fields, ID2SYM(rb_intern("dst_offset")), INT2NUM(UCAL_DST_OFFSET));
|
596
|
+
|
597
|
+
s_calendar_formats = rb_hash_new();
|
598
|
+
rb_define_const(rb_cUCalendar, "UCALENDAR_FORMATS", s_calendar_formats);
|
599
|
+
rb_hash_aset(s_calendar_formats, ID2SYM(rb_intern("full")), INT2NUM(UDAT_FULL));
|
600
|
+
rb_hash_aset(s_calendar_formats, ID2SYM(rb_intern("long")), INT2NUM(UDAT_LONG));
|
601
|
+
rb_hash_aset(s_calendar_formats, ID2SYM(rb_intern("medium")), INT2NUM(UDAT_MEDIUM));
|
602
|
+
rb_hash_aset(s_calendar_formats, ID2SYM(rb_intern("short")), INT2NUM(UDAT_SHORT));
|
603
|
+
rb_hash_aset(s_calendar_formats, ID2SYM(rb_intern("default")), INT2NUM(UDAT_DEFAULT));
|
604
|
+
rb_hash_aset(s_calendar_formats, ID2SYM(rb_intern("none")), INT2NUM(UDAT_NONE));
|
605
|
+
|
606
|
+
|
607
|
+
rb_define_singleton_method(rb_cUCalendar, "now", icu4r_cal_now, 0);
|
608
|
+
|
609
|
+
rb_define_singleton_method(rb_cUCalendar, "default_tz=", icu4r_cal_set_default_tz, 1);
|
610
|
+
rb_define_singleton_method(rb_cUCalendar, "default_tz", icu4r_cal_get_default_tz, 0);
|
611
|
+
rb_define_singleton_method(rb_cUCalendar, "time_zones", icu4r_cal_all_tz, 0);
|
612
|
+
rb_define_singleton_method(rb_cUCalendar, "tz_for_country", icu4r_cal_country_tz, 1);
|
613
|
+
rb_define_singleton_method(rb_cUCalendar, "dst_savings", icu4r_cal_dst_savings, 1);
|
614
|
+
rb_define_singleton_method(rb_cUCalendar, "parse", icu4r_cal_parse, 3);
|
615
|
+
|
616
|
+
rb_define_method(rb_cUCalendar, "initialize", icu4r_cal_init, -1);
|
617
|
+
rb_define_method(rb_cUCalendar, "add", icu4r_cal_add, 2);
|
618
|
+
rb_define_method(rb_cUCalendar, "roll", icu4r_cal_roll, 2);
|
619
|
+
rb_define_method(rb_cUCalendar, "[]", icu4r_cal_aref, 1);
|
620
|
+
rb_define_method(rb_cUCalendar, "[]=", icu4r_cal_aset, 2);
|
621
|
+
rb_define_method(rb_cUCalendar, "millis=", icu4r_cal_set_millis, 1);
|
622
|
+
rb_define_method(rb_cUCalendar, "millis", icu4r_cal_millis,0);
|
623
|
+
rb_define_method(rb_cUCalendar, "set_date", icu4r_cal_set_date,3);
|
624
|
+
rb_define_method(rb_cUCalendar, "set_date_time", icu4r_cal_set_date_time,6);
|
625
|
+
rb_define_method(rb_cUCalendar, "time_zone=", icu4r_cal_set_tz,1);
|
626
|
+
rb_define_method(rb_cUCalendar, "time_zone", icu4r_cal_get_tz,-1);
|
627
|
+
rb_define_method(rb_cUCalendar, "in_daylight_time?", icu4r_cal_in_daylight,0);
|
628
|
+
rb_define_method(rb_cUCalendar, "format", icu4r_cal_format,-1);
|
629
|
+
|
630
|
+
rb_define_method(rb_cUCalendar, "clone", icu4r_cal_clone,0);
|
631
|
+
rb_define_method(rb_cUCalendar, "eql?", icu4r_cal_equal,1);
|
632
|
+
rb_define_method(rb_cUCalendar, "<=>", icu4r_cal_cmp,1);
|
633
|
+
|
634
|
+
rb_include_module(rb_cUCalendar, rb_mComparable);
|
635
|
+
|
636
|
+
}
|