Change zero terminated wide strings to use WString over Char16

This commit is contained in:
Christoffer Lerno
2023-07-09 17:58:58 +02:00
committed by Christoffer Lerno
parent 68af987c60
commit e2676a5c7f
11 changed files with 43 additions and 37 deletions

View File

@@ -2,6 +2,7 @@ module std::core::string;
import std::ascii; import std::ascii;
def ZString = distinct inline char*; def ZString = distinct inline char*;
def WString = distinct inline Char16*;
def Char32 = uint; def Char32 = uint;
def Char16 = ushort; def Char16 = ushort;
@@ -352,6 +353,8 @@ fn Char16[]! String.to_utf16(String s, Allocator* using = mem::heap())
return data[:len16]; return data[:len16];
} }
fn WString! String.to_wstring(String s, Allocator* using = mem::heap()) => (WString)s.to_utf16(using).ptr;
fn Char32[]! String.to_utf32(String s, Allocator* using = mem::heap()) fn Char32[]! String.to_utf32(String s, Allocator* using = mem::heap())
{ {
usz codepoints = conv::utf8_codepoints(s); usz codepoints = conv::utf8_codepoints(s);
@@ -405,11 +408,11 @@ fn String! from_utf16(Char16[] utf16, Allocator* using = mem::heap())
return (String)data[:len]; return (String)data[:len];
} }
fn String! from_zutf16(Char16* utf16_pointer, Allocator* using = mem::heap()) fn String! from_wstring(WString wstring, Allocator* using = mem::heap())
{ {
usz utf16_len; usz utf16_len;
while (utf16_pointer[utf16_len] != 0) utf16_len++; while (wstring[utf16_len] != 0) utf16_len++;
Char16[] utf16 = utf16_pointer[:utf16_len]; Char16[] utf16 = wstring[:utf16_len];
return from_utf16(utf16, using); return from_utf16(utf16, using);
} }
@@ -497,6 +500,7 @@ macro String.to_integer(string, $Type)
fn Char16[]! String.to_temp_utf16(s) => s.to_utf16(mem::temp()); fn Char16[]! String.to_temp_utf16(s) => s.to_utf16(mem::temp());
fn WString! String.to_temp_wstring(s) => s.to_wstring(mem::temp());
fn int128! String.to_int128(s) => s.to_integer(int128); fn int128! String.to_int128(s) => s.to_integer(int128);
fn long! String.to_long(s) => s.to_integer(long); fn long! String.to_long(s) => s.to_integer(long);

View File

