summaryrefslogtreecommitdiff
path: root/src/pkg/runtime/string.cgo
diff options
context:
space:
mode:
Diffstat (limited to 'src/pkg/runtime/string.cgo')
-rw-r--r--src/pkg/runtime/string.cgo31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/pkg/runtime/string.cgo b/src/pkg/runtime/string.cgo
index 4c85766c2..2cb518c6f 100644
--- a/src/pkg/runtime/string.cgo
+++ b/src/pkg/runtime/string.cgo
@@ -4,6 +4,7 @@
package runtime
#include "runtime.h"
+#include "malloc.h"
String emptystring;
@@ -210,6 +211,12 @@ func slicebytetostring(b Slice) (s String) {
mcpy(s.str, b.array, s.len);
}
+func stringtoslicebyte(s String) (b Slice) {
+ b.array = mallocgc(s.len, RefNoPointers, 1, 1);
+ b.len = s.len;
+ b.cap = s.len;
+ mcpy(b.array, s.str, s.len);
+}
func sliceinttostring(b Slice) (s String) {
int32 siz1, siz2, i;
@@ -233,6 +240,30 @@ func sliceinttostring(b Slice) (s String) {
s.len = siz2;
}
+func stringtosliceint(s String) (b Slice) {
+ int32 n;
+ int32 dum, *r;
+ uint8 *p, *ep;
+
+ // two passes.
+ // unlike sliceinttostring, no race because strings are immutable.
+ p = s.str;
+ ep = s.str+s.len;
+ n = 0;
+ while(p < ep) {
+ p += charntorune(&dum, p, ep-p);
+ n++;
+ }
+
+ b.array = mallocgc(n*sizeof(r[0]), RefNoPointers, 1, 1);
+ b.len = n;
+ b.cap = n;
+ p = s.str;
+ r = (int32*)b.array;
+ while(p < ep)
+ p += charntorune(r++, p, ep-p);
+}
+
enum
{
Runeself = 0x80,