1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

all: byte.str() => byte.ascii_str()

This commit is contained in:
Alexander Medvednikov
2021-01-05 19:14:35 +01:00
parent fdb6f1ab50
commit 5a70eba8e1
5 changed files with 61 additions and 97 deletions

View File

@ -1,13 +1,11 @@
// Copyright (c) 2019-2020 Alexander Medvednikov. All rights reserved.
// Use of this source code is governed by an MIT license
// that can be found in the LICENSE file.
module csv
// Once interfaces are further along the idea would be to have something similar to
// go's io.reader & bufio.reader rather than reading the whole file into string, this
// would then satisfy that interface. I designed it this way to be easily adapted.
const (
err_comment_is_delim = error('encoding.csv: comment cannot be the same as delimiter')
err_invalid_delim = error('encoding.csv: invalid delimiter')
@ -15,8 +13,7 @@ const (
err_invalid_le = error('encoding.csv: could not find any valid line endings')
)
struct Reader {
struct Reader {
// not used yet
// has_header bool
// headings []string
@ -31,8 +28,8 @@ pub mut:
// new_reader initializes a Reader with string data to parse
pub fn new_reader(data string) &Reader {
return &Reader{
delimiter: `,`,
comment: `#`,
delimiter: `,`
comment: `#`
data: data
}
}
@ -40,7 +37,7 @@ pub fn new_reader(data string) &Reader {
// read reads a row from the CSV data.
// If successful, the result holds an array of each column's data.
pub fn (mut r Reader) read() ?[]string {
l := r.read_record()?
l := r.read_record() ?
return l
}
@ -59,7 +56,6 @@ pub fn (mut r Reader) read() ?[]string {
// }
// return records
// }
fn (mut r Reader) read_line() ?string {
// last record
if r.row_pos == r.data.len {
@ -79,14 +75,14 @@ fn (mut r Reader) read_line() ?string {
}
} else {
// No line ending on file
i = r.data.len-1
i = r.data.len - 1
}
}
mut line := r.data[r.row_pos..i]
r.row_pos = i+1
r.row_pos = i + 1
// normalize win line endings (remove extra \r)
if !r.is_mac_pre_osx_le && (line.len >= 1 && line[line.len-1] == `\r`) {
line = line[..line.len-1]
if !r.is_mac_pre_osx_le && (line.len >= 1 && line[line.len - 1] == `\r`) {
line = line[..line.len - 1]
}
return line
}
@ -103,47 +99,51 @@ fn (mut r Reader) read_record() ?[]string {
mut line := ''
mut fields := []string{}
mut i := -1
for {
if need_read {
l := r.read_line()?
l := r.read_line() ?
if l.len <= 0 {
if keep_raw { line += '\n'}
if keep_raw {
line += '\n'
}
continue
} else if l[0] == r.comment {
if keep_raw { line += '\n' + l }
if keep_raw {
line += '\n' + l
}
continue
} else {
if keep_raw { line += '\n'}
if keep_raw {
line += '\n'
}
line += l
}
need_read = false
keep_raw = false
}
if line[0] != `"` { // not quoted
j := line.index(r.delimiter.str()) or {
if line[0] != `"` { // not quoted
j := line.index(r.delimiter.ascii_str()) or {
// last
fields << line[..line.len]
break
}
i = j
fields << line[..i]
line = line[i+1..]
line = line[i + 1..]
continue
} else { // quoted
} else { // quoted
j := line[1..].index('"') or {
need_read = true
keep_raw = true
continue
}
line = line[1..]
if j+1 == line.len {
if j + 1 == line.len {
// last record
fields << line[..j]
break
}
next := line[j+1]
next := line[j + 1]
if next == r.delimiter {
fields << line[..j]
line = line[j..]
@ -159,8 +159,5 @@ fn (mut r Reader) read_record() ?[]string {
}
fn valid_delim(b byte) bool {
return b != 0 &&
b != `"` &&
b != `\r` &&
b != `\n`
return b != 0 && b != `"` && b != `\r` && b != `\n`
}

View File

@ -1,22 +1,21 @@
// Copyright (c) 2019-2020 Alexander Medvednikov. All rights reserved.
// Use of this source code is governed by an MIT license
// that can be found in the LICENSE file.
module csv
import strings
struct Writer {
mut:
sb strings.Builder
sb strings.Builder
pub mut:
use_crlf bool
use_crlf bool
delimiter byte
}
pub fn new_writer() &Writer {
return &Writer{
delimiter: `,`,
delimiter: `,`
sb: strings.new_builder(200)
}
}
@ -30,34 +29,25 @@ pub fn (mut w Writer) write(record []string) ?bool {
for n, field_ in record {
mut field := field_
if n > 0 {
w.sb.write(w.delimiter.str())
w.sb.write(w.delimiter.ascii_str())
}
if !w.field_needs_quotes(field) {
w.sb.write(field)
continue
}
w.sb.write('"')
for field.len > 0 {
mut i := field.index_any('"\r\n')
if i < 0 {
i = field.len
}
w.sb.write(field[..i])
field = field[i..]
if field.len > 0 {
z := field[0]
match z {
`"` {
w.sb.write('""')
}
`\r`, `\n` {
w.sb.write(le)
}
`"` { w.sb.write('""') }
`\r`, `\n` { w.sb.write(le) }
else {}
}
field = field[1..]
@ -65,7 +55,6 @@ pub fn (mut w Writer) write(record []string) ?bool {
}
w.sb.write('"')
}
w.sb.write(le)
return true
}
@ -76,12 +65,11 @@ pub fn (mut w Writer) write(record []string) ?bool {
// w.write(record)
// }
// }
fn (w &Writer) field_needs_quotes(field string) bool {
if field == '' {
return false
}
if field.contains(w.delimiter.str()) || (field.index_any('"\r\n') != -1) {
if field.contains(w.delimiter.ascii_str()) || (field.index_any('"\r\n') != -1) {
return true
}
return false