@@ -23,52 +23,76 @@ const char LF = '\n';
2323const char CR = ' \r ' ;
2424const char *CRLF = " \r\n " ;
2525
26- // Computes the length of a string after normalizing its newlines.
27- // Converts CR, LF, and CRLF into a CRLF sequence.
28- size_t compute_normalized_len (std::string_view src) {
29- size_t len = 0 ;
30-
31- for (size_t i = 0 ; i < src.size (); i++) {
32- if (src[i] == CR) {
33- if (i + 1 < src.size () && src[i + 1 ] == LF) {
34- i++;
26+ template <typename CH>
27+ size_t compute_extra_characters (CH *chars, size_t len) {
28+ size_t extra = 0 ;
29+ for (size_t i = 0 ; i < len; i++) {
30+ auto ch = chars[i];
31+ if (ch == CR) {
32+ if (i + 1 < len) {
33+ char16_t next = chars[i + 1 ];
34+ if (next == LF) {
35+ i += 1 ;
36+ // the character is already accounted for
37+ continue ;
38+ }
3539 }
36- len += 2 ; // CRLF
37- } else if (src[i] == LF) {
38- len += 2 ; // CRLF
39- } else {
40- len += 1 ;
40+ extra += 1 ;
41+ } else if (ch == LF) {
42+ extra += 1 ;
4143 }
4244 }
45+ return extra;
46+ }
4347
48+ // Computes the length of a string after normalizing its newlines.
49+ // Converts CR, LF, and CRLF into a CRLF sequence.
50+ size_t compute_normalized_len (std::string_view src) {
51+ size_t len = src.size ();
52+ len += compute_extra_characters (src.data (), len);
4453 return len;
54+
55+ // for (size_t i = 0; i < src.size(); i++) {
56+ // if (src[i] == CR) {
57+ // if (i + 1 < src.size() && src[i + 1] == LF) {
58+ // i++;
59+ // }
60+ // len += 2; // CRLF
61+ // } else if (src[i] == LF) {
62+ // len += 2; // CRLF
63+ // } else {
64+ // len += 1;
65+ // }
66+ // }
67+
68+ // return len;
4569}
4670
4771std::optional<size_t > compute_unencoded_normalized_len (JSContext *cx, JS::HandleString value) {
4872 auto linear = JS_EnsureLinearString (cx, value);
4973 if (!linear) {
5074 return std::nullopt ;
5175 }
52- auto extra_bytes_needed = [](const auto *chars, const auto len) {
53- size_t extra = 0 ;
54- for (size_t i = 0 ; i < len; i++) {
55- auto ch = chars[i];
56- if (ch == CR) {
57- if (i+1 < len) {
58- char16_t next = chars[i+1 ];
59- if (next == LF) {
60- i += 1 ;
61- // the character is already accounted for
62- continue ;
63- }
64- }
65- extra += 1 ;
66- } else if (ch == LF) {
67- extra += 1 ;
68- }
69- }
70- return extra;
71- };
76+ // auto extra_bytes_needed = [](const auto *chars, const auto len) {
77+ // size_t extra = 0;
78+ // for (size_t i = 0; i < len; i++) {
79+ // auto ch = chars[i];
80+ // if (ch == CR) {
81+ // if (i+1 < len) {
82+ // char16_t next = chars[i+1];
83+ // if (next == LF) {
84+ // i += 1;
85+ // // the character is already accounted for
86+ // continue;
87+ // }
88+ // }
89+ // extra += 1;
90+ // } else if (ch == LF) {
91+ // extra += 1;
92+ // }
93+ // }
94+ // return extra;
95+ // };
7296 auto len = JS::GetDeflatedUTF8StringLength (linear);
7397 size_t chars_len = JS::GetLinearStringLength (linear);
7498 JS::AutoCheckCannotGC nogc;
@@ -77,13 +101,15 @@ std::optional<size_t> compute_unencoded_normalized_len(JSContext *cx, JS::Handle
77101 if (!chars) {
78102 return std::nullopt ;
79103 }
80- len += extra_bytes_needed (chars, chars_len);
104+ // len += extra_bytes_needed(chars, chars_len);
105+ len += compute_extra_characters (chars, chars_len);
81106 } else {
82107 auto chars = JS::GetTwoByteLinearStringChars (nogc, linear);
83108 if (!chars) {
84109 return std::nullopt ;
85110 }
86- len += extra_bytes_needed (chars, chars_len);
111+ // len += extra_bytes_needed(chars, chars_len);
112+ len += compute_extra_characters (chars, chars_len);
87113 }
88114 return len;
89115}
0 commit comments