- Create optional with ~ instead of ?. return io::EOF?; becomes return io::EOF~.

- Deprecated use of `?` to create optional.
This commit is contained in:
Christoffer Lerno
2026-01-20 16:10:28 +01:00
parent 5390ca6250
commit cdabe8fd9e
159 changed files with 710 additions and 707 deletions

View File

@@ -102,8 +102,8 @@ fn void? File.close(&self) @inline @dynamic
switch (libc::errno())
{
case errno::ECONNRESET:
case errno::EBADF: return io::FILE_NOT_VALID?;
case errno::EINTR: return io::INTERRUPTED?;
case errno::EBADF: return io::FILE_NOT_VALID~;
case errno::EINTR: return io::INTERRUPTED~;
case errno::EDQUOT:
case errno::EFAULT:
case errno::EAGAIN:
@@ -111,8 +111,8 @@ fn void? File.close(&self) @inline @dynamic
case errno::ENETDOWN:
case errno::ENETUNREACH:
case errno::ENOSPC:
case errno::EIO: return io::INCOMPLETE_WRITE?;
default: return io::UNKNOWN_ERROR?;
case errno::EIO: return io::INCOMPLETE_WRITE~;
default: return io::UNKNOWN_ERROR~;
}
}
self.file = null;
@@ -156,7 +156,7 @@ fn bool File.isatty(self) @if(env::LIBC)
fn char? File.read_byte(&self) @dynamic
{
int c = libc::fgetc(self.file);
if (c == -1) return io::EOF?;
if (c == -1) return io::EOF~;
return (char)c;
}
@@ -172,7 +172,7 @@ fn char[]? load_buffer(String filename, char[] buffer)
File file = open(filename, "rb")!;
defer (void)file.close();
usz len = file.seek(0, END)!;
if (len > buffer.len) return io::OVERFLOW?;
if (len > buffer.len) return io::OVERFLOW~;
file.seek(0, SET)!;
usz read = 0;
while (read < len)

View File

@@ -26,8 +26,8 @@ fn void? FileMmap.destroy(&self) @maydiscard
{
fault err1 = @catch(self.file.close());
fault err2 = @catch(self.vm.destroy());
if (err1) return err1?;
if (err2) return err2?;
if (err1) return err1~;
if (err2) return err2~;
}
module std::io::file @if(env::LIBC &&& env::POSIX);

View File

@@ -96,9 +96,9 @@ fn usz? Formatter.out(&self, char c) @private
{
if (catch err = self.out_fn(self.data, c))
{
if (self.first_fault) return self.first_fault?;
if (self.first_fault) return self.first_fault~;
self.first_fault = err;
return err?;
return err~;
}
return 1;
}
@@ -133,7 +133,7 @@ fn usz? Formatter.print_with_function(&self, Printable arg)
if (!arg) return self.out_substr("(null)");
return self.out_substr(arg.to_constant_string());
}
return NOT_FOUND?;
return NOT_FOUND~;
}
fn usz? Formatter.out_unknown(&self, String category, any arg) @private
@@ -340,7 +340,7 @@ fn void? out_null_fn(void* data @unused, char c @unused) @private
macro usz? @report_fault(Formatter* f, $fault)
{
(void)f.out_substr($fault);
return INVALID_FORMAT?;
return INVALID_FORMAT~;
}
macro usz? @wrap_bad(Formatter* f, #action)
@@ -352,11 +352,11 @@ macro usz? @wrap_bad(Formatter* f, #action)
{
case BUFFER_EXCEEDED:
case INTERNAL_BUFFER_EXCEEDED:
return f.first_err(err)?;
return f.first_err(err)~;
default:
err = f.first_err(INVALID_ARGUMENT);
f.out_substr("<INVALID>")!;
return err?;
return err~;
}
}
return len;
@@ -564,7 +564,7 @@ fn usz? Formatter.vprintf(&self, String format, any[] anys)
// out((char)0, buffer, idx < maxlen ? idx : maxlen - 1U, maxlen);
// return written chars without terminating \0
if (self.first_fault) return self.first_fault?;
if (self.first_fault) return self.first_fault~;
return total_len;
}

View File

