# HG changeset patch # User Mike Pavone # Date 1276888029 14400 # Node ID c40c3d399133ecd659241d4b9b095713cfbd6474 # Parent 1bfcf5f8fa69e014ce54288fe7b037a97a19ab12 Add Int32@String and Get Char. Fix stack bug diff -r 1bfcf5f8fa69 -r c40c3d399133 kernel.rhope --- 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] diff -r 1bfcf5f8fa69 -r c40c3d399133 runtime/func.h --- 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\ diff -r 1bfcf5f8fa69 -r c40c3d399133 runtime/object.h --- 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; diff -r 1bfcf5f8fa69 -r c40c3d399133 string.rhope --- 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