1 // sass.hpp must go before all system headers to get the
2 // __EXTENSIONS__ fix on Solaris.
3 #include "sass.hpp"
4 
5 #include "ast.hpp"
6 #include "color_maps.hpp"
7 #include "util_string.hpp"
8 
9 namespace Sass {
10 
11   namespace ColorNames
12   {
13     const char aliceblue [] = "aliceblue";
14     const char antiquewhite [] = "antiquewhite";
15     const char cyan [] = "cyan";
16     const char aqua [] = "aqua";
17     const char aquamarine [] = "aquamarine";
18     const char azure [] = "azure";
19     const char beige [] = "beige";
20     const char bisque [] = "bisque";
21     const char black [] = "black";
22     const char blanchedalmond [] = "blanchedalmond";
23     const char blue [] = "blue";
24     const char blueviolet [] = "blueviolet";
25     const char brown [] = "brown";
26     const char burlywood [] = "burlywood";
27     const char cadetblue [] = "cadetblue";
28     const char chartreuse [] = "chartreuse";
29     const char chocolate [] = "chocolate";
30     const char coral [] = "coral";
31     const char cornflowerblue [] = "cornflowerblue";
32     const char cornsilk [] = "cornsilk";
33     const char crimson [] = "crimson";
34     const char darkblue [] = "darkblue";
35     const char darkcyan [] = "darkcyan";
36     const char darkgoldenrod [] = "darkgoldenrod";
37     const char darkgray [] = "darkgray";
38     const char darkgrey [] = "darkgrey";
39     const char darkgreen [] = "darkgreen";
40     const char darkkhaki [] = "darkkhaki";
41     const char darkmagenta [] = "darkmagenta";
42     const char darkolivegreen [] = "darkolivegreen";
43     const char darkorange [] = "darkorange";
44     const char darkorchid [] = "darkorchid";
45     const char darkred [] = "darkred";
46     const char darksalmon [] = "darksalmon";
47     const char darkseagreen [] = "darkseagreen";
48     const char darkslateblue [] = "darkslateblue";
49     const char darkslategray [] = "darkslategray";
50     const char darkslategrey [] = "darkslategrey";
51     const char darkturquoise [] = "darkturquoise";
52     const char darkviolet [] = "darkviolet";
53     const char deeppink [] = "deeppink";
54     const char deepskyblue [] = "deepskyblue";
55     const char dimgray [] = "dimgray";
56     const char dimgrey [] = "dimgrey";
57     const char dodgerblue [] = "dodgerblue";
58     const char firebrick [] = "firebrick";
59     const char floralwhite [] = "floralwhite";
60     const char forestgreen [] = "forestgreen";
61     const char magenta [] = "magenta";
62     const char fuchsia [] = "fuchsia";
63     const char gainsboro [] = "gainsboro";
64     const char ghostwhite [] = "ghostwhite";
65     const char gold [] = "gold";
66     const char goldenrod [] = "goldenrod";
67     const char gray [] = "gray";
68     const char grey [] = "grey";
69     const char green [] = "green";
70     const char greenyellow [] = "greenyellow";
71     const char honeydew [] = "honeydew";
72     const char hotpink [] = "hotpink";
73     const char indianred [] = "indianred";
74     const char indigo [] = "indigo";
75     const char ivory [] = "ivory";
76     const char khaki [] = "khaki";
77     const char lavender [] = "lavender";
78     const char lavenderblush [] = "lavenderblush";
79     const char lawngreen [] = "lawngreen";
80     const char lemonchiffon [] = "lemonchiffon";
81     const char lightblue [] = "lightblue";
82     const char lightcoral [] = "lightcoral";
83     const char lightcyan [] = "lightcyan";
84     const char lightgoldenrodyellow [] = "lightgoldenrodyellow";
85     const char lightgray [] = "lightgray";
86     const char lightgrey [] = "lightgrey";
87     const char lightgreen [] = "lightgreen";
88     const char lightpink [] = "lightpink";
89     const char lightsalmon [] = "lightsalmon";
90     const char lightseagreen [] = "lightseagreen";
91     const char lightskyblue [] = "lightskyblue";
92     const char lightslategray [] = "lightslategray";
93     const char lightslategrey [] = "lightslategrey";
94     const char lightsteelblue [] = "lightsteelblue";
95     const char lightyellow [] = "lightyellow";
96     const char lime [] = "lime";
97     const char limegreen [] = "limegreen";
98     const char linen [] = "linen";
99     const char maroon [] = "maroon";
100     const char mediumaquamarine [] = "mediumaquamarine";
101     const char mediumblue [] = "mediumblue";
102     const char mediumorchid [] = "mediumorchid";
103     const char mediumpurple [] = "mediumpurple";
104     const char mediumseagreen [] = "mediumseagreen";
105     const char mediumslateblue [] = "mediumslateblue";
106     const char mediumspringgreen [] = "mediumspringgreen";
107     const char mediumturquoise [] = "mediumturquoise";
108     const char mediumvioletred [] = "mediumvioletred";
109     const char midnightblue [] = "midnightblue";
110     const char mintcream [] = "mintcream";
111     const char mistyrose [] = "mistyrose";
112     const char moccasin [] = "moccasin";
113     const char navajowhite [] = "navajowhite";
114     const char navy [] = "navy";
115     const char oldlace [] = "oldlace";
116     const char olive [] = "olive";
117     const char olivedrab [] = "olivedrab";
118     const char orange [] = "orange";
119     const char orangered [] = "orangered";
120     const char orchid [] = "orchid";
121     const char palegoldenrod [] = "palegoldenrod";
122     const char palegreen [] = "palegreen";
123     const char paleturquoise [] = "paleturquoise";
124     const char palevioletred [] = "palevioletred";
125     const char papayawhip [] = "papayawhip";
126     const char peachpuff [] = "peachpuff";
127     const char peru [] = "peru";
128     const char pink [] = "pink";
129     const char plum [] = "plum";
130     const char powderblue [] = "powderblue";
131     const char purple [] = "purple";
132     const char red [] = "red";
133     const char rosybrown [] = "rosybrown";
134     const char royalblue [] = "royalblue";
135     const char saddlebrown [] = "saddlebrown";
136     const char salmon [] = "salmon";
137     const char sandybrown [] = "sandybrown";
138     const char seagreen [] = "seagreen";
139     const char seashell [] = "seashell";
140     const char sienna [] = "sienna";
141     const char silver [] = "silver";
142     const char skyblue [] = "skyblue";
143     const char slateblue [] = "slateblue";
144     const char slategray [] = "slategray";
145     const char slategrey [] = "slategrey";
146     const char snow [] = "snow";
147     const char springgreen [] = "springgreen";
148     const char steelblue [] = "steelblue";
149     const char tan [] = "tan";
150     const char teal [] = "teal";
151     const char thistle [] = "thistle";
152     const char tomato [] = "tomato";
153     const char turquoise [] = "turquoise";
154     const char violet [] = "violet";
155     const char wheat [] = "wheat";
156     const char white [] = "white";
157     const char whitesmoke [] = "whitesmoke";
158     const char yellow [] = "yellow";
159     const char yellowgreen [] = "yellowgreen";
160     const char rebeccapurple [] = "rebeccapurple";
161     const char transparent [] = "transparent";
162   }
163 
164   namespace Colors {
165     const SourceSpan color_table("[COLOR TABLE]");
166     const Color_RGBA aliceblue(color_table, 240, 248, 255, 1);
167     const Color_RGBA antiquewhite(color_table, 250, 235, 215, 1);
168     const Color_RGBA cyan(color_table, 0, 255, 255, 1);
169     const Color_RGBA aqua(color_table, 0, 255, 255, 1);
170     const Color_RGBA aquamarine(color_table, 127, 255, 212, 1);
171     const Color_RGBA azure(color_table, 240, 255, 255, 1);
172     const Color_RGBA beige(color_table, 245, 245, 220, 1);
173     const Color_RGBA bisque(color_table, 255, 228, 196, 1);
174     const Color_RGBA black(color_table, 0, 0, 0, 1);
175     const Color_RGBA blanchedalmond(color_table, 255, 235, 205, 1);
176     const Color_RGBA blue(color_table, 0, 0, 255, 1);
177     const Color_RGBA blueviolet(color_table, 138, 43, 226, 1);
178     const Color_RGBA brown(color_table, 165, 42, 42, 1);
179     const Color_RGBA burlywood(color_table, 222, 184, 135, 1);
180     const Color_RGBA cadetblue(color_table, 95, 158, 160, 1);
181     const Color_RGBA chartreuse(color_table, 127, 255, 0, 1);
182     const Color_RGBA chocolate(color_table, 210, 105, 30, 1);
183     const Color_RGBA coral(color_table, 255, 127, 80, 1);
184     const Color_RGBA cornflowerblue(color_table, 100, 149, 237, 1);
185     const Color_RGBA cornsilk(color_table, 255, 248, 220, 1);
186     const Color_RGBA crimson(color_table, 220, 20, 60, 1);
187     const Color_RGBA darkblue(color_table, 0, 0, 139, 1);
188     const Color_RGBA darkcyan(color_table, 0, 139, 139, 1);
189     const Color_RGBA darkgoldenrod(color_table, 184, 134, 11, 1);
190     const Color_RGBA darkgray(color_table, 169, 169, 169, 1);
191     const Color_RGBA darkgrey(color_table, 169, 169, 169, 1);
192     const Color_RGBA darkgreen(color_table, 0, 100, 0, 1);
193     const Color_RGBA darkkhaki(color_table, 189, 183, 107, 1);
194     const Color_RGBA darkmagenta(color_table, 139, 0, 139, 1);
195     const Color_RGBA darkolivegreen(color_table, 85, 107, 47, 1);
196     const Color_RGBA darkorange(color_table, 255, 140, 0, 1);
197     const Color_RGBA darkorchid(color_table, 153, 50, 204, 1);
198     const Color_RGBA darkred(color_table, 139, 0, 0, 1);
199     const Color_RGBA darksalmon(color_table, 233, 150, 122, 1);
200     const Color_RGBA darkseagreen(color_table, 143, 188, 143, 1);
201     const Color_RGBA darkslateblue(color_table, 72, 61, 139, 1);
202     const Color_RGBA darkslategray(color_table, 47, 79, 79, 1);
203     const Color_RGBA darkslategrey(color_table, 47, 79, 79, 1);
204     const Color_RGBA darkturquoise(color_table, 0, 206, 209, 1);
205     const Color_RGBA darkviolet(color_table, 148, 0, 211, 1);
206     const Color_RGBA deeppink(color_table, 255, 20, 147, 1);
207     const Color_RGBA deepskyblue(color_table, 0, 191, 255, 1);
208     const Color_RGBA dimgray(color_table, 105, 105, 105, 1);
209     const Color_RGBA dimgrey(color_table, 105, 105, 105, 1);
210     const Color_RGBA dodgerblue(color_table, 30, 144, 255, 1);
211     const Color_RGBA firebrick(color_table, 178, 34, 34, 1);
212     const Color_RGBA floralwhite(color_table, 255, 250, 240, 1);
213     const Color_RGBA forestgreen(color_table, 34, 139, 34, 1);
214     const Color_RGBA magenta(color_table, 255, 0, 255, 1);
215     const Color_RGBA fuchsia(color_table, 255, 0, 255, 1);
216     const Color_RGBA gainsboro(color_table, 220, 220, 220, 1);
217     const Color_RGBA ghostwhite(color_table, 248, 248, 255, 1);
218     const Color_RGBA gold(color_table, 255, 215, 0, 1);
219     const Color_RGBA goldenrod(color_table, 218, 165, 32, 1);
220     const Color_RGBA gray(color_table, 128, 128, 128, 1);
221     const Color_RGBA grey(color_table, 128, 128, 128, 1);
222     const Color_RGBA green(color_table, 0, 128, 0, 1);
223     const Color_RGBA greenyellow(color_table, 173, 255, 47, 1);
224     const Color_RGBA honeydew(color_table, 240, 255, 240, 1);
225     const Color_RGBA hotpink(color_table, 255, 105, 180, 1);
226     const Color_RGBA indianred(color_table, 205, 92, 92, 1);
227     const Color_RGBA indigo(color_table, 75, 0, 130, 1);
228     const Color_RGBA ivory(color_table, 255, 255, 240, 1);
229     const Color_RGBA khaki(color_table, 240, 230, 140, 1);
230     const Color_RGBA lavender(color_table, 230, 230, 250, 1);
231     const Color_RGBA lavenderblush(color_table, 255, 240, 245, 1);
232     const Color_RGBA lawngreen(color_table, 124, 252, 0, 1);
233     const Color_RGBA lemonchiffon(color_table, 255, 250, 205, 1);
234     const Color_RGBA lightblue(color_table, 173, 216, 230, 1);
235     const Color_RGBA lightcoral(color_table, 240, 128, 128, 1);
236     const Color_RGBA lightcyan(color_table, 224, 255, 255, 1);
237     const Color_RGBA lightgoldenrodyellow(color_table, 250, 250, 210, 1);
238     const Color_RGBA lightgray(color_table, 211, 211, 211, 1);
239     const Color_RGBA lightgrey(color_table, 211, 211, 211, 1);
240     const Color_RGBA lightgreen(color_table, 144, 238, 144, 1);
241     const Color_RGBA lightpink(color_table, 255, 182, 193, 1);
242     const Color_RGBA lightsalmon(color_table, 255, 160, 122, 1);
243     const Color_RGBA lightseagreen(color_table, 32, 178, 170, 1);
244     const Color_RGBA lightskyblue(color_table, 135, 206, 250, 1);
245     const Color_RGBA lightslategray(color_table, 119, 136, 153, 1);
246     const Color_RGBA lightslategrey(color_table, 119, 136, 153, 1);
247     const Color_RGBA lightsteelblue(color_table, 176, 196, 222, 1);
248     const Color_RGBA lightyellow(color_table, 255, 255, 224, 1);
249     const Color_RGBA lime(color_table, 0, 255, 0, 1);
250     const Color_RGBA limegreen(color_table, 50, 205, 50, 1);
251     const Color_RGBA linen(color_table, 250, 240, 230, 1);
252     const Color_RGBA maroon(color_table, 128, 0, 0, 1);
253     const Color_RGBA mediumaquamarine(color_table, 102, 205, 170, 1);
254     const Color_RGBA mediumblue(color_table, 0, 0, 205, 1);
255     const Color_RGBA mediumorchid(color_table, 186, 85, 211, 1);
256     const Color_RGBA mediumpurple(color_table, 147, 112, 219, 1);
257     const Color_RGBA mediumseagreen(color_table, 60, 179, 113, 1);
258     const Color_RGBA mediumslateblue(color_table, 123, 104, 238, 1);
259     const Color_RGBA mediumspringgreen(color_table, 0, 250, 154, 1);
260     const Color_RGBA mediumturquoise(color_table, 72, 209, 204, 1);
261     const Color_RGBA mediumvioletred(color_table, 199, 21, 133, 1);
262     const Color_RGBA midnightblue(color_table, 25, 25, 112, 1);
263     const Color_RGBA mintcream(color_table, 245, 255, 250, 1);
264     const Color_RGBA mistyrose(color_table, 255, 228, 225, 1);
265     const Color_RGBA moccasin(color_table, 255, 228, 181, 1);
266     const Color_RGBA navajowhite(color_table, 255, 222, 173, 1);
267     const Color_RGBA navy(color_table, 0, 0, 128, 1);
268     const Color_RGBA oldlace(color_table, 253, 245, 230, 1);
269     const Color_RGBA olive(color_table, 128, 128, 0, 1);
270     const Color_RGBA olivedrab(color_table, 107, 142, 35, 1);
271     const Color_RGBA orange(color_table, 255, 165, 0, 1);
272     const Color_RGBA orangered(color_table, 255, 69, 0, 1);
273     const Color_RGBA orchid(color_table, 218, 112, 214, 1);
274     const Color_RGBA palegoldenrod(color_table, 238, 232, 170, 1);
275     const Color_RGBA palegreen(color_table, 152, 251, 152, 1);
276     const Color_RGBA paleturquoise(color_table, 175, 238, 238, 1);
277     const Color_RGBA palevioletred(color_table, 219, 112, 147, 1);
278     const Color_RGBA papayawhip(color_table, 255, 239, 213, 1);
279     const Color_RGBA peachpuff(color_table, 255, 218, 185, 1);
280     const Color_RGBA peru(color_table, 205, 133, 63, 1);
281     const Color_RGBA pink(color_table, 255, 192, 203, 1);
282     const Color_RGBA plum(color_table, 221, 160, 221, 1);
283     const Color_RGBA powderblue(color_table, 176, 224, 230, 1);
284     const Color_RGBA purple(color_table, 128, 0, 128, 1);
285     const Color_RGBA red(color_table, 255, 0, 0, 1);
286     const Color_RGBA rosybrown(color_table, 188, 143, 143, 1);
287     const Color_RGBA royalblue(color_table, 65, 105, 225, 1);
288     const Color_RGBA saddlebrown(color_table, 139, 69, 19, 1);
289     const Color_RGBA salmon(color_table, 250, 128, 114, 1);
290     const Color_RGBA sandybrown(color_table, 244, 164, 96, 1);
291     const Color_RGBA seagreen(color_table, 46, 139, 87, 1);
292     const Color_RGBA seashell(color_table, 255, 245, 238, 1);
293     const Color_RGBA sienna(color_table, 160, 82, 45, 1);
294     const Color_RGBA silver(color_table, 192, 192, 192, 1);
295     const Color_RGBA skyblue(color_table, 135, 206, 235, 1);
296     const Color_RGBA slateblue(color_table, 106, 90, 205, 1);
297     const Color_RGBA slategray(color_table, 112, 128, 144, 1);
298     const Color_RGBA slategrey(color_table, 112, 128, 144, 1);
299     const Color_RGBA snow(color_table, 255, 250, 250, 1);
300     const Color_RGBA springgreen(color_table, 0, 255, 127, 1);
301     const Color_RGBA steelblue(color_table, 70, 130, 180, 1);
302     const Color_RGBA tan(color_table, 210, 180, 140, 1);
303     const Color_RGBA teal(color_table, 0, 128, 128, 1);
304     const Color_RGBA thistle(color_table, 216, 191, 216, 1);
305     const Color_RGBA tomato(color_table, 255, 99, 71, 1);
306     const Color_RGBA turquoise(color_table, 64, 224, 208, 1);
307     const Color_RGBA violet(color_table, 238, 130, 238, 1);
308     const Color_RGBA wheat(color_table, 245, 222, 179, 1);
309     const Color_RGBA white(color_table, 255, 255, 255, 1);
310     const Color_RGBA whitesmoke(color_table, 245, 245, 245, 1);
311     const Color_RGBA yellow(color_table, 255, 255, 0, 1);
312     const Color_RGBA yellowgreen(color_table, 154, 205, 50, 1);
313     const Color_RGBA rebeccapurple(color_table, 102, 51, 153, 1);
314     const Color_RGBA transparent(color_table, 0, 0, 0, 0);
315   }
316 
317   static const auto* const colors_to_names = new std::unordered_map<int, const char*> {
318     { 240 * 0x10000 + 248 * 0x100 + 255, ColorNames::aliceblue },
319     { 250 * 0x10000 + 235 * 0x100 + 215, ColorNames::antiquewhite },
320     {   0 * 0x10000 + 255 * 0x100 + 255, ColorNames::cyan },
321     { 127 * 0x10000 + 255 * 0x100 + 212, ColorNames::aquamarine },
322     { 240 * 0x10000 + 255 * 0x100 + 255, ColorNames::azure },
323     { 245 * 0x10000 + 245 * 0x100 + 220, ColorNames::beige },
324     { 255 * 0x10000 + 228 * 0x100 + 196, ColorNames::bisque },
325     {   0 * 0x10000 +   0 * 0x100 +   0, ColorNames::black },
326     { 255 * 0x10000 + 235 * 0x100 + 205, ColorNames::blanchedalmond },
327     {   0 * 0x10000 +   0 * 0x100 + 255, ColorNames::blue },
328     { 138 * 0x10000 +  43 * 0x100 + 226, ColorNames::blueviolet },
329     { 165 * 0x10000 +  42 * 0x100 +  42, ColorNames::brown },
330     { 222 * 0x10000 + 184 * 0x100 + 135, ColorNames::burlywood },
331     {  95 * 0x10000 + 158 * 0x100 + 160, ColorNames::cadetblue },
332     { 127 * 0x10000 + 255 * 0x100 +   0, ColorNames::chartreuse },
333     { 210 * 0x10000 + 105 * 0x100 +  30, ColorNames::chocolate },
334     { 255 * 0x10000 + 127 * 0x100 +  80, ColorNames::coral },
335     { 100 * 0x10000 + 149 * 0x100 + 237, ColorNames::cornflowerblue },
336     { 255 * 0x10000 + 248 * 0x100 + 220, ColorNames::cornsilk },
337     { 220 * 0x10000 +  20 * 0x100 +  60, ColorNames::crimson },
338     {   0 * 0x10000 +   0 * 0x100 + 139, ColorNames::darkblue },
339     {   0 * 0x10000 + 139 * 0x100 + 139, ColorNames::darkcyan },
340     { 184 * 0x10000 + 134 * 0x100 +  11, ColorNames::darkgoldenrod },
341     { 169 * 0x10000 + 169 * 0x100 + 169, ColorNames::darkgray },
342     {   0 * 0x10000 + 100 * 0x100 +   0, ColorNames::darkgreen },
343     { 189 * 0x10000 + 183 * 0x100 + 107, ColorNames::darkkhaki },
344     { 139 * 0x10000 +   0 * 0x100 + 139, ColorNames::darkmagenta },
345     {  85 * 0x10000 + 107 * 0x100 +  47, ColorNames::darkolivegreen },
346     { 255 * 0x10000 + 140 * 0x100 +   0, ColorNames::darkorange },
347     { 153 * 0x10000 +  50 * 0x100 + 204, ColorNames::darkorchid },
348     { 139 * 0x10000 +   0 * 0x100 +   0, ColorNames::darkred },
349     { 233 * 0x10000 + 150 * 0x100 + 122, ColorNames::darksalmon },
350     { 143 * 0x10000 + 188 * 0x100 + 143, ColorNames::darkseagreen },
351     {  72 * 0x10000 +  61 * 0x100 + 139, ColorNames::darkslateblue },
352     {  47 * 0x10000 +  79 * 0x100 +  79, ColorNames::darkslategray },
353     {   0 * 0x10000 + 206 * 0x100 + 209, ColorNames::darkturquoise },
354     { 148 * 0x10000 +   0 * 0x100 + 211, ColorNames::darkviolet },
355     { 255 * 0x10000 +  20 * 0x100 + 147, ColorNames::deeppink },
356     {   0 * 0x10000 + 191 * 0x100 + 255, ColorNames::deepskyblue },
357     { 105 * 0x10000 + 105 * 0x100 + 105, ColorNames::dimgray },
358     {  30 * 0x10000 + 144 * 0x100 + 255, ColorNames::dodgerblue },
359     { 178 * 0x10000 +  34 * 0x100 +  34, ColorNames::firebrick },
360     { 255 * 0x10000 + 250 * 0x100 + 240, ColorNames::floralwhite },
361     {  34 * 0x10000 + 139 * 0x100 +  34, ColorNames::forestgreen },
362     { 255 * 0x10000 +   0 * 0x100 + 255, ColorNames::magenta },
363     { 220 * 0x10000 + 220 * 0x100 + 220, ColorNames::gainsboro },
364     { 248 * 0x10000 + 248 * 0x100 + 255, ColorNames::ghostwhite },
365     { 255 * 0x10000 + 215 * 0x100 +   0, ColorNames::gold },
366     { 218 * 0x10000 + 165 * 0x100 +  32, ColorNames::goldenrod },
367     { 128 * 0x10000 + 128 * 0x100 + 128, ColorNames::gray },
368     {   0 * 0x10000 + 128 * 0x100 +   0, ColorNames::green },
369     { 173 * 0x10000 + 255 * 0x100 +  47, ColorNames::greenyellow },
370     { 240 * 0x10000 + 255 * 0x100 + 240, ColorNames::honeydew },
371     { 255 * 0x10000 + 105 * 0x100 + 180, ColorNames::hotpink },
372     { 205 * 0x10000 +  92 * 0x100 +  92, ColorNames::indianred },
373     {  75 * 0x10000 +   0 * 0x100 + 130, ColorNames::indigo },
374     { 255 * 0x10000 + 255 * 0x100 + 240, ColorNames::ivory },
375     { 240 * 0x10000 + 230 * 0x100 + 140, ColorNames::khaki },
376     { 230 * 0x10000 + 230 * 0x100 + 250, ColorNames::lavender },
377     { 255 * 0x10000 + 240 * 0x100 + 245, ColorNames::lavenderblush },
378     { 124 * 0x10000 + 252 * 0x100 +   0, ColorNames::lawngreen },
379     { 255 * 0x10000 + 250 * 0x100 + 205, ColorNames::lemonchiffon },
380     { 173 * 0x10000 + 216 * 0x100 + 230, ColorNames::lightblue },
381     { 240 * 0x10000 + 128 * 0x100 + 128, ColorNames::lightcoral },
382     { 224 * 0x10000 + 255 * 0x100 + 255, ColorNames::lightcyan },
383     { 250 * 0x10000 + 250 * 0x100 + 210, ColorNames::lightgoldenrodyellow },
384     { 211 * 0x10000 + 211 * 0x100 + 211, ColorNames::lightgray },
385     { 144 * 0x10000 + 238 * 0x100 + 144, ColorNames::lightgreen },
386     { 255 * 0x10000 + 182 * 0x100 + 193, ColorNames::lightpink },
387     { 255 * 0x10000 + 160 * 0x100 + 122, ColorNames::lightsalmon },
388     {  32 * 0x10000 + 178 * 0x100 + 170, ColorNames::lightseagreen },
389     { 135 * 0x10000 + 206 * 0x100 + 250, ColorNames::lightskyblue },
390     { 119 * 0x10000 + 136 * 0x100 + 153, ColorNames::lightslategray },
391     { 176 * 0x10000 + 196 * 0x100 + 222, ColorNames::lightsteelblue },
392     { 255 * 0x10000 + 255 * 0x100 + 224, ColorNames::lightyellow },
393     {   0 * 0x10000 + 255 * 0x100 +   0, ColorNames::lime },
394     {  50 * 0x10000 + 205 * 0x100 +  50, ColorNames::limegreen },
395     { 250 * 0x10000 + 240 * 0x100 + 230, ColorNames::linen },
396     { 128 * 0x10000 +   0 * 0x100 +   0, ColorNames::maroon },
397     { 102 * 0x10000 + 205 * 0x100 + 170, ColorNames::mediumaquamarine },
398     {   0 * 0x10000 +   0 * 0x100 + 205, ColorNames::mediumblue },
399     { 186 * 0x10000 +  85 * 0x100 + 211, ColorNames::mediumorchid },
400     { 147 * 0x10000 + 112 * 0x100 + 219, ColorNames::mediumpurple },
401     {  60 * 0x10000 + 179 * 0x100 + 113, ColorNames::mediumseagreen },
402     { 123 * 0x10000 + 104 * 0x100 + 238, ColorNames::mediumslateblue },
403     {   0 * 0x10000 + 250 * 0x100 + 154, ColorNames::mediumspringgreen },
404     {  72 * 0x10000 + 209 * 0x100 + 204, ColorNames::mediumturquoise },
405     { 199 * 0x10000 +  21 * 0x100 + 133, ColorNames::mediumvioletred },
406     {  25 * 0x10000 +  25 * 0x100 + 112, ColorNames::midnightblue },
407     { 245 * 0x10000 + 255 * 0x100 + 250, ColorNames::mintcream },
408     { 255 * 0x10000 + 228 * 0x100 + 225, ColorNames::mistyrose },
409     { 255 * 0x10000 + 228 * 0x100 + 181, ColorNames::moccasin },
410     { 255 * 0x10000 + 222 * 0x100 + 173, ColorNames::navajowhite },
411     {   0 * 0x10000 +   0 * 0x100 + 128, ColorNames::navy },
412     { 253 * 0x10000 + 245 * 0x100 + 230, ColorNames::oldlace },
413     { 128 * 0x10000 + 128 * 0x100 +   0, ColorNames::olive },
414     { 107 * 0x10000 + 142 * 0x100 +  35, ColorNames::olivedrab },
415     { 255 * 0x10000 + 165 * 0x100 +   0, ColorNames::orange },
416     { 255 * 0x10000 +  69 * 0x100 +   0, ColorNames::orangered },
417     { 218 * 0x10000 + 112 * 0x100 + 214, ColorNames::orchid },
418     { 238 * 0x10000 + 232 * 0x100 + 170, ColorNames::palegoldenrod },
419     { 152 * 0x10000 + 251 * 0x100 + 152, ColorNames::palegreen },
420     { 175 * 0x10000 + 238 * 0x100 + 238, ColorNames::paleturquoise },
421     { 219 * 0x10000 + 112 * 0x100 + 147, ColorNames::palevioletred },
422     { 255 * 0x10000 + 239 * 0x100 + 213, ColorNames::papayawhip },
423     { 255 * 0x10000 + 218 * 0x100 + 185, ColorNames::peachpuff },
424     { 205 * 0x10000 + 133 * 0x100 +  63, ColorNames::peru },
425     { 255 * 0x10000 + 192 * 0x100 + 203, ColorNames::pink },
426     { 221 * 0x10000 + 160 * 0x100 + 221, ColorNames::plum },
427     { 176 * 0x10000 + 224 * 0x100 + 230, ColorNames::powderblue },
428     { 128 * 0x10000 +   0 * 0x100 + 128, ColorNames::purple },
429     { 255 * 0x10000 +   0 * 0x100 +   0, ColorNames::red },
430     { 188 * 0x10000 + 143 * 0x100 + 143, ColorNames::rosybrown },
431     {  65 * 0x10000 + 105 * 0x100 + 225, ColorNames::royalblue },
432     { 139 * 0x10000 +  69 * 0x100 +  19, ColorNames::saddlebrown },
433     { 250 * 0x10000 + 128 * 0x100 + 114, ColorNames::salmon },
434     { 244 * 0x10000 + 164 * 0x100 +  96, ColorNames::sandybrown },
435     {  46 * 0x10000 + 139 * 0x100 +  87, ColorNames::seagreen },
436     { 255 * 0x10000 + 245 * 0x100 + 238, ColorNames::seashell },
437     { 160 * 0x10000 +  82 * 0x100 +  45, ColorNames::sienna },
438     { 192 * 0x10000 + 192 * 0x100 + 192, ColorNames::silver },
439     { 135 * 0x10000 + 206 * 0x100 + 235, ColorNames::skyblue },
440     { 106 * 0x10000 +  90 * 0x100 + 205, ColorNames::slateblue },
441     { 112 * 0x10000 + 128 * 0x100 + 144, ColorNames::slategray },
442     { 255 * 0x10000 + 250 * 0x100 + 250, ColorNames::snow },
443     {   0 * 0x10000 + 255 * 0x100 + 127, ColorNames::springgreen },
444     {  70 * 0x10000 + 130 * 0x100 + 180, ColorNames::steelblue },
445     { 210 * 0x10000 + 180 * 0x100 + 140, ColorNames::tan },
446     {   0 * 0x10000 + 128 * 0x100 + 128, ColorNames::teal },
447     { 216 * 0x10000 + 191 * 0x100 + 216, ColorNames::thistle },
448     { 255 * 0x10000 +  99 * 0x100 +  71, ColorNames::tomato },
449     {  64 * 0x10000 + 224 * 0x100 + 208, ColorNames::turquoise },
450     { 238 * 0x10000 + 130 * 0x100 + 238, ColorNames::violet },
451     { 245 * 0x10000 + 222 * 0x100 + 179, ColorNames::wheat },
452     { 255 * 0x10000 + 255 * 0x100 + 255, ColorNames::white },
453     { 245 * 0x10000 + 245 * 0x100 + 245, ColorNames::whitesmoke },
454     { 255 * 0x10000 + 255 * 0x100 +   0, ColorNames::yellow },
455     { 154 * 0x10000 + 205 * 0x100 +  50, ColorNames::yellowgreen },
456     { 102 * 0x10000 +  51 * 0x100 + 153, ColorNames::rebeccapurple }
457   };
458 
459   static const auto *const names_to_colors = new std::unordered_map<sass::string, const Color_RGBA*>
460   {
461     { ColorNames::aliceblue, &Colors::aliceblue },
462     { ColorNames::antiquewhite, &Colors::antiquewhite },
463     { ColorNames::cyan, &Colors::cyan },
464     { ColorNames::aqua, &Colors::aqua },
465     { ColorNames::aquamarine, &Colors::aquamarine },
466     { ColorNames::azure, &Colors::azure },
467     { ColorNames::beige, &Colors::beige },
468     { ColorNames::bisque, &Colors::bisque },
469     { ColorNames::black, &Colors::black },
470     { ColorNames::blanchedalmond, &Colors::blanchedalmond },
471     { ColorNames::blue, &Colors::blue },
472     { ColorNames::blueviolet, &Colors::blueviolet },
473     { ColorNames::brown, &Colors::brown },
474     { ColorNames::burlywood, &Colors::burlywood },
475     { ColorNames::cadetblue, &Colors::cadetblue },
476     { ColorNames::chartreuse, &Colors::chartreuse },
477     { ColorNames::chocolate, &Colors::chocolate },
478     { ColorNames::coral, &Colors::coral },
479     { ColorNames::cornflowerblue, &Colors::cornflowerblue },
480     { ColorNames::cornsilk, &Colors::cornsilk },
481     { ColorNames::crimson, &Colors::crimson },
482     { ColorNames::darkblue, &Colors::darkblue },
483     { ColorNames::darkcyan, &Colors::darkcyan },
484     { ColorNames::darkgoldenrod, &Colors::darkgoldenrod },
485     { ColorNames::darkgray, &Colors::darkgray },
486     { ColorNames::darkgrey, &Colors::darkgrey },
487     { ColorNames::darkgreen, &Colors::darkgreen },
488     { ColorNames::darkkhaki, &Colors::darkkhaki },
489     { ColorNames::darkmagenta, &Colors::darkmagenta },
490     { ColorNames::darkolivegreen, &Colors::darkolivegreen },
491     { ColorNames::darkorange, &Colors::darkorange },
492     { ColorNames::darkorchid, &Colors::darkorchid },
493     { ColorNames::darkred, &Colors::darkred },
494     { ColorNames::darksalmon, &Colors::darksalmon },
495     { ColorNames::darkseagreen, &Colors::darkseagreen },
496     { ColorNames::darkslateblue, &Colors::darkslateblue },
497     { ColorNames::darkslategray, &Colors::darkslategray },
498     { ColorNames::darkslategrey, &Colors::darkslategrey },
499     { ColorNames::darkturquoise, &Colors::darkturquoise },
500     { ColorNames::darkviolet, &Colors::darkviolet },
501     { ColorNames::deeppink, &Colors::deeppink },
502     { ColorNames::deepskyblue, &Colors::deepskyblue },
503     { ColorNames::dimgray, &Colors::dimgray },
504     { ColorNames::dimgrey, &Colors::dimgrey },
505     { ColorNames::dodgerblue, &Colors::dodgerblue },
506     { ColorNames::firebrick, &Colors::firebrick },
507     { ColorNames::floralwhite, &Colors::floralwhite },
508     { ColorNames::forestgreen, &Colors::forestgreen },
509     { ColorNames::magenta, &Colors::magenta },
510     { ColorNames::fuchsia, &Colors::fuchsia },
511     { ColorNames::gainsboro, &Colors::gainsboro },
512     { ColorNames::ghostwhite, &Colors::ghostwhite },
513     { ColorNames::gold, &Colors::gold },
514     { ColorNames::goldenrod, &Colors::goldenrod },
515     { ColorNames::gray, &Colors::gray },
516     { ColorNames::grey, &Colors::grey },
517     { ColorNames::green, &Colors::green },
518     { ColorNames::greenyellow, &Colors::greenyellow },
519     { ColorNames::honeydew, &Colors::honeydew },
520     { ColorNames::hotpink, &Colors::hotpink },
521     { ColorNames::indianred, &Colors::indianred },
522     { ColorNames::indigo, &Colors::indigo },
523     { ColorNames::ivory, &Colors::ivory },
524     { ColorNames::khaki, &Colors::khaki },
525     { ColorNames::lavender, &Colors::lavender },
526     { ColorNames::lavenderblush, &Colors::lavenderblush },
527     { ColorNames::lawngreen, &Colors::lawngreen },
528     { ColorNames::lemonchiffon, &Colors::lemonchiffon },
529     { ColorNames::lightblue, &Colors::lightblue },
530     { ColorNames::lightcoral, &Colors::lightcoral },
531     { ColorNames::lightcyan, &Colors::lightcyan },
532     { ColorNames::lightgoldenrodyellow, &Colors::lightgoldenrodyellow },
533     { ColorNames::lightgray, &Colors::lightgray },
534     { ColorNames::lightgrey, &Colors::lightgrey },
535     { ColorNames::lightgreen, &Colors::lightgreen },
536     { ColorNames::lightpink, &Colors::lightpink },
537     { ColorNames::lightsalmon, &Colors::lightsalmon },
538     { ColorNames::lightseagreen, &Colors::lightseagreen },
539     { ColorNames::lightskyblue, &Colors::lightskyblue },
540     { ColorNames::lightslategray, &Colors::lightslategray },
541     { ColorNames::lightslategrey, &Colors::lightslategrey },
542     { ColorNames::lightsteelblue, &Colors::lightsteelblue },
543     { ColorNames::lightyellow, &Colors::lightyellow },
544     { ColorNames::lime, &Colors::lime },
545     { ColorNames::limegreen, &Colors::limegreen },
546     { ColorNames::linen, &Colors::linen },
547     { ColorNames::maroon, &Colors::maroon },
548     { ColorNames::mediumaquamarine, &Colors::mediumaquamarine },
549     { ColorNames::mediumblue, &Colors::mediumblue },
550     { ColorNames::mediumorchid, &Colors::mediumorchid },
551     { ColorNames::mediumpurple, &Colors::mediumpurple },
552     { ColorNames::mediumseagreen, &Colors::mediumseagreen },
553     { ColorNames::mediumslateblue, &Colors::mediumslateblue },
554     { ColorNames::mediumspringgreen, &Colors::mediumspringgreen },
555     { ColorNames::mediumturquoise, &Colors::mediumturquoise },
556     { ColorNames::mediumvioletred, &Colors::mediumvioletred },
557     { ColorNames::midnightblue, &Colors::midnightblue },
558     { ColorNames::mintcream, &Colors::mintcream },
559     { ColorNames::mistyrose, &Colors::mistyrose },
560     { ColorNames::moccasin, &Colors::moccasin },
561     { ColorNames::navajowhite, &Colors::navajowhite },
562     { ColorNames::navy, &Colors::navy },
563     { ColorNames::oldlace, &Colors::oldlace },
564     { ColorNames::olive, &Colors::olive },
565     { ColorNames::olivedrab, &Colors::olivedrab },
566     { ColorNames::orange, &Colors::orange },
567     { ColorNames::orangered, &Colors::orangered },
568     { ColorNames::orchid, &Colors::orchid },
569     { ColorNames::palegoldenrod, &Colors::palegoldenrod },
570     { ColorNames::palegreen, &Colors::palegreen },
571     { ColorNames::paleturquoise, &Colors::paleturquoise },
572     { ColorNames::palevioletred, &Colors::palevioletred },
573     { ColorNames::papayawhip, &Colors::papayawhip },
574     { ColorNames::peachpuff, &Colors::peachpuff },
575     { ColorNames::peru, &Colors::peru },
576     { ColorNames::pink, &Colors::pink },
577     { ColorNames::plum, &Colors::plum },
578     { ColorNames::powderblue, &Colors::powderblue },
579     { ColorNames::purple, &Colors::purple },
580     { ColorNames::red, &Colors::red },
581     { ColorNames::rosybrown, &Colors::rosybrown },
582     { ColorNames::royalblue, &Colors::royalblue },
583     { ColorNames::saddlebrown, &Colors::saddlebrown },
584     { ColorNames::salmon, &Colors::salmon },
585     { ColorNames::sandybrown, &Colors::sandybrown },
586     { ColorNames::seagreen, &Colors::seagreen },
587     { ColorNames::seashell, &Colors::seashell },
588     { ColorNames::sienna, &Colors::sienna },
589     { ColorNames::silver, &Colors::silver },
590     { ColorNames::skyblue, &Colors::skyblue },
591     { ColorNames::slateblue, &Colors::slateblue },
592     { ColorNames::slategray, &Colors::slategray },
593     { ColorNames::slategrey, &Colors::slategrey },
594     { ColorNames::snow, &Colors::snow },
595     { ColorNames::springgreen, &Colors::springgreen },
596     { ColorNames::steelblue, &Colors::steelblue },
597     { ColorNames::tan, &Colors::tan },
598     { ColorNames::teal, &Colors::teal },
599     { ColorNames::thistle, &Colors::thistle },
600     { ColorNames::tomato, &Colors::tomato },
601     { ColorNames::turquoise, &Colors::turquoise },
602     { ColorNames::violet, &Colors::violet },
603     { ColorNames::wheat, &Colors::wheat },
604     { ColorNames::white, &Colors::white },
605     { ColorNames::whitesmoke, &Colors::whitesmoke },
606     { ColorNames::yellow, &Colors::yellow },
607     { ColorNames::yellowgreen, &Colors::yellowgreen },
608     { ColorNames::rebeccapurple, &Colors::rebeccapurple },
609     { ColorNames::transparent, &Colors::transparent }
610   };
611 
name_to_color(const char * key)612   const Color_RGBA* name_to_color(const char* key)
613   {
614     return name_to_color(sass::string(key));
615   }
616 
name_to_color(const sass::string & key)617   const Color_RGBA* name_to_color(const sass::string& key)
618   {
619     // case insensitive lookup.  See #2462
620     sass::string lower = key;
621     Util::ascii_str_tolower(&lower);
622 
623     auto p = names_to_colors->find(lower);
624     if (p != names_to_colors->end()) {
625       return p->second;
626     }
627     return nullptr;
628   }
629 
color_to_name(const int key)630   const char* color_to_name(const int key)
631   {
632     auto p = colors_to_names->find(key);
633     if (p != colors_to_names->end()) {
634       return p->second;
635     }
636     return nullptr;
637   }
638 
color_to_name(const double key)639   const char* color_to_name(const double key)
640   {
641     return color_to_name((int)key);
642   }
643 
color_to_name(const Color_RGBA & c)644   const char* color_to_name(const Color_RGBA& c)
645   {
646     double key = c.r() * 0x10000
647                + c.g() * 0x100
648                + c.b();
649     return color_to_name(key);
650   }
651 
652 }
653