sassc 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+ }