// Copyright 2009, 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. 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) intgo runtime_findnull(const byte *s) { if(s == nil) return 0; return __builtin_strlen((const char*) s); } String runtime_gostringnocopy(const byte *str) { String s; s.str = str; s.len = runtime_findnull(str); return s; } enum { Runeself = 0x80, }; func stringiter(s String, k int) (retk int) { int32 l; if(k >= s.len) { // retk=0 is end of iteration retk = 0; goto out; } l = s.str[k]; if(l < Runeself) { retk = k+1; goto out; } // multi-char rune retk = k + charntorune(&l, s.str+k, s.len-k); out: } func stringiter2(s String, k int) (retk int, retv int) { if(k >= s.len) { // retk=0 is end of iteration retk = 0; retv = 0; goto out; } retv = s.str[k]; if(retv < Runeself) { retk = k+1; goto out; } // multi-char rune retk = k + charntorune(&retv, s.str+k, s.len-k); out: }