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.catstring (? string, ? string) (? string)\n"
"func runtime.cmpstring (? string, ? string) (? int)\n" "func runtime.cmpstring (? string, ? string) (? int)\n"
"func runtime.slicestring (? string, ? int, ? int) (? string)\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.indexstring (? string, ? int) (? uint8)\n"
"func runtime.intstring (? int64) (? string)\n" "func runtime.intstring (? int64) (? string)\n"
"func runtime.slicebytetostring (? []uint8) (? string)\n" "func runtime.slicebytetostring (? []uint8) (? string)\n"

View File

@ -55,7 +55,7 @@ truncfltlit(Mpflt *oldv, Type *t)
void void
convlit(Node **np, Type *t) 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 catstring(string, string) string
func cmpstring(string, string) int func cmpstring(string, string) int
func slicestring(string, int, int) string func slicestring(string, int, int) string
func slicestring1(string, int) string
func indexstring(string, int) byte func indexstring(string, int) byte
func intstring(int64) string func intstring(int64) string
func slicebytetostring([]byte) string func slicebytetostring([]byte) string

View File

@ -918,10 +918,16 @@ walkexpr(Node **np, NodeList **init)
case OSLICESTR: case OSLICESTR:
// sys_slicestring(s, lb, hb) // sys_slicestring(s, lb, hb)
n = mkcall("slicestring", n->type, init, if(n->right->right) {
conv(n->left, types[TSTRING]), n = mkcall("slicestring", n->type, init,
conv(n->right->left, types[TINT]), conv(n->left, types[TSTRING]),
conv(n->right->right, types[TINT])); 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; goto ret;
case OINDEXSTR: 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); // 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) { func indexstring(s String, i int32) (b byte) {
if(i < 0 || i >= s.len) { if(i < 0 || i >= s.len) {
runtime·printpc(&s); runtime·printpc(&s);

View File

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