42#include "MagickCore/studio.h"
43#include "MagickCore/blob.h"
44#include "MagickCore/blob-private.h"
45#include "MagickCore/exception.h"
46#include "MagickCore/exception-private.h"
47#include "MagickCore/image-private.h"
48#include "MagickCore/list.h"
49#include "MagickCore/locale_.h"
50#include "MagickCore/log.h"
51#include "MagickCore/memory_.h"
52#include "MagickCore/memory-private.h"
53#include "MagickCore/nt-base-private.h"
54#include "MagickCore/property.h"
55#include "MagickCore/policy.h"
56#include "MagickCore/resource_.h"
57#include "MagickCore/resource-private.h"
58#include "MagickCore/signature-private.h"
59#include "MagickCore/string_.h"
60#include "MagickCore/string-private.h"
61#include "MagickCore/utility-private.h"
66#define CharsPerLine 0x14
96MagickExport
char *AcquireString(
const char *source)
105 if (source != (
char *) NULL)
106 length+=strlen(source);
107 if (~length < MagickPathExtent)
108 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
109 destination=(
char *) AcquireQuantumMemory(length+MagickPathExtent,
110 sizeof(*destination));
111 if (destination == (
char *) NULL)
112 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
113 if (source != (
char *) NULL)
114 (void) memcpy(destination,source,length*
sizeof(*destination));
115 destination[length]=
'\0';
142static StringInfo *AcquireStringInfoContainer(
void)
147 string_info=(StringInfo *) AcquireCriticalMemory(
sizeof(*string_info));
148 (void) memset(string_info,0,
sizeof(*string_info));
149 string_info->signature=MagickCoreSignature;
153MagickExport StringInfo *AcquireStringInfo(
const size_t length)
158 string_info=AcquireStringInfoContainer();
159 string_info->length=length;
160 if (~string_info->length >= (MagickPathExtent-1))
161 string_info->datum=(
unsigned char *) AcquireQuantumMemory(
162 string_info->length+MagickPathExtent,
sizeof(*string_info->datum));
163 if (string_info->datum == (
unsigned char *) NULL)
164 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
165 (void) memset(string_info->datum,0,(length+MagickPathExtent)*
166 sizeof(*string_info->datum));
195MagickExport StringInfo *BlobToStringInfo(
const void *blob,
const size_t length)
200 if (~length < MagickPathExtent)
201 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
202 string_info=AcquireStringInfoContainer();
203 string_info->length=length;
204 string_info->datum=(
unsigned char *) AcquireQuantumMemory(length+
205 MagickPathExtent,
sizeof(*string_info->datum));
206 if (string_info->datum == (
unsigned char *) NULL)
208 string_info=DestroyStringInfo(string_info);
209 return((StringInfo *) NULL);
211 if (blob != (
const void *) NULL)
212 (void) memcpy(string_info->datum,blob,length);
214 (
void) memset(string_info->datum,0,length*
sizeof(*string_info->datum));
215 (void) memset(string_info->datum+length,0,MagickPathExtent*
216 sizeof(*string_info->datum));
252MagickExport
char *CloneString(
char **destination,
const char *source)
257 assert(destination != (
char **) NULL);
258 if (source == (
const char *) NULL)
260 if (*destination != (
char *) NULL)
261 *destination=DestroyString(*destination);
262 return(*destination);
264 if (*destination == (
char *) NULL)
266 *destination=AcquireString(source);
267 return(*destination);
269 length=strlen(source);
270 if (~length < MagickPathExtent)
271 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
272 *destination=(
char *) ResizeQuantumMemory(*destination,length+
273 MagickPathExtent,
sizeof(**destination));
274 if (*destination == (
char *) NULL)
275 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
277 (void) memcpy(*destination,source,length*
sizeof(**destination));
278 (*destination)[length]=
'\0';
279 return(*destination);
304MagickExport StringInfo *CloneStringInfo(
const StringInfo *string_info)
309 assert(string_info != (StringInfo *) NULL);
310 assert(string_info->signature == MagickCoreSignature);
311 clone_info=AcquireStringInfo(string_info->length);
312 (void) CloneString(&clone_info->path,string_info->path);
313 (void) CloneString(&clone_info->name,string_info->name);
314 if (string_info->length != 0)
315 (void) memcpy(clone_info->datum,string_info->datum,string_info->length+1);
346MagickExport
int CompareStringInfo(
const StringInfo *target,
347 const StringInfo *source)
352 assert(target != (StringInfo *) NULL);
353 assert(target->signature == MagickCoreSignature);
354 assert(source != (StringInfo *) NULL);
355 assert(source->signature == MagickCoreSignature);
356 status=memcmp(target->datum,source->datum,MagickMin(target->length,
360 if (target->length == source->length)
362 return(target->length < source->length ? -1 : 1);
394MagickExport
size_t ConcatenateMagickString(
char *magick_restrict destination,
395 const char *magick_restrict source,
const size_t length)
407 assert(destination != (
char *) NULL);
408 assert(source != (
const char *) NULL);
413 while ((i-- != 0) && (*q !=
'\0'))
415 count=(size_t) (q-destination);
418 return(count+strlen(p));
429 return(count+(
size_t) (p-source));
458MagickExport MagickBooleanType ConcatenateString(
459 char **magick_restrict destination,
const char *magick_restrict source)
466 assert(destination != (
char **) NULL);
467 if (source == (
const char *) NULL)
469 if (*destination == (
char *) NULL)
471 *destination=AcquireString(source);
474 destination_length=strlen(*destination);
475 source_length=strlen(source);
476 length=destination_length;
477 if (~length < source_length)
478 ThrowFatalException(ResourceLimitFatalError,
"UnableToConcatenateString");
479 length+=source_length;
480 if (~length < MagickPathExtent)
481 ThrowFatalException(ResourceLimitFatalError,
"UnableToConcatenateString");
482 *destination=(
char *) ResizeQuantumMemory(*destination,
483 OverAllocateMemory(length+MagickPathExtent),
sizeof(**destination));
484 if (*destination == (
char *) NULL)
485 ThrowFatalException(ResourceLimitFatalError,
"UnableToConcatenateString");
486 if (source_length != 0)
487 (void) memcpy((*destination)+destination_length,source,source_length);
488 (*destination)[length]=
'\0';
518MagickExport
void ConcatenateStringInfo(StringInfo *string_info,
519 const StringInfo *source)
524 assert(string_info != (StringInfo *) NULL);
525 assert(string_info->signature == MagickCoreSignature);
526 assert(source != (
const StringInfo *) NULL);
527 length=string_info->length;
528 if (~length < source->length)
529 ThrowFatalException(ResourceLimitFatalError,
"UnableToConcatenateString");
530 length+=source->length;
531 if (~length < MagickPathExtent)
532 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
533 if (string_info->datum == (
unsigned char *) NULL)
534 string_info->datum=(
unsigned char *) AcquireQuantumMemory(length+
535 MagickPathExtent,
sizeof(*string_info->datum));
537 string_info->datum=(
unsigned char *) ResizeQuantumMemory(
538 string_info->datum,OverAllocateMemory(length+MagickPathExtent),
539 sizeof(*string_info->datum));
540 if (string_info->datum == (
unsigned char *) NULL)
541 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
542 (void) memcpy(string_info->datum+string_info->length,source->datum,
544 string_info->length=length;
571MagickExport StringInfo *ConfigureFileToStringInfo(
const char *filename)
591 assert(filename != (
const char *) NULL);
592 file=open_utf8(filename,O_RDONLY | O_BINARY,0);
594 return((StringInfo *) NULL);
595 offset=(MagickOffsetType) lseek(file,0,SEEK_END);
596 if ((offset < 0) || (offset != (MagickOffsetType) ((ssize_t) offset)))
598 file=close_utf8(file)-1;
599 return((StringInfo *) NULL);
601 length=(size_t) offset;
602 string=(
char *) NULL;
603 if (~length >= (MagickPathExtent-1))
604 string=(
char *) AcquireQuantumMemory(length+MagickPathExtent,
606 if (
string == (
char *) NULL)
608 file=close_utf8(file)-1;
609 return((StringInfo *) NULL);
611 map=MapBlob(file,ReadMode,0,length);
612 if (map != (
void *) NULL)
614 (void) memcpy(
string,map,length);
615 (void) UnmapBlob(map,length);
625 (void) lseek(file,0,SEEK_SET);
626 for (i=0; i < length; i+=(size_t) count)
628 count=read(file,
string+i,(
size_t) MagickMin(length-i,(
size_t)
629 MagickMaxBufferExtent));
639 file=close_utf8(file)-1;
640 string=DestroyString(
string);
641 return((StringInfo *) NULL);
645 file=close_utf8(file)-1;
646 string_info=AcquireStringInfoContainer();
647 string_info->path=ConstantString(filename);
648 string_info->length=length;
649 string_info->datum=(
unsigned char *)
string;
679MagickExport
char *ConstantString(
const char *source)
688 if (source != (
char *) NULL)
689 length+=strlen(source);
690 destination=(
char *) NULL;
692 destination=(
char *) AcquireQuantumMemory(length+1UL,
sizeof(*destination));
693 if (destination == (
char *) NULL)
694 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
695 if (source != (
char *) NULL)
696 (void) memcpy(destination,source,length*
sizeof(*destination));
697 destination[length]=
'\0';
732MagickExport
size_t CopyMagickString(
char *magick_restrict destination,
733 const char *magick_restrict source,
const size_t length)
746 for (n=length; n > 4; n-=4)
748 if (((*q++)=(*p++)) ==
'\0')
749 return((
size_t) (p-source-1));
750 if (((*q++)=(*p++)) ==
'\0')
751 return((
size_t) (p-source-1));
752 if (((*q++)=(*p++)) ==
'\0')
753 return((
size_t) (p-source-1));
754 if (((*q++)=(*p++)) ==
'\0')
755 return((
size_t) (p-source-1));
760 if (((*q++)=(*p++)) ==
'\0')
761 return((
size_t) (p-source-1));
764 return((
size_t) (p-source));
789MagickExport
char *DestroyString(
char *
string)
791 return((
char *) RelinquishMagickMemory(
string));
816MagickExport StringInfo *DestroyStringInfo(StringInfo *string_info)
818 assert(string_info != (StringInfo *) NULL);
819 assert(string_info->signature == MagickCoreSignature);
820 if (string_info->datum != (
unsigned char *) NULL)
821 string_info->datum=(
unsigned char *) RelinquishMagickMemory(
823 if (string_info->name != (
char *) NULL)
824 string_info->name=DestroyString(string_info->name);
825 if (string_info->path != (
char *) NULL)
826 string_info->path=DestroyString(string_info->path);
827 string_info->signature=(~MagickCoreSignature);
828 string_info=(StringInfo *) RelinquishMagickMemory(string_info);
854MagickExport
char **DestroyStringList(
char **list)
859 assert(list != (
char **) NULL);
860 for (i=0; list[i] != (
char *) NULL; i++)
861 list[i]=DestroyString(list[i]);
862 list=(
char **) RelinquishMagickMemory(list);
895MagickExport
char *EscapeString(
const char *source,
const char escape)
909 assert(source != (
const char *) NULL);
911 for (p=source; *p !=
'\0'; p++)
913 if ((*p ==
'\\') || (*p == escape))
916 ThrowFatalException(ResourceLimitFatalError,
"UnableToEscapeString");
921 destination=(
char *) NULL;
922 if (~length >= (MagickPathExtent-1))
923 destination=(
char *) AcquireQuantumMemory(length+MagickPathExtent,
924 sizeof(*destination));
925 if (destination == (
char *) NULL)
926 ThrowFatalException(ResourceLimitFatalError,
"UnableToEscapeString");
929 for (p=source; *p !=
'\0'; p++)
931 if ((*p ==
'\\') || (*p == escape))
966MagickExport
char *FileToString(
const char *filename,
const size_t extent,
967 ExceptionInfo *exception)
975 assert(filename != (
const char *) NULL);
976 assert(exception != (ExceptionInfo *) NULL);
977 if (IsEventLogging() != MagickFalse)
978 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",filename);
980 if ((*filename ==
'@') && (strlen(filename) > 1))
985 status=IsRightsAuthorized(PathPolicyDomain,ReadPolicyRights,filename);
986 if (status == MagickFalse)
987 ThrowPolicyException(filename,(
char *) NULL);
990 return((
char *) FileToBlob(p,extent,&length,exception));
1020MagickExport StringInfo *FileToStringInfo(
const char *filename,
1021 const size_t extent,ExceptionInfo *exception)
1026 assert(filename != (
const char *) NULL);
1027 assert(exception != (ExceptionInfo *) NULL);
1028 if (IsEventLogging() != MagickFalse)
1029 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",filename);
1030 string_info=AcquireStringInfoContainer();
1031 string_info->path=ConstantString(filename);
1032 string_info->datum=(
unsigned char *) FileToBlob(filename,extent,
1033 &string_info->length,exception);
1034 if (string_info->datum == (
unsigned char *) NULL)
1036 string_info=DestroyStringInfo(string_info);
1037 return((StringInfo *) NULL);
1039 return(string_info);
1075MagickExport ssize_t FormatMagickSize(
const MagickSizeType size,
1076 const MagickBooleanType bi,
const char *suffix,
const size_t length,
1095 "",
"Ki",
"Mi",
"Gi",
"Ti",
"Pi",
"Ei",
"Zi",
"Yi",
"Ri",
"Qi", (
char *) NULL
1097 *traditional_units[] =
1099 "",
"K",
"M",
"G",
"T",
"P",
"E",
"Z",
"Y",
"R",
"Q", (
char *) NULL
1103 units=traditional_units;
1104 if (bi != MagickFalse)
1109 extent=(double) size;
1110 (void) FormatLocaleString(format,MagickFormatExtent,
"%.*g",
1111 GetMagickPrecision(),extent);
1112 if (strstr(format,
"e+") == (
char *) NULL)
1114 if (suffix == (
const char *) NULL)
1115 count=FormatLocaleString(format,length,
"%.20g%s",extent,units[0]);
1117 count=FormatLocaleString(format,length,
"%.20g%s%s",extent,units[0],
1121 for (i=0; (extent >= bytes) && (units[i+1] != (
const char *) NULL); i++)
1123 if (suffix == (
const char *) NULL)
1124 count=FormatLocaleString(format,length,
"%.*g%s",GetMagickPrecision(),
1127 count=FormatLocaleString(format,length,
"%.*g%s%s",GetMagickPrecision(),
1128 extent,units[i],suffix);
1155MagickExport
char *GetEnvironmentValue(
const char *name)
1157#if defined(MAGICKCORE_WINDOWS_SUPPORT)
1158 return(NTGetEnvironmentValue(name));
1163 environment=getenv(name);
1164 if (environment == (
const char *) NULL)
1165 return((
char *) NULL);
1166 return(ConstantString(environment));
1192MagickExport
unsigned char *GetStringInfoDatum(
const StringInfo *string_info)
1194 assert(string_info != (StringInfo *) NULL);
1195 assert(string_info->signature == MagickCoreSignature);
1196 return(string_info->datum);
1221MagickExport
size_t GetStringInfoLength(
const StringInfo *string_info)
1223 assert(string_info != (StringInfo *) NULL);
1224 assert(string_info->signature == MagickCoreSignature);
1225 return(string_info->length);
1250MagickExport
const char *GetStringInfoName(
const StringInfo *string_info)
1252 assert(string_info != (StringInfo *) NULL);
1253 assert(string_info->signature == MagickCoreSignature);
1254 return(string_info->name);
1279MagickExport
const char *GetStringInfoPath(
const StringInfo *string_info)
1281 assert(string_info != (StringInfo *) NULL);
1282 assert(string_info->signature == MagickCoreSignature);
1283 return(string_info->path);
1313MagickExport
double InterpretSiPrefixValue(
const char *magick_restrict
string,
1314 char **magick_restrict sentinel)
1322 value=InterpretLocaleValue(
string,&q);
1325 if ((*q >=
'E') && (*q <=
'z'))
1330 switch ((
int) ((
unsigned char) *q))
1332 case 'q': e=(-30.0);
break;
1333 case 'r': e=(-27.0);
break;
1334 case 'y': e=(-24.0);
break;
1335 case 'z': e=(-21.0);
break;
1336 case 'a': e=(-18.0);
break;
1337 case 'f': e=(-15.0);
break;
1338 case 'p': e=(-12.0);
break;
1339 case 'n': e=(-9.0);
break;
1340 case 'u': e=(-6.0);
break;
1341 case 'm': e=(-3.0);
break;
1342 case 'c': e=(-2.0);
break;
1343 case 'd': e=(-1.0);
break;
1344 case 'h': e=2.0;
break;
1345 case 'k': e=3.0;
break;
1346 case 'K': e=3.0;
break;
1347 case 'M': e=6.0;
break;
1348 case 'G': e=9.0;
break;
1349 case 'T': e=12.0;
break;
1350 case 'P': e=15.0;
break;
1351 case 'E': e=18.0;
break;
1352 case 'Z': e=21.0;
break;
1353 case 'Y': e=24.0;
break;
1354 case 'R': e=27.0;
break;
1355 case 'Q': e=30.0;
break;
1356 default: e=0.0;
break;
1358 if (e >= MagickEpsilon)
1362 value*=pow(2.0,e/0.3);
1372 if ((*q ==
'B') || (*q ==
'P'))
1375 if (sentinel != (
char **) NULL)
1406MagickExport MagickBooleanType IsStringTrue(
const char *value)
1408 if (value == (
const char *) NULL)
1409 return(MagickFalse);
1410 if (LocaleCompare(value,
"true") == 0)
1412 if (LocaleCompare(value,
"on") == 0)
1414 if (LocaleCompare(value,
"yes") == 0)
1416 if (LocaleCompare(value,
"1") == 0)
1418 return(MagickFalse);
1447MagickExport MagickBooleanType IsStringFalse(
const char *value)
1449 if (value == (
const char *) NULL)
1450 return(MagickFalse);
1451 if (LocaleCompare(value,
"false") == 0)
1453 if (LocaleCompare(value,
"off") == 0)
1455 if (LocaleCompare(value,
"no") == 0)
1457 if (LocaleCompare(value,
"0") == 0)
1459 return(MagickFalse);
1489MagickExport
void PrintStringInfo(FILE *file,
const char *
id,
1490 const StringInfo *string_info)
1502 assert(
id != (
const char *) NULL);
1503 assert(string_info != (StringInfo *) NULL);
1504 assert(string_info->signature == MagickCoreSignature);
1505 p=(
const unsigned char *) string_info->datum;
1506 for (i=0; i < string_info->length; i++)
1507 if ((p[i] < 32) && (isspace((
int)p[i]) == 0))
1509 (void) FormatLocaleFile(file,
"%s(%.20g):\n",
id,(
double) string_info->length);
1510 if (i == string_info->length)
1512 for (i = 0; i < string_info->length; i++)
1513 (
void) fputc(p[i],file);
1514 (void) fputc(
'\n',file);
1520 for (i=0; i < string_info->length; i+=CharsPerLine)
1522 (void) FormatLocaleFile(file,
"0x%08lx: ",(
unsigned long) i);
1523 for (j = 0; j < MagickMin(string_info->length-i, CharsPerLine); j++)
1525 (void) FormatLocaleFile(file,
"%02lx",(
unsigned long) (p[i+j]) & 0xff);
1526 if (((j+1) % 0x04) == 0)
1527 (void) fputc(
' ',file);
1532 for ( ; j < CharsPerLine; j++)
1534 (void) fputc(
' ',file);
1535 (void) fputc(
' ',file);
1536 if (((j+1) % 0x04) == 0)
1537 (void) fputc(
' ',file);
1539 (void) fputc(
' ',file);
1543 for (j=0; j < MagickMin(string_info->length-i,CharsPerLine); j++)
1545 unsigned char c = p[i+j];
1546 if (isprint((
int) c) != 0)
1547 (void) fputc(c,file);
1549 (
void) fputc(
'-',file);
1551 (void) fputc(
'\n',file);
1577MagickExport
void ResetStringInfo(StringInfo *string_info)
1579 assert(string_info != (StringInfo *) NULL);
1580 assert(string_info->signature == MagickCoreSignature);
1581 (void) memset(string_info->datum,0,string_info->length);
1609MagickExport
char *SanitizeString(
const char *source)
1622 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 "
1623 "$-_.+!*'(),{}|\\^~[]`\"><#%;/?:@&=";
1625 sanitize_source=AcquireString(source);
1627 q=sanitize_source+strlen(sanitize_source);
1628 for (p+=strspn(p,allowlist); p != q; p+=(ptrdiff_t) strspn(p,allowlist))
1630 return(sanitize_source);
1657MagickExport
void SetStringInfo(StringInfo *string_info,
1658 const StringInfo *source)
1660 assert(string_info != (StringInfo *) NULL);
1661 assert(string_info->signature == MagickCoreSignature);
1662 assert(source != (StringInfo *) NULL);
1663 assert(source->signature == MagickCoreSignature);
1664 if (string_info->length == 0)
1666 (void) memset(string_info->datum,0,string_info->length);
1667 (void) memcpy(string_info->datum,source->datum,MagickMin(string_info->length,
1697MagickExport
void SetStringInfoDatum(StringInfo *string_info,
1698 const unsigned char *source)
1700 assert(string_info != (StringInfo *) NULL);
1701 assert(string_info->signature == MagickCoreSignature);
1702 if (string_info->length != 0)
1703 (void) memcpy(string_info->datum,source,string_info->length);
1730MagickExport
void SetStringInfoLength(StringInfo *string_info,
1731 const size_t length)
1733 assert(string_info != (StringInfo *) NULL);
1734 assert(string_info->signature == MagickCoreSignature);
1735 if (string_info->length == length)
1737 if (~length < MagickPathExtent)
1738 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
1739 string_info->length=length;
1740 if (string_info->datum == (
unsigned char *) NULL)
1741 string_info->datum=(
unsigned char *) AcquireQuantumMemory(length+
1742 MagickPathExtent,
sizeof(*string_info->datum));
1744 string_info->datum=(
unsigned char *) ResizeQuantumMemory(string_info->datum,
1745 length+MagickPathExtent,
sizeof(*string_info->datum));
1746 if (string_info->datum == (
unsigned char *) NULL)
1747 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
1774MagickExport
void SetStringInfoName(StringInfo *string_info,
const char *name)
1776 assert(string_info != (StringInfo *) NULL);
1777 assert(string_info->signature == MagickCoreSignature);
1778 assert(name != (
const char *) NULL);
1779 string_info->name=ConstantString(name);
1806MagickExport
void SetStringInfoPath(StringInfo *string_info,
const char *path)
1808 assert(string_info != (StringInfo *) NULL);
1809 assert(string_info->signature == MagickCoreSignature);
1810 assert(path != (
const char *) NULL);
1811 string_info->path=ConstantString(path);
1836MagickExport StringInfo *SplitStringInfo(StringInfo *string_info,
1837 const size_t offset)
1842 assert(string_info != (StringInfo *) NULL);
1843 assert(string_info->signature == MagickCoreSignature);
1844 if (offset > string_info->length)
1845 return((StringInfo *) NULL);
1846 split_info=AcquireStringInfo(offset);
1847 SetStringInfo(split_info,string_info);
1848 (void) memmove(string_info->datum,string_info->datum+offset,
1849 string_info->length-offset+MagickPathExtent);
1850 SetStringInfoLength(string_info,string_info->length-offset);
1876MagickExport
char *StringInfoToDigest(
const StringInfo *signature)
1884 signature_info=AcquireSignatureInfo();
1885 UpdateSignature(signature_info,signature);
1886 FinalizeSignature(signature_info);
1887 digest=StringInfoToHexString(GetSignatureDigest(signature_info));
1888 signature_info=DestroySignatureInfo(signature_info);
1914MagickExport
char *StringInfoToHexString(
const StringInfo *string_info)
1934 length=string_info->length;
1935 if (~length < MagickPathExtent)
1936 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
1937 string=(
char *) AcquireQuantumMemory(length+MagickPathExtent,2*
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];
1991MagickExport
char *StringInfoToString(
const StringInfo *string_info)
1999 string=(
char *) NULL;
2000 length=string_info->length;
2001 if (~length >= (MagickPathExtent-1))
2002 string=(
char *) AcquireQuantumMemory(length+MagickPathExtent,
2004 if (
string == (
char *) NULL)
2005 return((
char *) NULL);
2006 (void) memcpy(
string,(
char *) string_info->datum,length*
sizeof(*
string));
2007 string[length]=
'\0';
2045MagickExport
char **StringToArgv(
const char *text,
int *argc)
2058 if (text == (
char *) NULL)
2059 return((
char **) NULL);
2063 for (p=text; *p !=
'\0'; )
2065 while (isspace((
int) ((
unsigned char) *p)) != 0)
2071 for (p++; (*p !=
'"') && (*p !=
'\0'); p++) ;
2073 for (p++; (*p !=
'\'') && (*p !=
'\0'); p++) ;
2074 while ((isspace((
int) ((
unsigned char) *p)) == 0) && (*p !=
'\0'))
2078 argv=(
char **) AcquireQuantumMemory((
size_t) *argc+1UL,
sizeof(*argv));
2079 if (argv == (
char **) NULL)
2080 ThrowFatalException(ResourceLimitFatalError,
"UnableToConvertStringToARGV");
2084 argv[0]=AcquireString(
"magick");
2086 for (i=1; i < (ssize_t) *argc; i++)
2088 while (isspace((
int) ((
unsigned char) *p)) != 0)
2094 for (q++; (*q !=
'"') && (*q !=
'\0'); q++) ;
2100 for (q++; (*q !=
'\'') && (*q !=
'\0'); q++) ;
2103 while ((isspace((
int) ((
unsigned char) *q)) == 0) && (*q !=
'\0'))
2105 argv[i]=(
char *) AcquireQuantumMemory((
size_t) (q-p)+MagickPathExtent,
2107 if (argv[i] == (
char *) NULL)
2109 for (i--; i >= 0; i--)
2110 argv[i]=DestroyString(argv[i]);
2111 argv=(
char **) RelinquishMagickMemory(argv);
2112 ThrowFatalException(ResourceLimitFatalError,
2113 "UnableToConvertStringToARGV");
2115 (void) memcpy(argv[i],p,(
size_t) (q-p));
2118 while ((isspace((
int) ((
unsigned char) *p)) == 0) && (*p !=
'\0'))
2121 argv[i]=(
char *) NULL;
2160MagickExport
double *StringToArrayOfDoubles(
const char *
string,ssize_t *count,
2161 ExceptionInfo *exception)
2178 assert(exception != (ExceptionInfo *) NULL);
2179 assert(exception->signature == MagickCoreSignature);
2181 if (
string == (
char *) NULL)
2182 return((
double *) NULL);
2187 (void) StringToDouble(p,&q);
2189 return((
double *) NULL);
2192 while (isspace((
int) ((
unsigned char) *p)) != 0)
2196 while (isspace((
int) ((
unsigned char) *p)) != 0)
2203 array=(
double *) AcquireQuantumMemory((
size_t) i,
sizeof(*array));
2204 if (array == (
double *) NULL)
2206 (void) ThrowMagickException(exception,GetMagickModule(),
2207 ResourceLimitError,
"MemoryAllocationFailed",
"`%s'",
"");
2208 return((
double *) NULL);
2215 while ((*p !=
'\0') && (i < *count))
2217 array[i++]=StringToDouble(p,&q);
2219 while ((isspace((
int) ((
unsigned char) *p)) != 0) || (*p ==
','))
2259MagickExport
char *StringToken(
const char *delimiters,
char **
string)
2275 if (p == (
char *) NULL)
2276 return((
char *) NULL);
2294 }
while (d !=
'\0');
2322MagickExport
char **StringToList(
const char *text)
2324 return(StringToStrings(text,(
size_t *) NULL));
2353MagickExport
char **StringToStrings(
const char *text,
size_t *count)
2367 if (text == (
char *) NULL)
2369 if (count != (
size_t *) NULL)
2371 return((
char **) NULL);
2373 for (p=text; *p !=
'\0'; p++)
2374 if (((
int) ((
unsigned char) *p) < 32) &&
2375 (isspace((
int) ((
unsigned char) *p)) == 0))
2386 for (p=text; *p !=
'\0'; p++)
2389 textlist=(
char **) AcquireQuantumMemory((
size_t) lines+1UL,
2391 if (textlist == (
char **) NULL)
2392 ThrowFatalException(ResourceLimitFatalError,
"UnableToConvertText");
2394 for (i=0; i < (ssize_t) lines; i++)
2396 for (q=p; *q !=
'\0'; q++)
2397 if ((*q ==
'\r') || (*q ==
'\n'))
2399 textlist[i]=(
char *) AcquireQuantumMemory((
size_t) (q-p)+1,
2400 sizeof(**textlist));
2401 if (textlist[i] == (
char *) NULL)
2402 ThrowFatalException(ResourceLimitFatalError,
"UnableToConvertText");
2403 (void) memcpy(textlist[i],p,(
size_t) (q-p));
2404 textlist[i][q-p]=
'\0';
2413 hex_string[MagickPathExtent];
2424 lines=(size_t) (strlen(text)/CharsPerLine)+1;
2425 textlist=(
char **) AcquireQuantumMemory((
size_t) lines+1UL,
2427 if (textlist == (
char **) NULL)
2428 ThrowFatalException(ResourceLimitFatalError,
"UnableToConvertText");
2430 for (i=0; i < (ssize_t) lines; i++)
2435 textlist[i]=(
char *) AcquireQuantumMemory(2UL*MagickPathExtent,
2436 sizeof(**textlist));
2437 if (textlist[i] == (
char *) NULL)
2438 ThrowFatalException(ResourceLimitFatalError,
"UnableToConvertText");
2439 (void) FormatLocaleString(textlist[i],MagickPathExtent,
"0x%08lx: ",
2440 (
long) (CharsPerLine*i));
2441 q=textlist[i]+strlen(textlist[i]);
2443 for (j=1; j <= (ssize_t) MagickMin(length,CharsPerLine); j++)
2445 (void) FormatLocaleString(hex_string,MagickPathExtent,
"%02x",*(p+j));
2446 (void) CopyMagickString(q,hex_string,MagickPathExtent);
2448 if ((j % 0x04) == 0)
2451 for ( ; j <= CharsPerLine; j++)
2455 if ((j % 0x04) == 0)
2459 for (j=1; j <= (ssize_t) MagickMin(length,CharsPerLine); j++)
2461 if (isprint((
int) ((
unsigned char) *p)) != 0)
2468 textlist[i]=(
char *) ResizeQuantumMemory(textlist[i],(
size_t) (q-
2469 textlist[i]+1),
sizeof(**textlist));
2470 if (textlist[i] == (
char *) NULL)
2471 ThrowFatalException(ResourceLimitFatalError,
"UnableToConvertText");
2474 if (count != (
size_t *) NULL)
2476 textlist[i]=(
char *) NULL;
2502MagickExport StringInfo *StringToStringInfo(
const char *
string)
2507 assert(
string != (
const char *) NULL);
2508 string_info=AcquireStringInfo(strlen(
string));
2509 SetStringInfoDatum(string_info,(
const unsigned char *)
string);
2510 return(string_info);
2537MagickExport
void StripString(
char *message)
2539 (void) StripMagickString(message);
2542MagickExport
size_t StripMagickString(
char *message)
2551 assert(message != (
char *) NULL);
2552 if (*message ==
'\0')
2554 length=strlen(message);
2558 while (isspace((
int) ((
unsigned char) *p)) != 0)
2560 if ((*p ==
'\'') || (*p ==
'"'))
2563 while ((isspace((
int) ((
unsigned char) *q)) != 0) && (q > p))
2566 if ((*q ==
'\'') || (*q ==
'"'))
2568 (void) memmove(message,p,(
size_t) (q-p+1));
2569 message[q-p+1]=
'\0';
2570 for (p=message; *p !=
'\0'; p++)
2573 return((
size_t) (q-p+1));
2607MagickExport MagickBooleanType SubstituteString(
char **
string,
2608 const char *search,
const char *replace)
2627 for (p=strchr(*
string,*search); p != (
char *) NULL; p=strchr(p+1,*search))
2629 if (search_extent == 0)
2630 search_extent=strlen(search);
2631 if (strncmp(p,search,search_extent) != 0)
2637 if (replace_extent == 0)
2638 replace_extent=strlen(replace);
2639 if (replace_extent > search_extent)
2644 offset=(ssize_t) (p-(*
string));
2645 extent=strlen(*
string)+replace_extent-search_extent+1;
2646 *
string=(
char *) ResizeQuantumMemory(*
string,
2647 OverAllocateMemory(extent+MagickPathExtent),
sizeof(*p));
2648 if (*
string == (
char *) NULL)
2649 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
2655 if (search_extent != replace_extent)
2656 (void) memmove(p+replace_extent,p+search_extent,
2657 strlen(p+search_extent)+1);
2658 (void) memcpy(p,replace,replace_extent);
2659 p+=(ptrdiff_t) replace_extent-1;