Mercurial > repos > rhope
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 + } +} +