StringsBuilder => strings.Builder; strings.repeat()
parent
e35ff0533b
commit
5d4d3b838b
|
@ -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)
|
||||||
|
|
|
@ -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 := ''
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
|
@ -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'
|
||||||
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
import strings
|
||||||
|
|
||||||
|
fn test_repeat() {
|
||||||
|
assert strings.repeat(`x`, 10) == 'xxxxxxxxxx'
|
||||||
|
assert strings.repeat(`a`, 1) == 'a'
|
||||||
|
}
|
Loading…
Reference in New Issue