@@ -86,7 +86,7 @@ fn uint128? int_from_any(any arg, bool *is_neg) @private
double d = *(double*)arg;
return (uint128)((*is_neg = d < 0) ? -d : d);
default:
return BAD_FORMAT?;
return BAD_FORMAT~;
}
}
@@ -128,7 +128,7 @@ fn FloatType? float_from_any(any arg) @private
case double:
return (FloatType)*(double*)arg;
default:
return BAD_FORMAT?;
return BAD_FORMAT~;
}
}
@@ -283,7 +283,7 @@ fn usz? Formatter.floatformat(&self, FloatFormatting formatting, double y) @priv
} while (y);
isz outlen = s - buf;
isz explen = ebuf - estr;
if (p > int.max - 2 - explen - pl) return INTERNAL_BUFFER_EXCEEDED?;
if (p > int.max - 2 - explen - pl) return INTERNAL_BUFFER_EXCEEDED~;
usz len;
usz l = p && outlen - 2 < p
? p + 2 + explen
@@ -454,12 +454,12 @@ fn usz? Formatter.floatformat(&self, FloatFormatting formatting, double y) @priv
}
}
}
if (p > int.max - 1 - (isz)(p || self.flags.hash)) return INTERNAL_BUFFER_EXCEEDED?;
if (p > int.max - 1 - (isz)(p || self.flags.hash)) return INTERNAL_BUFFER_EXCEEDED~;
int l = (int)(1 + p + (isz)(p || self.flags.hash));
char* estr @noinit;
if (formatting == FLOAT)
{
if (e > int.max - l) return INTERNAL_BUFFER_EXCEEDED?;
if (e > int.max - l) return INTERNAL_BUFFER_EXCEEDED~;
if (e > 0) l += e;
}
else
@@ -468,10 +468,10 @@ fn usz? Formatter.floatformat(&self, FloatFormatting formatting, double y) @priv
while (ebuf - estr < 2) (--estr)[0] = '0';
*--estr = (e < 0 ? '-' : '+');
*--estr = self.flags.uppercase ? 'E' : 'e';
if (ebuf - estr > (isz)int.max - l) return INTERNAL_BUFFER_EXCEEDED?;
if (ebuf - estr > (isz)int.max - l) return INTERNAL_BUFFER_EXCEEDED~;
l += (int)(ebuf - estr);
}
if (l > int.max - pl) return INTERNAL_BUFFER_EXCEEDED?;
if (l > int.max - pl) return INTERNAL_BUFFER_EXCEEDED~;
usz len;
if (!self.flags.left && !self.flags.zeropad) len += self.pad(' ', self.width, pl + l)!;
if (is_neg || self.flags.plus) len += self.out(is_neg ? '-' : '+')!;
@@ -559,7 +559,7 @@ fn usz? Formatter.ntoa(&self, uint128 value, bool negative, uint base) @private
case 2:
do
{
if (len >= PRINTF_NTOA_BUFFER_SIZE) return INTERNAL_BUFFER_EXCEEDED?;
if (len >= PRINTF_NTOA_BUFFER_SIZE) return INTERNAL_BUFFER_EXCEEDED~;
buf[len++] = '0' + (char)value & 1;
value >>= 1;
}
@@ -567,13 +567,13 @@ fn usz? Formatter.ntoa(&self, uint128 value, bool negative, uint base) @private
case 10:
if (!value)
{
if (len >= PRINTF_NTOA_BUFFER_SIZE) return INTERNAL_BUFFER_EXCEEDED?;
if (len >= PRINTF_NTOA_BUFFER_SIZE) return INTERNAL_BUFFER_EXCEEDED~;
buf[len++] = '0';
break;
}
while (value >= 10)
{
if (len + 1 >= PRINTF_NTOA_BUFFER_SIZE) return INTERNAL_BUFFER_EXCEEDED?;
if (len + 1 >= PRINTF_NTOA_BUFFER_SIZE) return INTERNAL_BUFFER_EXCEEDED~;
char digit = (char)(value % 100);
buf[len:2] = DIGIT_PAIRS[2 * digit:2];
len += 2;
@@ -581,13 +581,13 @@ fn usz? Formatter.ntoa(&self, uint128 value, bool negative, uint base) @private
}
if (value > 0)
{
if (len >= PRINTF_NTOA_BUFFER_SIZE) return INTERNAL_BUFFER_EXCEEDED?;
if (len >= PRINTF_NTOA_BUFFER_SIZE) return INTERNAL_BUFFER_EXCEEDED~;
buf[len++] = '0' + (char)value;
}
case 16:
do
{
if (len >= PRINTF_NTOA_BUFFER_SIZE) return INTERNAL_BUFFER_EXCEEDED?;
if (len >= PRINTF_NTOA_BUFFER_SIZE) return INTERNAL_BUFFER_EXCEEDED~;
char digit = (char)value & 0xF;
buf[len++] = digit + (digit < 10 ? '0' : past_10);
value >>= 4;
@@ -596,7 +596,7 @@ fn usz? Formatter.ntoa(&self, uint128 value, bool negative, uint base) @private
case 8:
do
{
if (len >= PRINTF_NTOA_BUFFER_SIZE) return INTERNAL_BUFFER_EXCEEDED?;
if (len >= PRINTF_NTOA_BUFFER_SIZE) return INTERNAL_BUFFER_EXCEEDED~;
buf[len++] = '0' + (char)value & 0x7;
value >>= 3;
}
@@ -616,12 +616,12 @@ fn usz? Formatter.ntoa_format(&self, String buf, usz len, bool negative, uint ba
if (self.width && self.flags.zeropad && (negative || self.flags.plus || self.flags.space)) self.width--;
while (len < self.prec)
{
if (len >= buf.len) return INTERNAL_BUFFER_EXCEEDED?;
if (len >= buf.len) return INTERNAL_BUFFER_EXCEEDED~;
buf[len++] = '0';
}
while (self.flags.zeropad && len < self.width)
{
if (len >= buf.len) return INTERNAL_BUFFER_EXCEEDED?;
if (len >= buf.len) return INTERNAL_BUFFER_EXCEEDED~;
buf[len++] = '0';
}
}
@@ -636,7 +636,7 @@ fn usz? Formatter.ntoa_format(&self, String buf, usz len, bool negative, uint ba
}
if (base != 10)
{
if (len + 1 >= buf.len) return INTERNAL_BUFFER_EXCEEDED?;
if (len + 1 >= buf.len) return INTERNAL_BUFFER_EXCEEDED~;
switch (base)
{
case 16:
@@ -655,13 +655,13 @@ fn usz? Formatter.ntoa_format(&self, String buf, usz len, bool negative, uint ba
switch (true)
{
case negative:
if (len >= buf.len) return INTERNAL_BUFFER_EXCEEDED?;
if (len >= buf.len) return INTERNAL_BUFFER_EXCEEDED~;
buf[len++] = '-';
case self.flags.plus:
if (len >= buf.len) return INTERNAL_BUFFER_EXCEEDED?;
if (len >= buf.len) return INTERNAL_BUFFER_EXCEEDED~;
buf[len++] = '+';
case self.flags.space:
if (len >= buf.len) return INTERNAL_BUFFER_EXCEEDED?;
if (len >= buf.len) return INTERNAL_BUFFER_EXCEEDED~;
buf[len++] = ' ';
}
if (len) self.out_reverse(buf[:len])!;
@@ -741,10 +741,10 @@ fn int? printf_parse_format_field(
if (c.is_digit()) return simple_atoi(format_ptr, format_len, index_ptr);
if (c != '*') return 0;
usz len = ++(*index_ptr);
if (len >= format_len) return BAD_FORMAT?;
if (*args_index_ptr >= args_len) return BAD_FORMAT?;
if (len >= format_len) return BAD_FORMAT~;
if (*args_index_ptr >= args_len) return BAD_FORMAT~;
any val = args_ptr[(*args_index_ptr)++];
if (!val.type.kindof.is_int()) return BAD_FORMAT?;
if (!val.type.kindof.is_int()) return BAD_FORMAT~;
uint? intval = types::any_to_int(val, int);
return intval ?? BAD_FORMAT?;
return intval ?? BAD_FORMAT~;
}

View File

@@ -132,7 +132,7 @@ macro usz? readline_to_stream(out_stream, in_stream = io::stdin())
if (catch err = c)
{
if (err == io::EOF) break;
return err?;
return err~;
}
if (c == '\r') continue;
if (c == '\n') break;
@@ -404,7 +404,7 @@ fn char[]? bprintf(char[] buffer, String format, args...) @maydiscard
fn void? out_buffer_fn(void *data, char c) @private
{
BufferData *buffer_data = data;
if (buffer_data.written >= buffer_data.buffer.len) return BUFFER_EXCEEDED?;
if (buffer_data.written >= buffer_data.buffer.len) return BUFFER_EXCEEDED~;
buffer_data.buffer[buffer_data.written++] = c;
}

View File

@@ -11,20 +11,20 @@ macro void? native_chdir(Path path)
{
switch (libc::errno())
{
case errno::EACCES: return io::NO_PERMISSION?;
case errno::ENAMETOOLONG: return io::NAME_TOO_LONG?;
case errno::ENOTDIR: return io::FILE_NOT_DIR?;
case errno::ENOENT: return io::FILE_NOT_FOUND?;
case errno::ELOOP: return io::SYMLINK_FAILED?;
default: return io::GENERAL_ERROR?;
case errno::EACCES: return io::NO_PERMISSION~;
case errno::ENAMETOOLONG: return io::NAME_TOO_LONG~;
case errno::ENOTDIR: return io::FILE_NOT_DIR~;
case errno::ENOENT: return io::FILE_NOT_FOUND~;
case errno::ELOOP: return io::SYMLINK_FAILED~;
default: return io::GENERAL_ERROR~;
}
}
$case env::WIN32:
// TODO improve with better error handling.
if (win32::setCurrentDirectoryW(path.str_view().to_temp_utf16()!!)) return;
return io::GENERAL_ERROR?;
return io::GENERAL_ERROR~;
$default:
return io::UNSUPPORTED_OPERATION?;
return io::UNSUPPORTED_OPERATION~;
$endswitch
};
}

View File

@@ -12,7 +12,7 @@ fn void*? native_fopen(String filename, String mode) @inline => @pool()
$else
void* file = libc::fopen(filename.zstr_tcopy(), mode.zstr_tcopy());
$endif
return file ?: file_open_errno()?;
return file ?: file_open_errno()~;
}
fn void? native_remove(String filename) => @pool()
@@ -27,10 +27,10 @@ fn void? native_remove(String filename) => @pool()
switch (libc::errno())
{
case errno::ENOENT:
return io::FILE_NOT_FOUND?;
return io::FILE_NOT_FOUND~;
case errno::EACCES:
default:
return io::FILE_CANNOT_DELETE?;
return io::FILE_CANNOT_DELETE~;
}
}
}
@@ -46,19 +46,19 @@ fn void*? native_freopen(void* file, String filename, String mode) @inline => @p
$else
file = libc::freopen(filename.zstr_tcopy(), mode.zstr_tcopy(), file);
$endif
return file ?: file_open_errno()?;
return file ?: file_open_errno()~;
}
fn void? native_fseek(void* file, isz offset, Seek seek_mode) @inline
{
if (libc::fseek(file, (SeekIndex)offset, seek_mode.ordinal)) return file_seek_errno()?;
if (libc::fseek(file, (SeekIndex)offset, seek_mode.ordinal)) return file_seek_errno()~;
}
fn usz? native_ftell(CFile file) @inline
{
long index = libc::ftell(file);
return index >= 0 ? (usz)index : file_seek_errno()?;
return index >= 0 ? (usz)index : file_seek_errno()~;
}
fn usz? native_fwrite(CFile file, char[] buffer) @inline
@@ -68,7 +68,7 @@ fn usz? native_fwrite(CFile file, char[] buffer) @inline
fn void? native_fputc(CInt c, CFile stream) @inline
{
if (libc::fputc(c, stream) == libc::EOF) return io::EOF?;
if (libc::fputc(c, stream) == libc::EOF) return io::EOF~;
}
fn usz? native_fread(CFile file, char[] buffer) @inline

