const char *Formatter::Format_d(const Flags &flags, Int64 value, char *buff, size_t size) { char *p = buff + size - 1; *p = '\0'; if (value == 0) { if (flags.precision == 0) { // empty string } else { p--; *p = '0'; } } else if (value > 0) { int nCols = 0; for ( ; value != 0; value /= 10, nCols++) { p--; *p = (value % 10) + '0'; } if (nCols < flags.precision) { int precision = ChooseMin(flags.precision, static_cast<int>(size) - 2); int cnt = precision - nCols; while (cnt-- > 0) { p--; *p = '0'; } } if (flags.plusMode == PLUSMODE_Space) { p--; *p = ' '; } else if (flags.plusMode == PLUSMODE_Plus) { p--; *p = '+'; } } else { int nCols = 0; UInt64 valueNeg = -value; for ( ; valueNeg != 0; valueNeg /= 10, nCols++) { p--; *p = (valueNeg % 10) + '0'; } if (nCols < flags.precision) { int precision = ChooseMin(flags.precision, static_cast<int>(size) - 2); int cnt = precision - nCols; while (cnt-- > 0) { p--; *p = '0'; } } p--; *p = '-'; } return p; }
const char *Formatter::Format_o(const Flags &flags, UInt64 value, char *buff, size_t size) { char *p = buff + size - 1; *p = '\0'; if (value == 0) { if (flags.precision == 0) { // empty string } else { p--; *p = '0'; } } else { int nCols = 0; for ( ; value != 0; value >>= 3, nCols++) { p--; *p = '0' + (value & 0x7); } if (nCols < flags.precision) { int precision = ChooseMin(flags.precision, static_cast<int>(size) - 1); int cnt = precision - nCols; while (cnt-- > 0) { p--; *p = '0'; } } else if (flags.sharpFlag) { p--; *p = '0'; } } return p; }
size_t Pointer::StreamEx::DoRead(Signal &sig, void *buff, size_t len) { size_t offset = _pPointer->GetOffset(); size_t bytesEntire = _pPointer->GetEntireSize(); if (offset > bytesEntire) { sig.SetError(ERR_OutOfRangeError, "offset is out of range"); return 0; } size_t bytesToCopy = ChooseMin(bytesEntire - offset, len); ::memcpy(buff, _pPointer->GetPointerC(), bytesToCopy); _pPointer->SetOffset(offset + bytesToCopy); return bytesToCopy; }
size_t Stream::Peek(Signal &sig, void *buff, size_t len) { if (len == 0) return 0; if (_peek.buff == nullptr) { _peek.buff = new char [len]; _peek.bytes = DoRead(sig, _peek.buff, len); _peek.offsetRead = 0; if (sig.IsSignalled()) return 0; } else if (_peek.bytes < len) { char *buffNew = new char [len]; ::memcpy(buffNew, _peek.buff, _peek.bytes); size_t bytesAdd = DoRead(sig, buffNew + _peek.bytes, len - _peek.bytes); if (sig.IsSignalled()) return 0; delete[] _peek.buff; _peek.buff = buffNew; _peek.bytes += bytesAdd; _peek.offsetRead = 0; } size_t bytesToPeek = ChooseMin(_peek.bytes, len); ::memcpy(buff, _peek.buff, bytesToPeek); return bytesToPeek; }
const char *Formatter::Format_x(const Flags &flags, UInt64 value, char *buff, size_t size) { char *p = buff + size - 1; *p = '\0'; const char *convTbl = flags.upperCaseFlag? "0123456789ABCDEF" : "0123456789abcdef"; if (value == 0) { if (flags.precision == 0) { // empty string } else { p--; *p = '0'; } } else { int nCols = 0; for ( ; value != 0; value >>= 4, nCols++) { p--; *p = convTbl[value & 0xf]; } if (nCols < flags.precision) { int precision = ChooseMin(flags.precision, static_cast<int>(size) - 3); int cnt = precision - nCols; while (cnt-- > 0) { p--; *p = '0'; } } if (flags.sharpFlag) { p--; *p = flags.upperCaseFlag? 'X' : 'x'; p--; *p = '0'; } } return p; }