]> granicus.if.org Git - imagemagick/blobdiff - MagickCore/token.c
(no commit message)
[imagemagick] / MagickCore / token.c
index 5d8b0bf6afe7fa3c39099fd872c9cafff07b1f79..88d3031f95e08a8af7f3ad2871666769caf99c74 100644 (file)
 %                         MagickCore Token Methods                            %
 %                                                                             %
 %                             Software Design                                 %
-%                               John Cristy                                   %
+%                                  Cristy                                     %
 %                              January 1993                                   %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2013 ImageMagick Studio LLC, a non-profit organization      %
+%  Copyright 1999-2014 ImageMagick Studio LLC, a non-profit organization      %
 %  dedicated to making software imaging solutions freely available.           %
 %                                                                             %
 %  You may not use this file except in compliance with the License.  You may  %
@@ -180,95 +180,92 @@ MagickExport void GetMagickToken(const char *start,const char **end,char *token)
   assert(start != (const char *) NULL);
   assert(token != (char *) NULL);
   i=0;
-  for (p=start; *p != '\0'; )
+  p=start;
+  while ((isspace((int) ((unsigned char) *p)) != 0) && (*p != '\0'))
+    p++;
+  switch (*p)
   {
-    while ((isspace((int) ((unsigned char) *p)) != 0) && (*p != '\0'))
-      p++;
-    if (*p == '\0')
+    case '\0':
       break;
-    switch (*p)
+    case '"':
+    case '\'':
+    case '`':
+    case '{':
     {
-      case '"':
-      case '\'':
-      case '`':
-      case '{':
+      register char
+        escape;
+
+      switch (*p)
       {
-        register char
-          escape;
+        case '"': escape='"'; break;
+        case '\'': escape='\''; break;
+        case '`': escape='\''; break;
+        case '{': escape='}'; break;
+        default: escape=(*p); break;
+      }
+      for (p++; *p != '\0'; p++)
+      {
+        if ((*p == '\\') && ((*(p+1) == escape) || (*(p+1) == '\\')))
+          p++;
+        else
+          if (*p == escape)
+            {
+              p++;
+              break;
+            }
+        token[i++]=(*p);
+      }
+      break;
+    }
+    case '/':
+    {
+      token[i++]=(*p++);
+      if ((*p == '>') || (*p == '/'))
+        token[i++]=(*p++);
+      break;
+    }
+    default:
+    {
+      char
+        *q;
 
-        switch (*p)
+      value=StringToDouble(p,&q);
+      (void) value;
+      if ((p != q) && (*p != ','))
         {
-          case '"': escape='"'; break;
-          case '\'': escape='\''; break;
-          case '`': escape='\''; break;
-          case '{': escape='}'; break;
-          default: escape=(*p); break;
+          for ( ; (p < q) && (*p != ','); p++)
+            token[i++]=(*p);
+          if (*p == '%')
+            token[i++]=(*p++);
+          break;
         }
-        for (p++; *p != '\0'; p++)
+      if ((*p != '\0') && (isalpha((int) ((unsigned char) *p)) == 0) &&
+          (*p != *DirectorySeparator) && (*p != '#') && (*p != '<'))
         {
-          if ((*p == '\\') && ((*(p+1) == escape) || (*(p+1) == '\\')))
-            p++;
-          else
-            if (*p == escape)
-              {
-                p++;
-                break;
-              }
-          token[i++]=(*p);
-        }
-        break;
-      }
-      case '/':
-      {
-        token[i++]=(*p++);
-        if ((*p == '>') || (*p == '/'))
           token[i++]=(*p++);
-        break;
-      }
-      default:
+          break;
+        }
+      for ( ; *p != '\0'; p++)
       {
-        char
-          *q;
-
-        value=StringToDouble(p,&q);
-        (void) value;
-        if ((p != q) && (*p != ','))
-          {
-            for ( ; (p < q) && (*p != ','); p++)
-              token[i++]=(*p);
-            if (*p == '%')
-              token[i++]=(*p++);
-            break;
-          }
-        if ((*p != '\0') && (isalpha((int) ((unsigned char) *p)) == 0) &&
-            (*p != *DirectorySeparator) && (*p != '#') && (*p != '<'))
+        if (((isspace((int) ((unsigned char) *p)) != 0) || (*p == '=') ||
+            (*p == ':') || (*p == ',') || (*p == '|') || (*p == ';')) &&
+            (*(p-1) != '\\'))
+          break;
+        if ((i > 0) && (*p == '<'))
+          break;
+        token[i++]=(*p);
+        if (*p == '>')
+          break;
+        if (*p == '(')
+          for (p++; *p != '\0'; p++)
           {
-            token[i++]=(*p++);
-            break;
+            token[i++]=(*p);
+            if ((*p == ')') && (*(p-1) != '\\'))
+              break;
           }
-        for ( ; *p != '\0'; p++)
-        {
-          if (((isspace((int) ((unsigned char) *p)) != 0) || (*p == '=') ||
-              (*p == ':') || (*p == ',') || (*p == '|') || (*p == ';')) &&
-              (*(p-1) != '\\'))
-            break;
-          if ((i > 0) && (*p == '<'))
-            break;
-          token[i++]=(*p);
-          if (*p == '>')
-            break;
-          if (*p == '(')
-            for (p++; *p != '\0'; p++)
-            {
-              token[i++]=(*p);
-              if ((*p == ')') && (*(p-1) != '\\'))
-                break;
-            }
-        }
-        break;
       }
+      break;
     }
-    break;
   }
   token[i]='\0';
   if (LocaleNCompare(token,"url(",4) == 0)
@@ -964,7 +961,11 @@ MagickExport int Tokenizer(TokenInfo *token_info,const unsigned flag,
     switch (token_info->state)
     {
       case IN_WHITE:
+      {
         token_info->state=IN_TOKEN;
+        StoreToken(token_info,token,max_token_length,c);
+        break;
+      }
       case IN_TOKEN:
       case IN_QUOTE:
       {