8 #ifndef INCL_evo_impl_sysio_h 9 #define INCL_evo_impl_sysio_h 12 #include "../string.h" 13 #include <sys/types.h> 25 #pragma warning(disable:4100 4996) 37 static bool read_wait(
Error& err,
int handle, ulong timeout_ms,
bool autoresume) {
39 assert(timeout_ms > 0);
43 FD_SET(handle, &read_set);
45 struct timeval timeout;
48 int waitresult = ::select(handle+1, &read_set, NULL, NULL, &timeout);
53 #if !defined(__linux__) // Linux select() updates timeout, others need to set it again 60 case EBADF: err =
EClosed;
break;
64 }
else if (waitresult == 0) {
73 static ulong
read(
Error& err,
int handle,
void* buf, ulong size, ulong timeout_ms,
bool autoresume) {
85 result =
::read(handle, buf, size);
92 case ENOSPC: err =
ESpace;
break;
93 case EFBIG: err =
ESize;
break;
94 case EFAULT: err =
EPtr;
break;
95 case EBADF: err =
EClosed;
break;
96 #if EAGAIN != EWOULDBLOCK 100 default: err =
ERead;
break;
113 FD_SET(handle, &write_set);
115 struct timeval timeout;
118 int waitresult = ::select(handle+1, NULL, &write_set, NULL, &timeout);
119 if (waitresult < 0) {
123 #if !defined(__linux__) // Linux select() updates timeout, others need to set it again 130 case EBADF: err =
EClosed;
break;
134 }
else if (waitresult == 0) {
143 static ulong
write(
Error& err,
int handle,
const void* buf, ulong size, ulong timeout_ms,
bool autoresume) {
149 if (size > SSIZE_MAX)
155 result =
::write(handle, buf, size);
159 }
else if (result < 0) {
165 case ENOSPC: err =
ESpace;
break;
166 case EFBIG: err =
ESize;
break;
167 case EFAULT: err =
EPtr;
break;
168 case EBADF: err =
EClosed;
break;
169 #if EAGAIN != EWOULDBLOCK 172 case EWOULDBLOCK: err =
ENonBlock;
break;
173 default: err =
EWrite;
break;
214 {
return (open & O_RDWR || !(open & (O_WRONLY | O_APPEND))); }
221 {
return ((open & (O_RDWR | O_WRONLY | O_APPEND)) != 0); }
249 ulong
read(
Error& err,
void* buf, ulong size, ulong timeout_ms=0)
250 { err =
ENone;
return 0; }
262 ulong
write(
Error& err,
const void* buf, ulong size, ulong timeout_ms=0)
275 static const bool STREAM_SEEKABLE =
true;
283 static const Handle INVALID = -1;
293 {
return (handle != INVALID); }
299 { Handle result = handle; handle = INVALID;
return result; }
304 static const int DEFPERM = _S_IREAD | _S_IWRITE;
305 static const int READONLY = _S_IREAD;
306 static const int USER_RD = _S_IREAD;
307 static const int USER_RW = _S_IREAD | _S_IWRITE;
310 { handle = INVALID; }
312 Error open(
const char* path,
Open mode,
int perm=DEFPERM) {
314 handle = ::_open(path, mode | _O_BINARY, perm);
320 case EACCES: err =
EAccess;
break;
321 case EEXIST: err =
EExist;
break;
324 default: err =
EFail;
break;
331 Error open_dup(Handle other, Handle target=INVALID) {
333 if (target == INVALID) {
334 const int result = ::_dup(other);
339 }
else if (::_dup2(other, target) == 0) {
345 case EBADF: err =
EClosed;
break;
346 default: err =
EFail;
break;
352 if (handle != INVALID) {
358 ulongl pos(
Error& err) {
359 __int64 result = _lseeki64(handle, 0, SEEK_CUR);
362 case EBADF: err =
EClosed;
break;
363 default: err =
EFail;
break;
368 return (ulongl)result;
373 { err =
ESize;
return 0; }
374 __int64 result = _lseeki64(handle, offset, (
int)start);
377 case EBADF: err =
EClosed;
break;
378 default: err =
EFail;
break;
383 return (ulongl)result;
386 ulong
read(
Error& err,
void* buf, ulong size, ulong timeout_ms=0) {
387 if (handle == INVALID) {
395 result = ::_read(handle, buf, size);
398 case ENOSPC: err =
ESpace;
break;
399 case EFBIG: err =
ESize;
break;
400 case EFAULT: err =
EPtr;
break;
401 case EBADF: err =
EClosed;
break;
402 default: err =
ERead;
break;
409 return (ulong)result;
412 ulong
write(
Error& err,
const void* buf, ulong size, ulong timeout_ms=0) {
413 if (handle == INVALID) {
421 result = ::_write(handle, buf, size);
425 }
else if (result < 0) {
427 case ENOSPC: err =
ESpace;
break;
428 case EINVAL: err =
EPtr;
break;
429 case EBADF: err =
EClosed;
break;
430 default: err =
EWrite;
break;
444 static const int DEFPERM = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH;
446 static const int READONLY = S_IRUSR | S_IRGRP | S_IROTH;
448 static const int USER_RD = S_IRUSR;
450 static const int USER_RW = S_IRUSR | S_IWUSR;
454 { handle = INVALID; autoresume =
true; }
464 handle = ::open(path, mode, perm);
473 case EACCES: err =
EAccess;
break;
474 case EEXIST: err =
EExist;
break;
475 case EFAULT: err =
EPtr;
break;
477 case ENAMETOOLONG: err =
ESize;
break;
480 case ENOSPC: err =
ESpace;
break;
483 default: err =
EFail;
break;
497 if (target == INVALID) {
498 const int result = ::dup(src);
503 }
else if (::dup2(src, target) == 0) {
509 case EBADF: err =
EClosed;
break;
510 default: err =
EFail;
break;
517 if (handle != INVALID) {
528 off_t result = lseek(handle, 0, SEEK_CUR);
531 case EBADF: err =
EClosed;
break;
532 case EOVERFLOW: err =
ESize;
break;
533 case ESPIPE: err =
EInval;
break;
534 default: err =
EFail;
break;
550 { err =
ESize;
return 0; }
551 off_t result = lseek(handle, offset, (
int)start);
554 case EBADF: err =
EClosed;
break;
555 case EOVERFLOW: err =
ESize;
break;
556 case ESPIPE: err =
EInval;
break;
557 default: err =
EFail;
break;
566 ulong
read(
Error& err,
void* buf, ulong size, ulong timeout_ms=0)
567 {
return SysLinuxIo::read(err, handle, buf, size, timeout_ms, autoresume); }
570 ulong
write(
Error& err,
const void* buf, ulong size, ulong timeout_ms=0)
577 if (::mkdir(path, perm) == 0) {
583 case EROFS: err =
EAccess;
break;
584 case EEXIST: err =
EExist;
break;
585 case EFAULT: err =
EPtr;
break;
588 case ENAMETOOLONG: err =
ESize;
break;
591 case ENOSPC: err =
ESpace;
break;
592 default: err =
EFail;
break;
600 if (::rmdir(path) == 0) {
607 case EROFS: err =
EAccess;
break;
608 case ENOTEMPTY: err =
EExist;
break;
609 case EFAULT: err =
EPtr;
break;
610 case EINVAL: err =
EInval;
break;
612 case ENAMETOOLONG: err =
ESize;
break;
615 case ENOSPC: err =
ESpace;
break;
616 default: err =
EFail;
break;
624 if (::unlink(path) == 0) {
631 case EROFS: err =
EAccess;
break;
632 case EFAULT: err =
EPtr;
break;
634 case ENAMETOOLONG: err =
ESize;
break;
638 default: err =
EFail;
break;
659 static const ulong DEFSIZE = 8192;
691 readbuf.
used = curbuf_offset = 0;
692 if (readbuf.
size == 0)
718 if (minsize == 0 || minsize > readbuf.
size)
719 minsize = readbuf.
size;
724 readbuf.
flush(curbuf_offset);
725 while (readbuf.
used < minsize) {
726 readsize = in.read(err, readbuf.
data+readbuf.
used, readbuf.
size-readbuf.
used);
730 readbuf.
used += readsize;
752 assert( bufsize > 0 );
753 assert( curbuf->
used <= curbuf->
size );
754 assert( curbuf_offset <= curbuf->used );
756 ulong readtotal = 0, usedleft = curbuf->
used - curbuf_offset;
757 if (bufsize <= usedleft) {
759 memcpy(buf, curbuf->
data+curbuf_offset, bufsize);
761 curbuf_offset += bufsize;
765 memcpy(buf, curbuf->
data+curbuf_offset, usedleft);
766 (
char*&)buf += usedleft;
768 readtotal = usedleft;
773 if (bufsize >= curbuf->
size) {
774 readsize = in.read(err, buf, bufsize);
777 (
char*&)buf += readsize;
779 readtotal += readsize;
785 readsize = in.read(err, curbuf->
data, curbuf->
size);
788 curbuf->
used = readsize;
791 if (curbuf->
used > 0) {
792 curbuf_offset = (bufsize > curbuf->
used ? curbuf->
used : bufsize);
793 memcpy(buf, curbuf->
data, curbuf_offset);
794 readtotal += curbuf_offset;
827 assert( curbuf->
size >= 2 );
828 assert( curbuf->
used <= curbuf->
size );
829 assert( curbuf_offset <= curbuf->used );
830 assert( bufsize > 0 );
831 ulong bytesread = 0, len, len2;
833 if (rd_partnl != 0) {
841 if (curbuf_offset+1 >= curbuf->
used) {
846 if (curbuf->
used == 0) {
848 return (ulong)bytesread;
851 if (rl_partnl != 0) {
853 if (curbuf->
data[curbuf_offset] == rl_partnl)
858 len = curbuf->
used - curbuf_offset;
859 len2 = bufsize - bytesread;
860 const char* start = curbuf->
data + curbuf_offset;
861 const char* end1 = start + (len2 < len ? len2 : len);
862 const char* end2 = start + len;
863 const char* p = start;
864 uint read_nl_size = 0;
878 }
else if (p[1] == checknext) {
880 if (newline[1] !=
'\0' && p+1 >= end1) {
883 if (checknext == newline[1])
884 { p += 2;
continue; }
889 if (newline[1] ==
'\0' && *p == newline[0])
896 memcpy(buf+bytesread, start, (len=(ulong)(p-start)));
898 curbuf_offset += (ulong)len;
900 if (read_nl_size == 0 || bytesread+newlinesize > bufsize) {
904 rd_partnl = newline[1];
906 curbuf_offset += read_nl_size;
911 curbuf_offset += read_nl_size;
912 memcpy(buf+bytesread, newline, newlinesize);
913 bytesread += newlinesize;
914 start = (p += read_nl_size);
919 memcpy(buf+bytesread, start, (len=(ulong)(p-start)));
921 curbuf_offset += (ulong)len;
925 if (bytesread >= bufsize)
931 assert( bytesread > 0 );
932 return (ulong)bytesread;
948 assert( curbuf->
used <= curbuf->
size );
949 assert( curbuf_offset <= curbuf->used );
958 if (curbuf_offset >= curbuf->
used) {
963 if (curbuf->
used == 0)
966 if (rl_partnl != 0) {
968 if (curbuf->
data[curbuf_offset] == rl_partnl) {
970 if (++curbuf_offset >= curbuf->
used) {
978 const char* start = curbuf->
data + curbuf_offset;
979 const char* end = curbuf->
data + curbuf->
used;
980 for (
const char* p=start; p < end; ++p) {
989 len = (ulong)(p - start);
990 if (maxlen > 0 && str.
size()+len > maxlen)
993 curbuf_offset += len + 1;
997 if (curbuf->
data[curbuf_offset] == checknext)
1000 rl_partnl = checknext;
1005 len = (ulong)(end - start);
1006 if (maxlen > 0 && str.
size()+len > maxlen)
1008 str.
add(start, len);
1009 curbuf_offset += len;
1024 static const ulong DEFSIZE = 16384;
1051 void open(
bool flushlines_val=
false) {
1055 flushlines = flushlines_val;
1072 assert( used <= size );
1074 ulong flushpos = 0, writesize;
1075 while (flushpos < used) {
1076 writesize = out.write(err, data+flushpos, used-flushpos);
1079 assert( writesize > 0 );
1080 flushpos += writesize;
1100 assert( used <= size );
1102 ulong writesize = size - used;
1103 if (bufsize < writesize) {
1105 memcpy(data+used, buf, bufsize);
1109 ulong bufleft = bufsize;
1111 if (writesize > 0) {
1112 memcpy(data+used, buf, writesize);
1114 (
char*&)buf += writesize;
1115 bufleft -= writesize;
1117 if ( (err=flush(out)) !=
ENone )
1121 if (bufleft >= size) {
1124 writesize = out.write(err, buf, bufleft);
1127 assert( writesize > 0 );
1128 (
char*&)buf += writesize;
1129 bufleft -= writesize;
1130 }
while (bufleft > 0);
1131 }
else if (bufleft > 0) {
1133 memcpy(data, buf, bufleft);
1138 assert( size == 0 || used < size );
1158 assert( used <= size );
1159 const ulong countsize = count * bufsize;
1160 if (count > 0 && bufsize > 0) {
1162 const ulong BUF_THRESHOLD = size / 2;
1163 if (bufsize < BUF_THRESHOLD) {
1165 char*
const end = (data + size) - bufsize + 1;
1166 char* p = data + used;
1167 for (ulong writecount=0;;) {
1168 for (writecount=0; p < end && writecount < count; p+=bufsize, ++writecount)
1169 memcpy(p, buf, bufsize);
1170 used += (writecount * bufsize);
1171 count -= writecount;
1172 if ( p >= end && (err=flush(out)) !=
ENone )
1180 if ( (err=flush(out)) !=
ENone )
1186 ulong writesize, writeleft;
const char* p;
1189 for (writeleft=bufsize, p=(
const char*)buf;; p+=writesize) {
1190 writesize = out.write(err, p, writeleft);
1193 assert( writesize > 0 );
1194 writeleft -= writesize;
1198 }
while (--count > 0);
1201 assert( size == 0 || used < size );
1220 assert( used <= size );
1222 ulong writesize = size - used;
1223 if (count < writesize) {
1225 memset(data+used, ch, count);
1228 ulong remain = count;
1231 assert( writesize > 0 );
1234 if ((err=flush(out)) !=
ENone)
1236 writesize = (remain < size ? remain : size);
1240 assert( writesize <= remain );
1241 memset(data+used, ch, writesize);
1243 remain -= writesize;
1248 out.write(err, &ch, 1);
1251 }
while (--remain > 0);
1255 assert( size == 0 || used < size );
1276 assert( used <= size );
1277 ulong writesize = 0;
1279 const char* start = buf;
1281 if (*start == partnl)
1286 ulong flushlines_size = 0;
1287 ulong len, cur_newline_size;
char checknext;
1288 const char* end = buf + bufsize;
1289 for (
const char* p=start; p < end; ) {
1292 else if (*p ==
'\r')
1299 cur_newline_size = 1;
1300 }
else if (p[1] == checknext) {
1301 if (newline[1] == checknext) {
1303 flushlines_size = used + (ulong)(p - start);
1306 cur_newline_size = 2;
1307 }
else if (*p == *newline && newline[1] ==
'\0') {
1309 flushlines_size = used + (ulong)(p - start);
1312 cur_newline_size = 1;
1314 len = (ulong)(p - start);
1315 if ( ( p > start && !writebin(err, out, start, len) ) ||
1316 !writebin(err, out, newline, newlinesize)
1319 start = (p += cur_newline_size);
1320 writesize += len + newlinesize;
1321 flushlines_size = used;
1325 len = (ulong)(end - start);
1326 if (!writebin(err, out, start, len))
1331 if (flushlines && flushlines_size > 0 && used > 0) {
1333 assert( flushlines_size <= used );
1334 ulong flushpos = 0, flushwritesize;
1336 flushwritesize = out.write(err, data+flushpos, flushlines_size-flushpos);
1339 assert( flushwritesize > 0 );
1340 flushpos += flushwritesize;
1341 }
while (flushpos < flushlines_size);
1342 used -= flushlines_size;
1344 memmove(data, data+flushlines_size, used);
1360 template<
class TOut>
1362 assert( used <= size );
1364 if (field.
width >= 0 && (uint)field.
width > count) {
1365 if (size < (uint)field.
width)
1367 if (size-used < (uint)field.
width && (err=flush(out)) !=
ENone)
1370 const int fillchar = (int)(field.
fill != 0 ? (uchar)field.
fill : (uchar)
' ');
1371 const uint padding = (uint)field.
width - count;
1372 char* p = data + used;
1373 switch (field.
align) {
1376 memset(p, (
int)(uchar)ch, count);
1378 memset(p + count, fillchar, padding);
1381 const uint padleft = (padding / 2);
1383 memset(p, fillchar, padleft);
1386 memset(p, (
int)(uchar)ch, count);
1387 const uint padright = (padding - padleft);
1390 memset(p, fillchar, padright);
1396 memset(p, fillchar, padding);
1399 memset(p, (
int)(uchar)ch, count);
1402 used += (uint)field.
width;
1403 }
else if (count > 0) {
1406 if (size-used < count && (err=flush(out)) !=
ENone)
1408 memset(data + used, (
int)(uchar)ch, count);
1428 template<
class TOut>
1430 assert( used <= size );
1434 if (size-used < strsize && (err=flush(out)) !=
ENone)
1437 if (field.
width >= 0 && (ulong)field.
width > strsize) {
1438 const int fillchar = (int)(field.
fill != 0 ? (uchar)field.
fill : (uchar)
' ');
1439 const uint padding = field.
width - strsize;
1440 char* p = data + used;
1441 used += strsize + padding;
1443 switch (field.
align) {
1446 memcpy(p, str, strsize);
1448 memset(p + strsize, fillchar, padding);
1451 const uint padleft = (padding / 2);
1453 memset(p, fillchar, padleft);
1456 memcpy(p, str, strsize);
1457 const uint padright = (padding - padleft);
1460 memset(p, fillchar, padright);
1466 memset(p, fillchar, padding);
1469 memcpy(p, str, strsize);
1472 }
else if (strsize > 0) {
1473 memcpy(data + used, str, strsize);
1498 assert( used <= size );
1507 else if (ch ==
'\r')
1511 count = writebin_char(err, out, ch, count);
1514 if (newlinesize == 1)
1516 count = writebin_char(err, out, *newline, count);
1519 count = writebin2(err, out, newline, newlinesize, count);
1540 template<
class TOut,
class TNum>
1542 assert( used <= size );
1547 if (size-used < len && (err=flush(out)) !=
ENone)
1550 impl::fnum(data+used, num, base);
1566 template<
class TOut,
class TNum>
1568 assert( used <= size );
1573 if (size-used < len && (err=flush(out)) !=
ENone)
1576 impl::fnumu(data+used, num, base);
1592 template<
class TOut,
class TNum>
1594 assert( used <= size );
1595 int exp = 0; uint maxlen;
Error err;
1596 if (precision < 0) {
1601 if (size-used < maxlen && (err=flush(out)) !=
ENone)
1603 used += impl::fnumfe(data+used, num, exp,
false);
1609 if (size-used < maxlen && (err=flush(out)) !=
ENone)
1611 used += impl::fnumf(data+used, num, exp, precision);
1629 template<
class TOut,
class TNum>
1632 assert( used <= size );
1635 const int align_padding = (field != NULL && field->width > width ? field->width - width : 0);
1636 const uint len = width + align_padding;
1641 if (size-used < len && (err=flush(out)) !=
ENone)
1644 fmt.impl_num_write(data + used, num, digits, width, align_padding, field);
1664 template<
class TOut,
class TNum>
1666 assert( used <= size );
1670 uint prefix_len = 0;
1671 fmt.impl_prefix_info(prefix_ch, prefix_len);
1675 const int full_width = width + prefix_len;
1676 const int align_padding = (field != NULL && field->width > full_width ? field->width - full_width : 0);
1677 const uint len = full_width + align_padding;
1682 if (size-used < len && (err=flush(out)) !=
ENone)
1685 char* p = data + used;
1688 int align_padleft, align_padright;
1691 if (align_padleft > 0) {
1692 memset(p, (
int)(uchar)field->fill, align_padleft);
1696 FmtSetInt::impl_prefix_write(p, prefix_ch, prefix_len);
1698 if (digits < width) {
1699 const uint padlen = width - digits;
1700 const int ch = (fmt.
pad_ch == 0 ?
'0' : (int)(uchar)fmt.
pad_ch);
1701 memset(p, ch, padlen);
1705 impl::fnumu(p, num, base);
1707 if (align_padright > 0)
1708 memset(p, (
int)(uchar)field->fill, align_padright);
1726 template<
class TOut,
class TNum>
1728 const int align_width = (field != NULL ? field->width : 0);
1729 int exp = 0, maxlen;
1730 fmt.impl_info(num, exp, maxlen, align_width);
1732 if (size < (uint)maxlen)
1735 if (size-used < (uint)maxlen && (err=flush(out)) !=
ENone)
1738 used += fmt.impl_write(data + used, num, exp, align_width, field);
1754 template<
class TOut>
1756 const char* DIGITS = (fmt.
upper ?
"0123456789ABCDEF" :
"0123456789abcdef");
1758 const ulong FLUSH_SIZE = size - 3;
1761 const uchar* ptr = (uchar*)fmt.
buf;
1762 const uchar* ptr_end = ptr + fmt.
size;
1763 const uchar* ptr_nl;
1771 for (
const uchar* ptr2; ptr < ptr_end; ) {
1774 if ((err = writefmtnumu(out, offset, offset_fmt)) !=
ENone)
1778 if (used >= FLUSH_SIZE && (err=flush(out)) !=
ENone)
1786 ptr_nl = ptr + LINE_SIZE;
1787 if (ptr_nl > ptr_end)
1792 for (; ptr < ptr_nl; ++ptr) {
1793 if (used >= FLUSH_SIZE && (err=flush(out)) !=
ENone)
1795 data[used++] = DIGITS[(*ptr >> 4) & 0x0F];
1796 data[used++] = DIGITS[*ptr & 0x0F];
1804 if (ptr_nl >= ptr_end && fmt.
maxline > 0 && ptr2 != (uchar*)fmt.
buf) {
1807 ulong avail, wrlen, count = (remainder > 0 ? ((fmt.
maxline - remainder) * 3) + 1 : 1);
1809 if (used >= FLUSH_SIZE && (err=flush(out)) !=
ENone)
1811 avail = size - used;
1812 wrlen = (count > avail ? avail : count);
1813 memset(data + used,
' ', wrlen);
1819 if (used >= FLUSH_SIZE && (err=flush(out)) !=
ENone)
1825 for (; ptr2 < ptr_nl; ++ptr2) {
1826 if (used >= FLUSH_SIZE && (err=flush(out)) !=
ENone)
1828 if (*ptr2 < ' ' || *ptr2 >
'~')
1831 data[used++] = (char)*ptr2;
1836 if (used >= FLUSH_SIZE && (err=flush(out)) !=
ENone)
1838 memcpy(data + used, newline, newlinesize);
1839 used += newlinesize;
1848 #if defined(_MSC_VER) 1849 #pragma warning(pop) bool compact
Whether to use compact mode (no address or ASCII output)
Definition: str.h:3298
Error readline(String &str, T &in, ulong maxlen=0)
Read a line from file using buffer.
Definition: sysio.h:947
void open(bool flushlines_val=false)
Initialize and open for output (writing).
Definition: sysio.h:1051
int Handle
System file handle.
Definition: sysio.h:280
Operation timed out.
Definition: sys.h:1131
Size size() const
Get size.
Definition: list.h:759
T & max(T &a, T &b)
Returns highest of given values.
Definition: alg.h:47
const char * getnewline(Newline newline=NL)
Get newline string for given type.
Definition: sys.h:793
ulong size
Buffer size in bytes to dump.
Definition: str.h:3296
Seek
Seek starting position.
Definition: sysio.h:203
System call interrupted by signal (Linux/Unix), auto-resume disabled.
Definition: sys.h:1132
ExceptionFileIn ExceptionInT
Input exception type for file stream.
Definition: sysio.h:277
IoReader(ulong newsize=0, Newline nl=NL_SYS)
Constructor to set new buffer size.
Definition: sysio.h:675
General stream or resource read error.
Definition: sys.h:1143
Out of bounds error.
Definition: sys.h:1129
Holds integer formatting attributes.
Definition: str.h:2589
Error writefmtdump(TOut &out, const FmtDump &fmt, const char *newline, uint newlinesize)
Write formatted buffer dump in hex.
Definition: sysio.h:1755
char pad_ch
Fill character, 0 if unspecified (use baseline or default) (default: '0')
Definition: str.h:2593
bool isopen() const
Get whether file is open.
Definition: sysio.h:292
ExceptionStreamOut ExceptionOutT
Output exception type for device (may be overridden by derived)
Definition: sysio.h:233
Operation would block (non-blocking I/O)
Definition: sys.h:1118
Invalid argument or data.
Definition: sys.h:1123
bool upper
Whether to use uppercase hex, false for lowercase.
Definition: str.h:3299
Permission denied.
Definition: sys.h:1135
Base 16: hexadecimal.
Definition: str.h:2324
bool open_writable(Open open)
Check whether open mode is writable.
Definition: sysio.h:220
Invalid pointer used.
Definition: sys.h:1133
ulong readbin(Error &err, T &in, void *buf, ulong bufsize)
Read from file using buffer.
Definition: sysio.h:751
static Error rmdir(const char *path)
Definition: sysio.h:598
void close()
Definition: sysio.h:516
ulong readtext(Error &err, T &in, char *buf, ulong bufsize)
Read from file using buffer.
Definition: sysio.h:826
Read and write.
Definition: sysio.h:192
Error open_dup(Handle src, Handle target=INVALID)
Open duplicate handle from source handle.
Definition: sysio.h:495
Seek to end.
Definition: sysio.h:206
Stream or resource is closed
Definition: sys.h:1130
IoFile()
Constructor.
Definition: sysio.h:453
Error writenumu(TOut &out, TNum num, int base=fDEC)
Write formatted unsigned number to device using buffer.
Definition: sysio.h:1567
Automatic floating point precision – either normal decimal notation or E notation, whichever is shorter (default)
Definition: str.h:2343
~IoFile()
Destructor.
Definition: sysio.h:286
ulong timeout_ms
Read timeout in milliseconds, 0 for none (don't timeout)
Definition: sysio.h:665
Seek from current position.
Definition: sysio.h:205
Not enough space/memory available.
Definition: sys.h:1134
char fill
Field fill character to pad up to width (default: ' ')
Definition: str.h:2484
IoWriter(ulong newsize=0, Newline nl=NL_SYS)
Constructor to set new buffer size and newline value.
Definition: sysio.h:1036
static int digits(T num, int base=10)
Get number of digits for given number and base.
Definition: type.h:1028
Read and write, create/replace.
Definition: sysio.h:193
ulong size
Buffer size (capacity) in bytes – do not modify, use: resize(), minsize(), reset(), ref()
Definition: rawbuffer.h:36
Open
Open mode for files and streams.
Definition: sysio.h:190
bool open_readable(Open open)
Check whether open mode is readable.
Definition: sysio.h:213
Output stream exception for stream write errors, see Exception.
Definition: sys.h:1401
Newline
Newline type.
Definition: sys.h:748
ulong writetext_char(Error &err, T &out, char ch, ulong count)
Write data to device using buffer.
Definition: sysio.h:1497
bool flushlines
Whether to flush after each line (aka line buffering) – only applies to text writes, i.e. writetext()
Definition: sysio.h:1029
Evo I/O streams and Console I/O.
void open()
Initialize and open for input (reading).
Definition: sysio.h:690
String & clear()
Clear by removing all items.
Definition: string.h:4975
uint newlinesize
Size of default newline string to use, i.e. strlen(newline) – do not modify.
Definition: sysio.h:1028
uint maxline
Maximum bytes per line to dump, 0 for none (all 1 line)
Definition: str.h:3297
ulong timeout_ms
Write timeout in milliseconds, 0 for none (no timeout)
Definition: sysio.h:1026
void close()
Close stream.
Definition: sysio.h:236
ulongl seek(Error &err, ulongl offset, Seek start=sBegin)
Seek to file position.
Definition: sysio.h:548
Resource not found.
Definition: sys.h:1137
bool autoresume
Whether to auto-resume I/O operation after signal received [Linux/Unix].
Definition: sysio.h:644
char rl_partnl
Used by readline() on partial newlines, holds next expected char for newline pair or 0...
Definition: sysio.h:669
Size limit exceeded.
Definition: sys.h:1139
No error.
Definition: sys.h:1115
Reached end of resource (not an error)
Definition: sys.h:1116
ulong writebin2(Error &err, T &out, const void *buf, ulong bufsize, ulong count)
Write repeated data to device using buffer.
Definition: sysio.h:1157
int pad_width
Width to fill to, 0 for none, -1 if unspecified (use baseline or default) (default: 0) ...
Definition: str.h:2592
Error writefmtstr(TOut &out, const char *str, ulong strsize, const FmtSetField &field)
Write string data to device using buffer, formatted with field alignment.
Definition: sysio.h:1429
Error
General Evo error code stored in exceptions, or used directly when exceptions are disabled...
Definition: sys.h:1113
Buffer too small error.
Definition: sys.h:1127
uint getnewlinesize(Newline newline=NL)
Get newline string size for given type.
Definition: sys.h:804
Error writefmtchar(TOut &out, char ch, ulong count, const FmtSetField &field)
Write repeated character data to device using buffer, formatted with field alignment.
Definition: sysio.h:1361
Seek from beginning.
Definition: sysio.h:204
uint newlinesize
Size of newlines string to use, i.e. strlen(newline) – do not modify.
Definition: sysio.h:667
Read and write/append, create/replace.
Definition: sysio.h:195
Base 10: decimal (default)
Definition: str.h:2323
ulong writebin(Error &err, T &out, const void *buf, ulong bufsize)
Write data to device using buffer.
Definition: sysio.h:1099
String container.
Definition: string.h:674
File I/O device (used internally).
Definition: sysio.h:274
const void * buf
Buffer to dump.
Definition: str.h:3295
static ulong read(Error &err, int handle, void *buf, ulong size, ulong timeout_ms, bool autoresume)
Definition: sysio.h:73
Read only.
Definition: sysio.h:191
const char * newline
Newline string to convert to when reading text – do not modify.
Definition: sysio.h:666
ExceptionStreamIn ExceptionInT
Input exception type for device (may be overridden by derived)
Definition: sysio.h:232
Buffered reader for IoDevice (used internally).
Definition: sysio.h:658
T Type
Translated type.
Definition: meta.h:373
void flush(ulong &offset)
Flush data already read from buffer using offset.
Definition: rawbuffer.h:229
static Error mkdir(const char *path, int perm=0)
Definition: sysio.h:573
Align center by adding filler on left and right sides.
Definition: str.h:2359
String length limit exceeded
Definition: sys.h:1141
RawBuffer readbuf
Primary read buffer – filtering may involve additional buffers.
Definition: sysio.h:661
char rd_partnl
Used by readtext() in special case, holds end of converted newline that didn't fit in buf or 0...
Definition: sysio.h:668
Write/append only, created if needed.
Definition: sysio.h:198
Error open(const char *path, Open mode, int perm=DEFPERM)
Open file for access.
Definition: sysio.h:462
FmtAlign align
Field alignment type (default: fLEFT)
Definition: str.h:2482
Error flush(T &out)
Flush buffer by writing to device.
Definition: sysio.h:1071
ulong write(Error &err, const void *buf, ulong size, ulong timeout_ms=0)
Definition: sysio.h:570
static const ulong DEFSIZE
Default buffer size (8KB, power of 2 and multiple of common filesystem block size 4KB) ...
Definition: sysio.h:659
Error writefmtnumu(TOut &out, TNum num, const FmtSetInt &fmt, const FmtSetField *field=NULL)
Write formatted unsigned number to device using buffer, using field attributes.
Definition: sysio.h:1665
ulong writebin_char(Error &err, T &out, char ch, ulong count)
Write repeated character to device using buffer.
Definition: sysio.h:1219
ulong writetext(Error &err, T &out, const char *buf, ulong bufsize)
Write data to device using buffer.
Definition: sysio.h:1275
Handle handle
System handle/descriptor.
Definition: sysio.h:647
Unknown or unspecified error.
Definition: sys.h:1120
RawBuffer & resize(ulong newsize)
Resize buffer.
Definition: rawbuffer.h:116
Read and write/append.
Definition: sysio.h:194
Evo C++ Library namespace.
Definition: alg.h:11
Input stream exception for stream read errors, see Exception.
Definition: sys.h:1397
static ulong write(Error &err, int handle, const void *buf, ulong size, ulong timeout_ms, bool autoresume)
Definition: sysio.h:143
static bool write_wait(Error &err, int handle, ulong timeout_ms, bool autoresume)
Definition: sysio.h:110
Holds floating point formatting attributes.
Definition: str.h:2775
Resource already exists.
Definition: sys.h:1136
const char * newline
Default newline string for formatting – do not modify.
Definition: sysio.h:1027
ulong read(Error &err, void *buf, ulong size, ulong timeout_ms=0)
Read input data from device.
Definition: sysio.h:249
I/O device base class for streams.
Definition: sysio.h:230
Error writefmtnumf(TOut &out, TNum num, const FmtSetFloat &fmt, const FmtSetField *field=NULL)
Write formatted floating point number to device using buffer, using field attributes.
Definition: sysio.h:1727
File output stream exception for file write errors, see Exception.
Definition: sys.h:1414
Write only.
Definition: sysio.h:196
static const Newline NL_SYS
Current system newline type.
Definition: sys.h:763
static T fexp10(int &exp, T num)
Extract normalized base 10 mantissa and exponent from number.
Definition: type.h:1438
char partnl
Used internally for handling partial newlines between writetext() calls.
Definition: sysio.h:1030
Buffered writer for IoDevice (used internally).
Definition: sysio.h:1023
Operation failed.
Definition: sys.h:1124
String & add(char ch)
Append character (modifier).
Definition: string.h:2741
RawBuffer * curbuf
Pointer to current buffer, either primary buffer or from last filter applied.
Definition: sysio.h:662
Align left by adding filler on right side.
Definition: str.h:2358
char * data
Buffer data pointer, NULL if empty (size=0)
Definition: rawbuffer.h:35
int base
Base for formatting (default: fDEC)
Definition: str.h:2590
void close()
Close output.
Definition: sysio.h:1059
ulong curbuf_offset
Bytes read from curbuf, i.e. buffer start offset.
Definition: sysio.h:663
static const ulong DEFSIZE
Default buffer size (16KB, power of 2 and multiple of common filesystem block size 4KB) ...
Definition: sysio.h:1024
Nullable basic floating-point base type.
Definition: type.h:1291
Error writenumf(TOut &out, TNum num, int precision=fPREC_AUTO)
Write formatted floating-point number to device using buffer.
Definition: sysio.h:1593
Write only, create/replace.
Definition: sysio.h:197
static void setup_align(int &align_padleft, int &align_padright, int align_padding, const FmtSetField *field)
Used to setup and calculate alignment padding (used internally).
Definition: str.h:2529
ulong read(Error &err, void *buf, ulong size, ulong timeout_ms=0)
Definition: sysio.h:566
int width
Field width to align in (default: 0)
Definition: str.h:2483
static bool read_wait(Error &err, int handle, ulong timeout_ms, bool autoresume)
Definition: sysio.h:37
Error fill(T &in, ulong minsize=0)
Reset and fill buffer by reading from file.
Definition: sysio.h:717
Align right by adding filler on left side.
Definition: str.h:2360
ulongl pos(Error &err)
Get current file position.
Definition: sysio.h:527
static Error rm(const char *path)
Definition: sysio.h:622
static void set_timeval_ms(struct timeval &tm, ulong ms)
Definition: sys.h:1526
Operation aborted to prevent data loss (used in special cases)
Definition: sys.h:1125
Error writefmtnum(TOut &out, TNum num, const FmtSetInt &fmt, const FmtSetField *field=NULL)
Write formatted signed number to device using buffer, using field attributes.
Definition: sysio.h:1630
File input stream exception for file read errors, see Exception.
Definition: sys.h:1410
void close()
Close input.
Definition: sysio.h:699
Simple raw memory buffer.
Definition: rawbuffer.h:34
Holds field and alignment formatting attributes.
Definition: str.h:2481
Function not supported/implemented.
Definition: sys.h:1121
Handle detach()
Detach and return file handle.
Definition: sysio.h:298
ulong write(Error &err, const void *buf, ulong size, ulong timeout_ms=0)
Write output data to device.
Definition: sysio.h:262
Error writenum(TOut &out, TNum num, int base=fDEC)
Write formatted signed number to device using buffer.
Definition: sysio.h:1541
General stream or resource write error.
Definition: sys.h:1144
ExceptionFileOut ExceptionOutT
Output exception type for file stream.
Definition: sysio.h:278
Explicitly format a hex dump from buffer.
Definition: str.h:3294
Current alignment (i.e. unspecified/default)
Definition: str.h:2357
ulong used
Buffer size in use in bytes.
Definition: rawbuffer.h:37
Write/append only, create/replace.
Definition: sysio.h:199