sassc 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (151) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +9 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +24 -0
  8. data/Rakefile +21 -0
  9. data/ext/libsass/.editorconfig +15 -0
  10. data/ext/libsass/.gitattributes +2 -0
  11. data/ext/libsass/.gitignore +61 -0
  12. data/ext/libsass/.travis.yml +38 -0
  13. data/ext/libsass/COPYING +25 -0
  14. data/ext/libsass/INSTALL +1 -0
  15. data/ext/libsass/LICENSE +25 -0
  16. data/ext/libsass/Makefile +223 -0
  17. data/ext/libsass/Makefile.am +145 -0
  18. data/ext/libsass/Readme.md +93 -0
  19. data/ext/libsass/appveyor.yml +76 -0
  20. data/ext/libsass/ast.cpp +581 -0
  21. data/ext/libsass/ast.hpp +1949 -0
  22. data/ext/libsass/ast_def_macros.hpp +16 -0
  23. data/ext/libsass/ast_factory.hpp +87 -0
  24. data/ext/libsass/ast_fwd_decl.hpp +72 -0
  25. data/ext/libsass/b64/cencode.h +32 -0
  26. data/ext/libsass/b64/encode.h +77 -0
  27. data/ext/libsass/backtrace.hpp +81 -0
  28. data/ext/libsass/base64vlq.cpp +43 -0
  29. data/ext/libsass/base64vlq.hpp +28 -0
  30. data/ext/libsass/bind.cpp +187 -0
  31. data/ext/libsass/bind.hpp +18 -0
  32. data/ext/libsass/cencode.c +102 -0
  33. data/ext/libsass/color_names.hpp +324 -0
  34. data/ext/libsass/configure.ac +130 -0
  35. data/ext/libsass/constants.cpp +144 -0
  36. data/ext/libsass/constants.hpp +145 -0
  37. data/ext/libsass/context.cpp +507 -0
  38. data/ext/libsass/context.hpp +150 -0
  39. data/ext/libsass/contextualize.cpp +157 -0
  40. data/ext/libsass/contextualize.hpp +65 -0
  41. data/ext/libsass/copy_c_str.cpp +13 -0
  42. data/ext/libsass/copy_c_str.hpp +5 -0
  43. data/ext/libsass/debug.hpp +39 -0
  44. data/ext/libsass/environment.hpp +75 -0
  45. data/ext/libsass/error_handling.cpp +28 -0
  46. data/ext/libsass/error_handling.hpp +28 -0
  47. data/ext/libsass/eval.cpp +1149 -0
  48. data/ext/libsass/eval.hpp +80 -0
  49. data/ext/libsass/expand.cpp +430 -0
  50. data/ext/libsass/expand.hpp +77 -0
  51. data/ext/libsass/extconf.rb +6 -0
  52. data/ext/libsass/extend.cpp +1962 -0
  53. data/ext/libsass/extend.hpp +50 -0
  54. data/ext/libsass/file.cpp +291 -0
  55. data/ext/libsass/file.hpp +18 -0
  56. data/ext/libsass/functions.cpp +1565 -0
  57. data/ext/libsass/functions.hpp +187 -0
  58. data/ext/libsass/inspect.cpp +727 -0
  59. data/ext/libsass/inspect.hpp +108 -0
  60. data/ext/libsass/json.cpp +1411 -0
  61. data/ext/libsass/json.hpp +117 -0
  62. data/ext/libsass/kwd_arg_macros.hpp +23 -0
  63. data/ext/libsass/m4/.gitkeep +0 -0
  64. data/ext/libsass/mapping.hpp +17 -0
  65. data/ext/libsass/memory_manager.hpp +54 -0
  66. data/ext/libsass/node.cpp +251 -0
  67. data/ext/libsass/node.hpp +122 -0
  68. data/ext/libsass/operation.hpp +153 -0
  69. data/ext/libsass/output_compressed.cpp +401 -0
  70. data/ext/libsass/output_compressed.hpp +95 -0
  71. data/ext/libsass/output_nested.cpp +364 -0
  72. data/ext/libsass/output_nested.hpp +108 -0
  73. data/ext/libsass/parser.cpp +2016 -0
  74. data/ext/libsass/parser.hpp +264 -0
  75. data/ext/libsass/paths.hpp +69 -0
  76. data/ext/libsass/position.hpp +22 -0
  77. data/ext/libsass/posix/getopt.c +562 -0
  78. data/ext/libsass/posix/getopt.h +95 -0
  79. data/ext/libsass/prelexer.cpp +688 -0
  80. data/ext/libsass/prelexer.hpp +513 -0
  81. data/ext/libsass/remove_placeholders.cpp +59 -0
  82. data/ext/libsass/remove_placeholders.hpp +43 -0
  83. data/ext/libsass/res/resource.rc +35 -0
  84. data/ext/libsass/sass.cpp +33 -0
  85. data/ext/libsass/sass.h +60 -0
  86. data/ext/libsass/sass2scss.cpp +834 -0
  87. data/ext/libsass/sass2scss.h +110 -0
  88. data/ext/libsass/sass_context.cpp +709 -0
  89. data/ext/libsass/sass_context.h +120 -0
  90. data/ext/libsass/sass_functions.cpp +137 -0
  91. data/ext/libsass/sass_functions.h +90 -0
  92. data/ext/libsass/sass_interface.cpp +277 -0
  93. data/ext/libsass/sass_interface.h +97 -0
  94. data/ext/libsass/sass_util.cpp +136 -0
  95. data/ext/libsass/sass_util.hpp +259 -0
  96. data/ext/libsass/sass_values.cpp +337 -0
  97. data/ext/libsass/sass_values.h +124 -0
  98. data/ext/libsass/script/bootstrap +10 -0
  99. data/ext/libsass/script/branding +10 -0
  100. data/ext/libsass/script/ci-build-libsass +72 -0
  101. data/ext/libsass/script/ci-install-compiler +4 -0
  102. data/ext/libsass/script/ci-install-deps +19 -0
  103. data/ext/libsass/script/ci-report-coverage +25 -0
  104. data/ext/libsass/script/coveralls-debug +32 -0
  105. data/ext/libsass/script/spec +5 -0
  106. data/ext/libsass/script/tap-driver +652 -0
  107. data/ext/libsass/script/tap-runner +1 -0
  108. data/ext/libsass/source_map.cpp +133 -0
  109. data/ext/libsass/source_map.hpp +46 -0
  110. data/ext/libsass/subset_map.hpp +145 -0
  111. data/ext/libsass/support/libsass.pc.in +11 -0
  112. data/ext/libsass/test-driver +127 -0
  113. data/ext/libsass/test/test_node.cpp +98 -0
  114. data/ext/libsass/test/test_paths.cpp +29 -0
  115. data/ext/libsass/test/test_selector_difference.cpp +28 -0
  116. data/ext/libsass/test/test_specificity.cpp +28 -0
  117. data/ext/libsass/test/test_subset_map.cpp +472 -0
  118. data/ext/libsass/test/test_superselector.cpp +71 -0
  119. data/ext/libsass/test/test_unification.cpp +33 -0
  120. data/ext/libsass/to_c.cpp +61 -0
  121. data/ext/libsass/to_c.hpp +44 -0
  122. data/ext/libsass/to_string.cpp +29 -0
  123. data/ext/libsass/to_string.hpp +32 -0
  124. data/ext/libsass/token.hpp +32 -0
  125. data/ext/libsass/units.cpp +54 -0
  126. data/ext/libsass/units.hpp +10 -0
  127. data/ext/libsass/utf8.h +34 -0
  128. data/ext/libsass/utf8/checked.h +327 -0
  129. data/ext/libsass/utf8/core.h +329 -0
  130. data/ext/libsass/utf8/unchecked.h +228 -0
  131. data/ext/libsass/utf8_string.cpp +102 -0
  132. data/ext/libsass/utf8_string.hpp +36 -0
  133. data/ext/libsass/util.cpp +189 -0
  134. data/ext/libsass/util.hpp +26 -0
  135. data/ext/libsass/win/libsass.filters +291 -0
  136. data/ext/libsass/win/libsass.sln +28 -0
  137. data/ext/libsass/win/libsass.vcxproj +255 -0
  138. data/lib/sassc.rb +6 -0
  139. data/lib/sassc/engine.rb +13 -0
  140. data/lib/sassc/native.rb +44 -0
  141. data/lib/sassc/native/native_context_api.rb +140 -0
  142. data/lib/sassc/native/native_functions_api.rb +41 -0
  143. data/lib/sassc/native/sass_input_style.rb +11 -0
  144. data/lib/sassc/native/sass_output_style.rb +10 -0
  145. data/lib/sassc/native/sass_value.rb +95 -0
  146. data/lib/sassc/native/string_list.rb +8 -0
  147. data/lib/sassc/version.rb +3 -0
  148. data/sassc.gemspec +43 -0
  149. data/test/smoke_test.rb +171 -0
  150. data/test/test_helper.rb +4 -0
  151. metadata +281 -0
