From e96cb9e2065a066ede10e3ce36eba828fd42a97b Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Thu, 24 Mar 2016 18:29:34 -0700 Subject: Methods in time struct: time-local and time-utc. * lib.c (time_local_s, time_utc_s): New symbol variables. (time_meth): New static function. (time_init): Initialize new symbol variables. Create the time struct with two static slots, and initialize those static slots to be methods. * txr.1: Introduce "the epoch" term. Document the new methods. --- lib.c | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) (limited to 'lib.c') diff --git a/lib.c b/lib.c index 32d5b5e7..e29ff99c 100644 --- a/lib.c +++ b/lib.c @@ -113,7 +113,8 @@ val list_f, less_f, greater_f; val prog_string; -val time_s, year_s, month_s, day_s, hour_s, min_s, sec_s, dst_s; +val time_s, time_local_s, time_utc_s; +val year_s, month_s, day_s, hour_s, min_s, sec_s, dst_s; static val env_list; @@ -8989,9 +8990,27 @@ val make_time_utc(val year, val month, val day, return make_time_impl(pmktime, year, month, day, hour, minute, second, isdst); } +static val time_meth(val utc_p, val time_struct) +{ + val year = slot(time_struct, year_s); + val month = slot(time_struct, month_s); + val day = slot(time_struct, day_s); + val hour = slot(time_struct, hour_s); + val min = slot(time_struct, min_s); + val sec = slot(time_struct, sec_s); + val dst = slot(time_struct, dst_s); + + return (utc_p ? make_time_utc : make_time)(year, month, day, + hour, min, sec, dst); +} + static void time_init(void) { + val time_st; + time_s = intern(lit("time"), user_package); + time_local_s = intern(lit("time-local"), user_package); + time_utc_s = intern(lit("time-utc"), user_package); year_s = intern(lit("year"), user_package); month_s = intern(lit("month"), user_package); day_s = intern(lit("day"), user_package); @@ -9000,9 +9019,14 @@ static void time_init(void) sec_s = intern(lit("sec"), user_package); dst_s = intern(lit("dst"), user_package); - make_struct_type(time_s, nil, nil, - list(year_s, month_s, day_s, - hour_s, min_s, sec_s, dst_s, nao), nil, nil, nil, nil); + time_st = make_struct_type(time_s, nil, + list(time_local_s, time_utc_s, nao), + list(year_s, month_s, day_s, + hour_s, min_s, sec_s, dst_s, nao), + nil, nil, nil, nil); + + static_slot_set(time_st, time_local_s, func_f1(nil, time_meth)); + static_slot_set(time_st, time_utc_s, func_f1(t, time_meth)); } void init(const wchar_t *pn, mem_t *(*oom)(mem_t *, size_t), -- cgit v1.2.3