mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
42 lines
1.0 KiB
Plaintext
42 lines
1.0 KiB
Plaintext
module std::io::os;
|
|
import libc, std::os;
|
|
|
|
macro String! getcwd(Allocator allocator = allocator::heap())
|
|
{
|
|
$switch
|
|
$case env::WIN32:
|
|
const DEFAULT_BUFFER = 256;
|
|
Char16[DEFAULT_BUFFER] buffer;
|
|
WString res = win32::_wgetcwd(&buffer, DEFAULT_BUFFER);
|
|
bool free = false;
|
|
defer if (free) libc::free(res);
|
|
if (!res)
|
|
{
|
|
if (libc::errno() != errno::ERANGE) return IoError.GENERAL_ERROR?;
|
|
res = win32::_wgetcwd(null, 0);
|
|
free = true;
|
|
}
|
|
Char16[] str16 = res[:win32::wcslen(res)];
|
|
return string::new_from_utf16(str16, allocator);
|
|
|
|
$case env::POSIX:
|
|
const usz DEFAULT_BUFFER = 256;
|
|
char[DEFAULT_BUFFER] buffer;
|
|
ZString res = posix::getcwd(&buffer, DEFAULT_BUFFER);
|
|
bool free = false;
|
|
if (!res)
|
|
{
|
|
// Improve error
|
|
if (libc::errno() != errno::ERANGE) return IoError.GENERAL_ERROR?;
|
|
res = posix::getcwd(null, 0);
|
|
free = true;
|
|
}
|
|
defer if (free) libc::free((void*)res);
|
|
return res.copy(allocator);
|
|
|
|
$default:
|
|
return IoError.UNSUPPORTED_OPERATION?;
|
|
$endswitch
|
|
}
|
|
|