File tree Expand file tree Collapse file tree 4 files changed +84
-20
lines changed Expand file tree Collapse file tree 4 files changed +84
-20
lines changed Original file line number Diff line number Diff line change @@ -35,7 +35,8 @@ SOURCES = \
35
35
source_map.cpp \
36
36
to_c.cpp \
37
37
to_string.cpp \
38
- units.cpp
38
+ units.cpp \
39
+ utf8_string.cpp
39
40
40
41
OBJECTS = $(SOURCES:.cpp=.o )
41
42
Original file line number Diff line number Diff line change 7
7
#include " to_string.hpp"
8
8
#include " inspect.hpp"
9
9
#include " eval.hpp"
10
+ #include " utf8_string.hpp"
10
11
11
12
#include < cmath>
12
13
#include < cctype>
@@ -695,7 +696,6 @@ namespace Sass {
695
696
{
696
697
String_Constant* s = ARG (" $string" , String_Constant);
697
698
string str = s->value ();
698
- size_t len = 0 ;
699
699
size_t length_of_s = str.size ();
700
700
size_t i = 0 ;
701
701
@@ -704,24 +704,8 @@ namespace Sass {
704
704
--length_of_s;
705
705
}
706
706
707
- while (i < length_of_s) {
708
- unsigned char c = static_cast <unsigned char >(str[i]);
709
- if (c < 128 ) {
710
- // it's a single-byte character
711
- ++len;
712
- ++i;
713
- }
714
- // it's a multi bit sequence and presumably it's a leading bit
715
- else {
716
- ++i; // go to the next byte
717
- // see if it's still part of the sequence
718
- while ((i < length_of_s) && ((static_cast <unsigned char >(str[i]) & 0b11000000 ) == 0b10000000 )) {
719
- ++i;
720
- }
721
- // when it's not [aka a new leading bit], increment and move on
722
- ++len;
723
- }
724
- }
707
+ size_t len = UTF_8::code_point_count (str, i, length_of_s);
708
+
725
709
return new (ctx.mem ) Number (path, position, len);
726
710
}
727
711
Original file line number Diff line number Diff line change
1
+ #ifndef SASS_UTF8_STRING
2
+ #define SASS_UTF8_STRING
3
+
4
+ #include < string>
5
+
6
+ namespace Sass {
7
+ namespace UTF_8 {
8
+ using std::string;
9
+ // class utf8_string {
10
+ // string s_;
11
+ // public:
12
+ // utf8_string(const string &s): s_(s) {}
13
+ // utf8_string(const char* c): s_(string(c)) {}
14
+
15
+ // char operator[](size_t i);
16
+ // size_t length();
17
+ // size_t byte_to_char(size_t i);
18
+ // };
19
+
20
+ // function that will count the number of code points (utf-8 characters) from the given beginning to the given end
21
+ size_t code_point_count (const string& str, size_t start, size_t end) {
22
+ size_t len = 0 ;
23
+ size_t i = start;
24
+
25
+ while (i < end) {
26
+ unsigned char c = static_cast <unsigned char >(str[i]);
27
+ if (c < 128 ) {
28
+ // it's a single-byte character
29
+ ++len;
30
+ ++i;
31
+ }
32
+ // it's a multi bit sequence and presumably it's a leading bit
33
+ else {
34
+ ++i; // go to the next byte
35
+ // see if it's still part of the sequence
36
+ while ((i < end) && ((static_cast <unsigned char >(str[i]) & 0b11000000 ) == 0b10000000 )) {
37
+ ++i;
38
+ }
39
+ // when it's not [aka a new leading bit], increment and move on
40
+ ++len;
41
+ }
42
+ }
43
+ return len;
44
+ }
45
+
46
+ size_t code_point_count (const string& str) {
47
+ return code_point_count (str, 0 , str.length ());
48
+ }
49
+
50
+ }
51
+ }
52
+
53
+ #endif
Original file line number Diff line number Diff line change
1
+ #ifndef SASS_UTF8_STRING
2
+ #define SASS_UTF8_STRING
3
+
4
+ #include < string>
5
+
6
+ namespace Sass {
7
+ namespace UTF_8 {
8
+ // class utf8_string {
9
+ // string s_;
10
+ // public:
11
+ // utf8_string(const string &s): s_(s) {}
12
+ // utf8_string(const char* c): s_(string(c)) {}
13
+
14
+ // char operator[](size_t i);
15
+ // size_t length();
16
+ // size_t byte_to_char(size_t i);
17
+ // };
18
+
19
+ // function that will count the number of code points (utf-8 characters) from the beginning to the given end
20
+ size_t code_point_count (const string& str, size_t start, size_t end);
21
+ size_t code_point_count (const string& str);
22
+
23
+ }
24
+ }
25
+
26
+ #endif
You can’t perform that action at this time.
0 commit comments