Imported Upstream version 4.8.1
[platform/upstream/gcc48.git] / libgo / runtime / string.goc
index 486caf0..04ecbe6 100644 (file)
@@ -6,10 +6,13 @@ package runtime
 #include "runtime.h"
 #include "arch.h"
 #include "malloc.h"
+#include "go-string.h"
 
 #define charntorune(pv, str, len) __go_get_rune(str, len, pv)
 
-int32
+const String   runtime_emptystring;
+
+intgo
 runtime_findnull(const byte *s)
 {
        if(s == nil)
@@ -17,13 +20,45 @@ runtime_findnull(const byte *s)
        return __builtin_strlen((const char*) s);
 }
 
+static String
+gostringsize(intgo l, byte** pmem)
+{
+       String s;
+       byte *mem;
+
+       if(l == 0) {
+               *pmem = nil;
+               return runtime_emptystring;
+       }
+       // leave room for NUL for C runtime (e.g., callers of getenv)
+       mem = runtime_mallocgc(l+1, FlagNoPointers, 1, 0);
+       s.str = mem;
+       s.len = l;
+       mem[l] = 0;
+       *pmem = mem;
+       return s;
+}
+
+String
+runtime_gostring(const byte *str)
+{
+       intgo l;
+       String s;
+       byte *mem;
+
+       l = runtime_findnull(str);
+       s = gostringsize(l, &mem);
+       runtime_memmove(mem, str, l);
+       return s;
+}
+
 String
 runtime_gostringnocopy(const byte *str)
 {
        String s;
        
-       s.__data = (const unsigned char *) str;
-       s.__length = runtime_findnull(str);
+       s.str = str;
+       s.len = runtime_findnull(str);
        return s;
 }
 
@@ -32,47 +67,43 @@ enum
        Runeself        = 0x80,
 };
 
-func stringiter(s String, k int32) (retk int32) {
-       int32 l, n;
+func stringiter(s String, k int) (retk int) {
+       int32 l;
 
-       if(k >= s.__length) {
+       if(k >= s.len) {
                // retk=0 is end of iteration
                retk = 0;
                goto out;
        }
 
-       l = s.__data[k];
+       l = s.str[k];
        if(l < Runeself) {
                retk = k+1;
                goto out;
        }
 
        // multi-char rune
-       n = charntorune(&l, s.__data+k, s.__length-k);
-       retk = k + (n ? n : 1);
+       retk = k + charntorune(&l, s.str+k, s.len-k);
 
 out:
 }
 
-func stringiter2(s String, k int32) (retk int32, retv int32) {
-       int32 n;
-
-       if(k >= s.__length) {
+func stringiter2(s String, k int) (retk int, retv int32) {
+       if(k >= s.len) {
                // retk=0 is end of iteration
                retk = 0;
                retv = 0;
                goto out;
        }
 
-       retv = s.__data[k];
+       retv = s.str[k];
        if(retv < Runeself) {
                retk = k+1;
                goto out;
        }
 
        // multi-char rune
-       n = charntorune(&retv, s.__data+k, s.__length-k);
-       retk = k + (n ? n : 1);
+       retk = k + charntorune(&retv, s.str+k, s.len-k);
 
 out:
 }