@@ -23,24 +23,33 @@ 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;
4554}
4655
@@ -49,26 +58,6 @@ std::optional<size_t> compute_unencoded_normalized_len(JSContext *cx, JS::Handle
4958 if (!linear) {
5059 return std::nullopt ;
5160 }
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- };
7261 auto len = JS::GetDeflatedUTF8StringLength (linear);
7362 size_t chars_len = JS::GetLinearStringLength (linear);
7463 JS::AutoCheckCannotGC nogc;
@@ -77,13 +66,13 @@ std::optional<size_t> compute_unencoded_normalized_len(JSContext *cx, JS::Handle
7766 if (!chars) {
7867 return std::nullopt ;
7968 }
80- len += extra_bytes_needed (chars, chars_len);
69+ len += compute_extra_characters (chars, chars_len);
8170 } else {
8271 auto chars = JS::GetTwoByteLinearStringChars (nogc, linear);
8372 if (!chars) {
8473 return std::nullopt ;
8574 }
86- len += extra_bytes_needed (chars, chars_len);
75+ len += compute_extra_characters (chars, chars_len);
8776 }
8877 return len;
8978}
0 commit comments