174#ifndef SCRIPT_TOKEN_TESTING
175# include "MagickWand/studio.h"
176# include "MagickWand/MagickWand.h"
177# include "MagickWand/script-token.h"
178# include "MagickCore/exception-private.h"
179# include "MagickCore/policy.h"
180# include "MagickCore/policy-private.h"
181# include "MagickCore/string-private.h"
182# include "MagickCore/utility-private.h"
208WandExport
ScriptTokenInfo *AcquireScriptTokenInfo(
const char *filename)
213 if (IsPathAuthorized(ReadPolicyRights,filename) == MagickFalse)
215 token_info=(
ScriptTokenInfo *) AcquireMagickMemory(
sizeof(*token_info));
218 (void) memset(token_info,0,
sizeof(*token_info));
220 token_info->opened=MagickFalse;
221 if ( LocaleCompare(filename,
"-") == 0 ) {
222 token_info->stream=stdin;
223 token_info->opened=MagickFalse;
225 else if (LocaleNCompare(filename,
"fd:",3) == 0 ) {
226 token_info->stream=fdopen(StringToLong(filename+3),
"r");
227 token_info->opened=MagickFalse;
230 token_info->stream=fopen_utf8(filename,
"r");
232 if ( token_info->stream == (FILE *) NULL ) {
237 token_info->curr_line=1;
238 token_info->length=INITAL_TOKEN_LENGTH;
239 token_info->token=(
char *) AcquireQuantumMemory(1,token_info->length);
241 token_info->status=(token_info->token != (
char *) NULL)
242 ? TokenStatusOK : TokenStatusMemoryFailed;
243 token_info->signature=MagickWandSignature;
274 assert(token_info->signature == MagickWandSignature);
276 if ( token_info->opened != MagickFalse )
277 (void) fclose(token_info->stream);
279 if (token_info->token != (
char *) NULL )
280 token_info->token=(
char *) RelinquishMagickMemory(token_info->token);
325 c=fgetc(token_info->stream); \
326 token_info->curr_column++; \
328 c=fgetc(token_info->stream); \
329 ungetc(c,token_info->stream); \
330 c = (c!='\n')?'\n':'\r'; \
333 token_info->curr_line++, token_info->curr_column=0; \
336 if ( (c>='\0' && c<'\a') || (c>'\r' && c<' ' && c!='\033') ) { \
337 token_info->status=TokenStatusBinary; \
344 if ((size_t) offset >= (token_info->length-1)) { \
345 if (token_info == (ScriptTokenInfo *) NULL) \
347 if ( token_info->length >= MagickPathExtent ) \
348 token_info->length += MagickPathExtent; \
350 token_info->length *= 4; \
351 token_info->token=(char *) ResizeQuantumMemory(token_info->token, \
352 token_info->length,sizeof(*token_info->token)); \
353 if ( token_info->token == (char *) NULL ) { \
354 token_info->status=TokenStatusMemoryFailed; \
358 if ( token_info->token == (char *) NULL ) \
359 token_info->status=TokenStatusMemoryFailed; \
361 token_info->token[offset++]=(char) (c); \
364WandExport MagickBooleanType GetScriptToken(
ScriptTokenInfo *token_info)
379 if (token_info->status != TokenStatusOK)
381 token_info->token[0]=
'\0';
387DisableMSCWarning(4127)
395 if ( state == IN_COMMENT ) {
401 if ( state == IN_WHITE )
403 ( token_info->curr_column==1 && (c ==
':' || c ==
'@' ) ) )
406 if (strchr(
" \n\r\t",c) != (
char *) NULL) {
409 token_info->token[offset]=
'\0';
418 if ( c==
'\'' || c ==
'"' ) {
421 token_info->token_line=token_info->curr_line;
422 token_info->token_column=token_info->curr_column;
443 if ( state==IN_QUOTE && quote ==
'\'' ) {
463 token_info->token_line=token_info->curr_line;
464 token_info->token_column=token_info->curr_column;
468 if (c != quote && c !=
'\\')
478 token_info->token_line=token_info->curr_line;
479 token_info->token_column=token_info->curr_column;
491 token_info->token[offset]=
'\0';
492 if ( token_info->status != TokenStatusOK )
494 token_info->status = TokenStatusEOF;
495 if ( state == IN_QUOTE)
496 token_info->status = TokenStatusBadQuotes;
497 if ( state == IN_TOKEN)