// Open a stream, possibly with initial data array of certain size bool FXMemoryStream::open(FXStreamDirection save_or_load,FXuval size,FXuchar* data){ if(save_or_load!=FXStreamSave && save_or_load!=FXStreamLoad){fxerror("FXMemoryStream::open: illegal stream direction.\n");} if(FXStream::open(save_or_load,size,data)){ if(save_or_load==FXStreamSave){ wrptr=begptr; rdptr=begptr; } else{ wrptr=endptr; rdptr=begptr; } return true; } return false; }
// Give buffer to stream void FXMemoryStream::giveBuffer(FXuchar *data,FXuval size){ if(data==NULL){ fxerror("FXMemoryStream::giveBuffer: NULL buffer argument.\n"); } if(owns){FXFREE(&begptr);} begptr=data; endptr=data+size; if(dir==FXStreamSave){ wrptr=begptr; rdptr=begptr; } else{ wrptr=endptr; rdptr=begptr; } owns=true; }
// Read at least count bytes into the buffer FXuval FXFileStream::readBuffer(FXuval){ register FXival m,n; if(dir!=FXStreamLoad){fxerror("FXFileStream::readBuffer: wrong stream direction.\n");} FXASSERT(begptr<=rdptr); FXASSERT(rdptr<=wrptr); FXASSERT(wrptr<=endptr); m=wrptr-rdptr; if(m){memmove(begptr,rdptr,m);} rdptr=begptr; wrptr=begptr+m; n=file.readBlock(wrptr,endptr-wrptr); if(0<n){ wrptr+=n; } return wrptr-rdptr; }
// Write at least count bytes from the buffer FXuval FXFileStream::writeBuffer(FXuval){ register FXival m,n; if(dir!=FXStreamSave){fxerror("FXFileStream::writeBuffer: wrong stream direction.\n");} FXASSERT(begptr<=rdptr); FXASSERT(rdptr<=wrptr); FXASSERT(wrptr<=endptr); m=wrptr-rdptr; n=file.writeBlock(rdptr,m); if(0<n){ m-=n; if(m){memmove(begptr,rdptr+n,m);} rdptr=begptr; wrptr=begptr+m; } return endptr-wrptr; }
// Move to position bool FXFileStream::position(FXlong offset,FXWhence whence){ register FXlong p; if(dir==FXStreamDead){ fxerror("FXMemoryStream::position: stream is not open.\n"); } if(code==FXStreamOK){ FXASSERT(FXFromStart==SEEK_SET); FXASSERT(FXFromCurrent==SEEK_CUR); FXASSERT(FXFromEnd==SEEK_END); if(dir==FXStreamSave){ // Flush unwritten data writeBuffer(0); // System's view of file pointer lags behind ours if(whence==FXFromCurrent) offset+=wrptr-rdptr; // Position file if((p=file.position(offset,whence))<0){ code=FXStreamFull; return FALSE; } // Update pointers wrptr=begptr; rdptr=begptr; } else{ // System's view of file pointer ahead of ours if(whence==FXFromCurrent) offset-=wrptr-rdptr; // Position file if((p=file.position(offset,whence))<0){ code=FXStreamEnd; return false; } // Update pointers wrptr=begptr; rdptr=begptr; } pos=p; return true; } return false; }
// Open file stream bool FXFileStream::open(const FXString& filename,FXStreamDirection save_or_load,FXuval size){ if(save_or_load!=FXStreamSave && save_or_load!=FXStreamLoad){fxerror("FXFileStream::open: illegal stream direction.\n");} if(!dir){ if(save_or_load==FXStreamLoad){ if(!file.open(filename,FXIO::Reading)){ code=FXStreamNoRead; return false; } } else if(save_or_load==FXStreamSave){ if(!file.open(filename,FXIO::Writing)){ code=FXStreamNoWrite; return false; } } return FXStream::open(save_or_load,size); } return false; }
// Move to position; if saving and we own the buffer, try to resize // and 0-fill the space; if loading and not out of range, move the pointer; // otherwise, return error code. bool FXMemoryStream::position(FXlong offset,FXWhence whence){ if(dir==FXStreamDead){ fxerror("FXMemoryStream::position: stream is not open.\n"); } if(code==FXStreamOK){ if(whence==FXFromCurrent) offset=offset+pos; else if(whence==FXFromEnd) offset=offset+endptr-begptr; if(dir==FXStreamSave){ if(begptr+offset>=endptr){ if(!owns){ setError(FXStreamFull); return false; } setSpace(offset); if(begptr+offset>=endptr) return false; } wrptr=begptr+offset; } else{ if(begptr+offset>=endptr){ setError(FXStreamEnd); return false; } rdptr=begptr+offset; } pos=offset; return true; } return false; }
// Start the whole thing int main(int argc,char *argv[]){ // Make sure we're linked against the right library version if(fxversion[0]!=FOX_MAJOR || fxversion[1]!=FOX_MINOR || fxversion[2]!=FOX_LEVEL){ fxerror("FOX Library mismatch; expected version: %d.%d.%d, but found version: %d.%d.%d.\n",FOX_MAJOR,FOX_MINOR,FOX_LEVEL,fxversion[0],fxversion[1],fxversion[2]); } // Make application FXApp application("ShutterBug"); // Open display application.init(argc,argv); // Main window new ShutterBug(&application); // Create app application.create(); // Run return application.run(); }