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/property.h"
55 #include "magick/resource_.h"
56 #include "magick/signature-private.h"
57 #include "magick/string_.h"
58 #include "magick/string-private.h"
59 #include "magick/utility-private.h"
64 #define CharsPerLine 0x14
69 #if !defined(MAGICKCORE_HAVE_STRCASECMP) || !defined(MAGICKCORE_HAVE_STRNCASECMP)
70 static const unsigned char
73 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
74 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
75 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
76 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
77 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
78 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
79 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73,
80 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
81 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
82 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
83 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83,
84 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
85 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
86 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
87 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3,
88 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
89 0xc0, 0xe1, 0xe2, 0xe3, 0xe4, 0xc5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
90 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
91 0xf8, 0xf9, 0xfa, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3,
92 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
93 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb,
94 0xfc, 0xfd, 0xfe, 0xff,
126 MagickExport
char *AcquireString(
const char *source)
135 if (source != (
char *) NULL)
136 length+=strlen(source);
137 if (~length < MaxTextExtent)
138 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
139 destination=(
char *) AcquireQuantumMemory(length+MaxTextExtent,
140 sizeof(*destination));
141 if (destination == (
char *) NULL)
142 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
143 if (source != (
char *) NULL)
144 (
void) memcpy(destination,source,length*
sizeof(*destination));
145 destination[length]=
'\0';
172 static StringInfo *AcquireStringInfoContainer()
177 string_info=(
StringInfo *) AcquireMagickMemory(
sizeof(*string_info));
179 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
180 (void) memset(string_info,0,
sizeof(*string_info));
181 string_info->signature=MagickCoreSignature;
185 MagickExport
StringInfo *AcquireStringInfo(
const size_t length)
190 string_info=AcquireStringInfoContainer();
191 string_info->length=length;
192 if (~string_info->length >= (MaxTextExtent-1))
193 string_info->datum=(
unsigned char *) AcquireQuantumMemory(
194 string_info->length+MaxTextExtent,
sizeof(*string_info->datum));
195 if (string_info->datum == (
unsigned char *) NULL)
196 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
197 (void) memset(string_info->datum,0,(length+MagickPathExtent)*
198 sizeof(*string_info->datum));
227 MagickExport
StringInfo *BlobToStringInfo(
const void *blob,
const size_t length)
232 if (~length < MaxTextExtent)
233 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
234 string_info=AcquireStringInfoContainer();
235 string_info->length=length;
236 string_info->datum=(
unsigned char *) AcquireQuantumMemory(length+
237 MaxTextExtent,
sizeof(*string_info->datum));
238 if (string_info->datum == (
unsigned char *) NULL)
240 string_info=DestroyStringInfo(string_info);
243 if (blob != (
const void *) NULL)
244 (void) memcpy(string_info->datum,blob,length);
246 (
void) memset(string_info->datum,0,length*
sizeof(*string_info->datum));
247 (void) memset(string_info->datum+length,0,MagickPathExtent*
248 sizeof(*string_info->datum));
284 MagickExport
char *CloneString(
char **destination,
const char *source)
289 assert(destination != (
char **) NULL);
290 if (source == (
const char *) NULL)
292 if (*destination != (
char *) NULL)
293 *destination=DestroyString(*destination);
294 return(*destination);
296 if (*destination == (
char *) NULL)
298 *destination=AcquireString(source);
299 return(*destination);
301 length=strlen(source);
302 if (~length < MaxTextExtent)
303 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
304 *destination=(
char *) ResizeQuantumMemory(*destination,length+MaxTextExtent,
305 sizeof(**destination));
306 if (*destination == (
char *) NULL)
307 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
309 (void) memcpy(*destination,source,length*
sizeof(**destination));
310 (*destination)[length]=
'\0';
311 return(*destination);
342 assert(string_info->signature == MagickCoreSignature);
343 clone_info=AcquireStringInfo(string_info->length);
344 (void) strcpy(clone_info->path,string_info->path);
345 (void) CloneString(&clone_info->name,string_info->name);
346 if (string_info->length != 0)
347 (void) memcpy(clone_info->datum,string_info->datum,string_info->length+1);
378 MagickExport
int CompareStringInfo(
const StringInfo *target,
385 assert(target->signature == MagickCoreSignature);
387 assert(source->signature == MagickCoreSignature);
388 status=memcmp(target->datum,source->datum,MagickMin(target->length,
392 if (target->length == source->length)
394 return(target->length < source->length ? -1 : 1);
426 MagickExport
size_t ConcatenateMagickString(
char *magick_restrict destination,
427 const char *magick_restrict source,
const size_t length)
441 assert(destination != (
char *) NULL);
442 assert(source != (
const char *) NULL);
447 while ((i-- != 0) && (*q !=
'\0'))
449 count=(size_t) (q-destination);
452 return(count+strlen(p));
463 return(count+(p-source));
492 MagickExport MagickBooleanType ConcatenateString(
493 char **magick_restrict destination,
const char *magick_restrict source)
500 assert(destination != (
char **) NULL);
501 if (source == (
const char *) NULL)
503 if (*destination == (
char *) NULL)
505 *destination=AcquireString(source);
508 destination_length=strlen(*destination);
509 source_length=strlen(source);
510 length=destination_length;
511 if (~length < source_length)
512 ThrowFatalException(ResourceLimitFatalError,
"UnableToConcatenateString");
513 length+=source_length;
514 if (~length < MaxTextExtent)
515 ThrowFatalException(ResourceLimitFatalError,
"UnableToConcatenateString");
516 *destination=(
char *) ResizeQuantumMemory(*destination,
517 OverAllocateMemory(length+MaxTextExtent),
sizeof(**destination));
518 if (*destination == (
char *) NULL)
519 ThrowFatalException(ResourceLimitFatalError,
"UnableToConcatenateString");
520 if (source_length != 0)
521 (void) memcpy((*destination)+destination_length,source,source_length);
522 (*destination)[length]=
'\0';
552 MagickExport
void ConcatenateStringInfo(
StringInfo *string_info,
559 assert(string_info->signature == MagickCoreSignature);
561 length=string_info->length;
562 if (~length < source->length)
563 ThrowFatalException(ResourceLimitFatalError,
"UnableToConcatenateString");
564 length+=source->length;
565 if (~length < MagickPathExtent)
566 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
567 if (string_info->datum == (
unsigned char *) NULL)
568 string_info->datum=(
unsigned char *) AcquireQuantumMemory(length+
569 MagickPathExtent,
sizeof(*string_info->datum));
571 string_info->datum=(
unsigned char *) ResizeQuantumMemory(
572 string_info->datum,OverAllocateMemory(length+MagickPathExtent),
573 sizeof(*string_info->datum));
574 if (string_info->datum == (
unsigned char *) NULL)
575 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
576 (void) memcpy(string_info->datum+string_info->length,source->datum,source->length);
577 string_info->length=length;
604 MagickExport
StringInfo *ConfigureFileToStringInfo(
const char *filename)
624 assert(filename != (
const char *) NULL);
625 file=open_utf8(filename,O_RDONLY | O_BINARY,0);
628 offset=(MagickOffsetType) lseek(file,0,SEEK_END);
629 if ((offset < 0) || (offset != (MagickOffsetType) ((ssize_t) offset)))
634 length=(size_t) offset;
635 string=(
char *) NULL;
636 if (~length >= (MaxTextExtent-1))
637 string=(
char *) AcquireQuantumMemory(length+MaxTextExtent,
sizeof(*
string));
638 if (
string == (
char *) NULL)
643 map=MapBlob(file,ReadMode,0,length);
644 if (map != (
void *) NULL)
646 (void) memcpy(
string,map,length);
647 (void) UnmapBlob(map,length);
657 (void) lseek(file,0,SEEK_SET);
658 for (i=0; i < length; i+=count)
660 count=read(file,
string+i,(
size_t) MagickMin(length-i,(
size_t)
672 string=DestroyString(
string);
678 string_info=AcquireStringInfoContainer();
679 (void) CopyMagickString(string_info->path,filename,MaxTextExtent);
680 string_info->length=length;
681 string_info->datum=(
unsigned char *)
string;
711 MagickExport
char *ConstantString(
const char *source)
720 if (source != (
char *) NULL)
721 length+=strlen(source);
722 destination=(
char *) NULL;
724 destination=(
char *) AcquireQuantumMemory(length+1UL,
sizeof(*destination));
725 if (destination == (
char *) NULL)
726 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
727 if (source != (
char *) NULL)
728 (
void) memcpy(destination,source,length*
sizeof(*destination));
729 destination[length]=
'\0';
764 MagickExport
size_t CopyMagickString(
char *magick_restrict destination,
765 const char *magick_restrict source,
const size_t length)
778 for (n=length; n > 4; n-=4)
780 if (((*q++)=(*p++)) ==
'\0')
781 return((
size_t) (p-source-1));
782 if (((*q++)=(*p++)) ==
'\0')
783 return((
size_t) (p-source-1));
784 if (((*q++)=(*p++)) ==
'\0')
785 return((
size_t) (p-source-1));
786 if (((*q++)=(*p++)) ==
'\0')
787 return((
size_t) (p-source-1));
792 if (((*q++)=(*p++)) ==
'\0')
793 return((
size_t) (p-source-1));
796 return((
size_t) (p-source));
821 MagickExport
char *DestroyString(
char *
string)
823 return((
char *) RelinquishMagickMemory(
string));
851 assert(string_info->signature == MagickCoreSignature);
852 if (string_info->datum != (
unsigned char *) NULL)
853 string_info->datum=(
unsigned char *) RelinquishMagickMemory(
855 if (string_info->name != (
char *) NULL)
856 string_info->name=DestroyString(string_info->name);
857 string_info->signature=(~MagickCoreSignature);
858 string_info=(
StringInfo *) RelinquishMagickMemory(string_info);
884 MagickExport
char **DestroyStringList(
char **list)
889 assert(list != (
char **) NULL);
890 for (i=0; list[i] != (
char *) NULL; i++)
891 list[i]=DestroyString(list[i]);
892 list=(
char **) RelinquishMagickMemory(list);
925 MagickExport
char *EscapeString(
const char *source,
const char escape)
939 assert(source != (
const char *) NULL);
941 for (p=source; *p !=
'\0'; p++)
943 if ((*p ==
'\\') || (*p == escape))
946 ThrowFatalException(ResourceLimitFatalError,
"UnableToEscapeString");
951 destination=(
char *) NULL;
952 if (~length >= (MaxTextExtent-1))
953 destination=(
char *) AcquireQuantumMemory(length+MaxTextExtent,
954 sizeof(*destination));
955 if (destination == (
char *) NULL)
956 ThrowFatalException(ResourceLimitFatalError,
"UnableToEscapeString");
959 for (p=source; *p !=
'\0'; p++)
961 if ((*p ==
'\\') || (*p == escape))
996 MagickExport
char *FileToString(
const char *filename,
const size_t extent,
1002 assert(filename != (
const char *) NULL);
1004 return((
char *) FileToBlob(filename,extent,&length,exception));
1034 MagickExport
StringInfo *FileToStringInfo(
const char *filename,
1040 assert(filename != (
const char *) NULL);
1042 if (IsEventLogging() != MagickFalse)
1043 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",filename);
1044 string_info=AcquireStringInfoContainer();
1045 (void) CopyMagickString(string_info->path,filename,MaxTextExtent);
1046 string_info->datum=FileToBlob(filename,extent,&string_info->length,exception);
1047 if (string_info->datum == (
unsigned char *) NULL)
1049 string_info=DestroyStringInfo(string_info);
1052 return(string_info);
1084 MagickExport ssize_t FormatMagickSize(
const MagickSizeType size,
1085 const MagickBooleanType bi,
char *format)
1107 "",
"Ki",
"Mi",
"Gi",
"Ti",
"Pi",
"Ei",
"Zi",
"Yi", (
char *) NULL
1109 *traditional_units[] =
1111 "",
"K",
"M",
"G",
"T",
"P",
"E",
"Z",
"Y", (
char *) NULL
1115 units=traditional_units;
1116 if (bi != MagickFalse)
1121 #if defined(_MSC_VER) && (_MSC_VER == 1200)
1122 length=(double) ((MagickOffsetType) size);
1124 length=(double) size;
1126 (void) FormatLocaleString(p,MaxTextExtent,
"%.*g",GetMagickPrecision(),
1128 (void) FormatLocaleString(q,MaxTextExtent,
"%.20g",length);
1129 if (strtod(p,(
char **) NULL) == strtod(q,(
char **) NULL))
1131 count=FormatLocaleString(format,MaxTextExtent,
"%.20g%sB",length,units[0]);
1134 for (i=0; (length >= bytes) && (units[i+1] != (
const char *) NULL); i++)
1136 count=FormatLocaleString(format,MaxTextExtent,
"%.*g%sB",GetMagickPrecision(),
1164 MagickExport
char *GetEnvironmentValue(
const char *name)
1169 environment=getenv(name);
1170 if (environment == (
const char *) NULL)
1171 return((
char *) NULL);
1172 return(ConstantString(environment));
1197 MagickExport
unsigned char *GetStringInfoDatum(
const StringInfo *string_info)
1200 assert(string_info->signature == MagickCoreSignature);
1201 return(string_info->datum);
1226 MagickExport
size_t GetStringInfoLength(
const StringInfo *string_info)
1229 assert(string_info->signature == MagickCoreSignature);
1230 return(string_info->length);
1255 MagickExport
const char *GetStringInfoName(
const StringInfo *string_info)
1258 assert(string_info->signature == MagickCoreSignature);
1259 return(string_info->name);
1284 MagickExport
const char *GetStringInfoPath(
const StringInfo *string_info)
1287 assert(string_info->signature == MagickCoreSignature);
1288 return(string_info->path);
1318 MagickExport
double InterpretSiPrefixValue(
const char *magick_restrict
string,
1319 char **magick_restrict sentinal)
1327 value=InterpretLocaleValue(
string,&q);
1330 if ((*q >=
'E') && (*q <=
'z'))
1335 switch ((
int) ((
unsigned char) *q))
1337 case 'y': e=(-24.0);
break;
1338 case 'z': e=(-21.0);
break;
1339 case 'a': e=(-18.0);
break;
1340 case 'f': e=(-15.0);
break;
1341 case 'p': e=(-12.0);
break;
1342 case 'n': e=(-9.0);
break;
1343 case 'u': e=(-6.0);
break;
1344 case 'm': e=(-3.0);
break;
1345 case 'c': e=(-2.0);
break;
1346 case 'd': e=(-1.0);
break;
1347 case 'h': e=2.0;
break;
1348 case 'k': e=3.0;
break;
1349 case 'K': e=3.0;
break;
1350 case 'M': e=6.0;
break;
1351 case 'G': e=9.0;
break;
1352 case 'T': e=12.0;
break;
1353 case 'P': e=15.0;
break;
1354 case 'E': e=18.0;
break;
1355 case 'Z': e=21.0;
break;
1356 case 'Y': e=24.0;
break;
1357 default: e=0.0;
break;
1359 if (e >= MagickEpsilon)
1363 value*=pow(2.0,e/0.3);
1373 if ((*q ==
'B') || (*q ==
'P'))
1376 if (sentinal != (
char **) NULL)
1407 MagickExport MagickBooleanType IsStringTrue(
const char *value)
1409 if (value == (
const char *) NULL)
1410 return(MagickFalse);
1411 if (LocaleCompare(value,
"true") == 0)
1413 if (LocaleCompare(value,
"on") == 0)
1415 if (LocaleCompare(value,
"yes") == 0)
1417 if (LocaleCompare(value,
"1") == 0)
1419 return(MagickFalse);
1449 MagickExport MagickBooleanType IsStringNotFalse(
const char *value)
1451 if (value == (
const char *) NULL)
1453 if (LocaleCompare(value,
"false") == 0)
1454 return(MagickFalse);
1455 if (LocaleCompare(value,
"off") == 0)
1456 return(MagickFalse);
1457 if (LocaleCompare(value,
"no") == 0)
1458 return(MagickFalse);
1459 if (LocaleCompare(value,
"0") == 0)
1460 return(MagickFalse);
1491 MagickExport
void PrintStringInfo(FILE *file,
const char *
id,
1501 assert(
id != (
const char *) NULL);
1503 assert(string_info->signature == MagickCoreSignature);
1504 p=(
char *) string_info->datum;
1505 for (i=0; i < string_info->length; i++)
1507 if (((
int) ((
unsigned char) *p) < 32) &&
1508 (isspace((
int) ((
unsigned char) *p)) == 0))
1512 (void) FormatLocaleFile(file,
"%s(%.20g):\n",
id,(
double) string_info->length);
1513 if (i == string_info->length)
1515 for (i=0; i < string_info->length; i++)
1516 (
void) fputc(string_info->datum[i],file);
1517 (void) fputc(
'\n',file);
1523 p=(
char *) string_info->datum;
1524 for (i=0; i < string_info->length; i+=CharsPerLine)
1526 (void) FormatLocaleFile(file,
"0x%08lx: ",(
unsigned long) (CharsPerLine*i));
1527 for (j=1; j <= MagickMin(string_info->length-i,CharsPerLine); j++)
1529 (void) FormatLocaleFile(file,
"%02lx",(
unsigned long) (*(p+j)) & 0xff);
1530 if ((j % 0x04) == 0)
1531 (
void) fputc(
' ',file);
1533 for ( ; j <= CharsPerLine; j++)
1535 (void) fputc(
' ',file);
1536 (void) fputc(
' ',file);
1537 if ((j % 0x04) == 0)
1538 (
void) fputc(
' ',file);
1540 (void) fputc(
' ',file);
1541 for (j=1; j <= MagickMin(string_info->length-i,CharsPerLine); j++)
1543 if (isprint((
int) ((
unsigned char) *p)) != 0)
1544 (
void) fputc(*p,file);
1546 (
void) fputc(
'-',file);
1549 (void) fputc(
'\n',file);
1575 MagickExport
void ResetStringInfo(
StringInfo *string_info)
1578 assert(string_info->signature == MagickCoreSignature);
1579 (void) memset(string_info->datum,0,string_info->length);
1607 MagickExport
char *SanitizeString(
const char *source)
1620 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 "
1621 "$-_.+!*'(),{}|\\^~[]`\"><#%;/?:@&=";
1623 sanitize_source=AcquireString(source);
1625 q=sanitize_source+strlen(sanitize_source);
1626 for (p+=strspn(p,allowlist); p != q; p+=strspn(p,allowlist))
1628 return(sanitize_source);
1655 MagickExport
void SetStringInfo(
StringInfo *string_info,
1659 assert(string_info->signature == MagickCoreSignature);
1661 assert(source->signature == MagickCoreSignature);
1662 if (string_info->length == 0)
1664 (void) memset(string_info->datum,0,string_info->length);
1665 (void) memcpy(string_info->datum,source->datum,MagickMin(string_info->length,
1695 MagickExport
void SetStringInfoDatum(
StringInfo *string_info,
1696 const unsigned char *source)
1699 assert(string_info->signature == MagickCoreSignature);
1700 if (string_info->length != 0)
1701 (void) memcpy(string_info->datum,source,string_info->length);
1728 MagickExport
void SetStringInfoLength(
StringInfo *string_info,
1729 const size_t length)
1732 assert(string_info->signature == MagickCoreSignature);
1733 if (string_info->length == length)
1735 if (~length < MaxTextExtent)
1736 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
1737 string_info->length=length;
1738 if (string_info->datum == (
unsigned char *) NULL)
1739 string_info->datum=(
unsigned char *) AcquireQuantumMemory(length+
1740 MaxTextExtent,
sizeof(*string_info->datum));
1742 string_info->datum=(
unsigned char *) ResizeQuantumMemory(string_info->datum,
1743 length+MaxTextExtent,
sizeof(*string_info->datum));
1744 if (string_info->datum == (
unsigned char *) NULL)
1745 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
1772 MagickExport
void SetStringInfoName(
StringInfo *string_info,
const char *name)
1775 assert(string_info->signature == MagickCoreSignature);
1776 assert(name != (
const char *) NULL);
1777 string_info->name=ConstantString(name);
1804 MagickExport
void SetStringInfoPath(
StringInfo *string_info,
const char *path)
1807 assert(string_info->signature == MagickCoreSignature);
1808 assert(path != (
const char *) NULL);
1809 (void) CopyMagickString(string_info->path,path,MaxTextExtent);
1835 const size_t offset)
1841 assert(string_info->signature == MagickCoreSignature);
1842 if (offset > string_info->length)
1844 split_info=AcquireStringInfo(offset);
1845 SetStringInfo(split_info,string_info);
1846 (void) memmove(string_info->datum,string_info->datum+offset,
1847 string_info->length-offset+MaxTextExtent);
1848 SetStringInfoLength(string_info,string_info->length-offset);
1874 MagickExport
char *StringInfoToString(
const StringInfo *string_info)
1882 string=(
char *) NULL;
1883 length=string_info->length;
1884 if (~length >= (MaxTextExtent-1))
1885 string=(
char *) AcquireQuantumMemory(length+MaxTextExtent,
sizeof(*
string));
1886 if (
string == (
char *) NULL)
1887 return((
char *) NULL);
1888 (void) memcpy(
string,(
char *) string_info->datum,length*
sizeof(*string));
1889 string[length]=
'\0';
1915 MagickExport
char *StringInfoToHexString(
const StringInfo *string_info)
1935 length=string_info->length;
1936 if (~length < MaxTextExtent)
1937 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
1938 string=(
char *) AcquireQuantumMemory(length+MaxTextExtent,2*
sizeof(*
string));
1939 if (
string == (
char *) NULL)
1940 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
1957 p=string_info->datum;
1958 q=(
unsigned char *)
string;
1959 for (i=0; i < (ssize_t) string_info->length; i++)
1961 *q++=hex_digits[(*p >> 4) & 0x0f];
1962 *q++=hex_digits[*p & 0x0f];
2003 MagickExport
char **StringToArgv(
const char *text,
int *argc)
2016 if (text == (
char *) NULL)
2017 return((
char **) NULL);
2021 for (p=text; *p !=
'\0'; )
2023 while (isspace((
int) ((
unsigned char) *p)) != 0)
2029 for (p++; (*p !=
'"') && (*p !=
'\0'); p++) ;
2031 for (p++; (*p !=
'\'') && (*p !=
'\0'); p++) ;
2032 while ((isspace((
int) ((
unsigned char) *p)) == 0) && (*p !=
'\0'))
2036 argv=(
char **) AcquireQuantumMemory((
size_t) (*argc+1UL),
sizeof(*argv));
2037 if (argv == (
char **) NULL)
2038 ThrowFatalException(ResourceLimitFatalError,
"UnableToConvertStringToARGV");
2042 argv[0]=AcquireString(
"magick");
2044 for (i=1; i < (ssize_t) *argc; i++)
2046 while (isspace((
int) ((
unsigned char) *p)) != 0)
2052 for (q++; (*q !=
'"') && (*q !=
'\0'); q++) ;
2058 for (q++; (*q !=
'\'') && (*q !=
'\0'); q++) ;
2061 while ((isspace((
int) ((
unsigned char) *q)) == 0) && (*q !=
'\0'))
2063 argv[i]=(
char *) AcquireQuantumMemory((
size_t) (q-p)+MaxTextExtent,
2065 if (argv[i] == (
char *) NULL)
2067 for (i--; i >= 0; i--)
2068 argv[i]=DestroyString(argv[i]);
2069 argv=(
char **) RelinquishMagickMemory(argv);
2070 ThrowFatalException(ResourceLimitFatalError,
2071 "UnableToConvertStringToARGV");
2073 (void) memcpy(argv[i],p,(
size_t) (q-p));
2076 while ((isspace((
int) ((
unsigned char) *p)) == 0) && (*p !=
'\0'))
2079 argv[i]=(
char *) NULL;
2118 MagickExport
double *StringToArrayOfDoubles(
const char *
string,ssize_t *count,
2137 assert(exception->signature == MagickCoreSignature);
2139 if (
string == (
char *) NULL)
2140 return((
double *) NULL);
2145 (void) StringToDouble(p,&q);
2147 return((
double *) NULL);
2150 while (isspace((
int) ((
unsigned char) *p)) != 0)
2154 while (isspace((
int) ((
unsigned char) *p)) != 0)
2161 array=(
double *) AcquireQuantumMemory((
size_t) i,
sizeof(*array));
2162 if (array == (
double *) NULL)
2164 (void) ThrowMagickException(exception,GetMagickModule(),
2165 ResourceLimitError,
"MemoryAllocationFailed",
"`%s'",
"");
2166 return((
double *) NULL);
2173 while ((*p !=
'\0') && (i < *count))
2175 array[i++]=StringToDouble(p,&q);
2177 while ((isspace((
int) ((
unsigned char) *p)) != 0) || (*p ==
','))
2217 MagickExport
char *StringToken(
const char *delimiters,
char **
string)
2233 if (p == (
char *) NULL)
2234 return((
char *) NULL);
2252 }
while (d !=
'\0');
2280 MagickExport
char **StringToList(
const char *text)
2282 return(StringToStrings(text,(
size_t *) NULL));
2311 MagickExport
char **StringToStrings(
const char *text,
size_t *count)
2325 if (text == (
char *) NULL)
2327 if (count != (
size_t *) NULL)
2329 return((
char **) NULL);
2331 for (p=text; *p !=
'\0'; p++)
2332 if (((
int) ((
unsigned char) *p) < 32) &&
2333 (isspace((
int) ((
unsigned char) *p)) == 0))
2344 for (p=text; *p !=
'\0'; p++)
2347 textlist=(
char **) AcquireQuantumMemory((
size_t) lines+1UL,
2349 if (textlist == (
char **) NULL)
2350 ThrowFatalException(ResourceLimitFatalError,
"UnableToConvertText");
2352 for (i=0; i < (ssize_t) lines; i++)
2354 for (q=p; *q !=
'\0'; q++)
2355 if ((*q ==
'\r') || (*q ==
'\n'))
2357 textlist[i]=(
char *) AcquireQuantumMemory((
size_t) (q-p)+1,
2358 sizeof(**textlist));
2359 if (textlist[i] == (
char *) NULL)
2360 ThrowFatalException(ResourceLimitFatalError,
"UnableToConvertText");
2361 (void) memcpy(textlist[i],p,(
size_t) (q-p));
2362 textlist[i][q-p]=
'\0';
2371 hex_string[MagickPathExtent];
2382 lines=(size_t) (strlen(text)/CharsPerLine)+1;
2383 textlist=(
char **) AcquireQuantumMemory((
size_t) lines+1UL,
2385 if (textlist == (
char **) NULL)
2386 ThrowFatalException(ResourceLimitFatalError,
"UnableToConvertText");
2388 for (i=0; i < (ssize_t) lines; i++)
2393 textlist[i]=(
char *) AcquireQuantumMemory(2UL*MagickPathExtent,
2394 sizeof(**textlist));
2395 if (textlist[i] == (
char *) NULL)
2396 ThrowFatalException(ResourceLimitFatalError,
"UnableToConvertText");
2397 (void) FormatLocaleString(textlist[i],MagickPathExtent,
"0x%08lx: ",
2398 (
long) (CharsPerLine*i));
2399 q=textlist[i]+strlen(textlist[i]);
2401 for (j=1; j <= (ssize_t) MagickMin(length,CharsPerLine); j++)
2403 (void) FormatLocaleString(hex_string,MagickPathExtent,
"%02x",*(p+j));
2404 (void) CopyMagickString(q,hex_string,MagickPathExtent);
2406 if ((j % 0x04) == 0)
2409 for ( ; j <= CharsPerLine; j++)
2413 if ((j % 0x04) == 0)
2417 for (j=1; j <= (ssize_t) MagickMin(length,CharsPerLine); j++)
2419 if (isprint((
int) ((
unsigned char) *p)) != 0)
2426 textlist[i]=(
char *) ResizeQuantumMemory(textlist[i],(
size_t) (q-
2427 textlist[i]+1),
sizeof(**textlist));
2428 if (textlist[i] == (
char *) NULL)
2429 ThrowFatalException(ResourceLimitFatalError,
"UnableToConvertText");
2432 if (count != (
size_t *) NULL)
2434 textlist[i]=(
char *) NULL;
2460 MagickExport
StringInfo *StringToStringInfo(
const char *
string)
2465 assert(
string != (
const char *) NULL);
2466 string_info=AcquireStringInfo(strlen(
string));
2467 SetStringInfoDatum(string_info,(
const unsigned char *)
string);
2468 return(string_info);
2494 MagickExport
void StripString(
char *message)
2503 assert(message != (
char *) NULL);
2504 if (*message ==
'\0')
2506 length=strlen(message);
2508 while (isspace((
int) ((
unsigned char) *p)) != 0)
2510 if ((*p ==
'\'') || (*p ==
'"'))
2513 while ((isspace((
int) ((
unsigned char) *q)) != 0) && (q > p))
2516 if ((*q ==
'\'') || (*q ==
'"'))
2518 (void) memmove(message,p,(
size_t) (q-p+1));
2519 message[q-p+1]=
'\0';
2520 for (p=message; *p !=
'\0'; p++)
2556 MagickExport MagickBooleanType SubstituteString(
char **
string,
2557 const char *search,
const char *replace)
2576 for (p=strchr(*
string,*search); p != (
char *) NULL; p=strchr(p+1,*search))
2578 if (search_extent == 0)
2579 search_extent=strlen(search);
2580 if (strncmp(p,search,search_extent) != 0)
2586 if (replace_extent == 0)
2587 replace_extent=strlen(replace);
2588 if (replace_extent > search_extent)
2593 offset=(ssize_t) (p-(*
string));
2594 extent=strlen(*
string)+replace_extent-search_extent+1;
2595 *
string=(
char *) ResizeQuantumMemory(*
string,
2596 OverAllocateMemory(extent+MaxTextExtent),
sizeof(*p));
2597 if (*
string == (
char *) NULL)
2598 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
2604 if (search_extent != replace_extent)
2605 (void) memmove(p+replace_extent,p+search_extent,
2606 strlen(p+search_extent)+1);
2607 (void) memcpy(p,replace,replace_extent);
2608 p+=replace_extent-1;