changeset 71:c40c3d399133

Add Int32@String and Get Char. Fix stack bug
author Mike Pavone <pavone@retrodev.com>
date Fri, 18 Jun 2010 15:07:09 -0400
parents 1bfcf5f8fa69
children f7bcf3db1342
files kernel.rhope runtime/func.h runtime/object.h string.rhope
diffstat 4 files changed, 49 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/kernel.rhope	Wed Jun 16 04:36:53 2010 +0000
+++ b/kernel.rhope	Fri Jun 18 15:07:09 2010 -0400
@@ -38,6 +38,7 @@
 Foreign C:libc
 {
 	write[filedes(Int32,Naked),buf(Array,Raw Pointer),nbyte(Int64,Naked):written(Int32,Naked)]
+	read[filedes(Int32,Naked),buf(Array,Raw Pointer,Mutable),nbyte(Int64,Naked):read(Int64,Naked),buf]
 }
 
 _Print Int32[n,buf:out]
--- a/runtime/func.h	Wed Jun 16 04:36:53 2010 +0000
+++ b/runtime/func.h	Fri Jun 18 15:07:09 2010 -0400
@@ -124,10 +124,11 @@
 #define Call(tocall, numparams, resumeto, myname)\
 			cdata->func = RES_  ## resumeto ## _ ## myname;\
 			cdata->num_params = numparams;\
+			cdata->vars = lv_ ## myname;\
 			goto sf_ ## tocall;\
 r ## resumeto ## _ ## myname:\
 			my_cdata = cdata->lastframe;\
-			lv_ ## myname = (lt_ ## myname *)(my_cdata->params+my_cdata->callspace);
+			lv_ ## myname = cdata->vars;
 			
 	
 #define FreeCall\
--- a/runtime/object.h	Wed Jun 16 04:36:53 2010 +0000
+++ b/runtime/object.h	Fri Jun 18 15:07:09 2010 -0400
@@ -44,6 +44,7 @@
 #pragma pack(push,1)
 struct calldata {
 	struct calldata	*lastframe;
+	void            *vars;
 	uint32_t 		func;
 	uint16_t 		num_params;
 	uint16_t		callspace;
--- a/string.rhope	Wed Jun 16 04:36:53 2010 +0000
+++ b/string.rhope	Fri Jun 18 15:07:09 2010 -0400
@@ -96,6 +96,51 @@
 	{ out <- write[1i32, [Array[]]Append[10u8], 1i64] }
 }
 
+Get Char[:out]
+{
+	read[0, [Array[]]Set[0, 0u8], 1i64]
+	{}
+	{ out <- String[~] }
+}
+
+_String to Int32[current,index,array:out]
+{
+	char <- [array]Index[index]
+	{
+		If[[char]<[48u8]]
+		{
+			out <- Val[current]
+		}{
+			If[[char]>[57u8]]
+			{
+				out <- Val[current]
+			}{
+				out <- _String to Int32[[[current]*[10i32]]+[Int32[[char]-[48u8]]], [index]+[1], array]
+			}
+		}
+		
+	}{
+		out <- Val[current]
+	}
+}
+
+Int32@String[string:out]
+{
+	buf <- [string]Buffer >>
+	[buf]Index[0]
+	{
+		If[[~]=[45u8]]
+		{
+			out <- [0i32]-[_String to Int32[0i32, 1, buf]]
+		}{
+			out <- _String to Int32[0i32, 0, buf]
+		}
+	}{
+		out <- 0i32
+	}
+	
+}
+
 Flatten@String[string:out]
 {
 	out <- string