changeset 46:429b5f441381

Added Date Time object
author Mike Pavone <pavone@retrodev.com>
date Tue, 01 Dec 2009 03:59:31 -0500
parents 6420c35edb43
children 6202b866d72c
files date.rhope interp.c interp.h number.c
diffstat 4 files changed, 276 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/date.rhope	Tue Dec 01 03:59:31 2009 -0500
@@ -0,0 +1,241 @@
+//Note that the following code does not currently take into account leap seconds
+
+Days From Secs[secs:days,secs left]
+{
+    secs per day <- [[60]*[60]]*[24]       
+    days <- [secs]/[secs per day]
+    secs left <- [secs]%[secs per day]
+}
+
+//This doesn't take into account the mod 100 rule
+Year From Unix Days[days:year,day in year]
+{
+   block days <- [[365]*[4]]+[1]
+   base year <- [1970]+[[[days]/[block days]]*[4]]
+   after base <- [days]%[block days]
+   If[[after base] > [365]]
+   {
+      year <- [[base year]+[1]]+[ [[after base]-[366]]/[365] ]
+      day in year <- [[after base]-[366]]%[365]
+   }{
+      year <- Val[base year]
+      day in year <- Val[after base]
+   }
+}
+
+Is Leap Year[year:is,is not]
+{
+	is <-If[[[year]%[400]]=[0]] {}
+	{
+		,is not <- If[[[year]%[100]]=[0]]
+		{
+			is,is not <- If[[[year]%[4]]=[0]]
+		}	
+	}
+}
+
+_Month From Day[day,days,current:month,day in month]
+{
+	curdays <- [days]Index[current]
+	If[[day]<[curdays]]
+	{
+		month <- current
+		day in month <- day
+	}{
+		month,day in month <- _Month From Day[[day]-[curdays], days, [current]+[1]]
+	}
+}
+
+Month From Day[day,year:month,day in month]
+{
+	base <- (31,28,31,30,31,30,31,31,30,31,30,31)
+	Is Leap Year[year]
+	{
+		days <- [base]Set[1, 29]
+	}{
+		days <- Val[base]
+	}
+	month,day in month <- _Month From Day[day, days, 0]
+}
+
+Blueprint Date Time
+{
+	Long:Fifty Micros
+	Word:Year
+	Byte:Month
+	Byte:Day
+}
+
+Date Time From Unix[unix:date]
+{
+	,sec in day <- Days From Secs[unix]
+	{ year <- Year From Unix Days[~] {}
+	{ month, day <- Month From Day[~, year] }}
+	date <- [[[[Build["Date Time"]]Fifty Micros <<[[sec in day]*[20000]]]Year <<[year]]Month <<[[month]+[1]]]Day <<[[day]+[1]]
+}
+
+Now[:date]
+{
+	date <- Date Time From Unix[Unix Time[]]
+}
+
+Seconds@Date Time[date:out]
+{
+	out <- [[[date]Fifty Micros >>]/[20000]]%[60]
+}
+
+Milliseconds@Date Time[date:out]
+{
+	out <- [[[date]Fifty Micros >>]/[20]]%[60000]
+}
+
+Microseconds@Date Time[date:out]
+{
+	out <- [[[date]Fifty Micros >>]%[20]]*[50]
+}
+
+Hours@Date Time[date:out]
+{
+	out <- [[date]Fifty Micros >>]/[[[20000]*[60]]*[60]]
+}
+
+Minutes@Date Time[date:out]
+{
+	out <- [[[date]Fifty Micros >>]/[[20000]*[60]]]%[60]
+}
+
+Day in Year@Date Time[date:out]
+{
+	base day <- [(0,0,31,59,90,120,151,181,212,243,273,304,334)]Index[[date]Month >>]
+	,noleap <- If[[[date]Month >>] > [2]]
+	{
+		,noleap <- Is Leap Year[[date]Year >>]
+		{
+			out <- [base day] + [[date]Day >>]
+		}
+	}
+	Val[noleap]
+	{
+		out <- [[base day] + [[date]Day >>]]-[1]
+	}
+}
+
+//Gregorian only for the moment
+//Sunday = 0, Saturday = 6
+//Uses Zeller's algorithm
+Day of Week@Date Time[date:out]
+{
+	If[[[date]Month >>] < [3]]
+	{
+		zmonth <- [[date]Month >>]+[12]
+		zyear <- [[date]Year >>]-[1]
+	}{
+		zmonth <- [date]Month >>
+		zyear <- [date]Year >>
+	}
+	[zyear]Slice@String[2]
+	{ century <- <String@Whole Number[~] }
+	{ y <- <String@Whole Number[~] }
+	
+	a <- [[26]* [[zmonth]+[1]]]/[10]
+	b <- [[5]*[y]]/[4]
+	c <- [century]/[4]
+	d <- [2]*[century]
+
+	out <- [[-[+[+[+[[date]Day >>, a], b], c], d]] + [6]] % [7]
+}
+
+Format@Date Time[date,format:out]
+{
+	If[[format]=[""]]
+	{
+		out <- ""
+	}{
+		months <- ("", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December")
+		days <- ("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday")
+		cur,rest format <- [format]Slice[1]
+		If[[cur] = ["Y"]]
+		{
+			piece <- [date]Year >>
+		}{ If[[cur] = ["M"]]
+		{
+			piece <- [date]Month >>
+		}{ If[[cur] = ["N"]]
+		{
+			tpiece <- [months]Index[[date]Month >>]
+		}{ If[[cur] = ["B"]]
+		{
+			tpiece <- [[months]Index[[date]Month >>]]Slice[3]
+		}{ If[[cur] = ["D"]]
+		{
+			ppiece <- [date]Day >>
+		}{ If[[cur] = ["d"]]
+		{
+			piece <- [date]Day >>
+		}{ If[[cur] = ["n"]]
+		{
+			tpiece <- [days]Index[[date]Day of Week]
+		}{ If[[cur] = ["b"]]
+		{
+			tpiece <- [[days]Index[[date]Day of Week]]Slice[3]
+		}{ If[[cur] = ["w"]]
+		{
+			piece <- Day of Week[date]
+		}{ If[[cur] = ["h"]]
+		{
+			hour <- [date]Hours
+			If[[hour] > [12]]
+			{
+				ppiece <- [hour]-[12]
+			}{
+				If[[hour] = [0]]
+				{ ppiece <- 12 }
+				{ ppiece <- Val[hour] }
+			}
+		}{ If[[cur] = ["H"]]
+		{
+			ppiece <- Hours[date]
+		}{ If[[cur] = ["m"]]
+		{
+			ppiece <- Minutes[date]
+		}{ If[[cur] = ["s"]]
+		{
+			ppiece <- Seconds[date]
+		}{ If[[cur] = ["a"]]
+		{
+			If[[[date]Hours] < [12]]
+			{ tpiece <- "AM" }
+			{ tpiece <- "PM" }
+		}{ If[[cur] = ["t"]]
+		{
+			ppiece <- Milliseconds[date]
+		}{
+			tpiece <- Val[cur]
+		}}}}}}}}}}}}}}}
+
+		sppiece <- <Whole Number@String[ppiece]
+
+		If[[[sppiece]Length] < [2]]
+		{
+			tpiece <- ["0"]Append[sppiece]
+		}{
+			tpiece <- Val[sppiece]
+		}
+		tpiece <- <Whole Number@String[piece]
+		out <- [tpiece]Append[[date]Format[rest format]]
+		
+	}
+}
+
+RFC 2822@Date Time[date:out]
+{
+	out <- [date]Format["d B Y H:m:s -0000"]
+}
+
+//Preferred format for HTTP as specified by RFC 2616
+RFC 2616@Date Time[date:out]
+{
+	out <- [[date]Format["b, D B Y H:m:s"]]Append[" GMT"]
+}
+
+
--- a/interp.c	Mon Nov 30 23:47:08 2009 -0500
+++ b/interp.c	Tue Dec 01 03:59:31 2009 -0500
@@ -1482,6 +1482,11 @@
 	aworker->input_types[0] = BUILTIN_TYPE_WHOLE;
 	aworker->input_types[1] = BUILTIN_TYPE_WHOLE;
 
+	aworker = create_worker(prog, "%@Whole Number", 2, 1, WORKER_TYPE);
+	aworker->implement_func=(custom_worker *)vis_whole_modulus;
+	aworker->input_types[0] = BUILTIN_TYPE_WHOLE;
+	aworker->input_types[1] = BUILTIN_TYPE_WHOLE;
+
 	//add_method(this_comp, aworker);
 	
 	current_method = 0;
@@ -1567,6 +1572,14 @@
 	aworker->implement_func=(custom_worker *)vis_real_sqrt;
 	aworker->input_types[0] = BUILTIN_TYPE_REAL;
 
+	aworker = create_worker(prog, "Truncate to Whole@Real Number", 1, 1, WORKER_TYPE);
+	aworker->implement_func=(custom_worker *)vis_whole_fromreal;
+	aworker->input_types[0] = BUILTIN_TYPE_REAL;
+
+	aworker = create_worker(prog, "<Whole Number@Real Number", 1, 1, WORKER_TYPE);
+	aworker->implement_func=(custom_worker *)vis_real_fromwhole;
+	aworker->input_types[0] = BUILTIN_TYPE_WHOLE;
+
 	//add_method(this_comp, aworker);
 	
 	current_method = 0;
--- a/interp.h	Mon Nov 30 23:47:08 2009 -0500
+++ b/interp.h	Tue Dec 01 03:59:31 2009 -0500
@@ -113,6 +113,7 @@
 int vis_whole_and(datum ** inputlist, queue_entry * worker_entry);
 int vis_whole_lsh(datum ** inputlist, queue_entry * worker_entry);
 int vis_whole_rsh(datum ** inputlist, queue_entry * worker_entry);
+int vis_whole_modulus(datum ** inputlist, queue_entry * worker_entry);
 int vis_inttostring(datum ** inputlist, queue_entry * worker_entry);
 int vis_stringequal(datum ** inputlist, queue_entry * worker_entry);
 int vis_string_split(datum ** inputlist, queue_entry * worker_entry);
@@ -136,6 +137,8 @@
 int vis_greaterreal(datum ** inputlist, queue_entry * worker_entry);
 int vis_lesserreal(datum ** inputlist, queue_entry * worker_entry);
 int vis_realtostring(datum ** inputlist, queue_entry * worker_entry);
+int vis_whole_fromreal(datum ** inputlist, queue_entry * worker_entry);
+int vis_real_fromwhole(datum ** inputlist, queue_entry * worker_entry);
 //Index, Append, Swap, Insert, Remove, Set, Length, New
 int vis_list_index(datum ** inputlist, queue_entry * worker_entry);
 int vis_list_append(datum ** inputlist, queue_entry * worker_entry);
--- a/number.c	Mon Nov 30 23:47:08 2009 -0500
+++ b/number.c	Tue Dec 01 03:59:31 2009 -0500
@@ -180,6 +180,14 @@
 	return 0;
 }
 
+int vis_whole_modulus(datum ** inputlist, queue_entry * worker_entry)
+{
+	inputlist[0] = copy_datum(inputlist[0], 0);
+	inputlist[0]->c.integers.num_a %= inputlist[1]->c.integers.num_a;
+	release_ref(inputlist[1]);
+	return 0;
+}
+
 
 int vis_greaterint(datum ** inputlist, queue_entry * worker_entry)
 {
@@ -424,4 +432,14 @@
 	release_ref(inputlist[0]);
 	inputlist[0] = output;
 	return 0;
-}
\ No newline at end of file
+}
+
+int vis_real_fromwhole(datum ** inputlist, queue_entry * worker_entry)
+{
+	datum * output = new_datum(BUILTIN_TYPE_REAL, 3, 0, worker_entry->instance->def->program);
+	output->c.real = inputlist[0]->c.integers.num_a;
+	release_ref(inputlist[0]);
+	inputlist[0] = output;
+	return 0;
+}
+