mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
- Create optional with ~ instead of ?. return io::EOF?; becomes return io::EOF~.
- Deprecated use of `?` to create optional.
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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~;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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~;
|
||||
}
|
||||
|
||||
@@ -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~;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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
|
||||
};
|
||||
}
|
||||
@@ -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
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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~;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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~;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)!;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user