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