Skip to content
This repository has been archived by the owner on May 2, 2018. It is now read-only.

Commit

Permalink
x[y:] for strings
Browse files Browse the repository at this point in the history
  • Loading branch information
rsc committed Nov 20, 2009
1 parent 3e8bb54 commit aa4c638
Show file tree
Hide file tree
Showing 6 changed files with 32 additions and 6 deletions.
1 change: 1 addition & 0 deletions src/cmd/gc/builtin.c.boot
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
2 changes: 1 addition & 1 deletion src/cmd/gc/const.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ truncfltlit(Mpflt *oldv, Type *t)
void
convlit(Node **np, Type *t)
{
return convlit1(np, t, 0);
convlit1(np, t, 0);
}

/*
Expand Down
1 change: 1 addition & 0 deletions src/cmd/gc/runtime.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
14 changes: 10 additions & 4 deletions src/cmd/gc/walk.c
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
18 changes: 18 additions & 0 deletions src/pkg/runtime/string.cgo
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion test/ken/string.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ main()
}

/* slice strings */
print(c[0:3], c[3:6]);
print(c[0:3], c[3:]);

print("\n");

Expand Down

0 comments on commit aa4c638

Please sign in to comment.