// 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" #define charntorune(pv, str, len) __go_get_rune(str, len, pv) int32 runtime_findnull(const byte *s) { if(s == nil) return 0; return __builtin_strlen((const char*) s); } String runtime_gostringnocopy(byte *str) { String s; s.__data = (const unsigned char *) str; s.__length = runtime_findnull(str); return s; } enum { Runeself = 0x80, }; func stringiter(s String, k int32) (retk int32) { int32 l, n; if(k >= s.__length) { // retk=0 is end of iteration retk = 0; goto out; } l = s.__data[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); out: } func stringiter2(s String, k int32) (retk int32, retv int32) { int32 n; if(k >= s.__length) { // retk=0 is end of iteration retk = 0; retv = 0; goto out; } retv = s.__data[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); out: }