@@ -10,7 +10,7 @@ fn void*! native_fopen(String filename, String mode) @inline
@pool() @pool()
{ {
$if env::WIN32: $if env::WIN32:
void* file = libc::_wfopen(filename.to_temp_utf16(), filename.to_temp_utf16())!; void* file = libc::_wfopen(filename.to_temp_wstring(), filename.to_temp_wstring())!;
$else $else
void* file = libc::fopen(filename.zstr_tcopy(), mode.zstr_tcopy()); void* file = libc::fopen(filename.zstr_tcopy(), mode.zstr_tcopy());
$endif $endif
@@ -23,7 +23,7 @@ fn void! native_remove(String filename)
@pool() @pool()
{ {
$if env::WIN32: $if env::WIN32:
CInt result = libc::_wremove(filename.to_temp_utf16())!; CInt result = libc::_wremove(filename.to_temp_wstring())!;
$else $else
CInt result = libc::remove(filename.zstr_tcopy()); CInt result = libc::remove(filename.zstr_tcopy());
$endif $endif
@@ -50,7 +50,7 @@ fn void*! native_freopen(void* file, String filename, String mode) @inline
@pool() @pool()
{ {
$if env::WIN32: $if env::WIN32:
file = libc::_wfreopen(filename.to_temp_utf16(), mode.to_temp_utf16(), file)!; file = libc::_wfreopen(filename.to_temp_wstring(), mode.to_temp_wstring(), file)!;
$else $else
file = libc::freopen(filename.zstr_tcopy(), mode.zstr_tcopy(), file); file = libc::freopen(filename.zstr_tcopy(), mode.zstr_tcopy(), file);
$endif $endif

View File

@@ -44,9 +44,8 @@ fn usz! native_file_size(String path) @if(env::WIN32)
{ {
@pool() @pool()
{ {
Char16[] path16 = path.to_temp_utf16()!;
Win32_FILE_ATTRIBUTE_DATA data; Win32_FILE_ATTRIBUTE_DATA data;
win32::getFileAttributesExW(path16, Win32_GET_FILEEX_INFO_LEVELS.STANDARD, &data); win32::getFileAttributesExW(path.to_temp_wstring()!, Win32_GET_FILEEX_INFO_LEVELS.STANDARD, &data);
Win32_LARGE_INTEGER size; Win32_LARGE_INTEGER size;
size.lowPart = data.nFileSizeLow; size.lowPart = data.nFileSizeLow;
size.highPart = data.nFileSizeHigh; size.highPart = data.nFileSizeHigh;

View File

@@ -7,7 +7,7 @@ macro String! getcwd(Allocator* using = mem::heap())
$case env::WIN32: $case env::WIN32:
const DEFAULT_BUFFER = 256; const DEFAULT_BUFFER = 256;
Char16[DEFAULT_BUFFER] buffer; Char16[DEFAULT_BUFFER] buffer;
Char16 *res = win32::_wgetcwd(&buffer, DEFAULT_BUFFER); WString res = win32::_wgetcwd(&buffer, DEFAULT_BUFFER);
bool free = false; bool free = false;
defer if (free) libc::free(res); defer if (free) libc::free(res);
if (!res) if (!res)

View File

@@ -28,7 +28,7 @@ fn PathList! native_ls(Path dir, bool no_dirs, bool no_symlinks, String mask, Al
list.init(.using = using); list.init(.using = using);
@stack_mem(1024; Allocator* mem) @stack_mem(1024; Allocator* mem)
{ {
Char16* result = dir.as_str().concat(`\*`).to_utf16(.using = mem)!!; WString result = dir.as_str().concat(`\*`).to_wstring(.using = mem)!!;
Win32_WIN32_FIND_DATAW find_data; Win32_WIN32_FIND_DATAW find_data;
Win32_HANDLE find = win32::findFirstFileW(result, &find_data); Win32_HANDLE find = win32::findFirstFileW(result, &find_data);
if (find == win32::INVALID_HANDLE_VALUE) return IoError.CANNOT_READ_DIR?; if (find == win32::INVALID_HANDLE_VALUE) return IoError.CANNOT_READ_DIR?;
@@ -38,7 +38,7 @@ fn PathList! native_ls(Path dir, bool no_dirs, bool no_symlinks, String mask, Al
if (no_dirs && (find_data.dwFileAttributes & win32::FILE_ATTRIBUTE_DIRECTORY)) continue; if (no_dirs && (find_data.dwFileAttributes & win32::FILE_ATTRIBUTE_DIRECTORY)) continue;
@stack_mem(480; Allocator* mem2) @stack_mem(480; Allocator* mem2)
{ {
String filename = string::from_zutf16(&find_data.cFileName, mem2)!; String filename = string::from_wstring((WString)&find_data.cFileName, mem2)!;
if (filename == ".." || filename == ".") continue; if (filename == ".." || filename == ".") continue;
list.append(path::new(filename, using)); list.append(path::new(filename, using));
}; };

View File

@@ -44,17 +44,20 @@ fn void! native_rmtree(Path path)
defer win32::findClose(find); defer win32::findClose(find);
do do
{ {
String filename = string::from_zutf16(&find_data.cFileName, mem::temp())!; @pool()
if (filename == "." || filename == "..") continue;
Path file_path = path.tappend(filename)!;
if (find_data.dwFileAttributes & win32::FILE_ATTRIBUTE_DIRECTORY)
{ {
native_rmtree(file_path)!; String filename = string::from_wstring((WString)&find_data.cFileName, mem::temp())!;
} if (filename == "." || filename == "..") continue;
else Path file_path = path.tappend(filename)!;
{ if (find_data.dwFileAttributes & win32::FILE_ATTRIBUTE_DIRECTORY)
win32::deleteFileW(file_path.as_str().to_utf16(mem::temp())); {
} native_rmtree(file_path)!;
}
else
{
win32::deleteFileW(file_path.as_str().to_temp_wstring()!!);
}
};
} while (win32::findNextFileW(find, &find_data) != 0); } while (win32::findNextFileW(find, &find_data) != 0);
os::native_rmdir(path)!; os::native_rmdir(path)!;
} }

View File

@@ -111,11 +111,11 @@ fn Path! new(String path, Allocator* using = mem::heap(), PathEnv path_env = DEF
return { normalize(path.copy(using), path_env), path_env }; return { normalize(path.copy(using), path_env), path_env };
} }
fn Path! new_win32_zutf16(Char16* path, Allocator* using = mem::heap()) fn Path! new_win32_wstring(WString path, Allocator* using = mem::heap())
{ {
@stack_mem(480; Allocator* mem) @stack_mem(480; Allocator* mem)
{ {
return path::new(string::from_zutf16(path, .using = mem)!, .using = using); return path::new(string::from_wstring(path, .using = mem)!, .using = using);
}; };
} }

View File

@@ -16,10 +16,10 @@ extern fn Time_t _mktime64(Tm *timeptr); def mktime = _mktime64;
extern fn usz _msize(void* ptr); extern fn usz _msize(void* ptr);
extern fn CInt _read(Fd fd, void* buffer, CUInt buffer_size); extern fn CInt _read(Fd fd, void* buffer, CUInt buffer_size);
extern fn CInt _setjmp(void* frameptr, JmpBuf* buffer) @if(env::WIN32); extern fn CInt _setjmp(void* frameptr, JmpBuf* buffer) @if(env::WIN32);
extern fn CFile _wfopen(Char16*, Char16*); extern fn CFile _wfopen(WString, WString);
extern fn CFile _wfreopen(Char16*, Char16*, CFile); extern fn CFile _wfreopen(WString, WString, CFile);
extern fn CInt _write(Fd fd, void* buffer, CUInt count); extern fn CInt _write(Fd fd, void* buffer, CUInt count);
extern fn CInt _wremove(Char16*); extern fn CInt _wremove(WString);
// Aliases to simplify libc use // Aliases to simplify libc use
macro Tm* localtime_r(Time_t* timer, Tm* buf) => _localtime64_s(buf, timer); macro Tm* localtime_r(Time_t* timer, Tm* buf) => _localtime64_s(buf, timer);

View File

@@ -73,7 +73,7 @@ fn void! create_named_pipe_helper(void** rd, void **wr) @local @if(env::WIN32)
}; };
} }
fn Char16* convert_command_line_win32(String[] command_line) @inline @if(env::WIN32) @local fn WString convert_command_line_win32(String[] command_line) @inline @if(env::WIN32) @local
{ {
DString str; DString str;
str.tinit(512); str.tinit(512);
@@ -113,7 +113,7 @@ fn Char16* convert_command_line_win32(String[] command_line) @inline @if(env::WI
str.append('"'); str.append('"');
} }
str.append('\0'); str.append('\0');
return str.as_str().to_utf16(.using = mem::temp())!!; return str.as_str().to_temp_wstring()!!;
} }
/** /**
@@ -139,7 +139,7 @@ fn SubProcess! create(String[] command_line, SubProcessOptions options = {}, Str
CFile stderr; CFile stderr;
@pool() @pool()
{ {
Char16* used_environment = null; WString used_environment = null;
if (!options.inherit_environment) if (!options.inherit_environment)
{ {
DString env; DString env;
@@ -154,7 +154,7 @@ fn SubProcess! create(String[] command_line, SubProcessOptions options = {}, Str
env.append("\0"); env.append("\0");
} }
env.append("\0"); env.append("\0");
used_environment = env.as_str().to_utf16(.using = mem::temp()).ptr!; used_environment = env.as_str().to_temp_wstring()!;
} }
int fd = win32::_open_osfhandle((iptr)wr, 0); int fd = win32::_open_osfhandle((iptr)wr, 0);
if (fd != -1) if (fd != -1)

View File

@@ -90,18 +90,18 @@ extern fn Win32_BOOL readFile(Win32_HANDLE hFile, Win32_LPVOID lpBuffer, Win32_D
Win32_LPDWORD lpNumberOfBytesRead, Win32_LPOVERLAPPED lpOverlapped Win32_LPDWORD lpNumberOfBytesRead, Win32_LPOVERLAPPED lpOverlapped
) @extern("ReadFile"); ) @extern("ReadFile");
extern fn Char16* _wgetcwd(Char16* buffer, int maxlen); extern fn WString _wgetcwd(Char16* buffer, int maxlen);
extern fn usz wcslen(Char16* str); extern fn usz wcslen(WString str);
extern fn int _open_osfhandle(iptr osfhandle, int flags); extern fn int _open_osfhandle(iptr osfhandle, int flags);
extern fn iptr _get_osfhandle(int fd); extern fn iptr _get_osfhandle(int fd);
extern fn CFile _fdopen(int fd, ZString mode); extern fn CFile _fdopen(int fd, ZString mode);
extern fn CInt _access(ZString path, CInt mode); extern fn CInt _access(ZString path, CInt mode);
extern fn CInt _waccess(Char16* path, CInt mode); extern fn CInt _waccess(WString path, CInt mode);
/* /*
extern ulong _win32_GetCurrentDirectoryW(ulong, Char16* buffer) @extern("GetCurrentDirectoryW"); extern ulong _win32_GetCurrentDirectoryW(ulong, Char16* buffer) @extern("GetCurrentDirectoryW");
extern bool _win32_CreateSymbolicLinkW(Char16* symlink_file, Char16* target_file, ulong flags) @extern("CreateSymbolicLinkW"); extern bool _win32_CreateSymbolicLinkW(WString symlink_file, WString target_file, ulong flags) @extern("CreateSymbolicLinkW");
extern bool _win32_CopyFileW(Char16* from_file, Char16* to_file, bool no_overwrite) @extern("CopyFileW"); extern bool _win32_CopyFileW(WString from_file, WString to_file, bool no_overwrite) @extern("CopyFileW");
extern ulong _win32_GetFullPathNameW(Char16* file_name, ulong buffer_len, Char16* buffer, Char16** file_part) @extern("GetFullPathNameW"); extern ulong _win32_GetFullPathNameW(WString file_name, ulong buffer_len, Char16* buffer, WString* file_part) @extern("GetFullPathNameW");
*/ */

View File

@@ -88,7 +88,7 @@ def Win32_PCHAR = Win32_CHAR*;
def Win32_PCSTR = Win32_CHAR*; def Win32_PCSTR = Win32_CHAR*;
def Win32_PCTSTR = Win32_LPCWSTR; def Win32_PCTSTR = Win32_LPCWSTR;
def Win32_PCUNICODE_STRING = Win32_UNICODE_STRING*; def Win32_PCUNICODE_STRING = Win32_UNICODE_STRING*;
def Win32_PCWSTR = Char16*; def Win32_PCWSTR = WString;
def Win32_PDWORD = Win32_DWORD*; def Win32_PDWORD = Win32_DWORD*;
def Win32_PDWORDLONG = Win32_DWORDLONG*; def Win32_PDWORDLONG = Win32_DWORDLONG*;
def Win32_PDWORDPTR = Win32_DWORD_PTR*; def Win32_PDWORDPTR = Win32_DWORD_PTR*;