StringsBuilder => strings.Builder; strings.repeat()

pull/1049/head
Alexander Medvednikov 2019-07-03 22:11:27 +02:00
parent e35ff0533b
commit 5d4d3b838b
10 changed files with 61 additions and 30 deletions

View File

@ -4,6 +4,8 @@
module main module main
import strings
const ( const (
MaxLocalVars = 50 MaxLocalVars = 50
) )
@ -809,7 +811,7 @@ fn contains_capital(s string) bool {
// "fn (int, string) int" // "fn (int, string) int"
fn (f Fn) typ_str() string { fn (f Fn) typ_str() string {
mut sb := new_string_builder(50) mut sb := strings.new_builder(50)
sb.write('fn (') sb.write('fn (')
for i, arg in f.args { for i, arg in f.args {
sb.write(arg.typ) sb.write(arg.typ)

View File

@ -91,6 +91,7 @@ mut:
show_c_cmd bool // `v -show_c_cmd` prints the C command to build program.v.c show_c_cmd bool // `v -show_c_cmd` prints the C command to build program.v.c
sanitize bool // use Clang's new "-fsanitize" option sanitize bool // use Clang's new "-fsanitize" option
is_debug bool // keep compiled C files is_debug bool // keep compiled C files
no_auto_free bool // `v -nofree` disable automatic `free()` insertion for better performance in some applications (e.g. compilers)
} }
@ -290,7 +291,7 @@ void init_consts();')
} }
v.log('Done parsing.') v.log('Done parsing.')
// Write everything // Write everything
mut d := new_string_builder(10000)// Just to avoid some unnecessary allocations mut d := strings.new_builder(10000)// Just to avoid some unnecessary allocations
d.writeln(cgen.includes.join_lines()) d.writeln(cgen.includes.join_lines())
d.writeln(cgen.typedefs.join_lines()) d.writeln(cgen.typedefs.join_lines())
d.writeln(cgen.types.join_lines()) d.writeln(cgen.types.join_lines())
@ -872,7 +873,6 @@ fn new_v(args[]string) *V {
'utf8.v', 'utf8.v',
'map.v', 'map.v',
'option.v', 'option.v',
'string_builder.v',
] ]
// Location of all vlib files // Location of all vlib files
mut lang_dir := '' mut lang_dir := ''

View File

