]> granicus.if.org Git - imagemagick/blobdiff - magick/mime.c
(no commit message)
[imagemagick] / magick / mime.c
index c00be351569ec15b940052bb798825894f98db9a..84963614e41f141be181306133072bf7c2f818ef 100644 (file)
@@ -15,7 +15,7 @@
 %                                 July 2000                                   %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2009 ImageMagick Studio LLC, a non-profit organization      %
+%  Copyright 1999-2010 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  %
@@ -70,7 +70,7 @@ struct _MimeInfo
     *description,
     *pattern;
 
-  long
+  ssize_t
     priority;
 
   MagickOffsetType
@@ -82,7 +82,7 @@ struct _MimeInfo
   DataType
     data_type;
 
-  long
+  ssize_t
     mask,
     value;
 
@@ -98,7 +98,7 @@ struct _MimeInfo
   MagickBooleanType
     stealth;
 
-  unsigned long
+  size_t
     signature;
 };
 \f
@@ -131,55 +131,6 @@ static MagickBooleanType
 %                                                                             %
 %                                                                             %
 %                                                                             %
-+   D e s t r o y M i m e L i s t                                             %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  DestroyMimeList() deallocates memory associated with the mime list.
-%
-%  The format of the DestroyMimeList method is:
-%
-%      DestroyMimeList(void)
-%
-*/
-
-static void *DestroyMimeElement(void *mime_info)
-{
-  register MimeInfo
-    *p;
-
-  p=(MimeInfo *) mime_info;
-  if (p->magic != (unsigned char *) NULL)
-    p->magic=(unsigned char *) RelinquishMagickMemory(p->magic);
-  if (p->pattern != (char *) NULL)
-    p->pattern=DestroyString(p->pattern);
-  if (p->description != (char *) NULL)
-    p->description=DestroyString(p->description);
-  if (p->type != (char *) NULL)
-    p->type=DestroyString(p->type);
-  if (p->path != (char *) NULL)
-    p->path=DestroyString(p->path);
-  p=(MimeInfo *) RelinquishMagickMemory(p);
-  return((void *) NULL);
-}
-
-MagickExport void DestroyMimeList(void)
-{
-  AcquireSemaphoreInfo(&mime_semaphore);
-  if (mime_list != (LinkedListInfo *) NULL)
-    mime_list=DestroyLinkedList(mime_list,DestroyMimeElement);
-  instantiate_mime=MagickFalse;
-  RelinquishSemaphoreInfo(mime_semaphore);
-  DestroySemaphoreInfo(&mime_semaphore);
-}
-\f
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
 +   G e t M i m e I n f o                                                     %
 %                                                                             %
 %                                                                             %
