43 #include "magick/studio.h"
44 #include "magick/exception.h"
45 #include "magick/exception-private.h"
46 #include "magick/image.h"
47 #include "magick/image-private.h"
48 #include "magick/locale-private.h"
49 #include "magick/memory_.h"
50 #include "magick/string_.h"
51 #include "magick/string-private.h"
52 #include "magick/token.h"
53 #include "magick/token-private.h"
54 #include "magick/utility.h"
95 MagickExport
TokenInfo *AcquireTokenInfo(
void)
100 token_info=(
TokenInfo *) AcquireMagickMemory(
sizeof(*token_info));
102 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
103 token_info->signature=MagickCoreSignature;
132 assert(token_info != (
TokenInfo *) NULL);
133 assert(token_info->signature == MagickCoreSignature);
134 if (IsEventLogging() != MagickFalse)
135 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
136 token_info->signature=(~MagickCoreSignature);
137 token_info=(
TokenInfo *) RelinquishMagickMemory(token_info);
176 MagickExport magick_hot_spot
size_t GetNextToken(
177 const char *magick_restrict start,
const char **magick_restrict end,
178 const size_t extent,
char *magick_restrict token)
192 assert(start != (
const char *) NULL);
193 assert(token != (
char *) NULL);
196 while ((isspace((
int) ((
unsigned char) *p)) != 0) && (*p !=
'\0'))
212 case '"': escape=
'"';
break;
213 case '\'': escape=
'\'';
break;
214 case '`': escape=
'\'';
break;
215 case '{': escape=
'}';
break;
216 default: escape=(*p);
break;
218 for (p++; *p !=
'\0'; p++)
220 if ((*p ==
'\\') && ((*(p+1) == escape) || (*(p+1) ==
'\\')))
228 if (i < (ssize_t) (extent-1))
230 if ((
size_t) (p-start) >= (extent-1))
237 if (i < (ssize_t) (extent-1))
240 if ((*p ==
'>') || (*p ==
'/'))
242 if (i < (ssize_t) (extent-1))
253 value=StringToDouble(p,&q);
255 if ((p != q) && (*p !=
','))
257 for ( ; (p < q) && (*p !=
','); p++)
259 if (i < (ssize_t) (extent-1))
261 if ((
size_t) (p-start) >= (extent-1))
266 if (i < (ssize_t) (extent-1))
272 if ((*p !=
'\0') && (isalpha((
int) ((
unsigned char) *p)) == 0) &&
273 (*p != *DirectorySeparator) && (*p !=
'#') && (*p !=
'<'))
275 if (i < (ssize_t) (extent-1))
280 for ( ; *p !=
'\0'; p++)
282 if (((isspace((
int) ((
unsigned char) *p)) != 0) || (*p ==
'=') ||
283 (*p ==
',') || (*p ==
':') || (*p ==
';')) && (*(p-1) !=
'\\'))
285 if ((i > 0) && (*p ==
'<'))
287 if (i < (ssize_t) (extent-1))
293 for (p++; *p !=
'\0'; p++)
295 if (i < (ssize_t) (extent-1))
297 if ((*p ==
')') && (*(p-1) !=
'\\'))
299 if ((
size_t) (p-start) >= (extent-1))
305 if ((
size_t) (p-start) >= (extent-1))
312 if (LocaleNCompare(token,
"url(#",5) == 0)
314 q=strrchr(token,
')');
315 if (q != (
char *) NULL)
318 (void) memmove(token,token+5,(
size_t) (q-token-4));
321 while (isspace((
int) ((
unsigned char) *p)) != 0)
323 if (end != (
const char **) NULL)
324 *end=(
const char *) p;
357 MagickExport MagickBooleanType GlobExpression(
358 const char *magick_restrict expression,
const char *magick_restrict pattern,
359 const MagickBooleanType case_insensitive)
371 if (pattern == (
char *) NULL)
373 if (GetUTFCode(pattern) == 0)
375 if (LocaleCompare(pattern,
"*") == 0)
377 p=pattern+strlen(pattern)-1;
378 if ((GetUTFCode(p) ==
']') && (strchr(pattern,
'[') != (
char *) NULL))
389 image_info=AcquireImageInfo();
390 (void) CopyMagickString(image_info->filename,pattern,MaxTextExtent);
391 exception=AcquireExceptionInfo();
392 (void) SetImageInfo(image_info,0,exception);
393 exception=DestroyExceptionInfo(exception);
394 if (LocaleCompare(image_info->filename,pattern) != 0)
396 image_info=DestroyImageInfo(image_info);
399 image_info=DestroyImageInfo(image_info);
405 while ((GetUTFCode(pattern) != 0) && (done == MagickFalse))
407 if (GetUTFCode(expression) == 0)
408 if ((GetUTFCode(pattern) !=
'{') && (GetUTFCode(pattern) !=
'*'))
410 switch (GetUTFCode(pattern))
418 while (GetUTFCode(pattern) ==
'*')
419 pattern+=GetUTFOctets(pattern);
420 while ((GetUTFCode(expression) != 0) && (status == MagickFalse))
422 status=GlobExpression(expression,pattern,case_insensitive);
423 expression+=GetUTFOctets(expression);
425 if (status != MagickFalse)
427 while (GetUTFCode(expression) != 0)
428 expression+=GetUTFOctets(expression);
429 while (GetUTFCode(pattern) != 0)
430 pattern+=GetUTFOctets(pattern);
439 pattern+=GetUTFOctets(pattern);
442 if ((GetUTFCode(pattern) == 0) || (GetUTFCode(pattern) ==
']'))
447 if (GetUTFCode(pattern) ==
'\\')
449 pattern+=GetUTFOctets(pattern);
450 if (GetUTFCode(pattern) == 0)
456 if (GetUTFCode(pattern+GetUTFOctets(pattern)) ==
'-')
458 c=GetUTFCode(pattern);
459 pattern+=GetUTFOctets(pattern);
460 pattern+=GetUTFOctets(pattern);
461 if (GetUTFCode(pattern) ==
']')
466 if (GetUTFCode(pattern) ==
'\\')
468 pattern+=GetUTFOctets(pattern);
469 if (GetUTFCode(pattern) == 0)
475 if ((GetUTFCode(expression) < c) ||
476 (GetUTFCode(expression) > GetUTFCode(pattern)))
478 pattern+=GetUTFOctets(pattern);
483 if (GetUTFCode(pattern) != GetUTFCode(expression))
485 pattern+=GetUTFOctets(pattern);
488 pattern+=GetUTFOctets(pattern);
489 while ((GetUTFCode(pattern) !=
']') && (GetUTFCode(pattern) != 0))
491 if ((GetUTFCode(pattern) ==
'\\') &&
492 (GetUTFCode(pattern+GetUTFOctets(pattern)) > 0))
493 pattern+=GetUTFOctets(pattern);
494 pattern+=GetUTFOctets(pattern);
496 if (GetUTFCode(pattern) != 0)
498 pattern+=GetUTFOctets(pattern);
499 expression+=GetUTFOctets(expression);
507 pattern+=GetUTFOctets(pattern);
508 expression+=GetUTFOctets(expression);
519 target=AcquireString(pattern);
522 while ((GetUTFCode(pattern) !=
'}') && (GetUTFCode(pattern) != 0))
525 if ((GetUTFCode(pattern) ==
',') || (GetUTFCode(pattern) ==
'}'))
528 match=GlobExpression(expression,target,case_insensitive);
529 if (match != MagickFalse)
531 expression+=MagickMin(strlen(expression),strlen(target));
535 pattern+=GetUTFOctets(pattern);
538 while ((GetUTFCode(pattern) !=
'}') && (GetUTFCode(pattern) != 0))
539 pattern+=GetUTFOctets(pattern);
540 if (GetUTFCode(pattern) != 0)
541 pattern+=GetUTFOctets(pattern);
542 target=DestroyString(target);
547 pattern+=GetUTFOctets(pattern);
548 if (GetUTFCode(pattern) == 0)
553 if (case_insensitive != MagickFalse)
555 if (LocaleToLowercase((
int) GetUTFCode(expression)) != LocaleToLowercase((
int) GetUTFCode(pattern)))
562 if (GetUTFCode(expression) != GetUTFCode(pattern))
567 expression+=GetUTFOctets(expression);
568 pattern+=GetUTFOctets(pattern);
572 while (GetUTFCode(pattern) ==
'*')
573 pattern+=GetUTFOctets(pattern);
574 match=(GetUTFCode(expression) == 0) && (GetUTFCode(pattern) == 0) ?
575 MagickTrue : MagickFalse;
602 MagickExport MagickBooleanType IsGlob(
const char *path)
605 status = MagickFalse;
610 if (IsPathAccessible(path) != MagickFalse)
612 for (p=path; *p !=
'\0'; p++)
659 MagickExport MagickBooleanType IsMagickTrue(
const char *value)
661 if (value == (
const char *) NULL)
663 if (LocaleCompare(value,
"true") == 0)
665 if (LocaleCompare(value,
"on") == 0)
667 if (LocaleCompare(value,
"yes") == 0)
669 if (LocaleCompare(value,
"1") == 0)
841 static ssize_t sindex(
int c,
const char *
string)
846 for (p=
string; *p !=
'\0'; p++)
848 return((ssize_t) (p-
string));
852 static void StoreToken(
TokenInfo *token_info,
char *
string,
853 size_t max_token_length,
int c)
858 if ((token_info->offset < 0) ||
859 ((
size_t) token_info->offset >= (max_token_length-1)))
861 i=token_info->offset++;
863 if (token_info->state == IN_QUOTE)
865 switch (token_info->flag & 0x03)
869 string[i]=(char) LocaleToUppercase(c);
874 string[i]=(char) LocaleToLowercase(c);
882 MagickExport
int Tokenizer(
TokenInfo *token_info,
const unsigned flag,
883 char *token,
const size_t max_token_length,
const char *line,
const char *white,
884 const char *break_set,
const char *quote,
const char escape,
char *breaker,
885 int *next,
char *quoted)
895 if (line[*next] ==
'\0')
897 token_info->state=IN_WHITE;
898 token_info->quote=(char) MagickFalse;
899 token_info->flag=flag;
900 for (token_info->offset=0; (
int) line[*next] != 0; (*next)++)
903 i=sindex(c,break_set);
906 switch (token_info->state)
913 *breaker=break_set[i];
914 token[token_info->offset]=
'\0';
919 StoreToken(token_info,token,max_token_length,c);
928 switch (token_info->state)
932 token_info->state=IN_QUOTE;
933 token_info->quote=quote[i];
934 *quoted=(char) MagickTrue;
939 if (quote[i] != token_info->quote)
940 StoreToken(token_info,token,max_token_length,c);
943 token_info->state=IN_OZONE;
944 token_info->quote=
'\0';
952 token[token_info->offset]=
'\0';
961 switch (token_info->state)
968 token_info->state=IN_OZONE;
973 StoreToken(token_info,token,max_token_length,c);
979 if (c == (
int) escape)
981 if (line[(*next)+1] ==
'\0')
984 StoreToken(token_info,token,max_token_length,c);
986 token[token_info->offset]=
'\0';
989 switch (token_info->state)
994 token_info->state=IN_TOKEN;
1001 c=(int) line[*next];
1002 StoreToken(token_info,token,max_token_length,c);
1007 token[token_info->offset]=
'\0';
1013 switch (token_info->state)
1017 token_info->state=IN_TOKEN;
1018 StoreToken(token_info,token,max_token_length,c);
1024 StoreToken(token_info,token,max_token_length,c);
1029 token[token_info->offset]=
'\0';
1034 token[token_info->offset]=
'\0';