View File

@@ -28,7 +28,7 @@ FputcFn native_fputc_fn @weak @if(!$defined(native_fputc_fn));
fn void*? native_fopen(String filename, String mode) @inline
{
if (native_fopen_fn) return native_fopen_fn(filename, mode);
return io::UNSUPPORTED_OPERATION?;
return io::UNSUPPORTED_OPERATION~;
}
<*
@@ -39,7 +39,7 @@ fn void*? native_fopen(String filename, String mode) @inline
fn void? native_remove(String filename) @inline
{
if (native_remove_fn) return native_remove_fn(filename);
return io::UNSUPPORTED_OPERATION?;
return io::UNSUPPORTED_OPERATION~;
}
<*
@@ -49,35 +49,35 @@ fn void? native_remove(String filename) @inline
fn void*? native_freopen(void* file, String filename, String mode) @inline
{
if (native_freopen_fn) return native_freopen_fn(file, filename, mode);
return io::UNSUPPORTED_OPERATION?;
return io::UNSUPPORTED_OPERATION~;
}
fn void? native_fseek(void* file, isz offset, Seek seek_mode) @inline
{
if (native_fseek_fn) return native_fseek_fn(file, offset, seek_mode);
return io::UNSUPPORTED_OPERATION?;
return io::UNSUPPORTED_OPERATION~;
}
fn usz? native_ftell(CFile file) @inline
{
if (native_ftell_fn) return native_ftell_fn(file);
return io::UNSUPPORTED_OPERATION?;
return io::UNSUPPORTED_OPERATION~;
}
fn usz? native_fwrite(CFile file, char[] buffer) @inline
{
if (native_fwrite_fn) return native_fwrite_fn(file, buffer);
return io::UNSUPPORTED_OPERATION?;
return io::UNSUPPORTED_OPERATION~;
}
fn usz? native_fread(CFile file, char[] buffer) @inline
{
if (native_fread_fn) return native_fread_fn(file, buffer);
return io::UNSUPPORTED_OPERATION?;
return io::UNSUPPORTED_OPERATION~;
}
fn void? native_fputc(CInt c, CFile stream) @inline
{
if (native_fputc_fn) return native_fputc_fn(c, stream);
return io::UNSUPPORTED_OPERATION?;
return io::UNSUPPORTED_OPERATION~;
}

