mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
builtin: implement string_from_wide/1 and string_from_wide2/2 on *nix too (#18776)
This commit is contained in:
parent
5d269ba703
commit
884fbb0a98
@ -1,5 +1,7 @@
|
|||||||
module builtin
|
module builtin
|
||||||
|
|
||||||
|
import strings
|
||||||
|
|
||||||
const cp_utf8 = 65001
|
const cp_utf8 = 65001
|
||||||
|
|
||||||
// to_wide returns a pointer to an UTF-16 version of the string receiver.
|
// to_wide returns a pointer to an UTF-16 version of the string receiver.
|
||||||
@ -34,7 +36,7 @@ pub fn (_str string) to_wide() &u16 {
|
|||||||
|
|
||||||
// string_from_wide creates a V string, encoded in UTF-8, given a windows
|
// string_from_wide creates a V string, encoded in UTF-8, given a windows
|
||||||
// style string encoded in UTF-16.
|
// style string encoded in UTF-16.
|
||||||
[unsafe]
|
[manualfree; unsafe]
|
||||||
pub fn string_from_wide(_wstr &u16) string {
|
pub fn string_from_wide(_wstr &u16) string {
|
||||||
$if windows {
|
$if windows {
|
||||||
unsafe {
|
unsafe {
|
||||||
@ -42,7 +44,11 @@ pub fn string_from_wide(_wstr &u16) string {
|
|||||||
return string_from_wide2(_wstr, wstr_len)
|
return string_from_wide2(_wstr, wstr_len)
|
||||||
}
|
}
|
||||||
} $else {
|
} $else {
|
||||||
return ''
|
mut i := 0
|
||||||
|
for unsafe { _wstr[i] } != 0 {
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
return unsafe { string_from_wide2(_wstr, i) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -50,7 +56,7 @@ pub fn string_from_wide(_wstr &u16) string {
|
|||||||
// style string, encoded in UTF-16. It is more efficient, compared to
|
// style string, encoded in UTF-16. It is more efficient, compared to
|
||||||
// string_from_wide, but it requires you to know the input string length,
|
// string_from_wide, but it requires you to know the input string length,
|
||||||
// and to pass it as the second argument.
|
// and to pass it as the second argument.
|
||||||
[unsafe]
|
[manualfree; unsafe]
|
||||||
pub fn string_from_wide2(_wstr &u16, len int) string {
|
pub fn string_from_wide2(_wstr &u16, len int) string {
|
||||||
$if windows {
|
$if windows {
|
||||||
unsafe {
|
unsafe {
|
||||||
@ -64,6 +70,15 @@ pub fn string_from_wide2(_wstr &u16, len int) string {
|
|||||||
return tos2(str_to)
|
return tos2(str_to)
|
||||||
}
|
}
|
||||||
} $else {
|
} $else {
|
||||||
return ''
|
mut sb := strings.new_builder(len)
|
||||||
|
defer {
|
||||||
|
unsafe { sb.free() }
|
||||||
|
}
|
||||||
|
for i := 0; i < len; i++ {
|
||||||
|
u := unsafe { rune(_wstr[i]) }
|
||||||
|
sb.write_rune(u)
|
||||||
|
}
|
||||||
|
res := sb.str()
|
||||||
|
return res
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -54,3 +54,24 @@ fn test_to_wide_cyrillic() {
|
|||||||
assert w[5] == 0
|
assert w[5] == 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const wide_serial_number = [u8(67), 0, 76, 0, 52, 0, 54, 0, 73, 0, 49, 0, 65, 0, 48, 0, 48, 0,
|
||||||
|
54, 0, 52, 0, 57, 0, 0, 0, 0]
|
||||||
|
|
||||||
|
const swide_serial_number = 'CL46I1A00649'
|
||||||
|
|
||||||
|
fn test_string_from_wide() {
|
||||||
|
z := unsafe { string_from_wide(wide_serial_number.data) }
|
||||||
|
assert z == swide_serial_number
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_string_from_wide2() {
|
||||||
|
z := unsafe { string_from_wide2(wide_serial_number.data, 12) }
|
||||||
|
assert z == swide_serial_number
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_reverse_cyrillic_with_string_from_wide() {
|
||||||
|
s := 'Проба'
|
||||||
|
z := unsafe { string_from_wide(s.to_wide()) }
|
||||||
|
assert z == s
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user