Guest User

CSSPrimitiveValueUnitTrie.cpp

a guest
May 8th, 2016
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.13 KB | None | 0 0
  1. // Copyright 2016 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4.  
  5. #include "core/css/CSSPrimitiveValueUnitTrie.h"
  6. #include "core/css/CSSPrimitiveValue.h"
  7.  
  8. namespace blink {
  9.  
  10. namespace {
  11.  
  12. template<typename CharacterType>
  13. CSSPrimitiveValue::UnitType cssPrimitiveValueUnitFromTrie(const CharacterType* data, unsigned length)
  14. {
  15.     DCHECK(data);
  16.     DCHECK(length);
  17.     switch(length) {
  18.     case 0:
  19.         return CSSPrimitiveValue::UnitType::UserUnits;
  20.     case 1:
  21.         switch (toASCIILower(data[0])) {
  22.         case 's':
  23.             return CSSPrimitiveValue::UnitType::Seconds;
  24.         }
  25.         break;
  26.     case 2:
  27.         switch (toASCIILower(data[0])) {
  28.         case 'c':
  29.             switch (toASCIILower(data[1])) {
  30.             case 'h':
  31.                 return CSSPrimitiveValue::UnitType::Chs;
  32.             case 'm':
  33.                 return CSSPrimitiveValue::UnitType::Centimeters;
  34.             }
  35.             break;
  36.         case 'e':
  37.             switch (toASCIILower(data[1])) {
  38.             case 'm':
  39.                 return CSSPrimitiveValue::UnitType::Ems;
  40.             case 'x':
  41.                 return CSSPrimitiveValue::UnitType::Exs;
  42.             }
  43.             break;
  44.         case 'f':
  45.             if (toASCIILower(data[1]) == 'r')
  46.                 return CSSPrimitiveValue::UnitType::Fraction;
  47.             break;
  48.         case 'h':
  49.             if (toASCIILower(data[1]) == 'z')
  50.                 return CSSPrimitiveValue::UnitType::Hertz;
  51.             break;
  52.         case 'i':
  53.             if (toASCIILower(data[1]) == 'n')
  54.                 return CSSPrimitiveValue::UnitType::Inches;
  55.             break;
  56.         case 'm':
  57.             switch (toASCIILower(data[1])) {
  58.             case 'm':
  59.                 return CSSPrimitiveValue::UnitType::Millimeters;
  60.             case 's':
  61.                 return CSSPrimitiveValue::UnitType::Milliseconds;
  62.             }
  63.             break;
  64.         case 'p':
  65.             switch (toASCIILower(data[1])) {
  66.             case 'c':
  67.                 return CSSPrimitiveValue::UnitType::Picas;
  68.             case 't':
  69.                 return CSSPrimitiveValue::UnitType::Points;
  70.             case 'x':
  71.                 return CSSPrimitiveValue::UnitType::Pixels;
  72.             }
  73.             break;
  74.         case 'v':
  75.             switch (toASCIILower(data[1])) {
  76.             case 'h':
  77.                 return CSSPrimitiveValue::UnitType::ViewportHeight;
  78.             case 'w':
  79.                 return CSSPrimitiveValue::UnitType::ViewportWidth;
  80.             }
  81.             break;
  82.         }
  83.         break;
  84.     case 3:
  85.         switch (toASCIILower(data[0])) {
  86.         case 'd':
  87.             switch (toASCIILower(data[1])) {
  88.             case 'e':
  89.                 if (toASCIILower(data[2]) == 'g')
  90.                     return CSSPrimitiveValue::UnitType::Degrees;
  91.                 break;
  92.             case 'p':
  93.                 if (toASCIILower(data[2]) == 'i')
  94.                     return CSSPrimitiveValue::UnitType::DotsPerInch;
  95.                 break;
  96.             }
  97.             break;
  98.         case 'k':
  99.             if (toASCIILower(data[1]) == 'h' && toASCIILower(data[2]) == 'z')
  100.                 return CSSPrimitiveValue::UnitType::Kilohertz;
  101.             break;
  102.         case 'r':
  103.             switch (toASCIILower(data[1])) {
  104.             case 'a':
  105.                 if (toASCIILower(data[2]) == 'd')
  106.                     return CSSPrimitiveValue::UnitType::Radians;
  107.                 break;
  108.             case 'e':
  109.                 if (toASCIILower(data[2]) == 'm')
  110.                     return CSSPrimitiveValue::UnitType::Rems;
  111.                 break;
  112.             }
  113.             break;
  114.         }
  115.         break;
  116.     case 4:
  117.         switch (toASCIILower(data[0])) {
  118.         case 'd':
  119.             switch (toASCIILower(data[1])) {
  120.             case 'p':
  121.                 switch (toASCIILower(data[2])) {
  122.                 case 'c':
  123.                     if (toASCIILower(data[3]) == 'm')
  124.                         return CSSPrimitiveValue::UnitType::DotsPerCentimeter;
  125.                     break;
  126.                 case 'p':
  127.                     if (toASCIILower(data[3]) == 'x')
  128.                         return CSSPrimitiveValue::UnitType::DotsPerPixel;
  129.                     break;
  130.                 }
  131.                 break;
  132.             }
  133.             break;
  134.         case 'g':
  135.             if (toASCIILower(data[1]) == 'r' && toASCIILower(data[2]) == 'a' && toASCIILower(data[3]) == 'd')
  136.                 return CSSPrimitiveValue::UnitType::Gradians;
  137.             break;
  138.         case 't':
  139.             if (toASCIILower(data[1]) == 'u' && toASCIILower(data[2]) == 'r' && toASCIILower(data[3]) == 'n')
  140.                 return CSSPrimitiveValue::UnitType::Turns;
  141.             break;
  142.         case 'v':
  143.             switch (toASCIILower(data[1])) {
  144.             case 'm':
  145.                 switch (toASCIILower(data[2])) {
  146.                 case 'a':
  147.                     if (toASCIILower(data[3]) == 'x')
  148.                         return CSSPrimitiveValue::UnitType::ViewportMax;
  149.                     break;
  150.                 case 'i':
  151.                     if (toASCIILower(data[3]) == 'n')
  152.                         return CSSPrimitiveValue::UnitType::ViewportMin;
  153.                     break;
  154.                 }
  155.                 break;
  156.             }
  157.             break;
  158.         }
  159.         break;
  160.     case 5:
  161.         switch (toASCIILower(data[0])) {
  162.         case '_':
  163.             if (toASCIILower(data[1]) == '_' && toASCIILower(data[2]) == 'q' && toASCIILower(data[3]) == 'e' && toASCIILower(data[4]) == 'm')
  164.                 return CSSPrimitiveValue::UnitType::QuirkyEms;
  165.             break;
  166.         }
  167.         break;
  168.     }
  169.     return CSSPrimitiveValue::UnitType::Unknown;
  170. }
  171.  
  172. } // namespace
  173.  
  174. CSSPrimitiveValue::UnitType lookupCSSPrimitiveValueUnit(const LChar* characters8, unsigned length)
  175. {
  176.     return cssPrimitiveValueUnitFromTrie(characters8, length);
  177. }
  178.  
  179. CSSPrimitiveValue::UnitType lookupCSSPrimitiveValueUnit(const UChar* characters16, unsigned length)
  180. {
  181.     return cssPrimitiveValueUnitFromTrie(characters16, length);
  182. }
  183.  
  184. } // namespace blink
Advertisement
Add Comment
Please, Sign In to add comment