View File

@@ -14,25 +14,25 @@ fn void? native_stat(Stat* stat, String path) @if(env::DARWIN || env::LINUX || e
switch (libc::errno())
{
case errno::EBADF:
return io::FILE_NOT_VALID?;
return io::FILE_NOT_VALID~;
case errno::EFAULT:
unreachable("Invalid stat");
case errno::EIO:
return io::GENERAL_ERROR?;
return io::GENERAL_ERROR~;
case errno::EACCES:
return io::NO_PERMISSION?;
return io::NO_PERMISSION~;
case errno::ELOOP:
return io::NO_PERMISSION?;
return io::NO_PERMISSION~;
case errno::ENAMETOOLONG:
return io::NAME_TOO_LONG?;
return io::NAME_TOO_LONG~;
case errno::ENOENT:
return io::FILE_NOT_FOUND?;
return io::FILE_NOT_FOUND~;
case errno::ENOTDIR:
return io::FILE_NOT_DIR?;
return io::FILE_NOT_DIR~;
case errno::EOVERFLOW:
return io::GENERAL_ERROR?;
return io::GENERAL_ERROR~;
default:
return io::UNKNOWN_ERROR?;
return io::UNKNOWN_ERROR~;
}
}
}

View File

@@ -12,7 +12,7 @@ macro String? getcwd(Allocator allocator)
defer if (free) libc::free(res);
if (!res)
{
if (libc::errno() != errno::ERANGE) return io::GENERAL_ERROR?;
if (libc::errno() != errno::ERANGE) return io::GENERAL_ERROR~;
res = win32::_wgetcwd(null, 0);
free = true;
}
@@ -27,7 +27,7 @@ macro String? getcwd(Allocator allocator)
if (!res)
{
// Improve error
if (libc::errno() != errno::ERANGE) return io::GENERAL_ERROR?;
if (libc::errno() != errno::ERANGE) return io::GENERAL_ERROR~;
res = posix::getcwd(null, 0);
free = true;
}
@@ -35,7 +35,7 @@ macro String? getcwd(Allocator allocator)
return res.copy(allocator);
$default:
return io::UNSUPPORTED_OPERATION?;
return io::UNSUPPORTED_OPERATION~;
$endswitch
}

View File

@@ -11,7 +11,7 @@ fn PathList? native_ls(Path dir, bool no_dirs, bool no_symlinks, String mask, Al
directory = posix::opendir(dir.str_view() ? dir.str_view().zstr_tcopy() : (ZString)".");
};
defer if (directory) posix::closedir(directory);
if (!directory) return (path::is_dir(dir) ? io::CANNOT_READ_DIR : io::FILE_NOT_DIR)?;
if (!directory) return (path::is_dir(dir) ? io::CANNOT_READ_DIR : io::FILE_NOT_DIR)~;
Posix_dirent* entry;
while ((entry = posix::readdir(directory)))
{
@@ -38,7 +38,7 @@ fn PathList? native_ls(Path dir, bool no_dirs, bool no_symlinks, String mask, Al
WString result = dir.str_view().tconcat(`\*`).to_temp_wstring()!!;
Win32_WIN32_FIND_DATAW find_data;
Win32_HANDLE find = win32::findFirstFileW(result, &find_data);
if (find == win32::INVALID_HANDLE_VALUE) return io::CANNOT_READ_DIR?;
if (find == win32::INVALID_HANDLE_VALUE) return io::CANNOT_READ_DIR~;
defer win32::findClose(find);
do
{

View File

@@ -17,17 +17,17 @@ macro bool? native_mkdir(Path path, MkdirPermissions permissions)
case errno::EACCES:
case errno::EPERM:
case errno::EROFS:
case errno::EFAULT: return io::NO_PERMISSION?;
case errno::ENAMETOOLONG: return io::NAME_TOO_LONG?;
case errno::EFAULT: return io::NO_PERMISSION~;
case errno::ENAMETOOLONG: return io::NAME_TOO_LONG~;
case errno::EDQUOT:
case errno::ENOSPC: return io::OUT_OF_SPACE?;
case errno::ENOSPC: return io::OUT_OF_SPACE~;
case errno::EISDIR:
case errno::EEXIST: return false;
case errno::ELOOP: return io::SYMLINK_FAILED?;
case errno::ENOTDIR: return io::FILE_NOT_FOUND?;
case errno::ENOENT: return io::PARENT_DIR_MISSING?;
case errno::ELOOP: return io::SYMLINK_FAILED~;
case errno::ENOTDIR: return io::FILE_NOT_FOUND~;
case errno::ENOENT: return io::PARENT_DIR_MISSING~;
default:
return io::GENERAL_ERROR?;
return io::GENERAL_ERROR~;
}
$case env::WIN32:
// TODO security attributes
@@ -35,18 +35,18 @@ macro bool? native_mkdir(Path path, MkdirPermissions permissions)
switch (win32::getLastError())
{
case win32::ERROR_ACCESS_DENIED:
return io::NO_PERMISSION?;
return io::NO_PERMISSION~;
case win32::ERROR_DISK_FULL:
return io::OUT_OF_SPACE?;
return io::OUT_OF_SPACE~;
case win32::ERROR_ALREADY_EXISTS:
return false;
case win32::ERROR_PATH_NOT_FOUND:
return io::FILE_NOT_FOUND?;
return io::FILE_NOT_FOUND~;
default:
return io::GENERAL_ERROR?;
return io::GENERAL_ERROR~;
}
$default:
return io::UNSUPPORTED_OPERATION?;
return io::UNSUPPORTED_OPERATION~;
$endswitch
};
}

