41#include "magick/studio.h"
42#include "magick/blob.h"
43#include "magick/blob-private.h"
44#include "magick/exception.h"
45#include "magick/exception-private.h"
46#include "magick/image-private.h"
47#include "magick/list.h"
48#include "magick/locale_.h"
49#include "magick/log.h"
50#include "magick/memory_.h"
51#include "magick/memory-private.h"
52#include "magick/nt-base.h"
53#include "magick/nt-base-private.h"
54#include "magick/policy.h"
55#include "magick/property.h"
56#include "magick/resource_.h"
57#include "magick/signature-private.h"
58#include "magick/string_.h"
59#include "magick/string-private.h"
60#include "magick/utility-private.h"
65#define CharsPerLine 0x14
70#if !defined(MAGICKCORE_HAVE_STRCASECMP) || !defined(MAGICKCORE_HAVE_STRNCASECMP)
71static const unsigned char
74 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
75 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
76 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
77 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
78 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
79 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
80 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73,
81 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
82 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
83 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
84 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83,
85 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
86 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
87 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
88 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3,
89 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
90 0xc0, 0xe1, 0xe2, 0xe3, 0xe4, 0xc5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
91 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
92 0xf8, 0xf9, 0xfa, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3,
93 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
94 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb,
95 0xfc, 0xfd, 0xfe, 0xff,
127MagickExport
char *AcquireString(
const char *source)
136 if (source != (
char *) NULL)
137 length+=strlen(source);
138 if (~length < MaxTextExtent)
139 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
140 destination=(
char *) AcquireQuantumMemory(length+MaxTextExtent,
141 sizeof(*destination));
142 if (destination == (
char *) NULL)
143 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
144 if (source != (
char *) NULL)
145 (void) memcpy(destination,source,length*
sizeof(*destination));
146 destination[length]=
'\0';
173static StringInfo *AcquireStringInfoContainer(
void)
178 string_info=(StringInfo *) AcquireMagickMemory(
sizeof(*string_info));
179 if (string_info == (StringInfo *) NULL)
180 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
181 (void) memset(string_info,0,
sizeof(*string_info));
182 string_info->signature=MagickCoreSignature;
186MagickExport StringInfo *AcquireStringInfo(
const size_t length)
191 string_info=AcquireStringInfoContainer();
192 string_info->length=length;
193 if (~string_info->length >= (MaxTextExtent-1))
194 string_info->datum=(
unsigned char *) AcquireQuantumMemory(
195 string_info->length+MaxTextExtent,
sizeof(*string_info->datum));
196 if (string_info->datum == (
unsigned char *) NULL)
197 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
198 (void) memset(string_info->datum,0,(length+MagickPathExtent)*
199 sizeof(*string_info->datum));
228MagickExport StringInfo *BlobToStringInfo(
const void *blob,
const size_t length)
233 if (~length < MaxTextExtent)
234 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
235 string_info=AcquireStringInfoContainer();
236 string_info->length=length;
237 string_info->datum=(
unsigned char *) AcquireQuantumMemory(length+
238 MaxTextExtent,
sizeof(*string_info->datum));
239 if (string_info->datum == (
unsigned char *) NULL)
241 string_info=DestroyStringInfo(string_info);
242 return((StringInfo *) NULL);
244 if (blob != (
const void *) NULL)
245 (void) memcpy(string_info->datum,blob,length);
247 (
void) memset(string_info->datum,0,length*
sizeof(*string_info->datum));
248 (void) memset(string_info->datum+length,0,MagickPathExtent*
249 sizeof(*string_info->datum));
285MagickExport
char *CloneString(
char **destination,
const char *source)
290 assert(destination != (
char **) NULL);
291 if (source == (
const char *) NULL)
293 if (*destination != (
char *) NULL)
294 *destination=DestroyString(*destination);
295 return(*destination);
297 if (*destination == (
char *) NULL)
299 *destination=AcquireString(source);
300 return(*destination);
302 length=strlen(source);
303 if (~length < MaxTextExtent)
304 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
305 *destination=(
char *) ResizeQuantumMemory(*destination,length+MaxTextExtent,
306 sizeof(**destination));
307 if (*destination == (
char *) NULL)
308 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
310 (void) memcpy(*destination,source,length*
sizeof(**destination));
311 (*destination)[length]=
'\0';
312 return(*destination);
337MagickExport StringInfo *CloneStringInfo(
const StringInfo *string_info)
342 assert(string_info != (StringInfo *) NULL);
343 assert(string_info->signature == MagickCoreSignature);
344 clone_info=AcquireStringInfo(string_info->length);
345 (void) CopyMagickString(clone_info->path,string_info->path,MagickPathExtent);
346 (void) CloneString(&clone_info->name,string_info->name);
347 if (string_info->length != 0)
348 (void) memcpy(clone_info->datum,string_info->datum,string_info->length+1);
379MagickExport
int CompareStringInfo(
const StringInfo *target,
380 const StringInfo *source)
385 assert(target != (StringInfo *) NULL);
386 assert(target->signature == MagickCoreSignature);
387 assert(source != (StringInfo *) NULL);
388 assert(source->signature == MagickCoreSignature);
389 status=memcmp(target->datum,source->datum,MagickMin(target->length,
393 if (target->length == source->length)
395 return(target->length < source->length ? -1 : 1);
427MagickExport
size_t ConcatenateMagickString(
char *magick_restrict destination,
428 const char *magick_restrict source,
const size_t length)
442 assert(destination != (
char *) NULL);
443 assert(source != (
const char *) NULL);
448 while ((i-- != 0) && (*q !=
'\0'))
450 count=(size_t) (q-destination);
453 return(count+strlen(p));
464 return(count+(p-source));
493MagickExport MagickBooleanType ConcatenateString(
494 char **magick_restrict destination,
const char *magick_restrict source)
501 assert(destination != (
char **) NULL);
502 if (source == (
const char *) NULL)
504 if (*destination == (
char *) NULL)
506 *destination=AcquireString(source);
509 destination_length=strlen(*destination);
510 source_length=strlen(source);
511 length=destination_length;
512 if (~length < source_length)
513 ThrowFatalException(ResourceLimitFatalError,
"UnableToConcatenateString");
514 length+=source_length;
515 if (~length < MaxTextExtent)
516 ThrowFatalException(ResourceLimitFatalError,
"UnableToConcatenateString");
517 *destination=(
char *) ResizeQuantumMemory(*destination,
518 OverAllocateMemory(length+MaxTextExtent),
sizeof(**destination));
519 if (*destination == (
char *) NULL)
520 ThrowFatalException(ResourceLimitFatalError,
"UnableToConcatenateString");
521 if (source_length != 0)
522 (void) memcpy((*destination)+destination_length,source,source_length);
523 (*destination)[length]=
'\0';
553MagickExport
void ConcatenateStringInfo(StringInfo *string_info,
554 const StringInfo *source)
559 assert(string_info != (StringInfo *) NULL);
560 assert(string_info->signature == MagickCoreSignature);
561 assert(source != (
const StringInfo *) NULL);
562 length=string_info->length;
563 if (~length < source->length)
564 ThrowFatalException(ResourceLimitFatalError,
"UnableToConcatenateString");
565 length+=source->length;
566 if (~length < MagickPathExtent)
567 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
568 if (string_info->datum == (
unsigned char *) NULL)
569 string_info->datum=(
unsigned char *) AcquireQuantumMemory(length+
570 MagickPathExtent,
sizeof(*string_info->datum));
572 string_info->datum=(
unsigned char *) ResizeQuantumMemory(
573 string_info->datum,OverAllocateMemory(length+MagickPathExtent),
574 sizeof(*string_info->datum));
575 if (string_info->datum == (
unsigned char *) NULL)
576 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
577 (void) memcpy(string_info->datum+string_info->length,source->datum,source->length);
578 string_info->length=length;
605MagickExport StringInfo *ConfigureFileToStringInfo(
const char *filename)
625 assert(filename != (
const char *) NULL);
626 file=open_utf8(filename,O_RDONLY | O_BINARY,0);
628 return((StringInfo *) NULL);
629 offset=(MagickOffsetType) lseek(file,0,SEEK_END);
630 if ((offset < 0) || (offset != (MagickOffsetType) ((ssize_t) offset)))
632 file=close_utf8(file)-1;
633 return((StringInfo *) NULL);
635 length=(size_t) offset;
636 string=(
char *) NULL;
637 if (~length >= (MaxTextExtent-1))
638 string=(
char *) AcquireQuantumMemory(length+MaxTextExtent,
sizeof(*
string));
639 if (
string == (
char *) NULL)
641 file=close_utf8(file)-1;
642 return((StringInfo *) NULL);
644 map=MapBlob(file,ReadMode,0,length);
645 if (map != (
void *) NULL)
647 (void) memcpy(
string,map,length);
648 (void) UnmapBlob(map,length);
658 (void) lseek(file,0,SEEK_SET);
659 for (i=0; i < length; i+=count)
661 count=read(file,
string+i,(
size_t) MagickMin(length-i,(
size_t)
662 MagickMaxBufferExtent));
672 file=close_utf8(file)-1;
673 string=DestroyString(
string);
674 return((StringInfo *) NULL);
678 file=close_utf8(file)-1;
679 string_info=AcquireStringInfoContainer();
680 (void) CopyMagickString(string_info->path,filename,MaxTextExtent);
681 string_info->length=length;
682 string_info->datum=(
unsigned char *)
string;
712MagickExport
char *ConstantString(
const char *source)
721 if (source != (
char *) NULL)
722 length+=strlen(source);
723 destination=(
char *) NULL;
725 destination=(
char *) AcquireQuantumMemory(length+1UL,
sizeof(*destination));
726 if (destination == (
char *) NULL)
727 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
728 if (source != (
char *) NULL)
729 (void) memcpy(destination,source,length*
sizeof(*destination));
730 destination[length]=
'\0';
765MagickExport
size_t CopyMagickString(
char *magick_restrict destination,
766 const char *magick_restrict source,
const size_t length)
779 for (n=length; n > 4; n-=4)
781 if (((*q++)=(*p++)) ==
'\0')
782 return((
size_t) (p-source-1));
783 if (((*q++)=(*p++)) ==
'\0')
784 return((
size_t) (p-source-1));
785 if (((*q++)=(*p++)) ==
'\0')
786 return((
size_t) (p-source-1));
787 if (((*q++)=(*p++)) ==
'\0')
788 return((
size_t) (p-source-1));
793 if (((*q++)=(*p++)) ==
'\0')
794 return((
size_t) (p-source-1));
797 return((
size_t) (p-source));
822MagickExport
char *DestroyString(
char *
string)
824 return((
char *) RelinquishMagickMemory(
string));
849MagickExport StringInfo *DestroyStringInfo(StringInfo *string_info)
851 assert(string_info != (StringInfo *) NULL);
852 assert(string_info->signature == MagickCoreSignature);
853 if (string_info->datum != (
unsigned char *) NULL)
854 string_info->datum=(
unsigned char *) RelinquishMagickMemory(
856 if (string_info->name != (
char *) NULL)
857 string_info->name=DestroyString(string_info->name);
858 string_info->signature=(~MagickCoreSignature);
859 string_info=(StringInfo *) RelinquishMagickMemory(string_info);
885MagickExport
char **DestroyStringList(
char **list)
890 assert(list != (
char **) NULL);
891 for (i=0; list[i] != (
char *) NULL; i++)
892 list[i]=DestroyString(list[i]);
893 list=(
char **) RelinquishMagickMemory(list);
926MagickExport
char *EscapeString(
const char *source,
const char escape)
940 assert(source != (
const char *) NULL);
942 for (p=source; *p !=
'\0'; p++)
944 if ((*p ==
'\\') || (*p == escape))
947 ThrowFatalException(ResourceLimitFatalError,
"UnableToEscapeString");
952 destination=(
char *) NULL;
953 if (~length >= (MaxTextExtent-1))
954 destination=(
char *) AcquireQuantumMemory(length+MaxTextExtent,
955 sizeof(*destination));
956 if (destination == (
char *) NULL)
957 ThrowFatalException(ResourceLimitFatalError,
"UnableToEscapeString");
960 for (p=source; *p !=
'\0'; p++)
962 if ((*p ==
'\\') || (*p == escape))
997MagickExport
char *FileToString(
const char *filename,
const size_t extent,
998 ExceptionInfo *exception)
1006 assert(filename != (
const char *) NULL);
1007 assert(exception != (ExceptionInfo *) NULL);
1008 if (IsEventLogging() != MagickFalse)
1009 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",filename);
1011 if ((*filename ==
'@') && (strlen(filename) > 1))
1016 status=IsRightsAuthorized(PathPolicyDomain,ReadPolicyRights,filename);
1017 if (status == MagickFalse)
1018 ThrowPolicyException(filename,(
char *) NULL);
1021 return((
char *) FileToBlob(p,extent,&length,exception));
1051MagickExport StringInfo *FileToStringInfo(
const char *filename,
1052 const size_t extent,ExceptionInfo *exception)
1057 assert(filename != (
const char *) NULL);
1058 assert(exception != (ExceptionInfo *) NULL);
1059 if (IsEventLogging() != MagickFalse)
1060 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",filename);
1061 string_info=AcquireStringInfoContainer();
1062 (void) CopyMagickString(string_info->path,filename,MaxTextExtent);
1063 string_info->datum=FileToBlob(filename,extent,&string_info->length,exception);
1064 if (string_info->datum == (
unsigned char *) NULL)
1066 string_info=DestroyStringInfo(string_info);
1067 return((StringInfo *) NULL);
1069 return(string_info);
1101MagickExport ssize_t FormatMagickSize(
const MagickSizeType size,
1102 const MagickBooleanType bi,
char *format)
1120 "",
"Ki",
"Mi",
"Gi",
"Ti",
"Pi",
"Ei",
"Zi",
"Yi",
"Ri",
"Qi", (
char *) NULL
1122 *traditional_units[] =
1124 "",
"K",
"M",
"G",
"T",
"P",
"E",
"Z",
"Y",
"R",
"Q", (
char *) NULL
1128 units=traditional_units;
1129 if (bi != MagickFalse)
1134#if defined(_MSC_VER) && (_MSC_VER == 1200)
1135 length=(double) ((MagickOffsetType) size);
1137 length=(double) size;
1139 (void) FormatLocaleString(format,MaxTextExtent,
"%.*g",GetMagickPrecision(),
1141 if (strstr(format,
"e+") == (
char *) NULL)
1143 count=FormatLocaleString(format,MaxTextExtent,
"%.20g%sB",length,units[0]);
1146 for (i=0; (length >= bytes) && (units[i+1] != (
const char *) NULL); i++)
1148 count=FormatLocaleString(format,MaxTextExtent,
"%.*g%sB",GetMagickPrecision(),
1176MagickExport
char *GetEnvironmentValue(
const char *name)
1178#if defined(MAGICKCORE_WINDOWS_SUPPORT)
1179 return(NTGetEnvironmentValue(name));
1184 environment=getenv(name);
1185 if (environment == (
const char *) NULL)
1186 return((
char *) NULL);
1187 return(ConstantString(environment));
1213MagickExport
unsigned char *GetStringInfoDatum(
const StringInfo *string_info)
1215 assert(string_info != (StringInfo *) NULL);
1216 assert(string_info->signature == MagickCoreSignature);
1217 return(string_info->datum);
1242MagickExport
size_t GetStringInfoLength(
const StringInfo *string_info)
1244 assert(string_info != (StringInfo *) NULL);
1245 assert(string_info->signature == MagickCoreSignature);
1246 return(string_info->length);
1271MagickExport
const char *GetStringInfoName(
const StringInfo *string_info)
1273 assert(string_info != (StringInfo *) NULL);
1274 assert(string_info->signature == MagickCoreSignature);
1275 return(string_info->name);
1300MagickExport
const char *GetStringInfoPath(
const StringInfo *string_info)
1302 assert(string_info != (StringInfo *) NULL);
1303 assert(string_info->signature == MagickCoreSignature);
1304 return(string_info->path);
1334MagickExport
double InterpretSiPrefixValue(
const char *magick_restrict
string,
1335 char **magick_restrict sentinel)
1343 value=InterpretLocaleValue(
string,&q);
1346 if ((*q >=
'E') && (*q <=
'z'))
1351 switch ((
int) ((
unsigned char) *q))
1353 case 'q': e=(-30.0);
break;
1354 case 'r': e=(-27.0);
break;
1355 case 'y': e=(-24.0);
break;
1356 case 'z': e=(-21.0);
break;
1357 case 'a': e=(-18.0);
break;
1358 case 'f': e=(-15.0);
break;
1359 case 'p': e=(-12.0);
break;
1360 case 'n': e=(-9.0);
break;
1361 case 'u': e=(-6.0);
break;
1362 case 'm': e=(-3.0);
break;
1363 case 'c': e=(-2.0);
break;
1364 case 'd': e=(-1.0);
break;
1365 case 'h': e=2.0;
break;
1366 case 'k': e=3.0;
break;
1367 case 'K': e=3.0;
break;
1368 case 'M': e=6.0;
break;
1369 case 'G': e=9.0;
break;
1370 case 'T': e=12.0;
break;
1371 case 'P': e=15.0;
break;
1372 case 'E': e=18.0;
break;
1373 case 'Z': e=21.0;
break;
1374 case 'Y': e=24.0;
break;
1375 case 'R': e=27.0;
break;
1376 case 'Q': e=30.0;
break;
1377 default: e=0.0;
break;
1379 if (e >= MagickEpsilon)
1383 value*=pow(2.0,e/0.3);
1393 if ((*q ==
'B') || (*q ==
'P'))
1396 if (sentinel != (
char **) NULL)
1427MagickExport MagickBooleanType IsStringTrue(
const char *value)
1429 if (value == (
const char *) NULL)
1430 return(MagickFalse);
1431 if (LocaleCompare(value,
"true") == 0)
1433 if (LocaleCompare(value,
"on") == 0)
1435 if (LocaleCompare(value,
"yes") == 0)
1437 if (LocaleCompare(value,
"1") == 0)
1439 return(MagickFalse);
1469MagickExport MagickBooleanType IsStringNotFalse(
const char *value)
1471 if (value == (
const char *) NULL)
1473 if (LocaleCompare(value,
"false") == 0)
1474 return(MagickFalse);
1475 if (LocaleCompare(value,
"off") == 0)
1476 return(MagickFalse);
1477 if (LocaleCompare(value,
"no") == 0)
1478 return(MagickFalse);
1479 if (LocaleCompare(value,
"0") == 0)
1480 return(MagickFalse);
1511MagickExport
void PrintStringInfo(FILE *file,
const char *
id,
1512 const StringInfo *string_info)
1524 assert(
id != (
const char *) NULL);
1525 assert(string_info != (StringInfo *) NULL);
1526 assert(string_info->signature == MagickCoreSignature);
1527 p=(
const unsigned char *) string_info->datum;
1528 for (i=0; i < string_info->length; i++)
1529 if ((p[i] < 32) && (isspace((
int)p[i]) == 0))
1531 (void) FormatLocaleFile(file,
"%s(%.20g):\n",
id,(
double) string_info->length);
1532 if (i == string_info->length)
1534 for (i = 0; i < string_info->length; i++)
1535 (
void) fputc(p[i],file);
1536 (void) fputc(
'\n',file);
1542 for (i=0; i < string_info->length; i+=CharsPerLine)
1544 (void) FormatLocaleFile(file,
"0x%08lx: ",(
unsigned long) i);
1545 for (j = 0; j < MagickMin(string_info->length-i, CharsPerLine); j++)
1547 (void) FormatLocaleFile(file,
"%02lx",(
unsigned long) (p[i+j]) & 0xff);
1548 if (((j+1) % 0x04) == 0)
1549 (void) fputc(
' ',file);
1554 for ( ; j < CharsPerLine; j++)
1556 (void) fputc(
' ',file);
1557 (void) fputc(
' ',file);
1558 if (((j+1) % 0x04) == 0)
1559 (void) fputc(
' ',file);
1561 (void) fputc(
' ',file);
1565 for (j=0; j < MagickMin(string_info->length-i,CharsPerLine); j++)
1567 unsigned char c = p[i+j];
1568 if (isprint((
int) c) != 0)
1569 (void) fputc(c,file);
1571 (
void) fputc(
'-',file);
1573 (void) fputc(
'\n',file);
1599MagickExport
void ResetStringInfo(StringInfo *string_info)
1601 assert(string_info != (StringInfo *) NULL);
1602 assert(string_info->signature == MagickCoreSignature);
1603 (void) memset(string_info->datum,0,string_info->length);
1631MagickExport
char *SanitizeString(
const char *source)
1644 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 "
1645 "$-_.+!*'(),{}|\\^~[]`\"><#%;/?:@&=";
1647 sanitize_source=AcquireString(source);
1649 q=sanitize_source+strlen(sanitize_source);
1650 for (p+=strspn(p,allowlist); p != q; p+=(ptrdiff_t) strspn(p,allowlist))
1652 return(sanitize_source);
1679MagickExport
void SetStringInfo(StringInfo *string_info,
1680 const StringInfo *source)
1682 assert(string_info != (StringInfo *) NULL);
1683 assert(string_info->signature == MagickCoreSignature);
1684 assert(source != (StringInfo *) NULL);
1685 assert(source->signature == MagickCoreSignature);
1686 if (string_info->length == 0)
1688 (void) memset(string_info->datum,0,string_info->length);
1689 (void) memcpy(string_info->datum,source->datum,MagickMin(string_info->length,
1719MagickExport
void SetStringInfoDatum(StringInfo *string_info,
1720 const unsigned char *source)
1722 assert(string_info != (StringInfo *) NULL);
1723 assert(string_info->signature == MagickCoreSignature);
1724 if (string_info->length != 0)
1725 (void) memcpy(string_info->datum,source,string_info->length);
1752MagickExport
void SetStringInfoLength(StringInfo *string_info,
1753 const size_t length)
1755 assert(string_info != (StringInfo *) NULL);
1756 assert(string_info->signature == MagickCoreSignature);
1757 if (string_info->length == length)
1759 if (~length < MaxTextExtent)
1760 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
1761 string_info->length=length;
1762 if (string_info->datum == (
unsigned char *) NULL)
1763 string_info->datum=(
unsigned char *) AcquireQuantumMemory(length+
1764 MaxTextExtent,
sizeof(*string_info->datum));
1766 string_info->datum=(
unsigned char *) ResizeQuantumMemory(string_info->datum,
1767 length+MaxTextExtent,
sizeof(*string_info->datum));
1768 if (string_info->datum == (
unsigned char *) NULL)
1769 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
1796MagickExport
void SetStringInfoName(StringInfo *string_info,
const char *name)
1798 assert(string_info != (StringInfo *) NULL);
1799 assert(string_info->signature == MagickCoreSignature);
1800 assert(name != (
const char *) NULL);
1801 string_info->name=ConstantString(name);
1828MagickExport
void SetStringInfoPath(StringInfo *string_info,
const char *path)
1830 assert(string_info != (StringInfo *) NULL);
1831 assert(string_info->signature == MagickCoreSignature);
1832 assert(path != (
const char *) NULL);
1833 (void) CopyMagickString(string_info->path,path,MaxTextExtent);
1858MagickExport StringInfo *SplitStringInfo(StringInfo *string_info,
1859 const size_t offset)
1864 assert(string_info != (StringInfo *) NULL);
1865 assert(string_info->signature == MagickCoreSignature);
1866 if (offset > string_info->length)
1867 return((StringInfo *) NULL);
1868 split_info=AcquireStringInfo(offset);
1869 SetStringInfo(split_info,string_info);
1870 (void) memmove(string_info->datum,string_info->datum+offset,
1871 string_info->length-offset+MaxTextExtent);
1872 SetStringInfoLength(string_info,string_info->length-offset);
1898MagickExport
char *StringInfoToString(
const StringInfo *string_info)
1906 string=(
char *) NULL;
1907 length=string_info->length;
1908 if (~length >= (MaxTextExtent-1))
1909 string=(
char *) AcquireQuantumMemory(length+MaxTextExtent,
sizeof(*
string));
1910 if (
string == (
char *) NULL)
1911 return((
char *) NULL);
1912 (void) memcpy(
string,(
char *) string_info->datum,length*
sizeof(*
string));
1913 string[length]=
'\0';
1939MagickExport
char *StringInfoToHexString(
const StringInfo *string_info)
1959 length=string_info->length;
1960 if (~length < MaxTextExtent)
1961 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
1962 string=(
char *) AcquireQuantumMemory(length+MaxTextExtent,2*
sizeof(*
string));
1963 if (
string == (
char *) NULL)
1964 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
1981 p=string_info->datum;
1982 q=(
unsigned char *)
string;
1983 for (i=0; i < (ssize_t) string_info->length; i++)
1985 *q++=hex_digits[(*p >> 4) & 0x0f];
1986 *q++=hex_digits[*p & 0x0f];
2027MagickExport
char **StringToArgv(
const char *text,
int *argc)
2040 if (text == (
char *) NULL)
2041 return((
char **) NULL);
2045 for (p=text; *p !=
'\0'; )
2047 while (isspace((
int) ((
unsigned char) *p)) != 0)
2053 for (p++; (*p !=
'"') && (*p !=
'\0'); p++) ;
2055 for (p++; (*p !=
'\'') && (*p !=
'\0'); p++) ;
2056 while ((isspace((
int) ((
unsigned char) *p)) == 0) && (*p !=
'\0'))
2060 argv=(
char **) AcquireQuantumMemory((
size_t) (*argc+1UL),
sizeof(*argv));
2061 if (argv == (
char **) NULL)
2062 ThrowFatalException(ResourceLimitFatalError,
"UnableToConvertStringToARGV");
2066 argv[0]=AcquireString(
"magick");
2068 for (i=1; i < (ssize_t) *argc; i++)
2070 while (isspace((
int) ((
unsigned char) *p)) != 0)
2076 for (q++; (*q !=
'"') && (*q !=
'\0'); q++) ;
2082 for (q++; (*q !=
'\'') && (*q !=
'\0'); q++) ;
2085 while ((isspace((
int) ((
unsigned char) *q)) == 0) && (*q !=
'\0'))
2087 argv[i]=(
char *) AcquireQuantumMemory((
size_t) (q-p)+MaxTextExtent,
2089 if (argv[i] == (
char *) NULL)
2091 for (i--; i >= 0; i--)
2092 argv[i]=DestroyString(argv[i]);
2093 argv=(
char **) RelinquishMagickMemory(argv);
2094 ThrowFatalException(ResourceLimitFatalError,
2095 "UnableToConvertStringToARGV");
2097 (void) memcpy(argv[i],p,(
size_t) (q-p));
2100 while ((isspace((
int) ((
unsigned char) *p)) == 0) && (*p !=
'\0'))
2103 argv[i]=(
char *) NULL;
2142MagickExport
double *StringToArrayOfDoubles(
const char *
string,ssize_t *count,
2143 ExceptionInfo *exception)
2160 assert(exception != (ExceptionInfo *) NULL);
2161 assert(exception->signature == MagickCoreSignature);
2163 if (
string == (
char *) NULL)
2164 return((
double *) NULL);
2169 (void) StringToDouble(p,&q);
2171 return((
double *) NULL);
2174 while (isspace((
int) ((
unsigned char) *p)) != 0)
2178 while (isspace((
int) ((
unsigned char) *p)) != 0)
2185 array=(
double *) AcquireQuantumMemory((
size_t) i,
sizeof(*array));
2186 if (array == (
double *) NULL)
2188 (void) ThrowMagickException(exception,GetMagickModule(),
2189 ResourceLimitError,
"MemoryAllocationFailed",
"`%s'",
"");
2190 return((
double *) NULL);
2197 while ((*p !=
'\0') && (i < *count))
2199 array[i++]=StringToDouble(p,&q);
2201 while ((isspace((
int) ((
unsigned char) *p)) != 0) || (*p ==
','))
2241MagickExport
char *StringToken(
const char *delimiters,
char **
string)
2257 if (p == (
char *) NULL)
2258 return((
char *) NULL);
2276 }
while (d !=
'\0');
2304MagickExport
char **StringToList(
const char *text)
2306 return(StringToStrings(text,(
size_t *) NULL));
2335MagickExport
char **StringToStrings(
const char *text,
size_t *count)
2349 if (text == (
char *) NULL)
2351 if (count != (
size_t *) NULL)
2353 return((
char **) NULL);
2355 for (p=text; *p !=
'\0'; p++)
2356 if (((
int) ((
unsigned char) *p) < 32) &&
2357 (isspace((
int) ((
unsigned char) *p)) == 0))
2368 for (p=text; *p !=
'\0'; p++)
2371 textlist=(
char **) AcquireQuantumMemory((
size_t) lines+1UL,
2373 if (textlist == (
char **) NULL)
2374 ThrowFatalException(ResourceLimitFatalError,
"UnableToConvertText");
2376 for (i=0; i < (ssize_t) lines; i++)
2378 for (q=p; *q !=
'\0'; q++)
2379 if ((*q ==
'\r') || (*q ==
'\n'))
2381 textlist[i]=(
char *) AcquireQuantumMemory((
size_t) (q-p)+1,
2382 sizeof(**textlist));
2383 if (textlist[i] == (
char *) NULL)
2384 ThrowFatalException(ResourceLimitFatalError,
"UnableToConvertText");
2385 (void) memcpy(textlist[i],p,(
size_t) (q-p));
2386 textlist[i][q-p]=
'\0';
2395 hex_string[MagickPathExtent];
2406 lines=(size_t) (strlen(text)/CharsPerLine)+1;
2407 textlist=(
char **) AcquireQuantumMemory((
size_t) lines+1UL,
2409 if (textlist == (
char **) NULL)
2410 ThrowFatalException(ResourceLimitFatalError,
"UnableToConvertText");
2412 for (i=0; i < (ssize_t) lines; i++)
2417 textlist[i]=(
char *) AcquireQuantumMemory(2UL*MagickPathExtent,
2418 sizeof(**textlist));
2419 if (textlist[i] == (
char *) NULL)
2420 ThrowFatalException(ResourceLimitFatalError,
"UnableToConvertText");
2421 (void) FormatLocaleString(textlist[i],MagickPathExtent,
"0x%08lx: ",
2422 (
long) (CharsPerLine*i));
2423 q=textlist[i]+strlen(textlist[i]);
2425 for (j=1; j <= (ssize_t) MagickMin(length,CharsPerLine); j++)
2427 (void) FormatLocaleString(hex_string,MagickPathExtent,
"%02x",*(p+j));
2428 (void) CopyMagickString(q,hex_string,MagickPathExtent);
2430 if ((j % 0x04) == 0)
2433 for ( ; j <= CharsPerLine; j++)
2437 if ((j % 0x04) == 0)
2441 for (j=1; j <= (ssize_t) MagickMin(length,CharsPerLine); j++)
2443 if (isprint((
int) ((
unsigned char) *p)) != 0)
2450 textlist[i]=(
char *) ResizeQuantumMemory(textlist[i],(
size_t) (q-
2451 textlist[i]+1),
sizeof(**textlist));
2452 if (textlist[i] == (
char *) NULL)
2453 ThrowFatalException(ResourceLimitFatalError,
"UnableToConvertText");
2456 if (count != (
size_t *) NULL)
2458 textlist[i]=(
char *) NULL;
2484MagickExport StringInfo *StringToStringInfo(
const char *
string)
2489 assert(
string != (
const char *) NULL);
2490 string_info=AcquireStringInfo(strlen(
string));
2491 SetStringInfoDatum(string_info,(
const unsigned char *)
string);
2492 return(string_info);
2518MagickExport
void StripString(
char *message)
2527 assert(message != (
char *) NULL);
2528 if (*message ==
'\0')
2530 length=strlen(message);
2532 while (isspace((
int) ((
unsigned char) *p)) != 0)
2534 if ((*p ==
'\'') || (*p ==
'"'))
2537 while ((isspace((
int) ((
unsigned char) *q)) != 0) && (q > p))
2540 if ((*q ==
'\'') || (*q ==
'"'))
2542 (void) memmove(message,p,(
size_t) (q-p+1));
2543 message[q-p+1]=
'\0';
2544 for (p=message; *p !=
'\0'; p++)
2580MagickExport MagickBooleanType SubstituteString(
char **
string,
2581 const char *search,
const char *replace)
2600 for (p=strchr(*
string,*search); p != (
char *) NULL; p=strchr(p+1,*search))
2602 if (search_extent == 0)
2603 search_extent=strlen(search);
2604 if (strncmp(p,search,search_extent) != 0)
2610 if (replace_extent == 0)
2611 replace_extent=strlen(replace);
2612 if (replace_extent > search_extent)
2617 offset=(ssize_t) (p-(*
string));
2618 extent=strlen(*
string)+replace_extent-search_extent+1;
2619 *
string=(
char *) ResizeQuantumMemory(*
string,
2620 OverAllocateMemory(extent+MaxTextExtent),
sizeof(*p));
2621 if (*
string == (
char *) NULL)
2622 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
2628 if (search_extent != replace_extent)
2629 (void) memmove(p+replace_extent,p+search_extent,
2630 strlen(p+search_extent)+1);
2631 (void) memcpy(p,replace,replace_extent);
2632 p+=(ptrdiff_t) replace_extent-1;