#include "magick/semaphore.h"
#include "magick/string_.h"
#include "magick/string-private.h"
+#include "magick/token.h"
#include "magick/utility.h"
-#if defined(MAGICKCORE_HAVE_MMAP_FILEIO) && !defined(__WINDOWS__)
+#if defined(MAGICKCORE_HAVE_MMAP_FILEIO) && !defined(MAGICKCORE_WINDOWS_SUPPORT)
# include <sys/mman.h>
#endif
#if defined(MAGICKCORE_ZLIB_DELEGATE)
blob_info->blob=(void *) blob;
blob_info->length=length;
if (*blob_info->magick == '\0')
- (void) SetImageInfo(blob_info,MagickFalse,exception);
+ (void) SetImageInfo(blob_info,0,exception);
magick_info=GetMagickInfo(blob_info->magick,exception);
if (magick_info == (const MagickInfo *) NULL)
{
if (image->blob->synchronize != MagickFalse)
SyncBlob(image);
image->blob->size=GetBlobSize(image);
+ image->extent=image->blob->size;
image->blob->eof=MagickFalse;
if (image->blob->exempt != MagickFalse)
{
MagickExport MagickSizeType GetBlobSize(const Image *image)
{
MagickSizeType
- length;
+ extent;
assert(image != (Image *) NULL);
assert(image->signature == MagickSignature);
if (image->debug != MagickFalse)
(void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
assert(image->blob != (BlobInfo *) NULL);
- length=0;
+ extent=0;
switch (image->blob->type)
{
case UndefinedStream:
{
- length=image->blob->size;
+ extent=image->blob->size;
break;
}
case FileStream:
{
if (fstat(fileno(image->blob->file),&image->blob->properties) == 0)
- length=(MagickSizeType) image->blob->properties.st_size;
+ extent=(MagickSizeType) image->blob->properties.st_size;
break;
}
case StandardStream:
case PipeStream:
{
- length=image->blob->size;
+ extent=image->blob->size;
break;
}
case ZipStream:
status=GetPathAttributes(image->filename,&image->blob->properties);
if (status != MagickFalse)
- length=(MagickSizeType) image->blob->properties.st_size;
+ extent=(MagickSizeType) image->blob->properties.st_size;
break;
}
case FifoStream:
break;
case BlobStream:
{
- length=(MagickSizeType) image->blob->length;
+ extent=(MagickSizeType) image->blob->length;
break;
}
}
- return(length);
+ return(extent);
}
\f
/*
blob=(unsigned char *) NULL;
blob_info=CloneImageInfo(image_info);
blob_info->adjoin=MagickFalse;
- (void) SetImageInfo(blob_info,MagickTrue,exception);
+ (void) SetImageInfo(blob_info,1,exception);
if (*blob_info->magick != '\0')
(void) CopyMagickString(image->magick,blob_info->magick,MaxTextExtent);
magick_info=GetMagickInfo(image->magick,exception);
*length=0;
blob=(unsigned char *) NULL;
blob_info=CloneImageInfo(image_info);
- (void) SetImageInfo(blob_info,MagickTrue,exception);
+ (void) SetImageInfo(blob_info,(unsigned int) GetImageListLength(images),
+ exception);
if (*blob_info->magick != '\0')
(void) CopyMagickString(images->magick,blob_info->magick,MaxTextExtent);
if (blob_info->adjoin == MagickFalse)
flags|=MAP_SHARED;
map=(unsigned char *) mmap((char *) NULL,length,protection,flags,file,
(off_t) offset);
+#if defined(MAGICKCORE_HAVE_POSIX_MADVISE)
+ (void) posix_madvise(map,length,POSIX_MADV_SEQUENTIAL |
+ POSIX_MADV_WILLNEED);
+#endif
break;
}
case IOMode:
rights=WritePolicyRights;
if (IsRightsAuthorized(PathPolicyDomain,rights,filename) == MagickFalse)
{
+ errno=EPERM;
(void) ThrowMagickException(exception,GetMagickModule(),PolicyError,
"NotAuthorized","`%s'",filename);
return(MagickFalse);
((*filename == '\0') && (image_info->file == (FILE *) NULL)))
{
image->blob->file=(*type == 'r') ? stdin : stdout;
-#if defined(__WINDOWS__) || defined(__OS2__)
+#if defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__OS2__)
if (strchr(type,'b') != (char *) NULL)
setmode(_fileno(image->blob->file),_O_BINARY);
#endif
*mode=(*type);
mode[1]='\0';
image->blob->file=fdopen(StringToLong(filename+3),mode);
-#if defined(__WINDOWS__) || defined(__OS2__)
+#if defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__OS2__)
if (strchr(type,'b') != (char *) NULL)
setmode(_fileno(image->blob->file),_O_BINARY);
#endif
#endif
if (*type == 'w')
{
- /*
- Form filename for multi-part images.
- */
- (void) InterpretImageFilename(image_info,image,image->filename,(int)
- image->scene,filename);
- if (image_info->adjoin == MagickFalse)
- if ((image->previous != (Image *) NULL) ||
- (GetNextImageInList(image) != (Image *) NULL))
- {
- if (LocaleCompare(filename,image->filename) == 0)
- {
- char
- extension[MaxTextExtent],
- path[MaxTextExtent];
-
- GetPathComponent(image->filename,RootPath,path);
- GetPathComponent(image->filename,ExtensionPath,extension);
- if (*extension == '\0')
- (void) FormatMagickString(filename,MaxTextExtent,"%s-%lu",
- path,image->scene);
- else
- (void) FormatMagickString(filename,MaxTextExtent,"%s-%lu.%s",
- path,image->scene,extension);
- }
- }
- (void) CopyMagickString(image->filename,filename,MaxTextExtent);
+ (void) CopyMagickString(filename,image->filename,MaxTextExtent);
+ if ((image_info->adjoin == MagickFalse) ||
+ (IsGlob(filename) != MagickFalse))
+ {
+ /*
+ Form filename for multi-part images.
+ */
+ (void) InterpretImageFilename(image_info,image,image->filename,(int)
+ image->scene,filename);
+ if ((LocaleCompare(filename,image->filename) == 0) &&
+ ((GetPreviousImageInList(image) != (Image *) NULL) ||
+ (GetNextImageInList(image) != (Image *) NULL)))
+ {
+ char
+ extension[MaxTextExtent],
+ path[MaxTextExtent];
+
+ GetPathComponent(image->filename,RootPath,path);
+ GetPathComponent(image->filename,ExtensionPath,extension);
+ if (*extension == '\0')
+ (void) FormatMagickString(filename,MaxTextExtent,"%s-%lu",
+ path,image->scene);
+ else
+ (void) FormatMagickString(filename,MaxTextExtent,
+ "%s-%lu.%s",path,image->scene,extension);
+ }
+ (void) CopyMagickString(image->filename,filename,MaxTextExtent);
#if defined(macintosh)
- SetApplicationType(filename,image_info->magick,'8BIM');
+ SetApplicationType(filename,image_info->magick,'8BIM');
#endif
+ }
}
#if defined(MAGICKCORE_ZLIB_DELEGATE)
if (((strlen(filename) > 2) &&
ExceptionInfo
*sans_exception;
- struct stat
- *properties;
+ struct stat
+ *properties;
sans_exception=AcquireExceptionInfo();
magick_info=GetMagickInfo(image_info->magick,sans_exception);
% %
% %
% %
++ R e a d B l o b M S B L o n g L o n g %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% ReadBlobMSBLongLong() reads a long value as a 64-bit quantity in
+% most-significant byte first order.
+%
+% The format of the ReadBlobMSBLongLong method is:
+%
+% unsigned int ReadBlobMSBLongLong(Image *image)
+%
+% A description of each parameter follows.
+%
+% o image: the image.
+%
+*/
+MagickExport MagickSizeType ReadBlobMSBLongLong(Image *image)
+{
+ register const unsigned char
+ *p;
+
+ register MagickSizeType
+ value;
+
+ ssize_t
+ count;
+
+ unsigned char
+ buffer[4];
+
+ assert(image != (Image *) NULL);
+ assert(image->signature == MagickSignature);
+ *buffer='\0';
+ p=ReadBlobStream(image,8,buffer,&count);
+ if (count != 8)
+ return(MagickULLConstant(0));
+ value=((MagickSizeType) (*p++)) << 56;
+ value|=((MagickSizeType) (*p++)) << 48;
+ value|=((MagickSizeType) (*p++)) << 40;
+ value|=((MagickSizeType) (*p++)) << 32;
+ value|=((MagickSizeType) (*p++)) << 24;
+ value|=((MagickSizeType) (*p++)) << 16;
+ value|=((MagickSizeType) (*p++)) << 8;
+ value|=((MagickSizeType) (*p++));
+ return(value & MagickULLConstant(0xffffffffffffffff));
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+ R e a d B l o b M S B S h o r t %
% %
% %
% %
% %
% %
++ W r i t e B l o b M S B L o n g L o n g %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% WriteBlobMSBLongLong() writes a long long value as a 64-bit quantity in
+% most-significant byte first order.
+%
+% The format of the WriteBlobMSBLongLong method is:
+%
+% ssize_t WriteBlobMSBLongLong(Image *image,const MagickSizeType value)
+%
+% A description of each parameter follows.
+%
+% o value: Specifies the value to write.
+%
+% o image: the image.
+%
+*/
+MagickExport ssize_t WriteBlobMSBLongLong(Image *image,
+ const MagickSizeType value)
+{
+ unsigned char
+ buffer[8];
+
+ assert(image != (Image *) NULL);
+ assert(image->signature == MagickSignature);
+ buffer[0]=(unsigned char) (value >> 56);
+ buffer[1]=(unsigned char) (value >> 48);
+ buffer[2]=(unsigned char) (value >> 40);
+ buffer[3]=(unsigned char) (value >> 32);
+ buffer[4]=(unsigned char) (value >> 24);
+ buffer[5]=(unsigned char) (value >> 16);
+ buffer[6]=(unsigned char) (value >> 8);
+ buffer[7]=(unsigned char) value;
+ return(WriteBlobStream(image,8,buffer));
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+ W r i t e B l o b M S B S h o r t %
% %
% %