View File

@@ -13,36 +13,36 @@ macro bool? native_rmdir(Path path)
if (!posix::rmdir(path.str_view().zstr_tcopy())) return true;
switch (libc::errno())
{
case errno::EBUSY: return io::BUSY?;
case errno::EBUSY: return io::BUSY~;
case errno::EACCES:
case errno::EPERM:
case errno::EROFS:
case errno::EFAULT: return io::NO_PERMISSION?;
case errno::ENAMETOOLONG: return io::NAME_TOO_LONG?;
case errno::EFAULT: return io::NO_PERMISSION~;
case errno::ENAMETOOLONG: return io::NAME_TOO_LONG~;
case errno::ENOTDIR:
case errno::ENOENT: return false;
case errno::ENOTEMPTY: return io::DIR_NOT_EMPTY?;
case errno::ELOOP: return io::SYMLINK_FAILED?;
default: return io::GENERAL_ERROR?;
case errno::ENOTEMPTY: return io::DIR_NOT_EMPTY~;
case errno::ELOOP: return io::SYMLINK_FAILED~;
default: return io::GENERAL_ERROR~;
}
$case env::WIN32:
if (win32::removeDirectoryW(path.str_view().to_temp_utf16()!!)) return true;
switch (win32::getLastError())
{
case win32::ERROR_ACCESS_DENIED:
return io::NO_PERMISSION?;
return io::NO_PERMISSION~;
case win32::ERROR_CURRENT_DIRECTORY:
return io::BUSY?;
return io::BUSY~;
case win32::ERROR_DIR_NOT_EMPTY:
return io::DIR_NOT_EMPTY?;
return io::DIR_NOT_EMPTY~;
case win32::ERROR_DIRECTORY:
case win32::ERROR_PATH_NOT_FOUND:
return false;
default:
return io::GENERAL_ERROR?;
return io::GENERAL_ERROR~;
}
$default:
return io::UNSUPPORTED_OPERATION?;
return io::UNSUPPORTED_OPERATION~;
$endswitch
};
}

View File

@@ -10,7 +10,7 @@ fn void? native_rmtree(Path dir)
{
DIRPtr directory = posix::opendir(dir.str_view().zstr_tcopy());
defer if (directory) posix::closedir(directory);
if (!directory) return path::is_dir(dir) ? io::CANNOT_READ_DIR? : io::FILE_NOT_DIR?;
if (!directory) return path::is_dir(dir) ? io::CANNOT_READ_DIR~ : io::FILE_NOT_DIR~;
Posix_dirent* entry;
while ((entry = posix::readdir(directory)))
{
@@ -27,7 +27,7 @@ fn void? native_rmtree(Path dir)
if (libc::remove(new_path.str_view().zstr_tcopy()))
{
// TODO improve
return io::GENERAL_ERROR?;
return io::GENERAL_ERROR~;
}
};
}
@@ -44,7 +44,7 @@ fn void? native_rmtree(Path path)
String s = path.str_view().tconcat("\\*");
Win32_HANDLE find = win32::findFirstFileW(s.to_temp_utf16(), &find_data)!;
if (find == win32::INVALID_HANDLE_VALUE) return io::CANNOT_READ_DIR?;
if (find == win32::INVALID_HANDLE_VALUE) return io::CANNOT_READ_DIR~;
defer win32::findClose(find);
do
{

View File

@@ -21,7 +21,7 @@ fn String? win32_get_known_folder_temp(Win32_REFKNOWNFOLDERID rfid) @private @if
{
Win32_PWSTR path;
Win32_HRESULT res = win32::shGetKnownFolderPath(rfid, 0x00008000 /* KF_FLAG_CREATE */, null, &path);
if (res) return io::PATH_COULD_NOT_BE_FOUND?;
if (res) return io::PATH_COULD_NOT_BE_FOUND~;
return string::from_wstring(tmem, (WString)path);
}
@@ -38,11 +38,11 @@ fn Path? native_home_directory(Allocator allocator) => @pool()
$case NETBSD:
$case OPENBSD:
$case HAIKU:
return path::new(allocator, env::tget_var("HOME")) ?? io::PATH_COULD_NOT_BE_FOUND?;
return path::new(allocator, env::tget_var("HOME")) ?? io::PATH_COULD_NOT_BE_FOUND~;
$case WIN32:
return path::new(allocator, win32_get_known_folder_temp(&win32::FOLDERID_PROFILE));
$default:
return io::PATH_COULD_NOT_BE_FOUND?;
return io::PATH_COULD_NOT_BE_FOUND~;
$endswitch
}
@@ -67,7 +67,7 @@ fn Path? native_user_directory(Allocator allocator, NativeSystemDir dir) => @poo
case TEMPLATES: return path::new(allocator, posix::xdg_user_dir_lookup(tmem, "TEMPLATES"));
case SAVED_GAMES:
case SCREENSHOTS: nextcase;
default: return io::PATH_COULD_NOT_BE_FOUND?;
default: return io::PATH_COULD_NOT_BE_FOUND~;
}
$case IOS:
$case MACOS:
@@ -85,7 +85,7 @@ fn Path? native_user_directory(Allocator allocator, NativeSystemDir dir) => @poo
case SAVED_GAMES:
case SCREENSHOTS:
case TEMPLATES: nextcase;
default: return io::PATH_COULD_NOT_BE_FOUND?;
default: return io::PATH_COULD_NOT_BE_FOUND~;
}
$case WIN32:
switch (dir)
@@ -100,10 +100,10 @@ fn Path? native_user_directory(Allocator allocator, NativeSystemDir dir) => @poo
case SCREENSHOTS: return path::new(allocator, win32_get_known_folder_temp(&win32::FOLDERID_SCREENSHOTS));
case TEMPLATES: return path::new(allocator, win32_get_known_folder_temp(&win32::FOLDERID_TEMPLATES));
case PUBLIC_SHARE: nextcase;
default: return io::PATH_COULD_NOT_BE_FOUND?;
default: return io::PATH_COULD_NOT_BE_FOUND~;
}
$default:
return io::PATH_COULD_NOT_BE_FOUND?;
return io::PATH_COULD_NOT_BE_FOUND~;
$endswitch
}
@@ -121,16 +121,16 @@ fn Path? native_temp_directory(Allocator allocator) @if(!env::WIN32)
fn Path? native_temp_directory(Allocator allocator) @if(env::WIN32) => @pool()
{
Win32_DWORD len = win32::getTempPathW(0, null);
if (!len) return io::GENERAL_ERROR?;
if (!len) return io::GENERAL_ERROR~;
Char16[] buff = mem::talloc_array(Char16, len);
Win32_DWORD res = win32::getTempPathW(len, buff);
if (!res) return io::GENERAL_ERROR?;
if (!res) return io::GENERAL_ERROR~;
return path::new(allocator, string::tfrom_utf16(buff[:res]));
}
module std::io::os @if(env::NO_LIBC);
import std::io::path;
macro Path? native_home_directory(Allocator allocator) => io::PATH_COULD_NOT_BE_FOUND?;
macro Path? native_temp_directory(Allocator allocator) => io::PATH_COULD_NOT_BE_FOUND?;
fn Path? native_user_directory(Allocator allocator, NativeSystemDir dir) => io::PATH_COULD_NOT_BE_FOUND?;
macro Path? native_home_directory(Allocator allocator) => io::PATH_COULD_NOT_BE_FOUND~;
macro Path? native_temp_directory(Allocator allocator) => io::PATH_COULD_NOT_BE_FOUND~;
fn Path? native_user_directory(Allocator allocator, NativeSystemDir dir) => io::PATH_COULD_NOT_BE_FOUND~;