@@ -217,21 +168,21 @@ MagickExport const MimeInfo *GetMimeInfo(const char *filename,
   EndianType
     endian;
 
-  long
-    value;
-
   register const MimeInfo
     *p;
 
   register const unsigned char
     *q;
 
-  register long
+  register ssize_t
     i;
 
-  unsigned long
+  size_t
     lsb_first;
 
+  ssize_t
+    value;
+
   assert(exception != (ExceptionInfo *) NULL);
   if ((mime_list == (LinkedListInfo *) NULL) ||
       (instantiate_mime == MagickFalse))
@@ -249,7 +200,7 @@ MagickExport const MimeInfo *GetMimeInfo(const char *filename,
   */
   mime_info=(const MimeInfo *) NULL;
   lsb_first=1;
-  AcquireSemaphoreInfo(&mime_semaphore);
+  LockSemaphoreInfo(mime_semaphore);
   ResetLinkedListIterator(mime_list);
   p=(const MimeInfo *) GetNextValueInLinkedList(mime_list);
   while (p != (const MimeInfo *) NULL)
@@ -355,7 +306,7 @@ MagickExport const MimeInfo *GetMimeInfo(const char *filename,
       case StringData:
       default:
       {
-        for (i=0; i <= (long) p->extent; i++)
+        for (i=0; i <= (ssize_t) p->extent; i++)
         {
           if ((size_t) (p->offset+i+p->length) > length)
             break;
@@ -373,7 +324,7 @@ MagickExport const MimeInfo *GetMimeInfo(const char *filename,
   if (p != (const MimeInfo *) NULL)
     (void) InsertValueInLinkedList(mime_list,0,
       RemoveElementByValueFromLinkedList(mime_list,p));
-  RelinquishSemaphoreInfo(mime_semaphore);
+  UnlockSemaphoreInfo(mime_semaphore);
   return(mime_info);
 }
 \f
@@ -394,7 +345,7 @@ MagickExport const MimeInfo *GetMimeInfo(const char *filename,
 %  The magic of the GetMimeInfoList function is:
 %
 %      const MimeInfo **GetMimeInfoList(const char *pattern,
-%        unsigned long *number_aliases,ExceptionInfo *exception)
+%        size_t *number_aliases,ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
@@ -429,7 +380,7 @@ static int MimeInfoCompare(const void *x,const void *y)
 #endif
 
 MagickExport const MimeInfo **GetMimeInfoList(const char *pattern,
-  unsigned long *number_aliases,ExceptionInfo *exception)
+  size_t *number_aliases,ExceptionInfo *exception)
 {
   const MimeInfo
     **aliases;
@@ -437,7 +388,7 @@ MagickExport const MimeInfo **GetMimeInfoList(const char *pattern,
   register const MimeInfo
     *p;
 
-  register long
+  register ssize_t
     i;
 
   /*
@@ -445,7 +396,7 @@ MagickExport const MimeInfo **GetMimeInfoList(const char *pattern,
   */
   assert(pattern != (char *) NULL);
   (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",pattern);
-  assert(number_aliases != (unsigned long *) NULL);
+  assert(number_aliases != (size_t *) NULL);
   *number_aliases=0;
   p=GetMimeInfo((char *) NULL,(unsigned char *) "*",0,exception);
   if (p == (const MimeInfo *) NULL)
@@ -457,7 +408,7 @@ MagickExport const MimeInfo **GetMimeInfoList(const char *pattern,
   /*
     Generate mime list.
   */
-  AcquireSemaphoreInfo(&mime_semaphore);
+  LockSemaphoreInfo(mime_semaphore);
   ResetLinkedListIterator(mime_list);
   p=(const MimeInfo *) GetNextValueInLinkedList(mime_list);
   for (i=0; p != (const MimeInfo *) NULL; )
@@ -467,10 +418,10 @@ MagickExport const MimeInfo **GetMimeInfoList(const char *pattern,
       aliases[i++]=p;
     p=(const MimeInfo *) GetNextValueInLinkedList(mime_list);
   }
-  RelinquishSemaphoreInfo(mime_semaphore);
+  UnlockSemaphoreInfo(mime_semaphore);
   qsort((void *) aliases,(size_t) i,sizeof(*aliases),MimeInfoCompare);
   aliases[i]=(MimeInfo *) NULL;
-  *number_aliases=(unsigned long) i;
+  *number_aliases=(size_t) i;
   return(aliases);
 }
 \f
@@ -490,7 +441,7 @@ MagickExport const MimeInfo **GetMimeInfoList(const char *pattern,
 %
 %  The format of the GetMimeList function is:
 %
-%      char **GetMimeList(const char *pattern,unsigned long *number_aliases,
+%      char **GetMimeList(const char *pattern,size_t *number_aliases,
 %        ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
@@ -524,7 +475,7 @@ static int MimeCompare(const void *x,const void *y)
 #endif
 
 MagickExport char **GetMimeList(const char *pattern,
-  unsigned long *number_aliases,ExceptionInfo *exception)
+  size_t *number_aliases,ExceptionInfo *exception)
 {
   char
     **aliases;
@@ -532,7 +483,7 @@ MagickExport char **GetMimeList(const char *pattern,
   register const MimeInfo
     *p;
 
-  register long
+  register ssize_t
     i;
 
   /*
@@ -540,7 +491,7 @@ MagickExport char **GetMimeList(const char *pattern,
   */
   assert(pattern != (char *) NULL);
   (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",pattern);
-  assert(number_aliases != (unsigned long *) NULL);
+  assert(number_aliases != (size_t *) NULL);
   *number_aliases=0;
   p=GetMimeInfo((char *) NULL,(unsigned char *) "*",0,exception);
   if (p == (const MimeInfo *) NULL)
@@ -549,7 +500,7 @@ MagickExport char **GetMimeList(const char *pattern,
     GetNumberOfElementsInLinkedList(mime_list)+1UL,sizeof(*aliases));
   if (aliases == (char **) NULL)
     return((char **) NULL);
-  AcquireSemaphoreInfo(&mime_semaphore);
+  LockSemaphoreInfo(mime_semaphore);
   ResetLinkedListIterator(mime_list);
   p=(const MimeInfo *) GetNextValueInLinkedList(mime_list);
   for (i=0; p != (const MimeInfo *) NULL; )
@@ -559,10 +510,10 @@ MagickExport char **GetMimeList(const char *pattern,
       aliases[i++]=ConstantString(p->type);
     p=(const MimeInfo *) GetNextValueInLinkedList(mime_list);
   }
-  RelinquishSemaphoreInfo(mime_semaphore);
+  UnlockSemaphoreInfo(mime_semaphore);
   qsort((void *) aliases,(size_t) i,sizeof(*aliases),MimeCompare);
   aliases[i]=(char *) NULL;
-  *number_aliases=(unsigned long) i;
+  *number_aliases=(size_t) i;
   return(aliases);
 }
 \f
@@ -653,14 +604,16 @@ static MagickBooleanType InitializeMimeList(ExceptionInfo *exception)
   if ((mime_list == (LinkedListInfo *) NULL) &&
       (instantiate_mime == MagickFalse))
     {
-      AcquireSemaphoreInfo(&mime_semaphore);
+      if (mime_semaphore == (SemaphoreInfo *) NULL)
+        AcquireSemaphoreInfo(&mime_semaphore);
+      LockSemaphoreInfo(mime_semaphore);
       if ((mime_list == (LinkedListInfo *) NULL) &&
           (instantiate_mime == MagickFalse))
         {
           (void) LoadMimeLists(MimeFilename,exception);
           instantiate_mime=MagickTrue;
         }
-      RelinquishSemaphoreInfo(mime_semaphore);
+      UnlockSemaphoreInfo(mime_semaphore);
     }
   return(mime_list != (LinkedListInfo *) NULL ? MagickTrue : MagickFalse);
 }
@@ -697,13 +650,13 @@ MagickExport MagickBooleanType ListMimeInfo(FILE *file,ExceptionInfo *exception)
   const MimeInfo
     **mime_info;
 
-  long
+  ssize_t
     j;
 
-  register long
+  register ssize_t
     i;
 
-  unsigned long
+  size_t
     number_aliases;
 
   if (file == (const FILE *) NULL)
@@ -713,7 +666,7 @@ MagickExport MagickBooleanType ListMimeInfo(FILE *file,ExceptionInfo *exception)
     return(MagickFalse);
   j=0;
   path=(const char *) NULL;
-  for (i=0; i < (long) number_aliases; i++)
+  for (i=0; i < (ssize_t) number_aliases; i++)
   {
     if (mime_info[i]->stealth != MagickFalse)
       continue;
@@ -730,7 +683,7 @@ MagickExport MagickBooleanType ListMimeInfo(FILE *file,ExceptionInfo *exception)
     (void) fprintf(file,"%s",mime_info[i]->type);
     if (strlen(mime_info[i]->type) <= 25)
       {
-        for (j=(long) strlen(mime_info[i]->type); j <= 27; j++)
+        for (j=(ssize_t) strlen(mime_info[i]->type); j <= 27; j++)
           (void) fprintf(file," ");
       }
     else
@@ -765,7 +718,7 @@ MagickExport MagickBooleanType ListMimeInfo(FILE *file,ExceptionInfo *exception)
 %  The format of the LoadMimeList method is:
 %
 %      MagickBooleanType LoadMimeList(const char *xml,const char *filename,
-%        const unsigned long depth,ExceptionInfo *exception)
+%        const size_t depth,ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
@@ -779,7 +732,7 @@ MagickExport MagickBooleanType ListMimeInfo(FILE *file,ExceptionInfo *exception)
 %
 */
 static MagickBooleanType LoadMimeList(const char *xml,const char *filename,
-  const unsigned long depth,ExceptionInfo *exception)
+  const size_t depth,ExceptionInfo *exception)
 {
   const char
     *attribute;
@@ -861,7 +814,7 @@ static MagickBooleanType LoadMimeList(const char *xml,const char *filename,
     /*
       Process mime element.
     */
-    mime_info=(MimeInfo *) AcquireMagickMemory(sizeof(*mime_info));
+    mime_info=(MimeInfo *) AcquireAlignedMemory(1,sizeof(*mime_info));
     if (mime_info == (MimeInfo *) NULL)
       ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
     (void) ResetMagickMemory(mime_info,0,sizeof(*mime_info));
@@ -933,11 +886,12 @@ static MagickBooleanType LoadMimeList(const char *xml,const char *filename,
         }
         token=DestroyString(token);
         if (mime_info->data_type != StringData)
-          mime_info->value=strtol((char *) mime_info->magic,(char **) NULL,0);
+          mime_info->value=(size_t) strtoul((char *) mime_info->magic,
+            (char **) NULL,0);
       }
     attribute=GetXMLTreeAttribute(mime,"mask");
     if (attribute != (const char *) NULL)
-      mime_info->mask=strtol(attribute,(char **) NULL,0);
+      mime_info->mask=(size_t) strtoul(attribute,(char **) NULL,0);
     attribute=GetXMLTreeAttribute(mime,"offset");
     if (attribute != (const char *) NULL)
       {
@@ -953,7 +907,7 @@ static MagickBooleanType LoadMimeList(const char *xml,const char *filename,
       mime_info->pattern=ConstantString(attribute);
     attribute=GetXMLTreeAttribute(mime,"priority");
     if (attribute != (const char *) NULL)
-      mime_info->priority=strtol(attribute,(char **) NULL,0);
+      mime_info->priority=(ssize_t) strtol(attribute,(char **) NULL,0);
     attribute=GetXMLTreeAttribute(mime,"stealth");
     if (attribute != (const char *) NULL)
       mime_info->stealth=IsMagickTrue(attribute);
@@ -1021,7 +975,7 @@ MagickExport MagickBooleanType LoadMimeLists(const char *filename,
     option=(const StringInfo *) GetNextValueInLinkedList(options);
   }
   options=DestroyConfigureOptions(options);
-  if ((mime_list == (LinkedListInfo *) NULL) || 
+  if ((mime_list == (LinkedListInfo *) NULL) ||
       (IsLinkedListEmpty(mime_list) != MagickFalse))
     status|=LoadMimeList(MimeMap,"built-in",0,exception);
   else
@@ -1078,3 +1032,78 @@ MagickExport char *MagickToMime(const char *magick)
   LocaleLower(media+8);
   return(ConstantString(media));
 }
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
++   M i m e C o m p o n e n t G e n e s i s                                   %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  MimeComponentGenesis() instantiates the mime component.
+%
+%  The format of the MimeComponentGenesis method is:
+%
+%      MagickBooleanType MimeComponentGenesis(void)
+%
+*/
+MagickExport MagickBooleanType MimeComponentGenesis(void)
+{
+  AcquireSemaphoreInfo(&mime_semaphore);
+  return(MagickTrue);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
++   M i m e C o m p o n e n t T e r m i n u s                                 %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  MimeComponentTerminus() destroys the mime component.
+%
+%  The format of the MimeComponentTerminus method is:
+%
+%      MimeComponentTerminus(void)
+%
+*/
+
+static void *DestroyMimeElement(void *mime_info)
+{
+  register MimeInfo
+    *p;
+
+  p=(MimeInfo *) mime_info;
+  if (p->magic != (unsigned char *) NULL)
+    p->magic=(unsigned char *) RelinquishMagickMemory(p->magic);
+  if (p->pattern != (char *) NULL)
+    p->pattern=DestroyString(p->pattern);
+  if (p->description != (char *) NULL)
+    p->description=DestroyString(p->description);
+  if (p->type != (char *) NULL)
+    p->type=DestroyString(p->type);
+  if (p->path != (char *) NULL)
+    p->path=DestroyString(p->path);
+  p=(MimeInfo *) RelinquishMagickMemory(p);
+  return((void *) NULL);
+}
+
+MagickExport void MimeComponentTerminus(void)
+{
+  if (mime_semaphore == (SemaphoreInfo *) NULL)
+    AcquireSemaphoreInfo(&mime_semaphore);
+  LockSemaphoreInfo(mime_semaphore);
+  if (mime_list != (LinkedListInfo *) NULL)
+    mime_list=DestroyLinkedList(mime_list,DestroyMimeElement);
+  instantiate_mime=MagickFalse;
+  UnlockSemaphoreInfo(mime_semaphore);
+  DestroySemaphoreInfo(&mime_semaphore);
+}