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),
"rb");
227 token_info->opened=MagickFalse;
230 int fd = open_utf8(filename,O_RDONLY | O_CLOEXEC | O_NOFOLLOW,0);
232 token_info->stream=fdopen(fd,
"r");
233 if (token_info->stream != (FILE *) NULL)
234 token_info->opened=MagickTrue;
238 if ((token_info->stream != (FILE *) NULL) &&
239 (IsPathAuthorized(ReadPolicyRights,filename) != MagickFalse))
240 token_info->opened=MagickTrue;
247 token_info->curr_line=1;
248 token_info->length=INITAL_TOKEN_LENGTH;
249 token_info->token=(
char *) AcquireQuantumMemory(1,token_info->length);
251 token_info->status=(token_info->token != (
char *) NULL)
252 ? TokenStatusOK : TokenStatusMemoryFailed;
253 token_info->signature=MagickWandSignature;
284 assert(token_info->signature == MagickWandSignature);
286 if ( token_info->opened != MagickFalse )
287 (void) fclose(token_info->stream);
289 if (token_info->token != (
char *) NULL )
290 token_info->token=(
char *) RelinquishMagickMemory(token_info->token);
335 c=fgetc(token_info->stream); \
336 token_info->curr_column++; \
338 c=fgetc(token_info->stream); \
339 ungetc(c,token_info->stream); \
340 c = (c!='\n')?'\n':'\r'; \
343 token_info->curr_line++, token_info->curr_column=0; \
346 if ( (c>='\0' && c<'\a') || (c>'\r' && c<' ' && c!='\033') ) { \
347 token_info->status=TokenStatusBinary; \
354 if ((size_t) offset >= (token_info->length-1)) { \
355 if (token_info == (ScriptTokenInfo *) NULL) \
357 if ( token_info->length >= MagickPathExtent ) \
358 token_info->length += MagickPathExtent; \
360 token_info->length *= 4; \
361 token_info->token=(char *) ResizeQuantumMemory(token_info->token, \
362 token_info->length,sizeof(*token_info->token)); \
363 if ( token_info->token == (char *) NULL ) { \
364 token_info->status=TokenStatusMemoryFailed; \
368 if ( token_info->token == (char *) NULL ) \
369 token_info->status=TokenStatusMemoryFailed; \
371 token_info->token[offset++]=(char) (c); \
374WandExport MagickBooleanType GetScriptToken(
ScriptTokenInfo *token_info)
389 if (token_info->status != TokenStatusOK)
391 token_info->token[0]=
'\0';
397DisableMSCWarning(4127)
405 if ( state == IN_COMMENT ) {
411 if ( state == IN_WHITE )
413 ( token_info->curr_column==1 && (c ==
':' || c ==
'@' ) ) )
416 if (strchr(
" \n\r\t",c) != (
char *) NULL) {
419 token_info->token[offset]=
'\0';
428 if ( c==
'\'' || c ==
'"' ) {
431 token_info->token_line=token_info->curr_line;
432 token_info->token_column=token_info->curr_column;
453 if ( state==IN_QUOTE && quote ==
'\'' ) {
473 token_info->token_line=token_info->curr_line;
474 token_info->token_column=token_info->curr_column;
478 if (c != quote && c !=
'\\')
488 token_info->token_line=token_info->curr_line;
489 token_info->token_column=token_info->curr_column;
501 token_info->token[offset]=
'\0';
502 if ( token_info->status != TokenStatusOK )
504 token_info->status = TokenStatusEOF;
505 if ( state == IN_QUOTE)
506 token_info->status = TokenStatusBadQuotes;
507 if ( state == IN_TOKEN)