aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/string.c
diff options
context:
space:
mode:
authorKen Thompson <ken@golang.org>2009-04-09 18:16:21 -0700
committerKen Thompson <ken@golang.org>2009-04-09 18:16:21 -0700
commit365706155031f5b0da56f28576799fdb66235583 (patch)
tree6a2055ed8cc9bb99449608c8453888c9b5a2acd5 /src/runtime/string.c
parent9192dd8e86f90618c1a9907f665fdf2d946e4051 (diff)
downloadgo-365706155031f5b0da56f28576799fdb66235583.tar.xz
change representation of strings
R=r OCL=27293 CL=27293
Diffstat (limited to 'src/runtime/string.c')
-rw-r--r--src/runtime/string.c101
1 files changed, 46 insertions, 55 deletions
diff --git a/src/runtime/string.c b/src/runtime/string.c
index 001050beb4..212fa5c28c 100644
--- a/src/runtime/string.c
+++ b/src/runtime/string.c
@@ -4,8 +4,7 @@
#include "runtime.h"
-static int32 empty = 0;
-string emptystring = (string)&empty;
+String emptystring;
int32
findnull(byte *s)
@@ -21,49 +20,47 @@ findnull(byte *s)
int32 maxstring;
-string
+String
gostringsize(int32 l)
{
- string s;
+ String s;
- s = mal(sizeof(s->len)+l+1);
- s->len = l;
+ if(l == 0)
+ return emptystring;
+ s.str = mal(l);
+ s.len = l;
if(l > maxstring)
maxstring = l;
return s;
}
-string
+String
gostring(byte *str)
{
int32 l;
- string s;
+ String s;
l = findnull(str);
s = gostringsize(l);
- mcpy(s->str, str, l+1);
+ mcpy(s.str, str, l);
return s;
}
void
-sys·catstring(string s1, string s2, string s3)
+sys·catstring(String s1, String s2, String s3)
{
- uint32 l;
-
- if(s1 == nil || s1->len == 0) {
+ if(s1.len == 0) {
s3 = s2;
goto out;
}
- if(s2 == nil || s2->len == 0) {
+ if(s2.len == 0) {
s3 = s1;
goto out;
}
- l = s1->len + s2->len;
-
- s3 = gostringsize(l);
- mcpy(s3->str, s1->str, s1->len);
- mcpy(s3->str+s1->len, s2->str, s2->len);
+ s3 = gostringsize(s1.len + s2.len);
+ mcpy(s3.str, s1.str, s1.len);
+ mcpy(s3.str+s1.len, s2.str, s2.len);
out:
FLUSH(&s3);
@@ -84,36 +81,31 @@ prbounds(int8* s, int32 a, int32 b, int32 c)
}
uint32
-cmpstring(string s1, string s2)
+cmpstring(String s1, String s2)
{
uint32 i, l;
byte c1, c2;
- if(s1 == nil)
- s1 = emptystring;
- if(s2 == nil)
- s2 = emptystring;
-
- l = s1->len;
- if(s2->len < l)
- l = s2->len;
+ l = s1.len;
+ if(s2.len < l)
+ l = s2.len;
for(i=0; i<l; i++) {
- c1 = s1->str[i];
- c2 = s2->str[i];
+ c1 = s1.str[i];
+ c2 = s2.str[i];
if(c1 < c2)
return -1;
if(c1 > c2)
return +1;
}
- if(s1->len < s2->len)
+ if(s1.len < s2.len)
return -1;
- if(s1->len > s2->len)
+ if(s1.len > s2.len)
return +1;
return 0;
}
void
-sys·cmpstring(string s1, string s2, int32 v)
+sys·cmpstring(String s1, String s2, int32 v)
{
v = cmpstring(s1, s2);
FLUSH(&v);
@@ -138,62 +130,61 @@ strcmp(byte *s1, byte *s2)
}
void
-sys·slicestring(string si, int32 lindex, int32 hindex, string so)
+sys·slicestring(String si, int32 lindex, int32 hindex, String so)
{
int32 l;
- if(si == nil)
- si = emptystring;
-
- if(lindex < 0 || lindex > si->len ||
- hindex < lindex || hindex > si->len) {
+ if(lindex < 0 || lindex > si.len ||
+ hindex < lindex || hindex > si.len) {
sys·printpc(&si);
prints(" ");
- prbounds("slice", lindex, si->len, hindex);
+ prbounds("slice", lindex, si.len, hindex);
}
l = hindex-lindex;
- so = gostringsize(l);
- mcpy(so->str, si->str+lindex, l);
+ so.str = si.str + lindex;
+ so.len = l;
+
+// alternate to create a new string
+// so = gostringsize(l);
+// mcpy(so.str, si.str+lindex, l);
+
FLUSH(&so);
}
void
-sys·indexstring(string s, int32 i, byte b)
+sys·indexstring(String s, int32 i, byte b)
{
- if(s == nil)
- s = emptystring;
-
- if(i < 0 || i >= s->len) {
+ if(i < 0 || i >= s.len) {
sys·printpc(&s);
prints(" ");
- prbounds("index", 0, i, s->len);
+ prbounds("index", 0, i, s.len);
}
- b = s->str[i];
+ b = s.str[i];
FLUSH(&b);
}
void
-sys·intstring(int64 v, string s)
+sys·intstring(int64 v, String s)
{
s = gostringsize(8);
- s->len = runetochar(s->str, v);
+ s.len = runetochar(s.str, v);
FLUSH(&s);
}
void
-sys·byteastring(byte *a, int32 l, string s)
+sys·byteastring(byte *a, int32 l, String s)
{
s = gostringsize(l);
- mcpy(s->str, a, l);
+ mcpy(s.str, a, l);
FLUSH(&s);
}
void
-sys·arraystring(Array b, string s)
+sys·arraystring(Array b, String s)
{
s = gostringsize(b.nel);
- mcpy(s->str, b.array, s->len);
+ mcpy(s.str, b.array, s.len);
FLUSH(&s);
}