1/*
2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3%                                                                             %
4%                                                                             %
5%    SSS    CCC  RRRR   III  PPPP  TTTTT    TTTTT  OOO   K  K  EEEE  N   N    %
6%   S      C     R   R   I   P   P   T        T   O   O  K K   E     NN  N    %
7%    SSS   C     RRRR    I   PPPP    T        T   O   O  KK    EEE   N N N    %
8%       S  C     R R     I   P       T        T   O   O  K K   E     N  NN    %
9%   SSSS    CCC  R  RR  III  P       T        T    OOO   K  K  EEEE  N   N    %
10%                                                                             %
11%                         TTTTT  EEEEE  SSSSS  TTTTT                          %
12%                           T    E      SS       T                            %
13%                           T    EEE     SSS     T                            %
14%                           T    E         SS    T                            %
15%                           T    EEEEE  SSSSS    T                            %
16%                                                                             %
17%       Perform "Magick" on Images via the Command Line Interface             %
18%                                                                             %
19%                             Dragon Computing                                %
20%                             Anthony Thyssen                                 %
21%                               January 2012                                  %
22%                                                                             %
23%                                                                             %
24%  Copyright 1999-2016 ImageMagick Studio LLC, a non-profit organization      %
25%  dedicated to making software imaging solutions freely available.           %
26%                                                                             %
27%  You may not use this file except in compliance with the License.  You may  %
28%  obtain a copy of the License at                                            %
29%                                                                             %
30%    http://www.imagemagick.org/script/license.php                            %
31%                                                                             %
32%  Unless required by applicable law or agreed to in writing, software        %
33%  distributed under the License is distributed on an "AS IS" BASIS,          %
34%  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
35%  See the License for the specific language governing permissions and        %
36%  limitations under the License.                                             %
37%                                                                             %
38%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
39%
40%  Test the raw tokanization of the  ScriptToken Subroutines
41%
42%  This actually uses very little of the magic core functions
43%  and in fact creates a completely stand-alone program by substituting
44%  required MagickCore with direct system equivelents.
45%
46%  Build
47%     cc     script-token-test.c   -o script-token-test
48%
49%  For testing see  script-token-test.sh
50%
51*/
52
53/* System Replacement for MagickWand includes */
54#include <stdio.h>
55#include <string.h>
56#include <stdlib.h>
57#include <assert.h>
58#include <errno.h>
59
60/* Defines to replace MagickWand / MagickCore defintions */
61#define MagickPathExtent     4096
62#define MagickFalse       0
63#define MagickTrue        1
64#define MagickBooleanType int
65
66#define AcquireMagickMemory(s)    malloc(s)
67#define RelinquishMagickMemory(p) (free(p),NULL)
68#define ResizeMagickMemory(p,s)   realloc(p,s)
69#define ResetMagickMemory(p,b,s)  memset(p,b,s)
70#define StringToLong(s)           strtol(s,(char **) NULL,10)
71#define LocaleCompare(p,q)        strcasecmp(p,q)
72#define LocaleNCompare(p,q,l)     strncasecmp(p,q,l)
73#define WandSignature             0xabacadabUL
74#define fopen_utf8(p,q)           fopen(p,q)
75#define WandExport
76
77/* Include the actual code for ScriptToken functions */
78#define SCRIPT_TOKEN_TESTING  1 /* Prevent MagickWand Includes */
79#include "../script-token.h"
80#include "../script-token.c"
81
82/* Test program to report what tokens it finds in given input file/stream */
83
84int main(int argc, char *argv[])
85{
86  ScriptTokenInfo
87     *token_info;
88
89  token_info = AcquireScriptTokenInfo( (argc>1) ? argv[1] : "-" );
90  if (token_info == (ScriptTokenInfo *) NULL) {
91    printf("Script Open Failure : %s\n", strerror(errno));
92    return(1);
93  }
94
95  while (1) {
96    if( GetScriptToken(token_info) == MagickFalse )
97      break;
98
99    if( strlen(token_info->token) > INITAL_TOKEN_LENGTH-1 ) {
100      token_info->token[INITAL_TOKEN_LENGTH-4] = '.';
101      token_info->token[INITAL_TOKEN_LENGTH-3] = '.';
102      token_info->token[INITAL_TOKEN_LENGTH-2] = '.';
103      token_info->token[INITAL_TOKEN_LENGTH-1] = '\0';
104    }
105    printf("l=%d, c=%d, stat=%d, len=%d, token=\"%s\"\n",
106         token_info->token_line, token_info->token_column,
107         token_info->status, token_info->length, token_info->token);
108  }
109
110  switch( token_info->status ) {
111    case TokenStatusOK:
112      break;
113    case TokenStatusEOF:
114      printf("EOF Found\n");
115      break;
116    case TokenStatusBadQuotes:
117      /* Ensure last token has a sane length for error report */
118      if( strlen(token_info->token) > INITAL_TOKEN_LENGTH-1 ) {
119        token_info->token[INITAL_TOKEN_LENGTH-4] = '.';
120        token_info->token[INITAL_TOKEN_LENGTH-3] = '.';
121        token_info->token[INITAL_TOKEN_LENGTH-2] = '.';
122        token_info->token[INITAL_TOKEN_LENGTH-1] = '\0';
123      }
124      printf("Bad Quotes l=%d, c=%d  token=\"%s\"\n",
125           token_info->token_line,token_info->token_column, token_info->token);
126      break;
127    case TokenStatusMemoryFailed: /* token is invalid */
128      printf("Out of Memory  l=%d, c=%d\n",
129           token_info->token_line,token_info->token_column);
130      break;
131    case TokenStatusBinary:       /* token is invalid */
132      printf("Binary Char at l=%d, c=%d\n",
133           token_info->curr_line,token_info->curr_column);
134      break;
135  }
136
137  /* Clean up */
138  token_info = DestroyScriptTokenInfo(token_info);
139
140  return(0);
141}
142