string.c

Go to the documentation of this file.
00001 /*
00002 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00003 %                                                                             %
00004 %                                                                             %
00005 %                                                                             %
00006 %                  SSSSS   TTTTT  RRRR   IIIII  N   N   GGGG                  %
00007 %                  SS        T    R   R    I    NN  N  G                      %
00008 %                   SSS      T    RRRR     I    N N N  G GGG                  %
00009 %                     SS     T    R R      I    N  NN  G   G                  %
00010 %                  SSSSS     T    R  R   IIIII  N   N   GGGG                  %
00011 %                                                                             %
00012 %                                                                             %
00013 %                        MagickCore String Methods                            %
00014 %                                                                             %
00015 %                             Software Design                                 %
00016 %                               John Cristy                                   %
00017 %                               August 2003                                   %
00018 %                                                                             %
00019 %                                                                             %
00020 %  Copyright 1999-2008 ImageMagick Studio LLC, a non-profit organization      %
00021 %  dedicated to making software imaging solutions freely available.           %
00022 %                                                                             %
00023 %  You may not use this file except in compliance with the License.  You may  %
00024 %  obtain a copy of the License at                                            %
00025 %                                                                             %
00026 %    http://www.imagemagick.org/script/license.php                            %
00027 %                                                                             %
00028 %  Unless required by applicable law or agreed to in writing, software        %
00029 %  distributed under the License is distributed on an "AS IS" BASIS,          %
00030 %  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
00031 %  See the License for the specific language governing permissions and        %
00032 %  limitations under the License.                                             %
00033 %                                                                             %
00034 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00035 %
00036 %
00037 */
00038 
00039 /*
00040   Include declarations.
00041 */
00042 #include "magick/studio.h"
00043 #include "magick/blob.h"
00044 #include "magick/blob-private.h"
00045 #include "magick/exception.h"
00046 #include "magick/exception-private.h"
00047 #include "magick/list.h"
00048 #include "magick/log.h"
00049 #include "magick/memory_.h"
00050 #include "magick/property.h"
00051 #include "magick/resource_.h"
00052 #include "magick/signature-private.h"
00053 #include "magick/string_.h"
00054 
00055 /*
00056   Static declarations.
00057 */
00058 #if !defined(MAGICKCORE_HAVE_STRCASECMP) || !defined(MAGICKCORE_HAVE_STRNCASECMP)
00059 static const unsigned char
00060   AsciiMap[] =
00061   {
00062     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
00063     0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
00064     0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
00065     0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
00066     0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
00067     0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
00068     0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73,
00069     0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
00070     0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
00071     0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
00072     0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83,
00073     0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
00074     0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
00075     0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
00076     0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3,
00077     0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
00078     0xc0, 0xe1, 0xe2, 0xe3, 0xe4, 0xc5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
00079     0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
00080     0xf8, 0xf9, 0xfa, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3,
00081     0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
00082     0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb,
00083     0xfc, 0xfd, 0xfe, 0xff,
00084   };
00085 #endif
00086 
00087 /*
00088 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00089 %                                                                             %
00090 %                                                                             %
00091 %                                                                             %
00092 %   A c q u i r e S t r i n g                                                 %
00093 %                                                                             %
00094 %                                                                             %
00095 %                                                                             %
00096 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00097 %
00098 %  AcquireString() allocates memory for a string and copies the source string
00099 %  to that memory location (and returns it).
00100 %
00101 %  The format of the AcquireString method is:
00102 %
00103 %      char *AcquireString(const char *source)
00104 %
00105 %  A description of each parameter follows:
00106 %
00107 %    o source: A character string.
00108 %
00109 */
00110 MagickExport char *AcquireString(const char *source)
00111 {
00112   char
00113     *destination;
00114 
00115   size_t
00116     length;
00117 
00118   length=0;
00119   if (source != (char *) NULL)
00120     length+=strlen(source);
00121   destination=(char *) NULL;
00122   if (~length >= MaxTextExtent)
00123     destination=(char *) AcquireQuantumMemory(length+MaxTextExtent,
00124       sizeof(*destination));
00125   if (destination == (char *) NULL)
00126     ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
00127   *destination='\0';
00128   if (source != (char *) NULL)
00129     (void) CopyMagickString(destination,source,(length+1)*sizeof(*destination));
00130   return(destination);
00131 }
00132 
00133 /*
00134 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00135 %                                                                             %
00136 %                                                                             %
00137 %                                                                             %
00138 %   A c q u i r e S t r i n g I n f o                                         %
00139 %                                                                             %
00140 %                                                                             %
00141 %                                                                             %
00142 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00143 %
00144 %  AcquireStringInfo() allocates the StringInfo structure.
00145 %
00146 %  The format of the AcquireStringInfo method is:
00147 %
00148 %      StringInfo *AcquireStringInfo(const size_t length)
00149 %
00150 %  A description of each parameter follows:
00151 %
00152 %    o length: the string length.
00153 %
00154 */
00155 MagickExport StringInfo *AcquireStringInfo(const size_t length)
00156 {
00157   StringInfo
00158     *string_info;
00159 
00160   string_info=(StringInfo *) AcquireMagickMemory(sizeof(*string_info));
00161   if (string_info == (StringInfo *) NULL)
00162     ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
00163   (void) ResetMagickMemory(string_info,0,sizeof(*string_info));
00164   string_info->signature=MagickSignature;
00165   string_info->length=length;
00166   if (string_info->length != 0)
00167     {
00168       string_info->datum=(unsigned char *) NULL;
00169       if (~string_info->length >= MaxTextExtent)
00170         string_info->datum=(unsigned char *) AcquireQuantumMemory(
00171           string_info->length+MaxTextExtent,sizeof(*string_info->datum));
00172       if (string_info->datum == (unsigned char *) NULL)
00173         ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
00174     }
00175   return(string_info);
00176 }
00177 
00178 /*
00179 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00180 %                                                                             %
00181 %                                                                             %
00182 %                                                                             %
00183 %   C l o n e S t r i n g                                                     %
00184 %                                                                             %
00185 %                                                                             %
00186 %                                                                             %
00187 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00188 %
00189 %  CloneString() allocates memory for the destination string and copies
00190 %  the source string to that memory location.
00191 %
00192 %  The format of the CloneString method is:
00193 %
00194 %      char *CloneString(char **destination,const char *source)
00195 %
00196 %  A description of each parameter follows:
00197 %
00198 %    o destination:  A pointer to a character string.
00199 %
00200 %    o source: A character string.
00201 %
00202 */
00203 MagickExport char *CloneString(char **destination,const char *source)
00204 {
00205   size_t
00206     length;
00207 
00208   (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
00209   assert(destination != (char **) NULL);
00210   if (source == (const char *) NULL)
00211     {
00212       if (*destination != (char *) NULL)
00213         *destination=DestroyString(*destination);
00214       return(*destination);
00215     }
00216   if (*destination == (char *) NULL)
00217     {
00218       *destination=AcquireString(source);
00219       return(*destination);
00220     }
00221   length=strlen(source);
00222   if (~length < MaxTextExtent)
00223     ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
00224   *destination=(char *) ResizeQuantumMemory(*destination,length+MaxTextExtent,
00225     sizeof(*destination));
00226   if (*destination == (char *) NULL)
00227     ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
00228   (void) CopyMagickString(*destination,source,(length+1)*sizeof(*destination));
00229   return(*destination);
00230 }
00231 
00232 /*
00233 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00234 %                                                                             %
00235 %                                                                             %
00236 %                                                                             %
00237 %   C l o n e S t r i n g I n f o                                             %
00238 %                                                                             %
00239 %                                                                             %
00240 %                                                                             %
00241 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00242 %
00243 %  CloneStringInfo() clones a copy of the StringInfo structure.
00244 %
00245 %  The format of the CloneStringInfo method is:
00246 %
00247 %      StringInfo *CloneStringInfo(const StringInfo *string_info)
00248 %
00249 %  A description of each parameter follows:
00250 %
00251 %    o string_info: the string info.
00252 %
00253 */
00254 MagickExport StringInfo *CloneStringInfo(const StringInfo *string_info)
00255 {
00256   StringInfo
00257     *clone_info;
00258 
00259   (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
00260   assert(string_info != (StringInfo *) NULL);
00261   assert(string_info->signature == MagickSignature);
00262   clone_info=AcquireStringInfo(string_info->length);
00263   if (string_info->length != 0)
00264     (void) CopyMagickMemory(clone_info->datum,string_info->datum,
00265       string_info->length+1);
00266   return(clone_info);
00267 }
00268 
00269 /*
00270 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00271 %                                                                             %
00272 %                                                                             %
00273 %                                                                             %
00274 %   C o m p a r e S t r i n g I n f o                                         %
00275 %                                                                             %
00276 %                                                                             %
00277 %                                                                             %
00278 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00279 %
00280 %  CompareStringInfo() compares the two datums target and source.  It returns
00281 %  an integer less than, equal to, or greater than zero if target is found,
00282 %  respectively, to be less than, to match, or be greater than source.
00283 %
00284 %  The format of the CompareStringInfo method is:
00285 %
00286 %      int CompareStringInfo(const StringInfo *target,const StringInfo *source)
00287 %
00288 %  A description of each parameter follows:
00289 %
00290 %    o target: the target string.
00291 %
00292 %    o source: the source string.
00293 %
00294 */
00295 
00296 static inline size_t MagickMin(const size_t x,const size_t y)
00297 {
00298   if (x < y)
00299     return(x);
00300   return(y);
00301 }
00302 
00303 MagickExport int CompareStringInfo(const StringInfo *target,
00304   const StringInfo *source)
00305 {
00306   int
00307     status;
00308 
00309   (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
00310   assert(target != (StringInfo *) NULL);
00311   assert(target->signature == MagickSignature);
00312   assert(source != (StringInfo *) NULL);
00313   assert(source->signature == MagickSignature);
00314   status=memcmp(target->datum,source->datum,MagickMin(target->length,
00315     source->length));
00316   if (status != 0)
00317     return(status);
00318   if (target->length == source->length)
00319     return(0);
00320   return(target->length < source->length ? -1 : 1);
00321 }
00322 
00323 /*
00324 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00325 %                                                                             %
00326 %                                                                             %
00327 %                                                                             %
00328 %   C o n c a t e n a t e M a g i c k S t r i n g                             %
00329 %                                                                             %
00330 %                                                                             %
00331 %                                                                             %
00332 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00333 %
00334 %  ConcatenateMagickString() concatenates the source string to the destination
00335 %  string.  The destination buffer is always null-terminated even if the
00336 %  string must be truncated.
00337 %
00338 %  The format of the ConcatenateMagickString method is:
00339 %
00340 %      size_t ConcatenateMagickString(char *destination,const char *source,
00341 %        const size_t length)
00342 %
00343 %  A description of each parameter follows:
00344 %
00345 %    o destination: the destination string.
00346 %
00347 %    o source: the source string.
00348 %
00349 %    o length: the length of the destination string.
00350 %
00351 */
00352 MagickExport size_t ConcatenateMagickString(char *destination,
00353   const char *source,const size_t length)
00354 {
00355   register char
00356     *q;
00357 
00358   register const char
00359     *p;
00360 
00361   register size_t
00362     i;
00363 
00364   size_t
00365     count;
00366 
00367   assert(destination != (char *) NULL);
00368   assert(source != (const char *) NULL);
00369   assert(length >= 1);
00370   p=source;
00371   q=destination;
00372   i=length;
00373   while ((i-- != 0) && (*q != '\0'))
00374     q++;
00375   count=(size_t) (q-destination);
00376   i=length-count;
00377   if (i == 0)
00378     return(count+strlen(p));
00379   while (*p != '\0')
00380   {
00381     if (i != 1)
00382       {
00383         *q++=(*p);
00384         i--;
00385       }
00386     p++;
00387   }
00388   *q='\0';
00389   return(count+(p-source));
00390 }
00391 
00392 /*
00393 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00394 %                                                                             %
00395 %                                                                             %
00396 %                                                                             %
00397 %   C o n c a t e n a t e S t r i n g                                         %
00398 %                                                                             %
00399 %                                                                             %
00400 %                                                                             %
00401 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00402 %
00403 %  ConcatenateString() appends a copy of string source, including the
00404 %  terminating null character, to the end of string destination.
00405 %
00406 %  The format of the ConcatenateString method is:
00407 %
00408 %      MagickBooleanType ConcatenateString(char **destination,
00409 %        const char *source)
00410 %
00411 %  A description of each parameter follows:
00412 %
00413 %    o destination:  A pointer to a character string.
00414 %
00415 %    o source: A character string.
00416 %
00417 */
00418 MagickExport MagickBooleanType ConcatenateString(char **destination,
00419   const char *source)
00420 {
00421   size_t
00422     length,
00423     source_length;
00424 
00425   assert(destination != (char **) NULL);
00426   if (source == (const char *) NULL)
00427     return(MagickTrue);
00428   if (*destination == (char *) NULL)
00429     {
00430       *destination=AcquireString(source);
00431       return(MagickTrue);
00432     }
00433   length=strlen(*destination);
00434   source_length=strlen(source);
00435   if (~length < source_length)
00436     ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
00437   length+=source_length;
00438   if (~length < MaxTextExtent)
00439     ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
00440   *destination=(char *) ResizeQuantumMemory(*destination,length+MaxTextExtent,
00441     sizeof(*destination));
00442   if (*destination == (char *) NULL)
00443     ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
00444   (void) ConcatenateMagickString(*destination,source,(length+1)*
00445     sizeof(*destination));
00446   return(MagickTrue);
00447 }
00448 
00449 /*
00450 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00451 %                                                                             %
00452 %                                                                             %
00453 %                                                                             %
00454 %   C o n c a t e n a t e S t r i n g I n f o                                 %
00455 %                                                                             %
00456 %                                                                             %
00457 %                                                                             %
00458 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00459 %
00460 %  ConcatenateStringInfo() concatenates the source string to the destination
00461 %  string.
00462 %
00463 %  The format of the ConcatenateStringInfo method is:
00464 %
00465 %      void ConcatenateStringInfo(StringInfo *string_info,
00466 %        const StringInfo *source)
00467 %
00468 %  A description of each parameter follows:
00469 %
00470 %    o string_info: the string info.
00471 %
00472 %    o source: the source string.
00473 %
00474 */
00475 MagickExport void ConcatenateStringInfo(StringInfo *string_info,
00476   const StringInfo *source)
00477 {
00478   size_t
00479     length;
00480 
00481   (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
00482   assert(string_info != (StringInfo *) NULL);
00483   assert(string_info->signature == MagickSignature);
00484   assert(source != (const StringInfo *) NULL);
00485   length=string_info->length;
00486   if (~length < source->length)
00487     ThrowFatalException(ResourceLimitFatalError,"UnableToConcatenateString");
00488   SetStringInfoLength(string_info,length+source->length);
00489   (void) CopyMagickMemory(string_info->datum+length,source->datum,
00490     source->length);
00491 }
00492 
00493 /*
00494 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00495 %                                                                             %
00496 %                                                                             %
00497 %                                                                             %
00498 %   C o n f i g u r e F i l e T o S t r i n g I n f o                         %
00499 %                                                                             %
00500 %                                                                             %
00501 %                                                                             %
00502 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00503 %
00504 %  ConfigureFileToStringInfo() returns the contents of a configure file as a
00505 %  string.
00506 %
00507 %  The format of the ConfigureFileToStringInfo method is:
00508 %
00509 %      StringInfo *ConfigureFileToStringInfo(const char *filename)
00510 %        ExceptionInfo *exception)
00511 %
00512 %  A description of each parameter follows:
00513 %
00514 %    o filename: the filename.
00515 %
00516 */
00517 MagickExport StringInfo *ConfigureFileToStringInfo(const char *filename)
00518 {
00519   char
00520     *string;
00521 
00522   int
00523     file;
00524 
00525   MagickOffsetType
00526     offset;
00527 
00528   size_t
00529     length;
00530 
00531   StringInfo
00532     *string_info;
00533 
00534   void
00535     *map;
00536 
00537   assert(filename != (const char *) NULL);
00538   file=open(filename,O_RDONLY | O_BINARY);
00539   if (file == -1)
00540     return((StringInfo *) NULL);
00541   offset=(MagickOffsetType) MagickSeek(file,0,SEEK_END);
00542   if ((offset < 0) || (offset != (MagickOffsetType) ((ssize_t) offset)))
00543     {
00544       file=close(file)-1;
00545       return((StringInfo *) NULL);
00546     }
00547   length=(size_t) offset;
00548   string=(char *) NULL;
00549   if (~length > MaxTextExtent)
00550     string=(char *) AcquireQuantumMemory(length+MaxTextExtent,sizeof(*string));
00551   if (string == (char *) NULL)
00552     {
00553       file=close(file)-1;
00554       return((StringInfo *) NULL);
00555     }
00556   map=MapBlob(file,ReadMode,0,length);
00557   if (map != (void *) NULL)
00558     {
00559       (void) CopyMagickMemory(string,map,length);
00560       (void) UnmapBlob(map,length);
00561     }
00562   else
00563     {
00564       register size_t
00565         i;
00566 
00567       ssize_t
00568         count;
00569 
00570       (void) MagickSeek(file,0,SEEK_SET);
00571       for (i=0; i < length; i+=count)
00572       {
00573         count=read(file,string+i,(size_t) MagickMin(length-i,(size_t)
00574           SSIZE_MAX));
00575         if (count <= 0)
00576           {
00577             count=0;
00578             if (errno != EINTR)
00579               break;
00580           }
00581       }
00582       if (i < length)
00583         {
00584           file=close(file)-1;
00585           string=DestroyString(string);
00586           return((StringInfo *) NULL);
00587         }
00588     }
00589   string[length]='\0';
00590   file=close(file)-1;
00591   string_info=AcquireStringInfo(0);
00592   (void) CopyMagickString(string_info->path,filename,MaxTextExtent);
00593   string_info->length=length;
00594   string_info->datum=(unsigned char *) string;
00595   return(string_info);
00596 }
00597 
00598 /*
00599 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00600 %                                                                             %
00601 %                                                                             %
00602 %                                                                             %
00603 %   C o n s t a n t S t r i n g                                               %
00604 %                                                                             %
00605 %                                                                             %
00606 %                                                                             %
00607 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00608 %
00609 %  ConstantString() allocates memory for a string and copies the source string
00610 %  to that memory location (and returns it).  Use it for strings that you do
00611 %  do not expect to change over its lifetime.
00612 %
00613 %  The format of the ConstantString method is:
00614 %
00615 %      char *ConstantString(const char *source)
00616 %
00617 %  A description of each parameter follows:
00618 %
00619 %    o source: A character string.
00620 %
00621 */
00622 MagickExport char *ConstantString(const char *source)
00623 {
00624   char
00625     *destination;
00626 
00627   size_t
00628     length;
00629 
00630   length=0;
00631   if (source != (char *) NULL)
00632     length+=strlen(source);
00633   destination=(char *) NULL;
00634   if (~length >= 1UL)
00635     destination=(char *) AcquireQuantumMemory(length+1UL,sizeof(*destination));
00636   if (destination == (char *) NULL)
00637     ThrowFatalException(ResourceLimitFatalError,"UnableToAcquireString");
00638   *destination='\0';
00639   if (source != (char *) NULL)
00640     (void) CopyMagickString(destination,source,(length+1)*sizeof(*destination));
00641   return(destination);
00642 }
00643 
00644 /*
00645 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00646 %                                                                             %
00647 %                                                                             %
00648 %                                                                             %
00649 %   C o p y M a g i c k S t r i n g                                           %
00650 %                                                                             %
00651 %                                                                             %
00652 %                                                                             %
00653 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00654 %
00655 %  CopyMagickString() copies the source string to the destination string.  The
00656 %  destination buffer is always null-terminated even if the string must be
00657 %  truncated.
00658 %
00659 %  The format of the CopyMagickString method is:
00660 %
00661 %      size_t CopyMagickString(const char *destination,char *source,
00662 %        const size_t length)
00663 %
00664 %  A description of each parameter follows:
00665 %
00666 %    o destination: the destination string.
00667 %
00668 %    o source: the source string.
00669 %
00670 %    o length: the length of the destination string.
00671 %
00672 */
00673 MagickExport size_t CopyMagickString(char *destination,const char *source,
00674   const size_t length)
00675 {
00676   register char
00677     *q;
00678 
00679   register const char
00680     *p;
00681 
00682   register size_t
00683     n;
00684 
00685   p=source;
00686   q=destination;
00687   for (n=length; n > 4; n-=4)
00688   {
00689     *q=(*p++);
00690     if (*q == '\0')
00691       return((size_t) (p-source-1));
00692     q++;
00693     *q=(*p++);
00694     if (*q == '\0')
00695       return((size_t) (p-source-1));
00696     q++;
00697     *q=(*p++);
00698     if (*q == '\0')
00699       return((size_t) (p-source-1));
00700     q++;
00701     *q=(*p++);
00702     if (*q == '\0')
00703       return((size_t) (p-source-1));
00704     q++;
00705   }
00706   if (n != 0)
00707     for (n--; n != 0; n--)
00708     {
00709       *q=(*p++);
00710       if (*q == '\0')
00711         return((size_t) (p-source-1));
00712       q++;
00713     }
00714   if (length != 0)
00715     *q='\0';
00716   while (*p++ != '\0') ;
00717   return((size_t) (p-source-1));
00718 }
00719 
00720 /*
00721 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00722 %                                                                             %
00723 %                                                                             %
00724 %                                                                             %
00725 %   D e s t r o y S t r i n g                                                 %
00726 %                                                                             %
00727 %                                                                             %
00728 %                                                                             %
00729 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00730 %
00731 %  DestroyString() destroys memory associated with a string.
00732 %
00733 %  The format of the DestroyString method is:
00734 %
00735 %      char *DestroyString(char *string)
00736 %
00737 %  A description of each parameter follows:
00738 %
00739 %    o string: the string.
00740 %
00741 */
00742 MagickExport char *DestroyString(char *string)
00743 {
00744   return((char *) RelinquishMagickMemory(string));
00745 }
00746 
00747 /*
00748 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00749 %                                                                             %
00750 %                                                                             %
00751 %                                                                             %
00752 %   D e s t r o y S t r i n g I n f o                                         %
00753 %                                                                             %
00754 %                                                                             %
00755 %                                                                             %
00756 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00757 %
00758 %  DestroyStringInfo() destroys memory associated with the StringInfo structure.
00759 %
00760 %  The format of the DestroyStringInfo method is:
00761 %
00762 %      StringInfo *DestroyStringInfo(StringInfo *string_info)
00763 %
00764 %  A description of each parameter follows:
00765 %
00766 %    o string_info: the string info.
00767 %
00768 */
00769 MagickExport StringInfo *DestroyStringInfo(StringInfo *string_info)
00770 {
00771   (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
00772   assert(string_info != (StringInfo *) NULL);
00773   assert(string_info->signature == MagickSignature);
00774   if (string_info->datum != (unsigned char *) NULL)
00775     string_info->datum=(unsigned char *) RelinquishMagickMemory(
00776       string_info->datum);
00777   string_info->signature=(~MagickSignature);
00778   string_info=(StringInfo *) RelinquishMagickMemory(string_info);
00779   return(string_info);
00780 }
00781 
00782 /*
00783 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00784 %                                                                             %
00785 %                                                                             %
00786 %                                                                             %
00787 %   D e s t r o y S t r i n g L i s t                                         %
00788 %                                                                             %
00789 %                                                                             %
00790 %                                                                             %
00791 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00792 %
00793 %  DestroyStringList() zeros memory associated with a string list.
00794 %
00795 %  The format of the DestroyStringList method is:
00796 %
00797 %      char **DestroyStringList(char **list)
00798 %
00799 %  A description of each parameter follows:
00800 %
00801 %    o list: the string list.
00802 %
00803 */
00804 MagickExport char **DestroyStringList(char **list)
00805 {
00806   register long
00807     i;
00808 
00809   assert(list != (char **) NULL);
00810   for (i=0; list[i] != (char *) NULL; i++)
00811     list[i]=DestroyString(list[i]);
00812   list=(char **) RelinquishMagickMemory(list);
00813   return(list);
00814 }
00815 
00816 /*
00817 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00818 %                                                                             %
00819 %                                                                             %
00820 %                                                                             %
00821 %   E s c a p e S t r i n g                                                   %
00822 %                                                                             %
00823 %                                                                             %
00824 %                                                                             %
00825 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00826 %
00827 %  EscapeString() allocates memory for a backslash-escaped version of a
00828 %  source text string, copies the escaped version of the text to that
00829 %  memory location while adding backslash characters, and returns the
00830 %  escaped string.
00831 %
00832 %  The format of the EscapeString method is:
00833 %
00834 %      char *EscapeString(const char *source,const char escape)
00835 %
00836 %  A description of each parameter follows:
00837 %
00838 %    o allocate_string:  Method EscapeString returns the escaped string.
00839 %
00840 %    o source: A character string.
00841 %
00842 %    o escape: the quoted string termination character to escape (e.g. '"').
00843 %
00844 */
00845 MagickExport char *EscapeString(const char *source,const char escape)
00846 {
00847   char
00848     *destination;
00849 
00850   register char
00851     *q;
00852 
00853   register const char
00854     *p;
00855 
00856   size_t
00857     length;
00858 
00859   (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
00860   assert(source != (const char *) NULL);
00861   length=strlen(source);
00862   for (p=source; *p != '\0'; p++)
00863     if ((*p == '\\') || (*p == escape))
00864       {
00865         if (~length < 1)
00866           ThrowFatalException(ResourceLimitFatalError,"UnableToEscapeString");
00867         length++;
00868       }
00869   destination=(char *) NULL;
00870   if (~length >= MaxTextExtent)
00871     destination=(char *) AcquireQuantumMemory(length+MaxTextExtent,
00872       sizeof(*destination));
00873   if (destination == (char *) NULL)
00874     ThrowFatalException(ResourceLimitFatalError,"UnableToEscapeString");
00875   *destination='\0';
00876   if (source != (char *) NULL)
00877     {
00878       q=destination;
00879       for (p=source; *p != '\0'; p++)
00880       {
00881         if ((*p == '\\') || (*p == escape))
00882           *q++='\\';
00883         *q++=(*p);
00884       }
00885       *q='\0';
00886     }
00887   return(destination);
00888 }
00889 
00890 /*
00891 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00892 %                                                                             %
00893 %                                                                             %
00894 %                                                                             %
00895 %   F i l e T o S t r i n g                                                   %
00896 %                                                                             %
00897 %                                                                             %
00898 %                                                                             %
00899 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00900 %
00901 %  FileToString() returns the contents of a file as a string.
00902 %
00903 %  The format of the FileToString method is:
00904 %
00905 %      char *FileToString(const char *filename,const size_t extent,
00906 %        ExceptionInfo *exception)
00907 %
00908 %  A description of each parameter follows:
00909 %
00910 %    o filename: the filename.
00911 %
00912 %    o extent: Maximum length of the string.
00913 %
00914 %    o exception: return any errors or warnings in this structure.
00915 %
00916 */
00917 MagickExport char *FileToString(const char *filename,const size_t extent,
00918   ExceptionInfo *exception)
00919 {
00920   size_t
00921     length;
00922 
00923   assert(filename != (const char *) NULL);
00924   (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename);
00925   assert(exception != (ExceptionInfo *) NULL);
00926   return((char *) FileToBlob(filename,extent,&length,exception));
00927 }
00928 
00929 /*
00930 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00931 %                                                                             %
00932 %                                                                             %
00933 %                                                                             %
00934 %   F i l e T o S t r i n g I n f o                                           %
00935 %                                                                             %
00936 %                                                                             %
00937 %                                                                             %
00938 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00939 %
00940 %  FileToStringInfo() returns the contents of a file as a string.
00941 %
00942 %  The format of the FileToStringInfo method is:
00943 %
00944 %      StringInfo *FileToStringInfo(const char *filename,const size_t extent,
00945 %        ExceptionInfo *exception)
00946 %
00947 %  A description of each parameter follows:
00948 %
00949 %    o filename: the filename.
00950 %
00951 %    o extent: Maximum length of the string.
00952 %
00953 %    o exception: return any errors or warnings in this structure.
00954 %
00955 */
00956 MagickExport StringInfo *FileToStringInfo(const char *filename,
00957   const size_t extent,ExceptionInfo *exception)
00958 {
00959   StringInfo
00960     *string_info;
00961 
00962   assert(filename != (const char *) NULL);
00963   (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename);
00964   assert(exception != (ExceptionInfo *) NULL);
00965   string_info=AcquireStringInfo(0);
00966   (void) CopyMagickString(string_info->path,filename,MaxTextExtent);
00967   string_info->datum=FileToBlob(filename,extent,&string_info->length,exception);
00968   if (string_info->datum == (unsigned char *) NULL)
00969     {
00970       string_info=DestroyStringInfo(string_info);
00971       return((StringInfo *) NULL);
00972     }
00973   return(string_info);
00974 }
00975 
00976 /*
00977 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00978 %                                                                             %
00979 %                                                                             %
00980 %                                                                             %
00981 %  F o r m a t M a g i c k S i z e                                            %
00982 %                                                                             %
00983 %                                                                             %
00984 %                                                                             %
00985 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00986 %
00987 %  FormatMagickSize() converts a size to a human readable format, for example,
00988 %  14kb, 234mb, 2.7gb, or 3.0tb.  Scaling is done by repetitively dividing by
00989 %  1024.
00990 %
00991 %  The format of the FormatMagickSize method is:
00992 %
00993 %      long FormatMagickSize(const MagickSizeType size,char *format)
00994 %
00995 %  A description of each parameter follows:
00996 %
00997 %    o size:  convert this size to a human readable format.
00998 %
00999 %    o format:  human readable format.
01000 %
01001 */
01002 MagickExport long FormatMagickSize(const MagickSizeType size,char *format)
01003 {
01004   double
01005     length;
01006 
01007   long
01008     count;
01009 
01010   register long
01011     i;
01012 
01013   static const char
01014     *units[] = { "b", "kb", "mb", "gb", "tb", "pb", "eb", (char *) NULL };
01015 
01016   length=(double) size;
01017   for (i=0; (length >= 1024.0) && (units[i+1] != (const char *) NULL); i++)
01018     length/=1024.0;
01019   count=FormatMagickString(format,MaxTextExtent,"%.*g%s",(int) (i+2),length,
01020     units[i]);
01021   return(count);
01022 }
01023 
01024 /*
01025 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01026 %                                                                             %
01027 %                                                                             %
01028 %                                                                             %
01029 %  F o r m a t M a g i c k S t r i n g                                        %
01030 %                                                                             %
01031 %                                                                             %
01032 %                                                                             %
01033 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01034 %
01035 %  FormatMagickString() prints formatted output of a variable argument list.
01036 %
01037 %  The format of the FormatMagickString method is:
01038 %
01039 %      long FormatMagickString(char *string,const size_t length,
01040 %        const char *format,...)
01041 %
01042 %  A description of each parameter follows.
01043 %
01044 %   o string:  FormatMagickString() returns the formatted string in this
01045 %     character buffer.
01046 %
01047 %   o length: the maximum length of the string.
01048 %
01049 %   o format:  A string describing the format to use to write the remaining
01050 %     arguments.
01051 %
01052 */
01053 
01054 MagickExport long FormatMagickStringList(char *string,const size_t length,
01055   const char *format,va_list operands)
01056 {
01057   int
01058     n;
01059 
01060 #if defined(MAGICKCORE_HAVE_VSNPRINTF)
01061   n=vsnprintf(string,length,format,operands);
01062 #else
01063   n=vsprintf(string,format,operands);
01064 #endif
01065   if (n < 0)
01066     string[length-1]='\0';
01067   return((long) n);
01068 }
01069 
01070 MagickExport long FormatMagickString(char *string,const size_t length,
01071   const char *format,...)
01072 {
01073   long
01074     n;
01075 
01076   va_list
01077     operands;
01078 
01079   va_start(operands,format);
01080   n=(long) FormatMagickStringList(string,length,format,operands);
01081   va_end(operands);
01082   return(n);
01083 }
01084 
01085 /*
01086 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01087 %                                                                             %
01088 %                                                                             %
01089 %                                                                             %
01090 %  F o r m a t M a g i c k T i m e                                            %
01091 %                                                                             %
01092 %                                                                             %
01093 %                                                                             %
01094 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01095 %
01096 %  FormatMagickTime() returns the specified time in the Internet date/time
01097 %  format and the length of the timestamp.
01098 %
01099 %  The format of the FormatMagickTime method is:
01100 %
01101 %      long FormatMagickTime(const time_t time,const size_t length,
01102 %        char *timestamp)
01103 %
01104 %  A description of each parameter follows.
01105 %
01106 %   o time:  the time since the Epoch (00:00:00 UTC, January 1, 1970),
01107 %     measured in seconds.
01108 %
01109 %   o length: the maximum length of the string.
01110 %
01111 %   o timestamp:  Return the Internet date/time here.
01112 %
01113 */
01114 MagickExport long FormatMagickTime(const time_t time,const size_t length,
01115   char *timestamp)
01116 {
01117   long
01118     count;
01119 
01120   struct tm
01121     local_time,
01122     utc_time;
01123 
01124   time_t
01125     timezone;
01126 
01127   assert(timestamp != (char *) NULL);
01128   local_time=(*localtime(&time));
01129   utc_time=(*gmtime(&time));
01130   timezone=(time_t) ((local_time.tm_min-utc_time.tm_min)/60+local_time.tm_hour-
01131     utc_time.tm_hour+24*((local_time.tm_year-utc_time.tm_year) != 0 ?
01132     (local_time.tm_year-utc_time.tm_year) : (local_time.tm_yday-
01133     utc_time.tm_yday)));
01134   count=FormatMagickString(timestamp,length,
01135     "%04d-%02d-%02dT%02d:%02d:%02d%+03ld:00",local_time.tm_year+1900,
01136     local_time.tm_mon+1,local_time.tm_mday,local_time.tm_hour,local_time.tm_min,
01137     local_time.tm_sec,(long) timezone);
01138   return(count);
01139 }
01140 
01141 /*
01142 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01143 %                                                                             %
01144 %                                                                             %
01145 %                                                                             %
01146 %   G e t E n v i r o n m e n t V a l u e                                     %
01147 %                                                                             %
01148 %                                                                             %
01149 %                                                                             %
01150 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01151 %
01152 %  GetEnvironmentValue() returns the environment string that matches the
01153 %  specified name.
01154 %
01155 %  The format of the GetEnvironmentValue method is:
01156 %
01157 %      char *GetEnvironmentValue(const char *name)
01158 %
01159 %  A description of each parameter follows:
01160 %
01161 %    o name: the environment name.
01162 %
01163 */
01164 MagickExport char *GetEnvironmentValue(const char *name)
01165 {
01166   const char
01167     *environment;
01168 
01169   environment=getenv(name);
01170   if (environment == (const char *) NULL)
01171     return((char *) NULL);
01172   return(ConstantString(environment));
01173 }
01174 
01175 /*
01176 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01177 %                                                                             %
01178 %                                                                             %
01179 %                                                                             %
01180 %   G e t S t r i n g I n f o D a t u m                                       %
01181 %                                                                             %
01182 %                                                                             %
01183 %                                                                             %
01184 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01185 %
01186 %  GetStringInfoDatum() returns the datum associated with the string.
01187 %
01188 %  The format of the GetStringInfoDatum method is:
01189 %
01190 %      unsigned char *GetStringInfoDatum(const StringInfo *string_info)
01191 %
01192 %  A description of each parameter follows:
01193 %
01194 %    o string_info: the string info.
01195 %
01196 */
01197 MagickExport unsigned char *GetStringInfoDatum(const