diff --git a/vlib/builtin/string.v b/vlib/builtin/string.v index c4154996d7..fb87869741 100644 --- a/vlib/builtin/string.v +++ b/vlib/builtin/string.v @@ -138,6 +138,24 @@ pub fn (bp byteptr) vstring_with_len(len int) string { } } +// charptr.vstring() - converts C char* to V string. NB: the string data is reused, NOT copied. +[unsafe] +pub fn (cp charptr) vstring() string { + return string{ + str: byteptr(cp) + len: unsafe {C.strlen(cp)} + } +} + +// charptr.vstring_with_len() - converts C char* to V string. NB: the string data is reused, NOT copied. +[unsafe] +pub fn (cp charptr) vstring_with_len(len int) string { + return string{ + str: byteptr(cp) + len: len + } +} + // string.clone_static returns an independent copy of a given array // It should be used only in -autofree generated code. fn (a string) clone_static() string { diff --git a/vlib/builtin/string_test.v b/vlib/builtin/string_test.v index 3971411a72..d5f3497911 100644 --- a/vlib/builtin/string_test.v +++ b/vlib/builtin/string_test.v @@ -528,6 +528,14 @@ fn test_bytes_to_string() { assert bytes.bytestr() == 'hello' } +fn test_charptr() { + foo := charptr('VLANG'.str) + println(typeof(foo)) + assert typeof(foo) == 'charptr' + assert unsafe { foo.vstring() } == 'VLANG' + assert unsafe { foo.vstring_with_len(3) } == 'VLA' +} + fn test_count() { assert ''.count('') == 0 assert ''.count('a') == 0