mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 18:31:55 -04:00
raise errors properly
This commit is contained in:
parent
0e5cc07f83
commit
5e838f0406
@ -337,19 +337,31 @@ seekpos(streampos pos, ios_openmode which) {
|
||||
////////////////////////////////////////////////////////////////////
|
||||
int PandaFileStreamBuf::
|
||||
overflow(int ch) {
|
||||
bool okflag = true;
|
||||
|
||||
size_t n = pptr() - pbase();
|
||||
if (n != 0) {
|
||||
write_chars(pbase(), n);
|
||||
pbump(-(int)n);
|
||||
size_t wrote = write_chars(pbase(), n);
|
||||
pbump(-(int)wrote);
|
||||
if (wrote != n) {
|
||||
okflag = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (ch != EOF) {
|
||||
// Store the extra character back in the buffer.
|
||||
assert(pptr() != epptr());
|
||||
*(pptr()) = ch;
|
||||
pbump(1);
|
||||
if (okflag && ch != EOF) {
|
||||
if (pptr() != epptr()) {
|
||||
// Store the extra character back in the buffer.
|
||||
*(pptr()) = ch;
|
||||
pbump(1);
|
||||
} else {
|
||||
// No room to store ch.
|
||||
okflag = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!okflag) {
|
||||
return EOF;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -363,9 +375,12 @@ int PandaFileStreamBuf::
|
||||
sync() {
|
||||
size_t n = pptr() - pbase();
|
||||
|
||||
write_chars(pbase(), n);
|
||||
pbump(-(int)n);
|
||||
size_t wrote = write_chars(pbase(), n);
|
||||
pbump(-(int)wrote);
|
||||
|
||||
if (n != wrote) {
|
||||
return EOF;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -485,11 +500,11 @@ read_chars(char *start, size_t length) {
|
||||
// Description: Outputs the indicated stream of characters to the
|
||||
// current file position.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void PandaFileStreamBuf::
|
||||
size_t PandaFileStreamBuf::
|
||||
write_chars(const char *start, size_t length) {
|
||||
if (length == 0) {
|
||||
// Trivial no-op.
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Make sure the read buffer is flushed.
|
||||
@ -518,7 +533,7 @@ write_chars(const char *start, size_t length) {
|
||||
<< "Error writing " << length
|
||||
<< " bytes to " << _filename << ", windows error code 0x" << hex
|
||||
<< error << dec << ". Disk full?\n";
|
||||
return;
|
||||
return bytes_written;
|
||||
}
|
||||
success = GetOverlappedResult(_handle, &overlapped, &bytes_written, false);
|
||||
}
|
||||
@ -531,26 +546,29 @@ write_chars(const char *start, size_t length) {
|
||||
if (lseek(_fd, _ppos, SEEK_SET) == -1) {
|
||||
cerr
|
||||
<< "Error seeking to position " << _ppos << " in " << _filename << "\n";
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
while (length > 0) {
|
||||
ssize_t result = ::write(_fd, start, length);
|
||||
|
||||
size_t remaining = length;
|
||||
while (remaining > 0) {
|
||||
ssize_t result = ::write(_fd, start, remaining);
|
||||
if (result < 0) {
|
||||
if (errno == EAGAIN) {
|
||||
thread_yield();
|
||||
} else {
|
||||
cerr
|
||||
<< "Error writing " << length << " bytes to " << _filename << "\n";
|
||||
return;
|
||||
<< "Error writing " << remaining << " bytes to " << _filename << "\n";
|
||||
return length - remaining;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
start += result;
|
||||
length -= result;
|
||||
remaining -= result;
|
||||
_ppos += result;
|
||||
}
|
||||
#endif // _WIN32
|
||||
|
||||
return length;
|
||||
}
|
||||
|
@ -46,7 +46,7 @@ protected:
|
||||
|
||||
private:
|
||||
size_t read_chars(char *start, size_t length);
|
||||
void write_chars(const char *start, size_t length);
|
||||
size_t write_chars(const char *start, size_t length);
|
||||
|
||||
private:
|
||||
string _filename;
|
||||
|
Loading…
x
Reference in New Issue
Block a user