summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/string.c2
-rw-r--r--src/symbol.c22
-rw-r--r--src/time.c36
3 files changed, 49 insertions, 11 deletions
diff --git a/src/string.c b/src/string.c
index eabf9f8ef..805b52a28 100644
--- a/src/string.c
+++ b/src/string.c
@@ -2811,7 +2811,7 @@ mrb_str_dump(mrb_state *mrb, mrb_value str)
len++;
}
else {
- len += 4; /* \xNN */
+ len += 4; /* \NNN */
}
break;
}
diff --git a/src/symbol.c b/src/symbol.c
index a236ba9ae..6754325a5 100644
--- a/src/symbol.c
+++ b/src/symbol.c
@@ -42,13 +42,13 @@ mrb_sym
mrb_intern2(mrb_state *mrb, const char *name, int len)
{
khash_t(n2s) *h = mrb->name2sym;
+ symbol_name sname;
khiter_t k;
- char *p;
mrb_sym sym;
- symbol_name sname;
+ char *p;
- sname.name = name;
sname.len = len;
+ sname.name = name;
k = kh_get(n2s, h, sname);
if (k != kh_end(h))
return kh_value(h, k);
@@ -57,7 +57,7 @@ mrb_intern2(mrb_state *mrb, const char *name, int len)
p = mrb_malloc(mrb, len+1);
memcpy(p, name, len);
p[len] = 0;
- sname.name = p;
+ sname.name = (const char*)p;
k = kh_put(n2s, h, sname);
kh_value(h, k) = sym;
@@ -73,7 +73,7 @@ mrb_intern(mrb_state *mrb, const char *name)
mrb_sym
mrb_intern_str(mrb_state *mrb, mrb_value str)
{
- return mrb_intern(mrb, RSTRING_PTR(str));
+ return mrb_intern2(mrb, RSTRING_PTR(str), RSTRING_LEN(str));
}
const char*
@@ -84,11 +84,13 @@ mrb_sym2name_len(mrb_state *mrb, mrb_sym sym, int *lenp)
symbol_name sname;
for (k = kh_begin(h); k != kh_end(h); k++) {
- if (kh_exist(h, k) && kh_value(h, k) == sym) break;
+ if (kh_exist(h, k)) {
+ if (kh_value(h, k) == sym) break;
+ }
}
if (k == kh_end(h)) {
*lenp = 0;
- return NULL; /* missing */
+ return NULL; /* missing */
}
sname = kh_key(h, k);
*lenp = sname.len;
@@ -324,14 +326,14 @@ sym_inspect(mrb_state *mrb, mrb_value sym)
{
mrb_value str;
const char *name;
- mrb_sym id = SYM2ID(sym);
int len;
+ mrb_sym id = SYM2ID(sym);
name = mrb_sym2name_len(mrb, id, &len);
str = mrb_str_new(mrb, 0, len+1);
RSTRING(str)->buf[0] = ':';
- strcpy(RSTRING(str)->buf+1, name);
- if (!symname_p(name)) {
+ memcpy(RSTRING(str)->buf+1, name, len);
+ if (!symname_p(name) || strlen(name) != len) {
str = mrb_str_dump(mrb, str);
strncpy(RSTRING(str)->buf, ":\"", 2);
}
diff --git a/src/time.c b/src/time.c
index 08f746707..eea92e604 100644
--- a/src/time.c
+++ b/src/time.c
@@ -463,6 +463,39 @@ mrb_time_dstp(mrb_state *mrb, mrb_value self)
return mrb_bool_value(tm->datetime.tm_isdst);
}
+/* 15.2.19.7.8 */
+/* 15.2.19.7.10 */
+/* Returns the Time object of the UTC(GMT) timezone. */
+static mrb_value
+mrb_time_getutc(mrb_state *mrb, mrb_value self)
+{
+ struct mrb_time *tm, *tm2;
+
+ tm = mrb_get_datatype(mrb, self, &mrb_time_type);
+ if (!tm) return self;
+ tm2 = mrb_malloc(mrb, sizeof(*tm));
+ *tm2 = *tm;
+ tm2->timezone = MRB_TIMEZONE_UTC;
+ mrb_time_update_datetime(tm2);
+ return mrb_time_wrap(mrb, mrb_obj_class(mrb, self), tm2);
+}
+
+/* 15.2.19.7.9 */
+/* Returns the Time object of the LOCAL timezone. */
+static mrb_value
+mrb_time_getlocal(mrb_state *mrb, mrb_value self)
+{
+ struct mrb_time *tm, *tm2;
+
+ tm = mrb_get_datatype(mrb, self, &mrb_time_type);
+ if (!tm) return self;
+ tm2 = mrb_malloc(mrb, sizeof(*tm));
+ *tm2 = *tm;
+ tm2->timezone = MRB_TIMEZONE_LOCAL;
+ mrb_time_update_datetime(tm2);
+ return mrb_time_wrap(mrb, mrb_obj_class(mrb, self), tm2);
+}
+
/* 15.2.19.7.15 */
/* Returns hour of time. */
static mrb_value
@@ -671,6 +704,9 @@ mrb_init_time(mrb_state *mrb)
mrb_define_method(mrb, tc, "ctime" , mrb_time_asctime, ARGS_NONE()); /* 15.2.19.7.5 */
mrb_define_method(mrb, tc, "day" , mrb_time_day , ARGS_NONE()); /* 15.2.19.7.6 */
mrb_define_method(mrb, tc, "dst?" , mrb_time_dstp , ARGS_NONE()); /* 15.2.19.7.7 */
+ mrb_define_method(mrb, tc, "getgm" , mrb_time_getutc , ARGS_NONE()); /* 15.2.19.7.8 */
+ mrb_define_method(mrb, tc, "getlocal",mrb_time_getlocal,ARGS_NONE()); /* 15.2.19.7.9 */
+ mrb_define_method(mrb, tc, "getutc" , mrb_time_getutc , ARGS_NONE()); /* 15.2.19.7.10 */
mrb_define_method(mrb, tc, "gmt?" , mrb_time_utcp , ARGS_NONE()); /* 15.2.19.7.11 */
mrb_define_method(mrb, tc, "gmtime" , mrb_time_utc , ARGS_NONE()); /* 15.2.19.7.13 */
mrb_define_method(mrb, tc, "hour" , mrb_time_hour, ARGS_NONE()); /* 15.2.19.7.15 */