View File

@@ -86,7 +86,7 @@ fn PathList? ls(Allocator allocator, Path dir, bool no_dirs = false, bool no_sym
$if $defined(os::native_ls):
return os::native_ls(dir, no_dirs, no_symlinks, mask, allocator);
$else
return io::UNSUPPORTED_OPERATION?;
return io::UNSUPPORTED_OPERATION~;
$endif
}
@@ -137,11 +137,11 @@ macro bool? rmdir(path)
*>
fn void? rmtree(Path path)
{
if (!path.path_string.len) return INVALID_PATH?;
if (!path.path_string.len) return INVALID_PATH~;
$if $defined(os::native_rmtree):
return os::native_rmtree(path);
$else
return io::UNSUPPORTED_OPERATION?;
return io::UNSUPPORTED_OPERATION~;
$endif
}
@@ -212,7 +212,7 @@ fn usz? start_of_base_name(String str, PathEnv path_env) @local
// Find the \ before "foo"
usz last_index = 2 + str[2..].index_of_char('\\')!;
// If they don't match, we're done
if (last_index > index) return INVALID_PATH?;
if (last_index > index) return INVALID_PATH~;
if (last_index != index) return index + 1;
// Otherwise just default to the volume length.
}
@@ -246,7 +246,7 @@ fn Path? String.to_absolute_path(self, Allocator allocator) => @pool()
fn Path? Path.absolute(self, Allocator allocator)
{
String path_str = self.str_view();
if (!path_str.len) return INVALID_PATH?;
if (!path_str.len) return INVALID_PATH~;
if (self.is_absolute()!) return new(allocator, path_str, self.env);
if (path_str == ".")
{
@@ -262,7 +262,7 @@ fn Path? Path.absolute(self, Allocator allocator)
const usz BUFFER_LEN = 4096;
WString buffer = (WString)mem::talloc_array(Char16, BUFFER_LEN);
buffer = win32::_wfullpath(buffer, path_str.to_temp_wstring()!, BUFFER_LEN);
if (!buffer) return INVALID_PATH?;
if (!buffer) return INVALID_PATH~;
return { string::from_wstring(allocator, buffer), WIN32, allocator };
};
$else
@@ -371,10 +371,10 @@ fn usz? volume_name_len(String path, PathEnv path_env) @local
base_found = i;
continue;
}
if (is_reserved_win32_path_char(c)) return INVALID_PATH?;
if (is_reserved_win32_path_char(c)) return INVALID_PATH~;
}
if (base_found > 0 && base_found + 1 < len) return len;
return INVALID_PATH?;
return INVALID_PATH~;
case 'A'..'Z':
case 'a'..'z':
return path[1] == ':' ? 2 : 0;
@@ -392,7 +392,7 @@ fn usz? volume_name_len(String path, PathEnv path_env) @local
*>
fn Path? Path.parent(self)
{
if (self.path_string.len == 1 && is_separator(self.path_string[0], self.env)) return NO_PARENT?;
if (self.path_string.len == 1 && is_separator(self.path_string[0], self.env)) return NO_PARENT~;
foreach_r(i, c : self.path_string)
{
if (is_separator(c, self.env))
@@ -405,7 +405,7 @@ fn Path? Path.parent(self)
// Handle C:\foo
if (volume_len == i)
{
if (i + 1 == self.path_string.len) return NO_PARENT?;
if (i + 1 == self.path_string.len) return NO_PARENT~;
return { self.path_string[:i + 1], WIN32, null };
}
}
@@ -413,7 +413,7 @@ fn Path? Path.parent(self)
return { self.path_string[:i], self.env, null };
}
}
return NO_PARENT?;
return NO_PARENT~;
}
fn String? normalize(String path_str, PathEnv path_env = DEFAULT_ENV)
@@ -455,7 +455,7 @@ fn String? normalize(String path_str, PathEnv path_env = DEFAULT_ENV)
// The rest are names of the path elements, so check that the
// characters are valid.
if (is_reserved_path_char(c, path_env)) return INVALID_PATH?;
if (is_reserved_path_char(c, path_env)) return INVALID_PATH~;
// If we have '.' after a separator
if (c == '.' && previous_was_separator)
@@ -488,7 +488,7 @@ fn String? normalize(String path_str, PathEnv path_env = DEFAULT_ENV)
continue;
case 2:
// This is an error: /a/../..
if (len == path_start && has_root) return INVALID_PATH?;
if (len == path_start && has_root) return INVALID_PATH~;
// If this .. at the start, or after ../? If so, we just copy ..
if (len == path_start ||
@@ -657,21 +657,21 @@ macro bool is_reserved_path_char(char c, PathEnv path_env = DEFAULT_ENV)
}
fn bool? _mkdir(Path path, bool recursive = false, MkdirPermissions permissions = NORMAL) @private
{
if (!path.path_string.len) return INVALID_PATH?;
if (!path.path_string.len) return INVALID_PATH~;
if (is_dir(path)) return false;
if (exists(path)) return io::FILE_NOT_DIR?;
if (exists(path)) return io::FILE_NOT_DIR~;
if (recursive)
{
if (try parent = path.parent()) mkdir(parent, true, permissions)!;
}
if (!is_dir(path.parent()) ?? false) return io::CANNOT_READ_DIR?;
if (!is_dir(path.parent()) ?? false) return io::CANNOT_READ_DIR~;
return os::native_mkdir(path, permissions);
}
fn bool? _rmdir(Path path) @private
{
if (!path.path_string.len) return INVALID_PATH?;
if (!path.path_string.len) return INVALID_PATH~;
return os::native_rmdir(path);
}

