1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00
v/vlib/builtin/bare/string_bare.v
bogen85 8178e1f7da freestanding: malloc/free with mm_alloc an mm_free
Added more array support that depends on malloc. Added string clone (that uses malloc). Added test for it. Eliminated stack allocated buffers from most of the unit checks.
2019-12-08 13:44:52 +03:00

112 lines
1.7 KiB
V

module builtin
pub struct string {
pub:
str byteptr
len int
}
pub fn strlen(s byteptr) int {
mut i := 0
for ; s[i] != 0; i++ {}
return i
}
pub fn tos(s byteptr, len int) string {
if s == 0 {
panic('tos(): nil string')
}
return string {
str: s
len: len
}
}
/*
pub fn tos_clone(s byteptr) string {
if s == 0 {
panic('tos: nil string')
}
return tos2(s).clone()
}
*/
// Same as `tos`, but calculates the length. Called by `string(bytes)` casts.
// Used only internally.
pub fn tos2(s byteptr) string {
if s == 0 {
panic('tos2: nil string')
}
return string {
str: s
len: strlen(s)
}
}
pub fn tos3(s charptr) string {
if s == 0 {
panic('tos3: nil string')
}
return string {
str: byteptr(s)
len: strlen(byteptr(s))
}
}
pub fn string_eq (s1, s2 string) bool {
if s1.len != s2.len { return false }
for i in 0..s1.len {
if s1[i] != s2[i] { return false }
}
return true
}
pub fn string_ne (s1, s2 string) bool {
return !string_eq(s1,s2)
}
pub fn i64_tos(buf byteptr, len int, n0 i64, base int) string {
if base < 2 { panic("base must be >= 2")}
if base > 36 { panic("base must be <= 36")}
mut b := tos(buf, len)
mut i := len-1
mut n := n0
neg := n < 0
if neg { n = -n }
b[i--] = 0
for {
c := (n%base) + 48
b[i--] = if c > 57 {c+7} else {c}
if i < 0 { panic ("buffer to small") }
n /= base
if n < 1 {break}
}
if (neg) {
if i < 0 { panic ("buffer to small") }
b[i--] = 45
}
offset := i+1
b.str = b.str + offset
b.len -= (offset+1)
return b
}
pub fn i64_str(n0 i64, base int) string {
buf := malloc(80)
return i64_tos(buf, 79, n0, base)
}
pub fn (a string) clone() string {
mut b := string {
len: a.len
str: malloc(a.len + 1)
}
mem_copy(b.str, a.str, a.len)
b[a.len] = `\0`
return b
}