예제 #1
0
void Hq32x2AddInt32( Hq32x2 * p32x2Result, Hq32x2 * p32x2A, int32 i32 )
{
  Hq32x2        tmp;

  Hq32x2FromInt32( &tmp, i32 );
  Hq32x2Add( p32x2Result, p32x2A, &tmp );
}
예제 #2
0
/*
 * Binary functions on a 64 bit value and a uint32
 */
void Hq32x2AddUint32( Hq32x2 * p32x2Result, Hq32x2 * p32x2A, uint32 ui32 )
{
  Hq32x2        tmp;

  Hq32x2FromUint32( &tmp, ui32 );
  Hq32x2Add( p32x2Result, p32x2A, &tmp );
}
예제 #3
0
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 ;
}