(buf *bytes.Buffer, s []byte)
| 200 | } |
| 201 | |
| 202 | func ffjsonWriteJSONBytesAsString(buf *bytes.Buffer, s []byte) { |
| 203 | const hex = "0123456789abcdef" |
| 204 | |
| 205 | buf.WriteByte('"') |
| 206 | start := 0 |
| 207 | for i := 0; i < len(s); { |
| 208 | if b := s[i]; b < utf8.RuneSelf { |
| 209 | if 0x20 <= b && b != '\\' && b != '"' && b != '<' && b != '>' && b != '&' { |
| 210 | i++ |
| 211 | continue |
| 212 | } |
| 213 | if start < i { |
| 214 | buf.Write(s[start:i]) |
| 215 | } |
| 216 | switch b { |
| 217 | case '\\', '"': |
| 218 | buf.WriteByte('\\') |
| 219 | buf.WriteByte(b) |
| 220 | case '\n': |
| 221 | buf.WriteByte('\\') |
| 222 | buf.WriteByte('n') |
| 223 | case '\r': |
| 224 | buf.WriteByte('\\') |
| 225 | buf.WriteByte('r') |
| 226 | default: |
| 227 | buf.WriteString(`\u00`) |
| 228 | buf.WriteByte(hex[b>>4]) |
| 229 | buf.WriteByte(hex[b&0xF]) |
| 230 | } |
| 231 | i++ |
| 232 | start = i |
| 233 | continue |
| 234 | } |
| 235 | c, size := utf8.DecodeRune(s[i:]) |
| 236 | if c == utf8.RuneError && size == 1 { |
| 237 | if start < i { |
| 238 | buf.Write(s[start:i]) |
| 239 | } |
| 240 | buf.WriteString(`\ufffd`) |
| 241 | i += size |
| 242 | start = i |
| 243 | continue |
| 244 | } |
| 245 | |
| 246 | if c == '\u2028' || c == '\u2029' { |
| 247 | if start < i { |
| 248 | buf.Write(s[start:i]) |
| 249 | } |
| 250 | buf.WriteString(`\u202`) |
| 251 | buf.WriteByte(hex[c&0xF]) |
| 252 | i += size |
| 253 | start = i |
| 254 | continue |
| 255 | } |
| 256 | i += size |
| 257 | } |
| 258 | if start < len(s) { |
| 259 | buf.Write(s[start:]) |
no test coverage detected