Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mruby
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Libraries
mruby
Commits
3d9aa463
Commit
3d9aa463
authored
8 years ago
by
Yukihiro "Matz" Matsumoto
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add NULL checks for Time data retrieval
parent
c70e2063
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
35 additions
and
26 deletions
+35
-26
mrbgems/mruby-time/src/time.c
mrbgems/mruby-time/src/time.c
+35
-26
No files found.
mrbgems/mruby-time/src/time.c
View file @
3d9aa463
...
...
@@ -368,6 +368,17 @@ mrb_time_local(mrb_state *mrb, mrb_value self)
time_mktime
(
mrb
,
ayear
,
amonth
,
aday
,
ahour
,
amin
,
asec
,
ausec
,
MRB_TIMEZONE_LOCAL
));
}
static
struct
mrb_time
*
time_get_ptr
(
mrb_state
*
mrb
,
mrb_value
time
)
{
struct
mrb_time
*
tm
;
tm
=
DATA_GET_PTR
(
mrb
,
time
,
&
mrb_time_type
,
struct
mrb_time
);
if
(
!
tm
)
{
mrb_raise
(
mrb
,
E_ARGUMENT_ERROR
,
"uninitialized time"
);
}
return
tm
;
}
static
mrb_value
mrb_time_eq
(
mrb_state
*
mrb
,
mrb_value
self
)
...
...
@@ -377,7 +388,7 @@ mrb_time_eq(mrb_state *mrb, mrb_value self)
mrb_bool
eq_p
;
mrb_get_args
(
mrb
,
"o"
,
&
other
);
tm1
=
DATA_
CHECK_
GET_PTR
(
mrb
,
self
,
&
mrb_time_type
,
struct
mrb_time
);
tm1
=
DATA_GET_PTR
(
mrb
,
self
,
&
mrb_time_type
,
struct
mrb_time
);
tm2
=
DATA_CHECK_GET_PTR
(
mrb
,
other
,
&
mrb_time_type
,
struct
mrb_time
);
eq_p
=
tm1
&&
tm2
&&
tm1
->
sec
==
tm2
->
sec
&&
tm1
->
usec
==
tm2
->
usec
;
...
...
@@ -391,7 +402,7 @@ mrb_time_cmp(mrb_state *mrb, mrb_value self)
struct
mrb_time
*
tm1
,
*
tm2
;
mrb_get_args
(
mrb
,
"o"
,
&
other
);
tm1
=
DATA_
CHECK_
GET_PTR
(
mrb
,
self
,
&
mrb_time_type
,
struct
mrb_time
);
tm1
=
DATA_GET_PTR
(
mrb
,
self
,
&
mrb_time_type
,
struct
mrb_time
);
tm2
=
DATA_CHECK_GET_PTR
(
mrb
,
other
,
&
mrb_time_type
,
struct
mrb_time
);
if
(
!
tm1
||
!
tm2
)
return
mrb_nil_value
();
if
(
tm1
->
sec
>
tm2
->
sec
)
{
...
...
@@ -417,7 +428,7 @@ mrb_time_plus(mrb_state *mrb, mrb_value self)
struct
mrb_time
*
tm
;
mrb_get_args
(
mrb
,
"f"
,
&
f
);
tm
=
DATA_GET_PTR
(
mrb
,
self
,
&
mrb_time_type
,
struct
mrb_time
);
tm
=
time_get_ptr
(
mrb
,
self
);
return
mrb_time_make
(
mrb
,
mrb_obj_class
(
mrb
,
self
),
(
double
)
tm
->
sec
+
f
,
(
double
)
tm
->
usec
,
tm
->
timezone
);
}
...
...
@@ -429,8 +440,7 @@ mrb_time_minus(mrb_state *mrb, mrb_value self)
struct
mrb_time
*
tm
,
*
tm2
;
mrb_get_args
(
mrb
,
"o"
,
&
other
);
tm
=
DATA_GET_PTR
(
mrb
,
self
,
&
mrb_time_type
,
struct
mrb_time
);
tm
=
time_get_ptr
(
mrb
,
self
);
tm2
=
DATA_CHECK_GET_PTR
(
mrb
,
other
,
&
mrb_time_type
,
struct
mrb_time
);
if
(
tm2
)
{
f
=
(
mrb_float
)(
tm
->
sec
-
tm2
->
sec
)
...
...
@@ -450,7 +460,7 @@ mrb_time_wday(mrb_state *mrb, mrb_value self)
{
struct
mrb_time
*
tm
;
tm
=
DATA_GET_PTR
(
mrb
,
self
,
&
mrb_time_type
,
struct
mrb_time
);
tm
=
time_get_ptr
(
mrb
,
self
);
return
mrb_fixnum_value
(
tm
->
datetime
.
tm_wday
);
}
...
...
@@ -461,7 +471,7 @@ mrb_time_yday(mrb_state *mrb, mrb_value self)
{
struct
mrb_time
*
tm
;
tm
=
DATA_GET_PTR
(
mrb
,
self
,
&
mrb_time_type
,
struct
mrb_time
);
tm
=
time_get_ptr
(
mrb
,
self
);
return
mrb_fixnum_value
(
tm
->
datetime
.
tm_yday
+
1
);
}
...
...
@@ -472,7 +482,7 @@ mrb_time_year(mrb_state *mrb, mrb_value self)
{
struct
mrb_time
*
tm
;
tm
=
DATA_GET_PTR
(
mrb
,
self
,
&
mrb_time_type
,
struct
mrb_time
);
tm
=
time_get_ptr
(
mrb
,
self
);
return
mrb_fixnum_value
(
tm
->
datetime
.
tm_year
+
1900
);
}
...
...
@@ -483,7 +493,7 @@ mrb_time_zone(mrb_state *mrb, mrb_value self)
{
struct
mrb_time
*
tm
;
tm
=
DATA_GET_PTR
(
mrb
,
self
,
&
mrb_time_type
,
struct
mrb_time
);
tm
=
time_get_ptr
(
mrb
,
self
);
if
(
tm
->
timezone
<=
MRB_TIMEZONE_NONE
)
return
mrb_nil_value
();
if
(
tm
->
timezone
>=
MRB_TIMEZONE_LAST
)
return
mrb_nil_value
();
return
mrb_str_new_static
(
mrb
,
...
...
@@ -501,7 +511,7 @@ mrb_time_asctime(mrb_state *mrb, mrb_value self)
char
buf
[
256
];
int
len
;
tm
=
DATA_GET_PTR
(
mrb
,
self
,
&
mrb_time_type
,
struct
mrb_time
);
tm
=
time_get_ptr
(
mrb
,
self
);
d
=
&
tm
->
datetime
;
len
=
snprintf
(
buf
,
sizeof
(
buf
),
"%s %s %02d %02d:%02d:%02d %s%d"
,
wday_names
[
d
->
tm_wday
],
mon_names
[
d
->
tm_mon
],
d
->
tm_mday
,
...
...
@@ -518,8 +528,7 @@ mrb_time_day(mrb_state *mrb, mrb_value self)
{
struct
mrb_time
*
tm
;
tm
=
DATA_GET_PTR
(
mrb
,
self
,
&
mrb_time_type
,
struct
mrb_time
);
if
(
!
tm
)
return
mrb_nil_value
();
tm
=
time_get_ptr
(
mrb
,
self
);
return
mrb_fixnum_value
(
tm
->
datetime
.
tm_mday
);
}
...
...
@@ -531,7 +540,7 @@ mrb_time_dst_p(mrb_state *mrb, mrb_value self)
{
struct
mrb_time
*
tm
;
tm
=
DATA_GET_PTR
(
mrb
,
self
,
&
mrb_time_type
,
struct
mrb_time
);
tm
=
time_get_ptr
(
mrb
,
self
);
return
mrb_bool_value
(
tm
->
datetime
.
tm_isdst
);
}
...
...
@@ -543,7 +552,7 @@ mrb_time_getutc(mrb_state *mrb, mrb_value self)
{
struct
mrb_time
*
tm
,
*
tm2
;
tm
=
DATA_GET_PTR
(
mrb
,
self
,
&
mrb_time_type
,
struct
mrb_time
);
tm
=
time_get_ptr
(
mrb
,
self
);
tm2
=
(
struct
mrb_time
*
)
mrb_malloc
(
mrb
,
sizeof
(
*
tm
));
*
tm2
=
*
tm
;
tm2
->
timezone
=
MRB_TIMEZONE_UTC
;
...
...
@@ -558,7 +567,7 @@ mrb_time_getlocal(mrb_state *mrb, mrb_value self)
{
struct
mrb_time
*
tm
,
*
tm2
;
tm
=
DATA_GET_PTR
(
mrb
,
self
,
&
mrb_time_type
,
struct
mrb_time
);
tm
=
time_get_ptr
(
mrb
,
self
);
tm2
=
(
struct
mrb_time
*
)
mrb_malloc
(
mrb
,
sizeof
(
*
tm
));
*
tm2
=
*
tm
;
tm2
->
timezone
=
MRB_TIMEZONE_LOCAL
;
...
...
@@ -573,7 +582,7 @@ mrb_time_hour(mrb_state *mrb, mrb_value self)
{
struct
mrb_time
*
tm
;
tm
=
DATA_GET_PTR
(
mrb
,
self
,
&
mrb_time_type
,
struct
mrb_time
);
tm
=
time_get_ptr
(
mrb
,
self
);
return
mrb_fixnum_value
(
tm
->
datetime
.
tm_hour
);
}
...
...
@@ -638,7 +647,7 @@ mrb_time_localtime(mrb_state *mrb, mrb_value self)
{
struct
mrb_time
*
tm
;
tm
=
DATA_GET_PTR
(
mrb
,
self
,
&
mrb_time_type
,
struct
mrb_time
);
tm
=
time_get_ptr
(
mrb
,
self
);
tm
->
timezone
=
MRB_TIMEZONE_LOCAL
;
mrb_time_update_datetime
(
tm
);
return
self
;
...
...
@@ -651,7 +660,7 @@ mrb_time_mday(mrb_state *mrb, mrb_value self)
{
struct
mrb_time
*
tm
;
tm
=
DATA_GET_PTR
(
mrb
,
self
,
&
mrb_time_type
,
struct
mrb_time
);
tm
=
time_get_ptr
(
mrb
,
self
);
return
mrb_fixnum_value
(
tm
->
datetime
.
tm_mday
);
}
...
...
@@ -662,7 +671,7 @@ mrb_time_min(mrb_state *mrb, mrb_value self)
{
struct
mrb_time
*
tm
;
tm
=
DATA_GET_PTR
(
mrb
,
self
,
&
mrb_time_type
,
struct
mrb_time
);
tm
=
time_get_ptr
(
mrb
,
self
);
return
mrb_fixnum_value
(
tm
->
datetime
.
tm_min
);
}
...
...
@@ -673,7 +682,7 @@ mrb_time_mon(mrb_state *mrb, mrb_value self)
{
struct
mrb_time
*
tm
;
tm
=
DATA_GET_PTR
(
mrb
,
self
,
&
mrb_time_type
,
struct
mrb_time
);
tm
=
time_get_ptr
(
mrb
,
self
);
return
mrb_fixnum_value
(
tm
->
datetime
.
tm_mon
+
1
);
}
...
...
@@ -684,7 +693,7 @@ mrb_time_sec(mrb_state *mrb, mrb_value self)
{
struct
mrb_time
*
tm
;
tm
=
DATA_GET_PTR
(
mrb
,
self
,
&
mrb_time_type
,
struct
mrb_time
);
tm
=
time_get_ptr
(
mrb
,
self
);
return
mrb_fixnum_value
(
tm
->
datetime
.
tm_sec
);
}
...
...
@@ -696,7 +705,7 @@ mrb_time_to_f(mrb_state *mrb, mrb_value self)
{
struct
mrb_time
*
tm
;
tm
=
DATA_GET_PTR
(
mrb
,
self
,
&
mrb_time_type
,
struct
mrb_time
);
tm
=
time_get_ptr
(
mrb
,
self
);
return
mrb_float_value
(
mrb
,
(
mrb_float
)
tm
->
sec
+
(
mrb_float
)
tm
->
usec
/
1.0e6
);
}
...
...
@@ -707,7 +716,7 @@ mrb_time_to_i(mrb_state *mrb, mrb_value self)
{
struct
mrb_time
*
tm
;
tm
=
DATA_GET_PTR
(
mrb
,
self
,
&
mrb_time_type
,
struct
mrb_time
);
tm
=
time_get_ptr
(
mrb
,
self
);
if
(
tm
->
sec
>
MRB_INT_MAX
||
tm
->
sec
<
MRB_INT_MIN
)
{
return
mrb_float_value
(
mrb
,
(
mrb_float
)
tm
->
sec
);
}
...
...
@@ -721,7 +730,7 @@ mrb_time_usec(mrb_state *mrb, mrb_value self)
{
struct
mrb_time
*
tm
;
tm
=
DATA_GET_PTR
(
mrb
,
self
,
&
mrb_time_type
,
struct
mrb_time
);
tm
=
time_get_ptr
(
mrb
,
self
);
if
(
tm
->
usec
>
MRB_INT_MAX
||
tm
->
usec
<
MRB_INT_MIN
)
{
return
mrb_float_value
(
mrb
,
(
mrb_float
)
tm
->
usec
);
}
...
...
@@ -735,7 +744,7 @@ mrb_time_utc(mrb_state *mrb, mrb_value self)
{
struct
mrb_time
*
tm
;
tm
=
DATA_GET_PTR
(
mrb
,
self
,
&
mrb_time_type
,
struct
mrb_time
);
tm
=
time_get_ptr
(
mrb
,
self
);
tm
->
timezone
=
MRB_TIMEZONE_UTC
;
mrb_time_update_datetime
(
tm
);
return
self
;
...
...
@@ -748,7 +757,7 @@ mrb_time_utc_p(mrb_state *mrb, mrb_value self)
{
struct
mrb_time
*
tm
;
tm
=
DATA_GET_PTR
(
mrb
,
self
,
&
mrb_time_type
,
struct
mrb_time
);
tm
=
time_get_ptr
(
mrb
,
self
);
return
mrb_bool_value
(
tm
->
timezone
==
MRB_TIMEZONE_UTC
);
}
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment