changeset 145:357f4ce3ca6d

Add incredibly ugly implementation of Read Delim to TCP Connection
author Mike Pavone <pavone@retrodev.com>
date Sun, 21 Nov 2010 22:08:17 -0500
parents 65ebd1ce2611
children 1f39e69446f9
files net.rhope
diffstat 1 files changed, 174 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/net.rhope	Sun Nov 21 18:21:45 2010 -0500
+++ b/net.rhope	Sun Nov 21 22:08:17 2010 -0500
@@ -323,17 +323,23 @@
 {
 	oldlen <- [inprog]Length
 	srclen <- [src]Length
-	out <- [_internal_array_copychunk[src, 0, inprog, oldlen, srclen]]Length <<[[oldlen]+[srclen]]
+	If[srclen]
+	{
+		out <- [_internal_array_copychunk[src, 0, inprog, oldlen, srclen]]Length <<[[oldlen]+[srclen]]
+	}{
+		out <- inprog
+	}
 }
 
 _Merge Buffers[buflist:out]
 {
 	If[[[buflist]Length]=[1]]
 	{
-		out <- [buflist]Index[0]
+		out <- [buflist]Index[0]{}
+		{ Print["This shouldn't happen!!!!"] }
 	}{
 		len <- Fold[_Add Len[?], 0, buflist]
-		out <- Fold[_Merge One Buf[?], _internal_array_allocnaked[len, [[buflist]Index[0]]Eltype >>], buflist]
+		out <- Fold[_Merge One Buf[?], _internal_array_allocnaked[len, UInt8()], buflist]
 	}
 }
 
@@ -364,6 +370,171 @@
 	}
 }
 
