diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/string.c | 2 | ||||
| -rw-r--r-- | src/symbol.c | 22 | ||||
| -rw-r--r-- | src/time.c | 36 |
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 */ |
