# HG changeset patch # User Mike Pavone # Date 1290395297 18000 # Node ID 357f4ce3ca6dca8f03ce6672b0217766d659402f # Parent 65ebd1ce261187e6bf202529cbde909a1d35b768 Add incredibly ugly implementation of Read Delim to TCP Connection diff -r 65ebd1ce2611 -r 357f4ce3ca6d net.rhope --- 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 >>]