+_Check Partial[buffer,delim,offset:partial,none]
+{
+	none <- If[[offset]=[[buffer]Length]] {}
+	{
+		left <- [[buffer]Length]-[offset]
+		If[_internal_memcmp_offset[buffer, offset, delim, 0, left]]
+		{
+			partial,none <- _Check Partial[buffer,delim,[offset]+[1]]
+		}{
+			partial <- offset
+		}
+	}
+}
+
+_Check Buffer[buffer,delim,offset:out,partial,none]
+{
+	dlen <- [delim]Length
+	blen <- [buffer]Length
+	If[[[offset]+[dlen]]<=[blen]]
+	{
+		If[_internal_memcmp_offset[buffer, offset, delim, 0, dlen]]
+		{
+			out,partial,none <- _Check Buffer[buffer,delim,[offset]+[1]]
+		}{
+			out <- offset
+		}
+	}{
+		partial,none <- _Check Partial[buffer,delim,offset]
+	}
+}
+
+_Check Split[old,new,delim,offset:out,not split]
+{
+	,not split <- If[[offset]<[[old]Length]]
+	{
+		left <- [[old]Length]-[offset]
+		If[_internal_memcmp_offset[old, offset, delim, 0, left]]
+		{
+			next <- [offset]+[1]
+		}{
+			If[_internal_memcmp_offset[new, 0, delim, left, [[delim]Length]-[left]]]
+			{
+				next <- [offset]+[1]
+			}{
+				out <- offset
+			}
+		}
+		out,not split <- _Check Split[old,new,delim,next]
+	}
+}
+
+_Read Delim@TCP Connection[con,delim,poffset,buflist:data,out con,err]
+{
+	read[[con]Filedes >>, _internal_array_allocnaked[512i32, UInt8()], 512i64]
+	{ numread <- Trunc Int32[~] }
+	{ outbuf <- [~]Length <<[numread] }
+	
+	If[[numread]=[-1]]
+	{
+		If[Wait for IO[[con]Filedes >>, 1]]
+		{
+			data,out con,err <- [con]_Read Delim[delim,poffset,buflist]
+		}{
+			err <- [Fold[_Add Len[?], 0, buflist]]+[Length[[con]Buffer >>]]
+		}
+	}{
+		,checknew <- If[[poffset]>=[0]]
+		{
+			If[[[delim]Length]>[[outbuf]Length]]
+			{
+				//Avoid possibility of having to check across more than 2 buffers
+				data,out con,err <-[[con]Buffer <<[
+						_Merge Buffers[[[buflist]Append[[con]Buffer >>]]Append[outbuf]]
+					]
+				]Read Delim[delim]
+			}{
+				,checknew <- _Check Split[[con]Buffer >>, outbuf, delim ,poffset]
+				{
+					before <- [_internal_array_copychunk[[con]Read Buffer >>, 0, _internal_array_allocnaked[~, UInt8()], 0, ~]
+					]Length <<[~]
+					
+					data <- _Merge Buffers[[buflist]Append[before]]
+					after off <- [[delim]Length]- [[[[con]Buffer >>]Length]-[~]]
+					rbufferlen <- [[outbuf]Length]-[after off]
+					out con <- [con]Read Buffer <<[
+						[_internal_array_copychunk[outbuf, after off, 
+							_internal_array_allocnaked[rbufferlen, UInt8()], 0, rbufferlen]
+						]Length <<[rbufferlen]
+					]
+				}
+			}
+		}
+		Val[checknew]
+		{
+			,npoffset <- _Check Buffer[outbuf,delim,0]
+			{
+				before <- [_internal_array_copychunk[outbuf, 0, _internal_array_allocnaked[~, UInt8()], 0, ~]
+						]Length <<[~]
+				If[[[con]Read Buffer >>]Length]
+				{
+					
+					tomerge <- [[buflist]Append[[con]Read Buffer >>]]Append[before]
+				}{
+					tomerge <- [buflist]Append[before]
+				}
+				data <- _Merge Buffers[tomerge]
+				rbufferlen <- [[outbuf]Length]-[[~]+[[delim]Length]]
+				out con <- [con]Read Buffer <<[
+					[_internal_array_copychunk[outbuf, [~]+[[delim]Length], 
+						_internal_array_allocnaked[rbufferlen, UInt8()], 0, rbufferlen]
+					]Length <<[rbufferlen]
+				]
+			}{
+				
+				If[[[con]Read Buffer >>]Length]
+				{
+					nbuflist <- [buflist]Append[[con]Read Buffer >>]
+				}{
+					nbuflist <- Val[buflist]
+				}
+				ncon <- [con]Read Buffer <<[outbuf]
+			}{
+				If[[[con]Read Buffer >>]Length]
+				{
+					nbuflist <- [[buflist]Append[[con]Read Buffer >>]]Append[outbuf]
+					ncon <- [con]Read Buffer <<[Array[]]
+				}{
+					nbuflist <- [buflist]Append[outbuf]
+					ncon <- Val[con]
+				}
+			}
+		}
+		data,out con,err <- [ncon]_Read Delim[delim,npoffset,nbuflist]
+	}
+}
+
+Read Delim@TCP Connection[con,delim(Array):data,out con,err]
+{
+	,poffset <-_Check Buffer[[con]Read Buffer >>, delim,0]
+	{
+		data <- [_internal_array_copychunk[[con]Read Buffer >>, 0, _internal_array_allocnaked[~, UInt8()], 0, ~]]Length <<[~]
+		rbufferlen <- [[[con]Read Buffer >>]Length]-[[~]+[[delim]Length]]
+		out con <- [con]Read Buffer <<[
+			[_internal_array_copychunk[[con]Read Buffer >>, [~]+[[delim]Length], 
+				_internal_array_allocnaked[rbufferlen, UInt8()], 0, rbufferlen]
+			]Length <<[rbufferlen]
+		]
+	}{  
+		buflist <- ()
+		ncon <- Val[con]
+	}{ 
+		If[[[con]Read Buffer >>]Length]
+		{
+			ncon <- [con]Read Buffer <<[Array[]]
+			buflist <- [()]Append[[con]Read Buffer >>] 
+		}{
+			ncon <- Val[con]
+			buflist <- ()
+		}
+		poffset <- -1
+		
+	}
+	data,out con,err <- [ncon]_Read Delim[delim,poffset,buflist]
+}
+
 Close@TCP Connection[con:out]
 {
 	out <- close[[con]Filedes >>]