% July 1999 %
% %
% %
-% Copyright 1999-2010 ImageMagick Studio LLC, a non-profit organization %
+% Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization %
% dedicated to making software imaging solutions freely available. %
% %
% You may not use this file except in compliance with the License. You may %
#include "magick/exception-private.h"
#include "magick/image-private.h"
#include "magick/list.h"
+#include "magick/locale_.h"
#include "magick/log.h"
#include "magick/magick.h"
#include "magick/memory_.h"
Define declarations.
*/
#define MagickMaxBlobExtent 65541
-#if defined(MAGICKCORE_HAVE_FSEEKO)
-# define fseek fseeko
-# define ftell ftello
-#endif
#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
# define MAP_ANONYMOUS MAP_ANON
#endif
%
*/
-static inline size_t MagickMin(const size_t x,const size_t y)
+static inline MagickSizeType MagickMin(const MagickSizeType x,
+ const MagickSizeType y)
{
if (x < y)
return(x);
}
for (i=0; i < length; i+=count)
{
- count=(ssize_t) write(file,(const char *) blob+i,MagickMin(length-i,(size_t)
- SSIZE_MAX));
+ count=(ssize_t) write(file,(const char *) blob+i,(size_t) MagickMin(length-
+ i,(MagickSizeType) SSIZE_MAX));
if (count <= 0)
{
count=0;
return((Image *) NULL);
}
clone_info=CloneImageInfo(blob_info);
- (void) FormatMagickString(clone_info->filename,MaxTextExtent,"%s:%s",
+ (void) FormatLocaleString(clone_info->filename,MaxTextExtent,"%s:%s",
blob_info->magick,blob_info->filename);
image=ReadImage(clone_info,exception);
clone_info=DestroyImageInfo(clone_info);
case StandardStream:
{
if (image->blob->synchronize != MagickFalse)
- status=fsync(fileno(image->blob->file));
+ {
+ status=fflush(image->blob->file);
+ status=fsync(fileno(image->blob->file));
+ }
status=fclose(image->blob->file);
break;
}
break;
}
case FifoStream:
+ break;
case BlobStream:
+ {
+ if (image->blob->file != (FILE *) NULL)
+ {
+ if (image->blob->synchronize != MagickFalse)
+ (void) fsync(fileno(image->blob->file));
+ status=fclose(image->blob->file);
+ }
break;
+ }
}
(void) DetachBlob(image->blob);
image->blob->status=status < 0 ? MagickTrue : MagickFalse;
return(data);
}
data=image->blob->data+image->blob->offset;
- *count=(ssize_t) MagickMin(length,(size_t) (image->blob->length-
+ *count=(ssize_t) MagickMin(length,(MagickSizeType) (image->blob->length-
image->blob->offset));
image->blob->offset+=(*count);
if (*count != (ssize_t) length)
}
MagickExport MagickBooleanType DiscardBlobBytes(Image *image,
- const size_t length)
+ const MagickSizeType length)
{
- register ssize_t
+ register MagickOffsetType
i;
size_t
assert(image != (Image *) NULL);
assert(image->signature == MagickSignature);
count=0;
- for (i=0; i < (ssize_t) length; i+=count)
+ for (i=0; i < (MagickOffsetType) length; i+=count)
{
- quantum=MagickMin(length-i,sizeof(buffer));
+ quantum=(size_t) MagickMin(length-i,sizeof(buffer));
(void) ReadBlobStream(image,quantum,buffer,&count);
if (count <= 0)
{
break;
}
}
- return(i < (ssize_t) length ? MagickFalse : MagickTrue);
+ return(i < (MagickOffsetType) length ? MagickFalse : MagickTrue);
}
\f
/*
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% FileToBlob() returns the contents of a file as a blob. It returns the
-% file as a blob and its length. If an error occurs, NULL is returned.
+% FileToBlob() returns the contents of a file as a buffer terminated with
+% the '\0' character. The length of the buffer (not including the extra
+% terminating '\0' character) is returned via the 'length' parameter. Free
+% the buffer with RelinquishMagickMemory().
%
% The format of the FileToBlob method is:
%
ThrowFileException(exception,BlobError,"UnableToOpenFile",filename);
return((unsigned char *) NULL);
}
- offset=(MagickOffsetType) MagickSeek(file,0,SEEK_END);
+ offset=(MagickOffsetType) lseek(file,0,SEEK_END);
count=0;
if ((offset < 0) || (offset != (MagickOffsetType) ((ssize_t) offset)))
{
*/
quantum=(size_t) MagickMaxBufferExtent;
if ((fstat(file,&file_info) == 0) && (file_info.st_size != 0))
- quantum=MagickMin((size_t) file_info.st_size,MagickMaxBufferExtent);
+ quantum=(size_t) MagickMin((MagickSizeType) file_info.st_size,
+ MagickMaxBufferExtent);
blob=(unsigned char *) AcquireQuantumMemory(quantum,sizeof(*blob));
for (i=0; blob != (unsigned char *) NULL; i+=count)
{
ThrowFileException(exception,BlobError,"UnableToReadBlob",filename);
return((unsigned char *) NULL);
}
- *length=MagickMin(i+count,extent);
+ *length=(size_t) MagickMin(i+count,extent);
blob[*length]='\0';
return(blob);
}
- *length=MagickMin((size_t) offset,extent);
+ *length=(size_t) MagickMin((MagickSizeType) offset,extent);
blob=(unsigned char *) NULL;
- if (~(*length) >= MaxTextExtent)
+ if (~(*length) >= (MaxTextExtent-1))
blob=(unsigned char *) AcquireQuantumMemory(*length+MaxTextExtent,
sizeof(*blob));
if (blob == (unsigned char *) NULL)
}
else
{
- (void) MagickSeek(file,0,SEEK_SET);
+ (void) lseek(file,0,SEEK_SET);
for (i=0; i < *length; i+=count)
{
- count=(ssize_t) read(file,blob+i,MagickMin(*length-i,(size_t)
- SSIZE_MAX));
+ count=(ssize_t) read(file,blob+i,(size_t) MagickMin(*length-i,
+ (MagickSizeType) SSIZE_MAX));
if (count <= 0)
{
count=0;
}
quantum=(size_t) MagickMaxBufferExtent;
if ((fstat(file,&file_info) == 0) && (file_info.st_size != 0))
- quantum=MagickMin((size_t) file_info.st_size,MagickMaxBufferExtent);
+ quantum=(size_t) MagickMin(file_info.st_size,MagickMaxBufferExtent);
blob=(unsigned char *) AcquireQuantumMemory(quantum,sizeof(*blob));
if (blob == (unsigned char *) NULL)
{
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% ImageToBlob() implements direct to memory image formats. It returns the
-% image as a blob and its length. The magick member of the ImageInfo structure
-% determines the format of the returned blob (GIF, JPEG, PNG, etc.)
+% image as a formatted blob and its length. The magick member of the Image
+% structure determines the format of the returned blob (GIF, JPEG, PNG,
+% etc.). This method is the equivalent of WriteImage(), but writes the
+% formatted "file" to a memory buffer rather than to an actual file.
%
% The format of the ImageToBlob method is:
%
blob_info->file=fdopen(file,"wb");
if (blob_info->file != (FILE *) NULL)
{
- (void) FormatMagickString(image->filename,MaxTextExtent,"%s:%s",
+ (void) FormatLocaleString(image->filename,MaxTextExtent,"%s:%s",
image->magick,unique);
status=WriteImage(blob_info,image);
(void) fclose(blob_info->file);
}
quantum=(size_t) MagickMaxBufferExtent;
if ((fstat(file,&file_info) == 0) && (file_info.st_size != 0))
- quantum=MagickMin((size_t) file_info.st_size,MagickMaxBufferExtent);
+ quantum=(size_t) MagickMin((MagickSizeType) file_info.st_size,
+ MagickMaxBufferExtent);
buffer=(unsigned char *) AcquireQuantumMemory(quantum,sizeof(*buffer));
if (buffer == (unsigned char *) NULL)
{
blob_info->file=fdopen(file,"wb");
if (blob_info->file != (FILE *) NULL)
{
- (void) FormatMagickString(filename,MaxTextExtent,"%s:%s",
+ (void) FormatLocaleString(filename,MaxTextExtent,"%s:%s",
images->magick,unique);
status=WriteImages(blob_info,images,filename,exception);
(void) fclose(blob_info->file);
(void) RelinquishUniqueFileResource(filename);
return(MagickFalse);
}
- (void) FormatMagickString(byte_image->filename,MaxTextExtent,"%s:%s",format,
+ (void) FormatLocaleString(byte_image->filename,MaxTextExtent,"%s:%s",format,
filename);
DestroyBlob(byte_image);
byte_image->blob=CloneBlobInfo((BlobInfo *) NULL);
}
quantum=(size_t) MagickMaxBufferExtent;
if ((fstat(file,&file_info) == 0) && (file_info.st_size != 0))
- quantum=MagickMin((size_t) file_info.st_size,MagickMaxBufferExtent);
+ quantum=(size_t) MagickMin(file_info.st_size,MagickMaxBufferExtent);
buffer=(unsigned char *) AcquireQuantumMemory(quantum,sizeof(*buffer));
if (buffer == (unsigned char *) NULL)
{
{
(void) CopyMagickString(filename,image->filename,MaxTextExtent);
if ((image_info->adjoin == MagickFalse) ||
- (IsGlob(filename) != MagickFalse))
+ (strchr(filename,'%') != (char *) NULL))
{
/*
Form filename for multi-part images.
GetPathComponent(image->filename,RootPath,path);
if (*extension == '\0')
- (void) FormatMagickString(filename,MaxTextExtent,"%s-%.20g",
+ (void) FormatLocaleString(filename,MaxTextExtent,"%s-%.20g",
path,(double) image->scene);
else
- (void) FormatMagickString(filename,MaxTextExtent,
- "%s-%.20g.%s",path,(double) image->scene,extension);
+ (void) FormatLocaleString(filename,MaxTextExtent,"%s-%.20g.%s",
+ path,(double) image->scene,extension);
}
(void) CopyMagickString(image->filename,filename,MaxTextExtent);
#if defined(macintosh)
break;
}
p=image->blob->data+image->blob->offset;
- count=(ssize_t) MagickMin(length,(size_t) (image->blob->length-
- image->blob->offset));
+ count=(ssize_t) MagickMin(length,image->blob->length-image->blob->offset);
image->blob->offset+=count;
if (count != (ssize_t) length)
image->blob->eof=MagickTrue;
break;
case FileStream:
{
- if (fseek(image->blob->file,(long) offset,whence) < 0)
+ if (fseek(image->blob->file,offset,whence) < 0)
return(-1);
image->blob->offset=TellBlob(image);
break;