View File

@@ -83,7 +83,7 @@ macro usz? read_all(stream, char[] buffer)
{
if (buffer.len == 0) return 0;
usz n = stream.read(buffer)!;
if (n != buffer.len) return UNEXPECTED_EOF?;
if (n != buffer.len) return UNEXPECTED_EOF~;
return n;
}
@@ -120,7 +120,7 @@ macro usz? write_all(stream, char[] buffer)
{
if (buffer.len == 0) return 0;
usz n = stream.write(buffer)!;
if (n != buffer.len) return INCOMPLETE_WRITE?;
if (n != buffer.len) return INCOMPLETE_WRITE~;
return n;
}
@@ -136,7 +136,7 @@ macro usz? read_using_read_byte(s, char[] buffer)
if (catch err = c)
{
if (err == io::EOF) return len;
return err?;
return err~;
}
*cptr = c;
len++;
@@ -160,7 +160,7 @@ macro char? read_byte_using_read(s)
{
char[1] buffer;
usz read = s.read(&buffer)!;
if (read != 1) return io::EOF?;
if (read != 1) return io::EOF~;
return buffer[0];
}
@@ -205,12 +205,12 @@ macro usz? copy_through_buffer(InStream in, OutStream dst, char[] buffer) @local
if (catch err = len)
{
if (err == io::EOF) return total_copied;
return err?;
return err~;
}
if (!len) return total_copied;
usz written = dst.write(buffer[:len])!;
total_copied += len;
if (written != len) return INCOMPLETE_WRITE?;
if (written != len) return INCOMPLETE_WRITE~;
}
}
@@ -232,8 +232,8 @@ macro usz? read_varint(stream, x_ptr)
char? c = stream.read_byte();
if (catch err = c)
{
if (err == io::EOF) return io::UNEXPECTED_EOF?;
return err?;
if (err == io::EOF) return io::UNEXPECTED_EOF~;
return err~;
}
n++;
if (c & 0x80 == 0)
@@ -249,7 +249,7 @@ macro usz? read_varint(stream, x_ptr)
x |= (c & 0x7F) << shift;
shift += 7;
}
return math::OVERFLOW?;
return math::OVERFLOW~;
}
<*
@require @is_outstream(stream)

View File