@ -839,7 +839,7 @@ fn (p mut Parser) get_type() string {
p.error('unknown type `$typ`') p.error('unknown type `$typ`')
} }
if mul { if mul {
typ += repeat_char(`*`, nr_muls) typ += strings.repeat(`*`, nr_muls)
} }
// Register an []array type // Register an []array type
if is_arr2 { if is_arr2 {
@ -3175,7 +3175,7 @@ fn (p &Parser) building_v() bool {
// fmt helpers // fmt helpers
fn (scanner mut Scanner) fgen(s string) { fn (scanner mut Scanner) fgen(s string) {
if scanner.fmt_line_empty { if scanner.fmt_line_empty {
s = repeat_char(`\t`, scanner.fmt_indent) + s s = strings.repeat(`\t`, scanner.fmt_indent) + s
} }
scanner.fmt_out.write(s) scanner.fmt_out.write(s)
scanner.fmt_line_empty = false scanner.fmt_line_empty = false
@ -3183,7 +3183,7 @@ fn (scanner mut Scanner) fgen(s string) {
fn (scanner mut Scanner) fgenln(s string) { fn (scanner mut Scanner) fgenln(s string) {
if scanner.fmt_line_empty { if scanner.fmt_line_empty {
s = repeat_char(`\t`, scanner.fmt_indent) + s s = strings.repeat(`\t`, scanner.fmt_indent) + s
} }
scanner.fmt_out.writeln(s) scanner.fmt_out.writeln(s)
scanner.fmt_line_empty = true scanner.fmt_line_empty = true

View File

@ -18,7 +18,7 @@ mut:
started bool started bool
is_fmt bool is_fmt bool
// vfmt fields // vfmt fields
fmt_out StringBuilder fmt_out strings.Builder
fmt_indent int fmt_indent int
fmt_line_empty bool fmt_line_empty bool
} }
@ -40,7 +40,7 @@ fn new_scanner(file_path string) *Scanner {
scanner := &Scanner { scanner := &Scanner {
file_path: file_path file_path: file_path
text: text text: text
fmt_out: new_string_builder(1000) fmt_out: strings.new_builder(1000)
} }
// println('new scanner "$file_path" txt.len=$scanner.text.len') // println('new scanner "$file_path" txt.len=$scanner.text.len')
return scanner return scanner

View File

@ -25,6 +25,12 @@ fn new_array(mylen, cap, elm_size int) array {
return arr return arr
} }
// TODO
pub fn _make(len, cap, elm_size int) array {
return new_array(len, cap, elm_size)
}
// Private function, used by V (`nums := [1, 2, 3]`) // Private function, used by V (`nums := [1, 2, 3]`)
fn new_array_from_c_array(len, cap, elm_size int, c_array voidptr) array { fn new_array_from_c_array(len, cap, elm_size int, c_array voidptr) array {
arr := array { arr := array {

View File

@ -795,18 +795,6 @@ pub fn (c byte) is_white() bool {
return i == 10 || i == 32 || i == 9 || i == 13 || c == `\r` return i == 10 || i == 32 || i == 9 || i == 13 || c == `\r`
} }
// TODO move this to strings.repeat()
pub fn repeat_char(c byte, n int) string {
if n <= 0 {
return ''
}
mut arr := malloc(n + 1)
for i := 0; i < n; i++ {
arr[i] = c
}
arr[n] = `\0`
return tos(arr, n)
}
pub fn (s string) hash() int { pub fn (s string) hash() int {
mut hash := int(0) mut hash := int(0)

View File

@ -2,38 +2,39 @@
// Use of this source code is governed by an MIT license // Use of this source code is governed by an MIT license
// that can be found in the LICENSE file. // that can be found in the LICENSE file.
module builtin module strings
struct StringBuilder { struct Builder {
mut:
buf []byte buf []byte
len int len int
} }
pub fn new_string_builder(initial_size int) StringBuilder { pub fn new_builder(initial_size int) Builder {
return StringBuilder { return Builder {
buf: new_array(0, initial_size, sizeof(byte)) buf: _make(0, initial_size, sizeof(byte))
} }
} }
pub fn (b mut StringBuilder) write(s string) { pub fn (b mut Builder) write(s string) {
b.buf._push_many(s.str, s.len) b.buf._push_many(s.str, s.len)
b.len += s.len b.len += s.len
} }
pub fn (b mut StringBuilder) writeln(s string) { pub fn (b mut Builder) writeln(s string) {
b.buf._push_many(s.str, s.len) b.buf._push_many(s.str, s.len)
b.buf << `\n` b.buf << `\n`
b.len += s.len + 1 b.len += s.len + 1
} }
pub fn (b StringBuilder) str() string { pub fn (b Builder) str() string {
return tos(b.buf.data, b.len) return tos(b.buf.data, b.len)
} }
pub fn (b StringBuilder) cut(n int) { pub fn (b Builder) cut(n int) {
b.len -= n b.len -= n
} }
pub fn (b mut StringBuilder) free() { pub fn (b mut Builder) free() {
C.free(b.buf.data) C.free(b.buf.data)
} }

View File

@ -0,0 +1,15 @@
import strings
fn test_sb() {
mut sb := strings.Builder{}
sb.write('hi')
sb.write('!')
sb.write('hello')
assert sb.str() == 'hi!hello'
sb = strings.new_builder(10)
sb.write('a')
sb.write('b')
println(sb.str())
assert sb.str() == 'ab'
}

View File

@ -0,0 +1,13 @@
module strings
pub fn repeat(c byte, n int) string {
if n <= 0 {
return ''
}
mut arr := malloc(n + 1)
for i := 0; i < n; i++ {
arr[i] = c
}
arr[n] = `\0`
return tos(arr, n)
}

View File

@ -0,0 +1,6 @@
import strings
fn test_repeat() {
assert strings.repeat(`x`, 10) == 'xxxxxxxxxx'
assert strings.repeat(`a`, 1) == 'a'
}