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=MagickRead(file,
string+i,(
size_t) MagickMin(length-i,(
size_t)
629 MagickMaxBufferExtent));
635 file=close_utf8(file)-1;
636 string=DestroyString(
string);
637 return((StringInfo *) NULL);
641 file=close_utf8(file)-1;
642 string_info=AcquireStringInfoContainer();
643 string_info->path=ConstantString(filename);
644 string_info->length=length;
645 string_info->datum=(
unsigned char *)
string;
675MagickExport
char *ConstantString(
const char *source)
684 if (source != (
char *) NULL)
685 length+=strlen(source);
686 destination=(
char *) NULL;
688 destination=(
char *) AcquireQuantumMemory(length+1UL,
sizeof(*destination));
689 if (destination == (
char *) NULL)
690 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
691 if (source != (
char *) NULL)
692 (void) memcpy(destination,source,length*
sizeof(*destination));
693 destination[length]=
'\0';
728MagickExport
size_t CopyMagickString(
char *magick_restrict destination,
729 const char *magick_restrict source,
const size_t length)
742 for (n=length; n > 4; n-=4)
744 if (((*q++)=(*p++)) ==
'\0')
745 return((
size_t) (p-source-1));
746 if (((*q++)=(*p++)) ==
'\0')
747 return((
size_t) (p-source-1));
748 if (((*q++)=(*p++)) ==
'\0')
749 return((
size_t) (p-source-1));
750 if (((*q++)=(*p++)) ==
'\0')
751 return((
size_t) (p-source-1));
756 if (((*q++)=(*p++)) ==
'\0')
757 return((
size_t) (p-source-1));
760 return((
size_t) (p-source));
785MagickExport
char *DestroyString(
char *
string)
787 return((
char *) RelinquishMagickMemory(
string));
812MagickExport StringInfo *DestroyStringInfo(StringInfo *string_info)
814 assert(string_info != (StringInfo *) NULL);
815 assert(string_info->signature == MagickCoreSignature);
816 if (string_info->datum != (
unsigned char *) NULL)
817 string_info->datum=(
unsigned char *) RelinquishMagickMemory(
819 if (string_info->name != (
char *) NULL)
820 string_info->name=DestroyString(string_info->name);
821 if (string_info->path != (
char *) NULL)
822 string_info->path=DestroyString(string_info->path);
823 string_info->signature=(~MagickCoreSignature);
824 string_info=(StringInfo *) RelinquishMagickMemory(string_info);
850MagickExport
char **DestroyStringList(
char **list)
855 assert(list != (
char **) NULL);
856 for (i=0; list[i] != (
char *) NULL; i++)
857 list[i]=DestroyString(list[i]);
858 list=(
char **) RelinquishMagickMemory(list);
891MagickExport
char *EscapeString(
const char *source,
const char escape)
905 assert(source != (
const char *) NULL);
907 for (p=source; *p !=
'\0'; p++)
909 if ((*p ==
'\\') || (*p == escape))
912 ThrowFatalException(ResourceLimitFatalError,
"UnableToEscapeString");
917 destination=(
char *) NULL;
918 if (~length >= (MagickPathExtent-1))
919 destination=(
char *) AcquireQuantumMemory(length+MagickPathExtent,
920 sizeof(*destination));
921 if (destination == (
char *) NULL)
922 ThrowFatalException(ResourceLimitFatalError,
"UnableToEscapeString");
925 for (p=source; *p !=
'\0'; p++)
927 if ((*p ==
'\\') || (*p == escape))
962MagickExport
char *FileToString(
const char *filename,
const size_t extent,
963 ExceptionInfo *exception)
971 assert(filename != (
const char *) NULL);
972 assert(exception != (ExceptionInfo *) NULL);
973 if (IsEventLogging() != MagickFalse)
974 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",filename);
976 if ((*filename ==
'@') && (strlen(filename) > 1))
981 status=IsRightsAuthorized(PathPolicyDomain,ReadPolicyRights,filename);
982 if (status == MagickFalse)
983 ThrowPolicyException(filename,(
char *) NULL);
986 return((
char *) FileToBlob(p,extent,&length,exception));
1016MagickExport StringInfo *FileToStringInfo(
const char *filename,
1017 const size_t extent,ExceptionInfo *exception)
1022 assert(filename != (
const char *) NULL);
1023 assert(exception != (ExceptionInfo *) NULL);
1024 if (IsEventLogging() != MagickFalse)
1025 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",filename);
1026 string_info=AcquireStringInfoContainer();
1027 string_info->path=ConstantString(filename);
1028 string_info->datum=(
unsigned char *) FileToBlob(filename,extent,
1029 &string_info->length,exception);
1030 if (string_info->datum == (
unsigned char *) NULL)
1032 string_info=DestroyStringInfo(string_info);
1033 return((StringInfo *) NULL);
1035 return(string_info);
1071MagickExport ssize_t FormatMagickSize(
const MagickSizeType size,
1072 const MagickBooleanType bi,
const char *suffix,
const size_t length,
1091 "",
"Ki",
"Mi",
"Gi",
"Ti",
"Pi",
"Ei",
"Zi",
"Yi",
"Ri",
"Qi", (
char *) NULL
1093 *traditional_units[] =
1095 "",
"K",
"M",
"G",
"T",
"P",
"E",
"Z",
"Y",
"R",
"Q", (
char *) NULL
1099 units=traditional_units;
1100 if (bi != MagickFalse)
1105 extent=(double) size;
1106 (void) FormatLocaleString(format,MagickFormatExtent,
"%.*g",
1107 GetMagickPrecision(),extent);
1108 if (strstr(format,
"e+") == (
char *) NULL)
1110 if (suffix == (
const char *) NULL)
1111 count=FormatLocaleString(format,length,
"%.17g%s",extent,units[0]);
1113 count=FormatLocaleString(format,length,
"%.17g%s%s",extent,units[0],
1117 for (i=0; (extent >= bytes) && (units[i+1] != (
const char *) NULL); i++)
1119 if (suffix == (
const char *) NULL)
1120 count=FormatLocaleString(format,length,
"%.*g%s",GetMagickPrecision(),
1123 count=FormatLocaleString(format,length,
"%.*g%s%s",GetMagickPrecision(),
1124 extent,units[i],suffix);
1151MagickExport
char *GetEnvironmentValue(
const char *name)
1153#if defined(MAGICKCORE_WINDOWS_SUPPORT)
1154 return(NTGetEnvironmentValue(name));
1159 environment=getenv(name);
1160 if (environment == (
const char *) NULL)
1161 return((
char *) NULL);
1162 return(ConstantString(environment));
1188MagickExport
unsigned char *GetStringInfoDatum(
const StringInfo *string_info)
1190 assert(string_info != (StringInfo *) NULL);
1191 assert(string_info->signature == MagickCoreSignature);
1192 return(string_info->datum);
1217MagickExport
size_t GetStringInfoLength(
const StringInfo *string_info)
1219 assert(string_info != (StringInfo *) NULL);
1220 assert(string_info->signature == MagickCoreSignature);
1221 return(string_info->length);
1246MagickExport
const char *GetStringInfoName(
const StringInfo *string_info)
1248 assert(string_info != (StringInfo *) NULL);
1249 assert(string_info->signature == MagickCoreSignature);
1250 return(string_info->name);
1275MagickExport
const char *GetStringInfoPath(
const StringInfo *string_info)
1277 assert(string_info != (StringInfo *) NULL);
1278 assert(string_info->signature == MagickCoreSignature);
1279 return(string_info->path);
1309MagickExport
double InterpretSiPrefixValue(
const char *magick_restrict
string,
1310 char **magick_restrict sentinel)
1318 value=InterpretLocaleValue(
string,&q);
1321 if ((*q >=
'E') && (*q <=
'z'))
1326 switch ((
int) ((
unsigned char) *q))
1328 case 'q': e=(-30.0);
break;
1329 case 'r': e=(-27.0);
break;
1330 case 'y': e=(-24.0);
break;
1331 case 'z': e=(-21.0);
break;
1332 case 'a': e=(-18.0);
break;
1333 case 'f': e=(-15.0);
break;
1334 case 'p': e=(-12.0);
break;
1335 case 'n': e=(-9.0);
break;
1336 case 'u': e=(-6.0);
break;
1337 case 'm': e=(-3.0);
break;
1338 case 'c': e=(-2.0);
break;
1339 case 'd': e=(-1.0);
break;
1340 case 'h': e=2.0;
break;
1341 case 'k': e=3.0;
break;
1342 case 'K': e=3.0;
break;
1343 case 'M': e=6.0;
break;
1344 case 'G': e=9.0;
break;
1345 case 'T': e=12.0;
break;
1346 case 'P': e=15.0;
break;
1347 case 'E': e=18.0;
break;
1348 case 'Z': e=21.0;
break;
1349 case 'Y': e=24.0;
break;
1350 case 'R': e=27.0;
break;
1351 case 'Q': e=30.0;
break;
1352 default: e=0.0;
break;
1354 if (e >= MagickEpsilon)
1358 value*=pow(2.0,e/0.3);
1368 if ((*q ==
'B') || (*q ==
'P'))
1371 if (sentinel != (
char **) NULL)
1402MagickExport MagickBooleanType IsStringTrue(
const char *value)
1404 if (value == (
const char *) NULL)
1405 return(MagickFalse);
1406 if (LocaleCompare(value,
"true") == 0)
1408 if (LocaleCompare(value,
"on") == 0)
1410 if (LocaleCompare(value,
"yes") == 0)
1412 if (LocaleCompare(value,
"1") == 0)
1414 return(MagickFalse);
1443MagickExport MagickBooleanType IsStringFalse(
const char *value)
1445 if (value == (
const char *) NULL)
1446 return(MagickFalse);
1447 if (LocaleCompare(value,
"false") == 0)
1449 if (LocaleCompare(value,
"off") == 0)
1451 if (LocaleCompare(value,
"no") == 0)
1453 if (LocaleCompare(value,
"0") == 0)
1455 return(MagickFalse);
1485MagickExport
void PrintStringInfo(FILE *file,
const char *
id,
1486 const StringInfo *string_info)
1498 assert(
id != (
const char *) NULL);
1499 assert(string_info != (StringInfo *) NULL);
1500 assert(string_info->signature == MagickCoreSignature);
1501 p=(
const unsigned char *) string_info->datum;
1502 for (i=0; i < string_info->length; i++)
1503 if ((p[i] < 32) && (isspace((
int)p[i]) == 0))
1505 (void) FormatLocaleFile(file,
"%s(%.17g):\n",
id,(
double) string_info->length);
1506 if (i == string_info->length)
1508 for (i = 0; i < string_info->length; i++)
1509 (
void) fputc(p[i],file);
1510 (void) fputc(
'\n',file);
1516 for (i=0; i < string_info->length; i+=CharsPerLine)
1518 (void) FormatLocaleFile(file,
"0x%08lx: ",(
unsigned long) i);
1519 for (j = 0; j < MagickMin(string_info->length-i, CharsPerLine); j++)
1521 (void) FormatLocaleFile(file,
"%02lx",(
unsigned long) (p[i+j]) & 0xff);
1522 if (((j+1) % 0x04) == 0)
1523 (void) fputc(
' ',file);
1528 for ( ; j < CharsPerLine; j++)
1530 (void) fputc(
' ',file);
1531 (void) fputc(
' ',file);
1532 if (((j+1) % 0x04) == 0)
1533 (void) fputc(
' ',file);
1535 (void) fputc(
' ',file);
1539 for (j=0; j < MagickMin(string_info->length-i,CharsPerLine); j++)
1541 unsigned char c = p[i+j];
1542 if (isprint((
int) c) != 0)
1543 (void) fputc(c,file);
1545 (
void) fputc(
'-',file);
1547 (void) fputc(
'\n',file);
1573MagickExport
void ResetStringInfo(StringInfo *string_info)
1575 assert(string_info != (StringInfo *) NULL);
1576 assert(string_info->signature == MagickCoreSignature);
1577 (void) memset(string_info->datum,0,string_info->length);
1605MagickExport
char *SanitizeString(
const char *source)
1618 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 "
1619 "$-_.+!*'(),{}|\\^~[]`\"><#%;/?:@&=";
1621 sanitize_source=AcquireString(source);
1623 q=sanitize_source+strlen(sanitize_source);
1624 for (p+=strspn(p,allowlist); p != q; p+=(ptrdiff_t) strspn(p,allowlist))
1626 return(sanitize_source);
1653MagickExport
void SetStringInfo(StringInfo *string_info,
1654 const StringInfo *source)
1656 assert(string_info != (StringInfo *) NULL);
1657 assert(string_info->signature == MagickCoreSignature);
1658 assert(source != (StringInfo *) NULL);
1659 assert(source->signature == MagickCoreSignature);
1660 if (string_info->length == 0)
1662 (void) memset(string_info->datum,0,string_info->length);
1663 (void) memcpy(string_info->datum,source->datum,MagickMin(string_info->length,
1693MagickExport
void SetStringInfoDatum(StringInfo *string_info,
1694 const unsigned char *source)
1696 assert(string_info != (StringInfo *) NULL);
1697 assert(string_info->signature == MagickCoreSignature);
1698 if (string_info->length != 0)
1699 (void) memcpy(string_info->datum,source,string_info->length);
1726MagickExport
void SetStringInfoLength(StringInfo *string_info,
1727 const size_t length)
1729 assert(string_info != (StringInfo *) NULL);
1730 assert(string_info->signature == MagickCoreSignature);
1731 if (string_info->length == length)
1733 if (~length < MagickPathExtent)
1734 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
1735 string_info->length=length;
1736 if (string_info->datum == (
unsigned char *) NULL)
1737 string_info->datum=(
unsigned char *) AcquireQuantumMemory(length+
1738 MagickPathExtent,
sizeof(*string_info->datum));
1740 string_info->datum=(
unsigned char *) ResizeQuantumMemory(string_info->datum,
1741 length+MagickPathExtent,
sizeof(*string_info->datum));
1742 if (string_info->datum == (
unsigned char *) NULL)
1743 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
1770MagickExport
void SetStringInfoName(StringInfo *string_info,
const char *name)
1772 assert(string_info != (StringInfo *) NULL);
1773 assert(string_info->signature == MagickCoreSignature);
1774 assert(name != (
const char *) NULL);
1775 string_info->name=ConstantString(name);
1802MagickExport
void SetStringInfoPath(StringInfo *string_info,
const char *path)
1804 assert(string_info != (StringInfo *) NULL);
1805 assert(string_info->signature == MagickCoreSignature);
1806 assert(path != (
const char *) NULL);
1807 string_info->path=ConstantString(path);
1832MagickExport StringInfo *SplitStringInfo(StringInfo *string_info,
1833 const size_t offset)
1838 assert(string_info != (StringInfo *) NULL);
1839 assert(string_info->signature == MagickCoreSignature);
1840 if (offset > string_info->length)
1841 return((StringInfo *) NULL);
1842 split_info=AcquireStringInfo(offset);
1843 SetStringInfo(split_info,string_info);
1844 (void) memmove(string_info->datum,string_info->datum+offset,
1845 string_info->length-offset+MagickPathExtent);
1846 SetStringInfoLength(string_info,string_info->length-offset);
1872MagickExport
char *StringInfoToDigest(
const StringInfo *signature)
1880 signature_info=AcquireSignatureInfo();
1881 UpdateSignature(signature_info,signature);
1882 FinalizeSignature(signature_info);
1883 digest=StringInfoToHexString(GetSignatureDigest(signature_info));
1884 signature_info=DestroySignatureInfo(signature_info);
1910MagickExport
char *StringInfoToHexString(
const StringInfo *string_info)
1930 length=string_info->length;
1931 if (~length < MagickPathExtent)
1932 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
1933 string=(
char *) AcquireQuantumMemory(length+MagickPathExtent,2*
1935 if (
string == (
char *) NULL)
1936 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
1953 p=string_info->datum;
1954 q=(
unsigned char *)
string;
1955 for (i=0; i < (ssize_t) string_info->length; i++)
1957 *q++=hex_digits[(*p >> 4) & 0x0f];
1958 *q++=hex_digits[*p & 0x0f];
1987MagickExport
char *StringInfoToString(
const StringInfo *string_info)
1995 string=(
char *) NULL;
1996 length=string_info->length;
1997 if (~length >= (MagickPathExtent-1))
1998 string=(
char *) AcquireQuantumMemory(length+MagickPathExtent,
2000 if (
string == (
char *) NULL)
2001 return((
char *) NULL);
2002 (void) memcpy(
string,(
char *) string_info->datum,length*
sizeof(*
string));
2003 string[length]=
'\0';
2041MagickExport
char **StringToArgv(
const char *text,
int *argc)
2054 if (text == (
char *) NULL)
2055 return((
char **) NULL);
2059 for (p=text; *p !=
'\0'; )
2061 while (isspace((
int) ((
unsigned char) *p)) != 0)
2067 for (p++; (*p !=
'"') && (*p !=
'\0'); p++) ;
2069 for (p++; (*p !=
'\'') && (*p !=
'\0'); p++) ;
2070 while ((isspace((
int) ((
unsigned char) *p)) == 0) && (*p !=
'\0'))
2074 argv=(
char **) AcquireQuantumMemory((
size_t) *argc+1UL,
sizeof(*argv));
2075 if (argv == (
char **) NULL)
2076 ThrowFatalException(ResourceLimitFatalError,
"UnableToConvertStringToARGV");
2080 argv[0]=AcquireString(
"magick");
2082 for (i=1; i < (ssize_t) *argc; i++)
2084 while (isspace((
int) ((
unsigned char) *p)) != 0)
2090 for (q++; (*q !=
'"') && (*q !=
'\0'); q++) ;
2096 for (q++; (*q !=
'\'') && (*q !=
'\0'); q++) ;
2099 while ((isspace((
int) ((
unsigned char) *q)) == 0) && (*q !=
'\0'))
2101 argv[i]=(
char *) AcquireQuantumMemory((
size_t) (q-p)+MagickPathExtent,
2103 if (argv[i] == (
char *) NULL)
2105 for (i--; i >= 0; i--)
2106 argv[i]=DestroyString(argv[i]);
2107 argv=(
char **) RelinquishMagickMemory(argv);
2108 ThrowFatalException(ResourceLimitFatalError,
2109 "UnableToConvertStringToARGV");
2111 (void) memcpy(argv[i],p,(
size_t) (q-p));
2114 while ((isspace((
int) ((
unsigned char) *p)) == 0) && (*p !=
'\0'))
2117 argv[i]=(
char *) NULL;
2156MagickExport
double *StringToArrayOfDoubles(
const char *
string,ssize_t *count,
2157 ExceptionInfo *exception)
2174 assert(exception != (ExceptionInfo *) NULL);
2175 assert(exception->signature == MagickCoreSignature);
2177 if (
string == (
char *) NULL)
2178 return((
double *) NULL);
2183 (void) StringToDouble(p,&q);
2185 return((
double *) NULL);
2188 while (isspace((
int) ((
unsigned char) *p)) != 0)
2192 while (isspace((
int) ((
unsigned char) *p)) != 0)
2199 array=(
double *) AcquireQuantumMemory((
size_t) i,
sizeof(*array));
2200 if (array == (
double *) NULL)
2202 (void) ThrowMagickException(exception,GetMagickModule(),
2203 ResourceLimitError,
"MemoryAllocationFailed",
"`%s'",
"");
2204 return((
double *) NULL);
2211 while ((*p !=
'\0') && (i < *count))
2213 array[i++]=StringToDouble(p,&q);
2215 while ((isspace((
int) ((
unsigned char) *p)) != 0) || (*p ==
','))
2255MagickExport
char *StringToken(
const char *delimiters,
char **
string)
2271 if (p == (
char *) NULL)
2272 return((
char *) NULL);
2290 }
while (d !=
'\0');
2318MagickExport
char **StringToList(
const char *text)
2320 return(StringToStrings(text,(
size_t *) NULL));
2349MagickExport
char **StringToStrings(
const char *text,
size_t *count)
2363 if (text == (
char *) NULL)
2365 if (count != (
size_t *) NULL)
2367 return((
char **) NULL);
2369 for (p=text; *p !=
'\0'; p++)
2370 if (((
int) ((
unsigned char) *p) < 32) &&
2371 (isspace((
int) ((
unsigned char) *p)) == 0))
2382 for (p=text; *p !=
'\0'; p++)
2385 textlist=(
char **) AcquireQuantumMemory((
size_t) lines+1UL,
2387 if (textlist == (
char **) NULL)
2388 ThrowFatalException(ResourceLimitFatalError,
"UnableToConvertText");
2390 for (i=0; i < (ssize_t) lines; i++)
2392 for (q=p; *q !=
'\0'; q++)
2393 if ((*q ==
'\r') || (*q ==
'\n'))
2395 textlist[i]=(
char *) AcquireQuantumMemory((
size_t) (q-p)+1,
2396 sizeof(**textlist));
2397 if (textlist[i] == (
char *) NULL)
2398 ThrowFatalException(ResourceLimitFatalError,
"UnableToConvertText");
2399 (void) memcpy(textlist[i],p,(
size_t) (q-p));
2400 textlist[i][q-p]=
'\0';
2409 hex_string[MagickPathExtent];
2420 lines=(size_t) (strlen(text)/CharsPerLine)+1;
2421 textlist=(
char **) AcquireQuantumMemory((
size_t) lines+1UL,
2423 if (textlist == (
char **) NULL)
2424 ThrowFatalException(ResourceLimitFatalError,
"UnableToConvertText");
2426 for (i=0; i < (ssize_t) lines; i++)
2431 textlist[i]=(
char *) AcquireQuantumMemory(2UL*MagickPathExtent,
2432 sizeof(**textlist));
2433 if (textlist[i] == (
char *) NULL)
2434 ThrowFatalException(ResourceLimitFatalError,
"UnableToConvertText");
2435 (void) FormatLocaleString(textlist[i],MagickPathExtent,
"0x%08lx: ",
2436 (
long) (CharsPerLine*i));
2437 q=textlist[i]+strlen(textlist[i]);
2439 for (j=1; j <= (ssize_t) MagickMin(length,CharsPerLine); j++)
2441 (void) FormatLocaleString(hex_string,MagickPathExtent,
"%02x",*(p+j));
2442 (void) CopyMagickString(q,hex_string,MagickPathExtent);
2444 if ((j % 0x04) == 0)
2447 for ( ; j <= CharsPerLine; j++)
2451 if ((j % 0x04) == 0)
2455 for (j=1; j <= (ssize_t) MagickMin(length,CharsPerLine); j++)
2457 if (isprint((
int) ((
unsigned char) *p)) != 0)
2464 textlist[i]=(
char *) ResizeQuantumMemory(textlist[i],(
size_t) (q-
2465 textlist[i]+1),
sizeof(**textlist));
2466 if (textlist[i] == (
char *) NULL)
2467 ThrowFatalException(ResourceLimitFatalError,
"UnableToConvertText");
2470 if (count != (
size_t *) NULL)
2472 textlist[i]=(
char *) NULL;
2498MagickExport StringInfo *StringToStringInfo(
const char *
string)
2503 assert(
string != (
const char *) NULL);
2504 string_info=AcquireStringInfo(strlen(
string));
2505 SetStringInfoDatum(string_info,(
const unsigned char *)
string);
2506 return(string_info);
2533MagickExport
void StripString(
char *message)
2535 (void) StripMagickString(message);
2538MagickExport
size_t StripMagickString(
char *message)
2547 assert(message != (
char *) NULL);
2548 if (*message ==
'\0')
2550 length=strlen(message);
2554 while (isspace((
int) ((
unsigned char) *p)) != 0)
2556 if ((*p ==
'\'') || (*p ==
'"'))
2559 while ((isspace((
int) ((
unsigned char) *q)) != 0) && (q > p))
2562 if ((*q ==
'\'') || (*q ==
'"'))
2564 (void) memmove(message,p,(
size_t) (q-p+1));
2565 message[q-p+1]=
'\0';
2566 for (p=message; *p !=
'\0'; p++)
2569 return((
size_t) (q-p+1));
2603MagickExport MagickBooleanType SubstituteString(
char **
string,
2604 const char *search,
const char *replace)
2623 for (p=strchr(*
string,*search); p != (
char *) NULL; p=strchr(p+1,*search))
2625 if (search_extent == 0)
2626 search_extent=strlen(search);
2627 if (strncmp(p,search,search_extent) != 0)
2633 if (replace_extent == 0)
2634 replace_extent=strlen(replace);
2635 if (replace_extent > search_extent)
2640 offset=(ssize_t) (p-(*
string));
2641 extent=strlen(*
string)+replace_extent-search_extent+1;
2642 *
string=(
char *) ResizeQuantumMemory(*
string,
2643 OverAllocateMemory(extent+MagickPathExtent),
sizeof(*p));
2644 if (*
string == (
char *) NULL)
2645 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
2651 if (search_extent != replace_extent)
2652 (void) memmove(p+replace_extent,p+search_extent,
2653 strlen(p+search_extent)+1);
2654 (void) memcpy(p,replace,replace_extent);
2655 p+=(ptrdiff_t) replace_extent-1;