42#include "MagickCore/studio.h"
43#include "MagickCore/blob.h"
44#include "MagickCore/blob-private.h"
45#include "MagickCore/client.h"
46#include "MagickCore/exception.h"
47#include "MagickCore/exception-private.h"
48#include "MagickCore/image-private.h"
49#include "MagickCore/list.h"
50#include "MagickCore/locale_.h"
51#include "MagickCore/log.h"
52#include "MagickCore/memory_.h"
53#include "MagickCore/memory-private.h"
54#include "MagickCore/nt-base-private.h"
55#include "MagickCore/property.h"
56#include "MagickCore/policy.h"
57#include "MagickCore/resource_.h"
58#include "MagickCore/resource-private.h"
59#include "MagickCore/signature-private.h"
60#include "MagickCore/string_.h"
61#include "MagickCore/string-private.h"
62#include "MagickCore/utility-private.h"
67#define CharsPerLine 0x14
97MagickExport
char *AcquireString(
const char *source)
106 if (source != (
char *) NULL)
107 length+=strlen(source);
108 if (~length < MagickPathExtent)
109 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
110 destination=(
char *) AcquireQuantumMemory(length+MagickPathExtent,
111 sizeof(*destination));
112 if (destination == (
char *) NULL)
113 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
114 if (source != (
char *) NULL)
115 (void) memcpy(destination,source,length*
sizeof(*destination));
116 destination[length]=
'\0';
143static StringInfo *AcquireStringInfoContainer(
void)
148 string_info=(
StringInfo *) AcquireCriticalMemory(
sizeof(*string_info));
149 (void) memset(string_info,0,
sizeof(*string_info));
150 string_info->signature=MagickCoreSignature;
154MagickExport
StringInfo *AcquireStringInfo(
const size_t length)
159 string_info=AcquireStringInfoContainer();
160 string_info->length=length;
161 if (~string_info->length >= (MagickPathExtent-1))
162 string_info->datum=(
unsigned char *) AcquireQuantumMemory(
163 string_info->length+MagickPathExtent,
sizeof(*string_info->datum));
164 if (string_info->datum == (
unsigned char *) NULL)
165 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
166 (void) memset(string_info->datum,0,(length+MagickPathExtent)*
167 sizeof(*string_info->datum));
196MagickExport
StringInfo *BlobToStringInfo(
const void *blob,
const size_t length)
201 if (~length < MagickPathExtent)
202 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
203 string_info=AcquireStringInfoContainer();
204 string_info->length=length;
205 string_info->datum=(
unsigned char *) AcquireQuantumMemory(length+
206 MagickPathExtent,
sizeof(*string_info->datum));
207 if (string_info->datum == (
unsigned char *) NULL)
209 string_info=DestroyStringInfo(string_info);
212 if (blob != (
const void *) NULL)
213 (void) memcpy(string_info->datum,blob,length);
215 (
void) memset(string_info->datum,0,length*
sizeof(*string_info->datum));
216 (void) memset(string_info->datum+length,0,MagickPathExtent*
217 sizeof(*string_info->datum));
253MagickExport
char *CloneString(
char **destination,
const char *source)
258 assert(destination != (
char **) NULL);
259 if (source == (
const char *) NULL)
261 if (*destination != (
char *) NULL)
262 *destination=DestroyString(*destination);
263 return(*destination);
265 if (*destination == (
char *) NULL)
267 *destination=AcquireString(source);
268 return(*destination);
270 length=strlen(source);
271 if (~length < MagickPathExtent)
272 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
273 *destination=(
char *) ResizeQuantumMemory(*destination,length+
274 MagickPathExtent,
sizeof(**destination));
275 if (*destination == (
char *) NULL)
276 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
278 (void) memcpy(*destination,source,length*
sizeof(**destination));
279 (*destination)[length]=
'\0';
280 return(*destination);
311 assert(string_info->signature == MagickCoreSignature);
312 clone_info=AcquireStringInfo(string_info->length);
313 (void) CloneString(&clone_info->path,string_info->path);
314 (void) CloneString(&clone_info->name,string_info->name);
315 if (string_info->length != 0)
316 (void) memcpy(clone_info->datum,string_info->datum,string_info->length+1);
347MagickExport
int CompareStringInfo(
const StringInfo *target,
354 assert(target->signature == MagickCoreSignature);
356 assert(source->signature == MagickCoreSignature);
357 status=memcmp(target->datum,source->datum,MagickMin(target->length,
361 if (target->length == source->length)
363 return(target->length < source->length ? -1 : 1);
395MagickExport
size_t ConcatenateMagickString(
char *magick_restrict destination,
396 const char *magick_restrict source,
const size_t length)
408 assert(destination != (
char *) NULL);
409 assert(source != (
const char *) NULL);
414 while ((i-- != 0) && (*q !=
'\0'))
416 count=(size_t) (q-destination);
419 return(count+strlen(p));
430 return(count+(
size_t) (p-source));
459MagickExport MagickBooleanType ConcatenateString(
460 char **magick_restrict destination,
const char *magick_restrict source)
467 assert(destination != (
char **) NULL);
468 if (source == (
const char *) NULL)
470 if (*destination == (
char *) NULL)
472 *destination=AcquireString(source);
475 destination_length=strlen(*destination);
476 source_length=strlen(source);
477 length=destination_length;
478 if (~length < source_length)
479 ThrowFatalException(ResourceLimitFatalError,
"UnableToConcatenateString");
480 length+=source_length;
481 if (~length < MagickPathExtent)
482 ThrowFatalException(ResourceLimitFatalError,
"UnableToConcatenateString");
483 *destination=(
char *) ResizeQuantumMemory(*destination,
484 OverAllocateMemory(length+MagickPathExtent),
sizeof(**destination));
485 if (*destination == (
char *) NULL)
486 ThrowFatalException(ResourceLimitFatalError,
"UnableToConcatenateString");
487 if (source_length != 0)
488 (void) memcpy((*destination)+destination_length,source,source_length);
489 (*destination)[length]=
'\0';
519MagickExport
void ConcatenateStringInfo(
StringInfo *string_info,
526 assert(string_info->signature == MagickCoreSignature);
528 length=string_info->length;
529 if (~length < source->length)
530 ThrowFatalException(ResourceLimitFatalError,
"UnableToConcatenateString");
531 length+=source->length;
532 if (~length < MagickPathExtent)
533 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
534 if (string_info->datum == (
unsigned char *) NULL)
535 string_info->datum=(
unsigned char *) AcquireQuantumMemory(length+
536 MagickPathExtent,
sizeof(*string_info->datum));
538 string_info->datum=(
unsigned char *) ResizeQuantumMemory(
539 string_info->datum,OverAllocateMemory(length+MagickPathExtent),
540 sizeof(*string_info->datum));
541 if (string_info->datum == (
unsigned char *) NULL)
542 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
543 (void) memcpy(string_info->datum+string_info->length,source->datum,
545 string_info->length=length;
572MagickExport
StringInfo *ConfigureFileToStringInfo(
const char *filename)
592 assert(filename != (
const char *) NULL);
593 file=open_utf8(filename,O_RDONLY | O_CLOEXEC | O_BINARY,0);
596 offset=(MagickOffsetType) lseek(file,0,SEEK_END);
597 if ((offset < 0) || (offset != (MagickOffsetType) ((ssize_t) offset)))
599 file=close_utf8(file)-1;
602 length=(size_t) offset;
603 string=(
char *) NULL;
604 if (~length >= (MagickPathExtent-1))
605 string=(
char *) AcquireQuantumMemory(length+MagickPathExtent,
607 if (
string == (
char *) NULL)
609 file=close_utf8(file)-1;
612 map=MapBlob(file,ReadMode,0,length);
613 if (map != (
void *) NULL)
615 (void) memcpy(
string,map,length);
616 (void) UnmapBlob(map,length);
626 (void) lseek(file,0,SEEK_SET);
627 for (i=0; i < length; i+=(size_t) count)
629 count=MagickRead(file,
string+i,(
size_t) MagickMin(length-i,(
size_t)
630 MagickMaxBufferExtent));
636 file=close_utf8(file)-1;
637 string=DestroyString(
string);
642 file=close_utf8(file)-1;
643 string_info=AcquireStringInfoContainer();
644 string_info->path=ConstantString(filename);
645 string_info->length=length;
646 string_info->datum=(
unsigned char *)
string;
676MagickExport
char *ConstantString(
const char *source)
685 if (source != (
char *) NULL)
686 length+=strlen(source);
687 destination=(
char *) NULL;
689 destination=(
char *) AcquireQuantumMemory(length+1UL,
sizeof(*destination));
690 if (destination == (
char *) NULL)
691 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
692 if (source != (
char *) NULL)
693 (void) memcpy(destination,source,length*
sizeof(*destination));
694 destination[length]=
'\0';
729MagickExport
size_t CopyMagickString(
char *magick_restrict destination,
730 const char *magick_restrict source,
const size_t length)
743 for (n=length; n > 4; n-=4)
745 if (((*q++)=(*p++)) ==
'\0')
746 return((
size_t) (p-source-1));
747 if (((*q++)=(*p++)) ==
'\0')
748 return((
size_t) (p-source-1));
749 if (((*q++)=(*p++)) ==
'\0')
750 return((
size_t) (p-source-1));
751 if (((*q++)=(*p++)) ==
'\0')
752 return((
size_t) (p-source-1));
757 if (((*q++)=(*p++)) ==
'\0')
758 return((
size_t) (p-source-1));
761 return((
size_t) (p-source));
786MagickExport
char *DestroyString(
char *
string)
788 return((
char *) RelinquishMagickMemory(
string));
816 assert(string_info->signature == MagickCoreSignature);
817 if (string_info->datum != (
unsigned char *) NULL)
818 string_info->datum=(
unsigned char *) RelinquishMagickMemory(
820 if (string_info->name != (
char *) NULL)
821 string_info->name=DestroyString(string_info->name);
822 if (string_info->path != (
char *) NULL)
823 string_info->path=DestroyString(string_info->path);
824 string_info->signature=(~MagickCoreSignature);
825 string_info=(
StringInfo *) RelinquishMagickMemory(string_info);
851MagickExport
char **DestroyStringList(
char **list)
856 assert(list != (
char **) NULL);
857 for (i=0; list[i] != (
char *) NULL; i++)
858 list[i]=DestroyString(list[i]);
859 list=(
char **) RelinquishMagickMemory(list);
892MagickExport
char *EscapeString(
const char *source,
const char escape)
906 assert(source != (
const char *) NULL);
908 for (p=source; *p !=
'\0'; p++)
910 if ((*p ==
'\\') || (*p == escape))
913 ThrowFatalException(ResourceLimitFatalError,
"UnableToEscapeString");
918 destination=(
char *) NULL;
919 if (~length >= (MagickPathExtent-1))
920 destination=(
char *) AcquireQuantumMemory(length+MagickPathExtent,
921 sizeof(*destination));
922 if (destination == (
char *) NULL)
923 ThrowFatalException(ResourceLimitFatalError,
"UnableToEscapeString");
926 for (p=source; *p !=
'\0'; p++)
928 if ((*p ==
'\\') || (*p == escape))
963MagickExport
char *FileToString(
const char *filename,
const size_t extent,
972 assert(filename != (
const char *) NULL);
974 if (IsEventLogging() != MagickFalse)
975 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",filename);
977 if ((*filename ==
'@') && (strlen(filename) > 1))
982 status=IsRightsAuthorized(PathPolicyDomain,ReadPolicyRights,filename);
983 if (status == MagickFalse)
984 ThrowPolicyException(filename,(
char *) NULL);
987 return((
char *) FileToBlob(p,extent,&length,exception));
1017MagickExport
StringInfo *FileToStringInfo(
const char *filename,
1023 assert(filename != (
const char *) NULL);
1025 if (IsEventLogging() != MagickFalse)
1026 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",filename);
1027 string_info=AcquireStringInfoContainer();
1028 string_info->path=ConstantString(filename);
1029 string_info->datum=(
unsigned char *) FileToBlob(filename,extent,
1030 &string_info->length,exception);
1031 if (string_info->datum == (
unsigned char *) NULL)
1033 string_info=DestroyStringInfo(string_info);
1036 return(string_info);
1072MagickExport ssize_t FormatMagickSize(
const MagickSizeType size,
1073 const MagickBooleanType bi,
const char *suffix,
const size_t length,
1092 "",
"Ki",
"Mi",
"Gi",
"Ti",
"Pi",
"Ei",
"Zi",
"Yi",
"Ri",
"Qi", (
char *) NULL
1094 *traditional_units[] =
1096 "",
"K",
"M",
"G",
"T",
"P",
"E",
"Z",
"Y",
"R",
"Q", (
char *) NULL
1100 units=traditional_units;
1101 if (bi != MagickFalse)
1106 extent=(double) size;
1107 (void) FormatLocaleString(format,MagickFormatExtent,
"%.*g",
1108 GetMagickPrecision(),extent);
1109 if (strstr(format,
"e+") == (
char *) NULL)
1111 if (suffix == (
const char *) NULL)
1112 count=FormatLocaleString(format,length,
"%.17g%s",extent,units[0]);
1114 count=FormatLocaleString(format,length,
"%.17g%s%s",extent,units[0],
1118 for (i=0; (extent >= bytes) && (units[i+1] != (
const char *) NULL); i++)
1120 if (suffix == (
const char *) NULL)
1121 count=FormatLocaleString(format,length,
"%.*g%s",GetMagickPrecision(),
1124 count=FormatLocaleString(format,length,
"%.*g%s%s",GetMagickPrecision(),
1125 extent,units[i],suffix);
1152MagickExport
char *GetEnvironmentValue(
const char *name)
1154#if defined(MAGICKCORE_WINDOWS_SUPPORT)
1155 return(NTGetEnvironmentValue(name));
1160 environment=getenv(name);
1161 if (environment == (
const char *) NULL)
1162 return((
char *) NULL);
1163 return(ConstantString(environment));
1189MagickExport
unsigned char *GetStringInfoDatum(
const StringInfo *string_info)
1192 assert(string_info->signature == MagickCoreSignature);
1193 return(string_info->datum);
1218MagickExport
size_t GetStringInfoLength(
const StringInfo *string_info)
1221 assert(string_info->signature == MagickCoreSignature);
1222 return(string_info->length);
1247MagickExport
const char *GetStringInfoName(
const StringInfo *string_info)
1250 assert(string_info->signature == MagickCoreSignature);
1251 return(string_info->name);
1276MagickExport
const char *GetStringInfoPath(
const StringInfo *string_info)
1279 assert(string_info->signature == MagickCoreSignature);
1280 return(string_info->path);
1310MagickExport
double InterpretSiPrefixValue(
const char *magick_restrict
string,
1311 char **magick_restrict sentinel)
1319 value=InterpretLocaleValue(
string,&q);
1322 if ((*q >=
'E') && (*q <=
'z'))
1327 switch ((
int) ((
unsigned char) *q))
1329 case 'q': e=(-30.0);
break;
1330 case 'r': e=(-27.0);
break;
1331 case 'y': e=(-24.0);
break;
1332 case 'z': e=(-21.0);
break;
1333 case 'a': e=(-18.0);
break;
1334 case 'f': e=(-15.0);
break;
1335 case 'p': e=(-12.0);
break;
1336 case 'n': e=(-9.0);
break;
1337 case 'u': e=(-6.0);
break;
1338 case 'm': e=(-3.0);
break;
1339 case 'c': e=(-2.0);
break;
1340 case 'd': e=(-1.0);
break;
1341 case 'h': e=2.0;
break;
1342 case 'k': e=3.0;
break;
1343 case 'K': e=3.0;
break;
1344 case 'M': e=6.0;
break;
1345 case 'G': e=9.0;
break;
1346 case 'T': e=12.0;
break;
1347 case 'P': e=15.0;
break;
1348 case 'E': e=18.0;
break;
1349 case 'Z': e=21.0;
break;
1350 case 'Y': e=24.0;
break;
1351 case 'R': e=27.0;
break;
1352 case 'Q': e=30.0;
break;
1353 default: e=0.0;
break;
1355 if (e >= MagickEpsilon)
1359 value*=pow(2.0,e/0.3);
1369 if ((*q ==
'B') || (*q ==
'P'))
1372 if (sentinel != (
char **) NULL)
1403MagickExport MagickBooleanType IsStringTrue(
const char *value)
1405 if (value == (
const char *) NULL)
1406 return(MagickFalse);
1407 if (LocaleCompare(value,
"true") == 0)
1409 if (LocaleCompare(value,
"on") == 0)
1411 if (LocaleCompare(value,
"yes") == 0)
1413 if (LocaleCompare(value,
"1") == 0)
1415 return(MagickFalse);
1444MagickExport MagickBooleanType IsStringFalse(
const char *value)
1446 if (value == (
const char *) NULL)
1447 return(MagickFalse);
1448 if (LocaleCompare(value,
"false") == 0)
1450 if (LocaleCompare(value,
"off") == 0)
1452 if (LocaleCompare(value,
"no") == 0)
1454 if (LocaleCompare(value,
"0") == 0)
1456 return(MagickFalse);
1486MagickExport
void PrintStringInfo(FILE *file,
const char *
id,
1499 assert(
id != (
const char *) NULL);
1501 assert(string_info->signature == MagickCoreSignature);
1502 p=(
const unsigned char *) string_info->datum;
1503 for (i=0; i < string_info->length; i++)
1504 if ((p[i] < 32) && (isspace((
int)p[i]) == 0))
1506 (void) FormatLocaleFile(file,
"%s(%.17g):\n",
id,(
double) string_info->length);
1507 if (i == string_info->length)
1509 for (i = 0; i < string_info->length; i++)
1510 (
void) fputc(p[i],file);
1511 (void) fputc(
'\n',file);
1517 for (i=0; i < string_info->length; i+=CharsPerLine)
1519 (void) FormatLocaleFile(file,
"0x%08lx: ",(
unsigned long) i);
1520 for (j = 0; j < MagickMin(string_info->length-i, CharsPerLine); j++)
1522 (void) FormatLocaleFile(file,
"%02lx",(
unsigned long) (p[i+j]) & 0xff);
1523 if (((j+1) % 0x04) == 0)
1524 (void) fputc(
' ',file);
1529 for ( ; j < CharsPerLine; j++)
1531 (void) fputc(
' ',file);
1532 (void) fputc(
' ',file);
1533 if (((j+1) % 0x04) == 0)
1534 (void) fputc(
' ',file);
1536 (void) fputc(
' ',file);
1540 for (j=0; j < MagickMin(string_info->length-i,CharsPerLine); j++)
1542 unsigned char c = p[i+j];
1543 if (isprint((
int) c) != 0)
1544 (void) fputc(c,file);
1546 (
void) fputc(
'-',file);
1548 (void) fputc(
'\n',file);
1574MagickExport
void ResetStringInfo(
StringInfo *string_info)
1577 assert(string_info->signature == MagickCoreSignature);
1578 (void) memset(string_info->datum,0,string_info->length);
1607MagickExport
char *SanitizeStringForIdentifier(
const char *source)
1614 letters[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_",
1615 digits[] =
"0123456789";
1617 assert(source != (
const char *) NULL);
1618 sanitize_source=AcquireString(*source ==
'\0' ?
"_" : source);
1619 if (strchr(letters,(
int) ((
unsigned char) *sanitize_source)) == (
char *) NULL)
1620 *sanitize_source=
'_';
1621 for (p=sanitize_source+1; *p !=
'\0'; p++)
1622 if ((strchr(letters,(
int) ((
unsigned char) *p)) == (
char *) NULL) &&
1623 (strchr(digits,(
int) ((
unsigned char) *p)) == (
char *) NULL))
1625 return(sanitize_source);
1653MagickExport
char *SanitizeString(
const char *source)
1666 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 "
1667 "$-_.+!*'(),{}|\\^~[]`\"><#%;/?:@&=";
1669 sanitize_source=AcquireString(source);
1671 q=sanitize_source+strlen(sanitize_source);
1672 for (p+=strspn(p,allowlist); p != q; p+=(ptrdiff_t) strspn(p,allowlist))
1674 return(sanitize_source);
1701MagickExport
void SetStringInfo(
StringInfo *string_info,
1705 assert(string_info->signature == MagickCoreSignature);
1707 assert(source->signature == MagickCoreSignature);
1708 if (string_info->length == 0)
1710 (void) memset(string_info->datum,0,string_info->length);
1711 (void) memcpy(string_info->datum,source->datum,MagickMin(string_info->length,
1741MagickExport
void SetStringInfoDatum(
StringInfo *string_info,
1742 const unsigned char *source)
1745 assert(string_info->signature == MagickCoreSignature);
1746 if (string_info->length != 0)
1747 (void) memcpy(string_info->datum,source,string_info->length);
1774MagickExport
void SetStringInfoLength(
StringInfo *string_info,
1775 const size_t length)
1778 assert(string_info->signature == MagickCoreSignature);
1779 if (string_info->length == length)
1781 if (~length < MagickPathExtent)
1782 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
1783 string_info->length=length;
1784 if (string_info->datum == (
unsigned char *) NULL)
1785 string_info->datum=(
unsigned char *) AcquireQuantumMemory(length+
1786 MagickPathExtent,
sizeof(*string_info->datum));
1788 string_info->datum=(
unsigned char *) ResizeQuantumMemory(string_info->datum,
1789 length+MagickPathExtent,
sizeof(*string_info->datum));
1790 if (string_info->datum == (
unsigned char *) NULL)
1791 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
1818MagickExport
void SetStringInfoName(
StringInfo *string_info,
const char *name)
1821 assert(string_info->signature == MagickCoreSignature);
1822 assert(name != (
const char *) NULL);
1823 string_info->name=ConstantString(name);
1850MagickExport
void SetStringInfoPath(
StringInfo *string_info,
const char *path)
1853 assert(string_info->signature == MagickCoreSignature);
1854 assert(path != (
const char *) NULL);
1855 string_info->path=ConstantString(path);
1881 const size_t offset)
1887 assert(string_info->signature == MagickCoreSignature);
1888 if (offset > string_info->length)
1890 split_info=AcquireStringInfo(offset);
1891 SetStringInfo(split_info,string_info);
1892 (void) memmove(string_info->datum,string_info->datum+offset,
1893 string_info->length-offset+MagickPathExtent);
1894 SetStringInfoLength(string_info,string_info->length-offset);
1920MagickExport
char *StringInfoToDigest(
const StringInfo *signature)
1928 signature_info=AcquireSignatureInfo();
1929 UpdateSignature(signature_info,signature);
1930 FinalizeSignature(signature_info);
1931 digest=StringInfoToHexString(GetSignatureDigest(signature_info));
1932 signature_info=DestroySignatureInfo(signature_info);
1958MagickExport
char *StringInfoToHexString(
const StringInfo *string_info)
1978 length=string_info->length;
1979 if (~length < MagickPathExtent)
1980 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
1981 string=(
char *) AcquireQuantumMemory(length+MagickPathExtent,2*
1983 if (
string == (
char *) NULL)
1984 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
2001 p=string_info->datum;
2002 q=(
unsigned char *)
string;
2003 for (i=0; i < (ssize_t) string_info->length; i++)
2005 *q++=hex_digits[(*p >> 4) & 0x0f];
2006 *q++=hex_digits[*p & 0x0f];
2035MagickExport
char *StringInfoToString(
const StringInfo *string_info)
2043 string=(
char *) NULL;
2044 length=string_info->length;
2045 if (~length >= (MagickPathExtent-1))
2046 string=(
char *) AcquireQuantumMemory(length+MagickPathExtent,
2048 if (
string == (
char *) NULL)
2049 return((
char *) NULL);
2050 (void) memcpy(
string,(
char *) string_info->datum,length*
sizeof(*
string));
2051 string[length]=
'\0';
2089MagickExport
char **StringToArgv(
const char *text,
int *argc)
2104 if (text == (
const char *) NULL)
2105 return((
char **) NULL);
2111 while ((isspace((
int) ((
unsigned char) *p)) != 0) || (*p ==
'`'))
2119 if ((*p ==
'&') && (*(p+1) ==
'&'))
2124 if ((*p ==
'|') && (*(p+1) ==
'|'))
2129 if ((*p ==
';') || (*p ==
'&') || (*p ==
'|'))
2137 while ((*p !=
'\0') &&
2138 (isspace((
int) ((
unsigned char) *p)) == 0) &&
2139 (*p !=
'`') && (*p !=
';') && (*p !=
'&') && (*p !=
'|'))
2148 if ((*p ==
'"') || (*p ==
'\''))
2150 const char quote = (*p++);
2151 while ((*p != quote) && (*p !=
'\0'))
2153 if ((quote ==
'"') && (*p ==
'\\'))
2173 argv=(
char **) AcquireQuantumMemory((
size_t) *argc+1UL,
sizeof(*argv));
2174 if (argv == (
char **) NULL)
2175 ThrowFatalException(ResourceLimitFatalError,
"UnableToConvertStringToARGV");
2179 argv[0]=AcquireString(GetClientName());
2181 for (i=1; i < (ssize_t) *argc; i++)
2192 while ((isspace((
int) ((
unsigned char) *p)) != 0) || (*p ==
'`'))
2195 if ((*q ==
'&') && (*(q+1) ==
'&'))
2198 if ((*q ==
'|') && (*(q+1) ==
'|'))
2201 if ((*q ==
';') || (*q ==
'&') || (*q ==
'|'))
2205 while ((*q !=
'\0') &&
2206 (isspace((
int) ((
unsigned char) *q)) == 0) &&
2207 (*q !=
'`') && (*q !=
';') && (*q !=
'&') && (*q !=
'|'))
2216 if ((*q ==
'"') || (*q ==
'\''))
2218 const char quote = (*q++);
2219 while ((*q != quote) && (*q !=
'\0'))
2221 if ((quote ==
'"') && (*q ==
'\\'))
2240 argv[i]=(
char *) AcquireQuantumMemory((
size_t) (q-p)+MagickPathExtent,
2242 if (argv[i] == (
char *) NULL)
2244 for (i--; i >= 0; i--)
2245 argv[i]=DestroyString(argv[i]);
2246 argv=(
char **) RelinquishMagickMemory(argv);
2247 ThrowFatalException(ResourceLimitFatalError,
2248 "UnableToConvertStringToARGV");
2253 if (((p != q) && ((*p ==
';') || (*p ==
'&') || (*p ==
'|'))))
2256 argv[i][length++]=(*p++);
2266 argv[i][length++]=(*p++);
2269 if ((*p ==
'"') || (*p ==
'\''))
2271 const char quote = *p++;
2272 while ((p < q) && (*p != quote))
2274 if ((quote ==
'"') && (*p ==
'\\'))
2278 argv[i][length++]=(*p++);
2281 argv[i][length++]=(*p++);
2283 if ((p < q) && (*p == quote))
2287 argv[i][length++]=(*p++);
2290 argv[i][length]=
'\0';
2292 argv[i]=(
char *) NULL;
2331MagickExport
double *StringToArrayOfDoubles(
const char *
string,ssize_t *count,
2350 assert(exception->signature == MagickCoreSignature);
2352 if (
string == (
char *) NULL)
2353 return((
double *) NULL);
2358 (void) StringToDouble(p,&q);
2360 return((
double *) NULL);
2363 while (isspace((
int) ((
unsigned char) *p)) != 0)
2367 while (isspace((
int) ((
unsigned char) *p)) != 0)
2374 array=(
double *) AcquireQuantumMemory((
size_t) i,
sizeof(*array));
2375 if (array == (
double *) NULL)
2377 (void) ThrowMagickException(exception,GetMagickModule(),
2378 ResourceLimitError,
"MemoryAllocationFailed",
"`%s'",
"");
2379 return((
double *) NULL);
2386 while ((*p !=
'\0') && (i < *count))
2388 array[i++]=StringToDouble(p,&q);
2390 while ((isspace((
int) ((
unsigned char) *p)) != 0) || (*p ==
','))
2430MagickExport
char *StringToken(
const char *delimiters,
char **
string)
2446 if (p == (
char *) NULL)
2447 return((
char *) NULL);
2465 }
while (d !=
'\0');
2493MagickExport
char **StringToList(
const char *text)
2495 return(StringToStrings(text,(
size_t *) NULL));
2524MagickExport
char **StringToStrings(
const char *text,
size_t *count)
2538 if (text == (
char *) NULL)
2540 if (count != (
size_t *) NULL)
2542 return((
char **) NULL);
2544 for (p=text; *p !=
'\0'; p++)
2545 if (((
int) ((
unsigned char) *p) < 32) &&
2546 (isspace((
int) ((
unsigned char) *p)) == 0))
2557 for (p=text; *p !=
'\0'; p++)
2560 textlist=(
char **) AcquireQuantumMemory((
size_t) lines+1UL,
2562 if (textlist == (
char **) NULL)
2563 return((
char **) NULL);
2565 for (i=0; i < (ssize_t) lines; i++)
2567 for (q=p; *q !=
'\0'; q++)
2568 if ((*q ==
'\r') || (*q ==
'\n'))
2570 textlist[i]=(
char *) AcquireQuantumMemory((
size_t) (q-p)+1,
2571 sizeof(**textlist));
2572 if (textlist[i] == (
char *) NULL)
2577 for (j=0; j < i; j++)
2578 textlist[j]=DestroyString(textlist[j]);
2579 textlist=(
char **) RelinquishMagickMemory(textlist);
2580 return((
char **) NULL);
2582 (void) memcpy(textlist[i],p,(
size_t) (q-p));
2583 textlist[i][q-p]=
'\0';
2592 hex_string[MagickPathExtent];
2603 lines=(size_t) (strlen(text)/CharsPerLine)+1;
2604 textlist=(
char **) AcquireQuantumMemory((
size_t) lines+1UL,
2606 if (textlist == (
char **) NULL)
2607 return((
char **) NULL);
2609 for (i=0; i < (ssize_t) lines; i++)
2614 textlist[i]=(
char *) AcquireQuantumMemory(2UL*MagickPathExtent,
2615 sizeof(**textlist));
2616 if (textlist[i] == (
char *) NULL)
2618 for (j=0; j < i; j++)
2619 textlist[j]=DestroyString(textlist[j]);
2620 textlist=(
char **) RelinquishMagickMemory(textlist);
2621 return((
char **) NULL);
2623 (void) FormatLocaleString(textlist[i],MagickPathExtent,
"0x%08lx: ",
2624 (
long) (CharsPerLine*i));
2625 q=textlist[i]+strlen(textlist[i]);
2627 for (j=1; j <= (ssize_t) MagickMin(length,CharsPerLine); j++)
2629 (void) FormatLocaleString(hex_string,MagickPathExtent,
"%02x",*(p+j));
2630 (void) CopyMagickString(q,hex_string,MagickPathExtent);
2632 if ((j % 0x04) == 0)
2635 for ( ; j <= CharsPerLine; j++)
2639 if ((j % 0x04) == 0)
2643 for (j=1; j <= (ssize_t) MagickMin(length,CharsPerLine); j++)
2645 if (isprint((
int) ((
unsigned char) *p)) != 0)
2656 resized=(
char *) ResizeQuantumMemory(textlist[i],(
size_t) (q-
2657 textlist[i]+1),
sizeof(**textlist));
2658 if (resized == (
char *) NULL)
2660 textlist[i]=(
char *) NULL;
2661 for (j=0; j < i; j++)
2662 textlist[j]=DestroyString(textlist[j]);
2663 textlist=(
char **) RelinquishMagickMemory(textlist);
2664 return((
char **) NULL);
2666 textlist[i]=resized;
2670 if (count != (
size_t *) NULL)
2672 textlist[i]=(
char *) NULL;
2698MagickExport
StringInfo *StringToStringInfo(
const char *
string)
2703 assert(
string != (
const char *) NULL);
2704 string_info=AcquireStringInfo(strlen(
string));
2705 SetStringInfoDatum(string_info,(
const unsigned char *)
string);
2706 return(string_info);
2733MagickExport
void StripString(
char *message)
2735 (void) StripMagickString(message);
2738MagickExport
size_t StripMagickString(
char *message)
2747 assert(message != (
char *) NULL);
2748 if (*message ==
'\0')
2750 length=strlen(message);
2754 while (isspace((
int) ((
unsigned char) *p)) != 0)
2756 if ((*p ==
'\'') || (*p ==
'"'))
2759 while ((isspace((
int) ((
unsigned char) *q)) != 0) && (q > p))
2762 if ((*q ==
'\'') || (*q ==
'"'))
2764 (void) memmove(message,p,(
size_t) (q-p+1));
2765 message[q-p+1]=
'\0';
2766 for (p=message; *p !=
'\0'; p++)
2769 return((
size_t) (q-p+1));
2803MagickExport MagickBooleanType SubstituteString(
char **
string,
2804 const char *search,
const char *replace)
2823 for (p=strchr(*
string,*search); p != (
char *) NULL; p=strchr(p+1,*search))
2825 if (search_extent == 0)
2826 search_extent=strlen(search);
2827 if (strncmp(p,search,search_extent) != 0)
2833 if (replace_extent == 0)
2834 replace_extent=strlen(replace);
2835 if (replace_extent > search_extent)
2840 offset=(ssize_t) (p-(*
string));
2841 extent=strlen(*
string)+replace_extent-search_extent+1;
2842 *
string=(
char *) ResizeQuantumMemory(*
string,
2843 OverAllocateMemory(extent+MagickPathExtent),
sizeof(*p));
2844 if (*
string == (
char *) NULL)
2845 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
2851 if (search_extent != replace_extent)
2852 (void) memmove(p+replace_extent,p+search_extent,
2853 strlen(p+search_extent)+1);
2854 (void) memcpy(p,replace,replace_extent);
2855 p+=(ptrdiff_t) replace_extent-1;