int32 Hq32x2CompareInt32( Hq32x2 * p32x2A, int32 i32 ) { Hq32x2 tmp; Hq32x2FromInt32( &tmp, i32 ); return Hq32x2Compare( p32x2A, &tmp ); }
int32 Hq32x2CompareUint32( Hq32x2 * p32x2A, uint32 ui32 ) { Hq32x2 tmp; Hq32x2FromUint32( &tmp, ui32 ); return Hq32x2Compare( p32x2A, &tmp ); }
static sw_blob_result blobdata_file_write(OBJECT *file, blobdata_private_t *data, const uint8 *buffer, Hq32x2 start, size_t slength) { HQASSERT(file, "No file object") ; HQASSERT(oType(*file) == OFILE || oType(*file) == OSTRING, "Blob data source is not a file or a filename") ; HQASSERT(buffer, "Nowhere to put data") ; HQASSERT(slength > 0, "No data to be written") ; VERIFY_OBJECT(data, BLOBDATA_PRIVATE_NAME) ; /* If we marked the file for lazy opening, then open it now. */ if ( !data->isopen && !blobdata_file_lazy(file, data) ) return FAILURE(SW_BLOB_ERROR_EXPIRED) ; if ( (data->mode & (SW_WRONLY|SW_RDWR)) == 0 ) return FAILURE(0) ; /* Either both or neither of the file handle and device should be set */ HQASSERT((data->fhandle < 0) == (data->dev == NULL), "Blob file handle and device inconsistent") ; if ( data->length_ok ) { /* Update length if it will be invalidated by this write. */ Hq32x2 end ; Hq32x2FromSize_t(&end, slength) ; Hq32x2Add(&end, &start, &end) ; if ( Hq32x2Compare(&end, &data->length) > 0 ) data->length = end ; /* Now if the write fails, we have to invalidate the length_ok marker. */ } if ( data->fhandle >= 0 ) { int32 length = CAST_SIZET_TO_INT32(slength) ; /* Can't re-write HQX encrypted files. */ if ( data->encrypted ) { data->length_ok = FALSE ; return FAILURE(SW_BLOB_ERROR_ACCESS) ; } if ( !(*theISeekFile(data->dev))(data->dev, data->fhandle, &start, SW_SET) || (*theIWriteFile(data->dev))(data->dev, data->fhandle, /*deconstify*/(uint8 *)buffer, length) != length ) { data->length_ok = FALSE ; return FAILURE(SW_BLOB_ERROR_WRITE) ; } } else { FILELIST *flptr ; HQASSERT(oType(*file) == OFILE, "Blob data source is not a file") ; flptr = oFile(*file) ; HQASSERT(isIOpenFile(flptr), "Blob data file is not open") ; /* Set the file position to the requested offset */ if ( (*theIMySetFilePos(flptr))(flptr, &start) == EOF ) { (void)(*theIFileLastError(flptr))(flptr) ; data->length_ok = FALSE ; return FAILURE(SW_BLOB_ERROR_WRITE) ; } /* Writing to blobs is less frequent than reading, do it the slow way for now. */ while ( slength > 0 ) { /* Get a character to prime the file buffer. EOF is not an error, it will break out and return the number of bytes already read. */ if ( Putc(*buffer, flptr) == EOF ) { data->length_ok = FALSE ; return FAILURE(SW_BLOB_ERROR_WRITE) ; } ++buffer ; --slength ; } } return SW_BLOB_OK ; }