x[y:] for strings

R=ken2
https://golang.org/cl/157114
This commit is contained in:
Russ Cox 2009-11-20 11:42:28 -08:00
parent 3e8bb54c2f
commit aa4c638b7b
6 changed files with 32 additions and 6 deletions

View file

@ -19,6 +19,7 @@ char *runtimeimport =
"func runtime.catstring (? string, ? string) (? string)\n"
"func runtime.cmpstring (? string, ? string) (? int)\n"
"func runtime.slicestring (? string, ? int, ? int) (? string)\n"
"func runtime.slicestring1 (? string, ? int) (? string)\n"
"func runtime.indexstring (? string, ? int) (? uint8)\n"
"func runtime.intstring (? int64) (? string)\n"
"func runtime.slicebytetostring (? []uint8) (? string)\n"

View file

@ -55,7 +55,7 @@ truncfltlit(Mpflt *oldv, Type *t)
void
convlit(Node **np, Type *t)
{
return convlit1(np, t, 0);
convlit1(np, t, 0);
}
/*

View file

@ -27,6 +27,7 @@ func printsp()
func catstring(string, string) string
func cmpstring(string, string) int
func slicestring(string, int, int) string
func slicestring1(string, int) string
func indexstring(string, int) byte
func intstring(int64) string
func slicebytetostring([]byte) string

View file

@ -918,10 +918,16 @@ walkexpr(Node **np, NodeList **init)
case OSLICESTR:
// sys_slicestring(s, lb, hb)
n = mkcall("slicestring", n->type, init,
conv(n->left, types[TSTRING]),
conv(n->right->left, types[TINT]),
conv(n->right->right, types[TINT]));
if(n->right->right) {
n = mkcall("slicestring", n->type, init,
conv(n->left, types[TSTRING]),
conv(n->right->left, types[TINT]),
conv(n->right->right, types[TINT]));
} else {
n = mkcall("slicestring1", n->type, init,
conv(n->left, types[TSTRING]),
conv(n->right->left, types[TINT]));
}
goto ret;
case OINDEXSTR:

View file

@ -142,6 +142,24 @@ func slicestring(si String, lindex int32, hindex int32) (so String) {
// mcpy(so.str, si.str+lindex, l);
}
func slicestring1(si String, lindex int32) (so String) {
int32 l;
if(lindex < 0 || lindex > si.len) {
runtime·printpc(&si);
prints(" ");
prbounds("slice", lindex, si.len, si.len);
}
l = si.len-lindex;
so.str = si.str + lindex;
so.len = l;
// alternate to create a new string
// so = gostringsize(l);
// mcpy(so.str, si.str+lindex, l);
}
func indexstring(s String, i int32) (b byte) {
if(i < 0 || i >= s.len) {
runtime·printpc(&s);

View file

@ -64,7 +64,7 @@ main()
}
/* slice strings */
print(c[0:3], c[3:6]);
print(c[0:3], c[3:]);
print("\n");