@@ -0,0 +1,513 @@
1
+ #define SASS_PRELEXER
2
+
3
+ namespace Sass {
4
+ namespace Prelexer {
5
+
6
+ typedef int (*ctype_predicate)(int);
7
+ typedef const char* (*prelexer)(const char*);
8
+
9
+ // Match a single character literal.
10
+ template <char pre>
11
+ const char* exactly(const char* src) {
12
+ return *src == pre ? src + 1 : 0;
13
+ }
14
+
15
+ // Match a string constant.
16
+ template <const char* prefix>
17
+ const char* exactly(const char* src) {
18
+ const char* pre = prefix;
19
+ while (*pre && *src == *pre) ++src, ++pre;
20
+ return *pre ? 0 : src;
21
+ }
22
+
23
+ // Match a single character that satifies the supplied ctype predicate.
24
+ template <ctype_predicate pred>
25
+ const char* class_char(const char* src) {
26
+ return pred(*src) ? src + 1 : 0;
27
+ }
28
+
29
+ // Match a single character that is a member of the supplied class.
30
+ template <const char* char_class>
31
+ const char* class_char(const char* src) {
32
+ const char* cc = char_class;
33
+ while (*cc && *src != *cc) ++cc;
34
+ return *cc ? src + 1 : 0;
35
+ }
36
+
37
+ // Match a sequence of characters that all satisfy the supplied ctype predicate.
38
+ template <ctype_predicate pred>
39
+ const char* class_chars(const char* src) {
40
+ const char* p = src;
41
+ while (pred(*p)) ++p;
42
+ return p == src ? 0 : p;
43
+ }
44
+
45
+ // Match a sequence of characters that are all members of the supplied class.
46
+ template <const char* char_class>
47
+ const char* class_chars(const char* src) {
48
+ const char* p = src;
49
+ while (class_char<char_class>(p)) ++p;
50
+ return p == src ? 0 : p;
51
+ }
52
+
53
+ // Match a sequence of characters up to the next newline.
54
+ template <const char* prefix>
55
+ const char* to_endl(const char* src) {
56
+ if (!(src = exactly<prefix>(src))) return 0;
57
+ while (*src && *src != '\n') ++src;
58
+ return src;
59
+ }
60
+
61
+ // Match a sequence of characters delimited by the supplied chars.
62
+ template <char beg, char end, bool esc>
63
+ const char* delimited_by(const char* src) {
64
+ src = exactly<beg>(src);
65
+ if (!src) return 0;
66
+ const char* stop;
67
+ while (1) {
68
+ if (!*src) return 0;
69
+ stop = exactly<end>(src);
70
+ if (stop && (!esc || *(src - 1) != '\\')) return stop;
71
+ src = stop ? stop : src + 1;
72
+ }
73
+ }
74
+
75
+ // Match a sequence of characters delimited by the supplied strings.
76
+ template <const char* beg, const char* end, bool esc>
77
+ const char* delimited_by(const char* src) {
78
+ src = exactly<beg>(src);
79
+ if (!src) return 0;
80
+ const char* stop;
81
+ while (1) {
82
+ if (!*src) return 0;
83
+ stop = exactly<end>(src);
84
+ if (stop && (!esc || *(src - 1) != '\\')) return stop;
85
+ src = stop ? stop : src + 1;
86
+ }
87
+ }
88
+
89
+ // Match any single character.
90
+ const char* any_char(const char* src);
91
+ // Match any single character except the supplied one.
92
+ template <char c>
93
+ const char* any_char_except(const char* src) {
94
+ return (*src && *src != c) ? src+1 : 0;
95
+ }
96
+
97
+ // Matches zero characters (always succeeds without consuming input).
98
+ const char* epsilon(const char*);
99
+
100
+ // Matches the empty string.
101
+ const char* empty(const char*);
102
+
103
+ // Succeeds of the supplied matcher fails, and vice versa.
104
+ template <prelexer mx>
105
+ const char* negate(const char* src) {
106
+ return mx(src) ? 0 : src;
107
+ }
108
+
109
+ // Tries to match a certain number of times (between the supplied interval).
110
+ template<prelexer mx, size_t lo, size_t hi>
111
+ const char* between(const char* src) {
112
+ for (size_t i = 0; i < lo; ++i) {
113
+ src = mx(src);
114
+ if (!src) return 0;
115
+ }
116
+ for (size_t i = lo; i <= hi; ++i) {
117
+ const char* new_src = mx(src);
118
+ if (!new_src) return src;
119
+ src = new_src;
120
+ }
121
+ return src;
122
+ }
123
+
124
+ // Tries the matchers in sequence and returns the first match (or none)
125
+ template <prelexer mx1, prelexer mx2>
126
+ const char* alternatives(const char* src) {
127
+ const char* rslt;
128
+ (rslt = mx1(src)) || (rslt = mx2(src));
129
+ return rslt;
130
+ }
131
+
132
+ // Same as above, but with 3 arguments.
133
+ template <prelexer mx1, prelexer mx2, prelexer mx3>
134
+ const char* alternatives(const char* src) {
135
+ const char* rslt;
136
+ (rslt = mx1(src)) || (rslt = mx2(src)) || (rslt = mx3(src));
137
+ return rslt;
138
+ }
139
+
140
+ // Same as above, but with 4 arguments.
141
+ template <prelexer mx1, prelexer mx2, prelexer mx3, prelexer mx4>
142
+ const char* alternatives(const char* src) {
143
+ const char* rslt;
144
+ (rslt = mx1(src)) || (rslt = mx2(src)) ||
145
+ (rslt = mx3(src)) || (rslt = mx4(src));
146
+ return rslt;
147
+ }
148
+
149
+ // Same as above, but with 5 arguments.
150
+ template <prelexer mx1, prelexer mx2, prelexer mx3,
151
+ prelexer mx4, prelexer mx5>
152
+ const char* alternatives(const char* src) {
153
+ const char* rslt;
154
+ (rslt = mx1(src)) || (rslt = mx2(src)) || (rslt = mx3(src)) ||
155
+ (rslt = mx4(src)) || (rslt = mx5(src));
156
+ return rslt;
157
+ }
158
+
159
+ // Same as above, but with 6 arguments.
160
+ template <prelexer mx1, prelexer mx2, prelexer mx3,
161
+ prelexer mx4, prelexer mx5, prelexer mx6>
162
+ const char* alternatives(const char* src) {
163
+ const char* rslt;
164
+ (rslt = mx1(src)) || (rslt = mx2(src)) || (rslt = mx3(src)) ||
165
+ (rslt = mx4(src)) || (rslt = mx5(src)) || (rslt = mx6(src));
166
+ return rslt;
167
+ }
168
+
169
+ // Same as above, but with 7 arguments.
170
+ template <prelexer mx1, prelexer mx2,
171
+ prelexer mx3, prelexer mx4,
172
+ prelexer mx5, prelexer mx6,
173
+ prelexer mx7>
174
+ const char* alternatives(const char* src) {
175
+ const char* rslt;
176
+ (rslt = mx1(src)) || (rslt = mx2(src)) ||
177
+ (rslt = mx3(src)) || (rslt = mx4(src)) ||
178
+ (rslt = mx5(src)) || (rslt = mx6(src)) ||
179
+ (rslt = mx7(src));
180
+ return rslt;
181
+ }
182
+
183
+ // Same as above, but with 8 arguments.
184
+ template <prelexer mx1, prelexer mx2,
185
+ prelexer mx3, prelexer mx4,
186
+ prelexer mx5, prelexer mx6,
187
+ prelexer mx7, prelexer mx8>
188
+ const char* alternatives(const char* src) {
189
+ const char* rslt;
190
+ (rslt = mx1(src)) || (rslt = mx2(src)) ||
191
+ (rslt = mx3(src)) || (rslt = mx4(src)) ||
192
+ (rslt = mx5(src)) || (rslt = mx6(src)) ||
193
+ (rslt = mx7(src)) || (rslt = mx8(src));
194
+ return rslt;
195
+ }
196
+
197
+ // Tries the matchers in sequence and succeeds if they all succeed.
198
+ template <prelexer mx1, prelexer mx2>
199
+ const char* sequence(const char* src) {
200
+ const char* rslt = src;
201
+ (rslt = mx1(rslt)) && (rslt = mx2(rslt));
202
+ return rslt;
203
+ }
204
+
205
+ // Same as above, but with 3 arguments.
206
+ template <prelexer mx1, prelexer mx2, prelexer mx3>
207
+ const char* sequence(const char* src) {
208
+ const char* rslt = src;
209
+ (rslt = mx1(rslt)) && (rslt = mx2(rslt)) && (rslt = mx3(rslt));
210
+ return rslt;
211
+ }
212
+
213
+ // Same as above, but with 4 arguments.
214
+ template <prelexer mx1, prelexer mx2, prelexer mx3, prelexer mx4>
215
+ const char* sequence(const char* src) {
216
+ const char* rslt = src;
217
+ (rslt = mx1(rslt)) && (rslt = mx2(rslt)) &&
218
+ (rslt = mx3(rslt)) && (rslt = mx4(rslt));
219
+ return rslt;
220
+ }
221
+
222
+ // Same as above, but with 5 arguments.
223
+ template <prelexer mx1, prelexer mx2,
224
+ prelexer mx3, prelexer mx4,
225
+ prelexer mx5>
226
+ const char* sequence(const char* src) {
227
+ const char* rslt = src;
228
+ (rslt = mx1(rslt)) && (rslt = mx2(rslt)) &&
229
+ (rslt = mx3(rslt)) && (rslt = mx4(rslt)) &&
230
+ (rslt = mx5(rslt));
231
+ return rslt;
232
+ }
233
+
234
+ // Same as above, but with 6 arguments.
235
+ template <prelexer mx1, prelexer mx2,
236
+ prelexer mx3, prelexer mx4,
237
+ prelexer mx5, prelexer mx6>
238
+ const char* sequence(const char* src) {
239
+ const char* rslt = src;
240
+ (rslt = mx1(rslt)) && (rslt = mx2(rslt)) &&
241
+ (rslt = mx3(rslt)) && (rslt = mx4(rslt)) &&
242
+ (rslt = mx5(rslt)) && (rslt = mx6(rslt));
243
+ return rslt;
244
+ }
245
+
246
+ // Same as above, but with 7 arguments.
247
+ template <prelexer mx1, prelexer mx2,
248
+ prelexer mx3, prelexer mx4,
249
+ prelexer mx5, prelexer mx6,
250
+ prelexer mx7>
251
+ const char* sequence(const char* src) {
252
+ const char* rslt = src;
253
+ (rslt = mx1(rslt)) && (rslt = mx2(rslt)) &&
254
+ (rslt = mx3(rslt)) && (rslt = mx4(rslt)) &&
255
+ (rslt = mx5(rslt)) && (rslt = mx6(rslt)) &&
256
+ (rslt = mx7(rslt));
257
+ return rslt;
258
+ }
259
+
260
+ // Match a pattern or not. Always succeeds.
261
+ template <prelexer mx>
262
+ const char* optional(const char* src) {
263
+ const char* p = mx(src);
264
+ return p ? p : src;
265
+ }
266
+
267
+ // Match zero or more of the supplied pattern
268
+ template <prelexer mx>
269
+ const char* zero_plus(const char* src) {
270
+ const char* p = mx(src);
271
+ while (p) src = p, p = mx(src);
272
+ return src;
273
+ }
274
+
275
+ // Match one or more of the supplied pattern
276
+ template <prelexer mx>
277
+ const char* one_plus(const char* src) {
278
+ const char* p = mx(src);
279
+ if (!p) return 0;
280
+ while (p) src = p, p = mx(src);
281
+ return src;
282
+ }
283
+
284
+ // Match a single character satisfying the ctype predicates.
285
+ const char* space(const char* src);
286
+ const char* alpha(const char* src);
287
+ const char* digit(const char* src);
288
+ const char* xdigit(const char* src);
289
+ const char* alnum(const char* src);
290
+ const char* punct(const char* src);
291
+ // Match multiple ctype characters.
292
+ const char* spaces(const char* src);
293
+ const char* alphas(const char* src);
294
+ const char* digits(const char* src);
295
+ const char* xdigits(const char* src);
296
+ const char* alnums(const char* src);
297
+ const char* puncts(const char* src);
298
+
299
+ // Match a line comment.
300
+ const char* line_comment(const char* src);
301
+ const char* line_comment_prefix(const char* src);
302
+
303
+ // Match a block comment.
304
+ const char* block_comment(const char* src);
305
+ const char* block_comment_prefix(const char* src);
306
+ // Match either.
307
+ const char* comment(const char* src);
308
+ // Match double- and single-quoted strings.
309
+ const char* double_quoted_string(const char* src);
310
+ const char* single_quoted_string(const char* src);
311
+ const char* string_constant(const char* src);
312
+ // Match interpolants.
313
+ const char* interpolant(const char* src);
314
+
315
+ // Whitespace handling.
316
+ const char* optional_spaces(const char* src);
317
+ const char* optional_comment(const char* src);
318
+ const char* spaces_and_comments(const char* src);
319
+ const char* no_spaces(const char* src);
320
+
321
+ const char* backslash_something(const char* src);
322
+
323
+ // Match CSS css variables.
324
+ const char* custom_property_name(const char* src);
325
+ // Match a CSS identifier.
326
+ const char* identifier(const char* src);
327
+ const char* identifier_fragment(const char* src);
328
+ // Match selector names.
329
+ const char* sel_ident(const char* src);
330
+ // Match interpolant schemas
331
+ const char* identifier_schema(const char* src);
332
+ const char* value_schema(const char* src);
333
+ const char* filename(const char* src);
334
+ const char* filename_schema(const char* src);
335
+ const char* url_schema(const char* src);
336
+ const char* url_value(const char* src);
337
+ const char* vendor_prefix(const char* src);
338
+ // Match CSS '@' keywords.
339
+ const char* at_keyword(const char* src);
340
+ const char* import(const char* src);
341
+ const char* media(const char* src);
342
+ const char* supports(const char* src);
343
+ const char* keyframes(const char* src);
344
+ const char* keyf(const char* src);
345
+ const char* mixin(const char* src);
346
+ const char* function(const char* src);
347
+ const char* return_directive(const char* src);
348
+ const char* include(const char* src);
349
+ const char* content(const char* src);
350
+ const char* extend(const char* src);
351
+
352
+ const char* if_directive(const char* src);
353
+ const char* else_directive(const char* src);
354
+ const char* elseif_directive(const char* src);
355
+
356
+ const char* for_directive(const char* src);
357
+ const char* from(const char* src);
358
+ const char* to(const char* src);
359
+ const char* through(const char* src);
360
+
361
+ const char* each_directive(const char* src);
362
+ const char* in(const char* src);
363
+
364
+ const char* while_directive(const char* src);
365
+
366
+ const char* warn(const char* src);
367
+ const char* err(const char* src);
368
+ const char* dbg(const char* src);
369
+
370
+ const char* directive(const char* src);
371
+ const char* at_keyword(const char* src);
372
+
373
+ const char* null(const char* src);
374
+
375
+ // Match CSS type selectors
376
+ const char* namespace_prefix(const char* src);
377
+ const char* type_selector(const char* src);
378
+ const char* hyphens_and_identifier(const char* src);
379
+ const char* hyphens_and_name(const char* src);
380
+ const char* universal(const char* src);
381
+ // Match CSS id names.
382
+ const char* id_name(const char* src);
383
+ // Match CSS class names.
384
+ const char* class_name(const char* src);
385
+ // Attribute name in an attribute selector
386
+ const char* attribute_name(const char* src);
387
+ // Match placeholder selectors.
388
+ const char* placeholder(const char* src);
389
+ // Match CSS numeric constants.
390
+ const char* sign(const char* src);
391
+ const char* unsigned_number(const char* src);
392
+ const char* number(const char* src);
393
+ const char* coefficient(const char* src);
394
+ const char* binomial(const char* src);
395
+ const char* percentage(const char* src);
396
+ const char* dimension(const char* src);
397
+ const char* hex(const char* src);
398
+ const char* hexa(const char* src);
399
+ const char* rgb_prefix(const char* src);
400
+ // Match CSS uri specifiers.
401
+ const char* uri_prefix(const char* src);
402
+ const char* uri(const char* src);
403
+ const char* url(const char* src);
404
+ // Match CSS "!important" keyword.
405
+ const char* important(const char* src);
406
+ // Match CSS "!optional" keyword.
407
+ const char* optional(const char* src);
408
+ // Match Sass "!default" keyword.
409
+ const char* default_flag(const char* src);
410
+ const char* global_flag(const char* src);
411
+ // Match CSS pseudo-class/element prefixes
412
+ const char* pseudo_prefix(const char* src);
413
+ // Match CSS function call openers.
414
+ const char* functional(const char* src);
415
+ const char* functional_schema(const char* src);
416
+ const char* pseudo_not(const char* src);
417
+ // Match CSS 'odd' and 'even' keywords for functional pseudo-classes.
418
+ const char* even(const char* src);
419
+ const char* odd(const char* src);
420
+ // Match CSS attribute-matching operators.
421
+ const char* exact_match(const char* src);
422
+ const char* class_match(const char* src);
423
+ const char* dash_match(const char* src);
424
+ const char* prefix_match(const char* src);
425
+ const char* suffix_match(const char* src);
426
+ const char* substring_match(const char* src);
427
+ // Match CSS combinators.
428
+ const char* adjacent_to(const char* src);
429
+ const char* precedes(const char* src);
430
+ const char* parent_of(const char* src);
431
+ const char* ancestor_of(const char* src);
432
+
433
+ // Match SCSS variable names.
434
+ const char* variable(const char* src);
435
+
436
+ // Match Sass boolean keywords.
437
+ const char* true_val(const char* src);
438
+ const char* false_val(const char* src);
439
+ const char* and_op(const char* src);
440
+ const char* or_op(const char* src);
441
+ const char* not_op(const char* src);
442
+ const char* eq_op(const char* src);
443
+ const char* neq_op(const char* src);
444
+ const char* gt_op(const char* src);
445
+ const char* gte_op(const char* src);
446
+ const char* lt_op(const char* src);
447
+ const char* lte_op(const char* src);
448
+
449
+ // IE stuff
450
+ const char* ie_progid(const char* src);
451
+ const char* ie_expression(const char* src);
452
+ const char* ie_property(const char* src);
453
+ const char* ie_keyword_arg(const char* src);
454
+
455
+ // match urls
456
+ const char* url(const char* src);
457
+
458
+ // Path matching functions.
459
+ const char* folder(const char* src);
460
+ const char* folders(const char* src);
461
+
462
+
463
+ const char* static_string(const char* src);
464
+ const char* static_component(const char* src);
465
+ const char* static_value(const char* src);
466
+
467
+ // Utility functions for finding and counting characters in a string.
468
+ template<char c>
469
+ const char* find_first(const char* src) {
470
+ while (*src && *src != c) ++src;
471
+ return *src ? src : 0;
472
+ }
473
+ template<prelexer mx>
474
+ const char* find_first(const char* src) {
475
+ while (*src && !mx(src)) ++src;
476
+ return *src ? src : 0;
477
+ }
478
+ template<prelexer mx>
479
+ const char* find_first_in_interval(const char* beg, const char* end) {
480
+ while ((beg < end) && *beg) {
481
+ if (mx(beg)) return beg;
482
+ ++beg;
483
+ }
484
+ return 0;
485
+ }
486
+ template <char c>
487
+ unsigned int count_interval(const char* beg, const char* end) {
488
+ unsigned int counter = 0;
489
+ while (beg < end && *beg) {
490
+ if (*beg == c) ++counter;
491
+ ++beg;
492
+ }
493
+ return counter;
494
+ }
495
+ template <prelexer mx>
496
+ unsigned int count_interval(const char* beg, const char* end) {
497
+ unsigned int counter = 0;
498
+ while (beg < end && *beg) {
499
+ const char* p;
500
+ if ((p = mx(beg))) {
501
+ ++counter;
502
+ beg = p;
503
+ }
504
+ else {
505
+ ++beg;
506
+ }
507
+ }
508
+ return counter;
509
+ }
510
+
511
+ const char* chunk(const char* src);
512
+ }
513
+ }