diff string.rhope @ 100:f51c4c17457c

Broken port of parser to compiler
author Mike Pavone <pavone@retrodev.com>
date Mon, 09 Aug 2010 02:03:57 -0400
parents e09c2d1d6d5b
children 2d2da148d844 43cc42df26cc
line wrap: on
line diff
--- a/string.rhope	Fri Aug 06 01:42:37 2010 -0400
+++ b/string.rhope	Mon Aug 09 02:03:57 2010 -0400
@@ -106,7 +106,7 @@
 	{ out <- String[~] }
 }
 
-_String to Int32[current,index,array:out]
+_String to Int[current,index,array,ten,conv:out]
 {
 	char <- [array]Index[index]
 	{
@@ -118,7 +118,7 @@
 			{
 				out <- Val[current]
 			}{
-				out <- _String to Int32[[[current]*[10i32]]+[Int32[[char]-[48u8]]], [index]+[1], array]
+				out <- _String to Int[[[current]*[ten]]+[[conv]Call[[char]-[48u8]]], [index]+[1], array, ten, conv]
 			}
 		}
 		
@@ -127,6 +127,46 @@
 	}
 }
 
+U8toI8[val:out]
+{
+	out <- Trunc Int8[Int16[val]]
+}
+
+Int8@String[string:out]
+{
+	buf <- [string]Buffer >>
+	[buf]Index[0]
+	{
+		If[[~]=[45u8]]
+		{
+			out <- [0i8]-[_String to Int[0i8, 1, buf, 10i8, U8toI8[?]]]
+		}{
+			out <- _String to Int[0i8, 0, buf, 10i8, U8toI8[?]]
+		}
+	}{
+		out <- 0i8
+	}
+	
+}
+
+
+Int16@String[string:out]
+{
+	buf <- [string]Buffer >>
+	[buf]Index[0]
+	{
+		If[[~]=[45u8]]
+		{
+			out <- [0i16]-[_String to Int[0i16, 1, buf, 10i16, Int16[?]]]
+		}{
+			out <- _String to Int[0i16, 0, buf, 10i16, Int16[?]]
+		}
+	}{
+		out <- 0i16
+	}
+	
+}
+
 Int32@String[string:out]
 {
 	buf <- [string]Buffer >>
@@ -134,9 +174,9 @@
 	{
 		If[[~]=[45u8]]
 		{
-			out <- [0i32]-[_String to Int32[0i32, 1, buf]]
+			out <- [0i32]-[_String to Int[0i32, 1, buf, 10i32, Int32[?]]]
 		}{
-			out <- _String to Int32[0i32, 0, buf]
+			out <- _String to Int[0i32, 0, buf, 10i32, Int32[?]]
 		}
 	}{
 		out <- 0i32
@@ -144,6 +184,103 @@
 	
 }
 
+_Hex Int32[str,cur,idx:out]
+{
+	char <- [str]Byte[idx]
+	{
+		//0-9
+		[char]Between[47u8, 58u8]
+		{
+			adjust <- 48u8
+		}{
+			//A-F
+			[char]Between[64u8, 71u8]
+			{
+				adjust <- 55u8
+			}{
+				//a-f
+				[char]Between[96u8, 103u8]
+				{
+					adjust <- 87u8
+				}{
+					out <- cur
+				}
+			}
+		}
+		Val[adjust]
+		{
+			out <- _Hex Int32[str, [[cur]*[16i32]]+[Int32[[char]-[adjust]]], [idx]+[1]]
+		}
+	}{
+		out <- cur
+	}
+}
+
+Hex Int32[str:out]
+{
+	out <- _Hex Int32[str, 0i32, 0]
+}
+
+Int64@String[string:out]
+{
+	buf <- [string]Buffer >>
+	[buf]Index[0]
+	{
+		If[[~]=[45u8]]
+		{
+			out <- [0i64]-[_String to Int[0i64, 1, buf, 10i64, Int64[?]]]
+		}{
+			out <- _String to Int[0i64, 0, buf, 10i64, Int64[?]]
+		}
+	}{
+		out <- 0i64
+	}
+	
+}
+
+UInt8@String[string:out]
+{
+	out <- _String to Int[0u8, 0, [string]Buffer >>, 10u8, Val[?]]	
+}
+
+
+UInt16@String[string:out]
+{
+	out <- _String to Int[0u16, 0, [string]Buffer >>, 10u16, UInt16[?]]	
+	
+}
+
+UInt32@String[string:out]
+{
+	out <- _String to Int[0u32, 0, [string]Buffer >>, 10u32, UInt32[?]]	
+	
+}
+
+UInt64@String[string:out]
+{
+	out <- _String to Int[0u64, 0, [string]Buffer >>, 10u64, UInt64[?]]	
+}
+
+Int8@String Slice[string:out]
+{
+	out <- Int8[[string]Flatten]
+}
+
+Int8@String Cat[string:out]
+{
+	out <- Int8[[string]Flatten]
+}
+
+Int16@String Slice[string:out]
+{
+	out <- Int16[[string]Flatten]
+}
+
+Int16@String Cat[string:out]
+{
+	out <- Int16[[string]Flatten]
+}
+
 Int32@String Slice[string:out]
 {
 	out <- Int32[[string]Flatten]
@@ -154,6 +291,62 @@
 	out <- Int32[[string]Flatten]
 }
 
+Int64@String Slice[string:out]
+{
+	out <- Int64[[string]Flatten]
+}
+
+Int64@String Cat[string:out]
+{
+	out <- Int64[[string]Flatten]
+}
+
+UInt8@String Slice[string:out]
+{
+	out <- UInt8[[string]Flatten]
+}
+
+UInt8@String Cat[string:out]
+{
+	out <- UInt8[[string]Flatten]
+}
+
+UInt16@String Slice[string:out]
+{
+	out <- UInt16[[string]Flatten]
+}
+
+UInt16@String Cat[string:out]
+{
+	out <- UInt16[[string]Flatten]
+}
+
+UInt32@String Slice[string:out]
+{
+	out <- UInt32[[string]Flatten]
+}
+
+UInt32@String Cat[string:out]
+{
+	out <- UInt32[[string]Flatten]
+}
+
+UInt64@String Slice[string:out]
+{
+	out <- UInt64[[string]Flatten]
+}
+
+UInt64@String Cat[string:out]
+{
+	out <- UInt64[[string]Flatten]
+}
+
+//TODO: Implement me once Real64 support is added
+Real64[string:out]
+{
+	out <- string
+}
+
 Flatten@String[string:out]
 {
 	out <- string
@@ -236,10 +429,21 @@
 
 Slice@String[string,slicepoint:left,right]
 {
-	//TODO: Handle invalid slicepoints
-	sliceoffset <- CPOff to BOff[[string]Buffer >>, 0i32, 0i32, slicepoint]
-	left <- String Slice[string, 0i32, slicepoint, sliceoffset]
-	right <- String Slice[string, sliceoffset, [[string]Length >>]-[slicepoint], [[[string]Buffer >>]Length]-[sliceoffset]]
+	If[[slicepoint]>=[[string]Length]]
+	{
+		left <- string
+		right <- ""
+	}{
+		If[[slicepoint]<=[0]]
+		{
+			left <- ""
+			right <- string
+		}{
+			sliceoffset <- CPOff to BOff[[string]Buffer >>, 0i32, 0i32, slicepoint]
+			left <- String Slice[string, 0i32, slicepoint, sliceoffset]
+			right <- String Slice[string, sliceoffset, [[string]Length >>]-[slicepoint], [[[string]Buffer >>]Length]-[sliceoffset]]
+		}
+	}
 }
 
 Byte@String[string,index:out,invalid]
@@ -373,10 +577,21 @@
 
 Slice@String Slice[string,slicepoint:left,right]
 {
-	//TODO: Handle invalid slicepoints
-	sliceoffset <- CPOff to BOff[[[string]Source >>]Buffer >>, 0i32, [string]Offset >>, slicepoint]
-	left <- String Slice[[string]Source >>, [string]Offset >>, slicepoint, [sliceoffset]-[[string]Offset >>]]
-	right <- String Slice[[string]Source >>, sliceoffset, [[string]Length >>]-[slicepoint], [[string]Byte Length]-[[sliceoffset]-[[string]Offset >>]]]
+	If[[slicepoint]>=[[string]Length]]
+	{
+		left <- string
+		right <- ""
+	}{
+		If[[slicepoint]<=[0]]
+		{
+			left <- ""
+			right <- string
+		}{
+			sliceoffset <- CPOff to BOff[[[string]Source >>]Buffer >>, 0i32, [string]Offset >>, slicepoint]
+			left <- String Slice[[string]Source >>, [string]Offset >>, slicepoint, [sliceoffset]-[[string]Offset >>]]
+			right <- String Slice[[string]Source >>, sliceoffset, [[string]Length >>]-[slicepoint], [[string]Byte Length]-[[sliceoffset]-[[string]Offset >>]]]
+		}
+	}
 }
 
 Blueprint String Cat
@@ -679,3 +894,65 @@
 	{ out <- () }
 }
 
+In[needle,haystack:out]
+{
+	If[haystack]
+	{
+		out <- If[[[haystack]Slice[Length[needle]]]=[needle]] {}
+		{
+			[haystack]Slice[1] {}
+			{ out <- [needle]In[~] }
+		}
+	}{
+		out <- No
+	}
+}
+
+Left Trim[string,trim:trimmed]
+{
+	If[ [[string]Length] > [0] ]
+	{
+		first,rest <- [string]Slice[1]
+		If[ [first]In[trim] ]
+		{
+			trimmed <- Left Trim[rest, trim]
+		}{
+			trimmed <- string
+		}
+	}{
+		trimmed <- string
+	}
+}
+
+Right Trim[string,trim:trimmed]
+{
+	If[ [[string]Length] > [0] ]
+	{
+		rest,last <- [string]Slice[ [[string]Length] - [1]]
+		If[ [last]In[trim] ]
+		{
+			trimmed <- Right Trim[rest, trim]
+		}{
+			trimmed <- string
+		}
+	}{
+		trimmed <- string
+	}
+}
+
+Trim[string,trim:trimmed]
+{
+	left <- Left Trim[string, trim]
+	trimmed <- Right Trim[left, trim]
+}
+
+Contains[haystack,needle:out]
+{
+	[haystack]Partition[needle]
+	{
+		out <- Yes	
+	} {} {} {
+		out <- No
+	}
+}
+