@@ -49,7 +49,7 @@ fn usz? ReadBuffer.read(&self, char[] bytes) @dynamic
fn char? ReadBuffer.read_byte(&self) @dynamic
{
if (self.read_idx == self.write_idx) self.refill()!;
if (self.read_idx == self.write_idx) return io::EOF?;
if (self.read_idx == self.write_idx) return io::EOF~;
char c = self.bytes[self.read_idx];
self.read_idx++;
return c;
@@ -132,5 +132,5 @@ fn void? WriteBuffer.write_byte(&self, char c) @dynamic
fn void? WriteBuffer.write_pending(&self) @local
{
self.index -= self.wrapped_stream.write(self.bytes[:self.index])!;
if (self.index != 0) return INCOMPLETE_WRITE?;
if (self.index != 0) return INCOMPLETE_WRITE~;
}

View File

@@ -68,7 +68,7 @@ fn usz? ByteBuffer.read(&self, char[] bytes) @dynamic
if (readable == 0)
{
self.has_last = false;
return io::EOF?;
return io::EOF~;
}
usz n = min(readable, bytes.len);
bytes[:n] = self.bytes[self.read_idx:n];
@@ -84,7 +84,7 @@ fn char? ByteBuffer.read_byte(&self) @dynamic
if (readable == 0)
{
self.has_last = false;
return io::EOF?;
return io::EOF~;
}
char c = self.bytes[self.read_idx];
self.read_idx++;
@@ -98,7 +98,7 @@ fn char? ByteBuffer.read_byte(&self) @dynamic
*>
fn void? ByteBuffer.pushback_byte(&self) @dynamic
{
if (!self.has_last) return io::EOF?;
if (!self.has_last) return io::EOF~;
assert(self.read_idx > 0);
self.read_idx--;
self.has_last = false;
@@ -109,15 +109,15 @@ fn usz? ByteBuffer.seek(&self, isz offset, Seek seek) @dynamic
switch (seek)
{
case SET:
if (offset < 0 || offset > self.write_idx) return INVALID_POSITION?;
if (offset < 0 || offset > self.write_idx) return INVALID_POSITION~;
self.read_idx = offset;
return offset;
case CURSOR:
if ((offset < 0 && self.read_idx < -offset) ||
(offset > 0 && self.read_idx + offset > self.write_idx)) return INVALID_POSITION?;
(offset > 0 && self.read_idx + offset > self.write_idx)) return INVALID_POSITION~;
self.read_idx += offset;
case END:
if (offset < 0 || offset > self.write_idx) return INVALID_POSITION?;
if (offset < 0 || offset > self.write_idx) return INVALID_POSITION~;
self.read_idx = self.write_idx - offset;
}
return self.read_idx;

View File

@@ -19,7 +19,7 @@ fn ByteReader* ByteReader.init(&self, char[] bytes)
fn usz? ByteReader.read(&self, char[] bytes) @dynamic
{
if (self.index >= self.bytes.len) return io::EOF?;
if (self.index >= self.bytes.len) return io::EOF~;
usz len = min(self.bytes.len - self.index, bytes.len);
if (len == 0) return 0;
mem::copy(bytes.ptr, &self.bytes[self.index], len);
@@ -29,13 +29,13 @@ fn usz? ByteReader.read(&self, char[] bytes) @dynamic
fn char? ByteReader.read_byte(&self) @dynamic
{
if (self.index >= self.bytes.len) return io::EOF?;
if (self.index >= self.bytes.len) return io::EOF~;
return self.bytes[self.index++];
}
fn void? ByteReader.pushback_byte(&self) @dynamic
{
if (!self.index) return INVALID_PUSHBACK?;
if (!self.index) return INVALID_PUSHBACK~;
self.index--;
}
@@ -48,7 +48,7 @@ fn usz? ByteReader.seek(&self, isz offset, Seek seek) @dynamic
case CURSOR: new_index = self.index + offset;
case END: new_index = self.bytes.len + offset;
}
if (new_index < 0) return INVALID_POSITION?;
if (new_index < 0) return INVALID_POSITION~;
self.index = new_index;
return new_index;
}

View File

@@ -56,7 +56,7 @@ fn String ByteWriter.str_view(&self) @inline
fn void? ByteWriter.ensure_capacity(&self, usz len) @inline
{
if (self.bytes.len > len) return;
if (!self.allocator) return OUT_OF_SPACE?;
if (!self.allocator) return OUT_OF_SPACE~;
if (len < 16) len = 16;
usz new_capacity = math::next_power_of_2(len);
char* new_ptr = allocator::realloc_try(self.allocator, self.bytes.ptr, new_capacity)!;

View File

@@ -24,7 +24,7 @@ fn void? LimitReader.close(&self) @dynamic
fn usz? LimitReader.read(&self, char[] bytes) @dynamic
{
if (self.limit == 0) return io::EOF?;
if (self.limit == 0) return io::EOF~;
usz m = min(bytes.len, self.limit);
usz n = self.wrapped_stream.read(bytes[:m])!;
self.limit -= n;
@@ -33,7 +33,7 @@ fn usz? LimitReader.read(&self, char[] bytes) @dynamic
fn char? LimitReader.read_byte(&self) @dynamic
{
if (self.limit == 0) return io::EOF?;
if (self.limit == 0) return io::EOF~;
defer try self.limit--;
return self.wrapped_stream.read_byte();
}

View File

@@ -49,11 +49,11 @@ fn usz? MultiReader.read(&self, char[] bytes) @dynamic
usz? n = r.read(bytes);
if (catch err = n)
{
if (err != io::EOF) return err?;
if (err != io::EOF) return err~;
self.index++;
if (self.index >= self.readers.len)
{
return io::EOF?;
return io::EOF~;
}
return self.read(bytes);
}

View File

@@ -46,7 +46,7 @@ fn usz? MultiWriter.write(&self, char[] bytes) @dynamic
foreach (w : self.writers)
{
n = w.write(bytes)!;
if (n != bytes.len) return INCOMPLETE_WRITE?;
if (n != bytes.len) return INCOMPLETE_WRITE~;
}
return bytes.len;
}

View File

@@ -65,7 +65,7 @@ fn char[]? Scanner.scan(&self, String pattern = "\n")
{
// Split pattern not found with maximized search, abort.
// Split pattern not found and already read as much as possible.
return NOT_FOUND?;
return NOT_FOUND~;
}
// Split pattern not found: maximize the search and try one more time.
self.buf[:n] = buf[..];
@@ -92,8 +92,8 @@ macro usz? Scanner.refill(&self, buf) @private
usz? n = self.wrapped_stream.read(buf);
if (catch err = n)
{
if (err == io::EOF) return NOT_FOUND?;
return err?;
if (err == io::EOF) return NOT_FOUND~;
return err~;
}
return n;
}

View File

@@ -30,7 +30,7 @@ fn usz? TeeReader.read(&self, char[] bytes) @dynamic
usz nr, nw;
nr = self.r.read(bytes)!;
nw = self.w.write(bytes[:nr])!;
if (nr != nw) return GENERAL_ERROR?;
if (nr != nw) return GENERAL_ERROR~;
return nr;
}