6
6
#include < iomanip>
7
7
#include " lexer.hpp"
8
8
#include " constants.hpp"
9
+ #include " util_string.hpp"
9
10
10
11
11
12
namespace Sass {
@@ -27,77 +28,14 @@ namespace Sass {
27
28
const char * kwd_minus (const char * src) { return exactly<' -' >(src); };
28
29
const char * kwd_slash (const char * src) { return exactly<' /' >(src); };
29
30
30
- // ####################################
31
- // implement some function that do exist in the standard
32
- // but those are locale aware which brought some trouble
33
- // this even seems to improve performance by quite a bit
34
- // ####################################
35
-
36
- bool is_alpha (const char & chr)
37
- {
38
- return unsigned (chr - ' A' ) <= ' Z' - ' A' ||
39
- unsigned (chr - ' a' ) <= ' z' - ' a' ;
40
- }
41
-
42
- bool is_space (const char & chr)
43
- {
44
- // adapted the technique from is_alpha
45
- return chr == ' ' || unsigned (chr - ' \t ' ) <= ' \r ' - ' \t ' ;
46
- }
47
-
48
- bool is_digit (const char & chr)
49
- {
50
- // adapted the technique from is_alpha
51
- return unsigned (chr - ' 0' ) <= ' 9' - ' 0' ;
52
- }
53
-
54
- bool is_number (const char & chr)
55
- {
56
- // adapted the technique from is_alpha
57
- return is_digit (chr) || chr == ' -' || chr == ' +' ;
58
- }
59
-
60
- bool is_xdigit (const char & chr)
61
- {
62
- // adapted the technique from is_alpha
63
- return unsigned (chr - ' 0' ) <= ' 9' - ' 0' ||
64
- unsigned (chr - ' a' ) <= ' f' - ' a' ||
65
- unsigned (chr - ' A' ) <= ' F' - ' A' ;
66
- }
67
-
68
- bool is_punct (const char & chr)
69
- {
70
- // locale independent
71
- return chr == ' .' ;
72
- }
73
-
74
- bool is_alnum (const char & chr)
75
- {
76
- return is_alpha (chr) || is_digit (chr);
77
- }
78
-
79
- // check if char is outside ascii range
80
- bool is_unicode (const char & chr)
81
- {
82
- // check for unicode range
83
- return unsigned (chr) > 127 ;
84
- }
85
-
86
- // check if char is outside ascii range
87
- // but with specific ranges (copied from Ruby Sass)
88
- bool is_nonascii (const char & chr)
89
- {
90
- unsigned int cmp = unsigned (chr);
91
- return (
92
- (cmp >= 128 && cmp <= 15572911 ) ||
93
- (cmp >= 15630464 && cmp <= 15712189 ) ||
94
- (cmp >= 4036001920 )
95
- );
31
+ bool is_number (char chr) {
32
+ return Util::ascii_isdigit (static_cast <unsigned char >(chr)) ||
33
+ chr == ' -' || chr == ' +' ;
96
34
}
97
35
98
36
// check if char is within a reduced ascii range
99
37
// valid in a uri (copied from Ruby Sass)
100
- bool is_uri_character (const char & chr)
38
+ bool is_uri_character (char chr)
101
39
{
102
40
unsigned int cmp = unsigned (chr);
103
41
return (cmp > 41 && cmp < 127 ) ||
@@ -106,34 +44,33 @@ namespace Sass {
106
44
107
45
// check if char is within a reduced ascii range
108
46
// valid for escaping (copied from Ruby Sass)
109
- bool is_escapable_character (const char & chr)
47
+ bool is_escapable_character (char chr)
110
48
{
111
49
unsigned int cmp = unsigned (chr);
112
50
return cmp > 31 && cmp < 127 ;
113
51
}
114
52
115
53
// Match word character (look ahead)
116
- bool is_character (const char & chr)
54
+ bool is_character (char chr)
117
55
{
118
56
// valid alpha, numeric or unicode char (plus hyphen)
119
- return is_alnum (chr) || is_unicode (chr) || chr == ' -' ;
57
+ return Util::ascii_isalnum (static_cast <unsigned char >(chr)) ||
58
+ !Util::ascii_isascii (static_cast <unsigned char >(chr)) ||
59
+ chr == ' -' ;
120
60
}
121
61
122
62
// ####################################
123
63
// BASIC CLASS MATCHERS
124
64
// ####################################
125
65
126
66
// create matchers that advance the position
127
- const char * space (const char * src) { return is_space (*src) ? src + 1 : 0 ; }
128
- const char * alpha (const char * src) { return is_alpha (*src) ? src + 1 : 0 ; }
129
- const char * unicode (const char * src) { return is_unicode (*src) ? src + 1 : 0 ; }
130
- const char * nonascii (const char * src) { return is_nonascii (*src) ? src + 1 : 0 ; }
131
- const char * digit (const char * src) { return is_digit (*src) ? src + 1 : 0 ; }
132
- const char * xdigit (const char * src) { return is_xdigit (*src) ? src + 1 : 0 ; }
133
- const char * alnum (const char * src) { return is_alnum (*src) ? src + 1 : 0 ; }
134
- const char * punct (const char * src) { return is_punct (*src) ? src + 1 : 0 ; }
135
- const char * hyphen (const char * src) { return *src && *src == ' -' ? src + 1 : 0 ; }
136
- const char * character (const char * src) { return is_character (*src) ? src + 1 : 0 ; }
67
+ const char * space (const char * src) { return Util::ascii_isspace (static_cast <unsigned char >(*src)) ? src + 1 : nullptr ; }
68
+ const char * alpha (const char * src) { return Util::ascii_isalpha (static_cast <unsigned char >(*src)) ? src + 1 : nullptr ; }
69
+ const char * nonascii (const char * src) { return Util::ascii_isascii (static_cast <unsigned char >(*src)) ? nullptr : src + 1 ; }
70
+ const char * digit (const char * src) { return Util::ascii_isdigit (static_cast <unsigned char >(*src)) ? src + 1 : nullptr ; }
71
+ const char * xdigit (const char * src) { return Util::ascii_isxdigit (static_cast <unsigned char >(*src)) ? src + 1 : nullptr ; }
72
+ const char * alnum (const char * src) { return Util::ascii_isalnum (static_cast <unsigned char >(*src)) ? src + 1 : nullptr ; }
73
+ const char * hyphen (const char * src) { return *src == ' -' ? src + 1 : 0 ; }
137
74
const char * uri_character (const char * src) { return is_uri_character (*src) ? src + 1 : 0 ; }
138
75
const char * escapable_character (const char * src) { return is_escapable_character (*src) ? src + 1 : 0 ; }
139
76
0 commit comments